From 7074f35e4ba831e358117842b99ee35b87f85ae5 Mon Sep 17 00:00:00 2001 From: void_17 Date: Mon, 2 Mar 2026 15:58:20 +0700 Subject: shared_ptr -> std::shared_ptr This is one of the first commits in a plan to remove all `using namespace std;` lines in the entire codebase as it is considered anti-pattern today. --- Minecraft.World/Connection.cpp | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'Minecraft.World/Connection.cpp') diff --git a/Minecraft.World/Connection.cpp b/Minecraft.World/Connection.cpp index 4392fe54..17b59dd3 100644 --- a/Minecraft.World/Connection.cpp +++ b/Minecraft.World/Connection.cpp @@ -96,7 +96,7 @@ Connection::Connection(Socket *socket, const wstring& id, PacketListener *packet }*/ dis = new DataInputStream(socket->getInputStream(packetListener->isServerPacketListener())); - + sos = socket->getOutputStream(packetListener->isServerPacketListener()); bufferedDos = new DataOutputStream(new BufferedOutputStream(sos, SEND_BUFFER_SIZE)); baos = new ByteArrayOutputStream( SEND_BUFFER_SIZE ); @@ -124,7 +124,7 @@ Connection::Connection(Socket *socket, const wstring& id, PacketListener *packet writeThread->Run(); - /* 4J JEV, java: + /* 4J JEV, java: new Thread(wstring(id).append(L" read thread")) { }; @@ -145,7 +145,7 @@ void Connection::setListener(PacketListener *packetListener) this->packetListener = packetListener; } -void Connection::send(shared_ptr packet) +void Connection::send(std::shared_ptr packet) { if (quitting) return; @@ -154,7 +154,7 @@ void Connection::send(shared_ptr packet) EnterCriticalSection(&writeLock); estimatedRemaining += packet->getEstimatedSize() + 1; - if (packet->shouldDelay) + if (packet->shouldDelay) { // 4J We have delayed it enough by putting it in the slow queue, so don't delay when we actually send it packet->shouldDelay = false; @@ -171,7 +171,7 @@ void Connection::send(shared_ptr packet) } -void Connection::queueSend(shared_ptr packet) +void Connection::queueSend(std::shared_ptr packet) { if (quitting) return; estimatedRemaining += packet->getEstimatedSize() + 1; @@ -189,7 +189,7 @@ bool Connection::writeTick() // try { if (!outgoing.empty() && (fakeLag == 0 || System::currentTimeMillis() - outgoing.front()->createTime >= fakeLag)) { - shared_ptr packet; + std::shared_ptr packet; EnterCriticalSection(&writeLock); @@ -200,11 +200,11 @@ bool Connection::writeTick() LeaveCriticalSection(&writeLock); Packet::writePacket(packet, bufferedDos); - + #ifndef _CONTENT_PACKAGE // 4J Added for debugging - if( !socket->isLocal() ) + if( !socket->isLocal() ) Packet::recordOutgoingPacket(packet); #endif @@ -220,7 +220,7 @@ bool Connection::writeTick() if ((slowWriteDelay-- <= 0) && !outgoing_slow.empty() && (fakeLag == 0 || System::currentTimeMillis() - outgoing_slow.front()->createTime >= fakeLag)) { - shared_ptr packet; + std::shared_ptr packet; //synchronized (writeLock) { @@ -252,9 +252,9 @@ bool Connection::writeTick() #ifndef _CONTENT_PACKAGE // 4J Added for debugging - if( !socket->isLocal() ) + if( !socket->isLocal() ) Packet::recordOutgoingPacket(packet); -#endif +#endif writeSizes[packet->getId()] += packet->getEstimatedSize() + 1; slowWriteDelay = 0; @@ -290,7 +290,7 @@ bool Connection::readTick() //try { - shared_ptr packet = Packet::readPacket(dis, packetListener->isServerPacketListener()); + std::shared_ptr packet = Packet::readPacket(dis, packetListener->isServerPacketListener()); if (packet != NULL) { @@ -302,13 +302,13 @@ bool Connection::readTick() } LeaveCriticalSection(&incoming_cs); didSomething = true; - } + } else { // printf("Con:0x%x readTick close EOS\n",this); // 4J Stu - Remove this line - // Fix for #10410 - UI: If the player is removed from a splitscreened hosts game, the next game that player joins will produce a message stating that the host has left. + // Fix for #10410 - UI: If the player is removed from a splitscreened host�s game, the next game that player joins will produce a message stating that the host has left. //close(DisconnectPacket::eDisconnect_EndOfStream); } @@ -362,7 +362,7 @@ void Connection::close(DisconnectPacket::eDisconnectReason reason, ...) // int count = 0, sum = 0, i = first; // va_list marker; - // + // // va_start( marker, first ); // while( i != -1 ) // { @@ -440,7 +440,7 @@ void Connection::tick() tickCount++; if (tickCount % 20 == 0) { - send( shared_ptr( new KeepAlivePacket() ) ); + send( std::shared_ptr( new KeepAlivePacket() ) ); } // 4J Stu - 1.8.2 changed from 100 to 1000 @@ -455,10 +455,10 @@ void Connection::tick() EnterCriticalSection(&incoming_cs); // 4J Stu - If disconnected, then we shouldn't process incoming packets - std::vector< shared_ptr > packetsToHandle; + std::vector< std::shared_ptr > packetsToHandle; while (!disconnected && !g_NetworkManager.IsLeavingGame() && g_NetworkManager.IsInSession() && !incoming.empty() && max-- >= 0) { - shared_ptr packet = incoming.front(); + std::shared_ptr packet = incoming.front(); packetsToHandle.push_back(packet); incoming.pop(); } @@ -607,8 +607,8 @@ int Connection::runWrite(void* lpParam) while (con->writeTick()) ; - //Sleep(100L); - // TODO - 4J Stu - 1.8.2 changes these sleeps to 2L, but not sure whether we should do that as well + //Sleep(100L); + // TODO - 4J Stu - 1.8.2 changes these sleeps to 2L, but not sure whether we should do that as well waitResult = con->m_hWakeWriteThread->WaitForSignal(100L); if (con->bufferedDos != NULL) con->bufferedDos->flush(); -- cgit v1.2.3 From 119bff351450ea16ffda550b6e0f67379b29f708 Mon Sep 17 00:00:00 2001 From: void_17 Date: Mon, 2 Mar 2026 17:37:16 +0700 Subject: Revert "shared_ptr -> std::shared_ptr" This reverts commit 7074f35e4ba831e358117842b99ee35b87f85ae5. --- Minecraft.Client/AbstractContainerScreen.cpp | 8 +- Minecraft.Client/AbstractContainerScreen.h | 2 +- Minecraft.Client/ArrowRenderer.cpp | 6 +- Minecraft.Client/ArrowRenderer.h | 2 +- Minecraft.Client/BlazeModel.cpp | 18 +- Minecraft.Client/BlazeModel.h | 4 +- Minecraft.Client/BlazeRenderer.cpp | 6 +- Minecraft.Client/BlazeRenderer.h | 2 +- Minecraft.Client/BoatModel.cpp | 12 +- Minecraft.Client/BoatModel.h | 2 +- Minecraft.Client/BoatRenderer.cpp | 6 +- Minecraft.Client/BoatRenderer.h | 2 +- Minecraft.Client/BookModel.cpp | 4 +- Minecraft.Client/BookModel.h | 4 +- Minecraft.Client/Camera.cpp | 8 +- Minecraft.Client/Camera.h | 8 +- Minecraft.Client/ChestRenderer.cpp | 4 +- Minecraft.Client/ChestRenderer.h | 4 +- Minecraft.Client/ChickenModel.cpp | 14 +- Minecraft.Client/ChickenModel.h | 2 +- Minecraft.Client/ChickenRenderer.cpp | 8 +- Minecraft.Client/ChickenRenderer.h | 4 +- Minecraft.Client/Chunk.cpp | 72 +-- Minecraft.Client/Chunk.h | 12 +- Minecraft.Client/ClientConnection.cpp | 514 ++++++++-------- Minecraft.Client/ClientConnection.h | 138 ++--- .../Common/Audio/Consoles_SoundEngine.h | 2 +- Minecraft.Client/Common/Audio/SoundEngine.cpp | 98 +-- Minecraft.Client/Common/Audio/SoundEngine.h | 10 +- Minecraft.Client/Common/Consoles_App.cpp | 32 +- Minecraft.Client/Common/Consoles_App.h | 24 +- .../GameRules/AddEnchantmentRuleDefinition.cpp | 4 +- .../GameRules/AddEnchantmentRuleDefinition.h | 2 +- .../Common/GameRules/AddItemRuleDefinition.cpp | 4 +- .../Common/GameRules/AddItemRuleDefinition.h | 2 +- .../Common/GameRules/CollectItemRuleDefinition.cpp | 6 +- .../Common/GameRules/CollectItemRuleDefinition.h | 8 +- .../Common/GameRules/CompleteAllRuleDefinition.cpp | 8 +- .../Common/GameRules/CompleteAllRuleDefinition.h | 2 +- .../GameRules/CompoundGameRuleDefinition.cpp | 8 +- .../Common/GameRules/CompoundGameRuleDefinition.h | 4 +- .../Common/GameRules/ConsoleSchematicFile.cpp | 28 +- .../Common/GameRules/ConsoleSchematicFile.h | 4 +- Minecraft.Client/Common/GameRules/GameRule.cpp | 6 +- Minecraft.Client/Common/GameRules/GameRule.h | 2 +- .../Common/GameRules/GameRuleDefinition.h | 6 +- .../GameRules/UpdatePlayerRuleDefinition.cpp | 4 +- .../Common/GameRules/UpdatePlayerRuleDefinition.h | 6 +- .../XboxStructureActionPlaceContainer.cpp | 6 +- .../GameRules/XboxStructureActionPlaceSpawner.cpp | 2 +- .../Common/Network/GameNetworkManager.cpp | 12 +- .../Common/Tutorial/ChangeStateConstraint.cpp | 20 +- .../Common/Tutorial/CompleteUsingItemTask.cpp | 4 +- .../Common/Tutorial/CompleteUsingItemTask.h | 2 +- Minecraft.Client/Common/Tutorial/CraftTask.cpp | 2 +- Minecraft.Client/Common/Tutorial/CraftTask.h | 2 +- .../Common/Tutorial/DiggerItemHint.cpp | 4 +- Minecraft.Client/Common/Tutorial/DiggerItemHint.h | 4 +- Minecraft.Client/Common/Tutorial/PickupTask.cpp | 2 +- Minecraft.Client/Common/Tutorial/PickupTask.h | 2 +- .../Common/Tutorial/ProcedureCompoundTask.cpp | 8 +- .../Common/Tutorial/ProcedureCompoundTask.h | 8 +- Minecraft.Client/Common/Tutorial/TakeItemHint.cpp | 2 +- Minecraft.Client/Common/Tutorial/TakeItemHint.h | 2 +- Minecraft.Client/Common/Tutorial/Tutorial.cpp | 20 +- Minecraft.Client/Common/Tutorial/Tutorial.h | 22 +- Minecraft.Client/Common/Tutorial/TutorialHint.cpp | 14 +- Minecraft.Client/Common/Tutorial/TutorialHint.h | 12 +- Minecraft.Client/Common/Tutorial/TutorialMode.cpp | 10 +- Minecraft.Client/Common/Tutorial/TutorialMode.h | 4 +- Minecraft.Client/Common/Tutorial/TutorialTask.h | 14 +- Minecraft.Client/Common/Tutorial/UseItemTask.cpp | 2 +- Minecraft.Client/Common/Tutorial/UseItemTask.h | 2 +- Minecraft.Client/Common/Tutorial/UseTileTask.cpp | 2 +- Minecraft.Client/Common/Tutorial/UseTileTask.h | 2 +- .../Common/UI/IUIScene_AbstractContainerMenu.cpp | 82 +-- .../Common/UI/IUIScene_AbstractContainerMenu.h | 22 +- Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp | 6 +- Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h | 8 +- .../Common/UI/IUIScene_CraftingMenu.cpp | 112 ++-- Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h | 18 +- .../Common/UI/IUIScene_CreativeMenu.cpp | 70 +-- Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h | 16 +- .../Common/UI/IUIScene_TradingMenu.cpp | 44 +- Minecraft.Client/Common/UI/IUIScene_TradingMenu.h | 14 +- .../Common/UI/UIComponent_TutorialPopup.cpp | 44 +- .../Common/UI/UIComponent_TutorialPopup.h | 2 +- .../Common/UI/UIControl_EnchantmentBook.cpp | 4 +- .../Common/UI/UIControl_EnchantmentBook.h | 2 +- Minecraft.Client/Common/UI/UIScene.cpp | 8 +- Minecraft.Client/Common/UI/UIScene.h | 6 +- .../Common/UI/UIScene_AbstractContainerMenu.cpp | 24 +- .../Common/UI/UIScene_AbstractContainerMenu.h | 6 +- .../Common/UI/UIScene_BrewingStandMenu.h | 2 +- .../Common/UI/UIScene_CraftingMenu.cpp | 26 +- Minecraft.Client/Common/UI/UIScene_CraftingMenu.h | 14 +- .../Common/UI/UIScene_CreativeMenu.cpp | 8 +- .../Common/UI/UIScene_DebugOverlay.cpp | 4 +- Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h | 2 +- Minecraft.Client/Common/UI/UIScene_HUD.cpp | 26 +- .../Common/UI/UIScene_InGameHostOptionsMenu.cpp | 6 +- .../Common/UI/UIScene_InGameInfoMenu.cpp | 28 +- .../Common/UI/UIScene_InGamePlayerOptionsMenu.cpp | 18 +- .../Common/UI/UIScene_InventoryMenu.cpp | 6 +- .../Common/UI/UIScene_LeaderboardsMenu.cpp | 40 +- .../Common/UI/UIScene_SignEntryMenu.cpp | 6 +- Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h | 2 +- .../Common/UI/UIScene_TeleportMenu.cpp | 14 +- Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp | 10 +- Minecraft.Client/Common/UI/UIStructs.h | 46 +- .../Common/XUI/SlotProgressControl.cpp | 8 +- .../Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp | 12 +- .../Common/XUI/XUI_Ctrl_CraftIngredientSlot.h | 4 +- .../Common/XUI/XUI_Ctrl_EnchantmentBook.cpp | 8 +- .../Common/XUI/XUI_Ctrl_EnchantmentBook.h | 2 +- .../Common/XUI/XUI_Ctrl_MinecraftSlot.cpp | 20 +- .../Common/XUI/XUI_Ctrl_MinecraftSlot.h | 4 +- .../Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp | 34 +- .../Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h | 10 +- Minecraft.Client/Common/XUI/XUI_CustomMessages.h | 4 +- .../Common/XUI/XUI_DebugItemEditor.cpp | 12 +- Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h | 4 +- .../Common/XUI/XUI_InGameHostOptions.cpp | 8 +- Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp | 26 +- .../Common/XUI/XUI_InGamePlayerOptions.cpp | 24 +- .../Common/XUI/XUI_Scene_AbstractContainer.cpp | 24 +- .../Common/XUI/XUI_Scene_AbstractContainer.h | 6 +- Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp | 2 +- .../Common/XUI/XUI_Scene_Container.cpp | 10 +- .../Common/XUI/XUI_Scene_CraftingPanel.cpp | 38 +- .../Common/XUI/XUI_Scene_CraftingPanel.h | 16 +- .../Common/XUI/XUI_Scene_Inventory.cpp | 10 +- .../Common/XUI/XUI_Scene_Inventory_Creative.cpp | 18 +- Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp | 18 +- Minecraft.Client/Common/XUI/XUI_Scene_Trading.h | 10 +- Minecraft.Client/Common/XUI/XUI_SignEntry.cpp | 12 +- Minecraft.Client/Common/XUI/XUI_SignEntry.h | 2 +- Minecraft.Client/Common/XUI/XUI_Teleport.cpp | 12 +- Minecraft.Client/Common/XUI/XUI_TextEntry.cpp | 14 +- Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp | 18 +- Minecraft.Client/ConnectScreen.cpp | 2 +- Minecraft.Client/ContainerScreen.cpp | 2 +- Minecraft.Client/ContainerScreen.h | 6 +- Minecraft.Client/CowModel.h | 4 +- Minecraft.Client/CowRenderer.cpp | 2 +- Minecraft.Client/CowRenderer.h | 2 +- Minecraft.Client/CraftingScreen.cpp | 2 +- Minecraft.Client/CraftingScreen.h | 2 +- Minecraft.Client/CreativeMode.cpp | 10 +- Minecraft.Client/CreativeMode.h | 8 +- Minecraft.Client/CreeperModel.cpp | 2 +- Minecraft.Client/CreeperModel.h | 2 +- Minecraft.Client/CreeperRenderer.cpp | 14 +- Minecraft.Client/CreeperRenderer.h | 8 +- Minecraft.Client/CritParticle.cpp | 10 +- Minecraft.Client/CritParticle.h | 8 +- Minecraft.Client/DefaultRenderer.cpp | 2 +- Minecraft.Client/DefaultRenderer.h | 2 +- Minecraft.Client/DemoLevel.cpp | 2 +- Minecraft.Client/DemoLevel.h | 2 +- Minecraft.Client/DemoMode.cpp | 6 +- Minecraft.Client/DemoMode.h | 6 +- Minecraft.Client/DerivedServerLevel.cpp | 2 +- Minecraft.Client/DerivedServerLevel.h | 2 +- Minecraft.Client/DirtyChunkSorter.cpp | 2 +- Minecraft.Client/DirtyChunkSorter.h | 6 +- Minecraft.Client/DistanceChunkSorter.cpp | 4 +- Minecraft.Client/DistanceChunkSorter.h | 4 +- Minecraft.Client/DragonModel.cpp | 18 +- Minecraft.Client/DragonModel.h | 4 +- .../Durango/Network/ChatIntegrationLayer.cpp | 152 ++--- .../Durango/Network/ChatIntegrationLayer.h | 60 +- .../Durango/Sentient/DurangoTelemetry.cpp | 26 +- Minecraft.Client/EnchantTableRenderer.cpp | 4 +- Minecraft.Client/EnchantTableRenderer.h | 2 +- Minecraft.Client/EnderChestRenderer.cpp | 4 +- Minecraft.Client/EnderChestRenderer.h | 2 +- Minecraft.Client/EnderCrystalModel.cpp | 4 +- Minecraft.Client/EnderCrystalModel.h | 2 +- Minecraft.Client/EnderCrystalRenderer.cpp | 6 +- Minecraft.Client/EnderCrystalRenderer.h | 2 +- Minecraft.Client/EnderDragonRenderer.cpp | 28 +- Minecraft.Client/EnderDragonRenderer.h | 12 +- Minecraft.Client/EndermanRenderer.cpp | 18 +- Minecraft.Client/EndermanRenderer.h | 6 +- Minecraft.Client/EntityRenderDispatcher.cpp | 16 +- Minecraft.Client/EntityRenderDispatcher.h | 10 +- Minecraft.Client/EntityRenderer.cpp | 22 +- Minecraft.Client/EntityRenderer.h | 10 +- Minecraft.Client/EntityTileRenderer.cpp | 4 +- Minecraft.Client/EntityTileRenderer.h | 4 +- Minecraft.Client/EntityTracker.cpp | 48 +- Minecraft.Client/EntityTracker.h | 22 +- Minecraft.Client/ExperienceOrbRenderer.cpp | 4 +- Minecraft.Client/ExperienceOrbRenderer.h | 2 +- Minecraft.Client/FallingTileRenderer.cpp | 4 +- Minecraft.Client/FallingTileRenderer.h | 2 +- Minecraft.Client/FireballRenderer.cpp | 8 +- Minecraft.Client/FireballRenderer.h | 4 +- Minecraft.Client/FishingHookRenderer.cpp | 4 +- Minecraft.Client/FishingHookRenderer.h | 4 +- Minecraft.Client/FurnaceScreen.cpp | 2 +- Minecraft.Client/FurnaceScreen.h | 4 +- Minecraft.Client/GameMode.cpp | 38 +- Minecraft.Client/GameMode.h | 30 +- Minecraft.Client/GameRenderer.cpp | 46 +- Minecraft.Client/GameRenderer.h | 4 +- Minecraft.Client/GhastModel.cpp | 2 +- Minecraft.Client/GhastModel.h | 2 +- Minecraft.Client/GhastRenderer.cpp | 6 +- Minecraft.Client/GhastRenderer.h | 2 +- Minecraft.Client/GiantMobRenderer.cpp | 4 +- Minecraft.Client/GiantMobRenderer.h | 2 +- Minecraft.Client/Gui.cpp | 8 +- Minecraft.Client/HumanoidMobRenderer.cpp | 12 +- Minecraft.Client/HumanoidMobRenderer.h | 6 +- Minecraft.Client/HumanoidModel.cpp | 32 +- Minecraft.Client/HumanoidModel.h | 6 +- Minecraft.Client/InventoryScreen.cpp | 2 +- Minecraft.Client/InventoryScreen.h | 2 +- Minecraft.Client/ItemFrameRenderer.cpp | 28 +- Minecraft.Client/ItemFrameRenderer.h | 6 +- Minecraft.Client/ItemInHandRenderer.cpp | 24 +- Minecraft.Client/ItemInHandRenderer.h | 4 +- Minecraft.Client/ItemRenderer.cpp | 52 +- Minecraft.Client/ItemRenderer.h | 20 +- Minecraft.Client/ItemSpriteRenderer.cpp | 2 +- Minecraft.Client/ItemSpriteRenderer.h | 2 +- Minecraft.Client/LavaSlimeModel.cpp | 24 +- Minecraft.Client/LavaSlimeModel.h | 6 +- Minecraft.Client/LavaSlimeRenderer.cpp | 14 +- Minecraft.Client/LavaSlimeRenderer.h | 4 +- Minecraft.Client/LevelRenderer.cpp | 150 ++--- Minecraft.Client/LevelRenderer.h | 24 +- Minecraft.Client/LightningBoltRenderer.cpp | 4 +- Minecraft.Client/LightningBoltRenderer.h | 2 +- Minecraft.Client/LocalPlayer.cpp | 82 +-- Minecraft.Client/LocalPlayer.h | 22 +- Minecraft.Client/MinecartModel.cpp | 14 +- Minecraft.Client/MinecartModel.h | 2 +- Minecraft.Client/MinecartRenderer.cpp | 4 +- Minecraft.Client/MinecartRenderer.h | 2 +- Minecraft.Client/Minecraft.cpp | 98 +-- Minecraft.Client/Minecraft.h | 10 +- Minecraft.Client/MinecraftServer.cpp | 38 +- Minecraft.Client/Minimap.cpp | 8 +- Minecraft.Client/Minimap.h | 2 +- Minecraft.Client/MobRenderer.cpp | 58 +- Minecraft.Client/MobRenderer.h | 30 +- Minecraft.Client/MobSpawnerRenderer.cpp | 6 +- Minecraft.Client/MobSpawnerRenderer.h | 4 +- Minecraft.Client/Model.h | 4 +- Minecraft.Client/MultiPlayerGameMode.cpp | 88 +-- Minecraft.Client/MultiPlayerGameMode.h | 28 +- Minecraft.Client/MultiPlayerLevel.cpp | 50 +- Minecraft.Client/MultiPlayerLevel.h | 26 +- Minecraft.Client/MultiPlayerLocalPlayer.cpp | 56 +- Minecraft.Client/MultiPlayerLocalPlayer.h | 6 +- Minecraft.Client/MushroomCowRenderer.cpp | 12 +- Minecraft.Client/MushroomCowRenderer.h | 4 +- Minecraft.Client/OzelotModel.cpp | 6 +- Minecraft.Client/OzelotModel.h | 4 +- Minecraft.Client/OzelotRenderer.cpp | 8 +- Minecraft.Client/OzelotRenderer.h | 4 +- Minecraft.Client/PS3/PS3Extras/Ps3Types.h | 4 +- .../boost_1_53_0/boost/archive/binary_iarchive.hpp | 22 +- .../boost/archive/binary_wiarchive.hpp | 26 +- .../boost/archive/polymorphic_iarchive.hpp | 6 +- .../boost/archive/polymorphic_oarchive.hpp | 2 +- .../boost/archive/shared_ptr_helper.hpp | 46 +- .../boost_1_53_0/boost/archive/text_iarchive.hpp | 28 +- .../boost_1_53_0/boost/archive/text_wiarchive.hpp | 18 +- .../boost_1_53_0/boost/archive/xml_iarchive.hpp | 22 +- .../boost_1_53_0/boost/archive/xml_wiarchive.hpp | 30 +- .../boost_1_53_0/boost/asio/detail/config.hpp | 2 +- .../boost_1_53_0/boost/asio/detail/shared_ptr.hpp | 6 +- .../boost_1_53_0/boost/asio/detail/socket_ops.hpp | 4 +- .../boost_1_53_0/boost/asio/io_service.hpp | 8 +- .../boost/asio/ip/basic_resolver_iterator.hpp | 4 +- .../boost/asio/ssl/detail/impl/openssl_init.ipp | 10 +- .../boost/asio/ssl/detail/openssl_init.hpp | 6 +- .../boost_1_53_0/boost/config/compiler/gcc.hpp | 28 +- .../boost/config/compiler/sunpro_cc.hpp | 22 +- .../boost_1_53_0/boost/config/platform/win32.hpp | 14 +- .../boost/date_time/gregorian/greg_month.hpp | 12 +- .../date_time/local_time/custom_time_zone.hpp | 10 +- .../boost/date_time/local_time/local_date_time.hpp | 40 +- .../date_time/local_time/local_time_types.hpp | 14 +- .../boost/date_time/local_time/posix_time_zone.hpp | 10 +- .../boost/date_time/local_time/tz_database.hpp | 10 +- .../boost/date_time/microsec_time_clock.hpp | 4 +- .../boost_1_53_0/boost/date_time/time_clock.hpp | 4 +- .../boost_1_53_0/boost/date_time/tz_db_base.hpp | 170 +++--- .../boost/exception/detail/exception_ptr.hpp | 10 +- .../boost_1_53_0/boost/exception/exception.hpp | 6 +- .../boost/exception/get_error_info.hpp | 4 +- .../boost_1_53_0/boost/exception/info.hpp | 14 +- .../boost_1_53_0/boost/filesystem/operations.hpp | 98 +-- .../boost_1_53_0/boost/filesystem/path.hpp | 70 +-- .../boost_1_53_0/boost/format/alt_sstream.hpp | 74 +-- .../boost/functional/hash/extensions.hpp | 6 +- .../PS3Extras/boost_1_53_0/boost/get_pointer.hpp | 6 +- .../boost/gil/extension/io/io_error.hpp | 8 +- .../boost/gil/extension/io/jpeg_dynamic_io.hpp | 10 +- .../boost/gil/extension/io/jpeg_io.hpp | 8 +- .../boost/gil/extension/io/png_dynamic_io.hpp | 10 +- .../boost/graph/detail/self_avoiding_walk.hpp | 108 ++-- .../graph/distributed/detail/mpi_process_group.ipp | 130 ++-- .../boost/graph/distributed/mpi_process_group.hpp | 140 ++--- .../boost_1_53_0/boost/graph/distributed/queue.hpp | 12 +- .../graph/distributed/rmat_graph_generator.hpp | 16 +- .../graph/distributed/vertex_list_adaptor.hpp | 62 +- .../boost/graph/erdos_renyi_generator.hpp | 8 +- .../boost/graph/gursoy_atun_layout.hpp | 92 +-- .../boost/graph/incremental_components.hpp | 28 +- .../boost/graph/mcgregor_common_subgraphs.hpp | 128 ++-- .../boost_1_53_0/boost/graph/metric_tsp_approx.hpp | 2 +- .../boost/graph/parallel/distribution.hpp | 92 +-- .../graph/planar_detail/boyer_myrvold_impl.hpp | 658 ++++++++++----------- .../boost/graph/planar_detail/face_handles.hpp | 94 +-- .../boost_1_53_0/boost/graph/plod_generator.hpp | 46 +- .../boost/graph/rmat_graph_generator.hpp | 14 +- .../boost_1_53_0/boost/graph/topology.hpp | 88 +-- .../boost/interprocess/interprocess_fwd.hpp | 2 +- .../smart_ptr/enable_shared_from_this.hpp | 14 +- .../boost/interprocess/smart_ptr/shared_ptr.hpp | 116 ++-- .../boost/interprocess/smart_ptr/weak_ptr.hpp | 38 +- .../boost_1_53_0/boost/iostreams/chain.hpp | 24 +- .../boost/iostreams/code_converter.hpp | 74 +-- .../boost_1_53_0/boost/iostreams/device/file.hpp | 30 +- .../boost/iostreams/device/file_descriptor.hpp | 18 +- .../boost/iostreams/device/mapped_file.hpp | 80 +-- .../boost/iostreams/filter/symmetric.hpp | 14 +- .../boost_1_53_0/boost/iostreams/invert.hpp | 42 +- .../boost/iterator/indirect_iterator.hpp | 12 +- .../boost_1_53_0/boost/locale/boundary/index.hpp | 118 ++-- .../boost_1_53_0/boost/locale/generator.hpp | 34 +- .../boost_1_53_0/boost/mpi/communicator.hpp | 146 ++--- .../boost/mpi/detail/communicator_sc.hpp | 12 +- .../boost_1_53_0/boost/mpi/graph_communicator.hpp | 64 +- .../PS3/PS3Extras/boost_1_53_0/boost/mpi/group.hpp | 24 +- .../boost_1_53_0/boost/mpi/intercommunicator.hpp | 10 +- .../PS3Extras/boost_1_53_0/boost/mpi/request.hpp | 12 +- .../boost/mpi/skeleton_and_content.hpp | 4 +- .../PS3/PS3Extras/boost_1_53_0/boost/pointee.hpp | 18 +- .../boost/program_options/detail/config_file.hpp | 36 +- .../boost/program_options/options_description.hpp | 60 +- .../boost/program_options/variables_map.hpp | 38 +- .../boost/property_map/dynamic_property_map.hpp | 18 +- .../parallel/distributed_property_map.hpp | 60 +- .../property_map/parallel/global_index_map.hpp | 10 +- .../parallel/impl/distributed_property_map.ipp | 42 +- .../boost/property_map/vector_property_map.hpp | 50 +- .../boost/ptr_container/clone_allocator.hpp | 16 +- .../boost/python/converter/registered.hpp | 24 +- .../boost/python/converter/registrations.hpp | 12 +- .../boost/python/converter/registry.hpp | 6 +- .../python/converter/shared_ptr_from_python.hpp | 20 +- .../python/converter/shared_ptr_to_python.hpp | 8 +- .../boost/python/detail/is_shared_ptr.hpp | 8 +- .../boost/python/detail/value_is_shared_ptr.hpp | 8 +- .../boost_1_53_0/boost/python/instance_holder.hpp | 8 +- .../boost/python/object/find_instance.hpp | 6 +- .../boost/python/object/inheritance.hpp | 4 +- .../boost/python/to_python_indirect.hpp | 14 +- .../boost_1_53_0/boost/python/to_python_value.hpp | 28 +- .../PS3/PS3Extras/boost_1_53_0/boost/regex/icu.hpp | 286 ++++----- .../boost/regex/pending/object_cache.hpp | 26 +- .../boost_1_53_0/boost/regex/v4/basic_regex.hpp | 156 ++--- .../boost/regex/v4/cpp_regex_traits.hpp | 88 +-- .../boost_1_53_0/boost/regex/v4/match_results.hpp | 16 +- .../boost_1_53_0/boost/regex/v4/regex_iterator.hpp | 34 +- .../boost/regex/v4/regex_token_iterator.hpp | 44 +- .../boost/regex/v4/regex_workaround.hpp | 42 +- .../boost/regex/v4/u32regex_iterator.hpp | 28 +- .../boost/regex/v4/u32regex_token_iterator.hpp | 40 +- .../boost/regex/v4/w32_regex_traits.hpp | 46 +- .../boost/serialization/detail/shared_ptr_132.hpp | 110 ++-- .../serialization/detail/shared_ptr_nmt_132.hpp | 44 +- .../boost/serialization/shared_ptr.hpp | 34 +- .../boost/serialization/shared_ptr_132.hpp | 44 +- .../boost_1_53_0/boost/serialization/weak_ptr.hpp | 8 +- .../boost/shared_container_iterator.hpp | 8 +- .../PS3Extras/boost_1_53_0/boost/shared_ptr.hpp | 6 +- .../boost_1_53_0/boost/signals/connection.hpp | 4 +- .../boost/signals/detail/named_slot_map.hpp | 16 +- .../boost/signals/detail/signal_base.hpp | 10 +- .../PS3Extras/boost_1_53_0/boost/signals/slot.hpp | 12 +- .../boost_1_53_0/boost/signals2/connection.hpp | 22 +- .../boost_1_53_0/boost/signals2/deconstruct.hpp | 78 +-- .../boost/signals2/deconstruct_ptr.hpp | 16 +- .../boost/signals2/detail/foreign_ptr.hpp | 8 +- .../boost/signals2/detail/signal_template.hpp | 34 +- .../boost/signals2/postconstructible.hpp | 6 +- .../boost/signals2/predestructible.hpp | 4 +- .../boost/signals2/shared_connection_block.hpp | 8 +- .../boost_1_53_0/boost/signals2/signal.hpp | 2 +- .../boost_1_53_0/boost/signals2/signal_base.hpp | 4 +- .../boost_1_53_0/boost/signals2/slot_base.hpp | 4 +- .../boost_1_53_0/boost/signals2/trackable.hpp | 6 +- .../PS3/PS3Extras/boost_1_53_0/boost/smart_ptr.hpp | 2 +- .../boost/smart_ptr/allocate_shared_array.hpp | 46 +- .../boost/smart_ptr/detail/shared_ptr_nmt.hpp | 44 +- .../boost/smart_ptr/detail/sp_if_array.hpp | 14 +- .../boost/smart_ptr/detail/spinlock_pool.hpp | 26 +- .../boost/smart_ptr/enable_shared_from_raw.hpp | 34 +- .../boost/smart_ptr/enable_shared_from_this.hpp | 16 +- .../boost/smart_ptr/make_shared_array.hpp | 46 +- .../boost/smart_ptr/make_shared_object.hpp | 334 +++++------ .../boost_1_53_0/boost/smart_ptr/owner_less.hpp | 8 +- .../boost_1_53_0/boost/smart_ptr/scoped_ptr.hpp | 2 +- .../boost_1_53_0/boost/smart_ptr/shared_array.hpp | 6 +- .../boost_1_53_0/boost/smart_ptr/shared_ptr.hpp | 202 +++---- .../boost_1_53_0/boost/smart_ptr/weak_ptr.hpp | 16 +- .../classic/core/non_terminal/impl/grammar.ipp | 2 +- .../core/non_terminal/impl/object_with_id.ipp | 8 +- .../spirit/home/classic/dynamic/stored_rule.hpp | 8 +- .../spirit/home/classic/iterator/file_iterator.hpp | 2 +- .../home/classic/iterator/impl/file_iterator.ipp | 18 +- .../boost/spirit/home/classic/utility/chset.hpp | 6 +- .../spirit/home/classic/utility/impl/chset.ipp | 18 +- .../boost/spirit/home/karma/string/symbols.hpp | 6 +- .../boost/spirit/home/phoenix/operator/member.hpp | 16 +- .../boost/spirit/home/qi/string/symbols.hpp | 4 +- .../home/qi/operator/detail/keywords.hpp | 46 +- .../boost/statechart/processor_container.hpp | 8 +- .../boost_1_53_0/boost/test/parameterized_test.hpp | 18 +- .../boost_1_53_0/boost/test/predicate_result.hpp | 8 +- .../boost/test/unit_test_suite_impl.hpp | 44 +- .../boost_1_53_0/boost/test/utils/callback.hpp | 18 +- .../test/utils/runtime/cla/basic_parameter.hpp | 14 +- .../test/utils/runtime/cla/char_parameter.hpp | 12 +- .../boost/test/utils/runtime/cla/fwd.hpp | 10 +- .../boost/test/utils/runtime/cla/parameter.hpp | 12 +- .../boost/test/utils/runtime/cla/parser.hpp | 8 +- .../utils/runtime/file/config_file_iterator.hpp | 10 +- .../boost_1_53_0/boost/test/utils/runtime/fwd.hpp | 8 +- .../boost/test/utils/runtime/validation.hpp | 10 +- .../PS3Extras/boost_1_53_0/boost/thread/future.hpp | 36 +- .../boost/thread/pthread/thread_data.hpp | 12 +- .../PS3Extras/boost_1_53_0/boost/thread/tss.hpp | 24 +- .../PS3Extras/boost_1_53_0/boost/tr1/memory.hpp | 20 +- .../boost_1_53_0/boost/uuid/random_generator.hpp | 14 +- .../boost_1_53_0/boost/wave/cpp_context.hpp | 198 +++---- .../boost_1_53_0/boost/wave/util/cpp_iterator.hpp | 6 +- .../boost_1_53_0/boost/wave/util/cpp_macromap.hpp | 4 +- .../boost_1_53_0/boost/wave/util/symbol_table.hpp | 28 +- .../boost/xpressive/detail/core/access.hpp | 4 +- .../boost/xpressive/detail/core/linker.hpp | 2 +- .../detail/core/matcher/regex_byref_matcher.hpp | 4 +- .../detail/core/matcher/regex_matcher.hpp | 2 +- .../boost/xpressive/detail/detail_fwd.hpp | 4 +- .../boost/xpressive/detail/static/compile.hpp | 8 +- .../boost/xpressive/detail/static/placeholders.hpp | 2 +- .../boost/xpressive/detail/static/visitor.hpp | 10 +- .../boost/xpressive/detail/utility/symbols.hpp | 14 +- .../xpressive/detail/utility/tracking_ptr.hpp | 26 +- .../boost/xpressive/regex_compiler.hpp | 4 +- .../PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp | 158 ++--- .../PS3/SPU_Tasks/ChunkUpdate/LeverTile_SPU.h | 2 +- .../PS3/SPU_Tasks/ChunkUpdate/PistonBaseTile_SPU.h | 2 +- .../ChunkUpdate/PistonExtensionTile_SPU.h | 2 +- .../PS3/SPU_Tasks/ChunkUpdate/TheEndPortal_SPU.h | 2 +- .../PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp | 228 +++---- .../LevelRenderer_FindNearestChunk.cpp | 22 +- .../LevelRenderer_FindNearestChunk.h | 6 +- Minecraft.Client/PaintingRenderer.cpp | 10 +- Minecraft.Client/PaintingRenderer.h | 6 +- Minecraft.Client/Particle.cpp | 10 +- Minecraft.Client/Particle.h | 4 +- Minecraft.Client/ParticleEngine.cpp | 18 +- Minecraft.Client/ParticleEngine.h | 8 +- Minecraft.Client/PendingConnection.cpp | 32 +- Minecraft.Client/PendingConnection.h | 16 +- Minecraft.Client/PigRenderer.cpp | 8 +- Minecraft.Client/PigRenderer.h | 4 +- Minecraft.Client/PistonPieceRenderer.cpp | 6 +- Minecraft.Client/PistonPieceRenderer.h | 4 +- Minecraft.Client/PlayerChunkMap.cpp | 56 +- Minecraft.Client/PlayerChunkMap.h | 32 +- Minecraft.Client/PlayerCloudParticle.cpp | 2 +- Minecraft.Client/PlayerConnection.cpp | 244 ++++---- Minecraft.Client/PlayerConnection.h | 80 +-- Minecraft.Client/PlayerList.cpp | 232 ++++---- Minecraft.Client/PlayerList.h | 56 +- Minecraft.Client/PlayerRenderer.cpp | 52 +- Minecraft.Client/PlayerRenderer.h | 20 +- Minecraft.Client/QuadrupedModel.cpp | 14 +- Minecraft.Client/QuadrupedModel.h | 2 +- Minecraft.Client/ReceivingLevelScreen.cpp | 2 +- Minecraft.Client/RemotePlayer.cpp | 4 +- Minecraft.Client/RemotePlayer.h | 2 +- Minecraft.Client/ServerCommandDispatcher.cpp | 4 +- Minecraft.Client/ServerCommandDispatcher.h | 2 +- Minecraft.Client/ServerConnection.cpp | 34 +- Minecraft.Client/ServerConnection.h | 10 +- Minecraft.Client/ServerLevel.cpp | 66 +-- Minecraft.Client/ServerLevel.h | 40 +- Minecraft.Client/ServerLevelListener.cpp | 30 +- Minecraft.Client/ServerLevelListener.h | 10 +- Minecraft.Client/ServerPlayer.cpp | 228 +++---- Minecraft.Client/ServerPlayer.h | 38 +- Minecraft.Client/ServerPlayerGameMode.cpp | 20 +- Minecraft.Client/ServerPlayerGameMode.h | 6 +- Minecraft.Client/SheepFurModel.cpp | 4 +- Minecraft.Client/SheepFurModel.h | 2 +- Minecraft.Client/SheepModel.cpp | 6 +- Minecraft.Client/SheepModel.h | 2 +- Minecraft.Client/SheepRenderer.cpp | 8 +- Minecraft.Client/SheepRenderer.h | 4 +- Minecraft.Client/SignRenderer.cpp | 14 +- Minecraft.Client/SignRenderer.h | 2 +- Minecraft.Client/SilverfishModel.cpp | 2 +- Minecraft.Client/SilverfishModel.h | 2 +- Minecraft.Client/SilverfishRenderer.cpp | 6 +- Minecraft.Client/SilverfishRenderer.h | 6 +- Minecraft.Client/SkeletonHeadModel.cpp | 2 +- Minecraft.Client/SkeletonHeadModel.h | 2 +- Minecraft.Client/SkullTileRenderer.cpp | 4 +- Minecraft.Client/SkullTileRenderer.h | 2 +- Minecraft.Client/SlimeModel.cpp | 2 +- Minecraft.Client/SlimeModel.h | 2 +- Minecraft.Client/SlimeRenderer.cpp | 10 +- Minecraft.Client/SlimeRenderer.h | 4 +- Minecraft.Client/SnowManModel.cpp | 6 +- Minecraft.Client/SnowManModel.h | 4 +- Minecraft.Client/SnowManRenderer.cpp | 8 +- Minecraft.Client/SnowManRenderer.h | 2 +- Minecraft.Client/SpiderModel.cpp | 10 +- Minecraft.Client/SpiderModel.h | 2 +- Minecraft.Client/SpiderRenderer.cpp | 12 +- Minecraft.Client/SpiderRenderer.h | 6 +- Minecraft.Client/SquidModel.cpp | 2 +- Minecraft.Client/SquidModel.h | 2 +- Minecraft.Client/SquidRenderer.cpp | 10 +- Minecraft.Client/SquidRenderer.h | 6 +- Minecraft.Client/SurvivalMode.cpp | 12 +- Minecraft.Client/SurvivalMode.h | 6 +- Minecraft.Client/TakeAnimationParticle.cpp | 10 +- Minecraft.Client/TakeAnimationParticle.h | 6 +- Minecraft.Client/TeleportCommand.cpp | 12 +- Minecraft.Client/TeleportCommand.h | 4 +- Minecraft.Client/TerrainParticle.cpp | 6 +- Minecraft.Client/TerrainParticle.h | 4 +- Minecraft.Client/TextEditScreen.cpp | 6 +- Minecraft.Client/TextEditScreen.h | 4 +- Minecraft.Client/TheEndPortalRenderer.cpp | 4 +- Minecraft.Client/TheEndPortalRenderer.h | 2 +- Minecraft.Client/TileEntityRenderDispatcher.cpp | 10 +- Minecraft.Client/TileEntityRenderDispatcher.h | 12 +- Minecraft.Client/TileEntityRenderer.h | 2 +- Minecraft.Client/TileRenderer.cpp | 4 +- Minecraft.Client/TileRenderer.h | 6 +- Minecraft.Client/TntRenderer.cpp | 4 +- Minecraft.Client/TntRenderer.h | 2 +- Minecraft.Client/TrackedEntity.cpp | 288 ++++----- Minecraft.Client/TrackedEntity.h | 32 +- Minecraft.Client/TrapScreen.cpp | 2 +- Minecraft.Client/TrapScreen.h | 2 +- Minecraft.Client/ViewportCuller.cpp | 34 +- Minecraft.Client/ViewportCuller.h | 6 +- Minecraft.Client/VillagerGolemModel.cpp | 6 +- Minecraft.Client/VillagerGolemModel.h | 4 +- Minecraft.Client/VillagerGolemRenderer.cpp | 14 +- Minecraft.Client/VillagerGolemRenderer.h | 6 +- Minecraft.Client/VillagerModel.cpp | 6 +- Minecraft.Client/VillagerModel.h | 4 +- Minecraft.Client/VillagerRenderer.cpp | 14 +- Minecraft.Client/VillagerRenderer.h | 10 +- Minecraft.Client/WolfModel.cpp | 12 +- Minecraft.Client/WolfModel.h | 4 +- Minecraft.Client/WolfRenderer.cpp | 8 +- Minecraft.Client/WolfRenderer.h | 4 +- Minecraft.Client/Xbox/Audio/SoundEngine.cpp | 8 +- Minecraft.Client/Xbox/Audio/SoundEngine.h | 4 +- Minecraft.Client/ZombieRenderer.cpp | 18 +- Minecraft.Client/ZombieRenderer.h | 10 +- Minecraft.World/AbstractContainerMenu.cpp | 70 +-- Minecraft.World/AbstractContainerMenu.h | 34 +- Minecraft.World/Achievement.cpp | 10 +- Minecraft.World/Achievement.h | 6 +- Minecraft.World/AddEntityPacket.cpp | 12 +- Minecraft.World/AddEntityPacket.h | 8 +- Minecraft.World/AddExperienceOrbPacket.cpp | 2 +- Minecraft.World/AddExperienceOrbPacket.h | 4 +- Minecraft.World/AddGlobalEntityPacket.cpp | 6 +- Minecraft.World/AddGlobalEntityPacket.h | 4 +- Minecraft.World/AddIslandLayer.cpp | 2 +- Minecraft.World/AddIslandLayer.h | 2 +- Minecraft.World/AddMobPacket.cpp | 6 +- Minecraft.World/AddMobPacket.h | 10 +- Minecraft.World/AddMushroomIslandLayer.cpp | 2 +- Minecraft.World/AddMushroomIslandLayer.h | 2 +- Minecraft.World/AddPaintingPacket.cpp | 2 +- Minecraft.World/AddPaintingPacket.h | 4 +- Minecraft.World/AddPlayerPacket.cpp | 10 +- Minecraft.World/AddPlayerPacket.h | 10 +- Minecraft.World/AddSnowLayer.cpp | 2 +- Minecraft.World/AddSnowLayer.h | 2 +- Minecraft.World/AdminLogCommand.h | 2 +- Minecraft.World/AgableMob.cpp | 6 +- Minecraft.World/AgableMob.h | 4 +- Minecraft.World/Animal.cpp | 56 +- Minecraft.World/Animal.h | 18 +- Minecraft.World/AnimatePacket.cpp | 10 +- Minecraft.World/AnimatePacket.h | 8 +- Minecraft.World/AnvilTile.cpp | 8 +- Minecraft.World/AnvilTile.h | 8 +- Minecraft.World/ArmorDyeRecipe.cpp | 20 +- Minecraft.World/ArmorDyeRecipe.h | 10 +- Minecraft.World/ArmorItem.cpp | 12 +- Minecraft.World/ArmorItem.h | 12 +- Minecraft.World/ArmorSlot.cpp | 14 +- Minecraft.World/ArmorSlot.h | 8 +- Minecraft.World/ArrayWithLength.h | 4 +- Minecraft.World/Arrow.cpp | 36 +- Minecraft.World/Arrow.h | 8 +- Minecraft.World/ArrowAttackGoal.cpp | 10 +- Minecraft.World/AvoidPlayerGoal.cpp | 4 +- Minecraft.World/AwardStatPacket.h | 2 +- Minecraft.World/BedItem.cpp | 2 +- Minecraft.World/BedItem.h | 2 +- Minecraft.World/BedTile.cpp | 14 +- Minecraft.World/BedTile.h | 8 +- Minecraft.World/BegGoal.cpp | 4 +- Minecraft.World/BegGoal.h | 2 +- Minecraft.World/BiomeInitLayer.cpp | 2 +- Minecraft.World/BiomeInitLayer.h | 2 +- Minecraft.World/BiomeSource.h | 4 +- Minecraft.World/Blaze.cpp | 4 +- Minecraft.World/Blaze.h | 2 +- Minecraft.World/BlockRegionUpdatePacket.h | 2 +- Minecraft.World/Boat.cpp | 14 +- Minecraft.World/Boat.h | 4 +- Minecraft.World/BoatItem.cpp | 12 +- Minecraft.World/BoatItem.h | 4 +- Minecraft.World/BonusChestFeature.cpp | 2 +- Minecraft.World/BookItem.cpp | 2 +- Minecraft.World/BookItem.h | 2 +- Minecraft.World/BossMob.cpp | 4 +- Minecraft.World/BossMob.h | 2 +- Minecraft.World/BossMobPart.cpp | 2 +- Minecraft.World/BossMobPart.h | 2 +- Minecraft.World/BottleItem.cpp | 10 +- Minecraft.World/BottleItem.h | 4 +- Minecraft.World/BowItem.cpp | 12 +- Minecraft.World/BowItem.h | 10 +- Minecraft.World/BowlFoodItem.cpp | 4 +- Minecraft.World/BowlFoodItem.h | 2 +- Minecraft.World/BreedGoal.cpp | 12 +- Minecraft.World/BreedGoal.h | 2 +- Minecraft.World/BrewingStandMenu.cpp | 32 +- Minecraft.World/BrewingStandMenu.h | 26 +- Minecraft.World/BrewingStandTile.cpp | 18 +- Minecraft.World/BrewingStandTile.h | 6 +- Minecraft.World/BrewingStandTileEntity.cpp | 44 +- Minecraft.World/BrewingStandTileEntity.h | 16 +- Minecraft.World/BucketItem.cpp | 54 +- Minecraft.World/BucketItem.h | 4 +- Minecraft.World/ButtonTile.cpp | 10 +- Minecraft.World/ButtonTile.h | 10 +- Minecraft.World/CactusTile.cpp | 4 +- Minecraft.World/CactusTile.h | 4 +- Minecraft.World/CakeTile.cpp | 8 +- Minecraft.World/CakeTile.h | 8 +- Minecraft.World/CarrotOnAStickItem.cpp | 6 +- Minecraft.World/CarrotOnAStickItem.h | 2 +- Minecraft.World/CauldronTile.cpp | 12 +- Minecraft.World/CauldronTile.h | 4 +- Minecraft.World/CaveSpider.cpp | 2 +- Minecraft.World/CaveSpider.h | 2 +- Minecraft.World/ChatPacket.h | 2 +- Minecraft.World/ChestTile.cpp | 40 +- Minecraft.World/ChestTile.h | 8 +- Minecraft.World/ChestTileEntity.cpp | 36 +- Minecraft.World/ChestTileEntity.h | 12 +- Minecraft.World/Chicken.cpp | 22 +- Minecraft.World/Chicken.h | 8 +- Minecraft.World/ChunkPos.cpp | 2 +- Minecraft.World/ChunkPos.h | 2 +- Minecraft.World/ChunkTilesUpdatePacket.h | 2 +- Minecraft.World/ChunkVisibilityAreaPacket.h | 2 +- Minecraft.World/ChunkVisibilityPacket.h | 2 +- Minecraft.World/ClientCommandPacket.h | 2 +- Minecraft.World/ClientSideMerchant.cpp | 12 +- Minecraft.World/ClientSideMerchant.h | 12 +- Minecraft.World/ClothTileItem.cpp | 14 +- Minecraft.World/ClothTileItem.h | 8 +- Minecraft.World/CoalItem.cpp | 4 +- Minecraft.World/CoalItem.h | 2 +- Minecraft.World/CocoaTile.cpp | 10 +- Minecraft.World/CocoaTile.h | 6 +- Minecraft.World/ColoredTileItem.cpp | 4 +- Minecraft.World/ColoredTileItem.h | 4 +- Minecraft.World/Command.cpp | 10 +- Minecraft.World/Command.h | 10 +- Minecraft.World/CommandDispatcher.cpp | 2 +- Minecraft.World/CommandDispatcher.h | 2 +- Minecraft.World/ComplexItem.cpp | 2 +- Minecraft.World/ComplexItem.h | 2 +- Minecraft.World/ComplexItemDataPacket.h | 2 +- Minecraft.World/CompoundContainer.cpp | 12 +- Minecraft.World/CompoundContainer.h | 14 +- Minecraft.World/Connection.cpp | 40 +- Minecraft.World/Connection.h | 12 +- Minecraft.World/Container.h | 10 +- Minecraft.World/ContainerAckPacket.h | 2 +- Minecraft.World/ContainerButtonClickPacket.h | 2 +- Minecraft.World/ContainerClickPacket.cpp | 4 +- Minecraft.World/ContainerClickPacket.h | 6 +- Minecraft.World/ContainerClosePacket.h | 2 +- Minecraft.World/ContainerMenu.cpp | 20 +- Minecraft.World/ContainerMenu.h | 12 +- Minecraft.World/ContainerOpenPacket.h | 2 +- Minecraft.World/ContainerSetContentPacket.cpp | 14 +- Minecraft.World/ContainerSetContentPacket.h | 4 +- Minecraft.World/ContainerSetDataPacket.h | 2 +- Minecraft.World/ContainerSetSlotPacket.cpp | 6 +- Minecraft.World/ContainerSetSlotPacket.h | 6 +- Minecraft.World/ControlledByPlayerGoal.cpp | 8 +- Minecraft.World/Cow.cpp | 32 +- Minecraft.World/Cow.h | 4 +- Minecraft.World/CraftItemPacket.h | 2 +- Minecraft.World/CraftingContainer.cpp | 18 +- Minecraft.World/CraftingContainer.h | 12 +- Minecraft.World/CraftingMenu.cpp | 20 +- Minecraft.World/CraftingMenu.h | 14 +- Minecraft.World/Creeper.cpp | 8 +- Minecraft.World/Creeper.h | 2 +- Minecraft.World/CropTile.cpp | 2 +- Minecraft.World/CustomPayloadPacket.h | 2 +- Minecraft.World/DamageEnchantment.cpp | 4 +- Minecraft.World/DamageEnchantment.h | 4 +- Minecraft.World/DamageSource.cpp | 26 +- Minecraft.World/DamageSource.h | 22 +- Minecraft.World/DeadBushTile.cpp | 4 +- Minecraft.World/DeadBushTile.h | 2 +- Minecraft.World/DebugOptionsPacket.h | 2 +- Minecraft.World/DefaultGameModeCommand.cpp | 2 +- Minecraft.World/DefaultGameModeCommand.h | 2 +- Minecraft.World/DefendVillageTargetGoal.cpp | 2 +- Minecraft.World/DelayedRelease.cpp | 4 +- Minecraft.World/DelayedRelease.h | 4 +- Minecraft.World/DerivedLevelData.cpp | 2 +- Minecraft.World/DerivedLevelData.h | 2 +- Minecraft.World/DetectorRailTile.cpp | 4 +- Minecraft.World/DetectorRailTile.h | 2 +- Minecraft.World/DigDurabilityEnchantment.cpp | 4 +- Minecraft.World/DigDurabilityEnchantment.h | 4 +- Minecraft.World/DiggerItem.cpp | 10 +- Minecraft.World/DiggerItem.h | 10 +- Minecraft.World/DiggingEnchantment.cpp | 2 +- Minecraft.World/DiggingEnchantment.h | 2 +- Minecraft.World/DiodeTile.cpp | 6 +- Minecraft.World/DiodeTile.h | 4 +- Minecraft.World/DirectoryLevelStorage.cpp | 8 +- Minecraft.World/DirectoryLevelStorage.h | 8 +- Minecraft.World/DirectoryLevelStorageSource.cpp | 22 +- Minecraft.World/DirectoryLevelStorageSource.h | 4 +- Minecraft.World/DisconnectPacket.cpp | 4 +- Minecraft.World/DisconnectPacket.h | 4 +- Minecraft.World/DispenserTile.cpp | 92 +-- Minecraft.World/DispenserTile.h | 10 +- Minecraft.World/DispenserTileEntity.cpp | 44 +- Minecraft.World/DispenserTileEntity.h | 16 +- Minecraft.World/DoorItem.cpp | 2 +- Minecraft.World/DoorItem.h | 4 +- Minecraft.World/DoorTile.cpp | 6 +- Minecraft.World/DoorTile.h | 6 +- Minecraft.World/DownfallLayer.cpp | 2 +- Minecraft.World/DownfallLayer.h | 2 +- Minecraft.World/DownfallMixerLayer.cpp | 2 +- Minecraft.World/DownfallMixerLayer.h | 4 +- Minecraft.World/DragonFireball.cpp | 8 +- Minecraft.World/DragonFireball.h | 2 +- Minecraft.World/DurangoStats.cpp | 106 ++-- Minecraft.World/DurangoStats.h | 40 +- Minecraft.World/DyePowderItem.cpp | 68 +-- Minecraft.World/DyePowderItem.h | 8 +- Minecraft.World/EggItem.cpp | 4 +- Minecraft.World/EggItem.h | 2 +- Minecraft.World/EggTile.cpp | 8 +- Minecraft.World/EggTile.h | 4 +- Minecraft.World/EmptyLevelChunk.cpp | 18 +- Minecraft.World/EmptyLevelChunk.h | 16 +- Minecraft.World/EnchantItemCommand.cpp | 10 +- Minecraft.World/EnchantItemCommand.h | 4 +- Minecraft.World/EnchantedBookItem.cpp | 24 +- Minecraft.World/EnchantedBookItem.h | 18 +- Minecraft.World/Enchantment.cpp | 6 +- Minecraft.World/Enchantment.h | 4 +- Minecraft.World/EnchantmentHelper.cpp | 54 +- Minecraft.World/EnchantmentHelper.h | 52 +- Minecraft.World/EnchantmentMenu.cpp | 30 +- Minecraft.World/EnchantmentMenu.h | 14 +- Minecraft.World/EnchantmentSlot.h | 6 +- Minecraft.World/EnchantmentTableEntity.cpp | 6 +- Minecraft.World/EnchantmentTableEntity.h | 2 +- Minecraft.World/EnchantmentTableTile.cpp | 6 +- Minecraft.World/EnchantmentTableTile.h | 6 +- Minecraft.World/EnderChestTile.cpp | 12 +- Minecraft.World/EnderChestTile.h | 6 +- Minecraft.World/EnderChestTileEntity.cpp | 10 +- Minecraft.World/EnderChestTileEntity.h | 4 +- Minecraft.World/EnderCrystal.cpp | 10 +- Minecraft.World/EnderDragon.cpp | 88 +-- Minecraft.World/EnderDragon.h | 36 +- Minecraft.World/EnderEyeItem.cpp | 16 +- Minecraft.World/EnderEyeItem.h | 6 +- Minecraft.World/EnderMan.cpp | 12 +- Minecraft.World/EnderMan.h | 6 +- Minecraft.World/EnderpearlItem.cpp | 8 +- Minecraft.World/EnderpearlItem.h | 4 +- Minecraft.World/Entity.cpp | 72 +-- Minecraft.World/Entity.h | 46 +- Minecraft.World/EntityActionAtPositionPacket.cpp | 4 +- Minecraft.World/EntityActionAtPositionPacket.h | 4 +- Minecraft.World/EntityDamageSource.cpp | 14 +- Minecraft.World/EntityDamageSource.h | 12 +- Minecraft.World/EntityEventPacket.h | 2 +- Minecraft.World/EntityIO.cpp | 32 +- Minecraft.World/EntityIO.h | 12 +- Minecraft.World/EntityPos.cpp | 2 +- Minecraft.World/EntityPos.h | 2 +- Minecraft.World/EntityTile.cpp | 2 +- Minecraft.World/EntityTile.h | 2 +- Minecraft.World/ExperienceCommand.cpp | 6 +- Minecraft.World/ExperienceCommand.h | 4 +- Minecraft.World/ExperienceItem.cpp | 8 +- Minecraft.World/ExperienceItem.h | 6 +- Minecraft.World/ExperienceOrb.cpp | 4 +- Minecraft.World/ExperienceOrb.h | 4 +- Minecraft.World/ExplodePacket.h | 4 +- Minecraft.World/Explosion.cpp | 14 +- Minecraft.World/Explosion.h | 10 +- Minecraft.World/EyeOfEnderSignal.cpp | 2 +- Minecraft.World/FallingTile.cpp | 6 +- Minecraft.World/FarmTile.cpp | 4 +- Minecraft.World/FarmTile.h | 2 +- Minecraft.World/FenceGateTile.cpp | 6 +- Minecraft.World/FenceGateTile.h | 6 +- Minecraft.World/FenceTile.cpp | 2 +- Minecraft.World/FenceTile.h | 2 +- Minecraft.World/FireChargeItem.cpp | 10 +- Minecraft.World/FireChargeItem.h | 2 +- Minecraft.World/Fireball.cpp | 24 +- Minecraft.World/Fireball.h | 4 +- Minecraft.World/FishingHook.cpp | 28 +- Minecraft.World/FishingHook.h | 8 +- Minecraft.World/FishingRodItem.cpp | 18 +- Minecraft.World/FishingRodItem.h | 2 +- Minecraft.World/FlintAndSteelItem.cpp | 8 +- Minecraft.World/FlintAndSteelItem.h | 2 +- Minecraft.World/FlowerPotTile.cpp | 36 +- Minecraft.World/FlowerPotTile.h | 6 +- Minecraft.World/FollowOwnerGoal.cpp | 2 +- Minecraft.World/FollowParentGoal.cpp | 6 +- Minecraft.World/FoodData.cpp | 2 +- Minecraft.World/FoodData.h | 2 +- Minecraft.World/FoodItem.cpp | 14 +- Minecraft.World/FoodItem.h | 12 +- Minecraft.World/FurnaceMenu.cpp | 20 +- Minecraft.World/FurnaceMenu.h | 10 +- Minecraft.World/FurnaceResultSlot.cpp | 16 +- Minecraft.World/FurnaceResultSlot.h | 16 +- Minecraft.World/FurnaceTile.cpp | 24 +- Minecraft.World/FurnaceTile.h | 6 +- Minecraft.World/FurnaceTileEntity.cpp | 28 +- Minecraft.World/FurnaceTileEntity.h | 16 +- Minecraft.World/FuzzyZoomLayer.cpp | 8 +- Minecraft.World/FuzzyZoomLayer.h | 4 +- Minecraft.World/GameCommandPacket.h | 2 +- Minecraft.World/GameEventPacket.h | 2 +- Minecraft.World/GameModeCommand.cpp | 6 +- Minecraft.World/GameModeCommand.h | 6 +- Minecraft.World/GenericStats.cpp | 158 ++--- Minecraft.World/GenericStats.h | 16 +- Minecraft.World/GetInfoPacket.h | 2 +- Minecraft.World/Ghast.cpp | 24 +- Minecraft.World/Ghast.h | 4 +- Minecraft.World/GiveItemCommand.cpp | 12 +- Minecraft.World/GiveItemCommand.h | 4 +- Minecraft.World/GoldenAppleItem.cpp | 8 +- Minecraft.World/GoldenAppleItem.h | 8 +- Minecraft.World/GrowMushroomIslandLayer.cpp | 2 +- Minecraft.World/GrowMushroomIslandLayer.h | 2 +- Minecraft.World/HalfSlabTile.cpp | 52 +- Minecraft.World/HalfSlabTile.h | 6 +- Minecraft.World/HangingEntity.cpp | 78 +-- Minecraft.World/HangingEntity.h | 4 +- Minecraft.World/HangingEntityItem.cpp | 26 +- Minecraft.World/HangingEntityItem.h | 8 +- Minecraft.World/HashExtension.h | 4 +- Minecraft.World/HatchetItem.cpp | 2 +- Minecraft.World/HatchetItem.h | 2 +- Minecraft.World/HeavyTile.cpp | 4 +- Minecraft.World/HeavyTile.h | 2 +- Minecraft.World/HellSandTile.cpp | 2 +- Minecraft.World/HellSandTile.h | 2 +- Minecraft.World/HitResult.cpp | 4 +- Minecraft.World/HitResult.h | 6 +- Minecraft.World/HoeItem.cpp | 6 +- Minecraft.World/HoeItem.h | 2 +- Minecraft.World/HouseFeature.cpp | 2 +- Minecraft.World/HurtByTargetGoal.cpp | 4 +- Minecraft.World/HurtByTargetGoal.h | 2 +- Minecraft.World/IceTile.cpp | 4 +- Minecraft.World/IceTile.h | 2 +- Minecraft.World/IndirectEntityDamageSource.cpp | 16 +- Minecraft.World/IndirectEntityDamageSource.h | 14 +- Minecraft.World/InteractPacket.h | 2 +- Minecraft.World/Inventory.cpp | 78 +-- Minecraft.World/Inventory.h | 52 +- Minecraft.World/InventoryMenu.cpp | 46 +- Minecraft.World/InventoryMenu.h | 20 +- Minecraft.World/Item.cpp | 74 +-- Minecraft.World/Item.h | 82 +-- Minecraft.World/ItemEntity.cpp | 36 +- Minecraft.World/ItemEntity.h | 12 +- Minecraft.World/ItemFrame.cpp | 50 +- Minecraft.World/ItemFrame.h | 6 +- Minecraft.World/ItemInstance.cpp | 104 ++-- Minecraft.World/ItemInstance.h | 54 +- Minecraft.World/KeepAlivePacket.cpp | 6 +- Minecraft.World/KeepAlivePacket.h | 4 +- Minecraft.World/KickPlayerPacket.h | 2 +- Minecraft.World/KillCommand.cpp | 4 +- Minecraft.World/KillCommand.h | 2 +- Minecraft.World/LadderTile.cpp | 2 +- Minecraft.World/LadderTile.h | 2 +- Minecraft.World/LavaSlime.cpp | 4 +- Minecraft.World/LavaSlime.h | 2 +- Minecraft.World/Layer.cpp | 58 +- Minecraft.World/Layer.h | 2 +- Minecraft.World/LeafTile.cpp | 14 +- Minecraft.World/LeafTile.h | 8 +- Minecraft.World/LeafTileItem.cpp | 6 +- Minecraft.World/LeafTileItem.h | 6 +- Minecraft.World/Level.cpp | 198 +++---- Minecraft.World/Level.h | 120 ++-- Minecraft.World/LevelChunk.cpp | 56 +- Minecraft.World/LevelChunk.h | 20 +- Minecraft.World/LevelData.cpp | 2 +- Minecraft.World/LevelData.h | 2 +- Minecraft.World/LevelEventPacket.h | 2 +- Minecraft.World/LevelListener.h | 10 +- Minecraft.World/LevelSoundPacket.h | 2 +- Minecraft.World/LevelSource.h | 2 +- Minecraft.World/LevelStorage.h | 4 +- Minecraft.World/LevelStorageProfilerDecorator.cpp | 2 +- Minecraft.World/LevelStorageProfilerDecorator.h | 2 +- Minecraft.World/LevelStorageSource.h | 6 +- Minecraft.World/LeverTile.cpp | 8 +- Minecraft.World/LeverTile.h | 6 +- Minecraft.World/LightningBolt.cpp | 6 +- Minecraft.World/LiquidTile.cpp | 4 +- Minecraft.World/LiquidTile.h | 2 +- Minecraft.World/LoginPacket.h | 2 +- Minecraft.World/LookControl.cpp | 6 +- Minecraft.World/LookControl.h | 2 +- Minecraft.World/MakeLoveGoal.cpp | 6 +- Minecraft.World/MapItem.cpp | 66 +-- Minecraft.World/MapItem.h | 14 +- Minecraft.World/MapItemSavedData.cpp | 42 +- Minecraft.World/MapItemSavedData.h | 18 +- Minecraft.World/McRegionLevelStorage.cpp | 16 +- Minecraft.World/McRegionLevelStorage.h | 2 +- Minecraft.World/McRegionLevelStorageSource.cpp | 32 +- Minecraft.World/McRegionLevelStorageSource.h | 6 +- Minecraft.World/MeleeAttackGoal.cpp | 4 +- Minecraft.World/MemoryLevelStorage.cpp | 12 +- Minecraft.World/MemoryLevelStorage.h | 8 +- Minecraft.World/MemoryLevelStorageSource.cpp | 10 +- Minecraft.World/MemoryLevelStorageSource.h | 4 +- Minecraft.World/MenuBackup.cpp | 2 +- Minecraft.World/MenuBackup.h | 4 +- Minecraft.World/Merchant.h | 8 +- Minecraft.World/MerchantContainer.cpp | 24 +- Minecraft.World/MerchantContainer.h | 16 +- Minecraft.World/MerchantMenu.cpp | 24 +- Minecraft.World/MerchantMenu.h | 18 +- Minecraft.World/MerchantRecipe.cpp | 20 +- Minecraft.World/MerchantRecipe.h | 22 +- Minecraft.World/MerchantRecipeList.cpp | 12 +- Minecraft.World/MerchantRecipeList.h | 4 +- Minecraft.World/MerchantResultSlot.cpp | 24 +- Minecraft.World/MerchantResultSlot.h | 20 +- Minecraft.World/MilkBucketItem.cpp | 10 +- Minecraft.World/MilkBucketItem.h | 8 +- Minecraft.World/MineShaftPieces.cpp | 14 +- Minecraft.World/Minecart.cpp | 64 +- Minecraft.World/Minecart.h | 16 +- Minecraft.World/MinecartItem.cpp | 8 +- Minecraft.World/MinecartItem.h | 4 +- Minecraft.World/Mob.cpp | 326 +++++----- Minecraft.World/Mob.h | 44 +- Minecraft.World/MobEffect.cpp | 8 +- Minecraft.World/MobEffect.h | 6 +- Minecraft.World/MobEffectInstance.cpp | 6 +- Minecraft.World/MobEffectInstance.h | 4 +- Minecraft.World/MobSpawner.cpp | 38 +- Minecraft.World/MobSpawner.h | 4 +- Minecraft.World/MobSpawnerTile.cpp | 4 +- Minecraft.World/MobSpawnerTile.h | 2 +- Minecraft.World/MobSpawnerTileEntity.cpp | 32 +- Minecraft.World/MobSpawnerTileEntity.h | 12 +- Minecraft.World/MockedLevelStorage.cpp | 6 +- Minecraft.World/MockedLevelStorage.h | 4 +- Minecraft.World/Monster.cpp | 24 +- Minecraft.World/Monster.h | 6 +- Minecraft.World/MonsterPlacerItem.cpp | 26 +- Minecraft.World/MonsterPlacerItem.h | 10 +- Minecraft.World/MonsterRoomFeature.cpp | 32 +- Minecraft.World/MonsterRoomFeature.h | 2 +- Minecraft.World/MoveEntityPacket.cpp | 26 +- Minecraft.World/MoveEntityPacket.h | 10 +- Minecraft.World/MoveEntityPacketSmall.cpp | 28 +- Minecraft.World/MoveEntityPacketSmall.h | 10 +- Minecraft.World/MoveIndoorsGoal.cpp | 8 +- Minecraft.World/MovePlayerPacket.cpp | 26 +- Minecraft.World/MovePlayerPacket.h | 10 +- Minecraft.World/MoveThroughVillageGoal.cpp | 20 +- Minecraft.World/MoveThroughVillageGoal.h | 4 +- Minecraft.World/MultiTextureTileItem.cpp | 10 +- Minecraft.World/MultiTextureTileItem.h | 4 +- Minecraft.World/MushroomCow.cpp | 20 +- Minecraft.World/MushroomCow.h | 4 +- Minecraft.World/MusicTile.cpp | 14 +- Minecraft.World/MusicTile.h | 6 +- Minecraft.World/MusicTileEntity.cpp | 10 +- Minecraft.World/MusicTileEntity.h | 2 +- Minecraft.World/NearestAttackableTargetGoal.cpp | 8 +- Minecraft.World/NearestAttackableTargetGoal.h | 2 +- Minecraft.World/NetherBridgePieces.cpp | 32 +- Minecraft.World/NetherStalkTile.cpp | 2 +- Minecraft.World/OcelotSitOnTileGoal.cpp | 2 +- Minecraft.World/OldChunkStorage.cpp | 16 +- Minecraft.World/OwnerHurtByTargetGoal.cpp | 2 +- Minecraft.World/OwnerHurtTargetGoal.cpp | 2 +- Minecraft.World/Ozelot.cpp | 16 +- Minecraft.World/Ozelot.h | 10 +- Minecraft.World/OzelotAttackGoal.cpp | 2 +- Minecraft.World/Packet.cpp | 22 +- Minecraft.World/Packet.h | 18 +- Minecraft.World/PacketListener.cpp | 302 +++++----- Minecraft.World/PacketListener.h | 174 +++--- Minecraft.World/Painting.cpp | 10 +- Minecraft.World/Painting.h | 4 +- Minecraft.World/Path.cpp | 16 +- Minecraft.World/Path.h | 6 +- Minecraft.World/PathNavigation.cpp | 4 +- Minecraft.World/PathNavigation.h | 4 +- Minecraft.World/PathfinderMob.cpp | 12 +- Minecraft.World/PathfinderMob.h | 10 +- Minecraft.World/PickaxeItem.cpp | 2 +- Minecraft.World/PickaxeItem.h | 4 +- Minecraft.World/Pig.cpp | 40 +- Minecraft.World/Pig.h | 6 +- Minecraft.World/PigZombie.cpp | 30 +- Minecraft.World/PigZombie.h | 10 +- Minecraft.World/PistonBaseTile.cpp | 28 +- Minecraft.World/PistonBaseTile.h | 14 +- Minecraft.World/PistonExtensionTile.cpp | 4 +- Minecraft.World/PistonExtensionTile.h | 4 +- Minecraft.World/PistonMovingPiece.cpp | 22 +- Minecraft.World/PistonMovingPiece.h | 10 +- Minecraft.World/PistonPieceEntity.cpp | 8 +- Minecraft.World/PistonPieceEntity.h | 2 +- Minecraft.World/PlayGoal.cpp | 6 +- Minecraft.World/Player.cpp | 240 ++++---- Minecraft.World/Player.h | 96 +-- Minecraft.World/PlayerAbilitiesPacket.cpp | 2 +- Minecraft.World/PlayerAbilitiesPacket.h | 4 +- Minecraft.World/PlayerActionPacket.h | 2 +- Minecraft.World/PlayerCommandPacket.cpp | 8 +- Minecraft.World/PlayerCommandPacket.h | 4 +- Minecraft.World/PlayerEnderChestContainer.cpp | 6 +- Minecraft.World/PlayerEnderChestContainer.h | 6 +- Minecraft.World/PlayerIO.h | 8 +- Minecraft.World/PlayerInfoPacket.cpp | 2 +- Minecraft.World/PlayerInfoPacket.h | 4 +- Minecraft.World/PlayerInputPacket.h | 2 +- Minecraft.World/PortalForcer.cpp | 12 +- Minecraft.World/PortalForcer.h | 6 +- Minecraft.World/PortalTile.cpp | 4 +- Minecraft.World/PortalTile.h | 4 +- Minecraft.World/PotatoTile.cpp | 2 +- Minecraft.World/PotionItem.cpp | 42 +- Minecraft.World/PotionItem.h | 24 +- Minecraft.World/PreLoginPacket.h | 2 +- Minecraft.World/PressurePlateTile.cpp | 6 +- Minecraft.World/PressurePlateTile.h | 6 +- Minecraft.World/ProtectionEnchantment.cpp | 6 +- Minecraft.World/ProtectionEnchantment.h | 4 +- Minecraft.World/PumpkinTile.cpp | 6 +- Minecraft.World/PumpkinTile.h | 2 +- Minecraft.World/QuartzBlockTile.cpp | 4 +- Minecraft.World/QuartzBlockTile.h | 2 +- Minecraft.World/RailTile.cpp | 2 +- Minecraft.World/RailTile.h | 2 +- Minecraft.World/RandomPos.cpp | 8 +- Minecraft.World/RandomPos.h | 8 +- Minecraft.World/Recipes.cpp | 76 +-- Minecraft.World/Recipes.h | 16 +- Minecraft.World/Recipy.h | 12 +- Minecraft.World/RecordPlayerTile.cpp | 14 +- Minecraft.World/RecordPlayerTile.h | 10 +- Minecraft.World/RecordingItem.cpp | 8 +- Minecraft.World/RecordingItem.h | 6 +- Minecraft.World/RedStoneItem.cpp | 4 +- Minecraft.World/RedStoneItem.h | 4 +- Minecraft.World/RedStoneOreTile.cpp | 10 +- Minecraft.World/RedStoneOreTile.h | 10 +- Minecraft.World/Region.cpp | 2 +- Minecraft.World/Region.h | 2 +- Minecraft.World/RegionHillsLayer.cpp | 2 +- Minecraft.World/RegionHillsLayer.h | 2 +- Minecraft.World/RemoveEntitiesPacket.h | 2 +- Minecraft.World/RemoveMobEffectPacket.h | 2 +- Minecraft.World/RepairMenu.cpp | 26 +- Minecraft.World/RepairMenu.h | 16 +- Minecraft.World/RepairResultSlot.cpp | 12 +- Minecraft.World/RepairResultSlot.h | 10 +- Minecraft.World/RespawnPacket.h | 2 +- Minecraft.World/RestrictOpenDoorGoal.cpp | 8 +- Minecraft.World/ResultContainer.cpp | 14 +- Minecraft.World/ResultContainer.h | 10 +- Minecraft.World/ResultSlot.cpp | 20 +- Minecraft.World/ResultSlot.h | 18 +- Minecraft.World/RiverInitLayer.cpp | 2 +- Minecraft.World/RiverInitLayer.h | 2 +- Minecraft.World/RiverLayer.cpp | 2 +- Minecraft.World/RiverLayer.h | 2 +- Minecraft.World/RiverMixerLayer.cpp | 2 +- Minecraft.World/RiverMixerLayer.h | 6 +- Minecraft.World/RotateHeadPacket.cpp | 4 +- Minecraft.World/RotateHeadPacket.h | 4 +- Minecraft.World/SaddleItem.cpp | 8 +- Minecraft.World/SaddleItem.h | 4 +- Minecraft.World/SaplingTileItem.cpp | 6 +- Minecraft.World/SaplingTileItem.h | 2 +- Minecraft.World/SavedDataStorage.cpp | 24 +- Minecraft.World/SavedDataStorage.h | 12 +- Minecraft.World/SeedFoodItem.cpp | 2 +- Minecraft.World/SeedFoodItem.h | 2 +- Minecraft.World/SeedItem.cpp | 4 +- Minecraft.World/SeedItem.h | 4 +- Minecraft.World/Sensing.cpp | 2 +- Minecraft.World/Sensing.h | 2 +- Minecraft.World/ServerSettingsChangedPacket.h | 2 +- Minecraft.World/SetCarriedItemPacket.cpp | 14 +- Minecraft.World/SetCarriedItemPacket.h | 4 +- Minecraft.World/SetCreativeModeSlotPacket.cpp | 4 +- Minecraft.World/SetCreativeModeSlotPacket.h | 6 +- Minecraft.World/SetEntityDataPacket.cpp | 10 +- Minecraft.World/SetEntityDataPacket.h | 8 +- Minecraft.World/SetEntityMotionPacket.cpp | 14 +- Minecraft.World/SetEntityMotionPacket.h | 6 +- Minecraft.World/SetEquippedItemPacket.cpp | 14 +- Minecraft.World/SetEquippedItemPacket.h | 12 +- Minecraft.World/SetExperiencePacket.cpp | 2 +- Minecraft.World/SetExperiencePacket.h | 4 +- Minecraft.World/SetHealthPacket.cpp | 8 +- Minecraft.World/SetHealthPacket.h | 4 +- Minecraft.World/SetRidingPacket.cpp | 8 +- Minecraft.World/SetRidingPacket.h | 6 +- Minecraft.World/SetSpawnPositionPacket.cpp | 10 +- Minecraft.World/SetSpawnPositionPacket.h | 4 +- Minecraft.World/SetTimePacket.cpp | 2 +- Minecraft.World/SetTimePacket.h | 4 +- Minecraft.World/ShapedRecipy.cpp | 60 +- Minecraft.World/ShapedRecipy.h | 8 +- Minecraft.World/ShapelessRecipy.cpp | 40 +- Minecraft.World/ShapelessRecipy.h | 8 +- Minecraft.World/ShearsItem.cpp | 4 +- Minecraft.World/ShearsItem.h | 6 +- Minecraft.World/Sheep.cpp | 62 +- Minecraft.World/Sheep.h | 12 +- Minecraft.World/ShoreLayer.cpp | 2 +- Minecraft.World/ShoreLayer.h | 2 +- Minecraft.World/SignItem.cpp | 10 +- Minecraft.World/SignItem.h | 4 +- Minecraft.World/SignTile.cpp | 6 +- Minecraft.World/SignTile.h | 4 +- Minecraft.World/SignTileEntity.cpp | 24 +- Minecraft.World/SignTileEntity.h | 4 +- Minecraft.World/SignUpdatePacket.h | 2 +- Minecraft.World/Silverfish.cpp | 8 +- Minecraft.World/Silverfish.h | 4 +- Minecraft.World/SimpleContainer.cpp | 16 +- Minecraft.World/SimpleContainer.h | 10 +- Minecraft.World/SitGoal.cpp | 2 +- Minecraft.World/Skeleton.cpp | 22 +- Minecraft.World/Skeleton.h | 4 +- Minecraft.World/SkullItem.cpp | 12 +- Minecraft.World/SkullItem.h | 8 +- Minecraft.World/SkullTile.cpp | 24 +- Minecraft.World/SkullTile.h | 10 +- Minecraft.World/SkullTileEntity.cpp | 10 +- Minecraft.World/SkullTileEntity.h | 4 +- Minecraft.World/Slime.cpp | 22 +- Minecraft.World/Slime.h | 6 +- Minecraft.World/Slot.cpp | 38 +- Minecraft.World/Slot.h | 28 +- Minecraft.World/SmallFireball.cpp | 2 +- Minecraft.World/SmallFireball.h | 2 +- Minecraft.World/SmoothLayer.cpp | 2 +- Minecraft.World/SmoothLayer.h | 2 +- Minecraft.World/SmoothStoneBrickTileItem.cpp | 2 +- Minecraft.World/SmoothStoneBrickTileItem.h | 2 +- Minecraft.World/SmoothZoomLayer.cpp | 8 +- Minecraft.World/SmoothZoomLayer.h | 4 +- Minecraft.World/Snowball.cpp | 2 +- Minecraft.World/Snowball.h | 2 +- Minecraft.World/SnowballItem.cpp | 6 +- Minecraft.World/SnowballItem.h | 2 +- Minecraft.World/Spider.cpp | 16 +- Minecraft.World/Spider.h | 6 +- Minecraft.World/SpikeFeature.cpp | 16 +- Minecraft.World/Squid.cpp | 42 +- Minecraft.World/StairTile.cpp | 16 +- Minecraft.World/StairTile.h | 16 +- Minecraft.World/Stat.h | 2 +- Minecraft.World/StemTile.cpp | 4 +- Minecraft.World/StemTile.h | 2 +- Minecraft.World/StoneMonsterTile.cpp | 6 +- Minecraft.World/StoneMonsterTile.h | 2 +- Minecraft.World/StoneMonsterTileItem.cpp | 2 +- Minecraft.World/StoneMonsterTileItem.h | 2 +- Minecraft.World/StoneSlabTile.cpp | 12 +- Minecraft.World/StoneSlabTile.h | 2 +- Minecraft.World/StoneSlabTileItem.cpp | 38 +- Minecraft.World/StoneSlabTileItem.h | 8 +- Minecraft.World/StrongholdPieces.cpp | 48 +- Minecraft.World/StructurePiece.cpp | 10 +- Minecraft.World/SwampRiversLayer.cpp | 2 +- Minecraft.World/SwampRiversLayer.h | 2 +- Minecraft.World/SwellGoal.cpp | 2 +- Minecraft.World/SynchedEntityData.cpp | 94 +-- Minecraft.World/SynchedEntityData.h | 28 +- Minecraft.World/TakeFlowerGoal.cpp | 4 +- Minecraft.World/TakeItemEntityPacket.h | 2 +- Minecraft.World/TallGrass.cpp | 6 +- Minecraft.World/TallGrass.h | 2 +- Minecraft.World/TamableAnimal.cpp | 2 +- Minecraft.World/TamableAnimal.h | 2 +- Minecraft.World/TargetGoal.cpp | 10 +- Minecraft.World/TargetGoal.h | 4 +- Minecraft.World/TeleportEntityPacket.cpp | 12 +- Minecraft.World/TeleportEntityPacket.h | 6 +- Minecraft.World/TemperatureLayer.cpp | 2 +- Minecraft.World/TemperatureLayer.h | 2 +- Minecraft.World/TemperatureMixerLayer.cpp | 2 +- Minecraft.World/TemperatureMixerLayer.h | 4 +- Minecraft.World/TemptGoal.cpp | 2 +- Minecraft.World/TextureAndGeometryChangePacket.cpp | 10 +- Minecraft.World/TextureAndGeometryChangePacket.h | 4 +- Minecraft.World/TextureAndGeometryPacket.h | 8 +- Minecraft.World/TextureChangePacket.cpp | 10 +- Minecraft.World/TextureChangePacket.h | 4 +- Minecraft.World/TexturePacket.h | 4 +- Minecraft.World/TheEndBiomeDecorator.cpp | 4 +- Minecraft.World/TheEndPortal.cpp | 10 +- Minecraft.World/TheEndPortal.h | 12 +- Minecraft.World/TheEndPortalFrameTile.cpp | 4 +- Minecraft.World/TheEndPortalFrameTile.h | 4 +- Minecraft.World/TheEndPortalTileEntity.cpp | 4 +- Minecraft.World/TheEndPortalTileEntity.h | 2 +- Minecraft.World/ThinFenceTile.cpp | 8 +- Minecraft.World/ThinFenceTile.h | 8 +- Minecraft.World/ThornsEnchantment.cpp | 6 +- Minecraft.World/ThornsEnchantment.h | 4 +- Minecraft.World/Throwable.cpp | 8 +- Minecraft.World/Throwable.h | 4 +- Minecraft.World/ThrownEgg.cpp | 4 +- Minecraft.World/ThrownEgg.h | 2 +- Minecraft.World/ThrownEnderpearl.cpp | 4 +- Minecraft.World/ThrownEnderpearl.h | 2 +- Minecraft.World/ThrownExpBottle.cpp | 4 +- Minecraft.World/ThrownExpBottle.h | 2 +- Minecraft.World/ThrownPotion.cpp | 10 +- Minecraft.World/ThrownPotion.h | 2 +- Minecraft.World/Tile.cpp | 42 +- Minecraft.World/Tile.h | 32 +- Minecraft.World/TileDestructionPacket.cpp | 6 +- Minecraft.World/TileDestructionPacket.h | 4 +- Minecraft.World/TileEntity.cpp | 10 +- Minecraft.World/TileEntity.h | 8 +- Minecraft.World/TileEntityDataPacket.h | 2 +- Minecraft.World/TileEventPacket.h | 2 +- Minecraft.World/TileItem.cpp | 34 +- Minecraft.World/TileItem.h | 14 +- Minecraft.World/TilePlanterItem.cpp | 12 +- Minecraft.World/TilePlanterItem.h | 2 +- Minecraft.World/TileUpdatePacket.h | 2 +- Minecraft.World/TimeCommand.cpp | 10 +- Minecraft.World/TimeCommand.h | 8 +- Minecraft.World/TntTile.cpp | 16 +- Minecraft.World/TntTile.h | 6 +- Minecraft.World/ToggleDownfallCommand.cpp | 6 +- Minecraft.World/ToggleDownfallCommand.h | 4 +- Minecraft.World/TopSnowTile.cpp | 6 +- Minecraft.World/TopSnowTile.h | 6 +- Minecraft.World/TorchTile.cpp | 4 +- Minecraft.World/TorchTile.h | 4 +- Minecraft.World/TradeItemPacket.h | 2 +- Minecraft.World/TradeWithPlayerGoal.cpp | 2 +- Minecraft.World/TrapDoorTile.cpp | 6 +- Minecraft.World/TrapDoorTile.h | 6 +- Minecraft.World/TrapMenu.cpp | 10 +- Minecraft.World/TrapMenu.h | 8 +- Minecraft.World/TreeTile.cpp | 8 +- Minecraft.World/TreeTile.h | 6 +- Minecraft.World/TreeTileItem.cpp | 4 +- Minecraft.World/TreeTileItem.h | 4 +- Minecraft.World/TripWireSourceTile.cpp | 8 +- Minecraft.World/TripWireSourceTile.h | 2 +- Minecraft.World/TripWireTile.cpp | 12 +- Minecraft.World/TripWireTile.h | 6 +- Minecraft.World/UntouchingEnchantment.cpp | 2 +- Minecraft.World/UntouchingEnchantment.h | 2 +- Minecraft.World/UpdateGameRuleProgressPacket.h | 2 +- Minecraft.World/UpdateMobEffectPacket.cpp | 4 +- Minecraft.World/UpdateMobEffectPacket.h | 4 +- Minecraft.World/UpdateProgressPacket.h | 2 +- Minecraft.World/UseItemPacket.cpp | 14 +- Minecraft.World/UseItemPacket.h | 8 +- Minecraft.World/Village.cpp | 46 +- Minecraft.World/Village.h | 22 +- Minecraft.World/VillagePieces.cpp | 16 +- Minecraft.World/VillageSiege.cpp | 18 +- Minecraft.World/Villager.cpp | 62 +- Minecraft.World/Villager.h | 16 +- Minecraft.World/VillagerGolem.cpp | 6 +- Minecraft.World/VillagerGolem.h | 4 +- Minecraft.World/Villages.cpp | 38 +- Minecraft.World/Villages.h | 10 +- Minecraft.World/VineTile.cpp | 6 +- Minecraft.World/VineTile.h | 4 +- Minecraft.World/VoronoiZoom.cpp | 2 +- Minecraft.World/VoronoiZoom.h | 2 +- Minecraft.World/WallTile.cpp | 4 +- Minecraft.World/WallTile.h | 2 +- Minecraft.World/WaterAnimal.cpp | 2 +- Minecraft.World/WaterAnimal.h | 2 +- Minecraft.World/WaterLevelChunk.cpp | 18 +- Minecraft.World/WaterLevelChunk.h | 16 +- Minecraft.World/WaterLilyTile.cpp | 2 +- Minecraft.World/WaterLilyTile.h | 2 +- Minecraft.World/WaterLilyTileItem.cpp | 4 +- Minecraft.World/WaterLilyTileItem.h | 4 +- Minecraft.World/WeaponItem.cpp | 18 +- Minecraft.World/WeaponItem.h | 16 +- Minecraft.World/WebTile.cpp | 2 +- Minecraft.World/WebTile.h | 2 +- Minecraft.World/WeighedTreasure.cpp | 16 +- Minecraft.World/WeighedTreasure.h | 8 +- Minecraft.World/Wolf.cpp | 148 ++--- Minecraft.World/Wolf.h | 12 +- Minecraft.World/WoodSlabTile.cpp | 4 +- Minecraft.World/WoodSlabTile.h | 8 +- Minecraft.World/WoolCarpetTile.cpp | 2 +- Minecraft.World/WoolCarpetTile.h | 2 +- Minecraft.World/WorkbenchTile.cpp | 2 +- Minecraft.World/WorkbenchTile.h | 2 +- Minecraft.World/XZPacket.h | 2 +- Minecraft.World/Zombie.cpp | 14 +- Minecraft.World/Zombie.h | 6 +- Minecraft.World/ZonedChunkStorage.cpp | 12 +- Minecraft.World/ZoomLayer.cpp | 8 +- Minecraft.World/ZoomLayer.h | 4 +- .../net.minecraft.world.ContainerListener.h | 4 +- ...t.minecraft.world.inventory.ContainerListener.h | 6 +- 1373 files changed, 12044 insertions(+), 12044 deletions(-) (limited to 'Minecraft.World/Connection.cpp') diff --git a/Minecraft.Client/AbstractContainerScreen.cpp b/Minecraft.Client/AbstractContainerScreen.cpp index d199f726..2b3e0837 100644 --- a/Minecraft.Client/AbstractContainerScreen.cpp +++ b/Minecraft.Client/AbstractContainerScreen.cpp @@ -52,7 +52,7 @@ void AbstractContainerScreen::render(int xm, int ym, float a) glEnable(GL_RESCALE_NORMAL); Slot *hoveredSlot = NULL; - + AUTO_VAR(itEnd, menu->slots->end()); for (AUTO_VAR(it, menu->slots->begin()); it != itEnd; it++) { @@ -75,7 +75,7 @@ void AbstractContainerScreen::render(int xm, int ym, float a) } } - std::shared_ptr inventory = minecraft->player->inventory; + shared_ptr inventory = minecraft->player->inventory; if (inventory->getCarried() != NULL) { glTranslatef(0, 0, 32); @@ -128,7 +128,7 @@ void AbstractContainerScreen::renderSlot(Slot *slot) #if 0 int x = slot->x; int y = slot->y; - std::shared_ptr item = slot->getItem(); + shared_ptr item = slot->getItem(); if (item == NULL) { @@ -218,7 +218,7 @@ void AbstractContainerScreen::removed() if (minecraft->player == NULL) return; } -void AbstractContainerScreen::slotsChanged(std::shared_ptr container) +void AbstractContainerScreen::slotsChanged(shared_ptr container) { } diff --git a/Minecraft.Client/AbstractContainerScreen.h b/Minecraft.Client/AbstractContainerScreen.h index dc78db27..2ba9cdcd 100644 --- a/Minecraft.Client/AbstractContainerScreen.h +++ b/Minecraft.Client/AbstractContainerScreen.h @@ -32,7 +32,7 @@ protected: virtual void keyPressed(wchar_t eventCharacter, int eventKey); public: virtual void removed(); - virtual void slotsChanged(std::shared_ptr container); + virtual void slotsChanged(shared_ptr container); virtual bool isPauseScreen(); virtual void tick(); }; \ No newline at end of file diff --git a/Minecraft.Client/ArrowRenderer.cpp b/Minecraft.Client/ArrowRenderer.cpp index b717552b..65c4ee71 100644 --- a/Minecraft.Client/ArrowRenderer.cpp +++ b/Minecraft.Client/ArrowRenderer.cpp @@ -3,11 +3,11 @@ #include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" #include "..\Minecraft.World\Mth.h" -void ArrowRenderer::render(std::shared_ptr _arrow, double x, double y, double z, float rot, float a) +void ArrowRenderer::render(shared_ptr _arrow, double x, double y, double z, float rot, float a) { - // 4J - original version used generics and thus had an input parameter of type Arrow rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Arrow rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr arrow = dynamic_pointer_cast(_arrow); + shared_ptr arrow = dynamic_pointer_cast(_arrow); bindTexture(TN_ITEM_ARROWS); // 4J - was L"/item/arrows.png" glPushMatrix(); diff --git a/Minecraft.Client/ArrowRenderer.h b/Minecraft.Client/ArrowRenderer.h index 3348fc33..2731f7c2 100644 --- a/Minecraft.Client/ArrowRenderer.h +++ b/Minecraft.Client/ArrowRenderer.h @@ -4,5 +4,5 @@ class ArrowRenderer : public EntityRenderer { public: - virtual void render(std::shared_ptr _arrow, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _arrow, double x, double y, double z, float rot, float a); }; diff --git a/Minecraft.Client/BlazeModel.cpp b/Minecraft.Client/BlazeModel.cpp index e1a7747b..5af894ac 100644 --- a/Minecraft.Client/BlazeModel.cpp +++ b/Minecraft.Client/BlazeModel.cpp @@ -7,7 +7,7 @@ BlazeModel::BlazeModel() : Model() { upperBodyParts = ModelPartArray(12); - for (unsigned int i = 0; i < upperBodyParts.length; i++) + for (unsigned int i = 0; i < upperBodyParts.length; i++) { upperBodyParts[i] = new ModelPart(this, 0, 16); upperBodyParts[i]->addBox(0, 0, 0, 2, 8, 2); @@ -18,34 +18,34 @@ BlazeModel::BlazeModel() : Model() // 4J added - compile now to avoid random performance hit first time cubes are rendered // 4J Stu - Not just performance, but alpha+depth tests don't work right unless we compile here - for (unsigned int i = 0; i < upperBodyParts.length; i++) + for (unsigned int i = 0; i < upperBodyParts.length; i++) { upperBodyParts[i]->compile(1.0f/16.0f); } head->compile(1.0f/16.0f); } -int BlazeModel::modelVersion() +int BlazeModel::modelVersion() { return 8; } -void BlazeModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void BlazeModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); head->render(scale,usecompiled); - for (unsigned int i = 0; i < upperBodyParts.length; i++) + for (unsigned int i = 0; i < upperBodyParts.length; i++) { upperBodyParts[i]->render(scale, usecompiled); } } -void BlazeModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void BlazeModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) { float angle = bob * PI * -.1f; - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { upperBodyParts[i]->y = -2 + Mth::cos((i * 2 + bob) * .25f); upperBodyParts[i]->x = Mth::cos(angle) * 9.0f; @@ -53,7 +53,7 @@ void BlazeModel::setupAnim(float time, float r, float bob, float yRot, float xRo angle += PI * 0.5f; } angle = .25f * PI + bob * PI * .03f; - for (int i = 4; i < 8; i++) + for (int i = 4; i < 8; i++) { upperBodyParts[i]->y = 2 + Mth::cos((i * 2 + bob) * .25f); upperBodyParts[i]->x = Mth::cos(angle) * 7.0f; @@ -62,7 +62,7 @@ void BlazeModel::setupAnim(float time, float r, float bob, float yRot, float xRo } angle = .15f * PI + bob * PI * -.05f; - for (int i = 8; i < 12; i++) + for (int i = 8; i < 12; i++) { upperBodyParts[i]->y = 11 + Mth::cos((i * 1.5f + bob) * .5f); upperBodyParts[i]->x = Mth::cos(angle) * 5.0f; diff --git a/Minecraft.Client/BlazeModel.h b/Minecraft.Client/BlazeModel.h index e710ebf6..27ee2060 100644 --- a/Minecraft.Client/BlazeModel.h +++ b/Minecraft.Client/BlazeModel.h @@ -1,7 +1,7 @@ #pragma once #include "Model.h" -class BlazeModel : public Model +class BlazeModel : public Model { private: @@ -11,6 +11,6 @@ private: public: BlazeModel(); int modelVersion(); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; diff --git a/Minecraft.Client/BlazeRenderer.cpp b/Minecraft.Client/BlazeRenderer.cpp index f3878c1d..7d5210dc 100644 --- a/Minecraft.Client/BlazeRenderer.cpp +++ b/Minecraft.Client/BlazeRenderer.cpp @@ -8,11 +8,11 @@ BlazeRenderer::BlazeRenderer() : MobRenderer(new BlazeModel(), 0.5f) this->modelVersion = ((BlazeModel *) model)->modelVersion(); } -void BlazeRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void BlazeRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { - // 4J - original version used generics and thus had an input parameter of type Blaze rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); int modelVersion = ((BlazeModel *) model)->modelVersion(); if (modelVersion != this->modelVersion) diff --git a/Minecraft.Client/BlazeRenderer.h b/Minecraft.Client/BlazeRenderer.h index 0ee973ca..fc575e9b 100644 --- a/Minecraft.Client/BlazeRenderer.h +++ b/Minecraft.Client/BlazeRenderer.h @@ -10,5 +10,5 @@ private: public: BlazeRenderer(); - virtual void render(std::shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/BoatModel.cpp b/Minecraft.Client/BoatModel.cpp index 096d243e..d0d465e5 100644 --- a/Minecraft.Client/BoatModel.cpp +++ b/Minecraft.Client/BoatModel.cpp @@ -16,19 +16,19 @@ BoatModel::BoatModel() : Model() cubes[0]->addBox((float)(-w / 2), (float)(-h / 2 + 2), -3, w, h - 4, 4, 0); cubes[0]->setPos(0, (float)(0 + yOff), 0); - + cubes[1]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); cubes[1]->setPos((float)(-w / 2 + 1), (float)(0 + yOff), 0); - + cubes[2]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); cubes[2]->setPos((float)(+w / 2 - 1), (float)(0 + yOff), 0); - + cubes[3]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); cubes[3]->setPos(0, (float)(0 + yOff), (float)(-h / 2 + 1)); - + cubes[4]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); cubes[4]->setPos(0, (float)(0 + yOff), (float)(+h / 2 - 1)); - + cubes[0]->xRot = PI / 2; cubes[1]->yRot = PI / 2 * 3; cubes[2]->yRot = PI / 2 * 1; @@ -42,7 +42,7 @@ BoatModel::BoatModel() : Model() cubes[4]->compile(1.0f/16.0f); } -void BoatModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void BoatModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { for (int i = 0; i < 5; i++) { diff --git a/Minecraft.Client/BoatModel.h b/Minecraft.Client/BoatModel.h index 192e140f..4298b643 100644 --- a/Minecraft.Client/BoatModel.h +++ b/Minecraft.Client/BoatModel.h @@ -7,5 +7,5 @@ class BoatModel : public Model public: ModelPart *cubes[5]; BoatModel(); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/BoatRenderer.cpp b/Minecraft.Client/BoatRenderer.cpp index 33ffc322..f1367ae4 100644 --- a/Minecraft.Client/BoatRenderer.cpp +++ b/Minecraft.Client/BoatRenderer.cpp @@ -10,11 +10,11 @@ BoatRenderer::BoatRenderer() : EntityRenderer() model = new BoatModel(); } -void BoatRenderer::render(std::shared_ptr _boat, double x, double y, double z, float rot, float a) +void BoatRenderer::render(shared_ptr _boat, double x, double y, double z, float rot, float a) { - // 4J - original version used generics and thus had an input parameter of type Boat rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr boat = dynamic_pointer_cast(_boat); + shared_ptr boat = dynamic_pointer_cast(_boat); glPushMatrix(); diff --git a/Minecraft.Client/BoatRenderer.h b/Minecraft.Client/BoatRenderer.h index c4bb0312..1cc9c1d9 100644 --- a/Minecraft.Client/BoatRenderer.h +++ b/Minecraft.Client/BoatRenderer.h @@ -9,5 +9,5 @@ protected: public: BoatRenderer(); - virtual void render(std::shared_ptr boat, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr boat, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/BookModel.cpp b/Minecraft.Client/BookModel.cpp index dec3d6ac..bc4769bd 100644 --- a/Minecraft.Client/BookModel.cpp +++ b/Minecraft.Client/BookModel.cpp @@ -3,7 +3,7 @@ #include "BookModel.h" #include "ModelPart.h" -BookModel::BookModel() +BookModel::BookModel() { leftLid = (new ModelPart(this))->texOffs(0, 0)->addBox(-6, -5, 0, 6, 10, 0); rightLid = (new ModelPart(this))->texOffs(16, 0)->addBox(0, -5, 0, 6, 10, 0); @@ -33,7 +33,7 @@ BookModel::BookModel() } -void BookModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void BookModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); diff --git a/Minecraft.Client/BookModel.h b/Minecraft.Client/BookModel.h index 3e6cee00..8b367a34 100644 --- a/Minecraft.Client/BookModel.h +++ b/Minecraft.Client/BookModel.h @@ -2,7 +2,7 @@ #pragma once #include "Model.h" -class BookModel : public Model +class BookModel : public Model { public: ModelPart *leftLid, *rightLid; @@ -11,6 +11,6 @@ public: ModelPart *seam; BookModel(); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; diff --git a/Minecraft.Client/Camera.cpp b/Minecraft.Client/Camera.cpp index 6c5a3649..db6072b2 100644 --- a/Minecraft.Client/Camera.cpp +++ b/Minecraft.Client/Camera.cpp @@ -21,7 +21,7 @@ float Camera::za = 0.0f; float Camera::xa2 = 0.0f; float Camera::za2 = 0.0f; -void Camera::prepare(std::shared_ptr player, bool mirror) +void Camera::prepare(shared_ptr player, bool mirror) { glGetFloat(GL_MODELVIEW_MATRIX, modelview); glGetFloat(GL_PROJECTION_MATRIX, projection); @@ -88,12 +88,12 @@ void Camera::prepare(std::shared_ptr player, bool mirror) ya = cosf(xRot * PI / 180.0f); } -TilePos *Camera::getCameraTilePos(std::shared_ptr player, double alpha) +TilePos *Camera::getCameraTilePos(shared_ptr player, double alpha) { return new TilePos(getCameraPos(player, alpha)); } -Vec3 *Camera::getCameraPos(std::shared_ptr player, double alpha) +Vec3 *Camera::getCameraPos(shared_ptr player, double alpha) { double xx = player->xo + (player->x - player->xo) * alpha; double yy = player->yo + (player->y - player->yo) * alpha + player->getHeadHeight(); @@ -106,7 +106,7 @@ Vec3 *Camera::getCameraPos(std::shared_ptr player, double alpha) return Vec3::newTemp(xt, yt, zt); } -int Camera::getBlockAt(Level *level, std::shared_ptr player, float alpha) +int Camera::getBlockAt(Level *level, shared_ptr player, float alpha) { Vec3 *p = Camera::getCameraPos(player, alpha); TilePos tp = TilePos(p); diff --git a/Minecraft.Client/Camera.h b/Minecraft.Client/Camera.h index 7e00540d..cccb0b2d 100644 --- a/Minecraft.Client/Camera.h +++ b/Minecraft.Client/Camera.h @@ -24,9 +24,9 @@ private: public: static float xa, ya, za, xa2, za2; - static void prepare(std::shared_ptr player, bool mirror); + static void prepare(shared_ptr player, bool mirror); - static TilePos *getCameraTilePos(std::shared_ptr player, double alpha); - static Vec3 *getCameraPos(std::shared_ptr player, double alpha); - static int getBlockAt(Level *level, std::shared_ptr player, float alpha); + static TilePos *getCameraTilePos(shared_ptr player, double alpha); + static Vec3 *getCameraPos(shared_ptr player, double alpha); + static int getBlockAt(Level *level, shared_ptr player, float alpha); }; \ No newline at end of file diff --git a/Minecraft.Client/ChestRenderer.cpp b/Minecraft.Client/ChestRenderer.cpp index d895d782..d1b5cf91 100644 --- a/Minecraft.Client/ChestRenderer.cpp +++ b/Minecraft.Client/ChestRenderer.cpp @@ -18,10 +18,10 @@ ChestRenderer::~ChestRenderer() delete largeChestModel; } -void ChestRenderer::render(std::shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +void ChestRenderer::render(shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J Convert as we aren't using a templated class - std::shared_ptr chest = dynamic_pointer_cast(_chest); + shared_ptr chest = dynamic_pointer_cast(_chest); int data; diff --git a/Minecraft.Client/ChestRenderer.h b/Minecraft.Client/ChestRenderer.h index c52598e4..06c6bfff 100644 --- a/Minecraft.Client/ChestRenderer.h +++ b/Minecraft.Client/ChestRenderer.h @@ -11,8 +11,8 @@ private: ChestModel *largeChestModel; public: - ChestRenderer(); + ChestRenderer(); ~ChestRenderer(); - void render(std::shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param + void render(shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param }; diff --git a/Minecraft.Client/ChickenModel.cpp b/Minecraft.Client/ChickenModel.cpp index 2a88fac6..21dc2059 100644 --- a/Minecraft.Client/ChickenModel.cpp +++ b/Minecraft.Client/ChickenModel.cpp @@ -49,10 +49,10 @@ ChickenModel::ChickenModel() : Model() wing1->compile(1.0f/16.0f); } -void ChickenModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void ChickenModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); - if (young) + if (young) { float ss = 2; glPushMatrix(); @@ -70,8 +70,8 @@ void ChickenModel::render(std::shared_ptr entity, float time, float r, f wing0->render(scale,usecompiled); wing1->render(scale,usecompiled); glPopMatrix(); - } - else + } + else { head->render(scale,usecompiled); beak->render(scale,usecompiled); @@ -88,13 +88,13 @@ void ChickenModel::setupAnim(float time, float r, float bob, float yRot, float x { head->xRot = xRot / (float) (180 / PI); head->yRot = yRot / (float) (180 / PI); - + beak->xRot = head->xRot; beak->yRot = head->yRot; - + redThing->xRot = head->xRot; redThing->yRot = head->yRot; - + body->xRot = 90 / (float) (180 / PI); leg0->xRot = (Mth::cos(time * 0.6662f) * 1.4f) * r; diff --git a/Minecraft.Client/ChickenModel.h b/Minecraft.Client/ChickenModel.h index 81d83d99..9ee0858e 100644 --- a/Minecraft.Client/ChickenModel.h +++ b/Minecraft.Client/ChickenModel.h @@ -6,6 +6,6 @@ public: ModelPart *head, *hair, *body, *leg0, *leg1, *wing0,* wing1, *beak, *redThing; ChickenModel(); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; diff --git a/Minecraft.Client/ChickenRenderer.cpp b/Minecraft.Client/ChickenRenderer.cpp index 2e84a450..908ba506 100644 --- a/Minecraft.Client/ChickenRenderer.cpp +++ b/Minecraft.Client/ChickenRenderer.cpp @@ -7,18 +7,18 @@ ChickenRenderer::ChickenRenderer(Model *model, float shadow) : MobRenderer(model { } -void ChickenRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void ChickenRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { MobRenderer::render(_mob, x, y, z, rot, a); } -float ChickenRenderer::getBob(std::shared_ptr _mob, float a) +float ChickenRenderer::getBob(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); float flap = mob->oFlap+(mob->flap-mob->oFlap)*a; float flapSpeed = mob->oFlapSpeed+(mob->flapSpeed-mob->oFlapSpeed)*a; - + return (Mth::sin(flap)+1)*flapSpeed; } \ No newline at end of file diff --git a/Minecraft.Client/ChickenRenderer.h b/Minecraft.Client/ChickenRenderer.h index 2c33176d..b81c9133 100644 --- a/Minecraft.Client/ChickenRenderer.h +++ b/Minecraft.Client/ChickenRenderer.h @@ -5,7 +5,7 @@ class ChickenRenderer : public MobRenderer { public: ChickenRenderer(Model *model, float shadow); - virtual void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - virtual float getBob(std::shared_ptr _mob, float a); + virtual float getBob(shared_ptr _mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/Chunk.cpp b/Minecraft.Client/Chunk.cpp index fcc540ad..99933db3 100644 --- a/Minecraft.Client/Chunk.cpp +++ b/Minecraft.Client/Chunk.cpp @@ -103,7 +103,7 @@ void Chunk::setPos(int x, int y, int z) { bb = AABB::newPermanent(-g, -g, -g, XZSIZE+g, SIZE+g, XZSIZE+g); } - else + else { // 4J MGH - bounds are relative to the position now, so the AABB will be setup already, either above, or from the tesselator bounds. // bb->set(-g, -g, -g, SIZE+g, SIZE+g, SIZE+g); @@ -141,7 +141,7 @@ void Chunk::setPos(int x, int y, int z) LeaveCriticalSection(&levelRenderer->m_csDirtyChunks); - + } void Chunk::translateToPos() @@ -173,7 +173,7 @@ void Chunk::makeCopyForRebuild(Chunk *source) this->clipChunk = NULL; this->id = source->id; this->globalRenderableTileEntities = source->globalRenderableTileEntities; - this->globalRenderableTileEntities_cs = source->globalRenderableTileEntities_cs; + this->globalRenderableTileEntities_cs = source->globalRenderableTileEntities_cs; } void Chunk::rebuild() @@ -186,7 +186,7 @@ void Chunk::rebuild() // if (!dirty) return; PIXBeginNamedEvent(0,"Rebuild section A"); - + #ifdef _LARGE_WORLDS Tesselator *t = Tesselator::getInstance(); #else @@ -204,10 +204,10 @@ void Chunk::rebuild() LevelChunk::touchedSky = false; -// unordered_set > oldTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); // 4J removed this & next line +// unordered_set > oldTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); // 4J removed this & next line // renderableTileEntities.clear(); - vector > renderableTileEntities; // 4J - added + vector > renderableTileEntities; // 4J - added int r = 1; @@ -223,7 +223,7 @@ void Chunk::rebuild() // Get the data for the level chunk that this render chunk is it (level chunk is 16 x 16 x 128, // render chunk is 16 x 16 x 16. We wouldn't have to actually get all of it if the data was ordered differently, but currently // it is ordered by x then z then y so just getting a small range of y out of it would involve getting the whole thing into - // the cache anyway. + // the cache anyway. #ifdef _LARGE_WORLDS unsigned char *tileIds = GetTileIdsStorage(); @@ -237,9 +237,9 @@ void Chunk::rebuild() TileRenderer *tileRenderer = new TileRenderer(region, this->x, this->y, this->z, tileIds); // AP - added a caching system for Chunk::rebuild to take advantage of - // Basically we're storing of copy of the tileIDs array inside the region so that calls to Region::getTile can grab data - // more quickly from this array rather than calling CompressedTileStorage. On the Vita the total thread time spent in - // Region::getTile went from 20% to 4%. + // Basically we're storing of copy of the tileIDs array inside the region so that calls to Region::getTile can grab data + // more quickly from this array rather than calling CompressedTileStorage. On the Vita the total thread time spent in + // Region::getTile went from 20% to 4%. #ifdef __PSVITA__ int xc = x >> 4; int zc = z >> 4; @@ -275,7 +275,7 @@ void Chunk::rebuild() if( yy == (Level::maxBuildHeight - 1) ) continue; if(( xx == 0 ) || ( xx == 15 )) continue; if(( zz == 0 ) || ( zz == 15 )) continue; - + // Establish whether this tile and its neighbours are all made of rock, dirt, unbreakable tiles, or have already // been determined to meet this criteria themselves and have a tile of 255 set. if( !( ( tileId == Tile::rock_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; @@ -337,7 +337,7 @@ void Chunk::rebuild() PIXBeginNamedEvent(0,"Rebuild section C"); Tesselator::Bounds bounds; // 4J MGH - added { - // this was the old default clip bounds for the chunk, set in Chunk::setPos. + // this was the old default clip bounds for the chunk, set in Chunk::setPos. float g = 6.0f; bounds.boundingBox[0] = -g; bounds.boundingBox[1] = -g; @@ -398,11 +398,11 @@ void Chunk::rebuild() t->begin(); t->offset((float)(-this->x), (float)(-this->y), (float)(-this->z)); } - + Tile *tile = Tile::tiles[tileId]; if (currentLayer == 0 && tile->isEntityTile()) { - std::shared_ptr et = region->getTileEntity(x, y, z); + shared_ptr et = region->getTileEntity(x, y, z); if (TileEntityRenderDispatcher::instance->hasRenderer(et)) { renderableTileEntities.push_back(et); @@ -465,7 +465,7 @@ void Chunk::rebuild() { levelRenderer->setGlobalChunkFlag(this->x, this->y, this->z, level, LevelRenderer::CHUNK_FLAG_EMPTY1); RenderManager.CBuffClear(lists + 1); - break; + break; } } @@ -552,12 +552,12 @@ void Chunk::rebuild() oldTileEntities.removeAll(renderableTileEntities); globalRenderableTileEntities.removeAll(oldTileEntities); */ + - - unordered_set > newTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); - + unordered_set > newTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); + AUTO_VAR(endIt, oldTileEntities.end()); - for( unordered_set >::iterator it = oldTileEntities.begin(); it != endIt; it++ ) + for( unordered_set >::iterator it = oldTileEntities.begin(); it != endIt; it++ ) { newTileEntities.erase(*it); } @@ -566,7 +566,7 @@ void Chunk::rebuild() EnterCriticalSection(globalRenderableTileEntities_cs); endIt = newTileEntities.end(); - for( unordered_set >::iterator it = newTileEntities.begin(); it != endIt; it++ ) + for( unordered_set >::iterator it = newTileEntities.begin(); it != endIt; it++ ) { globalRenderableTileEntities->push_back(*it); } @@ -574,12 +574,12 @@ void Chunk::rebuild() // 4J - All these new things added to globalRenderableTileEntities AUTO_VAR(endItRTE, renderableTileEntities.end()); - for( vector >::iterator it = renderableTileEntities.begin(); it != endItRTE; it++ ) + for( vector >::iterator it = renderableTileEntities.begin(); it != endItRTE; it++ ) { oldTileEntities.erase(*it); } // 4J - oldTileEntities is now the removed items - vector >::iterator it = globalRenderableTileEntities->begin(); + vector >::iterator it = globalRenderableTileEntities->begin(); while( it != globalRenderableTileEntities->end() ) { if( oldTileEntities.find(*it) != oldTileEntities.end() ) @@ -656,10 +656,10 @@ void Chunk::rebuild_SPU() LevelChunk::touchedSky = false; -// unordered_set > oldTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); // 4J removed this & next line +// unordered_set > oldTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); // 4J removed this & next line // renderableTileEntities.clear(); - vector > renderableTileEntities; // 4J - added + vector > renderableTileEntities; // 4J - added // List newTileEntities = new ArrayList(); // newTileEntities.clear(); @@ -679,13 +679,13 @@ void Chunk::rebuild_SPU() // Get the data for the level chunk that this render chunk is it (level chunk is 16 x 16 x 128, // render chunk is 16 x 16 x 16. We wouldn't have to actually get all of it if the data was ordered differently, but currently // it is ordered by x then z then y so just getting a small range of y out of it would involve getting the whole thing into - // the cache anyway. + // the cache anyway. ChunkRebuildData* pOutData = NULL; g_rebuildDataIn.buildForChunk(®ion, level, x0, y0, z0); Tesselator::Bounds bounds; { - // this was the old default clip bounds for the chunk, set in Chunk::setPos. + // this was the old default clip bounds for the chunk, set in Chunk::setPos. float g = 6.0f; bounds.boundingBox[0] = -g; bounds.boundingBox[1] = -g; @@ -750,7 +750,7 @@ void Chunk::rebuild_SPU() { if (currentLayer == 0 && Tile::tiles[tileId]->isEntityTile()) { - std::shared_ptr et = region.getTileEntity(x, y, z); + shared_ptr et = region.getTileEntity(x, y, z); if (TileEntityRenderDispatcher::instance->hasRenderer(et)) { renderableTileEntities.push_back(et); @@ -881,12 +881,12 @@ void Chunk::rebuild_SPU() oldTileEntities.removeAll(renderableTileEntities); globalRenderableTileEntities.removeAll(oldTileEntities); */ + - - unordered_set > newTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); - + unordered_set > newTileEntities(renderableTileEntities.begin(),renderableTileEntities.end()); + AUTO_VAR(endIt, oldTileEntities.end()); - for( unordered_set >::iterator it = oldTileEntities.begin(); it != endIt; it++ ) + for( unordered_set >::iterator it = oldTileEntities.begin(); it != endIt; it++ ) { newTileEntities.erase(*it); } @@ -895,7 +895,7 @@ void Chunk::rebuild_SPU() EnterCriticalSection(globalRenderableTileEntities_cs); endIt = newTileEntities.end(); - for( unordered_set >::iterator it = newTileEntities.begin(); it != endIt; it++ ) + for( unordered_set >::iterator it = newTileEntities.begin(); it != endIt; it++ ) { globalRenderableTileEntities.push_back(*it); } @@ -903,12 +903,12 @@ void Chunk::rebuild_SPU() // 4J - All these new things added to globalRenderableTileEntities AUTO_VAR(endItRTE, renderableTileEntities.end()); - for( vector >::iterator it = renderableTileEntities.begin(); it != endItRTE; it++ ) + for( vector >::iterator it = renderableTileEntities.begin(); it != endItRTE; it++ ) { oldTileEntities.erase(*it); } // 4J - oldTileEntities is now the removed items - vector >::iterator it = globalRenderableTileEntities->begin(); + vector >::iterator it = globalRenderableTileEntities->begin(); while( it != globalRenderableTileEntities->end() ) { if( oldTileEntities.find(*it) != oldTileEntities.end() ) @@ -941,7 +941,7 @@ void Chunk::rebuild_SPU() #endif // _PS3_ -float Chunk::distanceToSqr(std::shared_ptr player) const +float Chunk::distanceToSqr(shared_ptr player) const { float xd = (float) (player->x - xm); float yd = (float) (player->y - ym); @@ -949,7 +949,7 @@ float Chunk::distanceToSqr(std::shared_ptr player) const return xd * xd + yd * yd + zd * zd; } -float Chunk::squishedDistanceToSqr(std::shared_ptr player) +float Chunk::squishedDistanceToSqr(shared_ptr player) { float xd = (float) (player->x - xm); float yd = (float) (player->y - ym) * 2; diff --git a/Minecraft.Client/Chunk.h b/Minecraft.Client/Chunk.h index 276372db..f7947156 100644 --- a/Minecraft.Client/Chunk.h +++ b/Minecraft.Client/Chunk.h @@ -38,22 +38,22 @@ public: static void ReleaseThreadStorage(); static unsigned char *GetTileIdsStorage(); #endif - + public: static int updates; int x, y, z; int xRender, yRender, zRender; int xRenderOffs, yRenderOffs, zRenderOffs; - + int xm, ym, zm; AABB *bb; ClipChunk *clipChunk; int id; //public: -// vector > renderableTileEntities; // 4J - removed - +// vector > renderableTileEntities; // 4J - removed + private: LevelRenderer::rteMap *globalRenderableTileEntities; CRITICAL_SECTION *globalRenderableTileEntities_cs; @@ -71,8 +71,8 @@ public: #ifdef __PS3__ void rebuild_SPU(); #endif // __PS3__ - float distanceToSqr(std::shared_ptr player) const; - float squishedDistanceToSqr(std::shared_ptr player); + float distanceToSqr(shared_ptr player) const; + float squishedDistanceToSqr(shared_ptr player); void reset(); void _delete(); diff --git a/Minecraft.Client/ClientConnection.cpp b/Minecraft.Client/ClientConnection.cpp index f2fbf3fc..5ba3cb85 100644 --- a/Minecraft.Client/ClientConnection.cpp +++ b/Minecraft.Client/ClientConnection.cpp @@ -150,16 +150,16 @@ INetworkPlayer *ClientConnection::getNetworkPlayer() else return NULL; } -void ClientConnection::handleLogin(std::shared_ptr packet) +void ClientConnection::handleLogin(shared_ptr packet) { if (done) return; PlayerUID OnlineXuid; ProfileManager.GetXUID(m_userIndex,&OnlineXuid,true); // online xuid MOJANG_DATA *pMojangData = NULL; - + if(!g_NetworkManager.IsLocalGame()) - { + { pMojangData=app.GetMojangDataForXuid(OnlineXuid); } @@ -211,7 +211,7 @@ void ClientConnection::handleLogin(std::shared_ptr packet) // check the file is not already in bRes=app.IsFileInMemoryTextures(wstr); if(!bRes) - { + { #ifdef _XBOX C4JStorage::ETMSStatus eTMSStatus; eTMSStatus=StorageManager.ReadTMSFile(iUserID,C4JStorage::eGlobalStorage_Title,C4JStorage::eTMS_FileType_Graphic,pMojangData->wchSkin,&pBuffer, &dwSize); @@ -223,17 +223,17 @@ void ClientConnection::handleLogin(std::shared_ptr packet) if(bRes) { app.AddMemoryTextureFile(wstr,pBuffer,dwSize); - } + } } // a cloak? if(pMojangData->wchCape[0]!=0L) - { + { wstring wstr=pMojangData->wchCape; // check the file is not already in bRes=app.IsFileInMemoryTextures(wstr); if(!bRes) - { + { #ifdef _XBOX C4JStorage::ETMSStatus eTMSStatus; eTMSStatus=StorageManager.ReadTMSFile(iUserID,C4JStorage::eGlobalStorage_Title,C4JStorage::eTMS_FileType_Graphic,pMojangData->wchCape,&pBuffer, &dwSize); @@ -291,7 +291,7 @@ void ClientConnection::handleLogin(std::shared_ptr packet) app.DebugPrintf("ClientConnection - DIFFICULTY --- %d\n",packet->difficulty); level->difficulty = packet->difficulty; // 4J Added level->isClientSide = true; - minecraft->setLevel(level); + minecraft->setLevel(level); } minecraft->player->setPlayerIndex( packet->m_playerIndex ); @@ -328,7 +328,7 @@ void ClientConnection::handleLogin(std::shared_ptr packet) // 4J-PB - this isn't the level we want //level = (MultiPlayerLevel *)minecraft->level; level = (MultiPlayerLevel *)minecraft->getLevel( packet->dimension ); - std::shared_ptr player; + shared_ptr player; if(level==NULL) { @@ -351,11 +351,11 @@ void ClientConnection::handleLogin(std::shared_ptr packet) // 4J Stu - At time of writing ProfileManager.GetGamertag() does not always return the correct name, // if sign-ins are turned off while the player signed in. Using the qnetPlayer instead. // need to have a level before create extra local player - MultiPlayerLevel *levelpassedin=(MultiPlayerLevel *)level; + MultiPlayerLevel *levelpassedin=(MultiPlayerLevel *)level; player = minecraft->createExtraLocalPlayer(m_userIndex, networkPlayer->GetOnlineName(), m_userIndex, packet->dimension, this,levelpassedin); // need to have a player before the setlevel - std::shared_ptr lastPlayer = minecraft->player; + shared_ptr lastPlayer = minecraft->player; minecraft->player = minecraft->localplayers[m_userIndex]; minecraft->setLevel(level); minecraft->player = lastPlayer; @@ -373,7 +373,7 @@ void ClientConnection::handleLogin(std::shared_ptr packet) player->setPlayerIndex( packet->m_playerIndex ); player->setCustomSkin( app.GetPlayerSkinId(m_userIndex) ); player->setCustomCape( app.GetPlayerCapeId(m_userIndex) ); - + BYTE networkSmallId = getSocket()->getSmallId(); app.UpdatePlayerInfo(networkSmallId, packet->m_playerIndex, packet->m_uiGamePrivileges); @@ -385,50 +385,50 @@ void ClientConnection::handleLogin(std::shared_ptr packet) displayPrivilegeChanges(minecraft->localplayers[m_userIndex],startingPrivileges); } - + maxPlayers = packet->maxPlayers; - + // need to have a player before the setLocalCreativeMode - std::shared_ptr lastPlayer = minecraft->player; + shared_ptr lastPlayer = minecraft->player; minecraft->player = minecraft->localplayers[m_userIndex]; ((MultiPlayerGameMode *)minecraft->localgameModes[m_userIndex])->setLocalMode(GameType::byId(packet->gameType)); minecraft->player = lastPlayer; - + // make sure the UI offsets for this player are set correctly if(iUserID!=-1) { ui.UpdateSelectedItemPos(iUserID); } - + TelemetryManager->RecordLevelStart(m_userIndex, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, Minecraft::GetInstance()->getLevel(packet->dimension)->difficulty, app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount()); } -void ClientConnection::handleAddEntity(std::shared_ptr packet) +void ClientConnection::handleAddEntity(shared_ptr packet) { double x = packet->x / 32.0; double y = packet->y / 32.0; double z = packet->z / 32.0; - std::shared_ptr e; + shared_ptr e; boolean setRot = true; // 4J-PB - replacing this massive if nest with switch switch(packet->type) { case AddEntityPacket::MINECART_RIDEABLE: - e = std::shared_ptr( new Minecart(level, x, y, z, Minecart::RIDEABLE) ); + e = shared_ptr( new Minecart(level, x, y, z, Minecart::RIDEABLE) ); break; case AddEntityPacket::MINECART_CHEST: - e = std::shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); + e = shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); break; case AddEntityPacket::MINECART_FURNACE: - e = std::shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); + e = shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); break; case AddEntityPacket::FISH_HOOK: { // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing - std::shared_ptr owner = getEntity(packet->data); + shared_ptr owner = getEntity(packet->data); // 4J - check all local players to find match if( owner == NULL ) @@ -446,10 +446,10 @@ void ClientConnection::handleAddEntity(std::shared_ptr packet) } } } - std::shared_ptr player = dynamic_pointer_cast(owner); + shared_ptr player = dynamic_pointer_cast(owner); if (player != NULL) { - std::shared_ptr hook = std::shared_ptr( new FishingHook(level, x, y, z, player) ); + shared_ptr hook = shared_ptr( new FishingHook(level, x, y, z, player) ); e = hook; // 4J Stu - Move the player->fishing out of the ctor as we cannot reference 'this' player->fishing = hook; @@ -458,10 +458,10 @@ void ClientConnection::handleAddEntity(std::shared_ptr packet) } break; case AddEntityPacket::ARROW: - e = std::shared_ptr( new Arrow(level, x, y, z) ); + e = shared_ptr( new Arrow(level, x, y, z) ); break; case AddEntityPacket::SNOWBALL: - e = std::shared_ptr( new Snowball(level, x, y, z) ); + e = shared_ptr( new Snowball(level, x, y, z) ); break; case AddEntityPacket::ITEM_FRAME: { @@ -470,66 +470,66 @@ void ClientConnection::handleAddEntity(std::shared_ptr packet) int iz = (int) z; app.DebugPrintf("ClientConnection ITEM_FRAME xyz %d,%d,%d\n",ix,iy,iz); } - e = std::shared_ptr(new ItemFrame(level, (int) x, (int) y, (int) z, packet->data)); + e = shared_ptr(new ItemFrame(level, (int) x, (int) y, (int) z, packet->data)); packet->data = 0; setRot = false; break; case AddEntityPacket::THROWN_ENDERPEARL: - e = std::shared_ptr( new ThrownEnderpearl(level, x, y, z) ); + e = shared_ptr( new ThrownEnderpearl(level, x, y, z) ); break; case AddEntityPacket::EYEOFENDERSIGNAL: - e = std::shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); + e = shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); break; case AddEntityPacket::FIREBALL: - e = std::shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + e = shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; break; case AddEntityPacket::SMALL_FIREBALL: - e = std::shared_ptr( new SmallFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + e = shared_ptr( new SmallFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; break; case AddEntityPacket::DRAGON_FIRE_BALL: - e = std::shared_ptr( new DragonFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + e = shared_ptr( new DragonFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; break; case AddEntityPacket::EGG: - e = std::shared_ptr( new ThrownEgg(level, x, y, z) ); + e = shared_ptr( new ThrownEgg(level, x, y, z) ); break; case AddEntityPacket::THROWN_POTION: - e = std::shared_ptr( new ThrownPotion(level, x, y, z, packet->data) ); + e = shared_ptr( new ThrownPotion(level, x, y, z, packet->data) ); packet->data = 0; break; case AddEntityPacket::THROWN_EXPBOTTLE: - e = std::shared_ptr( new ThrownExpBottle(level, x, y, z) ); + e = shared_ptr( new ThrownExpBottle(level, x, y, z) ); packet->data = 0; break; case AddEntityPacket::BOAT: - e = std::shared_ptr( new Boat(level, x, y, z) ); + e = shared_ptr( new Boat(level, x, y, z) ); break; case AddEntityPacket::PRIMED_TNT: - e = std::shared_ptr( new PrimedTnt(level, x, y, z) ); + e = shared_ptr( new PrimedTnt(level, x, y, z) ); break; case AddEntityPacket::ENDER_CRYSTAL: - e = std::shared_ptr( new EnderCrystal(level, x, y, z) ); + e = shared_ptr( new EnderCrystal(level, x, y, z) ); break; case AddEntityPacket::ITEM: - e = std::shared_ptr( new ItemEntity(level, x, y, z) ); + e = shared_ptr( new ItemEntity(level, x, y, z) ); break; case AddEntityPacket::FALLING: - e = std::shared_ptr( new FallingTile(level, x, y, z, packet->data & 0xFFFF, packet->data >> 16) ); + e = shared_ptr( new FallingTile(level, x, y, z, packet->data & 0xFFFF, packet->data >> 16) ); packet->data = 0; break; } - /* if (packet->type == AddEntityPacket::MINECART_RIDEABLE) e = std::shared_ptr( new Minecart(level, x, y, z, Minecart::RIDEABLE) ); - if (packet->type == AddEntityPacket::MINECART_CHEST) e = std::shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); - if (packet->type == AddEntityPacket::MINECART_FURNACE) e = std::shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); + /* if (packet->type == AddEntityPacket::MINECART_RIDEABLE) e = shared_ptr( new Minecart(level, x, y, z, Minecart::RIDEABLE) ); + if (packet->type == AddEntityPacket::MINECART_CHEST) e = shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); + if (packet->type == AddEntityPacket::MINECART_FURNACE) e = shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); if (packet->type == AddEntityPacket::FISH_HOOK) { // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing - std::shared_ptr owner = getEntity(packet->data); + shared_ptr owner = getEntity(packet->data); // 4J - check all local players to find match if( owner == NULL ) @@ -547,48 +547,48 @@ void ClientConnection::handleAddEntity(std::shared_ptr packet) } } } - std::shared_ptr player = dynamic_pointer_cast(owner); + shared_ptr player = dynamic_pointer_cast(owner); if (player != NULL) { - std::shared_ptr hook = std::shared_ptr( new FishingHook(level, x, y, z, player) ); + shared_ptr hook = shared_ptr( new FishingHook(level, x, y, z, player) ); e = hook; // 4J Stu - Move the player->fishing out of the ctor as we cannot reference 'this' player->fishing = hook; } packet->data = 0; } - - if (packet->type == AddEntityPacket::ARROW) e = std::shared_ptr( new Arrow(level, x, y, z) ); - if (packet->type == AddEntityPacket::SNOWBALL) e = std::shared_ptr( new Snowball(level, x, y, z) ); - if (packet->type == AddEntityPacket::THROWN_ENDERPEARL) e = std::shared_ptr( new ThrownEnderpearl(level, x, y, z) ); - if (packet->type == AddEntityPacket::EYEOFENDERSIGNAL) e = std::shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); + + if (packet->type == AddEntityPacket::ARROW) e = shared_ptr( new Arrow(level, x, y, z) ); + if (packet->type == AddEntityPacket::SNOWBALL) e = shared_ptr( new Snowball(level, x, y, z) ); + if (packet->type == AddEntityPacket::THROWN_ENDERPEARL) e = shared_ptr( new ThrownEnderpearl(level, x, y, z) ); + if (packet->type == AddEntityPacket::EYEOFENDERSIGNAL) e = shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); if (packet->type == AddEntityPacket::FIREBALL) { - e = std::shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + e = shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; } if (packet->type == AddEntityPacket::SMALL_FIREBALL) { - e = std::shared_ptr( new SmallFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + e = shared_ptr( new SmallFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; } - if (packet->type == AddEntityPacket::EGG) e = std::shared_ptr( new ThrownEgg(level, x, y, z) ); + if (packet->type == AddEntityPacket::EGG) e = shared_ptr( new ThrownEgg(level, x, y, z) ); if (packet->type == AddEntityPacket::THROWN_POTION) { - e = std::shared_ptr( new ThrownPotion(level, x, y, z, packet->data) ); + e = shared_ptr( new ThrownPotion(level, x, y, z, packet->data) ); packet->data = 0; } if (packet->type == AddEntityPacket::THROWN_EXPBOTTLE) { - e = std::shared_ptr( new ThrownExpBottle(level, x, y, z) ); + e = shared_ptr( new ThrownExpBottle(level, x, y, z) ); packet->data = 0; } - if (packet->type == AddEntityPacket::BOAT) e = std::shared_ptr( new Boat(level, x, y, z) ); - if (packet->type == AddEntityPacket::PRIMED_TNT) e = std::shared_ptr( new PrimedTnt(level, x, y, z) ); - if (packet->type == AddEntityPacket::ENDER_CRYSTAL) e = std::shared_ptr( new EnderCrystal(level, x, y, z) ); - if (packet->type == AddEntityPacket::FALLING_SAND) e = std::shared_ptr( new FallingTile(level, x, y, z, Tile::sand->id) ); - if (packet->type == AddEntityPacket::FALLING_GRAVEL) e = std::shared_ptr( new FallingTile(level, x, y, z, Tile::gravel->id) ); - if (packet->type == AddEntityPacket::FALLING_EGG) e = std::shared_ptr( new FallingTile(level, x, y, z, Tile::dragonEgg_Id) ); + if (packet->type == AddEntityPacket::BOAT) e = shared_ptr( new Boat(level, x, y, z) ); + if (packet->type == AddEntityPacket::PRIMED_TNT) e = shared_ptr( new PrimedTnt(level, x, y, z) ); + if (packet->type == AddEntityPacket::ENDER_CRYSTAL) e = shared_ptr( new EnderCrystal(level, x, y, z) ); + if (packet->type == AddEntityPacket::FALLING_SAND) e = shared_ptr( new FallingTile(level, x, y, z, Tile::sand->id) ); + if (packet->type == AddEntityPacket::FALLING_GRAVEL) e = shared_ptr( new FallingTile(level, x, y, z, Tile::gravel->id) ); + if (packet->type == AddEntityPacket::FALLING_EGG) e = shared_ptr( new FallingTile(level, x, y, z, Tile::dragonEgg_Id) ); */ @@ -603,13 +603,13 @@ void ClientConnection::handleAddEntity(std::shared_ptr packet) e->yRotp = packet->yRot; e->xRotp = packet->xRot; - if (setRot) + if (setRot) { e->yRot = 0.0f; e->xRot = 0.0f; } - vector > *subEntities = e->getSubEntities(); + vector > *subEntities = e->getSubEntities(); if (subEntities != NULL) { int offs = packet->id - e->entityId; @@ -635,7 +635,7 @@ void ClientConnection::handleAddEntity(std::shared_ptr packet) if (packet->type == AddEntityPacket::ARROW) { - std::shared_ptr owner = getEntity(packet->data); + shared_ptr owner = getEntity(packet->data); // 4J - check all local players to find match if( owner == NULL ) @@ -659,15 +659,15 @@ void ClientConnection::handleAddEntity(std::shared_ptr packet) } } - e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); + e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); } } } -void ClientConnection::handleAddExperienceOrb(std::shared_ptr packet) +void ClientConnection::handleAddExperienceOrb(shared_ptr packet) { - std::shared_ptr e = std::shared_ptr( new ExperienceOrb(level, packet->x / 32.0, packet->y / 32.0, packet->z / 32.0, packet->value) ); + shared_ptr e = shared_ptr( new ExperienceOrb(level, packet->x / 32.0, packet->y / 32.0, packet->z / 32.0, packet->value) ); e->xp = packet->x; e->yp = packet->y; e->zp = packet->z; @@ -677,13 +677,13 @@ void ClientConnection::handleAddExperienceOrb(std::shared_ptrputEntity(packet->id, e); } -void ClientConnection::handleAddGlobalEntity(std::shared_ptr packet) +void ClientConnection::handleAddGlobalEntity(shared_ptr packet) { double x = packet->x / 32.0; double y = packet->y / 32.0; double z = packet->z / 32.0; - std::shared_ptr e;// = nullptr; - if (packet->type == AddGlobalEntityPacket::LIGHTNING) e = std::shared_ptr( new LightningBolt(level, x, y, z) ); + shared_ptr e;// = nullptr; + if (packet->type == AddGlobalEntityPacket::LIGHTNING) e = shared_ptr( new LightningBolt(level, x, y, z) ); if (e != NULL) { e->xp = packet->x; @@ -696,29 +696,29 @@ void ClientConnection::handleAddGlobalEntity(std::shared_ptr packet) +void ClientConnection::handleAddPainting(shared_ptr packet) { - std::shared_ptr painting = std::shared_ptr( new Painting(level, packet->x, packet->y, packet->z, packet->dir, packet->motive) ); + shared_ptr painting = shared_ptr( new Painting(level, packet->x, packet->y, packet->z, packet->dir, packet->motive) ); level->putEntity(packet->id, painting); } -void ClientConnection::handleSetEntityMotion(std::shared_ptr packet) +void ClientConnection::handleSetEntityMotion(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); } -void ClientConnection::handleSetEntityData(std::shared_ptr packet) +void ClientConnection::handleSetEntityData(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e != NULL && packet->getUnpackedData() != NULL) { e->getEntityData()->assignValues(packet->getUnpackedData()); } } -void ClientConnection::handleAddPlayer(std::shared_ptr packet) +void ClientConnection::handleAddPlayer(shared_ptr packet) { // Some remote players could actually be local players that are already added for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) @@ -755,7 +755,7 @@ void ClientConnection::handleAddPlayer(std::shared_ptr packet) double z = packet->z / 32.0; float yRot = packet->yRot * 360 / 256.0f; float xRot = packet->xRot * 360 / 256.0f; - std::shared_ptr player = std::shared_ptr( new RemotePlayer(minecraft->level, packet->name) ); + shared_ptr player = shared_ptr( new RemotePlayer(minecraft->level, packet->name) ); player->xo = player->xOld = player->xp = packet->x; player->yo = player->yOld = player->yp = packet->y; player->zo = player->zOld = player->zp = packet->z; @@ -778,11 +778,11 @@ void ClientConnection::handleAddPlayer(std::shared_ptr packet) int item = packet->carriedItem; if (item == 0) { - player->inventory->items[player->inventory->selected] = std::shared_ptr(); // NULL; + player->inventory->items[player->inventory->selected] = shared_ptr(); // NULL; } else { - player->inventory->items[player->inventory->selected] = std::shared_ptr( new ItemInstance(item, 1, 0) ); + player->inventory->items[player->inventory->selected] = shared_ptr( new ItemInstance(item, 1, 0) ); } player->absMoveTo(x, y, z, yRot, xRot); @@ -790,14 +790,14 @@ void ClientConnection::handleAddPlayer(std::shared_ptr packet) player->setCustomSkin( packet->m_skinId ); player->setCustomCape( packet->m_capeId ); player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_uiGamePrivileges); - + if(!player->customTextureUrl.empty() && player->customTextureUrl.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl)) { if( minecraft->addPendingClientTextureRequest(player->customTextureUrl) ) { app.DebugPrintf("Client sending TextureAndGeometryPacket to get custom skin %ls for player %ls\n",player->customTextureUrl.c_str(), player->name.c_str()); - send(std::shared_ptr( new TextureAndGeometryPacket(player->customTextureUrl,NULL,0) ) ); + send(shared_ptr( new TextureAndGeometryPacket(player->customTextureUrl,NULL,0) ) ); } } else if(!player->customTextureUrl.empty() && app.IsFileInMemoryTextures(player->customTextureUrl)) @@ -807,13 +807,13 @@ void ClientConnection::handleAddPlayer(std::shared_ptr packet) } app.DebugPrintf("Custom skin for player %ls is %ls\n",player->name.c_str(),player->customTextureUrl.c_str()); - + if(!player->customTextureUrl2.empty() && player->customTextureUrl2.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl2)) { if( minecraft->addPendingClientTextureRequest(player->customTextureUrl2) ) { app.DebugPrintf("Client sending texture packet to get custom cape %ls for player %ls\n",player->customTextureUrl2.c_str(), player->name.c_str()); - send(std::shared_ptr( new TexturePacket(player->customTextureUrl2,NULL,0) ) ); + send(shared_ptr( new TexturePacket(player->customTextureUrl2,NULL,0) ) ); } } else if(!player->customTextureUrl2.empty() && app.IsFileInMemoryTextures(player->customTextureUrl2)) @@ -826,7 +826,7 @@ void ClientConnection::handleAddPlayer(std::shared_ptr packet) level->putEntity(packet->id, player); - vector > *unpackedData = packet->getUnpackedData(); + vector > *unpackedData = packet->getUnpackedData(); if (unpackedData != NULL) { player->getEntityData()->assignValues(unpackedData); @@ -834,9 +834,9 @@ void ClientConnection::handleAddPlayer(std::shared_ptr packet) } -void ClientConnection::handleTeleportEntity(std::shared_ptr packet) +void ClientConnection::handleTeleportEntity(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; e->xp = packet->x; e->yp = packet->y; @@ -856,9 +856,9 @@ void ClientConnection::handleTeleportEntity(std::shared_ptrlerpTo(x, y, z, yRot, xRot, 3); } -void ClientConnection::handleMoveEntity(std::shared_ptr packet) +void ClientConnection::handleMoveEntity(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; e->xp += packet->xa; e->yp += packet->ya; @@ -877,17 +877,17 @@ void ClientConnection::handleMoveEntity(std::shared_ptr packet e->lerpTo(x, y, z, yRot, xRot, 3); } -void ClientConnection::handleRotateMob(std::shared_ptr packet) +void ClientConnection::handleRotateMob(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; float yHeadRot = packet->yHeadRot * 360 / 256.f; e->setYHeadRot(yHeadRot); } -void ClientConnection::handleMoveEntitySmall(std::shared_ptr packet) +void ClientConnection::handleMoveEntitySmall(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; e->xp += packet->xa; e->yp += packet->ya; @@ -906,7 +906,7 @@ void ClientConnection::handleMoveEntitySmall(std::shared_ptrlerpTo(x, y, z, yRot, xRot, 3); } -void ClientConnection::handleRemoveEntity(std::shared_ptr packet) +void ClientConnection::handleRemoveEntity(shared_ptr packet) { for (int i = 0; i < packet->ids.length; i++) { @@ -914,9 +914,9 @@ void ClientConnection::handleRemoveEntity(std::shared_ptr } } -void ClientConnection::handleMovePlayer(std::shared_ptr packet) +void ClientConnection::handleMovePlayer(shared_ptr packet) { - std::shared_ptr player = minecraft->localplayers[m_userIndex]; //minecraft->player; + shared_ptr player = minecraft->localplayers[m_userIndex]; //minecraft->player; double x = player->x; double y = player->y; @@ -945,7 +945,7 @@ void ClientConnection::handleMovePlayer(std::shared_ptr packet packet->yView = player->y; connection->send(packet); if (!started) - { + { if(!g_NetworkManager.IsHost() ) { @@ -961,7 +961,7 @@ void ClientConnection::handleMovePlayer(std::shared_ptr packet started = true; minecraft->setScreen(NULL); - + // Fix for #105852 - TU12: Content: Gameplay: Local splitscreen Players are spawned at incorrect places after re-joining previously saved and loaded "Mass Effect World". // Move this check from Minecraft::createExtraLocalPlayer // 4J-PB - can't call this when this function is called from the qnet thread (GetGameStarted will be false) @@ -974,19 +974,19 @@ void ClientConnection::handleMovePlayer(std::shared_ptr packet } // 4J Added -void ClientConnection::handleChunkVisibilityArea(std::shared_ptr packet) +void ClientConnection::handleChunkVisibilityArea(shared_ptr packet) { for(int z = packet->m_minZ; z <= packet->m_maxZ; ++z) for(int x = packet->m_minX; x <= packet->m_maxX; ++x) level->setChunkVisible(x, z, true); } -void ClientConnection::handleChunkVisibility(std::shared_ptr packet) +void ClientConnection::handleChunkVisibility(shared_ptr packet) { level->setChunkVisible(packet->x, packet->z, packet->visible); } -void ClientConnection::handleChunkTilesUpdate(std::shared_ptr packet) +void ClientConnection::handleChunkTilesUpdate(shared_ptr packet) { // 4J - changed to encode level in packet MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->levels[packet->levelIdx]; @@ -1035,7 +1035,7 @@ void ClientConnection::handleChunkTilesUpdate(std::shared_ptr packet) +void ClientConnection::handleBlockRegionUpdate(shared_ptr packet) { // 4J - changed to encode level in packet MultiPlayerLevel *dimensionLevel = (MultiPlayerLevel *)minecraft->levels[packet->levelIdx]; @@ -1090,7 +1090,7 @@ void ClientConnection::handleBlockRegionUpdate(std::shared_ptr packet) +void ClientConnection::handleTileUpdate(shared_ptr packet) { // 4J added - using a block of 255 to signify that this is a packet for destroying a tile, where we need to inform the level renderer that we are about to do so. // This is used in creative mode as the point where a tile is first destroyed at the client end of things. Packets formed like this are potentially sent from @@ -1147,11 +1147,11 @@ void ClientConnection::handleTileUpdate(std::shared_ptr packet } } -void ClientConnection::handleDisconnect(std::shared_ptr packet) +void ClientConnection::handleDisconnect(shared_ptr packet) { connection->close(DisconnectPacket::eDisconnect_Kicked); done = true; - + Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->connectionDisconnected( m_userIndex , packet->reason ); app.SetDisconnectReason( packet->reason ); @@ -1191,23 +1191,23 @@ void ClientConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, //minecraft->setScreen(new DisconnectedScreen(L"disconnect.lost", reason, reasonObjects)); } -void ClientConnection::sendAndDisconnect(std::shared_ptr packet) +void ClientConnection::sendAndDisconnect(shared_ptr packet) { if (done) return; connection->send(packet); connection->sendAndQuit(); } -void ClientConnection::send(std::shared_ptr packet) +void ClientConnection::send(shared_ptr packet) { if (done) return; connection->send(packet); } -void ClientConnection::handleTakeItemEntity(std::shared_ptr packet) +void ClientConnection::handleTakeItemEntity(shared_ptr packet) { - std::shared_ptr from = getEntity(packet->itemId); - std::shared_ptr to = dynamic_pointer_cast(getEntity(packet->playerId)); + shared_ptr from = getEntity(packet->itemId); + shared_ptr to = dynamic_pointer_cast(getEntity(packet->playerId)); // 4J - the original game could assume that if getEntity didn't find the player, it must be the local player. We // need to search all local players @@ -1235,12 +1235,12 @@ void ClientConnection::handleTakeItemEntity(std::shared_ptr player = dynamic_pointer_cast(to); + shared_ptr player = dynamic_pointer_cast(to); // 4J Stu - Fix for #10213 - UI: Local clients cannot progress through the tutorial normally. // We only send this packet once if many local players can see the event, so make sure we update @@ -1261,7 +1261,7 @@ void ClientConnection::handleTakeItemEntity(std::shared_ptrplaySound(from, eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); } - minecraft->particleEngine->add( std::shared_ptr( new TakeAnimationParticle(minecraft->level, from, to, -0.5f) ) ); + minecraft->particleEngine->add( shared_ptr( new TakeAnimationParticle(minecraft->level, from, to, -0.5f) ) ); level->removeEntity(packet->itemId); } else @@ -1274,14 +1274,14 @@ void ClientConnection::handleTakeItemEntity(std::shared_ptrplaySound(from, eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); - minecraft->particleEngine->add( std::shared_ptr( new TakeAnimationParticle(minecraft->level, from, to, -0.5f) ) ); + minecraft->particleEngine->add( shared_ptr( new TakeAnimationParticle(minecraft->level, from, to, -0.5f) ) ); level->removeEntity(packet->itemId); } } } -void ClientConnection::handleChat(std::shared_ptr packet) +void ClientConnection::handleChat(shared_ptr packet) { wstring message; int iPos; @@ -1316,7 +1316,7 @@ void ClientConnection::handleChat(std::shared_ptr packet) case ChatPacket::e_ChatBedMeSleep: message=app.GetString(IDS_TILE_BED_MESLEEP); break; - case ChatPacket::e_ChatPlayerJoinedGame: + case ChatPacket::e_ChatPlayerJoinedGame: message=app.GetString(IDS_PLAYER_JOINED); iPos=message.find(L"%s"); message.replace(iPos,2,playerDisplayName); @@ -1514,7 +1514,7 @@ void ClientConnection::handleChat(std::shared_ptr packet) message=app.GetString(IDS_MAX_WOLVES_BRED); break; - // can't shear the mooshroom + // can't shear the mooshroom case ChatPacket::e_ChatPlayerCantShearMooshroom: message=app.GetString(IDS_CANT_SHEAR_MOOSHROOM); break; @@ -1522,16 +1522,16 @@ void ClientConnection::handleChat(std::shared_ptr packet) // Paintings/Item Frames case ChatPacket::e_ChatPlayerMaxHangingEntities: message=app.GetString(IDS_MAX_HANGINGENTITIES); - break; + break; // Enemy spawn eggs in peaceful case ChatPacket::e_ChatPlayerCantSpawnInPeaceful: message=app.GetString(IDS_CANT_SPAWN_IN_PEACEFUL); - break; + break; // Enemy spawn eggs in peaceful case ChatPacket::e_ChatPlayerMaxBoats: message=app.GetString(IDS_MAX_BOATS); - break; + break; case ChatPacket::e_ChatCommandTeleportSuccess: message=app.GetString(IDS_COMMAND_TELEPORT_SUCCESS); @@ -1565,13 +1565,13 @@ void ClientConnection::handleChat(std::shared_ptr packet) if( displayOnGui ) minecraft->gui->addMessage(message,m_userIndex, bIsDeathMessage); } -void ClientConnection::handleAnimate(std::shared_ptr packet) +void ClientConnection::handleAnimate(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; if (packet->action == AnimatePacket::SWING) { - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); if(player != NULL) player->swing(); } else if (packet->action == AnimatePacket::HURT) @@ -1580,7 +1580,7 @@ void ClientConnection::handleAnimate(std::shared_ptr packet) } else if (packet->action == AnimatePacket::WAKE_UP) { - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); if(player != NULL) player->stopSleepInBed(false, false, false); } else if (packet->action == AnimatePacket::RESPAWN) @@ -1588,13 +1588,13 @@ void ClientConnection::handleAnimate(std::shared_ptr packet) } else if (packet->action == AnimatePacket::CRITICAL_HIT) { - std::shared_ptr critParticle = std::shared_ptr( new CritParticle(minecraft->level, e) ); + shared_ptr critParticle = shared_ptr( new CritParticle(minecraft->level, e) ); critParticle->CritParticlePostConstructor(); minecraft->particleEngine->add( critParticle ); } else if (packet->action == AnimatePacket::MAGIC_CRITICAL_HIT) { - std::shared_ptr critParticle = std::shared_ptr( new CritParticle(minecraft->level, e, eParticleType_magicCrit) ); + shared_ptr critParticle = shared_ptr( new CritParticle(minecraft->level, e, eParticleType_magicCrit) ); critParticle->CritParticlePostConstructor(); minecraft->particleEngine->add(critParticle); } @@ -1604,13 +1604,13 @@ void ClientConnection::handleAnimate(std::shared_ptr packet) } -void ClientConnection::handleEntityActionAtPosition(std::shared_ptr packet) +void ClientConnection::handleEntityActionAtPosition(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; if (packet->action == EntityActionAtPositionPacket::START_SLEEP) { - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); player->startSleepInBed(packet->x, packet->y, packet->z); if( player == minecraft->localplayers[m_userIndex] ) @@ -1620,7 +1620,7 @@ void ClientConnection::handleEntityActionAtPosition(std::shared_ptr packet) +void ClientConnection::handlePreLogin(shared_ptr packet) { // printf("Client: handlePreLogin\n"); #if 1 @@ -1630,7 +1630,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) BOOL isAtLeastOneFriend = g_NetworkManager.IsHost(); BOOL isFriendsWithHost = TRUE; BOOL cantPlayContentRestricted = FALSE; - + if(!g_NetworkManager.IsHost()) { // set the game host settings @@ -1664,7 +1664,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) } if( playerXuid != INVALID_XUID ) { - // Is this user friends with the host player? + // Is this user friends with the host player? BOOL result; DWORD error; error = XUserAreUsersFriends(idx,&packet->m_playerXuids[packet->m_hostIndex],1,&result,NULL); @@ -1694,7 +1694,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) } if( playerXuid != INVALID_XUID ) { - // Is this user friends with the host player? + // Is this user friends with the host player? BOOL result; DWORD error; error = XUserAreUsersFriends(m_userIndex,&packet->m_playerXuids[packet->m_hostIndex],1,&result,NULL); @@ -1809,7 +1809,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) if(m_userIndex == ProfileManager.GetPrimaryPad() ) { - // Is this user friends with the host player? + // Is this user friends with the host player? bool isFriend = true; unsigned int friendCount = 0; #ifdef __PS3__ @@ -1839,7 +1839,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) requestParam.offset = 0; requestParam.userInfo.userId = ProfileManager.getUserID(ProfileManager.GetPrimaryPad()); - int ret = sce::Toolkit::NP::Friends::Interface::getFriendslist(&friendList, &requestParam, false); + int ret = sce::Toolkit::NP::Friends::Interface::getFriendslist(&friendList, &requestParam, false); if( ret == 0 ) { if( friendList.hasResult() ) @@ -1849,7 +1849,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) } #endif if( ret == 0 ) - { + { isFriend = false; SceNpId npid; for( unsigned int i = 0; i < friendCount; i++ ) @@ -1932,7 +1932,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) isAtLeastOneFriend = true; break; } - } + } } app.DebugPrintf("ClientConnection::handlePreLogin: User has at least one friend? %s\n", isAtLeastOneFriend ? "Yes" : "No"); @@ -1974,8 +1974,8 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) DisconnectPacket::eDisconnectReason reason = DisconnectPacket::eDisconnect_NoUGC_Remote; #else DisconnectPacket::eDisconnectReason reason = DisconnectPacket::eDisconnect_None; -#endif - if(m_userIndex == ProfileManager.GetPrimaryPad()) +#endif + if(m_userIndex == ProfileManager.GetPrimaryPad()) { if(!isFriendsWithHost) reason = DisconnectPacket::eDisconnect_NotFriendsWithHost; else if(!isAtLeastOneFriend) reason = DisconnectPacket::eDisconnect_NoFriendsInGame; @@ -1987,7 +1987,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); } else - { + { if(!isFriendsWithHost) reason = DisconnectPacket::eDisconnect_NotFriendsWithHost; else if(!canPlayLocal) reason = DisconnectPacket::eDisconnect_NoUGC_Single_Local; else if(cantPlayContentRestricted) reason = DisconnectPacket::eDisconnect_ContentRestricted_Single_Local; @@ -2000,7 +2000,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) app.SetDisconnectReason( reason ); - // 4J-PB - this locks up on the read and write threads not closing down, because they are trying to lock the incoming critsec when it's already locked by this thread + // 4J-PB - this locks up on the read and write threads not closing down, because they are trying to lock the incoming critsec when it's already locked by this thread // Minecraft::GetInstance()->connectionDisconnected( m_userIndex , reason ); // done = true; // connection->flush(); @@ -2055,7 +2055,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) #endif // On PS3, all non-signed in players (even guests) can get a useful offlineXUID -#if !(defined __PS3__ || defined _DURANGO ) +#if !(defined __PS3__ || defined _DURANGO ) if( !ProfileManager.IsGuest( m_userIndex ) ) #endif { @@ -2064,7 +2064,7 @@ void ClientConnection::handlePreLogin(std::shared_ptr packet) } BOOL allAllowed, friendsAllowed; ProfileManager.AllowedPlayerCreatedContent(m_userIndex,true,&allAllowed,&friendsAllowed); - send( std::shared_ptr( new LoginPacket(minecraft->user->name, SharedConstants::NETWORK_PROTOCOL_VERSION, offlineXUID, onlineXUID, (allAllowed!=TRUE && friendsAllowed==TRUE), + send( shared_ptr( new LoginPacket(minecraft->user->name, SharedConstants::NETWORK_PROTOCOL_VERSION, offlineXUID, onlineXUID, (allAllowed!=TRUE && friendsAllowed==TRUE), packet->m_ugcPlayersVersion, app.GetPlayerSkinId(m_userIndex), app.GetPlayerCapeId(m_userIndex), ProfileManager.IsGuest( m_userIndex )))); if(!g_NetworkManager.IsHost() ) @@ -2105,7 +2105,7 @@ void ClientConnection::close() connection->close(DisconnectPacket::eDisconnect_Closed); } -void ClientConnection::handleAddMob(std::shared_ptr packet) +void ClientConnection::handleAddMob(shared_ptr packet) { double x = packet->x / 32.0; double y = packet->y / 32.0; @@ -2113,7 +2113,7 @@ void ClientConnection::handleAddMob(std::shared_ptr packet) float yRot = packet->yRot * 360 / 256.0f; float xRot = packet->xRot * 360 / 256.0f; - std::shared_ptr mob = dynamic_pointer_cast(EntityIO::newById(packet->type, level)); + shared_ptr mob = dynamic_pointer_cast(EntityIO::newById(packet->type, level)); mob->xp = packet->x; mob->yp = packet->y; mob->zp = packet->z; @@ -2121,7 +2121,7 @@ void ClientConnection::handleAddMob(std::shared_ptr packet) mob->yRotp = packet->yRot; mob->xRotp = packet->xRot; - vector > *subEntities = mob->getSubEntities(); + vector > *subEntities = mob->getSubEntities(); if (subEntities != NULL) { int offs = packet->id - mob->entityId; @@ -2143,7 +2143,7 @@ void ClientConnection::handleAddMob(std::shared_ptr packet) mob->zd = packet->zd / 8000.0f; level->putEntity(packet->id, mob); - vector > *unpackedData = packet->getUnpackedData(); + vector > *unpackedData = packet->getUnpackedData(); if (unpackedData != NULL) { mob->getEntityData()->assignValues(unpackedData); @@ -2153,17 +2153,17 @@ void ClientConnection::handleAddMob(std::shared_ptr packet) // 4J Stu - Slimes have a different BB depending on their size which is set in the entity data, so update the BB if(mob->GetType() == eTYPE_SLIME || mob->GetType() == eTYPE_LAVASLIME) { - std::shared_ptr slime = dynamic_pointer_cast(mob); + shared_ptr slime = dynamic_pointer_cast(mob); slime->setSize( slime->getSize() ); } } -void ClientConnection::handleSetTime(std::shared_ptr packet) +void ClientConnection::handleSetTime(shared_ptr packet) { minecraft->level->setTime(packet->time); } -void ClientConnection::handleSetSpawn(std::shared_ptr packet) +void ClientConnection::handleSetSpawn(shared_ptr packet) { //minecraft->player->setRespawnPosition(new Pos(packet->x, packet->y, packet->z)); minecraft->localplayers[m_userIndex]->setRespawnPosition(new Pos(packet->x, packet->y, packet->z)); @@ -2171,12 +2171,12 @@ void ClientConnection::handleSetSpawn(std::shared_ptr pa } -void ClientConnection::handleRidePacket(std::shared_ptr packet) +void ClientConnection::handleRidePacket(shared_ptr packet) { - std::shared_ptr rider = getEntity(packet->riderId); - std::shared_ptr ridden = getEntity(packet->riddenId); + shared_ptr rider = getEntity(packet->riderId); + shared_ptr ridden = getEntity(packet->riddenId); - std::shared_ptr boat = dynamic_pointer_cast(ridden); + shared_ptr boat = dynamic_pointer_cast(ridden); //if (packet->riderId == minecraft->player->entityId) rider = minecraft->player; if (packet->riderId == minecraft->localplayers[m_userIndex]->entityId) { @@ -2193,13 +2193,13 @@ void ClientConnection::handleRidePacket(std::shared_ptr packet) rider->ride(ridden); } -void ClientConnection::handleEntityEvent(std::shared_ptr packet) +void ClientConnection::handleEntityEvent(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->entityId); + shared_ptr e = getEntity(packet->entityId); if (e != NULL) e->handleEntityEvent(packet->eventId); } -std::shared_ptr ClientConnection::getEntity(int entityId) +shared_ptr ClientConnection::getEntity(int entityId) { //if (entityId == minecraft->player->entityId) if(entityId == minecraft->localplayers[m_userIndex]->entityId) @@ -2210,7 +2210,7 @@ std::shared_ptr ClientConnection::getEntity(int entityId) return level->getEntity(entityId); } -void ClientConnection::handleSetHealth(std::shared_ptr packet) +void ClientConnection::handleSetHealth(shared_ptr packet) { //minecraft->player->hurtTo(packet->health); minecraft->localplayers[m_userIndex]->hurtTo(packet->health,packet->damageSource); @@ -2227,12 +2227,12 @@ void ClientConnection::handleSetHealth(std::shared_ptr packet) } } -void ClientConnection::handleSetExperience(std::shared_ptr packet) +void ClientConnection::handleSetExperience(shared_ptr packet) { minecraft->localplayers[m_userIndex]->setExperienceValues(packet->experienceProgress, packet->totalExperience, packet->experienceLevel); } -void ClientConnection::handleTexture(std::shared_ptr packet) +void ClientConnection::handleTexture(shared_ptr packet) { // Both PlayerConnection and ClientConnection should handle this mostly the same way // Server side also needs to store a list of those clients waiting to get a texture the server doesn't have yet @@ -2245,12 +2245,12 @@ void ClientConnection::handleTexture(std::shared_ptr packet) wprintf(L"Client received request for custom texture %ls\n",packet->textureName.c_str()); #endif PBYTE pbData=NULL; - DWORD dwBytes=0; + DWORD dwBytes=0; app.GetMemFileDetails(packet->textureName,&pbData,&dwBytes); if(dwBytes!=0) { - send( std::shared_ptr( new TexturePacket(packet->textureName,pbData,dwBytes) ) ); + send( shared_ptr( new TexturePacket(packet->textureName,pbData,dwBytes) ) ); } } else @@ -2264,7 +2264,7 @@ void ClientConnection::handleTexture(std::shared_ptr packet) } } -void ClientConnection::handleTextureAndGeometry(std::shared_ptr packet) +void ClientConnection::handleTextureAndGeometry(shared_ptr packet) { // Both PlayerConnection and ClientConnection should handle this mostly the same way // Server side also needs to store a list of those clients waiting to get a texture the server doesn't have yet @@ -2277,7 +2277,7 @@ void ClientConnection::handleTextureAndGeometry(std::shared_ptrtextureName.c_str()); #endif PBYTE pbData=NULL; - DWORD dwBytes=0; + DWORD dwBytes=0; app.GetMemFileDetails(packet->textureName,&pbData,&dwBytes); DLCSkinFile *pDLCSkinFile = app.m_dlcManager.getSkinFile(packet->textureName); @@ -2287,18 +2287,18 @@ void ClientConnection::handleTextureAndGeometry(std::shared_ptrgetAdditionalBoxesCount()!=0) { - send( std::shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes,pDLCSkinFile) ) ); + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes,pDLCSkinFile) ) ); } else { - send( std::shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes) ) ); + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes) ) ); } } else { unsigned int uiAnimOverrideBitmask= app.GetAnimOverrideBitmask(packet->dwSkinID); - send( std::shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes,app.GetAdditionalSkinBoxes(packet->dwSkinID),uiAnimOverrideBitmask) ) ); + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwBytes,app.GetAdditionalSkinBoxes(packet->dwSkinID),uiAnimOverrideBitmask) ) ); } } } @@ -2311,9 +2311,9 @@ void ClientConnection::handleTextureAndGeometry(std::shared_ptrtextureName,packet->pbData,packet->dwTextureBytes); // Add the geometry data - if(packet->dwBoxC!=0) + if(packet->dwBoxC!=0) { - app.SetAdditionalSkinBoxes(packet->dwSkinID,packet->BoxDataA,packet->dwBoxC); + app.SetAdditionalSkinBoxes(packet->dwSkinID,packet->BoxDataA,packet->dwBoxC); } // Add the anim override app.SetAnimOverrideBitmask(packet->dwSkinID,packet->uiAnimOverrideBitmask); @@ -2323,11 +2323,11 @@ void ClientConnection::handleTextureAndGeometry(std::shared_ptr packet) +void ClientConnection::handleTextureChange(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); if( e == NULL) return; bool isLocalPlayer = false; @@ -2360,7 +2360,7 @@ void ClientConnection::handleTextureChange(std::shared_ptr #endif break; } - + if(!packet->path.empty() && packet->path.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(packet->path)) { if( minecraft->addPendingClientTextureRequest(packet->path) ) @@ -2368,7 +2368,7 @@ void ClientConnection::handleTextureChange(std::shared_ptr #ifndef _CONTENT_PACKAGE wprintf(L"handleTextureChange - Client sending texture packet to get custom skin %ls for player %ls\n",packet->path.c_str(), player->name.c_str()); #endif - send(std::shared_ptr( new TexturePacket(packet->path,NULL,0) ) ); + send(shared_ptr( new TexturePacket(packet->path,NULL,0) ) ); } } else if(!packet->path.empty() && app.IsFileInMemoryTextures(packet->path)) @@ -2378,11 +2378,11 @@ void ClientConnection::handleTextureChange(std::shared_ptr } } -void ClientConnection::handleTextureAndGeometryChange(std::shared_ptr packet) +void ClientConnection::handleTextureAndGeometryChange(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->id); + shared_ptr e = getEntity(packet->id); if (e == NULL) return; - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); if( e == NULL) return; bool isLocalPlayer = false; @@ -2413,7 +2413,7 @@ void ClientConnection::handleTextureAndGeometryChange(std::shared_ptrpath.c_str(), player->name.c_str()); #endif - send(std::shared_ptr( new TextureAndGeometryPacket(packet->path,NULL,0) ) ); + send(shared_ptr( new TextureAndGeometryPacket(packet->path,NULL,0) ) ); } } else if(!packet->path.empty() && app.IsFileInMemoryTextures(packet->path)) @@ -2424,7 +2424,7 @@ void ClientConnection::handleTextureAndGeometryChange(std::shared_ptr packet) +void ClientConnection::handleRespawn(shared_ptr packet) { //if (packet->dimension != minecraft->player->dimension) if( packet->dimension != minecraft->localplayers[m_userIndex]->dimension || packet->mapSeed != minecraft->localplayers[m_userIndex]->level->getSeed() ) @@ -2459,19 +2459,19 @@ void ClientConnection::handleRespawn(std::shared_ptr packet) } // Remove the player entity from the current level - level->removeEntity( std::shared_ptr(minecraft->localplayers[m_userIndex]) ); + level->removeEntity( shared_ptr(minecraft->localplayers[m_userIndex]) ); level = dimensionLevel; - + // Whilst calling setLevel, make sure that minecraft::player is set up to be correct for this // connection - std::shared_ptr lastPlayer = minecraft->player; + shared_ptr lastPlayer = minecraft->player; minecraft->player = minecraft->localplayers[m_userIndex]; minecraft->setLevel(dimensionLevel); minecraft->player = lastPlayer; TelemetryManager->RecordLevelExit(m_userIndex, eSen_LevelExitStatus_Succeeded); - + //minecraft->player->dimension = packet->dimension; minecraft->localplayers[m_userIndex]->dimension = packet->dimension; //minecraft->setScreen(new ReceivingLevelScreen(this)); @@ -2522,12 +2522,12 @@ void ClientConnection::handleRespawn(std::shared_ptr packet) { ui.NavigateToScene(m_userIndex, eUIScene_ConnectingProgress, param); } - + app.SetAction( m_userIndex, eAppAction_WaitForDimensionChangeComplete); } //minecraft->respawnPlayer(minecraft->player->GetXboxPad(),true, packet->dimension); - + // Wrap respawnPlayer call up in code to set & restore the player/gamemode etc. as some things // in there assume that we are set up for the player that the respawn is coming in for int oldIndex = minecraft->getLocalPlayerIdx(); @@ -2537,7 +2537,7 @@ void ClientConnection::handleRespawn(std::shared_ptr packet) minecraft->setLocalPlayerIdx(oldIndex); } -void ClientConnection::handleExplosion(std::shared_ptr packet) +void ClientConnection::handleExplosion(shared_ptr packet) { if(!packet->m_bKnockbackOnly) { @@ -2552,7 +2552,7 @@ void ClientConnection::handleExplosion(std::shared_ptr packet) MultiPlayerLevel *mpLevel = (MultiPlayerLevel *)minecraft->level; mpLevel->enableResetChanges(false); // 4J - now directly pass a pointer to the toBlow array in the packet rather than copying around - e->finalizeExplosion(true, &packet->toBlow); + e->finalizeExplosion(true, &packet->toBlow); mpLevel->enableResetChanges(true); PIXEndNamedEvent(); PIXEndNamedEvent(); @@ -2569,57 +2569,57 @@ void ClientConnection::handleExplosion(std::shared_ptr packet) minecraft->localplayers[m_userIndex]->zd += packet->getKnockbackZ(); } -void ClientConnection::handleContainerOpen(std::shared_ptr packet) +void ClientConnection::handleContainerOpen(shared_ptr packet) { bool failed = false; - std::shared_ptr player = minecraft->localplayers[m_userIndex]; + shared_ptr player = minecraft->localplayers[m_userIndex]; switch(packet->type) { case ContainerOpenPacket::CONTAINER: { - if( player->openContainer(std::shared_ptr( new SimpleContainer(packet->title, packet->size) ))) + if( player->openContainer(shared_ptr( new SimpleContainer(packet->title, packet->size) ))) { player->containerMenu->containerId = packet->containerId; } else { - failed = true; + failed = true; } } break; case ContainerOpenPacket::FURNACE: { - if( player->openFurnace(std::shared_ptr( new FurnaceTileEntity() )) ) + if( player->openFurnace(shared_ptr( new FurnaceTileEntity() )) ) { player->containerMenu->containerId = packet->containerId; } else { - failed = true; + failed = true; } } break; case ContainerOpenPacket::BREWING_STAND: { - if( player->openBrewingStand(std::shared_ptr( new BrewingStandTileEntity() )) ) + if( player->openBrewingStand(shared_ptr( new BrewingStandTileEntity() )) ) { player->containerMenu->containerId = packet->containerId; } else { - failed = true; + failed = true; } } break; case ContainerOpenPacket::TRAP: { - if( player->openTrap(std::shared_ptr( new DispenserTileEntity() )) ) + if( player->openTrap(shared_ptr( new DispenserTileEntity() )) ) { player->containerMenu->containerId = packet->containerId; } else { - failed = true; + failed = true; } } break; @@ -2631,7 +2631,7 @@ void ClientConnection::handleContainerOpen(std::shared_ptr } else { - failed = true; + failed = true; } } break; @@ -2643,13 +2643,13 @@ void ClientConnection::handleContainerOpen(std::shared_ptr } else { - failed = true; + failed = true; } } break; case ContainerOpenPacket::TRADER_NPC: { - std::shared_ptr csm = std::shared_ptr(new ClientSideMerchant(player,packet->title)); + shared_ptr csm = shared_ptr(new ClientSideMerchant(player,packet->title)); csm->createContainer(); if(player->openTrading(csm)) { @@ -2657,7 +2657,7 @@ void ClientConnection::handleContainerOpen(std::shared_ptr } else { - failed = true; + failed = true; } } break; @@ -2669,7 +2669,7 @@ void ClientConnection::handleContainerOpen(std::shared_ptr } else { - failed = true; + failed = true; } } break; @@ -2686,14 +2686,14 @@ void ClientConnection::handleContainerOpen(std::shared_ptr } else { - send(std::shared_ptr(new ContainerClosePacket(packet->containerId))); + send(shared_ptr(new ContainerClosePacket(packet->containerId))); } } } -void ClientConnection::handleContainerSetSlot(std::shared_ptr packet) +void ClientConnection::handleContainerSetSlot(shared_ptr packet) { - std::shared_ptr player = minecraft->localplayers[m_userIndex]; + shared_ptr player = minecraft->localplayers[m_userIndex]; if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) { player->inventory->setCarried(packet->item); @@ -2705,7 +2705,7 @@ void ClientConnection::handleContainerSetSlot(std::shared_ptrslot >= 36 && packet->slot < 36 + 9) { - std::shared_ptr lastItem = player->inventoryMenu->getSlot(packet->slot)->getItem(); + shared_ptr lastItem = player->inventoryMenu->getSlot(packet->slot)->getItem(); if (packet->item != NULL) { if (lastItem == NULL || lastItem->count < packet->item->count) @@ -2723,9 +2723,9 @@ void ClientConnection::handleContainerSetSlot(std::shared_ptr packet) +void ClientConnection::handleContainerAck(shared_ptr packet) { - std::shared_ptr player = minecraft->localplayers[m_userIndex]; + shared_ptr player = minecraft->localplayers[m_userIndex]; AbstractContainerMenu *menu = NULL; if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) { @@ -2739,15 +2739,15 @@ void ClientConnection::handleContainerAck(std::shared_ptr pa { if (!packet->accepted) { - send( std::shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) )); + send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) )); } } } -void ClientConnection::handleContainerContent(std::shared_ptr packet) +void ClientConnection::handleContainerContent(shared_ptr packet) { - std::shared_ptr player = minecraft->localplayers[m_userIndex]; - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) + shared_ptr player = minecraft->localplayers[m_userIndex]; + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) { player->inventoryMenu->setAll(&packet->items); } @@ -2757,17 +2757,17 @@ void ClientConnection::handleContainerContent(std::shared_ptr packet) +void ClientConnection::handleSignUpdate(shared_ptr packet) { app.DebugPrintf("ClientConnection::handleSignUpdate - "); if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) { - std::shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); + shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); // 4J-PB - on a client connecting, the line below fails if (dynamic_pointer_cast(te) != NULL) { - std::shared_ptr ste = dynamic_pointer_cast(te); + shared_ptr ste = dynamic_pointer_cast(te); for (int i = 0; i < MAX_SIGN_LINES; i++) { ste->SetMessage(i,packet->lines[i]); @@ -2790,11 +2790,11 @@ void ClientConnection::handleSignUpdate(std::shared_ptr packet } } -void ClientConnection::handleTileEntityData(std::shared_ptr packet) +void ClientConnection::handleTileEntityData(shared_ptr packet) { if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) { - std::shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); + shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); if (te != NULL) { @@ -2809,7 +2809,7 @@ void ClientConnection::handleTileEntityData(std::shared_ptrtype == TileEntityDataPacket::TYPE_SKULL && dynamic_pointer_cast(te) != NULL) { dynamic_pointer_cast(te)->load(packet->tag); @@ -2818,7 +2818,7 @@ void ClientConnection::handleTileEntityData(std::shared_ptr packet) +void ClientConnection::handleContainerSetData(shared_ptr packet) { onUnhandledPacket(packet); if (minecraft->localplayers[m_userIndex]->containerMenu != NULL && minecraft->localplayers[m_userIndex]->containerMenu->containerId == packet->containerId) @@ -2827,9 +2827,9 @@ void ClientConnection::handleContainerSetData(std::shared_ptr packet) +void ClientConnection::handleSetEquippedItem(shared_ptr packet) { - std::shared_ptr entity = getEntity(packet->entity); + shared_ptr entity = getEntity(packet->entity); if (entity != NULL) { // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game @@ -2837,19 +2837,19 @@ void ClientConnection::handleSetEquippedItem(std::shared_ptr packet) +void ClientConnection::handleContainerClose(shared_ptr packet) { minecraft->localplayers[m_userIndex]->closeContainer(); } -void ClientConnection::handleTileEvent(std::shared_ptr packet) +void ClientConnection::handleTileEvent(shared_ptr packet) { PIXBeginNamedEvent(0,"Handle tile event\n"); minecraft->level->tileEvent(packet->x, packet->y, packet->z, packet->tile, packet->b0, packet->b1); PIXEndNamedEvent(); } -void ClientConnection::handleTileDestruction(std::shared_ptr packet) +void ClientConnection::handleTileDestruction(shared_ptr packet) { minecraft->level->destroyTileProgress(packet->getEntityId(), packet->getX(), packet->getY(), packet->getZ(), packet->getState()); } @@ -2859,7 +2859,7 @@ bool ClientConnection::canHandleAsyncPackets() return minecraft != NULL && minecraft->level != NULL && minecraft->localplayers[m_userIndex] != NULL && level != NULL; } -void ClientConnection::handleGameEvent(std::shared_ptr gameEventPacket) +void ClientConnection::handleGameEvent(shared_ptr gameEventPacket) { int event = gameEventPacket->_event; int param = gameEventPacket->param; @@ -2887,7 +2887,7 @@ void ClientConnection::handleGameEvent(std::shared_ptr gameEven else if (event == GameEventPacket::WIN_GAME) { ui.SetWinUserIndex( (BYTE)gameEventPacket->param ); - + #ifdef _XBOX // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen @@ -2925,7 +2925,7 @@ void ClientConnection::handleGameEvent(std::shared_ptr gameEven } } -void ClientConnection::handleComplexItemData(std::shared_ptr packet) +void ClientConnection::handleComplexItemData(shared_ptr packet) { if (packet->itemType == Item::map->id) { @@ -2939,7 +2939,7 @@ void ClientConnection::handleComplexItemData(std::shared_ptr packet) +void ClientConnection::handleLevelEvent(shared_ptr packet) { switch(packet->type) { @@ -2963,22 +2963,22 @@ void ClientConnection::handleLevelEvent(std::shared_ptr packet } } -void ClientConnection::handleAwardStat(std::shared_ptr packet) +void ClientConnection::handleAwardStat(shared_ptr packet) { minecraft->localplayers[m_userIndex]->awardStatFromServer(GenericStats::stat(packet->statId), packet->getParamData()); } -void ClientConnection::handleUpdateMobEffect(std::shared_ptr packet) +void ClientConnection::handleUpdateMobEffect(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->entityId); + shared_ptr e = getEntity(packet->entityId); if (e == NULL || dynamic_pointer_cast(e) == NULL) return; ( dynamic_pointer_cast(e) )->addEffect(new MobEffectInstance(packet->effectId, packet->effectDurationTicks, packet->effectAmplifier)); } -void ClientConnection::handleRemoveMobEffect(std::shared_ptr packet) +void ClientConnection::handleRemoveMobEffect(shared_ptr packet) { - std::shared_ptr e = getEntity(packet->entityId); + shared_ptr e = getEntity(packet->entityId); if (e == NULL || dynamic_pointer_cast(e) == NULL) return; ( dynamic_pointer_cast(e) )->removeEffectNoUpdate(packet->effectId); @@ -2989,7 +2989,7 @@ bool ClientConnection::isServerPacketListener() return false; } -void ClientConnection::handlePlayerInfo(std::shared_ptr packet) +void ClientConnection::handlePlayerInfo(shared_ptr packet) { unsigned int startingPrivileges = app.GetPlayerPrivileges(packet->m_networkSmallId); @@ -3005,17 +3005,17 @@ void ClientConnection::handlePlayerInfo(std::shared_ptr packet // 4J Stu - Repurposed this packet for player info that we want app.UpdatePlayerInfo(packet->m_networkSmallId, packet->m_playerColourIndex, packet->m_playerPrivileges); - std::shared_ptr entity = getEntity(packet->m_entityId); + shared_ptr entity = getEntity(packet->m_entityId); if(entity != NULL && entity->GetType() == eTYPE_PLAYER) { - std::shared_ptr player = dynamic_pointer_cast(entity); + shared_ptr player = dynamic_pointer_cast(entity); player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_playerPrivileges); } if(networkPlayer != NULL && networkPlayer->IsLocal()) { for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { - std::shared_ptr localPlayer = minecraft->localplayers[i]; + shared_ptr localPlayer = minecraft->localplayers[i]; if(localPlayer != NULL && localPlayer->connection != NULL && localPlayer->connection->getNetworkPlayer() == networkPlayer ) { localPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All,packet->m_playerPrivileges); @@ -3044,7 +3044,7 @@ void ClientConnection::handlePlayerInfo(std::shared_ptr packet } -void ClientConnection::displayPrivilegeChanges(std::shared_ptr player, unsigned int oldPrivileges) +void ClientConnection::displayPrivilegeChanges(shared_ptr player, unsigned int oldPrivileges) { int userIndex = player->GetXboxPad(); unsigned int newPrivileges = player->getAllPlayerGamePrivileges(); @@ -3117,7 +3117,7 @@ void ClientConnection::displayPrivilegeChanges(std::shared_ptr packet) +void ClientConnection::handleKeepAlive(shared_ptr packet) { - send(std::shared_ptr(new KeepAlivePacket(packet->id))); + send(shared_ptr(new KeepAlivePacket(packet->id))); } -void ClientConnection::handlePlayerAbilities(std::shared_ptr playerAbilitiesPacket) +void ClientConnection::handlePlayerAbilities(shared_ptr playerAbilitiesPacket) { - std::shared_ptr player = minecraft->localplayers[m_userIndex]; + shared_ptr player = minecraft->localplayers[m_userIndex]; player->abilities.flying = playerAbilitiesPacket->isFlying(); player->abilities.instabuild = playerAbilitiesPacket->canInstabuild(); player->abilities.invulnerable = playerAbilitiesPacket->isInvulnerable(); @@ -3156,12 +3156,12 @@ void ClientConnection::handlePlayerAbilities(std::shared_ptrabilities.setFlyingSpeed(playerAbilitiesPacket->getFlyingSpeed()); } -void ClientConnection::handleSoundEvent(std::shared_ptr packet) +void ClientConnection::handleSoundEvent(shared_ptr packet) { minecraft->level->playLocalSound(packet->getX(), packet->getY(), packet->getZ(), packet->getSound(), packet->getVolume(), packet->getPitch()); } -void ClientConnection::handleCustomPayload(std::shared_ptr customPayloadPacket) +void ClientConnection::handleCustomPayload(shared_ptr customPayloadPacket) { if (CustomPayloadPacket::TRADER_LIST_PACKET.compare(customPayloadPacket->identifier) == 0) { @@ -3170,7 +3170,7 @@ void ClientConnection::handleCustomPayload(std::shared_ptr int containerId = input.readInt(); if (ui.IsSceneInStack(m_userIndex, eUIScene_TradingMenu) && containerId == minecraft->localplayers[m_userIndex]->containerMenu->containerId) { - std::shared_ptr trader = nullptr; + shared_ptr trader = nullptr; #ifdef _XBOX HXUIOBJ scene = app.GetCurrentScene(m_userIndex); @@ -3190,7 +3190,7 @@ void ClientConnection::handleCustomPayload(std::shared_ptr UIScene_TradingMenu *screen = (UIScene_TradingMenu *)scene; trader = screen->getMerchant(); #endif - + MerchantRecipeList *recipeList = MerchantRecipeList::createFromStream(&input); trader->overrideOffers(recipeList); } @@ -3203,7 +3203,7 @@ Connection *ClientConnection::getConnection() } // 4J Added -void ClientConnection::handleServerSettingsChanged(std::shared_ptr packet) +void ClientConnection::handleServerSettingsChanged(shared_ptr packet) { if(packet->action==ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS) { @@ -3229,7 +3229,7 @@ void ClientConnection::handleServerSettingsChanged(std::shared_ptr packet) +void ClientConnection::handleXZ(shared_ptr packet) { if(packet->action==XZPacket::STRONGHOLD) { @@ -3239,12 +3239,12 @@ void ClientConnection::handleXZ(std::shared_ptr packet) } } -void ClientConnection::handleUpdateProgress(std::shared_ptr packet) +void ClientConnection::handleUpdateProgress(shared_ptr packet) { if(!g_NetworkManager.IsHost() ) Minecraft::GetInstance()->progressRenderer->progressStagePercentage( packet->m_percentage ); } -void ClientConnection::handleUpdateGameRuleProgressPacket(std::shared_ptr packet) +void ClientConnection::handleUpdateGameRuleProgressPacket(shared_ptr packet) { LPCWSTR string = app.GetGameRulesString(packet->m_messageId); if(string != NULL) @@ -3277,7 +3277,7 @@ int ClientConnection::HostDisconnectReturned(void *pParam,int iPad,C4JStorage::E DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) - { + { // no upsell, we're about to quit MinecraftServer::getInstance()->setSaveOnExit( false ); // flag a app action of exit game @@ -3331,7 +3331,7 @@ int ClientConnection::HostDisconnectReturned(void *pParam,int iPad,C4JStorage::E int ClientConnection::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { // results switched for this dialog - if(result==C4JStorage::EMessage_ResultDecline) + if(result==C4JStorage::EMessage_ResultDecline) { //INT saveOrCheckpointId = 0; //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); @@ -3350,7 +3350,7 @@ int ClientConnection::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage:: return 0; } -// +// wstring ClientConnection::GetDisplayNameByGamertag(wstring gamertag) { #ifdef _DURANGO diff --git a/Minecraft.Client/ClientConnection.h b/Minecraft.Client/ClientConnection.h index 53c3ff22..2ce46ce0 100644 --- a/Minecraft.Client/ClientConnection.h +++ b/Minecraft.Client/ClientConnection.h @@ -49,92 +49,92 @@ public: ~ClientConnection(); void tick(); INetworkPlayer *getNetworkPlayer(); - virtual void handleLogin(std::shared_ptr packet); - virtual void handleAddEntity(std::shared_ptr packet); - virtual void handleAddExperienceOrb(std::shared_ptr packet); - virtual void handleAddGlobalEntity(std::shared_ptr packet); - virtual void handleAddPainting(std::shared_ptr packet); - virtual void handleSetEntityMotion(std::shared_ptr packet); - virtual void handleSetEntityData(std::shared_ptr packet); - virtual void handleAddPlayer(std::shared_ptr packet); - virtual void handleTeleportEntity(std::shared_ptr packet); - virtual void handleMoveEntity(std::shared_ptr packet); - virtual void handleRotateMob(std::shared_ptr packet); - virtual void handleMoveEntitySmall(std::shared_ptr packet); - virtual void handleRemoveEntity(std::shared_ptr packet); - virtual void handleMovePlayer(std::shared_ptr packet); + virtual void handleLogin(shared_ptr packet); + virtual void handleAddEntity(shared_ptr packet); + virtual void handleAddExperienceOrb(shared_ptr packet); + virtual void handleAddGlobalEntity(shared_ptr packet); + virtual void handleAddPainting(shared_ptr packet); + virtual void handleSetEntityMotion(shared_ptr packet); + virtual void handleSetEntityData(shared_ptr packet); + virtual void handleAddPlayer(shared_ptr packet); + virtual void handleTeleportEntity(shared_ptr packet); + virtual void handleMoveEntity(shared_ptr packet); + virtual void handleRotateMob(shared_ptr packet); + virtual void handleMoveEntitySmall(shared_ptr packet); + virtual void handleRemoveEntity(shared_ptr packet); + virtual void handleMovePlayer(shared_ptr packet); Random *random; - + // 4J Added - virtual void handleChunkVisibilityArea(std::shared_ptr packet); + virtual void handleChunkVisibilityArea(shared_ptr packet); - virtual void handleChunkVisibility(std::shared_ptr packet); - virtual void handleChunkTilesUpdate(std::shared_ptr packet); - virtual void handleBlockRegionUpdate(std::shared_ptr packet); - virtual void handleTileUpdate(std::shared_ptr packet); - virtual void handleDisconnect(std::shared_ptr packet); + virtual void handleChunkVisibility(shared_ptr packet); + virtual void handleChunkTilesUpdate(shared_ptr packet); + virtual void handleBlockRegionUpdate(shared_ptr packet); + virtual void handleTileUpdate(shared_ptr packet); + virtual void handleDisconnect(shared_ptr packet); virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); - void sendAndDisconnect(std::shared_ptr packet); - void send(std::shared_ptr packet); - virtual void handleTakeItemEntity(std::shared_ptr packet); - virtual void handleChat(std::shared_ptr packet); - virtual void handleAnimate(std::shared_ptr packet); - virtual void handleEntityActionAtPosition(std::shared_ptr packet); - virtual void handlePreLogin(std::shared_ptr packet); + void sendAndDisconnect(shared_ptr packet); + void send(shared_ptr packet); + virtual void handleTakeItemEntity(shared_ptr packet); + virtual void handleChat(shared_ptr packet); + virtual void handleAnimate(shared_ptr packet); + virtual void handleEntityActionAtPosition(shared_ptr packet); + virtual void handlePreLogin(shared_ptr packet); void close(); - virtual void handleAddMob(std::shared_ptr packet); - virtual void handleSetTime(std::shared_ptr packet); - virtual void handleSetSpawn(std::shared_ptr packet); - virtual void handleRidePacket(std::shared_ptr packet); - virtual void handleEntityEvent(std::shared_ptr packet); + virtual void handleAddMob(shared_ptr packet); + virtual void handleSetTime(shared_ptr packet); + virtual void handleSetSpawn(shared_ptr packet); + virtual void handleRidePacket(shared_ptr packet); + virtual void handleEntityEvent(shared_ptr packet); private: - std::shared_ptr getEntity(int entityId); + shared_ptr getEntity(int entityId); wstring GetDisplayNameByGamertag(wstring gamertag); public: - virtual void handleSetHealth(std::shared_ptr packet); - virtual void handleSetExperience(std::shared_ptr packet); - virtual void handleRespawn(std::shared_ptr packet); - virtual void handleExplosion(std::shared_ptr packet); - virtual void handleContainerOpen(std::shared_ptr packet); - virtual void handleContainerSetSlot(std::shared_ptr packet); - virtual void handleContainerAck(std::shared_ptr packet); - virtual void handleContainerContent(std::shared_ptr packet); - virtual void handleSignUpdate(std::shared_ptr packet); - virtual void handleTileEntityData(std::shared_ptr packet); - virtual void handleContainerSetData(std::shared_ptr packet); - virtual void handleSetEquippedItem(std::shared_ptr packet); - virtual void handleContainerClose(std::shared_ptr packet); - virtual void handleTileEvent(std::shared_ptr packet); - virtual void handleTileDestruction(std::shared_ptr packet); + virtual void handleSetHealth(shared_ptr packet); + virtual void handleSetExperience(shared_ptr packet); + virtual void handleRespawn(shared_ptr packet); + virtual void handleExplosion(shared_ptr packet); + virtual void handleContainerOpen(shared_ptr packet); + virtual void handleContainerSetSlot(shared_ptr packet); + virtual void handleContainerAck(shared_ptr packet); + virtual void handleContainerContent(shared_ptr packet); + virtual void handleSignUpdate(shared_ptr packet); + virtual void handleTileEntityData(shared_ptr packet); + virtual void handleContainerSetData(shared_ptr packet); + virtual void handleSetEquippedItem(shared_ptr packet); + virtual void handleContainerClose(shared_ptr packet); + virtual void handleTileEvent(shared_ptr packet); + virtual void handleTileDestruction(shared_ptr packet); virtual bool canHandleAsyncPackets(); - virtual void handleGameEvent(std::shared_ptr gameEventPacket); - virtual void handleComplexItemData(std::shared_ptr packet); - virtual void handleLevelEvent(std::shared_ptr packet); - virtual void handleAwardStat(std::shared_ptr packet); - virtual void handleUpdateMobEffect(std::shared_ptr packet); - virtual void handleRemoveMobEffect(std::shared_ptr packet); + virtual void handleGameEvent(shared_ptr gameEventPacket); + virtual void handleComplexItemData(shared_ptr packet); + virtual void handleLevelEvent(shared_ptr packet); + virtual void handleAwardStat(shared_ptr packet); + virtual void handleUpdateMobEffect(shared_ptr packet); + virtual void handleRemoveMobEffect(shared_ptr packet); virtual bool isServerPacketListener(); - virtual void handlePlayerInfo(std::shared_ptr packet); - virtual void handleKeepAlive(std::shared_ptr packet); - virtual void handlePlayerAbilities(std::shared_ptr playerAbilitiesPacket); - virtual void handleSoundEvent(std::shared_ptr packet); - virtual void handleCustomPayload(std::shared_ptr customPayloadPacket); + virtual void handlePlayerInfo(shared_ptr packet); + virtual void handleKeepAlive(shared_ptr packet); + virtual void handlePlayerAbilities(shared_ptr playerAbilitiesPacket); + virtual void handleSoundEvent(shared_ptr packet); + virtual void handleCustomPayload(shared_ptr customPayloadPacket); virtual Connection *getConnection(); // 4J Added - virtual void handleServerSettingsChanged(std::shared_ptr packet); - virtual void handleTexture(std::shared_ptr packet); - virtual void handleTextureAndGeometry(std::shared_ptr packet); - virtual void handleUpdateProgress(std::shared_ptr packet); + virtual void handleServerSettingsChanged(shared_ptr packet); + virtual void handleTexture(shared_ptr packet); + virtual void handleTextureAndGeometry(shared_ptr packet); + virtual void handleUpdateProgress(shared_ptr packet); // 4J Added static int HostDisconnectReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); static int ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); - virtual void handleTextureChange(std::shared_ptr packet); - virtual void handleTextureAndGeometryChange(std::shared_ptr packet); - virtual void handleUpdateGameRuleProgressPacket(std::shared_ptr packet); - virtual void handleXZ(std::shared_ptr packet); + virtual void handleTextureChange(shared_ptr packet); + virtual void handleTextureAndGeometryChange(shared_ptr packet); + virtual void handleUpdateGameRuleProgressPacket(shared_ptr packet); + virtual void handleXZ(shared_ptr packet); - void displayPrivilegeChanges(std::shared_ptr player, unsigned int oldPrivileges); + void displayPrivilegeChanges(shared_ptr player, unsigned int oldPrivileges); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h index 607a24c6..4ec76036 100644 --- a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h @@ -43,7 +43,7 @@ class ConsoleSoundEngine public: ConsoleSoundEngine() : m_bIsPlayingStreamingCDMusic(false),m_bIsPlayingStreamingGameMusic(false), m_bIsPlayingEndMusic(false),m_bIsPlayingNetherMusic(false){}; - virtual void tick(std::shared_ptr *players, float a) =0; + 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; diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp index 7bf10b40..43d2059d 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -22,17 +22,17 @@ #ifdef __ORBIS__ #include //#define __DISABLE_MILES__ // MGH disabled for now as it crashes if we call sceNpMatching2Initialize -#endif +#endif // take out Orbis until they are done -#if defined _XBOX +#if defined _XBOX SoundEngine::SoundEngine() {} void SoundEngine::init(Options *pOptions) { } -void SoundEngine::tick(std::shared_ptr *players, float a) +void SoundEngine::tick(shared_ptr *players, float a) { } void SoundEngine::destroy() {} @@ -95,7 +95,7 @@ char SoundEngine::m_szRedistName[]={"redist"}; #endif -F32 AILCALLBACK custom_falloff_function (HSAMPLE S, +F32 AILCALLBACK custom_falloff_function (HSAMPLE S, F32 distance, F32 rolloff_factor, F32 min_dist, @@ -124,7 +124,7 @@ char *SoundEngine::m_szStreamFileA[eStream_Max]= "menu2", "menu3", "menu4", -#endif +#endif "piano1", "piano2", "piano3", @@ -209,7 +209,7 @@ void SoundEngine::init(Options *pOptions) #endif #ifdef __ORBIS__ C4JThread::PushAffinityAllCores(); -#endif +#endif #if defined _DURANGO || defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ Register_RIB(BinkADec); #endif @@ -226,8 +226,8 @@ void SoundEngine::init(Options *pOptions) 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. +#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__ @@ -236,7 +236,7 @@ void SoundEngine::init(Options *pOptions) 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. + // 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); @@ -260,7 +260,7 @@ void SoundEngine::init(Options *pOptions) AIL_shutdown(); #ifdef __ORBIS__ C4JThread::PopAffinity(); -#endif +#endif return; } app.DebugPrintf("---SoundEngine::init - driver opened\n"); @@ -289,12 +289,12 @@ void SoundEngine::init(Options *pOptions) AIL_shutdown(); #ifdef __ORBIS__ C4JThread::PopAffinity(); -#endif +#endif app.DebugPrintf("---SoundEngine::init - AIL_startup_event_system failed\n"); return; } char szBankName[255]; -#if defined __PS3__ +#if defined __PS3__ if(app.GetBootedFromDiscPatch()) { char szTempSoundFilename[255]; @@ -308,7 +308,7 @@ void SoundEngine::init(Options *pOptions) { sprintf(szBankName,"%s/%s",getUsrDirPath(), m_szSoundPath ); } - + #elif defined __PSVITA__ sprintf(szBankName,"%s/%s",getUsrDirPath(), m_szSoundPath ); #elif defined __ORBIS__ @@ -329,7 +329,7 @@ void SoundEngine::init(Options *pOptions) AIL_shutdown(); #ifdef __ORBIS__ C4JThread::PopAffinity(); -#endif +#endif return; } @@ -362,7 +362,7 @@ void SoundEngine::init(Options *pOptions) #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. + // 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; @@ -403,7 +403,7 @@ void SoundEngine::SetStreamingSounds(int iOverworldMin, int iOverWorldMax, int i // AP - moved to a separate function so it can be called from the mixer callback on Vita void SoundEngine::updateMiles() { -#ifdef __PSVITA__ +#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); @@ -463,7 +463,7 @@ void SoundEngine::updateMiles() { isThunder = true; } - if(game_data->volume>1) + if(game_data->volume>1) { game_data->volume=1; } @@ -477,7 +477,7 @@ void SoundEngine::updateMiles() 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; @@ -518,7 +518,7 @@ void SoundEngine::updateMiles() } if(game_data->bIs3D) - { + { if(m_validListenerCount>1) { float fClosest=10000.0f; @@ -562,7 +562,7 @@ void SoundEngine::updateMiles() default: if(game_data->bIs3D) - { + { if(m_validListenerCount>1) { float fClosest=10000.0f; @@ -600,9 +600,9 @@ void SoundEngine::updateMiles() { AIL_set_sample_3D_position( SoundInfo.Sample, game_data->x, game_data->y, -game_data->z ); // Flipped sign of z as Miles is expecting left handed coord system } - } + } break; - } + } } } AIL_complete_event_queue_processing(); @@ -622,7 +622,7 @@ static float fVal=0.0f; static S32 running = AIL_ms_count(); #endif -void SoundEngine::tick(std::shared_ptr *players, float a) +void SoundEngine::tick(shared_ptr *players, float a) { #ifdef __DISABLE_MILES__ return; @@ -657,7 +657,7 @@ void SoundEngine::tick(std::shared_ptr *players, float a) // 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].vPosition.z = z; m_ListenerA[i].vOrientFront.x = ySin; m_ListenerA[i].vOrientFront.y = 0; @@ -707,7 +707,7 @@ SoundEngine::SoundEngine() m_hStream=0; m_StreamState=eMusicStreamState_Idle; m_iMusicDelay=0; - m_validListenerCount=0; + m_validListenerCount=0; m_bHeardTrackA=NULL; @@ -763,7 +763,7 @@ void SoundEngine::play(int iSound, float x, float y, float z, float volume, floa // 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) + if(CurrentSoundsPlaying[iSound+eSFX_MAX]>MAX_SAME_SOUNDS_PLAYING) { // wstring name = wchSoundNames[iSound]; // char *SoundName = (char *)ConvertSoundPathToName(name); @@ -810,7 +810,7 @@ void SoundEngine::play(int iSound, float x, float y, float z, float volume, floa // playUI // ///////////////////////////////////////////// -void SoundEngine::playUI(int iSound, float volume, float pitch) +void SoundEngine::playUI(int iSound, float volume, float pitch) { U8 szSoundName[256]; wstring name; @@ -956,7 +956,7 @@ int SoundEngine::GetRandomishTrack(int iStart,int iEnd) int iVal=iStart; for(int i=iStart;i<=iEnd;i++) { - if(m_bHeardTrackA[i]==false) + if(m_bHeardTrackA[i]==false) { bAllTracksHeard=false; app.DebugPrintf("Not heard all tracks yet\n"); @@ -974,7 +974,7 @@ int SoundEngine::GetRandomishTrack(int iStart,int iEnd) } } - // trying to get a track we haven't heard, but not too hard + // 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 @@ -1111,7 +1111,7 @@ void SoundEngine::updateSystemMusicPlaying(bool isPlaying) // updateSoundEffectVolume // ///////////////////////////////////////////// -void SoundEngine::updateSoundEffectVolume(float fVal) +void SoundEngine::updateSoundEffectVolume(float fVal) { m_MasterEffectsVolume=fVal; //AIL_set_variable_float(0,"UserEffectVol",fVal); @@ -1137,7 +1137,7 @@ int SoundEngine::OpenStreamThreadProc( void* lpParameter ) // playMusicTick // ///////////////////////////////////////////// -void SoundEngine::playMusicTick() +void SoundEngine::playMusicTick() { // AP - vita will update the music during the mixer callback #ifndef __PSVITA__ @@ -1146,7 +1146,7 @@ void SoundEngine::playMusicTick() } // AP - moved to a separate function so it can be called from the mixer callback on Vita -void SoundEngine::playMusicUpdate() +void SoundEngine::playMusicUpdate() { //return; static bool firstCall = true; @@ -1179,7 +1179,7 @@ void SoundEngine::playMusicUpdate() // 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 ); + 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 @@ -1214,7 +1214,7 @@ void SoundEngine::playMusicUpdate() SetIsPlayingStreamingCDMusic(false); m_MusicType=eMusicType_Game; m_StreamingAudioInfo.bIs3D=false; - + #ifdef _XBOX_ONE wstring &wstrSoundName=dlcAudioFile->GetSoundName(m_musicID); wstring wstrFile=L"TPACK:\\Data\\" + wstrSoundName +L".binka"; @@ -1244,7 +1244,7 @@ void SoundEngine::playMusicUpdate() } } 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; @@ -1335,7 +1335,7 @@ void SoundEngine::playMusicUpdate() delete m_openStreamThread; m_openStreamThread = NULL; - HSAMPLE hSample = AIL_stream_sample_handle( m_hStream); + 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); @@ -1383,12 +1383,12 @@ void SoundEngine::playMusicUpdate() else { // clear the 3d flag on the stream after a jukebox finishes and streaming music starts - AIL_set_sample_is_3D( hSample, 0 ); + AIL_set_sample_is_3D( hSample, 0 ); } // set the pitch app.DebugPrintf("Sample rate:%d\n", AIL_sample_playback_rate(hSample)); AIL_set_sample_playback_rate_factor(hSample,m_StreamingAudioInfo.pitch); - // set the volume + // set the volume AIL_set_sample_volume_levels( hSample, m_StreamingAudioInfo.volume*getMasterMusicVolume(), m_StreamingAudioInfo.volume*getMasterMusicVolume()); AIL_start_stream( m_hStream ); @@ -1447,7 +1447,7 @@ void SoundEngine::playMusicUpdate() // Set the end track m_musicID = getMusicID(LevelData::DIMENSION_END); SetIsPlayingEndMusic(true); - SetIsPlayingNetherMusic(false); + SetIsPlayingNetherMusic(false); } else if(!playerInEnd && GetIsPlayingEndMusic()) { @@ -1458,7 +1458,7 @@ void SoundEngine::playMusicUpdate() // Set the end track m_musicID = getMusicID(LevelData::DIMENSION_NETHER); SetIsPlayingEndMusic(false); - SetIsPlayingNetherMusic(true); + SetIsPlayingNetherMusic(true); } else { @@ -1467,7 +1467,7 @@ void SoundEngine::playMusicUpdate() // Set the end track m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); SetIsPlayingEndMusic(false); - SetIsPlayingNetherMusic(false); + SetIsPlayingNetherMusic(false); } } else if (playerInNether && !GetIsPlayingNetherMusic()) @@ -1502,7 +1502,7 @@ void SoundEngine::playMusicUpdate() if(fMusicVol!=getMasterMusicVolume()) { fMusicVol=getMasterMusicVolume(); - HSAMPLE hSample = AIL_stream_sample_handle( m_hStream); + 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); } @@ -1545,7 +1545,7 @@ void SoundEngine::playMusicUpdate() } // our distances in the world aren't very big, so floats rather than casts to doubles should be fine - HSAMPLE hSample = AIL_stream_sample_handle( m_hStream); + HSAMPLE hSample = AIL_stream_sample_handle( m_hStream); fDist=sqrtf((fClosestX*fClosestX)+(fClosestY*fClosestY)+(fClosestZ*fClosestZ)); AIL_set_sample_3D_position( hSample, 0, 0, fDist ); } @@ -1555,7 +1555,7 @@ void SoundEngine::playMusicUpdate() break; case eMusicStreamState_Completed: - { + { // random delay of up to 3 minutes for music m_iMusicDelay = random->nextInt(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 @@ -1644,7 +1644,7 @@ char *SoundEngine::ConvertSoundPathToName(const wstring& name, bool bConvertSpac #endif -F32 AILCALLBACK custom_falloff_function (HSAMPLE S, +F32 AILCALLBACK custom_falloff_function (HSAMPLE S, F32 distance, F32 rolloff_factor, F32 min_dist, diff --git a/Minecraft.Client/Common/Audio/SoundEngine.h b/Minecraft.Client/Common/Audio/SoundEngine.h index 8dc50e7c..92c99d23 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.h +++ b/Minecraft.Client/Common/Audio/SoundEngine.h @@ -78,8 +78,8 @@ typedef struct { F32 x,y,z,volume,pitch; int iSound; - bool bIs3D; - bool bUseSoundsPitchVal; + bool bIs3D; + bool bUseSoundsPitchVal; #ifdef _DEBUG char chName[64]; #endif @@ -103,7 +103,7 @@ public: virtual void updateSystemMusicPlaying(bool isPlaying); virtual void updateSoundEffectVolume(float fVal); virtual void init(Options *); - virtual void tick(std::shared_ptr *players, float a); // 4J - updated to take array of local players rather than single one + 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); @@ -123,7 +123,7 @@ private: #else int initAudioHardware(int iMinSpeakers) { return iMinSpeakers;} #endif - + int GetRandomishTrack(int iStart,int iEnd); HMSOUNDBANK m_hBank; @@ -165,4 +165,4 @@ private: #ifdef __ORBIS__ int32_t m_hBGMAudio; #endif -}; +}; diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp index a1cb78d8..0e55ec9f 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -365,7 +365,7 @@ void CMinecraftApp::HandleButtonPresses(int iPad) // ProfileManager.WriteToProfile(iPad,true); } -bool CMinecraftApp::LoadInventoryMenu(int iPad,std::shared_ptr player,bool bNavigateBack) +bool CMinecraftApp::LoadInventoryMenu(int iPad,shared_ptr player,bool bNavigateBack) { bool success = true; @@ -388,7 +388,7 @@ bool CMinecraftApp::LoadInventoryMenu(int iPad,std::shared_ptr play return success; } -bool CMinecraftApp::LoadCreativeMenu(int iPad,std::shared_ptr player,bool bNavigateBack) +bool CMinecraftApp::LoadCreativeMenu(int iPad,shared_ptr player,bool bNavigateBack) { bool success = true; @@ -411,7 +411,7 @@ bool CMinecraftApp::LoadCreativeMenu(int iPad,std::shared_ptr playe return success; } -bool CMinecraftApp::LoadCrafting2x2Menu(int iPad,std::shared_ptr player) +bool CMinecraftApp::LoadCrafting2x2Menu(int iPad,shared_ptr player) { bool success = true; @@ -437,7 +437,7 @@ bool CMinecraftApp::LoadCrafting2x2Menu(int iPad,std::shared_ptr pl return success; } -bool CMinecraftApp::LoadCrafting3x3Menu(int iPad,std::shared_ptr player, int x, int y, int z) +bool CMinecraftApp::LoadCrafting3x3Menu(int iPad,shared_ptr player, int x, int y, int z) { bool success = true; @@ -463,7 +463,7 @@ bool CMinecraftApp::LoadCrafting3x3Menu(int iPad,std::shared_ptr pl return success; } -bool CMinecraftApp::LoadEnchantingMenu(int iPad,std::shared_ptr inventory, int x, int y, int z, Level *level) +bool CMinecraftApp::LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level) { bool success = true; @@ -489,7 +489,7 @@ bool CMinecraftApp::LoadEnchantingMenu(int iPad,std::shared_ptr inven return success; } -bool CMinecraftApp::LoadFurnaceMenu(int iPad,std::shared_ptr inventory, std::shared_ptr furnace) +bool CMinecraftApp::LoadFurnaceMenu(int iPad,shared_ptr inventory, shared_ptr furnace) { bool success = true; @@ -514,7 +514,7 @@ bool CMinecraftApp::LoadFurnaceMenu(int iPad,std::shared_ptr inventor return success; } -bool CMinecraftApp::LoadBrewingStandMenu(int iPad,std::shared_ptr inventory, std::shared_ptr brewingStand) +bool CMinecraftApp::LoadBrewingStandMenu(int iPad,shared_ptr inventory, shared_ptr brewingStand) { bool success = true; @@ -540,7 +540,7 @@ bool CMinecraftApp::LoadBrewingStandMenu(int iPad,std::shared_ptr inv } -bool CMinecraftApp::LoadContainerMenu(int iPad,std::shared_ptr inventory, std::shared_ptr container) +bool CMinecraftApp::LoadContainerMenu(int iPad,shared_ptr inventory, shared_ptr container) { bool success = true; @@ -574,7 +574,7 @@ bool CMinecraftApp::LoadContainerMenu(int iPad,std::shared_ptr invent return success; } -bool CMinecraftApp::LoadTrapMenu(int iPad,std::shared_ptr inventory, std::shared_ptr trap) +bool CMinecraftApp::LoadTrapMenu(int iPad,shared_ptr inventory, shared_ptr trap) { bool success = true; @@ -599,7 +599,7 @@ bool CMinecraftApp::LoadTrapMenu(int iPad,std::shared_ptr inventory, return success; } -bool CMinecraftApp::LoadSignEntryMenu(int iPad,std::shared_ptr sign) +bool CMinecraftApp::LoadSignEntryMenu(int iPad,shared_ptr sign) { bool success = true; @@ -615,7 +615,7 @@ bool CMinecraftApp::LoadSignEntryMenu(int iPad,std::shared_ptr s return success; } -bool CMinecraftApp::LoadRepairingMenu(int iPad,std::shared_ptr inventory, Level *level, int x, int y, int z) +bool CMinecraftApp::LoadRepairingMenu(int iPad,shared_ptr inventory, Level *level, int x, int y, int z) { bool success = true; @@ -634,7 +634,7 @@ bool CMinecraftApp::LoadRepairingMenu(int iPad,std::shared_ptr invent return success; } -bool CMinecraftApp::LoadTradingMenu(int iPad, std::shared_ptr inventory, std::shared_ptr trader, Level *level) +bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level) { bool success = true; @@ -1272,7 +1272,7 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) PlayerList *players = MinecraftServer::getInstance()->getPlayerList(); for(AUTO_VAR(it3, players->players.begin()); it3 != players->players.end(); ++it3) { - std::shared_ptr decorationPlayer = *it3; + shared_ptr decorationPlayer = *it3; decorationPlayer->setShowOnMaps((app.GetGameHostOption(eGameHostOption_Gamertags)!=0)?true:false); } } @@ -2240,7 +2240,7 @@ unsigned int CMinecraftApp::GetGameSettingsDebugMask(int iPad,bool bOverridePlay } if(iPad < 0) iPad = 0; - std::shared_ptr player = Minecraft::GetInstance()->localplayers[iPad]; + shared_ptr player = Minecraft::GetInstance()->localplayers[iPad]; if(bOverridePlayer || player==NULL) { @@ -2260,7 +2260,7 @@ void CMinecraftApp::SetGameSettingsDebugMask(int iPad, unsigned int uiVal) GameSettingsA[iPad]->uiDebugBitmask=uiVal; // update the value so the network server can use it - std::shared_ptr player = Minecraft::GetInstance()->localplayers[iPad]; + shared_ptr player = Minecraft::GetInstance()->localplayers[iPad]; if(player) { @@ -2427,7 +2427,7 @@ void CMinecraftApp::HandleXuiActions(void) eTMSAction eTMS; LPVOID param; Minecraft *pMinecraft=Minecraft::GetInstance(); - std::shared_ptr player; + shared_ptr player; // are there any global actions to deal with? eAction = app.GetGlobalXuiAction(); diff --git a/Minecraft.Client/Common/Consoles_App.h b/Minecraft.Client/Common/Consoles_App.h index fd517d73..68f4ccd4 100644 --- a/Minecraft.Client/Common/Consoles_App.h +++ b/Minecraft.Client/Common/Consoles_App.h @@ -125,18 +125,18 @@ public: 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,std::shared_ptr player, bool bNavigateBack=false); - bool LoadCreativeMenu(int iPad,std::shared_ptr player,bool bNavigateBack=false); - bool LoadEnchantingMenu(int iPad,std::shared_ptr inventory, int x, int y, int z, Level *level); - bool LoadFurnaceMenu(int iPad,std::shared_ptr inventory, std::shared_ptr furnace); - bool LoadBrewingStandMenu(int iPad,std::shared_ptr inventory, std::shared_ptr brewingStand); - bool LoadContainerMenu(int iPad,std::shared_ptr inventory, std::shared_ptr container); - bool LoadTrapMenu(int iPad,std::shared_ptr inventory, std::shared_ptr trap); - bool LoadCrafting2x2Menu(int iPad,std::shared_ptr player); - bool LoadCrafting3x3Menu(int iPad,std::shared_ptr player, int x, int y, int z); - bool LoadSignEntryMenu(int iPad,std::shared_ptr sign); - bool LoadRepairingMenu(int iPad,std::shared_ptr inventory, Level *level, int x, int y, int z); - bool LoadTradingMenu(int iPad, std::shared_ptr inventory, std::shared_ptr trader, Level *level); + 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;} diff --git a/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp index b2687619..eabc1401 100644 --- a/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp +++ b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp @@ -43,14 +43,14 @@ void AddEnchantmentRuleDefinition::addAttribute(const wstring &attributeName, co } } -bool AddEnchantmentRuleDefinition::enchantItem(std::shared_ptr item) +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) + if (item->id == Item::enchantedBook_Id) { Item::enchantedBook->addEnchantment( item, new EnchantmentInstance(m_enchantmentId, m_enchantmentLevel) ); } diff --git a/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h index 0ec2ff44..3beece10 100644 --- a/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h +++ b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h @@ -19,5 +19,5 @@ public: virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); - bool enchantItem(std::shared_ptr item); + 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 index 6b99c59e..0d14884a 100644 --- a/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp +++ b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp @@ -94,13 +94,13 @@ void AddItemRuleDefinition::addAttribute(const wstring &attributeName, const wst } } -bool AddItemRuleDefinition::addItemToContainer(std::shared_ptr container, int slotId) +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()); - std::shared_ptr newItem = std::shared_ptr(new ItemInstance(m_itemId,quantity,m_auxValue) ); + 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) diff --git a/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h index bd8c466a..602f2d82 100644 --- a/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h +++ b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h @@ -26,5 +26,5 @@ public: virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); - bool addItemToContainer(std::shared_ptr container, int slotId); + bool addItemToContainer(shared_ptr container, int slotId); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp index d94ce63b..66abefbb 100644 --- a/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp +++ b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp @@ -74,7 +74,7 @@ void CollectItemRuleDefinition::populateGameRule(GameRulesInstance::EGameRulesIn GameRuleDefinition::populateGameRule(type, rule); } -bool CollectItemRuleDefinition::onCollectItem(GameRule *rule, std::shared_ptr item) +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) @@ -94,7 +94,7 @@ bool CollectItemRuleDefinition::onCollectItem(GameRule *rule, std::shared_ptrgetConnection() != NULL) { - rule->getConnection()->send( std::shared_ptr( new UpdateGameRuleProgressPacket(getActionType(), this->m_descriptionId, m_itemId, m_auxValue, this->m_4JDataValue,NULL,0))); + rule->getConnection()->send( shared_ptr( new UpdateGameRuleProgressPacket(getActionType(), this->m_descriptionId, m_itemId, m_auxValue, this->m_4JDataValue,NULL,0))); } } } @@ -102,7 +102,7 @@ bool CollectItemRuleDefinition::onCollectItem(GameRule *rule, std::shared_ptr item) +wstring CollectItemRuleDefinition::generateXml(shared_ptr item) { // 4J Stu - This should be kept in sync with the GameRulesDefinition.xsd wstring xml = L""; diff --git a/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h index 1c6821e4..5ee6f4c5 100644 --- a/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h +++ b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h @@ -25,16 +25,16 @@ public: 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, std::shared_ptr item); + bool onCollectItem(GameRule *rule, shared_ptr item); - static wstring generateXml(std::shared_ptr item); + static wstring generateXml(shared_ptr item); -private: +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 index f0362f48..adaf70c8 100644 --- a/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp +++ b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp @@ -17,7 +17,7 @@ bool CompleteAllRuleDefinition::onUseTile(GameRule *rule, int tileId, int x, int return statusChanged; } -bool CompleteAllRuleDefinition::onCollectItem(GameRule *rule, std::shared_ptr item) +bool CompleteAllRuleDefinition::onCollectItem(GameRule *rule, shared_ptr item) { bool statusChanged = CompoundGameRuleDefinition::onCollectItem(rule,item); if(statusChanged) updateStatus(rule); @@ -44,14 +44,14 @@ void CompleteAllRuleDefinition::updateStatus(GameRule *rule) int icon = -1; int auxValue = 0; - + if(m_lastRuleStatusChanged != NULL) - { + { icon = m_lastRuleStatusChanged->getIcon(); auxValue = m_lastRuleStatusChanged->getAuxValue(); m_lastRuleStatusChanged = NULL; } - rule->getConnection()->send( std::shared_ptr( new UpdateGameRuleProgressPacket(getActionType(), this->m_descriptionId,icon, auxValue, 0,&data,sizeof(PacketData)))); + 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); } diff --git a/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h index 2ecbc303..b2cb8847 100644 --- a/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h +++ b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h @@ -17,7 +17,7 @@ public: virtual void getChildren(vector *children); virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z); - virtual bool onCollectItem(GameRule *rule, std::shared_ptr item); + virtual bool onCollectItem(GameRule *rule, shared_ptr item); static wstring generateDescriptionString(const wstring &description, void *data, int dataLength); diff --git a/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp index 106302ee..0481a54b 100644 --- a/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp +++ b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp @@ -40,7 +40,7 @@ GameRuleDefinition *CompoundGameRuleDefinition::addChild(ConsoleGameRules::EGame rule = new UseTileRuleDefinition(); } else if(ruleType == ConsoleGameRules::eGameRuleType_UpdatePlayerRule) - { + { rule = new UpdatePlayerRuleDefinition(); } else @@ -91,7 +91,7 @@ bool CompoundGameRuleDefinition::onUseTile(GameRule *rule, int tileId, int x, in return statusChanged; } -bool CompoundGameRuleDefinition::onCollectItem(GameRule *rule, std::shared_ptr item) +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) @@ -100,7 +100,7 @@ bool CompoundGameRuleDefinition::onCollectItem(GameRule *rule, std::shared_ptrsecond.gr->getGameRuleDefinition()->onCollectItem(it->second.gr,item); if(!statusChanged && changed) - { + { m_lastRuleStatusChanged = it->second.gr->getGameRuleDefinition(); statusChanged = true; } @@ -109,7 +109,7 @@ bool CompoundGameRuleDefinition::onCollectItem(GameRule *rule, std::shared_ptr player) +void CompoundGameRuleDefinition::postProcessPlayer(shared_ptr player) { for(AUTO_VAR(it, m_children.begin()); it != m_children.end(); ++it) { diff --git a/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h index 4b91cda8..bfedfd09 100644 --- a/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h +++ b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h @@ -18,6 +18,6 @@ public: 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, std::shared_ptr item); - virtual void postProcessPlayer(std::shared_ptr player); + 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/ConsoleSchematicFile.cpp b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp index 5f4bc737..0eef096b 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp @@ -116,7 +116,7 @@ void ConsoleSchematicFile::load(DataInputStream *dis) for (int i = 0; i < tileEntityTags->size(); i++) { CompoundTag *teTag = tileEntityTags->get(i); - std::shared_ptr te = TileEntity::loadStatic(teTag); + shared_ptr te = TileEntity::loadStatic(teTag); if(te == NULL) { @@ -433,7 +433,7 @@ void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, { for(AUTO_VAR(it, m_tileEntities.begin()); it != m_tileEntities.end();++it) { - std::shared_ptr te = *it; + shared_ptr te = *it; double targetX = te->x; double targetY = te->y + destinationBox->y0; @@ -444,7 +444,7 @@ void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, Vec3 *pos = Vec3::newTemp(targetX,targetY,targetZ); if( chunkBox->containsIncludingLowerBound(pos) ) { - std::shared_ptr teCopy = chunk->getTileEntity( (int)targetX & 15, (int)targetY & 15, (int)targetZ & 15 ); + shared_ptr teCopy = chunk->getTileEntity( (int)targetX & 15, (int)targetY & 15, (int)targetZ & 15 ); if ( teCopy != NULL ) { @@ -495,11 +495,11 @@ void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, } CompoundTag *eTag = it->second; - std::shared_ptr e = EntityIO::loadStatic(eTag, NULL); + shared_ptr e = EntityIO::loadStatic(eTag, NULL); if( e->GetType() == eTYPE_PAINTING ) { - std::shared_ptr painting = dynamic_pointer_cast(e); + shared_ptr painting = dynamic_pointer_cast(e); double tileX = painting->xTile; double tileZ = painting->zTile; @@ -512,7 +512,7 @@ void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, } else if( e->GetType() == eTYPE_ITEM_FRAME ) { - std::shared_ptr frame = dynamic_pointer_cast(e); + shared_ptr frame = dynamic_pointer_cast(e); double tileX = frame->xTile; double tileZ = frame->zTile; @@ -678,12 +678,12 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l { for (int zc = zc0; zc <= zc1; zc++) { - vector > *tileEntities = getTileEntitiesInRegion(level->getChunk(xc, zc), xStart, yStart, zStart, xStart + xSize, yStart + ySize, zStart + zSize); + 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) { - std::shared_ptr te = *it; + shared_ptr te = *it; CompoundTag *teTag = new CompoundTag(); - std::shared_ptr teCopy = te->clone(); + shared_ptr teCopy = te->clone(); // Adjust the tileEntity position to schematic coords from world co-ords teCopy->x -= xStart; @@ -698,12 +698,12 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l tag.put(L"TileEntities", tileEntitiesTag); AABB *bb = AABB::newTemp(xStart,yStart,zStart,xEnd,yEnd,zEnd); - vector > *entities = level->getEntities(nullptr, bb); + vector > *entities = level->getEntities(nullptr, bb); ListTag *entitiesTag = new ListTag(L"entities"); for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - std::shared_ptr e = *it; + shared_ptr e = *it; bool mobCanBeSaved = false; if(bSaveMobs) @@ -1005,12 +1005,12 @@ void ConsoleSchematicFile::setBlocksAndData(LevelChunk *chunk, byteArray blockDa } } -vector > *ConsoleSchematicFile::getTileEntitiesInRegion(LevelChunk *chunk, int x0, int y0, int z0, int x1, int y1, int z1) +vector > *ConsoleSchematicFile::getTileEntitiesInRegion(LevelChunk *chunk, int x0, int y0, int z0, int x1, int y1, int z1) { - vector > *result = new vector >; + vector > *result = new vector >; for (AUTO_VAR(it, chunk->tileEntities.begin()); it != chunk->tileEntities.end(); ++it) { - std::shared_ptr te = it->second; + 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); diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h index 299f81d4..b0eebf9e 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h @@ -55,7 +55,7 @@ public: } XboxSchematicInitParam; private: int m_xSize, m_ySize, m_zSize; - vector > m_tileEntities; + vector > m_tileEntities; vector< pair > m_entities; public: @@ -83,7 +83,7 @@ private: 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); + 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); diff --git a/Minecraft.Client/Common/GameRules/GameRule.cpp b/Minecraft.Client/Common/GameRules/GameRule.cpp index 310d6d65..34d6196c 100644 --- a/Minecraft.Client/Common/GameRules/GameRule.cpp +++ b/Minecraft.Client/Common/GameRules/GameRule.cpp @@ -53,7 +53,7 @@ GameRuleDefinition *GameRule::getGameRuleDefinition() } void GameRule::onUseTile(int tileId, int x, int y, int z) { m_definition->onUseTile(this,tileId,x,y,z); } -void GameRule::onCollectItem(std::shared_ptr item) { m_definition->onCollectItem(this,item); } +void GameRule::onCollectItem(shared_ptr item) { m_definition->onCollectItem(this,item); } void GameRule::write(DataOutputStream *dos) { @@ -63,7 +63,7 @@ void GameRule::write(DataOutputStream *dos) { wstring pName = (*it).first; ValueType vType = (*it).second; - + dos->writeUTF( (*it).first ); dos->writeBoolean( vType.isPointer ); @@ -80,7 +80,7 @@ void GameRule::read(DataInputStream *dis) for (int i = 0; i < savedParams; i++) { wstring pNames = dis->readUTF(); - + ValueType vType = getParameter(pNames); if (dis->readBoolean()) diff --git a/Minecraft.Client/Common/GameRules/GameRule.h b/Minecraft.Client/Common/GameRules/GameRule.h index c2b6c826..3b9dba7e 100644 --- a/Minecraft.Client/Common/GameRules/GameRule.h +++ b/Minecraft.Client/Common/GameRules/GameRule.h @@ -51,7 +51,7 @@ public: // All the hooks go here void onUseTile(int tileId, int x, int y, int z); - void onCollectItem(std::shared_ptr item); + void onCollectItem(shared_ptr item); // 4J-JEV: For saving. //CompoundTag *toTags(unordered_map *map); diff --git a/Minecraft.Client/Common/GameRules/GameRuleDefinition.h b/Minecraft.Client/Common/GameRules/GameRuleDefinition.h index ea7647bf..afec8fbc 100644 --- a/Minecraft.Client/Common/GameRules/GameRuleDefinition.h +++ b/Minecraft.Client/Common/GameRules/GameRuleDefinition.h @@ -39,7 +39,7 @@ public: 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); @@ -53,8 +53,8 @@ public: // 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, std::shared_ptr item) { return false; } - virtual void postProcessPlayer(std::shared_ptr player) { } + virtual bool onCollectItem(GameRule *rule, shared_ptr item) { return false; } + virtual void postProcessPlayer(shared_ptr player) { } vector *enumerate(); unordered_map *enumerateMap(); diff --git a/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp index 7ef8e577..6e55cd45 100644 --- a/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp +++ b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp @@ -11,7 +11,7 @@ UpdatePlayerRuleDefinition::UpdatePlayerRuleDefinition() { m_bUpdateHealth = m_bUpdateFood = m_bUpdateYRot = false;; m_health = 0; - m_food = 0; + m_food = 0; m_spawnPos = NULL; m_yRot = 0.0f; } @@ -130,7 +130,7 @@ void UpdatePlayerRuleDefinition::addAttribute(const wstring &attributeName, cons } } -void UpdatePlayerRuleDefinition::postProcessPlayer(std::shared_ptr player) +void UpdatePlayerRuleDefinition::postProcessPlayer(shared_ptr player) { if(m_bUpdateHealth) { diff --git a/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h index f02ba848..538aefa1 100644 --- a/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h +++ b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h @@ -13,7 +13,7 @@ private: bool m_bUpdateHealth, m_bUpdateFood, m_bUpdateYRot, m_bUpdateInventory; int m_health; - int m_food; + int m_food; Pos *m_spawnPos; float m_yRot; @@ -22,12 +22,12 @@ public: ~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(std::shared_ptr player); + virtual void postProcessPlayer(shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp index 25b7f6ab..8184f45b 100644 --- a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp @@ -22,7 +22,7 @@ XboxStructureActionPlaceContainer::~XboxStructureActionPlaceContainer() // 4J-JEV: Super class handles attr-facing fine. //void XboxStructureActionPlaceContainer::writeAttributes(DataOutputStream *dos, UINT numAttrs) - + void XboxStructureActionPlaceContainer::getChildren(vector *children) { @@ -78,8 +78,8 @@ bool XboxStructureActionPlaceContainer::placeContainerInLevel(StructurePiece *st } level->setTile( worldX, worldY, worldZ, m_tile ); - std::shared_ptr container = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); - + 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 ) { diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp index fcb8a018..1eca3342 100644 --- a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp @@ -54,7 +54,7 @@ bool XboxStructureActionPlaceSpawner::placeSpawnerInLevel(StructurePiece *struct } level->setTile( worldX, worldY, worldZ, m_tile ); - std::shared_ptr entity = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); + 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); diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.cpp b/Minecraft.Client/Common/Network/GameNetworkManager.cpp index f52bd4e7..5fd72e40 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/GameNetworkManager.cpp @@ -316,7 +316,7 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame return false; } - connection->send( std::shared_ptr( new PreLoginPacket(minecraft->user->name) ) ); + 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 @@ -403,7 +403,7 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame // Open the socket on the server end to accept incoming data Socket::addIncomingSocket(socket); - connection->send( std::shared_ptr( new PreLoginPacket(convStringToWstring( ProfileManager.GetGamertag(idx) )) ) ); + connection->send( shared_ptr( new PreLoginPacket(convStringToWstring( ProfileManager.GetGamertag(idx) )) ) ); createdConnections.push_back( connection ); @@ -1134,7 +1134,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) PlayerList *players = pServer->getPlayers(); for(AUTO_VAR(it, players->players.begin()); it < players->players.end(); ++it) { - std::shared_ptr servPlayer = *it; + shared_ptr servPlayer = *it; if( servPlayer->connection->isLocal() && !servPlayer->connection->isGuest() ) { servPlayer->connection->connection->getSocket()->setPlayer(NULL); @@ -1202,7 +1202,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) PlayerList *players = pServer->getPlayers(); for(AUTO_VAR(it, players->players.begin()); it < players->players.end(); ++it) { - std::shared_ptr servPlayer = *it; + shared_ptr servPlayer = *it; if( servPlayer->getXuid() == localPlayerXuid ) { servPlayer->connection->connection->getSocket()->setPlayer( g_NetworkManager.GetLocalPlayerByUserIndex(index) ); @@ -1391,7 +1391,7 @@ void CGameNetworkManager::CreateSocket( INetworkPlayer *pNetworkPlayer, bool loc Minecraft *pMinecraft = Minecraft::GetInstance(); Socket *socket = NULL; - std::shared_ptr mpPlayer = pMinecraft->localplayers[pNetworkPlayer->GetUserIndex()]; + 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 @@ -1428,7 +1428,7 @@ void CGameNetworkManager::CreateSocket( INetworkPlayer *pNetworkPlayer, bool loc if( connection->createdOk ) { - connection->send( std::shared_ptr( new PreLoginPacket( pNetworkPlayer->GetOnlineName() ) ) ); + connection->send( shared_ptr( new PreLoginPacket( pNetworkPlayer->GetOnlineName() ) ) ); pMinecraft->addPendingLocalConnection(idx, connection); } else diff --git a/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp index f495cca0..f01db84e 100644 --- a/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp +++ b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp @@ -24,7 +24,7 @@ ChangeStateConstraint::ChangeStateConstraint( Tutorial *tutorial, eTutorial_Stat m_tutorial = tutorial; m_targetState = targetState; m_sourceStatesCount = sourceStatesCount; - + m_bHasChanged = false; m_changedFromState = e_Tutorial_State_None; @@ -59,11 +59,11 @@ void ChangeStateConstraint::tick(int iPad) if(originalPrivileges != playerPrivs) { // Send update settings packet to server - Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = minecraft->localplayers[iPad]; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) { - player->connection->send( std::shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); } } } @@ -100,11 +100,11 @@ void ChangeStateConstraint::tick(int iPad) if(originalPrivileges != playerPrivs) { // Send update settings packet to server - Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = minecraft->localplayers[iPad]; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) { - player->connection->send( std::shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); } } } @@ -124,11 +124,11 @@ void ChangeStateConstraint::tick(int iPad) if(originalPrivileges != playerPrivs) { // Send update settings packet to server - Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = minecraft->localplayers[iPad]; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) { - player->connection->send( std::shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); } } } diff --git a/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp index fbd6ddf3..43b2f7f3 100644 --- a/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp +++ b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp @@ -4,7 +4,7 @@ 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) +void CompleteUsingItemTask::completeUsingItem(shared_ptr item) { if(!hasBeenActivated() && !isPreCompletionEnabled()) return; for(int i=0;i item); + virtual void completeUsingItem(shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CraftTask.cpp b/Minecraft.Client/Common/Tutorial/CraftTask.cpp index ca462aa5..6749d030 100644 --- a/Minecraft.Client/Common/Tutorial/CraftTask.cpp +++ b/Minecraft.Client/Common/Tutorial/CraftTask.cpp @@ -40,7 +40,7 @@ CraftTask::~CraftTask() delete[] m_auxValues; } -void CraftTask::onCrafted(std::shared_ptr item) +void CraftTask::onCrafted(shared_ptr item) { #ifndef _CONTENT_PACKAGE wprintf(L"CraftTask::onCrafted - %ls\n", item->toString().c_str() ); diff --git a/Minecraft.Client/Common/Tutorial/CraftTask.h b/Minecraft.Client/Common/Tutorial/CraftTask.h index c841c96b..1496f07a 100644 --- a/Minecraft.Client/Common/Tutorial/CraftTask.h +++ b/Minecraft.Client/Common/Tutorial/CraftTask.h @@ -14,7 +14,7 @@ public: ~CraftTask(); virtual bool isCompleted() { return bIsCompleted; } - virtual void onCrafted(std::shared_ptr item); + virtual void onCrafted(shared_ptr item); private: int *m_items; diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp index fcfec29d..1367f411 100644 --- a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp +++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp @@ -20,7 +20,7 @@ DiggerItemHint::DiggerItemHint(eTutorial_Hint id, Tutorial *tutorial, int descri tutorial->addMessage(IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL, true); } -int DiggerItemHint::startDestroyBlock(std::shared_ptr item, Tile *tile) +int DiggerItemHint::startDestroyBlock(shared_ptr item, Tile *tile) { if(item != NULL) { @@ -46,7 +46,7 @@ int DiggerItemHint::startDestroyBlock(std::shared_ptr item, Tile * return -1; } -int DiggerItemHint::attack(std::shared_ptr item, std::shared_ptr entity) +int DiggerItemHint::attack(shared_ptr item, shared_ptr entity) { if(item != NULL) { diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.h b/Minecraft.Client/Common/Tutorial/DiggerItemHint.h index b23a8be3..cb71742e 100644 --- a/Minecraft.Client/Common/Tutorial/DiggerItemHint.h +++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.h @@ -13,6 +13,6 @@ private: public: DiggerItemHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int items[], unsigned int itemsLength); - virtual int startDestroyBlock(std::shared_ptr item, Tile *tile); - virtual int attack(std::shared_ptr item, std::shared_ptr entity); + 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/PickupTask.cpp b/Minecraft.Client/Common/Tutorial/PickupTask.cpp index 742ed08c..00bc9d1f 100644 --- a/Minecraft.Client/Common/Tutorial/PickupTask.cpp +++ b/Minecraft.Client/Common/Tutorial/PickupTask.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "PickupTask.h" -void PickupTask::onTake(std::shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +void PickupTask::onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) { if(item->id == m_itemId) { diff --git a/Minecraft.Client/Common/Tutorial/PickupTask.h b/Minecraft.Client/Common/Tutorial/PickupTask.h index 26ef3a21..68e1d479 100644 --- a/Minecraft.Client/Common/Tutorial/PickupTask.h +++ b/Minecraft.Client/Common/Tutorial/PickupTask.h @@ -17,7 +17,7 @@ public: {} virtual bool isCompleted() { return bIsCompleted; } - virtual void onTake(std::shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); + virtual void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); private: int m_itemId; diff --git a/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp index 39daa72a..8603f765 100644 --- a/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp +++ b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp @@ -111,7 +111,7 @@ bool ProcedureCompoundTask::isCompleted() return allCompleted; } -void ProcedureCompoundTask::onCrafted(std::shared_ptr item) +void ProcedureCompoundTask::onCrafted(shared_ptr item) { AUTO_VAR(itEnd, m_taskSequence.end()); for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) @@ -222,7 +222,7 @@ bool ProcedureCompoundTask::AllowFade() return allowFade; } -void ProcedureCompoundTask::useItemOn(Level *level, std::shared_ptr item, int x, int y, int z,bool bTestUseOnly) +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) @@ -232,7 +232,7 @@ void ProcedureCompoundTask::useItemOn(Level *level, std::shared_ptr item, bool 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) @@ -242,7 +242,7 @@ void ProcedureCompoundTask::useItem(std::shared_ptr item, bool bTe } } -void ProcedureCompoundTask::onTake(std::shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +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) diff --git a/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h index e60bcfb0..36b32798 100644 --- a/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h +++ b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h @@ -18,7 +18,7 @@ public: virtual int getDescriptionId(); virtual int getPromptId(); virtual bool isCompleted(); - virtual void onCrafted(std::shared_ptr item); + virtual void onCrafted(shared_ptr item); virtual void handleUIInput(int iAction); virtual void setAsCurrentTask(bool active = true); virtual bool ShowMinimumTime(); @@ -26,9 +26,9 @@ public: virtual void setShownForMinimumTime(); virtual bool AllowFade(); - virtual void useItemOn(Level *level, std::shared_ptr item, int x, int y, int z, bool bTestUseOnly=false); - virtual void useItem(std::shared_ptr item, bool bTestUseOnly=false); - virtual void onTake(std::shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); + 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: diff --git a/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp b/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp index 5a5c0ea5..a1a5c37a 100644 --- a/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp +++ b/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp @@ -17,7 +17,7 @@ TakeItemHint::TakeItemHint(eTutorial_Hint id, Tutorial *tutorial, int items[], u } } -bool TakeItemHint::onTake(std::shared_ptr item) +bool TakeItemHint::onTake(shared_ptr item) { if(item != NULL) { diff --git a/Minecraft.Client/Common/Tutorial/TakeItemHint.h b/Minecraft.Client/Common/Tutorial/TakeItemHint.h index 25d43eac..f001d4c7 100644 --- a/Minecraft.Client/Common/Tutorial/TakeItemHint.h +++ b/Minecraft.Client/Common/Tutorial/TakeItemHint.h @@ -15,5 +15,5 @@ public: TakeItemHint(eTutorial_Hint id, Tutorial *tutorial, int items[], unsigned int itemsLength); ~TakeItemHint(); - virtual bool onTake( std::shared_ptr item ); + virtual bool onTake( shared_ptr item ); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.cpp b/Minecraft.Client/Common/Tutorial/Tutorial.cpp index fa865b90..f7e44b17 100644 --- a/Minecraft.Client/Common/Tutorial/Tutorial.cpp +++ b/Minecraft.Client/Common/Tutorial/Tutorial.cpp @@ -1681,7 +1681,7 @@ void Tutorial::showTutorialPopup(bool show) } } -void Tutorial::useItemOn(Level *level, std::shared_ptr item, int x, int y, int z, bool bTestUseOnly) +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) { @@ -1690,7 +1690,7 @@ void Tutorial::useItemOn(Level *level, std::shared_ptr item, int x } } -void Tutorial::useItemOn(std::shared_ptr item, bool bTestUseOnly) +void Tutorial::useItemOn(shared_ptr item, bool bTestUseOnly) { for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) { @@ -1699,7 +1699,7 @@ void Tutorial::useItemOn(std::shared_ptr item, bool bTestUseOnly) } } -void Tutorial::completeUsingItem(std::shared_ptr item) +void Tutorial::completeUsingItem(shared_ptr item) { for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) { @@ -1718,7 +1718,7 @@ void Tutorial::completeUsingItem(std::shared_ptr item) } } -void Tutorial::startDestroyBlock(std::shared_ptr item, Tile *tile) +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) @@ -1754,7 +1754,7 @@ void Tutorial::destroyBlock(Tile *tile) } } -void Tutorial::attack(std::shared_ptr player, std::shared_ptr entity) +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) @@ -1772,7 +1772,7 @@ void Tutorial::attack(std::shared_ptr player, std::shared_ptr en } } -void Tutorial::itemDamaged(std::shared_ptr item) +void Tutorial::itemDamaged(shared_ptr item) { int hintNeeded = -1; for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) @@ -1803,7 +1803,7 @@ void Tutorial::handleUIInput(int iAction) currentTask[m_CurrentState]->handleUIInput(iAction); } -void Tutorial::createItemSelected(std::shared_ptr item, bool canMake) +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) @@ -1821,7 +1821,7 @@ void Tutorial::createItemSelected(std::shared_ptr item, bool canMa } } -void Tutorial::onCrafted(std::shared_ptr item) +void Tutorial::onCrafted(shared_ptr item) { for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) { @@ -1833,7 +1833,7 @@ void Tutorial::onCrafted(std::shared_ptr item) } } -void Tutorial::onTake(std::shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +void Tutorial::onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) { if( !m_hintDisplayed ) { @@ -1860,7 +1860,7 @@ void Tutorial::onTake(std::shared_ptr item, unsigned int invItemCo } } -void Tutorial::onSelectedItemChanged(std::shared_ptr item) +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 diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.h b/Minecraft.Client/Common/Tutorial/Tutorial.h index e942ff32..aaaaba0a 100644 --- a/Minecraft.Client/Common/Tutorial/Tutorial.h +++ b/Minecraft.Client/Common/Tutorial/Tutorial.h @@ -11,7 +11,7 @@ using namespace std; // #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 @@ -151,19 +151,19 @@ public: void showTutorialPopup(bool show); - void useItemOn(Level *level, std::shared_ptr item, int x, int y, int z,bool bTestUseOnly=false); - void useItemOn(std::shared_ptr item, bool bTestUseOnly=false); - void completeUsingItem(std::shared_ptr item); - void startDestroyBlock(std::shared_ptr item, Tile *tile); + 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(std::shared_ptr player, std::shared_ptr entity); - void itemDamaged(std::shared_ptr item); + void attack(shared_ptr player, shared_ptr entity); + void itemDamaged(shared_ptr item); void handleUIInput(int iAction); - void createItemSelected(std::shared_ptr item, bool canMake); - void onCrafted(std::shared_ptr item); - void onTake(std::shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); - void onSelectedItemChanged(std::shared_ptr item); + 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); diff --git a/Minecraft.Client/Common/Tutorial/TutorialHint.cpp b/Minecraft.Client/Common/Tutorial/TutorialHint.cpp index ecd6fe29..5f0808bf 100644 --- a/Minecraft.Client/Common/Tutorial/TutorialHint.cpp +++ b/Minecraft.Client/Common/Tutorial/TutorialHint.cpp @@ -7,14 +7,14 @@ #include "..\..\Minecraft.h" #include "..\..\MultiplayerLocalPlayer.h" -TutorialHint::TutorialHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, eHintType type, bool allowFade /*= true*/) +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(std::shared_ptr item, Tile *tile) +int TutorialHint::startDestroyBlock(shared_ptr item, Tile *tile) { int returnVal = -1; switch(m_type) @@ -59,7 +59,7 @@ int TutorialHint::destroyBlock(Tile *tile) return returnVal; } -int TutorialHint::attack(std::shared_ptr item, std::shared_ptr entity) +int TutorialHint::attack(shared_ptr item, shared_ptr entity) { /* switch(m_type) @@ -71,7 +71,7 @@ int TutorialHint::attack(std::shared_ptr item, std::shared_ptr item, bool canMake) +int TutorialHint::createItemSelected(shared_ptr item, bool canMake) { int returnVal = -1; switch(m_type) @@ -86,7 +86,7 @@ int TutorialHint::createItemSelected(std::shared_ptr item, bool ca return returnVal; } -int TutorialHint::itemDamaged(std::shared_ptr item) +int TutorialHint::itemDamaged(shared_ptr item) { int returnVal = -1; switch(m_type) @@ -100,7 +100,7 @@ int TutorialHint::itemDamaged(std::shared_ptr item) return returnVal; } -bool TutorialHint::onTake( std::shared_ptr item ) +bool TutorialHint::onTake( shared_ptr item ) { return false; } @@ -121,7 +121,7 @@ int TutorialHint::tick() switch(m_type) { case e_Hint_SwimUp: - if( Minecraft::GetInstance()->localplayers[m_tutorial->getPad()]->isUnderLiquid(Material::water) ) returnVal = m_descriptionId; + if( Minecraft::GetInstance()->localplayers[m_tutorial->getPad()]->isUnderLiquid(Material::water) ) returnVal = m_descriptionId; break; } return returnVal; diff --git a/Minecraft.Client/Common/Tutorial/TutorialHint.h b/Minecraft.Client/Common/Tutorial/TutorialHint.h index 8c33156f..8ca543cc 100644 --- a/Minecraft.Client/Common/Tutorial/TutorialHint.h +++ b/Minecraft.Client/Common/Tutorial/TutorialHint.h @@ -10,7 +10,7 @@ class Tutorial; class TutorialHint { -public: +public: enum eHintType { e_Hint_DiggerItem, @@ -40,12 +40,12 @@ public: eTutorial_Hint getId() { return m_id; } - virtual int startDestroyBlock(std::shared_ptr item, Tile *tile); + virtual int startDestroyBlock(shared_ptr item, Tile *tile); virtual int destroyBlock(Tile *tile); - virtual int attack(std::shared_ptr item, std::shared_ptr entity); - virtual int createItemSelected(std::shared_ptr item, bool canMake); - virtual int itemDamaged(std::shared_ptr item); - virtual bool onTake( std::shared_ptr item ); + 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(); diff --git a/Minecraft.Client/Common/Tutorial/TutorialMode.cpp b/Minecraft.Client/Common/Tutorial/TutorialMode.cpp index 774e9c73..82c81598 100644 --- a/Minecraft.Client/Common/Tutorial/TutorialMode.cpp +++ b/Minecraft.Client/Common/Tutorial/TutorialMode.cpp @@ -36,7 +36,7 @@ bool TutorialMode::destroyBlock(int x, int y, int z, int face) int t = minecraft->level->getTile(x, y, z); tutorial->destroyBlock(Tile::tiles[t]); } - std::shared_ptr item = minecraft->player->getSelectedItem(); + shared_ptr item = minecraft->player->getSelectedItem(); int damageBefore; if(item != NULL) { @@ -47,7 +47,7 @@ bool TutorialMode::destroyBlock(int x, int y, int z, int face) if(!tutorial->m_allTutorialsComplete) { if ( item != NULL && item->isDamageableItem() ) - { + { int max = item->getMaxDamage(); int damageNow = item->getDamageValue(); @@ -78,7 +78,7 @@ void TutorialMode::tick() */ } -bool TutorialMode::useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly, bool *pbUsedItem) +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; @@ -87,7 +87,7 @@ bool TutorialMode::useItemOn(std::shared_ptr player, Level *level, std:: tutorial->useItemOn(level, item, x, y, z, bTestUseOnly); if(!bTestUseOnly) - { + { if(item != NULL) { haveItem = true; @@ -110,7 +110,7 @@ bool TutorialMode::useItemOn(std::shared_ptr player, Level *level, std:: return result; } -void TutorialMode::attack(std::shared_ptr player, std::shared_ptr entity) +void TutorialMode::attack(shared_ptr player, shared_ptr entity) { if(!tutorial->m_allTutorialsComplete) tutorial->attack(player, entity); diff --git a/Minecraft.Client/Common/Tutorial/TutorialMode.h b/Minecraft.Client/Common/Tutorial/TutorialMode.h index 330b0d51..75e24edf 100644 --- a/Minecraft.Client/Common/Tutorial/TutorialMode.h +++ b/Minecraft.Client/Common/Tutorial/TutorialMode.h @@ -19,8 +19,8 @@ public: 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(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly=false, bool *pbUsedItem=NULL); - virtual void attack(std::shared_ptr player, std::shared_ptr entity); + 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); diff --git a/Minecraft.Client/Common/Tutorial/TutorialTask.h b/Minecraft.Client/Common/Tutorial/TutorialTask.h index adeaab6d..92cb5999 100644 --- a/Minecraft.Client/Common/Tutorial/TutorialTask.h +++ b/Minecraft.Client/Common/Tutorial/TutorialTask.h @@ -26,7 +26,7 @@ protected: bool m_bAllowFade; bool m_bTaskReminders; bool m_bShowMinimumTime; - + protected: bool bIsCompleted; bool m_bShownForMinimumTime; @@ -43,7 +43,7 @@ public: 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 enableConstraints(bool enable, bool delayRemove = false); virtual void setAsCurrentTask(bool active = true); virtual void setShownForMinimumTime() { m_bShownForMinimumTime = true; } @@ -52,12 +52,12 @@ public: bool TaskReminders() { return m_bTaskReminders;} virtual bool ShowMinimumTime() { return m_bShowMinimumTime;} - virtual void useItemOn(Level *level, std::shared_ptr item, int x, int y, int z, bool bTestUseOnly=false) { } - virtual void useItem(std::shared_ptr item,bool bTestUseOnly=false) { } - virtual void completeUsingItem(std::shared_ptr item) { } + 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(std::shared_ptr item) { } - virtual void onTake(std::shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) { } + 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/UseItemTask.cpp b/Minecraft.Client/Common/Tutorial/UseItemTask.cpp index 8f53f14d..09bac4d1 100644 --- a/Minecraft.Client/Common/Tutorial/UseItemTask.cpp +++ b/Minecraft.Client/Common/Tutorial/UseItemTask.cpp @@ -16,7 +16,7 @@ bool UseItemTask::isCompleted() return bIsCompleted; } -void UseItemTask::useItem(std::shared_ptr item,bool bTestUseOnly) +void UseItemTask::useItem(shared_ptr item,bool bTestUseOnly) { if(bTestUseOnly) return; diff --git a/Minecraft.Client/Common/Tutorial/UseItemTask.h b/Minecraft.Client/Common/Tutorial/UseItemTask.h index 2982412e..46d71be4 100644 --- a/Minecraft.Client/Common/Tutorial/UseItemTask.h +++ b/Minecraft.Client/Common/Tutorial/UseItemTask.h @@ -16,5 +16,5 @@ 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(std::shared_ptr item, bool bTestUseOnly=false); + 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 index 57e67cad..1f4ed4cb 100644 --- a/Minecraft.Client/Common/Tutorial/UseTileTask.cpp +++ b/Minecraft.Client/Common/Tutorial/UseTileTask.cpp @@ -25,7 +25,7 @@ bool UseTileTask::isCompleted() return bIsCompleted; } -void UseTileTask::useItemOn(Level *level, std::shared_ptr item, int x, int y, int z,bool bTestUseOnly) +void UseTileTask::useItemOn(Level *level, shared_ptr item, int x, int y, int z,bool bTestUseOnly) { if(bTestUseOnly) return; diff --git a/Minecraft.Client/Common/Tutorial/UseTileTask.h b/Minecraft.Client/Common/Tutorial/UseTileTask.h index b20c4b84..74b3a40c 100644 --- a/Minecraft.Client/Common/Tutorial/UseTileTask.h +++ b/Minecraft.Client/Common/Tutorial/UseTileTask.h @@ -20,5 +20,5 @@ public: 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, std::shared_ptr item, int x, int y, int z, bool bTestUseOnly=false); + 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/UI/IUIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp index 2bdf8ae9..29ddcf71 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp @@ -73,7 +73,7 @@ void IUIScene_AbstractContainerMenu::Initialize(int iPad, AbstractContainerMenu* m_iCurrSlotX = 0; m_iCurrSlotY = 0; #endif // TAP_DETECTION - // + // // for(int i=0;itouch[0].x)-m_oldvTouchPos.x) * m_fTouchPadMulX; float fNewY=(((float)pTouchPadData->touch[0].y)-m_oldvTouchPos.y) * m_fTouchPadMulY; - // relative positions - needs a deadzone + // relative positions - needs a deadzone if(fNewX>m_fTouchPadDeadZoneX) { @@ -320,11 +320,11 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if(fNewY>m_fTouchPadDeadZoneY) { - vPointerPos.y=m_oldvPointerPos.y+((fNewY-m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + 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)); + vPointerPos.y=m_oldvPointerPos.y+((fNewY+m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); } // Clamp to pointer extents. @@ -334,7 +334,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; bStickInput = true; - m_eCurrTapState=eTapStateNoInput; + m_eCurrTapState=eTapStateNoInput; } else { @@ -408,7 +408,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() fInputX *= fInputScale; fInputY *= fInputScale; -#ifdef USE_POINTER_ACCEL +#ifdef USE_POINTER_ACCEL m_fPointerAccelX += fInputX / 50.0f; m_fPointerAccelY += fInputY / 50.0f; @@ -451,12 +451,12 @@ void IUIScene_AbstractContainerMenu::onMouseTick() else { m_iConsectiveInputTicks = 0; -#ifdef USE_POINTER_ACCEL +#ifdef USE_POINTER_ACCEL m_fPointerVelX = 0.0f; m_fPointerVelY = 0.0f; m_fPointerAccelX = 0.0f; m_fPointerAccelY = 0.0f; -#endif +#endif } #ifdef __ORBIS__ @@ -501,7 +501,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() ( vPointerPos.y >= sectionPos.y ) && ( vPointerPos.y <= itemMax.y ) ) { // Pointer is over this control! - eSectionUnderPointer = eSection; + eSectionUnderPointer = eSection; vSnapPos.x = itemPos.x + ( itemSize.x / 2.0f ); vSnapPos.y = itemPos.y + ( itemSize.y / 2.0f ); @@ -590,7 +590,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() } // If we are not over any slot, set focus elsewhere. - if ( eSectionUnderPointer == eSectionNone ) + if ( eSectionUnderPointer == eSectionNone ) { setFocusToPointer( getPad() ); #ifdef TAP_DETECTION @@ -704,11 +704,11 @@ void IUIScene_AbstractContainerMenu::onMouseTick() // 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. - std::shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; - std::shared_ptr carriedItem = nullptr; + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + shared_ptr carriedItem = nullptr; if(player != NULL) carriedItem = player->inventory->getCarried(); - std::shared_ptr slotItem = nullptr; + shared_ptr slotItem = nullptr; Slot *slot = NULL; int slotIndex = 0; if(bPointerIsOverSlot) @@ -790,7 +790,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() 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 ) + if ( bCarriedIsSameAsSlot ) { // Can we stack more into this slot? if ( iSlotStackSizeRemaining == 0 ) @@ -889,7 +889,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if((eSectionUnderPointer==eSectionInventoryUsing)||(eSectionUnderPointer==eSectionInventoryInventory)) { - std::shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); ArmorRecipes::_eArmorType eArmourType=ArmorRecipes::GetArmorType(item->id); if(eArmourType==ArmorRecipes::eArmorType_None) @@ -919,7 +919,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() else { buttonY = eToolTipQuickMove; - } + } break; case ArmorRecipes::eArmorType_Leggings: if(isSlotEmpty(eSectionInventoryArmor,2)) @@ -952,7 +952,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() else if((eSectionUnderPointer==eSectionFurnaceUsing)||(eSectionUnderPointer==eSectionFurnaceInventory)) { // Get the info on this item. - std::shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); bool bValidFuel = FurnaceTileEntity::isFuel(item); bool bValidIngredient = FurnaceRecipes::getInstance()->getResult(item->getItem()->id) != NULL; @@ -962,7 +962,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if(!isSlotEmpty(eSectionFurnaceIngredient,0)) { // is it the same as this item - std::shared_ptr IngredientItem = getSlotItem(eSectionFurnaceIngredient,0); + shared_ptr IngredientItem = getSlotItem(eSectionFurnaceIngredient,0); if(IngredientItem->id == item->id) { buttonY = eToolTipQuickMoveIngredient; @@ -991,7 +991,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if(!isSlotEmpty(eSectionFurnaceFuel,0)) { // is it the same as this item - std::shared_ptr fuelItem = getSlotItem(eSectionFurnaceFuel,0); + shared_ptr fuelItem = getSlotItem(eSectionFurnaceFuel,0); if(fuelItem->id == item->id) { buttonY = eToolTipQuickMoveFuel; @@ -1002,7 +1002,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if(!isSlotEmpty(eSectionFurnaceIngredient,0)) { // is it the same as this item - std::shared_ptr IngredientItem = getSlotItem(eSectionFurnaceIngredient,0); + shared_ptr IngredientItem = getSlotItem(eSectionFurnaceIngredient,0); if(IngredientItem->id == item->id) { buttonY = eToolTipQuickMoveIngredient; @@ -1044,7 +1044,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() else if((eSectionUnderPointer==eSectionBrewingUsing)||(eSectionUnderPointer==eSectionBrewingInventory)) { // Get the info on this item. - std::shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); int iId=item->id; // valid ingredient? @@ -1062,7 +1062,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if(!isSlotEmpty(eSectionBrewingIngredient,0)) { // is it the same as this item - std::shared_ptr IngredientItem = getSlotItem(eSectionBrewingIngredient,0); + shared_ptr IngredientItem = getSlotItem(eSectionBrewingIngredient,0); if(IngredientItem->id == item->id) { buttonY = eToolTipQuickMoveIngredient; @@ -1077,15 +1077,15 @@ void IUIScene_AbstractContainerMenu::onMouseTick() // 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) || + if(isSlotEmpty(eSectionBrewingBottle1,0) || + isSlotEmpty(eSectionBrewingBottle2,0) || isSlotEmpty(eSectionBrewingBottle3,0)) { buttonY = eToolTipQuickMoveIngredient; @@ -1104,7 +1104,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() else if((eSectionUnderPointer==eSectionEnchantUsing)||(eSectionUnderPointer==eSectionEnchantInventory)) { // Get the info on this item. - std::shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); int iId=item->id; // valid enchantable tool? @@ -1112,8 +1112,8 @@ void IUIScene_AbstractContainerMenu::onMouseTick() { // is there already something in the ingredient slot? if(isSlotEmpty(eSectionEnchantSlot,0)) - { - // tool slot empty + { + // tool slot empty switch(iId) { case Item::bow_Id: @@ -1155,7 +1155,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() buttonY = eToolTipQuickMove; break; default: - buttonY=eToolTipQuickMoveTool; + buttonY=eToolTipQuickMoveTool; break; } } @@ -1163,10 +1163,10 @@ void IUIScene_AbstractContainerMenu::onMouseTick() { buttonY = eToolTipQuickMove; } - } + } else { - buttonY=eToolTipQuickMove; + buttonY=eToolTipQuickMove; } } else @@ -1199,7 +1199,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() SetPointerOutsideMenu( false ); } - std::shared_ptr item = nullptr; + shared_ptr item = nullptr; if(bPointerIsOverSlot && bSlotHasItem) item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); overrideTooltips(eSectionUnderPointer, item, bIsItemCarried, bSlotHasItem, bCarriedIsSameAsSlot, iSlotStackSizeRemaining, buttonA, buttonX, buttonY, buttonRT); @@ -1358,7 +1358,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b } else { - ui.CloseUIScenes(iPad); + ui.CloseUIScenes(iPad); } bHandled = true; @@ -1410,7 +1410,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b bool bSlotHasItem = !isSlotEmpty(m_eCurrSection, currentIndex); if ( bSlotHasItem ) { - std::shared_ptr item = getSlotItem(m_eCurrSection, currentIndex); + shared_ptr item = getSlotItem(m_eCurrSection, currentIndex); if( Minecraft::GetInstance()->localgameModes[iPad] != NULL ) { Tutorial::PopupMessageDetails *message = new Tutorial::PopupMessageDetails; @@ -1456,7 +1456,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b { handleOutsideClicked(iPad, buttonNum, quickKeyHeld); } - else // + else // { // over empty space or something else??? handleOtherClicked(iPad,m_eCurrSection,buttonNum,quickKeyHeld?true:false); @@ -1569,7 +1569,7 @@ int IUIScene_AbstractContainerMenu::getCurrentIndex(ESceneSection eSection) return currentIndex + getSectionStartOffset(eSection); } -bool IUIScene_AbstractContainerMenu::IsSameItemAs(std::shared_ptr itemA, std::shared_ptr itemB) +bool IUIScene_AbstractContainerMenu::IsSameItemAs(shared_ptr itemA, shared_ptr itemB) { if(itemA == NULL || itemB == NULL) return false; @@ -1583,7 +1583,7 @@ int IUIScene_AbstractContainerMenu::GetEmptyStackSpace(Slot *slot) if(slot != NULL && slot->hasItem()) { - std::shared_ptr item = slot->getItem(); + shared_ptr item = slot->getItem(); if ( item->isStackable() ) { int iCount = item->GetCount(); @@ -1614,7 +1614,7 @@ wstring IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slot, vectorgetItem()->getRarity()->color; int colour = app.GetHTMLColour(rarityColour); @@ -1624,7 +1624,7 @@ wstring IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slot, vector%ls",colour,thisString.c_str()); + swprintf(formatted, 256, L"%ls",colour,thisString.c_str()); thisString = formatted; } desc.append( thisString ); diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h index 57bc8253..bdb8bb4c 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h @@ -10,7 +10,7 @@ // Uncomment to enable acceleration on pointer input. //#define USE_POINTER_ACCEL -#define POINTER_INPUT_TIMER_ID (0) // Arbitrary timer ID. +#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 @@ -32,19 +32,19 @@ protected: eSectionContainerInventory, eSectionContainerChest, eSectionContainerMax, - + eSectionFurnaceUsing, eSectionFurnaceInventory, eSectionFurnaceIngredient, eSectionFurnaceFuel, eSectionFurnaceResult, eSectionFurnaceMax, - + eSectionInventoryUsing, eSectionInventoryInventory, eSectionInventoryArmor, eSectionInventoryMax, - + eSectionTrapUsing, eSectionTrapInventory, eSectionTrapTrap, @@ -64,7 +64,7 @@ protected: eSectionInventoryCreativeSlider, #endif eSectionInventoryCreativeMax, - + eSectionEnchantUsing, eSectionEnchantInventory, eSectionEnchantSlot, @@ -151,7 +151,7 @@ protected: // 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; @@ -159,7 +159,7 @@ protected: 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 ); @@ -180,7 +180,7 @@ protected: // 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; @@ -201,15 +201,15 @@ protected: 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 std::shared_ptr getSlotItem(ESceneSection eSection, int iSlot) = 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, std::shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, + 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(std::shared_ptr itemA, std::shared_ptr itemB); + bool IsSameItemAs(shared_ptr itemA, shared_ptr itemB); int GetEmptyStackSpace(Slot *slot); wstring GetItemDescription(Slot *slot, vector &unformattedStrings); diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp index 990e4d6a..81451c7a 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp @@ -245,15 +245,15 @@ void IUIScene_AnvilMenu::updateItemName() ByteArrayOutputStream baos; DataOutputStream dos(&baos); dos.writeUTF(m_itemName); - Minecraft::GetInstance()->localplayers[getPad()]->connection->send(std::shared_ptr(new CustomPayloadPacket(CustomPayloadPacket::SET_ITEM_NAME_PACKET, baos.toByteArray()))); + 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) +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, std::shared_ptr item) +void IUIScene_AnvilMenu::slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item) { if (slotIndex == RepairMenu::INPUT_SLOT) { diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h index aad54abc..6c4348f2 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h @@ -16,7 +16,7 @@ class RepairMenu; class IUIScene_AnvilMenu : public virtual IUIScene_AbstractContainerMenu, public net_minecraft_world_inventory::ContainerListener { protected: - std::shared_ptr m_inventory; + shared_ptr m_inventory; RepairMenu *m_repairMenu; wstring m_itemName; @@ -24,7 +24,7 @@ protected: IUIScene_AnvilMenu(); virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); - int getSectionStartOffset(ESceneSection eSection); + int getSectionStartOffset(ESceneSection eSection); virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); bool IsSectionSlotList( ESceneSection eSection ); @@ -39,7 +39,7 @@ protected: void updateItemName(); // ContainerListenr - void refreshContainer(AbstractContainerMenu *container, vector > *items); - void slotChanged(AbstractContainerMenu *container, int slotIndex, std::shared_ptr item); + 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_CraftingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp index 2c6c69fc..f158b174 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp @@ -91,7 +91,7 @@ IUIScene_CraftingMenu::_eGroupTab IUIScene_CraftingMenu::m_GroupTabBkgMapping3x3 // eBaseItemType_bow, // eBaseItemType_pockettool, // eBaseItemType_utensil, -// +// // } // eBaseItemType; @@ -180,11 +180,11 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) UpdateTooltips(); break; case ACTION_MENU_PAUSEMENU: - case ACTION_MENU_B: + case ACTION_MENU_B: ui.ShowTooltip( iPad, eToolTipButtonX, false ); ui.ShowTooltip( iPad, eToolTipButtonB, false ); - ui.ShowTooltip( iPad, eToolTipButtonA, false ); - ui.ShowTooltip( iPad, eToolTipButtonRB, false ); + ui.ShowTooltip( iPad, eToolTipButtonA, false ); + ui.ShowTooltip( iPad, eToolTipButtonRB, false ); // kill the crafting xui //ui.PlayUISFX(eSFX_Back); ui.CloseUIScenes(iPad); @@ -197,18 +197,18 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) #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); + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); if( pMinecraft->localgameModes[iPad] != NULL) @@ -244,7 +244,7 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) iSlot=0; } int iRecipe= CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; - std::shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); if( pMinecraft->localgameModes[iPad] != NULL ) @@ -256,7 +256,7 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) } } - if(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 @@ -272,7 +272,7 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) { for(int j=0;j ingItemInst = nullptr; + shared_ptr ingItemInst = nullptr; // do we need to remove a specific aux value? if(pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]!=Recipes::ANY_AUX_VALUE) { @@ -291,7 +291,7 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) if (ingItemInst->getItem()->hasCraftingRemainingItem()) { // replace item with remaining result - m_pPlayer->inventory->add( std::shared_ptr( new ItemInstance(ingItemInst->getItem()->getCraftingRemainingItem()) ) ); + m_pPlayer->inventory->add( shared_ptr( new ItemInstance(ingItemInst->getItem()->getCraftingRemainingItem()) ) ); } } @@ -337,7 +337,7 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) break; case ACTION_MENU_LEFT_SCROLL: - // turn off the old group tab + // turn off the old group tab showTabHighlight(m_iGroupIndex,false); if(m_iGroupIndex==0) @@ -431,7 +431,7 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) // clear the indices iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; iVSlotIndexA[1]=0; - iVSlotIndexA[2]=1; + iVSlotIndexA[2]=1; UpdateVerticalSlots(); UpdateHighlight(); @@ -482,13 +482,13 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) else { iVSlotIndexA[1]--; - } + } ui.PlayUISFX(eSFX_Focus); } else if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>2) { - { + { if(m_iCurrentSlotVIndex!=0) { // just move the highlight @@ -496,11 +496,11 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) 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 + // on 0 and went up, so cycle the values if(iVSlotIndexA[0]==0) { iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; @@ -533,7 +533,7 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) { if(bNoScrollSlots) - { + { if(iVSlotIndexA[1]==(CanBeMadeA[m_iCurrentSlotHIndex].iCount-1)) { iVSlotIndexA[1]=0; @@ -574,7 +574,7 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) { m_iCurrentSlotVIndex++; ui.PlayUISFX(eSFX_Focus); - } + } } UpdateVerticalSlots(); UpdateHighlight(); @@ -624,11 +624,11 @@ void IUIScene_CraftingMenu::CheckRecipesAvailable() // for (int i = 0; i < iRecipeC; i++) // { - // std::shared_ptr pTempItemInst=pRecipeIngredientsRequired[i].pRecipy->assemble(NULL); + // 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) @@ -642,7 +642,7 @@ void IUIScene_CraftingMenu::CheckRecipesAvailable() // { // 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()); // } - // + // // } // } // } @@ -683,9 +683,9 @@ void IUIScene_CraftingMenu::CheckRecipesAvailable() 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]) && + 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())) + ((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) @@ -721,18 +721,18 @@ void IUIScene_CraftingMenu::CheckRecipesAvailable() // 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]) && + 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 @@ -761,7 +761,7 @@ void IUIScene_CraftingMenu::CheckRecipesAvailable() if(iHSlotBrushControl<=m_iCraftablesMaxHSlotC) { bool bFound=false; - std::shared_ptr pTempItemInst=pRecipeIngredientsRequired[i].pRecipy->assemble(nullptr); + shared_ptr pTempItemInst=pRecipeIngredientsRequired[i].pRecipy->assemble(nullptr); //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); int iID=pTempItemInst->getItem()->id; int iBaseType; @@ -777,7 +777,7 @@ void IUIScene_CraftingMenu::CheckRecipesAvailable() // 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;k pTempItemInst=pRecipeIngredientsRequired[CanBeMadeA[iIndex].iRecipeA[0]].pRecipy->assemble(nullptr); + shared_ptr pTempItemInst=pRecipeIngredientsRequired[CanBeMadeA[iIndex].iRecipeA[0]].pRecipy->assemble(nullptr); assert(pTempItemInst->id!=0); unsigned int uiAlpha; @@ -844,7 +844,7 @@ void IUIScene_CraftingMenu::CheckRecipesAvailable() uiAlpha = 31; } else - { + { if(pRecipeIngredientsRequired[CanBeMadeA[iIndex].iRecipeA[0]].bCanMake[getPad()]) { uiAlpha = 31; @@ -903,7 +903,7 @@ void IUIScene_CraftingMenu::UpdateHighlight() { iSlot=0; } - std::shared_ptr pTempItemInstAdditional=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].pRecipy->assemble(nullptr); + shared_ptr pTempItemInstAdditional=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].pRecipy->assemble(nullptr); // special case for the torch coal/charcoal int id=pTempItemInstAdditional->getDescriptionId(); @@ -933,10 +933,10 @@ void IUIScene_CraftingMenu::UpdateHighlight() { itemstring=app.GetString( IDS_ITEM_FIREBALLCOAL ); } - } + } break; default: - itemstring=app.GetString(id ); + itemstring=app.GetString(id ); break; } @@ -991,7 +991,7 @@ void IUIScene_CraftingMenu::UpdateVerticalSlots() { if(i!=1) continue; } - std::shared_ptr pTempItemInstAdditional=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iVSlotIndexA[i]]].pRecipy->assemble(nullptr); + shared_ptr pTempItemInstAdditional=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iVSlotIndexA[i]]].pRecipy->assemble(nullptr); assert(pTempItemInstAdditional->id!=0); unsigned int uiAlpha; @@ -1001,7 +1001,7 @@ void IUIScene_CraftingMenu::UpdateVerticalSlots() uiAlpha = 31; } else - { + { if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iVSlotIndexA[i]]].bCanMake[getPad()]) { uiAlpha = 31; @@ -1040,7 +1040,7 @@ void IUIScene_CraftingMenu::DisplayIngredients() hideAllIngredientsSlots(); if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) - { + { int iSlot,iRecipy; if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) { @@ -1057,7 +1057,7 @@ void IUIScene_CraftingMenu::DisplayIngredients() int iBoxWidth=(m_iContainerType==RECIPE_TYPE_2x2)?2:3; int iRecipe=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; bool bCanMakeRecipe = pRecipeIngredientsRequired[iRecipe].bCanMake[getPad()]; - std::shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); m_iIngredientsC=pRecipeIngredientsRequired[iRecipe].iIngC; @@ -1077,7 +1077,7 @@ void IUIScene_CraftingMenu::DisplayIngredients() iAuxVal = 0xFF; } - std::shared_ptr itemInst= std::shared_ptr(new ItemInstance(item,pRecipeIngredientsRequired[iRecipe].iIngValA[i],iAuxVal)); + shared_ptr itemInst= shared_ptr(new ItemInstance(item,pRecipeIngredientsRequired[iRecipe].iIngValA[i],iAuxVal)); setIngredientDescriptionItem(getPad(),i,itemInst); setIngredientDescriptionRedBox(i,false); @@ -1124,13 +1124,13 @@ void IUIScene_CraftingMenu::DisplayIngredients() } } - for (int x = 0; x < iBoxWidth; x++) + for (int x = 0; x < iBoxWidth; x++) { - for (int y = 0; y < iBoxWidth; y++) + for (int y = 0; y < iBoxWidth; y++) { int index = x+y*iBoxWidth; if(pRecipeIngredientsRequired[iRecipy].uiGridA[x+y*3]!=0) - { + { int id=pRecipeIngredientsRequired[iRecipy].uiGridA[x+y*3]&0x00FFFFFF; assert(id!=0); int iAuxVal=(pRecipeIngredientsRequired[iRecipy].uiGridA[x+y*3]&0xFF000000)>>24; @@ -1141,7 +1141,7 @@ void IUIScene_CraftingMenu::DisplayIngredients() { iAuxVal = 0xFF; } - std::shared_ptr itemInst= std::shared_ptr(new ItemInstance(id,1,iAuxVal)); + 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<getRecipeIngredientsArray(); if(bCanBeMade) - { + { int iSlot;//,iRecipy; if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) { @@ -1218,7 +1218,7 @@ void IUIScene_CraftingMenu::UpdateDescriptionText(bool bCanBeMade) //iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[0]; } - std::shared_ptr pTempItemInst=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].pRecipy->assemble(nullptr); + shared_ptr pTempItemInst=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].pRecipy->assemble(nullptr); int iID=pTempItemInst->getItem()->id; int iAuxVal=pTempItemInst->getAuxValue(); int iBaseType; @@ -1278,13 +1278,13 @@ void IUIScene_CraftingMenu::UpdateDescriptionText(bool bCanBeMade) #ifdef _DEBUG setDescriptionText(L"This is some placeholder description text about the craftable item."); #else - setDescriptionText(L""); + setDescriptionText(L""); #endif - } + } } else { - setDescriptionText(L""); + setDescriptionText(L""); } } @@ -1308,7 +1308,7 @@ void IUIScene_CraftingMenu::UpdateTooltips() { iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; } - else + else { iSlot=0; } @@ -1348,7 +1348,7 @@ void IUIScene_CraftingMenu::UpdateTooltips() { iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; } - else + else { iSlot=0; } @@ -1372,7 +1372,7 @@ 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(); diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h index c3ee07ba..05227fff 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h @@ -22,7 +22,7 @@ protected: static const int m_iMaxHSlotC = 12; static const int m_iMaxHCraftingSlotC = 10; - static const int m_iMaxVSlotC = 17; + static const int m_iMaxVSlotC = 17; static const int m_iMaxDisplayedVSlotC = 3; static const int m_iIngredients3x3SlotC = 9; static const int m_iIngredients2x2SlotC = 4; @@ -35,7 +35,7 @@ protected: static int m_iBaseTypeMapA[Item::eBaseItemType_MAXTYPES]; - typedef struct + typedef struct { int iCount; int iItemBaseType; @@ -49,7 +49,7 @@ protected: int m_iCurrentSlotVIndex; int m_iRecipeC; int m_iContainerType; // 2x2 or 3x3 - std::shared_ptr m_pPlayer; + shared_ptr m_pPlayer; int m_iGroupIndex; int iVSlotIndexA[3]; // index of the v slots currently displayed @@ -59,7 +59,7 @@ protected: static Recipy::_eGroupType m_GroupTypeMapping9GridA[m_iMaxGroup3x3]; Recipy::_eGroupType *m_pGroupA; - static LPCWSTR m_GroupTabNameA[3]; + static LPCWSTR m_GroupTabNameA[3]; static _eGroupTab m_GroupTabBkgMapping2x2A[m_iMaxGroup2x2]; static _eGroupTab m_GroupTabBkgMapping3x3A[m_iMaxGroup3x3]; _eGroupTab *m_pGroupTabA; @@ -96,13 +96,13 @@ protected: virtual void hideAllHSlots() = 0; virtual void hideAllVSlots() = 0; virtual void hideAllIngredientsSlots() = 0; - virtual void setCraftHSlotItem(int iPad, int iIndex, std::shared_ptr item, unsigned int uiAlpha) = 0; - virtual void setCraftVSlotItem(int iPad, int iIndex, std::shared_ptr item, unsigned int uiAlpha) = 0; - virtual void setCraftingOutputSlotItem(int iPad, std::shared_ptr item) = 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, std::shared_ptr item) = 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, std::shared_ptr item) = 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; diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp index 0ab9a672..7ce33234 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp @@ -12,16 +12,16 @@ // 4J JEV - Images for each tab. IUIScene_CreativeMenu::TabSpec **IUIScene_CreativeMenu::specs = NULL; -vector< std::shared_ptr > IUIScene_CreativeMenu::categoryGroups[eCreativeInventoryGroupsCount]; +vector< shared_ptr > IUIScene_CreativeMenu::categoryGroups[eCreativeInventoryGroupsCount]; -#define ITEM(id) list->push_back( std::shared_ptr(new ItemInstance(id, 1, 0)) ); -#define ITEM_AUX(id, aux) list->push_back( std::shared_ptr(new ItemInstance(id, 1, aux)) ); +#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< std::shared_ptr > *list; + vector< shared_ptr > *list; // Building Blocks @@ -56,7 +56,7 @@ void IUIScene_CreativeMenu::staticCtor() 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_AUX(Tile::treeTrunk_Id, TreeTile::JUNGLE_TRUNK) ITEM(Tile::gravel_Id) ITEM(Tile::redBrick_Id) ITEM(Tile::mossStone_Id) @@ -118,7 +118,7 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Tile::sponge_Id) ITEM(Tile::melon_Id) ITEM(Tile::pumpkin_Id) - ITEM(Tile::litPumpkin_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) @@ -232,7 +232,7 @@ void IUIScene_CreativeMenu::staticCtor() 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_lava_Id) ITEM(Item::bucket_water_Id) ITEM(Item::milk_Id) ITEM(Item::cauldron_Id) @@ -292,7 +292,7 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::beef_cooked_Id) ITEM(Item::beef_raw_Id) ITEM(Item::chicken_raw_Id) - ITEM(Item::chicken_cooked_Id) + ITEM(Item::chicken_cooked_Id) ITEM(Item::rotten_flesh_Id) ITEM(Item::spiderEye_Id) ITEM(Item::potato_Id) @@ -314,7 +314,7 @@ void IUIScene_CreativeMenu::staticCtor() 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) @@ -325,7 +325,7 @@ void IUIScene_CreativeMenu::staticCtor() 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) @@ -336,7 +336,7 @@ void IUIScene_CreativeMenu::staticCtor() 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) @@ -384,7 +384,7 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::brick_Id) ITEM(Item::netherbrick_Id) ITEM(Item::stick_Id) - ITEM(Item::bowl_Id) + ITEM(Item::bowl_Id) ITEM(Item::bone_Id) ITEM(Item::string_Id) ITEM(Item::feather_Id) @@ -393,13 +393,13 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::sulphur_Id) ITEM(Item::clay_Id) ITEM(Item::yellowDust_Id) - ITEM(Item::seeds_wheat_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::sugar_Id) ITEM(Item::slimeBall_Id) ITEM(Item::blazeRod_Id) ITEM(Item::goldNugget_Id) @@ -432,7 +432,7 @@ void IUIScene_CreativeMenu::staticCtor() 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,0) // Water bottle //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_TYPE_AWKWARD)) // Awkward Potion @@ -464,7 +464,7 @@ void IUIScene_CreativeMenu::staticCtor() //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)) @@ -579,7 +579,7 @@ IUIScene_CreativeMenu::IUIScene_CreativeMenu() m_creativeSlotX = m_creativeSlotY = m_inventorySlotX = m_inventorySlotY = 0; // 4J JEV - Settup Tabs - for (int i = 0; i < eCreativeInventoryTab_COUNT; i++) + for (int i = 0; i < eCreativeInventoryTab_COUNT; i++) { m_tabDynamicPos[i] = 0; m_tabPage[i] = 0; @@ -594,7 +594,7 @@ void IUIScene_CreativeMenu::switchTab(ECreativeInventoryTabs 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]); @@ -605,7 +605,7 @@ void IUIScene_CreativeMenu::switchTab(ECreativeInventoryTabs tab) 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; @@ -708,10 +708,10 @@ unsigned int IUIScene_CreativeMenu::TabSpec::getPageCount() // 4J JEV - Item Picker Menu -IUIScene_CreativeMenu::ItemPickerMenu::ItemPickerMenu( std::shared_ptr smp, std::shared_ptr inv ) : AbstractContainerMenu() +IUIScene_CreativeMenu::ItemPickerMenu::ItemPickerMenu( shared_ptr smp, shared_ptr inv ) : AbstractContainerMenu() { inventory = inv; - creativeContainer = smp; + creativeContainer = smp; //int startLength = slots->size(); @@ -734,7 +734,7 @@ IUIScene_CreativeMenu::ItemPickerMenu::ItemPickerMenu( std::shared_ptr player) +bool IUIScene_CreativeMenu::ItemPickerMenu::stillValid(shared_ptr player) { return true; } @@ -752,7 +752,7 @@ IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionA switch( eSection ) { case eSectionInventoryCreativeSelector: - if (eTapDirection == eTapStateDown || eTapDirection == eTapStateUp) + if (eTapDirection == eTapStateDown || eTapDirection == eTapStateUp) { newSection = eSectionInventoryCreativeUsing; } @@ -794,7 +794,7 @@ bool IUIScene_CreativeMenu::handleValidKeyPress(int iPad, int buttonNum, BOOL qu Minecraft *pMinecraft = Minecraft::GetInstance(); for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) { - std::shared_ptr newItem = m_menu->getSlot(i)->getItem(); + shared_ptr newItem = m_menu->getSlot(i)->getItem(); if(newItem != NULL) { @@ -813,7 +813,7 @@ void IUIScene_CreativeMenu::handleOutsideClicked(int iPad, int buttonNum, BOOL q // Drop items. Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr playerInventory = pMinecraft->localplayers[iPad]->inventory; + shared_ptr playerInventory = pMinecraft->localplayers[iPad]->inventory; if (playerInventory->getCarried() != NULL) { if (buttonNum == 0) @@ -823,7 +823,7 @@ void IUIScene_CreativeMenu::handleOutsideClicked(int iPad, int buttonNum, BOOL q } if (buttonNum == 1) { - std::shared_ptr removedItem = playerInventory->getCarried()->remove(1); + shared_ptr removedItem = playerInventory->getCarried()->remove(1); pMinecraft->localgameModes[iPad]->handleCreativeModeItemDrop(removedItem); if (playerInventory->getCarried()->count == 0) playerInventory->setCarried(nullptr); } @@ -841,7 +841,7 @@ void IUIScene_CreativeMenu::handleAdditionalKeyPress(int iAction) 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; @@ -894,9 +894,9 @@ void IUIScene_CreativeMenu::handleSlotListClicked(ESceneSection eSection, int bu if (buttonNum == 0) { - std::shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; - std::shared_ptr carried = playerInventory->getCarried(); - std::shared_ptr clicked = m_menu->getSlot(currentIndex)->getItem(); + 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)); @@ -928,7 +928,7 @@ void IUIScene_CreativeMenu::handleSlotListClicked(ESceneSection eSection, int bu quickKeyHeld = FALSE; } m_menu->clicked(currentIndex, buttonNum, quickKeyHeld?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, pMinecraft->localplayers[getPad()]); - std::shared_ptr newItem = m_menu->getSlot(currentIndex)->getItem(); + 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); @@ -941,7 +941,7 @@ void IUIScene_CreativeMenu::handleSlotListClicked(ESceneSection eSection, int bu m_iCurrSlotX = m_creativeSlotX; m_iCurrSlotY = m_creativeSlotY; - std::shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; + shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; playerInventory->setCarried(nullptr); m_bCarryingCreativeItem = false; } @@ -970,14 +970,14 @@ bool IUIScene_CreativeMenu::CanHaveFocus( ESceneSection eSection ) return false; } -bool IUIScene_CreativeMenu::getEmptyInventorySlot(std::shared_ptr item, int &slotX) +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) { - std::shared_ptr slotItem = m_menu->getSlot(i)->getItem(); + shared_ptr slotItem = m_menu->getSlot(i)->getItem(); if( slotItem != NULL && slotItem->sameItem(item) && (slotItem->GetCount() + item->GetCount() <= item->getMaxStackSize() )) { sameItemFound = true; @@ -1020,7 +1020,7 @@ int IUIScene_CreativeMenu::getSectionStartOffset(ESceneSection eSection) return offset; } -bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, std::shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, +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; diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h index 46370773..7ab3ff7e 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h @@ -74,21 +74,21 @@ public: class ItemPickerMenu : public AbstractContainerMenu { protected: - std::shared_ptr creativeContainer; - std::shared_ptr inventory; + shared_ptr creativeContainer; + shared_ptr inventory; public: - ItemPickerMenu( std::shared_ptr creativeContainer, std::shared_ptr inventory ); + ItemPickerMenu( shared_ptr creativeContainer, shared_ptr inventory ); - virtual bool stillValid(std::shared_ptr player); + 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, std::shared_ptr player) { } // do nothing + virtual void loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, shared_ptr player) { } // do nothing } *itemPickerMenu; protected: - static vector< std::shared_ptr > categoryGroups[eCreativeInventoryGroupsCount]; + static vector< shared_ptr > categoryGroups[eCreativeInventoryGroupsCount]; // 4J JEV - Tabs static TabSpec **specs; @@ -112,11 +112,11 @@ protected: 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(std::shared_ptr item, int &slotX); + 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, std::shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, + 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_TradingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp index cd99cb79..658bcdfb 100644 --- a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp @@ -16,7 +16,7 @@ IUIScene_TradingMenu::IUIScene_TradingMenu() m_bHasUpdatedOnce = false; } -std::shared_ptr IUIScene_TradingMenu::getMerchant() +shared_ptr IUIScene_TradingMenu::getMerchant() { return m_merchant; } @@ -46,11 +46,11 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) switch(iAction) { - case ACTION_MENU_B: + case ACTION_MENU_B: ui.ShowTooltip( iPad, eToolTipButtonX, false ); ui.ShowTooltip( iPad, eToolTipButtonB, false ); - ui.ShowTooltip( iPad, eToolTipButtonA, false ); - ui.ShowTooltip( iPad, eToolTipButtonRB, false ); + ui.ShowTooltip( iPad, eToolTipButtonA, false ); + ui.ShowTooltip( iPad, eToolTipButtonRB, false ); // kill the crafting xui //ui.PlayUISFX(eSFX_Back); ui.CloseUIScenes(iPad); @@ -70,9 +70,9 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) if(!activeRecipe->isDeprecated()) { // Do we have the ingredients? - std::shared_ptr buyAItem = activeRecipe->getBuyAItem(); - std::shared_ptr buyBItem = activeRecipe->getBuyBItem(); - std::shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + 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) ) @@ -84,7 +84,7 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) player->inventory->removeResources(buyBItem); // Add the item we have purchased - std::shared_ptr result = activeRecipe->getSellItem()->copy(); + shared_ptr result = activeRecipe->getSellItem()->copy(); if(!player->inventory->add( result ) ) { player->drop(result); @@ -92,7 +92,7 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) // Send a packet to the server int actualShopItem = m_activeOffers.at(selectedShopItem).second; - player->connection->send( std::shared_ptr( new TradeItemPacket(m_menu->containerId, actualShopItem) ) ); + player->connection->send( shared_ptr( new TradeItemPacket(m_menu->containerId, actualShopItem) ) ); updateDisplay(); } @@ -149,7 +149,7 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) ByteArrayOutputStream rawOutput; DataOutputStream output(&rawOutput); output.writeInt(actualShopItem); - Minecraft::GetInstance()->getConnection(getPad())->send(std::shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_SELECTION_PACKET, rawOutput.toByteArray()))); + Minecraft::GetInstance()->getConnection(getPad())->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_SELECTION_PACKET, rawOutput.toByteArray()))); } } return handled; @@ -203,7 +203,7 @@ void IUIScene_TradingMenu::updateDisplay() ByteArrayOutputStream rawOutput; DataOutputStream output(&rawOutput); output.writeInt(firstValidTrade); - Minecraft::GetInstance()->getConnection(getPad())->send(std::shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_SELECTION_PACKET, rawOutput.toByteArray()))); + Minecraft::GetInstance()->getConnection(getPad())->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_SELECTION_PACKET, rawOutput.toByteArray()))); } } @@ -247,9 +247,9 @@ void IUIScene_TradingMenu::updateDisplay() vector unformattedStrings; wstring offerDescription = GetItemDescription(activeRecipe->getSellItem(), unformattedStrings); setOfferDescription(offerDescription, unformattedStrings); - - std::shared_ptr buyAItem = activeRecipe->getBuyAItem(); - std::shared_ptr buyBItem = activeRecipe->getBuyBItem(); + + shared_ptr buyAItem = activeRecipe->getBuyAItem(); + shared_ptr buyBItem = activeRecipe->getBuyBItem(); setRequest1Item(buyAItem); setRequest2Item(buyBItem); @@ -262,7 +262,7 @@ void IUIScene_TradingMenu::updateDisplay() bool canMake = true; - std::shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; int buyAMatches = player->inventory->countMatches(buyAItem); if(buyAMatches > 0) { @@ -321,10 +321,10 @@ bool IUIScene_TradingMenu::canMake(MerchantRecipe *recipe) { if(recipe->isDeprecated()) return false; - std::shared_ptr buyAItem = recipe->getBuyAItem(); - std::shared_ptr buyBItem = recipe->getBuyBItem(); + shared_ptr buyAItem = recipe->getBuyAItem(); + shared_ptr buyBItem = recipe->getBuyBItem(); - std::shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; int buyAMatches = player->inventory->countMatches(buyAItem); if(buyAMatches > 0) { @@ -349,19 +349,19 @@ bool IUIScene_TradingMenu::canMake(MerchantRecipe *recipe) } -void IUIScene_TradingMenu::setRequest1Item(std::shared_ptr item) +void IUIScene_TradingMenu::setRequest1Item(shared_ptr item) { } -void IUIScene_TradingMenu::setRequest2Item(std::shared_ptr item) +void IUIScene_TradingMenu::setRequest2Item(shared_ptr item) { } -void IUIScene_TradingMenu::setTradeItem(int index, std::shared_ptr item) +void IUIScene_TradingMenu::setTradeItem(int index, shared_ptr item) { } -wstring IUIScene_TradingMenu::GetItemDescription(std::shared_ptr item, vector &unformattedStrings) +wstring IUIScene_TradingMenu::GetItemDescription(shared_ptr item, vector &unformattedStrings) { if(item == NULL) return L""; diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h index b02f1a8b..c8edda67 100644 --- a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h @@ -7,7 +7,7 @@ class IUIScene_TradingMenu { protected: MerchantMenu *m_menu; - std::shared_ptr m_merchant; + shared_ptr m_merchant; vector< pair > m_activeOffers; int m_validOffersCount; @@ -39,20 +39,20 @@ protected: 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(std::shared_ptr item); - virtual void setRequest2Item(std::shared_ptr item); - virtual void setTradeItem(int index, std::shared_ptr item); + 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(std::shared_ptr item, vector &unformattedStrings); + wstring GetItemDescription(shared_ptr item, vector &unformattedStrings); public: - std::shared_ptr getMerchant(); + shared_ptr getMerchant(); virtual int getPad() = 0; }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp index e27c36da..858a8b43 100644 --- a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp @@ -126,7 +126,7 @@ void UIComponent_TutorialPopup::handleTimerComplete(int id) } 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; @@ -204,12 +204,12 @@ wstring UIComponent_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, wstring temp(desc); bool isFixedIcon = false; - + m_iconIsFoil = isFoil; if( icon != TUTORIAL_NO_ICON ) { m_iconIsFoil = false; - m_iconItem = std::shared_ptr(new ItemInstance(icon,1,iAuxVal)); + m_iconItem = shared_ptr(new ItemInstance(icon,1,iAuxVal)); } else { @@ -238,72 +238,72 @@ wstring UIComponent_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, { iAuxVal = 0; } - m_iconItem = std::shared_ptr(new ItemInstance(iconId,1,iAuxVal)); + 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 = std::shared_ptr(new ItemInstance(Tile::workBench_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::workBench_Id,1,0)); } else if(temp.find(L"{*SticksIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::stick_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::stick_Id,1,0)); } else if(temp.find(L"{*PlanksIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Tile::wood_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::wood_Id,1,0)); } else if(temp.find(L"{*WoodenShovelIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::shovel_wood_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::shovel_wood_Id,1,0)); } else if(temp.find(L"{*WoodenHatchetIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::hatchet_wood_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::hatchet_wood_Id,1,0)); } else if(temp.find(L"{*WoodenPickaxeIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::pickAxe_wood_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::pickAxe_wood_Id,1,0)); } else if(temp.find(L"{*FurnaceIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Tile::furnace_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::furnace_Id,1,0)); } else if(temp.find(L"{*WoodenDoorIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::door_wood,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::door_wood,1,0)); } else if(temp.find(L"{*TorchIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Tile::torch_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::torch_Id,1,0)); } else if(temp.find(L"{*BoatIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::boat_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::boat_Id,1,0)); } else if(temp.find(L"{*FishingRodIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::fishingRod_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::fishingRod_Id,1,0)); } else if(temp.find(L"{*FishIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::fish_raw_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::fish_raw_Id,1,0)); } else if(temp.find(L"{*MinecartIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Item::minecart_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Item::minecart_Id,1,0)); } else if(temp.find(L"{*RailIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Tile::rail_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::rail_Id,1,0)); } else if(temp.find(L"{*PoweredRailIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Tile::goldenRail_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::goldenRail_Id,1,0)); } else if(temp.find(L"{*StructuresIcon*}")!=wstring::npos) { @@ -317,7 +317,7 @@ wstring UIComponent_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, } else if(temp.find(L"{*StoneIcon*}")!=wstring::npos) { - m_iconItem = std::shared_ptr(new ItemInstance(Tile::rock_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::rock_Id,1,0)); } else { @@ -358,7 +358,7 @@ wstring UIComponent_TutorialPopup::_SetImage(wstring &desc) // hide the icon slot m_image.SetShow( FALSE ); } - + BOOL imageShowAtEnd = m_image.IsShown(); if(imageShowAtStart != imageShowAtEnd) { diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h index 036fc148..36f78300 100644 --- a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h @@ -15,7 +15,7 @@ private: bool m_lastSceneMovedLeft; bool m_bAllowFade; Tutorial *m_tutorial; - std::shared_ptr m_iconItem; + shared_ptr m_iconItem; bool m_iconIsFoil; //int m_iLocalPlayerC; diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp index 32086f39..ef7c0e94 100644 --- a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp @@ -100,7 +100,7 @@ void UIControl_EnchantmentBook::tickBook() { UIScene_EnchantingMenu *m_containerScene = (UIScene_EnchantingMenu *)m_parentScene; EnchantmentMenu *menu = m_containerScene->getMenu(); - std::shared_ptr current = menu->getSlot(0)->getItem(); + shared_ptr current = menu->getSlot(0)->getItem(); if (!ItemInstance::matches(current, last)) { last = current; @@ -122,7 +122,7 @@ void UIControl_EnchantmentBook::tickBook() { shouldBeOpen = true; } - } + } if (shouldBeOpen) open += 0.2f; else open -= 0.2f; diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h index 5cd78a89..cbe2cf2b 100644 --- a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h @@ -19,7 +19,7 @@ private: //BOOL m_bDirty; //float m_fScale,m_fAlpha; //int m_iPad; - std::shared_ptr last; + shared_ptr last; //float m_fScreenWidth,m_fScreenHeight; //float m_fRawWidth,m_fRawHeight; diff --git a/Minecraft.Client/Common/UI/UIScene.cpp b/Minecraft.Client/Common/UI/UIScene.cpp index 86a9c3e6..75eb3dcf 100644 --- a/Minecraft.Client/Common/UI/UIScene.cpp +++ b/Minecraft.Client/Common/UI/UIScene.cpp @@ -597,7 +597,7 @@ void UIScene::customDraw(IggyCustomDrawCallbackRegion *region) app.DebugPrintf("Handling custom draw for scene with no override!\n"); } -void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iPad, std::shared_ptr item, float fAlpha, bool isFoil, bool bDecorations) +void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations) { if (item!= NULL) { @@ -608,7 +608,7 @@ void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iP //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(); - std::shared_ptr oldPlayer = pMinecraft->player; + 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 @@ -688,7 +688,7 @@ void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iP //Make sure that pMinecraft->player is the correct player so that player specific rendering // eg clock and compass, are rendered correctly - std::shared_ptr oldPlayer = pMinecraft->player; + 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); @@ -701,7 +701,7 @@ void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iP } } -void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, std::shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer) +void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer) { Minecraft *pMinecraft=Minecraft::GetInstance(); diff --git a/Minecraft.Client/Common/UI/UIScene.h b/Minecraft.Client/Common/UI/UIScene.h index d9490a82..1b646ce0 100644 --- a/Minecraft.Client/Common/UI/UIScene.h +++ b/Minecraft.Client/Common/UI/UIScene.h @@ -187,7 +187,7 @@ public: 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, std::shared_ptr item, 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; @@ -196,14 +196,14 @@ private: typedef struct _CachedSlotDrawData { CustomDrawData *customDrawRegion; - std::shared_ptr item; + shared_ptr item; float fAlpha; bool isFoil; bool bDecorations; } CachedSlotDrawData; vector m_cachedSlotDraw; - void _customDrawSlotControl(CustomDrawData *region, int iPad, std::shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer); + void _customDrawSlotControl(CustomDrawData *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer); public: // INPUT diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp index 126f2403..7823fb4e 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp @@ -49,7 +49,7 @@ void UIScene_AbstractContainerMenu::handleDestroy() } // 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) + // 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); @@ -90,7 +90,7 @@ void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex) // 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 ); + XuiElementGetBounds( m_pointerControl->m_hObj, &fPointerWidth, &fPointerHeight ); #else fPointerWidth = 50; fPointerHeight = 50; @@ -103,7 +103,7 @@ void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex) // 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; @@ -111,9 +111,9 @@ void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex) #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,) + //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; @@ -161,13 +161,13 @@ void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex) 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); + S32 y = m_pointerPos.y*((float)height/m_movieHeight); IggyMakeEventMouseMove( &mouseEvent, x, y); IggyEventResult result; IggyPlayerDispatchEventRS ( getMovie() , &mouseEvent , &result ); -#ifdef USE_POINTER_ACCEL +#ifdef USE_POINTER_ACCEL m_fPointerVelX = 0.0f; m_fPointerVelY = 0.0f; m_fPointerAccelX = 0.0f; @@ -332,9 +332,9 @@ void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *reg Minecraft *pMinecraft = Minecraft::GetInstance(); if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; - std::shared_ptr item = nullptr; + shared_ptr item = nullptr; if(wcscmp((wchar_t *)region->name,L"pointerIcon")==0) - { + { m_cacheSlotRenders = false; item = pMinecraft->localplayers[m_iPad]->inventory->getCarried(); } @@ -347,7 +347,7 @@ void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *reg 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(); @@ -398,7 +398,7 @@ void UIScene_AbstractContainerMenu::setFocusToPointer(int iPad) m_focusSection = eSectionNone; } -std::shared_ptr UIScene_AbstractContainerMenu::getSlotItem(ESceneSection eSection, int iSlot) +shared_ptr UIScene_AbstractContainerMenu::getSlotItem(ESceneSection eSection, int iSlot) { Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot ); if(slot) return slot->getItem(); diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h index f4411b00..26688dc5 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h @@ -31,7 +31,7 @@ protected: 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(); @@ -49,7 +49,7 @@ protected: virtual void setSectionFocus(ESceneSection eSection, int iPad); void setFocusToPointer(int iPad); void SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot); - virtual std::shared_ptr getSlotItem(ESceneSection eSection, int iSlot); + virtual shared_ptr getSlotItem(ESceneSection eSection, int iSlot); virtual bool isSlotEmpty(ESceneSection eSection, int iSlot); virtual void adjustPointerForSafeZone(); @@ -57,7 +57,7 @@ protected: public: virtual void tick(); - + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewpBort); virtual void customDraw(IggyCustomDrawCallbackRegion *region); diff --git a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h index 13c8b1de..5441a1ac 100644 --- a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h @@ -8,7 +8,7 @@ class InventoryMenu; class UIScene_BrewingStandMenu : public UIScene_AbstractContainerMenu, public IUIScene_BrewingMenu { private: - std::shared_ptr m_brewingStand; + shared_ptr m_brewingStand; public: UIScene_BrewingStandMenu(int iPad, void *initData, UILayer *parentLayer); diff --git a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp index 1be78ad6..5b729069 100644 --- a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp @@ -51,7 +51,7 @@ UIScene_CraftingMenu::UIScene_CraftingMenu(int iPad, void *_initData, UILayer *p // 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); + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); } XuiElementSetShow(m_hGrid,TRUE); @@ -76,7 +76,7 @@ UIScene_CraftingMenu::UIScene_CraftingMenu(int iPad, void *_initData, UILayer *p #if TO_BE_IMPLEMENTED - // display the first group tab + // display the first group tab m_hTabGroupA[m_iGroupIndex].SetShow(TRUE); // store the slot 0 position @@ -196,7 +196,7 @@ void UIScene_CraftingMenu::handleDestroy() 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) + // 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); @@ -297,7 +297,7 @@ void UIScene_CraftingMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int else { iVSlotIndexA[1]--; - } + } ui.PlayUISFX(eSFX_Focus); UpdateVerticalSlots(); @@ -349,7 +349,7 @@ void UIScene_CraftingMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int // clear the indices iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; iVSlotIndexA[1]=0; - iVSlotIndexA[2]=1; + iVSlotIndexA[2]=1; UpdateVerticalSlots(); UpdateHighlight(); @@ -435,7 +435,7 @@ void UIScene_CraftingMenu::customDraw(IggyCustomDrawCallbackRegion *region) Minecraft *pMinecraft = Minecraft::GetInstance(); if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; - std::shared_ptr item = nullptr; + shared_ptr item = nullptr; int slotId = -1; float alpha = 1.0f; bool decorations = true; @@ -606,21 +606,21 @@ void UIScene_CraftingMenu::hideAllIngredientsSlots() } } -void UIScene_CraftingMenu::setCraftHSlotItem(int iPad, int iIndex, std::shared_ptr item, unsigned int uiAlpha) +void UIScene_CraftingMenu::setCraftHSlotItem(int iPad, int iIndex, shared_ptr 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, std::shared_ptr item, unsigned int uiAlpha) +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, std::shared_ptr item) +void UIScene_CraftingMenu::setCraftingOutputSlotItem(int iPad, shared_ptr item) { m_craftingOutputSlotInfo.item = item; m_craftingOutputSlotInfo.alpha = 31; @@ -632,7 +632,7 @@ void UIScene_CraftingMenu::setCraftingOutputSlotRedBox(bool show) m_slotListCraftingOutput.showSlotRedBox(0,show); } -void UIScene_CraftingMenu::setIngredientSlotItem(int iPad, int index, std::shared_ptr item) +void UIScene_CraftingMenu::setIngredientSlotItem(int iPad, int index, shared_ptr item) { m_ingredientsSlotsInfo[index].item = item; m_ingredientsSlotsInfo[index].alpha = 31; @@ -644,7 +644,7 @@ void UIScene_CraftingMenu::setIngredientSlotRedBox(int index, bool show) m_slotListIngredientsLayout.showSlotRedBox(index,show); } -void UIScene_CraftingMenu::setIngredientDescriptionItem(int iPad, int index, std::shared_ptr item) +void UIScene_CraftingMenu::setIngredientDescriptionItem(int iPad, int index, shared_ptr item) { m_ingredientsInfo[index].item = item; m_ingredientsInfo[index].alpha = 31; @@ -680,7 +680,7 @@ void UIScene_CraftingMenu::setShowCraftHSlot(int iIndex, bool show) void UIScene_CraftingMenu::showTabHighlight(int iIndex, bool show) { if(show) - { + { IggyDataValue result; IggyDataValue value[1]; @@ -729,7 +729,7 @@ void UIScene_CraftingMenu::scrollDescriptionDown() void UIScene_CraftingMenu::updateHighlightAndScrollPositions() { - { + { IggyDataValue result; IggyDataValue value[2]; diff --git a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h index dffd4273..44a39d61 100644 --- a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h @@ -32,7 +32,7 @@ class UIScene_CraftingMenu : public UIScene, public IUIScene_CraftingMenu private: typedef struct _SlotInfo { - std::shared_ptr item; + shared_ptr item; unsigned int alpha; bool show; @@ -97,7 +97,7 @@ protected: ETouchInput_TouchPanel_5, ETouchInput_TouchPanel_6, ETouchInput_CraftingHSlots, - + ETouchInput_Count, }; UIControl_Touch m_TouchInput[ETouchInput_Count]; @@ -182,13 +182,13 @@ protected: virtual void hideAllHSlots(); virtual void hideAllVSlots(); virtual void hideAllIngredientsSlots(); - virtual void setCraftHSlotItem(int iPad, int iIndex, std::shared_ptr item, unsigned int uiAlpha); - virtual void setCraftVSlotItem(int iPad, int iIndex, std::shared_ptr item, unsigned int uiAlpha); - virtual void setCraftingOutputSlotItem(int iPad, std::shared_ptr item); + 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, std::shared_ptr item); + virtual void setIngredientSlotItem(int iPad, int index, shared_ptr item); virtual void setIngredientSlotRedBox(int index, bool show); - virtual void setIngredientDescriptionItem(int iPad, int index, std::shared_ptr item); + 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); diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp index 85441877..569cc8ba 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp @@ -21,7 +21,7 @@ UIScene_CreativeMenu::UIScene_CreativeMenu(int iPad, void *_initData, UILayer *p InventoryScreenInput *initData = (InventoryScreenInput *)_initData; - std::shared_ptr creativeContainer = std::shared_ptr(new SimpleContainer( 0, TabSpec::MAX_SIZE )); + 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); @@ -96,7 +96,7 @@ void UIScene_CreativeMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int { // 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; @@ -105,7 +105,7 @@ void UIScene_CreativeMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int // 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; @@ -208,7 +208,7 @@ void UIScene_CreativeMenu::handleInput(int iPad, int key, bool repeat, bool pres 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; diff --git a/Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp b/Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp index 2dcdf8fe..44a7e6c5 100644 --- a/Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp +++ b/Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp @@ -127,7 +127,7 @@ void UIScene_DebugOverlay::customDraw(IggyCustomDrawCallbackRegion *region) } else { - std::shared_ptr item = std::shared_ptr( new ItemInstance(itemId,1,0) ); + shared_ptr item = shared_ptr( new ItemInstance(itemId,1,0) ); if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,false,false); } } @@ -176,7 +176,7 @@ void UIScene_DebugOverlay::handlePress(F64 controlId, F64 childId) { int id = childId; if(id m_furnace; + shared_ptr m_furnace; public: UIScene_FurnaceMenu(int iPad, void *initData, UILayer *parentLayer); diff --git a/Minecraft.Client/Common/UI/UIScene_HUD.cpp b/Minecraft.Client/Common/UI/UIScene_HUD.cpp index 37b433cf..27eeb76b 100644 --- a/Minecraft.Client/Common/UI/UIScene_HUD.cpp +++ b/Minecraft.Client/Common/UI/UIScene_HUD.cpp @@ -161,7 +161,7 @@ void UIScene_HUD::tick() } else { - std::shared_ptr boss = EnderDragonRenderer::bossInstance; + 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; @@ -191,7 +191,7 @@ void UIScene_HUD::customDraw(IggyCustomDrawCallbackRegion *region) else { Slot *invSlot = pMinecraft->localplayers[m_iPad]->inventoryMenu->getSlot(InventoryMenu::USE_ROW_SLOT_START + slot); - std::shared_ptr item = invSlot->getItem(); + shared_ptr item = invSlot->getItem(); if(item != NULL) { unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); @@ -265,7 +265,7 @@ void UIScene_HUD::handleReload() } m_labelJukebox.init(L""); - int iGuiScale; + int iGuiScale; Minecraft *pMinecraft = Minecraft::GetInstance(); if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localplayers[m_iPad]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) { @@ -629,7 +629,7 @@ void UIScene_HUD::render(S32 width, S32 height, C4JRender::eViewportType viewpor } IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); - + m_renderWidth = tileWidth; m_renderHeight = tileHeight; @@ -639,7 +639,7 @@ void UIScene_HUD::render(S32 width, S32 height, C4JRender::eViewportType viewpor tileYStart , tileXStart + tileWidth , tileYStart + tileHeight , - 0 ); + 0 ); IggyPlayerDrawTilesEnd ( getMovie() ); } else @@ -651,7 +651,7 @@ void UIScene_HUD::render(S32 width, S32 height, C4JRender::eViewportType viewpor void UIScene_HUD::handleTimerComplete(int id) { Minecraft *pMinecraft = Minecraft::GetInstance(); - + bool anyVisible = false; if(pMinecraft->localplayers[m_iPad]!= NULL) { @@ -735,7 +735,7 @@ void UIScene_HUD::SetDisplayName(const wstring &displayName) if(displayName.compare(m_displayName) != 0) { m_displayName = displayName; - + IggyDataValue result; IggyDataValue value[1]; IggyStringUTF16 stringVal; @@ -775,7 +775,7 @@ void UIScene_HUD::handleGameTick() } m_parentLayer->showComponent(m_iPad, eUIScene_HUD,true); - int iGuiScale; + int iGuiScale; if(pMinecraft->localplayers[m_iPad]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) { @@ -788,7 +788,7 @@ void UIScene_HUD::handleGameTick() SetHudSize(iGuiScale); SetDisplayName(ProfileManager.GetDisplayName(m_iPad)); - + SetTooltipsEnabled(((ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) || (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) != 0))); #if TO_BE_IMPLEMENTED @@ -797,8 +797,8 @@ void UIScene_HUD::handleGameTick() { int iTooltipsYOffset = 0; // if tooltips are off, set the y offset to zero - if(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)==0) - { + if(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)==0) + { switch(iGuiScale) { case 0: @@ -987,11 +987,11 @@ void UIScene_HUD::handleGameTick() 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); + setVisible(true); } else { - setVisible(false); + setVisible(false); } } } diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp index 72c41049..de8af0ac 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp @@ -65,11 +65,11 @@ void UIScene_InGameHostOptionsMenu::handleInput(int iPad, int key, bool repeat, // Send update settings packet to server if(hostOptions != app.GetGameHostOption(eGameHostOption_All) ) { - Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = pMinecraft->localplayers[m_iPad]; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; if(player->connection) { - player->connection->send( std::shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, hostOptions) ) ); + player->connection->send( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, hostOptions) ) ); } } diff --git a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp index 542834db..5c3f73f6 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp @@ -67,7 +67,7 @@ UIScene_InGameInfoMenu::UIScene_InGameInfoMenu(int iPad, void *initData, UILayer 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); + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[i] ), voiceStatus); } } @@ -78,7 +78,7 @@ UIScene_InGameInfoMenu::UIScene_InGameInfoMenu(int iPad, void *initData, UILayer if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; if(!m_isHostPlayer && !localPlayer->isModerator() ) { removeControl( &m_buttonGameOptions, false ); @@ -131,7 +131,7 @@ void UIScene_InGameInfoMenu::updateTooltips() int keyA = -1; Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; bool isOp = m_isHostPlayer || localPlayer->isModerator(); bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; @@ -161,7 +161,7 @@ void UIScene_InGameInfoMenu::updateTooltips() } } } - + #if defined(__PS3__) || defined(__ORBIS__) if(m_iPad == ProfileManager.GetPrimaryPad() ) ikeyY = IDS_TOOLTIPS_GAME_INVITES; #else @@ -243,7 +243,7 @@ void UIScene_InGameInfoMenu::handleReload() 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); + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[i] ), voiceStatus); } } @@ -252,7 +252,7 @@ void UIScene_InGameInfoMenu::handleReload() if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; if(!m_isHostPlayer && !localPlayer->isModerator() ) { removeControl( &m_buttonGameOptions, false ); @@ -367,7 +367,7 @@ void UIScene_InGameInfoMenu::handleInput(int iPad, int key, bool repeat, bool pr #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 +#endif } } #else @@ -397,7 +397,7 @@ void UIScene_InGameInfoMenu::handleInput(int iPad, int key, bool repeat, bool pr if(pressed && !repeat && !g_NetworkManager.IsLocalGame() ) { #ifdef __PSVITA__ - if(CGameNetworkManager::usingAdhocMode() == false) + if(CGameNetworkManager::usingAdhocMode() == false) g_NetworkManager.SendInviteGUI(iPad); #else g_NetworkManager.SendInviteGUI(iPad); @@ -431,7 +431,7 @@ void UIScene_InGameInfoMenu::handlePress(F64 controlId, F64 childId) INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ currentSelection ] ); Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; bool isOp = m_isHostPlayer || localPlayer->isModerator(); bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; @@ -544,7 +544,7 @@ void UIScene_InGameInfoMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer } } - scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); + scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); } } @@ -554,12 +554,12 @@ int UIScene_InGameInfoMenu::KickPlayerReturned(void *pParam,int iPad,C4JStorage: delete pParam; if(result==C4JStorage::EMessage_ResultAccept) - { + { Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; if(localPlayer->connection) { - localPlayer->connection->send( std::shared_ptr( new KickPlayerPacket(smallId) ) ); + localPlayer->connection->send( shared_ptr( new KickPlayerPacket(smallId) ) ); } } @@ -571,7 +571,7 @@ int UIScene_InGameInfoMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStora { UIScene_InGameInfoMenu* pClass = (UIScene_InGameInfoMenu*)pParam; - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept) { #ifdef __PS3__ SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_InGameInfoMenu::ViewInvites_SignInReturned, pClass); diff --git a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp index aa0e1994..6eb22b09 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp @@ -66,7 +66,7 @@ UIScene_InGamePlayerOptionsMenu::UIScene_InGamePlayerOptionsMenu(int iPad, void #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 ); @@ -129,7 +129,7 @@ UIScene_InGamePlayerOptionsMenu::UIScene_InGamePlayerOptionsMenu(int iPad, void 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); } @@ -315,11 +315,11 @@ void UIScene_InGamePlayerOptionsMenu::handleInput(int iPad, int key, bool repeat if(originalPrivileges != m_playerPrivileges) { // Send update settings packet to server - Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = pMinecraft->localplayers[m_iPad]; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; if(player->connection) { - player->connection->send( std::shared_ptr( new PlayerInfoPacket( m_networkSmallId, -1, m_playerPrivileges) ) ); + player->connection->send( shared_ptr( new PlayerInfoPacket( m_networkSmallId, -1, m_playerPrivileges) ) ); } } navigateBack(); @@ -364,12 +364,12 @@ int UIScene_InGamePlayerOptionsMenu::KickPlayerReturned(void *pParam,int iPad,C4 delete pParam; if(result==C4JStorage::EMessage_ResultAccept) - { + { Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; if(localPlayer->connection) { - localPlayer->connection->send( std::shared_ptr( new KickPlayerPacket(smallId) ) ); + 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. @@ -405,7 +405,7 @@ void UIScene_InGamePlayerOptionsMenu::resetCheatCheckboxes() m_checkboxes[eControl_HostInvisible].SetEnable(isModerator); m_checkboxes[eControl_HostFly].SetEnable(isModerator); m_checkboxes[eControl_HostHunger].SetEnable(isModerator); - m_checkboxes[eControl_CheatTeleport].SetEnable(isModerator); + m_checkboxes[eControl_CheatTeleport].SetEnable(isModerator); } } diff --git a/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp index e13a9239..723937d0 100644 --- a/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp @@ -32,7 +32,7 @@ UIScene_InventoryMenu::UIScene_InventoryMenu(int iPad, void *_initData, UILayer 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()); @@ -251,7 +251,7 @@ void UIScene_InventoryMenu::updateEffectsDisplay() { // Update with the current effects Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = pMinecraft->localplayers[m_iPad]; + shared_ptr player = pMinecraft->localplayers[m_iPad]; if(player == NULL) return; @@ -262,7 +262,7 @@ void UIScene_InventoryMenu::updateEffectsDisplay() 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()]) diff --git a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp index d21c2906..80db57f8 100644 --- a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp @@ -9,7 +9,7 @@ #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] = +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 }, @@ -36,7 +36,7 @@ const UIScene_LeaderboardsMenu::LeaderboardDescriptor UIScene_LeaderboardsMenu:: UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_HARD), // Farming Hard }, { - UIScene_LeaderboardsMenu::LeaderboardDescriptor( 0, false, -1), // + 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 @@ -132,7 +132,7 @@ void UIScene_LeaderboardsMenu::updateTooltips() selection < (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) { #ifdef _XBOX - if( (m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1)].m_bFriend==false) + 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 { @@ -267,7 +267,7 @@ void UIScene_LeaderboardsMenu::handleInput(int iPad, int key, bool repeat, bool SetLeaderboardHeader(); - ReadStats(-1); + ReadStats(-1); ui.PlayUISFX(eSFX_Press); } handled = true; @@ -284,7 +284,7 @@ void UIScene_LeaderboardsMenu::handleInput(int iPad, int key, bool repeat, bool if( m_leaderboard.m_totalEntryCount <= 10 ) break; - + sendInputToMovie(key, repeat, pressed, released); #if 0 @@ -441,7 +441,7 @@ void UIScene_LeaderboardsMenu::ReadStats(int startIndex) } //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 ) @@ -457,8 +457,8 @@ void UIScene_LeaderboardsMenu::ReadStats(int startIndex) switch (filtermode) { case LeaderboardManager::eFM_TopRank: - LeaderboardManager::Instance()->ReadStats_TopRank( this, - m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + LeaderboardManager::Instance()->ReadStats_TopRank( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, m_newEntryIndex, m_newReadSize ); break; @@ -529,7 +529,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() { m_leaderboard.m_totalEntryCount = NUM_ENTRIES; m_leaderboard.m_numColumns = LEADERBOARD_DESCRIPTORS[m_currentLeaderboard][m_currentDifficulty].m_columnCount; - + //For each entry in the leaderboard for(unsigned int entryIndex=0; entryIndex < NUM_ENTRIES; entryIndex++) { @@ -539,7 +539,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() m_leaderboard.m_entries[entryIndex].m_row = entryIndex; m_leaderboard.m_entries[entryIndex].m_rank = entryIndex+1; swprintf(m_leaderboard.m_entries[entryIndex].m_wcRank, 12, L"12345678");//(int)m_leaderboard.m_entries[entryIndex].m_rank); - + swprintf(m_leaderboard.m_entries[entryIndex].m_gamerTag, 17, L"WWWWWWWWWWWWWWWW"); //m_leaderboard.m_entries[entryIndex].m_locale = (entryIndex % 37) + 1; @@ -598,7 +598,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() //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 ) @@ -676,7 +676,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() insertPosition++; } - + if (deleteFront) { // Delete front x entries @@ -865,7 +865,7 @@ void UIScene_LeaderboardsMenu::PopulateLeaderboard(LeaderboardManager::eStatsRet m_labelInfo.setVisible( false ); m_listEntries.initLeaderboard(m_newSel, m_leaderboard.m_totalEntryCount, LEADERBOARD_DESCRIPTORS[m_currentLeaderboard][m_currentDifficulty].m_columnCount); - + int startIndex = m_newEntryIndex; int entryCount = m_newEntriesCount; @@ -874,7 +874,7 @@ void UIScene_LeaderboardsMenu::PopulateLeaderboard(LeaderboardManager::eStatsRet bool isLast = i == ((startIndex + entryCount) - 1); int idsErrorMessage = m_leaderboard.m_entries[i].m_idsErrorMessage; - + if (idsErrorMessage > 0) { m_listEntries.addDataSet( @@ -882,7 +882,7 @@ void UIScene_LeaderboardsMenu::PopulateLeaderboard(LeaderboardManager::eStatsRet 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), @@ -896,9 +896,9 @@ void UIScene_LeaderboardsMenu::PopulateLeaderboard(LeaderboardManager::eStatsRet 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) + + // 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, @@ -955,7 +955,7 @@ int UIScene_LeaderboardsMenu::SetLeaderboardTitleIcons() m_listEntries.setColumnIcon(i,TitleIcons[m_currentLeaderboard][i]); } } - + return iValidIcons; } @@ -969,7 +969,7 @@ void UIScene_LeaderboardsMenu::customDraw(IggyCustomDrawCallbackRegion *region) } else { - std::shared_ptr item = std::shared_ptr( new ItemInstance(TitleIcons[m_currentLeaderboard][slotId], 1, 0) ); + shared_ptr item = shared_ptr( new ItemInstance(TitleIcons[m_currentLeaderboard][slotId], 1, 0) ); customDrawSlotControl(region,m_iPad,item,1.0f,false,false); } } diff --git a/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp index fec64a98..c29bac2d 100644 --- a/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp @@ -85,7 +85,7 @@ void UIScene_SignEntryMenu::tick() for(int i=0;i<4;i++) { wstring temp=m_textInputLines[i].getLabel(); - m_sign->SetMessage(i,temp); + m_sign->SetMessage(i,temp); } m_sign->setChanged(); @@ -94,10 +94,10 @@ void UIScene_SignEntryMenu::tick() // need to send the new data if (pMinecraft->level->isClientSide) { - std::shared_ptr player = pMinecraft->localplayers[m_iPad]; + shared_ptr player = pMinecraft->localplayers[m_iPad]; if(player != NULL && player->connection && player->connection->isStarted()) { - player->connection->send( std::shared_ptr( new SignUpdatePacket(m_sign->x, m_sign->y, m_sign->z, m_sign->IsVerified(), m_sign->IsCensored(), m_sign->GetMessages()) ) ); + 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); diff --git a/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h index b83a8b2d..28b37d53 100644 --- a/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h @@ -17,7 +17,7 @@ private: eControl_Confirm }; - std::shared_ptr m_sign; + shared_ptr m_sign; int m_iEditingLine; bool m_bConfirmed; bool m_bIgnoreInput; diff --git a/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp index 596f5b67..f6916d13 100644 --- a/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp @@ -11,13 +11,13 @@ UIScene_TeleportMenu::UIScene_TeleportMenu(int iPad, void *initData, UILayer *pa { // 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)); @@ -81,7 +81,7 @@ UIScene_TeleportMenu::UIScene_TeleportMenu(int iPad, void *initData, UILayer *pa 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); + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[m_playersCount] ), voiceStatus); } } @@ -171,7 +171,7 @@ void UIScene_TeleportMenu::handleReload() 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); + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[m_playersCount] ), voiceStatus); } } @@ -257,8 +257,8 @@ void UIScene_TeleportMenu::handlePress(F64 controlId, F64 childId) int currentSelection = (int)childId; INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ currentSelection ] ); INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(m_iPad); - - std::shared_ptr packet; + + shared_ptr packet; if(m_teleportToPlayer) { packet = TeleportCommand::preparePacket(thisPlayer->GetUID(),selectedPlayer->GetUID()); @@ -339,6 +339,6 @@ void UIScene_TeleportMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer * } } - scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); + scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); } } diff --git a/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp index cd630651..dc2bac48 100644 --- a/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp @@ -11,7 +11,7 @@ UIScene_TradingMenu::UIScene_TradingMenu(int iPad, void *_initData, UILayer *par { // Setup all the Iggy references we need for this scene initialiseMovie(); - + m_showingLeftArrow = true; m_showingRightArrow = true; @@ -36,7 +36,7 @@ UIScene_TradingMenu::UIScene_TradingMenu(int iPad, void *_initData, UILayer *par } m_menu = new MerchantMenu( initData->inventory, initData->trader, initData->level ); - + Minecraft::GetInstance()->localplayers[iPad]->containerMenu = m_menu; m_slotListRequest1.addSlots(BUY_A,1); @@ -93,7 +93,7 @@ void UIScene_TradingMenu::handleDestroy() } // 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) + // 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); @@ -147,12 +147,12 @@ void UIScene_TradingMenu::customDraw(IggyCustomDrawCallbackRegion *region) Minecraft *pMinecraft = Minecraft::GetInstance(); if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; - std::shared_ptr item = nullptr; + 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(); } diff --git a/Minecraft.Client/Common/UI/UIStructs.h b/Minecraft.Client/Common/UI/UIStructs.h index 0865cbf3..2dd03c8c 100644 --- a/Minecraft.Client/Common/UI/UIStructs.h +++ b/Minecraft.Client/Common/UI/UIStructs.h @@ -31,8 +31,8 @@ typedef struct _UIVec2D // Brewing typedef struct _BrewingScreenInput { - std::shared_ptr inventory; - std::shared_ptr brewingStand; + shared_ptr inventory; + shared_ptr brewingStand; int iPad; bool bSplitscreen; } BrewingScreenInput; @@ -40,8 +40,8 @@ typedef struct _BrewingScreenInput // Chest typedef struct _ContainerScreenInput { - std::shared_ptr inventory; - std::shared_ptr container; + shared_ptr inventory; + shared_ptr container; int iPad; bool bSplitscreen; } ContainerScreenInput; @@ -49,8 +49,8 @@ typedef struct _ContainerScreenInput // Dispenser typedef struct _TrapScreenInput { - std::shared_ptr inventory; - std::shared_ptr trap; + shared_ptr inventory; + shared_ptr trap; int iPad; bool bSplitscreen; } TrapScreenInput; @@ -58,16 +58,16 @@ typedef struct _TrapScreenInput // Inventory and creative inventory typedef struct _InventoryScreenInput { - std::shared_ptr player; + 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 +// Enchanting typedef struct _EnchantingScreenInput { - std::shared_ptr inventory; + shared_ptr inventory; Level *level; int x; int y; @@ -79,8 +79,8 @@ typedef struct _EnchantingScreenInput // Furnace typedef struct _FurnaceScreenInput { - std::shared_ptr inventory; - std::shared_ptr furnace; + shared_ptr inventory; + shared_ptr furnace; int iPad; bool bSplitscreen; } FurnaceScreenInput; @@ -88,21 +88,21 @@ typedef struct _FurnaceScreenInput // Crafting typedef struct _CraftingPanelScreenInput { - std::shared_ptr player; + 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 { - std::shared_ptr inventory; - std::shared_ptr trader; + shared_ptr inventory; + shared_ptr trader; Level *level; int iPad; bool bSplitscreen; @@ -112,7 +112,7 @@ TradingScreenInput; // Anvil typedef struct _AnvilScreenInput { - std::shared_ptr inventory; + shared_ptr inventory; Level *level; int x; int y; @@ -125,7 +125,7 @@ AnvilScreenInput; // Sign typedef struct _SignEntryScreenInput { - std::shared_ptr sign; + shared_ptr sign; int iPad; } SignEntryScreenInput; @@ -179,7 +179,7 @@ typedef struct _CreateWorldMenuInitData BOOL bOnline; BOOL bIsPrivate; int iPad; -} +} CreateWorldMenuInitData; // Join/Load saves list @@ -223,7 +223,7 @@ typedef struct _LoadMenuInitData int iSaveGameInfoIndex; LevelGenerationOptions *levelGen; SaveListDetails *saveDetails; -} +} LoadMenuInitData; // Join Games @@ -276,7 +276,7 @@ typedef struct _LaunchMoreOptionsMenuInitData seed = L""; bDisableSaving = false; } -} +} LaunchMoreOptionsMenuInitData; typedef struct _LoadingInputParams @@ -352,7 +352,7 @@ typedef struct _SignInInfo } SignInInfo; // Credits -typedef struct +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. @@ -379,8 +379,8 @@ typedef struct _DLCOffersParam { int iPad; int iOfferC; - int iType; -} + int iType; +} DLCOffersParam; typedef struct _InGamePlayerOptionsInitData diff --git a/Minecraft.Client/Common/XUI/SlotProgressControl.cpp b/Minecraft.Client/Common/XUI/SlotProgressControl.cpp index 180ade67..91f362a3 100644 --- a/Minecraft.Client/Common/XUI/SlotProgressControl.cpp +++ b/Minecraft.Client/Common/XUI/SlotProgressControl.cpp @@ -20,8 +20,8 @@ int SlotProgressControl::GetValue() if( pvUserData != NULL ) { SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; - - std::shared_ptr item = std::shared_ptr(); + + shared_ptr item = shared_ptr(); if( pUserDataContainer->slot != NULL ) { @@ -68,8 +68,8 @@ void SlotProgressControl::GetRange(int *pnRangeMin, int *pnRangeMax) if( pvUserData != NULL ) { SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; - - std::shared_ptr item = std::shared_ptr(); + + shared_ptr item = shared_ptr(); if( pUserDataContainer->slot != NULL ) { diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp index 6989aeef..82b6c3ed 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp @@ -8,7 +8,7 @@ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -CXuiCtrlCraftIngredientSlot::CXuiCtrlCraftIngredientSlot() +CXuiCtrlCraftIngredientSlot::CXuiCtrlCraftIngredientSlot() { m_iID=0; m_Desc=NULL; @@ -23,7 +23,7 @@ CXuiCtrlCraftIngredientSlot::CXuiCtrlCraftIngredientSlot() HRESULT CXuiCtrlCraftIngredientSlot::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) { HRESULT hr=S_OK; - + return hr; } //----------------------------------------------------------------------------- @@ -48,10 +48,10 @@ HRESULT CXuiCtrlCraftIngredientSlot::OnCustomMessage_GetSlotItem(CustomMessage_G } HRESULT CXuiCtrlCraftIngredientSlot::OnGetSourceText(XUIMessageGetSourceText *pGetSourceTextData,BOOL& bHandled) -{ +{ pGetSourceTextData->szText=m_Desc; bHandled = TRUE; - + return S_OK; } @@ -72,7 +72,7 @@ void CXuiCtrlCraftIngredientSlot::SetIcon(int iPad, int iId,int iAuxVal, int iCo 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 @@ -92,7 +92,7 @@ void CXuiCtrlCraftIngredientSlot::SetIcon(int iPad, int iId,int iAuxVal, int iCo XuiElementSetShow(m_hObj,bShow); } -void CXuiCtrlCraftIngredientSlot::SetIcon(int iPad, std::shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, BOOL 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 diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h index 0a46227b..5cf7a7f4 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h @@ -16,7 +16,7 @@ public: 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, std::shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, 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: @@ -31,7 +31,7 @@ protected: HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); private: - std::shared_ptr m_item; + shared_ptr m_item; int m_iID; int m_iAuxVal; int m_iCount; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp index b05a8fdd..8a56a0ea 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp @@ -100,7 +100,7 @@ HRESULT CXuiCtrlEnchantmentBook::OnRender(XUIMessageRender *pRenderData, BOOL &b // 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; + D3DRECT clearRect; clearRect.x1 = (int)(matrix._41) - 2; clearRect.y1 = (int)(matrix._42) - 2; clearRect.x2 = (int)(matrix._41 + ( bwidth * matrix._11 )) + 2; @@ -201,7 +201,7 @@ HRESULT CXuiCtrlEnchantmentBook::OnRender(XUIMessageRender *pRenderData, BOOL &b //HRESULT CXuiCtrlEnchantmentBook::OnRender(XUIMessageRender *pRenderData, BOOL &bHandled ) //{ // HXUIDC hDC = pRenderData->hDC; -// +// // RenderManager.Set_matrixDirty(); // // Minecraft *minecraft = Minecraft::GetInstance(); @@ -306,7 +306,7 @@ HRESULT CXuiCtrlEnchantmentBook::OnRender(XUIMessageRender *pRenderData, BOOL &b void CXuiCtrlEnchantmentBook::tickBook() { EnchantmentMenu *menu = m_containerScene->getMenu(); - std::shared_ptr current = menu->getSlot(0)->getItem(); + shared_ptr current = menu->getSlot(0)->getItem(); if (!ItemInstance::matches(current, last)) { last = current; @@ -328,7 +328,7 @@ void CXuiCtrlEnchantmentBook::tickBook() { shouldBeOpen = true; } - } + } if (shouldBeOpen) open += 0.2f; else open -= 0.2f; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.h index 8d22eed9..93da0768 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.h +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.h @@ -42,7 +42,7 @@ private: float m_fScale,m_fAlpha; int m_iPad; CXuiSceneEnchant *m_containerScene; - std::shared_ptr last; + shared_ptr last; float m_fScreenWidth,m_fScreenHeight; float m_fRawWidth,m_fRawHeight; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp index 08e9fdd7..84273eb5 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp @@ -124,7 +124,7 @@ HRESULT CXuiCtrlMinecraftSlot::OnGetSourceImage(XUIMessageGetSourceImage* pData, // 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); @@ -188,7 +188,7 @@ HRESULT CXuiCtrlMinecraftSlot::OnRender(XUIMessageRender *pRenderData, BOOL &bHa { HXUIDC hDC = pRenderData->hDC; CXuiControl xuiControl(m_hObj); - if(m_item == NULL) m_item = std::shared_ptr( new ItemInstance(m_iID, m_iCount, m_iAuxVal) ); + if(m_item == NULL) m_item = shared_ptr( new ItemInstance(m_iID, m_iCount, m_iAuxVal) ); // build and render with the game call @@ -208,15 +208,15 @@ HRESULT CXuiCtrlMinecraftSlot::OnRender(XUIMessageRender *pRenderData, BOOL &bHa // we might want separate x & y scales here float scaleX = bwidth / 16.0f; - float scaleY = bheight / 16.0f; + float scaleY = bheight / 16.0f; // apply any scale in the matrix too scaleX *= matrix._11; - scaleY *= matrix._22; + 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; + D3DRECT clearRect; clearRect.x1 = (int)(matrix._41) - 2; clearRect.y1 = (int)(matrix._42) - 2; clearRect.x2 = (int)(matrix._41 + ( bwidth * matrix._11 )) + 2; @@ -253,7 +253,7 @@ HRESULT CXuiCtrlMinecraftSlot::OnRender(XUIMessageRender *pRenderData, BOOL &bHa //Make sure that pMinecraft->player is the correct player so that player specific rendering // eg clock and compass, are rendered correctly - std::shared_ptr oldPlayer = pMinecraft->player; + shared_ptr oldPlayer = pMinecraft->player; if( m_iPad >= 0 && m_iPad < XUSER_MAX_COUNT ) pMinecraft->player = pMinecraft->localplayers[m_iPad]; @@ -281,8 +281,8 @@ HRESULT CXuiCtrlMinecraftSlot::OnRender(XUIMessageRender *pRenderData, BOOL &bHa if(m_bDecorations) { if((scaleX!=1.0f) ||(scaleY!=1.0f)) - { - glPushMatrix(); + { + glPushMatrix(); glScalef(scaleX, scaleY, 1.0f); int iX= (int)(0.5f+((float)x)/scaleX); int iY= (int)(0.5f+((float)y)/scaleY); @@ -317,7 +317,7 @@ void CXuiCtrlMinecraftSlot::SetIcon(int iPad, int iId,int iAuxVal, int iCount, i // aux value for diggers can go as high as 1561 //const _Tier *_Tier::DIAMOND = new _Tier(3, 1561, 8, 3); // - // setMaxDamage(tier->getUses()); + // setMaxDamage(tier->getUses()); // int ItemInstance::getDamageValue() // { @@ -343,7 +343,7 @@ void CXuiCtrlMinecraftSlot::SetIcon(int iPad, int iId,int iAuxVal, int iCount, i XuiElementSetShow(m_hObj,bShow); } -void CXuiCtrlMinecraftSlot::SetIcon(int iPad, std::shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, BOOL 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(); diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.h index 02d06ae6..5dafec53 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.h +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.h @@ -23,7 +23,7 @@ public: 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, std::shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, BOOL bShow=TRUE); + void SetIcon(int iPad, shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, BOOL bShow=TRUE); protected: @@ -38,7 +38,7 @@ protected: HRESULT OnRender(XUIMessageRender *pRenderData, BOOL &rfHandled); private: - std::shared_ptr m_item; + shared_ptr m_item; BOOL m_bDirty; INT m_iPassThroughDataAssociation; INT m_iPassThroughIdAssociation; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp index eb5bf366..87abbcd3 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp @@ -36,7 +36,7 @@ HRESULT CXuiCtrlSlotItemCtrlBase::OnDestroy( HXUIOBJ hObj ) HRESULT CXuiCtrlSlotItemCtrlBase::OnCustomMessage_GetSlotItem(HXUIOBJ hObj, CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) { - std::shared_ptr item = std::shared_ptr(); + shared_ptr item = shared_ptr(); void* pvUserData; XuiElementGetUserData( hObj, &pvUserData ); @@ -49,7 +49,7 @@ HRESULT CXuiCtrlSlotItemCtrlBase::OnCustomMessage_GetSlotItem(HXUIOBJ hObj, Cust } else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); if(player != NULL) item = player->inventory->getCarried(); } @@ -64,7 +64,7 @@ HRESULT CXuiCtrlSlotItemCtrlBase::OnCustomMessage_GetSlotItem(HXUIOBJ hObj, Cust // 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); + pData->iDataBitField = MAKE_SLOTDISPLAY_DATA_BITMASK(pUserDataContainer->m_iPad, (int)(31*pUserDataContainer->m_fAlpha),true,item->GetCount(),7,item->popTime); } else { @@ -93,7 +93,7 @@ void CXuiCtrlSlotItemCtrlBase::SetUserIndex( HXUIOBJ hObj, int iPad ) XuiElementGetUserData( hObj, &pvUserData ); SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; - + pUserDataContainer->m_iPad = iPad; } @@ -103,7 +103,7 @@ void CXuiCtrlSlotItemCtrlBase::SetAlpha( HXUIOBJ hObj, float fAlpha ) XuiElementGetUserData( hObj, &pvUserData ); SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; - + pUserDataContainer->m_fAlpha = fAlpha; } @@ -119,7 +119,7 @@ bool CXuiCtrlSlotItemCtrlBase::isEmpty( HXUIOBJ hObj ) } else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); if(player != NULL) return player->inventory->getCarried() == NULL; } @@ -146,7 +146,7 @@ wstring CXuiCtrlSlotItemCtrlBase::GetItemDescription( HXUIOBJ hObj, vectorslot->getItem()->getRarity()->color; int colour = app.GetHTMLColour(rarityColour); @@ -156,7 +156,7 @@ wstring CXuiCtrlSlotItemCtrlBase::GetItemDescription( HXUIOBJ hObj, vector%s",colour,thisString.c_str()); + swprintf(formatted, 256, L"%s",colour,thisString.c_str()); thisString = formatted; } desc.append( thisString ); @@ -167,10 +167,10 @@ wstring CXuiCtrlSlotItemCtrlBase::GetItemDescription( HXUIOBJ hObj, vectorm_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); if(player != NULL) { - std::shared_ptr item = player->inventory->getCarried(); + shared_ptr item = player->inventory->getCarried(); if(item != NULL) return app.GetString( item->getDescriptionId() ); } @@ -178,7 +178,7 @@ wstring CXuiCtrlSlotItemCtrlBase::GetItemDescription( HXUIOBJ hObj, vector CXuiCtrlSlotItemCtrlBase::getItemInstance( HXUIOBJ hObj ) +shared_ptr CXuiCtrlSlotItemCtrlBase::getItemInstance( HXUIOBJ hObj ) { void* pvUserData; XuiElementGetUserData( hObj, &pvUserData ); @@ -190,7 +190,7 @@ std::shared_ptr CXuiCtrlSlotItemCtrlBase::getItemInstance( HXUIOBJ } else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); if(player != NULL) return player->inventory->getCarried(); } @@ -221,7 +221,7 @@ HRESULT CXuiCtrlSlotItemCtrlBase::OnKeyDown(HXUIOBJ hObj, XUIMessageInput *pInpu XUIMessage message; XUIMessageInput messageInput; - + XuiMessageInput( &message, &messageInput, XUI_KEYDOWN, pInputData->dwKeyCode, pInputData->wch, pInputData->dwFlags, pInputData->UserIndex ); if (HRESULT_SUCCEEDED(hr)) @@ -268,7 +268,7 @@ int CXuiCtrlSlotItemCtrlBase::GetObjectCount( HXUIOBJ hObj ) } else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); if(player != NULL && player->inventory->getCarried() != NULL) { iCount = player->inventory->getCarried()->count; @@ -309,7 +309,7 @@ bool CXuiCtrlSlotItemCtrlBase::IsSameItemAs( HXUIOBJ hThisObj, HXUIOBJ hOtherObj } else if(pThisUserDataContainer->m_iPad >= 0 && pThisUserDataContainer->m_iPad < XUSER_MAX_COUNT) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pThisUserDataContainer->m_iPad] ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pThisUserDataContainer->m_iPad] ); if(player != NULL && player->inventory->getCarried() != NULL) { iThisID = player->inventory->getCarried()->id; @@ -336,7 +336,7 @@ bool CXuiCtrlSlotItemCtrlBase::IsSameItemAs( HXUIOBJ hThisObj, HXUIOBJ hOtherObj } else if(pOtherUserDataContainer->m_iPad >= 0 && pOtherUserDataContainer->m_iPad < XUSER_MAX_COUNT) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pOtherUserDataContainer->m_iPad] ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pOtherUserDataContainer->m_iPad] ); if(player != NULL && player->inventory->getCarried() != NULL) { iOtherID = player->inventory->getCarried()->id; @@ -358,7 +358,7 @@ bool CXuiCtrlSlotItemCtrlBase::IsSameItemAs( HXUIOBJ hThisObj, HXUIOBJ hOtherObj // 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 CXuiCtrlSlotItemCtrlBase::GetEmptyStackSpace( HXUIOBJ hObj ) { int iResult = 0; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h index 3fe436ad..2fd21749 100644 --- a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h @@ -29,9 +29,9 @@ private: 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 + // 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; @@ -49,7 +49,7 @@ public: wstring GetItemDescription( HXUIOBJ hObj, vector &unformattedStrings ); - std::shared_ptr getItemInstance( HXUIOBJ hObj ); + shared_ptr getItemInstance( HXUIOBJ hObj ); Slot *getSlot( HXUIOBJ hObj ); // 4J WESTY : Pointer Prototype : Added to support prototype only. @@ -64,9 +64,9 @@ public: // 4J WESTY : Pointer Prototype : Added to support prototype only. bool IsSameItemAs( HXUIOBJ hThisObj, HXUIOBJ hOtherObj ); -protected: +protected: HRESULT OnInit( HXUIOBJ hObj, XUIMessageInit* pInitData, BOOL& bHandled ); - + HRESULT OnDestroy( HXUIOBJ hObj ); HRESULT OnCustomMessage_GetSlotItem(HXUIOBJ hObj, CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled); diff --git a/Minecraft.Client/Common/XUI/XUI_CustomMessages.h b/Minecraft.Client/Common/XUI/XUI_CustomMessages.h index 0744f826..888f8ad0 100644 --- a/Minecraft.Client/Common/XUI/XUI_CustomMessages.h +++ b/Minecraft.Client/Common/XUI/XUI_CustomMessages.h @@ -8,13 +8,13 @@ #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_TMS_ALLFILES_RETRIEVED_MESSAGE XM_USER + 8 #define XM_CUSTOMTICKSCENE_MESSAGE XM_USER + 9 #define XM_GETSLOTITEM_MESSAGE XM_USER + 10 typedef struct { - std::shared_ptr item; + shared_ptr item; // Legacy values for compatibility int iDataBitField; diff --git a/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.cpp b/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.cpp index 0931f50d..56b41267 100644 --- a/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.cpp +++ b/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.cpp @@ -9,7 +9,7 @@ #include "..\..\Common\GameRules\ConsoleGameRules.h" #include "XUI_DebugItemEditor.h" -#ifdef _DEBUG_MENUS_ENABLED +#ifdef _DEBUG_MENUS_ENABLED HRESULT CScene_DebugItemEditor::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) { MapChildControls(); @@ -22,7 +22,7 @@ HRESULT CScene_DebugItemEditor::OnInit( XUIMessageInit *pInitData, BOOL &bHandle 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_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() ); @@ -59,8 +59,8 @@ HRESULT CScene_DebugItemEditor::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfH m_slot->set(m_item); Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = pMinecraft->localplayers[m_iPad]; - if(player != NULL && player->connection) player->connection->send( std::shared_ptr( new ContainerSetSlotPacket(m_menu->containerId, m_slot->index, m_item) ) ); + 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); @@ -76,7 +76,7 @@ HRESULT CScene_DebugItemEditor::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfH HRESULT CScene_DebugItemEditor::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled) { - if(m_item == NULL) m_item = std::shared_ptr( new ItemInstance(0,1,0) ); + if(m_item == NULL) m_item = shared_ptr( new ItemInstance(0,1,0) ); if(hObjSource == m_itemId) { int id = 0; @@ -107,7 +107,7 @@ HRESULT CScene_DebugItemEditor::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINot 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) ) ); diff --git a/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h b/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h index 0445a679..2e2f5b5a 100644 --- a/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h +++ b/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h @@ -8,7 +8,7 @@ using namespace std; class CScene_DebugItemEditor : public CXuiSceneImpl { -#ifdef _DEBUG_MENUS_ENABLED +#ifdef _DEBUG_MENUS_ENABLED public: typedef struct _ItemEditorInput { @@ -18,7 +18,7 @@ public: } ItemEditorInput; private: int m_iPad; - std::shared_ptr m_item; + shared_ptr m_item; Slot *m_slot; AbstractContainerMenu *m_menu; diff --git a/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.cpp b/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.cpp index 53e400a8..f0561745 100644 --- a/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.cpp +++ b/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.cpp @@ -50,7 +50,7 @@ HRESULT CScene_InGameHostOptions::OnInit( XUIMessageInit* pInitData, BOOL& bHand CXuiSceneBase::ShowLogo( m_iPad, FALSE ); - + //SentientManager.RecordMenuShown(m_iPad, eUIScene_CreateWorldMenu, 0); return S_OK; @@ -74,11 +74,11 @@ HRESULT CScene_InGameHostOptions::OnKeyDown(XUIMessageInput* pInputData, BOOL& r // Send update settings packet to server if(hostOptions != app.GetGameHostOption(eGameHostOption_All) ) { - Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = pMinecraft->localplayers[m_iPad]; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; if(player != NULL && player->connection) { - player->connection->send( std::shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, hostOptions) ) ); + player->connection->send( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, hostOptions) ) ); } } diff --git a/Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp b/Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp index c9b9f76f..4839013c 100644 --- a/Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp +++ b/Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp @@ -58,7 +58,7 @@ HRESULT CScene_InGameInfo::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; if(!m_isHostPlayer && !localPlayer->isModerator() ) { m_gameOptionsButton.SetEnable(FALSE); @@ -77,7 +77,7 @@ HRESULT CScene_InGameInfo::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) 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 ); @@ -179,11 +179,11 @@ HRESULT CScene_InGameInfo::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); if( hObjPressed == playersList ) - { + { INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ playersList.GetCurSel() ] ); - + Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; bool isOp = m_isHostPlayer || localPlayer->isModerator(); bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; @@ -220,7 +220,7 @@ HRESULT CScene_InGameInfo::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* } } else if( hObjPressed == m_gameOptionsButton ) - { + { app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_InGameHostOptionsMenu); } return S_OK; @@ -330,7 +330,7 @@ HRESULT CScene_InGameInfo::OnGetSourceDataText(XUIMessageGetSourceText *pGetSour } HRESULT hr; - HXUIOBJ hButton, hVisual, hPlayerIcon, hVoiceIcon; + HXUIOBJ hButton, hVisual, hPlayerIcon, hVoiceIcon; hButton = playersList.GetItemControl(pGetSourceTextData->iItem); hr=XuiControlGetVisual(hButton,&hVisual); @@ -415,7 +415,7 @@ HRESULT CScene_InGameInfo::OnGetSourceDataText(XUIMessageGetSourceText *pGetSour XuiElementFindNamedFrame(hVoiceIcon, L"NotSpeaking", &playFrame); } } - + if(playFrame < 0) { XuiElementFindNamedFrame(hVoiceIcon, L"Normal", &playFrame); @@ -465,8 +465,8 @@ void CScene_InGameInfo::updateTooltips() int keyA = -1; Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; - + 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; @@ -524,12 +524,12 @@ int CScene_InGameInfo::KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMes delete pParam; if(result==C4JStorage::EMessage_ResultAccept) - { + { Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; if(localPlayer != NULL && localPlayer->connection) { - localPlayer->connection->send( std::shared_ptr( new KickPlayerPacket(smallId) ) ); + localPlayer->connection->send( shared_ptr( new KickPlayerPacket(smallId) ) ); } } diff --git a/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.cpp b/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.cpp index 6334574f..156cd092 100644 --- a/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.cpp +++ b/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.cpp @@ -141,7 +141,7 @@ HRESULT CScene_InGamePlayerOptions::OnInit( XUIMessageInit* pInitData, BOOL& bHa 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) { @@ -191,7 +191,7 @@ HRESULT CScene_InGamePlayerOptions::OnInit( XUIMessageInit* pInitData, BOOL& bHa ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); - CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &CScene_InGamePlayerOptions::OnPlayerChanged, this); @@ -276,11 +276,11 @@ HRESULT CScene_InGamePlayerOptions::OnKeyDown(XUIMessageInput* pInputData, BOOL& if(originalPrivileges != m_playerPrivileges) { // Send update settings packet to server - Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = pMinecraft->localplayers[m_iPad]; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; if(player != NULL && player->connection) { - player->connection->send( std::shared_ptr( new PlayerInfoPacket( m_networkSmallId, -1, m_playerPrivileges) ) ); + player->connection->send( shared_ptr( new PlayerInfoPacket( m_networkSmallId, -1, m_playerPrivileges) ) ); } } @@ -334,12 +334,12 @@ int CScene_InGamePlayerOptions::KickPlayerReturned(void *pParam,int iPad,C4JStor delete pParam; if(result==C4JStorage::EMessage_ResultAccept) - { + { Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; if(localPlayer != NULL && localPlayer->connection) { - localPlayer->connection->send( std::shared_ptr( new KickPlayerPacket(smallId) ) ); + 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. @@ -478,22 +478,22 @@ void CScene_InGamePlayerOptions::resetCheatCheckboxes() if (!m_editingSelf) { m_checkboxes[eControl_HostInvisible].SetEnable(isModerator); - m_checkboxes[eControl_HostInvisible].SetCheck( 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 + 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 + 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 + 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_Scene_AbstractContainer.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.cpp index ecdc358a..10369d5e 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.cpp @@ -24,7 +24,7 @@ #include "XUI_Ctrl_SlotItem.h" #include "XUI_Ctrl_SlotItemListItem.h" #include "XUI_Scene_AbstractContainer.h" -#ifdef _DEBUG_MENUS_ENABLED +#ifdef _DEBUG_MENUS_ENABLED #include "XUI_DebugItemEditor.h" #endif @@ -44,14 +44,14 @@ void CXuiSceneAbstractContainer::PlatformInitialize(int iPad, int startIndex) // We may have varying depths of controls here, so base off the pointers parent HXUIOBJ parent; - XuiElementGetBounds( m_pointerControl->m_hObj, &fPointerWidth, &fPointerHeight ); + XuiElementGetBounds( m_pointerControl->m_hObj, &fPointerWidth, &fPointerHeight ); XuiElementGetParent( m_pointerControl->m_hObj, &parent ); m_pointerControl->SetShow(TRUE); - XuiElementGetBounds( parent, &fPanelWidth, &fPanelHeight ); + 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; @@ -97,13 +97,13 @@ void CXuiSceneAbstractContainer::PlatformInitialize(int iPad, int startIndex) m_pointerPos.x = newPointerPos.x; m_pointerPos.y = newPointerPos.y; -#ifdef USE_POINTER_ACCEL +#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 ); @@ -114,7 +114,7 @@ void CXuiSceneAbstractContainer::PlatformInitialize(int iPad, int startIndex) for ( int iSection = m_eFirstSection; iSection < m_eMaxSection; ++iSection ) { ESceneSection eSection = ( ESceneSection )( iSection ); - + if(!IsSectionSlotList(eSection)) continue; // Get dimensions of this section. @@ -153,7 +153,7 @@ 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 +// 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; @@ -306,7 +306,7 @@ void CXuiSceneAbstractContainer::GetItemScreenData( ESceneSection eSection, int } } -std::shared_ptr CXuiSceneAbstractContainer::getSlotItem(ESceneSection eSection, int iSlot) +shared_ptr CXuiSceneAbstractContainer::getSlotItem(ESceneSection eSection, int iSlot) { CXuiCtrlSlotItemListItem* pCXuiCtrlSlotItem; GetSectionSlotList( eSection )->GetCXuiCtrlSlotItem( iSlot, &( pCXuiCtrlSlotItem ) ); @@ -327,7 +327,7 @@ HRESULT CXuiSceneAbstractContainer::OnTimer( XUIMessageTimer *pTimer, BOOL& bHan // Update pointer from stick input on timer. if ( pTimer->nId == POINTER_INPUT_TIMER_ID ) { - + onMouseTick(); D3DXVECTOR3 pointerPos; pointerPos.x = m_pointerPos.x; @@ -348,7 +348,7 @@ HRESULT CXuiSceneAbstractContainer::OnTimer( XUIMessageTimer *pTimer, BOOL& bHan hr = handleCustomTimer( pTimer, bHandled ); } return hr; -} +} HRESULT CXuiSceneAbstractContainer::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) { @@ -443,7 +443,7 @@ void CXuiSceneAbstractContainer::adjustPointerForSafeZone() D3DXVECTOR2 baseSceneOrigin; float baseWidth, baseHeight; if(CXuiSceneBase::GetBaseSceneSafeZone( m_iPad, baseSceneOrigin, baseWidth, baseHeight)) - { + { D3DXMATRIX pointerBackgroundMatrix; XuiElementGetFullXForm( m_hPointerTextBkg, &pointerBackgroundMatrix); diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.h b/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.h index 939dda0b..ca191db5 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.h +++ b/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.h @@ -25,7 +25,7 @@ protected: 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 ); @@ -64,7 +64,7 @@ public: 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; @@ -77,7 +77,7 @@ public: void setSectionSelectedSlot(ESceneSection eSection, int x, int y); void setFocusToPointer(int iPad); void SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot); - virtual std::shared_ptr getSlotItem(ESceneSection eSection, int iSlot); + 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_Base.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp index 3f53bfe0..1a679f58 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp @@ -215,7 +215,7 @@ void CXuiSceneBase::_TickAllBaseScenes() } else { - std::shared_ptr boss = EnderDragonRenderer::bossInstance; + shared_ptr boss = EnderDragonRenderer::bossInstance; EnderDragonRenderer::bossInstance = nullptr; m_ticksWithNoBoss = 0; diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Container.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Container.cpp index 9c556e72..39b836d2 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_Container.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Container.cpp @@ -30,12 +30,12 @@ HRESULT CXuiSceneContainer::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) 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 ); - std::shared_ptr container = initData->container; + shared_ptr container = initData->container; m_iPad=initData->iPad; m_bSplitscreen=initData->bSplitscreen; @@ -61,7 +61,7 @@ HRESULT CXuiSceneContainer::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) // Adjust the height to show the correct number of container rows float height, width; - this->GetBounds( &width, &height ); + this->GetBounds( &width, &height ); int rowDiff = CONTAINER_DEFAULT_ROWS - rows; //height = height - (rowDiff * ROW_HEIGHT); height = height - (rowDiff * fPointerHeight); @@ -103,7 +103,7 @@ HRESULT CXuiSceneContainer::OnDestroy() #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) + // 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; } @@ -156,7 +156,7 @@ void CXuiSceneContainer::InitDataAssociations(int iPad, AbstractContainerMenu *m // 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_CraftingPanel.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.cpp index 90b4b87d..a5dc6584 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.cpp @@ -22,7 +22,7 @@ ////////////////////////////////////////////////////////////////////////// // -// +// // ////////////////////////////////////////////////////////////////////////// CXuiSceneCraftingPanel::CXuiSceneCraftingPanel() @@ -46,10 +46,10 @@ HRESULT CXuiSceneCraftingPanel::OnInit( XUIMessageInit* pInitData, BOOL& bHandle m_iPad=pCraftingPanelData->iPad; m_bSplitscreen=pCraftingPanelData->bSplitscreen; - HRESULT hr = S_OK; + HRESULT hr = S_OK; MapChildControls(); - + if(m_iContainerType==RECIPE_TYPE_2x2) { // TODO Inventory dimensions need defined as constants @@ -74,7 +74,7 @@ HRESULT CXuiSceneCraftingPanel::OnInit( XUIMessageInit* pInitData, BOOL& bHandle // 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); + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); } XuiElementSetShow(m_hGrid,TRUE); @@ -84,7 +84,7 @@ HRESULT CXuiSceneCraftingPanel::OnInit( XUIMessageInit* pInitData, BOOL& bHandle if(m_iContainerType==RECIPE_TYPE_3x3) { m_pCursors=m_pHSlotsCraftingTableCursors; - + m_iIngredientsMaxSlotC = m_iIngredients3x3SlotC; for(int i=0;idwTransAction==XUI_TRANSITION_ACTION_DESTROY ) + // are we being destroyed? If so, don't do anything + if(pTransData->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) { return S_OK; } @@ -222,7 +222,7 @@ HRESULT CXuiSceneCraftingPanel::OnTransitionEnd( XUIMessageTransition *pTransDat // Display the tooltips ui.SetTooltips(m_iPad, IDS_TOOLTIPS_CREATE,IDS_TOOLTIPS_EXIT, IDS_TOOLTIPS_SHOW_INVENTORY,-1,-1,-1,-2, IDS_TOOLTIPS_CHANGE_GROUP); - CXuiSceneBase::EnableTooltip(m_iPad, BUTTON_TOOLTIP_A, FALSE ); + CXuiSceneBase::EnableTooltip(m_iPad, BUTTON_TOOLTIP_A, FALSE ); // Check which recipes are available with the resources we have CheckRecipesAvailable(); @@ -241,7 +241,7 @@ HRESULT CXuiSceneCraftingPanel::OnCustomMessage_InventoryUpdated() { // Display the tooltips ui.SetTooltips(m_iPad, IDS_TOOLTIPS_CREATE,IDS_TOOLTIPS_EXIT, IDS_TOOLTIPS_SHOW_INVENTORY,-1,-1,-1,-2, IDS_TOOLTIPS_CHANGE_GROUP); - CXuiSceneBase::EnableTooltip(m_iPad, BUTTON_TOOLTIP_A, FALSE ); + CXuiSceneBase::EnableTooltip(m_iPad, BUTTON_TOOLTIP_A, FALSE ); // Check which recipes are available with the resources we have CheckRecipesAvailable(); @@ -359,7 +359,7 @@ HRESULT CXuiSceneCraftingPanel::OnDestroy() } #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) + // 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; @@ -417,21 +417,21 @@ void CXuiSceneCraftingPanel::hideAllIngredientsSlots() } } -void CXuiSceneCraftingPanel::setCraftHSlotItem(int iPad, int iIndex, std::shared_ptr item, unsigned int uiAlpha) +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, std::shared_ptr item, unsigned int uiAlpha) +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, std::shared_ptr item) +void CXuiSceneCraftingPanel::setCraftingOutputSlotItem(int iPad, shared_ptr item) { if(item == NULL) { @@ -448,7 +448,7 @@ void CXuiSceneCraftingPanel::setCraftingOutputSlotRedBox(bool show) m_pCraftingOutput->SetRedBox(show?TRUE:FALSE); } -void CXuiSceneCraftingPanel::setIngredientSlotItem(int iPad, int index, std::shared_ptr item) +void CXuiSceneCraftingPanel::setIngredientSlotItem(int iPad, int index, shared_ptr item) { if(item == NULL) { @@ -465,7 +465,7 @@ void CXuiSceneCraftingPanel::setIngredientSlotRedBox(int index, bool show) m_pCraftingIngredientA[index]->SetRedBox(show?TRUE:FALSE); } -void CXuiSceneCraftingPanel::setIngredientDescriptionItem(int iPad, int index, std::shared_ptr item) +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); } @@ -524,7 +524,7 @@ void CXuiSceneCraftingPanel::UpdateMultiPanel() // turn off the inventory XuiElementSetShow(m_hGridInventory,FALSE); XuiElementSetShow(m_DescriptionText,TRUE); - XuiElementSetShow(m_InventoryText,FALSE); + XuiElementSetShow(m_InventoryText,FALSE); break; case DISPLAY_INGREDIENTS: // turn off all the descriptions @@ -544,7 +544,7 @@ void CXuiSceneCraftingPanel::UpdateMultiPanel() { XuiControlSetText(m_InventoryText,app.GetString(IDS_INGREDIENTS)); XuiElementSetShow(m_InventoryText,TRUE); - } + } break; } } diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.h b/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.h index df2090ec..0c6e22ff 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.h +++ b/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.h @@ -3,7 +3,7 @@ using namespace std; #include "../media/xuiscene_craftingpanel_2x2.h" #include "XUI_Ctrl_MinecraftSlot.h" -#include "..\..\..\Minecraft.World\Recipy.h" +#include "..\..\..\Minecraft.World\Recipy.h" #include "XUI_Ctrl_CraftIngredientSlot.h" #include "..\..\..\Minecraft.World\Item.h" #include "XUI_CustomMessages.h" @@ -137,7 +137,7 @@ public: 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) @@ -182,13 +182,13 @@ protected: virtual void hideAllHSlots(); virtual void hideAllVSlots(); virtual void hideAllIngredientsSlots(); - virtual void setCraftHSlotItem(int iPad, int iIndex, std::shared_ptr item, unsigned int uiAlpha); - virtual void setCraftVSlotItem(int iPad, int iIndex, std::shared_ptr item, unsigned int uiAlpha); - virtual void setCraftingOutputSlotItem(int iPad, std::shared_ptr item); + 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, std::shared_ptr item); + virtual void setIngredientSlotItem(int iPad, int index, shared_ptr item); virtual void setIngredientSlotRedBox(int index, bool show); - virtual void setIngredientDescriptionItem(int iPad, int index, std::shared_ptr item); + 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); @@ -200,6 +200,6 @@ protected: 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_Inventory.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.cpp index c715bba5..04e77e5e 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.cpp @@ -33,7 +33,7 @@ HRESULT CXuiSceneInventory::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) { if(m_bSplitscreen) { - app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); } } @@ -57,7 +57,7 @@ HRESULT CXuiSceneInventory::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) 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; @@ -86,7 +86,7 @@ HRESULT CXuiSceneInventory::OnDestroy() } // 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) + // 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; } @@ -154,7 +154,7 @@ void CXuiSceneInventory::updateEffectsDisplay() { // Update with the current effects Minecraft *pMinecraft = Minecraft::GetInstance(); - std::shared_ptr player = pMinecraft->localplayers[m_iPad]; + shared_ptr player = pMinecraft->localplayers[m_iPad]; if(player == NULL) return; @@ -185,7 +185,7 @@ void CXuiSceneInventory::updateEffectsDisplay() if(i > 0) position.y -= fNextEffectYOffset; // Stack from the bottom m_hEffectDisplayA[i]->SetPosition(&position); - + MobEffectInstance *effect = *it; MobEffect *mobEffect = MobEffect::effects[effect->getId()]; diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.cpp index bb5319a3..0793fc9e 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.cpp @@ -43,7 +43,7 @@ HRESULT CXuiSceneInventoryCreative::OnInit( XUIMessageInit *pInitData, BOOL &bHa { if(m_bSplitscreen) { - app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); } } @@ -60,12 +60,12 @@ HRESULT CXuiSceneInventoryCreative::OnInit( XUIMessageInit *pInitData, BOOL &bHa initData->player->awardStat(GenericStats::openInventory(), GenericStats::param_noArgs()); // 4J JEV - Item Picker Menu - std::shared_ptr creativeContainer = std::shared_ptr(new SimpleContainer( 0, TabSpec::MAX_SIZE + 9 )); + 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_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. @@ -79,7 +79,7 @@ HRESULT CXuiSceneInventoryCreative::OnInit( XUIMessageInit *pInitData, BOOL &bHa m_fPointerMinY += containerPos.y; // 4J JEV - Settup Tabs - for (int i = 0; i < eCreativeInventoryTab_COUNT; i++) + for (int i = 0; i < eCreativeInventoryTab_COUNT; i++) { m_hTabGroupA[i].SetShow(FALSE); } @@ -103,7 +103,7 @@ HRESULT CXuiSceneInventoryCreative::OnDestroy() #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) + // 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; } @@ -115,8 +115,8 @@ HRESULT CXuiSceneInventoryCreative::OnDestroy() ////////////////////////////////////////////////////////////////////////// HRESULT CXuiSceneInventoryCreative::OnTransitionEnd( XUIMessageTransition *pTransData, BOOL& bHandled ) { - // are we being destroyed? If so, don't do anything - if(pTransData->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) + // are we being destroyed? If so, don't do anything + if(pTransData->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) { return S_OK; } @@ -199,7 +199,7 @@ void CXuiSceneInventoryCreative::updateScrollCurrentPage(int currentPage, int pa m_scrollUp.SetShow(currentPage > 1); m_scrollUp.PlayOptionalVisual(L"ScrollMore",L"EndScrollMore"); - + m_scrollDown.SetShow(currentPage < pageCount); m_scrollDown.PlayOptionalVisual(L"ScrollMore",L"EndScrollMore"); diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp index b4b936c2..fec13460 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp @@ -19,11 +19,11 @@ 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(); @@ -36,7 +36,7 @@ HRESULT CXuiSceneTrading::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) if(m_bSplitscreen) { - app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); } if( pMinecraft->localgameModes[m_iPad] != NULL ) @@ -65,7 +65,7 @@ HRESULT CXuiSceneTrading::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) // 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); @@ -86,7 +86,7 @@ HRESULT CXuiSceneTrading::OnDestroy() } // 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) + // 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; } @@ -245,17 +245,17 @@ void CXuiSceneTrading::setTradeRedBox(int index, bool show) m_tradeHSlots[index]->SetRedBox(show?TRUE:FALSE); } -void CXuiSceneTrading::setRequest1Item(std::shared_ptr item) +void CXuiSceneTrading::setRequest1Item(shared_ptr item) { m_request1Control->SetIcon(getPad(), item, 12, 31, true); } -void CXuiSceneTrading::setRequest2Item(std::shared_ptr item) +void CXuiSceneTrading::setRequest2Item(shared_ptr item) { m_request2Control->SetIcon(getPad(), item, 12, 31, true); } -void CXuiSceneTrading::setTradeItem(int index, std::shared_ptr item) +void CXuiSceneTrading::setTradeItem(int index, shared_ptr item) { m_tradeHSlots[index]->SetIcon(getPad(), item, 12, 31, true); } @@ -299,7 +299,7 @@ void CXuiSceneTrading::setOfferDescription(const wstring &name, vector 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); diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Trading.h b/Minecraft.Client/Common/XUI/XUI_Scene_Trading.h index 5ca08b83..72194cbc 100644 --- a/Minecraft.Client/Common/XUI/XUI_Scene_Trading.h +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Trading.h @@ -83,7 +83,7 @@ protected: MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) MAP_OVERRIDE(IDC_UseRow, m_useRowControl) END_MAP_CHILD_CONTROLS() - END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() END_CONTROL_MAP() HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); @@ -120,9 +120,9 @@ protected: virtual void setRequest2RedBox(bool show); virtual void setTradeRedBox(int index, bool show); - virtual void setRequest1Item(std::shared_ptr item); - virtual void setRequest2Item(std::shared_ptr item); - virtual void setTradeItem(int index, std::shared_ptr item); - + 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_SignEntry.cpp b/Minecraft.Client/Common/XUI/XUI_SignEntry.cpp index 8fb6678c..378ac147 100644 --- a/Minecraft.Client/Common/XUI/XUI_SignEntry.cpp +++ b/Minecraft.Client/Common/XUI/XUI_SignEntry.cpp @@ -11,13 +11,13 @@ 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); @@ -65,7 +65,7 @@ HRESULT CScene_SignEntry::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* p for(int i=0;i<4;i++) { wstring temp=m_signRows[i].GetText(); - m_sign->SetMessage(i,temp); + m_sign->SetMessage(i,temp); } m_sign->setChanged(); @@ -74,10 +74,10 @@ HRESULT CScene_SignEntry::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* p // need to send the new data if (pMinecraft->level->isClientSide) { - std::shared_ptr player = pMinecraft->localplayers[pNotifyPressData->UserIndex]; + shared_ptr player = pMinecraft->localplayers[pNotifyPressData->UserIndex]; if(player != NULL && player->connection && player->connection->isStarted()) { - player->connection->send( std::shared_ptr( new SignUpdatePacket(m_sign->x, m_sign->y, m_sign->z, m_sign->IsVerified(), m_sign->IsCensored(), m_sign->GetMessages()) ) ); + 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); @@ -103,7 +103,7 @@ HRESULT CScene_SignEntry::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled app.CloseXuiScenes(pInputData->UserIndex); rfHandled = TRUE; - + CXuiSceneBase::PlayUISFX(eSFX_Back); break; } diff --git a/Minecraft.Client/Common/XUI/XUI_SignEntry.h b/Minecraft.Client/Common/XUI/XUI_SignEntry.h index c8d5aae2..4f8c44d2 100644 --- a/Minecraft.Client/Common/XUI/XUI_SignEntry.h +++ b/Minecraft.Client/Common/XUI/XUI_SignEntry.h @@ -43,7 +43,7 @@ public: XUI_IMPLEMENT_CLASS( CScene_SignEntry, L"CScene_SignEntry", XUI_CLASS_SCENE ) private: - std::shared_ptr m_sign; + shared_ptr m_sign; D3DXVECTOR3 m_OriginalPosition; }; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Teleport.cpp b/Minecraft.Client/Common/XUI/XUI_Teleport.cpp index 90b4b5fa..1d6ac3bf 100644 --- a/Minecraft.Client/Common/XUI/XUI_Teleport.cpp +++ b/Minecraft.Client/Common/XUI/XUI_Teleport.cpp @@ -61,7 +61,7 @@ HRESULT CScene_Teleport::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) 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; @@ -104,11 +104,11 @@ HRESULT CScene_Teleport::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pN 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); - - std::shared_ptr packet; + + shared_ptr packet; if(m_teleportToPlayer) { packet = TeleportCommand::preparePacket(thisPlayer->GetUID(),selectedPlayer->GetUID()); @@ -186,7 +186,7 @@ HRESULT CScene_Teleport::OnGetSourceDataText(XUIMessageGetSourceText *pGetSource } HRESULT hr; - HXUIOBJ hButton, hVisual, hPlayerIcon, hVoiceIcon; + HXUIOBJ hButton, hVisual, hPlayerIcon, hVoiceIcon; hButton = playersList.GetItemControl(pGetSourceTextData->iItem); hr=XuiControlGetVisual(hButton,&hVisual); @@ -271,7 +271,7 @@ HRESULT CScene_Teleport::OnGetSourceDataText(XUIMessageGetSourceText *pGetSource XuiElementFindNamedFrame(hVoiceIcon, L"NotSpeaking", &playFrame); } } - + if(playFrame < 0) { XuiElementFindNamedFrame(hVoiceIcon, L"Normal", &playFrame); diff --git a/Minecraft.Client/Common/XUI/XUI_TextEntry.cpp b/Minecraft.Client/Common/XUI/XUI_TextEntry.cpp index 19c2b34e..8934350d 100644 --- a/Minecraft.Client/Common/XUI/XUI_TextEntry.cpp +++ b/Minecraft.Client/Common/XUI/XUI_TextEntry.cpp @@ -53,7 +53,7 @@ HRESULT CScene_TextEntry::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyVal if(pValueChangedData->nValue==10) { LPCWSTR pText = m_EditText.GetText(); - + if(pText) { wstring wText = pText; @@ -61,7 +61,7 @@ HRESULT CScene_TextEntry::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyVal } app.NavigateBack(m_iPad); - rfHandled = TRUE; + rfHandled = TRUE; } return S_OK; @@ -86,7 +86,7 @@ HRESULT CScene_TextEntry::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled app.NavigateBack(m_iPad); rfHandled = TRUE; - } + } break; case VK_PAD_B: @@ -125,7 +125,7 @@ HRESULT CScene_TextEntry::InterpretString(wstring &wsText) 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); @@ -146,9 +146,9 @@ HRESULT CScene_TextEntry::InterpretString(wstring &wsText) } 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); @@ -158,7 +158,7 @@ HRESULT CScene_TextEntry::InterpretString(wstring &wsText) app.DebugPrintf("eCommand_Give, item=%d count=%d\n",iItem,iCount); Minecraft *pMinecraft=Minecraft::GetInstance(); for(int i=0;ilocalplayers[m_iPad]->drop(); // std::shared_ptr(new ItemInstance( iItem, 1, 0 )) ); + pMinecraft->localplayers[m_iPad]->drop(); // shared_ptr(new ItemInstance( iItem, 1, 0 )) ); } break; diff --git a/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp b/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp index bea3e055..98951d81 100644 --- a/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp +++ b/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp @@ -23,7 +23,7 @@ HRESULT CScene_TutorialPopup::OnInit( XUIMessageInit* pInitData, BOOL& bHandled // 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); + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); } m_textFontSize = _fromString( m_fontSizeControl.GetText() ); @@ -143,7 +143,7 @@ void CScene_TutorialPopup::UpdateInteractScenePosition(bool visible) } 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; @@ -289,7 +289,7 @@ wstring CScene_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWS if( icon != TUTORIAL_NO_ICON ) { bool itemIsFoil = false; - itemIsFoil = (std::shared_ptr(new ItemInstance(icon,1,iAuxVal)))->isFoil(); + 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); @@ -322,7 +322,7 @@ wstring CScene_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWS } bool itemIsFoil = false; - itemIsFoil = (std::shared_ptr(new ItemInstance(iconId,1,iAuxVal)))->isFoil(); + 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); @@ -330,7 +330,7 @@ wstring CScene_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWS temp.replace(iconTagStartPos, iconEndPos - iconTagStartPos + closeTag.length(), L""); } } - + // remove any icon text else if(temp.find(L"{*CraftingTableIcon*}")!=wstring::npos) { @@ -410,7 +410,7 @@ wstring CScene_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWS m_pCraftingPic->SetIcon(m_iPad, 0,0,0,0,0,false,false,FALSE); } } - + BOOL iconShowAtEnd = m_pCraftingPic->IsShown(); if(iconShowAtStart != iconShowAtEnd) { @@ -432,7 +432,7 @@ wstring CScene_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWS } m_description.SetBounds(fDescWidth, fDescHeight); } - + return temp; } @@ -463,7 +463,7 @@ wstring CScene_TutorialPopup::_SetImage(wstring &desc) // hide the icon slot m_image.SetShow( FALSE ); } - + BOOL imageShowAtEnd = m_image.IsShown(); if(imageShowAtStart != imageShowAtEnd) { @@ -485,7 +485,7 @@ wstring CScene_TutorialPopup::_SetImage(wstring &desc) } m_description.SetBounds(fDescWidth, fDescHeight); } - + return desc; } diff --git a/Minecraft.Client/ConnectScreen.cpp b/Minecraft.Client/ConnectScreen.cpp index 3f93a5b0..2cf005b6 100644 --- a/Minecraft.Client/ConnectScreen.cpp +++ b/Minecraft.Client/ConnectScreen.cpp @@ -17,7 +17,7 @@ ConnectScreen::ConnectScreen(Minecraft *minecraft, const wstring& ip, int port) // 4J - removed from separate thread, but need to investigate what we actually need here connection = new ClientConnection(minecraft, ip, port); if (aborted) return; - connection->send( std::shared_ptr( new PreLoginPacket(minecraft->user->name) ) ); + connection->send( shared_ptr( new PreLoginPacket(minecraft->user->name) ) ); #else new Thread() { diff --git a/Minecraft.Client/ContainerScreen.cpp b/Minecraft.Client/ContainerScreen.cpp index 0cee4bf5..17b45406 100644 --- a/Minecraft.Client/ContainerScreen.cpp +++ b/Minecraft.Client/ContainerScreen.cpp @@ -3,7 +3,7 @@ #include "Textures.h" #include "..\Minecraft.World\net.minecraft.world.inventory.h" -ContainerScreen::ContainerScreen(std::shared_ptr inventory, std::shared_ptr container) : AbstractContainerScreen(new ContainerMenu(inventory, container)) +ContainerScreen::ContainerScreen(shared_ptr inventory, shared_ptr container) : AbstractContainerScreen(new ContainerMenu(inventory, container)) { this->inventory = inventory; this->container = container; diff --git a/Minecraft.Client/ContainerScreen.h b/Minecraft.Client/ContainerScreen.h index 314026ae..38806c1e 100644 --- a/Minecraft.Client/ContainerScreen.h +++ b/Minecraft.Client/ContainerScreen.h @@ -5,13 +5,13 @@ class Container; class ContainerScreen : public AbstractContainerScreen { private: - std::shared_ptr inventory; - std::shared_ptr container; + shared_ptr inventory; + shared_ptr container; int containerRows; public: - ContainerScreen(std::shared_ptrinventory, std::shared_ptrcontainer); + ContainerScreen(shared_ptrinventory, shared_ptrcontainer); protected: virtual void renderLabels(); diff --git a/Minecraft.Client/CowModel.h b/Minecraft.Client/CowModel.h index b3ffba6a..617bb94f 100644 --- a/Minecraft.Client/CowModel.h +++ b/Minecraft.Client/CowModel.h @@ -1,10 +1,10 @@ #pragma once #include "QuadrupedModel.h" -class CowModel : public QuadrupedModel +class CowModel : public QuadrupedModel { public: CowModel(); -// virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); +// virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); // virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale); }; diff --git a/Minecraft.Client/CowRenderer.cpp b/Minecraft.Client/CowRenderer.cpp index 57b0bbb4..c4eaf261 100644 --- a/Minecraft.Client/CowRenderer.cpp +++ b/Minecraft.Client/CowRenderer.cpp @@ -5,7 +5,7 @@ CowRenderer::CowRenderer(Model *model, float shadow) : MobRenderer(model, shadow { } -void CowRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void CowRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { MobRenderer::render(_mob, x, y, z, rot, a); } \ No newline at end of file diff --git a/Minecraft.Client/CowRenderer.h b/Minecraft.Client/CowRenderer.h index 0dabaf29..e99e1c12 100644 --- a/Minecraft.Client/CowRenderer.h +++ b/Minecraft.Client/CowRenderer.h @@ -5,5 +5,5 @@ class CowRenderer : public MobRenderer { public: CowRenderer(Model *model, float shadow); - virtual void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/CraftingScreen.cpp b/Minecraft.Client/CraftingScreen.cpp index edbc7ec5..c28df18d 100644 --- a/Minecraft.Client/CraftingScreen.cpp +++ b/Minecraft.Client/CraftingScreen.cpp @@ -4,7 +4,7 @@ #include "MultiplayerLocalPlayer.h" #include "..\Minecraft.World\net.minecraft.world.inventory.h" -CraftingScreen::CraftingScreen(std::shared_ptr inventory, Level *level, int x, int y, int z) : AbstractContainerScreen(new CraftingMenu(inventory, level, x, y, z)) +CraftingScreen::CraftingScreen(shared_ptr inventory, Level *level, int x, int y, int z) : AbstractContainerScreen(new CraftingMenu(inventory, level, x, y, z)) { } diff --git a/Minecraft.Client/CraftingScreen.h b/Minecraft.Client/CraftingScreen.h index 42b2623a..2de1681f 100644 --- a/Minecraft.Client/CraftingScreen.h +++ b/Minecraft.Client/CraftingScreen.h @@ -6,7 +6,7 @@ class Level; class CraftingScreen : public AbstractContainerScreen { public: - CraftingScreen(std::shared_ptr inventory, Level *level, int x, int y, int z); + CraftingScreen(shared_ptr inventory, Level *level, int x, int y, int z); virtual void removed(); protected: virtual void renderLabels(); diff --git a/Minecraft.Client/CreativeMode.cpp b/Minecraft.Client/CreativeMode.cpp index 78183c81..48342ebc 100644 --- a/Minecraft.Client/CreativeMode.cpp +++ b/Minecraft.Client/CreativeMode.cpp @@ -19,7 +19,7 @@ void CreativeMode::init() // initPlayer(); } -void CreativeMode::enableCreativeForPlayer(std::shared_ptr player) +void CreativeMode::enableCreativeForPlayer(shared_ptr player) { // please check ServerPlayerGameMode.java if you change these player->abilities.mayfly = true; @@ -27,7 +27,7 @@ void CreativeMode::enableCreativeForPlayer(std::shared_ptr player) player->abilities.invulnerable = true; } -void CreativeMode::disableCreativeForPlayer(std::shared_ptr player) +void CreativeMode::disableCreativeForPlayer(shared_ptr player) { player->abilities.mayfly = false; player->abilities.flying = false; @@ -35,7 +35,7 @@ void CreativeMode::disableCreativeForPlayer(std::shared_ptr player) player->abilities.invulnerable = false; } -void CreativeMode::adjustPlayer(std::shared_ptr player) +void CreativeMode::adjustPlayer(shared_ptr player) { enableCreativeForPlayer(player); @@ -43,7 +43,7 @@ void CreativeMode::adjustPlayer(std::shared_ptr player) { if (player->inventory->items[i] == NULL) { - player->inventory->items[i] = std::shared_ptr( new ItemInstance(User::allowedTiles[i]) ); + player->inventory->items[i] = shared_ptr( new ItemInstance(User::allowedTiles[i]) ); } else { @@ -61,7 +61,7 @@ void CreativeMode::creativeDestroyBlock(Minecraft *minecraft, GameMode *gameMode } } -bool CreativeMode::useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly, bool *pbUsedItem) +bool CreativeMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly, bool *pbUsedItem) { int t = level->getTile(x, y, z); if (t > 0) diff --git a/Minecraft.Client/CreativeMode.h b/Minecraft.Client/CreativeMode.h index 9732cfd0..10b27a53 100644 --- a/Minecraft.Client/CreativeMode.h +++ b/Minecraft.Client/CreativeMode.h @@ -9,11 +9,11 @@ private: public: CreativeMode(Minecraft *minecraft); virtual void init(); - static void enableCreativeForPlayer(std::shared_ptr player); - static void disableCreativeForPlayer(std::shared_ptr player); - virtual void adjustPlayer(std::shared_ptr player); + static void enableCreativeForPlayer(shared_ptr player); + static void disableCreativeForPlayer(shared_ptr player); + virtual void adjustPlayer(shared_ptr player); static void creativeDestroyBlock(Minecraft *minecraft, GameMode *gameMode, int x, int y, int z, int face); - virtual bool useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly=false, bool *pbUsedItem = NULL); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly=false, bool *pbUsedItem = NULL); virtual void startDestroyBlock(int x, int y, int z, int face); virtual void continueDestroyBlock(int x, int y, int z, int face); virtual void stopDestroyBlock(); diff --git a/Minecraft.Client/CreeperModel.cpp b/Minecraft.Client/CreeperModel.cpp index 6c2737d3..51237ce6 100644 --- a/Minecraft.Client/CreeperModel.cpp +++ b/Minecraft.Client/CreeperModel.cpp @@ -56,7 +56,7 @@ CreeperModel::CreeperModel(float g) : Model() _init(g); } -void CreeperModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void CreeperModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); diff --git a/Minecraft.Client/CreeperModel.h b/Minecraft.Client/CreeperModel.h index 0c4e9448..06231d0e 100644 --- a/Minecraft.Client/CreeperModel.h +++ b/Minecraft.Client/CreeperModel.h @@ -9,6 +9,6 @@ public: void _init(float g); // 4J added CreeperModel(); CreeperModel(float g); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/CreeperRenderer.cpp b/Minecraft.Client/CreeperRenderer.cpp index 4afa22a8..483d14e3 100644 --- a/Minecraft.Client/CreeperRenderer.cpp +++ b/Minecraft.Client/CreeperRenderer.cpp @@ -9,9 +9,9 @@ CreeperRenderer::CreeperRenderer() : MobRenderer( new CreeperModel(), 0.5f ) armorModel = new CreeperModel(2); } -void CreeperRenderer::scale(std::shared_ptr mob, float a) +void CreeperRenderer::scale(shared_ptr mob, float a) { - std::shared_ptr creeper = dynamic_pointer_cast(mob); + shared_ptr creeper = dynamic_pointer_cast(mob); float g = creeper->getSwelling(a); @@ -25,9 +25,9 @@ void CreeperRenderer::scale(std::shared_ptr mob, float a) glScalef(s, hs, s); } -int CreeperRenderer::getOverlayColor(std::shared_ptr mob, float br, float a) +int CreeperRenderer::getOverlayColor(shared_ptr mob, float br, float a) { - std::shared_ptr creeper = dynamic_pointer_cast(mob); + shared_ptr creeper = dynamic_pointer_cast(mob); float step = creeper->getSwelling(a); @@ -44,10 +44,10 @@ int CreeperRenderer::getOverlayColor(std::shared_ptr mob, float br, float a return (_a << 24) | (r << 16) | (g << 8) | b; } -int CreeperRenderer::prepareArmor(std::shared_ptr _mob, int layer, float a) +int CreeperRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if (mob->isPowered()) { if (mob->isInvisible()) glDepthMask(false); @@ -84,7 +84,7 @@ int CreeperRenderer::prepareArmor(std::shared_ptr _mob, int layer, float a) } -int CreeperRenderer::prepareArmorOverlay(std::shared_ptr mob, int layer, float a) +int CreeperRenderer::prepareArmorOverlay(shared_ptr mob, int layer, float a) { return -1; } \ No newline at end of file diff --git a/Minecraft.Client/CreeperRenderer.h b/Minecraft.Client/CreeperRenderer.h index 3afd511b..4d0fac10 100644 --- a/Minecraft.Client/CreeperRenderer.h +++ b/Minecraft.Client/CreeperRenderer.h @@ -9,8 +9,8 @@ private: public: CreeperRenderer(); protected: - virtual void scale(std::shared_ptr _mob, float a); - virtual int getOverlayColor(std::shared_ptr mob, float br, float a); - virtual int prepareArmor(std::shared_ptr mob, int layer, float a); - virtual int prepareArmorOverlay(std::shared_ptr _mob, int layer, float a); + virtual void scale(shared_ptr _mob, float a); + virtual int getOverlayColor(shared_ptr mob, float br, float a); + virtual int prepareArmor(shared_ptr mob, int layer, float a); + virtual int prepareArmorOverlay(shared_ptr _mob, int layer, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/CritParticle.cpp b/Minecraft.Client/CritParticle.cpp index ec99d248..6c71b027 100644 --- a/Minecraft.Client/CritParticle.cpp +++ b/Minecraft.Client/CritParticle.cpp @@ -5,7 +5,7 @@ #include "..\Minecraft.World\net.minecraft.world.phys.h" #include "..\Minecraft.World\net.minecraft.world.level.h" -void CritParticle::_init(Level *level, std::shared_ptr entity, ePARTICLE_TYPE type) +void CritParticle::_init(Level *level, shared_ptr entity, ePARTICLE_TYPE type) { life = 0; this->entity = entity; @@ -15,17 +15,17 @@ void CritParticle::_init(Level *level, std::shared_ptr entity, ePARTICLE //tick(); } -CritParticle::CritParticle(Level *level, std::shared_ptr entity) : Particle(level, entity->x, entity->bb->y0 + entity->bbHeight / 2, entity->z, entity->xd, entity->yd, entity->zd) +CritParticle::CritParticle(Level *level, shared_ptr entity) : Particle(level, entity->x, entity->bb->y0 + entity->bbHeight / 2, entity->z, entity->xd, entity->yd, entity->zd) { _init(level,entity,eParticleType_crit); } -CritParticle::CritParticle(Level *level, std::shared_ptr entity, ePARTICLE_TYPE type) : Particle(level, entity->x, entity->bb->y0 + entity->bbHeight / 2, entity->z, entity->xd, entity->yd, entity->zd) +CritParticle::CritParticle(Level *level, shared_ptr entity, ePARTICLE_TYPE type) : Particle(level, entity->x, entity->bb->y0 + entity->bbHeight / 2, entity->z, entity->xd, entity->yd, entity->zd) { _init(level, entity, type); } -// 4J - Added this so that we can use some std::shared_ptr functions that were needed in the ctor +// 4J - Added this so that we can use some shared_ptr functions that were needed in the ctor void CritParticle::CritParticlePostConstructor(void) { tick(); @@ -49,7 +49,7 @@ void CritParticle::tick() level->addParticle(particleName, x, y, z, xa, ya+0.2, za); } life++; - if (life >= lifeTime) + if (life >= lifeTime) { remove(); } diff --git a/Minecraft.Client/CritParticle.h b/Minecraft.Client/CritParticle.h index 5bad1c25..23f30339 100644 --- a/Minecraft.Client/CritParticle.h +++ b/Minecraft.Client/CritParticle.h @@ -7,17 +7,17 @@ class Entity; class CritParticle : public Particle { private: - std::shared_ptr entity; + shared_ptr entity; int life; int lifeTime; ePARTICLE_TYPE particleName; - void _init(Level *level, std::shared_ptr entity, ePARTICLE_TYPE type); + void _init(Level *level, shared_ptr entity, ePARTICLE_TYPE type); public: virtual eINSTANCEOF GetType() { return eType_CRITPARTICLE; } - CritParticle(Level *level, std::shared_ptr entity); - CritParticle(Level *level, std::shared_ptr entity, ePARTICLE_TYPE type); + CritParticle(Level *level, shared_ptr entity); + CritParticle(Level *level, shared_ptr entity, ePARTICLE_TYPE type); void CritParticlePostConstructor(void); void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); void tick(); diff --git a/Minecraft.Client/DefaultRenderer.cpp b/Minecraft.Client/DefaultRenderer.cpp index f6cb38ee..d4c15737 100644 --- a/Minecraft.Client/DefaultRenderer.cpp +++ b/Minecraft.Client/DefaultRenderer.cpp @@ -2,7 +2,7 @@ #include "DefaultRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" -void DefaultRenderer::render(std::shared_ptr entity, double x, double y, double z, float rot, float a) +void DefaultRenderer::render(shared_ptr entity, double x, double y, double z, float rot, float a) { glPushMatrix(); // 4J - removed following line as doesn't really make any sense diff --git a/Minecraft.Client/DefaultRenderer.h b/Minecraft.Client/DefaultRenderer.h index 651a99c1..dcb5a9c3 100644 --- a/Minecraft.Client/DefaultRenderer.h +++ b/Minecraft.Client/DefaultRenderer.h @@ -4,5 +4,5 @@ class DefaultRenderer : public EntityRenderer { public: - virtual void render(std::shared_ptr entity, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/DemoLevel.cpp b/Minecraft.Client/DemoLevel.cpp index f112aed4..52edc0ba 100644 --- a/Minecraft.Client/DemoLevel.cpp +++ b/Minecraft.Client/DemoLevel.cpp @@ -2,7 +2,7 @@ #include "DemoLevel.h" #include "..\Minecraft.World\net.minecraft.world.level.storage.h" -DemoLevel::DemoLevel(std::shared_ptr levelStorage, const wstring& levelName) : Level(levelStorage, levelName, DEMO_LEVEL_SEED) +DemoLevel::DemoLevel(shared_ptr levelStorage, const wstring& levelName) : Level(levelStorage, levelName, DEMO_LEVEL_SEED) { } diff --git a/Minecraft.Client/DemoLevel.h b/Minecraft.Client/DemoLevel.h index 4c1ef110..6464c32b 100644 --- a/Minecraft.Client/DemoLevel.h +++ b/Minecraft.Client/DemoLevel.h @@ -9,7 +9,7 @@ private: static const int DEMO_SPAWN_Y = 72; static const int DEMO_SPAWN_Z = -731; public: - DemoLevel(std::shared_ptr levelStorage, const wstring& levelName); + DemoLevel(shared_ptr levelStorage, const wstring& levelName); DemoLevel(Level *level, Dimension *dimension); protected: virtual void setInitialSpawn(); diff --git a/Minecraft.Client/DemoMode.cpp b/Minecraft.Client/DemoMode.cpp index 798f7bd4..0816023b 100644 --- a/Minecraft.Client/DemoMode.cpp +++ b/Minecraft.Client/DemoMode.cpp @@ -95,7 +95,7 @@ bool DemoMode::destroyBlock(int x, int y, int z, int face) return SurvivalMode::destroyBlock(x, y, z, face); } -bool DemoMode::useItem(std::shared_ptr player, Level *level, std::shared_ptr item) +bool DemoMode::useItem(shared_ptr player, Level *level, shared_ptr item) { if (demoHasEnded) { @@ -105,7 +105,7 @@ bool DemoMode::useItem(std::shared_ptr player, Level *level, std::shared return SurvivalMode::useItem(player, level, item); } -bool DemoMode::useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face) +bool DemoMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face) { if (demoHasEnded) { outputDemoReminder(); @@ -114,7 +114,7 @@ bool DemoMode::useItemOn(std::shared_ptr player, Level *level, std::shar return SurvivalMode::useItemOn(player, level, item, x, y, z, face); } -void DemoMode::attack(std::shared_ptr player, std::shared_ptr entity) +void DemoMode::attack(shared_ptr player, shared_ptr entity) { if (demoHasEnded) { diff --git a/Minecraft.Client/DemoMode.h b/Minecraft.Client/DemoMode.h index 9b5f1940..429c9ec3 100644 --- a/Minecraft.Client/DemoMode.h +++ b/Minecraft.Client/DemoMode.h @@ -21,7 +21,7 @@ public: virtual void startDestroyBlock(int x, int y, int z, int face); virtual void continueDestroyBlock(int x, int y, int z, int face); virtual bool destroyBlock(int x, int y, int z, int face); - virtual bool useItem(std::shared_ptr player, Level *level, std::shared_ptr item); - virtual bool useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face); - virtual void attack(std::shared_ptr player, std::shared_ptr entity); + virtual bool useItem(shared_ptr player, Level *level, shared_ptr item); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face); + virtual void attack(shared_ptr player, shared_ptr entity); }; diff --git a/Minecraft.Client/DerivedServerLevel.cpp b/Minecraft.Client/DerivedServerLevel.cpp index 114a7d45..a67408d7 100644 --- a/Minecraft.Client/DerivedServerLevel.cpp +++ b/Minecraft.Client/DerivedServerLevel.cpp @@ -3,7 +3,7 @@ #include "..\Minecraft.World\SavedDataStorage.h" #include "..\Minecraft.World\DerivedLevelData.h" -DerivedServerLevel::DerivedServerLevel(MinecraftServer *server, std::shared_ptr levelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings, ServerLevel *wrapped) +DerivedServerLevel::DerivedServerLevel(MinecraftServer *server, shared_ptr levelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings, ServerLevel *wrapped) : ServerLevel(server, levelStorage, levelName, dimension, levelSettings) { // 4J-PB - we're going to override the savedDataStorage, so we need to delete the current one diff --git a/Minecraft.Client/DerivedServerLevel.h b/Minecraft.Client/DerivedServerLevel.h index ada362f4..2d49e4fa 100644 --- a/Minecraft.Client/DerivedServerLevel.h +++ b/Minecraft.Client/DerivedServerLevel.h @@ -4,7 +4,7 @@ class DerivedServerLevel : public ServerLevel { public: - DerivedServerLevel(MinecraftServer *server, std::shared_ptrlevelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings, ServerLevel *wrapped); + DerivedServerLevel(MinecraftServer *server, shared_ptrlevelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings, ServerLevel *wrapped); ~DerivedServerLevel(); protected: diff --git a/Minecraft.Client/DirtyChunkSorter.cpp b/Minecraft.Client/DirtyChunkSorter.cpp index 0dd07a2a..1a7c10cc 100644 --- a/Minecraft.Client/DirtyChunkSorter.cpp +++ b/Minecraft.Client/DirtyChunkSorter.cpp @@ -3,7 +3,7 @@ #include "../Minecraft.World/net.minecraft.world.entity.player.h" #include "Chunk.h" -DirtyChunkSorter::DirtyChunkSorter(std::shared_ptr cameraEntity, int playerIndex) // 4J - added player index +DirtyChunkSorter::DirtyChunkSorter(shared_ptr cameraEntity, int playerIndex) // 4J - added player index { this->cameraEntity = cameraEntity; this->playerIndex = playerIndex; diff --git a/Minecraft.Client/DirtyChunkSorter.h b/Minecraft.Client/DirtyChunkSorter.h index 6d13c4e5..4caa2fac 100644 --- a/Minecraft.Client/DirtyChunkSorter.h +++ b/Minecraft.Client/DirtyChunkSorter.h @@ -2,13 +2,13 @@ class Chunk; class Mob; -class DirtyChunkSorter : public std::binary_function +class DirtyChunkSorter : public std::binary_function { private: - std::shared_ptr cameraEntity; + shared_ptr cameraEntity; int playerIndex; // 4J added public: - DirtyChunkSorter(std::shared_ptr cameraEntity, int playerIndex); // 4J - added player index + DirtyChunkSorter(shared_ptr cameraEntity, int playerIndex); // 4J - added player index bool operator()(const Chunk *a, const Chunk *b) const; }; \ No newline at end of file diff --git a/Minecraft.Client/DistanceChunkSorter.cpp b/Minecraft.Client/DistanceChunkSorter.cpp index 6bfeb6d9..80ac0cdf 100644 --- a/Minecraft.Client/DistanceChunkSorter.cpp +++ b/Minecraft.Client/DistanceChunkSorter.cpp @@ -3,7 +3,7 @@ #include "../Minecraft.World/net.minecraft.world.entity.player.h" #include "Chunk.h" -DistanceChunkSorter::DistanceChunkSorter(std::shared_ptr player) +DistanceChunkSorter::DistanceChunkSorter(shared_ptr player) { ix = -player->x; iy = -player->y; @@ -15,7 +15,7 @@ bool DistanceChunkSorter::operator()(const Chunk *c0, const Chunk *c1) const double xd0 = c0->xm + ix; double yd0 = c0->ym + iy; double zd0 = c0->zm + iz; - + double xd1 = c1->xm + ix; double yd1 = c1->ym + iy; double zd1 = c1->zm + iz; diff --git a/Minecraft.Client/DistanceChunkSorter.h b/Minecraft.Client/DistanceChunkSorter.h index 952c1656..4789070d 100644 --- a/Minecraft.Client/DistanceChunkSorter.h +++ b/Minecraft.Client/DistanceChunkSorter.h @@ -2,12 +2,12 @@ class Entity; class Chunk; -class DistanceChunkSorter : public std::binary_function +class DistanceChunkSorter : public std::binary_function { private: double ix, iy, iz; public: - DistanceChunkSorter(std::shared_ptr player); + DistanceChunkSorter(shared_ptr player); bool operator()(const Chunk *a, const Chunk *b) const; }; \ No newline at end of file diff --git a/Minecraft.Client/DragonModel.cpp b/Minecraft.Client/DragonModel.cpp index e3ff4c53..39861829 100644 --- a/Minecraft.Client/DragonModel.cpp +++ b/Minecraft.Client/DragonModel.cpp @@ -106,15 +106,15 @@ DragonModel::DragonModel(float g) : Model() rearFoot->compile(1.0f/16.0f); } -void DragonModel::prepareMobModel(std::shared_ptr mob, float time, float r, float a) +void DragonModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { this->a = a; } -void DragonModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void DragonModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { glPushMatrix(); - std::shared_ptr dragon = dynamic_pointer_cast(entity); + shared_ptr dragon = dynamic_pointer_cast(entity); float ttt = dragon->oFlapTime + (dragon->flapTime - dragon->oFlapTime) * a; jaw->xRot = (float) (Mth::sin(ttt * PI * 2) + 1) * 0.2f; @@ -153,7 +153,7 @@ void DragonModel::render(std::shared_ptr entity, float time, float r, fl double pComponents[3]; doubleArray p = doubleArray(pComponents,3); - for (int i = 0; i < 5; i++) + for (int i = 0; i < 5; i++) { dragon->getLatencyPos(p, 5 - i, a); @@ -185,9 +185,9 @@ void DragonModel::render(std::shared_ptr entity, float time, float r, fl glTranslatef(0, -1, 0); body->zRot = 0; body->render(scale,usecompiled); - + glEnable(GL_CULL_FACE); - for (int i = 0; i < 2; i++) + for (int i = 0; i < 2; i++) { float flapTime = ttt * PI * 2; wing->xRot = 0.125f - (float) (Mth::cos(flapTime)) * 0.2f; @@ -206,7 +206,7 @@ void DragonModel::render(std::shared_ptr entity, float time, float r, fl frontLeg->render(scale,usecompiled); rearLeg->render(scale,usecompiled); glScalef(-1, 1, 1); - if (i == 0) + if (i == 0) { glCullFace(GL_FRONT); } @@ -221,7 +221,7 @@ void DragonModel::render(std::shared_ptr entity, float time, float r, fl zz = 60; xx = 0; dragon->getLatencyPos(start, 11, a); - for (int i = 0; i < 12; i++) + for (int i = 0; i < 12; i++) { dragon->getLatencyPos(p, 12 + i, a); rr += Mth::sin(i * 0.45f + roff) * 0.05f; @@ -238,7 +238,7 @@ void DragonModel::render(std::shared_ptr entity, float time, float r, fl } glPopMatrix(); } -float DragonModel::rotWrap(double d) +float DragonModel::rotWrap(double d) { while (d >= 180) d -= 360; diff --git a/Minecraft.Client/DragonModel.h b/Minecraft.Client/DragonModel.h index baee83de..47c20cba 100644 --- a/Minecraft.Client/DragonModel.h +++ b/Minecraft.Client/DragonModel.h @@ -26,8 +26,8 @@ public: ModelPart *cubes[5]; DragonModel(float g); - void prepareMobModel(std::shared_ptr mob, float time, float r, float a); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); private: float rotWrap(double d); diff --git a/Minecraft.Client/Durango/Network/ChatIntegrationLayer.cpp b/Minecraft.Client/Durango/Network/ChatIntegrationLayer.cpp index a3b3c981..232b4dd3 100644 --- a/Minecraft.Client/Durango/Network/ChatIntegrationLayer.cpp +++ b/Minecraft.Client/Durango/Network/ChatIntegrationLayer.cpp @@ -12,7 +12,7 @@ using namespace Windows::Foundation; using namespace Windows::Xbox::System; -// To integrate the Chat DLL in your game, you can use this ChatIntegrationLayer class with modifications, +// To integrate the Chat DLL in your game, you can use this ChatIntegrationLayer class with modifications, // or create your own design your own class using the code in this file a guide. std::shared_ptr GetChatIntegrationLayer() { @@ -25,12 +25,12 @@ std::shared_ptr GetChatIntegrationLayer() return chatIntegrationLayerInstance; } -ChatIntegrationLayer::ChatIntegrationLayer() +ChatIntegrationLayer::ChatIntegrationLayer() { ZeroMemory( m_chatVoicePacketsStatistic, sizeof(m_chatVoicePacketsStatistic) ); } -void ChatIntegrationLayer::InitializeChatManager( +void ChatIntegrationLayer::InitializeChatManager( __in bool combineCaptureBuffersIntoSinglePacket, __in bool useKinectAsCaptureSource, __in bool applySoundEffectsToCapturedAudio, @@ -69,9 +69,9 @@ void ChatIntegrationLayer::InitializeChatManager( m_chatManager->ChatSettings->PerformanceCountersEnabled = true; #endif - // Upon enter constrained mode, mute everyone. + // Upon enter constrained mode, mute everyone. // Upon leaving constrained mode, unmute everyone who was previously muted. - m_tokenResourceAvailabilityChanged = Windows::ApplicationModel::Core::CoreApplication::ResourceAvailabilityChanged += + m_tokenResourceAvailabilityChanged = Windows::ApplicationModel::Core::CoreApplication::ResourceAvailabilityChanged += ref new EventHandler< Platform::Object^ >( [weakPtrToThis] (Platform::Object^, Platform::Object^ ) { // Using a std::weak_ptr instead of 'this' to avoid dangling pointer if caller class is released. @@ -99,7 +99,7 @@ void ChatIntegrationLayer::InitializeChatManager( } }); - m_tokenOnDebugMessage = m_chatManager->OnDebugMessage += + m_tokenOnDebugMessage = m_chatManager->OnDebugMessage += ref new Windows::Foundation::EventHandler( [weakPtrToThis] ( Platform::Object^, Microsoft::Xbox::GameChat::DebugMessageEventArgs^ args ) { @@ -112,8 +112,8 @@ void ChatIntegrationLayer::InitializeChatManager( } }); - m_tokenOnOutgoingChatPacketReady = m_chatManager->OnOutgoingChatPacketReady += - ref new Windows::Foundation::EventHandler( + m_tokenOnOutgoingChatPacketReady = m_chatManager->OnOutgoingChatPacketReady += + ref new Windows::Foundation::EventHandler( [weakPtrToThis] ( Platform::Object^, Microsoft::Xbox::GameChat::ChatPacketEventArgs^ args ) { // Using a std::weak_ptr instead of 'this' to avoid dangling pointer if caller class is released. @@ -125,16 +125,16 @@ void ChatIntegrationLayer::InitializeChatManager( } }); - m_tokenOnCompareUniqueConsoleIdentifiers = m_chatManager->OnCompareUniqueConsoleIdentifiers += - ref new Microsoft::Xbox::GameChat::CompareUniqueConsoleIdentifiersHandler( - [weakPtrToThis] ( Platform::Object^ obj1, Platform::Object^ obj2 ) - { + m_tokenOnCompareUniqueConsoleIdentifiers = m_chatManager->OnCompareUniqueConsoleIdentifiers += + ref new Microsoft::Xbox::GameChat::CompareUniqueConsoleIdentifiersHandler( + [weakPtrToThis] ( Platform::Object^ obj1, Platform::Object^ obj2 ) + { // Using a std::weak_ptr instead of 'this' to avoid dangling pointer if caller class is released. // Simply unregistering the callback in the destructor isn't enough to prevent a dangling pointer std::shared_ptr sharedPtrToThis(weakPtrToThis.lock()); if( sharedPtrToThis != nullptr ) { - return sharedPtrToThis->CompareUniqueConsoleIdentifiers(obj1, obj2); + return sharedPtrToThis->CompareUniqueConsoleIdentifiers(obj1, obj2); } else { @@ -142,10 +142,10 @@ void ChatIntegrationLayer::InitializeChatManager( } }); - m_tokenUserAudioDeviceAdded = WXS::User::AudioDeviceAdded += + m_tokenUserAudioDeviceAdded = WXS::User::AudioDeviceAdded += ref new Windows::Foundation::EventHandler( - [weakPtrToThis] ( Platform::Object^, WXS::AudioDeviceAddedEventArgs^ value ) - { + [weakPtrToThis] ( Platform::Object^, WXS::AudioDeviceAddedEventArgs^ value ) + { std::shared_ptr sharedPtrToThis(weakPtrToThis.lock()); if( sharedPtrToThis != nullptr ) { @@ -153,10 +153,10 @@ void ChatIntegrationLayer::InitializeChatManager( } }); - m_tokenUserAudioDeviceRemoved = WXS::User::AudioDeviceRemoved += + m_tokenUserAudioDeviceRemoved = WXS::User::AudioDeviceRemoved += ref new Windows::Foundation::EventHandler( - [weakPtrToThis] ( Platform::Object^, WXS::AudioDeviceRemovedEventArgs^ value ) - { + [weakPtrToThis] ( Platform::Object^, WXS::AudioDeviceRemovedEventArgs^ value ) + { std::shared_ptr sharedPtrToThis(weakPtrToThis.lock()); if( sharedPtrToThis != nullptr ) { @@ -164,10 +164,10 @@ void ChatIntegrationLayer::InitializeChatManager( } }); - m_tokenUserAudioDeviceChanged = WXS::User::AudioDeviceChanged += + m_tokenUserAudioDeviceChanged = WXS::User::AudioDeviceChanged += ref new Windows::Foundation::EventHandler( - [weakPtrToThis] ( Platform::Object^, WXS::AudioDeviceChangedEventArgs^ value ) - { + [weakPtrToThis] ( Platform::Object^, WXS::AudioDeviceChangedEventArgs^ value ) + { std::shared_ptr sharedPtrToThis(weakPtrToThis.lock()); if( sharedPtrToThis != nullptr ) { @@ -175,16 +175,16 @@ void ChatIntegrationLayer::InitializeChatManager( } }); - //m_tokenSuspending = Windows::ApplicationModel::Core::CoreApplication::Suspending += + //m_tokenSuspending = Windows::ApplicationModel::Core::CoreApplication::Suspending += // ref new EventHandler< Windows::ApplicationModel::SuspendingEventArgs^ >( [weakPtrToThis] (Platform::Object^, Windows::ApplicationModel::SuspendingEventArgs^ args) //{ - // // Upon Suspending, nothing needs to be done + // // Upon Suspending, nothing needs to be done //}); - //m_tokenResuming = Windows::ApplicationModel::Core::CoreApplication::Resuming += + //m_tokenResuming = Windows::ApplicationModel::Core::CoreApplication::Resuming += // ref new EventHandler< Platform::Object^ >( [weakPtrToThis] (Platform::Object^, Windows::ApplicationModel::SuspendingEventArgs^ args) //{ - // // Upon Resuming, re-initialize the network, and reinitialize the chat session + // // Upon Resuming, re-initialize the network, and reinitialize the chat session //}); } @@ -215,14 +215,14 @@ void ChatIntegrationLayer::Shutdown() } } -void ChatIntegrationLayer::OnDebugMessageReceived( - __in Microsoft::Xbox::GameChat::DebugMessageEventArgs^ args +void ChatIntegrationLayer::OnDebugMessageReceived( + __in Microsoft::Xbox::GameChat::DebugMessageEventArgs^ args ) { - // To integrate the Chat DLL in your game, - // change this to false and remove the LogComment calls, + // To integrate the Chat DLL in your game, + // change this to false and remove the LogComment calls, // or integrate with your game's own UI/debug message logging system - bool outputToUI = false; + bool outputToUI = false; if( outputToUI ) { @@ -237,14 +237,14 @@ void ChatIntegrationLayer::OnDebugMessageReceived( } else { - // The string appear in the Visual Studio Output window + // The string appear in the Visual Studio Output window #ifndef _CONTENT_PACKAGE OutputDebugString( args->Message->Data() ); #endif } } -void ChatIntegrationLayer::GameUI_RecordPacketStatistic( +void ChatIntegrationLayer::GameUI_RecordPacketStatistic( __in Microsoft::Xbox::GameChat::ChatMessageType messageType, __in ChatPacketType chatPacketType ) @@ -261,7 +261,7 @@ void ChatIntegrationLayer::GameUI_RecordPacketStatistic( } } -int ChatIntegrationLayer::GameUI_GetPacketStatistic( +int ChatIntegrationLayer::GameUI_GetPacketStatistic( __in Microsoft::Xbox::GameChat::ChatMessageType messageType, __in ChatPacketType chatPacketType ) @@ -278,8 +278,8 @@ int ChatIntegrationLayer::GameUI_GetPacketStatistic( } } -void ChatIntegrationLayer::OnOutgoingChatPacketReady( - __in Microsoft::Xbox::GameChat::ChatPacketEventArgs^ args +void ChatIntegrationLayer::OnOutgoingChatPacketReady( + __in Microsoft::Xbox::GameChat::ChatPacketEventArgs^ args ) { byte *bytes; @@ -298,7 +298,7 @@ void ChatIntegrationLayer::OnOutgoingChatPacketReady( } -void ChatIntegrationLayer::OnIncomingChatMessage( +void ChatIntegrationLayer::OnIncomingChatMessage( unsigned int sessionAddress, Platform::Array^ message ) @@ -308,8 +308,8 @@ void ChatIntegrationLayer::OnIncomingChatMessage( // Instead your title should upon receiving a packet, extract the chat message from it, and then call m_chatManager->ProcessIncomingChatMessage as shown below // You will need to isolate chat messages to be unique from the rest of you game's other message types. - // uniqueRemoteConsoleIdentifier is a Platform::Object^ and can be cast or unboxed to most types. - // What exactly you use doesn't matter, but optimally it would be something that uniquely identifies a console on in the session. + // uniqueRemoteConsoleIdentifier is a Platform::Object^ and can be cast or unboxed to most types. + // What exactly you use doesn't matter, but optimally it would be something that uniquely identifies a console on in the session. // A Windows::Xbox::Networking::SecureDeviceAssociation^ is perfect to use if you have access to it. // This is how you would convert from byte array to a IBuffer^ @@ -331,7 +331,7 @@ void ChatIntegrationLayer::OnIncomingChatMessage( { Microsoft::Xbox::GameChat::ChatMessageType chatMessageType = m_chatManager->ProcessIncomingChatMessage(chatMessage, uniqueRemoteConsoleIdentifier); - GameUI_RecordPacketStatistic( chatMessageType, ChatPacketType::IncomingPacket ); + GameUI_RecordPacketStatistic( chatMessageType, ChatPacketType::IncomingPacket ); } } @@ -341,7 +341,7 @@ void ChatIntegrationLayer::AddAllLocallySignedInUsersToChatClient( __in Windows::Foundation::Collections::IVectorView^ locallySignedInUsers ) { - // To integrate the Chat DLL in your game, + // To integrate the Chat DLL in your game, // add all locally signed in users to the chat client for each( Windows::Xbox::System::User^ user in locallySignedInUsers ) { @@ -486,10 +486,10 @@ void ChatIntegrationLayer::AddLocalUserToChatChannel( __in Windows::Xbox::System::IUser^ user ) { - // Adds a local user to a specific channel. + // Adds a local user to a specific channel. - // This is helper function waits for the task to cm_chatManageromplete so shouldn't be called from the UI thread - // Remove the .wait() and return the result of concurrency::create_task() if you want to call it from the UI thread + // This is helper function waits for the task to cm_chatManageromplete so shouldn't be called from the UI thread + // Remove the .wait() and return the result of concurrency::create_task() if you want to call it from the UI thread // and chain PPL tasks together m_pDQRNet->LogComment( L">>>>>>>>>>>>> AddLocalUserToChatChannel" ); @@ -502,7 +502,7 @@ void ChatIntegrationLayer::AddLocalUserToChatChannel( // Error handling try { - t.get(); + t.get(); } catch ( Platform::Exception^ ex ) { @@ -513,19 +513,19 @@ void ChatIntegrationLayer::AddLocalUserToChatChannel( } } -void ChatIntegrationLayer::RemoveRemoteConsole( +void ChatIntegrationLayer::RemoveRemoteConsole( unsigned int address ) { - // uniqueConsoleIdentifier is a Platform::Object^ and can be cast or unboxed to most types. - // What exactly you use doesn't matter, but optimally it would be something that uniquely identifies a console on in the session. + // uniqueConsoleIdentifier is a Platform::Object^ and can be cast or unboxed to most types. + // What exactly you use doesn't matter, but optimally it would be something that uniquely identifies a console on in the session. // A Windows::Xbox::Networking::SecureDeviceAssociation^ is perfect to use if you have access to it. // This is how you would convert from an int to a Platform::Object^ // Platform::Object obj = IntToPlatformObject(5); - // This is helper function waits for the task to complete so shouldn't be called from the UI thread - // Remove the .wait() and return the result of concurrency::create_task() if you want to call it from the UI thread + // This is helper function waits for the task to complete so shouldn't be called from the UI thread + // Remove the .wait() and return the result of concurrency::create_task() if you want to call it from the UI thread // and chain PPL tasks together Platform::Object^ uniqueRemoteConsoleIdentifier = (Platform::Object^)address; @@ -538,7 +538,7 @@ void ChatIntegrationLayer::RemoveRemoteConsole( // Error handling try { - t.get(); + t.get(); } catch ( Platform::Exception^ ex ) { @@ -549,15 +549,15 @@ void ChatIntegrationLayer::RemoveRemoteConsole( } } -void ChatIntegrationLayer::RemoveUserFromChatChannel( +void ChatIntegrationLayer::RemoveUserFromChatChannel( __in uint8 channelIndex, - __in Windows::Xbox::System::IUser^ user + __in Windows::Xbox::System::IUser^ user ) { if( m_chatManager != nullptr ) { - // This is helper function waits for the task to complete so shouldn't be called from the UI thread - // Remove the .wait() and return the result of concurrency::create_task() if you want to call it from the UI thread + // This is helper function waits for the task to complete so shouldn't be called from the UI thread + // Remove the .wait() and return the result of concurrency::create_task() if you want to call it from the UI thread // and chain PPL tasks together auto asyncOp = m_chatManager->RemoveLocalUserFromChatChannelAsync( channelIndex, user ); @@ -577,13 +577,13 @@ void ChatIntegrationLayer::RemoveUserFromChatChannel( } } -void ChatIntegrationLayer::OnNewSessionAddressAdded( +void ChatIntegrationLayer::OnNewSessionAddressAdded( __in unsigned int address ) { m_pDQRNet->LogCommentFormat( L">>>>>>>>>>>>> OnNewSessionAddressAdded (%d)",address ); Platform::Object^ uniqueConsoleIdentifier = (Platform::Object^)address; - /// Call this when a new console connects. + /// Call this when a new console connects. /// This adds this console to the chat layer if( m_chatManager != nullptr ) { @@ -611,8 +611,8 @@ bool ChatIntegrationLayer::HasMicFocus() return false; } -Platform::Object^ ChatIntegrationLayer::IntToPlatformObject( - __in int val +Platform::Object^ ChatIntegrationLayer::IntToPlatformObject( + __in int val ) { return (Platform::Object^)val; @@ -621,23 +621,23 @@ Platform::Object^ ChatIntegrationLayer::IntToPlatformObject( //return Windows::Foundation::PropertyValue::CreateInt32(val); } -int ChatIntegrationLayer::PlatformObjectToInt( - __in Platform::Object^ uniqueRemoteConsoleIdentifier +int ChatIntegrationLayer::PlatformObjectToInt( + __in Platform::Object^ uniqueRemoteConsoleIdentifier ) { - return safe_cast( uniqueRemoteConsoleIdentifier ); + return safe_cast( uniqueRemoteConsoleIdentifier ); // You can also do the same using a PropertyValue. //return safe_cast(uniqueRemoteConsoleIdentifier)->GetInt32(); } -void ChatIntegrationLayer::HandleChatChannelChanged( - __in uint8 oldChatChannelIndex, - __in uint8 newChatChannelIndex, - __in Microsoft::Xbox::GameChat::ChatUser^ chatUser +void ChatIntegrationLayer::HandleChatChannelChanged( + __in uint8 oldChatChannelIndex, + __in uint8 newChatChannelIndex, + __in Microsoft::Xbox::GameChat::ChatUser^ chatUser ) { - // We remember if the local user was currently muted from all channels. And when we switch channels, + // We remember if the local user was currently muted from all channels. And when we switch channels, // we ensure that the state persists. For remote users, title should implement this themselves // based on title game design if they want to persist the muting state. @@ -674,8 +674,8 @@ void ChatIntegrationLayer::HandleChatChannelChanged( } } -void ChatIntegrationLayer::ChangeChatUserMuteState( - __in Microsoft::Xbox::GameChat::ChatUser^ chatUser +void ChatIntegrationLayer::ChangeChatUserMuteState( + __in Microsoft::Xbox::GameChat::ChatUser^ chatUser ) { /// Helper function to swap the mute state of a specific chat user @@ -692,8 +692,8 @@ void ChatIntegrationLayer::ChangeChatUserMuteState( } } -Microsoft::Xbox::GameChat::ChatUser^ ChatIntegrationLayer::GetChatUserByXboxUserId( - __in Platform::String^ xboxUserId +Microsoft::Xbox::GameChat::ChatUser^ ChatIntegrationLayer::GetChatUserByXboxUserId( + __in Platform::String^ xboxUserId ) { Windows::Foundation::Collections::IVectorView^ chatUsers = GetChatUsers(); @@ -704,14 +704,14 @@ Microsoft::Xbox::GameChat::ChatUser^ ChatIntegrationLayer::GetChatUserByXboxUser return chatUser; } } - + return nullptr; } -bool ChatIntegrationLayer::CompareUniqueConsoleIdentifiers( - __in Platform::Object^ uniqueRemoteConsoleIdentifier1, - __in Platform::Object^ uniqueRemoteConsoleIdentifier2 +bool ChatIntegrationLayer::CompareUniqueConsoleIdentifiers( + __in Platform::Object^ uniqueRemoteConsoleIdentifier1, + __in Platform::Object^ uniqueRemoteConsoleIdentifier2 ) { if (uniqueRemoteConsoleIdentifier1 == nullptr || uniqueRemoteConsoleIdentifier2 == nullptr) @@ -719,7 +719,7 @@ bool ChatIntegrationLayer::CompareUniqueConsoleIdentifiers( return false; } - // uniqueRemoteConsoleIdentifier is a Platform::Object^ and can be cast or unboxed to most types. + // uniqueRemoteConsoleIdentifier is a Platform::Object^ and can be cast or unboxed to most types. // We're using XRNS addresses, which are unsigned ints unsigned int address1 = safe_cast(uniqueRemoteConsoleIdentifier1); unsigned int address2 = safe_cast(uniqueRemoteConsoleIdentifier2); diff --git a/Minecraft.Client/Durango/Network/ChatIntegrationLayer.h b/Minecraft.Client/Durango/Network/ChatIntegrationLayer.h index 4470a22b..80b4e10a 100644 --- a/Minecraft.Client/Durango/Network/ChatIntegrationLayer.h +++ b/Minecraft.Client/Durango/Network/ChatIntegrationLayer.h @@ -16,7 +16,7 @@ enum ChatPacketType OutgoingPacket = 1 }; -class ChatIntegrationLayer +class ChatIntegrationLayer : public std::enable_shared_from_this // shared_from_this is needed to use a weak ref to 'this' when handling delegate callbacks { public: @@ -26,7 +26,7 @@ public: /// /// Initializes the chat manager /// - void InitializeChatManager( + void InitializeChatManager( __in bool combineCaptureBuffersIntoSinglePacketEnabled, __in bool useKinectAsCaptureSource, __in bool applySoundEffectToCapture, @@ -47,8 +47,8 @@ public: bool m_canCaptureAudio; }; - void AddLocalUser( __in Windows::Xbox::System::IUser^ user ); - void RemoveLocalUser( __in Windows::Xbox::System::IUser^ user ); + void AddLocalUser( __in Windows::Xbox::System::IUser^ user ); + void RemoveLocalUser( __in Windows::Xbox::System::IUser^ user ); void EvaluateDevicesForUser(__in Windows::Xbox::System::IUser^ user ); vector m_addedUsers; @@ -57,18 +57,18 @@ public: private: /// /// Adds a local user to a specific channel - /// This is helper function waits for the task to complete so shouldn't be called from the UI thread + /// This is helper function waits for the task to complete so shouldn't be called from the UI thread /// /// The channel to add the user to /// The local user to add - void AddLocalUserToChatChannel( + void AddLocalUserToChatChannel( __in uint8 channelIndex, __in Windows::Xbox::System::IUser^ user - ); + ); /// /// Removes a local user from a specific channel - /// This is helper function waits for the task to complete so shouldn't be called from the UI thread + /// This is helper function waits for the task to complete so shouldn't be called from the UI thread /// /// The channel to remove the user from /// The local user to remove @@ -80,10 +80,10 @@ public: /// /// Removes a remote console from chat - /// This is helper function waits for the task to complete so shouldn't be called from the UI thread + /// This is helper function waits for the task to complete so shouldn't be called from the UI thread /// /// A unique ID for the remote console - void RemoveRemoteConsole( + void RemoveRemoteConsole( unsigned int address ); @@ -92,7 +92,7 @@ public: /// /// A buffer containing the chat message /// A unique ID for the remote console - void OnIncomingChatMessage( + void OnIncomingChatMessage( unsigned int sessionAddress, Platform::Array^ message ); @@ -111,7 +111,7 @@ public: /// Helper function to swap the mute state of a specific chat user /// void ChangeChatUserMuteState( - __in Microsoft::Xbox::GameChat::ChatUser^ chatUser + __in Microsoft::Xbox::GameChat::ChatUser^ chatUser ); /// @@ -120,20 +120,20 @@ public: void HandleChatChannelChanged( __in uint8 oldChatChannelIndex, __in uint8 newChatChannelIndex, - __in Microsoft::Xbox::GameChat::ChatUser^ chatUser + __in Microsoft::Xbox::GameChat::ChatUser^ chatUser ); /// - /// Call this when a new console connects. + /// Call this when a new console connects. /// This adds this console to the chat layer /// - void OnNewSessionAddressAdded( - __in unsigned int address + void OnNewSessionAddressAdded( + __in unsigned int address ); /// /// Adds a list of locally signed in users that have intent to play to the chat session on a specific channel index. - /// Avoid adding any user who is signed in that doesn't have intent to play otherwise users who are biometrically + /// Avoid adding any user who is signed in that doesn't have intent to play otherwise users who are biometrically /// signed in automatically will be added to the chat session /// /// The channel to add the users to @@ -147,8 +147,8 @@ public: /// Handles when a debug message is received. Send this to the UI and OutputDebugString. Games should integrate with their existing log system. /// /// Contains the debug message to log - void OnDebugMessageReceived( - __in Microsoft::Xbox::GameChat::DebugMessageEventArgs^ args + void OnDebugMessageReceived( + __in Microsoft::Xbox::GameChat::DebugMessageEventArgs^ args ); /// @@ -161,8 +161,8 @@ public: /// It should send the chat message in order (if that feature is available) if args->SendInOrder is true /// /// Describes the packet to send - void OnOutgoingChatPacketReady( - __in Microsoft::Xbox::GameChat::ChatPacketEventArgs^ args + void OnOutgoingChatPacketReady( + __in Microsoft::Xbox::GameChat::ChatPacketEventArgs^ args ); /// @@ -189,13 +189,13 @@ public: /// /// Helper function to get specific ChatUser by xboxUserId /// - bool ChatIntegrationLayer::CompareUniqueConsoleIdentifiers( - __in Platform::Object^ uniqueRemoteConsoleIdentifier1, - __in Platform::Object^ uniqueRemoteConsoleIdentifier2 + bool ChatIntegrationLayer::CompareUniqueConsoleIdentifiers( + __in Platform::Object^ uniqueRemoteConsoleIdentifier1, + __in Platform::Object^ uniqueRemoteConsoleIdentifier2 ); /// - /// Helper function to return the ChatPerformanceCounters^ from the ChatManager so perf numbers can be shown on the UI + /// Helper function to return the ChatPerformanceCounters^ from the ChatManager so perf numbers can be shown on the UI /// These numbers will only be valid if m_chatManager->ChatSettings->PerformanceCountersEnabled is set to true. /// Microsoft::Xbox::GameChat::ChatPerformanceCounters^ GetChatPerformanceCounters(); @@ -204,13 +204,13 @@ public: /// Returns a count of the number of chat packets of a specific type that have been either sent or received. /// It is useful to monitor this number in the UI / logs to debug network issues. /// - int GameUI_GetPacketStatistic( + int GameUI_GetPacketStatistic( __in Microsoft::Xbox::GameChat::ChatMessageType messageType, __in ChatPacketType chatPacketType ); - - void OnControllerPairingChanged( - __in Windows::Xbox::Input::ControllerPairingChangedEventArgs^ args + + void OnControllerPairingChanged( + __in Windows::Xbox::Input::ControllerPairingChangedEventArgs^ args ); void ToggleRenderTargetVolume(); @@ -233,7 +233,7 @@ private: // Debug stats for chat packets. Use Debug_GetPacketStatistic() to get the values. /// It is useful to monitor this number in the UI / logs to debug network issues. - void GameUI_RecordPacketStatistic( + void GameUI_RecordPacketStatistic( __in Microsoft::Xbox::GameChat::ChatMessageType messageType, __in ChatPacketType chatPacketType ); diff --git a/Minecraft.Client/Durango/Sentient/DurangoTelemetry.cpp b/Minecraft.Client/Durango/Sentient/DurangoTelemetry.cpp index 1b4f5465..d51ce966 100644 --- a/Minecraft.Client/Durango/Sentient/DurangoTelemetry.cpp +++ b/Minecraft.Client/Durango/Sentient/DurangoTelemetry.cpp @@ -51,13 +51,13 @@ HRESULT CDurangoTelemetryManager::Flush() bool CDurangoTelemetryManager::RecordPlayerSessionStart(int iPad) { durangoStats()->generatePlayerSession(); - + return true; } bool CDurangoTelemetryManager::RecordPlayerSessionExit(int iPad, int exitStatus) { - PlayerUID puid; std::shared_ptr plr; + PlayerUID puid; shared_ptr plr; ProfileManager.GetXUID(iPad, &puid, true); plr = Minecraft::GetInstance()->localplayers[iPad]; @@ -123,11 +123,11 @@ bool CDurangoTelemetryManager::RecordPlayerSessionExit(int iPad, int exitStatus) bool CDurangoTelemetryManager::RecordLevelStart(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers) { CTelemetryManager::RecordLevelStart(iPad, friendsOrMatch, competeOrCoop, difficulty, numberOfLocalPlayers, numberOfOnlinePlayers); - + ULONG hr = 0; // Grab player info. - PlayerUID puid; std::shared_ptr plr; + PlayerUID puid; shared_ptr plr; ProfileManager.GetXUID(iPad, &puid, true); plr = Minecraft::GetInstance()->localplayers[iPad]; @@ -191,10 +191,10 @@ bool CDurangoTelemetryManager::RecordLevelStart(int iPad, ESen_FriendOrMatch fri GetSubLevelId(iPad), GetLevelInstanceID(), &ZERO_GUID, - friendsOrMatch, - competeOrCoop, - difficulty, - numberOfLocalPlayers, + friendsOrMatch, + competeOrCoop, + difficulty, + numberOfLocalPlayers, numberOfOnlinePlayers, &ZERO_GUID ); @@ -219,10 +219,10 @@ bool CDurangoTelemetryManager::RecordLevelStart(int iPad, ESen_FriendOrMatch fri // Durango // /* GUID */ guid2str(DurangoStats::getPlayerSession()).c_str(), /* WSTR */ DurangoStats::getMultiplayerCorrelationId(), - /* int */ friendsOrMatch, - /* int */ competeOrCoop, - /* int */ difficulty, - /* int */ numberOfLocalPlayers, + /* int */ friendsOrMatch, + /* int */ competeOrCoop, + /* int */ difficulty, + /* int */ numberOfLocalPlayers, /* int */ numberOfOnlinePlayers ); @@ -577,7 +577,7 @@ bool CDurangoTelemetryManager::RecordMediaShareUpload(int iPad, ESen_MediaDestin mediaDestination, mediaType ); -#else +#else ULONG hr = -1; #endif diff --git a/Minecraft.Client/EnchantTableRenderer.cpp b/Minecraft.Client/EnchantTableRenderer.cpp index a16a0473..43f2b040 100644 --- a/Minecraft.Client/EnchantTableRenderer.cpp +++ b/Minecraft.Client/EnchantTableRenderer.cpp @@ -14,10 +14,10 @@ EnchantTableRenderer::~EnchantTableRenderer() delete bookModel; } -void EnchantTableRenderer::render(std::shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +void EnchantTableRenderer::render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J Convert as we aren't using a templated class - std::shared_ptr table = dynamic_pointer_cast(_table); + shared_ptr table = dynamic_pointer_cast(_table); #ifdef __PSVITA__ // AP - the book pages are made with 0 depth so the front and back polys are at the same location. This can cause z-fighting if culling is disabled which can sometimes happen diff --git a/Minecraft.Client/EnchantTableRenderer.h b/Minecraft.Client/EnchantTableRenderer.h index 77485719..0b738ca9 100644 --- a/Minecraft.Client/EnchantTableRenderer.h +++ b/Minecraft.Client/EnchantTableRenderer.h @@ -15,5 +15,5 @@ public: EnchantTableRenderer(); ~EnchantTableRenderer(); - virtual void render(std::shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); + virtual void render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); }; diff --git a/Minecraft.Client/EnderChestRenderer.cpp b/Minecraft.Client/EnderChestRenderer.cpp index 67e27bf7..2996b65f 100644 --- a/Minecraft.Client/EnderChestRenderer.cpp +++ b/Minecraft.Client/EnderChestRenderer.cpp @@ -3,10 +3,10 @@ #include "ModelPart.h" #include "EnderChestRenderer.h" -void EnderChestRenderer::render(std::shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +void EnderChestRenderer::render(shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J Convert as we aren't using a templated class - std::shared_ptr chest = dynamic_pointer_cast(_chest); + shared_ptr chest = dynamic_pointer_cast(_chest); int data = 0; diff --git a/Minecraft.Client/EnderChestRenderer.h b/Minecraft.Client/EnderChestRenderer.h index 0ff14e48..d0521ae0 100644 --- a/Minecraft.Client/EnderChestRenderer.h +++ b/Minecraft.Client/EnderChestRenderer.h @@ -9,5 +9,5 @@ private: ChestModel chestModel; public: - void render(std::shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param + void render(shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param }; diff --git a/Minecraft.Client/EnderCrystalModel.cpp b/Minecraft.Client/EnderCrystalModel.cpp index 4d664605..fde03cd8 100644 --- a/Minecraft.Client/EnderCrystalModel.cpp +++ b/Minecraft.Client/EnderCrystalModel.cpp @@ -3,7 +3,7 @@ -EnderCrystalModel::EnderCrystalModel(float g) +EnderCrystalModel::EnderCrystalModel(float g) { glass = new ModelPart(this, L"glass"); glass->texOffs(0, 0)->addBox(-4, -4, -4, 8, 8, 8); @@ -21,7 +21,7 @@ EnderCrystalModel::EnderCrystalModel(float g) } -void EnderCrystalModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void EnderCrystalModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { glPushMatrix(); glScalef(2, 2, 2); diff --git a/Minecraft.Client/EnderCrystalModel.h b/Minecraft.Client/EnderCrystalModel.h index 42ae1b3d..71f1db10 100644 --- a/Minecraft.Client/EnderCrystalModel.h +++ b/Minecraft.Client/EnderCrystalModel.h @@ -14,5 +14,5 @@ private: public: EnderCrystalModel(float g); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/EnderCrystalRenderer.cpp b/Minecraft.Client/EnderCrystalRenderer.cpp index f392824d..452206bc 100644 --- a/Minecraft.Client/EnderCrystalRenderer.cpp +++ b/Minecraft.Client/EnderCrystalRenderer.cpp @@ -9,11 +9,11 @@ EnderCrystalRenderer::EnderCrystalRenderer() this->shadowRadius = 0.5f; } -void EnderCrystalRenderer::render(std::shared_ptr _crystal, double x, double y, double z, float rot, float a) +void EnderCrystalRenderer::render(shared_ptr _crystal, double x, double y, double z, float rot, float a) { - // 4J - original version used generics and thus had an input parameter of type EnderCrystal rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type EnderCrystal rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr crystal = dynamic_pointer_cast(_crystal); + shared_ptr crystal = dynamic_pointer_cast(_crystal); if (currentModel != EnderCrystalModel::MODEL_ID) { model = new EnderCrystalModel(0); diff --git a/Minecraft.Client/EnderCrystalRenderer.h b/Minecraft.Client/EnderCrystalRenderer.h index 5ac644d1..de5dc820 100644 --- a/Minecraft.Client/EnderCrystalRenderer.h +++ b/Minecraft.Client/EnderCrystalRenderer.h @@ -13,5 +13,5 @@ private: public: EnderCrystalRenderer(); - virtual void render(std::shared_ptr _crystal, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _crystal, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/EnderDragonRenderer.cpp b/Minecraft.Client/EnderDragonRenderer.cpp index 7fe0bf3f..8c531d4e 100644 --- a/Minecraft.Client/EnderDragonRenderer.cpp +++ b/Minecraft.Client/EnderDragonRenderer.cpp @@ -5,7 +5,7 @@ #include "Lighting.h" #include "EnderDragonRenderer.h" -std::shared_ptr EnderDragonRenderer::bossInstance; +shared_ptr EnderDragonRenderer::bossInstance; int EnderDragonRenderer::currentModel; EnderDragonRenderer::EnderDragonRenderer() : MobRenderer(new DragonModel(0), 0.5f) @@ -15,10 +15,10 @@ EnderDragonRenderer::EnderDragonRenderer() : MobRenderer(new DragonModel(0), 0.5 this->setArmor(model); } -void EnderDragonRenderer::setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a) -{ +void EnderDragonRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) +{ // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); // 4J - reorganised a bit so we can free allocations double lpComponents[3]; @@ -32,7 +32,7 @@ void EnderDragonRenderer::setupRotations(std::shared_ptr _mob, float bob, f float rot2 = mob->getTilt(a); glRotatef(-yr, 0, 1, 0); - + glRotatef(rot2, 1, 0, 0); //glRotatef(rot2 * 10, 1, 0, 0); @@ -46,10 +46,10 @@ void EnderDragonRenderer::setupRotations(std::shared_ptr _mob, float bob, f } } -void EnderDragonRenderer::renderModel(std::shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) +void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if (mob->dragonDeathTime > 0) { @@ -87,10 +87,10 @@ void EnderDragonRenderer::renderModel(std::shared_ptr _mob, float wp, fl } } -void EnderDragonRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); EnderDragonRenderer::bossInstance = mob; if (currentModel != DragonModel::MODEL_ID) { @@ -167,10 +167,10 @@ void EnderDragonRenderer::render(std::shared_ptr _mob, double x, double } } -void EnderDragonRenderer::additionalRendering(std::shared_ptr _mob, float a) -{ +void EnderDragonRenderer::additionalRendering(shared_ptr _mob, float a) +{ // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); MobRenderer::additionalRendering(mob, a); Tesselator *t = Tesselator::getInstance(); @@ -227,10 +227,10 @@ void EnderDragonRenderer::additionalRendering(std::shared_ptr _mob, float a } -int EnderDragonRenderer::prepareArmor(std::shared_ptr _mob, int layer, float a) +int EnderDragonRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if (layer == 1) { diff --git a/Minecraft.Client/EnderDragonRenderer.h b/Minecraft.Client/EnderDragonRenderer.h index 095e2cf2..ab508d99 100644 --- a/Minecraft.Client/EnderDragonRenderer.h +++ b/Minecraft.Client/EnderDragonRenderer.h @@ -10,7 +10,7 @@ class DragonModel; class EnderDragonRenderer : public MobRenderer { public: - static std::shared_ptr bossInstance; + static shared_ptr bossInstance; private: static int currentModel; @@ -22,15 +22,15 @@ public: EnderDragonRenderer(); protected: - virtual void setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); protected: - void renderModel(std::shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); + void renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); public: - virtual void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - virtual void additionalRendering(std::shared_ptr _mob, float a); - virtual int prepareArmor(std::shared_ptr _mob, int layer, float a); + virtual void additionalRendering(shared_ptr _mob, float a); + virtual int prepareArmor(shared_ptr _mob, int layer, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/EndermanRenderer.cpp b/Minecraft.Client/EndermanRenderer.cpp index cf96e693..8802376a 100644 --- a/Minecraft.Client/EndermanRenderer.cpp +++ b/Minecraft.Client/EndermanRenderer.cpp @@ -10,11 +10,11 @@ EndermanRenderer::EndermanRenderer() : MobRenderer(new EndermanModel(), 0.5f) this->setArmor(model); } -void EndermanRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void EndermanRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { - // 4J - original version used generics and thus had an input parameter of type Boat rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); model->carrying = mob->getCarryingTile() > 0; model->creepy = mob->isCreepy(); @@ -29,11 +29,11 @@ void EndermanRenderer::render(std::shared_ptr _mob, double x, double y, MobRenderer::render(mob, x, y, z, rot, a); } -void EndermanRenderer::additionalRendering(std::shared_ptr _mob, float a) +void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) { - // 4J - original version used generics and thus had an input parameter of type Boat rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); MobRenderer::additionalRendering(_mob, a); @@ -68,11 +68,11 @@ void EndermanRenderer::additionalRendering(std::shared_ptr _mob, float a) } } -int EndermanRenderer::prepareArmor(std::shared_ptr _mob, int layer, float a) +int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { - // 4J - original version used generics and thus had an input parameter of type Boat rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if (layer != 0) return -1; diff --git a/Minecraft.Client/EndermanRenderer.h b/Minecraft.Client/EndermanRenderer.h index eaf6393e..6f5126bd 100644 --- a/Minecraft.Client/EndermanRenderer.h +++ b/Minecraft.Client/EndermanRenderer.h @@ -14,9 +14,9 @@ private: public: EndermanRenderer(); - virtual void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); - virtual void additionalRendering(std::shared_ptr _mob, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void additionalRendering(shared_ptr _mob, float a); protected: - virtual int prepareArmor(std::shared_ptr _mob, int layer, float a); + virtual int prepareArmor(shared_ptr _mob, int layer, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/EntityRenderDispatcher.cpp b/Minecraft.Client/EntityRenderDispatcher.cpp index 352d05e9..dfc9a11e 100644 --- a/Minecraft.Client/EntityRenderDispatcher.cpp +++ b/Minecraft.Client/EntityRenderDispatcher.cpp @@ -168,12 +168,12 @@ EntityRenderer *EntityRenderDispatcher::getRenderer(eINSTANCEOF e) return it->second; } -EntityRenderer *EntityRenderDispatcher::getRenderer(std::shared_ptr e) +EntityRenderer *EntityRenderDispatcher::getRenderer(shared_ptr e) { return getRenderer(e->GetType()); } -void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, std::shared_ptr player, Options *options, float a) +void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, Options *options, float a) { this->level = level; this->textures = textures; @@ -197,7 +197,7 @@ void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *fon playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; } - std::shared_ptr pl = dynamic_pointer_cast(player); + shared_ptr pl = dynamic_pointer_cast(player); if (pl->ThirdPersonView() == 2) { playerRotY += 180; @@ -209,7 +209,7 @@ void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *fon } -void EntityRenderDispatcher::render(std::shared_ptr entity, float a) +void EntityRenderDispatcher::render(shared_ptr entity, float a) { double x = entity->xOld + (entity->x - entity->xOld) * a; double y = entity->yOld + (entity->y - entity->yOld) * a; @@ -230,7 +230,7 @@ void EntityRenderDispatcher::render(std::shared_ptr entity, float a) } } float r = entity->yRotO + (rotDiff) * a; - + int col = entity->getLightColor(a); if (entity->isOnFire()) { @@ -244,13 +244,13 @@ void EntityRenderDispatcher::render(std::shared_ptr entity, float a) render(entity, x - xOff, y - yOff, z - zOff, r, a); } -void EntityRenderDispatcher::render(std::shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame, bool bRenderPlayerShadow) +void EntityRenderDispatcher::render(shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame, bool bRenderPlayerShadow) { EntityRenderer *renderer = getRenderer(entity); if (renderer != NULL) - { + { renderer->SetItemFrame(bItemFrame); - + renderer->render(entity, x, y, z, rot, a); renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow); } diff --git a/Minecraft.Client/EntityRenderDispatcher.h b/Minecraft.Client/EntityRenderDispatcher.h index a750a109..248be18f 100644 --- a/Minecraft.Client/EntityRenderDispatcher.h +++ b/Minecraft.Client/EntityRenderDispatcher.h @@ -26,7 +26,7 @@ public: Textures *textures; ItemInHandRenderer *itemInHandRenderer; Level *level; - std::shared_ptr cameraEntity; + shared_ptr cameraEntity; float playerRotY; float playerRotX; Options *options; @@ -38,10 +38,10 @@ private: EntityRenderDispatcher(); public: EntityRenderer *getRenderer(eINSTANCEOF e); - EntityRenderer *getRenderer(std::shared_ptr e); - void prepare(Level *level, Textures *textures, Font *font, std::shared_ptr player, Options *options, float a); - void render(std::shared_ptr entity, float a); - void render(std::shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame = false, bool bRenderPlayerShadow = true); + EntityRenderer *getRenderer(shared_ptr e); + void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, Options *options, float a); + void render(shared_ptr entity, float a); + void render(shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame = false, bool bRenderPlayerShadow = true); void setLevel(Level *level); double distanceToSqr(double x, double y, double z); Font *getFont(); diff --git a/Minecraft.Client/EntityRenderer.cpp b/Minecraft.Client/EntityRenderer.cpp index 3c09382f..6c0247ed 100644 --- a/Minecraft.Client/EntityRenderer.cpp +++ b/Minecraft.Client/EntityRenderer.cpp @@ -41,7 +41,7 @@ bool EntityRenderer::bindTexture(const wstring& urlTexture, int backupTexture) Textures *t = entityRenderDispatcher->textures; // 4J-PB - no http textures on the xbox, mem textures instead - + //int id = t->loadHttpTexture(urlTexture, backupTexture); int id = t->loadMemTexture(urlTexture, backupTexture); @@ -62,7 +62,7 @@ bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring& backu Textures *t = entityRenderDispatcher->textures; // 4J-PB - no http textures on the xbox, mem textures instead - + //int id = t->loadHttpTexture(urlTexture, backupTexture); int id = t->loadMemTexture(urlTexture, backupTexture); @@ -78,7 +78,7 @@ bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring& backu } } -void EntityRenderer::renderFlame(std::shared_ptr e, double x, double y, double z, float a) +void EntityRenderer::renderFlame(shared_ptr e, double x, double y, double z, float a) { glDisable(GL_LIGHTING); @@ -146,7 +146,7 @@ void EntityRenderer::renderFlame(std::shared_ptr e, double x, double y, glEnable(GL_LIGHTING); } -void EntityRenderer::renderShadow(std::shared_ptr e, double x, double y, double z, float pow, float a) +void EntityRenderer::renderShadow(shared_ptr e, double x, double y, double z, float pow, float a) { glDisable(GL_LIGHTING); glEnable(GL_BLEND); @@ -160,17 +160,17 @@ void EntityRenderer::renderShadow(std::shared_ptr e, double x, double y, glDepthMask(false); float r = shadowRadius; - std::shared_ptr mob = dynamic_pointer_cast(e); + shared_ptr mob = dynamic_pointer_cast(e); bool isLocalPlayer = false; float fYLocalPlayerShadowOffset=0.0f; //if (dynamic_pointer_cast(e) != NULL) if (mob != NULL) { - //std::shared_ptr mob = dynamic_pointer_cast(e); + //shared_ptr mob = dynamic_pointer_cast(e); r *= mob->getSizeScale(); - std::shared_ptr animal = dynamic_pointer_cast(mob); + shared_ptr animal = dynamic_pointer_cast(mob); if (animal != NULL) { if (animal->isBaby()) @@ -213,12 +213,12 @@ void EntityRenderer::renderShadow(std::shared_ptr e, double x, double y, for (int xt = x0; xt <= x1; xt++) for (int yt = y0; yt <= y1; yt++) for (int zt = z0; zt <= z1; zt++) - { + { int t = level->getTile(xt, yt - 1, zt); if (t > 0 && level->getRawBrightness(xt, yt, zt) > 3) { renderTileShadow(Tile::tiles[t], x, y + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, z, xt, yt , zt, pow, r, xo, yo + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, zo); - } + } } tt->end(); @@ -242,7 +242,7 @@ void EntityRenderer::renderTileShadow(Tile *tt, double x, double y, double z, in double a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt); if (a < 0) return; if (a > 1) a = 1; - + t->color(1.0f, 1.0f, 1.0f, (float) a); // glColor4f(1, 1, 1, (float) a); @@ -383,7 +383,7 @@ void EntityRenderer::init(EntityRenderDispatcher *entityRenderDispatcher) this->entityRenderDispatcher = entityRenderDispatcher; } -void EntityRenderer::postRender(std::shared_ptr entity, double x, double y, double z, float rot, float a, bool bRenderPlayerShadow) +void EntityRenderer::postRender(shared_ptr entity, double x, double y, double z, float rot, float a, bool bRenderPlayerShadow) { if( !entityRenderDispatcher->isGuiRender ) // 4J - added, don't render shadow in gui as it uses its own blending, and we have globally enabled blending for interface opacity { diff --git a/Minecraft.Client/EntityRenderer.h b/Minecraft.Client/EntityRenderer.h index f8c91685..e0c264a5 100644 --- a/Minecraft.Client/EntityRenderer.h +++ b/Minecraft.Client/EntityRenderer.h @@ -36,16 +36,16 @@ public: EntityRenderer(); // 4J - added virtual ~EntityRenderer(); public: - virtual void render(std::shared_ptr entity, double x, double y, double z, float rot, float a) = 0; + virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a) = 0; protected: virtual void bindTexture(int resourceName); // 4J - added virtual void bindTexture(const wstring& resourceName); virtual bool bindTexture(const wstring& urlTexture, int backupTexture); // 4J added - virtual bool bindTexture(const wstring& urlTexture, const wstring& backupTexture); + virtual bool bindTexture(const wstring& urlTexture, const wstring& backupTexture); private: - virtual void renderFlame(std::shared_ptr e, double x, double y, double z, float a); - virtual void renderShadow(std::shared_ptr e, double x, double y, double z, float pow, float a); + virtual void renderFlame(shared_ptr e, double x, double y, double z, float a); + virtual void renderShadow(shared_ptr e, double x, double y, double z, float pow, float a); virtual Level *getLevel(); virtual void renderTileShadow(Tile *tt, double x, double y, double z, int xt, int yt, int zt, float pow, float r, double xo, double yo, double zo); @@ -54,7 +54,7 @@ public: static void renderFlat(AABB *bb); static void renderFlat(float x0, float y0, float z0, float x1, float y1, float z1); virtual void init(EntityRenderDispatcher *entityRenderDispatcher); - virtual void postRender(std::shared_ptr entity, double x, double y, double z, float rot, float a, bool bRenderPlayerShadow); + virtual void postRender(shared_ptr entity, double x, double y, double z, float rot, float a, bool bRenderPlayerShadow); virtual Font *getFont(); virtual void registerTerrainTextures(IconRegister *iconRegister); diff --git a/Minecraft.Client/EntityTileRenderer.cpp b/Minecraft.Client/EntityTileRenderer.cpp index 2898de27..a2301d42 100644 --- a/Minecraft.Client/EntityTileRenderer.cpp +++ b/Minecraft.Client/EntityTileRenderer.cpp @@ -7,8 +7,8 @@ EntityTileRenderer *EntityTileRenderer::instance = new EntityTileRenderer; EntityTileRenderer::EntityTileRenderer() { - chest = std::shared_ptr(new ChestTileEntity()); - enderChest = std::shared_ptr(new EnderChestTileEntity()); + chest = shared_ptr(new ChestTileEntity()); + enderChest = shared_ptr(new EnderChestTileEntity()); } void EntityTileRenderer::render(Tile *tile, int data, float brightness, float alpha, bool setColor, bool useCompiled) diff --git a/Minecraft.Client/EntityTileRenderer.h b/Minecraft.Client/EntityTileRenderer.h index 14ba6bfc..cc572cad 100644 --- a/Minecraft.Client/EntityTileRenderer.h +++ b/Minecraft.Client/EntityTileRenderer.h @@ -10,8 +10,8 @@ class EntityTileRenderer static EntityTileRenderer *instance; private: - std::shared_ptr chest; - std::shared_ptr enderChest; + shared_ptr chest; + shared_ptr enderChest; public: EntityTileRenderer(); diff --git a/Minecraft.Client/EntityTracker.cpp b/Minecraft.Client/EntityTracker.cpp index ca31c03e..8f1dbcd8 100644 --- a/Minecraft.Client/EntityTracker.cpp +++ b/Minecraft.Client/EntityTracker.cpp @@ -26,12 +26,12 @@ EntityTracker::EntityTracker(ServerLevel *level) maxRange = level->getServer()->getPlayers()->getMaxRange(); } -void EntityTracker::addEntity(std::shared_ptr e) +void EntityTracker::addEntity(shared_ptr e) { if (e->GetType() == eTYPE_SERVERPLAYER) { addEntity(e, 32 * 16, 2); - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) { if( (*it)->e != player ) @@ -65,12 +65,12 @@ void EntityTracker::addEntity(std::shared_ptr e) else if (e->GetType() == eTYPE_ITEM_FRAME) addEntity(e, 16 * 10, INT_MAX, false); } -void EntityTracker::addEntity(std::shared_ptr e, int range, int updateInterval) +void EntityTracker::addEntity(shared_ptr e, int range, int updateInterval) { addEntity(e, range, updateInterval, false); } -void EntityTracker::addEntity(std::shared_ptr e, int range, int updateInterval, bool trackDeltas) +void EntityTracker::addEntity(shared_ptr e, int range, int updateInterval, bool trackDeltas) { if (range > maxRange) range = maxRange; if (entityMap.find(e->entityId) != entityMap.end()) @@ -81,7 +81,7 @@ void EntityTracker::addEntity(std::shared_ptr e, int range, int updateIn { __debugbreak(); } - std::shared_ptr te = std::shared_ptr( new TrackedEntity(e, range, updateInterval, trackDeltas) ); + shared_ptr te = shared_ptr( new TrackedEntity(e, range, updateInterval, trackDeltas) ); entities.insert(te); entityMap[e->entityId] = te; te->updatePlayers(this, &level->players); @@ -89,23 +89,23 @@ void EntityTracker::addEntity(std::shared_ptr e, int range, int updateIn // 4J - have split removeEntity into two bits - it used to do the equivalent of EntityTracker::removePlayer followed by EntityTracker::removeEntity. // This is to allow us to now choose to remove the player as a "seenBy" only when the player has actually been removed from the level's own player array -void EntityTracker::removeEntity(std::shared_ptr e) +void EntityTracker::removeEntity(shared_ptr e) { AUTO_VAR(it, entityMap.find(e->entityId)); if( it != entityMap.end() ) { - std::shared_ptr te = it->second; + shared_ptr te = it->second; entityMap.erase(it); entities.erase(te); te->broadcastRemoved(); } } -void EntityTracker::removePlayer(std::shared_ptr e) +void EntityTracker::removePlayer(shared_ptr e) { if (e->GetType() == eTYPE_SERVERPLAYER) { - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) { (*it)->removePlayer(player); @@ -115,10 +115,10 @@ void EntityTracker::removePlayer(std::shared_ptr e) void EntityTracker::tick() { - vector > movedPlayers; + vector > movedPlayers; for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) { - std::shared_ptr te = *it; + shared_ptr te = *it; te->tick(this, &level->players); if (te->moved && te->e->GetType() == eTYPE_SERVERPLAYER) { @@ -132,7 +132,7 @@ void EntityTracker::tick() MinecraftServer *server = MinecraftServer::getInstance(); for( unsigned int i = 0; i < server->getPlayers()->players.size(); i++ ) { - std::shared_ptr ep = server->getPlayers()->players[i]; + shared_ptr ep = server->getPlayers()->players[i]; if( ep->dimension != level->dimension->id ) continue; if( ep->connection == NULL ) continue; @@ -142,7 +142,7 @@ void EntityTracker::tick() bool addPlayer = false; for (unsigned int j = 0; j < movedPlayers.size(); j++) { - std::shared_ptr sp = movedPlayers[j]; + shared_ptr sp = movedPlayers[j]; if( sp == ep ) break; @@ -153,17 +153,17 @@ void EntityTracker::tick() addPlayer = true; break; } - } + } if( addPlayer ) movedPlayers.push_back( ep ); } for (unsigned int i = 0; i < movedPlayers.size(); i++) { - std::shared_ptr player = movedPlayers[i]; + shared_ptr player = movedPlayers[i]; if(player->connection == NULL) continue; for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) { - std::shared_ptr te = *it; + shared_ptr te = *it; if (te->e != player) { te->updatePlayer(this, player); @@ -174,7 +174,7 @@ void EntityTracker::tick() // 4J Stu - We want to do this for dead players as they don't tick normally for(AUTO_VAR(it, level->players.begin()); it != level->players.end(); ++it) { - std::shared_ptr player = dynamic_pointer_cast(*it); + shared_ptr player = dynamic_pointer_cast(*it); if(!player->isAlive()) { player->flushEntitiesToRemove(); @@ -182,31 +182,31 @@ void EntityTracker::tick() } } -void EntityTracker::broadcast(std::shared_ptr e, std::shared_ptr packet) +void EntityTracker::broadcast(shared_ptr e, shared_ptr packet) { AUTO_VAR(it, entityMap.find( e->entityId )); if( it != entityMap.end() ) { - std::shared_ptr te = it->second; + shared_ptr te = it->second; te->broadcast(packet); } } -void EntityTracker::broadcastAndSend(std::shared_ptr e, std::shared_ptr packet) +void EntityTracker::broadcastAndSend(shared_ptr e, shared_ptr packet) { AUTO_VAR(it, entityMap.find( e->entityId )); if( it != entityMap.end() ) { - std::shared_ptr te = it->second; + shared_ptr te = it->second; te->broadcastAndSend(packet); } } -void EntityTracker::clear(std::shared_ptr serverPlayer) +void EntityTracker::clear(shared_ptr serverPlayer) { for( AUTO_VAR(it, entities.begin()); it != entities.end(); it++ ) { - std::shared_ptr te = *it; + shared_ptr te = *it; te->clear(serverPlayer); } } @@ -218,7 +218,7 @@ void EntityTracker::updateMaxRange() } -std::shared_ptr EntityTracker::getTracker(std::shared_ptr e) +shared_ptr EntityTracker::getTracker(shared_ptr e) { AUTO_VAR(it, entityMap.find(e->entityId)); if( it != entityMap.end() ) diff --git a/Minecraft.Client/EntityTracker.h b/Minecraft.Client/EntityTracker.h index 3fabc4b1..82b01d07 100644 --- a/Minecraft.Client/EntityTracker.h +++ b/Minecraft.Client/EntityTracker.h @@ -13,24 +13,24 @@ class EntityTracker { private: ServerLevel *level; - unordered_set > entities; - unordered_map , IntKeyHash2, IntKeyEq> entityMap; // was IntHashMap + unordered_set > entities; + unordered_map , IntKeyHash2, IntKeyEq> entityMap; // was IntHashMap int maxRange; public: EntityTracker(ServerLevel *level); - void addEntity(std::shared_ptr e); - void addEntity(std::shared_ptr e, int range, int updateInterval); - void addEntity(std::shared_ptr e, int range, int updateInterval, bool trackDeltas); - void removeEntity(std::shared_ptr e); - void removePlayer(std::shared_ptr e); // 4J added + void addEntity(shared_ptr e); + void addEntity(shared_ptr e, int range, int updateInterval); + void addEntity(shared_ptr e, int range, int updateInterval, bool trackDeltas); + void removeEntity(shared_ptr e); + void removePlayer(shared_ptr e); // 4J added void tick(); - void broadcast(std::shared_ptr e, std::shared_ptr packet); - void broadcastAndSend(std::shared_ptr e, std::shared_ptr packet); - void clear(std::shared_ptr serverPlayer); + void broadcast(shared_ptr e, shared_ptr packet); + void broadcastAndSend(shared_ptr e, shared_ptr packet); + void clear(shared_ptr serverPlayer); void updateMaxRange(); // AP added for Vita // 4J-JEV: Added, needed access to tracked entity of a riders mount. - std::shared_ptr getTracker(std::shared_ptr entity); + shared_ptr getTracker(shared_ptr entity); }; diff --git a/Minecraft.Client/ExperienceOrbRenderer.cpp b/Minecraft.Client/ExperienceOrbRenderer.cpp index 97d00f79..1771f833 100644 --- a/Minecraft.Client/ExperienceOrbRenderer.cpp +++ b/Minecraft.Client/ExperienceOrbRenderer.cpp @@ -19,9 +19,9 @@ ExperienceOrbRenderer::ExperienceOrbRenderer() } -void ExperienceOrbRenderer::render(std::shared_ptr _orb, double x, double y, double z, float rot, float a) +void ExperienceOrbRenderer::render(shared_ptr _orb, double x, double y, double z, float rot, float a) { - std::shared_ptr orb = dynamic_pointer_cast(_orb); + shared_ptr orb = dynamic_pointer_cast(_orb); glPushMatrix(); glTranslatef((float) x, (float) y, (float) z); diff --git a/Minecraft.Client/ExperienceOrbRenderer.h b/Minecraft.Client/ExperienceOrbRenderer.h index 5237ecb8..ebd166f4 100644 --- a/Minecraft.Client/ExperienceOrbRenderer.h +++ b/Minecraft.Client/ExperienceOrbRenderer.h @@ -12,6 +12,6 @@ public: ExperienceOrbRenderer(); - void render(std::shared_ptr _orb, double x, double y, double z, float rot, float a); + void render(shared_ptr _orb, double x, double y, double z, float rot, float a); void blit(int x, int y, int sx, int sy, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.Client/FallingTileRenderer.cpp b/Minecraft.Client/FallingTileRenderer.cpp index ad3d9ce3..02e23dad 100644 --- a/Minecraft.Client/FallingTileRenderer.cpp +++ b/Minecraft.Client/FallingTileRenderer.cpp @@ -12,10 +12,10 @@ FallingTileRenderer::FallingTileRenderer() : EntityRenderer() this->shadowRadius = 0.5f; } -void FallingTileRenderer::render(std::shared_ptr _tile, double x, double y, double z, float rot, float a) +void FallingTileRenderer::render(shared_ptr _tile, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr tile = dynamic_pointer_cast(_tile); + shared_ptr tile = dynamic_pointer_cast(_tile); glPushMatrix(); glTranslatef((float) x, (float) y, (float) z); diff --git a/Minecraft.Client/FallingTileRenderer.h b/Minecraft.Client/FallingTileRenderer.h index c3181c96..0ece6033 100644 --- a/Minecraft.Client/FallingTileRenderer.h +++ b/Minecraft.Client/FallingTileRenderer.h @@ -10,5 +10,5 @@ private: public: FallingTileRenderer(); - virtual void render(std::shared_ptr _tile, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _tile, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/FireballRenderer.cpp b/Minecraft.Client/FireballRenderer.cpp index c5f379a6..836e8be3 100644 --- a/Minecraft.Client/FireballRenderer.cpp +++ b/Minecraft.Client/FireballRenderer.cpp @@ -12,10 +12,10 @@ FireballRenderer::FireballRenderer(float scale) this->scale = scale; } -void FireballRenderer::render(std::shared_ptr _fireball, double x, double y, double z, float rot, float a) +void FireballRenderer::render(shared_ptr _fireball, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr fireball = dynamic_pointer_cast(_fireball); + shared_ptr fireball = dynamic_pointer_cast(_fireball); glPushMatrix(); @@ -54,7 +54,7 @@ void FireballRenderer::render(std::shared_ptr _fireball, double x, doubl } // 4J Added override. Based on EntityRenderer::renderFlame -void FireballRenderer::renderFlame(std::shared_ptr e, double x, double y, double z, float a) +void FireballRenderer::renderFlame(shared_ptr e, double x, double y, double z, float a) { glDisable(GL_LIGHTING); Icon *tex = Tile::fire->getTextureLayer(0); @@ -78,7 +78,7 @@ void FireballRenderer::renderFlame(std::shared_ptr e, double x, double y //glRotatef(-entityRenderDispatcher->playerRotY, 0, 1, 0); - + glRotatef(180 - entityRenderDispatcher->playerRotY, 0, 1, 0); glRotatef(-entityRenderDispatcher->playerRotX, 1, 0, 0); glTranslatef(0,0,0.1f); diff --git a/Minecraft.Client/FireballRenderer.h b/Minecraft.Client/FireballRenderer.h index 201e3aad..9b22e74a 100644 --- a/Minecraft.Client/FireballRenderer.h +++ b/Minecraft.Client/FireballRenderer.h @@ -9,9 +9,9 @@ private: public: FireballRenderer(float scale); - virtual void render(std::shared_ptr _fireball, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _fireball, double x, double y, double z, float rot, float a); private: // 4J Added override - virtual void renderFlame(std::shared_ptr e, double x, double y, double z, float a); + virtual void renderFlame(shared_ptr e, double x, double y, double z, float a); }; diff --git a/Minecraft.Client/FishingHookRenderer.cpp b/Minecraft.Client/FishingHookRenderer.cpp index a746db18..0408e96e 100644 --- a/Minecraft.Client/FishingHookRenderer.cpp +++ b/Minecraft.Client/FishingHookRenderer.cpp @@ -8,10 +8,10 @@ #include "..\Minecraft.World\Mth.h" #include "MultiPlayerLocalPlayer.h" -void FishingHookRenderer::render(std::shared_ptr _hook, double x, double y, double z, float rot, float a) +void FishingHookRenderer::render(shared_ptr _hook, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr hook = dynamic_pointer_cast(_hook); + shared_ptr hook = dynamic_pointer_cast(_hook); glPushMatrix(); diff --git a/Minecraft.Client/FishingHookRenderer.h b/Minecraft.Client/FishingHookRenderer.h index 8bcfd252..2683f187 100644 --- a/Minecraft.Client/FishingHookRenderer.h +++ b/Minecraft.Client/FishingHookRenderer.h @@ -3,6 +3,6 @@ class FishingHookRenderer : public EntityRenderer { -public: - virtual void render(std::shared_ptr _hook, double x, double y, double z, float rot, float a); +public: + virtual void render(shared_ptr _hook, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/FurnaceScreen.cpp b/Minecraft.Client/FurnaceScreen.cpp index 3e6b76e5..20ec7104 100644 --- a/Minecraft.Client/FurnaceScreen.cpp +++ b/Minecraft.Client/FurnaceScreen.cpp @@ -6,7 +6,7 @@ #include "..\Minecraft.World\net.minecraft.world.inventory.h" #include "..\Minecraft.World\FurnaceTileEntity.h" -FurnaceScreen::FurnaceScreen(std::shared_ptr inventory, std::shared_ptr furnace) : AbstractContainerScreen(new FurnaceMenu(inventory, furnace)) +FurnaceScreen::FurnaceScreen(shared_ptr inventory, shared_ptr furnace) : AbstractContainerScreen(new FurnaceMenu(inventory, furnace)) { this->furnace = furnace; } diff --git a/Minecraft.Client/FurnaceScreen.h b/Minecraft.Client/FurnaceScreen.h index 98c0bba7..f018093f 100644 --- a/Minecraft.Client/FurnaceScreen.h +++ b/Minecraft.Client/FurnaceScreen.h @@ -7,10 +7,10 @@ class Inventory; class FurnaceScreen : public AbstractContainerScreen { private: - std::shared_ptr furnace; + shared_ptr furnace; public: - FurnaceScreen(std::shared_ptr inventory, std::shared_ptr furnace); + FurnaceScreen(shared_ptr inventory, shared_ptr furnace); protected: virtual void renderLabels(); virtual void renderBg(float a); diff --git a/Minecraft.Client/GameMode.cpp b/Minecraft.Client/GameMode.cpp index 975f81f8..a11d6c07 100644 --- a/Minecraft.Client/GameMode.cpp +++ b/Minecraft.Client/GameMode.cpp @@ -46,11 +46,11 @@ void GameMode::render(float a) { } -bool GameMode::useItem(std::shared_ptr player, Level *level, std::shared_ptr item, bool bTestUseOnly) +bool GameMode::useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly) { } -void GameMode::initPlayer(std::shared_ptr player) +void GameMode::initPlayer(shared_ptr player) { } @@ -58,11 +58,11 @@ void GameMode::tick() { } -void GameMode::adjustPlayer(std::shared_ptr player) +void GameMode::adjustPlayer(shared_ptr player) { } -//bool GameMode::useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly) +//bool GameMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly) //{ // // 4J-PB - Adding a test only version to allow tooltips to be displayed // int t = level->getTile(x, y, z); @@ -72,9 +72,9 @@ void GameMode::adjustPlayer(std::shared_ptr player) // { // switch(t) // { -// case Tile::recordPlayer_Id: +// case Tile::recordPlayer_Id: // case Tile::bed_Id: // special case for a bed -// if (Tile::tiles[t]->TestUse(level, x, y, z, player )) +// if (Tile::tiles[t]->TestUse(level, x, y, z, player )) // { // return true; // } @@ -89,38 +89,38 @@ void GameMode::adjustPlayer(std::shared_ptr player) // break; // } // } -// else +// else // { // if (Tile::tiles[t]->use(level, x, y, z, player )) return true; // } // } -// +// // if (item == NULL) return false; // return item->useOn(player, level, x, y, z, face, bTestUseOnOnly); //} -std::shared_ptr GameMode::createPlayer(Level *level) +shared_ptr GameMode::createPlayer(Level *level) { - return std::shared_ptr( new LocalPlayer(minecraft, level, minecraft->user, level->dimension->id) ); + return shared_ptr( new LocalPlayer(minecraft, level, minecraft->user, level->dimension->id) ); } -bool GameMode::interact(std::shared_ptr player, std::shared_ptr entity) +bool GameMode::interact(shared_ptr player, shared_ptr entity) { return player->interact(entity); } -void GameMode::attack(std::shared_ptr player, std::shared_ptr entity) +void GameMode::attack(shared_ptr player, shared_ptr entity) { player->attack(entity); } -std::shared_ptr GameMode::handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, std::shared_ptr player) +shared_ptr GameMode::handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player) { return nullptr; } -void GameMode::handleCloseInventory(int containerId, std::shared_ptr player) +void GameMode::handleCloseInventory(int containerId, shared_ptr player) { player->containerMenu->removed(player); delete player->containerMenu; @@ -137,7 +137,7 @@ bool GameMode::isCutScene() return false; } -void GameMode::releaseUsingItem(std::shared_ptr player) +void GameMode::releaseUsingItem(shared_ptr player) { player->releaseUsingItem(); } @@ -162,21 +162,21 @@ bool GameMode::hasFarPickRange() return false; } -void GameMode::handleCreativeModeItemAdd(std::shared_ptr clicked, int i) +void GameMode::handleCreativeModeItemAdd(shared_ptr clicked, int i) { } -void GameMode::handleCreativeModeItemDrop(std::shared_ptr clicked) +void GameMode::handleCreativeModeItemDrop(shared_ptr clicked) { } -bool GameMode::handleCraftItem(int recipe, std::shared_ptr player) +bool GameMode::handleCraftItem(int recipe, shared_ptr player) { return true; } // 4J-PB -void GameMode::handleDebugOptions(unsigned int uiVal, std::shared_ptr player) +void GameMode::handleDebugOptions(unsigned int uiVal, shared_ptr player) { player->SetDebugOptions(uiVal); } diff --git a/Minecraft.Client/GameMode.h b/Minecraft.Client/GameMode.h index 71559708..ab9ec9d1 100644 --- a/Minecraft.Client/GameMode.h +++ b/Minecraft.Client/GameMode.h @@ -25,32 +25,32 @@ public: virtual void stopDestroyBlock() = 0; virtual void render(float a); virtual float getPickRange() = 0; - virtual void initPlayer(std::shared_ptr player); + virtual void initPlayer(shared_ptr player); virtual void tick(); virtual bool canHurtPlayer() = 0; - virtual void adjustPlayer(std::shared_ptr player); - virtual bool useItem(std::shared_ptr player, Level *level, std::shared_ptr item, bool bTestUseOnly=false); - virtual bool useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly=false, bool *pbUsedItem = NULL) = 0; - - virtual std::shared_ptr createPlayer(Level *level); - virtual bool interact(std::shared_ptr player, std::shared_ptr entity); - virtual void attack(std::shared_ptr player, std::shared_ptr entity); - virtual std::shared_ptr handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, std::shared_ptr player); - virtual void handleCloseInventory(int containerId, std::shared_ptr player); + virtual void adjustPlayer(shared_ptr player); + virtual bool useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly=false); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly=false, bool *pbUsedItem = NULL) = 0; + + virtual shared_ptr createPlayer(Level *level); + virtual bool interact(shared_ptr player, shared_ptr entity); + virtual void attack(shared_ptr player, shared_ptr entity); + virtual shared_ptr handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player); + virtual void handleCloseInventory(int containerId, shared_ptr player); virtual void handleInventoryButtonClick(int containerId, int buttonId); virtual bool isCutScene(); - virtual void releaseUsingItem(std::shared_ptr player); + virtual void releaseUsingItem(shared_ptr player); virtual bool hasExperience(); virtual bool hasMissTime(); virtual bool hasInfiniteItems(); virtual bool hasFarPickRange(); - virtual void handleCreativeModeItemAdd(std::shared_ptr clicked, int i); - virtual void handleCreativeModeItemDrop(std::shared_ptr clicked); + virtual void handleCreativeModeItemAdd(shared_ptr clicked, int i); + virtual void handleCreativeModeItemDrop(shared_ptr clicked); // 4J Stu - Added so we can send packets for this in the network game - virtual bool handleCraftItem(int recipe, std::shared_ptr player); - virtual void handleDebugOptions(unsigned int uiVal, std::shared_ptr player); + virtual bool handleCraftItem(int recipe, shared_ptr player); + virtual void handleDebugOptions(unsigned int uiVal, shared_ptr player); // 4J Stu - Added for tutorial checks virtual bool isInputAllowed(int mapping) { return true; } diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp index 1cc1044f..716d3307 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -352,13 +352,13 @@ void GameRenderer::pick(float a) Vec3 *to = from->add(b->x * range, b->y * range, b->z * range); hovered = nullptr; float overlap = 1; - vector > *objects = mc->level->getEntities(mc->cameraTargetPlayer, mc->cameraTargetPlayer->bb->expand(b->x * (range), b->y * (range), b->z * (range))->grow(overlap, overlap, overlap)); + vector > *objects = mc->level->getEntities(mc->cameraTargetPlayer, mc->cameraTargetPlayer->bb->expand(b->x * (range), b->y * (range), b->z * (range))->grow(overlap, overlap, overlap)); double nearest = dist; AUTO_VAR(itEnd, objects->end()); for (AUTO_VAR(it, objects->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //objects->at(i); + shared_ptr e = *it; //objects->at(i); if (!e->isPickable()) continue; float rr = e->getPickRadius(); @@ -407,7 +407,7 @@ float GameRenderer::GetFovVal() void GameRenderer::tickFov() { - std::shared_ptrplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + shared_ptrplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); int playerIdx = player ? player->GetXboxPad() : 0; tFov[playerIdx] = player->getFieldOfViewModifier(); @@ -420,7 +420,7 @@ float GameRenderer::getFov(float a, bool applyEffects) { if (cameraFlip > 0 ) return 90; - std::shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); + shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); int playerIdx = player ? player->GetXboxPad() : 0; float fov = m_fov;//70; if (applyEffects) @@ -444,7 +444,7 @@ float GameRenderer::getFov(float a, bool applyEffects) void GameRenderer::bobHurt(float a) { - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; float hurt = player->hurtTime - a; @@ -470,12 +470,12 @@ void GameRenderer::bobHurt(float a) void GameRenderer::bobView(float a) { - std::shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); + shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); if(player==NULL) { return; } - //std::shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); + //shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); float wda = player->walkDist - player->walkDistO; float b = -(player->walkDist + wda * a); @@ -489,8 +489,8 @@ void GameRenderer::bobView(float a) void GameRenderer::moveCameraToPlayer(float a) { - std::shared_ptr player = mc->cameraTargetPlayer; - std::shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + shared_ptr player = mc->cameraTargetPlayer; + shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); float heightOffset = player->heightOffset - 1.62f; double x = player->xo + (player->x - player->xo) * a; @@ -719,12 +719,12 @@ void GameRenderer::renderItemInHand(float a, int eye) { if (cameraFlip > 0) return; - std::shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); // 4J-PB - to turn off the hand for screenshots, but not when the item held is a map if ( localplayer!=NULL) { - std::shared_ptr item = localplayer->inventory->getSelected(); + shared_ptr item = localplayer->inventory->getSelected(); if(!(item && item->getItem()->id==Item::map_Id) && app.GetGameSettings(localplayer->GetXboxPad(),eGameSetting_DisplayHand)==0 ) return; } @@ -864,7 +864,7 @@ void GameRenderer::updateLightTexture(float a) for(int j = 0; j < XUSER_MAX_COUNT; j++ ) { // Loop over all the players - std::shared_ptr player = Minecraft::GetInstance()->localplayers[j]; + shared_ptr player = Minecraft::GetInstance()->localplayers[j]; if (player == NULL) continue; Level *level = player->level; // 4J - was mc->level when it was just to update the one light texture @@ -969,7 +969,7 @@ void GameRenderer::updateLightTexture(float a) } } -float GameRenderer::getNightVisionScale(std::shared_ptr player, float a) +float GameRenderer::getNightVisionScale(shared_ptr player, float a) { int duration = player->getEffect(MobEffect::nightVision)->getDuration(); if (duration > (SharedConstants::TICKS_PER_SECOND * 10)) @@ -1269,7 +1269,7 @@ void GameRenderer::renderLevel(float a, int64_t until) } pick(a); - std::shared_ptr cameraEntity = mc->cameraTargetPlayer; + shared_ptr cameraEntity = mc->cameraTargetPlayer; LevelRenderer *levelRenderer = mc->levelRenderer; ParticleEngine *particleEngine = mc->particleEngine; double xOff = cameraEntity->xOld + (cameraEntity->x - cameraEntity->xOld) * a; @@ -1383,10 +1383,10 @@ void GameRenderer::renderLevel(float a, int64_t until) PIXEndNamedEvent(); turnOffLightLayer(a); // 4J - brought forward from 1.8.2 - std::shared_ptr player = dynamic_pointer_cast(cameraEntity); + shared_ptr player = dynamic_pointer_cast(cameraEntity); if (mc->hitResult != NULL && cameraEntity->isUnderLiquid(Material::water) && player!=NULL) //&& !mc->options.hideGui) { - //std::shared_ptr player = dynamic_pointer_cast(cameraEntity); + //shared_ptr player = dynamic_pointer_cast(cameraEntity); glDisable(GL_ALPHA_TEST); levelRenderer->renderHit(player, mc->hitResult, 0, player->inventory->getSelected(), a); levelRenderer->renderHitOutline(player, mc->hitResult, 0, player->inventory->getSelected(), a); @@ -1445,7 +1445,7 @@ void GameRenderer::renderLevel(float a, int64_t until) { if (mc->hitResult != NULL && !cameraEntity->isUnderLiquid(Material::water)) { - std::shared_ptr player = dynamic_pointer_cast(cameraEntity); + shared_ptr player = dynamic_pointer_cast(cameraEntity); glDisable(GL_ALPHA_TEST); levelRenderer->renderHit(player, mc->hitResult, 0, player->inventory->getSelected(), a); levelRenderer->renderHitOutline(player, mc->hitResult, 0, player->inventory->getSelected(), a); @@ -1512,7 +1512,7 @@ void GameRenderer::tickRain() rainLevel /= ( mc->levelRenderer->activePlayers() + 1 ); random->setSeed(_tick * 312987231l); - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; Level *level = mc->level; int x0 = Mth::floor(player->x); @@ -1549,7 +1549,7 @@ void GameRenderer::tickRain() { if (Tile::tiles[t]->material == Material::lava) { - mc->particleEngine->add( std::shared_ptr( new SmokeParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za, 0, 0, 0) ) ); + mc->particleEngine->add( shared_ptr( new SmokeParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za, 0, 0, 0) ) ); } else { @@ -1559,7 +1559,7 @@ void GameRenderer::tickRain() rainPosY = y + 0.1f - Tile::tiles[t]->getShapeY0(); rainPosZ = z + za; } - mc->particleEngine->add( std::shared_ptr( new WaterDropParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za) ) ); + mc->particleEngine->add( shared_ptr( new WaterDropParticle(level, x + xa, y + 0.1f - Tile::tiles[t]->getShapeY0(), z + za) ) ); } } } @@ -1612,7 +1612,7 @@ void GameRenderer::renderSnowAndRain(float a) } } - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; Level *level = mc->level; int x0 = Mth::floor(player->x); @@ -1796,7 +1796,7 @@ void GameRenderer::setupGuiScreen(int forceScale /*=-1*/) void GameRenderer::setupClearColor(float a) { Level *level = mc->level; - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; float whiteness = 1.0f / (4 - mc->options->viewDistance); whiteness = 1 - (float) pow((double)whiteness, 0.25); @@ -1953,7 +1953,7 @@ void GameRenderer::setupClearColor(float a) void GameRenderer::setupFog(int i, float alpha) { - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; // 4J - check for creative mode brought forward from 1.2.3 bool creative = false; diff --git a/Minecraft.Client/GameRenderer.h b/Minecraft.Client/GameRenderer.h index 6be8d03e..fca091a1 100644 --- a/Minecraft.Client/GameRenderer.h +++ b/Minecraft.Client/GameRenderer.h @@ -25,7 +25,7 @@ public: ItemInHandRenderer *itemInHandRenderer; private: int _tick; - std::shared_ptr hovered; + shared_ptr hovered; // smooth camera movement SmoothFloat smoothTurnX; @@ -108,7 +108,7 @@ public: private: void tickLightTexture(); void updateLightTexture(float a); - float getNightVisionScale(std::shared_ptr player, float a); + float getNightVisionScale(shared_ptr player, float a); public: void render(float a, bool bFirst); // 4J added bFirst void renderLevel(float a); diff --git a/Minecraft.Client/GhastModel.cpp b/Minecraft.Client/GhastModel.cpp index bc41c774..460c28ff 100644 --- a/Minecraft.Client/GhastModel.cpp +++ b/Minecraft.Client/GhastModel.cpp @@ -42,7 +42,7 @@ void GhastModel::setupAnim(float time, float r, float bob, float yRot, float xRo } } -void GhastModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void GhastModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); diff --git a/Minecraft.Client/GhastModel.h b/Minecraft.Client/GhastModel.h index 59ce7b7d..22e9023c 100644 --- a/Minecraft.Client/GhastModel.h +++ b/Minecraft.Client/GhastModel.h @@ -10,5 +10,5 @@ public: GhastModel(); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/GhastRenderer.cpp b/Minecraft.Client/GhastRenderer.cpp index 59dd361e..1d8a2833 100644 --- a/Minecraft.Client/GhastRenderer.cpp +++ b/Minecraft.Client/GhastRenderer.cpp @@ -7,10 +7,10 @@ GhastRenderer::GhastRenderer() : MobRenderer(new GhastModel(), 0.5f) { } -void GhastRenderer::scale(std::shared_ptr mob, float a) +void GhastRenderer::scale(shared_ptr mob, float a) { - std::shared_ptr ghast = dynamic_pointer_cast(mob); - + shared_ptr ghast = dynamic_pointer_cast(mob); + float ss = (ghast->oCharge+(ghast->charge-ghast->oCharge)*a)/20.0f; if (ss<0) ss = 0; ss = 1/(ss*ss*ss*ss*ss*2+1); diff --git a/Minecraft.Client/GhastRenderer.h b/Minecraft.Client/GhastRenderer.h index 1bd3131f..6778b9a5 100644 --- a/Minecraft.Client/GhastRenderer.h +++ b/Minecraft.Client/GhastRenderer.h @@ -7,5 +7,5 @@ public: GhastRenderer(); protected: - virtual void scale(std::shared_ptr mob, float a); + virtual void scale(shared_ptr mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/GiantMobRenderer.cpp b/Minecraft.Client/GiantMobRenderer.cpp index 7df83317..6dabf7cb 100644 --- a/Minecraft.Client/GiantMobRenderer.cpp +++ b/Minecraft.Client/GiantMobRenderer.cpp @@ -1,12 +1,12 @@ #include "stdafx.h" -#include "GiantMobRenderer.h" +#include "GiantMobRenderer.h" GiantMobRenderer::GiantMobRenderer(Model *model, float shadow, float _scale) : MobRenderer(model, shadow *_scale) { this->_scale = _scale; } -void GiantMobRenderer::scale(std::shared_ptr mob, float a) +void GiantMobRenderer::scale(shared_ptr mob, float a) { glScalef(_scale, _scale, _scale); } \ No newline at end of file diff --git a/Minecraft.Client/GiantMobRenderer.h b/Minecraft.Client/GiantMobRenderer.h index c4070863..5b1cce1d 100644 --- a/Minecraft.Client/GiantMobRenderer.h +++ b/Minecraft.Client/GiantMobRenderer.h @@ -10,5 +10,5 @@ public: GiantMobRenderer(Model *model, float shadow, float scale); protected: - virtual void scale(std::shared_ptr mob, float a); + virtual void scale(shared_ptr mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/Gui.cpp b/Minecraft.Client/Gui.cpp index ff1f407d..ffdf5055 100644 --- a/Minecraft.Client/Gui.cpp +++ b/Minecraft.Client/Gui.cpp @@ -225,7 +225,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // Display the pumpkin screen effect ///////////////////////////////////////////////////////////////////////////////////// - std::shared_ptr headGear = minecraft->player->inventory->getArmor(3); + shared_ptr headGear = minecraft->player->inventory->getArmor(3); // 4J-PB - changing this to be per player //if (!minecraft->options->thirdPersonView && headGear != NULL && headGear->id == Tile::pumpkin_Id) renderPumpkin(screenWidth, screenHeight); @@ -302,7 +302,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) minecraft->textures->bindTexture(TN_GUI_GUI); // 4J was L"/gui/gui.png" MemSect(0); - std::shared_ptr inventory = minecraft->player->inventory; + shared_ptr inventory = minecraft->player->inventory; if(bTwoPlayerSplitscreen) { // need to apply scale factors depending on the mode @@ -1027,7 +1027,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // { // if (EnderDragonRenderer::bossInstance == NULL) return; // -// std::shared_ptr boss = EnderDragonRenderer::bossInstance; +// shared_ptr boss = EnderDragonRenderer::bossInstance; // EnderDragonRenderer::bossInstance = NULL; // // Minecraft *pMinecraft=Minecraft::GetInstance(); @@ -1148,7 +1148,7 @@ void Gui::renderTp(float br, int w, int h) void Gui::renderSlot(int slot, int x, int y, float a) { - std::shared_ptr item = minecraft->player->inventory->items[slot]; + shared_ptr item = minecraft->player->inventory->items[slot]; if (item == NULL) return; float pop = item->popTime - a; diff --git a/Minecraft.Client/HumanoidMobRenderer.cpp b/Minecraft.Client/HumanoidMobRenderer.cpp index af2dc0a2..389116ed 100644 --- a/Minecraft.Client/HumanoidMobRenderer.cpp +++ b/Minecraft.Client/HumanoidMobRenderer.cpp @@ -36,12 +36,12 @@ void HumanoidMobRenderer::createArmorParts() armorParts2 = new HumanoidModel(0.5f); } -void HumanoidMobRenderer::additionalRendering(std::shared_ptr mob, float a) +void HumanoidMobRenderer::additionalRendering(shared_ptr mob, float a) { float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); glColor3f(brightness, brightness, brightness); - std::shared_ptr item = mob->getCarriedItem(); - std::shared_ptr headGear = mob->getArmor(3); + shared_ptr item = mob->getCarriedItem(); + shared_ptr headGear = mob->getArmor(3); if (headGear != NULL) { @@ -49,7 +49,7 @@ void HumanoidMobRenderer::additionalRendering(std::shared_ptr mob, float a) // 4J-PB - need to disable rendering armour/skulls/pumpkins for some special skins (Daleks) if((mob->getAnimOverrideBitmask()&(1<head->translateTo(1 / 16.0f); @@ -138,13 +138,13 @@ void HumanoidMobRenderer::additionalRendering(std::shared_ptr mob, float a) { this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 1); } - + glPopMatrix(); } } -void HumanoidMobRenderer::scale(std::shared_ptr mob, float a) +void HumanoidMobRenderer::scale(shared_ptr mob, float a) { glScalef(_scale, _scale, _scale); } \ No newline at end of file diff --git a/Minecraft.Client/HumanoidMobRenderer.h b/Minecraft.Client/HumanoidMobRenderer.h index 6654f765..6c718fb9 100644 --- a/Minecraft.Client/HumanoidMobRenderer.h +++ b/Minecraft.Client/HumanoidMobRenderer.h @@ -7,7 +7,7 @@ class HumanoidMobRenderer : public MobRenderer { protected: HumanoidModel *humanoidModel; - float _scale; + float _scale; HumanoidModel *armorParts1; HumanoidModel *armorParts2; @@ -17,6 +17,6 @@ public: HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow, float scale); protected: virtual void createArmorParts(); - virtual void additionalRendering(std::shared_ptr mob, float a); - void scale(std::shared_ptr mob, float a); + virtual void additionalRendering(shared_ptr mob, float a); + void scale(shared_ptr mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/HumanoidModel.cpp b/Minecraft.Client/HumanoidModel.cpp index 5a9c465a..444d9c90 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -4,7 +4,7 @@ #include "..\Minecraft.World\Entity.h" #include "ModelPart.h" -// 4J added +// 4J added ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox) { @@ -49,9 +49,9 @@ ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox) pNewBox = new ModelPart(this, (int)pBox->fU, (int)pBox->fV); pNewBox->visible=false; - pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, 0); + pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, 0); // 4J-PB - don't compile here, since the lighting isn't set up. It'll be compiled on first use. - //pNewBox->compile(1.0f/16.0f); + //pNewBox->compile(1.0f/16.0f); pAttachTo->addChild(pNewBox); } @@ -69,7 +69,7 @@ void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight) ear = new ModelPart(this, 24, 0); ear->addHumanoidBox(-3, -6, -1, 6, 6, 1, g); // Ear - + head = new ModelPart(this, 0, 0); head->addHumanoidBox(-4, -8, -4, 8, 8, 8, g); // Head head->setPos(0, 0 + yOffset, 0); @@ -140,8 +140,8 @@ HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight _init(g,yOffset,texWidth,texHeight); } -void HumanoidModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) -{ +void HumanoidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ if(entity!=NULL) { m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask(); @@ -183,7 +183,7 @@ void HumanoidModel::render(std::shared_ptr entity, float time, float r, void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) { //bool bIsAttacking = (attackTime > -9990.0f); - + { head->yRot = yRot / (float) (180.0f / PI); head->xRot = xRot / (float) (180.0f / PI); @@ -253,7 +253,7 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float leg1->xRot = -HALF_PI; leg0->yRot = HALF_PI * 0.2f; leg1->yRot = -HALF_PI * 0.2f; - } + } else if(uiBitmaskOverrideAnim&(1<xRot=0.0f; @@ -261,7 +261,7 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float leg1->xRot=0.0f; leg1->zRot=0.0f; leg0->yRot = 0.0f; - leg1->yRot = 0.0f; + leg1->yRot = 0.0f; } else if(uiBitmaskOverrideAnim&(1<xRot = arm1->xRot * 0.5f - HALF_PI * 0.2f * holdingLeftHand; } - if (holdingRightHand != 0) + if (holdingRightHand != 0) { arm0->xRot = arm0->xRot * 0.5f - HALF_PI * 0.2f * holdingRightHand; } @@ -305,7 +305,7 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float float aa = Mth::sin(swing * PI); float bb = Mth::sin(attackTime * PI) * -(head->xRot - 0.7f) * 0.75f; arm0->xRot -= aa * 1.2f + bb; // 4J - changed 1.2 -> 1.2f - arm0->yRot += body->yRot * 2.0f; + arm0->yRot += body->yRot * 2.0f; if((uiBitmaskOverrideAnim&(1<xRot += ((Mth::sin(bob * 0.067f)) * 0.05f); arm1->xRot -= ((Mth::sin(bob * 0.067f)) * 0.05f); - if (bowAndArrow) + if (bowAndArrow) { float attack2 = 0.0f; float attack = 0.0f; @@ -441,15 +441,15 @@ void HumanoidModel::render(HumanoidModel *model, float scale, bool usecompiled) hair->xRot = head->xRot; body->yRot = model->body->yRot; - + arm0->xRot = model->arm0->xRot; arm0->yRot = model->arm0->yRot; arm0->zRot = model->arm0->zRot; - + arm1->xRot = model->arm1->xRot; arm1->yRot = model->arm1->yRot; arm1->zRot = model->arm1->zRot; - + leg0->xRot = model->leg0->xRot; leg1->xRot = model->leg1->xRot; diff --git a/Minecraft.Client/HumanoidModel.h b/Minecraft.Client/HumanoidModel.h index e0ebca55..0ca10f4b 100644 --- a/Minecraft.Client/HumanoidModel.h +++ b/Minecraft.Client/HumanoidModel.h @@ -5,7 +5,7 @@ class HumanoidModel : public Model { public: ModelPart *head, *hair, *body, *arm0, *arm1, *leg0, *leg1, *ear, *cloak; - //ModelPart *hat; + //ModelPart *hat; int holdingLeftHand; int holdingRightHand; @@ -53,11 +53,11 @@ public: HumanoidModel(); HumanoidModel(float g); HumanoidModel(float g, float yOffset, int texWidth, int texHeight); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); void renderHair(float scale, bool usecompiled); void renderEars(float scale, bool usecompiled); - void renderCloak(float scale, bool usecompiled); + void renderCloak(float scale, bool usecompiled); void render(HumanoidModel *model, float scale, bool usecompiled); // Add new bits to models diff --git a/Minecraft.Client/InventoryScreen.cpp b/Minecraft.Client/InventoryScreen.cpp index 61f06bae..726a5e8d 100644 --- a/Minecraft.Client/InventoryScreen.cpp +++ b/Minecraft.Client/InventoryScreen.cpp @@ -10,7 +10,7 @@ #include "StatsScreen.h" #include "..\Minecraft.World\net.minecraft.stats.h" -InventoryScreen::InventoryScreen(std::shared_ptr player) : AbstractContainerScreen(player->inventoryMenu) +InventoryScreen::InventoryScreen(shared_ptr player) : AbstractContainerScreen(player->inventoryMenu) { xMouse = yMouse = 0.0f; // 4J added diff --git a/Minecraft.Client/InventoryScreen.h b/Minecraft.Client/InventoryScreen.h index 4f62ce35..c39edfe0 100644 --- a/Minecraft.Client/InventoryScreen.h +++ b/Minecraft.Client/InventoryScreen.h @@ -6,7 +6,7 @@ class Button; class InventoryScreen : public AbstractContainerScreen { public: - InventoryScreen(std::shared_ptr player); + InventoryScreen(shared_ptr player); virtual void init(); protected: virtual void renderLabels(); diff --git a/Minecraft.Client/ItemFrameRenderer.cpp b/Minecraft.Client/ItemFrameRenderer.cpp index 06f8992e..40769fb9 100644 --- a/Minecraft.Client/ItemFrameRenderer.cpp +++ b/Minecraft.Client/ItemFrameRenderer.cpp @@ -23,11 +23,11 @@ void ItemFrameRenderer::registerTerrainTextures(IconRegister *iconRegister) backTexture = iconRegister->registerIcon(L"itemframe_back"); } -void ItemFrameRenderer::render(std::shared_ptr _itemframe, double x, double y, double z, float rot, float a) +void ItemFrameRenderer::render(shared_ptr _itemframe, double x, double y, double z, float rot, float a) { - // 4J - original version used generics and thus had an input parameter of type EnderCrystal rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type EnderCrystal rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr itemFrame = dynamic_pointer_cast(_itemframe); + shared_ptr itemFrame = dynamic_pointer_cast(_itemframe); glPushMatrix(); float xOffs = (float) (itemFrame->x - x) - 0.5f; @@ -47,7 +47,7 @@ void ItemFrameRenderer::render(std::shared_ptr _itemframe, double x, do } -void ItemFrameRenderer::drawFrame(std::shared_ptr itemFrame) +void ItemFrameRenderer::drawFrame(shared_ptr itemFrame) { Minecraft *pMinecraft=Minecraft::GetInstance(); @@ -102,14 +102,14 @@ void ItemFrameRenderer::drawFrame(std::shared_ptr itemFrame) glPopMatrix(); } -void ItemFrameRenderer::drawItem(std::shared_ptr entity) +void ItemFrameRenderer::drawItem(shared_ptr entity) { Minecraft *pMinecraft=Minecraft::GetInstance(); - std::shared_ptr instance = entity->getItem(); + shared_ptr instance = entity->getItem(); if (instance == NULL) return; - std::shared_ptr itemEntity = std::shared_ptr(new ItemEntity(entity->level, 0, 0, 0, instance)); + shared_ptr itemEntity = shared_ptr(new ItemEntity(entity->level, 0, 0, 0, instance)); itemEntity->getItem()->count = 1; itemEntity->bobOffs = 0; @@ -119,7 +119,7 @@ void ItemFrameRenderer::drawItem(std::shared_ptr entity) glRotatef(180 + entity->yRot, 0, 1, 0); glRotatef(-90 * entity->getRotation(), 0, 0, 1); - switch (entity->getRotation()) + switch (entity->getRotation()) { case 1: glTranslatef(-0.16f, -0.16f, 0); @@ -132,7 +132,7 @@ void ItemFrameRenderer::drawItem(std::shared_ptr entity) break; } - if (itemEntity->getItem()->getItem() == Item::map) + if (itemEntity->getItem()->getItem() == Item::map) { entityRenderDispatcher->textures->bindTexture(TN_MISC_MAPBG); Tesselator *t = Tesselator::getInstance(); @@ -150,13 +150,13 @@ void ItemFrameRenderer::drawItem(std::shared_ptr entity) t->vertexUV(0 - vo, 0 - vo, 0, 0, 0); t->end(); - std::shared_ptr data = Item::map->getSavedData(itemEntity->getItem(), entity->level); - if (data != NULL) + shared_ptr data = Item::map->getSavedData(itemEntity->getItem(), entity->level); + if (data != NULL) { entityRenderDispatcher->itemInHandRenderer->minimap->render(nullptr, entityRenderDispatcher->textures, data, entity->entityId); } - } - else + } + else { if (itemEntity->getItem()->getItem() == Item::compass) { @@ -178,7 +178,7 @@ void ItemFrameRenderer::drawItem(std::shared_ptr entity) ct->cycleFrames(); } } - + glPopMatrix(); } diff --git a/Minecraft.Client/ItemFrameRenderer.h b/Minecraft.Client/ItemFrameRenderer.h index b63ebf83..47f2fe90 100644 --- a/Minecraft.Client/ItemFrameRenderer.h +++ b/Minecraft.Client/ItemFrameRenderer.h @@ -9,9 +9,9 @@ private: //@Override public: void registerTerrainTextures(IconRegister *iconRegister); - virtual void render(std::shared_ptr _itemframe, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _itemframe, double x, double y, double z, float rot, float a); private: - void drawFrame(std::shared_ptr itemFrame); - void drawItem(std::shared_ptr entity); + void drawFrame(shared_ptr itemFrame); + void drawItem(shared_ptr entity); }; diff --git a/Minecraft.Client/ItemInHandRenderer.cpp b/Minecraft.Client/ItemInHandRenderer.cpp index 14c28f02..cee9254d 100644 --- a/Minecraft.Client/ItemInHandRenderer.cpp +++ b/Minecraft.Client/ItemInHandRenderer.cpp @@ -87,7 +87,7 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) t->vertexUV(x0, y1, z1, u, v); t->vertexUV(x0, y1, z0, u, v); t->vertexUV(x1, y1, z0, u, v); - } + } t->end(); glEndList(); } @@ -150,7 +150,7 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) t->vertexUV(x0, y1, z1, u0, v1); t->vertexUV(x0, y1, z0, u0, v1); t->vertexUV(x1, y1, z0, u1, v1); - } + } t->end(); glDepthFunc(GL_LEQUAL); glEndList(); @@ -158,7 +158,7 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) } -void ItemInHandRenderer::renderItem(std::shared_ptr mob, std::shared_ptr item, int layer, bool setColor/* = true*/) +void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor/* = true*/) { // 4J - code borrowed from render method below, although not factoring in brightness as that should already be being taken into account // by texture lighting. This is for colourising things held in 3rd person view. @@ -203,7 +203,7 @@ void ItemInHandRenderer::renderItem(std::shared_ptr mob, std::shared_ptrgetWidth(); int LOD = -1; // Default to not doing anything special with LOD forcing if( iconWidth == 32 ) @@ -312,14 +312,14 @@ void ItemInHandRenderer::renderItem3D(Tesselator *t, float u0, float v0, float u void ItemInHandRenderer::render(float a) { float h = oHeight + (height - oHeight) * a; - std::shared_ptr player = mc->player; + shared_ptr player = mc->player; // 4J - added so we can adjust the position of the hands for horizontal & vertical split screens float fudgeX = 0.0f; float fudgeY = 0.0f; float fudgeZ = 0.0f; bool splitHoriz = false; - std::shared_ptr localPlayer = dynamic_pointer_cast(player); + shared_ptr localPlayer = dynamic_pointer_cast(player); if( localPlayer ) { if( localPlayer->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM || @@ -353,7 +353,7 @@ void ItemInHandRenderer::render(float a) glRotatef((yr - yrr) * 0.1f, 0, 1, 0); } - std::shared_ptr item = selectedItem; + shared_ptr item = selectedItem; float br = mc->level->getBrightness(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); // 4J - change brought forward from 1.8.2 @@ -433,7 +433,7 @@ void ItemInHandRenderer::render(float a) glScalef(ss, ss, ss); // Can't turn off the hand if the player is holding a map - std::shared_ptr itemInstance = player->inventory->getSelected(); + shared_ptr itemInstance = player->inventory->getSelected(); if ((itemInstance && (itemInstance->getItem()->id==Item::map_Id)) || app.GetGameSettings(localPlayer->GetXboxPad(),eGameSetting_DisplayHand)!=0 ) { playerRenderer->renderHand(); @@ -477,7 +477,7 @@ void ItemInHandRenderer::render(float a) t->vertexUV((float)(0 - vo), (float)( 0 - vo), (float)( 0), (float)( 0), (float)( 0)); t->end(); - std::shared_ptr data = Item::map->getSavedData(item, mc->level); + shared_ptr data = Item::map->getSavedData(item, mc->level); PIXBeginNamedEvent(0,"Minimap render"); if(data != NULL) minimap->render(mc->player, mc->textures, data, mc->player->entityId); PIXEndNamedEvent(); @@ -652,7 +652,7 @@ void ItemInHandRenderer::render(float a) glScalef(ss, ss, ss); MemSect(31); // Can't turn off the hand if the player is holding a map - std::shared_ptr itemInstance = player->inventory->getSelected(); + shared_ptr itemInstance = player->inventory->getSelected(); if ( (itemInstance && (itemInstance->getItem()->id==Item::map_Id)) || app.GetGameSettings(localPlayer->GetXboxPad(),eGameSetting_DisplayHand)!=0 ) { @@ -837,8 +837,8 @@ void ItemInHandRenderer::tick() oHeight = height; - std::shared_ptr player = mc->player; - std::shared_ptr nextTile = player->inventory->getSelected(); + shared_ptr player = mc->player; + shared_ptr nextTile = player->inventory->getSelected(); bool matches = lastSlot == player->inventory->selected && nextTile == selectedItem; if (selectedItem == NULL && nextTile == NULL) diff --git a/Minecraft.Client/ItemInHandRenderer.h b/Minecraft.Client/ItemInHandRenderer.h index 975dd360..dee51a7f 100644 --- a/Minecraft.Client/ItemInHandRenderer.h +++ b/Minecraft.Client/ItemInHandRenderer.h @@ -11,7 +11,7 @@ class ItemInHandRenderer { private: Minecraft *mc; - std::shared_ptr selectedItem; + shared_ptr selectedItem; float height; float oHeight; TileRenderer *tileRenderer; @@ -23,7 +23,7 @@ public: public: ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap = true); // 4J Added optimisedMinimap param - void renderItem(std::shared_ptr mob, std::shared_ptr item, int layer, bool setColor = true); // 4J added setColor parameter + void renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor = true); // 4J added setColor parameter static void renderItem3D(Tesselator *t, float u0, float v0, float u1, float v1, int width, int height, float depth, bool isGlint); // 4J added isGlint parameter public: void render(float a); diff --git a/Minecraft.Client/ItemRenderer.cpp b/Minecraft.Client/ItemRenderer.cpp index fc5e5fde..03d0d3a5 100644 --- a/Minecraft.Client/ItemRenderer.cpp +++ b/Minecraft.Client/ItemRenderer.cpp @@ -29,13 +29,13 @@ ItemRenderer::~ItemRenderer() delete random; } -void ItemRenderer::render(std::shared_ptr _itemEntity, double x, double y, double z, float rot, float a) +void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr itemEntity = dynamic_pointer_cast(_itemEntity); + shared_ptr itemEntity = dynamic_pointer_cast(_itemEntity); random->setSeed(187); - std::shared_ptr item = itemEntity->getItem(); + shared_ptr item = itemEntity->getItem(); glPushMatrix(); float bob = Mth::sin((itemEntity->age + a) / 10.0f + itemEntity->bobOffs) * 0.1f + 0.1f; @@ -54,7 +54,7 @@ void ItemRenderer::render(std::shared_ptr _itemEntity, double x, double { glRotatef(spin, 0, 1, 0); - if (m_bItemFrame) + if (m_bItemFrame) { glScalef(1.25f, 1.25f, 1.25f); glTranslatef(0, 0.05f, 0); @@ -73,7 +73,7 @@ void ItemRenderer::render(std::shared_ptr _itemEntity, double x, double for (int i = 0; i < count; i++) { glPushMatrix(); - if (i > 0) + if (i > 0) { float xo = (random->nextFloat() * 2 - 1) * 0.2f / s; float yo = (random->nextFloat() * 2 - 1) * 0.2f / s; @@ -88,13 +88,13 @@ void ItemRenderer::render(std::shared_ptr _itemEntity, double x, double } else if (item->getItem()->hasMultipleSpriteLayers()) { - if (m_bItemFrame) + if (m_bItemFrame) { glScalef(1 / 1.95f, 1 / 1.95f, 1 / 1.95f); glTranslatef(0, -0.05f, 0); glDisable(GL_LIGHTING); - } - else + } + else { glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); } @@ -124,17 +124,17 @@ void ItemRenderer::render(std::shared_ptr _itemEntity, double x, double } else { - if (m_bItemFrame) + if (m_bItemFrame) { glScalef(1 / 1.95f, 1 / 1.95f, 1 / 1.95f); glTranslatef(0, -0.05f, 0); glDisable(GL_LIGHTING); - } - else + } + else { glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); } - + // 4J Stu - For rendering the static compass, we give it a non-zero aux value if(item->id == Item::compass_Id) item->setAuxValue(255); Icon *icon = item->getIcon(); @@ -172,7 +172,7 @@ void ItemRenderer::render(std::shared_ptr _itemEntity, double x, double } } -void ItemRenderer::renderItemBillboard(std::shared_ptr entity, Icon *icon, int count, float a, float red, float green, float blue) +void ItemRenderer::renderItemBillboard(shared_ptr entity, Icon *icon, int count, float a, float red, float green, float blue) { Tesselator *t = Tesselator::getInstance(); @@ -188,7 +188,7 @@ void ItemRenderer::renderItemBillboard(std::shared_ptr entity, Icon if (entityRenderDispatcher->options->fancyGraphics) { - // Consider forcing the mipmap LOD level to use, if this is to be rendered from a larger than standard source texture. + // Consider forcing the mipmap LOD level to use, if this is to be rendered from a larger than standard source texture. int iconWidth = icon->getWidth(); int LOD = -1; // Default to not doing anything special with LOD forcing if( iconWidth == 32 ) @@ -213,7 +213,7 @@ void ItemRenderer::renderItemBillboard(std::shared_ptr entity, Icon float width = 1 / 16.0f; float margin = 0.35f / 16.0f; - std::shared_ptr item = entity->getItem(); + shared_ptr item = entity->getItem(); int items = item->count; if (items < 2) @@ -315,7 +315,7 @@ void ItemRenderer::renderItemBillboard(std::shared_ptr entity, Icon } } -void ItemRenderer::renderGuiItem(Font *font, Textures *textures, std::shared_ptr item, float x, float y, float fScale, float fAlpha) +void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScale, float fAlpha) { renderGuiItem(font,textures,item,x,y,fScale,fScale,fAlpha, true); } @@ -325,7 +325,7 @@ extern IDirect3DDevice9 *g_pD3DDevice; #endif // 4J - this used to take x and y as ints, and no scale and alpha - but this interface is now implemented as a wrapper round this more fully featured one -void ItemRenderer::renderGuiItem(Font *font, Textures *textures, std::shared_ptr item, float x, float y, float fScaleX,float fScaleY, float fAlpha, bool useCompiled) +void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScaleX,float fScaleY, float fAlpha, bool useCompiled) { int itemId = item->id; int itemAuxValue = item->getAuxValue(); @@ -447,13 +447,13 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, std::shared_ptr } // 4J - original interface, now just a wrapper for preceding overload -void ItemRenderer::renderGuiItem(Font *font, Textures *textures, std::shared_ptr item, int x, int y) +void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptr item, int x, int y) { renderGuiItem(font, textures, item, (float)x, (float)y, 1.0f, 1.0f ); } // 4J - this used to take x and y as ints, and no scale, alpha or foil - but this interface is now implemented as a wrapper round this more fully featured one -void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const std::shared_ptr item, float x, float y,float fScale,float fAlpha, bool isFoil) +void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, float x, float y,float fScale,float fAlpha, bool isFoil) { if(item==NULL) return; renderAndDecorateItem(font, textures, item, x, y,fScale, fScale, fAlpha, isFoil, true); @@ -461,7 +461,7 @@ void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const s // 4J - added isConstantBlended and blendFactor parameters. This is true if the gui item is being rendered from a context where it already has blending enabled to do general interface fading // (ie from the gui rather than xui). In this case we dno't want to enable/disable blending, and do need to restore the blend state when we are done. -void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const std::shared_ptr item, float x, float y,float fScaleX, float fScaleY,float fAlpha, bool isFoil, bool isConstantBlended, bool useCompiled) +void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, float x, float y,float fScaleX, float fScaleY,float fAlpha, bool isFoil, bool isConstantBlended, bool useCompiled) { if (item == NULL) { @@ -469,7 +469,7 @@ void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const s } renderGuiItem(font, textures, item, x, y,fScaleX,fScaleY,fAlpha, useCompiled); - + if (isFoil || item->isFoil()) { glDepthFunc(GL_GREATER); @@ -478,7 +478,7 @@ void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const s textures->bindTexture(TN__BLUR__MISC_GLINT); // 4J was "%blur%/misc/glint.png" blitOffset -= 50; if( !isConstantBlended ) glEnable(GL_BLEND); - + glBlendFunc(GL_DST_COLOR, GL_ONE); // 4J - changed blend equation from GL_DST_COLOR, GL_DST_COLOR so we can fade this out float blendFactor = isConstantBlended ? Gui::currentGuiBlendFactor : 1.0f; @@ -507,7 +507,7 @@ void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const s } // 4J - original interface, now just a wrapper for preceding overload -void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const std::shared_ptr item, int x, int y) +void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, int x, int y) { renderAndDecorateItem( font, textures, item, (float)x, (float)y, 1.0f, 1.0f, item->isFoil() ); } @@ -560,18 +560,18 @@ void ItemRenderer::blitGlint(int id, float x, float y, float w, float h) } } -void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, std::shared_ptr item, int x, int y, float fAlpha) +void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, shared_ptr item, int x, int y, float fAlpha) { renderGuiItemDecorations(font, textures, item, x, y, L"", fAlpha); } -void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, std::shared_ptr item, int x, int y, const wstring &countText, float fAlpha) +void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, shared_ptr item, int x, int y, const wstring &countText, float fAlpha) { if (item == NULL) { return; } - + glEnable(GL_BLEND); RenderManager.StateSetBlendFactor(0xffffff |(((unsigned int)(fAlpha * 0xff))<<24)); glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); diff --git a/Minecraft.Client/ItemRenderer.h b/Minecraft.Client/ItemRenderer.h index 830e8510..9690f77c 100644 --- a/Minecraft.Client/ItemRenderer.h +++ b/Minecraft.Client/ItemRenderer.h @@ -18,20 +18,20 @@ public: ItemRenderer(); virtual ~ItemRenderer(); - virtual void render(std::shared_ptr _itemEntity, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _itemEntity, double x, double y, double z, float rot, float a); private: - virtual void renderItemBillboard(std::shared_ptr entity, Icon *icon, int count, float a, float red, float green, float blue); + virtual void renderItemBillboard(shared_ptr entity, Icon *icon, int count, float a, float red, float green, float blue); public: // 4J - original 2 interface variants - void renderGuiItem(Font *font, Textures *textures, std::shared_ptr item, int x, int y); - void renderAndDecorateItem(Font *font, Textures *textures, const std::shared_ptr item, int x, int y); + void renderGuiItem(Font *font, Textures *textures, shared_ptr item, int x, int y); + void renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, int x, int y); // 4J - new interfaces added - void renderGuiItem(Font *font, Textures *textures, std::shared_ptr item, float x, float y, float fScale, float fAlpha); - void renderGuiItem(Font *font, Textures *textures, std::shared_ptr item, float x, float y, float fScaleX,float fScaleY, float fAlpha, bool useCompiled); // 4J Added useCompiled - void renderAndDecorateItem(Font *font, Textures *textures, const std::shared_ptr item, float x, float y, float fScale, float fAlpha, bool isFoil); - void renderAndDecorateItem(Font *font, Textures *textures, const std::shared_ptr item, float x, float y, float fScaleX, float fScaleY, float fAlpha, bool isFoil, bool isConstantBlended, bool useCompiled = true); // 4J - added isConstantBlended and useCompiled + void renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScale, float fAlpha); + void renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScaleX,float fScaleY, float fAlpha, bool useCompiled); // 4J Added useCompiled + void renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, float x, float y, float fScale, float fAlpha, bool isFoil); + void renderAndDecorateItem(Font *font, Textures *textures, const shared_ptr item, float x, float y, float fScaleX, float fScaleY, float fAlpha, bool isFoil, bool isConstantBlended, bool useCompiled = true); // 4J - added isConstantBlended and useCompiled // 4J Added virtual void SetItemFrame(bool bSet) {m_bItemFrame=bSet;} @@ -42,8 +42,8 @@ private: void blitGlint(int id, float x, float y, float w, float h); // 4J - changed x,y,w,h to floats public: - void renderGuiItemDecorations(Font *font, Textures *textures, std::shared_ptr item, int x, int y, float fAlpha = 1.0f); - void renderGuiItemDecorations(Font *font, Textures *textures, std::shared_ptr item, int x, int y, const wstring &countText, float fAlpha = 1.0f); + void renderGuiItemDecorations(Font *font, Textures *textures, shared_ptr item, int x, int y, float fAlpha = 1.0f); + void renderGuiItemDecorations(Font *font, Textures *textures, shared_ptr item, int x, int y, const wstring &countText, float fAlpha = 1.0f); private: void fillRect(Tesselator *t, int x, int y, int w, int h, int c); public: diff --git a/Minecraft.Client/ItemSpriteRenderer.cpp b/Minecraft.Client/ItemSpriteRenderer.cpp index 1cc60b62..5a1ea620 100644 --- a/Minecraft.Client/ItemSpriteRenderer.cpp +++ b/Minecraft.Client/ItemSpriteRenderer.cpp @@ -17,7 +17,7 @@ ItemSpriteRenderer::ItemSpriteRenderer(Item *sourceItem, int sourceItemAuxValue // this(sourceItem, 0); //} -void ItemSpriteRenderer::render(std::shared_ptr e, double x, double y, double z, float rot, float a) +void ItemSpriteRenderer::render(shared_ptr e, double x, double y, double z, float rot, float a) { // the icon is already cached in the item object, so there should not be any performance impact by not caching it here Icon *icon = sourceItem->getIcon(sourceItemAuxValue); diff --git a/Minecraft.Client/ItemSpriteRenderer.h b/Minecraft.Client/ItemSpriteRenderer.h index e8359783..e60feece 100644 --- a/Minecraft.Client/ItemSpriteRenderer.h +++ b/Minecraft.Client/ItemSpriteRenderer.h @@ -11,7 +11,7 @@ private: public: ItemSpriteRenderer(Item *sourceItem, int sourceItemAuxValue = 0); //ItemSpriteRenderer(Item *icon); - virtual void render(std::shared_ptr e, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr e, double x, double y, double z, float rot, float a); private: void renderIcon(Tesselator *t, Icon *icon); diff --git a/Minecraft.Client/LavaSlimeModel.cpp b/Minecraft.Client/LavaSlimeModel.cpp index 4c024cfe..427b9547 100644 --- a/Minecraft.Client/LavaSlimeModel.cpp +++ b/Minecraft.Client/LavaSlimeModel.cpp @@ -5,18 +5,18 @@ #include "..\Minecraft.World\LavaSlime.h" -LavaSlimeModel::LavaSlimeModel() +LavaSlimeModel::LavaSlimeModel() { - for (int i = 0; i < BODYCUBESLENGTH; i++) + for (int i = 0; i < BODYCUBESLENGTH; i++) { int u = 0; int v = i; - if (i == 2) + if (i == 2) { u = 24; v = 10; - } - else if (i == 3) + } + else if (i == 3) { u = 24; v = 19; @@ -36,33 +36,33 @@ LavaSlimeModel::LavaSlimeModel() } } -int LavaSlimeModel::getModelVersion() +int LavaSlimeModel::getModelVersion() { return 5; } -void LavaSlimeModel::prepareMobModel(std::shared_ptr mob, float time, float r, float a) +void LavaSlimeModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { - std::shared_ptr lavaSlime = dynamic_pointer_cast(mob); + shared_ptr lavaSlime = dynamic_pointer_cast(mob); float slimeSquish = (lavaSlime->oSquish + (lavaSlime->squish - lavaSlime->oSquish) * a); - if (slimeSquish < 0) + if (slimeSquish < 0) { slimeSquish = 0.0f; } - for (int i = 0; i < BODYCUBESLENGTH; i++) + for (int i = 0; i < BODYCUBESLENGTH; i++) { bodyCubes[i]->y = -(4 - i) * slimeSquish * 1.7f; } } -void LavaSlimeModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void LavaSlimeModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); insideCube->render(scale, usecompiled); - for (int i = 0; i < BODYCUBESLENGTH; i++) + for (int i = 0; i < BODYCUBESLENGTH; i++) { bodyCubes[i]->render(scale, usecompiled); } diff --git a/Minecraft.Client/LavaSlimeModel.h b/Minecraft.Client/LavaSlimeModel.h index ead7147f..44bd1663 100644 --- a/Minecraft.Client/LavaSlimeModel.h +++ b/Minecraft.Client/LavaSlimeModel.h @@ -1,7 +1,7 @@ #pragma once #include "Model.h" -class LavaSlimeModel : public Model +class LavaSlimeModel : public Model { static const int BODYCUBESLENGTH=8; ModelPart *bodyCubes[BODYCUBESLENGTH]; @@ -10,6 +10,6 @@ class LavaSlimeModel : public Model public: LavaSlimeModel(); int getModelVersion(); - virtual void prepareMobModel(std::shared_ptr mob, float time, float r, float a); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; diff --git a/Minecraft.Client/LavaSlimeRenderer.cpp b/Minecraft.Client/LavaSlimeRenderer.cpp index 6bb75720..3d2cbf47 100644 --- a/Minecraft.Client/LavaSlimeRenderer.cpp +++ b/Minecraft.Client/LavaSlimeRenderer.cpp @@ -8,11 +8,11 @@ LavaSlimeRenderer::LavaSlimeRenderer() : MobRenderer(new LavaSlimeModel(), .25f) this->modelVersion = ((LavaSlimeModel *) model)->getModelVersion(); } -void LavaSlimeRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) -{ - // 4J - original version used generics and thus had an input parameter of type LavaSlime rather than std::shared_ptr we have here - +void LavaSlimeRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + // 4J - original version used generics and thus had an input parameter of type LavaSlime rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); int modelVersion = ((LavaSlimeModel *) model)->getModelVersion(); if (modelVersion != this->modelVersion) { @@ -23,11 +23,11 @@ void LavaSlimeRenderer::render(std::shared_ptr _mob, double x, double y, MobRenderer::render(mob, x, y, z, rot, a); } -void LavaSlimeRenderer::scale(std::shared_ptr _slime, float a) +void LavaSlimeRenderer::scale(shared_ptr _slime, float a) { - // 4J - original version used generics and thus had an input parameter of type LavaSlime rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type LavaSlime rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr slime = dynamic_pointer_cast(_slime); + shared_ptr slime = dynamic_pointer_cast(_slime); int size = slime->getSize(); float ss = (slime->oSquish + (slime->squish - slime->oSquish) * a) / (size * 0.5f + 1); float w = 1 / (ss + 1); diff --git a/Minecraft.Client/LavaSlimeRenderer.h b/Minecraft.Client/LavaSlimeRenderer.h index 29afb390..b0c44d1e 100644 --- a/Minecraft.Client/LavaSlimeRenderer.h +++ b/Minecraft.Client/LavaSlimeRenderer.h @@ -10,8 +10,8 @@ private: public: LavaSlimeRenderer(); - virtual void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - virtual void scale(std::shared_ptr _slime, float a); + virtual void scale(shared_ptr _slime, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/LevelRenderer.cpp b/Minecraft.Client/LevelRenderer.cpp index 4cdb0cbe..917fa9f3 100644 --- a/Minecraft.Client/LevelRenderer.cpp +++ b/Minecraft.Client/LevelRenderer.cpp @@ -475,7 +475,7 @@ void LevelRenderer::allChanged(int playerIndex) if (level != NULL) { - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; if (player != NULL) { this->resortChunks(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); @@ -509,7 +509,7 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) renderedEntities = 0; culledEntities = 0; - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; EntityRenderDispatcher::xOff = (player->xOld + (player->x - player->xOld) * a); EntityRenderDispatcher::yOff = (player->yOld + (player->y - player->yOld) * a); @@ -520,13 +520,13 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) mc->gameRenderer->turnOnLightLayer(a); // 4J - brought forward from 1.8.2 - vector > entities = level[playerIndex]->getAllEntities(); + vector > entities = level[playerIndex]->getAllEntities(); totalEntities = (int)entities.size(); AUTO_VAR(itEndGE, level[playerIndex]->globalEntities.end()); for (AUTO_VAR(it, level[playerIndex]->globalEntities.begin()); it != itEndGE; it++) { - std::shared_ptr entity = *it; //level->globalEntities[i]; + shared_ptr entity = *it; //level->globalEntities[i]; renderedEntities++; if (entity->shouldRender(cam)) EntityRenderDispatcher::instance->render(entity, a); } @@ -534,13 +534,13 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) AUTO_VAR(itEndEnts, entities.end()); for (AUTO_VAR(it, entities.begin()); it != itEndEnts; it++) { - std::shared_ptr entity = *it; //entities[i]; + shared_ptr entity = *it; //entities[i]; if ((entity->shouldRender(cam) && (entity->noCulling || culler->isVisible(entity->bb)))) { // 4J-PB - changing this to be per player //if (entity == mc->cameraTargetPlayer && !mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) continue; - std::shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); if (localplayer && entity == mc->cameraTargetPlayer && !localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) continue; @@ -669,7 +669,7 @@ void LevelRenderer::resortChunks(int xc, int yc, int zc) LeaveCriticalSection(&m_csDirtyChunks); } -int LevelRenderer::render(std::shared_ptr player, int layer, double alpha, bool updateChunks) +int LevelRenderer::render(shared_ptr player, int layer, double alpha, bool updateChunks) { int playerIndex = mc->player->GetXboxPad(); @@ -741,7 +741,7 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha) #if 1 // 4J - cut down version, we're not using offsetted render lists, or a sorted chunk list, anymore mc->gameRenderer->turnOnLightLayer(alpha); // 4J - brought forward from 1.8.2 - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; double xOff = player->xOld + (player->x - player->xOld) * alpha; double yOff = player->yOld + (player->y - player->yOld) * alpha; double zOff = player->zOld + (player->z - player->zOld) * alpha; @@ -854,7 +854,7 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha) } } - std::shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; double xOff = player->xOld + (player->x - player->xOld) * alpha; double yOff = player->yOld + (player->y - player->yOld) * alpha; double zOff = player->zOld + (player->z - player->zOld) * alpha; @@ -1909,8 +1909,8 @@ bool LevelRenderer::updateDirtyChunks() for( int p = 0; p < XUSER_MAX_COUNT; p++ ) { // It's possible that the localplayers member can be set to NULL on the main thread when a player chooses to exit the game - // So take a reference to the player object now. As it is a std::shared_ptr it should live as long as we need it - std::shared_ptr player = mc->localplayers[p]; + // So take a reference to the player object now. As it is a shared_ptr it should live as long as we need it + shared_ptr player = mc->localplayers[p]; if( player == NULL ) continue; if( chunks[p].data == NULL ) continue; if( level[p] == NULL ) continue; @@ -2161,7 +2161,7 @@ bool LevelRenderer::updateDirtyChunks() } -void LevelRenderer::renderHit(std::shared_ptr player, HitResult *h, int mode, std::shared_ptr inventoryItem, float a) +void LevelRenderer::renderHit(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a) { Tesselator *t = Tesselator::getInstance(); glEnable(GL_BLEND); @@ -2180,7 +2180,7 @@ void LevelRenderer::renderHit(std::shared_ptr player, HitResult *h, int glDisable(GL_ALPHA_TEST); } -void LevelRenderer::renderDestroyAnimation(Tesselator *t, std::shared_ptr player, float a) +void LevelRenderer::renderDestroyAnimation(Tesselator *t, shared_ptr player, float a) { double xo = player->xOld + (player->x - player->xOld) * a; double yo = player->yOld + (player->y - player->yOld) * a; @@ -2246,7 +2246,7 @@ void LevelRenderer::renderDestroyAnimation(Tesselator *t, std::shared_ptr player, HitResult *h, int mode, std::shared_ptr inventoryItem, float a) +void LevelRenderer::renderHitOutline(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a) { if (mode == 0 && h->type == HitResult::TILE) @@ -2586,7 +2586,7 @@ void LevelRenderer::playSound(int iSound, double x, double y, double z, float vo } */ } -void LevelRenderer::playSound(std::shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist) +void LevelRenderer::playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist) { } @@ -2606,21 +2606,21 @@ if (xd * xd + yd * yd + zd * zd > particleDistance * particleDistance) return; int playerIndex = mc->player->GetXboxPad(); // 4J added -if (name== L"bubble") mc->particleEngine->add(std::shared_ptr( new BubbleParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); -else if (name== L"smoke") mc->particleEngine->add(std::shared_ptr( new SmokeParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); -else if (name== L"note") mc->particleEngine->add(std::shared_ptr( new NoteParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); -else if (name== L"portal") mc->particleEngine->add(std::shared_ptr( new PortalParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); -else if (name== L"explode") mc->particleEngine->add(std::shared_ptr( new ExplodeParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); -else if (name== L"flame") mc->particleEngine->add(std::shared_ptr( new FlameParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); -else if (name== L"lava") mc->particleEngine->add(std::shared_ptr( new LavaParticle(level[playerIndex], x, y, z) ) ); -else if (name== L"footstep") mc->particleEngine->add(std::shared_ptr( new FootstepParticle(textures, level[playerIndex], x, y, z) ) ); -else if (name== L"splash") mc->particleEngine->add(std::shared_ptr( new SplashParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); -else if (name== L"largesmoke") mc->particleEngine->add(std::shared_ptr( new SmokeParticle(level[playerIndex], x, y, z, xa, ya, za, 2.5f) ) ); -else if (name== L"reddust") mc->particleEngine->add(std::shared_ptr( new RedDustParticle(level[playerIndex], x, y, z, (float) xa, (float) ya, (float) za) ) ); -else if (name== L"snowballpoof") mc->particleEngine->add(std::shared_ptr( new BreakingItemParticle(level[playerIndex], x, y, z, Item::snowBall) ) ); -else if (name== L"snowshovel") mc->particleEngine->add(std::shared_ptr( new SnowShovelParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); -else if (name== L"slime") mc->particleEngine->add(std::shared_ptr( new BreakingItemParticle(level[playerIndex], x, y, z, Item::slimeBall)) ) ; -else if (name== L"heart") mc->particleEngine->add(std::shared_ptr( new HeartParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +if (name== L"bubble") mc->particleEngine->add(shared_ptr( new BubbleParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"smoke") mc->particleEngine->add(shared_ptr( new SmokeParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"note") mc->particleEngine->add(shared_ptr( new NoteParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"portal") mc->particleEngine->add(shared_ptr( new PortalParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"explode") mc->particleEngine->add(shared_ptr( new ExplodeParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"flame") mc->particleEngine->add(shared_ptr( new FlameParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"lava") mc->particleEngine->add(shared_ptr( new LavaParticle(level[playerIndex], x, y, z) ) ); +else if (name== L"footstep") mc->particleEngine->add(shared_ptr( new FootstepParticle(textures, level[playerIndex], x, y, z) ) ); +else if (name== L"splash") mc->particleEngine->add(shared_ptr( new SplashParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"largesmoke") mc->particleEngine->add(shared_ptr( new SmokeParticle(level[playerIndex], x, y, z, xa, ya, za, 2.5f) ) ); +else if (name== L"reddust") mc->particleEngine->add(shared_ptr( new RedDustParticle(level[playerIndex], x, y, z, (float) xa, (float) ya, (float) za) ) ); +else if (name== L"snowballpoof") mc->particleEngine->add(shared_ptr( new BreakingItemParticle(level[playerIndex], x, y, z, Item::snowBall) ) ); +else if (name== L"snowshovel") mc->particleEngine->add(shared_ptr( new SnowShovelParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); +else if (name== L"slime") mc->particleEngine->add(shared_ptr( new BreakingItemParticle(level[playerIndex], x, y, z, Item::slimeBall)) ) ; +else if (name== L"heart") mc->particleEngine->add(shared_ptr( new HeartParticle(level[playerIndex], x, y, z, xa, ya, za) ) ); } */ @@ -2629,7 +2629,7 @@ void LevelRenderer::addParticle(ePARTICLE_TYPE eParticleType, double x, double y addParticleInternal( eParticleType, x, y, z, xa, ya, za ); } -std::shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za) +shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za) { if (mc == NULL || mc->cameraTargetPlayer == NULL || mc->particleEngine == NULL) { @@ -2683,7 +2683,7 @@ std::shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE ePar bool inRange = false; for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { - std::shared_ptr thisPlayer = mc->localplayers[i]; + shared_ptr thisPlayer = mc->localplayers[i]; if(thisPlayer != NULL && level[i] == lev) { xd = thisPlayer->x - x; @@ -2706,35 +2706,35 @@ std::shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE ePar return nullptr; } - std::shared_ptr particle; + shared_ptr particle; switch(eParticleType) { case eParticleType_hugeexplosion: - particle = std::shared_ptr(new HugeExplosionSeedParticle(lev, x, y, z, xa, ya, za)); + particle = shared_ptr(new HugeExplosionSeedParticle(lev, x, y, z, xa, ya, za)); break; case eParticleType_largeexplode: - particle = std::shared_ptr(new HugeExplosionParticle(textures, lev, x, y, z, xa, ya, za)); + particle = shared_ptr(new HugeExplosionParticle(textures, lev, x, y, z, xa, ya, za)); break; case eParticleType_bubble: - particle = std::shared_ptr( new BubbleParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new BubbleParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_suspended: - particle = std::shared_ptr( new SuspendedParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new SuspendedParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_depthsuspend: - particle = std::shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_townaura: - particle = std::shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_crit: { - std::shared_ptr critParticle2 = std::shared_ptr(new CritParticle2(lev, x, y, z, xa, ya, za)); + shared_ptr critParticle2 = shared_ptr(new CritParticle2(lev, x, y, z, xa, ya, za)); critParticle2->CritParticle2PostConstructor(); - particle = std::shared_ptr( critParticle2 ); + particle = shared_ptr( critParticle2 ); // request from 343 to set pink for the needler in the Halo Texture Pack // Set particle colour from colour-table. unsigned int cStart = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_CritStart ); @@ -2758,15 +2758,15 @@ std::shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE ePar break; case eParticleType_magicCrit: { - std::shared_ptr critParticle2 = std::shared_ptr(new CritParticle2(lev, x, y, z, xa, ya, za)); + shared_ptr critParticle2 = shared_ptr(new CritParticle2(lev, x, y, z, xa, ya, za)); critParticle2->CritParticle2PostConstructor(); - particle = std::shared_ptr(critParticle2); + particle = shared_ptr(critParticle2); particle->setColor(particle->getRedCol() * 0.3f, particle->getGreenCol() * 0.8f, particle->getBlueCol()); particle->setNextMiscAnimTex(); } break; case eParticleType_smoke: - particle = std::shared_ptr( new SmokeParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new SmokeParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_endportal: // 4J - Added. { @@ -2776,94 +2776,94 @@ std::shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE ePar unsigned int col = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Particle_EnderPortal ); tmp->setColor( ( (col>>16)&0xFF )/255.0f, ( (col>>8)&0xFF )/255.0, ( col&0xFF )/255.0 ); - particle = std::shared_ptr(tmp); + particle = shared_ptr(tmp); } break; case eParticleType_mobSpell: - particle = std::shared_ptr(new SpellParticle(lev, x, y, z, 0, 0, 0)); + particle = shared_ptr(new SpellParticle(lev, x, y, z, 0, 0, 0)); particle->setColor((float) xa, (float) ya, (float) za); break; case eParticleType_spell: - particle = std::shared_ptr( new SpellParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new SpellParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_instantSpell: - particle = std::shared_ptr(new SpellParticle(lev, x, y, z, xa, ya, za)); + particle = shared_ptr(new SpellParticle(lev, x, y, z, xa, ya, za)); dynamic_pointer_cast(particle)->setBaseTex(9 * 16); break; case eParticleType_note: - particle = std::shared_ptr( new NoteParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new NoteParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_netherportal: - particle = std::shared_ptr( new NetherPortalParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new NetherPortalParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_ender: - particle = std::shared_ptr( new EnderParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new EnderParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_enchantmenttable: - particle = std::shared_ptr(new EchantmentTableParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr(new EchantmentTableParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_explode: - particle = std::shared_ptr( new ExplodeParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new ExplodeParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_flame: - particle = std::shared_ptr( new FlameParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new FlameParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_lava: - particle = std::shared_ptr( new LavaParticle(lev, x, y, z) ); + particle = shared_ptr( new LavaParticle(lev, x, y, z) ); break; case eParticleType_footstep: - particle = std::shared_ptr( new FootstepParticle(textures, lev, x, y, z) ); + particle = shared_ptr( new FootstepParticle(textures, lev, x, y, z) ); break; case eParticleType_splash: - particle = std::shared_ptr( new SplashParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new SplashParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_largesmoke: - particle = std::shared_ptr( new SmokeParticle(lev, x, y, z, xa, ya, za, 2.5f) ); + particle = shared_ptr( new SmokeParticle(lev, x, y, z, xa, ya, za, 2.5f) ); break; case eParticleType_reddust: - particle = std::shared_ptr( new RedDustParticle(lev, x, y, z, (float) xa, (float) ya, (float) za) ); + particle = shared_ptr( new RedDustParticle(lev, x, y, z, (float) xa, (float) ya, (float) za) ); break; case eParticleType_snowballpoof: - particle = std::shared_ptr( new BreakingItemParticle(lev, x, y, z, Item::snowBall, textures) ); + particle = shared_ptr( new BreakingItemParticle(lev, x, y, z, Item::snowBall, textures) ); break; case eParticleType_dripWater: - particle = std::shared_ptr( new DripParticle(lev, x, y, z, Material::water) ); + particle = shared_ptr( new DripParticle(lev, x, y, z, Material::water) ); break; case eParticleType_dripLava: - particle = std::shared_ptr( new DripParticle(lev, x, y, z, Material::lava) ); + particle = shared_ptr( new DripParticle(lev, x, y, z, Material::lava) ); break; case eParticleType_snowshovel: - particle = std::shared_ptr( new SnowShovelParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new SnowShovelParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_slime: - particle = std::shared_ptr( new BreakingItemParticle(lev, x, y, z, Item::slimeBall, textures)); + particle = shared_ptr( new BreakingItemParticle(lev, x, y, z, Item::slimeBall, textures)); break; case eParticleType_heart: - particle = std::shared_ptr( new HeartParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new HeartParticle(lev, x, y, z, xa, ya, za) ); break; case eParticleType_angryVillager: - particle = std::shared_ptr( new HeartParticle(lev, x, y + 0.5f, z, xa, ya, za) ); + particle = shared_ptr( new HeartParticle(lev, x, y + 0.5f, z, xa, ya, za) ); particle->setMiscTex(1 + 16 * 5); particle->setColor(1, 1, 1); break; case eParticleType_happyVillager: - particle = std::shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new SuspendedTownParticle(lev, x, y, z, xa, ya, za) ); particle->setMiscTex(2 + 16 * 5); particle->setColor(1, 1, 1); break; case eParticleType_dragonbreath: - particle = std::shared_ptr( new DragonBreathParticle(lev, x, y, z, xa, ya, za) ); + particle = shared_ptr( new DragonBreathParticle(lev, x, y, z, xa, ya, za) ); break; default: if( ( eParticleType >= eParticleType_iconcrack_base ) && ( eParticleType <= eParticleType_iconcrack_last ) ) { int id = PARTICLE_CRACK_ID(eParticleType), data = PARTICLE_CRACK_DATA(eParticleType); - particle = std::shared_ptr(new BreakingItemParticle(lev, x, y, z, xa, ya, za, Item::items[id], textures, data)); + particle = shared_ptr(new BreakingItemParticle(lev, x, y, z, xa, ya, za, Item::items[id], textures, data)); } else if( ( eParticleType >= eParticleType_tilecrack_base ) && ( eParticleType <= eParticleType_tilecrack_last ) ) { int id = PARTICLE_CRACK_ID(eParticleType), data = PARTICLE_CRACK_DATA(eParticleType); - particle = dynamic_pointer_cast( std::shared_ptr(new TerrainParticle(lev, x, y, z, xa, ya, za, Tile::tiles[id], 0, data, textures))->init(data) ); + particle = dynamic_pointer_cast( shared_ptr(new TerrainParticle(lev, x, y, z, xa, ya, za, Tile::tiles[id], 0, data, textures))->init(data) ); } } @@ -2875,7 +2875,7 @@ std::shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE ePar return particle; } -void LevelRenderer::entityAdded(std::shared_ptr entity) +void LevelRenderer::entityAdded(shared_ptr entity) { entity->prepareCustomTextures(); // 4J - these empty string comparisons used to check for NULL references, but we don't have string pointers (currently) in entities, @@ -2899,7 +2899,7 @@ void LevelRenderer::entityAdded(std::shared_ptr entity) } -void LevelRenderer::entityRemoved(std::shared_ptr entity) +void LevelRenderer::entityRemoved(shared_ptr entity) { /* 4J - removed temp if (entity->customTextureUrl != L"") textures->removeHttpTexture(entity->customTextureUrl); @@ -2936,7 +2936,7 @@ void LevelRenderer::clear() MemoryTracker::releaseLists(chunkLists); } -void LevelRenderer::levelEvent(std::shared_ptr source, int type, int x, int y, int z, int data) +void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y, int z, int data) { int playerIndex = mc->player->GetXboxPad(); // 4J added Random *random = level[playerIndex]->random; @@ -3048,7 +3048,7 @@ void LevelRenderer::levelEvent(std::shared_ptr source, int type, int x, double ys = 0.01 + random->nextDouble() * 0.5; double zs = sin(angle) * dist; - std::shared_ptr spellParticle = addParticleInternal(particleName, xp + xs * 0.1, yp + 0.3, zp + zs * 0.1, xs, ys, zs); + shared_ptr spellParticle = addParticleInternal(particleName, xp + xs * 0.1, yp + 0.3, zp + zs * 0.1, xs, ys, zs); if (spellParticle != NULL) { float randBrightness = 0.75f + random->nextFloat() * 0.25f; @@ -3075,7 +3075,7 @@ void LevelRenderer::levelEvent(std::shared_ptr source, int type, int x, double ys = 0.01 + random->nextDouble() * 0.5; double zs = sin(angle) * dist; - std::shared_ptr acidParticle = addParticleInternal(particleName, xp + xs * 0.1, yp + 0.3, zp + zs * 0.1, xs, ys, zs); + shared_ptr acidParticle = addParticleInternal(particleName, xp + xs * 0.1, yp + 0.3, zp + zs * 0.1, xs, ys, zs); if (acidParticle != NULL) { float randBrightness = 0.75f + random->nextFloat() * 0.25f; diff --git a/Minecraft.Client/LevelRenderer.h b/Minecraft.Client/LevelRenderer.h index 7db67d08..b2bd5eb2 100644 --- a/Minecraft.Client/LevelRenderer.h +++ b/Minecraft.Client/LevelRenderer.h @@ -71,7 +71,7 @@ public: private: void resortChunks(int xc, int yc, int zc); public: - int render(std::shared_ptr player, int layer, double alpha, bool updateChunks); + int render(shared_ptr player, int layer, double alpha, bool updateChunks); private: int renderChunks(int from, int to, int layer, double alpha); public: @@ -87,9 +87,9 @@ public: bool updateDirtyChunks(); public: - void renderHit(std::shared_ptr player, HitResult *h, int mode, std::shared_ptr inventoryItem, float a); - void renderDestroyAnimation(Tesselator *t, std::shared_ptr player, float a); - void renderHitOutline(std::shared_ptr player, HitResult *h, int mode, std::shared_ptr inventoryItem, float a); + void renderHit(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a); + void renderDestroyAnimation(Tesselator *t, shared_ptr player, float a); + void renderHitOutline(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a); void render(AABB *b); void setDirty(int x0, int y0, int z0, int x1, int y1, int z1, Level *level); // 4J - added level param void tileChanged(int x, int y, int z); @@ -106,26 +106,26 @@ public: void cull(Culler *culler, float a); void playStreamingMusic(const wstring& name, int x, int y, int z); void playSound(int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); - void playSound(std::shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); + void playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); void addParticle(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za); // 4J added - std::shared_ptr addParticleInternal(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za); // 4J added - void entityAdded(std::shared_ptr entity); - void entityRemoved(std::shared_ptr entity); - void playerRemoved(std::shared_ptr entity) {} // 4J added - for when a player is removed from the level's player array, not just the entity storage + shared_ptr addParticleInternal(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za); // 4J added + void entityAdded(shared_ptr entity); + void entityRemoved(shared_ptr entity); + void playerRemoved(shared_ptr entity) {} // 4J added - for when a player is removed from the level's player array, not just the entity storage void skyColorChanged(); void clear(); - void levelEvent(std::shared_ptr source, int type, int x, int y, int z, int data); + void levelEvent(shared_ptr source, int type, int x, int y, int z, int data); void destroyTileProgress(int id, int x, int y, int z, int progress); void registerTextures(IconRegister *iconRegister); - typedef unordered_map >, IntKeyHash, IntKeyEq> rteMap; + typedef unordered_map >, IntKeyHash, IntKeyEq> rteMap; private: // debug int m_freezeticks; // used to freeze the clouds // 4J - this block of declarations was scattered round the code but have gathered everything into one place - rteMap renderableTileEntities; // 4J - changed - was vector, now hashed by chunk so we can find them + rteMap renderableTileEntities; // 4J - changed - was vector, now hashed by chunk so we can find them CRITICAL_SECTION m_csRenderableTileEntities; MultiPlayerLevel *level[4]; // 4J - now one per player Textures *textures; diff --git a/Minecraft.Client/LightningBoltRenderer.cpp b/Minecraft.Client/LightningBoltRenderer.cpp index 9bf7af05..d02ea7f7 100644 --- a/Minecraft.Client/LightningBoltRenderer.cpp +++ b/Minecraft.Client/LightningBoltRenderer.cpp @@ -3,10 +3,10 @@ #include "Tesselator.h" #include "..\Minecraft.World\net.minecraft.world.entity.global.h" -void LightningBoltRenderer::render(std::shared_ptr _bolt, double x, double y, double z, float rot, float a) +void LightningBoltRenderer::render(shared_ptr _bolt, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr bolt = dynamic_pointer_cast(_bolt); + shared_ptr bolt = dynamic_pointer_cast(_bolt); Tesselator *t = Tesselator::getInstance(); diff --git a/Minecraft.Client/LightningBoltRenderer.h b/Minecraft.Client/LightningBoltRenderer.h index bf5c7c82..5a2b33a3 100644 --- a/Minecraft.Client/LightningBoltRenderer.h +++ b/Minecraft.Client/LightningBoltRenderer.h @@ -4,5 +4,5 @@ class LightningBoltRenderer : public EntityRenderer { public: - virtual void render(std::shared_ptr bolt, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr bolt, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/LocalPlayer.cpp b/Minecraft.Client/LocalPlayer.cpp index 64fddbf1..ed286cd9 100644 --- a/Minecraft.Client/LocalPlayer.cpp +++ b/Minecraft.Client/LocalPlayer.cpp @@ -165,7 +165,7 @@ void LocalPlayer::calculateFlight(float xa, float ya, float za) void LocalPlayer::serverAiStep() { Player::serverAiStep(); - + if( abilities.flying && abilities.mayfly ) { // snap y rotation for flying to nearest 90 degrees in world space @@ -183,7 +183,7 @@ void LocalPlayer::serverAiStep() float yRotDiff = yRotSnapped - yRotFinal; // Apply the same difference to the player rotated space angle float yRotInputAdjust = yRotInput + yRotDiff; - + // Calculate final x/y player-space movement required this->xxa = cos(yRotInputAdjust * ( PI / 180.0f) ) * fMag; this->yya = sin(yRotInputAdjust * ( PI / 180.0f) ) * fMag; @@ -355,7 +355,7 @@ void LocalPlayer::aiStep() if (isSprinting() && (!forwardEnoughToContinueSprint || !enoughFoodToSprint || isSneaking() || isUsingItem())) { setSprinting(false); - } + } // 4J Stu - Fix for #52705 - Customer Encountered: Player can fly in bed while being in Creative mode. if (!isSleeping() && (abilities.mayfly || isAllowedToFly() )) @@ -396,7 +396,7 @@ void LocalPlayer::aiStep() abilities.flying = false; } } - + if (abilities.flying) { @@ -515,7 +515,7 @@ void LocalPlayer::aiStep() else { ProfileManager.SetCurrentGameActivity(m_iPad,CONTEXT_PRESENCE_MULTIPLAYER,false); - } + } } else { @@ -605,14 +605,14 @@ void LocalPlayer::closeContainer() ui.CloseUIScenes( m_iPad ); } -void LocalPlayer::openTextEdit(std::shared_ptr sign) +void LocalPlayer::openTextEdit(shared_ptr sign) { bool success = app.LoadSignEntryMenu(GetXboxPad(), sign ); if( success ) ui.PlayUISFX(eSFX_Press); //minecraft->setScreen(new TextEditScreen(sign)); } -bool LocalPlayer::openContainer(std::shared_ptr container) +bool LocalPlayer::openContainer(shared_ptr container) { bool success = app.LoadContainerMenu(GetXboxPad(), inventory, container ); if( success ) ui.PlayUISFX(eSFX_Press); @@ -645,7 +645,7 @@ bool LocalPlayer::startRepairing(int x, int y, int z) return success; } -bool LocalPlayer::openFurnace(std::shared_ptr furnace) +bool LocalPlayer::openFurnace(shared_ptr furnace) { bool success = app.LoadFurnaceMenu(GetXboxPad(),inventory, furnace); if( success ) ui.PlayUISFX(eSFX_Press); @@ -653,7 +653,7 @@ bool LocalPlayer::openFurnace(std::shared_ptr furnace) return success; } -bool LocalPlayer::openBrewingStand(std::shared_ptr brewingStand) +bool LocalPlayer::openBrewingStand(shared_ptr brewingStand) { bool success = app.LoadBrewingStandMenu(GetXboxPad(),inventory, brewingStand); if( success ) ui.PlayUISFX(eSFX_Press); @@ -661,7 +661,7 @@ bool LocalPlayer::openBrewingStand(std::shared_ptr brewi return success; } -bool LocalPlayer::openTrap(std::shared_ptr trap) +bool LocalPlayer::openTrap(shared_ptr trap) { bool success = app.LoadTrapMenu(GetXboxPad(),inventory, trap); if( success ) ui.PlayUISFX(eSFX_Press); @@ -669,7 +669,7 @@ bool LocalPlayer::openTrap(std::shared_ptr trap) return success; } -bool LocalPlayer::openTrading(std::shared_ptr traderTarget) +bool LocalPlayer::openTrading(shared_ptr traderTarget) { bool success = app.LoadTradingMenu(GetXboxPad(),inventory, traderTarget, level); if( success ) ui.PlayUISFX(eSFX_Press); @@ -677,23 +677,23 @@ bool LocalPlayer::openTrading(std::shared_ptr traderTarget) return success; } -void LocalPlayer::crit(std::shared_ptr e) +void LocalPlayer::crit(shared_ptr e) { - std::shared_ptr critParticle = std::shared_ptr( new CritParticle((Level *)minecraft->level, e) ); + shared_ptr critParticle = shared_ptr( new CritParticle((Level *)minecraft->level, e) ); critParticle->CritParticlePostConstructor(); minecraft->particleEngine->add(critParticle); } -void LocalPlayer::magicCrit(std::shared_ptr e) +void LocalPlayer::magicCrit(shared_ptr e) { - std::shared_ptr critParticle = std::shared_ptr( new CritParticle((Level *)minecraft->level, e, eParticleType_magicCrit) ); + shared_ptr critParticle = shared_ptr( new CritParticle((Level *)minecraft->level, e, eParticleType_magicCrit) ); critParticle->CritParticlePostConstructor(); minecraft->particleEngine->add(critParticle); } -void LocalPlayer::take(std::shared_ptr e, int orgCount) +void LocalPlayer::take(shared_ptr e, int orgCount) { - minecraft->particleEngine->add( std::shared_ptr( new TakeAnimationParticle((Level *)minecraft->level, e, shared_from_this(), -0.5f) ) ); + minecraft->particleEngine->add( shared_ptr( new TakeAnimationParticle((Level *)minecraft->level, e, shared_from_this(), -0.5f) ) ); } void LocalPlayer::chat(const wstring& message) @@ -761,7 +761,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) { #ifdef _DURANGO // 4J-JEV: Maybe we want to fine tune this later? #TODO - if ( !ProfileManager.IsGuest(GetXboxPad()) + if ( !ProfileManager.IsGuest(GetXboxPad()) && app.CanRecordStatsAndAchievements() && ProfileManager.IsFullVersion() ) @@ -840,7 +840,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) toolStats[0][2] = GenericStats::itemsCrafted(Item::shovel_iron->id); toolStats[0][3] = GenericStats::itemsCrafted(Item::shovel_diamond->id); toolStats[0][4] = GenericStats::itemsCrafted(Item::shovel_gold->id); - toolStats[1][0] = GenericStats::itemsCrafted(Item::pickAxe_wood->id); + toolStats[1][0] = GenericStats::itemsCrafted(Item::pickAxe_wood->id); toolStats[1][1] = GenericStats::itemsCrafted(Item::pickAxe_stone->id); toolStats[1][2] = GenericStats::itemsCrafted(Item::pickAxe_iron->id); toolStats[1][3] = GenericStats::itemsCrafted(Item::pickAxe_diamond->id); @@ -855,7 +855,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) toolStats[3][2] = GenericStats::itemsCrafted(Item::hoe_iron->id); toolStats[3][3] = GenericStats::itemsCrafted(Item::hoe_diamond->id); toolStats[3][4] = GenericStats::itemsCrafted(Item::hoe_gold->id); - + bool justCraftedTool = false; for (int i=0; i<4; i++) { @@ -893,7 +893,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) awardStat(GenericStats::MOARTools(), GenericStats::param_noArgs()); } } - + } #ifdef _XBOX @@ -977,7 +977,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) numEmeraldMined = pStats->getTotalValue(emeraldMined); numEmeraldBought = pStats->getTotalValue(emeraldBought); totalSum = numEmeraldMined + numEmeraldBought; - + app.DebugPrintf( "[AwardStat] Check unlock 'The Haggler': " "emerald_mined=%i, emerald_bought=%i, sum=%i.\n", @@ -1033,7 +1033,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) // AWARD : Rainbow Collection, collect all different colours of wool. { bool justPickedupWool = false; - + for (int i=0; i<16; i++) if ( stat == GenericStats::itemsCollected(Tile::cloth_Id, i) ) justPickedupWool = true; @@ -1041,7 +1041,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) if (justPickedupWool) { unsigned int woolCount = 0; - + for (unsigned int i = 0; i < 16; i++) { if (pStats->getTotalValue(GenericStats::itemsCollected(Tile::cloth_Id, i)) > 0) @@ -1152,7 +1152,7 @@ bool LocalPlayer::hasPermission(EGameCommand command) return level->getLevelData()->getAllowCommands(); } -void LocalPlayer::onCrafted(std::shared_ptr item) +void LocalPlayer::onCrafted(shared_ptr item) { if( minecraft->localgameModes[m_iPad] != NULL ) { @@ -1195,7 +1195,7 @@ void LocalPlayer::mapPlayerChunk(const unsigned int flagTileType) cout << "O"; else for (unsigned int y = 127; y > 0; y--) { - int t = cc->getTile(x,y,z); + int t = cc->getTile(x,y,z); if (flagTileType != 0 && t == flagTileType) { cout << "@"; break; } else if (t != 0 && t < 10) { cout << t; break; } else if (t > 0) { cout << "#"; break; } @@ -1229,7 +1229,7 @@ void LocalPlayer::handleMouseDown(int button, bool down) if( ( ( y == 0 ) || ( ( y == 127 ) && level->dimension->hasCeiling ) ) && level->dimension->id != 1 ) return; minecraft->gameMode->continueDestroyBlock(x, y, z, minecraft->hitResult->f); - + if(mayBuild(x,y,z)) { minecraft->particleEngine->crack(x, y, z, minecraft->hitResult->f); @@ -1267,7 +1267,7 @@ bool LocalPlayer::creativeModeHandleMouseClick(int button, bool buttonPressed) } // Get distance from last click point in each axis - float dX = (float)x - lastClickX; + float dX = (float)x - lastClickX; float dY = (float)y - lastClickY; float dZ = (float)z - lastClickZ; bool newClick = false; @@ -1415,13 +1415,13 @@ bool LocalPlayer::handleMouseClick(int button) bool returnItemPlaced = false; if (button == 0 && missTime > 0) return false; - if (button == 0) + if (button == 0) { //app.DebugPrintf("handleMouseClick - Player %d is swinging\n",GetXboxPad()); swing(); } - bool mayUse = true; + bool mayUse = true; // 4J-PB - Adding a special case in here for sleeping in a bed in a multiplayer game - we need to wake up, and we don't have the inbedchatscreen with a button @@ -1430,10 +1430,10 @@ bool LocalPlayer::handleMouseClick(int button) if(lastClickState == lastClick_oldRepeat) return false; - std::shared_ptr mplp = dynamic_pointer_cast( shared_from_this() ); + shared_ptr mplp = dynamic_pointer_cast( shared_from_this() ); if(mplp && mplp->connection) mplp->StopSleeping(); - + } // 4J Stu - We should not accept any input while asleep, except the above to wake up if(isSleeping() && level != NULL && level->isClientSide) @@ -1441,7 +1441,7 @@ bool LocalPlayer::handleMouseClick(int button) return false; } - std::shared_ptr oldItem = inventory->getSelected(); + shared_ptr oldItem = inventory->getSelected(); if (minecraft->hitResult == NULL) { @@ -1455,15 +1455,15 @@ bool LocalPlayer::handleMouseClick(int button) } if (button == 1) { - // 4J-PB - if we milk a cow here, and end up with a bucket of milk, the if (mayUse && button == 1) further down will + // 4J-PB - if we milk a cow here, and end up with a bucket of milk, the if (mayUse && button == 1) further down will // then empty our bucket if we're pointing at a tile - // It looks like interact really should be returning a result so we can check this, but it's possibly just the + // It looks like interact really should be returning a result so we can check this, but it's possibly just the // milk bucket that causes a problem if(minecraft->hitResult->entity->GetType()==eTYPE_COW) { // If I have an empty bucket in my hand, it's going to be filled with milk, so turn off mayUse - std::shared_ptr item = inventory->getSelected(); + shared_ptr item = inventory->getSelected(); if(item && (item->id==Item::bucket_empty_Id)) { mayUse=false; @@ -1493,7 +1493,7 @@ bool LocalPlayer::handleMouseClick(int button) } else { - std::shared_ptr item = oldItem; + shared_ptr item = oldItem; int oldCount = item != NULL ? item->count : 0; bool usedItem = false; if (minecraft->gameMode->useItemOn(minecraft->localplayers[GetXboxPad()], level, item, x, y, z, face, minecraft->hitResult->pos, false, &usedItem)) @@ -1525,7 +1525,7 @@ bool LocalPlayer::handleMouseClick(int button) if (mayUse && button == 1) { - std::shared_ptr item = inventory->getSelected(); + shared_ptr item = inventory->getSelected(); if (item != NULL) { if (minecraft->gameMode->useItem(minecraft->localplayers[GetXboxPad()], level, item)) @@ -1541,7 +1541,7 @@ void LocalPlayer::updateRichPresence() { if((m_iPad!=-1)/* && !ui.GetMenuDisplayed(m_iPad)*/ ) { - std::shared_ptr selectedItem = inventory->getSelected(); + shared_ptr selectedItem = inventory->getSelected(); if(selectedItem != NULL && selectedItem->id == Item::fishingRod_Id) { app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_FISHING); @@ -1549,7 +1549,7 @@ void LocalPlayer::updateRichPresence() else if(selectedItem != NULL && selectedItem->id == Item::map_Id) { app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_MAP); - } + } else if(riding != NULL && dynamic_pointer_cast(riding) != NULL) { app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_RIDING_MINECART); @@ -1597,7 +1597,7 @@ float LocalPlayer::getAndResetChangeDimensionTimer() return returnVal; } -void LocalPlayer::handleCollectItem(std::shared_ptr item) +void LocalPlayer::handleCollectItem(shared_ptr item) { if(item != NULL) { diff --git a/Minecraft.Client/LocalPlayer.h b/Minecraft.Client/LocalPlayer.h index e4c0142c..865af154 100644 --- a/Minecraft.Client/LocalPlayer.h +++ b/Minecraft.Client/LocalPlayer.h @@ -99,18 +99,18 @@ public: virtual void addAdditonalSaveData(CompoundTag *entityTag); virtual void readAdditionalSaveData(CompoundTag *entityTag); virtual void closeContainer(); - virtual void openTextEdit(std::shared_ptr sign); - virtual bool openContainer(std::shared_ptr container); // 4J added bool return + virtual void openTextEdit(shared_ptr sign); + virtual bool openContainer(shared_ptr container); // 4J added bool return virtual bool startCrafting(int x, int y, int z); // 4J added bool return virtual bool startEnchanting(int x, int y, int z); // 4J added bool return virtual bool startRepairing(int x, int y, int z); - virtual bool openFurnace(std::shared_ptr furnace); // 4J added bool return - virtual bool openBrewingStand(std::shared_ptr brewingStand); // 4J added bool return - virtual bool openTrap(std::shared_ptr trap); // 4J added bool return - virtual bool openTrading(std::shared_ptr traderTarget); - virtual void crit(std::shared_ptr e); - virtual void magicCrit(std::shared_ptr e); - virtual void take(std::shared_ptr e, int orgCount); + virtual bool openFurnace(shared_ptr furnace); // 4J added bool return + virtual bool openBrewingStand(shared_ptr brewingStand); // 4J added bool return + virtual bool openTrap(shared_ptr trap); // 4J added bool return + virtual bool openTrading(shared_ptr traderTarget); + virtual void crit(shared_ptr e); + virtual void magicCrit(shared_ptr e); + virtual void take(shared_ptr e, int orgCount); virtual void chat(const wstring& message); virtual bool isSneaking(); //virtual bool isIdle(); @@ -159,7 +159,7 @@ public: int lastClickState; // 4J Stu - Added to allow callback to tutorial to stay within Minecraft.Client - virtual void onCrafted(std::shared_ptr item); + virtual void onCrafted(shared_ptr item); virtual void setAndBroadcastCustomSkin(DWORD skinId); virtual void setAndBroadcastCustomCape(DWORD capeId); @@ -189,7 +189,7 @@ public: float getAndResetChangeDimensionTimer(); - virtual void handleCollectItem(std::shared_ptr item); + virtual void handleCollectItem(shared_ptr item); void SetPlayerAdditionalModelParts(vectorpAdditionalModelParts); private: diff --git a/Minecraft.Client/MinecartModel.cpp b/Minecraft.Client/MinecartModel.cpp index d4ff04c0..8a1ce0d7 100644 --- a/Minecraft.Client/MinecartModel.cpp +++ b/Minecraft.Client/MinecartModel.cpp @@ -18,22 +18,22 @@ MinecartModel::MinecartModel() : Model() cubes[0]->addBox((float)(-w / 2), (float)(-h / 2), -1, w, h, 2, 0); cubes[0]->setPos(0, (float)(0 + yOff), 0); - + cubes[5]->addBox((float)(-w / 2 + 1), (float)(-h / 2 + 1), -1, w - 2, h - 2, 1, 0); cubes[5]->setPos(0, (float)(0 + yOff), 0); - + cubes[1]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); cubes[1]->setPos((float)(-w / 2 + 1), (float)(0 + yOff), 0); - + cubes[2]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); cubes[2]->setPos((float)(+w / 2 - 1), (float)(0 + yOff), 0); - + cubes[3]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); cubes[3]->setPos(0, (float)(0 + yOff), (float)(-h / 2 + 1)); - + cubes[4]->addBox((float)(-w / 2 + 2), (float)(-d - 1), -1, w - 4, d, 2, 0); cubes[4]->setPos(0, (float)(0 + yOff), (float)(+h / 2 - 1)); - + cubes[0]->xRot = PI / 2; cubes[1]->yRot = PI / 2 * 3; cubes[2]->yRot = PI / 2 * 1; @@ -47,7 +47,7 @@ MinecartModel::MinecartModel() : Model() } } -void MinecartModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void MinecartModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { cubes[5]->y = 4 - bob; for (int i = 0; i < MINECART_LENGTH; i++) diff --git a/Minecraft.Client/MinecartModel.h b/Minecraft.Client/MinecartModel.h index 2cf6d0ef..de925566 100644 --- a/Minecraft.Client/MinecartModel.h +++ b/Minecraft.Client/MinecartModel.h @@ -9,5 +9,5 @@ public: ModelPart *cubes[MINECART_LENGTH]; MinecartModel(); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; diff --git a/Minecraft.Client/MinecartRenderer.cpp b/Minecraft.Client/MinecartRenderer.cpp index cd274992..1fa4a1d9 100644 --- a/Minecraft.Client/MinecartRenderer.cpp +++ b/Minecraft.Client/MinecartRenderer.cpp @@ -10,10 +10,10 @@ MinecartRenderer::MinecartRenderer() model = new MinecartModel(); } -void MinecartRenderer::render(std::shared_ptr _cart, double x, double y, double z, float rot, float a) +void MinecartRenderer::render(shared_ptr _cart, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr cart = dynamic_pointer_cast(_cart); + shared_ptr cart = dynamic_pointer_cast(_cart); glPushMatrix(); diff --git a/Minecraft.Client/MinecartRenderer.h b/Minecraft.Client/MinecartRenderer.h index 6902a3bf..0335ba8d 100644 --- a/Minecraft.Client/MinecartRenderer.h +++ b/Minecraft.Client/MinecartRenderer.h @@ -8,5 +8,5 @@ protected: public: MinecartRenderer(); - void render(std::shared_ptr _cart, double x, double y, double z, float rot, float a); + void render(shared_ptr _cart, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp index 315eb52b..aef61677 100644 --- a/Minecraft.Client/Minecraft.cpp +++ b/Minecraft.Client/Minecraft.cpp @@ -977,7 +977,7 @@ bool Minecraft::addLocalPlayer(int idx) if(success) { app.DebugPrintf("Adding temp local player on pad %d\n", idx); - localplayers[idx] = std::shared_ptr( new MultiplayerLocalPlayer(this, level, user, NULL ) ); + localplayers[idx] = shared_ptr( new MultiplayerLocalPlayer(this, level, user, NULL ) ); localgameModes[idx] = NULL; updatePlayerViewportAssignments(); @@ -1025,7 +1025,7 @@ void Minecraft::addPendingLocalConnection(int idx, ClientConnection *connection) m_pendingLocalConnections[idx] = connection; } -std::shared_ptr Minecraft::createExtraLocalPlayer(int idx, const wstring& name, int iPad, int iDimension, ClientConnection *clientConnection /*= NULL*/,MultiPlayerLevel *levelpassedin) +shared_ptr Minecraft::createExtraLocalPlayer(int idx, const wstring& name, int iPad, int iDimension, ClientConnection *clientConnection /*= NULL*/,MultiPlayerLevel *levelpassedin) { if( clientConnection == NULL) return nullptr; @@ -1141,7 +1141,7 @@ void Minecraft::removeLocalPlayerIdx(int idx) { if( getLevel( localplayers[idx]->dimension )->isClientSide ) { - std::shared_ptr mplp = localplayers[idx]; + shared_ptr mplp = localplayers[idx]; ( (MultiPlayerLevel *)getLevel( localplayers[idx]->dimension ) )->removeClientConnection(mplp->connection, true); delete mplp->connection; mplp->connection = NULL; @@ -1163,7 +1163,7 @@ void Minecraft::removeLocalPlayerIdx(int idx) } else if( m_pendingLocalConnections[idx] != NULL ) { - m_pendingLocalConnections[idx]->sendAndDisconnect( std::shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) );; + m_pendingLocalConnections[idx]->sendAndDisconnect( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) );; delete m_pendingLocalConnections[idx]; m_pendingLocalConnections[idx] = NULL; g_NetworkManager.RemoveLocalPlayerByUserIndex(idx); @@ -1676,7 +1676,7 @@ void Minecraft::run_middle() else { // create the localplayer - std::shared_ptr player = localplayers[i]; + shared_ptr player = localplayers[i]; if( player == NULL) { player = createExtraLocalPlayer(i, (convStringToWstring( ProfileManager.GetGamertag(i) )).c_str(), i, level->dimension->id); @@ -1892,7 +1892,7 @@ void Minecraft::run_middle() // if (pause) timer.a = 1; PIXBeginNamedEvent(0,"Sound engine update"); - soundEngine->tick((std::shared_ptr *)localplayers, timer->a); + soundEngine->tick((shared_ptr *)localplayers, timer->a); PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Light update"); @@ -2427,7 +2427,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) else { // no hit result, but we may have something in our hand that we can do something with - std::shared_ptr itemInstance = player->inventory->getSelected(); + shared_ptr itemInstance = player->inventory->getSelected(); // 4J-JEV: Moved all this here to avoid having it in 3 different places. if (itemInstance) @@ -2798,14 +2798,14 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) // is there an object in hand? if(player->inventory->IsHeldItem()) { - std::shared_ptr heldItem=player->inventory->getSelected(); + shared_ptr heldItem=player->inventory->getSelected(); int iID=heldItem->getItem()->id; switch(iID) { default: { - std::shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) { @@ -2822,7 +2822,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) // is there an object in hand? if(player->inventory->IsHeldItem()) { - std::shared_ptr heldItem=player->inventory->getSelected(); + shared_ptr heldItem=player->inventory->getSelected(); int iID=heldItem->getItem()->id; // It's an item @@ -2834,7 +2834,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; default: { - std::shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) { @@ -2851,7 +2851,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) { if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - std::shared_ptr heldItem=player->inventory->getSelected(); + shared_ptr heldItem=player->inventory->getSelected(); int iID=heldItem->getItem()->id; // It's an item @@ -2865,13 +2865,13 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) case Item::shears_Id: { if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - std::shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); if(!animal->isBaby()) *piUse=IDS_TOOLTIPS_SHEAR; } break; default: { - std::shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) { @@ -2924,7 +2924,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) // is there an object in hand? if(player->inventory->IsHeldItem()) { - std::shared_ptr heldItem=player->inventory->getSelected(); + shared_ptr heldItem=player->inventory->getSelected(); int iID=heldItem->getItem()->id; if(iID==Item::coal->id) @@ -2946,14 +2946,14 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; if(player->inventory->IsHeldItem()) { - std::shared_ptr heldItem=player->inventory->getSelected(); + shared_ptr heldItem=player->inventory->getSelected(); int iID=heldItem->getItem()->id; switch(iID) { case Item::dye_powder_Id: { - std::shared_ptr sheep = dynamic_pointer_cast(hitResult->entity); + shared_ptr sheep = dynamic_pointer_cast(hitResult->entity); // convert to tile-based color value (0 is white instead of black) int newColor = ClothTile::getTileDataForItemAuxValue(heldItem->getAuxValue()); @@ -2966,7 +2966,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; case Item::shears_Id: { - std::shared_ptr sheep = dynamic_pointer_cast(hitResult->entity); + shared_ptr sheep = dynamic_pointer_cast(hitResult->entity); // can only shear a sheep that hasn't been sheared if(!sheep->isSheared() ) @@ -2978,7 +2978,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; default: { - std::shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) { @@ -3008,7 +3008,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) { if(player->inventory->IsHeldItem()) { - std::shared_ptr heldItem=player->inventory->getSelected(); + shared_ptr heldItem=player->inventory->getSelected(); int iID=heldItem->getItem()->id; switch(iID) @@ -3018,7 +3018,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; default: { - std::shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) { @@ -3036,8 +3036,8 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) // can be tamed, fed, and made to sit/stand, or enter love mode { int iID=-1; - std::shared_ptr heldItem=nullptr; - std::shared_ptr wolf = dynamic_pointer_cast(hitResult->entity); + shared_ptr heldItem=nullptr; + shared_ptr wolf = dynamic_pointer_cast(hitResult->entity); if(player->inventory->IsHeldItem()) { @@ -3126,8 +3126,8 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) case eTYPE_OZELOT: { int iID=-1; - std::shared_ptr heldItem=nullptr; - std::shared_ptr ocelot = dynamic_pointer_cast(hitResult->entity); + shared_ptr heldItem=nullptr; + shared_ptr ocelot = dynamic_pointer_cast(hitResult->entity); if(player->inventory->IsHeldItem()) { @@ -3188,7 +3188,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) case eTYPE_PLAYER: { // Fix for #58576 - TU6: Content: Gameplay: Hit button prompt is available when attacking a host who has "Invisible" option turned on - std::shared_ptr TargetPlayer = dynamic_pointer_cast(hitResult->entity); + shared_ptr TargetPlayer = dynamic_pointer_cast(hitResult->entity); if(!TargetPlayer->hasInvisiblePrivilege()) // This means they are invisible, not just that they have the privilege { @@ -3201,7 +3201,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; case eTYPE_ITEM_FRAME: { - std::shared_ptr itemFrame = dynamic_pointer_cast(hitResult->entity); + shared_ptr itemFrame = dynamic_pointer_cast(hitResult->entity); // is the frame occupied? if(itemFrame->getItem()!=NULL) @@ -3223,7 +3223,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; case eTYPE_VILLAGER: { - std::shared_ptr villager = dynamic_pointer_cast(hitResult->entity); + shared_ptr villager = dynamic_pointer_cast(hitResult->entity); if (!villager->isBaby()) { *piUse=IDS_TOOLTIPS_TRADE; @@ -3233,8 +3233,8 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; case eTYPE_ZOMBIE: { - std::shared_ptr zomb = dynamic_pointer_cast(hitResult->entity); - std::shared_ptr heldItem=nullptr; + shared_ptr zomb = dynamic_pointer_cast(hitResult->entity); + shared_ptr heldItem=nullptr; if(player->inventory->IsHeldItem()) { @@ -3470,9 +3470,9 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if((player->ullButtonsPressed&(1LL< mob = dynamic_pointer_cast(Creeper::_class->newInstance( level )); - //std::shared_ptr mob = dynamic_pointer_cast(Wolf::_class->newInstance( level )); - std::shared_ptr mob = dynamic_pointer_cast(std::shared_ptr(new Spider( level ))); + //shared_ptr mob = dynamic_pointer_cast(Creeper::_class->newInstance( level )); + //shared_ptr mob = dynamic_pointer_cast(Wolf::_class->newInstance( level )); + shared_ptr mob = dynamic_pointer_cast(shared_ptr(new Spider( level ))); mob->moveTo(player->x+1, player->y, player->z+1, level->random->nextFloat() * 360, 0); level->addEntity(mob); } @@ -3502,14 +3502,14 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_INVENTORY)) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->player ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->player ); ui.PlayUISFX(eSFX_Press); app.LoadInventoryMenu(iPad,player); } if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_CRAFTING)) { - std::shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->player ); + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->player ); // 4J-PB - reordered the if statement so creative mode doesn't bring up the crafting table // Fix for #39014 - TU5: Creative Mode: Pressing X to access the creative menu while looking at a crafting table causes the crafting menu to display @@ -3573,7 +3573,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if( selected || wheel != 0 || (player->ullButtonsPressed&(1LL< selectedItem = player->getSelectedItem(); + shared_ptr selectedItem = player->getSelectedItem(); // Dropping items happens over network, so if we only have one then assume that we dropped it and should hide the item int iCount=0; @@ -3841,7 +3841,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) setLocalPlayerIdx(idx); gameRenderer->setupCamera(timer->a, i); Camera::prepare(localplayers[idx], localplayers[idx]->ThirdPersonView() == 2); - std::shared_ptr cameraEntity = cameraTargetPlayer; + shared_ptr cameraEntity = cameraTargetPlayer; double xOff = cameraEntity->xOld + (cameraEntity->x - cameraEntity->xOld) * timer->a; double yOff = cameraEntity->yOld + (cameraEntity->y - cameraEntity->yOld) * timer->a; double zOff = cameraEntity->zOld + (cameraEntity->z - cameraEntity->zOld) * timer->a; @@ -3967,7 +3967,7 @@ MultiPlayerLevel *Minecraft::getLevel(int dimension) //} // Also causing ambiguous call for some reason -// as it is matching std::shared_ptr from the func below with bool from this one +// as it is matching shared_ptr from the func below with bool from this one //void Minecraft::setLevel(Level *level, const wstring& message, bool doForceStatsSave /*= true*/) //{ // setLevel(level, message, NULL, doForceStatsSave); @@ -3981,7 +3981,7 @@ void Minecraft::forceaddLevel(MultiPlayerLevel *level) else levels[0] = level; } -void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, std::shared_ptr forceInsertPlayer /*=NULL*/, bool doForceStatsSave /*=true*/, bool bPrimaryPlayerSignedOut /*=false*/) +void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, shared_ptr forceInsertPlayer /*=NULL*/, bool doForceStatsSave /*=true*/, bool bPrimaryPlayerSignedOut /*=false*/) { EnterCriticalSection(&m_setLevelCS); bool playerAdded = false; @@ -4046,7 +4046,7 @@ void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, std::shar // Delete all the player objects for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { - std::shared_ptr mplp = localplayers[idx]; + shared_ptr mplp = localplayers[idx]; if(mplp != NULL && mplp->connection != NULL ) { delete mplp->connection; @@ -4293,7 +4293,7 @@ wstring Minecraft::gatherStats4() void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) { gameRenderer->DisableUpdateThread(); // 4J - don't do updating whilst we are adjusting the player & localplayer array - std::shared_ptr localPlayer = localplayers[iPad]; + shared_ptr localPlayer = localplayers[iPad]; level->validateSpawn(); level->removeAllPendingEntityRemovals(); @@ -4304,7 +4304,7 @@ void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) level->removeEntity(localPlayer); } - std::shared_ptr oldPlayer = localPlayer; + shared_ptr oldPlayer = localPlayer; cameraTargetPlayer = nullptr; // 4J-PB - copy and set the players xbox pad @@ -4692,7 +4692,7 @@ bool mayUse = true; if(button==1 && (player->isSleeping() && level != NULL && level->isClientSide)) { -std::shared_ptr mplp = dynamic_pointer_cast( player ); +shared_ptr mplp = dynamic_pointer_cast( player ); if(mplp) mplp->StopSleeping(); @@ -4741,7 +4741,7 @@ gameMode->startDestroyBlock(x, y, z, hitResult->f); } else { -std::shared_ptr item = player->inventory->getSelected(); +shared_ptr item = player->inventory->getSelected(); int oldCount = item != NULL ? item->count : 0; if (gameMode->useItemOn(player, level, item, x, y, z, face)) { @@ -4767,7 +4767,7 @@ gameRenderer->itemInHandRenderer->itemPlaced(); if (mayUse && button == 1) { -std::shared_ptr item = player->inventory->getSelected(); +shared_ptr item = player->inventory->getSelected(); if (item != NULL) { if (gameMode->useItem(player, level, item)) @@ -4854,7 +4854,7 @@ void Minecraft::inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasP else if( ProfileManager.IsSignedInLive(iPad) && ProfileManager.AllowedToPlayMultiplayer(iPad) ) { // create the local player for the iPad - std::shared_ptr player = pClass->localplayers[iPad]; + shared_ptr player = pClass->localplayers[iPad]; if( player == NULL) { if( pClass->level->isClientSide ) @@ -4864,7 +4864,7 @@ void Minecraft::inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasP else { // create the local player for the iPad - std::shared_ptr player = pClass->localplayers[iPad]; + shared_ptr player = pClass->localplayers[iPad]; if( player == NULL) { player = pClass->createExtraLocalPlayer(iPad, (convStringToWstring( ProfileManager.GetGamertag(iPad) )).c_str(), iPad, pClass->level->dimension->id); @@ -4935,7 +4935,7 @@ int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad) else { // create the local player for the iPad - std::shared_ptr player = pMinecraftClass->localplayers[iPad]; + shared_ptr player = pMinecraftClass->localplayers[iPad]; if( player == NULL) { player = pMinecraftClass->createExtraLocalPlayer(iPad, (convStringToWstring( ProfileManager.GetGamertag(iPad) )).c_str(), iPad, pMinecraftClass->level->dimension->id); @@ -4964,7 +4964,7 @@ void Minecraft::tickAllConnections() int oldIdx = getLocalPlayerIdx(); for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++ ) { - std::shared_ptr mplp = localplayers[i]; + shared_ptr mplp = localplayers[i]; if( mplp && mplp->connection) { setLocalPlayerIdx(i); diff --git a/Minecraft.Client/Minecraft.h b/Minecraft.Client/Minecraft.h index cbe13e09..2e943de7 100644 --- a/Minecraft.Client/Minecraft.h +++ b/Minecraft.Client/Minecraft.h @@ -90,11 +90,11 @@ public: MultiPlayerLevel *level; LevelRenderer *levelRenderer; - std::shared_ptr player; + shared_ptr player; MultiPlayerLevelArray levels; - std::shared_ptr localplayers[XUSER_MAX_COUNT]; + shared_ptr localplayers[XUSER_MAX_COUNT]; MultiPlayerGameMode *localgameModes[XUSER_MAX_COUNT]; int localPlayerIdx; ItemInHandRenderer *localitemInHandRenderers[XUSER_MAX_COUNT]; @@ -110,7 +110,7 @@ public: void addPendingLocalConnection(int idx, ClientConnection *connection); void connectionDisconnected(int idx, DisconnectPacket::eDisconnectReason reason) { m_connectionFailed[idx] = true; m_connectionFailedReason[idx] = reason; } - std::shared_ptr createExtraLocalPlayer(int idx, const wstring& name, int pad, int iDimension, ClientConnection *clientConnection = NULL,MultiPlayerLevel *levelpassedin=NULL); + shared_ptr createExtraLocalPlayer(int idx, const wstring& name, int pad, int iDimension, ClientConnection *clientConnection = NULL,MultiPlayerLevel *levelpassedin=NULL); void createPrimaryLocalPlayer(int iPad); bool setLocalPlayerIdx(int idx); int getLocalPlayerIdx(); @@ -119,7 +119,7 @@ public: void updatePlayerViewportAssignments(); int unoccupiedQuadrant; // 4J - added - std::shared_ptr cameraTargetPlayer; + shared_ptr cameraTargetPlayer; ParticleEngine *particleEngine; User *user; wstring serverDomain; @@ -276,7 +276,7 @@ public: // 4J Stu - Added the doForceStatsSave param //void setLevel(Level *level, bool doForceStatsSave = true); //void setLevel(Level *level, const wstring& message, bool doForceStatsSave = true); - void setLevel(MultiPlayerLevel *level, int message = -1, std::shared_ptr forceInsertPlayer = nullptr, bool doForceStatsSave = true,bool bPrimaryPlayerSignedOut=false); + void setLevel(MultiPlayerLevel *level, int message = -1, shared_ptr forceInsertPlayer = nullptr, bool doForceStatsSave = true,bool bPrimaryPlayerSignedOut=false); // 4J-PB - added to force in the 'other' level when the main player creates the level at game load time void forceaddLevel(MultiPlayerLevel *level); void prepareLevel(int title); // 4J - changed to public diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index b94330d7..a57b798b 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -395,7 +395,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring if( app.GetGameHostOption(eGameHostOption_BonusChest ) ) levelSettings->enableStartingBonusItems(); // 4J - temp - load existing level - std::shared_ptr storage = nullptr; + shared_ptr storage = nullptr; bool levelChunksNeedConverted = false; if( initData->saveData != NULL ) { @@ -413,7 +413,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring levelChunksNeedConverted = true; pSave->ConvertToLocalPlatform(); // check if we need to convert this file from PS3->PS4 - storage = std::shared_ptr(new McRegionLevelStorage(pSave, File(L"."), name, true)); + storage = shared_ptr(new McRegionLevelStorage(pSave, File(L"."), name, true)); } else { @@ -438,9 +438,9 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring newFormatSave = new ConsoleSaveFileSplit( L"" ); } - storage = std::shared_ptr(new McRegionLevelStorage(newFormatSave, File(L"."), name, true)); + storage = shared_ptr(new McRegionLevelStorage(newFormatSave, File(L"."), name, true)); #else - storage = std::shared_ptr(new McRegionLevelStorage(new ConsoleSaveFileOriginal( L"" ), File(L"."), name, true)); + storage = shared_ptr(new McRegionLevelStorage(new ConsoleSaveFileOriginal( L"" ), File(L"."), name, true)); #endif } @@ -1245,7 +1245,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) players->saveAll(Minecraft::GetInstance()->progressRenderer); } - players->broadcastAll( std::shared_ptr( new UpdateProgressPacket(20) ) ); + players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); for (unsigned int j = 0; j < levels.length; j++) { @@ -1256,7 +1256,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) ServerLevel *level = levels[levels.length - 1 - j]; level->save(true, Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); - players->broadcastAll( std::shared_ptr( new UpdateProgressPacket(33 + (j*33) ) ) ); + players->broadcastAll( shared_ptr( new UpdateProgressPacket(33 + (j*33) ) ) ); } if( !s_bServerHalted ) { @@ -1269,16 +1269,16 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) case eXuiServerAction_DropItem: // Find the player, and drop the id at their feet { - std::shared_ptr player = players->players.at(0); + shared_ptr player = players->players.at(0); size_t id = (size_t) param; - player->drop( std::shared_ptr( new ItemInstance(id, 1, 0 ) ) ); + player->drop( shared_ptr( new ItemInstance(id, 1, 0 ) ) ); } break; case eXuiServerAction_SpawnMob: { - std::shared_ptr player = players->players.at(0); + shared_ptr player = players->players.at(0); eINSTANCEOF factory = (eINSTANCEOF)((size_t)param); - std::shared_ptr mob = dynamic_pointer_cast(EntityIO::newByEnumType(factory,player->level )); + shared_ptr mob = dynamic_pointer_cast(EntityIO::newByEnumType(factory,player->level )); mob->moveTo(player->x+1, player->y, player->z+1, player->level->random->nextFloat() * 360, 0); mob->setDespawnProtected(); // 4J added, default to being protected against despawning (has to be done after initial position is set) player->level->addEntity(mob); @@ -1306,20 +1306,20 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) } break; case eXuiServerAction_ServerSettingChanged_Gamertags: - players->broadcastAll( std::shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_OPTIONS, app.GetGameHostOption(eGameHostOption_Gamertags)) ) ); + players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_OPTIONS, app.GetGameHostOption(eGameHostOption_Gamertags)) ) ); break; case eXuiServerAction_ServerSettingChanged_BedrockFog: - players->broadcastAll( std::shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, app.GetGameHostOption(eGameHostOption_All)) ) ); + players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, app.GetGameHostOption(eGameHostOption_All)) ) ); break; case eXuiServerAction_ServerSettingChanged_Difficulty: - players->broadcastAll( std::shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_DIFFICULTY, Minecraft::GetInstance()->options->difficulty) ) ); + players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_DIFFICULTY, Minecraft::GetInstance()->options->difficulty) ) ); break; case eXuiServerAction_ExportSchematic: #ifndef _CONTENT_PACKAGE app.EnterSaveNotificationSection(); - //players->broadcastAll( std::shared_ptr( new UpdateProgressPacket(20) ) ); + //players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); if( !s_bServerHalted ) { @@ -1357,7 +1357,7 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) pos->m_yRot, pos->m_elev ); - std::shared_ptr player = players->players.at(pos->player); + shared_ptr player = players->players.at(pos->player); player->debug_setPosition( pos->m_camX, pos->m_camY, pos->m_camZ, pos->m_yRot, pos->m_elev ); @@ -1414,14 +1414,14 @@ void MinecraftServer::run(int64_t seed, void *lpParameter) void MinecraftServer::broadcastStartSavingPacket() { - players->broadcastAll( std::shared_ptr( new GameEventPacket(GameEventPacket::START_SAVING, 0) ) );; + players->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::START_SAVING, 0) ) );; } void MinecraftServer::broadcastStopSavingPacket() { if( !s_bServerHalted ) { - players->broadcastAll( std::shared_ptr( new GameEventPacket(GameEventPacket::STOP_SAVING, 0) ) );; + players->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::STOP_SAVING, 0) ) );; } } @@ -1456,7 +1456,7 @@ void MinecraftServer::tick() /* if(m_lastSentDifficulty != pMinecraft->options->difficulty) { m_lastSentDifficulty = pMinecraft->options->difficulty; - players->broadcastAll( std::shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_DIFFICULTY, pMinecraft->options->difficulty) ) ); + players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_DIFFICULTY, pMinecraft->options->difficulty) ) ); }*/ for (unsigned int i = 0; i < levels.length; i++) @@ -1476,7 +1476,7 @@ void MinecraftServer::tick() if (tickCount % 20 == 0) { - players->broadcastAll( std::shared_ptr( new SetTimePacket(level->getTime() ) ), level->dimension->id); + players->broadcastAll( shared_ptr( new SetTimePacket(level->getTime() ) ), level->dimension->id); } // #ifndef __PS3__ static int64_t stc = 0; diff --git a/Minecraft.Client/Minimap.cpp b/Minecraft.Client/Minimap.cpp index 88552b01..c18cd267 100644 --- a/Minecraft.Client/Minimap.cpp +++ b/Minecraft.Client/Minimap.cpp @@ -85,7 +85,7 @@ void Minimap::reloadColours() LUT[i] = 255 << 24 | r << 16 | g << 8 | b; #elif defined __ORBIS__ r >>= 3; g >>= 3; b >>= 3; - LUT[i] = 1 << 15 | ( r << 10 ) | ( g << 5 ) | b; + LUT[i] = 1 << 15 | ( r << 10 ) | ( g << 5 ) | b; #else LUT[i] = r << 24 | g << 16 | b << 8 | 255; #endif @@ -98,7 +98,7 @@ void Minimap::reloadColours() } // 4J added entityId -void Minimap::render(std::shared_ptr player, Textures *textures, std::shared_ptr data, int entityId) +void Minimap::render(shared_ptr player, Textures *textures, shared_ptr data, int entityId) { // 4J - only update every 8 renders, as an optimisation // We don't want to use this for ItemFrame renders of maps, as then we can't have different maps together @@ -203,7 +203,7 @@ void Minimap::render(std::shared_ptr player, Textures *textures, std::sh for( AUTO_VAR(it,m_edgeIcons.begin()); it != m_edgeIcons.end(); it++ ) { MapItemSavedData::MapDecoration *dec = *it; - + char imgIndex = dec->img; imgIndex -= 16; @@ -253,7 +253,7 @@ void Minimap::render(std::shared_ptr player, Textures *textures, std::sh int posy = floor(player->y); int posz = floor(player->z); swprintf(playerPosText, 32, L"X: %d, Y: %d, Z: %d", posx, posy, posz); - + font->draw(playerPosText, x, y, Minecraft::GetInstance()->getColourTable()->getColour(eMinecraftColour_Map_Text)); } //#endif diff --git a/Minecraft.Client/Minimap.h b/Minecraft.Client/Minimap.h index 6b4776f9..758d8a8a 100644 --- a/Minecraft.Client/Minimap.h +++ b/Minecraft.Client/Minimap.h @@ -31,5 +31,5 @@ private: public: Minimap(Font *font, Options *options, Textures *textures, bool optimised = true); // 4J Added optimised param static void reloadColours(); - void render(std::shared_ptr player, Textures *textures, std::shared_ptr data, int entityId); // 4J added entityId param + void render(shared_ptr player, Textures *textures, shared_ptr data, int entityId); // 4J added entityId param }; diff --git a/Minecraft.Client/MobRenderer.cpp b/Minecraft.Client/MobRenderer.cpp index 7399f2c2..8874ab9c 100644 --- a/Minecraft.Client/MobRenderer.cpp +++ b/Minecraft.Client/MobRenderer.cpp @@ -31,11 +31,11 @@ float MobRenderer::rotlerp(float from, float to, float a) return from + a * diff; } -void MobRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void MobRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { // 4J - added - this used to use generics so the input parameter could be a mob (or derived type), but we aren't // able to do that so dynamically casting to get the more specific type here. - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); glPushMatrix(); glDisable(GL_CULL_FACE); @@ -54,7 +54,7 @@ void MobRenderer::render(std::shared_ptr _mob, double x, double y, doubl if (mob->isRiding() && dynamic_pointer_cast(mob->riding)) { - std::shared_ptr riding = dynamic_pointer_cast(mob->riding); + shared_ptr riding = dynamic_pointer_cast(mob->riding); bodyRot = rotlerp(riding->yBodyRotO, riding->yBodyRot, a); float headDiff = Mth::wrapDegrees(headRot - bodyRot); @@ -233,9 +233,9 @@ void MobRenderer::render(std::shared_ptr _mob, double x, double y, doubl MemSect(0); } -void MobRenderer::renderModel(std::shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) +void MobRenderer::renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) { - std::shared_ptr player = dynamic_pointer_cast(Minecraft::GetInstance()->player); + shared_ptr player = dynamic_pointer_cast(Minecraft::GetInstance()->player); bindTexture(mob->customTextureUrl, mob->getTexture()); if (!mob->isInvisible()) @@ -262,15 +262,15 @@ void MobRenderer::renderModel(std::shared_ptr mob, float wp, float ws, f } } -void MobRenderer::setupPosition(std::shared_ptr mob, double x, double y, double z) +void MobRenderer::setupPosition(shared_ptr mob, double x, double y, double z) { glTranslatef((float) x, (float) y, (float) z); } -void MobRenderer::setupRotations(std::shared_ptr mob, float bob, float bodyRot, float a) +void MobRenderer::setupRotations(shared_ptr mob, float bob, float bodyRot, float a) { glRotatef(180 - bodyRot, 0, 1, 0); - if (mob->deathTime > 0) + if (mob->deathTime > 0) { float fall = (mob->deathTime + a - 1) / 20.0f * 1.6f; fall = (float)sqrt(fall); @@ -279,49 +279,49 @@ void MobRenderer::setupRotations(std::shared_ptr mob, float bob, float body } } -float MobRenderer::getAttackAnim(std::shared_ptr mob, float a) +float MobRenderer::getAttackAnim(shared_ptr mob, float a) { return mob->getAttackAnim(a); } -float MobRenderer::getBob(std::shared_ptr mob, float a) +float MobRenderer::getBob(shared_ptr mob, float a) { return (mob->tickCount + a); } -void MobRenderer::additionalRendering(std::shared_ptr mob, float a) +void MobRenderer::additionalRendering(shared_ptr mob, float a) { } -int MobRenderer::prepareArmorOverlay(std::shared_ptr mob, int layer, float a) +int MobRenderer::prepareArmorOverlay(shared_ptr mob, int layer, float a) { return prepareArmor(mob, layer, a); } -int MobRenderer::prepareArmor(std::shared_ptr mob, int layer, float a) +int MobRenderer::prepareArmor(shared_ptr mob, int layer, float a) { return -1; } -void MobRenderer::prepareSecondPassArmor(std::shared_ptr mob, int layer, float a) +void MobRenderer::prepareSecondPassArmor(shared_ptr mob, int layer, float a) { } -float MobRenderer::getFlipDegrees(std::shared_ptr mob) +float MobRenderer::getFlipDegrees(shared_ptr mob) { return 90; } -int MobRenderer::getOverlayColor(std::shared_ptr mob, float br, float a) +int MobRenderer::getOverlayColor(shared_ptr mob, float br, float a) { return 0; } -void MobRenderer::scale(std::shared_ptr mob, float a) +void MobRenderer::scale(shared_ptr mob, float a) { } -void MobRenderer::renderName(std::shared_ptr mob, double x, double y, double z) +void MobRenderer::renderName(shared_ptr mob, double x, double y, double z) { if (Minecraft::renderDebug()) { @@ -330,7 +330,7 @@ void MobRenderer::renderName(std::shared_ptr mob, double x, double y, doubl } // 4J Added parameter for color here so that we can colour players names -void MobRenderer::renderNameTag(std::shared_ptr mob, const wstring& OriginalName, double x, double y, double z, int maxDist, int color /*= 0xffffffff*/) +void MobRenderer::renderNameTag(shared_ptr mob, const wstring& OriginalName, double x, double y, double z, int maxDist, int color /*= 0xffffffff*/) { if ( app.GetGameSettings(eGameSetting_DisplayHUD)==0 ) @@ -390,13 +390,13 @@ void MobRenderer::renderNameTag(std::shared_ptr mob, const wstring& Origina if( textOpacity < 0.0f ) textOpacity = 0.0f; if( textOpacity > 1.0f ) textOpacity = 1.0f; - + glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); Tesselator *t = Tesselator::getInstance(); int offs = 0; - std::shared_ptr player = dynamic_pointer_cast(mob); + shared_ptr player = dynamic_pointer_cast(mob); if (player != NULL && app.isXuidDeadmau5( player->getXuid() ) ) offs = -10; wstring playerName; @@ -415,7 +415,7 @@ void MobRenderer::renderNameTag(std::shared_ptr mob, const wstring& Origina else { memset(wchName,0,sizeof(WCHAR)*2); - swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); + swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); playerName=wchName; player->SetPlayerNameValidState(false); } @@ -425,8 +425,8 @@ void MobRenderer::renderNameTag(std::shared_ptr mob, const wstring& Origina break; case Player::ePlayerNameValid_False: memset(wchName,0,sizeof(WCHAR)*2); - swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); - playerName=wchName; + swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); + playerName=wchName; break; } @@ -459,7 +459,7 @@ void MobRenderer::renderNameTag(std::shared_ptr mob, const wstring& Origina t->vertex((float)(+w + 1), (float)( +8 + offs + 1), (float)( 0)); t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); t->end(); - + glEnable(GL_DEPTH_TEST); glDepthMask(true); glDepthFunc(GL_ALWAYS); @@ -479,7 +479,7 @@ void MobRenderer::renderNameTag(std::shared_ptr mob, const wstring& Origina glEnable(GL_TEXTURE_2D); font->draw(playerName, -font->width(playerName) / 2, offs, 0x20ffffff); glEnable(GL_DEPTH_TEST); - + glDepthMask(true); } @@ -495,10 +495,10 @@ void MobRenderer::renderNameTag(std::shared_ptr mob, const wstring& Origina t->vertex((float)(-w - 1), (float)( +8 + offs), (float)( 0)); t->vertex((float)(+w + 1), (float)( +8 + offs), (float)( 0)); t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); - t->end(); + t->end(); glDepthFunc(GL_LEQUAL); glEnable(GL_TEXTURE_2D); - + glTranslatef(0.0f, 0.0f, -0.04f); } @@ -507,7 +507,7 @@ void MobRenderer::renderNameTag(std::shared_ptr mob, const wstring& Origina int textColor = ( ( (int)(textOpacity*255) << 24 ) | 0xffffff ); font->draw(playerName, -font->width(playerName) / 2, offs, textColor); } - + glEnable(GL_LIGHTING); glDisable(GL_BLEND); glColor4f(1, 1, 1, 1); diff --git a/Minecraft.Client/MobRenderer.h b/Minecraft.Client/MobRenderer.h index 6a5df478..a8b2b93e 100644 --- a/Minecraft.Client/MobRenderer.h +++ b/Minecraft.Client/MobRenderer.h @@ -23,22 +23,22 @@ public: private: float rotlerp(float from, float to, float a); public: - virtual void render(std::shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); protected: - virtual void renderModel(std::shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); - virtual void setupPosition(std::shared_ptr mob, double x, double y, double z); - virtual void setupRotations(std::shared_ptr mob, float bob, float bodyRot, float a); - virtual float getAttackAnim(std::shared_ptr mob, float a); - virtual float getBob(std::shared_ptr mob, float a); - virtual void additionalRendering(std::shared_ptr mob, float a); - virtual int prepareArmorOverlay(std::shared_ptr mob, int layer, float a); - virtual int prepareArmor(std::shared_ptr mob, int layer, float a); - virtual void prepareSecondPassArmor(std::shared_ptr mob, int layer, float a); - virtual float getFlipDegrees(std::shared_ptr mob); - virtual int getOverlayColor(std::shared_ptr mob, float br, float a); - virtual void scale(std::shared_ptr mob, float a); - virtual void renderName(std::shared_ptr mob, double x, double y, double z); - virtual void renderNameTag(std::shared_ptr mob, const wstring& name, double x, double y, double z, int maxDist, int color = 0xff000000); + virtual void renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); + virtual void setupPosition(shared_ptr mob, double x, double y, double z); + virtual void setupRotations(shared_ptr mob, float bob, float bodyRot, float a); + virtual float getAttackAnim(shared_ptr mob, float a); + virtual float getBob(shared_ptr mob, float a); + virtual void additionalRendering(shared_ptr mob, float a); + virtual int prepareArmorOverlay(shared_ptr mob, int layer, float a); + virtual int prepareArmor(shared_ptr mob, int layer, float a); + virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); + virtual float getFlipDegrees(shared_ptr mob); + virtual int getOverlayColor(shared_ptr mob, float br, float a); + virtual void scale(shared_ptr mob, float a); + virtual void renderName(shared_ptr mob, double x, double y, double z); + virtual void renderNameTag(shared_ptr mob, const wstring& name, double x, double y, double z, int maxDist, int color = 0xff000000); public: // 4J Added diff --git a/Minecraft.Client/MobSpawnerRenderer.cpp b/Minecraft.Client/MobSpawnerRenderer.cpp index 50a8cbb2..4ee772dd 100644 --- a/Minecraft.Client/MobSpawnerRenderer.cpp +++ b/Minecraft.Client/MobSpawnerRenderer.cpp @@ -5,15 +5,15 @@ #include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" -void MobSpawnerRenderer::render(std::shared_ptr _spawner, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +void MobSpawnerRenderer::render(shared_ptr _spawner, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr spawner = dynamic_pointer_cast(_spawner); + shared_ptr spawner = dynamic_pointer_cast(_spawner); glPushMatrix(); glTranslatef((float) x + 0.5f, (float) y, (float) z + 0.5f); - std::shared_ptr e = spawner->getDisplayEntity(); + shared_ptr e = spawner->getDisplayEntity(); if (e != NULL) { e->setLevel(spawner->level); diff --git a/Minecraft.Client/MobSpawnerRenderer.h b/Minecraft.Client/MobSpawnerRenderer.h index c8b392ad..ad7dfe67 100644 --- a/Minecraft.Client/MobSpawnerRenderer.h +++ b/Minecraft.Client/MobSpawnerRenderer.h @@ -5,7 +5,7 @@ using namespace std; class MobSpawnerRenderer : public TileEntityRenderer { private: - unordered_map > models; + unordered_map > models; public: - virtual void render(std::shared_ptr _spawner, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param + virtual void render(shared_ptr _spawner, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param }; diff --git a/Minecraft.Client/Model.h b/Minecraft.Client/Model.h index e7595845..e4161d0c 100644 --- a/Minecraft.Client/Model.h +++ b/Minecraft.Client/Model.h @@ -19,9 +19,9 @@ public: int texHeight; Model(); // 4J added - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) {} + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) {} virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0) {} - virtual void prepareMobModel(std::shared_ptr mob, float time, float r, float a) {} + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a) {} virtual ModelPart *getRandomCube(Random random) {return cubes.at(random.nextInt((int)cubes.size()));} virtual ModelPart * AddOrRetrievePart(SKIN_BOX *pBox) { return NULL;} diff --git a/Minecraft.Client/MultiPlayerGameMode.cpp b/Minecraft.Client/MultiPlayerGameMode.cpp index 2f048d95..7de59803 100644 --- a/Minecraft.Client/MultiPlayerGameMode.cpp +++ b/Minecraft.Client/MultiPlayerGameMode.cpp @@ -38,7 +38,7 @@ void MultiPlayerGameMode::creativeDestroyBlock(Minecraft *minecraft, MultiPlayer } } -void MultiPlayerGameMode::adjustPlayer(std::shared_ptr player) +void MultiPlayerGameMode::adjustPlayer(shared_ptr player) { localPlayerMode->updatePlayerAbilities(&player->abilities); } @@ -54,7 +54,7 @@ void MultiPlayerGameMode::setLocalMode(GameType *mode) localPlayerMode->updatePlayerAbilities(&minecraft->player->abilities); } -void MultiPlayerGameMode::initPlayer(std::shared_ptr player) +void MultiPlayerGameMode::initPlayer(shared_ptr player) { player->yRot = -180; } @@ -87,7 +87,7 @@ bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) if (!localPlayerMode->isCreative()) { - std::shared_ptr item = minecraft->player->getSelectedItem(); + shared_ptr item = minecraft->player->getSelectedItem(); if (item != NULL) { item->mineBlock(level, oldTile->id, x, y, z, minecraft->player); @@ -102,7 +102,7 @@ bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) } void MultiPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) -{ +{ if(!minecraft->player->isAllowedToMine()) return; if (localPlayerMode->isReadOnly()) { @@ -111,13 +111,13 @@ void MultiPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) if (localPlayerMode->isCreative()) { - connection->send(std::shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) )); + connection->send(shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) )); creativeDestroyBlock(minecraft, this, x, y, z, face); destroyDelay = 5; } else if (!isDestroying || x != xDestroyBlock || y != yDestroyBlock || z != zDestroyBlock) { - connection->send( std::shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) ) ); + connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) ) ); int t = minecraft->level->getTile(x, y, z); if (t > 0 && destroyProgress == 0) Tile::tiles[t]->attack(minecraft->level, x, y, z, minecraft->player); if (t > 0 && @@ -147,7 +147,7 @@ void MultiPlayerGameMode::stopDestroyBlock() { if (isDestroying) { - connection->send(std::shared_ptr(new PlayerActionPacket(PlayerActionPacket::ABORT_DESTROY_BLOCK, xDestroyBlock, yDestroyBlock, zDestroyBlock, -1))); + connection->send(shared_ptr(new PlayerActionPacket(PlayerActionPacket::ABORT_DESTROY_BLOCK, xDestroyBlock, yDestroyBlock, zDestroyBlock, -1))); } isDestroying = false; @@ -170,7 +170,7 @@ void MultiPlayerGameMode::continueDestroyBlock(int x, int y, int z, int face) if (localPlayerMode->isCreative()) { destroyDelay = 5; - connection->send(std::shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) ) ); + connection->send(shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) ) ); creativeDestroyBlock(minecraft, this, x, y, z, face); return; } @@ -202,7 +202,7 @@ void MultiPlayerGameMode::continueDestroyBlock(int x, int y, int z, int face) if (destroyProgress >= 1) { isDestroying = false; - connection->send( std::shared_ptr( new PlayerActionPacket(PlayerActionPacket::STOP_DESTROY_BLOCK, x, y, z, face) ) ); + connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::STOP_DESTROY_BLOCK, x, y, z, face) ) ); destroyBlock(x, y, z, face); destroyProgress = 0; oDestroyProgress = 0; @@ -241,11 +241,11 @@ void MultiPlayerGameMode::ensureHasSentCarriedItem() if (newItem != carriedItem) { carriedItem = newItem; - connection->send( std::shared_ptr( new SetCarriedItemPacket(carriedItem) ) ); + connection->send( shared_ptr( new SetCarriedItemPacket(carriedItem) ) ); } } -bool MultiPlayerGameMode::useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly, bool *pbUsedItem) +bool MultiPlayerGameMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly, bool *pbUsedItem) { if( pbUsedItem ) *pbUsedItem = false; // Did we actually use the held item? @@ -259,16 +259,16 @@ bool MultiPlayerGameMode::useItemOn(std::shared_ptr player, Level *level float clickZ = (float) hit->z - z; bool didSomething = false; int t = level->getTile(x, y, z); - + if (t > 0 && player->isAllowedToUse(Tile::tiles[t])) { if(bTestUseOnly) { switch(t) { - case Tile::recordPlayer_Id: + case Tile::recordPlayer_Id: case Tile::bed_Id: // special case for a bed - if (Tile::tiles[t]->TestUse(level, x, y, z, player )) + if (Tile::tiles[t]->TestUse(level, x, y, z, player )) { return true; } @@ -283,7 +283,7 @@ bool MultiPlayerGameMode::useItemOn(std::shared_ptr player, Level *level break; } } - else + else { if (Tile::tiles[t]->use(level, x, y, z, player, face, clickX, clickY, clickZ)) didSomething = true; } @@ -321,7 +321,7 @@ bool MultiPlayerGameMode::useItemOn(std::shared_ptr player, Level *level } else { - // 4J - Bit of a hack, however seems preferable to any larger changes which would have more chance of causing unwanted side effects. + // 4J - Bit of a hack, however seems preferable to any larger changes which would have more chance of causing unwanted side effects. // If we aren't going to be actually performing the use method locally, then call this method with its "soundOnly" parameter set to true. // This is an addition from the java version, and as its name suggests, doesn't actually perform the use locally but just makes any sounds that // are meant to be directly caused by this. If we don't do this, then the sounds never happen as the tile's use method is only called on the @@ -333,17 +333,17 @@ bool MultiPlayerGameMode::useItemOn(std::shared_ptr player, Level *level } } - // 4J Stu - Do the action before we send the packet, so that our predicted count is sent in the packet and the server + // 4J Stu - Do the action before we send the packet, so that our predicted count is sent in the packet and the server // doesn't think it has to update us // Fix for #7904 - Gameplay: Players can dupe torches by throwing them repeatedly into water. if(!bTestUseOnly) { - connection->send( std::shared_ptr( new UseItemPacket(x, y, z, face, player->inventory->getSelected(), clickX, clickY, clickZ) ) ); + connection->send( shared_ptr( new UseItemPacket(x, y, z, face, player->inventory->getSelected(), clickX, clickY, clickZ) ) ); } return didSomething; } -bool MultiPlayerGameMode::useItem(std::shared_ptr player, Level *level, std::shared_ptr item, bool bTestUseOnly) +bool MultiPlayerGameMode::useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly) { if(!player->isAllowedToUse(item)) return false; @@ -353,11 +353,11 @@ bool MultiPlayerGameMode::useItem(std::shared_ptr player, Level *level, ensureHasSentCarriedItem(); } - // 4J Stu - Do the action before we send the packet, so that our predicted count is sent in the packet and the server + // 4J Stu - Do the action before we send the packet, so that our predicted count is sent in the packet and the server // doesn't think it has to update us, or can update us if we are wrong // Fix for #13120 - Using a bucket of water or lava in the spawn area (centre of the map) causes the inventory to get out of sync bool result = false; - + // 4J-PB added for tooltips to test use only if(bTestUseOnly) { @@ -366,7 +366,7 @@ bool MultiPlayerGameMode::useItem(std::shared_ptr player, Level *level, else { int oldCount = item->count; - std::shared_ptr itemInstance = item->use(level, player); + shared_ptr itemInstance = item->use(level, player); if ((itemInstance != NULL && itemInstance != item) || (itemInstance != NULL && itemInstance->count != oldCount)) { player->inventory->items[player->inventory->selected] = itemInstance; @@ -377,68 +377,68 @@ bool MultiPlayerGameMode::useItem(std::shared_ptr player, Level *level, result = true; } } - + if(!bTestUseOnly) { - connection->send( std::shared_ptr( new UseItemPacket(-1, -1, -1, 255, player->inventory->getSelected(), 0, 0, 0) ) ); + connection->send( shared_ptr( new UseItemPacket(-1, -1, -1, 255, player->inventory->getSelected(), 0, 0, 0) ) ); } return result; } -std::shared_ptr MultiPlayerGameMode::createPlayer(Level *level) +shared_ptr MultiPlayerGameMode::createPlayer(Level *level) { - return std::shared_ptr( new MultiplayerLocalPlayer(minecraft, level, minecraft->user, connection) ); + return shared_ptr( new MultiplayerLocalPlayer(minecraft, level, minecraft->user, connection) ); } -void MultiPlayerGameMode::attack(std::shared_ptr player, std::shared_ptr entity) +void MultiPlayerGameMode::attack(shared_ptr player, shared_ptr entity) { ensureHasSentCarriedItem(); - connection->send( std::shared_ptr( new InteractPacket(player->entityId, entity->entityId, InteractPacket::ATTACK) ) ); + connection->send( shared_ptr( new InteractPacket(player->entityId, entity->entityId, InteractPacket::ATTACK) ) ); player->attack(entity); } -bool MultiPlayerGameMode::interact(std::shared_ptr player, std::shared_ptr entity) +bool MultiPlayerGameMode::interact(shared_ptr player, shared_ptr entity) { ensureHasSentCarriedItem(); - connection->send(std::shared_ptr( new InteractPacket(player->entityId, entity->entityId, InteractPacket::INTERACT) ) ); + connection->send(shared_ptr( new InteractPacket(player->entityId, entity->entityId, InteractPacket::INTERACT) ) ); return player->interact(entity); } -std::shared_ptr MultiPlayerGameMode::handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, std::shared_ptr player) +shared_ptr MultiPlayerGameMode::handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player) { short changeUid = player->containerMenu->backup(player->inventory); - std::shared_ptr clicked = player->containerMenu->clicked(slotNum, buttonNum, quickKeyHeld?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, player); - connection->send( std::shared_ptr( new ContainerClickPacket(containerId, slotNum, buttonNum, quickKeyHeld, clicked, changeUid) ) ); + shared_ptr clicked = player->containerMenu->clicked(slotNum, buttonNum, quickKeyHeld?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, player); + connection->send( shared_ptr( new ContainerClickPacket(containerId, slotNum, buttonNum, quickKeyHeld, clicked, changeUid) ) ); return clicked; } void MultiPlayerGameMode::handleInventoryButtonClick(int containerId, int buttonId) { - connection->send(std::shared_ptr( new ContainerButtonClickPacket(containerId, buttonId) )); + connection->send(shared_ptr( new ContainerButtonClickPacket(containerId, buttonId) )); } -void MultiPlayerGameMode::handleCreativeModeItemAdd(std::shared_ptr clicked, int slot) +void MultiPlayerGameMode::handleCreativeModeItemAdd(shared_ptr clicked, int slot) { if (localPlayerMode->isCreative()) { - connection->send(std::shared_ptr( new SetCreativeModeSlotPacket(slot, clicked) ) ); + connection->send(shared_ptr( new SetCreativeModeSlotPacket(slot, clicked) ) ); } } -void MultiPlayerGameMode::handleCreativeModeItemDrop(std::shared_ptr clicked) +void MultiPlayerGameMode::handleCreativeModeItemDrop(shared_ptr clicked) { if (localPlayerMode->isCreative() && clicked != NULL) { - connection->send(std::shared_ptr( new SetCreativeModeSlotPacket(-1, clicked) ) ); + connection->send(shared_ptr( new SetCreativeModeSlotPacket(-1, clicked) ) ); } } -void MultiPlayerGameMode::releaseUsingItem(std::shared_ptr player) +void MultiPlayerGameMode::releaseUsingItem(shared_ptr player) { ensureHasSentCarriedItem(); - connection->send(std::shared_ptr( new PlayerActionPacket(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 255) ) ); + connection->send(shared_ptr( new PlayerActionPacket(PlayerActionPacket::RELEASE_USE_ITEM, 0, 0, 0, 255) ) ); player->releaseUsingItem(); } @@ -462,17 +462,17 @@ bool MultiPlayerGameMode::hasFarPickRange() return localPlayerMode->isCreative(); } -bool MultiPlayerGameMode::handleCraftItem(int recipe, std::shared_ptr player) +bool MultiPlayerGameMode::handleCraftItem(int recipe, shared_ptr player) { short changeUid = player->containerMenu->backup(player->inventory); - connection->send( std::shared_ptr( new CraftItemPacket(recipe, changeUid) ) ); + connection->send( shared_ptr( new CraftItemPacket(recipe, changeUid) ) ); return true; } -void MultiPlayerGameMode::handleDebugOptions(unsigned int uiVal, std::shared_ptr player) +void MultiPlayerGameMode::handleDebugOptions(unsigned int uiVal, shared_ptr player) { player->SetDebugOptions(uiVal); - connection->send( std::shared_ptr( new DebugOptionsPacket(uiVal) ) ); + connection->send( shared_ptr( new DebugOptionsPacket(uiVal) ) ); } diff --git a/Minecraft.Client/MultiPlayerGameMode.h b/Minecraft.Client/MultiPlayerGameMode.h index 8fc88df8..c84410fa 100644 --- a/Minecraft.Client/MultiPlayerGameMode.h +++ b/Minecraft.Client/MultiPlayerGameMode.h @@ -24,10 +24,10 @@ protected: public: MultiPlayerGameMode(Minecraft *minecraft, ClientConnection *connection); static void creativeDestroyBlock(Minecraft *minecraft, MultiPlayerGameMode *gameMode, int x, int y, int z, int face); - void adjustPlayer(std::shared_ptr player); + void adjustPlayer(shared_ptr player); bool isCutScene(); void setLocalMode(GameType *mode); - virtual void initPlayer(std::shared_ptr player); + virtual void initPlayer(shared_ptr player); virtual bool canHurtPlayer(); virtual bool destroyBlock(int x, int y, int z, int face); virtual void startDestroyBlock(int x, int y, int z, int face); @@ -41,24 +41,24 @@ private: private: void ensureHasSentCarriedItem(); public: - virtual bool useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly=false, bool *pbUsedItem=NULL); - virtual bool useItem(std::shared_ptr player, Level *level, std::shared_ptr item, bool bTestUseOnly=false); - virtual std::shared_ptr createPlayer(Level *level); - virtual void attack(std::shared_ptr player, std::shared_ptr entity); - virtual bool interact(std::shared_ptr player, std::shared_ptr entity); - virtual std::shared_ptr handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, std::shared_ptr player); + 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 bool useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly=false); + virtual shared_ptr createPlayer(Level *level); + virtual void attack(shared_ptr player, shared_ptr entity); + virtual bool interact(shared_ptr player, shared_ptr entity); + virtual shared_ptr handleInventoryMouseClick(int containerId, int slotNum, int buttonNum, bool quickKeyHeld, shared_ptr player); virtual void handleInventoryButtonClick(int containerId, int buttonId); - virtual void handleCreativeModeItemAdd(std::shared_ptr clicked, int slot); - virtual void handleCreativeModeItemDrop(std::shared_ptr clicked); - virtual void releaseUsingItem(std::shared_ptr player); + virtual void handleCreativeModeItemAdd(shared_ptr clicked, int slot); + virtual void handleCreativeModeItemDrop(shared_ptr clicked); + virtual void releaseUsingItem(shared_ptr player); virtual bool hasExperience(); virtual bool hasMissTime(); virtual bool hasInfiniteItems(); virtual bool hasFarPickRange(); - + // 4J Stu - Added so we can send packets for this in the network game - virtual bool handleCraftItem(int recipe, std::shared_ptr player); - virtual void handleDebugOptions(unsigned int uiVal, std::shared_ptr player); + virtual bool handleCraftItem(int recipe, shared_ptr player); + virtual void handleDebugOptions(unsigned int uiVal, shared_ptr player); // 4J Stu - Added for tutorial checks virtual bool isInputAllowed(int mapping) { return true; } diff --git a/Minecraft.Client/MultiPlayerLevel.cpp b/Minecraft.Client/MultiPlayerLevel.cpp index 16594955..24b12bcd 100644 --- a/Minecraft.Client/MultiPlayerLevel.cpp +++ b/Minecraft.Client/MultiPlayerLevel.cpp @@ -24,7 +24,7 @@ MultiPlayerLevel::ResetInfo::ResetInfo(int x, int y, int z, int tile, int data) } MultiPlayerLevel::MultiPlayerLevel(ClientConnection *connection, LevelSettings *levelSettings, int dimension, int difficulty) - : Level(std::shared_ptr(new MockedLevelStorage()), L"MpServer", Dimension::getNew(dimension), levelSettings, false) + : Level(shared_ptr(new MockedLevelStorage()), L"MpServer", Dimension::getNew(dimension), levelSettings, false) { minecraft = Minecraft::GetInstance(); @@ -108,7 +108,7 @@ void MultiPlayerLevel::tick() EnterCriticalSection(&m_entitiesCS); for (int i = 0; i < 10 && !reEntries.empty(); i++) { - std::shared_ptr e = *(reEntries.begin()); + shared_ptr e = *(reEntries.begin()); if (find(entities.begin(), entities.end(), e) == entities.end() ) addEntity(e); } @@ -134,7 +134,7 @@ void MultiPlayerLevel::tick() { Level::setTileAndDataNoUpdate(r.x, r.y, r.z, r.tile, r.data); Level::sendTileUpdated(r.x, r.y, r.z); - + //updatesToReset.erase(updatesToReset.begin()+i); eraseElements = true; lastIndexToRemove = 0; @@ -156,7 +156,7 @@ void MultiPlayerLevel::tick() // 4J - added this section. Each tick we'll check a different block, and force it to share data if it has been // more than 2 minutes since we last wanted to unshare it. This shouldn't really ever happen, and is added // here as a safe guard against accumulated memory leaks should a lot of chunks become unshared over time. - + int ls = dimension->getXZSize(); if( g_NetworkManager.IsHost() ) { @@ -403,7 +403,7 @@ void MultiPlayerLevel::setChunkVisible(int x, int z, bool visible) } -bool MultiPlayerLevel::addEntity(std::shared_ptr e) +bool MultiPlayerLevel::addEntity(shared_ptr e) { bool ok = Level::addEntity(e); forced.insert(e); @@ -416,7 +416,7 @@ bool MultiPlayerLevel::addEntity(std::shared_ptr e) return ok; } -void MultiPlayerLevel::removeEntity(std::shared_ptr e) +void MultiPlayerLevel::removeEntity(shared_ptr e) { // 4J Stu - Add this remove from the reEntries collection to stop us continually removing and re-adding things, // in particular the MultiPlayerLocalPlayer when they die @@ -430,7 +430,7 @@ void MultiPlayerLevel::removeEntity(std::shared_ptr e) forced.erase(e); } -void MultiPlayerLevel::entityAdded(std::shared_ptr e) +void MultiPlayerLevel::entityAdded(shared_ptr e) { Level::entityAdded(e); AUTO_VAR(it, reEntries.find(e)); @@ -440,7 +440,7 @@ void MultiPlayerLevel::entityAdded(std::shared_ptr e) } } -void MultiPlayerLevel::entityRemoved(std::shared_ptr e) +void MultiPlayerLevel::entityRemoved(shared_ptr e) { Level::entityRemoved(e); AUTO_VAR(it, forced.find(e)); @@ -450,9 +450,9 @@ void MultiPlayerLevel::entityRemoved(std::shared_ptr e) } } -void MultiPlayerLevel::putEntity(int id, std::shared_ptr e) +void MultiPlayerLevel::putEntity(int id, shared_ptr e) { - std::shared_ptr old = getEntity(id); + shared_ptr old = getEntity(id); if (old != NULL) { removeEntity(old); @@ -467,16 +467,16 @@ void MultiPlayerLevel::putEntity(int id, std::shared_ptr e) entitiesById[id] = e; } -std::shared_ptr MultiPlayerLevel::getEntity(int id) +shared_ptr MultiPlayerLevel::getEntity(int id) { AUTO_VAR(it, entitiesById.find(id)); if( it == entitiesById.end() ) return nullptr; return it->second; } -std::shared_ptr MultiPlayerLevel::removeEntity(int id) +shared_ptr MultiPlayerLevel::removeEntity(int id) { - std::shared_ptr e; + shared_ptr e; AUTO_VAR(it, entitiesById.find(id)); if( it != entitiesById.end() ) { @@ -493,11 +493,11 @@ std::shared_ptr MultiPlayerLevel::removeEntity(int id) // 4J Added to remove the entities from the forced list // This gets called when a chunk is unloaded, but we only do half an unload to remove entities slightly differently -void MultiPlayerLevel::removeEntities(vector > *list) +void MultiPlayerLevel::removeEntities(vector > *list) { for(AUTO_VAR(it, list->begin()); it < list->end(); ++it) { - std::shared_ptr e = *it; + shared_ptr e = *it; AUTO_VAR(reIt, reEntries.find(e)); if (reIt!=reEntries.end()) @@ -582,7 +582,7 @@ bool MultiPlayerLevel::doSetTileAndData(int x, int y, int z, int tile, int data) // and so the thing being notified of any update through tileUpdated is the renderer int prevTile = getTile(x, y, z); bool visuallyImportant = (!( ( ( prevTile == Tile::water_Id ) && ( tile == Tile::calmWater_Id ) ) || - ( ( prevTile == Tile::calmWater_Id ) && ( tile == Tile::water_Id ) ) || + ( ( prevTile == Tile::calmWater_Id ) && ( tile == Tile::water_Id ) ) || ( ( prevTile == Tile::lava_Id ) && ( tile == Tile::calmLava_Id ) ) || ( ( prevTile == Tile::calmLava_Id ) && ( tile == Tile::calmLava_Id ) ) || ( ( prevTile == Tile::calmLava_Id ) && ( tile == Tile::lava_Id ) ) ) ); @@ -609,7 +609,7 @@ void MultiPlayerLevel::disconnect(bool sendDisconnect /*= true*/) { for(AUTO_VAR(it, connections.begin()); it < connections.end(); ++it ) { - (*it)->sendAndDisconnect( std::shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) ); + (*it)->sendAndDisconnect( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) ); } } else @@ -687,7 +687,7 @@ void MultiPlayerLevel::animateTick(int xt, int yt, int zt) void MultiPlayerLevel::animateTickDoWork() { const int ticksPerChunk = 16; // This ought to give us roughly the same 1000/32768 chance of a tile being animated as the original - + // Horrible hack to communicate with the level renderer, which is just attached as a listener to this level. This let's the particle // rendering know to use this level (rather than try to work it out from the current player), and to not bother distance clipping particles // which would again be based on the current player. @@ -730,7 +730,7 @@ void MultiPlayerLevel::animateTickDoWork() } -void MultiPlayerLevel::playSound(std::shared_ptr entity, int iSound, float volume, float pitch) +void MultiPlayerLevel::playSound(shared_ptr entity, int iSound, float volume, float pitch) { playLocalSound(entity->x, entity->y - entity->heightOffset, entity->z, iSound, volume, pitch); } @@ -790,7 +790,7 @@ void MultiPlayerLevel::removeAllPendingEntityRemovals() AUTO_VAR(endIt, entitiesToRemove.end()); for (AUTO_VAR(it, entitiesToRemove.begin()); it != endIt; it++) { - std::shared_ptr e = *it; + shared_ptr e = *it; int xc = e->xChunk; int zc = e->zChunk; if (e->inChunk && hasChunk(xc, zc)) @@ -809,10 +809,10 @@ void MultiPlayerLevel::removeAllPendingEntityRemovals() //for (int i = 0; i < entities.size(); i++) EnterCriticalSection(&m_entitiesCS); - vector >::iterator it = entities.begin(); + vector >::iterator it = entities.begin(); while( it != entities.end() ) { - std::shared_ptr e = *it;//entities.at(i); + shared_ptr e = *it;//entities.at(i); if (e->riding != NULL) { @@ -821,7 +821,7 @@ void MultiPlayerLevel::removeAllPendingEntityRemovals() e->riding->rider = weak_ptr(); e->riding = nullptr; } - else + else { ++it; continue; @@ -853,7 +853,7 @@ void MultiPlayerLevel::removeClientConnection(ClientConnection *c, bool sendDisc { if( sendDisconnect ) { - c->sendAndDisconnect( std::shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) ); + c->sendAndDisconnect( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) ); } AUTO_VAR(it, find( connections.begin(), connections.end(), c )); @@ -886,7 +886,7 @@ void MultiPlayerLevel::removeUnusedTileEntitiesInRegion(int x0, int y0, int z0, for (unsigned int i = 0; i < tileEntityList.size();) { bool removed = false; - std::shared_ptr te = tileEntityList[i]; + shared_ptr te = tileEntityList[i]; if (te->x >= x0 && te->y >= y0 && te->z >= z0 && te->x < x1 && te->y < y1 && te->z < z1) { LevelChunk *lc = getChunk(te->x >> 4, te->z >> 4); diff --git a/Minecraft.Client/MultiPlayerLevel.h b/Minecraft.Client/MultiPlayerLevel.h index e075cb8d..c07b5583 100644 --- a/Minecraft.Client/MultiPlayerLevel.h +++ b/Minecraft.Client/MultiPlayerLevel.h @@ -54,21 +54,21 @@ public: void setChunkVisible(int x, int z, bool visible); private: - unordered_map, IntKeyHash2, IntKeyEq> entitiesById; // 4J - was IntHashMap - unordered_set > forced; - unordered_set > reEntries; + unordered_map, IntKeyHash2, IntKeyEq> entitiesById; // 4J - was IntHashMap + unordered_set > forced; + unordered_set > reEntries; public: - virtual bool addEntity(std::shared_ptr e); - virtual void removeEntity(std::shared_ptr e); + virtual bool addEntity(shared_ptr e); + virtual void removeEntity(shared_ptr e); protected: - virtual void entityAdded(std::shared_ptr e); - virtual void entityRemoved(std::shared_ptr e); + virtual void entityAdded(shared_ptr e); + virtual void entityRemoved(shared_ptr e); public: - void putEntity(int id, std::shared_ptr e); - std::shared_ptr getEntity(int id); - std::shared_ptr removeEntity(int id); - virtual void removeEntities(vector > *list); // 4J Added override + void putEntity(int id, shared_ptr e); + shared_ptr getEntity(int id); + shared_ptr removeEntity(int id); + virtual void removeEntities(vector > *list); // 4J Added override virtual bool setDataNoUpdate(int x, int y, int z, int data); virtual bool setTileAndDataNoUpdate(int x, int y, int z, int tile, int data); virtual bool setTileNoUpdate(int x, int y, int z, int tile); @@ -77,7 +77,7 @@ public: void animateTick(int xt, int yt, int zt); protected: virtual void tickWeather(); - + static const int ANIMATE_TICK_MAX_PARTICLES = 500; public: @@ -87,7 +87,7 @@ public: public: void removeAllPendingEntityRemovals(); - virtual void playSound(std::shared_ptr entity, int iSound, float volume, float pitch); + virtual void playSound(shared_ptr entity, int iSound, float volume, float pitch); virtual void playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist=16.0f); diff --git a/Minecraft.Client/MultiPlayerLocalPlayer.cpp b/Minecraft.Client/MultiPlayerLocalPlayer.cpp index 29d1caa8..bb2630e5 100644 --- a/Minecraft.Client/MultiPlayerLocalPlayer.cpp +++ b/Minecraft.Client/MultiPlayerLocalPlayer.cpp @@ -49,18 +49,18 @@ void MultiplayerLocalPlayer::tick() /*if((app.GetGameSettings(m_iPad,eGameSetting_PlayerVisibleInMap)!=0) != m_bShownOnMaps) { m_bShownOnMaps = (app.GetGameSettings(m_iPad,eGameSetting_PlayerVisibleInMap)!=0); - if (m_bShownOnMaps) connection->send( std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::SHOW_ON_MAPS) ) ); - else connection->send( std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::HIDE_ON_MAPS) ) ); + if (m_bShownOnMaps) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::SHOW_ON_MAPS) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::HIDE_ON_MAPS) ) ); }*/ if (!level->hasChunkAt(Mth::floor(x), 0, Mth::floor(z))) return; double tempX = x, tempY = y, tempZ = z; LocalPlayer::tick(); - + //if( !minecraft->localgameModes[m_iPad]->isTutorial() || minecraft->localgameModes[m_iPad]->getTutorial()->canMoveToPosition(tempX, tempY, tempZ, x, y, z) ) if(minecraft->localgameModes[m_iPad]->getTutorial()->canMoveToPosition(tempX, tempY, tempZ, x, y, z)) - { + { sendPosition(); } else @@ -75,8 +75,8 @@ void MultiplayerLocalPlayer::sendPosition() bool sprinting = isSprinting(); if (sprinting != lastSprinting) { - if (sprinting) connection->send(std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_SPRINTING))); - else connection->send(std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SPRINTING))); + if (sprinting) connection->send(shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_SPRINTING))); + else connection->send(shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SPRINTING))); lastSprinting = sprinting; } @@ -84,8 +84,8 @@ void MultiplayerLocalPlayer::sendPosition() bool sneaking = isSneaking(); if (sneaking != lastSneaked) { - if (sneaking) connection->send( std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_SNEAKING) ) ); - else connection->send( std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SNEAKING) ) ); + if (sneaking) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_SNEAKING) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SNEAKING) ) ); lastSneaked = sneaking; } @@ -93,8 +93,8 @@ void MultiplayerLocalPlayer::sendPosition() bool idle = isIdle(); if (idle != lastIdle) { - if (idle) connection->send( std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_IDLEANIM) ) ); - else connection->send( std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_IDLEANIM) ) ); + if (idle) connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::START_IDLEANIM) ) ); + else connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_IDLEANIM) ) ); lastIdle = idle; } @@ -110,26 +110,26 @@ void MultiplayerLocalPlayer::sendPosition() bool rot = rydd != 0 || rxdd != 0; if (riding != NULL) { - connection->send( std::shared_ptr( new MovePlayerPacket::PosRot(xd, -999, -999, zd, yRot, xRot, onGround, abilities.flying) ) ); + connection->send( shared_ptr( new MovePlayerPacket::PosRot(xd, -999, -999, zd, yRot, xRot, onGround, abilities.flying) ) ); move = false; } else { if (move && rot) { - connection->send( std::shared_ptr( new MovePlayerPacket::PosRot(x, bb->y0, y, z, yRot, xRot, onGround, abilities.flying) ) ); + connection->send( shared_ptr( new MovePlayerPacket::PosRot(x, bb->y0, y, z, yRot, xRot, onGround, abilities.flying) ) ); } else if (move) { - connection->send( std::shared_ptr( new MovePlayerPacket::Pos(x, bb->y0, y, z, onGround, abilities.flying) ) ); + connection->send( shared_ptr( new MovePlayerPacket::Pos(x, bb->y0, y, z, onGround, abilities.flying) ) ); } else if (rot) { - connection->send( std::shared_ptr( new MovePlayerPacket::Rot(yRot, xRot, onGround, abilities.flying) ) ); + connection->send( shared_ptr( new MovePlayerPacket::Rot(yRot, xRot, onGround, abilities.flying) ) ); } else { - connection->send( std::shared_ptr( new MovePlayerPacket(onGround, abilities.flying) ) ); + connection->send( shared_ptr( new MovePlayerPacket(onGround, abilities.flying) ) ); } } @@ -152,31 +152,31 @@ void MultiplayerLocalPlayer::sendPosition() } -std::shared_ptr MultiplayerLocalPlayer::drop() +shared_ptr MultiplayerLocalPlayer::drop() { - connection->send( std::shared_ptr( new PlayerActionPacket(PlayerActionPacket::DROP_ITEM, 0, 0, 0, 0) ) ); + connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::DROP_ITEM, 0, 0, 0, 0) ) ); return nullptr; } -void MultiplayerLocalPlayer::reallyDrop(std::shared_ptr itemEntity) +void MultiplayerLocalPlayer::reallyDrop(shared_ptr itemEntity) { } void MultiplayerLocalPlayer::chat(const wstring& message) { - connection->send( std::shared_ptr( new ChatPacket(message) ) ); + connection->send( shared_ptr( new ChatPacket(message) ) ); } void MultiplayerLocalPlayer::swing() { LocalPlayer::swing(); - connection->send( std::shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::SWING) ) ); + connection->send( shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::SWING) ) ); } void MultiplayerLocalPlayer::respawn() { - connection->send( std::shared_ptr( new ClientCommandPacket(ClientCommandPacket::PERFORM_RESPAWN))); + connection->send( shared_ptr( new ClientCommandPacket(ClientCommandPacket::PERFORM_RESPAWN))); } @@ -238,7 +238,7 @@ void MultiplayerLocalPlayer::onEffectRemoved(MobEffectInstance *effect) void MultiplayerLocalPlayer::closeContainer() { - connection->send( std::shared_ptr( new ContainerClosePacket(containerMenu->containerId) ) ); + connection->send( shared_ptr( new ContainerClosePacket(containerMenu->containerId) ) ); inventory->setCarried(nullptr); LocalPlayer::closeContainer(); } @@ -286,7 +286,7 @@ void MultiplayerLocalPlayer::awardStatFromServer(Stat *stat, byteArray param) void MultiplayerLocalPlayer::onUpdateAbilities() { - connection->send(std::shared_ptr(new PlayerAbilitiesPacket(&abilities))); + connection->send(shared_ptr(new PlayerAbilitiesPacket(&abilities))); } bool MultiplayerLocalPlayer::isLocalPlayer() @@ -294,7 +294,7 @@ bool MultiplayerLocalPlayer::isLocalPlayer() return true; } -void MultiplayerLocalPlayer::ride(std::shared_ptr e) +void MultiplayerLocalPlayer::ride(shared_ptr e) { bool wasRiding = riding != NULL; LocalPlayer::ride(e); @@ -324,7 +324,7 @@ void MultiplayerLocalPlayer::ride(std::shared_ptr e) updateRichPresence(); Minecraft *pMinecraft = Minecraft::GetInstance(); - + if( pMinecraft->localgameModes[m_iPad] != NULL ) { TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; @@ -344,7 +344,7 @@ void MultiplayerLocalPlayer::ride(std::shared_ptr e) void MultiplayerLocalPlayer::StopSleeping() { - connection->send( std::shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SLEEPING) ) ); + connection->send( shared_ptr( new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::STOP_SLEEPING) ) ); } // 4J Added @@ -355,7 +355,7 @@ void MultiplayerLocalPlayer::setAndBroadcastCustomSkin(DWORD skinId) #ifndef _CONTENT_PACKAGE wprintf(L"Skin for local player %ls has changed to %ls (%d)\n", name.c_str(), customTextureUrl.c_str(), getPlayerDefaultSkin() ); #endif - if(getCustomSkin() != oldSkinIndex) connection->send( std::shared_ptr( new TextureAndGeometryChangePacket( shared_from_this(), app.GetPlayerSkinName(GetXboxPad()) ) ) ); + if(getCustomSkin() != oldSkinIndex) connection->send( shared_ptr( new TextureAndGeometryChangePacket( shared_from_this(), app.GetPlayerSkinName(GetXboxPad()) ) ) ); } void MultiplayerLocalPlayer::setAndBroadcastCustomCape(DWORD capeId) @@ -365,5 +365,5 @@ void MultiplayerLocalPlayer::setAndBroadcastCustomCape(DWORD capeId) #ifndef _CONTENT_PACKAGE wprintf(L"Cape for local player %ls has changed to %ls\n", name.c_str(), customTextureUrl2.c_str()); #endif - if(getCustomCape() != oldCapeIndex) connection->send( std::shared_ptr( new TextureChangePacket( shared_from_this(), TextureChangePacket::e_TextureChange_Cape, app.GetPlayerCapeName(GetXboxPad()) ) ) ); + if(getCustomCape() != oldCapeIndex) connection->send( shared_ptr( new TextureChangePacket( shared_from_this(), TextureChangePacket::e_TextureChange_Cape, app.GetPlayerCapeName(GetXboxPad()) ) ) ); } diff --git a/Minecraft.Client/MultiPlayerLocalPlayer.h b/Minecraft.Client/MultiPlayerLocalPlayer.h index 24244564..8687b36a 100644 --- a/Minecraft.Client/MultiPlayerLocalPlayer.h +++ b/Minecraft.Client/MultiPlayerLocalPlayer.h @@ -33,9 +33,9 @@ public: void sendPosition(); using Player::drop; - virtual std::shared_ptr drop(); + virtual shared_ptr drop(); protected: - virtual void reallyDrop(std::shared_ptr itemEntity); + virtual void reallyDrop(shared_ptr itemEntity); public: virtual void chat(const wstring& message); virtual void swing(); @@ -62,7 +62,7 @@ public: //void CustomSkin(PBYTE pbData, DWORD dwBytes); // 4J Overriding this so we can flag an event for the tutorial - virtual void ride(std::shared_ptr e); + virtual void ride(shared_ptr e); // 4J - added for the Stop Sleeping virtual void StopSleeping(); diff --git a/Minecraft.Client/MushroomCowRenderer.cpp b/Minecraft.Client/MushroomCowRenderer.cpp index b34ffaf1..688fab5c 100644 --- a/Minecraft.Client/MushroomCowRenderer.cpp +++ b/Minecraft.Client/MushroomCowRenderer.cpp @@ -9,21 +9,21 @@ MushroomCowRenderer::MushroomCowRenderer(Model *model, float shadow) : MobRender { } -void MushroomCowRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void MushroomCowRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { - // 4J - original version used generics and thus had an input parameter of type MushroomCow rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type MushroomCow rather than shared_ptr we have here - // do some casting around instead - //std::shared_ptr mob = dynamic_pointer_cast(_mob); + //shared_ptr mob = dynamic_pointer_cast(_mob); // 4J Stu - No need to do the cast, just pass through as-is MobRenderer::render(_mob, x, y, z, rot, a); } -void MushroomCowRenderer::additionalRendering(std::shared_ptr _mob, float a) +void MushroomCowRenderer::additionalRendering(shared_ptr _mob, float a) { - // 4J - original version used generics and thus had an input parameter of type MushroomCow rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type MushroomCow rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); MobRenderer::additionalRendering(mob, a); if (mob->isBaby()) return; bindTexture(TN_TERRAIN); // 4J was "/terrain.png" diff --git a/Minecraft.Client/MushroomCowRenderer.h b/Minecraft.Client/MushroomCowRenderer.h index 8d01ea81..c5f6f3c4 100644 --- a/Minecraft.Client/MushroomCowRenderer.h +++ b/Minecraft.Client/MushroomCowRenderer.h @@ -7,8 +7,8 @@ class MushroomCowRenderer : public MobRenderer public: MushroomCowRenderer(Model *model, float shadow); - virtual void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - virtual void additionalRendering(std::shared_ptr _mob, float a); + virtual void additionalRendering(shared_ptr _mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/OzelotModel.cpp b/Minecraft.Client/OzelotModel.cpp index b0557012..9c22cc4b 100644 --- a/Minecraft.Client/OzelotModel.cpp +++ b/Minecraft.Client/OzelotModel.cpp @@ -78,7 +78,7 @@ OzelotModel::OzelotModel() backLegR->compile(1.0f/16.0f); } -void OzelotModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void OzelotModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); if (young) @@ -180,9 +180,9 @@ void OzelotModel::setupAnim(float time, float r, float bob, float yRot, float xR } } -void OzelotModel::prepareMobModel(std::shared_ptr mob, float time, float r, float a) +void OzelotModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { - std::shared_ptr ozelot = dynamic_pointer_cast(mob); + shared_ptr ozelot = dynamic_pointer_cast(mob); body->y = bodyWalkY; body->z = bodyWalkZ; diff --git a/Minecraft.Client/OzelotModel.h b/Minecraft.Client/OzelotModel.h index cdccc8fe..2c08f3df 100644 --- a/Minecraft.Client/OzelotModel.h +++ b/Minecraft.Client/OzelotModel.h @@ -36,8 +36,8 @@ private: public: OzelotModel(); - void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); void render(OzelotModel *model, float scale, bool usecompiled); void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); - void prepareMobModel(std::shared_ptr mob, float time, float r, float a); + void prepareMobModel(shared_ptr mob, float time, float r, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/OzelotRenderer.cpp b/Minecraft.Client/OzelotRenderer.cpp index 54c50d69..d56b35f9 100644 --- a/Minecraft.Client/OzelotRenderer.cpp +++ b/Minecraft.Client/OzelotRenderer.cpp @@ -6,16 +6,16 @@ OzelotRenderer::OzelotRenderer(Model *model, float shadow) : MobRenderer(model, { } -void OzelotRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void OzelotRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { MobRenderer::render(_mob, x, y, z, rot, a); } -void OzelotRenderer::scale(std::shared_ptr _mob, float a) +void OzelotRenderer::scale(shared_ptr _mob, float a) { - // 4J - original version used generics and thus had an input parameter of type Blaze rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); MobRenderer::scale(mob, a); if (mob->isTame()) { diff --git a/Minecraft.Client/OzelotRenderer.h b/Minecraft.Client/OzelotRenderer.h index a9fc1223..9627b4f1 100644 --- a/Minecraft.Client/OzelotRenderer.h +++ b/Minecraft.Client/OzelotRenderer.h @@ -7,8 +7,8 @@ class OzelotRenderer : public MobRenderer public: OzelotRenderer(Model *model, float shadow); - void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - void scale(std::shared_ptr _mob, float a); + void scale(shared_ptr _mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/PS3/PS3Extras/Ps3Types.h b/Minecraft.Client/PS3/PS3Extras/Ps3Types.h index 6cacd7a0..ade37607 100644 --- a/Minecraft.Client/PS3/PS3Extras/Ps3Types.h +++ b/Minecraft.Client/PS3/PS3Extras/Ps3Types.h @@ -25,7 +25,7 @@ using std::tr1::const_pointer_cast; using std::tr1::dynamic_pointer_cast; using std::tr1::enable_shared_from_this; using std::tr1::get_deleter; -using std::tr1::std::shared_ptr; +using std::tr1::shared_ptr; using std::tr1::static_pointer_cast; using std::tr1::swap; using std::tr1::weak_ptr; @@ -62,7 +62,7 @@ using boost::hash; class Cnullptr{ public: template - operator std::shared_ptr() { return std::shared_ptr(); } + operator shared_ptr() { return shared_ptr(); } }; extern Cnullptr nullptr; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/binary_iarchive.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/binary_iarchive.hpp index 9d786645..638d9967 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/binary_iarchive.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/binary_iarchive.hpp @@ -9,7 +9,7 @@ /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // binary_iarchive.hpp -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . +// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) @@ -25,7 +25,7 @@ # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { // do not derive from the classes below. If you want to extend this functionality @@ -33,10 +33,10 @@ namespace archive { // preserve correct static polymorphism. // same as binary_iarchive below - without the shared_ptr_helper -class naked_binary_iarchive : +class naked_binary_iarchive : public binary_iarchive_impl< - boost::archive::naked_binary_iarchive, - std::istream::char_type, + boost::archive::naked_binary_iarchive, + std::istream::char_type, std::istream::traits_type > { @@ -56,22 +56,22 @@ public: } // namespace archive } // namespace boost -// note special treatment of std::shared_ptr. This type needs a special +// note special treatment of shared_ptr. This type needs a special // structure associated with every archive. We created a "mix-in" -// class to provide this functionality. Since std::shared_ptr holds a +// class to provide this functionality. Since shared_ptr holds a // special esteem in the boost library - we included it here by default. #include -namespace boost { +namespace boost { namespace archive { // do not derive from this class. If you want to extend this functionality // via inhertance, derived from binary_iarchive_impl instead. This will // preserve correct static polymorphism. -class binary_iarchive : +class binary_iarchive : public binary_iarchive_impl< - boost::archive::binary_iarchive, - std::istream::char_type, + boost::archive::binary_iarchive, + std::istream::char_type, std::istream::traits_type >, public detail::shared_ptr_helper diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/binary_wiarchive.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/binary_wiarchive.hpp index 81f67c04..b5f6a710 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/binary_wiarchive.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/binary_wiarchive.hpp @@ -9,7 +9,7 @@ /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // binary_wiarchive.hpp -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . +// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) @@ -25,29 +25,29 @@ #include #include -namespace boost { +namespace boost { namespace archive { // same as binary_wiarchive below - without the shared_ptr_helper -class naked_binary_wiarchive : +class naked_binary_wiarchive : public binary_iarchive_impl< - boost::archive::naked_binary_wiarchive, - std::wistream::char_type, + boost::archive::naked_binary_wiarchive, + std::wistream::char_type, std::wistream::traits_type > { public: naked_binary_wiarchive(std::wistream & is, unsigned int flags = 0) : binary_iarchive_impl< - naked_binary_wiarchive, - std::wistream::char_type, + naked_binary_wiarchive, + std::wistream::char_type, std::wistream::traits_type >(is, flags) {} naked_binary_wiarchive(std::wstreambuf & bsb, unsigned int flags = 0) : binary_iarchive_impl< - naked_binary_wiarchive, - std::wistream::char_type, + naked_binary_wiarchive, + std::wistream::char_type, std::wistream::traits_type >(bsb, flags) {} @@ -56,16 +56,16 @@ public: } // namespace archive } // namespace boost -// note special treatment of std::shared_ptr. This type needs a special +// note special treatment of shared_ptr. This type needs a special // structure associated with every archive. We created a "mix-in" -// class to provide this functionality. Since std::shared_ptr holds a +// class to provide this functionality. Since shared_ptr holds a // special esteem in the boost library - we included it here by default. #include -namespace boost { +namespace boost { namespace archive { -class binary_wiarchive : +class binary_wiarchive : public binary_iarchive_impl< binary_wiarchive, std::wistream::char_type, std::wistream::traits_type > diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/polymorphic_iarchive.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/polymorphic_iarchive.hpp index 828f03f6..ce780c84 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/polymorphic_iarchive.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/polymorphic_iarchive.hpp @@ -40,7 +40,7 @@ namespace std{ namespace boost { template -class std::shared_ptr; +class shared_ptr; namespace serialization { class extended_type_info; } // namespace serialization @@ -155,9 +155,9 @@ public: #include // pops abi_suffix.hpp pragmas -// note special treatment of std::shared_ptr. This type needs a special +// note special treatment of shared_ptr. This type needs a special // structure associated with every archive. We created a "mix-in" -// class to provide this functionality. Since std::shared_ptr holds a +// class to provide this functionality. Since shared_ptr holds a // special esteem in the boost library - we included it here by default. #include diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/polymorphic_oarchive.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/polymorphic_oarchive.hpp index 458df7eb..183140ee 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/polymorphic_oarchive.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/polymorphic_oarchive.hpp @@ -39,7 +39,7 @@ namespace std{ namespace boost { template -class std::shared_ptr; +class shared_ptr; namespace serialization { class extended_type_info; } // namespace serialization diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/shared_ptr_helper.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/shared_ptr_helper.hpp index f49f768c..39e6eb82 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/shared_ptr_helper.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/shared_ptr_helper.hpp @@ -22,7 +22,7 @@ #include // NULL #include -#include +#include #include #include @@ -35,16 +35,16 @@ #include // must be the last headern namespace boost_132 { - template class std::shared_ptr; + template class shared_ptr; } namespace boost { - template class std::shared_ptr; + template class shared_ptr; namespace serialization { class extended_type_info; template inline void load( Archive & ar, - boost::std::shared_ptr< T > &t, + boost::shared_ptr< T > &t, const unsigned int file_version ); } @@ -57,14 +57,14 @@ namespace detail { class shared_ptr_helper { struct collection_type_compare { bool operator()( - const std::shared_ptr &lhs, - const std::shared_ptr &rhs + const shared_ptr &lhs, + const shared_ptr &rhs )const{ return lhs.get() < rhs.get(); } }; typedef std::set< - boost::std::shared_ptr, + boost::shared_ptr, collection_type_compare > collection_type; typedef collection_type::const_iterator iterator_type; @@ -72,7 +72,7 @@ class shared_ptr_helper { // is used to "match up" shared pointers loaded at different // points in the archive. Note, we delay construction until // it is actually used since this is by default included as - // a "mix-in" even if std::shared_ptr isn't used. + // a "mix-in" even if shared_ptr isn't used. collection_type * m_pointers; struct null_deleter { @@ -95,7 +95,7 @@ public: template friend inline void boost::serialization::load( Archive & ar, - boost::std::shared_ptr< T > &t, + boost::shared_ptr< T > &t, const unsigned int file_version ); #endif @@ -109,44 +109,44 @@ public: // new system which is disjoint from this set. This is implemented // by a change in load_construct_data below. It makes this file suitable // only for loading pointers into a 1.33 or later boost system. - std::list > * m_pointers_132; + std::list > * m_pointers_132; // #endif // returns pointer to object and an indicator whether this is a // new entry (true) or a previous one (false) - BOOST_ARCHIVE_DECL(std::shared_ptr) + BOOST_ARCHIVE_DECL(shared_ptr) get_od( const void * od, - const boost::serialization::extended_type_info * true_type, + const boost::serialization::extended_type_info * true_type, const boost::serialization::extended_type_info * this_type ); BOOST_ARCHIVE_DECL(void) - append(const boost::std::shared_ptr &); + append(const boost::shared_ptr &); template struct non_polymorphic { - static const boost::serialization::extended_type_info * + static const boost::serialization::extended_type_info * get_object_identifier(T &){ return & boost::serialization::singleton< - BOOST_DEDUCED_TYPENAME + BOOST_DEDUCED_TYPENAME boost::serialization::type_info_implementation< T >::type >::get_const_instance(); } }; template struct polymorphic { - static const boost::serialization::extended_type_info * + static const boost::serialization::extended_type_info * get_object_identifier(T & t){ return boost::serialization::singleton< - BOOST_DEDUCED_TYPENAME + BOOST_DEDUCED_TYPENAME boost::serialization::type_info_implementation< T >::type >::get_const_instance().get_derived_extended_type_info(t); } }; public: template - void reset(std::shared_ptr< T > & s, T * t){ + void reset(shared_ptr< T > & s, T * t){ if(NULL == t){ s.reset(); return; @@ -175,9 +175,9 @@ public: this_type->get_debug_info() ) ); - std::shared_ptr r = + shared_ptr r = get_od( - static_cast(t), + static_cast(t), true_type, this_type ); @@ -188,11 +188,11 @@ public: *this_type, static_cast(t) ); - std::shared_ptr sp(s, od); + shared_ptr sp(s, od); append(sp); } else{ - s = std::shared_ptr< T >( + s = shared_ptr< T >( r, static_cast(r.get()) ); @@ -201,7 +201,7 @@ public: // #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP BOOST_ARCHIVE_DECL(void) - append(const boost_132::std::shared_ptr & t); + append(const boost_132::shared_ptr & t); // #endif public: BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/text_iarchive.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/text_iarchive.hpp index 00be983e..298928b3 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/text_iarchive.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/text_iarchive.hpp @@ -9,7 +9,7 @@ /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // text_iarchive.hpp -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . +// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) @@ -32,11 +32,11 @@ # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { template -class text_iarchive_impl : +class text_iarchive_impl : public basic_text_iprimitive, public basic_text_iarchive { @@ -62,16 +62,16 @@ protected: load(v); t = boost::serialization::item_version_type(v); } - BOOST_ARCHIVE_DECL(void) + BOOST_ARCHIVE_DECL(void) load(char * t); #ifndef BOOST_NO_INTRINSIC_WCHAR_T - BOOST_ARCHIVE_DECL(void) + BOOST_ARCHIVE_DECL(void) load(wchar_t * t); #endif - BOOST_ARCHIVE_DECL(void) + BOOST_ARCHIVE_DECL(void) load(std::string &s); #ifndef BOOST_NO_STD_WSTRING - BOOST_ARCHIVE_DECL(void) + BOOST_ARCHIVE_DECL(void) load(std::wstring &ws); #endif // note: the following should not needed - but one compiler (vc 7.1) @@ -85,10 +85,10 @@ protected: load_override(class_name_type & t, int); BOOST_ARCHIVE_DECL(void) init(); - BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) + BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) text_iarchive_impl(std::istream & is, unsigned int flags); // don't import inline definitions! leave this as a reminder. - //BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) + //BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) ~text_iarchive_impl(){}; }; @@ -97,7 +97,7 @@ protected: // preserve correct static polymorphism. // same as text_iarchive below - without the shared_ptr_helper -class naked_text_iarchive : +class naked_text_iarchive : public text_iarchive_impl { public: @@ -117,9 +117,9 @@ public: #include // pops abi_suffix.hpp pragmas -// note special treatment of std::shared_ptr. This type needs a special +// note special treatment of shared_ptr. This type needs a special // structure associated with every archive. We created a "mix-in" -// class to provide this functionality. Since std::shared_ptr holds a +// class to provide this functionality. Since shared_ptr holds a // special esteem in the boost library - we included it here by default. #include @@ -128,10 +128,10 @@ public: # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { -class text_iarchive : +class text_iarchive : public text_iarchive_impl, public detail::shared_ptr_helper { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/text_wiarchive.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/text_wiarchive.hpp index d96b816b..7451f3a6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/text_wiarchive.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/text_wiarchive.hpp @@ -9,7 +9,7 @@ /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // text_wiarchive.hpp -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . +// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) @@ -36,11 +36,11 @@ # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { template -class text_wiarchive_impl : +class text_wiarchive_impl : public basic_text_iprimitive, public basic_text_iarchive { @@ -84,7 +84,7 @@ protected: void load_override(T & t, BOOST_PFTO int){ basic_text_iarchive::load_override(t, 0); } - BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) + BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) text_wiarchive_impl(std::wistream & is, unsigned int flags); ~text_wiarchive_impl(){}; }; @@ -94,7 +94,7 @@ protected: // preserve correct static polymorphism. // same as text_wiarchive below - without the shared_ptr_helper -class naked_text_wiarchive : +class naked_text_wiarchive : public text_wiarchive_impl { public: @@ -113,9 +113,9 @@ public: #include // pops abi_suffix.hpp pragmas -// note special treatment of std::shared_ptr. This type needs a special +// note special treatment of shared_ptr. This type needs a special // structure associated with every archive. We created a "mix-in" -// class to provide this functionality. Since std::shared_ptr holds a +// class to provide this functionality. Since shared_ptr holds a // special esteem in the boost library - we included it here by default. #include @@ -124,10 +124,10 @@ public: # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { -class text_wiarchive : +class text_wiarchive : public text_wiarchive_impl, public detail::shared_ptr_helper { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/xml_iarchive.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/xml_iarchive.hpp index cdf51642..be6cfe49 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/xml_iarchive.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/xml_iarchive.hpp @@ -9,7 +9,7 @@ /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // xml_iarchive.hpp -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . +// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) @@ -32,7 +32,7 @@ # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { template @@ -40,7 +40,7 @@ class basic_xml_grammar; typedef basic_xml_grammar xml_grammar; template -class xml_iarchive_impl : +class xml_iarchive_impl : public basic_text_iprimitive, public basic_xml_iarchive { @@ -64,13 +64,13 @@ protected: void load(T & t){ basic_text_iprimitive::load(t); } - void + void load(version_type & t){ unsigned int v; load(v); t = version_type(v); } - void + void load(boost::serialization::item_version_type & t){ unsigned int v; load(v); @@ -96,7 +96,7 @@ protected: load_override(class_name_type & t, int); BOOST_ARCHIVE_DECL(void) init(); - BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) + BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) xml_iarchive_impl(std::istream & is, unsigned int flags); BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) ~xml_iarchive_impl(); @@ -107,7 +107,7 @@ protected: // preserve correct static polymorphism. // same as xml_iarchive below - without the shared_ptr_helper -class naked_xml_iarchive : +class naked_xml_iarchive : public xml_iarchive_impl { public: @@ -126,9 +126,9 @@ public: #include // pops abi_suffix.hpp pragmas -// note special treatment of std::shared_ptr. This type needs a special +// note special treatment of shared_ptr. This type needs a special // structure associated with every archive. We created a "mix-in" -// class to provide this functionality. Since std::shared_ptr holds a +// class to provide this functionality. Since shared_ptr holds a // special esteem in the boost library - we included it here by default. #include @@ -137,10 +137,10 @@ public: # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { -class xml_iarchive : +class xml_iarchive : public xml_iarchive_impl, public detail::shared_ptr_helper { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/xml_wiarchive.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/xml_wiarchive.hpp index 2fb0a538..59ebbb5e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/xml_wiarchive.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/archive/xml_wiarchive.hpp @@ -9,7 +9,7 @@ /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // xml_wiarchive.hpp -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . +// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) @@ -37,7 +37,7 @@ # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { template @@ -45,7 +45,7 @@ class basic_xml_grammar; typedef basic_xml_grammar xml_wgrammar; template -class xml_wiarchive_impl : +class xml_wiarchive_impl : public basic_text_iprimitive, public basic_xml_iarchive { @@ -65,17 +65,17 @@ protected: return is; } template - void + void load(T & t){ basic_text_iprimitive::load(t); } - void + void load(version_type & t){ unsigned int v; load(v); t = version_type(v); } - void + void load(boost::serialization::item_version_type & t){ unsigned int v; load(v); @@ -99,11 +99,11 @@ protected: } BOOST_WARCHIVE_DECL(void) load_override(class_name_type & t, int); - BOOST_WARCHIVE_DECL(void) + BOOST_WARCHIVE_DECL(void) init(); - BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) + BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) xml_wiarchive_impl(std::wistream & is, unsigned int flags) ; - BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) + BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) ~xml_wiarchive_impl(); }; @@ -112,7 +112,7 @@ protected: // preserve correct static polymorphism. // same as xml_wiarchive below - without the shared_ptr_helper -class naked_xml_wiarchive : +class naked_xml_wiarchive : public xml_wiarchive_impl { public: @@ -126,14 +126,14 @@ public: } // namespace boost #ifdef BOOST_MSVC -# pragma warning(pop) +# pragma warning(pop) #endif #include // pops abi_suffix.hpp pragmas -// note special treatment of std::shared_ptr. This type needs a special +// note special treatment of shared_ptr. This type needs a special // structure associated with every archive. We created a "mix-in" -// class to provide this functionality. Since std::shared_ptr holds a +// class to provide this functionality. Since shared_ptr holds a // special esteem in the boost library - we included it here by default. #include @@ -142,10 +142,10 @@ public: # pragma warning(disable : 4511 4512) #endif -namespace boost { +namespace boost { namespace archive { -class xml_wiarchive : +class xml_wiarchive : public xml_wiarchive_impl, public detail::shared_ptr_helper { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/config.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/config.hpp index 9c93a2c7..40f770ca 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/config.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/config.hpp @@ -144,7 +144,7 @@ # endif // defined(BOOST_MSVC) #endif // !defined(BOOST_ASIO_DISABLE_STD_ARRAY) -// Standard library support for std::shared_ptr and weak_ptr. +// Standard library support for shared_ptr and weak_ptr. #if !defined(BOOST_ASIO_DISABLE_STD_SHARED_PTR) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/shared_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/shared_ptr.hpp index 30ce3ffd..5f0da22e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/shared_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/shared_ptr.hpp @@ -1,5 +1,5 @@ // -// detail/std::shared_ptr.hpp +// detail/shared_ptr.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) @@ -20,7 +20,7 @@ #if defined(BOOST_ASIO_HAS_STD_SHARED_PTR) # include #else // defined(BOOST_ASIO_HAS_STD_SHARED_PTR) -# include +# include #endif // defined(BOOST_ASIO_HAS_STD_SHARED_PTR) namespace boost { @@ -30,7 +30,7 @@ namespace detail { #if defined(BOOST_ASIO_HAS_STD_SHARED_PTR) using std::shared_ptr; #else // defined(BOOST_ASIO_HAS_STD_SHARED_PTR) -using boost::std::shared_ptr; +using boost::shared_ptr; #endif // defined(BOOST_ASIO_HAS_STD_SHARED_PTR) } // namespace detail diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/socket_ops.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/socket_ops.hpp index 78b9da3f..92af9fbe 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/socket_ops.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/detail/socket_ops.hpp @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include @@ -60,7 +60,7 @@ enum typedef unsigned char state_type; struct noop_deleter { void operator()(void*) {} }; -typedef std::shared_ptr shared_cancel_token_type; +typedef shared_ptr shared_cancel_token_type; typedef weak_ptr weak_cancel_token_type; BOOST_ASIO_DECL socket_type accept(socket_type s, socket_addr_type* addr, diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/io_service.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/io_service.hpp index e56aea45..43b94e46 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/io_service.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/io_service.hpp @@ -232,19 +232,19 @@ public: * delete static_cast(svc). * * @note The destruction sequence described above permits programs to - * simplify their resource management by using @c std::shared_ptr<>. Where an + * simplify their resource management by using @c shared_ptr<>. Where an * object's lifetime is tied to the lifetime of a connection (or some other - * sequence of asynchronous operations), a @c std::shared_ptr to the object would + * sequence of asynchronous operations), a @c shared_ptr to the object would * be bound into the handlers for all asynchronous operations associated with * it. This works as follows: * * @li When a single connection ends, all associated asynchronous operations * complete. The corresponding handler objects are destroyed, and all - * @c std::shared_ptr references to the objects are destroyed. + * @c shared_ptr references to the objects are destroyed. * * @li To shut down the whole program, the io_service function stop() is * called to terminate any run() calls as soon as possible. The io_service - * destructor defined above destroys all handlers, causing all @c std::shared_ptr + * destructor defined above destroys all handlers, causing all @c shared_ptr * references to all connection objects to be destroyed. */ BOOST_ASIO_DECL ~io_service(); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ip/basic_resolver_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ip/basic_resolver_iterator.hpp index fda14dcd..6e52a852 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ip/basic_resolver_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ip/basic_resolver_iterator.hpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -184,7 +184,7 @@ private: } typedef std::vector > values_type; - boost::asio::detail::std::shared_ptr values_; + boost::asio::detail::shared_ptr values_; std::size_t index_; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ssl/detail/impl/openssl_init.ipp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ssl/detail/impl/openssl_init.ipp index ec1b26d5..fe62e6ea 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ssl/detail/impl/openssl_init.ipp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ssl/detail/impl/openssl_init.ipp @@ -37,7 +37,7 @@ public: do_init() { ::SSL_library_init(); - ::SSL_load_error_strings(); + ::SSL_load_error_strings(); ::OpenSSL_add_all_algorithms(); mutexes_.resize(::CRYPTO_num_locks()); @@ -75,7 +75,7 @@ private: #endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) } - static void openssl_locking_func(int mode, int n, + static void openssl_locking_func(int mode, int n, const char* /*file*/, int /*line*/) { if (mode & CRYPTO_LOCK) @@ -85,7 +85,7 @@ private: } // Mutexes to be used in locking callbacks. - std::vector > mutexes_; #if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) @@ -94,10 +94,10 @@ private: #endif // !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) }; -boost::asio::detail::std::shared_ptr +boost::asio::detail::shared_ptr openssl_init_base::instance() { - static boost::asio::detail::std::shared_ptr init(new do_init); + static boost::asio::detail::shared_ptr init(new do_init); return init; } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ssl/detail/openssl_init.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ssl/detail/openssl_init.hpp index 24d033fe..c68909d1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ssl/detail/openssl_init.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/asio/ssl/detail/openssl_init.hpp @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include @@ -39,7 +39,7 @@ protected: // main, and therefore before any other threads can get started. The do_init // instance must be static in this function to ensure that it gets // initialised before any other global objects try to use it. - BOOST_ASIO_DECL static boost::asio::detail::std::shared_ptr instance(); + BOOST_ASIO_DECL static boost::asio::detail::shared_ptr instance(); }; template @@ -68,7 +68,7 @@ private: // Reference to singleton do_init object to ensure that openssl does not get // cleaned up until the last user has finished with it. - boost::asio::detail::std::shared_ptr ref_; + boost::asio::detail::shared_ptr ref_; }; template diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/gcc.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/gcc.hpp index a3469766..c0ac30af 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/gcc.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/gcc.hpp @@ -1,12 +1,12 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Darin Adler 2001 - 2002. -// (C) Copyright Jens Maurer 2001 - 2002. -// (C) Copyright Beman Dawes 2001 - 2003. -// (C) Copyright Douglas Gregor 2002. -// (C) Copyright David Abrahams 2002 - 2003. -// (C) Copyright Synge Todo 2003. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// (C) Copyright John Maddock 2001 - 2003. +// (C) Copyright Darin Adler 2001 - 2002. +// (C) Copyright Jens Maurer 2001 - 2002. +// (C) Copyright Beman Dawes 2001 - 2003. +// (C) Copyright Douglas Gregor 2002. +// (C) Copyright David Abrahams 2002 - 2003. +// (C) Copyright Synge Todo 2003. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. @@ -15,7 +15,7 @@ #if __GNUC__ < 3 # if __GNUC_MINOR__ == 91 - // egcs 1.1 won't parse std::shared_ptr.hpp without this: + // egcs 1.1 won't parse shared_ptr.hpp without this: # define BOOST_NO_AUTO_PTR # endif # if __GNUC_MINOR__ < 95 @@ -97,7 +97,7 @@ // #if !defined(__MINGW32__) && !defined(linux) && !defined(__linux) && !defined(__linux__) # define BOOST_HAS_THREADS -#endif +#endif // // gcc has "long long" @@ -116,7 +116,7 @@ // #if __GNUC__ >= 4 # if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && !defined(__CYGWIN__) - // All Win32 development environments, including 64-bit Windows and MinGW, define + // All Win32 development environments, including 64-bit Windows and MinGW, define // _WIN32 or one of its variant spellings. Note that Cygwin is a POSIX environment, // so does not define _WIN32 or its variants. # define BOOST_HAS_DECLSPEC @@ -128,7 +128,7 @@ # endif # define BOOST_SYMBOL_VISIBLE __attribute__((visibility("default"))) #else -// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined +// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined # define BOOST_SYMBOL_EXPORT #endif @@ -169,7 +169,7 @@ # define BOOST_NO_CXX11_RVALUE_REFERENCES # define BOOST_NO_CXX11_STATIC_ASSERT -// Variadic templates compiler: +// Variadic templates compiler: // http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html # if defined(__VARIADIC_TEMPLATES) || (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4) && defined(__GXX_EXPERIMENTAL_CXX0X__)) # define BOOST_HAS_VARIADIC_TMPL diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/sunpro_cc.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/sunpro_cc.hpp index e796a16d..65beb501 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/sunpro_cc.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/compiler/sunpro_cc.hpp @@ -1,10 +1,10 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Jens Maurer 2001 - 2003. -// (C) Copyright Peter Dimov 2002. -// (C) Copyright Aleksey Gurtovoy 2002 - 2003. -// (C) Copyright David Abrahams 2002. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// (C) Copyright John Maddock 2001. +// (C) Copyright Jens Maurer 2001 - 2003. +// (C) Copyright Peter Dimov 2002. +// (C) Copyright Aleksey Gurtovoy 2002 - 2003. +// (C) Copyright David Abrahams 2002. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. @@ -34,7 +34,7 @@ # define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION # endif -# if (__SUNPRO_CC <= 0x530) +# if (__SUNPRO_CC <= 0x530) // Requesting debug info (-g) with Boost.Python results // in an internal compiler error for "static const" // initialized in-class. @@ -44,7 +44,7 @@ # define BOOST_NO_INCLASS_MEMBER_INITIALIZATION // SunPro 5.3 has better support for partial specialization, - // but breaks when compiling std::less > + // but breaks when compiling std::less > // (Jens Maurer 4 Nov 2001). // std::less specialization fixed as reported by George @@ -57,7 +57,7 @@ # define BOOST_NO_INTEGRAL_INT64_T # endif -# if (__SUNPRO_CC < 0x570) +# if (__SUNPRO_CC < 0x570) # define BOOST_NO_TEMPLATE_TEMPLATES // see http://lists.boost.org/MailArchives/boost/msg47184.php // and http://lists.boost.org/MailArchives/boost/msg47220.php @@ -65,7 +65,7 @@ # define BOOST_NO_SFINAE # define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS # endif -# if (__SUNPRO_CC <= 0x580) +# if (__SUNPRO_CC <= 0x580) # define BOOST_NO_IS_ABSTRACT # endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/platform/win32.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/platform/win32.hpp index 066b2e88..39220127 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/platform/win32.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/config/platform/win32.hpp @@ -1,9 +1,9 @@ -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Bill Kempf 2001. -// (C) Copyright Aleksey Gurtovoy 2003. +// (C) Copyright John Maddock 2001 - 2003. +// (C) Copyright Bill Kempf 2001. +// (C) Copyright Aleksey Gurtovoy 2003. // (C) Copyright Rene Rivera 2005. -// Use, modification and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org for most recent version. @@ -46,11 +46,11 @@ // // Win32 will normally be using native Win32 threads, // but there is a pthread library avaliable as an option, -// we used to disable this when BOOST_DISABLE_WIN32 was +// we used to disable this when BOOST_DISABLE_WIN32 was // defined but no longer - this should allow some // files to be compiled in strict mode - while maintaining // a consistent setting of BOOST_HAS_THREADS across -// all translation units (needed for std::shared_ptr etc). +// all translation units (needed for shared_ptr etc). // #ifdef _WIN32_WCE diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/gregorian/greg_month.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/gregorian/greg_month.hpp index f326f91a..b48a8a89 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/gregorian/greg_month.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/gregorian/greg_month.hpp @@ -2,7 +2,7 @@ #define GREG_MONTH_HPP___ /* Copyright (c) 2002,2003 CrystalClear Software, Inc. - * Use, modification and distribution is subject to the + * Use, modification and distribution is subject to the * Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) * Author: Jeff Garland, Bart Garst @@ -11,7 +11,7 @@ #include "boost/date_time/constrained_value.hpp" #include "boost/date_time/date_defs.hpp" -#include "boost/std::shared_ptr.hpp" +#include "boost/shared_ptr.hpp" #include "boost/date_time/compiler_config.hpp" #include #include @@ -39,7 +39,7 @@ namespace gregorian { using date_time::Dec; using date_time::NotAMonth; using date_time::NumMonths; - + //! Exception thrown if a greg_month is constructed with a value out of range struct bad_month : public std::out_of_range { @@ -50,15 +50,15 @@ namespace gregorian { //! A constrained range that implements the gregorian_month rules typedef CV::constrained_value greg_month_rep; - + //! Wrapper class to represent months in gregorian based calendar class BOOST_DATE_TIME_DECL greg_month : public greg_month_rep { public: typedef date_time::months_of_year month_enum; typedef std::map month_map_type; - typedef boost::std::shared_ptr month_map_ptr_type; + typedef boost::shared_ptr month_map_ptr_type; //! Construct a month from the months_of_year enumeration - greg_month(month_enum theMonth) : + greg_month(month_enum theMonth) : greg_month_rep(static_cast(theMonth)) {} //! Construct from a short value greg_month(unsigned short theMonth) : greg_month_rep(theMonth) {} diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/custom_time_zone.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/custom_time_zone.hpp index 1c36d575..84c59a3a 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/custom_time_zone.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/custom_time_zone.hpp @@ -14,7 +14,7 @@ #include "boost/date_time/local_time/dst_transition_day_rules.hpp" #include "boost/date_time/string_convert.hpp" //#include "boost/date_time/special_defs.hpp" -#include "boost/std::shared_ptr.hpp" +#include "boost/shared_ptr.hpp" namespace boost { namespace local_time { @@ -22,7 +22,7 @@ namespace local_time { //typedef boost::date_time::time_zone_names time_zone_names; typedef boost::date_time::dst_adjustment_offsets dst_adjustment_offsets; //typedef boost::date_time::time_zone_base time_zone; - typedef boost::std::shared_ptr dst_calc_rule_ptr; + typedef boost::shared_ptr dst_calc_rule_ptr; //! A real time zone template @@ -38,7 +38,7 @@ namespace local_time { custom_time_zone_base(const time_zone_names& zone_names, const time_duration_type& utc_offset, const dst_adjustment_offsets& dst_shift, - boost::std::shared_ptr calc_rule) : + boost::shared_ptr calc_rule) : zone_names_(zone_names), base_utc_offset_(utc_offset), dst_offsets_(dst_shift), @@ -100,7 +100,7 @@ namespace local_time { // std offset dst [offset],start[/time],end[/time] - w/o spaces stringstream_type ss; ss.fill('0'); - boost::std::shared_ptr no_rules; + boost::shared_ptr no_rules; // std ss << std_zone_abbrev(); // offset @@ -157,7 +157,7 @@ namespace local_time { bool has_dst_; time_duration_type base_utc_offset_; dst_adjustment_offsets dst_offsets_; - boost::std::shared_ptr dst_calc_rules_; + boost::shared_ptr dst_calc_rules_; }; typedef custom_time_zone_base custom_time_zone; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/local_date_time.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/local_date_time.hpp index 3eed3eff..96b29158 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/local_date_time.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/local_date_time.hpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include //todo remove? @@ -57,7 +57,7 @@ namespace local_time { * to wall clock time are made as needed. This approach allows for * operations between wall-clock times in different time zones, and * daylight savings time considerations, to be made. Time zones are - * required to be in the form of a boost::std::shared_ptr. + * required to be in the form of a boost::shared_ptr. */ template > @@ -79,7 +79,7 @@ namespace local_time { *@param tz Timezone for to adjust the UTC time to. */ local_date_time_base(utc_time_type t, - boost::std::shared_ptr tz) : + boost::shared_ptr tz) : date_time::base_time(t), zone_(tz) { @@ -99,12 +99,12 @@ namespace local_time { */ local_date_time_base(date_type d, time_duration_type td, - boost::std::shared_ptr tz, + boost::shared_ptr tz, bool dst_flag) : //necessary for constr_adj() date_time::base_time(construction_adjustment(utc_time_type(d, td), tz, dst_flag)), zone_(tz) { - if(tz != boost::std::shared_ptr() && tz->has_dst()){ + if(tz != boost::shared_ptr() && tz->has_dst()){ // d & td are already local so we use them time_is_dst_result result = check_dst(d, td, tz); @@ -140,7 +140,7 @@ namespace local_time { */ local_date_time_base(date_type d, time_duration_type td, - boost::std::shared_ptr tz, + boost::shared_ptr tz, DST_CALC_OPTIONS calc_option) : // dummy value - time_ is set in constructor code date_time::base_time(utc_time_type(d,td)), @@ -189,9 +189,9 @@ namespace local_time { */ static time_is_dst_result check_dst(date_type d, time_duration_type td, - boost::std::shared_ptr tz) + boost::shared_ptr tz) { - if(tz != boost::std::shared_ptr() && tz->has_dst()) { + if(tz != boost::shared_ptr() && tz->has_dst()) { typedef typename date_time::dst_calculator dst_calculator; return dst_calculator::local_is_dst( d, td, @@ -218,20 +218,20 @@ namespace local_time { //! Special values constructor explicit local_date_time_base(const boost::date_time::special_values sv, - boost::std::shared_ptr tz = boost::std::shared_ptr()) : + boost::shared_ptr tz = boost::shared_ptr()) : date_time::base_time(utc_time_type(sv)), zone_(tz) {} //! returns time zone associated with calling instance - boost::std::shared_ptr zone() const + boost::shared_ptr zone() const { return zone_; } //! returns false is time_zone is NULL and if time value is a special_value bool is_dst() const { - if(zone_ != boost::std::shared_ptr() && zone_->has_dst() && !this->is_special()) { + if(zone_ != boost::shared_ptr() && zone_->has_dst() && !this->is_special()) { // check_dst takes a local time, *this is utc utc_time_type lt(this->time_); lt += zone_->base_utc_offset(); @@ -265,7 +265,7 @@ namespace local_time { //! Returns object's time value as a local representation utc_time_type local_time() const { - if(zone_ != boost::std::shared_ptr()){ + if(zone_ != boost::shared_ptr()){ utc_time_type lt = this->utc_time() + zone_->base_utc_offset(); if (is_dst()) { lt += zone_->dst_offset(); @@ -286,7 +286,7 @@ namespace local_time { ss << utc_time(); return ss.str(); } - if(zone_ == boost::std::shared_ptr()) { + if(zone_ == boost::shared_ptr()) { ss << utc_time() << " UTC"; return ss.str(); } @@ -306,7 +306,7 @@ namespace local_time { } /*! returns a local_date_time_base in the given time zone with the * optional time_duration added. */ - local_date_time_base local_time_in(boost::std::shared_ptr new_tz, + local_date_time_base local_time_in(boost::shared_ptr new_tz, time_duration_type td=time_duration_type(0,0,0)) const { return local_date_time_base(utc_time_type(this->time_) + td, new_tz); @@ -318,7 +318,7 @@ namespace local_time { * classes that do not use a time_zone */ std::string zone_name(bool as_offset=false) const { - if(zone_ == boost::std::shared_ptr()) { + if(zone_ == boost::shared_ptr()) { if(as_offset) { return std::string("Z"); } @@ -352,7 +352,7 @@ namespace local_time { * that do not use a time_zone */ std::string zone_abbrev(bool as_offset=false) const { - if(zone_ == boost::std::shared_ptr()) { + if(zone_ == boost::shared_ptr()) { if(as_offset) { return std::string("Z"); } @@ -384,7 +384,7 @@ namespace local_time { //! returns a posix_time_zone string for the associated time_zone. If no time_zone, "UTC+00" is returned. std::string zone_as_posix_string() const { - if(zone_ == std::shared_ptr()) { + if(zone_ == shared_ptr()) { return std::string("UTC+00"); } return zone_->to_posix_string(); @@ -477,16 +477,16 @@ namespace local_time { return utc_time_type(this->time_) - utc_time_type(rhs.time_); } private: - boost::std::shared_ptr zone_; + boost::shared_ptr zone_; //bool is_dst_; /*! Adjust the passed in time to UTC? */ utc_time_type construction_adjustment(utc_time_type t, - boost::std::shared_ptr z, + boost::shared_ptr z, bool dst_flag) { - if(z != boost::std::shared_ptr()) { + if(z != boost::shared_ptr()) { if(dst_flag && z->has_dst()) { t -= z->dst_offset(); } // else no adjust diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/local_time_types.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/local_time_types.hpp index 30b0540b..5e04422e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/local_time_types.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/local_time_types.hpp @@ -2,7 +2,7 @@ #define LOCAL_TIME_LOCAL_TIME_TYPES_HPP__ /* Copyright (c) 2003-2004 CrystalClear Software, Inc. - * Subject to the Boost Software License, Version 1.0. + * Subject to the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) * Author: Jeff Garland, Bart Garst * $Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $ @@ -20,21 +20,21 @@ namespace boost { namespace local_time { - typedef boost::date_time::period local_time_period; typedef date_time::time_itr local_time_iterator; - typedef date_time::second_clock local_sec_clock; + typedef date_time::second_clock local_sec_clock; typedef date_time::microsec_clock local_microsec_clock; - + typedef date_time::time_zone_base time_zone; typedef date_time::time_zone_base wtime_zone; //! Shared Pointer for custom_time_zone and posix_time_zone objects - typedef boost::std::shared_ptr time_zone_ptr; - typedef boost::std::shared_ptr wtime_zone_ptr; - + typedef boost::shared_ptr time_zone_ptr; + typedef boost::shared_ptr wtime_zone_ptr; + typedef date_time::time_zone_names_base time_zone_names; typedef date_time::time_zone_names_base wtime_zone_names; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/posix_time_zone.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/posix_time_zone.hpp index 1d886983..ee1b553e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/posix_time_zone.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/posix_time_zone.hpp @@ -184,7 +184,7 @@ namespace local_time{ // std offset dst [offset],start[/time],end[/time] - w/o spaces stringstream_type ss; ss.fill('0'); - boost::std::shared_ptr no_rules; + boost::shared_ptr no_rules; // std ss << std_zone_abbrev(); // offset @@ -241,7 +241,7 @@ namespace local_time{ bool has_dst_; time_duration_type base_utc_offset_; dst_adjustment_offsets dst_offsets_; - boost::std::shared_ptr dst_calc_rules_; + boost::shared_ptr dst_calc_rules_; /*! Extract time zone abbreviations for STD & DST as well * as the offsets for the time shift that occurs and how @@ -399,7 +399,7 @@ namespace local_time{ ew = lexical_cast(*it++); ed = lexical_cast(*it); - dst_calc_rules_ = std::shared_ptr( + dst_calc_rules_ = shared_ptr( new nth_kday_dst_rule( nth_last_dst_rule::start_rule( static_cast(sw),sd,sm), @@ -427,7 +427,7 @@ namespace local_time{ ed -= calendar::end_of_month_day(year,em++); } - dst_calc_rules_ = std::shared_ptr( + dst_calc_rules_ = shared_ptr( new partial_date_dst_rule( partial_date_dst_rule::start_rule( sd, static_cast(sm)), @@ -443,7 +443,7 @@ namespace local_time{ int sd=0, ed=0; sd = lexical_cast(s); ed = lexical_cast(e); - dst_calc_rules_ = std::shared_ptr( + dst_calc_rules_ = shared_ptr( new partial_date_dst_rule( partial_date_dst_rule::start_rule(++sd),// args are 0-365 partial_date_dst_rule::end_rule(++ed) // pd expects 1-366 diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/tz_database.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/tz_database.hpp index 26afe449..aceda939 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/tz_database.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/local_time/tz_database.hpp @@ -2,7 +2,7 @@ #define BOOST_DATE_TIME_TZ_DATABASE_HPP__ /* Copyright (c) 2003-2004 CrystalClear Software, Inc. - * Subject to the Boost Software License, Version 1.0. + * Subject to the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) * Author: Jeff Garland, Bart Garst * $Date: 2008-02-27 12:00:24 -0800 (Wed, 27 Feb 2008) $ @@ -17,11 +17,11 @@ namespace boost { namespace local_time { - using date_time::data_not_accessible; - using date_time::bad_field_count; + using date_time::data_not_accessible; + using date_time::bad_field_count; - //! Object populated with boost::std::shared_ptr objects - /*! Object populated with boost::std::shared_ptr objects + //! Object populated with boost::shared_ptr objects + /*! Object populated with boost::shared_ptr objects * Database is populated from specs stored in external csv file. See * date_time::tz_db_base for greater detail */ typedef date_time::tz_db_base tz_database; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/microsec_time_clock.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/microsec_time_clock.hpp index beb1d70d..177811ee 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/microsec_time_clock.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/microsec_time_clock.hpp @@ -15,7 +15,7 @@ */ #include -#include +#include #include #include #include @@ -50,7 +50,7 @@ namespace date_time { //! return a local time object for the given zone, based on computer clock //JKG -- looks like we could rewrite this against universal_time template - static time_type local_time(std::shared_ptr tz_ptr) + static time_type local_time(shared_ptr tz_ptr) { typedef typename time_type::utc_time_type utc_time_type; typedef second_clock second_clock; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/time_clock.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/time_clock.hpp index c73466ed..9aa2ff0e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/time_clock.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/time_clock.hpp @@ -14,7 +14,7 @@ */ #include "boost/date_time/c_time.hpp" -#include "boost/std::shared_ptr.hpp" +#include "boost/shared_ptr.hpp" namespace boost { namespace date_time { @@ -54,7 +54,7 @@ namespace date_time { } template - static time_type local_time(boost::std::shared_ptr tz_ptr) + static time_type local_time(boost::shared_ptr tz_ptr) { typedef typename time_type::utc_time_type utc_time_type; utc_time_type utc_time = second_clock::universal_time(); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/tz_db_base.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/tz_db_base.hpp index fff9f91e..a6d8ea9e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/tz_db_base.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/date_time/tz_db_base.hpp @@ -2,7 +2,7 @@ #define DATE_TIME_TZ_DB_BASE_HPP__ /* Copyright (c) 2003-2005 CrystalClear Software, Inc. - * Subject to the Boost Software License, Version 1.0. + * Subject to the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) * Author: Jeff Garland, Bart Garst * $Date: 2012-09-22 09:04:10 -0700 (Sat, 22 Sep 2012) $ @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include @@ -29,20 +29,20 @@ namespace boost { class data_not_accessible : public std::logic_error { public: - data_not_accessible() : - std::logic_error(std::string("Unable to locate or access the required datafile.")) + data_not_accessible() : + std::logic_error(std::string("Unable to locate or access the required datafile.")) {} - data_not_accessible(const std::string& filespec) : - std::logic_error(std::string("Unable to locate or access the required datafile. Filespec: " + filespec)) + data_not_accessible(const std::string& filespec) : + std::logic_error(std::string("Unable to locate or access the required datafile. Filespec: " + filespec)) {} }; - + //! Exception thrown when tz database locates incorrect field structure in data file class bad_field_count : public std::out_of_range { public: - bad_field_count(const std::string& s) : - std::out_of_range(s) + bad_field_count(const std::string& s) : + std::out_of_range(s) {} }; @@ -51,48 +51,48 @@ namespace boost { * tz_db_base is intended to be customized by the * library user. When customizing this file (or creating your own) the * file must follow a specific format. - * + * * This first line is expected to contain column headings and is therefore * not processed by the tz_db_base. * * Each record (line) must have eleven fields. Some of those fields can - * be empty. Every field (even empty ones) must be enclosed in + * be empty. Every field (even empty ones) must be enclosed in * double-quotes. * Ex: * @code * "America/Phoenix" <- string enclosed in quotes * "" <- empty field * @endcode - * - * Some fields represent a length of time. The format of these fields + * + * Some fields represent a length of time. The format of these fields * must be: * @code * "{+|-}hh:mm[:ss]" <- length-of-time format * @endcode * Where the plus or minus is mandatory and the seconds are optional. - * - * Since some time zones do not use daylight savings it is not always - * necessary for every field in a zone_spec to contain a value. All - * zone_specs must have at least ID and GMT offset. Zones that use - * daylight savings must have all fields filled except: - * STD ABBR, STD NAME, DST NAME. You should take note - * that DST ABBR is mandatory for zones that use daylight savings + * + * Since some time zones do not use daylight savings it is not always + * necessary for every field in a zone_spec to contain a value. All + * zone_specs must have at least ID and GMT offset. Zones that use + * daylight savings must have all fields filled except: + * STD ABBR, STD NAME, DST NAME. You should take note + * that DST ABBR is mandatory for zones that use daylight savings * (see field descriptions for further details). * - * ******* Fields and their description/details ********* - * - * ID: + * ******* Fields and their description/details ********* + * + * ID: * Contains the identifying string for the zone_spec. Any string will - * do as long as it's unique. No two ID's can be the same. + * do as long as it's unique. No two ID's can be the same. * * STD ABBR: * STD NAME: * DST ABBR: * DST NAME: - * These four are all the names and abbreviations used by the time - * zone being described. While any string will do in these fields, - * care should be taken. These fields hold the strings that will be - * used in the output of many of the local_time classes. + * These four are all the names and abbreviations used by the time + * zone being described. While any string will do in these fields, + * care should be taken. These fields hold the strings that will be + * used in the output of many of the local_time classes. * Ex: * @code * time_zone nyc = tz_db.time_zone_from_region("America/New_York"); @@ -103,42 +103,42 @@ namespace boost { * // 2004-Aug-30 00:00:00 EDT * @endcode * - * NOTE: The exact format/function names may vary - see local_time + * NOTE: The exact format/function names may vary - see local_time * documentation for further details. * * GMT offset: - * This is the number of hours added to utc to get the local time - * before any daylight savings adjustments are made. Some examples + * This is the number of hours added to utc to get the local time + * before any daylight savings adjustments are made. Some examples * are: America/New_York offset -5 hours, & Africa/Cairo offset +2 hours. * The format must follow the length-of-time format described above. * * DST adjustment: - * The amount of time added to gmt_offset when daylight savings is in + * The amount of time added to gmt_offset when daylight savings is in * effect. The format must follow the length-of-time format described * above. * * DST Start Date rule: * This is a specially formatted string that describes the day of year * in which the transition take place. It holds three fields of it's own, - * separated by semicolons. - * The first field indicates the "nth" weekday of the month. The possible - * values are: 1 (first), 2 (second), 3 (third), 4 (fourth), 5 (fifth), + * separated by semicolons. + * The first field indicates the "nth" weekday of the month. The possible + * values are: 1 (first), 2 (second), 3 (third), 4 (fourth), 5 (fifth), * and -1 (last). * The second field indicates the day-of-week from 0-6 (Sun=0). * The third field indicates the month from 1-12 (Jan=1). - * - * Examples are: "-1;5;9"="Last Friday of September", + * + * Examples are: "-1;5;9"="Last Friday of September", * "2;1;3"="Second Monday of March" * * Start time: * Start time is the number of hours past midnight, on the day of the - * start transition, the transition takes place. More simply put, the + * start transition, the transition takes place. More simply put, the * time of day the transition is made (in 24 hours format). The format - * must follow the length-of-time format described above with the + * must follow the length-of-time format described above with the * exception that it must always be positive. * * DST End date rule: - * See DST Start date rule. The difference here is this is the day + * See DST Start date rule. The difference here is this is the day * daylight savings ends (transition to STD). * * End time: @@ -147,13 +147,13 @@ namespace boost { template class tz_db_base { public: - /* Having CharT as a template parameter created problems - * with posix_time::duration_from_string. Templatizing - * duration_from_string was not possible at this time, however, - * it should be possible in the future (when poor compilers get - * fixed or stop being used). - * Since this class was designed to use CharT as a parameter it - * is simply typedef'd here to ease converting in back to a + /* Having CharT as a template parameter created problems + * with posix_time::duration_from_string. Templatizing + * duration_from_string was not possible at this time, however, + * it should be possible in the future (when poor compilers get + * fixed or stop being used). + * Since this class was designed to use CharT as a parameter it + * is simply typedef'd here to ease converting in back to a * parameter the future */ typedef char char_type; @@ -182,7 +182,7 @@ namespace boost { { string_type in_str; std::string buff; - + std::ifstream ifs(pathspec.c_str()); if(!ifs){ boost::throw_exception(data_not_accessible(pathspec)); @@ -192,27 +192,27 @@ namespace boost { } //! returns true if record successfully added to map - /*! Takes a region name in the form of "America/Phoenix", and a - * time_zone object for that region. The id string must be a unique + /*! Takes a region name in the form of "America/Phoenix", and a + * time_zone object for that region. The id string must be a unique * name that does not already exist in the database. */ - bool add_record(const string_type& region, - boost::std::shared_ptr tz) + bool add_record(const string_type& region, + boost::shared_ptr tz) { - typename map_type::value_type p(region, tz); + typename map_type::value_type p(region, tz); return (m_zone_map.insert(p)).second; } //! Returns a time_zone object built from the specs for the given region - /*! Returns a time_zone object built from the specs for the given - * region. If region does not exist a local_time::record_not_found + /*! Returns a time_zone object built from the specs for the given + * region. If region does not exist a local_time::record_not_found * exception will be thrown */ - boost::std::shared_ptr - time_zone_from_region(const string_type& region) const + boost::shared_ptr + time_zone_from_region(const string_type& region) const { // get the record typename map_type::const_iterator record = m_zone_map.find(region); if(record == m_zone_map.end()){ - return boost::std::shared_ptr(); //null pointer + return boost::shared_ptr(); //null pointer } return record->second; } @@ -229,9 +229,9 @@ namespace boost { } return regions; } - + private: - typedef std::map > map_type; + typedef std::map > map_type; map_type m_zone_map; // start and end rule are of the same type @@ -240,27 +240,27 @@ namespace boost { /* TODO: mechanisms need to be put in place to handle different * types of rule specs. parse_rules() only handles nth_kday * rule types. */ - + //! parses rule specs for transition day rules rule_type* parse_rules(const string_type& sr, const string_type& er) const { using namespace gregorian; - // start and end rule are of the same type, + // start and end rule are of the same type, // both are included here for readability typedef typename rule_type::start_rule start_rule; typedef typename rule_type::end_rule end_rule; - + // these are: [start|end] nth, day, month int s_nth = 0, s_d = 0, s_m = 0; int e_nth = 0, e_d = 0, e_m = 0; split_rule_spec(s_nth, s_d, s_m, sr); split_rule_spec(e_nth, e_d, e_m, er); - + typename start_rule::week_num s_wn, e_wn; s_wn = get_week_num(s_nth); e_wn = get_week_num(e_nth); - - + + return new rule_type(start_rule(s_wn, s_d, s_m), end_rule(e_wn, e_d, e_m)); } @@ -286,7 +286,7 @@ namespace boost { } return start_rule::fifth; // silence warnings } - + //! splits the [start|end]_date_rule string into 3 ints void split_rule_spec(int& nth, int& d, int& m, string_type rule) const { @@ -297,22 +297,22 @@ namespace boost { typedef boost::tokenizer::const_iterator, std::basic_string >::iterator tokenizer_iterator; - + const char_type sep_char[] = { ';', '\0'}; char_separator_type sep(sep_char); tokenizer tokens(rule, sep); // 3 fields - - tokenizer_iterator tok_iter = tokens.begin(); + + tokenizer_iterator tok_iter = tokens.begin(); nth = std::atoi(tok_iter->c_str()); ++tok_iter; d = std::atoi(tok_iter->c_str()); ++tok_iter; m = std::atoi(tok_iter->c_str()); } - + //! Take a line from the csv, turn it into a time_zone_type. /*! Take a line from the csv, turn it into a time_zone_type, - * and add it to the map. Zone_specs in csv file are expected to - * have eleven fields that describe the time zone. Returns true if + * and add it to the map. Zone_specs in csv file are expected to + * have eleven fields that describe the time zone. Returns true if * zone_spec successfully added to database */ bool parse_string(string_type& s) { @@ -333,16 +333,16 @@ namespace boost { //take a shot at fixing gcc 4.x error const unsigned int expected_fields = static_cast(FIELD_COUNT); - if (result.size() != expected_fields) { + if (result.size() != expected_fields) { std::ostringstream msg; - msg << "Expecting " << FIELD_COUNT << " fields, got " + msg << "Expecting " << FIELD_COUNT << " fields, got " << result.size() << " fields in line: " << s; boost::throw_exception(bad_field_count(msg.str())); BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return false); // should never reach } // initializations - bool has_dst = true; + bool has_dst = true; if(result[DSTABBR] == std::string()){ has_dst = false; } @@ -352,14 +352,14 @@ namespace boost { time_zone_names names(result[STDNAME], result[STDABBR], result[DSTNAME], result[DSTABBR]); - time_duration_type utc_offset = + time_duration_type utc_offset = str_from_delimited_time_duration(result[GMTOFFSET]); - + dst_adjustment_offsets adjust(time_duration_type(0,0,0), time_duration_type(0,0,0), time_duration_type(0,0,0)); - boost::std::shared_ptr rules; + boost::shared_ptr rules; if(has_dst){ adjust = dst_adjustment_offsets( @@ -368,16 +368,16 @@ namespace boost { str_from_delimited_time_duration(result[END_TIME]) ); - rules = - boost::std::shared_ptr(parse_rules(result[START_DATE_RULE], + rules = + boost::shared_ptr(parse_rules(result[START_DATE_RULE], result[END_DATE_RULE])); } string_type id(result[ID]); - boost::std::shared_ptr zone(new time_zone_type(names, utc_offset, adjust, rules)); + boost::shared_ptr zone(new time_zone_type(names, utc_offset, adjust, rules)); return (add_record(id, zone)); - - } - + + } + }; } } // namespace diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/detail/exception_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/detail/exception_ptr.hpp index 283cdad4..5e5a2679 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/detail/exception_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/detail/exception_ptr.hpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -37,7 +37,7 @@ boost class exception_ptr { - typedef boost::std::shared_ptr impl; + typedef boost::shared_ptr impl; impl ptr_; friend void rethrow_exception( exception_ptr const & ); typedef exception_detail::clone_base const * (impl::*unspecified_bool_type)() const; @@ -122,7 +122,7 @@ boost throw_function(BOOST_CURRENT_FUNCTION) << throw_file(__FILE__) << throw_line(__LINE__); - static exception_ptr ep(std::shared_ptr(new exception_detail::clone_impl(c))); + static exception_ptr ep(shared_ptr(new exception_detail::clone_impl(c))); return ep; } @@ -305,7 +305,7 @@ boost success: { BOOST_ASSERT(e!=0); - return exception_ptr(std::shared_ptr(e)); + return exception_ptr(shared_ptr(e)); } case exception_detail::clone_current_exception_result:: bad_alloc: @@ -332,7 +332,7 @@ boost catch( exception_detail::clone_base & e ) { - return exception_ptr(std::shared_ptr(e.clone())); + return exception_ptr(shared_ptr(e.clone())); } catch( std::domain_error & e ) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/exception.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/exception.hpp index 6cd51f88..42d27871 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/exception.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/exception.hpp @@ -145,7 +145,7 @@ boost #endif template - class std::shared_ptr; + class shared_ptr; namespace exception_detail @@ -157,8 +157,8 @@ boost error_info_container { virtual char const * diagnostic_information( char const * ) const = 0; - virtual std::shared_ptr get( type_info_ const & ) const = 0; - virtual void set( std::shared_ptr const &, type_info_ const & ) = 0; + virtual shared_ptr get( type_info_ const & ) const = 0; + virtual void set( shared_ptr const &, type_info_ const & ) = 0; virtual void add_ref() const = 0; virtual bool release() const = 0; virtual refcount_ptr clone() const = 0; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/get_error_info.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/get_error_info.hpp index e9b7ce8d..046f05ae 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/get_error_info.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/get_error_info.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace boost @@ -32,7 +32,7 @@ boost get( exception const & x ) { if( exception_detail::error_info_container * c=x.data_.get() ) - if( std::shared_ptr eib = c->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) ) + if( shared_ptr eib = c->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) ) { #ifndef BOOST_NO_RTTI BOOST_ASSERT( 0!=dynamic_cast(eib.get()) ); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/info.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/info.hpp index bae6ffcf..7b56076d 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/info.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/exception/info.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include @@ -82,26 +82,26 @@ boost } void - set( std::shared_ptr const & x, type_info_ const & typeid_ ) + set( shared_ptr const & x, type_info_ const & typeid_ ) { BOOST_ASSERT(x); info_[typeid_] = x; diagnostic_info_str_.clear(); } - std::shared_ptr + shared_ptr get( type_info_ const & ti ) const { error_info_map::const_iterator i=info_.find(ti); if( info_.end()!=i ) { - std::shared_ptr const & p = i->second; + shared_ptr const & p = i->second; #ifndef BOOST_NO_RTTI BOOST_ASSERT( *BOOST_EXCEPTION_DYNAMIC_TYPEID(*p).type_==*ti.type_ ); #endif return p; } - return std::shared_ptr(); + return shared_ptr(); } char const * @@ -125,7 +125,7 @@ boost friend class boost::exception; - typedef std::map< type_info_, std::shared_ptr > error_info_map; + typedef std::map< type_info_, shared_ptr > error_info_map; error_info_map info_; mutable std::string diagnostic_info_str_; mutable int count_; @@ -168,7 +168,7 @@ boost set_info( E const & x, error_info const & v ) { typedef error_info error_info_tag_t; - std::shared_ptr p( new error_info_tag_t(v) ); + shared_ptr p( new error_info_tag_t(v) ); exception_detail::error_info_container * c=x.data_.get(); if( !c ) x.data_.adopt(c=new exception_detail::error_info_container_impl); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/filesystem/operations.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/filesystem/operations.hpp index 43749ff9..dc01b7d8 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/filesystem/operations.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/filesystem/operations.hpp @@ -2,9 +2,9 @@ // Copyright Beman Dawes 2002-2009 // Copyright Jan Langer 2002 -// Copyright Dietmar Kuehl 2001 +// Copyright Dietmar Kuehl 2001 // Copyright Vladimir Prus 2002 - + // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include @@ -59,7 +59,7 @@ namespace boost //--------------------------------------------------------------------------------------// enum file_type - { + { status_error, # ifndef BOOST_FILESYSTEM_NO_DEPRECATED status_unknown = status_error, @@ -92,7 +92,7 @@ namespace boost // Values are from POSIX and are given in octal per the POSIX standard. // permission bits - + owner_read = 0400, // S_IRUSR, Read permission, owner owner_write = 0200, // S_IWUSR, Write permission, owner owner_exe = 0100, // S_IXUSR, Execute/search permission, owner @@ -115,8 +115,8 @@ namespace boost set_uid_on_exe = 04000, // S_ISUID, Set-user-ID on execution set_gid_on_exe = 02000, // S_ISGID, Set-group-ID on execution sticky_bit = 01000, // S_ISVTX, - // (POSIX XSI) On directories, restricted deletion flag - // (V7) 'sticky bit': save swapped text even after use + // (POSIX XSI) On directories, restricted deletion flag + // (V7) 'sticky bit': save swapped text even after use // (SunOS) On non-directories: don't cache this file // (SVID-v4.2) On directories: restricted deletion flag // Also see http://en.wikipedia.org/wiki/Sticky_bit @@ -151,13 +151,13 @@ namespace boost // observers file_type type() const { return m_value; } - perms permissions() const { return m_perms; } + perms permissions() const { return m_perms; } // modifiers void type(file_type v) { m_value = v; } void permissions(perms prms) { m_perms = prms; } - bool operator==(const file_status& rhs) const { return type() == rhs.type() && + bool operator==(const file_status& rhs) const { return type() == rhs.type() && permissions() == rhs.permissions(); } bool operator!=(const file_status& rhs) const { return !(*this == rhs); } @@ -260,7 +260,7 @@ namespace boost BOOST_FILESYSTEM_DECL void resize_file(const path& p, uintmax_t size, system::error_code* ec=0); BOOST_FILESYSTEM_DECL - space_info space(const path& p, system::error_code* ec=0); + space_info space(const path& p, system::error_code* ec=0); BOOST_FILESYSTEM_DECL path system_complete(const path& p, system::error_code* ec=0); BOOST_FILESYSTEM_DECL @@ -277,37 +277,37 @@ namespace boost inline file_status status(const path& p) {return detail::status(p);} - inline + inline file_status status(const path& p, system::error_code& ec) {return detail::status(p, &ec);} - inline + inline file_status symlink_status(const path& p) {return detail::symlink_status(p);} inline file_status symlink_status(const path& p, system::error_code& ec) {return detail::symlink_status(p, &ec);} - inline + inline bool exists(const path& p) {return exists(detail::status(p));} - inline + inline bool exists(const path& p, system::error_code& ec) {return exists(detail::status(p, &ec));} - inline + inline bool is_directory(const path& p) {return is_directory(detail::status(p));} - inline + inline bool is_directory(const path& p, system::error_code& ec) {return is_directory(detail::status(p, &ec));} - inline + inline bool is_regular_file(const path& p) {return is_regular_file(detail::status(p));} - inline + inline bool is_regular_file(const path& p, system::error_code& ec) {return is_regular_file(detail::status(p, &ec));} - inline + inline bool is_other(const path& p) {return is_other(detail::status(p));} - inline + inline bool is_other(const path& p, system::error_code& ec) {return is_other(detail::status(p, &ec));} inline bool is_symlink(const path& p) {return is_symlink(detail::symlink_status(p));} - inline + inline bool is_symlink(const path& p, system::error_code& ec) {return is_symlink(detail::symlink_status(p, &ec));} # ifndef BOOST_FILESYSTEM_NO_DEPRECATED @@ -330,7 +330,7 @@ namespace boost // in alphabetical order, unless otherwise noted // // // //--------------------------------------------------------------------------------------// - + // forward declarations path current_path(); // fwd declaration path initial_path(); @@ -367,7 +367,7 @@ namespace boost void copy(const path& from, const path& to) {detail::copy(from, to);} inline - void copy(const path& from, const path& to, system::error_code& ec) + void copy(const path& from, const path& to, system::error_code& ec) {detail::copy(from, to, &ec);} inline void copy_directory(const path& from, const path& to) @@ -500,7 +500,7 @@ namespace boost inline boost::uintmax_t remove_all(const path& p) {return detail::remove_all(p);} - + inline boost::uintmax_t remove_all(const path& p, system::error_code& ec) {return detail::remove_all(p, &ec);} @@ -517,10 +517,10 @@ namespace boost void resize_file(const path& p, uintmax_t size, system::error_code& ec) {detail::resize_file(p, size, &ec);} inline - space_info space(const path& p) {return detail::space(p);} + space_info space(const path& p) {return detail::space(p);} inline - space_info space(const path& p, system::error_code& ec) {return detail::space(p, &ec);} + space_info space(const path& p, system::error_code& ec) {return detail::space(p, &ec);} # ifndef BOOST_FILESYSTEM_NO_DEPRECATED inline bool symbolic_link_exists(const path& p) @@ -537,7 +537,7 @@ namespace boost path temp_directory_path() {return detail::temp_directory_path();} inline - path temp_directory_path(system::error_code& ec) + path temp_directory_path(system::error_code& ec) {return detail::temp_directory_path(&ec);} inline path unique_path(const path& p="%%%%-%%%%-%%%%-%%%%") @@ -552,7 +552,7 @@ namespace boost // // //--------------------------------------------------------------------------------------// -// GCC has a problem with a member function named path within a namespace or +// GCC has a problem with a member function named path within a namespace or // sub-namespace that also has a class named path. The workaround is to always // fully qualify the name path when it refers to the class name. @@ -593,12 +593,12 @@ public: file_status symlink_status() const {return m_get_symlink_status();} file_status symlink_status(system::error_code& ec) const {return m_get_symlink_status(&ec);} - bool operator==(const directory_entry& rhs) {return m_path == rhs.m_path;} - bool operator!=(const directory_entry& rhs) {return m_path != rhs.m_path;} - bool operator< (const directory_entry& rhs) {return m_path < rhs.m_path;} - bool operator<=(const directory_entry& rhs) {return m_path <= rhs.m_path;} - bool operator> (const directory_entry& rhs) {return m_path > rhs.m_path;} - bool operator>=(const directory_entry& rhs) {return m_path >= rhs.m_path;} + bool operator==(const directory_entry& rhs) {return m_path == rhs.m_path;} + bool operator!=(const directory_entry& rhs) {return m_path != rhs.m_path;} + bool operator< (const directory_entry& rhs) {return m_path < rhs.m_path;} + bool operator<=(const directory_entry& rhs) {return m_path <= rhs.m_path;} + bool operator> (const directory_entry& rhs) {return m_path > rhs.m_path;} + bool operator>=(const directory_entry& rhs) {return m_path >= rhs.m_path;} private: boost::filesystem::path m_path; @@ -625,7 +625,7 @@ namespace detail # if defined(BOOST_POSIX_API) , void *& buffer # endif - ); + ); struct dir_itr_imp { @@ -688,7 +688,7 @@ namespace detail ~directory_iterator() {} // never throws directory_iterator& increment(system::error_code& ec) - { + { detail::directory_iterator_increment(*this, &ec); return *this; } @@ -700,16 +700,16 @@ namespace detail friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_increment(directory_iterator& it, system::error_code* ec); - // std::shared_ptr provides shallow-copy semantics required for InputIterators. + // shared_ptr provides shallow-copy semantics required for InputIterators. // m_imp.get()==0 indicates the end iterator. - boost::std::shared_ptr< detail::dir_itr_imp > m_imp; + boost::shared_ptr< detail::dir_itr_imp > m_imp; friend class boost::iterator_core_access; boost::iterator_facade< directory_iterator, directory_entry, - boost::single_pass_traversal_tag >::reference dereference() const + boost::single_pass_traversal_tag >::reference dereference() const { BOOST_ASSERT_MSG(m_imp.get(), "attempt to dereference end iterator"); return m_imp->dir_entry; @@ -884,7 +884,7 @@ namespace detail } int level() const - { + { BOOST_ASSERT_MSG(m_imp.get(), "level() on end recursive_directory_iterator"); return m_imp->m_level; @@ -903,7 +903,7 @@ namespace detail # endif void pop() - { + { BOOST_ASSERT_MSG(m_imp.get(), "pop() on end recursive_directory_iterator"); m_imp->pop(); @@ -936,17 +936,17 @@ namespace detail private: - // std::shared_ptr provides shallow-copy semantics required for InputIterators. + // shared_ptr provides shallow-copy semantics required for InputIterators. // m_imp.get()==0 indicates the end iterator. - boost::std::shared_ptr< detail::recur_dir_itr_imp > m_imp; + boost::shared_ptr< detail::recur_dir_itr_imp > m_imp; friend class boost::iterator_core_access; - boost::iterator_facade< + boost::iterator_facade< recursive_directory_iterator, directory_entry, boost::single_pass_traversal_tag >::reference - dereference() const + dereference() const { BOOST_ASSERT_MSG(m_imp.get(), "dereference of end recursive_directory_iterator"); @@ -954,7 +954,7 @@ namespace detail } void increment() - { + { BOOST_ASSERT_MSG(m_imp.get(), "increment of end recursive_directory_iterator"); m_imp->increment(0); @@ -976,7 +976,7 @@ namespace detail // class filesystem_error // // // //--------------------------------------------------------------------------------------// - + class BOOST_SYMBOL_VISIBLE filesystem_error : public system::system_error { // see http://www.boost.org/more/error_handling.html for design rationale @@ -1009,7 +1009,7 @@ namespace detail } catch (...) { m_imp_ptr.reset(); } } - + filesystem_error( const std::string & what_arg, const path& path1_arg, const path& path2_arg, system::error_code ec) @@ -1075,7 +1075,7 @@ namespace detail path m_path2; // may be empty() std::string m_what; // not built until needed }; - boost::std::shared_ptr m_imp_ptr; + boost::shared_ptr m_imp_ptr; }; // test helper -----------------------------------------------------------------------// diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/filesystem/path.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/filesystem/path.hpp index 90aff04b..2dd1b00e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/filesystem/path.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/filesystem/path.hpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include @@ -62,11 +62,11 @@ namespace filesystem # ifdef BOOST_WINDOWS_API typedef wchar_t value_type; BOOST_STATIC_CONSTEXPR value_type preferred_separator = L'\\'; -# else +# else typedef char value_type; BOOST_STATIC_CONSTEXPR value_type preferred_separator = '/'; # endif - typedef std::basic_string string_type; + typedef std::basic_string string_type; typedef std::codecvt codecvt_type; @@ -89,7 +89,7 @@ namespace filesystem // // The path locale, which is global to the thread, can be changed by the // imbue() function. It is initialized to an implementation defined locale. - // + // // For Windows, wchar_t strings do not undergo conversion. char strings // are converted using the "ANSI" or "OEM" code pages, as determined by // the AreFileApisANSI() function, or, if a conversion argument is given, @@ -98,7 +98,7 @@ namespace filesystem // See m_pathname comments for further important rationale. // TODO: rules needed for operating systems that use / or . - // differently, or format directory paths differently from file paths. + // differently, or format directory paths differently from file paths. // // ********************************************************************************** // @@ -127,7 +127,7 @@ namespace filesystem // ----- constructors ----- - path(){} + path(){} path(const path& p) : m_pathname(p.m_pathname) {} @@ -159,7 +159,7 @@ namespace filesystem template path(InputIterator begin, InputIterator end) - { + { if (begin != end) { std::basic_string::value_type> @@ -170,7 +170,7 @@ namespace filesystem template path(InputIterator begin, InputIterator end, const codecvt_type& cvt) - { + { if (begin != end) { std::basic_string::value_type> @@ -225,7 +225,7 @@ namespace filesystem template path& assign(InputIterator begin, InputIterator end, const codecvt_type& cvt) - { + { m_pathname.clear(); if (begin != end) { @@ -270,13 +270,13 @@ namespace filesystem template path& concat(InputIterator begin, InputIterator end) - { + { return concat(begin, end, codecvt()); } template path& concat(InputIterator begin, InputIterator end, const codecvt_type& cvt) - { + { if (begin == end) return *this; std::basic_string::value_type> @@ -313,7 +313,7 @@ namespace filesystem template path& append(InputIterator begin, InputIterator end) - { + { return append(begin, end, codecvt()); } @@ -334,7 +334,7 @@ namespace filesystem void swap(path& rhs) { m_pathname.swap(rhs.m_pathname); } // ----- observers ----- - + // For operating systems that format file paths differently than directory // paths, return values from observers are formatted as file names unless there // is a trailing separator, in which case returns are formatted as directory @@ -364,16 +364,16 @@ namespace filesystem String string(const codecvt_type& cvt) const; # ifdef BOOST_WINDOWS_API - const std::string string() const { return string(codecvt()); } + const std::string string() const { return string(codecvt()); } const std::string string(const codecvt_type& cvt) const - { + { std::string tmp; if (!m_pathname.empty()) path_traits::convert(&*m_pathname.begin(), &*m_pathname.begin()+m_pathname.size(), tmp, cvt); return tmp; } - + // string_type is std::wstring, so there is no conversion const std::wstring& wstring() const { return m_pathname; } const std::wstring& wstring(const codecvt_type&) const { return m_pathname; } @@ -385,7 +385,7 @@ namespace filesystem const std::wstring wstring() const { return wstring(codecvt()); } const std::wstring wstring(const codecvt_type& cvt) const - { + { std::wstring tmp; if (!m_pathname.empty()) path_traits::convert(&*m_pathname.begin(), &*m_pathname.begin()+m_pathname.size(), @@ -404,8 +404,8 @@ namespace filesystem String generic_string(const codecvt_type& cvt) const; # ifdef BOOST_WINDOWS_API - const std::string generic_string() const { return generic_string(codecvt()); } - const std::string generic_string(const codecvt_type& cvt) const; + const std::string generic_string() const { return generic_string(codecvt()); } + const std::string generic_string(const codecvt_type& cvt) const; const std::wstring generic_wstring() const; const std::wstring generic_wstring(const codecvt_type&) const { return generic_wstring(); }; @@ -426,7 +426,7 @@ namespace filesystem // ----- decomposition ----- - path root_path() const; + path root_path() const; path root_name() const; // returns 0 or 1 element path // even on POSIX, root_name() is non-empty() for network paths path root_directory() const; // returns 0 or 1 element path @@ -455,7 +455,7 @@ namespace filesystem return has_root_directory(); # endif } - bool is_relative() const { return !is_absolute(); } + bool is_relative() const { return !is_absolute(); } // ----- iterators ----- @@ -489,7 +489,7 @@ namespace filesystem # if defined(BOOST_FILESYSTEM_DEPRECATED) // deprecated functions with enough signature or semantic changes that they are - // not supplied by default + // not supplied by default const std::string file_string() const { return string(); } const std::string directory_string() const { return string(); } const std::string native_file_string() const { return string(); } @@ -502,7 +502,7 @@ namespace filesystem //basic_path(const string_type& str, name_check) { operator/=(str); } //basic_path(const typename string_type::value_type* s, name_check) // { operator/=(s);} - //static bool default_name_check_writable() { return false; } + //static bool default_name_check_writable() { return false; } //static void default_name_check(name_check) {} //static name_check default_name_check() { return 0; } //basic_path& canonize(); @@ -529,7 +529,7 @@ namespace filesystem // slashes NOT converted to backslashes # if defined(_MSC_VER) # pragma warning(pop) // restore warning settings. -# endif +# endif string_type::size_type m_append_separator_if_needed(); // Returns: If separator is to be appended, m_pathname.size() before append. Otherwise 0. @@ -541,7 +541,7 @@ namespace filesystem path& m_normalize(); // Was qualified; como433beta8 reports: - // warning #427-D: qualified name is not allowed in member declaration + // warning #427-D: qualified name is not allowed in member declaration friend class iterator; friend bool operator<(const path& lhs, const path& rhs); @@ -565,7 +565,7 @@ namespace filesystem //------------------------------------------------------------------------------------// // class path::iterator // //------------------------------------------------------------------------------------// - + class path::iterator : public boost::iterator_facade< path::iterator, @@ -596,7 +596,7 @@ namespace filesystem // m_path_ptr->m_pathname. // if m_element is implicit dot, m_pos is the // position of the last separator in the path. - // end() iterator is indicated by + // end() iterator is indicated by // m_pos == m_path_ptr->m_pathname.size() }; // path::iterator @@ -611,15 +611,15 @@ namespace filesystem inline bool lexicographical_compare(path::iterator first1, path::iterator last1, path::iterator first2, path::iterator last2) { return detail::lex_compare(first1, last1, first2, last2) < 0; } - + inline bool operator==(const path& lhs, const path& rhs) {return lhs.compare(rhs) == 0;} - inline bool operator==(const path& lhs, const path::string_type& rhs) {return lhs.compare(rhs) == 0;} + inline bool operator==(const path& lhs, const path::string_type& rhs) {return lhs.compare(rhs) == 0;} inline bool operator==(const path::string_type& lhs, const path& rhs) {return rhs.compare(lhs) == 0;} inline bool operator==(const path& lhs, const path::value_type* rhs) {return lhs.compare(rhs) == 0;} inline bool operator==(const path::value_type* lhs, const path& rhs) {return rhs.compare(lhs) == 0;} - + inline bool operator!=(const path& lhs, const path& rhs) {return lhs.compare(rhs) != 0;} - inline bool operator!=(const path& lhs, const path::string_type& rhs) {return lhs.compare(rhs) != 0;} + inline bool operator!=(const path& lhs, const path::string_type& rhs) {return lhs.compare(rhs) != 0;} inline bool operator!=(const path::string_type& lhs, const path& rhs) {return rhs.compare(lhs) != 0;} inline bool operator!=(const path& lhs, const path::value_type* rhs) {return lhs.compare(rhs) != 0;} inline bool operator!=(const path::value_type* lhs, const path& rhs) {return rhs.compare(lhs) != 0;} @@ -658,7 +658,7 @@ namespace filesystem return os << boost::io::quoted(p.template string >(), static_cast('&')); } - + template inline std::basic_istream& operator>>(std::basic_istream& is, path& p) @@ -668,7 +668,7 @@ namespace filesystem p = str; return is; } - + // name_checks // These functions are holdovers from version 1. It isn't clear they have much @@ -680,14 +680,14 @@ namespace filesystem BOOST_FILESYSTEM_DECL bool portable_directory_name(const std::string & name); BOOST_FILESYSTEM_DECL bool portable_file_name(const std::string & name); BOOST_FILESYSTEM_DECL bool native(const std::string & name); - + //--------------------------------------------------------------------------------------// // class path member template implementation // //--------------------------------------------------------------------------------------// template path& path::append(InputIterator begin, InputIterator end, const codecvt_type& cvt) - { + { if (begin == end) return *this; string_type::size_type sep_pos(m_append_separator_if_needed()); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/format/alt_sstream.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/format/alt_sstream.hpp index d513d243..e236be35 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/format/alt_sstream.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/format/alt_sstream.hpp @@ -1,5 +1,5 @@ // ---------------------------------------------------------------------------- -// alt_sstream.hpp : alternative stringstream +// alt_sstream.hpp : alternative stringstream // ---------------------------------------------------------------------------- // Copyright Samuel Krempp 2003. Use, modification, and distribution are @@ -18,23 +18,23 @@ #include #include #include -#include +#include #include namespace boost { namespace io { - template, + template, class Alloc=::std::allocator > class basic_altstringbuf; - template, + template, class Alloc=::std::allocator > class basic_oaltstringstream; template - class basic_altstringbuf + class basic_altstringbuf : public ::std::basic_streambuf { typedef ::std::basic_streambuf streambuf_t; @@ -55,14 +55,14 @@ namespace boost { explicit basic_altstringbuf(std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) - : putend_(NULL), is_allocated_(false), mode_(mode) + : putend_(NULL), is_allocated_(false), mode_(mode) {} explicit basic_altstringbuf(const string_type& s, ::std::ios_base::openmode mode = ::std::ios_base::in | ::std::ios_base::out) - : putend_(NULL), is_allocated_(false), mode_(mode) + : putend_(NULL), is_allocated_(false), mode_(mode) { dealloc(); str(s); } - virtual ~basic_altstringbuf() + virtual ~basic_altstringbuf() { dealloc(); } using streambuf_t::pbase; using streambuf_t::pptr; @@ -70,36 +70,36 @@ namespace boost { using streambuf_t::eback; using streambuf_t::gptr; using streambuf_t::egptr; - + void clear_buffer(); void str(const string_type& s); // 0-copy access : - Ch * begin() const; + Ch * begin() const; size_type size() const; size_type cur_size() const; // stop at current pointer Ch * pend() const // the highest position reached by pptr() since creation { return ((putend_ < pptr()) ? pptr() : putend_); } - size_type pcount() const + size_type pcount() const { return static_cast( pptr() - pbase()) ;} // copy buffer to string : - string_type str() const + string_type str() const { return string_type(begin(), size()); } - string_type cur_str() const + string_type cur_str() const { return string_type(begin(), cur_size()); } protected: explicit basic_altstringbuf (basic_altstringbuf * s, - ::std::ios_base::openmode mode + ::std::ios_base::openmode mode = ::std::ios_base::in | ::std::ios_base::out) - : putend_(NULL), is_allocated_(false), mode_(mode) + : putend_(NULL), is_allocated_(false), mode_(mode) { dealloc(); str(s); } - virtual pos_type seekoff(off_type off, ::std::ios_base::seekdir way, - ::std::ios_base::openmode which + virtual pos_type seekoff(off_type off, ::std::ios_base::seekdir way, + ::std::ios_base::openmode which = ::std::ios_base::in | ::std::ios_base::out); - virtual pos_type seekpos (pos_type pos, - ::std::ios_base::openmode which + virtual pos_type seekpos (pos_type pos, + ::std::ios_base::openmode which = ::std::ios_base::in | ::std::ios_base::out); virtual int_type underflow(); virtual int_type pbackfail(int_type meta = compat_traits_type::eof()); @@ -117,53 +117,53 @@ namespace boost { // --- class basic_oaltstringstream ---------------------------------------- template - class basic_oaltstringstream - : private base_from_member< std::shared_ptr< basic_altstringbuf< Ch, Tr, Alloc> > >, + class basic_oaltstringstream + : private base_from_member< shared_ptr< basic_altstringbuf< Ch, Tr, Alloc> > >, public ::std::basic_ostream { - class No_Op { + class No_Op { // used as no-op deleter for (not-owner) shared_pointers - public: + public: template const T & operator()(const T & arg) { return arg; } }; typedef ::std::basic_ostream stream_t; - typedef boost::base_from_member > > + typedef boost::base_from_member > > pbase_type; typedef ::std::basic_string string_type; typedef typename string_type::size_type size_type; typedef basic_altstringbuf stringbuf_t; public: typedef Alloc allocator_type; - basic_oaltstringstream() - : pbase_type(new stringbuf_t), stream_t(rdbuf()) + basic_oaltstringstream() + : pbase_type(new stringbuf_t), stream_t(rdbuf()) { } - basic_oaltstringstream(::boost::std::shared_ptr buf) - : pbase_type(buf), stream_t(rdbuf()) + basic_oaltstringstream(::boost::shared_ptr buf) + : pbase_type(buf), stream_t(rdbuf()) { } - basic_oaltstringstream(stringbuf_t * buf) - : pbase_type(buf, No_Op() ), stream_t(rdbuf()) + basic_oaltstringstream(stringbuf_t * buf) + : pbase_type(buf, No_Op() ), stream_t(rdbuf()) { } - stringbuf_t * rdbuf() const + stringbuf_t * rdbuf() const { return pbase_type::member.get(); } - void clear_buffer() + void clear_buffer() { rdbuf()->clear_buffer(); } // 0-copy access : - Ch * begin() const + Ch * begin() const { return rdbuf()->begin(); } - size_type size() const + size_type size() const { return rdbuf()->size(); } size_type cur_size() const // stops at current position { return rdbuf()->cur_size(); } // copy buffer to string : string_type str() const // [pbase, epptr[ - { return rdbuf()->str(); } + { return rdbuf()->str(); } string_type cur_str() const // [pbase, pptr[ { return rdbuf()->cur_str(); } - void str(const string_type& s) + void str(const string_type& s) { rdbuf()->str(s); } }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/functional/hash/extensions.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/functional/hash/extensions.hpp index 2144e057..998c08e4 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/functional/hash/extensions.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/functional/hash/extensions.hpp @@ -5,7 +5,7 @@ // Based on Peter Dimov's proposal // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf -// issue 6.18. +// issue 6.18. // This implements the extensions to the standard. // It's undocumented, so you shouldn't use it.... @@ -358,12 +358,12 @@ namespace boost } }; }; - + template struct hash_impl_msvc2 : public hash_impl_msvc::value> ::BOOST_NESTED_TEMPLATE inner {}; - + template <> struct hash_impl { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/get_pointer.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/get_pointer.hpp index 7399d199..b27b98a6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/get_pointer.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/get_pointer.hpp @@ -9,11 +9,11 @@ // In order to avoid circular dependencies with Boost.TR1 // we make sure that our include of doesn't try to -// pull in the TR1 headers: that's why we use this header +// pull in the TR1 headers: that's why we use this header // rather than including directly: #include // std::auto_ptr -namespace boost { +namespace boost { // get_pointer(p) extracts a ->* capable pointer from p @@ -22,7 +22,7 @@ template T * get_pointer(T * p) return p; } -// get_pointer(std::shared_ptr const & p) has been moved to std::shared_ptr.hpp +// get_pointer(shared_ptr const & p) has been moved to shared_ptr.hpp template T * get_pointer(std::auto_ptr const& p) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/io_error.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/io_error.hpp index e74ca47a..5ea79c58 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/io_error.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/io_error.hpp @@ -1,6 +1,6 @@ /* Copyright 2005-2007 Adobe Systems Incorporated - + Use, modification and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). @@ -20,7 +20,7 @@ #include #include "../../gil_config.hpp" -#include +#include namespace boost { namespace gil { @@ -30,7 +30,7 @@ inline void io_error_if(bool expr, const char* descr="") { if (expr) io_error(de namespace detail { class file_mgr { protected: - std::shared_ptr _fp; + shared_ptr _fp; struct null_deleter { void operator()(void const*) const {} }; file_mgr(FILE* file) : _fp(file, null_deleter()) {} @@ -38,7 +38,7 @@ namespace detail { file_mgr(const char* filename, const char* flags) { FILE* fp; io_error_if((fp=fopen(filename,flags))==NULL, "file_mgr: failed to open file"); - _fp=std::shared_ptr(fp,fclose); + _fp=shared_ptr(fp,fclose); } public: diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/jpeg_dynamic_io.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/jpeg_dynamic_io.hpp index 3140e728..b1108fe8 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/jpeg_dynamic_io.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/jpeg_dynamic_io.hpp @@ -1,6 +1,6 @@ /* Copyright 2005-2007 Adobe Systems Incorporated - + Use, modification and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include "../dynamic_image/dynamic_image_all.hpp" #include "io_error.hpp" @@ -43,7 +43,7 @@ struct jpeg_write_is_supported { class jpeg_writer_dynamic : public jpeg_writer { int _quality; -public: +public: jpeg_writer_dynamic(FILE* file, int quality=100) : jpeg_writer(file) , _quality(quality) {} jpeg_writer_dynamic(const char* filename, int quality=100) : jpeg_writer(filename), _quality(quality) {} @@ -74,7 +74,7 @@ class jpeg_reader_dynamic : public jpeg_reader { public: jpeg_reader_dynamic(FILE* file) : jpeg_reader(file) {} jpeg_reader_dynamic(const char* filename) : jpeg_reader(filename){} - + template void read_image(any_image& im) { if (!construct_matched(im,detail::jpeg_type_format_checker(_cinfo.out_color_space))) { @@ -110,7 +110,7 @@ inline void jpeg_read_image(const std::string& filename,any_image& im) { /// \ingroup JPEG_IO /// \brief Saves the currently instantiated view to a jpeg file specified by the given jpeg image file name. -/// Throws std::ios_base::failure if the currently instantiated view type is not supported for writing by the I/O extension +/// Throws std::ios_base::failure if the currently instantiated view type is not supported for writing by the I/O extension /// or if it fails to create the file. template inline void jpeg_write_view(const char* filename,const any_image_view& runtime_view) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/jpeg_io.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/jpeg_io.hpp index bdeb56d5..b9adc023 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/jpeg_io.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/jpeg_io.hpp @@ -1,6 +1,6 @@ /* Copyright 2005-2007 Adobe Systems Incorporated - + Use, modification and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). @@ -24,7 +24,7 @@ #include #include #include -#include +#include extern "C" { #include } @@ -64,7 +64,7 @@ inline point2 jpeg_read_dimensions(const std::string& filename) /// \ingroup JPEG_IO /// \brief Loads the image specified by the given jpeg image file name into the given view. /// Triggers a compile assert if the view color space and channel depth are not supported by the JPEG library or by the I/O extension. -/// Throws std::ios_base::failure if the file is not a valid JPEG file, or if its color space or channel depth are not +/// Throws std::ios_base::failure if the file is not a valid JPEG file, or if its color space or channel depth are not /// compatible with the ones specified by View, or if its dimensions don't match the ones of the view. template inline void jpeg_read_view(const char* filename,const View& view) { @@ -84,7 +84,7 @@ inline void jpeg_read_view(const std::string& filename,const View& view) { /// \ingroup JPEG_IO /// \brief Allocates a new image whose dimensions are determined by the given jpeg image file, and loads the pixels into it. /// Triggers a compile assert if the image color space or channel depth are not supported by the JPEG library or by the I/O extension. -/// Throws std::ios_base::failure if the file is not a valid JPEG file, or if its color space or channel depth are not +/// Throws std::ios_base::failure if the file is not a valid JPEG file, or if its color space or channel depth are not /// compatible with the ones specified by Image template inline void jpeg_read_image(const char* filename,Image& im) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/png_dynamic_io.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/png_dynamic_io.hpp index 616e2029..a3a25a97 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/png_dynamic_io.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/gil/extension/io/png_dynamic_io.hpp @@ -1,6 +1,6 @@ /* Copyright 2005-2007 Adobe Systems Incorporated - + Use, modification and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include "../dynamic_image/dynamic_image_all.hpp" #include "io_error.hpp" #include "png_io.hpp" @@ -81,7 +81,7 @@ class png_reader_dynamic : public png_reader { public: png_reader_dynamic(FILE* file) : png_reader(file) {} png_reader_dynamic(const char* filename) : png_reader(filename){} - + template void read_image(any_image& im) { png_uint_32 width, height; @@ -99,7 +99,7 @@ public: } }; -} // namespace detail +} // namespace detail /// \ingroup PNG_IO /// \brief reads a PNG image into a run-time instantiated image @@ -121,7 +121,7 @@ inline void png_read_image(const std::string& filename,any_image& im) { /// \ingroup PNG_IO /// \brief Saves the currently instantiated view to a png file specified by the given png image file name. -/// Throws std::ios_base::failure if the currently instantiated view type is not supported for writing by the I/O extension +/// Throws std::ios_base::failure if the currently instantiated view type is not supported for writing by the I/O extension /// or if it fails to create the file. template inline void png_write_view(const char* filename,const any_image_view& runtime_view) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/detail/self_avoiding_walk.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/detail/self_avoiding_walk.hpp index bd02797f..c171897f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/detail/self_avoiding_walk.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/detail/self_avoiding_walk.hpp @@ -10,19 +10,19 @@ #define BOOST_SELF_AVOIDING_WALK_HPP /* - This file defines necessary components for SAW. + This file defines necessary components for SAW. mesh language: (defined by myself to clearify what is what) A triangle in mesh is called an triangle. - An edge in mesh is called an line. + An edge in mesh is called an line. A vertex in mesh is called a point. A triangular mesh corresponds to a graph in which a vertex is a - triangle and an edge(u, v) stands for triangle u and triangle v + triangle and an edge(u, v) stands for triangle u and triangle v share an line. After this point, a vertex always refers to vertex in graph, - therefore it is a traingle in mesh. + therefore it is a traingle in mesh. */ @@ -43,7 +43,7 @@ namespace boost { triple(const T1& a, const T2& b, const T3& c) : first(a), second(b), third(c) {} triple() : first(SAW_SENTINAL), second(SAW_SENTINAL), third(SAW_SENTINAL) {} }; - + typedef triple Triple; /* Define a vertex property which has a triangle inside. Triangle is @@ -70,14 +70,14 @@ namespace boost { if ( a.second == b.second || a.second == b.third ) l.second = a.second; else if ( a.third == b.second || a.third == b.third ) - l.second = a.third; + l.second = a.third; } else if ( a.first == b.second ) { l.first = a.first; if ( a.second == b.third ) l.second = a.second; else if ( a.third == b.third ) - l.second = a.third; + l.second = a.third; } else if ( a.first == b.third ) { l.first = a.first; @@ -90,17 +90,17 @@ namespace boost { } else if ( a.second == b.second ) { l.first = a.second; - if ( a.third == b.third ) + if ( a.third == b.third ) l.second = a.third; } else if ( a.second == b.third ) { l.first = a.second; - } else if ( a.third == b.first - || a.third == b.second + } else if ( a.third == b.first + || a.third == b.second || a.third == b.third ) - l.first = a.third; + l.first = a.third; /*Make it in order*/ if ( l.first > l.second ) { @@ -132,7 +132,7 @@ namespace boost { } TriangleDecorator td; }; - + /* HList has to be a handle of data holder so that pass-by-value is * in right logic. * @@ -146,7 +146,7 @@ namespace boost { : public bfs_visitor<>, public dfs_visitor<> { typedef typename boost::property_traits::value_type iter; - /*use boost std::shared_ptr*/ + /*use boost shared_ptr*/ typedef typename HList::element_type::value_type::second_type Line; public: @@ -176,12 +176,12 @@ namespace boost { using std::make_pair; typedef typename boost::graph_traits::vertex_descriptor Vertex; Vertex tau = target(e, G); - Vertex i = source(e, G); + Vertex i = source(e, G); get_vertex_sharing get_sharing_line(td); - + Line tau_i = get_sharing_line(tau, i); - + iter w_end = hlist->end(); iter w_i = iter_d[i]; @@ -197,7 +197,7 @@ namespace boost { *b w(i) |- w(i+1) w(i) ~> w(i+1) or no w(i+1) yet *---------------------------------------------------------- */ - + bool a = false, b = false; --w_i_m_1; @@ -206,13 +206,13 @@ namespace boost { if ( w_i_m_1 != w_end ) { a = ( w_i_m_1->second.first != SAW_SENTINAL ); - } - + } + if ( a ) { - + if ( b ) { - /*Case 1: - + /*Case 1: + w(i-1) |- w(i) |- w(i+1) */ Line l1 = get_sharing_line(*w_i_m_1, tau); @@ -221,7 +221,7 @@ namespace boost { --w_i_m_2; bool c = true; - + if ( w_i_m_2 != w_end ) { c = w_i_m_2->second != l1; } @@ -230,11 +230,11 @@ namespace boost { /*extension: w(i-1) -> tau |- w(i) */ w_i_m_1->second = l1; /*insert(pos, const T&) is to insert before pos*/ - iter_d[tau] = hlist->insert(w_i, make_pair(tau, tau_i)); - + iter_d[tau] = hlist->insert(w_i, make_pair(tau, tau_i)); + } else { /* w(i-1) ^ tau == w(i-2) ^ w(i-1) */ /*must be w(i-2) ~> w(i-1) */ - + bool d = true; //need to handle the case when w_i_p_1 is null Line l3 = get_sharing_line(*w_i_p_1, tau); @@ -261,15 +261,15 @@ namespace boost { ; } } - + } - } else { + } else { /*Case 2: - + w(i-1) |- w(i) ~> w(1+1) */ - - if ( w_i->second.second == tau_i.first + + if ( w_i->second.second == tau_i.first || w_i->second.second == tau_i.second ) { /*w(i) ^ w(i+1) < w(i) ^ tau*/ /*extension: w(i) |- tau -> w(i+1) */ w_i->second = tau_i; @@ -296,23 +296,23 @@ namespace boost { iter_d[w_i_m_1->first] = hlist->insert(w_i_p_1, *w_i_m_1); hlist->erase(w_i_m_1); } - - } - + + } + } - + } else { - + if ( b ) { /*Case 3: - + w(i-1) ~> w(i) |- w(i+1) */ bool c = false; if ( w_i_m_1 != w_end ) c = ( w_i_m_1->second.second == tau_i.first) || ( w_i_m_1->second.second == tau_i.second); - + if ( c ) { /*w(i-1) ^ w(i) < w(i) ^ tau*/ /* extension: w(i-1) -> tau |- w(i) */ if ( w_i_m_1 != w_end ) @@ -336,7 +336,7 @@ namespace boost { /*extension: w(i-1) -> w(i+1) |- w(i) |- tau -> w(i+2) */ iter w_i_p_2 = w_i_p_1; ++w_i_p_2; - + w_i_p_1->second = w_i->second; iter_d[i] = hlist->insert(w_i_p_2, make_pair(i, tau_i)); hlist->erase(w_i); @@ -344,16 +344,16 @@ namespace boost { iter_d[tau] = hlist->insert(w_i_p_2, make_pair(tau, l2)); } } - + } else { /*Case 4: - + w(i-1) ~> w(i) ~> w(i+1) - + */ bool c = false; if ( w_i_m_1 != w_end ) { - c = (w_i_m_1->second.second == tau_i.first) + c = (w_i_m_1->second.second == tau_i.first) || (w_i_m_1->second.second == tau_i.second); } if ( c ) { /*w(i-1) ^ w(i) < w(i) ^ tau */ @@ -361,48 +361,48 @@ namespace boost { if ( w_i_m_1 != w_end ) w_i_m_1->second = get_sharing_line(*w_i_m_1, tau); iter_d[tau] = hlist->insert(w_i, make_pair(tau, tau_i)); - } else { + } else { /*extension: w(i) |- tau -> w(i+1) */ w_i->second = tau_i; Line l1; l1.first = SAW_SENTINAL; l1.second = SAW_SENTINAL; - if ( w_i_p_1 != w_end ) + if ( w_i_p_1 != w_end ) l1 = get_sharing_line(*w_i_p_1, tau); iter_d[tau] = hlist->insert(w_i_p_1, make_pair(tau, l1)); } } - + } return true; } - + protected: TriangleDecorator td; /*a decorator for vertex*/ HList hlist; /*This must be a handle of list to record the SAW The element type of the list is pair */ - - IteratorD iter_d; + + IteratorD iter_d; /*Problem statement: Need a fast access to w for triangle i. - *Possible solution: mantain an array to record. - iter_d[i] will return an iterator + *Possible solution: mantain an array to record. + iter_d[i] will return an iterator which points to w(i), where i is a vertex representing triangle i. */ }; template - inline + inline SAW_visitor visit_SAW(Triangle t, HList hl, Iterator i) { return SAW_visitor(t, hl, i); } template - inline + inline SAW_visitor< random_access_iterator_property_map, HList, random_access_iterator_property_map > visit_SAW_ptr(Tri* t, HList hl, Iter* i) { @@ -412,7 +412,7 @@ namespace boost { } // should also have combo's of pointers, and also const :( - + } #endif /*BOOST_SAW_H*/ diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/detail/mpi_process_group.ipp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/detail/mpi_process_group.ipp index 75a02fe2..a4d35462 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/detail/mpi_process_group.ipp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/detail/mpi_process_group.ipp @@ -40,7 +40,7 @@ namespace boost { namespace graph { namespace distributed { struct mpi_process_group::impl { - + typedef mpi_process_group::message_header message_header; typedef mpi_process_group::outgoing_messages outgoing_messages; @@ -71,7 +71,7 @@ struct mpi_process_group::impl std::size_t batch_header_number; std::size_t batch_buffer_size; std::size_t batch_message_size; - + /** * The actual MPI communicator used to transmit data. */ @@ -90,19 +90,19 @@ struct mpi_process_group::impl /// The numbers of processors that have entered a synchronization stage std::vector processors_synchronizing_stage; - + /// The synchronization stage of a processor std::vector synchronizing_stage; /// Number of processors still sending messages std::vector synchronizing_unfinished; - + /// Number of batches sent since last synchronization stage std::vector number_sent_batches; - + /// Number of batches received minus number of expected batches std::vector number_received_batches; - + /// The context of the currently-executing trigger, or @c trc_none /// if no trigger is executing. @@ -124,7 +124,7 @@ struct mpi_process_group::impl /// The MPI requests for posted sends of oob messages std::vector requests; - + /// The MPI buffers for posted irecvs of oob messages std::map buffers; @@ -144,14 +144,14 @@ struct mpi_process_group::impl std::stack free_batches; void free_sent_batches(); - + // Tag allocator detail::tag_allocator allocated_tags; impl(std::size_t num_headers, std::size_t buffers_size, communicator_type parent_comm); ~impl(); - + private: void set_batch_size(std::size_t header_num, std::size_t buffer_sz); }; @@ -175,7 +175,7 @@ mpi_process_group::send_impl(int dest, int tag, const T& value, header.source = process_id(*this); header.tag = tag; header.offset = outgoing.buffer.size(); - + boost::mpi::packed_oarchive oa(impl_->comm, outgoing.buffer); oa << value; @@ -237,7 +237,7 @@ send(const mpi_process_group& pg, mpi_process_group::process_id_type dest, int tag, const T values[], std::size_t n) { pg.send_impl(dest, pg.encode_tag(pg.my_block_number(), tag), - boost::serialization::make_array(values,n), + boost::serialization::make_array(values,n), boost::mpl::true_()); } @@ -279,7 +279,7 @@ typename disable_if, void>::type send(const mpi_process_group& pg, mpi_process_group::process_id_type dest, int tag, const T values[], std::size_t n) { - pg.array_send_impl(dest, pg.encode_tag(pg.my_block_number(), tag), + pg.array_send_impl(dest, pg.encode_tag(pg.my_block_number(), tag), values, n); } @@ -316,7 +316,7 @@ mpi_process_group::receive_impl(int source, int tag, T& value, // Unpack the data if (header->bytes > 0) { - boost::mpi::packed_iarchive ia(impl_->comm, incoming.buffer, + boost::mpi::packed_iarchive ia(impl_->comm, incoming.buffer, archive::no_header, header->offset); ia >> value; } @@ -364,7 +364,7 @@ mpi_process_group::receive_impl(int source, int tag, T& value, if (header == incoming.headers.end()) return false; // Deserialize the data - boost::mpi::packed_iarchive in(impl_->comm, incoming.buffer, + boost::mpi::packed_iarchive in(impl_->comm, incoming.buffer, archive::no_header, header->offset); in >> value; @@ -411,7 +411,7 @@ array_receive_impl(int source, int tag, T* values, std::size_t& n) const if (header == incoming.headers.end()) return false; // Deserialize the data - boost::mpi::packed_iarchive in(impl_->comm, incoming.buffer, + boost::mpi::packed_iarchive in(impl_->comm, incoming.buffer, archive::no_header, header->offset); std::size_t num_sent; in >> num_sent; @@ -455,7 +455,7 @@ template void mpi_process_group::trigger(int tag, const Handler& handler) { BOOST_ASSERT(block_num); - install_trigger(tag,my_block_number(),std::shared_ptr( + install_trigger(tag,my_block_number(),shared_ptr( new trigger_launcher(*this, tag, handler))); } @@ -463,28 +463,28 @@ template void mpi_process_group::trigger_with_reply(int tag, const Handler& handler) { BOOST_ASSERT(block_num); - install_trigger(tag,my_block_number(),std::shared_ptr( + install_trigger(tag,my_block_number(),shared_ptr( new reply_trigger_launcher(*this, tag, handler))); } template -void mpi_process_group::global_trigger(int tag, const Handler& handler, +void mpi_process_group::global_trigger(int tag, const Handler& handler, std::size_t sz) { if (sz==0) // normal trigger - install_trigger(tag,0,std::shared_ptr( + install_trigger(tag,0,shared_ptr( new global_trigger_launcher(*this, tag, handler))); else // trigger with irecv - install_trigger(tag,0,std::shared_ptr( + install_trigger(tag,0,shared_ptr( new global_irecv_trigger_launcher(*this, tag, handler,sz))); - + } namespace detail { template void do_oob_receive(mpi_process_group const& self, - int source, int tag, Type& data, mpl::true_ /*is_mpi_datatype*/) + int source, int tag, Type& data, mpl::true_ /*is_mpi_datatype*/) { using boost::mpi::get_mpi_datatype; @@ -495,7 +495,7 @@ void do_oob_receive(mpi_process_group const& self, template void do_oob_receive(mpi_process_group const& self, - int source, int tag, Type& data, mpl::false_ /*is_mpi_datatype*/) + int source, int tag, Type& data, mpl::false_ /*is_mpi_datatype*/) { // self.impl_->comm.recv(source,tag,data); // Receive the size of the data packet @@ -521,7 +521,7 @@ void do_oob_receive(mpi_process_group const& self, } template -void do_oob_receive(mpi_process_group const& self, int source, int tag, Type& data) +void do_oob_receive(mpi_process_group const& self, int source, int tag, Type& data) { do_oob_receive(self, source, tag, data, boost::mpi::is_mpi_datatype()); @@ -532,13 +532,13 @@ void do_oob_receive(mpi_process_group const& self, int source, int tag, Type& da template -void +void mpi_process_group::trigger_launcher:: -receive(mpi_process_group const&, int source, int tag, +receive(mpi_process_group const&, int source, int tag, trigger_receive_context context, int block) const { #ifdef PBGL_PROCESS_GROUP_DEBUG - std::cerr << (out_of_band? "OOB trigger" : "Trigger") + std::cerr << (out_of_band? "OOB trigger" : "Trigger") << " receive from source " << source << " and tag " << tag << " in block " << (block == -1 ? self.my_block_number() : block) << std::endl; #endif @@ -560,13 +560,13 @@ receive(mpi_process_group const&, int source, int tag, } template -void +void mpi_process_group::reply_trigger_launcher:: -receive(mpi_process_group const&, int source, int tag, +receive(mpi_process_group const&, int source, int tag, trigger_receive_context context, int block) const { #ifdef PBGL_PROCESS_GROUP_DEBUG - std::cerr << (out_of_band? "OOB reply trigger" : "Reply trigger") + std::cerr << (out_of_band? "OOB reply trigger" : "Reply trigger") << " receive from source " << source << " and tag " << tag << " in block " << (block == -1 ? self.my_block_number() : block) << std::endl; #endif @@ -581,18 +581,18 @@ receive(mpi_process_group const&, int source, int tag, // Pass the message off to the handler and send the result back to // the source. - send_oob(self, source, data.first, + send_oob(self, source, data.first, handler(source, tag, data.second, context), -2); } template -void +void mpi_process_group::global_trigger_launcher:: -receive(mpi_process_group const& self, int source, int tag, +receive(mpi_process_group const& self, int source, int tag, trigger_receive_context context, int block) const { #ifdef PBGL_PROCESS_GROUP_DEBUG - std::cerr << (out_of_band? "OOB trigger" : "Trigger") + std::cerr << (out_of_band? "OOB trigger" : "Trigger") << " receive from source " << source << " and tag " << tag << " in block " << (block == -1 ? self.my_block_number() : block) << std::endl; #endif @@ -615,13 +615,13 @@ receive(mpi_process_group const& self, int source, int tag, template -void +void mpi_process_group::global_irecv_trigger_launcher:: -receive(mpi_process_group const& self, int source, int tag, +receive(mpi_process_group const& self, int source, int tag, trigger_receive_context context, int block) const { #ifdef PBGL_PROCESS_GROUP_DEBUG - std::cerr << (out_of_band? "OOB trigger" : "Trigger") + std::cerr << (out_of_band? "OOB trigger" : "Trigger") << " receive from source " << source << " and tag " << tag << " in block " << (block == -1 ? self.my_block_number() : block) << std::endl; #endif @@ -644,12 +644,12 @@ receive(mpi_process_group const& self, int source, int tag, template -void +void mpi_process_group::global_irecv_trigger_launcher:: prepare_receive(mpi_process_group const& self, int tag, bool force) const { #ifdef PBGL_PROCESS_GROUP_DEBUG - std::cerr << ("Posting Irecv for trigger") + std::cerr << ("Posting Irecv for trigger") << " receive with tag " << tag << std::endl; #endif if (self.impl_->buffers.find(tag) == self.impl_->buffers.end()) { @@ -657,7 +657,7 @@ prepare_receive(mpi_process_group const& self, int tag, bool force) const force = true; } BOOST_ASSERT(static_cast(self.impl_->buffers[tag].size()) >= buffer_size); - + //BOOST_MPL_ASSERT(mpl::not_ >); if (force) { self.impl_->requests.push_back(MPI_Request()); @@ -681,8 +681,8 @@ receive(const mpi_process_group& pg, int tag, T& value) } template -typename - enable_if, +typename + enable_if, std::pair >::type receive(const mpi_process_group& pg, int tag, T values[], std::size_t n) { @@ -691,15 +691,15 @@ receive(const mpi_process_group& pg, int tag, T values[], std::size_t n) pg.receive_impl(source, pg.encode_tag(pg.my_block_number(), tag), boost::serialization::make_array(values,n), boost::mpl::true_()); - if (result) + if (result) return std::make_pair(source, n); } BOOST_ASSERT(false); } template -typename - disable_if, +typename + disable_if, std::pair >::type receive(const mpi_process_group& pg, int tag, T values[], std::size_t n) { @@ -730,14 +730,14 @@ receive(const mpi_process_group& pg, } template -typename - enable_if, +typename + enable_if, std::pair >::type -receive(const mpi_process_group& pg, int source, int tag, T values[], +receive(const mpi_process_group& pg, int source, int tag, T values[], std::size_t n) { if (pg.receive_impl(source, pg.encode_tag(pg.my_block_number(), tag), - boost::serialization::make_array(values,n), + boost::serialization::make_array(values,n), boost::mpl::true_())) return std::make_pair(source,n); else { @@ -751,10 +751,10 @@ receive(const mpi_process_group& pg, int source, int tag, T values[], } template -typename - disable_if, +typename + disable_if, std::pair >::type -receive(const mpi_process_group& pg, int source, int tag, T values[], +receive(const mpi_process_group& pg, int source, int tag, T values[], std::size_t n) { pg.array_receive_impl(source, pg.encode_tag(pg.my_block_number(), tag), @@ -775,7 +775,7 @@ all_reduce(const mpi_process_group& pg, T* first, T* last, T* out, if (inplace) out = new T [last-first]; boost::mpi::all_reduce(boost::mpi::communicator(communicator(pg), - boost::mpi::comm_attach), + boost::mpi::comm_attach), first, last-first, out, bin_op); if (inplace) { @@ -789,10 +789,10 @@ all_reduce(const mpi_process_group& pg, T* first, T* last, T* out, template void -broadcast(const mpi_process_group& pg, T& val, +broadcast(const mpi_process_group& pg, T& val, mpi_process_group::process_id_type root) { - // broadcast the seed + // broadcast the seed boost::mpi::communicator comm(communicator(pg),boost::mpi::comm_attach); boost::mpi::broadcast(comm,val,root); } @@ -914,7 +914,7 @@ Receiver* mpi_process_group::get_receiver() template typename enable_if >::type -receive_oob(const mpi_process_group& pg, +receive_oob(const mpi_process_group& pg, mpi_process_group::process_id_type source, int tag, T& value, int block) { using boost::mpi::get_mpi_datatype; @@ -926,8 +926,8 @@ receive_oob(const mpi_process_group& pg, // Post a non-blocking receive that waits until we complete this request. MPI_Request request; - MPI_Irecv(&value, 1, get_mpi_datatype(value), - source, actual.second, actual.first, &request); + MPI_Irecv(&value, 1, get_mpi_datatype(value), + source, actual.second, actual.first, &request); int done = 0; do { @@ -939,7 +939,7 @@ receive_oob(const mpi_process_group& pg, template typename disable_if >::type -receive_oob(const mpi_process_group& pg, +receive_oob(const mpi_process_group& pg, mpi_process_group::process_id_type source, int tag, T& value, int block) { // Determine the actual message we expect to receive, and which @@ -967,11 +967,11 @@ receive_oob(const mpi_process_group& pg, MPI_Get_count(&mpi_status, MPI_PACKED, &size); in.resize(size); #endif - + // Receive the message data MPI_Recv(in.address(), in.size(), MPI_PACKED, status->source(), status->tag(), actual.first, MPI_STATUS_IGNORE); - + // Unpack the message data in >> value; } @@ -979,7 +979,7 @@ receive_oob(const mpi_process_group& pg, template typename enable_if >::type -send_oob_with_reply(const mpi_process_group& pg, +send_oob_with_reply(const mpi_process_group& pg, mpi_process_group::process_id_type dest, int tag, const SendT& send_value, ReplyT& reply_value, int block) @@ -992,14 +992,14 @@ send_oob_with_reply(const mpi_process_group& pg, template typename disable_if >::type -send_oob_with_reply(const mpi_process_group& pg, +send_oob_with_reply(const mpi_process_group& pg, mpi_process_group::process_id_type dest, int tag, const SendT& send_value, ReplyT& reply_value, int block) { detail::tag_allocator::token reply_tag = pg.impl_->allocated_tags.get_tag(); - send_oob(pg, dest, tag, - boost::parallel::detail::make_untracked_pair((int)reply_tag, + send_oob(pg, dest, tag, + boost::parallel::detail::make_untracked_pair((int)reply_tag, send_value), block); receive_oob(pg, dest, reply_tag, reply_value); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/mpi_process_group.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/mpi_process_group.hpp index 57bbfbbc..e0ee5790 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/mpi_process_group.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/mpi_process_group.hpp @@ -20,7 +20,7 @@ #define SEND_OOB_BSEND #include -#include +#include #include #include #include @@ -48,7 +48,7 @@ class mpi_process_group * The type of a "receive" handler, that will be provided with * (source, tag) pairs when a message is received. Users can provide a * receive handler for a distributed data structure, for example, to - * automatically pick up and respond to messages as needed. + * automatically pick up and respond to messages as needed. */ typedef function receiver_type; @@ -75,7 +75,7 @@ class mpi_process_group /// Classification of the capabilities of this process group struct communication_category - : virtual parallel::bsp_process_group_tag, + : virtual parallel::bsp_process_group_tag, virtual mpi_process_group_tag { }; // TBD: We can eliminate the "source" field and possibly the @@ -92,7 +92,7 @@ class mpi_process_group /// The length of the message in the buffer, in bytes std::size_t bytes; - + template void serialize(Archive& ar, int) { @@ -113,14 +113,14 @@ class mpi_process_group std::vector headers; buffer_type buffer; - + template void serialize(Archive& ar, int) { ar & headers & buffer; } - - void swap(outgoing_messages& x) + + void swap(outgoing_messages& x) { headers.swap(x.headers); buffer.swap(x.buffer); @@ -137,21 +137,21 @@ private: public: explicit trigger_base(int tag) : tag_(tag) { } - /// Retrieve the tag associated with this trigger + /// Retrieve the tag associated with this trigger int tag() const { return tag_; } virtual ~trigger_base() { } /** - * Invoked to receive a message that matches a particular trigger. + * Invoked to receive a message that matches a particular trigger. * * @param source the source of the message * @param tag the (local) tag of the message * @param context the context under which the trigger is being * invoked */ - virtual void - receive(mpi_process_group const& pg, int source, int tag, + virtual void + receive(mpi_process_group const& pg, int source, int tag, trigger_receive_context context, int block=-1) const = 0; protected: @@ -162,19 +162,19 @@ private: /** * Launches a specific handler in response to a trigger. This * function object wraps up the handler function object and a buffer - * for incoming data. + * for incoming data. */ template class trigger_launcher : public trigger_base { public: - explicit trigger_launcher(mpi_process_group& self, int tag, - const Handler& handler) - : trigger_base(tag), self(self), handler(handler) + explicit trigger_launcher(mpi_process_group& self, int tag, + const Handler& handler) + : trigger_base(tag), self(self), handler(handler) {} - void - receive(mpi_process_group const& pg, int source, int tag, + void + receive(mpi_process_group const& pg, int source, int tag, trigger_receive_context context, int block=-1) const; private: @@ -191,13 +191,13 @@ private: class reply_trigger_launcher : public trigger_base { public: - explicit reply_trigger_launcher(mpi_process_group& self, int tag, - const Handler& handler) - : trigger_base(tag), self(self), handler(handler) + explicit reply_trigger_launcher(mpi_process_group& self, int tag, + const Handler& handler) + : trigger_base(tag), self(self), handler(handler) {} - void - receive(mpi_process_group const& pg, int source, int tag, + void + receive(mpi_process_group const& pg, int source, int tag, trigger_receive_context context, int block=-1) const; private: @@ -209,14 +209,14 @@ private: class global_trigger_launcher : public trigger_base { public: - explicit global_trigger_launcher(mpi_process_group& self, int tag, - const Handler& handler) - : trigger_base(tag), handler(handler) - { + explicit global_trigger_launcher(mpi_process_group& self, int tag, + const Handler& handler) + : trigger_base(tag), handler(handler) + { } - void - receive(mpi_process_group const& pg, int source, int tag, + void + receive(mpi_process_group const& pg, int source, int tag, trigger_receive_context context, int block=-1) const; private: @@ -229,15 +229,15 @@ private: class global_irecv_trigger_launcher : public trigger_base { public: - explicit global_irecv_trigger_launcher(mpi_process_group& self, int tag, - const Handler& handler, int sz) + explicit global_irecv_trigger_launcher(mpi_process_group& self, int tag, + const Handler& handler, int sz) : trigger_base(tag), handler(handler), buffer_size(sz) - { + { prepare_receive(self,tag); } - void - receive(mpi_process_group const& pg, int source, int tag, + void + receive(mpi_process_group const& pg, int source, int tag, trigger_receive_context context, int block=-1) const; private: @@ -249,32 +249,32 @@ private: }; public: - /** + /** * Construct a new BSP process group from an MPI communicator. The * MPI communicator will be duplicated to create a new communicator * for this process group to use. */ mpi_process_group(communicator_type parent_comm = communicator_type()); - /** + /** * Construct a new BSP process group from an MPI communicator. The * MPI communicator will be duplicated to create a new communicator * for this process group to use. This constructor allows to tune the * size of message batches. - * + * * @param num_headers The maximum number of headers in a message batch * * @param buffer_size The maximum size of the message buffer in a batch. * */ - mpi_process_group( std::size_t num_headers, std::size_t buffer_size, + mpi_process_group( std::size_t num_headers, std::size_t buffer_size, communicator_type parent_comm = communicator_type()); /** * Construct a copy of the BSP process group for a new distributed * data structure. This data structure will synchronize with all * other members of the process group's equivalence class (including - * @p other), but will have its own set of tags. + * @p other), but will have its own set of tags. * * @param other The process group that this new process group will * be based on, using a different set of tags within the same @@ -296,9 +296,9 @@ public: * Construct a copy of the BSP process group for a new distributed * data structure. This data structure will synchronize with all * other members of the process group's equivalence class (including - * @p other), but will have its own set of tags. + * @p other), but will have its own set of tags. */ - mpi_process_group(const mpi_process_group& other, + mpi_process_group(const mpi_process_group& other, attach_distributed_object, bool out_of_band_receive = false); @@ -335,7 +335,7 @@ public: void replace_on_synchronize_handler(const on_synchronize_event_type& handler = 0); - /** + /** * Return the block number of the current data structure. A value of * 0 indicates that this particular instance of the process group is * not associated with any distributed data structure. @@ -350,7 +350,7 @@ public: { return block_num * max_tags + tag; } /** - * Decode an encoded tag into a block number/tag pair. + * Decode an encoded tag into a block number/tag pair. */ std::pair decode_tag(int encoded_tag) const { return std::make_pair(encoded_tag / max_tags, encoded_tag % max_tags); } @@ -366,13 +366,13 @@ public: */ int allocate_block(bool out_of_band_receive = false); - /** Potentially emit a receive event out of band. Returns true if an event - * was actually sent, false otherwise. + /** Potentially emit a receive event out of band. Returns true if an event + * was actually sent, false otherwise. */ bool maybe_emit_receive(int process, int encoded_tag) const; /** Emit a receive event. Returns true if an event was actually - * sent, false otherwise. + * sent, false otherwise. */ bool emit_receive(int process, int encoded_tag) const; @@ -450,7 +450,7 @@ public: void trigger_with_reply(int tag, const Handler& handler); template - void global_trigger(int tag, const Handler& handler, std::size_t buffer_size=0); + void global_trigger(int tag, const Handler& handler, std::size_t buffer_size=0); @@ -468,7 +468,7 @@ public: * @param synchronizing whether we are currently synchronizing the * process group */ - optional > + optional > poll(bool wait = false, int block = -1, bool synchronizing = false) const; /** @@ -489,11 +489,11 @@ public: /// /// Determine the actual communicator and tag will be used for a /// transmission with the given tag. - std::pair + std::pair actual_communicator_and_tag(int tag, int block) const; /// set the size of the message buffer used for buffered oob sends - + static void set_message_buffer_size(std::size_t s); /// get the size of the message buffer used for buffered oob sends @@ -503,12 +503,12 @@ public: static void* old_buffer; private: - void install_trigger(int tag, int block, - std::shared_ptr const& launcher); + void install_trigger(int tag, int block, + shared_ptr const& launcher); void poll_requests(int block=-1) const; - + // send a batch if the buffer is full now or would get full void maybe_send_batch(process_id_type dest) const; @@ -527,7 +527,7 @@ private: void receive_batch(boost::mpi::status& status) const; //void free_finished_sends() const; - + /// Status messages used internally by the process group enum status_messages { /// the first of the reserved message tags @@ -557,13 +557,13 @@ private: /// Handler for receive events receiver_type on_receive; - /// Handler executed at the start of synchronization + /// Handler executed at the start of synchronization on_synchronize_event_type on_synchronize; /// Individual message triggers. Note: at present, this vector is /// indexed by the (local) tag of the trigger. Any tags that /// don't have triggers will have NULL pointers in that spot. - std::vector > triggers; + std::vector > triggers; }; /** @@ -581,7 +581,7 @@ private: * @c block_num. */ struct deallocate_block; - + static std::vector message_buffer; public: @@ -589,17 +589,17 @@ public: * Data associated with the process group and all of its attached * distributed data structures. */ - std::shared_ptr impl_; + shared_ptr impl_; /** * When non-null, indicates that this copy of the process group is * associated with a particular distributed data structure. The * integer value contains the block number (a value > 0) associated - * with that data structure. The deleter for this @c std::shared_ptr is a + * with that data structure. The deleter for this @c shared_ptr is a * @c deallocate_block object that will deallocate the associated * block in @c impl_->blocks. */ - std::shared_ptr block_num; + shared_ptr block_num; /** * Rank of this process, to avoid having to call rank() repeatedly. @@ -615,11 +615,11 @@ public: -inline mpi_process_group::process_id_type +inline mpi_process_group::process_id_type process_id(const mpi_process_group& pg) { return pg.rank; } -inline mpi_process_group::process_size_type +inline mpi_process_group::process_size_type num_processes(const mpi_process_group& pg) { return pg.size; } @@ -683,7 +683,7 @@ process_subgroup(const mpi_process_group& pg, template void -broadcast(const mpi_process_group& pg, T& val, +broadcast(const mpi_process_group& pg, T& val, mpi_process_group::process_id_type root); @@ -705,15 +705,15 @@ send_oob(const mpi_process_group& pg, mpi_process_group::process_id_type dest, #ifdef SEND_OOB_BSEND if (mpi_process_group::message_buffer_size()) { - MPI_Bsend(const_cast(&value), 1, get_mpi_datatype(value), dest, + MPI_Bsend(const_cast(&value), 1, get_mpi_datatype(value), dest, actual.second, actual.first); return; } #endif MPI_Request request; - MPI_Isend(const_cast(&value), 1, get_mpi_datatype(value), dest, + MPI_Isend(const_cast(&value), 1, get_mpi_datatype(value), dest, actual.second, actual.first, &request); - + int done=0; do { pg.poll(); @@ -759,24 +759,24 @@ send_oob(const mpi_process_group& pg, mpi_process_group::process_id_type dest, template typename enable_if >::type -receive_oob(const mpi_process_group& pg, +receive_oob(const mpi_process_group& pg, mpi_process_group::process_id_type source, int tag, T& value, int block=-1); template typename disable_if >::type -receive_oob(const mpi_process_group& pg, +receive_oob(const mpi_process_group& pg, mpi_process_group::process_id_type source, int tag, T& value, int block=-1); template typename enable_if >::type -send_oob_with_reply(const mpi_process_group& pg, +send_oob_with_reply(const mpi_process_group& pg, mpi_process_group::process_id_type dest, int tag, const SendT& send_value, ReplyT& reply_value, int block = -1); template typename disable_if >::type -send_oob_with_reply(const mpi_process_group& pg, +send_oob_with_reply(const mpi_process_group& pg, mpi_process_group::process_id_type dest, int tag, const SendT& send_value, ReplyT& reply_value, int block = -1); @@ -791,7 +791,7 @@ namespace boost { namespace mpi { namespace std { /// optimized swap for outgoing messages -inline void +inline void swap(boost::graph::distributed::mpi_process_group::outgoing_messages& x, boost::graph::distributed::mpi_process_group::outgoing_messages& y) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/queue.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/queue.hpp index e79c46ed..7e84272a 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/queue.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/queue.hpp @@ -15,7 +15,7 @@ #include #include -#include +#include #include namespace boost { namespace graph { namespace distributed { @@ -213,12 +213,12 @@ class distributed_queue void setup_triggers(); // Message handlers - void - handle_push(int source, int tag, const value_type& value, + void + handle_push(int source, int tag, const value_type& value, trigger_receive_context); - void - handle_multipush(int source, int tag, const std::vector& values, + void + handle_multipush(int source, int tag, const std::vector& values, trigger_receive_context); mutable ProcessGroup process_group; @@ -229,7 +229,7 @@ class distributed_queue typedef std::vector outgoing_buffer_t; typedef std::vector outgoing_buffers_t; - std::shared_ptr outgoing_buffers; + shared_ptr outgoing_buffers; }; /// Helper macro containing the normal names for the template diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/rmat_graph_generator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/rmat_graph_generator.hpp index 261794d8..dec8250d 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/rmat_graph_generator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/rmat_graph_generator.hpp @@ -25,7 +25,7 @@ namespace boost { // requires an MPI process group. Run-time is slightly worse than // the unique rmat generator. Edge list generated is sorted and // unique. - template class scalable_rmat_iterator { @@ -47,8 +47,8 @@ namespace boost { // Initialize for edge generation scalable_rmat_iterator(ProcessGroup pg, Distribution distrib, - RandomGenerator& gen, vertices_size_type n, - edges_size_type m, double a, double b, double c, + RandomGenerator& gen, vertices_size_type n, + edges_size_type m, double a, double b, double c, double d, bool permute_vertices = true) : gen(), done(false) { @@ -58,12 +58,12 @@ namespace boost { this->gen.reset(new uniform_01(gen)); std::vector vertexPermutation; - if (permute_vertices) + if (permute_vertices) generate_permutation_vector(gen, vertexPermutation, n); int SCALE = int(floor(log(double(n))/log(2.))); boost::uniform_01 prob(gen); - + std::map edge_map; edges_size_type generated = 0, local_edges = 0; @@ -121,13 +121,13 @@ namespace boost { reference operator*() const { return current; } pointer operator->() const { return ¤t; } - + scalable_rmat_iterator& operator++() { if (!values.empty()) { current = values.back(); values.pop_back(); - } else + } else done = true; return *this; @@ -151,7 +151,7 @@ namespace boost { private: // Parameters - std::shared_ptr > gen; + shared_ptr > gen; // Internal data structures std::vector values; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/vertex_list_adaptor.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/vertex_list_adaptor.hpp index 1d7f9502..8928479a 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/vertex_list_adaptor.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/distributed/vertex_list_adaptor.hpp @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include #include @@ -25,9 +25,9 @@ namespace boost { namespace graph { // -------------------------------------------------------------------------- -// Global index map built from a distribution +// Global index map built from a distribution // -------------------------------------------------------------------------- -template class distribution_global_index_map { @@ -47,16 +47,16 @@ class distribution_global_index_map LocalPropertyMap local; }; -template -inline +inline typename distribution_global_index_map::value_type get(const distribution_global_index_map& p, typename distribution_global_index_map::key_type x) -{ +{ using boost::get; return p.distribution_.global(get(p.owner, x), get(p.local, x)); } @@ -64,15 +64,15 @@ get(const distribution_global_index_map inline distribution_global_index_map< - Distribution, + Distribution, typename property_map::const_type, typename property_map::const_type> make_distribution_global_index_map(const Graph& g, const Distribution& d) { typedef distribution_global_index_map< - Distribution, + Distribution, typename property_map::const_type, - typename property_map::const_type> + typename property_map::const_type> result_type; return result_type(d, get(vertex_owner, g), get(vertex_local, g)); } @@ -86,7 +86,7 @@ class stored_global_index_map : public IndexMap public: typedef readable_property_map_tag category; - stored_global_index_map(const IndexMap& index_map) : IndexMap(index_map) { + stored_global_index_map(const IndexMap& index_map) : IndexMap(index_map) { // When we have a global index, we need to always have the indices // of every key we've seen this->set_max_ghost_cells(0); @@ -98,13 +98,13 @@ class stored_global_index_map : public IndexMap // -------------------------------------------------------------------------- namespace detail { template - inline void - initialize_global_index_map(const PropertyMap&, - ForwardIterator, ForwardIterator) + inline void + initialize_global_index_map(const PropertyMap&, + ForwardIterator, ForwardIterator) { } template - void + void initialize_global_index_map(stored_global_index_map& p, ForwardIterator first, ForwardIterator last) { @@ -126,18 +126,18 @@ class vertex_list_adaptor : public graph_traits typedef graph_traits inherited; typedef typename inherited::traversal_category base_traversal_category; - + public: typedef typename inherited::vertex_descriptor vertex_descriptor; typedef typename std::vector::iterator vertex_iterator; typedef typename std::vector::size_type vertices_size_type; - struct traversal_category + struct traversal_category : public virtual base_traversal_category, public virtual vertex_list_graph_tag {}; - vertex_list_adaptor(const Graph& g, + vertex_list_adaptor(const Graph& g, const GlobalIndexMap& index_map = GlobalIndexMap()) : g(&g), index_map(index_map) { @@ -146,7 +146,7 @@ class vertex_list_adaptor : public graph_traits all_vertices_.reset(new std::vector()); all_gather(process_group(), vertices(g).first, vertices(g).second, *all_vertices_); - detail::initialize_global_index_map(this->index_map, + detail::initialize_global_index_map(this->index_map, all_vertices_->begin(), all_vertices_->end()); } @@ -156,13 +156,13 @@ class vertex_list_adaptor : public graph_traits // -------------------------------------------------------------------------- // Distributed Container // -------------------------------------------------------------------------- - typedef typename boost::graph::parallel::process_group_type::type + typedef typename boost::graph::parallel::process_group_type::type process_group_type; - process_group_type process_group() const - { + process_group_type process_group() const + { using boost::graph::parallel::process_group; - return process_group(*g); + return process_group(*g); } std::pair vertices() const @@ -175,7 +175,7 @@ class vertex_list_adaptor : public graph_traits private: const Graph* g; GlobalIndexMap index_map; - std::shared_ptr > all_vertices_; + shared_ptr > all_vertices_; }; template @@ -197,18 +197,18 @@ namespace detail { } template -inline -vertex_list_adaptor::type> make_vertex_list_adaptor(const Graph& g) -{ - typedef typename detail::default_global_index_map::type +{ + typedef typename detail::default_global_index_map::type GlobalIndexMap; typedef typename detail::default_global_index_map::distributed_map DistributedMap; typedef vertex_list_adaptor result_type; - return result_type(g, - GlobalIndexMap(DistributedMap(num_vertices(g), + return result_type(g, + GlobalIndexMap(DistributedMap(num_vertices(g), get(vertex_index, g)))); } @@ -375,7 +375,7 @@ namespace boost { // Property Graph: vertex_index property // -------------------------------------------------------------------------- template -class property_map > { public: @@ -384,7 +384,7 @@ public: }; template -class property_map > { public: diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/erdos_renyi_generator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/erdos_renyi_generator.hpp index d90ba36a..5be06d79 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/erdos_renyi_generator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/erdos_renyi_generator.hpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -31,7 +31,7 @@ namespace boost { std::pair::vertices_size_type, typename graph_traits::vertices_size_type>, std::input_iterator_tag, - const + const std::pair::vertices_size_type, typename graph_traits::vertices_size_type>&> { @@ -97,7 +97,7 @@ namespace boost { std::pair::vertices_size_type, typename graph_traits::vertices_size_type>, std::input_iterator_tag, - const + const std::pair::vertices_size_type, typename graph_traits::vertices_size_type>&> { @@ -181,7 +181,7 @@ namespace boost { if (src == n) src = (std::numeric_limits::max)(); } - std::shared_ptr > gen; + shared_ptr > gen; geometric_distribution rand_vertex; vertices_size_type n; bool allow_self_loops; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/gursoy_atun_layout.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/gursoy_atun_layout.hpp index 62587f9e..9269c4b0 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/gursoy_atun_layout.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/gursoy_atun_layout.hpp @@ -26,13 +26,13 @@ #include #include #include -#include +#include #include #include #include #include -namespace boost { +namespace boost { namespace detail { @@ -62,12 +62,12 @@ struct update_position_visitor { double distance_limit, double learning_constant, double falloff_ratio): - position_map(position_map), node_distance(node_distance), + position_map(position_map), node_distance(node_distance), space(space), input_vector(input_vector), distance_limit(distance_limit), learning_constant(learning_constant), falloff_ratio(falloff_ratio) {} - void operator()(vertex_descriptor v, const Graph&) const + void operator()(vertex_descriptor v, const Graph&) const { #ifndef BOOST_NO_STDC_NAMESPACE using std::pow; @@ -77,7 +77,7 @@ struct update_position_visitor { BOOST_THROW_EXCEPTION(over_distance_limit()); Point old_position = get(position_map, v); double distance = get(node_distance, v); - double fraction = + double fraction = learning_constant * pow(falloff_ratio, distance * distance); put(position_map, v, space.move_position_toward(old_position, fraction, input_vector)); @@ -88,7 +88,7 @@ template struct gursoy_shortest { template - static inline void + static inline void run(const Graph& g, typename graph_traits::vertex_descriptor s, NodeDistanceMap node_distance, UpdatePosition& update_position, EdgeWeightMap weight) @@ -104,7 +104,7 @@ template<> struct gursoy_shortest { template - static inline void + static inline void run(const Graph& g, typename graph_traits::vertex_descriptor s, NodeDistanceMap node_distance, UpdatePosition& update_position, dummy_property_map) @@ -119,11 +119,11 @@ struct gursoy_shortest } // namespace detail template -void +void gursoy_atun_step - (const VertexListAndIncidenceGraph& graph, + (const VertexListAndIncidenceGraph& graph, const Topology& space, PositionMap position, Diameter diameter, @@ -143,21 +143,21 @@ gursoy_atun_step typedef typename Topology::point_type point_type; vertex_iterator i, iend; std::vector distance_from_input_vector(num_vertices(graph)); - typedef boost::iterator_property_map::iterator, + typedef boost::iterator_property_map::iterator, VertexIndexMap, double, double&> DistanceFromInputMap; DistanceFromInputMap distance_from_input(distance_from_input_vector.begin(), vertex_index_map); std::vector node_distance_map_vector(num_vertices(graph)); - typedef boost::iterator_property_map::iterator, + typedef boost::iterator_property_map::iterator, VertexIndexMap, double, double&> NodeDistanceMap; NodeDistanceMap node_distance(node_distance_map_vector.begin(), vertex_index_map); point_type input_vector = space.random_point(); - vertex_descriptor min_distance_loc + vertex_descriptor min_distance_loc = graph_traits::null_vertex(); double min_distance = 0.0; bool min_distance_unset = true; @@ -173,24 +173,24 @@ gursoy_atun_step BOOST_ASSERT (!min_distance_unset); // Graph must have at least one vertex boost::detail::update_position_visitor< PositionMap, NodeDistanceMap, Topology, - VertexListAndIncidenceGraph> + VertexListAndIncidenceGraph> update_position(position, node_distance, space, - input_vector, diameter, learning_constant, + input_vector, diameter, learning_constant, exp(-1. / (2 * diameter * diameter))); std::fill(node_distance_map_vector.begin(), node_distance_map_vector.end(), 0); try { typedef detail::gursoy_shortest shortest; shortest::run(graph, min_distance_loc, node_distance, update_position, - weight); - } catch (detail::over_distance_limit) { - /* Thrown to break out of BFS or Dijkstra early */ + weight); + } catch (detail::over_distance_limit) { + /* Thrown to break out of BFS or Dijkstra early */ } } template -void gursoy_atun_refine(const VertexListAndIncidenceGraph& graph, +void gursoy_atun_refine(const VertexListAndIncidenceGraph& graph, const Topology& space, PositionMap position, int nsteps, @@ -199,7 +199,7 @@ void gursoy_atun_refine(const VertexListAndIncidenceGraph& graph, double learning_constant_initial, double learning_constant_final, VertexIndexMap vertex_index_map, - EdgeWeightMap weight) + EdgeWeightMap weight) { #ifndef BOOST_NO_STDC_NAMESPACE using std::pow; @@ -213,17 +213,17 @@ void gursoy_atun_refine(const VertexListAndIncidenceGraph& graph, typedef typename Topology::point_type point_type; vertex_iterator i, iend; double diameter_ratio = (double)diameter_final / diameter_initial; - double learning_constant_ratio = + double learning_constant_ratio = learning_constant_final / learning_constant_initial; std::vector distance_from_input_vector(num_vertices(graph)); - typedef boost::iterator_property_map::iterator, + typedef boost::iterator_property_map::iterator, VertexIndexMap, double, double&> DistanceFromInputMap; DistanceFromInputMap distance_from_input(distance_from_input_vector.begin(), vertex_index_map); std::vector node_distance_map_vector(num_vertices(graph)); - typedef boost::iterator_property_map::iterator, + typedef boost::iterator_property_map::iterator, VertexIndexMap, double, double&> NodeDistanceMap; NodeDistanceMap node_distance(node_distance_map_vector.begin(), @@ -231,17 +231,17 @@ void gursoy_atun_refine(const VertexListAndIncidenceGraph& graph, for (int round = 0; round < nsteps; ++round) { double part_done = (double)round / (nsteps - 1); int diameter = (int)(diameter_initial * pow(diameter_ratio, part_done)); - double learning_constant = + double learning_constant = learning_constant_initial * pow(learning_constant_ratio, part_done); - gursoy_atun_step(graph, space, position, diameter, learning_constant, + gursoy_atun_step(graph, space, position, diameter, learning_constant, vertex_index_map, weight); } } template -void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, +void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, const Topology& space, PositionMap position, int nsteps, @@ -260,14 +260,14 @@ void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, } gursoy_atun_refine(graph, space, position, nsteps, - diameter_initial, diameter_final, + diameter_initial, diameter_final, learning_constant_initial, learning_constant_final, vertex_index_map, weight); } template -void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, +void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, const Topology& space, PositionMap position, int nsteps, @@ -277,15 +277,15 @@ void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, double learning_constant_final, VertexIndexMap vertex_index_map) { - gursoy_atun_layout(graph, space, position, nsteps, - diameter_initial, diameter_final, - learning_constant_initial, learning_constant_final, + gursoy_atun_layout(graph, space, position, nsteps, + diameter_initial, diameter_final, + learning_constant_initial, learning_constant_final, vertex_index_map, dummy_property_map()); } template -void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, +void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, const Topology& space, PositionMap position, int nsteps, @@ -293,15 +293,15 @@ void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, double diameter_final = 1.0, double learning_constant_initial = 0.8, double learning_constant_final = 0.2) -{ +{ gursoy_atun_layout(graph, space, position, nsteps, diameter_initial, diameter_final, learning_constant_initial, - learning_constant_final, get(vertex_index, graph)); + learning_constant_final, get(vertex_index, graph)); } template -void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, +void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, const Topology& space, PositionMap position, int nsteps) @@ -310,13 +310,13 @@ void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, using std::sqrt; #endif - gursoy_atun_layout(graph, space, position, nsteps, + gursoy_atun_layout(graph, space, position, nsteps, sqrt((double)num_vertices(graph))); } template -void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, +void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, const Topology& space, PositionMap position) { @@ -325,8 +325,8 @@ void gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, template -void -gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, +void +gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, const Topology& space, PositionMap position, const bgl_named_params& params) @@ -340,17 +340,17 @@ gursoy_atun_layout(const VertexListAndIncidenceGraph& graph, gursoy_atun_layout(graph, space, position, choose_param(get_param(params, iterations_t()), num_vertices(graph)), - choose_param(get_param(params, diameter_range_t()), + choose_param(get_param(params, diameter_range_t()), diam).first, - choose_param(get_param(params, diameter_range_t()), + choose_param(get_param(params, diameter_range_t()), diam).second, - choose_param(get_param(params, learning_constant_range_t()), + choose_param(get_param(params, learning_constant_range_t()), learn).first, - choose_param(get_param(params, learning_constant_range_t()), + choose_param(get_param(params, learning_constant_range_t()), learn).second, choose_const_pmap(get_param(params, vertex_index), graph, vertex_index), - choose_param(get_param(params, edge_weight), + choose_param(get_param(params, edge_weight), dummy_property_map())); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/incremental_components.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/incremental_components.hpp index 63a9b838..fff3a324 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/incremental_components.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/incremental_components.hpp @@ -46,11 +46,11 @@ namespace boost { // Algorithms", and the application to connected components is // similar to the algorithm described in Ch. 22 of "Intro to // Algorithms" by Cormen, et. all. - // + // // An implementation of disjoint sets can be found in // boost/pending/disjoint_sets.hpp - + template void incremental_components(EdgeListGraph& g, DisjointSets& ds) { @@ -58,35 +58,35 @@ namespace boost { for (boost::tie(e,end) = edges(g); e != end; ++e) ds.union_set(source(*e,g),target(*e,g)); } - + template void compress_components(ParentIterator first, ParentIterator last) { - for (ParentIterator current = first; current != last; ++current) + for (ParentIterator current = first; current != last; ++current) detail::find_representative_with_full_compression(first, current-first); } - + template typename boost::detail::iterator_traits::difference_type component_count(ParentIterator first, ParentIterator last) { std::ptrdiff_t count = 0; - for (ParentIterator current = first; current != last; ++current) - if (*current == current - first) ++count; + for (ParentIterator current = first; current != last; ++current) + if (*current == current - first) ++count; return count; } - + // This algorithm can be applied to the result container of the // connected_components algorithm to normalize // the components. template void normalize_components(ParentIterator first, ParentIterator last) { - for (ParentIterator current = first; current != last; ++current) + for (ParentIterator current = first; current != last; ++current) detail::normalize_node(first, current - first); } - - template + + template void initialize_incremental_components(VertexListGraph& G, DisjointSets& ds) { typename graph_traits @@ -129,7 +129,7 @@ namespace boost { m_index_list(make_shared(m_num_elements)) { build_index_lists(parent_start, index_map); - + } // component_index template @@ -222,10 +222,10 @@ namespace boost { protected: IndexType m_num_elements; - std::shared_ptr m_components, m_index_list; + shared_ptr m_components, m_index_list; }; // class component_index - + } // namespace boost #endif // BOOST_INCREMENTAL_COMPONENTS_HPP diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/mcgregor_common_subgraphs.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/mcgregor_common_subgraphs.hpp index ed811172..c46f7215 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/mcgregor_common_subgraphs.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/mcgregor_common_subgraphs.hpp @@ -35,13 +35,13 @@ namespace boost { struct mcgregor_common_subgraph_traits { typedef typename graph_traits::vertex_descriptor vertex_first_type; typedef typename graph_traits::vertex_descriptor vertex_second_type; - + typedef shared_array_property_map correspondence_map_first_to_second_type; - + typedef shared_array_property_map correspondence_map_second_to_first_type; - }; + }; } // namespace detail @@ -52,7 +52,7 @@ namespace boost { template struct property_map_equivalent { - + property_map_equivalent(const PropertyMapFirst property_map1, const PropertyMapSecond property_map2) : m_property_map1(property_map1), @@ -63,7 +63,7 @@ namespace boost { bool operator()(const ItemFirst item1, const ItemSecond item2) { return (get(m_property_map1, item1) == get(m_property_map2, item2)); } - + private: const PropertyMapFirst m_property_map1; const PropertyMapSecond m_property_map2; @@ -86,7 +86,7 @@ namespace boost { // Binary function object that always returns true. Used when // vertices or edges are always equivalent (i.e. have no labels). struct always_equivalent { - + template bool operator()(const ItemFirst&, const ItemSecond&) { @@ -123,7 +123,7 @@ namespace boost { { typedef typename graph_traits::vertex_descriptor VertexFirst; typedef typename graph_traits::vertex_descriptor VertexSecond; - + typedef typename graph_traits::edge_descriptor EdgeFirst; typedef typename graph_traits::edge_descriptor EdgeSecond; @@ -153,7 +153,7 @@ namespace boost { // first matching edge is always chosen. EdgeFirst edge_to_new1, edge_from_new1; bool edge_to_new_exists1 = false, edge_from_new_exists1 = false; - + EdgeSecond edge_to_new2, edge_from_new2; bool edge_to_new_exists2 = false, edge_from_new_exists2 = false; @@ -179,7 +179,7 @@ namespace boost { if ((edge_to_new_exists1 != edge_to_new_exists2) || ((edge_to_new_exists1 && edge_to_new_exists2) && !edges_equivalent(edge_to_new1, edge_to_new2))) { - + return (false); } @@ -225,7 +225,7 @@ namespace boost { if ((edge_from_new_exists1 != edge_from_new_exists2) || ((edge_from_new_exists1 && edge_from_new_exists2) && !edges_equivalent(edge_from_new1, edge_from_new2))) { - + return (false); } @@ -244,7 +244,7 @@ namespace boost { } return (true); - } + } // Recursive method that does a depth-first search in the space of // potential subgraphs. At each level, every new vertex pair from @@ -284,14 +284,14 @@ namespace boost { // Get iterators for vertices from both graphs typename graph_traits::vertex_iterator vertex1_iter, vertex1_end; - + typename graph_traits::vertex_iterator vertex2_begin, vertex2_end, vertex2_iter; - + boost::tie(vertex1_iter, vertex1_end) = vertices(graph1); boost::tie(vertex2_begin, vertex2_end) = vertices(graph2); vertex2_iter = vertex2_begin; - + // Iterate until all vertices have been visited BGL_FORALL_VERTICES_T(new_vertex1, graph1, GraphFirst) { @@ -301,7 +301,7 @@ namespace boost { if (existing_vertex2 != graph_traits::null_vertex()) { continue; } - + BGL_FORALL_VERTICES_T(new_vertex2, graph2, GraphSecond) { VertexFirst existing_vertex1 = get(correspondence_map_2_to_1, new_vertex2); @@ -330,7 +330,7 @@ namespace boost { // Only output sub-graphs larger than a single vertex if (new_graph_size > 1) { - + // Returning false from the callback will cancel iteration if (!subgraph_callback(correspondence_map_1_to_2, correspondence_map_2_to_1, @@ -338,7 +338,7 @@ namespace boost { return (false); } } - + // Depth-first search into the state space of possible sub-graphs bool continue_iteration = mcgregor_common_subgraphs_internal @@ -352,10 +352,10 @@ namespace boost { if (!continue_iteration) { return (false); } - + // Restore previous state if (vertex_stack1.size() > old_graph_size) { - + VertexFirst stack_vertex1 = vertex_stack1.top(); VertexSecond stack_vertex2 = get(correspondence_map_1_to_2, stack_vertex1); @@ -363,10 +363,10 @@ namespace boost { // Contract subgraph put(correspondence_map_1_to_2, stack_vertex1, graph_traits::null_vertex()); - + put(correspondence_map_2_to_1, stack_vertex2, graph_traits::null_vertex()); - + vertex_stack1.pop(); } @@ -401,7 +401,7 @@ namespace boost { typedef mcgregor_common_subgraph_traits SubGraphTraits; - + typename SubGraphTraits::correspondence_map_first_to_second_type correspondence_map_1_to_2(num_vertices(graph1), vindex_map1); @@ -409,7 +409,7 @@ namespace boost { put(correspondence_map_1_to_2, vertex1, graph_traits::null_vertex()); } - + typename SubGraphTraits::correspondence_map_second_to_first_type correspondence_map_2_to_1(num_vertices(graph2), vindex_map2); @@ -420,7 +420,7 @@ namespace boost { typedef typename graph_traits::vertex_descriptor VertexFirst; - + std::stack vertex_stack1; mcgregor_common_subgraphs_internal @@ -432,7 +432,7 @@ namespace boost { only_connected_subgraphs, subgraph_callback); } - + } // namespace detail // ========================================================================== @@ -457,7 +457,7 @@ namespace boost { bool only_connected_subgraphs, SubGraphCallback user_callback) { - + detail::mcgregor_common_subgraphs_internal_init (graph1, graph2, vindex_map1, vindex_map2, @@ -465,7 +465,7 @@ namespace boost { only_connected_subgraphs, user_callback); } - + // Variant of mcgregor_common_subgraphs with all default parameters template & params) { - + detail::mcgregor_common_subgraphs_internal_init (graph1, graph2, choose_const_pmap(get_param(params, vertex_index1), @@ -532,7 +532,7 @@ namespace boost { typedef mcgregor_common_subgraph_traits SubGraphTraits; - + typedef typename SubGraphTraits::correspondence_map_first_to_second_type CachedCorrespondenceMapFirstToSecond; @@ -542,19 +542,19 @@ namespace boost { typedef std::pair > SubGraph; - + typedef std::vector SubGraphList; unique_subgraph_interceptor(const GraphFirst& graph1, const GraphSecond& graph2, const VertexIndexMapFirst vindex_map1, const VertexIndexMapSecond vindex_map2, - SubGraphCallback user_callback) : + SubGraphCallback user_callback) : m_graph1(graph1), m_graph2(graph2), m_vindex_map1(vindex_map1), m_vindex_map2(vindex_map2), m_subgraphs(make_shared()), m_user_callback(user_callback) { } - + template bool operator()(CorrespondenceMapFirstToSecond correspondence_map_1_to_2, @@ -572,16 +572,16 @@ namespace boost { if (subgraph_size != subgraph_cached.first) { continue; } - + if (!are_property_maps_different(correspondence_map_1_to_2, subgraph_cached.second.first, m_graph1)) { - + // New subgraph is a duplicate return (true); } } - + // Subgraph is unique, so make a cached copy CachedCorrespondenceMapFirstToSecond new_subgraph_1_to_2 = CachedCorrespondenceMapFirstToSecond @@ -602,21 +602,21 @@ namespace boost { m_subgraphs->push_back(std::make_pair(subgraph_size, std::make_pair(new_subgraph_1_to_2, new_subgraph_2_to_1))); - + return (m_user_callback(correspondence_map_1_to_2, correspondence_map_2_to_1, subgraph_size)); } - + private: const GraphFirst& m_graph1; const GraphFirst& m_graph2; const VertexIndexMapFirst m_vindex_map1; const VertexIndexMapSecond m_vindex_map2; - std::shared_ptr m_subgraphs; + shared_ptr m_subgraphs; SubGraphCallback m_user_callback; }; - + } // namespace detail // Enumerates all unique common subgraphs between graph1 and graph2. @@ -645,7 +645,7 @@ namespace boost { (graph1, graph2, vindex_map1, vindex_map2, user_callback); - + detail::mcgregor_common_subgraphs_internal_init (graph1, graph2, vindex_map1, vindex_map2, @@ -717,7 +717,7 @@ namespace boost { typedef mcgregor_common_subgraph_traits SubGraphTraits; - + typedef typename SubGraphTraits::correspondence_map_first_to_second_type CachedCorrespondenceMapFirstToSecond; @@ -753,7 +753,7 @@ namespace boost { } if (subgraph_size == *m_largest_size_so_far) { - + // Make a cached copy CachedCorrespondenceMapFirstToSecond new_subgraph_1_to_2 = CachedCorrespondenceMapFirstToSecond @@ -797,11 +797,11 @@ namespace boost { const GraphFirst& m_graph2; const VertexIndexMapFirst m_vindex_map1; const VertexIndexMapSecond m_vindex_map2; - std::shared_ptr m_subgraphs; - std::shared_ptr m_largest_size_so_far; + shared_ptr m_subgraphs; + shared_ptr m_largest_size_so_far; SubGraphCallback m_user_callback; }; - + } // namespace detail // Enumerates the largest common subgraphs found between graph1 @@ -828,7 +828,7 @@ namespace boost { VertexIndexMapFirst, VertexIndexMapSecond, SubGraphCallback> max_interceptor (graph1, graph2, vindex_map1, vindex_map2, user_callback); - + detail::mcgregor_common_subgraphs_internal_init (graph1, graph2, vindex_map1, vindex_map2, @@ -903,7 +903,7 @@ namespace boost { typedef mcgregor_common_subgraph_traits SubGraphTraits; - + typedef typename SubGraphTraits::correspondence_map_first_to_second_type CachedCorrespondenceMapFirstToSecond; @@ -920,13 +920,13 @@ namespace boost { const GraphSecond& graph2, const VertexIndexMapFirst vindex_map1, const VertexIndexMapSecond vindex_map2, - SubGraphCallback user_callback) : + SubGraphCallback user_callback) : m_graph1(graph1), m_graph2(graph2), m_vindex_map1(vindex_map1), m_vindex_map2(vindex_map2), m_subgraphs(make_shared()), m_largest_size_so_far(make_shared(0)), - m_user_callback(user_callback) { } - + m_user_callback(user_callback) { } + template bool operator()(CorrespondenceMapFirstToSecond correspondence_map_1_to_2, @@ -945,18 +945,18 @@ namespace boost { subgraph_iter = m_subgraphs->begin(); subgraph_iter != m_subgraphs->end(); ++subgraph_iter) { - + SubGraph subgraph_cached = *subgraph_iter; - + if (!are_property_maps_different(correspondence_map_1_to_2, subgraph_cached.second.first, m_graph1)) { - + // New subgraph is a duplicate return (true); } } - + // Subgraph is unique, so make a cached copy CachedCorrespondenceMapFirstToSecond new_subgraph_1_to_2 = CachedCorrespondenceMapFirstToSecond @@ -978,7 +978,7 @@ namespace boost { std::make_pair(new_subgraph_1_to_2, new_subgraph_2_to_1))); } - + return (true); } @@ -994,17 +994,17 @@ namespace boost { subgraph_cached.first); } } - + private: const GraphFirst& m_graph1; const GraphFirst& m_graph2; const VertexIndexMapFirst m_vindex_map1; const VertexIndexMapSecond m_vindex_map2; - std::shared_ptr m_subgraphs; - std::shared_ptr m_largest_size_so_far; + shared_ptr m_subgraphs; + shared_ptr m_largest_size_so_far; SubGraphCallback m_user_callback; }; - + } // namespace detail // Enumerates the largest, unique common subgraphs found between @@ -1031,7 +1031,7 @@ namespace boost { VertexIndexMapFirst, VertexIndexMapSecond, SubGraphCallback> unique_max_interceptor (graph1, graph2, vindex_map1, vindex_map2, user_callback); - + detail::mcgregor_common_subgraphs_internal_init (graph1, graph2, vindex_map1, vindex_map2, @@ -1122,7 +1122,7 @@ namespace boost { // Returns a filtered sub-graph of graph whose edge and vertex // inclusion is dictated by membership_map. template + typename MembershipMap> typename membership_filtered_graph_traits::graph_type make_membership_filtered_graph (const Graph& graph, @@ -1134,9 +1134,9 @@ namespace boost { typename MFGTraits::vertex_filter_type v_filter(membership_map); return (MembershipFilteredGraph(graph, keep_all(), v_filter)); - + } - + } // namespace boost #endif // BOOST_GRAPH_MCGREGOR_COMMON_SUBGRAPHS_HPP diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/metric_tsp_approx.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/metric_tsp_approx.hpp index e3824666..dd0ff1d6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/metric_tsp_approx.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/metric_tsp_approx.hpp @@ -28,7 +28,7 @@ #include -#include +#include #include #include #include diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/parallel/distribution.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/parallel/distribution.hpp index 51f820bd..8256b197 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/parallel/distribution.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/parallel/distribution.hpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include namespace boost { namespace parallel { @@ -86,13 +86,13 @@ public: size_type block_size(process_id_type id, size_type n) const { return distribution_->block_size(id, n); } - + process_id_type operator()(size_type i) const { return distribution_->in_process(i); } - + size_type local(size_type i) const { return distribution_->local(i); } - + size_type global(size_type n) const { return distribution_->global(n); } @@ -122,13 +122,13 @@ public: } private: - std::shared_ptr distribution_; + shared_ptr distribution_; }; struct block { template - explicit block(const LinearProcessGroup& pg, std::size_t n) + explicit block(const LinearProcessGroup& pg, std::size_t n) : id(process_id(pg)), p(num_processes(pg)), n(n) { } // If there are n elements in the distributed data structure, returns the number of elements stored locally. @@ -144,7 +144,7 @@ struct block // Returns the processor on which element with global index i is stored template SizeType operator()(SizeType i) const - { + { SizeType cutoff_processor = n % p; SizeType cutoff = cutoff_processor * (n / p + 1); @@ -165,7 +165,7 @@ struct block // Find the local index for the ith global element template SizeType local(SizeType i) const - { + { SizeType owner = (*this)(i); return i - start(owner); } @@ -192,9 +192,9 @@ struct uneven_block typedef std::vector size_vector; template - explicit uneven_block(const LinearProcessGroup& pg, const std::vector& local_sizes) + explicit uneven_block(const LinearProcessGroup& pg, const std::vector& local_sizes) : id(process_id(pg)), p(num_processes(pg)), local_sizes(local_sizes) - { + { BOOST_ASSERT(local_sizes.size() == p); local_starts.resize(p + 1); local_starts[0] = 0; @@ -204,7 +204,7 @@ struct uneven_block // To do maybe: enter local size in each process and gather in constructor (much handier) // template - // explicit uneven_block(const LinearProcessGroup& pg, std::size_t my_local_size) + // explicit uneven_block(const LinearProcessGroup& pg, std::size_t my_local_size) // If there are n elements in the distributed data structure, returns the number of elements stored locally. template @@ -227,7 +227,7 @@ struct uneven_block // Find the starting index for processor with the given id template - std::size_t start(ID id) const + std::size_t start(ID id) const { return local_starts[id]; } @@ -235,7 +235,7 @@ struct uneven_block // Find the local index for the ith global element template SizeType local(SizeType i) const - { + { SizeType owner = (*this)(i); return i - start(owner); } @@ -264,10 +264,10 @@ struct oned_block_cyclic template explicit oned_block_cyclic(const LinearProcessGroup& pg, std::size_t size) : id(process_id(pg)), p(num_processes(pg)), size(size) { } - + template SizeType block_size(SizeType n) const - { + { return block_size(id, n); } @@ -279,20 +279,20 @@ struct oned_block_cyclic SizeType everyone_gets = all_blocks / p; SizeType extra_blocks = all_blocks % p; SizeType my_blocks = everyone_gets + (p < extra_blocks? 1 : 0); - SizeType my_elements = my_blocks * size + SizeType my_elements = my_blocks * size + (p == extra_blocks? extra_elements : 0); return my_elements; } template SizeType operator()(SizeType i) const - { + { return (i / size) % p; } template SizeType local(SizeType i) const - { + { return ((i / size) / p) * size + i % size; } @@ -302,7 +302,7 @@ struct oned_block_cyclic template SizeType global(ProcessID id, SizeType i) const - { + { return ((i / size) * p + id) * size + i % size; } @@ -318,14 +318,14 @@ struct twod_block_cyclic explicit twod_block_cyclic(const LinearProcessGroup& pg, std::size_t block_rows, std::size_t block_columns, std::size_t data_columns_per_row) - : id(process_id(pg)), p(num_processes(pg)), - block_rows(block_rows), block_columns(block_columns), + : id(process_id(pg)), p(num_processes(pg)), + block_rows(block_rows), block_columns(block_columns), data_columns_per_row(data_columns_per_row) { } - + template SizeType block_size(SizeType n) const - { + { return block_size(id, n); } @@ -346,7 +346,7 @@ struct twod_block_cyclic template SizeType operator()(SizeType i) const - { + { SizeType result = get_block_num(i) % p; // std::cerr << "Item " << i << " goes on processor " << result << std::endl; return result; @@ -354,7 +354,7 @@ struct twod_block_cyclic template SizeType local(SizeType i) const - { + { // Compute the start of the block std::size_t block_num = get_block_num(i); // std::cerr << "Item " << i << " is in block #" << block_num << std::endl; @@ -362,11 +362,11 @@ struct twod_block_cyclic std::size_t local_block_num = block_num / p; std::size_t block_start = local_block_num * block_rows * block_columns; - // Compute the offset into the block + // Compute the offset into the block std::size_t data_row = i / data_columns_per_row; std::size_t data_col = i % data_columns_per_row; - std::size_t block_offset = (data_row % block_rows) * block_columns - + (data_col % block_columns); + std::size_t block_offset = (data_row % block_rows) * block_columns + + (data_col % block_columns); // std::cerr << "Item " << i << " maps to local index " << block_start+block_offset << std::endl; return block_start + block_offset; @@ -374,7 +374,7 @@ struct twod_block_cyclic template SizeType global(SizeType i) const - { + { // Compute the (global) block in which this element resides SizeType local_block_num = i / (block_rows * block_columns); SizeType block_offset = i % (block_rows * block_columns); @@ -401,7 +401,7 @@ struct twod_block_cyclic + row_in_block * block_rows + col_in_block; - std::cerr << "global(" << i << "@" << id << ") = " << result + std::cerr << "global(" << i << "@" << id << ") = " << result << " =? " << local(result) << std::endl; BOOST_ASSERT(i == local(result)); return result; @@ -444,7 +444,7 @@ class twod_random private: RandomNumberGen& gen; }; - + public: template explicit twod_random(const LinearProcessGroup& pg, @@ -452,11 +452,11 @@ class twod_random std::size_t data_columns_per_row, std::size_t n, RandomNumberGen& gen) - : id(process_id(pg)), p(num_processes(pg)), - block_rows(block_rows), block_columns(block_columns), + : id(process_id(pg)), p(num_processes(pg)), + block_rows(block_rows), block_columns(block_columns), data_columns_per_row(data_columns_per_row), global_to_local(n / (block_rows * block_columns)) - { + { std::copy(make_counting_iterator(std::size_t(0)), make_counting_iterator(global_to_local.size()), global_to_local.begin()); @@ -464,10 +464,10 @@ class twod_random random_int rand(gen); std::random_shuffle(global_to_local.begin(), global_to_local.end(), rand); } - + template SizeType block_size(SizeType n) const - { + { return block_size(id, n); } @@ -488,7 +488,7 @@ class twod_random template SizeType operator()(SizeType i) const - { + { SizeType result = get_block_num(i) % p; // std::cerr << "Item " << i << " goes on processor " << result << std::endl; return result; @@ -496,7 +496,7 @@ class twod_random template SizeType local(SizeType i) const - { + { // Compute the start of the block std::size_t block_num = get_block_num(i); // std::cerr << "Item " << i << " is in block #" << block_num << std::endl; @@ -504,11 +504,11 @@ class twod_random std::size_t local_block_num = block_num / p; std::size_t block_start = local_block_num * block_rows * block_columns; - // Compute the offset into the block + // Compute the offset into the block std::size_t data_row = i / data_columns_per_row; std::size_t data_col = i % data_columns_per_row; - std::size_t block_offset = (data_row % block_rows) * block_columns - + (data_col % block_columns); + std::size_t block_offset = (data_row % block_rows) * block_columns + + (data_col % block_columns); // std::cerr << "Item " << i << " maps to local index " << block_start+block_offset << std::endl; return block_start + block_offset; @@ -552,7 +552,7 @@ class random_distribution private: RandomNumberGen& gen; }; - + public: template random_distribution(const LinearProcessGroup& pg, RandomNumberGen& gen, @@ -565,7 +565,7 @@ class random_distribution random_int rand(gen); std::random_shuffle(local_to_global.begin(), local_to_global.end(), rand); - + for (std::vector::size_type i = 0; i < n; ++i) global_to_local[local_to_global[i]] = i; @@ -587,19 +587,19 @@ class random_distribution template SizeType local(SizeType i) const - { + { return base.local(global_to_local[i]); } template SizeType global(ProcessID p, SizeType i) const - { + { return local_to_global[base.global(p, i)]; } template SizeType global(SizeType i) const - { + { return local_to_global[base.global(i)]; } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/planar_detail/boyer_myrvold_impl.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/planar_detail/boyer_myrvold_impl.hpp index 0eb76e21..41ba2bc5 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/planar_detail/boyer_myrvold_impl.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/planar_detail/boyer_myrvold_impl.hpp @@ -12,7 +12,7 @@ #include #include #include //for std::min macros -#include +#include #include #include #include @@ -34,26 +34,26 @@ namespace boost typename DFSParentEdgeMap, typename SizeType> struct planar_dfs_visitor : public dfs_visitor<> { - planar_dfs_visitor(LowPointMap lpm, DFSParentMap dfs_p, + planar_dfs_visitor(LowPointMap lpm, DFSParentMap dfs_p, DFSNumberMap dfs_n, LeastAncestorMap lam, - DFSParentEdgeMap dfs_edge) + DFSParentEdgeMap dfs_edge) : low(lpm), parent(dfs_p), df_number(dfs_n), least_ancestor(lam), df_edge(dfs_edge), - count(0) + count(0) {} - - + + template void start_vertex(const Vertex& u, Graph&) { put(parent, u, u); put(least_ancestor, u, count); } - - + + template void discover_vertex(const Vertex& u, Graph&) { @@ -61,7 +61,7 @@ namespace boost put(df_number, u, count); ++count; } - + template void tree_edge(const Edge& e, Graph& g) { @@ -73,13 +73,13 @@ namespace boost put(df_edge, t, e); put(least_ancestor, t, get(df_number, s)); } - + template void back_edge(const Edge& e, Graph& g) { typedef typename graph_traits::vertex_descriptor vertex_t; typedef typename graph_traits::vertices_size_type v_size_t; - + vertex_t s(source(e,g)); vertex_t t(target(e,g)); BOOST_USING_STD_MIN(); @@ -89,20 +89,20 @@ namespace boost v_size_t t_df_number = get(df_number, t); v_size_t s_least_ancestor_df_number = get(least_ancestor, s); - put(low, s, + put(low, s, min BOOST_PREVENT_MACRO_SUBSTITUTION(s_low_df_number, t_df_number) ); - - put(least_ancestor, s, - min BOOST_PREVENT_MACRO_SUBSTITUTION(s_least_ancestor_df_number, + + put(least_ancestor, s, + min BOOST_PREVENT_MACRO_SUBSTITUTION(s_least_ancestor_df_number, t_df_number ) ); } } - + template void finish_vertex(const Vertex& u, Graph&) { @@ -115,21 +115,21 @@ namespace boost if (u_parent != u) { - put(low, u_parent, - min BOOST_PREVENT_MACRO_SUBSTITUTION(u_lowpoint, + put(low, u_parent, + min BOOST_PREVENT_MACRO_SUBSTITUTION(u_lowpoint, u_parent_lowpoint ) ); } } - + LowPointMap low; DFSParentMap parent; DFSNumberMap df_number; LeastAncestorMap least_ancestor; DFSParentEdgeMap df_edge; SizeType count; - + }; @@ -150,7 +150,7 @@ namespace boost typedef typename graph_traits::edge_descriptor edge_t; typedef typename graph_traits::vertex_iterator vertex_iterator_t; typedef typename graph_traits::edge_iterator edge_iterator_t; - typedef typename graph_traits::out_edge_iterator + typedef typename graph_traits::out_edge_iterator out_edge_iterator_t; typedef graph::detail::face_handle face_handle_t; @@ -158,8 +158,8 @@ namespace boost typedef std::vector edge_vector_t; typedef std::list vertex_list_t; typedef std::list< face_handle_t > face_handle_list_t; - typedef boost::std::shared_ptr< face_handle_list_t > face_handle_list_ptr_t; - typedef boost::std::shared_ptr< vertex_list_t > vertex_list_ptr_t; + typedef boost::shared_ptr< face_handle_list_t > face_handle_list_ptr_t; + typedef boost::shared_ptr< vertex_list_t > vertex_list_ptr_t; typedef boost::tuple merge_stack_frame_t; typedef std::vector merge_stack_t; @@ -173,16 +173,16 @@ namespace boost typedef typename map_vertex_to_::type vertex_to_v_size_map_t; typedef typename map_vertex_to_::type vertex_to_vertex_map_t; typedef typename map_vertex_to_::type vertex_to_edge_map_t; - typedef typename map_vertex_to_::type + typedef typename map_vertex_to_::type vertex_to_vertex_list_ptr_map_t; - typedef typename map_vertex_to_< edge_vector_t >::type + typedef typename map_vertex_to_< edge_vector_t >::type vertex_to_edge_vector_map_t; typedef typename map_vertex_to_::type vertex_to_bool_map_t; - typedef typename map_vertex_to_::type + typedef typename map_vertex_to_::type vertex_to_face_handle_map_t; - typedef typename map_vertex_to_::type + typedef typename map_vertex_to_::type vertex_to_face_handle_list_ptr_map_t; - typedef typename map_vertex_to_::type + typedef typename map_vertex_to_::type vertex_to_separated_node_map_t; template struct face_vertex_iterator { - typedef face_iterator type; @@ -216,7 +216,7 @@ namespace boost public: - + boyer_myrvold_impl(const Graph& arg_g, VertexIndexMap arg_vm): g(arg_g), @@ -237,7 +237,7 @@ namespace boost flipped_vector(num_vertices(g), false), backedges_vector(num_vertices(g)), dfs_parent_edge_vector(num_vertices(g)), - + vertices_by_dfs_num(num_vertices(g)), low_point(low_point_vector.begin(), vm), @@ -271,72 +271,72 @@ namespace boost // Sort vertices by their lowpoint - need this later in the constructor vertex_vector_t vertices_by_lowpoint(num_vertices(g)); - std::copy( vertices(g).first, vertices(g).second, + std::copy( vertices(g).first, vertices(g).second, vertices_by_lowpoint.begin() ); - bucket_sort(vertices_by_lowpoint.begin(), - vertices_by_lowpoint.end(), + bucket_sort(vertices_by_lowpoint.begin(), + vertices_by_lowpoint.end(), low_point, num_vertices(g) ); - // Sort vertices by their dfs number - need this to iterate by reverse + // Sort vertices by their dfs number - need this to iterate by reverse // DFS number in the main loop. - std::copy( vertices(g).first, vertices(g).second, + std::copy( vertices(g).first, vertices(g).second, vertices_by_dfs_num.begin() ); - bucket_sort(vertices_by_dfs_num.begin(), - vertices_by_dfs_num.end(), + bucket_sort(vertices_by_dfs_num.begin(), + vertices_by_dfs_num.end(), dfs_number, num_vertices(g) ); - // Initialize face handles. A face handle is an abstraction that serves - // two uses in our implementation - it allows us to efficiently move - // along the outer face of embedded bicomps in a partially embedded - // graph, and it provides storage for the planar embedding. Face - // handles are implemented by a sequence of edges and are associated - // with a particular vertex - the sequence of edges represents the - // current embedding of edges around that vertex, and the first and - // last edges in the sequence represent the pair of edges on the outer - // face that are adjacent to the associated vertex. This lets us embed - // edges in the graph by just pushing them on the front or back of the + // Initialize face handles. A face handle is an abstraction that serves + // two uses in our implementation - it allows us to efficiently move + // along the outer face of embedded bicomps in a partially embedded + // graph, and it provides storage for the planar embedding. Face + // handles are implemented by a sequence of edges and are associated + // with a particular vertex - the sequence of edges represents the + // current embedding of edges around that vertex, and the first and + // last edges in the sequence represent the pair of edges on the outer + // face that are adjacent to the associated vertex. This lets us embed + // edges in the graph by just pushing them on the front or back of the // sequence of edges held by the face handles. - // + // // Our algorithm starts with a DFS tree of edges (where every vertex is - // an articulation point and every edge is a singleton bicomp) and - // repeatedly merges bicomps by embedding additional edges. Note that - // any bicomp at any point in the algorithm can be associated with a + // an articulation point and every edge is a singleton bicomp) and + // repeatedly merges bicomps by embedding additional edges. Note that + // any bicomp at any point in the algorithm can be associated with a // unique edge connecting the vertex of that bicomp with the lowest DFS - // number (which we refer to as the "root" of the bicomp) with its DFS + // number (which we refer to as the "root" of the bicomp) with its DFS // child in the bicomp: the existence of two such edges would contradict - // the properties of a DFS tree. We refer to the DFS child of the root - // of a bicomp as the "canonical DFS child" of the bicomp. Note that a + // the properties of a DFS tree. We refer to the DFS child of the root + // of a bicomp as the "canonical DFS child" of the bicomp. Note that a // vertex can be the root of more than one bicomp. // - // We move around the external faces of a bicomp using a few property + // We move around the external faces of a bicomp using a few property // maps, which we'll initialize presently: // - // - face_handles: maps a vertex to a face handle that can be used to - // move "up" a bicomp. For a vertex that isn't an articulation point, - // this holds the face handles that can be used to move around that + // - face_handles: maps a vertex to a face handle that can be used to + // move "up" a bicomp. For a vertex that isn't an articulation point, + // this holds the face handles that can be used to move around that // vertex's unique bicomp. For a vertex that is an articulation point, - // this holds the face handles associated with the unique bicomp that - // the vertex is NOT the root of. These handles can therefore be used - // to move from any point on the outer face of the tree of bicomps + // this holds the face handles associated with the unique bicomp that + // the vertex is NOT the root of. These handles can therefore be used + // to move from any point on the outer face of the tree of bicomps // around the current outer face towards the root of the DFS tree. // - // - dfs_child_handles: these are used to hold face handles for + // - dfs_child_handles: these are used to hold face handles for // vertices that are articulation points - dfs_child_handles[v] holds // the face handles corresponding to vertex u in the bicomp with root // u and canonical DFS child v. // // - canonical_dfs_child: this property map allows one to determine the // canonical DFS child of a bicomp while traversing the outer face. - // This property map is only valid when applied to one of the two + // This property map is only valid when applied to one of the two // vertices adjacent to the root of the bicomp on the outer face. To // be more precise, if v is the canonical DFS child of a bicomp, - // canonical_dfs_child[dfs_child_handles[v].first_vertex()] == v and + // canonical_dfs_child[dfs_child_handles[v].first_vertex()] == v and // canonical_dfs_child[dfs_child_handles[v].second_vertex()] == v. // // - pertinent_roots: given a vertex v, pertinent_roots[v] contains a @@ -365,19 +365,19 @@ namespace boost } canonical_dfs_child[v] = v; - pertinent_roots[v] = face_handle_list_ptr_t(new face_handle_list_t); + pertinent_roots[v] = face_handle_list_ptr_t(new face_handle_list_t); separated_dfs_child_list[v] = vertex_list_ptr_t(new vertex_list_t); } // We need to create a list of not-yet-merged depth-first children for - // each vertex that will be updated as bicomps get merged. We sort each - // list by ascending lowpoint, which allows the externally_active - // function to run in constant time, and we keep a pointer to each - // vertex's representation in its parent's list, which allows merging + // each vertex that will be updated as bicomps get merged. We sort each + // list by ascending lowpoint, which allows the externally_active + // function to run in constant time, and we keep a pointer to each + // vertex's representation in its parent's list, which allows merging //in constant time. - for(typename vertex_vector_t::iterator itr = + for(typename vertex_vector_t::iterator itr = vertices_by_lowpoint.begin(); itr != vertices_by_lowpoint.end(); ++itr) { @@ -389,7 +389,7 @@ namespace boost separated_dfs_child_list[parent]->insert (separated_dfs_child_list[parent]->end(), v); } - } + } // The merge stack holds path information during a walkdown iteration merge_stack.reserve(num_vertices(g)); @@ -404,11 +404,11 @@ namespace boost bool is_planar() { - // This is the main algorithm: starting with a DFS tree of embedded - // edges (which, since it's a tree, is planar), iterate through all + // This is the main algorithm: starting with a DFS tree of embedded + // edges (which, since it's a tree, is planar), iterate through all // vertices by reverse DFS number, attempting to embed all backedges // connecting the current vertex to vertices with higher DFS numbers. - // + // // The walkup is a procedure that examines all such backedges and sets // up the required data structures so that they can be searched by the // walkdown in linear time. The walkdown does the actual work of @@ -434,7 +434,7 @@ namespace boost store_old_face_handles(StoreOldHandlesPolicy()); vertex_t v(*vi); - + walkup(v); if (!walkdown(v)) @@ -445,7 +445,7 @@ namespace boost clean_up_embedding(StoreEmbeddingPolicy()); return true; - + } @@ -462,14 +462,14 @@ namespace boost void walkup(vertex_t v) { - // The point of the walkup is to follow all backedges from v to + // The point of the walkup is to follow all backedges from v to // vertices with higher DFS numbers, and update pertinent_roots // for the bicomp roots on the path from backedge endpoints up // to v. This will set the stage for the walkdown to efficiently // traverse the graph of bicomps down from v. typedef typename face_vertex_iterator::type walkup_iterator_t; - + out_edge_iterator_t oi, oi_end; for(boost::tie(oi,oi_end) = out_edges(v,g); oi != oi_end; ++oi) { @@ -491,7 +491,7 @@ namespace boost backedges[w].push_back(e); - v_size_t timestamp = dfs_number[v]; + v_size_t timestamp = dfs_number[v]; backedge_flag[w] = timestamp; walkup_iterator_t walkup_itr(w, face_handles); @@ -500,11 +500,11 @@ namespace boost while (true) { - + // Move to the root of the current bicomp or the first visited // vertex on the bicomp by going up each side in parallel - - while(walkup_itr != walkup_end && + + while(walkup_itr != walkup_end && visited[*walkup_itr] != timestamp ) { @@ -515,20 +515,20 @@ namespace boost // If we've found the root of a bicomp through a path we haven't // seen before, update pertinent_roots with a handle to the - // current bicomp. Otherwise, we've just seen a path we've been + // current bicomp. Otherwise, we've just seen a path we've been // up before, so break out of the main while loop. - + if (walkup_itr == walkup_end) { vertex_t dfs_child = canonical_dfs_child[lead_vertex]; vertex_t parent = dfs_parent[dfs_child]; - visited[dfs_child_handles[dfs_child].first_vertex()] + visited[dfs_child_handles[dfs_child].first_vertex()] = timestamp; - visited[dfs_child_handles[dfs_child].second_vertex()] + visited[dfs_child_handles[dfs_child].second_vertex()] = timestamp; - if (low_point[dfs_child] < dfs_number[v] || + if (low_point[dfs_child] < dfs_number[v] || least_ancestor[dfs_child] < dfs_number[v] ) { @@ -553,10 +553,10 @@ namespace boost break; } - } - + } + } - + @@ -577,19 +577,19 @@ namespace boost while (!pertinent_roots[v]->empty()) { - + face_handle_t root_face_handle = pertinent_roots[v]->front(); face_handle_t curr_face_handle = root_face_handle; - pertinent_roots[v]->pop_front(); + pertinent_roots[v]->pop_front(); merge_stack.clear(); while(true) { - typename face_vertex_iterator<>::type + typename face_vertex_iterator<>::type first_face_itr, second_face_itr, face_end; - vertex_t first_side_vertex + vertex_t first_side_vertex = graph_traits::null_vertex(); vertex_t second_side_vertex; vertex_t first_tail, second_tail; @@ -603,7 +603,7 @@ namespace boost for(; first_face_itr != face_end; ++first_face_itr) { vertex_t face_vertex(*first_face_itr); - if (pertinent(face_vertex, v) || + if (pertinent(face_vertex, v) || externally_active(face_vertex, v) ) { @@ -614,7 +614,7 @@ namespace boost first_tail = face_vertex; } - if (first_side_vertex == graph_traits::null_vertex() || + if (first_side_vertex == graph_traits::null_vertex() || first_side_vertex == curr_face_handle.get_anchor() ) break; @@ -622,7 +622,7 @@ namespace boost for(;second_face_itr != face_end; ++second_face_itr) { vertex_t face_vertex(*second_face_itr); - if (pertinent(face_vertex, v) || + if (pertinent(face_vertex, v) || externally_active(face_vertex, v) ) { @@ -654,14 +654,14 @@ namespace boost chosen = second_side_vertex; chose_first_upper_path = false; } - else + else { - // If there's a pertinent vertex on the lower face - // between the first_face_itr and the second_face_itr, + // If there's a pertinent vertex on the lower face + // between the first_face_itr and the second_face_itr, // this graph isn't planar. - for(; - *first_face_itr != second_side_vertex; + for(; + *first_face_itr != second_side_vertex; ++first_face_itr ) { @@ -675,85 +675,85 @@ namespace boost return false; } } - - // Otherwise, the fact that we didn't find a pertinent - // vertex on this face is fine - we should set the - // short-circuit edges and break out of this loop to + + // Otherwise, the fact that we didn't find a pertinent + // vertex on this face is fine - we should set the + // short-circuit edges and break out of this loop to // start looking at a different pertinent root. - + if (first_side_vertex == second_side_vertex) { if (first_tail != v) { - vertex_t first + vertex_t first = face_handles[first_tail].first_vertex(); - vertex_t second + vertex_t second = face_handles[first_tail].second_vertex(); - boost::tie(first_side_vertex, first_tail) - = make_tuple(first_tail, - first == first_side_vertex ? + boost::tie(first_side_vertex, first_tail) + = make_tuple(first_tail, + first == first_side_vertex ? second : first ); } else if (second_tail != v) { - vertex_t first + vertex_t first = face_handles[second_tail].first_vertex(); - vertex_t second + vertex_t second = face_handles[second_tail].second_vertex(); - boost::tie(second_side_vertex, second_tail) + boost::tie(second_side_vertex, second_tail) = make_tuple(second_tail, - first == second_side_vertex ? + first == second_side_vertex ? second : first); } else break; } - - canonical_dfs_child[first_side_vertex] + + canonical_dfs_child[first_side_vertex] = canonical_dfs_child[root_face_handle.first_vertex()]; - canonical_dfs_child[second_side_vertex] + canonical_dfs_child[second_side_vertex] = canonical_dfs_child[root_face_handle.second_vertex()]; root_face_handle.set_first_vertex(first_side_vertex); root_face_handle.set_second_vertex(second_side_vertex); - if (face_handles[first_side_vertex].first_vertex() == + if (face_handles[first_side_vertex].first_vertex() == first_tail ) face_handles[first_side_vertex].set_first_vertex(v); else face_handles[first_side_vertex].set_second_vertex(v); - if (face_handles[second_side_vertex].first_vertex() == + if (face_handles[second_side_vertex].first_vertex() == second_tail ) face_handles[second_side_vertex].set_first_vertex(v); else face_handles[second_side_vertex].set_second_vertex(v); - + break; - + } - // When we unwind the stack, we need to know which direction + // When we unwind the stack, we need to know which direction // we came down from on the top face handle - - bool chose_first_lower_path = - (chose_first_upper_path && - face_handles[chosen].first_vertex() == first_tail) + + bool chose_first_lower_path = + (chose_first_upper_path && + face_handles[chosen].first_vertex() == first_tail) || - (!chose_first_upper_path && + (!chose_first_upper_path && face_handles[chosen].first_vertex() == second_tail); //If there's a backedge at the chosen vertex, embed it now if (backedge_flag[chosen] == dfs_number[v]) { w = chosen; - + backedge_flag[chosen] = num_vertices(g) + 1; add_to_merge_points(chosen, StoreOldHandlesPolicy()); - + typename edge_vector_t::iterator ei, ei_end; ei_end = backedges[chosen].end(); for(ei = backedges[chosen].begin(); ei != ei_end; ++ei) @@ -778,7 +778,7 @@ namespace boost } //Unwind the merge stack to the root, merging all bicomps - + bool bottom_path_follows_first; bool top_path_follows_first; bool next_bottom_follows_first = chose_first_upper_path; @@ -790,8 +790,8 @@ namespace boost { bottom_path_follows_first = next_bottom_follows_first; - boost::tie(merge_point, - next_bottom_follows_first, + boost::tie(merge_point, + next_bottom_follows_first, top_path_follows_first ) = merge_stack.back(); merge_stack.pop_back(); @@ -799,7 +799,7 @@ namespace boost face_handle_t top_handle(face_handles[merge_point]); face_handle_t bottom_handle (*pertinent_roots[merge_point]->begin()); - + vertex_t bottom_dfs_child = canonical_dfs_child [pertinent_roots[merge_point]->begin()->first_vertex()]; @@ -810,23 +810,23 @@ namespace boost pertinent_roots[merge_point]->pop_front(); - add_to_merge_points(top_handle.get_anchor(), + add_to_merge_points(top_handle.get_anchor(), StoreOldHandlesPolicy() ); - + if (top_path_follows_first && bottom_path_follows_first) { bottom_handle.flip(); top_handle.glue_first_to_second(bottom_handle); - } - else if (!top_path_follows_first && + } + else if (!top_path_follows_first && bottom_path_follows_first ) { flipped[bottom_dfs_child] = true; top_handle.glue_second_to_first(bottom_handle); } - else if (top_path_follows_first && + else if (top_path_follows_first && !bottom_path_follows_first ) { @@ -842,17 +842,17 @@ namespace boost } //Finally, embed all edges (v,w) at their upper end points - canonical_dfs_child[w] + canonical_dfs_child[w] = canonical_dfs_child[root_face_handle.first_vertex()]; - - add_to_merge_points(root_face_handle.get_anchor(), + + add_to_merge_points(root_face_handle.get_anchor(), StoreOldHandlesPolicy() ); - + typename edge_vector_t::iterator ei, ei_end; ei_end = backedges[chosen].end(); for(ei = backedges[chosen].begin(); ei != ei_end; ++ei) - { + { if (next_bottom_follows_first) root_face_handle.push_first(*ei, g); else @@ -863,7 +863,7 @@ namespace boost curr_face_handle = root_face_handle; }//while(true) - + }//while(!pertinent_roots[v]->empty()) return true; @@ -879,14 +879,14 @@ namespace boost void store_old_face_handles(graph::detail::store_old_handles) { - for(typename std::vector::iterator mp_itr + for(typename std::vector::iterator mp_itr = current_merge_points.begin(); mp_itr != current_merge_points.end(); ++mp_itr) { face_handles[*mp_itr].store_old_face_handles(); } current_merge_points.clear(); - } + } void add_to_merge_points(vertex_t, graph::detail::no_old_handles) {} @@ -896,7 +896,7 @@ namespace boost current_merge_points.push_back(v); } - + void add_to_embedded_edges(edge_t, graph::detail::no_old_handles) {} void add_to_embedded_edges(edge_t e, graph::detail::store_old_handles) @@ -924,7 +924,7 @@ namespace boost { typename vertex_list_t::iterator yi, yi_end; yi_end = separated_dfs_child_list[*xi]->end(); - for(yi = separated_dfs_child_list[*xi]->begin(); + for(yi = separated_dfs_child_list[*xi]->begin(); yi != yi_end; ++yi ) { @@ -933,7 +933,7 @@ namespace boost (dfs_child_handles[*yi]); } } - } + } // Up until this point, we've flipped bicomps lazily by setting // flipped[v] to true if the bicomp rooted at v was flipped (the @@ -944,7 +944,7 @@ namespace boost typedef typename vertex_vector_t::iterator vertex_vector_itr_t; vertex_vector_itr_t vi_end = vertices_by_dfs_num.end(); - for(vertex_vector_itr_t vi = vertices_by_dfs_num.begin(); + for(vertex_vector_itr_t vi = vertices_by_dfs_num.begin(); vi != vi_end; ++vi ) { @@ -968,7 +968,7 @@ namespace boost // If there are any self-loops in the graph, they were flagged // during the walkup, and we should add them to the embedding now. - // Adding a self loop anywhere in the embedding could never + // Adding a self loop anywhere in the embedding could never // invalidate the embedding, but they would complicate the traversal // if they were added during the walkup/walkdown. @@ -979,13 +979,13 @@ namespace boost edge_t e(*ei); face_handles[source(e,g)].push_second(e,g); } - + } - + bool pertinent(vertex_t w, vertex_t v) { // w is pertinent with respect to v if there is a backedge (v,w) or if @@ -993,38 +993,38 @@ namespace boost return backedge_flag[w] == dfs_number[v] || !pertinent_roots[w]->empty(); } - + bool externally_active(vertex_t w, vertex_t v) { // Let a be any proper depth-first search ancestor of v. w is externally - // active with respect to v if there exists a backedge (a,w) or a + // active with respect to v if there exists a backedge (a,w) or a // backedge (a,w_0) for some w_0 in a descendent bicomp of w. v_size_t dfs_number_of_v = dfs_number[v]; return (least_ancestor[w] < dfs_number_of_v) || (!separated_dfs_child_list[w]->empty() && - low_point[separated_dfs_child_list[w]->front()] < dfs_number_of_v); + low_point[separated_dfs_child_list[w]->front()] < dfs_number_of_v); } + - - + bool internally_active(vertex_t w, vertex_t v) { return pertinent(w,v) && !externally_active(w,v); - } - + } + void remove_vertex_from_separated_dfs_child_list(vertex_t v) { - typename vertex_list_t::iterator to_delete + typename vertex_list_t::iterator to_delete = separated_node_in_parent_list[v]; - garbage.splice(garbage.end(), - *separated_dfs_child_list[dfs_parent[v]], - to_delete, + garbage.splice(garbage.end(), + *separated_dfs_child_list[dfs_parent[v]], + to_delete, boost::next(to_delete) ); } @@ -1032,9 +1032,9 @@ namespace boost - + // End of the implementation of the basic Boyer-Myrvold Algorithm. The rest - // of the code below implements the isolation of a Kuratowski subgraph in + // of the code below implements the isolation of a Kuratowski subgraph in // the case that the input graph is not planar. This is by far the most // complicated part of the implementation. @@ -1047,7 +1047,7 @@ namespace boost template - vertex_t kuratowski_walkup(vertex_t v, + vertex_t kuratowski_walkup(vertex_t v, EdgeToBoolPropertyMap forbidden_edge, EdgeToBoolPropertyMap goal_edge, EdgeToBoolPropertyMap is_embedded, @@ -1057,19 +1057,19 @@ namespace boost vertex_t current_endpoint; bool seen_goal_edge = false; out_edge_iterator_t oi, oi_end; - + for(boost::tie(oi,oi_end) = out_edges(v,g); oi != oi_end; ++oi) forbidden_edge[*oi] = true; - + for(boost::tie(oi,oi_end) = out_edges(v,g); oi != oi_end; ++oi) { path_edges.clear(); - + edge_t e(*oi); - current_endpoint = target(*oi,g) == v ? + current_endpoint = target(*oi,g) == v ? source(*oi,g) : target(*oi,g); - - if (dfs_number[current_endpoint] < dfs_number[v] || + + if (dfs_number[current_endpoint] < dfs_number[v] || is_embedded[e] || v == current_endpoint //self-loop ) @@ -1077,7 +1077,7 @@ namespace boost //Not a backedge continue; } - + path_edges.push_back(e); if (goal_edge[e]) { @@ -1085,30 +1085,30 @@ namespace boost } typedef typename face_edge_iterator<>::type walkup_itr_t; - - walkup_itr_t + + walkup_itr_t walkup_itr(current_endpoint, face_handles, first_side()); walkup_itr_t walkup_end; - + seen_goal_edge = false; - + while (true) - { - + { + if (walkup_itr != walkup_end && forbidden_edge[*walkup_itr]) break; - - while(walkup_itr != walkup_end && - !goal_edge[*walkup_itr] && + + while(walkup_itr != walkup_end && + !goal_edge[*walkup_itr] && !forbidden_edge[*walkup_itr] ) { edge_t f(*walkup_itr); forbidden_edge[f] = true; path_edges.push_back(f); - current_endpoint = - source(f, g) == current_endpoint ? - target(f, g) : + current_endpoint = + source(f, g) == current_endpoint ? + target(f, g) : source(f,g); ++walkup_itr; } @@ -1120,14 +1120,14 @@ namespace boost break; } - walkup_itr + walkup_itr = walkup_itr_t(current_endpoint, face_handles, first_side()); - + } - + if (seen_goal_edge) break; - + } if (seen_goal_edge) @@ -1157,9 +1157,9 @@ namespace boost // | there exists some bicomp containing three vertices // ----- x,y, and z as shown such that x and y are externally // | | active with respect to v (which means that there are - // x y two vertices x_0 and y_0 such that (1) both x_0 and - // | | y_0 are proper depth-first search ancestors of v and - // --z-- (2) there are two disjoint paths, one connecting x + // x y two vertices x_0 and y_0 such that (1) both x_0 and + // | | y_0 are proper depth-first search ancestors of v and + // --z-- (2) there are two disjoint paths, one connecting x // and x_0 and one connecting y and y_0, both consisting // fig. 1 entirely of unembedded edges). Furthermore, there // exists a vertex z_0 such that z is a depth-first @@ -1175,10 +1175,10 @@ namespace boost // properties of the Boyer-Myrvold algorithm to show the existence of an // "x-y path" connecting some vertex on the "left side" of the x,y,z // bicomp with some vertex on the "right side" of the bicomp (where the - // left and right are split by a line drawn through v and z.If either of - // the endpoints of the x-y path is above x or y on the bicomp, a K_3_3 - // can be isolated - this is a case C. Otherwise, both endpoints are at - // or below x and y on the bicomp. If there is a vertex alpha on the x-y + // left and right are split by a line drawn through v and z.If either of + // the endpoints of the x-y path is above x or y on the bicomp, a K_3_3 + // can be isolated - this is a case C. Otherwise, both endpoints are at + // or below x and y on the bicomp. If there is a vertex alpha on the x-y // path such that alpha is not x or y and there's a path from alpha to v // that's disjoint from any of the edges on the bicomp and the x-y path, // a K_3_3 can be isolated - this is a case D. Otherwise, properties of @@ -1192,8 +1192,8 @@ namespace boost out_edge_iterator_t oei, oei_end; typename std::vector::iterator xi, xi_end; - // Clear the short-circuit edges - these are needed for the planar - // testing/embedding algorithm to run in linear time, but they'll + // Clear the short-circuit edges - these are needed for the planar + // testing/embedding algorithm to run in linear time, but they'll // complicate the kuratowski subgraph isolation for(boost::tie(vi,vi_end) = vertices(g); vi != vi_end; ++vi) { @@ -1217,12 +1217,12 @@ namespace boost typename std::vector::iterator embedded_itr, embedded_end; embedded_end = embedded_edges.end(); - for(embedded_itr = embedded_edges.begin(); + for(embedded_itr = embedded_edges.begin(); embedded_itr != embedded_end; ++embedded_itr ) is_embedded[*embedded_itr] = true; - // upper_face_vertex is true for x,y, and all vertices above x and y in + // upper_face_vertex is true for x,y, and all vertices above x and y in // the bicomp std::vector upper_face_vertex_vector(num_vertices(g), false); vertex_to_bool_map_t upper_face_vertex @@ -1234,7 +1234,7 @@ namespace boost // These next few variable declarations are all things that we need // to find. - vertex_t z; + vertex_t z; vertex_t bicomp_root; vertex_t w = graph_traits::null_vertex(); face_handle_t w_handle; @@ -1256,13 +1256,13 @@ namespace boost //backedge from V, then goes up until it hits either X or Y //(but doesn't find X or Y as the root of a bicomp) - typename face_vertex_iterator<>::type + typename face_vertex_iterator<>::type x_upper_itr(x, face_handles, first_side()); - typename face_vertex_iterator<>::type + typename face_vertex_iterator<>::type x_lower_itr(x, face_handles, second_side()); typename face_vertex_iterator<>::type face_itr, face_end; - // Don't know which path from x is the upper or lower path - + // Don't know which path from x is the upper or lower path - // we'll find out here for(face_itr = x_upper_itr; face_itr != face_end; ++face_itr) { @@ -1284,9 +1284,9 @@ namespace boost upper_face_vertex[current_vertex] = true; } - v_dfchild_handle + v_dfchild_handle = dfs_child_handles[canonical_dfs_child[previous_vertex]]; - + for(face_itr = x_lower_itr; *face_itr != y; ++face_itr) { vertex_t current_vertex(*face_itr); @@ -1297,7 +1297,7 @@ namespace boost if (w == graph_traits::null_vertex()) //haven't found a w yet { roots_end = pertinent_roots[current_vertex]->end(); - for(roots_itr = pertinent_roots[current_vertex]->begin(); + for(roots_itr = pertinent_roots[current_vertex]->begin(); roots_itr != roots_end; ++roots_itr ) { @@ -1327,7 +1327,7 @@ namespace boost edge_to_bool_map_t outer_face_edge(outer_face_edge_vector.begin(), em); walkup_itr_t walkup_end; - for(walkup_itr_t walkup_itr(x, face_handles, first_side()); + for(walkup_itr_t walkup_itr(x, face_handles, first_side()); walkup_itr != walkup_end; ++walkup_itr ) { @@ -1335,7 +1335,7 @@ namespace boost is_in_subgraph[*walkup_itr] = true; } - for(walkup_itr_t walkup_itr(x, face_handles, second_side()); + for(walkup_itr_t walkup_itr(x, face_handles, second_side()); walkup_itr != walkup_end; ++walkup_itr ) { @@ -1355,53 +1355,53 @@ namespace boost for(boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) { edge_t e(*ei); - goal_edge[e] + goal_edge[e] = !outer_face_edge[e] && (source(e,g) == x || target(e,g) == x); forbidden_edge[*ei] = outer_face_edge[*ei]; } vertex_t x_ancestor = v; vertex_t x_endpoint = graph_traits::null_vertex(); - + while(x_endpoint == graph_traits::null_vertex()) - { + { x_ancestor = dfs_parent[x_ancestor]; - x_endpoint = kuratowski_walkup(x_ancestor, - forbidden_edge, + x_endpoint = kuratowski_walkup(x_ancestor, + forbidden_edge, goal_edge, is_embedded, x_external_path ); - - } + + } for(boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) { edge_t e(*ei); - goal_edge[e] + goal_edge[e] = !outer_face_edge[e] && (source(e,g) == y || target(e,g) == y); forbidden_edge[*ei] = outer_face_edge[*ei]; } vertex_t y_ancestor = v; vertex_t y_endpoint = graph_traits::null_vertex(); - + while(y_endpoint == graph_traits::null_vertex()) - { + { y_ancestor = dfs_parent[y_ancestor]; - y_endpoint = kuratowski_walkup(y_ancestor, - forbidden_edge, + y_endpoint = kuratowski_walkup(y_ancestor, + forbidden_edge, goal_edge, is_embedded, y_external_path ); - - } - + + } + vertex_t parent, child; - + //If v isn't on the same bicomp as x and y, it's a case A if (bicomp_root != v) { @@ -1412,13 +1412,13 @@ namespace boost for(boost::tie(oei,oei_end) = out_edges(*vi,g); oei != oei_end; ++oei) if(!outer_face_edge[*oei]) goal_edge[*oei] = true; - + for(boost::tie(ei,ei_end) = edges(g); ei != ei_end; ++ei) forbidden_edge[*ei] = outer_face_edge[*ei]; - + z = kuratowski_walkup (v, forbidden_edge, goal_edge, is_embedded, z_v_path); - + } else if (w != graph_traits::null_vertex()) { @@ -1430,17 +1430,17 @@ namespace boost goal_edge[e] = false; forbidden_edge[e] = outer_face_edge[e]; } - + goal_edge[w_handle.first_edge()] = true; goal_edge[w_handle.second_edge()] = true; z = kuratowski_walkup(v, - forbidden_edge, + forbidden_edge, goal_edge, is_embedded, z_v_path ); - + for(boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) { @@ -1453,41 +1453,41 @@ namespace boost { goal_edge[*pi] = true; } - + w_ancestor = v; vertex_t w_endpoint = graph_traits::null_vertex(); - + while(w_endpoint == graph_traits::null_vertex()) - { + { w_ancestor = dfs_parent[w_ancestor]; - w_endpoint = kuratowski_walkup(w_ancestor, - forbidden_edge, + w_endpoint = kuratowski_walkup(w_ancestor, + forbidden_edge, goal_edge, is_embedded, w_path ); - - } - - // We really want both the w walkup and the z walkup to finish on - // exactly the same edge, but for convenience (since we don't have - // control over which side of a bicomp a walkup moves up) we've - // defined the walkup to either end at w_handle.first_edge() or - // w_handle.second_edge(). If both walkups ended at different edges, - // we'll do a little surgery on the w walkup path to make it follow + + } + + // We really want both the w walkup and the z walkup to finish on + // exactly the same edge, but for convenience (since we don't have + // control over which side of a bicomp a walkup moves up) we've + // defined the walkup to either end at w_handle.first_edge() or + // w_handle.second_edge(). If both walkups ended at different edges, + // we'll do a little surgery on the w walkup path to make it follow // the other side of the final bicomp. - if ((w_path.back() == w_handle.first_edge() && - z_v_path.back() == w_handle.second_edge()) + if ((w_path.back() == w_handle.first_edge() && + z_v_path.back() == w_handle.second_edge()) || - (w_path.back() == w_handle.second_edge() && + (w_path.back() == w_handle.second_edge() && z_v_path.back() == w_handle.first_edge()) ) { walkup_itr_t wi, wi_end; edge_t final_edge = w_path.back(); - vertex_t anchor - = source(final_edge, g) == w_handle.get_anchor() ? + vertex_t anchor + = source(final_edge, g) == w_handle.get_anchor() ? target(final_edge, g) : source(final_edge, g); if (face_handles[anchor].first_edge() == final_edge) wi = walkup_itr_t(anchor, face_handles, second_side()); @@ -1506,9 +1506,9 @@ namespace boost } } - + } - else + else { //We need to find a valid z, since the x-y path re-defines the lower @@ -1519,7 +1519,7 @@ namespace boost // The z we've used so far is just an externally active vertex on the // lower face path, but may not be the z we need for a case C, D, or - // E subgraph. the z we need now is any externally active vertex on + // E subgraph. the z we need now is any externally active vertex on // the lower face path with both old_face_handles edges on the outer // face. Since we know an x-y path exists, such a z must also exist. @@ -1530,7 +1530,7 @@ namespace boost for(face_itr = x_lower_itr; *face_itr != y; ++face_itr) { vertex_t possible_z(*face_itr); - if (pertinent(possible_z,v) && + if (pertinent(possible_z,v) && outer_face_edge[face_handles[possible_z].old_first_edge()] && outer_face_edge[face_handles[possible_z].old_second_edge()] ) @@ -1544,14 +1544,14 @@ namespace boost if (externally_active(z,v)) w = z; - + typedef typename face_edge_iterator - ::type old_face_iterator_t; + ::type old_face_iterator_t; - old_face_iterator_t + old_face_iterator_t first_old_face_itr(z, face_handles, first_side()); - old_face_iterator_t + old_face_iterator_t second_old_face_itr(z, face_handles, second_side()); old_face_iterator_t old_face_itr, old_face_end; @@ -1563,10 +1563,10 @@ namespace boost vertex_to_bool_map_t x_y_path_vertex (x_y_path_vertex_vector.begin(), vm); - typename std::vector::iterator + typename std::vector::iterator of_itr, of_itr_end; - of_itr_end = old_face_iterators.end(); - for(of_itr = old_face_iterators.begin(); + of_itr_end = old_face_iterators.end(); + for(of_itr = old_face_iterators.begin(); of_itr != of_itr_end; ++of_itr ) { @@ -1580,13 +1580,13 @@ namespace boost { edge_t e(*old_face_itr); previous_vertex = current_vertex; - current_vertex = source(e,g) == current_vertex ? + current_vertex = source(e,g) == current_vertex ? target(e,g) : source(e,g); - + if (current_vertex == x || current_vertex == y) seen_x_or_y = true; - if (w == graph_traits::null_vertex() && + if (w == graph_traits::null_vertex() && externally_active(current_vertex,v) && outer_face_edge[e] && outer_face_edge[*boost::next(old_face_itr)] && @@ -1595,10 +1595,10 @@ namespace boost { w = current_vertex; } - + if (!outer_face_edge[e]) { - if (!upper_face_vertex[current_vertex] && + if (!upper_face_vertex[current_vertex] && !lower_face_vertex[current_vertex] ) { @@ -1606,22 +1606,22 @@ namespace boost } is_in_subgraph[e] = true; - if (upper_face_vertex[source(e,g)] || + if (upper_face_vertex[source(e,g)] || lower_face_vertex[source(e,g)] ) { - if (first_x_y_path_endpoint == + if (first_x_y_path_endpoint == graph_traits::null_vertex() ) first_x_y_path_endpoint = source(e,g); else second_x_y_path_endpoint = source(e,g); } - if (upper_face_vertex[target(e,g)] || + if (upper_face_vertex[target(e,g)] || lower_face_vertex[target(e,g)] ) { - if (first_x_y_path_endpoint == + if (first_x_y_path_endpoint == graph_traits::null_vertex() ) first_x_y_path_endpoint = target(e,g); @@ -1635,35 +1635,35 @@ namespace boost { chosen_case = detail::BM_CASE_C; } - + } } - // Look for a case D - one of v's embedded edges will connect to the + // Look for a case D - one of v's embedded edges will connect to the // x-y path along an inner face path. //First, get a list of all of v's embedded child edges out_edge_iterator_t v_edge_itr, v_edge_end; - for(boost::tie(v_edge_itr,v_edge_end) = out_edges(v,g); + for(boost::tie(v_edge_itr,v_edge_end) = out_edges(v,g); v_edge_itr != v_edge_end; ++v_edge_itr ) { edge_t embedded_edge(*v_edge_itr); - - if (!is_embedded[embedded_edge] || + + if (!is_embedded[embedded_edge] || embedded_edge == dfs_parent_edge[v] ) continue; case_d_edges.push_back(embedded_edge); - vertex_t current_vertex - = source(embedded_edge,g) == v ? + vertex_t current_vertex + = source(embedded_edge,g) == v ? target(embedded_edge,g) : source(embedded_edge,g); - typename face_edge_iterator<>::type + typename face_edge_iterator<>::type internal_face_itr, internal_face_end; if (face_handles[current_vertex].first_vertex() == v) { @@ -1677,13 +1677,13 @@ namespace boost } while(internal_face_itr != internal_face_end && - !outer_face_edge[*internal_face_itr] && + !outer_face_edge[*internal_face_itr] && !x_y_path_vertex[current_vertex] ) { edge_t e(*internal_face_itr); case_d_edges.push_back(e); - current_vertex = + current_vertex = source(e,g) == current_vertex ? target(e,g) : source(e,g); ++internal_face_itr; } @@ -1699,7 +1699,7 @@ namespace boost } } - + } @@ -1714,25 +1714,25 @@ namespace boost for(boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) { edge_t e(*ei); - goal_edge[e] = !outer_face_edge[e] && + goal_edge[e] = !outer_face_edge[e] && (source(e,g) == z || target(e,g) == z); forbidden_edge[e] = outer_face_edge[e]; } kuratowski_walkup(v, - forbidden_edge, + forbidden_edge, goal_edge, is_embedded, z_v_path ); - + if (chosen_case == detail::BM_CASE_E) { for(boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) { forbidden_edge[*ei] = outer_face_edge[*ei]; - goal_edge[*ei] = !outer_face_edge[*ei] && + goal_edge[*ei] = !outer_face_edge[*ei] && (source(*ei,g) == w || target(*ei,g) == w); } @@ -1748,22 +1748,22 @@ namespace boost { goal_edge[*pi] = true; } - + w_ancestor = v; vertex_t w_endpoint = graph_traits::null_vertex(); - + while(w_endpoint == graph_traits::null_vertex()) - { + { w_ancestor = dfs_parent[w_ancestor]; - w_endpoint = kuratowski_walkup(w_ancestor, - forbidden_edge, + w_endpoint = kuratowski_walkup(w_ancestor, + forbidden_edge, goal_edge, is_embedded, w_path ); - - } - + + } + } @@ -1794,7 +1794,7 @@ namespace boost xi_end = w_path.end(); for(xi = w_path.begin(); xi != xi_end; ++xi) is_in_subgraph[*xi] = true; - + child = bicomp_root; parent = dfs_parent[child]; while(child != parent) @@ -1806,10 +1806,10 @@ namespace boost - // At this point, we've already isolated the Kuratowski subgraph and - // collected all of the edges that compose it in the is_in_subgraph - // property map. But we want the verification of such a subgraph to be - // a deterministic process, and we can simplify the function + // At this point, we've already isolated the Kuratowski subgraph and + // collected all of the edges that compose it in the is_in_subgraph + // property map. But we want the verification of such a subgraph to be + // a deterministic process, and we can simplify the function // is_kuratowski_subgraph by cleaning up some edges here. if (chosen_case == detail::BM_CASE_B) @@ -1821,13 +1821,13 @@ namespace boost // In a case C subgraph, at least one of the x-y path endpoints // (call it alpha) is above either x or y on the outer face. The // other endpoint may be attached at x or y OR above OR below. In - // any of these three cases, we can form a K_3_3 by removing the - // edge attached to v on the outer face that is NOT on the path to + // any of these three cases, we can form a K_3_3 by removing the + // edge attached to v on the outer face that is NOT on the path to // alpha. - typename face_vertex_iterator::type + typename face_vertex_iterator::type face_itr, face_end; - if (face_handles[v_dfchild_handle.first_vertex()].first_edge() == + if (face_handles[v_dfchild_handle.first_vertex()].first_edge() == v_dfchild_handle.first_edge() ) { @@ -1857,13 +1857,13 @@ namespace boost break; } } - + } else if (chosen_case == detail::BM_CASE_D) { // Need to remove both of the edges adjacent to v on the outer face. // remove the connecting edges from v to bicomp, then - // is_kuratowski_subgraph will shrink vertices of degree 1 + // is_kuratowski_subgraph will shrink vertices of degree 1 // automatically... is_in_subgraph[v_dfchild_handle.first_edge()] = false; @@ -1872,8 +1872,8 @@ namespace boost } else if (chosen_case == detail::BM_CASE_E) { - // Similarly to case C, if the endpoints of the x-y path are both - // below x and y, we should remove an edge to allow the subgraph to + // Similarly to case C, if the endpoints of the x-y path are both + // below x and y, we should remove an edge to allow the subgraph to // contract to a K_3_3. @@ -1881,7 +1881,7 @@ namespace boost (second_x_y_path_endpoint != x && second_x_y_path_endpoint != y) ) { - is_in_subgraph[dfs_parent_edge[v]] = false; + is_in_subgraph[dfs_parent_edge[v]] = false; vertex_t deletion_endpoint, other_endpoint; if (lower_face_vertex[first_x_y_path_endpoint]) @@ -1890,13 +1890,13 @@ namespace boost other_endpoint = first_x_y_path_endpoint; } else - { + { deletion_endpoint = first_x_y_path_endpoint; other_endpoint = second_x_y_path_endpoint; } typename face_edge_iterator<>::type face_itr, face_end; - + bool found_other_endpoint = false; for(face_itr = typename face_edge_iterator<>::type (deletion_endpoint, face_handles, first_side()); @@ -1904,7 +1904,7 @@ namespace boost ) { edge_t e(*face_itr); - if (source(e,g) == other_endpoint || + if (source(e,g) == other_endpoint || target(e,g) == other_endpoint ) { @@ -1915,7 +1915,7 @@ namespace boost if (found_other_endpoint) { - is_in_subgraph[face_handles[deletion_endpoint].first_edge()] + is_in_subgraph[face_handles[deletion_endpoint].first_edge()] = false; } else @@ -1924,14 +1924,14 @@ namespace boost = false; } } - + } for(boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) if (is_in_subgraph[*ei]) *o_itr = *ei; - + } @@ -1957,14 +1957,14 @@ namespace boost vertex_t kuratowski_v; vertex_t kuratowski_x; vertex_t kuratowski_y; - - vertex_list_t garbage; // we delete items from linked lists by + + vertex_list_t garbage; // we delete items from linked lists by // splicing them into garbage //only need these two for kuratowski subgraph isolation std::vector current_merge_points; std::vector embedded_edges; - + //property map storage std::vector low_point_vector; std::vector dfs_parent_vector; @@ -1976,7 +1976,7 @@ namespace boost std::vector< face_handle_t > face_handles_vector; std::vector< face_handle_t > dfs_child_handles_vector; std::vector< vertex_list_ptr_t > separated_dfs_child_list_vector; - std::vector< typename vertex_list_t::iterator > + std::vector< typename vertex_list_t::iterator > separated_node_in_parent_list_vector; std::vector canonical_dfs_child_vector; std::vector flipped_vector; @@ -1993,20 +1993,20 @@ namespace boost vertex_to_face_handle_list_ptr_map_t pertinent_roots; vertex_to_v_size_map_t backedge_flag; vertex_to_v_size_map_t visited; - vertex_to_face_handle_map_t face_handles; + vertex_to_face_handle_map_t face_handles; vertex_to_face_handle_map_t dfs_child_handles; vertex_to_vertex_list_ptr_map_t separated_dfs_child_list; vertex_to_separated_node_map_t separated_node_in_parent_list; - vertex_to_vertex_map_t canonical_dfs_child; + vertex_to_vertex_map_t canonical_dfs_child; vertex_to_bool_map_t flipped; vertex_to_edge_vector_map_t backedges; vertex_to_edge_map_t dfs_parent_edge; //only need for kuratowski merge_stack_t merge_stack; - + }; - - + + } //namespace boost #endif //__BOYER_MYRVOLD_IMPL_HPP__ diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/planar_detail/face_handles.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/planar_detail/face_handles.hpp index 99b4eec3..4e28d4af 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/planar_detail/face_handles.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/planar_detail/face_handles.hpp @@ -12,7 +12,7 @@ #include #include -#include +#include // A "face handle" is an optimization meant to serve two purposes in @@ -26,7 +26,7 @@ // sequence of edges. The functions first_vertex/second_vertex and // first_edge/second_edge allow fast access to the beginning and end of the // stored sequence, which allows one to traverse the outer face of the partial -// planar embedding as it's being created. +// planar embedding as it's being created. // // There are some policies below that define the contents of the face handles: // in the case no embedding is needed (for example, if one just wants to use @@ -48,7 +48,7 @@ namespace boost { namespace graph { namespace detail { //face handle policies - + //EmbeddingStorage policy struct store_embedding {}; struct recursive_lazy_list : public store_embedding {}; @@ -65,14 +65,14 @@ namespace boost { namespace graph { namespace detail { template struct lazy_list_node { - typedef std::shared_ptr< lazy_list_node > ptr_t; + typedef shared_ptr< lazy_list_node > ptr_t; lazy_list_node(const DataType& data) : m_reversed(false), m_data(data), m_has_data(true) {} - + lazy_list_node(ptr_t left_child, ptr_t right_child) : m_reversed(false), m_has_data(false), @@ -83,10 +83,10 @@ namespace boost { namespace graph { namespace detail { bool m_reversed; DataType m_data; bool m_has_data; - std::shared_ptr m_left_child; - std::shared_ptr m_right_child; + shared_ptr m_left_child; + shared_ptr m_right_child; }; - + template @@ -139,7 +139,7 @@ namespace boost { namespace graph { namespace detail { struct edge_list_storage { typedef lazy_list_node node_type; - typedef std::shared_ptr< node_type > type; + typedef shared_ptr< node_type > type; type value; void push_back(Edge e) @@ -178,17 +178,17 @@ namespace boost { namespace graph { namespace detail { private: template - void get_list_helper(OutputIterator o_itr, + void get_list_helper(OutputIterator o_itr, type root, bool flipped = false ) { if (!root) return; - + if (root->m_has_data) *o_itr = root->m_data; - + if ((flipped && !root->m_reversed) || (!flipped && root->m_reversed) ) @@ -201,9 +201,9 @@ namespace boost { namespace graph { namespace detail { get_list_helper(o_itr, root->m_left_child, false); get_list_helper(o_itr, root->m_right_child, false); } - + } - + }; @@ -254,20 +254,20 @@ namespace boost { namespace graph { namespace detail { - - template struct face_handle_impl { typedef typename graph_traits::vertex_descriptor vertex_t; typedef typename graph_traits::edge_descriptor edge_t; - typedef typename edge_list_storage::type + typedef typename edge_list_storage::type edge_list_storage_t; - face_handle_impl() : + face_handle_impl() : cached_first_vertex(graph_traits::null_vertex()), cached_second_vertex(graph_traits::null_vertex()), true_first_vertex(graph_traits::null_vertex()), @@ -308,11 +308,11 @@ namespace boost { namespace graph { namespace detail { - template - class face_handle + class face_handle { public: typedef typename graph_traits::vertex_descriptor vertex_t; @@ -347,19 +347,19 @@ namespace boost { namespace graph { namespace detail { } //default copy construction, assignment okay. - - void push_first(edge_t e, const Graph& g) - { + + void push_first(edge_t e, const Graph& g) + { pimpl->edge_list.push_front(e); - pimpl->cached_first_vertex = pimpl->true_first_vertex = + pimpl->cached_first_vertex = pimpl->true_first_vertex = source(e, g) == pimpl->anchor ? target(e,g) : source(e,g); pimpl->cached_first_edge = e; } - - void push_second(edge_t e, const Graph& g) - { + + void push_second(edge_t e, const Graph& g) + { pimpl->edge_list.push_back(e); - pimpl->cached_second_vertex = pimpl->true_second_vertex = + pimpl->cached_second_vertex = pimpl->true_second_vertex = source(e, g) == pimpl->anchor ? target(e,g) : source(e,g); pimpl->cached_second_edge = e; } @@ -370,22 +370,22 @@ namespace boost { namespace graph { namespace detail { } inline vertex_t first_vertex() const - { + { return pimpl->cached_first_vertex; } - - inline vertex_t second_vertex() const - { + + inline vertex_t second_vertex() const + { return pimpl->cached_second_vertex; } - inline vertex_t true_first_vertex() const - { + inline vertex_t true_first_vertex() const + { return pimpl->true_first_vertex; } - inline vertex_t true_second_vertex() const - { + inline vertex_t true_second_vertex() const + { return pimpl->true_second_vertex; } @@ -413,17 +413,17 @@ namespace boost { namespace graph { namespace detail { { return pimpl->cached_first_edge; } - + inline edge_t second_edge() const { return pimpl->cached_second_edge; } - + inline vertex_t get_anchor() const { return pimpl->anchor; } - + void glue_first_to_second (face_handle& bottom) { @@ -432,7 +432,7 @@ namespace boost { namespace graph { namespace detail { pimpl->cached_first_vertex = bottom.pimpl->cached_first_vertex; pimpl->cached_first_edge = bottom.pimpl->cached_first_edge; } - + void glue_second_to_first (face_handle& bottom) { @@ -441,7 +441,7 @@ namespace boost { namespace graph { namespace detail { pimpl->cached_second_vertex = bottom.pimpl->cached_second_vertex; pimpl->cached_second_edge = bottom.pimpl->cached_second_edge; } - + void flip() { pimpl->edge_list.reverse(); @@ -449,7 +449,7 @@ namespace boost { namespace graph { namespace detail { std::swap(pimpl->cached_first_vertex, pimpl->cached_second_vertex); std::swap(pimpl->cached_first_edge, pimpl->cached_second_edge); } - + template void get_list(OutputIterator o_itr) { @@ -481,12 +481,12 @@ namespace boost { namespace graph { namespace detail { pimpl->old_handles.first_edge = pimpl->cached_first_edge; pimpl->old_handles.second_edge = pimpl->cached_second_edge; } - + void store_old_face_handles_dispatch(no_old_handles) {} - boost::std::shared_ptr pimpl; + boost::shared_ptr pimpl; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/plod_generator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/plod_generator.hpp index d0684d88..4e557cf0 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/plod_generator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/plod_generator.hpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include @@ -21,7 +21,7 @@ namespace boost { template - class out_directed_plod_iterator + class out_directed_plod_iterator { public: typedef std::forward_iterator_tag iterator_category; @@ -32,10 +32,10 @@ namespace boost { out_directed_plod_iterator() : gen(0), at_end(true) { } - out_directed_plod_iterator(RandomGenerator& gen, std::size_t n, - double alpha, double beta, + out_directed_plod_iterator(RandomGenerator& gen, std::size_t n, + double alpha, double beta, bool allow_self_loops) - : gen(&gen), n(n), alpha(alpha), beta(beta), + : gen(&gen), n(n), alpha(alpha), beta(beta), allow_self_loops(allow_self_loops), at_end(false), degree(0), current(0, 0) { @@ -50,7 +50,7 @@ namespace boost { pointer operator->() const { return ¤t; } out_directed_plod_iterator& operator++() - { + { using std::pow; uniform_int x(0, n-1); @@ -66,7 +66,7 @@ namespace boost { } std::size_t xv = x(*gen); - degree = (xv == 0? 0 : std::size_t(beta * pow(xv, -alpha))); + degree = (xv == 0? 0 : std::size_t(beta * pow(xv, -alpha))); } do { @@ -85,16 +85,16 @@ namespace boost { } bool operator==(const out_directed_plod_iterator& other) const - { - return at_end == other.at_end; + { + return at_end == other.at_end; } bool operator!=(const out_directed_plod_iterator& other) const - { - return !(*this == other); + { + return !(*this == other); } - private: + private: RandomGenerator* gen; std::size_t n; double alpha; @@ -106,7 +106,7 @@ namespace boost { }; template - class undirected_plod_iterator + class undirected_plod_iterator { typedef std::vector > out_degrees_t; @@ -117,11 +117,11 @@ namespace boost { typedef const value_type* pointer; typedef std::ptrdiff_t difference_type; - undirected_plod_iterator() + undirected_plod_iterator() : gen(0), out_degrees(), degrees_left(0), allow_self_loops(false) { } - undirected_plod_iterator(RandomGenerator& gen, std::size_t n, - double alpha, double beta, + undirected_plod_iterator(RandomGenerator& gen, std::size_t n, + double alpha, double beta, bool allow_self_loops = false) : gen(&gen), n(n), out_degrees(new out_degrees_t), degrees_left(0), allow_self_loops(allow_self_loops) @@ -145,7 +145,7 @@ namespace boost { pointer operator->() const { return ¤t; } undirected_plod_iterator& operator++() - { + { next(); return *this; } @@ -158,8 +158,8 @@ namespace boost { } bool operator==(const undirected_plod_iterator& other) const - { - return degrees_left == other.degrees_left; + { + return degrees_left == other.degrees_left; } bool operator!=(const undirected_plod_iterator& other) const @@ -192,7 +192,7 @@ namespace boost { (*out_degrees)[source] = out_degrees->back(); out_degrees->pop_back(); continue; - } + } // Select target vertex target = x(*gen); @@ -200,7 +200,7 @@ namespace boost { (*out_degrees)[target] = out_degrees->back(); out_degrees->pop_back(); continue; - } else if (source != target + } else if (source != target || (allow_self_loops && (*out_degrees)[source].second > 2)) { break; } @@ -217,7 +217,7 @@ namespace boost { RandomGenerator* gen; std::size_t n; - std::shared_ptr out_degrees; + shared_ptr out_degrees; std::size_t degrees_left; bool allow_self_loops; value_type current; @@ -243,7 +243,7 @@ namespace boost { public: plod_iterator() : inherited() { } - plod_iterator(RandomGenerator& gen, std::size_t n, + plod_iterator(RandomGenerator& gen, std::size_t n, double alpha, double beta, bool allow_self_loops = false) : inherited(gen, n, alpha, beta, allow_self_loops) { } }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/rmat_graph_generator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/rmat_graph_generator.hpp index f51e9e27..4256d7a8 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/rmat_graph_generator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/rmat_graph_generator.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include @@ -24,7 +24,7 @@ #include #include -using boost::std::shared_ptr; +using boost::shared_ptr; using boost::uniform_01; // Returns floor(log_2(n)), and -1 when n is 0 @@ -76,7 +76,7 @@ generate_permutation_vector(RandomGenerator& gen, std::vector& vertexPermutat template std::pair -generate_edge(std::shared_ptr > prob, T n, +generate_edge(shared_ptr > prob, T n, unsigned int SCALE, double a, double b, double c, double d) { T u = 0, v = 0; @@ -213,7 +213,7 @@ namespace boost { private: // Parameters - std::shared_ptr > gen; + shared_ptr > gen; vertices_size_type n; double a, b, c, d; int edge; @@ -328,7 +328,7 @@ namespace boost { private: // Parameters - std::shared_ptr > gen; + shared_ptr > gen; bool permute_vertices; // Internal data structures @@ -442,7 +442,7 @@ namespace boost { private: // Parameters - std::shared_ptr > gen; + shared_ptr > gen; // Internal data structures std::vector values; @@ -576,7 +576,7 @@ namespace boost { private: // Parameters - std::shared_ptr > gen; + shared_ptr > gen; bool bidirectional; // Internal data structures diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/topology.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/topology.hpp index 8e64d090..ada36d19 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/topology.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/graph/topology.hpp @@ -29,10 +29,10 @@ namespace boost { * Topologies * ***********************************************************/ template -class convex_topology +class convex_topology { public: // For VisualAge C++ - struct point + struct point { BOOST_STATIC_CONSTANT(std::size_t, dimensions = Dims); point() { } @@ -129,7 +129,7 @@ class convex_topology typedef point point_type; typedef point_difference point_difference_type; - double distance(point a, point b) const + double distance(point a, point b) const { double dist = 0.; for (std::size_t i = 0; i < Dims; ++i) { @@ -142,7 +142,7 @@ class convex_topology return dist; } - point move_position_toward(point a, double fraction, point b) const + point move_position_toward(point a, double fraction, point b) const { point result; for (std::size_t i = 0; i < Dims; ++i) @@ -206,15 +206,15 @@ class hypercube_topology : public convex_topology typedef typename convex_topology::point_type point_type; typedef typename convex_topology::point_difference_type point_difference_type; - explicit hypercube_topology(double scaling = 1.0) - : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)), - scaling(scaling) + explicit hypercube_topology(double scaling = 1.0) + : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)), + scaling(scaling) { } - hypercube_topology(RandomNumberGenerator& gen, double scaling = 1.0) + hypercube_topology(RandomNumberGenerator& gen, double scaling = 1.0) : gen_ptr(), rand(new rand_t(gen)), scaling(scaling) { } - - point_type random_point() const + + point_type random_point() const { point_type p; for (std::size_t i = 0; i < Dims; ++i) @@ -268,8 +268,8 @@ class hypercube_topology : public convex_topology } private: - std::shared_ptr gen_ptr; - std::shared_ptr rand; + shared_ptr gen_ptr; + shared_ptr rand; double scaling; }; @@ -280,8 +280,8 @@ class square_topology : public hypercube_topology<2, RandomNumberGenerator> public: explicit square_topology(double scaling = 1.0) : inherited(scaling) { } - - square_topology(RandomNumberGenerator& gen, double scaling = 1.0) + + square_topology(RandomNumberGenerator& gen, double scaling = 1.0) : inherited(gen, scaling) { } }; @@ -308,7 +308,7 @@ class rectangle_topology : public convex_topology<2> typedef typename convex_topology<2>::point_type point_type; typedef typename convex_topology<2>::point_difference_type point_difference_type; - point_type random_point() const + point_type random_point() const { point_type p; p[0] = (*rand)() * (right - left) + left; @@ -362,8 +362,8 @@ class rectangle_topology : public convex_topology<2> } private: - std::shared_ptr gen_ptr; - std::shared_ptr rand; + shared_ptr gen_ptr; + shared_ptr rand; double left, top, right, bottom; }; @@ -374,8 +374,8 @@ class cube_topology : public hypercube_topology<3, RandomNumberGenerator> public: explicit cube_topology(double scaling = 1.0) : inherited(scaling) { } - - cube_topology(RandomNumberGenerator& gen, double scaling = 1.0) + + cube_topology(RandomNumberGenerator& gen, double scaling = 1.0) : inherited(gen, scaling) { } }; @@ -389,15 +389,15 @@ class ball_topology : public convex_topology typedef typename convex_topology::point_type point_type; typedef typename convex_topology::point_difference_type point_difference_type; - explicit ball_topology(double radius = 1.0) - : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)), - radius(radius) + explicit ball_topology(double radius = 1.0) + : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)), + radius(radius) { } - ball_topology(RandomNumberGenerator& gen, double radius = 1.0) + ball_topology(RandomNumberGenerator& gen, double radius = 1.0) : gen_ptr(), rand(new rand_t(gen)), radius(radius) { } - - point_type random_point() const + + point_type random_point() const { point_type p; double dist_sum; @@ -457,8 +457,8 @@ class ball_topology : public convex_topology } private: - std::shared_ptr gen_ptr; - std::shared_ptr rand; + shared_ptr gen_ptr; + shared_ptr rand; double radius; }; @@ -469,8 +469,8 @@ class circle_topology : public ball_topology<2, RandomNumberGenerator> public: explicit circle_topology(double radius = 1.0) : inherited(radius) { } - - circle_topology(RandomNumberGenerator& gen, double radius = 1.0) + + circle_topology(RandomNumberGenerator& gen, double radius = 1.0) : inherited(gen, radius) { } }; @@ -481,13 +481,13 @@ class sphere_topology : public ball_topology<3, RandomNumberGenerator> public: explicit sphere_topology(double radius = 1.0) : inherited(radius) { } - - sphere_topology(RandomNumberGenerator& gen, double radius = 1.0) + + sphere_topology(RandomNumberGenerator& gen, double radius = 1.0) : inherited(gen, radius) { } }; template -class heart_topology +class heart_topology { // Heart is defined as the union of three shapes: // Square w/ corners (+-1000, -1000), (0, 0), (0, -2000) @@ -495,7 +495,7 @@ class heart_topology // Circle centered at (500, -500) radius 500*sqrt(2) // Bounding box (-1000, -2000) - (1000, 500*(sqrt(2) - 1)) - struct point + struct point { point() { values[0] = 0.0; values[1] = 0.0; } point(double x, double y) { values[0] = x; values[1] = y; } @@ -507,7 +507,7 @@ class heart_topology double values[2]; }; - bool in_heart(point p) const + bool in_heart(point p) const { #ifndef BOOST_NO_STDC_NAMESPACE using std::abs; @@ -522,7 +522,7 @@ class heart_topology return false; } - bool segment_within_heart(point p1, point p2) const + bool segment_within_heart(point p1, point p2) const { // Assumes that p1 and p2 are within the heart if ((p1[0] < 0) == (p2[0] < 0)) return true; // Same side of symmetry line @@ -538,13 +538,13 @@ class heart_topology public: typedef point point_type; - heart_topology() + heart_topology() : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)) { } - heart_topology(RandomNumberGenerator& gen) + heart_topology(RandomNumberGenerator& gen) : gen_ptr(), rand(new rand_t(gen)) { } - point random_point() const + point random_point() const { point result; do { @@ -556,7 +556,7 @@ class heart_topology // Not going to provide clipping to bounding region or distance from boundary - double distance(point a, point b) const + double distance(point a, point b) const { if (segment_within_heart(a, b)) { // Straight line @@ -567,7 +567,7 @@ class heart_topology } } - point move_position_toward(point a, double fraction, point b) const + point move_position_toward(point a, double fraction, point b) const { if (segment_within_heart(a, b)) { // Straight line @@ -576,10 +576,10 @@ class heart_topology } else { double distance_to_point_a = boost::math::hypot(a[0], a[1]); double distance_to_point_b = boost::math::hypot(b[0], b[1]); - double location_of_point = distance_to_point_a / + double location_of_point = distance_to_point_a / (distance_to_point_a + distance_to_point_b); if (fraction < location_of_point) - return point(a[0] * (1 - fraction / location_of_point), + return point(a[0] * (1 - fraction / location_of_point), a[1] * (1 - fraction / location_of_point)); else return point( @@ -589,8 +589,8 @@ class heart_topology } private: - std::shared_ptr gen_ptr; - std::shared_ptr rand; + shared_ptr gen_ptr; + shared_ptr rand; }; } // namespace boost diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/interprocess_fwd.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/interprocess_fwd.hpp index 0309d6b6..42f170a6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/interprocess_fwd.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/interprocess_fwd.hpp @@ -393,7 +393,7 @@ template class intrusive_ptr; template -class std::shared_ptr; +class shared_ptr; template class weak_ptr; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/enable_shared_from_this.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/enable_shared_from_this.hpp index 98c48c5d..d9f16aec 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/enable_shared_from_this.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/enable_shared_from_this.hpp @@ -19,7 +19,7 @@ #include #include -#include +#include //!\file //!Describes an utility to form a shared pointer from this @@ -27,10 +27,10 @@ namespace boost{ namespace interprocess{ -//!This class is used as a base class that allows a std::shared_ptr to the current +//!This class is used as a base class that allows a shared_ptr to the current //!object to be obtained from within a member function. //!enable_shared_from_this defines two member functions called shared_from_this -//!that return a std::shared_ptr and std::shared_ptr, depending on constness, to this. +//!that return a shared_ptr and shared_ptr, depending on constness, to this. template class enable_shared_from_this { @@ -50,16 +50,16 @@ class enable_shared_from_this /// @endcond public: - std::shared_ptr shared_from_this() + shared_ptr shared_from_this() { - std::shared_ptr p(_internal_weak_this); + shared_ptr p(_internal_weak_this); BOOST_ASSERT(ipcdetail::to_raw_pointer(p.get()) == this); return p; } - std::shared_ptr shared_from_this() const + shared_ptr shared_from_this() const { - std::shared_ptr p(_internal_weak_this); + shared_ptr p(_internal_weak_this); BOOST_ASSERT(ipcdetail::to_raw_pointer(p.get()) == this); return p; } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/shared_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/shared_ptr.hpp index 29844a97..302eb149 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/shared_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/shared_ptr.hpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // -// This file is the adaptation for Interprocess of boost/std::shared_ptr.hpp +// This file is the adaptation for Interprocess of boost/shared_ptr.hpp // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // (C) Copyright Peter Dimov 2001, 2002, 2003 @@ -37,7 +37,7 @@ #include // for std::basic_ostream //!\file -//!Describes the smart pointer std::shared_ptr +//!Describes the smart pointer shared_ptr namespace boost{ namespace interprocess{ @@ -66,11 +66,11 @@ inline void sp_enable_shared_from_this(shared_count c } // namespace ipcdetail -//!std::shared_ptr stores a pointer to a dynamically allocated object. -//!The object pointed to is guaranteed to be deleted when the last std::shared_ptr pointing to +//!shared_ptr stores a pointer to a dynamically allocated object. +//!The object pointed to is guaranteed to be deleted when the last shared_ptr pointing to //!it is destroyed or reset. //! -//!std::shared_ptr is parameterized on +//!shared_ptr is parameterized on //!T (the type of the object pointed to), VoidAllocator (the void allocator to be used //!to allocate the auxiliary data) and Deleter (the deleter whose //!operator() will be used to delete the object. @@ -79,18 +79,18 @@ inline void sp_enable_shared_from_this(shared_count c //!VoidAllocator::pointer type (that is, if typename VoidAllocator::pointer is //!offset_ptr, the internal pointer will be offset_ptr). //! -//!Because the implementation uses reference counting, cycles of std::shared_ptr +//!Because the implementation uses reference counting, cycles of shared_ptr //!instances will not be reclaimed. For example, if main() holds a -//!std::shared_ptr to A, which directly or indirectly holds a std::shared_ptr back -//!to A, A's use count will be 2. Destruction of the original std::shared_ptr +//!shared_ptr to A, which directly or indirectly holds a shared_ptr back +//!to A, A's use count will be 2. Destruction of the original shared_ptr //!will leave A dangling with a use count of 1. //!Use weak_ptr to "break cycles." template -class std::shared_ptr +class shared_ptr { /// @cond private: - typedef std::shared_ptr this_type; + typedef shared_ptr this_type; /// @endcond public: @@ -111,19 +111,19 @@ class std::shared_ptr pointer_traits::template rebind_pointer::type const_allocator_pointer; - BOOST_COPYABLE_AND_MOVABLE(std::shared_ptr) + BOOST_COPYABLE_AND_MOVABLE(shared_ptr) public: - //!Constructs an empty std::shared_ptr. + //!Constructs an empty shared_ptr. //!Use_count() == 0 && get()== 0. - std::shared_ptr() + shared_ptr() : m_pn() // never throws {} - //!Constructs a std::shared_ptr that owns the pointer p. Auxiliary data will be allocated + //!Constructs a shared_ptr that owns the pointer p. Auxiliary data will be allocated //!with a copy of a and the object will be deleted with a copy of d. //!Requirements: Deleter and A's copy constructor must not throw. - explicit std::shared_ptr(const pointer&p, const VoidAllocator &a = VoidAllocator(), const Deleter &d = Deleter()) + explicit shared_ptr(const pointer&p, const VoidAllocator &a = VoidAllocator(), const Deleter &d = Deleter()) : m_pn(p, a, d) { //Check that the pointer passed is of the same type that @@ -137,55 +137,55 @@ class std::shared_ptr ipcdetail::sp_enable_shared_from_this( m_pn, ipcdetail::to_raw_pointer(p), ipcdetail::to_raw_pointer(p) ); } - //!Copy constructs a std::shared_ptr. If r is empty, constructs an empty std::shared_ptr. Otherwise, constructs - //!a std::shared_ptr that shares ownership with r. Never throws. - std::shared_ptr(const std::shared_ptr &r) + //!Copy constructs a shared_ptr. If r is empty, constructs an empty shared_ptr. Otherwise, constructs + //!a shared_ptr that shares ownership with r. Never throws. + shared_ptr(const shared_ptr &r) : m_pn(r.m_pn) // never throws {} - //!Constructs a std::shared_ptr that shares ownership with other and stores p. + //!Constructs a shared_ptr that shares ownership with other and stores p. //!Postconditions: get() == p && use_count() == r.use_count(). //!Throws: nothing. - std::shared_ptr(const std::shared_ptr &other, const pointer &p) + shared_ptr(const shared_ptr &other, const pointer &p) : m_pn(other.m_pn, p) {} - //!If r is empty, constructs an empty std::shared_ptr. Otherwise, constructs - //!a std::shared_ptr that shares ownership with r. Never throws. + //!If r is empty, constructs an empty shared_ptr. Otherwise, constructs + //!a shared_ptr that shares ownership with r. Never throws. template - std::shared_ptr(std::shared_ptr const & r) + shared_ptr(shared_ptr const & r) : m_pn(r.m_pn) // never throws {} - //!Constructs a std::shared_ptr that shares ownership with r and stores + //!Constructs a shared_ptr that shares ownership with r and stores //!a copy of the pointer stored in r. template - explicit std::shared_ptr(weak_ptr const & r) + explicit shared_ptr(weak_ptr const & r) : m_pn(r.m_pn) // may throw {} - //!Move-Constructs a std::shared_ptr that takes ownership of other resource and + //!Move-Constructs a shared_ptr that takes ownership of other resource and //!other is put in default-constructed state. //!Throws: nothing. - explicit std::shared_ptr(BOOST_RV_REF(std::shared_ptr) other) + explicit shared_ptr(BOOST_RV_REF(shared_ptr) other) : m_pn() { this->swap(other); } /// @cond template - std::shared_ptr(std::shared_ptr const & r, ipcdetail::static_cast_tag) + shared_ptr(shared_ptr const & r, ipcdetail::static_cast_tag) : m_pn( pointer(static_cast(ipcdetail::to_raw_pointer(r.m_pn.to_raw_pointer()))) , r.m_pn) {} template - std::shared_ptr(std::shared_ptr const & r, ipcdetail::const_cast_tag) + shared_ptr(shared_ptr const & r, ipcdetail::const_cast_tag) : m_pn( pointer(const_cast(ipcdetail::to_raw_pointer(r.m_pn.to_raw_pointer()))) , r.m_pn) {} template - std::shared_ptr(std::shared_ptr const & r, ipcdetail::dynamic_cast_tag) + shared_ptr(shared_ptr const & r, ipcdetail::dynamic_cast_tag) : m_pn( pointer(dynamic_cast(ipcdetail::to_raw_pointer(r.m_pn.to_raw_pointer()))) , r.m_pn) { @@ -195,26 +195,26 @@ class std::shared_ptr } /// @endcond - //!Equivalent to std::shared_ptr(r).swap(*this). + //!Equivalent to shared_ptr(r).swap(*this). //!Never throws template - std::shared_ptr & operator=(std::shared_ptr const & r) + shared_ptr & operator=(shared_ptr const & r) { m_pn = r.m_pn; // shared_count::op= doesn't throw return *this; } - //!Equivalent to std::shared_ptr(r).swap(*this). + //!Equivalent to shared_ptr(r).swap(*this). //!Never throws - std::shared_ptr & operator=(BOOST_COPY_ASSIGN_REF(std::shared_ptr) r) + shared_ptr & operator=(BOOST_COPY_ASSIGN_REF(shared_ptr) r) { m_pn = r.m_pn; // shared_count::op= doesn't throw return *this; } - //!Move-assignment. Equivalent to std::shared_ptr(other).swap(*this). + //!Move-assignment. Equivalent to shared_ptr(other).swap(*this). //!Never throws - std::shared_ptr & operator=(BOOST_RV_REF(std::shared_ptr) other) // never throws + shared_ptr & operator=(BOOST_RV_REF(shared_ptr) other) // never throws { this_type(other).swap(*this); return *this; @@ -243,7 +243,7 @@ class std::shared_ptr } template - void reset(std::shared_ptr const & r, const pointer &p) + void reset(shared_ptr const & r, const pointer &p) { this_type(r, p).swap(*this); } @@ -282,7 +282,7 @@ class std::shared_ptr bool unique() const // never throws { return m_pn.unique(); } - //!Returns the number of std::shared_ptr objects, *this included, + //!Returns the number of shared_ptr objects, *this included, //!that share ownership with *this, or an unspecified nonnegative //!value when *this is empty. //!use_count() is not necessarily efficient. Use only for @@ -292,13 +292,13 @@ class std::shared_ptr //!Exchanges the contents of the two //!smart pointers. - void swap(std::shared_ptr & other) // never throws + void swap(shared_ptr & other) // never throws { m_pn.swap(other.m_pn); } /// @cond template - bool _internal_less(std::shared_ptr const & rhs) const + bool _internal_less(shared_ptr const & rhs) const { return m_pn < rhs.m_pn; } const_deleter_pointer get_deleter() const @@ -309,50 +309,50 @@ class std::shared_ptr private: - template friend class std::shared_ptr; + template friend class shared_ptr; template friend class weak_ptr; ipcdetail::shared_count m_pn; // reference counter /// @endcond -}; // std::shared_ptr +}; // shared_ptr template inline -bool operator==(std::shared_ptr const & a, std::shared_ptr const & b) +bool operator==(shared_ptr const & a, shared_ptr const & b) { return a.get() == b.get(); } template inline -bool operator!=(std::shared_ptr const & a, std::shared_ptr const & b) +bool operator!=(shared_ptr const & a, shared_ptr const & b) { return a.get() != b.get(); } template inline -bool operator<(std::shared_ptr const & a, std::shared_ptr const & b) +bool operator<(shared_ptr const & a, shared_ptr const & b) { return a._internal_less(b); } template inline -void swap(std::shared_ptr & a, std::shared_ptr & b) +void swap(shared_ptr & a, shared_ptr & b) { a.swap(b); } template inline -std::shared_ptr static_pointer_cast(std::shared_ptr const & r) -{ return std::shared_ptr(r, ipcdetail::static_cast_tag()); } +shared_ptr static_pointer_cast(shared_ptr const & r) +{ return shared_ptr(r, ipcdetail::static_cast_tag()); } template inline -std::shared_ptr const_pointer_cast(std::shared_ptr const & r) -{ return std::shared_ptr(r, ipcdetail::const_cast_tag()); } +shared_ptr const_pointer_cast(shared_ptr const & r) +{ return shared_ptr(r, ipcdetail::const_cast_tag()); } template inline -std::shared_ptr dynamic_pointer_cast(std::shared_ptr const & r) -{ return std::shared_ptr(r, ipcdetail::dynamic_cast_tag()); } +shared_ptr dynamic_pointer_cast(shared_ptr const & r) +{ return shared_ptr(r, ipcdetail::dynamic_cast_tag()); } -// to_raw_pointer() enables boost::mem_fn to recognize std::shared_ptr +// to_raw_pointer() enables boost::mem_fn to recognize shared_ptr template inline -T * to_raw_pointer(std::shared_ptr const & p) +T * to_raw_pointer(shared_ptr const & p) { return p.get(); } // operator<< template inline std::basic_ostream & operator<< - (std::basic_ostream & os, std::shared_ptr const & p) + (std::basic_ostream & os, shared_ptr const & p) { os << p.get(); return os; } //!Returns the type of a shared pointer @@ -364,7 +364,7 @@ struct managed_shared_ptr { typedef typename ManagedMemory::template allocator::type void_allocator; typedef typename ManagedMemory::template deleter::type deleter; - typedef std::shared_ptr< T, void_allocator, deleter> type; + typedef shared_ptr< T, void_allocator, deleter> type; }; //!Returns an instance of a shared pointer constructed @@ -407,9 +407,9 @@ inline typename managed_shared_ptr::type /// @cond #if defined(_MSC_VER) && (_MSC_VER < 1400) -// to_raw_pointer() enables boost::mem_fn to recognize std::shared_ptr +// to_raw_pointer() enables boost::mem_fn to recognize shared_ptr template inline -T * to_raw_pointer(boost::interprocess::std::shared_ptr const & p) +T * to_raw_pointer(boost::interprocess::shared_ptr const & p) { return p.get(); } #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/weak_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/weak_ptr.hpp index 6b91cf87..99c8a631 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/weak_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/interprocess/smart_ptr/weak_ptr.hpp @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include @@ -31,13 +31,13 @@ namespace boost{ namespace interprocess{ //!The weak_ptr class template stores a "weak reference" to an object -//!that's already managed by a std::shared_ptr. To access the object, a weak_ptr -//!can be converted to a std::shared_ptr using the std::shared_ptr constructor or the -//!member function lock. When the last std::shared_ptr to the object goes away -//!and the object is deleted, the attempt to obtain a std::shared_ptr from the +//!that's already managed by a shared_ptr. To access the object, a weak_ptr +//!can be converted to a shared_ptr using the shared_ptr constructor or the +//!member function lock. When the last shared_ptr to the object goes away +//!and the object is deleted, the attempt to obtain a shared_ptr from the //!weak_ptr instances that refer to the deleted object will fail: the constructor //!will throw an exception of type bad_weak_ptr, and weak_ptr::lock will -//!return an empty std::shared_ptr. +//!return an empty shared_ptr. //! //!Every weak_ptr meets the CopyConstructible and Assignable requirements //!of the C++ Standard Library, and so can be used in standard library containers. @@ -100,9 +100,9 @@ class weak_ptr weak_ptr(weak_ptr const & r) : m_pn(r.m_pn) // never throws { - //Construct a temporary std::shared_ptr so that nobody + //Construct a temporary shared_ptr so that nobody //can destroy the value while constructing this - const std::shared_ptr &ref = r.lock(); + const shared_ptr &ref = r.lock(); m_pn.set_pointer(ref.get()); } @@ -114,7 +114,7 @@ class weak_ptr //! //!Throws: nothing. template - weak_ptr(std::shared_ptr const & r) + weak_ptr(shared_ptr const & r) : m_pn(r.m_pn) // never throws {} @@ -127,9 +127,9 @@ class weak_ptr template weak_ptr & operator=(weak_ptr const & r) // never throws { - //Construct a temporary std::shared_ptr so that nobody + //Construct a temporary shared_ptr so that nobody //can destroy the value while constructing this - const std::shared_ptr &ref = r.lock(); + const shared_ptr &ref = r.lock(); m_pn = r.m_pn; m_pn.set_pointer(ref.get()); return *this; @@ -142,30 +142,30 @@ class weak_ptr //!Notes: The implementation is free to meet the effects (and the //!implied guarantees) via different means, without creating a temporary. template - weak_ptr & operator=(std::shared_ptr const & r) // never throws + weak_ptr & operator=(shared_ptr const & r) // never throws { m_pn = r.m_pn; return *this; } - //!Returns: expired()? std::shared_ptr(): std::shared_ptr(*this). + //!Returns: expired()? shared_ptr(): shared_ptr(*this). //! //!Throws: nothing. - std::shared_ptr lock() const // never throws + shared_ptr lock() const // never throws { // optimization: avoid throw overhead if(expired()){ - return std::shared_ptr(); + return shared_ptr(); } BOOST_TRY{ - return std::shared_ptr(*this); + return shared_ptr(*this); } BOOST_CATCH(bad_weak_ptr const &){ // Q: how can we get here? // A: another thread may have invalidated r after the use_count test above. - return std::shared_ptr(); + return shared_ptr(); } BOOST_CATCH_END } - //!Returns: 0 if *this is empty; otherwise, the number of std::shared_ptr objects + //!Returns: 0 if *this is empty; otherwise, the number of shared_ptr objects //!that share ownership with *this. //! //!Throws: nothing. @@ -209,7 +209,7 @@ class weak_ptr private: - template friend class std::shared_ptr; + template friend class shared_ptr; template friend class weak_ptr; ipcdetail::weak_count m_pn; // reference counter diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/chain.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/chain.hpp index 4b046508..4af8cc98 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/chain.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/chain.hpp @@ -22,7 +22,7 @@ #include // logic_error, out_of_range. #include #include // BOOST_MSVC, template friends, -#include // BOOST_NESTED_TEMPLATE +#include // BOOST_NESTED_TEMPLATE #include #include #include @@ -34,7 +34,7 @@ #include // is_filter. #include #include -#include +#include #include #include #include @@ -141,7 +141,7 @@ protected: chain_base(const chain_base& rhs): pimpl_(rhs.pimpl_) { } public: - // dual_use is a pseudo-mode to facilitate filter writing, + // dual_use is a pseudo-mode to facilitate filter writing, // not a genuine mode. BOOST_STATIC_ASSERT((!is_convertible::value)); @@ -150,19 +150,19 @@ public: // Sets the size of the buffer created for the devices to be added to this // chain. Does not affect the size of the buffer for devices already // added. - void set_device_buffer_size(std::streamsize n) + void set_device_buffer_size(std::streamsize n) { pimpl_->device_buffer_size_ = n; } // Sets the size of the buffer created for the filters to be added // to this chain. Does not affect the size of the buffer for filters already // added. - void set_filter_buffer_size(std::streamsize n) + void set_filter_buffer_size(std::streamsize n) { pimpl_->filter_buffer_size_ = n; } // Sets the size of the putback buffer for filters and devices to be added // to this chain. Does not affect the size of the buffer for filters or // devices already added. - void set_pback_size(std::streamsize n) + void set_pback_size(std::streamsize n) { pimpl_->pback_size_ = n; } //----------Device interface----------------------------------------------// @@ -189,7 +189,7 @@ public: T* component(int n) const { return component(n, boost::type()); } // Deprecated. - template + template T* component() const { return component(N); } #endif @@ -230,7 +230,7 @@ public: bool strict_sync(); private: template - void push_impl(const T& t, std::streamsize buffer_size = -1, + void push_impl(const T& t, std::streamsize buffer_size = -1, std::streamsize pback_size = -1) { typedef typename iostreams::category_of::type category; @@ -331,20 +331,20 @@ private: links_.front()->BOOST_IOSTREAMS_PUBSYNC(); try { boost::iostreams::detail::execute_foreach( - links_.rbegin(), links_.rend(), + links_.rbegin(), links_.rend(), closer(BOOST_IOS::in) ); } catch (...) { try { boost::iostreams::detail::execute_foreach( - links_.begin(), links_.end(), + links_.begin(), links_.end(), closer(BOOST_IOS::out) ); } catch (...) { } throw; } boost::iostreams::detail::execute_foreach( - links_.begin(), links_.end(), + links_.begin(), links_.end(), closer(BOOST_IOS::out) ); } @@ -382,7 +382,7 @@ private: //----------Member data---------------------------------------------------// private: - std::shared_ptr pimpl_; + shared_ptr pimpl_; }; } // End namespace detail. diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/code_converter.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/code_converter.hpp index 8ff85a18..280a5d09 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/code_converter.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/code_converter.hpp @@ -24,7 +24,7 @@ #include // max. #include // memcpy. #include -#include // DEDUCED_TYPENAME, +#include // DEDUCED_TYPENAME, #include #include // default_filter_buffer_size. #include @@ -42,7 +42,7 @@ #include #include #include -#include +#include #include #include #include @@ -54,7 +54,7 @@ namespace boost { namespace iostreams { struct code_conversion_error : BOOST_IOSTREAMS_FAILURE { - code_conversion_error() + code_conversion_error() : BOOST_IOSTREAMS_FAILURE("code conversion error") { } }; @@ -91,28 +91,28 @@ Tgt* strncpy_if_same(Tgt* tgt, const Src* src, std::streamsize n) // Buffer and conversion state for reading. template -class conversion_buffer +class conversion_buffer : public buffer< BOOST_DEDUCED_TYPENAME detail::codecvt_extern::type, Alloc - > + > { public: typedef typename Codecvt::state_type state_type; - conversion_buffer() + conversion_buffer() : buffer< BOOST_DEDUCED_TYPENAME detail::codecvt_extern::type, Alloc - >(0) - { - reset(); + >(0) + { + reset(); } state_type& state() { return state_; } - void reset() - { - if (this->size()) + void reset() + { + if (this->size()) this->set(0, 0); - state_ = state_type(); + state_ = state_type(); } private: state_type state_; @@ -128,12 +128,12 @@ struct code_converter_impl { typedef is_convertible can_read; typedef is_convertible can_write; typedef is_convertible is_bidir; - typedef typename + typedef typename iostreams::select< // Disambiguation for Tru64. is_bidir, bidirectional, can_read, input, can_write, output - >::type mode; + >::type mode; typedef typename mpl::if_< is_direct, @@ -147,10 +147,10 @@ struct code_converter_impl { code_converter_impl() : cvt_(), flags_(0) { } ~code_converter_impl() - { - try { - if (flags_ & f_open) close(); - } catch (...) { /* */ } + { + try { + if (flags_ & f_open) close(); + } catch (...) { /* */ } } template @@ -213,7 +213,7 @@ struct code_converter_impl { codecvt_holder cvt_; storage_type dev_; double_object< - buffer_type, + buffer_type, is_double > buf_; int flags_; @@ -232,13 +232,13 @@ struct code_converter_base { Device, Codecvt, Alloc > impl_type; code_converter_base() : pimpl_(new impl_type) { } - std::shared_ptr pimpl_; + shared_ptr pimpl_; }; -template< typename Device, - typename Codecvt = detail::default_codecvt, +template< typename Device, + typename Codecvt = detail::default_codecvt, typename Alloc = std::allocator > -class code_converter +class code_converter : protected code_converter_base { private: @@ -252,28 +252,28 @@ private: typedef typename detail::codecvt_extern::type extern_type; typedef typename detail::codecvt_state::type state_type; public: - typedef intern_type char_type; - struct category + typedef intern_type char_type; + struct category : impl_type::mode, device_tag, closable_tag, localizable_tag { }; BOOST_STATIC_ASSERT(( is_same< - extern_type, + extern_type, BOOST_DEDUCED_TYPENAME char_type_of::type >::value )); public: code_converter() { } #if BOOST_WORKAROUND(__GNUC__, < 3) - code_converter(code_converter& rhs) + code_converter(code_converter& rhs) : code_converter_base(rhs) { } - code_converter(const code_converter& rhs) + code_converter(const code_converter& rhs) : code_converter_base(rhs) { } #endif BOOST_IOSTREAMS_FORWARD( code_converter, open_impl, Device, - BOOST_IOSTREAMS_CONVERTER_PARAMS, + BOOST_IOSTREAMS_CONVERTER_PARAMS, BOOST_IOSTREAMS_CONVERTER_ARGS ) // fstream-like interface. @@ -294,9 +294,9 @@ public: Device* operator->() { return &detail::unwrap_direct(dev()); } private: template // Used for forwarding. - void open_impl(const T& t BOOST_IOSTREAMS_CONVERTER_PARAMS()) - { - impl().open(t BOOST_IOSTREAMS_CONVERTER_ARGS()); + void open_impl(const T& t BOOST_IOSTREAMS_CONVERTER_PARAMS()) + { + impl().open(t BOOST_IOSTREAMS_CONVERTER_ARGS()); } const codecvt_type& cvt() { return impl().cvt_.get(); } @@ -347,7 +347,7 @@ std::streamsize code_converter::read break; case std::codecvt_base::noconv: { - std::streamsize amt = + std::streamsize amt = std::min(next - buf.ptr(), n - total); detail::strncpy_if_same(s + total, buf.ptr(), amt); total += amt; @@ -382,7 +382,7 @@ std::streamsize code_converter::write break; partial = false; } - + // Convert. std::codecvt_base::result result = cvt().out( buf.state(), @@ -399,8 +399,8 @@ std::streamsize code_converter::write break; case std::codecvt_base::noconv: { - std::streamsize amt = - std::min( nint - total - s, + std::streamsize amt = + std::min( nint - total - s, buf.end() - buf.eptr() ); detail::strncpy_if_same(buf.eptr(), s + total, amt); total += amt; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/file.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/file.hpp index c04b2536..f701c9d6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/file.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/file.hpp @@ -21,7 +21,7 @@ #include // openmode, seekdir, int types. #include #include // seek. -#include +#include // Must come last. #include // MSVC. @@ -46,8 +46,8 @@ public: std::streamsize read(char_type* s, std::streamsize n); bool putback(char_type c); std::streamsize write(const char_type* s, std::streamsize n); - std::streampos seek( stream_offset off, BOOST_IOS::seekdir way, - BOOST_IOS::openmode which = + std::streampos seek( stream_offset off, BOOST_IOS::seekdir way, + BOOST_IOS::openmode which = BOOST_IOS::in | BOOST_IOS::out ); void open( const std::string& path, BOOST_IOS::openmode mode = @@ -67,7 +67,7 @@ private: ~impl() { if (file_.is_open()) file_.close(); } BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) file_; }; - std::shared_ptr pimpl_; + shared_ptr pimpl_; }; typedef basic_file file; @@ -87,7 +87,7 @@ struct basic_file_source : private basic_file { using basic_file::is_open; using basic_file::close; basic_file_source( const std::string& path, - BOOST_IOS::openmode mode = + BOOST_IOS::openmode mode = BOOST_IOS::in ) : basic_file(path, mode & ~BOOST_IOS::out, BOOST_IOS::in) { } @@ -128,29 +128,29 @@ struct basic_file_sink : private basic_file { typedef basic_file_sink file_sink; typedef basic_file_sink wfile_sink; - + //------------------Implementation of basic_file------------------------------// template basic_file::basic_file - ( const std::string& path, BOOST_IOS::openmode mode, + ( const std::string& path, BOOST_IOS::openmode mode, BOOST_IOS::openmode base_mode ) -{ +{ open(path, mode, base_mode); } template inline std::streamsize basic_file::read (char_type* s, std::streamsize n) -{ - std::streamsize result = pimpl_->file_.sgetn(s, n); +{ + std::streamsize result = pimpl_->file_.sgetn(s, n); return result != 0 ? result : -1; } template inline bool basic_file::putback(char_type c) -{ - return !!pimpl_->file_.sputbackc(c); +{ + return !!pimpl_->file_.sputbackc(c); } template @@ -160,15 +160,15 @@ inline std::streamsize basic_file::write template std::streampos basic_file::seek - ( stream_offset off, BOOST_IOS::seekdir way, + ( stream_offset off, BOOST_IOS::seekdir way, BOOST_IOS::openmode ) { return iostreams::seek(pimpl_->file_, off, way); } template void basic_file::open - ( const std::string& path, BOOST_IOS::openmode mode, + ( const std::string& path, BOOST_IOS::openmode mode, BOOST_IOS::openmode base_mode ) -{ +{ pimpl_.reset(new impl(path, mode | base_mode)); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/file_descriptor.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/file_descriptor.hpp index 1237ea8a..bb470589 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/file_descriptor.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/file_descriptor.hpp @@ -25,7 +25,7 @@ #include // openmode, seekdir, int types. #include #include -#include +#include // Must come last. #include @@ -86,9 +86,9 @@ public: explicit file_descriptor( const Path& path, BOOST_IOS::openmode mode = BOOST_IOS::in | BOOST_IOS::out ) - { + { init(); - open(detail::path(path), mode); + open(detail::path(path), mode); } // Copy constructor @@ -135,12 +135,12 @@ private: void init(); // open overload taking a detail::path - void open( const detail::path& path, - BOOST_IOS::openmode, + void open( const detail::path& path, + BOOST_IOS::openmode, BOOST_IOS::openmode = BOOST_IOS::openmode(0) ); typedef detail::file_descriptor_impl impl_type; - std::shared_ptr pimpl_; + shared_ptr pimpl_; }; class BOOST_IOSTREAMS_DECL file_descriptor_source : private file_descriptor { @@ -293,16 +293,16 @@ public: #endif // open overload taking a std::string - void open( const std::string& path, + void open( const std::string& path, BOOST_IOS::openmode mode = BOOST_IOS::out ); // open overload taking C-style string - void open( const char* path, + void open( const char* path, BOOST_IOS::openmode mode = BOOST_IOS::out ); // open overload taking a Boost.Filesystem path template - void open( const Path& path, + void open( const Path& path, BOOST_IOS::openmode mode = BOOST_IOS::out ) { open(detail::path(path), mode); } private: diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/mapped_file.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/mapped_file.hpp index 11c0e2c1..8493b177 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/mapped_file.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/device/mapped_file.hpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include @@ -54,25 +54,25 @@ public: }; // Bitmask operations for mapped_file_base::mapmode -mapped_file_base::mapmode +mapped_file_base::mapmode operator|(mapped_file_base::mapmode a, mapped_file_base::mapmode b); -mapped_file_base::mapmode +mapped_file_base::mapmode operator&(mapped_file_base::mapmode a, mapped_file_base::mapmode b); -mapped_file_base::mapmode +mapped_file_base::mapmode operator^(mapped_file_base::mapmode a, mapped_file_base::mapmode b); -mapped_file_base::mapmode +mapped_file_base::mapmode operator~(mapped_file_base::mapmode a); -mapped_file_base::mapmode +mapped_file_base::mapmode operator|=(mapped_file_base::mapmode& a, mapped_file_base::mapmode b); -mapped_file_base::mapmode +mapped_file_base::mapmode operator&=(mapped_file_base::mapmode& a, mapped_file_base::mapmode b); -mapped_file_base::mapmode +mapped_file_base::mapmode operator^=(mapped_file_base::mapmode& a, mapped_file_base::mapmode b); //------------------Definition of mapped_file_params--------------------------// @@ -81,8 +81,8 @@ namespace detail { struct mapped_file_params_base { mapped_file_params_base() - : flags(static_cast(0)), - mode(), offset(0), length(static_cast(-1)), + : flags(static_cast(0)), + mode(), offset(0), length(static_cast(-1)), new_file_size(0), hint(0) { } private: @@ -102,16 +102,16 @@ public: // This template allows Boost.Filesystem paths to be specified when creating or // reopening a memory mapped file, without creating a dependence on // Boost.Filesystem. Possible values of Path include std::string, -// boost::filesystem::path, boost::filesystem::wpath, +// boost::filesystem::path, boost::filesystem::wpath, // and boost::iostreams::detail::path (used to store either a std::string or a // std::wstring). template -struct basic_mapped_file_params - : detail::mapped_file_params_base +struct basic_mapped_file_params + : detail::mapped_file_params_base { typedef detail::mapped_file_params_base base_type; - // For wide paths, instantiate basic_mapped_file_params + // For wide paths, instantiate basic_mapped_file_params // with boost::filesystem::wpath #ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS BOOST_STATIC_ASSERT((!is_same::value)); @@ -215,7 +215,7 @@ private: void init(); void open_impl(const param_type& p); - boost::std::shared_ptr pimpl_; + boost::shared_ptr pimpl_; }; //------------------Definition of mapped_file---------------------------------// @@ -253,7 +253,7 @@ public: size_type length = max_length, stream_offset offset = 0 ); - // Constructor taking a list of parameters, including a + // Constructor taking a list of parameters, including a // std::ios_base::openmode (deprecated) template explicit mapped_file( const Path& path, @@ -283,7 +283,7 @@ public: size_type length = max_length, stream_offset offset = 0 ); - // open overload taking a list of parameters, including a + // open overload taking a list of parameters, including a // std::ios_base::openmode (deprecated) template void open( const Path& path, @@ -387,7 +387,7 @@ mapped_file_source::mapped_file_source(const basic_mapped_file_params& p) { init(); open(p); } template -mapped_file_source::mapped_file_source( +mapped_file_source::mapped_file_source( const Path& path, size_type length, boost::intmax_t offset) { init(); open(path, length, offset); } @@ -423,14 +423,14 @@ mapped_file::mapped_file(const basic_mapped_file_params& p) { open(p); } template -mapped_file::mapped_file( - const Path& path, mapmode flags, +mapped_file::mapped_file( + const Path& path, mapmode flags, size_type length, stream_offset offset ) { open(path, flags, length, offset); } template -mapped_file::mapped_file( - const Path& path, BOOST_IOS::openmode mode, +mapped_file::mapped_file( + const Path& path, BOOST_IOS::openmode mode, size_type length, stream_offset offset ) { open(path, mode, length, offset); } @@ -439,8 +439,8 @@ void mapped_file::open(const basic_mapped_file_params& p) { delegate_.open_impl(p); } template -void mapped_file::open( - const Path& path, mapmode flags, +void mapped_file::open( + const Path& path, mapmode flags, size_type length, stream_offset offset ) { param_type p(path); @@ -451,8 +451,8 @@ void mapped_file::open( } template -void mapped_file::open( - const Path& path, BOOST_IOS::openmode mode, +void mapped_file::open( + const Path& path, BOOST_IOS::openmode mode, size_type length, stream_offset offset ) { param_type p(path); @@ -462,7 +462,7 @@ void mapped_file::open( open(p); } -inline char* mapped_file::data() const +inline char* mapped_file::data() const { return (flags() != readonly) ? const_cast(delegate_.data()) : 0; } //------------------Implementation of mapped_file_sink------------------------// @@ -524,13 +524,13 @@ struct operations { static std::pair input_sequence(mapped_file& file) - { - return std::make_pair(file.begin(), file.end()); + { + return std::make_pair(file.begin(), file.end()); } static std::pair output_sequence(mapped_file& file) - { - return std::make_pair(file.begin(), file.end()); + { + return std::make_pair(file.begin(), file.end()); } }; @@ -540,28 +540,28 @@ struct operations { static std::pair output_sequence(mapped_file_sink& sink) - { - return std::make_pair(sink.begin(), sink.end()); + { + return std::make_pair(sink.begin(), sink.end()); } }; - + //------------------Definition of mapmode operators---------------------------// -inline mapped_file::mapmode +inline mapped_file::mapmode operator|(mapped_file::mapmode a, mapped_file::mapmode b) { return static_cast (static_cast(a) | static_cast(b)); } -inline mapped_file::mapmode +inline mapped_file::mapmode operator&(mapped_file::mapmode a, mapped_file::mapmode b) { return static_cast (static_cast(a) & static_cast(b)); } -inline mapped_file::mapmode +inline mapped_file::mapmode operator^(mapped_file::mapmode a, mapped_file::mapmode b) { return static_cast @@ -574,19 +574,19 @@ operator~(mapped_file::mapmode a) return static_cast(~static_cast(a)); } -inline mapped_file::mapmode +inline mapped_file::mapmode operator|=(mapped_file::mapmode& a, mapped_file::mapmode b) { return a = a | b; } -inline mapped_file::mapmode +inline mapped_file::mapmode operator&=(mapped_file::mapmode& a, mapped_file::mapmode b) { return a = a & b; } -inline mapped_file::mapmode +inline mapped_file::mapmode operator^=(mapped_file::mapmode& a, mapped_file::mapmode b) { return a = a ^ b; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/filter/symmetric.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/filter/symmetric.hpp index 1feff246..cc92b0cf 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/filter/symmetric.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/filter/symmetric.hpp @@ -20,12 +20,12 @@ // // Consume as many characters as possible from the interval // // [begin_in, end_in), without exhausting the output range // // [begin_out, end_out). If flush is true, write as mush output -// // as possible. -// // A return value of true indicates that filter should be called -// // again. More precisely, if flush is false, a return value of +// // as possible. +// // A return value of true indicates that filter should be called +// // again. More precisely, if flush is false, a return value of // // false indicates that the natural end of stream has been reached // // and that all filtered data has been forwarded; if flush is -// // true, a return value of false indicates that all filtered data +// // true, a return value of false indicates that all filtered data // // has been forwarded. // } // void close() { /* Reset filter's state. */ } @@ -57,7 +57,7 @@ #include #include #include -#include +#include // Must come last. #include // MSVC. @@ -188,7 +188,7 @@ public: string_type unconsumed_input() const; // Give impl access to buffer_type on Tru64 -#if !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) +#if !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) private: #endif typedef detail::buffer buffer_type; @@ -266,7 +266,7 @@ private: int state_; }; - std::shared_ptr pimpl_; + shared_ptr pimpl_; }; BOOST_IOSTREAMS_PIPABLE(symmetric_filter, 2) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/invert.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/invert.hpp index 2348a2fe..82e6a4b4 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/invert.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iostreams/invert.hpp @@ -10,11 +10,11 @@ #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once -#endif +#endif -#include // copy, min. +#include // copy, min. #include -#include // BOOST_DEDUCED_TYPENAME. +#include // BOOST_DEDUCED_TYPENAME. #include // default_filter_buffer_size. #include #include @@ -26,7 +26,7 @@ #include // clear_flags, call_reset #include #include -#include +#include #include // Must come last. @@ -51,7 +51,7 @@ public: typedef typename char_type_of::type char_type; typedef typename int_type_of::type int_type; typedef char_traits traits_type; - typedef typename + typedef typename mpl::if_< is_convertible< base_category, @@ -60,15 +60,15 @@ public: output, input >::type mode; - struct category - : mode, - filter_tag, - multichar_tag, - closable_tag + struct category + : mode, + filter_tag, + multichar_tag, + closable_tag { }; - explicit inverse( const Filter& filter, - std::streamsize buffer_size = - default_filter_buffer_size) + explicit inverse( const Filter& filter, + std::streamsize buffer_size = + default_filter_buffer_size) : pimpl_(new impl(filter, buffer_size)) { } @@ -93,10 +93,10 @@ public: buf().flush(snk); } return snk.second().count() == 0 && - status == traits_type::eof() - ? + status == traits_type::eof() + ? -1 - : + : snk.second().count(); } @@ -111,7 +111,7 @@ public: flags() = f_write; buf().set(0, 0); } - + filtered_array_source src(filter(), array_source(s, n)); for (bool good = true; src.second().count() < n && good; ) { buf().fill(src); @@ -133,20 +133,20 @@ private: filter_ref filter() { return boost::ref(pimpl_->filter_); } detail::buffer& buf() { return pimpl_->buf_; } int& flags() { return pimpl_->flags_; } - + enum flags_ { f_read = 1, f_write = 2 }; struct impl { - impl(const Filter& filter, std::streamsize n) + impl(const Filter& filter, std::streamsize n) : filter_(filter), buf_(n), flags_(0) { buf_.set(0, 0); } Filter filter_; detail::buffer buf_; int flags_; }; - std::shared_ptr pimpl_; + shared_ptr pimpl_; }; // @@ -157,7 +157,7 @@ private: // template inverse invert(const Filter& f) { return inverse(f); } - + //----------------------------------------------------------------------------// } } // End namespaces iostreams, boost. diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iterator/indirect_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iterator/indirect_iterator.hpp index 00fdedff..abff7e76 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iterator/indirect_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/iterator/indirect_iterator.hpp @@ -26,11 +26,11 @@ #include #ifdef BOOST_MPL_CFG_NO_HAS_XXX -# include +# include # include # include # include -#endif +#endif #include // must be last #include @@ -45,7 +45,7 @@ namespace boost struct indirect_base { typedef typename iterator_traits::value_type dereferenceable; - + typedef iterator_adaptor< indirect_iterator , Iter @@ -69,7 +69,7 @@ namespace boost struct indirect_base {}; } // namespace detail - + template < class Iterator , class Value = use_default @@ -107,14 +107,14 @@ namespace boost : super_t(y.base()) {} - private: + private: typename super_t::reference dereference() const { # if BOOST_WORKAROUND(__BORLANDC__, < 0x5A0 ) return const_cast(**this->base()); # else return **this->base(); -# endif +# endif } }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/locale/boundary/index.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/locale/boundary/index.hpp index 81adff7e..5948dcca 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/locale/boundary/index.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/locale/boundary/index.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #ifdef BOOST_MSVC @@ -34,7 +34,7 @@ namespace boost { namespace locale { - + namespace boundary { /// /// \defgroup boundary Boundary Analysis @@ -88,7 +88,7 @@ namespace boost { // // C++0x requires that string is continious in memory and all known // string implementations - // do this because of c_str() support. + // do this because of c_str() support. // if(linear_iterator_traits::is_linear && b!=e) @@ -117,8 +117,8 @@ namespace boost { mapping(boundary_type type, base_iterator begin, base_iterator end, - std::locale const &loc) - : + std::locale const &loc) + : index_(new index_type()), begin_(begin), end_(end) @@ -147,12 +147,12 @@ namespace boost { } private: - boost::std::shared_ptr index_; + boost::shared_ptr index_; base_iterator begin_,end_; }; template - class segment_index_iterator : + class segment_index_iterator : public boost::iterator_facade< segment_index_iterator, segment, @@ -164,7 +164,7 @@ namespace boost { typedef BaseIterator base_iterator; typedef mapping mapping_type; typedef segment segment_type; - + segment_index_iterator() : current_(0,0),map_(0) { } @@ -267,13 +267,13 @@ namespace boost { { size_t dist=std::distance(map_->begin(),p); index_type::const_iterator b=map_->index().begin(),e=map_->index().end(); - index_type::const_iterator + index_type::const_iterator boundary_point=std::upper_bound(b,e,break_info(dist)); while(boundary_point != e && (boundary_point->rule & mask_)==0) boundary_point++; current_.first = current_.second = boundary_point - b; - + if(full_select_) { while(current_.first > 0) { current_.first --; @@ -318,31 +318,31 @@ namespace boost { bool valid_offset(size_t offset) const { - return offset == 0 + return offset == 0 || offset == size() // make sure we not acess index[size] || (index()[offset].rule & mask_)!=0; } - + size_t size() const { return index().size(); } - + index_type const &index() const { return map_->index(); } - - + + segment_type value_; std::pair current_; mapping_type const *map_; rule_type mask_; bool full_select_; }; - + template - class boundary_point_index_iterator : + class boundary_point_index_iterator : public boost::iterator_facade< boundary_point_index_iterator, boundary_point, @@ -354,7 +354,7 @@ namespace boost { typedef BaseIterator base_iterator; typedef mapping mapping_type; typedef boundary_point boundary_point_type; - + boundary_point_index_iterator() : current_(0),map_(0) { } @@ -466,22 +466,22 @@ namespace boost { bool valid_offset(size_t offset) const { - return offset == 0 + return offset == 0 || offset + 1 >= size() // last and first are always valid regardless of mark || (index()[offset].rule & mask_)!=0; } - + size_t size() const { return index().size(); } - + index_type const &index() const { return map_->index(); } - - + + boundary_point_type value_; size_t current_; mapping_type const *map_; @@ -498,10 +498,10 @@ namespace boost { template class boundary_point_index; - + /// - /// \brief This class holds an index of segments in the text range and allows to iterate over them + /// \brief This class holds an index of segments in the text range and allows to iterate over them /// /// This class is provides \ref begin() and \ref end() member functions that return bidirectional iterators /// to the \ref segment objects. @@ -512,7 +512,7 @@ namespace boost { /// various masks %as \ref word_any. /// \n /// The default is to select any types of boundaries. - /// \n + /// \n /// For example: using word %boundary analysis, when the provided mask is \ref word_kana then the iterators /// would iterate only over the words containing Kana letters and \ref word_any would select all types of /// words excluding ranges that consist of white space and punctuation marks. So iterating over the text @@ -533,7 +533,7 @@ namespace boost { /// terminator "!" or "?". But changing \ref full_select() to true, the selected segment would include /// all the text up to previous valid %boundary point and would return two expected sentences: /// "Hello!" and "How\nare you?". - /// + /// /// This class allows to find a segment according to the given iterator in range using \ref find() member /// function. /// @@ -555,7 +555,7 @@ namespace boost { template class segment_index { public: - + /// /// The type of the iterator used to iterate over the original text /// @@ -591,7 +591,7 @@ namespace boost { typedef segment value_type; /// - /// Default constructor. + /// Default constructor. /// /// \note /// @@ -610,7 +610,7 @@ namespace boost { base_iterator begin, base_iterator end, rule_type mask, - std::locale const &loc=std::locale()) + std::locale const &loc=std::locale()) : map_(type,begin,end,loc), mask_(mask), @@ -624,7 +624,7 @@ namespace boost { segment_index(boundary_type type, base_iterator begin, base_iterator end, - std::locale const &loc=std::locale()) + std::locale const &loc=std::locale()) : map_(type,begin,end,loc), mask_(0xFFFFFFFFu), @@ -655,7 +655,7 @@ namespace boost { /// segment_index const &operator = (boundary_point_index const &); - + /// /// Create a new index for %boundary analysis \ref boundary_type "type" of the text /// in range [begin,end) for locale \a loc. @@ -694,7 +694,7 @@ namespace boost { } /// - /// Find a first valid segment following a position \a p. + /// Find a first valid segment following a position \a p. /// /// If \a p is inside a valid segment this segment is selected: /// @@ -704,7 +704,7 @@ namespace boost { /// - "t|o be or ", would point to "to", /// - "to be or| ", would point to end. /// - /// + /// /// Preconditions: the segment_index should have a mapping and \a p should be valid iterator /// to the text in the mapped range. /// @@ -714,17 +714,17 @@ namespace boost { { return iterator(p,&map_,mask_,full_select_); } - + /// /// Get the mask of rules that are used - /// + /// rule_type rule() const { return mask_; } /// /// Set the mask of rules that are used - /// + /// void rule(rule_type v) { mask_ = v; @@ -743,7 +743,7 @@ namespace boost { /// following part "are you?" /// - bool full_select() const + bool full_select() const { return full_select_; } @@ -761,11 +761,11 @@ namespace boost { /// following part "are you?" /// - void full_select(bool v) + void full_select(bool v) { full_select_ = v; } - + private: friend class boundary_point_index; typedef details::mapping mapping_type; @@ -793,14 +793,14 @@ namespace boost { /// - "Hello! How\n|are you?" /// - "Hello! How\nare you?|" /// - /// However if \ref rule() is set to \ref sentence_term then the selected %boundary points would be: + /// However if \ref rule() is set to \ref sentence_term then the selected %boundary points would be: /// /// - "|Hello! How\nare you?" /// - "Hello! |How\nare you?" /// - "Hello! How\nare you?|" - /// + /// /// Such that a %boundary point defined by a line feed character would be ignored. - /// + /// /// This class allows to find a boundary_point according to the given iterator in range using \ref find() member /// function. /// @@ -858,9 +858,9 @@ namespace boost { /// an object that represents the selected \ref boundary_point "boundary point". /// typedef boundary_point value_type; - + /// - /// Default constructor. + /// Default constructor. /// /// \note /// @@ -871,7 +871,7 @@ namespace boost { boundary_point_index() : mask_(0xFFFFFFFFu) { } - + /// /// Create a segment_index for %boundary analysis \ref boundary_type "type" of the text /// in range [begin,end) using a rule \a mask for locale \a loc. @@ -880,7 +880,7 @@ namespace boost { base_iterator begin, base_iterator end, rule_type mask, - std::locale const &loc=std::locale()) + std::locale const &loc=std::locale()) : map_(type,begin,end,loc), mask_(mask) @@ -893,7 +893,7 @@ namespace boost { boundary_point_index(boundary_type type, base_iterator begin, base_iterator end, - std::locale const &loc=std::locale()) + std::locale const &loc=std::locale()) : map_(type,begin,end,loc), mask_(0xFFFFFFFFu) @@ -969,7 +969,7 @@ namespace boost { /// /// - "|to be", would return %boundary point at "|to be", /// - "t|o be", would point to "to| be" - /// + /// /// Preconditions: the boundary_point_index should have a mapping and \a p should be valid iterator /// to the text in the mapped range. /// @@ -979,17 +979,17 @@ namespace boost { { return iterator(p,&map_,mask_); } - + /// /// Get the mask of rules that are used - /// + /// rule_type rule() const { return mask_; } /// /// Set the mask of rules that are used - /// + /// void rule(rule_type v) { mask_ = v; @@ -1002,8 +1002,8 @@ namespace boost { mapping_type map_; rule_type mask_; }; - - /// \cond INTERNAL + + /// \cond INTERNAL template segment_index::segment_index(boundary_point_index const &other) : map_(other.map_), @@ -1011,7 +1011,7 @@ namespace boost { full_select_(false) { } - + template boundary_point_index::boundary_point_index(segment_index const &other) : map_(other.map_), @@ -1025,7 +1025,7 @@ namespace boost { map_ = other.map_; return *this; } - + template boundary_point_index const &boundary_point_index::operator=(segment_index const &other) { @@ -1033,7 +1033,7 @@ namespace boost { return *this; } /// \endcond - + typedef segment_index ssegment_index; ///< convenience typedef typedef segment_index wssegment_index; ///< convenience typedef #ifdef BOOST_HAS_CHAR16_T @@ -1042,7 +1042,7 @@ namespace boost { #ifdef BOOST_HAS_CHAR32_T typedef segment_index u32ssegment_index;///< convenience typedef #endif - + typedef segment_index csegment_index; ///< convenience typedef typedef segment_index wcsegment_index; ///< convenience typedef #ifdef BOOST_HAS_CHAR16_T @@ -1060,7 +1060,7 @@ namespace boost { #ifdef BOOST_HAS_CHAR32_T typedef boundary_point_index u32sboundary_point_index;///< convenience typedef #endif - + typedef boundary_point_index cboundary_point_index; ///< convenience typedef typedef boundary_point_index wcboundary_point_index; ///< convenience typedef #ifdef BOOST_HAS_CHAR16_T diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/locale/generator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/locale/generator.hpp index e586b32c..cd34a6fc 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/locale/generator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/locale/generator.hpp @@ -20,10 +20,10 @@ namespace boost { template - class std::shared_ptr; + class shared_ptr; /// - /// \brief This is the main namespace that encloses all localization classes + /// \brief This is the main namespace that encloses all localization classes /// namespace locale { @@ -39,7 +39,7 @@ namespace boost { static const uint32_t character_first_facet = char_facet; ///< First facet specific for character type static const uint32_t character_last_facet = char32_t_facet; ///< Last facet specific for character type static const uint32_t all_characters = 0xFFFF; ///< Special mask -- generate all - + typedef uint32_t character_facet_type; /// backend,std::string const &id) const; + void set_all_options(shared_ptr backend,std::string const &id) const; generator(generator const &); void operator=(generator const &); @@ -231,5 +231,5 @@ namespace boost { #endif -// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 +// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/communicator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/communicator.hpp index 68b7afea..e450e2a5 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/communicator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/communicator.hpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include #include @@ -89,7 +89,7 @@ enum comm_create_kind { comm_duplicate, comm_take_ownership, comm_attach }; /** * INTERNAL ONLY - * + * * Forward declaration of @c group needed for the @c group * constructor and accessor. */ @@ -436,7 +436,7 @@ class BOOST_MPI_DECL communicator * @brief Receive an array of values from a remote process. * * This routine blocks until it receives an array of values from the - * process @p source with the given @p tag. If the type @c T is + * process @p source with the given @p tag. If the type @c T is * * @param source The process that will be sending data. This will * either be a process rank within the communicator or the @@ -518,7 +518,7 @@ class BOOST_MPI_DECL communicator * @c skeleton_proxy objects except that @c isend will not block * while waiting for the data to be transmitted. Instead, a request * object will be immediately returned, allowing one to query the - * status of the communication or wait until it has completed. + * status of the communication or wait until it has completed. * * The semantics of this routine are equivalent to a non-blocking * send of a @c packed_skeleton_oarchive storing the skeleton of @@ -628,7 +628,7 @@ class BOOST_MPI_DECL communicator * @brief Initiate receipt of an array of values from a remote process. * * This routine initiates a receive operation for an array of values - * transmitted by process @p source with the given @p tag. + * transmitted by process @p source with the given @p tag. * * @param source The process that will be sending data. This will * either be a process rank within the communicator or the @@ -824,9 +824,9 @@ class BOOST_MPI_DECL communicator #if 0 template - communicator - with_cartesian_topology(const Extents& extents, - bool periodic = false, + communicator + with_cartesian_topology(const Extents& extents, + bool periodic = false, bool reorder = false) const; template @@ -863,7 +863,7 @@ class BOOST_MPI_DECL communicator * * Function object that frees an MPI communicator and deletes the * memory associated with it. Intended to be used as a deleter with - * std::shared_ptr. + * shared_ptr. */ struct comm_free { @@ -877,7 +877,7 @@ class BOOST_MPI_DECL communicator } }; - + /** * INTERNAL ONLY * @@ -904,7 +904,7 @@ class BOOST_MPI_DECL communicator * datatype, so we map directly to that datatype. */ template - void + void array_send_impl(int dest, int tag, const T* values, int n, mpl::true_) const; /** @@ -915,8 +915,8 @@ class BOOST_MPI_DECL communicator * data, to be deserialized on the receiver side. */ template - void - array_send_impl(int dest, int tag, const T* values, int n, + void + array_send_impl(int dest, int tag, const T* values, int n, mpl::false_) const; /** @@ -945,8 +945,8 @@ class BOOST_MPI_DECL communicator * datatype, so we map directly to that datatype. */ template - request - array_isend_impl(int dest, int tag, const T* values, int n, + request + array_isend_impl(int dest, int tag, const T* values, int n, mpl::true_) const; /** @@ -957,8 +957,8 @@ class BOOST_MPI_DECL communicator * data, to be deserialized on the receiver side. */ template - request - array_isend_impl(int dest, int tag, const T* values, int n, + request + array_isend_impl(int dest, int tag, const T* values, int n, mpl::false_) const; /** @@ -987,7 +987,7 @@ class BOOST_MPI_DECL communicator * datatype, so we map directly to that datatype. */ template - status + status array_recv_impl(int source, int tag, T* values, int n, mpl::true_) const; /** @@ -998,7 +998,7 @@ class BOOST_MPI_DECL communicator * MPI_PACKED. We'll receive it and then deserialize. */ template - status + status array_recv_impl(int source, int tag, T* values, int n, mpl::false_) const; /** @@ -1027,7 +1027,7 @@ class BOOST_MPI_DECL communicator * map directly to that datatype. */ template - request + request array_irecv_impl(int source, int tag, T* values, int n, mpl::true_) const; /** @@ -1038,10 +1038,10 @@ class BOOST_MPI_DECL communicator * MPI_PACKED. We'll receive it and then deserialize. */ template - request + request array_irecv_impl(int source, int tag, T* values, int n, mpl::false_) const; - std::shared_ptr comm_ptr; + shared_ptr comm_ptr; }; /** @@ -1070,13 +1070,13 @@ inline bool operator!=(const communicator& comm1, const communicator& comm2) * Implementation details * ************************************************************************/ // Count elements in a message -template +template inline optional status::count() const { return count_impl(is_mpi_datatype()); } -template +template optional status::count_impl(mpl::true_) const { if (m_count != -1) @@ -1092,7 +1092,7 @@ optional status::count_impl(mpl::true_) const return m_count = return_value; } -template +template inline optional status::count_impl(mpl::false_) const { if (m_count == -1) @@ -1140,7 +1140,7 @@ communicator::array_send_impl(int dest, int tag, const T* values, int n, mpl::true_) const { BOOST_MPI_CHECK_RESULT(MPI_Send, - (const_cast(values), n, + (const_cast(values), n, get_mpi_datatype(*values), dest, tag, MPI_Comm(*this))); } @@ -1173,7 +1173,7 @@ status communicator::recv_impl(int source, int tag, T& value, mpl::true_) const status stat; BOOST_MPI_CHECK_RESULT(MPI_Recv, - (const_cast(&value), 1, + (const_cast(&value), 1, get_mpi_datatype(value), source, tag, MPI_Comm(*this), &stat.m_status)); return stat; @@ -1202,13 +1202,13 @@ status communicator::recv(int source, int tag, T& value) const } template -status -communicator::array_recv_impl(int source, int tag, T* values, int n, +status +communicator::array_recv_impl(int source, int tag, T* values, int n, mpl::true_) const { status stat; BOOST_MPI_CHECK_RESULT(MPI_Recv, - (const_cast(values), n, + (const_cast(values), n, get_mpi_datatype(*values), source, tag, MPI_Comm(*this), &stat.m_status)); return stat; @@ -1216,7 +1216,7 @@ communicator::array_recv_impl(int source, int tag, T* values, int n, template status -communicator::array_recv_impl(int source, int tag, T* values, int n, +communicator::array_recv_impl(int source, int tag, T* values, int n, mpl::false_) const { // Receive the message @@ -1255,7 +1255,7 @@ communicator::isend_impl(int dest, int tag, const T& value, mpl::true_) const { request req; BOOST_MPI_CHECK_RESULT(MPI_Isend, - (const_cast(&value), 1, + (const_cast(&value), 1, get_mpi_datatype(value), dest, tag, MPI_Comm(*this), &req.m_requests[0])); return req; @@ -1268,7 +1268,7 @@ template request communicator::isend_impl(int dest, int tag, const T& value, mpl::false_) const { - std::shared_ptr archive(new packed_oarchive(*this)); + shared_ptr archive(new packed_oarchive(*this)); *archive << value; request result = isend(dest, tag, *archive); result.m_data = archive; @@ -1290,7 +1290,7 @@ communicator::array_isend_impl(int dest, int tag, const T* values, int n, { request req; BOOST_MPI_CHECK_RESULT(MPI_Isend, - (const_cast(values), n, + (const_cast(values), n, get_mpi_datatype(*values), dest, tag, MPI_Comm(*this), &req.m_requests[0])); return req; @@ -1298,10 +1298,10 @@ communicator::array_isend_impl(int dest, int tag, const T* values, int n, template request -communicator::array_isend_impl(int dest, int tag, const T* values, int n, +communicator::array_isend_impl(int dest, int tag, const T* values, int n, mpl::false_) const { - std::shared_ptr archive(new packed_oarchive(*this)); + shared_ptr archive(new packed_oarchive(*this)); *archive << n << boost::serialization::make_array(values, n); request result = isend(dest, tag, *archive); result.m_data = archive; @@ -1324,15 +1324,15 @@ namespace detail { template struct serialized_irecv_data { - serialized_irecv_data(const communicator& comm, int source, int tag, + serialized_irecv_data(const communicator& comm, int source, int tag, T& value) - : comm(comm), source(source), tag(tag), ia(comm), value(value) - { + : comm(comm), source(source), tag(tag), ia(comm), value(value) + { } - void deserialize(status& stat) - { - ia >> value; + void deserialize(status& stat) + { + ia >> value; stat.m_count = 1; } @@ -1347,7 +1347,7 @@ namespace detail { template<> struct serialized_irecv_data { - serialized_irecv_data(const communicator& comm, int source, int tag, + serialized_irecv_data(const communicator& comm, int source, int tag, packed_iarchive& ia) : comm(comm), source(source), tag(tag), ia(ia) { } @@ -1367,10 +1367,10 @@ namespace detail { template struct serialized_array_irecv_data { - serialized_array_irecv_data(const communicator& comm, int source, int tag, + serialized_array_irecv_data(const communicator& comm, int source, int tag, T* values, int n) : comm(comm), source(source), tag(tag), ia(comm), values(values), n(n) - { + { } void deserialize(status& stat); @@ -1390,26 +1390,26 @@ namespace detail { // Determine how much data we are going to receive int count; ia >> count; - + // Deserialize the data in the message boost::serialization::array arr(values, count > n? n : count); ia >> arr; - + if (count > n) { boost::throw_exception( std::range_error("communicator::recv: message receive overflow")); } - + stat.m_count = count; } } template -optional +optional request::handle_serialized_irecv(request* self, request_action action) { typedef detail::serialized_irecv_data data_t; - std::shared_ptr data = static_pointer_cast(self->m_data); + shared_ptr data = static_pointer_cast(self->m_data); if (action == ra_wait) { status stat; @@ -1421,7 +1421,7 @@ request::handle_serialized_irecv(request* self, request_action action) data->ia.resize(data->count); BOOST_MPI_CHECK_RESULT(MPI_Irecv, (data->ia.address(), data->ia.size(), MPI_PACKED, - stat.source(), stat.tag(), + stat.source(), stat.tag(), MPI_Comm(data->comm), self->m_requests + 1)); } @@ -1444,11 +1444,11 @@ request::handle_serialized_irecv(request* self, request_action action) data->ia.resize(data->count); BOOST_MPI_CHECK_RESULT(MPI_Irecv, (data->ia.address(), data->ia.size(),MPI_PACKED, - stat.source(), stat.tag(), + stat.source(), stat.tag(), MPI_Comm(data->comm), self->m_requests + 1)); } else return optional(); // We have not finished yet - } + } // Check if we have received the message data BOOST_MPI_CHECK_RESULT(MPI_Test, @@ -1456,7 +1456,7 @@ request::handle_serialized_irecv(request* self, request_action action) if (flag) { data->deserialize(stat); return stat; - } else + } else return optional(); } else { return optional(); @@ -1464,11 +1464,11 @@ request::handle_serialized_irecv(request* self, request_action action) } template -optional +optional request::handle_serialized_array_irecv(request* self, request_action action) { typedef detail::serialized_array_irecv_data data_t; - std::shared_ptr data = static_pointer_cast(self->m_data); + shared_ptr data = static_pointer_cast(self->m_data); if (action == ra_wait) { status stat; @@ -1480,7 +1480,7 @@ request::handle_serialized_array_irecv(request* self, request_action action) data->ia.resize(data->count); BOOST_MPI_CHECK_RESULT(MPI_Irecv, (data->ia.address(), data->ia.size(), MPI_PACKED, - stat.source(), stat.tag(), + stat.source(), stat.tag(), MPI_Comm(data->comm), self->m_requests + 1)); } @@ -1503,11 +1503,11 @@ request::handle_serialized_array_irecv(request* self, request_action action) data->ia.resize(data->count); BOOST_MPI_CHECK_RESULT(MPI_Irecv, (data->ia.address(), data->ia.size(),MPI_PACKED, - stat.source(), stat.tag(), + stat.source(), stat.tag(), MPI_Comm(data->comm), self->m_requests + 1)); } else return optional(); // We have not finished yet - } + } // Check if we have received the message data BOOST_MPI_CHECK_RESULT(MPI_Test, @@ -1515,7 +1515,7 @@ request::handle_serialized_array_irecv(request* self, request_action action) if (flag) { data->deserialize(stat); return stat; - } else + } else return optional(); } else { return optional(); @@ -1525,12 +1525,12 @@ request::handle_serialized_array_irecv(request* self, request_action action) // We're receiving a type that has an associated MPI datatype, so we // map directly to that datatype. template -request +request communicator::irecv_impl(int source, int tag, T& value, mpl::true_) const { request req; BOOST_MPI_CHECK_RESULT(MPI_Irecv, - (const_cast(&value), 1, + (const_cast(&value), 1, get_mpi_datatype(value), source, tag, MPI_Comm(*this), &req.m_requests[0])); return req; @@ -1541,34 +1541,34 @@ request communicator::irecv_impl(int source, int tag, T& value, mpl::false_) const { typedef detail::serialized_irecv_data data_t; - std::shared_ptr data(new data_t(*this, source, tag, value)); + shared_ptr data(new data_t(*this, source, tag, value)); request req; req.m_data = data; req.m_handler = request::handle_serialized_irecv; BOOST_MPI_CHECK_RESULT(MPI_Irecv, - (&data->count, 1, + (&data->count, 1, get_mpi_datatype(data->count), source, tag, MPI_Comm(*this), &req.m_requests[0])); - + return req; } template -request +request communicator::irecv(int source, int tag, T& value) const { return this->irecv_impl(source, tag, value, is_mpi_datatype()); } template -request -communicator::array_irecv_impl(int source, int tag, T* values, int n, +request +communicator::array_irecv_impl(int source, int tag, T* values, int n, mpl::true_) const { request req; BOOST_MPI_CHECK_RESULT(MPI_Irecv, - (const_cast(values), n, + (const_cast(values), n, get_mpi_datatype(*values), source, tag, MPI_Comm(*this), &req.m_requests[0])); return req; @@ -1576,17 +1576,17 @@ communicator::array_irecv_impl(int source, int tag, T* values, int n, template request -communicator::array_irecv_impl(int source, int tag, T* values, int n, +communicator::array_irecv_impl(int source, int tag, T* values, int n, mpl::false_) const { typedef detail::serialized_array_irecv_data data_t; - std::shared_ptr data(new data_t(*this, source, tag, values, n)); + shared_ptr data(new data_t(*this, source, tag, values, n)); request req; req.m_data = data; req.m_handler = request::handle_serialized_array_irecv; BOOST_MPI_CHECK_RESULT(MPI_Irecv, - (&data->count, 1, + (&data->count, 1, get_mpi_datatype(data->count), source, tag, MPI_Comm(*this), &req.m_requests[0])); @@ -1657,7 +1657,7 @@ communicator::recv(int source, int tag, content& c) const { return recv(source,tag,c); -} +} /** * INTERNAL ONLY diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/detail/communicator_sc.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/detail/communicator_sc.hpp index 1102675f..1dfcc3c5 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/detail/communicator_sc.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/detail/communicator_sc.hpp @@ -45,7 +45,7 @@ template request communicator::isend(int dest, int tag, const skeleton_proxy& proxy) const { - std::shared_ptr + shared_ptr archive(new packed_skeleton_oarchive(*this)); *archive << proxy.object; @@ -58,13 +58,13 @@ namespace detail { template struct serialized_irecv_data > { - serialized_irecv_data(const communicator& comm, int source, int tag, + serialized_irecv_data(const communicator& comm, int source, int tag, skeleton_proxy proxy) - : comm(comm), source(source), tag(tag), isa(comm), + : comm(comm), source(source), tag(tag), isa(comm), ia(isa.get_skeleton()), proxy(proxy) { } - void deserialize(status& stat) - { + void deserialize(status& stat) + { isa >> proxy.object; stat.m_count = 1; } @@ -84,7 +84,7 @@ namespace detail { { typedef serialized_irecv_data > inherited; - serialized_irecv_data(const communicator& comm, int source, int tag, + serialized_irecv_data(const communicator& comm, int source, int tag, const skeleton_proxy& proxy) : inherited(comm, source, tag, proxy) { } }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/graph_communicator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/graph_communicator.hpp index f9747c77..6cafb1fe 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/graph_communicator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/graph_communicator.hpp @@ -59,7 +59,7 @@ class BOOST_MPI_DECL graph_communicator : public communicator * underlying MPI_Comm. This operation is used for "casting" from a * communicator to a graph communicator. */ - explicit graph_communicator(const std::shared_ptr& comm_ptr) + explicit graph_communicator(const shared_ptr& comm_ptr) { #ifndef BOOST_DISABLE_ASSERTS int status; @@ -99,7 +99,7 @@ public: */ graph_communicator(const MPI_Comm& comm, comm_create_kind kind) : communicator(comm, kind) - { + { #ifndef BOOST_DISABLE_ASSERTS int status; BOOST_MPI_CHECK_RESULT(MPI_Topo_test, ((MPI_Comm)*this, &status)); @@ -116,8 +116,8 @@ public: * resulting communicator will be a NULL communicator. * * @param comm The communicator that the new, graph communicator - * will be based on. - * + * will be based on. + * * @param graph Any type that meets the requirements of the * Incidence Graph and Vertex List Graph concepts from the Boost Graph * Library. This structure of this graph will become the topology @@ -130,8 +130,8 @@ public: * within the original communicator. */ template - explicit - graph_communicator(const communicator& comm, const Graph& graph, + explicit + graph_communicator(const communicator& comm, const Graph& graph, bool reorder = false); /** @@ -145,7 +145,7 @@ public: * @param comm The communicator that the new, graph communicator * will be based on. The ranks in @c rank refer to the processes in * this communicator. - * + * * @param graph Any type that meets the requirements of the * Incidence Graph and Vertex List Graph concepts from the Boost Graph * Library. This structure of this graph will become the topology @@ -164,8 +164,8 @@ public: * within the original communicator. */ template - explicit - graph_communicator(const communicator& comm, const Graph& graph, + explicit + graph_communicator(const communicator& comm, const Graph& graph, RankMap rank, bool reorder = false); protected: @@ -177,7 +177,7 @@ protected: */ template void - setup_graph(const communicator& comm, const Graph& graph, RankMap rank, + setup_graph(const communicator& comm, const Graph& graph, RankMap rank, bool reorder); }; @@ -186,16 +186,16 @@ protected: ****************************************************************************/ template -graph_communicator::graph_communicator(const communicator& comm, - const Graph& graph, +graph_communicator::graph_communicator(const communicator& comm, + const Graph& graph, bool reorder) { this->setup_graph(comm, graph, get(vertex_index, graph), reorder); } template -graph_communicator::graph_communicator(const communicator& comm, - const Graph& graph, +graph_communicator::graph_communicator(const communicator& comm, + const Graph& graph, RankMap rank, bool reorder) { this->setup_graph(comm, graph, rank, reorder); @@ -204,7 +204,7 @@ graph_communicator::graph_communicator(const communicator& comm, template void -graph_communicator::setup_graph(const communicator& comm, const Graph& graph, +graph_communicator::setup_graph(const communicator& comm, const Graph& graph, RankMap rank, bool reorder) { typedef typename graph_traits::vertex_descriptor vertex_descriptor; @@ -234,7 +234,7 @@ graph_communicator::setup_graph(const communicator& comm, const Graph& graph, // Create the new communicator MPI_Comm newcomm; BOOST_MPI_CHECK_RESULT(MPI_Graph_create, - ((MPI_Comm)comm, + ((MPI_Comm)comm, nvertices, &indices[0], edges.empty()? (int*)0 : &edges[0], @@ -254,10 +254,10 @@ namespace detail { * communicator's graph topology. */ class comm_out_edge_iterator - : public iterator_facade, random_access_traversal_tag, - const std::pair&, + const std::pair&, int> { public: @@ -304,10 +304,10 @@ namespace detail { * communicator's graph topology. */ class comm_adj_iterator - : public iterator_facade { public: @@ -349,10 +349,10 @@ namespace detail { * topology. */ class comm_edge_iterator - : public iterator_facade, forward_traversal_tag, - const std::pair&, + const std::pair&, int> { public: @@ -381,9 +381,9 @@ namespace detail { return edge_index == other.edge_index; } - void increment() - { - ++edge_index; + void increment() + { + ++edge_index; } shared_array indices; @@ -478,7 +478,7 @@ int num_edges(const graph_communicator& comm); /** * @brief Returns a property map that maps from vertices in a - * communicator's graph topology to their index values. + * communicator's graph topology to their index values. * * Since the vertices are ranks in the communicator, the returned * property map is the identity property map. @@ -522,16 +522,16 @@ struct graph_traits { typedef std::pair edge_descriptor; typedef directed_tag directed_category; typedef disallow_parallel_edge_tag edge_parallel_category; - + /** * INTERNAL ONLY */ struct traversal_category - : incidence_graph_tag, - adjacency_graph_tag, - vertex_list_graph_tag, - edge_list_graph_tag - { + : incidence_graph_tag, + adjacency_graph_tag, + vertex_list_graph_tag, + edge_list_graph_tag + { }; /** diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/group.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/group.hpp index 5fa5e4b5..103b35a1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/group.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/group.hpp @@ -16,7 +16,7 @@ #define BOOST_MPI_GROUP_HPP #include -#include +#include #include #include @@ -62,7 +62,7 @@ public: /** * @brief Determine the rank of the calling process in the group. - * + * * This routine is equivalent to @c MPI_Group_rank. * * @returns The rank of the calling process in the group, which will @@ -167,11 +167,11 @@ public: * * @returns A new group containing all of the processes in the * current group except those processes with ranks @c [first, last) - * in the current group. + * in the current group. */ template group exclude(InputIterator first, InputIterator last); - + protected: /** @@ -179,7 +179,7 @@ protected: * * Function object that frees an MPI group and deletes the * memory associated with it. Intended to be used as a deleter with - * std::shared_ptr. + * shared_ptr. */ struct group_free { @@ -199,7 +199,7 @@ protected: * @c group class. When there are no more such instances, the group * will be automatically freed. */ - std::shared_ptr group_ptr; + shared_ptr group_ptr; }; /** @@ -223,7 +223,7 @@ BOOST_MPI_DECL bool operator==(const group& g1, const group& g2); * processes in the same order. */ inline bool operator!=(const group& g1, const group& g2) -{ +{ return !(g1 == g2); } @@ -260,7 +260,7 @@ BOOST_MPI_DECL group operator-(const group& g1, const group& g2); * Implementation details * ************************************************************************/ template -OutputIterator +OutputIterator group::translate_ranks(InputIterator first, InputIterator last, const group& to_group, OutputIterator out) { @@ -283,11 +283,11 @@ group::translate_ranks(InputIterator first, InputIterator last, /** * INTERNAL ONLY - * + * * Specialization of translate_ranks that handles the one case where * we can avoid any memory allocation or copying. */ -template<> +template<> BOOST_MPI_DECL int* group::translate_ranks(int* first, int* last, const group& to_group, int* out); @@ -306,7 +306,7 @@ group group::include(InputIterator first, InputIterator last) /** * INTERNAL ONLY - * + * * Specialization of group::include that handles the one case where we * can avoid any memory allocation or copying before creating the * group. @@ -328,7 +328,7 @@ group group::exclude(InputIterator first, InputIterator last) /** * INTERNAL ONLY - * + * * Specialization of group::exclude that handles the one case where we * can avoid any memory allocation or copying before creating the * group. diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/intercommunicator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/intercommunicator.hpp index d57c79e2..ad246b59 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/intercommunicator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/intercommunicator.hpp @@ -24,7 +24,7 @@ namespace boost { namespace mpi { * * Forward declaration of the MPI "group" representation, for use in * the description of the @c intercommunicator class. - */ + */ class group; /** @@ -45,8 +45,8 @@ class group; * intercommunicators occurs between the processes in the local group * and the processes in the remote group; communication within a group * must use a different (intra-)communicator. - * - */ + * + */ class BOOST_MPI_DECL intercommunicator : public communicator { private: @@ -59,7 +59,7 @@ private: * underlying MPI_Comm. This operation is used for "casting" from a * communicator to an intercommunicator. */ - explicit intercommunicator(const std::shared_ptr& cp) + explicit intercommunicator(const shared_ptr& cp) { this->comm_ptr = cp; } @@ -149,7 +149,7 @@ public: * Merge the local and remote groups in this intercommunicator into * a new intracommunicator containing the union of the processes in * both groups. This method is equivalent to @c MPI_Intercomm_merge. - * + * * @param high Whether the processes in this group should have the * higher rank numbers than the processes in the other group. Each * of the processes within a particular group shall have the same diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/request.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/request.hpp index e43f00a8..cb36cc5a 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/request.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/request.hpp @@ -14,7 +14,7 @@ #include #include -#include +#include #include namespace boost { namespace mpi { @@ -29,7 +29,7 @@ class communicator; * receive and will be returned from @c isend or @c irecv, * respectively. */ -class BOOST_MPI_DECL request +class BOOST_MPI_DECL request { public: /** @@ -62,7 +62,7 @@ class BOOST_MPI_DECL request private: enum request_action { ra_wait, ra_test, ra_cancel }; - typedef optional (*handler_type)(request* self, + typedef optional (*handler_type)(request* self, request_action action); /** @@ -71,7 +71,7 @@ class BOOST_MPI_DECL request * Handles the non-blocking receive of a serialized value. */ template - static optional + static optional handle_serialized_irecv(request* self, request_action action); /** @@ -80,7 +80,7 @@ class BOOST_MPI_DECL request * Handles the non-blocking receive of an array of serialized values. */ template - static optional + static optional handle_serialized_array_irecv(request* self, request_action action); public: // template friends are not portable @@ -92,7 +92,7 @@ class BOOST_MPI_DECL request handler_type m_handler; /// INTERNAL ONLY - std::shared_ptr m_data; + shared_ptr m_data; friend class communicator; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/skeleton_and_content.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/skeleton_and_content.hpp index 78c5fb27..dcd13bfe 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/skeleton_and_content.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/mpi/skeleton_and_content.hpp @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include namespace boost { namespace mpi { @@ -197,7 +197,7 @@ public: } private: - boost::std::shared_ptr holder; + boost::shared_ptr holder; }; /** @brief Returns the content of an object, suitable for transmission diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/pointee.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/pointee.hpp index d4d24f49..9794b8e7 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/pointee.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/pointee.hpp @@ -8,7 +8,7 @@ // // typename pointee

::type provides the pointee type of P. // -// For example, it is T for T* and X for std::shared_ptr. +// For example, it is T for T* and X for shared_ptr. // // http://www.boost.org/libs/iterator/doc/pointee.html // @@ -20,7 +20,7 @@ # include # include -namespace boost { +namespace boost { namespace detail { @@ -34,25 +34,25 @@ namespace detail struct iterator_pointee { typedef typename iterator_traits::value_type value_type; - + struct impl { template static char test(T const&); - + static char (& test(value_type&) )[2]; - + static Iterator& x; }; - + BOOST_STATIC_CONSTANT(bool, is_constant = sizeof(impl::test(*impl::x)) == 1); - + typedef typename mpl::if_c< # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) ::boost::detail::iterator_pointee::is_constant # else is_constant -# endif +# endif , typename add_const::type , value_type >::type type; @@ -68,7 +68,7 @@ struct pointee > { }; - + } // namespace boost #endif // POINTEE_DWA200415_HPP diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/detail/config_file.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/detail/config_file.hpp index 0aa83ba1..4c2c15b9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/detail/config_file.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/detail/config_file.hpp @@ -25,7 +25,7 @@ #include #include -#include +#include @@ -38,7 +38,7 @@ namespace boost { namespace program_options { namespace detail { for(; i !=e; ++i) { *i; } - + Syntax conventions: - config file can not contain positional options @@ -47,10 +47,10 @@ namespace boost { namespace program_options { namespace detail { - variable assignments are in the form name '=' value. spaces around '=' are trimmed. - - Section names are given in brackets. + - Section names are given in brackets. The actual option name is constructed by combining current section - name and specified option name, with dot between. If section_name + name and specified option name, with dot between. If section_name already contains dot at the end, new dot is not inserted. For example: @verbatim [gui.accessibility] @@ -61,8 +61,8 @@ namespace boost { namespace program_options { namespace detail { TODO: maybe, we should just accept a pointer to options_description class. - */ - class common_config_file_iterator + */ + class common_config_file_iterator : public eof_iterator { public: @@ -74,9 +74,9 @@ namespace boost { namespace program_options { namespace detail { virtual ~common_config_file_iterator() {} public: // Method required by eof_iterator - + void get(); - + protected: // Stubs for derived classes // Obtains next line from the config file @@ -85,7 +85,7 @@ namespace boost { namespace program_options { namespace detail { // constructor of this class, but to avoid templating this class // we'd need polymorphic iterator, which does not exist yet. virtual bool getline(std::string&) { return false; } - + private: /** Adds another allowed option. If the 'name' ends with '*', then all options with the same prefix are @@ -94,7 +94,7 @@ namespace boost { namespace program_options { namespace detail { void add_option(const char* name); // Returns true if 's' is a registered option name. - bool allowed_option(const std::string& s) const; + bool allowed_option(const std::string& s) const; // That's probably too much data for iterator, since // it will be copied, but let's not bother for now. @@ -113,20 +113,20 @@ namespace boost { namespace program_options { namespace detail { found_eof(); } - /** Creates a config file parser for the specified stream. + /** Creates a config file parser for the specified stream. */ - basic_config_file_iterator(std::basic_istream& is, + basic_config_file_iterator(std::basic_istream& is, const std::set& allowed_options, - bool allow_unregistered = false); + bool allow_unregistered = false); private: // base overrides bool getline(std::string&); private: // internal data - std::shared_ptr > is; + shared_ptr > is; }; - + typedef basic_config_file_iterator config_file_iterator; typedef basic_config_file_iterator wconfig_file_iterator; @@ -139,12 +139,12 @@ namespace boost { namespace program_options { namespace detail { template basic_config_file_iterator:: - basic_config_file_iterator(std::basic_istream& is, + basic_config_file_iterator(std::basic_istream& is, const std::set& allowed_options, bool allow_unregistered) : common_config_file_iterator(allowed_options, allow_unregistered) { - this->is.reset(&is, null_deleter()); + this->is.reset(&is, null_deleter()); get(); } @@ -173,7 +173,7 @@ namespace boost { namespace program_options { namespace detail { basic_config_file_iterator::getline(std::string& s); #endif - + }}} diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/options_description.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/options_description.hpp index 2b5dee37..62530b2d 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/options_description.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/options_description.hpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include @@ -27,12 +27,12 @@ #if defined(BOOST_MSVC) # pragma warning (push) -# pragma warning (disable:4251) // class 'boost::std::shared_ptr' needs to have dll-interface to be used by clients of class 'boost::program_options::option_description' +# pragma warning (disable:4251) // class 'boost::shared_ptr' needs to have dll-interface to be used by clients of class 'boost::program_options::option_description' #endif /** Boost namespace */ -namespace boost { +namespace boost { /** Namespace for the library. */ namespace program_options { @@ -67,7 +67,7 @@ namespace program_options { So, we have to use plain old pointers. Besides, users are not expected to use the constructor directly. - + The 'name' parameter is interpreted by the following rules: - if there's no "," character in 'name', it specifies long name - otherwise, the part before "," specifies long name and the part @@ -76,7 +76,7 @@ namespace program_options { option_description(const char* name, const value_semantic* s); - /** Initializes the class with the passed data. + /** Initializes the class with the passed data. */ option_description(const char* name, const value_semantic* s, @@ -118,9 +118,9 @@ namespace program_options { const std::string& description() const; /// Semantic of option's value - std::shared_ptr semantic() const; - - /// Returns the option name, formatted suitably for usage message. + shared_ptr semantic() const; + + /// Returns the option name, formatted suitably for usage message. std::string format_name() const; /** Returns the parameter name and properties, formatted suitably for @@ -128,19 +128,19 @@ namespace program_options { std::string format_parameter() const; private: - + option_description& set_name(const char* name); std::string m_short_name, m_long_name, m_description; - // std::shared_ptr is needed to simplify memory management in + // shared_ptr is needed to simplify memory management in // copy ctor and destructor. - std::shared_ptr m_value_semantic; + shared_ptr m_value_semantic; }; class options_description; - /** Class which provides convenient creation syntax to option_description. - */ + /** Class which provides convenient creation syntax to option_description. + */ class BOOST_PROGRAM_OPTIONS_DECL options_description_easy_init { public: options_description_easy_init(options_description* owner); @@ -152,12 +152,12 @@ namespace program_options { options_description_easy_init& operator()(const char* name, const value_semantic* s); - + options_description_easy_init& operator()(const char* name, const value_semantic* s, const char* description); - + private: options_description* owner; }; @@ -166,14 +166,14 @@ namespace program_options { /** A set of option descriptions. This provides convenient interface for adding new option (the add_options) method, and facilities to search for options by name. - + See @ref a_adding_options "here" for option adding interface discussion. @sa option_description */ class BOOST_PROGRAM_OPTIONS_DECL options_description { public: static const unsigned m_default_line_length; - + /** Creates the instance. */ options_description(unsigned line_length = m_default_line_length, unsigned min_description_length = m_default_line_length / 2); @@ -188,11 +188,11 @@ namespace program_options { unsigned line_length = m_default_line_length, unsigned min_description_length = m_default_line_length / 2); /** Adds new variable description. Throws duplicate_variable_error if - either short or long name matches that of already present one. + either short or long name matches that of already present one. */ - void add(std::shared_ptr desc); + void add(shared_ptr desc); /** Adds a group of option description. This has the same - effect as adding all option_descriptions in 'desc' + effect as adding all option_descriptions in 'desc' individually, except that output operator will show a separate group. Returns *this. @@ -202,29 +202,29 @@ namespace program_options { public: /** Returns an object of implementation-defined type suitable for adding options to options_description. The returned object will - have overloaded operator() with parameter type matching + have overloaded operator() with parameter type matching 'option_description' constructors. Calling the operator will create new option_description instance and add it. */ options_description_easy_init add_options(); - const option_description& find(const std::string& name, - bool approx, + const option_description& find(const std::string& name, + bool approx, bool long_ignore_case = false, bool short_ignore_case = false) const; - const option_description* find_nothrow(const std::string& name, + const option_description* find_nothrow(const std::string& name, bool approx, bool long_ignore_case = false, bool short_ignore_case = false) const; - const std::vector< std::shared_ptr >& options() const; + const std::vector< shared_ptr >& options() const; /** Produces a human readable output of 'desc', listing options, their descriptions and allowed parameters. Other options_description instances previously passed to add will be output separately. */ - friend BOOST_PROGRAM_OPTIONS_DECL std::ostream& operator<<(std::ostream& os, + friend BOOST_PROGRAM_OPTIONS_DECL std::ostream& operator<<(std::ostream& os, const options_description& desc); /** Outputs 'desc' to the specified stream, calling 'f' to output each @@ -233,7 +233,7 @@ namespace program_options { private: typedef std::map::const_iterator name2index_iterator; - typedef std::pair + typedef std::pair approximation_range; //approximation_range find_approximation(const std::string& prefix) const; @@ -241,11 +241,11 @@ namespace program_options { std::string m_caption; const unsigned m_line_length; const unsigned m_min_description_length; - + // Data organization is chosen because: // - there could be two names for one option // - option_add_proxy needs to know the last added option - std::vector< std::shared_ptr > m_options; + std::vector< shared_ptr > m_options; // Whether the option comes from one of declared groups. #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, BOOST_TESTED_AT(313)) @@ -256,7 +256,7 @@ namespace program_options { std::vector belong_to_group; #endif - std::vector< std::shared_ptr > groups; + std::vector< shared_ptr > groups; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/variables_map.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/variables_map.hpp index 47811f78..be0a4b64 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/variables_map.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/program_options/variables_map.hpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include @@ -31,35 +31,35 @@ namespace boost { namespace program_options { // forward declaration - /** Stores in 'm' all options that are defined in 'options'. + /** Stores in 'm' all options that are defined in 'options'. If 'm' already has a non-defaulted value of an option, that value - is not changed, even if 'options' specify some value. + is not changed, even if 'options' specify some value. */ - BOOST_PROGRAM_OPTIONS_DECL + BOOST_PROGRAM_OPTIONS_DECL void store(const basic_parsed_options& options, variables_map& m, bool utf8 = false); - /** Stores in 'm' all options that are defined in 'options'. + /** Stores in 'm' all options that are defined in 'options'. If 'm' already has a non-defaulted value of an option, that value - is not changed, even if 'options' specify some value. + is not changed, even if 'options' specify some value. This is wide character variant. */ - BOOST_PROGRAM_OPTIONS_DECL - void store(const basic_parsed_options& options, + BOOST_PROGRAM_OPTIONS_DECL + void store(const basic_parsed_options& options, variables_map& m); /** Runs all 'notify' function for options in 'm'. */ BOOST_PROGRAM_OPTIONS_DECL void notify(variables_map& m); - /** Class holding value of option. Contains details about how the + /** Class holding value of option. Contains details about how the value is set and allows to conveniently obtain the value. */ class BOOST_PROGRAM_OPTIONS_DECL variable_value { public: variable_value() : m_defaulted(false) {} - variable_value(const boost::any& xv, bool xdefaulted) - : v(xv), m_defaulted(xdefaulted) + variable_value(const boost::any& xv, bool xdefaulted) + : v(xv), m_defaulted(xdefaulted) {} /** If stored value if of type T, returns that value. Otherwise, @@ -92,10 +92,10 @@ namespace boost { namespace program_options { // they are known only after all sources are stored. By that // time options_description for the first source might not // be easily accessible, so we need to store semantic here. - std::shared_ptr m_value_semantic; + shared_ptr m_value_semantic; friend BOOST_PROGRAM_OPTIONS_DECL - void store(const basic_parsed_options& options, + void store(const basic_parsed_options& options, variables_map& m, bool); friend BOOST_PROGRAM_OPTIONS_DECL class variables_map; @@ -138,8 +138,8 @@ namespace boost { namespace program_options { const abstract_variables_map* m_next; }; - /** Concrete variables map which store variables in real map. - + /** Concrete variables map which store variables in real map. + This class is derived from std::map, so you can use all map operators to examine its content. */ @@ -155,8 +155,8 @@ namespace boost { namespace program_options { { return abstract_variables_map::operator[](name); } // Override to clear some extra fields. - void clear(); - + void clear(); + void notify(); private: @@ -169,10 +169,10 @@ namespace boost { namespace program_options { std::set m_final; friend BOOST_PROGRAM_OPTIONS_DECL - void store(const basic_parsed_options& options, + void store(const basic_parsed_options& options, variables_map& xm, bool utf8); - + /** Names of required options, filled by parser which has access to options_description. The map values are the "canonical" names for each corresponding option. diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/dynamic_property_map.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/dynamic_property_map.hpp index e470ad0e..f5f4230e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/dynamic_property_map.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/dynamic_property_map.hpp @@ -206,9 +206,9 @@ private: // struct dynamic_properties { - typedef std::multimap > + typedef std::multimap > property_maps_type; - typedef boost::function3, + typedef boost::function3, const std::string&, const boost::any&, const boost::any&> generate_fn_type; @@ -226,7 +226,7 @@ public: dynamic_properties& property(const std::string& name, PropertyMap property_map_) { - boost::std::shared_ptr pm( + boost::shared_ptr pm( boost::static_pointer_cast( boost::make_shared >(property_map_))); property_maps.insert(property_maps_type::value_type(name, pm)); @@ -246,13 +246,13 @@ public: { return property_maps.lower_bound(name); } void - insert(const std::string& name, boost::std::shared_ptr pm) + insert(const std::string& name, boost::shared_ptr pm) { property_maps.insert(property_maps_type::value_type(name, pm)); } template - boost::std::shared_ptr + boost::shared_ptr generate(const std::string& name, const Key& key, const Value& value) { if(!generate_fn) { @@ -280,7 +280,7 @@ put(const std::string& name, dynamic_properties& dp, const Key& key, } } - boost::std::shared_ptr new_map = dp.generate(name, key, value); + boost::shared_ptr new_map = dp.generate(name, key, value); if (new_map.get()) { new_map->put(key, value); dp.insert(name, new_map); @@ -290,7 +290,7 @@ put(const std::string& name, dynamic_properties& dp, const Key& key, } } -#ifndef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS +#ifndef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS template Value get(const std::string& name, const dynamic_properties& dp, const Key& key) @@ -333,11 +333,11 @@ get(const std::string& name, const dynamic_properties& dp, const Key& key) // The easy way to ignore properties. inline -boost::std::shared_ptr +boost::shared_ptr ignore_other_properties(const std::string&, const boost::any&, const boost::any&) { - return boost::std::shared_ptr(); + return boost::shared_ptr(); } } // namespace boost diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/distributed_property_map.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/distributed_property_map.hpp index b39202ed..c34e073e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/distributed_property_map.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/distributed_property_map.hpp @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include @@ -93,10 +93,10 @@ namespace detail { template static inline void do_put(PropertyMap pm, const Key& key, const Value& value) - { + { using boost::put; - put(pm, key, value); + put(pm, key, value); } }; @@ -240,7 +240,7 @@ class distributed_property_map property_map_put, /** A request to retrieve a particular value in a property - * map. The message contains a key. The owner of that key will + * map. The message contains a key. The owner of that key will * reply with a value. */ property_map_get, @@ -377,7 +377,7 @@ class distributed_property_map reference operator[](const key_type& key) const { owner_local_pair p = get(data->global, key); - + if (p.first == process_id(data->process_group)) { return data->storage[p.second]; } else { @@ -397,11 +397,11 @@ class distributed_property_map * \internal * */ - void + void request_put(process_id_type p, const key_type& k, const value_type& v) const - { - send(data->process_group, p, property_map_put, - boost::parallel::detail::make_untracked_pair(k, v)); + { + send(data->process_group, p, property_map_put, + boost::parallel::detail::make_untracked_pair(k, v)); } /** Access the ghost cell for the given key. @@ -419,11 +419,11 @@ class distributed_property_map struct data_t { - data_t(const ProcessGroup& pg, const GlobalMap& global, + data_t(const ProcessGroup& pg, const GlobalMap& global, const StorageMap& pm, const function1& dv, bool has_default_resolver) - : process_group(pg), global(global), storage(pm), - ghost_cells(), max_ghost_cells(1000000), get_default_value(dv), + : process_group(pg), global(global), storage(pm), + ghost_cells(), max_ghost_cells(1000000), get_default_value(dv), has_default_resolver(has_default_resolver), model(cm_forward) { } /// The process group @@ -437,7 +437,7 @@ class distributed_property_map StorageMap storage; /// The ghost cells - std::shared_ptr ghost_cells; + shared_ptr ghost_cells; /// The maximum number of ghost cells we are permitted to hold. If /// zero, we are permitted to have an infinite number of ghost @@ -478,7 +478,7 @@ class distributed_property_map }; friend struct data_t; - std::shared_ptr data; + shared_ptr data; private: // Prunes the least recently used ghost cells until we have @c @@ -493,36 +493,36 @@ class distributed_property_map template struct handle_message { - explicit handle_message(const std::shared_ptr& data, + explicit handle_message(const shared_ptr& data, const Reduce& reduce = Reduce()) : data_ptr(data), reduce(reduce) { } void operator()(process_id_type source, int tag); /// Individual message handlers - void - handle_put(int source, int tag, - const boost::parallel::detail::untracked_pair& data, + void + handle_put(int source, int tag, + const boost::parallel::detail::untracked_pair& data, trigger_receive_context); value_type - handle_get(int source, int tag, const key_type& data, + handle_get(int source, int tag, const key_type& data, trigger_receive_context); void - handle_multiget(int source, int tag, + handle_multiget(int source, int tag, const std::vector& data, trigger_receive_context); void handle_multiget_reply - (int source, int tag, + (int source, int tag, const std::vector >& msg, trigger_receive_context); void handle_multiput - (int source, int tag, + (int source, int tag, const std::vector >& data, trigger_receive_context); @@ -537,7 +537,7 @@ class distributed_property_map bidirectional consistency. */ struct on_synchronize { - explicit on_synchronize(const std::shared_ptr& data) : data_ptr(data) { } + explicit on_synchronize(const shared_ptr& data) : data_ptr(data) { } void operator()(); @@ -581,7 +581,7 @@ get(const PBGL_DISTRIB_PMAP& pm, { using boost::get; - typename property_traits::value_type p = + typename property_traits::value_type p = get(pm.data->global, key); if (p.first == process_id(pm.data->process_group)) { @@ -609,13 +609,13 @@ put(const PBGL_DISTRIB_PMAP& pm, { using boost::put; - typename property_traits::value_type p = + typename property_traits::value_type p = get(pm.data->global, key); if (p.first == process_id(pm.data->process_group)) { put(pm.data->storage, p.second, value); } else { - if (pm.data->model & cm_forward) + if (pm.data->model & cm_forward) pm.request_put(p.first, key, value); pm.cell(key, false) = value; @@ -637,7 +637,7 @@ local_put(const PBGL_DISTRIB_PMAP& pm, { using boost::put; - typename property_traits::value_type p = + typename property_traits::value_type p = get(pm.data->global, key); if (p.first == process_id(pm.data->process_group)) @@ -669,7 +669,7 @@ synchronize(PBGL_DISTRIB_PMAP& pm) /// Create a distributed property map. template inline distributed_property_map -make_distributed_property_map(const ProcessGroup& pg, GlobalMap global, +make_distributed_property_map(const ProcessGroup& pg, GlobalMap global, StorageMap storage) { typedef distributed_property_map @@ -680,10 +680,10 @@ make_distributed_property_map(const ProcessGroup& pg, GlobalMap global, /** * \overload */ -template inline distributed_property_map -make_distributed_property_map(const ProcessGroup& pg, GlobalMap global, +make_distributed_property_map(const ProcessGroup& pg, GlobalMap global, StorageMap storage, Reduce reduce) { typedef distributed_property_map diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/global_index_map.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/global_index_map.hpp index eae5d112..e40d27a0 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/global_index_map.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/global_index_map.hpp @@ -15,7 +15,7 @@ #include #include -#include +#include namespace boost { namespace parallel { @@ -29,7 +29,7 @@ public: typedef readable_property_map_tag category; template - global_index_map(ProcessGroup pg, value_type num_local_indices, + global_index_map(ProcessGroup pg, value_type num_local_indices, IndexMap index_map, GlobalMap global) : index_map(index_map), global(global) { @@ -37,7 +37,7 @@ public: starting_index.reset(new std::vector(num_processes(pg) + 1)); send(pg, 0, 0, num_local_indices); synchronize(pg); - + // Populate starting_index in all processes if (process_id(pg) == 0) { (*starting_index)[0] = 0; @@ -55,7 +55,7 @@ public: } } - friend inline value_type + friend inline value_type get(const global_index_map& gim, const key_type& x) { using boost::get; @@ -64,7 +64,7 @@ public: } private: - std::shared_ptr > starting_index; + shared_ptr > starting_index; IndexMap index_map; GlobalMap global; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/impl/distributed_property_map.ipp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/impl/distributed_property_map.ipp index d47d6856..ef20817f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/impl/distributed_property_map.ipp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/parallel/impl/distributed_property_map.ipp @@ -41,7 +41,7 @@ PBGL_DISTRIB_PMAP::~distributed_property_map() { } template template -void +void PBGL_DISTRIB_PMAP::set_reduce(const Reduce& reduce) { typedef handle_message Handler; @@ -69,7 +69,7 @@ void PBGL_DISTRIB_PMAP::prune_ghost_cells() const // We need to flush values when we evict them. boost::parallel::detail::untracked_pair const& victim = data->ghost_cells->back(); - send(data->process_group, get(data->global, victim.first).first, + send(data->process_group, get(data->global, victim.first).first, property_map_put, victim); } @@ -83,11 +83,11 @@ typename PBGL_DISTRIB_PMAP::value_type& PBGL_DISTRIB_PMAP::cell(const key_type& key, bool request_if_missing) const { // Index by key - ghost_cells_key_index_type const& key_index + ghost_cells_key_index_type const& key_index = data->ghost_cells->template get<1>(); // Search for the ghost cell by key, and project back to the sequence - iterator ghost_cell + iterator ghost_cell = data->ghost_cells->template project<0>(key_index.find(key)); if (ghost_cell == data->ghost_cells->end()) { value_type value; @@ -97,13 +97,13 @@ PBGL_DISTRIB_PMAP::cell(const key_type& key, bool request_if_missing) const value = data->get_default_value(key); else if (request_if_missing) // Request the actual value of this key from its owner - send_oob_with_reply(data->process_group, get(data->global, key).first, + send_oob_with_reply(data->process_group, get(data->global, key).first, property_map_get, key, value); else value = value_type(); // Create a ghost cell containing the new value - ghost_cell + ghost_cell = data->ghost_cells->push_front(std::make_pair(key, value)).first; // If we need to, prune the ghost cells @@ -129,12 +129,12 @@ template template void PBGL_DISTRIB_PMAP::handle_message:: -handle_put(int /*source*/, int /*tag*/, +handle_put(int /*source*/, int /*tag*/, const boost::parallel::detail::untracked_pair& req, trigger_receive_context) { using boost::get; - std::shared_ptr data(data_ptr); + shared_ptr data(data_ptr); owner_local_pair p = get(data->global, req.first); BOOST_ASSERT(p.first == process_id(data->process_group)); @@ -149,12 +149,12 @@ template template typename PBGL_DISTRIB_PMAP::value_type PBGL_DISTRIB_PMAP::handle_message:: -handle_get(int source, int /*tag*/, const key_type& key, +handle_get(int source, int /*tag*/, const key_type& key, trigger_receive_context) { using boost::get; - std::shared_ptr data(data_ptr); + shared_ptr data(data_ptr); BOOST_ASSERT(data); owner_local_pair p = get(data->global, key); @@ -168,7 +168,7 @@ PBGL_DISTRIB_PMAP::handle_message:: handle_multiget(int source, int tag, const std::vector& keys, trigger_receive_context) { - std::shared_ptr data(data_ptr); + shared_ptr data(data_ptr); BOOST_ASSERT(data); typedef boost::parallel::detail::untracked_pair key_value; @@ -190,15 +190,15 @@ template void PBGL_DISTRIB_PMAP::handle_message:: handle_multiget_reply - (int source, int tag, + (int source, int tag, const std::vector >& msg, trigger_receive_context) { - std::shared_ptr data(data_ptr); + shared_ptr data(data_ptr); BOOST_ASSERT(data); // Index by key - ghost_cells_key_index_type const& key_index + ghost_cells_key_index_type const& key_index = data->ghost_cells->template get<1>(); std::size_t n = msg.size(); @@ -217,13 +217,13 @@ template void PBGL_DISTRIB_PMAP::handle_message:: handle_multiput - (int source, int tag, + (int source, int tag, const std::vector >& values, trigger_receive_context) { using boost::get; - std::shared_ptr data(data_ptr); + shared_ptr data(data_ptr); BOOST_ASSERT(data); std::size_t n = values.size(); @@ -247,11 +247,11 @@ setup_triggers(process_group_type& pg) simple_trigger(pg, property_map_put, this, &handle_message::handle_put); simple_trigger(pg, property_map_get, this, &handle_message::handle_get); - simple_trigger(pg, property_map_multiget, this, + simple_trigger(pg, property_map_multiget, this, &handle_message::handle_multiget); - simple_trigger(pg, property_map_multiget_reply, this, + simple_trigger(pg, property_map_multiget_reply, this, &handle_message::handle_multiget_reply); - simple_trigger(pg, property_map_multiput, this, + simple_trigger(pg, property_map_multiput, this, &handle_message::handle_multiput); } @@ -261,7 +261,7 @@ PBGL_DISTRIB_PMAP ::on_synchronize::operator()() { int stage=0; // we only get called at the start now - std::shared_ptr data(data_ptr); + shared_ptr data(data_ptr); BOOST_ASSERT(data); // Determine in which stage backward consistency messages should be sent. @@ -371,7 +371,7 @@ void PBGL_DISTRIB_PMAP::data_t::refresh_ghost_cells() for (process_size_type p = (id + 1) % n ; p != id ; p = (p + 1) % n) { if (!keys[p].empty()) send(process_group, p, property_map_multiget, keys[p]); - } + } } template diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/vector_property_map.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/vector_property_map.hpp index 46d7924a..a97fb810 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/vector_property_map.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/property_map/vector_property_map.hpp @@ -11,29 +11,29 @@ #define VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04 #include -#include +#include #include namespace boost { template class vector_property_map - : public boost::put_get_helper< - typename std::iterator_traits< + : public boost::put_get_helper< + typename std::iterator_traits< typename std::vector::iterator >::reference, vector_property_map > { public: typedef typename property_traits::key_type key_type; typedef T value_type; - typedef typename std::iterator_traits< + typedef typename std::iterator_traits< typename std::vector::iterator >::reference reference; typedef boost::lvalue_property_map_tag category; - + vector_property_map(const IndexMap& index = IndexMap()) : store(new std::vector()), index(index) {} - vector_property_map(unsigned initial_size, + vector_property_map(unsigned initial_size, const IndexMap& index = IndexMap()) : store(new std::vector(initial_size)), index(index) {} @@ -57,15 +57,15 @@ namespace boost { { return store->end(); } - + IndexMap& get_index_map() { return index; } const IndexMap& get_index_map() const { return index; } - + public: // Copy ctor absent, default semantics is OK. // Assignment operator absent, default semantics is OK. // CONSIDER: not sure that assignment to 'index' is correct. - + reference operator[](const key_type& v) const { typename property_traits::value_type i = get(index, v); if (static_cast(i) >= store->size()) { @@ -74,16 +74,16 @@ namespace boost { return (*store)[i]; } private: - // Conceptually, we have a vector of infinite size. For practical + // Conceptually, we have a vector of infinite size. For practical // purposes, we start with an empty vector and grow it as needed. // Note that we cannot store pointer to vector here -- we cannot // store pointer to data, because if copy of property map resizes - // the vector, the pointer to data will be invalidated. + // the vector, the pointer to data will be invalidated. // I wonder if class 'pmap_ref' is simply needed. - std::shared_ptr< std::vector > store; + shared_ptr< std::vector > store; IndexMap index; }; - + template vector_property_map make_vector_property_map(IndexMap index) @@ -103,15 +103,15 @@ namespace boost { * This specialization of @ref vector_property_map builds a * distributed vector property map given the local index maps * generated by distributed graph types that automatically have index - * properties. + * properties. * * This specialization is useful when creating external distributed * property maps via the same syntax used to create external * sequential property maps. */ -template -class vector_property_map > : public parallel::distributed_property_map< @@ -119,7 +119,7 @@ class vector_property_map local_iterator_map; - typedef parallel::distributed_property_map inherited; typedef local_property_map index_map_type; @@ -129,7 +129,7 @@ public: : inherited(index.process_group(), index.global(), local_iterator_map(index.base())) { } - vector_property_map(unsigned inital_size, + vector_property_map(unsigned inital_size, const index_map_type& index = index_map_type()) : inherited(index.process_group(), index.global(), local_iterator_map(inital_size, index.base())) { } @@ -140,31 +140,31 @@ public: * This specialization of @ref vector_property_map builds a * distributed vector property map given the local index maps * generated by distributed graph types that automatically have index - * properties. + * properties. * * This specialization is useful when creating external distributed * property maps via the same syntax used to create external * sequential property maps. */ -template class vector_property_map< - T, + T, parallel::distributed_property_map< ProcessGroup, GlobalMap, StorageMap > - > + > : public parallel::distributed_property_map< ProcessGroup, GlobalMap, vector_property_map > { typedef vector_property_map local_iterator_map; - typedef parallel::distributed_property_map inherited; - typedef parallel::distributed_property_map index_map_type; @@ -173,7 +173,7 @@ public: : inherited(index.process_group(), index.global(), local_iterator_map(index.base())) { } - vector_property_map(unsigned inital_size, + vector_property_map(unsigned inital_size, const index_map_type& index = index_map_type()) : inherited(index.process_group(), index.global(), local_iterator_map(inital_size, index.base())) { } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/ptr_container/clone_allocator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/ptr_container/clone_allocator.hpp index f0842884..6d396e80 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/ptr_container/clone_allocator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/ptr_container/clone_allocator.hpp @@ -19,9 +19,9 @@ namespace boost { ///////////////////////////////////////////////////////////////////////// - // Clonable concept + // Clonable concept ///////////////////////////////////////////////////////////////////////// - + template< class T > inline T* new_clone( const T& r ) { @@ -43,13 +43,13 @@ namespace boost return r ? new_clone( *r ) : 0; } - // + // // @remark: to make new_clone() work - // with scope_ptr/std::shared_ptr ect. + // with scope_ptr/shared_ptr ect. // simply overload for those types // in the appropriate namespace. - // - + // + template< class T > inline void delete_clone( const T* r ) { @@ -59,7 +59,7 @@ namespace boost ///////////////////////////////////////////////////////////////////////// // CloneAllocator concept ///////////////////////////////////////////////////////////////////////// - + struct heap_clone_allocator { template< class U > @@ -77,7 +77,7 @@ namespace boost }; - + struct view_clone_allocator { template< class U > diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registered.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registered.hpp index 36816b1f..2404cb0f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registered.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registered.hpp @@ -16,12 +16,12 @@ namespace boost { -// You'll see std::shared_ptr mentioned in this header because we need to +// You'll see shared_ptr mentioned in this header because we need to // note which types are shared_ptrs in their registrations, to -// implement special std::shared_ptr handling for rvalue conversions. -template class std::shared_ptr; +// implement special shared_ptr handling for rvalue conversions. +template class shared_ptr; -namespace python { namespace converter { +namespace python { namespace converter { struct registration; @@ -64,23 +64,23 @@ namespace detail register_shared_ptr0(...) { } - + template inline void - register_shared_ptr0(std::shared_ptr*) + register_shared_ptr0(shared_ptr*) { - registry::lookup_shared_ptr(type_id >()); + registry::lookup_shared_ptr(type_id >()); } - + template inline void register_shared_ptr1(T const volatile*) { detail::register_shared_ptr0((T*)0); } - + template - inline registration const& + inline registration const& registry_lookup2(T&(*)()) { detail::register_shared_ptr1((T*)0); @@ -88,13 +88,13 @@ namespace detail } template - inline registration const& + inline registration const& registry_lookup1(type) { return registry_lookup2((T(*)())0); } - inline registration const& + inline registration const& registry_lookup1(type) { detail::register_shared_ptr1((void*)0); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registrations.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registrations.hpp index 2c88b7ad..7ef74e8f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registrations.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registrations.hpp @@ -15,7 +15,7 @@ # include -namespace boost { namespace python { namespace converter { +namespace boost { namespace python { namespace converter { struct lvalue_from_python_chain { @@ -36,7 +36,7 @@ struct BOOST_PYTHON_DECL registration public: // member functions explicit registration(type_info target, bool is_shared_ptr = false); ~registration(); - + // Convert the appropriately-typed data to Python PyObject* to_python(void const volatile*) const; @@ -44,7 +44,7 @@ struct BOOST_PYTHON_DECL registration // exception if no class has been registered. PyTypeObject* get_class_object() const; - // Return common denominator of the python class objects, + // Return common denominator of the python class objects, // convertable to target. Inspects the m_class_object and the value_chains. PyTypeObject const* expected_from_python_type() const; PyTypeObject const* to_python_target_type() const; @@ -57,7 +57,7 @@ struct BOOST_PYTHON_DECL registration // The chain of eligible from_python converters when an rvalue is acceptable rvalue_from_python_chain* rvalue_chain; - + // The class object associated with this type PyTypeObject* m_class_object; @@ -66,14 +66,14 @@ struct BOOST_PYTHON_DECL registration PyTypeObject const* (*m_to_python_target_type)(); - // True iff this type is a std::shared_ptr. Needed for special rvalue + // True iff this type is a shared_ptr. Needed for special rvalue // from_python handling. const bool is_shared_ptr; # if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) private: void operator=(registration); // This is not defined, and just keeps MWCW happy. -# endif +# endif }; // diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registry.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registry.hpp index f09356d6..368adcc6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registry.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/registry.hpp @@ -21,12 +21,12 @@ namespace registry BOOST_PYTHON_DECL registration const& lookup(type_info); // Get the registration corresponding to the type, creating it if - // necessary. Use this first when the type is a std::shared_ptr. + // necessary. Use this first when the type is a shared_ptr. BOOST_PYTHON_DECL registration const& lookup_shared_ptr(type_info); // Return a pointer to the corresponding registration, if one exists BOOST_PYTHON_DECL registration const* query(type_info); - + BOOST_PYTHON_DECL void insert(to_python_function_t, type_info, PyTypeObject const* (*to_python_target_type)() = 0); // Insert an lvalue from_python converter @@ -39,7 +39,7 @@ namespace registry , type_info , PyTypeObject const* (*expected_pytype)() = 0 ); - + // Insert an rvalue from_python converter at the tail of the // chain. Used for implicit conversions BOOST_PYTHON_DECL void push_back( diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/shared_ptr_from_python.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/shared_ptr_from_python.hpp index d7905d2c..c0910776 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/shared_ptr_from_python.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/shared_ptr_from_python.hpp @@ -13,16 +13,16 @@ #ifndef BOOST_PYTHON_NO_PY_SIGNATURES # include #endif -# include +# include -namespace boost { namespace python { namespace converter { +namespace boost { namespace python { namespace converter { template struct shared_ptr_from_python { shared_ptr_from_python() { - converter::registry::insert(&convertible, &construct, type_id >() + converter::registry::insert(&convertible, &construct, type_id >() #ifndef BOOST_PYTHON_NO_PY_SIGNATURES , &converter::expected_from_python_type_direct::get_pytype #endif @@ -34,26 +34,26 @@ struct shared_ptr_from_python { if (p == Py_None) return p; - + return converter::get_lvalue_from_python(p, registered::converters); } - + static void construct(PyObject* source, rvalue_from_python_stage1_data* data) { - void* const storage = ((converter::rvalue_from_python_storage >*)data)->storage.bytes; + void* const storage = ((converter::rvalue_from_python_storage >*)data)->storage.bytes; // Deal with the "None" case. if (data->convertible == source) - new (storage) std::shared_ptr(); + new (storage) shared_ptr(); else { - boost::std::shared_ptr hold_convertible_ref_count( + boost::shared_ptr hold_convertible_ref_count( (void*)0, shared_ptr_deleter(handle<>(borrowed(source))) ); // use aliasing constructor - new (storage) std::shared_ptr( + new (storage) shared_ptr( hold_convertible_ref_count, static_cast(data->convertible)); } - + data->convertible = storage; } }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/shared_ptr_to_python.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/shared_ptr_to_python.hpp index cba75647..fe867ace 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/shared_ptr_to_python.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/converter/shared_ptr_to_python.hpp @@ -7,20 +7,20 @@ # include # include -# include +# include # include -namespace boost { namespace python { namespace converter { +namespace boost { namespace python { namespace converter { template -PyObject* shared_ptr_to_python(std::shared_ptr const& x) +PyObject* shared_ptr_to_python(shared_ptr const& x) { if (!x) return python::detail::none(); else if (shared_ptr_deleter* d = boost::get_deleter(x)) return incref( get_pointer( d->owner ) ); else - return converter::registered const&>::converters.to_python(&x); + return converter::registered const&>::converters.to_python(&x); } }}} // namespace boost::python::converter diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/detail/is_shared_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/detail/is_shared_ptr.hpp index ae94c900..547af3f1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/detail/is_shared_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/detail/is_shared_ptr.hpp @@ -6,12 +6,12 @@ # define IS_SHARED_PTR_DWA2003224_HPP # include -# include +# include -namespace boost { namespace python { namespace detail { - -BOOST_PYTHON_IS_XXX_DEF(std::shared_ptr, std::shared_ptr, 1) +namespace boost { namespace python { namespace detail { +BOOST_PYTHON_IS_XXX_DEF(shared_ptr, shared_ptr, 1) + }}} // namespace boost::python::detail #endif // IS_SHARED_PTR_DWA2003224_HPP diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/detail/value_is_shared_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/detail/value_is_shared_ptr.hpp index f2952cbb..361c369b 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/detail/value_is_shared_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/detail/value_is_shared_ptr.hpp @@ -6,12 +6,12 @@ # define VALUE_IS_SHARED_PTR_DWA2003224_HPP # include -# include +# include -namespace boost { namespace python { namespace detail { - -BOOST_PYTHON_VALUE_IS_XXX_DEF(std::shared_ptr, std::shared_ptr, 1) +namespace boost { namespace python { namespace detail { +BOOST_PYTHON_VALUE_IS_XXX_DEF(shared_ptr, shared_ptr, 1) + }}} // namespace boost::python::detail #endif // VALUE_IS_SHARED_PTR_DWA2003224_HPP diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/instance_holder.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/instance_holder.hpp index 86d82964..933f50d1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/instance_holder.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/instance_holder.hpp @@ -11,7 +11,7 @@ # include # include -namespace boost { namespace python { +namespace boost { namespace python { // Base class for all holders struct BOOST_PYTHON_DECL instance_holder : private noncopyable @@ -19,13 +19,13 @@ struct BOOST_PYTHON_DECL instance_holder : private noncopyable public: instance_holder(); virtual ~instance_holder(); - + // return the next holder in a chain instance_holder* next() const; // When the derived holder actually holds by [smart] pointer and // null_ptr_only is set, only report that the type is held when - // the pointer is null. This is needed for proper std::shared_ptr + // the pointer is null. This is needed for proper shared_ptr // support, to prevent holding shared_ptrs from being found when // converting from python so that we can use the conversion method // that always holds the Python object. @@ -34,7 +34,7 @@ struct BOOST_PYTHON_DECL instance_holder : private noncopyable void install(PyObject* inst) throw(); // These functions should probably be located elsewhere. - + // Allocate storage for an object of the given size at the given // offset in the Python instance<> object if bytes are available // there. Otherwise allocate size bytes of heap memory. diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/object/find_instance.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/object/find_instance.hpp index 76b57a0f..3202c1cd 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/object/find_instance.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/object/find_instance.hpp @@ -7,12 +7,12 @@ # include -namespace boost { namespace python { namespace objects { +namespace boost { namespace python { namespace objects { // Given a type_id, find the instance data which corresponds to it, or // return 0 in case no such type is held. If null_shared_ptr_only is -// true and the type being sought is a std::shared_ptr, only find an -// instance if it turns out to be NULL. Needed for std::shared_ptr rvalue +// true and the type being sought is a shared_ptr, only find an +// instance if it turns out to be NULL. Needed for shared_ptr rvalue // from_python support. BOOST_PYTHON_DECL void* find_instance_impl(PyObject*, type_info, bool null_shared_ptr_only = false); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/object/inheritance.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/object/inheritance.hpp index 948baa42..b49a0442 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/object/inheritance.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/object/inheritance.hpp @@ -6,7 +6,7 @@ # define INHERITANCE_DWA200216_HPP # include -# include +# include # include # include # include @@ -88,7 +88,7 @@ struct dynamic_cast_generator return dynamic_cast( static_cast(source)); } - + }; template diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/to_python_indirect.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/to_python_indirect.hpp index df660a3a..23ad0263 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/to_python_indirect.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/to_python_indirect.hpp @@ -23,9 +23,9 @@ # include -# if defined(__ICL) && __ICL < 600 -# include -# else +# if defined(__ICL) && __ICL < 600 +# include +# else # include # endif @@ -57,7 +57,7 @@ struct to_python_indirect else return this->execute(*ptr, mpl::false_()); } - + template inline PyObject* execute(U const& x, mpl::false_) const { @@ -84,9 +84,9 @@ namespace detail // can't use auto_ptr with Intel 5 and VC6 Dinkum library // for some reason. We get link errors against the auto_ptr // copy constructor. -# if defined(__ICL) && __ICL < 600 - typedef boost::std::shared_ptr smart_pointer; -# else +# if defined(__ICL) && __ICL < 600 + typedef boost::shared_ptr smart_pointer; +# else typedef std::auto_ptr smart_pointer; # endif typedef objects::pointer_holder holder_t; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/to_python_value.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/to_python_value.hpp index 1628a93b..a48948d2 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/to_python_value.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/python/to_python_value.hpp @@ -26,7 +26,7 @@ # include # include -namespace boost { namespace python { +namespace boost { namespace python { namespace detail { @@ -58,7 +58,7 @@ struct object_manager_get_pytype struct object_manager_to_python_value { typedef typename value_arg::type argument_type; - + PyObject* operator()(argument_type) const; #ifndef BOOST_PYTHON_NO_PY_SIGNATURES typedef boost::mpl::bool_::value> is_t_handle; @@ -68,13 +68,13 @@ struct object_manager_get_pytype } inline static PyTypeObject const* get_pytype_aux(mpl::true_*) {return converter::object_manager_traits::get_pytype();} - - inline static PyTypeObject const* get_pytype_aux(mpl::false_* ) + + inline static PyTypeObject const* get_pytype_aux(mpl::false_* ) { return object_manager_get_pytype::get((T(*)())0); } - -#endif + +#endif // This information helps make_getter() decide whether to try to // return an internal reference or not. I don't like it much, @@ -82,12 +82,12 @@ struct object_manager_get_pytype BOOST_STATIC_CONSTANT(bool, uses_registry = false); }; - + template struct registry_to_python_value { typedef typename value_arg::type argument_type; - + PyObject* operator()(argument_type) const; #ifndef BOOST_PYTHON_NO_PY_SIGNATURES PyTypeObject const* get_pytype() const {return converter::registered::converters.to_python_target_type();} @@ -103,11 +103,11 @@ struct object_manager_get_pytype struct shared_ptr_to_python_value { typedef typename value_arg::type argument_type; - + PyObject* operator()(argument_type) const; #ifndef BOOST_PYTHON_NO_PY_SIGNATURES PyTypeObject const* get_pytype() const {return get_pytype((boost::type*)0);} -#endif +#endif // This information helps make_getter() decide whether to try to // return an internal reference or not. I don't like it much, // but it will have to serve for now. @@ -115,9 +115,9 @@ struct object_manager_get_pytype private: #ifndef BOOST_PYTHON_NO_PY_SIGNATURES template - PyTypeObject const* get_pytype(boost::type &> *) const {return converter::registered::converters.to_python_target_type();} + PyTypeObject const* get_pytype(boost::type &> *) const {return converter::registered::converters.to_python_target_type();} template - PyTypeObject const* get_pytype(boost::type &> *) const {return converter::registered::converters.to_python_target_type();} + PyTypeObject const* get_pytype(boost::type &> *) const {return converter::registered::converters.to_python_target_type();} #endif }; } @@ -140,7 +140,7 @@ struct to_python_value }; // -// implementation +// implementation // namespace detail { @@ -151,7 +151,7 @@ namespace detail # if BOOST_WORKAROUND(__GNUC__, < 3) // suppresses an ICE, somehow (void)r::converters; -# endif +# endif return converter::registered::converters.to_python(&x); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/icu.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/icu.hpp index a3d84b74..772806e9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/icu.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/icu.hpp @@ -3,8 +3,8 @@ * Copyright (c) 2004 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ @@ -36,7 +36,7 @@ namespace boost{ namespace re_detail{ -// +// // Implementation details: // class BOOST_REGEX_DECL icu_regex_traits_implementation @@ -85,9 +85,9 @@ private: boost::scoped_ptr< U_NAMESPACE_QUALIFIER Collator> m_primary_collator; // The primary collation object }; -inline boost::std::shared_ptr get_icu_regex_traits_implementation(const U_NAMESPACE_QUALIFIER Locale& loc) +inline boost::shared_ptr get_icu_regex_traits_implementation(const U_NAMESPACE_QUALIFIER Locale& loc) { - return boost::std::shared_ptr(new icu_regex_traits_implementation(loc)); + return boost::shared_ptr(new icu_regex_traits_implementation(loc)); } } @@ -208,7 +208,7 @@ private: static char_class_type lookup_icu_mask(const ::UChar32* p1, const ::UChar32* p2); - boost::std::shared_ptr< ::boost::re_detail::icu_regex_traits_implementation> m_pimpl; + boost::shared_ptr< ::boost::re_detail::icu_regex_traits_implementation> m_pimpl; }; } // namespace boost @@ -245,9 +245,9 @@ namespace re_detail{ #if !defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(__IBMCPP__) template -inline u32regex do_make_u32regex(InputIterator i, - InputIterator j, - boost::regex_constants::syntax_option_type opt, +inline u32regex do_make_u32regex(InputIterator i, + InputIterator j, + boost::regex_constants::syntax_option_type opt, const boost::mpl::int_<1>*) { typedef boost::u8_to_u32_iterator conv_type; @@ -255,9 +255,9 @@ inline u32regex do_make_u32regex(InputIterator i, } template -inline u32regex do_make_u32regex(InputIterator i, - InputIterator j, - boost::regex_constants::syntax_option_type opt, +inline u32regex do_make_u32regex(InputIterator i, + InputIterator j, + boost::regex_constants::syntax_option_type opt, const boost::mpl::int_<2>*) { typedef boost::u16_to_u32_iterator conv_type; @@ -265,18 +265,18 @@ inline u32regex do_make_u32regex(InputIterator i, } template -inline u32regex do_make_u32regex(InputIterator i, - InputIterator j, - boost::regex_constants::syntax_option_type opt, +inline u32regex do_make_u32regex(InputIterator i, + InputIterator j, + boost::regex_constants::syntax_option_type opt, const boost::mpl::int_<4>*) { return u32regex(i, j, opt); } #else template -inline u32regex do_make_u32regex(InputIterator i, - InputIterator j, - boost::regex_constants::syntax_option_type opt, +inline u32regex do_make_u32regex(InputIterator i, + InputIterator j, + boost::regex_constants::syntax_option_type opt, const boost::mpl::int_<1>*) { typedef boost::u8_to_u32_iterator conv_type; @@ -294,9 +294,9 @@ inline u32regex do_make_u32regex(InputIterator i, } template -inline u32regex do_make_u32regex(InputIterator i, - InputIterator j, - boost::regex_constants::syntax_option_type opt, +inline u32regex do_make_u32regex(InputIterator i, + InputIterator j, + boost::regex_constants::syntax_option_type opt, const boost::mpl::int_<2>*) { typedef boost::u16_to_u32_iterator conv_type; @@ -314,9 +314,9 @@ inline u32regex do_make_u32regex(InputIterator i, } template -inline u32regex do_make_u32regex(InputIterator i, - InputIterator j, - boost::regex_constants::syntax_option_type opt, +inline u32regex do_make_u32regex(InputIterator i, + InputIterator j, + boost::regex_constants::syntax_option_type opt, const boost::mpl::int_<4>*) { typedef std::vector vector_type; @@ -337,8 +337,8 @@ inline u32regex do_make_u32regex(InputIterator i, // Construction from an iterator pair: // template -inline u32regex make_u32regex(InputIterator i, - InputIterator j, +inline u32regex make_u32regex(InputIterator i, + InputIterator j, boost::regex_constants::syntax_option_type opt) { return re_detail::do_make_u32regex(i, j, opt, static_cast const*>(0)); @@ -406,18 +406,18 @@ void copy_results(MR1& out, MR2 const& in) } template -inline bool do_regex_match(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +inline bool do_regex_match(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags, boost::mpl::int_<4> const*) { return ::boost::regex_match(first, last, m, e, flags); } template -bool do_regex_match(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +bool do_regex_match(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags, boost::mpl::int_<2> const*) { @@ -431,9 +431,9 @@ bool do_regex_match(BidiIterator first, BidiIterator last, return result; } template -bool do_regex_match(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +bool do_regex_match(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags, boost::mpl::int_<1> const*) { @@ -449,62 +449,62 @@ bool do_regex_match(BidiIterator first, BidiIterator last, } // namespace re_detail template -inline bool u32regex_match(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +inline bool u32regex_match(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_match(first, last, m, e, flags, static_cast const*>(0)); } -inline bool u32regex_match(const UChar* p, - match_results& m, - const u32regex& e, +inline bool u32regex_match(const UChar* p, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_match(p, p+u_strlen(p), m, e, flags, static_cast const*>(0)); } #if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX) -inline bool u32regex_match(const wchar_t* p, - match_results& m, - const u32regex& e, +inline bool u32regex_match(const wchar_t* p, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_match(p, p+std::wcslen(p), m, e, flags, static_cast const*>(0)); } #endif -inline bool u32regex_match(const char* p, - match_results& m, - const u32regex& e, +inline bool u32regex_match(const char* p, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_match(p, p+std::strlen(p), m, e, flags, static_cast const*>(0)); } -inline bool u32regex_match(const unsigned char* p, - match_results& m, - const u32regex& e, +inline bool u32regex_match(const unsigned char* p, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_match(p, p+std::strlen((const char*)p), m, e, flags, static_cast const*>(0)); } -inline bool u32regex_match(const std::string& s, - match_results& m, - const u32regex& e, +inline bool u32regex_match(const std::string& s, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast const*>(0)); } #ifndef BOOST_NO_STD_WSTRING -inline bool u32regex_match(const std::wstring& s, - match_results& m, - const u32regex& e, +inline bool u32regex_match(const std::wstring& s, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast const*>(0)); } #endif -inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s, - match_results& m, - const u32regex& e, +inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast const*>(0)); @@ -513,61 +513,61 @@ inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s, // regex_match overloads that do not return what matched: // template -inline bool u32regex_match(BidiIterator first, BidiIterator last, - const u32regex& e, +inline bool u32regex_match(BidiIterator first, BidiIterator last, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_match(first, last, m, e, flags, static_cast const*>(0)); } -inline bool u32regex_match(const UChar* p, - const u32regex& e, +inline bool u32regex_match(const UChar* p, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_match(p, p+u_strlen(p), m, e, flags, static_cast const*>(0)); } #if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX) -inline bool u32regex_match(const wchar_t* p, - const u32regex& e, +inline bool u32regex_match(const wchar_t* p, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_match(p, p+std::wcslen(p), m, e, flags, static_cast const*>(0)); } #endif -inline bool u32regex_match(const char* p, - const u32regex& e, +inline bool u32regex_match(const char* p, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_match(p, p+std::strlen(p), m, e, flags, static_cast const*>(0)); } -inline bool u32regex_match(const unsigned char* p, - const u32regex& e, +inline bool u32regex_match(const unsigned char* p, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_match(p, p+std::strlen((const char*)p), m, e, flags, static_cast const*>(0)); } -inline bool u32regex_match(const std::string& s, - const u32regex& e, +inline bool u32regex_match(const std::string& s, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast const*>(0)); } #ifndef BOOST_NO_STD_WSTRING -inline bool u32regex_match(const std::wstring& s, - const u32regex& e, +inline bool u32regex_match(const std::wstring& s, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast const*>(0)); } #endif -inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s, - const u32regex& e, +inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s, + const u32regex& e, match_flag_type flags = match_default) { match_results m; @@ -579,9 +579,9 @@ inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s, // namespace re_detail{ template -inline bool do_regex_search(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +inline bool do_regex_search(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags, BidiIterator base, boost::mpl::int_<4> const*) @@ -589,9 +589,9 @@ inline bool do_regex_search(BidiIterator first, BidiIterator last, return ::boost::regex_search(first, last, m, e, flags, base); } template -bool do_regex_search(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +bool do_regex_search(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags, BidiIterator base, boost::mpl::int_<2> const*) @@ -606,9 +606,9 @@ bool do_regex_search(BidiIterator first, BidiIterator last, return result; } template -bool do_regex_search(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +bool do_regex_search(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags, BidiIterator base, boost::mpl::int_<1> const*) @@ -625,131 +625,131 @@ bool do_regex_search(BidiIterator first, BidiIterator last, } template -inline bool u32regex_search(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +inline bool u32regex_search(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_search(first, last, m, e, flags, first, static_cast const*>(0)); } template -inline bool u32regex_search(BidiIterator first, BidiIterator last, - match_results& m, - const u32regex& e, +inline bool u32regex_search(BidiIterator first, BidiIterator last, + match_results& m, + const u32regex& e, match_flag_type flags, BidiIterator base) { return re_detail::do_regex_search(first, last, m, e, flags, base, static_cast const*>(0)); } -inline bool u32regex_search(const UChar* p, - match_results& m, - const u32regex& e, +inline bool u32regex_search(const UChar* p, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_search(p, p+u_strlen(p), m, e, flags, p, static_cast const*>(0)); } #if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX) -inline bool u32regex_search(const wchar_t* p, - match_results& m, - const u32regex& e, +inline bool u32regex_search(const wchar_t* p, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_search(p, p+std::wcslen(p), m, e, flags, p, static_cast const*>(0)); } #endif -inline bool u32regex_search(const char* p, - match_results& m, - const u32regex& e, +inline bool u32regex_search(const char* p, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_search(p, p+std::strlen(p), m, e, flags, p, static_cast const*>(0)); } -inline bool u32regex_search(const unsigned char* p, - match_results& m, - const u32regex& e, +inline bool u32regex_search(const unsigned char* p, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_search(p, p+std::strlen((const char*)p), m, e, flags, p, static_cast const*>(0)); } -inline bool u32regex_search(const std::string& s, - match_results& m, - const u32regex& e, +inline bool u32regex_search(const std::string& s, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast const*>(0)); } #ifndef BOOST_NO_STD_WSTRING -inline bool u32regex_search(const std::wstring& s, - match_results& m, - const u32regex& e, +inline bool u32regex_search(const std::wstring& s, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast const*>(0)); } #endif -inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s, - match_results& m, - const u32regex& e, +inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s, + match_results& m, + const u32regex& e, match_flag_type flags = match_default) { return re_detail::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast const*>(0)); } template -inline bool u32regex_search(BidiIterator first, BidiIterator last, - const u32regex& e, +inline bool u32regex_search(BidiIterator first, BidiIterator last, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_search(first, last, m, e, flags, first, static_cast const*>(0)); } -inline bool u32regex_search(const UChar* p, - const u32regex& e, +inline bool u32regex_search(const UChar* p, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_search(p, p+u_strlen(p), m, e, flags, p, static_cast const*>(0)); } #if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX) -inline bool u32regex_search(const wchar_t* p, - const u32regex& e, +inline bool u32regex_search(const wchar_t* p, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_search(p, p+std::wcslen(p), m, e, flags, p, static_cast const*>(0)); } #endif -inline bool u32regex_search(const char* p, - const u32regex& e, +inline bool u32regex_search(const char* p, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_search(p, p+std::strlen(p), m, e, flags, p, static_cast const*>(0)); } -inline bool u32regex_search(const unsigned char* p, - const u32regex& e, +inline bool u32regex_search(const unsigned char* p, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_search(p, p+std::strlen((const char*)p), m, e, flags, p, static_cast const*>(0)); } -inline bool u32regex_search(const std::string& s, - const u32regex& e, +inline bool u32regex_search(const std::string& s, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast const*>(0)); } #ifndef BOOST_NO_STD_WSTRING -inline bool u32regex_search(const std::wstring& s, - const u32regex& e, +inline bool u32regex_search(const std::wstring& s, + const u32regex& e, match_flag_type flags = match_default) { match_results m; return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast const*>(0)); } #endif -inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s, - const u32regex& e, +inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s, + const u32regex& e, match_flag_type flags = match_default) { match_results m; @@ -817,8 +817,8 @@ inline utf8_output_iterator make_utf32_out(OutputIterator o, mpl template OutputIterator do_regex_replace(OutputIterator out, std::pair const& in, - const u32regex& e, - const std::pair& fmt, + const u32regex& e, + const std::pair& fmt, match_flag_type flags ) { @@ -832,7 +832,7 @@ OutputIterator do_regex_replace(OutputIterator out, while(pos != fmt.second) f.push_back(*pos++); #endif - + regex_iterator i(in.first, in.second, e, flags); regex_iterator j; if(i == j) @@ -846,7 +846,7 @@ OutputIterator do_regex_replace(OutputIterator out, while(i != j) { if(!(flags & regex_constants::format_no_copy)) - out = re_detail::copy(i->prefix().first, i->prefix().second, out); + out = re_detail::copy(i->prefix().first, i->prefix().second, out); if(f.size()) out = ::boost::re_detail::regex_format_imp(out, *i, &*f.begin(), &*f.begin() + f.size(), flags, e.get_traits()); else @@ -882,8 +882,8 @@ template inline OutputIterator u32regex_replace(OutputIterator out, BidirectionalIterator first, BidirectionalIterator last, - const u32regex& e, - const charT* fmt, + const u32regex& e, + const charT* fmt, match_flag_type flags = match_default) { return re_detail::extract_output_base @@ -904,7 +904,7 @@ template inline OutputIterator u32regex_replace(OutputIterator out, Iterator first, Iterator last, - const u32regex& e, + const u32regex& e, const std::basic_string& fmt, match_flag_type flags = match_default) { @@ -926,7 +926,7 @@ template inline OutputIterator u32regex_replace(OutputIterator out, Iterator first, Iterator last, - const u32regex& e, + const u32regex& e, const U_NAMESPACE_QUALIFIER UnicodeString& fmt, match_flag_type flags = match_default) { @@ -946,7 +946,7 @@ inline OutputIterator u32regex_replace(OutputIterator out, template std::basic_string u32regex_replace(const std::basic_string& s, - const u32regex& e, + const u32regex& e, const charT* fmt, match_flag_type flags = match_default) { @@ -958,7 +958,7 @@ std::basic_string u32regex_replace(const std::basic_string& s, template std::basic_string u32regex_replace(const std::basic_string& s, - const u32regex& e, + const u32regex& e, const std::basic_string& fmt, match_flag_type flags = match_default) { @@ -978,10 +978,10 @@ public: unicode_string_out_iterator& operator++() { return *this; } unicode_string_out_iterator& operator++(int) { return *this; } unicode_string_out_iterator& operator*() { return *this; } - unicode_string_out_iterator& operator=(UChar v) - { - *out += v; - return *this; + unicode_string_out_iterator& operator=(UChar v) + { + *out += v; + return *this; } typedef std::ptrdiff_t difference_type; typedef UChar value_type; @@ -993,7 +993,7 @@ public: } inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QUALIFIER UnicodeString& s, - const u32regex& e, + const u32regex& e, const UChar* fmt, match_flag_type flags = match_default) { @@ -1004,7 +1004,7 @@ inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QU } inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QUALIFIER UnicodeString& s, - const u32regex& e, + const u32regex& e, const U_NAMESPACE_QUALIFIER UnicodeString& fmt, match_flag_type flags = match_default) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/pending/object_cache.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/pending/object_cache.hpp index 8346166d..d47fbba9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/pending/object_cache.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/pending/object_cache.hpp @@ -3,8 +3,8 @@ * Copyright (c) 2004 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ @@ -24,7 +24,7 @@ #include #include #include -#include +#include #ifdef BOOST_HAS_THREADS #include #endif @@ -35,16 +35,16 @@ template class object_cache { public: - typedef std::pair< ::boost::std::shared_ptr, Key const*> value_type; + typedef std::pair< ::boost::shared_ptr, Key const*> value_type; typedef std::list list_type; typedef typename list_type::iterator list_iterator; typedef std::map map_type; typedef typename map_type::iterator map_iterator; typedef typename list_type::size_type size_type; - static boost::std::shared_ptr get(const Key& k, size_type l_max_cache_size); + static boost::shared_ptr get(const Key& k, size_type l_max_cache_size); private: - static boost::std::shared_ptr do_get(const Key& k, size_type l_max_cache_size); + static boost::shared_ptr do_get(const Key& k, size_type l_max_cache_size); struct data { @@ -58,7 +58,7 @@ private: }; template -boost::std::shared_ptr object_cache::get(const Key& k, size_type l_max_cache_size) +boost::shared_ptr object_cache::get(const Key& k, size_type l_max_cache_size) { #ifdef BOOST_HAS_THREADS static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT; @@ -74,7 +74,7 @@ boost::std::shared_ptr object_cache::get(const Key& k // ::boost::throw_exception(std::runtime_error("Error in thread safety code: could not acquire a lock")); #if defined(BOOST_NO_UNREACHABLE_RETURN_DETECTION) || defined(BOOST_NO_EXCEPTIONS) - return boost::std::shared_ptr(); + return boost::shared_ptr(); #endif #else return do_get(k, l_max_cache_size); @@ -82,7 +82,7 @@ boost::std::shared_ptr object_cache::get(const Key& k } template -boost::std::shared_ptr object_cache::do_get(const Key& k, size_type l_max_cache_size) +boost::shared_ptr object_cache::do_get(const Key& k, size_type l_max_cache_size) { typedef typename object_cache::data object_data; typedef typename map_type::size_type map_size_type; @@ -95,7 +95,7 @@ boost::std::shared_ptr object_cache::do_get(const Key if(mpos != s_data.index.end()) { // - // Eureka! + // Eureka! // We have a cached item, bump it up the list and return it: // if(--(s_data.cont.end()) != mpos->second) @@ -117,7 +117,7 @@ boost::std::shared_ptr object_cache::do_get(const Key // if we get here then the item is not in the cache, // so create it: // - boost::std::shared_ptr result(new Object(k)); + boost::shared_ptr result(new Object(k)); // // Add it to the list, and index it: // @@ -143,11 +143,11 @@ boost::std::shared_ptr object_cache::do_get(const Key { list_iterator condemmed(pos); ++pos; - // now remove the items from our containers, + // now remove the items from our containers, // then order has to be as follows: BOOST_ASSERT(s_data.index.find(*(condemmed->second)) != s_data.index.end()); s_data.index.erase(*(condemmed->second)); - s_data.cont.erase(condemmed); + s_data.cont.erase(condemmed); --s; } else diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/basic_regex.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/basic_regex.hpp index 7d70105d..0b63e3aa 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/basic_regex.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/basic_regex.hpp @@ -80,13 +80,13 @@ public: { template name(const charT* i, const charT* j, int idx) - : index(idx) - { - hash = hash_value_from_capture_name(i, j); + : index(idx) + { + hash = hash_value_from_capture_name(i, j); } name(int h, int idx) : index(idx), hash(h) - { + { } int index; int hash; @@ -96,7 +96,7 @@ public: } bool operator == (const name& other)const { - return hash == other.hash; + return hash == other.hash; } void swap(name& other) { @@ -160,15 +160,15 @@ template struct regex_data : public named_subexpressions { typedef regex_constants::syntax_option_type flag_type; - typedef std::size_t size_type; + typedef std::size_t size_type; - regex_data(const ::boost::std::shared_ptr< - ::boost::regex_traits_wrapper >& t) + regex_data(const ::boost::shared_ptr< + ::boost::regex_traits_wrapper >& t) : m_ptraits(t), m_expression(0), m_expression_len(0) {} - regex_data() + regex_data() : m_ptraits(new ::boost::regex_traits_wrapper()), m_expression(0), m_expression_len(0) {} - ::boost::std::shared_ptr< + ::boost::shared_ptr< ::boost::regex_traits_wrapper > m_ptraits; // traits class instance flag_type m_flags; // flags with which we were compiled @@ -198,12 +198,12 @@ class basic_regex_implementation public: typedef regex_constants::syntax_option_type flag_type; typedef std::ptrdiff_t difference_type; - typedef std::size_t size_type; + typedef std::size_t size_type; typedef typename traits::locale_type locale_type; typedef const charT* const_iterator; basic_regex_implementation(){} - basic_regex_implementation(const ::boost::std::shared_ptr< + basic_regex_implementation(const ::boost::shared_ptr< ::boost::regex_traits_wrapper >& t) : regex_data(t) {} void assign(const charT* arg_first, @@ -216,12 +216,12 @@ public: } locale_type BOOST_REGEX_CALL imbue(locale_type l) - { - return this->m_ptraits->imbue(l); + { + return this->m_ptraits->imbue(l); } locale_type BOOST_REGEX_CALL getloc()const - { - return this->m_ptraits->getloc(); + { + return this->m_ptraits->getloc(); } std::basic_string BOOST_REGEX_CALL str()const { @@ -245,12 +245,12 @@ public: // // begin, end: const_iterator BOOST_REGEX_CALL begin()const - { - return (this->m_status ? 0 : this->m_expression); + { + return (this->m_status ? 0 : this->m_expression); } const_iterator BOOST_REGEX_CALL end()const - { - return (this->m_status ? 0 : this->m_expression + this->m_expression_len); + { + return (this->m_status ? 0 : this->m_expression + this->m_expression_len); } flag_type BOOST_REGEX_CALL flags()const { @@ -322,13 +322,13 @@ public: typedef const charT* const_iterator; typedef const_iterator iterator; typedef std::ptrdiff_t difference_type; - typedef std::size_t size_type; + typedef std::size_t size_type; typedef regex_constants::syntax_option_type flag_type; // locale_type // placeholder for actual locale type used by the // traits class to localise *this. typedef typename traits::locale_type locale_type; - + public: explicit basic_regex(){} explicit basic_regex(const charT* p, flag_type f = regex_constants::normal) @@ -358,9 +358,9 @@ public: // // assign: basic_regex& assign(const basic_regex& that) - { + { m_pimpl = that.m_pimpl; - return *this; + return *this; } basic_regex& assign(const charT* p, flag_type f = regex_constants::normal) { @@ -385,14 +385,14 @@ public: template unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string& p, flag_type f = regex_constants::normal) - { - return set_expression(p.data(), p.data() + p.size(), f); + { + return set_expression(p.data(), p.data() + p.size(), f); } template explicit basic_regex(const std::basic_string& p, flag_type f = regex_constants::normal) - { - assign(p, f); + { + assign(p, f); } template @@ -437,13 +437,13 @@ public: } #else unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string& p, flag_type f = regex_constants::normal) - { - return set_expression(p.data(), p.data() + p.size(), f); + { + return set_expression(p.data(), p.data() + p.size(), f); } basic_regex(const std::basic_string& p, flag_type f = regex_constants::normal) - { - assign(p, f); + { + assign(p, f); } basic_regex& BOOST_REGEX_CALL operator=(const std::basic_string& p) @@ -464,19 +464,19 @@ public: // locale: locale_type BOOST_REGEX_CALL imbue(locale_type l); locale_type BOOST_REGEX_CALL getloc()const - { - return m_pimpl.get() ? m_pimpl->getloc() : locale_type(); + { + return m_pimpl.get() ? m_pimpl->getloc() : locale_type(); } // // getflags: // retained for backwards compatibility only, "flags" // is now the preferred name: flag_type BOOST_REGEX_CALL getflags()const - { + { return flags(); } flag_type BOOST_REGEX_CALL flags()const - { + { return m_pimpl.get() ? m_pimpl->flags() : 0; } // @@ -494,12 +494,12 @@ public: return m_pimpl->subexpression(n); } const_iterator BOOST_REGEX_CALL begin()const - { - return (m_pimpl.get() ? m_pimpl->begin() : 0); + { + return (m_pimpl.get() ? m_pimpl->begin() : 0); } const_iterator BOOST_REGEX_CALL end()const - { - return (m_pimpl.get() ? m_pimpl->end() : 0); + { + return (m_pimpl.get() ? m_pimpl->end() : 0); } // // swap: @@ -510,25 +510,25 @@ public: // // size: size_type BOOST_REGEX_CALL size()const - { - return (m_pimpl.get() ? m_pimpl->size() : 0); + { + return (m_pimpl.get() ? m_pimpl->size() : 0); } // // max_size: size_type BOOST_REGEX_CALL max_size()const - { - return UINT_MAX; + { + return UINT_MAX; } // // empty: bool BOOST_REGEX_CALL empty()const - { - return (m_pimpl.get() ? 0 != m_pimpl->status() : true); + { + return (m_pimpl.get() ? 0 != m_pimpl->status() : true); } - size_type BOOST_REGEX_CALL mark_count()const - { - return (m_pimpl.get() ? m_pimpl->mark_count() : 0); + size_type BOOST_REGEX_CALL mark_count()const + { + return (m_pimpl.get() ? m_pimpl->mark_count() : 0); } int status()const @@ -551,45 +551,45 @@ public: return str().compare(that.str()); } bool BOOST_REGEX_CALL operator==(const basic_regex& e)const - { - return compare(e) == 0; + { + return compare(e) == 0; } bool BOOST_REGEX_CALL operator != (const basic_regex& e)const - { - return compare(e) != 0; + { + return compare(e) != 0; } bool BOOST_REGEX_CALL operator<(const basic_regex& e)const - { - return compare(e) < 0; + { + return compare(e) < 0; } bool BOOST_REGEX_CALL operator>(const basic_regex& e)const - { - return compare(e) > 0; + { + return compare(e) > 0; } bool BOOST_REGEX_CALL operator<=(const basic_regex& e)const - { - return compare(e) <= 0; + { + return compare(e) <= 0; } bool BOOST_REGEX_CALL operator>=(const basic_regex& e)const - { - return compare(e) >= 0; + { + return compare(e) >= 0; } // // The following are deprecated as public interfaces // but are available for compatibility with earlier versions. - const charT* BOOST_REGEX_CALL expression()const - { - return (m_pimpl.get() && !m_pimpl->status() ? m_pimpl->expression() : 0); + const charT* BOOST_REGEX_CALL expression()const + { + return (m_pimpl.get() && !m_pimpl->status() ? m_pimpl->expression() : 0); } unsigned int BOOST_REGEX_CALL set_expression(const charT* p1, const charT* p2, flag_type f = regex_constants::normal) { assign(p1, p2, f | regex_constants::no_except); return status(); } - unsigned int BOOST_REGEX_CALL set_expression(const charT* p, flag_type f = regex_constants::normal) - { - assign(p, f | regex_constants::no_except); + unsigned int BOOST_REGEX_CALL set_expression(const charT* p, flag_type f = regex_constants::normal) + { + assign(p, f | regex_constants::no_except); return status(); } unsigned int BOOST_REGEX_CALL error_code()const @@ -629,13 +629,13 @@ public: BOOST_ASSERT(0 != m_pimpl.get()); return m_pimpl->get_data(); } - boost::std::shared_ptr get_named_subs()const + boost::shared_ptr get_named_subs()const { return m_pimpl; } private: - std::shared_ptr > m_pimpl; + shared_ptr > m_pimpl; }; // @@ -649,14 +649,14 @@ basic_regex& basic_regex::do_assign(const charT* p const charT* p2, flag_type f) { - std::shared_ptr > temp; + shared_ptr > temp; if(!m_pimpl.get()) { - temp = std::shared_ptr >(new re_detail::basic_regex_implementation()); + temp = shared_ptr >(new re_detail::basic_regex_implementation()); } else { - temp = std::shared_ptr >(new re_detail::basic_regex_implementation(m_pimpl->m_ptraits)); + temp = shared_ptr >(new re_detail::basic_regex_implementation(m_pimpl->m_ptraits)); } temp->assign(p1, p2, f); temp.swap(m_pimpl); @@ -665,8 +665,8 @@ basic_regex& basic_regex::do_assign(const charT* p template typename basic_regex::locale_type BOOST_REGEX_CALL basic_regex::imbue(locale_type l) -{ - std::shared_ptr > temp(new re_detail::basic_regex_implementation()); +{ + shared_ptr > temp(new re_detail::basic_regex_implementation()); locale_type result = temp->imbue(l); temp.swap(m_pimpl); return result; @@ -683,8 +683,8 @@ void swap(basic_regex& e1, basic_regex& e2) #ifndef BOOST_NO_STD_LOCALE template -std::basic_ostream& - operator << (std::basic_ostream& os, +std::basic_ostream& + operator << (std::basic_ostream& os, const basic_regex& e) { return (os << e.str()); @@ -731,7 +731,7 @@ public: template explicit reg_expression(const std::basic_string& p, flag_type f = regex_constants::normal) : basic_regex(p, f) - { + { } template @@ -749,7 +749,7 @@ public: #else explicit reg_expression(const std::basic_string& p, flag_type f = regex_constants::normal) : basic_regex(p, f) - { + { } reg_expression& BOOST_REGEX_CALL operator=(const std::basic_string& p) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/cpp_regex_traits.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/cpp_regex_traits.hpp index 17fe2b63..d60942f0 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/cpp_regex_traits.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/cpp_regex_traits.hpp @@ -3,12 +3,12 @@ * Copyright (c) 2004 John Maddock * Copyright 2011 Garmin Ltd. or its subsidiaries * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ - + /* * LOCATION: see http://www.boost.org for most recent version. * FILE cpp_regex_traits.hpp @@ -60,14 +60,14 @@ #pragma warning(disable:4786 4251) #endif -namespace boost{ +namespace boost{ // // forward declaration is needed by some compilers: // template class cpp_regex_traits; - + namespace re_detail{ // @@ -201,9 +201,9 @@ struct cpp_regex_traits_base } bool operator==(const cpp_regex_traits_base& b)const { - return (m_pctype == b.m_pctype) + return (m_pctype == b.m_pctype) #ifndef BOOST_NO_STD_MESSAGES - && (m_pmessages == b.m_pmessages) + && (m_pmessages == b.m_pmessages) #endif && (m_pcollate == b.m_pcollate); } @@ -283,7 +283,7 @@ void cpp_regex_traits_char_layer::init() if(cat_name.size() && (this->m_pmessages != 0)) { cat = this->m_pmessages->open( - cat_name, + cat_name, this->m_locale); if((int)cat < 0) { @@ -337,7 +337,7 @@ void cpp_regex_traits_char_layer::init() } template -typename cpp_regex_traits_char_layer::string_type +typename cpp_regex_traits_char_layer::string_type cpp_regex_traits_char_layer::get_default_message(regex_constants::syntax_type i) { const char* ptr = get_default_syntax(i); @@ -386,16 +386,16 @@ private: #ifdef BOOST_REGEX_BUGGY_CTYPE_FACET enum { - char_class_space=1<<0, - char_class_print=1<<1, - char_class_cntrl=1<<2, - char_class_upper=1<<3, + char_class_space=1<<0, + char_class_print=1<<1, + char_class_cntrl=1<<2, + char_class_upper=1<<3, char_class_lower=1<<4, - char_class_alpha=1<<5, - char_class_digit=1<<6, - char_class_punct=1<<7, + char_class_alpha=1<<5, + char_class_digit=1<<6, + char_class_punct=1<<7, char_class_xdigit=1<<8, - char_class_alnum=char_class_alpha|char_class_digit, + char_class_alnum=char_class_alpha|char_class_digit, char_class_graph=char_class_alnum|char_class_punct, char_class_blank=1<<9, char_class_word=1<<10, @@ -495,14 +495,14 @@ typename cpp_regex_traits_implementation::char_class_type const cpp_regex #endif template -typename cpp_regex_traits_implementation::string_type +typename cpp_regex_traits_implementation::string_type cpp_regex_traits_implementation::transform_primary(const charT* p1, const charT* p2) const { // // PRECONDITIONS: // // A bug in gcc 3.2 (and maybe other versions as well) treats - // p1 as a null terminated string, for efficiency reasons + // p1 as a null terminated string, for efficiency reasons // we work around this elsewhere, but just assert here that // we adhere to gcc's (buggy) preconditions... // @@ -565,14 +565,14 @@ typename cpp_regex_traits_implementation::string_type } template -typename cpp_regex_traits_implementation::string_type +typename cpp_regex_traits_implementation::string_type cpp_regex_traits_implementation::transform(const charT* p1, const charT* p2) const { // // PRECONDITIONS: // // A bug in gcc 3.2 (and maybe other versions as well) treats - // p1 as a null terminated string, for efficiency reasons + // p1 as a null terminated string, for efficiency reasons // we work around this elsewhere, but just assert here that // we adhere to gcc's (buggy) preconditions... // @@ -613,7 +613,7 @@ typename cpp_regex_traits_implementation::string_type template -typename cpp_regex_traits_implementation::string_type +typename cpp_regex_traits_implementation::string_type cpp_regex_traits_implementation::lookup_collatename(const charT* p1, const charT* p2) const { typedef typename std::map::const_iterator iter_type; @@ -669,7 +669,7 @@ void cpp_regex_traits_implementation::init() if(cat_name.size() && (this->m_pmessages != 0)) { cat = this->m_pmessages->open( - cat_name, + cat_name, this->m_locale); if((int)cat < 0) { @@ -686,8 +686,8 @@ void cpp_regex_traits_implementation::init() // // Error messages: // - for(boost::regex_constants::error_type i = static_cast(0); - i <= boost::regex_constants::error_unknown; + for(boost::regex_constants::error_type i = static_cast(0); + i <= boost::regex_constants::error_unknown; i = static_cast(i + 1)) { const char* p = get_default_error_string(i); @@ -709,7 +709,7 @@ void cpp_regex_traits_implementation::init() // Custom class names: // #ifndef BOOST_REGEX_BUGGY_CTYPE_FACET - static const char_class_type masks[16] = + static const char_class_type masks[16] = { std::ctype::alnum, std::ctype::alpha, @@ -729,7 +729,7 @@ void cpp_regex_traits_implementation::init() cpp_regex_traits_implementation::mask_unicode, }; #else - static const char_class_type masks[16] = + static const char_class_type masks[16] = { ::boost::re_detail::char_class_alnum, ::boost::re_detail::char_class_alpha, @@ -765,14 +765,14 @@ void cpp_regex_traits_implementation::init() } template -typename cpp_regex_traits_implementation::char_class_type +typename cpp_regex_traits_implementation::char_class_type cpp_regex_traits_implementation::lookup_classname_imp(const charT* p1, const charT* p2) const { #ifndef BOOST_REGEX_BUGGY_CTYPE_FACET - static const char_class_type masks[22] = + static const char_class_type masks[22] = { 0, - std::ctype::alnum, + std::ctype::alnum, std::ctype::alpha, cpp_regex_traits_implementation::mask_blank, std::ctype::cntrl, @@ -790,15 +790,15 @@ typename cpp_regex_traits_implementation::char_class_type cpp_regex_traits_implementation::mask_unicode, std::ctype::upper, cpp_regex_traits_implementation::mask_vertical, - std::ctype::alnum | cpp_regex_traits_implementation::mask_word, - std::ctype::alnum | cpp_regex_traits_implementation::mask_word, + std::ctype::alnum | cpp_regex_traits_implementation::mask_word, + std::ctype::alnum | cpp_regex_traits_implementation::mask_word, std::ctype::xdigit, }; #else - static const char_class_type masks[22] = + static const char_class_type masks[22] = { 0, - ::boost::re_detail::char_class_alnum, + ::boost::re_detail::char_class_alnum, ::boost::re_detail::char_class_alpha, ::boost::re_detail::char_class_blank, ::boost::re_detail::char_class_cntrl, @@ -816,8 +816,8 @@ typename cpp_regex_traits_implementation::char_class_type ::boost::re_detail::char_class_unicode, ::boost::re_detail::char_class_upper, ::boost::re_detail::char_class_vertical_space, - ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word, - ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word, + ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word, + ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word, ::boost::re_detail::char_class_xdigit, }; #endif @@ -857,7 +857,7 @@ bool cpp_regex_traits_implementation::isctype(const charT c, char_class_t template -inline boost::std::shared_ptr > create_cpp_regex_traits(const std::locale& l BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(charT)) +inline boost::shared_ptr > create_cpp_regex_traits(const std::locale& l BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(charT)) { cpp_regex_traits_base key(l); return ::boost::object_cache, cpp_regex_traits_implementation >::get(key, 5); @@ -935,9 +935,9 @@ public: #ifndef BOOST_REGEX_BUGGY_CTYPE_FACET typedef typename std::ctype::mask ctype_mask; - static const ctype_mask mask_base = + static const ctype_mask mask_base = static_cast( - std::ctype::alnum + std::ctype::alnum | std::ctype::alpha | std::ctype::cntrl | std::ctype::digit @@ -949,7 +949,7 @@ public: | std::ctype::upper | std::ctype::xdigit); - if((f & mask_base) + if((f & mask_base) && (m_pimpl->m_pctype->is( static_cast(f & mask_base), c))) return true; @@ -957,14 +957,14 @@ public: return true; else if((f & re_detail::cpp_regex_traits_implementation::mask_word) && (c == '_')) return true; - else if((f & re_detail::cpp_regex_traits_implementation::mask_blank) + else if((f & re_detail::cpp_regex_traits_implementation::mask_blank) && m_pimpl->m_pctype->is(std::ctype::space, c) && !re_detail::is_separator(c)) return true; - else if((f & re_detail::cpp_regex_traits_implementation::mask_vertical) + else if((f & re_detail::cpp_regex_traits_implementation::mask_vertical) && (::boost::re_detail::is_separator(c) || (c == '\v'))) return true; - else if((f & re_detail::cpp_regex_traits_implementation::mask_horizontal) + else if((f & re_detail::cpp_regex_traits_implementation::mask_horizontal) && this->isctype(c, std::ctype::space) && !this->isctype(c, re_detail::cpp_regex_traits_implementation::mask_vertical)) return true; return false; @@ -1001,7 +1001,7 @@ public: static std::string get_catalog_name(); private: - boost::std::shared_ptr > m_pimpl; + boost::shared_ptr > m_pimpl; // // catalog name handler: // diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/match_results.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/match_results.hpp index c5641a43..63e51175 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/match_results.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/match_results.hpp @@ -3,8 +3,8 @@ * Copyright (c) 1998-2009 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ @@ -47,14 +47,14 @@ class named_subexpressions; template class match_results -{ +{ private: #ifndef BOOST_NO_STD_ALLOCATOR typedef std::vector, Allocator> vector_type; #else typedef std::vector > vector_type; #endif -public: +public: typedef sub_match value_type; #if !defined(BOOST_NO_STD_ALLOCATOR) && !(defined(BOOST_MSVC) && defined(_STLPORT_VERSION)) typedef typename Allocator::const_reference const_reference; @@ -81,7 +81,7 @@ public: : m_subs(), m_base(), m_last_closed_paren(0), m_is_singular(true) { (void)a; } #endif match_results(const match_results& m) - : m_subs(m.m_subs), m_named_subs(m.m_named_subs), m_last_closed_paren(m.m_last_closed_paren), m_is_singular(m.m_is_singular) + : m_subs(m.m_subs), m_named_subs(m.m_named_subs), m_last_closed_paren(m.m_last_closed_paren), m_is_singular(m.m_is_singular) { if(!m_is_singular) { @@ -547,7 +547,7 @@ public: } void BOOST_REGEX_CALL maybe_assign(const match_results& m); - void BOOST_REGEX_CALL set_named_subs(boost::std::shared_ptr subs) + void BOOST_REGEX_CALL set_named_subs(boost::shared_ptr subs) { m_named_subs = subs; } @@ -566,7 +566,7 @@ private: vector_type m_subs; // subexpressions BidiIterator m_base; // where the search started from sub_match m_null; // a null match - boost::std::shared_ptr m_named_subs; // Shared copy of named subs in the regex object + boost::shared_ptr m_named_subs; // Shared copy of named subs in the regex object int m_last_closed_paren; // Last ) to be seen - used for formatting bool m_is_singular; // True if our stored iterators are singular }; @@ -586,7 +586,7 @@ void BOOST_REGEX_CALL match_results::maybe_assign(const // Distances are measured from the start of *this* match, unless this isn't // a valid match in which case we use the start of the whole sequence. Note that // no subsequent match-candidate can ever be to the left of the first match found. - // This ensures that when we are using bidirectional iterators, that distances + // This ensures that when we are using bidirectional iterators, that distances // measured are as short as possible, and therefore as efficient as possible // to compute. Finally note that we don't use the "matched" data member to test // whether a sub-expression is a valid match, because partial matches set this diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_iterator.hpp index c7a946d8..09e75c69 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_iterator.hpp @@ -3,8 +3,8 @@ * Copyright (c) 2003 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ @@ -19,7 +19,7 @@ #ifndef BOOST_REGEX_V4_REGEX_ITERATOR_HPP #define BOOST_REGEX_V4_REGEX_ITERATOR_HPP -#include +#include namespace boost{ @@ -34,10 +34,10 @@ namespace boost{ #pragma warning(pop) #endif -template -class regex_iterator_implementation +class regex_iterator_implementation { typedef basic_regex regex_type; @@ -81,34 +81,34 @@ private: regex_iterator_implementation& operator=(const regex_iterator_implementation&); }; -template ::value_type, class traits = regex_traits > -class regex_iterator +class regex_iterator #ifndef BOOST_NO_STD_ITERATOR : public std::iterator< - std::forward_iterator_tag, + std::forward_iterator_tag, match_results, typename re_detail::regex_iterator_traits::difference_type, const match_results*, - const match_results& > + const match_results& > #endif { private: typedef regex_iterator_implementation impl; - typedef std::shared_ptr pimpl; + typedef shared_ptr pimpl; public: typedef basic_regex regex_type; typedef match_results value_type; - typedef typename re_detail::regex_iterator_traits::difference_type + typedef typename re_detail::regex_iterator_traits::difference_type difference_type; typedef const value_type* pointer; - typedef const value_type& reference; + typedef const value_type& reference; typedef std::forward_iterator_tag iterator_category; - + regex_iterator(){} - regex_iterator(BidirectionalIterator a, BidirectionalIterator b, - const regex_type& re, + regex_iterator(BidirectionalIterator a, BidirectionalIterator b, + const regex_type& re, match_flag_type m = match_default) : pdata(new impl(&re, b, m)) { @@ -125,10 +125,10 @@ public: return *this; } bool operator==(const regex_iterator& that)const - { + { if((pdata.get() == 0) || (that.pdata.get() == 0)) return pdata.get() == that.pdata.get(); - return pdata->compare(*(that.pdata.get())); + return pdata->compare(*(that.pdata.get())); } bool operator!=(const regex_iterator& that)const { return !(*this == that); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_token_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_token_iterator.hpp index d7b8da65..4e8bc36f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_token_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_token_iterator.hpp @@ -3,8 +3,8 @@ * Copyright (c) 2003 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ @@ -19,7 +19,7 @@ #ifndef BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP #define BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP -#include +#include #include #if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\ || BOOST_WORKAROUND(BOOST_MSVC, < 1300) \ @@ -27,7 +27,7 @@ // // Borland C++ Builder 6, and Visual C++ 6, // can't cope with the array template constructor -// so we have a template member that will accept any type as +// so we have a template member that will accept any type as // argument, and then assert that is really is an array: // #include @@ -54,7 +54,7 @@ namespace boost{ template -class regex_token_iterator_implementation +class regex_token_iterator_implementation { typedef basic_regex regex_type; typedef sub_match value_type; @@ -125,11 +125,11 @@ public: bool compare(const regex_token_iterator_implementation& that) { if(this == &that) return true; - return (&re.get_data() == &that.re.get_data()) - && (end == that.end) - && (flags == that.flags) - && (N == that.N) - && (what[0].first == that.what[0].first) + return (&re.get_data() == &that.re.get_data()) + && (end == that.end) + && (flags == that.flags) + && (N == that.N) + && (what[0].first == that.what[0].first) && (what[0].second == that.what[0].second); } const value_type& get() @@ -167,40 +167,40 @@ private: regex_token_iterator_implementation& operator=(const regex_token_iterator_implementation&); }; -template ::value_type, class traits = regex_traits > -class regex_token_iterator +class regex_token_iterator #ifndef BOOST_NO_STD_ITERATOR : public std::iterator< - std::forward_iterator_tag, + std::forward_iterator_tag, sub_match, typename re_detail::regex_iterator_traits::difference_type, const sub_match*, - const sub_match& > + const sub_match& > #endif { private: typedef regex_token_iterator_implementation impl; - typedef std::shared_ptr pimpl; + typedef shared_ptr pimpl; public: typedef basic_regex regex_type; typedef sub_match value_type; - typedef typename re_detail::regex_iterator_traits::difference_type + typedef typename re_detail::regex_iterator_traits::difference_type difference_type; typedef const value_type* pointer; - typedef const value_type& reference; + typedef const value_type& reference; typedef std::forward_iterator_tag iterator_category; - + regex_token_iterator(){} - regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, + regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, int submatch = 0, match_flag_type m = match_default) : pdata(new impl(&re, b, submatch, m)) { if(!pdata->init(a)) pdata.reset(); } - regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, + regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, const std::vector& submatches, match_flag_type m = match_default) : pdata(new impl(&re, b, submatches, m)) { @@ -239,10 +239,10 @@ public: return *this; } bool operator==(const regex_token_iterator& that)const - { + { if((pdata.get() == 0) || (that.pdata.get() == 0)) return pdata.get() == that.pdata.get(); - return pdata->compare(*(that.pdata.get())); + return pdata->compare(*(that.pdata.get())); } bool operator!=(const regex_token_iterator& that)const { return !(*this == that); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_workaround.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_workaround.hpp index 916a4787..46a8a8d3 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_workaround.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/regex_workaround.hpp @@ -3,8 +3,8 @@ * Copyright (c) 1998-2005 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ @@ -40,7 +40,7 @@ #include #include #include -#include +#include #include #ifndef BOOST_NO_STD_LOCALE # include @@ -128,13 +128,13 @@ namespace boost{ namespace re_detail{ // // MSVC 8 will either emit warnings or else refuse to compile // code that makes perfectly legitimate use of std::copy, when - // the OutputIterator type is a user-defined class (apparently all user + // the OutputIterator type is a user-defined class (apparently all user // defined iterators are "unsafe"). This code works around that: // template inline OutputIterator copy( - InputIterator first, - InputIterator last, + InputIterator first, + InputIterator last, OutputIterator dest ) { @@ -142,8 +142,8 @@ namespace boost{ namespace re_detail{ } template inline bool equal( - InputIterator1 first, - InputIterator1 last, + InputIterator1 first, + InputIterator1 last, InputIterator2 with ) { @@ -153,15 +153,15 @@ namespace boost{ namespace re_detail{ // // MSVC 10 will either emit warnings or else refuse to compile // code that makes perfectly legitimate use of std::copy, when - // the OutputIterator type is a user-defined class (apparently all user + // the OutputIterator type is a user-defined class (apparently all user // defined iterators are "unsafe"). What's more Microsoft have removed their // non-standard "unchecked" versions, even though their still in the MS - // documentation!! Work around this as best we can: + // documentation!! Work around this as best we can: // template inline OutputIterator copy( - InputIterator first, - InputIterator last, + InputIterator first, + InputIterator last, OutputIterator dest ) { @@ -171,8 +171,8 @@ namespace boost{ namespace re_detail{ } template inline bool equal( - InputIterator1 first, - InputIterator1 last, + InputIterator1 first, + InputIterator1 last, InputIterator2 with ) { @@ -180,11 +180,11 @@ namespace boost{ namespace re_detail{ if(*first++ != *with++) return false; return true; } -#else - using std::copy; - using std::equal; -#endif -#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__ +#else + using std::copy; + using std::equal; +#endif +#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__ // use safe versions of strcpy etc: using ::strcpy_s; @@ -193,7 +193,7 @@ namespace boost{ namespace re_detail{ inline std::size_t strcpy_s( char *strDestination, std::size_t sizeInBytes, - const char *strSource + const char *strSource ) { if(std::strlen(strSource)+1 > sizeInBytes) @@ -204,7 +204,7 @@ namespace boost{ namespace re_detail{ inline std::size_t strcat_s( char *strDestination, std::size_t sizeInBytes, - const char *strSource + const char *strSource ) { if(std::strlen(strSource) + std::strlen(strDestination) + 1 > sizeInBytes) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/u32regex_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/u32regex_iterator.hpp index 450069ce..65ebd7f8 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/u32regex_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/u32regex_iterator.hpp @@ -3,8 +3,8 @@ * Copyright (c) 2003 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ @@ -26,7 +26,7 @@ namespace boost{ #endif template -class u32regex_iterator_implementation +class u32regex_iterator_implementation { typedef u32regex regex_type; @@ -71,31 +71,31 @@ private: }; template -class u32regex_iterator +class u32regex_iterator #ifndef BOOST_NO_STD_ITERATOR : public std::iterator< - std::forward_iterator_tag, + std::forward_iterator_tag, match_results, typename re_detail::regex_iterator_traits::difference_type, const match_results*, - const match_results& > + const match_results& > #endif { private: typedef u32regex_iterator_implementation impl; - typedef std::shared_ptr pimpl; + typedef shared_ptr pimpl; public: typedef u32regex regex_type; typedef match_results value_type; - typedef typename re_detail::regex_iterator_traits::difference_type + typedef typename re_detail::regex_iterator_traits::difference_type difference_type; typedef const value_type* pointer; - typedef const value_type& reference; + typedef const value_type& reference; typedef std::forward_iterator_tag iterator_category; - + u32regex_iterator(){} - u32regex_iterator(BidirectionalIterator a, BidirectionalIterator b, - const regex_type& re, + u32regex_iterator(BidirectionalIterator a, BidirectionalIterator b, + const regex_type& re, match_flag_type m = match_default) : pdata(new impl(&re, b, m)) { @@ -112,10 +112,10 @@ public: return *this; } bool operator==(const u32regex_iterator& that)const - { + { if((pdata.get() == 0) || (that.pdata.get() == 0)) return pdata.get() == that.pdata.get(); - return pdata->compare(*(that.pdata.get())); + return pdata->compare(*(that.pdata.get())); } bool operator!=(const u32regex_iterator& that)const { return !(*this == that); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/u32regex_token_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/u32regex_token_iterator.hpp index 3b12fec9..de167716 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/u32regex_token_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/u32regex_token_iterator.hpp @@ -3,8 +3,8 @@ * Copyright (c) 2003 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ @@ -25,7 +25,7 @@ // // Borland C++ Builder 6, and Visual C++ 6, // can't cope with the array template constructor -// so we have a template member that will accept any type as +// so we have a template member that will accept any type as // argument, and then assert that is really is an array: // #include @@ -43,7 +43,7 @@ namespace boost{ #endif template -class u32regex_token_iterator_implementation +class u32regex_token_iterator_implementation { typedef u32regex regex_type; typedef sub_match value_type; @@ -115,11 +115,11 @@ public: bool compare(const u32regex_token_iterator_implementation& that) { if(this == &that) return true; - return (&re.get_data() == &that.re.get_data()) - && (end == that.end) - && (flags == that.flags) - && (N == that.N) - && (what[0].first == that.what[0].first) + return (&re.get_data() == &that.re.get_data()) + && (end == that.end) + && (flags == that.flags) + && (N == that.N) + && (what[0].first == that.what[0].first) && (what[0].second == that.what[0].second); } const value_type& get() @@ -158,37 +158,37 @@ private: }; template -class u32regex_token_iterator +class u32regex_token_iterator #ifndef BOOST_NO_STD_ITERATOR : public std::iterator< - std::forward_iterator_tag, + std::forward_iterator_tag, sub_match, typename re_detail::regex_iterator_traits::difference_type, const sub_match*, - const sub_match& > + const sub_match& > #endif { private: typedef u32regex_token_iterator_implementation impl; - typedef std::shared_ptr pimpl; + typedef shared_ptr pimpl; public: typedef u32regex regex_type; typedef sub_match value_type; - typedef typename re_detail::regex_iterator_traits::difference_type + typedef typename re_detail::regex_iterator_traits::difference_type difference_type; typedef const value_type* pointer; - typedef const value_type& reference; + typedef const value_type& reference; typedef std::forward_iterator_tag iterator_category; - + u32regex_token_iterator(){} - u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, + u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, int submatch = 0, match_flag_type m = match_default) : pdata(new impl(&re, b, submatch, m)) { if(!pdata->init(a)) pdata.reset(); } - u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, + u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, const std::vector& submatches, match_flag_type m = match_default) : pdata(new impl(&re, b, submatches, m)) { @@ -227,10 +227,10 @@ public: return *this; } bool operator==(const u32regex_token_iterator& that)const - { + { if((pdata.get() == 0) || (that.pdata.get() == 0)) return pdata.get() == that.pdata.get(); - return pdata->compare(*(that.pdata.get())); + return pdata->compare(*(that.pdata.get())); } bool operator!=(const u32regex_token_iterator& that)const { return !(*this == that); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/w32_regex_traits.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/w32_regex_traits.hpp index 2d727bc6..d5562072 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/w32_regex_traits.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/regex/v4/w32_regex_traits.hpp @@ -3,12 +3,12 @@ * Copyright (c) 2004 * John Maddock * - * Use, modification and distribution are subject to the - * Boost Software License, Version 1.0. (See accompanying file + * Use, modification and distribution are subject to the + * Boost Software License, Version 1.0. (See accompanying file * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ - + /* * LOCATION: see http://www.boost.org for most recent version. * FILE w32_regex_traits.hpp @@ -52,21 +52,21 @@ #pragma warning(disable:4800) #endif -namespace boost{ +namespace boost{ // // forward declaration is needed by some compilers: // template class w32_regex_traits; - + namespace re_detail{ // // start by typedeffing the types we'll need: // typedef ::boost::uint32_t lcid_type; // placeholder for LCID. -typedef ::boost::std::shared_ptr cat_type; // placeholder for dll HANDLE. +typedef ::boost::shared_ptr cat_type; // placeholder for dll HANDLE. // // then add wrappers around the actual Win32 API's (ie implementation hiding): @@ -186,7 +186,7 @@ private: }; template -w32_regex_traits_char_layer::w32_regex_traits_char_layer(::boost::re_detail::lcid_type l) +w32_regex_traits_char_layer::w32_regex_traits_char_layer(::boost::re_detail::lcid_type l) : w32_regex_traits_base(l) { // we need to start by initialising our syntax map so we know which @@ -232,7 +232,7 @@ w32_regex_traits_char_layer::w32_regex_traits_char_layer(::boost::re_deta } template -typename w32_regex_traits_char_layer::string_type +typename w32_regex_traits_char_layer::string_type w32_regex_traits_char_layer::get_default_message(regex_constants::syntax_type i) { const char* ptr = get_default_syntax(i); @@ -342,7 +342,7 @@ private: }; template -typename w32_regex_traits_implementation::string_type +typename w32_regex_traits_implementation::string_type w32_regex_traits_implementation::transform_primary(const charT* p1, const charT* p2) const { string_type result; @@ -388,7 +388,7 @@ typename w32_regex_traits_implementation::string_type } template -typename w32_regex_traits_implementation::string_type +typename w32_regex_traits_implementation::string_type w32_regex_traits_implementation::lookup_collatename(const charT* p1, const charT* p2) const { typedef typename std::map::const_iterator iter_type; @@ -455,8 +455,8 @@ w32_regex_traits_implementation::w32_regex_traits_implementation(::boost: // // Error messages: // - for(boost::regex_constants::error_type i = static_cast(0); - i <= boost::regex_constants::error_unknown; + for(boost::regex_constants::error_type i = static_cast(0); + i <= boost::regex_constants::error_unknown; i = static_cast(i + 1)) { const char* p = get_default_error_string(i); @@ -477,7 +477,7 @@ w32_regex_traits_implementation::w32_regex_traits_implementation(::boost: // // Custom class names: // - static const char_class_type masks[14] = + static const char_class_type masks[14] = { 0x0104u, // C1_ALPHA | C1_DIGIT 0x0100u, // C1_ALPHA @@ -509,10 +509,10 @@ w32_regex_traits_implementation::w32_regex_traits_implementation(::boost: } template -typename w32_regex_traits_implementation::char_class_type +typename w32_regex_traits_implementation::char_class_type w32_regex_traits_implementation::lookup_classname_imp(const charT* p1, const charT* p2) const { - static const char_class_type masks[22] = + static const char_class_type masks[22] = { 0, 0x0104u, // C1_ALPHA | C1_DIGIT @@ -522,7 +522,7 @@ typename w32_regex_traits_implementation::char_class_type 0x0004u, // C1_DIGIT 0x0004u, // C1_DIGIT (~(0x0020u|0x0008u|0x0040) & 0x01ffu) | 0x0400u, // not C1_CNTRL or C1_SPACE or C1_BLANK - w32_regex_traits_implementation::mask_horizontal, + w32_regex_traits_implementation::mask_horizontal, 0x0002u, // C1_LOWER 0x0002u, // C1_LOWER (~0x0020u & 0x01ffu) | 0x0400, // not C1_CNTRL @@ -532,9 +532,9 @@ typename w32_regex_traits_implementation::char_class_type 0x0001u, // C1_UPPER w32_regex_traits_implementation::mask_unicode, 0x0001u, // C1_UPPER - w32_regex_traits_implementation::mask_vertical, - 0x0104u | w32_regex_traits_implementation::mask_word, - 0x0104u | w32_regex_traits_implementation::mask_word, + w32_regex_traits_implementation::mask_vertical, + 0x0104u | w32_regex_traits_implementation::mask_word, + 0x0104u | w32_regex_traits_implementation::mask_word, 0x0080u, // C1_XDIGIT }; if(m_custom_class_names.size()) @@ -552,7 +552,7 @@ typename w32_regex_traits_implementation::char_class_type template -boost::std::shared_ptr > create_w32_regex_traits(::boost::re_detail::lcid_type l BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(charT)) +boost::shared_ptr > create_w32_regex_traits(::boost::re_detail::lcid_type l BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(charT)) { // TODO: create a cache for previously constructed objects. return boost::object_cache< ::boost::re_detail::lcid_type, w32_regex_traits_implementation >::get(l, 5); @@ -625,7 +625,7 @@ public: } bool isctype(charT c, char_class_type f) const { - if((f & re_detail::w32_regex_traits_implementation::mask_base) + if((f & re_detail::w32_regex_traits_implementation::mask_base) && (this->m_pimpl->isctype(f & re_detail::w32_regex_traits_implementation::mask_base, c))) return true; else if((f & re_detail::w32_regex_traits_implementation::mask_unicode) && re_detail::is_extended(c)) @@ -635,7 +635,7 @@ public: else if((f & re_detail::w32_regex_traits_implementation::mask_vertical) && (::boost::re_detail::is_separator(c) || (c == '\v'))) return true; - else if((f & re_detail::w32_regex_traits_implementation::mask_horizontal) + else if((f & re_detail::w32_regex_traits_implementation::mask_horizontal) && this->isctype(c, 0x0008u) && !this->isctype(c, re_detail::w32_regex_traits_implementation::mask_vertical)) return true; return false; @@ -672,7 +672,7 @@ public: static std::string get_catalog_name(); private: - boost::std::shared_ptr > m_pimpl; + boost::shared_ptr > m_pimpl; // // catalog name handler: // diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/detail/shared_ptr_132.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/detail/shared_ptr_132.hpp index 897062f2..b5f2b215 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/detail/shared_ptr_132.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/detail/shared_ptr_132.hpp @@ -2,7 +2,7 @@ #define BOOST_SHARED_PTR_132_HPP_INCLUDED // -// std::shared_ptr.hpp +// shared_ptr.hpp // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002, 2003 Peter Dimov @@ -11,7 +11,7 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // -// See http://www.boost.org/libs/smart_ptr/std::shared_ptr.htm for documentation. +// See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation. // #include // for broken compiler workarounds @@ -96,18 +96,18 @@ inline void sp_enable_shared_from_this( shared_count const & /*pn*/, ... ) // -// std::shared_ptr +// shared_ptr // // An enhanced relative of scoped_ptr with reference counted copy semantics. -// The object pointed to is deleted when the last std::shared_ptr pointing to it +// The object pointed to is deleted when the last shared_ptr pointing to it // is destroyed or reset. // -template class std::shared_ptr +template class shared_ptr { private: // Borland 5.5.1 specific workaround - typedef std::shared_ptr< T > this_type; + typedef shared_ptr< T > this_type; public: @@ -116,16 +116,16 @@ public: typedef T * pointer; typedef BOOST_DEDUCED_TYPENAME detail::shared_ptr_traits< T >::reference reference; - std::shared_ptr(): px(0), pn() // never throws in 1.30+ + shared_ptr(): px(0), pn() // never throws in 1.30+ { } #if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x564) ) template - explicit std::shared_ptr(Y * p): px(p), pn(p, boost::checked_deleter()) // Y must be complete + explicit shared_ptr(Y * p): px(p), pn(p, boost::checked_deleter()) // Y must be complete #else template - explicit std::shared_ptr(Y * p): px(p), pn(p, boost::checked_deleter()) // Y must be complete + explicit shared_ptr(Y * p): px(p), pn(p, boost::checked_deleter()) // Y must be complete #endif { detail::sp_enable_shared_from_this( pn, p, p ); @@ -134,10 +134,10 @@ public: // // Requirements: D's copy constructor must not throw // - // std::shared_ptr will release p by calling d(p) + // shared_ptr will release p by calling d(p) // - template std::shared_ptr(Y * p, D d): px(p), pn(p, d) + template shared_ptr(Y * p, D d): px(p), pn(p, d) { detail::sp_enable_shared_from_this( pn, p, p ); } @@ -147,7 +147,7 @@ public: // except that Borland C++ has a bug, and g++ with -Wsynth warns #if defined(__BORLANDC__) || defined(__GNUC__) - std::shared_ptr & operator=(std::shared_ptr const & r) // never throws + shared_ptr & operator=(shared_ptr const & r) // never throws { px = r.px; pn = r.pn; // shared_count::op= doesn't throw @@ -157,29 +157,29 @@ public: #endif template - explicit std::shared_ptr(weak_ptr const & r): pn(r.pn) // may throw + explicit shared_ptr(weak_ptr const & r): pn(r.pn) // may throw { // it is now safe to copy r.px, as pn(r.pn) did not throw px = r.px; } template - std::shared_ptr(std::shared_ptr const & r): px(r.px), pn(r.pn) // never throws + shared_ptr(shared_ptr const & r): px(r.px), pn(r.pn) // never throws { } template - std::shared_ptr(std::shared_ptr const & r, detail::static_cast_tag): px(static_cast(r.px)), pn(r.pn) + shared_ptr(shared_ptr const & r, detail::static_cast_tag): px(static_cast(r.px)), pn(r.pn) { } template - std::shared_ptr(std::shared_ptr const & r, detail::const_cast_tag): px(const_cast(r.px)), pn(r.pn) + shared_ptr(shared_ptr const & r, detail::const_cast_tag): px(const_cast(r.px)), pn(r.pn) { } template - std::shared_ptr(std::shared_ptr const & r, detail::dynamic_cast_tag): px(dynamic_cast(r.px)), pn(r.pn) + shared_ptr(shared_ptr const & r, detail::dynamic_cast_tag): px(dynamic_cast(r.px)), pn(r.pn) { if(px == 0) // need to allocate new counter -- the cast failed { @@ -188,7 +188,7 @@ public: } template - std::shared_ptr(std::shared_ptr const & r, detail::polymorphic_cast_tag): px(dynamic_cast(r.px)), pn(r.pn) + shared_ptr(shared_ptr const & r, detail::polymorphic_cast_tag): px(dynamic_cast(r.px)), pn(r.pn) { if(px == 0) { @@ -199,7 +199,7 @@ public: #ifndef BOOST_NO_AUTO_PTR template - explicit std::shared_ptr(std::auto_ptr & r): px(r.get()), pn() + explicit shared_ptr(std::auto_ptr & r): px(r.get()), pn() { Y * tmp = r.get(); pn = detail::shared_count(r); @@ -211,7 +211,7 @@ public: #if !defined(BOOST_MSVC) || (BOOST_MSVC > 1200) template - std::shared_ptr & operator=(std::shared_ptr const & r) // never throws + shared_ptr & operator=(shared_ptr const & r) // never throws { px = r.px; pn = r.pn; // shared_count::op= doesn't throw @@ -223,7 +223,7 @@ public: #ifndef BOOST_NO_AUTO_PTR template - std::shared_ptr & operator=(std::auto_ptr & r) + shared_ptr & operator=(std::auto_ptr & r) { this_type(r).swap(*this); return *this; @@ -258,7 +258,7 @@ public: BOOST_ASSERT(px != 0); return px; } - + T * get() const // never throws { return px; @@ -275,13 +275,13 @@ public: #elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) typedef T * (this_type::*unspecified_bool_type)() const; - + operator unspecified_bool_type() const // never throws { return px == 0? 0: &this_type::get; } -#else +#else typedef T * this_type::*unspecified_bool_type; @@ -309,13 +309,13 @@ public: return pn.use_count(); } - void swap(std::shared_ptr< T > & other) // never throws + void swap(shared_ptr< T > & other) // never throws { std::swap(px, other.px); pn.swap(other.pn); } - template bool _internal_less(std::shared_ptr const & rhs) const + template bool _internal_less(shared_ptr const & rhs) const { return pn < rhs.pn; } @@ -332,7 +332,7 @@ public: private: - template friend class std::shared_ptr; + template friend class shared_ptr; template friend class weak_ptr; @@ -341,14 +341,14 @@ public: // for serialization T * px; // contained pointer detail::shared_count pn; // reference counter -}; // std::shared_ptr +}; // shared_ptr -template inline bool operator==(std::shared_ptr< T > const & a, std::shared_ptr const & b) +template inline bool operator==(shared_ptr< T > const & a, shared_ptr const & b) { return a.get() == b.get(); } -template inline bool operator!=(std::shared_ptr< T > const & a, std::shared_ptr const & b) +template inline bool operator!=(shared_ptr< T > const & a, shared_ptr const & b) { return a.get() != b.get(); } @@ -357,64 +357,64 @@ template inline bool operator!=(std::shared_ptr< T > const & a // Resolve the ambiguity between our op!= and the one in rel_ops -template inline bool operator!=(std::shared_ptr< T > const & a, std::shared_ptr< T > const & b) +template inline bool operator!=(shared_ptr< T > const & a, shared_ptr< T > const & b) { return a.get() != b.get(); } #endif -template inline bool operator<(std::shared_ptr< T > const & a, std::shared_ptr const & b) +template inline bool operator<(shared_ptr< T > const & a, shared_ptr const & b) { return a._internal_less(b); } -template inline void swap(std::shared_ptr< T > & a, std::shared_ptr< T > & b) +template inline void swap(shared_ptr< T > & a, shared_ptr< T > & b) { a.swap(b); } -template std::shared_ptr< T > static_pointer_cast(std::shared_ptr const & r) +template shared_ptr< T > static_pointer_cast(shared_ptr const & r) { - return std::shared_ptr< T >(r, detail::static_cast_tag()); + return shared_ptr< T >(r, detail::static_cast_tag()); } -template std::shared_ptr< T > const_pointer_cast(std::shared_ptr const & r) +template shared_ptr< T > const_pointer_cast(shared_ptr const & r) { - return std::shared_ptr< T >(r, detail::const_cast_tag()); + return shared_ptr< T >(r, detail::const_cast_tag()); } -template std::shared_ptr< T > dynamic_pointer_cast(std::shared_ptr const & r) +template shared_ptr< T > dynamic_pointer_cast(shared_ptr const & r) { - return std::shared_ptr< T >(r, detail::dynamic_cast_tag()); + return shared_ptr< T >(r, detail::dynamic_cast_tag()); } // shared_*_cast names are deprecated. Use *_pointer_cast instead. -template std::shared_ptr< T > shared_static_cast(std::shared_ptr const & r) +template shared_ptr< T > shared_static_cast(shared_ptr const & r) { - return std::shared_ptr< T >(r, detail::static_cast_tag()); + return shared_ptr< T >(r, detail::static_cast_tag()); } -template std::shared_ptr< T > shared_dynamic_cast(std::shared_ptr const & r) +template shared_ptr< T > shared_dynamic_cast(shared_ptr const & r) { - return std::shared_ptr< T >(r, detail::dynamic_cast_tag()); + return shared_ptr< T >(r, detail::dynamic_cast_tag()); } -template std::shared_ptr< T > shared_polymorphic_cast(std::shared_ptr const & r) +template shared_ptr< T > shared_polymorphic_cast(shared_ptr const & r) { - return std::shared_ptr< T >(r, detail::polymorphic_cast_tag()); + return shared_ptr< T >(r, detail::polymorphic_cast_tag()); } -template std::shared_ptr< T > shared_polymorphic_downcast(std::shared_ptr const & r) +template shared_ptr< T > shared_polymorphic_downcast(shared_ptr const & r) { BOOST_ASSERT(dynamic_cast(r.get()) == r.get()); return shared_static_cast< T >(r); } -// get_pointer() enables boost::mem_fn to recognize std::shared_ptr +// get_pointer() enables boost::mem_fn to recognize shared_ptr -template inline T * get_pointer(std::shared_ptr< T > const & p) +template inline T * get_pointer(shared_ptr< T > const & p) { return p.get(); } @@ -423,7 +423,7 @@ template inline T * get_pointer(std::shared_ptr< T > const & p) #if defined(__GNUC__) && (__GNUC__ < 3) -template std::ostream & operator<< (std::ostream & os, std::shared_ptr const & p) +template std::ostream & operator<< (std::ostream & os, shared_ptr const & p) { os << p.get(); return os; @@ -434,10 +434,10 @@ template std::ostream & operator<< (std::ostream & os, std::shared_ptr< # if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, <= 1200 && __SGI_STL_PORT) // MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL using std::basic_ostream; -template basic_ostream & operator<< (basic_ostream & os, std::shared_ptr const & p) +template basic_ostream & operator<< (basic_ostream & os, shared_ptr const & p) # else -template std::basic_ostream & operator<< (std::basic_ostream & os, std::shared_ptr const & p) -# endif +template std::basic_ostream & operator<< (std::basic_ostream & os, shared_ptr const & p) +# endif { os << p.get(); return os; @@ -452,7 +452,7 @@ template std::basic_ostream & operator<< (std:: // g++ 2.9x doesn't allow static_cast(void *) // apparently EDG 2.38 also doesn't accept it -template D * get_deleter(std::shared_ptr< T > const & p) +template D * get_deleter(shared_ptr< T > const & p) { void const * q = p._internal_get_deleter(typeid(D)); return const_cast(static_cast(q)); @@ -460,7 +460,7 @@ template D * get_deleter(std::shared_ptr< T > const & p) #else -template D * get_deleter(std::shared_ptr< T > const & p) +template D * get_deleter(shared_ptr< T > const & p) { return static_cast(p._internal_get_deleter(typeid(D))); } @@ -471,7 +471,7 @@ template D * get_deleter(std::shared_ptr< T > const & p) #ifdef BOOST_MSVC # pragma warning(pop) -#endif +#endif #endif // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/detail/shared_ptr_nmt_132.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/detail/shared_ptr_nmt_132.hpp index 0f9c8282..490e7ddd 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/detail/shared_ptr_nmt_132.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/detail/shared_ptr_nmt_132.hpp @@ -2,7 +2,7 @@ #define BOOST_DETAIL_SHARED_PTR_NMT_132_HPP_INCLUDED // -// detail/shared_ptr_nmt.hpp - std::shared_ptr.hpp without member templates +// detail/shared_ptr_nmt.hpp - shared_ptr.hpp without member templates // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov @@ -11,7 +11,7 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // -// See http://www.boost.org/libs/smart_ptr/std::shared_ptr.htm for documentation. +// See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation. // #include @@ -30,7 +30,7 @@ namespace boost { -template class std::shared_ptr +template class shared_ptr { private: @@ -41,7 +41,7 @@ public: typedef T element_type; typedef T value_type; - explicit std::shared_ptr(T * p = 0): px(p) + explicit shared_ptr(T * p = 0): px(p) { #ifndef BOOST_NO_EXCEPTIONS @@ -68,7 +68,7 @@ public: #endif } - ~std::shared_ptr() + ~shared_ptr() { if(--*pn == 0) { @@ -77,29 +77,29 @@ public: } } - std::shared_ptr(std::shared_ptr const & r): px(r.px) // never throws + shared_ptr(shared_ptr const & r): px(r.px) // never throws { pn = r.pn; ++*pn; } - std::shared_ptr & operator=(std::shared_ptr const & r) + shared_ptr & operator=(shared_ptr const & r) { - std::shared_ptr(r).swap(*this); + shared_ptr(r).swap(*this); return *this; } #ifndef BOOST_NO_AUTO_PTR - explicit std::shared_ptr(std::auto_ptr< T > & r) - { + explicit shared_ptr(std::auto_ptr< T > & r) + { pn = new count_type(1); // may throw px = r.release(); // fix: moved here to stop leak if new throws - } + } - std::shared_ptr & operator=(std::auto_ptr< T > & r) + shared_ptr & operator=(std::auto_ptr< T > & r) { - std::shared_ptr(r).swap(*this); + shared_ptr(r).swap(*this); return *this; } @@ -108,7 +108,7 @@ public: void reset(T * p = 0) { BOOST_ASSERT(p == 0 || p != px); - std::shared_ptr(p).swap(*this); + shared_ptr(p).swap(*this); } T & operator*() const // never throws @@ -137,8 +137,8 @@ public: { return *pn == 1; } - - void swap(std::shared_ptr< T > & other) // never throws + + void swap(shared_ptr< T > & other) // never throws { std::swap(px, other.px); std::swap(pn, other.pn); @@ -150,29 +150,29 @@ private: count_type * pn; // ptr to reference counter }; -template inline bool operator==(std::shared_ptr< T > const & a, std::shared_ptr const & b) +template inline bool operator==(shared_ptr< T > const & a, shared_ptr const & b) { return a.get() == b.get(); } -template inline bool operator!=(std::shared_ptr< T > const & a, std::shared_ptr const & b) +template inline bool operator!=(shared_ptr< T > const & a, shared_ptr const & b) { return a.get() != b.get(); } -template inline bool operator<(std::shared_ptr< T > const & a, std::shared_ptr< T > const & b) +template inline bool operator<(shared_ptr< T > const & a, shared_ptr< T > const & b) { return std::less()(a.get(), b.get()); } -template void swap(std::shared_ptr< T > & a, std::shared_ptr< T > & b) +template void swap(shared_ptr< T > & a, shared_ptr< T > & b) { a.swap(b); } -// get_pointer() enables boost::mem_fn to recognize std::shared_ptr +// get_pointer() enables boost::mem_fn to recognize shared_ptr -template inline T * get_pointer(std::shared_ptr< T > const & p) +template inline T * get_pointer(shared_ptr< T > const & p) { return p.get(); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/shared_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/shared_ptr.hpp index 63eab8c5..37f95e35 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/shared_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/shared_ptr.hpp @@ -7,7 +7,7 @@ #endif /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// std::shared_ptr.hpp: serialization for boost shared pointer +// shared_ptr.hpp: serialization for boost shared pointer // (C) Copyright 2004 Robert Ramey and Martin Ecker // Use, modification and distribution is subject to the Boost Software @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include @@ -31,7 +31,7 @@ #include /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// std::shared_ptr serialization traits +// shared_ptr serialization traits // version 1 to distinguish from boost 1.32 version. Note: we can only do this // for a template when the compiler supports partial template specialization @@ -39,7 +39,7 @@ namespace boost { namespace serialization{ template - struct version< ::boost::std::shared_ptr< T > > { + struct version< ::boost::shared_ptr< T > > { typedef mpl::integral_c_tag tag; #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) typedef BOOST_DEDUCED_TYPENAME mpl::int_<1> type; @@ -54,7 +54,7 @@ }; // don't track shared pointers template - struct tracking_level< ::boost::std::shared_ptr< T > > { + struct tracking_level< ::boost::shared_ptr< T > > { typedef mpl::integral_c_tag tag; #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) typedef BOOST_DEDUCED_TYPENAME mpl::int_< ::boost::serialization::track_never> type; @@ -73,11 +73,11 @@ // define macro to let users of these compilers do this #define BOOST_SERIALIZATION_SHARED_PTR(T) \ BOOST_CLASS_VERSION( \ - ::boost::std::shared_ptr< T >, \ + ::boost::shared_ptr< T >, \ 1 \ ) \ BOOST_CLASS_TRACKING( \ - ::boost::std::shared_ptr< T >, \ + ::boost::shared_ptr< T >, \ ::boost::serialization::track_never \ ) \ /**/ @@ -91,16 +91,16 @@ struct null_deleter { }; /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// serialization for std::shared_ptr +// serialization for shared_ptr template inline void save( Archive & ar, - const boost::std::shared_ptr< T > &t, + const boost::shared_ptr< T > &t, const unsigned int /* file_version */ ){ // The most common cause of trapping here would be serializing - // something like std::shared_ptr. This occurs because int + // something like shared_ptr. This occurs because int // is never tracked by default. Wrap int in a trackable type BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never)); const T * t_ptr = t.get(); @@ -111,11 +111,11 @@ inline void save( template inline void load( Archive & ar, - boost::std::shared_ptr< T > &t, + boost::shared_ptr< T > &t, const unsigned int file_version ){ // The most common cause of trapping here would be serializing - // something like std::shared_ptr. This occurs because int + // something like shared_ptr. This occurs because int // is never tracked by default. Wrap int in a trackable type BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never)); T* r; @@ -126,7 +126,7 @@ inline void load( ar.register_type(static_cast< boost_132::detail::sp_counted_base_impl * >(NULL)); - boost_132::std::shared_ptr< T > sp; + boost_132::shared_ptr< T > sp; ar >> boost::serialization::make_nvp("px", sp.px); ar >> boost::serialization::make_nvp("pn", sp.pn); // got to keep the sps around so the sp.pns don't disappear @@ -143,11 +143,11 @@ inline void load( template inline void load( Archive & ar, - boost::std::shared_ptr< T > &t, + boost::shared_ptr< T > &t, const unsigned int /*file_version*/ ){ // The most common cause of trapping here would be serializing - // something like std::shared_ptr. This occurs because int + // something like shared_ptr. This occurs because int // is never tracked by default. Wrap int in a trackable type BOOST_STATIC_ASSERT((tracking_level< T >::value != track_never)); T* r; @@ -159,10 +159,10 @@ inline void load( template inline void serialize( Archive & ar, - boost::std::shared_ptr< T > &t, + boost::shared_ptr< T > &t, const unsigned int file_version ){ - // correct std::shared_ptr serialization depends upon object tracking + // correct shared_ptr serialization depends upon object tracking // being used. BOOST_STATIC_ASSERT( boost::serialization::tracking_level< T >::value diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/shared_ptr_132.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/shared_ptr_132.hpp index cdc888b8..9bcefe09 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/shared_ptr_132.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/shared_ptr_132.hpp @@ -7,9 +7,9 @@ #endif /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// std::shared_ptr.hpp: serialization for boost shared pointer +// shared_ptr.hpp: serialization for boost shared pointer -// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . +// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) @@ -17,8 +17,8 @@ // See http://www.boost.org for updates, documentation, and revision history. // note: totally unadvised hack to gain access to private variables -// in std::shared_ptr and shared_count. Unfortunately its the only way to -// do this without changing std::shared_ptr and shared_count +// in shared_ptr and shared_count. Unfortunately its the only way to +// do this without changing shared_ptr and shared_count // the best we can do is to detect a conflict here #include @@ -38,7 +38,7 @@ // Maintain a couple of lists of loaded shared pointers of the old previous // version (1.32) -namespace boost_132 { +namespace boost_132 { namespace serialization { namespace detail { @@ -53,7 +53,7 @@ struct null_deleter { ///////////////////////////////////////////////////////////// // sp_counted_base_impl serialization -namespace boost { +namespace boost { namespace serialization { template @@ -66,7 +66,7 @@ inline void serialize( // its polymorphic base boost::serialization::void_cast_register< boost_132::detail::sp_counted_base_impl, - boost_132::detail::sp_counted_base + boost_132::detail::sp_counted_base >( static_cast *>(NULL), static_cast(NULL) @@ -76,8 +76,8 @@ inline void serialize( template inline void save_construct_data( Archive & ar, - const - boost_132::detail::sp_counted_base_impl *t, + const + boost_132::detail::sp_counted_base_impl *t, const BOOST_PFTO unsigned int /* file_version */ ){ // variables used for construction @@ -87,25 +87,25 @@ inline void save_construct_data( template inline void load_construct_data( Archive & ar, - boost_132::detail::sp_counted_base_impl * t, + boost_132::detail::sp_counted_base_impl * t, const unsigned int /* file_version */ ){ P ptr_; ar >> boost::serialization::make_nvp("ptr", ptr_); - // ::new(t)boost_132::detail::sp_counted_base_impl(ptr_, D()); + // ::new(t)boost_132::detail::sp_counted_base_impl(ptr_, D()); // placement // note: the original ::new... above is replaced by the one here. This one // creates all new objects with a null_deleter so that after the archive // is finished loading and the shared_ptrs are destroyed - the underlying - // raw pointers are NOT deleted. This is necessary as they are used by the + // raw pointers are NOT deleted. This is necessary as they are used by the // new system as well. ::new(t)boost_132::detail::sp_counted_base_impl< - P, + P, boost_132::serialization::detail::null_deleter >( ptr_, boost_132::serialization::detail::null_deleter() ); // placement new - // compensate for that fact that a new shared count always is + // compensate for that fact that a new shared count always is // initialized with one. the add_ref_copy below will increment it // every time its serialized so without this adjustment // the use and weak counts will be off by one. @@ -118,7 +118,7 @@ inline void load_construct_data( ///////////////////////////////////////////////////////////// // shared_count serialization -namespace boost { +namespace boost { namespace serialization { template @@ -147,15 +147,15 @@ inline void load( BOOST_SERIALIZATION_SPLIT_FREE(boost_132::detail::shared_count) ///////////////////////////////////////////////////////////// -// implement serialization for std::shared_ptr< T > +// implement serialization for shared_ptr< T > -namespace boost { +namespace boost { namespace serialization { template inline void save( Archive & ar, - const boost_132::std::shared_ptr< T > &t, + const boost_132::shared_ptr< T > &t, const unsigned int /* file_version */ ){ // only the raw pointer has to be saved @@ -170,7 +170,7 @@ inline void save( template inline void load( Archive & ar, - boost_132::std::shared_ptr< T > &t, + boost_132::shared_ptr< T > &t, const unsigned int /* file_version */ ){ // only the raw pointer has to be saved @@ -185,10 +185,10 @@ inline void load( template inline void serialize( Archive & ar, - boost_132::std::shared_ptr< T > &t, + boost_132::shared_ptr< T > &t, const unsigned int file_version ){ - // correct std::shared_ptr serialization depends upon object tracking + // correct shared_ptr serialization depends upon object tracking // being used. BOOST_STATIC_ASSERT( boost::serialization::tracking_level< T >::value @@ -200,7 +200,7 @@ inline void serialize( } // serialization } // namespace boost -// note: change below uses null_deleter +// note: change below uses null_deleter // This macro is used to export GUIDS for shared pointers to allow // the serialization system to export them properly. David Tonge #define BOOST_SHARED_POINTER_EXPORT_GUID(T, K) \ diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/weak_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/weak_ptr.hpp index a6add742..3fe8698d 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/weak_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/serialization/weak_ptr.hpp @@ -7,7 +7,7 @@ #endif /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 -// std::shared_ptr.hpp: serialization for boost shared pointer +// shared_ptr.hpp: serialization for boost shared pointer // (C) Copyright 2004 Robert Ramey and Martin Ecker // Use, modification and distribution is subject to the Boost Software @@ -17,7 +17,7 @@ // See http://www.boost.org for updates, documentation, and revision history. #include -#include +#include namespace boost { namespace serialization{ @@ -28,7 +28,7 @@ inline void save( const boost::weak_ptr< T > &t, const unsigned int /* file_version */ ){ - const boost::std::shared_ptr< T > sp = t.lock(); + const boost::shared_ptr< T > sp = t.lock(); ar << boost::serialization::make_nvp("weak_ptr", sp); } @@ -38,7 +38,7 @@ inline void load( boost::weak_ptr< T > &t, const unsigned int /* file_version */ ){ - boost::std::shared_ptr< T > sp; + boost::shared_ptr< T > sp; ar >> boost::serialization::make_nvp("weak_ptr", sp); t = sp; } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/shared_container_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/shared_container_iterator.hpp index 5a8f0af5..7d8ecd3e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/shared_container_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/shared_container_iterator.hpp @@ -9,7 +9,7 @@ #define SHARED_CONTAINER_ITERATOR_RG08102002_HPP #include "boost/iterator_adaptors.hpp" -#include "boost/std::shared_ptr.hpp" +#include "boost/shared_ptr.hpp" #include namespace boost { @@ -24,7 +24,7 @@ class shared_container_iterator : public iterator_adaptor< typename Container::iterator> super_t; typedef typename Container::iterator iterator_t; - typedef boost::std::shared_ptr container_ref_t; + typedef boost::shared_ptr container_ref_t; container_ref_t container_ref; public: @@ -39,7 +39,7 @@ public: template shared_container_iterator make_shared_container_iterator(typename Container::iterator iter, - boost::std::shared_ptr const& container) { + boost::shared_ptr const& container) { typedef shared_container_iterator iterator; return iterator(iter,container); } @@ -50,7 +50,7 @@ template std::pair< shared_container_iterator, shared_container_iterator > -make_shared_container_range(boost::std::shared_ptr const& container) { +make_shared_container_range(boost::shared_ptr const& container) { return std::make_pair( make_shared_container_iterator(container->begin(),container), diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/shared_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/shared_ptr.hpp index bcc40bff..d31978c9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/shared_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/shared_ptr.hpp @@ -2,7 +2,7 @@ #define BOOST_SHARED_PTR_HPP_INCLUDED // -// std::shared_ptr.hpp +// shared_ptr.hpp // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001-2008 Peter Dimov @@ -11,9 +11,9 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // -// See http://www.boost.org/libs/smart_ptr/std::shared_ptr.htm for documentation. +// See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation. // -#include +#include #endif // #ifndef BOOST_SHARED_PTR_HPP_INCLUDED diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/connection.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/connection.hpp index 8ef685b1..1ede6be7 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/connection.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/connection.hpp @@ -97,7 +97,7 @@ namespace boost { void set_controlling(bool control = true) { controlling_connection = control; } - std::shared_ptr + shared_ptr get_connection() const { return con; } @@ -115,7 +115,7 @@ namespace boost { friend class BOOST_SIGNALS_NAMESPACE::detail::bound_objects_visitor; // Pointer to the actual contents of the connection - std::shared_ptr con; + shared_ptr con; // True if the destruction of this connection object should disconnect bool controlling_connection; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/detail/named_slot_map.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/detail/named_slot_map.hpp index 84a1e04c..88625fae 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/detail/named_slot_map.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/detail/named_slot_map.hpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -45,7 +45,7 @@ class stored_group private: storage_kind kind; - std::shared_ptr group; + shared_ptr group; }; typedef function2 compare_type; @@ -60,7 +60,7 @@ public: typedef const stored_group& first_argument_type; typedef const stored_group& second_argument_type; - group_bridge_compare(const Compare& c) : comp(c) + group_bridge_compare(const Compare& c) : comp(c) { } bool operator()(const stored_group& k1, const stored_group& k2) const @@ -93,15 +93,15 @@ class BOOST_SIGNALS_DECL named_slot_map_iterator : connection_slot_pair, forward_traversal_tag> inherited; public: - named_slot_map_iterator() : slot_assigned(false) + named_slot_map_iterator() : slot_assigned(false) { } - named_slot_map_iterator(const named_slot_map_iterator& other) + named_slot_map_iterator(const named_slot_map_iterator& other) : group(other.group), last_group(other.last_group), slot_assigned(other.slot_assigned) { if (slot_assigned) slot_ = other.slot_; } - named_slot_map_iterator& operator=(const named_slot_map_iterator& other) + named_slot_map_iterator& operator=(const named_slot_map_iterator& other) { slot_assigned = other.slot_assigned; group = other.group; @@ -109,11 +109,11 @@ public: if (slot_assigned) slot_ = other.slot_; return *this; } - connection_slot_pair& dereference() const + connection_slot_pair& dereference() const { return *slot_; } - void increment() + void increment() { ++slot_; if (slot_ == group->second.end()) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/detail/signal_base.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/detail/signal_base.hpp index d82100ce..0438cf7b 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/detail/signal_base.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/detail/signal_base.hpp @@ -33,10 +33,10 @@ namespace boost { // manages call depth class BOOST_SIGNALS_DECL call_notification { public: - call_notification(const std::shared_ptr&); + call_notification(const shared_ptr&); ~call_notification(); - std::shared_ptr impl; + shared_ptr impl; }; // Implementation of base class for all signals. It handles the @@ -87,7 +87,7 @@ namespace boost { connection connect_slot(const any& slot, const stored_group& name, - std::shared_ptr data, + shared_ptr data, connect_position at); private: @@ -138,7 +138,7 @@ namespace boost { protected: connection connect_slot(const any& slot, const stored_group& name, - std::shared_ptr data, + shared_ptr data, connect_position at) { return impl->connect_slot(slot, name, data, at); @@ -146,7 +146,7 @@ namespace boost { typedef named_slot_map::iterator iterator; - std::shared_ptr impl; + shared_ptr impl; }; } // end namespace detail } // end namespace BOOST_SIGNALS_NAMESPACE diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/slot.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/slot.hpp index 6d1533d2..bbf18480 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/slot.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals/slot.hpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #ifdef BOOST_HAS_ABI_HEADERS @@ -33,7 +33,7 @@ namespace boost { std::vector bound_objects; connection watch_bound_objects; }; - std::shared_ptr get_data() const { return data; } + shared_ptr get_data() const { return data; } // Get the set of bound objects std::vector& get_bound_objects() const @@ -41,14 +41,14 @@ namespace boost { // Determine if this slot is still "active", i.e., all of the bound // objects still exist - bool is_active() const + bool is_active() const { return data->watch_bound_objects.connected(); } protected: // Create a connection for this slot void create_connection(); - std::shared_ptr data; + shared_ptr data; private: static void bound_object_destructed(void*, void*) {} @@ -116,9 +116,9 @@ namespace boost { // An exception thrown here will allow the basic_connection to be // destroyed when this goes out of scope, and no other connections // have been made. - BOOST_SIGNALS_NAMESPACE::detail::bound_objects_visitor + BOOST_SIGNALS_NAMESPACE::detail::bound_objects_visitor do_bind(this->data->bound_objects); - visit_each(do_bind, + visit_each(do_bind, BOOST_SIGNALS_NAMESPACE::get_inspectable_slot (f, BOOST_SIGNALS_NAMESPACE::tag_type(f))); create_connection(); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/connection.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/connection.hpp index 13136cc6..0271a3c1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/connection.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/connection.hpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -48,11 +48,11 @@ namespace boost _connected = false; } virtual bool connected() const = 0; - std::shared_ptr get_blocker() + shared_ptr get_blocker() { unique_lock local_lock(*this); - std::shared_ptr blocker = _weak_blocker.lock(); - if(blocker == std::shared_ptr()) + shared_ptr blocker = _weak_blocker.lock(); + if(blocker == shared_ptr()) { blocker.reset(this, &null_deleter); _weak_blocker = blocker; @@ -161,26 +161,26 @@ namespace boost ~connection() {} void disconnect() const { - boost::std::shared_ptr connectionBody(_weak_connection_body.lock()); + boost::shared_ptr connectionBody(_weak_connection_body.lock()); if(connectionBody == 0) return; connectionBody->disconnect(); } bool connected() const { - boost::std::shared_ptr connectionBody(_weak_connection_body.lock()); + boost::shared_ptr connectionBody(_weak_connection_body.lock()); if(connectionBody == 0) return false; return connectionBody->connected(); } bool blocked() const { - boost::std::shared_ptr connectionBody(_weak_connection_body.lock()); + boost::shared_ptr connectionBody(_weak_connection_body.lock()); if(connectionBody == 0) return true; return connectionBody->blocked(); } bool operator==(const connection& other) const { - boost::std::shared_ptr connectionBody(_weak_connection_body.lock()); - boost::std::shared_ptr otherConnectionBody(other._weak_connection_body.lock()); + boost::shared_ptr connectionBody(_weak_connection_body.lock()); + boost::shared_ptr otherConnectionBody(other._weak_connection_body.lock()); return connectionBody == otherConnectionBody; } bool operator!=(const connection& other) const @@ -189,8 +189,8 @@ namespace boost } bool operator<(const connection& other) const { - boost::std::shared_ptr connectionBody(_weak_connection_body.lock()); - boost::std::shared_ptr otherConnectionBody(other._weak_connection_body.lock()); + boost::shared_ptr connectionBody(_weak_connection_body.lock()); + boost::shared_ptr otherConnectionBody(other._weak_connection_body.lock()); return connectionBody < otherConnectionBody; } void swap(connection &other) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/deconstruct.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/deconstruct.hpp index d651fa31..d3eca33c 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/deconstruct.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/deconstruct.hpp @@ -3,8 +3,8 @@ // deconstruct.hpp // -// A factory function for creating a std::shared_ptr which creates -// an object and its owning std::shared_ptr with one allocation, similar +// A factory function for creating a shared_ptr which creates +// an object and its owning shared_ptr with one allocation, similar // to make_shared(). It also supports postconstructors // and predestructors through unqualified calls of adl_postconstruct() and // adl_predestruct, relying on argument-dependent @@ -25,7 +25,7 @@ // for more information #include -#include +#include #include #include #include @@ -50,11 +50,11 @@ template class postconstructor_invoker { public: - operator const std::shared_ptr & () const + operator const shared_ptr & () const { return postconstruct(); } - const std::shared_ptr& postconstruct() const + const shared_ptr& postconstruct() const { if(!_postconstructed) { @@ -65,7 +65,7 @@ public: } #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template - const std::shared_ptr& postconstruct(Args && ... args) + const shared_ptr& postconstruct(Args && ... args) { if(!_postconstructed) { @@ -77,7 +77,7 @@ public: } #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template - const std::shared_ptr& postconstruct(const A1 &a1) const + const shared_ptr& postconstruct(const A1 &a1) const { if(!_postconstructed) { @@ -88,7 +88,7 @@ public: return _sp; } template - const std::shared_ptr& postconstruct(const A1 &a1, const A2 &a2) const + const shared_ptr& postconstruct(const A1 &a1, const A2 &a2) const { if(!_postconstructed) { @@ -99,7 +99,7 @@ public: return _sp; } template - const std::shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3) const + const shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3) const { if(!_postconstructed) { @@ -110,7 +110,7 @@ public: return _sp; } template - const std::shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4) const + const shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4) const { if(!_postconstructed) { @@ -121,7 +121,7 @@ public: return _sp; } template - const std::shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5) const + const shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5) const { if(!_postconstructed) { @@ -133,7 +133,7 @@ public: } template - const std::shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, + const shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6) const { if(!_postconstructed) @@ -146,7 +146,7 @@ public: } template - const std::shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, + const shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7) const { if(!_postconstructed) @@ -159,7 +159,7 @@ public: } template - const std::shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, + const shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8) const { if(!_postconstructed) @@ -172,7 +172,7 @@ public: } template - const std::shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, + const shared_ptr& postconstruct(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9) const { if(!_postconstructed) @@ -186,10 +186,10 @@ public: #endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) private: friend class boost::signals2::deconstruct_access; - postconstructor_invoker(const std::shared_ptr & sp): + postconstructor_invoker(const shared_ptr & sp): _sp(sp), _postconstructed(false) {} - std::shared_ptr _sp; + shared_ptr _sp; mutable bool _postconstructed; }; @@ -269,7 +269,7 @@ public: template< class T > static postconstructor_invoker deconstruct() { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -278,7 +278,7 @@ public: new( pv ) T(); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; @@ -291,7 +291,7 @@ public: template< class T, class... Args > static postconstructor_invoker deconstruct( Args && ... args ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -300,7 +300,7 @@ public: new( pv ) T( std::forward( args )... ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -310,7 +310,7 @@ public: template< class T, class A1 > static postconstructor_invoker deconstruct( A1 const & a1 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -319,7 +319,7 @@ public: new( pv ) T( a1 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -327,7 +327,7 @@ public: template< class T, class A1, class A2 > static postconstructor_invoker deconstruct( A1 const & a1, A2 const & a2 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -336,7 +336,7 @@ public: new( pv ) T( a1, a2 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -344,7 +344,7 @@ public: template< class T, class A1, class A2, class A3 > static postconstructor_invoker deconstruct( A1 const & a1, A2 const & a2, A3 const & a3 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -353,7 +353,7 @@ public: new( pv ) T( a1, a2, a3 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -361,7 +361,7 @@ public: template< class T, class A1, class A2, class A3, class A4 > static postconstructor_invoker deconstruct( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -370,7 +370,7 @@ public: new( pv ) T( a1, a2, a3, a4 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -378,7 +378,7 @@ public: template< class T, class A1, class A2, class A3, class A4, class A5 > static postconstructor_invoker deconstruct( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -387,7 +387,7 @@ public: new( pv ) T( a1, a2, a3, a4, a5 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -395,7 +395,7 @@ public: template< class T, class A1, class A2, class A3, class A4, class A5, class A6 > static postconstructor_invoker deconstruct( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -404,7 +404,7 @@ public: new( pv ) T( a1, a2, a3, a4, a5, a6 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -412,7 +412,7 @@ public: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > static postconstructor_invoker deconstruct( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -421,7 +421,7 @@ public: new( pv ) T( a1, a2, a3, a4, a5, a6, a7 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -429,7 +429,7 @@ public: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > static postconstructor_invoker deconstruct( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -438,7 +438,7 @@ public: new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } @@ -446,7 +446,7 @@ public: template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > static postconstructor_invoker deconstruct( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::deconstruct_deleter< T >() ); detail::deconstruct_deleter< T > * pd = boost::get_deleter< detail::deconstruct_deleter< T > >( pt ); @@ -455,7 +455,7 @@ public: new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); pd->set_initialized(); - boost::std::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); + boost::shared_ptr< T > retval( pt, static_cast< T* >( pv ) ); boost::detail::sp_enable_shared_from_this(&retval, retval.get(), retval.get()); return retval; } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/deconstruct_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/deconstruct_ptr.hpp index a376c197..841b19b2 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/deconstruct_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/deconstruct_ptr.hpp @@ -1,7 +1,7 @@ // DEPRECATED in favor of adl_postconstruct and adl_predestruct with // deconstruct(). -// A factory function for creating a std::shared_ptr that enhances the plain -// std::shared_ptr constructors by adding support for postconstructors +// A factory function for creating a shared_ptr that enhances the plain +// shared_ptr constructors by adding support for postconstructors // and predestructors through the boost::signals2::postconstructible and // boost::signals2::predestructible base classes. // @@ -19,7 +19,7 @@ #include #include #include -#include +#include namespace boost { @@ -63,17 +63,17 @@ namespace boost }; template - std::shared_ptr deconstruct_ptr(T *ptr) + shared_ptr deconstruct_ptr(T *ptr) { - if(ptr == 0) return std::shared_ptr(ptr); - std::shared_ptr shared(ptr, boost::signals2::predestructing_deleter()); + if(ptr == 0) return shared_ptr(ptr); + shared_ptr shared(ptr, boost::signals2::predestructing_deleter()); detail::do_postconstruct(ptr); return shared; } template - std::shared_ptr deconstruct_ptr(T *ptr, D deleter) + shared_ptr deconstruct_ptr(T *ptr, D deleter) { - std::shared_ptr shared(ptr, deleter); + shared_ptr shared(ptr, deleter); if(ptr == 0) return shared; detail::do_postconstruct(ptr); return shared; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/foreign_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/foreign_ptr.hpp index a53bb6d4..47c59962 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/foreign_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/foreign_ptr.hpp @@ -1,5 +1,5 @@ -// helper code for dealing with tracking non-boost std::shared_ptr/weak_ptr +// helper code for dealing with tracking non-boost shared_ptr/weak_ptr // Copyright Frank Mori Hess 2009. // Distributed under the Boost Software License, Version @@ -31,7 +31,7 @@ namespace boost { - template class std::shared_ptr; + template class shared_ptr; template class weak_ptr; namespace signals2 @@ -40,7 +40,7 @@ namespace boost {}; template struct weak_ptr_traits > { - typedef boost::std::shared_ptr shared_type; + typedef boost::shared_ptr shared_type; }; #ifndef BOOST_SIGNALS2_NO_CXX11_SMART_PTR template struct weak_ptr_traits > @@ -52,7 +52,7 @@ namespace boost template struct shared_ptr_traits {}; - template struct shared_ptr_traits > + template struct shared_ptr_traits > { typedef boost::weak_ptr weak_type; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/signal_template.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/signal_template.hpp index 8fef5f83..45e70316 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/signal_template.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/detail/signal_template.hpp @@ -112,7 +112,7 @@ namespace boost {} ExtendedSlotFunction _fun; - boost::std::shared_ptr _connection; + boost::shared_ptr _connection; }; template @@ -139,7 +139,7 @@ namespace boost #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES typedef slot_call_iterator_cache slot_call_iterator_cache_type; typedef typename group_key::type group_key_type; - typedef std::shared_ptr > connection_body_type; + typedef shared_ptr > connection_body_type; typedef grouped_list connection_list_type; typedef BOOST_SIGNALS2_BOUND_EXTENDED_SLOT_FUNCTION_N(BOOST_SIGNALS2_NUM_ARGS) bound_extended_slot_function_type; @@ -191,7 +191,7 @@ namespace boost // disconnect slot(s) void disconnect_all_slots() { - std::shared_ptr local_state = + shared_ptr local_state = get_readable_state(); typename connection_list_type::iterator it; for(it = local_state->connection_bodies().begin(); @@ -202,7 +202,7 @@ namespace boost } void disconnect(const group_type &group) { - std::shared_ptr local_state = + shared_ptr local_state = get_readable_state(); group_key_type group_key(grouped_slots, group); typename connection_list_type::iterator it; @@ -223,7 +223,7 @@ namespace boost // emit signal result_type operator ()(BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(BOOST_SIGNALS2_NUM_ARGS)) { - std::shared_ptr local_state; + shared_ptr local_state; typename connection_list_type::iterator it; { unique_lock list_lock(_mutex); @@ -247,7 +247,7 @@ namespace boost } result_type operator ()(BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(BOOST_SIGNALS2_NUM_ARGS)) const { - std::shared_ptr local_state; + shared_ptr local_state; typename connection_list_type::iterator it; { unique_lock list_lock(_mutex); @@ -271,7 +271,7 @@ namespace boost } std::size_t num_slots() const { - std::shared_ptr local_state = + shared_ptr local_state = get_readable_state(); typename connection_list_type::iterator it; std::size_t count = 0; @@ -284,7 +284,7 @@ namespace boost } bool empty() const { - std::shared_ptr local_state = + shared_ptr local_state = get_readable_state(); typename connection_list_type::iterator it; for(it = local_state->connection_bodies().begin(); @@ -396,8 +396,8 @@ namespace boost private: invocation_state(const invocation_state &); - std::shared_ptr _connection_bodies; - std::shared_ptr _combiner; + shared_ptr _connection_bodies; + shared_ptr _combiner; }; // Destructor of invocation_janitor does some cleanup when a signal invocation completes. // Code can't be put directly in signal's operator() due to complications from void return types. @@ -500,7 +500,7 @@ namespace boost } nolock_cleanup_connections_from(false, _shared_state->connection_bodies().begin()); } - std::shared_ptr get_readable_state() const + shared_ptr get_readable_state() const { unique_lock list_lock(_mutex); return _shared_state; @@ -517,7 +517,7 @@ namespace boost template void do_disconnect(const T &slot, mpl::bool_ /* is_group */) { - std::shared_ptr local_state = + shared_ptr local_state = get_readable_state(); typename connection_list_type::iterator it; for(it = local_state->connection_bodies().begin(); @@ -576,7 +576,7 @@ namespace boost } // _shared_state is mutable so we can do force_cleanup_connections during a const invocation - mutable std::shared_ptr _shared_state; + mutable shared_ptr _shared_state; mutable typename connection_list_type::iterator _garbage_collector_it; // connection list mutex must never be locked when attempting a blocking lock on a slot, // or you could deadlock. @@ -715,12 +715,12 @@ namespace boost return (*_pimpl).set_combiner(combiner_arg); } protected: - virtual std::shared_ptr lock_pimpl() const + virtual shared_ptr lock_pimpl() const { return _pimpl; } private: - std::shared_ptr + shared_ptr _pimpl; }; @@ -747,7 +747,7 @@ namespace boost {} result_type operator ()(BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(BOOST_SIGNALS2_NUM_ARGS)) { - std::shared_ptr > shared_pimpl(_weak_pimpl.lock()); if(shared_pimpl == 0) boost::throw_exception(expired_slot()); @@ -755,7 +755,7 @@ namespace boost } result_type operator ()(BOOST_SIGNALS2_SIGNATURE_FULL_ARGS(BOOST_SIGNALS2_NUM_ARGS)) const { - std::shared_ptr > shared_pimpl(_weak_pimpl.lock()); if(shared_pimpl == 0) boost::throw_exception(expired_slot()); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/postconstructible.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/postconstructible.hpp index 5ee1d82c..faa14444 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/postconstructible.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/postconstructible.hpp @@ -2,7 +2,7 @@ // A simple framework for creating objects with postconstructors. // The objects must inherit from boost::signals2::postconstructible, and // have their lifetimes managed by -// boost::std::shared_ptr created with the boost::signals2::deconstruct_ptr() +// boost::shared_ptr created with the boost::signals2::deconstruct_ptr() // function. // // Copyright Frank Mori Hess 2007-2008. @@ -17,7 +17,7 @@ namespace boost { - template class std::shared_ptr; + template class shared_ptr; namespace signals2 { @@ -37,7 +37,7 @@ namespace boost public: friend void detail::do_postconstruct(const postconstructible *ptr); template - friend void adl_postconstruct(const std::shared_ptr &sp, postconstructible *p) + friend void adl_postconstruct(const shared_ptr &sp, postconstructible *p) { p->postconstruct(); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/predestructible.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/predestructible.hpp index bc7f574c..0f6806dc 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/predestructible.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/predestructible.hpp @@ -2,7 +2,7 @@ // A simple framework for creating objects with predestructors. // The objects must inherit from boost::signals2::predestructible, and // have their lifetimes managed by -// boost::std::shared_ptr created with the boost::signals2::deconstruct_ptr() +// boost::shared_ptr created with the boost::signals2::deconstruct_ptr() // function. // // Copyright Frank Mori Hess 2007-2008. @@ -29,7 +29,7 @@ namespace boost predestructible() {} public: template - friend void adl_postconstruct(const std::shared_ptr &, ...) + friend void adl_postconstruct(const shared_ptr &, ...) {} friend void adl_predestruct(predestructible *p) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/shared_connection_block.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/shared_connection_block.hpp index aa11a90a..c16bf9b9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/shared_connection_block.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/shared_connection_block.hpp @@ -11,7 +11,7 @@ #ifndef BOOST_SIGNALS2_SHARED_CONNECTION_BLOCK_HPP #define BOOST_SIGNALS2_SHARED_CONNECTION_BLOCK_HPP -#include +#include #include #include @@ -31,7 +31,7 @@ namespace boost void block() { if(blocking()) return; - boost::std::shared_ptr connection_body(_weak_connection_body.lock()); + boost::shared_ptr connection_body(_weak_connection_body.lock()); if(connection_body == 0) { // Make _blocker non-empty so the blocking() method still returns the correct value @@ -47,7 +47,7 @@ namespace boost } bool blocking() const { - std::shared_ptr empty; + shared_ptr empty; return _blocker < empty || empty < _blocker; } signals2::connection connection() const @@ -56,7 +56,7 @@ namespace boost } private: boost::weak_ptr _weak_connection_body; - std::shared_ptr _blocker; + shared_ptr _blocker; }; } } // end namespace boost diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/signal.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/signal.hpp index f82d541b..4300eeea 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/signal.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/signal.hpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/signal_base.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/signal_base.hpp index 31edf33d..05b6b5fd 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/signal_base.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/signal_base.hpp @@ -12,7 +12,7 @@ #define BOOST_SIGNALS2_SIGNAL_BASE_HPP #include -#include +#include namespace boost { namespace signals2 { @@ -25,7 +25,7 @@ namespace boost { virtual ~signal_base() {} protected: - virtual std::shared_ptr lock_pimpl() const = 0; + virtual shared_ptr lock_pimpl() const = 0; }; } // end namespace signals2 } // end namespace boost diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/slot_base.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/slot_base.hpp index fabc1403..f7f6d39f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/slot_base.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/slot_base.hpp @@ -13,7 +13,7 @@ #define BOOST_SIGNALS2_SLOT_BASE_HPP #include -#include +#include #include #include #include @@ -32,7 +32,7 @@ namespace boost class tracked_objects_visitor; typedef boost::variant, detail::foreign_void_weak_ptr > void_weak_ptr_variant; - typedef boost::variant, detail::foreign_void_shared_ptr > void_shared_ptr_variant; + typedef boost::variant, detail::foreign_void_shared_ptr > void_shared_ptr_variant; class lock_weak_ptr_visitor { public: diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/trackable.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/trackable.hpp index 1438a0c1..d6a60149 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/trackable.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/signals2/trackable.hpp @@ -17,7 +17,7 @@ #define BOOST_SIGNALS2_TRACKABLE_HPP #include -#include +#include namespace boost { namespace signals2 { @@ -36,12 +36,12 @@ namespace boost { ~trackable() {} private: friend class detail::tracked_objects_visitor; - const std::shared_ptr& get_shared_ptr() const + const shared_ptr& get_shared_ptr() const { return _tracked_ptr; } - std::shared_ptr _tracked_ptr; + shared_ptr _tracked_ptr; }; } // end namespace signals2 } // end namespace boost diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr.hpp index ec6d2813..b5e569d8 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr.hpp @@ -18,7 +18,7 @@ #include #include -#include +#include #include #if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/allocate_shared_array.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/allocate_shared_array.hpp index d5be0454..3ee16552 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/allocate_shared_array.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/allocate_shared_array.hpp @@ -9,7 +9,7 @@ #ifndef BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP #define BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP -#include +#include #include #include #include @@ -29,12 +29,12 @@ namespace boost { std::size_t n1 = size * boost::detail::array_total::size; boost::detail::allocate_array_helper a1(allocator, n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template @@ -47,12 +47,12 @@ namespace boost { std::size_t n1 = size * boost::detail::array_total::size; boost::detail::allocate_array_helper a1(allocator, n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2, boost::detail::sp_forward(args)...); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_size_array::type @@ -66,12 +66,12 @@ namespace boost { T2* p2 = 0; boost::detail::allocate_array_helper a1(allocator, &p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2, boost::detail::sp_forward(args)...); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #endif #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) @@ -89,13 +89,13 @@ namespace boost { T3* p3 = 0; boost::detail::allocate_array_helper a1(allocator, &p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init_list(p2, p3); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_array::type @@ -113,13 +113,13 @@ namespace boost { std::size_t n1 = M * size; boost::detail::allocate_array_helper a1(allocator, n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->template init_list(p2, p3); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_size_array::type @@ -137,13 +137,13 @@ namespace boost { T3* p3 = 0; boost::detail::allocate_array_helper a1(allocator, &p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->template init_list(p2, p3); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) template @@ -159,13 +159,13 @@ namespace boost { std::size_t n1 = list.size() * boost::detail::array_total::size; boost::detail::allocate_array_helper a1(allocator, n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p3 = reinterpret_cast(list.begin()); p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init_list(p2, p3); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #endif #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) @@ -180,12 +180,12 @@ namespace boost { std::size_t n1 = size * boost::detail::array_total::size; boost::detail::allocate_array_helper a1(allocator, n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2, boost::detail::sp_forward(value)); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_size_array::type @@ -200,12 +200,12 @@ namespace boost { T2* p2 = 0; boost::detail::allocate_array_helper a1(allocator, &p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2, boost::detail::sp_forward(value)); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #endif #endif @@ -219,12 +219,12 @@ namespace boost { std::size_t n1 = size * boost::detail::array_total::size; boost::detail::allocate_array_helper a1(allocator, n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->noinit(p2); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_size_array::type @@ -238,12 +238,12 @@ namespace boost { T2* p2 = 0; boost::detail::allocate_array_helper a1(allocator, &p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->noinit(p2); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/shared_ptr_nmt.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/shared_ptr_nmt.hpp index bb3d739c..afc1ec03 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/shared_ptr_nmt.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/shared_ptr_nmt.hpp @@ -2,7 +2,7 @@ #define BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED // -// detail/shared_ptr_nmt.hpp - std::shared_ptr.hpp without member templates +// detail/shared_ptr_nmt.hpp - shared_ptr.hpp without member templates // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001, 2002 Peter Dimov @@ -11,7 +11,7 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // -// See http://www.boost.org/libs/smart_ptr/std::shared_ptr.htm for documentation. +// See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation. // #include @@ -30,7 +30,7 @@ namespace boost { -template class std::shared_ptr +template class shared_ptr { private: @@ -41,7 +41,7 @@ public: typedef T element_type; typedef T value_type; - explicit std::shared_ptr(T * p = 0): px(p) + explicit shared_ptr(T * p = 0): px(p) { #ifndef BOOST_NO_EXCEPTIONS @@ -68,7 +68,7 @@ public: #endif } - ~std::shared_ptr() + ~shared_ptr() { if(--*pn == 0) { @@ -77,29 +77,29 @@ public: } } - std::shared_ptr(std::shared_ptr const & r): px(r.px) // never throws + shared_ptr(shared_ptr const & r): px(r.px) // never throws { pn = r.pn; ++*pn; } - std::shared_ptr & operator=(std::shared_ptr const & r) + shared_ptr & operator=(shared_ptr const & r) { - std::shared_ptr(r).swap(*this); + shared_ptr(r).swap(*this); return *this; } #ifndef BOOST_NO_AUTO_PTR - explicit std::shared_ptr(std::auto_ptr & r) - { + explicit shared_ptr(std::auto_ptr & r) + { pn = new count_type(1); // may throw px = r.release(); // fix: moved here to stop leak if new throws - } + } - std::shared_ptr & operator=(std::auto_ptr & r) + shared_ptr & operator=(std::auto_ptr & r) { - std::shared_ptr(r).swap(*this); + shared_ptr(r).swap(*this); return *this; } @@ -108,7 +108,7 @@ public: void reset(T * p = 0) { BOOST_ASSERT(p == 0 || p != px); - std::shared_ptr(p).swap(*this); + shared_ptr(p).swap(*this); } T & operator*() const // never throws @@ -137,8 +137,8 @@ public: { return *pn == 1; } - - void swap(std::shared_ptr & other) // never throws + + void swap(shared_ptr & other) // never throws { std::swap(px, other.px); std::swap(pn, other.pn); @@ -150,29 +150,29 @@ private: count_type * pn; // ptr to reference counter }; -template inline bool operator==(std::shared_ptr const & a, std::shared_ptr const & b) +template inline bool operator==(shared_ptr const & a, shared_ptr const & b) { return a.get() == b.get(); } -template inline bool operator!=(std::shared_ptr const & a, std::shared_ptr const & b) +template inline bool operator!=(shared_ptr const & a, shared_ptr const & b) { return a.get() != b.get(); } -template inline bool operator<(std::shared_ptr const & a, std::shared_ptr const & b) +template inline bool operator<(shared_ptr const & a, shared_ptr const & b) { return std::less()(a.get(), b.get()); } -template void swap(std::shared_ptr & a, std::shared_ptr & b) +template void swap(shared_ptr & a, shared_ptr & b) { a.swap(b); } -// get_pointer() enables boost::mem_fn to recognize std::shared_ptr +// get_pointer() enables boost::mem_fn to recognize shared_ptr -template inline T * get_pointer(std::shared_ptr const & p) +template inline T * get_pointer(shared_ptr const & p) { return p.get(); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/sp_if_array.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/sp_if_array.hpp index a364cb55..661e1785 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/sp_if_array.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/sp_if_array.hpp @@ -1,29 +1,29 @@ /* - * Copyright (c) 2012 Glen Joseph Fernandes + * Copyright (c) 2012 Glen Joseph Fernandes * glenfe at live dot com * - * Distributed under the Boost Software License, - * Version 1.0. (See accompanying file LICENSE_1_0.txt + * Distributed under the Boost Software License, + * Version 1.0. (See accompanying file LICENSE_1_0.txt * or copy at http://boost.org/LICENSE_1_0.txt) */ #ifndef BOOST_SMART_PTR_DETAIL_SP_IF_ARRAY_HPP #define BOOST_SMART_PTR_DETAIL_SP_IF_ARRAY_HPP -#include +#include namespace boost { namespace detail { - template + template struct sp_if_array; template struct sp_if_array { - typedef boost::std::shared_ptr type; + typedef boost::shared_ptr type; }; template struct sp_if_size_array; template struct sp_if_size_array { - typedef boost::std::shared_ptr type; + typedef boost::shared_ptr type; }; } } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/spinlock_pool.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/spinlock_pool.hpp index 5d3e9e6a..f09d5c64 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/spinlock_pool.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/detail/spinlock_pool.hpp @@ -17,8 +17,8 @@ // http://www.boost.org/LICENSE_1_0.txt) // // spinlock_pool<0> is reserved for atomic<>, when/if it arrives -// spinlock_pool<1> is reserved for std::shared_ptr reference counts -// spinlock_pool<2> is reserved for std::shared_ptr atomic access +// spinlock_pool<1> is reserved for shared_ptr reference counts +// spinlock_pool<2> is reserved for shared_ptr atomic access // #include @@ -41,11 +41,11 @@ public: static spinlock & spinlock_for( void const * pv ) { -#if defined(__VMS) && __INITIAL_POINTER_SIZE == 64 +#if defined(__VMS) && __INITIAL_POINTER_SIZE == 64 std::size_t i = reinterpret_cast< unsigned long long >( pv ) % 41; -#else +#else std::size_t i = reinterpret_cast< std::size_t >( pv ) % 41; -#endif +#endif return pool_[ i ]; } @@ -74,14 +74,14 @@ public: template< int I > spinlock spinlock_pool< I >::pool_[ 41 ] = { - BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, - BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, - BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, - BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, - BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, - BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, - BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, - BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, + BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, + BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, + BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, + BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, + BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, + BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, + BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, + BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/enable_shared_from_raw.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/enable_shared_from_raw.hpp index 2ebd0466..f659c046 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/enable_shared_from_raw.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/enable_shared_from_raw.hpp @@ -13,19 +13,19 @@ // #include -#include +#include #include #include #include namespace boost { -template boost::std::shared_ptr shared_from_raw(T *); +template boost::shared_ptr shared_from_raw(T *); template boost::weak_ptr weak_from_raw(T *); namespace detail { -template< class X, class Y > inline void sp_enable_shared_from_this( boost::std::shared_ptr * ppx, Y const * py, boost::enable_shared_from_raw const * pe ); +template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr * ppx, Y const * py, boost::enable_shared_from_raw const * pe ); } // namespace detail @@ -48,7 +48,7 @@ protected: ~enable_shared_from_raw() { - BOOST_ASSERT( shared_this_.use_count() <= 1 ); // make sure no dangling std::shared_ptr objects exist + BOOST_ASSERT( shared_this_.use_count() <= 1 ); // make sure no dangling shared_ptr objects exist } private: @@ -66,26 +66,26 @@ private: public: #else private: - template friend class std::shared_ptr; - template friend boost::std::shared_ptr shared_from_raw(T *); + template friend class shared_ptr; + template friend boost::shared_ptr shared_from_raw(T *); template friend boost::weak_ptr weak_from_raw(T *); - template< class X, class Y > friend inline void detail::sp_enable_shared_from_this( boost::std::shared_ptr * ppx, Y const * py, boost::enable_shared_from_raw const * pe ); + template< class X, class Y > friend inline void detail::sp_enable_shared_from_this( boost::shared_ptr * ppx, Y const * py, boost::enable_shared_from_raw const * pe ); #endif - std::shared_ptr shared_from_this() + shared_ptr shared_from_this() { init_weak_once(); - return std::shared_ptr( weak_this_ ); + return shared_ptr( weak_this_ ); } - std::shared_ptr shared_from_this() const + shared_ptr shared_from_this() const { init_weak_once(); - return std::shared_ptr( weak_this_ ); + return shared_ptr( weak_this_ ); } - // Note: invoked automatically by std::shared_ptr; do not call - template void _internal_accept_owner( std::shared_ptr * ppx, Y * py ) const + // Note: invoked automatically by shared_ptr; do not call + template void _internal_accept_owner( shared_ptr * ppx, Y * py ) const { BOOST_ASSERT( ppx != 0 ); @@ -109,14 +109,14 @@ private: mutable weak_ptr weak_this_; private: - mutable std::shared_ptr shared_this_; + mutable shared_ptr shared_this_; }; template -boost::std::shared_ptr shared_from_raw(T *p) +boost::shared_ptr shared_from_raw(T *p) { BOOST_ASSERT(p != 0); - return boost::std::shared_ptr(p->enable_shared_from_raw::shared_from_this(), p); + return boost::shared_ptr(p->enable_shared_from_raw::shared_from_this(), p); } template @@ -130,7 +130,7 @@ boost::weak_ptr weak_from_raw(T *p) namespace detail { - template< class X, class Y > inline void sp_enable_shared_from_this( boost::std::shared_ptr * ppx, Y const * py, boost::enable_shared_from_raw const * pe ) + template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr * ppx, Y const * py, boost::enable_shared_from_raw const * pe ) { if( pe != 0 ) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/enable_shared_from_this.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/enable_shared_from_this.hpp index e0eddd0d..3230f025 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/enable_shared_from_this.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/enable_shared_from_this.hpp @@ -14,7 +14,7 @@ // #include -#include +#include #include #include @@ -44,28 +44,28 @@ protected: public: - std::shared_ptr shared_from_this() + shared_ptr shared_from_this() { - std::shared_ptr p( weak_this_ ); + shared_ptr p( weak_this_ ); BOOST_ASSERT( p.get() == this ); return p; } - std::shared_ptr shared_from_this() const + shared_ptr shared_from_this() const { - std::shared_ptr p( weak_this_ ); + shared_ptr p( weak_this_ ); BOOST_ASSERT( p.get() == this ); return p; } public: // actually private, but avoids compiler template friendship issues - // Note: invoked automatically by std::shared_ptr; do not call - template void _internal_accept_owner( std::shared_ptr const * ppx, Y * py ) const + // Note: invoked automatically by shared_ptr; do not call + template void _internal_accept_owner( shared_ptr const * ppx, Y * py ) const { if( weak_this_.expired() ) { - weak_this_ = std::shared_ptr( *ppx, py ); + weak_this_ = shared_ptr( *ppx, py ); } } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/make_shared_array.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/make_shared_array.hpp index b8abaf55..eb0578d9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/make_shared_array.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/make_shared_array.hpp @@ -9,7 +9,7 @@ #ifndef BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP #define BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP -#include +#include #include #include #include @@ -29,12 +29,12 @@ namespace boost { std::size_t n1 = size * boost::detail::array_total::size; boost::detail::make_array_helper a1(n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template @@ -47,12 +47,12 @@ namespace boost { std::size_t n1 = size * boost::detail::array_total::size; boost::detail::make_array_helper a1(n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2, boost::detail::sp_forward(args)...); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_size_array::type @@ -66,12 +66,12 @@ namespace boost { T2* p2 = 0; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2, boost::detail::sp_forward(args)...); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #endif #if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) @@ -89,13 +89,13 @@ namespace boost { T3* p3 = 0; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init_list(p2, p3); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_array::type @@ -113,13 +113,13 @@ namespace boost { std::size_t n1 = M * size; boost::detail::make_array_helper a1(n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->template init_list(p2, p3); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_size_array::type @@ -136,13 +136,13 @@ namespace boost { T3* p3 = 0; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p3 = reinterpret_cast(list); p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->template init_list(p2, p3); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) template @@ -157,13 +157,13 @@ namespace boost { std::size_t n1 = list.size() * boost::detail::array_total::size; boost::detail::make_array_helper a1(n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p3 = reinterpret_cast(list.begin()); p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init_list(p2, p3); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #endif #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) @@ -178,12 +178,12 @@ namespace boost { std::size_t n1 = size * boost::detail::array_total::size; boost::detail::make_array_helper a1(n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2, boost::detail::sp_forward(value)); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_size_array::type @@ -197,12 +197,12 @@ namespace boost { T2* p2 = 0; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->init(p2, boost::detail::sp_forward(value)); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } #endif #endif @@ -216,12 +216,12 @@ namespace boost { std::size_t n1 = size * boost::detail::array_total::size; boost::detail::make_array_helper a1(n1, &p2); boost::detail::array_deleter d1(n1); - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->noinit(p2); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } template inline typename boost::detail::sp_if_size_array::type @@ -235,12 +235,12 @@ namespace boost { T2* p2 = 0; boost::detail::make_array_helper a1(&p2); boost::detail::array_deleter d1; - boost::std::shared_ptr s1(p1, d1, a1); + boost::shared_ptr s1(p1, d1, a1); typedef boost::detail::array_deleter* D2; p1 = reinterpret_cast(p2); D2 d2 = static_cast(s1._internal_get_untyped_deleter()); d2->noinit(p2); - return boost::std::shared_ptr(s1, p1); + return boost::shared_ptr(s1, p1); } } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/make_shared_object.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/make_shared_object.hpp index 3b4bb108..89a71168 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/make_shared_object.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/make_shared_object.hpp @@ -13,7 +13,7 @@ // for documentation. #include -#include +#include #include #include #include @@ -100,7 +100,7 @@ public: template< class T > struct sp_if_not_array { - typedef boost::std::shared_ptr< T > type; + typedef boost::shared_ptr< T > type; }; #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) @@ -133,7 +133,7 @@ template< class T, std::size_t N > struct sp_if_not_array< T[N] > template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared() { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -145,12 +145,12 @@ template< class T > typename boost::detail::sp_if_not_array< T >::type make_shar T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit() { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -162,12 +162,12 @@ template< class T > typename boost::detail::sp_if_not_array< T >::type make_shar T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -179,12 +179,12 @@ template< class T, class A > typename boost::detail::sp_if_not_array< T >::type T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -196,7 +196,7 @@ template< class T, class A > typename boost::detail::sp_if_not_array< T >::type T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } #if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) @@ -205,7 +205,7 @@ template< class T, class A > typename boost::detail::sp_if_not_array< T >::type template< class T, class Arg1, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Arg1 && arg1, Args && ... args ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -217,12 +217,12 @@ template< class T, class Arg1, class... Args > typename boost::detail::sp_if_not T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class Arg1, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Arg1 && arg1, Args && ... args ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -234,7 +234,7 @@ template< class T, class A, class Arg1, class... Args > typename boost::detail:: T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } #elif !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) @@ -244,7 +244,7 @@ template< class T, class A, class Arg1, class... Args > typename boost::detail:: template< class T, class A1 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -259,19 +259,19 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 ) T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( + ::new( pv ) T( boost::detail::sp_forward( a1 ) ); @@ -280,20 +280,20 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); ::new( pv ) T( - boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ) ); @@ -302,20 +302,20 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( - boost::detail::sp_forward( a1 ), + ::new( pv ) T( + boost::detail::sp_forward( a1 ), boost::detail::sp_forward( a2 ) ); @@ -324,21 +324,21 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ) ); @@ -347,21 +347,21 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), + ::new( pv ) T( + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), boost::detail::sp_forward( a3 ) ); @@ -370,22 +370,22 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ) ); @@ -394,22 +394,22 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), + ::new( pv ) T( + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), boost::detail::sp_forward( a4 ) ); @@ -418,23 +418,23 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ) ); @@ -443,23 +443,23 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), + ::new( pv ) T( + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), boost::detail::sp_forward( a5 ) ); @@ -468,24 +468,24 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), - boost::detail::sp_forward( a5 ), + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ) ); @@ -494,24 +494,24 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), - boost::detail::sp_forward( a5 ), + ::new( pv ) T( + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a5 ), boost::detail::sp_forward( a6 ) ); @@ -520,25 +520,25 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), - boost::detail::sp_forward( a5 ), - boost::detail::sp_forward( a6 ), + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a5 ), + boost::detail::sp_forward( a6 ), boost::detail::sp_forward( a7 ) ); @@ -547,25 +547,25 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), - boost::detail::sp_forward( a5 ), - boost::detail::sp_forward( a6 ), + ::new( pv ) T( + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a5 ), + boost::detail::sp_forward( a6 ), boost::detail::sp_forward( a7 ) ); @@ -574,26 +574,26 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), - boost::detail::sp_forward( a5 ), - boost::detail::sp_forward( a6 ), - boost::detail::sp_forward( a7 ), + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a5 ), + boost::detail::sp_forward( a6 ), + boost::detail::sp_forward( a7 ), boost::detail::sp_forward( a8 ) ); @@ -602,26 +602,26 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), - boost::detail::sp_forward( a5 ), - boost::detail::sp_forward( a6 ), - boost::detail::sp_forward( a7 ), + ::new( pv ) T( + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a5 ), + boost::detail::sp_forward( a6 ), + boost::detail::sp_forward( a7 ), boost::detail::sp_forward( a8 ) ); @@ -630,27 +630,27 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), - boost::detail::sp_forward( a5 ), - boost::detail::sp_forward( a6 ), - boost::detail::sp_forward( a7 ), - boost::detail::sp_forward( a8 ), + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a5 ), + boost::detail::sp_forward( a6 ), + boost::detail::sp_forward( a7 ), + boost::detail::sp_forward( a8 ), boost::detail::sp_forward( a9 ) ); @@ -659,27 +659,27 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); void * pv = pd->address(); - ::new( pv ) T( - boost::detail::sp_forward( a1 ), - boost::detail::sp_forward( a2 ), - boost::detail::sp_forward( a3 ), - boost::detail::sp_forward( a4 ), - boost::detail::sp_forward( a5 ), - boost::detail::sp_forward( a6 ), - boost::detail::sp_forward( a7 ), - boost::detail::sp_forward( a8 ), + ::new( pv ) T( + boost::detail::sp_forward( a1 ), + boost::detail::sp_forward( a2 ), + boost::detail::sp_forward( a3 ), + boost::detail::sp_forward( a4 ), + boost::detail::sp_forward( a5 ), + boost::detail::sp_forward( a6 ), + boost::detail::sp_forward( a7 ), + boost::detail::sp_forward( a8 ), boost::detail::sp_forward( a9 ) ); @@ -688,7 +688,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } #else @@ -698,7 +698,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, template< class T, class A1 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -710,13 +710,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 ) T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -728,13 +728,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -746,13 +746,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -764,13 +764,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -782,13 +782,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -800,13 +800,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -818,13 +818,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -836,13 +836,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -854,13 +854,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -872,13 +872,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -890,13 +890,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -908,13 +908,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -926,13 +926,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -944,13 +944,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -962,13 +962,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -980,13 +980,13 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -998,13 +998,13 @@ typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 ) { - boost::std::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); + boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); boost::detail::sp_ms_deleter< T > * pd = static_cast *>( pt._internal_get_untyped_deleter() ); @@ -1016,7 +1016,7 @@ typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, T * pt2 = static_cast< T* >( pv ); boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 ); - return boost::std::shared_ptr< T >( pt, pt2 ); + return boost::shared_ptr< T >( pt, pt2 ); } #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/owner_less.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/owner_less.hpp index f621533d..6899325b 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/owner_less.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/owner_less.hpp @@ -17,7 +17,7 @@ namespace boost { - template class std::shared_ptr; + template class shared_ptr; template class weak_ptr; namespace detail @@ -43,13 +43,13 @@ namespace boost template struct owner_less; template - struct owner_less >: - public detail::generic_owner_less, weak_ptr > + struct owner_less >: + public detail::generic_owner_less, weak_ptr > {}; template struct owner_less >: - public detail::generic_owner_less, std::shared_ptr > + public detail::generic_owner_less, shared_ptr > {}; } // namespace boost diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/scoped_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/scoped_ptr.hpp index 162395db..be6722d5 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/scoped_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/scoped_ptr.hpp @@ -36,7 +36,7 @@ void sp_scalar_destructor_hook(void * p); // scoped_ptr mimics a built-in pointer except that it guarantees deletion // of the object pointed to, either on destruction of the scoped_ptr or via // an explicit reset(). scoped_ptr is a simple solution for simple needs; -// use std::shared_ptr or std::auto_ptr if your needs are more complex. +// use shared_ptr or std::auto_ptr if your needs are more complex. template class scoped_ptr // noncopyable { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/shared_array.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/shared_array.hpp index bf55aa65..73a07ae1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/shared_array.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/shared_array.hpp @@ -25,7 +25,7 @@ #include #include -#include +#include #include #include #include @@ -40,7 +40,7 @@ namespace boost // // shared_array // -// shared_array extends std::shared_ptr to arrays. +// shared_array extends shared_ptr to arrays. // The array pointed to is deleted when the last shared_array pointing to it // is destroyed or reset. // @@ -195,7 +195,7 @@ public: BOOST_ASSERT(i >= 0); return px[i]; } - + T * get() const BOOST_NOEXCEPT { return px; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/shared_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/shared_ptr.hpp index ea010b16..2f0ce7bc 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/shared_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/shared_ptr.hpp @@ -2,7 +2,7 @@ #define BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED // -// std::shared_ptr.hpp +// shared_ptr.hpp // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // Copyright (c) 2001-2008 Peter Dimov @@ -11,7 +11,7 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // -// See http://www.boost.org/libs/smart_ptr/std::shared_ptr.htm for documentation. +// See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation. // #include // for broken compiler workarounds @@ -22,7 +22,7 @@ // In order to avoid circular dependencies with Boost.TR1 // we make sure that our include of doesn't try to -// pull in the TR1 headers: that's why we use this header +// pull in the TR1 headers: that's why we use this header // rather than including directly: #include // std::auto_ptr @@ -55,7 +55,7 @@ namespace boost { -template class std::shared_ptr; +template class shared_ptr; template class weak_ptr; template class enable_shared_from_this; class enable_shared_from_raw; @@ -205,7 +205,7 @@ template< class T, std::size_t N > struct sp_extent< T[N] > // enable_shared_from_this support -template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::std::shared_ptr const * ppx, Y const * py, boost::enable_shared_from_this< T > const * pe ) +template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr const * ppx, Y const * py, boost::enable_shared_from_this< T > const * pe ) { if( pe != 0 ) { @@ -213,7 +213,7 @@ template< class X, class Y, class T > inline void sp_enable_shared_from_this( bo } } -template< class X, class Y > inline void sp_enable_shared_from_this( boost::std::shared_ptr * ppx, Y const * py, boost::enable_shared_from_raw const * pe ); +template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr * ppx, Y const * py, boost::enable_shared_from_raw const * pe ); #ifdef _MANAGED @@ -247,7 +247,7 @@ template< class T, class R > struct sp_enable_if_auto_ptr template< class T, class R > struct sp_enable_if_auto_ptr< std::auto_ptr< T >, R > { typedef R type; -}; +}; #endif @@ -271,7 +271,7 @@ template< class Y, class T > inline void sp_assert_convertible() // pointer constructor helper -template< class T, class Y > inline void sp_pointer_construct( boost::std::shared_ptr< T > * ppx, Y * p, boost::detail::shared_count & pn ) +template< class T, class Y > inline void sp_pointer_construct( boost::shared_ptr< T > * ppx, Y * p, boost::detail::shared_count & pn ) { boost::detail::shared_count( p ).swap( pn ); boost::detail::sp_enable_shared_from_this( ppx, p, p ); @@ -279,13 +279,13 @@ template< class T, class Y > inline void sp_pointer_construct( boost::std::share #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) -template< class T, class Y > inline void sp_pointer_construct( boost::std::shared_ptr< T[] > * /*ppx*/, Y * p, boost::detail::shared_count & pn ) +template< class T, class Y > inline void sp_pointer_construct( boost::shared_ptr< T[] > * /*ppx*/, Y * p, boost::detail::shared_count & pn ) { sp_assert_convertible< Y[], T[] >(); boost::detail::shared_count( p, boost::checked_array_deleter< T >() ).swap( pn ); } -template< class T, std::size_t N, class Y > inline void sp_pointer_construct( boost::std::shared_ptr< T[N] > * /*ppx*/, Y * p, boost::detail::shared_count & pn ) +template< class T, std::size_t N, class Y > inline void sp_pointer_construct( boost::shared_ptr< T[N] > * /*ppx*/, Y * p, boost::detail::shared_count & pn ) { sp_assert_convertible< Y[N], T[N] >(); boost::detail::shared_count( p, boost::checked_array_deleter< T >() ).swap( pn ); @@ -295,19 +295,19 @@ template< class T, std::size_t N, class Y > inline void sp_pointer_construct( bo // deleter constructor helper -template< class T, class Y > inline void sp_deleter_construct( boost::std::shared_ptr< T > * ppx, Y * p ) +template< class T, class Y > inline void sp_deleter_construct( boost::shared_ptr< T > * ppx, Y * p ) { boost::detail::sp_enable_shared_from_this( ppx, p, p ); } #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) -template< class T, class Y > inline void sp_deleter_construct( boost::std::shared_ptr< T[] > * /*ppx*/, Y * /*p*/ ) +template< class T, class Y > inline void sp_deleter_construct( boost::shared_ptr< T[] > * /*ppx*/, Y * /*p*/ ) { sp_assert_convertible< Y[], T[] >(); } -template< class T, std::size_t N, class Y > inline void sp_deleter_construct( boost::std::shared_ptr< T[N] > * /*ppx*/, Y * /*p*/ ) +template< class T, std::size_t N, class Y > inline void sp_deleter_construct( boost::shared_ptr< T[N] > * /*ppx*/, Y * /*p*/ ) { sp_assert_convertible< Y[N], T[N] >(); } @@ -318,38 +318,38 @@ template< class T, std::size_t N, class Y > inline void sp_deleter_construct( bo // -// std::shared_ptr +// shared_ptr // // An enhanced relative of scoped_ptr with reference counted copy semantics. -// The object pointed to is deleted when the last std::shared_ptr pointing to it +// The object pointed to is deleted when the last shared_ptr pointing to it // is destroyed or reset. // -template class std::shared_ptr +template class shared_ptr { private: // Borland 5.5.1 specific workaround - typedef std::shared_ptr this_type; + typedef shared_ptr this_type; public: typedef typename boost::detail::sp_element< T >::type element_type; - std::shared_ptr() BOOST_NOEXCEPT : px( 0 ), pn() // never throws in 1.30+ + shared_ptr() BOOST_NOEXCEPT : px( 0 ), pn() // never throws in 1.30+ { } #if !defined( BOOST_NO_CXX11_NULLPTR ) - std::shared_ptr( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT : px( 0 ), pn() // never throws + shared_ptr( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT : px( 0 ), pn() // never throws { } #endif template - explicit std::shared_ptr( Y * p ): px( p ), pn() // Y must be complete + explicit shared_ptr( Y * p ): px( p ), pn() // Y must be complete { boost::detail::sp_pointer_construct( this, p, pn ); } @@ -357,17 +357,17 @@ public: // // Requirements: D's copy constructor must not throw // - // std::shared_ptr will release p by calling d(p) + // shared_ptr will release p by calling d(p) // - template std::shared_ptr( Y * p, D d ): px( p ), pn( p, d ) + template shared_ptr( Y * p, D d ): px( p ), pn( p, d ) { boost::detail::sp_deleter_construct( this, p ); } #if !defined( BOOST_NO_CXX11_NULLPTR ) - template std::shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), pn( p, d ) + template shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), pn( p, d ) { } @@ -375,14 +375,14 @@ public: // As above, but with allocator. A's copy constructor shall not throw. - template std::shared_ptr( Y * p, D d, A a ): px( p ), pn( p, d, a ) + template shared_ptr( Y * p, D d, A a ): px( p ), pn( p, d, a ) { boost::detail::sp_deleter_construct( this, p ); } #if !defined( BOOST_NO_CXX11_NULLPTR ) - template std::shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), pn( p, d, a ) + template shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), pn( p, d, a ) { } @@ -394,14 +394,14 @@ public: // ... except in C++0x, move disables the implicit copy - std::shared_ptr( std::shared_ptr const & r ) BOOST_NOEXCEPT : px( r.px ), pn( r.pn ) + shared_ptr( shared_ptr const & r ) BOOST_NOEXCEPT : px( r.px ), pn( r.pn ) { } #endif template - explicit std::shared_ptr( weak_ptr const & r ): pn( r.pn ) // may throw + explicit shared_ptr( weak_ptr const & r ): pn( r.pn ) // may throw { boost::detail::sp_assert_convertible< Y, T >(); @@ -410,7 +410,7 @@ public: } template - std::shared_ptr( weak_ptr const & r, boost::detail::sp_nothrow_tag ) + shared_ptr( weak_ptr const & r, boost::detail::sp_nothrow_tag ) BOOST_NOEXCEPT : px( 0 ), pn( r.pn, boost::detail::sp_nothrow_tag() ) { if( !pn.empty() ) @@ -422,11 +422,11 @@ public: template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) - std::shared_ptr( std::shared_ptr const & r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) + shared_ptr( shared_ptr const & r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else - std::shared_ptr( std::shared_ptr const & r ) + shared_ptr( shared_ptr const & r ) #endif BOOST_NOEXCEPT : px( r.px ), pn( r.pn ) @@ -436,14 +436,14 @@ public: // aliasing template< class Y > - std::shared_ptr( std::shared_ptr const & r, element_type * p ) BOOST_NOEXCEPT : px( p ), pn( r.pn ) + shared_ptr( shared_ptr const & r, element_type * p ) BOOST_NOEXCEPT : px( p ), pn( r.pn ) { } #ifndef BOOST_NO_AUTO_PTR template - explicit std::shared_ptr( std::auto_ptr & r ): px(r.get()), pn() + explicit shared_ptr( std::auto_ptr & r ): px(r.get()), pn() { boost::detail::sp_assert_convertible< Y, T >(); @@ -456,7 +456,7 @@ public: #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) template - std::shared_ptr( std::auto_ptr && r ): px(r.get()), pn() + shared_ptr( std::auto_ptr && r ): px(r.get()), pn() { boost::detail::sp_assert_convertible< Y, T >(); @@ -469,7 +469,7 @@ public: #elif !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) template - explicit std::shared_ptr( Ap r, typename boost::detail::sp_enable_if_auto_ptr::type = 0 ): px( r.get() ), pn() + explicit shared_ptr( Ap r, typename boost::detail::sp_enable_if_auto_ptr::type = 0 ): px( r.get() ), pn() { typedef typename Ap::element_type Y; @@ -488,7 +488,7 @@ public: #if !defined( BOOST_NO_CXX11_SMART_PTR ) template< class Y, class D > - std::shared_ptr( std::unique_ptr< Y, D > && r ): px( r.get() ), pn() + shared_ptr( std::unique_ptr< Y, D > && r ): px( r.get() ), pn() { boost::detail::sp_assert_convertible< Y, T >(); @@ -502,7 +502,7 @@ public: // assignment - std::shared_ptr & operator=( std::shared_ptr const & r ) BOOST_NOEXCEPT + shared_ptr & operator=( shared_ptr const & r ) BOOST_NOEXCEPT { this_type(r).swap(*this); return *this; @@ -511,7 +511,7 @@ public: #if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1400) template - std::shared_ptr & operator=(std::shared_ptr const & r) BOOST_NOEXCEPT + shared_ptr & operator=(shared_ptr const & r) BOOST_NOEXCEPT { this_type(r).swap(*this); return *this; @@ -522,7 +522,7 @@ public: #ifndef BOOST_NO_AUTO_PTR template - std::shared_ptr & operator=( std::auto_ptr & r ) + shared_ptr & operator=( std::auto_ptr & r ) { this_type( r ).swap( *this ); return *this; @@ -531,7 +531,7 @@ public: #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) template - std::shared_ptr & operator=( std::auto_ptr && r ) + shared_ptr & operator=( std::auto_ptr && r ) { this_type( static_cast< std::auto_ptr && >( r ) ).swap( *this ); return *this; @@ -540,7 +540,7 @@ public: #elif !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) template - typename boost::detail::sp_enable_if_auto_ptr< Ap, std::shared_ptr & >::type operator=( Ap r ) + typename boost::detail::sp_enable_if_auto_ptr< Ap, shared_ptr & >::type operator=( Ap r ) { this_type( r ).swap( *this ); return *this; @@ -553,7 +553,7 @@ public: #if !defined( BOOST_NO_CXX11_SMART_PTR ) template - std::shared_ptr & operator=( std::unique_ptr && r ) + shared_ptr & operator=( std::unique_ptr && r ) { this_type( static_cast< std::unique_ptr && >( r ) ).swap(*this); return *this; @@ -565,7 +565,7 @@ public: #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) - std::shared_ptr( std::shared_ptr && r ) BOOST_NOEXCEPT : px( r.px ), pn() + shared_ptr( shared_ptr && r ) BOOST_NOEXCEPT : px( r.px ), pn() { pn.swap( r.pn ); r.px = 0; @@ -574,11 +574,11 @@ public: template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) - std::shared_ptr( std::shared_ptr && r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) + shared_ptr( shared_ptr && r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else - std::shared_ptr( std::shared_ptr && r ) + shared_ptr( shared_ptr && r ) #endif BOOST_NOEXCEPT : px( r.px ), pn() @@ -589,16 +589,16 @@ public: r.px = 0; } - std::shared_ptr & operator=( std::shared_ptr && r ) BOOST_NOEXCEPT + shared_ptr & operator=( shared_ptr && r ) BOOST_NOEXCEPT { - this_type( static_cast< std::shared_ptr && >( r ) ).swap( *this ); + this_type( static_cast< shared_ptr && >( r ) ).swap( *this ); return *this; } template - std::shared_ptr & operator=( std::shared_ptr && r ) BOOST_NOEXCEPT + shared_ptr & operator=( shared_ptr && r ) BOOST_NOEXCEPT { - this_type( static_cast< std::shared_ptr && >( r ) ).swap( *this ); + this_type( static_cast< shared_ptr && >( r ) ).swap( *this ); return *this; } @@ -606,7 +606,7 @@ public: #if !defined( BOOST_NO_CXX11_NULLPTR ) - std::shared_ptr & operator=( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT // never throws + shared_ptr & operator=( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT // never throws { this_type().swap(*this); return *this; @@ -635,25 +635,25 @@ public: this_type( p, d, a ).swap( *this ); } - template void reset( std::shared_ptr const & r, element_type * p ) + template void reset( shared_ptr const & r, element_type * p ) { this_type( r, p ).swap( *this ); } - + // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT) typename boost::detail::sp_dereference< T >::type operator* () const { BOOST_ASSERT( px != 0 ); return *px; } - + // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT) - typename boost::detail::sp_member_access< T >::type operator-> () const + typename boost::detail::sp_member_access< T >::type operator-> () const { BOOST_ASSERT( px != 0 ); return px; } - + // never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT) typename boost::detail::sp_array_access< T >::type operator[] ( std::ptrdiff_t i ) const { @@ -681,13 +681,13 @@ public: return pn.use_count(); } - void swap( std::shared_ptr & other ) BOOST_NOEXCEPT + void swap( shared_ptr & other ) BOOST_NOEXCEPT { std::swap(px, other.px); pn.swap(other.pn); } - template bool owner_before( std::shared_ptr const & rhs ) const BOOST_NOEXCEPT + template bool owner_before( shared_ptr const & rhs ) const BOOST_NOEXCEPT { return pn < rhs.pn; } @@ -707,7 +707,7 @@ public: return pn.get_untyped_deleter(); } - bool _internal_equiv( std::shared_ptr const & r ) const BOOST_NOEXCEPT + bool _internal_equiv( shared_ptr const & r ) const BOOST_NOEXCEPT { return px == r.px && pn == r.pn; } @@ -719,7 +719,7 @@ public: private: - template friend class std::shared_ptr; + template friend class shared_ptr; template friend class weak_ptr; @@ -728,14 +728,14 @@ private: element_type * px; // contained pointer boost::detail::shared_count pn; // reference counter -}; // std::shared_ptr +}; // shared_ptr -template inline bool operator==(std::shared_ptr const & a, std::shared_ptr const & b) BOOST_NOEXCEPT +template inline bool operator==(shared_ptr const & a, shared_ptr const & b) BOOST_NOEXCEPT { return a.get() == b.get(); } -template inline bool operator!=(std::shared_ptr const & a, std::shared_ptr const & b) BOOST_NOEXCEPT +template inline bool operator!=(shared_ptr const & a, shared_ptr const & b) BOOST_NOEXCEPT { return a.get() != b.get(); } @@ -744,7 +744,7 @@ template inline bool operator!=(std::shared_ptr const & a, // Resolve the ambiguity between our op!= and the one in rel_ops -template inline bool operator!=(std::shared_ptr const & a, std::shared_ptr const & b) BOOST_NOEXCEPT +template inline bool operator!=(shared_ptr const & a, shared_ptr const & b) BOOST_NOEXCEPT { return a.get() != b.get(); } @@ -753,81 +753,81 @@ template inline bool operator!=(std::shared_ptr const & a, std::shar #if !defined( BOOST_NO_CXX11_NULLPTR ) -template inline bool operator==( std::shared_ptr const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT +template inline bool operator==( shared_ptr const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT { return p.get() == 0; } -template inline bool operator==( boost::detail::sp_nullptr_t, std::shared_ptr const & p ) BOOST_NOEXCEPT +template inline bool operator==( boost::detail::sp_nullptr_t, shared_ptr const & p ) BOOST_NOEXCEPT { return p.get() == 0; } -template inline bool operator!=( std::shared_ptr const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT +template inline bool operator!=( shared_ptr const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT { return p.get() != 0; } -template inline bool operator!=( boost::detail::sp_nullptr_t, std::shared_ptr const & p ) BOOST_NOEXCEPT +template inline bool operator!=( boost::detail::sp_nullptr_t, shared_ptr const & p ) BOOST_NOEXCEPT { return p.get() != 0; } #endif -template inline bool operator<(std::shared_ptr const & a, std::shared_ptr const & b) BOOST_NOEXCEPT +template inline bool operator<(shared_ptr const & a, shared_ptr const & b) BOOST_NOEXCEPT { return a.owner_before( b ); } -template inline void swap(std::shared_ptr & a, std::shared_ptr & b) BOOST_NOEXCEPT +template inline void swap(shared_ptr & a, shared_ptr & b) BOOST_NOEXCEPT { a.swap(b); } -template std::shared_ptr static_pointer_cast( std::shared_ptr const & r ) BOOST_NOEXCEPT +template shared_ptr static_pointer_cast( shared_ptr const & r ) BOOST_NOEXCEPT { (void) static_cast< T* >( static_cast< U* >( 0 ) ); - typedef typename std::shared_ptr::element_type E; + typedef typename shared_ptr::element_type E; E * p = static_cast< E* >( r.get() ); - return std::shared_ptr( r, p ); + return shared_ptr( r, p ); } -template std::shared_ptr const_pointer_cast( std::shared_ptr const & r ) BOOST_NOEXCEPT +template shared_ptr const_pointer_cast( shared_ptr const & r ) BOOST_NOEXCEPT { (void) const_cast< T* >( static_cast< U* >( 0 ) ); - typedef typename std::shared_ptr::element_type E; + typedef typename shared_ptr::element_type E; E * p = const_cast< E* >( r.get() ); - return std::shared_ptr( r, p ); + return shared_ptr( r, p ); } -template std::shared_ptr dynamic_pointer_cast( std::shared_ptr const & r ) BOOST_NOEXCEPT +template shared_ptr dynamic_pointer_cast( shared_ptr const & r ) BOOST_NOEXCEPT { //(void) dynamic_cast< T* >( static_cast< U* >( 0 ) ); // // MGH - TODO - FIX - removed this check, as it was breaking the PS3 compile, and I've no idea why :-s - typedef typename std::shared_ptr::element_type E; + typedef typename shared_ptr::element_type E; E * p = dynamic_cast< E* >( r.get() ); - return p? std::shared_ptr( r, p ): std::shared_ptr(); + return p? shared_ptr( r, p ): shared_ptr(); } -template std::shared_ptr reinterpret_pointer_cast( std::shared_ptr const & r ) BOOST_NOEXCEPT +template shared_ptr reinterpret_pointer_cast( shared_ptr const & r ) BOOST_NOEXCEPT { (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) ); - typedef typename std::shared_ptr::element_type E; + typedef typename shared_ptr::element_type E; E * p = reinterpret_cast< E* >( r.get() ); - return std::shared_ptr( r, p ); + return shared_ptr( r, p ); } -// get_pointer() enables boost::mem_fn to recognize std::shared_ptr +// get_pointer() enables boost::mem_fn to recognize shared_ptr -template inline typename std::shared_ptr::element_type * get_pointer(std::shared_ptr const & p) BOOST_NOEXCEPT +template inline typename shared_ptr::element_type * get_pointer(shared_ptr const & p) BOOST_NOEXCEPT { return p.get(); } @@ -838,7 +838,7 @@ template inline typename std::shared_ptr::element_type * get_pointer #if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) && (__GNUC__ < 3) ) -template std::ostream & operator<< (std::ostream & os, std::shared_ptr const & p) +template std::ostream & operator<< (std::ostream & os, shared_ptr const & p) { os << p.get(); return os; @@ -852,9 +852,9 @@ template std::ostream & operator<< (std::ostream & os, std::shared_ptr< # if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300 && __SGI_STL_PORT) // MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL using std::basic_ostream; -template basic_ostream & operator<< (basic_ostream & os, std::shared_ptr const & p) +template basic_ostream & operator<< (basic_ostream & os, shared_ptr const & p) # else -template std::basic_ostream & operator<< (std::basic_ostream & os, std::shared_ptr const & p) +template std::basic_ostream & operator<< (std::basic_ostream & os, shared_ptr const & p) # endif { os << p.get(); @@ -879,7 +879,7 @@ namespace detail // g++ 2.9x doesn't allow static_cast(void *) // apparently EDG 2.38 and HP aCC A.03.35 also don't accept it -template D * basic_get_deleter(std::shared_ptr const & p) +template D * basic_get_deleter(shared_ptr const & p) { void const * q = p._internal_get_deleter(BOOST_SP_TYPEID(D)); return const_cast(static_cast(q)); @@ -887,7 +887,7 @@ template D * basic_get_deleter(std::shared_ptr const & p) #else -template D * basic_get_deleter( std::shared_ptr const & p ) BOOST_NOEXCEPT +template D * basic_get_deleter( shared_ptr const & p ) BOOST_NOEXCEPT { return static_cast( p._internal_get_deleter(BOOST_SP_TYPEID(D)) ); } @@ -898,7 +898,7 @@ class esft2_deleter_wrapper { private: - std::shared_ptr deleter_; + shared_ptr deleter_; public: @@ -906,7 +906,7 @@ public: { } - template< class T > void set_deleter( std::shared_ptr const & deleter ) + template< class T > void set_deleter( shared_ptr const & deleter ) { deleter_ = deleter; } @@ -925,7 +925,7 @@ public: } // namespace detail -template D * get_deleter( std::shared_ptr const & p ) BOOST_NOEXCEPT +template D * get_deleter( shared_ptr const & p ) BOOST_NOEXCEPT { D *del = boost::detail::basic_get_deleter(p); @@ -944,34 +944,34 @@ template D * get_deleter( std::shared_ptr const & p ) BOOST #if !defined(BOOST_SP_NO_ATOMIC_ACCESS) -template inline bool atomic_is_lock_free( std::shared_ptr const * /*p*/ ) BOOST_NOEXCEPT +template inline bool atomic_is_lock_free( shared_ptr const * /*p*/ ) BOOST_NOEXCEPT { return false; } -template std::shared_ptr atomic_load( std::shared_ptr const * p ) +template shared_ptr atomic_load( shared_ptr const * p ) { boost::detail::spinlock_pool<2>::scoped_lock lock( p ); return *p; } -template inline std::shared_ptr atomic_load_explicit( std::shared_ptr const * p, memory_order /*mo*/ ) +template inline shared_ptr atomic_load_explicit( shared_ptr const * p, memory_order /*mo*/ ) { return atomic_load( p ); } -template void atomic_store( std::shared_ptr * p, std::shared_ptr r ) +template void atomic_store( shared_ptr * p, shared_ptr r ) { boost::detail::spinlock_pool<2>::scoped_lock lock( p ); p->swap( r ); } -template inline void atomic_store_explicit( std::shared_ptr * p, std::shared_ptr r, memory_order /*mo*/ ) +template inline void atomic_store_explicit( shared_ptr * p, shared_ptr r, memory_order /*mo*/ ) { atomic_store( p, r ); // std::move( r ) } -template std::shared_ptr atomic_exchange( std::shared_ptr * p, std::shared_ptr r ) +template shared_ptr atomic_exchange( shared_ptr * p, shared_ptr r ) { boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p ); @@ -982,12 +982,12 @@ template std::shared_ptr atomic_exchange( std::shared_ptr * p, st return r; // return std::move( r ) } -template std::shared_ptr atomic_exchange_explicit( std::shared_ptr * p, std::shared_ptr r, memory_order /*mo*/ ) +template shared_ptr atomic_exchange_explicit( shared_ptr * p, shared_ptr r, memory_order /*mo*/ ) { return atomic_exchange( p, r ); // std::move( r ) } -template bool atomic_compare_exchange( std::shared_ptr * p, std::shared_ptr * v, std::shared_ptr w ) +template bool atomic_compare_exchange( shared_ptr * p, shared_ptr * v, shared_ptr w ) { boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p ); @@ -1003,7 +1003,7 @@ template bool atomic_compare_exchange( std::shared_ptr * p, std::sha } else { - std::shared_ptr tmp( *p ); + shared_ptr tmp( *p ); sp.unlock(); @@ -1012,7 +1012,7 @@ template bool atomic_compare_exchange( std::shared_ptr * p, std::sha } } -template inline bool atomic_compare_exchange_explicit( std::shared_ptr * p, std::shared_ptr * v, std::shared_ptr w, memory_order /*success*/, memory_order /*failure*/ ) +template inline bool atomic_compare_exchange_explicit( shared_ptr * p, shared_ptr * v, shared_ptr w, memory_order /*success*/, memory_order /*failure*/ ) { return atomic_compare_exchange( p, v, w ); // std::move( w ) } @@ -1023,7 +1023,7 @@ template inline bool atomic_compare_exchange_explicit( std::shared_ptr< template< class T > struct hash; -template< class T > std::size_t hash_value( boost::std::shared_ptr const & p ) BOOST_NOEXCEPT +template< class T > std::size_t hash_value( boost::shared_ptr const & p ) BOOST_NOEXCEPT { return boost::hash< T* >()( p.get() ); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/weak_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/weak_ptr.hpp index e30124ad..e3e9ad9b 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/weak_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/smart_ptr/weak_ptr.hpp @@ -15,7 +15,7 @@ #include // boost.TR1 include order fix #include -#include +#include namespace boost { @@ -124,11 +124,11 @@ public: template #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) - weak_ptr( std::shared_ptr const & r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) + weak_ptr( shared_ptr const & r, typename boost::detail::sp_enable_if_convertible::type = boost::detail::sp_empty() ) #else - weak_ptr( std::shared_ptr const & r ) + weak_ptr( shared_ptr const & r ) #endif BOOST_NOEXCEPT : px( r.px ), pn( r.pn ) @@ -161,7 +161,7 @@ public: #endif template - weak_ptr & operator=( std::shared_ptr const & r ) BOOST_NOEXCEPT + weak_ptr & operator=( shared_ptr const & r ) BOOST_NOEXCEPT { boost::detail::sp_assert_convertible< Y, T >(); @@ -173,9 +173,9 @@ public: #endif - std::shared_ptr lock() const BOOST_NOEXCEPT + shared_ptr lock() const BOOST_NOEXCEPT { - return std::shared_ptr( *this, boost::detail::sp_nothrow_tag() ); + return shared_ptr( *this, boost::detail::sp_nothrow_tag() ); } long use_count() const BOOST_NOEXCEPT @@ -216,7 +216,7 @@ public: return pn < rhs.pn; } - template bool owner_before( std::shared_ptr const & rhs ) const BOOST_NOEXCEPT + template bool owner_before( shared_ptr const & rhs ) const BOOST_NOEXCEPT { return pn < rhs.pn; } @@ -229,7 +229,7 @@ public: private: template friend class weak_ptr; - template friend class std::shared_ptr; + template friend class shared_ptr; #endif diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp index b3e7b91f..3b25b3d2 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/core/non_terminal/impl/grammar.ipp @@ -147,7 +147,7 @@ struct grammar_definition typedef typename grammar_definition::type definition_t; typedef grammar_helper helper_t; - typedef boost::std::shared_ptr helper_ptr_t; + typedef boost::shared_ptr helper_ptr_t; typedef boost::weak_ptr helper_weak_ptr_t; grammar_helper* diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp index b5e832b0..822180a9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/core/non_terminal/impl/object_with_id.ipp @@ -11,7 +11,7 @@ #define BOOST_SPIRIT_OBJECT_WITH_ID_IPP #include -#include +#include #ifdef BOOST_SPIRIT_THREADSAFE #include @@ -64,7 +64,7 @@ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN static void mutex_init(); #endif - boost::std::shared_ptr > id_supply; + boost::shared_ptr > id_supply; }; ////////////////////////////////// @@ -141,7 +141,7 @@ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN boost::mutex &mutex = mutex_instance(); boost::mutex::scoped_lock lock(mutex); #endif - static boost::std::shared_ptr > + static boost::shared_ptr > static_supply; if (!static_supply.get()) @@ -174,7 +174,7 @@ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN ////////////////////////////////// #ifdef BOOST_SPIRIT_THREADSAFE template - inline void + inline void object_with_id_base::mutex_init() { mutex_instance(); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/dynamic/stored_rule.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/dynamic/stored_rule.hpp index 81bafd17..5661ef88 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/dynamic/stored_rule.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/dynamic/stored_rule.hpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include @@ -27,7 +27,7 @@ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN // /////////////////////////////////////////////////////////////////////////// template < - typename T0 + typename T0 , typename T1 , typename T2 , bool EmbedByValue @@ -113,10 +113,10 @@ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN private: #endif - stored_rule(std::shared_ptr const& ptr) + stored_rule(shared_ptr const& ptr) : ptr(ptr) {} - std::shared_ptr ptr; + shared_ptr ptr; }; /////////////////////////////////////////////////////////////////////////////// diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/iterator/file_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/iterator/file_iterator.hpp index 9ee354b8..5c20f15f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/iterator/file_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/iterator/file_iterator.hpp @@ -177,7 +177,7 @@ public: inline file_iterator& operator=(const base_t& iter); file_iterator make_end(void); - // operator bool. This borrows a trick from boost::std::shared_ptr to avoid + // operator bool. This borrows a trick from boost::shared_ptr to avoid // to interfere with arithmetic operations. bool operator_bool(void) const { return this->base(); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/iterator/impl/file_iterator.ipp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/iterator/impl/file_iterator.ipp index c9f41aa1..4227b696 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/iterator/impl/file_iterator.ipp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/iterator/impl/file_iterator.ipp @@ -17,7 +17,7 @@ #endif #include -#include +#include #ifdef BOOST_SPIRIT_FILEITERATOR_WINDOWS # include @@ -48,7 +48,7 @@ namespace fileiter_impl { // the base components on which the iterator is built (through the // iterator adaptor library). // -// The opened file stream (FILE) is held with a std::shared_ptr<>, whose +// The opened file stream (FILE) is held with a shared_ptr<>, whose // custom deleter invokes fcose(). This makes the syntax of the class // very easy, especially everything related to copying. // @@ -93,7 +93,7 @@ public: } // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context - // for std::shared_ptr to evaluate correctly + // for shared_ptr to evaluate correctly operator bool() const { return m_file ? true : false; } @@ -140,7 +140,7 @@ public: } private: - boost::std::shared_ptr m_file; + boost::shared_ptr m_file; std::size_t m_pos; CharT m_curChar; bool m_eof; @@ -236,7 +236,7 @@ public: // a reference is hold by the filemap object). ::CloseHandle(hFile); - // Store the handles inside the std::shared_ptr (with the custom destructors) + // Store the handles inside the shared_ptr (with the custom destructors) m_mem.reset(static_cast(pMem), ::UnmapViewOfFile); // Start of the file @@ -256,7 +256,7 @@ public: } // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context - // for std::shared_ptr to evaluate correctly + // for shared_ptr to evaluate correctly operator bool() const { return m_mem ? true : false; } @@ -291,7 +291,7 @@ private: typedef void handle_t; #endif - boost::std::shared_ptr m_mem; + boost::shared_ptr m_mem; std::size_t m_filesize; CharT* m_curChar; }; @@ -403,7 +403,7 @@ public: } // Nasty bug in Comeau up to 4.3.0.1, we need explicit boolean context - // for std::shared_ptr to evaluate correctly + // for shared_ptr to evaluate correctly operator bool() const { return m_mem ? true : false; } @@ -432,7 +432,7 @@ public: private: - boost::std::shared_ptr m_mem; + boost::shared_ptr m_mem; CharT const* m_curChar; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/utility/chset.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/utility/chset.hpp index 62b174cb..36354564 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/utility/chset.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/utility/chset.hpp @@ -10,7 +10,7 @@ #define BOOST_SPIRIT_CHSET_HPP /////////////////////////////////////////////////////////////////////////////// -#include +#include #include #include #include @@ -26,7 +26,7 @@ namespace utility { namespace impl { // template functions. And we don't want to put the whole algorithm // in the chset constructor in the class definition. template - void construct_chset(boost::std::shared_ptr >& ptr, + void construct_chset(boost::shared_ptr >& ptr, CharT2 const* definition); }} // namespace utility::impl @@ -84,7 +84,7 @@ public: private: - boost::std::shared_ptr > ptr; + boost::shared_ptr > ptr; }; /////////////////////////////////////////////////////////////////////////////// diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/utility/impl/chset.ipp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/utility/impl/chset.ipp index a8514a3b..30170351 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/utility/impl/chset.ipp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/classic/utility/impl/chset.ipp @@ -27,16 +27,16 @@ BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN namespace utility { namespace impl { template inline void - detach(boost::std::shared_ptr >& ptr) + detach(boost::shared_ptr >& ptr) { if (!ptr.unique()) - ptr = boost::std::shared_ptr > + ptr = boost::shared_ptr > (new basic_chset(*ptr)); } template inline void - detach_clear(boost::std::shared_ptr >& ptr) + detach_clear(boost::shared_ptr >& ptr) { if (ptr.unique()) ptr->clear(); @@ -45,7 +45,7 @@ namespace utility { namespace impl { } template - void construct_chset(boost::std::shared_ptr >& ptr, + void construct_chset(boost::shared_ptr >& ptr, CharT2 const* definition) { CharT2 ch = *definition++; @@ -76,7 +76,7 @@ namespace utility { namespace impl { #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) template - void chset_negated_set(boost::std::shared_ptr > &ptr, chlit const &ch, + void chset_negated_set(boost::shared_ptr > &ptr, chlit const &ch, FakeT) { if(ch.ch != (std::numeric_limits::min)()) { @@ -86,9 +86,9 @@ namespace utility { namespace impl { ptr->set(ch.ch + 1, (std::numeric_limits::max)()); } } - + template - void chset_negated_set(boost::std::shared_ptr > &ptr, + void chset_negated_set(boost::shared_ptr > &ptr, spirit::range const &rng, FakeT) { if(rng.first != (std::numeric_limits::min)()) { @@ -255,7 +255,7 @@ inline void chset::set(negated_char_parser > const& arg_) { utility::impl::detach(ptr); - + if(arg_.positive.ch != (std::numeric_limits::min)()) { ptr->set((std::numeric_limits::min)(), arg_.positive.ch - 1); } @@ -269,7 +269,7 @@ inline void chset::set(negated_char_parser > const& arg_) { utility::impl::detach(ptr); - + if(arg_.positive.first != (std::numeric_limits::min)()) { ptr->set((std::numeric_limits::min)(), arg_.positive.first - 1); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/karma/string/symbols.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/karma/string/symbols.hpp index 550154e1..185a280a 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/karma/string/symbols.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/karma/string/symbols.hpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -451,7 +451,7 @@ namespace boost { namespace spirit { namespace karma adder add; remover remove; - std::shared_ptr lookup; + shared_ptr lookup; std::string name_; }; @@ -710,7 +710,7 @@ namespace boost { namespace spirit { namespace karma adder add; remover remove; - std::shared_ptr lookup; + shared_ptr lookup; std::string name_; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/phoenix/operator/member.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/phoenix/operator/member.hpp index df5d106c..27f3e8d1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/phoenix/operator/member.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/phoenix/operator/member.hpp @@ -2,7 +2,7 @@ Copyright (c) 2005-2007 Dan Marsden Copyright (c) 2005-2007 Joel de Guzman - Distributed under the Boost Software License, Version 1.0. (See accompanying + Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ @@ -33,8 +33,8 @@ #include -namespace boost { - template class std::shared_ptr; +namespace boost { + template class shared_ptr; template class scoped_ptr; namespace phoenix { @@ -42,7 +42,7 @@ namespace phoenix { { template struct member_type; - + template struct member_type { @@ -52,7 +52,7 @@ namespace phoenix { namespace meta { - template + template struct pointed_type; template @@ -62,11 +62,11 @@ namespace phoenix { }; template - struct pointed_type > + struct pointed_type > { typedef T type; }; - + template struct pointed_type > { @@ -116,7 +116,7 @@ namespace phoenix { member_object_eval, actor, typename as_actor::type>::type> >::type operator->*( - const actor& ptrActor, + const actor& ptrActor, MemObjPtr memObjPtr) { return compose( diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/qi/string/symbols.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/qi/string/symbols.hpp index b4f9bb1b..a9656f18 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/qi/string/symbols.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/home/qi/string/symbols.hpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include #if defined(BOOST_MSVC) # pragma warning(push) @@ -373,7 +373,7 @@ public: adder add; remover remove; - std::shared_ptr lookup; + shared_ptr lookup; std::string name_; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/repository/home/qi/operator/detail/keywords.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/repository/home/qi/operator/detail/keywords.hpp index 0beb3871..06836f77 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/repository/home/qi/operator/detail/keywords.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/spirit/repository/home/qi/operator/detail/keywords.hpp @@ -15,10 +15,10 @@ #include namespace boost { namespace spirit { namespace repository { namespace qi { namespace detail { // Variant visitor class which handles dispatching the parsing to the selected parser - // This also handles passing the correct attributes and flags/counters to the subject parsers + // This also handles passing the correct attributes and flags/counters to the subject parsers template struct is_distinct : T::distinct { }; - + template struct is_distinct< spirit::qi::action > : T::distinct { }; @@ -38,22 +38,22 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names typedef Skipper skipper_type; typedef Elements elements_type; - typedef typename add_reference::type attr_reference; + typedef typename add_reference::type attr_reference; public: parse_dispatcher(const Elements &elements,Iterator& first, Iterator const& last , Context& context, Skipper const& skipper - , Flags &flags, Counters &counters, attr_reference attr) : + , Flags &flags, Counters &counters, attr_reference attr) : elements(elements), first(first), last(last) , context(context), skipper(skipper) , flags(flags),counters(counters), attr(attr) {} - + template bool operator()(T& idx) const - { + { return call(idx,typename traits::not_is_unused::type()); } - - template + + template bool call_subject_unused( Subject const &subject, Iterator &first, Iterator const &last , Context& context, Skipper const& skipper @@ -62,25 +62,25 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names Iterator save = first; skipper_keyword_marker marked_skipper(skipper,flags[Index::value],counters[Index::value]); - + if(subject.parse(first,last,context,marked_skipper,unused)) { return true; } save = save; return false; - } - - - template + } + + + template bool call_subject( Subject const &subject, Iterator &first, Iterator const &last , Context& context, Skipper const& skipper , Index& idx ) const { - + Iterator save = first; - skipper_keyword_marker + skipper_keyword_marker marked_skipper(skipper,flags[Index::value],counters[Index::value]); if(subject.parse(first,last,context,marked_skipper,fusion::at_c(attr))) { @@ -91,8 +91,8 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names } // Handle unused attributes - template bool call(T &idx, mpl::false_) const{ - + template bool call(T &idx, mpl::false_) const{ + typedef typename mpl::at::type ElementType; if( (!is_distinct::value) @@ -114,7 +114,7 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names } return false; } - + const Elements &elements; Iterator &first; const Iterator &last; @@ -132,7 +132,7 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names typedef typename spirit::detail::as_variant< IndexList >::type parser_index_type; - + /////////////////////////////////////////////////////////////////////////// // build_char_type_sequence // @@ -351,7 +351,7 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names { typedef int result_type; - keyword_entry_adder(std::shared_ptr lookup,FlagsType &flags, Elements &elements) : + keyword_entry_adder(shared_ptr lookup,FlagsType &flags, Elements &elements) : lookup(lookup) ,flags(flags) ,elements(elements) @@ -421,7 +421,7 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names - std::shared_ptr lookup; + shared_ptr lookup; FlagsType & flags; Elements &elements; }; @@ -443,7 +443,7 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names { if(parser_index_type* val_ptr = lookup->find(first,last,first_pass_filter_type())) - { + { if(!apply_visitor(parse_visitor,*val_ptr)){ return false; } @@ -481,7 +481,7 @@ namespace boost { namespace spirit { namespace repository { namespace qi { names } return false; } - std::shared_ptr lookup; + shared_ptr lookup; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/statechart/processor_container.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/statechart/processor_container.hpp index 2b914958..797e2f8f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/statechart/processor_container.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/statechart/processor_container.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include // BOOST_INTEL @@ -65,7 +65,7 @@ class processor_container : noncopyable { typedef event_processor< Scheduler > processor_base_type; typedef std::auto_ptr< processor_base_type > processor_holder_type; - typedef std::shared_ptr< processor_holder_type > processor_holder_ptr_type; + typedef shared_ptr< processor_holder_type > processor_holder_ptr_type; public: ////////////////////////////////////////////////////////////////////////// @@ -426,8 +426,8 @@ class processor_container : noncopyable } } - typedef std::set< - processor_holder_ptr_type, + typedef std::set< + processor_holder_ptr_type, std::less< processor_holder_ptr_type >, typename boost::detail::allocator::rebind_to< Allocator, processor_holder_ptr_type >::type diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/parameterized_test.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/parameterized_test.hpp index 22b7452d..930dc81a 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/parameterized_test.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/parameterized_test.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2001-2008. // Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at +// (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -73,7 +73,7 @@ template class param_test_case_generator : public test_unit_generator { public: param_test_case_generator( callback1 const& test_func, - const_string tc_name, + const_string tc_name, ParamIter par_begin, ParamIter par_end ) : m_test_func( test_func ) @@ -110,13 +110,13 @@ struct user_param_tc_method_invoker { typedef void (UserTestCase::*test_method)( ParamType ); // Constructor - user_param_tc_method_invoker( std::shared_ptr inst, test_method test_method ) + user_param_tc_method_invoker( shared_ptr inst, test_method test_method ) : m_inst( inst ), m_test_method( test_method ) {} void operator()( ParamType p ) { ((*m_inst).*m_test_method)( p ); } // Data members - std::shared_ptr m_inst; + shared_ptr m_inst; test_method m_test_method; }; @@ -127,7 +127,7 @@ struct user_param_tc_method_invoker { template inline ut_detail::param_test_case_generator make_test_case( callback1 const& test_func, - const_string tc_name, + const_string tc_name, ParamIter par_begin, ParamIter par_end ) { @@ -140,7 +140,7 @@ template inline ut_detail::param_test_case_generator< BOOST_DEDUCED_TYPENAME remove_const::type>::type,ParamIter> make_test_case( void (*test_func)( ParamType ), - const_string tc_name, + const_string tc_name, ParamIter par_begin, ParamIter par_end ) { @@ -155,13 +155,13 @@ inline ut_detail::param_test_case_generator< BOOST_DEDUCED_TYPENAME remove_const::type>::type,ParamIter> make_test_case( void (UserTestCase::*test_method )( ParamType ), const_string tc_name, - boost::std::shared_ptr const& user_test_case, + boost::shared_ptr const& user_test_case, ParamIter par_begin, ParamIter par_end ) { typedef BOOST_DEDUCED_TYPENAME remove_const::type>::type param_value_type; - return ut_detail::param_test_case_generator( - ut_detail::user_param_tc_method_invoker( user_test_case, test_method ), + return ut_detail::param_test_case_generator( + ut_detail::user_param_tc_method_invoker( user_test_case, test_method ), tc_name, par_begin, par_end ); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/predicate_result.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/predicate_result.hpp index 773024e8..16ae4882 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/predicate_result.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/predicate_result.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2001-2008. // Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at +// (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -21,7 +21,7 @@ #include // Boost -#include +#include #include // STL @@ -46,7 +46,7 @@ class BOOST_TEST_DECL predicate_result { public: // Constructor - predicate_result( bool pv_ ) + predicate_result( bool pv_ ) : p_predicate_value( pv_ ) {} @@ -74,7 +74,7 @@ public: private: // Data members - std::shared_ptr m_message; + shared_ptr m_message; }; } // namespace test_tools diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/unit_test_suite_impl.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/unit_test_suite_impl.hpp index 478524a5..993e0560 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/unit_test_suite_impl.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/unit_test_suite_impl.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2001-2008. // Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at +// (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -25,7 +25,7 @@ #include // Boost -#include +#include #include #include #include @@ -70,7 +70,7 @@ public: // Public r/w properties readwrite_property p_name; // name for this test unit - readwrite_property p_timeout; // timeout for the test unit execution + readwrite_property p_timeout; // timeout for the test unit execution readwrite_property p_expected_failures; // number of expected failures in this test unit mutable readwrite_property p_enabled; // enabled status for this unit @@ -140,7 +140,7 @@ public: std::size_t size() const { return m_members.size(); } protected: - friend BOOST_TEST_DECL + friend BOOST_TEST_DECL void traverse_test_tree( test_suite const&, test_tree_visitor& ); friend class framework_impl; virtual ~test_suite() {} @@ -159,8 +159,8 @@ public: , argc( 0 ) , argv( 0 ) {} - - // Data members + + // Data members int argc; char** argv; }; @@ -236,12 +236,12 @@ template struct user_tc_method_invoker { typedef void (UserTestCase::*TestMethod )(); - user_tc_method_invoker( std::shared_ptr inst, TestMethod test_method ) + user_tc_method_invoker( shared_ptr inst, TestMethod test_method ) : m_inst( inst ), m_test_method( test_method ) {} void operator()() { ((*m_inst).*m_test_method)(); } - std::shared_ptr m_inst; + shared_ptr m_inst; TestMethod m_test_method; }; @@ -261,9 +261,9 @@ template inline test_case* make_test_case( void (UserTestCase::* test_method )(), const_string tc_name, - boost::std::shared_ptr user_test_case ) + boost::shared_ptr user_test_case ) { - return new test_case( ut_detail::normalize_test_case_name( tc_name ), + return new test_case( ut_detail::normalize_test_case_name( tc_name ), ut_detail::user_tc_method_invoker( user_test_case, test_method ) ); } @@ -299,10 +299,10 @@ struct auto_tc_exp_fail { instance() = this; } - static auto_tc_exp_fail*& instance() + static auto_tc_exp_fail*& instance() { - static auto_tc_exp_fail inst; - static auto_tc_exp_fail* inst_ptr = &inst; + static auto_tc_exp_fail inst; + static auto_tc_exp_fail* inst_ptr = &inst; return inst_ptr; } @@ -322,30 +322,30 @@ private: // ************** global_fixture ************** // // ************************************************************************** // -class BOOST_TEST_DECL global_fixture : public test_observer { -public: +class BOOST_TEST_DECL global_fixture : public test_observer { +public: // Constructor global_fixture(); -}; +}; //____________________________________________________________________________// namespace ut_detail { -template +template struct global_fixture_impl : public global_fixture { // Constructor global_fixture_impl(): m_fixure( 0 ) {} // test observer interface virtual void test_start( counter_t ) { m_fixure = new F; } - virtual void test_finish() { delete m_fixure; m_fixure = 0; } - virtual void test_aborted() { delete m_fixure; m_fixure = 0; } + virtual void test_finish() { delete m_fixure; m_fixure = 0; } + virtual void test_aborted() { delete m_fixure; m_fixure = 0; } private: // Data members F* m_fixure; -}; +}; // ************************************************************************** // // ************** test_case_template_invoker ************** // @@ -379,7 +379,7 @@ struct generate_test_case_4_type { full_name += " const"; full_name += '>'; - m_holder.m_test_cases.push_back( + m_holder.m_test_cases.push_back( new test_case( full_name, test_case_template_invoker() ) ); } @@ -409,7 +409,7 @@ public: { if( m_test_cases.empty() ) return 0; - + test_unit* res = m_test_cases.front(); m_test_cases.pop_front(); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/callback.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/callback.hpp index f4241225..bd7d3e12 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/callback.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/callback.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. -// Use, modification, and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// Use, modification, and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -9,7 +9,7 @@ // // Version : $Revision: 49312 $ // -// Description : +// Description : // *************************************************************************** #ifndef BOOST_TEST_CALLBACK_020505GER @@ -18,7 +18,7 @@ // Boost #include #include -#include +#include #include @@ -109,7 +109,7 @@ public: template callback0( Functor f ) : m_impl( new ut_detail::callback0_impl_t( f ) ) {} - + void operator=( callback0 const& rhs ) { m_impl = rhs.m_impl; } template @@ -121,7 +121,7 @@ public: private: // Data members - boost::std::shared_ptr > m_impl; + boost::shared_ptr > m_impl; }; // ************************************************************************** // @@ -179,7 +179,7 @@ public: private: // Data members - boost::std::shared_ptr > m_impl; + boost::shared_ptr > m_impl; }; // ************************************************************************** // @@ -236,7 +236,7 @@ public: private: // Data members - boost::std::shared_ptr > m_impl; + boost::shared_ptr > m_impl; }; // ************************************************************************** // @@ -294,7 +294,7 @@ public: private: // Data members - boost::std::shared_ptr > m_impl; + boost::shared_ptr > m_impl; }; } // namespace unit_test diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/basic_parameter.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/basic_parameter.hpp index c98027cd..e7e084cd 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/basic_parameter.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/basic_parameter.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. -// Use, modification, and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// Use, modification, and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -40,7 +40,7 @@ template class basic_parameter : private base_from_member, public typed_parameter { public: // Constructors - explicit basic_parameter( cstring n ) + explicit basic_parameter( cstring n ) : base_from_member() , typed_parameter( base_from_member::member ) { @@ -61,16 +61,16 @@ public: #define BOOST_RT_CLA_NAMED_PARAM_GENERATORS( param_type ) \ template \ -inline std::shared_ptr > \ +inline shared_ptr > \ param_type( cstring name = cstring() ) \ { \ - return std::shared_ptr >( new param_type ## _t( name ) ); \ + return shared_ptr >( new param_type ## _t( name ) ); \ } \ \ -inline std::shared_ptr > \ +inline shared_ptr > \ param_type( cstring name = cstring() ) \ { \ - return std::shared_ptr >( new param_type ## _t( name ) ); \ + return shared_ptr >( new param_type ## _t( name ) ); \ } \ /**/ diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/char_parameter.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/char_parameter.hpp index ac686e06..3e9b2d84 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/char_parameter.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/char_parameter.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. -// Use, modification, and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// Use, modification, and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -66,18 +66,18 @@ public: //____________________________________________________________________________// template -inline std::shared_ptr > +inline shared_ptr > char_parameter( char_type name ) { - return std::shared_ptr >( new char_parameter_t( name ) ); + return shared_ptr >( new char_parameter_t( name ) ); } //____________________________________________________________________________// -inline std::shared_ptr > +inline shared_ptr > char_parameter( char_type name ) { - return std::shared_ptr >( new char_parameter_t( name ) ); + return shared_ptr >( new char_parameter_t( name ) ); } //____________________________________________________________________________// diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/fwd.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/fwd.hpp index 9a351bd0..66d6efc1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/fwd.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/fwd.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. -// Use, modification, and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// Use, modification, and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -19,7 +19,7 @@ #include // Boost -#include +#include namespace boost { @@ -29,9 +29,9 @@ namespace cla { class parser; class parameter; -typedef std::shared_ptr parameter_ptr; +typedef shared_ptr parameter_ptr; class naming_policy; -typedef std::shared_ptr naming_policy_ptr; +typedef shared_ptr naming_policy_ptr; class argv_traverser; namespace rt_cla_detail { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/parameter.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/parameter.hpp index 46a6aebf..753268a9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/parameter.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/parameter.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. -// Use, modification, and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// Use, modification, and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -88,12 +88,12 @@ public: bool conflict_with( parameter const& p ) const { return (id_2_report() == p.id_2_report() && !id_2_report().is_empty()) || - m_id_policy.conflict_with( p.m_id_policy ) || + m_id_policy.conflict_with( p.m_id_policy ) || ((m_id_policy.p_type_id != p.m_id_policy.p_type_id) && p.m_id_policy.conflict_with( m_id_policy )); } cstring id_2_report() const { return m_id_policy.id_2_report(); } void usage_info( format_stream& fs ) const - { + { m_id_policy.usage_info( fs ); if( p_optional_value ) fs << BOOST_RT_PARAM_LITERAL( '[' ); @@ -131,8 +131,8 @@ private: //____________________________________________________________________________// template -inline std::shared_ptr -operator-( std::shared_ptr p, Modifier const& m ) +inline shared_ptr +operator-( shared_ptr p, Modifier const& m ) { p->accept_modifier( m ); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/parser.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/parser.hpp index a37e7877..5c3c341d 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/parser.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/cla/parser.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. -// Use, modification, and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// Use, modification, and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -52,7 +52,7 @@ public: template global_mod_parser const& - operator<<( std::shared_ptr param ) const + operator<<( shared_ptr param ) const { param->accept_modifier( m_modifiers ); @@ -103,7 +103,7 @@ public: // arguments access const_argument_ptr operator[]( cstring string_id ) const; - cstring get( cstring string_id ) const; + cstring get( cstring string_id ) const; template T const& get( cstring string_id ) const diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/file/config_file_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/file/config_file_iterator.hpp index 8cfe4880..85467f66 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/file/config_file_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/file/config_file_iterator.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. -// Use, modification, and distribution are subject to the -// Boost Software License, Version 1.0. (See accompanying file +// Use, modification, and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -26,7 +26,7 @@ #include // Boost -#include +#include namespace boost { @@ -34,7 +34,7 @@ namespace BOOST_RT_PARAM_NAMESPACE { namespace file { -// Public typedef +// Public typedef typedef std::pair location; // ************************************************************************** // @@ -154,7 +154,7 @@ private: // Data members struct Impl; - std::shared_ptr m_pimpl; + shared_ptr m_pimpl; }; } // namespace file diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/fwd.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/fwd.hpp index a4f1a77a..8d298d72 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/fwd.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/fwd.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. // Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at +// (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -19,7 +19,7 @@ #include // Boost -#include +#include namespace boost { @@ -28,8 +28,8 @@ namespace BOOST_RT_PARAM_NAMESPACE { class parameter; class argument; -typedef std::shared_ptr argument_ptr; -typedef std::shared_ptr const_argument_ptr; +typedef shared_ptr argument_ptr; +typedef shared_ptr const_argument_ptr; template class value_interpreter; template class typed_argument; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/validation.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/validation.hpp index 2a3f1d02..ff8e4691 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/validation.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/test/utils/runtime/validation.hpp @@ -1,6 +1,6 @@ // (C) Copyright Gennadiy Rozental 2005-2008. // Distributed under the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at +// (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // See http://www.boost.org/libs/test for the library home page. @@ -22,7 +22,7 @@ #include // Boost -#include +#include // STL #ifdef BOOST_RT_PARAM_EXCEPTION_INHERIT_STD @@ -37,14 +37,14 @@ namespace BOOST_RT_PARAM_NAMESPACE { // ************** runtime::logic_error ************** // // ************************************************************************** // -class logic_error +class logic_error #ifdef BOOST_RT_PARAM_EXCEPTION_INHERIT_STD : public std::exception #endif { - typedef std::shared_ptr dstring_ptr; + typedef shared_ptr dstring_ptr; public: - // Constructor // !! could we eliminate std::shared_ptr + // Constructor // !! could we eliminate shared_ptr explicit logic_error( cstring msg ) : m_msg( new dstring( msg.begin(), msg.size() ) ) {} ~logic_error() throw() {} diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/future.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/future.hpp index c818c945..de23fda4 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/future.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/future.hpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include @@ -236,9 +236,9 @@ namespace boost bool thread_was_interrupted; //#endif #if defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION - std::shared_ptr continuation_ptr; + shared_ptr continuation_ptr; #else - std::shared_ptr continuation_ptr; + shared_ptr continuation_ptr; #endif future_object_base(): done(false), @@ -998,11 +998,11 @@ namespace boost struct registered_waiter { - boost::std::shared_ptr future_; + boost::shared_ptr future_; detail::future_object_base::waiter_list::iterator wait_iterator; count_type index; - registered_waiter(boost::std::shared_ptr const& a_future, + registered_waiter(boost::shared_ptr const& a_future, detail::future_object_base::waiter_list::iterator wait_iterator_, count_type index_): future_(a_future),wait_iterator(wait_iterator_),index(index_) @@ -1236,7 +1236,7 @@ namespace boost { protected: - typedef boost::std::shared_ptr > future_ptr; + typedef boost::shared_ptr > future_ptr; future_ptr future_; @@ -1566,7 +1566,7 @@ namespace boost template class promise { - typedef boost::std::shared_ptr > future_ptr; + typedef boost::shared_ptr > future_ptr; future_ptr future_; bool future_obtained; @@ -1729,7 +1729,7 @@ namespace boost template class promise { - typedef boost::std::shared_ptr > future_ptr; + typedef boost::shared_ptr > future_ptr; future_ptr future_; bool future_obtained; @@ -1871,7 +1871,7 @@ namespace boost template <> class promise { - typedef boost::std::shared_ptr > future_ptr; + typedef boost::shared_ptr > future_ptr; future_ptr future_; bool future_obtained; @@ -1927,7 +1927,7 @@ namespace boost promise(BOOST_THREAD_RV_REF(promise) rhs) BOOST_NOEXCEPT : future_(BOOST_THREAD_RV(rhs).future_),future_obtained(BOOST_THREAD_RV(rhs).future_obtained) { - // we need to release the future as std::shared_ptr doesn't implements move semantics + // we need to release the future as shared_ptr doesn't implements move semantics BOOST_THREAD_RV(rhs).future_.reset(); BOOST_THREAD_RV(rhs).future_obtained=false; } @@ -2461,21 +2461,21 @@ namespace boost template class packaged_task { - typedef boost::std::shared_ptr > task_ptr; - boost::std::shared_ptr > task; + typedef boost::shared_ptr > task_ptr; + boost::shared_ptr > task; #else template class packaged_task { - typedef boost::std::shared_ptr > task_ptr; - boost::std::shared_ptr > task; + typedef boost::shared_ptr > task_ptr; + boost::shared_ptr > task; #endif #else template class packaged_task { - typedef boost::std::shared_ptr > task_ptr; - boost::std::shared_ptr > task; + typedef boost::shared_ptr > task_ptr; + boost::shared_ptr > task; #endif bool future_obtained; struct dummy; @@ -2806,7 +2806,7 @@ namespace boost BOOST_THREAD_FUTURE make_future_deferred_object(BOOST_THREAD_FWD_REF(Fp) f) { - std::shared_ptr > + shared_ptr > h(new future_deferred_object(boost::forward(f))); return BOOST_THREAD_FUTURE(h); } @@ -2818,7 +2818,7 @@ namespace boost BOOST_THREAD_FUTURE make_future_async_object(BOOST_THREAD_FWD_REF(Fp) f) { - std::shared_ptr > + shared_ptr > h(new future_async_object(boost::forward(f))); return BOOST_THREAD_FUTURE(h); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/pthread/thread_data.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/pthread/thread_data.hpp index 18dacc0f..5c3b4f02 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/pthread/thread_data.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/pthread/thread_data.hpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include #include @@ -87,17 +87,17 @@ namespace boost struct thread_exit_callback_node; struct tss_data_node { - boost::std::shared_ptr func; + boost::shared_ptr func; void* value; - tss_data_node(boost::std::shared_ptr func_, + tss_data_node(boost::shared_ptr func_, void* value_): func(func_),value(value_) {} }; struct thread_data_base; - typedef boost::std::shared_ptr thread_data_ptr; + typedef boost::shared_ptr thread_data_ptr; struct BOOST_THREAD_DECL thread_data_base: enable_shared_from_this @@ -121,7 +121,7 @@ namespace boost > notify_list_t; notify_list_t notify; - typedef std::vector > async_states_t; + typedef std::vector > async_states_t; async_states_t async_states_; //#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS @@ -152,7 +152,7 @@ namespace boost notify.push_back(std::pair(cv, m)); } - void make_ready_at_thread_exit(std::shared_ptr as) + void make_ready_at_thread_exit(shared_ptr as) { async_states_.push_back(as); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/tss.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/tss.hpp index e5d518fd..c920024b 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/tss.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/thread/tss.hpp @@ -6,7 +6,7 @@ // (C) Copyright 2007-8 Anthony Williams #include -#include +#include #include #include @@ -19,11 +19,11 @@ namespace boost { virtual ~tss_cleanup_function() {} - + virtual void operator()(void* data)=0; }; - - BOOST_THREAD_DECL void set_tss_data(void const* key,boost::std::shared_ptr func,void* tss_data,bool cleanup_existing); + + BOOST_THREAD_DECL void set_tss_data(void const* key,boost::shared_ptr func,void* tss_data,bool cleanup_existing); BOOST_THREAD_DECL void* get_tss_data(void const* key); } @@ -42,16 +42,16 @@ namespace boost delete static_cast(data); } }; - + struct run_custom_cleanup_function: detail::tss_cleanup_function { void (*cleanup_function)(T*); - + explicit run_custom_cleanup_function(void (*cleanup_function_)(T*)): cleanup_function(cleanup_function_) {} - + void operator()(void* data) { cleanup_function(static_cast(data)); @@ -59,11 +59,11 @@ namespace boost }; - boost::std::shared_ptr cleanup; - + boost::shared_ptr cleanup; + public: typedef T element_type; - + thread_specific_ptr(): cleanup(detail::heap_new(),detail::do_heap_delete()) {} @@ -76,7 +76,7 @@ namespace boost } ~thread_specific_ptr() { - detail::set_tss_data(this,boost::std::shared_ptr(),0,true); + detail::set_tss_data(this,boost::shared_ptr(),0,true); } T* get() const @@ -94,7 +94,7 @@ namespace boost T* release() { T* const temp=get(); - detail::set_tss_data(this,boost::std::shared_ptr(),0,false); + detail::set_tss_data(this,boost::shared_ptr(),0,false); return temp; } void reset(T* new_value=0) diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/tr1/memory.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/tr1/memory.hpp index 8b50bba3..16908774 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/tr1/memory.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/tr1/memory.hpp @@ -12,23 +12,23 @@ #ifndef BOOST_HAS_TR1_SHARED_PTR // -// This header can get included by boost/std::shared_ptr.hpp which leads +// This header can get included by boost/shared_ptr.hpp which leads // to cyclic dependencies, the workaround is to forward declare all // the boost components, and then include the actual headers afterwards. // This is fragile, but seems to work, and doesn't require modification -// of boost/std::shared_ptr.hpp. +// of boost/shared_ptr.hpp. // namespace boost{ class bad_weak_ptr; template class weak_ptr; -template class std::shared_ptr; +template class shared_ptr; template void swap(weak_ptr & a, weak_ptr & b) BOOST_NOEXCEPT; -template void swap(std::shared_ptr & a, std::shared_ptr & b) BOOST_NOEXCEPT; -template std::shared_ptr static_pointer_cast(std::shared_ptr const & r) BOOST_NOEXCEPT; -template std::shared_ptr dynamic_pointer_cast(std::shared_ptr const & r) BOOST_NOEXCEPT; -template std::shared_ptr const_pointer_cast(std::shared_ptr const & r) BOOST_NOEXCEPT; -template D * get_deleter(std::shared_ptr const & p) BOOST_NOEXCEPT; +template void swap(shared_ptr & a, shared_ptr & b) BOOST_NOEXCEPT; +template shared_ptr static_pointer_cast(shared_ptr const & r) BOOST_NOEXCEPT; +template shared_ptr dynamic_pointer_cast(shared_ptr const & r) BOOST_NOEXCEPT; +template shared_ptr const_pointer_cast(shared_ptr const & r) BOOST_NOEXCEPT; +template D * get_deleter(shared_ptr const & p) BOOST_NOEXCEPT; template class enable_shared_from_this; namespace detail{ @@ -41,7 +41,7 @@ class weak_count; namespace std{ namespace tr1{ using ::boost::bad_weak_ptr; - using ::boost::std::shared_ptr; + using ::boost::shared_ptr; #if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582) using ::boost::swap; #endif @@ -53,7 +53,7 @@ namespace std{ namespace tr1{ using ::boost::enable_shared_from_this; } } -#include +#include #include #include diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/uuid/random_generator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/uuid/random_generator.hpp index 82fa2e23..0f4a0ab6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/uuid/random_generator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/uuid/random_generator.hpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include namespace boost { @@ -34,7 +34,7 @@ private: public: typedef uuid result_type; - + // default constructor creates the random number generator basic_random_generator() : pURNG(new UniformRandomNumberGenerator) @@ -49,7 +49,7 @@ public: // seed the random number generator detail::seed(*pURNG); } - + // keep a reference to a random number generator // don't seed a given random number generator explicit basic_random_generator(UniformRandomNumberGenerator& gen) @@ -62,7 +62,7 @@ public: ) ) {} - + // keep a pointer to a random number generator // don't seed a given random number generator explicit basic_random_generator(UniformRandomNumberGenerator* pGen) @@ -77,11 +77,11 @@ public: { BOOST_ASSERT(pURNG); } - + uuid operator()() { uuid u; - + int i=0; unsigned long random_value = generator(); for (uuid::iterator it=u.begin(); it!=u.end(); ++it, ++i) { @@ -108,7 +108,7 @@ public: } private: - std::shared_ptr pURNG; + shared_ptr pURNG; generator_type generator; }; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/cpp_context.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/cpp_context.hpp index 9d67f4f5..50c1d1ce 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/cpp_context.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/cpp_context.hpp @@ -1,7 +1,7 @@ /*============================================================================= Boost.Wave: A Standard compliant C++ preprocessor library Definition of the preprocessor context - + http://www.boost.org/ Copyright (c) 2001-2012 Hartmut Kaiser. Distributed under the Boost @@ -52,10 +52,10 @@ namespace boost { namespace wave { /////////////////////////////////////////////////////////////////////////////// -// +// // The C/C++ preprocessor context template class // -// The boost::wave::context template is the main interface class to +// The boost::wave::context template is the main interface class to // control the behavior of the preprocessing engine. // // The following template parameters has to be supplied: @@ -63,18 +63,18 @@ namespace wave { // IteratorT The iterator type of the underlying input stream // LexIteratorT The lexer iterator type to use as the token factory // InputPolicyT The input policy type to use for loading the files -// to be included. This template parameter is optional and -// defaults to the +// to be included. This template parameter is optional and +// defaults to the // iteration_context_policies::load_file_to_string // type. -// HooksT The hooks policy to use for different notification +// HooksT The hooks policy to use for different notification // callbacks. This template parameter is optional and // defaults to the // context_policies::default_preprocessing_hooks // type. // DerivedT The type of the type being derived from the context // type (if any). This template parameter is optional and -// defaults to 'this_type', which means that the context +// defaults to 'this_type', which means that the context // type will be used assuming no derived type exists. // /////////////////////////////////////////////////////////////////////////////// @@ -83,7 +83,7 @@ struct this_type {}; template < typename IteratorT, - typename LexIteratorT, + typename LexIteratorT, typename InputPolicyT = iteration_context_policies::load_file_to_string, typename HooksT = context_policies::eat_whitespace, typename DerivedT = this_type @@ -113,35 +113,35 @@ public: typedef typename token_type::position_type position_type; // type of a token sequence - typedef std::list > + typedef std::list > token_sequence_type; // type of the policies typedef HooksT hook_policy_type; private: -// stack of std::shared_ptr's to the pending iteration contexts - typedef boost::std::shared_ptr > +// stack of shared_ptr's to the pending iteration contexts + typedef boost::shared_ptr > iteration_ptr_type; - typedef boost::wave::util::iteration_context_stack + typedef boost::wave::util::iteration_context_stack iteration_context_stack_type; typedef typename iteration_context_stack_type::size_type iter_size_type; context *this_() { return this; } // avoid warning in constructor public: - context(target_iterator_type const &first_, target_iterator_type const &last_, + context(target_iterator_type const &first_, target_iterator_type const &last_, char const *fname = "", HooksT const &hooks_ = HooksT()) : first(first_), last(last_), filename(fname) , has_been_initialized(false) #if BOOST_WAVE_SUPPORT_PRAGMA_ONCE != 0 , current_filename(fname) -#endif +#endif , current_relative_filename(fname) , macros(*this_()) , language(language_support( - support_cpp - | support_option_convert_trigraphs - | support_option_emit_line_directives + support_cpp + | support_option_convert_trigraphs + | support_option_emit_line_directives #if BOOST_WAVE_SUPPORT_PRAGMA_ONCE != 0 | support_option_include_guard_detection #endif @@ -160,29 +160,29 @@ public: // default destructor // iterator interface - iterator_type begin() - { + iterator_type begin() + { std::string fname(filename); if (filename != "" && filename != "") { using namespace boost::filesystem; path fpath(util::complete_path(path(filename))); fname = fpath.string(); } - return iterator_type(*this, first, last, position_type(fname.c_str())); + return iterator_type(*this, first, last, position_type(fname.c_str())); } iterator_type begin( - target_iterator_type const &first_, - target_iterator_type const &last_) - { + target_iterator_type const &first_, + target_iterator_type const &last_) + { std::string fname(filename); if (filename != "" && filename != "") { using namespace boost::filesystem; path fpath(util::complete_path(path(filename))); fname = fpath.string(); } - return iterator_type(*this, first_, last_, position_type(fname.c_str())); + return iterator_type(*this, first_, last_, position_type(fname.c_str())); } - iterator_type end() const + iterator_type end() const { return iterator_type(); } // maintain include paths @@ -191,46 +191,46 @@ public: bool add_sysinclude_path(char const *path_) { return includes.add_include_path(path_, true);} void set_sysinclude_delimiter() { includes.set_sys_include_delimiter(); } - typename iteration_context_stack_type::size_type get_iteration_depth() const + typename iteration_context_stack_type::size_type get_iteration_depth() const { return iter_ctxs.size(); } // maintain defined macros #if BOOST_WAVE_ENABLE_COMMANDLINE_MACROS != 0 template bool add_macro_definition(StringT macrostring, bool is_predefined = false) - { - return boost::wave::util::add_macro_definition(*this, - util::to_string(macrostring), is_predefined, - get_language()); + { + return boost::wave::util::add_macro_definition(*this, + util::to_string(macrostring), is_predefined, + get_language()); } -#endif +#endif // Define and undefine macros, macro introspection template - bool add_macro_definition(StringT const &name, position_type const& pos, - bool has_params, std::vector ¶meters, + bool add_macro_definition(StringT const &name, position_type const& pos, + bool has_params, std::vector ¶meters, token_sequence_type &definition, bool is_predefined = false) - { + { return macros.add_macro( - token_type(T_IDENTIFIER, util::to_string(name), pos), - has_params, parameters, definition, is_predefined); + token_type(T_IDENTIFIER, util::to_string(name), pos), + has_params, parameters, definition, is_predefined); } template bool is_defined_macro(StringT const &str) const - { - return macros.is_defined(util::to_string(str)); + { + return macros.is_defined(util::to_string(str)); } template - bool get_macro_definition(StringT const &name, + bool get_macro_definition(StringT const &name, bool &has_params, bool &is_predefined, position_type &pos, - std::vector ¶meters, + std::vector ¶meters, token_sequence_type &definition) const - { - return macros.get_macro(util::to_string(name), - has_params, is_predefined, pos, parameters, definition); + { + return macros.get_macro(util::to_string(name), + has_params, is_predefined, pos, parameters, definition); } template bool remove_macro_definition(StringT const& undefname, bool even_predefined = false) - { + { // strip leading and trailing whitespace string_type name = util::to_string(undefname); typename string_type::size_type pos = name.find_first_not_of(" \t"); @@ -244,9 +244,9 @@ public: includes.remove_pragma_once_header( util::to_string(name)); #endif - return macros.remove_macro(name, macros.get_main_pos(), even_predefined); + return macros.remove_macro(name, macros.get_main_pos(), even_predefined); } - void reset_macro_definitions() + void reset_macro_definitions() { macros.reset_macromap(); macros.init_predefined_macros(); } // Iterate over names of defined macros @@ -264,28 +264,28 @@ public: bool add_macro_definition(token_type const &name, bool has_params, std::vector ¶meters, token_sequence_type &definition, bool is_predefined = false) - { - return macros.add_macro(name, has_params, parameters, definition, - is_predefined); + { + return macros.add_macro(name, has_params, parameters, definition, + is_predefined); } -// get the Wave version information - static std::string get_version() - { - boost::wave::util::predefined_macros p; - return util::to_string(p.get_fullversion()); +// get the Wave version information + static std::string get_version() + { + boost::wave::util::predefined_macros p; + return util::to_string(p.get_fullversion()); } - static std::string get_version_string() + static std::string get_version_string() { boost::wave::util::predefined_macros p; - return util::to_string(p.get_versionstr()); + return util::to_string(p.get_versionstr()); } // access current language options void set_language(boost::wave::language_support language_, - bool reset_macros = true) - { - language = language_; + bool reset_macros = true) + { + language = language_; if (reset_macros) reset_macro_definitions(); } @@ -305,10 +305,10 @@ public: hook_policy_type const &get_hooks() const { return hooks; } // return type of actually used context type (might be the derived type) - actual_context_type& derived() - { return *static_cast(this); } + actual_context_type& derived() + { return *static_cast(this); } actual_context_type const& derived() const - { return *static_cast(this); } + { return *static_cast(this); } // return the directory of the currently preprocessed file boost::filesystem::path get_current_directory() const @@ -320,7 +320,7 @@ protected: friend class boost::wave::impl::pp_iterator_functor; #endif -// make sure the context has been initialized +// make sure the context has been initialized void init_context() { if (!has_been_initialized) { @@ -340,22 +340,22 @@ protected: { return macros.is_defined(begin, end); } // maintain include paths (helper functions) - void set_current_directory(char const *path_) + void set_current_directory(char const *path_) { includes.set_current_directory(path_); } // conditional compilation contexts bool get_if_block_status() const { return ifblocks.get_status(); } - bool get_if_block_some_part_status() const - { return ifblocks.get_some_part_status(); } + bool get_if_block_some_part_status() const + { return ifblocks.get_some_part_status(); } bool get_enclosing_if_block_status() const { return ifblocks.get_enclosing_status(); } - void enter_if_block(bool new_status) + void enter_if_block(bool new_status) { ifblocks.enter_if_block(new_status); } - bool enter_elif_block(bool new_status) + bool enter_elif_block(bool new_status) { return ifblocks.enter_elif_block(new_status); } bool enter_else_block() { return ifblocks.enter_else_block(); } bool exit_if_block() { return ifblocks.exit_if_block(); } - typename boost::wave::util::if_block_stack::size_type get_if_block_depth() const + typename boost::wave::util::if_block_stack::size_type get_if_block_depth() const { return ifblocks.get_if_block_depth(); } // stack of iteration contexts @@ -366,29 +366,29 @@ protected: /////////////////////////////////////////////////////////////////////////////// // -// expand_tokensequence(): -// expands all macros contained in a given token sequence, handles '##' -// and '#' pp operators and re-scans the resulting sequence +// expand_tokensequence(): +// expands all macros contained in a given token sequence, handles '##' +// and '#' pp operators and re-scans the resulting sequence // (essentially pre-processes the token sequence). // // The expand_undefined parameter is true during macro expansion inside -// a C++ expression given for a #if or #elif statement. +// a C++ expression given for a #if or #elif statement. // /////////////////////////////////////////////////////////////////////////////// template - token_type expand_tokensequence(IteratorT2 &first_, IteratorT2 const &last_, - token_sequence_type &pending, token_sequence_type &expanded, + token_type expand_tokensequence(IteratorT2 &first_, IteratorT2 const &last_, + token_sequence_type &pending, token_sequence_type &expanded, bool& seen_newline, bool expand_undefined = false) { - return macros.expand_tokensequence(first_, last_, pending, expanded, + return macros.expand_tokensequence(first_, last_, pending, expanded, seen_newline, expand_undefined); } template - void expand_whole_tokensequence(IteratorT2 &first_, IteratorT2 const &last_, + void expand_whole_tokensequence(IteratorT2 &first_, IteratorT2 const &last_, token_sequence_type &expanded, bool expand_undefined = true) { - macros.expand_whole_tokensequence(expanded, first_, last_, + macros.expand_whole_tokensequence(expanded, first_, last_, expand_undefined); // remove any contained placeholder @@ -401,33 +401,33 @@ public: // maintain the real name of the current preprocessed file void set_current_filename(char const *real_name) { current_filename = real_name; } - std::string const &get_current_filename() const + std::string const &get_current_filename() const { return current_filename; } -// maintain the list of known headers containing #pragma once +// maintain the list of known headers containing #pragma once bool has_pragma_once(std::string const &filename_) { return includes.has_pragma_once(filename_); } bool add_pragma_once_header(std::string const &filename_, std::string const& guard_name) - { + { get_hooks().detected_include_guard(derived(), filename_, guard_name); - return includes.add_pragma_once_header(filename_, guard_name); + return includes.add_pragma_once_header(filename_, guard_name); } - bool add_pragma_once_header(token_type const &pragma_, + bool add_pragma_once_header(token_type const &pragma_, std::string const &filename_) - { + { get_hooks().detected_pragma_once(derived(), pragma_, filename_); - return includes.add_pragma_once_header(filename_, - "__BOOST_WAVE_PRAGMA_ONCE__"); + return includes.add_pragma_once_header(filename_, + "__BOOST_WAVE_PRAGMA_ONCE__"); } -#endif +#endif void set_current_relative_filename(char const *real_name) { current_relative_filename = real_name; } - std::string const &get_current_relative_filename() const + std::string const &get_current_relative_filename() const { return current_relative_filename; } - bool find_include_file (std::string &s, std::string &d, bool is_system, + bool find_include_file (std::string &s, std::string &d, bool is_system, char const *current_file) const { return includes.find_include_file(s, d, is_system, current_file); } @@ -459,8 +459,8 @@ private: { using namespace boost::serialization; if (version != (loaded_version & ~version_mask)) { - BOOST_WAVE_THROW_CTX((*this), preprocess_exception, - incompatible_config, "cpp_context state version", + BOOST_WAVE_THROW_CTX((*this), preprocess_exception, + incompatible_config, "cpp_context state version", get_main_pos()); return; } @@ -471,7 +471,7 @@ private: // BOOST_PP_STRINGIZE(BOOST_WAVE_CONFIG) ar & make_nvp("config", config); if (config != BOOST_PP_STRINGIZE(BOOST_WAVE_CONFIG)) { - BOOST_WAVE_THROW_CTX((*this), preprocess_exception, + BOOST_WAVE_THROW_CTX((*this), preprocess_exception, incompatible_config, "BOOST_WAVE_CONFIG", get_main_pos()); return; } @@ -479,8 +479,8 @@ private: // BOOST_WAVE_PRAGMA_KEYWORD ar & make_nvp("pragma_keyword", pragma_keyword); if (pragma_keyword != BOOST_WAVE_PRAGMA_KEYWORD) { - BOOST_WAVE_THROW_CTX((*this), preprocess_exception, - incompatible_config, "BOOST_WAVE_PRAGMA_KEYWORD", + BOOST_WAVE_THROW_CTX((*this), preprocess_exception, + incompatible_config, "BOOST_WAVE_PRAGMA_KEYWORD", get_main_pos()); return; } @@ -488,7 +488,7 @@ private: // BOOST_PP_STRINGIZE((BOOST_WAVE_STRINGTYPE)) ar & make_nvp("string_type", string_type_str); if (string_type_str != BOOST_PP_STRINGIZE((BOOST_WAVE_STRINGTYPE))) { - BOOST_WAVE_THROW_CTX((*this), preprocess_exception, + BOOST_WAVE_THROW_CTX((*this), preprocess_exception, incompatible_config, "BOOST_WAVE_STRINGTYPE", get_main_pos()); return; } @@ -501,7 +501,7 @@ private: } catch (boost::wave::preprocess_exception const& e) { // catch version mismatch exceptions and call error handler - get_hooks().throw_exception(derived(), e); + get_hooks().throw_exception(derived(), e); } } BOOST_SERIALIZATION_SPLIT_MEMBER() @@ -515,7 +515,7 @@ private: bool has_been_initialized; // set cwd once #if BOOST_WAVE_SUPPORT_PRAGMA_ONCE != 0 std::string current_filename; // real name of current preprocessed file -#endif +#endif std::string current_relative_filename; // real relative name of current preprocessed file boost::wave::util::if_block_stack ifblocks; // conditional compilation contexts @@ -534,7 +534,7 @@ private: namespace boost { namespace serialization { template< - typename Iterator, typename LexIterator, + typename Iterator, typename LexIterator, typename InputPolicy, typename Hooks > struct tracking_level > @@ -548,7 +548,7 @@ struct tracking_level struct version > diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/cpp_iterator.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/cpp_iterator.hpp index b1bd8ee6..dc2d9342 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/cpp_iterator.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/cpp_iterator.hpp @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include #include @@ -359,7 +359,7 @@ protected: private: ContextT &ctx; // context, this iterator is associated with - boost::std::shared_ptr iter_ctx; + boost::shared_ptr iter_ctx; bool seen_newline; // needed for recognizing begin of line bool skipped_newline; // a newline has been skipped since last one @@ -1608,7 +1608,7 @@ char const *current_name = 0; // never try to match current file name ctx.set_current_directory(native_path_str.c_str()); // preprocess the opened file - boost::std::shared_ptr new_iter_ctx ( + boost::shared_ptr new_iter_ctx ( new iteration_context_type(ctx, native_path_str.c_str(), act_pos, boost::wave::enable_prefer_pp_numbers(ctx.get_language()), is_system ? base_iteration_context_type::system_header : diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/cpp_macromap.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/cpp_macromap.hpp index 9ccefca1..fb251ea1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/cpp_macromap.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/cpp_macromap.hpp @@ -28,7 +28,7 @@ #include #if BOOST_WAVE_SERIALIZATION != 0 #include -#include +#include #endif #include @@ -259,7 +259,7 @@ private: private: defined_macros_type *current_macros; // current symbol table - boost::std::shared_ptr defined_macros; // global symbol table + boost::shared_ptr defined_macros; // global symbol table token_type act_token; // current token position_type main_pos; // last token position in the pp_iterator diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/symbol_table.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/symbol_table.hpp index f622d45c..312b0a2f 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/symbol_table.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/wave/util/symbol_table.hpp @@ -14,14 +14,14 @@ #include #include -#include +#include #if BOOST_WAVE_SERIALIZATION != 0 #include #include -#include +#include #else -#include +#include #endif #include @@ -38,27 +38,27 @@ namespace util { /////////////////////////////////////////////////////////////////////////////// // -// The symbol_table class is used for the storage of defined macros. +// The symbol_table class is used for the storage of defined macros. // /////////////////////////////////////////////////////////////////////////////// template -struct symbol_table +struct symbol_table #if BOOST_WAVE_SERIALIZATION != 0 -: public std::map > +: public std::map > #else -: public std::map > +: public std::map > #endif { #if BOOST_WAVE_SERIALIZATION != 0 - typedef std::map > base_type; + typedef std::map > base_type; #else typedef std::map > base_type; #endif typedef typename base_type::iterator iterator_type; typedef typename base_type::const_iterator const_iterator_type; - symbol_table(long uid_ = 0) + symbol_table(long uid_ = 0) {} #if BOOST_WAVE_SERIALIZATION != 0 @@ -68,7 +68,7 @@ private: void serialize(Archive &ar, const unsigned int version) { using namespace boost::serialization; - ar & make_nvp("symbol_table", + ar & make_nvp("symbol_table", boost::serialization::base_object(*this)); } #endif @@ -76,7 +76,7 @@ private: private: /////////////////////////////////////////////////////////////////////////// // - // This is a special iterator allowing to iterate the names of all defined + // This is a special iterator allowing to iterate the names of all defined // macros. // /////////////////////////////////////////////////////////////////////////// @@ -94,13 +94,13 @@ private: typedef get_first unary_functor; public: - typedef transform_iterator + typedef transform_iterator name_iterator; - typedef transform_iterator + typedef transform_iterator const_name_iterator; template - static + static transform_iterator make_iterator(Iterator it) { return boost::make_transform_iterator(it); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/access.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/access.hpp index a1fe00f2..d984a432 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/access.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/access.hpp @@ -14,7 +14,7 @@ #endif #include -#include +#include #include #include #include @@ -41,7 +41,7 @@ struct core_access return rex.match_(state); } - static std::shared_ptr > const & + static shared_ptr > const & get_regex_impl(basic_regex const &rex) { return proto::value(rex).get(); diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/linker.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/linker.hpp index 15c2d951..e87e26d1 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/linker.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/linker.hpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp index bb036635..f9282042 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/matcher/regex_byref_matcher.hpp @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include #include @@ -41,7 +41,7 @@ namespace boost { namespace xpressive { namespace detail // we don't have to worry about it going away. regex_impl const *pimpl_; - regex_byref_matcher(std::shared_ptr > const &impl) + regex_byref_matcher(shared_ptr > const &impl) : wimpl_(impl) , pimpl_(impl.get()) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/matcher/regex_matcher.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/matcher/regex_matcher.hpp index 100317df..e7eee7d3 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/matcher/regex_matcher.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/core/matcher/regex_matcher.hpp @@ -34,7 +34,7 @@ namespace boost { namespace xpressive { namespace detail { regex_impl impl_; - regex_matcher(std::shared_ptr > const &impl) + regex_matcher(shared_ptr > const &impl) : impl_() { this->impl_.xpr_ = impl->xpr_; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/detail_fwd.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/detail_fwd.hpp index 7fd3088b..52deaae9 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/detail_fwd.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/detail_fwd.hpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include namespace boost { namespace xpressive { namespace detail @@ -353,7 +353,7 @@ namespace boost { namespace xpressive { namespace detail int get_mark_number(basic_mark_tag const &); template - void static_compile(Xpr const &xpr, std::shared_ptr > const &impl); + void static_compile(Xpr const &xpr, shared_ptr > const &impl); struct quant_spec; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/compile.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/compile.hpp index 023a238a..bc8af05b 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/compile.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/compile.hpp @@ -32,7 +32,7 @@ namespace boost { namespace xpressive { namespace detail /////////////////////////////////////////////////////////////////////////////// // static_compile_impl2 template - void static_compile_impl2(Xpr const &xpr, std::shared_ptr > const &impl, Traits const &tr) + void static_compile_impl2(Xpr const &xpr, shared_ptr > const &impl, Traits const &tr) { typedef typename iterator_value::type char_type; impl->tracking_clear(); @@ -70,7 +70,7 @@ namespace boost { namespace xpressive { namespace detail // static_compile_impl1 template typename disable_if >::type - static_compile_impl1(Xpr const &xpr, std::shared_ptr > const &impl) + static_compile_impl1(Xpr const &xpr, shared_ptr > const &impl) { // use default traits typedef typename iterator_value::type char_type; @@ -83,7 +83,7 @@ namespace boost { namespace xpressive { namespace detail // static_compile_impl1 template typename enable_if >::type - static_compile_impl1(Xpr const &xpr, std::shared_ptr > const &impl) + static_compile_impl1(Xpr const &xpr, shared_ptr > const &impl) { // use specified traits typedef typename proto::result_of::value::type>::type::locale_type locale_type; @@ -94,7 +94,7 @@ namespace boost { namespace xpressive { namespace detail /////////////////////////////////////////////////////////////////////////////// // static_compile template - void static_compile(Xpr const &xpr, std::shared_ptr > const &impl) + void static_compile(Xpr const &xpr, shared_ptr > const &impl) { static_compile_impl1(xpr, impl); } diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/placeholders.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/placeholders.hpp index 75c09b4a..5c955384 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/placeholders.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/placeholders.hpp @@ -17,7 +17,7 @@ #endif #include -#include +#include #include #include diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/visitor.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/visitor.hpp index 68ac32f1..5a0213f6 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/visitor.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/static/visitor.hpp @@ -14,7 +14,7 @@ #endif #include -#include +#include #include #include #include @@ -27,7 +27,7 @@ namespace boost { namespace xpressive { namespace detail template struct xpression_visitor_base { - explicit xpression_visitor_base(std::shared_ptr > const &self) + explicit xpression_visitor_base(shared_ptr > const &self) : self_(self) { } @@ -51,7 +51,7 @@ namespace boost { namespace xpressive { namespace detail } } - std::shared_ptr > &self() + shared_ptr > &self() { return this->self_; } @@ -94,7 +94,7 @@ namespace boost { namespace xpressive { namespace detail } private: - std::shared_ptr > self_; + shared_ptr > self_; }; /////////////////////////////////////////////////////////////////////////////// @@ -108,7 +108,7 @@ namespace boost { namespace xpressive { namespace detail typedef Traits traits_type; typedef typename boost::iterator_value::type char_type; - explicit xpression_visitor(Traits const &tr, std::shared_ptr > const &self) + explicit xpression_visitor(Traits const &tr, shared_ptr > const &self) : xpression_visitor_base(self) , traits_(tr) { diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/utility/symbols.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/utility/symbols.hpp index ffb9b552..5efa4aba 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/utility/symbols.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/utility/symbols.hpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include namespace boost { namespace xpressive { namespace detail { @@ -75,9 +75,9 @@ namespace boost { namespace xpressive { namespace detail private: /////////////////////////////////////////////////////////////////////////////// - // struct node : a node in the TST. + // struct node : a node in the TST. // The "eq" field stores the result pointer when ch is zero. - // + // struct node : boost::noncopyable { @@ -125,7 +125,7 @@ namespace boost { namespace xpressive { namespace detail /////////////////////////////////////////////////////////////////////////////// // insert : insert a string into the TST - // + // template node* insert(node* p, key_iterator &begin, key_iterator end, result_type r, Trans trans) const { @@ -168,7 +168,7 @@ namespace boost { namespace xpressive { namespace detail /////////////////////////////////////////////////////////////////////////////// // conditional rotation : the goal is to minimize the overall // weighted path length of each binary search tree - // + // bool cond_rotation(bool left, node* const i, node* const j) const { // don't rotate top node in binary search tree @@ -201,7 +201,7 @@ namespace boost { namespace xpressive { namespace detail /////////////////////////////////////////////////////////////////////////////// // search : find a string in the TST - // + // template result_type search(BidiIter &begin, BidiIter end, Trans trans, node* p) const { @@ -276,7 +276,7 @@ namespace boost { namespace xpressive { namespace detail } } - boost::std::shared_ptr root; + boost::shared_ptr root; }; }}} // namespace boost::xpressive::detail diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/utility/tracking_ptr.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/utility/tracking_ptr.hpp index 0c211c3c..c6a0353e 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/utility/tracking_ptr.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/detail/utility/tracking_ptr.hpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -48,7 +48,7 @@ struct weak_iterator : iterator_facade < weak_iterator - , std::shared_ptr const + , shared_ptr const , std::forward_iterator_tag > { @@ -73,7 +73,7 @@ struct weak_iterator private: friend class boost::iterator_core_access; - std::shared_ptr const &dereference() const + shared_ptr const &dereference() const { return this->cur_; } @@ -102,7 +102,7 @@ private: this->cur_.reset(); } - std::shared_ptr cur_; + shared_ptr cur_; base_iterator iter_; set_type *set_; }; @@ -112,14 +112,14 @@ private: // for use with a filter_iterator to filter a node out of a list of dependencies template struct filter_self - : std::unary_function, bool> + : std::unary_function, bool> { filter_self(enable_reference_tracking *self) : self_(self) { } - bool operator ()(std::shared_ptr const &that) const + bool operator ()(shared_ptr const &that) const { return this->self_ != that.get(); } @@ -144,7 +144,7 @@ void adl_swap(T &t1, T &t2) template struct enable_reference_tracking { - typedef std::set > references_type; + typedef std::set > references_type; typedef std::set > dependents_type; void tracking_copy(Derived const &that) @@ -321,7 +321,7 @@ private: references_type refs_; dependents_type deps_; - std::shared_ptr self_; + shared_ptr self_; boost::detail::atomic_count cnt_; }; @@ -345,7 +345,7 @@ inline void intrusive_ptr_release(enable_reference_tracking *p) template inline void enable_reference_tracking::dump_(std::ostream &sout) const { - std::shared_ptr this_ = this->self_; + shared_ptr this_ = this->self_; sout << "0x" << (void*)this << " cnt=" << this_.use_count()-1 << " refs={"; typename references_type::const_iterator cur1 = this->refs_.begin(); typename references_type::const_iterator end1 = this->refs_.end(); @@ -358,8 +358,8 @@ inline void enable_reference_tracking::dump_(std::ostream &sout) const typename dependents_type::const_iterator end2 = this->deps_.end(); for(; cur2 != end2; ++cur2) { - // ericne, 27/nov/05: CW9_4 doesn't like if(std::shared_ptr x = y) - std::shared_ptr dep = cur2->lock(); + // ericne, 27/nov/05: CW9_4 doesn't like if(shared_ptr x = y) + shared_ptr dep = cur2->lock(); if(dep.get()) { sout << "0x" << (void*)&*dep << ','; @@ -425,7 +425,7 @@ struct tracking_ptr } // calling this forces this->impl_ to fork. - std::shared_ptr const &get() const + shared_ptr const &get() const { if(intrusive_ptr impl = this->fork_()) { @@ -480,7 +480,7 @@ private: { impl = this->impl_; BOOST_ASSERT(!this->has_deps_()); - std::shared_ptr simpl(new element_type); + shared_ptr simpl(new element_type); this->impl_ = get_pointer(simpl->self_ = simpl); } return impl; diff --git a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/regex_compiler.hpp b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/regex_compiler.hpp index ca47501e..4a2a9d74 100644 --- a/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/regex_compiler.hpp +++ b/Minecraft.Client/PS3/PS3Extras/boost_1_53_0/boost/xpressive/regex_compiler.hpp @@ -375,7 +375,7 @@ private: , "mismatched parenthesis" ); basic_regex &rex = this->rules_[name]; - std::shared_ptr > impl = access::get_regex_impl(rex); + shared_ptr > impl = access::get_regex_impl(rex); this->self_->track_reference(*impl); return detail::make_dynamic(detail::regex_byref_matcher(impl)); } @@ -735,7 +735,7 @@ private: std::size_t hidden_mark_count_; CompilerTraits traits_; typename RegexTraits::char_class_type upper_; - std::shared_ptr > self_; + shared_ptr > self_; std::map > rules_; }; diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp index a5e97a2f..1cb5e2ee 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/ChunkRebuildData.cpp @@ -3,7 +3,7 @@ #ifndef SN_TARGET_PS3_SPU // #include "..\..\..\stdafx.h" #endif -#endif +#endif #include "ChunkRebuildData.h" #include "Tesselator_SPU.h" @@ -13,7 +13,7 @@ #include "..\..\..\..\Minecraft.World\Tile.h" #include "..\..\..\..\Minecraft.World\Level.h" #include "..\..\..\..\Minecraft.World\Dimension.h" -// +// // #include "..\..\..\Chunk.h" // #include "..\..\..\TileRenderer.h" // #include "..\..\..\TileEntityRenderDispatcher.h" @@ -26,13 +26,13 @@ #include "..\..\..\..\Minecraft.World\BiomeSource.h" #else - + #include "..\Common\spu_assert.h" #endif //SN_TARGET_PS3_SPU static const int Level_maxBuildHeight = 256; -static const int Level_MAX_LEVEL_SIZE = 30000000; +static const int Level_MAX_LEVEL_SIZE = 30000000; static const int Level_MAX_BRIGHTNESS = 15; @@ -53,7 +53,7 @@ int ChunkRebuildData::getGrassColor( int x, int z ) { return m_grassColor[get int ChunkRebuildData::getFoliageColor( int x, int z ) { return m_foliageColor[getTileIdx(x,z)]; } int ChunkRebuildData::getFlags(int x, int y, int z) { return m_data_flags[getTileIdx(x,y,z)] >> 4; } void ChunkRebuildData::setFlag(int x, int y, int z, int flag) { m_data_flags[getTileIdx(x,y,z)] |= (flag<<4);} -#endif +#endif @@ -77,7 +77,7 @@ void ChunkRebuildData::disableUnseenTiles() int tileID = getTile(iX,iY,iZ); if( tileID == 0 ) continue; m_flags &= ~e_flag_EmptyChunk; - + // Don't bother trying to work out neighbours for this tile if we are at the edge of the chunk - apart from the very // bottom of the world where we shouldn't ever be able to see @@ -120,7 +120,7 @@ void ChunkRebuildData::disableUnseenTiles() } } } - + #ifndef SN_TARGET_PS3_SPU void setIconSPUFromIcon(Icon_SPU* iconSpu, Icon* icon) @@ -145,78 +145,78 @@ void ChunkRebuildData::buildMaterial(int matSPUIndex, Material* mat) void ChunkRebuildData::buildMaterials() { - buildMaterial(Material_SPU::air_Id, Material::air); - buildMaterial(Material_SPU::grass_Id, Material::grass); - buildMaterial(Material_SPU::dirt_Id, Material::dirt); - buildMaterial(Material_SPU::wood_Id, Material::wood); - buildMaterial(Material_SPU::stone_Id, Material::stone); - buildMaterial(Material_SPU::metal_Id, Material::metal); - buildMaterial(Material_SPU::water_Id, Material::water); - buildMaterial(Material_SPU::lava_Id, Material::lava); - buildMaterial(Material_SPU::leaves_Id, Material::leaves); - buildMaterial(Material_SPU::plant_Id, Material::plant); - buildMaterial(Material_SPU::replaceable_plant_Id, Material::replaceable_plant); - buildMaterial(Material_SPU::sponge_Id, Material::sponge); - buildMaterial(Material_SPU::cloth_Id, Material::cloth); - buildMaterial(Material_SPU::fire_Id, Material::fire); - buildMaterial(Material_SPU::sand_Id, Material::sand); - buildMaterial(Material_SPU::decoration_Id, Material::decoration); - buildMaterial(Material_SPU::clothDecoration_Id, Material::clothDecoration); - buildMaterial(Material_SPU::glass_Id, Material::glass); - buildMaterial(Material_SPU::explosive_Id, Material::explosive); - buildMaterial(Material_SPU::coral_Id, Material::coral); - buildMaterial(Material_SPU::ice_Id, Material::ice); - buildMaterial(Material_SPU::topSnow_Id, Material::topSnow); - buildMaterial(Material_SPU::snow_Id, Material::snow); - buildMaterial(Material_SPU::cactus_Id, Material::cactus); - buildMaterial(Material_SPU::clay_Id, Material::clay); - buildMaterial(Material_SPU::vegetable_Id, Material::vegetable); - buildMaterial(Material_SPU::egg_Id, Material::egg); - buildMaterial(Material_SPU::portal_Id, Material::portal); - buildMaterial(Material_SPU::cake_Id, Material::cake); - buildMaterial(Material_SPU::web_Id, Material::web); - buildMaterial(Material_SPU::piston_Id, Material::piston); - buildMaterial(Material_SPU::buildable_glass_Id, Material::buildable_glass); - buildMaterial(Material_SPU::heavyMetal_Id, Material::heavyMetal); + buildMaterial(Material_SPU::air_Id, Material::air); + buildMaterial(Material_SPU::grass_Id, Material::grass); + buildMaterial(Material_SPU::dirt_Id, Material::dirt); + buildMaterial(Material_SPU::wood_Id, Material::wood); + buildMaterial(Material_SPU::stone_Id, Material::stone); + buildMaterial(Material_SPU::metal_Id, Material::metal); + buildMaterial(Material_SPU::water_Id, Material::water); + buildMaterial(Material_SPU::lava_Id, Material::lava); + buildMaterial(Material_SPU::leaves_Id, Material::leaves); + buildMaterial(Material_SPU::plant_Id, Material::plant); + buildMaterial(Material_SPU::replaceable_plant_Id, Material::replaceable_plant); + buildMaterial(Material_SPU::sponge_Id, Material::sponge); + buildMaterial(Material_SPU::cloth_Id, Material::cloth); + buildMaterial(Material_SPU::fire_Id, Material::fire); + buildMaterial(Material_SPU::sand_Id, Material::sand); + buildMaterial(Material_SPU::decoration_Id, Material::decoration); + buildMaterial(Material_SPU::clothDecoration_Id, Material::clothDecoration); + buildMaterial(Material_SPU::glass_Id, Material::glass); + buildMaterial(Material_SPU::explosive_Id, Material::explosive); + buildMaterial(Material_SPU::coral_Id, Material::coral); + buildMaterial(Material_SPU::ice_Id, Material::ice); + buildMaterial(Material_SPU::topSnow_Id, Material::topSnow); + buildMaterial(Material_SPU::snow_Id, Material::snow); + buildMaterial(Material_SPU::cactus_Id, Material::cactus); + buildMaterial(Material_SPU::clay_Id, Material::clay); + buildMaterial(Material_SPU::vegetable_Id, Material::vegetable); + buildMaterial(Material_SPU::egg_Id, Material::egg); + buildMaterial(Material_SPU::portal_Id, Material::portal); + buildMaterial(Material_SPU::cake_Id, Material::cake); + buildMaterial(Material_SPU::web_Id, Material::web); + buildMaterial(Material_SPU::piston_Id, Material::piston); + buildMaterial(Material_SPU::buildable_glass_Id, Material::buildable_glass); + buildMaterial(Material_SPU::heavyMetal_Id, Material::heavyMetal); } int ChunkRebuildData::getMaterialID(Tile* pTile) { Material* m = pTile->material; - if(m == Material::air) return Material_SPU::air_Id; - if(m == Material::grass) return Material_SPU::grass_Id; - if(m == Material::dirt) return Material_SPU::dirt_Id; - if(m == Material::wood) return Material_SPU::wood_Id; - if(m == Material::stone) return Material_SPU::stone_Id; - if(m == Material::metal) return Material_SPU::metal_Id; - if(m == Material::water) return Material_SPU::water_Id; - if(m == Material::lava) return Material_SPU::lava_Id; - if(m == Material::leaves) return Material_SPU::leaves_Id; - if(m == Material::plant) return Material_SPU::plant_Id; - if(m == Material::replaceable_plant)return Material_SPU::replaceable_plant_Id; - if(m == Material::sponge) return Material_SPU::sponge_Id; - if(m == Material::cloth) return Material_SPU::cloth_Id; - if(m == Material::fire) return Material_SPU::fire_Id; - if(m == Material::sand) return Material_SPU::sand_Id; - if(m == Material::decoration) return Material_SPU::decoration_Id; - if(m == Material::clothDecoration) return Material_SPU::clothDecoration_Id; + if(m == Material::air) return Material_SPU::air_Id; + if(m == Material::grass) return Material_SPU::grass_Id; + if(m == Material::dirt) return Material_SPU::dirt_Id; + if(m == Material::wood) return Material_SPU::wood_Id; + if(m == Material::stone) return Material_SPU::stone_Id; + if(m == Material::metal) return Material_SPU::metal_Id; + if(m == Material::water) return Material_SPU::water_Id; + if(m == Material::lava) return Material_SPU::lava_Id; + if(m == Material::leaves) return Material_SPU::leaves_Id; + if(m == Material::plant) return Material_SPU::plant_Id; + if(m == Material::replaceable_plant)return Material_SPU::replaceable_plant_Id; + if(m == Material::sponge) return Material_SPU::sponge_Id; + if(m == Material::cloth) return Material_SPU::cloth_Id; + if(m == Material::fire) return Material_SPU::fire_Id; + if(m == Material::sand) return Material_SPU::sand_Id; + if(m == Material::decoration) return Material_SPU::decoration_Id; + if(m == Material::clothDecoration) return Material_SPU::clothDecoration_Id; if(m == Material::glass) return Material_SPU::glass_Id; - if(m == Material::explosive) return Material_SPU::explosive_Id; - if(m == Material::coral) return Material_SPU::coral_Id; - if(m == Material::ice) return Material_SPU::ice_Id; - if(m == Material::topSnow) return Material_SPU::topSnow_Id; - if(m == Material::snow) return Material_SPU::snow_Id; - if(m == Material::cactus) return Material_SPU::cactus_Id; - if(m == Material::clay) return Material_SPU::clay_Id; - if(m == Material::vegetable) return Material_SPU::vegetable_Id; - if(m == Material::egg) return Material_SPU::egg_Id; - if(m == Material::portal) return Material_SPU::portal_Id; - if(m == Material::cake) return Material_SPU::cake_Id; - if(m == Material::web) return Material_SPU::web_Id; - if(m == Material::piston) return Material_SPU::piston_Id; + if(m == Material::explosive) return Material_SPU::explosive_Id; + if(m == Material::coral) return Material_SPU::coral_Id; + if(m == Material::ice) return Material_SPU::ice_Id; + if(m == Material::topSnow) return Material_SPU::topSnow_Id; + if(m == Material::snow) return Material_SPU::snow_Id; + if(m == Material::cactus) return Material_SPU::cactus_Id; + if(m == Material::clay) return Material_SPU::clay_Id; + if(m == Material::vegetable) return Material_SPU::vegetable_Id; + if(m == Material::egg) return Material_SPU::egg_Id; + if(m == Material::portal) return Material_SPU::portal_Id; + if(m == Material::cake) return Material_SPU::cake_Id; + if(m == Material::web) return Material_SPU::web_Id; + if(m == Material::piston) return Material_SPU::piston_Id; if(m == Material::buildable_glass) return Material_SPU::buildable_glass_Id; if(m == Material::heavyMetal) return Material_SPU::heavyMetal_Id; - assert(0); + assert(0); return Material_SPU::air_Id; } @@ -364,12 +364,12 @@ void ChunkRebuildData::createTileData() // recordPlayer setIconSPUFromIcon(&m_tileData.recordPlayer_iconTop, ((RecordPlayerTile*)Tile::recordPlayer)->iconTop); - // pumpkin + // pumpkin setIconSPUFromIcon(&m_tileData.pumpkinTile_iconTop, ((PumpkinTile*)Tile::pumpkin)->iconTop); setIconSPUFromIcon(&m_tileData.pumpkinTile_iconFace, ((PumpkinTile*)Tile::pumpkin)->iconFace); setIconSPUFromIcon(&m_tileData.pumpkinTile_iconFaceLit, ((PumpkinTile*)Tile::litPumpkin)->iconFace); - // cakeTile + // cakeTile setIconSPUFromIcon(&m_tileData.cakeTile_iconTop, ((CakeTile*)Tile::cake)->iconTop); setIconSPUFromIcon(&m_tileData.cakeTile_iconBottom, ((CakeTile*)Tile::cake)->iconBottom); setIconSPUFromIcon(&m_tileData.cakeTile_iconInner, ((CakeTile*)Tile::cake)->iconInner); @@ -509,7 +509,7 @@ void ChunkRebuildData::buildForChunk( Region* region, Level* level, int x0, int // assert(index < 400); int cacheBlockIndex = (cacheMap[iZ-m_z0]*3) + cacheMap[iX-m_x0]; BiomeCache::Block* pCacheBlock = cacheBlocks[cacheBlockIndex]; -// assert(region->getBiomeSource()->getBlockAt(iX, iZ) == pCacheBlock); +// assert(region->getBiomeSource()->getBlockAt(iX, iZ) == pCacheBlock); Biome* pBiome = pCacheBlock->getBiome(iX, iZ); m_grassColor[index] = pColourTable->getColor(pBiome->m_grassColor); m_foliageColor[index] = pColourTable->getColor(pBiome->m_foliageColor); @@ -537,7 +537,7 @@ void ChunkRebuildData::copyFromTesselator() m_tesselator.m_PPUOffset = 0; // copy tesselator vars over - m_tesselator.vertices = t->vertices; + m_tesselator.vertices = t->vertices; m_tesselator.u = t->u; m_tesselator.v = t->v; m_tesselator._tex2 = t->_tex2; @@ -588,7 +588,7 @@ void ChunkRebuildData::storeInTesselator() Tesselator* t = Tesselator::getInstance(); // 4J - added - static initialiser being set at the wrong time // copy tesselator vars over - t->vertices = m_tesselator.vertices; + t->vertices = m_tesselator.vertices; t->u = m_tesselator.u; t->v = m_tesselator.v; t->_tex2 = m_tesselator._tex2; @@ -647,7 +647,7 @@ void ChunkRebuildData::tesselateAllTiles(TileRenderer_SPU* pTileRenderer) { // if (m_currentLayer == 0 && m_tileData.isEntityTile[tileId]) // { -// std::shared_ptr et = region->getTileEntity(x, y, z); +// shared_ptr et = region->getTileEntity(x, y, z); // if (TileEntityRenderDispatcher::instance->hasRenderer(et)) // { // renderableTileEntities.push_back(et); @@ -801,7 +801,7 @@ int ChunkRebuildData::getBrightnessPropagate(LightLayer::variety layer, int x, i if(layer == LightLayer::Sky) return getBrightnessSky(x, y, z); return getBrightnessBlock(x, y, z); - + } int ChunkRebuildData::getLightColor(int x, int y, int z, int emitt) // 4J - change brought forward from 1.8.2 { @@ -865,7 +865,7 @@ int ChunkRebuildData::getRawBrightness(int x, int y, int z, bool propagate) int ChunkRebuildData::LevelChunk_getRawBrightness(int x, int y, int z, int skyDampen) { int light = (m_flags & e_flag_HasCeiling) ? 0 : getBrightnessSky(x, y, z); - if (light > 0) + if (light > 0) m_flags |= e_flag_TouchedSky; light -= skyDampen; int block = getBrightnessBlock(x, y, z); diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/LeverTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/LeverTile_SPU.h index 53c9f3ec..06dda5bb 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/LeverTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/LeverTile_SPU.h @@ -8,5 +8,5 @@ public: virtual bool blocksLight() { return false; } virtual bool isSolidRender(bool isServerLevel = false) { return false; } virtual int getRenderShape() { return Tile_SPU::SHAPE_LEVER; } -// virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param +// virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param }; diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PistonBaseTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PistonBaseTile_SPU.h index a8c6851c..e8411c88 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PistonBaseTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PistonBaseTile_SPU.h @@ -12,7 +12,7 @@ public: virtual int getRenderShape() { return SHAPE_PISTON_BASE; } virtual bool isSolidRender(bool isServerLevel = false) { return false; } - // virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + // virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param // virtual void updateDefaultShape(); }; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PistonExtensionTile_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PistonExtensionTile_SPU.h index 3323cfd0..d5460492 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PistonExtensionTile_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/PistonExtensionTile_SPU.h @@ -9,5 +9,5 @@ public: virtual Icon_SPU *getTexture(int face, int data) { return NULL; } virtual int getRenderShape() { return SHAPE_PISTON_EXTENSION; } virtual bool isSolidRender(bool isServerLevel = false) { return false; } -// virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param +// virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param }; \ No newline at end of file diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/TheEndPortal_SPU.h b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/TheEndPortal_SPU.h index b8bed9a8..f6e3b3e7 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/TheEndPortal_SPU.h +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/TheEndPortal_SPU.h @@ -6,7 +6,7 @@ class TheEndPortal_SPU : public EntityTile_SPU public: TheEndPortal_SPU(int id) : EntityTile_SPU(id) {} -// virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param +// virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual bool shouldRenderFace(ChunkRebuildData *level, int x, int y, int z, int face) { if (face != 0) return false; diff --git a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp index 552345fd..f2dfeaac 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp +++ b/Minecraft.Client/PS3/SPU_Tasks/ChunkUpdate/Tile_SPU.cpp @@ -118,14 +118,14 @@ float Tile_SPU::getBrightness(ChunkRebuildData *level, int x, int y, int z) { return level->getBrightness(x, y, z, ms_pTileData->lightEmission[id]); } -// +// // // 4J - brought forward from 1.8.2 int Tile_SPU::getLightColor(ChunkRebuildData *level, int x, int y, int z) { int tileID = level->getTile(x, y, z); return level->getLightColor(x, y, z, ms_pTileData->lightEmission[tileID]); } -// +// // bool Tile_SPU::isFaceVisible(Level *level, int x, int y, int z, int f) // { // if (f == 0) y--; @@ -136,7 +136,7 @@ int Tile_SPU::getLightColor(ChunkRebuildData *level, int x, int y, int z) // if (f == 5) x++; // return !level->isSolidRenderTile(x, y, z); // } -// +// bool Tile_SPU::shouldRenderFace(ChunkRebuildData *level, int x, int y, int z, int face) { if (face == 0 && getShapeY0() > 0) return true; @@ -147,7 +147,7 @@ bool Tile_SPU::shouldRenderFace(ChunkRebuildData *level, int x, int y, int z, in if (face == 5 && getShapeX1() < 1) return true; return (!level->isSolidRenderTile(x, y, z)); } -// +// bool Tile_SPU::isSolidFace(ChunkRebuildData *level, int x, int y, int z, int face) { return (level->getMaterial(x, y, z)->isSolid()); @@ -196,39 +196,39 @@ Icon_SPU *Tile_SPU::getTexture(ChunkRebuildData *level, int x, int y, int z, int } return getTexture(face, tileData); } -// +// Icon_SPU *Tile_SPU::getTexture(int face, int data) { return &ms_pTileData->iconData[id]; } -// +// Icon_SPU *Tile_SPU::getTexture(int face) { return getTexture(face, 0); } -// +// // AABB *Tile_SPU::getTileAABB(Level *level, int x, int y, int z) // { // return AABB::newTemp(x + xx0, y + yy0, z + zz0, x + xx1, y + yy1, z + zz1); // } -// -// void Tile_SPU::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, Entity *source) +// +// void Tile_SPU::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, Entity *source) // { // AABB *aabb = getAABB(level, x, y, z); // if (aabb != NULL && box->intersects(aabb)) boxes->push_back(aabb); // } -// +// // void Tile_SPU::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes) // { // AABB *aabb = getAABB(level, x, y, z); // if (aabb != NULL && box->intersects(aabb)) boxes->push_back(aabb); // } -// +// // AABB *Tile_SPU::getAABB(Level *level, int x, int y, int z) // { // return AABB::newTemp(x + xx0, y + yy0, z + zz0, x + xx1, y + yy1, z + zz1); // } -// +// bool Tile_SPU::isSolidRender(bool isServerLevel) { return true; @@ -239,67 +239,67 @@ Icon_SPU *Tile_SPU::getTexture(int face) // { // return mayPick(); // } -// +// // bool Tile_SPU::mayPick() // { // return true; // } -// +// // void Tile_SPU::tick(Level *level, int x, int y, int z, Random *random) // { // } -// +// // void Tile_SPU::animateTick(Level *level, int x, int y, int z, Random *random) // { // } -// +// // void Tile_SPU::destroy(Level *level, int x, int y, int z, int data) // { // } -// +// // void Tile_SPU::neighborChanged(Level *level, int x, int y, int z, int type) // { // } -// +// // void Tile_SPU::addLights(Level *level, int x, int y, int z) // { // } -// +// // int Tile_SPU::getTickDelay() // { // return 10; // } -// +// // void Tile_SPU::onPlace(Level *level, int x, int y, int z) // { // } -// +// // void Tile_SPU::onRemove(Level *level, int x, int y, int z) // { // } -// +// // int Tile_SPU::getResourceCount(Random *random) // { // return 1; // } -// +// // int Tile_SPU::getResource(int data, Random *random, int playerBonusLevel) // { // return id; // } -// -// float Tile_SPU::getDestroyProgress(std::shared_ptr player) +// +// float Tile_SPU::getDestroyProgress(shared_ptr player) // { // if (destroySpeed < 0) return 0; // if (!player->canDestroy(this)) return 1 / destroySpeed / 100.0f; // return (player->getDestroySpeed(this) / destroySpeed) / 30; // } -// +// // void Tile_SPU::spawnResources(Level *level, int x, int y, int z, int data, int playerBonusLevel) // { // spawnResources(level, x, y, z, data, 1, playerBonusLevel); // } -// +// // void Tile_SPU::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel) // { // if (level->isClientSide) return; @@ -309,24 +309,24 @@ Icon_SPU *Tile_SPU::getTexture(int face) // if (level->random->nextFloat() > odds) continue; // int type = getResource(data, level->random, playerBonusLevel); // if (type <= 0) continue; -// -// popResource(level, x, y, z, std::shared_ptr( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data) ) ) ); +// +// popResource(level, x, y, z, shared_ptr( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data) ) ) ); // } // } -// -// void Tile_SPU::popResource(Level *level, int x, int y, int z, std::shared_ptr itemInstance) +// +// void Tile_SPU::popResource(Level *level, int x, int y, int z, shared_ptr itemInstance) // { // if( level->isClientSide ) return; -// +// // float s = 0.7f; // double xo = level->random->nextFloat() * s + (1 - s) * 0.5; // double yo = level->random->nextFloat() * s + (1 - s) * 0.5; // double zo = level->random->nextFloat() * s + (1 - s) * 0.5; -// std::shared_ptr item = std::shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, itemInstance ) ); +// shared_ptr item = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, itemInstance ) ); // item->throwTime = 10; // level->addEntity(item); // } -// +// // // Brought forward for TU7 // void Tile_SPU::popExperience(Level *level, int x, int y, int z, int amount) // { @@ -336,182 +336,182 @@ Icon_SPU *Tile_SPU::getTexture(int face) // { // int newCount = ExperienceOrb::getExperienceValue(amount); // amount -= newCount; -// level->addEntity(std::shared_ptr( new ExperienceOrb(level, x + .5, y + .5, z + .5, newCount))); +// level->addEntity(shared_ptr( new ExperienceOrb(level, x + .5, y + .5, z + .5, newCount))); // } // } // } -// +// // int Tile_SPU::getSpawnResourcesAuxValue(int data) // { // return 0; // } -// -// float Tile_SPU::getExplosionResistance(std::shared_ptr source) +// +// float Tile_SPU::getExplosionResistance(shared_ptr source) // { // return explosionResistance / 5.0f; // } -// +// // HitResult *Tile_SPU::clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b) // { // EnterCriticalSection(&m_csShape); // updateShape(level, xt, yt, zt); -// +// // a = a->add(-xt, -yt, -zt); // b = b->add(-xt, -yt, -zt); -// +// // Vec3 *xh0 = a->clipX(b, xx0); // Vec3 *xh1 = a->clipX(b, xx1); -// +// // Vec3 *yh0 = a->clipY(b, yy0); // Vec3 *yh1 = a->clipY(b, yy1); -// +// // Vec3 *zh0 = a->clipZ(b, zz0); // Vec3 *zh1 = a->clipZ(b, zz1); -// +// // Vec3 *closest = NULL; -// +// // if (containsX(xh0) && (closest == NULL || a->distanceTo(xh0) < a->distanceTo(closest))) closest = xh0; // if (containsX(xh1) && (closest == NULL || a->distanceTo(xh1) < a->distanceTo(closest))) closest = xh1; // if (containsY(yh0) && (closest == NULL || a->distanceTo(yh0) < a->distanceTo(closest))) closest = yh0; // if (containsY(yh1) && (closest == NULL || a->distanceTo(yh1) < a->distanceTo(closest))) closest = yh1; // if (containsZ(zh0) && (closest == NULL || a->distanceTo(zh0) < a->distanceTo(closest))) closest = zh0; // if (containsZ(zh1) && (closest == NULL || a->distanceTo(zh1) < a->distanceTo(closest))) closest = zh1; -// +// // LeaveCriticalSection(&m_csShape); -// +// // if (closest == NULL) return NULL; -// +// // int face = -1; -// +// // if (closest == xh0) face = 4; // if (closest == xh1) face = 5; // if (closest == yh0) face = 0; // if (closest == yh1) face = 1; // if (closest == zh0) face = 2; // if (closest == zh1) face = 3; -// +// // return new HitResult(xt, yt, zt, face, closest->add(xt, yt, zt)); // } -// +// // bool Tile_SPU::containsX(Vec3 *v) // { // if( v == NULL) return false; // return v->y >= yy0 && v->y <= yy1 && v->z >= zz0 && v->z <= zz1; // } -// +// // bool Tile_SPU::containsY(Vec3 *v) // { // if( v == NULL) return false; // return v->x >= xx0 && v->x <= xx1 && v->z >= zz0 && v->z <= zz1; // } -// +// // bool Tile_SPU::containsZ(Vec3 *v) // { // if( v == NULL) return false; // return v->x >= xx0 && v->x <= xx1 && v->y >= yy0 && v->y <= yy1; // } -// +// // void Tile_SPU::wasExploded(Level *level, int x, int y, int z) // { // } -// +// int Tile_SPU::getRenderLayer() { return 0; } -// +// // bool Tile_SPU::mayPlace(Level *level, int x, int y, int z, int face) // { // return mayPlace(level, x, y, z); // } -// +// // bool Tile_SPU::mayPlace(Level *level, int x, int y, int z) // { // int t = level->getTile(x, y, z); // return t == 0 || Tile_SPU::tiles[t]->material->isReplaceable(); // } -// +// // // 4J-PB - Adding a TestUse for tooltip display // bool Tile_SPU::TestUse() // { // return false; // } -// -// bool Tile_SPU::TestUse(Level *level, int x, int y, int z, std::shared_ptr player) +// +// bool Tile_SPU::TestUse(Level *level, int x, int y, int z, shared_ptr player) // { // return false; // } -// -// bool Tile_SPU::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +// +// bool Tile_SPU::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param // { // return false; // } -// -// void Tile_SPU::stepOn(Level *level, int x, int y, int z, std::shared_ptr entity) +// +// void Tile_SPU::stepOn(Level *level, int x, int y, int z, shared_ptr entity) // { // } -// +// // void Tile_SPU::setPlacedOnFace(Level *level, int x, int y, int z, int face) // { // } -// +// // void Tile_SPU::prepareRender(Level *level, int x, int y, int z) // { // } -// -// void Tile_SPU::attack(Level *level, int x, int y, int z, std::shared_ptr player) +// +// void Tile_SPU::attack(Level *level, int x, int y, int z, shared_ptr player) // { // } -// -// void Tile_SPU::handleEntityInside(Level *level, int x, int y, int z, std::shared_ptr e, Vec3 *current) +// +// void Tile_SPU::handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current) // { // } -// +// void Tile_SPU::updateShape(ChunkRebuildData *level, int x, int y, int z, int forceData, TileEntity* forceEntity) // 4J added forceData, forceEntity param { } -// +// int Tile_SPU::getColor(ChunkRebuildData *level, int x, int y, int z) { return 0xffffff; } -// +// // int Tile_SPU::getColor(LevelSource *level, int x, int y, int z, int data) // { // return 0xffffff; // } -// +// // bool Tile_SPU::getSignal(LevelSource *level, int x, int y, int z) // { // return false; // } -// +// // bool Tile_SPU::getSignal(LevelSource *level, int x, int y, int z, int dir) // { // return false; // } -// +// // bool Tile_SPU::isSignalSource() // { // return false; // } -// -// void Tile_SPU::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +// +// void Tile_SPU::entityInside(Level *level, int x, int y, int z, shared_ptr entity) // { // } -// +// // bool Tile_SPU::getDirectSignal(Level *level, int x, int y, int z, int dir) // { // return false; // } -// +// void Tile_SPU::updateDefaultShape() { } -// -// void Tile_SPU::playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data) +// +// void Tile_SPU::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) // { // // 4J Stu - Special case - only record a crop destroy if is fully grown // if(id==Tile_SPU::crops_Id) @@ -525,14 +525,14 @@ void Tile_SPU::updateDefaultShape() // } // player->awardStat(Stats::totalBlocksMined, 1); // 4J : WESTY : Added for other award. // player->causeFoodExhaustion(FoodConstants::EXHAUSTION_MINE); -// +// // if( id == Tile_SPU::treeTrunk_Id ) // player->awardStat(Achievements::mineWood); -// -// +// +// // if (isCubeShaped() && !isEntityTile[id] && EnchantmentHelper::hasSilkTouch(player->inventory)) // { -// std::shared_ptr item = getSilkTouchItemInstance(data); +// shared_ptr item = getSilkTouchItemInstance(data); // if (item != NULL) // { // popResource(level, x, y, z, item); @@ -544,78 +544,78 @@ void Tile_SPU::updateDefaultShape() // spawnResources(level, x, y, z, data, playerBonusLevel); // } // } -// -// std::shared_ptr Tile_SPU::getSilkTouchItemInstance(int data) +// +// shared_ptr Tile_SPU::getSilkTouchItemInstance(int data) // { // int popData = 0; // if (id >= 0 && id < Item::items.length && Item::items[id]->isStackedByData()) // { // popData = data; // } -// return std::shared_ptr(new ItemInstance(id, 1, popData)); +// return shared_ptr(new ItemInstance(id, 1, popData)); // } -// +// // int Tile_SPU::getResourceCountForLootBonus(int bonusLevel, Random *random) // { // return getResourceCount(random); // } -// +// // bool Tile_SPU::canSurvive(Level *level, int x, int y, int z) // { // return true; // } -// -// void Tile_SPU::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +// +// void Tile_SPU::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) // { // } -// +// // Tile *Tile_SPU::setDescriptionId(unsigned int id) // { // this->descriptionId = id; // return this; // } -// +// // wstring Tile_SPU::getName() // { // return I18n::get(getDescriptionId() + L".name"); // } -// +// // unsigned int Tile_SPU::getDescriptionId(int iData /*= -1*/) // { // return descriptionId; // } -// +// // Tile *Tile_SPU::setUseDescriptionId(unsigned int id) // { // this->useDescriptionId = id; // return this; // } -// +// // unsigned int Tile_SPU::getUseDescriptionId() // { // return useDescriptionId; // } -// +// // void Tile_SPU::triggerEvent(Level *level, int x, int y, int z, int b0, int b1) // { // } -// +// // bool Tile_SPU::isCollectStatistics() // { // return collectStatistics; // } -// +// // Tile *Tile_SPU::setNotCollectStatistics() // { // collectStatistics = false; // return this; // } -// +// // int Tile_SPU::getPistonPushReaction() // { // return material->getPushReaction(); // } -// +// // // 4J - brought forward from 1.8.2 float Tile_SPU::getShadeBrightness(ChunkRebuildData *level, int x, int y, int z) { @@ -629,37 +629,37 @@ Tile_SPU* Tile_SPU::createFromID( int tileID ) if(m_tiles[tileID].id != -1) return &m_tiles[tileID]; - + #ifndef SN_TARGET_PS3_SPU app.DebugPrintf("missing tile ID %d\n", tileID); #else spu_print("missing tile ID %d\n", tileID); -#endif +#endif return &m_tiles[1]; } Material_SPU* Tile_SPU::getMaterial() { - int matID = ms_pTileData->materialIDs[id]; + int matID = ms_pTileData->materialIDs[id]; return &ms_pTileData->materials[matID]; } -// -// void Tile_SPU::fallOn(Level *level, int x, int y, int z, std::shared_ptr entity, float fallDistance) +// +// void Tile_SPU::fallOn(Level *level, int x, int y, int z, shared_ptr entity, float fallDistance) // { // } -// +// // void Tile_SPU::registerIcons(IconRegister *iconRegister) // { // icon = iconRegister->registerIcon(m_textureName); // } -// +// // wstring Tile_SPU::getTileItemIconName() // { // return L""; // } -// +// // Tile *Tile_SPU::setTextureName(const wstring &name) // { // m_textureName = name; @@ -690,7 +690,7 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(stairs_wood_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_stone_Id, StairTile_SPU); - CREATE_TILE_TYPE(stairs_bricks_Id, StairTile_SPU); + CREATE_TILE_TYPE(stairs_bricks_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_stoneBrickSmooth_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_netherBricks_Id, StairTile_SPU); CREATE_TILE_TYPE(stairs_sandstone_Id, StairTile_SPU); @@ -863,7 +863,7 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(goldOre_Id, Tile_SPU); // OreTile CREATE_TILE_TYPE(ironOre_Id, Tile_SPU); // OreTile CREATE_TILE_TYPE(coalOre_Id, Tile_SPU); // OreTile - CREATE_TILE_TYPE(lapisOre_Id, Tile_SPU); // OreTile + CREATE_TILE_TYPE(lapisOre_Id, Tile_SPU); // OreTile CREATE_TILE_TYPE(diamondOre_Id, Tile_SPU); // OreTile CREATE_TILE_TYPE(clay_Id, Tile_SPU); // ClayTile CREATE_TILE_TYPE(redStoneOre_Id, Tile_SPU); // RedStoneOreTile @@ -884,7 +884,7 @@ void Tile_SPU::initTilePointers() CREATE_TILE_TYPE(enderChest_Id, EnderChestTile_SPU); CREATE_TILE_TYPE(tripWireSource_Id, TripWireSourceTile_SPU); CREATE_TILE_TYPE(tripWire_Id, TripWireTile_SPU); -// +// CREATE_TILE_TYPE(emeraldBlock_Id, Tile_SPU); // MetalTile CREATE_TILE_TYPE(cobbleWall_Id, WallTile_SPU); CREATE_TILE_TYPE(flowerPot_Id, FlowerPotTile_SPU); diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.cpp b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.cpp index 3de39461..0912e33a 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.cpp +++ b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.cpp @@ -21,7 +21,7 @@ PlayStation(R)3 Programmer Tool Runtime Library 430.001 // #define SPU_HEAPSIZE (128*1024) // #define SPU_STACKSIZE (16*1024) -// +// // CELL_SPU_LS_PARAM(128*1024, 16*1024); // can't use #defines here as it seems to create an asm instruction @@ -132,7 +132,7 @@ bool LevelRenderer_FindNearestChunk_DataIn::MultiplayerChunkCache::getChunkEmpty } -bool LevelRenderer_FindNearestChunk_DataIn::CompressedTileStorage::isRenderChunkEmpty(int y) // y == 0, 16, 32... 112 (representing a 16 byte range) +bool LevelRenderer_FindNearestChunk_DataIn::CompressedTileStorage::isRenderChunkEmpty(int y) // y == 0, 16, 32... 112 (representing a 16 byte range) { int blockIdx; unsigned short *blockIndices = (unsigned short *)indicesAndData; @@ -162,30 +162,30 @@ void LevelRenderer_FindNearestChunk_DataIn::findNearestChunk() unsigned char* globalChunkFlags = (unsigned char*)alloca(numGlobalChunks); // 164K !!! DmaData_SPU::getAndWait(globalChunkFlags, (uintptr_t)pGlobalChunkFlags, sizeof(unsigned char)*numGlobalChunks); - + nearChunk = NULL; // Nearest chunk that is dirty veryNearCount = 0; int minDistSq = 0x7fffffff; // Distances to this chunk - + // Find nearest chunk that is dirty for( int p = 0; p < 4; p++ ) { // It's possible that the localplayers member can be set to NULL on the main thread when a player chooses to exit the game - // So take a reference to the player object now. As it is a std::shared_ptr it should live as long as we need it - PlayerData* player = &playerData[p]; + // So take a reference to the player object now. As it is a shared_ptr it should live as long as we need it + PlayerData* player = &playerData[p]; if( player->bValid == NULL ) continue; if( chunks[p] == NULL ) continue; if( level[p] == NULL ) continue; if( chunkLengths[p] != xChunks * zChunks * CHUNK_Y_COUNT ) continue; int px = (int)player->x; int py = (int)player->y; - int pz = (int)player->z; + int pz = (int)player->z; ClipChunk clipChunk[512]; for( int z = 0; z < zChunks; z++ ) - { + { uintptr_t ClipChunkX_PPU = (uintptr_t)&chunks[p][(z * yChunks + 0) * xChunks + 0]; DmaData_SPU::getAndWait(&clipChunk[0], ClipChunkX_PPU, sizeof(ClipChunk) * xChunks*CHUNK_Y_COUNT); for( int y = 0; y < CHUNK_Y_COUNT; y++ ) @@ -196,7 +196,7 @@ void LevelRenderer_FindNearestChunk_DataIn::findNearestChunk() // Get distance to this chunk - deliberately not calling the chunk's method of doing this to avoid overheads (passing entitie, type conversion etc.) that this involves int xd = pClipChunk->xm - px; - int yd = pClipChunk->ym - py; + int yd = pClipChunk->ym - py; int zd = pClipChunk->zm - pz; int distSq = xd * xd + yd * yd + zd * zd; int distSqWeighted = xd * xd + yd * yd * 4 + zd * zd; // Weighting against y to prioritise things in same x/z plane as player first @@ -257,12 +257,12 @@ void cellSpursJobQueueMain(CellSpursJobContext2 *pContext, CellSpursJob256 *pJob spu_print("LevelRenderer_cull [SPU#%u] start\n", idSpu); g_pSpursJobContext = pContext; - uint32_t eaDataIn = pJob->workArea.userData[0]; + uint32_t eaDataIn = pJob->workArea.userData[0]; // uint32_t eaDataOut =pJob->workArea.userData[1]; LevelRenderer_FindNearestChunk_DataIn dataIn; DmaData_SPU::getAndWait(&dataIn, eaDataIn, sizeof(LevelRenderer_FindNearestChunk_DataIn)); - + dataIn.findNearestChunk(); DmaData_SPU::putAndWait(&dataIn, eaDataIn, sizeof(LevelRenderer_FindNearestChunk_DataIn)); diff --git a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.h b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.h index a6c3ef2a..55ffcabd 100644 --- a/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.h +++ b/Minecraft.Client/PS3/SPU_Tasks/LevelRenderer_FindNearestChunk/LevelRenderer_FindNearestChunk.h @@ -23,7 +23,7 @@ public: int xm, ym, zm; }; - class AABB + class AABB { double x0, y0, z0; double x1, y1, z1; @@ -64,7 +64,7 @@ public: int id; int padding[1]; //public: - // vector > renderableTileEntities; // 4J - removed + // vector > renderableTileEntities; // 4J - removed private: void *globalRenderableTileEntities; @@ -86,7 +86,7 @@ public: MultiplayerChunkCache multiplayerChunkCache[4]; int lowerOffset; // offsets into the level class, we don't want to compile the entire class - int upperOffset; + int upperOffset; int xChunks, yChunks, zChunks; diff --git a/Minecraft.Client/PaintingRenderer.cpp b/Minecraft.Client/PaintingRenderer.cpp index b3a8acd2..4238f759 100644 --- a/Minecraft.Client/PaintingRenderer.cpp +++ b/Minecraft.Client/PaintingRenderer.cpp @@ -11,11 +11,11 @@ PaintingRenderer::PaintingRenderer() random = new Random(); } -void PaintingRenderer::render(std::shared_ptr _painting, double x, double y, double z, float rot, float a) +void PaintingRenderer::render(shared_ptr _painting, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr painting = dynamic_pointer_cast(_painting); - + shared_ptr painting = dynamic_pointer_cast(_painting); + random->setSeed(187); glPushMatrix(); @@ -33,7 +33,7 @@ void PaintingRenderer::render(std::shared_ptr _painting, double x, doubl glPopMatrix(); } -void PaintingRenderer::renderPainting(std::shared_ptr painting, int w, int h, int uo, int vo) +void PaintingRenderer::renderPainting(shared_ptr painting, int w, int h, int uo, int vo) { float xx0 = -w / 2.0f; float yy0 = -h / 2.0f; @@ -113,7 +113,7 @@ void PaintingRenderer::renderPainting(std::shared_ptr painting, int w, } -void PaintingRenderer::setBrightness(std::shared_ptr painting, float ss, float ya) +void PaintingRenderer::setBrightness(shared_ptr painting, float ss, float ya) { int x = Mth::floor(painting->x); int y = Mth::floor(painting->y + ya/16.0f); diff --git a/Minecraft.Client/PaintingRenderer.h b/Minecraft.Client/PaintingRenderer.h index f940c169..a750e128 100644 --- a/Minecraft.Client/PaintingRenderer.h +++ b/Minecraft.Client/PaintingRenderer.h @@ -11,9 +11,9 @@ private: public: PaintingRenderer(); // 4J -added - virtual void render(std::shared_ptr _painting, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _painting, double x, double y, double z, float rot, float a); private: - void renderPainting(std::shared_ptr painting, int w, int h, int uo, int vo); - void setBrightness(std::shared_ptr painting, float ss, float ya); + void renderPainting(shared_ptr painting, int w, int h, int uo, int vo); + void setBrightness(shared_ptr painting, float ss, float ya); }; diff --git a/Minecraft.Client/Particle.cpp b/Minecraft.Client/Particle.cpp index 30f14878..90ef93bc 100644 --- a/Minecraft.Client/Particle.cpp +++ b/Minecraft.Client/Particle.cpp @@ -61,7 +61,7 @@ Particle::Particle(Level *level, double x, double y, double z, double xa, double yd = yd / dd * speed * 0.4f + 0.1f; zd = zd / dd * speed * 0.4f;} -std::shared_ptr Particle::setPower(float power) +shared_ptr Particle::setPower(float power) { xd *= power; yd = (yd - 0.1f) * power + 0.1f; @@ -69,7 +69,7 @@ std::shared_ptr Particle::setPower(float power) return dynamic_pointer_cast( shared_from_this() ); } -std::shared_ptr Particle::scale(float scale) +shared_ptr Particle::scale(float scale) { setSize(0.2f * scale, 0.2f * scale); size *= scale; @@ -168,9 +168,9 @@ void Particle::render(Tesselator *t, float a, float xa, float ya, float za, floa #ifdef __PSVITA__ // AP - this will set up the 4 vertices in half the time. t->tileParticleQuad((float)(x - xa * r - xa2 * r), (float)( y - ya * r), (float)( z - za * r - za2 * r), (float)( u1), (float)( v1), - (float)(x - xa * r + xa2 * r), (float)( y + ya * r), (float)( z - za * r + za2 * r), (float)( u1), (float)( v0), - (float)(x + xa * r + xa2 * r), (float)( y + ya * r), (float)( z + za * r + za2 * r), (float)( u0), (float)( v0), - (float)(x + xa * r - xa2 * r), (float)( y - ya * r), (float)( z + za * r - za2 * r), (float)( u0), (float)( v1), + (float)(x - xa * r + xa2 * r), (float)( y + ya * r), (float)( z - za * r + za2 * r), (float)( u1), (float)( v0), + (float)(x + xa * r + xa2 * r), (float)( y + ya * r), (float)( z + za * r + za2 * r), (float)( u0), (float)( v0), + (float)(x + xa * r - xa2 * r), (float)( y - ya * r), (float)( z + za * r - za2 * r), (float)( u0), (float)( v1), rCol * br, gCol * br, bCol * br, alpha); #else t->color(rCol * br, gCol * br, bCol * br, alpha); diff --git a/Minecraft.Client/Particle.h b/Minecraft.Client/Particle.h index a56c2e4d..d9b0ba3a 100644 --- a/Minecraft.Client/Particle.h +++ b/Minecraft.Client/Particle.h @@ -28,8 +28,8 @@ protected: Particle(Level *level, double x, double y, double z); public: Particle(Level *level, double x, double y, double z, double xa, double ya, double za); - virtual std::shared_ptr setPower(float power); - virtual std::shared_ptr scale(float scale); + virtual shared_ptr setPower(float power); + virtual shared_ptr scale(float scale); void setColor(float r, float g, float b); void setAlpha(float alpha); float getRedCol(); diff --git a/Minecraft.Client/ParticleEngine.cpp b/Minecraft.Client/ParticleEngine.cpp index 12ef4a87..3a34253a 100644 --- a/Minecraft.Client/ParticleEngine.cpp +++ b/Minecraft.Client/ParticleEngine.cpp @@ -18,7 +18,7 @@ ParticleEngine::ParticleEngine(Level *level, Textures *textures) this->level = level; } this->textures = textures; - + this->random = new Random(); } @@ -27,7 +27,7 @@ ParticleEngine::~ParticleEngine() delete random; } -void ParticleEngine::add(std::shared_ptr p) +void ParticleEngine::add(shared_ptr p) { int t = p->getParticleTexture(); int l = p->level->dimension->id == 0 ? 0 : ( p->level->dimension->id == -1 ? 1 : 2); @@ -43,7 +43,7 @@ void ParticleEngine::tick() { for (unsigned int i = 0; i < particles[l][tt].size(); i++) { - std::shared_ptr p = particles[l][tt][i]; + shared_ptr p = particles[l][tt][i]; p->tick(); if (p->removed) { @@ -56,7 +56,7 @@ void ParticleEngine::tick() } } -void ParticleEngine::render(std::shared_ptr player, float a) +void ParticleEngine::render(shared_ptr player, float a) { // 4J - change brought forward from 1.2.3 float xa = Camera::xa; @@ -99,7 +99,7 @@ void ParticleEngine::render(std::shared_ptr player, float a) t->end(); t->begin(); } - std::shared_ptr p = particles[l][tt][i]; + shared_ptr p = particles[l][tt][i]; if (SharedConstants::TEXTURE_LIGHTING) // 4J - change brought forward from 1.8.2 { @@ -118,7 +118,7 @@ void ParticleEngine::render(std::shared_ptr player, float a) } -void ParticleEngine::renderLit(std::shared_ptr player, float a) +void ParticleEngine::renderLit(shared_ptr player, float a) { // 4J - added. We call this before ParticleEngine::render in the general render per player, so if we // don't set this here then the offsets will be from the previous player - a single frame lag for the @@ -142,7 +142,7 @@ void ParticleEngine::renderLit(std::shared_ptr player, float a) Tesselator *t = Tesselator::getInstance(); for (unsigned int i = 0; i < particles[l][tt].size(); i++) { - std::shared_ptr p = particles[l][tt][i]; + shared_ptr p = particles[l][tt][i]; if (SharedConstants::TEXTURE_LIGHTING) // 4J - change brought forward from 1.8.2 { @@ -182,7 +182,7 @@ void ParticleEngine::destroy(int x, int y, int z, int tid, int data) double yp = y + (yy + 0.5) / SD; double zp = z + (zz + 0.5) / SD; int face = random->nextInt(6); - add(( std::shared_ptr(new TerrainParticle(level, xp, yp, zp, xp - x - 0.5f, yp - y - 0.5f, zp - z - 0.5f, tile, face, data, textures) ) )->init(x, y, z, data)); + add(( shared_ptr(new TerrainParticle(level, xp, yp, zp, xp - x - 0.5f, yp - y - 0.5f, zp - z - 0.5f, tile, face, data, textures) ) )->init(x, y, z, data)); } } @@ -201,7 +201,7 @@ void ParticleEngine::crack(int x, int y, int z, int face) if (face == 3) zp = z + tile->getShapeZ1() + r; if (face == 4) xp = x + tile->getShapeX0() - r; if (face == 5) xp = x + tile->getShapeX1() + r; - add(( std::shared_ptr(new TerrainParticle(level, xp, yp, zp, 0, 0, 0, tile, face, level->getData(x, y, z), textures) ) )->init(x, y, z, level->getData(x, y, z))->setPower(0.2f)->scale(0.6f)); + add(( shared_ptr(new TerrainParticle(level, xp, yp, zp, 0, 0, 0, tile, face, level->getData(x, y, z), textures) ) )->init(x, y, z, level->getData(x, y, z))->setPower(0.2f)->scale(0.6f)); } diff --git a/Minecraft.Client/ParticleEngine.h b/Minecraft.Client/ParticleEngine.h index 0fee7a16..09e3685b 100644 --- a/Minecraft.Client/ParticleEngine.h +++ b/Minecraft.Client/ParticleEngine.h @@ -26,17 +26,17 @@ public: protected: Level *level; private: - deque > particles[3][TEXTURE_COUNT]; // 4J made two arrays to cope with simultaneous two dimensions + deque > particles[3][TEXTURE_COUNT]; // 4J made two arrays to cope with simultaneous two dimensions Textures *textures; Random *random; public: ParticleEngine(Level *level, Textures *textures); ~ParticleEngine(); - void add(std::shared_ptr p); + void add(shared_ptr p); void tick(); - void render(std::shared_ptr player, float a); - void renderLit(std::shared_ptr player, float a); + void render(shared_ptr player, float a); + void renderLit(shared_ptr player, float a); void setLevel(Level *level); void destroy(int x, int y, int z, int tid, int data); void crack(int x, int y, int z, int face); diff --git a/Minecraft.Client/PendingConnection.cpp b/Minecraft.Client/PendingConnection.cpp index f8f61bdb..841863b6 100644 --- a/Minecraft.Client/PendingConnection.cpp +++ b/Minecraft.Client/PendingConnection.cpp @@ -61,7 +61,7 @@ void PendingConnection::disconnect(DisconnectPacket::eDisconnectReason reason) // try { // 4J - removed try/catch // logger.info("Disconnecting " + getName() + ": " + reason); app.DebugPrintf("Pending connection disconnect: %d\n", reason ); - connection->send( std::shared_ptr( new DisconnectPacket(reason) ) ); + connection->send( shared_ptr( new DisconnectPacket(reason) ) ); connection->sendAndQuit(); done = true; // } catch (Exception e) { @@ -69,7 +69,7 @@ void PendingConnection::disconnect(DisconnectPacket::eDisconnectReason reason) // } } -void PendingConnection::handlePreLogin(std::shared_ptr packet) +void PendingConnection::handlePreLogin(shared_ptr packet) { if (packet->m_netcodeVersion != MINECRAFT_NET_VERSION) { @@ -103,10 +103,10 @@ void PendingConnection::sendPreLoginResponse() PlayerList *playerList = MinecraftServer::getInstance()->getPlayers(); for(AUTO_VAR(it, playerList->players.begin()); it != playerList->players.end(); ++it) { - std::shared_ptr player = *it; + shared_ptr player = *it; // If the offline Xuid is invalid but the online one is not then that's guest which we should ignore // If the online Xuid is invalid but the offline one is not then we are definitely an offline game so dont care about UGC - + // PADDY - this is failing when a local player with chat restrictions joins an online game if( player != NULL && player->connection->m_offlineXUID != INVALID_XUID && player->connection->m_onlineXUID != INVALID_XUID ) @@ -128,16 +128,16 @@ void PendingConnection::sendPreLoginResponse() if (false)// server->onlineMode) // 4J - removed { loginKey = L"TOIMPLEMENT"; // 4J - todo Long.toHexString(random.nextLong()); - connection->send( std::shared_ptr( new PreLoginPacket(loginKey, ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion, szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex) ) ); + connection->send( shared_ptr( new PreLoginPacket(loginKey, ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion, szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex) ) ); } else #endif { - connection->send( std::shared_ptr( new PreLoginPacket(L"-", ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion,szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex, server->m_texturePackId) ) ); + connection->send( shared_ptr( new PreLoginPacket(L"-", ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion,szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex, server->m_texturePackId) ) ); } } -void PendingConnection::handleLogin(std::shared_ptr packet) +void PendingConnection::handleLogin(shared_ptr packet) { // printf("Server: handleLogin\n"); //name = packet->userName; @@ -173,7 +173,7 @@ void PendingConnection::handleLogin(std::shared_ptr packet) //else { //4J - removed -#if 0 +#if 0 new Thread() { public void run() { try { @@ -198,7 +198,7 @@ void PendingConnection::handleLogin(std::shared_ptr packet) } -void PendingConnection::handleAcceptedLogin(std::shared_ptr packet) +void PendingConnection::handleAcceptedLogin(shared_ptr packet) { if(packet->m_ugcPlayersVersion != server->m_ugcPlayersVersion) { @@ -211,7 +211,7 @@ void PendingConnection::handleAcceptedLogin(std::shared_ptr packet) PlayerUID playerXuid = packet->m_offlineXuid; if(playerXuid == INVALID_XUID) playerXuid = packet->m_onlineXuid; - std::shared_ptr playerEntity = server->getPlayers()->getPlayerForLogin(this, name, playerXuid,packet->m_onlineXuid); + shared_ptr playerEntity = server->getPlayers()->getPlayerForLogin(this, name, playerXuid,packet->m_onlineXuid); if (playerEntity != NULL) { server->getPlayers()->placeNewPlayer(connection, playerEntity, packet); @@ -227,12 +227,12 @@ void PendingConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, done = true; } -void PendingConnection::handleGetInfo(std::shared_ptr packet) +void PendingConnection::handleGetInfo(shared_ptr packet) { //try { - //String message = server->motd + "�" + server->players->getPlayerCount() + "�" + server->players->getMaxPlayers(); + //String message = server->motd + "" + server->players->getPlayerCount() + "" + server->players->getMaxPlayers(); //connection->send(new DisconnectPacket(message)); - connection->send(std::shared_ptr(new DisconnectPacket(DisconnectPacket::eDisconnect_ServerFull) ) ); + connection->send(shared_ptr(new DisconnectPacket(DisconnectPacket::eDisconnect_ServerFull) ) ); connection->sendAndQuit(); server->connection->removeSpamProtection(connection->getSocket()); done = true; @@ -241,17 +241,17 @@ void PendingConnection::handleGetInfo(std::shared_ptr packet) //} } -void PendingConnection::handleKeepAlive(std::shared_ptr packet) +void PendingConnection::handleKeepAlive(shared_ptr packet) { // Ignore } -void PendingConnection::onUnhandledPacket(std::shared_ptr packet) +void PendingConnection::onUnhandledPacket(shared_ptr packet) { disconnect(DisconnectPacket::eDisconnect_UnexpectedPacket); } -void PendingConnection::send(std::shared_ptr packet) +void PendingConnection::send(shared_ptr packet) { connection->send(packet); } diff --git a/Minecraft.Client/PendingConnection.h b/Minecraft.Client/PendingConnection.h index 45d8163d..02d706f9 100644 --- a/Minecraft.Client/PendingConnection.h +++ b/Minecraft.Client/PendingConnection.h @@ -24,7 +24,7 @@ private: MinecraftServer *server; int _tick; wstring name; - std::shared_ptr acceptedLogin; + shared_ptr acceptedLogin; wstring loginKey; public: @@ -32,14 +32,14 @@ public: ~PendingConnection(); void tick(); void disconnect(DisconnectPacket::eDisconnectReason reason); - virtual void handlePreLogin(std::shared_ptr packet); - virtual void handleLogin(std::shared_ptr packet); - virtual void handleAcceptedLogin(std::shared_ptr packet); + virtual void handlePreLogin(shared_ptr packet); + virtual void handleLogin(shared_ptr packet); + virtual void handleAcceptedLogin(shared_ptr packet); virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); - virtual void handleGetInfo(std::shared_ptr packet); - virtual void handleKeepAlive(std::shared_ptr packet); - virtual void onUnhandledPacket(std::shared_ptr packet); - void send(std::shared_ptr packet); + virtual void handleGetInfo(shared_ptr packet); + virtual void handleKeepAlive(shared_ptr packet); + virtual void onUnhandledPacket(shared_ptr packet); + void send(shared_ptr packet); wstring getName(); virtual bool isServerPacketListener(); diff --git a/Minecraft.Client/PigRenderer.cpp b/Minecraft.Client/PigRenderer.cpp index 7e50fe35..eb78cd20 100644 --- a/Minecraft.Client/PigRenderer.cpp +++ b/Minecraft.Client/PigRenderer.cpp @@ -7,10 +7,10 @@ PigRenderer::PigRenderer(Model *model, Model *armor, float shadow) : MobRenderer setArmor(armor); } -int PigRenderer::prepareArmor(std::shared_ptr _pig, int layer, float a) +int PigRenderer::prepareArmor(shared_ptr _pig, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr pig = dynamic_pointer_cast(_pig); + shared_ptr pig = dynamic_pointer_cast(_pig); MemSect(31); bindTexture(TN_MOB_SADDLE); // 4J was L"/mob/saddle.png" @@ -18,7 +18,7 @@ int PigRenderer::prepareArmor(std::shared_ptr _pig, int layer, float a) return (layer == 0 && pig->hasSaddle()) ? 1 : -1; } -void PigRenderer::render(std::shared_ptr mob, double x, double y, double z, float rot, float a) +void PigRenderer::render(shared_ptr mob, double x, double y, double z, float rot, float a) { MobRenderer::render(mob, x, y, z, rot, a); -} \ No newline at end of file +} \ No newline at end of file diff --git a/Minecraft.Client/PigRenderer.h b/Minecraft.Client/PigRenderer.h index 9dc3edfa..e674b508 100644 --- a/Minecraft.Client/PigRenderer.h +++ b/Minecraft.Client/PigRenderer.h @@ -6,8 +6,8 @@ class PigRenderer : public MobRenderer public: PigRenderer(Model *model, Model *armor, float shadow); protected: - virtual int prepareArmor(std::shared_ptr _pig, int layer, float a); + virtual int prepareArmor(shared_ptr _pig, int layer, float a); public: - virtual void render(std::shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/PistonPieceRenderer.cpp b/Minecraft.Client/PistonPieceRenderer.cpp index b33df7b2..1ce084cf 100644 --- a/Minecraft.Client/PistonPieceRenderer.cpp +++ b/Minecraft.Client/PistonPieceRenderer.cpp @@ -12,10 +12,10 @@ PistonPieceRenderer::PistonPieceRenderer() tileRenderer = NULL; } -void PistonPieceRenderer::render(std::shared_ptr _entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +void PistonPieceRenderer::render(shared_ptr _entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr entity = dynamic_pointer_cast(_entity); + shared_ptr entity = dynamic_pointer_cast(_entity); Tile *tile = Tile::tiles[entity->getId()]; if (tile != NULL && entity->getProgress(a) <= 1) // 4J - changed condition from < to <= as our chunk update is async to main thread and so we can have to render these with progress of 1 @@ -60,7 +60,7 @@ void PistonPieceRenderer::render(std::shared_ptr _entity, double x, } } - + void PistonPieceRenderer::onNewLevel(Level *level) { delete tileRenderer; diff --git a/Minecraft.Client/PistonPieceRenderer.h b/Minecraft.Client/PistonPieceRenderer.h index 7a2a3b7d..830ddd43 100644 --- a/Minecraft.Client/PistonPieceRenderer.h +++ b/Minecraft.Client/PistonPieceRenderer.h @@ -2,13 +2,13 @@ class PistonPieceEntity; class TileRenderer; -class PistonPieceRenderer : public TileEntityRenderer +class PistonPieceRenderer : public TileEntityRenderer { private: TileRenderer *tileRenderer; public: PistonPieceRenderer(); - virtual void render(std::shared_ptr _entity, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param + virtual void render(shared_ptr _entity, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param virtual void onNewLevel(Level *level); }; diff --git a/Minecraft.Client/PlayerChunkMap.cpp b/Minecraft.Client/PlayerChunkMap.cpp index 06bdcf73..1c7516cf 100644 --- a/Minecraft.Client/PlayerChunkMap.cpp +++ b/Minecraft.Client/PlayerChunkMap.cpp @@ -44,12 +44,12 @@ void PlayerChunkMap::flagEntitiesToBeRemoved(unsigned int *flags, bool *flagToBe { for(AUTO_VAR(it,players.begin()); it != players.end(); it++) { - std::shared_ptr serverPlayer = *it; + shared_ptr serverPlayer = *it; serverPlayer->flagEntitiesToBeRemoved(flags, flagToBeRemoved); } } -void PlayerChunkMap::PlayerChunk::add(std::shared_ptr player, bool sendPacket /*= true*/) +void PlayerChunkMap::PlayerChunk::add(shared_ptr player, bool sendPacket /*= true*/) { //app.DebugPrintf("--- Adding player to chunk x=%d\tz=%d\n",x, z); if (find(players.begin(),players.end(),player) != players.end()) @@ -66,7 +66,7 @@ void PlayerChunkMap::PlayerChunk::add(std::shared_ptr player, bool player->seenChunks.insert(pos); // 4J Added the sendPacket check. See PlayerChunkMap::add for the usage - if( sendPacket ) player->connection->send( std::shared_ptr( new ChunkVisibilityPacket(pos.x, pos.z, true) ) ); + if( sendPacket ) player->connection->send( shared_ptr( new ChunkVisibilityPacket(pos.x, pos.z, true) ) ); players.push_back(player); @@ -77,7 +77,7 @@ void PlayerChunkMap::PlayerChunk::add(std::shared_ptr player, bool #endif } -void PlayerChunkMap::PlayerChunk::remove(std::shared_ptr player) +void PlayerChunkMap::PlayerChunk::remove(shared_ptr player) { PlayerChunkMap::PlayerChunk *toDelete = NULL; @@ -121,7 +121,7 @@ void PlayerChunkMap::PlayerChunk::remove(std::shared_ptr player) { for( AUTO_VAR(it, players.begin()); it < players.end(); ++it ) { - std::shared_ptr currPlayer = *it; + shared_ptr currPlayer = *it; INetworkPlayer *currNetPlayer = currPlayer->connection->getNetworkPlayer(); if( currNetPlayer != NULL && currNetPlayer->IsSameSystem( thisNetPlayer ) && currPlayer->seenChunks.find(pos) != currPlayer->seenChunks.end() ) { @@ -132,7 +132,7 @@ void PlayerChunkMap::PlayerChunk::remove(std::shared_ptr player) if(noOtherPlayersFound) { //wprintf(L"Sending ChunkVisiblity packet false for chunk (%d,%d) to player %ls\n", x, z, player->name.c_str() ); - player->connection->send( std::shared_ptr( new ChunkVisibilityPacket(pos.x, pos.z, false) ) ); + player->connection->send( shared_ptr( new ChunkVisibilityPacket(pos.x, pos.z, false) ) ); } } else @@ -181,12 +181,12 @@ void PlayerChunkMap::PlayerChunk::prioritiseTileChanges() prioritised = true; } -void PlayerChunkMap::PlayerChunk::broadcast(std::shared_ptr packet) +void PlayerChunkMap::PlayerChunk::broadcast(shared_ptr packet) { - vector< std::shared_ptr > sentTo; + vector< shared_ptr > sentTo; for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr player = players[i]; + shared_ptr player = players[i]; // 4J - don't send to a player we've already sent this data to that shares the same machine. TileUpdatePacket, // ChunkTilesUpdatePacket and SignUpdatePacket all used to limit themselves to sending once to each machine @@ -205,7 +205,7 @@ void PlayerChunkMap::PlayerChunk::broadcast(std::shared_ptr packet) { for(unsigned int j = 0; j < sentTo.size(); j++ ) { - std::shared_ptr player2 = sentTo[j]; + shared_ptr player2 = sentTo[j]; INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) { @@ -244,7 +244,7 @@ void PlayerChunkMap::PlayerChunk::broadcast(std::shared_ptr packet) for( int i = 0; i < parent->level->getServer()->getPlayers()->players.size(); i++ ) { - std::shared_ptr player = parent->level->getServer()->getPlayers()->players[i]; + shared_ptr player = parent->level->getServer()->getPlayers()->players[i]; // Don't worry about local players, they get all their updates through sharing level with the server anyway if ( player->connection == NULL ) continue; if( player->connection->isLocal() ) continue; @@ -267,7 +267,7 @@ void PlayerChunkMap::PlayerChunk::broadcast(std::shared_ptr packet) { for(unsigned int j = 0; j < sentTo.size(); j++ ) { - std::shared_ptr player2 = sentTo[j]; + shared_ptr player2 = sentTo[j]; INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) { @@ -299,7 +299,7 @@ bool PlayerChunkMap::PlayerChunk::broadcastChanges(bool allowRegionUpdate) int x = pos.x * 16 + xChangeMin; int y = yChangeMin; int z = pos.z * 16 + zChangeMin; - broadcast( std::shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + broadcast( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); if (level->isEntityTile(x, y, z)) { broadcast(level->getTileEntity(x, y, z)); @@ -329,8 +329,8 @@ bool PlayerChunkMap::PlayerChunk::broadcastChanges(bool allowRegionUpdate) // Block region update packets can only encode ys in a range of 1 - 256 if( ys > 256 ) ys = 256; - broadcast( std::shared_ptr( new BlockRegionUpdatePacket(xp, yp, zp, xs, ys, zs, level) ) ); - vector > *tes = level->getTileEntitiesInRegion(xp, yp, zp, xp + xs, yp + ys, zp + zs); + broadcast( shared_ptr( new BlockRegionUpdatePacket(xp, yp, zp, xs, ys, zs, level) ) ); + vector > *tes = level->getTileEntitiesInRegion(xp, yp, zp, xp + xs, yp + ys, zp + zs); for (unsigned int i = 0; i < tes->size(); i++) { broadcast(tes->at(i)); @@ -342,7 +342,7 @@ bool PlayerChunkMap::PlayerChunk::broadcastChanges(bool allowRegionUpdate) else { // 4J As we only get here if changes is less than MAX_CHANGES_BEFORE_RESEND (10) we only need to send a byte value in the packet - broadcast( std::shared_ptr( new ChunkTilesUpdatePacket(pos.x, pos.z, changedTiles, (byte)changes, level) ) ); + broadcast( shared_ptr( new ChunkTilesUpdatePacket(pos.x, pos.z, changedTiles, (byte)changes, level) ) ); for (int i = 0; i < changes; i++) { int x = pos.x * 16 + ((changedTiles[i] >> 12) & 15); @@ -361,11 +361,11 @@ bool PlayerChunkMap::PlayerChunk::broadcastChanges(bool allowRegionUpdate) return didRegionUpdate; } -void PlayerChunkMap::PlayerChunk::broadcast(std::shared_ptr te) +void PlayerChunkMap::PlayerChunk::broadcast(shared_ptr te) { if (te != NULL) { - std::shared_ptr p = te->getUpdatePacket(); + shared_ptr p = te->getUpdatePacket(); if (p != NULL) { broadcast(p); @@ -458,7 +458,7 @@ PlayerChunkMap::PlayerChunk *PlayerChunkMap::getChunk(int x, int z, bool create) // 4J - added. If a chunk exists, add a player to it straight away. If it doesn't exist, // queue a request for it to be created. -void PlayerChunkMap::getChunkAndAddPlayer(int x, int z, std::shared_ptr player) +void PlayerChunkMap::getChunkAndAddPlayer(int x, int z, shared_ptr player) { int64_t id = (x + 0x7fffffffLL) | ((z + 0x7fffffffLL) << 32); AUTO_VAR(it, chunks.find(id)); @@ -475,7 +475,7 @@ void PlayerChunkMap::getChunkAndAddPlayer(int x, int z, std::shared_ptr player) +void PlayerChunkMap::getChunkAndRemovePlayer(int x, int z, shared_ptr player) { for( AUTO_VAR(it, addRequests.begin()); it != addRequests.end(); it++ ) { @@ -497,7 +497,7 @@ void PlayerChunkMap::getChunkAndRemovePlayer(int x, int z, std::shared_ptr player) +void PlayerChunkMap::tickAddRequests(shared_ptr player) { if( addRequests.size() ) { @@ -533,7 +533,7 @@ void PlayerChunkMap::tickAddRequests(std::shared_ptr player) } } -void PlayerChunkMap::broadcastTileUpdate(std::shared_ptr packet, int x, int y, int z) +void PlayerChunkMap::broadcastTileUpdate(shared_ptr packet, int x, int y, int z) { int xc = x >> 4; int zc = z >> 4; @@ -576,7 +576,7 @@ void PlayerChunkMap::prioritiseTileChanges(int x, int y, int z) } } -void PlayerChunkMap::add(std::shared_ptr player) +void PlayerChunkMap::add(shared_ptr player) { static int direction[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, {0, -1} }; @@ -649,7 +649,7 @@ void PlayerChunkMap::add(std::shared_ptr player) } // CraftBukkit end - player->connection->send( std::shared_ptr( new ChunkVisibilityAreaPacket(minX, maxX, minZ, maxZ) ) ); + player->connection->send( shared_ptr( new ChunkVisibilityAreaPacket(minX, maxX, minZ, maxZ) ) ); #ifdef _LARGE_WORLDS getLevel()->cache->dontDrop(xc,zc); @@ -659,7 +659,7 @@ void PlayerChunkMap::add(std::shared_ptr player) } -void PlayerChunkMap::remove(std::shared_ptr player) +void PlayerChunkMap::remove(shared_ptr player) { int xc = ((int) player->lastMoveX) >> 4; int zc = ((int) player->lastMoveZ) >> 4; @@ -702,7 +702,7 @@ bool PlayerChunkMap::chunkInRange(int x, int z, int xc, int zc) // 4J - have changed this so that we queue requests to add the player to chunks if they // need to be created, so that we aren't creating potentially 20 chunks per player per tick -void PlayerChunkMap::move(std::shared_ptr player) +void PlayerChunkMap::move(shared_ptr player) { int xc = ((int) player->x) >> 4; int zc = ((int) player->z) >> 4; @@ -744,7 +744,7 @@ int PlayerChunkMap::getMaxRange() return radius * 16 - 16; } -bool PlayerChunkMap::isPlayerIn(std::shared_ptr player, int xChunk, int zChunk) +bool PlayerChunkMap::isPlayerIn(shared_ptr player, int xChunk, int zChunk) { PlayerChunk *chunk = getChunk(xChunk, zChunk, false); @@ -775,7 +775,7 @@ void PlayerChunkMap::setRadius(int newRadius) PlayerList* players = level->getServer()->getPlayerList(); for( int i = 0;i < players->players.size();i += 1 ) { - std::shared_ptr player = players->players[i]; + shared_ptr player = players->players[i]; if( player->level == level ) { int xc = ((int) player->x) >> 4; diff --git a/Minecraft.Client/PlayerChunkMap.h b/Minecraft.Client/PlayerChunkMap.h index 5e87934b..08cda2a7 100644 --- a/Minecraft.Client/PlayerChunkMap.h +++ b/Minecraft.Client/PlayerChunkMap.h @@ -25,8 +25,8 @@ public: { public: int x,z; - std::shared_ptr player; - PlayerChunkAddRequest(int x, int z, std::shared_ptr player ) : x(x), z(z), player(player) {} + shared_ptr player; + PlayerChunkAddRequest(int x, int z, shared_ptr player ) : x(x), z(z), player(player) {} }; class PlayerChunk @@ -34,7 +34,7 @@ public: friend class PlayerChunkMap; private: PlayerChunkMap *parent; // 4J added - vector > players; + vector > players; //int x, z; ChunkPos pos; @@ -51,25 +51,25 @@ public: ~PlayerChunk(); // 4J Added sendPacket param so we can aggregate the initial send into one much smaller packet - void add(std::shared_ptr player, bool sendPacket = true); - void remove(std::shared_ptr player); + void add(shared_ptr player, bool sendPacket = true); + void remove(shared_ptr player); void tileChanged(int x, int y, int z); void prioritiseTileChanges(); // 4J added - void broadcast(std::shared_ptr packet); + void broadcast(shared_ptr packet); bool broadcastChanges(bool allowRegionUpdate); // 4J - added parm private: - void broadcast(std::shared_ptr te); + void broadcast(shared_ptr te); }; public: - vector > players; + vector > players; void flagEntitiesToBeRemoved(unsigned int *flags, bool *removedFound); // 4J added private: unordered_map chunks; // 4J - was LongHashMap vector changedChunks; vector addRequests; // 4J added - void tickAddRequests(std::shared_ptr player); // 4J added + void tickAddRequests(shared_ptr player); // 4J added ServerLevel *level; int radius; @@ -83,21 +83,21 @@ public: bool hasChunk(int x, int z); private: PlayerChunk *getChunk(int x, int z, bool create); - void getChunkAndAddPlayer(int x, int z, std::shared_ptr player); // 4J added - void getChunkAndRemovePlayer(int x, int z, std::shared_ptr player); // 4J added + void getChunkAndAddPlayer(int x, int z, shared_ptr player); // 4J added + void getChunkAndRemovePlayer(int x, int z, shared_ptr player); // 4J added public: - void broadcastTileUpdate(std::shared_ptr packet, int x, int y, int z); + void broadcastTileUpdate(shared_ptr packet, int x, int y, int z); void tileChanged(int x, int y, int z); bool isTrackingTile(int x, int y, int z); // 4J added void prioritiseTileChanges(int x, int y, int z); // 4J added - void add(std::shared_ptr player); - void remove(std::shared_ptr player); + void add(shared_ptr player); + void remove(shared_ptr player); private: bool chunkInRange(int x, int z, int xc, int zc); public: - void move(std::shared_ptr player); + void move(shared_ptr player); int getMaxRange(); - bool isPlayerIn(std::shared_ptr player, int xChunk, int zChunk); + bool isPlayerIn(shared_ptr player, int xChunk, int zChunk); static int convertChunkRangeToBlock(int radius); // AP added for Vita diff --git a/Minecraft.Client/PlayerCloudParticle.cpp b/Minecraft.Client/PlayerCloudParticle.cpp index ca7e9d90..6976fbab 100644 --- a/Minecraft.Client/PlayerCloudParticle.cpp +++ b/Minecraft.Client/PlayerCloudParticle.cpp @@ -49,7 +49,7 @@ void PlayerCloudParticle::tick() xd *= 0.96f; yd *= 0.96f; zd *= 0.96f; - std::shared_ptr p = level->getNearestPlayer(shared_from_this(), 2); + shared_ptr p = level->getNearestPlayer(shared_from_this(), 2); if (p != NULL) { if (y > p->bb->y0) diff --git a/Minecraft.Client/PlayerConnection.cpp b/Minecraft.Client/PlayerConnection.cpp index 393ae105..f0e538a8 100644 --- a/Minecraft.Client/PlayerConnection.cpp +++ b/Minecraft.Client/PlayerConnection.cpp @@ -34,7 +34,7 @@ Random PlayerConnection::random; -PlayerConnection::PlayerConnection(MinecraftServer *server, Connection *connection, std::shared_ptr player) +PlayerConnection::PlayerConnection(MinecraftServer *server, Connection *connection, shared_ptr player) { // 4J - added initialisers done = false; @@ -93,12 +93,12 @@ void PlayerConnection::tick() lastKeepAliveTick = tickCount; lastKeepAliveTime = System::nanoTime() / 1000000; lastKeepAliveId = random.nextInt(); - send( std::shared_ptr( new KeepAlivePacket(lastKeepAliveId) ) ); + send( shared_ptr( new KeepAlivePacket(lastKeepAliveId) ) ); } // if (!didTick) { // player->doTick(false); // } - + if (chatSpamTickCount > 0) { chatSpamTickCount--; @@ -123,30 +123,30 @@ void PlayerConnection::disconnect(DisconnectPacket::eDisconnectReason reason) // 4J Stu - Need to remove the player from the receiving list before their socket is NULLed so that we can find another player on their system server->getPlayers()->removePlayerFromReceiving( player ); - send( std::shared_ptr( new DisconnectPacket(reason) )); + send( shared_ptr( new DisconnectPacket(reason) )); connection->sendAndQuit(); // 4J-PB - removed, since it needs to be localised in the language the client is in - //server->players->broadcastAll( std::shared_ptr( new ChatPacket(L"�e" + player->name + L" left the game.") ) ); + //server->players->broadcastAll( shared_ptr( new ChatPacket(L"e" + player->name + L" left the game.") ) ); if(getWasKicked()) { - server->getPlayers()->broadcastAll( std::shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerKickedFromGame) ) ); + server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerKickedFromGame) ) ); } else { - server->getPlayers()->broadcastAll( std::shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerLeftGame) ) ); + server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerLeftGame) ) ); } - + server->getPlayers()->remove(player); done = true; LeaveCriticalSection(&done_cs); } -void PlayerConnection::handlePlayerInput(std::shared_ptr packet) +void PlayerConnection::handlePlayerInput(shared_ptr packet) { player->setPlayerInput(packet->getXa(), packet->getYa(), packet->isJumping(), packet->isSneaking(), packet->getXRot(), packet->getYRot()); } -void PlayerConnection::handleMovePlayer(std::shared_ptr packet) +void PlayerConnection::handleMovePlayer(shared_ptr packet) { ServerLevel *level = server->getLevel(player->dimension); @@ -391,10 +391,10 @@ void PlayerConnection::teleport(double x, double y, double z, float yRot, float player->absMoveTo(x, y, z, yRot, xRot); // 4J - note that 1.62 is added to the height here as the client connection that receives this will presume it represents y + heightOffset at that end // This is different to the way that height is sent back to the server, where it represents the bottom of the player bounding volume - if(sendPacket) player->connection->send( std::shared_ptr( new MovePlayerPacket::PosRot(x, y + 1.62f, y, z, yRot, xRot, false, false) ) ); + if(sendPacket) player->connection->send( shared_ptr( new MovePlayerPacket::PosRot(x, y + 1.62f, y, z, yRot, xRot, false, false) ) ); } -void PlayerConnection::handlePlayerAction(std::shared_ptr packet) +void PlayerConnection::handlePlayerAction(shared_ptr packet) { ServerLevel *level = server->getLevel(player->dimension); @@ -442,19 +442,19 @@ void PlayerConnection::handlePlayerAction(std::shared_ptr pa if (packet->action == PlayerActionPacket::START_DESTROY_BLOCK) { if (zd > 16 || canEditSpawn) player->gameMode->startDestroyBlock(x, y, z, packet->face); - else player->connection->send( std::shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + else player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); } else if (packet->action == PlayerActionPacket::STOP_DESTROY_BLOCK) { player->gameMode->stopDestroyBlock(x, y, z); server->getPlayers()->prioritiseTileChanges(x, y, z, level->dimension->id); // 4J added - make sure that the update packets for this get prioritised over other general world updates - if (level->getTile(x, y, z) != 0) player->connection->send( std::shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + if (level->getTile(x, y, z) != 0) player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); } else if (packet->action == PlayerActionPacket::ABORT_DESTROY_BLOCK) { player->gameMode->abortDestroyBlock(x, y, z); - if (level->getTile(x, y, z) != 0) player->connection->send(std::shared_ptr( new TileUpdatePacket(x, y, z, level))); + if (level->getTile(x, y, z) != 0) player->connection->send(shared_ptr( new TileUpdatePacket(x, y, z, level))); } else if (packet->action == PlayerActionPacket::GET_UPDATED_BLOCK) { @@ -464,7 +464,7 @@ void PlayerConnection::handlePlayerAction(std::shared_ptr pa double dist = xDist * xDist + yDist * yDist + zDist * zDist; if (dist < 16 * 16) { - player->connection->send( std::shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); } } @@ -473,16 +473,16 @@ void PlayerConnection::handlePlayerAction(std::shared_ptr pa } -void PlayerConnection::handleUseItem(std::shared_ptr packet) +void PlayerConnection::handleUseItem(shared_ptr packet) { ServerLevel *level = server->getLevel(player->dimension); - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); bool informClient = false; int x = packet->getX(); int y = packet->getY(); int z = packet->getZ(); int face = packet->getFace(); - + // 4J Stu - We don't have ops, so just use the levels setting bool canEditSpawn = level->canEditSpawn; // = level->dimension->id != 0 || server->players->isOp(player->name); if (packet->getFace() == 255) @@ -509,14 +509,14 @@ void PlayerConnection::handleUseItem(std::shared_ptr packet) } else { - //player->connection->send(std::shared_ptr(new ChatPacket("\u00A77Height limit for building is " + server->maxBuildHeight))); + //player->connection->send(shared_ptr(new ChatPacket("\u00A77Height limit for building is " + server->maxBuildHeight))); informClient = true; } if (informClient) { - player->connection->send( std::shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); if (face == 0) y--; if (face == 1) y++; @@ -524,7 +524,7 @@ void PlayerConnection::handleUseItem(std::shared_ptr packet) if (face == 3) z++; if (face == 4) x--; if (face == 5) x++; - + // 4J - Fixes an issue where pistons briefly disappear when retracting. The pistons themselves shouldn't have their change from being pistonBase_Id to pistonMovingPiece_Id // directly sent to the client, as this will happen on the client as a result of it actioning (via a tile event) the retraction of the piston locally. However, by putting a switch // beside a piston and then performing an action on the side of it facing a piston, the following line of code will send a TileUpdatePacket containing the change to pistonMovingPiece_Id @@ -532,7 +532,7 @@ void PlayerConnection::handleUseItem(std::shared_ptr packet) // isn't what it is expecting. if( level->getTile(x,y,z) != Tile::pistonMovingPiece_Id ) { - player->connection->send( std::shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); + player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); } } @@ -554,7 +554,7 @@ void PlayerConnection::handleUseItem(std::shared_ptr packet) if (!ItemInstance::matches(player->inventory->getSelected(), packet->getItem())) { - send( std::shared_ptr( new ContainerSetSlotPacket(player->containerMenu->containerId, s->index, player->inventory->getSelected()) ) ); + send( shared_ptr( new ContainerSetSlotPacket(player->containerMenu->containerId, s->index, player->inventory->getSelected()) ) ); } } @@ -569,27 +569,27 @@ void PlayerConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, if( done ) return; // logger.info(player.name + " lost connection: " + reason); // 4J-PB - removed, since it needs to be localised in the language the client is in - //server->players->broadcastAll( std::shared_ptr( new ChatPacket(L"�e" + player->name + L" left the game.") ) ); + //server->players->broadcastAll( shared_ptr( new ChatPacket(L"e" + player->name + L" left the game.") ) ); if(getWasKicked()) { - server->getPlayers()->broadcastAll( std::shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerKickedFromGame) ) ); + server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerKickedFromGame) ) ); } else { - server->getPlayers()->broadcastAll( std::shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerLeftGame) ) ); + server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerLeftGame) ) ); } server->getPlayers()->remove(player); done = true; LeaveCriticalSection(&done_cs); } -void PlayerConnection::onUnhandledPacket(std::shared_ptr packet) +void PlayerConnection::onUnhandledPacket(shared_ptr packet) { // logger.warning(getClass() + " wasn't prepared to deal with a " + packet.getClass()); disconnect(DisconnectPacket::eDisconnect_UnexpectedPacket); } -void PlayerConnection::send(std::shared_ptr packet) +void PlayerConnection::send(shared_ptr packet) { if( connection->getSocket() != NULL ) { @@ -607,7 +607,7 @@ void PlayerConnection::send(std::shared_ptr packet) } // 4J Added -void PlayerConnection::queueSend(std::shared_ptr packet) +void PlayerConnection::queueSend(shared_ptr packet) { if( connection->getSocket() != NULL ) { @@ -624,7 +624,7 @@ void PlayerConnection::queueSend(std::shared_ptr packet) } } -void PlayerConnection::handleSetCarriedItem(std::shared_ptr packet) +void PlayerConnection::handleSetCarriedItem(shared_ptr packet) { if (packet->slot < 0 || packet->slot >= Inventory::getSelectionSize()) { @@ -634,7 +634,7 @@ void PlayerConnection::handleSetCarriedItem(std::shared_ptrinventory->selected = packet->slot; } -void PlayerConnection::handleChat(std::shared_ptr packet) +void PlayerConnection::handleChat(shared_ptr packet) { // 4J - TODO #if 0 @@ -678,7 +678,7 @@ void PlayerConnection::handleCommand(const wstring& message) #endif } -void PlayerConnection::handleAnimate(std::shared_ptr packet) +void PlayerConnection::handleAnimate(shared_ptr packet) { if (packet->action == AnimatePacket::SWING) { @@ -686,7 +686,7 @@ void PlayerConnection::handleAnimate(std::shared_ptr packet) } } -void PlayerConnection::handlePlayerCommand(std::shared_ptr packet) +void PlayerConnection::handlePlayerCommand(shared_ptr packet) { if (packet->action == PlayerCommandPacket::START_SNEAKING) { @@ -725,7 +725,7 @@ void PlayerConnection::setShowOnMaps(bool bVal) player->setShowOnMaps(bVal); } -void PlayerConnection::handleDisconnect(std::shared_ptr packet) +void PlayerConnection::handleDisconnect(shared_ptr packet) { // 4J Stu - Need to remove the player from the receiving list before their socket is NULLed so that we can find another player on their system server->getPlayers()->removePlayerFromReceiving( player ); @@ -740,13 +740,13 @@ int PlayerConnection::countDelayedPackets() void PlayerConnection::info(const wstring& string) { // 4J-PB - removed, since it needs to be localised in the language the client is in - //send( std::shared_ptr( new ChatPacket(L"�7" + string) ) ); + //send( shared_ptr( new ChatPacket(L"7" + string) ) ); } void PlayerConnection::warn(const wstring& string) { // 4J-PB - removed, since it needs to be localised in the language the client is in - //send( std::shared_ptr( new ChatPacket(L"�9" + string) ) ); + //send( shared_ptr( new ChatPacket(L"9" + string) ) ); } wstring PlayerConnection::getConsoleName() @@ -754,10 +754,10 @@ wstring PlayerConnection::getConsoleName() return player->name; } -void PlayerConnection::handleInteract(std::shared_ptr packet) +void PlayerConnection::handleInteract(shared_ptr packet) { ServerLevel *level = server->getLevel(player->dimension); - std::shared_ptr target = level->getEntity(packet->target); + shared_ptr target = level->getEntity(packet->target); // Fix for #8218 - Gameplay: Attacking zombies from a different level often results in no hits being registered // 4J Stu - If the client says that we hit something, then agree with it. The canSee can fail here as it checks @@ -792,7 +792,7 @@ bool PlayerConnection::canHandleAsyncPackets() return true; } -void PlayerConnection::handleTexture(std::shared_ptr packet) +void PlayerConnection::handleTexture(shared_ptr packet) { // Both PlayerConnection and ClientConnection should handle this mostly the same way @@ -803,12 +803,12 @@ void PlayerConnection::handleTexture(std::shared_ptr packet) wprintf(L"Server received request for custom texture %ls\n",packet->textureName.c_str()); #endif PBYTE pbData=NULL; - DWORD dwBytes=0; + DWORD dwBytes=0; app.GetMemFileDetails(packet->textureName,&pbData,&dwBytes); if(dwBytes!=0) { - send( std::shared_ptr( new TexturePacket(packet->textureName,pbData,dwBytes) ) ); + send( shared_ptr( new TexturePacket(packet->textureName,pbData,dwBytes) ) ); } else { @@ -826,7 +826,7 @@ void PlayerConnection::handleTexture(std::shared_ptr packet) } } -void PlayerConnection::handleTextureAndGeometry(std::shared_ptr packet) +void PlayerConnection::handleTextureAndGeometry(shared_ptr packet) { // Both PlayerConnection and ClientConnection should handle this mostly the same way @@ -837,7 +837,7 @@ void PlayerConnection::handleTextureAndGeometry(std::shared_ptrtextureName.c_str()); #endif PBYTE pbData=NULL; - DWORD dwTextureBytes=0; + DWORD dwTextureBytes=0; app.GetMemFileDetails(packet->textureName,&pbData,&dwTextureBytes); DLCSkinFile *pDLCSkinFile = app.m_dlcManager.getSkinFile(packet->textureName); @@ -848,11 +848,11 @@ void PlayerConnection::handleTextureAndGeometry(std::shared_ptrgetAdditionalBoxesCount()!=0) { - send( std::shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes,pDLCSkinFile) ) ); + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes,pDLCSkinFile) ) ); } else { - send( std::shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes) ) ); + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes) ) ); } } else @@ -861,7 +861,7 @@ void PlayerConnection::handleTextureAndGeometry(std::shared_ptr *pvSkinBoxes = app.GetAdditionalSkinBoxes(packet->dwSkinID); unsigned int uiAnimOverrideBitmask= app.GetAnimOverrideBitmask(packet->dwSkinID); - send( std::shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes,pvSkinBoxes,uiAnimOverrideBitmask) ) ); + send( shared_ptr( new TextureAndGeometryPacket(packet->textureName,pbData,dwTextureBytes,pvSkinBoxes,uiAnimOverrideBitmask) ) ); } } else @@ -901,12 +901,12 @@ void PlayerConnection::handleTextureReceived(const wstring &textureName) if( it != m_texturesRequested.end() ) { PBYTE pbData=NULL; - DWORD dwBytes=0; + DWORD dwBytes=0; app.GetMemFileDetails(textureName,&pbData,&dwBytes); if(dwBytes!=0) { - send( std::shared_ptr( new TexturePacket(textureName,pbData,dwBytes) ) ); + send( shared_ptr( new TexturePacket(textureName,pbData,dwBytes) ) ); m_texturesRequested.erase(it); } } @@ -919,7 +919,7 @@ void PlayerConnection::handleTextureAndGeometryReceived(const wstring &textureNa if( it != m_texturesRequested.end() ) { PBYTE pbData=NULL; - DWORD dwTextureBytes=0; + DWORD dwTextureBytes=0; app.GetMemFileDetails(textureName,&pbData,&dwTextureBytes); DLCSkinFile *pDLCSkinFile=app.m_dlcManager.getSkinFile(textureName); @@ -927,7 +927,7 @@ void PlayerConnection::handleTextureAndGeometryReceived(const wstring &textureNa { if(pDLCSkinFile && (pDLCSkinFile->getAdditionalBoxesCount()!=0)) { - send( std::shared_ptr( new TextureAndGeometryPacket(textureName,pbData,dwTextureBytes,pDLCSkinFile) ) ); + send( shared_ptr( new TextureAndGeometryPacket(textureName,pbData,dwTextureBytes,pDLCSkinFile) ) ); } else { @@ -936,14 +936,14 @@ void PlayerConnection::handleTextureAndGeometryReceived(const wstring &textureNa vector *pvSkinBoxes = app.GetAdditionalSkinBoxes(dwSkinID); unsigned int uiAnimOverrideBitmask= app.GetAnimOverrideBitmask(dwSkinID); - send( std::shared_ptr( new TextureAndGeometryPacket(textureName,pbData,dwTextureBytes, pvSkinBoxes, uiAnimOverrideBitmask) ) ); + send( shared_ptr( new TextureAndGeometryPacket(textureName,pbData,dwTextureBytes, pvSkinBoxes, uiAnimOverrideBitmask) ) ); } - m_texturesRequested.erase(it); + m_texturesRequested.erase(it); } } } -void PlayerConnection::handleTextureChange(std::shared_ptr packet) +void PlayerConnection::handleTextureChange(shared_ptr packet) { switch(packet->action) { @@ -968,26 +968,26 @@ void PlayerConnection::handleTextureChange(std::shared_ptr #ifndef _CONTENT_PACKAGE wprintf(L"Sending texture packet to get custom skin %ls from player %ls\n",packet->path.c_str(), player->name.c_str()); #endif - send(std::shared_ptr( new TexturePacket(packet->path,NULL,0) ) ); + send(shared_ptr( new TexturePacket(packet->path,NULL,0) ) ); } } else if(!packet->path.empty() && app.IsFileInMemoryTextures(packet->path)) - { + { // Update the ref count on the memory texture data app.AddMemoryTextureFile(packet->path,NULL,0); } - server->getPlayers()->broadcastAll( std::shared_ptr( new TextureChangePacket(player,packet->action,packet->path) ), player->dimension ); + server->getPlayers()->broadcastAll( shared_ptr( new TextureChangePacket(player,packet->action,packet->path) ), player->dimension ); } -void PlayerConnection::handleTextureAndGeometryChange(std::shared_ptr packet) +void PlayerConnection::handleTextureAndGeometryChange(shared_ptr packet) { player->setCustomSkin( app.getSkinIdFromPath( packet->path ) ); #ifndef _CONTENT_PACKAGE wprintf(L"PlayerConnection::handleTextureAndGeometryChange - Skin for server player %ls has changed to %ls (%d)\n", player->name.c_str(), player->customTextureUrl.c_str(), player->getPlayerDefaultSkin() ); #endif - - + + if(!packet->path.empty() && packet->path.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(packet->path)) { if( server->connection->addPendingTextureRequest(packet->path)) @@ -995,11 +995,11 @@ void PlayerConnection::handleTextureAndGeometryChange(std::shared_ptrpath.c_str(), player->name.c_str()); #endif - send(std::shared_ptr( new TextureAndGeometryPacket(packet->path,NULL,0) ) ); + send(shared_ptr( new TextureAndGeometryPacket(packet->path,NULL,0) ) ); } } else if(!packet->path.empty() && app.IsFileInMemoryTextures(packet->path)) - { + { // Update the ref count on the memory texture data app.AddMemoryTextureFile(packet->path,NULL,0); @@ -1009,10 +1009,10 @@ void PlayerConnection::handleTextureAndGeometryChange(std::shared_ptrdwSkinID,) //DebugBreak(); } - server->getPlayers()->broadcastAll( std::shared_ptr( new TextureAndGeometryChangePacket(player,packet->path) ), player->dimension ); + server->getPlayers()->broadcastAll( shared_ptr( new TextureAndGeometryChangePacket(player,packet->path) ), player->dimension ); } -void PlayerConnection::handleServerSettingsChanged(std::shared_ptr packet) +void PlayerConnection::handleServerSettingsChanged(shared_ptr packet) { if(packet->action==ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS) { @@ -1024,7 +1024,7 @@ void PlayerConnection::handleServerSettingsChanged(std::shared_ptrdata,eGameHostOption_FireSpreads)); app.SetGameHostOption(eGameHostOption_TNT, app.GetGameHostOption(packet->data,eGameHostOption_TNT)); - server->getPlayers()->broadcastAll( std::shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS,app.GetGameHostOption(eGameHostOption_All) ) ) ); + server->getPlayers()->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS,app.GetGameHostOption(eGameHostOption_All) ) ) ); // Update the QoS data g_NetworkManager.UpdateAndSetGameSessionData(); @@ -1032,21 +1032,21 @@ void PlayerConnection::handleServerSettingsChanged(std::shared_ptr packet) +void PlayerConnection::handleKickPlayer(shared_ptr packet) { INetworkPlayer *networkPlayer = getNetworkPlayer(); if( (networkPlayer != NULL && networkPlayer->IsHost()) || player->isModerator()) - { + { server->getPlayers()->kickPlayerByShortId(packet->m_networkSmallId); } } -void PlayerConnection::handleGameCommand(std::shared_ptr packet) +void PlayerConnection::handleGameCommand(shared_ptr packet) { MinecraftServer::getInstance()->getCommandDispatcher()->performCommand(player, packet->command, packet->data); } -void PlayerConnection::handleClientCommand(std::shared_ptr packet) +void PlayerConnection::handleClientCommand(shared_ptr packet) { if (packet->action == ClientCommandPacket::PERFORM_RESPAWN) { @@ -1078,17 +1078,17 @@ void PlayerConnection::handleClientCommand(std::shared_ptr } } -void PlayerConnection::handleRespawn(std::shared_ptr packet) +void PlayerConnection::handleRespawn(shared_ptr packet) { } -void PlayerConnection::handleContainerClose(std::shared_ptr packet) +void PlayerConnection::handleContainerClose(shared_ptr packet) { player->doCloseContainer(); } -#ifndef _CONTENT_PACKAGE -void PlayerConnection::handleContainerSetSlot(std::shared_ptr packet) +#ifndef _CONTENT_PACKAGE +void PlayerConnection::handleContainerSetSlot(shared_ptr packet) { if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) { @@ -1098,7 +1098,7 @@ void PlayerConnection::handleContainerSetSlot(std::shared_ptrcontainerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY && packet->slot >= 36 && packet->slot < 36 + 9) { - std::shared_ptr lastItem = player->inventoryMenu->getSlot(packet->slot)->getItem(); + shared_ptr lastItem = player->inventoryMenu->getSlot(packet->slot)->getItem(); if (packet->item != NULL) { if (lastItem == NULL || lastItem->count < packet->item->count) @@ -1124,16 +1124,16 @@ void PlayerConnection::handleContainerSetSlot(std::shared_ptr packet) +void PlayerConnection::handleContainerClick(shared_ptr packet) { if (player->containerMenu->containerId == packet->containerId && player->containerMenu->isSynched(player)) { - std::shared_ptr clicked = player->containerMenu->clicked(packet->slotNum, packet->buttonNum, packet->quickKey?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, player); + shared_ptr clicked = player->containerMenu->clicked(packet->slotNum, packet->buttonNum, packet->quickKey?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, player); if (ItemInstance::matches(packet->item, clicked)) { // Yep, you sure did click what you claimed to click! - player->connection->send( std::shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) ) ); + player->connection->send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) ) ); player->ignoreSlotUpdateHack = true; player->containerMenu->broadcastChanges(); player->broadcastCarriedItem(); @@ -1143,10 +1143,10 @@ void PlayerConnection::handleContainerClick(std::shared_ptrcontainerMenu->containerId] = packet->uid; - player->connection->send( std::shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, false) ) ); + player->connection->send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, false) ) ); player->containerMenu->setSynched(player, false); - vector > items; + vector > items; for (unsigned int i = 0; i < player->containerMenu->slots->size(); i++) { items.push_back(player->containerMenu->slots->at(i)->getItem()); @@ -1159,7 +1159,7 @@ void PlayerConnection::handleContainerClick(std::shared_ptr packet) +void PlayerConnection::handleContainerButtonClick(shared_ptr packet) { if (player->containerMenu->containerId == packet->containerId && player->containerMenu->isSynched(player)) { @@ -1168,12 +1168,12 @@ void PlayerConnection::handleContainerButtonClick(std::shared_ptr packet) +void PlayerConnection::handleSetCreativeModeSlot(shared_ptr packet) { if (player->gameMode->isCreative()) { bool drop = packet->slotNum < 0; - std::shared_ptr item = packet->item; + shared_ptr item = packet->item; if(item != NULL && item->id == Item::map_Id) { @@ -1187,9 +1187,9 @@ void PlayerConnection::handleSetCreativeModeSlot(std::shared_ptrsetAuxValue( player->level->getAuxValueForMap(player->getXuid(), player->dimension, centreXC, centreZC, mapScale) ); + item->setAuxValue( player->level->getAuxValueForMap(player->getXuid(), player->dimension, centreXC, centreZC, mapScale) ); - std::shared_ptr data = MapItem::getSavedData(item->getAuxValue(), player->level); + shared_ptr data = MapItem::getSavedData(item->getAuxValue(), player->level); // 4J Stu - We only have one map per player per dimension, so don't reset the one that they have // when a new one is created wchar_t buf[64]; @@ -1197,9 +1197,9 @@ void PlayerConnection::handleSetCreativeModeSlot(std::shared_ptr( new MapItemSavedData(id) ); + data = shared_ptr( new MapItemSavedData(id) ); } - player->level->setSavedData(id, (std::shared_ptr ) data); + player->level->setSavedData(id, (shared_ptr ) data); data->scale = mapScale; // 4J-PB - for Xbox maps, we'll centre them on the origin of the world, since we can fit the whole world in our map @@ -1232,7 +1232,7 @@ void PlayerConnection::handleSetCreativeModeSlot(std::shared_ptr dropped = player->drop(item); + shared_ptr dropped = player->drop(item); if (dropped != NULL) { dropped->setShortLifeTime(); @@ -1244,7 +1244,7 @@ void PlayerConnection::handleSetCreativeModeSlot(std::shared_ptr > items; + vector > items; for (unsigned int i = 0; i < player->inventoryMenu->slots->size(); i++) { items.push_back(player->inventoryMenu->slots->at(i)->getItem()); @@ -1254,7 +1254,7 @@ void PlayerConnection::handleSetCreativeModeSlot(std::shared_ptr packet) +void PlayerConnection::handleContainerAck(shared_ptr packet) { AUTO_VAR(it, expectedAcks.find(player->containerMenu->containerId)); @@ -1264,18 +1264,18 @@ void PlayerConnection::handleContainerAck(std::shared_ptr pa } } -void PlayerConnection::handleSignUpdate(std::shared_ptr packet) +void PlayerConnection::handleSignUpdate(shared_ptr packet) { app.DebugPrintf("PlayerConnection::handleSignUpdate\n"); ServerLevel *level = server->getLevel(player->dimension); if (level->hasChunkAt(packet->x, packet->y, packet->z)) { - std::shared_ptr te = level->getTileEntity(packet->x, packet->y, packet->z); + shared_ptr te = level->getTileEntity(packet->x, packet->y, packet->z); if (dynamic_pointer_cast(te) != NULL) { - std::shared_ptr ste = dynamic_pointer_cast(te); + shared_ptr ste = dynamic_pointer_cast(te); if (!ste->isEditable()) { server->warn(L"Player " + player->name + L" just tried to change non-editable sign"); @@ -1289,7 +1289,7 @@ void PlayerConnection::handleSignUpdate(std::shared_ptr packet int x = packet->x; int y = packet->y; int z = packet->z; - std::shared_ptr ste = dynamic_pointer_cast(te); + shared_ptr ste = dynamic_pointer_cast(te); for (int i = 0; i < 4; i++) { wstring lineText = packet->lines[i].substr(0,15); @@ -1303,7 +1303,7 @@ void PlayerConnection::handleSignUpdate(std::shared_ptr packet } -void PlayerConnection::handleKeepAlive(std::shared_ptr packet) +void PlayerConnection::handleKeepAlive(shared_ptr packet) { if (packet->id == lastKeepAliveId) { @@ -1312,18 +1312,18 @@ void PlayerConnection::handleKeepAlive(std::shared_ptr packet) } } -void PlayerConnection::handlePlayerInfo(std::shared_ptr packet) -{ +void PlayerConnection::handlePlayerInfo(shared_ptr packet) +{ // Need to check that this player has permission to change each individual setting? INetworkPlayer *networkPlayer = getNetworkPlayer(); if( (networkPlayer != NULL && networkPlayer->IsHost()) || player->isModerator() ) { - std::shared_ptr serverPlayer; + shared_ptr serverPlayer; // Find the player being edited for(AUTO_VAR(it, server->getPlayers()->players.begin()); it != server->getPlayers()->players.end(); ++it) { - std::shared_ptr checkingPlayer = *it; + shared_ptr checkingPlayer = *it; if(checkingPlayer->connection->getNetworkPlayer() != NULL && checkingPlayer->connection->getNetworkPlayer()->GetSmallId() == packet->m_networkSmallId) { serverPlayer = checkingPlayer; @@ -1348,7 +1348,7 @@ void PlayerConnection::handlePlayerInfo(std::shared_ptr packet #endif serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CreativeMode,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) ); serverPlayer->gameMode->setGameModeForPlayer(gameType); - serverPlayer->connection->send( std::shared_ptr( new GameEventPacket(GameEventPacket::CHANGE_GAME_MODE, gameType->getId()) )); + serverPlayer->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::CHANGE_GAME_MODE, gameType->getId()) )); } else { @@ -1376,7 +1376,7 @@ void PlayerConnection::handlePlayerInfo(std::shared_ptr packet } else { - // Editing someone else + // Editing someone else if(!trustPlayers && !serverPlayer->connection->getNetworkPlayer()->IsHost()) { serverPlayer->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CannotMine,Player::getPlayerGamePrivilege(packet->m_playerPrivileges,Player::ePlayerGamePrivilege_CannotMine) ); @@ -1400,7 +1400,7 @@ void PlayerConnection::handlePlayerInfo(std::shared_ptr packet } } - server->getPlayers()->broadcastAll( std::shared_ptr( new PlayerInfoPacket( serverPlayer ) ) ); + server->getPlayers()->broadcastAll( shared_ptr( new PlayerInfoPacket( serverPlayer ) ) ); } } } @@ -1410,7 +1410,7 @@ bool PlayerConnection::isServerPacketListener() return true; } -void PlayerConnection::handlePlayerAbilities(std::shared_ptr playerAbilitiesPacket) +void PlayerConnection::handlePlayerAbilities(shared_ptr playerAbilitiesPacket) { player->abilities.flying = playerAbilitiesPacket->isFlying() && player->abilities.mayfly; } @@ -1427,19 +1427,19 @@ void PlayerConnection::handlePlayerAbilities(std::shared_ptr packet) +//void handleClientInformation(shared_ptr packet) //{ // player->updateOptions(packet); //} -void PlayerConnection::handleCustomPayload(std::shared_ptr customPayloadPacket) +void PlayerConnection::handleCustomPayload(shared_ptr customPayloadPacket) { #if 0 if (CustomPayloadPacket.CUSTOM_BOOK_PACKET.equals(customPayloadPacket.identifier)) { ByteArrayInputStream bais(customPayloadPacket->data); DataInputStream input(&bais); - std::shared_ptr sentItem = Packet::readItem(input); + shared_ptr sentItem = Packet::readItem(input); if (!WritingBookItem.makeSureTagIsValid(sentItem.getTag())) { @@ -1510,13 +1510,13 @@ void PlayerConnection::handleCustomPayload(std::shared_ptr // 4J Added -void PlayerConnection::handleDebugOptions(std::shared_ptr packet) +void PlayerConnection::handleDebugOptions(shared_ptr packet) { //Player player = dynamic_pointer_cast( player->shared_from_this() ); player->SetDebugOptions(packet->m_uiVal); } -void PlayerConnection::handleCraftItem(std::shared_ptr packet) +void PlayerConnection::handleCraftItem(shared_ptr packet) { int iRecipe = packet->recipe; @@ -1524,7 +1524,7 @@ void PlayerConnection::handleCraftItem(std::shared_ptr packet) return; Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); - std::shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); if(app.DebugSettingsOn() && (player->GetDebugOptions()&(1L< packet) else { - + // TODO 4J Stu - Assume at the moment that the client can work this out for us... - //if(pRecipeIngredientsRequired[iRecipe].bCanMake) + //if(pRecipeIngredientsRequired[iRecipe].bCanMake) //{ pTempItemInst->onCraftedBy(player->level, dynamic_pointer_cast( player->shared_from_this() ), pTempItemInst->count ); @@ -1549,7 +1549,7 @@ void PlayerConnection::handleCraftItem(std::shared_ptr packet) { for(int j=0;j ingItemInst = nullptr; + shared_ptr ingItemInst = nullptr; // do we need to remove a specific aux value? if(pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]!=Recipes::ANY_AUX_VALUE) { @@ -1568,13 +1568,13 @@ void PlayerConnection::handleCraftItem(std::shared_ptr packet) if (ingItemInst->getItem()->hasCraftingRemainingItem()) { // replace item with remaining result - player->inventory->add( std::shared_ptr( new ItemInstance(ingItemInst->getItem()->getCraftingRemainingItem()) ) ); + player->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(player->inventory->add(pTempItemInst)==false ) { @@ -1586,7 +1586,7 @@ void PlayerConnection::handleCraftItem(std::shared_ptr packet) { // 4J Stu - Maps need to have their aux value update, so the client should always be assumed to be wrong // This is how the Java works, as the client also incorrectly predicts the auxvalue of the mapItem - vector > items; + vector > items; for (unsigned int i = 0; i < player->containerMenu->slots->size(); i++) { items.push_back(player->containerMenu->slots->at(i)->getItem()); @@ -1625,7 +1625,7 @@ void PlayerConnection::handleCraftItem(std::shared_ptr packet) } -void PlayerConnection::handleTradeItem(std::shared_ptr packet) +void PlayerConnection::handleTradeItem(shared_ptr packet) { if (player->containerMenu->containerId == packet->containerId) { @@ -1642,8 +1642,8 @@ void PlayerConnection::handleTradeItem(std::shared_ptr packet) if(!activeRecipe->isDeprecated()) { // Do we have the ingredients? - std::shared_ptr buyAItem = activeRecipe->getBuyAItem(); - std::shared_ptr buyBItem = activeRecipe->getBuyBItem(); + shared_ptr buyAItem = activeRecipe->getBuyAItem(); + shared_ptr buyBItem = activeRecipe->getBuyBItem(); int buyAMatches = player->inventory->countMatches(buyAItem); int buyBMatches = player->inventory->countMatches(buyBItem); @@ -1656,8 +1656,8 @@ void PlayerConnection::handleTradeItem(std::shared_ptr packet) player->inventory->removeResources(buyBItem); // Add the item we have purchased - std::shared_ptr result = activeRecipe->getSellItem()->copy(); - + shared_ptr result = activeRecipe->getSellItem()->copy(); + // 4J JEV - Award itemsBought stat. player->awardStat( GenericStats::itemsBought(result->getItem()->id), @@ -1667,7 +1667,7 @@ void PlayerConnection::handleTradeItem(std::shared_ptr packet) result->GetCount() ) ); - + if (!player->inventory->add(result)) { player->drop(result); @@ -1687,7 +1687,7 @@ INetworkPlayer *PlayerConnection::getNetworkPlayer() bool PlayerConnection::isLocal() { - if( connection->getSocket() == NULL ) + if( connection->getSocket() == NULL ) { return false; } @@ -1700,7 +1700,7 @@ bool PlayerConnection::isLocal() bool PlayerConnection::isGuest() { - if( connection->getSocket() == NULL ) + if( connection->getSocket() == NULL ) { return false; } diff --git a/Minecraft.Client/PlayerConnection.h b/Minecraft.Client/PlayerConnection.h index c00ee1c1..d7b56a83 100644 --- a/Minecraft.Client/PlayerConnection.h +++ b/Minecraft.Client/PlayerConnection.h @@ -24,7 +24,7 @@ public: private: MinecraftServer *server; - std::shared_ptr player; + shared_ptr player; int tickCount; int aboveGroundTickCount; @@ -39,7 +39,7 @@ private: bool m_bHasClientTickedOnce; public: - PlayerConnection(MinecraftServer *server, Connection *connection, std::shared_ptr player); + PlayerConnection(MinecraftServer *server, Connection *connection, shared_ptr player); ~PlayerConnection(); void tick(); void disconnect(DisconnectPacket::eDisconnectReason reason); @@ -49,32 +49,32 @@ private: bool synched; public: - virtual void handlePlayerInput(std::shared_ptr packet); - virtual void handleMovePlayer(std::shared_ptr packet); + virtual void handlePlayerInput(shared_ptr packet); + virtual void handleMovePlayer(shared_ptr packet); void teleport(double x, double y, double z, float yRot, float xRot, bool sendPacket = true); // 4J Added sendPacket param - virtual void handlePlayerAction(std::shared_ptr packet); - virtual void handleUseItem(std::shared_ptr packet); + virtual void handlePlayerAction(shared_ptr packet); + virtual void handleUseItem(shared_ptr packet); virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); - virtual void onUnhandledPacket(std::shared_ptr packet); - void send(std::shared_ptr packet); - void queueSend(std::shared_ptr packet); // 4J Added - virtual void handleSetCarriedItem(std::shared_ptr packet); - virtual void handleChat(std::shared_ptr packet); + virtual void onUnhandledPacket(shared_ptr packet); + void send(shared_ptr packet); + void queueSend(shared_ptr packet); // 4J Added + virtual void handleSetCarriedItem(shared_ptr packet); + virtual void handleChat(shared_ptr packet); private: void handleCommand(const wstring& message); public: - virtual void handleAnimate(std::shared_ptr packet); - virtual void handlePlayerCommand(std::shared_ptr packet); - virtual void handleDisconnect(std::shared_ptr packet); + virtual void handleAnimate(shared_ptr packet); + virtual void handlePlayerCommand(shared_ptr packet); + virtual void handleDisconnect(shared_ptr packet); int countDelayedPackets(); virtual void info(const wstring& string); virtual void warn(const wstring& string); virtual wstring getConsoleName(); - virtual void handleInteract(std::shared_ptr packet); + virtual void handleInteract(shared_ptr packet); bool canHandleAsyncPackets(); - virtual void handleClientCommand(std::shared_ptr packet); - virtual void handleRespawn(std::shared_ptr packet); - virtual void handleContainerClose(std::shared_ptr packet); + virtual void handleClientCommand(shared_ptr packet); + virtual void handleRespawn(shared_ptr packet); + virtual void handleContainerClose(shared_ptr packet); private: unordered_map expectedAcks; @@ -82,38 +82,38 @@ private: public: // 4J Stu - Handlers only valid in debug mode #ifndef _CONTENT_PACKAGE - virtual void handleContainerSetSlot(std::shared_ptr packet); + virtual void handleContainerSetSlot(shared_ptr packet); #endif - virtual void handleContainerClick(std::shared_ptr packet); - virtual void handleContainerButtonClick(std::shared_ptr packet); - virtual void handleSetCreativeModeSlot(std::shared_ptr packet); - virtual void handleContainerAck(std::shared_ptr packet); - virtual void handleSignUpdate(std::shared_ptr packet); - virtual void handleKeepAlive(std::shared_ptr packet); - virtual void handlePlayerInfo(std::shared_ptr packet); // 4J Added + virtual void handleContainerClick(shared_ptr packet); + virtual void handleContainerButtonClick(shared_ptr packet); + virtual void handleSetCreativeModeSlot(shared_ptr packet); + virtual void handleContainerAck(shared_ptr packet); + virtual void handleSignUpdate(shared_ptr packet); + virtual void handleKeepAlive(shared_ptr packet); + virtual void handlePlayerInfo(shared_ptr packet); // 4J Added virtual bool isServerPacketListener(); - virtual void handlePlayerAbilities(std::shared_ptr playerAbilitiesPacket); - virtual void handleCustomPayload(std::shared_ptr customPayloadPacket); + virtual void handlePlayerAbilities(shared_ptr playerAbilitiesPacket); + virtual void handleCustomPayload(shared_ptr customPayloadPacket); // 4J Added - virtual void handleCraftItem(std::shared_ptr packet); - virtual void handleTradeItem(std::shared_ptr packet); - virtual void handleDebugOptions(std::shared_ptr packet); - virtual void handleTexture(std::shared_ptr packet); - virtual void handleTextureAndGeometry(std::shared_ptr packet); - virtual void handleTextureChange(std::shared_ptr packet); - virtual void handleTextureAndGeometryChange(std::shared_ptr packet); - virtual void handleServerSettingsChanged(std::shared_ptr packet); - virtual void handleKickPlayer(std::shared_ptr packet); - virtual void handleGameCommand(std::shared_ptr packet); + virtual void handleCraftItem(shared_ptr packet); + virtual void handleTradeItem(shared_ptr packet); + virtual void handleDebugOptions(shared_ptr packet); + virtual void handleTexture(shared_ptr packet); + virtual void handleTextureAndGeometry(shared_ptr packet); + virtual void handleTextureChange(shared_ptr packet); + virtual void handleTextureAndGeometryChange(shared_ptr packet); + virtual void handleServerSettingsChanged(shared_ptr packet); + virtual void handleKickPlayer(shared_ptr packet); + virtual void handleGameCommand(shared_ptr packet); INetworkPlayer *getNetworkPlayer(); bool isLocal(); bool isGuest(); // 4J Added as we need to set this from outside sometimes - void setPlayer(std::shared_ptr player) { this->player = player; } - std::shared_ptr getPlayer() { return player; } + void setPlayer(shared_ptr player) { this->player = player; } + shared_ptr getPlayer() { return player; } // 4J Added to signal a disconnect from another thread void closeOnTick() { m_bCloseOnTick = true; } diff --git a/Minecraft.Client/PlayerList.cpp b/Minecraft.Client/PlayerList.cpp index 9beea76b..7921cbf8 100644 --- a/Minecraft.Client/PlayerList.cpp +++ b/Minecraft.Client/PlayerList.cpp @@ -54,7 +54,7 @@ PlayerList::PlayerList(MinecraftServer *server) maxPlayers = server->settings->getInt(L"max-players", 20); doWhiteList = false; - + InitializeCriticalSection(&m_kickPlayersCS); InitializeCriticalSection(&m_closePlayersCS); } @@ -72,7 +72,7 @@ PlayerList::~PlayerList() DeleteCriticalSection(&m_closePlayersCS); } -void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptr player, std::shared_ptr packet) +void PlayerList::placeNewPlayer(Connection *connection, shared_ptr player, shared_ptr packet) { bool newPlayer = load(player); player->setLevel(server->getLevel(player->dimension)); @@ -82,7 +82,7 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptrgetSocket()->getPlayer(); if(networkPlayer != NULL && networkPlayer->IsHost()) { - player->enableAllPlayerPrivileges(true); + player->enableAllPlayerPrivileges(true); player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_HOST,1); } @@ -127,8 +127,8 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptrsetCustomCape( packet->m_playerCapeId ); // 4J-JEV: Moved this here so we can send player-model texture and geometry data. - std::shared_ptr playerConnection = std::shared_ptr(new PlayerConnection(server, connection, player)); - //player->connection = playerConnection; // Used to be assigned in PlayerConnection ctor but moved out so we can use std::shared_ptr + shared_ptr playerConnection = shared_ptr(new PlayerConnection(server, connection, player)); + //player->connection = playerConnection; // Used to be assigned in PlayerConnection ctor but moved out so we can use shared_ptr if(newPlayer) { @@ -143,7 +143,7 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptrinventory->setItem( 9, std::shared_ptr( new ItemInstance(Item::map_Id, 1, level->getAuxValueForMap(player->getXuid(),0,centreXC, centreZC, mapScale ) ) ) ); + player->inventory->setItem( 9, shared_ptr( new ItemInstance(Item::map_Id, 1, level->getAuxValueForMap(player->getXuid(),0,centreXC, centreZC, mapScale ) ) ) ); if(app.getGameRuleDefinitions() != NULL) { app.getGameRuleDefinitions()->postProcessPlayer(player); @@ -157,11 +157,11 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptrcustomTextureUrl.c_str(), player->name.c_str()); #endif - playerConnection->send(std::shared_ptr( new TextureAndGeometryPacket(player->customTextureUrl,NULL,0) ) ); + playerConnection->send(shared_ptr( new TextureAndGeometryPacket(player->customTextureUrl,NULL,0) ) ); } } else if(!player->customTextureUrl.empty() && app.IsFileInMemoryTextures(player->customTextureUrl)) - { + { // Update the ref count on the memory texture data app.AddMemoryTextureFile(player->customTextureUrl,NULL,0); } @@ -173,11 +173,11 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptrcustomTextureUrl2.c_str(), player->name.c_str()); #endif - playerConnection->send(std::shared_ptr( new TexturePacket(player->customTextureUrl2,NULL,0) ) ); + playerConnection->send(shared_ptr( new TexturePacket(player->customTextureUrl2,NULL,0) ) ); } } else if(!player->customTextureUrl2.empty() && app.IsFileInMemoryTextures(player->customTextureUrl2)) - { + { // Update the ref count on the memory texture data app.AddMemoryTextureFile(player->customTextureUrl2,NULL,0); } @@ -196,8 +196,8 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptrsetPlayerGamePrivilege(Player::ePlayerGamePrivilege_CreativeMode,player->gameMode->getGameModeForPlayer()->getId() ); } - //std::shared_ptr playerConnection = std::shared_ptr(new PlayerConnection(server, connection, player)); - player->connection = playerConnection; // Used to be assigned in PlayerConnection ctor but moved out so we can use std::shared_ptr + //shared_ptr playerConnection = shared_ptr(new PlayerConnection(server, connection, player)); + player->connection = playerConnection; // Used to be assigned in PlayerConnection ctor but moved out so we can use shared_ptr // 4J Added to store UGC settings playerConnection->m_friendsOnlyUGC = packet->m_friendsOnlyUGC; @@ -209,19 +209,19 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptrsend( std::shared_ptr( new LoginPacket(L"", player->entityId, level->getLevelData()->getGenerator(), level->getSeed(), player->gameMode->getGameModeForPlayer()->getId(), + playerConnection->send( shared_ptr( new LoginPacket(L"", player->entityId, level->getLevelData()->getGenerator(), level->getSeed(), player->gameMode->getGameModeForPlayer()->getId(), (byte) level->dimension->id, (byte) level->getMaxBuildHeight(), (byte) getMaxPlayers(), level->difficulty, TelemetryManager->GetMultiplayerInstanceID(), (BYTE)playerIndex, level->useNewSeaLevel(), player->getAllPlayerGamePrivileges(), level->getLevelData()->getXZSize(), level->getLevelData()->getHellScale() ) ) ); - playerConnection->send( std::shared_ptr( new SetSpawnPositionPacket(spawnPos->x, spawnPos->y, spawnPos->z) ) ); - playerConnection->send( std::shared_ptr( new PlayerAbilitiesPacket(&player->abilities)) ); + playerConnection->send( shared_ptr( new SetSpawnPositionPacket(spawnPos->x, spawnPos->y, spawnPos->z) ) ); + playerConnection->send( shared_ptr( new PlayerAbilitiesPacket(&player->abilities)) ); delete spawnPos; sendLevelInfo(player, level); // 4J-PB - removed, since it needs to be localised in the language the client is in - //server->players->broadcastAll( std::shared_ptr( new ChatPacket(L"�e" + playerEntity->name + L" joined the game.") ) ); - broadcastAll( std::shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerJoinedGame) ) ); + //server->players->broadcastAll( shared_ptr( new ChatPacket(L"e" + playerEntity->name + L" joined the game.") ) ); + broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerJoinedGame) ) ); MemSect(14); add(player); @@ -231,13 +231,13 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptrteleport(player->x, player->y, player->z, player->yRot, player->xRot); server->getConnection()->addPlayerConnection(playerConnection); - playerConnection->send( std::shared_ptr( new SetTimePacket(level->getTime()) ) ); + playerConnection->send( shared_ptr( new SetTimePacket(level->getTime()) ) ); AUTO_VAR(activeEffects, player->getActiveEffects()); for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) { MobEffectInstance *effect = *it; - playerConnection->send(std::shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); + playerConnection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); } player->initMenu(); @@ -249,7 +249,7 @@ void PlayerList::placeNewPlayer(Connection *connection, std::shared_ptr servPlayer = *it; + shared_ptr servPlayer = *it; INetworkPlayer *checkPlayer = servPlayer->connection->getNetworkPlayer(); if(thisPlayer != checkPlayer && checkPlayer != NULL && thisPlayer->IsSameSystem( checkPlayer ) && servPlayer->wonGame ) { @@ -265,7 +265,7 @@ void PlayerList::setLevel(ServerLevelArray levels) playerIo = levels[0]->getLevelStorage()->getPlayerIO(); } -void PlayerList::changeDimension(std::shared_ptr player, ServerLevel *from) +void PlayerList::changeDimension(shared_ptr player, ServerLevel *from) { ServerLevel *to = player->getLevel(); @@ -281,12 +281,12 @@ int PlayerList::getMaxRange() } // 4J Changed return val to bool to check if new player or loaded player -bool PlayerList::load(std::shared_ptr player) +bool PlayerList::load(shared_ptr player) { return playerIo->load(player); } -void PlayerList::save(std::shared_ptr player) +void PlayerList::save(shared_ptr player) { playerIo->save(player); } @@ -295,7 +295,7 @@ void PlayerList::save(std::shared_ptr player) // Add this function to take some of the code from the PlayerList::add function with the fixes // for checking spawn area, especially in the nether. These needed to be done in a different order from before // Fix for #13150 - When a player loads/joins a game after saving/leaving in the nether, sometimes they are spawned on top of the nether and cannot mine down -void PlayerList::validatePlayerSpawnPosition(std::shared_ptr player) +void PlayerList::validatePlayerSpawnPosition(shared_ptr player) { // 4J Stu - Some adjustments to make sure the current players position is correct // Make sure that the player is on the ground, and in the centre x/z of the current column @@ -354,17 +354,17 @@ void PlayerList::validatePlayerSpawnPosition(std::shared_ptr playe { player->setPos(player->x, player->y + 1, player->z); } - + app.DebugPrintf("Updated pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); } } -void PlayerList::add(std::shared_ptr player) +void PlayerList::add(shared_ptr player) { - //broadcastAll(std::shared_ptr( new PlayerInfoPacket(player->name, true, 1000) ) ); + //broadcastAll(shared_ptr( new PlayerInfoPacket(player->name, true, 1000) ) ); if( player->connection->getNetworkPlayer() ) { - broadcastAll(std::shared_ptr( new PlayerInfoPacket( player ) ) ); + broadcastAll(shared_ptr( new PlayerInfoPacket( player ) ) ); } players.push_back(player); @@ -380,42 +380,42 @@ void PlayerList::add(std::shared_ptr player) // Some code from here has been moved to the above validatePlayerSpawnPosition function // 4J Stu - Swapped these lines about so that we get the chunk visiblity packet way ahead of all the add tracked entity packets - // Fix for #9169 - ART : Sign text is replaced with the words �Awaiting approval�. + // Fix for #9169 - ART : Sign text is replaced with the words Awaiting approval. changeDimension(player, NULL); level->addEntity(player); for (int i = 0; i < players.size(); i++) { - std::shared_ptr op = players.at(i); - //player->connection->send(std::shared_ptr( new PlayerInfoPacket(op->name, true, op->latency) ) ); + shared_ptr op = players.at(i); + //player->connection->send(shared_ptr( new PlayerInfoPacket(op->name, true, op->latency) ) ); if( op->connection->getNetworkPlayer() ) { - player->connection->send(std::shared_ptr( new PlayerInfoPacket( op ) ) ); + player->connection->send(shared_ptr( new PlayerInfoPacket( op ) ) ); } } if(level->isAtLeastOnePlayerSleeping()) { - std::shared_ptr firstSleepingPlayer = nullptr; + shared_ptr firstSleepingPlayer = nullptr; for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr thisPlayer = players[i]; + shared_ptr thisPlayer = players[i]; if(thisPlayer->isSleeping()) { - if(firstSleepingPlayer == NULL) firstSleepingPlayer = thisPlayer; - thisPlayer->connection->send(std::shared_ptr( new ChatPacket(thisPlayer->name, ChatPacket::e_ChatBedMeSleep))); + if(firstSleepingPlayer == NULL) firstSleepingPlayer = thisPlayer; + thisPlayer->connection->send(shared_ptr( new ChatPacket(thisPlayer->name, ChatPacket::e_ChatBedMeSleep))); } } - player->connection->send(std::shared_ptr( new ChatPacket(firstSleepingPlayer->name, ChatPacket::e_ChatBedPlayerSleep))); + player->connection->send(shared_ptr( new ChatPacket(firstSleepingPlayer->name, ChatPacket::e_ChatBedPlayerSleep))); } } -void PlayerList::move(std::shared_ptr player) +void PlayerList::move(shared_ptr player) { player->getLevel()->getChunkMap()->move(player); } -void PlayerList::remove(std::shared_ptr player) +void PlayerList::remove(shared_ptr player) { save(player); //4J Stu - We don't want to save the map data for guests, so when we are sure that the player is gone delete the map @@ -428,7 +428,7 @@ void PlayerList::remove(std::shared_ptr player) { players.erase(it); } - //broadcastAll(std::shared_ptr( new PlayerInfoPacket(player->name, false, 9999) ) ); + //broadcastAll(shared_ptr( new PlayerInfoPacket(player->name, false, 9999) ) ); removePlayerFromReceiving(player); player->connection = nullptr; // Must remove reference to connection, or else there is a circular dependency @@ -439,15 +439,15 @@ void PlayerList::remove(std::shared_ptr player) saveAll(NULL,false); } -std::shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID onlineXuid) +shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID onlineXuid) { if (players.size() >= maxPlayers) { pendingConnection->disconnect(DisconnectPacket::eDisconnect_ServerFull); - return std::shared_ptr(); + return shared_ptr(); } - - std::shared_ptr player = std::shared_ptr(new ServerPlayer(server, server->getLevel(0), userName, new ServerPlayerGameMode(server->getLevel(0)) )); + + shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(0), userName, new ServerPlayerGameMode(server->getLevel(0)) )); player->gameMode->player = player; // 4J added as had to remove this assignment from ServerPlayer ctor player->setXuid( xuid ); // 4J Added player->setOnlineXuid( onlineXuid ); // 4J Added @@ -469,9 +469,9 @@ std::shared_ptr PlayerList::getPlayerForLogin(PendingConnection *p return player; } -std::shared_ptr PlayerList::respawn(std::shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData) +shared_ptr PlayerList::respawn(shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData) { - // How we handle the entity tracker depends on whether we are the primary player currently, and whether there will be any player in the same system in the same dimension once we finish respawning. + // How we handle the entity tracker depends on whether we are the primary player currently, and whether there will be any player in the same system in the same dimension once we finish respawning. bool isPrimary = canReceiveAllPackets(serverPlayer); // Is this the primary player in its current dimension? int oldDimension = serverPlayer->dimension; bool isEmptying = ( targetDimension != oldDimension); // We're not emptying this dimension on this machine if this player is going back into the same dimension @@ -483,7 +483,7 @@ std::shared_ptr PlayerList::respawn(std::shared_ptr for( unsigned int i = 0; i < players.size(); i++ ) { - std::shared_ptr ep = players[i]; + shared_ptr ep = players[i]; if( ep == serverPlayer ) continue; if( ep->dimension != oldDimension ) continue; @@ -539,8 +539,8 @@ std::shared_ptr PlayerList::respawn(std::shared_ptr PlayerUID playerXuid = serverPlayer->getXuid(); PlayerUID playerOnlineXuid = serverPlayer->getOnlineXuid(); - - std::shared_ptr player = std::shared_ptr(new ServerPlayer(server, server->getLevel(serverPlayer->dimension), serverPlayer->name, new ServerPlayerGameMode(server->getLevel(serverPlayer->dimension)))); + + shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(serverPlayer->dimension), serverPlayer->name, new ServerPlayerGameMode(server->getLevel(serverPlayer->dimension)))); player->restoreFrom(serverPlayer, keepAllPlayerData); if (keepAllPlayerData) { @@ -598,7 +598,7 @@ std::shared_ptr PlayerList::respawn(std::shared_ptr } else { - player->connection->send( std::shared_ptr( new GameEventPacket(GameEventPacket::NO_RESPAWN_BED_AVAILABLE, 0) ) ); + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::NO_RESPAWN_BED_AVAILABLE, 0) ) ); } delete bedPosition; } @@ -611,7 +611,7 @@ std::shared_ptr PlayerList::respawn(std::shared_ptr player->setPos(player->x, player->y + 1, player->z); } - player->connection->send( std::shared_ptr( new RespawnPacket((char) player->dimension, player->level->getSeed(), player->level->getMaxBuildHeight(), + player->connection->send( shared_ptr( new RespawnPacket((char) player->dimension, player->level->getSeed(), player->level->getMaxBuildHeight(), player->gameMode->getGameModeForPlayer(), level->difficulty, level->getLevelData()->getGenerator(), player->level->useNewSeaLevel(), player->entityId, level->getLevelData()->getXZSize(), level->getLevelData()->getHellScale()) ) ); player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); @@ -623,7 +623,7 @@ std::shared_ptr PlayerList::respawn(std::shared_ptr { MobEffectInstance *effect = *it; - player->connection->send(std::shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); + player->connection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); } delete activeEffects; player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); @@ -639,7 +639,7 @@ std::shared_ptr PlayerList::respawn(std::shared_ptr // 4J-JEV - Dying before this point in the tutorial is pretty annoying, // making sure to remove health/hunger and give you back your meat. - if( Minecraft::GetInstance()->isTutorial() + if( Minecraft::GetInstance()->isTutorial() && (!Minecraft::GetInstance()->gameMode->getTutorial()->isStateCompleted(e_Tutorial_State_Food_Bar)) ) { app.getGameRuleDefinitions()->postProcessPlayer(player); @@ -654,10 +654,10 @@ std::shared_ptr PlayerList::respawn(std::shared_ptr } -void PlayerList::toggleDimension(std::shared_ptr player, int targetDimension) +void PlayerList::toggleDimension(shared_ptr player, int targetDimension) { int lastDimension = player->dimension; - // How we handle the entity tracker depends on whether we are the primary player currently, and whether there will be any player in the same system in the same dimension once we finish respawning. + // How we handle the entity tracker depends on whether we are the primary player currently, and whether there will be any player in the same system in the same dimension once we finish respawning. bool isPrimary = canReceiveAllPackets(player); // Is this the primary player in its current dimension? bool isEmptying = true; @@ -666,7 +666,7 @@ void PlayerList::toggleDimension(std::shared_ptr player, int targe for( unsigned int i = 0; i < players.size(); i++ ) { - std::shared_ptr ep = players[i]; + shared_ptr ep = players[i]; if( ep == player ) continue; if( ep->dimension != lastDimension ) continue; @@ -728,7 +728,7 @@ void PlayerList::toggleDimension(std::shared_ptr player, int targe // 4J Stu Added so that we remove entities from the correct level, after the respawn packet we will be in the wrong level player->flushEntitiesToRemove(); - player->connection->send( std::shared_ptr( new RespawnPacket((char) player->dimension, newLevel->getSeed(), newLevel->getMaxBuildHeight(), + player->connection->send( shared_ptr( new RespawnPacket((char) player->dimension, newLevel->getSeed(), newLevel->getMaxBuildHeight(), player->gameMode->getGameModeForPlayer(), newLevel->difficulty, newLevel->getLevelData()->getGenerator(), newLevel->useNewSeaLevel(), player->entityId, newLevel->getLevelData()->getXZSize(), newLevel->getLevelData()->getHellScale()) ) ); @@ -772,7 +772,7 @@ void PlayerList::toggleDimension(std::shared_ptr player, int targe oldLevel->tick(player, false); } } - + removePlayerFromReceiving(player, false, lastDimension); addPlayerToReceiving(player); @@ -807,7 +807,7 @@ void PlayerList::toggleDimension(std::shared_ptr player, int targe // Force sending of the current chunk player->doTick(true, true, true); } - + player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); // 4J Stu - Fix for #64683 - Customer Encountered: TU7: Content: Gameplay: Potion effects are removed after using the Nether Portal @@ -816,7 +816,7 @@ void PlayerList::toggleDimension(std::shared_ptr player, int targe { MobEffectInstance *effect = *it; - player->connection->send(std::shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); + player->connection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); } delete activeEffects; player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); @@ -833,13 +833,13 @@ void PlayerList::tick() sendAllPlayerInfoIn = 0; } - if (sendAllPlayerInfoIn < players.size()) + if (sendAllPlayerInfoIn < players.size()) { - std::shared_ptr op = players[sendAllPlayerInfoIn]; - //broadcastAll(std::shared_ptr( new PlayerInfoPacket(op->name, true, op->latency) ) ); + shared_ptr op = players[sendAllPlayerInfoIn]; + //broadcastAll(shared_ptr( new PlayerInfoPacket(op->name, true, op->latency) ) ); if( op->connection->getNetworkPlayer() ) { - broadcastAll(std::shared_ptr( new PlayerInfoPacket( op ) ) ); + broadcastAll(shared_ptr( new PlayerInfoPacket( op ) ) ); } } @@ -849,11 +849,11 @@ void PlayerList::tick() BYTE smallId = m_smallIdsToClose.front(); m_smallIdsToClose.pop_front(); - std::shared_ptr player = nullptr; + shared_ptr player = nullptr; for(unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr p = players.at(i); + shared_ptr p = players.at(i); // 4J Stu - May be being a bit overprotective with all the NULL checks, but adding late in TU7 so want to be safe if (p != NULL && p->connection != NULL && p->connection->connection != NULL && p->connection->connection->getSocket() != NULL && p->connection->connection->getSocket()->getSmallId() == smallId ) { @@ -882,11 +882,11 @@ void PlayerList::tick() //#ifdef _XBOX PlayerUID xuid = selectedPlayer->GetUID(); // Kick this player from the game - std::shared_ptr player = nullptr; + shared_ptr player = nullptr; for(unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr p = players.at(i); + shared_ptr p = players.at(i); PlayerUID playersXuid = p->getOnlineXuid(); if (p != NULL && ProfileManager.AreXUIDSEqual(playersXuid, xuid ) ) { @@ -901,7 +901,7 @@ void PlayerList::tick() // 4J Stu - If we have kicked a player, make sure that they have no privileges if they later try to join the world when trust players is off player->enableAllPlayerPrivileges( false ); player->connection->setWasKicked(); - player->connection->send( std::shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Kicked) )); + player->connection->send( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Kicked) )); } //#endif } @@ -914,10 +914,10 @@ void PlayerList::tick() { for(unsigned int i = 0; i < receiveAllPlayers[dim].size(); ++i) { - std::shared_ptr currentPlayer = receiveAllPlayers[dim][i]; + shared_ptr currentPlayer = receiveAllPlayers[dim][i]; if(currentPlayer->removed) { - std::shared_ptr newPlayer = findAlivePlayerOnSystem(currentPlayer); + shared_ptr newPlayer = findAlivePlayerOnSystem(currentPlayer); if(newPlayer != NULL) { receiveAllPlayers[dim][i] = newPlayer; @@ -939,20 +939,20 @@ void PlayerList::prioritiseTileChanges(int x, int y, int z, int dimension) server->getLevel(dimension)->getChunkMap()->prioritiseTileChanges(x, y, z); } -void PlayerList::broadcastAll(std::shared_ptr packet) +void PlayerList::broadcastAll(shared_ptr packet) { for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr player = players[i]; + shared_ptr player = players[i]; player->connection->send(packet); } } -void PlayerList::broadcastAll(std::shared_ptr packet, int dimension) +void PlayerList::broadcastAll(shared_ptr packet, int dimension) { for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr player = players[i]; + shared_ptr player = players[i]; if (player->dimension == dimension) player->connection->send(packet); } } @@ -978,7 +978,7 @@ bool PlayerList::isOp(const wstring& name) return false; } -bool PlayerList::isOp(std::shared_ptr player) +bool PlayerList::isOp(shared_ptr player) { bool cheatsEnabled = app.GetGameHostOption(eGameHostOption_CheatsEnabled); #ifdef _DEBUG_MENUS_ENABLED @@ -989,11 +989,11 @@ bool PlayerList::isOp(std::shared_ptr player) return isOp; } -std::shared_ptr PlayerList::getPlayer(const wstring& name) +shared_ptr PlayerList::getPlayer(const wstring& name) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr p = players[i]; + shared_ptr p = players[i]; if (p->name == name) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway { return p; @@ -1003,11 +1003,11 @@ std::shared_ptr PlayerList::getPlayer(const wstring& name) } // 4J Added -std::shared_ptr PlayerList::getPlayer(PlayerUID uid) +shared_ptr PlayerList::getPlayer(PlayerUID uid) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr p = players[i]; + shared_ptr p = players[i]; if (p->getXuid() == uid || p->getOnlineXuid() == uid) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway { return p; @@ -1018,23 +1018,23 @@ std::shared_ptr PlayerList::getPlayer(PlayerUID uid) void PlayerList::sendMessage(const wstring& name, const wstring& message) { - std::shared_ptr player = getPlayer(name); + shared_ptr player = getPlayer(name); if (player != NULL) { - player->connection->send( std::shared_ptr( new ChatPacket(message) ) ); + player->connection->send( shared_ptr( new ChatPacket(message) ) ); } } -void PlayerList::broadcast(double x, double y, double z, double range, int dimension, std::shared_ptr packet) +void PlayerList::broadcast(double x, double y, double z, double range, int dimension, shared_ptr packet) { broadcast(nullptr, x, y, z, range, dimension, packet); } -void PlayerList::broadcast(std::shared_ptr except, double x, double y, double z, double range, int dimension, std::shared_ptr packet) +void PlayerList::broadcast(shared_ptr except, double x, double y, double z, double range, int dimension, shared_ptr packet) { // 4J - altered so that we don't send to the same machine more than once. Add the source player to the machines we have "sent" to as it doesn't need to go to that // machine either - vector< std::shared_ptr > sentTo; + vector< shared_ptr > sentTo; if( except != NULL ) { sentTo.push_back(dynamic_pointer_cast(except)); @@ -1042,7 +1042,7 @@ void PlayerList::broadcast(std::shared_ptr except, double x, double y, d for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr p = players[i]; + shared_ptr p = players[i]; if (p == except) continue; if (p->dimension != dimension) continue; @@ -1057,9 +1057,9 @@ void PlayerList::broadcast(std::shared_ptr except, double x, double y, d } else { - for(unsigned int j = 0; j < sentTo.size(); j++ ) + for(unsigned int j = 0; j < sentTo.size(); j++ ) { - std::shared_ptr player2 = sentTo[j]; + shared_ptr player2 = sentTo[j]; INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) { @@ -1080,7 +1080,7 @@ void PlayerList::broadcast(std::shared_ptr except, double x, double y, d if (xd * xd + yd * yd + zd * zd < range * range) { #if 0 // _DEBUG - std::shared_ptr SoundPacket= dynamic_pointer_cast(packet); + shared_ptr SoundPacket= dynamic_pointer_cast(packet); if(SoundPacket) { @@ -1099,10 +1099,10 @@ void PlayerList::broadcast(std::shared_ptr except, double x, double y, d void PlayerList::broadcastToAllOps(const wstring& message) { - std::shared_ptr chatPacket = std::shared_ptr( new ChatPacket(message) ); + shared_ptr chatPacket = shared_ptr( new ChatPacket(message) ); for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr p = players[i]; + shared_ptr p = players[i]; if (isOp(p->name)) { p->connection->send(chatPacket); @@ -1110,9 +1110,9 @@ void PlayerList::broadcastToAllOps(const wstring& message) } } -bool PlayerList::sendTo(const wstring& name, std::shared_ptr packet) +bool PlayerList::sendTo(const wstring& name, shared_ptr packet) { - std::shared_ptr player = getPlayer(name); + shared_ptr player = getPlayer(name); if (player != NULL) { player->connection->send(packet); @@ -1131,7 +1131,7 @@ void PlayerList::saveAll(ProgressListener *progressListener, bool bDeleteGuestMa for (unsigned int i = 0; i < players.size(); i++) { playerIo->save(players[i]); - + //4J Stu - We don't want to save the map data for guests, so when we are sure that the player is gone delete the map if(bDeleteGuestMaps && players[i]->isGuest()) playerIo->deleteMapFilesForPlayer(players[i]); @@ -1154,28 +1154,28 @@ void PlayerList::reloadWhitelist() { } -void PlayerList::sendLevelInfo(std::shared_ptr player, ServerLevel *level) +void PlayerList::sendLevelInfo(shared_ptr player, ServerLevel *level) { - player->connection->send( std::shared_ptr( new SetTimePacket(level->getTime()) ) ); + player->connection->send( shared_ptr( new SetTimePacket(level->getTime()) ) ); if (level->isRaining()) { - player->connection->send( std::shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); } else { // 4J Stu - Fix for #44836 - Customer Encountered: Out of Sync Weather [A-10] // If it was raining when the player left the level, and is now not raining we need to make sure that state is updated - player->connection->send( std::shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); } - // send the stronghold position if there is one + // send the stronghold position if there is one if((level->dimension->id==0) && level->getLevelData()->getHasStronghold()) { - player->connection->send( std::shared_ptr( new XZPacket(XZPacket::STRONGHOLD,level->getLevelData()->getXStronghold(),level->getLevelData()->getZStronghold()) ) ); + player->connection->send( shared_ptr( new XZPacket(XZPacket::STRONGHOLD,level->getLevelData()->getXStronghold(),level->getLevelData()->getZStronghold()) ) ); } } -void PlayerList::sendAllPlayerInfo(std::shared_ptr player) +void PlayerList::sendAllPlayerInfo(shared_ptr player) { player->refreshContainer(player->inventoryMenu); player->resetSentInfo(); @@ -1218,7 +1218,7 @@ void PlayerList::setOverrideGameMode(GameType *gameMode) this->overrideGameMode = gameMode; } -void PlayerList::updatePlayerGameMode(std::shared_ptr newPlayer, std::shared_ptr oldPlayer, Level *level) +void PlayerList::updatePlayerGameMode(shared_ptr newPlayer, shared_ptr oldPlayer, Level *level) { // reset the player's game mode (first pick from old, then copy level if @@ -1239,7 +1239,7 @@ void PlayerList::setAllowCheatsForAllPlayers(bool allowCommands) this->allowCheatsForAllPlayers = allowCommands; } -std::shared_ptr PlayerList::findAlivePlayerOnSystem(std::shared_ptr player) +shared_ptr PlayerList::findAlivePlayerOnSystem(shared_ptr player) { int dimIndex, playerDim; dimIndex = playerDim = player->dimension; @@ -1251,7 +1251,7 @@ std::shared_ptr PlayerList::findAlivePlayerOnSystem(std::shared_pt { for(AUTO_VAR(itP, players.begin()); itP != players.end(); ++itP) { - std::shared_ptr newPlayer = *itP; + shared_ptr newPlayer = *itP; INetworkPlayer *otherPlayer = newPlayer->connection->getNetworkPlayer(); @@ -1270,7 +1270,7 @@ std::shared_ptr PlayerList::findAlivePlayerOnSystem(std::shared_pt return nullptr; } -void PlayerList::removePlayerFromReceiving(std::shared_ptr player, bool usePlayerDimension /*= true*/, int dimension /*= 0*/) +void PlayerList::removePlayerFromReceiving(shared_ptr player, bool usePlayerDimension /*= true*/, int dimension /*= 0*/) { int dimIndex, playerDim; dimIndex = playerDim = usePlayerDimension ? player->dimension : dimension; @@ -1297,7 +1297,7 @@ void PlayerList::removePlayerFromReceiving(std::shared_ptr player, { for(AUTO_VAR(itP, players.begin()); itP != players.end(); ++itP) { - std::shared_ptr newPlayer = *itP; + shared_ptr newPlayer = *itP; INetworkPlayer *otherPlayer = newPlayer->connection->getNetworkPlayer(); @@ -1324,7 +1324,7 @@ void PlayerList::removePlayerFromReceiving(std::shared_ptr player, // Re-check all active players and make sure they have someone on their system to receive all packets for(AUTO_VAR(itP, players.begin()); itP != players.end(); ++itP) { - std::shared_ptr newPlayer = *itP; + shared_ptr newPlayer = *itP; INetworkPlayer *checkingPlayer = newPlayer->connection->getNetworkPlayer(); if( checkingPlayer != NULL ) @@ -1335,7 +1335,7 @@ void PlayerList::removePlayerFromReceiving(std::shared_ptr player, bool foundPrimary = false; for(AUTO_VAR(it, receiveAllPlayers[newPlayerDim].begin()); it != receiveAllPlayers[newPlayerDim].end(); ++it) { - std::shared_ptr primaryPlayer = *it; + shared_ptr primaryPlayer = *it; INetworkPlayer *primPlayer = primaryPlayer->connection->getNetworkPlayer(); if(primPlayer != NULL && checkingPlayer->IsSameSystem( primPlayer ) ) { @@ -1355,7 +1355,7 @@ void PlayerList::removePlayerFromReceiving(std::shared_ptr player, } } -void PlayerList::addPlayerToReceiving(std::shared_ptr player) +void PlayerList::addPlayerToReceiving(shared_ptr player) { int playerDim = 0; if( player->dimension == -1 ) playerDim = 1; @@ -1380,16 +1380,16 @@ void PlayerList::addPlayerToReceiving(std::shared_ptr player) { for(AUTO_VAR(it, receiveAllPlayers[playerDim].begin()); it != receiveAllPlayers[playerDim].end(); ++it) { - std::shared_ptr oldPlayer = *it; + shared_ptr oldPlayer = *it; INetworkPlayer *checkingPlayer = oldPlayer->connection->getNetworkPlayer(); - if(checkingPlayer != NULL && checkingPlayer->IsSameSystem( thisPlayer ) ) + if(checkingPlayer != NULL && checkingPlayer->IsSameSystem( thisPlayer ) ) { shouldAddPlayer = false; break; } } } - + if( shouldAddPlayer ) { #ifndef _CONTENT_PACKAGE @@ -1399,14 +1399,14 @@ void PlayerList::addPlayerToReceiving(std::shared_ptr player) } } -bool PlayerList::canReceiveAllPackets(std::shared_ptr player) +bool PlayerList::canReceiveAllPackets(shared_ptr player) { int playerDim = 0; if( player->dimension == -1 ) playerDim = 1; else if( player->dimension == 1) playerDim = 2; for(AUTO_VAR(it, receiveAllPlayers[playerDim].begin()); it != receiveAllPlayers[playerDim].end(); ++it) { - std::shared_ptr newPlayer = *it; + shared_ptr newPlayer = *it; if(newPlayer == player) { return true; diff --git a/Minecraft.Client/PlayerList.h b/Minecraft.Client/PlayerList.h index 23b48f74..14bd6b2d 100644 --- a/Minecraft.Client/PlayerList.h +++ b/Minecraft.Client/PlayerList.h @@ -22,7 +22,7 @@ private: static const int SEND_PLAYER_INFO_INTERVAL = 20 * 10; // 4J - brought forward from 1.2.3 // public static Logger logger = Logger.getLogger("Minecraft"); public: - vector > players; + vector > players; private: MinecraftServer *server; @@ -51,60 +51,60 @@ private: int sendAllPlayerInfoIn; // 4J Added to maintain which players in which dimensions can receive all packet types - vector > receiveAllPlayers[3]; + vector > receiveAllPlayers[3]; private: - std::shared_ptr findAlivePlayerOnSystem(std::shared_ptr currentPlayer); + shared_ptr findAlivePlayerOnSystem(shared_ptr currentPlayer); public: - void removePlayerFromReceiving(std::shared_ptr player, bool usePlayerDimension = true, int dimension = 0); - void addPlayerToReceiving(std::shared_ptr player); - bool canReceiveAllPackets(std::shared_ptr player); + void removePlayerFromReceiving(shared_ptr player, bool usePlayerDimension = true, int dimension = 0); + void addPlayerToReceiving(shared_ptr player); + bool canReceiveAllPackets(shared_ptr player); public: PlayerList(MinecraftServer *server); ~PlayerList(); - void placeNewPlayer(Connection *connection, std::shared_ptr player, std::shared_ptr packet); + void placeNewPlayer(Connection *connection, shared_ptr player, shared_ptr packet); void setLevel(ServerLevelArray levels); - void changeDimension(std::shared_ptr player, ServerLevel *from); + void changeDimension(shared_ptr player, ServerLevel *from); int getMaxRange(); - bool load(std::shared_ptr player); // 4J Changed return val to bool to check if new player or loaded player + bool load(shared_ptr player); // 4J Changed return val to bool to check if new player or loaded player protected: - void save(std::shared_ptr player); + void save(shared_ptr player); public: - void validatePlayerSpawnPosition(std::shared_ptr player); // 4J Added - void add(std::shared_ptr player); - void move(std::shared_ptr player); - void remove(std::shared_ptr player); - std::shared_ptr getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID OnlineXuid); - std::shared_ptr respawn(std::shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData); - void toggleDimension(std::shared_ptr player, int targetDimension); + void validatePlayerSpawnPosition(shared_ptr player); // 4J Added + void add(shared_ptr player); + void move(shared_ptr player); + void remove(shared_ptr player); + shared_ptr getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID OnlineXuid); + shared_ptr respawn(shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData); + void toggleDimension(shared_ptr player, int targetDimension); void tick(); bool isTrackingTile(int x, int y, int z, int dimension); // 4J added void prioritiseTileChanges(int x, int y, int z, int dimension); // 4J added - void broadcastAll(std::shared_ptr packet); - void broadcastAll(std::shared_ptr packet, int dimension); + void broadcastAll(shared_ptr packet); + void broadcastAll(shared_ptr packet, int dimension); wstring getPlayerNames(); public: bool isWhiteListed(const wstring& name); bool isOp(const wstring& name); - bool isOp(std::shared_ptr player); // 4J Added - std::shared_ptr getPlayer(const wstring& name); - std::shared_ptr getPlayer(PlayerUID uid); + bool isOp(shared_ptr player); // 4J Added + shared_ptr getPlayer(const wstring& name); + shared_ptr getPlayer(PlayerUID uid); void sendMessage(const wstring& name, const wstring& message); - void broadcast(double x, double y, double z, double range, int dimension, std::shared_ptr packet); - void broadcast(std::shared_ptr except, double x, double y, double z, double range, int dimension, std::shared_ptr packet); + void broadcast(double x, double y, double z, double range, int dimension, shared_ptr packet); + void broadcast(shared_ptr except, double x, double y, double z, double range, int dimension, shared_ptr packet); void broadcastToAllOps(const wstring& message); - bool sendTo(const wstring& name, std::shared_ptr packet); + bool sendTo(const wstring& name, shared_ptr packet); // 4J Added ProgressListener *progressListener param and bDeleteGuestMaps param void saveAll(ProgressListener *progressListener, bool bDeleteGuestMaps = false); void whiteList(const wstring& playerName); void blackList(const wstring& playerName); // Set getWhiteList(); / 4J removed void reloadWhitelist(); - void sendLevelInfo(std::shared_ptr player, ServerLevel *level); - void sendAllPlayerInfo(std::shared_ptr player); + void sendLevelInfo(shared_ptr player, ServerLevel *level); + void sendAllPlayerInfo(shared_ptr player); int getPlayerCount(); int getPlayerCount(ServerLevel *level); // 4J Added int getMaxPlayers(); @@ -113,7 +113,7 @@ public: void setOverrideGameMode(GameType *gameMode); private: - void updatePlayerGameMode(std::shared_ptr newPlayer, std::shared_ptr oldPlayer, Level *level); + void updatePlayerGameMode(shared_ptr newPlayer, shared_ptr oldPlayer, Level *level); public: void setAllowCheatsForAllPlayers(bool allowCommands); diff --git a/Minecraft.Client/PlayerRenderer.cpp b/Minecraft.Client/PlayerRenderer.cpp index a4455c71..c332b41c 100644 --- a/Minecraft.Client/PlayerRenderer.cpp +++ b/Minecraft.Client/PlayerRenderer.cpp @@ -13,7 +13,7 @@ #include "..\Minecraft.World\net.minecraft.h" #include "..\Minecraft.World\StringHelpers.h" -const unsigned int PlayerRenderer::s_nametagColors[MINECRAFT_NET_MAX_PLAYERS] = +const unsigned int PlayerRenderer::s_nametagColors[MINECRAFT_NET_MAX_PLAYERS] = { 0xff000000, // WHITE (represents the "white" player, but using black as the colour) 0xff33cc33, // GREEN @@ -46,10 +46,10 @@ unsigned int PlayerRenderer::getNametagColour(int index) return 0xFF000000; } -int PlayerRenderer::prepareArmor(std::shared_ptr _player, int layer, float a) +int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr player = dynamic_pointer_cast(_player); + shared_ptr player = dynamic_pointer_cast(_player); // 4J-PB - need to disable rendering armour for some special skins (Daleks) unsigned int uiAnimOverrideBitmask=player->getAnimOverrideBitmask(); @@ -58,7 +58,7 @@ int PlayerRenderer::prepareArmor(std::shared_ptr _player, int layer, float return -1; } - std::shared_ptr itemInstance = player->inventory->getArmor(3 - layer); + shared_ptr itemInstance = player->inventory->getArmor(3 - layer); if (itemInstance != NULL) { Item *item = itemInstance->getItem(); @@ -108,11 +108,11 @@ int PlayerRenderer::prepareArmor(std::shared_ptr _player, int layer, float } -void PlayerRenderer::prepareSecondPassArmor(std::shared_ptr _player, int layer, float a) +void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr player = dynamic_pointer_cast(_player); - std::shared_ptr itemInstance = player->inventory->getArmor(3 - layer); + shared_ptr player = dynamic_pointer_cast(_player); + shared_ptr itemInstance = player->inventory->getArmor(3 - layer); if (itemInstance != NULL) { Item *item = itemInstance->getItem(); @@ -127,14 +127,14 @@ void PlayerRenderer::prepareSecondPassArmor(std::shared_ptr _player, int la } } -void PlayerRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void PlayerRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if(mob->hasInvisiblePrivilege()) return; - std::shared_ptr item = mob->inventory->getSelected(); + shared_ptr item = mob->inventory->getSelected(); armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = item != NULL ? 1 : 0; if (item != NULL) { @@ -228,10 +228,10 @@ void PlayerRenderer::render(std::shared_ptr _mob, double x, double y, do } -void PlayerRenderer::renderName(std::shared_ptr _mob, double x, double y, double z) +void PlayerRenderer::renderName(shared_ptr _mob, double x, double y, double z) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if (Minecraft::renderNames() && mob != entityRenderDispatcher->cameraEntity && !mob->isInvisibleTo(Minecraft::GetInstance()->player) ) // 4J-JEV: Todo, move to LivingEntityRenderer. @@ -256,7 +256,7 @@ void PlayerRenderer::renderName(std::shared_ptr _mob, double x, double y, d { if ( app.GetGameSettings(eGameSetting_DisplayHUD)==0 ) { - // 4J-PB - turn off gamertag render + // 4J-PB - turn off gamertag render return; } @@ -316,14 +316,14 @@ void PlayerRenderer::renderName(std::shared_ptr _mob, double x, double y, d } -void PlayerRenderer::additionalRendering(std::shared_ptr _mob, float a) +void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) { MobRenderer::additionalRendering(_mob,a); // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); - std::shared_ptr headGear = mob->inventory->getArmor(3); + shared_ptr headGear = mob->inventory->getArmor(3); if (headGear != NULL) { // don't render the pumpkin for the skins @@ -426,9 +426,9 @@ void PlayerRenderer::additionalRendering(std::shared_ptr _mob, float a) humanoidModel->renderCloak(1 / 16.0f,true); glPopMatrix(); } + - - std::shared_ptr item = mob->inventory->getSelected(); + shared_ptr item = mob->inventory->getSelected(); if (item != NULL) { @@ -438,7 +438,7 @@ void PlayerRenderer::additionalRendering(std::shared_ptr _mob, float a) if (mob->fishing != NULL) { - item = std::shared_ptr( new ItemInstance(Item::stick) ); + item = shared_ptr( new ItemInstance(Item::stick) ); } UseAnim anim = UseAnim_none;//null; @@ -521,7 +521,7 @@ void PlayerRenderer::additionalRendering(std::shared_ptr _mob, float a) } -void PlayerRenderer::scale(std::shared_ptr player, float a) +void PlayerRenderer::scale(shared_ptr player, float a) { float s = 15 / 16.0f; glScalef(s, s, s); @@ -540,10 +540,10 @@ void PlayerRenderer::renderHand() } } -void PlayerRenderer::setupPosition(std::shared_ptr _mob, double x, double y, double z) +void PlayerRenderer::setupPosition(shared_ptr _mob, double x, double y, double z) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if (mob->isAlive() && mob->isSleeping()) { @@ -556,10 +556,10 @@ void PlayerRenderer::setupPosition(std::shared_ptr _mob, double x, double y } } -void PlayerRenderer::setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a) +void PlayerRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if (mob->isAlive() && mob->isSleeping()) { @@ -574,11 +574,11 @@ void PlayerRenderer::setupRotations(std::shared_ptr _mob, float bob, float } // 4J Added override to stop rendering shadow if player is invisible -void PlayerRenderer::renderShadow(std::shared_ptr e, double x, double y, double z, float pow, float a) +void PlayerRenderer::renderShadow(shared_ptr e, double x, double y, double z, float pow, float a) { if(app.GetGameHostOption(eGameHostOption_HostCanBeInvisible) > 0) { - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); if(player != NULL && player->hasInvisiblePrivilege()) return; } EntityRenderer::renderShadow(e,x,y,z,pow,a); diff --git a/Minecraft.Client/PlayerRenderer.h b/Minecraft.Client/PlayerRenderer.h index 0d82fb8f..10564104 100644 --- a/Minecraft.Client/PlayerRenderer.h +++ b/Minecraft.Client/PlayerRenderer.h @@ -23,20 +23,20 @@ private: static const wstring MATERIAL_NAMES[5]; protected: - virtual int prepareArmor(std::shared_ptr _player, int layer, float a); - virtual void prepareSecondPassArmor(std::shared_ptr mob, int layer, float a); + virtual int prepareArmor(shared_ptr _player, int layer, float a); + virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); public: - virtual void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - virtual void renderName(std::shared_ptr _mob, double x, double y, double z); - virtual void additionalRendering(std::shared_ptr _mob, float a); - virtual void scale(std::shared_ptr _player, float a); + virtual void renderName(shared_ptr _mob, double x, double y, double z); + virtual void additionalRendering(shared_ptr _mob, float a); + virtual void scale(shared_ptr _player, float a); public: void renderHand(); protected: - virtual void setupPosition(std::shared_ptr _mob, double x, double y, double z); - virtual void setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a); + virtual void setupPosition(shared_ptr _mob, double x, double y, double z); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); -private: - virtual void renderShadow(std::shared_ptr e, double x, double y, double z, float pow, float a); // 4J Added override +private: + virtual void renderShadow(shared_ptr e, double x, double y, double z, float pow, float a); // 4J Added override }; \ No newline at end of file diff --git a/Minecraft.Client/QuadrupedModel.cpp b/Minecraft.Client/QuadrupedModel.cpp index f106607d..fa7e3b4b 100644 --- a/Minecraft.Client/QuadrupedModel.cpp +++ b/Minecraft.Client/QuadrupedModel.cpp @@ -41,11 +41,11 @@ QuadrupedModel::QuadrupedModel(int legSize, float g) : Model() leg3->compile(1.0f/16.0f); } -void QuadrupedModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void QuadrupedModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); - if (young) + if (young) { float ss = 2.0f; glPushMatrix(); @@ -61,8 +61,8 @@ void QuadrupedModel::render(std::shared_ptr entity, float time, float r, leg2->render(scale, usecompiled); leg3->render(scale, usecompiled); glPopMatrix(); - } - else + } + else { head->render(scale, usecompiled); body->render(scale, usecompiled); @@ -102,7 +102,7 @@ void QuadrupedModel::render(QuadrupedModel *model, float scale, bool usecompiled leg2->xRot = model->leg2->xRot; leg3->xRot = model->leg3->xRot; - if (young) + if (young) { float ss = 2.0f; glPushMatrix(); @@ -118,8 +118,8 @@ void QuadrupedModel::render(QuadrupedModel *model, float scale, bool usecompiled leg2->render(scale, usecompiled); leg3->render(scale, usecompiled); glPopMatrix(); - } - else + } + else { head->render(scale, usecompiled); body->render(scale, usecompiled); diff --git a/Minecraft.Client/QuadrupedModel.h b/Minecraft.Client/QuadrupedModel.h index d1c24de7..47c50599 100644 --- a/Minecraft.Client/QuadrupedModel.h +++ b/Minecraft.Client/QuadrupedModel.h @@ -7,7 +7,7 @@ public: ModelPart *head, *body, *leg0, *leg1, *leg2, *leg3; QuadrupedModel(int legSize, float g); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); void render(QuadrupedModel *model, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/ReceivingLevelScreen.cpp b/Minecraft.Client/ReceivingLevelScreen.cpp index 1089dc51..0e9fe3ec 100644 --- a/Minecraft.Client/ReceivingLevelScreen.cpp +++ b/Minecraft.Client/ReceivingLevelScreen.cpp @@ -23,7 +23,7 @@ void ReceivingLevelScreen::tick() tickCount++; if (tickCount % 20 == 0) { - connection->send( std::shared_ptr( new KeepAlivePacket() ) ); + connection->send( shared_ptr( new KeepAlivePacket() ) ); } if (connection != NULL) { diff --git a/Minecraft.Client/RemotePlayer.cpp b/Minecraft.Client/RemotePlayer.cpp index d5deca18..c1b72864 100644 --- a/Minecraft.Client/RemotePlayer.cpp +++ b/Minecraft.Client/RemotePlayer.cpp @@ -66,7 +66,7 @@ void RemotePlayer::tick() if (!hasStartedUsingItem && isUsingItemFlag() && inventory->items[inventory->selected] != NULL) { - std::shared_ptr item = inventory->items[inventory->selected]; + shared_ptr item = inventory->items[inventory->selected]; startUsingItem(inventory->items[inventory->selected], Item::items[item->id]->getUseDuration(item)); hasStartedUsingItem = true; } @@ -129,7 +129,7 @@ void RemotePlayer::aiStep() } // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game -void RemotePlayer::setEquippedSlot(int slot, std::shared_ptr item) +void RemotePlayer::setEquippedSlot(int slot, shared_ptr item) { if (slot == 0) { diff --git a/Minecraft.Client/RemotePlayer.h b/Minecraft.Client/RemotePlayer.h index 19076ef6..b55fab16 100644 --- a/Minecraft.Client/RemotePlayer.h +++ b/Minecraft.Client/RemotePlayer.h @@ -26,7 +26,7 @@ public: virtual void tick(); virtual float getShadowHeightOffs(); virtual void aiStep(); - virtual void setEquippedSlot(int slot, std::shared_ptr item);// 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game + virtual void setEquippedSlot(int slot, shared_ptr item);// 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game virtual void animateRespawn(); virtual float getHeadHeight(); bool hasPermission(EGameCommand command) { return false; } diff --git a/Minecraft.Client/ServerCommandDispatcher.cpp b/Minecraft.Client/ServerCommandDispatcher.cpp index af0271fe..51dd42fe 100644 --- a/Minecraft.Client/ServerCommandDispatcher.cpp +++ b/Minecraft.Client/ServerCommandDispatcher.cpp @@ -52,13 +52,13 @@ ServerCommandDispatcher::ServerCommandDispatcher() Command::setLogger(this); } -void ServerCommandDispatcher::logAdminCommand(std::shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message, int customData, const wstring& additionalMessage) +void ServerCommandDispatcher::logAdminCommand(shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message, int customData, const wstring& additionalMessage) { PlayerList *playerList = MinecraftServer::getInstance()->getPlayers(); //for (Player player : MinecraftServer.getInstance().getPlayers().players) for(AUTO_VAR(it, playerList->players.begin()); it != playerList->players.end(); ++it) { - std::shared_ptr player = *it; + shared_ptr player = *it; if (player != source && playerList->isOp(player)) { // TODO: Change chat packet to be able to send more bits of data diff --git a/Minecraft.Client/ServerCommandDispatcher.h b/Minecraft.Client/ServerCommandDispatcher.h index 04847fce..306d4384 100644 --- a/Minecraft.Client/ServerCommandDispatcher.h +++ b/Minecraft.Client/ServerCommandDispatcher.h @@ -7,5 +7,5 @@ class ServerCommandDispatcher : public CommandDispatcher, public AdminLogCommand { public: ServerCommandDispatcher(); - void logAdminCommand(std::shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message = L"", int customData = -1, const wstring& additionalMessage = L""); + void logAdminCommand(shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message = L"", int customData = -1, const wstring& additionalMessage = L""); }; \ No newline at end of file diff --git a/Minecraft.Client/ServerConnection.cpp b/Minecraft.Client/ServerConnection.cpp index 064c7b51..9880a8c6 100644 --- a/Minecraft.Client/ServerConnection.cpp +++ b/Minecraft.Client/ServerConnection.cpp @@ -26,16 +26,16 @@ ServerConnection::~ServerConnection() // 4J - added to handle incoming connections, to replace thread that original used to have void ServerConnection::NewIncomingSocket(Socket *socket) { - std::shared_ptr unconnectedClient = std::shared_ptr(new PendingConnection(server, socket, L"Connection #" + _toString(connectionCounter++))); - handleConnection(unconnectedClient); + shared_ptr unconnectedClient = shared_ptr(new PendingConnection(server, socket, L"Connection #" + _toString(connectionCounter++))); + handleConnection(unconnectedClient); } -void ServerConnection::addPlayerConnection(std::shared_ptr uc) +void ServerConnection::addPlayerConnection(shared_ptr uc) { players.push_back(uc); } -void ServerConnection::handleConnection(std::shared_ptr uc) +void ServerConnection::handleConnection(shared_ptr uc) { EnterCriticalSection(&pending_cs); pending.push_back(uc); @@ -47,14 +47,14 @@ void ServerConnection::stop() EnterCriticalSection(&pending_cs); for (unsigned int i = 0; i < pending.size(); i++) { - std::shared_ptr uc = pending[i]; + shared_ptr uc = pending[i]; uc->connection->close(DisconnectPacket::eDisconnect_Closed); } LeaveCriticalSection(&pending_cs); for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr player = players[i]; + shared_ptr player = players[i]; player->connection->close(DisconnectPacket::eDisconnect_Closed); } } @@ -64,12 +64,12 @@ void ServerConnection::tick() { // MGH - changed this so that the the CS lock doesn't cover the tick (was causing a lockup when 2 players tried to join) EnterCriticalSection(&pending_cs); - vector< std::shared_ptr > tempPending = pending; + vector< shared_ptr > tempPending = pending; LeaveCriticalSection(&pending_cs); for (unsigned int i = 0; i < tempPending.size(); i++) { - std::shared_ptr uc = tempPending[i]; + shared_ptr uc = tempPending[i]; // try { // 4J - removed try/catch uc->tick(); // } catch (Exception e) { @@ -92,8 +92,8 @@ void ServerConnection::tick() for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr player = players[i]; - std::shared_ptr serverPlayer = player->getPlayer(); + shared_ptr player = players[i]; + shared_ptr serverPlayer = player->getPlayer(); if( serverPlayer ) { serverPlayer->doChunkSendingTick(false); @@ -138,7 +138,7 @@ void ServerConnection::handleTextureReceived(const wstring &textureName) } for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr player = players[i]; + shared_ptr player = players[i]; if (!player->done) { player->handleTextureReceived(textureName); @@ -155,7 +155,7 @@ void ServerConnection::handleTextureAndGeometryReceived(const wstring &textureNa } for (unsigned int i = 0; i < players.size(); i++) { - std::shared_ptr player = players[i]; + shared_ptr player = players[i]; if (!player->done) { player->handleTextureAndGeometryReceived(textureName); @@ -163,7 +163,7 @@ void ServerConnection::handleTextureAndGeometryReceived(const wstring &textureNa } } -void ServerConnection::handleServerSettingsChanged(std::shared_ptr packet) +void ServerConnection::handleServerSettingsChanged(shared_ptr packet) { Minecraft *pMinecraft = Minecraft::GetInstance(); @@ -176,7 +176,7 @@ void ServerConnection::handleServerSettingsChanged(std::shared_ptrdata); pMinecraft->levels[i]->difficulty = packet->data; } - } + } } // else if(packet->action==ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS)// options // { @@ -194,11 +194,11 @@ void ServerConnection::handleServerSettingsChanged(std::shared_ptroptions->SetGamertagSetting(false); // } -// +// // for (unsigned int i = 0; i < players.size(); i++) // { -// std::shared_ptr playerconnection = players[i]; -// playerconnection->setShowOnMaps(pMinecraft->options->GetGamertagSetting()); +// shared_ptr playerconnection = players[i]; +// playerconnection->setShowOnMaps(pMinecraft->options->GetGamertagSetting()); // } // } } \ No newline at end of file diff --git a/Minecraft.Client/ServerConnection.h b/Minecraft.Client/ServerConnection.h index e4105675..56c5d39e 100644 --- a/Minecraft.Client/ServerConnection.h +++ b/Minecraft.Client/ServerConnection.h @@ -20,8 +20,8 @@ private: int connectionCounter; private: CRITICAL_SECTION pending_cs; // 4J added - vector< std::shared_ptr > pending; - vector< std::shared_ptr > players; + vector< shared_ptr > pending; + vector< shared_ptr > players; // 4J - When the server requests a texture, it should add it to here while we are waiting for it vector m_pendingTextureRequests; @@ -34,9 +34,9 @@ public: void NewIncomingSocket(Socket *socket); // 4J - added void removeSpamProtection(Socket *socket) { }// 4J Stu - Not implemented as not required - void addPlayerConnection(std::shared_ptr uc); + void addPlayerConnection(shared_ptr uc); private: - void handleConnection(std::shared_ptr uc); + void handleConnection(shared_ptr uc); public: void stop(); void tick(); @@ -45,5 +45,5 @@ public: bool addPendingTextureRequest(const wstring &textureName); void handleTextureReceived(const wstring &textureName); void handleTextureAndGeometryReceived(const wstring &textureName); - void handleServerSettingsChanged(std::shared_ptr packet); + void handleServerSettingsChanged(shared_ptr packet); }; diff --git a/Minecraft.Client/ServerLevel.cpp b/Minecraft.Client/ServerLevel.cpp index c416bb85..05566ad8 100644 --- a/Minecraft.Client/ServerLevel.cpp +++ b/Minecraft.Client/ServerLevel.cpp @@ -91,7 +91,7 @@ void ServerLevel::staticCtor() }; -ServerLevel::ServerLevel(MinecraftServer *server, std::shared_ptrlevelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings) : Level(levelStorage, levelName, levelSettings, Dimension::getNew(dimension), false) +ServerLevel::ServerLevel(MinecraftServer *server, shared_ptrlevelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings) : Level(levelStorage, levelName, levelSettings, Dimension::getNew(dimension), false) { InitializeCriticalSection(&m_limiterCS); InitializeCriticalSection(&m_tickNextTickCS); @@ -289,7 +289,7 @@ void ServerLevel::updateSleepingPlayerList() m_bAtLeastOnePlayerSleeping = false; AUTO_VAR(itEnd, players.end()); - for (vector >::iterator it = players.begin(); it != itEnd; it++) + for (vector >::iterator it = players.begin(); it != itEnd; it++) { if (!(*it)->isSleeping()) { @@ -310,7 +310,7 @@ void ServerLevel::awakenAllPlayers() m_bAtLeastOnePlayerSleeping = false; AUTO_VAR(itEnd, players.end()); - for (vector >::iterator it = players.begin(); it != itEnd; it++) + for (vector >::iterator it = players.begin(); it != itEnd; it++) { if ((*it)->isSleeping()) { @@ -335,7 +335,7 @@ bool ServerLevel::allPlayersAreSleeping() { // all players are sleeping, but have they slept long enough? AUTO_VAR(itEnd, players.end()); - for (vector >::iterator it = players.begin(); it != itEnd; it++ ) + for (vector >::iterator it = players.begin(); it != itEnd; it++ ) { // System.out.println(player->entityId + ": " + player->getSleepTimer()); if (! (*it)->isSleepingLongEnough()) @@ -467,7 +467,7 @@ void ServerLevel::tickTiles() if (isRainingAt(x, y, z)) { - addGlobalEntity( std::shared_ptr( new LightningBolt(this, x, y, z) ) ); + addGlobalEntity( shared_ptr( new LightningBolt(this, x, y, z) ) ); lightningTime = 2; } } @@ -665,7 +665,7 @@ vector *ServerLevel::fetchTicksInChunk(LevelChunk *chunk, bool return results; } -void ServerLevel::tick(std::shared_ptr e, bool actual) +void ServerLevel::tick(shared_ptr e, bool actual) { if (!server->isAnimals() && ((e->GetType() & eTYPE_ANIMAL) || (e->GetType() & eTYPE_WATERANIMAL))) { @@ -681,7 +681,7 @@ void ServerLevel::tick(std::shared_ptr e, bool actual) } } -void ServerLevel::forceTick(std::shared_ptr e, bool actual) +void ServerLevel::forceTick(shared_ptr e, bool actual) { Level::tick(e, actual); } @@ -693,12 +693,12 @@ ChunkSource *ServerLevel::createChunkSource() return cache; } -vector > *ServerLevel::getTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1) +vector > *ServerLevel::getTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1) { - vector > *result = new vector >; + vector > *result = new vector >; for (unsigned int i = 0; i < tileEntityList.size(); i++) { - std::shared_ptr te = tileEntityList[i]; + shared_ptr te = tileEntityList[i]; if (te->x >= x0 && te->y >= y0 && te->z >= z0 && te->x < x1 && te->y < y1 && te->z < z1) { result->push_back(te); @@ -707,7 +707,7 @@ vector > *ServerLevel::getTileEntitiesInRegion(int x return result; } -bool ServerLevel::mayInteract(std::shared_ptr player, int xt, int yt, int zt, int content) +bool ServerLevel::mayInteract(shared_ptr player, int xt, int yt, int zt, int content) { // 4J-PB - This will look like a bug to players, and we really should have a message to explain why we're not allowing lava to be placed at or near a spawn point // We'll need to do this in a future update @@ -814,7 +814,7 @@ void ServerLevel::generateBonusItemsNearSpawn() if( getTile( x, y, z ) == Tile::chest_Id ) { - std::shared_ptr chest = dynamic_pointer_cast(getTileEntity(x, y, z)); + shared_ptr chest = dynamic_pointer_cast(getTileEntity(x, y, z)); if (chest != NULL) { if( chest->isBonusChest ) @@ -948,11 +948,11 @@ void ServerLevel::saveLevelData() savedDataStorage->save(); } -void ServerLevel::entityAdded(std::shared_ptr e) +void ServerLevel::entityAdded(shared_ptr e) { Level::entityAdded(e); entitiesById[e->entityId] = e; - vector > *es = e->getSubEntities(); + vector > *es = e->getSubEntities(); if (es != NULL) { //for (int i = 0; i < es.length; i++) @@ -964,11 +964,11 @@ void ServerLevel::entityAdded(std::shared_ptr e) entityAddedExtra(e); // 4J added } -void ServerLevel::entityRemoved(std::shared_ptr e) +void ServerLevel::entityRemoved(shared_ptr e) { Level::entityRemoved(e); entitiesById.erase(e->entityId); - vector > *es = e->getSubEntities(); + vector > *es = e->getSubEntities(); if (es != NULL) { //for (int i = 0; i < es.length; i++) @@ -980,32 +980,32 @@ void ServerLevel::entityRemoved(std::shared_ptr e) entityRemovedExtra(e); // 4J added } -std::shared_ptr ServerLevel::getEntity(int id) +shared_ptr ServerLevel::getEntity(int id) { return entitiesById[id]; } -bool ServerLevel::addGlobalEntity(std::shared_ptr e) +bool ServerLevel::addGlobalEntity(shared_ptr e) { if (Level::addGlobalEntity(e)) { - server->getPlayers()->broadcast(e->x, e->y, e->z, 512, dimension->id, std::shared_ptr( new AddGlobalEntityPacket(e) ) ); + server->getPlayers()->broadcast(e->x, e->y, e->z, 512, dimension->id, shared_ptr( new AddGlobalEntityPacket(e) ) ); return true; } return false; } -void ServerLevel::broadcastEntityEvent(std::shared_ptr e, byte event) +void ServerLevel::broadcastEntityEvent(shared_ptr e, byte event) { - std::shared_ptr p = std::shared_ptr( new EntityEventPacket(e->entityId, event) ); + shared_ptr p = shared_ptr( new EntityEventPacket(e->entityId, event) ); server->getLevel(dimension->id)->getTracker()->broadcastAndSend(e, p); } -std::shared_ptr ServerLevel::explode(std::shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks) +shared_ptr ServerLevel::explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks) { // instead of calling super, we run the same explosion code here except // we don't generate any particles - std::shared_ptr explosion = std::shared_ptr( new Explosion(this, source, x, y, z, r) ); + shared_ptr explosion = shared_ptr( new Explosion(this, source, x, y, z, r) ); explosion->fire = fire; explosion->destroyBlocks = destroyBlocks; explosion->explode(); @@ -1016,10 +1016,10 @@ std::shared_ptr ServerLevel::explode(std::shared_ptr source, explosion->toBlow.clear(); } - vector > sentTo; + vector > sentTo; for(AUTO_VAR(it, players.begin()); it != players.end(); ++it) { - std::shared_ptr player = dynamic_pointer_cast(*it); + shared_ptr player = dynamic_pointer_cast(*it); if (player->dimension != dimension->id) continue; bool knockbackOnly = false; @@ -1034,7 +1034,7 @@ std::shared_ptr ServerLevel::explode(std::shared_ptr source, { for(unsigned int j = 0; j < sentTo.size(); j++ ) { - std::shared_ptr player2 = sentTo[j]; + shared_ptr player2 = sentTo[j]; INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) { @@ -1049,7 +1049,7 @@ std::shared_ptr ServerLevel::explode(std::shared_ptr source, Vec3 *knockbackVec = explosion->getHitPlayerKnockback(player); //app.DebugPrintf("Sending %s with knockback (%f,%f,%f)\n", knockbackOnly?"knockbackOnly":"allExplosion",knockbackVec->x,knockbackVec->y,knockbackVec->z); // If the player is not the primary on the system, then we only want to send info for the knockback - player->connection->send( std::shared_ptr( new ExplodePacket(x, y, z, r, &explosion->toBlow, knockbackVec, knockbackOnly))); + player->connection->send( shared_ptr( new ExplodePacket(x, y, z, r, &explosion->toBlow, knockbackVec, knockbackOnly))); sentTo.push_back( player ); } } @@ -1088,7 +1088,7 @@ void ServerLevel::runTileEvents() if (doTileEvent(&(*it))) { TileEventData te = *it; - server->getPlayers()->broadcast(te.getX(), te.getY(), te.getZ(), 64, dimension->id, std::shared_ptr( new TileEventPacket(te.getX(), te.getY(), te.getZ(), te.getTile(), te.getParamA(), te.getParamB()))); + server->getPlayers()->broadcast(te.getX(), te.getY(), te.getZ(), 64, dimension->id, shared_ptr( new TileEventPacket(te.getX(), te.getY(), te.getZ(), te.getTile(), te.getParamA(), te.getParamB()))); } } tileEvents[runList].clear(); @@ -1119,11 +1119,11 @@ void ServerLevel::tickWeather() { if (wasRaining) { - server->getPlayers()->broadcastAll( std::shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); + server->getPlayers()->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); } else { - server->getPlayers()->broadcastAll( std::shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); + server->getPlayers()->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); } } @@ -1185,7 +1185,7 @@ void ServerLevel::runQueuedSendTileUpdates() } // 4J - added special versions of addEntity and extra processing on entity removed and added so we can limit the number of itementities created -bool ServerLevel::addEntity(std::shared_ptr e) +bool ServerLevel::addEntity(shared_ptr e) { // If its an item entity, and we've got to our capacity, delete the oldest if( dynamic_pointer_cast(e) != NULL ) @@ -1244,7 +1244,7 @@ bool ServerLevel::addEntity(std::shared_ptr e) } // Maintain a cound of primed tnt & falling tiles in this level -void ServerLevel::entityAddedExtra(std::shared_ptr e) +void ServerLevel::entityAddedExtra(shared_ptr e) { if( dynamic_pointer_cast(e) != NULL ) { @@ -1289,7 +1289,7 @@ void ServerLevel::entityAddedExtra(std::shared_ptr e) } // Maintain a cound of primed tnt & falling tiles in this level, and remove any item entities from our list -void ServerLevel::entityRemovedExtra(std::shared_ptr e) +void ServerLevel::entityRemovedExtra(shared_ptr e) { if( dynamic_pointer_cast(e) != NULL ) { diff --git a/Minecraft.Client/ServerLevel.h b/Minecraft.Client/ServerLevel.h index 82c5400e..ae413d11 100644 --- a/Minecraft.Client/ServerLevel.h +++ b/Minecraft.Client/ServerLevel.h @@ -41,7 +41,7 @@ private: int activeTileEventsList; public: static void staticCtor(); - ServerLevel(MinecraftServer *server, std::shared_ptrlevelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings); + ServerLevel(MinecraftServer *server, shared_ptrlevelStorage, const wstring& levelName, int dimension, LevelSettings *levelSettings); ~ServerLevel(); void tick(); Biome::MobSpawnerData *getRandomMobSpawnAt(MobCategory *mobCategory, int x, int y, int z); @@ -65,15 +65,15 @@ public: void tickEntities(); bool tickPendingTicks(bool force); vector *fetchTicksInChunk(LevelChunk *chunk, bool remove); - virtual void tick(std::shared_ptr e, bool actual); - void forceTick(std::shared_ptr e, bool actual); + virtual void tick(shared_ptr e, bool actual); + void forceTick(shared_ptr e, bool actual); bool AllPlayersAreSleeping() { return allPlayersSleeping;} // 4J added for a message to other players bool isAtLeastOnePlayerSleeping() { return m_bAtLeastOnePlayerSleeping;} protected: ChunkSource *createChunkSource(); // 4J - was virtual, but was called from parent ctor public: - vector > *getTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1); - virtual bool mayInteract(std::shared_ptr player, int xt, int yt, int zt, int id); + vector > *getTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1); + virtual bool mayInteract(shared_ptr player, int xt, int yt, int zt, int id); protected: virtual void initializeLevel(LevelSettings *settings); virtual void setInitialSpawn(LevelSettings *settings); @@ -90,16 +90,16 @@ public: private: void saveLevelData(); - typedef unordered_map , IntKeyHash2, IntKeyEq> intEntityMap; + typedef unordered_map , IntKeyHash2, IntKeyEq> intEntityMap; intEntityMap entitiesById; // 4J - was IntHashMap, using same hashing function as this uses protected: - virtual void entityAdded(std::shared_ptr e); - virtual void entityRemoved(std::shared_ptr e); + virtual void entityAdded(shared_ptr e); + virtual void entityRemoved(shared_ptr e); public: - std::shared_ptr getEntity(int id); - virtual bool addGlobalEntity(std::shared_ptr e); - void broadcastEntityEvent(std::shared_ptr e, byte event); - virtual std::shared_ptr explode(std::shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks); + shared_ptr getEntity(int id); + virtual bool addGlobalEntity(shared_ptr e); + void broadcastEntityEvent(shared_ptr e, byte event); + virtual shared_ptr explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks); virtual void tileEvent(int x, int y, int z, int tile, int b0, int b1); private: @@ -134,14 +134,14 @@ public: int m_primedTntCount; int m_fallingTileCount; CRITICAL_SECTION m_limiterCS; - list< std::shared_ptr > m_itemEntities; - list< std::shared_ptr > m_hangingEntities; - list< std::shared_ptr > m_arrowEntities; - list< std::shared_ptr > m_experienceOrbEntities; - - virtual bool addEntity(std::shared_ptr e); - void entityAddedExtra(std::shared_ptr e); - void entityRemovedExtra(std::shared_ptr e); + list< shared_ptr > m_itemEntities; + list< shared_ptr > m_hangingEntities; + list< shared_ptr > m_arrowEntities; + list< shared_ptr > m_experienceOrbEntities; + + virtual bool addEntity(shared_ptr e); + void entityAddedExtra(shared_ptr e); + void entityRemovedExtra(shared_ptr e); virtual bool newPrimedTntAllowed(); virtual bool newFallingTileAllowed(); diff --git a/Minecraft.Client/ServerLevelListener.cpp b/Minecraft.Client/ServerLevelListener.cpp index 6bcf5d28..3b12630f 100644 --- a/Minecraft.Client/ServerLevelListener.cpp +++ b/Minecraft.Client/ServerLevelListener.cpp @@ -18,7 +18,7 @@ ServerLevelListener::ServerLevelListener(MinecraftServer *server, ServerLevel *l this->level = level; } -// 4J removed - +// 4J removed - /* void ServerLevelListener::addParticle(const wstring& name, double x, double y, double z, double xa, double ya, double za) { @@ -33,22 +33,22 @@ void ServerLevelListener::allChanged() { } -void ServerLevelListener::entityAdded(std::shared_ptr entity) +void ServerLevelListener::entityAdded(shared_ptr entity) { MemSect(10); level->getTracker()->addEntity(entity); MemSect(0); } -void ServerLevelListener::entityRemoved(std::shared_ptr entity) +void ServerLevelListener::entityRemoved(shared_ptr entity) { level->getTracker()->removeEntity(entity); } // 4J added -void ServerLevelListener::playerRemoved(std::shared_ptr entity) +void ServerLevelListener::playerRemoved(shared_ptr entity) { - std::shared_ptr player = dynamic_pointer_cast(entity); + shared_ptr player = dynamic_pointer_cast(entity); player->getLevel()->getTracker()->removePlayer(entity); } @@ -59,25 +59,25 @@ void ServerLevelListener::playSound(int iSound, double x, double y, double z, fl app.DebugPrintf("ServerLevelListener received request for sound less than 0, so ignoring\n"); } else - { + { // 4J-PB - I don't want to broadcast player sounds to my local machine, since we're already playing these in the LevelRenderer::playSound. // The PC version does seem to do this and the result is I can stop walking , and then I'll hear my footstep sound with a delay - server->getPlayers()->broadcast(x, y, z, volume > 1 ? 16 * volume : 16, level->dimension->id, std::shared_ptr(new LevelSoundPacket(iSound, x, y, z, volume, pitch))); + server->getPlayers()->broadcast(x, y, z, volume > 1 ? 16 * volume : 16, level->dimension->id, shared_ptr(new LevelSoundPacket(iSound, x, y, z, volume, pitch))); } } -void ServerLevelListener::playSound(std::shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fClipSoundDist) +void ServerLevelListener::playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fClipSoundDist) { if(iSound < 0) { app.DebugPrintf("ServerLevelListener received request for sound less than 0, so ignoring\n"); } else - { + { // 4J-PB - I don't want to broadcast player sounds to my local machine, since we're already playing these in the LevelRenderer::playSound. // The PC version does seem to do this and the result is I can stop walking , and then I'll hear my footstep sound with a delay - std::shared_ptr player= dynamic_pointer_cast(entity); - server->getPlayers()->broadcast(player,x, y, z, volume > 1 ? 16 * volume : 16, level->dimension->id, std::shared_ptr(new LevelSoundPacket(iSound, x, y, z, volume, pitch))); + shared_ptr player= dynamic_pointer_cast(entity); + server->getPlayers()->broadcast(player,x, y, z, volume > 1 ? 16 * volume : 16, level->dimension->id, shared_ptr(new LevelSoundPacket(iSound, x, y, z, volume, pitch))); } } @@ -102,9 +102,9 @@ void ServerLevelListener::playStreamingMusic(const wstring& name, int x, int y, { } -void ServerLevelListener::levelEvent(std::shared_ptr source, int type, int x, int y, int z, int data) +void ServerLevelListener::levelEvent(shared_ptr source, int type, int x, int y, int z, int data) { - server->getPlayers()->broadcast(source, x, y, z, 64, level->dimension->id, std::shared_ptr( new LevelEventPacket(type, x, y, z, data) ) ); + server->getPlayers()->broadcast(source, x, y, z, 64, level->dimension->id, shared_ptr( new LevelEventPacket(type, x, y, z, data) ) ); } void ServerLevelListener::destroyTileProgress(int id, int x, int y, int z, int progress) @@ -112,7 +112,7 @@ void ServerLevelListener::destroyTileProgress(int id, int x, int y, int z, int p //for (ServerPlayer p : server->getPlayers()->players) for(AUTO_VAR(it, server->getPlayers()->players.begin()); it != server->getPlayers()->players.end(); ++it) { - std::shared_ptr p = *it; + shared_ptr p = *it; if (p == NULL || p->level != level || p->entityId == id) continue; double xd = (double) x - p->x; double yd = (double) y - p->y; @@ -120,7 +120,7 @@ void ServerLevelListener::destroyTileProgress(int id, int x, int y, int z, int p if (xd * xd + yd * yd + zd * zd < 32 * 32) { - p->connection->send(std::shared_ptr(new TileDestructionPacket(id, x, y, z, progress))); + p->connection->send(shared_ptr(new TileDestructionPacket(id, x, y, z, progress))); } } } \ No newline at end of file diff --git a/Minecraft.Client/ServerLevelListener.h b/Minecraft.Client/ServerLevelListener.h index 562aa013..1886a89d 100644 --- a/Minecraft.Client/ServerLevelListener.h +++ b/Minecraft.Client/ServerLevelListener.h @@ -18,16 +18,16 @@ public: // 4J removed - virtual void addParticle(const wstring& name, double x, double y, double z, double xa, double ya, double za); virtual void addParticle(ePARTICLE_TYPE name, double x, double y, double z, double xa, double ya, double za); // 4J added virtual void allChanged(); - virtual void entityAdded(std::shared_ptr entity); - virtual void entityRemoved(std::shared_ptr entity); - virtual void playerRemoved(std::shared_ptr entity); // 4J added - for when a player is removed from the level's player array, not just the entity storage + virtual void entityAdded(shared_ptr entity); + virtual void entityRemoved(shared_ptr entity); + virtual void playerRemoved(shared_ptr entity); // 4J added - for when a player is removed from the level's player array, not just the entity storage virtual void playSound(int iSound, double x, double y, double z, float volume, float pitch, float fClipSoundDist); - virtual void playSound(std::shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fClipSoundDist); + virtual void playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fClipSoundDist); virtual void setTilesDirty(int x0, int y0, int z0, int x1, int y1, int z1, Level *level); // 4J - added level param virtual void skyColorChanged(); virtual void tileChanged(int x, int y, int z); virtual void tileLightChanged(int x, int y, int z); virtual void playStreamingMusic(const wstring& name, int x, int y, int z); - virtual void levelEvent(std::shared_ptr source, int type, int x, int y, int z, int data); + virtual void levelEvent(shared_ptr source, int type, int x, int y, int z, int data); virtual void destroyTileProgress(int id, int x, int y, int z, int progress); }; diff --git a/Minecraft.Client/ServerPlayer.cpp b/Minecraft.Client/ServerPlayer.cpp index 0f85998c..eebab435 100644 --- a/Minecraft.Client/ServerPlayer.cpp +++ b/Minecraft.Client/ServerPlayer.cpp @@ -236,10 +236,10 @@ void ServerPlayer::tick() for (int i = 0; i < 5; i++) { - std::shared_ptr currentCarried = getCarried(i); + shared_ptr currentCarried = getCarried(i); if (currentCarried != lastCarried[i]) { - getLevel()->getTracker()->broadcast(shared_from_this(), std::shared_ptr( new SetEquippedItemPacket(this->entityId, i, currentCarried) ) ); + getLevel()->getTracker()->broadcast(shared_from_this(), shared_ptr( new SetEquippedItemPacket(this->entityId, i, currentCarried) ) ); lastCarried[i] = currentCarried; } } @@ -264,7 +264,7 @@ void ServerPlayer::flushEntitiesToRemove() it = entitiesToRemove.erase(it); } - connection->send(std::shared_ptr(new RemoveEntitiesPacket(ids))); + connection->send(shared_ptr(new RemoveEntitiesPacket(ids))); } } @@ -286,14 +286,14 @@ void ServerPlayer::doTickA() for (unsigned int i = 0; i < inventory->getContainerSize(); i++) { - std::shared_ptr ie = inventory->getItem(i); + shared_ptr ie = inventory->getItem(i); if (ie != NULL) { // 4J - removed condition. These were getting lower priority than tile update packets etc. on the slow outbound queue, and so were extremely slow to send sometimes, // particularly at the start of a game. They don't typically seem to be massive and shouldn't be send when there isn't actually any updating to do. if (Item::items[ie->id]->isComplex() ) // && connection->countDelayedPackets() <= 2) { - std::shared_ptr packet = (dynamic_cast(Item::items[ie->id])->getUpdatePacket(ie, level, dynamic_pointer_cast( shared_from_this() ) ) ); + shared_ptr packet = (dynamic_cast(Item::items[ie->id])->getUpdatePacket(ie, level, dynamic_pointer_cast( shared_from_this() ) ) ); if (packet != NULL) { connection->send(packet); @@ -402,7 +402,7 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) { // app.DebugPrintf("Creating BRUP for %d %d\n",nearest.x, nearest.z); PIXBeginNamedEvent(0,"Creation BRUP for sending\n"); - std::shared_ptr packet = std::shared_ptr( new BlockRegionUpdatePacket(nearest.x * 16, 0, nearest.z * 16, 16, Level::maxBuildHeight, 16, level) ); + shared_ptr packet = shared_ptr( new BlockRegionUpdatePacket(nearest.x * 16, 0, nearest.z * 16, 16, Level::maxBuildHeight, 16, level) ); PIXEndNamedEvent(); if( dontDelayChunks ) packet->shouldDelay = false; @@ -441,7 +441,7 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) // Don't send TileEntity data until we have sent the block data if( connection->isLocal() || chunkDataSent) { - vector > *tes = level->getTileEntitiesInRegion(nearest.x * 16, 0, nearest.z * 16, nearest.x * 16 + 16, Level::maxBuildHeight, nearest.z * 16 + 16); + vector > *tes = level->getTileEntitiesInRegion(nearest.x * 16, 0, nearest.z * 16, nearest.x * 16 + 16, Level::maxBuildHeight, nearest.z * 16 + 16); for (unsigned int i = 0; i < tes->size(); i++) { // 4J Stu - Added delay param to ensure that these arrive after the BRUPs from above @@ -541,7 +541,7 @@ void ServerPlayer::doTickB(bool ignorePortal) if (getHealth() != lastSentHealth || lastSentFood != foodData.getFoodLevel() || ((foodData.getSaturationLevel() == 0) != lastFoodSaturationZero)) { // 4J Stu - Added m_lastDamageSource for telemetry - connection->send( std::shared_ptr( new SetHealthPacket(getHealth(), foodData.getFoodLevel(), foodData.getSaturationLevel(), m_lastDamageSource) ) ); + connection->send( shared_ptr( new SetHealthPacket(getHealth(), foodData.getFoodLevel(), foodData.getSaturationLevel(), m_lastDamageSource) ) ); lastSentHealth = getHealth(); lastSentFood = foodData.getFoodLevel(); lastFoodSaturationZero = foodData.getSaturationLevel() == 0; @@ -550,12 +550,12 @@ void ServerPlayer::doTickB(bool ignorePortal) if (totalExperience != lastSentExp) { lastSentExp = totalExperience; - connection->send( std::shared_ptr( new SetExperiencePacket(experienceProgress, totalExperience, experienceLevel) ) ); + connection->send( shared_ptr( new SetExperiencePacket(experienceProgress, totalExperience, experienceLevel) ) ); } } -std::shared_ptr ServerPlayer::getCarried(int slot) +shared_ptr ServerPlayer::getCarried(int slot) { if (slot == 0) return inventory->getSelected(); return inventory->armor[slot - 1]; @@ -575,7 +575,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) { // 4J Stu - Fix for #46422 - TU5: Crash: Gameplay: Crash when being hit by a trap using a dispenser // getEntity returns the owner of projectiles, and this would never be the arrow. The owner is sometimes NULL. - std::shared_ptr source = dmgSource->getDirectEntity(); + shared_ptr source = dmgSource->getDirectEntity(); if (dynamic_pointer_cast(source) != NULL && (!server->pvp || !dynamic_pointer_cast(source)->isAllowedToAttackPlayers()) ) @@ -585,7 +585,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) if (source != NULL && source->GetType() == eTYPE_ARROW) { - std::shared_ptr arrow = dynamic_pointer_cast(source); + shared_ptr arrow = dynamic_pointer_cast(source); if (dynamic_pointer_cast(arrow->owner) != NULL && (!server->pvp || !dynamic_pointer_cast(arrow->owner)->isAllowedToAttackPlayers()) ) { return false; @@ -608,7 +608,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) else if(dmgSource == DamageSource::cactus) m_lastDamageSource = eTelemetryPlayerDeathSource_Cactus; else { - std::shared_ptr source = dmgSource->getEntity(); + shared_ptr source = dmgSource->getEntity(); if( source != NULL ) { switch(source->GetType()) @@ -647,7 +647,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) case eTYPE_ARROW: if ((dynamic_pointer_cast(source))->owner != NULL) { - std::shared_ptr attacker = (dynamic_pointer_cast(source))->owner; + shared_ptr attacker = (dynamic_pointer_cast(source))->owner; if (attacker != NULL) { switch(attacker->GetType()) @@ -696,19 +696,19 @@ void ServerPlayer::changeDimension(int i) level->removeEntity(shared_from_this()); wonGame = true; m_enteredEndExitPortal = true; // We only flag this for the player in the portal - connection->send( std::shared_ptr( new GameEventPacket(GameEventPacket::WIN_GAME, thisPlayer->GetUserIndex()) ) ); + connection->send( shared_ptr( new GameEventPacket(GameEventPacket::WIN_GAME, thisPlayer->GetUserIndex()) ) ); app.DebugPrintf("Sending packet to %d\n", thisPlayer->GetUserIndex()); } if(thisPlayer != NULL) { for(AUTO_VAR(it, MinecraftServer::getInstance()->getPlayers()->players.begin()); it != MinecraftServer::getInstance()->getPlayers()->players.end(); ++it) { - std::shared_ptr servPlayer = *it; + shared_ptr servPlayer = *it; INetworkPlayer *checkPlayer = servPlayer->connection->getNetworkPlayer(); if(thisPlayer != checkPlayer && checkPlayer != NULL && thisPlayer->IsSameSystem( checkPlayer ) && !servPlayer->wonGame ) { servPlayer->wonGame = true; - servPlayer->connection->send( std::shared_ptr( new GameEventPacket(GameEventPacket::WIN_GAME, thisPlayer->GetUserIndex() ) ) ); + servPlayer->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::WIN_GAME, thisPlayer->GetUserIndex() ) ) ); app.DebugPrintf("Sending packet to %d\n", thisPlayer->GetUserIndex()); } } @@ -733,11 +733,11 @@ void ServerPlayer::changeDimension(int i) } // 4J Added delay param -void ServerPlayer::broadcast(std::shared_ptr te, bool delay /*= false*/) +void ServerPlayer::broadcast(shared_ptr te, bool delay /*= false*/) { if (te != NULL) { - std::shared_ptr p = te->getUpdatePacket(); + shared_ptr p = te->getUpdatePacket(); if (p != NULL) { p->shouldDelay = delay; @@ -747,22 +747,22 @@ void ServerPlayer::broadcast(std::shared_ptr te, bool delay /*= fals } } -void ServerPlayer::take(std::shared_ptr e, int orgCount) +void ServerPlayer::take(shared_ptr e, int orgCount) { if (!e->removed) { EntityTracker *entityTracker = getLevel()->getTracker(); if (e->GetType() == eTYPE_ITEMENTITY) { - entityTracker->broadcast(e, std::shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); + entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); } if (e->GetType() == eTYPE_ARROW) { - entityTracker->broadcast(e, std::shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); + entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); } if (e->GetType() == eTYPE_EXPERIENCEORB) { - entityTracker->broadcast(e, std::shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); + entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); } } Player::take(e, orgCount); @@ -775,7 +775,7 @@ void ServerPlayer::swing() { swingTime = -1; swinging = true; - getLevel()->getTracker()->broadcast(shared_from_this(), std::shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::SWING) ) ); + getLevel()->getTracker()->broadcast(shared_from_this(), shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::SWING) ) ); } } @@ -784,7 +784,7 @@ Player::BedSleepingResult ServerPlayer::startSleepInBed(int x, int y, int z, boo BedSleepingResult result = Player::startSleepInBed(x, y, z, bTestUse); if (result == OK) { - std::shared_ptr p = std::shared_ptr( new EntityActionAtPositionPacket(shared_from_this(), EntityActionAtPositionPacket::START_SLEEP, x, y, z) ); + shared_ptr p = shared_ptr( new EntityActionAtPositionPacket(shared_from_this(), EntityActionAtPositionPacket::START_SLEEP, x, y, z) ); getLevel()->getTracker()->broadcast(shared_from_this(), p); connection->teleport(this->x, this->y, this->z, yRot, xRot); connection->send(p); @@ -796,16 +796,16 @@ void ServerPlayer::stopSleepInBed(bool forcefulWakeUp, bool updateLevelList, boo { if (isSleeping()) { - getLevel()->getTracker()->broadcastAndSend(shared_from_this(), std::shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::WAKE_UP) ) ); + getLevel()->getTracker()->broadcastAndSend(shared_from_this(), shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::WAKE_UP) ) ); } Player::stopSleepInBed(forcefulWakeUp, updateLevelList, saveRespawnPoint); if (connection != NULL) connection->teleport(x, y, z, yRot, xRot); } -void ServerPlayer::ride(std::shared_ptr e) +void ServerPlayer::ride(shared_ptr e) { Player::ride(e); - connection->send( std::shared_ptr( new SetRidingPacket(shared_from_this(), riding) ) ); + connection->send( shared_ptr( new SetRidingPacket(shared_from_this(), riding) ) ); // 4J Removed this - The act of riding will be handled on the client and will change the position // of the player. If we also teleport it then we can end up with a repeating movements, e.g. bouncing @@ -832,7 +832,7 @@ bool ServerPlayer::startCrafting(int x, int y, int z) if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send( std::shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::WORKBENCH, 0, 9) ) ); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::WORKBENCH, 0, 9) ) ); containerMenu = new CraftingMenu(inventory, level, x, y, z); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -850,7 +850,7 @@ bool ServerPlayer::startEnchanting(int x, int y, int z) if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send(std::shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::ENCHANTMENT, 0, 9) )); + connection->send(shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::ENCHANTMENT, 0, 9) )); containerMenu = new EnchantmentMenu(inventory, level, x, y, z); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -868,7 +868,7 @@ bool ServerPlayer::startRepairing(int x, int y, int z) if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send(std::shared_ptr ( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::REPAIR_TABLE, 0, 9)) ); + connection->send(shared_ptr ( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::REPAIR_TABLE, 0, 9)) ); containerMenu = new RepairMenu(inventory, level, x, y, z, dynamic_pointer_cast(shared_from_this())); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -881,12 +881,12 @@ bool ServerPlayer::startRepairing(int x, int y, int z) return true; } -bool ServerPlayer::openContainer(std::shared_ptr container) +bool ServerPlayer::openContainer(shared_ptr container) { if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send( std::shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::CONTAINER, container->getName(), container->getContainerSize()) ) ); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::CONTAINER, container->getName(), container->getContainerSize()) ) ); containerMenu = new ContainerMenu(inventory, container); containerMenu->containerId = containerCounter; @@ -900,12 +900,12 @@ bool ServerPlayer::openContainer(std::shared_ptr container) return true; } -bool ServerPlayer::openFurnace(std::shared_ptr furnace) +bool ServerPlayer::openFurnace(shared_ptr furnace) { if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send( std::shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::FURNACE, 0, furnace->getContainerSize()) ) ); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::FURNACE, 0, furnace->getContainerSize()) ) ); containerMenu = new FurnaceMenu(inventory, furnace); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -918,12 +918,12 @@ bool ServerPlayer::openFurnace(std::shared_ptr furnace) return true; } -bool ServerPlayer::openTrap(std::shared_ptr trap) +bool ServerPlayer::openTrap(shared_ptr trap) { if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send( std::shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::TRAP, 0, trap->getContainerSize()) ) ); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::TRAP, 0, trap->getContainerSize()) ) ); containerMenu = new TrapMenu(inventory, trap); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -936,12 +936,12 @@ bool ServerPlayer::openTrap(std::shared_ptr trap) return true; } -bool ServerPlayer::openBrewingStand(std::shared_ptr brewingStand) +bool ServerPlayer::openBrewingStand(shared_ptr brewingStand) { if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send(std::shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::BREWING_STAND, 0, brewingStand->getContainerSize()))); + connection->send(shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::BREWING_STAND, 0, brewingStand->getContainerSize()))); containerMenu = new BrewingStandMenu(inventory, brewingStand); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -954,7 +954,7 @@ bool ServerPlayer::openBrewingStand(std::shared_ptr brew return true; } -bool ServerPlayer::openTrading(std::shared_ptr traderTarget) +bool ServerPlayer::openTrading(shared_ptr traderTarget) { if(containerMenu == inventoryMenu) { @@ -962,9 +962,9 @@ bool ServerPlayer::openTrading(std::shared_ptr traderTarget) containerMenu = new MerchantMenu(inventory, traderTarget, level); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); - std::shared_ptr container = ((MerchantMenu *) containerMenu)->getTradeContainer(); + shared_ptr container = ((MerchantMenu *) containerMenu)->getTradeContainer(); - connection->send(std::shared_ptr(new ContainerOpenPacket(containerCounter, ContainerOpenPacket::TRADER_NPC, container->getName(), container->getContainerSize()))); + connection->send(shared_ptr(new ContainerOpenPacket(containerCounter, ContainerOpenPacket::TRADER_NPC, container->getName(), container->getContainerSize()))); MerchantRecipeList *offers = traderTarget->getOffers(dynamic_pointer_cast(shared_from_this())); if (offers != NULL) @@ -976,7 +976,7 @@ bool ServerPlayer::openTrading(std::shared_ptr traderTarget) output.writeInt(containerCounter); offers->writeToStream(&output); - connection->send(std::shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_LIST_PACKET, rawOutput.toByteArray()))); + connection->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_LIST_PACKET, rawOutput.toByteArray()))); } } else @@ -987,7 +987,7 @@ bool ServerPlayer::openTrading(std::shared_ptr traderTarget) return true; } -void ServerPlayer::slotChanged(AbstractContainerMenu *container, int slotIndex, std::shared_ptr item) +void ServerPlayer::slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item) { if (dynamic_cast(container->getSlot(slotIndex))) { @@ -1004,21 +1004,21 @@ void ServerPlayer::slotChanged(AbstractContainerMenu *container, int slotIndex, return; } - connection->send( std::shared_ptr( new ContainerSetSlotPacket(container->containerId, slotIndex, item) ) ); + connection->send( shared_ptr( new ContainerSetSlotPacket(container->containerId, slotIndex, item) ) ); } void ServerPlayer::refreshContainer(AbstractContainerMenu *menu) { - vector > *items = menu->getItems(); + vector > *items = menu->getItems(); refreshContainer(menu, items); delete items; } -void ServerPlayer::refreshContainer(AbstractContainerMenu *container, vector > *items) +void ServerPlayer::refreshContainer(AbstractContainerMenu *container, vector > *items) { - connection->send( std::shared_ptr( new ContainerSetContentPacket(container->containerId, items) ) ); - connection->send( std::shared_ptr( new ContainerSetSlotPacket(-1, -1, inventory->getCarried()) ) ); + connection->send( shared_ptr( new ContainerSetContentPacket(container->containerId, items) ) ); + connection->send( shared_ptr( new ContainerSetSlotPacket(-1, -1, inventory->getCarried()) ) ); } void ServerPlayer::setContainerData(AbstractContainerMenu *container, int id, int value) @@ -1033,12 +1033,12 @@ void ServerPlayer::setContainerData(AbstractContainerMenu *container, int id, in // client again. return; } - connection->send( std::shared_ptr( new ContainerSetDataPacket(container->containerId, id, value) ) ); + connection->send( shared_ptr( new ContainerSetDataPacket(container->containerId, id, value) ) ); } void ServerPlayer::closeContainer() { - connection->send( std::shared_ptr( new ContainerClosePacket(containerMenu->containerId) ) ); + connection->send( shared_ptr( new ContainerClosePacket(containerMenu->containerId) ) ); doCloseContainer(); } @@ -1052,7 +1052,7 @@ void ServerPlayer::broadcastCarriedItem() // client again. return; } - connection->send( std::shared_ptr( new ContainerSetSlotPacket(-1, -1, inventory->getCarried()) ) ); + connection->send( shared_ptr( new ContainerSetSlotPacket(-1, -1, inventory->getCarried()) ) ); } void ServerPlayer::doCloseContainer() @@ -1087,12 +1087,12 @@ void ServerPlayer::awardStat(Stat *stat, byteArray param) while (count > 100) { - connection->send( std::shared_ptr( new AwardStatPacket(stat->id, 100) ) ); + connection->send( shared_ptr( new AwardStatPacket(stat->id, 100) ) ); count -= 100; } - connection->send( std::shared_ptr( new AwardStatPacket(stat->id, count) ) ); + connection->send( shared_ptr( new AwardStatPacket(stat->id, count) ) ); #else - connection->send( std::shared_ptr( new AwardStatPacket(stat->id, param) ) ); + connection->send( shared_ptr( new AwardStatPacket(stat->id, param) ) ); // byteArray deleted in AwardStatPacket destructor. #endif } @@ -1122,33 +1122,33 @@ void ServerPlayer::displayClientMessage(int messageId) { case IDS_TILE_BED_OCCUPIED: messageType = ChatPacket::e_ChatBedOccupied; - connection->send( std::shared_ptr( new ChatPacket(L"", messageType) ) ); + connection->send( shared_ptr( new ChatPacket(L"", messageType) ) ); break; case IDS_TILE_BED_NO_SLEEP: messageType = ChatPacket::e_ChatBedNoSleep; - connection->send( std::shared_ptr( new ChatPacket(L"", messageType) ) ); + connection->send( shared_ptr( new ChatPacket(L"", messageType) ) ); break; case IDS_TILE_BED_NOT_VALID: messageType = ChatPacket::e_ChatBedNotValid; - connection->send( std::shared_ptr( new ChatPacket(L"", messageType) ) ); + connection->send( shared_ptr( new ChatPacket(L"", messageType) ) ); break; case IDS_TILE_BED_NOTSAFE: messageType = ChatPacket::e_ChatBedNotSafe; - connection->send( std::shared_ptr( new ChatPacket(L"", messageType) ) ); + connection->send( shared_ptr( new ChatPacket(L"", messageType) ) ); break; case IDS_TILE_BED_PLAYERSLEEP: messageType = ChatPacket::e_ChatBedPlayerSleep; // broadcast to all the other players in the game for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()!=player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatBedPlayerSleep))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatBedPlayerSleep))); } else { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatBedMeSleep))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatBedMeSleep))); } } return; @@ -1156,85 +1156,85 @@ void ServerPlayer::displayClientMessage(int messageId) case IDS_PLAYER_ENTERED_END: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()!=player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerEnteredEnd))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerEnteredEnd))); } } break; case IDS_PLAYER_LEFT_END: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()!=player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerLeftEnd))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerLeftEnd))); } } break; case IDS_TILE_BED_MESLEEP: messageType = ChatPacket::e_ChatBedMeSleep; - connection->send( std::shared_ptr( new ChatPacket(L"", messageType) ) ); + connection->send( shared_ptr( new ChatPacket(L"", messageType) ) ); break; case IDS_MAX_PIGS_SHEEP_COWS_CATS_SPAWNED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxPigsSheepCows))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxPigsSheepCows))); } } break; case IDS_MAX_CHICKENS_SPAWNED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxChickens))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxChickens))); } } break; case IDS_MAX_SQUID_SPAWNED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxSquid))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxSquid))); } } break; case IDS_MAX_WOLVES_SPAWNED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxWolves))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxWolves))); } } break; case IDS_MAX_MOOSHROOMS_SPAWNED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxMooshrooms))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxMooshrooms))); } } break; case IDS_MAX_ENEMIES_SPAWNED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxEnemies))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxEnemies))); } } break; @@ -1242,40 +1242,40 @@ void ServerPlayer::displayClientMessage(int messageId) case IDS_MAX_VILLAGERS_SPAWNED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxVillagers))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxVillagers))); } } break; case IDS_MAX_PIGS_SHEEP_COWS_CATS_BRED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredPigsSheepCows))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredPigsSheepCows))); } } break; case IDS_MAX_CHICKENS_BRED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredChickens))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredChickens))); } } break; case IDS_MAX_MUSHROOMCOWS_BRED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredMooshrooms))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredMooshrooms))); } } break; @@ -1283,10 +1283,10 @@ void ServerPlayer::displayClientMessage(int messageId) case IDS_MAX_WOLVES_BRED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredWolves))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBredWolves))); } } break; @@ -1294,10 +1294,10 @@ void ServerPlayer::displayClientMessage(int messageId) case IDS_CANT_SHEAR_MOOSHROOM: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerCantShearMooshroom))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerCantShearMooshroom))); } } break; @@ -1306,20 +1306,20 @@ void ServerPlayer::displayClientMessage(int messageId) case IDS_MAX_HANGINGENTITIES: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxHangingEntities))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxHangingEntities))); } } break; case IDS_CANT_SPAWN_IN_PEACEFUL: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerCantSpawnInPeaceful))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerCantSpawnInPeaceful))); } } break; @@ -1327,10 +1327,10 @@ void ServerPlayer::displayClientMessage(int messageId) case IDS_MAX_BOATS: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { - std::shared_ptr player = server->getPlayers()->players[i]; + shared_ptr player = server->getPlayers()->players[i]; if(shared_from_this()==player) { - player->connection->send(std::shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBoats))); + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBoats))); } } break; @@ -1343,26 +1343,26 @@ void ServerPlayer::displayClientMessage(int messageId) //Language *language = Language::getInstance(); //wstring languageString = app.GetString(messageId);//language->getElement(messageId); - //connection->send( std::shared_ptr( new ChatPacket(L"", messageType) ) ); + //connection->send( shared_ptr( new ChatPacket(L"", messageType) ) ); } void ServerPlayer::completeUsingItem() { - connection->send(std::shared_ptr( new EntityEventPacket(entityId, EntityEvent::USE_ITEM_COMPLETE) ) ); + connection->send(shared_ptr( new EntityEventPacket(entityId, EntityEvent::USE_ITEM_COMPLETE) ) ); Player::completeUsingItem(); } -void ServerPlayer::startUsingItem(std::shared_ptr instance, int duration) +void ServerPlayer::startUsingItem(shared_ptr instance, int duration) { Player::startUsingItem(instance, duration); if (instance != NULL && instance->getItem() != NULL && instance->getItem()->getUseAnimation(instance) == UseAnim_eat) { - getLevel()->getTracker()->broadcastAndSend(shared_from_this(), std::shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::EAT) ) ); + getLevel()->getTracker()->broadcastAndSend(shared_from_this(), shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::EAT) ) ); } } -void ServerPlayer::restoreFrom(std::shared_ptr oldPlayer, bool restoreAll) +void ServerPlayer::restoreFrom(shared_ptr oldPlayer, bool restoreAll) { Player::restoreFrom(oldPlayer, restoreAll); lastSentExp = -1; @@ -1374,21 +1374,21 @@ void ServerPlayer::restoreFrom(std::shared_ptr oldPlayer, bool restoreAl void ServerPlayer::onEffectAdded(MobEffectInstance *effect) { Player::onEffectAdded(effect); - connection->send(std::shared_ptr( new UpdateMobEffectPacket(entityId, effect) ) ); + connection->send(shared_ptr( new UpdateMobEffectPacket(entityId, effect) ) ); } void ServerPlayer::onEffectUpdated(MobEffectInstance *effect) { Player::onEffectUpdated(effect); - connection->send(std::shared_ptr( new UpdateMobEffectPacket(entityId, effect) ) ); + connection->send(shared_ptr( new UpdateMobEffectPacket(entityId, effect) ) ); } void ServerPlayer::onEffectRemoved(MobEffectInstance *effect) { Player::onEffectRemoved(effect); - connection->send(std::shared_ptr( new RemoveMobEffectPacket(entityId, effect) ) ); + connection->send(shared_ptr( new RemoveMobEffectPacket(entityId, effect) ) ); } void ServerPlayer::teleportTo(double x, double y, double z) @@ -1396,20 +1396,20 @@ void ServerPlayer::teleportTo(double x, double y, double z) connection->teleport(x, y, z, yRot, xRot); } -void ServerPlayer::crit(std::shared_ptr entity) +void ServerPlayer::crit(shared_ptr entity) { - getLevel()->getTracker()->broadcastAndSend(shared_from_this(), std::shared_ptr( new AnimatePacket(entity, AnimatePacket::CRITICAL_HIT) )); + getLevel()->getTracker()->broadcastAndSend(shared_from_this(), shared_ptr( new AnimatePacket(entity, AnimatePacket::CRITICAL_HIT) )); } -void ServerPlayer::magicCrit(std::shared_ptr entity) +void ServerPlayer::magicCrit(shared_ptr entity) { - getLevel()->getTracker()->broadcastAndSend(shared_from_this(), std::shared_ptr( new AnimatePacket(entity, AnimatePacket::MAGIC_CRITICAL_HIT) )); + getLevel()->getTracker()->broadcastAndSend(shared_from_this(), shared_ptr( new AnimatePacket(entity, AnimatePacket::MAGIC_CRITICAL_HIT) )); } void ServerPlayer::onUpdateAbilities() { if (connection == NULL) return; - connection->send(std::shared_ptr(new PlayerAbilitiesPacket(&abilities))); + connection->send(shared_ptr(new PlayerAbilitiesPacket(&abilities))); } ServerLevel *ServerPlayer::getLevel() @@ -1420,12 +1420,12 @@ ServerLevel *ServerPlayer::getLevel() void ServerPlayer::setGameMode(GameType *mode) { gameMode->setGameModeForPlayer(mode); - connection->send(std::shared_ptr(new GameEventPacket(GameEventPacket::CHANGE_GAME_MODE, mode->getId()))); + connection->send(shared_ptr(new GameEventPacket(GameEventPacket::CHANGE_GAME_MODE, mode->getId()))); } void ServerPlayer::sendMessage(const wstring& message, ChatPacket::EChatPacketMessage type /*= e_ChatCustom*/, int customData /*= -1*/, const wstring& additionalMessage /*= L""*/) { - connection->send(std::shared_ptr(new ChatPacket(message,type,customData,additionalMessage))); + connection->send(shared_ptr(new ChatPacket(message,type,customData,additionalMessage))); } bool ServerPlayer::hasPermission(EGameCommand command) @@ -1434,7 +1434,7 @@ bool ServerPlayer::hasPermission(EGameCommand command) } // 4J - Don't use -//void ServerPlayer::updateOptions(std::shared_ptr packet) +//void ServerPlayer::updateOptions(shared_ptr packet) //{ // // 4J - Don't need // //if (language.getLanguageList().containsKey(packet.getLanguage())) @@ -1502,7 +1502,7 @@ int ServerPlayer::getPlayerViewDistanceModifier() return value; } -void ServerPlayer::handleCollectItem(std::shared_ptr item) +void ServerPlayer::handleCollectItem(shared_ptr item) { if(gameMode->getGameRules() != NULL) gameMode->getGameRules()->onCollectItem(item); } diff --git a/Minecraft.Client/ServerPlayer.h b/Minecraft.Client/ServerPlayer.h index 1e896ec0..a9b37594 100644 --- a/Minecraft.Client/ServerPlayer.h +++ b/Minecraft.Client/ServerPlayer.h @@ -17,7 +17,7 @@ class ServerPlayer : public Player, public net_minecraft_world_inventory::Contai { public: eINSTANCEOF GetType() { return eTYPE_SERVERPLAYER; } - std::shared_ptr connection; + shared_ptr connection; MinecraftServer *server; ServerPlayerGameMode *gameMode; double lastMoveX, lastMoveZ; @@ -59,7 +59,7 @@ public: virtual float getHeadHeight(); virtual void tick(); void flushEntitiesToRemove(); - virtual std::shared_ptr getCarried(int slot); + virtual shared_ptr getCarried(int slot); virtual void die(DamageSource *source); virtual bool hurt(DamageSource *dmgSource, int dmg); virtual bool isPlayerVersusPlayer(); @@ -69,15 +69,15 @@ public: void doTickB(bool ignorePortal); virtual void changeDimension(int i); private: - void broadcast(std::shared_ptr te, bool delay = false); + void broadcast(shared_ptr te, bool delay = false); public: - virtual void take(std::shared_ptr e, int orgCount); + virtual void take(shared_ptr e, int orgCount); virtual void swing(); virtual BedSleepingResult startSleepInBed(int x, int y, int z, bool bTestUse = false); public: virtual void stopSleepInBed(bool forcefulWakeUp, bool updateLevelList, bool saveRespawnPoint); - virtual void ride(std::shared_ptr e); + virtual void ride(shared_ptr e); protected: virtual void checkFallDamage(double ya, bool onGround); public: @@ -97,14 +97,14 @@ public: virtual bool startCrafting(int x, int y, int z); // 4J added bool return virtual bool startEnchanting(int x, int y, int z); // 4J added bool return virtual bool startRepairing(int x, int y, int z); // 4J added bool return - virtual bool openContainer(std::shared_ptr container); // 4J added bool return - virtual bool openFurnace(std::shared_ptr furnace); // 4J added bool return - virtual bool openTrap(std::shared_ptr trap); // 4J added bool return - virtual bool openBrewingStand(std::shared_ptr brewingStand); // 4J added bool return - virtual bool openTrading(std::shared_ptr traderTarget); // 4J added bool return - virtual void slotChanged(AbstractContainerMenu *container, int slotIndex, std::shared_ptr item); + virtual bool openContainer(shared_ptr container); // 4J added bool return + virtual bool openFurnace(shared_ptr furnace); // 4J added bool return + virtual bool openTrap(shared_ptr trap); // 4J added bool return + virtual bool openBrewingStand(shared_ptr brewingStand); // 4J added bool return + virtual bool openTrading(shared_ptr traderTarget); // 4J added bool return + virtual void slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item); void refreshContainer(AbstractContainerMenu *menu); - virtual void refreshContainer(AbstractContainerMenu *container, vector > *items); + virtual void refreshContainer(AbstractContainerMenu *container, vector > *items); virtual void setContainerData(AbstractContainerMenu *container, int id, int value); virtual void closeContainer(); void broadcastCarriedItem(); @@ -121,8 +121,8 @@ protected: virtual void completeUsingItem(); public: - virtual void startUsingItem(std::shared_ptr instance, int duration); - virtual void restoreFrom(std::shared_ptr oldPlayer, bool restoreAll); + virtual void startUsingItem(shared_ptr instance, int duration); + virtual void restoreFrom(shared_ptr oldPlayer, bool restoreAll); protected: virtual void onEffectAdded(MobEffectInstance *effect); @@ -131,8 +131,8 @@ protected: public: virtual void teleportTo(double x, double y, double z); - virtual void crit(std::shared_ptr entity); - virtual void magicCrit(std::shared_ptr entity); + virtual void crit(shared_ptr entity); + virtual void magicCrit(shared_ptr entity); void onUpdateAbilities(); ServerLevel *getLevel(); @@ -140,7 +140,7 @@ public: void sendMessage(const wstring& message, ChatPacket::EChatPacketMessage type = ChatPacket::e_ChatCustom, int customData = -1, const wstring& additionalMessage = L""); bool hasPermission(EGameCommand command); // 4J - Don't use - //void updateOptions(std::shared_ptr packet); + //void updateOptions(shared_ptr packet); int getViewDistance(); //bool canChatInColor(); //int getChatVisibility(); @@ -152,7 +152,7 @@ public: public: // 4J Stu - Added hooks for the game rules - virtual void handleCollectItem(std::shared_ptr item); + virtual void handleCollectItem(shared_ptr item); #ifndef _CONTENT_PACKAGE void debug_setPosition(double,double,double,double,double); @@ -160,5 +160,5 @@ public: protected: // 4J Added to record telemetry of player deaths, this should store the last source of damage - ETelemetryChallenges m_lastDamageSource; + ETelemetryChallenges m_lastDamageSource; }; diff --git a/Minecraft.Client/ServerPlayerGameMode.cpp b/Minecraft.Client/ServerPlayerGameMode.cpp index 3bd69310..9b31df0d 100644 --- a/Minecraft.Client/ServerPlayerGameMode.cpp +++ b/Minecraft.Client/ServerPlayerGameMode.cpp @@ -235,9 +235,9 @@ bool ServerPlayerGameMode::destroyBlock(int x, int y, int z) int t = level->getTile(x, y, z); int data = level->getData(x, y, z); - + level->levelEvent(player, LevelEvent::PARTICLES_DESTROY_BLOCK, x, y, z, t + (level->getData(x, y, z) << Tile::TILE_NUM_SHIFT)); - + // 4J - In creative mode, the point where we need to tell the renderer that we are about to destroy a tile via destroyingTileAt is quite complicated. // If the player being told is remote, then we always want the client to do it as it does the final update. If the player being told is local, // then we need to update the renderer Here if we are sharing data between host & client as this is the final point where the original data is still intact. @@ -272,7 +272,7 @@ bool ServerPlayerGameMode::destroyBlock(int x, int y, int z) if (isCreative()) { - std::shared_ptr tup = std::shared_ptr( new TileUpdatePacket(x, y, z, level) ); + shared_ptr tup = shared_ptr( new TileUpdatePacket(x, y, z, level) ); // 4J - a bit of a hack here, but if we want to tell the client that it needs to inform the renderer of a block being destroyed, then send a block 255 instead of a 0. This is handled in ClientConnection::handleTileUpdate if( tup->block == 0 ) { @@ -280,9 +280,9 @@ bool ServerPlayerGameMode::destroyBlock(int x, int y, int z) } player->connection->send( tup ); } - else + else { - std::shared_ptr item = player->getSelectedItem(); + shared_ptr item = player->getSelectedItem(); bool canDestroy = player->canDestroy(Tile::tiles[t]); if (item != NULL) { @@ -301,13 +301,13 @@ bool ServerPlayerGameMode::destroyBlock(int x, int y, int z) } -bool ServerPlayerGameMode::useItem(std::shared_ptr player, Level *level, std::shared_ptr item, bool bTestUseOnly) +bool ServerPlayerGameMode::useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly) { if(!player->isAllowedToUse(item)) return false; int oldCount = item->count; int oldAux = item->getAuxValue(); - std::shared_ptr itemInstance = item->use(level, player); + shared_ptr itemInstance = item->use(level, player); if ((itemInstance != NULL && itemInstance != item) || (itemInstance != NULL && itemInstance->count != oldCount) || (itemInstance != NULL && itemInstance->getUseDuration() > 0)) { player->inventory->items[player->inventory->selected] = itemInstance; @@ -326,7 +326,7 @@ bool ServerPlayerGameMode::useItem(std::shared_ptr player, Level *level, } -bool ServerPlayerGameMode::useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly, bool *pbUsedItem) +bool ServerPlayerGameMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly, bool *pbUsedItem) { // 4J-PB - Adding a test only version to allow tooltips to be displayed int t = level->getTile(x, y, z); @@ -336,7 +336,7 @@ bool ServerPlayerGameMode::useItemOn(std::shared_ptr player, Level *leve { if (Tile::tiles[t]->TestUse()) return true; } - else + else { if (Tile::tiles[t]->use(level, x, y, z, player, face, clickX, clickY, clickZ)) { @@ -345,7 +345,7 @@ bool ServerPlayerGameMode::useItemOn(std::shared_ptr player, Level *leve } } } - + if (item == NULL || !player->isAllowedToUse(item)) return false; if (isCreative()) { diff --git a/Minecraft.Client/ServerPlayerGameMode.h b/Minecraft.Client/ServerPlayerGameMode.h index c590f11e..89b9e9b4 100644 --- a/Minecraft.Client/ServerPlayerGameMode.h +++ b/Minecraft.Client/ServerPlayerGameMode.h @@ -10,7 +10,7 @@ class ServerPlayerGameMode { public: Level *level; - std::shared_ptr player; + shared_ptr player; private: GameType *gameModeForPlayer; @@ -53,8 +53,8 @@ private: public: bool destroyBlock(int x, int y, int z); - bool useItem(std::shared_ptr player, Level *level, std::shared_ptr item, bool bTestUseOnly=false); - bool useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false, bool *pbUsedItem=NULL); + bool useItem(shared_ptr player, Level *level, shared_ptr item, bool bTestUseOnly=false); + bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false, bool *pbUsedItem=NULL); void setLevel(ServerLevel *newLevel); }; \ No newline at end of file diff --git a/Minecraft.Client/SheepFurModel.cpp b/Minecraft.Client/SheepFurModel.cpp index 2e8b494d..bb84e80d 100644 --- a/Minecraft.Client/SheepFurModel.cpp +++ b/Minecraft.Client/SheepFurModel.cpp @@ -41,11 +41,11 @@ SheepFurModel::SheepFurModel() : QuadrupedModel(12, 0) leg3->compile(1.0f/16.0f); } -void SheepFurModel::prepareMobModel(std::shared_ptr mob, float time, float r, float a) +void SheepFurModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { QuadrupedModel::prepareMobModel(mob, time, r, a); - std::shared_ptr sheep = dynamic_pointer_cast(mob); + shared_ptr sheep = dynamic_pointer_cast(mob); head->y = 6 + sheep->getHeadEatPositionScale(a) * 9.0f; headXRot = sheep->getHeadEatAngleScale(a); } diff --git a/Minecraft.Client/SheepFurModel.h b/Minecraft.Client/SheepFurModel.h index 65bb913e..c614765e 100644 --- a/Minecraft.Client/SheepFurModel.h +++ b/Minecraft.Client/SheepFurModel.h @@ -8,6 +8,6 @@ private: public: SheepFurModel(); - virtual void prepareMobModel(std::shared_ptr mob, float time, float r, float a); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SheepModel.cpp b/Minecraft.Client/SheepModel.cpp index 9c161c33..7d093353 100644 --- a/Minecraft.Client/SheepModel.cpp +++ b/Minecraft.Client/SheepModel.cpp @@ -10,7 +10,7 @@ SheepModel::SheepModel() : QuadrupedModel(12, 0) head = new ModelPart(this, 0, 0); head->addBox(-3, -4, -6, 6, 6, 8, 0); // Head head->setPos(0, 12-6, -8); - + body = new ModelPart(this, 28, 8); body->addBox(-4, -10, -7, 8, 16, 6, 0); // Body body->setPos(0, 11+6-12, 2); @@ -20,11 +20,11 @@ SheepModel::SheepModel() : QuadrupedModel(12, 0) body->compile(1.0f/16.0f); } -void SheepModel::prepareMobModel(std::shared_ptr mob, float time, float r, float a) +void SheepModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { QuadrupedModel::prepareMobModel(mob, time, r, a); - std::shared_ptr sheep = dynamic_pointer_cast(mob); + shared_ptr sheep = dynamic_pointer_cast(mob); head->y = 6 + sheep->getHeadEatPositionScale(a) * 9.0f; headXRot = sheep->getHeadEatAngleScale(a); } diff --git a/Minecraft.Client/SheepModel.h b/Minecraft.Client/SheepModel.h index 78c3b7c8..d4136c25 100644 --- a/Minecraft.Client/SheepModel.h +++ b/Minecraft.Client/SheepModel.h @@ -8,6 +8,6 @@ private: public: SheepModel(); - virtual void prepareMobModel(std::shared_ptr mob, float time, float r, float a); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SheepRenderer.cpp b/Minecraft.Client/SheepRenderer.cpp index 0aab6c7c..4af155d3 100644 --- a/Minecraft.Client/SheepRenderer.cpp +++ b/Minecraft.Client/SheepRenderer.cpp @@ -8,10 +8,10 @@ SheepRenderer::SheepRenderer(Model *model, Model *armor, float shadow) : MobRend setArmor(armor); } -int SheepRenderer::prepareArmor(std::shared_ptr _sheep, int layer, float a) +int SheepRenderer::prepareArmor(shared_ptr _sheep, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr sheep = dynamic_pointer_cast(_sheep); + shared_ptr sheep = dynamic_pointer_cast(_sheep); if (layer == 0 && !sheep->isSheared() && !sheep->isInvisibleTo(Minecraft::GetInstance()->player)) // 4J-JEV: Todo, merge with java fix (for invisible sheep armour) in '1.7.5'. @@ -28,7 +28,7 @@ int SheepRenderer::prepareArmor(std::shared_ptr _sheep, int layer, float a) return -1; } -void SheepRenderer::render(std::shared_ptr mob, double x, double y, double z, float rot, float a) +void SheepRenderer::render(shared_ptr mob, double x, double y, double z, float rot, float a) { MobRenderer::render(mob, x, y, z, rot, a); -} +} diff --git a/Minecraft.Client/SheepRenderer.h b/Minecraft.Client/SheepRenderer.h index 637c53d0..c0dea04f 100644 --- a/Minecraft.Client/SheepRenderer.h +++ b/Minecraft.Client/SheepRenderer.h @@ -7,8 +7,8 @@ public: SheepRenderer(Model *model, Model *armor, float shadow); protected: - virtual int prepareArmor(std::shared_ptr _sheep, int layer, float a); + virtual int prepareArmor(shared_ptr _sheep, int layer, float a); public: - virtual void render(std::shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/SignRenderer.cpp b/Minecraft.Client/SignRenderer.cpp index b4457f9b..97eff4bd 100644 --- a/Minecraft.Client/SignRenderer.cpp +++ b/Minecraft.Client/SignRenderer.cpp @@ -13,10 +13,10 @@ SignRenderer::SignRenderer() signModel = new SignModel(); } -void SignRenderer::render(std::shared_ptr _sign, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +void SignRenderer::render(shared_ptr _sign, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr sign = dynamic_pointer_cast(_sign); + shared_ptr sign = dynamic_pointer_cast(_sign); Tile *tile = sign->getTile(); @@ -73,10 +73,10 @@ void SignRenderer::render(std::shared_ptr _sign, double x, double y, { switch(dwLanguage) { - case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_KOREAN: case XC_LANGUAGE_JAPANESE: case XC_LANGUAGE_TCHINESE: - msg = L"Censored";// In-game font, so English only + msg = L"Censored";// In-game font, so English only break; default: msg = app.GetString(IDS_STRINGVERIFY_CENSORED); @@ -92,16 +92,16 @@ void SignRenderer::render(std::shared_ptr _sign, double x, double y, { switch(dwLanguage) { - case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_KOREAN: case XC_LANGUAGE_JAPANESE: case XC_LANGUAGE_TCHINESE: - msg = L"Awaiting Approval";// In-game font, so English only + msg = L"Awaiting Approval";// In-game font, so English only break; default: msg = app.GetString(IDS_STRINGVERIFY_AWAITING_APPROVAL); break; } - } + } if (i == sign->GetSelectedLine()) { diff --git a/Minecraft.Client/SignRenderer.h b/Minecraft.Client/SignRenderer.h index d7411af4..48d4d954 100644 --- a/Minecraft.Client/SignRenderer.h +++ b/Minecraft.Client/SignRenderer.h @@ -8,5 +8,5 @@ private: SignModel *signModel; public: SignRenderer(); // 4J - added - virtual void render(std::shared_ptr sign, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param + virtual void render(shared_ptr sign, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param }; diff --git a/Minecraft.Client/SilverfishModel.cpp b/Minecraft.Client/SilverfishModel.cpp index a7a14629..128a7e79 100644 --- a/Minecraft.Client/SilverfishModel.cpp +++ b/Minecraft.Client/SilverfishModel.cpp @@ -82,7 +82,7 @@ int SilverfishModel::modelVersion() return 38; } -void SilverfishModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void SilverfishModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); diff --git a/Minecraft.Client/SilverfishModel.h b/Minecraft.Client/SilverfishModel.h index 4ce0e16e..d6be3059 100644 --- a/Minecraft.Client/SilverfishModel.h +++ b/Minecraft.Client/SilverfishModel.h @@ -21,6 +21,6 @@ public: SilverfishModel(); int modelVersion(); - void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SilverfishRenderer.cpp b/Minecraft.Client/SilverfishRenderer.cpp index 714cab8b..9ed194ca 100644 --- a/Minecraft.Client/SilverfishRenderer.cpp +++ b/Minecraft.Client/SilverfishRenderer.cpp @@ -7,17 +7,17 @@ SilverfishRenderer::SilverfishRenderer() : MobRenderer(new SilverfishModel(), 0. { } -float SilverfishRenderer::getFlipDegrees(std::shared_ptr spider) +float SilverfishRenderer::getFlipDegrees(shared_ptr spider) { return 180; } -void SilverfishRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void SilverfishRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { MobRenderer::render(_mob, x, y, z, rot, a); } -int SilverfishRenderer::prepareArmor(std::shared_ptr _silverfish, int layer, float a) +int SilverfishRenderer::prepareArmor(shared_ptr _silverfish, int layer, float a) { return -1; } \ No newline at end of file diff --git a/Minecraft.Client/SilverfishRenderer.h b/Minecraft.Client/SilverfishRenderer.h index 91ff2e45..c1df4505 100644 --- a/Minecraft.Client/SilverfishRenderer.h +++ b/Minecraft.Client/SilverfishRenderer.h @@ -13,11 +13,11 @@ public: SilverfishRenderer(); protected: - float getFlipDegrees(std::shared_ptr spider); + float getFlipDegrees(shared_ptr spider); public: - void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - int prepareArmor(std::shared_ptr _silverfish, int layer, float a); + int prepareArmor(shared_ptr _silverfish, int layer, float a); }; diff --git a/Minecraft.Client/SkeletonHeadModel.cpp b/Minecraft.Client/SkeletonHeadModel.cpp index 4fb15b31..340047fe 100644 --- a/Minecraft.Client/SkeletonHeadModel.cpp +++ b/Minecraft.Client/SkeletonHeadModel.cpp @@ -27,7 +27,7 @@ SkeletonHeadModel::SkeletonHeadModel(int u, int v, int tw, int th) _init(u,v,tw,th); } -void SkeletonHeadModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void SkeletonHeadModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); diff --git a/Minecraft.Client/SkeletonHeadModel.h b/Minecraft.Client/SkeletonHeadModel.h index aa045571..6f136c46 100644 --- a/Minecraft.Client/SkeletonHeadModel.h +++ b/Minecraft.Client/SkeletonHeadModel.h @@ -14,6 +14,6 @@ public: SkeletonHeadModel(); SkeletonHeadModel(int u, int v, int tw, int th); - void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SkullTileRenderer.cpp b/Minecraft.Client/SkullTileRenderer.cpp index 129e21a5..641a7a02 100644 --- a/Minecraft.Client/SkullTileRenderer.cpp +++ b/Minecraft.Client/SkullTileRenderer.cpp @@ -19,9 +19,9 @@ SkullTileRenderer::~SkullTileRenderer() delete zombieModel; } -void SkullTileRenderer::render(std::shared_ptr _skull, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +void SkullTileRenderer::render(shared_ptr _skull, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { - std::shared_ptr skull = dynamic_pointer_cast(_skull); + shared_ptr skull = dynamic_pointer_cast(_skull); renderSkull((float) x, (float) y, (float) z, skull->getData() & SkullTile::PLACEMENT_MASK, skull->getRotation() * 360 / 16.0f, skull->getSkullType(), skull->getExtraType()); } diff --git a/Minecraft.Client/SkullTileRenderer.h b/Minecraft.Client/SkullTileRenderer.h index e9d2bf0f..09c83f9d 100644 --- a/Minecraft.Client/SkullTileRenderer.h +++ b/Minecraft.Client/SkullTileRenderer.h @@ -18,7 +18,7 @@ public: SkullTileRenderer(); ~SkullTileRenderer(); - void render(std::shared_ptr skull, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled = true); + void render(shared_ptr skull, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled = true); void init(TileEntityRenderDispatcher *tileEntityRenderDispatcher); void renderSkull(float x, float y, float z, int face, float rot, int type, const wstring &extra); }; diff --git a/Minecraft.Client/SlimeModel.cpp b/Minecraft.Client/SlimeModel.cpp index df0ae37d..1dafc2fb 100644 --- a/Minecraft.Client/SlimeModel.cpp +++ b/Minecraft.Client/SlimeModel.cpp @@ -34,7 +34,7 @@ SlimeModel::SlimeModel(int vOffs) cube->compile(1.0f/16.0f); } -void SlimeModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void SlimeModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); diff --git a/Minecraft.Client/SlimeModel.h b/Minecraft.Client/SlimeModel.h index fe2a4fc2..9eee5eb1 100644 --- a/Minecraft.Client/SlimeModel.h +++ b/Minecraft.Client/SlimeModel.h @@ -9,5 +9,5 @@ public: SlimeModel(int vOffs); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/SlimeRenderer.cpp b/Minecraft.Client/SlimeRenderer.cpp index dbad3d26..23c9c16e 100644 --- a/Minecraft.Client/SlimeRenderer.cpp +++ b/Minecraft.Client/SlimeRenderer.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "SlimeRenderer.h" +#include "SlimeRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" SlimeRenderer::SlimeRenderer(Model *model, Model *armor, float shadow) : MobRenderer(model, shadow) @@ -7,10 +7,10 @@ SlimeRenderer::SlimeRenderer(Model *model, Model *armor, float shadow) : MobRend this->armor = armor; } -int SlimeRenderer::prepareArmor(std::shared_ptr _slime, int layer, float a) +int SlimeRenderer::prepareArmor(shared_ptr _slime, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr slime = dynamic_pointer_cast(_slime); + shared_ptr slime = dynamic_pointer_cast(_slime); if (slime->isInvisible()) return 0; @@ -32,10 +32,10 @@ int SlimeRenderer::prepareArmor(std::shared_ptr _slime, int layer, float a) return -1; } -void SlimeRenderer::scale(std::shared_ptr _slime, float a) +void SlimeRenderer::scale(shared_ptr _slime, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr slime = dynamic_pointer_cast(_slime); + shared_ptr slime = dynamic_pointer_cast(_slime); float size = (float) slime->getSize(); float ss = (slime->oSquish + (slime->squish - slime->oSquish) * a) / (size * 0.5f + 1); diff --git a/Minecraft.Client/SlimeRenderer.h b/Minecraft.Client/SlimeRenderer.h index 86de3a76..58f510aa 100644 --- a/Minecraft.Client/SlimeRenderer.h +++ b/Minecraft.Client/SlimeRenderer.h @@ -8,6 +8,6 @@ private: public: SlimeRenderer(Model *model, Model *armor, float shadow); protected: - virtual int prepareArmor(std::shared_ptr _slime, int layer, float a); - virtual void scale(std::shared_ptr _slime, float a); + virtual int prepareArmor(shared_ptr _slime, int layer, float a); + virtual void scale(shared_ptr _slime, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/SnowManModel.cpp b/Minecraft.Client/SnowManModel.cpp index 9380cce0..4344a17a 100644 --- a/Minecraft.Client/SnowManModel.cpp +++ b/Minecraft.Client/SnowManModel.cpp @@ -26,7 +26,7 @@ SnowManModel::SnowManModel() : Model() piece2 = (new ModelPart(this, 0, 36))->setTexSize(64, 64); piece2->addBox(-6, -12, -6, 12, 12, 12, g - 0.5f); // lower body - piece2->setPos(0, 0 + yOffset + 20, 0); + piece2->setPos(0, 0 + yOffset + 20, 0); // 4J added - compile now to avoid random performance hit first time cubes are rendered head->compile(1.0f/16.0f); @@ -53,12 +53,12 @@ void SnowManModel::setupAnim(float time, float r, float bob, float yRot, float x arm1->x = (c) * 5; arm1->z = (-s) * 5; - + arm2->x = (-c) * 5; arm2->z = (s) * 5; } -void SnowManModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void SnowManModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); diff --git a/Minecraft.Client/SnowManModel.h b/Minecraft.Client/SnowManModel.h index 5f2d64c5..eb31e503 100644 --- a/Minecraft.Client/SnowManModel.h +++ b/Minecraft.Client/SnowManModel.h @@ -1,7 +1,7 @@ #pragma once #include "Model.h" -class SnowManModel : public Model +class SnowManModel : public Model { public: ModelPart *piece1, *piece2, *head; @@ -9,5 +9,5 @@ public: SnowManModel() ; virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); - void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; diff --git a/Minecraft.Client/SnowManRenderer.cpp b/Minecraft.Client/SnowManRenderer.cpp index cd08e5ce..83edb3f5 100644 --- a/Minecraft.Client/SnowManRenderer.cpp +++ b/Minecraft.Client/SnowManRenderer.cpp @@ -13,14 +13,14 @@ SnowManRenderer::SnowManRenderer() : MobRenderer(new SnowManModel(), 0.5f) this->setArmor(model); } -void SnowManRenderer::additionalRendering(std::shared_ptr _mob, float a) +void SnowManRenderer::additionalRendering(shared_ptr _mob, float a) { - // 4J - original version used generics and thus had an input parameter of type SnowMan rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type SnowMan rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); MobRenderer::additionalRendering(mob, a); - std::shared_ptr headGear = std::shared_ptr( new ItemInstance(Tile::pumpkin, 1) ); + shared_ptr headGear = shared_ptr( new ItemInstance(Tile::pumpkin, 1) ); if (headGear != NULL && headGear->getItem()->id < 256) { glPushMatrix(); diff --git a/Minecraft.Client/SnowManRenderer.h b/Minecraft.Client/SnowManRenderer.h index ab003fe6..9bdecb4d 100644 --- a/Minecraft.Client/SnowManRenderer.h +++ b/Minecraft.Client/SnowManRenderer.h @@ -13,5 +13,5 @@ public: SnowManRenderer(); protected: - virtual void additionalRendering(std::shared_ptr _mob, float a); + virtual void additionalRendering(shared_ptr _mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/SpiderModel.cpp b/Minecraft.Client/SpiderModel.cpp index 83ff82a4..35c51d3e 100644 --- a/Minecraft.Client/SpiderModel.cpp +++ b/Minecraft.Client/SpiderModel.cpp @@ -6,7 +6,7 @@ SpiderModel::SpiderModel() : Model() { float g = 0; - + int yo = 18+6-9; head = new ModelPart(this, 32, 4); @@ -68,7 +68,7 @@ SpiderModel::SpiderModel() : Model() leg7->compile(1.0f/16.0f); } -void SpiderModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void SpiderModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); @@ -93,13 +93,13 @@ void SpiderModel::setupAnim(float time, float r, float bob, float yRot, float xR float sr = (float) PI / 4.0f; leg0->zRot = -sr; leg1->zRot = sr; - + leg2->zRot = -sr * 0.74f; leg3->zRot = sr * 0.74f; - + leg4->zRot = -sr * 0.74f; leg5->zRot = sr * 0.74f; - + leg6->zRot = -sr; leg7->zRot = sr; diff --git a/Minecraft.Client/SpiderModel.h b/Minecraft.Client/SpiderModel.h index 2d9d1527..61666983 100644 --- a/Minecraft.Client/SpiderModel.h +++ b/Minecraft.Client/SpiderModel.h @@ -7,6 +7,6 @@ public: ModelPart *head, *body0, *body1, *leg0, *leg1, *leg2, *leg3, *leg4, *leg5, *leg6, *leg7; SpiderModel(); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SpiderRenderer.cpp b/Minecraft.Client/SpiderRenderer.cpp index d19472c5..9c31eb9e 100644 --- a/Minecraft.Client/SpiderRenderer.cpp +++ b/Minecraft.Client/SpiderRenderer.cpp @@ -8,15 +8,15 @@ SpiderRenderer::SpiderRenderer() : MobRenderer(new SpiderModel(), 1.0f) this->setArmor(new SpiderModel()); } -float SpiderRenderer::getFlipDegrees(std::shared_ptr spider) +float SpiderRenderer::getFlipDegrees(shared_ptr spider) { return 180; } -int SpiderRenderer::prepareArmor(std::shared_ptr _spider, int layer, float a) +int SpiderRenderer::prepareArmor(shared_ptr _spider, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr spider = dynamic_pointer_cast(_spider); + shared_ptr spider = dynamic_pointer_cast(_spider); if (layer!=0) return -1; MemSect(31); @@ -40,7 +40,7 @@ int SpiderRenderer::prepareArmor(std::shared_ptr _spider, int layer, float { // 4J - was 0xf0f0 but that looks like it is a mistake - maybe meant to be 0xf000f0 to enable both sky & block lighting? choosing 0x00f0 here instead // as most likely replicates what the java game does, without breaking our lighting (which doesn't like UVs out of the 0 to 255 range) - int col = 0x00f0; + int col = 0x00f0; int u = col % 65536; int v = col / 65536; @@ -52,10 +52,10 @@ int SpiderRenderer::prepareArmor(std::shared_ptr _spider, int layer, float return 1; } -void SpiderRenderer::scale(std::shared_ptr _mob, float a) +void SpiderRenderer::scale(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); float scale = mob->getModelScale(); glScalef(scale, scale, scale); } \ No newline at end of file diff --git a/Minecraft.Client/SpiderRenderer.h b/Minecraft.Client/SpiderRenderer.h index 7946ed46..3b937458 100644 --- a/Minecraft.Client/SpiderRenderer.h +++ b/Minecraft.Client/SpiderRenderer.h @@ -6,7 +6,7 @@ class SpiderRenderer : public MobRenderer public: SpiderRenderer(); protected: - virtual float getFlipDegrees(std::shared_ptr spider); - virtual int prepareArmor(std::shared_ptr _spider, int layer, float a); - void scale(std::shared_ptr _mob, float a); + virtual float getFlipDegrees(shared_ptr spider); + virtual int prepareArmor(shared_ptr _spider, int layer, float a); + void scale(shared_ptr _mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/SquidModel.cpp b/Minecraft.Client/SquidModel.cpp index 6f87cbde..8ad20f8e 100644 --- a/Minecraft.Client/SquidModel.cpp +++ b/Minecraft.Client/SquidModel.cpp @@ -43,7 +43,7 @@ void SquidModel::setupAnim(float time, float r, float bob, float yRot, float xRo } } -void SquidModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void SquidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); diff --git a/Minecraft.Client/SquidModel.h b/Minecraft.Client/SquidModel.h index 0b7948a8..8f43950f 100644 --- a/Minecraft.Client/SquidModel.h +++ b/Minecraft.Client/SquidModel.h @@ -10,5 +10,5 @@ public: SquidModel(); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/SquidRenderer.cpp b/Minecraft.Client/SquidRenderer.cpp index 3ee79eb1..135f6d9b 100644 --- a/Minecraft.Client/SquidRenderer.cpp +++ b/Minecraft.Client/SquidRenderer.cpp @@ -6,15 +6,15 @@ SquidRenderer::SquidRenderer(Model *model, float shadow) : MobRenderer(model, sh { } -void SquidRenderer::render(std::shared_ptr mob, double x, double y, double z, float rot, float a) +void SquidRenderer::render(shared_ptr mob, double x, double y, double z, float rot, float a) { MobRenderer::render(mob, x, y, z, rot, a); } -void SquidRenderer::setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a) +void SquidRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); float bodyXRot = (mob->xBodyRotO + (mob->xBodyRot - mob->xBodyRotO) * a); float bodyZRot = (mob->zBodyRotO + (mob->zBodyRot - mob->zBodyRotO) * a); @@ -26,10 +26,10 @@ void SquidRenderer::setupRotations(std::shared_ptr _mob, float bob, float b glTranslatef(0, -1.2f, 0); } -float SquidRenderer::getBob(std::shared_ptr _mob, float a) +float SquidRenderer::getBob(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); return mob->oldTentacleAngle + (mob->tentacleAngle - mob->oldTentacleAngle) * a; } \ No newline at end of file diff --git a/Minecraft.Client/SquidRenderer.h b/Minecraft.Client/SquidRenderer.h index 13270b5f..ccc81944 100644 --- a/Minecraft.Client/SquidRenderer.h +++ b/Minecraft.Client/SquidRenderer.h @@ -7,9 +7,9 @@ public: SquidRenderer(Model *model, float shadow); public: - virtual void render(std::shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); protected: - virtual void setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a); - virtual float getBob(std::shared_ptr _mob, float a); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + virtual float getBob(shared_ptr _mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/SurvivalMode.cpp b/Minecraft.Client/SurvivalMode.cpp index b1b727a4..27a992df 100644 --- a/Minecraft.Client/SurvivalMode.cpp +++ b/Minecraft.Client/SurvivalMode.cpp @@ -43,7 +43,7 @@ SurvivalMode::SurvivalMode(SurvivalMode *copy) : GameMode( copy->minecraft ) destroyDelay = copy->destroyDelay; } -void SurvivalMode::initPlayer(std::shared_ptr player) +void SurvivalMode::initPlayer(shared_ptr player) { player->yRot = -180; } @@ -63,7 +63,7 @@ bool SurvivalMode::destroyBlock(int x, int y, int z, int face) int data = minecraft->level->getData(x, y, z); bool changed = GameMode::destroyBlock(x, y, z, face); - std::shared_ptr item = minecraft->player->getSelectedItem(); + shared_ptr item = minecraft->player->getSelectedItem(); bool couldDestroy = minecraft->player->canDestroy(Tile::tiles[t]); if (item != NULL) { @@ -73,7 +73,7 @@ bool SurvivalMode::destroyBlock(int x, int y, int z, int face) minecraft->player->removeSelectedItem(); } } - if (changed && couldDestroy) + if (changed && couldDestroy) { Tile::tiles[t]->playerDestroy(minecraft->level, minecraft->player, x, y, z, data); } @@ -171,9 +171,9 @@ void SurvivalMode::initLevel(Level *level) GameMode::initLevel(level); } -std::shared_ptr SurvivalMode::createPlayer(Level *level) +shared_ptr SurvivalMode::createPlayer(Level *level) { - std::shared_ptr player = GameMode::createPlayer(level); + shared_ptr player = GameMode::createPlayer(level); // player.inventory.add(new ItemInstance(Item.pickAxe_diamond)); // player.inventory.add(new ItemInstance(Item.hatchet_diamond)); // player.inventory.add(new ItemInstance(Tile.torch, 64)); @@ -189,7 +189,7 @@ void SurvivalMode::tick() //minecraft->soundEngine->playMusicTick(); } -bool SurvivalMode::useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly, bool *pbUsedItem) +bool SurvivalMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly, bool *pbUsedItem) { int t = level->getTile(x, y, z); if (t > 0) diff --git a/Minecraft.Client/SurvivalMode.h b/Minecraft.Client/SurvivalMode.h index 643e50d1..b4ce5e6d 100644 --- a/Minecraft.Client/SurvivalMode.h +++ b/Minecraft.Client/SurvivalMode.h @@ -15,7 +15,7 @@ private: public: SurvivalMode(Minecraft *minecraft); SurvivalMode(SurvivalMode *copy); - virtual void initPlayer(std::shared_ptr player); + virtual void initPlayer(shared_ptr player); virtual void init(); virtual bool canHurtPlayer(); virtual bool destroyBlock(int x, int y, int z, int face); @@ -25,8 +25,8 @@ public: virtual void render(float a); virtual float getPickRange(); virtual void initLevel(Level *level); - virtual std::shared_ptr createPlayer(Level *level); + virtual shared_ptr createPlayer(Level *level); virtual void tick(); - virtual bool useItemOn(std::shared_ptr player, Level *level, std::shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly=false, bool *pbUsedItem=NULL); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, bool bTestUseOnOnly=false, bool *pbUsedItem=NULL); virtual bool hasExperience(); }; \ No newline at end of file diff --git a/Minecraft.Client/TakeAnimationParticle.cpp b/Minecraft.Client/TakeAnimationParticle.cpp index 3f00c004..c9530b0a 100644 --- a/Minecraft.Client/TakeAnimationParticle.cpp +++ b/Minecraft.Client/TakeAnimationParticle.cpp @@ -5,7 +5,7 @@ #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\Mth.h" -TakeAnimationParticle::TakeAnimationParticle(Level *level, std::shared_ptr item, std::shared_ptr target, float yOffs) : Particle(level, item->x, item->y, item->z, item->xd, item->yd, item->zd) +TakeAnimationParticle::TakeAnimationParticle(Level *level, shared_ptr item, shared_ptr target, float yOffs) : Particle(level, item->x, item->y, item->z, item->xd, item->yd, item->zd) { // 4J - added initialisers life = 0; @@ -39,7 +39,7 @@ void TakeAnimationParticle::render(Tesselator *t, float a, float xa, float ya, f double xx = xo + (xt - xo) * time; double yy = yo + (yt - yo) * time; double zz = zo + (zt - zo) * time; - + int xTile = Mth::floor(xx); int yTile = Mth::floor(yy + heightOffset / 2.0f); int zTile = Mth::floor(zz); @@ -58,12 +58,12 @@ void TakeAnimationParticle::render(Tesselator *t, float a, float xa, float ya, f float br = level->getBrightness(xTile, yTile, zTile); glColor4f(br, br, br, 1); } - + xx-=xOff; yy-=yOff; zz-=zOff; - - + + EntityRenderDispatcher::instance->render(item, (float)xx, (float)yy, (float)zz, item->yRot, a); } diff --git a/Minecraft.Client/TakeAnimationParticle.h b/Minecraft.Client/TakeAnimationParticle.h index 33c4535f..10026fda 100644 --- a/Minecraft.Client/TakeAnimationParticle.h +++ b/Minecraft.Client/TakeAnimationParticle.h @@ -7,14 +7,14 @@ class TakeAnimationParticle : public Particle public: virtual eINSTANCEOF GetType() { return eType_TAKEANIMATIONPARTICLE; } private: - std::shared_ptr item; - std::shared_ptr target; + shared_ptr item; + shared_ptr target; int life; int lifeTime; float yOffs; public: - TakeAnimationParticle(Level *level, std::shared_ptr item, std::shared_ptr target, float yOffs); + TakeAnimationParticle(Level *level, shared_ptr item, shared_ptr target, float yOffs); ~TakeAnimationParticle(); virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); virtual void tick(); diff --git a/Minecraft.Client/TeleportCommand.cpp b/Minecraft.Client/TeleportCommand.cpp index d80baca9..2132cfd4 100644 --- a/Minecraft.Client/TeleportCommand.cpp +++ b/Minecraft.Client/TeleportCommand.cpp @@ -14,20 +14,20 @@ EGameCommand TeleportCommand::getId() return eGameCommand_Teleport; } -void TeleportCommand::execute(std::shared_ptr source, byteArray commandData) +void TeleportCommand::execute(shared_ptr source, byteArray commandData) { ByteArrayInputStream bais(commandData); DataInputStream dis(&bais); PlayerUID subjectID = dis.readPlayerUID(); PlayerUID destinationID = dis.readPlayerUID(); - + bais.reset(); PlayerList *players = MinecraftServer::getInstance()->getPlayerList(); - std::shared_ptr subject = players->getPlayer(subjectID); - std::shared_ptr destination = players->getPlayer(destinationID); + shared_ptr subject = players->getPlayer(subjectID); + shared_ptr destination = players->getPlayer(destinationID); if(subject != NULL && destination != NULL && subject->level->dimension->id == destination->level->dimension->id && subject->isAlive() ) { @@ -78,7 +78,7 @@ void TeleportCommand::execute(std::shared_ptr source, byteArray c //} } -std::shared_ptr TeleportCommand::preparePacket(PlayerUID subject, PlayerUID destination) +shared_ptr TeleportCommand::preparePacket(PlayerUID subject, PlayerUID destination) { ByteArrayOutputStream baos; DataOutputStream dos(&baos); @@ -86,5 +86,5 @@ std::shared_ptr TeleportCommand::preparePacket(PlayerUID subj dos.writePlayerUID(subject); dos.writePlayerUID(destination); - return std::shared_ptr( new GameCommandPacket(eGameCommand_Teleport, baos.toByteArray() )); + return shared_ptr( new GameCommandPacket(eGameCommand_Teleport, baos.toByteArray() )); } \ No newline at end of file diff --git a/Minecraft.Client/TeleportCommand.h b/Minecraft.Client/TeleportCommand.h index b6f3b742..9015a52d 100644 --- a/Minecraft.Client/TeleportCommand.h +++ b/Minecraft.Client/TeleportCommand.h @@ -6,7 +6,7 @@ class TeleportCommand : public Command { public: virtual EGameCommand getId(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); - static std::shared_ptr preparePacket(PlayerUID subject, PlayerUID destination); + static shared_ptr preparePacket(PlayerUID subject, PlayerUID destination); }; \ No newline at end of file diff --git a/Minecraft.Client/TerrainParticle.cpp b/Minecraft.Client/TerrainParticle.cpp index 5d2efbdc..811ba840 100644 --- a/Minecraft.Client/TerrainParticle.cpp +++ b/Minecraft.Client/TerrainParticle.cpp @@ -14,7 +14,7 @@ TerrainParticle::TerrainParticle(Level *level, double x, double y, double z, dou size /= 2; } -std::shared_ptr TerrainParticle::init(int x, int y, int z, int data) // 4J - added data parameter +shared_ptr TerrainParticle::init(int x, int y, int z, int data) // 4J - added data parameter { if (tile == Tile::grass) return dynamic_pointer_cast( shared_from_this() ); int col = tile->getColor(level, x, y, z, data); // 4J - added data parameter @@ -24,7 +24,7 @@ std::shared_ptr TerrainParticle::init(int x, int y, int z, int return dynamic_pointer_cast( shared_from_this() ); } -std::shared_ptr TerrainParticle::init(int data) +shared_ptr TerrainParticle::init(int data) { if (tile == Tile::grass) return dynamic_pointer_cast( shared_from_this() ); int col = tile->getColor(data); @@ -59,7 +59,7 @@ void TerrainParticle::render(Tesselator *t, float a, float xa, float ya, float z float y = (float) (yo + (this->y - yo) * a - yOff); float z = (float) (zo + (this->z - zo) * a - zOff); - // 4J - don't render terrain particles that are less than a metre away, to try and avoid large particles that are causing us problems with + // 4J - don't render terrain particles that are less than a metre away, to try and avoid large particles that are causing us problems with // photosensitivity testing float distSq = (x*x + y*y + z*z); if( distSq < 1.0f ) return; diff --git a/Minecraft.Client/TerrainParticle.h b/Minecraft.Client/TerrainParticle.h index df9ca42f..5d4a743f 100644 --- a/Minecraft.Client/TerrainParticle.h +++ b/Minecraft.Client/TerrainParticle.h @@ -11,8 +11,8 @@ private: public: TerrainParticle(Level *level, double x, double y, double z, double xa, double ya, double za, Tile *tile, int face, int data, Textures *textures); - std::shared_ptr init(int x, int y, int z, int data); // 4J - added data parameter - std::shared_ptr init(int data); + shared_ptr init(int x, int y, int z, int data); // 4J - added data parameter + shared_ptr init(int data); virtual int getParticleTexture(); virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); }; \ No newline at end of file diff --git a/Minecraft.Client/TextEditScreen.cpp b/Minecraft.Client/TextEditScreen.cpp index 24f86a4a..9537b969 100644 --- a/Minecraft.Client/TextEditScreen.cpp +++ b/Minecraft.Client/TextEditScreen.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include "TextEditScreen.h" +#include "TextEditScreen.h" #include "Button.h" #include "TileEntityRenderDispatcher.h" #include "ClientConnection.h" @@ -13,7 +13,7 @@ const wstring TextEditScreen::allowedChars = SharedConstants::acceptableLetters;; -TextEditScreen::TextEditScreen(std::shared_ptr sign) +TextEditScreen::TextEditScreen(shared_ptr sign) { // 4J - added initialisers line = 0; @@ -35,7 +35,7 @@ void TextEditScreen::removed() Keyboard::enableRepeatEvents(false); if (minecraft->level->isClientSide) { - minecraft->getConnection(0)->send( std::shared_ptr( new SignUpdatePacket(sign->x, sign->y, sign->z, sign->IsVerified(), sign->IsCensored(), sign->GetMessages()) ) ); + minecraft->getConnection(0)->send( shared_ptr( new SignUpdatePacket(sign->x, sign->y, sign->z, sign->IsVerified(), sign->IsCensored(), sign->GetMessages()) ) ); } } diff --git a/Minecraft.Client/TextEditScreen.h b/Minecraft.Client/TextEditScreen.h index b089f998..aad6ebc8 100644 --- a/Minecraft.Client/TextEditScreen.h +++ b/Minecraft.Client/TextEditScreen.h @@ -8,12 +8,12 @@ class TextEditScreen : public Screen protected: wstring title; private: - std::shared_ptr sign; + shared_ptr sign; int frame; int line; public: - TextEditScreen(std::shared_ptr sign); + TextEditScreen(shared_ptr sign); virtual void init(); virtual void removed(); virtual void tick(); diff --git a/Minecraft.Client/TheEndPortalRenderer.cpp b/Minecraft.Client/TheEndPortalRenderer.cpp index 7837a4fa..52581579 100644 --- a/Minecraft.Client/TheEndPortalRenderer.cpp +++ b/Minecraft.Client/TheEndPortalRenderer.cpp @@ -7,10 +7,10 @@ #include "..\Minecraft.World\FloatBuffer.h" #include "TheEndPortalRenderer.h" -void TheEndPortalRenderer::render(std::shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +void TheEndPortalRenderer::render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J Convert as we aren't using a templated class - std::shared_ptr table = dynamic_pointer_cast(_table); + shared_ptr table = dynamic_pointer_cast(_table); float xx = (float) (tileEntityRenderDispatcher->xPlayer); float yy = (float) (tileEntityRenderDispatcher->yPlayer); float zz = (float) (tileEntityRenderDispatcher->zPlayer); diff --git a/Minecraft.Client/TheEndPortalRenderer.h b/Minecraft.Client/TheEndPortalRenderer.h index fe489275..1e4ca546 100644 --- a/Minecraft.Client/TheEndPortalRenderer.h +++ b/Minecraft.Client/TheEndPortalRenderer.h @@ -5,7 +5,7 @@ class TheEndPortalRenderer : public TileEntityRenderer { public: - virtual void render(std::shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); + virtual void render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); FloatBuffer *lb; diff --git a/Minecraft.Client/TileEntityRenderDispatcher.cpp b/Minecraft.Client/TileEntityRenderDispatcher.cpp index 43111e6e..1708d215 100644 --- a/Minecraft.Client/TileEntityRenderDispatcher.cpp +++ b/Minecraft.Client/TileEntityRenderDispatcher.cpp @@ -80,18 +80,18 @@ TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(eINSTANCEOF e) return it->second; } -bool TileEntityRenderDispatcher::hasRenderer(std::shared_ptr e) +bool TileEntityRenderDispatcher::hasRenderer(shared_ptr e) { return getRenderer(e) != NULL; } -TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(std::shared_ptr e) +TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(shared_ptr e) { if (e == NULL) return NULL; return getRenderer(e->GetType()); } -void TileEntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, std::shared_ptr player, float a) +void TileEntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a) { if( this->level != level ) { @@ -109,7 +109,7 @@ void TileEntityRenderDispatcher::prepare(Level *level, Textures *textures, Font zPlayer = player->zOld + (player->z - player->zOld) * a; } -void TileEntityRenderDispatcher::render(std::shared_ptr e, float a, bool setColor/*=true*/) +void TileEntityRenderDispatcher::render(shared_ptr e, float a, bool setColor/*=true*/) { if (e->distanceToSqr(xPlayer, yPlayer, zPlayer) < 64 * 64) { @@ -131,7 +131,7 @@ void TileEntityRenderDispatcher::render(std::shared_ptr e, float a, } } -void TileEntityRenderDispatcher::render(std::shared_ptr entity, double x, double y, double z, float a, bool setColor/*=true*/, float alpha, bool useCompiled) +void TileEntityRenderDispatcher::render(shared_ptr entity, double x, double y, double z, float a, bool setColor/*=true*/, float alpha, bool useCompiled) { TileEntityRenderer *renderer = getRenderer(entity); if (renderer != NULL) diff --git a/Minecraft.Client/TileEntityRenderDispatcher.h b/Minecraft.Client/TileEntityRenderDispatcher.h index de006bcf..d86ddb01 100644 --- a/Minecraft.Client/TileEntityRenderDispatcher.h +++ b/Minecraft.Client/TileEntityRenderDispatcher.h @@ -25,7 +25,7 @@ public: Textures *textures; Level *level; - std::shared_ptr cameraEntity; + shared_ptr cameraEntity; float playerRotY; float playerRotX; double xPlayer, yPlayer, zPlayer; @@ -35,11 +35,11 @@ private: public: TileEntityRenderer *getRenderer(eINSTANCEOF e); - bool hasRenderer(std::shared_ptr e); - TileEntityRenderer * getRenderer(std::shared_ptr e); - void prepare(Level *level, Textures *textures, Font *font, std::shared_ptr player, float a); - void render(std::shared_ptr e, float a, bool setColor = true); - void render(std::shared_ptr entity, double x, double y, double z, float a, bool setColor = true, float alpha=1.0f, bool useCompiled = true); // 4J Added useCompiled + bool hasRenderer(shared_ptr e); + TileEntityRenderer * getRenderer(shared_ptr e); + void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a); + void render(shared_ptr e, float a, bool setColor = true); + void render(shared_ptr entity, double x, double y, double z, float a, bool setColor = true, float alpha=1.0f, bool useCompiled = true); // 4J Added useCompiled void setLevel(Level *level); double distanceToSqr(double x, double y, double z); Font *getFont(); diff --git a/Minecraft.Client/TileEntityRenderer.h b/Minecraft.Client/TileEntityRenderer.h index 292e1d00..b7d08b86 100644 --- a/Minecraft.Client/TileEntityRenderer.h +++ b/Minecraft.Client/TileEntityRenderer.h @@ -10,7 +10,7 @@ class TileEntityRenderer protected: TileEntityRenderDispatcher *tileEntityRenderDispatcher; public: - virtual void render(std::shared_ptr entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) = 0; // 4J added setColor param and alpha and useCompiled + virtual void render(shared_ptr entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) = 0; // 4J added setColor param and alpha and useCompiled virtual void onNewLevel(Level *level) {} protected: void bindTexture(int resourceName); // 4J - changed from wstring to int diff --git a/Minecraft.Client/TileRenderer.cpp b/Minecraft.Client/TileRenderer.cpp index cb9b02f6..3962cc71 100644 --- a/Minecraft.Client/TileRenderer.cpp +++ b/Minecraft.Client/TileRenderer.cpp @@ -244,7 +244,7 @@ void TileRenderer::tesselateInWorldFixedTexture( Tile* tile, int x, int y, int z } void TileRenderer::tesselateInWorldNoCulling( Tile* tile, int x, int y, int z, int forceData, - std::shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param + shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param { noCulling = true; tesselateInWorld( tile, x, y, z, forceData ); @@ -252,7 +252,7 @@ void TileRenderer::tesselateInWorldNoCulling( Tile* tile, int x, int y, int z, i } bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceData, - std::shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param + shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param { Tesselator* t = Tesselator::getInstance(); int shape = tt->getRenderShape(); diff --git a/Minecraft.Client/TileRenderer.h b/Minecraft.Client/TileRenderer.h index ec369939..4045ece2 100644 --- a/Minecraft.Client/TileRenderer.h +++ b/Minecraft.Client/TileRenderer.h @@ -79,9 +79,9 @@ public: void tesselateInWorldFixedTexture( Tile* tile, int x, int y, int z, Icon *fixedTexture ); // 4J renamed to differentiate from tesselateInWorld void tesselateInWorldNoCulling( Tile* tile, int x, int y, int z, int forceData = -1, - std::shared_ptr< TileEntity > forceEntity = std::shared_ptr< TileEntity >() ); // 4J added forceData, forceEntity param - bool tesselateInWorld( Tile* tt, int x, int y, int z, int forceData = -1, std::shared_ptr< TileEntity > forceEntity = - std::shared_ptr< TileEntity >() ); // 4J added forceData, forceEntity param + shared_ptr< TileEntity > forceEntity = shared_ptr< TileEntity >() ); // 4J added forceData, forceEntity param + bool tesselateInWorld( Tile* tt, int x, int y, int z, int forceData = -1, shared_ptr< TileEntity > forceEntity = + shared_ptr< TileEntity >() ); // 4J added forceData, forceEntity param private: bool tesselateAirPortalFrameInWorld(TheEndPortalFrameTile *tt, int x, int y, int z); diff --git a/Minecraft.Client/TntRenderer.cpp b/Minecraft.Client/TntRenderer.cpp index 755abea4..3bb7484f 100644 --- a/Minecraft.Client/TntRenderer.cpp +++ b/Minecraft.Client/TntRenderer.cpp @@ -10,10 +10,10 @@ TntRenderer::TntRenderer() this->shadowRadius = 0.5f; } -void TntRenderer::render(std::shared_ptr _tnt, double x, double y, double z, float rot, float a) +void TntRenderer::render(shared_ptr _tnt, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr tnt = dynamic_pointer_cast(_tnt); + shared_ptr tnt = dynamic_pointer_cast(_tnt); glPushMatrix(); glTranslatef((float) x, (float) y, (float) z); diff --git a/Minecraft.Client/TntRenderer.h b/Minecraft.Client/TntRenderer.h index 1f70c8da..4d9c029c 100644 --- a/Minecraft.Client/TntRenderer.h +++ b/Minecraft.Client/TntRenderer.h @@ -8,5 +8,5 @@ private: public: TntRenderer(); - virtual void render(std::shared_ptr _tnt, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _tnt, double x, double y, double z, float rot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/TrackedEntity.cpp b/Minecraft.Client/TrackedEntity.cpp index c372bdaf..70f25c93 100644 --- a/Minecraft.Client/TrackedEntity.cpp +++ b/Minecraft.Client/TrackedEntity.cpp @@ -20,7 +20,7 @@ #include "PlayerChunkMap.h" #include -TrackedEntity::TrackedEntity(std::shared_ptr e, int range, int updateInterval, bool trackDelta) +TrackedEntity::TrackedEntity(shared_ptr e, int range, int updateInterval, bool trackDelta) { // 4J added initialisers xap = yap = zap = 0; @@ -29,7 +29,7 @@ TrackedEntity::TrackedEntity(std::shared_ptr e, int range, int updateInt updatedPlayerVisibility = false; teleportDelay = 0; moved = false; - + this->e = e; this->range = range; this->updateInterval = updateInterval; @@ -46,7 +46,7 @@ TrackedEntity::TrackedEntity(std::shared_ptr e, int range, int updateInt int c0a = 0, c0b = 0, c1a = 0, c1b = 0, c1c = 0, c2a = 0, c2b = 0; -void TrackedEntity::tick(EntityTracker *tracker, vector > *players) +void TrackedEntity::tick(EntityTracker *tracker, vector > *players) { moved = false; if (!updatedPlayerVisibility || e->distanceToSqr(xpu, ypu, zpu) > 4 * 4) @@ -62,35 +62,35 @@ void TrackedEntity::tick(EntityTracker *tracker, vector if (wasRiding != e->riding) { wasRiding = e->riding; - broadcast(std::shared_ptr(new SetRidingPacket(e, e->riding))); + broadcast(shared_ptr(new SetRidingPacket(e, e->riding))); } // Moving forward special case for item frames - if (e->GetType()== eTYPE_ITEM_FRAME && tickCount % 10 == 0) + if (e->GetType()== eTYPE_ITEM_FRAME && tickCount % 10 == 0) { - std::shared_ptr frame = dynamic_pointer_cast (e); - std::shared_ptr item = frame->getItem(); + shared_ptr frame = dynamic_pointer_cast (e); + shared_ptr item = frame->getItem(); - if (item != NULL && item->getItem()->id == Item::map_Id && !e->removed) + if (item != NULL && item->getItem()->id == Item::map_Id && !e->removed) { - std::shared_ptr data = Item::map->getSavedData(item, e->level); + shared_ptr data = Item::map->getSavedData(item, e->level); for (AUTO_VAR(it,players->begin() ); it != players->end(); ++it) { - std::shared_ptr player = dynamic_pointer_cast(*it); + shared_ptr player = dynamic_pointer_cast(*it); data->tickCarriedBy(player, item); - - if (!player->removed && player->connection && player->connection->countDelayedPackets() <= 5) + + if (!player->removed && player->connection && player->connection->countDelayedPackets() <= 5) { - std::shared_ptr packet = Item::map->getUpdatePacket(item, e->level, player); + shared_ptr packet = Item::map->getUpdatePacket(item, e->level, player); if (packet != NULL) player->connection->send(packet); } } } - std::shared_ptr entityData = e->getEntityData(); - if (entityData->isDirty()) + shared_ptr entityData = e->getEntityData(); + if (entityData->isDirty()) { - broadcastAndSend( std::shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); + broadcastAndSend( shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); } } else @@ -111,14 +111,14 @@ void TrackedEntity::tick(EntityTracker *tracker, vector int ya = yn - yp; int za = zn - zp; - std::shared_ptr packet = nullptr; + shared_ptr packet = nullptr; // 4J - this pos flag used to be set based on abs(xn) etc. but that just seems wrong bool pos = abs(xa) >= TOLERANCE_LEVEL || abs(ya) >= TOLERANCE_LEVEL || abs(za) >= TOLERANCE_LEVEL; // 4J - changed rotation to be generally sent as a delta as well as position int yRota = yRotn - yRotp; int xRota = xRotn - xRotp; - // Keep rotation deltas in +/- 180 degree range + // Keep rotation deltas in +/- 180 degree range while( yRota > 127 ) yRota -= 256; while( yRota < -128 ) yRota += 256; while( xRota > 127 ) xRota -= 256; @@ -134,7 +134,7 @@ void TrackedEntity::tick(EntityTracker *tracker, vector ) { teleportDelay = 0; - packet = std::shared_ptr( new TeleportEntityPacket(e->entityId, xn, yn, zn, (byte) yRotn, (byte) xRotn) ); + packet = shared_ptr( new TeleportEntityPacket(e->entityId, xn, yn, zn, (byte) yRotn, (byte) xRotn) ); // printf("%d: New teleport rot %d\n",e->entityId,yRotn); yRotp = yRotn; xRotp = xRotn; @@ -161,12 +161,12 @@ void TrackedEntity::tick(EntityTracker *tracker, vector yRotn = yRotp + yRota; } // 5 bits each for x & z, and 6 for y - packet = std::shared_ptr( new MoveEntityPacketSmall::PosRot(e->entityId, (char) xa, (char) ya, (char) za, (char) yRota, 0 ) ); + packet = shared_ptr( new MoveEntityPacketSmall::PosRot(e->entityId, (char) xa, (char) ya, (char) za, (char) yRota, 0 ) ); c0a++; } else { - packet = std::shared_ptr( new MoveEntityPacket::PosRot(e->entityId, (char) xa, (char) ya, (char) za, (char) yRota, (char) xRota) ); + packet = shared_ptr( new MoveEntityPacket::PosRot(e->entityId, (char) xa, (char) ya, (char) za, (char) yRota, (char) xRota) ); // printf("%d: New posrot %d + %d = %d\n",e->entityId,yRotp,yRota,yRotn); c0b++; } @@ -179,7 +179,7 @@ void TrackedEntity::tick(EntityTracker *tracker, vector ( ya >= -16 ) && ( ya <= 15 ) ) { // 4 bits each for x & z, and 5 for y - packet = std::shared_ptr( new MoveEntityPacketSmall::Pos(e->entityId, (char) xa, (char) ya, (char) za) ); + packet = shared_ptr( new MoveEntityPacketSmall::Pos(e->entityId, (char) xa, (char) ya, (char) za) ); c1a++; } @@ -188,12 +188,12 @@ void TrackedEntity::tick(EntityTracker *tracker, vector ( ya >= -32 ) && ( ya <= 31 ) ) { // use the packet with small packet with rotation if we can - 5 bits each for x & z, and 6 for y - still a byte less than the alternative - packet = std::shared_ptr( new MoveEntityPacketSmall::PosRot(e->entityId, (char) xa, (char) ya, (char) za, 0, 0 )); + packet = shared_ptr( new MoveEntityPacketSmall::PosRot(e->entityId, (char) xa, (char) ya, (char) za, 0, 0 )); c1b++; } else { - packet = std::shared_ptr( new MoveEntityPacket::Pos(e->entityId, (char) xa, (char) ya, (char) za) ); + packet = shared_ptr( new MoveEntityPacket::Pos(e->entityId, (char) xa, (char) ya, (char) za) ); c1c++; } } @@ -213,13 +213,13 @@ void TrackedEntity::tick(EntityTracker *tracker, vector yRota = 15; yRotn = yRotp + yRota; } - packet = std::shared_ptr( new MoveEntityPacketSmall::Rot(e->entityId, (char) yRota, 0) ); + packet = shared_ptr( new MoveEntityPacketSmall::Rot(e->entityId, (char) yRota, 0) ); c2a++; } else { // printf("%d: New rot %d + %d = %d\n",e->entityId,yRotp,yRota,yRotn); - packet = std::shared_ptr( new MoveEntityPacket::Rot(e->entityId, (char) yRota, (char) xRota) ); + packet = shared_ptr( new MoveEntityPacket::Rot(e->entityId, (char) yRota, (char) xRota) ); c2b++; } } @@ -240,7 +240,7 @@ void TrackedEntity::tick(EntityTracker *tracker, vector xap = e->xd; yap = e->yd; zap = e->zd; - broadcast( std::shared_ptr( new SetEntityMotionPacket(e->entityId, xap, yap, zap) ) ); + broadcast( shared_ptr( new SetEntityMotionPacket(e->entityId, xap, yap, zap) ) ); } } @@ -250,17 +250,17 @@ void TrackedEntity::tick(EntityTracker *tracker, vector broadcast(packet); } - std::shared_ptr entityData = e->getEntityData(); + shared_ptr entityData = e->getEntityData(); if (entityData->isDirty()) { - broadcastAndSend( std::shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); + broadcastAndSend( shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); } int yHeadRot = Mth::floor(e->getYHeadRot() * 256 / 360); if (abs(yHeadRot - yHeadRotp) >= TOLERANCE_LEVEL) { - broadcast(std::shared_ptr(new RotateHeadPacket(e->entityId, (byte) yHeadRot))); + broadcast(shared_ptr(new RotateHeadPacket(e->entityId, (byte) yHeadRot))); yHeadRotp = yHeadRot; } @@ -281,13 +281,13 @@ void TrackedEntity::tick(EntityTracker *tracker, vector // printf("%d: %d + %d = %d (%f)\n",e->entityId,xRotp,xRota,xRotn,e->xRot); // } } - + } else // 4J-JEV: Added: Mobs in minecarts weren't synching their invisibility. { - std::shared_ptr entityData = e->getEntityData(); + shared_ptr entityData = e->getEntityData(); if (entityData->isDirty()) - broadcastAndSend( std::shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); + broadcastAndSend( shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); } e->hasImpulse = false; } @@ -295,20 +295,20 @@ void TrackedEntity::tick(EntityTracker *tracker, vector if (e->hurtMarked) { // broadcast(new AnimatePacket(e, AnimatePacket.HURT)); - broadcastAndSend( std::shared_ptr( new SetEntityMotionPacket(e) ) ); + broadcastAndSend( shared_ptr( new SetEntityMotionPacket(e) ) ); e->hurtMarked = false; } } -void TrackedEntity::broadcast(std::shared_ptr packet) +void TrackedEntity::broadcast(shared_ptr packet) { if( Packet::canSendToAnyClient( packet ) ) { // 4J-PB - due to the knockback on a player being hit, we need to send to all players, but limit the network traffic here to players that have not already had it sent to their system - vector< std::shared_ptr > sentTo; + vector< shared_ptr > sentTo; - // 4J - don't send to a player we've already sent this data to that shares the same machine. + // 4J - don't send to a player we've already sent this data to that shares the same machine. // EntityMotionPacket used to limit themselves to sending once to each machine // by only sending to the primary player on each machine. This was causing trouble for split screen // as only the primary player would get a knockback velocity. Now these packets can be sent to any @@ -316,7 +316,7 @@ void TrackedEntity::broadcast(std::shared_ptr packet) for( AUTO_VAR(it, seenBy.begin()); it != seenBy.end(); it++ ) { - std::shared_ptr player = *it; + shared_ptr player = *it; bool dontSend = false; if( sentTo.size() ) { @@ -327,15 +327,15 @@ void TrackedEntity::broadcast(std::shared_ptr packet) } else { - for(unsigned int j = 0; j < sentTo.size(); j++ ) + for(unsigned int j = 0; j < sentTo.size(); j++ ) { - std::shared_ptr player2 = sentTo[j]; + shared_ptr player2 = sentTo[j]; INetworkPlayer *otherPlayer = player2->connection->getNetworkPlayer(); if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) { dontSend = true; // #ifdef _DEBUG - // std::shared_ptr emp= dynamic_pointer_cast (packet); + // shared_ptr emp= dynamic_pointer_cast (packet); // if(emp!=NULL) // { // app.DebugPrintf("Not sending this SetEntityMotionPacket to player - it's already been sent to a player on their console\n"); @@ -366,11 +366,11 @@ void TrackedEntity::broadcast(std::shared_ptr packet) } } -void TrackedEntity::broadcastAndSend(std::shared_ptr packet) +void TrackedEntity::broadcastAndSend(shared_ptr packet) { - vector< std::shared_ptr > sentTo; + vector< shared_ptr > sentTo; broadcast(packet); - std::shared_ptr sp = dynamic_pointer_cast(e); + shared_ptr sp = dynamic_pointer_cast(e); if (sp != NULL && sp->connection) { sp->connection->send(packet); @@ -385,7 +385,7 @@ void TrackedEntity::broadcastRemoved() } } -void TrackedEntity::removePlayer(std::shared_ptr sp) +void TrackedEntity::removePlayer(shared_ptr sp) { AUTO_VAR(it, seenBy.find( sp )); if( it != seenBy.end() ) @@ -395,7 +395,7 @@ void TrackedEntity::removePlayer(std::shared_ptr sp) } // 4J-JEV: Added for code reuse. -TrackedEntity::eVisibility TrackedEntity::isVisible(EntityTracker *tracker, std::shared_ptr sp, bool forRider) +TrackedEntity::eVisibility TrackedEntity::isVisible(EntityTracker *tracker, shared_ptr sp, bool forRider) { // 4J Stu - We call update players when the entity has moved more than a certain amount at the start of it's tick // Before this call we set xpu, ypu and zpu to the entities new position, but xp,yp and zp are the old position until later in the tick. @@ -424,7 +424,7 @@ TrackedEntity::eVisibility TrackedEntity::isVisible(EntityTracker *tracker, std: for( unsigned int i = 0; i < server->getPlayers()->players.size(); i++ ) { // Consider extra players, but not if they are the entity we are tracking, or the player we've been passed as input, or in another dimension - std::shared_ptr ep = server->getPlayers()->players[i]; + shared_ptr ep = server->getPlayers()->players[i]; if( ep == sp ) continue; if( ep == e ) continue; if( ep->dimension != sp->dimension ) continue; @@ -461,24 +461,24 @@ TrackedEntity::eVisibility TrackedEntity::isVisible(EntityTracker *tracker, std: else return eVisibility_NotVisible; } -void TrackedEntity::updatePlayer(EntityTracker *tracker, std::shared_ptr sp) +void TrackedEntity::updatePlayer(EntityTracker *tracker, shared_ptr sp) { if (sp == e) return; eVisibility visibility = this->isVisible(tracker, sp); - + if ( visibility == eVisibility_SeenAndVisible && seenBy.find(sp) == seenBy.end() ) { seenBy.insert(sp); - std::shared_ptr packet = getAddEntityPacket(); + shared_ptr packet = getAddEntityPacket(); sp->connection->send(packet); xap = e->xd; yap = e->yd; zap = e->zd; - std::shared_ptr plr = dynamic_pointer_cast(e); + shared_ptr plr = dynamic_pointer_cast(e); if (plr != NULL) { app.DebugPrintf( "TrackedEntity:: Player '%ls' is now visible to player '%ls', %s.\n", @@ -490,17 +490,17 @@ void TrackedEntity::updatePlayer(EntityTracker *tracker, std::shared_ptrgetEntityData()->isEmpty() && !(dynamic_pointer_cast(packet))) { - sp->connection->send(std::shared_ptr( new SetEntityDataPacket(e->entityId, e->getEntityData(), true))); + sp->connection->send(shared_ptr( new SetEntityDataPacket(e->entityId, e->getEntityData(), true))); } if (this->trackDelta) { - sp->connection->send( std::shared_ptr( new SetEntityMotionPacket(e->entityId, e->xd, e->yd, e->zd) ) ); + sp->connection->send( shared_ptr( new SetEntityMotionPacket(e->entityId, e->xd, e->yd, e->zd) ) ); } if (e->riding != NULL) { - sp->connection->send(std::shared_ptr(new SetRidingPacket(e, e->riding))); + sp->connection->send(shared_ptr(new SetRidingPacket(e, e->riding))); } ItemInstanceArray equipped = e->getEquipmentSlots(); @@ -508,28 +508,28 @@ void TrackedEntity::updatePlayer(EntityTracker *tracker, std::shared_ptrconnection->send( std::shared_ptr( new SetEquippedItemPacket(e->entityId, i, equipped[i]) ) ); + sp->connection->send( shared_ptr( new SetEquippedItemPacket(e->entityId, i, equipped[i]) ) ); } } if (dynamic_pointer_cast(e) != NULL) { - std::shared_ptr spe = dynamic_pointer_cast(e); + shared_ptr spe = dynamic_pointer_cast(e); if (spe->isSleeping()) { - sp->connection->send( std::shared_ptr( new EntityActionAtPositionPacket(e, EntityActionAtPositionPacket::START_SLEEP, Mth::floor(e->x), Mth::floor(e->y), Mth::floor(e->z)) ) ); + sp->connection->send( shared_ptr( new EntityActionAtPositionPacket(e, EntityActionAtPositionPacket::START_SLEEP, Mth::floor(e->x), Mth::floor(e->y), Mth::floor(e->z)) ) ); } } if (dynamic_pointer_cast(e) != NULL) { - std::shared_ptr mob = dynamic_pointer_cast(e); + shared_ptr mob = dynamic_pointer_cast(e); vector *activeEffects = mob->getActiveEffects(); for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) { MobEffectInstance *effect = *it; - sp->connection->send(std::shared_ptr( new UpdateMobEffectPacket(e->entityId, effect) ) ); + sp->connection->send(shared_ptr( new UpdateMobEffectPacket(e->entityId, effect) ) ); } delete activeEffects; } @@ -546,7 +546,7 @@ void TrackedEntity::updatePlayer(EntityTracker *tracker, std::shared_ptr player) +bool TrackedEntity::canBySeenBy(shared_ptr player) { // 4J - for some reason this isn't currently working, and is causing players to not appear until we are really close to them. Not sure // what the conflict is between the java & our version, but removing for now as it is causing issues and we shouldn't *really* need it @@ -556,7 +556,7 @@ bool TrackedEntity::canBySeenBy(std::shared_ptr player) // return player->getLevel()->getChunkMap()->isPlayerIn(player, e->xChunk, e->zChunk); } -void TrackedEntity::updatePlayers(EntityTracker *tracker, vector > *players) +void TrackedEntity::updatePlayers(EntityTracker *tracker, vector > *players) { for (unsigned int i = 0; i < players->size(); i++) { @@ -564,7 +564,7 @@ void TrackedEntity::updatePlayers(EntityTracker *tracker, vector TrackedEntity::getAddEntityPacket() +shared_ptr TrackedEntity::getAddEntityPacket() { if (e->removed) { @@ -575,20 +575,20 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() if (dynamic_pointer_cast(e) != NULL) { yHeadRotp = Mth::floor(e->getYHeadRot() * 256 / 360); - return std::shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp, yHeadRotp) ); + return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp, yHeadRotp) ); } switch(e->GetType()) { case eTYPE_ITEMENTITY: { - std::shared_ptr packet = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::ITEM, 1, yRotp, xRotp, xp, yp, zp) ); + shared_ptr packet = shared_ptr( new AddEntityPacket(e, AddEntityPacket::ITEM, 1, yRotp, xRotp, xp, yp, zp) ); return packet; } break; case eTYPE_SERVERPLAYER: { - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); PlayerUID xuid = INVALID_XUID; PlayerUID OnlineXuid = INVALID_XUID; if( player != NULL ) @@ -597,76 +597,76 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() OnlineXuid = player->getOnlineXuid(); } // 4J Added yHeadRotp param to fix #102563 - TU12: Content: Gameplay: When one of the Players is idle for a few minutes his head turns 180 degrees. - return std::shared_ptr( new AddPlayerPacket(dynamic_pointer_cast(e), xuid, OnlineXuid, xp, yp, zp, yRotp, xRotp, yHeadRotp ) ); + return shared_ptr( new AddPlayerPacket(dynamic_pointer_cast(e), xuid, OnlineXuid, xp, yp, zp, yRotp, xRotp, yHeadRotp ) ); } break; case eTYPE_MINECART: { - std::shared_ptr minecart = dynamic_pointer_cast(e); - if (minecart->type == Minecart::RIDEABLE) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_RIDEABLE, yRotp, xRotp, xp, yp, zp) ); - if (minecart->type == Minecart::CHEST) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_CHEST, yRotp, xRotp, xp, yp, zp) ); - if (minecart->type == Minecart::FURNACE) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_FURNACE, yRotp, xRotp, xp, yp, zp) ); + shared_ptr minecart = dynamic_pointer_cast(e); + if (minecart->type == Minecart::RIDEABLE) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_RIDEABLE, yRotp, xRotp, xp, yp, zp) ); + if (minecart->type == Minecart::CHEST) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_CHEST, yRotp, xRotp, xp, yp, zp) ); + if (minecart->type == Minecart::FURNACE) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_FURNACE, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_BOAT: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_ENDERDRAGON: { yHeadRotp = Mth::floor(e->getYHeadRot() * 256 / 360); - return std::shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp, yHeadRotp ) ); + return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp, yHeadRotp ) ); } break; case eTYPE_FISHINGHOOK: { - std::shared_ptr owner = dynamic_pointer_cast(e)->owner; - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FISH_HOOK, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); + shared_ptr owner = dynamic_pointer_cast(e)->owner; + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FISH_HOOK, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_ARROW: { - std::shared_ptr owner = (dynamic_pointer_cast(e))->owner; - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::ARROW, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); + shared_ptr owner = (dynamic_pointer_cast(e))->owner; + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ARROW, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_SNOWBALL: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::SNOWBALL, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::SNOWBALL, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_THROWNPOTION: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_POTION, ((dynamic_pointer_cast(e))->getPotionValue()), yRotp, xRotp, xp, yp, zp)); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_POTION, ((dynamic_pointer_cast(e))->getPotionValue()), yRotp, xRotp, xp, yp, zp)); } break; case eTYPE_THROWNEXPBOTTLE: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_EXPBOTTLE, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_EXPBOTTLE, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_THROWNENDERPEARL: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_ENDERPEARL, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_ENDERPEARL, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_EYEOFENDERSIGNAL: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::EYEOFENDERSIGNAL, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EYEOFENDERSIGNAL, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_SMALL_FIREBALL: { - std::shared_ptr fb = dynamic_pointer_cast(e); - std::shared_ptr aep = nullptr; + shared_ptr fb = dynamic_pointer_cast(e); + shared_ptr aep = nullptr; if (fb->owner != NULL) { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); } else { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); } aep->xa = (int) (fb->xPower * 8000); aep->ya = (int) (fb->yPower * 8000); @@ -676,15 +676,15 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() break; case eTYPE_DRAGON_FIREBALL: { - std::shared_ptr fb = dynamic_pointer_cast(e); - std::shared_ptr aep = nullptr; + shared_ptr fb = dynamic_pointer_cast(e); + shared_ptr aep = nullptr; if (fb->owner != NULL) { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::DRAGON_FIRE_BALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::DRAGON_FIRE_BALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); } else { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::DRAGON_FIRE_BALL, 0, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::DRAGON_FIRE_BALL, 0, yRotp, xRotp, xp, yp, zp) ); } aep->xa = (int) (fb->xPower * 8000); aep->ya = (int) (fb->yPower * 8000); @@ -694,15 +694,15 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() break; case eTYPE_FIREBALL: { - std::shared_ptr fb = dynamic_pointer_cast(e); - std::shared_ptr aep = nullptr; + shared_ptr fb = dynamic_pointer_cast(e); + shared_ptr aep = nullptr; if (fb->owner != NULL) { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); } else { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); } aep->xa = (int) (fb->xPower * 8000); aep->ya = (int) (fb->yPower * 8000); @@ -712,33 +712,33 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() break; case eTYPE_THROWNEGG: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::EGG, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EGG, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_PRIMEDTNT: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::PRIMED_TNT, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::PRIMED_TNT, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_ENDER_CRYSTAL: { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::ENDER_CRYSTAL, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ENDER_CRYSTAL, yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_FALLINGTILE: { - std::shared_ptr ft = dynamic_pointer_cast(e); - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING, ft->tile | (ft->data << 16), yRotp, xRotp, xp, yp, zp) ); + shared_ptr ft = dynamic_pointer_cast(e); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING, ft->tile | (ft->data << 16), yRotp, xRotp, xp, yp, zp) ); } break; case eTYPE_PAINTING: { - return std::shared_ptr( new AddPaintingPacket(dynamic_pointer_cast(e)) ); + return shared_ptr( new AddPaintingPacket(dynamic_pointer_cast(e)) ); } break; case eTYPE_ITEM_FRAME: { - std::shared_ptr frame = dynamic_pointer_cast(e); + shared_ptr frame = dynamic_pointer_cast(e); { int ix= (int)frame->xTile; @@ -747,7 +747,7 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() app.DebugPrintf("eTYPE_ITEM_FRAME xyz %d,%d,%d\n",ix,iy,iz); } - std::shared_ptr packet = std::shared_ptr(new AddEntityPacket(e, AddEntityPacket::ITEM_FRAME, frame->dir, yRotp, xRotp, xp, yp, zp)); + shared_ptr packet = shared_ptr(new AddEntityPacket(e, AddEntityPacket::ITEM_FRAME, frame->dir, yRotp, xRotp, xp, yp, zp)); packet->x = Mth::floor(frame->xTile * 32.0f); packet->y = Mth::floor(frame->yTile * 32.0f); packet->z = Mth::floor(frame->zTile * 32.0f); @@ -756,18 +756,18 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() break; case eTYPE_EXPERIENCEORB: { - return std::shared_ptr( new AddExperienceOrbPacket(dynamic_pointer_cast(e)) ); + return shared_ptr( new AddExperienceOrbPacket(dynamic_pointer_cast(e)) ); } break; default: assert(false); - break; + break; } /* if (e->GetType() == eTYPE_ITEMENTITY) { - std::shared_ptr itemEntity = dynamic_pointer_cast(e); - std::shared_ptr packet = std::shared_ptr( new AddItemEntityPacket(itemEntity, xp, yp, zp) ); + shared_ptr itemEntity = dynamic_pointer_cast(e); + shared_ptr packet = shared_ptr( new AddItemEntityPacket(itemEntity, xp, yp, zp) ); itemEntity->x = packet->x / 32.0; itemEntity->y = packet->y / 32.0; itemEntity->z = packet->z / 32.0; @@ -776,7 +776,7 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() if (e->GetType() == eTYPE_SERVERPLAYER ) { - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); XUID xuid = INVALID_XUID; XUID OnlineXuid = INVALID_XUID; if( player != NULL ) @@ -784,68 +784,68 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() xuid = player->getXuid(); OnlineXuid = player->getOnlineXuid(); } - return std::shared_ptr( new AddPlayerPacket(dynamic_pointer_cast(e), xuid, OnlineXuid, xp, yp, zp, yRotp, xRotp ) ); + return shared_ptr( new AddPlayerPacket(dynamic_pointer_cast(e), xuid, OnlineXuid, xp, yp, zp, yRotp, xRotp ) ); } if (e->GetType() == eTYPE_MINECART) { - std::shared_ptr minecart = dynamic_pointer_cast(e); - if (minecart->type == Minecart::RIDEABLE) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_RIDEABLE, yRotp, xRotp, xp, yp, zp) ); - if (minecart->type == Minecart::CHEST) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_CHEST, yRotp, xRotp, xp, yp, zp) ); - if (minecart->type == Minecart::FURNACE) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_FURNACE, yRotp, xRotp, xp, yp, zp) ); + shared_ptr minecart = dynamic_pointer_cast(e); + if (minecart->type == Minecart::RIDEABLE) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_RIDEABLE, yRotp, xRotp, xp, yp, zp) ); + if (minecart->type == Minecart::CHEST) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_CHEST, yRotp, xRotp, xp, yp, zp) ); + if (minecart->type == Minecart::FURNACE) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_FURNACE, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_BOAT) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); } if (dynamic_pointer_cast(e) != NULL) { - return std::shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_ENDERDRAGON) { - return std::shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp ) ); + return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp ) ); } if (e->GetType() == eTYPE_FISHINGHOOK) { - std::shared_ptr owner = dynamic_pointer_cast(e)->owner; - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FISH_HOOK, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); + shared_ptr owner = dynamic_pointer_cast(e)->owner; + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FISH_HOOK, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_ARROW) { - std::shared_ptr owner = (dynamic_pointer_cast(e))->owner; - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::ARROW, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); + shared_ptr owner = (dynamic_pointer_cast(e))->owner; + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ARROW, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_SNOWBALL) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::SNOWBALL, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::SNOWBALL, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_THROWNPOTION) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_POTION, ((dynamic_pointer_cast(e))->getPotionValue()), yRotp, xRotp, xp, yp, zp)); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_POTION, ((dynamic_pointer_cast(e))->getPotionValue()), yRotp, xRotp, xp, yp, zp)); } if (e->GetType() == eTYPE_THROWNEXPBOTTLE) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_EXPBOTTLE, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_EXPBOTTLE, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_THROWNENDERPEARL) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_ENDERPEARL, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_ENDERPEARL, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_EYEOFENDERSIGNAL) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::EYEOFENDERSIGNAL, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EYEOFENDERSIGNAL, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_SMALL_FIREBALL) { - std::shared_ptr fb = dynamic_pointer_cast(e); - std::shared_ptr aep = NULL; + shared_ptr fb = dynamic_pointer_cast(e); + shared_ptr aep = NULL; if (fb->owner != NULL) { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); } else { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); } aep->xa = (int) (fb->xPower * 8000); aep->ya = (int) (fb->yPower * 8000); @@ -854,15 +854,15 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() } if (e->GetType() == eTYPE_FIREBALL) { - std::shared_ptr fb = dynamic_pointer_cast(e); - std::shared_ptr aep = NULL; + shared_ptr fb = dynamic_pointer_cast(e); + shared_ptr aep = NULL; if (fb->owner != NULL) { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); } else { - aep = std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); } aep->xa = (int) (fb->xPower * 8000); aep->ya = (int) (fb->yPower * 8000); @@ -871,30 +871,30 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() } if (e->GetType() == eTYPE_THROWNEGG) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::EGG, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EGG, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_PRIMEDTNT) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::PRIMED_TNT, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::PRIMED_TNT, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_ENDER_CRYSTAL) { - return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::ENDER_CRYSTAL, yRotp, xRotp, xp, yp, zp) ); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ENDER_CRYSTAL, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_FALLINGTILE) { - std::shared_ptr ft = dynamic_pointer_cast(e); - if (ft->tile == Tile::sand_Id) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_SAND, yRotp, xRotp, xp, yp, zp) ); - if (ft->tile == Tile::gravel_Id) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_GRAVEL, yRotp, xRotp, xp, yp, zp) ); - if (ft->tile == Tile::dragonEgg_Id) return std::shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_EGG, yRotp, xRotp, xp, yp, zp) ); + shared_ptr ft = dynamic_pointer_cast(e); + if (ft->tile == Tile::sand_Id) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_SAND, yRotp, xRotp, xp, yp, zp) ); + if (ft->tile == Tile::gravel_Id) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_GRAVEL, yRotp, xRotp, xp, yp, zp) ); + if (ft->tile == Tile::dragonEgg_Id) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_EGG, yRotp, xRotp, xp, yp, zp) ); } if (e->GetType() == eTYPE_PAINTING) { - return std::shared_ptr( new AddPaintingPacket(dynamic_pointer_cast(e)) ); + return shared_ptr( new AddPaintingPacket(dynamic_pointer_cast(e)) ); } - if (e->GetType() == eTYPE_ITEM_FRAME) + if (e->GetType() == eTYPE_ITEM_FRAME) { - std::shared_ptr frame = dynamic_pointer_cast(e); + shared_ptr frame = dynamic_pointer_cast(e); { int ix= (int)frame->xTile; @@ -903,7 +903,7 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() app.DebugPrintf("eTYPE_ITEM_FRAME xyz %d,%d,%d\n",ix,iy,iz); } - std::shared_ptr packet = std::shared_ptr(new AddEntityPacket(e, AddEntityPacket::ITEM_FRAME, frame->dir, yRotp, xRotp, xp, yp, zp)); + shared_ptr packet = shared_ptr(new AddEntityPacket(e, AddEntityPacket::ITEM_FRAME, frame->dir, yRotp, xRotp, xp, yp, zp)); packet->x = Mth::floor(frame->xTile * 32.0f); packet->y = Mth::floor(frame->yTile * 32.0f); packet->z = Mth::floor(frame->zTile * 32.0f); @@ -911,14 +911,14 @@ std::shared_ptr TrackedEntity::getAddEntityPacket() } if (e->GetType() == eTYPE_EXPERIENCEORB) { - return std::shared_ptr( new AddExperienceOrbPacket(dynamic_pointer_cast(e)) ); + return shared_ptr( new AddExperienceOrbPacket(dynamic_pointer_cast(e)) ); } assert(false); */ return nullptr; } -void TrackedEntity::clear(std::shared_ptr sp) +void TrackedEntity::clear(shared_ptr sp) { AUTO_VAR(it, seenBy.find(sp)); if (it != seenBy.end()) diff --git a/Minecraft.Client/TrackedEntity.h b/Minecraft.Client/TrackedEntity.h index 1efd169b..9fb564a4 100644 --- a/Minecraft.Client/TrackedEntity.h +++ b/Minecraft.Client/TrackedEntity.h @@ -15,7 +15,7 @@ private: static const int TOLERANCE_LEVEL = 4; public: - std::shared_ptr e; + shared_ptr e; int range, updateInterval; int xp, yp, zp, yRotp, xRotp, yHeadRotp; @@ -27,23 +27,23 @@ private: bool updatedPlayerVisibility; bool trackDelta; int teleportDelay; - std::shared_ptr wasRiding; + shared_ptr wasRiding; public: bool moved; - unordered_set , PlayerKeyHash, PlayerKeyEq > seenBy; + unordered_set , PlayerKeyHash, PlayerKeyEq > seenBy; - TrackedEntity(std::shared_ptr e, int range, int updateInterval, bool trackDelta); + TrackedEntity(shared_ptr e, int range, int updateInterval, bool trackDelta); - void tick(EntityTracker *tracker, vector > *players); - void broadcast(std::shared_ptr packet); - void broadcastAndSend(std::shared_ptr packet); + void tick(EntityTracker *tracker, vector > *players); + void broadcast(shared_ptr packet); + void broadcastAndSend(shared_ptr packet); void broadcastRemoved(); - void removePlayer(std::shared_ptr sp); + void removePlayer(shared_ptr sp); private: - bool canBySeenBy(std::shared_ptr player); + bool canBySeenBy(shared_ptr player); enum eVisibility { @@ -52,14 +52,14 @@ private: eVisibility_SeenAndVisible = 2, }; - eVisibility isVisible(EntityTracker *tracker, std::shared_ptr sp, bool forRider = false); // 4J Added forRider - + eVisibility isVisible(EntityTracker *tracker, shared_ptr sp, bool forRider = false); // 4J Added forRider + public: - void updatePlayer(EntityTracker *tracker, std::shared_ptr sp); - void updatePlayers(EntityTracker *tracker, vector > *players); + void updatePlayer(EntityTracker *tracker, shared_ptr sp); + void updatePlayers(EntityTracker *tracker, vector > *players); private: - void sendEntityData(std::shared_ptr conn); - std::shared_ptr getAddEntityPacket(); + void sendEntityData(shared_ptr conn); + shared_ptr getAddEntityPacket(); public: - void clear(std::shared_ptr sp); + void clear(shared_ptr sp); }; diff --git a/Minecraft.Client/TrapScreen.cpp b/Minecraft.Client/TrapScreen.cpp index 6a199d0e..c7eb1472 100644 --- a/Minecraft.Client/TrapScreen.cpp +++ b/Minecraft.Client/TrapScreen.cpp @@ -6,7 +6,7 @@ #include "..\Minecraft.World\DispenserTileEntity.h" #include "..\Minecraft.World\net.minecraft.world.h" -TrapScreen::TrapScreen(std::shared_ptr inventory, std::shared_ptr trap) : AbstractContainerScreen(new TrapMenu(inventory, trap)) +TrapScreen::TrapScreen(shared_ptr inventory, shared_ptr trap) : AbstractContainerScreen(new TrapMenu(inventory, trap)) { } diff --git a/Minecraft.Client/TrapScreen.h b/Minecraft.Client/TrapScreen.h index a993805d..bda3158f 100644 --- a/Minecraft.Client/TrapScreen.h +++ b/Minecraft.Client/TrapScreen.h @@ -6,7 +6,7 @@ class Inventory; class TrapScreen : public AbstractContainerScreen { public: - TrapScreen(std::shared_ptr inventory, std::shared_ptr trap); + TrapScreen(shared_ptr inventory, shared_ptr trap); protected: virtual void renderLabels(); virtual void renderBg(float a); diff --git a/Minecraft.Client/ViewportCuller.cpp b/Minecraft.Client/ViewportCuller.cpp index a6d3c87e..bc22faa6 100644 --- a/Minecraft.Client/ViewportCuller.cpp +++ b/Minecraft.Client/ViewportCuller.cpp @@ -7,17 +7,17 @@ ViewportCuller::Face::Face(double x, double y, double z, float yRot, float xRot) this->xc = x; this->yc = y; this->zc = z; - + xd = Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI); zd = -Mth::cos(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI); yd = -Mth::sin(xRot / 180 * PI); - - cullOffs = xc*xd+yc*yd+zc*zd; + + cullOffs = xc*xd+yc*yd+zc*zd; } - + bool ViewportCuller::Face::inFront(double x, double y, double z, double r) { - return x*xd+y*yd+z*zd>cullOffs-r; + return x*xd+y*yd+z*zd>cullOffs-r; } bool ViewportCuller::Face::inFront(double x0, double y0, double z0, double x1, double y1, double z1) @@ -30,7 +30,7 @@ bool ViewportCuller::Face::inFront(double x0, double y0, double z0, double x1, d x0*xd+y0*yd+z1*zd>cullOffs || x1*xd+y0*yd+z1*zd>cullOffs || x0*xd+y1*yd+z1*zd>cullOffs || - x1*xd+y1*yd+z1*zd>cullOffs + x1*xd+y1*yd+z1*zd>cullOffs ) return true; return false; } @@ -44,18 +44,18 @@ bool ViewportCuller::Face::fullyInFront(double x0, double y0, double z0, double x0*xd+y0*yd+z1*zd mob, double fogDistance, float a) +ViewportCuller::ViewportCuller(shared_ptr mob, double fogDistance, float a) { float yRot = mob->yRotO+(mob->yRot-mob->yRotO)*a; float xRot = mob->xRotO+(mob->xRot-mob->xRotO)*a; - - double x = mob->xOld+(mob->x-mob->xOld)*a; - double y = mob->yOld+(mob->y-mob->yOld)*a; + + double x = mob->xOld+(mob->x-mob->xOld)*a; + double y = mob->yOld+(mob->y-mob->yOld)*a; double z = mob->zOld+(mob->z-mob->zOld)*a; double xd = Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI); @@ -69,7 +69,7 @@ ViewportCuller::ViewportCuller(std::shared_ptr mob, double fogDistance, flo faces[2] = Face(x, y, z, yRot-xFov, xRot); faces[3] = Face(x, y, z, yRot, xRot+yFov); faces[4] = Face(x, y, z, yRot, xRot-yFov); - faces[5] = Face(x+xd*fogDistance, y+yd*fogDistance, z+zd*fogDistance, yRot+180, -xRot); + faces[5] = Face(x+xd*fogDistance, y+yd*fogDistance, z+zd*fogDistance, yRot+180, -xRot); } bool ViewportCuller::isVisible(AABB bb) @@ -88,12 +88,12 @@ bool ViewportCuller::cubeInFrustum(double x0, double y0, double z0, double x1, d double xd = (x1-x0)/2.0f; double yd = (y1-y0)/2.0f; double zd = (z1-z0)/2.0f; - + double xc = x0+xd; double yc = y0+yd; double zc = z0+zd; double r = _max(xd, yd, zd)*1.5f; - + if (!faces[0].inFront(xc, yc, zc, r)) return false; if (!faces[1].inFront(xc, yc, zc, r)) return false; if (!faces[2].inFront(xc, yc, zc, r)) return false; @@ -123,7 +123,7 @@ bool ViewportCuller::cubeFullyInFrustum(double x0, double y0, double z0, double double xd = (x1-x0)/2.0f; double yd = (y1-y0)/2.0f; double zd = (z1-z0)/2.0f; - + double xc = x0+xd; double yc = y0+yd; double zc = z0+zd; @@ -135,8 +135,8 @@ bool ViewportCuller::cubeFullyInFrustum(double x0, double y0, double z0, double if (!faces[3].inFront(xc, yc, zc, r)) return false; if (!faces[4].inFront(xc, yc, zc, r)) return false; if (!faces[5].inFront(xc, yc, zc, r)) return false; - - + + if (!faces[0].fullyInFront(x0, y0, z0, x1, y1, z1)) return false; if (!faces[1].fullyInFront(x0, y0, z0, x1, y1, z1)) return false; if (!faces[2].fullyInFront(x0, y0, z0, x1, y1, z1)) return false; diff --git a/Minecraft.Client/ViewportCuller.h b/Minecraft.Client/ViewportCuller.h index 31739cb6..2a975de9 100644 --- a/Minecraft.Client/ViewportCuller.h +++ b/Minecraft.Client/ViewportCuller.h @@ -14,17 +14,17 @@ private: double cullOffs; public: Face() {} // 4J - added so we can declare an array of these (unitialised) in the class - Face(double x, double y, double z, float yRot, float xRot); + Face(double x, double y, double z, float yRot, float xRot); bool inFront(double x, double y, double z, double r); bool inFront(double x0, double y0, double z0, double x1, double y1, double z1); - bool fullyInFront(double x0, double y0, double z0, double x1, double y1, double z1); + bool fullyInFront(double x0, double y0, double z0, double x1, double y1, double z1); }; private: Face faces[6]; double xOff, yOff, zOff; public: - ViewportCuller(std::shared_ptr mob, double fogDistance, float a); + ViewportCuller(shared_ptr mob, double fogDistance, float a); virtual bool isVisible(AABB bb); virtual bool cubeInFrustum(double x0, double y0, double z0, double x1, double y1, double z1); virtual bool cubeFullyInFrustum(double x0, double y0, double z0, double x1, double y1, double z1); diff --git a/Minecraft.Client/VillagerGolemModel.cpp b/Minecraft.Client/VillagerGolemModel.cpp index 5e3b4730..aaeabd53 100644 --- a/Minecraft.Client/VillagerGolemModel.cpp +++ b/Minecraft.Client/VillagerGolemModel.cpp @@ -36,7 +36,7 @@ VillagerGolemModel::VillagerGolemModel(float g, float yOffset) leg1->addBox(-3.5f, -3, -3, 6, 16, 5, g); } -void VillagerGolemModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void VillagerGolemModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); @@ -59,9 +59,9 @@ void VillagerGolemModel::setupAnim(float time, float r, float bob, float yRot, f leg1->yRot = 0; } -void VillagerGolemModel::prepareMobModel(std::shared_ptr mob, float time, float r, float a) +void VillagerGolemModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { - std::shared_ptr vg = dynamic_pointer_cast(mob); + shared_ptr vg = dynamic_pointer_cast(mob); int attackTick = vg->getAttackAnimationTick(); if (attackTick > 0) { diff --git a/Minecraft.Client/VillagerGolemModel.h b/Minecraft.Client/VillagerGolemModel.h index 80c822d5..83e73616 100644 --- a/Minecraft.Client/VillagerGolemModel.h +++ b/Minecraft.Client/VillagerGolemModel.h @@ -21,9 +21,9 @@ public: VillagerGolemModel(float g = 0.0f, float yOffset = -7.0f); - void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); - void prepareMobModel(std::shared_ptr mob, float time, float r, float a); + void prepareMobModel(shared_ptr mob, float time, float r, float a); private: float triangleWave(float bob, float period); diff --git a/Minecraft.Client/VillagerGolemRenderer.cpp b/Minecraft.Client/VillagerGolemRenderer.cpp index dd7396e6..f03cea4c 100644 --- a/Minecraft.Client/VillagerGolemRenderer.cpp +++ b/Minecraft.Client/VillagerGolemRenderer.cpp @@ -15,16 +15,16 @@ int VillagerGolemRenderer::prepareArmor(VillagerGolemModel *villagerGolem, int l return -1; } -void VillagerGolemRenderer::render(std::shared_ptr mob, double x, double y, double z, float rot, float a) +void VillagerGolemRenderer::render(shared_ptr mob, double x, double y, double z, float rot, float a) { MobRenderer::render(mob, x, y, z, rot, a); } -void VillagerGolemRenderer::setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a) +void VillagerGolemRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { - // 4J - original version used generics and thus had an input parameter of type Blaze rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); MobRenderer::setupRotations(mob, bob, bodyRot, a); if (mob->walkAnimSpeed < 0.01) return; @@ -34,11 +34,11 @@ void VillagerGolemRenderer::setupRotations(std::shared_ptr _mob, float bob, glRotatef(6.5f * triangleWave, 0, 0, 1); } -void VillagerGolemRenderer::additionalRendering(std::shared_ptr _mob, float a) +void VillagerGolemRenderer::additionalRendering(shared_ptr _mob, float a) { - // 4J - original version used generics and thus had an input parameter of type Blaze rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); MobRenderer::additionalRendering(mob, a); if (mob->getOfferFlowerTick() == 0) return; diff --git a/Minecraft.Client/VillagerGolemRenderer.h b/Minecraft.Client/VillagerGolemRenderer.h index 185e38d4..4bc3fd9c 100644 --- a/Minecraft.Client/VillagerGolemRenderer.h +++ b/Minecraft.Client/VillagerGolemRenderer.h @@ -16,9 +16,9 @@ protected: int prepareArmor(VillagerGolemModel *villagerGolem, int layer, float a); public: - void render(std::shared_ptr mob, double x, double y, double z, float rot, float a); + void render(shared_ptr mob, double x, double y, double z, float rot, float a); protected: - void setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a); - void additionalRendering(std::shared_ptr mob, float a); + void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + void additionalRendering(shared_ptr mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/VillagerModel.cpp b/Minecraft.Client/VillagerModel.cpp index 72e6ea3a..8885484d 100644 --- a/Minecraft.Client/VillagerModel.cpp +++ b/Minecraft.Client/VillagerModel.cpp @@ -55,7 +55,7 @@ VillagerModel::VillagerModel(float g, float yOffset) : Model() _init(g,yOffset); } -void VillagerModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void VillagerModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { setupAnim(time, r, bob, yRot, xRot, scale); @@ -70,11 +70,11 @@ void VillagerModel::setupAnim(float time, float r, float bob, float yRot, float { head->yRot = yRot / (float) (180 / PI); head->xRot = xRot / (float) (180 / PI); - + arms->y = 3; arms->z = -1; arms->xRot = -0.75f; - + leg0->xRot = ((float) Mth::cos(time * 0.6662f) * 1.4f) * r * 0.5f; leg1->xRot = ((float) Mth::cos(time * 0.6662f + PI) * 1.4f) * r * 0.5f; leg0->yRot = 0; diff --git a/Minecraft.Client/VillagerModel.h b/Minecraft.Client/VillagerModel.h index 07a301c4..24c8b858 100644 --- a/Minecraft.Client/VillagerModel.h +++ b/Minecraft.Client/VillagerModel.h @@ -2,7 +2,7 @@ #pragma once #include "Model.h" -class VillagerModel : public Model +class VillagerModel : public Model { public: ModelPart *head, *body, *arms, *leg0, *leg1; @@ -10,6 +10,6 @@ public: void _init(float g, float yOffset); // 4J added VillagerModel(float g, float yOffset); VillagerModel(float g); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) ; + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) ; virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; diff --git a/Minecraft.Client/VillagerRenderer.cpp b/Minecraft.Client/VillagerRenderer.cpp index bb31caa5..b4c88173 100644 --- a/Minecraft.Client/VillagerRenderer.cpp +++ b/Minecraft.Client/VillagerRenderer.cpp @@ -8,30 +8,30 @@ VillagerRenderer::VillagerRenderer() : MobRenderer(new VillagerModel(0), 0.5f) villagerModel = (VillagerModel *) model; } -int VillagerRenderer::prepareArmor(std::shared_ptr villager, int layer, float a) +int VillagerRenderer::prepareArmor(shared_ptr villager, int layer, float a) { return -1; } -void VillagerRenderer::render(std::shared_ptr mob, double x, double y, double z, float rot, float a) +void VillagerRenderer::render(shared_ptr mob, double x, double y, double z, float rot, float a) { MobRenderer::render(mob, x, y, z, rot, a); } -void VillagerRenderer::renderName(std::shared_ptr mob, double x, double y, double z) +void VillagerRenderer::renderName(shared_ptr mob, double x, double y, double z) { } -void VillagerRenderer::additionalRendering(std::shared_ptr mob, float a) +void VillagerRenderer::additionalRendering(shared_ptr mob, float a) { MobRenderer::additionalRendering(mob, a); } -void VillagerRenderer::scale(std::shared_ptr _mob, float a) +void VillagerRenderer::scale(shared_ptr _mob, float a) { - // 4J - original version used generics and thus had an input parameter of type Blaze rather than std::shared_ptr we have here - + // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - // do some casting around instead - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); float s = 15 / 16.0f; if (mob->getAge() < 0) { diff --git a/Minecraft.Client/VillagerRenderer.h b/Minecraft.Client/VillagerRenderer.h index 1263f485..21c2a631 100644 --- a/Minecraft.Client/VillagerRenderer.h +++ b/Minecraft.Client/VillagerRenderer.h @@ -13,13 +13,13 @@ public: VillagerRenderer(); protected: - virtual int prepareArmor(std::shared_ptr villager, int layer, float a); + virtual int prepareArmor(shared_ptr villager, int layer, float a); public: - virtual void render(std::shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); protected: - virtual void renderName(std::shared_ptr mob, double x, double y, double z); - virtual void additionalRendering(std::shared_ptr mob, float a); - virtual void scale(std::shared_ptr player, float a); + virtual void renderName(shared_ptr mob, double x, double y, double z); + virtual void additionalRendering(shared_ptr mob, float a); + virtual void scale(shared_ptr player, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/WolfModel.cpp b/Minecraft.Client/WolfModel.cpp index 18dd96cf..f4835ec3 100644 --- a/Minecraft.Client/WolfModel.cpp +++ b/Minecraft.Client/WolfModel.cpp @@ -57,12 +57,12 @@ WolfModel::WolfModel() tail->compile(1.0f/16.0f); } -void WolfModel::render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +void WolfModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { Model::render(entity, time, r, bob, yRot, xRot, scale, usecompiled); setupAnim(time, r, bob, yRot, xRot, scale); - if (young) + if (young) { float ss = 2; glPushMatrix(); @@ -80,8 +80,8 @@ void WolfModel::render(std::shared_ptr entity, float time, float r, floa tail->renderRollable(scale, usecompiled); upperBody->render(scale, usecompiled); glPopMatrix(); - } - else + } + else { head->renderRollable(scale, usecompiled); body->render(scale, usecompiled); @@ -94,9 +94,9 @@ void WolfModel::render(std::shared_ptr entity, float time, float r, floa } } -void WolfModel::prepareMobModel(std::shared_ptr mob, float time, float r, float a) +void WolfModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { - std::shared_ptr wolf = dynamic_pointer_cast(mob); + shared_ptr wolf = dynamic_pointer_cast(mob); if (wolf->isAngry()) { diff --git a/Minecraft.Client/WolfModel.h b/Minecraft.Client/WolfModel.h index 6fb5fb6f..ab26a9e8 100644 --- a/Minecraft.Client/WolfModel.h +++ b/Minecraft.Client/WolfModel.h @@ -15,7 +15,7 @@ private: static const int legSize = 8; public: WolfModel(); - virtual void render(std::shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - void prepareMobModel(std::shared_ptr mob, float time, float r, float a); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + void prepareMobModel(shared_ptr mob, float time, float r, float a); virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/WolfRenderer.cpp b/Minecraft.Client/WolfRenderer.cpp index 96b3ee7e..a21affa2 100644 --- a/Minecraft.Client/WolfRenderer.cpp +++ b/Minecraft.Client/WolfRenderer.cpp @@ -8,19 +8,19 @@ WolfRenderer::WolfRenderer(Model *model, Model *armor, float shadow) : MobRender setArmor(armor); } -float WolfRenderer::getBob(std::shared_ptr _mob, float a) +float WolfRenderer::getBob(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); return mob->getTailAngle(); } -int WolfRenderer::prepareArmor(std::shared_ptr mob, int layer, float a) +int WolfRenderer::prepareArmor(shared_ptr mob, int layer, float a) { if (mob->isInvisibleTo(Minecraft::GetInstance()->player)) return -1; // 4J-JEV: Todo, merge with java fix in '1.7.5'. - std::shared_ptr wolf = dynamic_pointer_cast(mob); + shared_ptr wolf = dynamic_pointer_cast(mob); if (layer == 0 && wolf->isWet()) { float brightness = wolf->getBrightness(a) * wolf->getWetShade(a); diff --git a/Minecraft.Client/WolfRenderer.h b/Minecraft.Client/WolfRenderer.h index 218951c9..9cdf8caa 100644 --- a/Minecraft.Client/WolfRenderer.h +++ b/Minecraft.Client/WolfRenderer.h @@ -6,6 +6,6 @@ class WolfRenderer : public MobRenderer public: WolfRenderer(Model *model, Model *armor, float shadow); protected: - virtual float getBob(std::shared_ptr _mob, float a); - virtual int prepareArmor(std::shared_ptr mob, int layer, float a); + virtual float getBob(shared_ptr _mob, float a); + virtual int prepareArmor(shared_ptr mob, int layer, float a); }; diff --git a/Minecraft.Client/Xbox/Audio/SoundEngine.cpp b/Minecraft.Client/Xbox/Audio/SoundEngine.cpp index e7e2dded..b088150c 100644 --- a/Minecraft.Client/Xbox/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Xbox/Audio/SoundEngine.cpp @@ -327,7 +327,7 @@ void SoundEngine::CreateStreamingWavebank(const char *pchName, IXACT3WaveBank ** HANDLE file = CreateFile(pchName, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, NULL); if( file == INVALID_HANDLE_VALUE ) - { + { app.FatalLoadError(); assert(false); return; @@ -638,7 +638,7 @@ void SoundEngine::playUI(int iSound, float, float) void SoundEngine::playStreaming(const wstring& name, float x, float y, float z, float vol, float pitch, bool bMusicDelay) { IXACT3SoundBank *pSoundBank=NULL; - + bool bSoundBank2=false; MemSect(34); if(m_MusicInfo.pCue!=NULL) @@ -747,7 +747,7 @@ void SoundEngine::playStreaming(const wstring& name, float x, float y, float z, MemSect(0); return; } - + if(GetIsPlayingStreamingCDMusic()) { @@ -984,7 +984,7 @@ void SoundEngine::update3DPosition(SoundEngine::soundInfo *pInfo, bool bPlaceEmi XACT3DApply( &m_DSPSettings, pInfo->pCue); } -void SoundEngine::tick(std::shared_ptr *players, float a) +void SoundEngine::tick(shared_ptr *players, float a) { if( m_pXACT3Engine == NULL ) return; diff --git a/Minecraft.Client/Xbox/Audio/SoundEngine.h b/Minecraft.Client/Xbox/Audio/SoundEngine.h index 4dc398b5..e2f22869 100644 --- a/Minecraft.Client/Xbox/Audio/SoundEngine.h +++ b/Minecraft.Client/Xbox/Audio/SoundEngine.h @@ -86,7 +86,7 @@ public: virtual void updateSystemMusicPlaying(bool isPlaying); virtual void updateSoundEffectVolume(float fVal); virtual void init(Options *); - virtual void tick(std::shared_ptr *players, float a); // 4J - updated to take array of local players rather than single one + 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); @@ -107,4 +107,4 @@ private: #ifndef __PS3__ static void XACTNotificationCallback( const XACT_NOTIFICATION* pNotification ); #endif // __PS3__ -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/Minecraft.Client/ZombieRenderer.cpp b/Minecraft.Client/ZombieRenderer.cpp index b2125701..5408736d 100644 --- a/Minecraft.Client/ZombieRenderer.cpp +++ b/Minecraft.Client/ZombieRenderer.cpp @@ -34,28 +34,28 @@ void ZombieRenderer::createArmorParts() villagerArmorParts2 = new VillagerZombieModel(0.5f, 0, true); } -int ZombieRenderer::prepareArmor(std::shared_ptr _mob, int layer, float a) +int ZombieRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); swapArmor(mob); return HumanoidMobRenderer::prepareArmor(_mob, layer, a); } -void ZombieRenderer::render(std::shared_ptr _mob, double x, double y, double z, float rot, float a) +void ZombieRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); swapArmor(mob); HumanoidMobRenderer::render(_mob, x, y, z, rot, a); } -void ZombieRenderer::additionalRendering(std::shared_ptr _mob, float a) +void ZombieRenderer::additionalRendering(shared_ptr _mob, float a) { - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); swapArmor(mob); HumanoidMobRenderer::additionalRendering(_mob, a); } -void ZombieRenderer::swapArmor(std::shared_ptr mob) +void ZombieRenderer::swapArmor(shared_ptr mob) { if (mob->isVillager()) { @@ -80,9 +80,9 @@ void ZombieRenderer::swapArmor(std::shared_ptr mob) humanoidModel = (HumanoidModel *) model; } -void ZombieRenderer::setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a) +void ZombieRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { - std::shared_ptr mob = dynamic_pointer_cast(_mob); + shared_ptr mob = dynamic_pointer_cast(_mob); if (mob->isConverting()) { bodyRot += (float) (cos(mob->tickCount * 3.25) * PI * .25f); diff --git a/Minecraft.Client/ZombieRenderer.h b/Minecraft.Client/ZombieRenderer.h index b727659a..e070cc7b 100644 --- a/Minecraft.Client/ZombieRenderer.h +++ b/Minecraft.Client/ZombieRenderer.h @@ -25,17 +25,17 @@ public: protected: void createArmorParts(); - int prepareArmor(std::shared_ptr _mob, int layer, float a); + int prepareArmor(shared_ptr _mob, int layer, float a); public: - void render(std::shared_ptr _mob, double x, double y, double z, float rot, float a); + void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - void additionalRendering(std::shared_ptr _mob, float a); + void additionalRendering(shared_ptr _mob, float a); private: - void swapArmor(std::shared_ptr mob); + void swapArmor(shared_ptr mob); protected: - void setupRotations(std::shared_ptr _mob, float bob, float bodyRot, float a); + void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); }; \ No newline at end of file diff --git a/Minecraft.World/AbstractContainerMenu.cpp b/Minecraft.World/AbstractContainerMenu.cpp index dcef1d46..71d30feb 100644 --- a/Minecraft.World/AbstractContainerMenu.cpp +++ b/Minecraft.World/AbstractContainerMenu.cpp @@ -8,7 +8,7 @@ // TODO Make sure all derived classes also call this AbstractContainerMenu::AbstractContainerMenu() { - lastSlots = new vector >(); + lastSlots = new vector >(); slots = new vector(); containerId = 0; @@ -49,15 +49,15 @@ void AbstractContainerMenu::addSlotListener(ContainerListener *listener) containerListeners->push_back(listener); - vector > *items = getItems(); + vector > *items = getItems(); listener->refreshContainer(this, items); delete items; broadcastChanges(); } -vector > *AbstractContainerMenu::getItems() +vector > *AbstractContainerMenu::getItems() { - vector > *items = new vector >(); + vector > *items = new vector >(); AUTO_VAR(itEnd, slots->end()); for (AUTO_VAR(it, slots->begin()); it != itEnd; it++) { @@ -79,8 +79,8 @@ void AbstractContainerMenu::broadcastChanges() { for (unsigned int i = 0; i < slots->size(); i++) { - std::shared_ptr current = slots->at(i)->getItem(); - std::shared_ptr expected = lastSlots->at(i); + shared_ptr current = slots->at(i)->getItem(); + shared_ptr expected = lastSlots->at(i); if (!ItemInstance::matches(expected, current)) { expected = current == NULL ? nullptr : current->copy(); @@ -103,8 +103,8 @@ bool AbstractContainerMenu::needsRendered() for (unsigned int i = 0; i < slots->size(); i++) { - std::shared_ptr current = slots->at(i)->getItem(); - std::shared_ptr expected = lastSlots->at(i); + shared_ptr current = slots->at(i)->getItem(); + shared_ptr expected = lastSlots->at(i); if (!ItemInstance::matches(expected, current)) { expected = current == NULL ? nullptr : current->copy(); @@ -116,12 +116,12 @@ bool AbstractContainerMenu::needsRendered() return needsRendered; } -bool AbstractContainerMenu::clickMenuButton(std::shared_ptr player, int buttonId) +bool AbstractContainerMenu::clickMenuButton(shared_ptr player, int buttonId) { return false; } -Slot *AbstractContainerMenu::getSlotFor(std::shared_ptr c, int index) +Slot *AbstractContainerMenu::getSlotFor(shared_ptr c, int index) { AUTO_VAR(itEnd, slots->end()); for (AUTO_VAR(it, slots->begin()); it != itEnd; it++) @@ -140,7 +140,7 @@ Slot *AbstractContainerMenu::getSlot(int index) return slots->at(index); } -std::shared_ptr AbstractContainerMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr AbstractContainerMenu::quickMoveStack(shared_ptr player, int slotIndex) { Slot *slot = slots->at(slotIndex); if (slot != NULL) @@ -150,10 +150,10 @@ std::shared_ptr AbstractContainerMenu::quickMoveStack(std::shared_ return nullptr; } -std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, std::shared_ptr player) +shared_ptr AbstractContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) { - std::shared_ptr clickedEntity = nullptr; - std::shared_ptr inventory = player->inventory; + shared_ptr clickedEntity = nullptr; + shared_ptr inventory = player->inventory; if ((clickType == CLICK_PICKUP || clickType == CLICK_QUICK_MOVE) && (buttonNum == 0 || buttonNum == 1)) { @@ -182,7 +182,7 @@ std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int Slot *slot = slots->at(slotIndex); if(slot != NULL && slot->mayPickup(player)) { - std::shared_ptr piiClicked = quickMoveStack(player, slotIndex); + shared_ptr piiClicked = quickMoveStack(player, slotIndex); if (piiClicked != NULL) { //int oldSize = piiClicked->count; // 4J - Commented 1.8.2 and replaced with below @@ -208,8 +208,8 @@ std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int Slot *slot = slots->at(slotIndex); if (slot != NULL) { - std::shared_ptr clicked = slot->getItem(); - std::shared_ptr carried = inventory->getCarried(); + shared_ptr clicked = slot->getItem(); + shared_ptr carried = inventory->getCarried(); if (clicked != NULL) { @@ -235,7 +235,7 @@ std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int // 4J Added for dyable armour and combinining damaged items else if (buttonNum == 1 && mayCombine(slot, carried)) { - std::shared_ptr combined = slot->combine(carried); + shared_ptr combined = slot->combine(carried); if(combined != NULL) { slot->set(combined); @@ -252,7 +252,7 @@ std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int { // pick up to empty hand int c = buttonNum == 0 ? clicked->count : (clicked->count + 1) / 2; - std::shared_ptr removed = slot->remove(c); + shared_ptr removed = slot->remove(c); inventory->setCarried(removed); if (clicked->count == 0) @@ -321,7 +321,7 @@ std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int Slot *slot = slots->at(slotIndex); if (slot->mayPickup(player)) { - std::shared_ptr current = inventory->getItem(buttonNum); + shared_ptr current = inventory->getItem(buttonNum); bool canMove = current == NULL || (slot->container == inventory && slot->mayPlace(current)); int freeSlot = -1; @@ -333,7 +333,7 @@ std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int if (slot->hasItem() && canMove) { - std::shared_ptr taking = slot->getItem(); + shared_ptr taking = slot->getItem(); inventory->setItem(buttonNum, taking); if ((slot->container == inventory && slot->mayPlace(current)) || current == NULL) @@ -362,7 +362,7 @@ std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int Slot *slot = slots->at(slotIndex); if (slot != NULL && slot->hasItem()) { - std::shared_ptr copy = slot->getItem()->copy(); + shared_ptr copy = slot->getItem()->copy(); copy->count = copy->getMaxStackSize(); inventory->setCarried(copy); } @@ -371,19 +371,19 @@ std::shared_ptr AbstractContainerMenu::clicked(int slotIndex, int } // 4J Stu - Brought forward from 1.2 to fix infinite recursion bug in creative -void AbstractContainerMenu::loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, std::shared_ptr player) +void AbstractContainerMenu::loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, shared_ptr player) { clicked(slotIndex, buttonNum, CLICK_QUICK_MOVE, player); } -bool AbstractContainerMenu::mayCombine(Slot *slot, std::shared_ptr item) +bool AbstractContainerMenu::mayCombine(Slot *slot, shared_ptr item) { return false; } -void AbstractContainerMenu::removed(std::shared_ptr player) +void AbstractContainerMenu::removed(shared_ptr player) { - std::shared_ptr inventory = player->inventory; + shared_ptr inventory = player->inventory; if (inventory->getCarried() != NULL) { player->drop(inventory->getCarried()); @@ -391,7 +391,7 @@ void AbstractContainerMenu::removed(std::shared_ptr player) } } -void AbstractContainerMenu::slotsChanged()// 4J used to take a std::shared_ptr but wasn't using it, so removed to simplify things +void AbstractContainerMenu::slotsChanged()// 4J used to take a shared_ptr but wasn't using it, so removed to simplify things { broadcastChanges(); } @@ -401,14 +401,14 @@ bool AbstractContainerMenu::isPauseScreen() return false; } -void AbstractContainerMenu::setItem(unsigned int slot, std::shared_ptr item) +void AbstractContainerMenu::setItem(unsigned int slot, shared_ptr item) { getSlot(slot)->set(item); } void AbstractContainerMenu::setAll(ItemInstanceArray *items) { - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items->length; i++) { getSlot(i)->set( (*items)[i] ); } @@ -418,18 +418,18 @@ void AbstractContainerMenu::setData(int id, int value) { } -short AbstractContainerMenu::backup(std::shared_ptr inventory) +short AbstractContainerMenu::backup(shared_ptr inventory) { changeUid++; return changeUid; } -bool AbstractContainerMenu::isSynched(std::shared_ptr player) +bool AbstractContainerMenu::isSynched(shared_ptr player) { return !(unSynchedPlayers.find(player) != unSynchedPlayers.end()); } -void AbstractContainerMenu::setSynched(std::shared_ptr player, bool synched) +void AbstractContainerMenu::setSynched(shared_ptr player, bool synched) { if (synched) { @@ -444,7 +444,7 @@ void AbstractContainerMenu::setSynched(std::shared_ptr player, bool sync } // 4J Stu - Brought a few changes in this function forward from 1.2 to make it return a bool -bool AbstractContainerMenu::moveItemStackTo(std::shared_ptr itemStack, int startSlot, int endSlot, bool backwards) +bool AbstractContainerMenu::moveItemStackTo(shared_ptr itemStack, int startSlot, int endSlot, bool backwards) { bool anythingChanged = false; @@ -461,7 +461,7 @@ bool AbstractContainerMenu::moveItemStackTo(std::shared_ptr itemSt { Slot *slot = slots->at(destSlot); - std::shared_ptr target = slot->getItem(); + shared_ptr target = slot->getItem(); if (target != NULL && target->id == itemStack->id && (!itemStack->isStackedByData() || itemStack->getAuxValue() == target->getAuxValue()) && ItemInstance::tagMatches(itemStack, target) ) { @@ -507,7 +507,7 @@ bool AbstractContainerMenu::moveItemStackTo(std::shared_ptr itemSt while ((!backwards && destSlot < endSlot) || (backwards && destSlot >= startSlot)) { Slot *slot = slots->at(destSlot); - std::shared_ptr target = slot->getItem(); + shared_ptr target = slot->getItem(); if (target == NULL) { diff --git a/Minecraft.World/AbstractContainerMenu.h b/Minecraft.World/AbstractContainerMenu.h index 0875d65c..f34e1afc 100644 --- a/Minecraft.World/AbstractContainerMenu.h +++ b/Minecraft.World/AbstractContainerMenu.h @@ -26,7 +26,7 @@ public: static const int CONTAINER_ID_INVENTORY = 0; static const int CONTAINER_ID_CREATIVE = -2; - vector > *lastSlots; + vector > *lastSlots; vector *slots; int containerId; @@ -46,34 +46,34 @@ protected: public: virtual ~AbstractContainerMenu(); virtual void addSlotListener(ContainerListener *listener); - vector > *getItems(); + vector > *getItems(); void sendData(int id, int value); virtual void broadcastChanges(); virtual bool needsRendered(); - virtual bool clickMenuButton(std::shared_ptr player, int buttonId); - Slot *getSlotFor(std::shared_ptr c, int index); + virtual bool clickMenuButton(shared_ptr player, int buttonId); + Slot *getSlotFor(shared_ptr c, int index); Slot *getSlot(int index); - virtual std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); - virtual std::shared_ptr clicked(int slotIndex, int buttonNum, int clickType, std::shared_ptr player); - virtual bool mayCombine(Slot *slot, std::shared_ptr item); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); + virtual bool mayCombine(Slot *slot, shared_ptr item); protected: - virtual void loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, std::shared_ptr player); + virtual void loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, shared_ptr player); public: - virtual void removed(std::shared_ptr player); - virtual void slotsChanged();// 4J used to take a std::shared_ptr container but wasn't using it, so removed to simplify things + virtual void removed(shared_ptr player); + virtual void slotsChanged();// 4J used to take a shared_ptr container but wasn't using it, so removed to simplify things bool isPauseScreen(); - void setItem(unsigned int slot, std::shared_ptr item); + void setItem(unsigned int slot, shared_ptr item); void setAll(ItemInstanceArray *items); virtual void setData(int id, int value); - short backup(std::shared_ptr inventory); + short backup(shared_ptr inventory); private: - unordered_set , PlayerKeyHash, PlayerKeyEq> unSynchedPlayers; + unordered_set , PlayerKeyHash, PlayerKeyEq> unSynchedPlayers; public: - bool isSynched(std::shared_ptr player); - void setSynched(std::shared_ptr player, bool synched); - virtual bool stillValid(std::shared_ptr player) = 0; + bool isSynched(shared_ptr player); + void setSynched(shared_ptr player, bool synched); + virtual bool stillValid(shared_ptr player) = 0; // 4J Stu Added for UI unsigned int getSize() { return (unsigned int)slots->size(); } @@ -81,7 +81,7 @@ public: protected: // 4J Stu - Changes to return bool brought forward from 1.2 - bool moveItemStackTo(std::shared_ptr itemStack, int startSlot, int endSlot, bool backwards); + bool moveItemStackTo(shared_ptr itemStack, int startSlot, int endSlot, bool backwards); public: virtual bool isOverrideResultClick(int slotNum, int buttonNum); diff --git a/Minecraft.World/Achievement.cpp b/Minecraft.World/Achievement.cpp index 23f54c12..a0dfd533 100644 --- a/Minecraft.World/Achievement.cpp +++ b/Minecraft.World/Achievement.cpp @@ -25,7 +25,7 @@ Achievement::Achievement(int id, const wstring& name, int x, int y, Tile *icon, { } -Achievement::Achievement(int id, const wstring& name, int x, int y, std::shared_ptr icon, Achievement *requires) +Achievement::Achievement(int id, const wstring& name, int x, int y, shared_ptr icon, Achievement *requires) : Stat( Achievements::ACHIEVEMENT_OFFSET + id, I18n::get(wstring(L"achievement.").append(name)) ), desc( I18n::get(wstring(L"achievement.").append(name).append(L".desc"))), icon(icon), x(x), y(y), requires(requires) { } @@ -36,7 +36,7 @@ Achievement *Achievement::setAwardLocallyOnly() return this; } -Achievement *Achievement::setGolden() +Achievement *Achievement::setGolden() { isGoldenVar = true; return this; @@ -51,14 +51,14 @@ Achievement *Achievement::postConstruct() return this; } -bool Achievement::isAchievement() +bool Achievement::isAchievement() { return true; } -wstring Achievement::getDescription() +wstring Achievement::getDescription() { - if (descFormatter != NULL) + if (descFormatter != NULL) { return descFormatter->format(desc); } diff --git a/Minecraft.World/Achievement.h b/Minecraft.World/Achievement.h index 71487392..b39c44b3 100644 --- a/Minecraft.World/Achievement.h +++ b/Minecraft.World/Achievement.h @@ -11,12 +11,12 @@ public: const int x, y; Achievement *requires; -private: +private: const wstring desc; DescFormatter *descFormatter; public: - const std::shared_ptr icon; + const shared_ptr icon; private: bool isGoldenVar; @@ -25,7 +25,7 @@ private: public: Achievement(int id, const wstring& name, int x, int y, Item *icon, Achievement *requires); Achievement(int id, const wstring& name, int x, int y, Tile *icon, Achievement *requires); - Achievement(int id, const wstring& name, int x, int y, std::shared_ptr icon, Achievement *requires); + Achievement(int id, const wstring& name, int x, int y, shared_ptr icon, Achievement *requires); Achievement *setAwardLocallyOnly(); Achievement *setGolden(); diff --git a/Minecraft.World/AddEntityPacket.cpp b/Minecraft.World/AddEntityPacket.cpp index 9263bfda..6231537d 100644 --- a/Minecraft.World/AddEntityPacket.cpp +++ b/Minecraft.World/AddEntityPacket.cpp @@ -8,7 +8,7 @@ -void AddEntityPacket::_init(std::shared_ptr e, int type, int data, int xp, int yp, int zp, int yRotp, int xRotp) +void AddEntityPacket::_init(shared_ptr e, int type, int data, int xp, int yp, int zp, int yRotp, int xRotp) { id = e->entityId; // 4J Stu - We should add entities at their "last sent" position so that the relative update packets @@ -38,16 +38,16 @@ void AddEntityPacket::_init(std::shared_ptr e, int type, int data, int x } } -AddEntityPacket::AddEntityPacket() +AddEntityPacket::AddEntityPacket() { } -AddEntityPacket::AddEntityPacket(std::shared_ptr e, int type, int yRotp, int xRotp, int xp, int yp, int zp ) +AddEntityPacket::AddEntityPacket(shared_ptr e, int type, int yRotp, int xRotp, int xp, int yp, int zp ) { _init(e, type, -1, xp, yp, zp, yRotp, xRotp); // 4J - changed "no data" value to be -1, we can have a valid entity id of 0 } -AddEntityPacket::AddEntityPacket(std::shared_ptr e, int type, int data, int yRotp, int xRotp, int xp, int yp, int zp ) +AddEntityPacket::AddEntityPacket(shared_ptr e, int type, int data, int yRotp, int xRotp, int xp, int yp, int zp ) { _init(e, type, data, xp, yp, zp, yRotp, xRotp); } @@ -100,12 +100,12 @@ void AddEntityPacket::write(DataOutputStream *dos) // throws IOException TODO 4J } } -void AddEntityPacket::handle(PacketListener *listener) +void AddEntityPacket::handle(PacketListener *listener) { listener->handleAddEntity(shared_from_this()); } -int AddEntityPacket::getEstimatedSize() +int AddEntityPacket::getEstimatedSize() { return 11 + data > -1 ? 6 : 0; } diff --git a/Minecraft.World/AddEntityPacket.h b/Minecraft.World/AddEntityPacket.h index 57b813e9..5ac7286c 100644 --- a/Minecraft.World/AddEntityPacket.h +++ b/Minecraft.World/AddEntityPacket.h @@ -40,12 +40,12 @@ public: byte yRot,xRot; // 4J added private: - void _init(std::shared_ptr e, int type, int data, int xp, int yp, int zp, int yRotp, int xRotp ); + void _init(shared_ptr e, int type, int data, int xp, int yp, int zp, int yRotp, int xRotp ); public: AddEntityPacket(); - AddEntityPacket(std::shared_ptr e, int type, int yRotp, int xRotp, int xp, int yp, int zp); - AddEntityPacket(std::shared_ptr e, int type, int data, int yRotp, int xRotp, int xp, int yp, int zp ); + AddEntityPacket(shared_ptr e, int type, int yRotp, int xRotp, int xp, int yp, int zp); + AddEntityPacket(shared_ptr e, int type, int data, int yRotp, int xRotp, int xp, int yp, int zp ); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); @@ -53,6 +53,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new AddEntityPacket()); } + static shared_ptr create() { return shared_ptr(new AddEntityPacket()); } virtual int getId() { return 23; } }; \ No newline at end of file diff --git a/Minecraft.World/AddExperienceOrbPacket.cpp b/Minecraft.World/AddExperienceOrbPacket.cpp index 1d7a1f22..a1a22844 100644 --- a/Minecraft.World/AddExperienceOrbPacket.cpp +++ b/Minecraft.World/AddExperienceOrbPacket.cpp @@ -13,7 +13,7 @@ AddExperienceOrbPacket::AddExperienceOrbPacket() value = 0; } -AddExperienceOrbPacket::AddExperienceOrbPacket(std::shared_ptr e) +AddExperienceOrbPacket::AddExperienceOrbPacket(shared_ptr e) { id = e->entityId; x = Mth::floor(e->x * 32); diff --git a/Minecraft.World/AddExperienceOrbPacket.h b/Minecraft.World/AddExperienceOrbPacket.h index 33ae0642..59accfb3 100644 --- a/Minecraft.World/AddExperienceOrbPacket.h +++ b/Minecraft.World/AddExperienceOrbPacket.h @@ -12,13 +12,13 @@ public: int value; AddExperienceOrbPacket(); - AddExperienceOrbPacket(std::shared_ptr e); + AddExperienceOrbPacket(shared_ptr e); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); - static std::shared_ptr create() { return std::shared_ptr(new AddExperienceOrbPacket()); } + static shared_ptr create() { return shared_ptr(new AddExperienceOrbPacket()); } virtual int getId() { return 26; } }; \ No newline at end of file diff --git a/Minecraft.World/AddGlobalEntityPacket.cpp b/Minecraft.World/AddGlobalEntityPacket.cpp index db476433..bfb27331 100644 --- a/Minecraft.World/AddGlobalEntityPacket.cpp +++ b/Minecraft.World/AddGlobalEntityPacket.cpp @@ -20,13 +20,13 @@ AddGlobalEntityPacket::AddGlobalEntityPacket() type = 0; } -AddGlobalEntityPacket::AddGlobalEntityPacket(std::shared_ptr e) +AddGlobalEntityPacket::AddGlobalEntityPacket(shared_ptr e) { id = e->entityId; x = Mth::floor(e->x * 32); y = Mth::floor(e->y * 32); z = Mth::floor(e->z * 32); - if (dynamic_pointer_cast(e) != NULL) + if (dynamic_pointer_cast(e) != NULL) { this->type = LIGHTNING; } @@ -45,7 +45,7 @@ void AddGlobalEntityPacket::read(DataInputStream *dis) // throws IOException z = dis->readInt(); } -void AddGlobalEntityPacket::write(DataOutputStream *dos) // throws IOException +void AddGlobalEntityPacket::write(DataOutputStream *dos) // throws IOException { dos->writeInt(id); dos->writeByte(type); diff --git a/Minecraft.World/AddGlobalEntityPacket.h b/Minecraft.World/AddGlobalEntityPacket.h index 9f0f518c..80c10db2 100644 --- a/Minecraft.World/AddGlobalEntityPacket.h +++ b/Minecraft.World/AddGlobalEntityPacket.h @@ -12,7 +12,7 @@ public: int type; AddGlobalEntityPacket(); - AddGlobalEntityPacket(std::shared_ptr e); + AddGlobalEntityPacket(shared_ptr e); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); @@ -20,6 +20,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new AddGlobalEntityPacket()); } + static shared_ptr create() { return shared_ptr(new AddGlobalEntityPacket()); } virtual int getId() { return 71; } }; \ No newline at end of file diff --git a/Minecraft.World/AddIslandLayer.cpp b/Minecraft.World/AddIslandLayer.cpp index 96f762cb..a8842936 100644 --- a/Minecraft.World/AddIslandLayer.cpp +++ b/Minecraft.World/AddIslandLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.newbiome.layer.h" #include "net.minecraft.world.level.biome.h" -AddIslandLayer::AddIslandLayer(int64_t seedMixup, std::shared_ptrparent) : Layer(seedMixup) +AddIslandLayer::AddIslandLayer(int64_t seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/AddIslandLayer.h b/Minecraft.World/AddIslandLayer.h index c7de422e..2446bbf8 100644 --- a/Minecraft.World/AddIslandLayer.h +++ b/Minecraft.World/AddIslandLayer.h @@ -5,7 +5,7 @@ class AddIslandLayer : public Layer { public: - AddIslandLayer(int64_t seedMixup, std::shared_ptrparent); + AddIslandLayer(int64_t seedMixup, shared_ptrparent); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/AddMobPacket.cpp b/Minecraft.World/AddMobPacket.cpp index b6fd61ea..7e744c04 100644 --- a/Minecraft.World/AddMobPacket.cpp +++ b/Minecraft.World/AddMobPacket.cpp @@ -25,7 +25,7 @@ AddMobPacket::~AddMobPacket() delete unpack; } -AddMobPacket::AddMobPacket(std::shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp) +AddMobPacket::AddMobPacket(shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp) { id = mob->entityId; @@ -115,7 +115,7 @@ void AddMobPacket::handle(PacketListener *listener) listener->handleAddMob(shared_from_this()); } -int AddMobPacket::getEstimatedSize() +int AddMobPacket::getEstimatedSize() { int size = 11; if( entityData != NULL ) @@ -130,7 +130,7 @@ int AddMobPacket::getEstimatedSize() return size; } -vector > *AddMobPacket::getUnpackedData() +vector > *AddMobPacket::getUnpackedData() { if (unpack == NULL) { diff --git a/Minecraft.World/AddMobPacket.h b/Minecraft.World/AddMobPacket.h index bdb91e4b..37de84c3 100644 --- a/Minecraft.World/AddMobPacket.h +++ b/Minecraft.World/AddMobPacket.h @@ -16,22 +16,22 @@ public: byte yRot, xRot, yHeadRot; private: - std::shared_ptr entityData; - vector > *unpack; + shared_ptr entityData; + vector > *unpack; public: AddMobPacket(); ~AddMobPacket(); - AddMobPacket(std::shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp); + AddMobPacket(shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); - vector > *getUnpackedData(); + vector > *getUnpackedData(); public: - static std::shared_ptr create() { return std::shared_ptr(new AddMobPacket()); } + static shared_ptr create() { return shared_ptr(new AddMobPacket()); } virtual int getId() { return 24; } }; diff --git a/Minecraft.World/AddMushroomIslandLayer.cpp b/Minecraft.World/AddMushroomIslandLayer.cpp index 2166e465..324c88ee 100644 --- a/Minecraft.World/AddMushroomIslandLayer.cpp +++ b/Minecraft.World/AddMushroomIslandLayer.cpp @@ -3,7 +3,7 @@ #include "net.minecraft.world.level.biome.h" -AddMushroomIslandLayer::AddMushroomIslandLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) +AddMushroomIslandLayer::AddMushroomIslandLayer(int64_t seedMixup, shared_ptr parent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/AddMushroomIslandLayer.h b/Minecraft.World/AddMushroomIslandLayer.h index 39c6feea..f691ebda 100644 --- a/Minecraft.World/AddMushroomIslandLayer.h +++ b/Minecraft.World/AddMushroomIslandLayer.h @@ -4,6 +4,6 @@ class AddMushroomIslandLayer : public Layer { public: - AddMushroomIslandLayer(int64_t seedMixup, std::shared_ptr parent); + AddMushroomIslandLayer(int64_t seedMixup, shared_ptr parent); virtual intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/AddPaintingPacket.cpp b/Minecraft.World/AddPaintingPacket.cpp index 83fc9d67..f574cbf2 100644 --- a/Minecraft.World/AddPaintingPacket.cpp +++ b/Minecraft.World/AddPaintingPacket.cpp @@ -17,7 +17,7 @@ AddPaintingPacket::AddPaintingPacket() motive = L""; } -AddPaintingPacket::AddPaintingPacket(std::shared_ptr e) +AddPaintingPacket::AddPaintingPacket(shared_ptr e) { id = e->entityId; x = e->xTile; diff --git a/Minecraft.World/AddPaintingPacket.h b/Minecraft.World/AddPaintingPacket.h index 0a002ddb..a5694b74 100644 --- a/Minecraft.World/AddPaintingPacket.h +++ b/Minecraft.World/AddPaintingPacket.h @@ -15,13 +15,13 @@ public: public: AddPaintingPacket(); - AddPaintingPacket(std::shared_ptr e); + AddPaintingPacket(shared_ptr e); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new AddPaintingPacket()); } + static shared_ptr create() { return shared_ptr(new AddPaintingPacket()); } virtual int getId() { return 25; } }; diff --git a/Minecraft.World/AddPlayerPacket.cpp b/Minecraft.World/AddPlayerPacket.cpp index a9076fdb..f3d8a32b 100644 --- a/Minecraft.World/AddPlayerPacket.cpp +++ b/Minecraft.World/AddPlayerPacket.cpp @@ -32,7 +32,7 @@ AddPlayerPacket::~AddPlayerPacket() if(unpack != NULL) delete unpack; } -AddPlayerPacket::AddPlayerPacket(std::shared_ptr player, PlayerUID xuid, PlayerUID OnlineXuid,int xp, int yp, int zp, int yRotp, int xRotp, int yHeadRotp) +AddPlayerPacket::AddPlayerPacket(shared_ptr player, PlayerUID xuid, PlayerUID OnlineXuid,int xp, int yp, int zp, int yRotp, int xRotp, int yHeadRotp) { id = player->entityId; name = player->name; @@ -50,7 +50,7 @@ AddPlayerPacket::AddPlayerPacket(std::shared_ptr player, PlayerUID xuid, //printf("%d: New add player (%f,%f,%f) : (%d,%d,%d) : xRot %d, yRot %d\n",id,player->x,player->y,player->z,x,y,z,xRot,yRot); - std::shared_ptr itemInstance = player->inventory->getSelected(); + shared_ptr itemInstance = player->inventory->getSelected(); carriedItem = itemInstance == NULL ? 0 : itemInstance->id; this->xuid = xuid; @@ -72,14 +72,14 @@ void AddPlayerPacket::read(DataInputStream *dis) //throws IOException y = dis->readInt(); z = dis->readInt(); yRot = dis->readByte(); - xRot = dis->readByte(); + xRot = dis->readByte(); yHeadRot = dis->readByte(); // 4J Added carriedItem = dis->readShort(); xuid = dis->readPlayerUID(); OnlineXuid = dis->readPlayerUID(); m_playerIndex = dis->readByte(); INT skinId = dis->readInt(); - m_skinId = *(DWORD *)&skinId; + m_skinId = *(DWORD *)&skinId; INT capeId = dis->readInt(); m_capeId = *(DWORD *)&capeId; INT privileges = dis->readInt(); @@ -132,7 +132,7 @@ int AddPlayerPacket::getEstimatedSize() return iSize; } -vector > *AddPlayerPacket::getUnpackedData() +vector > *AddPlayerPacket::getUnpackedData() { if (unpack == NULL) { diff --git a/Minecraft.World/AddPlayerPacket.h b/Minecraft.World/AddPlayerPacket.h index 5c55c863..30f6bcdd 100644 --- a/Minecraft.World/AddPlayerPacket.h +++ b/Minecraft.World/AddPlayerPacket.h @@ -10,8 +10,8 @@ class AddPlayerPacket : public Packet, public enable_shared_from_this entityData; - vector > *unpack; + shared_ptr entityData; + vector > *unpack; public: int id; @@ -29,15 +29,15 @@ public: AddPlayerPacket(); ~AddPlayerPacket(); - AddPlayerPacket(std::shared_ptr player, PlayerUID xuid, PlayerUID OnlineXuid,int xp, int yp, int zp, int yRotp, int xRotp, int yHeadRotp); + AddPlayerPacket(shared_ptr player, PlayerUID xuid, PlayerUID OnlineXuid,int xp, int yp, int zp, int yRotp, int xRotp, int yHeadRotp); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); - vector > *getUnpackedData(); + vector > *getUnpackedData(); public: - static std::shared_ptr create() { return std::shared_ptr(new AddPlayerPacket()); } + static shared_ptr create() { return shared_ptr(new AddPlayerPacket()); } virtual int getId() { return 20; } }; diff --git a/Minecraft.World/AddSnowLayer.cpp b/Minecraft.World/AddSnowLayer.cpp index aaf41e43..aa459789 100644 --- a/Minecraft.World/AddSnowLayer.cpp +++ b/Minecraft.World/AddSnowLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.newbiome.layer.h" #include "net.minecraft.world.level.biome.h" -AddSnowLayer::AddSnowLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) +AddSnowLayer::AddSnowLayer(int64_t seedMixup, shared_ptr parent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/AddSnowLayer.h b/Minecraft.World/AddSnowLayer.h index 04009ad6..0b3702da 100644 --- a/Minecraft.World/AddSnowLayer.h +++ b/Minecraft.World/AddSnowLayer.h @@ -4,6 +4,6 @@ class AddSnowLayer : public Layer { public: - AddSnowLayer(int64_t seedMixup, std::shared_ptr parent); + AddSnowLayer(int64_t seedMixup, shared_ptr parent); virtual intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/AdminLogCommand.h b/Minecraft.World/AdminLogCommand.h index c9ab5800..26299c56 100644 --- a/Minecraft.World/AdminLogCommand.h +++ b/Minecraft.World/AdminLogCommand.h @@ -9,5 +9,5 @@ class AdminLogCommand public: static const int LOGTYPE_DONT_SHOW_TO_SELF = 1; - virtual void logAdminCommand(std::shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message = L"", int customData = -1, const wstring& additionalMessage = L"") = 0; + virtual void logAdminCommand(shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message = L"", int customData = -1, const wstring& additionalMessage = L"") = 0; }; \ No newline at end of file diff --git a/Minecraft.World/AgableMob.cpp b/Minecraft.World/AgableMob.cpp index a433076e..39bcadbe 100644 --- a/Minecraft.World/AgableMob.cpp +++ b/Minecraft.World/AgableMob.cpp @@ -13,9 +13,9 @@ AgableMob::AgableMob(Level *level) : PathfinderMob(level) registeredBBHeight = 0; } -bool AgableMob::interact(std::shared_ptr player) +bool AgableMob::interact(shared_ptr player) { - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); if (item != NULL && item->id == Item::monsterPlacer_Id) { @@ -24,7 +24,7 @@ bool AgableMob::interact(std::shared_ptr player) eINSTANCEOF classToSpawn = EntityIO::getClass(item->getAuxValue()); if (classToSpawn != eTYPE_NOTSET && (classToSpawn & eTYPE_AGABLE_MOB) == eTYPE_AGABLE_MOB && classToSpawn == GetType() ) // 4J Added GetType() check to only spawn same type { - std::shared_ptr offspring = getBreedOffspring(dynamic_pointer_cast(shared_from_this())); + shared_ptr offspring = getBreedOffspring(dynamic_pointer_cast(shared_from_this())); if (offspring != NULL) { offspring->setAge(-20 * 60 * 20); diff --git a/Minecraft.World/AgableMob.h b/Minecraft.World/AgableMob.h index f7f70ed6..0020e876 100644 --- a/Minecraft.World/AgableMob.h +++ b/Minecraft.World/AgableMob.h @@ -13,13 +13,13 @@ private: public: AgableMob(Level *level); - virtual bool interact(std::shared_ptr player); + virtual bool interact(shared_ptr player); protected: virtual void defineSynchedData(); public: - virtual std::shared_ptr getBreedOffspring(std::shared_ptr target) = 0; + virtual shared_ptr getBreedOffspring(shared_ptr target) = 0; virtual int getAge(); virtual void setAge(int age); virtual void addAdditonalSaveData(CompoundTag *tag); diff --git a/Minecraft.World/Animal.cpp b/Minecraft.World/Animal.cpp index 36cdbe37..45fc304f 100644 --- a/Minecraft.World/Animal.cpp +++ b/Minecraft.World/Animal.cpp @@ -18,7 +18,7 @@ Animal::Animal(Level *level) : AgableMob( level ) { // inLove = 0; // 4J removed - now synched data loveTime = 0; - loveCause = std::shared_ptr(); + loveCause = shared_ptr(); setDespawnProtected(); } @@ -62,7 +62,7 @@ void Animal::aiStep() updateDespawnProtectedState(); // 4J added } -void Animal::checkHurtTarget(std::shared_ptr target, float d) +void Animal::checkHurtTarget(shared_ptr target, float d) { if (dynamic_pointer_cast(target) != NULL) { @@ -75,7 +75,7 @@ void Animal::checkHurtTarget(std::shared_ptr target, float d) holdGround = true; } - std::shared_ptr p = dynamic_pointer_cast(target); + shared_ptr p = dynamic_pointer_cast(target); if (p->getSelectedItem() != NULL && this->isFood(p->getSelectedItem())) { } @@ -87,7 +87,7 @@ void Animal::checkHurtTarget(std::shared_ptr target, float d) } else if (dynamic_pointer_cast(target) != NULL) { - std::shared_ptr a = dynamic_pointer_cast(target); + shared_ptr a = dynamic_pointer_cast(target); if (getAge() > 0 && a->getAge() < 0) { if (d < 2.5) @@ -123,9 +123,9 @@ void Animal::checkHurtTarget(std::shared_ptr target, float d) } -void Animal::breedWith(std::shared_ptr target) +void Animal::breedWith(shared_ptr target) { - std::shared_ptr offspring = getBreedOffspring(target); + shared_ptr offspring = getBreedOffspring(target); setInLoveValue(0); loveTime = 0; @@ -154,7 +154,7 @@ void Animal::breedWith(std::shared_ptr target) } level->addEntity(offspring); - level->addEntity( std::shared_ptr( new ExperienceOrb(level, x, y, z, random->nextInt(4) + 1) ) ); + level->addEntity( shared_ptr( new ExperienceOrb(level, x, y, z, random->nextInt(4) + 1) ) ); } setDespawnProtected(); @@ -170,7 +170,7 @@ bool Animal::hurt(DamageSource *dmgSource, int dmg) { if (dynamic_cast(dmgSource) != NULL) { - std::shared_ptr source = dmgSource->getDirectEntity(); + shared_ptr source = dmgSource->getDirectEntity(); if (dynamic_pointer_cast(source) != NULL && !dynamic_pointer_cast(source)->isAllowedToAttackAnimals() ) { @@ -179,7 +179,7 @@ bool Animal::hurt(DamageSource *dmgSource, int dmg) if (source != NULL && source->GetType() == eTYPE_ARROW) { - std::shared_ptr arrow = dynamic_pointer_cast(source); + shared_ptr arrow = dynamic_pointer_cast(source); if (dynamic_pointer_cast(arrow->owner) != NULL && ! dynamic_pointer_cast(arrow->owner)->isAllowedToAttackAnimals() ) { return false; @@ -207,18 +207,18 @@ void Animal::readAdditionalSaveData(CompoundTag *tag) setDespawnProtected(); } -std::shared_ptr Animal::findAttackTarget() +shared_ptr Animal::findAttackTarget() { if (fleeTime > 0) return nullptr; float r = 8; if (getInLoveValue() > 0) { - vector > *others = level->getEntitiesOfClass(typeid(*this), bb->grow(r, r, r)); + vector > *others = level->getEntitiesOfClass(typeid(*this), bb->grow(r, r, r)); //for (int i = 0; i < others->size(); i++) for(AUTO_VAR(it, others->begin()); it != others->end(); ++it) { - std::shared_ptr p = dynamic_pointer_cast(*it); + shared_ptr p = dynamic_pointer_cast(*it); if (p != shared_from_this() && p->getInLoveValue() > 0) { delete others; @@ -231,13 +231,13 @@ std::shared_ptr Animal::findAttackTarget() { if (getAge() == 0) { - vector > *players = level->getEntitiesOfClass(typeid(Player), bb->grow(r, r, r)); + vector > *players = level->getEntitiesOfClass(typeid(Player), bb->grow(r, r, r)); //for (int i = 0; i < players.size(); i++) for(AUTO_VAR(it, players->begin()); it != players->end(); ++it) { setDespawnProtected(); - std::shared_ptr p = dynamic_pointer_cast(*it); + shared_ptr p = dynamic_pointer_cast(*it); if (p->getSelectedItem() != NULL && this->isFood(p->getSelectedItem())) { delete players; @@ -248,11 +248,11 @@ std::shared_ptr Animal::findAttackTarget() } else if (getAge() > 0) { - vector > *others = level->getEntitiesOfClass(typeid(*this), bb->grow(r, r, r)); - //for (int i = 0; i < others.size(); i++) + vector > *others = level->getEntitiesOfClass(typeid(*this), bb->grow(r, r, r)); + //for (int i = 0; i < others.size(); i++) for(AUTO_VAR(it, others->begin()); it != others->end(); ++it) { - std::shared_ptr p = dynamic_pointer_cast(*it); + shared_ptr p = dynamic_pointer_cast(*it); if (p != shared_from_this() && p->getAge() < 0) { delete others; @@ -283,19 +283,19 @@ bool Animal::removeWhenFarAway() return !isDespawnProtected(); // 4J changed - was false } -int Animal::getExperienceReward(std::shared_ptr killedBy) +int Animal::getExperienceReward(shared_ptr killedBy) { return 1 + level->random->nextInt(3); } -bool Animal::isFood(std::shared_ptr itemInstance) +bool Animal::isFood(shared_ptr itemInstance) { return itemInstance->id == Item::wheat_Id; } -bool Animal::interact(std::shared_ptr player) +bool Animal::interact(shared_ptr player) { - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); if (item != NULL && isFood(item) && getAge() == 0) { if (!player->abilities.instabuild) @@ -306,7 +306,7 @@ bool Animal::interact(std::shared_ptr player) player->inventory->setItem(player->inventory->selected, nullptr); } } - + // 4J-PB - If we can't produce another animal through breeding because of the spawn limits, display a message here if(!level->isClientSide) @@ -318,21 +318,21 @@ bool Animal::interact(std::shared_ptr player) { player->displayClientMessage(IDS_MAX_CHICKENS_BRED ); return false; - } + } break; case eTYPE_WOLF: if( !level->canCreateMore(eTYPE_WOLF, Level::eSpawnType_Breed) ) { player->displayClientMessage(IDS_MAX_WOLVES_BRED ); return false; - } + } break; case eTYPE_MUSHROOMCOW: if( !level->canCreateMore(eTYPE_MUSHROOMCOW, Level::eSpawnType_Breed) ) { player->displayClientMessage(IDS_MAX_MUSHROOMCOWS_BRED ); return false; - } + } break; default: if((GetType() & eTYPE_ANIMALS_SPAWN_LIMIT_CHECK) == eTYPE_ANIMALS_SPAWN_LIMIT_CHECK) @@ -380,13 +380,13 @@ void Animal::setInLoveValue(int value) } // 4J added -void Animal::setInLove(std::shared_ptr player) +void Animal::setInLove(shared_ptr player) { loveCause = player; setInLoveValue(20*30); } -std::shared_ptr Animal::getLoveCause() +shared_ptr Animal::getLoveCause() { return loveCause.lock(); } @@ -400,7 +400,7 @@ void Animal::resetLove() { entityData->set(DATA_IN_LOVE, 0); } -bool Animal::canMate(std::shared_ptr partner) +bool Animal::canMate(shared_ptr partner) { if (partner == shared_from_this()) return false; if (typeid(*partner) != typeid(*this)) return false; diff --git a/Minecraft.World/Animal.h b/Minecraft.World/Animal.h index 987b360e..8c0cda8e 100644 --- a/Minecraft.World/Animal.h +++ b/Minecraft.World/Animal.h @@ -26,10 +26,10 @@ public: virtual void aiStep(); protected: - virtual void checkHurtTarget(std::shared_ptr target, float d); + virtual void checkHurtTarget(shared_ptr target, float d); private: - virtual void breedWith(std::shared_ptr target); + virtual void breedWith(shared_ptr target); public: virtual float getWalkTargetValue(int x, int y, int z); @@ -40,7 +40,7 @@ public: virtual void readAdditionalSaveData(CompoundTag *tag); protected: - virtual std::shared_ptr findAttackTarget(); + virtual shared_ptr findAttackTarget(); public: virtual bool canSpawn(); @@ -48,22 +48,22 @@ public: protected: virtual bool removeWhenFarAway(); - virtual int getExperienceReward(std::shared_ptr killedBy); + virtual int getExperienceReward(shared_ptr killedBy); public: - virtual bool isFood(std::shared_ptr itemInstance); - virtual bool interact(std::shared_ptr player); + virtual bool isFood(shared_ptr itemInstance); + virtual bool interact(shared_ptr player); protected: int getInLoveValue(); // 4J added public: void setInLoveValue(int value); // 4J added - void setInLove(std::shared_ptr player); // 4J added, then modified to match latest Java for XboxOne achievements - std::shared_ptr getLoveCause(); + void setInLove(shared_ptr player); // 4J added, then modified to match latest Java for XboxOne achievements + shared_ptr getLoveCause(); bool isInLove(); void resetLove(); - virtual bool canMate(std::shared_ptr partner); + virtual bool canMate(shared_ptr partner); // 4J added for determining whether animals are enclosed or not private: diff --git a/Minecraft.World/AnimatePacket.cpp b/Minecraft.World/AnimatePacket.cpp index 4a2823fa..2ca4ed49 100644 --- a/Minecraft.World/AnimatePacket.cpp +++ b/Minecraft.World/AnimatePacket.cpp @@ -13,30 +13,30 @@ AnimatePacket::AnimatePacket() action = 0; } -AnimatePacket::AnimatePacket(std::shared_ptr e, int action) +AnimatePacket::AnimatePacket(shared_ptr e, int action) { id = e->entityId; this->action = action; } -void AnimatePacket::read(DataInputStream *dis) //throws IOException +void AnimatePacket::read(DataInputStream *dis) //throws IOException { id = dis->readInt(); action = dis->readByte(); } -void AnimatePacket::write(DataOutputStream *dos) //throws IOException +void AnimatePacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(id); dos->writeByte(action); } -void AnimatePacket::handle(PacketListener *listener) +void AnimatePacket::handle(PacketListener *listener) { listener->handleAnimate(shared_from_this()); } -int AnimatePacket::getEstimatedSize() +int AnimatePacket::getEstimatedSize() { return 5; } diff --git a/Minecraft.World/AnimatePacket.h b/Minecraft.World/AnimatePacket.h index 78c8fae6..0287b9a6 100644 --- a/Minecraft.World/AnimatePacket.h +++ b/Minecraft.World/AnimatePacket.h @@ -9,7 +9,7 @@ public: static const int SWING = 1; static const int HURT = 2; static const int WAKE_UP = 3; - static const int RESPAWN = 4; + static const int RESPAWN = 4; static const int EAT = 5; // 1.8.2 static const int CRITICAL_HIT = 6; static const int MAGIC_CRITICAL_HIT = 7; @@ -18,14 +18,14 @@ public: int action; AnimatePacket(); - AnimatePacket(std::shared_ptr e, int action); + AnimatePacket(shared_ptr e, int action); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); - + public: - static std::shared_ptr create() { return std::shared_ptr(new AnimatePacket()); } + static shared_ptr create() { return shared_ptr(new AnimatePacket()); } virtual int getId() { return 18; } }; \ No newline at end of file diff --git a/Minecraft.World/AnvilTile.cpp b/Minecraft.World/AnvilTile.cpp index f0a6d2a7..e5fd736d 100644 --- a/Minecraft.World/AnvilTile.cpp +++ b/Minecraft.World/AnvilTile.cpp @@ -55,7 +55,7 @@ void AnvilTile::registerIcons(IconRegister *iconRegister) } } -void AnvilTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void AnvilTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3; int dmg = level->getData(x, y, z) >> 2; @@ -67,7 +67,7 @@ void AnvilTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptrsetData(x, y, z, Direction::WEST | (dmg << 2)); } -bool AnvilTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +bool AnvilTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) { if (level->isClientSide) { @@ -87,7 +87,7 @@ int AnvilTile::getSpawnResourcesAuxValue(int data) return data >> 2; } -void AnvilTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) +void AnvilTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) { int dir = level->getData(x, y, z) & 3; @@ -101,7 +101,7 @@ void AnvilTile::updateShape(LevelSource *level, int x, int y, int z, int forceDa } } -void AnvilTile::falling(std::shared_ptr entity) +void AnvilTile::falling(shared_ptr entity) { entity->setHurtsEntities(true); } diff --git a/Minecraft.World/AnvilTile.h b/Minecraft.World/AnvilTile.h index e625777d..1a4f0ed7 100644 --- a/Minecraft.World/AnvilTile.h +++ b/Minecraft.World/AnvilTile.h @@ -35,14 +35,14 @@ public: bool isSolidRender(bool isServerLevel = false); Icon *getTexture(int face, int data); void registerIcons(IconRegister *iconRegister); - void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); - bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); int getRenderShape(); int getSpawnResourcesAuxValue(int data); - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); protected: - void falling(std::shared_ptr entity); + void falling(shared_ptr entity); public: void onLand(Level *level, int xt, int yt, int zt, int data); diff --git a/Minecraft.World/ArmorDyeRecipe.cpp b/Minecraft.World/ArmorDyeRecipe.cpp index 8c5f52e0..3b74a8bb 100644 --- a/Minecraft.World/ArmorDyeRecipe.cpp +++ b/Minecraft.World/ArmorDyeRecipe.cpp @@ -5,14 +5,14 @@ #include "net.minecraft.world.item.crafting.h" #include "ArmorDyeRecipe.h" -bool ArmorDyeRecipe::matches(std::shared_ptr craftSlots, Level *level) +bool ArmorDyeRecipe::matches(shared_ptr craftSlots, Level *level) { - std::shared_ptr target = nullptr; - vector > dyes; + shared_ptr target = nullptr; + vector > dyes; for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) { - std::shared_ptr item = craftSlots->getItem(slot); + shared_ptr item = craftSlots->getItem(slot); if (item == NULL) continue; ArmorItem *armor = dynamic_cast(item->getItem()); @@ -40,9 +40,9 @@ bool ArmorDyeRecipe::matches(std::shared_ptr craftSlots, Leve return target != NULL && !dyes.empty(); } -std::shared_ptr ArmorDyeRecipe::assembleDyedArmor(std::shared_ptr craftSlots) +shared_ptr ArmorDyeRecipe::assembleDyedArmor(shared_ptr craftSlots) { - std::shared_ptr target = nullptr; + shared_ptr target = nullptr; int colorTotals[3]; colorTotals[0] = 0; colorTotals[1] = 0; @@ -55,7 +55,7 @@ std::shared_ptr ArmorDyeRecipe::assembleDyedArmor(std::shared_ptr< { for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) { - std::shared_ptr item = craftSlots->getItem(slot); + shared_ptr item = craftSlots->getItem(slot); if (item == NULL) continue; armor = dynamic_cast(item->getItem()); @@ -128,7 +128,7 @@ std::shared_ptr ArmorDyeRecipe::assembleDyedArmor(std::shared_ptr< return target; } -std::shared_ptr ArmorDyeRecipe::assemble(std::shared_ptr craftSlots) +shared_ptr ArmorDyeRecipe::assemble(shared_ptr craftSlots) { return ArmorDyeRecipe::assembleDyedArmor(craftSlots); } @@ -181,8 +181,8 @@ void ArmorDyeRecipe::requires(INGREDIENTS_REQUIRED *pIngReq) { ItemInstance *expected = *ingredient; - if (expected!=NULL) - { + if (expected!=NULL) + { int iAuxVal = (*ingredient)->getAuxValue(); TempIngReq.uiGridA[iCount++]=expected->id | iAuxVal<<24; // 4J-PB - put the ingredients in boxes 1,2,4,5 so we can see them in a 2x2 crafting screen diff --git a/Minecraft.World/ArmorDyeRecipe.h b/Minecraft.World/ArmorDyeRecipe.h index 715b08e2..b983ba7b 100644 --- a/Minecraft.World/ArmorDyeRecipe.h +++ b/Minecraft.World/ArmorDyeRecipe.h @@ -5,17 +5,17 @@ class ArmorDyeRecipe : public Recipy { public: - bool matches(std::shared_ptr craftSlots, Level *level); + bool matches(shared_ptr craftSlots, Level *level); // 4J Stu - Made static as we use this in a different way from the Java (but needs to be a different name otherwise Orbis compiler complains - static std::shared_ptr assembleDyedArmor(std::shared_ptr craftSlots); - std::shared_ptr assemble(std::shared_ptr craftSlots); + static shared_ptr assembleDyedArmor(shared_ptr craftSlots); + shared_ptr assemble(shared_ptr craftSlots); int size(); const ItemInstance *getResultItem(); - - virtual const int getGroup(); + + virtual const int getGroup(); // 4J-PB virtual bool requires(int iRecipe); diff --git a/Minecraft.World/ArmorItem.cpp b/Minecraft.World/ArmorItem.cpp index be7f6b9d..0b2c24e4 100644 --- a/Minecraft.World/ArmorItem.cpp +++ b/Minecraft.World/ArmorItem.cpp @@ -88,7 +88,7 @@ ArmorItem::ArmorItem(int id, const ArmorMaterial *armorType, int icon, int slot) maxStackSize = 1; } -int ArmorItem::getColor(std::shared_ptr item, int spriteLayer) +int ArmorItem::getColor(shared_ptr item, int spriteLayer) { if (spriteLayer > 0) { @@ -116,7 +116,7 @@ const _ArmorMaterial *ArmorItem::getMaterial() return armorType; } -bool ArmorItem::hasCustomColor(std::shared_ptr item) +bool ArmorItem::hasCustomColor(shared_ptr item) { if (armorType != ArmorMaterial::CLOTH) return false; if (!item->hasTag()) return false; @@ -126,7 +126,7 @@ bool ArmorItem::hasCustomColor(std::shared_ptr item) return true; } -int ArmorItem::getColor(std::shared_ptr item) +int ArmorItem::getColor(shared_ptr item) { if (armorType != ArmorMaterial::CLOTH) return -1; @@ -155,7 +155,7 @@ Icon *ArmorItem::getLayerIcon(int auxValue, int spriteLayer) return Item::getLayerIcon(auxValue, spriteLayer); } -void ArmorItem::clearColor(std::shared_ptr item) +void ArmorItem::clearColor(shared_ptr item) { if (armorType != ArmorMaterial::CLOTH) return; CompoundTag *tag = item->getTag(); @@ -164,7 +164,7 @@ void ArmorItem::clearColor(std::shared_ptr item) if (display->contains(L"color")) display->remove(L"color"); } -void ArmorItem::setColor(std::shared_ptr item, int color) +void ArmorItem::setColor(shared_ptr item, int color) { if (armorType != ArmorMaterial::CLOTH) { @@ -189,7 +189,7 @@ void ArmorItem::setColor(std::shared_ptr item, int color) display->putInt(L"color", color); } -bool ArmorItem::isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem) +bool ArmorItem::isValidRepairItem(shared_ptr source, shared_ptr repairItem) { if (armorType->getTierItemId() == repairItem->id) { diff --git a/Minecraft.World/ArmorItem.h b/Minecraft.World/ArmorItem.h index 04b483e2..c711e2f9 100644 --- a/Minecraft.World/ArmorItem.h +++ b/Minecraft.World/ArmorItem.h @@ -65,7 +65,7 @@ public: ArmorItem(int id, const ArmorMaterial *armorType, int icon, int slot); //@Override - int getColor(std::shared_ptr item, int spriteLayer); + int getColor(shared_ptr item, int spriteLayer); //@Override bool hasMultipleSpriteLayers(); @@ -73,15 +73,15 @@ public: virtual int getEnchantmentValue(); const ArmorMaterial *getMaterial(); - bool hasCustomColor(std::shared_ptr item); - int getColor(std::shared_ptr item); + bool hasCustomColor(shared_ptr item); + int getColor(shared_ptr item); //@Override Icon *getLayerIcon(int auxValue, int spriteLayer); - void clearColor(std::shared_ptr item); - void setColor(std::shared_ptr item, int color); + void clearColor(shared_ptr item); + void setColor(shared_ptr item, int color); - bool isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem); + bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/ArmorSlot.cpp b/Minecraft.World/ArmorSlot.cpp index c3006aaa..1efe0b71 100644 --- a/Minecraft.World/ArmorSlot.cpp +++ b/Minecraft.World/ArmorSlot.cpp @@ -6,7 +6,7 @@ #include "net.minecraft.world.item.crafting.h" #include "ArmorSlot.h" -ArmorSlot::ArmorSlot(int slotNum, std::shared_ptr container, int id, int x, int y) +ArmorSlot::ArmorSlot(int slotNum, shared_ptr container, int id, int x, int y) : Slot( container, id, x, y ), slotNum( slotNum ) { @@ -17,7 +17,7 @@ int ArmorSlot::getMaxStackSize() return 1; } -bool ArmorSlot::mayPlace(std::shared_ptr item) +bool ArmorSlot::mayPlace(shared_ptr item) { if ( dynamic_cast( item->getItem() ) != NULL) { @@ -36,9 +36,9 @@ Icon *ArmorSlot::getNoItemIcon() } // -//bool ArmorSlot::mayCombine(std::shared_ptr item) +//bool ArmorSlot::mayCombine(shared_ptr item) //{ -// std::shared_ptr thisItemI = getItem(); +// shared_ptr thisItemI = getItem(); // if(thisItemI == NULL || item == NULL) return false; // // ArmorItem *thisItem = (ArmorItem *)thisItemI->getItem(); @@ -47,12 +47,12 @@ Icon *ArmorSlot::getNoItemIcon() // return thisIsDyableArmor && itemIsDye; //} // -//std::shared_ptr ArmorSlot::combine(std::shared_ptr item) +//shared_ptr ArmorSlot::combine(shared_ptr item) //{ -// std::shared_ptr craftSlots = std::shared_ptr( new CraftingContainer(NULL, 2, 2) ); +// shared_ptr craftSlots = shared_ptr( new CraftingContainer(NULL, 2, 2) ); // craftSlots->setItem(0, item); // craftSlots->setItem(1, getItem()); // Armour item needs to go second -// std::shared_ptr result = ArmorDyeRecipe::assembleDyedArmor(craftSlots); +// shared_ptr result = ArmorDyeRecipe::assembleDyedArmor(craftSlots); // craftSlots->setItem(0, nullptr); // craftSlots->setItem(1, nullptr); // return result; diff --git a/Minecraft.World/ArmorSlot.h b/Minecraft.World/ArmorSlot.h index 2bf02067..a9797be2 100644 --- a/Minecraft.World/ArmorSlot.h +++ b/Minecraft.World/ArmorSlot.h @@ -13,12 +13,12 @@ private: const int slotNum; public: - ArmorSlot(int slotNum, std::shared_ptr container, int id, int x, int y); + ArmorSlot(int slotNum, shared_ptr container, int id, int x, int y); virtual ~ArmorSlot() {} virtual int getMaxStackSize(); - virtual bool mayPlace(std::shared_ptr item); + virtual bool mayPlace(shared_ptr item); Icon *getNoItemIcon(); - //virtual bool mayCombine(std::shared_ptr item); // 4J Added - //virtual std::shared_ptr combine(std::shared_ptr item); // 4J Added + //virtual bool mayCombine(shared_ptr item); // 4J Added + //virtual shared_ptr combine(shared_ptr item); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/ArrayWithLength.h b/Minecraft.World/ArrayWithLength.h index bee447f0..4e9f9941 100644 --- a/Minecraft.World/ArrayWithLength.h +++ b/Minecraft.World/ArrayWithLength.h @@ -105,11 +105,11 @@ typedef arrayWithLength LevelArray; typedef arrayWithLength LevelRendererArray; typedef arrayWithLength WeighedRandomItemArray; typedef arrayWithLength WeighedTreasureArray; -typedef arrayWithLength< std::shared_ptr > LayerArray; +typedef arrayWithLength< shared_ptr > LayerArray; //typedef arrayWithLength CubeArray; typedef arrayWithLength ModelPartArray; typedef arrayWithLength EnchantmentArray; typedef arrayWithLength ClipChunkArray; #include "ItemInstance.h" -typedef arrayWithLength > ItemInstanceArray; +typedef arrayWithLength > ItemInstanceArray; diff --git a/Minecraft.World/Arrow.cpp b/Minecraft.World/Arrow.cpp index 9edd2208..1b102c65 100644 --- a/Minecraft.World/Arrow.cpp +++ b/Minecraft.World/Arrow.cpp @@ -52,7 +52,7 @@ Arrow::Arrow(Level *level) : Entity( level ) this->setSize(0.5f, 0.5f); } -Arrow::Arrow(Level *level, std::shared_ptr mob, std::shared_ptr target, float power, float uncertainty) : Entity( level ) +Arrow::Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty) : Entity( level ) { _init(); @@ -88,8 +88,8 @@ Arrow::Arrow(Level *level, double x, double y, double z) : Entity( level ) this->setPos(x, y, z); this->heightOffset = 0; } - -Arrow::Arrow(Level *level, std::shared_ptr mob, float power) : Entity( level ) + +Arrow::Arrow(Level *level, shared_ptr mob, float power) : Entity( level ) { _init(); @@ -171,12 +171,12 @@ void Arrow::lerpMotion(double xd, double yd, double zd) } } -void Arrow::tick() +void Arrow::tick() { Entity::tick(); - if (xRotO == 0 && yRotO == 0) + if (xRotO == 0 && yRotO == 0) { double sd = sqrt(xd * xd + zd * zd); yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); @@ -214,17 +214,17 @@ void Arrow::tick() life = 0; flightTime = 0; return; - } + } - else + else { life++; if (life == 20 * 60) remove(); return; } - } - - else + } + + else { flightTime++; } @@ -239,13 +239,13 @@ void Arrow::tick() { to = Vec3::newTemp(res->pos->x, res->pos->y, res->pos->z); } - std::shared_ptr hitEntity = nullptr; - vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); + shared_ptr hitEntity = nullptr; + vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); double nearest = 0; AUTO_VAR(itEnd, objects->end()); for (AUTO_VAR(it, objects->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //objects->at(i); + shared_ptr e = *it; //objects->at(i); if (!e->isPickable() || (e == owner && flightTime < 5)) continue; float rr = 0.3f; @@ -299,7 +299,7 @@ void Arrow::tick() res->entity->setOnFire(5); } - std::shared_ptr mob = dynamic_pointer_cast(res->entity); + shared_ptr mob = dynamic_pointer_cast(res->entity); if (mob != NULL) { mob->arrowCount++; @@ -333,7 +333,7 @@ void Arrow::tick() // 4J - sound change brought forward from 1.2.3 level->playSound(shared_from_this(), eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); remove(); - } + } else { xd *= -0.1f; @@ -343,7 +343,7 @@ void Arrow::tick() yRotO += 180; flightTime = 0; } - + delete damageSource; } else @@ -464,7 +464,7 @@ void Arrow::readAdditionalSaveData(CompoundTag *tag) } } -void Arrow::playerTouch(std::shared_ptr player) +void Arrow::playerTouch(shared_ptr player) { if (level->isClientSide || !inGround || shakeTime > 0) return; @@ -472,7 +472,7 @@ void Arrow::playerTouch(std::shared_ptr player) if (pickup == PICKUP_ALLOWED) { - if (!player->inventory->add( std::shared_ptr( new ItemInstance(Item::arrow, 1) ) )) + if (!player->inventory->add( shared_ptr( new ItemInstance(Item::arrow, 1) ) )) { bRemove = false; } diff --git a/Minecraft.World/Arrow.h b/Minecraft.World/Arrow.h index 9ac5a900..b96aa210 100644 --- a/Minecraft.World/Arrow.h +++ b/Minecraft.World/Arrow.h @@ -36,7 +36,7 @@ private: public: int pickup; int shakeTime; - std::shared_ptr owner; + shared_ptr owner; private: double baseDamage; @@ -52,9 +52,9 @@ private: public: Arrow(Level *level); - Arrow(Level *level, std::shared_ptr mob, std::shared_ptr target, float power, float uncertainty); + Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty); Arrow(Level *level, double x, double y, double z); - Arrow(Level *level, std::shared_ptr mob, float power); + Arrow(Level *level, shared_ptr mob, float power); protected: virtual void defineSynchedData(); @@ -66,7 +66,7 @@ public: virtual void tick(); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); - virtual void playerTouch(std::shared_ptr player); + virtual void playerTouch(shared_ptr player); virtual float getShadowHeightOffs(); void setBaseDamage(double baseDamage); diff --git a/Minecraft.World/ArrowAttackGoal.cpp b/Minecraft.World/ArrowAttackGoal.cpp index 735b8389..23a2d2ac 100644 --- a/Minecraft.World/ArrowAttackGoal.cpp +++ b/Minecraft.World/ArrowAttackGoal.cpp @@ -26,7 +26,7 @@ ArrowAttackGoal::ArrowAttackGoal(Mob *mob, float speed, int projectileType, int bool ArrowAttackGoal::canUse() { - std::shared_ptr bestTarget = mob->getTarget(); + shared_ptr bestTarget = mob->getTarget(); if (bestTarget == NULL) return false; target = weak_ptr(bestTarget); return true; @@ -45,7 +45,7 @@ void ArrowAttackGoal::stop() void ArrowAttackGoal::tick() { double attackRadiusSqr = 10 * 10; - std::shared_ptr tar = target.lock(); + shared_ptr tar = target.lock(); double targetDistSqr = mob->distanceToSqr(tar->x, tar->bb->y0, tar->z); bool canSee = mob->getSensing()->canSee(tar); @@ -69,16 +69,16 @@ void ArrowAttackGoal::tick() void ArrowAttackGoal::fireAtTarget() { - std::shared_ptr tar = target.lock(); + shared_ptr tar = target.lock(); if (projectileType == ArrowType) { - std::shared_ptr arrow = std::shared_ptr( new Arrow(level, dynamic_pointer_cast(mob->shared_from_this()), tar, 1.60f, 12) ); + shared_ptr arrow = shared_ptr( new Arrow(level, dynamic_pointer_cast(mob->shared_from_this()), tar, 1.60f, 12) ); level->playSound(mob->shared_from_this(), eSoundType_RANDOM_BOW, 1.0f, 1 / (mob->getRandom()->nextFloat() * 0.4f + 0.8f)); level->addEntity(arrow); } else if (projectileType == SnowballType) { - std::shared_ptr snowball = std::shared_ptr( new Snowball(level, dynamic_pointer_cast(mob->shared_from_this())) ); + shared_ptr snowball = shared_ptr( new Snowball(level, dynamic_pointer_cast(mob->shared_from_this())) ); double xd = tar->x - mob->x; double yd = (tar->y + tar->getHeadHeight() - 1.1f) - snowball->y; double zd = tar->z - mob->z; diff --git a/Minecraft.World/AvoidPlayerGoal.cpp b/Minecraft.World/AvoidPlayerGoal.cpp index 56202028..c94d5cb1 100644 --- a/Minecraft.World/AvoidPlayerGoal.cpp +++ b/Minecraft.World/AvoidPlayerGoal.cpp @@ -33,14 +33,14 @@ bool AvoidPlayerGoal::canUse() { if (avoidType == typeid(Player)) { - std::shared_ptr tamableAnimal = dynamic_pointer_cast(mob->shared_from_this()); + shared_ptr tamableAnimal = dynamic_pointer_cast(mob->shared_from_this()); if (tamableAnimal != NULL && tamableAnimal->isTame()) return false; toAvoid = weak_ptr(mob->level->getNearestPlayer(mob->shared_from_this(), maxDist)); if (toAvoid.lock() == NULL) return false; } else { - vector > *entities = mob->level->getEntitiesOfClass(avoidType, mob->bb->grow(maxDist, 3, maxDist)); + vector > *entities = mob->level->getEntitiesOfClass(avoidType, mob->bb->grow(maxDist, 3, maxDist)); if (entities->empty()) { delete entities; diff --git a/Minecraft.World/AwardStatPacket.h b/Minecraft.World/AwardStatPacket.h index aad8511d..6b79c023 100644 --- a/Minecraft.World/AwardStatPacket.h +++ b/Minecraft.World/AwardStatPacket.h @@ -24,7 +24,7 @@ public: virtual int getEstimatedSize(); virtual bool isAync(); - static std::shared_ptr create() { return std::shared_ptr(new AwardStatPacket()); } + static shared_ptr create() { return shared_ptr(new AwardStatPacket()); } virtual int getId() { return 200; } public: diff --git a/Minecraft.World/BedItem.cpp b/Minecraft.World/BedItem.cpp index d0417387..1ff50c6c 100644 --- a/Minecraft.World/BedItem.cpp +++ b/Minecraft.World/BedItem.cpp @@ -12,7 +12,7 @@ BedItem::BedItem(int id) : Item( id ) { } -bool BedItem::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool BedItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { if (face != Facing::UP) { diff --git a/Minecraft.World/BedItem.h b/Minecraft.World/BedItem.h index 261423b3..ad0297bd 100644 --- a/Minecraft.World/BedItem.h +++ b/Minecraft.World/BedItem.h @@ -11,5 +11,5 @@ class BedItem : public Item public: BedItem(int id); - virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); }; \ No newline at end of file diff --git a/Minecraft.World/BedTile.cpp b/Minecraft.World/BedTile.cpp index 47f2f86c..7d32c6d3 100644 --- a/Minecraft.World/BedTile.cpp +++ b/Minecraft.World/BedTile.cpp @@ -28,7 +28,7 @@ void BedTile::updateDefaultShape() } // 4J-PB - Adding a TestUse for tooltip display -bool BedTile::TestUse(Level *level, int x, int y, int z, std::shared_ptr player) +bool BedTile::TestUse(Level *level, int x, int y, int z, shared_ptr player) { //if (level->isClientSide) return true; @@ -65,7 +65,7 @@ bool BedTile::TestUse(Level *level, int x, int y, int z, std::shared_ptr return false; } -bool BedTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool BedTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) return false; if (level->isClientSide) return true; @@ -106,11 +106,11 @@ bool BedTile::use(Level *level, int x, int y, int z, std::shared_ptr pla if (BedTile::isOccupied(data)) { - std::shared_ptr sleepingPlayer = nullptr; + shared_ptr sleepingPlayer = nullptr; AUTO_VAR(itEnd, level->players.end()); for (AUTO_VAR(it, level->players.begin()); it != itEnd; it++ ) { - std::shared_ptr p = *it; + shared_ptr p = *it; if (p->isSleeping()) { Pos pos = p->bedPosition; @@ -128,7 +128,7 @@ bool BedTile::use(Level *level, int x, int y, int z, std::shared_ptr pla else { player->displayClientMessage(IDS_TILE_BED_OCCUPIED ); - + return true; } } @@ -142,7 +142,7 @@ bool BedTile::use(Level *level, int x, int y, int z, std::shared_ptr pla if(level->AllPlayersAreSleeping()==false) { player->displayClientMessage(IDS_TILE_BED_PLAYERSLEEP); - } + } return true; } @@ -211,7 +211,7 @@ bool BedTile::isSolidRender(bool isServerLevel) return false; } -void BedTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void BedTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { setShape(); } diff --git a/Minecraft.World/BedTile.h b/Minecraft.World/BedTile.h index a749f4b4..339080d3 100644 --- a/Minecraft.World/BedTile.h +++ b/Minecraft.World/BedTile.h @@ -23,17 +23,17 @@ public: static int HEAD_DIRECTION_OFFSETS[4][2]; BedTile(int id); - + virtual void updateDefaultShape(); - virtual bool TestUse(Level *level, int x, int y, int z, std::shared_ptr player); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool TestUse(Level *level, int x, int y, int z, shared_ptr player); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual Icon *getTexture(int face, int data); //@Override void registerIcons(IconRegister *iconRegister); virtual int getRenderShape(); virtual bool isCubeShaped(); virtual bool isSolidRender(bool isServerLevel = false); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual int getResource(int data, Random *random,int playerBonusLevel); diff --git a/Minecraft.World/BegGoal.cpp b/Minecraft.World/BegGoal.cpp index 39bb63da..97553928 100644 --- a/Minecraft.World/BegGoal.cpp +++ b/Minecraft.World/BegGoal.cpp @@ -51,9 +51,9 @@ void BegGoal::tick() --lookTime; } -bool BegGoal::playerHoldingInteresting(std::shared_ptr player) +bool BegGoal::playerHoldingInteresting(shared_ptr player) { - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); if (item == NULL) return false; if (!wolf->isTame() && item->id == Item::bone_Id) return true; return wolf->isFood(item); diff --git a/Minecraft.World/BegGoal.h b/Minecraft.World/BegGoal.h index b80a68a5..607937a7 100644 --- a/Minecraft.World/BegGoal.h +++ b/Minecraft.World/BegGoal.h @@ -23,7 +23,7 @@ public: virtual void tick(); private: - bool playerHoldingInteresting(std::shared_ptr player); + bool playerHoldingInteresting(shared_ptr player); public: // 4J Added override to update ai elements when loading entity from schematics diff --git a/Minecraft.World/BiomeInitLayer.cpp b/Minecraft.World/BiomeInitLayer.cpp index 99aafa7d..6edd18de 100644 --- a/Minecraft.World/BiomeInitLayer.cpp +++ b/Minecraft.World/BiomeInitLayer.cpp @@ -4,7 +4,7 @@ #include "net.minecraft.world.level.h" #include "BiomeInitLayer.h" -BiomeInitLayer::BiomeInitLayer(int64_t seed, std::shared_ptrparent, LevelType *levelType) : Layer(seed) +BiomeInitLayer::BiomeInitLayer(int64_t seed, shared_ptrparent, LevelType *levelType) : Layer(seed) { this->parent = parent; diff --git a/Minecraft.World/BiomeInitLayer.h b/Minecraft.World/BiomeInitLayer.h index eaa1502f..00bf3812 100644 --- a/Minecraft.World/BiomeInitLayer.h +++ b/Minecraft.World/BiomeInitLayer.h @@ -10,7 +10,7 @@ private: BiomeArray startBiomes; public: - BiomeInitLayer(int64_t seed, std::shared_ptr parent, LevelType *levelType); + BiomeInitLayer(int64_t seed, shared_ptr parent, LevelType *levelType); virtual ~BiomeInitLayer(); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/BiomeSource.h b/Minecraft.World/BiomeSource.h index 0d6cca5e..a1e8a50b 100644 --- a/Minecraft.World/BiomeSource.h +++ b/Minecraft.World/BiomeSource.h @@ -13,8 +13,8 @@ class LevelType; class BiomeSource { private: - std::shared_ptr layer; - std::shared_ptr zoomedLayer; + shared_ptr layer; + shared_ptr zoomedLayer; public: static const int CACHE_DIAMETER = 256; diff --git a/Minecraft.World/Blaze.cpp b/Minecraft.World/Blaze.cpp index 1218ec2c..57726363 100644 --- a/Minecraft.World/Blaze.cpp +++ b/Minecraft.World/Blaze.cpp @@ -115,7 +115,7 @@ void Blaze::aiStep() Monster::aiStep(); } -void Blaze::checkHurtTarget(std::shared_ptr target, float d) +void Blaze::checkHurtTarget(shared_ptr target, float d) { if (attackTime <= 0 && d < 2.0f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) { @@ -154,7 +154,7 @@ void Blaze::checkHurtTarget(std::shared_ptr target, float d) level->levelEvent(nullptr, LevelEvent::SOUND_BLAZE_FIREBALL, (int) x, (int) y, (int) z, 0); // level.playSound(this, "mob.ghast.fireball", getSoundVolume(), (random.nextFloat() - random.nextFloat()) * 0.2f + 1.0f); for (int i = 0; i < 1; i++) { - std::shared_ptr ie = std::shared_ptr( new SmallFireball(level, dynamic_pointer_cast( shared_from_this() ), xd + random->nextGaussian() * sqd, yd, zd + random->nextGaussian() * sqd) ); + shared_ptr ie = shared_ptr( new SmallFireball(level, dynamic_pointer_cast( shared_from_this() ), xd + random->nextGaussian() * sqd, yd, zd + random->nextGaussian() * sqd) ); // Vec3 v = getViewVector(1); // ie.x = x + v.x * 1.5; ie->y = y + bbHeight / 2 + 0.5f; diff --git a/Minecraft.World/Blaze.h b/Minecraft.World/Blaze.h index 640b9f39..4f60a4a4 100644 --- a/Minecraft.World/Blaze.h +++ b/Minecraft.World/Blaze.h @@ -32,7 +32,7 @@ public: virtual void aiStep(); protected: - virtual void checkHurtTarget(std::shared_ptr target, float d); + virtual void checkHurtTarget(shared_ptr target, float d); virtual void causeFallDamage(float distance); virtual int getDeathLoot(); diff --git a/Minecraft.World/BlockRegionUpdatePacket.h b/Minecraft.World/BlockRegionUpdatePacket.h index ac38a381..54dfea4e 100644 --- a/Minecraft.World/BlockRegionUpdatePacket.h +++ b/Minecraft.World/BlockRegionUpdatePacket.h @@ -28,6 +28,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new BlockRegionUpdatePacket()); } + static shared_ptr create() { return shared_ptr(new BlockRegionUpdatePacket()); } virtual int getId() { return 51; } }; diff --git a/Minecraft.World/Boat.cpp b/Minecraft.World/Boat.cpp index 26f02203..39211e44 100644 --- a/Minecraft.World/Boat.cpp +++ b/Minecraft.World/Boat.cpp @@ -56,7 +56,7 @@ void Boat::defineSynchedData() } -AABB *Boat::getCollideAgainstBox(std::shared_ptr entity) +AABB *Boat::getCollideAgainstBox(shared_ptr entity) { return entity->bb; } @@ -98,9 +98,9 @@ bool Boat::hurt(DamageSource *source, int hurtDamage) // Untrusted players shouldn't be able to damage minecarts or boats. if (dynamic_cast(source) != NULL) { - std::shared_ptr attacker = source->getDirectEntity(); + shared_ptr attacker = source->getDirectEntity(); - if (dynamic_pointer_cast(attacker) != NULL && + if (dynamic_pointer_cast(attacker) != NULL && !dynamic_pointer_cast(attacker)->isAllowedToHurtEntity( shared_from_this() )) return false; } @@ -117,7 +117,7 @@ bool Boat::hurt(DamageSource *source, int hurtDamage) markHurt(); // 4J Stu - Brought froward from 12w36 to fix #46611 - TU5: Gameplay: Minecarts and boat requires more hits than one to be destroyed in creative mode - std::shared_ptr player = dynamic_pointer_cast(source->getEntity()); + shared_ptr player = dynamic_pointer_cast(source->getEntity()); if (player != NULL && player->abilities.instabuild) setDamage(100); if (getDamage() > 20 * 2) @@ -394,13 +394,13 @@ void Boat::tick() if(level->isClientSide) return; - vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); + vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); if (entities != NULL && !entities->empty()) { AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - std::shared_ptr e = (*it); // entities->at(i); + shared_ptr e = (*it); // entities->at(i); if (e != rider.lock() && e->isPushable() && e->GetType() == eTYPE_BOAT) { e->push(shared_from_this()); @@ -467,7 +467,7 @@ wstring Boat::getName() return L"Boat"; } -bool Boat::interact(std::shared_ptr player) +bool Boat::interact(shared_ptr player) { if (rider.lock() != NULL && dynamic_pointer_cast(rider.lock())!=NULL && rider.lock() != player) return true; if (!level->isClientSide) diff --git a/Minecraft.World/Boat.h b/Minecraft.World/Boat.h index dbfb3944..1039e8f9 100644 --- a/Minecraft.World/Boat.h +++ b/Minecraft.World/Boat.h @@ -40,7 +40,7 @@ protected: virtual void defineSynchedData(); public: - virtual AABB *getCollideAgainstBox(std::shared_ptr entity); + virtual AABB *getCollideAgainstBox(shared_ptr entity); virtual AABB *getCollideBox(); virtual bool isPushable(); @@ -69,7 +69,7 @@ protected: public: virtual float getShadowHeightOffs(); wstring getName(); - virtual bool interact(std::shared_ptr player); + virtual bool interact(shared_ptr player); virtual void setDamage(int damage); virtual int getDamage(); diff --git a/Minecraft.World/BoatItem.cpp b/Minecraft.World/BoatItem.cpp index af778350..3499bc02 100644 --- a/Minecraft.World/BoatItem.cpp +++ b/Minecraft.World/BoatItem.cpp @@ -12,7 +12,7 @@ BoatItem::BoatItem(int id) : Item( id ) this->maxStackSize = 1; } -bool BoatItem::TestUse(Level *level, std::shared_ptr player) +bool BoatItem::TestUse(Level *level, shared_ptr player) { // 4J-PB - added for tooltips to test use // 4J TODO really we should have the crosshair hitresult telling us if it hit water, and at what distance, so we don't need to do this again @@ -49,7 +49,7 @@ bool BoatItem::TestUse(Level *level, std::shared_ptr player) delete hr; return false; } -std::shared_ptr BoatItem::use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr BoatItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) { float a = 1; @@ -80,11 +80,11 @@ std::shared_ptr BoatItem::use(std::shared_ptr itemIn Vec3 *b = player->getViewVector(a); bool hitEntity = false; float overlap = 1; - vector > *objects = level->getEntities(player, player->bb->expand(b->x * (range), b->y * (range), b->z * (range))->grow(overlap, overlap, overlap)); + vector > *objects = level->getEntities(player, player->bb->expand(b->x * (range), b->y * (range), b->z * (range))->grow(overlap, overlap, overlap)); //for (int i = 0; i < objects.size(); i++) { for(AUTO_VAR(it, objects->begin()); it != objects->end(); ++it) { - std::shared_ptr e = *it; //objects.get(i); + shared_ptr e = *it; //objects.get(i); if (!e->isPickable()) continue; float rr = e->getPickRadius(); @@ -105,12 +105,12 @@ std::shared_ptr BoatItem::use(std::shared_ptr itemIn int yt = hr->y; int zt = hr->z; - if (!level->isClientSide) + if (!level->isClientSide) { if (level->getTile(xt, yt, zt) == Tile::topSnow_Id) yt--; if( level->countInstanceOf(eTYPE_BOAT, true) < Level::MAX_XBOX_BOATS ) // 4J - added limit { - level->addEntity( std::shared_ptr( new Boat(level, xt + 0.5f, yt + 1.0f, zt + 0.5f) ) ); + level->addEntity( shared_ptr( new Boat(level, xt + 0.5f, yt + 1.0f, zt + 0.5f) ) ); if (!player->abilities.instabuild) { itemInstance->count--; diff --git a/Minecraft.World/BoatItem.h b/Minecraft.World/BoatItem.h index 08a2ccf7..81bc4e18 100644 --- a/Minecraft.World/BoatItem.h +++ b/Minecraft.World/BoatItem.h @@ -11,8 +11,8 @@ public: BoatItem(int id); - virtual bool TestUse(Level *level, std::shared_ptr player); - virtual std::shared_ptr use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); + virtual bool TestUse(Level *level, shared_ptr player); + virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); /* * public boolean useOn(ItemInstance instance, Player player, Level level, diff --git a/Minecraft.World/BonusChestFeature.cpp b/Minecraft.World/BonusChestFeature.cpp index 7fa6c489..2d7690ee 100644 --- a/Minecraft.World/BonusChestFeature.cpp +++ b/Minecraft.World/BonusChestFeature.cpp @@ -58,7 +58,7 @@ bool BonusChestFeature::place(Level *level, Random *random, int x, int y, int z, if (force || ( level->isEmptyTile(x2, y2, z2) && level->isTopSolidBlocking(x2, y2 - 1, z2))) { level->setTile(x2, y2, z2, Tile::chest_Id); - std::shared_ptr chest = dynamic_pointer_cast(level->getTileEntity(x2, y2, z2)); + shared_ptr chest = dynamic_pointer_cast(level->getTileEntity(x2, y2, z2)); if (chest != NULL) { WeighedTreasure::addChestItems(random, treasureList, chest, numRolls); diff --git a/Minecraft.World/BookItem.cpp b/Minecraft.World/BookItem.cpp index d1fea216..8e4098bb 100644 --- a/Minecraft.World/BookItem.cpp +++ b/Minecraft.World/BookItem.cpp @@ -6,7 +6,7 @@ BookItem::BookItem(int id) : Item(id) { } -bool BookItem::isEnchantable(std::shared_ptr itemInstance) +bool BookItem::isEnchantable(shared_ptr itemInstance) { return itemInstance->count == 1; } diff --git a/Minecraft.World/BookItem.h b/Minecraft.World/BookItem.h index 8bb5d118..f60fc417 100644 --- a/Minecraft.World/BookItem.h +++ b/Minecraft.World/BookItem.h @@ -7,6 +7,6 @@ class BookItem : public Item public: BookItem(int id); - bool isEnchantable(std::shared_ptr itemInstance); + bool isEnchantable(shared_ptr itemInstance); int getEnchantmentValue(); }; \ No newline at end of file diff --git a/Minecraft.World/BossMob.cpp b/Minecraft.World/BossMob.cpp index a32a4325..52b88230 100644 --- a/Minecraft.World/BossMob.cpp +++ b/Minecraft.World/BossMob.cpp @@ -6,7 +6,7 @@ BossMob::BossMob(Level *level) : Mob( level ) { - + maxHealth = 100; // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called @@ -18,7 +18,7 @@ int BossMob::getMaxHealth() return maxHealth; } -bool BossMob::hurt(std::shared_ptr bossMobPart, DamageSource *source, int damage) +bool BossMob::hurt(shared_ptr bossMobPart, DamageSource *source, int damage) { return hurt(source, damage); } diff --git a/Minecraft.World/BossMob.h b/Minecraft.World/BossMob.h index f4ef6a54..50a6d3ef 100644 --- a/Minecraft.World/BossMob.h +++ b/Minecraft.World/BossMob.h @@ -14,7 +14,7 @@ public: BossMob(Level *level); virtual int getMaxHealth(); - virtual bool hurt(std::shared_ptr bossMobPart, DamageSource *source, int damage); + virtual bool hurt(shared_ptr bossMobPart, DamageSource *source, int damage); virtual bool hurt(DamageSource *source, int damage); protected: diff --git a/Minecraft.World/BossMobPart.cpp b/Minecraft.World/BossMobPart.cpp index 2f10a891..923972ad 100644 --- a/Minecraft.World/BossMobPart.cpp +++ b/Minecraft.World/BossMobPart.cpp @@ -37,7 +37,7 @@ bool BossMobPart::hurt(DamageSource *source, int damage) return bossMob->hurt( dynamic_pointer_cast( shared_from_this() ), source, damage); } -bool BossMobPart::is(std::shared_ptr other) +bool BossMobPart::is(shared_ptr other) { return shared_from_this() == other || bossMob == other.get(); } \ No newline at end of file diff --git a/Minecraft.World/BossMobPart.h b/Minecraft.World/BossMobPart.h index 7b53126f..55af809f 100644 --- a/Minecraft.World/BossMobPart.h +++ b/Minecraft.World/BossMobPart.h @@ -23,5 +23,5 @@ protected: public: virtual bool isPickable(); virtual bool hurt(DamageSource *source, int damage); - virtual bool is(std::shared_ptr other); + virtual bool is(shared_ptr other); }; \ No newline at end of file diff --git a/Minecraft.World/BottleItem.cpp b/Minecraft.World/BottleItem.cpp index 804384f7..3aecafee 100644 --- a/Minecraft.World/BottleItem.cpp +++ b/Minecraft.World/BottleItem.cpp @@ -15,7 +15,7 @@ Icon *BottleItem::getIcon(int auxValue) return Item::potion->getIcon(0); } -std::shared_ptr BottleItem::use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr BottleItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, true); if (hr == NULL) return itemInstance; @@ -40,13 +40,13 @@ std::shared_ptr BottleItem::use(std::shared_ptr item itemInstance->count--; if (itemInstance->count <= 0) { - return std::shared_ptr( new ItemInstance( (Item *)Item::potion) ); + return shared_ptr( new ItemInstance( (Item *)Item::potion) ); } else { - if (!player->inventory->add(std::shared_ptr( new ItemInstance( (Item *)Item::potion) ))) + if (!player->inventory->add(shared_ptr( new ItemInstance( (Item *)Item::potion) ))) { - player->drop( std::shared_ptr( new ItemInstance(Item::potion_Id, 1, 0) )); + player->drop( shared_ptr( new ItemInstance(Item::potion_Id, 1, 0) )); } } } @@ -60,7 +60,7 @@ std::shared_ptr BottleItem::use(std::shared_ptr item } // 4J-PB - added to allow tooltips -bool BottleItem::TestUse(Level *level, std::shared_ptr player) +bool BottleItem::TestUse(Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, true); if (hr == NULL) return false; diff --git a/Minecraft.World/BottleItem.h b/Minecraft.World/BottleItem.h index 400902e7..a8f5bc09 100644 --- a/Minecraft.World/BottleItem.h +++ b/Minecraft.World/BottleItem.h @@ -12,8 +12,8 @@ public: //@Override Icon *getIcon(int auxValue); - virtual std::shared_ptr use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); - virtual bool TestUse(Level *level, std::shared_ptr player); + virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); + virtual bool TestUse(Level *level, shared_ptr player); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/BowItem.cpp b/Minecraft.World/BowItem.cpp index f0e46c88..ed2376b0 100644 --- a/Minecraft.World/BowItem.cpp +++ b/Minecraft.World/BowItem.cpp @@ -18,7 +18,7 @@ BowItem::BowItem(int id) : Item( id ) icons = NULL; } -void BowItem::releaseUsing(std::shared_ptr itemInstance, Level *level, std::shared_ptr player, int durationLeft) +void BowItem::releaseUsing(shared_ptr itemInstance, Level *level, shared_ptr player, int durationLeft) { bool infiniteArrows = player->abilities.instabuild || EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowInfinite->id, itemInstance) > 0; @@ -30,7 +30,7 @@ void BowItem::releaseUsing(std::shared_ptr itemInstance, Level *le if (pow < 0.1) return; if (pow > 1) pow = 1; - std::shared_ptr arrow = std::shared_ptr( new Arrow(level, player, pow * 2.0f) ); + shared_ptr arrow = shared_ptr( new Arrow(level, player, pow * 2.0f) ); if (pow == 1) arrow->setCritArrow(true); int damageBonus = EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowBonus->id, itemInstance); if (damageBonus > 0) @@ -62,22 +62,22 @@ void BowItem::releaseUsing(std::shared_ptr itemInstance, Level *le } } -std::shared_ptr BowItem::useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr BowItem::useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player) { return instance; } -int BowItem::getUseDuration(std::shared_ptr itemInstance) +int BowItem::getUseDuration(shared_ptr itemInstance) { return 20 * 60 * 60; } -UseAnim BowItem::getUseAnimation(std::shared_ptr itemInstance) +UseAnim BowItem::getUseAnimation(shared_ptr itemInstance) { return UseAnim_bow; } -std::shared_ptr BowItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr BowItem::use(shared_ptr instance, Level *level, shared_ptr player) { if (player->abilities.instabuild || player->inventory->hasResource(Item::arrow_Id)) { diff --git a/Minecraft.World/BowItem.h b/Minecraft.World/BowItem.h index 76b795f9..b4eba111 100644 --- a/Minecraft.World/BowItem.h +++ b/Minecraft.World/BowItem.h @@ -18,11 +18,11 @@ private: public: BowItem(int id); - virtual void releaseUsing(std::shared_ptr itemInstance, Level *level, std::shared_ptr player, int durationLeft); - virtual std::shared_ptr useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player); - virtual int getUseDuration(std::shared_ptr itemInstance); - virtual UseAnim getUseAnimation(std::shared_ptr itemInstance); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual void releaseUsing(shared_ptr itemInstance, Level *level, shared_ptr player, int durationLeft); + virtual shared_ptr useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player); + virtual int getUseDuration(shared_ptr itemInstance); + virtual UseAnim getUseAnimation(shared_ptr itemInstance); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); virtual int getEnchantmentValue(); //@Override diff --git a/Minecraft.World/BowlFoodItem.cpp b/Minecraft.World/BowlFoodItem.cpp index 48953b3c..f8ab0605 100644 --- a/Minecraft.World/BowlFoodItem.cpp +++ b/Minecraft.World/BowlFoodItem.cpp @@ -8,9 +8,9 @@ BowlFoodItem::BowlFoodItem(int id, int nutrition) : FoodItem( id, nutrition, fal setMaxStackSize(1); } -std::shared_ptr BowlFoodItem::useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr BowlFoodItem::useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player) { FoodItem::useTimeDepleted(instance, level, player); - return std::shared_ptr(new ItemInstance(Item::bowl)); + return shared_ptr(new ItemInstance(Item::bowl)); } \ No newline at end of file diff --git a/Minecraft.World/BowlFoodItem.h b/Minecraft.World/BowlFoodItem.h index 1c488c7e..77980bc2 100644 --- a/Minecraft.World/BowlFoodItem.h +++ b/Minecraft.World/BowlFoodItem.h @@ -10,5 +10,5 @@ class BowlFoodItem : public FoodItem public: BowlFoodItem(int id, int nutrition); - std::shared_ptr useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player); + shared_ptr useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/BreedGoal.cpp b/Minecraft.World/BreedGoal.cpp index f9427ccf..2145d371 100644 --- a/Minecraft.World/BreedGoal.cpp +++ b/Minecraft.World/BreedGoal.cpp @@ -46,13 +46,13 @@ void BreedGoal::tick() if (loveTime == 20 * 3) breed(); } -std::shared_ptr BreedGoal::getFreePartner() +shared_ptr BreedGoal::getFreePartner() { float r = 8; - vector > *others = level->getEntitiesOfClass(typeid(*animal), animal->bb->grow(r, r, r)); + vector > *others = level->getEntitiesOfClass(typeid(*animal), animal->bb->grow(r, r, r)); for(AUTO_VAR(it, others->begin()); it != others->end(); ++it) { - std::shared_ptr p = dynamic_pointer_cast(*it); + shared_ptr p = dynamic_pointer_cast(*it); if (animal->canMate(p)) { delete others; @@ -65,7 +65,7 @@ std::shared_ptr BreedGoal::getFreePartner() void BreedGoal::breed() { - std::shared_ptr offspring = animal->getBreedOffspring(partner.lock()); + shared_ptr offspring = animal->getBreedOffspring(partner.lock()); animal->setDespawnProtected(); partner.lock()->setDespawnProtected(); if (offspring == NULL) @@ -76,7 +76,7 @@ void BreedGoal::breed() return; } - std::shared_ptr loveCause = animal->getLoveCause(); + shared_ptr loveCause = animal->getLoveCause(); if (loveCause == NULL && partner.lock()->getLoveCause() != NULL) { loveCause = partner.lock()->getLoveCause(); @@ -112,5 +112,5 @@ void BreedGoal::breed() * animal->bbWidth * 2 - animal->bbWidth, xa, ya, za); } // 4J-PB - Fix for 106869- Customer Encountered: TU12: Content: Gameplay: Breeding animals does not give any Experience Orbs. - level->addEntity( std::shared_ptr( new ExperienceOrb(level, animal->x, animal->y, animal->z, random->nextInt(7) + 1) ) ); + level->addEntity( shared_ptr( new ExperienceOrb(level, animal->x, animal->y, animal->z, random->nextInt(7) + 1) ) ); } diff --git a/Minecraft.World/BreedGoal.h b/Minecraft.World/BreedGoal.h index 0e07119d..d2b47e7d 100644 --- a/Minecraft.World/BreedGoal.h +++ b/Minecraft.World/BreedGoal.h @@ -23,7 +23,7 @@ public: virtual void tick(); private: - std::shared_ptr getFreePartner(); + shared_ptr getFreePartner(); void breed(); public: diff --git a/Minecraft.World/BrewingStandMenu.cpp b/Minecraft.World/BrewingStandMenu.cpp index 196b9bf8..af1fac5c 100644 --- a/Minecraft.World/BrewingStandMenu.cpp +++ b/Minecraft.World/BrewingStandMenu.cpp @@ -6,7 +6,7 @@ #include "net.minecraft.stats.h" #include "BrewingStandMenu.h" -BrewingStandMenu::BrewingStandMenu(std::shared_ptr inventory, std::shared_ptr brewingStand) +BrewingStandMenu::BrewingStandMenu(shared_ptr inventory, shared_ptr brewingStand) { tc = 0; @@ -57,14 +57,14 @@ void BrewingStandMenu::setData(int id, int value) if (id == 0) brewingStand->setBrewTime(value); } -bool BrewingStandMenu::stillValid(std::shared_ptr player) +bool BrewingStandMenu::stillValid(shared_ptr player) { return brewingStand->stillValid(player); } -std::shared_ptr BrewingStandMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr BrewingStandMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = slots->at(slotIndex); Slot *IngredientSlot = slots->at(INGREDIENT_SLOT); Slot *PotionSlot1 = slots->at(BOTTLE_SLOT_START); @@ -73,7 +73,7 @@ std::shared_ptr BrewingStandMenu::quickMoveStack(std::shared_ptr

hasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if ((slotIndex >= BOTTLE_SLOT_START && slotIndex <= BOTTLE_SLOT_END) || (slotIndex == INGREDIENT_SLOT)) @@ -101,7 +101,7 @@ std::shared_ptr BrewingStandMenu::quickMoveStack(std::shared_ptr

= INV_SLOT_START && slotIndex < INV_SLOT_END) { // 4J-PB - if the item is an ingredient, quickmove it into the ingredient slot - if( (Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherStalkSeeds_Id) ) && + if( (Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherStalkSeeds_Id) ) && (!IngredientSlot->hasItem() || (stack->id==IngredientSlot->getItem()->id) ) ) { if(!moveItemStackTo(stack, INGREDIENT_SLOT, INGREDIENT_SLOT+1, false)) @@ -125,7 +125,7 @@ std::shared_ptr BrewingStandMenu::quickMoveStack(std::shared_ptr

= USE_ROW_SLOT_START && slotIndex < USE_ROW_SLOT_END) { // 4J-PB - if the item is an ingredient, quickmove it into the ingredient slot - if((Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherStalkSeeds_Id)) && + if((Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherStalkSeeds_Id)) && (!IngredientSlot->hasItem() || (stack->id==IngredientSlot->getItem()->id) )) { if(!moveItemStackTo(stack, INGREDIENT_SLOT, INGREDIENT_SLOT+1, false)) @@ -140,7 +140,7 @@ std::shared_ptr BrewingStandMenu::quickMoveStack(std::shared_ptr

BrewingStandMenu::quickMoveStack(std::shared_ptr

player, std::shared_ptr container, int slot, int x, int y) : Slot(container, slot, x, y) +BrewingStandMenu::PotionSlot::PotionSlot(shared_ptr player, shared_ptr container, int slot, int x, int y) : Slot(container, slot, x, y) { this->player = player; } -bool BrewingStandMenu::PotionSlot::mayPlace(std::shared_ptr item) +bool BrewingStandMenu::PotionSlot::mayPlace(shared_ptr item) { return mayPlaceItem(item); } @@ -188,7 +188,7 @@ int BrewingStandMenu::PotionSlot::getMaxStackSize() return 1; } -void BrewingStandMenu::PotionSlot::onTake(std::shared_ptr player, std::shared_ptr carried) +void BrewingStandMenu::PotionSlot::onTake(shared_ptr player, shared_ptr carried) { carried->onCraftedBy(this->player->level, dynamic_pointer_cast( this->player->shared_from_this() ), 1); if (carried->id == Item::potion_Id && carried->getAuxValue() > 0) @@ -196,23 +196,23 @@ void BrewingStandMenu::PotionSlot::onTake(std::shared_ptr player, std::s Slot::onTake(player, carried); } -bool BrewingStandMenu::PotionSlot::mayCombine(std::shared_ptr second) +bool BrewingStandMenu::PotionSlot::mayCombine(shared_ptr second) { return false; } -bool BrewingStandMenu::PotionSlot::mayPlaceItem(std::shared_ptr item) +bool BrewingStandMenu::PotionSlot::mayPlaceItem(shared_ptr item) { return item != NULL && (item->id == Item::potion_Id || item->id == Item::glassBottle_Id); } -BrewingStandMenu::IngredientsSlot::IngredientsSlot(std::shared_ptr container, int slot, int x, int y) : Slot(container, slot, x ,y) +BrewingStandMenu::IngredientsSlot::IngredientsSlot(shared_ptr container, int slot, int x, int y) : Slot(container, slot, x ,y) { } -bool BrewingStandMenu::IngredientsSlot::mayPlace(std::shared_ptr item) +bool BrewingStandMenu::IngredientsSlot::mayPlace(shared_ptr item) { if (item != NULL) { @@ -228,7 +228,7 @@ bool BrewingStandMenu::IngredientsSlot::mayPlace(std::shared_ptr i return false; } -bool BrewingStandMenu::IngredientsSlot::mayCombine(std::shared_ptr second) +bool BrewingStandMenu::IngredientsSlot::mayCombine(shared_ptr second) { return false; } diff --git a/Minecraft.World/BrewingStandMenu.h b/Minecraft.World/BrewingStandMenu.h index 7a981acb..1f8d705d 100644 --- a/Minecraft.World/BrewingStandMenu.h +++ b/Minecraft.World/BrewingStandMenu.h @@ -21,11 +21,11 @@ public: static const int USE_ROW_SLOT_END = USE_ROW_SLOT_START + 9; private: - std::shared_ptr brewingStand; + shared_ptr brewingStand; Slot *ingredientSlot; public: - BrewingStandMenu(std::shared_ptr inventory, std::shared_ptr brewingStand); + BrewingStandMenu(shared_ptr inventory, shared_ptr brewingStand); private: int tc; @@ -34,32 +34,32 @@ public: virtual void addSlotListener(ContainerListener *listener); virtual void broadcastChanges(); virtual void setData(int id, int value); - virtual bool stillValid(std::shared_ptr player); - virtual std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); + virtual bool stillValid(shared_ptr player); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); private: class PotionSlot : public Slot { private: - std::shared_ptr player; + shared_ptr player; public: - PotionSlot(std::shared_ptr player, std::shared_ptr container, int slot, int x, int y); + PotionSlot(shared_ptr player, shared_ptr container, int slot, int x, int y); - virtual bool mayPlace(std::shared_ptr item); + virtual bool mayPlace(shared_ptr item); virtual int getMaxStackSize(); - virtual void onTake(std::shared_ptr player, std::shared_ptr carried); - static bool mayPlaceItem(std::shared_ptr item); - virtual bool mayCombine(std::shared_ptr item); // 4J Added + virtual void onTake(shared_ptr player, shared_ptr carried); + static bool mayPlaceItem(shared_ptr item); + virtual bool mayCombine(shared_ptr item); // 4J Added }; class IngredientsSlot : public Slot { public: - IngredientsSlot(std::shared_ptr container, int slot, int x, int y); + IngredientsSlot(shared_ptr container, int slot, int x, int y); - virtual bool mayPlace(std::shared_ptr item); + virtual bool mayPlace(shared_ptr item); virtual int getMaxStackSize(); - virtual bool mayCombine(std::shared_ptr item); // 4J Added + virtual bool mayCombine(shared_ptr item); // 4J Added }; }; \ No newline at end of file diff --git a/Minecraft.World/BrewingStandTile.cpp b/Minecraft.World/BrewingStandTile.cpp index 2a6fd2cd..5f09ba02 100644 --- a/Minecraft.World/BrewingStandTile.cpp +++ b/Minecraft.World/BrewingStandTile.cpp @@ -29,9 +29,9 @@ int BrewingStandTile::getRenderShape() return SHAPE_BREWING_STAND; } -std::shared_ptr BrewingStandTile::newTileEntity(Level *level) +shared_ptr BrewingStandTile::newTileEntity(Level *level) { - return std::shared_ptr(new BrewingStandTileEntity()); + return shared_ptr(new BrewingStandTileEntity()); } bool BrewingStandTile::isCubeShaped() @@ -39,7 +39,7 @@ bool BrewingStandTile::isCubeShaped() return false; } -void BrewingStandTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void BrewingStandTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { setShape(7.0f / 16.0f, 0, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); EntityTile::addAABBs(level, x, y, z, box, boxes, source); @@ -52,7 +52,7 @@ void BrewingStandTile::updateDefaultShape() setShape(0, 0, 0, 1, 2.0f / 16.0f, 1); } -bool BrewingStandTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool BrewingStandTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if(soundOnly) return false; @@ -60,7 +60,7 @@ bool BrewingStandTile::use(Level *level, int x, int y, int z, std::shared_ptr brewingStand = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + shared_ptr brewingStand = dynamic_pointer_cast(level->getTileEntity(x, y, z)); if (brewingStand != NULL) player->openBrewingStand(brewingStand); return true; @@ -78,13 +78,13 @@ void BrewingStandTile::animateTick(Level *level, int xt, int yt, int zt, Random void BrewingStandTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - std::shared_ptr tileEntity = level->getTileEntity(x, y, z); + shared_ptr tileEntity = level->getTileEntity(x, y, z); if (tileEntity != NULL && ( dynamic_pointer_cast(tileEntity) != NULL) ) { - std::shared_ptr container = dynamic_pointer_cast(tileEntity); + shared_ptr container = dynamic_pointer_cast(tileEntity); for (int i = 0; i < container->getContainerSize(); i++) { - std::shared_ptr item = container->getItem(i); + shared_ptr item = container->getItem(i); if (item != NULL) { float xo = random->nextFloat() * 0.8f + 0.1f; @@ -97,7 +97,7 @@ void BrewingStandTile::onRemove(Level *level, int x, int y, int z, int id, int d if (count > item->count) count = item->count; item->count -= count; - std::shared_ptr itemEntity = std::shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, std::shared_ptr( new ItemInstance(item->id, count, item->getAuxValue())))); + shared_ptr itemEntity = shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue())))); float pow = 0.05f; itemEntity->xd = (float) random->nextGaussian() * pow; itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; diff --git a/Minecraft.World/BrewingStandTile.h b/Minecraft.World/BrewingStandTile.h index 1d842e98..fc8ff462 100644 --- a/Minecraft.World/BrewingStandTile.h +++ b/Minecraft.World/BrewingStandTile.h @@ -18,11 +18,11 @@ public: ~BrewingStandTile(); virtual bool isSolidRender(bool isServerLevel = false); virtual int getRenderShape(); - virtual std::shared_ptr newTileEntity(Level *level); + virtual shared_ptr newTileEntity(Level *level); virtual bool isCubeShaped(); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual void updateDefaultShape(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); virtual int getResource(int data, Random *random, int playerBonusLevel); diff --git a/Minecraft.World/BrewingStandTileEntity.cpp b/Minecraft.World/BrewingStandTileEntity.cpp index 98334f78..20cb3737 100644 --- a/Minecraft.World/BrewingStandTileEntity.cpp +++ b/Minecraft.World/BrewingStandTileEntity.cpp @@ -79,7 +79,7 @@ bool BrewingStandTileEntity::isBrewable() { return false; } - std::shared_ptr ingredient = items[INGREDIENT_SLOT]; + shared_ptr ingredient = items[INGREDIENT_SLOT]; if (PotionBrewing::SIMPLIFIED_BREWING) { if (!Item::items[ingredient->id]->hasPotionBrewingFormula()) @@ -135,7 +135,7 @@ bool BrewingStandTileEntity::isBrewable() } else { - if (!Item::items[ingredient->id]->hasPotionBrewingFormula() && ingredient->id != Item::bucket_water_Id && ingredient->id != Item::netherStalkSeeds_Id) + if (!Item::items[ingredient->id]->hasPotionBrewingFormula() && ingredient->id != Item::bucket_water_Id && ingredient->id != Item::netherStalkSeeds_Id) { return false; } @@ -172,7 +172,7 @@ void BrewingStandTileEntity::doBrew() return; } - std::shared_ptr ingredient = items[INGREDIENT_SLOT]; + shared_ptr ingredient = items[INGREDIENT_SLOT]; if (PotionBrewing::SIMPLIFIED_BREWING) { @@ -233,14 +233,14 @@ void BrewingStandTileEntity::doBrew() } else if (isWater && items[dest] != NULL && items[dest]->id == Item::glassBottle_Id) { - items[dest] = std::shared_ptr(new ItemInstance(Item::potion)); + items[dest] = shared_ptr(new ItemInstance(Item::potion)); } } } if (Item::items[ingredient->id]->hasCraftingRemainingItem()) { - items[INGREDIENT_SLOT] = std::shared_ptr(new ItemInstance(Item::items[ingredient->id]->getCraftingRemainingItem())); + items[INGREDIENT_SLOT] = shared_ptr(new ItemInstance(Item::items[ingredient->id]->getCraftingRemainingItem())); } else { @@ -252,7 +252,7 @@ void BrewingStandTileEntity::doBrew() } } -int BrewingStandTileEntity::applyIngredient(int currentBrew, std::shared_ptr ingredient) +int BrewingStandTileEntity::applyIngredient(int currentBrew, shared_ptr ingredient) { if (ingredient == NULL) { @@ -278,7 +278,7 @@ int BrewingStandTileEntity::applyIngredient(int currentBrew, std::shared_ptrputByte(L"Slot", (byte) i); @@ -316,7 +316,7 @@ void BrewingStandTileEntity::save(CompoundTag *base) base->put(L"Items", listTag); } -std::shared_ptr BrewingStandTileEntity::getItem(unsigned int slot) +shared_ptr BrewingStandTileEntity::getItem(unsigned int slot) { if (slot >= 0 && slot < items.length) { @@ -325,7 +325,7 @@ std::shared_ptr BrewingStandTileEntity::getItem(unsigned int slot) return nullptr; } -std::shared_ptr BrewingStandTileEntity::removeItem(unsigned int slot, int count) +shared_ptr BrewingStandTileEntity::removeItem(unsigned int slot, int count) { // 4J Stu - Changed the implementation of this function to be the same as ChestTileEntity to enable the "Pickup Half" // option on the ingredients slot @@ -333,18 +333,18 @@ std::shared_ptr BrewingStandTileEntity::removeItem(unsigned int sl if (slot >= 0 && slot < items.length && items[slot] != NULL) { - if (items[slot]->count <= count) + if (items[slot]->count <= count) { - std::shared_ptr item = items[slot]; + shared_ptr item = items[slot]; items[slot] = nullptr; this->setChanged(); // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; - } - else + } + else { - std::shared_ptr i = items[slot]->remove(count); + shared_ptr i = items[slot]->remove(count); if (items[slot]->count == 0) items[slot] = nullptr; this->setChanged(); // 4J Stu - Fix for duplication glitch @@ -354,19 +354,19 @@ std::shared_ptr BrewingStandTileEntity::removeItem(unsigned int sl } return nullptr; } - -std::shared_ptr BrewingStandTileEntity::removeItemNoUpdate(int slot) + +shared_ptr BrewingStandTileEntity::removeItemNoUpdate(int slot) { if (slot >= 0 && slot < items.length) { - std::shared_ptr item = items[slot]; + shared_ptr item = items[slot]; items[slot] = nullptr; return item; } return nullptr; } -void BrewingStandTileEntity::setItem(unsigned int slot, std::shared_ptr item) +void BrewingStandTileEntity::setItem(unsigned int slot, shared_ptr item) { if (slot >= 0 && slot < items.length) { @@ -379,7 +379,7 @@ int BrewingStandTileEntity::getMaxStackSize() return 1; } -bool BrewingStandTileEntity::stillValid(std::shared_ptr player) +bool BrewingStandTileEntity::stillValid(shared_ptr player) { if (level->getTileEntity(x, y, z) != shared_from_this()) return false; if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; @@ -413,9 +413,9 @@ int BrewingStandTileEntity::getPotionBits() } // 4J Added -std::shared_ptr BrewingStandTileEntity::clone() +shared_ptr BrewingStandTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new BrewingStandTileEntity() ); + shared_ptr result = shared_ptr( new BrewingStandTileEntity() ); TileEntity::clone(result); result->brewTime = brewTime; diff --git a/Minecraft.World/BrewingStandTileEntity.h b/Minecraft.World/BrewingStandTileEntity.h index 91a2934c..733e1073 100644 --- a/Minecraft.World/BrewingStandTileEntity.h +++ b/Minecraft.World/BrewingStandTileEntity.h @@ -29,17 +29,17 @@ private: bool isBrewable(); void doBrew(); - int applyIngredient(int currentBrew, std::shared_ptr ingredient); - + int applyIngredient(int currentBrew, shared_ptr ingredient); + public: virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); - virtual std::shared_ptr getItem(unsigned int slot); - virtual std::shared_ptr removeItem(unsigned int slot, int i); - virtual std::shared_ptr removeItemNoUpdate(int slot); - virtual void setItem(unsigned int slot, std::shared_ptr item); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int i); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); virtual int getMaxStackSize(); - virtual bool stillValid(std::shared_ptr player); + virtual bool stillValid(shared_ptr player); virtual void startOpen(); virtual void stopOpen(); virtual void setBrewTime(int value); @@ -47,5 +47,5 @@ public: int getPotionBits(); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); }; \ No newline at end of file diff --git a/Minecraft.World/BucketItem.cpp b/Minecraft.World/BucketItem.cpp index 0aac9c83..d3570cd7 100644 --- a/Minecraft.World/BucketItem.cpp +++ b/Minecraft.World/BucketItem.cpp @@ -24,7 +24,7 @@ BucketItem::BucketItem(int id, int content) : Item( id ) this->content = content; } -bool BucketItem::TestUse(Level *level, std::shared_ptr player) +bool BucketItem::TestUse(Level *level, shared_ptr player) { // double x = player->xo + (player->x - player->xo); // double y = player->yo + (player->y - player->yo) + 1.62 - player->heightOffset; @@ -47,7 +47,7 @@ bool BucketItem::TestUse(Level *level, std::shared_ptr player) } if (content == 0) - { + { if (!player->mayBuild(xt, yt, zt)) return false; if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0) { @@ -73,7 +73,7 @@ bool BucketItem::TestUse(Level *level, std::shared_ptr player) if (hr->f == 3) zt++; if (hr->f == 4) xt--; if (hr->f == 5) xt++; - + if (!player->mayBuild(xt, yt, zt)) return false; if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid()) @@ -99,7 +99,7 @@ bool BucketItem::TestUse(Level *level, std::shared_ptr player) return false; } -std::shared_ptr BucketItem::use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr BucketItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) { float a = 1; @@ -120,19 +120,19 @@ std::shared_ptr BucketItem::use(std::shared_ptr item if (!level->mayInteract(player, xt, yt, zt,content)) { app.DebugPrintf("!!!!!!!!!!! Can't place that here\n"); - std::shared_ptr servPlayer = dynamic_pointer_cast(player); + shared_ptr servPlayer = dynamic_pointer_cast(player); if( servPlayer != NULL ) { app.DebugPrintf("Sending ChatPacket::e_ChatCannotPlaceLava to player\n"); - servPlayer->connection->send( std::shared_ptr( new ChatPacket(L"", ChatPacket::e_ChatCannotPlaceLava ) ) ); + servPlayer->connection->send( shared_ptr( new ChatPacket(L"", ChatPacket::e_ChatCannotPlaceLava ) ) ); } - + delete hr; return itemInstance; } if (content == 0) - { + { if (!player->mayBuild(xt, yt, zt)) return itemInstance; if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0) { @@ -145,13 +145,13 @@ std::shared_ptr BucketItem::use(std::shared_ptr item if (--itemInstance->count <= 0) { - return std::shared_ptr( new ItemInstance(Item::bucket_water) ); + return shared_ptr( new ItemInstance(Item::bucket_water) ); } else { - if (!player->inventory->add(std::shared_ptr( new ItemInstance(Item::bucket_water)))) + if (!player->inventory->add(shared_ptr( new ItemInstance(Item::bucket_water)))) { - player->drop(std::shared_ptr(new ItemInstance(Item::bucket_water_Id, 1, 0))); + player->drop(shared_ptr(new ItemInstance(Item::bucket_water_Id, 1, 0))); } return itemInstance; } @@ -160,7 +160,7 @@ std::shared_ptr BucketItem::use(std::shared_ptr item { if( level->dimension->id == -1 ) player->awardStat( - GenericStats::netherLavaCollected(), + GenericStats::netherLavaCollected(), GenericStats::param_noArgs() ); @@ -172,13 +172,13 @@ std::shared_ptr BucketItem::use(std::shared_ptr item } if (--itemInstance->count <= 0) { - return std::shared_ptr( new ItemInstance(Item::bucket_lava) ); + return shared_ptr( new ItemInstance(Item::bucket_lava) ); } else { - if (!player->inventory->add(std::shared_ptr( new ItemInstance(Item::bucket_lava)))) + if (!player->inventory->add(shared_ptr( new ItemInstance(Item::bucket_lava)))) { - player->drop(std::shared_ptr(new ItemInstance(Item::bucket_lava_Id, 1, 0))); + player->drop(shared_ptr(new ItemInstance(Item::bucket_lava_Id, 1, 0))); } return itemInstance; } @@ -187,7 +187,7 @@ std::shared_ptr BucketItem::use(std::shared_ptr item else if (content < 0) { delete hr; - return std::shared_ptr( new ItemInstance(Item::bucket_empty) ); + return shared_ptr( new ItemInstance(Item::bucket_empty) ); } else { @@ -197,13 +197,13 @@ std::shared_ptr BucketItem::use(std::shared_ptr item if (hr->f == 3) zt++; if (hr->f == 4) xt--; if (hr->f == 5) xt++; - + if (!player->mayBuild(xt, yt, zt)) return itemInstance; if (emptyBucket(level, x, y, z, xt, yt, zt) && !player->abilities.instabuild) { - return std::shared_ptr( new ItemInstance(Item::bucket_empty) ); + return shared_ptr( new ItemInstance(Item::bucket_empty) ); } } @@ -217,13 +217,13 @@ std::shared_ptr BucketItem::use(std::shared_ptr item delete hr; if (--itemInstance->count <= 0) { - return std::shared_ptr( new ItemInstance(Item::milk) ); + return shared_ptr( new ItemInstance(Item::milk) ); } else { - if (!player->inventory->add(std::shared_ptr( new ItemInstance(Item::milk)))) + if (!player->inventory->add(shared_ptr( new ItemInstance(Item::milk)))) { - player->drop(std::shared_ptr(new ItemInstance(Item::milk_Id, 1, 0))); + player->drop(shared_ptr(new ItemInstance(Item::milk_Id, 1, 0))); } return itemInstance; } @@ -234,22 +234,22 @@ std::shared_ptr BucketItem::use(std::shared_ptr item return itemInstance; } -bool BucketItem::emptyBucket(Level *level, double x, double y, double z, int xt, int yt, int zt) +bool BucketItem::emptyBucket(Level *level, double x, double y, double z, int xt, int yt, int zt) { if (content <= 0) return false; - if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid()) + if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid()) { - if (level->dimension->ultraWarm && content == Tile::water_Id) + if (level->dimension->ultraWarm && content == Tile::water_Id) { level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); - for (int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { level->addParticle(eParticleType_largesmoke, xt + Math::random(), yt + Math::random(), zt + Math::random(), 0, 0, 0); } - } - else + } + else { level->setTileAndData(xt, yt, zt, content, 0); } diff --git a/Minecraft.World/BucketItem.h b/Minecraft.World/BucketItem.h index f865ba21..500d19d8 100644 --- a/Minecraft.World/BucketItem.h +++ b/Minecraft.World/BucketItem.h @@ -13,8 +13,8 @@ private: public: BucketItem(int id, int content); - virtual bool TestUse(Level *level, std::shared_ptr player); - virtual std::shared_ptr use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); + virtual bool TestUse(Level *level, shared_ptr player); + virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); // TU9 bool emptyBucket(Level *level, double x, double y, double z, int xt, int yt, int zt); diff --git a/Minecraft.World/ButtonTile.cpp b/Minecraft.World/ButtonTile.cpp index d6192650..16055a7e 100644 --- a/Minecraft.World/ButtonTile.cpp +++ b/Minecraft.World/ButtonTile.cpp @@ -141,7 +141,7 @@ bool ButtonTile::checkCanSurvive(Level *level, int x, int y, int z) return true; } -void ButtonTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void ButtonTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { int data = level->getData(x, y, z); updateShape(data); @@ -176,7 +176,7 @@ void ButtonTile::updateShape(int data) } } -void ButtonTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void ButtonTile::attack(Level *level, int x, int y, int z, shared_ptr player) { //use(level, x, y, z, player, 0, 0, 0, 0); } @@ -187,7 +187,7 @@ bool ButtonTile::TestUse() return true; } -bool ButtonTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool ButtonTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) { @@ -279,7 +279,7 @@ void ButtonTile::updateDefaultShape() setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); } -void ButtonTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void ButtonTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { if (level->isClientSide) return; if (!sensitive) return; @@ -301,7 +301,7 @@ void ButtonTile::checkPressed(Level *level, int x, int y, int z) updateShape(data); Tile::ThreadStorage *tls = (Tile::ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); - vector > *entities = level->getEntitiesOfClass(typeid(Arrow), AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1)); + vector > *entities = level->getEntitiesOfClass(typeid(Arrow), AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1)); shouldBePressed = !entities->empty(); delete entities; diff --git a/Minecraft.World/ButtonTile.h b/Minecraft.World/ButtonTile.h index 0721c05c..e06158e0 100644 --- a/Minecraft.World/ButtonTile.h +++ b/Minecraft.World/ButtonTile.h @@ -37,22 +37,22 @@ private: bool checkCanSurvive(Level *level, int x, int y, int z); public: - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param private: void updateShape(int data); public: - virtual void attack(Level *level, int x, int y, int z, std::shared_ptr player); + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual void onRemove(Level *level, int x, int y, int z, int id, int data); virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); virtual bool isSignalSource(); virtual void tick(Level *level, int x, int y, int z, Random *random); virtual void updateDefaultShape(); - void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + void entityInside(Level *level, int x, int y, int z, shared_ptr entity); private: void checkPressed(Level *level, int x, int y, int z); @@ -60,7 +60,7 @@ private: public: void registerIcons(IconRegister *iconRegister); - + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); }; \ No newline at end of file diff --git a/Minecraft.World/CactusTile.cpp b/Minecraft.World/CactusTile.cpp index 69190b50..b72570e1 100644 --- a/Minecraft.World/CactusTile.cpp +++ b/Minecraft.World/CactusTile.cpp @@ -18,7 +18,7 @@ CactusTile::CactusTile(int id) : Tile(id, Material::cactus,isSolidRender()) void CactusTile::tick(Level *level, int x, int y, int z, Random *random) { if (level->isEmptyTile(x, y + 1, z)) - { + { int height = 1; while (level->getTile(x, y - height, z) == id) { @@ -100,7 +100,7 @@ bool CactusTile::canSurvive(Level *level, int x, int y, int z) return below == Tile::cactus_Id || below == Tile::sand_Id; } -void CactusTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void CactusTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { entity->hurt(DamageSource::cactus, 1); } diff --git a/Minecraft.World/CactusTile.h b/Minecraft.World/CactusTile.h index 4fe1e6e0..3c5e9b49 100644 --- a/Minecraft.World/CactusTile.h +++ b/Minecraft.World/CactusTile.h @@ -30,10 +30,10 @@ public: virtual bool mayPlace(Level *level, int x, int y, int z); virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual bool canSurvive(Level *level, int x, int y, int z); - virtual void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); //@Override void registerIcons(IconRegister *iconRegister); - + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); }; \ No newline at end of file diff --git a/Minecraft.World/CakeTile.cpp b/Minecraft.World/CakeTile.cpp index b857be3b..1254e10e 100644 --- a/Minecraft.World/CakeTile.cpp +++ b/Minecraft.World/CakeTile.cpp @@ -18,7 +18,7 @@ CakeTile::CakeTile(int id) : Tile(id, Material::cake,isSolidRender()) iconInner = NULL; } -void CakeTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void CakeTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { int d = level->getData(x, y, z); float r = 1 / 16.0f; @@ -84,19 +84,19 @@ bool CakeTile::TestUse() return true; } -bool CakeTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool CakeTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly ) return false; eat(level, x, y, z, player); return true; } -void CakeTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void CakeTile::attack(Level *level, int x, int y, int z, shared_ptr player) { eat(level, x, y, z, player); } -void CakeTile::eat(Level *level, int x, int y, int z, std::shared_ptr player) +void CakeTile::eat(Level *level, int x, int y, int z, shared_ptr player) { if (player->canEat(false)) { diff --git a/Minecraft.World/CakeTile.h b/Minecraft.World/CakeTile.h index d8f36b2b..7f03577d 100644 --- a/Minecraft.World/CakeTile.h +++ b/Minecraft.World/CakeTile.h @@ -20,7 +20,7 @@ private: protected: CakeTile(int id); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual void updateDefaultShape(); virtual AABB *getAABB(Level *level, int x, int y, int z); virtual AABB *getTileAABB(Level *level, int x, int y, int z); @@ -30,10 +30,10 @@ protected: virtual bool isCubeShaped(); virtual bool isSolidRender(bool isServerLevel = false); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void attack(Level *level, int x, int y, int z, std::shared_ptr player); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); private: - void eat(Level *level, int x, int y, int z, std::shared_ptr player); + void eat(Level *level, int x, int y, int z, shared_ptr player); public: virtual bool mayPlace(Level *level, int x, int y, int z); virtual void neighborChanged(Level *level, int x, int y, int z, int type); diff --git a/Minecraft.World/CarrotOnAStickItem.cpp b/Minecraft.World/CarrotOnAStickItem.cpp index a0fbdcf6..9845cc25 100644 --- a/Minecraft.World/CarrotOnAStickItem.cpp +++ b/Minecraft.World/CarrotOnAStickItem.cpp @@ -21,11 +21,11 @@ bool CarrotOnAStickItem::isMirroredArt() return true; } -std::shared_ptr CarrotOnAStickItem::use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr CarrotOnAStickItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) { if (player->isRiding()) { - std::shared_ptr pig = dynamic_pointer_cast(player->riding); + shared_ptr pig = dynamic_pointer_cast(player->riding); if(pig) { if (pig->getControlGoal()->canBoost() && itemInstance->getMaxDamage() - itemInstance->getAuxValue() >= 7) @@ -35,7 +35,7 @@ std::shared_ptr CarrotOnAStickItem::use(std::shared_ptrcount == 0) { - std::shared_ptr replacement = std::shared_ptr(new ItemInstance(Item::fishingRod)); + shared_ptr replacement = shared_ptr(new ItemInstance(Item::fishingRod)); replacement->setTag(itemInstance->tag); return replacement; } diff --git a/Minecraft.World/CarrotOnAStickItem.h b/Minecraft.World/CarrotOnAStickItem.h index ef58c40f..5e98f592 100644 --- a/Minecraft.World/CarrotOnAStickItem.h +++ b/Minecraft.World/CarrotOnAStickItem.h @@ -9,5 +9,5 @@ public: bool isHandEquipped(); bool isMirroredArt(); - std::shared_ptr use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); + shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/CauldronTile.cpp b/Minecraft.World/CauldronTile.cpp index 1ff5d9b0..4d5640ca 100644 --- a/Minecraft.World/CauldronTile.cpp +++ b/Minecraft.World/CauldronTile.cpp @@ -46,7 +46,7 @@ Icon *CauldronTile::getTexture(const wstring &name) return NULL; } -void CauldronTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void CauldronTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { setShape(0, 0, 0, 1, 5.0f / 16.0f, 1); Tile::addAABBs(level, x, y, z, box, boxes, source); @@ -83,7 +83,7 @@ bool CauldronTile::isCubeShaped() return false; } -bool CauldronTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool CauldronTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if(soundOnly) return false; @@ -92,7 +92,7 @@ bool CauldronTile::use(Level *level, int x, int y, int z, std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); if (item == NULL) { return true; @@ -106,7 +106,7 @@ bool CauldronTile::use(Level *level, int x, int y, int z, std::shared_ptrabilities.instabuild) { - player->inventory->setItem(player->inventory->selected, std::shared_ptr(new ItemInstance(Item::bucket_empty))); + player->inventory->setItem(player->inventory->selected, shared_ptr(new ItemInstance(Item::bucket_empty))); } level->setData(x, y, z, 3); @@ -117,10 +117,10 @@ bool CauldronTile::use(Level *level, int x, int y, int z, std::shared_ptr 0) { - std::shared_ptr potion = std::shared_ptr(new ItemInstance(Item::potion, 1, 0)); + shared_ptr potion = shared_ptr(new ItemInstance(Item::potion, 1, 0)); if (!player->inventory->add(potion)) { - level->addEntity(std::shared_ptr(new ItemEntity(level, x + 0.5, y + 1.5, z + 0.5, potion))); + level->addEntity(shared_ptr(new ItemEntity(level, x + 0.5, y + 1.5, z + 0.5, potion))); } // 4J Stu - Brought forward change to update inventory when filling bottles with water else if (dynamic_pointer_cast( player ) != NULL) diff --git a/Minecraft.World/CauldronTile.h b/Minecraft.World/CauldronTile.h index 61c98de3..4ed3fc90 100644 --- a/Minecraft.World/CauldronTile.h +++ b/Minecraft.World/CauldronTile.h @@ -21,12 +21,12 @@ public: //@Override void registerIcons(IconRegister *iconRegister); static Icon *getTexture(const wstring &name); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual void updateDefaultShape(); virtual bool isSolidRender(bool isServerLevel = false); virtual int getRenderShape(); virtual bool isCubeShaped(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual void handleRain(Level *level, int x, int y, int z); virtual int getResource(int data, Random *random, int playerBonusLevel); virtual int cloneTileId(Level *level, int x, int y, int z); diff --git a/Minecraft.World/CaveSpider.cpp b/Minecraft.World/CaveSpider.cpp index 4bf98956..5f7c6028 100644 --- a/Minecraft.World/CaveSpider.cpp +++ b/Minecraft.World/CaveSpider.cpp @@ -28,7 +28,7 @@ float CaveSpider::getModelScale() } -bool CaveSpider::doHurtTarget(std::shared_ptr target) +bool CaveSpider::doHurtTarget(shared_ptr target) { if (Spider::doHurtTarget(target)) { diff --git a/Minecraft.World/CaveSpider.h b/Minecraft.World/CaveSpider.h index de9cf370..26f07e5f 100644 --- a/Minecraft.World/CaveSpider.h +++ b/Minecraft.World/CaveSpider.h @@ -13,6 +13,6 @@ class CaveSpider : public Spider virtual int getMaxHealth(); virtual float getModelScale(); - virtual bool doHurtTarget(std::shared_ptr target); + virtual bool doHurtTarget(shared_ptr target); void finalizeMobSpawn(); }; \ No newline at end of file diff --git a/Minecraft.World/ChatPacket.h b/Minecraft.World/ChatPacket.h index 2481e903..c480dfd0 100644 --- a/Minecraft.World/ChatPacket.h +++ b/Minecraft.World/ChatPacket.h @@ -92,7 +92,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ChatPacket()); } + static shared_ptr create() { return shared_ptr(new ChatPacket()); } virtual int getId() { return 3; } }; diff --git a/Minecraft.World/ChestTile.cpp b/Minecraft.World/ChestTile.cpp index 9c462713..b7964e72 100644 --- a/Minecraft.World/ChestTile.cpp +++ b/Minecraft.World/ChestTile.cpp @@ -37,7 +37,7 @@ int ChestTile::getRenderShape() return Tile::SHAPE_ENTITYTILE_ANIMATED; } -void ChestTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) +void ChestTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) { if (level->getTile(x, y, z - 1) == id) { @@ -76,7 +76,7 @@ void ChestTile::onPlace(Level *level, int x, int y, int z) if (e == id) recalcLockDir(level, x + 1, y, z); } -void ChestTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void ChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int n = level->getTile(x, y, z - 1); // face = 2 int s = level->getTile(x, y, z + 1); // face = 3 @@ -200,18 +200,18 @@ bool ChestTile::isFullChest(Level *level, int x, int y, int z) void ChestTile::neighborChanged(Level *level, int x, int y, int z, int type) { EntityTile::neighborChanged(level, x, y, z, type); - std::shared_ptr(cte) = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + shared_ptr(cte) = dynamic_pointer_cast(level->getTileEntity(x, y, z)); if (cte != NULL) cte->clearCache(); } void ChestTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - std::shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if (container != NULL ) { for (unsigned int i = 0; i < container->getContainerSize(); i++) { - std::shared_ptr item = container->getItem(i); + shared_ptr item = container->getItem(i); if (item != NULL) { float xo = random->nextFloat() * 0.8f + 0.1f; @@ -224,9 +224,9 @@ void ChestTile::onRemove(Level *level, int x, int y, int z, int id, int data) if (count > item->count) count = item->count; item->count -= count; - std::shared_ptr newItem = std::shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ); + shared_ptr newItem = shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ); newItem->set4JData( item->get4JData() ); - std::shared_ptr itemEntity = std::shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, newItem ) ); + shared_ptr itemEntity = shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, newItem ) ); float pow = 0.05f; itemEntity->xd = (float) random->nextGaussian() * pow; itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; @@ -254,7 +254,7 @@ bool ChestTile::TestUse() } // 4J-PB - changing to 1.5 equivalent -bool ChestTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool ChestTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly ) return true; @@ -263,21 +263,21 @@ bool ChestTile::use(Level *level, int x, int y, int z, std::shared_ptr p return true; } - std::shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if (container == NULL) return true; if (level->isSolidBlockingTile(x, y + 1, z)) return true; - if (isCatSittingOnChest(level,x, y, z)) return true; + if (isCatSittingOnChest(level,x, y, z)) return true; if (level->getTile(x - 1, y, z) == id && (level->isSolidBlockingTile(x - 1, y + 1, z) || isCatSittingOnChest(level, x - 1, y, z))) return true; if (level->getTile(x + 1, y, z) == id && (level->isSolidBlockingTile(x + 1, y + 1, z) || isCatSittingOnChest(level, x + 1, y, z))) return true; if (level->getTile(x, y, z - 1) == id && (level->isSolidBlockingTile(x, y + 1, z - 1) || isCatSittingOnChest(level, x, y, z - 1))) return true; if (level->getTile(x, y, z + 1) == id && (level->isSolidBlockingTile(x, y + 1, z + 1) || isCatSittingOnChest(level, x, y, z + 1))) return true; - if (level->getTile(x - 1, y, z) == id) container = std::shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x - 1, y, z) ), container) ); - if (level->getTile(x + 1, y, z) == id) container = std::shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x + 1, y, z) )) ); - if (level->getTile(x, y, z - 1) == id) container = std::shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x, y, z - 1) ), container) ); - if (level->getTile(x, y, z + 1) == id) container = std::shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x, y, z + 1) )) ); + if (level->getTile(x - 1, y, z) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x - 1, y, z) ), container) ); + if (level->getTile(x + 1, y, z) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x + 1, y, z) )) ); + if (level->getTile(x, y, z - 1) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x, y, z - 1) ), container) ); + if (level->getTile(x, y, z + 1) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x, y, z + 1) )) ); player->openContainer(container); @@ -285,12 +285,12 @@ bool ChestTile::use(Level *level, int x, int y, int z, std::shared_ptr p } // 4J-PB - added from 1.5 -bool ChestTile::isCatSittingOnChest(Level *level, int x, int y, int z) +bool ChestTile::isCatSittingOnChest(Level *level, int x, int y, int z) { - vector > *entities = level->getEntitiesOfClass(typeid(Ozelot), AABB::newTemp(x, y + 1, z, x + 1, y + 2, z + 1)); + vector > *entities = level->getEntitiesOfClass(typeid(Ozelot), AABB::newTemp(x, y + 1, z, x + 1, y + 2, z + 1)); for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - std::shared_ptr ocelot = dynamic_pointer_cast(*it); + shared_ptr ocelot = dynamic_pointer_cast(*it); if(ocelot->isSitting()) { return true; @@ -300,15 +300,15 @@ bool ChestTile::isCatSittingOnChest(Level *level, int x, int y, int z) return false; } -std::shared_ptr ChestTile::newTileEntity(Level *level) +shared_ptr ChestTile::newTileEntity(Level *level) { MemSect(50); - std::shared_ptr retval = std::shared_ptr( new ChestTileEntity() ); + shared_ptr retval = shared_ptr( new ChestTileEntity() ); MemSect(0); return retval; } -void ChestTile::registerIcons(IconRegister *iconRegister) +void ChestTile::registerIcons(IconRegister *iconRegister) { // Register wood as the chest's icon, because it's used by the particles // when destroying the chest diff --git a/Minecraft.World/ChestTile.h b/Minecraft.World/ChestTile.h index da55c503..ee2185cb 100644 --- a/Minecraft.World/ChestTile.h +++ b/Minecraft.World/ChestTile.h @@ -19,9 +19,9 @@ public: virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); virtual int getRenderShape(); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity = std::shared_ptr()); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity = shared_ptr()); virtual void onPlace(Level *level, int x, int y, int z); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); void recalcLockDir(Level *level, int x, int y, int z); virtual bool mayPlace(Level *level, int x, int y, int z); private: @@ -31,8 +31,8 @@ public: virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - std::shared_ptr newTileEntity(Level *level); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + shared_ptr newTileEntity(Level *level); //@Override void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/ChestTileEntity.cpp b/Minecraft.World/ChestTileEntity.cpp index 85a7d389..406b81b5 100644 --- a/Minecraft.World/ChestTileEntity.cpp +++ b/Minecraft.World/ChestTileEntity.cpp @@ -32,32 +32,32 @@ ChestTileEntity::~ChestTileEntity() delete items; } -unsigned int ChestTileEntity::getContainerSize() +unsigned int ChestTileEntity::getContainerSize() { return 9 * 3; } -std::shared_ptr ChestTileEntity::getItem(unsigned int slot) +shared_ptr ChestTileEntity::getItem(unsigned int slot) { return items->data[slot]; } -std::shared_ptr ChestTileEntity::removeItem(unsigned int slot, int count) +shared_ptr ChestTileEntity::removeItem(unsigned int slot, int count) { if (items->data[slot] != NULL) { - if (items->data[slot]->count <= count) + if (items->data[slot]->count <= count) { - std::shared_ptr item = items->data[slot]; + shared_ptr item = items->data[slot]; items->data[slot] = nullptr; this->setChanged(); // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; - } - else + } + else { - std::shared_ptr i = items->data[slot]->remove(count); + shared_ptr i = items->data[slot]->remove(count); if (items->data[slot]->count == 0) items->data[slot] = nullptr; this->setChanged(); // 4J Stu - Fix for duplication glitch @@ -68,18 +68,18 @@ std::shared_ptr ChestTileEntity::removeItem(unsigned int slot, int return nullptr; } -std::shared_ptr ChestTileEntity::removeItemNoUpdate(int slot) +shared_ptr ChestTileEntity::removeItemNoUpdate(int slot) { if (items->data[slot] != NULL) { - std::shared_ptr item = items->data[slot]; + shared_ptr item = items->data[slot]; items->data[slot] = nullptr; return item; } return nullptr; } -void ChestTileEntity::setItem(unsigned int slot, std::shared_ptr item) +void ChestTileEntity::setItem(unsigned int slot, shared_ptr item) { items->data[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); @@ -118,7 +118,7 @@ void ChestTileEntity::save(CompoundTag *base) for (unsigned int i = 0; i < items->length; i++) { - if (items->data[i] != NULL) + if (items->data[i] != NULL) { CompoundTag *tag = new CompoundTag(); tag->putByte(L"Slot", (byte) i); @@ -135,14 +135,14 @@ int ChestTileEntity::getMaxStackSize() return Container::LARGE_MAX_STACK_SIZE; } -bool ChestTileEntity::stillValid(std::shared_ptr player) +bool ChestTileEntity::stillValid(shared_ptr player) { if (level->getTileEntity(x, y, z) != shared_from_this() ) return false; if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; return true; } -void ChestTileEntity::setChanged() +void ChestTileEntity::setChanged() { TileEntity::setChanged(); } @@ -208,7 +208,7 @@ void ChestTileEntity::tick() if (s.lock() != NULL) zc += 0.5; if (e.lock() != NULL) xc += 0.5; - // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit + // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_OPEN, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); } } @@ -233,7 +233,7 @@ void ChestTileEntity::tick() if (s.lock() != NULL) zc += 0.5; if (e.lock() != NULL) xc += 0.5; - // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit + // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_CLOSE, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); } } @@ -273,9 +273,9 @@ void ChestTileEntity::setRemoved() } // 4J Added -std::shared_ptr ChestTileEntity::clone() +shared_ptr ChestTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new ChestTileEntity() ); + shared_ptr result = shared_ptr( new ChestTileEntity() ); TileEntity::clone(result); for (unsigned int i = 0; i < items->length; i++) diff --git a/Minecraft.World/ChestTileEntity.h b/Minecraft.World/ChestTileEntity.h index 37dde555..5eeb3c44 100644 --- a/Minecraft.World/ChestTileEntity.h +++ b/Minecraft.World/ChestTileEntity.h @@ -40,15 +40,15 @@ private: public: virtual unsigned int getContainerSize(); - virtual std::shared_ptr getItem(unsigned int slot); - virtual std::shared_ptr removeItem(unsigned int slot, int count); - virtual std::shared_ptr removeItemNoUpdate(int slot); - virtual void setItem(unsigned int slot, std::shared_ptr item); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); virtual int getName(); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); virtual int getMaxStackSize(); - virtual bool stillValid(std::shared_ptr player); + virtual bool stillValid(shared_ptr player); virtual void setChanged(); virtual void clearCache(); virtual void checkNeighbors(); @@ -59,5 +59,5 @@ public: virtual void setRemoved(); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); }; \ No newline at end of file diff --git a/Minecraft.World/Chicken.cpp b/Minecraft.World/Chicken.cpp index a1193d4a..0104b2bf 100644 --- a/Minecraft.World/Chicken.cpp +++ b/Minecraft.World/Chicken.cpp @@ -68,7 +68,7 @@ void Chicken::aiStep() if (!onGround && flapping < 1) flapping = 1; flapping *= 0.9; - if (!onGround && yd < 0) + if (!onGround && yd < 0) { yd *= 0.6; } @@ -77,7 +77,7 @@ void Chicken::aiStep() if (!isBaby()) { - if (!level->isClientSide && --eggTime <= 0) + if (!level->isClientSide && --eggTime <= 0) { level->playSound(shared_from_this(), eSoundType_MOB_CHICKENPLOP, 1.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); spawnAtLocation(Item::egg->id, 1); @@ -87,27 +87,27 @@ void Chicken::aiStep() } -void Chicken::causeFallDamage(float distance) +void Chicken::causeFallDamage(float distance) { } -int Chicken::getAmbientSound() +int Chicken::getAmbientSound() { return eSoundType_MOB_CHICKEN_AMBIENT; } -int Chicken::getHurtSound() +int Chicken::getHurtSound() { return eSoundType_MOB_CHICKEN_HURT; } -int Chicken::getDeathSound() +int Chicken::getDeathSound() { return eSoundType_MOB_CHICKEN_HURT; } -int Chicken::getDeathLoot() +int Chicken::getDeathLoot() { return Item::feather->id; } @@ -121,7 +121,7 @@ void Chicken::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) spawnAtLocation(Item::feather_Id, 1); } // and some meat - if (this->isOnFire()) + if (this->isOnFire()) { spawnAtLocation(Item::chicken_cooked_Id, 1); } @@ -131,12 +131,12 @@ void Chicken::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) } } -std::shared_ptr Chicken::getBreedOffspring(std::shared_ptr target) +shared_ptr Chicken::getBreedOffspring(shared_ptr target) { // 4J - added limit to chickens that can be bred if( level->canCreateMore( GetType(), Level::eSpawnType_Breed) ) { - return std::shared_ptr(new Chicken(level)); + return shared_ptr(new Chicken(level)); } else { @@ -144,7 +144,7 @@ std::shared_ptr Chicken::getBreedOffspring(std::shared_ptr } } -bool Chicken::isFood(std::shared_ptr itemInstance) +bool Chicken::isFood(shared_ptr itemInstance) { return (itemInstance->id == Item::seeds_wheat_Id) || (itemInstance->id == Item::netherStalkSeeds_Id) || (itemInstance->id == Item::seeds_melon_Id) || (itemInstance->id == Item::seeds_pumpkin_Id); } diff --git a/Minecraft.World/Chicken.h b/Minecraft.World/Chicken.h index 2814a29c..a162a5eb 100644 --- a/Minecraft.World/Chicken.h +++ b/Minecraft.World/Chicken.h @@ -18,14 +18,14 @@ public: float flapping; int eggTime; -private: +private: void _init(); public: Chicken(Level *level); virtual bool useNewAi(); virtual int getMaxHealth(); - virtual void aiStep(); + virtual void aiStep(); protected: virtual void causeFallDamage(float distance); @@ -36,7 +36,7 @@ protected: virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: - virtual std::shared_ptr getBreedOffspring(std::shared_ptr target); - virtual bool isFood(std::shared_ptr itemInstance); + virtual shared_ptr getBreedOffspring(shared_ptr target); + virtual bool isFood(shared_ptr itemInstance); }; diff --git a/Minecraft.World/ChunkPos.cpp b/Minecraft.World/ChunkPos.cpp index 025d1fc9..1bdf165d 100644 --- a/Minecraft.World/ChunkPos.cpp +++ b/Minecraft.World/ChunkPos.cpp @@ -21,7 +21,7 @@ int ChunkPos::hashCode() return h1 ^ h2; } -double ChunkPos::distanceToSqr(std::shared_ptr e) +double ChunkPos::distanceToSqr(shared_ptr e) { double xPos = x * 16 + 8; double zPos = z * 16 + 8; diff --git a/Minecraft.World/ChunkPos.h b/Minecraft.World/ChunkPos.h index dc797b02..55bd1ebb 100644 --- a/Minecraft.World/ChunkPos.h +++ b/Minecraft.World/ChunkPos.h @@ -13,7 +13,7 @@ public: static int64_t hashCode(int x, int z); int hashCode(); - double distanceToSqr(std::shared_ptr e); + double distanceToSqr(shared_ptr e); double distanceToSqr(double px, double pz); // 4J added int getMiddleBlockX(); diff --git a/Minecraft.World/ChunkTilesUpdatePacket.h b/Minecraft.World/ChunkTilesUpdatePacket.h index 2e90d3c6..a97f49a3 100644 --- a/Minecraft.World/ChunkTilesUpdatePacket.h +++ b/Minecraft.World/ChunkTilesUpdatePacket.h @@ -25,7 +25,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ChunkTilesUpdatePacket()); } + static shared_ptr create() { return shared_ptr(new ChunkTilesUpdatePacket()); } virtual int getId() { return 52; } }; diff --git a/Minecraft.World/ChunkVisibilityAreaPacket.h b/Minecraft.World/ChunkVisibilityAreaPacket.h index cc7f337d..33087497 100644 --- a/Minecraft.World/ChunkVisibilityAreaPacket.h +++ b/Minecraft.World/ChunkVisibilityAreaPacket.h @@ -25,6 +25,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ChunkVisibilityAreaPacket()); } + static shared_ptr create() { return shared_ptr(new ChunkVisibilityAreaPacket()); } virtual int getId() { return 155; } }; diff --git a/Minecraft.World/ChunkVisibilityPacket.h b/Minecraft.World/ChunkVisibilityPacket.h index d27b0200..8c5856c7 100644 --- a/Minecraft.World/ChunkVisibilityPacket.h +++ b/Minecraft.World/ChunkVisibilityPacket.h @@ -22,7 +22,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ChunkVisibilityPacket()); } + static shared_ptr create() { return shared_ptr(new ChunkVisibilityPacket()); } virtual int getId() { return 50; } }; diff --git a/Minecraft.World/ClientCommandPacket.h b/Minecraft.World/ClientCommandPacket.h index 1dea6b22..2f614ddf 100644 --- a/Minecraft.World/ClientCommandPacket.h +++ b/Minecraft.World/ClientCommandPacket.h @@ -19,6 +19,6 @@ public: int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ClientCommandPacket()); } + static shared_ptr create() { return shared_ptr(new ClientCommandPacket()); } virtual int getId() { return 205; } }; \ No newline at end of file diff --git a/Minecraft.World/ClientSideMerchant.cpp b/Minecraft.World/ClientSideMerchant.cpp index 9719cd48..5d021c22 100644 --- a/Minecraft.World/ClientSideMerchant.cpp +++ b/Minecraft.World/ClientSideMerchant.cpp @@ -3,10 +3,10 @@ #include "net.minecraft.world.inventory.h" #include "ClientSideMerchant.h" -ClientSideMerchant::ClientSideMerchant(std::shared_ptr source, int name) +ClientSideMerchant::ClientSideMerchant(shared_ptr source, int name) { this->source = source; - // 4J Stu - Need to do this after creating as a std::shared_ptr + // 4J Stu - Need to do this after creating as a shared_ptr container = NULL; //new MerchantContainer(source, this); currentOffers = NULL; m_name = name; @@ -28,17 +28,17 @@ Container *ClientSideMerchant::getContainer() return container; } -std::shared_ptr ClientSideMerchant::getTradingPlayer() +shared_ptr ClientSideMerchant::getTradingPlayer() { return source; } -void ClientSideMerchant::setTradingPlayer(std::shared_ptr player) +void ClientSideMerchant::setTradingPlayer(shared_ptr player) { } -MerchantRecipeList *ClientSideMerchant::getOffers(std::shared_ptr forPlayer) +MerchantRecipeList *ClientSideMerchant::getOffers(shared_ptr forPlayer) { return currentOffers; } @@ -54,7 +54,7 @@ void ClientSideMerchant::notifyTrade(MerchantRecipe *activeRecipe) activeRecipe->increaseUses(); } -void ClientSideMerchant::notifyTradeUpdated(std::shared_ptr item) +void ClientSideMerchant::notifyTradeUpdated(shared_ptr item) { } diff --git a/Minecraft.World/ClientSideMerchant.h b/Minecraft.World/ClientSideMerchant.h index fa02c486..33f0c0b1 100644 --- a/Minecraft.World/ClientSideMerchant.h +++ b/Minecraft.World/ClientSideMerchant.h @@ -10,21 +10,21 @@ class ClientSideMerchant : public Merchant, public enable_shared_from_this source; + shared_ptr source; MerchantRecipeList *currentOffers; int m_name; public: - ClientSideMerchant(std::shared_ptr source, int name); + ClientSideMerchant(shared_ptr source, int name); ~ClientSideMerchant(); void createContainer(); // 4J Added Container *getContainer(); - std::shared_ptr getTradingPlayer(); - void setTradingPlayer(std::shared_ptr player); - MerchantRecipeList *getOffers(std::shared_ptr forPlayer); + shared_ptr getTradingPlayer(); + void setTradingPlayer(shared_ptr player); + MerchantRecipeList *getOffers(shared_ptr forPlayer); void overrideOffers(MerchantRecipeList *recipeList); void notifyTrade(MerchantRecipe *activeRecipe); - void notifyTradeUpdated(std::shared_ptr item); + void notifyTradeUpdated(shared_ptr item); int getDisplayName(); }; \ No newline at end of file diff --git a/Minecraft.World/ClothTileItem.cpp b/Minecraft.World/ClothTileItem.cpp index 2879deb8..35f3bb96 100644 --- a/Minecraft.World/ClothTileItem.cpp +++ b/Minecraft.World/ClothTileItem.cpp @@ -4,8 +4,8 @@ #include "DyePowderItem.h" #include "ClothTileItem.h" -const unsigned int ClothTileItem::COLOR_DESCS[] = -{ +const unsigned int ClothTileItem::COLOR_DESCS[] = +{ IDS_TILE_CLOTH_BLACK, IDS_TILE_CLOTH_RED, IDS_TILE_CLOTH_GREEN, @@ -24,8 +24,8 @@ const unsigned int ClothTileItem::COLOR_DESCS[] = IDS_TILE_CLOTH_WHITE }; -const unsigned int ClothTileItem::CARPET_COLOR_DESCS[] = -{ +const unsigned int ClothTileItem::CARPET_COLOR_DESCS[] = +{ IDS_TILE_CARPET_BLACK, IDS_TILE_CARPET_RED, IDS_TILE_CARPET_GREEN, @@ -50,18 +50,18 @@ ClothTileItem::ClothTileItem(int id) : TileItem(id) setStackedByData(true); } -Icon *ClothTileItem::getIcon(int itemAuxValue) +Icon *ClothTileItem::getIcon(int itemAuxValue) { return Tile::cloth->getTexture(2, ClothTile::getTileDataForItemAuxValue(itemAuxValue)); } -int ClothTileItem::getLevelDataForAuxValue(int auxValue) +int ClothTileItem::getLevelDataForAuxValue(int auxValue) { return auxValue; } -unsigned int ClothTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int ClothTileItem::getDescriptionId(shared_ptr instance) { if(getTileId() == Tile::woolCarpet_Id) return CARPET_COLOR_DESCS[ClothTile::getTileDataForItemAuxValue(instance->getAuxValue())]; else return COLOR_DESCS[ClothTile::getTileDataForItemAuxValue(instance->getAuxValue())]; diff --git a/Minecraft.World/ClothTileItem.h b/Minecraft.World/ClothTileItem.h index a2cf46a7..e909df43 100644 --- a/Minecraft.World/ClothTileItem.h +++ b/Minecraft.World/ClothTileItem.h @@ -3,15 +3,15 @@ using namespace std; #include "TileItem.h" -class ClothTileItem : public TileItem +class ClothTileItem : public TileItem { -public: +public: static const unsigned int COLOR_DESCS[]; static const unsigned int CARPET_COLOR_DESCS[]; ClothTileItem(int id); - + virtual Icon *getIcon(int itemAuxValue); virtual int getLevelDataForAuxValue(int auxValue); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; \ No newline at end of file diff --git a/Minecraft.World/CoalItem.cpp b/Minecraft.World/CoalItem.cpp index 2f6d9cb9..362689e0 100644 --- a/Minecraft.World/CoalItem.cpp +++ b/Minecraft.World/CoalItem.cpp @@ -12,9 +12,9 @@ CoalItem::CoalItem(int id) : Item( id ) setMaxDamage(0); } -unsigned int CoalItem::getDescriptionId(std::shared_ptr instance) +unsigned int CoalItem::getDescriptionId(shared_ptr instance) { - if (instance->getAuxValue() == CHAR_COAL) + if (instance->getAuxValue() == CHAR_COAL) { return IDS_ITEM_CHARCOAL; } diff --git a/Minecraft.World/CoalItem.h b/Minecraft.World/CoalItem.h index d45a6056..24814548 100644 --- a/Minecraft.World/CoalItem.h +++ b/Minecraft.World/CoalItem.h @@ -13,5 +13,5 @@ public: CoalItem(int id); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; \ No newline at end of file diff --git a/Minecraft.World/CocoaTile.cpp b/Minecraft.World/CocoaTile.cpp index db9e7f53..1f575014 100644 --- a/Minecraft.World/CocoaTile.cpp +++ b/Minecraft.World/CocoaTile.cpp @@ -46,7 +46,7 @@ void CocoaTile::tick(Level *level, int x, int y, int z, Random *random) } } -bool CocoaTile::canSurvive(Level *level, int x, int y, int z) +bool CocoaTile::canSurvive(Level *level, int x, int y, int z) { int dir = getDirection(level->getData(x, y, z)); @@ -84,7 +84,7 @@ AABB *CocoaTile::getTileAABB(Level *level, int x, int y, int z) return DirectionalTile::getTileAABB(level, x, y, z); } -void CocoaTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) +void CocoaTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) { int data = level->getData(x, y, z); int dir = getDirection(data); @@ -112,7 +112,7 @@ void CocoaTile::updateShape(LevelSource *level, int x, int y, int z, int forceDa } } -void CocoaTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by, std::shared_ptr itemInstance) +void CocoaTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 0) % 4; level->setData(x, y, z, dir); @@ -127,7 +127,7 @@ int CocoaTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int f return Direction::DIRECTION_OPPOSITE[Direction::FACING_DIRECTION[face]]; } -void CocoaTile::neighborChanged(Level *level, int x, int y, int z, int type) +void CocoaTile::neighborChanged(Level *level, int x, int y, int z, int type) { if (!canSurvive(level, x, y, z)) { @@ -151,7 +151,7 @@ void CocoaTile::spawnResources(Level *level, int x, int y, int z, int data, floa } for (int i = 0; i < count; i++) { - popResource(level, x, y, z, std::shared_ptr( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BROWN) )); + popResource(level, x, y, z, shared_ptr( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BROWN) )); } } diff --git a/Minecraft.World/CocoaTile.h b/Minecraft.World/CocoaTile.h index e1b6a92f..267225ea 100644 --- a/Minecraft.World/CocoaTile.h +++ b/Minecraft.World/CocoaTile.h @@ -4,7 +4,7 @@ class CocoaTile : public DirectionalTile { -public: +public: static const int COCOA_TEXTURES_LENGTH = 3; static const wstring TEXTURE_AGES[]; @@ -25,8 +25,8 @@ public: virtual bool isSolidRender(bool isServerLevel = false); virtual AABB *getAABB(Level *level, int x, int y, int z); virtual AABB *getTileAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by, std::shared_ptr itemInstance); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); virtual void neighborChanged(Level *level, int x, int y, int z, int type); static int getAge(int data); diff --git a/Minecraft.World/ColoredTileItem.cpp b/Minecraft.World/ColoredTileItem.cpp index ab71641e..37ea4c63 100644 --- a/Minecraft.World/ColoredTileItem.cpp +++ b/Minecraft.World/ColoredTileItem.cpp @@ -18,7 +18,7 @@ ColoredTileItem::~ColoredTileItem() if(descriptionPostfixes.data != NULL) delete [] descriptionPostfixes.data; } -int ColoredTileItem::getColor(std::shared_ptr item, int spriteLayer) +int ColoredTileItem::getColor(shared_ptr item, int spriteLayer) { return colorTile->getColor(item->getAuxValue()); } @@ -45,7 +45,7 @@ ColoredTileItem *ColoredTileItem::setDescriptionPostfixes(intArray descriptionPo return this; } -unsigned int ColoredTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int ColoredTileItem::getDescriptionId(shared_ptr instance) { if (descriptionPostfixes.data == NULL) { diff --git a/Minecraft.World/ColoredTileItem.h b/Minecraft.World/ColoredTileItem.h index dfe5ebe6..cc3ef1e7 100644 --- a/Minecraft.World/ColoredTileItem.h +++ b/Minecraft.World/ColoredTileItem.h @@ -16,10 +16,10 @@ public: ColoredTileItem(int id, bool stackedByData); ~ColoredTileItem(); - virtual int getColor(std::shared_ptr item, int spriteLayer); + virtual int getColor(shared_ptr item, int spriteLayer); virtual Icon *getIcon(int auxValue); virtual int getLevelDataForAuxValue(int auxValue); ColoredTileItem *setDescriptionPostfixes(intArray descriptionPostfixes); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; diff --git a/Minecraft.World/Command.cpp b/Minecraft.World/Command.cpp index 7c8f56cf..f6d0e592 100644 --- a/Minecraft.World/Command.cpp +++ b/Minecraft.World/Command.cpp @@ -7,17 +7,17 @@ AdminLogCommand *Command::logger; -bool Command::canExecute(std::shared_ptr source) +bool Command::canExecute(shared_ptr source) { return source->hasPermission(getId()); } -void Command::logAdminAction(std::shared_ptr source, ChatPacket::EChatPacketMessage messageType, const wstring& message, int customData, const wstring& additionalMessage) +void Command::logAdminAction(shared_ptr source, ChatPacket::EChatPacketMessage messageType, const wstring& message, int customData, const wstring& additionalMessage) { logAdminAction(source, 0, messageType, message, customData, additionalMessage); } -void Command::logAdminAction(std::shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message, int customData, const wstring& additionalMessage) +void Command::logAdminAction(shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message, int customData, const wstring& additionalMessage) { if (logger != NULL) { @@ -30,9 +30,9 @@ void Command::setLogger(AdminLogCommand *logger) Command::logger = logger; } -std::shared_ptr Command::getPlayer(PlayerUID playerId) +shared_ptr Command::getPlayer(PlayerUID playerId) { - std::shared_ptr player = MinecraftServer::getInstance()->getPlayers()->getPlayer(playerId); + shared_ptr player = MinecraftServer::getInstance()->getPlayers()->getPlayer(playerId); if (player == NULL) { diff --git a/Minecraft.World/Command.h b/Minecraft.World/Command.h index 8f923be2..815c24ba 100644 --- a/Minecraft.World/Command.h +++ b/Minecraft.World/Command.h @@ -16,13 +16,13 @@ private: public: virtual EGameCommand getId() = 0; - virtual void execute(std::shared_ptr source, byteArray commandData) = 0; - virtual bool canExecute(std::shared_ptr source); + virtual void execute(shared_ptr source, byteArray commandData) = 0; + virtual bool canExecute(shared_ptr source); - static void logAdminAction(std::shared_ptr source, ChatPacket::EChatPacketMessage messageType, const wstring& message = L"", int customData = -1, const wstring& additionalMessage = L""); - static void logAdminAction(std::shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message = L"", int customData = -1, const wstring& additionalMessage = L""); + static void logAdminAction(shared_ptr source, ChatPacket::EChatPacketMessage messageType, const wstring& message = L"", int customData = -1, const wstring& additionalMessage = L""); + static void logAdminAction(shared_ptr source, int type, ChatPacket::EChatPacketMessage messageType, const wstring& message = L"", int customData = -1, const wstring& additionalMessage = L""); static void setLogger(AdminLogCommand *logger); protected: - std::shared_ptr getPlayer(PlayerUID playerId); + shared_ptr getPlayer(PlayerUID playerId); }; \ No newline at end of file diff --git a/Minecraft.World/CommandDispatcher.cpp b/Minecraft.World/CommandDispatcher.cpp index b9db3caf..68b74ca9 100644 --- a/Minecraft.World/CommandDispatcher.cpp +++ b/Minecraft.World/CommandDispatcher.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.commands.h" #include "CommandDispatcher.h" -void CommandDispatcher::performCommand(std::shared_ptr sender, EGameCommand command, byteArray commandData) +void CommandDispatcher::performCommand(shared_ptr sender, EGameCommand command, byteArray commandData) { AUTO_VAR(it, commandsById.find(command)); diff --git a/Minecraft.World/CommandDispatcher.h b/Minecraft.World/CommandDispatcher.h index cfc4486a..600f1db1 100644 --- a/Minecraft.World/CommandDispatcher.h +++ b/Minecraft.World/CommandDispatcher.h @@ -14,6 +14,6 @@ private: unordered_set commands; public: - void performCommand(std::shared_ptr sender, EGameCommand command, byteArray commandData); + void performCommand(shared_ptr sender, EGameCommand command, byteArray commandData); Command *addCommand(Command *command); }; \ No newline at end of file diff --git a/Minecraft.World/ComplexItem.cpp b/Minecraft.World/ComplexItem.cpp index 1b5f3cff..9cf09b87 100644 --- a/Minecraft.World/ComplexItem.cpp +++ b/Minecraft.World/ComplexItem.cpp @@ -13,7 +13,7 @@ bool ComplexItem::isComplex() return true; } -std::shared_ptr ComplexItem::getUpdatePacket(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr ComplexItem::getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player) { return nullptr; } \ No newline at end of file diff --git a/Minecraft.World/ComplexItem.h b/Minecraft.World/ComplexItem.h index 036781a4..28aba791 100644 --- a/Minecraft.World/ComplexItem.h +++ b/Minecraft.World/ComplexItem.h @@ -14,5 +14,5 @@ protected: public: virtual bool isComplex(); - virtual std::shared_ptr getUpdatePacket(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); + virtual shared_ptr getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player); }; diff --git a/Minecraft.World/ComplexItemDataPacket.h b/Minecraft.World/ComplexItemDataPacket.h index f299647d..52de8f49 100644 --- a/Minecraft.World/ComplexItemDataPacket.h +++ b/Minecraft.World/ComplexItemDataPacket.h @@ -20,7 +20,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ComplexItemDataPacket()); } + static shared_ptr create() { return shared_ptr(new ComplexItemDataPacket()); } virtual int getId() { return 131; } }; diff --git a/Minecraft.World/CompoundContainer.cpp b/Minecraft.World/CompoundContainer.cpp index 17f2b6e5..29bf60dd 100644 --- a/Minecraft.World/CompoundContainer.cpp +++ b/Minecraft.World/CompoundContainer.cpp @@ -3,7 +3,7 @@ #include "CompoundContainer.h" -CompoundContainer::CompoundContainer(int name, std::shared_ptr c1, std::shared_ptr c2) +CompoundContainer::CompoundContainer(int name, shared_ptr c1, shared_ptr c2) { this->name = name; if (c1 == NULL) c1 = c2; @@ -22,25 +22,25 @@ int CompoundContainer::getName() return name; } -std::shared_ptr CompoundContainer::getItem(unsigned int slot) +shared_ptr CompoundContainer::getItem(unsigned int slot) { if (slot >= c1->getContainerSize()) return c2->getItem(slot - c1->getContainerSize()); else return c1->getItem(slot); } -std::shared_ptr CompoundContainer::removeItem(unsigned int slot, int i) +shared_ptr CompoundContainer::removeItem(unsigned int slot, int i) { if (slot >= c1->getContainerSize()) return c2->removeItem(slot - c1->getContainerSize(), i); else return c1->removeItem(slot, i); } -std::shared_ptr CompoundContainer::removeItemNoUpdate(int slot) +shared_ptr CompoundContainer::removeItemNoUpdate(int slot) { if (slot >= c1->getContainerSize()) return c2->removeItemNoUpdate(slot - c1->getContainerSize()); else return c1->removeItemNoUpdate(slot); } -void CompoundContainer::setItem(unsigned int slot, std::shared_ptr item) +void CompoundContainer::setItem(unsigned int slot, shared_ptr item) { if (slot >= c1->getContainerSize()) c2->setItem(slot - c1->getContainerSize(), item); else c1->setItem(slot, item); @@ -57,7 +57,7 @@ void CompoundContainer::setChanged() c2->setChanged(); } -bool CompoundContainer::stillValid(std::shared_ptr player) +bool CompoundContainer::stillValid(shared_ptr player) { return c1->stillValid(player) && c2->stillValid(player); } diff --git a/Minecraft.World/CompoundContainer.h b/Minecraft.World/CompoundContainer.h index 1103f000..b0b8b934 100644 --- a/Minecraft.World/CompoundContainer.h +++ b/Minecraft.World/CompoundContainer.h @@ -9,27 +9,27 @@ class CompoundContainer : public Container { private: int name; - std::shared_ptr c1, c2; + shared_ptr c1, c2; public: - CompoundContainer(int name, std::shared_ptr c1, std::shared_ptr c2); + CompoundContainer(int name, shared_ptr c1, shared_ptr c2); unsigned int getContainerSize(); int getName(); - std::shared_ptr getItem(unsigned int slot); + shared_ptr getItem(unsigned int slot); - std::shared_ptr removeItem(unsigned int slot, int i); - std::shared_ptr removeItemNoUpdate(int slot); + shared_ptr removeItem(unsigned int slot, int i); + shared_ptr removeItemNoUpdate(int slot); - void setItem(unsigned int slot, std::shared_ptr item); + void setItem(unsigned int slot, shared_ptr item); int getMaxStackSize(); void setChanged(); - bool stillValid(std::shared_ptr player); + bool stillValid(shared_ptr player); virtual void startOpen(); virtual void stopOpen(); diff --git a/Minecraft.World/Connection.cpp b/Minecraft.World/Connection.cpp index 17b59dd3..4392fe54 100644 --- a/Minecraft.World/Connection.cpp +++ b/Minecraft.World/Connection.cpp @@ -96,7 +96,7 @@ Connection::Connection(Socket *socket, const wstring& id, PacketListener *packet }*/ dis = new DataInputStream(socket->getInputStream(packetListener->isServerPacketListener())); - + sos = socket->getOutputStream(packetListener->isServerPacketListener()); bufferedDos = new DataOutputStream(new BufferedOutputStream(sos, SEND_BUFFER_SIZE)); baos = new ByteArrayOutputStream( SEND_BUFFER_SIZE ); @@ -124,7 +124,7 @@ Connection::Connection(Socket *socket, const wstring& id, PacketListener *packet writeThread->Run(); - /* 4J JEV, java: + /* 4J JEV, java: new Thread(wstring(id).append(L" read thread")) { }; @@ -145,7 +145,7 @@ void Connection::setListener(PacketListener *packetListener) this->packetListener = packetListener; } -void Connection::send(std::shared_ptr packet) +void Connection::send(shared_ptr packet) { if (quitting) return; @@ -154,7 +154,7 @@ void Connection::send(std::shared_ptr packet) EnterCriticalSection(&writeLock); estimatedRemaining += packet->getEstimatedSize() + 1; - if (packet->shouldDelay) + if (packet->shouldDelay) { // 4J We have delayed it enough by putting it in the slow queue, so don't delay when we actually send it packet->shouldDelay = false; @@ -171,7 +171,7 @@ void Connection::send(std::shared_ptr packet) } -void Connection::queueSend(std::shared_ptr packet) +void Connection::queueSend(shared_ptr packet) { if (quitting) return; estimatedRemaining += packet->getEstimatedSize() + 1; @@ -189,7 +189,7 @@ bool Connection::writeTick() // try { if (!outgoing.empty() && (fakeLag == 0 || System::currentTimeMillis() - outgoing.front()->createTime >= fakeLag)) { - std::shared_ptr packet; + shared_ptr packet; EnterCriticalSection(&writeLock); @@ -200,11 +200,11 @@ bool Connection::writeTick() LeaveCriticalSection(&writeLock); Packet::writePacket(packet, bufferedDos); - + #ifndef _CONTENT_PACKAGE // 4J Added for debugging - if( !socket->isLocal() ) + if( !socket->isLocal() ) Packet::recordOutgoingPacket(packet); #endif @@ -220,7 +220,7 @@ bool Connection::writeTick() if ((slowWriteDelay-- <= 0) && !outgoing_slow.empty() && (fakeLag == 0 || System::currentTimeMillis() - outgoing_slow.front()->createTime >= fakeLag)) { - std::shared_ptr packet; + shared_ptr packet; //synchronized (writeLock) { @@ -252,9 +252,9 @@ bool Connection::writeTick() #ifndef _CONTENT_PACKAGE // 4J Added for debugging - if( !socket->isLocal() ) + if( !socket->isLocal() ) Packet::recordOutgoingPacket(packet); -#endif +#endif writeSizes[packet->getId()] += packet->getEstimatedSize() + 1; slowWriteDelay = 0; @@ -290,7 +290,7 @@ bool Connection::readTick() //try { - std::shared_ptr packet = Packet::readPacket(dis, packetListener->isServerPacketListener()); + shared_ptr packet = Packet::readPacket(dis, packetListener->isServerPacketListener()); if (packet != NULL) { @@ -302,13 +302,13 @@ bool Connection::readTick() } LeaveCriticalSection(&incoming_cs); didSomething = true; - } + } else { // printf("Con:0x%x readTick close EOS\n",this); // 4J Stu - Remove this line - // Fix for #10410 - UI: If the player is removed from a splitscreened host�s game, the next game that player joins will produce a message stating that the host has left. + // Fix for #10410 - UI: If the player is removed from a splitscreened hosts game, the next game that player joins will produce a message stating that the host has left. //close(DisconnectPacket::eDisconnect_EndOfStream); } @@ -362,7 +362,7 @@ void Connection::close(DisconnectPacket::eDisconnectReason reason, ...) // int count = 0, sum = 0, i = first; // va_list marker; - // + // // va_start( marker, first ); // while( i != -1 ) // { @@ -440,7 +440,7 @@ void Connection::tick() tickCount++; if (tickCount % 20 == 0) { - send( std::shared_ptr( new KeepAlivePacket() ) ); + send( shared_ptr( new KeepAlivePacket() ) ); } // 4J Stu - 1.8.2 changed from 100 to 1000 @@ -455,10 +455,10 @@ void Connection::tick() EnterCriticalSection(&incoming_cs); // 4J Stu - If disconnected, then we shouldn't process incoming packets - std::vector< std::shared_ptr > packetsToHandle; + std::vector< shared_ptr > packetsToHandle; while (!disconnected && !g_NetworkManager.IsLeavingGame() && g_NetworkManager.IsInSession() && !incoming.empty() && max-- >= 0) { - std::shared_ptr packet = incoming.front(); + shared_ptr packet = incoming.front(); packetsToHandle.push_back(packet); incoming.pop(); } @@ -607,8 +607,8 @@ int Connection::runWrite(void* lpParam) while (con->writeTick()) ; - //Sleep(100L); - // TODO - 4J Stu - 1.8.2 changes these sleeps to 2L, but not sure whether we should do that as well + //Sleep(100L); + // TODO - 4J Stu - 1.8.2 changes these sleeps to 2L, but not sure whether we should do that as well waitResult = con->m_hWakeWriteThread->WaitForSignal(100L); if (con->bufferedDos != NULL) con->bufferedDos->flush(); diff --git a/Minecraft.World/Connection.h b/Minecraft.World/Connection.h index 32068dfb..9db00512 100644 --- a/Minecraft.World/Connection.h +++ b/Minecraft.World/Connection.h @@ -52,11 +52,11 @@ private: bool running; - queue > incoming; // 4J - was using synchronizedList... + queue > incoming; // 4J - was using synchronizedList... CRITICAL_SECTION incoming_cs; // ... now has this critical section - queue > outgoing; // 4J - was using synchronizedList - but don't think it is required as usage is wrapped in writeLock critical section - queue > outgoing_slow; // 4J - was using synchronizedList - but don't think it is required as usage is wrapped in writeLock critical section - + queue > outgoing; // 4J - was using synchronizedList - but don't think it is required as usage is wrapped in writeLock critical section + queue > outgoing_slow; // 4J - was using synchronizedList - but don't think it is required as usage is wrapped in writeLock critical section + PacketListener *packetListener; bool quitting; @@ -98,10 +98,10 @@ public: Connection(Socket *socket, const wstring& id, PacketListener *packetListener); // throws IOException void setListener(PacketListener *packetListener); - void send(std::shared_ptr packet); + void send(shared_ptr packet); public: - void queueSend(std::shared_ptr packet); + void queueSend(shared_ptr packet); private: int slowWriteDelay; diff --git a/Minecraft.World/Container.h b/Minecraft.World/Container.h index 8939cd01..7aa63728 100644 --- a/Minecraft.World/Container.h +++ b/Minecraft.World/Container.h @@ -10,14 +10,14 @@ public: static const int LARGE_MAX_STACK_SIZE = 64; virtual unsigned int getContainerSize() = 0; - virtual std::shared_ptr getItem(unsigned int slot) = 0; - virtual std::shared_ptr removeItem(unsigned int slot, int count) = 0; - virtual std::shared_ptr removeItemNoUpdate(int slot) = 0; - virtual void setItem(unsigned int slot, std::shared_ptr item) = 0; + virtual shared_ptr getItem(unsigned int slot) = 0; + virtual shared_ptr removeItem(unsigned int slot, int count) = 0; + virtual shared_ptr removeItemNoUpdate(int slot) = 0; + virtual void setItem(unsigned int slot, shared_ptr item) = 0; virtual int getName() = 0; virtual int getMaxStackSize() = 0; virtual void setChanged() = 0; - virtual bool stillValid(std::shared_ptr player) = 0; + virtual bool stillValid(shared_ptr player) = 0; virtual void startOpen() = 0; virtual void stopOpen() = 0; }; \ No newline at end of file diff --git a/Minecraft.World/ContainerAckPacket.h b/Minecraft.World/ContainerAckPacket.h index 0dce4e4f..00f3592e 100644 --- a/Minecraft.World/ContainerAckPacket.h +++ b/Minecraft.World/ContainerAckPacket.h @@ -23,7 +23,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ContainerAckPacket()); } + static shared_ptr create() { return shared_ptr(new ContainerAckPacket()); } virtual int getId() { return 106; } }; diff --git a/Minecraft.World/ContainerButtonClickPacket.h b/Minecraft.World/ContainerButtonClickPacket.h index 64ee6cb5..522c5f86 100644 --- a/Minecraft.World/ContainerButtonClickPacket.h +++ b/Minecraft.World/ContainerButtonClickPacket.h @@ -17,6 +17,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ContainerButtonClickPacket()); } + static shared_ptr create() { return shared_ptr(new ContainerButtonClickPacket()); } virtual int getId() { return 108; } }; \ No newline at end of file diff --git a/Minecraft.World/ContainerClickPacket.cpp b/Minecraft.World/ContainerClickPacket.cpp index 155f944b..5b3ca24f 100644 --- a/Minecraft.World/ContainerClickPacket.cpp +++ b/Minecraft.World/ContainerClickPacket.cpp @@ -21,7 +21,7 @@ ContainerClickPacket::ContainerClickPacket() quickKey = false; } -ContainerClickPacket::ContainerClickPacket(int containerId, int slotNum, int buttonNum, bool quickKey, std::shared_ptr item, short uid) +ContainerClickPacket::ContainerClickPacket(int containerId, int slotNum, int buttonNum, bool quickKey, shared_ptr item, short uid) { this->containerId = containerId; this->slotNum = slotNum; @@ -59,7 +59,7 @@ void ContainerClickPacket::write(DataOutputStream *dos) // throws IOException writeItem(item, dos); } -int ContainerClickPacket::getEstimatedSize() +int ContainerClickPacket::getEstimatedSize() { return 4 + 4 + 2 + 1; } diff --git a/Minecraft.World/ContainerClickPacket.h b/Minecraft.World/ContainerClickPacket.h index 47c7e418..8bea7da5 100644 --- a/Minecraft.World/ContainerClickPacket.h +++ b/Minecraft.World/ContainerClickPacket.h @@ -10,12 +10,12 @@ public: int slotNum; int buttonNum; short uid; - std::shared_ptr item; + shared_ptr item; bool quickKey; ContainerClickPacket(); ~ContainerClickPacket(); - ContainerClickPacket(int containerId, int slotNum, int buttonNum, bool quickKey, std::shared_ptr item, short uid); + ContainerClickPacket(int containerId, int slotNum, int buttonNum, bool quickKey, shared_ptr item, short uid); virtual void handle(PacketListener *listener); virtual void read(DataInputStream *dis); @@ -23,7 +23,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ContainerClickPacket()); } + static shared_ptr create() { return shared_ptr(new ContainerClickPacket()); } virtual int getId() { return 102; } }; diff --git a/Minecraft.World/ContainerClosePacket.h b/Minecraft.World/ContainerClosePacket.h index 562646fa..bf032a97 100644 --- a/Minecraft.World/ContainerClosePacket.h +++ b/Minecraft.World/ContainerClosePacket.h @@ -17,7 +17,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ContainerClosePacket()); } + static shared_ptr create() { return shared_ptr(new ContainerClosePacket()); } virtual int getId() { return 101; } }; diff --git a/Minecraft.World/ContainerMenu.cpp b/Minecraft.World/ContainerMenu.cpp index 534da741..57190024 100644 --- a/Minecraft.World/ContainerMenu.cpp +++ b/Minecraft.World/ContainerMenu.cpp @@ -8,7 +8,7 @@ #include "..\Minecraft.Client\LocalPlayer.h" #include "ContainerMenu.h" -ContainerMenu::ContainerMenu(std::shared_ptr inventory, std::shared_ptr container) : AbstractContainerMenu() +ContainerMenu::ContainerMenu(shared_ptr inventory, shared_ptr container) : AbstractContainerMenu() { this->container = container; this->containerRows = container->getContainerSize() / 9; @@ -37,18 +37,18 @@ ContainerMenu::ContainerMenu(std::shared_ptr inventory, std::shared_p } } -bool ContainerMenu::stillValid(std::shared_ptr player) +bool ContainerMenu::stillValid(shared_ptr player) { return container->stillValid(player); } -std::shared_ptr ContainerMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr ContainerMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = slots->at(slotIndex); if (slot != NULL && slot->hasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if (slotIndex < containerRows * 9) @@ -79,25 +79,25 @@ std::shared_ptr ContainerMenu::quickMoveStack(std::shared_ptr player) +void ContainerMenu::removed(shared_ptr player) { AbstractContainerMenu::removed(player); container->stopOpen(); } -std::shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, std::shared_ptr player) +shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) { - std::shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); + shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); #ifdef _EXTENDED_ACHIEVEMENTS - std::shared_ptr localPlayer = dynamic_pointer_cast(player); + shared_ptr localPlayer = dynamic_pointer_cast(player); if (localPlayer != NULL) // 4J-JEV: For "Chestful o'Cobblestone" achievement. { int cobblecount = 0; for (int i = 0; i < container->getContainerSize(); i++) { - std::shared_ptr item = container->getItem(i); + shared_ptr item = container->getItem(i); if ( (item != nullptr) && (item->id == Tile::stoneBrick_Id) ) { cobblecount += item->GetCount(); diff --git a/Minecraft.World/ContainerMenu.h b/Minecraft.World/ContainerMenu.h index a738cdc3..e6da0782 100644 --- a/Minecraft.World/ContainerMenu.h +++ b/Minecraft.World/ContainerMenu.h @@ -7,16 +7,16 @@ class Container; class ContainerMenu : public AbstractContainerMenu { private: - std::shared_ptr container; + shared_ptr container; int containerRows; public: - ContainerMenu(std::shared_ptr inventory, std::shared_ptr container); + ContainerMenu(shared_ptr inventory, shared_ptr container); - virtual bool stillValid(std::shared_ptr player); - virtual std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); - void removed(std::shared_ptr player); + virtual bool stillValid(shared_ptr player); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + void removed(shared_ptr player); // 4J ADDED, - virtual std::shared_ptr clicked(int slotIndex, int buttonNum, int clickType, std::shared_ptr player); + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); }; diff --git a/Minecraft.World/ContainerOpenPacket.h b/Minecraft.World/ContainerOpenPacket.h index 3d351a93..dbc65b9a 100644 --- a/Minecraft.World/ContainerOpenPacket.h +++ b/Minecraft.World/ContainerOpenPacket.h @@ -30,7 +30,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ContainerOpenPacket()); } + static shared_ptr create() { return shared_ptr(new ContainerOpenPacket()); } virtual int getId() { return 100; } }; diff --git a/Minecraft.World/ContainerSetContentPacket.cpp b/Minecraft.World/ContainerSetContentPacket.cpp index 62382888..13cfebd7 100644 --- a/Minecraft.World/ContainerSetContentPacket.cpp +++ b/Minecraft.World/ContainerSetContentPacket.cpp @@ -12,28 +12,28 @@ ContainerSetContentPacket::~ContainerSetContentPacket() delete[] items.data; } -ContainerSetContentPacket::ContainerSetContentPacket() +ContainerSetContentPacket::ContainerSetContentPacket() { containerId = 0; } -ContainerSetContentPacket::ContainerSetContentPacket(int containerId, vector > *newItems) +ContainerSetContentPacket::ContainerSetContentPacket(int containerId, vector > *newItems) { this->containerId = containerId; items = ItemInstanceArray((int)newItems->size()); for (unsigned int i = 0; i < items.length; i++) { - std::shared_ptr item = newItems->at(i); + shared_ptr item = newItems->at(i); items[i] = item == NULL ? nullptr : item->copy(); } } -void ContainerSetContentPacket::read(DataInputStream *dis) //throws IOException +void ContainerSetContentPacket::read(DataInputStream *dis) //throws IOException { containerId = dis->readByte(); int count = dis->readShort(); items = ItemInstanceArray(count); - for (int i = 0; i < count; i++) + for (int i = 0; i < count; i++) { items[i] = readItem(dis); } @@ -43,7 +43,7 @@ void ContainerSetContentPacket::write(DataOutputStream *dos) //throws IOExceptio { dos->writeByte(containerId); dos->writeShort(items.length); - for (unsigned int i = 0; i < items.length; i++) + for (unsigned int i = 0; i < items.length; i++) { writeItem(items[i], dos); } @@ -54,7 +54,7 @@ void ContainerSetContentPacket::handle(PacketListener *listener) listener->handleContainerContent(shared_from_this()); } -int ContainerSetContentPacket::getEstimatedSize() +int ContainerSetContentPacket::getEstimatedSize() { return 3 + items.length * 5; } diff --git a/Minecraft.World/ContainerSetContentPacket.h b/Minecraft.World/ContainerSetContentPacket.h index 8e2a3c5a..10315f58 100644 --- a/Minecraft.World/ContainerSetContentPacket.h +++ b/Minecraft.World/ContainerSetContentPacket.h @@ -11,7 +11,7 @@ public: ContainerSetContentPacket(); ~ContainerSetContentPacket(); - ContainerSetContentPacket(int containerId, vector > *newItems); + ContainerSetContentPacket(int containerId, vector > *newItems); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); @@ -19,7 +19,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ContainerSetContentPacket()); } + static shared_ptr create() { return shared_ptr(new ContainerSetContentPacket()); } virtual int getId() { return 104; } }; diff --git a/Minecraft.World/ContainerSetDataPacket.h b/Minecraft.World/ContainerSetDataPacket.h index 6f694aeb..ce075e00 100644 --- a/Minecraft.World/ContainerSetDataPacket.h +++ b/Minecraft.World/ContainerSetDataPacket.h @@ -19,6 +19,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ContainerSetDataPacket()); } + static shared_ptr create() { return shared_ptr(new ContainerSetDataPacket()); } virtual int getId() { return 105; } }; \ No newline at end of file diff --git a/Minecraft.World/ContainerSetSlotPacket.cpp b/Minecraft.World/ContainerSetSlotPacket.cpp index 0bb9857f..42892f3c 100644 --- a/Minecraft.World/ContainerSetSlotPacket.cpp +++ b/Minecraft.World/ContainerSetSlotPacket.cpp @@ -18,19 +18,19 @@ ContainerSetSlotPacket::ContainerSetSlotPacket() item = nullptr; } -ContainerSetSlotPacket::ContainerSetSlotPacket(int containerId, int slot, std::shared_ptr item) +ContainerSetSlotPacket::ContainerSetSlotPacket(int containerId, int slot, shared_ptr item) { this->containerId = containerId; this->slot = slot; this->item = item == NULL ? item : item->copy(); } -void ContainerSetSlotPacket::handle(PacketListener *listener) +void ContainerSetSlotPacket::handle(PacketListener *listener) { listener->handleContainerSetSlot(shared_from_this()); } -void ContainerSetSlotPacket::read(DataInputStream *dis) //throws IOException +void ContainerSetSlotPacket::read(DataInputStream *dis) //throws IOException { // 4J Stu - TU-1 hotfix // Fix for #13142 - Holding down the A button on the furnace ingredient slot causes the UI to display incorrect item counts diff --git a/Minecraft.World/ContainerSetSlotPacket.h b/Minecraft.World/ContainerSetSlotPacket.h index f996fc89..61269df0 100644 --- a/Minecraft.World/ContainerSetSlotPacket.h +++ b/Minecraft.World/ContainerSetSlotPacket.h @@ -12,10 +12,10 @@ public: int containerId; int slot; - std::shared_ptr item; + shared_ptr item; ContainerSetSlotPacket(); - ContainerSetSlotPacket(int containerId, int slot, std::shared_ptr item); + ContainerSetSlotPacket(int containerId, int slot, shared_ptr item); virtual void handle(PacketListener *listener); virtual void read(DataInputStream *dis); @@ -23,7 +23,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ContainerSetSlotPacket()); } + static shared_ptr create() { return shared_ptr(new ContainerSetSlotPacket()); } virtual int getId() { return 103; } }; diff --git a/Minecraft.World/ControlledByPlayerGoal.cpp b/Minecraft.World/ControlledByPlayerGoal.cpp index ba46debe..1e035494 100644 --- a/Minecraft.World/ControlledByPlayerGoal.cpp +++ b/Minecraft.World/ControlledByPlayerGoal.cpp @@ -36,13 +36,13 @@ void ControlledByPlayerGoal::stop() bool ControlledByPlayerGoal::canUse() { - std::shared_ptr player = dynamic_pointer_cast( mob->rider.lock() ); + shared_ptr player = dynamic_pointer_cast( mob->rider.lock() ); return mob->isAlive() && player && (boosting || mob->canBeControlledByRider()); } void ControlledByPlayerGoal::tick() { - std::shared_ptr player = dynamic_pointer_cast(mob->rider.lock()); + shared_ptr player = dynamic_pointer_cast(mob->rider.lock()); PathfinderMob *pig = (PathfinderMob *)mob; float yrd = Mth::wrapDegrees(player->yRot - mob->yRot) * 0.5f; @@ -116,7 +116,7 @@ void ControlledByPlayerGoal::tick() if (!player->abilities.instabuild && speed >= maxSpeed * 0.5f && mob->getRandom()->nextFloat() < 0.006f && !boosting) { - std::shared_ptr carriedItem = player->getCarriedItem(); + shared_ptr carriedItem = player->getCarriedItem(); if (carriedItem != NULL && carriedItem->id == Item::carrotOnAStick_Id) { @@ -124,7 +124,7 @@ void ControlledByPlayerGoal::tick() if (carriedItem->count == 0) { - std::shared_ptr replacement = std::shared_ptr(new ItemInstance(Item::fishingRod)); + shared_ptr replacement = shared_ptr(new ItemInstance(Item::fishingRod)); replacement->setTag(carriedItem->tag); player->inventory->items[player->inventory->selected] = replacement; } diff --git a/Minecraft.World/Cow.cpp b/Minecraft.World/Cow.cpp index f37cdd9a..c259183e 100644 --- a/Minecraft.World/Cow.cpp +++ b/Minecraft.World/Cow.cpp @@ -47,27 +47,27 @@ int Cow::getMaxHealth() return 10; } -int Cow::getAmbientSound() +int Cow::getAmbientSound() { return eSoundType_MOB_COW_AMBIENT; } -int Cow::getHurtSound() +int Cow::getHurtSound() { return eSoundType_MOB_COW_HURT; } -int Cow::getDeathSound() +int Cow::getDeathSound() { return eSoundType_MOB_COW_HURT; } -float Cow::getSoundVolume() +float Cow::getSoundVolume() { return 0.4f; } -int Cow::getDeathLoot() +int Cow::getDeathLoot() { return Item::leather->id; } @@ -95,33 +95,33 @@ void Cow::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) } } -bool Cow::interact(std::shared_ptr player) +bool Cow::interact(shared_ptr player) { - std::shared_ptr item = player->inventory->getSelected(); - if (item != NULL && item->id == Item::bucket_empty->id) + shared_ptr item = player->inventory->getSelected(); + if (item != NULL && item->id == Item::bucket_empty->id) { player->awardStat(GenericStats::cowsMilked(),GenericStats::param_cowsMilked()); - if (--item->count <= 0) + if (--item->count <= 0) { - player->inventory->setItem(player->inventory->selected, std::shared_ptr( new ItemInstance(Item::milk) ) ); - } - else if (!player->inventory->add(std::shared_ptr( new ItemInstance(Item::milk) ))) + player->inventory->setItem(player->inventory->selected, shared_ptr( new ItemInstance(Item::milk) ) ); + } + else if (!player->inventory->add(shared_ptr( new ItemInstance(Item::milk) ))) { - player->drop(std::shared_ptr( new ItemInstance(Item::milk) )); + player->drop(shared_ptr( new ItemInstance(Item::milk) )); } - + return true; } return Animal::interact(player); } -std::shared_ptr Cow::getBreedOffspring(std::shared_ptr target) +shared_ptr Cow::getBreedOffspring(shared_ptr target) { // 4J - added limit to number of animals that can be bred if( level->canCreateMore( GetType(), Level::eSpawnType_Breed) ) { - return std::shared_ptr( new Cow(level) ); + return shared_ptr( new Cow(level) ); } else { diff --git a/Minecraft.World/Cow.h b/Minecraft.World/Cow.h index e721f830..a1a91aba 100644 --- a/Minecraft.World/Cow.h +++ b/Minecraft.World/Cow.h @@ -27,6 +27,6 @@ protected: virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: - virtual bool interact(std::shared_ptr player); - virtual std::shared_ptr getBreedOffspring(std::shared_ptr target); + virtual bool interact(shared_ptr player); + virtual shared_ptr getBreedOffspring(shared_ptr target); }; diff --git a/Minecraft.World/CraftItemPacket.h b/Minecraft.World/CraftItemPacket.h index b08d609e..9793d593 100644 --- a/Minecraft.World/CraftItemPacket.h +++ b/Minecraft.World/CraftItemPacket.h @@ -22,6 +22,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new CraftItemPacket()); } + static shared_ptr create() { return shared_ptr(new CraftItemPacket()); } virtual int getId() { return 150; } }; \ No newline at end of file diff --git a/Minecraft.World/CraftingContainer.cpp b/Minecraft.World/CraftingContainer.cpp index db0d593d..fbcc5678 100644 --- a/Minecraft.World/CraftingContainer.cpp +++ b/Minecraft.World/CraftingContainer.cpp @@ -22,7 +22,7 @@ unsigned int CraftingContainer::getContainerSize() return items->length; } -std::shared_ptr CraftingContainer::getItem(unsigned int slot) +shared_ptr CraftingContainer::getItem(unsigned int slot) { if (slot >= getContainerSize()) { @@ -31,7 +31,7 @@ std::shared_ptr CraftingContainer::getItem(unsigned int slot) return (*items)[slot]; } -std::shared_ptr CraftingContainer::getItem(unsigned int x, unsigned int y) +shared_ptr CraftingContainer::getItem(unsigned int x, unsigned int y) { if (x < 0 || x >= width) { @@ -46,31 +46,31 @@ int CraftingContainer::getName() return 0; } -std::shared_ptr CraftingContainer::removeItemNoUpdate(int slot) +shared_ptr CraftingContainer::removeItemNoUpdate(int slot) { if ((*items)[slot] != NULL) { - std::shared_ptr item = (*items)[slot]; + shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; return item; } return nullptr; } -std::shared_ptr CraftingContainer::removeItem(unsigned int slot, int count) +shared_ptr CraftingContainer::removeItem(unsigned int slot, int count) { if ((*items)[slot] != NULL) { if ((*items)[slot]->count <= count) { - std::shared_ptr item = (*items)[slot]; + shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; menu->slotsChanged(); // 4J - used to take pointer to this, but wasn't using it so removed return item; } else { - std::shared_ptr i = (*items)[slot]->remove(count); + shared_ptr i = (*items)[slot]->remove(count); if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; menu->slotsChanged(); // 4J - used to take pointer to this, but wasn't using it so removed return i; @@ -79,7 +79,7 @@ std::shared_ptr CraftingContainer::removeItem(unsigned int slot, i return nullptr; } -void CraftingContainer::setItem(unsigned int slot, std::shared_ptr item) +void CraftingContainer::setItem(unsigned int slot, shared_ptr item) { (*items)[slot] = item; if(menu) menu->slotsChanged(); @@ -94,7 +94,7 @@ void CraftingContainer::setChanged() { } -bool CraftingContainer::stillValid(std::shared_ptr player) +bool CraftingContainer::stillValid(shared_ptr player) { return true; } \ No newline at end of file diff --git a/Minecraft.World/CraftingContainer.h b/Minecraft.World/CraftingContainer.h index d09d460a..863249a2 100644 --- a/Minecraft.World/CraftingContainer.h +++ b/Minecraft.World/CraftingContainer.h @@ -16,15 +16,15 @@ public: ~CraftingContainer(); virtual unsigned int getContainerSize(); - virtual std::shared_ptr getItem(unsigned int slot); - std::shared_ptr getItem(unsigned int x, unsigned int y); + virtual shared_ptr getItem(unsigned int slot); + shared_ptr getItem(unsigned int x, unsigned int y); virtual int getName(); - virtual std::shared_ptr removeItemNoUpdate(int slot); - virtual std::shared_ptr removeItem(unsigned int slot, int count); - virtual void setItem(unsigned int slot, std::shared_ptr item); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual void setItem(unsigned int slot, shared_ptr item); virtual int getMaxStackSize(); virtual void setChanged(); - bool stillValid(std::shared_ptr player); + bool stillValid(shared_ptr player); void startOpen() { } // TODO Auto-generated method stub void stopOpen() { } // TODO Auto-generated method stub diff --git a/Minecraft.World/CraftingMenu.cpp b/Minecraft.World/CraftingMenu.cpp index 3a144a5d..eeb2a6e3 100644 --- a/Minecraft.World/CraftingMenu.cpp +++ b/Minecraft.World/CraftingMenu.cpp @@ -17,10 +17,10 @@ const int CraftingMenu::INV_SLOT_END = CraftingMenu::INV_SLOT_START + 9 * 3; const int CraftingMenu::USE_ROW_SLOT_START = CraftingMenu::INV_SLOT_END; const int CraftingMenu::USE_ROW_SLOT_END = CraftingMenu::USE_ROW_SLOT_START + 9; -CraftingMenu::CraftingMenu(std::shared_ptr inventory, Level *level, int xt, int yt, int zt) : AbstractContainerMenu() +CraftingMenu::CraftingMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt) : AbstractContainerMenu() { - craftSlots = std::shared_ptr( new CraftingContainer(this, 3, 3) ); - resultSlots = std::shared_ptr( new ResultContainer() ); + craftSlots = shared_ptr( new CraftingContainer(this, 3, 3) ); + resultSlots = shared_ptr( new ResultContainer() ); this->level = level; this->x = xt; @@ -51,19 +51,19 @@ CraftingMenu::CraftingMenu(std::shared_ptr inventory, Level *level, i slotsChanged(); // 4J - removed craftSlots parameter, see comment below } -void CraftingMenu::slotsChanged() // 4J used to take a std::shared_ptr but wasn't using it, so removed to simplify things +void CraftingMenu::slotsChanged() // 4J used to take a shared_ptr but wasn't using it, so removed to simplify things { resultSlots->setItem(0, Recipes::getInstance()->getItemFor(craftSlots, level)); } -void CraftingMenu::removed(std::shared_ptr player) +void CraftingMenu::removed(shared_ptr player) { AbstractContainerMenu::removed(player); if (level->isClientSide) return; for (int i = 0; i < 9; i++) { - std::shared_ptr item = craftSlots->removeItemNoUpdate(i); + shared_ptr item = craftSlots->removeItemNoUpdate(i); if (item != NULL) { player->drop(item); @@ -71,20 +71,20 @@ void CraftingMenu::removed(std::shared_ptr player) } } -bool CraftingMenu::stillValid(std::shared_ptr player) +bool CraftingMenu::stillValid(shared_ptr player) { if (level->getTile(x, y, z) != Tile::workBench_Id) return false; if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; return true; } -std::shared_ptr CraftingMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr CraftingMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = slots->at(slotIndex); if (slot != NULL && slot->hasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if (slotIndex == RESULT_SLOT) diff --git a/Minecraft.World/CraftingMenu.h b/Minecraft.World/CraftingMenu.h index 7ebba894..0452eccc 100644 --- a/Minecraft.World/CraftingMenu.h +++ b/Minecraft.World/CraftingMenu.h @@ -18,18 +18,18 @@ public: static const int USE_ROW_SLOT_END; public: - std::shared_ptr craftSlots; - std::shared_ptr resultSlots; + shared_ptr craftSlots; + shared_ptr resultSlots; private: Level *level; int x, y, z; public: - CraftingMenu(std::shared_ptr inventory, Level *level, int xt, int yt, int zt); + CraftingMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt); - virtual void slotsChanged();// 4J used to take a std::shared_ptr but wasn't using it, so removed to simplify things - virtual void removed(std::shared_ptr player); - virtual bool stillValid(std::shared_ptr player); - virtual std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); + virtual void slotsChanged();// 4J used to take a shared_ptr but wasn't using it, so removed to simplify things + virtual void removed(shared_ptr player); + virtual bool stillValid(shared_ptr player); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); }; \ No newline at end of file diff --git a/Minecraft.World/Creeper.cpp b/Minecraft.World/Creeper.cpp index 2403d3a4..3f6c66a7 100644 --- a/Minecraft.World/Creeper.cpp +++ b/Minecraft.World/Creeper.cpp @@ -34,7 +34,7 @@ Creeper::Creeper(Level *level) : Monster( level ) health = getMaxHealth(); _init(); - + this->textureIdx = TN_MOB_CREEPER; // 4J was L"/mob/creeper.png"; goalSelector.addGoal(1, new FloatGoal(this)); @@ -125,14 +125,14 @@ void Creeper::die(DamageSource *source) spawnAtLocation(Item::record_01_Id + random->nextInt(12), 1); } - std::shared_ptr player = dynamic_pointer_cast(source->getEntity()); + shared_ptr player = dynamic_pointer_cast(source->getEntity()); if ( (dynamic_pointer_cast(source->getDirectEntity()) != NULL) && (player != NULL) ) { player->awardStat(GenericStats::archer(), GenericStats::param_archer()); } } -bool Creeper::doHurtTarget(std::shared_ptr target) +bool Creeper::doHurtTarget(shared_ptr target) { return true; } @@ -162,7 +162,7 @@ void Creeper::setSwellDir(int dir) entityData->set(DATA_SWELL_DIR, (byte) dir); } -void Creeper::thunderHit(const LightningBolt *lightningBolt) +void Creeper::thunderHit(const LightningBolt *lightningBolt) { Monster::thunderHit(lightningBolt); entityData->set(DATA_IS_POWERED, (byte) 1); diff --git a/Minecraft.World/Creeper.h b/Minecraft.World/Creeper.h index ebd9fa78..a5da0e10 100644 --- a/Minecraft.World/Creeper.h +++ b/Minecraft.World/Creeper.h @@ -45,7 +45,7 @@ protected: public: virtual void die(DamageSource *source); - virtual bool doHurtTarget(std::shared_ptr target); + virtual bool doHurtTarget(shared_ptr target); virtual bool isPowered(); float getSwelling(float a); diff --git a/Minecraft.World/CropTile.cpp b/Minecraft.World/CropTile.cpp index 80540b6a..0c19d889 100644 --- a/Minecraft.World/CropTile.cpp +++ b/Minecraft.World/CropTile.cpp @@ -133,7 +133,7 @@ void CropTile::spawnResources(Level *level, int x, int y, int z, int data, float for (int i = 0; i < count; i++) { if (level->random->nextInt(5 * 3) > data) continue; - popResource(level, x, y, z, std::shared_ptr(new ItemInstance(getBaseSeedId(), 1, 0))); + popResource(level, x, y, z, shared_ptr(new ItemInstance(getBaseSeedId(), 1, 0))); } } } diff --git a/Minecraft.World/CustomPayloadPacket.h b/Minecraft.World/CustomPayloadPacket.h index b794631b..95c5e708 100644 --- a/Minecraft.World/CustomPayloadPacket.h +++ b/Minecraft.World/CustomPayloadPacket.h @@ -30,6 +30,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new CustomPayloadPacket()); } + static shared_ptr create() { return shared_ptr(new CustomPayloadPacket()); } virtual int getId() { return 250; } }; \ No newline at end of file diff --git a/Minecraft.World/DamageEnchantment.cpp b/Minecraft.World/DamageEnchantment.cpp index 804e6908..686abc62 100644 --- a/Minecraft.World/DamageEnchantment.cpp +++ b/Minecraft.World/DamageEnchantment.cpp @@ -27,7 +27,7 @@ int DamageEnchantment::getMaxLevel() return 5; } -int DamageEnchantment::getDamageBonus(int level, std::shared_ptr target) +int DamageEnchantment::getDamageBonus(int level, shared_ptr target) { if (type == ALL) { @@ -54,7 +54,7 @@ bool DamageEnchantment::isCompatibleWith(Enchantment *other) const return dynamic_cast(other) == NULL; } -bool DamageEnchantment::canEnchant(std::shared_ptr item) +bool DamageEnchantment::canEnchant(shared_ptr item) { HatchetItem *hatchet = dynamic_cast(item->getItem()); if (hatchet) return true; diff --git a/Minecraft.World/DamageEnchantment.h b/Minecraft.World/DamageEnchantment.h index 7d7a3fd9..00f9b047 100644 --- a/Minecraft.World/DamageEnchantment.h +++ b/Minecraft.World/DamageEnchantment.h @@ -23,8 +23,8 @@ public: virtual int getMinCost(int level); virtual int getMaxCost(int level); virtual int getMaxLevel(); - virtual int getDamageBonus(int level, std::shared_ptr target); + virtual int getDamageBonus(int level, shared_ptr target); virtual int getDescriptionId(); virtual bool isCompatibleWith(Enchantment *other) const; - virtual bool canEnchant(std::shared_ptr item); + virtual bool canEnchant(shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/DamageSource.cpp b/Minecraft.World/DamageSource.cpp index 2b075e0e..29ea727e 100644 --- a/Minecraft.World/DamageSource.cpp +++ b/Minecraft.World/DamageSource.cpp @@ -24,22 +24,22 @@ DamageSource *DamageSource::wither = (new DamageSource(ChatPacket::e_ChatDeathWi DamageSource *DamageSource::anvil = (new DamageSource(ChatPacket::e_ChatDeathAnvil)); DamageSource *DamageSource::fallingBlock = (new DamageSource(ChatPacket::e_ChatDeathFallingBlock)); -DamageSource *DamageSource::mobAttack(std::shared_ptr mob) +DamageSource *DamageSource::mobAttack(shared_ptr mob) { return new EntityDamageSource(ChatPacket::e_ChatDeathMob, mob); } -DamageSource *DamageSource::playerAttack(std::shared_ptr player) +DamageSource *DamageSource::playerAttack(shared_ptr player) { return new EntityDamageSource(ChatPacket::e_ChatDeathPlayer, player); } -DamageSource *DamageSource::arrow(std::shared_ptr arrow, std::shared_ptr owner) +DamageSource *DamageSource::arrow(shared_ptr arrow, shared_ptr owner) { return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathArrow, arrow, owner))->setProjectile(); } -DamageSource *DamageSource::fireball(std::shared_ptr fireball, std::shared_ptr owner) +DamageSource *DamageSource::fireball(shared_ptr fireball, shared_ptr owner) { if (owner == NULL) { @@ -48,17 +48,17 @@ DamageSource *DamageSource::fireball(std::shared_ptr fireball, std::sh return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathFireball, fireball, owner))->setIsFire()->setProjectile(); } -DamageSource *DamageSource::thrown(std::shared_ptr entity, std::shared_ptr owner) +DamageSource *DamageSource::thrown(shared_ptr entity, shared_ptr owner) { return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathThrown, entity, owner))->setProjectile(); } -DamageSource *DamageSource::indirectMagic(std::shared_ptr entity, std::shared_ptr owner) +DamageSource *DamageSource::indirectMagic(shared_ptr entity, shared_ptr owner) { return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathIndirectMagic, entity, owner) )->bypassArmor()->setMagic();; } -DamageSource *DamageSource::thorns(std::shared_ptr source) +DamageSource *DamageSource::thorns(shared_ptr source) { return (new EntityDamageSource(ChatPacket::e_ChatDeathThorns, source))->setMagic(); } @@ -106,14 +106,14 @@ DamageSource::DamageSource(ChatPacket::EChatPacketMessage msgId) m_msgId = msgId; } -std::shared_ptr DamageSource::getDirectEntity() +shared_ptr DamageSource::getDirectEntity() { return getEntity(); } -std::shared_ptr DamageSource::getEntity() +shared_ptr DamageSource::getEntity() { - return std::shared_ptr(); + return shared_ptr(); } DamageSource *DamageSource::bypassArmor() @@ -158,15 +158,15 @@ DamageSource *DamageSource::setMagic() return this; } -//wstring DamageSource::getLocalizedDeathMessage(std::shared_ptr player) +//wstring DamageSource::getLocalizedDeathMessage(shared_ptr player) //{ // return L"death." + msgId + player->name; // //return I18n.get(L"death." + msgId, player.name); //} -std::shared_ptr DamageSource::getDeathMessagePacket(std::shared_ptr player) +shared_ptr DamageSource::getDeathMessagePacket(shared_ptr player) { - return std::shared_ptr( new ChatPacket(player->name, m_msgId ) ); + return shared_ptr( new ChatPacket(player->name, m_msgId ) ); } bool DamageSource::isFire() diff --git a/Minecraft.World/DamageSource.h b/Minecraft.World/DamageSource.h index ecfc2423..2e1d249d 100644 --- a/Minecraft.World/DamageSource.h +++ b/Minecraft.World/DamageSource.h @@ -30,13 +30,13 @@ public: static DamageSource *anvil; static DamageSource *fallingBlock; - static DamageSource *mobAttack(std::shared_ptr mob); - static DamageSource *playerAttack(std::shared_ptr player); - static DamageSource *arrow(std::shared_ptr arrow, std::shared_ptr owner); - static DamageSource *fireball(std::shared_ptr fireball, std::shared_ptr owner); - static DamageSource *thrown(std::shared_ptr entity, std::shared_ptr owner); - static DamageSource *indirectMagic(std::shared_ptr entity, std::shared_ptr owner); - static DamageSource *thorns(std::shared_ptr source); + static DamageSource *mobAttack(shared_ptr mob); + static DamageSource *playerAttack(shared_ptr player); + static DamageSource *arrow(shared_ptr arrow, shared_ptr owner); + static DamageSource *fireball(shared_ptr fireball, shared_ptr owner); + static DamageSource *thrown(shared_ptr entity, shared_ptr owner); + static DamageSource *indirectMagic(shared_ptr entity, shared_ptr owner); + static DamageSource *thorns(shared_ptr source); private: bool _bypassArmor; @@ -66,8 +66,8 @@ protected: public: virtual ~DamageSource() {} - virtual std::shared_ptr getDirectEntity(); - virtual std::shared_ptr getEntity(); + virtual shared_ptr getDirectEntity(); + virtual shared_ptr getEntity(); protected: DamageSource *bypassArmor(); @@ -82,8 +82,8 @@ public: DamageSource *setMagic(); // 4J Stu - Made return a packet - //virtual wstring getLocalizedDeathMessage(std::shared_ptr player); - virtual std::shared_ptr getDeathMessagePacket(std::shared_ptr player); + //virtual wstring getLocalizedDeathMessage(shared_ptr player); + virtual shared_ptr getDeathMessagePacket(shared_ptr player); bool isFire(); ChatPacket::EChatPacketMessage getMsgId(); // 4J Stu - Used to return String diff --git a/Minecraft.World/DeadBushTile.cpp b/Minecraft.World/DeadBushTile.cpp index 84b92817..33fdfe6c 100644 --- a/Minecraft.World/DeadBushTile.cpp +++ b/Minecraft.World/DeadBushTile.cpp @@ -27,7 +27,7 @@ int DeadBushTile::getResource(int data, Random *random, int playerBonusLevel) return -1; } -void DeadBushTile::playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data) +void DeadBushTile::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { if (!level->isClientSide && player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears_Id) { @@ -37,7 +37,7 @@ void DeadBushTile::playerDestroy(Level *level, std::shared_ptr player, i ); // drop leaf block instead of sapling - popResource(level, x, y, z, std::shared_ptr(new ItemInstance(Tile::deadBush, 1, data))); + popResource(level, x, y, z, shared_ptr(new ItemInstance(Tile::deadBush, 1, data))); } else { diff --git a/Minecraft.World/DeadBushTile.h b/Minecraft.World/DeadBushTile.h index b1953e3f..2d74816e 100644 --- a/Minecraft.World/DeadBushTile.h +++ b/Minecraft.World/DeadBushTile.h @@ -12,5 +12,5 @@ protected: public: virtual void updateDefaultShape(); // 4J Added override virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual void playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data); + virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); }; diff --git a/Minecraft.World/DebugOptionsPacket.h b/Minecraft.World/DebugOptionsPacket.h index d731ebdd..9ac5ef2f 100644 --- a/Minecraft.World/DebugOptionsPacket.h +++ b/Minecraft.World/DebugOptionsPacket.h @@ -21,6 +21,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new DebugOptionsPacket()); } + static shared_ptr create() { return shared_ptr(new DebugOptionsPacket()); } virtual int getId() { return 152; } }; diff --git a/Minecraft.World/DefaultGameModeCommand.cpp b/Minecraft.World/DefaultGameModeCommand.cpp index 3b64040d..529733f7 100644 --- a/Minecraft.World/DefaultGameModeCommand.cpp +++ b/Minecraft.World/DefaultGameModeCommand.cpp @@ -7,7 +7,7 @@ EGameCommand DefaultGameModeCommand::getId() return eGameCommand_DefaultGameMode; } -void DefaultGameModeCommand::execute(std::shared_ptr source, byteArray commandData) +void DefaultGameModeCommand::execute(shared_ptr source, byteArray commandData) { //if (args.length > 0) //{ diff --git a/Minecraft.World/DefaultGameModeCommand.h b/Minecraft.World/DefaultGameModeCommand.h index 01a41331..99d45a43 100644 --- a/Minecraft.World/DefaultGameModeCommand.h +++ b/Minecraft.World/DefaultGameModeCommand.h @@ -8,7 +8,7 @@ class DefaultGameModeCommand : public GameModeCommand { public: virtual EGameCommand getId(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); protected: void doSetGameType(GameType *newGameType); diff --git a/Minecraft.World/DefendVillageTargetGoal.cpp b/Minecraft.World/DefendVillageTargetGoal.cpp index 87cb5fe3..ad6b3fd8 100644 --- a/Minecraft.World/DefendVillageTargetGoal.cpp +++ b/Minecraft.World/DefendVillageTargetGoal.cpp @@ -11,7 +11,7 @@ DefendVillageTargetGoal::DefendVillageTargetGoal(VillagerGolem *golem) : TargetG bool DefendVillageTargetGoal::canUse() { - std::shared_ptr village = golem->getVillage(); + shared_ptr village = golem->getVillage(); if (village == NULL) return false; potentialTarget = weak_ptr(village->getClosestAggressor(dynamic_pointer_cast(golem->shared_from_this()))); return canAttack(potentialTarget.lock(), false); diff --git a/Minecraft.World/DelayedRelease.cpp b/Minecraft.World/DelayedRelease.cpp index c1f9a3da..ebd0398f 100644 --- a/Minecraft.World/DelayedRelease.cpp +++ b/Minecraft.World/DelayedRelease.cpp @@ -4,7 +4,7 @@ -DelayedRelease::DelayedRelease(Level *level, std::shared_ptr toRelease, int delay) : Entity(level) +DelayedRelease::DelayedRelease(Level *level, shared_ptr toRelease, int delay) : Entity(level) { moveTo(toRelease->x, toRelease->y, toRelease->z, 0, 0); this->toRelease = toRelease; @@ -37,7 +37,7 @@ void DelayedRelease::defineSynchedData() { } -void DelayedRelease::readAdditionalSaveData(CompoundTag *tag) +void DelayedRelease::readAdditionalSaveData(CompoundTag *tag) { } diff --git a/Minecraft.World/DelayedRelease.h b/Minecraft.World/DelayedRelease.h index 8ec6fcd2..aaccc843 100644 --- a/Minecraft.World/DelayedRelease.h +++ b/Minecraft.World/DelayedRelease.h @@ -10,11 +10,11 @@ public: virtual eINSTANCEOF GetType() { return eTYPE_DELAYEDRELEASE; } private: - std::shared_ptr toRelease; + shared_ptr toRelease; int delay; public: - DelayedRelease(Level *level, std::shared_ptr toRelease, int delay); + DelayedRelease(Level *level, shared_ptr toRelease, int delay); protected: virtual bool makeStepSound(); diff --git a/Minecraft.World/DerivedLevelData.cpp b/Minecraft.World/DerivedLevelData.cpp index 276d1c6e..da3d048d 100644 --- a/Minecraft.World/DerivedLevelData.cpp +++ b/Minecraft.World/DerivedLevelData.cpp @@ -17,7 +17,7 @@ CompoundTag *DerivedLevelData::createTag() return wrapped->createTag(); } -CompoundTag *DerivedLevelData::createTag(vector > *players) +CompoundTag *DerivedLevelData::createTag(vector > *players) { return wrapped->createTag(players); } diff --git a/Minecraft.World/DerivedLevelData.h b/Minecraft.World/DerivedLevelData.h index f5b263db..db5a72d2 100644 --- a/Minecraft.World/DerivedLevelData.h +++ b/Minecraft.World/DerivedLevelData.h @@ -15,7 +15,7 @@ protected: public: CompoundTag *createTag(); - CompoundTag *createTag(vector > *players); + CompoundTag *createTag(vector > *players); int64_t getSeed(); int getXSpawn(); int getYSpawn(); diff --git a/Minecraft.World/DetectorRailTile.cpp b/Minecraft.World/DetectorRailTile.cpp index bec7b16c..e01ec259 100644 --- a/Minecraft.World/DetectorRailTile.cpp +++ b/Minecraft.World/DetectorRailTile.cpp @@ -23,7 +23,7 @@ bool DetectorRailTile::isSignalSource() return true; } -void DetectorRailTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void DetectorRailTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { if (level->isClientSide) { @@ -69,7 +69,7 @@ void DetectorRailTile::checkPressed(Level *level, int x, int y, int z, int curre bool shouldBePressed = false; float b = 2 / 16.0f; - vector > *entities = level->getEntitiesOfClass(typeid(Minecart), AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 1 - b, z + 1 - b)); + vector > *entities = level->getEntitiesOfClass(typeid(Minecart), AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 1 - b, z + 1 - b)); if (!entities->empty()) { shouldBePressed = true; diff --git a/Minecraft.World/DetectorRailTile.h b/Minecraft.World/DetectorRailTile.h index 1dcca19b..dd0e6374 100644 --- a/Minecraft.World/DetectorRailTile.h +++ b/Minecraft.World/DetectorRailTile.h @@ -16,7 +16,7 @@ public: DetectorRailTile(int id); virtual int getTickDelay(); virtual bool isSignalSource(); - virtual void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); virtual void tick(Level *level, int x, int y, int z, Random *random); virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); virtual bool getDirectSignal(Level *level, int x, int y, int z, int facing); diff --git a/Minecraft.World/DigDurabilityEnchantment.cpp b/Minecraft.World/DigDurabilityEnchantment.cpp index 6670371b..f2ef1656 100644 --- a/Minecraft.World/DigDurabilityEnchantment.cpp +++ b/Minecraft.World/DigDurabilityEnchantment.cpp @@ -22,13 +22,13 @@ int DigDurabilityEnchantment::getMaxLevel() return 3; } -bool DigDurabilityEnchantment::canEnchant(std::shared_ptr item) +bool DigDurabilityEnchantment::canEnchant(shared_ptr item) { if (item->isDamageableItem()) return true; return Enchantment::canEnchant(item); } -bool DigDurabilityEnchantment::shouldIgnoreDurabilityDrop(std::shared_ptr item, int level, Random *random) +bool DigDurabilityEnchantment::shouldIgnoreDurabilityDrop(shared_ptr item, int level, Random *random) { ArmorItem *armor = dynamic_cast(item->getItem()); if (armor && random->nextFloat() < 0.6f) return false; diff --git a/Minecraft.World/DigDurabilityEnchantment.h b/Minecraft.World/DigDurabilityEnchantment.h index 4751f3fe..88f6447d 100644 --- a/Minecraft.World/DigDurabilityEnchantment.h +++ b/Minecraft.World/DigDurabilityEnchantment.h @@ -10,6 +10,6 @@ public: virtual int getMinCost(int level); virtual int getMaxCost(int level); virtual int getMaxLevel(); - virtual bool canEnchant(std::shared_ptr item); - static bool shouldIgnoreDurabilityDrop(std::shared_ptr item, int level, Random *random); + virtual bool canEnchant(shared_ptr item); + static bool shouldIgnoreDurabilityDrop(shared_ptr item, int level, Random *random); }; \ No newline at end of file diff --git a/Minecraft.World/DiggerItem.cpp b/Minecraft.World/DiggerItem.cpp index 00d06b22..144b1a11 100644 --- a/Minecraft.World/DiggerItem.cpp +++ b/Minecraft.World/DiggerItem.cpp @@ -14,27 +14,27 @@ DiggerItem::DiggerItem(int id, int attackDamage, const Tier *tier, TileArray *ti this->attackDamage = attackDamage + tier->getAttackDamageBonus(); } -float DiggerItem::getDestroySpeed(std::shared_ptr itemInstance, Tile *tile) +float DiggerItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { for (unsigned int i = 0; i < tiles->length; i++) if ( (*tiles)[i] == tile) return speed; return 1; } -bool DiggerItem::hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker) +bool DiggerItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { itemInstance->hurt(2, attacker); return true; } -bool DiggerItem::mineBlock(std::shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, std::shared_ptr owner) +bool DiggerItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { // Don't damage tools if the tile can be destroyed in one hit. if (Tile::tiles[tile]->getDestroySpeed(level, x, y, z) != 0.0) itemInstance->hurt(1, owner); return true; } -int DiggerItem::getAttackDamage(std::shared_ptr entity) +int DiggerItem::getAttackDamage(shared_ptr entity) { return attackDamage; } @@ -54,7 +54,7 @@ const Item::Tier *DiggerItem::getTier() return tier; } -bool DiggerItem::isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem) +bool DiggerItem::isValidRepairItem(shared_ptr source, shared_ptr repairItem) { if (tier->getTierItemId() == repairItem->id) { diff --git a/Minecraft.World/DiggerItem.h b/Minecraft.World/DiggerItem.h index 747c755f..4a4eeb07 100644 --- a/Minecraft.World/DiggerItem.h +++ b/Minecraft.World/DiggerItem.h @@ -19,13 +19,13 @@ protected: DiggerItem(int id, int attackDamage, const Tier *tier, TileArray *tiles); public: - virtual float getDestroySpeed(std::shared_ptr itemInstance, Tile *tile); - virtual bool hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker); - virtual bool mineBlock(std::shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, std::shared_ptr owner); - virtual int getAttackDamage(std::shared_ptr entity); + virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); + virtual int getAttackDamage(shared_ptr entity); virtual bool isHandEquipped(); virtual int getEnchantmentValue(); const Tier *getTier(); - bool isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem); + bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); }; \ No newline at end of file diff --git a/Minecraft.World/DiggingEnchantment.cpp b/Minecraft.World/DiggingEnchantment.cpp index f6cbcad0..b3775623 100644 --- a/Minecraft.World/DiggingEnchantment.cpp +++ b/Minecraft.World/DiggingEnchantment.cpp @@ -22,7 +22,7 @@ int DiggingEnchantment::getMaxLevel() return 5; } -bool DiggingEnchantment::canEnchant(std::shared_ptr item) +bool DiggingEnchantment::canEnchant(shared_ptr item) { if (item->getItem()->id == Item::shears_Id) return true; return Enchantment::canEnchant(item); diff --git a/Minecraft.World/DiggingEnchantment.h b/Minecraft.World/DiggingEnchantment.h index 48b0fb0b..324f5cdd 100644 --- a/Minecraft.World/DiggingEnchantment.h +++ b/Minecraft.World/DiggingEnchantment.h @@ -10,5 +10,5 @@ public: virtual int getMinCost(int level); virtual int getMaxCost(int level); virtual int getMaxLevel(); - virtual bool canEnchant(std::shared_ptr item); + virtual bool canEnchant(shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/DiodeTile.cpp b/Minecraft.World/DiodeTile.cpp index 748e1a1d..c28778d3 100644 --- a/Minecraft.World/DiodeTile.cpp +++ b/Minecraft.World/DiodeTile.cpp @@ -163,7 +163,7 @@ bool DiodeTile::getSourceSignal(Level *level, int x, int y, int z, int data) case Direction::EAST: return level->getSignal(x + 1, y, z, Facing::EAST) || (level->getTile(x + 1, y, z) == Tile::redStoneDust_Id && level->getData(x + 1, y, z) > 0); case Direction::WEST: - return level->getSignal(x - 1, y, z, Facing::WEST) || (level->getTile(x - 1, y, z) == Tile::redStoneDust_Id && level->getData(x - 1, y, z) > 0); + return level->getSignal(x - 1, y, z, Facing::WEST) || (level->getTile(x - 1, y, z) == Tile::redStoneDust_Id && level->getData(x - 1, y, z) > 0); } return false; } @@ -174,7 +174,7 @@ bool DiodeTile::TestUse() return true; } -bool DiodeTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool DiodeTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) return false; @@ -191,7 +191,7 @@ bool DiodeTile::isSignalSource() return true; } -void DiodeTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void DiodeTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 2) % 4; level->setData(x, y, z, dir); diff --git a/Minecraft.World/DiodeTile.h b/Minecraft.World/DiodeTile.h index ff3b7e88..003b011f 100644 --- a/Minecraft.World/DiodeTile.h +++ b/Minecraft.World/DiodeTile.h @@ -38,9 +38,9 @@ private: virtual bool getSourceSignal(Level *level, int x, int y, int z, int data); public: virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual bool isSignalSource(); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); virtual void onPlace(Level *level, int x, int y, int z); virtual void destroy(Level *level, int x, int y, int z, int data); virtual bool isSolidRender(bool isServerLevel = false); diff --git a/Minecraft.World/DirectoryLevelStorage.cpp b/Minecraft.World/DirectoryLevelStorage.cpp index 210ddf87..5a1dfc0a 100644 --- a/Minecraft.World/DirectoryLevelStorage.cpp +++ b/Minecraft.World/DirectoryLevelStorage.cpp @@ -347,7 +347,7 @@ LevelData *DirectoryLevelStorage::prepareLevel() return NULL; } -void DirectoryLevelStorage::saveLevelData(LevelData *levelData, vector > *players) +void DirectoryLevelStorage::saveLevelData(LevelData *levelData, vector > *players) { // 4J Jev, removed try/catch @@ -381,7 +381,7 @@ void DirectoryLevelStorage::saveLevelData(LevelData *levelData) delete root; } -void DirectoryLevelStorage::save(std::shared_ptr player) +void DirectoryLevelStorage::save(shared_ptr player) { // 4J Jev, removed try/catch. PlayerUID playerXuid = player->getXuid(); @@ -429,7 +429,7 @@ void DirectoryLevelStorage::save(std::shared_ptr player) } // 4J Changed return val to bool to check if new player or loaded player -bool DirectoryLevelStorage::load(std::shared_ptr player) +bool DirectoryLevelStorage::load(shared_ptr player) { bool newPlayer = true; CompoundTag *tag = loadPlayerDataTag( player->getXuid() ); @@ -738,7 +738,7 @@ void DirectoryLevelStorage::dontSaveMapMappingForPlayer(PlayerUID xuid) #endif } -void DirectoryLevelStorage::deleteMapFilesForPlayer(std::shared_ptr player) +void DirectoryLevelStorage::deleteMapFilesForPlayer(shared_ptr player) { PlayerUID playerXuid = player->getXuid(); if(playerXuid != INVALID_XUID) deleteMapFilesForPlayer(playerXuid); diff --git a/Minecraft.World/DirectoryLevelStorage.h b/Minecraft.World/DirectoryLevelStorage.h index 335dc0a6..e47769d9 100644 --- a/Minecraft.World/DirectoryLevelStorage.h +++ b/Minecraft.World/DirectoryLevelStorage.h @@ -119,10 +119,10 @@ public: void checkSession(); virtual ChunkStorage *createChunkStorage(Dimension *dimension); LevelData *prepareLevel(); - virtual void saveLevelData(LevelData *levelData, vector > *players); + virtual void saveLevelData(LevelData *levelData, vector > *players); virtual void saveLevelData(LevelData *levelData); - virtual void save(std::shared_ptr player); - virtual bool load(std::shared_ptr player); // 4J Changed return val to bool to check if new player or loaded player + virtual void save(shared_ptr player); + virtual bool load(shared_ptr player); // 4J Changed return val to bool to check if new player or loaded player virtual CompoundTag *loadPlayerDataTag(PlayerUID xuid); virtual void clearOldPlayerFiles(); // 4J Added PlayerIO *getPlayerIO(); @@ -133,7 +133,7 @@ public: // 4J Added virtual int getAuxValueForMap(PlayerUID xuid, int dimension, int centreXC, int centreZC, int scale); virtual void saveMapIdLookup(); - virtual void deleteMapFilesForPlayer(std::shared_ptr player); + virtual void deleteMapFilesForPlayer(shared_ptr player); virtual void saveAllCachedData(); void resetNetherPlayerPositions(); // 4J Added static wstring getPlayerDir() { return sc_szPlayerDir; } diff --git a/Minecraft.World/DirectoryLevelStorageSource.cpp b/Minecraft.World/DirectoryLevelStorageSource.cpp index ecc49014..b4beb8b5 100644 --- a/Minecraft.World/DirectoryLevelStorageSource.cpp +++ b/Minecraft.World/DirectoryLevelStorageSource.cpp @@ -27,12 +27,12 @@ vector *DirectoryLevelStorageSource::getLevelList() // 4J Stu - We don't use directory list with the Xbox save locations vector *levels = new vector; #if 0 - for (int i = 0; i < 5; i++) + for (int i = 0; i < 5; i++) { wstring levelId = wstring(L"World").append( _toString( (i+1) ) ); LevelData *levelData = getDataTagFor(saveFile, levelId); - if (levelData != NULL) + if (levelData != NULL) { levels->push_back(new LevelSummary(levelId, L"", levelData->getLastPlayed(), levelData->getSizeOnDisk(), levelData.getGameType(), false, levelData->isHardcore())); } @@ -45,7 +45,7 @@ void DirectoryLevelStorageSource::clearAll() { } -LevelData *DirectoryLevelStorageSource::getDataTagFor(ConsoleSaveFile *saveFile, const wstring& levelId) +LevelData *DirectoryLevelStorageSource::getDataTagFor(ConsoleSaveFile *saveFile, const wstring& levelId) { //File dataFile(dir, L"level.dat"); ConsoleSavePath dataFile = ConsoleSavePath( wstring( L"level.dat" ) ); @@ -63,12 +63,12 @@ LevelData *DirectoryLevelStorageSource::getDataTagFor(ConsoleSaveFile *saveFile, } void DirectoryLevelStorageSource::renameLevel(const wstring& levelId, const wstring& newLevelName) -{ +{ ConsoleSaveFileOriginal tempSave(levelId); //File dataFile = File(dir, L"level.dat"); ConsoleSavePath dataFile = ConsoleSavePath( wstring( L"level.dat" ) ); - if ( tempSave.doesFileExist( dataFile ) ) + if ( tempSave.doesFileExist( dataFile ) ) { ConsoleSaveFileInputStream fis = ConsoleSaveFileInputStream(&tempSave, dataFile); CompoundTag *root = NbtIo::readCompressed(&fis); @@ -80,7 +80,7 @@ void DirectoryLevelStorageSource::renameLevel(const wstring& levelId, const wstr } } -bool DirectoryLevelStorageSource::isNewLevelIdAcceptable(const wstring& levelId) +bool DirectoryLevelStorageSource::isNewLevelIdAcceptable(const wstring& levelId) { // 4J Jev, removed try/catch. @@ -95,7 +95,7 @@ bool DirectoryLevelStorageSource::isNewLevelIdAcceptable(const wstring& levelId) return true; } -void DirectoryLevelStorageSource::deleteLevel(const wstring& levelId) +void DirectoryLevelStorageSource::deleteLevel(const wstring& levelId) { File dir = File(baseDir, levelId); if (!dir.exists()) return; @@ -110,7 +110,7 @@ void DirectoryLevelStorageSource::deleteRecursive(vector *files) for (AUTO_VAR(it, files->begin()); it != itEnd; it++) { File *file = *it; - if (file->isDirectory()) + if (file->isDirectory()) { deleteRecursive(file->listFiles()); } @@ -118,9 +118,9 @@ void DirectoryLevelStorageSource::deleteRecursive(vector *files) } } -std::shared_ptr DirectoryLevelStorageSource::selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir) +shared_ptr DirectoryLevelStorageSource::selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir) { - return std::shared_ptr (new DirectoryLevelStorage(saveFile, baseDir, levelId, createPlayerDir)); + return shared_ptr (new DirectoryLevelStorage(saveFile, baseDir, levelId, createPlayerDir)); } bool DirectoryLevelStorageSource::isConvertible(ConsoleSaveFile *saveFile, const wstring& levelId) @@ -133,7 +133,7 @@ bool DirectoryLevelStorageSource::requiresConversion(ConsoleSaveFile *saveFile, return false; } -bool DirectoryLevelStorageSource::convertLevel(ConsoleSaveFile *saveFile, const wstring& levelId, ProgressListener *progress) +bool DirectoryLevelStorageSource::convertLevel(ConsoleSaveFile *saveFile, const wstring& levelId, ProgressListener *progress) { return false; } diff --git a/Minecraft.World/DirectoryLevelStorageSource.h b/Minecraft.World/DirectoryLevelStorageSource.h index e6aab76d..9f6069ab 100644 --- a/Minecraft.World/DirectoryLevelStorageSource.h +++ b/Minecraft.World/DirectoryLevelStorageSource.h @@ -8,7 +8,7 @@ class ProgressListener; class LevelData; class ConsoleSaveFile; -class DirectoryLevelStorageSource : public LevelStorageSource +class DirectoryLevelStorageSource : public LevelStorageSource { protected: const File baseDir; @@ -27,7 +27,7 @@ protected: static void deleteRecursive(vector *files); public: - virtual std::shared_ptr selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir); + virtual shared_ptr selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir); virtual bool isConvertible(ConsoleSaveFile *saveFile, const wstring& levelId); virtual bool requiresConversion(ConsoleSaveFile *saveFile, const wstring& levelId); virtual bool convertLevel(ConsoleSaveFile *saveFile, const wstring& levelId, ProgressListener *progress); diff --git a/Minecraft.World/DisconnectPacket.cpp b/Minecraft.World/DisconnectPacket.cpp index cb018200..da20686a 100644 --- a/Minecraft.World/DisconnectPacket.cpp +++ b/Minecraft.World/DisconnectPacket.cpp @@ -32,7 +32,7 @@ void DisconnectPacket::handle(PacketListener *listener) listener->handleDisconnect(shared_from_this()); } -int DisconnectPacket::getEstimatedSize() +int DisconnectPacket::getEstimatedSize() { return sizeof(eDisconnectReason); } @@ -42,7 +42,7 @@ bool DisconnectPacket::canBeInvalidated() return true; } -bool DisconnectPacket::isInvalidatedBy(std::shared_ptr packet) +bool DisconnectPacket::isInvalidatedBy(shared_ptr packet) { return true; } \ No newline at end of file diff --git a/Minecraft.World/DisconnectPacket.h b/Minecraft.World/DisconnectPacket.h index e2815c2c..34983754 100644 --- a/Minecraft.World/DisconnectPacket.h +++ b/Minecraft.World/DisconnectPacket.h @@ -63,10 +63,10 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new DisconnectPacket()); } + static shared_ptr create() { return shared_ptr(new DisconnectPacket()); } virtual int getId() { return 255; } }; diff --git a/Minecraft.World/DispenserTile.cpp b/Minecraft.World/DispenserTile.cpp index 723aedc0..286737c9 100644 --- a/Minecraft.World/DispenserTile.cpp +++ b/Minecraft.World/DispenserTile.cpp @@ -98,7 +98,7 @@ bool DispenserTile::TestUse() return true; } -bool DispenserTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool DispenserTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) return false; @@ -107,7 +107,7 @@ bool DispenserTile::use(Level *level, int x, int y, int z, std::shared_ptr trap = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr trap = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); player->openTrap(trap); return true; @@ -138,7 +138,7 @@ void DispenserTile::fireArrow(Level *level, int x, int y, int z, Random *random) xd = -1; } - std::shared_ptr trap = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr trap = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if(trap != NULL) { int slot=trap->getRandomSlot(); @@ -152,7 +152,7 @@ void DispenserTile::fireArrow(Level *level, int x, int y, int z, Random *random) double xp = x + xd * 0.6 + 0.5; double yp = y + 0.5; double zp = z + zd * 0.6 + 0.5; - std::shared_ptr item=trap->getItem(slot); + shared_ptr item=trap->getItem(slot); int result = dispenseItem(trap, level, item, random, x, y, z, xd, zd, xp, yp, zp); if (result == REMOVE_ITEM) { @@ -190,12 +190,12 @@ void DispenserTile::tick(Level *level, int x, int y, int z, Random *random) } } -std::shared_ptr DispenserTile::newTileEntity(Level *level) +shared_ptr DispenserTile::newTileEntity(Level *level) { - return std::shared_ptr( new DispenserTileEntity() ); + return shared_ptr( new DispenserTileEntity() ); } -void DispenserTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void DispenserTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3; @@ -207,12 +207,12 @@ void DispenserTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_p void DispenserTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - std::shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if (container != NULL ) { for (unsigned int i = 0; i < container->getContainerSize(); i++) { - std::shared_ptr item = container->getItem(i); + shared_ptr item = container->getItem(i); if (item != NULL) { float xo = random->nextFloat() * 0.8f + 0.1f; @@ -225,9 +225,9 @@ void DispenserTile::onRemove(Level *level, int x, int y, int z, int id, int data if (count > item->count) count = item->count; item->count -= count; - std::shared_ptr newItem = std::shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ); + shared_ptr newItem = shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ); newItem->set4JData( item->get4JData() ); - std::shared_ptr itemEntity = std::shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, newItem ) ); + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, newItem ) ); float pow = 0.05f; itemEntity->xd = (float) random->nextGaussian() * pow; itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; @@ -247,9 +247,9 @@ void DispenserTile::onRemove(Level *level, int x, int y, int z, int id, int data EntityTile::onRemove(level, x, y, z, id, data); } -void DispenserTile::throwItem(Level *level, std::shared_ptr item, Random *random, int accuracy, int xd, int zd, double xp, double yp, double zp) +void DispenserTile::throwItem(Level *level, shared_ptr item, Random *random, int accuracy, int xd, int zd, double xp, double yp, double zp) { - std::shared_ptr itemEntity = std::shared_ptr(new ItemEntity(level, xp, yp - 0.3, zp, item)); + shared_ptr itemEntity = shared_ptr(new ItemEntity(level, xp, yp - 0.3, zp, item)); double pow = random->nextDouble() * 0.1 + 0.2; itemEntity->xd = xd * pow; @@ -263,7 +263,7 @@ void DispenserTile::throwItem(Level *level, std::shared_ptr item, level->addEntity(itemEntity); } -int DispenserTile::dispenseItem(std::shared_ptr trap, Level *level, std::shared_ptr item, Random *random, int x, int y, int z, int xd, int zd, double xp, double yp, double zp) +int DispenserTile::dispenseItem(shared_ptr trap, Level *level, shared_ptr item, Random *random, int x, int y, int z, int xd, int zd, double xp, double yp, double zp) { float power = 1.1f; int accuracy = 6; @@ -276,7 +276,7 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit { - std::shared_ptr arrow = std::shared_ptr( new Arrow(level, xp, yp, zp) ); + shared_ptr arrow = shared_ptr( new Arrow(level, xp, yp, zp) ); arrow->shoot(xd, .1f, zd, power, (float) accuracy); arrow->pickup = Arrow::PICKUP_ALLOWED; level->addEntity(arrow); @@ -291,14 +291,14 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs return LEAVE_ITEM; } - } + } break; case Item::egg_Id: { int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit { - std::shared_ptr egg = std::shared_ptr( new ThrownEgg(level, xp, yp, zp) ); + shared_ptr egg = shared_ptr( new ThrownEgg(level, xp, yp, zp) ); egg->shoot(xd, .1f, zd, power, (float) accuracy); level->addEntity(egg); level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); @@ -319,7 +319,7 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit { - std::shared_ptr snowball = std::shared_ptr( new Snowball(level, xp, yp, zp) ); + shared_ptr snowball = shared_ptr( new Snowball(level, xp, yp, zp) ); snowball->shoot(xd, .1f, zd, power, (float) accuracy); level->addEntity(snowball); level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); @@ -342,14 +342,14 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level { if(PotionItem::isThrowable(item->getAuxValue())) { - std::shared_ptr potion = std::shared_ptr(new ThrownPotion(level, xp, yp, zp, item->getAuxValue())); + shared_ptr potion = shared_ptr(new ThrownPotion(level, xp, yp, zp, item->getAuxValue())); potion->shoot(xd, .1f, zd, power * 1.25f, accuracy * .5f); level->addEntity(potion); level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); } else { - std::shared_ptr itemEntity = std::shared_ptr( new ItemEntity(level, xp, yp - 0.3, zp, item) ); + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, xp, yp - 0.3, zp, item) ); double pow = random->nextDouble() * 0.1 + 0.2; itemEntity->xd = xd * pow; @@ -362,7 +362,7 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level level->addEntity(itemEntity); level->levelEvent(LevelEvent::SOUND_CLICK, x, y, z, 0); - } + } return REMOVE_ITEM; } else @@ -380,7 +380,7 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit { - std::shared_ptr expBottle = std::shared_ptr( new ThrownExpBottle(level, xp, yp, zp) ); + shared_ptr expBottle = shared_ptr( new ThrownExpBottle(level, xp, yp, zp) ); expBottle->shoot(xd, .1f, zd, power * 1.25f, accuracy * .5f); level->addEntity(expBottle); level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); @@ -394,14 +394,14 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs return LEAVE_ITEM; } - } + } break; case Item::fireball_Id: // TU9 { int currentFireballs = level->countInstanceOf(eTYPE_SMALL_FIREBALL,true); if(currentFireballs < Level::MAX_DISPENSABLE_FIREBALLS) // 4J - added limit { - std::shared_ptr fireball = std::shared_ptr( new SmallFireball(level, xp + xd * .3, yp, zp + zd * .3, xd + random->nextGaussian() * .05, random->nextGaussian() * .05, zd + random->nextGaussian() * .05)); + shared_ptr fireball = shared_ptr( new SmallFireball(level, xp + xd * .3, yp, zp + zd * .3, xd + random->nextGaussian() * .05, random->nextGaussian() * .05, zd + random->nextGaussian() * .05)); level->addEntity(fireball); level->levelEvent(LevelEvent::SOUND_BLAZE_FIREBALL, x, y, z, 0); return REMOVE_ITEM; @@ -414,21 +414,21 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs return LEAVE_ITEM; } - } + } break; case Item::monsterPlacer_Id: { int iResult=0; //MonsterPlacerItem *spawnEgg = (MonsterPlacerItem *)item->getItem(); - std::shared_ptr newEntity = MonsterPlacerItem::canSpawn(item->getAuxValue(), level,&iResult); - - std::shared_ptr mob = dynamic_pointer_cast(newEntity); + shared_ptr newEntity = MonsterPlacerItem::canSpawn(item->getAuxValue(), level,&iResult); + + shared_ptr mob = dynamic_pointer_cast(newEntity); if (mob != NULL) - { + { // 4J-PB - Changed the line below slightly since mobs were sticking to the dispenser rather than dropping down when fired mob->moveTo(xp + xd * 0.4, yp - 0.3, zp + zd * 0.4, level->random->nextFloat() * 360, 0); mob->finalizeMobSpawn(); - level->addEntity(mob); + level->addEntity(mob); level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); return REMOVE_ITEM; } @@ -447,7 +447,7 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level { BucketItem *pBucket = (BucketItem *) item->getItem(); - if (pBucket->emptyBucket(level, x, y, z, x + xd, y, z + zd)) + if (pBucket->emptyBucket(level, x, y, z, x + xd, y, z + zd)) { item->id = Item::bucket_empty_Id; item->count = 1; @@ -472,9 +472,9 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level item->id = Item::bucket_water_Id; item->count = 1; } - else if (trap->addItem(std::shared_ptr(new ItemInstance(Item::bucket_water))) < 0) + else if (trap->addItem(shared_ptr(new ItemInstance(Item::bucket_water))) < 0) { - throwItem(level, std::shared_ptr(new ItemInstance(Item::bucket_water)), random, 6, xd, zd, xp, yp, zp); + throwItem(level, shared_ptr(new ItemInstance(Item::bucket_water)), random, 6, xd, zd, xp, yp, zp); } return LEAVE_ITEM; @@ -488,9 +488,9 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level item->id = Item::bucket_lava_Id; item->count = 1; } - else if (trap->addItem(std::shared_ptr(new ItemInstance(Item::bucket_lava))) < 0) + else if (trap->addItem(shared_ptr(new ItemInstance(Item::bucket_lava))) < 0) { - throwItem(level, std::shared_ptr(new ItemInstance(Item::bucket_lava)), random, 6, xd, zd, xp, yp, zp); + throwItem(level, shared_ptr(new ItemInstance(Item::bucket_lava)), random, 6, xd, zd, xp, yp, zp); } return LEAVE_ITEM; @@ -507,22 +507,22 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level xp = x + (xd < 0 ? xd * 0.8 : xd * 1.8f) + Mth::abs(zd) * 0.5f; zp = z + (zd < 0 ? zd * 0.8 : zd * 1.8f) + Mth::abs(xd) * 0.5f; - if (RailTile::isRail(level, x + xd, y, z + zd)) + if (RailTile::isRail(level, x + xd, y, z + zd)) { yp = y + 0.5f; - } - else if (level->isEmptyTile(x + xd, y, z + zd) && RailTile::isRail(level, x + xd, y - 1, z + zd)) + } + else if (level->isEmptyTile(x + xd, y, z + zd) && RailTile::isRail(level, x + xd, y - 1, z + zd)) { yp = y - 0.5f; - } - else + } + else { return DISPENSE_ITEM; } if( level->countInstanceOf(eTYPE_MINECART, true) < Level::MAX_CONSOLE_MINECARTS ) // 4J - added limit { - std::shared_ptr minecart = std::shared_ptr(new Minecart(level, xp, yp, zp, ((MinecartItem *) item->getItem())->type)); + shared_ptr minecart = shared_ptr(new Minecart(level, xp, yp, zp, ((MinecartItem *) item->getItem())->type)); level->addEntity(minecart); level->levelEvent(LevelEvent::SOUND_CLICK, x, y, z, 0); @@ -542,21 +542,21 @@ int DispenserTile::dispenseItem(std::shared_ptr trap, Level xp = x + (xd < 0 ? xd * 0.8 : xd * 1.8f) + Mth::abs(zd) * 0.5f; zp = z + (zd < 0 ? zd * 0.8 : zd * 1.8f) + Mth::abs(xd) * 0.5f; - if (level->getMaterial(x + xd, y, z + zd) == Material::water) + if (level->getMaterial(x + xd, y, z + zd) == Material::water) { bLaunchBoat=true; yp = y + 1.0f; - } - else if (level->isEmptyTile(x + xd, y, z + zd) && level->getMaterial(x + xd, y - 1, z + zd) == Material::water) + } + else if (level->isEmptyTile(x + xd, y, z + zd) && level->getMaterial(x + xd, y - 1, z + zd) == Material::water) { bLaunchBoat=true; yp = y; - } + } // check the limit on boats if( bLaunchBoat && level->countInstanceOf(eTYPE_BOAT, true) < Level::MAX_XBOX_BOATS ) // 4J - added limit { - std::shared_ptr boat = std::shared_ptr(new Boat(level, xp, yp, zp)); + shared_ptr boat = shared_ptr(new Boat(level, xp, yp, zp)); level->addEntity(boat); level->levelEvent(LevelEvent::SOUND_CLICK, x, y, z, 0); return REMOVE_ITEM; diff --git a/Minecraft.World/DispenserTile.h b/Minecraft.World/DispenserTile.h index f693c5fa..5bc892aa 100644 --- a/Minecraft.World/DispenserTile.h +++ b/Minecraft.World/DispenserTile.h @@ -40,7 +40,7 @@ public: //@Override void registerIcons(IconRegister *iconRegister); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param private: void fireArrow(Level *level, int x, int y, int z, Random *random); @@ -48,11 +48,11 @@ private: public: virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual std::shared_ptr newTileEntity(Level *level); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual shared_ptr newTileEntity(Level *level); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); private: - static void throwItem(Level *level, std::shared_ptr item, Random *random, int accuracy, int xd, int zd, double xp, double yp, double zp); - static int dispenseItem(std::shared_ptr trap, Level *level, std::shared_ptr item, Random *random, int x, int y, int z, int xd, int zd, double xp, double yp, double zp); + static void throwItem(Level *level, shared_ptr item, Random *random, int accuracy, int xd, int zd, double xp, double yp, double zp); + static int dispenseItem(shared_ptr trap, Level *level, shared_ptr item, Random *random, int x, int y, int z, int xd, int zd, double xp, double yp, double zp); }; \ No newline at end of file diff --git a/Minecraft.World/DispenserTileEntity.cpp b/Minecraft.World/DispenserTileEntity.cpp index f06bc4c2..2c4705ea 100644 --- a/Minecraft.World/DispenserTileEntity.cpp +++ b/Minecraft.World/DispenserTileEntity.cpp @@ -25,32 +25,32 @@ DispenserTileEntity::~DispenserTileEntity() delete random; } -unsigned int DispenserTileEntity::getContainerSize() +unsigned int DispenserTileEntity::getContainerSize() { return 9; } -std::shared_ptr DispenserTileEntity::getItem(unsigned int slot) +shared_ptr DispenserTileEntity::getItem(unsigned int slot) { return items->data[slot]; } -std::shared_ptr DispenserTileEntity::removeItem(unsigned int slot, int count) +shared_ptr DispenserTileEntity::removeItem(unsigned int slot, int count) { if (items->data[slot] != NULL) { if (items->data[slot]->count <= count) { - std::shared_ptr item = items->data[slot]; + shared_ptr item = items->data[slot]; items->data[slot] = nullptr; this->setChanged(); // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; - } - else + } + else { - std::shared_ptr i = items->data[slot]->remove(count); + shared_ptr i = items->data[slot]->remove(count); if (items->data[slot]->count == 0) items->data[slot] = nullptr; this->setChanged(); // 4J Stu - Fix for duplication glitch @@ -61,11 +61,11 @@ std::shared_ptr DispenserTileEntity::removeItem(unsigned int slot, return nullptr; } -std::shared_ptr DispenserTileEntity::removeItemNoUpdate(int slot) +shared_ptr DispenserTileEntity::removeItemNoUpdate(int slot) { if (items->data[slot] != NULL) { - std::shared_ptr item = items->data[slot]; + shared_ptr item = items->data[slot]; items->data[slot] = nullptr; return item; } @@ -73,7 +73,7 @@ std::shared_ptr DispenserTileEntity::removeItemNoUpdate(int slot) } // 4J-PB added for spawn eggs not being useable due to limits, so add them in again -void DispenserTileEntity::AddItemBack(std::shared_ptritem, unsigned int slot) +void DispenserTileEntity::AddItemBack(shared_ptritem, unsigned int slot) { if (items->data[slot] != NULL) { @@ -82,7 +82,7 @@ void DispenserTileEntity::AddItemBack(std::shared_ptritem, unsigne { items->data[slot]->count++; this->setChanged(); - } + } } else { @@ -93,7 +93,7 @@ void DispenserTileEntity::AddItemBack(std::shared_ptritem, unsigne } /** * Removes an item with the given id and returns true if one was found. -* +* * @param itemId * @return */ @@ -103,7 +103,7 @@ bool DispenserTileEntity::removeProjectile(int itemId) { if (items->data[i] != NULL && items->data[i]->id == itemId) { - std::shared_ptr removedItem = removeItem(i, 1); + shared_ptr removedItem = removeItem(i, 1); return removedItem != NULL; } } @@ -116,7 +116,7 @@ int DispenserTileEntity::getRandomSlot() int replaceOdds = 1; for (unsigned int i = 0; i < items->length; i++) { - if (items->data[i] != NULL && random->nextInt(replaceOdds++) == 0) + if (items->data[i] != NULL && random->nextInt(replaceOdds++) == 0) { replaceSlot = i; } @@ -125,14 +125,14 @@ int DispenserTileEntity::getRandomSlot() return replaceSlot; } -void DispenserTileEntity::setItem(unsigned int slot, std::shared_ptr item) +void DispenserTileEntity::setItem(unsigned int slot, shared_ptr item) { items->data[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); this->setChanged(); } -int DispenserTileEntity::addItem(std::shared_ptr item) +int DispenserTileEntity::addItem(shared_ptr item) { for (int i = 0; i < items->length; i++) { @@ -146,7 +146,7 @@ int DispenserTileEntity::addItem(std::shared_ptr item) return -1; } -int DispenserTileEntity::getName() +int DispenserTileEntity::getName() { return IDS_TILE_DISPENSER; } @@ -169,7 +169,7 @@ void DispenserTileEntity::save(CompoundTag *base) TileEntity::save(base); ListTag *listTag = new ListTag; - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items->length; i++) { if (items->data[i] != NULL) { @@ -182,12 +182,12 @@ void DispenserTileEntity::save(CompoundTag *base) base->put(L"Items", listTag); } -int DispenserTileEntity::getMaxStackSize() +int DispenserTileEntity::getMaxStackSize() { return Container::LARGE_MAX_STACK_SIZE; } -bool DispenserTileEntity::stillValid(std::shared_ptr player) +bool DispenserTileEntity::stillValid(shared_ptr player) { if (level->getTileEntity(x, y, z) != shared_from_this() ) return false; if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; @@ -208,9 +208,9 @@ void DispenserTileEntity::stopOpen() } // 4J Added -std::shared_ptr DispenserTileEntity::clone() +shared_ptr DispenserTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new DispenserTileEntity() ); + shared_ptr result = shared_ptr( new DispenserTileEntity() ); TileEntity::clone(result); for (unsigned int i = 0; i < items->length; i++) diff --git a/Minecraft.World/DispenserTileEntity.h b/Minecraft.World/DispenserTileEntity.h index d7c6385a..8519ad54 100644 --- a/Minecraft.World/DispenserTileEntity.h +++ b/Minecraft.World/DispenserTileEntity.h @@ -29,24 +29,24 @@ public: virtual ~DispenserTileEntity(); virtual unsigned int getContainerSize(); - virtual std::shared_ptr getItem(unsigned int slot); - virtual std::shared_ptr removeItem(unsigned int slot, int count); - std::shared_ptr removeItemNoUpdate(int slot); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + shared_ptr removeItemNoUpdate(int slot); bool removeProjectile(int itemId); int getRandomSlot(); - virtual void setItem(unsigned int slot, std::shared_ptr item); - virtual int addItem(std::shared_ptr item); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual int addItem(shared_ptr item); virtual int getName(); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); virtual int getMaxStackSize(); - virtual bool stillValid(std::shared_ptr player); + virtual bool stillValid(shared_ptr player); virtual void setChanged(); void startOpen(); void stopOpen(); // 4J Added - virtual std::shared_ptr clone(); - void AddItemBack(std::shared_ptritem, unsigned int slot); + virtual shared_ptr clone(); + void AddItemBack(shared_ptritem, unsigned int slot); }; \ No newline at end of file diff --git a/Minecraft.World/DoorItem.cpp b/Minecraft.World/DoorItem.cpp index 122b7be1..d59ac8d9 100644 --- a/Minecraft.World/DoorItem.cpp +++ b/Minecraft.World/DoorItem.cpp @@ -18,7 +18,7 @@ DoorItem::DoorItem(int id, Material *material) : Item(id) maxStackSize = 1; } -bool DoorItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool DoorItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { if (face != Facing::UP) return false; y++; diff --git a/Minecraft.World/DoorItem.h b/Minecraft.World/DoorItem.h index be471714..843c768b 100644 --- a/Minecraft.World/DoorItem.h +++ b/Minecraft.World/DoorItem.h @@ -7,7 +7,7 @@ class Player; class Material; class Level; -class DoorItem : public Item +class DoorItem : public Item { private: Material *material; @@ -15,6 +15,6 @@ private: public: DoorItem(int id, Material *material); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); static void place(Level *level, int x, int y, int z, int dir, Tile *tile); }; diff --git a/Minecraft.World/DoorTile.cpp b/Minecraft.World/DoorTile.cpp index 9b481269..be31be27 100644 --- a/Minecraft.World/DoorTile.cpp +++ b/Minecraft.World/DoorTile.cpp @@ -107,7 +107,7 @@ AABB *DoorTile::getAABB(Level *level, int x, int y, int z) return retval; } -void DoorTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void DoorTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { setShape(getCompositeData(level,x, y, z)); } @@ -167,7 +167,7 @@ void DoorTile::setShape(int compositeData) } } -void DoorTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void DoorTile::attack(Level *level, int x, int y, int z, shared_ptr player) { // Fix for #92957 - TU11: Content: Multiplayer: Wooden Doors splits in half and glitch in open / close motion while being mined. // In lastest PC version this is commented out, so do that now to fix bug above @@ -180,7 +180,7 @@ bool DoorTile::TestUse() return true; } -bool DoorTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool DoorTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if(soundOnly) { diff --git a/Minecraft.World/DoorTile.h b/Minecraft.World/DoorTile.h index 7dffe612..59a8b414 100644 --- a/Minecraft.World/DoorTile.h +++ b/Minecraft.World/DoorTile.h @@ -38,16 +38,16 @@ public: virtual int getRenderShape(); virtual AABB *getTileAABB(Level *level, int x, int y, int z); virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param int getDir(LevelSource *level, int x, int y, int z); bool isOpen(LevelSource *level, int x, int y, int z); private: using Tile::setShape; virtual void setShape(int compositeData); public: - virtual void attack(Level *level, int x, int y, int z, std::shared_ptr player); + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param void setOpen(Level *level, int x, int y, int z, bool shouldOpen); virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual int getResource(int data, Random *random, int playerBonusLevel); diff --git a/Minecraft.World/DownfallLayer.cpp b/Minecraft.World/DownfallLayer.cpp index 6d345cb5..30775218 100644 --- a/Minecraft.World/DownfallLayer.cpp +++ b/Minecraft.World/DownfallLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.newbiome.layer.h" -DownfallLayer::DownfallLayer(std::shared_ptrparent) : Layer(0) +DownfallLayer::DownfallLayer(shared_ptrparent) : Layer(0) { this->parent = parent; } diff --git a/Minecraft.World/DownfallLayer.h b/Minecraft.World/DownfallLayer.h index ed191b17..e708253c 100644 --- a/Minecraft.World/DownfallLayer.h +++ b/Minecraft.World/DownfallLayer.h @@ -5,6 +5,6 @@ class DownfallLayer : public Layer { public: - DownfallLayer(std::shared_ptrparent); + DownfallLayer(shared_ptrparent); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/DownfallMixerLayer.cpp b/Minecraft.World/DownfallMixerLayer.cpp index 34e19b27..fcca5bdd 100644 --- a/Minecraft.World/DownfallMixerLayer.cpp +++ b/Minecraft.World/DownfallMixerLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.newbiome.layer.h" -DownfallMixerLayer::DownfallMixerLayer(std::shared_ptrdownfall, std::shared_ptrparent, int layer) : Layer(0) +DownfallMixerLayer::DownfallMixerLayer(shared_ptrdownfall, shared_ptrparent, int layer) : Layer(0) { this->parent = parent; this->downfall = downfall; diff --git a/Minecraft.World/DownfallMixerLayer.h b/Minecraft.World/DownfallMixerLayer.h index c0149dce..58e6151d 100644 --- a/Minecraft.World/DownfallMixerLayer.h +++ b/Minecraft.World/DownfallMixerLayer.h @@ -5,10 +5,10 @@ class DownfallMixerLayer : public Layer { private: - std::shared_ptr downfall; + shared_ptr downfall; int layer; public: - DownfallMixerLayer(std::shared_ptr downfall, std::shared_ptr parent, int layer); + DownfallMixerLayer(shared_ptr downfall, shared_ptr parent, int layer); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/DragonFireball.cpp b/Minecraft.World/DragonFireball.cpp index 6146b8a1..e3b5d579 100644 --- a/Minecraft.World/DragonFireball.cpp +++ b/Minecraft.World/DragonFireball.cpp @@ -17,7 +17,7 @@ DragonFireball::DragonFireball(Level *level) : Fireball(level) setSize(5 / 16.0f, 5 / 16.0f); } -DragonFireball::DragonFireball(Level *level, std::shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) +DragonFireball::DragonFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) { setSize(5 / 16.0f, 5 / 16.0f); } @@ -32,15 +32,15 @@ void DragonFireball::onHit(HitResult *res) if (!level->isClientSide) { AABB *aoe = bb->grow(SPLASH_RANGE, SPLASH_RANGE / 2, SPLASH_RANGE); - vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(Mob), aoe); + vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(Mob), aoe); if (entitiesOfClass != NULL && !entitiesOfClass->empty()) { //for (Entity e : entitiesOfClass) for( AUTO_VAR(it, entitiesOfClass->begin()); it != entitiesOfClass->end(); ++it) { - //std::shared_ptr e = *it; - std::shared_ptr e = dynamic_pointer_cast( *it ); + //shared_ptr e = *it; + shared_ptr e = dynamic_pointer_cast( *it ); double dist = distanceToSqr(e); if (dist < SPLASH_RANGE_SQ) { diff --git a/Minecraft.World/DragonFireball.h b/Minecraft.World/DragonFireball.h index 96ab6d9f..9ce199ed 100644 --- a/Minecraft.World/DragonFireball.h +++ b/Minecraft.World/DragonFireball.h @@ -18,7 +18,7 @@ private: public: DragonFireball(Level *level); - DragonFireball(Level *level, std::shared_ptr mob, double xa, double ya, double za); + DragonFireball(Level *level, shared_ptr mob, double xa, double ya, double za); DragonFireball(Level *level, double x, double y, double z, double xa, double ya, double za); protected: diff --git a/Minecraft.World/DurangoStats.cpp b/Minecraft.World/DurangoStats.cpp index 884adf39..c9b51c84 100644 --- a/Minecraft.World/DurangoStats.cpp +++ b/Minecraft.World/DurangoStats.cpp @@ -54,9 +54,9 @@ bool DsItemEvent::onLeaderboard(ELeaderboardId leaderboard, eAcquisitionMethod m case eAcquisitionMethod_Mined: switch (param->itemId) { - case Tile::dirt_Id: + case Tile::dirt_Id: case Tile::stoneBrick_Id: - case Tile::sand_Id: + case Tile::sand_Id: case Tile::rock_Id: case Tile::gravel_Id: case Tile::clay_Id: @@ -102,7 +102,7 @@ int DsItemEvent::mergeIds(int itemId) } } -void DsItemEvent::handleParamBlob(std::shared_ptr player, byteArray paramBlob) +void DsItemEvent::handleParamBlob(shared_ptr player, byteArray paramBlob) { if (paramBlob.length == sizeof(Param)) { @@ -170,7 +170,7 @@ void DsItemEvent::handleParamBlob(std::shared_ptr player, byteArray else { EventWriteMcItemAcquired( - DurangoStats::getUserId(player), + DurangoStats::getUserId(player), 0, // TODO DurangoStats::getPlayerSession(), 0, @@ -205,7 +205,7 @@ byteArray DsItemEvent::createParamBlob(eAcquisitionMethod eMethod, int itemId, i DsMobKilled::DsMobKilled(int id, const wstring &name) : Stat(id,name) {} -void DsMobKilled::handleParamBlob(std::shared_ptr player, byteArray paramBlob) +void DsMobKilled::handleParamBlob(shared_ptr player, byteArray paramBlob) { if (paramBlob.length == sizeof(Param)) { @@ -222,7 +222,7 @@ void DsMobKilled::handleParamBlob(std::shared_ptr player, byteArray DurangoStats::getPlayerSession(), // ROUND ID 0, param->weaponId, - param->mobType, + param->mobType, param->isRanged?1:0, 0, 0, 0, // (x,y,z), 0, @@ -231,7 +231,7 @@ void DsMobKilled::handleParamBlob(std::shared_ptr player, byteArray == 0) { app.DebugPrintf("<%ls>\t%s(%i:%i:%i:%i)\n", DurangoStats::getUserId(player), - (param->isRanged?"mobShotWithEntity":"mobKilledInMelee"), + (param->isRanged?"mobShotWithEntity":"mobKilledInMelee"), param->mobType, param->weaponId, param->distance, param->damage); } @@ -262,7 +262,7 @@ void DsMobKilled::handleParamBlob(std::shared_ptr player, byteArray } } -byteArray DsMobKilled::createParamBlob(std::shared_ptr player, std::shared_ptr mob, DamageSource *dmgSrc) +byteArray DsMobKilled::createParamBlob(shared_ptr player, shared_ptr mob, DamageSource *dmgSrc) { // 4J-JEV: Get the id we use for Durango Server Stats. int mob_networking_id; @@ -286,25 +286,25 @@ byteArray DsMobKilled::createParamBlob(std::shared_ptr player, std::shar { byteArray output; Param param = { - DsMobKilled::RANGED, + DsMobKilled::RANGED, mob_networking_id, EntityIO::eTypeToIoid(dmgSrc->getDirectEntity()->GetType()), - mob->distanceTo(player->x, player->y, player->z), + mob->distanceTo(player->x, player->y, player->z), 0/*not needed*/ }; output.data = (byte*) new Param(param); output.length = sizeof(Param); return output; } - + // Kill made in melee, use itemInHand as weapon. - std::shared_ptr item = player->getCarriedItem(); + shared_ptr item = player->getCarriedItem(); byteArray output; Param param = { - DsMobKilled::MELEE, - mob_networking_id, + DsMobKilled::MELEE, + mob_networking_id, (item != NULL ? item->getItem()->id : 0), - mob->distanceTo(player->x, player->y, player->z), + mob->distanceTo(player->x, player->y, player->z), 0/*not needed*/ }; output.data = (byte*) new Param(param); @@ -323,7 +323,7 @@ string DsMobInteract::nameInteract[] = { DsMobInteract::DsMobInteract(int id, const wstring &name) : Stat(id,name) {} -void DsMobInteract::handleParamBlob(std::shared_ptr player, byteArray paramBlob) +void DsMobInteract::handleParamBlob(shared_ptr player, byteArray paramBlob) { if (paramBlob.length == sizeof(Param)) { @@ -336,8 +336,8 @@ void DsMobInteract::handleParamBlob(std::shared_ptr player, byteArr EventWriteMobInteract( DurangoStats::getUserId(player), - DurangoStats::getPlayerSession(), - param->mobId, + DurangoStats::getPlayerSession(), + param->mobId, param->interactionType ); } } @@ -368,7 +368,7 @@ unsigned int DsTravel::CACHE_SIZES[eMethod_MAX] = 0, // FALL - Meters? - Fall event naturally only sends on land, no caching necessary. 10, // CLIMB - Meters? 70, // CART - Meters? - 70, // BOAT - Meters? + 70, // BOAT - Meters? 10, // PIG - Meters? 20*60*5, // TIME - GameTicks (20*60*5 ~ 5 mins) }; @@ -378,7 +378,7 @@ DsTravel::DsTravel(int id, const wstring &name) : Stat(id,name) ZeroMemory(¶m_cache, sizeof(unsigned int)*eMethod_MAX*MAX_LOCAL_PLAYERS); } -void DsTravel::handleParamBlob(std::shared_ptr player, byteArray paramBlob) +void DsTravel::handleParamBlob(shared_ptr player, byteArray paramBlob) { if (paramBlob.length == sizeof(Param)) { @@ -416,7 +416,7 @@ int DsTravel::cache(int iPad, Param ¶m) return 0; } -void DsTravel::flush(std::shared_ptr player) +void DsTravel::flush(shared_ptr player) { int iPad = player->GetXboxPad(); for (int i = 0; i < eMethod_MAX; i++) @@ -429,7 +429,7 @@ void DsTravel::flush(std::shared_ptr player) } } -void DsTravel::write(std::shared_ptr player, eMethod method, int distance) +void DsTravel::write(shared_ptr player, eMethod method, int distance) { if (player == nullptr) return; @@ -477,7 +477,7 @@ void DsTravel::write(std::shared_ptr player, eMethod method, int di DsItemUsed::DsItemUsed(int id, const wstring &name) : Stat(id,name) {} -void DsItemUsed::handleParamBlob(std::shared_ptr player, byteArray paramBlob) +void DsItemUsed::handleParamBlob(shared_ptr player, byteArray paramBlob) { if (paramBlob.length == sizeof(Param)) { @@ -520,14 +520,14 @@ byteArray DsItemUsed::createParamBlob(int itemId, int aux, int count, int health DsAchievement::DsAchievement(int id, const wstring &name) : Stat(id,name) {} -void DsAchievement::handleParamBlob(std::shared_ptr player, byteArray paramBlob) +void DsAchievement::handleParamBlob(shared_ptr player, byteArray paramBlob) { if (paramBlob.length == sizeof(SmallParam)) { SmallParam *paramS = (SmallParam*) paramBlob.data; assert( DurangoStats::binaryAchievement(paramS->award) ); app.DebugPrintf("<%ls>\tAchievement(%i)\n", DurangoStats::getUserId(player), paramS->award); - + bool canAward = true; if(paramS->award == eAward_stayinFrosty) { @@ -616,12 +616,12 @@ byteArray DsAchievement::createLargeParamBlob(eAward award, int count) DsChangedDimension::DsChangedDimension(int id, const wstring &name) : Stat(id,name) {} -void DsChangedDimension::handleParamBlob(std::shared_ptr player, byteArray paramBlob) +void DsChangedDimension::handleParamBlob(shared_ptr player, byteArray paramBlob) { if (paramBlob.length == sizeof(Param)) { Param *param = (Param*) paramBlob.data; - app.DebugPrintf("<%ls>\tchangedDimension(%i:%i)\n", DurangoStats::getUserId(player), + app.DebugPrintf("<%ls>\tchangedDimension(%i:%i)\n", DurangoStats::getUserId(player), param->fromDimId, param->toDimId); // No longer used. @@ -644,7 +644,7 @@ byteArray DsChangedDimension::createParamBlob(int fromDimId, int toDimId) DsEnteredBiome::DsEnteredBiome(int id, const wstring &name) : Stat(id,name) {} -void DsEnteredBiome::handleParamBlob(std::shared_ptr player, byteArray paramBlob) +void DsEnteredBiome::handleParamBlob(shared_ptr player, byteArray paramBlob) { if (paramBlob.length == sizeof(Param)) { @@ -713,7 +713,7 @@ DurangoStats::~DurangoStats() Stat *DurangoStats::get_stat(int i) { - switch (i) + switch (i) { case itemsAcquired_Id: return (Stat*) itemsAcquired; case itemUsed_Id: return (Stat*) itemUsed; @@ -826,7 +826,7 @@ Stat* DurangoStats::get_itemsCrafted(int itemId) { switch (itemId) { - // 4J-JEV: These items can be crafted trivially to and from their block equivalents, + // 4J-JEV: These items can be crafted trivially to and from their block equivalents, // 'Acquire Hardware' also relies on 'Count_Crafted(IronIngot) == Count_Forged(IronIngot)" on the Stats server. case Item::ironIngot_Id: case Item::goldIngot_Id: @@ -839,7 +839,7 @@ Stat* DurangoStats::get_itemsCrafted(int itemId) default: return (Stat*) itemsAcquired; } - + } Stat* DurangoStats::get_itemsSmelted(int itemId) @@ -871,7 +871,7 @@ Stat* DurangoStats::get_enteredBiome(int biomeId) Stat* DurangoStats::get_achievement(eAward achievementId) { // Special case for 'binary' achievements. - if ( binaryAchievement(achievementId) + if ( binaryAchievement(achievementId) || enhancedAchievement(achievementId) ) { switch (achievementId) @@ -888,43 +888,43 @@ Stat* DurangoStats::get_achievement(eAward achievementId) { return get_curedEntity(eTYPE_ZOMBIE); } - + // Other achievements awarded through more detailed generic events. return NULL; } byteArray DurangoStats::getParam_walkOneM(int distance) -{ +{ return DsTravel::createParamBlob(DsTravel::eMethod_walk, distance); } byteArray DurangoStats::getParam_swimOneM(int distance) -{ +{ return DsTravel::createParamBlob(DsTravel::eMethod_swim,distance); } byteArray DurangoStats::getParam_fallOneM(int distance) -{ +{ return DsTravel::createParamBlob(DsTravel::eMethod_fall,distance); } byteArray DurangoStats::getParam_climbOneM(int distance) -{ +{ return DsTravel::createParamBlob(DsTravel::eMethod_climb,distance); } byteArray DurangoStats::getParam_minecartOneM(int distance) -{ +{ return DsTravel::createParamBlob(DsTravel::eMethod_minecart,distance); } byteArray DurangoStats::getParam_boatOneM(int distance) -{ +{ return DsTravel::createParamBlob(DsTravel::eMethod_boat,distance); } byteArray DurangoStats::getParam_pigOneM(int distance) -{ +{ return DsTravel::createParamBlob(DsTravel::eMethod_pig,distance); } @@ -953,10 +953,10 @@ byteArray DurangoStats::getParam_itemsCrafted(int id, int aux, int count) return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Crafted, id, aux, count); } -byteArray DurangoStats::getParam_itemsUsed(std::shared_ptr player, std::shared_ptr itm) +byteArray DurangoStats::getParam_itemsUsed(shared_ptr player, shared_ptr itm) { return DsItemUsed::createParamBlob( - itm->getItem()->id, itm->getAuxValue(), itm->GetCount(), + itm->getItem()->id, itm->getAuxValue(), itm->GetCount(), player->getHealth(), player->getFoodData()->getFoodLevel() ); } @@ -966,7 +966,7 @@ byteArray DurangoStats::getParam_itemsBought(int id, int aux, int count) return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Bought, id, aux, count); } -byteArray DurangoStats::getParam_mobKill(std::shared_ptr player, std::shared_ptr mob, DamageSource *dmgSrc) +byteArray DurangoStats::getParam_mobKill(shared_ptr player, shared_ptr mob, DamageSource *dmgSrc) { return DsMobKilled::createParamBlob(player,mob,dmgSrc); } @@ -993,7 +993,7 @@ byteArray DurangoStats::getParam_craftedEntity(eINSTANCEOF entityId) byteArray DurangoStats::getParam_shearedEntity(eINSTANCEOF entityId) { - return DsMobInteract::createParamBlob(DsMobInteract::eInteract_Sheared, entityId); + return DsMobInteract::createParamBlob(DsMobInteract::eInteract_Sheared, entityId); } byteArray DurangoStats::getParam_time(int timediff) @@ -1016,7 +1016,7 @@ byteArray DurangoStats::getParam_achievement(eAward id) if (binaryAchievement(id)) { return DsAchievement::createSmallParamBlob(id); - } + } else if (enhancedAchievement(id)) { assert(false); // Should be calling the appropriate getParam function. @@ -1071,7 +1071,7 @@ bool DurangoStats::binaryAchievement(eAward achievementId) } /** 4J-JEV, - Basically achievements with an inconsequential extra parameter + Basically achievements with an inconsequential extra parameter that I thought best not to / prefered not to / couldn't be bothered to make class handlers for. (Motivation: it would be nice for players to see how close they were/are to achieving these things). */ @@ -1114,7 +1114,7 @@ LPCWSTR DurangoStats::getMultiplayerCorrelationId() return ((DurangoStats*)GenericStats::getInstance())->multiplayerCorrelationId->Data(); } -LPCWSTR DurangoStats::getUserId(std::shared_ptr player) +LPCWSTR DurangoStats::getUserId(shared_ptr player) { return getUserId(player->GetXboxPad()); } @@ -1128,12 +1128,12 @@ LPCWSTR DurangoStats::getUserId(int iPad) return cache.c_str(); } -void DurangoStats::playerSessionStart(PlayerUID uid, std::shared_ptr plr) +void DurangoStats::playerSessionStart(PlayerUID uid, shared_ptr plr) { if (plr != NULL && plr->level != NULL && plr->level->getLevelData() != NULL) { //wprintf(uid.toString().c_str()); - + //EventWritePlayerSessionStart( app.DebugPrintf(">>>\tPlayerSessionStart(%ls,%s,%ls,%i,%i)\n", uid.toString(), @@ -1155,7 +1155,7 @@ void DurangoStats::playerSessionStart(PlayerUID uid, std::shared_ptr plr void DurangoStats::playerSessionStart(int iPad) { - PlayerUID puid; std::shared_ptr plr; + PlayerUID puid; shared_ptr plr; ProfileManager.GetXUID(iPad, &puid, true); plr = Minecraft::GetInstance()->localplayers[iPad]; playerSessionStart(puid,plr); @@ -1163,7 +1163,7 @@ void DurangoStats::playerSessionStart(int iPad) void DurangoStats::playerSessionPause(int iPad) { - std::shared_ptr plr = Minecraft::GetInstance()->localplayers[iPad]; + shared_ptr plr = Minecraft::GetInstance()->localplayers[iPad]; if (plr != NULL && plr->level != NULL && plr->level->getLevelData() != NULL) { PlayerUID puid; @@ -1186,7 +1186,7 @@ void DurangoStats::playerSessionPause(int iPad) void DurangoStats::playerSessionResume(int iPad) { - std::shared_ptr plr = Minecraft::GetInstance()->localplayers[iPad]; + shared_ptr plr = Minecraft::GetInstance()->localplayers[iPad]; if (plr != NULL && plr->level != NULL && plr->level->getLevelData() != NULL) { PlayerUID puid; @@ -1213,7 +1213,7 @@ void DurangoStats::playerSessionResume(int iPad) void DurangoStats::playerSessionEnd(int iPad) { - std::shared_ptr plr = Minecraft::GetInstance()->localplayers[iPad]; + shared_ptr plr = Minecraft::GetInstance()->localplayers[iPad]; if (plr != NULL) { DurangoStats::getInstance()->travel->flush(plr); diff --git a/Minecraft.World/DurangoStats.h b/Minecraft.World/DurangoStats.h index 7956b1aa..1b2f7723 100644 --- a/Minecraft.World/DurangoStats.h +++ b/Minecraft.World/DurangoStats.h @@ -20,7 +20,7 @@ public: enum eAcquisitionMethod { eAcquisitionMethod_None = 0, - + eAcquisitionMethod_Pickedup, eAcquisitionMethod_Crafted, eAcquisitionMethod_TakenFromChest, @@ -30,7 +30,7 @@ public: eAcquisitionMethod_Mined, eAcquisitionMethod_Placed, - + eAcquisitionMethod_MAX }; @@ -44,7 +44,7 @@ public: bool onLeaderboard(ELeaderboardId leaderboard, eAcquisitionMethod methodId, Param *param); int mergeIds(int itemId); - virtual void handleParamBlob(std::shared_ptr plr, byteArray param); + virtual void handleParamBlob(shared_ptr plr, byteArray param); static byteArray createParamBlob(eAcquisitionMethod methodId, int itemId, int itemAux, int itemCount); }; @@ -59,8 +59,8 @@ public: DsMobKilled(int id, const wstring &name); typedef struct { bool isRanged; int mobType, weaponId, distance, damage; } Param; - virtual void handleParamBlob(std::shared_ptr plr, byteArray param); - static byteArray createParamBlob(std::shared_ptr plr, std::shared_ptr mob, DamageSource *dmgSrc); + virtual void handleParamBlob(shared_ptr plr, byteArray param); + static byteArray createParamBlob(shared_ptr plr, shared_ptr mob, DamageSource *dmgSrc); }; class DsMobInteract : public Stat @@ -82,7 +82,7 @@ public: DsMobInteract(int id, const wstring &name); typedef struct { int interactionType, mobId; } Param; - virtual void handleParamBlob(std::shared_ptr plr, byteArray param); + virtual void handleParamBlob(shared_ptr plr, byteArray param); static byteArray createParamBlob(eInteract interactionId, int entityId); }; @@ -100,7 +100,7 @@ public: eMethod_boat, eMethod_pig, - eMethod_time, // Time is a dimension too right... + eMethod_time, // Time is a dimension too right... eMethod_MAX }; @@ -110,15 +110,15 @@ public: DsTravel(int id, const wstring &name); typedef struct { eMethod method; int distance; } Param; - virtual void handleParamBlob(std::shared_ptr plr, byteArray paramBlob); + virtual void handleParamBlob(shared_ptr plr, byteArray paramBlob); static byteArray createParamBlob(eMethod method, int distance); - void flush(std::shared_ptr plr); + void flush(shared_ptr plr); protected: unsigned int param_cache[MAX_LOCAL_PLAYERS][eMethod_MAX]; int cache(int iPad, Param ¶m); - void write(std::shared_ptr plr, eMethod method, int distance); + void write(shared_ptr plr, eMethod method, int distance); }; class DsItemUsed : public Stat @@ -126,7 +126,7 @@ class DsItemUsed : public Stat public: DsItemUsed(int id, const wstring &name); typedef struct { int itemId, aux, count, health, hunger; } Param; - virtual void handleParamBlob(std::shared_ptr plr, byteArray paramBlob); + virtual void handleParamBlob(shared_ptr plr, byteArray paramBlob); static byteArray createParamBlob(int itemId, int aux, int count, int health, int hunger); }; @@ -134,8 +134,8 @@ class DsAchievement : public Stat { public: DsAchievement(int id, const wstring &name); - - virtual void handleParamBlob(std::shared_ptr plr, byteArray paramBlob); + + virtual void handleParamBlob(shared_ptr plr, byteArray paramBlob); typedef struct { eAward award; } SmallParam; static byteArray createSmallParamBlob(eAward id); @@ -149,7 +149,7 @@ class DsChangedDimension : public Stat public: DsChangedDimension(int id, const wstring &name); typedef struct { int fromDimId, toDimId; } Param; - virtual void handleParamBlob(std::shared_ptr plr, byteArray paramBlob); + virtual void handleParamBlob(shared_ptr plr, byteArray paramBlob); static byteArray createParamBlob(int fromDimId, int toDimId); }; @@ -158,7 +158,7 @@ class DsEnteredBiome : public Stat public: DsEnteredBiome(int id, const wstring &name); typedef struct { int biomeId; } Param; - virtual void handleParamBlob(std::shared_ptr plr, byteArray paramBlob); + virtual void handleParamBlob(shared_ptr plr, byteArray paramBlob); static byteArray createParamBlob(int biomeId); }; @@ -240,7 +240,7 @@ protected: virtual Stat* get_changedDimension(int from, int to); virtual Stat* get_enteredBiome(int biomeId); - // Achievements + // Achievements virtual Stat* get_achievement(eAward achievementId); @@ -261,10 +261,10 @@ protected: virtual byteArray getParam_blocksMined(int blockId, int data, int count); virtual byteArray getParam_itemsCollected(int id, int aux, int count); virtual byteArray getParam_itemsCrafted(int id, int aux, int count); - virtual byteArray getParam_itemsUsed(std::shared_ptr plr, std::shared_ptr itm); + virtual byteArray getParam_itemsUsed(shared_ptr plr, shared_ptr itm); virtual byteArray getParam_itemsBought(int id, int aux, int count); - virtual byteArray getParam_mobKill(std::shared_ptr plr, std::shared_ptr mob, DamageSource *dmgSrc); + virtual byteArray getParam_mobKill(shared_ptr plr, shared_ptr mob, DamageSource *dmgSrc); virtual byteArray getParam_breedEntity(eINSTANCEOF entityId); virtual byteArray getParam_tamedEntity(eINSTANCEOF entityId); @@ -300,10 +300,10 @@ public: static void setMultiplayerCorrelationId(Platform::String^ mpcId); static LPCWSTR getMultiplayerCorrelationId(); - static LPCWSTR getUserId(std::shared_ptr plr); + static LPCWSTR getUserId(shared_ptr plr); static LPCWSTR getUserId(int iPad); - static void playerSessionStart(PlayerUID,std::shared_ptr); + static void playerSessionStart(PlayerUID,shared_ptr); static void playerSessionStart(int iPad); static void playerSessionPause(int iPad); static void playerSessionResume(int iPad); diff --git a/Minecraft.World/DyePowderItem.cpp b/Minecraft.World/DyePowderItem.cpp index b92e7789..a05b8354 100644 --- a/Minecraft.World/DyePowderItem.cpp +++ b/Minecraft.World/DyePowderItem.cpp @@ -21,8 +21,8 @@ DyePowderItem::DyePowderItem(int id) : Item( id ) icons = NULL; } -const unsigned int DyePowderItem::COLOR_DESCS[] = -{ +const unsigned int DyePowderItem::COLOR_DESCS[] = +{ IDS_ITEM_DYE_POWDER_BLACK, IDS_ITEM_DYE_POWDER_RED, IDS_ITEM_DYE_POWDER_GREEN, @@ -41,8 +41,8 @@ const unsigned int DyePowderItem::COLOR_DESCS[] = IDS_ITEM_DYE_POWDER_WHITE }; -const unsigned int DyePowderItem::COLOR_USE_DESCS[] = -{ +const unsigned int DyePowderItem::COLOR_USE_DESCS[] = +{ IDS_DESC_DYE_BLACK, IDS_DESC_DYE_RED, IDS_DESC_DYE_GREEN, @@ -102,38 +102,38 @@ const int DyePowderItem::MAGENTA = 13; const int DyePowderItem::ORANGE = 14; const int DyePowderItem::WHITE = 15; -Icon *DyePowderItem::getIcon(int itemAuxValue) +Icon *DyePowderItem::getIcon(int itemAuxValue) { int colorValue = Mth::clamp(itemAuxValue, 0, 15); return icons[colorValue]; } -unsigned int DyePowderItem::getDescriptionId(std::shared_ptr itemInstance) +unsigned int DyePowderItem::getDescriptionId(shared_ptr itemInstance) { int colorValue = Mth::clamp(itemInstance->getAuxValue(), 0, 15); return COLOR_DESCS[colorValue]; } -unsigned int DyePowderItem::getUseDescriptionId(std::shared_ptr itemInstance) +unsigned int DyePowderItem::getUseDescriptionId(shared_ptr itemInstance) { return COLOR_USE_DESCS[itemInstance->getAuxValue()]; } -bool DyePowderItem::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool DyePowderItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { if (!player->mayBuild(x, y, z)) return false; // 4J-PB - Adding a test only version to allow tooltips to be displayed - if (itemInstance->getAuxValue() == WHITE) + if (itemInstance->getAuxValue() == WHITE) { // bone meal is a fertilizer, so instantly grow trees and stuff int tile = level->getTile(x, y, z); - if (tile == Tile::sapling_Id) + if (tile == Tile::sapling_Id) { if(!bTestUseOnOnly) - { - if (!level->isClientSide) + { + if (!level->isClientSide) { ((Sapling *) Tile::sapling)->growTree(level, x, y, z, level->random); itemInstance->count--; @@ -167,13 +167,13 @@ bool DyePowderItem::useOn(std::shared_ptr itemInstance, std::share } } return true; - } + } else if (tile == Tile::carrots_Id || tile == Tile::potatoes_Id) { if (level->getData(x, y, z) == 7) return false; if(!bTestUseOnOnly) { - if (!level->isClientSide) + if (!level->isClientSide) { ((CropTile *) Tile::tiles[tile])->growCropsToMax(level, x, y, z); itemInstance->count--; @@ -181,12 +181,12 @@ bool DyePowderItem::useOn(std::shared_ptr itemInstance, std::share } return true; } - else if (tile == Tile::crops_Id) + else if (tile == Tile::crops_Id) { if (level->getData(x, y, z) == 7) return false; if(!bTestUseOnOnly) - { - if (!level->isClientSide) + { + if (!level->isClientSide) { ((CropTile *) Tile::crops)->growCropsToMax(level, x, y, z); itemInstance->count--; @@ -205,42 +205,42 @@ bool DyePowderItem::useOn(std::shared_ptr itemInstance, std::share } } return true; - } - else if (tile == Tile::grass_Id) + } + else if (tile == Tile::grass_Id) { if(!bTestUseOnOnly) - { - if (!level->isClientSide) + { + if (!level->isClientSide) { itemInstance->count--; - for (int j = 0; j < 128; j++) + for (int j = 0; j < 128; j++) { int xx = x; int yy = y + 1; int zz = z; - for (int i = 0; i < j / 16; i++) + for (int i = 0; i < j / 16; i++) { xx += random->nextInt(3) - 1; yy += (random->nextInt(3) - 1) * random->nextInt(3) / 2; zz += random->nextInt(3) - 1; - if (level->getTile(xx, yy - 1, zz) != Tile::grass_Id || level->isSolidBlockingTile(xx, yy, zz)) + if (level->getTile(xx, yy - 1, zz) != Tile::grass_Id || level->isSolidBlockingTile(xx, yy, zz)) { goto mainloop; } } - if (level->getTile(xx, yy, zz) == 0) + if (level->getTile(xx, yy, zz) == 0) { - if (random->nextInt(10) != 0) + if (random->nextInt(10) != 0) { if (Tile::tallgrass->canSurvive(level, xx, yy, zz)) level->setTileAndData(xx, yy, zz, Tile::tallgrass_Id, TallGrass::TALL_GRASS); - } - else if (random->nextInt(3) != 0) + } + else if (random->nextInt(3) != 0) { if (Tile::flower->canSurvive(level, xx, yy, zz)) level->setTile(xx, yy, zz, Tile::flower_Id); - } - else + } + else { if (Tile::rose->canSurvive(level, xx, yy, zz)) level->setTile(xx, yy, zz, Tile::rose_Id); } @@ -289,14 +289,14 @@ mainloop: continue; return false; } -bool DyePowderItem::interactEnemy(std::shared_ptr itemInstance, std::shared_ptr mob) +bool DyePowderItem::interactEnemy(shared_ptr itemInstance, shared_ptr mob) { - if (dynamic_pointer_cast( mob ) != NULL) + if (dynamic_pointer_cast( mob ) != NULL) { - std::shared_ptr sheep = dynamic_pointer_cast(mob); + shared_ptr sheep = dynamic_pointer_cast(mob); // convert to tile-based color value (0 is white instead of black) int newColor = ClothTile::getTileDataForItemAuxValue(itemInstance->getAuxValue()); - if (!sheep->isSheared() && sheep->getColor() != newColor) + if (!sheep->isSheared() && sheep->getColor() != newColor) { sheep->setColor(newColor); itemInstance->count--; diff --git a/Minecraft.World/DyePowderItem.h b/Minecraft.World/DyePowderItem.h index df6147b9..b96b4087 100644 --- a/Minecraft.World/DyePowderItem.h +++ b/Minecraft.World/DyePowderItem.h @@ -40,10 +40,10 @@ public: DyePowderItem(int id); virtual Icon *getIcon(int itemAuxValue); - virtual unsigned int getDescriptionId(std::shared_ptr itemInstance); - virtual unsigned int getUseDescriptionId(std::shared_ptr itemInstance); - virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual bool interactEnemy(std::shared_ptr itemInstance, std::shared_ptr mob); + virtual unsigned int getDescriptionId(shared_ptr itemInstance); + virtual unsigned int getUseDescriptionId(shared_ptr itemInstance); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr mob); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/EggItem.cpp b/Minecraft.World/EggItem.cpp index 90c7d931..b85dbcd6 100644 --- a/Minecraft.World/EggItem.cpp +++ b/Minecraft.World/EggItem.cpp @@ -19,13 +19,13 @@ EggItem::EggItem(int id) : Item( id ) this->maxStackSize = 16; } -std::shared_ptr EggItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr EggItem::use(shared_ptr instance, Level *level, shared_ptr player) { if (!player->abilities.instabuild) { instance->count--; } level->playSound( dynamic_pointer_cast(player), eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) level->addEntity( std::shared_ptr( new ThrownEgg(level, dynamic_pointer_cast( player )) )); + if (!level->isClientSide) level->addEntity( shared_ptr( new ThrownEgg(level, dynamic_pointer_cast( player )) )); return instance; } diff --git a/Minecraft.World/EggItem.h b/Minecraft.World/EggItem.h index a5763a5e..83f09db5 100644 --- a/Minecraft.World/EggItem.h +++ b/Minecraft.World/EggItem.h @@ -11,5 +11,5 @@ class EggItem : public Item public: EggItem(int id); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); }; diff --git a/Minecraft.World/EggTile.cpp b/Minecraft.World/EggTile.cpp index 64cc4377..e6711a3f 100644 --- a/Minecraft.World/EggTile.cpp +++ b/Minecraft.World/EggTile.cpp @@ -40,13 +40,13 @@ void EggTile::checkSlide(Level *level, int x, int y, int z) } else { - std::shared_ptr e = std::shared_ptr(new FallingTile(level, x + 0.5f, y + 0.5f, z + 0.5f, id)); + shared_ptr e = shared_ptr(new FallingTile(level, x + 0.5f, y + 0.5f, z + 0.5f, id)); level->addEntity(e); } } } -bool EggTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool EggTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if(soundOnly) return false; @@ -54,7 +54,7 @@ bool EggTile::use(Level *level, int x, int y, int z, std::shared_ptr pla return true; } -void EggTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void EggTile::attack(Level *level, int x, int y, int z, shared_ptr player) { teleport(level, x, y, z); } @@ -167,7 +167,7 @@ void EggTile::generateTeleportParticles(Level *level,int xt,int yt, int zt,int d } } -bool EggTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) +bool EggTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { return true; } \ No newline at end of file diff --git a/Minecraft.World/EggTile.h b/Minecraft.World/EggTile.h index 7102bd8d..c8929cbe 100644 --- a/Minecraft.World/EggTile.h +++ b/Minecraft.World/EggTile.h @@ -11,8 +11,8 @@ public: private: void checkSlide(Level *level, int x, int y, int z); public: - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void attack(Level *level, int x, int y, int z, std::shared_ptr player); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); private: void teleport(Level *level, int x, int y, int z); public: diff --git a/Minecraft.World/EmptyLevelChunk.cpp b/Minecraft.World/EmptyLevelChunk.cpp index 5bc7be0a..4934ac96 100644 --- a/Minecraft.World/EmptyLevelChunk.cpp +++ b/Minecraft.World/EmptyLevelChunk.cpp @@ -94,15 +94,15 @@ int EmptyLevelChunk::getRawBrightness(int x, int y, int z, int skyDampen) return 0; } -void EmptyLevelChunk::addEntity(std::shared_ptr e) +void EmptyLevelChunk::addEntity(shared_ptr e) { } -void EmptyLevelChunk::removeEntity(std::shared_ptr e) +void EmptyLevelChunk::removeEntity(shared_ptr e) { } -void EmptyLevelChunk::removeEntity(std::shared_ptr e, int yc) +void EmptyLevelChunk::removeEntity(shared_ptr e, int yc) { } @@ -115,16 +115,16 @@ void EmptyLevelChunk::skyBrightnessChanged() { } -std::shared_ptr EmptyLevelChunk::getTileEntity(int x, int y, int z) +shared_ptr EmptyLevelChunk::getTileEntity(int x, int y, int z) { - return std::shared_ptr(); + return shared_ptr(); } -void EmptyLevelChunk::addTileEntity(std::shared_ptr te) +void EmptyLevelChunk::addTileEntity(shared_ptr te) { } -void EmptyLevelChunk::setTileEntity(int x, int y, int z, std::shared_ptr tileEntity) +void EmptyLevelChunk::setTileEntity(int x, int y, int z, shared_ptr tileEntity) { } @@ -144,11 +144,11 @@ void EmptyLevelChunk::markUnsaved() { } -void EmptyLevelChunk::getEntities(std::shared_ptr except, AABB bb, vector > &es) +void EmptyLevelChunk::getEntities(shared_ptr except, AABB bb, vector > &es) { } -void EmptyLevelChunk::getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es) +void EmptyLevelChunk::getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es) { } diff --git a/Minecraft.World/EmptyLevelChunk.h b/Minecraft.World/EmptyLevelChunk.h index 07599723..a8ff27f9 100644 --- a/Minecraft.World/EmptyLevelChunk.h +++ b/Minecraft.World/EmptyLevelChunk.h @@ -28,20 +28,20 @@ public: void getNeighbourBrightnesses(int *brightnesses, LightLayer::variety layer, int x, int y, int z); // 4J added void setBrightness(LightLayer::variety layer, int x, int y, int z, int brightness); int getRawBrightness(int x, int y, int z, int skyDampen); - void addEntity(std::shared_ptr e); - void removeEntity(std::shared_ptr e); - void removeEntity(std::shared_ptr e, int yc); + void addEntity(shared_ptr e); + void removeEntity(shared_ptr e); + void removeEntity(shared_ptr e, int yc); bool isSkyLit(int x, int y, int z); void skyBrightnessChanged(); - std::shared_ptr getTileEntity(int x, int y, int z); - void addTileEntity(std::shared_ptr te); - void setTileEntity(int x, int y, int z, std::shared_ptr tileEntity); + shared_ptr getTileEntity(int x, int y, int z); + void addTileEntity(shared_ptr te); + void setTileEntity(int x, int y, int z, shared_ptr tileEntity); void removeTileEntity(int x, int y, int z); void load(); void unload(bool unloadTileEntities) ; // 4J - added parameter void markUnsaved(); - void getEntities(std::shared_ptr except, AABB bb, vector > &es); - void getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es); + void getEntities(shared_ptr except, AABB bb, vector > &es); + void getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es); int countEntities(); bool shouldSave(bool force); void setBlocks(byteArray newBlocks, int sub); diff --git a/Minecraft.World/EnchantItemCommand.cpp b/Minecraft.World/EnchantItemCommand.cpp index da5cd2bf..aa02b533 100644 --- a/Minecraft.World/EnchantItemCommand.cpp +++ b/Minecraft.World/EnchantItemCommand.cpp @@ -15,7 +15,7 @@ int EnchantItemCommand::getPermissionLevel() return 0; //aLEVEL_GAMEMASTERS; } -void EnchantItemCommand::execute(std::shared_ptr source, byteArray commandData) +void EnchantItemCommand::execute(shared_ptr source, byteArray commandData) { ByteArrayInputStream bais(commandData); DataInputStream dis(&bais); @@ -26,11 +26,11 @@ void EnchantItemCommand::execute(std::shared_ptr source, byteArra bais.reset(); - std::shared_ptr player = getPlayer(uid); + shared_ptr player = getPlayer(uid); if(player == NULL) return; - std::shared_ptr selectedItem = player->getSelectedItem(); + shared_ptr selectedItem = player->getSelectedItem(); if(selectedItem == NULL) return; @@ -70,7 +70,7 @@ void EnchantItemCommand::execute(std::shared_ptr source, byteArra logAdminAction(source, ChatPacket::e_ChatCustom, L"commands.enchant.success"); } -std::shared_ptr EnchantItemCommand::preparePacket(std::shared_ptr player, int enchantmentId, int enchantmentLevel) +shared_ptr EnchantItemCommand::preparePacket(shared_ptr player, int enchantmentId, int enchantmentLevel) { if(player == NULL) return nullptr; @@ -81,5 +81,5 @@ std::shared_ptr EnchantItemCommand::preparePacket(std::shared dos.writeInt(enchantmentId); dos.writeInt(enchantmentLevel); - return std::shared_ptr( new GameCommandPacket(eGameCommand_EnchantItem, baos.toByteArray() )); + return shared_ptr( new GameCommandPacket(eGameCommand_EnchantItem, baos.toByteArray() )); } \ No newline at end of file diff --git a/Minecraft.World/EnchantItemCommand.h b/Minecraft.World/EnchantItemCommand.h index 6792da53..5fc6c648 100644 --- a/Minecraft.World/EnchantItemCommand.h +++ b/Minecraft.World/EnchantItemCommand.h @@ -9,7 +9,7 @@ class EnchantItemCommand : public Command public: virtual EGameCommand getId(); int getPermissionLevel(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); - static std::shared_ptr preparePacket(std::shared_ptr player, int enchantmentId, int enchantmentLevel = 1); + static shared_ptr preparePacket(shared_ptr player, int enchantmentId, int enchantmentLevel = 1); }; \ No newline at end of file diff --git a/Minecraft.World/EnchantedBookItem.cpp b/Minecraft.World/EnchantedBookItem.cpp index 41245b1d..59e7156b 100644 --- a/Minecraft.World/EnchantedBookItem.cpp +++ b/Minecraft.World/EnchantedBookItem.cpp @@ -10,17 +10,17 @@ EnchantedBookItem::EnchantedBookItem(int id) : Item(id) { } -bool EnchantedBookItem::isFoil(std::shared_ptr itemInstance) +bool EnchantedBookItem::isFoil(shared_ptr itemInstance) { return true; } -bool EnchantedBookItem::isEnchantable(std::shared_ptr itemInstance) +bool EnchantedBookItem::isEnchantable(shared_ptr itemInstance) { return false; } -const Rarity *EnchantedBookItem::getRarity(std::shared_ptr itemInstance) +const Rarity *EnchantedBookItem::getRarity(shared_ptr itemInstance) { ListTag *enchantments = getEnchantments(itemInstance); if (enchantments && enchantments->size() > 0) @@ -33,7 +33,7 @@ const Rarity *EnchantedBookItem::getRarity(std::shared_ptr itemIns } } -ListTag *EnchantedBookItem::getEnchantments(std::shared_ptr item) +ListTag *EnchantedBookItem::getEnchantments(shared_ptr item) { if (item->tag == NULL || !item->tag->contains((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str())) { @@ -43,7 +43,7 @@ ListTag *EnchantedBookItem::getEnchantments(std::shared_ptr *) item->tag->get((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str()); } -void EnchantedBookItem::appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void EnchantedBookItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) { Item::appendHoverText(itemInstance, player, lines, advanced, unformattedStrings); @@ -66,7 +66,7 @@ void EnchantedBookItem::appendHoverText(std::shared_ptr itemInstan } } -void EnchantedBookItem::addEnchantment(std::shared_ptr item, EnchantmentInstance *enchantment) +void EnchantedBookItem::addEnchantment(shared_ptr item, EnchantmentInstance *enchantment) { ListTag *enchantments = getEnchantments(item); bool add = true; @@ -101,14 +101,14 @@ void EnchantedBookItem::addEnchantment(std::shared_ptr item, Encha item->getTag()->put((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str(), enchantments); } -std::shared_ptr EnchantedBookItem::createForEnchantment(EnchantmentInstance *enchant) +shared_ptr EnchantedBookItem::createForEnchantment(EnchantmentInstance *enchant) { - std::shared_ptr item = std::shared_ptr(new ItemInstance(this)); + shared_ptr item = shared_ptr(new ItemInstance(this)); addEnchantment(item, enchant); return item; } -void EnchantedBookItem::createForEnchantment(Enchantment *enchant, vector > *items) +void EnchantedBookItem::createForEnchantment(Enchantment *enchant, vector > *items) { for (int i = enchant->getMinLevel(); i <= enchant->getMaxLevel(); i++) { @@ -116,10 +116,10 @@ void EnchantedBookItem::createForEnchantment(Enchantment *enchant, vector EnchantedBookItem::createForRandomLoot(Random *random) +shared_ptr EnchantedBookItem::createForRandomLoot(Random *random) { Enchantment *enchantment = Enchantment::validEnchantments[random->nextInt(Enchantment::validEnchantments.size())]; - std::shared_ptr book = std::shared_ptr(new ItemInstance(id, 1, 0)); + shared_ptr book = shared_ptr(new ItemInstance(id, 1, 0)); int level = Mth::nextInt(random, enchantment->getMinLevel(), enchantment->getMaxLevel()); addEnchantment(book, new EnchantmentInstance(enchantment, level)); @@ -135,7 +135,7 @@ WeighedTreasure *EnchantedBookItem::createForRandomTreasure(Random *random) WeighedTreasure *EnchantedBookItem::createForRandomTreasure(Random *random, int minCount, int maxCount, int weight) { Enchantment *enchantment = Enchantment::validEnchantments[random->nextInt(Enchantment::validEnchantments.size())]; - std::shared_ptr book = std::shared_ptr(new ItemInstance(id, 1, 0)); + shared_ptr book = shared_ptr(new ItemInstance(id, 1, 0)); int level = Mth::nextInt(random, enchantment->getMinLevel(), enchantment->getMaxLevel()); addEnchantment(book, new EnchantmentInstance(enchantment, level)); diff --git a/Minecraft.World/EnchantedBookItem.h b/Minecraft.World/EnchantedBookItem.h index 5b642b72..c67f208f 100644 --- a/Minecraft.World/EnchantedBookItem.h +++ b/Minecraft.World/EnchantedBookItem.h @@ -11,15 +11,15 @@ public: EnchantedBookItem(int id); - bool isFoil(std::shared_ptr itemInstance); - bool isEnchantable(std::shared_ptr itemInstance); - const Rarity *getRarity(std::shared_ptr itemInstance); - ListTag *getEnchantments(std::shared_ptr item); - void appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); - void addEnchantment(std::shared_ptr item, EnchantmentInstance *enchantment); - std::shared_ptr createForEnchantment(EnchantmentInstance *enchant); - void createForEnchantment(Enchantment *enchant, vector > *items); - std::shared_ptr createForRandomLoot(Random *random); + bool isFoil(shared_ptr itemInstance); + bool isEnchantable(shared_ptr itemInstance); + const Rarity *getRarity(shared_ptr itemInstance); + ListTag *getEnchantments(shared_ptr item); + void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); + void addEnchantment(shared_ptr item, EnchantmentInstance *enchantment); + shared_ptr createForEnchantment(EnchantmentInstance *enchant); + void createForEnchantment(Enchantment *enchant, vector > *items); + shared_ptr createForRandomLoot(Random *random); WeighedTreasure *createForRandomTreasure(Random *random); WeighedTreasure *createForRandomTreasure(Random *random, int minCount, int maxCount, int weight); }; \ No newline at end of file diff --git a/Minecraft.World/Enchantment.cpp b/Minecraft.World/Enchantment.cpp index 74d44b3b..2ce1441a 100644 --- a/Minecraft.World/Enchantment.cpp +++ b/Minecraft.World/Enchantment.cpp @@ -129,7 +129,7 @@ int Enchantment::getDamageProtection(int level, DamageSource *source) return 0; } -int Enchantment::getDamageBonus(int level, std::shared_ptr target) +int Enchantment::getDamageBonus(int level, shared_ptr target) { return 0; } @@ -154,12 +154,12 @@ wstring Enchantment::getFullname(int level,wstring &unformatted) { wchar_t formatted[256]; swprintf(formatted,256,L"%ls %ls",app.GetString( getDescriptionId() ), getLevelString(level).c_str()); - unformatted = formatted; + unformatted = formatted; swprintf(formatted,256,L"%ls",app.GetHTMLColour(eHTMLColor_f),unformatted.c_str()); return formatted; } -bool Enchantment::canEnchant(std::shared_ptr item) +bool Enchantment::canEnchant(shared_ptr item) { return category->canEnchant(item->getItem()); } diff --git a/Minecraft.World/Enchantment.h b/Minecraft.World/Enchantment.h index 08c1ab0a..794edf85 100644 --- a/Minecraft.World/Enchantment.h +++ b/Minecraft.World/Enchantment.h @@ -74,12 +74,12 @@ public: virtual int getMinCost(int level); virtual int getMaxCost(int level); virtual int getDamageProtection(int level, DamageSource *source); - virtual int getDamageBonus(int level, std::shared_ptr target); + virtual int getDamageBonus(int level, shared_ptr target); virtual bool isCompatibleWith(Enchantment *other) const; virtual Enchantment *setDescriptionId(int id); virtual int getDescriptionId(); virtual wstring getFullname(int level,wstring &unformatted); // 4J Stu added unformatted - virtual bool canEnchant(std::shared_ptr item); + virtual bool canEnchant(shared_ptr item); private: // 4J Added diff --git a/Minecraft.World/EnchantmentHelper.cpp b/Minecraft.World/EnchantmentHelper.cpp index 0b744a25..f43ced01 100644 --- a/Minecraft.World/EnchantmentHelper.cpp +++ b/Minecraft.World/EnchantmentHelper.cpp @@ -9,7 +9,7 @@ Random EnchantmentHelper::random; -int EnchantmentHelper::getEnchantmentLevel(int enchantmentId, std::shared_ptr piece) +int EnchantmentHelper::getEnchantmentLevel(int enchantmentId, shared_ptr piece) { if (piece == NULL) { @@ -33,7 +33,7 @@ int EnchantmentHelper::getEnchantmentLevel(int enchantmentId, std::shared_ptr *EnchantmentHelper::getEnchantments(std::shared_ptr item) +unordered_map *EnchantmentHelper::getEnchantments(shared_ptr item) { unordered_map *result = new unordered_map(); ListTag *list = item->id == Item::enchantedBook_Id ? Item::enchantedBook->getEnchantments(item) : item->getEnchantmentTags(); @@ -52,7 +52,7 @@ unordered_map *EnchantmentHelper::getEnchantments(std::shared_ptr *enchantments, std::shared_ptr item) +void EnchantmentHelper::setEnchantments(unordered_map *enchantments, shared_ptr item) { ListTag *list = new ListTag(); @@ -101,7 +101,7 @@ int EnchantmentHelper::getEnchantmentLevel(int enchantmentId, ItemInstanceArray return bestLevel; } -void EnchantmentHelper::runIterationOnItem(EnchantmentIterationMethod &method, std::shared_ptr piece) +void EnchantmentHelper::runIterationOnItem(EnchantmentIterationMethod &method, shared_ptr piece) { if (piece == NULL) { @@ -142,12 +142,12 @@ EnchantmentHelper::GetDamageProtectionIteration EnchantmentHelper::getDamageProt /** * Fetches the protection value for enchanted items. -* +* * @param inventory * @param source * @return */ -int EnchantmentHelper::getDamageProtection(std::shared_ptr inventory, DamageSource *source) +int EnchantmentHelper::getDamageProtection(shared_ptr inventory, DamageSource *source) { getDamageProtectionIteration.sum = 0; getDamageProtectionIteration.source = source; @@ -172,12 +172,12 @@ void EnchantmentHelper::GetDamageBonusIteration::doEnchantment(Enchantment *ench EnchantmentHelper::GetDamageBonusIteration EnchantmentHelper::getDamageBonusIteration; /** -* +* * @param inventory * @param target * @return */ -int EnchantmentHelper::getDamageBonus(std::shared_ptr inventory, std::shared_ptr target) +int EnchantmentHelper::getDamageBonus(shared_ptr inventory, shared_ptr target) { getDamageBonusIteration.sum = 0; @@ -192,62 +192,62 @@ int EnchantmentHelper::getDamageBonus(std::shared_ptr inventory, std: return 0; } -int EnchantmentHelper::getKnockbackBonus(std::shared_ptr inventory, std::shared_ptr target) +int EnchantmentHelper::getKnockbackBonus(shared_ptr inventory, shared_ptr target) { return getEnchantmentLevel(Enchantment::knockback->id, inventory->getSelected()); } -int EnchantmentHelper::getFireAspect(std::shared_ptr source) +int EnchantmentHelper::getFireAspect(shared_ptr source) { return getEnchantmentLevel(Enchantment::fireAspect->id, source->getCarriedItem()); } -int EnchantmentHelper::getOxygenBonus(std::shared_ptr inventory) +int EnchantmentHelper::getOxygenBonus(shared_ptr inventory) { return getEnchantmentLevel(Enchantment::drownProtection->id, inventory->armor); } -int EnchantmentHelper::getDiggingBonus(std::shared_ptr inventory) +int EnchantmentHelper::getDiggingBonus(shared_ptr inventory) { return getEnchantmentLevel(Enchantment::diggingBonus->id, inventory->getSelected()); } -int EnchantmentHelper::getDigDurability(std::shared_ptr inventory) +int EnchantmentHelper::getDigDurability(shared_ptr inventory) { return getEnchantmentLevel(Enchantment::digDurability->id, inventory->getSelected()); } -bool EnchantmentHelper::hasSilkTouch(std::shared_ptr inventory) +bool EnchantmentHelper::hasSilkTouch(shared_ptr inventory) { return getEnchantmentLevel(Enchantment::untouching->id, inventory->getSelected()) > 0; } -int EnchantmentHelper::getDiggingLootBonus(std::shared_ptr inventory) +int EnchantmentHelper::getDiggingLootBonus(shared_ptr inventory) { return getEnchantmentLevel(Enchantment::resourceBonus->id, inventory->getSelected()); } -int EnchantmentHelper::getKillingLootBonus(std::shared_ptr inventory) +int EnchantmentHelper::getKillingLootBonus(shared_ptr inventory) { return getEnchantmentLevel(Enchantment::lootBonus->id, inventory->getSelected()); } -bool EnchantmentHelper::hasWaterWorkerBonus(std::shared_ptr inventory) +bool EnchantmentHelper::hasWaterWorkerBonus(shared_ptr inventory) { return getEnchantmentLevel(Enchantment::waterWorker->id, inventory->armor) > 0; } -int EnchantmentHelper::getArmorThorns(std::shared_ptr source) +int EnchantmentHelper::getArmorThorns(shared_ptr source) { return getEnchantmentLevel(Enchantment::thorns->id, source->getEquipmentSlots()); } -std::shared_ptr EnchantmentHelper::getRandomItemWith(Enchantment *enchantment, std::shared_ptr source) +shared_ptr EnchantmentHelper::getRandomItemWith(Enchantment *enchantment, shared_ptr source) { ItemInstanceArray items = source->getEquipmentSlots(); for(unsigned int i = 0; i < items.length; ++i) { - std::shared_ptr item = items[i]; + shared_ptr item = items[i]; if (item != NULL && getEnchantmentLevel(enchantment->id, item) > 0) { return item; @@ -258,7 +258,7 @@ std::shared_ptr EnchantmentHelper::getRandomItemWith(Enchantment * } /** -* +* * @param random * @param slot * The table slot, 0-2 @@ -268,7 +268,7 @@ std::shared_ptr EnchantmentHelper::getRandomItemWith(Enchantment * * Which item that is being enchanted. * @return The enchantment cost, 0 means unchantable, 50 is max. */ -int EnchantmentHelper::getEnchantmentCost(Random *random, int slot, int bookcases, std::shared_ptr itemInstance) +int EnchantmentHelper::getEnchantmentCost(Random *random, int slot, int bookcases, shared_ptr itemInstance) { Item *item = itemInstance->getItem(); int itemValue = item->getEnchantmentValue(); @@ -297,7 +297,7 @@ int EnchantmentHelper::getEnchantmentCost(Random *random, int slot, int bookcase return selected; } -std::shared_ptr EnchantmentHelper::enchantItem(Random *random, std::shared_ptr itemInstance, int enchantmentCost) +shared_ptr EnchantmentHelper::enchantItem(Random *random, shared_ptr itemInstance, int enchantmentCost) { vector *newEnchantment = EnchantmentHelper::selectEnchantment(random, itemInstance, enchantmentCost); bool isBook = itemInstance->id == Item::book_Id; @@ -325,13 +325,13 @@ std::shared_ptr EnchantmentHelper::enchantItem(Random *random, std } /** -* +* * @param random * @param itemInstance * @param enchantmentCost * @return */ -vector *EnchantmentHelper::selectEnchantment(Random *random, std::shared_ptr itemInstance, int enchantmentCost) +vector *EnchantmentHelper::selectEnchantment(Random *random, shared_ptr itemInstance, int enchantmentCost) { // withdraw bonus from item Item *item = itemInstance->getItem(); @@ -407,7 +407,7 @@ vector *EnchantmentHelper::selectEnchantment(Random *rand } if (!availableEnchantments->empty()) - { + { for(AUTO_VAR(it, availableEnchantments->begin()); it != availableEnchantments->end(); ++it) { values.push_back(it->second); @@ -433,7 +433,7 @@ vector *EnchantmentHelper::selectEnchantment(Random *rand return results; } -unordered_map *EnchantmentHelper::getAvailableEnchantmentResults(int value, std::shared_ptr itemInstance) +unordered_map *EnchantmentHelper::getAvailableEnchantmentResults(int value, shared_ptr itemInstance) { Item *item = itemInstance->getItem(); unordered_map *results = NULL; diff --git a/Minecraft.World/EnchantmentHelper.h b/Minecraft.World/EnchantmentHelper.h index 18cc7266..9f7de5c5 100644 --- a/Minecraft.World/EnchantmentHelper.h +++ b/Minecraft.World/EnchantmentHelper.h @@ -12,9 +12,9 @@ private: static Random random; public: - static int getEnchantmentLevel(int enchantmentId, std::shared_ptr piece); - static unordered_map *getEnchantments(std::shared_ptr item); - static void setEnchantments(unordered_map *enchantments, std::shared_ptr item); + static int getEnchantmentLevel(int enchantmentId, shared_ptr piece); + static unordered_map *getEnchantments(shared_ptr item); + static void setEnchantments(unordered_map *enchantments, shared_ptr item); static int getEnchantmentLevel(int enchantmentId, ItemInstanceArray inventory); @@ -27,7 +27,7 @@ private: virtual void doEnchantment(Enchantment *enchantment, int level) = 0; }; - static void runIterationOnItem(EnchantmentIterationMethod &method, std::shared_ptr piece); + static void runIterationOnItem(EnchantmentIterationMethod &method, shared_ptr piece); static void runIterationOnInventory(EnchantmentIterationMethod &method, ItemInstanceArray inventory); class GetDamageProtectionIteration : public EnchantmentIterationMethod @@ -43,20 +43,20 @@ private: /** * Fetches the protection value for enchanted items. - * + * * @param inventory * @param source * @return */ public: - static int getDamageProtection(std::shared_ptr inventory, DamageSource *source); + static int getDamageProtection(shared_ptr inventory, DamageSource *source); private: class GetDamageBonusIteration : public EnchantmentIterationMethod { public: int sum; - std::shared_ptr target; + shared_ptr target; virtual void doEnchantment(Enchantment *enchantment, int level); }; @@ -64,27 +64,27 @@ private: static GetDamageBonusIteration getDamageBonusIteration; /** - * + * * @param inventory * @param target * @return */ public: - static int getDamageBonus(std::shared_ptr inventory, std::shared_ptr target); - static int getKnockbackBonus(std::shared_ptr inventory, std::shared_ptr target); - static int getFireAspect(std::shared_ptr source); - static int getOxygenBonus(std::shared_ptr inventory); - static int getDiggingBonus(std::shared_ptr inventory); - static int getDigDurability(std::shared_ptr inventory); - static bool hasSilkTouch(std::shared_ptr inventory); - static int getDiggingLootBonus(std::shared_ptr inventory); - static int getKillingLootBonus(std::shared_ptr inventory); - static bool hasWaterWorkerBonus(std::shared_ptr inventory); - static int getArmorThorns(std::shared_ptr source); - static std::shared_ptr getRandomItemWith(Enchantment *enchantment, std::shared_ptr source); + static int getDamageBonus(shared_ptr inventory, shared_ptr target); + static int getKnockbackBonus(shared_ptr inventory, shared_ptr target); + static int getFireAspect(shared_ptr source); + static int getOxygenBonus(shared_ptr inventory); + static int getDiggingBonus(shared_ptr inventory); + static int getDigDurability(shared_ptr inventory); + static bool hasSilkTouch(shared_ptr inventory); + static int getDiggingLootBonus(shared_ptr inventory); + static int getKillingLootBonus(shared_ptr inventory); + static bool hasWaterWorkerBonus(shared_ptr inventory); + static int getArmorThorns(shared_ptr source); + static shared_ptr getRandomItemWith(Enchantment *enchantment, shared_ptr source); /** - * + * * @param random * @param slot * The table slot, 0-2 @@ -94,17 +94,17 @@ public: * Which item that is being enchanted. * @return The enchantment cost, 0 means unchantable, 50 is max. */ - static int getEnchantmentCost(Random *random, int slot, int bookcases, std::shared_ptr itemInstance); + static int getEnchantmentCost(Random *random, int slot, int bookcases, shared_ptr itemInstance); - static std::shared_ptr enchantItem(Random *random, std::shared_ptr itemInstance, int enchantmentCost); + static shared_ptr enchantItem(Random *random, shared_ptr itemInstance, int enchantmentCost); /** - * + * * @param random * @param itemInstance * @param enchantmentCost * @return */ - static vector *selectEnchantment(Random *random, std::shared_ptr itemInstance, int enchantmentCost); - static unordered_map *getAvailableEnchantmentResults(int value, std::shared_ptr itemInstance); + static vector *selectEnchantment(Random *random, shared_ptr itemInstance, int enchantmentCost); + static unordered_map *getAvailableEnchantmentResults(int value, shared_ptr itemInstance); }; \ No newline at end of file diff --git a/Minecraft.World/EnchantmentMenu.cpp b/Minecraft.World/EnchantmentMenu.cpp index d64abc47..23b366ce 100644 --- a/Minecraft.World/EnchantmentMenu.cpp +++ b/Minecraft.World/EnchantmentMenu.cpp @@ -7,9 +7,9 @@ #include "net.minecraft.world.item.enchantment.h" #include "EnchantmentMenu.h" -EnchantmentMenu::EnchantmentMenu(std::shared_ptr inventory, Level *level, int xt, int yt, int zt) +EnchantmentMenu::EnchantmentMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt) { - enchantSlots = std::shared_ptr( new EnchantmentContainer(this) ); + enchantSlots = shared_ptr( new EnchantmentContainer(this) ); for(int i = 0; i < 3; ++i) { @@ -77,9 +77,9 @@ void EnchantmentMenu::setData(int id, int value) } } -void EnchantmentMenu::slotsChanged() // 4J used to take a std::shared_ptr container but wasn't using it, so removed to simplify things +void EnchantmentMenu::slotsChanged() // 4J used to take a shared_ptr container but wasn't using it, so removed to simplify things { - std::shared_ptr item = enchantSlots->getItem(0); + shared_ptr item = enchantSlots->getItem(0); if (item == NULL || !item->isEnchantable()) { @@ -150,9 +150,9 @@ void EnchantmentMenu::slotsChanged() // 4J used to take a std::shared_ptr player, int i) +bool EnchantmentMenu::clickMenuButton(shared_ptr player, int i) { - std::shared_ptr item = enchantSlots->getItem(0); + shared_ptr item = enchantSlots->getItem(0); if (costs[i] > 0 && item != NULL && (player->experienceLevel >= costs[i] || player->abilities.instabuild) ) { if (!level->isClientSide) @@ -194,34 +194,34 @@ bool EnchantmentMenu::clickMenuButton(std::shared_ptr player, int i) } -void EnchantmentMenu::removed(std::shared_ptr player) +void EnchantmentMenu::removed(shared_ptr player) { AbstractContainerMenu::removed(player); if (level->isClientSide) return; - std::shared_ptr item = enchantSlots->removeItemNoUpdate(0); + shared_ptr item = enchantSlots->removeItemNoUpdate(0); if (item != NULL) { player->drop(item); } } -bool EnchantmentMenu::stillValid(std::shared_ptr player) +bool EnchantmentMenu::stillValid(shared_ptr player) { if (level->getTile(x, y, z) != Tile::enchantTable_Id) return false; if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; return true; } -std::shared_ptr EnchantmentMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr EnchantmentMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = slots->at(slotIndex); Slot *IngredientSlot = slots->at(INGREDIENT_SLOT); if (slot != NULL && slot->hasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if (slotIndex == INGREDIENT_SLOT) @@ -238,8 +238,8 @@ std::shared_ptr EnchantmentMenu::quickMoveStack(std::shared_ptr= INV_SLOT_START && slotIndex < INV_SLOT_END) { // if the item is an enchantable tool - - if(stack->isEnchantable() && (!IngredientSlot->hasItem() ) ) + + if(stack->isEnchantable() && (!IngredientSlot->hasItem() ) ) { if(!moveItemStackTo(stack, INGREDIENT_SLOT, INGREDIENT_SLOT+1, false)) { @@ -258,7 +258,7 @@ std::shared_ptr EnchantmentMenu::quickMoveStack(std::shared_ptrisEnchantable() && (!IngredientSlot->hasItem() ) ) + if(stack->isEnchantable() && (!IngredientSlot->hasItem() ) ) { if(!moveItemStackTo(stack, INGREDIENT_SLOT, INGREDIENT_SLOT+1, false)) { diff --git a/Minecraft.World/EnchantmentMenu.h b/Minecraft.World/EnchantmentMenu.h index 97279dee..62408f1d 100644 --- a/Minecraft.World/EnchantmentMenu.h +++ b/Minecraft.World/EnchantmentMenu.h @@ -13,7 +13,7 @@ public: static const int USE_ROW_SLOT_END = EnchantmentMenu::USE_ROW_SLOT_START + 9; public: - std::shared_ptr enchantSlots; + shared_ptr enchantSlots; private: Level *level; @@ -28,14 +28,14 @@ public: public: int costs[3]; - EnchantmentMenu(std::shared_ptr inventory, Level *level, int xt, int yt, int zt); + EnchantmentMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt); virtual void addSlotListener(ContainerListener *listener); virtual void broadcastChanges(); virtual void setData(int id, int value); - virtual void slotsChanged();// 4J used to take a std::shared_ptr container but wasn't using it, so removed to simplify things - virtual bool clickMenuButton(std::shared_ptr player, int i); - void removed(std::shared_ptr player); - virtual bool stillValid(std::shared_ptr player); - virtual std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); + virtual void slotsChanged();// 4J used to take a shared_ptr container but wasn't using it, so removed to simplify things + virtual bool clickMenuButton(shared_ptr player, int i); + void removed(shared_ptr player); + virtual bool stillValid(shared_ptr player); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); }; \ No newline at end of file diff --git a/Minecraft.World/EnchantmentSlot.h b/Minecraft.World/EnchantmentSlot.h index c8615288..590d9e31 100644 --- a/Minecraft.World/EnchantmentSlot.h +++ b/Minecraft.World/EnchantmentSlot.h @@ -10,7 +10,7 @@ class Container; class EnchantmentSlot : public Slot { public: - EnchantmentSlot(std::shared_ptr container, int id, int x, int y) : Slot(container,id, x, y) {} - virtual bool mayPlace(std::shared_ptr item) {return true;} - virtual bool mayCombine(std::shared_ptr item) {return false;} // 4J Added + EnchantmentSlot(shared_ptr container, int id, int x, int y) : Slot(container,id, x, y) {} + virtual bool mayPlace(shared_ptr item) {return true;} + virtual bool mayCombine(shared_ptr item) {return false;} // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/EnchantmentTableEntity.cpp b/Minecraft.World/EnchantmentTableEntity.cpp index ff52541b..31da3c49 100644 --- a/Minecraft.World/EnchantmentTableEntity.cpp +++ b/Minecraft.World/EnchantmentTableEntity.cpp @@ -32,7 +32,7 @@ void EnchantmentTableEntity::tick() oOpen = open; oRot = rot; - std::shared_ptr player = level->getNearestPlayer(x + 0.5f, y + 0.5f, z + 0.5f, 3); + shared_ptr player = level->getNearestPlayer(x + 0.5f, y + 0.5f, z + 0.5f, 3); if (player != NULL) { double xd = player->x - (x + 0.5f); @@ -89,9 +89,9 @@ void EnchantmentTableEntity::tick() flip = flip + flipA; } -std::shared_ptr EnchantmentTableEntity::clone() +shared_ptr EnchantmentTableEntity::clone() { - std::shared_ptr result = std::shared_ptr( new EnchantmentTableEntity() ); + shared_ptr result = shared_ptr( new EnchantmentTableEntity() ); TileEntity::clone(result); result->time = time; diff --git a/Minecraft.World/EnchantmentTableEntity.h b/Minecraft.World/EnchantmentTableEntity.h index c7cef9f7..aa54c812 100644 --- a/Minecraft.World/EnchantmentTableEntity.h +++ b/Minecraft.World/EnchantmentTableEntity.h @@ -21,5 +21,5 @@ public: virtual void tick(); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); }; \ No newline at end of file diff --git a/Minecraft.World/EnchantmentTableTile.cpp b/Minecraft.World/EnchantmentTableTile.cpp index 911d19cd..70c127ba 100644 --- a/Minecraft.World/EnchantmentTableTile.cpp +++ b/Minecraft.World/EnchantmentTableTile.cpp @@ -67,12 +67,12 @@ Icon *EnchantmentTableTile::getTexture(int face, int data) return icon; } -std::shared_ptr EnchantmentTableTile::newTileEntity(Level *level) +shared_ptr EnchantmentTableTile::newTileEntity(Level *level) { - return std::shared_ptr(new EnchantmentTableEntity()); + return shared_ptr(new EnchantmentTableEntity()); } -bool EnchantmentTableTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool EnchantmentTableTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if(soundOnly) return false; diff --git a/Minecraft.World/EnchantmentTableTile.h b/Minecraft.World/EnchantmentTableTile.h index 03916274..43816cec 100644 --- a/Minecraft.World/EnchantmentTableTile.h +++ b/Minecraft.World/EnchantmentTableTile.h @@ -16,14 +16,14 @@ private: public: EnchantmentTableTile(int id); - + virtual void updateDefaultShape(); // 4J Added override bool isCubeShaped(); void animateTick(Level *level, int x, int y, int z, Random *random); bool isSolidRender(bool isServerLevel = false); Icon *getTexture(int face, int data); - std::shared_ptr newTileEntity(Level *level); - bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + shared_ptr newTileEntity(Level *level); + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param //@Override void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/EnderChestTile.cpp b/Minecraft.World/EnderChestTile.cpp index 2240a070..7e50a933 100644 --- a/Minecraft.World/EnderChestTile.cpp +++ b/Minecraft.World/EnderChestTile.cpp @@ -48,7 +48,7 @@ bool EnderChestTile::isSilkTouchable() return true; } -void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int facing = 0; int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5f)) & 3; @@ -61,10 +61,10 @@ void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ level->setData(x, y, z, facing); } -bool EnderChestTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +bool EnderChestTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) { - std::shared_ptr container = player->getEnderChestInventory(); - std::shared_ptr enderChest = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + shared_ptr container = player->getEnderChestInventory(); + shared_ptr enderChest = dynamic_pointer_cast(level->getTileEntity(x, y, z)); if (container == NULL || enderChest == NULL) return true; if (level->isSolidBlockingTile(x, y + 1, z)) return true; @@ -80,9 +80,9 @@ bool EnderChestTile::use(Level *level, int x, int y, int z, std::shared_ptr EnderChestTile::newTileEntity(Level *level) +shared_ptr EnderChestTile::newTileEntity(Level *level) { - return std::shared_ptr(new EnderChestTileEntity()); + return shared_ptr(new EnderChestTileEntity()); } void EnderChestTile::animateTick(Level *level, int xt, int yt, int zt, Random *random) diff --git a/Minecraft.World/EnderChestTile.h b/Minecraft.World/EnderChestTile.h index 54cc1b75..96173f63 100644 --- a/Minecraft.World/EnderChestTile.h +++ b/Minecraft.World/EnderChestTile.h @@ -21,9 +21,9 @@ protected: bool isSilkTouchable(); public: - void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); - bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); - std::shared_ptr newTileEntity(Level *level); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + shared_ptr newTileEntity(Level *level); void animateTick(Level *level, int xt, int yt, int zt, Random *random); virtual void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/EnderChestTileEntity.cpp b/Minecraft.World/EnderChestTileEntity.cpp index 25054c23..dffa2bd5 100644 --- a/Minecraft.World/EnderChestTileEntity.cpp +++ b/Minecraft.World/EnderChestTileEntity.cpp @@ -27,7 +27,7 @@ void EnderChestTileEntity::tick() double xc = x + 0.5; double zc = z + 0.5; - // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit + // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_OPEN, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); } if ((openCount == 0 && openness > 0) || (openCount > 0 && openness < 1)) @@ -45,7 +45,7 @@ void EnderChestTileEntity::tick() double xc = x + 0.5; double zc = z + 0.5; - // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit + // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_CLOSE, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); } if (openness < 0) @@ -81,7 +81,7 @@ void EnderChestTileEntity::stopOpen() level->tileEvent(x, y, z, Tile::enderChest_Id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); } -bool EnderChestTileEntity::stillValid(std::shared_ptr player) +bool EnderChestTileEntity::stillValid(shared_ptr player) { if (level->getTileEntity(x, y, z) != shared_from_this()) return false; if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; @@ -90,9 +90,9 @@ bool EnderChestTileEntity::stillValid(std::shared_ptr player) } // 4J Added -std::shared_ptr EnderChestTileEntity::clone() +shared_ptr EnderChestTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new EnderChestTileEntity() ); + shared_ptr result = shared_ptr( new EnderChestTileEntity() ); TileEntity::clone(result); return result; diff --git a/Minecraft.World/EnderChestTileEntity.h b/Minecraft.World/EnderChestTileEntity.h index e67b6bcc..f6882980 100644 --- a/Minecraft.World/EnderChestTileEntity.h +++ b/Minecraft.World/EnderChestTileEntity.h @@ -23,8 +23,8 @@ public: void setRemoved(); void startOpen(); void stopOpen(); - bool stillValid(std::shared_ptr player); + bool stillValid(shared_ptr player); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); }; \ No newline at end of file diff --git a/Minecraft.World/EnderCrystal.cpp b/Minecraft.World/EnderCrystal.cpp index 7e43ef66..719e9d96 100644 --- a/Minecraft.World/EnderCrystal.cpp +++ b/Minecraft.World/EnderCrystal.cpp @@ -9,7 +9,7 @@ void EnderCrystal::_init(Level *level) -{ +{ // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); @@ -91,7 +91,7 @@ bool EnderCrystal::isPickable() bool EnderCrystal::hurt(DamageSource *source, int damage) { // 4J-PB - if the owner of the source is the enderdragon, then ignore it (where the dragon's fireball hits an endercrystal) - std::shared_ptr sourceIsDragon = dynamic_pointer_cast(source->getEntity()); + shared_ptr sourceIsDragon = dynamic_pointer_cast(source->getEntity()); if(sourceIsDragon!=NULL) { @@ -108,12 +108,12 @@ bool EnderCrystal::hurt(DamageSource *source, int damage) { level->explode(nullptr, x, y, z, 6, true); - vector > entities = level->getAllEntities(); - std::shared_ptr dragon = nullptr; + vector > entities = level->getAllEntities(); + shared_ptr dragon = nullptr; AUTO_VAR(itEnd, entities.end()); for (AUTO_VAR(it, entities.begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //entities->at(i); + shared_ptr e = *it; //entities->at(i); dragon = dynamic_pointer_cast(e); if(dragon != NULL) { diff --git a/Minecraft.World/EnderDragon.cpp b/Minecraft.World/EnderDragon.cpp index d93dc3bd..2ccd453c 100644 --- a/Minecraft.World/EnderDragon.cpp +++ b/Minecraft.World/EnderDragon.cpp @@ -84,14 +84,14 @@ EnderDragon::EnderDragon(Level *level) : BossMob(level) { _init(); - head = std::shared_ptr( new BossMobPart(this, L"head", 6, 6) ); - neck = std::shared_ptr( new BossMobPart(this, L"neck", 6, 6) ); // 4J Added - body = std::shared_ptr( new BossMobPart(this, L"body", 8, 8) ); - tail1 = std::shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - tail2 = std::shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - tail3 = std::shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - wing1 = std::shared_ptr( new BossMobPart(this, L"wing", 4, 4) ); - wing2 = std::shared_ptr( new BossMobPart(this, L"wing", 4, 4) ); + head = shared_ptr( new BossMobPart(this, L"head", 6, 6) ); + neck = shared_ptr( new BossMobPart(this, L"neck", 6, 6) ); // 4J Added + body = shared_ptr( new BossMobPart(this, L"body", 8, 8) ); + tail1 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); + tail2 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); + tail3 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); + wing1 = shared_ptr( new BossMobPart(this, L"wing", 4, 4) ); + wing2 = shared_ptr( new BossMobPart(this, L"wing", 4, 4) ); subEntities.push_back(head); subEntities.push_back(neck); // 4J Added @@ -185,7 +185,7 @@ void EnderDragon::aiStep() float flap = Mth::cos(flapTime * PI * 2); float oldFlap = Mth::cos(oFlapTime * PI * 2); - if (oldFlap <= -0.3f && flap >= -0.3f) + if (oldFlap <= -0.3f && flap >= -0.3f) { level->playLocalSound(x, y, z, eSoundType_MOB_ENDERDRAGON_MOVE, 1, 0.8f + random->nextFloat() * .3f, 100.0f); } @@ -352,7 +352,7 @@ void EnderDragon::aiStep() double zdd = zTarget - z; double dist = xdd * xdd + ydd * ydd + zdd * zdd; - + if( getSynchedAction() == e_EnderdragonAction_Sitting_Flaming ) { --m_actionTicks; @@ -379,7 +379,7 @@ void EnderDragon::aiStep() else if( getSynchedAction() == e_EnderdragonAction_Sitting_Scanning ) { attackTarget = level->getNearestPlayer( shared_from_this(), SITTING_ATTACK_VIEW_RANGE, SITTING_ATTACK_Y_VIEW_RANGE ); - + ++m_actionTicks; if( attackTarget != NULL ) { @@ -440,11 +440,11 @@ void EnderDragon::aiStep() { if( m_actionTicks < (FLAME_TICKS - 10) ) { - vector > *targets = level->getEntities(shared_from_this(), m_acidArea); + vector > *targets = level->getEntities(shared_from_this(), m_acidArea); for( AUTO_VAR(it, targets->begin() ); it != targets->end(); ++it) { - std::shared_ptr e = dynamic_pointer_cast( *it ); + shared_ptr e = dynamic_pointer_cast( *it ); if (e != NULL) { //app.DebugPrintf("Attacking entity with acid\n"); @@ -685,7 +685,7 @@ void EnderDragon::aiStep() // Curls/straightens the tail for (int i = 0; i < 3; i++) { - std::shared_ptr part = nullptr; + shared_ptr part = nullptr; if (i == 0) part = tail1; if (i == 1) part = tail2; @@ -710,7 +710,7 @@ void EnderDragon::aiStep() if (!level->isClientSide) { double maxDist = 64.0f; - if (getSynchedAction() == e_EnderdragonAction_StrafePlayer && attackTarget != NULL && attackTarget->distanceToSqr(shared_from_this()) < maxDist * maxDist) + if (getSynchedAction() == e_EnderdragonAction_StrafePlayer && attackTarget != NULL && attackTarget->distanceToSqr(shared_from_this()) < maxDist * maxDist) { if (this->canSee(attackTarget)) { @@ -734,14 +734,14 @@ void EnderDragon::aiStep() double zdd = attackTarget->z - startingZ; level->levelEvent(nullptr, LevelEvent::SOUND_GHAST_FIREBALL, (int) x, (int) y, (int) z, 0); - std::shared_ptr ie = std::shared_ptr( new DragonFireball(level, dynamic_pointer_cast( shared_from_this() ), xdd, ydd, zdd) ); + shared_ptr ie = shared_ptr( new DragonFireball(level, dynamic_pointer_cast( shared_from_this() ), xdd, ydd, zdd) ); ie->x = startingX; ie->y = startingY; ie->z = startingZ; level->addEntity(ie); m_fireballCharge = 0; - app.DebugPrintf("Finding new target due to having fired a fireball\n"); + app.DebugPrintf("Finding new target due to having fired a fireball\n"); if( m_currentPath != NULL ) { while(!m_currentPath->isDone()) @@ -752,8 +752,8 @@ void EnderDragon::aiStep() newTarget = true; findNewTarget(); } - } - else + } + else { if (m_fireballCharge > 0) m_fireballCharge--; } @@ -793,14 +793,14 @@ void EnderDragon::checkCrystals() if (random->nextInt(10) == 0) { float maxDist = 32; - vector > *crystals = level->getEntitiesOfClass(typeid(EnderCrystal), bb->grow(maxDist, maxDist, maxDist)); + vector > *crystals = level->getEntitiesOfClass(typeid(EnderCrystal), bb->grow(maxDist, maxDist, maxDist)); - std::shared_ptr crystal = nullptr; + shared_ptr crystal = nullptr; double nearest = Double::MAX_VALUE; //for (Entity ec : crystals) for(AUTO_VAR(it, crystals->begin()); it != crystals->end(); ++it) { - std::shared_ptr ec = dynamic_pointer_cast( *it ); + shared_ptr ec = dynamic_pointer_cast( *it ); double dist = ec->distanceToSqr(shared_from_this() ); if (dist < nearest) { @@ -809,7 +809,7 @@ void EnderDragon::checkCrystals() } } delete crystals; - + nearestCrystal = crystal; } @@ -831,7 +831,7 @@ void EnderDragon::checkAttack() } } -void EnderDragon::knockBack(vector > *entities) +void EnderDragon::knockBack(vector > *entities) { double xm = (body->bb->x0 + body->bb->x1) / 2; // double ym = (body.bb.y0 + body.bb.y1) / 2; @@ -840,7 +840,7 @@ void EnderDragon::knockBack(vector > *entities) //for (Entity e : entities) for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - std::shared_ptr e = dynamic_pointer_cast( *it ); + shared_ptr e = dynamic_pointer_cast( *it ); if (e != NULL)//(e instanceof Mob) { double xd = e->x - xm; @@ -851,12 +851,12 @@ void EnderDragon::knockBack(vector > *entities) } } -void EnderDragon::hurt(vector > *entities) +void EnderDragon::hurt(vector > *entities) { //for (int i = 0; i < entities->size(); i++) for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - std::shared_ptr e = dynamic_pointer_cast( *it );//entities.get(i); + shared_ptr e = dynamic_pointer_cast( *it );//entities.get(i); if (e != NULL) //(e instanceof Mob) { DamageSource *damageSource = DamageSource::mobAttack( dynamic_pointer_cast( shared_from_this() )); @@ -868,7 +868,7 @@ void EnderDragon::hurt(vector > *entities) void EnderDragon::findNewTarget() { - std::shared_ptr playerNearestToEgg = nullptr; + shared_ptr playerNearestToEgg = nullptr; // Update current action switch(getSynchedAction()) @@ -923,7 +923,7 @@ void EnderDragon::findNewTarget() // app.DebugPrintf("Dragon action is now: SittingFlaming\n"); //#endif // m_actionTicks = FLAME_TICKS; - + m_flameAttacks = 0; setSynchedAction(e_EnderdragonAction_Sitting_Scanning); attackTarget = level->getNearestPlayer( shared_from_this(), SITTING_ATTACK_VIEW_RANGE, SITTING_ATTACK_Y_VIEW_RANGE ); @@ -948,7 +948,7 @@ void EnderDragon::findNewTarget() if( m_currentPath == NULL || m_currentPath->isDone() ) { int currentNodeIndex = findClosestNode(); - + // To get the angle to the player correct when landing, head to a node diametrically opposite the player, then swoop in to 4,4 int eggHeight = max( level->seaLevel + 5, level->getTopSolidBlock(PODIUM_X_POS,PODIUM_Z_POS) ); //level->getHeightmap(4,4); playerNearestToEgg = level->getNearestPlayer(PODIUM_X_POS, eggHeight, PODIUM_Z_POS, 128.0); @@ -978,7 +978,7 @@ void EnderDragon::findNewTarget() navigateToNextPathNode(); if(m_currentPath != NULL && m_currentPath->isDone()) - { + { setSynchedAction(e_EnderdragonAction_Landing); #if PRINT_DRAGON_STATE_CHANGE_MESSAGES app.DebugPrintf("Dragon action is now: Landing\n"); @@ -1033,7 +1033,7 @@ void EnderDragon::findNewTarget() } if(m_currentPath != NULL) delete m_currentPath; - m_currentPath = findPath(currentNodeIndex,targetNodeIndex); + m_currentPath = findPath(currentNodeIndex,targetNodeIndex); // Always skip the first node (as that's where we are already) if(m_currentPath != NULL) m_currentPath->next(); @@ -1100,7 +1100,7 @@ bool EnderDragon::checkWalls(AABB *bb) return hitWall; } -bool EnderDragon::hurt(std::shared_ptr bossMobPart, DamageSource *source, int damage) +bool EnderDragon::hurt(shared_ptr bossMobPart, DamageSource *source, int damage) { if (bossMobPart != head) { @@ -1193,10 +1193,10 @@ void EnderDragon::tickDeath() { int newCount = ExperienceOrb::getExperienceValue(xpCount); xpCount -= newCount; - level->addEntity(std::shared_ptr( new ExperienceOrb(level, x, y, z, newCount) )); + level->addEntity(shared_ptr( new ExperienceOrb(level, x, y, z, newCount) )); } } - if (dragonDeathTime == 1) + if (dragonDeathTime == 1) { //level->globalLevelEvent(LevelEvent::SOUND_DRAGON_DEATH, (int) x, (int) y, (int) z, 0); level->levelEvent(LevelEvent::SOUND_DRAGON_DEATH, (int) x, (int) y, (int) z, 0); @@ -1214,7 +1214,7 @@ void EnderDragon::tickDeath() { int newCount = ExperienceOrb::getExperienceValue(xpCount); xpCount -= newCount; - level->addEntity(std::shared_ptr( new ExperienceOrb(level, x, y, z, newCount))); + level->addEntity(shared_ptr( new ExperienceOrb(level, x, y, z, newCount))); } int xo = 5 + random->nextInt(2) * 2 - 1; int zo = 5 + random->nextInt(2) * 2 - 1; @@ -1312,7 +1312,7 @@ void EnderDragon::checkDespawn() { } -vector > *EnderDragon::getSubEntities() +vector > *EnderDragon::getSubEntities() { return &subEntities; } @@ -1323,7 +1323,7 @@ bool EnderDragon::isPickable() } // Fix for TU9 Enderdragon sound hits being the player sound hits - moved this forward from later version -int EnderDragon::getHurtSound() +int EnderDragon::getHurtSound() { return eSoundType_MOB_ENDERDRAGON_HIT; } @@ -1435,7 +1435,7 @@ EnderDragon::EEnderdragonAction EnderDragon::getSynchedAction() void EnderDragon::handleCrystalDestroyed(DamageSource *source) { AABB *tempBB = AABB::newTemp(PODIUM_X_POS,84.0,PODIUM_Z_POS,PODIUM_X_POS+1.0,85.0,PODIUM_Z_POS+1.0); - vector > *crystals = level->getEntitiesOfClass(typeid(EnderCrystal), tempBB->grow(48, 40, 48)); + vector > *crystals = level->getEntitiesOfClass(typeid(EnderCrystal), tempBB->grow(48, 40, 48)); m_remainingCrystalsCount = (int)crystals->size() - 1; if(m_remainingCrystalsCount < 0) m_remainingCrystalsCount = 0; delete crystals; @@ -1751,7 +1751,7 @@ Path *EnderDragon::reconstruct_path(Node *from, Node *to) NodeArray nodes = NodeArray(count); n = to; nodes.data[--count] = n; - while (n->cameFrom != NULL) + while (n->cameFrom != NULL) { n = n->cameFrom; nodes.data[--count] = n; @@ -1761,7 +1761,7 @@ Path *EnderDragon::reconstruct_path(Node *from, Node *to) return ret; } -void EnderDragon::addAdditonalSaveData(CompoundTag *entityTag) +void EnderDragon::addAdditonalSaveData(CompoundTag *entityTag) { app.DebugPrintf("Adding EnderDragon additional save data\n"); entityTag->putShort(L"RemainingCrystals", m_remainingCrystalsCount); @@ -1770,7 +1770,7 @@ void EnderDragon::addAdditonalSaveData(CompoundTag *entityTag) BossMob::addAdditonalSaveData(entityTag); } -void EnderDragon::readAdditionalSaveData(CompoundTag *tag) +void EnderDragon::readAdditionalSaveData(CompoundTag *tag) { app.DebugPrintf("Reading EnderDragon additional save data\n"); m_remainingCrystalsCount = tag->getShort(L"RemainingCrystals"); @@ -1895,7 +1895,7 @@ double EnderDragon::getHeadPartYRotDiff(int partIndex, doubleArray bodyPos, doub Vec3 *EnderDragon::getHeadLookVector(float a) { Vec3 *result = NULL; - + if( getSynchedAction() == e_EnderdragonAction_Landing || getSynchedAction() == e_EnderdragonAction_Takeoff ) { int eggHeight = level->getTopSolidBlock(PODIUM_X_POS,PODIUM_Z_POS); //level->getHeightmap(4,4); @@ -1903,7 +1903,7 @@ Vec3 *EnderDragon::getHeadLookVector(float a) if( dist < 1.0f ) dist = 1.0f; // The 6.0f is dragon->getHeadPartYOffset(6, start, p) float yOffset = 6.0f / dist; - + double xRotTemp = xRot; double rotScale = 1.5f; xRot = -yOffset * rotScale * 5.0f; diff --git a/Minecraft.World/EnderDragon.h b/Minecraft.World/EnderDragon.h index 93a352c5..8a12c08c 100644 --- a/Minecraft.World/EnderDragon.h +++ b/Minecraft.World/EnderDragon.h @@ -16,7 +16,7 @@ public: private: static const int DATA_ID_SYNCHED_HEALTH = 16; - + // 4J Added for new behaviours static const int DATA_ID_SYNCHED_ACTION = 17; @@ -28,15 +28,15 @@ public: int posPointer; //BossMobPart[] subEntities; - vector > subEntities; - std::shared_ptr head; - std::shared_ptr neck; // 4J Added - std::shared_ptr body; - std::shared_ptr tail1; - std::shared_ptr tail2; - std::shared_ptr tail3; - std::shared_ptr wing1; - std::shared_ptr wing2; + vector > subEntities; + shared_ptr head; + shared_ptr neck; // 4J Added + shared_ptr body; + shared_ptr tail1; + shared_ptr tail2; + shared_ptr tail3; + shared_ptr wing1; + shared_ptr wing2; float oFlapTime; float flapTime; @@ -99,13 +99,13 @@ private: static const int PODIUM_Z_POS = 0; private: - std::shared_ptr attackTarget; + shared_ptr attackTarget; public: int dragonDeathTime; public: - std::shared_ptr nearestCrystal; + shared_ptr nearestCrystal; private: void _init(); @@ -126,14 +126,14 @@ private: void checkCrystals(); void checkAttack(); - void knockBack(vector > *entities); - void hurt(vector > *entities); + void knockBack(vector > *entities); + void hurt(vector > *entities); void findNewTarget(); float rotWrap(double d); bool checkWalls(AABB *bb); public: - virtual bool hurt(std::shared_ptr bossMobPart, DamageSource *source, int damage); + virtual bool hurt(shared_ptr bossMobPart, DamageSource *source, int damage); protected: virtual void tickDeath(); @@ -145,7 +145,7 @@ protected: virtual void checkDespawn(); virtual int getHurtSound(); public: - virtual vector > *getSubEntities(); + virtual vector > *getSubEntities(); virtual bool isPickable(); virtual int getSynchedHealth(); @@ -161,10 +161,10 @@ private: void strafeAttackTarget(); void navigateToNextPathNode(); -public: +public: virtual void addAdditonalSaveData(CompoundTag *entityTag); virtual void readAdditionalSaveData(CompoundTag *tag); - + public: void handleCrystalDestroyed(DamageSource *source); diff --git a/Minecraft.World/EnderEyeItem.cpp b/Minecraft.World/EnderEyeItem.cpp index 4e82597e..a08c1f62 100644 --- a/Minecraft.World/EnderEyeItem.cpp +++ b/Minecraft.World/EnderEyeItem.cpp @@ -13,7 +13,7 @@ EnderEyeItem::EnderEyeItem(int id) : Item(id) { } -bool EnderEyeItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool EnderEyeItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { int targetType = level->getTile(x, y, z); int targetData = level->getData(x, y, z); @@ -132,7 +132,7 @@ bool EnderEyeItem::useOn(std::shared_ptr instance, std::shared_ptr return false; } -bool EnderEyeItem::TestUse(Level *level, std::shared_ptr player) +bool EnderEyeItem::TestUse(Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, false); if (hr != NULL && hr->type == HitResult::TILE) @@ -157,15 +157,15 @@ bool EnderEyeItem::TestUse(Level *level, std::shared_ptr player) } else { -// int x,z; +// int x,z; // if(app.GetTerrainFeaturePosition(eTerrainFeature_Stronghold,&x,&z)) // { // level->getLevelData()->setXStronghold(x); // level->getLevelData()->setZStronghold(z); // level->getLevelData()->setHasStronghold(); -// +// // app.DebugPrintf("=== FOUND stronghold in terrain features list\n"); -// +// // app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_StrongholdPosition); // } // else @@ -185,7 +185,7 @@ bool EnderEyeItem::TestUse(Level *level, std::shared_ptr player) return false; } -std::shared_ptr EnderEyeItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr EnderEyeItem::use(shared_ptr instance, Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, false); if (hr != NULL && hr->type == HitResult::TILE) @@ -206,7 +206,7 @@ std::shared_ptr EnderEyeItem::use(std::shared_ptr in { if((level->dimension->id==LevelData::DIMENSION_OVERWORLD) && level->getLevelData()->getHasStronghold()) { - std::shared_ptr eyeOfEnderSignal = std::shared_ptr( new EyeOfEnderSignal(level, player->x, player->y + 1.62 - player->heightOffset, player->z) ); + shared_ptr eyeOfEnderSignal = shared_ptr( new EyeOfEnderSignal(level, player->x, player->y + 1.62 - player->heightOffset, player->z) ); eyeOfEnderSignal->signalTo(level->getLevelData()->getXStronghold()<<4, player->y + 1.62 - player->heightOffset, level->getLevelData()->getZStronghold()<<4); level->addEntity(eyeOfEnderSignal); @@ -221,7 +221,7 @@ std::shared_ptr EnderEyeItem::use(std::shared_ptr in /*TilePos *nearestMapFeature = level->findNearestMapFeature(LargeFeature::STRONGHOLD, (int) player->x, (int) player->y, (int) player->z); if (nearestMapFeature != NULL) { - std::shared_ptr eyeOfEnderSignal = std::shared_ptr( new EyeOfEnderSignal(level, player->x, player->y + 1.62 - player->heightOffset, player->z) ); + shared_ptr eyeOfEnderSignal = shared_ptr( new EyeOfEnderSignal(level, player->x, player->y + 1.62 - player->heightOffset, player->z) ); eyeOfEnderSignal->signalTo(nearestMapFeature->x, nearestMapFeature->y, nearestMapFeature->z); delete nearestMapFeature; level->addEntity(eyeOfEnderSignal); diff --git a/Minecraft.World/EnderEyeItem.h b/Minecraft.World/EnderEyeItem.h index cbe56cfb..72036aa5 100644 --- a/Minecraft.World/EnderEyeItem.h +++ b/Minecraft.World/EnderEyeItem.h @@ -7,7 +7,7 @@ class EnderEyeItem : public Item public: EnderEyeItem(int id); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual bool TestUse(Level *level, std::shared_ptr player); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool TestUse(Level *level, shared_ptr player); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/EnderMan.cpp b/Minecraft.World/EnderMan.cpp index e5995587..abfc5cb5 100644 --- a/Minecraft.World/EnderMan.cpp +++ b/Minecraft.World/EnderMan.cpp @@ -83,16 +83,16 @@ void EnderMan::readAdditionalSaveData(CompoundTag *tag) setCarryingData(tag->getShort(L"carryingData")); } -std::shared_ptr EnderMan::findAttackTarget() +shared_ptr EnderMan::findAttackTarget() { #ifndef _FINAL_BUILD if(app.GetMobsDontAttackEnabled()) { - return std::shared_ptr(); + return shared_ptr(); } #endif - std::shared_ptr player = level->getNearestAttackablePlayer(shared_from_this(), 64); + shared_ptr player = level->getNearestAttackablePlayer(shared_from_this(), 64); if (player != NULL) { if (isLookingAtMe(player)) @@ -112,9 +112,9 @@ std::shared_ptr EnderMan::findAttackTarget() return nullptr; } -bool EnderMan::isLookingAtMe(std::shared_ptr player) +bool EnderMan::isLookingAtMe(shared_ptr player) { - std::shared_ptr helmet = player->inventory->armor[3]; + shared_ptr helmet = player->inventory->armor[3]; if (helmet != NULL && helmet->id == Tile::pumpkin_Id) return false; Vec3 *look = player->getViewVector(1)->normalize(); @@ -250,7 +250,7 @@ bool EnderMan::teleport() return teleport(xx, yy, zz); } -bool EnderMan::teleportTowards(std::shared_ptr e) +bool EnderMan::teleportTowards(shared_ptr e) { Vec3 *dir = Vec3::newTemp(x - e->x, bb->y0 + bbHeight / 2 - e->y + e->getHeadHeight(), z - e->z); dir = dir->normalize(); diff --git a/Minecraft.World/EnderMan.h b/Minecraft.World/EnderMan.h index 3b2bda86..f5084532 100644 --- a/Minecraft.World/EnderMan.h +++ b/Minecraft.World/EnderMan.h @@ -33,17 +33,17 @@ public: virtual void readAdditionalSaveData(CompoundTag *tag); protected: - virtual std::shared_ptr findAttackTarget(); + virtual shared_ptr findAttackTarget(); private: - bool isLookingAtMe(std::shared_ptr player); + bool isLookingAtMe(shared_ptr player); public: virtual void aiStep(); protected: bool teleport(); - bool teleportTowards(std::shared_ptr e); + bool teleportTowards(shared_ptr e); bool teleport(double xx, double yy, double zz); virtual int getAmbientSound(); diff --git a/Minecraft.World/EnderpearlItem.cpp b/Minecraft.World/EnderpearlItem.cpp index e103b73b..7a9b6e52 100644 --- a/Minecraft.World/EnderpearlItem.cpp +++ b/Minecraft.World/EnderpearlItem.cpp @@ -10,12 +10,12 @@ EnderpearlItem::EnderpearlItem(int id) : Item(id) this->maxStackSize = 16; } -bool EnderpearlItem::TestUse(Level *level, std::shared_ptr player) +bool EnderpearlItem::TestUse(Level *level, shared_ptr player) { return true; } -std::shared_ptr EnderpearlItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr EnderpearlItem::use(shared_ptr instance, Level *level, shared_ptr player) { // 4J-PB - Not sure why this was disabled for creative mode, so commenting out //if (player->abilities.instabuild) return instance; @@ -26,9 +26,9 @@ std::shared_ptr EnderpearlItem::use(std::shared_ptr } level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) + if (!level->isClientSide) { - level->addEntity( std::shared_ptr( new ThrownEnderpearl(level, player) ) ); + level->addEntity( shared_ptr( new ThrownEnderpearl(level, player) ) ); } return instance; } \ No newline at end of file diff --git a/Minecraft.World/EnderpearlItem.h b/Minecraft.World/EnderpearlItem.h index 5dbcb619..84913b9e 100644 --- a/Minecraft.World/EnderpearlItem.h +++ b/Minecraft.World/EnderpearlItem.h @@ -7,7 +7,7 @@ class EnderpearlItem : public Item public: EnderpearlItem(int id); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); // 4J added - virtual bool TestUse(Level *level, std::shared_ptr player); + virtual bool TestUse(Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/Entity.cpp b/Minecraft.World/Entity.cpp index 6b602f6e..4c9d5cf6 100644 --- a/Minecraft.World/Entity.cpp +++ b/Minecraft.World/Entity.cpp @@ -309,7 +309,7 @@ void Entity::_init(bool useSmallId) fireImmune = false; // values that need to be sent to clients in SMP - entityData = std::shared_ptr(new SynchedEntityData()); + entityData = shared_ptr(new SynchedEntityData()); xRideRotA = yRideRotA = 0.0; inChunk = false; @@ -350,7 +350,7 @@ Entity::~Entity() delete bb; } -std::shared_ptr Entity::getEntityData() +shared_ptr Entity::getEntityData() { return entityData; } @@ -372,7 +372,7 @@ void Entity::resetPos() { if (level == NULL) return; - std::shared_ptr sharedThis = shared_from_this(); + shared_ptr sharedThis = shared_from_this(); while (true && y > 0) { setPos(x, y, z); @@ -392,7 +392,7 @@ void Entity::remove() void Entity::setSize(float w, float h) { - if (w != bbWidth || h != bbHeight) + if (w != bbWidth || h != bbHeight) { float oldW = bbWidth; @@ -403,7 +403,7 @@ void Entity::setSize(float w, float h) bb->z1 = bb->z0 + bbWidth; bb->y1 = bb->y0 + bbHeight; - if (bbWidth > oldW && !firstTick && !level->isClientSide) + if (bbWidth > oldW && !firstTick && !level->isClientSide) { move(oldW - bbWidth, 0, oldW - bbWidth); } @@ -421,7 +421,7 @@ void Entity::setPos(EntityPos *pos) void Entity::setRot(float yRot, float xRot) { - /* JAVA: + /* JAVA: this->yRot = yRot % 360.0f; this->xRot = xRot % 360.0f; @@ -531,7 +531,7 @@ void Entity::baseTick() fallDistance = 0; wasInWater = true; onFire = 0; - } + } else { wasInWater = false; @@ -541,7 +541,7 @@ void Entity::baseTick() { onFire = 0; } - else + else { if (onFire > 0) { @@ -958,7 +958,7 @@ void Entity::playStepSound(int xt, int yt, int zt, int t) } } else - { + { if (level->getTile(xt, yt + 1, zt) == Tile::topSnow_Id) { soundType = Tile::topSnow->soundType; @@ -1020,7 +1020,7 @@ void Entity::checkFallDamage(double ya, bool onGround) causeFallDamage(fallDistance); fallDistance = 0; } - } + } else { if (ya < 0) fallDistance -= (float) ya; @@ -1169,7 +1169,7 @@ void Entity::moveTo(double x, double y, double z, float yRot, float xRot) this->setPos(this->x, this->y, this->z); } -float Entity::distanceTo(std::shared_ptr e) +float Entity::distanceTo(shared_ptr e) { float xd = (float) (x - e->x); float yd = (float) (y - e->y); @@ -1193,7 +1193,7 @@ double Entity::distanceTo(double x2, double y2, double z2) return sqrt(xd * xd + yd * yd + zd * zd); } -double Entity::distanceToSqr(std::shared_ptr e) +double Entity::distanceToSqr(shared_ptr e) { double xd = x - e->x; double yd = y - e->y; @@ -1201,11 +1201,11 @@ double Entity::distanceToSqr(std::shared_ptr e) return xd * xd + yd * yd + zd * zd; } -void Entity::playerTouch(std::shared_ptr player) +void Entity::playerTouch(shared_ptr player) { } -void Entity::push(std::shared_ptr e) +void Entity::push(shared_ptr e) { if (e->rider.lock().get() == this || e->riding.get() == this) return; @@ -1277,7 +1277,7 @@ bool Entity::isShootable() return false; } -void Entity::awardKillScore(std::shared_ptr victim, int score) +void Entity::awardKillScore(shared_ptr victim, int score) { } @@ -1437,19 +1437,19 @@ float Entity::getShadowHeightOffs() return bbHeight / 2; } -std::shared_ptr Entity::spawnAtLocation(int resource, int count) +shared_ptr Entity::spawnAtLocation(int resource, int count) { return spawnAtLocation(resource, count, 0); } -std::shared_ptr Entity::spawnAtLocation(int resource, int count, float yOffs) +shared_ptr Entity::spawnAtLocation(int resource, int count, float yOffs) { - return spawnAtLocation(std::shared_ptr( new ItemInstance(resource, count, 0) ), yOffs); + return spawnAtLocation(shared_ptr( new ItemInstance(resource, count, 0) ), yOffs); } -std::shared_ptr Entity::spawnAtLocation(std::shared_ptr itemInstance, float yOffs) +shared_ptr Entity::spawnAtLocation(shared_ptr itemInstance, float yOffs) { - std::shared_ptr ie = std::shared_ptr( new ItemEntity(level, x, y + yOffs, z, itemInstance) ); + shared_ptr ie = shared_ptr( new ItemEntity(level, x, y + yOffs, z, itemInstance) ); ie->throwTime = 10; level->addEntity(ie); return ie; @@ -1478,12 +1478,12 @@ bool Entity::isInWall() return false; } -bool Entity::interact(std::shared_ptr player) +bool Entity::interact(shared_ptr player) { return false; } -AABB *Entity::getCollideAgainstBox(std::shared_ptr entity) +AABB *Entity::getCollideAgainstBox(shared_ptr entity) { return NULL; } @@ -1531,10 +1531,10 @@ void Entity::rideTick() void Entity::positionRider() { - std::shared_ptr lockedRider = rider.lock(); + shared_ptr lockedRider = rider.lock(); if( lockedRider ) { - std::shared_ptr player = dynamic_pointer_cast(lockedRider); + shared_ptr player = dynamic_pointer_cast(lockedRider); if (!(player && player->isLocalPlayer())) { lockedRider->xOld = xOld; @@ -1555,7 +1555,7 @@ double Entity::getRideHeight() return bbHeight * .75; } -void Entity::ride(std::shared_ptr e) +void Entity::ride(shared_ptr e) { xRideRotA = 0; yRideRotA = 0; @@ -1580,7 +1580,7 @@ void Entity::ride(std::shared_ptr e) } // 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player -void Entity::findStandUpPosition(std::shared_ptr vehicle) +void Entity::findStandUpPosition(shared_ptr vehicle) { AABB *boundingBox; double fallbackX = vehicle->x; @@ -1690,7 +1690,7 @@ ItemInstanceArray Entity::getEquipmentSlots() // ItemInstance[] } // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game -void Entity::setEquippedSlot(int slot, std::shared_ptr item) +void Entity::setEquippedSlot(int slot, shared_ptr item) { } @@ -1739,7 +1739,7 @@ bool Entity::isInvisible() return getSharedFlag(FLAG_INVISIBLE); } -bool Entity::isInvisibleTo(std::shared_ptr plr) +bool Entity::isInvisibleTo(shared_ptr plr) { return isInvisible(); } @@ -1777,7 +1777,7 @@ bool Entity::getSharedFlag(int flag) void Entity::setSharedFlag(int flag, bool value) { byte currentValue = entityData->getByte(DATA_SHARED_FLAGS_ID); - if (value) + if (value) { entityData->set(DATA_SHARED_FLAGS_ID, (byte) (currentValue | (1 << flag))); } @@ -1806,7 +1806,7 @@ void Entity::thunderHit(const LightningBolt *lightningBolt) if (onFire == 0) setOnFire(8); } -void Entity::killed(std::shared_ptr mob) +void Entity::killed(shared_ptr mob) { } @@ -1892,12 +1892,12 @@ wstring Entity::getAName() //return I18n.get("entity." + id + ".name"); } -vector > *Entity::getSubEntities() +vector > *Entity::getSubEntities() { return NULL; } -bool Entity::is(std::shared_ptr other) +bool Entity::is(shared_ptr other) { return shared_from_this() == other; } @@ -1921,18 +1921,18 @@ bool Entity::isInvulnerable() return false; } -void Entity::copyPosition(std::shared_ptr target) +void Entity::copyPosition(shared_ptr target) { moveTo(target->x, target->y, target->z, target->yRot, target->xRot); } -void Entity::setAnimOverrideBitmask(unsigned int uiBitmask) +void Entity::setAnimOverrideBitmask(unsigned int uiBitmask) { m_uiAnimOverrideBitmask=uiBitmask; app.DebugPrintf("!!! Setting anim override bitmask to %d\n",uiBitmask); } -unsigned int Entity::getAnimOverrideBitmask() -{ +unsigned int Entity::getAnimOverrideBitmask() +{ if(app.GetGameSettings(eGameSetting_CustomSkinAnim)==0 ) { // We have a force animation for some skins (claptrap) diff --git a/Minecraft.World/Entity.h b/Minecraft.World/Entity.h index 2b8b167b..bde83e30 100644 --- a/Minecraft.World/Entity.h +++ b/Minecraft.World/Entity.h @@ -52,7 +52,7 @@ public: bool blocksBuilding; weak_ptr rider; // Changed to weak to avoid circular dependency between rider/riding entity - std::shared_ptr riding; + shared_ptr riding; Level *level; double xo, yo, zo; @@ -118,7 +118,7 @@ protected: bool fireImmune; // values that need to be sent to clients in SMP - std::shared_ptr entityData; + shared_ptr entityData; private: // shared flags that are sent to clients (max 8) @@ -159,7 +159,7 @@ protected: virtual void defineSynchedData() = 0; public: - std::shared_ptr getEntityData(); + shared_ptr getEntityData(); /* public bool equals(Object obj) { @@ -243,12 +243,12 @@ public: virtual void setLevel(Level *level); void absMoveTo(double x, double y, double z, float yRot, float xRot); void moveTo(double x, double y, double z, float yRot, float xRot); - float distanceTo(std::shared_ptr e); + float distanceTo(shared_ptr e); double distanceToSqr(double x2, double y2, double z2); double distanceTo(double x2, double y2, double z2); - double distanceToSqr(std::shared_ptr e); - virtual void playerTouch(std::shared_ptr player); - virtual void push(std::shared_ptr e); + double distanceToSqr(shared_ptr e); + virtual void playerTouch(shared_ptr player); + virtual void push(shared_ptr e); virtual void push(double xa, double ya, double za); protected: @@ -261,7 +261,7 @@ public: virtual bool isPickable(); virtual bool isPushable(); virtual bool isShootable(); - virtual void awardKillScore(std::shared_ptr victim, int score); + virtual void awardKillScore(shared_ptr victim, int score); virtual bool shouldRender(Vec3 *c); virtual bool shouldRenderAtSqrDistance(double distance); virtual int getTexture(); // 4J - changed from wstring to int @@ -283,20 +283,20 @@ protected: public: virtual float getShadowHeightOffs(); - std::shared_ptr spawnAtLocation(int resource, int count); - std::shared_ptr spawnAtLocation(int resource, int count, float yOffs); - std::shared_ptr spawnAtLocation(std::shared_ptr itemInstance, float yOffs); + shared_ptr spawnAtLocation(int resource, int count); + shared_ptr spawnAtLocation(int resource, int count, float yOffs); + shared_ptr spawnAtLocation(shared_ptr itemInstance, float yOffs); virtual bool isAlive(); virtual bool isInWall(); - virtual bool interact(std::shared_ptr player); - virtual AABB *getCollideAgainstBox(std::shared_ptr entity); + virtual bool interact(shared_ptr player); + virtual AABB *getCollideAgainstBox(shared_ptr entity); virtual void rideTick(); virtual void positionRider(); virtual double getRidingHeight(); virtual double getRideHeight(); - virtual void ride(std::shared_ptr e); - virtual void findStandUpPosition(std::shared_ptr vehicle); // 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player + virtual void ride(shared_ptr e); + virtual void findStandUpPosition(shared_ptr vehicle); // 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); virtual float getPickRadius(); virtual Vec3 *getLookAngle(); @@ -306,7 +306,7 @@ public: virtual void animateHurt(); virtual void prepareCustomTextures(); virtual ItemInstanceArray getEquipmentSlots(); // ItemInstance[] - virtual void setEquippedSlot(int slot, std::shared_ptr item); // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game + virtual void setEquippedSlot(int slot, shared_ptr item); // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game virtual bool isOnFire(); virtual bool isRiding(); virtual bool isSneaking(); @@ -316,7 +316,7 @@ public: virtual bool isSprinting(); virtual void setSprinting(bool value); virtual bool isInvisible(); - virtual bool isInvisibleTo(std::shared_ptr plr); + virtual bool isInvisibleTo(shared_ptr plr); virtual void setInvisible(bool value); virtual bool isUsingItemFlag(); virtual void setUsingItemFlag(bool value); @@ -336,7 +336,7 @@ public: void setAirSupply(int supply); virtual void thunderHit(const LightningBolt *lightningBolt); - virtual void killed(std::shared_ptr mob); + virtual void killed(shared_ptr mob); protected: bool checkInTile(double x, double y, double z); @@ -347,7 +347,7 @@ public: virtual wstring getAName(); // TU9 - bool skipAttackInteraction(std::shared_ptr source) {return false;} + bool skipAttackInteraction(shared_ptr source) {return false;} // 4J - added to manage allocation of small ids private: @@ -374,14 +374,14 @@ public: void considerForExtraWandering(bool enable); bool isExtraWanderingEnabled(); int getWanderingQuadrant(); - - virtual vector > *getSubEntities(); - virtual bool is(std::shared_ptr other); + + virtual vector > *getSubEntities(); + virtual bool is(shared_ptr other); virtual float getYHeadRot(); virtual void setYHeadRot(float yHeadRot); virtual bool isAttackable(); virtual bool isInvulnerable(); - virtual void copyPosition(std::shared_ptr target); + virtual void copyPosition(shared_ptr target); private: unsigned int m_uiAnimOverrideBitmask; diff --git a/Minecraft.World/EntityActionAtPositionPacket.cpp b/Minecraft.World/EntityActionAtPositionPacket.cpp index af7ee82d..7353f932 100644 --- a/Minecraft.World/EntityActionAtPositionPacket.cpp +++ b/Minecraft.World/EntityActionAtPositionPacket.cpp @@ -18,7 +18,7 @@ EntityActionAtPositionPacket::EntityActionAtPositionPacket() action = 0; } -EntityActionAtPositionPacket::EntityActionAtPositionPacket(std::shared_ptr e, int action, int x, int y, int z) +EntityActionAtPositionPacket::EntityActionAtPositionPacket(shared_ptr e, int action, int x, int y, int z) { this->action = action; this->x = x; @@ -27,7 +27,7 @@ EntityActionAtPositionPacket::EntityActionAtPositionPacket(std::shared_ptrid = e->entityId; } -void EntityActionAtPositionPacket::read(DataInputStream *dis) //throws IOException +void EntityActionAtPositionPacket::read(DataInputStream *dis) //throws IOException { id = dis->readInt(); action = dis->readByte(); diff --git a/Minecraft.World/EntityActionAtPositionPacket.h b/Minecraft.World/EntityActionAtPositionPacket.h index 57a730d9..35202017 100644 --- a/Minecraft.World/EntityActionAtPositionPacket.h +++ b/Minecraft.World/EntityActionAtPositionPacket.h @@ -10,7 +10,7 @@ public: int id, x, y, z, action; EntityActionAtPositionPacket(); - EntityActionAtPositionPacket(std::shared_ptr e, int action, int x, int y, int z); + EntityActionAtPositionPacket(shared_ptr e, int action, int x, int y, int z); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); @@ -18,6 +18,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new EntityActionAtPositionPacket()); } + static shared_ptr create() { return shared_ptr(new EntityActionAtPositionPacket()); } virtual int getId() { return 17; } }; \ No newline at end of file diff --git a/Minecraft.World/EntityDamageSource.cpp b/Minecraft.World/EntityDamageSource.cpp index 266c867f..8c7a5ee1 100644 --- a/Minecraft.World/EntityDamageSource.cpp +++ b/Minecraft.World/EntityDamageSource.cpp @@ -4,32 +4,32 @@ #include "net.minecraft.world.damagesource.h" #include "net.minecraft.network.packet.h" -//EntityDamageSource::EntityDamageSource(const wstring &msgId, std::shared_ptr entity) : DamageSource(msgId) -EntityDamageSource::EntityDamageSource(ChatPacket::EChatPacketMessage msgId, std::shared_ptr entity) : DamageSource(msgId) +//EntityDamageSource::EntityDamageSource(const wstring &msgId, shared_ptr entity) : DamageSource(msgId) +EntityDamageSource::EntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity) : DamageSource(msgId) { this->entity = entity; } -std::shared_ptr EntityDamageSource::getEntity() +shared_ptr EntityDamageSource::getEntity() { return entity; } -//wstring EntityDamageSource::getLocalizedDeathMessage(std::shared_ptr player) +//wstring EntityDamageSource::getLocalizedDeathMessage(shared_ptr player) //{ // return L"death." + msgId + player->name + entity->getAName(); // //return I18n.get("death." + msgId, player.name, entity.getAName()); //} -std::shared_ptr EntityDamageSource::getDeathMessagePacket(std::shared_ptr player) +shared_ptr EntityDamageSource::getDeathMessagePacket(shared_ptr player) { wstring additional = L""; if(entity->GetType() == eTYPE_SERVERPLAYER) { - std::shared_ptr sourcePlayer = dynamic_pointer_cast(entity); + shared_ptr sourcePlayer = dynamic_pointer_cast(entity); if(sourcePlayer != NULL) additional = sourcePlayer->name; } - return std::shared_ptr( new ChatPacket(player->name, m_msgId, entity->GetType(), additional ) ); + return shared_ptr( new ChatPacket(player->name, m_msgId, entity->GetType(), additional ) ); } bool EntityDamageSource::scalesWithDifficulty() diff --git a/Minecraft.World/EntityDamageSource.h b/Minecraft.World/EntityDamageSource.h index a8a8ffbb..bdbe36e7 100644 --- a/Minecraft.World/EntityDamageSource.h +++ b/Minecraft.World/EntityDamageSource.h @@ -9,18 +9,18 @@ class Player; class EntityDamageSource : public DamageSource { protected: - std::shared_ptr entity; + shared_ptr entity; public: - //EntityDamageSource(const wstring &msgId, std::shared_ptr entity); - EntityDamageSource(ChatPacket::EChatPacketMessage msgId, std::shared_ptr entity); + //EntityDamageSource(const wstring &msgId, shared_ptr entity); + EntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity); virtual ~EntityDamageSource() { } - std::shared_ptr getEntity(); + shared_ptr getEntity(); // 4J Stu - Made return a packet - //virtual wstring getLocalizedDeathMessage(std::shared_ptr player); - virtual std::shared_ptr getDeathMessagePacket(std::shared_ptr player); + //virtual wstring getLocalizedDeathMessage(shared_ptr player); + virtual shared_ptr getDeathMessagePacket(shared_ptr player); virtual bool scalesWithDifficulty(); }; \ No newline at end of file diff --git a/Minecraft.World/EntityEventPacket.h b/Minecraft.World/EntityEventPacket.h index 264e504c..a151dbdb 100644 --- a/Minecraft.World/EntityEventPacket.h +++ b/Minecraft.World/EntityEventPacket.h @@ -18,7 +18,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new EntityEventPacket()); } + static shared_ptr create() { return shared_ptr(new EntityEventPacket()); } virtual int getId() { return 38; } }; diff --git a/Minecraft.World/EntityIO.cpp b/Minecraft.World/EntityIO.cpp index 123d4ba5..d0677d38 100644 --- a/Minecraft.World/EntityIO.cpp +++ b/Minecraft.World/EntityIO.cpp @@ -43,7 +43,7 @@ void EntityIO::staticCtor() { setId(ItemEntity::create, eTYPE_ITEMENTITY, L"Item", 1); setId(ExperienceOrb::create, eTYPE_EXPERIENCEORB, L"XPOrb", 2); - + setId(Painting::create, eTYPE_PAINTING, L"Painting", 9); setId(Arrow::create, eTYPE_ARROW, L"Arrow", 10); setId(Snowball::create, eTYPE_SNOWBALL, L"Snowball", 11); @@ -98,29 +98,29 @@ void EntityIO::staticCtor() setId(DragonFireball::create, eTYPE_DRAGON_FIREBALL, L"DragonFireball", 1000); } -std::shared_ptr EntityIO::newEntity(const wstring& id, Level *level) +shared_ptr EntityIO::newEntity(const wstring& id, Level *level) { - std::shared_ptr entity; + shared_ptr entity; AUTO_VAR(it, idCreateMap->find(id)); if(it != idCreateMap->end() ) { entityCreateFn create = it->second; - if (create != NULL) entity = std::shared_ptr(create(level)); + if (create != NULL) entity = shared_ptr(create(level)); } return entity; } -std::shared_ptr EntityIO::loadStatic(CompoundTag *tag, Level *level) +shared_ptr EntityIO::loadStatic(CompoundTag *tag, Level *level) { - std::shared_ptr entity; + shared_ptr entity; AUTO_VAR(it, idCreateMap->find(tag->getString(L"id"))); if(it != idCreateMap->end() ) { entityCreateFn create = it->second; - if (create != NULL) entity = std::shared_ptr(create(level)); + if (create != NULL) entity = shared_ptr(create(level)); } if (entity != NULL) @@ -136,15 +136,15 @@ std::shared_ptr EntityIO::loadStatic(CompoundTag *tag, Level *level) return entity; } -std::shared_ptr EntityIO::newById(int id, Level *level) +shared_ptr EntityIO::newById(int id, Level *level) { - std::shared_ptr entity; + shared_ptr entity; AUTO_VAR(it, numCreateMap->find(id)); if(it != numCreateMap->end() ) { entityCreateFn create = it->second; - if (create != NULL) entity = std::shared_ptr(create(level)); + if (create != NULL) entity = shared_ptr(create(level)); } if (entity != NULL) @@ -157,9 +157,9 @@ std::shared_ptr EntityIO::newById(int id, Level *level) return entity; } -std::shared_ptr EntityIO::newByEnumType(eINSTANCEOF eType, Level *level) +shared_ptr EntityIO::newByEnumType(eINSTANCEOF eType, Level *level) { - std::shared_ptr entity; + shared_ptr entity; unordered_map::iterator it = classNumMap->find( eType ); if( it != classNumMap->end() ) @@ -168,20 +168,20 @@ std::shared_ptr EntityIO::newByEnumType(eINSTANCEOF eType, Level *level) if(it2 != numCreateMap->end() ) { entityCreateFn create = it2->second; - if (create != NULL) entity = std::shared_ptr(create(level)); + if (create != NULL) entity = shared_ptr(create(level)); } } return entity; } -int EntityIO::getId(std::shared_ptr entity) +int EntityIO::getId(shared_ptr entity) { unordered_map::iterator it = classNumMap->find( entity->GetType() ); return (*it).second; } -wstring EntityIO::getEncodeId(std::shared_ptr entity) +wstring EntityIO::getEncodeId(shared_ptr entity) { unordered_map::iterator it = classIdMap->find( entity->GetType() ); if( it != classIdMap->end() ) @@ -208,7 +208,7 @@ wstring EntityIO::getEncodeId(int entityIoValue) //{ //return classIdMap.get(class1); //} - + AUTO_VAR(it, numClassMap->find(entityIoValue)); if(it != numClassMap->end() ) { diff --git a/Minecraft.World/EntityIO.h b/Minecraft.World/EntityIO.h index be233d1d..c9aa9f65 100644 --- a/Minecraft.World/EntityIO.h +++ b/Minecraft.World/EntityIO.h @@ -44,12 +44,12 @@ private: public: static void staticCtor(); - static std::shared_ptr newEntity(const wstring& id, Level *level); - static std::shared_ptr loadStatic(CompoundTag *tag, Level *level); - static std::shared_ptr newById(int id, Level *level); - static std::shared_ptr newByEnumType(eINSTANCEOF eType, Level *level); - static int getId(std::shared_ptr entity); - static wstring getEncodeId(std::shared_ptr entity); + static shared_ptr newEntity(const wstring& id, Level *level); + static shared_ptr loadStatic(CompoundTag *tag, Level *level); + static shared_ptr newById(int id, Level *level); + static shared_ptr newByEnumType(eINSTANCEOF eType, Level *level); + static int getId(shared_ptr entity); + static wstring getEncodeId(shared_ptr entity); static int getId(const wstring &encodeId); static wstring getEncodeId(int entityIoValue); static int getNameId(int entityIoValue); diff --git a/Minecraft.World/EntityPos.cpp b/Minecraft.World/EntityPos.cpp index 8968ef80..38b50573 100644 --- a/Minecraft.World/EntityPos.cpp +++ b/Minecraft.World/EntityPos.cpp @@ -34,7 +34,7 @@ EntityPos::EntityPos(float yRot, float xRot) move = false; } -EntityPos *EntityPos::lerp(std::shared_ptr e, float f) +EntityPos *EntityPos::lerp(shared_ptr e, float f) { double xd = e->x+(x-e->x)*f; double yd = e->y+(y-e->y)*f; diff --git a/Minecraft.World/EntityPos.h b/Minecraft.World/EntityPos.h index 6b82af01..5b064901 100644 --- a/Minecraft.World/EntityPos.h +++ b/Minecraft.World/EntityPos.h @@ -11,5 +11,5 @@ public: EntityPos(double x, double y, double z, float yRot, float xRot); EntityPos(double x, double y, double z); EntityPos(float yRot, float xRot); - EntityPos *lerp(std::shared_ptr e, float f); + EntityPos *lerp(shared_ptr e, float f); }; \ No newline at end of file diff --git a/Minecraft.World/EntityTile.cpp b/Minecraft.World/EntityTile.cpp index 107742f3..8dd68ff2 100644 --- a/Minecraft.World/EntityTile.cpp +++ b/Minecraft.World/EntityTile.cpp @@ -24,7 +24,7 @@ void EntityTile::onRemove(Level *level, int x, int y, int z, int id, int data) void EntityTile::triggerEvent(Level *level, int x, int y, int z, int b0, int b1) { Tile::triggerEvent(level, x, y, z, b0, b1); - std::shared_ptr te = level->getTileEntity(x, y, z); + shared_ptr te = level->getTileEntity(x, y, z); if (te != NULL) { te->triggerEvent(b0, b1); diff --git a/Minecraft.World/EntityTile.h b/Minecraft.World/EntityTile.h index 584fd1d4..7f781c19 100644 --- a/Minecraft.World/EntityTile.h +++ b/Minecraft.World/EntityTile.h @@ -10,6 +10,6 @@ protected: public: virtual void onPlace(Level *level, int x, int y, int z); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual std::shared_ptr newTileEntity(Level *level) = 0; + virtual shared_ptr newTileEntity(Level *level) = 0; virtual void triggerEvent(Level *level, int x, int y, int z, int b0, int b1); }; \ No newline at end of file diff --git a/Minecraft.World/ExperienceCommand.cpp b/Minecraft.World/ExperienceCommand.cpp index 7959212c..b8ac2efc 100644 --- a/Minecraft.World/ExperienceCommand.cpp +++ b/Minecraft.World/ExperienceCommand.cpp @@ -9,7 +9,7 @@ EGameCommand ExperienceCommand::getId() return eGameCommand_Experience; } -void ExperienceCommand::execute(std::shared_ptr source, byteArray commandData) +void ExperienceCommand::execute(shared_ptr source, byteArray commandData) { //if (args.length > 0) //{ @@ -27,10 +27,10 @@ void ExperienceCommand::execute(std::shared_ptr source, byteArray //} } -std::shared_ptr ExperienceCommand::getPlayer(PlayerUID playerId) +shared_ptr ExperienceCommand::getPlayer(PlayerUID playerId) { return nullptr; - //std::shared_ptr player = MinecraftServer::getInstance()->getPlayers()->getPlayer(playerId); + //shared_ptr player = MinecraftServer::getInstance()->getPlayers()->getPlayer(playerId); //if (player == null) //{ diff --git a/Minecraft.World/ExperienceCommand.h b/Minecraft.World/ExperienceCommand.h index 5165428f..b1dd2cbe 100644 --- a/Minecraft.World/ExperienceCommand.h +++ b/Minecraft.World/ExperienceCommand.h @@ -8,8 +8,8 @@ class ExperienceCommand : public Command { public: virtual EGameCommand getId(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); protected: - std::shared_ptr getPlayer(PlayerUID playerId); + shared_ptr getPlayer(PlayerUID playerId); }; \ No newline at end of file diff --git a/Minecraft.World/ExperienceItem.cpp b/Minecraft.World/ExperienceItem.cpp index d2d5b896..497c2385 100644 --- a/Minecraft.World/ExperienceItem.cpp +++ b/Minecraft.World/ExperienceItem.cpp @@ -10,23 +10,23 @@ ExperienceItem::ExperienceItem(int id) : Item(id) { } -bool ExperienceItem::isFoil(std::shared_ptr itemInstance) +bool ExperienceItem::isFoil(shared_ptr itemInstance) { return true; } -bool ExperienceItem::TestUse(Level *level, std::shared_ptr player) +bool ExperienceItem::TestUse(Level *level, shared_ptr player) { return true; } -std::shared_ptr ExperienceItem::use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr ExperienceItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) { if (!player->abilities.instabuild) { itemInstance->count--; } level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) level->addEntity( std::shared_ptr( new ThrownExpBottle(level, player) )); + if (!level->isClientSide) level->addEntity( shared_ptr( new ThrownExpBottle(level, player) )); return itemInstance; } \ No newline at end of file diff --git a/Minecraft.World/ExperienceItem.h b/Minecraft.World/ExperienceItem.h index c0d18dcf..c8e95925 100644 --- a/Minecraft.World/ExperienceItem.h +++ b/Minecraft.World/ExperienceItem.h @@ -9,7 +9,7 @@ class ExperienceItem : public Item public: ExperienceItem(int id); - virtual bool isFoil(std::shared_ptr itemInstance); - virtual std::shared_ptr use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); - virtual bool TestUse(Level *level, std::shared_ptr player); + virtual bool isFoil(shared_ptr itemInstance); + virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); + virtual bool TestUse(Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/ExperienceOrb.cpp b/Minecraft.World/ExperienceOrb.cpp index a8ae4da4..76f2a9ae 100644 --- a/Minecraft.World/ExperienceOrb.cpp +++ b/Minecraft.World/ExperienceOrb.cpp @@ -187,7 +187,7 @@ void ExperienceOrb::readAdditionalSaveData(CompoundTag *tag) value = tag->getShort(L"Value"); } -void ExperienceOrb::playerTouch(std::shared_ptr player) +void ExperienceOrb::playerTouch(shared_ptr player) { if (level->isClientSide) return; @@ -258,7 +258,7 @@ int ExperienceOrb::getIcon() * Fetches the biggest possible experience orb value based on a maximum * value. The current algorithm is next prime which is at least twice more * than the previous one. -* +* * @param maxValue * @return */ diff --git a/Minecraft.World/ExperienceOrb.h b/Minecraft.World/ExperienceOrb.h index d506de93..524ae52a 100644 --- a/Minecraft.World/ExperienceOrb.h +++ b/Minecraft.World/ExperienceOrb.h @@ -20,7 +20,7 @@ public: private: int health; int value; - std::shared_ptr followingPlayer; + shared_ptr followingPlayer; int followingTime; void _init(); @@ -49,7 +49,7 @@ public: virtual bool hurt(DamageSource *source, int damage); virtual void addAdditonalSaveData(CompoundTag *entityTag); virtual void readAdditionalSaveData(CompoundTag *tag); - virtual void playerTouch(std::shared_ptr player); + virtual void playerTouch(shared_ptr player); int getValue(); int getIcon(); diff --git a/Minecraft.World/ExplodePacket.h b/Minecraft.World/ExplodePacket.h index 7f2f0e1b..d4d8b3f9 100644 --- a/Minecraft.World/ExplodePacket.h +++ b/Minecraft.World/ExplodePacket.h @@ -11,7 +11,7 @@ public: float r; vector toBlow; // 4J - was an unorderedset but doesn't require any features of that apart from making it match the ctor toBlow type bool m_bKnockbackOnly; - + private: float knockbackX; float knockbackY; @@ -32,6 +32,6 @@ public: float getKnockbackZ(); public: - static std::shared_ptr create() { return std::shared_ptr(new ExplodePacket()); } + static shared_ptr create() { return shared_ptr(new ExplodePacket()); } virtual int getId() { return 60; } }; \ No newline at end of file diff --git a/Minecraft.World/Explosion.cpp b/Minecraft.World/Explosion.cpp index c3facfe7..604813b7 100644 --- a/Minecraft.World/Explosion.cpp +++ b/Minecraft.World/Explosion.cpp @@ -8,7 +8,7 @@ #include "Explosion.h" #include "SoundTypes.h" -Explosion::Explosion(Level *level, std::shared_ptr source, double x, double y, double z, float r) +Explosion::Explosion(Level *level, shared_ptr source, double x, double y, double z, float r) { fire = false; random = new Random(); @@ -97,14 +97,14 @@ void Explosion::explode() // Fix for 360 #123866 - [CRASH] TU13: Code: Compliance: Placing the TNT next to Ender Crystals will crash the title after a certain amount of time. // If we explode something next to an EnderCrystal then it creates a new explosion that overwrites the shared vector in the level // So copy it here instead of directly using the shared one - vector > *levelEntities = level->getEntities(source, AABB::newTemp(x0, y0, z0, x1, y1, z1)); - vector > entities(levelEntities->begin(), levelEntities->end() ); + vector > *levelEntities = level->getEntities(source, AABB::newTemp(x0, y0, z0, x1, y1, z1)); + vector > entities(levelEntities->begin(), levelEntities->end() ); Vec3 *center = Vec3::newTemp(x, y, z); AUTO_VAR(itEnd, entities.end()); for (AUTO_VAR(it, entities.begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //entities->at(i); + shared_ptr e = *it; //entities->at(i); // 4J Stu - If the entity is not in a block that would be blown up, then they should not be damaged // Fix for #46606 - TU5: Content: Gameplay: The player can be damaged and killed by explosions behind obsidian walls @@ -147,9 +147,9 @@ void Explosion::explode() double push = pow; e->xd += xa * push; e->yd += ya * push; - e->zd += za * push; + e->zd += za * push; - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); if (player != NULL) { //app.DebugPrintf("Adding player knockback (%f,%f,%f)\n", xa * pow, ya * pow, za * pow); @@ -255,7 +255,7 @@ Explosion::playerVec3Map *Explosion::getHitPlayers() return &hitPlayers; } -Vec3 *Explosion::getHitPlayerKnockback( std::shared_ptr player ) +Vec3 *Explosion::getHitPlayerKnockback( shared_ptr player ) { AUTO_VAR(it, hitPlayers.find(player)); diff --git a/Minecraft.World/Explosion.h b/Minecraft.World/Explosion.h index f98c9e53..c06960d2 100644 --- a/Minecraft.World/Explosion.h +++ b/Minecraft.World/Explosion.h @@ -19,17 +19,17 @@ private: public: double x, y, z; - std::shared_ptr source; + shared_ptr source; float r; unordered_set toBlow; - + private: - typedef unordered_map, Vec3 * , PlayerKeyHash, PlayerKeyEq> playerVec3Map; + typedef unordered_map, Vec3 * , PlayerKeyHash, PlayerKeyEq> playerVec3Map; playerVec3Map hitPlayers; public: - Explosion(Level *level, std::shared_ptr source, double x, double y, double z, float r); + Explosion(Level *level, shared_ptr source, double x, double y, double z, float r); ~Explosion(); public: @@ -38,5 +38,5 @@ public: public: void finalizeExplosion(bool generateParticles, vector *toBlowDirect = NULL); // 4J - added toBlow parameter playerVec3Map *getHitPlayers(); - Vec3 *getHitPlayerKnockback( std::shared_ptr player ); + Vec3 *getHitPlayerKnockback( shared_ptr player ); }; \ No newline at end of file diff --git a/Minecraft.World/EyeOfEnderSignal.cpp b/Minecraft.World/EyeOfEnderSignal.cpp index 14e19307..39d9f82e 100644 --- a/Minecraft.World/EyeOfEnderSignal.cpp +++ b/Minecraft.World/EyeOfEnderSignal.cpp @@ -167,7 +167,7 @@ void EyeOfEnderSignal::tick() remove(); if (surviveAfterDeath) { - level->addEntity(std::shared_ptr( new ItemEntity(level, x, y, z, std::shared_ptr(new ItemInstance(Item::eyeOfEnder))))); + level->addEntity(shared_ptr( new ItemEntity(level, x, y, z, shared_ptr(new ItemInstance(Item::eyeOfEnder))))); } else { diff --git a/Minecraft.World/FallingTile.cpp b/Minecraft.World/FallingTile.cpp index e7cf8f0e..254631ff 100644 --- a/Minecraft.World/FallingTile.cpp +++ b/Minecraft.World/FallingTile.cpp @@ -19,7 +19,7 @@ void FallingTile::_init() data = 0; time = 0; dropItem = true; - + cancelDrop = false; hurtEntities = false; fallDamageMax = 40; @@ -134,7 +134,7 @@ void FallingTile::tick() } else { - if(dropItem && !cancelDrop) spawnAtLocation( std::shared_ptr(new ItemInstance(tile, 1, Tile::tiles[tile]->getSpawnResourcesAuxValue(data))), 0); + if(dropItem && !cancelDrop) spawnAtLocation( shared_ptr(new ItemInstance(tile, 1, Tile::tiles[tile]->getSpawnResourcesAuxValue(data))), 0); } } } @@ -153,7 +153,7 @@ void FallingTile::causeFallDamage(float distance) int dmg = Mth::ceil(distance - 1); if (dmg > 0) { - vector > *entities = level->getEntities(shared_from_this(), bb); + vector > *entities = level->getEntities(shared_from_this(), bb); DamageSource *source = tile == Tile::anvil_Id ? DamageSource::anvil : DamageSource::fallingBlock; //for (Entity entity : entities) diff --git a/Minecraft.World/FarmTile.cpp b/Minecraft.World/FarmTile.cpp index 72d428bb..ecfaf44b 100644 --- a/Minecraft.World/FarmTile.cpp +++ b/Minecraft.World/FarmTile.cpp @@ -74,14 +74,14 @@ void FarmTile::tick(Level *level, int x, int y, int z, Random *random) } } -void FarmTile::fallOn(Level *level, int x, int y, int z, std::shared_ptr entity, float fallDistance) +void FarmTile::fallOn(Level *level, int x, int y, int z, shared_ptr entity, float fallDistance) { // 4J Stu - Fix for #86148 - Code: Gameplay: Jumping on Farmland does not always result in turning to Dirt Block // We should not be setting tiles on the client based on random values! if (!level->isClientSide && level->random->nextFloat() < (fallDistance - .5f)) { // Fix for #60547 - TU7: Content: Gameplay: Players joining a game can destroy crops even with Trust Players option disabled. - std::shared_ptr player = dynamic_pointer_cast(entity); + shared_ptr player = dynamic_pointer_cast(entity); if(player == NULL || player->isAllowedToMine()) level->setTile(x, y, z, Tile::dirt_Id); } } diff --git a/Minecraft.World/FarmTile.h b/Minecraft.World/FarmTile.h index 3c227c2c..f9b4b031 100644 --- a/Minecraft.World/FarmTile.h +++ b/Minecraft.World/FarmTile.h @@ -22,7 +22,7 @@ public: virtual bool isCubeShaped(); virtual Icon *getTexture(int face, int data); virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual void fallOn(Level *level, int x, int y, int z, std::shared_ptr entity, float fallDistance); + virtual void fallOn(Level *level, int x, int y, int z, shared_ptr entity, float fallDistance); private: virtual bool isUnderCrops(Level *level, int x, int y, int z); virtual bool isNearWater(Level *level, int x, int y, int z); diff --git a/Minecraft.World/FenceGateTile.cpp b/Minecraft.World/FenceGateTile.cpp index 561cdf41..6b0243ed 100644 --- a/Minecraft.World/FenceGateTile.cpp +++ b/Minecraft.World/FenceGateTile.cpp @@ -37,7 +37,7 @@ AABB *FenceGateTile::getAABB(Level *level, int x, int y, int z) } // 4J - Brought forward from 1.2.3 to fix hit box rotation -void FenceGateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void FenceGateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { int data = getDirection(level->getData(x, y, z)); if (data == Direction::NORTH || data == Direction::SOUTH) @@ -75,13 +75,13 @@ int FenceGateTile::getRenderShape() return Tile::SHAPE_FENCE_GATE; } -void FenceGateTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void FenceGateTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3)) % 4; level->setData(x, y, z, dir); } -bool FenceGateTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool FenceGateTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly ) { diff --git a/Minecraft.World/FenceGateTile.h b/Minecraft.World/FenceGateTile.h index 83cc378b..277fcd4d 100644 --- a/Minecraft.World/FenceGateTile.h +++ b/Minecraft.World/FenceGateTile.h @@ -11,15 +11,15 @@ public: Icon *getTexture(int face, int data); virtual bool mayPlace(Level *level, int x, int y, int z); virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param // Brought forward from 1.2.3 + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param // Brought forward from 1.2.3 virtual bool blocksLight(); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); virtual bool isPathfindable(LevelSource *level, int x, int y, int z); virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); virtual int getRenderShape(); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual void neighborChanged(Level *level, int x, int y, int z, int type); static bool isOpen(int data); void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/FenceTile.cpp b/Minecraft.World/FenceTile.cpp index a0c685c6..0d1f9bc4 100644 --- a/Minecraft.World/FenceTile.cpp +++ b/Minecraft.World/FenceTile.cpp @@ -41,7 +41,7 @@ AABB *FenceTile::getAABB(Level *level, int x, int y, int z) return AABB::newTemp(x + west, y, z + north, x + east, y + 1.5f, z + south); } -void FenceTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void FenceTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { bool n = connectsTo(level, x, y, z - 1); bool s = connectsTo(level, x, y, z + 1); diff --git a/Minecraft.World/FenceTile.h b/Minecraft.World/FenceTile.h index a08af338..5b61fca4 100644 --- a/Minecraft.World/FenceTile.h +++ b/Minecraft.World/FenceTile.h @@ -10,7 +10,7 @@ private: public: FenceTile(int id, const wstring &texture, Material *material); virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual bool blocksLight(); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); diff --git a/Minecraft.World/FireChargeItem.cpp b/Minecraft.World/FireChargeItem.cpp index 435c4663..c4e47b0c 100644 --- a/Minecraft.World/FireChargeItem.cpp +++ b/Minecraft.World/FireChargeItem.cpp @@ -13,9 +13,9 @@ FireChargeItem::FireChargeItem(int id) : Item(id) m_dragonFireballIcon = NULL; } -bool FireChargeItem::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool FireChargeItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { - if (level->isClientSide) + if (level->isClientSide) { return true; } @@ -27,7 +27,7 @@ bool FireChargeItem::useOn(std::shared_ptr itemInstance, std::shar if (face == 4) x--; if (face == 5) x++; - if (!player->mayBuild(x, y, z)) + if (!player->mayBuild(x, y, z)) { return false; } @@ -40,13 +40,13 @@ bool FireChargeItem::useOn(std::shared_ptr itemInstance, std::shar int targetType = level->getTile(x, y, z); - if (targetType == 0) + if (targetType == 0) { level->playSound( x + 0.5, y + 0.5, z + 0.5,eSoundType_FIRE_IGNITE, 1, random->nextFloat() * 0.4f + 0.8f); level->setTile(x, y, z, Tile::fire_Id); } - if (!player->abilities.instabuild) + if (!player->abilities.instabuild) { itemInstance->count--; } diff --git a/Minecraft.World/FireChargeItem.h b/Minecraft.World/FireChargeItem.h index 440222b4..c0890a46 100644 --- a/Minecraft.World/FireChargeItem.h +++ b/Minecraft.World/FireChargeItem.h @@ -13,7 +13,7 @@ private: public: FireChargeItem(int id); - virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly); virtual Icon *getIcon(int itemAuxValue); virtual void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/Fireball.cpp b/Minecraft.World/Fireball.cpp index 4f2b53a0..46be68f7 100644 --- a/Minecraft.World/Fireball.cpp +++ b/Minecraft.World/Fireball.cpp @@ -28,7 +28,7 @@ void Fireball::_init() zPower = 0.0; } -Fireball::Fireball(Level *level) : Entity( level ) +Fireball::Fireball(Level *level) : Entity( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called @@ -84,7 +84,7 @@ Fireball::Fireball(Level *level, double x, double y, double z, double xa, double } } -Fireball::Fireball(Level *level, std::shared_ptr mob, double xa, double ya, double za) : Entity ( level ) +Fireball::Fireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Entity ( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called @@ -142,7 +142,7 @@ void Fireball::tick() int minXZ = - (level->dimension->getXZSize() * 16 ) / 2; int maxXZ = (level->dimension->getXZSize() * 16 ) / 2 - 1; - if ((x<=minXZ) || (x>=maxXZ) || (z<=minXZ) || (z>=maxXZ)) + if ((x<=minXZ) || (x>=maxXZ) || (z<=minXZ) || (z>=maxXZ)) { remove(); app.DebugPrintf("Fireball removed - end of world\n"); @@ -163,7 +163,7 @@ void Fireball::tick() if (tile == lastTile) { life++; - if (life == SharedConstants::TICKS_PER_SECOND * 30) + if (life == SharedConstants::TICKS_PER_SECOND * 30) { remove(); app.DebugPrintf("Fireball removed - life is 20*60\n"); @@ -181,7 +181,7 @@ void Fireball::tick() flightTime = 0; } } - else + else { flightTime++; } @@ -197,13 +197,13 @@ void Fireball::tick() { to = Vec3::newTemp(res->pos->x, res->pos->y, res->pos->z); } - std::shared_ptr hitEntity = nullptr; - vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); + shared_ptr hitEntity = nullptr; + vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); double nearest = 0; AUTO_VAR(itEnd, objects->end()); for (AUTO_VAR(it, objects->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //objects->at(i); + shared_ptr e = *it; //objects->at(i); if (!e->isPickable() || (e->is(owner) )) continue; //4J Stu - Never collide with the owner (Enderdragon) // && flightTime < 25)) continue; float rr = 0.3f; @@ -217,7 +217,7 @@ void Fireball::tick() hitEntity = e; nearest = dd; } - delete p; + delete p; } } @@ -259,7 +259,7 @@ void Fireball::tick() float inertia = 0.95f; if (isInWater()) { - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { float s = 1 / 4.0f; level->addParticle(eParticleType_bubble, x - xd * s, y - yd * s, z - zd * s, xd, yd, zd); @@ -374,7 +374,7 @@ bool Fireball::hurt(DamageSource *source, int damage) yPower = yd * 0.1; zPower = zd * 0.1; } - std::shared_ptr mob = dynamic_pointer_cast( source->getEntity() ); + shared_ptr mob = dynamic_pointer_cast( source->getEntity() ); if (mob != NULL) { owner = mob; @@ -384,7 +384,7 @@ bool Fireball::hurt(DamageSource *source, int damage) return false; } -float Fireball::getShadowHeightOffs() +float Fireball::getShadowHeightOffs() { return 0; } diff --git a/Minecraft.World/Fireball.h b/Minecraft.World/Fireball.h index a54f6083..c9471625 100644 --- a/Minecraft.World/Fireball.h +++ b/Minecraft.World/Fireball.h @@ -22,7 +22,7 @@ private: bool inGround; public: - std::shared_ptr owner; + shared_ptr owner; private: int life; @@ -43,7 +43,7 @@ public: virtual bool shouldRenderAtSqrDistance(double distance); Fireball(Level *level, double x, double y, double z, double xa, double ya, double za); - Fireball(Level *level, std::shared_ptr mob, double xa, double ya, double za); + Fireball(Level *level, shared_ptr mob, double xa, double ya, double za); public: virtual void tick(); diff --git a/Minecraft.World/FishingHook.cpp b/Minecraft.World/FishingHook.cpp index d1fd5bb6..efa2dbc6 100644 --- a/Minecraft.World/FishingHook.cpp +++ b/Minecraft.World/FishingHook.cpp @@ -38,7 +38,7 @@ void FishingHook::_init() lyr = 0.0; lxr = 0.0; lxd = 0.0; - lyd = 0.0; + lyd = 0.0; lzd = 0.0; owner = nullptr; life = 0; @@ -52,7 +52,7 @@ FishingHook::FishingHook(Level *level) : Entity( level ) _init(); } -FishingHook::FishingHook(Level *level, double x, double y, double z, std::shared_ptr owner) : Entity( level ) +FishingHook::FishingHook(Level *level, double x, double y, double z, shared_ptr owner) : Entity( level ) { _init(); @@ -63,7 +63,7 @@ FishingHook::FishingHook(Level *level, double x, double y, double z, std::shared setPos(x, y, z); } -FishingHook::FishingHook(Level *level, std::shared_ptr mob) : Entity( level ) +FishingHook::FishingHook(Level *level, shared_ptr mob) : Entity( level ) { _init(); @@ -172,7 +172,7 @@ void FishingHook::tick() if (!level->isClientSide) { - std::shared_ptr selectedItem = owner->getSelectedItem(); + shared_ptr selectedItem = owner->getSelectedItem(); if (owner->removed || !owner->isAlive() || selectedItem == NULL || selectedItem->getItem() != Item::fishingRod || this->distanceToSqr(owner) > 32 * 32) { remove(); @@ -195,7 +195,7 @@ void FishingHook::tick() if (shakeTime > 0) shakeTime--; - if (inGround) + if (inGround) { int tile = level->getTile(xTile, yTile, zTile); if (tile != lastTile) @@ -226,17 +226,17 @@ void FishingHook::tick() from = Vec3::newTemp(x, y, z); to = Vec3::newTemp(x + xd, y + yd, z + zd); - if (res != NULL) + if (res != NULL) { to = Vec3::newTemp(res->pos->x, res->pos->y, res->pos->z); } - std::shared_ptr hitEntity = nullptr; - vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); + shared_ptr hitEntity = nullptr; + vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); double nearest = 0; AUTO_VAR(itEnd, objects->end()); for (AUTO_VAR(it, objects->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; // objects->at(i); + shared_ptr e = *it; // objects->at(i); if (!e->isPickable() || (e == owner && flightTime < 5)) continue; float rr = 0.3f; @@ -262,7 +262,7 @@ void FishingHook::tick() if (res != NULL) { - if (res->entity != NULL) + if (res->entity != NULL) { // 4J Stu Move fix for : fix for #48587 - CRASH: Code: Gameplay: Hitting another player with the fishing bobber crashes the game. [Fishing pole, line] // Incorrect dynamic_pointer_cast used around the shared_from_this() @@ -327,7 +327,7 @@ void FishingHook::tick() if (nibble > 0) { nibble--; - } + } else { int nibbleOdds = 500; @@ -356,7 +356,7 @@ void FishingHook::tick() } - if (nibble > 0) + if (nibble > 0) { yd -= random->nextFloat() * random->nextFloat() * random->nextFloat() * 0.2; } @@ -421,7 +421,7 @@ int FishingHook::retrieve() } else if (nibble > 0) { - std::shared_ptr ie = std::shared_ptr( new ItemEntity(this->Entity::level, x, y, z, std::shared_ptr( new ItemInstance(Item::fish_raw) ) ) ); + shared_ptr ie = shared_ptr( new ItemEntity(this->Entity::level, x, y, z, shared_ptr( new ItemInstance(Item::fish_raw) ) ) ); double xa = owner->x - x; double ya = owner->y - y; double za = owner->z - z; @@ -432,7 +432,7 @@ int FishingHook::retrieve() ie->Entity::yd = ya * speed + sqrt(dist) * 0.08; ie->Entity::zd = za * speed; level->addEntity(ie); - owner->level->addEntity( std::shared_ptr( new ExperienceOrb(owner->level, owner->x, owner->y + 0.5f, owner->z + 0.5f, random->nextInt(3) + 1) ) ); // 4J Stu brought forward from 1.4 + owner->level->addEntity( shared_ptr( new ExperienceOrb(owner->level, owner->x, owner->y + 0.5f, owner->z + 0.5f, random->nextInt(3) + 1) ) ); // 4J Stu brought forward from 1.4 dmg = 1; } if (inGround) dmg = 2; diff --git a/Minecraft.World/FishingHook.h b/Minecraft.World/FishingHook.h index 809cec75..ec91e630 100644 --- a/Minecraft.World/FishingHook.h +++ b/Minecraft.World/FishingHook.h @@ -19,7 +19,7 @@ private: public: int shakeTime; - std::shared_ptr owner; + shared_ptr owner; private: int life; @@ -27,15 +27,15 @@ private: int nibble; public: - std::shared_ptr hookedIn; + shared_ptr hookedIn; private: void _init(); public: FishingHook(Level *level); - FishingHook(Level *level, double x, double y, double z, std::shared_ptr owner); - FishingHook(Level *level, std::shared_ptr mob); + FishingHook(Level *level, double x, double y, double z, shared_ptr owner); + FishingHook(Level *level, shared_ptr mob); protected: virtual void defineSynchedData(); diff --git a/Minecraft.World/FishingRodItem.cpp b/Minecraft.World/FishingRodItem.cpp index 418bc625..858005e0 100644 --- a/Minecraft.World/FishingRodItem.cpp +++ b/Minecraft.World/FishingRodItem.cpp @@ -22,33 +22,33 @@ FishingRodItem::FishingRodItem(int id) : Item(id) emptyIcon = NULL; } -bool FishingRodItem::isHandEquipped() +bool FishingRodItem::isHandEquipped() { return true; } -bool FishingRodItem::isMirroredArt() +bool FishingRodItem::isMirroredArt() { return true; } -std::shared_ptr FishingRodItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr FishingRodItem::use(shared_ptr instance, Level *level, shared_ptr player) { - if (player->fishing != NULL) + if (player->fishing != NULL) { int dmg = player->fishing->retrieve(); instance->hurt(dmg, player); player->swing(); - } - else + } + else { level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) + if (!level->isClientSide) { // 4J Stu - Move the player->fishing out of the ctor as we cannot reference 'this' - std::shared_ptr hook = std::shared_ptr( new FishingHook(level, player) ); + shared_ptr hook = shared_ptr( new FishingHook(level, player) ); player->fishing = hook; - level->addEntity( std::shared_ptr( hook ) ); + level->addEntity( shared_ptr( hook ) ); } player->swing(); } diff --git a/Minecraft.World/FishingRodItem.h b/Minecraft.World/FishingRodItem.h index 718469dc..a6df606d 100644 --- a/Minecraft.World/FishingRodItem.h +++ b/Minecraft.World/FishingRodItem.h @@ -19,7 +19,7 @@ public: virtual bool isHandEquipped(); virtual bool isMirroredArt(); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/FlintAndSteelItem.cpp b/Minecraft.World/FlintAndSteelItem.cpp index a13431a2..5ebdad2b 100644 --- a/Minecraft.World/FlintAndSteelItem.cpp +++ b/Minecraft.World/FlintAndSteelItem.cpp @@ -15,7 +15,7 @@ FlintAndSteelItem::FlintAndSteelItem(int id) : Item( id ) setMaxDamage(64); } -bool FlintAndSteelItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool FlintAndSteelItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed if (face == 0) y--; @@ -24,14 +24,14 @@ bool FlintAndSteelItem::useOn(std::shared_ptr instance, std::share if (face == 3) z++; if (face == 4) x--; if (face == 5) x++; - + if (!player->mayBuild(x, y, z)) return false; int targetType = level->getTile(x, y, z); if(!bTestUseOnOnly) - { - if (targetType == 0) + { + if (targetType == 0) { if( level->getTile(x, y-1, z) == Tile::obsidian_Id ) { diff --git a/Minecraft.World/FlintAndSteelItem.h b/Minecraft.World/FlintAndSteelItem.h index d8ddce65..4456330a 100644 --- a/Minecraft.World/FlintAndSteelItem.h +++ b/Minecraft.World/FlintAndSteelItem.h @@ -10,5 +10,5 @@ class FlintAndSteelItem : public Item public: FlintAndSteelItem(int id); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); }; diff --git a/Minecraft.World/FlowerPotTile.cpp b/Minecraft.World/FlowerPotTile.cpp index 28f5c8e0..b245e56d 100644 --- a/Minecraft.World/FlowerPotTile.cpp +++ b/Minecraft.World/FlowerPotTile.cpp @@ -33,9 +33,9 @@ bool FlowerPotTile::isCubeShaped() return false; } -bool FlowerPotTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +bool FlowerPotTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) { - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); if (item == NULL) return false; if (level->getData(x, y, z) != 0) return false; int type = getTypeFromItem(item); @@ -60,7 +60,7 @@ bool FlowerPotTile::use(Level *level, int x, int y, int z, std::shared_ptr item = getItemFromType(level->getData(x, y, z)); + shared_ptr item = getItemFromType(level->getData(x, y, z)); if (item == NULL) { @@ -74,7 +74,7 @@ int FlowerPotTile::cloneTileId(Level *level, int x, int y, int z) int FlowerPotTile::cloneTileData(Level *level, int x, int y, int z) { - std::shared_ptr item = getItemFromType(level->getData(x, y, z)); + shared_ptr item = getItemFromType(level->getData(x, y, z)); if (item == NULL) { @@ -112,7 +112,7 @@ void FlowerPotTile::spawnResources(Level *level, int x, int y, int z, int data, if (data > 0) { - std::shared_ptr item = getItemFromType(data); + shared_ptr item = getItemFromType(data); if (item != NULL) popResource(level, x, y, z, item); } } @@ -122,38 +122,38 @@ int FlowerPotTile::getResource(int data, Random *random, int playerBonusLevel) return Item::flowerPot_Id; } -std::shared_ptr FlowerPotTile::getItemFromType(int type) +shared_ptr FlowerPotTile::getItemFromType(int type) { switch (type) { case TYPE_FLOWER_RED: - return std::shared_ptr( new ItemInstance(Tile::rose) ); + return shared_ptr( new ItemInstance(Tile::rose) ); case TYPE_FLOWER_YELLOW: - return std::shared_ptr( new ItemInstance(Tile::flower) ); + return shared_ptr( new ItemInstance(Tile::flower) ); case TYPE_CACTUS: - return std::shared_ptr( new ItemInstance(Tile::cactus) ); + return shared_ptr( new ItemInstance(Tile::cactus) ); case TYPE_MUSHROOM_BROWN: - return std::shared_ptr( new ItemInstance(Tile::mushroom1) ); + return shared_ptr( new ItemInstance(Tile::mushroom1) ); case TYPE_MUSHROOM_RED: - return std::shared_ptr( new ItemInstance(Tile::mushroom2) ); + return shared_ptr( new ItemInstance(Tile::mushroom2) ); case TYPE_DEAD_BUSH: - return std::shared_ptr( new ItemInstance(Tile::deadBush) ); + return shared_ptr( new ItemInstance(Tile::deadBush) ); case TYPE_SAPLING_DEFAULT: - return std::shared_ptr( new ItemInstance(Tile::sapling, 1, Sapling::TYPE_DEFAULT) ); + return shared_ptr( new ItemInstance(Tile::sapling, 1, Sapling::TYPE_DEFAULT) ); case TYPE_SAPLING_BIRCH: - return std::shared_ptr( new ItemInstance(Tile::sapling, 1, Sapling::TYPE_BIRCH) ); + return shared_ptr( new ItemInstance(Tile::sapling, 1, Sapling::TYPE_BIRCH) ); case TYPE_SAPLING_EVERGREEN: - return std::shared_ptr( new ItemInstance(Tile::sapling, 1, Sapling::TYPE_EVERGREEN) ); + return shared_ptr( new ItemInstance(Tile::sapling, 1, Sapling::TYPE_EVERGREEN) ); case TYPE_SAPLING_JUNGLE: - return std::shared_ptr( new ItemInstance(Tile::sapling, 1, Sapling::TYPE_JUNGLE) ); + return shared_ptr( new ItemInstance(Tile::sapling, 1, Sapling::TYPE_JUNGLE) ); case TYPE_FERN: - return std::shared_ptr( new ItemInstance(Tile::tallgrass, 1, TallGrass::FERN) ); + return shared_ptr( new ItemInstance(Tile::tallgrass, 1, TallGrass::FERN) ); } return nullptr; } -int FlowerPotTile::getTypeFromItem(std::shared_ptr item) +int FlowerPotTile::getTypeFromItem(shared_ptr item) { int id = item->getItem()->id; diff --git a/Minecraft.World/FlowerPotTile.h b/Minecraft.World/FlowerPotTile.h index 5a615c07..50dc18c4 100644 --- a/Minecraft.World/FlowerPotTile.h +++ b/Minecraft.World/FlowerPotTile.h @@ -23,7 +23,7 @@ public: bool isSolidRender(bool isServerLevel = false); int getRenderShape(); bool isCubeShaped(); - bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); int cloneTileId(Level *level, int x, int y, int z); int cloneTileData(Level *level, int x, int y, int z); bool useOwnCloneData(); @@ -32,6 +32,6 @@ public: using Tile::spawnResources; void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); int getResource(int data, Random *random, int playerBonusLevel); - static std::shared_ptr getItemFromType(int type); - static int getTypeFromItem(std::shared_ptr item); + static shared_ptr getItemFromType(int type); + static int getTypeFromItem(shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/FollowOwnerGoal.cpp b/Minecraft.World/FollowOwnerGoal.cpp index 4014771a..faba2226 100644 --- a/Minecraft.World/FollowOwnerGoal.cpp +++ b/Minecraft.World/FollowOwnerGoal.cpp @@ -24,7 +24,7 @@ FollowOwnerGoal::FollowOwnerGoal(TamableAnimal *tamable, float speed, float star bool FollowOwnerGoal::canUse() { - std::shared_ptr owner = tamable->getOwner(); + shared_ptr owner = tamable->getOwner(); if (owner == NULL) return false; if (tamable->isSitting()) return false; if (tamable->distanceToSqr(owner) < startDistance * startDistance) return false; diff --git a/Minecraft.World/FollowParentGoal.cpp b/Minecraft.World/FollowParentGoal.cpp index 99224d08..3e347d62 100644 --- a/Minecraft.World/FollowParentGoal.cpp +++ b/Minecraft.World/FollowParentGoal.cpp @@ -18,13 +18,13 @@ bool FollowParentGoal::canUse() { if (animal->getAge() >= 0) return false; - vector > *parents = animal->level->getEntitiesOfClass(typeid(*animal), animal->bb->grow(8, 4, 8)); + vector > *parents = animal->level->getEntitiesOfClass(typeid(*animal), animal->bb->grow(8, 4, 8)); - std::shared_ptr closest = nullptr; + shared_ptr closest = nullptr; double closestDistSqr = Double::MAX_VALUE; for(AUTO_VAR(it, parents->begin()); it != parents->end(); ++it) { - std::shared_ptr parent = dynamic_pointer_cast(*it); + shared_ptr parent = dynamic_pointer_cast(*it); if (parent->getAge() < 0) continue; double distSqr = animal->distanceToSqr(parent); if (distSqr > closestDistSqr) continue; diff --git a/Minecraft.World/FoodData.cpp b/Minecraft.World/FoodData.cpp index a3c2d34b..79ef0fc1 100644 --- a/Minecraft.World/FoodData.cpp +++ b/Minecraft.World/FoodData.cpp @@ -29,7 +29,7 @@ void FoodData::eat(FoodItem *item) eat(item->getNutrition(), item->getSaturationModifier()); } -void FoodData::tick(std::shared_ptr player) +void FoodData::tick(shared_ptr player) { int difficulty = player->level->difficulty; diff --git a/Minecraft.World/FoodData.h b/Minecraft.World/FoodData.h index 9d847454..3416a44a 100644 --- a/Minecraft.World/FoodData.h +++ b/Minecraft.World/FoodData.h @@ -19,7 +19,7 @@ public: void eat(int food, float saturationModifier); void eat(FoodItem *item); - void tick(std::shared_ptr player); + void tick(shared_ptr player); void readAdditionalSaveData(CompoundTag *entityTag); void addAdditonalSaveData(CompoundTag *entityTag); int getFoodLevel(); diff --git a/Minecraft.World/FoodItem.cpp b/Minecraft.World/FoodItem.cpp index e617490a..f5304cb9 100644 --- a/Minecraft.World/FoodItem.cpp +++ b/Minecraft.World/FoodItem.cpp @@ -33,7 +33,7 @@ FoodItem::FoodItem(int id, int nutrition, bool isMeat) _init(); } -std::shared_ptr FoodItem::useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr FoodItem::useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player) { instance->count--; player->getFoodData()->eat(this); @@ -45,7 +45,7 @@ std::shared_ptr FoodItem::useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player) +void FoodItem::addEatEffect(shared_ptr instance, Level *level, shared_ptr player) { if (!level->isClientSide && effectId > 0 && level->random->nextFloat() < effectProbability) { @@ -54,17 +54,17 @@ void FoodItem::addEatEffect(std::shared_ptr instance, Level *level } -int FoodItem::getUseDuration(std::shared_ptr itemInstance) +int FoodItem::getUseDuration(shared_ptr itemInstance) { return EAT_DURATION; } -UseAnim FoodItem::getUseAnimation(std::shared_ptr itemInstance) +UseAnim FoodItem::getUseAnimation(shared_ptr itemInstance) { return UseAnim_eat; } -std::shared_ptr FoodItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr FoodItem::use(shared_ptr instance, Level *level, shared_ptr player) { if (player->canEat(canAlwaysEat)) { @@ -73,7 +73,7 @@ std::shared_ptr FoodItem::use(std::shared_ptr instan // 4J : WESTY : Other award ... eating cooked pork chop. // 4J-JEV: This is just for an avatar award on the xbox. -#ifdef _XBOX +#ifdef _XBOX if ( instance->getItem() == Item::porkChop_cooked ) { player->awardStat(GenericStats::eatPorkChop(),GenericStats::param_eatPorkChop()); @@ -114,7 +114,7 @@ FoodItem *FoodItem::setCanAlwaysEat() } // 4J Added -bool FoodItem::canEat(std::shared_ptr player) +bool FoodItem::canEat(shared_ptr player) { return player->canEat(canAlwaysEat); } diff --git a/Minecraft.World/FoodItem.h b/Minecraft.World/FoodItem.h index 2100a3b3..16e6ce3f 100644 --- a/Minecraft.World/FoodItem.h +++ b/Minecraft.World/FoodItem.h @@ -26,16 +26,16 @@ public: FoodItem(int id, int nutrition, float saturationMod, bool isMeat); FoodItem(int id, int nutrition, bool isMeat); - virtual std::shared_ptr useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual shared_ptr useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player); protected: - virtual void addEatEffect(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual void addEatEffect(shared_ptr instance, Level *level, shared_ptr player); public: - virtual int getUseDuration(std::shared_ptr itemInstance); - virtual UseAnim getUseAnimation(std::shared_ptr itemInstance); + virtual int getUseDuration(shared_ptr itemInstance); + virtual UseAnim getUseAnimation(shared_ptr itemInstance); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); int getNutrition(); float getSaturationModifier(); @@ -45,5 +45,5 @@ public: FoodItem *setCanAlwaysEat(); // 4J Added - bool canEat(std::shared_ptr player); + bool canEat(shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/FurnaceMenu.cpp b/Minecraft.World/FurnaceMenu.cpp index 58f3b77d..dca02231 100644 --- a/Minecraft.World/FurnaceMenu.cpp +++ b/Minecraft.World/FurnaceMenu.cpp @@ -8,7 +8,7 @@ #include "FurnaceMenu.h" #include "FurnaceRecipes.h" -FurnaceMenu::FurnaceMenu(std::shared_ptr inventory, std::shared_ptr furnace) : AbstractContainerMenu() +FurnaceMenu::FurnaceMenu(shared_ptr inventory, shared_ptr furnace) : AbstractContainerMenu() { tc = 0; lt = 0; @@ -44,12 +44,12 @@ void FurnaceMenu::addSlotListener(ContainerListener *listener) void FurnaceMenu::broadcastChanges() { AbstractContainerMenu::broadcastChanges(); - + AUTO_VAR(itEnd, containerListeners->end()); for (AUTO_VAR(it, containerListeners->begin()); it != itEnd; it++) { ContainerListener *listener = *it; //containerListeners->at(i); - if (tc != furnace->tickCount) + if (tc != furnace->tickCount) { listener->setContainerData(this, 0, furnace->tickCount); } @@ -57,7 +57,7 @@ void FurnaceMenu::broadcastChanges() { listener->setContainerData(this, 1, furnace->litTime); } - if (ld != furnace->litDuration) + if (ld != furnace->litDuration) { listener->setContainerData(this, 2, furnace->litDuration); } @@ -75,14 +75,14 @@ void FurnaceMenu::setData(int id, int value) if (id == 2) furnace->litDuration = value; } -bool FurnaceMenu::stillValid(std::shared_ptr player) +bool FurnaceMenu::stillValid(shared_ptr player) { return furnace->stillValid(player); } -std::shared_ptr FurnaceMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr FurnaceMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = slots->at(slotIndex); //Slot *IngredientSlot = slots->at(INGREDIENT_SLOT); @@ -90,7 +90,7 @@ std::shared_ptr FurnaceMenu::quickMoveStack(std::shared_ptrhasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if (slotIndex == RESULT_SLOT) @@ -160,11 +160,11 @@ std::shared_ptr FurnaceMenu::quickMoveStack(std::shared_ptr FurnaceMenu::clicked(int slotIndex, int buttonNum, int clickType, std::shared_ptr player) +shared_ptr FurnaceMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) { bool charcoalUsed = furnace->wasCharcoalUsed(); - std::shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); + shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); #ifdef _EXTENDED_ACHIEVEMENTS if ( charcoalUsed && (out!=nullptr) && (buttonNum==0 || buttonNum==1) && clickType==CLICK_PICKUP diff --git a/Minecraft.World/FurnaceMenu.h b/Minecraft.World/FurnaceMenu.h index 576a0fa2..72b264d3 100644 --- a/Minecraft.World/FurnaceMenu.h +++ b/Minecraft.World/FurnaceMenu.h @@ -17,10 +17,10 @@ public: static const int USE_ROW_SLOT_END = FurnaceMenu::USE_ROW_SLOT_START + 9; private: - std::shared_ptr furnace; + shared_ptr furnace; public: - FurnaceMenu(std::shared_ptr inventory, std::shared_ptr furnace); + FurnaceMenu(shared_ptr inventory, shared_ptr furnace); private: int tc; @@ -31,8 +31,8 @@ public: virtual void addSlotListener(ContainerListener *listener); virtual void broadcastChanges(); virtual void setData(int id, int value); - virtual bool stillValid(std::shared_ptr player); - virtual std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); + virtual bool stillValid(shared_ptr player); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); - virtual std::shared_ptr clicked(int slotIndex, int buttonNum, int clickType, std::shared_ptr player); + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); }; diff --git a/Minecraft.World/FurnaceResultSlot.cpp b/Minecraft.World/FurnaceResultSlot.cpp index c7347ebe..d845dada 100644 --- a/Minecraft.World/FurnaceResultSlot.cpp +++ b/Minecraft.World/FurnaceResultSlot.cpp @@ -9,18 +9,18 @@ #include "FurnaceResultSlot.h" -FurnaceResultSlot::FurnaceResultSlot(std::shared_ptr player, std::shared_ptr container, int slot, int x, int y) : Slot( container, slot, x, y ) +FurnaceResultSlot::FurnaceResultSlot(shared_ptr player, shared_ptr container, int slot, int x, int y) : Slot( container, slot, x, y ) { this->player = player; removeCount = 0; } -bool FurnaceResultSlot::mayPlace(std::shared_ptr item) +bool FurnaceResultSlot::mayPlace(shared_ptr item) { return false; } -std::shared_ptr FurnaceResultSlot::remove(int c) +shared_ptr FurnaceResultSlot::remove(int c) { if (hasItem()) { @@ -29,24 +29,24 @@ std::shared_ptr FurnaceResultSlot::remove(int c) return Slot::remove(c); } -void FurnaceResultSlot::onTake(std::shared_ptr player, std::shared_ptr carried) +void FurnaceResultSlot::onTake(shared_ptr player, shared_ptr carried) { checkTakeAchievements(carried); Slot::onTake(player, carried); } -void FurnaceResultSlot::onQuickCraft(std::shared_ptr picked, int count) +void FurnaceResultSlot::onQuickCraft(shared_ptr picked, int count) { removeCount += count; checkTakeAchievements(picked); } -bool FurnaceResultSlot::mayCombine(std::shared_ptr second) +bool FurnaceResultSlot::mayCombine(shared_ptr second) { return false; } -void FurnaceResultSlot::checkTakeAchievements(std::shared_ptr carried) +void FurnaceResultSlot::checkTakeAchievements(shared_ptr carried) { carried->onCraftedBy(player->level, player, removeCount); // spawn xp right on top of the player @@ -73,7 +73,7 @@ void FurnaceResultSlot::checkTakeAchievements(std::shared_ptr carr { int newCount = ExperienceOrb::getExperienceValue(amount); amount -= newCount; - player->level->addEntity(std::shared_ptr( new ExperienceOrb(player->level, player->x, player->y + .5, player->z + .5, newCount) )); + player->level->addEntity(shared_ptr( new ExperienceOrb(player->level, player->x, player->y + .5, player->z + .5, newCount) )); } } diff --git a/Minecraft.World/FurnaceResultSlot.h b/Minecraft.World/FurnaceResultSlot.h index 00967f31..bc770fab 100644 --- a/Minecraft.World/FurnaceResultSlot.h +++ b/Minecraft.World/FurnaceResultSlot.h @@ -5,19 +5,19 @@ class FurnaceResultSlot : public Slot { private: - std::shared_ptr player; + shared_ptr player; int removeCount; public: - FurnaceResultSlot(std::shared_ptr player, std::shared_ptr container, int slot, int x, int y); + FurnaceResultSlot(shared_ptr player, shared_ptr container, int slot, int x, int y); virtual ~FurnaceResultSlot() {} - virtual bool mayPlace(std::shared_ptr item); - virtual std::shared_ptr remove(int c); - virtual void onTake(std::shared_ptr player, std::shared_ptr carried); - virtual bool mayCombine(std::shared_ptr item); // 4J Added + virtual bool mayPlace(shared_ptr item); + virtual shared_ptr remove(int c); + virtual void onTake(shared_ptr player, shared_ptr carried); + virtual bool mayCombine(shared_ptr item); // 4J Added protected: - virtual void onQuickCraft(std::shared_ptr picked, int count); - virtual void checkTakeAchievements(std::shared_ptr carried); + virtual void onQuickCraft(shared_ptr picked, int count); + virtual void checkTakeAchievements(shared_ptr carried); }; \ No newline at end of file diff --git a/Minecraft.World/FurnaceTile.cpp b/Minecraft.World/FurnaceTile.cpp index 23270eee..ea0f84e8 100644 --- a/Minecraft.World/FurnaceTile.cpp +++ b/Minecraft.World/FurnaceTile.cpp @@ -15,7 +15,7 @@ FurnaceTile::FurnaceTile(int id, bool lit) : EntityTile(id, Material::stone) { random = new Random(); this->lit = lit; - + iconTop = NULL; iconFront = NULL; } @@ -104,7 +104,7 @@ bool FurnaceTile::TestUse() return true; } -bool FurnaceTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool FurnaceTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) return false; @@ -112,7 +112,7 @@ bool FurnaceTile::use(Level *level, int x, int y, int z, std::shared_ptr { return true; } - std::shared_ptr furnace = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr furnace = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if (furnace != NULL ) player->openFurnace(furnace); return true; } @@ -120,7 +120,7 @@ bool FurnaceTile::use(Level *level, int x, int y, int z, std::shared_ptr void FurnaceTile::setLit(bool lit, Level *level, int x, int y, int z) { int data = level->getData(x, y, z); - std::shared_ptr te = level->getTileEntity(x, y, z); + shared_ptr te = level->getTileEntity(x, y, z); noDrop = true; if (lit) level->setTile(x, y, z, Tile::furnace_lit_Id); @@ -135,12 +135,12 @@ void FurnaceTile::setLit(bool lit, Level *level, int x, int y, int z) } } -std::shared_ptr FurnaceTile::newTileEntity(Level *level) +shared_ptr FurnaceTile::newTileEntity(Level *level) { - return std::shared_ptr( new FurnaceTileEntity() ); + return shared_ptr( new FurnaceTileEntity() ); } -void FurnaceTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void FurnaceTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3; @@ -154,12 +154,12 @@ void FurnaceTile::onRemove(Level *level, int x, int y, int z, int id, int data) { if (!noDrop) { - std::shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if( container != NULL ) { for (unsigned int i = 0; i < container->getContainerSize(); i++) { - std::shared_ptr item = container->getItem(i); + shared_ptr item = container->getItem(i); if (item != NULL) { float xo = random->nextFloat() * 0.8f + 0.1f; @@ -182,10 +182,10 @@ void FurnaceTile::onRemove(Level *level, int x, int y, int z, int id, int data) printf("Server furnace dropping %d of %d/%d\n", count, item->id, item->getAuxValue() ); } #endif - - std::shared_ptr newItem = std::shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ); + + shared_ptr newItem = shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ); newItem->set4JData( item->get4JData() ); - std::shared_ptr itemEntity = std::shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, newItem) ); + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, newItem) ); float pow = 0.05f; itemEntity->xd = (float) random->nextGaussian() * pow; itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; diff --git a/Minecraft.World/FurnaceTile.h b/Minecraft.World/FurnaceTile.h index 62106150..c192f94d 100644 --- a/Minecraft.World/FurnaceTile.h +++ b/Minecraft.World/FurnaceTile.h @@ -29,11 +29,11 @@ public: void registerIcons(IconRegister *iconRegister); virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param static void setLit(bool lit, Level *level, int x, int y, int z); protected: - virtual std::shared_ptr newTileEntity(Level *level); + virtual shared_ptr newTileEntity(Level *level); public: - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); }; \ No newline at end of file diff --git a/Minecraft.World/FurnaceTileEntity.cpp b/Minecraft.World/FurnaceTileEntity.cpp index a75b7344..0f18528c 100644 --- a/Minecraft.World/FurnaceTileEntity.cpp +++ b/Minecraft.World/FurnaceTileEntity.cpp @@ -39,13 +39,13 @@ unsigned int FurnaceTileEntity::getContainerSize() } -std::shared_ptr FurnaceTileEntity::getItem(unsigned int slot) +shared_ptr FurnaceTileEntity::getItem(unsigned int slot) { return (*items)[slot]; } -std::shared_ptr FurnaceTileEntity::removeItem(unsigned int slot, int count) +shared_ptr FurnaceTileEntity::removeItem(unsigned int slot, int count) { m_charcoalUsed = false; @@ -53,7 +53,7 @@ std::shared_ptr FurnaceTileEntity::removeItem(unsigned int slot, i { if ((*items)[slot]->count <= count) { - std::shared_ptr item = (*items)[slot]; + shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; @@ -61,7 +61,7 @@ std::shared_ptr FurnaceTileEntity::removeItem(unsigned int slot, i } else { - std::shared_ptr i = (*items)[slot]->remove(count); + shared_ptr i = (*items)[slot]->remove(count); if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; // 4J Stu - Fix for duplication glitch if(i->count <= 0) return nullptr; @@ -71,13 +71,13 @@ std::shared_ptr FurnaceTileEntity::removeItem(unsigned int slot, i return nullptr; } -std::shared_ptr FurnaceTileEntity::removeItemNoUpdate(int slot) +shared_ptr FurnaceTileEntity::removeItemNoUpdate(int slot) { m_charcoalUsed = false; if (items->data[slot] != NULL) { - std::shared_ptr item = items->data[slot]; + shared_ptr item = items->data[slot]; items->data[slot] = nullptr; return item; } @@ -85,7 +85,7 @@ std::shared_ptr FurnaceTileEntity::removeItemNoUpdate(int slot) } -void FurnaceTileEntity::setItem(unsigned int slot, std::shared_ptr item) +void FurnaceTileEntity::setItem(unsigned int slot, shared_ptr item) { (*items)[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); @@ -185,7 +185,7 @@ void FurnaceTileEntity::tick() if ((*items)[FUEL_SLOT] != NULL) { // 4J Added: Keep track of whether charcoal was used in production of current stack. - if ( (*items)[FUEL_SLOT]->getItem()->id == Item::coal_Id + if ( (*items)[FUEL_SLOT]->getItem()->id == Item::coal_Id && (*items)[FUEL_SLOT]->getAuxValue() == CoalItem::CHAR_COAL) { m_charcoalUsed = true; @@ -195,7 +195,7 @@ void FurnaceTileEntity::tick() if ((*items)[FUEL_SLOT]->count == 0) { Item *remaining = (*items)[FUEL_SLOT]->getItem()->getCraftingRemainingItem(); - (*items)[FUEL_SLOT] = remaining != NULL ? std::shared_ptr(new ItemInstance(remaining)) : nullptr; + (*items)[FUEL_SLOT] = remaining != NULL ? shared_ptr(new ItemInstance(remaining)) : nullptr; } } } @@ -253,7 +253,7 @@ void FurnaceTileEntity::burn() } -int FurnaceTileEntity::getBurnDuration(std::shared_ptr itemInstance) +int FurnaceTileEntity::getBurnDuration(shared_ptr itemInstance) { if (itemInstance == NULL) return 0; int id = itemInstance->getItem()->id; @@ -304,12 +304,12 @@ int FurnaceTileEntity::getBurnDuration(std::shared_ptr itemInstanc return 0; } -bool FurnaceTileEntity::isFuel(std::shared_ptr item) +bool FurnaceTileEntity::isFuel(shared_ptr item) { return getBurnDuration(item) > 0; } -bool FurnaceTileEntity::stillValid(std::shared_ptr player) +bool FurnaceTileEntity::stillValid(shared_ptr player) { if (level->getTileEntity(x, y, z) != shared_from_this() ) return false; if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; @@ -330,9 +330,9 @@ void FurnaceTileEntity::stopOpen() } // 4J Added -std::shared_ptr FurnaceTileEntity::clone() +shared_ptr FurnaceTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new FurnaceTileEntity() ); + shared_ptr result = shared_ptr( new FurnaceTileEntity() ); TileEntity::clone(result); result->litTime = litTime; diff --git a/Minecraft.World/FurnaceTileEntity.h b/Minecraft.World/FurnaceTileEntity.h index 29267de9..db39452e 100644 --- a/Minecraft.World/FurnaceTileEntity.h +++ b/Minecraft.World/FurnaceTileEntity.h @@ -41,10 +41,10 @@ public: virtual ~FurnaceTileEntity(); virtual unsigned int getContainerSize(); - virtual std::shared_ptr getItem(unsigned int slot); - virtual std::shared_ptr removeItem(unsigned int slot, int count); - virtual std::shared_ptr removeItemNoUpdate(int slot); - virtual void setItem(unsigned int slot, std::shared_ptr item); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); virtual int getName(); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); @@ -60,18 +60,18 @@ private: public: void burn(); - static int getBurnDuration(std::shared_ptr itemInstance); - static bool isFuel(std::shared_ptr item); + static int getBurnDuration(shared_ptr itemInstance); + static bool isFuel(shared_ptr item); public: - virtual bool stillValid(std::shared_ptr player); + virtual bool stillValid(shared_ptr player); virtual void setChanged(); void startOpen(); void stopOpen(); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); // 4J-JEV: Added for 'Renewable Energy' achievement. bool wasCharcoalUsed() { return m_charcoalUsed; } diff --git a/Minecraft.World/FuzzyZoomLayer.cpp b/Minecraft.World/FuzzyZoomLayer.cpp index 1e4c872a..54155ff5 100644 --- a/Minecraft.World/FuzzyZoomLayer.cpp +++ b/Minecraft.World/FuzzyZoomLayer.cpp @@ -2,7 +2,7 @@ #include "System.h" #include "net.minecraft.world.level.newbiome.layer.h" -FuzzyZoomLayer::FuzzyZoomLayer(int64_t seedMixup, std::shared_ptrparent) : Layer(seedMixup) +FuzzyZoomLayer::FuzzyZoomLayer(int64_t seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } @@ -61,12 +61,12 @@ int FuzzyZoomLayer::random(int a, int b, int c, int d) return d; } -std::shared_ptrFuzzyZoomLayer::zoom(int64_t seed, std::shared_ptrsup, int count) +shared_ptrFuzzyZoomLayer::zoom(int64_t seed, shared_ptrsup, int count) { - std::shared_ptr result = sup; + shared_ptr result = sup; for (int i = 0; i < count; i++) { - result = std::shared_ptr(new FuzzyZoomLayer(seed + i, result)); + result = shared_ptr(new FuzzyZoomLayer(seed + i, result)); } return result; } \ No newline at end of file diff --git a/Minecraft.World/FuzzyZoomLayer.h b/Minecraft.World/FuzzyZoomLayer.h index 3c82e6be..19526931 100644 --- a/Minecraft.World/FuzzyZoomLayer.h +++ b/Minecraft.World/FuzzyZoomLayer.h @@ -5,7 +5,7 @@ class FuzzyZoomLayer : public Layer { public: - FuzzyZoomLayer(int64_t seedMixup, std::shared_ptrparent); + FuzzyZoomLayer(int64_t seedMixup, shared_ptrparent); intArray getArea(int xo, int yo, int w, int h); protected: @@ -13,5 +13,5 @@ protected: int random(int a, int b, int c, int d); public: - static std::shared_ptrzoom(int64_t seed, std::shared_ptrsup, int count); + static shared_ptrzoom(int64_t seed, shared_ptrsup, int count); }; \ No newline at end of file diff --git a/Minecraft.World/GameCommandPacket.h b/Minecraft.World/GameCommandPacket.h index deb2659c..1f63e950 100644 --- a/Minecraft.World/GameCommandPacket.h +++ b/Minecraft.World/GameCommandPacket.h @@ -21,6 +21,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new GameCommandPacket()); } + static shared_ptr create() { return shared_ptr(new GameCommandPacket()); } virtual int getId() { return 167; } }; \ No newline at end of file diff --git a/Minecraft.World/GameEventPacket.h b/Minecraft.World/GameEventPacket.h index 8f54a91e..93ea911c 100644 --- a/Minecraft.World/GameEventPacket.h +++ b/Minecraft.World/GameEventPacket.h @@ -40,6 +40,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new GameEventPacket()); } + static shared_ptr create() { return shared_ptr(new GameEventPacket()); } virtual int getId() { return 70; } }; \ No newline at end of file diff --git a/Minecraft.World/GameModeCommand.cpp b/Minecraft.World/GameModeCommand.cpp index 94252881..86d4c5a5 100644 --- a/Minecraft.World/GameModeCommand.cpp +++ b/Minecraft.World/GameModeCommand.cpp @@ -7,7 +7,7 @@ EGameCommand GameModeCommand::getId() return eGameCommand_GameMode; } -void GameModeCommand::execute(std::shared_ptr source, byteArray commandData) +void GameModeCommand::execute(shared_ptr source, byteArray commandData) { //if (args.length > 0) //{ @@ -26,7 +26,7 @@ void GameModeCommand::execute(std::shared_ptr source, byteArray c //} } -GameType *GameModeCommand::getModeForString(std::shared_ptr source, const wstring &name) +GameType *GameModeCommand::getModeForString(shared_ptr source, const wstring &name) { return NULL; //if (name.equalsIgnoreCase(GameType.SURVIVAL.getName()) || name.equalsIgnoreCase("s")) { @@ -40,7 +40,7 @@ GameType *GameModeCommand::getModeForString(std::shared_ptr sourc //} } -std::shared_ptr GameModeCommand::getPlayer(PlayerUID playerId) +shared_ptr GameModeCommand::getPlayer(PlayerUID playerId) { return nullptr; //Player player = MinecraftServer.getInstance().getPlayers().getPlayer(name); diff --git a/Minecraft.World/GameModeCommand.h b/Minecraft.World/GameModeCommand.h index 7c08caab..66401587 100644 --- a/Minecraft.World/GameModeCommand.h +++ b/Minecraft.World/GameModeCommand.h @@ -8,9 +8,9 @@ class GameModeCommand : public Command { public: virtual EGameCommand getId(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); protected: - GameType *getModeForString(std::shared_ptr source, const wstring &name); - std::shared_ptr getPlayer(PlayerUID playerId); + GameType *getModeForString(shared_ptr source, const wstring &name); + shared_ptr getPlayer(PlayerUID playerId); }; \ No newline at end of file diff --git a/Minecraft.World/GenericStats.cpp b/Minecraft.World/GenericStats.cpp index e765fc0c..1fa90151 100644 --- a/Minecraft.World/GenericStats.cpp +++ b/Minecraft.World/GenericStats.cpp @@ -58,51 +58,51 @@ Stat* GenericStats::get_netherLavaCollected() Stat* GenericStats::get_killMob() { - return NULL; + return NULL; } Stat* GenericStats::get_killsZombie() -{ - return NULL; +{ + return NULL; } -Stat* GenericStats::get_killsSkeleton() -{ - return NULL; +Stat* GenericStats::get_killsSkeleton() +{ + return NULL; } -Stat* GenericStats::get_killsCreeper() -{ +Stat* GenericStats::get_killsCreeper() +{ return NULL; } -Stat* GenericStats::get_killsSpider() -{ - return NULL; +Stat* GenericStats::get_killsSpider() +{ + return NULL; } -Stat* GenericStats::get_killsSpiderJockey() -{ +Stat* GenericStats::get_killsSpiderJockey() +{ return NULL; } -Stat* GenericStats::get_killsZombiePigman() -{ - return NULL; +Stat* GenericStats::get_killsZombiePigman() +{ + return NULL; } -Stat* GenericStats::get_killsSlime() -{ +Stat* GenericStats::get_killsSlime() +{ return NULL; } -Stat* GenericStats::get_killsGhast() -{ +Stat* GenericStats::get_killsGhast() +{ return NULL; } -Stat* GenericStats::get_killsNetherZombiePigman() -{ +Stat* GenericStats::get_killsNetherZombiePigman() +{ return NULL; } @@ -173,7 +173,7 @@ Stat* GenericStats::get_itemsUsed(int itemId) Stat *GenericStats::get_itemsBought(int itemId) { - return NULL; + return NULL; } Stat* GenericStats::get_killsEnderdragon() @@ -201,87 +201,87 @@ Stat* GenericStats::get_achievement(eAward achievementId) return NULL; } -Stat* GenericStats::openInventory() +Stat* GenericStats::openInventory() { - return instance->get_achievement( eAward_TakingInventory ); + return instance->get_achievement( eAward_TakingInventory ); } -Stat* GenericStats::mineWood() +Stat* GenericStats::mineWood() { - return instance->get_achievement( eAward_GettingWood ); + return instance->get_achievement( eAward_GettingWood ); } -Stat* GenericStats::buildWorkbench() +Stat* GenericStats::buildWorkbench() { - return instance->get_achievement( eAward_Benchmarking ); + return instance->get_achievement( eAward_Benchmarking ); } -Stat* GenericStats::buildPickaxe() +Stat* GenericStats::buildPickaxe() { - return instance->get_achievement( eAward_TimeToMine); + return instance->get_achievement( eAward_TimeToMine); } -Stat* GenericStats::buildFurnace() +Stat* GenericStats::buildFurnace() { - return instance->get_achievement( eAward_HotTopic ); + return instance->get_achievement( eAward_HotTopic ); } -Stat* GenericStats::acquireIron() +Stat* GenericStats::acquireIron() { - return instance->get_achievement( eAward_AquireHardware ); + return instance->get_achievement( eAward_AquireHardware ); } -Stat* GenericStats::buildHoe() +Stat* GenericStats::buildHoe() { - return instance->get_achievement( eAward_TimeToFarm ); + return instance->get_achievement( eAward_TimeToFarm ); } -Stat* GenericStats::makeBread() +Stat* GenericStats::makeBread() { - return instance->get_achievement( eAward_BakeBread ); + return instance->get_achievement( eAward_BakeBread ); } -Stat* GenericStats::bakeCake() +Stat* GenericStats::bakeCake() { - return instance->get_achievement( eAward_TheLie ); + return instance->get_achievement( eAward_TheLie ); } -Stat* GenericStats::buildBetterPickaxe() +Stat* GenericStats::buildBetterPickaxe() { - return instance->get_achievement( eAward_GettingAnUpgrade ); + return instance->get_achievement( eAward_GettingAnUpgrade ); } -Stat* GenericStats::cookFish() +Stat* GenericStats::cookFish() { return instance->get_achievement( eAward_DeliciousFish ); } -Stat* GenericStats::onARail() +Stat* GenericStats::onARail() { return instance->get_achievement( eAward_OnARail ); } -Stat* GenericStats::buildSword() +Stat* GenericStats::buildSword() { return instance->get_achievement( eAward_TimeToStrike ); } -Stat* GenericStats::killEnemy() +Stat* GenericStats::killEnemy() { return instance->get_achievement( eAward_MonsterHunter ); } -Stat* GenericStats::killCow() +Stat* GenericStats::killCow() { return instance->get_achievement( eAward_CowTipper ); } -Stat* GenericStats::flyPig() +Stat* GenericStats::flyPig() { return instance->get_achievement( eAward_WhenPigsFly ); } -Stat* GenericStats::snipeSkeleton() +Stat* GenericStats::snipeSkeleton() { #ifndef _XBOX return instance->get_achievement( eAward_snipeSkeleton ); @@ -290,7 +290,7 @@ Stat* GenericStats::snipeSkeleton() #endif } -Stat* GenericStats::diamonds() +Stat* GenericStats::diamonds() { #ifndef _XBOX return instance->get_achievement( eAward_diamonds ); @@ -299,7 +299,7 @@ Stat* GenericStats::diamonds() #endif } -Stat* GenericStats::ghast() +Stat* GenericStats::ghast() { #ifndef _XBOX return instance->get_achievement( eAward_ghast ); @@ -308,7 +308,7 @@ Stat* GenericStats::ghast() #endif } -Stat* GenericStats::blazeRod() +Stat* GenericStats::blazeRod() { #ifndef _XBOX return instance->get_achievement( eAward_blazeRod ); @@ -317,7 +317,7 @@ Stat* GenericStats::blazeRod() #endif } -Stat* GenericStats::potion() +Stat* GenericStats::potion() { #ifndef _XBOX return instance->get_achievement( eAward_potion ); @@ -326,7 +326,7 @@ Stat* GenericStats::potion() #endif } -Stat* GenericStats::theEnd() +Stat* GenericStats::theEnd() { #ifndef _XBOX return instance->get_achievement( eAward_theEnd ); @@ -335,7 +335,7 @@ Stat* GenericStats::theEnd() #endif } -Stat* GenericStats::winGame() +Stat* GenericStats::winGame() { #ifndef _XBOX return instance->get_achievement( eAward_winGame ); @@ -344,7 +344,7 @@ Stat* GenericStats::winGame() #endif } -Stat* GenericStats::enchantments() +Stat* GenericStats::enchantments() { #ifndef _XBOX return instance->get_achievement( eAward_enchantments ); @@ -353,7 +353,7 @@ Stat* GenericStats::enchantments() #endif } -Stat* GenericStats::overkill() +Stat* GenericStats::overkill() { #ifdef _EXTENDED_ACHIEVEMENTS return instance->get_achievement( eAward_overkill ); @@ -371,52 +371,52 @@ Stat* GenericStats::bookcase() #endif } -Stat* GenericStats::leaderOfThePack() +Stat* GenericStats::leaderOfThePack() { return instance->get_achievement( eAward_LeaderOfThePack ); } -Stat* GenericStats::MOARTools() +Stat* GenericStats::MOARTools() { return instance->get_achievement( eAward_MOARTools ); } -Stat* GenericStats::dispenseWithThis() +Stat* GenericStats::dispenseWithThis() { return instance->get_achievement( eAward_DispenseWithThis ); } -Stat* GenericStats::InToTheNether() +Stat* GenericStats::InToTheNether() { return instance->get_achievement( eAward_InToTheNether ); } -Stat* GenericStats::socialPost() +Stat* GenericStats::socialPost() { return instance->get_achievement( eAward_socialPost ); } -Stat* GenericStats::eatPorkChop() +Stat* GenericStats::eatPorkChop() { return instance->get_achievement( eAward_eatPorkChop ); } -Stat* GenericStats::play100Days() +Stat* GenericStats::play100Days() { return instance->get_achievement( eAward_play100Days ); } -Stat* GenericStats::arrowKillCreeper() +Stat* GenericStats::arrowKillCreeper() { return instance->get_achievement( eAward_arrowKillCreeper ); } -Stat* GenericStats::mine100Blocks() +Stat* GenericStats::mine100Blocks() { return instance->get_achievement( eAward_mine100Blocks ); } -Stat* GenericStats::kill10Creepers() +Stat* GenericStats::kill10Creepers() { return instance->get_achievement( eAward_kill10Creepers ); } @@ -666,7 +666,7 @@ byteArray GenericStats::getParam_itemsSmelted(int id, int aux, int count) return this->getParam_itemsCrafted(id,aux,count); } -byteArray GenericStats::getParam_itemsUsed(std::shared_ptr plr, std::shared_ptr itm) +byteArray GenericStats::getParam_itemsUsed(shared_ptr plr, shared_ptr itm) { return getParam_noArgs(); // Really just a count on most platforms. } @@ -676,7 +676,7 @@ byteArray GenericStats::getParam_itemsBought(int id, int aux, int count) return getParam_noArgs(); } -byteArray GenericStats::getParam_mobKill(std::shared_ptr plr, std::shared_ptr mob, DamageSource *dmgSrc) +byteArray GenericStats::getParam_mobKill(shared_ptr plr, shared_ptr mob, DamageSource *dmgSrc) { return getParam_noArgs(); // Really just a count on most platforms. } @@ -819,13 +819,13 @@ byteArray GenericStats::param_blocksMined(int id, int data, int count) } byteArray GenericStats::param_itemsCollected(int id, int aux, int count) -{ - return instance->getParam_itemsCollected(id,aux,count); +{ + return instance->getParam_itemsCollected(id,aux,count); } byteArray GenericStats::param_itemsCrafted(int id, int aux, int count) -{ - return instance->getParam_itemsCrafted(id,aux,count); +{ + return instance->getParam_itemsCrafted(id,aux,count); } byteArray GenericStats::param_itemsSmelted(int id, int aux, int count) @@ -833,7 +833,7 @@ byteArray GenericStats::param_itemsSmelted(int id, int aux, int count) return instance->getParam_itemsSmelted(id,aux,count); } -byteArray GenericStats::param_itemsUsed(std::shared_ptr plr, std::shared_ptr itm) +byteArray GenericStats::param_itemsUsed(shared_ptr plr, shared_ptr itm) { if ( (plr != NULL) && (itm != NULL) ) return instance->getParam_itemsUsed(plr, itm); else return instance->getParam_noArgs(); @@ -844,9 +844,9 @@ byteArray GenericStats::param_itemsBought(int id, int aux, int count) return instance->getParam_itemsBought(id,aux,count); } -byteArray GenericStats::param_mobKill(std::shared_ptr plr, std::shared_ptr mob, DamageSource *dmgSrc) +byteArray GenericStats::param_mobKill(shared_ptr plr, shared_ptr mob, DamageSource *dmgSrc) { - if ( (plr != NULL) && (mob != NULL) ) return instance->getParam_mobKill(plr, mob, dmgSrc); + if ( (plr != NULL) && (mob != NULL) ) return instance->getParam_mobKill(plr, mob, dmgSrc); else return instance->getParam_noArgs(); } @@ -891,8 +891,8 @@ byteArray GenericStats::param_enteredBiome(int biomeId) } byteArray GenericStats::param_noArgs() -{ - return instance->getParam_noArgs(); +{ + return instance->getParam_noArgs(); } byteArray GenericStats::param_openInventory() diff --git a/Minecraft.World/GenericStats.h b/Minecraft.World/GenericStats.h index 82c201cf..541424db 100644 --- a/Minecraft.World/GenericStats.h +++ b/Minecraft.World/GenericStats.h @@ -122,15 +122,15 @@ public: static Stat* kill10Creepers(); static Stat* adventuringTime(); // Requires new Stat - static Stat* repopulation(); + static Stat* repopulation(); static Stat* diamondsToYou(); // +Durango static Stat* porkChop(); // Req Stat? static Stat* passingTheTime(); // Req Stat - static Stat* archer(); + static Stat* archer(); static Stat* theHaggler(); // Req Stat static Stat* potPlanter(); // Req Stat static Stat* itsASign(); // Req Stat - static Stat* ironBelly(); + static Stat* ironBelly(); static Stat* haveAShearfulDay(); static Stat* rainbowCollection(); // Requires new Stat static Stat* stayinFrosty(); // +Durango @@ -159,10 +159,10 @@ public: static byteArray param_itemsCollected(int id, int aux, int count); static byteArray param_itemsCrafted(int id, int aux, int count); static byteArray param_itemsSmelted(int id, int aux, int cound); - static byteArray param_itemsUsed(std::shared_ptr plr, std::shared_ptr itm); + static byteArray param_itemsUsed(shared_ptr plr, shared_ptr itm); static byteArray param_itemsBought(int id, int aux, int count); - static byteArray param_mobKill(std::shared_ptr plr, std::shared_ptr mob, DamageSource *dmgSrc); + static byteArray param_mobKill(shared_ptr plr, shared_ptr mob, DamageSource *dmgSrc); static byteArray param_breedEntity(eINSTANCEOF mobType); static byteArray param_tamedEntity(eINSTANCEOF mobType); @@ -249,7 +249,7 @@ public: protected: // ACHIEVEMENTS - VIRTUAL // - + virtual Stat* get_achievement(eAward achievementId); @@ -318,10 +318,10 @@ protected: virtual byteArray getParam_itemsCollected(int id, int aux, int count); virtual byteArray getParam_itemsCrafted(int id, int aux, int count); virtual byteArray getParam_itemsSmelted(int id, int aux, int count); - virtual byteArray getParam_itemsUsed(std::shared_ptr plr, std::shared_ptr itm); + virtual byteArray getParam_itemsUsed(shared_ptr plr, shared_ptr itm); virtual byteArray getParam_itemsBought(int id, int aux, int count); - virtual byteArray getParam_mobKill(std::shared_ptr plr, std::shared_ptr mob, DamageSource *dmgSrc); + virtual byteArray getParam_mobKill(shared_ptr plr, shared_ptr mob, DamageSource *dmgSrc); virtual byteArray getParam_breedEntity(eINSTANCEOF entityId); virtual byteArray getParam_tamedEntity(eINSTANCEOF entityId); diff --git a/Minecraft.World/GetInfoPacket.h b/Minecraft.World/GetInfoPacket.h index cdeb5170..90688f3e 100644 --- a/Minecraft.World/GetInfoPacket.h +++ b/Minecraft.World/GetInfoPacket.h @@ -11,6 +11,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new GetInfoPacket()); } + static shared_ptr create() { return shared_ptr(new GetInfoPacket()); } virtual int getId() { return 254; } }; \ No newline at end of file diff --git a/Minecraft.World/Ghast.cpp b/Minecraft.World/Ghast.cpp index 9e66830d..fcf0b705 100644 --- a/Minecraft.World/Ghast.cpp +++ b/Minecraft.World/Ghast.cpp @@ -49,7 +49,7 @@ bool Ghast::hurt(DamageSource *source, int dmg) { if (source->getMsgId() == ChatPacket::e_ChatDeathFireball) { - std::shared_ptr player = dynamic_pointer_cast( source->getEntity() ); + shared_ptr player = dynamic_pointer_cast( source->getEntity() ); if (player != NULL) { // reflected fireball, kill the ghast @@ -62,7 +62,7 @@ bool Ghast::hurt(DamageSource *source, int dmg) return FlyingMob::hurt(source, dmg); } -void Ghast::defineSynchedData() +void Ghast::defineSynchedData() { FlyingMob::defineSynchedData(); @@ -82,7 +82,7 @@ void Ghast::tick() this->textureIdx = current == 1 ? TN_MOB_GHAST_FIRE : TN_MOB_GHAST; } -void Ghast::serverAiStep() +void Ghast::serverAiStep() { if (!level->isClientSide && level->difficulty == Difficulty::PEACEFUL) remove(); checkDespawn(); @@ -107,7 +107,7 @@ void Ghast::serverAiStep() dd = sqrt(dd); - if (canReach(xTarget, yTarget, zTarget, dd)) + if (canReach(xTarget, yTarget, zTarget, dd)) { this->xd += xd / dd * 0.1; this->yd += yd / dd * 0.1; @@ -125,14 +125,14 @@ void Ghast::serverAiStep() if (target == NULL || retargetTime-- <= 0) { target = level->getNearestAttackablePlayer(shared_from_this(), 100); - if (target != NULL) + if (target != NULL) { retargetTime = 20; } } double maxDist = 64.0f; - if (target != NULL && target->distanceToSqr(shared_from_this()) < maxDist * maxDist) + if (target != NULL && target->distanceToSqr(shared_from_this()) < maxDist * maxDist) { double xdd = target->x - x; double ydd = (target->bb->y0 + target->bbHeight / 2) - (y + bbHeight / 2); @@ -151,7 +151,7 @@ void Ghast::serverAiStep() { // 4J - change brought forward from 1.2.3 level->levelEvent(nullptr, LevelEvent::SOUND_GHAST_FIREBALL, (int) x, (int) y, (int) z, 0); - std::shared_ptr ie = std::shared_ptr( new Fireball(level, dynamic_pointer_cast( shared_from_this() ), xdd, ydd, zdd) ); + shared_ptr ie = shared_ptr( new Fireball(level, dynamic_pointer_cast( shared_from_this() ), xdd, ydd, zdd) ); double d = 4; Vec3 *v = getViewVector(1); ie->x = x + v->x * d; @@ -160,8 +160,8 @@ void Ghast::serverAiStep() level->addEntity(ie); charge = -40; } - } - else + } + else { if (charge > 0) charge--; } @@ -172,7 +172,7 @@ void Ghast::serverAiStep() if (charge > 0) charge--; } - if (!level->isClientSide) + if (!level->isClientSide) { byte old = entityData->getByte(DATA_IS_CHARGING); byte current = (byte) (charge > 10 ? 1 : 0); @@ -183,7 +183,7 @@ void Ghast::serverAiStep() } } -bool Ghast::canReach(double xt, double yt, double zt, double dist) +bool Ghast::canReach(double xt, double yt, double zt, double dist) { double xd = (xTarget - x) / dist; double yd = (yTarget - y) / dist; @@ -214,7 +214,7 @@ int Ghast::getDeathSound() return eSoundType_MOB_GHAST_DEATH; } -int Ghast::getDeathLoot() +int Ghast::getDeathLoot() { return Item::sulphur->id; } diff --git a/Minecraft.World/Ghast.h b/Minecraft.World/Ghast.h index f9738625..cdb44b61 100644 --- a/Minecraft.World/Ghast.h +++ b/Minecraft.World/Ghast.h @@ -20,8 +20,8 @@ public: int floatDuration; double xTarget, yTarget, zTarget; -private: - std::shared_ptr target; +private: + shared_ptr target; int retargetTime; public: diff --git a/Minecraft.World/GiveItemCommand.cpp b/Minecraft.World/GiveItemCommand.cpp index 076c3ade..1d13592f 100644 --- a/Minecraft.World/GiveItemCommand.cpp +++ b/Minecraft.World/GiveItemCommand.cpp @@ -10,7 +10,7 @@ EGameCommand GiveItemCommand::getId() return eGameCommand_Give; } -void GiveItemCommand::execute(std::shared_ptr source, byteArray commandData) +void GiveItemCommand::execute(shared_ptr source, byteArray commandData) { ByteArrayInputStream bais(commandData); DataInputStream dis(&bais); @@ -20,20 +20,20 @@ void GiveItemCommand::execute(std::shared_ptr source, byteArray c int amount = dis.readInt(); int aux = dis.readInt(); wstring tag = dis.readUTF(); - + bais.reset(); - std::shared_ptr player = getPlayer(uid); + shared_ptr player = getPlayer(uid); if(player != NULL && item > 0 && Item::items[item] != NULL) { - std::shared_ptr itemInstance = std::shared_ptr(new ItemInstance(item, amount, aux)); + shared_ptr itemInstance = shared_ptr(new ItemInstance(item, amount, aux)); player->drop(itemInstance); //logAdminAction(source, L"commands.give.success", ChatPacket::e_ChatCustom, Item::items[item]->getName(itemInstance), item, amount, player->getAName()); logAdminAction(source, ChatPacket::e_ChatCustom, L"commands.give.success", item, player->getAName()); } } -std::shared_ptr GiveItemCommand::preparePacket(std::shared_ptr player, int item, int amount, int aux, const wstring &tag) +shared_ptr GiveItemCommand::preparePacket(shared_ptr player, int item, int amount, int aux, const wstring &tag) { if(player == NULL) return nullptr; @@ -46,5 +46,5 @@ std::shared_ptr GiveItemCommand::preparePacket(std::shared_pt dos.writeInt(aux); dos.writeUTF(tag); - return std::shared_ptr( new GameCommandPacket(eGameCommand_Give, baos.toByteArray() )); + return shared_ptr( new GameCommandPacket(eGameCommand_Give, baos.toByteArray() )); } \ No newline at end of file diff --git a/Minecraft.World/GiveItemCommand.h b/Minecraft.World/GiveItemCommand.h index 0881d9f6..532070a6 100644 --- a/Minecraft.World/GiveItemCommand.h +++ b/Minecraft.World/GiveItemCommand.h @@ -8,8 +8,8 @@ class GiveItemCommand : public Command { public: virtual EGameCommand getId(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); public: - static std::shared_ptr preparePacket(std::shared_ptr player, int item, int amount = 1, int aux = 0, const wstring &tag = L""); + static shared_ptr preparePacket(shared_ptr player, int item, int amount = 1, int aux = 0, const wstring &tag = L""); }; \ No newline at end of file diff --git a/Minecraft.World/GoldenAppleItem.cpp b/Minecraft.World/GoldenAppleItem.cpp index 8ed422a7..6c99d201 100644 --- a/Minecraft.World/GoldenAppleItem.cpp +++ b/Minecraft.World/GoldenAppleItem.cpp @@ -10,12 +10,12 @@ GoldenAppleItem::GoldenAppleItem(int id, int nutrition, float saturationMod, boo setStackedByData(true); } -bool GoldenAppleItem::isFoil(std::shared_ptr itemInstance) +bool GoldenAppleItem::isFoil(shared_ptr itemInstance) { return itemInstance->getAuxValue() > 0; } -const Rarity *GoldenAppleItem::getRarity(std::shared_ptr itemInstance) +const Rarity *GoldenAppleItem::getRarity(shared_ptr itemInstance) { if (itemInstance->getAuxValue() == 0) { @@ -24,7 +24,7 @@ const Rarity *GoldenAppleItem::getRarity(std::shared_ptr itemInsta return Rarity::epic; } -void GoldenAppleItem::addEatEffect(std::shared_ptr instance, Level *level, std::shared_ptr player) +void GoldenAppleItem::addEatEffect(shared_ptr instance, Level *level, shared_ptr player) { if (instance->getAuxValue() > 0) { @@ -47,7 +47,7 @@ unsigned int GoldenAppleItem::getUseDescriptionId(int iData /*= -1*/) else return IDS_DESC_ENCHANTED_GOLDENAPPLE; } -unsigned int GoldenAppleItem::getUseDescriptionId(std::shared_ptr instance) +unsigned int GoldenAppleItem::getUseDescriptionId(shared_ptr instance) { return this->getUseDescriptionId(instance->getAuxValue()); } \ No newline at end of file diff --git a/Minecraft.World/GoldenAppleItem.h b/Minecraft.World/GoldenAppleItem.h index 052fcb49..722bb2a9 100644 --- a/Minecraft.World/GoldenAppleItem.h +++ b/Minecraft.World/GoldenAppleItem.h @@ -9,13 +9,13 @@ public: GoldenAppleItem(int id, int nutrition, float saturationMod, bool isMeat); - virtual bool isFoil(std::shared_ptr itemInstance); - virtual const Rarity *getRarity(std::shared_ptr itemInstance); + virtual bool isFoil(shared_ptr itemInstance); + virtual const Rarity *getRarity(shared_ptr itemInstance); // 4J-JEV: Enchanted goldenapples and goldenapples each require their own tooltips. virtual unsigned int getUseDescriptionId(int iData /*= -1*/); - virtual unsigned int getUseDescriptionId(std::shared_ptr instance); + virtual unsigned int getUseDescriptionId(shared_ptr instance); protected: - void addEatEffect(std::shared_ptr instance, Level *level, std::shared_ptr player); + void addEatEffect(shared_ptr instance, Level *level, shared_ptr player); }; diff --git a/Minecraft.World/GrowMushroomIslandLayer.cpp b/Minecraft.World/GrowMushroomIslandLayer.cpp index a5e9f6aa..d204502d 100644 --- a/Minecraft.World/GrowMushroomIslandLayer.cpp +++ b/Minecraft.World/GrowMushroomIslandLayer.cpp @@ -3,7 +3,7 @@ #include "net.minecraft.world.level.biome.h" -GrowMushroomIslandLayer::GrowMushroomIslandLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) +GrowMushroomIslandLayer::GrowMushroomIslandLayer(int64_t seedMixup, shared_ptr parent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/GrowMushroomIslandLayer.h b/Minecraft.World/GrowMushroomIslandLayer.h index 7c340ede..6b0860f7 100644 --- a/Minecraft.World/GrowMushroomIslandLayer.h +++ b/Minecraft.World/GrowMushroomIslandLayer.h @@ -4,6 +4,6 @@ class GrowMushroomIslandLayer : public Layer { public: - GrowMushroomIslandLayer(int64_t seedMixup, std::shared_ptr parent); + GrowMushroomIslandLayer(int64_t seedMixup, shared_ptr parent); virtual intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/HalfSlabTile.cpp b/Minecraft.World/HalfSlabTile.cpp index 9bbcbedb..ed3969c1 100644 --- a/Minecraft.World/HalfSlabTile.cpp +++ b/Minecraft.World/HalfSlabTile.cpp @@ -22,56 +22,56 @@ HalfSlabTile::HalfSlabTile(int id, bool fullSize, Material *material) : Tile(id, { this->fullSize = fullSize; - if (fullSize) + if (fullSize) { solid[id] = true; - } - else + } + else { setShape(0, 0, 0, 1, 0.5f, 1); } setLightBlock(255); } -void HalfSlabTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void HalfSlabTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - if (fullSize) + if (fullSize) { setShape(0, 0, 0, 1, 1, 1); - } - else + } + else { bool upper = (level->getData(x, y, z) & TOP_SLOT_BIT) != 0; - if (upper) + if (upper) { setShape(0, 0.5f, 0, 1, 1, 1); - } - else + } + else { setShape(0, 0, 0, 1, 0.5f, 1); } } } -void HalfSlabTile::updateDefaultShape() +void HalfSlabTile::updateDefaultShape() { - if (fullSize) + if (fullSize) { setShape(0, 0, 0, 1, 1, 1); - } - else + } + else { setShape(0, 0, 0, 1, 0.5f, 1); } } -void HalfSlabTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void HalfSlabTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { updateShape(level, x, y, z); Tile::addAABBs(level, x, y, z, box, boxes, source); } -bool HalfSlabTile::isSolidRender(bool isServerLevel) +bool HalfSlabTile::isSolidRender(bool isServerLevel) { return fullSize; } @@ -87,30 +87,30 @@ int HalfSlabTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, in return itemValue; } -int HalfSlabTile::getResourceCount(Random *random) +int HalfSlabTile::getResourceCount(Random *random) { - if (fullSize) + if (fullSize) { return 2; } return 1; } -int HalfSlabTile::getSpawnResourcesAuxValue(int data) +int HalfSlabTile::getSpawnResourcesAuxValue(int data) { return data & TYPE_MASK; } -bool HalfSlabTile::isCubeShaped() +bool HalfSlabTile::isCubeShaped() { return fullSize; } -bool HalfSlabTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) +bool HalfSlabTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { if (fullSize) return Tile::shouldRenderFace(level, x, y, z, face); - if (face != Facing::UP && face != Facing::DOWN && !Tile::shouldRenderFace(level, x, y, z, face)) + if (face != Facing::UP && face != Facing::DOWN && !Tile::shouldRenderFace(level, x, y, z, face)) { return false; } @@ -121,13 +121,13 @@ bool HalfSlabTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int oz += Facing::STEP_Z[Facing::OPPOSITE_FACING[face]]; boolean isUpper = (level->getData(ox, oy, oz) & TOP_SLOT_BIT) != 0; - if (isUpper) + if (isUpper) { if (face == Facing::DOWN) return true; if (face == Facing::UP && Tile::shouldRenderFace(level, x, y, z, face)) return true; return !(isHalfSlab(level->getTile(x, y, z)) && (level->getData(x, y, z) & TOP_SLOT_BIT) != 0); - } - else + } + else { if (face == Facing::UP) return true; if (face == Facing::DOWN && Tile::shouldRenderFace(level, x, y, z, face)) return true; @@ -135,7 +135,7 @@ bool HalfSlabTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int } } -bool HalfSlabTile::isHalfSlab(int tileId) +bool HalfSlabTile::isHalfSlab(int tileId) { return tileId == Tile::stoneSlabHalf_Id || tileId == Tile::woodSlabHalf_Id; } diff --git a/Minecraft.World/HalfSlabTile.h b/Minecraft.World/HalfSlabTile.h index 4d1e8ecd..183a4add 100644 --- a/Minecraft.World/HalfSlabTile.h +++ b/Minecraft.World/HalfSlabTile.h @@ -3,7 +3,7 @@ #include "Tile.h" -class HalfSlabTile : public Tile +class HalfSlabTile : public Tile { @@ -16,9 +16,9 @@ protected: public: HalfSlabTile(int id, bool fullSize, Material *material); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual void updateDefaultShape(); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual bool isSolidRender(bool isServerLevel); virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); virtual int getResourceCount(Random *random); diff --git a/Minecraft.World/HangingEntity.cpp b/Minecraft.World/HangingEntity.cpp index fcf80e07..6256a381 100644 --- a/Minecraft.World/HangingEntity.cpp +++ b/Minecraft.World/HangingEntity.cpp @@ -10,7 +10,7 @@ void HangingEntity::_init(Level *level) -{ +{ checkInterval = 0; dir = 0; xTile = yTile = zTile = 0; @@ -35,7 +35,7 @@ HangingEntity::HangingEntity(Level *level, int xTile, int yTile, int zTile, int this->zTile = zTile; } -void HangingEntity::setDir(int dir) +void HangingEntity::setDir(int dir) { this->dir = dir; this->yRotO = this->yRot = (float)(dir * 90); @@ -44,12 +44,12 @@ void HangingEntity::setDir(int dir) float h = (float)getHeight(); float d = (float)getWidth(); - if (dir == Direction::NORTH || dir == Direction::SOUTH) + if (dir == Direction::NORTH || dir == Direction::SOUTH) { d = 0.5f; yRot = yRotO = (float)(Direction::DIRECTION_OPPOSITE[dir] * 90); - } - else + } + else { w = 0.5f; } @@ -89,19 +89,19 @@ void HangingEntity::setDir(int dir) bb->set(min(x0,x1), min(y0,y1), min(z0,z1), max(x0,x1), max(y0,y1), max(z0,z1)); } -float HangingEntity::offs(int w) +float HangingEntity::offs(int w) { if (w == 32) return 0.5f; if (w == 64) return 0.5f; return 0.0f; } -void HangingEntity::tick() +void HangingEntity::tick() { - if (checkInterval++ == 20 * 5 && !level->isClientSide)//isClientSide) + if (checkInterval++ == 20 * 5 && !level->isClientSide)//isClientSide) { checkInterval = 0; - if (!removed && !survives()) + if (!removed && !survives()) { remove(); dropItem(); @@ -109,13 +109,13 @@ void HangingEntity::tick() } } -bool HangingEntity::survives() +bool HangingEntity::survives() { - if (level->getCubes(shared_from_this(), bb)->size()!=0)//isEmpty()) + if (level->getCubes(shared_from_this(), bb)->size()!=0)//isEmpty()) { return false; - } - else + } + else { int ws = max(1, getWidth() / 16); int hs = max(1, getHeight() / 16); @@ -131,31 +131,31 @@ bool HangingEntity::survives() for (int ss = 0; ss < ws; ss++) { - for (int yy = 0; yy < hs; yy++) + for (int yy = 0; yy < hs; yy++) { Material *m; - if (dir == Direction::NORTH || dir == Direction::SOUTH) + if (dir == Direction::NORTH || dir == Direction::SOUTH) { m = level->getMaterial(xt + ss, yt + yy, zTile); - } - else + } + else { m = level->getMaterial(xTile, yt + yy, zt + ss); } - if (!m->isSolid()) + if (!m->isSolid()) { return false; } } - vector > *entities = level->getEntities(shared_from_this(), bb); + vector > *entities = level->getEntities(shared_from_this(), bb); if (entities != NULL && entities->size() > 0) { AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - std::shared_ptr e = (*it); + shared_ptr e = (*it); if(dynamic_pointer_cast(e) != NULL) { return false; @@ -167,12 +167,12 @@ bool HangingEntity::survives() return true; } -bool HangingEntity::isPickable() +bool HangingEntity::isPickable() { return true; } -bool HangingEntity::skipAttackInteraction(std::shared_ptr source) +bool HangingEntity::skipAttackInteraction(shared_ptr source) { if(source->GetType()==eTYPE_PLAYER) { @@ -181,13 +181,13 @@ bool HangingEntity::skipAttackInteraction(std::shared_ptr source) return false; } -bool HangingEntity::hurt(DamageSource *source, int damage) +bool HangingEntity::hurt(DamageSource *source, int damage) { - if (!removed && !level->isClientSide) + if (!removed && !level->isClientSide) { if (dynamic_cast(source) != NULL) { - std::shared_ptr sourceEntity = source->getDirectEntity(); + shared_ptr sourceEntity = source->getDirectEntity(); if (dynamic_pointer_cast(sourceEntity) != NULL && !dynamic_pointer_cast(sourceEntity)->isAllowedToHurtEntity(shared_from_this()) ) { @@ -198,14 +198,14 @@ bool HangingEntity::hurt(DamageSource *source, int damage) remove(); markHurt(); - std::shared_ptr player = nullptr; - std::shared_ptr e = source->getEntity(); + shared_ptr player = nullptr; + shared_ptr e = source->getEntity(); if (e!=NULL && ((e->GetType() & eTYPE_PLAYER)!=0) ) // check if it's serverplayer or player { player = dynamic_pointer_cast( e ); } - if (player != NULL && player->abilities.instabuild) + if (player != NULL && player->abilities.instabuild) { return true; } @@ -216,25 +216,25 @@ bool HangingEntity::hurt(DamageSource *source, int damage) } // 4J - added noEntityCubes parameter -void HangingEntity::move(double xa, double ya, double za, bool noEntityCubes) +void HangingEntity::move(double xa, double ya, double za, bool noEntityCubes) { - if (!level->isClientSide && !removed && (xa * xa + ya * ya + za * za) > 0) + if (!level->isClientSide && !removed && (xa * xa + ya * ya + za * za) > 0) { remove(); dropItem(); } } -void HangingEntity::push(double xa, double ya, double za) +void HangingEntity::push(double xa, double ya, double za) { - if (!level->isClientSide && !removed && (xa * xa + ya * ya + za * za) > 0) + if (!level->isClientSide && !removed && (xa * xa + ya * ya + za * za) > 0) { remove(); dropItem(); } } -void HangingEntity::addAdditonalSaveData(CompoundTag *tag) +void HangingEntity::addAdditonalSaveData(CompoundTag *tag) { tag->putByte(L"Direction", (byte) dir); tag->putInt(L"TileX", xTile); @@ -242,7 +242,7 @@ void HangingEntity::addAdditonalSaveData(CompoundTag *tag) tag->putInt(L"TileZ", zTile); // Back compat - switch (dir) + switch (dir) { case Direction::NORTH: tag->putByte(L"Dir", (byte) 0); @@ -259,15 +259,15 @@ void HangingEntity::addAdditonalSaveData(CompoundTag *tag) } } -void HangingEntity::readAdditionalSaveData(CompoundTag *tag) +void HangingEntity::readAdditionalSaveData(CompoundTag *tag) { - if (tag->contains(L"Direction")) + if (tag->contains(L"Direction")) { dir = tag->getByte(L"Direction"); - } - else + } + else { - switch (tag->getByte(L"Dir")) + switch (tag->getByte(L"Dir")) { case 0: dir = Direction::NORTH; diff --git a/Minecraft.World/HangingEntity.h b/Minecraft.World/HangingEntity.h index 0736728b..b87915e4 100644 --- a/Minecraft.World/HangingEntity.h +++ b/Minecraft.World/HangingEntity.h @@ -15,7 +15,7 @@ private: int checkInterval; //eINSTANCEOF eType; -protected: +protected: virtual void defineSynchedData() {}; public: @@ -29,7 +29,7 @@ public: virtual void tick(); virtual bool isPickable(); - virtual bool skipAttackInteraction(std::shared_ptr source); + virtual bool skipAttackInteraction(shared_ptr source); virtual bool hurt(DamageSource *source, int damage); virtual void move(double xa, double ya, double za, bool noEntityCubes=false); // 4J - added noEntityCubes parameter virtual void push(double xa, double ya, double za); diff --git a/Minecraft.World/HangingEntityItem.cpp b/Minecraft.World/HangingEntityItem.cpp index 2e299b73..505dce4d 100644 --- a/Minecraft.World/HangingEntityItem.cpp +++ b/Minecraft.World/HangingEntityItem.cpp @@ -19,7 +19,7 @@ HangingEntityItem::HangingEntityItem(int id, eINSTANCEOF eClassType) : Item(id) // setItemCategory(CreativeModeTab.TAB_DECORATIONS); } -bool HangingEntityItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int xt, int yt, int zt, int face, float clickX, float clickY, float clickZ, bool bTestOnly) +bool HangingEntityItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int xt, int yt, int zt, int face, float clickX, float clickY, float clickZ, bool bTestOnly) { if (face == Facing::DOWN) return false; if (face == Facing::UP) return false; @@ -33,14 +33,14 @@ bool HangingEntityItem::useOn(std::shared_ptr instance, std::share int dir = Direction::FACING_DIRECTION[face]; - std::shared_ptr entity = createEntity(level, xt, yt, zt, dir); + shared_ptr entity = createEntity(level, xt, yt, zt, dir); //if (!player->mayUseItemAt(xt, yt, zt, face, instance)) return false; if (!player->mayBuild(xt, yt, zt)) return false; - if (entity != NULL && entity->survives()) + if (entity != NULL && entity->survives()) { - if (!level->isClientSide) + if (!level->isClientSide) { if(level->addEntity(entity)==TRUE) { @@ -65,22 +65,22 @@ bool HangingEntityItem::useOn(std::shared_ptr instance, std::share } -std::shared_ptr HangingEntityItem::createEntity(Level *level, int x, int y, int z, int dir) +shared_ptr HangingEntityItem::createEntity(Level *level, int x, int y, int z, int dir) { - if (eType == eTYPE_PAINTING) + if (eType == eTYPE_PAINTING) { - std::shared_ptr painting = std::shared_ptr(new Painting(level, x, y, z, dir)); + shared_ptr painting = shared_ptr(new Painting(level, x, y, z, dir)); painting->PaintingPostConstructor(dir); - + return dynamic_pointer_cast (painting); - } - else if (eType == eTYPE_ITEM_FRAME) + } + else if (eType == eTYPE_ITEM_FRAME) { - std::shared_ptr itemFrame = std::shared_ptr(new ItemFrame(level, x, y, z, dir)); + shared_ptr itemFrame = shared_ptr(new ItemFrame(level, x, y, z, dir)); return dynamic_pointer_cast (itemFrame); - } - else + } + else { return nullptr; } diff --git a/Minecraft.World/HangingEntityItem.h b/Minecraft.World/HangingEntityItem.h index 52983a95..51bd8b23 100644 --- a/Minecraft.World/HangingEntityItem.h +++ b/Minecraft.World/HangingEntityItem.h @@ -4,7 +4,7 @@ class HangingEntity; -class HangingEntityItem : public Item +class HangingEntityItem : public Item { private: //final Class clazz; @@ -13,9 +13,9 @@ private: public: HangingEntityItem(int id, eINSTANCEOF eClassType); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int xt, int yt, int zt, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly);//, float clickX, float clickY, float clickZ); - + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int xt, int yt, int zt, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly);//, float clickX, float clickY, float clickZ); + private: - std::shared_ptr createEntity(Level *level, int x, int y, int z, int dir) ; + shared_ptr createEntity(Level *level, int x, int y, int z, int dir) ; }; diff --git a/Minecraft.World/HashExtension.h b/Minecraft.World/HashExtension.h index 85eec19a..7ec9a909 100644 --- a/Minecraft.World/HashExtension.h +++ b/Minecraft.World/HashExtension.h @@ -7,10 +7,10 @@ namespace std { template - class hash< std::shared_ptr > + class hash< shared_ptr > { public: - size_t operator()(const std::shared_ptr& key) const + size_t operator()(const shared_ptr& key) const { return (size_t)key.get(); } diff --git a/Minecraft.World/HatchetItem.cpp b/Minecraft.World/HatchetItem.cpp index e0123bf9..16bf89bf 100644 --- a/Minecraft.World/HatchetItem.cpp +++ b/Minecraft.World/HatchetItem.cpp @@ -23,7 +23,7 @@ HatchetItem::HatchetItem(int id, const Tier *tier) : DiggerItem (id, 3, tier, di } // 4J - brought forward from 1.2.3 -float HatchetItem::getDestroySpeed(std::shared_ptr itemInstance, Tile *tile) +float HatchetItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { if (tile != NULL && tile->material == Material::wood) { diff --git a/Minecraft.World/HatchetItem.h b/Minecraft.World/HatchetItem.h index 2959e38b..afb6dfc0 100644 --- a/Minecraft.World/HatchetItem.h +++ b/Minecraft.World/HatchetItem.h @@ -11,5 +11,5 @@ private: public: static void staticCtor(); HatchetItem(int id, const Tier *tier); - virtual float getDestroySpeed(std::shared_ptr itemInstance, Tile *tile); // 4J - brought forward from 1.2.3 + virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); // 4J - brought forward from 1.2.3 }; diff --git a/Minecraft.World/HeavyTile.cpp b/Minecraft.World/HeavyTile.cpp index 23614a42..18460f2f 100644 --- a/Minecraft.World/HeavyTile.cpp +++ b/Minecraft.World/HeavyTile.cpp @@ -59,14 +59,14 @@ void HeavyTile::checkSlide(Level *level, int x, int y, int z) return; } - std::shared_ptr e = std::shared_ptr( new FallingTile(level, x + 0.5f, y + 0.5f, z + 0.5f, id, level->getData(x, y, z)) ); + shared_ptr e = shared_ptr( new FallingTile(level, x + 0.5f, y + 0.5f, z + 0.5f, id, level->getData(x, y, z)) ); falling(e); level->addEntity(e); } } } -void HeavyTile::falling(std::shared_ptr entity) +void HeavyTile::falling(shared_ptr entity) { } diff --git a/Minecraft.World/HeavyTile.h b/Minecraft.World/HeavyTile.h index 739d3ea0..a9186eae 100644 --- a/Minecraft.World/HeavyTile.h +++ b/Minecraft.World/HeavyTile.h @@ -18,7 +18,7 @@ public: private: void checkSlide(Level *level, int x, int y, int z); protected: - virtual void falling(std::shared_ptr entity); + virtual void falling(shared_ptr entity); public: virtual int getTickDelay(); static bool isFree(Level *level, int x, int y, int z); diff --git a/Minecraft.World/HellSandTile.cpp b/Minecraft.World/HellSandTile.cpp index 71faa279..dbaa6012 100644 --- a/Minecraft.World/HellSandTile.cpp +++ b/Minecraft.World/HellSandTile.cpp @@ -14,7 +14,7 @@ AABB *HellSandTile::getAABB(Level *level, int x, int y, int z) return AABB::newTemp(x, y, z, x + 1, y + 1 - r, z + 1); } -void HellSandTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void HellSandTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { entity->xd*=0.4; entity->zd*=0.4; diff --git a/Minecraft.World/HellSandTile.h b/Minecraft.World/HellSandTile.h index ef8df044..9d8d004e 100644 --- a/Minecraft.World/HellSandTile.h +++ b/Minecraft.World/HellSandTile.h @@ -7,5 +7,5 @@ class HellSandTile : public Tile public: HellSandTile(int id); virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); }; \ No newline at end of file diff --git a/Minecraft.World/HitResult.cpp b/Minecraft.World/HitResult.cpp index 1406d08c..ffa93541 100644 --- a/Minecraft.World/HitResult.cpp +++ b/Minecraft.World/HitResult.cpp @@ -15,7 +15,7 @@ HitResult::HitResult(int x, int y, int z, int f, Vec3 *pos) this->entity = nullptr; } -HitResult::HitResult(std::shared_ptr entity) +HitResult::HitResult(shared_ptr entity) { this->type = ENTITY; this->entity = entity; @@ -24,7 +24,7 @@ HitResult::HitResult(std::shared_ptr entity) x = y = z = f = 0; } -double HitResult::distanceTo(std::shared_ptr e) +double HitResult::distanceTo(shared_ptr e) { double xd = pos->x - e->x; double yd = pos->y - e->y; diff --git a/Minecraft.World/HitResult.h b/Minecraft.World/HitResult.h index 7721a0ff..efcfa75a 100644 --- a/Minecraft.World/HitResult.h +++ b/Minecraft.World/HitResult.h @@ -12,11 +12,11 @@ public: Type type; int x, y, z, f; Vec3 *pos; - std::shared_ptr entity; + shared_ptr entity; HitResult(int x, int y, int z, int f, Vec3 *pos); - HitResult(std::shared_ptr entity); + HitResult(shared_ptr entity); - double distanceTo(std::shared_ptr e); + double distanceTo(shared_ptr e); }; \ No newline at end of file diff --git a/Minecraft.World/HoeItem.cpp b/Minecraft.World/HoeItem.cpp index 11d09b9e..50dde305 100644 --- a/Minecraft.World/HoeItem.cpp +++ b/Minecraft.World/HoeItem.cpp @@ -12,7 +12,7 @@ HoeItem::HoeItem(int id, const Tier *tier) : Item(id) setMaxDamage(tier->getUses()); } -bool HoeItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool HoeItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { if (!player->mayBuild(x, y, z)) return false; @@ -23,7 +23,7 @@ bool HoeItem::useOn(std::shared_ptr instance, std::shared_ptrgetTile(x, y + 1, z); // 4J-PB - missing parentheses - if (face != 0 && above == 0 && (targetType == Tile::grass_Id || targetType == Tile::dirt_Id)) + if (face != 0 && above == 0 && (targetType == Tile::grass_Id || targetType == Tile::dirt_Id)) { if(!bTestUseOnOnly) { @@ -40,7 +40,7 @@ bool HoeItem::useOn(std::shared_ptr instance, std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); virtual bool isHandEquipped(); const Tier *getTier(); diff --git a/Minecraft.World/HouseFeature.cpp b/Minecraft.World/HouseFeature.cpp index 25c4841d..f8c5d173 100644 --- a/Minecraft.World/HouseFeature.cpp +++ b/Minecraft.World/HouseFeature.cpp @@ -184,7 +184,7 @@ bool HouseFeature::place(Level *level, Random *random, int x, int y, int z) } } - std::shared_ptr(pz) = std::shared_ptr(new PigZombie(level)); + shared_ptr(pz) = shared_ptr(new PigZombie(level)); pz->moveTo(x0 + w / 2.0 + 0.5, y0 + 0.5, z0 + d / 2.0 + 0.5, 0, 0); level->addEntity(pz); diff --git a/Minecraft.World/HurtByTargetGoal.cpp b/Minecraft.World/HurtByTargetGoal.cpp index 5570e37a..a146c47d 100644 --- a/Minecraft.World/HurtByTargetGoal.cpp +++ b/Minecraft.World/HurtByTargetGoal.cpp @@ -22,10 +22,10 @@ void HurtByTargetGoal::start() if (alertSameType) { - vector > *nearby = mob->level->getEntitiesOfClass(typeid(*mob), AABB::newTemp(mob->x, mob->y, mob->z, mob->x + 1, mob->y + 1, mob->z + 1)->grow(within, 4, within)); + vector > *nearby = mob->level->getEntitiesOfClass(typeid(*mob), AABB::newTemp(mob->x, mob->y, mob->z, mob->x + 1, mob->y + 1, mob->z + 1)->grow(within, 4, within)); for(AUTO_VAR(it, nearby->begin()); it != nearby->end(); ++it) { - std::shared_ptr other = dynamic_pointer_cast(*it); + shared_ptr other = dynamic_pointer_cast(*it); if (this->mob->shared_from_this() == other) continue; if (other->getTarget() != NULL) continue; other->setTarget(mob->getLastHurtByMob()); diff --git a/Minecraft.World/HurtByTargetGoal.h b/Minecraft.World/HurtByTargetGoal.h index b731fc39..4c6ee5fe 100644 --- a/Minecraft.World/HurtByTargetGoal.h +++ b/Minecraft.World/HurtByTargetGoal.h @@ -6,7 +6,7 @@ class HurtByTargetGoal : public TargetGoal { private: bool alertSameType; - std::shared_ptr oldHurtByMob; + shared_ptr oldHurtByMob; public: HurtByTargetGoal(Mob *mob, bool alertSameType); diff --git a/Minecraft.World/IceTile.cpp b/Minecraft.World/IceTile.cpp index c0338fd5..6ca9cc80 100644 --- a/Minecraft.World/IceTile.cpp +++ b/Minecraft.World/IceTile.cpp @@ -22,14 +22,14 @@ bool IceTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face return HalfTransparentTile::shouldRenderFace(level, x, y, z, 1 - face); } -void IceTile::playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data) +void IceTile::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { player->awardStat(GenericStats::blocksMined(id), GenericStats::param_blocksMined(id,data,1) ); player->causeFoodExhaustion(FoodConstants::EXHAUSTION_MINE); if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player->inventory)) { - std::shared_ptr item = getSilkTouchItemInstance(data); + shared_ptr item = getSilkTouchItemInstance(data); if (item != NULL) { popResource(level, x, y, z, item); diff --git a/Minecraft.World/IceTile.h b/Minecraft.World/IceTile.h index 3fa9d6d6..b3f1a5e6 100644 --- a/Minecraft.World/IceTile.h +++ b/Minecraft.World/IceTile.h @@ -9,7 +9,7 @@ public: IceTile(int id); virtual int getRenderLayer(); virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - virtual void playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data); + virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); virtual int getResourceCount(Random *random); virtual void tick(Level *level, int x, int y, int z, Random *random); virtual int getPistonPushReaction(); diff --git a/Minecraft.World/IndirectEntityDamageSource.cpp b/Minecraft.World/IndirectEntityDamageSource.cpp index 009af37e..01c54ed6 100644 --- a/Minecraft.World/IndirectEntityDamageSource.cpp +++ b/Minecraft.World/IndirectEntityDamageSource.cpp @@ -4,30 +4,30 @@ #include "net.minecraft.world.damagesource.h" #include "net.minecraft.network.packet.h" -//IndirectEntityDamageSource::IndirectEntityDamageSource(const wstring &msgId, std::shared_ptr entity, std::shared_ptr owner) : EntityDamageSource(msgId, entity) -IndirectEntityDamageSource::IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, std::shared_ptr entity, std::shared_ptr owner) : EntityDamageSource(msgId, entity) +//IndirectEntityDamageSource::IndirectEntityDamageSource(const wstring &msgId, shared_ptr entity, shared_ptr owner) : EntityDamageSource(msgId, entity) +IndirectEntityDamageSource::IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity, shared_ptr owner) : EntityDamageSource(msgId, entity) { this->owner = owner; } // 4J Stu - Brought forward from 1.2.3 to fix #46422 -std::shared_ptr IndirectEntityDamageSource::getDirectEntity() +shared_ptr IndirectEntityDamageSource::getDirectEntity() { return entity; } -std::shared_ptr IndirectEntityDamageSource::getEntity() +shared_ptr IndirectEntityDamageSource::getEntity() { return owner; } -//wstring IndirectEntityDamageSource::getLocalizedDeathMessage(std::shared_ptr player) +//wstring IndirectEntityDamageSource::getLocalizedDeathMessage(shared_ptr player) //{ // return L"death." + msgId + player->name + owner->getAName(); // //return I18n.get("death." + msgId, player.name, owner.getAName()); //} -std::shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(std::shared_ptr player) +shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(shared_ptr player) { wstring additional = L""; int type; @@ -36,7 +36,7 @@ std::shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(st type = owner->GetType(); if(type == eTYPE_SERVERPLAYER) { - std::shared_ptr sourcePlayer = dynamic_pointer_cast(owner); + shared_ptr sourcePlayer = dynamic_pointer_cast(owner); if(sourcePlayer != NULL) additional = sourcePlayer->name; } } @@ -44,5 +44,5 @@ std::shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(st { type = entity->GetType(); } - return std::shared_ptr( new ChatPacket(player->name, m_msgId, type, additional ) ); + return shared_ptr( new ChatPacket(player->name, m_msgId, type, additional ) ); } \ No newline at end of file diff --git a/Minecraft.World/IndirectEntityDamageSource.h b/Minecraft.World/IndirectEntityDamageSource.h index 52848de1..b7aec18c 100644 --- a/Minecraft.World/IndirectEntityDamageSource.h +++ b/Minecraft.World/IndirectEntityDamageSource.h @@ -9,17 +9,17 @@ class Player; class IndirectEntityDamageSource : public EntityDamageSource { private: - std::shared_ptr owner; + shared_ptr owner; public: - //IndirectEntityDamageSource(const wstring &msgId, std::shared_ptr entity, std::shared_ptr owner); - IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, std::shared_ptr entity, std::shared_ptr owner); + //IndirectEntityDamageSource(const wstring &msgId, shared_ptr entity, shared_ptr owner); + IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity, shared_ptr owner); virtual ~IndirectEntityDamageSource() { } - virtual std::shared_ptr getDirectEntity(); // 4J Stu - Brought forward from 1.2.3 to fix #46422 - virtual std::shared_ptr getEntity(); + virtual shared_ptr getDirectEntity(); // 4J Stu - Brought forward from 1.2.3 to fix #46422 + virtual shared_ptr getEntity(); // 4J Stu - Made return a packet - //virtual wstring getLocalizedDeathMessage(std::shared_ptr player); - virtual std::shared_ptr getDeathMessagePacket(std::shared_ptr player); + //virtual wstring getLocalizedDeathMessage(shared_ptr player); + virtual shared_ptr getDeathMessagePacket(shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/InteractPacket.h b/Minecraft.World/InteractPacket.h index 97b40fa0..0141038d 100644 --- a/Minecraft.World/InteractPacket.h +++ b/Minecraft.World/InteractPacket.h @@ -20,6 +20,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new InteractPacket()); } + static shared_ptr create() { return shared_ptr(new InteractPacket()); } virtual int getId() { return 7; } }; \ No newline at end of file diff --git a/Minecraft.World/Inventory.cpp b/Minecraft.World/Inventory.cpp index 7218e14c..8ef3f085 100644 --- a/Minecraft.World/Inventory.cpp +++ b/Minecraft.World/Inventory.cpp @@ -14,7 +14,7 @@ const int Inventory::INVENTORY_SIZE = 4 * 9; const int Inventory::SELECTION_SIZE = 9; // 4J Stu - The Pllayer is managed by shared_ptrs elsewhere, but it owns us so we don't want to also -// keep a std::shared_ptr of it. If we pass it on we should use shared_from_this() though +// keep a shared_ptr of it. If we pass it on we should use shared_from_this() though Inventory::Inventory(Player *player) { items = ItemInstanceArray( INVENTORY_SIZE ); @@ -35,7 +35,7 @@ Inventory::~Inventory() delete [] armor.data; } -std::shared_ptr Inventory::getSelected() +shared_ptr Inventory::getSelected() { // sanity checking to prevent exploits if (selected < SELECTION_SIZE && selected >= 0) @@ -83,11 +83,11 @@ int Inventory::getSlot(int tileId, int data) return -1; } -int Inventory::getSlotWithRemainingSpace(std::shared_ptr item) +int Inventory::getSlotWithRemainingSpace(shared_ptr item) { for (unsigned int i = 0; i < items.length; i++) { - if (items[i] != NULL && items[i]->id == item->id && items[i]->isStackable() + if (items[i] != NULL && items[i]->id == item->id && items[i]->isStackable() && items[i]->count < items[i]->getMaxStackSize() && items[i]->count < getMaxStackSize() && (!items[i]->isStackedByData() || items[i]->getAuxValue() == item->getAuxValue()) && ItemInstance::tagMatches(items[i], item)) @@ -182,12 +182,12 @@ void Inventory::replaceSlot(Item *item, int data) { return; } - items[selected] = std::shared_ptr(new ItemInstance(Item::items[item->id], 1, data)); + items[selected] = shared_ptr(new ItemInstance(Item::items[item->id], 1, data)); } } -int Inventory::addResource(std::shared_ptr itemInstance) +int Inventory::addResource(shared_ptr itemInstance) { int type = itemInstance->id; @@ -200,7 +200,7 @@ int Inventory::addResource(std::shared_ptr itemInstance) if (slot < 0) return count; if (items[slot] == NULL) { - items[slot] = ItemInstance::clone(itemInstance); + items[slot] = ItemInstance::clone(itemInstance); player->handleCollectItem(itemInstance); } return 0; @@ -211,7 +211,7 @@ int Inventory::addResource(std::shared_ptr itemInstance) if (slot < 0) return count; if (items[slot] == NULL) { - items[slot] = std::shared_ptr( new ItemInstance(type, 0, itemInstance->getAuxValue()) ); + items[slot] = shared_ptr( new ItemInstance(type, 0, itemInstance->getAuxValue()) ); // 4J Stu - Brought forward from 1.2 if (itemInstance->hasTag()) { @@ -269,16 +269,16 @@ bool Inventory::removeResource(int type,int iAuxVal) return true; } -void Inventory::removeResources(std::shared_ptr item) +void Inventory::removeResources(shared_ptr item) { - if(item == NULL) return; + if(item == NULL) return; int countToRemove = item->count; for (unsigned int i = 0; i < items.length; i++) { if (items[i] != NULL && items[i]->sameItemWithTags(item)) { - int slotCount = items[i]->count; + int slotCount = items[i]->count; items[i]->count -= countToRemove; if(slotCount < countToRemove) { @@ -293,14 +293,14 @@ void Inventory::removeResources(std::shared_ptr item) } } -std::shared_ptr Inventory::getResourceItem(int type) +shared_ptr Inventory::getResourceItem(int type) { int slot = getSlot(type); if (slot < 0) return nullptr; return getItem( slot ); } -std::shared_ptr Inventory::getResourceItem(int type,int iAuxVal) +shared_ptr Inventory::getResourceItem(int type,int iAuxVal) { int slot = getSlot(type,iAuxVal); if (slot < 0) return nullptr; @@ -317,12 +317,12 @@ bool Inventory::hasResource(int type) void Inventory::swapSlots(int from, int to) { - std::shared_ptr tmp = items[to]; + shared_ptr tmp = items[to]; items[to] = items[from]; items[from] = tmp; } -bool Inventory::add(std::shared_ptr item) +bool Inventory::add(shared_ptr item) { // 4J Stu - Fix for duplication glitch if(item->count <= 0) return true; @@ -359,7 +359,7 @@ bool Inventory::add(std::shared_ptr item) { player->handleCollectItem(item); - player->awardStat( + player->awardStat( GenericStats::itemsCollected(item->id, item->getAuxValue()), GenericStats::param_itemsCollected(item->id, item->getAuxValue(), item->GetCount())); @@ -377,7 +377,7 @@ bool Inventory::add(std::shared_ptr item) return false; } -std::shared_ptr Inventory::removeItem(unsigned int slot, int count) +shared_ptr Inventory::removeItem(unsigned int slot, int count) { ItemInstanceArray pile = items; @@ -391,13 +391,13 @@ std::shared_ptr Inventory::removeItem(unsigned int slot, int count { if (pile[slot]->count <= count) { - std::shared_ptr item = pile[slot]; + shared_ptr item = pile[slot]; pile[slot] = nullptr; return item; } else { - std::shared_ptr i = pile[slot]->remove(count); + shared_ptr i = pile[slot]->remove(count); if (pile[slot]->count == 0) pile[slot] = nullptr; return i; } @@ -405,7 +405,7 @@ std::shared_ptr Inventory::removeItem(unsigned int slot, int count return nullptr; } -std::shared_ptr Inventory::removeItemNoUpdate(int slot) +shared_ptr Inventory::removeItemNoUpdate(int slot) { ItemInstanceArray pile = items; if (slot >= items.length) @@ -416,14 +416,14 @@ std::shared_ptr Inventory::removeItemNoUpdate(int slot) if (pile[slot] != NULL) { - std::shared_ptr item = pile[slot]; + shared_ptr item = pile[slot]; pile[slot] = nullptr; return item; } return nullptr; } -void Inventory::setItem(unsigned int slot, std::shared_ptr item) +void Inventory::setItem(unsigned int slot, shared_ptr item) { #ifdef _DEBUG if(item!=NULL) @@ -447,7 +447,7 @@ void Inventory::setItem(unsigned int slot, std::shared_ptr item) else { items[slot] = item; - } + } player->handleCollectItem(item); /* ItemInstanceArray& pile = items; @@ -512,7 +512,7 @@ void Inventory::load(ListTag *inventoryList) { CompoundTag *tag = inventoryList->get(i); unsigned int slot = tag->getByte(L"Slot") & 0xff; - std::shared_ptr item = std::shared_ptr( ItemInstance::fromTag(tag) ); + shared_ptr item = shared_ptr( ItemInstance::fromTag(tag) ); if (item != NULL) { if (slot >= 0 && slot < items.length) items[slot] = item; @@ -526,7 +526,7 @@ unsigned int Inventory::getContainerSize() return items.length + 4; } -std::shared_ptr Inventory::getItem(unsigned int slot) +shared_ptr Inventory::getItem(unsigned int slot) { // 4J Stu - Changed this a little from the Java so it's less funny if( slot >= items.length ) @@ -559,9 +559,9 @@ int Inventory::getMaxStackSize() return MAX_INVENTORY_STACK_SIZE; } -int Inventory::getAttackDamage(std::shared_ptr entity) +int Inventory::getAttackDamage(shared_ptr entity) { - std::shared_ptr item = getItem(selected); + shared_ptr item = getItem(selected); if (item != NULL) return item->getAttackDamage(entity); return 1; } @@ -570,12 +570,12 @@ bool Inventory::canDestroy(Tile *tile) { if (tile->material->isAlwaysDestroyable()) return true; - std::shared_ptr item = getItem(selected); + shared_ptr item = getItem(selected); if (item != NULL) return item->canDestroySpecial(tile); return false; } -std::shared_ptr Inventory::getArmor(int layer) +shared_ptr Inventory::getArmor(int layer) { return armor[layer]; } @@ -640,7 +640,7 @@ void Inventory::setChanged() changed = true; } -bool Inventory::isSame(std::shared_ptr copy) +bool Inventory::isSame(shared_ptr copy) { for (unsigned int i = 0; i < items.length; i++) { @@ -654,7 +654,7 @@ bool Inventory::isSame(std::shared_ptr copy) } -bool Inventory::isSame(std::shared_ptr a, std::shared_ptr b) +bool Inventory::isSame(shared_ptr a, shared_ptr b) { if (a == NULL && b == NULL) return true; if (a == NULL || b == NULL) return false; @@ -663,9 +663,9 @@ bool Inventory::isSame(std::shared_ptr a, std::shared_ptr Inventory::copy() +shared_ptr Inventory::copy() { - std::shared_ptr copy = std::shared_ptr( new Inventory(NULL) ); + shared_ptr copy = shared_ptr( new Inventory(NULL) ); for (unsigned int i = 0; i < items.length; i++) { copy->items[i] = items[i] != NULL ? items[i]->copy() : nullptr; @@ -677,25 +677,25 @@ std::shared_ptr Inventory::copy() return copy; } -void Inventory::setCarried(std::shared_ptr carried) +void Inventory::setCarried(shared_ptr carried) { this->carried = carried; player->handleCollectItem(carried); } -std::shared_ptr Inventory::getCarried() +shared_ptr Inventory::getCarried() { return carried; } -bool Inventory::stillValid(std::shared_ptr player) +bool Inventory::stillValid(shared_ptr player) { if (this->player->removed) return false; if (player->distanceToSqr(this->player->shared_from_this()) > 8 * 8) return false; return true; } -bool Inventory::contains(std::shared_ptr itemInstance) +bool Inventory::contains(shared_ptr itemInstance) { for (unsigned int i = 0; i < armor.length; i++) { @@ -718,7 +718,7 @@ void Inventory::stopOpen() // TODO Auto-generated method stub } -void Inventory::replaceWith(std::shared_ptr other) +void Inventory::replaceWith(shared_ptr other) { for (int i = 0; i < items.length; i++) { @@ -730,7 +730,7 @@ void Inventory::replaceWith(std::shared_ptr other) } } -int Inventory::countMatches(std::shared_ptr itemInstance) +int Inventory::countMatches(shared_ptr itemInstance) { if(itemInstance == NULL) return 0; int count = 0; diff --git a/Minecraft.World/Inventory.h b/Minecraft.World/Inventory.h index ca4f6e79..9d1aa7e0 100644 --- a/Minecraft.World/Inventory.h +++ b/Minecraft.World/Inventory.h @@ -25,8 +25,8 @@ public: Player *player; // This is owned by shared_ptrs, but we are owned by it private: - std::shared_ptr heldItem; - std::shared_ptr carried; + shared_ptr heldItem; + shared_ptr carried; public: bool changed; @@ -34,7 +34,7 @@ public: Inventory(Player *player); ~Inventory(); - std::shared_ptr getSelected(); + shared_ptr getSelected(); // 4J-PB - Added for the in-game tooltips bool IsHeldItem(); @@ -44,8 +44,8 @@ private: int getSlot(int tileId); int getSlot(int tileId, int data); - int getSlotWithRemainingSpace(std::shared_ptr item); - + int getSlotWithRemainingSpace(shared_ptr item); + public: int getFreeSlot(); @@ -58,7 +58,7 @@ public: void replaceSlot(Item *item, int data); private: - int addResource(std::shared_ptr itemInstance); + int addResource(shared_ptr itemInstance); public: void tick(); @@ -67,22 +67,22 @@ public: // 4J-PB added to get the right resource from the inventory for removal bool removeResource(int type,int iAuxVal); - void removeResources(std::shared_ptr item); // 4J Added for trading - + void removeResources(shared_ptr item); // 4J Added for trading + // 4J-Stu added to the get the item that would be affected by the removeResource functions - std::shared_ptr getResourceItem(int type); - std::shared_ptr getResourceItem(int type,int iAuxVal); + shared_ptr getResourceItem(int type); + shared_ptr getResourceItem(int type,int iAuxVal); bool hasResource(int type); void swapSlots(int from, int to); - bool add(std::shared_ptr item); + bool add(shared_ptr item); - std::shared_ptr removeItem(unsigned int slot, int count); - virtual std::shared_ptr removeItemNoUpdate(int slot); + shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); - void setItem(unsigned int slot, std::shared_ptr item); + void setItem(unsigned int slot, shared_ptr item); float getDestroySpeed(Tile *tile); @@ -92,17 +92,17 @@ public: unsigned int getContainerSize(); - std::shared_ptr getItem(unsigned int slot); + shared_ptr getItem(unsigned int slot); int getName(); int getMaxStackSize(); - int getAttackDamage(std::shared_ptr entity); + int getAttackDamage(shared_ptr entity); bool canDestroy(Tile *tile); - std::shared_ptr getArmor(int layer); + shared_ptr getArmor(int layer); int getArmorValue(); @@ -112,25 +112,25 @@ public: void setChanged(); - bool isSame(std::shared_ptr copy); + bool isSame(shared_ptr copy); private: - bool isSame(std::shared_ptr a, std::shared_ptr b); + bool isSame(shared_ptr a, shared_ptr b); public: - std::shared_ptr copy(); + shared_ptr copy(); - void setCarried(std::shared_ptr carried); + void setCarried(shared_ptr carried); - std::shared_ptr getCarried(); + shared_ptr getCarried(); - bool stillValid(std::shared_ptr player); + bool stillValid(shared_ptr player); - bool contains(std::shared_ptr itemInstance); + bool contains(shared_ptr itemInstance); virtual void startOpen(); virtual void stopOpen(); - void replaceWith(std::shared_ptr other); + void replaceWith(shared_ptr other); - int countMatches(std::shared_ptr itemInstance); // 4J Added + int countMatches(shared_ptr itemInstance); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/InventoryMenu.cpp b/Minecraft.World/InventoryMenu.cpp index 32370af9..979243c1 100644 --- a/Minecraft.World/InventoryMenu.cpp +++ b/Minecraft.World/InventoryMenu.cpp @@ -20,16 +20,16 @@ const int InventoryMenu::INV_SLOT_END = InventoryMenu::INV_SLOT_START + 9 * 3; const int InventoryMenu::USE_ROW_SLOT_START = InventoryMenu::INV_SLOT_END; const int InventoryMenu::USE_ROW_SLOT_END = InventoryMenu::USE_ROW_SLOT_START + 9; -InventoryMenu::InventoryMenu(std::shared_ptr inventory, bool active, Player *player) : AbstractContainerMenu() +InventoryMenu::InventoryMenu(shared_ptr inventory, bool active, Player *player) : AbstractContainerMenu() { owner = player; _init( inventory, active ); } -void InventoryMenu::_init(std::shared_ptr inventory, bool active) +void InventoryMenu::_init(shared_ptr inventory, bool active) { - craftSlots = std::shared_ptr( new CraftingContainer(this, 2, 2) ); - resultSlots = std::shared_ptr( new ResultContainer() ); + craftSlots = shared_ptr( new CraftingContainer(this, 2, 2) ); + resultSlots = shared_ptr( new ResultContainer() ); this->active = active; addSlot(new ResultSlot( inventory->player, craftSlots, resultSlots, 0, 144, 36)); @@ -64,19 +64,19 @@ void InventoryMenu::_init(std::shared_ptr inventory, bool active) slotsChanged(); // 4J removed craftSlots parameter, see comment below } -void InventoryMenu::slotsChanged() // 4J used to take a std::shared_ptr but wasn't using it, so removed to simplify things +void InventoryMenu::slotsChanged() // 4J used to take a shared_ptr but wasn't using it, so removed to simplify things { MemSect(23); resultSlots->setItem(0, Recipes::getInstance()->getItemFor(craftSlots, owner->level) ); MemSect(0); } -void InventoryMenu::removed(std::shared_ptr player) +void InventoryMenu::removed(shared_ptr player) { AbstractContainerMenu::removed(player); for (int i = 0; i < 4; i++) { - std::shared_ptr item = craftSlots->removeItemNoUpdate(i); + shared_ptr item = craftSlots->removeItemNoUpdate(i); if (item != NULL) { player->drop(item); @@ -86,16 +86,16 @@ void InventoryMenu::removed(std::shared_ptr player) resultSlots->setItem(0, nullptr); } -bool InventoryMenu::stillValid(std::shared_ptr player) +bool InventoryMenu::stillValid(shared_ptr player) { return true; } -std::shared_ptr InventoryMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr InventoryMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = slots->at(slotIndex); - + Slot *HelmetSlot = slots->at(ARMOR_SLOT_START); Slot *ChestplateSlot = slots->at(ARMOR_SLOT_START+1); Slot *LeggingsSlot = slots->at(ARMOR_SLOT_START+2); @@ -104,7 +104,7 @@ std::shared_ptr InventoryMenu::quickMoveStack(std::shared_ptrhasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if (slotIndex == RESULT_SLOT) @@ -119,28 +119,28 @@ std::shared_ptr InventoryMenu::quickMoveStack(std::shared_ptr= INV_SLOT_START && slotIndex < INV_SLOT_END) { // 4J-PB - added for quick equip - if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Helmet && (!HelmetSlot->hasItem() ) ) + if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Helmet && (!HelmetSlot->hasItem() ) ) { if(!moveItemStackTo(stack, ARMOR_SLOT_START, ARMOR_SLOT_START+1, false)) { return nullptr; } } - else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Chestplate && (!ChestplateSlot->hasItem() ) ) + else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Chestplate && (!ChestplateSlot->hasItem() ) ) { if(!moveItemStackTo(stack, ARMOR_SLOT_START+1, ARMOR_SLOT_START+2, false)) { return nullptr; } } - else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Leggings && (!LeggingsSlot->hasItem() ) ) + else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Leggings && (!LeggingsSlot->hasItem() ) ) { if(!moveItemStackTo(stack, ARMOR_SLOT_START+2, ARMOR_SLOT_START+3, false)) { return nullptr; } } - else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Boots && (!BootsSlot->hasItem() ) ) + else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Boots && (!BootsSlot->hasItem() ) ) { if(!moveItemStackTo(stack, ARMOR_SLOT_START+3, ARMOR_SLOT_START+4, false)) { @@ -157,28 +157,28 @@ std::shared_ptr InventoryMenu::quickMoveStack(std::shared_ptrid); - if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Helmet && (!HelmetSlot->hasItem() ) ) + if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Helmet && (!HelmetSlot->hasItem() ) ) { if(!moveItemStackTo(stack, ARMOR_SLOT_START, ARMOR_SLOT_START+1, false)) { return nullptr; } } - else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Chestplate && (!ChestplateSlot->hasItem() ) ) + else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Chestplate && (!ChestplateSlot->hasItem() ) ) { if(!moveItemStackTo(stack, ARMOR_SLOT_START+1, ARMOR_SLOT_START+2, false)) { return nullptr; } } - else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Leggings && (!LeggingsSlot->hasItem() ) ) + else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Leggings && (!LeggingsSlot->hasItem() ) ) { if(!moveItemStackTo(stack, ARMOR_SLOT_START+2, ARMOR_SLOT_START+3, false)) { return nullptr; } } - else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Boots && (!BootsSlot->hasItem() ) ) + else if(ArmorRecipes::GetArmorType(stack->id)==ArmorRecipes::eArmorType_Boots && (!BootsSlot->hasItem() ) ) { if(!moveItemStackTo(stack, ARMOR_SLOT_START+3, ARMOR_SLOT_START+4, false)) { @@ -220,15 +220,15 @@ std::shared_ptr InventoryMenu::quickMoveStack(std::shared_ptr item) +bool InventoryMenu::mayCombine(Slot *slot, shared_ptr item) { return slot->mayCombine(item); } // 4J-JEV: Added for achievement 'Iron Man'. -std::shared_ptr InventoryMenu::clicked(int slotIndex, int buttonNum, int clickType, std::shared_ptr player) +shared_ptr InventoryMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) { - std::shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); + shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); #ifdef _EXTENDED_ACHIEVEMENTS static int ironItems[4] = {Item::helmet_iron_Id,Item::chestplate_iron_Id,Item::leggings_iron_Id,Item::boots_iron_Id}; diff --git a/Minecraft.World/InventoryMenu.h b/Minecraft.World/InventoryMenu.h index cd18f95f..b37a4be9 100644 --- a/Minecraft.World/InventoryMenu.h +++ b/Minecraft.World/InventoryMenu.h @@ -23,22 +23,22 @@ public: static const int USE_ROW_SLOT_END; public: - std::shared_ptr craftSlots; - std::shared_ptr resultSlots; + shared_ptr craftSlots; + shared_ptr resultSlots; bool active; - InventoryMenu(std::shared_ptr inventory, bool active, Player *player); + InventoryMenu(shared_ptr inventory, bool active, Player *player); private: - void _init(std::shared_ptr inventory, bool active); + void _init(shared_ptr inventory, bool active); public: - virtual void slotsChanged(); // 4J used to take a std::shared_ptr but wasn't using it, so removed to simplify things - virtual void removed(std::shared_ptr player); - virtual bool stillValid(std::shared_ptr player); - virtual std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); - virtual bool mayCombine(Slot *slot, std::shared_ptr item); + virtual void slotsChanged(); // 4J used to take a shared_ptr but wasn't using it, so removed to simplify things + virtual void removed(shared_ptr player); + virtual bool stillValid(shared_ptr player); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + virtual bool mayCombine(Slot *slot, shared_ptr item); // 4J ADDED, - virtual std::shared_ptr clicked(int slotIndex, int buttonNum, int clickType, std::shared_ptr player); + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); }; diff --git a/Minecraft.World/Item.cpp b/Minecraft.World/Item.cpp index 85a5f1bd..5d723ec5 100644 --- a/Minecraft.World/Item.cpp +++ b/Minecraft.World/Item.cpp @@ -275,12 +275,12 @@ void Item::staticCtor() Item::helmet_iron = (ArmorItem *) ( ( new ArmorItem(50, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_iron) ->setTextureName(L"helmetIron")->setDescriptionId(IDS_ITEM_HELMET_IRON)->setUseDescriptionId(IDS_DESC_HELMET_IRON) ); Item::helmet_diamond = (ArmorItem *) ( ( new ArmorItem(54, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_diamond) ->setTextureName(L"helmetDiamond")->setDescriptionId(IDS_ITEM_HELMET_DIAMOND)->setUseDescriptionId(IDS_DESC_HELMET_DIAMOND) ); Item::helmet_gold = (ArmorItem *) ( ( new ArmorItem(58, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_gold) ->setTextureName(L"helmetGold")->setDescriptionId(IDS_ITEM_HELMET_GOLD)->setUseDescriptionId(IDS_DESC_HELMET_GOLD) ); - + Item::chestplate_cloth = (ArmorItem *) ( ( new ArmorItem(43, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_cloth) ->setTextureName(L"chestplateCloth")->setDescriptionId(IDS_ITEM_CHESTPLATE_CLOTH)->setUseDescriptionId(IDS_DESC_CHESTPLATE_LEATHER) ); Item::chestplate_iron = (ArmorItem *) ( ( new ArmorItem(51, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_iron) ->setTextureName(L"chestplateIron")->setDescriptionId(IDS_ITEM_CHESTPLATE_IRON)->setUseDescriptionId(IDS_DESC_CHESTPLATE_IRON) ); Item::chestplate_diamond = (ArmorItem *) ( ( new ArmorItem(55, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_diamond) ->setTextureName(L"chestplateDiamond")->setDescriptionId(IDS_ITEM_CHESTPLATE_DIAMOND)->setUseDescriptionId(IDS_DESC_CHESTPLATE_DIAMOND) ); Item::chestplate_gold = (ArmorItem *) ( ( new ArmorItem(59, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_gold) ->setTextureName(L"chestplateGold")->setDescriptionId(IDS_ITEM_CHESTPLATE_GOLD)->setUseDescriptionId(IDS_DESC_CHESTPLATE_GOLD) ); - + Item::leggings_cloth = (ArmorItem *) ( ( new ArmorItem(44, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_cloth) ->setTextureName(L"leggingsCloth")->setDescriptionId(IDS_ITEM_LEGGINGS_CLOTH)->setUseDescriptionId(IDS_DESC_LEGGINGS_LEATHER) ); Item::leggings_iron = (ArmorItem *) ( ( new ArmorItem(52, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_iron) ->setTextureName(L"leggingsIron")->setDescriptionId(IDS_ITEM_LEGGINGS_IRON)->setUseDescriptionId(IDS_DESC_LEGGINGS_IRON) ); Item::leggings_diamond = (ArmorItem *) ( ( new ArmorItem(56, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_diamond) ->setTextureName(L"leggingsDiamond")->setDescriptionId(IDS_ITEM_LEGGINGS_DIAMOND)->setUseDescriptionId(IDS_DESC_LEGGINGS_DIAMOND) ); @@ -303,14 +303,14 @@ void Item::staticCtor() // 4J-PB - todo - add materials and base types to the ones below Item::bucket_empty = ( new BucketItem(69, 0) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_water)->setTextureName(L"bucket")->setDescriptionId(IDS_ITEM_BUCKET)->setUseDescriptionId(IDS_DESC_BUCKET)->setMaxStackSize(16); Item::bowl = ( new Item(25) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_wood)->setTextureName(L"bowl")->setDescriptionId(IDS_ITEM_BOWL)->setUseDescriptionId(IDS_DESC_BOWL)->setMaxStackSize(64); - + Item::bucket_water = ( new BucketItem(70, Tile::water_Id) ) ->setTextureName(L"bucketWater")->setDescriptionId(IDS_ITEM_BUCKET_WATER)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_WATER); Item::bucket_lava = ( new BucketItem(71, Tile::lava_Id) ) ->setTextureName(L"bucketLava")->setDescriptionId(IDS_ITEM_BUCKET_LAVA)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_LAVA); Item::milk = ( new MilkBucketItem(79) )->setTextureName(L"milk")->setDescriptionId(IDS_ITEM_BUCKET_MILK)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_MILK); Item::bow = (BowItem *)( new BowItem(5) ) ->setTextureName(L"bow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_bow) ->setDescriptionId(IDS_ITEM_BOW)->setUseDescriptionId(IDS_DESC_BOW); Item::arrow = ( new Item(6) ) ->setTextureName(L"arrow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_arrow) ->setDescriptionId(IDS_ITEM_ARROW)->setUseDescriptionId(IDS_DESC_ARROW); - + Item::compass = ( new CompassItem(89) ) ->setTextureName(L"compass")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_compass) ->setDescriptionId(IDS_ITEM_COMPASS)->setUseDescriptionId(IDS_DESC_COMPASS); Item::clock = ( new ClockItem(91) ) ->setTextureName(L"clock")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_clock) ->setDescriptionId(IDS_ITEM_CLOCK)->setUseDescriptionId(IDS_DESC_CLOCK); Item::map = (MapItem *) ( new MapItem(102) ) ->setTextureName(L"map")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_map) ->setDescriptionId(IDS_ITEM_MAP)->setUseDescriptionId(IDS_DESC_MAP); @@ -341,7 +341,7 @@ void Item::staticCtor() ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit,eMaterial_apple)->setTextureName(L"appleGold")->setDescriptionId(IDS_ITEM_APPLE_GOLD);//->setUseDescriptionId(IDS_DESC_GOLDENAPPLE); Item::sign = ( new SignItem(67) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_wood)->setTextureName(L"sign")->setDescriptionId(IDS_ITEM_SIGN)->setUseDescriptionId(IDS_DESC_SIGN); - + Item::minecart = ( new MinecartItem(72, Minecart::RIDEABLE) ) ->setTextureName(L"minecart")->setDescriptionId(IDS_ITEM_MINECART)->setUseDescriptionId(IDS_DESC_MINECART); @@ -380,7 +380,7 @@ void Item::staticCtor() Item::cookie = ( new FoodItem(101, 2, FoodConstants::FOOD_SATURATION_POOR, false) ) ->setTextureName(L"cookie")->setDescriptionId(IDS_ITEM_COOKIE)->setUseDescriptionId(IDS_DESC_COOKIE); - Item::shears = (ShearsItem *)( new ShearsItem(103) ) ->setTextureName(L"shears")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_shears)->setDescriptionId(IDS_ITEM_SHEARS)->setUseDescriptionId(IDS_DESC_SHEARS); + Item::shears = (ShearsItem *)( new ShearsItem(103) ) ->setTextureName(L"shears")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_shears)->setDescriptionId(IDS_ITEM_SHEARS)->setUseDescriptionId(IDS_DESC_SHEARS); Item::melon = (new FoodItem(104, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setTextureName(L"melon")->setDescriptionId(IDS_ITEM_MELON_SLICE)->setUseDescriptionId(IDS_DESC_MELON_SLICE); @@ -473,7 +473,7 @@ void Item::staticCtor() void Item::staticInit() { Stats::buildItemStats(); -} +} _Tier::Tier(int level, int uses, float speed, int damage, int enchantmentValue) : @@ -605,37 +605,37 @@ Icon *Item::getIcon(int auxValue) return icon; } -Icon *Item::getIcon(std::shared_ptr itemInstance) +Icon *Item::getIcon(shared_ptr itemInstance) { return getIcon(itemInstance->getAuxValue()); } -const bool Item::useOn(std::shared_ptr itemInstance, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly) +const bool Item::useOn(shared_ptr itemInstance, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly) { return false; } -bool Item::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool Item::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { return false; } -float Item::getDestroySpeed(std::shared_ptr itemInstance, Tile *tile) +float Item::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { return 1; } -bool Item::TestUse(Level *level, std::shared_ptr player) +bool Item::TestUse(Level *level, shared_ptr player) { return false; } -std::shared_ptr Item::use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr Item::use(shared_ptr itemInstance, Level *level, shared_ptr player) { return itemInstance; } -std::shared_ptr Item::useTimeDepleted(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr Item::useTimeDepleted(shared_ptr itemInstance, Level *level, shared_ptr player) { return itemInstance; } @@ -683,20 +683,20 @@ bool Item::canBeDepleted() /** * Returns true when the item was used to deal more than default damage -* +* * @param itemInstance * @param mob * @param attacker * @return */ -bool Item::hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker) +bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { return false; } /** * Returns true when the item was used to mine more efficiently -* +* * @param itemInstance * @param tile * @param x @@ -705,12 +705,12 @@ bool Item::hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr * @param owner * @return */ -bool Item::mineBlock(std::shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, std::shared_ptr owner) +bool Item::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { return false; } -int Item::getAttackDamage(std::shared_ptr entity) +int Item::getAttackDamage(shared_ptr entity) { return 1; } @@ -720,7 +720,7 @@ bool Item::canDestroySpecial(Tile *tile) return false; } -bool Item::interactEnemy(std::shared_ptr itemInstance, std::shared_ptr mob) +bool Item::interactEnemy(shared_ptr itemInstance, shared_ptr mob) { return false; } @@ -753,7 +753,7 @@ LPCWSTR Item::getDescription() //return I18n::get(getDescriptionId()); } -LPCWSTR Item::getDescription(std::shared_ptr instance) +LPCWSTR Item::getDescription(shared_ptr instance) { return app.GetString(getDescriptionId(instance)); //return I18n::get(getDescriptionId(instance)); @@ -764,7 +764,7 @@ unsigned int Item::getDescriptionId(int iData /*= -1*/) return descriptionId; } -unsigned int Item::getDescriptionId(std::shared_ptr instance) +unsigned int Item::getDescriptionId(shared_ptr instance) { return descriptionId; } @@ -780,7 +780,7 @@ unsigned int Item::getUseDescriptionId() return useDescriptionId; } -unsigned int Item::getUseDescriptionId(std::shared_ptr instance) +unsigned int Item::getUseDescriptionId(shared_ptr instance) { return useDescriptionId; } @@ -791,7 +791,7 @@ Item *Item::setCraftingRemainingItem(Item *craftingRemainingItem) return this; } -bool Item::shouldMoveCraftingResultToInventory(std::shared_ptr instance) +bool Item::shouldMoveCraftingResultToInventory(shared_ptr instance) { // Default is good for the vast majority of items return true; @@ -817,15 +817,15 @@ wstring Item::getName() return L"";//I18n::get(getDescriptionId() + L".name"); } -int Item::getColor(std::shared_ptr item, int spriteLayer) +int Item::getColor(shared_ptr item, int spriteLayer) { return 0xffffff; } -void Item::inventoryTick(std::shared_ptr itemInstance, Level *level, std::shared_ptr owner, int slot, bool selected) { +void Item::inventoryTick(shared_ptr itemInstance, Level *level, shared_ptr owner, int slot, bool selected) { } -void Item::onCraftedBy(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +void Item::onCraftedBy(shared_ptr itemInstance, Level *level, shared_ptr player) { } @@ -834,17 +834,17 @@ bool Item::isComplex() return false; } -UseAnim Item::getUseAnimation(std::shared_ptr itemInstance) +UseAnim Item::getUseAnimation(shared_ptr itemInstance) { return UseAnim_none; } -int Item::getUseDuration(std::shared_ptr itemInstance) +int Item::getUseDuration(shared_ptr itemInstance) { return 0; } -void Item::releaseUsing(std::shared_ptr itemInstance, Level *level, std::shared_ptr player, int durationLeft) +void Item::releaseUsing(shared_ptr itemInstance, Level *level, shared_ptr player, int durationLeft) { } @@ -864,35 +864,35 @@ bool Item::hasPotionBrewingFormula() return !potionBrewingFormula.empty(); } -void Item::appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void Item::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) { } -wstring Item::getHoverName(std::shared_ptr itemInstance) +wstring Item::getHoverName(shared_ptr itemInstance) { //String elementName = ("" + Language.getInstance().getElementName(getDescription(itemInstance))).trim(); //return elementName; return app.GetString(getDescriptionId(itemInstance)); } -bool Item::isFoil(std::shared_ptr itemInstance) +bool Item::isFoil(shared_ptr itemInstance) { if (itemInstance->isEnchanted()) return true; return false; } -const Rarity *Item::getRarity(std::shared_ptr itemInstance) +const Rarity *Item::getRarity(shared_ptr itemInstance) { if (itemInstance->isEnchanted()) return Rarity::rare; return Rarity::common; } -bool Item::isEnchantable(std::shared_ptr itemInstance) +bool Item::isEnchantable(shared_ptr itemInstance) { return getMaxStackSize() == 1 && canBeDepleted(); } -HitResult *Item::getPlayerPOVHitResult(Level *level, std::shared_ptr player, bool alsoPickLiquid) +HitResult *Item::getPlayerPOVHitResult(Level *level, shared_ptr player, bool alsoPickLiquid) { float a = 1; @@ -935,7 +935,7 @@ Icon *Item::getLayerIcon(int auxValue, int spriteLayer) return getIcon(auxValue); } -bool Item::isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem) +bool Item::isValidRepairItem(shared_ptr source, shared_ptr repairItem) { return false; } diff --git a/Minecraft.World/Item.h b/Minecraft.World/Item.h index 3e3f7e27..727fc661 100644 --- a/Minecraft.World/Item.h +++ b/Minecraft.World/Item.h @@ -68,8 +68,8 @@ public: eMaterial_stoneSmooth, eMaterial_netherbrick, eMaterial_ender, - eMaterial_glass, - eMaterial_blaze, + eMaterial_glass, + eMaterial_blaze, eMaterial_magic, eMaterial_melon, eMaterial_setfire, @@ -394,13 +394,13 @@ public: static const int bow_Id = 261; static const int arrow_Id = 262; static const int coal_Id = 263; - static const int diamond_Id = 264; + static const int diamond_Id = 264; static const int ironIngot_Id = 265; static const int goldIngot_Id = 266; static const int sword_iron_Id = 267; - static const int sword_wood_Id = 268; + static const int sword_wood_Id = 268; static const int shovel_wood_Id = 269; - static const int pickAxe_wood_Id = 270; + static const int pickAxe_wood_Id = 270; static const int hatchet_wood_Id = 271; static const int sword_stone_Id = 272; static const int shovel_stone_Id = 273; @@ -410,7 +410,7 @@ public: static const int shovel_diamond_Id = 277; static const int pickAxe_diamond_Id = 278; static const int hatchet_diamond_Id = 279; - static const int stick_Id = 280; + static const int stick_Id = 280; static const int bowl_Id = 281; static const int mushroomStew_Id = 282; static const int sword_gold_Id = 283; @@ -425,7 +425,7 @@ public: static const int hoe_iron_Id = 292; static const int hoe_diamond_Id = 293; static const int hoe_gold_Id = 294; - static const int seeds_wheat_Id = 295; + static const int seeds_wheat_Id = 295; static const int wheat_Id = 296; static const int bread_Id = 297; @@ -458,7 +458,7 @@ public: static const int porkChop_raw_Id = 319; static const int porkChop_cooked_Id = 320; static const int painting_Id = 321; - static const int apple_gold_Id = 322; + static const int apple_gold_Id = 322; static const int sign_Id = 323; static const int door_wood_Id = 324; static const int bucket_empty_Id = 325; @@ -474,7 +474,7 @@ public: static const int milk_Id = 335; static const int brick_Id = 336; static const int clay_Id = 337; - static const int reeds_Id = 338; + static const int reeds_Id = 338; static const int paper_Id = 339; static const int book_Id = 340; static const int slimeBall_Id = 341; @@ -487,7 +487,7 @@ public: static const int yellowDust_Id = 348; static const int fish_raw_Id = 349; static const int fish_cooked_Id = 350; - static const int dye_powder_Id = 351; + static const int dye_powder_Id = 351; static const int bone_Id = 352; static const int sugar_Id = 353; static const int cake_Id = 354; @@ -547,7 +547,7 @@ public: static const int record_12_Id = 2266; // 4J-PB - this one isn't playable in the PC game, but is fine in ours - static const int record_08_Id = 2267; + static const int record_08_Id = 2267; // TU9 static const int fireball_Id = 385; @@ -618,15 +618,15 @@ public: virtual int getIconType(); virtual Icon *getIcon(int auxValue); - Icon *getIcon(std::shared_ptr itemInstance); + Icon *getIcon(shared_ptr itemInstance); - const bool useOn(std::shared_ptr itemInstance, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly=false); + const bool useOn(shared_ptr itemInstance, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly=false); - virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual float getDestroySpeed(std::shared_ptr itemInstance, Tile *tile); - virtual bool TestUse(Level *level, std::shared_ptr player); - virtual std::shared_ptr use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); - virtual std::shared_ptr useTimeDepleted(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); + virtual bool TestUse(Level *level, shared_ptr player); + virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); + virtual shared_ptr useTimeDepleted(shared_ptr itemInstance, Level *level, shared_ptr player); virtual int getMaxStackSize(); virtual int getLevelDataForAuxValue(int auxValue); bool isStackedByData(); @@ -645,17 +645,17 @@ public: /** * Returns true when the item was used to deal more than default damage - * + * * @param itemInstance * @param mob * @param attacker * @return */ - virtual bool hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); /** * Returns true when the item was used to mine more efficiently - * + * * @param itemInstance * @param tile * @param x @@ -664,35 +664,35 @@ public: * @param owner * @return */ - virtual bool mineBlock(std::shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, std::shared_ptr owner); - virtual int getAttackDamage(std::shared_ptr entity); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); + virtual int getAttackDamage(shared_ptr entity); virtual bool canDestroySpecial(Tile *tile); - virtual bool interactEnemy(std::shared_ptr itemInstance, std::shared_ptr mob); + virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr mob); Item *handEquipped(); virtual bool isHandEquipped(); virtual bool isMirroredArt(); Item *setDescriptionId(unsigned int id); LPCWSTR getDescription(); - LPCWSTR getDescription(std::shared_ptr instance); + LPCWSTR getDescription(shared_ptr instance); virtual unsigned int getDescriptionId(int iData = -1); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); Item *setUseDescriptionId(unsigned int id); virtual unsigned int getUseDescriptionId(); - virtual unsigned int getUseDescriptionId(std::shared_ptr instance); + virtual unsigned int getUseDescriptionId(shared_ptr instance); Item *setCraftingRemainingItem(Item *craftingRemainingItem); - virtual bool shouldMoveCraftingResultToInventory(std::shared_ptr instance); + virtual bool shouldMoveCraftingResultToInventory(shared_ptr instance); virtual bool shouldOverrideMultiplayerNBT(); Item *getCraftingRemainingItem(); bool hasCraftingRemainingItem(); std::wstring getName(); - virtual int getColor(std::shared_ptr item, int spriteLayer); - virtual void inventoryTick(std::shared_ptr itemInstance, Level *level, std::shared_ptr owner, int slot, bool selected); - virtual void onCraftedBy(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); + virtual int getColor(shared_ptr item, int spriteLayer); + virtual void inventoryTick(shared_ptr itemInstance, Level *level, shared_ptr owner, int slot, bool selected); + virtual void onCraftedBy(shared_ptr itemInstance, Level *level, shared_ptr player); virtual bool isComplex(); - virtual UseAnim getUseAnimation(std::shared_ptr itemInstance); - virtual int getUseDuration(std::shared_ptr itemInstance); - virtual void releaseUsing(std::shared_ptr itemInstance, Level *level, std::shared_ptr player, int durationLeft); + virtual UseAnim getUseAnimation(shared_ptr itemInstance); + virtual int getUseDuration(shared_ptr itemInstance); + virtual void releaseUsing(shared_ptr itemInstance, Level *level, shared_ptr player, int durationLeft); protected: virtual Item *setPotionBrewingFormula(const wstring &potionBrewingFormula); @@ -700,19 +700,19 @@ protected: public: virtual wstring getPotionBrewingFormula(); virtual bool hasPotionBrewingFormula(); - virtual void appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); // 4J Added unformattedStrings - virtual wstring getHoverName(std::shared_ptr itemInstance); - virtual bool isFoil(std::shared_ptr itemInstance); - virtual const Rarity *getRarity(std::shared_ptr itemInstance); - virtual bool isEnchantable(std::shared_ptr itemInstance); + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); // 4J Added unformattedStrings + virtual wstring getHoverName(shared_ptr itemInstance); + virtual bool isFoil(shared_ptr itemInstance); + virtual const Rarity *getRarity(shared_ptr itemInstance); + virtual bool isEnchantable(shared_ptr itemInstance); protected: - HitResult *getPlayerPOVHitResult(Level *level, std::shared_ptr player, bool alsoPickLiquid); + HitResult *getPlayerPOVHitResult(Level *level, shared_ptr player, bool alsoPickLiquid); public: virtual int getEnchantmentValue(); virtual bool hasMultipleSpriteLayers(); virtual Icon *getLayerIcon(int auxValue, int spriteLayer); - virtual bool isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem); + virtual bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); virtual void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/ItemEntity.cpp b/Minecraft.World/ItemEntity.cpp index 5c3a4515..eb7684a6 100644 --- a/Minecraft.World/ItemEntity.cpp +++ b/Minecraft.World/ItemEntity.cpp @@ -48,7 +48,7 @@ ItemEntity::ItemEntity(Level *level, double x, double y, double z) : Entity(leve _init(level,x,y,z); } -ItemEntity::ItemEntity(Level *level, double x, double y, double z, std::shared_ptr item) : Entity( level ) +ItemEntity::ItemEntity(Level *level, double x, double y, double z, shared_ptr item) : Entity( level ) { _init(level,x,y,z); setItem(item); @@ -72,7 +72,7 @@ void ItemEntity::defineSynchedData() void ItemEntity::tick() { Entity::tick(); - + if (throwTime > 0) throwTime--; xo = x; yo = y; @@ -80,7 +80,7 @@ void ItemEntity::tick() yd -= 0.04f; noPhysics = checkInTile(x, (bb->y0 + bb->y1) / 2, z); - + // 4J - added parameter here so that these don't care about colliding with other entities move(xd, yd, zd, true); @@ -133,22 +133,22 @@ void ItemEntity::tick() } void ItemEntity::mergeWithNeighbours() -{ - vector > *neighbours = level->getEntitiesOfClass(typeid(*this), bb->grow(0.5, 0, 0.5)); +{ + vector > *neighbours = level->getEntitiesOfClass(typeid(*this), bb->grow(0.5, 0, 0.5)); for(AUTO_VAR(it, neighbours->begin()); it != neighbours->end(); ++it) { - std::shared_ptr entity = dynamic_pointer_cast(*it); + shared_ptr entity = dynamic_pointer_cast(*it); merge(entity); } delete neighbours; } -bool ItemEntity::merge(std::shared_ptr target) +bool ItemEntity::merge(shared_ptr target) { if (target == shared_from_this()) return false; if (!target->isAlive() || !this->isAlive()) return false; - std::shared_ptr myItem = this->getItem(); - std::shared_ptr targetItem = target->getItem(); + shared_ptr myItem = this->getItem(); + shared_ptr targetItem = target->getItem(); if (targetItem->getItem() != myItem->getItem()) return false; if (targetItem->hasTag() ^ myItem->hasTag()) return false; @@ -189,7 +189,7 @@ bool ItemEntity::hurt(DamageSource *source, int damage) // 4J - added next line: found whilst debugging an issue with item entities getting into a bad state when being created by a cactus, since entities insides cactuses get hurt // and therefore depending on the timing of things they could get removed from the client when they weren't supposed to be. Are there really any cases were we would want // an itemEntity to be locally hurt? - if (level->isClientSide ) return false; + if (level->isClientSide ) return false; markHurt(); health -= damage; @@ -216,11 +216,11 @@ void ItemEntity::readAdditionalSaveData(CompoundTag *tag) if (getItem() == NULL) remove(); } -void ItemEntity::playerTouch(std::shared_ptr player) +void ItemEntity::playerTouch(shared_ptr player) { if (level->isClientSide) return; - std::shared_ptr item = getItem(); + shared_ptr item = getItem(); // 4J Stu - Fix for duplication glitch if(item->count <= 0) @@ -243,7 +243,7 @@ void ItemEntity::playerTouch(std::shared_ptr player) #ifdef _EXTENDED_ACHIEVEMENTS if ( getItem()->getItem()->id ) { - std::shared_ptr pThrower = level->getPlayerByName(getThrower()); + shared_ptr pThrower = level->getPlayerByName(getThrower()); if ( (pThrower != nullptr) && (pThrower != player) ) { pThrower->awardStat(GenericStats::diamondsToYou(), GenericStats::param_diamondsToYou()); @@ -251,7 +251,7 @@ void ItemEntity::playerTouch(std::shared_ptr player) } #endif } - if (item->id == Item::blazeRod_Id) + if (item->id == Item::blazeRod_Id) player->awardStat(GenericStats::blazeRod(), GenericStats::param_blazeRod()); level->playSound(shared_from_this(), eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); @@ -267,9 +267,9 @@ wstring ItemEntity::getAName() //return I18n.get("item." + item.getDescriptionId()); } -std::shared_ptr ItemEntity::getItem() +shared_ptr ItemEntity::getItem() { - std::shared_ptr result = getEntityData()->getItemInstance(DATA_ITEM); + shared_ptr result = getEntityData()->getItemInstance(DATA_ITEM); if (result == NULL) { @@ -278,13 +278,13 @@ std::shared_ptr ItemEntity::getItem() app.DebugPrintf("Item entity %d has no item?!\n", entityId); //level.getLogger().severe("Item entity " + entityId + " has no item?!"); } - return std::shared_ptr(new ItemInstance(Tile::rock)); + return shared_ptr(new ItemInstance(Tile::rock)); } return result; } -void ItemEntity::setItem(std::shared_ptr item) +void ItemEntity::setItem(shared_ptr item) { getEntityData()->set(DATA_ITEM, item); getEntityData()->markDirty(DATA_ITEM); diff --git a/Minecraft.World/ItemEntity.h b/Minecraft.World/ItemEntity.h index 456a7441..1f42bc21 100644 --- a/Minecraft.World/ItemEntity.h +++ b/Minecraft.World/ItemEntity.h @@ -30,9 +30,9 @@ private: public: float bobOffs; - + ItemEntity(Level *level, double x, double y, double z); - ItemEntity(Level *level, double x, double y, double z, std::shared_ptr item); + ItemEntity(Level *level, double x, double y, double z, shared_ptr item); protected: virtual bool makeStepSound(); @@ -50,7 +50,7 @@ private: void mergeWithNeighbours(); public: - bool merge(std::shared_ptr target); + bool merge(shared_ptr target); void setShortLifeTime(); virtual bool updateInWaterState(); @@ -61,12 +61,12 @@ public: virtual bool hurt(DamageSource *source, int damage); virtual void addAdditonalSaveData(CompoundTag *entityTag); virtual void readAdditionalSaveData(CompoundTag *tag); - virtual void playerTouch(std::shared_ptr player); + virtual void playerTouch(shared_ptr player); virtual wstring getAName(); - std::shared_ptr getItem(); - void setItem(std::shared_ptr item); + shared_ptr getItem(); + void setItem(shared_ptr item); virtual bool isAttackable(); void setThrower(const wstring &thrower); diff --git a/Minecraft.World/ItemFrame.cpp b/Minecraft.World/ItemFrame.cpp index ec412b33..141f0630 100644 --- a/Minecraft.World/ItemFrame.cpp +++ b/Minecraft.World/ItemFrame.cpp @@ -33,33 +33,33 @@ ItemFrame::ItemFrame(Level *level, int xTile, int yTile, int zTile, int dir) : H setDir(dir); } -void ItemFrame::defineSynchedData() +void ItemFrame::defineSynchedData() { getEntityData()->defineNULL(DATA_ITEM, NULL); getEntityData()->define(DATA_ROTATION, (byte) 0); } -void ItemFrame::dropItem() +void ItemFrame::dropItem() { - spawnAtLocation(std::shared_ptr(new ItemInstance(Item::frame)), 0.0f); - std::shared_ptr item = getItem(); - if (item != NULL) + spawnAtLocation(shared_ptr(new ItemInstance(Item::frame)), 0.0f); + shared_ptr item = getItem(); + if (item != NULL) { - std::shared_ptr data = Item::map->getSavedData(item, level); + shared_ptr data = Item::map->getSavedData(item, level); data->removeItemFrameDecoration(item); - std::shared_ptr itemToDrop = item->copy(); + shared_ptr itemToDrop = item->copy(); itemToDrop->setFramed(nullptr); spawnAtLocation(itemToDrop, 0.0f); } } -std::shared_ptr ItemFrame::getItem() +shared_ptr ItemFrame::getItem() { return getEntityData()->getItemInstance(DATA_ITEM); } -void ItemFrame::setItem(std::shared_ptr item) +void ItemFrame::setItem(shared_ptr item) { if(item != NULL) { @@ -72,19 +72,19 @@ void ItemFrame::setItem(std::shared_ptr item) getEntityData()->markDirty(DATA_ITEM); } -int ItemFrame::getRotation() +int ItemFrame::getRotation() { return getEntityData()->getByte(DATA_ROTATION); } -void ItemFrame::setRotation(int rotation) +void ItemFrame::setRotation(int rotation) { getEntityData()->set(DATA_ROTATION, (byte) (rotation % 4)); } -void ItemFrame::addAdditonalSaveData(CompoundTag *tag) +void ItemFrame::addAdditonalSaveData(CompoundTag *tag) { - if (getItem() != NULL) + if (getItem() != NULL) { tag->putCompound(L"Item", getItem()->save(new CompoundTag())); tag->putByte(L"ItemRotation", (byte) getRotation()); @@ -93,10 +93,10 @@ void ItemFrame::addAdditonalSaveData(CompoundTag *tag) HangingEntity::addAdditonalSaveData(tag); } -void ItemFrame::readAdditionalSaveData(CompoundTag *tag) +void ItemFrame::readAdditionalSaveData(CompoundTag *tag) { CompoundTag *itemTag = tag->getCompound(L"Item"); - if (itemTag != NULL && !itemTag->isEmpty()) + if (itemTag != NULL && !itemTag->isEmpty()) { setItem(ItemInstance::fromTag(itemTag)); setRotation(tag->getByte(L"ItemRotation")); @@ -106,36 +106,36 @@ void ItemFrame::readAdditionalSaveData(CompoundTag *tag) HangingEntity::readAdditionalSaveData(tag); } -bool ItemFrame::interact(std::shared_ptr player) +bool ItemFrame::interact(shared_ptr player) { if(!player->isAllowedToInteract(shared_from_this())) { return false; } - if (getItem() == NULL) + if (getItem() == NULL) { - std::shared_ptr item = player->getCarriedItem(); + shared_ptr item = player->getCarriedItem(); - if (item != NULL) + if (item != NULL) { - if (!level->isClientSide)//isClientSide) + if (!level->isClientSide)//isClientSide) { setItem(item); - if (!player->abilities.instabuild) + if (!player->abilities.instabuild) { - if (--item->count <= 0) + if (--item->count <= 0) { player->inventory->setItem(player->inventory->selected, nullptr); } } } } - } - else + } + else { - if (!level->isClientSide)//isClientSide) + if (!level->isClientSide)//isClientSide) { setRotation(getRotation() + 1); } diff --git a/Minecraft.World/ItemFrame.h b/Minecraft.World/ItemFrame.h index d39c6cc8..1af5c2e9 100644 --- a/Minecraft.World/ItemFrame.h +++ b/Minecraft.World/ItemFrame.h @@ -30,12 +30,12 @@ protected: public: - std::shared_ptr getItem(); - void setItem(std::shared_ptr item); + shared_ptr getItem(); + void setItem(shared_ptr item); int getRotation(); void setRotation(int rotation); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); - virtual bool interact(std::shared_ptr player); + virtual bool interact(shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/ItemInstance.cpp b/Minecraft.World/ItemInstance.cpp index 99b9fb74..ab042af0 100644 --- a/Minecraft.World/ItemInstance.cpp +++ b/Minecraft.World/ItemInstance.cpp @@ -28,17 +28,17 @@ void ItemInstance::_init(int id, int count, int auxValue) this->m_bForceNumberDisplay=false; } -ItemInstance::ItemInstance(Tile *tile) +ItemInstance::ItemInstance(Tile *tile) { _init(tile->id, 1, 0); } -ItemInstance::ItemInstance(Tile *tile, int count) +ItemInstance::ItemInstance(Tile *tile, int count) { _init(tile->id, count, 0); } // 4J-PB - added -ItemInstance::ItemInstance(MapItem *item, int count) +ItemInstance::ItemInstance(MapItem *item, int count) { _init(item->id, count, 0); } @@ -48,19 +48,19 @@ ItemInstance::ItemInstance(Tile *tile, int count, int auxValue) _init(tile->id, count, auxValue); } -ItemInstance::ItemInstance(Item *item) +ItemInstance::ItemInstance(Item *item) { _init(item->id, 1, 0); } -ItemInstance::ItemInstance(Item *item, int count) +ItemInstance::ItemInstance(Item *item, int count) { _init(item->id, count, 0); } -ItemInstance::ItemInstance(Item *item, int count, int auxValue) +ItemInstance::ItemInstance(Item *item, int count, int auxValue) { _init(item->id, count, auxValue); } @@ -70,9 +70,9 @@ ItemInstance::ItemInstance(int id, int count, int damage) _init(id,count,damage); } -std::shared_ptr ItemInstance::fromTag(CompoundTag *itemTag) +shared_ptr ItemInstance::fromTag(CompoundTag *itemTag) { - std::shared_ptr itemInstance = std::shared_ptr(new ItemInstance()); + shared_ptr itemInstance = shared_ptr(new ItemInstance()); itemInstance->load(itemTag); return itemInstance->getItem() != NULL ? itemInstance : nullptr; } @@ -82,9 +82,9 @@ ItemInstance::~ItemInstance() if(tag != NULL) delete tag; } -std::shared_ptr ItemInstance::remove(int count) +shared_ptr ItemInstance::remove(int count) { - std::shared_ptr ii = std::shared_ptr( new ItemInstance(id, count, auxValue) ); + shared_ptr ii = shared_ptr( new ItemInstance(id, count, auxValue) ); if (tag != NULL) ii->tag = (CompoundTag *) tag->copy(); this->count -= count; @@ -111,32 +111,32 @@ int ItemInstance::getIconType() return getItem()->getIconType(); } -bool ItemInstance::useOn(std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool ItemInstance::useOn(shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { return getItem()->useOn(shared_from_this(), player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnOnly); } -float ItemInstance::getDestroySpeed(Tile *tile) +float ItemInstance::getDestroySpeed(Tile *tile) { return getItem()->getDestroySpeed(shared_from_this(), tile); } -bool ItemInstance::TestUse(Level *level, std::shared_ptr player) +bool ItemInstance::TestUse(Level *level, shared_ptr player) { return getItem()->TestUse( level, player); } -std::shared_ptr ItemInstance::use(Level *level, std::shared_ptr player) +shared_ptr ItemInstance::use(Level *level, shared_ptr player) { return getItem()->use(shared_from_this(), level, player); } -std::shared_ptr ItemInstance::useTimeDepleted(Level *level, std::shared_ptr player) +shared_ptr ItemInstance::useTimeDepleted(Level *level, shared_ptr player) { return getItem()->useTimeDepleted(shared_from_this(), level, player); } -CompoundTag *ItemInstance::save(CompoundTag *compoundTag) +CompoundTag *ItemInstance::save(CompoundTag *compoundTag) { compoundTag->putShort(L"id", (short) id); compoundTag->putByte(L"Count", (byte) count); @@ -167,7 +167,7 @@ bool ItemInstance::isStackable() return getMaxStackSize() > 1 && (!isDamageableItem() || !isDamaged()); } -bool ItemInstance::isDamageableItem() +bool ItemInstance::isDamageableItem() { return Item::items[id]->getMaxDamage() > 0; } @@ -175,7 +175,7 @@ bool ItemInstance::isDamageableItem() /** * Returns true if this item type only can be stacked with items that have * the same auxValue data. - * + * * @return */ @@ -184,7 +184,7 @@ bool ItemInstance::isStackedByData() return Item::items[id]->isStackedByData(); } -bool ItemInstance::isDamaged() +bool ItemInstance::isDamaged() { return isDamageableItem() && auxValue > 0; } @@ -209,14 +209,14 @@ int ItemInstance::getMaxDamage() return Item::items[id]->getMaxDamage(); } -void ItemInstance::hurt(int i, std::shared_ptr owner) +void ItemInstance::hurt(int i, shared_ptr owner) { if (!isDamageableItem()) { return; } - std::shared_ptr player = dynamic_pointer_cast(owner); + shared_ptr player = dynamic_pointer_cast(owner); if (i > 0 && player != NULL) { int enchanted = EnchantmentHelper::getDigDurability(player->inventory); @@ -232,7 +232,7 @@ void ItemInstance::hurt(int i, std::shared_ptr owner) // 4J Stu - Changed in TU6 to not damage items in creative mode if (!(owner != NULL && player->abilities.instabuild)) auxValue += i; - + if (auxValue > getMaxDamage()) { owner->breakItem(shared_from_this()); @@ -242,19 +242,19 @@ void ItemInstance::hurt(int i, std::shared_ptr owner) } } -void ItemInstance::hurtEnemy(std::shared_ptr mob, std::shared_ptr attacker) +void ItemInstance::hurtEnemy(shared_ptr mob, shared_ptr attacker) { - //bool used = + //bool used = Item::items[id]->hurtEnemy(shared_from_this(), mob, attacker); } -void ItemInstance::mineBlock(Level *level, int tile, int x, int y, int z, std::shared_ptr owner) +void ItemInstance::mineBlock(Level *level, int tile, int x, int y, int z, shared_ptr owner) { - //bool used = + //bool used = Item::items[id]->mineBlock( shared_from_this(), level, tile, x, y, z, owner); } -int ItemInstance::getAttackDamage(std::shared_ptr entity) +int ItemInstance::getAttackDamage(shared_ptr entity) { return Item::items[id]->getAttackDamage(entity); } @@ -264,14 +264,14 @@ bool ItemInstance::canDestroySpecial(Tile *tile) return Item::items[id]->canDestroySpecial(tile); } -bool ItemInstance::interactEnemy(std::shared_ptr mob) +bool ItemInstance::interactEnemy(shared_ptr mob) { return Item::items[id]->interactEnemy(shared_from_this(), mob); } -std::shared_ptr ItemInstance::copy() const +shared_ptr ItemInstance::copy() const { - std::shared_ptr copy = std::shared_ptr( new ItemInstance(id, count, auxValue) ); + shared_ptr copy = shared_ptr( new ItemInstance(id, count, auxValue) ); if (tag != NULL) { copy->tag = (CompoundTag *) tag->copy(); @@ -295,7 +295,7 @@ ItemInstance *ItemInstance::copy_not_shared() const } // 4J Brought forward from 1.2 -bool ItemInstance::tagMatches(std::shared_ptr a, std::shared_ptr b) +bool ItemInstance::tagMatches(shared_ptr a, shared_ptr b) { if (a == NULL && b == NULL) return true; if (a == NULL || b == NULL) return false; @@ -311,14 +311,14 @@ bool ItemInstance::tagMatches(std::shared_ptr a, std::shared_ptr a, std::shared_ptr b) +bool ItemInstance::matches(shared_ptr a, shared_ptr b) { if (a == NULL && b == NULL) return true; if (a == NULL || b == NULL) return false; return a->matches(b); } -bool ItemInstance::matches(std::shared_ptr b) +bool ItemInstance::matches(shared_ptr b) { if (count != b->count) return false; if (id != b->id) return false; @@ -337,16 +337,16 @@ bool ItemInstance::matches(std::shared_ptr b) /** * Checks if this item is the same item as the other one, disregarding the * 'count' value. - * + * * @param b * @return */ -bool ItemInstance::sameItem(std::shared_ptr b) +bool ItemInstance::sameItem(shared_ptr b) { return id == b->id && auxValue == b->auxValue; } -bool ItemInstance::sameItemWithTags(std::shared_ptr b) +bool ItemInstance::sameItemWithTags(shared_ptr b) { if (id != b->id) return false; if (auxValue != b->auxValue) return false; @@ -367,12 +367,12 @@ bool ItemInstance::sameItem_not_shared(ItemInstance *b) return id == b->id && auxValue == b->auxValue; } -unsigned int ItemInstance::getUseDescriptionId() +unsigned int ItemInstance::getUseDescriptionId() { return Item::items[id]->getUseDescriptionId(shared_from_this()); } -unsigned int ItemInstance::getDescriptionId(int iData /*= -1*/) +unsigned int ItemInstance::getDescriptionId(int iData /*= -1*/) { return Item::items[id]->getDescriptionId(shared_from_this()); } @@ -384,15 +384,15 @@ ItemInstance *ItemInstance::setDescriptionId(unsigned int id) return this; } -std::shared_ptr ItemInstance::clone(std::shared_ptr item) +shared_ptr ItemInstance::clone(shared_ptr item) { return item == NULL ? nullptr : item->copy(); } -wstring ItemInstance::toString() +wstring ItemInstance::toString() { //return count + "x" + Item::items[id]->getDescriptionId() + "@" + auxValue; - + std::wostringstream oss; // 4J-PB - TODO - temp fix until ore recipe issue is fixed if(Item::items[id]==NULL) @@ -406,13 +406,13 @@ wstring ItemInstance::toString() return oss.str(); } -void ItemInstance::inventoryTick(Level *level, std::shared_ptr owner, int slot, bool selected) +void ItemInstance::inventoryTick(Level *level, shared_ptr owner, int slot, bool selected) { if (popTime > 0) popTime--; Item::items[id]->inventoryTick(shared_from_this(), level, owner, slot, selected); } -void ItemInstance::onCraftedBy(Level *level, std::shared_ptr player, int craftCount) +void ItemInstance::onCraftedBy(Level *level, shared_ptr player, int craftCount) { // 4J Stu Added for tutorial callback player->onCrafted(shared_from_this()); @@ -425,7 +425,7 @@ void ItemInstance::onCraftedBy(Level *level, std::shared_ptr player, int Item::items[id]->onCraftedBy(shared_from_this(), level, player); } -bool ItemInstance::equals(std::shared_ptr ii) +bool ItemInstance::equals(shared_ptr ii) { return id == ii->id && count == ii->count && auxValue == ii->auxValue; } @@ -440,7 +440,7 @@ UseAnim ItemInstance::getUseAnimation() return getItem()->getUseAnimation(shared_from_this()); } -void ItemInstance::releaseUsing(Level *level, std::shared_ptr player, int durationLeft) +void ItemInstance::releaseUsing(Level *level, shared_ptr player, int durationLeft) { getItem()->releaseUsing(shared_from_this(), level, player, durationLeft); } @@ -501,7 +501,7 @@ bool ItemInstance::hasCustomHoverName() return tag->getCompound(L"display")->contains(L"Name"); } -vector *ItemInstance::getHoverText(std::shared_ptr player, bool advanced, vector &unformattedStrings) +vector *ItemInstance::getHoverText(shared_ptr player, bool advanced, vector &unformattedStrings) { vector *lines = new vector(); Item *item = Item::items[id]; @@ -568,7 +568,7 @@ vector *ItemInstance::getHoverText(std::shared_ptr player, bool } // 4J Added -vector *ItemInstance::getHoverTextOnly(std::shared_ptr player, bool advanced, vector &unformattedStrings) +vector *ItemInstance::getHoverTextOnly(shared_ptr player, bool advanced, vector &unformattedStrings) { vector *lines = new vector(); Item *item = Item::items[id]; @@ -667,7 +667,7 @@ int ItemInstance::get4JData() } } // 4J Added - to show strength on potions -bool ItemInstance::hasPotionStrengthBar() +bool ItemInstance::hasPotionStrengthBar() { // exclude a bottle of water from this if((id==Item::potion_Id) && (auxValue !=0))// && (!MACRO_POTION_IS_AKWARD(auxValue))) 4J-PB leaving the bar on an awkward potion so we can differentiate it from a water bottle @@ -678,7 +678,7 @@ bool ItemInstance::hasPotionStrengthBar() return false; } -int ItemInstance::GetPotionStrength() +int ItemInstance::GetPotionStrength() { if(MACRO_POTION_IS_INSTANTDAMAGE(auxValue) || MACRO_POTION_IS_INSTANTHEALTH(auxValue) ) { @@ -693,17 +693,17 @@ int ItemInstance::GetPotionStrength() // TU9 -bool ItemInstance::isFramed() +bool ItemInstance::isFramed() { return frame != NULL; } -void ItemInstance::setFramed(std::shared_ptr frame) +void ItemInstance::setFramed(shared_ptr frame) { this->frame = frame; } -std::shared_ptr ItemInstance::getFrame() +shared_ptr ItemInstance::getFrame() { return frame; } diff --git a/Minecraft.World/ItemInstance.h b/Minecraft.World/ItemInstance.h index dd3509ec..c1e52177 100644 --- a/Minecraft.World/ItemInstance.h +++ b/Minecraft.World/ItemInstance.h @@ -44,7 +44,7 @@ private: void _init(int id, int count, int auxValue); // TU9 - std::shared_ptr frame; + shared_ptr frame; public: ItemInstance(Tile *tile); @@ -58,22 +58,22 @@ public: ItemInstance(Item *item, int count, int auxValue); ItemInstance(int id, int count, int damage); - static std::shared_ptr fromTag(CompoundTag *itemTag); + static shared_ptr fromTag(CompoundTag *itemTag); private: ItemInstance() { _init(-1,0,0); } public: ~ItemInstance(); - std::shared_ptr remove(int count); + shared_ptr remove(int count); Item *getItem() const; Icon *getIcon(); int getIconType(); - bool useOn(std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + bool useOn(shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); float getDestroySpeed(Tile *tile); - bool TestUse(Level *level, std::shared_ptr player); - std::shared_ptr use(Level *level, std::shared_ptr player); - std::shared_ptr useTimeDepleted(Level *level, std::shared_ptr player); + bool TestUse(Level *level, shared_ptr player); + shared_ptr use(Level *level, shared_ptr player); + shared_ptr useTimeDepleted(Level *level, shared_ptr player); CompoundTag *save(CompoundTag *compoundTag); void load(CompoundTag *compoundTag); int getMaxStackSize(); @@ -85,16 +85,16 @@ public: int getAuxValue() const; void setAuxValue(int value); int getMaxDamage(); - void hurt(int i, std::shared_ptr owner); - void hurtEnemy(std::shared_ptr mob, std::shared_ptr attacker); - void mineBlock(Level *level, int tile, int x, int y, int z, std::shared_ptr owner); - int getAttackDamage(std::shared_ptr entity); + void hurt(int i, shared_ptr owner); + void hurtEnemy(shared_ptr mob, shared_ptr attacker); + void mineBlock(Level *level, int tile, int x, int y, int z, shared_ptr owner); + int getAttackDamage(shared_ptr entity); bool canDestroySpecial(Tile *tile); - bool interactEnemy(std::shared_ptr mob); - std::shared_ptr copy() const; + bool interactEnemy(shared_ptr mob); + shared_ptr copy() const; ItemInstance *copy_not_shared() const; // 4J Stu - Added for use in recipes - static bool tagMatches(std::shared_ptr a, std::shared_ptr b); // 4J Brought forward from 1.2 - static bool matches(std::shared_ptr a, std::shared_ptr b); + static bool tagMatches(shared_ptr a, shared_ptr b); // 4J Brought forward from 1.2 + static bool matches(shared_ptr a, shared_ptr b); // 4J-PB int GetCount() {return count;} @@ -102,24 +102,24 @@ public: bool GetForceNumberDisplay() {return m_bForceNumberDisplay;} // to force the display of 0 and 1 on the required trading items when you have o or 1 of the item private: - bool matches(std::shared_ptr b); + bool matches(shared_ptr b); public: - bool sameItem(std::shared_ptr b); - bool sameItemWithTags(std::shared_ptr b); //4J Added + bool sameItem(shared_ptr b); + bool sameItemWithTags(shared_ptr b); //4J Added bool sameItem_not_shared(ItemInstance *b); // 4J Stu - Added this for the one time I need it virtual unsigned int getUseDescriptionId(); // 4J Added virtual unsigned int getDescriptionId(int iData = -1); virtual ItemInstance *setDescriptionId(unsigned int id); - static std::shared_ptr clone(std::shared_ptr item); + static shared_ptr clone(shared_ptr item); wstring toString(); - void inventoryTick(Level *level, std::shared_ptr owner, int slot, bool selected); - void onCraftedBy(Level *level, std::shared_ptr player, int craftCount); - bool equals(std::shared_ptr ii); + void inventoryTick(Level *level, shared_ptr owner, int slot, bool selected); + void onCraftedBy(Level *level, shared_ptr player, int craftCount); + bool equals(shared_ptr ii); int getUseDuration(); UseAnim getUseAnimation(); - void releaseUsing(Level *level, std::shared_ptr player, int durationLeft); + void releaseUsing(Level *level, shared_ptr player, int durationLeft); // 4J Stu - Brought forward these functions for enchanting/game rules bool hasTag(); @@ -129,8 +129,8 @@ public: wstring getHoverName(); void setHoverName(const wstring &name); bool hasCustomHoverName(); - vector *getHoverText(std::shared_ptr player, bool advanced, vector &unformattedStrings); - vector *getHoverTextOnly(std::shared_ptr player, bool advanced, vector &unformattedStrings); // 4J Added + vector *getHoverText(shared_ptr player, bool advanced, vector &unformattedStrings); + vector *getHoverTextOnly(shared_ptr player, bool advanced, vector &unformattedStrings); // 4J Added bool isFoil(); const Rarity *getRarity(); bool isEnchantable(); @@ -146,8 +146,8 @@ public: // TU9 bool isFramed(); - void setFramed(std::shared_ptr frame); - std::shared_ptr getFrame(); + void setFramed(shared_ptr frame); + shared_ptr getFrame(); int getBaseRepairCost(); void setRepairCost(int cost); diff --git a/Minecraft.World/KeepAlivePacket.cpp b/Minecraft.World/KeepAlivePacket.cpp index 88fd4fdb..fee97910 100644 --- a/Minecraft.World/KeepAlivePacket.cpp +++ b/Minecraft.World/KeepAlivePacket.cpp @@ -21,7 +21,7 @@ void KeepAlivePacket::handle(PacketListener *listener) listener->handleKeepAlive(shared_from_this()); } -void KeepAlivePacket::read(DataInputStream *dis) //throws IOException +void KeepAlivePacket::read(DataInputStream *dis) //throws IOException { id = dis->readInt(); } @@ -31,7 +31,7 @@ void KeepAlivePacket::write(DataOutputStream *dos) //throws IOException dos->writeInt(id); } -int KeepAlivePacket::getEstimatedSize() +int KeepAlivePacket::getEstimatedSize() { return 4; } @@ -41,7 +41,7 @@ bool KeepAlivePacket::canBeInvalidated() return true; } -bool KeepAlivePacket::isInvalidatedBy(std::shared_ptr packet) +bool KeepAlivePacket::isInvalidatedBy(shared_ptr packet) { return true; } diff --git a/Minecraft.World/KeepAlivePacket.h b/Minecraft.World/KeepAlivePacket.h index d05e76d4..a44d8745 100644 --- a/Minecraft.World/KeepAlivePacket.h +++ b/Minecraft.World/KeepAlivePacket.h @@ -16,10 +16,10 @@ public: virtual void write(DataOutputStream *dos); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); virtual bool isAync(); public: - static std::shared_ptr create() { return std::shared_ptr(new KeepAlivePacket()); } + static shared_ptr create() { return shared_ptr(new KeepAlivePacket()); } virtual int getId() { return 0; } }; \ No newline at end of file diff --git a/Minecraft.World/KickPlayerPacket.h b/Minecraft.World/KickPlayerPacket.h index 62dd0dd1..b9a6ce3e 100644 --- a/Minecraft.World/KickPlayerPacket.h +++ b/Minecraft.World/KickPlayerPacket.h @@ -17,6 +17,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new KickPlayerPacket()); } + static shared_ptr create() { return shared_ptr(new KickPlayerPacket()); } virtual int getId() { return 159; } }; \ No newline at end of file diff --git a/Minecraft.World/KillCommand.cpp b/Minecraft.World/KillCommand.cpp index 3a82378b..30a7880e 100644 --- a/Minecraft.World/KillCommand.cpp +++ b/Minecraft.World/KillCommand.cpp @@ -9,9 +9,9 @@ EGameCommand KillCommand::getId() return eGameCommand_Kill; } -void KillCommand::execute(std::shared_ptr source, byteArray commandData) +void KillCommand::execute(shared_ptr source, byteArray commandData) { - std::shared_ptr player = dynamic_pointer_cast(source); + shared_ptr player = dynamic_pointer_cast(source); player->hurt(DamageSource::outOfWorld, 1000); diff --git a/Minecraft.World/KillCommand.h b/Minecraft.World/KillCommand.h index 21155b6f..a88b2069 100644 --- a/Minecraft.World/KillCommand.h +++ b/Minecraft.World/KillCommand.h @@ -6,5 +6,5 @@ class KillCommand : public Command { public: virtual EGameCommand getId(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); }; \ No newline at end of file diff --git a/Minecraft.World/LadderTile.cpp b/Minecraft.World/LadderTile.cpp index 4f0dfb14..32f35ed8 100644 --- a/Minecraft.World/LadderTile.cpp +++ b/Minecraft.World/LadderTile.cpp @@ -19,7 +19,7 @@ AABB *LadderTile::getTileAABB(Level *level, int x, int y, int z) return Tile::getTileAABB(level, x, y, z); } -void LadderTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void LadderTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { setShape(level->getData(x, y, z)); } diff --git a/Minecraft.World/LadderTile.h b/Minecraft.World/LadderTile.h index 97e4efc8..823f35a7 100644 --- a/Minecraft.World/LadderTile.h +++ b/Minecraft.World/LadderTile.h @@ -12,7 +12,7 @@ protected: public: virtual AABB *getAABB(Level *level, int x, int y, int z); virtual AABB *getTileAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param using Tile::setShape; virtual void setShape(int data); virtual bool blocksLight(); diff --git a/Minecraft.World/LavaSlime.cpp b/Minecraft.World/LavaSlime.cpp index 2131c24a..3ab32d90 100644 --- a/Minecraft.World/LavaSlime.cpp +++ b/Minecraft.World/LavaSlime.cpp @@ -48,9 +48,9 @@ ePARTICLE_TYPE LavaSlime::getParticleName() return eParticleType_flame; } -std::shared_ptr LavaSlime::createChild() +shared_ptr LavaSlime::createChild() { - return std::shared_ptr( new LavaSlime(level) ); + return shared_ptr( new LavaSlime(level) ); } int LavaSlime::getDeathLoot() diff --git a/Minecraft.World/LavaSlime.h b/Minecraft.World/LavaSlime.h index 8a2e5db9..08857ca9 100644 --- a/Minecraft.World/LavaSlime.h +++ b/Minecraft.World/LavaSlime.h @@ -20,7 +20,7 @@ public: protected: virtual ePARTICLE_TYPE getParticleName(); - virtual std::shared_ptr createChild(); + virtual shared_ptr createChild(); virtual int getDeathLoot(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); diff --git a/Minecraft.World/Layer.cpp b/Minecraft.World/Layer.cpp index 8ac5972b..ca805912 100644 --- a/Minecraft.World/Layer.cpp +++ b/Minecraft.World/Layer.cpp @@ -21,17 +21,17 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType *levelType) // 4J - Some changes moved here from 1.2.3. Temperature & downfall layers are no longer created & returned, and a debug layer is isn't. // For reference with regard to future merging, things NOT brought forward from the 1.2.3 version are new layer types that we // don't have yet (shores, swamprivers, region hills etc.) - std::shared_ptrislandLayer = std::shared_ptr(new IslandLayer(1)); - islandLayer = std::shared_ptr(new FuzzyZoomLayer(2000, islandLayer)); - islandLayer = std::shared_ptr(new AddIslandLayer(1, islandLayer)); - islandLayer = std::shared_ptr(new ZoomLayer(2001, islandLayer)); - islandLayer = std::shared_ptr(new AddIslandLayer(2, islandLayer)); - islandLayer = std::shared_ptr(new AddSnowLayer(2, islandLayer)); - islandLayer = std::shared_ptr(new ZoomLayer(2002, islandLayer)); - islandLayer = std::shared_ptr(new AddIslandLayer(3, islandLayer)); - islandLayer = std::shared_ptr(new ZoomLayer(2003, islandLayer)); - islandLayer = std::shared_ptr(new AddIslandLayer(4, islandLayer)); -// islandLayer = std::shared_ptr(new AddMushroomIslandLayer(5, islandLayer)); // 4J - old position of mushroom island layer + shared_ptrislandLayer = shared_ptr(new IslandLayer(1)); + islandLayer = shared_ptr(new FuzzyZoomLayer(2000, islandLayer)); + islandLayer = shared_ptr(new AddIslandLayer(1, islandLayer)); + islandLayer = shared_ptr(new ZoomLayer(2001, islandLayer)); + islandLayer = shared_ptr(new AddIslandLayer(2, islandLayer)); + islandLayer = shared_ptr(new AddSnowLayer(2, islandLayer)); + islandLayer = shared_ptr(new ZoomLayer(2002, islandLayer)); + islandLayer = shared_ptr(new AddIslandLayer(3, islandLayer)); + islandLayer = shared_ptr(new ZoomLayer(2003, islandLayer)); + islandLayer = shared_ptr(new AddIslandLayer(4, islandLayer)); +// islandLayer = shared_ptr(new AddMushroomIslandLayer(5, islandLayer)); // 4J - old position of mushroom island layer int zoomLevel = 4; if (levelType == LevelType::lvl_largeBiomes) @@ -39,32 +39,32 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType *levelType) zoomLevel = 6; } - std::shared_ptr riverLayer = islandLayer; + shared_ptr riverLayer = islandLayer; riverLayer = ZoomLayer::zoom(1000, riverLayer, 0); - riverLayer = std::shared_ptr(new RiverInitLayer(100, riverLayer)); + riverLayer = shared_ptr(new RiverInitLayer(100, riverLayer)); riverLayer = ZoomLayer::zoom(1000, riverLayer, zoomLevel + 2); - riverLayer = std::shared_ptr(new RiverLayer(1, riverLayer)); - riverLayer = std::shared_ptr(new SmoothLayer(1000, riverLayer)); + riverLayer = shared_ptr(new RiverLayer(1, riverLayer)); + riverLayer = shared_ptr(new SmoothLayer(1000, riverLayer)); - std::shared_ptr biomeLayer = islandLayer; + shared_ptr biomeLayer = islandLayer; biomeLayer = ZoomLayer::zoom(1000, biomeLayer, 0); - biomeLayer = std::shared_ptr(new BiomeInitLayer(200, biomeLayer, levelType)); + biomeLayer = shared_ptr(new BiomeInitLayer(200, biomeLayer, levelType)); biomeLayer = ZoomLayer::zoom(1000, biomeLayer, 2); - biomeLayer = std::shared_ptr(new RegionHillsLayer(1000, biomeLayer)); + biomeLayer = shared_ptr(new RegionHillsLayer(1000, biomeLayer)); for (int i = 0; i < zoomLevel; i++) { - biomeLayer = std::shared_ptr(new ZoomLayer(1000 + i, biomeLayer)); + biomeLayer = shared_ptr(new ZoomLayer(1000 + i, biomeLayer)); - if (i == 0) biomeLayer = std::shared_ptr(new AddIslandLayer(3, biomeLayer)); + if (i == 0) biomeLayer = shared_ptr(new AddIslandLayer(3, biomeLayer)); if (i == 0) { // 4J - moved mushroom islands to here. This skips 3 zooms that the old location of the add was, making them about 1/8 of the original size. Adding // them at this scale actually lets us place them near enough other land, if we add them at the same scale as java then they have to be too far out to see for // the scale of our maps - biomeLayer = std::shared_ptr(new AddMushroomIslandLayer(5, biomeLayer)); + biomeLayer = shared_ptr(new AddMushroomIslandLayer(5, biomeLayer)); } if (i == 1 ) @@ -72,30 +72,30 @@ LayerArray Layer::getDefaultLayers(int64_t seed, LevelType *levelType) // 4J - now expand mushroom islands up again. This does a simple region grow to add a new mushroom island element when any of the neighbours are also mushroom islands. // This helps make the islands into nice compact shapes of the type that are actually likely to be able to make an island out of the sea in a small space. Also // helps the shore layer from doing too much damage in shrinking the islands we are making - biomeLayer = std::shared_ptr(new GrowMushroomIslandLayer(5, biomeLayer)); + biomeLayer = shared_ptr(new GrowMushroomIslandLayer(5, biomeLayer)); // Note - this reduces the size of mushroom islands by turning their edges into shores. We are doing this at i == 1 rather than i == 0 as the original does - biomeLayer = std::shared_ptr(new ShoreLayer(1000, biomeLayer)); + biomeLayer = shared_ptr(new ShoreLayer(1000, biomeLayer)); - biomeLayer = std::shared_ptr(new SwampRiversLayer(1000, biomeLayer)); + biomeLayer = shared_ptr(new SwampRiversLayer(1000, biomeLayer)); } } - biomeLayer = std::shared_ptr(new SmoothLayer(1000, biomeLayer)); + biomeLayer = shared_ptr(new SmoothLayer(1000, biomeLayer)); - biomeLayer = std::shared_ptr(new RiverMixerLayer(100, biomeLayer, riverLayer)); + biomeLayer = shared_ptr(new RiverMixerLayer(100, biomeLayer, riverLayer)); #ifndef _CONTENT_PACKAGE #ifdef _BIOME_OVERRIDE if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<(new BiomeOverrideLayer(1)); + biomeLayer = shared_ptr(new BiomeOverrideLayer(1)); } #endif #endif - std::shared_ptr debugLayer = biomeLayer; + shared_ptr debugLayer = biomeLayer; - std::shared_ptrzoomedLayer = std::shared_ptr(new VoronoiZoom(10, biomeLayer)); + shared_ptrzoomedLayer = shared_ptr(new VoronoiZoom(10, biomeLayer)); biomeLayer->init(seed); zoomedLayer->init(seed); diff --git a/Minecraft.World/Layer.h b/Minecraft.World/Layer.h index c949cfa6..6f31e94a 100644 --- a/Minecraft.World/Layer.h +++ b/Minecraft.World/Layer.h @@ -14,7 +14,7 @@ private: int64_t seed; protected: - std::shared_ptrparent; + shared_ptrparent; private: int64_t rval; diff --git a/Minecraft.World/LeafTile.cpp b/Minecraft.World/LeafTile.cpp index bed4a7ca..8b7d381c 100644 --- a/Minecraft.World/LeafTile.cpp +++ b/Minecraft.World/LeafTile.cpp @@ -241,17 +241,17 @@ void LeafTile::spawnResources(Level *level, int x, int y, int z, int data, float if (level->random->nextInt(chance) == 0) { int type = getResource(data, level->random,playerBonusLevel); - popResource(level, x, y, z, std::shared_ptr( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data)))); + popResource(level, x, y, z, shared_ptr( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data)))); } if ((data & LEAF_TYPE_MASK) == NORMAL_LEAF && level->random->nextInt(200) == 0) { - popResource(level, x, y, z, std::shared_ptr(new ItemInstance(Item::apple_Id, 1, 0))); + popResource(level, x, y, z, shared_ptr(new ItemInstance(Item::apple_Id, 1, 0))); } } } -void LeafTile::playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data) +void LeafTile::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { if (!level->isClientSide && player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears->id) { @@ -261,7 +261,7 @@ void LeafTile::playerDestroy(Level *level, std::shared_ptr player, int x ); // drop leaf block instead of sapling - popResource(level, x, y, z, std::shared_ptr(new ItemInstance(Tile::leaves_Id, 1, data & LEAF_TYPE_MASK))); + popResource(level, x, y, z, shared_ptr(new ItemInstance(Tile::leaves_Id, 1, data & LEAF_TYPE_MASK))); } else { @@ -301,12 +301,12 @@ void LeafTile::setFancy(bool fancyGraphics) fancyTextureSet = (fancyGraphics ? 0 : 1); } -std::shared_ptr LeafTile::getSilkTouchItemInstance(int data) +shared_ptr LeafTile::getSilkTouchItemInstance(int data) { - return std::shared_ptr( new ItemInstance(id, 1, data & LEAF_TYPE_MASK) ); + return shared_ptr( new ItemInstance(id, 1, data & LEAF_TYPE_MASK) ); } -void LeafTile::stepOn(Level *level, int x, int y, int z, std::shared_ptr entity) +void LeafTile::stepOn(Level *level, int x, int y, int z, shared_ptr entity) { TransparentTile::stepOn(level, x, y, z, entity); } diff --git a/Minecraft.World/LeafTile.h b/Minecraft.World/LeafTile.h index 2ca8daef..e6c39a7f 100644 --- a/Minecraft.World/LeafTile.h +++ b/Minecraft.World/LeafTile.h @@ -54,7 +54,7 @@ public: // 4J DCR: Brought forward from 1.2 virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); - virtual void playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data); + virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); protected: virtual int getSpawnResourcesAuxValue(int data); public: @@ -63,11 +63,11 @@ public: void setFancy(bool fancyGraphics); protected: - virtual std::shared_ptr getSilkTouchItemInstance(int data); + virtual shared_ptr getSilkTouchItemInstance(int data); public: - virtual void stepOn(Level *level, int x, int y, int z, std::shared_ptr entity); - + virtual void stepOn(Level *level, int x, int y, int z, shared_ptr entity); + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); diff --git a/Minecraft.World/LeafTileItem.cpp b/Minecraft.World/LeafTileItem.cpp index 96300b1e..40036ca0 100644 --- a/Minecraft.World/LeafTileItem.cpp +++ b/Minecraft.World/LeafTileItem.cpp @@ -18,11 +18,11 @@ int LeafTileItem::getLevelDataForAuxValue(int auxValue) Icon *LeafTileItem::getIcon(int itemAuxValue) { - return Tile::leaves->getTexture(0, itemAuxValue); + return Tile::leaves->getTexture(0, itemAuxValue); } -int LeafTileItem::getColor(std::shared_ptr item, int spriteLayer) +int LeafTileItem::getColor(shared_ptr item, int spriteLayer) { int data = item->getAuxValue(); if ((data & LeafTile::EVERGREEN_LEAF) == LeafTile::EVERGREEN_LEAF) @@ -36,7 +36,7 @@ int LeafTileItem::getColor(std::shared_ptr item, int spriteLayer) return FoliageColor::getDefaultColor(); } -unsigned int LeafTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int LeafTileItem::getDescriptionId(shared_ptr instance) { int auxValue = instance->getAuxValue(); if (auxValue < 0 || auxValue >= LeafTile::LEAF_NAMES_LENGTH) diff --git a/Minecraft.World/LeafTileItem.h b/Minecraft.World/LeafTileItem.h index cd266035..cd311590 100644 --- a/Minecraft.World/LeafTileItem.h +++ b/Minecraft.World/LeafTileItem.h @@ -3,7 +3,7 @@ using namespace std; #include "TileItem.h" -class LeafTileItem : public TileItem +class LeafTileItem : public TileItem { using TileItem::getColor; public: @@ -11,7 +11,7 @@ public: virtual int getLevelDataForAuxValue(int auxValue); virtual Icon *getIcon(int itemAuxValue); - virtual int getColor(std::shared_ptr item, int spriteLayer); + virtual int getColor(shared_ptr item, int spriteLayer); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; diff --git a/Minecraft.World/Level.cpp b/Minecraft.World/Level.cpp index 3ad39b66..c159ecb8 100644 --- a/Minecraft.World/Level.cpp +++ b/Minecraft.World/Level.cpp @@ -558,20 +558,20 @@ BiomeSource *Level::getBiomeSource() return dimension->biomeSource; } -Level::Level(std::shared_ptr levelStorage, const wstring& name, Dimension *dimension, LevelSettings *levelSettings, bool doCreateChunkSource) +Level::Level(shared_ptr levelStorage, const wstring& name, Dimension *dimension, LevelSettings *levelSettings, bool doCreateChunkSource) : seaLevel(constSeaLevel) { _init(); - this->levelStorage = levelStorage;//std::shared_ptr(levelStorage); + this->levelStorage = levelStorage;//shared_ptr(levelStorage); this->dimension = dimension; this->levelData = new LevelData(levelSettings, name); if( !this->levelData->useNewSeaLevel() ) seaLevel = Level::genDepth / 2; // 4J added - sea level is one unit lower since 1.8.2, maintain older height for old levels this->savedDataStorage = new SavedDataStorage(levelStorage.get()); - std::shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); + shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); if (savedVillages == NULL) { - villages = std::shared_ptr(new Villages(this)); + villages = shared_ptr(new Villages(this)); savedDataStorage->set(Villages::VILLAGE_FILE_ID, villages); } else @@ -597,10 +597,10 @@ Level::Level(Level *level, Dimension *dimension) if( !this->levelData->useNewSeaLevel() ) seaLevel = Level::genDepth / 2; // 4J added - sea level is one unit lower since 1.8.2, maintain older height for old levels this->savedDataStorage = new SavedDataStorage( levelStorage.get() ); - std::shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); + shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); if (savedVillages == NULL) { - villages = std::shared_ptr(new Villages(this)); + villages = shared_ptr(new Villages(this)); savedDataStorage->set(Villages::VILLAGE_FILE_ID, villages); } else @@ -617,29 +617,29 @@ Level::Level(Level *level, Dimension *dimension) } -Level::Level(std::shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings) +Level::Level(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings) : seaLevel( constSeaLevel ) { _init(levelStorage, levelName, levelSettings, NULL, true); } -Level::Level(std::shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource) +Level::Level(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource) : seaLevel( constSeaLevel ) { _init( levelStorage, levelName, levelSettings, fixedDimension, doCreateChunkSource ); } -void Level::_init(std::shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource) +void Level::_init(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource) { _init(); - this->levelStorage = levelStorage;//std::shared_ptr(levelStorage); + this->levelStorage = levelStorage;//shared_ptr(levelStorage); this->savedDataStorage = new SavedDataStorage(levelStorage.get()); - std::shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); + shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); if (savedVillages == NULL) { - villages = std::shared_ptr(new Villages(this)); + villages = shared_ptr(new Villages(this)); savedDataStorage->set(Villages::VILLAGE_FILE_ID, villages); } else @@ -1581,7 +1581,7 @@ HitResult *Level::clip(Vec3 *a, Vec3 *b, bool liquid, bool solidOnly) } -void Level::playSound(std::shared_ptr entity, int iSound, float volume, float pitch) +void Level::playSound(shared_ptr entity, int iSound, float volume, float pitch) { if(entity == NULL) return; AUTO_VAR(itEnd, listeners.end()); @@ -1648,7 +1648,7 @@ void Level::addParticle(ePARTICLE_TYPE id, double x, double y, double z, double (*it)->addParticle(id, x, y, z, xd, yd, zd); } -bool Level::addGlobalEntity(std::shared_ptr e) +bool Level::addGlobalEntity(shared_ptr e) { globalEntities.push_back(e); return true; @@ -1656,7 +1656,7 @@ bool Level::addGlobalEntity(std::shared_ptr e) #pragma optimize( "", off ) -bool Level::addEntity(std::shared_ptr e) +bool Level::addEntity(shared_ptr e) { int xc = Mth::floor(e->x / 16); int zc = Mth::floor(e->z / 16); @@ -1676,7 +1676,7 @@ bool Level::addEntity(std::shared_ptr e) { if (dynamic_pointer_cast( e ) != NULL) { - std::shared_ptr player = dynamic_pointer_cast(e); + shared_ptr player = dynamic_pointer_cast(e); // 4J Stu - Added so we don't continually add the player to the players list while they are dead if( find( players.begin(), players.end(), e ) == players.end() ) @@ -1704,7 +1704,7 @@ bool Level::addEntity(std::shared_ptr e) #pragma optimize( "", on ) -void Level::entityAdded(std::shared_ptr e) +void Level::entityAdded(shared_ptr e) { AUTO_VAR(itEnd, listeners.end()); for (AUTO_VAR(it, listeners.begin()); it != itEnd; it++) @@ -1714,7 +1714,7 @@ void Level::entityAdded(std::shared_ptr e) } -void Level::entityRemoved(std::shared_ptr e) +void Level::entityRemoved(shared_ptr e) { AUTO_VAR(itEnd, listeners.end()); for (AUTO_VAR(it, listeners.begin()); it != itEnd; it++) @@ -1724,7 +1724,7 @@ void Level::entityRemoved(std::shared_ptr e) } // 4J added -void Level::playerRemoved(std::shared_ptr e) +void Level::playerRemoved(shared_ptr e) { AUTO_VAR(itEnd, listeners.end()); for (AUTO_VAR(it, listeners.begin()); it != itEnd; it++) @@ -1733,7 +1733,7 @@ void Level::playerRemoved(std::shared_ptr e) } } -void Level::removeEntity(std::shared_ptr e) +void Level::removeEntity(shared_ptr e) { if (e->rider.lock() != NULL) { @@ -1746,8 +1746,8 @@ void Level::removeEntity(std::shared_ptr e) e->remove(); if (dynamic_pointer_cast( e ) != NULL) { - vector >::iterator it = players.begin(); - vector >::iterator itEnd = players.end(); + vector >::iterator it = players.begin(); + vector >::iterator itEnd = players.end(); while( it != itEnd && *it != dynamic_pointer_cast(e) ) it++; @@ -1762,14 +1762,14 @@ void Level::removeEntity(std::shared_ptr e) } -void Level::removeEntityImmediately(std::shared_ptr e) +void Level::removeEntityImmediately(shared_ptr e) { e->remove(); if (dynamic_pointer_cast( e ) != NULL) { - vector >::iterator it = players.begin(); - vector >::iterator itEnd = players.end(); + vector >::iterator it = players.begin(); + vector >::iterator itEnd = players.end(); while( it != itEnd && *it != dynamic_pointer_cast(e) ) it++; @@ -1790,8 +1790,8 @@ void Level::removeEntityImmediately(std::shared_ptr e) } EnterCriticalSection(&m_entitiesCS); - vector >::iterator it = entities.begin(); - vector >::iterator endIt = entities.end(); + vector >::iterator it = entities.begin(); + vector >::iterator endIt = entities.end(); while( it != endIt && *it != e) it++; @@ -1823,7 +1823,7 @@ void Level::removeListener(LevelListener *listener) // 4J - added noEntities and blockAtEdge parameter -AABBList *Level::getCubes(std::shared_ptr source, AABB *box, bool noEntities, bool blockAtEdge) +AABBList *Level::getCubes(shared_ptr source, AABB *box, bool noEntities, bool blockAtEdge) { boxes.clear(); int x0 = Mth::floor(box->x0); @@ -1895,8 +1895,8 @@ AABBList *Level::getCubes(std::shared_ptr source, AABB *box, bool noEnti if( noEntities ) return &boxes; double r = 0.25; - vector > *ee = getEntities(source, box->grow(r, r, r)); - vector >::iterator itEnd = ee->end(); + vector > *ee = getEntities(source, box->grow(r, r, r)); + vector >::iterator itEnd = ee->end(); for (AUTO_VAR(it, ee->begin()); it != itEnd; it++) { AABB *collideBox = (*it)->getCollideBox(); @@ -1986,7 +1986,7 @@ float Level::getSkyDarken(float a) -Vec3 *Level::getSkyColor(std::shared_ptr source, float a) +Vec3 *Level::getSkyColor(shared_ptr source, float a) { float td = getTimeOfDay(a); @@ -2197,10 +2197,10 @@ void Level::forceAddTileTick(int x, int y, int z, int tileId, int tickDelay) void Level::tickEntities() { //for (int i = 0; i < globalEntities.size(); i++) - vector >::iterator itGE = globalEntities.begin(); + vector >::iterator itGE = globalEntities.begin(); while( itGE != globalEntities.end() ) { - std::shared_ptr e = *itGE;//globalEntities.at(i); + shared_ptr e = *itGE;//globalEntities.at(i); e->tick(); if (e->removed) { @@ -2241,7 +2241,7 @@ void Level::tickEntities() AUTO_VAR(itETREnd, entitiesToRemove.end()); for (AUTO_VAR(it, entitiesToRemove.begin()); it != itETREnd; it++) { - std::shared_ptr e = *it;//entitiesToRemove.at(j); + shared_ptr e = *it;//entitiesToRemove.at(j); int xc = e->xChunk; int zc = e->zChunk; if (e->inChunk && hasChunk(xc, zc)) @@ -2267,7 +2267,7 @@ void Level::tickEntities() for (unsigned int i = 0; i < entities.size(); ) { - std::shared_ptr e = entities.at(i); + shared_ptr e = entities.at(i); if (e->riding != NULL) { @@ -2326,7 +2326,7 @@ void Level::tickEntities() updatingTileEntities = true; for (AUTO_VAR(it, tileEntityList.begin()); it != tileEntityList.end();) { - std::shared_ptr te = *it;//tilevector >.at(i); + shared_ptr te = *it;//tilevector >.at(i); if( !te->isRemoved() && te->hasLevel() ) { if (hasChunkAt(te->x, te->y, te->z)) @@ -2394,7 +2394,7 @@ void Level::tickEntities() { for( AUTO_VAR(it, pendingTileEntities.begin()); it != pendingTileEntities.end(); it++ ) { - std::shared_ptr e = *it; + shared_ptr e = *it; if( !e->isRemoved() ) { if( find(tileEntityList.begin(),tileEntityList.end(),e) == tileEntityList.end() ) @@ -2415,7 +2415,7 @@ void Level::tickEntities() LeaveCriticalSection(&m_tileEntityListCS); } -void Level::addAllPendingTileEntities(vector< std::shared_ptr >& entities) +void Level::addAllPendingTileEntities(vector< shared_ptr >& entities) { EnterCriticalSection(&m_tileEntityListCS); if( updatingTileEntities ) @@ -2435,13 +2435,13 @@ void Level::addAllPendingTileEntities(vector< std::shared_ptr >& ent LeaveCriticalSection(&m_tileEntityListCS); } -void Level::tick(std::shared_ptr e) +void Level::tick(shared_ptr e) { tick(e, true); } -void Level::tick(std::shared_ptr e, bool actual) +void Level::tick(shared_ptr e, bool actual) { int xc = Mth::floor(e->x); int zc = Mth::floor(e->z); @@ -2537,13 +2537,13 @@ bool Level::isUnobstructed(AABB *aabb) return isUnobstructed(aabb, nullptr); } -bool Level::isUnobstructed(AABB *aabb, std::shared_ptr ignore) +bool Level::isUnobstructed(AABB *aabb, shared_ptr ignore) { - vector > *ents = getEntities(nullptr, aabb); + vector > *ents = getEntities(nullptr, aabb); AUTO_VAR(itEnd, ents->end()); for (AUTO_VAR(it, ents->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; + shared_ptr e = *it; if (!e->removed && e->blocksBuilding && e != ignore) return false; } return true; @@ -2658,7 +2658,7 @@ bool Level::containsFireTile(AABB *box) } -bool Level::checkAndHandleWater(AABB *box, Material *material, std::shared_ptr e) +bool Level::checkAndHandleWater(AABB *box, Material *material, shared_ptr e) { int x0 = Mth::floor(box->x0); int x1 = Mth::floor(box->x1 + 1); @@ -2758,15 +2758,15 @@ bool Level::containsLiquid(AABB *box, Material *material) } -std::shared_ptr Level::explode(std::shared_ptr source, double x, double y, double z, float r, bool destroyBlocks) +shared_ptr Level::explode(shared_ptr source, double x, double y, double z, float r, bool destroyBlocks) { return explode(source, x, y, z, r, false, destroyBlocks); } -std::shared_ptr Level::explode(std::shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks) +shared_ptr Level::explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks) { - std::shared_ptr explosion = std::shared_ptr( new Explosion(this, source, x, y, z, r) ); + shared_ptr explosion = shared_ptr( new Explosion(this, source, x, y, z, r) ); explosion->fire = fire; explosion->destroyBlocks = destroyBlocks; explosion->explode(); @@ -2799,7 +2799,7 @@ float Level::getSeenPercent(Vec3 *center, AABB *bb) } -bool Level::extinguishFire(std::shared_ptr player, int x, int y, int z, int face) +bool Level::extinguishFire(shared_ptr player, int x, int y, int z, int face) { if (face == 0) y--; if (face == 1) y++; @@ -2818,9 +2818,9 @@ bool Level::extinguishFire(std::shared_ptr player, int x, int y, int z, } /* -std::shared_ptr Level::findSubclassOf(Entity::Class *entityClass) +shared_ptr Level::findSubclassOf(Entity::Class *entityClass) { - return std::shared_ptr(); + return shared_ptr(); } */ @@ -2841,7 +2841,7 @@ wstring Level::gatherChunkSourceStats() } -std::shared_ptr Level::getTileEntity(int x, int y, int z) +shared_ptr Level::getTileEntity(int x, int y, int z) { if (y >= Level::maxBuildHeight) { @@ -2852,14 +2852,14 @@ std::shared_ptr Level::getTileEntity(int x, int y, int z) if (lc != NULL) { - std::shared_ptr tileEntity = lc->getTileEntity(x & 15, y, z & 15); + shared_ptr tileEntity = lc->getTileEntity(x & 15, y, z & 15); if (tileEntity == NULL) { EnterCriticalSection(&m_tileEntityListCS); for( AUTO_VAR(it, pendingTileEntities.begin()); it != pendingTileEntities.end(); it++ ) { - std::shared_ptr e = *it; + shared_ptr e = *it; if (!e->isRemoved() && e->x == x && e->y == y && e->z == z) { @@ -2876,7 +2876,7 @@ std::shared_ptr Level::getTileEntity(int x, int y, int z) } -void Level::setTileEntity(int x, int y, int z, std::shared_ptr tileEntity) +void Level::setTileEntity(int x, int y, int z, shared_ptr tileEntity) { if (tileEntity != NULL && !tileEntity->isRemoved()) { @@ -2905,7 +2905,7 @@ void Level::setTileEntity(int x, int y, int z, std::shared_ptr tileE void Level::removeTileEntity(int x, int y, int z) { EnterCriticalSection(&m_tileEntityListCS); - std::shared_ptr te = getTileEntity(x, y, z); + shared_ptr te = getTileEntity(x, y, z); if (te != NULL && updatingTileEntities) { te->setRemoved(); @@ -2936,7 +2936,7 @@ void Level::removeTileEntity(int x, int y, int z) LeaveCriticalSection(&m_tileEntityListCS); } -void Level::markForRemoval(std::shared_ptr entity) +void Level::markForRemoval(shared_ptr entity) { tileEntitiesToUnload.push_back(entity); } @@ -3163,7 +3163,7 @@ void Level::buildAndPrepareChunksToPoll() AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) { - std::shared_ptr player = *it; + shared_ptr player = *it; int xx = Mth::floor(player->x / 16); int zz = Mth::floor(player->z / 16); @@ -3183,7 +3183,7 @@ void Level::buildAndPrepareChunksToPoll() int *zz = new int[playerCount]; for (int i = 0; i < playerCount; i++) { - std::shared_ptr player = players[i]; + shared_ptr player = players[i]; xx[i] = Mth::floor(player->x / 16); zz[i] = Mth::floor(player->z / 16); chunksToPoll.insert(ChunkPos(xx[i], zz[i] )); @@ -3239,7 +3239,7 @@ void Level::tickClientSideTiles(int xo, int zo, LevelChunk *lc) z += zo; if (id == 0 && this->getDaytimeRawBrightness(x, y, z) <= random->nextInt(8) && getBrightness(LightLayer::Sky, x, y, z) <= 0) { - std::shared_ptr player = getNearestPlayer(x + 0.5, y + 0.5, z + 0.5, 8); + shared_ptr player = getNearestPlayer(x + 0.5, y + 0.5, z + 0.5, 8); if (player != NULL && player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 2 * 2) { // 4J-PB - Fixed issue with cave audio event having 2 sounds at 192k @@ -3728,7 +3728,7 @@ vector *Level::fetchTicksInChunk(LevelChunk *chunk, bool remov } -vector > *Level::getEntities(std::shared_ptr except, AABB *bb) +vector > *Level::getEntities(shared_ptr except, AABB *bb) { MemSect(40); es.clear(); @@ -3768,13 +3768,13 @@ vector > *Level::getEntities(std::shared_ptr exc } -vector > *Level::getEntitiesOfClass(const type_info& baseClass, AABB *bb) +vector > *Level::getEntitiesOfClass(const type_info& baseClass, AABB *bb) { int xc0 = Mth::floor((bb->x0 - 2) / 16); int xc1 = Mth::floor((bb->x1 + 2) / 16); int zc0 = Mth::floor((bb->z0 - 2) / 16); int zc1 = Mth::floor((bb->z1 + 2) / 16); - vector > *es = new vector >(); + vector > *es = new vector >(); #ifdef __PSVITA__ #ifdef _ENTITIES_RW_SECTION @@ -3805,15 +3805,15 @@ vector > *Level::getEntitiesOfClass(const type_info& bas return es; } -std::shared_ptr Level::getClosestEntityOfClass(const type_info& baseClass, AABB *bb, std::shared_ptr source) +shared_ptr Level::getClosestEntityOfClass(const type_info& baseClass, AABB *bb, shared_ptr source) { - vector > *entities = getEntitiesOfClass(baseClass, bb); - std::shared_ptr closest = nullptr; + vector > *entities = getEntitiesOfClass(baseClass, bb); + shared_ptr closest = nullptr; double closestDistSqr = Double::MAX_VALUE; //for (Entity entity : entities) for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - std::shared_ptr entity = *it; + shared_ptr entity = *it; if (entity == source) continue; double distSqr = source->distanceToSqr(entity); if (distSqr > closestDistSqr) continue; @@ -3824,16 +3824,16 @@ std::shared_ptr Level::getClosestEntityOfClass(const type_info& baseClas return closest; } -vector > Level::getAllEntities() +vector > Level::getAllEntities() { EnterCriticalSection(&m_entitiesCS); - vector > retVec = entities; + vector > retVec = entities; LeaveCriticalSection(&m_entitiesCS); return retVec; } -void Level::tileEntityChanged(int x, int y, int z, std::shared_ptr te) +void Level::tileEntityChanged(int x, int y, int z, shared_ptr te) { if (this->hasChunkAt(x, y, z)) { @@ -3849,7 +3849,7 @@ unsigned int Level::countInstanceOf(BaseObject::Class *clas) AUTO_VAR(itEnd, entities.end()); for (AUTO_VAR(it, entities.begin()); it != itEnd; it++) { - std::shared_ptr e = *it;//entities.at(i); + shared_ptr e = *it;//entities.at(i); if (clas->isAssignableFrom(e->getClass())) count++; } LeaveCriticalSection(&m_entitiesCS); @@ -3869,7 +3869,7 @@ unsigned int Level::countInstanceOf(eINSTANCEOF clas, bool singleType, unsigned AUTO_VAR(itEnd, entities.end()); for (AUTO_VAR(it, entities.begin()); it != itEnd; it++) { - std::shared_ptr e = *it;//entities.at(i); + shared_ptr e = *it;//entities.at(i); if( singleType ) { if (e->GetType() == clas) @@ -3904,7 +3904,7 @@ unsigned int Level::countInstanceOfInRange(eINSTANCEOF clas, bool singleType, in AUTO_VAR(itEnd, entities.end()); for (AUTO_VAR(it, entities.begin()); it != itEnd; it++) { - std::shared_ptr e = *it;//entities.at(i); + shared_ptr e = *it;//entities.at(i); float sd = e->distanceTo(x,y,z); if (sd * sd > range * range) @@ -3932,7 +3932,7 @@ unsigned int Level::countInstanceOfInRange(eINSTANCEOF clas, bool singleType, in return count; } -void Level::addEntities(vector > *list) +void Level::addEntities(vector > *list) { //entities.addAll(list); EnterCriticalSection(&m_entitiesCS); @@ -3973,13 +3973,13 @@ void Level::addEntities(vector > *list) } -void Level::removeEntities(vector > *list) +void Level::removeEntities(vector > *list) { //entitiesToRemove.addAll(list); entitiesToRemove.insert(entitiesToRemove.end(), list->begin(), list->end()); } -bool Level::mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int face, std::shared_ptr ignoreEntity) +bool Level::mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int face, shared_ptr ignoreEntity) { int targetType = getTile(x, y, z); Tile *targetTile = Tile::tiles[targetType]; @@ -4010,7 +4010,7 @@ int Level::getSeaLevel() } -Path *Level::findPath(std::shared_ptr from, std::shared_ptr to, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat) +Path *Level::findPath(shared_ptr from, shared_ptr to, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat) { int x = Mth::floor(from->x); int y = Mth::floor(from->y + 1); @@ -4029,7 +4029,7 @@ Path *Level::findPath(std::shared_ptr from, std::shared_ptr to, } -Path *Level::findPath(std::shared_ptr from, int xBest, int yBest, int zBest, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat) +Path *Level::findPath(shared_ptr from, int xBest, int yBest, int zBest, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat) { int x = Mth::floor(from->x); int y = Mth::floor(from->y); @@ -4092,21 +4092,21 @@ bool Level::hasNeighborSignal(int x, int y, int z) } // 4J Stu - Added maxYDist param -std::shared_ptr Level::getNearestPlayer(std::shared_ptr source, double maxDist, double maxYDist /*= -1*/) +shared_ptr Level::getNearestPlayer(shared_ptr source, double maxDist, double maxYDist /*= -1*/) { return getNearestPlayer(source->x, source->y, source->z, maxDist, maxYDist); } // 4J Stu - Added maxYDist param -std::shared_ptr Level::getNearestPlayer(double x, double y, double z, double maxDist, double maxYDist /*= -1*/) +shared_ptr Level::getNearestPlayer(double x, double y, double z, double maxDist, double maxYDist /*= -1*/) { MemSect(21); double best = -1; - std::shared_ptr result = nullptr; + shared_ptr result = nullptr; AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) { - std::shared_ptr p = *it;//players.at(i); + shared_ptr p = *it;//players.at(i); double dist = p->distanceToSqr(x, y, z); // Allow specifying shorter distances in the vertical @@ -4123,14 +4123,14 @@ std::shared_ptr Level::getNearestPlayer(double x, double y, double z, do return result; } -std::shared_ptr Level::getNearestPlayer(double x, double z, double maxDist) +shared_ptr Level::getNearestPlayer(double x, double z, double maxDist) { double best = -1; - std::shared_ptr result = nullptr; + shared_ptr result = nullptr; AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) { - std::shared_ptr p = *it; + shared_ptr p = *it; double dist = p->distanceToSqr(x, p->y, z); if ((maxDist < 0 || dist < maxDist * maxDist) && (best == -1 || dist < best)) { @@ -4141,20 +4141,20 @@ std::shared_ptr Level::getNearestPlayer(double x, double z, double maxDi return result; } -std::shared_ptr Level::getNearestAttackablePlayer(std::shared_ptr source, double maxDist) +shared_ptr Level::getNearestAttackablePlayer(shared_ptr source, double maxDist) { return getNearestAttackablePlayer(source->x, source->y, source->z, maxDist); } -std::shared_ptr Level::getNearestAttackablePlayer(double x, double y, double z, double maxDist) +shared_ptr Level::getNearestAttackablePlayer(double x, double y, double z, double maxDist) { double best = -1; - std::shared_ptr result = nullptr; + shared_ptr result = nullptr; AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) { - std::shared_ptr p = *it; + shared_ptr p = *it; if (p->abilities.invulnerable) { @@ -4190,7 +4190,7 @@ std::shared_ptr Level::getNearestAttackablePlayer(double x, double y, do return result; } -std::shared_ptr Level::getPlayerByName(const wstring& name) +shared_ptr Level::getPlayerByName(const wstring& name) { AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) @@ -4200,10 +4200,10 @@ std::shared_ptr Level::getPlayerByName(const wstring& name) return *it; //players.at(i); } } - return std::shared_ptr(); + return shared_ptr(); } -std::shared_ptr Level::getPlayerByUUID(const wstring& name) +shared_ptr Level::getPlayerByUUID(const wstring& name) { AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) @@ -4213,7 +4213,7 @@ std::shared_ptr Level::getPlayerByUUID(const wstring& name) return *it; //players.at(i); } } - return std::shared_ptr(); + return shared_ptr(); } // 4J Stu - Removed in 1.2.3 ? @@ -4353,7 +4353,7 @@ void Level::setTime(int64_t time) if ( timeDiff > 0 && levelData->getTime() != -1 ) { AUTO_VAR(itEnd, players.end()); - for (vector >::iterator it = players.begin(); it != itEnd; it++) + for (vector >::iterator it = players.begin(); it != itEnd; it++) { (*it)->awardStat( GenericStats::timePlayed(), GenericStats::param_time(timeDiff) ); } @@ -4396,7 +4396,7 @@ void Level::setSpawnPos(Pos *spawnPos) } -void Level::ensureAdded(std::shared_ptr entity) +void Level::ensureAdded(shared_ptr entity) { int xc = Mth::floor(entity->x / 16); int zc = Mth::floor(entity->z / 16); @@ -4419,13 +4419,13 @@ void Level::ensureAdded(std::shared_ptr entity) } -bool Level::mayInteract(std::shared_ptr player, int xt, int yt, int zt, int content) +bool Level::mayInteract(shared_ptr player, int xt, int yt, int zt, int content) { return true; } -void Level::broadcastEntityEvent(std::shared_ptr e, byte event) +void Level::broadcastEntityEvent(shared_ptr e, byte event) { } @@ -4506,13 +4506,13 @@ bool Level::isHumidAt(int x, int y, int z) } -void Level::setSavedData(const wstring& id, std::shared_ptr data) +void Level::setSavedData(const wstring& id, shared_ptr data) { savedDataStorage->set(id, data); } -std::shared_ptr Level::getSavedData(const type_info& clazz, const wstring& id) +shared_ptr Level::getSavedData(const type_info& clazz, const wstring& id) { return savedDataStorage->get(clazz, id); } @@ -4544,7 +4544,7 @@ void Level::levelEvent(int type, int x, int y, int z, int data) } -void Level::levelEvent(std::shared_ptr source, int type, int x, int y, int z, int data) +void Level::levelEvent(shared_ptr source, int type, int x, int y, int z, int data) { AUTO_VAR(itEnd, listeners.end()); for (AUTO_VAR(it, listeners.begin()); it != itEnd; it++) diff --git a/Minecraft.World/Level.h b/Minecraft.World/Level.h index abf2489d..ecafc02b 100644 --- a/Minecraft.World/Level.h +++ b/Minecraft.World/Level.h @@ -92,22 +92,22 @@ public: public: CRITICAL_SECTION m_entitiesCS; // 4J added - vector > entities; + vector > entities; protected: - vector > entitiesToRemove; + vector > entitiesToRemove; public: bool hasEntitiesToRemove(); // 4J added bool m_bDisableAddNewTileEntities; // 4J Added CRITICAL_SECTION m_tileEntityListCS; // 4J added - vector > tileEntityList; + vector > tileEntityList; private: - vector > pendingTileEntities; - vector > tileEntitiesToUnload; + vector > pendingTileEntities; + vector > tileEntitiesToUnload; bool updatingTileEntities; public: - vector > players; - vector > globalEntities; + vector > players; + vector > globalEntities; private: int cloudColor; @@ -140,16 +140,16 @@ protected: public: ChunkSource *chunkSource; // 4J - changed to public protected: - // This is the only std::shared_ptr ref to levelStorage - we need to keep this as long as at least one Level references it, + // This is the only shared_ptr ref to levelStorage - we need to keep this as long as at least one Level references it, // to be able to cope with moving from dimension to dimension where the Level(Level *level, Dimension *dimension) ctor is used - std::shared_ptr levelStorage; + shared_ptr levelStorage; LevelData *levelData; public: bool isFindingSpawn; SavedDataStorage *savedDataStorage; - std::shared_ptr villages; + shared_ptr villages; VillageSiege *villageSiege; public: @@ -160,13 +160,13 @@ private: // 4J Stu - Added these ctors to handle init of member variables void _init(); - void _init(std::shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource = true); + void _init(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource = true); public: - Level(std::shared_ptrlevelStorage, const wstring& name, Dimension *dimension, LevelSettings *levelSettings, bool doCreateChunkSource = true); + Level(shared_ptrlevelStorage, const wstring& name, Dimension *dimension, LevelSettings *levelSettings, bool doCreateChunkSource = true); Level(Level *level, Dimension *dimension); - Level(std::shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings); - Level(std::shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource = true); + Level(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings); + Level(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource = true); virtual ~Level(); @@ -278,7 +278,7 @@ public: HitResult *clip(Vec3 *a, Vec3 *b, bool liquid); HitResult *clip(Vec3 *a, Vec3 *b, bool liquid, bool solidOnly); - virtual void playSound(std::shared_ptr entity, int iSound, float volume, float pitch); + virtual void playSound(shared_ptr entity, int iSound, float volume, float pitch); virtual void playSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist=16.0f); virtual void playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist=16.0f); @@ -287,17 +287,17 @@ public: void playMusic(double x, double y, double z, const wstring& string, float volume); // 4J removed - void addParticle(const wstring& id, double x, double y, double z, double xd, double yd, double zd); void addParticle(ePARTICLE_TYPE id, double x, double y, double z, double xd, double yd, double zd); // 4J added - virtual bool addGlobalEntity(std::shared_ptr e); - virtual bool addEntity(std::shared_ptr e); + virtual bool addGlobalEntity(shared_ptr e); + virtual bool addEntity(shared_ptr e); protected: - virtual void entityAdded(std::shared_ptr e); - virtual void entityRemoved(std::shared_ptr e); - virtual void playerRemoved(std::shared_ptr e); // 4J added + virtual void entityAdded(shared_ptr e); + virtual void entityRemoved(shared_ptr e); + virtual void playerRemoved(shared_ptr e); // 4J added public: - virtual void removeEntity(std::shared_ptr e); - void removeEntityImmediately(std::shared_ptr e); + virtual void removeEntity(shared_ptr e); + void removeEntityImmediately(shared_ptr e); void addListener(LevelListener *listener); void removeListener(LevelListener *listener); @@ -305,11 +305,11 @@ private: AABBList boxes; public: - AABBList *getCubes(std::shared_ptr source, AABB *box, bool noEntities=false, bool blockAtEdge=false); // 4J - added noEntities & blockAtEdge parameters + AABBList *getCubes(shared_ptr source, AABB *box, bool noEntities=false, bool blockAtEdge=false); // 4J - added noEntities & blockAtEdge parameters AABBList *getTileCubes(AABB *box, bool blockAtEdge); // 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player int getOldSkyDarken(float a); // 4J - change brought forward from 1.8.2 float getSkyDarken(float a); // 4J - change brought forward from 1.8.2 - Vec3 *getSkyColor(std::shared_ptr source, float a); + Vec3 *getSkyColor(shared_ptr source, float a); float getTimeOfDay(float a); int getMoonPhase(float a); float getSunAngle(float a); @@ -324,29 +324,29 @@ public: virtual void addToTickNextTick(int x, int y, int z, int tileId, int tickDelay); virtual void forceAddTileTick(int x, int y, int z, int tileId, int tickDelay); virtual void tickEntities(); - void addAllPendingTileEntities(vector< std::shared_ptr >& entities); - void tick(std::shared_ptr e); - virtual void tick(std::shared_ptr e, bool actual); + void addAllPendingTileEntities(vector< shared_ptr >& entities); + void tick(shared_ptr e); + virtual void tick(shared_ptr e, bool actual); bool isUnobstructed(AABB *aabb); - bool isUnobstructed(AABB *aabb, std::shared_ptr ignore); + bool isUnobstructed(AABB *aabb, shared_ptr ignore); bool containsAnyBlocks(AABB *box); bool containsAnyLiquid(AABB *box); bool containsAnyLiquid_NoLoad(AABB *box); // 4J added bool containsFireTile(AABB *box); - bool checkAndHandleWater(AABB *box, Material *material, std::shared_ptr e); + bool checkAndHandleWater(AABB *box, Material *material, shared_ptr e); bool containsMaterial(AABB *box, Material *material); bool containsLiquid(AABB *box, Material *material); // 4J Stu - destroyBlocks param brought forward as part of fix for tnt cannons - std::shared_ptr explode(std::shared_ptr source, double x, double y, double z, float r, bool destroyBlocks); - virtual std::shared_ptr explode(std::shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks); + shared_ptr explode(shared_ptr source, double x, double y, double z, float r, bool destroyBlocks); + virtual shared_ptr explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks); float getSeenPercent(Vec3 *center, AABB *bb); - bool extinguishFire(std::shared_ptr player, int x, int y, int z, int face); + bool extinguishFire(shared_ptr player, int x, int y, int z, int face); wstring gatherStats(); wstring gatherChunkSourceStats(); - virtual std::shared_ptr getTileEntity(int x, int y, int z); - void setTileEntity(int x, int y, int z, std::shared_ptr tileEntity); + virtual shared_ptr getTileEntity(int x, int y, int z); + void setTileEntity(int x, int y, int z, shared_ptr tileEntity); void removeTileEntity(int x, int y, int z); - void markForRemoval(std::shared_ptr entity); + void markForRemoval(shared_ptr entity); virtual bool isSolidRenderTile(int x, int y, int z); virtual bool isSolidBlockingTile(int x, int y, int z); bool isSolidBlockingTileInLoadedChunk(int x, int y, int z, bool valueIfNotLoaded); @@ -413,38 +413,38 @@ public: virtual vector *fetchTicksInChunk(LevelChunk *chunk, bool remove); private: - vector > es; + vector > es; public: bool isClientSide; - vector > *getEntities(std::shared_ptr except, AABB *bb); - vector > *getEntitiesOfClass(const type_info& baseClass, AABB *bb); - std::shared_ptr getClosestEntityOfClass(const type_info& baseClass, AABB *bb, std::shared_ptr source); - vector > getAllEntities(); - void tileEntityChanged(int x, int y, int z, std::shared_ptr te); + vector > *getEntities(shared_ptr except, AABB *bb); + vector > *getEntitiesOfClass(const type_info& baseClass, AABB *bb); + shared_ptr getClosestEntityOfClass(const type_info& baseClass, AABB *bb, shared_ptr source); + vector > getAllEntities(); + void tileEntityChanged(int x, int y, int z, shared_ptr te); // unsigned int countInstanceOf(BaseObject::Class *clas); unsigned int countInstanceOf(eINSTANCEOF clas, bool singleType, unsigned int *protectedCount = NULL, unsigned int *couldWanderCount = NULL); // 4J added unsigned int countInstanceOfInRange(eINSTANCEOF clas, bool singleType, int range, int x, int y, int z); // 4J Added - void addEntities(vector > *list); - virtual void removeEntities(vector > *list); - bool mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int face, std::shared_ptr ignoreEntity); + void addEntities(vector > *list); + virtual void removeEntities(vector > *list); + bool mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int face, shared_ptr ignoreEntity); int getSeaLevel(); - Path *findPath(std::shared_ptr from, std::shared_ptr to, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat); - Path *findPath(std::shared_ptr from, int xBest, int yBest, int zBest, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat); + Path *findPath(shared_ptr from, shared_ptr to, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat); + Path *findPath(shared_ptr from, int xBest, int yBest, int zBest, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat); bool getDirectSignal(int x, int y, int z, int dir); bool hasDirectSignal(int x, int y, int z); bool getSignal(int x, int y, int z, int dir); bool hasNeighborSignal(int x, int y, int z); // 4J Added maxYDist param - std::shared_ptr getNearestPlayer(std::shared_ptr source, double maxDist, double maxYDist = -1); - std::shared_ptr getNearestPlayer(double x, double y, double z, double maxDist, double maxYDist = -1); - std::shared_ptr getNearestPlayer(double x, double z, double maxDist); - std::shared_ptr getNearestAttackablePlayer(std::shared_ptr source, double maxDist); - std::shared_ptr getNearestAttackablePlayer(double x, double y, double z, double maxDist); - - std::shared_ptr getPlayerByName(const wstring& name); - std::shared_ptr getPlayerByUUID(const wstring& name); // 4J Added + shared_ptr getNearestPlayer(shared_ptr source, double maxDist, double maxYDist = -1); + shared_ptr getNearestPlayer(double x, double y, double z, double maxDist, double maxYDist = -1); + shared_ptr getNearestPlayer(double x, double z, double maxDist); + shared_ptr getNearestAttackablePlayer(shared_ptr source, double maxDist); + shared_ptr getNearestAttackablePlayer(double x, double y, double z, double maxDist); + + shared_ptr getPlayerByName(const wstring& name); + shared_ptr getPlayerByUUID(const wstring& name); // 4J Added byteArray getBlocksAndData(int x, int y, int z, int xs, int ys, int zs, bool includeLighting = true); void setBlocksAndData(int x, int y, int z, int xs, int ys, int zs, byteArray data, bool includeLighting = true); virtual void disconnect(bool sendDisconnect = true); @@ -456,9 +456,9 @@ public: Pos *getSharedSpawnPos(); void setSpawnPos(int x, int y, int z); void setSpawnPos(Pos *spawnPos); - void ensureAdded(std::shared_ptr entity); - virtual bool mayInteract(std::shared_ptr player, int xt, int yt, int zt, int content); - virtual void broadcastEntityEvent(std::shared_ptr e, byte event); + void ensureAdded(shared_ptr entity); + virtual bool mayInteract(shared_ptr player, int xt, int yt, int zt, int content); + virtual void broadcastEntityEvent(shared_ptr e, byte event); ChunkSource *getChunkSource(); virtual void tileEvent(int x, int y, int z, int tile, int b0, int b1); LevelStorage *getLevelStorage(); @@ -476,11 +476,11 @@ public: bool isRaining(); bool isRainingAt(int x, int y, int z); bool isHumidAt(int x, int y, int z); - void setSavedData(const wstring& id, std::shared_ptr data); - std::shared_ptr getSavedData(const type_info& clazz, const wstring& id); + void setSavedData(const wstring& id, shared_ptr data); + shared_ptr getSavedData(const type_info& clazz, const wstring& id); int getFreeAuxValueFor(const wstring& id); void levelEvent(int type, int x, int y, int z, int data); - void levelEvent(std::shared_ptr source, int type, int x, int y, int z, int data); + void levelEvent(shared_ptr source, int type, int x, int y, int z, int data); int getMaxBuildHeight(); int getHeight(); Random *getRandomFor(int x, int z, int blend); diff --git a/Minecraft.World/LevelChunk.cpp b/Minecraft.World/LevelChunk.cpp index b27fb611..332f12f5 100644 --- a/Minecraft.World/LevelChunk.cpp +++ b/Minecraft.World/LevelChunk.cpp @@ -58,7 +58,7 @@ void LevelChunk::init(Level *level, int x, int z) #else EnterCriticalSection(&m_csEntities); #endif - entityBlocks = new vector > *[ENTITY_BLOCKS_LENGTH]; + entityBlocks = new vector > *[ENTITY_BLOCKS_LENGTH]; #ifdef _ENTITIES_RW_SECTION LeaveCriticalRWSection(&m_csEntities, true); #else @@ -90,7 +90,7 @@ void LevelChunk::init(Level *level, int x, int z) #endif for (int i = 0; i < ENTITY_BLOCKS_LENGTH; i++) { - entityBlocks[i] = new vector >(); + entityBlocks[i] = new vector >(); } #ifdef _ENTITIES_RW_SECTION LeaveCriticalRWSection(&m_csEntities, true); @@ -1016,7 +1016,7 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) // if (_tile > 0 && dynamic_cast(Tile::tiles[_tile]) != NULL) if (_tile > 0 && Tile::tiles[_tile] != NULL && Tile::tiles[_tile]->isEntityTile()) { - std::shared_ptr te = getTileEntity(x, y, z); + shared_ptr te = getTileEntity(x, y, z); if (te == NULL) { te = ((EntityTile *) Tile::tiles[_tile])->newTileEntity(level); @@ -1034,7 +1034,7 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) // else if (old > 0 && dynamic_cast(Tile::tiles[old]) != NULL) else if (old > 0 && Tile::tiles[_tile] != NULL && Tile::tiles[_tile]->isEntityTile()) { - std::shared_ptr te = getTileEntity(x, y, z); + shared_ptr te = getTileEntity(x, y, z); if (te != NULL) { te->clearCache(); @@ -1074,7 +1074,7 @@ bool LevelChunk::setData(int x, int y, int z, int val, int mask, bool *maskedBit int _tile = getTile(x, y, z); if (_tile > 0 && dynamic_cast( Tile::tiles[_tile] ) != NULL) { - std::shared_ptr te = getTileEntity(x, y, z); + shared_ptr te = getTileEntity(x, y, z); if (te != NULL) { te->clearCache(); @@ -1166,7 +1166,7 @@ int LevelChunk::getRawBrightness(int x, int y, int z, int skyDampen) return light; } -void LevelChunk::addEntity(std::shared_ptr e) +void LevelChunk::addEntity(shared_ptr e) { lastSaveHadEntities = true; @@ -1200,12 +1200,12 @@ void LevelChunk::addEntity(std::shared_ptr e) } -void LevelChunk::removeEntity(std::shared_ptr e) +void LevelChunk::removeEntity(shared_ptr e) { removeEntity(e, e->yChunk); } -void LevelChunk::removeEntity(std::shared_ptr e, int yc) +void LevelChunk::removeEntity(shared_ptr e, int yc) { if (yc < 0) yc = 0; if (yc >= ENTITY_BLOCKS_LENGTH) yc = ENTITY_BLOCKS_LENGTH - 1; @@ -1261,14 +1261,14 @@ void LevelChunk::skyBrightnessChanged() level->setTilesDirty(x0, y0, z0, x1, y1, z1); } -std::shared_ptr LevelChunk::getTileEntity(int x, int y, int z) +shared_ptr LevelChunk::getTileEntity(int x, int y, int z) { TilePos pos(x, y, z); // 4J Stu - Changed as we should not be using the [] accessor (causes an insert when we don't want one) - //std::shared_ptr tileEntity = tileEntities[pos]; + //shared_ptr tileEntity = tileEntities[pos]; EnterCriticalSection(&m_csTileEntities); - std::shared_ptr tileEntity = nullptr; + shared_ptr tileEntity = nullptr; AUTO_VAR(it, tileEntities.find(pos)); if (it == tileEntities.end()) @@ -1320,7 +1320,7 @@ std::shared_ptr LevelChunk::getTileEntity(int x, int y, int z) return tileEntity; } -void LevelChunk::addTileEntity(std::shared_ptr te) +void LevelChunk::addTileEntity(shared_ptr te) { int xx = (int)(te->x - this->x * 16); int yy = (int)te->y; @@ -1334,7 +1334,7 @@ void LevelChunk::addTileEntity(std::shared_ptr te) } } -void LevelChunk::setTileEntity(int x, int y, int z, std::shared_ptr tileEntity) +void LevelChunk::setTileEntity(int x, int y, int z, shared_ptr tileEntity) { TilePos pos(x, y, z); @@ -1371,7 +1371,7 @@ void LevelChunk::removeTileEntity(int x, int y, int z) AUTO_VAR(it, tileEntities.find(pos)); if( it != tileEntities.end() ) { - std::shared_ptr te = tileEntities[pos]; + shared_ptr te = tileEntities[pos]; tileEntities.erase(pos); if( te != NULL ) { @@ -1401,7 +1401,7 @@ void LevelChunk::load() for (int i = 0; i < entityTags->size(); i++) { CompoundTag *teTag = entityTags->get(i); - std::shared_ptr te = EntityIO::loadStatic(teTag, level); + shared_ptr te = EntityIO::loadStatic(teTag, level); if (te != NULL) { addEntity(te); @@ -1415,7 +1415,7 @@ void LevelChunk::load() for (int i = 0; i < tileEntityTags->size(); i++) { CompoundTag *teTag = tileEntityTags->get(i); - std::shared_ptr te = TileEntity::loadStatic(teTag); + shared_ptr te = TileEntity::loadStatic(teTag); if (te != NULL) { addTileEntity(te); @@ -1428,7 +1428,7 @@ void LevelChunk::load() } #endif - vector< std::shared_ptr > values; + vector< shared_ptr > values; EnterCriticalSection(&m_csTileEntities); for( AUTO_VAR(it, tileEntities.begin()); it != tileEntities.end(); it++ ) { @@ -1506,9 +1506,9 @@ void LevelChunk::unload(bool unloadTileEntities) // 4J - added parameter for (int i = 0; i < ENTITY_BLOCKS_LENGTH; i++) { AUTO_VAR(itEnd, entityBlocks[i]->end()); - for( vector >::iterator it = entityBlocks[i]->begin(); it != itEnd; it++ ) + for( vector >::iterator it = entityBlocks[i]->begin(); it != itEnd; it++ ) { - std::shared_ptr e = *it; + shared_ptr e = *it; CompoundTag *teTag = new CompoundTag(); if (e->save(teTag)) { @@ -1529,10 +1529,10 @@ void LevelChunk::unload(bool unloadTileEntities) // 4J - added parameter ListTag *tileEntityTags = new ListTag(); AUTO_VAR(itEnd,tileEntities.end()); - for( unordered_map, TilePosKeyHash, TilePosKeyEq>::iterator it = tileEntities.begin(); + for( unordered_map, TilePosKeyHash, TilePosKeyEq>::iterator it = tileEntities.begin(); it != itEnd; it++) { - std::shared_ptr te = it->second; + shared_ptr te = it->second; CompoundTag *teTag = new CompoundTag(); te->save(teTag); tileEntityTags->add(teTag); @@ -1560,7 +1560,7 @@ void LevelChunk::markUnsaved() } -void LevelChunk::getEntities(std::shared_ptr except, AABB *bb, vector > &es) +void LevelChunk::getEntities(shared_ptr except, AABB *bb, vector > &es) { int yc0 = Mth::floor((bb->y0 - 2) / 16); int yc1 = Mth::floor((bb->y1 + 2) / 16); @@ -1573,16 +1573,16 @@ void LevelChunk::getEntities(std::shared_ptr except, AABB *bb, vector > *entities = entityBlocks[yc]; + vector > *entities = entityBlocks[yc]; AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //entities->at(i); + shared_ptr e = *it; //entities->at(i); if (e != except && e->bb->intersects(bb)) { es.push_back(e); - vector > *subs = e->getSubEntities(); + vector > *subs = e->getSubEntities(); if (subs != NULL) { for (int j = 0; j < subs->size(); j++) @@ -1602,7 +1602,7 @@ void LevelChunk::getEntities(std::shared_ptr except, AABB *bb, vector > &es) +void LevelChunk::getEntitiesOfClass(const type_info& ec, AABB *bb, vector > &es) { int yc0 = Mth::floor((bb->y0 - 2) / 16); int yc1 = Mth::floor((bb->y1 + 2) / 16); @@ -1630,12 +1630,12 @@ void LevelChunk::getEntitiesOfClass(const type_info& ec, AABB *bb, vector > *entities = entityBlocks[yc]; + vector > *entities = entityBlocks[yc]; AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //entities->at(i); + shared_ptr e = *it; //entities->at(i); bool isAssignableFrom = false; // Some special cases where the base class is a general type that our class may be derived from, otherwise do a direct comparison of type_info diff --git a/Minecraft.World/LevelChunk.h b/Minecraft.World/LevelChunk.h index 16b6a8a7..820835c3 100644 --- a/Minecraft.World/LevelChunk.h +++ b/Minecraft.World/LevelChunk.h @@ -100,8 +100,8 @@ private: bool hasGapsToCheck; public: - unordered_map, TilePosKeyHash, TilePosKeyEq> tileEntities; - vector > **entityBlocks; + unordered_map, TilePosKeyHash, TilePosKeyEq> tileEntities; + vector > **entityBlocks; static const int sTerrainPopulatedFromHere = 2; static const int sTerrainPopulatedFromW = 4; @@ -188,14 +188,14 @@ public: virtual void getNeighbourBrightnesses(int *brightnesses, LightLayer::variety layer, int x, int y, int z); // 4J added virtual void setBrightness(LightLayer::variety layer, int x, int y, int z, int brightness); virtual int getRawBrightness(int x, int y, int z, int skyDampen); - virtual void addEntity(std::shared_ptr e); - virtual void removeEntity(std::shared_ptr e); - virtual void removeEntity(std::shared_ptr e, int yc); + virtual void addEntity(shared_ptr e); + virtual void removeEntity(shared_ptr e); + virtual void removeEntity(shared_ptr e, int yc); virtual bool isSkyLit(int x, int y, int z); virtual void skyBrightnessChanged(); - virtual std::shared_ptr getTileEntity(int x, int y, int z); - virtual void addTileEntity(std::shared_ptr te); - virtual void setTileEntity(int x, int y, int z, std::shared_ptr tileEntity); + virtual shared_ptr getTileEntity(int x, int y, int z); + virtual void addTileEntity(shared_ptr te); + virtual void setTileEntity(int x, int y, int z, shared_ptr tileEntity); virtual void removeTileEntity(int x, int y, int z); virtual void load(); virtual void unload(bool unloadTileEntities) ; // 4J - added parameter @@ -203,8 +203,8 @@ public: virtual bool isUnloaded(); #endif virtual void markUnsaved(); - virtual void getEntities(std::shared_ptr except, AABB *bb, vector > &es); - virtual void getEntitiesOfClass(const type_info& ec, AABB *bb, vector > &es); + virtual void getEntities(shared_ptr except, AABB *bb, vector > &es); + virtual void getEntitiesOfClass(const type_info& ec, AABB *bb, vector > &es); virtual int countEntities(); virtual bool shouldSave(bool force); virtual int getBlocksAndData(byteArray *data, int x0, int y0, int z0, int x1, int y1, int z1, int p, bool includeLighting = true); // 4J - added includeLighting parameter diff --git a/Minecraft.World/LevelData.cpp b/Minecraft.World/LevelData.cpp index 6d8d76b5..486fbe98 100644 --- a/Minecraft.World/LevelData.cpp +++ b/Minecraft.World/LevelData.cpp @@ -243,7 +243,7 @@ CompoundTag *LevelData::createTag() return tag; } -CompoundTag *LevelData::createTag(vector > *players) +CompoundTag *LevelData::createTag(vector > *players) { // 4J - removed all code for storing tags for players return createTag(); diff --git a/Minecraft.World/LevelData.h b/Minecraft.World/LevelData.h index 40ccb849..405ba1b8 100644 --- a/Minecraft.World/LevelData.h +++ b/Minecraft.World/LevelData.h @@ -58,7 +58,7 @@ public: LevelData(LevelSettings *levelSettings, const wstring& levelName); LevelData(LevelData *copy); CompoundTag *createTag(); - CompoundTag *createTag(vector > *players); + CompoundTag *createTag(vector > *players); enum { diff --git a/Minecraft.World/LevelEventPacket.h b/Minecraft.World/LevelEventPacket.h index 78da348a..6c2fdbaf 100644 --- a/Minecraft.World/LevelEventPacket.h +++ b/Minecraft.World/LevelEventPacket.h @@ -19,6 +19,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new LevelEventPacket()); } + static shared_ptr create() { return shared_ptr(new LevelEventPacket()); } virtual int getId() { return 61; } }; \ No newline at end of file diff --git a/Minecraft.World/LevelListener.h b/Minecraft.World/LevelListener.h index 98222e84..ec9b11de 100644 --- a/Minecraft.World/LevelListener.h +++ b/Minecraft.World/LevelListener.h @@ -18,23 +18,23 @@ public: //virtual void playSound(const wstring& name, double x, double y, double z, float volume, float pitch) = 0; virtual void playSound(int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f) = 0; - virtual void playSound(std::shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f) = 0; + virtual void playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f) = 0; // 4J removed - virtual void addParticle(const wstring& name, double x, double y, double z, double xa, double ya, double za) = 0; virtual void addParticle(ePARTICLE_TYPE name, double x, double y, double z, double xa, double ya, double za) = 0; // 4J added - virtual void entityAdded(std::shared_ptr entity) = 0; + virtual void entityAdded(shared_ptr entity) = 0; - virtual void entityRemoved(std::shared_ptr entity) = 0; + virtual void entityRemoved(shared_ptr entity) = 0; - virtual void playerRemoved(std::shared_ptr entity) = 0; // 4J added - for when a player is removed from the level's player array, not just the entity storage + virtual void playerRemoved(shared_ptr entity) = 0; // 4J added - for when a player is removed from the level's player array, not just the entity storage virtual void skyColorChanged() = 0; virtual void playStreamingMusic(const wstring& name, int x, int y, int z) = 0; - virtual void levelEvent(std::shared_ptr source, int type, int x, int y, int z, int data) = 0; + virtual void levelEvent(shared_ptr source, int type, int x, int y, int z, int data) = 0; virtual void destroyTileProgress(int id, int x, int y, int z, int progress) = 0; }; \ No newline at end of file diff --git a/Minecraft.World/LevelSoundPacket.h b/Minecraft.World/LevelSoundPacket.h index 4e6ede72..403ac092 100644 --- a/Minecraft.World/LevelSoundPacket.h +++ b/Minecraft.World/LevelSoundPacket.h @@ -33,6 +33,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new LevelSoundPacket()); } + static shared_ptr create() { return shared_ptr(new LevelSoundPacket()); } virtual int getId() { return 62; } }; diff --git a/Minecraft.World/LevelSource.h b/Minecraft.World/LevelSource.h index 7bfef06b..7ff99146 100644 --- a/Minecraft.World/LevelSource.h +++ b/Minecraft.World/LevelSource.h @@ -10,7 +10,7 @@ class LevelSource { public: virtual int getTile(int x, int y, int z) = 0; - virtual std::shared_ptr getTileEntity(int x, int y, int z) = 0; + virtual shared_ptr getTileEntity(int x, int y, int z) = 0; virtual int getLightColor(int x, int y, int z, int emitt, int tileId = -1) = 0; // 4J - brought forward from 1.8.2, added tileId virtual float getBrightness(int x, int y, int z, int emitt) = 0; virtual float getBrightness(int x, int y, int z) = 0; diff --git a/Minecraft.World/LevelStorage.h b/Minecraft.World/LevelStorage.h index 61d6cee2..25d2aba2 100644 --- a/Minecraft.World/LevelStorage.h +++ b/Minecraft.World/LevelStorage.h @@ -12,7 +12,7 @@ class File; class ConsoleSaveFile; -class LevelStorage +class LevelStorage { public: static const wstring NETHER_FOLDER; @@ -21,7 +21,7 @@ public: virtual LevelData *prepareLevel() = 0; virtual void checkSession() = 0; virtual ChunkStorage *createChunkStorage(Dimension *dimension) = 0; - virtual void saveLevelData(LevelData *levelData, vector > *players) = 0; + virtual void saveLevelData(LevelData *levelData, vector > *players) = 0; virtual void saveLevelData(LevelData *levelData) = 0; virtual PlayerIO *getPlayerIO() = 0; virtual void closeAll() = 0; diff --git a/Minecraft.World/LevelStorageProfilerDecorator.cpp b/Minecraft.World/LevelStorageProfilerDecorator.cpp index 532bdcfc..b6a4276e 100644 --- a/Minecraft.World/LevelStorageProfilerDecorator.cpp +++ b/Minecraft.World/LevelStorageProfilerDecorator.cpp @@ -26,7 +26,7 @@ ChunkStorage *LevelStorageProfilerDecorator::createChunkStorage(Dimension *dimen return new ChunkStorageProfilerDecorator(capsulated->createChunkStorage(dimension)); } -void LevelStorageProfilerDecorator::saveLevelData(LevelData *levelData, vector > *players) +void LevelStorageProfilerDecorator::saveLevelData(LevelData *levelData, vector > *players) { capsulated->saveLevelData(levelData, players); } diff --git a/Minecraft.World/LevelStorageProfilerDecorator.h b/Minecraft.World/LevelStorageProfilerDecorator.h index bd1751cc..98ed7620 100644 --- a/Minecraft.World/LevelStorageProfilerDecorator.h +++ b/Minecraft.World/LevelStorageProfilerDecorator.h @@ -18,7 +18,7 @@ public: LevelData *prepareLevel(); void checkSession(); ChunkStorage *createChunkStorage(Dimension *dimension); - void saveLevelData(LevelData *levelData, vector > *players); + void saveLevelData(LevelData *levelData, vector > *players); void saveLevelData(LevelData *levelData); PlayerIO *getPlayerIO(); void closeAll(); diff --git a/Minecraft.World/LevelStorageSource.h b/Minecraft.World/LevelStorageSource.h index ff6a41f7..16b8df88 100644 --- a/Minecraft.World/LevelStorageSource.h +++ b/Minecraft.World/LevelStorageSource.h @@ -9,11 +9,11 @@ class LevelData; class LevelStorage; class ConsoleSaveFile; -class LevelStorageSource +class LevelStorageSource { public: virtual wstring getName() = 0; - virtual std::shared_ptr selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir) = 0; + virtual shared_ptr selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir) = 0; virtual vector *getLevelList() = 0; virtual void clearAll() = 0; virtual LevelData *getDataTagFor(ConsoleSaveFile *saveFile, const wstring& levelId) = 0; @@ -24,7 +24,7 @@ public: * handle. *

* Also, a new levelId may not overwrite an existing one. - * + * * @param levelId * @return */ diff --git a/Minecraft.World/LeverTile.cpp b/Minecraft.World/LeverTile.cpp index 054bc461..a8231251 100644 --- a/Minecraft.World/LeverTile.cpp +++ b/Minecraft.World/LeverTile.cpp @@ -144,7 +144,7 @@ bool LeverTile::checkCanSurvive(Level *level, int x, int y, int z) return true; } -void LeverTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void LeverTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { int dir = level->getData(x, y, z) & 7; float r = 3 / 16.0f; @@ -176,7 +176,7 @@ void LeverTile::updateShape(LevelSource *level, int x, int y, int z, int forceDa } } -void LeverTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void LeverTile::attack(Level *level, int x, int y, int z, shared_ptr player) { use(level, x, y, z, player, 0, 0, 0, 0); } @@ -187,7 +187,7 @@ bool LeverTile::TestUse() return true; } -bool LeverTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool LeverTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly ) { @@ -290,7 +290,7 @@ bool LeverTile::getDirectSignal(Level *level, int x, int y, int z, int dir) int data = level->getData(x, y, z); if ((data & 8) == 0) return false; int myDir = data & 7; - + if (myDir == 0 && dir == 0) return true; if (myDir == 7 && dir == 0) return true; if (myDir == 6 && dir == 1) return true; diff --git a/Minecraft.World/LeverTile.h b/Minecraft.World/LeverTile.h index 3c0140b5..4d00db78 100644 --- a/Minecraft.World/LeverTile.h +++ b/Minecraft.World/LeverTile.h @@ -20,10 +20,10 @@ public: private: virtual bool checkCanSurvive(Level *level, int x, int y, int z); public: - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param - virtual void attack(Level *level, int x, int y, int z, std::shared_ptr player); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual void onRemove(Level *level, int x, int y, int z, int id, int data); virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); diff --git a/Minecraft.World/LightningBolt.cpp b/Minecraft.World/LightningBolt.cpp index fe189cf4..901bedf1 100644 --- a/Minecraft.World/LightningBolt.cpp +++ b/Minecraft.World/LightningBolt.cpp @@ -9,7 +9,7 @@ #include "net.minecraft.world.level.dimension.h" -LightningBolt::LightningBolt(Level *level, double x, double y, double z) : +LightningBolt::LightningBolt(Level *level, double x, double y, double z) : life( 0 ), seed( 0 ), flashes( 0 ), @@ -105,11 +105,11 @@ void LightningBolt::tick() // 4J - added clientside check if( !level->isClientSide ) { - vector > *entities = level->getEntities(shared_from_this(), AABB::newTemp(x - r, y - r, z - r, x + r, y + 6 + r, z + r)); + vector > *entities = level->getEntities(shared_from_this(), AABB::newTemp(x - r, y - r, z - r, x + r, y + 6 + r, z + r)); AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - std::shared_ptr e = (*it); //entities->at(i); + shared_ptr e = (*it); //entities->at(i); e->thunderHit(this); } } diff --git a/Minecraft.World/LiquidTile.cpp b/Minecraft.World/LiquidTile.cpp index a17ff525..466589a4 100644 --- a/Minecraft.World/LiquidTile.cpp +++ b/Minecraft.World/LiquidTile.cpp @@ -115,7 +115,7 @@ bool LiquidTile::isSolidFace(LevelSource *level, int x, int y, int z, int face) if (m == this->material) return false; if (face == Facing::UP) return true; if (m == Material::ice) return false; - + return Tile::isSolidFace(level, x, y, z, face); } @@ -203,7 +203,7 @@ Vec3 *LiquidTile::getFlow(LevelSource *level, int x, int y, int z) return flow; } -void LiquidTile::handleEntityInside(Level *level, int x, int y, int z, std::shared_ptr e, Vec3 *current) +void LiquidTile::handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current) { Vec3 *flow = getFlow(level, x, y, z); current->x += flow->x; diff --git a/Minecraft.World/LiquidTile.h b/Minecraft.World/LiquidTile.h index 37ee3dd4..67eb5b65 100644 --- a/Minecraft.World/LiquidTile.h +++ b/Minecraft.World/LiquidTile.h @@ -42,7 +42,7 @@ public: private: virtual Vec3 *getFlow(LevelSource *level, int x, int y, int z); public: - virtual void handleEntityInside(Level *level, int x, int y, int z, std::shared_ptr e, Vec3 *current); + virtual void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); virtual int getTickDelay(); virtual int getLightColor(LevelSource *level, int x, int y, int z, int tileId=-1); // 4J - brought forward from 1.8.2 virtual float getBrightness(LevelSource *level, int x, int y, int z); diff --git a/Minecraft.World/LoginPacket.h b/Minecraft.World/LoginPacket.h index 26c32ca6..bf7164fa 100644 --- a/Minecraft.World/LoginPacket.h +++ b/Minecraft.World/LoginPacket.h @@ -40,6 +40,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new LoginPacket()); } + static shared_ptr create() { return shared_ptr(new LoginPacket()); } virtual int getId() { return 1; } }; diff --git a/Minecraft.World/LookControl.cpp b/Minecraft.World/LookControl.cpp index 13783c81..829c3e4a 100644 --- a/Minecraft.World/LookControl.cpp +++ b/Minecraft.World/LookControl.cpp @@ -13,10 +13,10 @@ LookControl::LookControl(Mob *mob) this->mob = mob; } -void LookControl::setLookAt(std::shared_ptr target, float yMax, float xMax) +void LookControl::setLookAt(shared_ptr target, float yMax, float xMax) { this->wantedX = target->x; - std::shared_ptr targetMob = dynamic_pointer_cast(target); + shared_ptr targetMob = dynamic_pointer_cast(target); if (targetMob != NULL) this->wantedY = target->y + targetMob->getHeadHeight(); else this->wantedY = (target->bb->y0 + target->bb->y1) / 2; this->wantedZ = target->z; @@ -54,7 +54,7 @@ void LookControl::tick() mob->yHeadRot = rotlerp(mob->yHeadRot, yRotD, yMax); } else - { + { mob->yHeadRot = rotlerp(mob->yHeadRot, mob->yBodyRot, 10); } diff --git a/Minecraft.World/LookControl.h b/Minecraft.World/LookControl.h index fe182e7c..add64e4a 100644 --- a/Minecraft.World/LookControl.h +++ b/Minecraft.World/LookControl.h @@ -16,7 +16,7 @@ private: public: LookControl(Mob *mob); - void setLookAt(std::shared_ptr target, float yMax, float xMax); + void setLookAt(shared_ptr target, float yMax, float xMax); void setLookAt(double x, double y, double z, float yMax, float xMax); virtual void tick(); diff --git a/Minecraft.World/MakeLoveGoal.cpp b/Minecraft.World/MakeLoveGoal.cpp index cff6d01e..89f09f1d 100644 --- a/Minecraft.World/MakeLoveGoal.cpp +++ b/Minecraft.World/MakeLoveGoal.cpp @@ -29,7 +29,7 @@ bool MakeLoveGoal::canUse() if (village.lock() == NULL) return false; if (!villageNeedsMoreVillagers()) return false; - std::shared_ptr mate = level->getClosestEntityOfClass(typeid(Villager), villager->bb->grow(8, 3, 8), villager->shared_from_this()); + shared_ptr mate = level->getClosestEntityOfClass(typeid(Villager), villager->bb->grow(8, 3, 8), villager->shared_from_this()); if (mate == NULL) return false; partner = weak_ptr(dynamic_pointer_cast(mate)); @@ -75,7 +75,7 @@ void MakeLoveGoal::tick() bool MakeLoveGoal::villageNeedsMoreVillagers() { - std::shared_ptr _village = village.lock(); + shared_ptr _village = village.lock(); if( _village == NULL ) return false; int idealSize = (int) ((float) _village->getDoorCount() * 0.35); @@ -93,7 +93,7 @@ void MakeLoveGoal::breed() // 4J - added limit to number of animals that can be bred if(level->canCreateMore( eTYPE_VILLAGER, Level::eSpawnType_Breed) ) { - std::shared_ptr child = std::shared_ptr( new Villager(level) ); + shared_ptr child = shared_ptr( new Villager(level) ); child->setAge(-20 * 60 * 20); child->setProfession(villager->getRandom()->nextInt(Villager::PROFESSION_MAX)); child->moveTo(villager->x, villager->y, villager->z, 0, 0); diff --git a/Minecraft.World/MapItem.cpp b/Minecraft.World/MapItem.cpp index 3f5682ab..abf4fb9a 100644 --- a/Minecraft.World/MapItem.cpp +++ b/Minecraft.World/MapItem.cpp @@ -19,12 +19,12 @@ MapItem::MapItem(int id) : ComplexItem(id) this->setMaxStackSize(1); } -std::shared_ptr MapItem::getSavedData(short idNum, Level *level) -{ +shared_ptr MapItem::getSavedData(short idNum, Level *level) +{ std::wstring id = wstring( L"map_" ) + _toString(idNum); - std::shared_ptr mapItemSavedData = dynamic_pointer_cast(level->getSavedData(typeid(MapItemSavedData), id)); + shared_ptr mapItemSavedData = dynamic_pointer_cast(level->getSavedData(typeid(MapItemSavedData), id)); - if (mapItemSavedData == NULL) + if (mapItemSavedData == NULL) { // 4J Stu - This call comes from ClientConnection, but i don't see why we should be trying to work out // the id again when it's passed as a param. In any case that won't work with the new map setup @@ -32,20 +32,20 @@ std::shared_ptr MapItem::getSavedData(short idNum, Level *leve int aux = idNum; id = wstring( L"map_" ) + _toString(aux); - mapItemSavedData = std::shared_ptr( new MapItemSavedData(id) ); + mapItemSavedData = shared_ptr( new MapItemSavedData(id) ); - level->setSavedData(id, (std::shared_ptr ) mapItemSavedData); + level->setSavedData(id, (shared_ptr ) mapItemSavedData); } return mapItemSavedData; } -std::shared_ptr MapItem::getSavedData(std::shared_ptr itemInstance, Level *level) +shared_ptr MapItem::getSavedData(shared_ptr itemInstance, Level *level) { MemSect(31); std::wstring id = wstring( L"map_" ) + _toString(itemInstance->getAuxValue() ); MemSect(0); - std::shared_ptr mapItemSavedData = dynamic_pointer_cast( level->getSavedData(typeid(MapItemSavedData), id ) ); + shared_ptr mapItemSavedData = dynamic_pointer_cast( level->getSavedData(typeid(MapItemSavedData), id ) ); bool newData = false; if (mapItemSavedData == NULL) @@ -55,7 +55,7 @@ std::shared_ptr MapItem::getSavedData(std::shared_ptrsetAuxValue(level->getFreeAuxValueFor(L"map")); id = wstring( L"map_" ) + _toString(itemInstance->getAuxValue() ); - mapItemSavedData = std::shared_ptr( new MapItemSavedData(id) ); + mapItemSavedData = shared_ptr( new MapItemSavedData(id) ); newData = true; } @@ -75,18 +75,18 @@ std::shared_ptr MapItem::getSavedData(std::shared_ptrz = Math::round(level->getLevelData()->getZSpawn() / scale) * scale; #endif mapItemSavedData->dimension = (byte) level->dimension->id; - + mapItemSavedData->setDirty(); - level->setSavedData(id, (std::shared_ptr ) mapItemSavedData); + level->setSavedData(id, (shared_ptr ) mapItemSavedData); } return mapItemSavedData; } -void MapItem::update(Level *level, std::shared_ptr player, std::shared_ptr data) +void MapItem::update(Level *level, shared_ptr player, shared_ptr data) { - if (level->dimension->id != data->dimension) + if (level->dimension->id != data->dimension) { // Wrong dimension, abort return; @@ -152,8 +152,8 @@ void MapItem::update(Level *level, std::shared_ptr player, std::shared_p if (((ss >> 20) & 1) == 0) count[Tile::dirt_Id] += 10; else count[Tile::rock_Id] += 10; hh = 100; - } - else + } + else { for (int xs = 0; xs < scale; xs++) { @@ -161,7 +161,7 @@ void MapItem::update(Level *level, std::shared_ptr player, std::shared_p { int yy = lc->getHeightmap(xs + xso, zs + zso) + 1; int t = 0; - if (yy > 1) + if (yy > 1) { bool ok = false; do @@ -222,7 +222,7 @@ void MapItem::update(Level *level, std::shared_ptr player, std::shared_p if (diff < -0.6) br = 0; int col = 0; - if (tBest > 0) + if (tBest > 0) { MaterialColor *mc = Tile::tiles[tBest]->material->color; if (mc == MaterialColor::water) @@ -252,27 +252,27 @@ void MapItem::update(Level *level, std::shared_ptr player, std::shared_p data->colors[x + z * w] = newColor; } } - if (yd0 <= yd1) + if (yd0 <= yd1) { data->setDirty(x, yd0, yd1); } } } -void MapItem::inventoryTick(std::shared_ptr itemInstance, Level *level, std::shared_ptr owner, int slot, bool selected) +void MapItem::inventoryTick(shared_ptr itemInstance, Level *level, shared_ptr owner, int slot, bool selected) { if (level->isClientSide) return; - std::shared_ptr data = getSavedData(itemInstance, level); - if (dynamic_pointer_cast(owner) != NULL) + shared_ptr data = getSavedData(itemInstance, level); + if (dynamic_pointer_cast(owner) != NULL) { - std::shared_ptr player = dynamic_pointer_cast(owner); + shared_ptr player = dynamic_pointer_cast(owner); // 4J Stu - If the player has a map that belongs to another player, then merge the data over and change this map id to the owners id int ownersAuxValue = level->getAuxValueForMap(player->getXuid(), data->dimension, data->x, data->z, data->scale); if(ownersAuxValue != itemInstance->getAuxValue() ) { - std::shared_ptr ownersData = getSavedData(ownersAuxValue,level); + shared_ptr ownersData = getSavedData(ownersAuxValue,level); ownersData->x = data->x; ownersData->z = data->z; @@ -283,7 +283,7 @@ void MapItem::inventoryTick(std::shared_ptr itemInstance, Level *l ownersData->tickCarriedBy(player, itemInstance ); ownersData->mergeInMapData(data); player->inventoryMenu->broadcastChanges(); - + data = ownersData; } else @@ -292,13 +292,13 @@ void MapItem::inventoryTick(std::shared_ptr itemInstance, Level *l } } - if (selected) + if (selected) { update(level, owner, data); } } -void MapItem::onCraftedBy(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +void MapItem::onCraftedBy(shared_ptr itemInstance, Level *level, shared_ptr player) { wchar_t buf[64]; @@ -314,19 +314,19 @@ void MapItem::onCraftedBy(std::shared_ptr itemInstance, Level *lev #endif itemInstance->setAuxValue(level->getAuxValueForMap(player->getXuid(), player->dimension, centreXC, centreZC, mapScale)); - + swprintf(buf,64,L"map_%d", itemInstance->getAuxValue()); std::wstring id = wstring(buf); - std::shared_ptr data = getSavedData(itemInstance->getAuxValue(), level); + shared_ptr data = getSavedData(itemInstance->getAuxValue(), level); // 4J Stu - We only have one map per player per dimension, so don't reset the one that they have // when a new one is created if( data == NULL ) { - data = std::shared_ptr( new MapItemSavedData(id) ); + data = shared_ptr( new MapItemSavedData(id) ); } - level->setSavedData(id, (std::shared_ptr ) data); - + level->setSavedData(id, (shared_ptr ) data); + data->scale = mapScale; // 4J-PB - for Xbox maps, we'll centre them on the origin of the world, since we can fit the whole world in our map data->x = centreXC; @@ -335,13 +335,13 @@ void MapItem::onCraftedBy(std::shared_ptr itemInstance, Level *lev data->setDirty(); } -std::shared_ptr MapItem::getUpdatePacket(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr MapItem::getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player) { charArray data = MapItem::getSavedData(itemInstance, level)->getUpdatePacket(itemInstance, level, player); if (data.data == NULL || data.length == 0) return nullptr; - std::shared_ptr retval = std::shared_ptr(new ComplexItemDataPacket((short) Item::map->id, (short) itemInstance->getAuxValue(), data)); + shared_ptr retval = shared_ptr(new ComplexItemDataPacket((short) Item::map->id, (short) itemInstance->getAuxValue(), data)); delete data.data; return retval; } diff --git a/Minecraft.World/MapItem.h b/Minecraft.World/MapItem.h index 2d4f0518..dc16339d 100644 --- a/Minecraft.World/MapItem.h +++ b/Minecraft.World/MapItem.h @@ -5,7 +5,7 @@ using namespace std; class MapItemSavedData; -class MapItem : public ComplexItem +class MapItem : public ComplexItem { public: static const int IMAGE_WIDTH = 128; @@ -14,10 +14,10 @@ public: public: // 4J Stu - Was protected in Java, but then we can't access it where we need it MapItem(int id); - static std::shared_ptr getSavedData(short idNum, Level *level); - std::shared_ptr getSavedData(std::shared_ptr itemInstance, Level *level); - void update(Level *level, std::shared_ptr player, std::shared_ptr data); - virtual void inventoryTick(std::shared_ptr itemInstance, Level *level, std::shared_ptr owner, int slot, bool selected); - virtual void onCraftedBy(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); - std::shared_ptr getUpdatePacket(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); + static shared_ptr getSavedData(short idNum, Level *level); + shared_ptr getSavedData(shared_ptr itemInstance, Level *level); + void update(Level *level, shared_ptr player, shared_ptr data); + virtual void inventoryTick(shared_ptr itemInstance, Level *level, shared_ptr owner, int slot, bool selected); + virtual void onCraftedBy(shared_ptr itemInstance, Level *level, shared_ptr player); + shared_ptr getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player); }; diff --git a/Minecraft.World/MapItemSavedData.cpp b/Minecraft.World/MapItemSavedData.cpp index ab6d7819..d69a7f53 100644 --- a/Minecraft.World/MapItemSavedData.cpp +++ b/Minecraft.World/MapItemSavedData.cpp @@ -23,7 +23,7 @@ MapItemSavedData::MapDecoration::MapDecoration(char img, char x, char y, char ro this->visible = visible; } -MapItemSavedData::HoldingPlayer::HoldingPlayer(std::shared_ptr player, const MapItemSavedData *parent) : parent( parent ), player( player ) +MapItemSavedData::HoldingPlayer::HoldingPlayer(shared_ptr player, const MapItemSavedData *parent) : parent( parent ), player( player ) { // inited outside of ctor rowsDirtyMin = intArray(MapItem::IMAGE_WIDTH); @@ -48,12 +48,12 @@ MapItemSavedData::HoldingPlayer::~HoldingPlayer() delete lastSentDecorations.data; } -charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(std::shared_ptr itemInstance) +charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(shared_ptr itemInstance) { if (--sendPosTick < 0) { sendPosTick = 4; - + unsigned int playerDecorationsSize = (int)parent->decorations.size(); unsigned int nonPlayerDecorationsSize = (int)parent->nonPlayerDecorations.size(); charArray data = charArray( (playerDecorationsSize + nonPlayerDecorationsSize ) * DEC_PACKET_BYTES + 1); @@ -68,7 +68,7 @@ charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(std::shared_ptrimg << 4) | (md->rot & 0xF)); #endif data[i * DEC_PACKET_BYTES + 2] = md->x; - data[i * DEC_PACKET_BYTES + 3] = md->y; + data[i * DEC_PACKET_BYTES + 3] = md->y; data[i * DEC_PACKET_BYTES + 4] = md->entityId & 0xFF; data[i * DEC_PACKET_BYTES + 5] = (md->entityId>>8) & 0xFF; data[i * DEC_PACKET_BYTES + 6] = (md->entityId>>16) & 0xFF; @@ -86,7 +86,7 @@ charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(std::shared_ptrimg << 4) | (md->rot & 0xF)); #endif data[dataIndex * DEC_PACKET_BYTES + 2] = md->x; - data[dataIndex * DEC_PACKET_BYTES + 3] = md->y; + data[dataIndex * DEC_PACKET_BYTES + 3] = md->y; data[dataIndex * DEC_PACKET_BYTES + 4] = md->entityId & 0xFF; data[dataIndex * DEC_PACKET_BYTES + 5] = (md->entityId>>8) & 0xFF; data[dataIndex * DEC_PACKET_BYTES + 6] = (md->entityId>>16) & 0xFF; @@ -125,7 +125,7 @@ charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(std::shared_ptr servPlayer = dynamic_pointer_cast(player); + shared_ptr servPlayer = dynamic_pointer_cast(player); for (int d = 0; d < 10; d++) { int column = (tick * 11) % (MapItem::IMAGE_WIDTH); @@ -223,11 +223,11 @@ void MapItemSavedData::save(CompoundTag *tag) tag->putByteArray(L"colors", colors); } -void MapItemSavedData::tickCarriedBy(std::shared_ptr player, std::shared_ptr item) +void MapItemSavedData::tickCarriedBy(shared_ptr player, shared_ptr item) { if (carriedByPlayers.find(player) == carriedByPlayers.end()) { - std::shared_ptr hp = std::shared_ptr( new HoldingPlayer(player, this ) ); + shared_ptr hp = shared_ptr( new HoldingPlayer(player, this ) ); carriedByPlayers.insert( playerHoldingPlayerMapType::value_type(player, hp) ); carriedBy.push_back(hp); } @@ -237,7 +237,7 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr player, std::shared delete decorations[i]; } decorations.clear(); - + // 4J Stu - Put this block back in if you want to display entity positions on a map (see below) #if 0 nonPlayerDecorations.clear(); @@ -245,12 +245,12 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr player, std::shared bool addedPlayers = false; for (AUTO_VAR(it, carriedBy.begin()); it != carriedBy.end(); ) { - std::shared_ptr hp = *it; + shared_ptr hp = *it; // 4J Stu - Players in the same dimension as an item frame with a map need to be sent this data, so don't remove them if (hp->player->removed ) //|| (!hp->player->inventory->contains(item) && !item->isFramed() )) { - AUTO_VAR(it2, carriedByPlayers.find( (std::shared_ptr ) hp->player )); + AUTO_VAR(it2, carriedByPlayers.find( (shared_ptr ) hp->player )); if( it2 != carriedByPlayers.end() ) { carriedByPlayers.erase( it2 ); @@ -268,7 +268,7 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr player, std::shared PlayerList *players = MinecraftServer::getInstance()->getPlayerList(); for(AUTO_VAR(it3, players->players.begin()); it3 != players->players.end(); ++it3) { - std::shared_ptr serverPlayer = *it3; + shared_ptr serverPlayer = *it3; if(serverPlayer->dimension == 1) { atLeastOnePlayerInTheEnd = true; @@ -321,7 +321,7 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr player, std::shared if (item->isFramed()) { //addDecoration(1, player.level, "frame-" + item.getFrame().entityId, item.getFrame().xTile, item.getFrame().zTile, item.getFrame().dir * 90); - + if( nonPlayerDecorations.find( item->getFrame()->entityId ) == nonPlayerDecorations.end() ) { float xd = (float) ( item->getFrame()->xTile - x ) / (1 << scale); @@ -354,7 +354,7 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr player, std::shared #if 0 for(AUTO_VAR(it,playerLevel->entities.begin()); it != playerLevel->entities.end(); ++it) { - std::shared_ptr ent = *it; + shared_ptr ent = *it; if((ent->GetType() & eTYPE_ENEMY) == 0) continue; @@ -393,7 +393,7 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr player, std::shared PlayerList *players = MinecraftServer::getInstance()->getPlayerList(); for(AUTO_VAR(it3, players->players.begin()); it3 != players->players.end(); ++it3) { - std::shared_ptr decorationPlayer = *it3; + shared_ptr decorationPlayer = *it3; if(decorationPlayer!=NULL && decorationPlayer->dimension == this->dimension) { float xd = (float) (decorationPlayer->x - x) / (1 << scale); @@ -470,12 +470,12 @@ void MapItemSavedData::tickCarriedBy(std::shared_ptr player, std::shared } } -charArray MapItemSavedData::getUpdatePacket(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +charArray MapItemSavedData::getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player) { AUTO_VAR(it, carriedByPlayers.find(player)); if (it == carriedByPlayers.end() ) return charArray(); - std::shared_ptr hp = it->second; + shared_ptr hp = it->second; return hp->nextUpdatePacket(itemInstance); } @@ -486,7 +486,7 @@ void MapItemSavedData::setDirty(int x, int y0, int y1) AUTO_VAR(itEnd, carriedBy.end()); for (AUTO_VAR(it, carriedBy.begin()); it != itEnd; it++) { - std::shared_ptr hp = *it; //carriedBy.at(i); + shared_ptr hp = *it; //carriedBy.at(i); if (hp->rowsDirtyMin[x] < 0 || hp->rowsDirtyMin[x] > y0) hp->rowsDirtyMin[x] = y0; if (hp->rowsDirtyMax[x] < 0 || hp->rowsDirtyMax[x] < y1) hp->rowsDirtyMax[x] = y1; } @@ -534,7 +534,7 @@ void MapItemSavedData::handleComplexItemData(charArray &data) // 4J Added // We only have one map per player per dimension, so if they pickup someone elses map we merge their map data with ours // so that we can see everything that they discovered but still only have one map data ourself -void MapItemSavedData::mergeInMapData(std::shared_ptr dataToAdd) +void MapItemSavedData::mergeInMapData(shared_ptr dataToAdd) { int w = MapItem::IMAGE_WIDTH; int h = MapItem::IMAGE_HEIGHT; @@ -555,14 +555,14 @@ void MapItemSavedData::mergeInMapData(std::shared_ptr dataToAd colors[x + z * w] = newColor; } } - if (yd0 <= yd1) + if (yd0 <= yd1) { setDirty(x, yd0, yd1); } } } -void MapItemSavedData::removeItemFrameDecoration(std::shared_ptr item) +void MapItemSavedData::removeItemFrameDecoration(shared_ptr item) { AUTO_VAR(frameDecoration, nonPlayerDecorations.find( item->getFrame()->entityId ) ); if ( frameDecoration != nonPlayerDecorations.end() ) diff --git a/Minecraft.World/MapItemSavedData.h b/Minecraft.World/MapItemSavedData.h index 79e85132..fcbe5e30 100644 --- a/Minecraft.World/MapItemSavedData.h +++ b/Minecraft.World/MapItemSavedData.h @@ -28,7 +28,7 @@ public: class HoldingPlayer { public: - const std::shared_ptr player; + const shared_ptr player; intArray rowsDirtyMin; intArray rowsDirtyMax; @@ -42,9 +42,9 @@ public: public: // 4J Stu - Had to add a reference to the MapItemSavedData object that created us as we try to access it's member variables - HoldingPlayer(std::shared_ptr player, const MapItemSavedData *parent); + HoldingPlayer(shared_ptr player, const MapItemSavedData *parent); ~HoldingPlayer(); - charArray nextUpdatePacket(std::shared_ptr itemInstance); + charArray nextUpdatePacket(shared_ptr itemInstance); }; public: @@ -53,10 +53,10 @@ public: byte scale; byteArray colors; int step; - vector > carriedBy; + vector > carriedBy; private: - typedef unordered_map , std::shared_ptr , PlayerKeyHash, PlayerKeyEq> playerHoldingPlayerMapType; + typedef unordered_map , shared_ptr , PlayerKeyHash, PlayerKeyEq> playerHoldingPlayerMapType; playerHoldingPlayerMapType carriedByPlayers; public: @@ -75,15 +75,15 @@ public: virtual void load(CompoundTag *tag); virtual void save(CompoundTag *tag); - void tickCarriedBy(std::shared_ptr player, std::shared_ptr item); + void tickCarriedBy(shared_ptr player, shared_ptr item); - charArray getUpdatePacket(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); + charArray getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player); using SavedData::setDirty; void setDirty(int x, int y0, int y1); void handleComplexItemData(charArray &data); // 4J Stu Added - void mergeInMapData(std::shared_ptr dataToAdd); - void removeItemFrameDecoration(std::shared_ptr item); + void mergeInMapData(shared_ptr dataToAdd); + void removeItemFrameDecoration(shared_ptr item); }; diff --git a/Minecraft.World/McRegionLevelStorage.cpp b/Minecraft.World/McRegionLevelStorage.cpp index 1727670f..687ee048 100644 --- a/Minecraft.World/McRegionLevelStorage.cpp +++ b/Minecraft.World/McRegionLevelStorage.cpp @@ -20,13 +20,13 @@ McRegionLevelStorage::~McRegionLevelStorage() RegionFileCache::clear(); } -ChunkStorage *McRegionLevelStorage::createChunkStorage(Dimension *dimension) +ChunkStorage *McRegionLevelStorage::createChunkStorage(Dimension *dimension) { //File folder = getFolder(); if (dynamic_cast(dimension) != NULL) { - + if(app.GetResetNether()) { #ifdef SPLIT_SAVES @@ -43,7 +43,7 @@ ChunkStorage *McRegionLevelStorage::createChunkStorage(Dimension *dimension) #else vector *netherFiles = m_saveFile->getFilesWithPrefix(LevelStorage::NETHER_FOLDER); if(netherFiles!=NULL) - { + { for(AUTO_VAR(it, netherFiles->begin()); it != netherFiles->end(); ++it) { m_saveFile->deleteFile(*it); @@ -56,13 +56,13 @@ ChunkStorage *McRegionLevelStorage::createChunkStorage(Dimension *dimension) return new McRegionChunkStorage(m_saveFile, LevelStorage::NETHER_FOLDER); } - + if (dynamic_cast(dimension)) { //File dir2 = new File(folder, LevelStorage.ENDER_FOLDER); //dir2.mkdirs(); //return new ThreadedMcRegionChunkStorage(dir2); - + // 4J-PB - save version 0 at this point means it's a create new world int iSaveVersion=m_saveFile->getSaveVersion(); @@ -75,7 +75,7 @@ ChunkStorage *McRegionLevelStorage::createChunkStorage(Dimension *dimension) // 4J-PB - There will be no End in early saves if(endFiles!=NULL) - { + { for(AUTO_VAR(it, endFiles->begin()); it != endFiles->end(); ++it) { m_saveFile->deleteFile(*it); @@ -89,7 +89,7 @@ ChunkStorage *McRegionLevelStorage::createChunkStorage(Dimension *dimension) return new McRegionChunkStorage(m_saveFile, L""); } -void McRegionLevelStorage::saveLevelData(LevelData *levelData, vector > *players) +void McRegionLevelStorage::saveLevelData(LevelData *levelData, vector > *players) { levelData->setVersion(MCREGION_VERSION_ID); MemSect(38); @@ -97,7 +97,7 @@ void McRegionLevelStorage::saveLevelData(LevelData *levelData, vector > *players); + virtual void saveLevelData(LevelData *levelData, vector > *players); virtual void closeAll(); }; \ No newline at end of file diff --git a/Minecraft.World/McRegionLevelStorageSource.cpp b/Minecraft.World/McRegionLevelStorageSource.cpp index 48531944..0652ad84 100644 --- a/Minecraft.World/McRegionLevelStorageSource.cpp +++ b/Minecraft.World/McRegionLevelStorageSource.cpp @@ -44,7 +44,7 @@ vector *McRegionLevelStorageSource::getLevelList() { file = *it; //subFolders->at(i); - if (file->isDirectory()) + if (file->isDirectory()) { continue; } @@ -74,13 +74,13 @@ void McRegionLevelStorageSource::clearAll() { } -std::shared_ptr McRegionLevelStorageSource::selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir) +shared_ptr McRegionLevelStorageSource::selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir) { // return new LevelStorageProfilerDecorator(new McRegionLevelStorage(baseDir, levelId, createPlayerDir)); - return std::shared_ptr(new McRegionLevelStorage(saveFile, baseDir, levelId, createPlayerDir)); + return shared_ptr(new McRegionLevelStorage(saveFile, baseDir, levelId, createPlayerDir)); } -bool McRegionLevelStorageSource::isConvertible(ConsoleSaveFile *saveFile, const wstring& levelId) +bool McRegionLevelStorageSource::isConvertible(ConsoleSaveFile *saveFile, const wstring& levelId) { // check if there is old file format level data LevelData *levelData = getDataTagFor(saveFile, levelId); @@ -145,7 +145,7 @@ bool McRegionLevelStorageSource::convertLevel(ConsoleSaveFile *saveFile, const w } int totalCount = normalRegions->size() + netherRegions->size() + enderRegions.size() + normalBaseFolders->size() + netherBaseFolders->size() + enderBaseFolders.size(); - + // System.out.println("Total conversion count is " + totalCount); 4J Jev, TODO // convert normal world @@ -173,7 +173,7 @@ bool McRegionLevelStorageSource::convertLevel(ConsoleSaveFile *saveFile, const w #if 0 // 4J - not required anymore -void McRegionLevelStorageSource::addRegions(File &baseFolder, vector *dest, vector *firstLevelFolders) +void McRegionLevelStorageSource::addRegions(File &baseFolder, vector *dest, vector *firstLevelFolders) { FolderFilter folderFilter; ChunkFilter chunkFilter; @@ -210,7 +210,7 @@ void McRegionLevelStorageSource::addRegions(File &baseFolder, vector *chunkFiles, int currentCount, int totalCount, ProgressListener *progress) +void McRegionLevelStorageSource::convertRegions(File &baseFolder, vector *chunkFiles, int currentCount, int totalCount, ProgressListener *progress) { assert( false ); @@ -238,7 +238,7 @@ void McRegionLevelStorageSource::convertRegions(File &baseFolder, vectorgetZ(); RegionFile *region = RegionFileCache::getRegionFile(baseFolder, x, z); - if (!region->hasChunk(x & 31, z & 31)) + if (!region->hasChunk(x & 31, z & 31)) { FileInputStream fis = new BufferedInputStream(FileInputStream(*chunkFile->getFile())); DataInputStream istream = DataInputStream(&fis); // 4J - was new GZIPInputStream as well @@ -289,7 +289,7 @@ void McRegionLevelStorageSource::eraseFolders(vector *folders, int curre #if 0 // 4J - not required anymore -bool McRegionLevelStorageSource::FolderFilter::accept(File *file) +bool McRegionLevelStorageSource::FolderFilter::accept(File *file) { if (file->isDirectory()) { @@ -300,23 +300,23 @@ bool McRegionLevelStorageSource::FolderFilter::accept(File *file) } -bool McRegionLevelStorageSource::ChunkFilter::accept(File *dir, const wstring& name) +bool McRegionLevelStorageSource::ChunkFilter::accept(File *dir, const wstring& name) { Matcher matcher( chunkFilePattern, name ); return matcher.matches(); } -McRegionLevelStorageSource::ChunkFile::ChunkFile(File *file) +McRegionLevelStorageSource::ChunkFile::ChunkFile(File *file) { this->file = file; Matcher matcher( ChunkFilter::chunkFilePattern, file->getName() ); - if (matcher.matches()) + if (matcher.matches()) { x = Integer::parseInt(matcher.group(1), 36); z = Integer::parseInt(matcher.group(2), 36); - } + } else { x = 0; @@ -348,17 +348,17 @@ bool McRegionLevelStorageSource::ChunkFile::operator<( ChunkFile *b ) return compareTo( b ) < 0; } -File *McRegionLevelStorageSource::ChunkFile::getFile() +File *McRegionLevelStorageSource::ChunkFile::getFile() { return (File *) file; } -int McRegionLevelStorageSource::ChunkFile::getX() +int McRegionLevelStorageSource::ChunkFile::getX() { return x; } -int McRegionLevelStorageSource::ChunkFile::getZ() +int McRegionLevelStorageSource::ChunkFile::getZ() { return z; } diff --git a/Minecraft.World/McRegionLevelStorageSource.h b/Minecraft.World/McRegionLevelStorageSource.h index 0f6b940d..d1a4bf30 100644 --- a/Minecraft.World/McRegionLevelStorageSource.h +++ b/Minecraft.World/McRegionLevelStorageSource.h @@ -17,7 +17,7 @@ public: virtual wstring getName(); virtual vector *getLevelList(); virtual void clearAll(); - virtual std::shared_ptr selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir); + virtual shared_ptr selectLevel(ConsoleSaveFile *saveFile, const wstring& levelId, bool createPlayerDir); virtual bool isConvertible(ConsoleSaveFile *saveFile, const wstring& levelId); virtual bool requiresConversion(ConsoleSaveFile *saveFile, const wstring& levelId); virtual bool convertLevel(ConsoleSaveFile *saveFile, const wstring& levelId, ProgressListener *progress); @@ -33,14 +33,14 @@ private: public: #if 0 // 4J - not required anymore - static class FolderFilter : public FileFilter + static class FolderFilter : public FileFilter { public: static const std::tr1::wregex chunkFolderPattern; // was Pattern bool accept(File *file); }; - static class ChunkFilter : public FilenameFilter + static class ChunkFilter : public FilenameFilter { public: static const std::tr1::wregex chunkFilePattern; // was Pattern diff --git a/Minecraft.World/MeleeAttackGoal.cpp b/Minecraft.World/MeleeAttackGoal.cpp index bf779234..f3aa6455 100644 --- a/Minecraft.World/MeleeAttackGoal.cpp +++ b/Minecraft.World/MeleeAttackGoal.cpp @@ -41,7 +41,7 @@ MeleeAttackGoal::~MeleeAttackGoal() bool MeleeAttackGoal::canUse() { - std::shared_ptr bestTarget = mob->getTarget(); + shared_ptr bestTarget = mob->getTarget(); if (bestTarget == NULL) return false; if(!bestTarget->isAlive()) return false; if (attackType != eTYPE_NOTSET && (attackType & bestTarget->GetType()) != attackType) return false; @@ -53,7 +53,7 @@ bool MeleeAttackGoal::canUse() bool MeleeAttackGoal::canContinueToUse() { - std::shared_ptr bestTarget = mob->getTarget(); + shared_ptr bestTarget = mob->getTarget(); if (bestTarget == NULL) return false; if (target.lock() == NULL || !target.lock()->isAlive()) return false; if (!trackTarget) return !mob->getNavigation()->isDone(); diff --git a/Minecraft.World/MemoryLevelStorage.cpp b/Minecraft.World/MemoryLevelStorage.cpp index bc069fc3..5a1d43bb 100644 --- a/Minecraft.World/MemoryLevelStorage.cpp +++ b/Minecraft.World/MemoryLevelStorage.cpp @@ -17,7 +17,7 @@ LevelData *MemoryLevelStorage::prepareLevel() return NULL; } -void MemoryLevelStorage::checkSession() +void MemoryLevelStorage::checkSession() { } @@ -26,7 +26,7 @@ ChunkStorage *MemoryLevelStorage::createChunkStorage(Dimension *dimension) return new MemoryChunkStorage(); } -void MemoryLevelStorage::saveLevelData(LevelData *levelData, vector > *players) +void MemoryLevelStorage::saveLevelData(LevelData *levelData, vector > *players) { } @@ -43,21 +43,21 @@ void MemoryLevelStorage::closeAll() { } -void MemoryLevelStorage::save(std::shared_ptr player) +void MemoryLevelStorage::save(shared_ptr player) { } -bool MemoryLevelStorage::load(std::shared_ptr player) +bool MemoryLevelStorage::load(shared_ptr player) { return false; } -CompoundTag *MemoryLevelStorage::loadPlayerDataTag(const wstring& playerName) +CompoundTag *MemoryLevelStorage::loadPlayerDataTag(const wstring& playerName) { return NULL; } -ConsoleSavePath MemoryLevelStorage::getDataFile(const wstring& id) +ConsoleSavePath MemoryLevelStorage::getDataFile(const wstring& id) { return ConsoleSaveFile(wstring(L"")); } \ No newline at end of file diff --git a/Minecraft.World/MemoryLevelStorage.h b/Minecraft.World/MemoryLevelStorage.h index 43af38c7..21ea784c 100644 --- a/Minecraft.World/MemoryLevelStorage.h +++ b/Minecraft.World/MemoryLevelStorage.h @@ -13,19 +13,19 @@ using namespace std; #include "ConsoleSaveFile.h" -class MemoryLevelStorage : public LevelStorage, public PlayerIO +class MemoryLevelStorage : public LevelStorage, public PlayerIO { public: MemoryLevelStorage(); virtual LevelData *prepareLevel(); virtual void checkSession(); virtual ChunkStorage *createChunkStorage(Dimension *dimension); - virtual void saveLevelData(LevelData *levelData, vector > *players); + virtual void saveLevelData(LevelData *levelData, vector > *players); virtual void saveLevelData(LevelData *levelData); virtual PlayerIO *getPlayerIO(); virtual void closeAll(); - virtual void save(std::shared_ptr player); - virtual bool load(std::shared_ptr player); + virtual void save(shared_ptr player); + virtual bool load(shared_ptr player); virtual CompoundTag *loadPlayerDataTag(const wstring& playerName); virtual ConsoleSavePath getDataFile(const wstring& id); }; \ No newline at end of file diff --git a/Minecraft.World/MemoryLevelStorageSource.cpp b/Minecraft.World/MemoryLevelStorageSource.cpp index 92a1b2c3..db0cfa58 100644 --- a/Minecraft.World/MemoryLevelStorageSource.cpp +++ b/Minecraft.World/MemoryLevelStorageSource.cpp @@ -13,12 +13,12 @@ wstring MemoryLevelStorageSource::getName() return L"Memory Storage"; } -std::shared_ptr MemoryLevelStorageSource::selectLevel(const wstring& levelId, bool createPlayerDir) +shared_ptr MemoryLevelStorageSource::selectLevel(const wstring& levelId, bool createPlayerDir) { - return std::shared_ptr () new MemoryLevelStorage()); + return shared_ptr () new MemoryLevelStorage()); } -vector *MemoryLevelStorageSource::getLevelList() +vector *MemoryLevelStorageSource::getLevelList() { return new vector; } @@ -32,12 +32,12 @@ LevelData *MemoryLevelStorageSource::getDataTagFor(const wstring& levelId) return NULL; } -bool MemoryLevelStorageSource::isNewLevelIdAcceptable(const wstring& levelId) +bool MemoryLevelStorageSource::isNewLevelIdAcceptable(const wstring& levelId) { return true; } -void MemoryLevelStorageSource::deleteLevel(const wstring& levelId) +void MemoryLevelStorageSource::deleteLevel(const wstring& levelId) { } diff --git a/Minecraft.World/MemoryLevelStorageSource.h b/Minecraft.World/MemoryLevelStorageSource.h index 0f7d6ef2..c53c0463 100644 --- a/Minecraft.World/MemoryLevelStorageSource.h +++ b/Minecraft.World/MemoryLevelStorageSource.h @@ -3,12 +3,12 @@ using namespace std; #include "LevelStorageSource.h" -class MemoryLevelStorageSource : public LevelStorageSource +class MemoryLevelStorageSource : public LevelStorageSource { public: MemoryLevelStorageSource(); wstring getName(); - std::shared_ptr selectLevel(const wstring& levelId, bool createPlayerDir); + shared_ptr selectLevel(const wstring& levelId, bool createPlayerDir); vector *getLevelList(); void clearAll(); LevelData *getDataTagFor(const wstring& levelId); diff --git a/Minecraft.World/MenuBackup.cpp b/Minecraft.World/MenuBackup.cpp index 71ea3d38..6d09f3e3 100644 --- a/Minecraft.World/MenuBackup.cpp +++ b/Minecraft.World/MenuBackup.cpp @@ -5,7 +5,7 @@ #include "Slot.h" #include "MenuBackup.h" -MenuBackup::MenuBackup(std::shared_ptr inventory, AbstractContainerMenu *menu) +MenuBackup::MenuBackup(shared_ptr inventory, AbstractContainerMenu *menu) { backups = new unordered_map(); diff --git a/Minecraft.World/MenuBackup.h b/Minecraft.World/MenuBackup.h index 27df45da..2de750b1 100644 --- a/Minecraft.World/MenuBackup.h +++ b/Minecraft.World/MenuBackup.h @@ -7,11 +7,11 @@ class MenuBackup { private: unordered_map *backups; - std::shared_ptr inventory; + shared_ptr inventory; AbstractContainerMenu *menu; public: - MenuBackup(std::shared_ptr inventory, AbstractContainerMenu *menu); + MenuBackup(shared_ptr inventory, AbstractContainerMenu *menu); void save(short changeUid); diff --git a/Minecraft.World/Merchant.h b/Minecraft.World/Merchant.h index ad7ab1fc..8b4b7a69 100644 --- a/Minecraft.World/Merchant.h +++ b/Minecraft.World/Merchant.h @@ -7,11 +7,11 @@ class Player; class Merchant { public: - virtual void setTradingPlayer(std::shared_ptr player) = 0; - virtual std::shared_ptr getTradingPlayer() = 0; - virtual MerchantRecipeList *getOffers(std::shared_ptr forPlayer) = 0; + virtual void setTradingPlayer(shared_ptr player) = 0; + virtual shared_ptr getTradingPlayer() = 0; + virtual MerchantRecipeList *getOffers(shared_ptr forPlayer) = 0; virtual void overrideOffers(MerchantRecipeList *recipeList) = 0; virtual void notifyTrade(MerchantRecipe *activeRecipe) = 0; - virtual void notifyTradeUpdated(std::shared_ptr item) = 0; + virtual void notifyTradeUpdated(shared_ptr item) = 0; virtual int getDisplayName() = 0; }; \ No newline at end of file diff --git a/Minecraft.World/MerchantContainer.cpp b/Minecraft.World/MerchantContainer.cpp index 9ca871e3..cadbe4e3 100644 --- a/Minecraft.World/MerchantContainer.cpp +++ b/Minecraft.World/MerchantContainer.cpp @@ -3,7 +3,7 @@ #include "MerchantMenu.h" #include "MerchantContainer.h" -MerchantContainer::MerchantContainer(std::shared_ptr player, std::shared_ptr villager) +MerchantContainer::MerchantContainer(shared_ptr player, shared_ptr villager) { this->player = player; merchant = villager; @@ -25,24 +25,24 @@ unsigned int MerchantContainer::getContainerSize() return items.length; } -std::shared_ptr MerchantContainer::getItem(unsigned int slot) +shared_ptr MerchantContainer::getItem(unsigned int slot) { return items[slot]; } -std::shared_ptr MerchantContainer::removeItem(unsigned int slot, int count) +shared_ptr MerchantContainer::removeItem(unsigned int slot, int count) { if (items[slot] != NULL) { if (slot == MerchantMenu::RESULT_SLOT) { - std::shared_ptr item = items[slot]; + shared_ptr item = items[slot]; items[slot] = nullptr; return item; } if (items[slot]->count <= count) { - std::shared_ptr item = items[slot]; + shared_ptr item = items[slot]; items[slot] = nullptr; if (isPaymentSlot(slot)) { @@ -52,7 +52,7 @@ std::shared_ptr MerchantContainer::removeItem(unsigned int slot, i } else { - std::shared_ptr i = items[slot]->remove(count); + shared_ptr i = items[slot]->remove(count); if (items[slot]->count == 0) items[slot] = nullptr; if (isPaymentSlot(slot)) { @@ -69,18 +69,18 @@ bool MerchantContainer::isPaymentSlot(int slot) return slot == MerchantMenu::PAYMENT1_SLOT || slot == MerchantMenu::PAYMENT2_SLOT; } -std::shared_ptr MerchantContainer::removeItemNoUpdate(int slot) +shared_ptr MerchantContainer::removeItemNoUpdate(int slot) { if (items[slot] != NULL) { - std::shared_ptr item = items[slot]; + shared_ptr item = items[slot]; items[slot] = nullptr; return item; } return nullptr; } -void MerchantContainer::setItem(unsigned int slot, std::shared_ptr item) +void MerchantContainer::setItem(unsigned int slot, shared_ptr item) { items[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); @@ -100,7 +100,7 @@ int MerchantContainer::getMaxStackSize() return Container::LARGE_MAX_STACK_SIZE; } -bool MerchantContainer::stillValid(std::shared_ptr player) +bool MerchantContainer::stillValid(shared_ptr player) { return merchant->getTradingPlayer() == player; } @@ -122,8 +122,8 @@ void MerchantContainer::updateSellItem() { activeRecipe = NULL; - std::shared_ptr buyItem1 = items[MerchantMenu::PAYMENT1_SLOT]; - std::shared_ptr buyItem2 = items[MerchantMenu::PAYMENT2_SLOT]; + shared_ptr buyItem1 = items[MerchantMenu::PAYMENT1_SLOT]; + shared_ptr buyItem2 = items[MerchantMenu::PAYMENT2_SLOT]; if (buyItem1 == NULL) { diff --git a/Minecraft.World/MerchantContainer.h b/Minecraft.World/MerchantContainer.h index 9f4efe33..efba13d6 100644 --- a/Minecraft.World/MerchantContainer.h +++ b/Minecraft.World/MerchantContainer.h @@ -10,29 +10,29 @@ class MerchantRecipe; class MerchantContainer : public Container { private: - std::shared_ptr merchant; + shared_ptr merchant; ItemInstanceArray items; - std::shared_ptr player; + shared_ptr player; MerchantRecipe *activeRecipe; int selectionHint; public: - MerchantContainer(std::shared_ptr player, std::shared_ptr villager); + MerchantContainer(shared_ptr player, shared_ptr villager); ~MerchantContainer(); unsigned int getContainerSize(); - std::shared_ptr getItem(unsigned int slot); - std::shared_ptr removeItem(unsigned int slot, int count); + shared_ptr getItem(unsigned int slot); + shared_ptr removeItem(unsigned int slot, int count); private: bool isPaymentSlot(int slot); public: - std::shared_ptr removeItemNoUpdate(int slot); - void setItem(unsigned int slot, std::shared_ptr item); + shared_ptr removeItemNoUpdate(int slot); + void setItem(unsigned int slot, shared_ptr item); int getName(); int getMaxStackSize(); - bool stillValid(std::shared_ptr player); + bool stillValid(shared_ptr player); void startOpen(); void stopOpen(); void setChanged(); diff --git a/Minecraft.World/MerchantMenu.cpp b/Minecraft.World/MerchantMenu.cpp index 50f9fbdf..a6dfca1f 100644 --- a/Minecraft.World/MerchantMenu.cpp +++ b/Minecraft.World/MerchantMenu.cpp @@ -5,12 +5,12 @@ #include "net.minecraft.world.level.h" #include "MerchantMenu.h" -MerchantMenu::MerchantMenu(std::shared_ptr inventory, std::shared_ptr merchant, Level *level) +MerchantMenu::MerchantMenu(shared_ptr inventory, shared_ptr merchant, Level *level) { trader = merchant; this->level = level; - tradeContainer = std::shared_ptr( new MerchantContainer(dynamic_pointer_cast(inventory->player->shared_from_this()), merchant) ); + tradeContainer = shared_ptr( new MerchantContainer(dynamic_pointer_cast(inventory->player->shared_from_this()), merchant) ); addSlot(new Slot(tradeContainer, PAYMENT1_SLOT, SELLSLOT1_X, ROW2_Y)); addSlot(new Slot(tradeContainer, PAYMENT2_SLOT, SELLSLOT2_X, ROW2_Y)); addSlot(new MerchantResultSlot(inventory->player, merchant, tradeContainer, RESULT_SLOT, BUYSLOT_X, ROW2_Y)); @@ -28,7 +28,7 @@ MerchantMenu::MerchantMenu(std::shared_ptr inventory, std::shared_ptr } } -std::shared_ptr MerchantMenu::getTradeContainer() +shared_ptr MerchantMenu::getTradeContainer() { return tradeContainer; } @@ -43,7 +43,7 @@ void MerchantMenu::broadcastChanges() AbstractContainerMenu::broadcastChanges(); } -// 4J used to take a std::shared_ptr but wasn't using it, so removed to simplify things +// 4J used to take a shared_ptr but wasn't using it, so removed to simplify things void MerchantMenu::slotsChanged() { tradeContainer->updateSellItem(); @@ -59,20 +59,20 @@ void MerchantMenu::setData(int id, int value) { } -bool MerchantMenu::stillValid(std::shared_ptr player) +bool MerchantMenu::stillValid(shared_ptr player) { return trader->getTradingPlayer() == player; } -std::shared_ptr MerchantMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr MerchantMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = NULL; - + if(slotIndex < slots->size()) slot = slots->at(slotIndex); if (slot != NULL && slot->hasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if (slotIndex == RESULT_SLOT) @@ -124,7 +124,7 @@ std::shared_ptr MerchantMenu::quickMoveStack(std::shared_ptr player) +void MerchantMenu::removed(shared_ptr player) { AbstractContainerMenu::removed(player); trader->setTradingPlayer(nullptr); @@ -132,7 +132,7 @@ void MerchantMenu::removed(std::shared_ptr player) AbstractContainerMenu::removed(player); if (level->isClientSide) return; - std::shared_ptr item = tradeContainer->removeItemNoUpdate(PAYMENT1_SLOT); + shared_ptr item = tradeContainer->removeItemNoUpdate(PAYMENT1_SLOT); if (item) { player->drop(item); @@ -144,7 +144,7 @@ void MerchantMenu::removed(std::shared_ptr player) } } -std::shared_ptr MerchantMenu::getMerchant() +shared_ptr MerchantMenu::getMerchant() { return trader; } \ No newline at end of file diff --git a/Minecraft.World/MerchantMenu.h b/Minecraft.World/MerchantMenu.h index 23b63998..14a5fa1d 100644 --- a/Minecraft.World/MerchantMenu.h +++ b/Minecraft.World/MerchantMenu.h @@ -25,22 +25,22 @@ public: private: - std::shared_ptr trader; - std::shared_ptr tradeContainer; + shared_ptr trader; + shared_ptr tradeContainer; Level *level; public: - MerchantMenu(std::shared_ptr inventory, std::shared_ptr merchant, Level *level); + MerchantMenu(shared_ptr inventory, shared_ptr merchant, Level *level); - std::shared_ptr getTradeContainer(); + shared_ptr getTradeContainer(); void addSlotListener(ContainerListener *listener); void broadcastChanges(); - void slotsChanged(); // 4J used to take a std::shared_ptr but wasn't using it, so removed to simplify things + void slotsChanged(); // 4J used to take a shared_ptr but wasn't using it, so removed to simplify things void setSelectionHint(int hint); void setData(int id, int value); - bool stillValid(std::shared_ptr player); - std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); - void removed(std::shared_ptr player); + bool stillValid(shared_ptr player); + shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + void removed(shared_ptr player); - std::shared_ptr getMerchant(); // 4J Added + shared_ptr getMerchant(); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/MerchantRecipe.cpp b/Minecraft.World/MerchantRecipe.cpp index 84fdc744..b772b0c7 100644 --- a/Minecraft.World/MerchantRecipe.cpp +++ b/Minecraft.World/MerchantRecipe.cpp @@ -2,7 +2,7 @@ #include "MerchantRecipe.h" -void MerchantRecipe::_init(std::shared_ptr buyA, std::shared_ptr buyB, std::shared_ptr sell) +void MerchantRecipe::_init(shared_ptr buyA, shared_ptr buyB, shared_ptr sell) { this->buyA = buyA; this->buyB = buyB; @@ -20,34 +20,34 @@ MerchantRecipe::MerchantRecipe(CompoundTag *tag) load(tag); } -MerchantRecipe::MerchantRecipe(std::shared_ptr buyA, std::shared_ptr buyB, std::shared_ptr sell, int uses, int maxUses) +MerchantRecipe::MerchantRecipe(shared_ptr buyA, shared_ptr buyB, shared_ptr sell, int uses, int maxUses) { _init(buyA, buyB, sell); this->uses = uses; this->maxUses = maxUses; } -MerchantRecipe::MerchantRecipe(std::shared_ptr buy, std::shared_ptr sell) +MerchantRecipe::MerchantRecipe(shared_ptr buy, shared_ptr sell) { _init(buy, nullptr, sell); } -MerchantRecipe::MerchantRecipe(std::shared_ptr buy, Item *sell) +MerchantRecipe::MerchantRecipe(shared_ptr buy, Item *sell) { - _init(buy, nullptr, std::shared_ptr(new ItemInstance(sell))); + _init(buy, nullptr, shared_ptr(new ItemInstance(sell))); } -MerchantRecipe::MerchantRecipe(std::shared_ptr buy, Tile *sell) +MerchantRecipe::MerchantRecipe(shared_ptr buy, Tile *sell) { - _init(buy, nullptr, std::shared_ptr(new ItemInstance(sell))); + _init(buy, nullptr, shared_ptr(new ItemInstance(sell))); } -std::shared_ptr MerchantRecipe::getBuyAItem() +shared_ptr MerchantRecipe::getBuyAItem() { return buyA; } -std::shared_ptr MerchantRecipe::getBuyBItem() +shared_ptr MerchantRecipe::getBuyBItem() { return buyB; } @@ -57,7 +57,7 @@ bool MerchantRecipe::hasSecondaryBuyItem() return buyB != NULL; } -std::shared_ptr MerchantRecipe::getSellItem() +shared_ptr MerchantRecipe::getSellItem() { return sell; } diff --git a/Minecraft.World/MerchantRecipe.h b/Minecraft.World/MerchantRecipe.h index dd684b6a..0ed84898 100644 --- a/Minecraft.World/MerchantRecipe.h +++ b/Minecraft.World/MerchantRecipe.h @@ -3,25 +3,25 @@ class MerchantRecipe { private: - std::shared_ptr buyA; - std::shared_ptr buyB; - std::shared_ptr sell; + shared_ptr buyA; + shared_ptr buyB; + shared_ptr sell; int uses; int maxUses; - void _init(std::shared_ptr buyA, std::shared_ptr buyB, std::shared_ptr sell); + void _init(shared_ptr buyA, shared_ptr buyB, shared_ptr sell); public: MerchantRecipe(CompoundTag *tag); - MerchantRecipe(std::shared_ptr buyA, std::shared_ptr buyB, std::shared_ptr sell, int uses = 0, int maxUses = 7); - MerchantRecipe(std::shared_ptr buy, std::shared_ptr sell); - MerchantRecipe(std::shared_ptr buy, Item *sell); - MerchantRecipe(std::shared_ptr buy, Tile *sell); + MerchantRecipe(shared_ptr buyA, shared_ptr buyB, shared_ptr sell, int uses = 0, int maxUses = 7); + MerchantRecipe(shared_ptr buy, shared_ptr sell); + MerchantRecipe(shared_ptr buy, Item *sell); + MerchantRecipe(shared_ptr buy, Tile *sell); - std::shared_ptr getBuyAItem(); - std::shared_ptr getBuyBItem(); + shared_ptr getBuyAItem(); + shared_ptr getBuyBItem(); bool hasSecondaryBuyItem(); - std::shared_ptr getSellItem(); + shared_ptr getSellItem(); bool isSame(MerchantRecipe *other); bool isSameSameButBetter(MerchantRecipe *other); int getUses(); diff --git a/Minecraft.World/MerchantRecipeList.cpp b/Minecraft.World/MerchantRecipeList.cpp index 26436b59..bd7a126c 100644 --- a/Minecraft.World/MerchantRecipeList.cpp +++ b/Minecraft.World/MerchantRecipeList.cpp @@ -19,7 +19,7 @@ MerchantRecipeList::~MerchantRecipeList() } } -MerchantRecipe *MerchantRecipeList::getRecipeFor(std::shared_ptr buyA, std::shared_ptr buyB, int selectionHint) +MerchantRecipe *MerchantRecipeList::getRecipeFor(shared_ptr buyA, shared_ptr buyB, int selectionHint) { if (selectionHint > 0 && selectionHint < m_recipes.size()) { @@ -67,7 +67,7 @@ bool MerchantRecipeList::addIfNewOrBetter(MerchantRecipe *recipe) return true; } -MerchantRecipe *MerchantRecipeList::getMatchingRecipeFor(std::shared_ptr buy, std::shared_ptr buyB, std::shared_ptr sell) +MerchantRecipe *MerchantRecipeList::getMatchingRecipeFor(shared_ptr buy, shared_ptr buyB, shared_ptr sell) { for (int i = 0; i < m_recipes.size(); i++) { @@ -92,7 +92,7 @@ void MerchantRecipeList::writeToStream(DataOutputStream *stream) Packet::writeItem(r->getBuyAItem(), stream); Packet::writeItem(r->getSellItem(), stream); - std::shared_ptr buyBItem = r->getBuyBItem(); + shared_ptr buyBItem = r->getBuyBItem(); stream->writeBoolean(buyBItem != NULL); if (buyBItem != NULL) { @@ -111,10 +111,10 @@ MerchantRecipeList *MerchantRecipeList::createFromStream(DataInputStream *stream int count = (int) (stream->readByte() & 0xff); for (int i = 0; i < count; i++) { - std::shared_ptr buy = Packet::readItem(stream); - std::shared_ptr sell = Packet::readItem(stream); + shared_ptr buy = Packet::readItem(stream); + shared_ptr sell = Packet::readItem(stream); - std::shared_ptr buyB = nullptr; + shared_ptr buyB = nullptr; if (stream->readBoolean()) { buyB = Packet::readItem(stream); diff --git a/Minecraft.World/MerchantRecipeList.h b/Minecraft.World/MerchantRecipeList.h index b3c0cd2b..4a761d39 100644 --- a/Minecraft.World/MerchantRecipeList.h +++ b/Minecraft.World/MerchantRecipeList.h @@ -17,9 +17,9 @@ public: MerchantRecipeList(CompoundTag *tag); ~MerchantRecipeList(); - MerchantRecipe *getRecipeFor(std::shared_ptr buyA, std::shared_ptr buyB, int selectionHint); + MerchantRecipe *getRecipeFor(shared_ptr buyA, shared_ptr buyB, int selectionHint); bool addIfNewOrBetter(MerchantRecipe *recipe); // 4J Added bool return - MerchantRecipe *getMatchingRecipeFor(std::shared_ptr buy, std::shared_ptr buyB, std::shared_ptr sell); + MerchantRecipe *getMatchingRecipeFor(shared_ptr buy, shared_ptr buyB, shared_ptr sell); void writeToStream(DataOutputStream *stream); static MerchantRecipeList *createFromStream(DataInputStream *stream); void load(CompoundTag *tag); diff --git a/Minecraft.World/MerchantResultSlot.cpp b/Minecraft.World/MerchantResultSlot.cpp index 7617bdf1..fedbcc4a 100644 --- a/Minecraft.World/MerchantResultSlot.cpp +++ b/Minecraft.World/MerchantResultSlot.cpp @@ -3,7 +3,7 @@ #include "net.minecraft.world.item.trading.h" #include "MerchantResultSlot.h" -MerchantResultSlot::MerchantResultSlot(Player *player, std::shared_ptr merchant, std::shared_ptr slots, int id, int x, int y) : Slot(slots, id, x, y) +MerchantResultSlot::MerchantResultSlot(Player *player, shared_ptr merchant, shared_ptr slots, int id, int x, int y) : Slot(slots, id, x, y) { this->player = player; this->merchant = merchant; @@ -11,12 +11,12 @@ MerchantResultSlot::MerchantResultSlot(Player *player, std::shared_ptr removeCount = 0; } -bool MerchantResultSlot::mayPlace(std::shared_ptr item) +bool MerchantResultSlot::mayPlace(shared_ptr item) { return false; } -std::shared_ptr MerchantResultSlot::remove(int c) +shared_ptr MerchantResultSlot::remove(int c) { if (hasItem()) { @@ -25,27 +25,27 @@ std::shared_ptr MerchantResultSlot::remove(int c) return Slot::remove(c); } -void MerchantResultSlot::onQuickCraft(std::shared_ptr picked, int count) +void MerchantResultSlot::onQuickCraft(shared_ptr picked, int count) { removeCount += count; checkTakeAchievements(picked); } -void MerchantResultSlot::checkTakeAchievements(std::shared_ptr carried) +void MerchantResultSlot::checkTakeAchievements(shared_ptr carried) { carried->onCraftedBy(player->level, dynamic_pointer_cast(player->shared_from_this()), removeCount); removeCount = 0; } -void MerchantResultSlot::onTake(std::shared_ptr player, std::shared_ptr carried) +void MerchantResultSlot::onTake(shared_ptr player, shared_ptr carried) { checkTakeAchievements(carried); MerchantRecipe *activeRecipe = slots->getActiveRecipe(); if (activeRecipe != NULL) { - std::shared_ptr item1 = slots->getItem(MerchantMenu::PAYMENT1_SLOT); - std::shared_ptr item2 = slots->getItem(MerchantMenu::PAYMENT2_SLOT); + shared_ptr item1 = slots->getItem(MerchantMenu::PAYMENT1_SLOT); + shared_ptr item2 = slots->getItem(MerchantMenu::PAYMENT2_SLOT); // remove payment items, but remember slots may have switched if (removePaymentItemsIfMatching(activeRecipe, item1, item2) || removePaymentItemsIfMatching(activeRecipe, item2, item1)) @@ -66,15 +66,15 @@ void MerchantResultSlot::onTake(std::shared_ptr player, std::shared_ptr< } } -bool MerchantResultSlot::mayCombine(std::shared_ptr second) +bool MerchantResultSlot::mayCombine(shared_ptr second) { return false; } -bool MerchantResultSlot::removePaymentItemsIfMatching(MerchantRecipe *activeRecipe, std::shared_ptr a, std::shared_ptr b) +bool MerchantResultSlot::removePaymentItemsIfMatching(MerchantRecipe *activeRecipe, shared_ptr a, shared_ptr b) { - std::shared_ptr buyA = activeRecipe->getBuyAItem(); - std::shared_ptr buyB = activeRecipe->getBuyBItem(); + shared_ptr buyA = activeRecipe->getBuyAItem(); + shared_ptr buyB = activeRecipe->getBuyBItem(); if (a != NULL && a->id == buyA->id) { diff --git a/Minecraft.World/MerchantResultSlot.h b/Minecraft.World/MerchantResultSlot.h index 1b45082c..7b8d97b6 100644 --- a/Minecraft.World/MerchantResultSlot.h +++ b/Minecraft.World/MerchantResultSlot.h @@ -9,25 +9,25 @@ class Merchant; class MerchantResultSlot : public Slot { private: - std::shared_ptr slots; + shared_ptr slots; Player *player; int removeCount; - std::shared_ptr merchant; + shared_ptr merchant; public: - MerchantResultSlot(Player *player, std::shared_ptr merchant, std::shared_ptr slots, int id, int x, int y); + MerchantResultSlot(Player *player, shared_ptr merchant, shared_ptr slots, int id, int x, int y); - bool mayPlace(std::shared_ptr item); - std::shared_ptr remove(int c); + bool mayPlace(shared_ptr item); + shared_ptr remove(int c); protected: - void onQuickCraft(std::shared_ptr picked, int count); - void checkTakeAchievements(std::shared_ptr carried); + void onQuickCraft(shared_ptr picked, int count); + void checkTakeAchievements(shared_ptr carried); public: - void onTake(std::shared_ptr player, std::shared_ptr carried); - virtual bool mayCombine(std::shared_ptr item); // 4J Added + void onTake(shared_ptr player, shared_ptr carried); + virtual bool mayCombine(shared_ptr item); // 4J Added private: - bool removePaymentItemsIfMatching(MerchantRecipe *activeRecipe, std::shared_ptr a, std::shared_ptr b); + bool removePaymentItemsIfMatching(MerchantRecipe *activeRecipe, shared_ptr a, shared_ptr b); }; \ No newline at end of file diff --git a/Minecraft.World/MilkBucketItem.cpp b/Minecraft.World/MilkBucketItem.cpp index 320c57b7..4a371078 100644 --- a/Minecraft.World/MilkBucketItem.cpp +++ b/Minecraft.World/MilkBucketItem.cpp @@ -8,7 +8,7 @@ MilkBucketItem::MilkBucketItem(int id) : Item( id ) setMaxStackSize(1); } -std::shared_ptr MilkBucketItem::useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr MilkBucketItem::useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player) { if (!player->abilities.instabuild) instance->count--; @@ -19,22 +19,22 @@ std::shared_ptr MilkBucketItem::useTimeDepleted(std::shared_ptrcount <= 0) { - return std::shared_ptr( new ItemInstance(Item::bucket_empty) ); + return shared_ptr( new ItemInstance(Item::bucket_empty) ); } return instance; } -int MilkBucketItem::getUseDuration(std::shared_ptr itemInstance) +int MilkBucketItem::getUseDuration(shared_ptr itemInstance) { return DRINK_DURATION; } -UseAnim MilkBucketItem::getUseAnimation(std::shared_ptr itemInstance) +UseAnim MilkBucketItem::getUseAnimation(shared_ptr itemInstance) { return UseAnim_drink; } -std::shared_ptr MilkBucketItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr MilkBucketItem::use(shared_ptr instance, Level *level, shared_ptr player) { player->startUsingItem(instance, getUseDuration(instance)); return instance; diff --git a/Minecraft.World/MilkBucketItem.h b/Minecraft.World/MilkBucketItem.h index 32c9a215..672e3143 100644 --- a/Minecraft.World/MilkBucketItem.h +++ b/Minecraft.World/MilkBucketItem.h @@ -10,8 +10,8 @@ private: public: MilkBucketItem(int id); - virtual std::shared_ptr useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player); - virtual int getUseDuration(std::shared_ptr itemInstance); - virtual UseAnim getUseAnimation(std::shared_ptr itemInstance); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual shared_ptr useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player); + virtual int getUseDuration(shared_ptr itemInstance); + virtual UseAnim getUseAnimation(shared_ptr itemInstance); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/MineShaftPieces.cpp b/Minecraft.World/MineShaftPieces.cpp index d6a60ee7..fe13b49f 100644 --- a/Minecraft.World/MineShaftPieces.cpp +++ b/Minecraft.World/MineShaftPieces.cpp @@ -440,19 +440,19 @@ bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *rando { hasPlacedSpider = true; level->setTile(x, y, newZ, Tile::mobSpawner_Id); - std::shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, newZ) ); + shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, newZ) ); if (entity != NULL) entity->setEntityId(L"CaveSpider"); } } } // prevent air floating - for (int x = x0; x <= x1; x++) + for (int x = x0; x <= x1; x++) { - for (int z = 0; z <= length; z++) + for (int z = 0; z <= length; z++) { int block = getBlock(level, x, -1, z, chunkBB); - if (block == 0) + if (block == 0) { placeBlock(level, Tile::wood_Id, 0, x, -1, z, chunkBB); } @@ -594,12 +594,12 @@ bool MineShaftPieces::MineShaftCrossing::postProcess(Level *level, Random *rando // prevent air floating // note: use world coordinates because the corridor hasn't defined // orientation - for (int x = boundingBox->x0; x <= boundingBox->x1; x++) + for (int x = boundingBox->x0; x <= boundingBox->x1; x++) { - for (int z = boundingBox->z0; z <= boundingBox->z1; z++) + for (int z = boundingBox->z0; z <= boundingBox->z1; z++) { int block = getBlock(level, x, boundingBox->y0 - 1, z, chunkBB); - if (block == 0) + if (block == 0) { placeBlock(level, Tile::wood_Id, 0, x, boundingBox->y0 - 1, z, chunkBB); } diff --git a/Minecraft.World/Minecart.cpp b/Minecraft.World/Minecart.cpp index 529629ff..2b8fbb95 100644 --- a/Minecraft.World/Minecart.cpp +++ b/Minecraft.World/Minecart.cpp @@ -137,7 +137,7 @@ void Minecart::defineSynchedData() } -AABB *Minecart::getCollideAgainstBox(std::shared_ptr entity) +AABB *Minecart::getCollideAgainstBox(shared_ptr entity) { return entity->bb; } @@ -180,14 +180,14 @@ double Minecart::getRideHeight() bool Minecart::hurt(DamageSource *source, int hurtDamage) { if (level->isClientSide || removed) return true; - + // 4J-JEV: Fix for #88212, // Untrusted players shouldn't be able to damage minecarts or boats. if (dynamic_cast(source) != NULL) { - std::shared_ptr attacker = source->getDirectEntity(); + shared_ptr attacker = source->getDirectEntity(); - if (dynamic_pointer_cast(attacker) != NULL && + if (dynamic_pointer_cast(attacker) != NULL && !dynamic_pointer_cast(attacker)->isAllowedToHurtEntity( shared_from_this() )) return false; } @@ -202,7 +202,7 @@ bool Minecart::hurt(DamageSource *source, int hurtDamage) if( rider.lock() != NULL && rider.lock() == source->getEntity() ) hurtDamage += 1; // 4J Stu - Brought froward from 12w36 to fix #46611 - TU5: Gameplay: Minecarts and boat requires more hits than one to be destroyed in creative mode - std::shared_ptr player = dynamic_pointer_cast(source->getEntity()); + shared_ptr player = dynamic_pointer_cast(source->getEntity()); if (player != NULL && player->abilities.instabuild) this->setDamage(100); this->setDamage(getDamage() + (hurtDamage * 10)); @@ -215,10 +215,10 @@ bool Minecart::hurt(DamageSource *source, int hurtDamage) spawnAtLocation(Item::minecart->id, 1, 0); if (type == Minecart::CHEST) { - std::shared_ptr container = dynamic_pointer_cast( shared_from_this() ); + shared_ptr container = dynamic_pointer_cast( shared_from_this() ); for (unsigned int i = 0; i < container->getContainerSize(); i++) { - std::shared_ptr item = container->getItem(i); + shared_ptr item = container->getItem(i); if (item != NULL) { float xo = random->nextFloat() * 0.8f + 0.1f; @@ -231,7 +231,7 @@ bool Minecart::hurt(DamageSource *source, int hurtDamage) if (count > item->count) count = item->count; item->count -= count; - std::shared_ptr itemEntity = std::shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, std::shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ) ) ); + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ) ) ); float pow = 0.05f; itemEntity->xd = (float) random->nextGaussian() * pow; itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; @@ -270,20 +270,20 @@ void Minecart::remove() { for (unsigned int i = 0; i < getContainerSize(); i++) { - std::shared_ptr item = getItem(i); - if (item != NULL) + shared_ptr item = getItem(i); + if (item != NULL) { float xo = random->nextFloat() * 0.8f + 0.1f; float yo = random->nextFloat() * 0.8f + 0.1f; float zo = random->nextFloat() * 0.8f + 0.1f; - while (item->count > 0) + while (item->count > 0) { int count = random->nextInt(21) + 10; if (count > item->count) count = item->count; item->count -= count; - std::shared_ptr itemEntity = std::shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, std::shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ) ) ); + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ) ) ); float pow = 0.05f; itemEntity->xd = (float) random->nextGaussian() * pow; itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; @@ -388,7 +388,7 @@ void Minecart::tick() if (data == 3) xd += slideSpeed; if (data == 4) zd += slideSpeed; if (data == 5) zd -= slideSpeed; - + // 4J TODO Is this a good way to copy the bit of the array that we need? int exits[2][3]; memcpy( &exits, (void *)EXITS[data], sizeof(int) * 2 * 3); @@ -409,8 +409,8 @@ void Minecart::tick() xd = pow * xD / dd; zd = pow * zD / dd; - - std::shared_ptr sharedRider = rider.lock(); + + shared_ptr sharedRider = rider.lock(); if (sharedRider != NULL) { double riderDist = (sharedRider->xd * sharedRider->xd + sharedRider->zd * sharedRider->zd); @@ -669,16 +669,16 @@ void Minecart::tick() // if (!level->isClientSide) { { - vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); + vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); if (entities != NULL && !entities->empty()) { AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - std::shared_ptr e = (*it); //entities->at(i); + shared_ptr e = (*it); //entities->at(i); if (e != rider.lock() && e->isPushable() && e->GetType() == eTYPE_MINECART) { - std::shared_ptr cart = dynamic_pointer_cast(e); + shared_ptr cart = dynamic_pointer_cast(e); cart->m_bHasPushedCartThisTick = false; cart->push(shared_from_this()); @@ -848,7 +848,7 @@ void Minecart::addAdditonalSaveData(CompoundTag *base) { base->putInt(L"Type", type); - if (type == Minecart::FURNACE) + if (type == Minecart::FURNACE) { base->putDouble(L"PushX", xPush); base->putDouble(L"PushZ", zPush); @@ -889,7 +889,7 @@ void Minecart::readAdditionalSaveData(CompoundTag *base) { CompoundTag *tag = inventoryList->get(i); unsigned int slot = tag->getByte(L"Slot") & 0xff; - if (slot >= 0 && slot < items->length) (*items)[slot] = std::shared_ptr( ItemInstance::fromTag(tag) ); + if (slot >= 0 && slot < items->length) (*items)[slot] = shared_ptr( ItemInstance::fromTag(tag) ); } } } @@ -900,7 +900,7 @@ float Minecart::getShadowHeightOffs() return 0; } -void Minecart::push(std::shared_ptr e) +void Minecart::push(shared_ptr e) { if (level->isClientSide) return; @@ -954,7 +954,7 @@ void Minecart::push(std::shared_ptr e) double xdd = (e->xd + xd); double zdd = (e->zd + zd); - std::shared_ptr cart = dynamic_pointer_cast(e); + shared_ptr cart = dynamic_pointer_cast(e); if (cart != NULL && cart->type == Minecart::FURNACE && type != Minecart::FURNACE) { xd *= 0.2f; @@ -1017,24 +1017,24 @@ unsigned int Minecart::getContainerSize() return 9 * 3; } -std::shared_ptr Minecart::getItem(unsigned int slot) +shared_ptr Minecart::getItem(unsigned int slot) { return (*items)[slot]; } -std::shared_ptr Minecart::removeItem(unsigned int slot, int count) +shared_ptr Minecart::removeItem(unsigned int slot, int count) { if ( (*items)[slot] != NULL) { if ( (*items)[slot]->count <= count) { - std::shared_ptr item = (*items)[slot]; + shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; return item; } else { - std::shared_ptr i = (*items)[slot]->remove(count); + shared_ptr i = (*items)[slot]->remove(count); if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; return i; } @@ -1042,18 +1042,18 @@ std::shared_ptr Minecart::removeItem(unsigned int slot, int count) return nullptr; } -std::shared_ptr Minecart::removeItemNoUpdate(int slot) +shared_ptr Minecart::removeItemNoUpdate(int slot) { if ( (*items)[slot] != NULL) { - std::shared_ptr item = (*items)[slot]; + shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; return item; } return nullptr; } -void Minecart::setItem(unsigned int slot, std::shared_ptr item) +void Minecart::setItem(unsigned int slot, shared_ptr item) { (*items)[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); @@ -1073,7 +1073,7 @@ void Minecart::setChanged() { } -bool Minecart::interact(std::shared_ptr player) +bool Minecart::interact(shared_ptr player) { if (type == Minecart::RIDEABLE) { @@ -1098,7 +1098,7 @@ bool Minecart::interact(std::shared_ptr player) } else if (type == Minecart::FURNACE) { - std::shared_ptr selected = player->inventory->getSelected(); + shared_ptr selected = player->inventory->getSelected(); if (selected != NULL && selected->id == Item::coal->id) { if (--selected->count == 0) player->inventory->setItem(player->inventory->selected, nullptr); @@ -1144,7 +1144,7 @@ void Minecart::lerpMotion(double xd, double yd, double zd) lzd = this->zd = zd; } -bool Minecart::stillValid(std::shared_ptr player) +bool Minecart::stillValid(shared_ptr player) { if (this->removed) return false; if (player->distanceToSqr(shared_from_this()) > 8 * 8) return false; diff --git a/Minecraft.World/Minecart.h b/Minecraft.World/Minecart.h index 77b58e5f..ea119bce 100644 --- a/Minecraft.World/Minecart.h +++ b/Minecraft.World/Minecart.h @@ -49,7 +49,7 @@ protected: virtual void defineSynchedData(); public: - virtual AABB *getCollideAgainstBox(std::shared_ptr entity); + virtual AABB *getCollideAgainstBox(shared_ptr entity); virtual AABB *getCollideBox(); virtual bool isPushable(); @@ -75,16 +75,16 @@ protected: public: virtual float getShadowHeightOffs(); - virtual void push(std::shared_ptr e); + virtual void push(shared_ptr e); virtual unsigned int getContainerSize(); - virtual std::shared_ptr getItem(unsigned int slot); - virtual std::shared_ptr removeItem(unsigned int slot, int count); - virtual std::shared_ptr removeItemNoUpdate(int slot); - virtual void setItem(unsigned int slot, std::shared_ptr item); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); int getName(); virtual int getMaxStackSize(); virtual void setChanged(); - virtual bool interact(std::shared_ptr player); + virtual bool interact(shared_ptr player); virtual float getLootContent(); private: @@ -95,7 +95,7 @@ private: public: virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); virtual void lerpMotion(double xd, double yd, double zd); - virtual bool stillValid(std::shared_ptr player); + virtual bool stillValid(shared_ptr player); protected: bool hasFuel(); diff --git a/Minecraft.World/MinecartItem.cpp b/Minecraft.World/MinecartItem.cpp index ea64152c..3b062ccf 100644 --- a/Minecraft.World/MinecartItem.cpp +++ b/Minecraft.World/MinecartItem.cpp @@ -12,18 +12,18 @@ MinecartItem::MinecartItem(int id, int type) : Item(id) this->type = type; } -bool MinecartItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool MinecartItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed int targetType = level->getTile(x, y, z); - if (RailTile::isRail(targetType)) + if (RailTile::isRail(targetType)) { if(!bTestUseOnOnly) { - if (!level->isClientSide) + if (!level->isClientSide) { - level->addEntity(std::shared_ptr( new Minecart(level, x + 0.5f, y + 0.5f, z + 0.5f, type) ) ); + level->addEntity(shared_ptr( new Minecart(level, x + 0.5f, y + 0.5f, z + 0.5f, type) ) ); } instance->count--; } diff --git a/Minecraft.World/MinecartItem.h b/Minecraft.World/MinecartItem.h index 4ffabc63..c63082a1 100644 --- a/Minecraft.World/MinecartItem.h +++ b/Minecraft.World/MinecartItem.h @@ -3,12 +3,12 @@ using namespace std; #include "Item.h" -class MinecartItem : public Item +class MinecartItem : public Item { public: int type; MinecartItem(int id, int type); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); }; \ No newline at end of file diff --git a/Minecraft.World/Mob.cpp b/Minecraft.World/Mob.cpp index 23f8639e..d2dcddfb 100644 --- a/Minecraft.World/Mob.cpp +++ b/Minecraft.World/Mob.cpp @@ -193,19 +193,19 @@ Random *Mob::getRandom() return random; } -std::shared_ptr Mob::getLastHurtByMob() +shared_ptr Mob::getLastHurtByMob() { return lastHurtByMob; } -std::shared_ptr Mob::getLastHurtMob() +shared_ptr Mob::getLastHurtMob() { return lastHurtMob; } -void Mob::setLastHurtMob(std::shared_ptr target) +void Mob::setLastHurtMob(shared_ptr target) { - std::shared_ptr mob = dynamic_pointer_cast(target); + shared_ptr mob = dynamic_pointer_cast(target); if (mob != NULL) lastHurtMob = mob; } @@ -235,18 +235,18 @@ void Mob::setSpeed(float speed) setYya(speed); } -bool Mob::doHurtTarget(std::shared_ptr target) +bool Mob::doHurtTarget(shared_ptr target) { setLastHurtMob(target); return false; } -std::shared_ptr Mob::getTarget() +shared_ptr Mob::getTarget() { return target; } -void Mob::setTarget(std::shared_ptr target) +void Mob::setTarget(shared_ptr target) { this->target = target; } @@ -299,18 +299,18 @@ bool Mob::hasRestriction() return restrictRadius != -1; } -void Mob::setLastHurtByMob(std::shared_ptr hurtBy) +void Mob::setLastHurtByMob(shared_ptr hurtBy) { lastHurtByMob = hurtBy; lastHurtByMobTime = lastHurtByMob != NULL ? PLAYER_HURT_EXPERIENCE_TIME : 0; } -void Mob::defineSynchedData() +void Mob::defineSynchedData() { entityData->define(DATA_EFFECT_COLOR_ID, effectColor); } -bool Mob::canSee(std::shared_ptr target) +bool Mob::canSee(shared_ptr target) { HitResult *hres = level->clip(Vec3::newTemp(x, y + getHeadHeight(), z), Vec3::newTemp(target->x, target->y + target->getHeadHeight(), target->z)); bool retVal = (hres == NULL); @@ -318,62 +318,62 @@ bool Mob::canSee(std::shared_ptr target) return retVal; } -int Mob::getTexture() +int Mob::getTexture() { return textureIdx; } -bool Mob::isPickable() +bool Mob::isPickable() { return !removed; } -bool Mob::isPushable() +bool Mob::isPushable() { return !removed; } -float Mob::getHeadHeight() +float Mob::getHeadHeight() { return bbHeight * 0.85f; } -int Mob::getAmbientSoundInterval() +int Mob::getAmbientSoundInterval() { return 20 * 4; } -void Mob::playAmbientSound() +void Mob::playAmbientSound() { MemSect(31); int ambient = getAmbientSound(); - if (ambient != -1) + if (ambient != -1) { level->playSound(shared_from_this(), ambient, getSoundVolume(), getVoicePitch()); } MemSect(0); } -void Mob::baseTick() +void Mob::baseTick() { oAttackAnim = attackAnim; Entity::baseTick(); - if (isAlive() && random->nextInt(1000) < ambientSoundTime++) + if (isAlive() && random->nextInt(1000) < ambientSoundTime++) { ambientSoundTime = -getAmbientSoundInterval(); - playAmbientSound(); + playAmbientSound(); } - if (isAlive() && isInWall()) + if (isAlive() && isInWall()) { hurt(DamageSource::inWall, 1); } if (isFireImmune() || level->isClientSide) clearFire(); - if (isAlive() && isUnderLiquid(Material::water) && !isWaterMob() && activeEffects.find(MobEffect::waterBreathing->id) == activeEffects.end()) + if (isAlive() && isUnderLiquid(Material::water) && !isWaterMob() && activeEffects.find(MobEffect::waterBreathing->id) == activeEffects.end()) { setAirSupply(decreaseAirSupply(getAirSupply())); if (getAirSupply() == -20) @@ -393,8 +393,8 @@ void Mob::baseTick() } clearFire(); - } - else + } + else { setAirSupply(TOTAL_AIR_SUPPLY); } @@ -404,7 +404,7 @@ void Mob::baseTick() if (attackTime > 0) attackTime--; if (hurtTime > 0) hurtTime--; if (invulnerableTime > 0) invulnerableTime--; - if (health <= 0) + if (health <= 0) { tickDeath(); } @@ -412,7 +412,7 @@ void Mob::baseTick() if (lastHurtByPlayerTime > 0) lastHurtByPlayerTime--; else { - // Note - this used to just set to nullptr, but that has to create a new std::shared_ptr and free an old one, when generally this won't be doing anything at all. This + // Note - this used to just set to nullptr, but that has to create a new shared_ptr and free an old one, when generally this won't be doing anything at all. This // is the lightweight but ugly alternative if( lastHurtByPlayer ) { @@ -440,9 +440,9 @@ void Mob::baseTick() } void Mob::tickDeath() -{ +{ deathTime++; - if (deathTime == 20) + if (deathTime == 20) { // 4J Stu - Added level->isClientSide check from 1.2 to fix XP orbs being created client side if(!level->isClientSide && (lastHurtByPlayerTime > 0 || isAlwaysExperienceDropper()) ) @@ -454,13 +454,13 @@ void Mob::tickDeath() { int newCount = ExperienceOrb::getExperienceValue(xpCount); xpCount -= newCount; - level->addEntity(std::shared_ptr( new ExperienceOrb(level, x, y, z, newCount) ) ); + level->addEntity(shared_ptr( new ExperienceOrb(level, x, y, z, newCount) ) ); } } } remove(); - for (int i = 0; i < 20; i++) + for (int i = 0; i < 20; i++) { double xa = random->nextGaussian() * 0.02; double ya = random->nextGaussian() * 0.02; @@ -475,7 +475,7 @@ int Mob::decreaseAirSupply(int currentSupply) return currentSupply - 1; } -int Mob::getExperienceReward(std::shared_ptr killedBy) +int Mob::getExperienceReward(shared_ptr killedBy) { return xpReward; } @@ -485,9 +485,9 @@ bool Mob::isAlwaysExperienceDropper() return false; } -void Mob::spawnAnim() +void Mob::spawnAnim() { - for (int i = 0; i < 20; i++) + for (int i = 0; i < 20; i++) { double xa = random->nextGaussian() * 0.02; double ya = random->nextGaussian() * 0.02; @@ -498,7 +498,7 @@ void Mob::spawnAnim() } } -void Mob::rideTick() +void Mob::rideTick() { Entity::rideTick(); oRun = run; @@ -506,7 +506,7 @@ void Mob::rideTick() fallDistance = 0; } -void Mob::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) +void Mob::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) { heightOffset = 0; lx = x; @@ -518,12 +518,12 @@ void Mob::lerpTo(double x, double y, double z, float yRot, float xRot, int steps lSteps = steps; } -void Mob::superTick() +void Mob::superTick() { Entity::tick(); } -void Mob::tick() +void Mob::tick() { Entity::tick(); @@ -552,21 +552,21 @@ void Mob::tick() float walkSpeed = 0; oRun = run; float tRun = 0; - if (sideDist <= 0.05f * 0.05f) + if (sideDist <= 0.05f * 0.05f) { // animStep = 0; - } - else + } + else { tRun = 1; walkSpeed = sqrt(sideDist) * 3; yBodyRotT = ((float) atan2(zd, xd) * 180 / (float) PI - 90); } - if (attackAnim > 0) + if (attackAnim > 0) { yBodyRotT = yRot; } - if (!onGround) + if (!onGround) { tRun = 0; } @@ -592,12 +592,12 @@ void Mob::tick() if (headDiff < -75) headDiff = -75; if (headDiff >= 75) headDiff = +75; yBodyRot = yRot - headDiff; - if (headDiff * headDiff > 50 * 50) + if (headDiff * headDiff > 50 * 50) { yBodyRot += headDiff * 0.2f; } - if (behind) + if (behind) { walkSpeed *= -1; } @@ -625,7 +625,7 @@ void Mob::tick() animStep += walkSpeed; } -void Mob::heal(int heal) +void Mob::heal(int heal) { if (health <= 0) return; health += heal; @@ -647,7 +647,7 @@ void Mob::setHealth(int health) } } -bool Mob::hurt(DamageSource *source, int dmg) +bool Mob::hurt(DamageSource *source, int dmg) { // 4J Stu - Reworked this function a bit to show hurt damage on the client before the server responds. // Fix for #8823 - Gameplay: Confirmation that a monster or animal has taken damage from an attack is highly delayed @@ -661,7 +661,7 @@ bool Mob::hurt(DamageSource *source, int dmg) if ( source->isFire() && hasEffect(MobEffect::fireResistance) ) { // 4J-JEV, for new achievement Stayin'Frosty, TODO merge with Java version. - std::shared_ptr plr = dynamic_pointer_cast(shared_from_this()); + shared_ptr plr = dynamic_pointer_cast(shared_from_this()); if ( plr != NULL && source == DamageSource::lava ) // Only award when in lava (not any fire). { plr->awardStat(GenericStats::stayinFrosty(),GenericStats::param_stayinFrosty()); @@ -672,14 +672,14 @@ bool Mob::hurt(DamageSource *source, int dmg) this->walkAnimSpeed = 1.5f; bool sound = true; - if (invulnerableTime > invulnerableDuration / 2.0f) + if (invulnerableTime > invulnerableDuration / 2.0f) { if (dmg <= lastHurt) return false; if(!level->isClientSide) actuallyHurt(source, dmg - lastHurt); lastHurt = dmg; sound = false; - } - else + } + else { lastHurt = dmg; lastHealth = health; @@ -690,7 +690,7 @@ bool Mob::hurt(DamageSource *source, int dmg) hurtDir = 0; - std::shared_ptr sourceEntity = source->getEntity(); + shared_ptr sourceEntity = source->getEntity(); if (sourceEntity != NULL) { if (dynamic_pointer_cast(sourceEntity) != NULL) { @@ -704,7 +704,7 @@ bool Mob::hurt(DamageSource *source, int dmg) } else if (dynamic_pointer_cast(sourceEntity)) { - std::shared_ptr w = dynamic_pointer_cast(sourceEntity); + shared_ptr w = dynamic_pointer_cast(sourceEntity); if (w->isTame()) { lastHurtByPlayerTime = PLAYER_HURT_EXPERIENCE_TIME; @@ -722,31 +722,31 @@ bool Mob::hurt(DamageSource *source, int dmg) { level->broadcastEntityEvent(shared_from_this(), EntityEvent::HURT); if (source != DamageSource::drown && source != DamageSource::controlledExplosion) markHurt(); - if (sourceEntity != NULL) + if (sourceEntity != NULL) { double xd = sourceEntity->x - x; double zd = sourceEntity->z - z; - while (xd * xd + zd * zd < 0.0001) + while (xd * xd + zd * zd < 0.0001) { xd = (Math::random() - Math::random()) * 0.01; zd = (Math::random() - Math::random()) * 0.01; } hurtDir = (float) (atan2(zd, xd) * 180 / PI) - yRot; knockback(sourceEntity, dmg, xd, zd); - } - else + } + else { hurtDir = (float) (int) ((Math::random() * 2) * 180); // 4J This cast is the same as Java } } MemSect(31); - if (health <= 0) + if (health <= 0) { if (sound) level->playSound(shared_from_this(), getDeathSound(), getSoundVolume(), getVoicePitch()); die(source); - } - else + } + else { if (sound) level->playSound(shared_from_this(), getHurtSound(), getSoundVolume(), getVoicePitch()); } @@ -765,7 +765,7 @@ float Mob::getVoicePitch() return (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f; } -void Mob::animateHurt() +void Mob::animateHurt() { hurtTime = hurtDuration = 10; hurtDir = 0; @@ -806,7 +806,7 @@ int Mob::getDamageAfterMagicAbsorb(DamageSource *damageSource, int damage) return damage; } -void Mob::actuallyHurt(DamageSource *source, int dmg) +void Mob::actuallyHurt(DamageSource *source, int dmg) { dmg = getDamageAfterArmorAbsorb(source, dmg); dmg = getDamageAfterMagicAbsorb(source, dmg); @@ -814,27 +814,27 @@ void Mob::actuallyHurt(DamageSource *source, int dmg) } -float Mob::getSoundVolume() +float Mob::getSoundVolume() { return 1; } -int Mob::getAmbientSound() +int Mob::getAmbientSound() { return -1; } -int Mob::getHurtSound() +int Mob::getHurtSound() { return eSoundType_DAMAGE_HURT; } -int Mob::getDeathSound() +int Mob::getDeathSound() { return eSoundType_DAMAGE_HURT; } -void Mob::knockback(std::shared_ptr source, int dmg, double xd, double zd) +void Mob::knockback(shared_ptr source, int dmg, double xd, double zd) { hasImpulse = true; float dd = (float) sqrt(xd * xd + zd * zd); @@ -851,19 +851,19 @@ void Mob::knockback(std::shared_ptr source, int dmg, double xd, double z if (this->yd > 0.4f) this->yd = 0.4f; } -void Mob::die(DamageSource *source) +void Mob::die(DamageSource *source) { - std::shared_ptr sourceEntity = source->getEntity(); + shared_ptr sourceEntity = source->getEntity(); if (deathScore >= 0 && sourceEntity != NULL) sourceEntity->awardKillScore(shared_from_this(), deathScore); if (sourceEntity != NULL) sourceEntity->killed( dynamic_pointer_cast( shared_from_this() ) ); dead = true; - if (!level->isClientSide) + if (!level->isClientSide) { int playerBonus = 0; - std::shared_ptr player = dynamic_pointer_cast(sourceEntity); + shared_ptr player = dynamic_pointer_cast(sourceEntity); if (player != NULL) { playerBonus = EnchantmentHelper::getKillingLootBonus(player->inventory); @@ -894,7 +894,7 @@ void Mob::die(DamageSource *source) /** * Drop extra rare loot. Only occurs roughly 5% of the time, rareRootLevel * is set to 1 (otherwise 0) 1% of the time. -* +* * @param rareLootLevel */ void Mob::dropRareDeathLoot(int rareLootLevel) @@ -902,10 +902,10 @@ void Mob::dropRareDeathLoot(int rareLootLevel) } -void Mob::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) +void Mob::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) { int loot = getDeathLoot(); - if (loot > 0) + if (loot > 0) { int count = random->nextInt(3); if (playerBonusLevel > 0) @@ -917,16 +917,16 @@ void Mob::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) } } -int Mob::getDeathLoot() +int Mob::getDeathLoot() { return 0; } -void Mob::causeFallDamage(float distance) +void Mob::causeFallDamage(float distance) { Entity::causeFallDamage(distance); int dmg = (int) ceil(distance - 3); - if (dmg > 0) + if (dmg > 0) { // 4J - new sounds here brought forward from 1.2.3 if (dmg > 4) @@ -940,7 +940,7 @@ void Mob::causeFallDamage(float distance) hurt(DamageSource::fall, dmg); int t = level->getTile( Mth::floor(x), Mth::floor(y - 0.2f - this->heightOffset), Mth::floor(z)); - if (t > 0) + if (t > 0) { const Tile::SoundType *soundType = Tile::tiles[t]->soundType; MemSect(31); @@ -950,7 +950,7 @@ void Mob::causeFallDamage(float distance) } } -void Mob::travel(float xa, float ya) +void Mob::travel(float xa, float ya) { #ifdef __PSVITA__ // AP - dynamic_pointer_cast is a non-trivial call @@ -960,9 +960,9 @@ void Mob::travel(float xa, float ya) thisPlayer = (Player*) this; } #else - std::shared_ptr thisPlayer = dynamic_pointer_cast(shared_from_this()); + shared_ptr thisPlayer = dynamic_pointer_cast(shared_from_this()); #endif - if (isInWater() && !(thisPlayer && thisPlayer->abilities.flying) ) + if (isInWater() && !(thisPlayer && thisPlayer->abilities.flying) ) { double yo = y; moveRelative(xa, ya, useNewAi() ? 0.04f : 0.02f); @@ -973,12 +973,12 @@ void Mob::travel(float xa, float ya) zd *= 0.80f; yd -= 0.02; - if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) + if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) { yd = 0.3f; } - } - else if (isInLava() && !(thisPlayer && thisPlayer->abilities.flying) ) + } + else if (isInLava() && !(thisPlayer && thisPlayer->abilities.flying) ) { double yo = y; moveRelative(xa, ya, 0.02f); @@ -988,19 +988,19 @@ void Mob::travel(float xa, float ya) zd *= 0.50f; yd -= 0.02; - if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) + if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) { yd = 0.3f; } - } - else + } + else { float friction = 0.91f; - if (onGround) + if (onGround) { friction = 0.6f * 0.91f; int t = level->getTile(Mth::floor(x), Mth::floor(bb->y0) - 1, Mth::floor(z)); - if (t > 0) + if (t > 0) { friction = Tile::tiles[t]->friction * 0.91f; } @@ -1020,16 +1020,16 @@ void Mob::travel(float xa, float ya) moveRelative(xa, ya, speed); friction = 0.91f; - if (onGround) + if (onGround) { friction = 0.6f * 0.91f; int t = level->getTile( Mth::floor(x), Mth::floor(bb->y0) - 1, Mth::floor(z)); - if (t > 0) + if (t > 0) { friction = Tile::tiles[t]->friction * 0.91f; } } - if (onLadder()) + if (onLadder()) { float max = 0.15f; if (xd < -max) xd = -max; @@ -1044,7 +1044,7 @@ void Mob::travel(float xa, float ya) move(xd, yd, zd); - if (horizontalCollision && onLadder()) + if (horizontalCollision && onLadder()) { yd = 0.2; } @@ -1064,7 +1064,7 @@ void Mob::travel(float xa, float ya) walkAnimPos += walkAnimSpeed; } -bool Mob::onLadder() +bool Mob::onLadder() { int xt = Mth::floor(x); int yt = Mth::floor(bb->y0); @@ -1076,12 +1076,12 @@ bool Mob::onLadder() } -bool Mob::isShootable() +bool Mob::isShootable() { return true; } -void Mob::addAdditonalSaveData(CompoundTag *entityTag) +void Mob::addAdditonalSaveData(CompoundTag *entityTag) { entityTag->putShort(L"Health", (short) health); entityTag->putShort(L"HurtTime", (short) hurtTime); @@ -1106,7 +1106,7 @@ void Mob::addAdditonalSaveData(CompoundTag *entityTag) } } -void Mob::readAdditionalSaveData(CompoundTag *tag) +void Mob::readAdditionalSaveData(CompoundTag *tag) { if (health < Short::MIN_VALUE) health = Short::MIN_VALUE; health = tag->getShort(L"Health"); @@ -1130,12 +1130,12 @@ void Mob::readAdditionalSaveData(CompoundTag *tag) } } -bool Mob::isAlive() +bool Mob::isAlive() { return !removed && health > 0; } -bool Mob::isWaterMob() +bool Mob::isWaterMob() { return false; } @@ -1191,10 +1191,10 @@ void Mob::setJumping(bool jump) jumping = jump; } -void Mob::aiStep() +void Mob::aiStep() { if (noJumpDelay > 0) noJumpDelay--; - if (lSteps > 0) + if (lSteps > 0) { double xt = x + (lx - x) / lSteps; double yt = y + (ly - y) / lSteps; @@ -1236,14 +1236,14 @@ void Mob::aiStep() if (abs(zd) < MIN_MOVEMENT_DISTANCE) zd = 0; } - if (isImmobile()) + if (isImmobile()) { jumping = false; xxa = 0; yya = 0; yRotA = 0; - } - else + } + else { MemSect(25); if (isEffectiveAI()) @@ -1261,13 +1261,13 @@ void Mob::aiStep() MemSect(0); } - if (jumping) + if (jumping) { - if (isInWater() || isInLava() ) + if (isInWater() || isInLava() ) { yd += 0.04f; } - else if (onGround) + else if (onGround) { if (noJumpDelay == 0) { @@ -1293,13 +1293,13 @@ void Mob::aiStep() if(!level->isClientSide) { - vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); - if (entities != NULL && !entities->empty()) + vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); + if (entities != NULL && !entities->empty()) { AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //entities->at(i); + shared_ptr e = *it; //entities->at(i); if (e->isPushable()) e->push(shared_from_this()); } } @@ -1316,7 +1316,7 @@ bool Mob::isEffectiveAI() return !level->isClientSide; } -bool Mob::isImmobile() +bool Mob::isImmobile() { return health <= 0; } @@ -1326,7 +1326,7 @@ bool Mob::isBlocking() return false; } -void Mob::jumpFromGround() +void Mob::jumpFromGround() { yd = 0.42f; if (hasEffect(MobEffect::jump)) @@ -1343,31 +1343,31 @@ void Mob::jumpFromGround() this->hasImpulse = true; } -bool Mob::removeWhenFarAway() +bool Mob::removeWhenFarAway() { return true; } -void Mob::checkDespawn() +void Mob::checkDespawn() { - std::shared_ptr player = level->getNearestPlayer(shared_from_this(), -1); - if (player != NULL) + shared_ptr player = level->getNearestPlayer(shared_from_this(), -1); + if (player != NULL) { double xd = player->x - x; double yd = player->y - y; double zd = player->z - z; double sd = xd * xd + yd * yd + zd * zd; - if (removeWhenFarAway() && sd > 128 * 128) + if (removeWhenFarAway() && sd > 128 * 128) { remove(); } - if (noActionTime > 20 * 30 && random->nextInt(800) == 0 && sd > 32 * 32 && removeWhenFarAway()) + if (noActionTime > 20 * 30 && random->nextInt(800) == 0 && sd > 32 * 32 && removeWhenFarAway()) { remove(); } - else if (sd < 32 * 32) + else if (sd < 32 * 32) { noActionTime = 0; } @@ -1397,7 +1397,7 @@ void Mob::serverAiMobStep() { } -void Mob::serverAiStep() +void Mob::serverAiStep() { noActionTime++; @@ -1407,15 +1407,15 @@ void Mob::serverAiStep() yya = 0; float lookDistance = 8; - if (random->nextFloat() < 0.02f) + if (random->nextFloat() < 0.02f) { - std::shared_ptr player = level->getNearestPlayer(shared_from_this(), lookDistance); - if (player != NULL) + shared_ptr player = level->getNearestPlayer(shared_from_this(), lookDistance); + if (player != NULL) { lookingAt = player; lookTime = 10 + random->nextInt(20); - } - else + } + else { yRotA = (random->nextFloat() - 0.5f) * 20; } @@ -1424,14 +1424,14 @@ void Mob::serverAiStep() if (lookingAt != NULL) { lookAt(lookingAt, 10.0f, (float) getMaxHeadXRot()); - if (lookTime-- <= 0 || lookingAt->removed || lookingAt->distanceToSqr(shared_from_this()) > lookDistance * lookDistance) + if (lookTime-- <= 0 || lookingAt->removed || lookingAt->distanceToSqr(shared_from_this()) > lookDistance * lookDistance) { lookingAt = nullptr; } - } - else + } + else { - if (random->nextFloat() < 0.05f) + if (random->nextFloat() < 0.05f) { yRotA = (random->nextFloat() - 0.5f) * 20; } @@ -1444,23 +1444,23 @@ void Mob::serverAiStep() if (inWater || inLava) jumping = random->nextFloat() < 0.8f; } -int Mob::getMaxHeadXRot() +int Mob::getMaxHeadXRot() { return 40; } -void Mob::lookAt(std::shared_ptr e, float yMax, float xMax) +void Mob::lookAt(shared_ptr e, float yMax, float xMax) { double xd = e->x - x; double yd; double zd = e->z - z; - - std::shared_ptr mob = dynamic_pointer_cast(e); + + shared_ptr mob = dynamic_pointer_cast(e); if(mob != NULL) { yd = (y + getHeadHeight()) - (mob->y + mob->getHeadHeight()); - } - else + } + else { yd = (e->bb->y0 + e->bb->y1) / 2 - (y + getHeadHeight()); } @@ -1473,42 +1473,42 @@ void Mob::lookAt(std::shared_ptr e, float yMax, float xMax) yRot = rotlerp(yRot, yRotD, yMax); } -bool Mob::isLookingAtAnEntity() +bool Mob::isLookingAtAnEntity() { return lookingAt != NULL; } -std::shared_ptr Mob::getLookingAt() +shared_ptr Mob::getLookingAt() { return lookingAt; } -float Mob::rotlerp(float a, float b, float max) +float Mob::rotlerp(float a, float b, float max) { float diff = Mth::wrapDegrees(b - a); - if (diff > max) + if (diff > max) { diff = max; } - if (diff < -max) + if (diff < -max) { diff = -max; } return a + diff; } -bool Mob::canSpawn() +bool Mob::canSpawn() { // 4J - altered to use special containsAnyLiquid variant return level->isUnobstructed(bb) && level->getCubes(shared_from_this(), bb)->empty() && !level->containsAnyLiquid_NoLoad(bb); } -void Mob::outOfWorld() +void Mob::outOfWorld() { hurt(DamageSource::outOfWorld, 4); } -float Mob::getAttackAnim(float a) +float Mob::getAttackAnim(float a) { float diff = attackAnim - oAttackAnim; if (diff < 0) diff += 1; @@ -1516,9 +1516,9 @@ float Mob::getAttackAnim(float a) } -Vec3 *Mob::getPos(float a) +Vec3 *Mob::getPos(float a) { - if (a == 1) + if (a == 1) { return Vec3::newTemp(x, y, z); } @@ -1529,14 +1529,14 @@ Vec3 *Mob::getPos(float a) return Vec3::newTemp(x, y, z); } -Vec3 *Mob::getLookAngle() +Vec3 *Mob::getLookAngle() { return getViewVector(1); } -Vec3 *Mob::getViewVector(float a) +Vec3 *Mob::getViewVector(float a) { - if (a == 1) + if (a == 1) { float yCos = Mth::cos(-yRot * Mth::RAD_TO_GRAD - PI); float ySin = Mth::sin(-yRot * Mth::RAD_TO_GRAD - PI); @@ -1566,7 +1566,7 @@ float Mob::getHeadSizeScale() return 1.0f; } -HitResult *Mob::pick(double range, float a) +HitResult *Mob::pick(double range, float a) { Vec3 *from = getPos(a); Vec3 *b = getViewVector(a); @@ -1574,26 +1574,26 @@ HitResult *Mob::pick(double range, float a) return level->clip(from, to); } -int Mob::getMaxSpawnClusterSize() +int Mob::getMaxSpawnClusterSize() { return 4; } -std::shared_ptr Mob::getCarriedItem() +shared_ptr Mob::getCarriedItem() { return nullptr; } -std::shared_ptr Mob::getArmor(int pos) +shared_ptr Mob::getArmor(int pos) { // 4J Stu - Not implemented yet return nullptr; //return equipment[pos + 1]; } -void Mob::handleEntityEvent(byte id) +void Mob::handleEntityEvent(byte id) { - if (id == EntityEvent::HURT) + if (id == EntityEvent::HURT) { this->walkAnimSpeed = 1.5f; @@ -1605,37 +1605,37 @@ void Mob::handleEntityEvent(byte id) // 4J-PB -added because villagers have no sounds int iHurtSound=getHurtSound(); if(iHurtSound!=-1) - { + { level->playSound(shared_from_this(), iHurtSound, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); } MemSect(0); hurt(DamageSource::genericSource, 0); - } - else if (id == EntityEvent::DEATH) + } + else if (id == EntityEvent::DEATH) { MemSect(31); // 4J-PB -added because villagers have no sounds int iDeathSound=getDeathSound(); if(iDeathSound!=-1) - { + { level->playSound(shared_from_this(), iDeathSound, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); } MemSect(0); health = 0; die(DamageSource::genericSource); - } - else + } + else { Entity::handleEntityEvent(id); } } -bool Mob::isSleeping() +bool Mob::isSleeping() { return false; } -Icon *Mob::getItemInHandIcon(std::shared_ptr item, int layer) +Icon *Mob::getItemInHandIcon(shared_ptr item, int layer) { return item->getIcon(); } @@ -1885,7 +1885,7 @@ float Mob::getWalkingSpeedModifier() return speed; } -void Mob::teleportTo(double x, double y, double z) +void Mob::teleportTo(double x, double y, double z) { moveTo(x, y, z, yRot, xRot); } @@ -1900,7 +1900,7 @@ MobType Mob::getMobType() return UNDEFINED; } -void Mob::breakItem(std::shared_ptr itemInstance) +void Mob::breakItem(shared_ptr itemInstance) { level->playSound(shared_from_this(), eSoundType_RANDOM_BREAK, 0.8f, 0.8f + level->random->nextFloat() * 0.4f); diff --git a/Minecraft.World/Mob.h b/Minecraft.World/Mob.h index 1844922a..0e1af2be 100644 --- a/Minecraft.World/Mob.h +++ b/Minecraft.World/Mob.h @@ -99,13 +99,13 @@ public: float walkAnimPos; protected: - std::shared_ptr lastHurtByPlayer; + shared_ptr lastHurtByPlayer; int lastHurtByPlayerTime; private: - std::shared_ptr lastHurtByMob; + shared_ptr lastHurtByMob; int lastHurtByMobTime; - std::shared_ptr lastHurtMob; + shared_ptr lastHurtMob; public: int arrowCount; @@ -129,7 +129,7 @@ protected: GoalSelector targetSelector; private: - std::shared_ptr target; + shared_ptr target; Sensing *sensing; float speed; @@ -143,17 +143,17 @@ public: virtual PathNavigation *getNavigation(); virtual Sensing *getSensing(); virtual Random *getRandom(); - virtual std::shared_ptr getLastHurtByMob(); - virtual std::shared_ptr getLastHurtMob(); - void setLastHurtMob(std::shared_ptr target); + virtual shared_ptr getLastHurtByMob(); + virtual shared_ptr getLastHurtMob(); + void setLastHurtMob(shared_ptr target); virtual int getNoActionTime(); float getYHeadRot(); void setYHeadRot(float yHeadRot); float getSpeed(); void setSpeed(float speed); - virtual bool doHurtTarget(std::shared_ptr target); - std::shared_ptr getTarget(); - virtual void setTarget(std::shared_ptr target); + virtual bool doHurtTarget(shared_ptr target); + shared_ptr getTarget(); + virtual void setTarget(shared_ptr target); virtual bool canAttackType(eINSTANCEOF targetType); virtual void ate(); @@ -165,13 +165,13 @@ public: void clearRestriction(); bool hasRestriction(); - virtual void setLastHurtByMob(std::shared_ptr hurtBy); + virtual void setLastHurtByMob(shared_ptr hurtBy); protected: virtual void defineSynchedData(); public: - bool canSee(std::shared_ptr target); + bool canSee(shared_ptr target); virtual int getTexture(); // 4J - changed from wstring to int virtual bool isPickable() ; virtual bool isPushable(); @@ -183,7 +183,7 @@ public: protected: virtual void tickDeath(); virtual int decreaseAirSupply(int currentSupply); - virtual int getExperienceReward(std::shared_ptr killedBy); + virtual int getExperienceReward(shared_ptr killedBy); virtual bool isAlwaysExperienceDropper(); public: @@ -222,7 +222,7 @@ public: /** * Fetches the mob's armor value, from 0 (no armor) to 20 (full armor) - * + * * @return */ virtual int getArmorValue(); @@ -239,7 +239,7 @@ protected: virtual int getDeathSound(); public: - void knockback(std::shared_ptr source, int dmg, double xd, double zd); + void knockback(shared_ptr source, int dmg, double xd, double zd); virtual void die(DamageSource *source); protected: @@ -286,7 +286,7 @@ protected: virtual bool removeWhenFarAway(); private: - std::shared_ptr lookingAt; + shared_ptr lookingAt; protected: int lookTime; @@ -300,9 +300,9 @@ public: virtual int getMaxHeadXRot(); protected: - void lookAt(std::shared_ptr e, float yMax, float xMax); + void lookAt(shared_ptr e, float yMax, float xMax); bool isLookingAtAnEntity(); - std::shared_ptr getLookingAt(); + shared_ptr getLookingAt(); private: float rotlerp(float a, float b, float max); @@ -322,11 +322,11 @@ public: virtual float getHeadSizeScale(); HitResult *pick(double range, float a); virtual int getMaxSpawnClusterSize(); - virtual std::shared_ptr getCarriedItem(); - virtual std::shared_ptr getArmor(int pos); + virtual shared_ptr getCarriedItem(); + virtual shared_ptr getArmor(int pos); virtual void handleEntityEvent(byte id); virtual bool isSleeping(); - virtual Icon *getItemInHandIcon(std::shared_ptr item, int layer); + virtual Icon *getItemInHandIcon(shared_ptr item, int layer); virtual bool shouldRender(Vec3 *c); protected: @@ -357,7 +357,7 @@ public: virtual void teleportTo(double x, double y, double z); virtual bool isBaby(); virtual MobType getMobType(); - virtual void breakItem(std::shared_ptr itemInstance); + virtual void breakItem(shared_ptr itemInstance); virtual bool isInvulnerable(); diff --git a/Minecraft.World/MobEffect.cpp b/Minecraft.World/MobEffect.cpp index f9fecc18..f9687a15 100644 --- a/Minecraft.World/MobEffect.cpp +++ b/Minecraft.World/MobEffect.cpp @@ -82,11 +82,11 @@ int MobEffect::getId() * This method should perform periodic updates on the player. Mainly used * for regeneration effects and the like. Other effects, such as blindness, * are in effect for the whole duration of the effect. -* +* * @param mob * @param amplification */ -void MobEffect::applyEffectTick(std::shared_ptr mob, int amplification) +void MobEffect::applyEffectTick(shared_ptr mob, int amplification) { // Maybe move this to separate class implementations in the future? @@ -120,7 +120,7 @@ void MobEffect::applyEffectTick(std::shared_ptr mob, int amplification) } } -void MobEffect::applyInstantenousEffect(std::shared_ptr source, std::shared_ptr mob, int amplification, double scale) +void MobEffect::applyInstantenousEffect(shared_ptr source, shared_ptr mob, int amplification, double scale) { if ((id == heal->id && !mob->isInvertedHealAndHarm()) || (id == harm->id && mob->isInvertedHealAndHarm())) { @@ -152,7 +152,7 @@ bool MobEffect::isInstantenous() * This parameter says if the applyEffect method should be called depending * on the remaining duration ticker. For instance, the regeneration will be * activated every 8 ticks, healing one point of health. -* +* * @param remainingDuration * @param amplification * Effect amplification, starts at 0 (weakest) diff --git a/Minecraft.World/MobEffect.h b/Minecraft.World/MobEffect.h index 6d760e87..b0460bf1 100644 --- a/Minecraft.World/MobEffect.h +++ b/Minecraft.World/MobEffect.h @@ -86,14 +86,14 @@ protected: public: int getId(); - void applyEffectTick(std::shared_ptr mob, int amplification); - void applyInstantenousEffect(std::shared_ptr source, std::shared_ptr mob, int amplification, double scale); + void applyEffectTick(shared_ptr mob, int amplification); + void applyInstantenousEffect(shared_ptr source, shared_ptr mob, int amplification, double scale); virtual bool isInstantenous(); virtual bool isDurationEffectTick(int remainingDuration, int amplification); MobEffect *setDescriptionId(unsigned int id); unsigned int getDescriptionId(int iData = -1); - + // 4J Added MobEffect *setPostfixDescriptionId(unsigned int id); unsigned int getPostfixDescriptionId(int iData = -1); diff --git a/Minecraft.World/MobEffectInstance.cpp b/Minecraft.World/MobEffectInstance.cpp index a05b7b10..1e15e58c 100644 --- a/Minecraft.World/MobEffectInstance.cpp +++ b/Minecraft.World/MobEffectInstance.cpp @@ -64,11 +64,11 @@ int MobEffectInstance::getAmplifier() /** * Runs the effect on a Mob target. -* +* * @param target * @return True if the effect is still active. */ -bool MobEffectInstance::tick(std::shared_ptr target) +bool MobEffectInstance::tick(shared_ptr target) { if (duration > 0) { @@ -86,7 +86,7 @@ int MobEffectInstance::tickDownDuration() return --duration; } -void MobEffectInstance::applyEffect(std::shared_ptr mob) +void MobEffectInstance::applyEffect(shared_ptr mob) { if (duration > 0) { diff --git a/Minecraft.World/MobEffectInstance.h b/Minecraft.World/MobEffectInstance.h index bfecc612..d1c716e6 100644 --- a/Minecraft.World/MobEffectInstance.h +++ b/Minecraft.World/MobEffectInstance.h @@ -24,13 +24,13 @@ public: int getId(); int getDuration(); int getAmplifier(); - bool tick(std::shared_ptr target); + bool tick(shared_ptr target); private: int tickDownDuration(); public: - void applyEffect(std::shared_ptr mob); + void applyEffect(shared_ptr mob); int getDescriptionId(); int getPostfixDescriptionId(); // 4J Added int hashCode(); diff --git a/Minecraft.World/MobSpawner.cpp b/Minecraft.World/MobSpawner.cpp index f89ac395..d2b4f6fd 100644 --- a/Minecraft.World/MobSpawner.cpp +++ b/Minecraft.World/MobSpawner.cpp @@ -100,12 +100,12 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie } MemSect(20); chunksToPoll.clear(); - + #if 0 AUTO_VAR(itEnd, level->players.end()); for (AUTO_VAR(it, level->players.begin()); it != itEnd; it++) { - std::shared_ptr player = *it; //level->players.at(i); + shared_ptr player = *it; //level->players.at(i); int xx = Mth::floor(player->x / 16); int zz = Mth::floor(player->z / 16); @@ -125,7 +125,7 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie int *zz = new int[playerCount]; for (int i = 0; i < playerCount; i++) { - std::shared_ptr player = level->players[i]; + shared_ptr player = level->players[i]; xx[i] = Mth::floor(player->x / 16); zz[i] = Mth::floor(player->z / 16); #ifdef __PSVITA__ @@ -164,20 +164,20 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie #ifdef __PSVITA__ ChunkPos cp = ChunkPos( ( xx[i] - r ) + l , ( zz[i] - r )); if( chunksToPoll.find( cp ) ) chunksToPoll.insert(cp, true); - cp = ChunkPos( ( xx[i] + r ), ( zz[i] - r ) + l ); + cp = ChunkPos( ( xx[i] + r ), ( zz[i] - r ) + l ); if( chunksToPoll.find( cp ) ) chunksToPoll.insert(cp, true); - cp = ChunkPos( ( xx[i] + r ) - l , ( zz[i] + r )); + cp = ChunkPos( ( xx[i] + r ) - l , ( zz[i] + r )); if( chunksToPoll.find( cp ) ) chunksToPoll.insert(cp, true); - cp = ChunkPos( ( xx[i] - r ), ( zz[i] + r ) - l); + cp = ChunkPos( ( xx[i] - r ), ( zz[i] + r ) - l); if( chunksToPoll.find( cp ) ) chunksToPoll.insert(cp, true); #else ChunkPos cp = ChunkPos( ( xx[i] - r ) + l , ( zz[i] - r )); if( chunksToPoll.find( cp ) == chunksToPoll.end() ) chunksToPoll.insert(std::pair(cp, true)); - cp = ChunkPos( ( xx[i] + r ), ( zz[i] - r ) + l ); + cp = ChunkPos( ( xx[i] + r ), ( zz[i] - r ) + l ); if( chunksToPoll.find( cp ) == chunksToPoll.end() ) chunksToPoll.insert(std::pair(cp, true)); - cp = ChunkPos( ( xx[i] + r ) - l , ( zz[i] + r )); + cp = ChunkPos( ( xx[i] + r ) - l , ( zz[i] + r )); if( chunksToPoll.find( cp ) == chunksToPoll.end() ) chunksToPoll.insert(std::pair(cp, true)); - cp = ChunkPos( ( xx[i] - r ), ( zz[i] + r ) - l); + cp = ChunkPos( ( xx[i] - r ), ( zz[i] + r ) - l); if( chunksToPoll.find( cp ) == chunksToPoll.end() ) chunksToPoll.insert(std::pair(cp, true)); #endif @@ -193,7 +193,7 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie MemSect(31); Pos *spawnPos = level->getSharedSpawnPos(); MemSect(0); - + for (unsigned int i = 0; i < MobCategory::values.length; i++) { MobCategory *mobCategory = MobCategory::values[i]; @@ -288,7 +288,7 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie } } - std::shared_ptr mob; + shared_ptr mob; // 4J - removed try/catch // try // { @@ -391,7 +391,7 @@ bool MobSpawner::isSpawnPositionOk(MobCategory *category, Level *level, int x, i // 4J - changed to spawn water things only in deep water int yo = 0; int liquidCount = 0; - + while( ( y - yo ) >= 0 && ( yo < 5 ) ) { if( level->getMaterial(x, y - yo, z)->isLiquid() ) liquidCount++; @@ -423,11 +423,11 @@ bool MobSpawner::isSpawnPositionOk(MobCategory *category, Level *level, int x, i } -void MobSpawner::finalizeMobSettings(std::shared_ptr mob, Level *level, float xx, float yy, float zz) +void MobSpawner::finalizeMobSettings(shared_ptr mob, Level *level, float xx, float yy, float zz) { if (dynamic_pointer_cast( mob ) != NULL && level->random->nextInt(100) == 0) { - std::shared_ptr skeleton = std::shared_ptr( new Skeleton(level) ); + shared_ptr skeleton = shared_ptr( new Skeleton(level) ); skeleton->moveTo(xx, yy, zz, mob->yRot, 0); level->addEntity(skeleton); skeleton->ride(mob); @@ -442,7 +442,7 @@ void MobSpawner::finalizeMobSettings(std::shared_ptr mob, Level *level, flo { for (int kitten = 0; kitten < 2; kitten++) { - std::shared_ptr ozelot = std::shared_ptr(new Ozelot(level)); + shared_ptr ozelot = shared_ptr(new Ozelot(level)); ozelot->moveTo(xx, yy, zz, mob->yRot, 0); ozelot->setAge(-20 * 60 * 20); level->addEntity(ozelot); @@ -459,7 +459,7 @@ eINSTANCEOF MobSpawner::bedEnemies[bedEnemyCount] = { }; -bool MobSpawner::attackSleepingPlayers(Level *level, vector > *players) +bool MobSpawner::attackSleepingPlayers(Level *level, vector > *players) { bool somebodyWokeUp = false; @@ -469,7 +469,7 @@ bool MobSpawner::attackSleepingPlayers(Level *level, vectorend()); for (AUTO_VAR(it, players->begin()); it != itEnd; it++) { - std::shared_ptr player = (*it); + shared_ptr player = (*it); bool nextPlayer = false; @@ -514,7 +514,7 @@ bool MobSpawner::attackSleepingPlayers(Level *level, vector mob; + shared_ptr mob; // 4J - removed try/catch // try // { @@ -619,7 +619,7 @@ void MobSpawner::postProcessSpawnMobs(Level *level, Biome *biome, int xo, int zo float yy = (float)y; float zz = z + 0.5f; - std::shared_ptr mob; + shared_ptr mob; //try { mob = dynamic_pointer_cast( EntityIO::newByEnumType(type->mobClass, level ) ); //} catch (Exception e) { diff --git a/Minecraft.World/MobSpawner.h b/Minecraft.World/MobSpawner.h index a426f0e6..b5022a77 100644 --- a/Minecraft.World/MobSpawner.h +++ b/Minecraft.World/MobSpawner.h @@ -30,7 +30,7 @@ public: static bool isSpawnPositionOk(MobCategory *category, Level *level, int x, int y, int z); private: - static void finalizeMobSettings(std::shared_ptr mob, Level *level, float xx, float yy, float zz); + static void finalizeMobSettings(shared_ptr mob, Level *level, float xx, float yy, float zz); protected: // 4J Stu TODO This was an array of Class type. I haven't made a base Class type yet, but don't need to @@ -40,7 +40,7 @@ protected: public: - static bool attackSleepingPlayers(Level *level, vector > *players); + static bool attackSleepingPlayers(Level *level, vector > *players); static void postProcessSpawnMobs(Level *level, Biome *biome, int xo, int zo, int cellWidth, int cellHeight, Random *random); }; \ No newline at end of file diff --git a/Minecraft.World/MobSpawnerTile.cpp b/Minecraft.World/MobSpawnerTile.cpp index b16d685f..d926fc24 100644 --- a/Minecraft.World/MobSpawnerTile.cpp +++ b/Minecraft.World/MobSpawnerTile.cpp @@ -7,9 +7,9 @@ MobSpawnerTile::MobSpawnerTile(int id) : EntityTile(id, Material::stone, isSolid { } -std::shared_ptr MobSpawnerTile::newTileEntity(Level *level) +shared_ptr MobSpawnerTile::newTileEntity(Level *level) { - return std::shared_ptr( new MobSpawnerTileEntity() ); + return shared_ptr( new MobSpawnerTileEntity() ); } int MobSpawnerTile::getResource(int data, Random *random, int playerBonusLevel) diff --git a/Minecraft.World/MobSpawnerTile.h b/Minecraft.World/MobSpawnerTile.h index 82ef6ea4..edf3c5e7 100644 --- a/Minecraft.World/MobSpawnerTile.h +++ b/Minecraft.World/MobSpawnerTile.h @@ -9,7 +9,7 @@ class MobSpawnerTile : public EntityTile protected: MobSpawnerTile(int id); public: - virtual std::shared_ptr newTileEntity(Level *level); + virtual shared_ptr newTileEntity(Level *level); virtual int getResource(int data, Random *random, int playerBonusLevel); virtual int getResourceCount(Random *random); virtual bool isSolidRender(bool isServerLevel = false); diff --git a/Minecraft.World/MobSpawnerTileEntity.cpp b/Minecraft.World/MobSpawnerTileEntity.cpp index 31240a40..ce7ae1dc 100644 --- a/Minecraft.World/MobSpawnerTileEntity.cpp +++ b/Minecraft.World/MobSpawnerTileEntity.cpp @@ -35,7 +35,7 @@ MobSpawnerTileEntity::MobSpawnerTileEntity() : TileEntity() displayEntity = nullptr; } -wstring MobSpawnerTileEntity::getEntityId() +wstring MobSpawnerTileEntity::getEntityId() { return entityId; } @@ -81,18 +81,18 @@ void MobSpawnerTileEntity::tick() if (spawnDelay == -1) delay(); - if (spawnDelay > 0) + if (spawnDelay > 0) { spawnDelay--; return; } - for (int c = 0; c < spawnCount; c++) + for (int c = 0; c < spawnCount; c++) { - std::shared_ptr entity = dynamic_pointer_cast (EntityIO::newEntity(entityId, level)); + shared_ptr entity = dynamic_pointer_cast (EntityIO::newEntity(entityId, level)); if (entity == NULL) return; - vector > *vecNearby = level->getEntitiesOfClass(typeid(*entity), AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(8, 4, 8)); + vector > *vecNearby = level->getEntitiesOfClass(typeid(*entity), AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(8, 4, 8)); int nearBy = (int)vecNearby->size(); //4J - IB, TODO, Mob contains no getClass delete vecNearby; @@ -110,16 +110,16 @@ void MobSpawnerTileEntity::tick() return; } - if (entity != NULL) + if (entity != NULL) { double xp = x + (level->random->nextDouble() - level->random->nextDouble()) * 4; double yp = y + level->random->nextInt(3) - 1; double zp = z + (level->random->nextDouble() - level->random->nextDouble()) * 4; - std::shared_ptr mob = dynamic_pointer_cast( entity ); + shared_ptr mob = dynamic_pointer_cast( entity ); entity->moveTo(xp, yp, zp, level->random->nextFloat() * 360, 0); - if (mob == NULL || mob->canSpawn()) + if (mob == NULL || mob->canSpawn()) { fillExtraData(entity); @@ -137,7 +137,7 @@ void MobSpawnerTileEntity::tick() TileEntity::tick(); } -void MobSpawnerTileEntity::fillExtraData(std::shared_ptr entity) +void MobSpawnerTileEntity::fillExtraData(shared_ptr entity) { if (spawnData != NULL) { @@ -156,7 +156,7 @@ void MobSpawnerTileEntity::fillExtraData(std::shared_ptr entity) } } -void MobSpawnerTileEntity::delay() +void MobSpawnerTileEntity::delay() { spawnDelay = minSpawnDelay + level->random->nextInt(maxSpawnDelay - minSpawnDelay); } @@ -201,11 +201,11 @@ void MobSpawnerTileEntity::save(CompoundTag *tag) } } -std::shared_ptr MobSpawnerTileEntity::getDisplayEntity() +shared_ptr MobSpawnerTileEntity::getDisplayEntity() { if (displayEntity == NULL || m_bEntityIdUpdated) { - std::shared_ptr e = EntityIO::newEntity(getEntityId(), NULL); + shared_ptr e = EntityIO::newEntity(getEntityId(), NULL); fillExtraData(e); displayEntity = e; m_bEntityIdUpdated = false; @@ -214,17 +214,17 @@ std::shared_ptr MobSpawnerTileEntity::getDisplayEntity() return displayEntity; } -std::shared_ptr MobSpawnerTileEntity::getUpdatePacket() +shared_ptr MobSpawnerTileEntity::getUpdatePacket() { CompoundTag *tag = new CompoundTag(); save(tag); - return std::shared_ptr( new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_MOB_SPAWNER, tag) ); + return shared_ptr( new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_MOB_SPAWNER, tag) ); } // 4J Added -std::shared_ptr MobSpawnerTileEntity::clone() +shared_ptr MobSpawnerTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new MobSpawnerTileEntity() ); + shared_ptr result = shared_ptr( new MobSpawnerTileEntity() ); TileEntity::clone(result); result->entityId = entityId; diff --git a/Minecraft.World/MobSpawnerTileEntity.h b/Minecraft.World/MobSpawnerTileEntity.h index f22f8e8f..9cfb9f2f 100644 --- a/Minecraft.World/MobSpawnerTileEntity.h +++ b/Minecraft.World/MobSpawnerTileEntity.h @@ -33,8 +33,8 @@ private: int minSpawnDelay; int maxSpawnDelay; int spawnCount; - std::shared_ptr displayEntity; - + shared_ptr displayEntity; + public: MobSpawnerTileEntity(); @@ -42,7 +42,7 @@ public: void setEntityId(const wstring& entityId); bool isNearPlayer(); virtual void tick(); - void fillExtraData(std::shared_ptr entity); + void fillExtraData(shared_ptr entity); private: void delay(); @@ -51,9 +51,9 @@ public: virtual void load(CompoundTag *tag); virtual void save(CompoundTag *tag); - std::shared_ptr getDisplayEntity(); - virtual std::shared_ptr getUpdatePacket(); + shared_ptr getDisplayEntity(); + virtual shared_ptr getUpdatePacket(); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); }; diff --git a/Minecraft.World/MockedLevelStorage.cpp b/Minecraft.World/MockedLevelStorage.cpp index 8ac5fd7c..9a7a63c0 100644 --- a/Minecraft.World/MockedLevelStorage.cpp +++ b/Minecraft.World/MockedLevelStorage.cpp @@ -7,7 +7,7 @@ #include "ConsoleSaveFileIO.h" -LevelData *MockedLevelStorage::prepareLevel() +LevelData *MockedLevelStorage::prepareLevel() { return NULL; } @@ -21,7 +21,7 @@ ChunkStorage *MockedLevelStorage::createChunkStorage(Dimension *dimension) return NULL; } -void MockedLevelStorage::saveLevelData(LevelData *levelData, vector > *players) +void MockedLevelStorage::saveLevelData(LevelData *levelData, vector > *players) { } @@ -34,7 +34,7 @@ PlayerIO *MockedLevelStorage::getPlayerIO() return NULL; } -void MockedLevelStorage::closeAll() +void MockedLevelStorage::closeAll() { } diff --git a/Minecraft.World/MockedLevelStorage.h b/Minecraft.World/MockedLevelStorage.h index e481379e..6a9eed70 100644 --- a/Minecraft.World/MockedLevelStorage.h +++ b/Minecraft.World/MockedLevelStorage.h @@ -5,13 +5,13 @@ using namespace std; #include "ConsoleSavePath.h" -class MockedLevelStorage : public LevelStorage +class MockedLevelStorage : public LevelStorage { public: virtual LevelData *prepareLevel(); virtual void checkSession(); virtual ChunkStorage *createChunkStorage(Dimension *dimension); - virtual void saveLevelData(LevelData *levelData, vector > *players); + virtual void saveLevelData(LevelData *levelData, vector > *players); virtual void saveLevelData(LevelData *levelData); virtual PlayerIO *getPlayerIO(); virtual void closeAll(); diff --git a/Minecraft.World/Monster.cpp b/Minecraft.World/Monster.cpp index 1ec418ae..627ce8d1 100644 --- a/Minecraft.World/Monster.cpp +++ b/Minecraft.World/Monster.cpp @@ -30,7 +30,7 @@ Monster::Monster(Level *level) : PathfinderMob( level ) xpReward = Enemy::XP_REWARD_MEDIUM; } -void Monster::aiStep() +void Monster::aiStep() { float br = getBrightness(1); if (br > 0.5f) @@ -47,28 +47,28 @@ void Monster::tick() if (!level->isClientSide && (level->difficulty == Difficulty::PEACEFUL || Minecraft::GetInstance()->isTutorial() ) ) remove(); } -std::shared_ptr Monster::findAttackTarget() +shared_ptr Monster::findAttackTarget() { #ifndef _FINAL_BUILD if(app.GetMobsDontAttackEnabled()) { - return std::shared_ptr(); + return shared_ptr(); } #endif - std::shared_ptr player = level->getNearestAttackablePlayer(shared_from_this(), 16); + shared_ptr player = level->getNearestAttackablePlayer(shared_from_this(), 16); if (player != NULL && canSee(player) ) return player; - return std::shared_ptr(); + return shared_ptr(); } bool Monster::hurt(DamageSource *source, int dmg) { if (PathfinderMob::hurt(source, dmg)) { - std::shared_ptr sourceEntity = source->getEntity(); + shared_ptr sourceEntity = source->getEntity(); if (rider.lock() == sourceEntity || riding == sourceEntity) return true; - if (sourceEntity != shared_from_this()) + if (sourceEntity != shared_from_this()) { this->attackTarget = sourceEntity; } @@ -79,11 +79,11 @@ bool Monster::hurt(DamageSource *source, int dmg) /** * Performs hurt action, returns if successful -* +* * @param target * @return */ -bool Monster::doHurtTarget(std::shared_ptr target) +bool Monster::doHurtTarget(shared_ptr target) { int dmg = attackDamage; if (hasEffect(MobEffect::damageBoost)) @@ -107,7 +107,7 @@ bool Monster::doHurtTarget(std::shared_ptr target) target->setOnFire(fireAspect * 4); } - std::shared_ptr mob = dynamic_pointer_cast(target); + shared_ptr mob = dynamic_pointer_cast(target); if (mob != NULL) { ThornsEnchantment::doThornsAfterAttack(shared_from_this(), mob, random); @@ -117,7 +117,7 @@ bool Monster::doHurtTarget(std::shared_ptr target) return didHurt; } -void Monster::checkHurtTarget(std::shared_ptr target, float distance) +void Monster::checkHurtTarget(shared_ptr target, float distance) { if (attackTime <= 0 && distance < 2.0f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) { @@ -140,7 +140,7 @@ bool Monster::isDarkEnoughToSpawn() int br = level->getRawBrightness(xt, yt, zt); - if (level->isThundering()) + if (level->isThundering()) { int tmp = level->skyDarken; level->skyDarken = 10; diff --git a/Minecraft.World/Monster.h b/Minecraft.World/Monster.h index 804760ee..2bad48da 100644 --- a/Minecraft.World/Monster.h +++ b/Minecraft.World/Monster.h @@ -27,14 +27,14 @@ public: virtual void tick(); protected: - virtual std::shared_ptr findAttackTarget(); + virtual shared_ptr findAttackTarget(); public: virtual bool hurt(DamageSource *source, int dmg); - virtual bool doHurtTarget(std::shared_ptr target); + virtual bool doHurtTarget(shared_ptr target); protected: - virtual void checkHurtTarget(std::shared_ptr target, float distance); + virtual void checkHurtTarget(shared_ptr target, float distance); public: virtual float getWalkTargetValue(int x, int y, int z); diff --git a/Minecraft.World/MonsterPlacerItem.cpp b/Minecraft.World/MonsterPlacerItem.cpp index 3c7809fe..a2970033 100644 --- a/Minecraft.World/MonsterPlacerItem.cpp +++ b/Minecraft.World/MonsterPlacerItem.cpp @@ -18,7 +18,7 @@ MonsterPlacerItem::MonsterPlacerItem(int id) : Item(id) overlay = NULL; } -wstring MonsterPlacerItem::getHoverName(std::shared_ptr itemInstance) +wstring MonsterPlacerItem::getHoverName(shared_ptr itemInstance) { wstring elementName = getDescription(); @@ -29,14 +29,14 @@ wstring MonsterPlacerItem::getHoverName(std::shared_ptr itemInstan //elementName += " " + I18n.get("entity." + encodeId + ".name"); } else - { + { elementName = replaceAll(elementName,L"{*CREATURE*}",L""); } return elementName; } -int MonsterPlacerItem::getColor(std::shared_ptr item, int spriteLayer) +int MonsterPlacerItem::getColor(shared_ptr item, int spriteLayer) { AUTO_VAR(it, EntityIO::idsSpawnableInCreative.find(item->getAuxValue())); if (it != EntityIO::idsSpawnableInCreative.end()) @@ -65,9 +65,9 @@ Icon *MonsterPlacerItem::getLayerIcon(int auxValue, int spriteLayer) } // 4J-PB - added for dispenser -std::shared_ptr MonsterPlacerItem::canSpawn(int iAuxVal, Level *level, int *piResult) +shared_ptr MonsterPlacerItem::canSpawn(int iAuxVal, Level *level, int *piResult) { - std::shared_ptr newEntity = EntityIO::newById(iAuxVal, level); + shared_ptr newEntity = EntityIO::newById(iAuxVal, level); if (newEntity != NULL) { bool canSpawn = false; @@ -166,7 +166,7 @@ std::shared_ptr MonsterPlacerItem::canSpawn(int iAuxVal, Level *level, i return nullptr; } -bool MonsterPlacerItem::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool MonsterPlacerItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { if (level->isClientSide) { @@ -181,7 +181,7 @@ bool MonsterPlacerItem::useOn(std::shared_ptr itemInstance, std::s // 4J Stu - Force adding this as a tile update level->setTile(x,y,z,0); level->setTile(x,y,z,Tile::mobSpawner_Id); - std::shared_ptr mste = dynamic_pointer_cast( level->getTileEntity(x,y,z) ); + shared_ptr mste = dynamic_pointer_cast( level->getTileEntity(x,y,z) ); if(mste != NULL) { mste->setEntityId( EntityIO::getEncodeId(itemInstance->getAuxValue()) ); @@ -193,7 +193,7 @@ bool MonsterPlacerItem::useOn(std::shared_ptr itemInstance, std::s x += Facing::STEP_X[face]; y += Facing::STEP_Y[face]; z += Facing::STEP_Z[face]; - + double yOff = 0; // 4J-PB - missing parentheses added if (face == Facing::UP && (tile == Tile::fence_Id || tile == Tile::netherFence_Id)) @@ -211,11 +211,11 @@ bool MonsterPlacerItem::useOn(std::shared_ptr itemInstance, std::s } if (spawned) - { + { if (!player->abilities.instabuild) { itemInstance->count--; - } + } } else { @@ -254,20 +254,20 @@ bool MonsterPlacerItem::useOn(std::shared_ptr itemInstance, std::s return true; } -std::shared_ptr MonsterPlacerItem::spawnMobAt(Level *level, int mobId, double x, double y, double z, int *piResult) +shared_ptr MonsterPlacerItem::spawnMobAt(Level *level, int mobId, double x, double y, double z, int *piResult) { if (EntityIO::idsSpawnableInCreative.find(mobId) == EntityIO::idsSpawnableInCreative.end()) { return nullptr; } - std::shared_ptr newEntity = nullptr; + shared_ptr newEntity = nullptr; for (int i = 0; i < SPAWN_COUNT; i++) { newEntity = canSpawn(mobId, level, piResult); - std::shared_ptr mob = dynamic_pointer_cast(newEntity); + shared_ptr mob = dynamic_pointer_cast(newEntity); if (mob) { newEntity->moveTo(x, y, z, Mth::wrapDegrees(level->random->nextFloat() * 360), 0); diff --git a/Minecraft.World/MonsterPlacerItem.h b/Minecraft.World/MonsterPlacerItem.h index bccca915..f1cead6d 100644 --- a/Minecraft.World/MonsterPlacerItem.h +++ b/Minecraft.World/MonsterPlacerItem.h @@ -27,15 +27,15 @@ public: MonsterPlacerItem(int id); - virtual wstring getHoverName(std::shared_ptr itemInstance); - virtual int getColor(std::shared_ptr item, int spriteLayer); + virtual wstring getHoverName(shared_ptr itemInstance); + virtual int getColor(shared_ptr item, int spriteLayer); virtual bool hasMultipleSpriteLayers(); virtual Icon *getLayerIcon(int auxValue, int spriteLayer); - virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - static std::shared_ptr spawnMobAt(Level *level, int mobId, double x, double y, double z, int *piResult); // 4J Added piResult param + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + static shared_ptr spawnMobAt(Level *level, int mobId, double x, double y, double z, int *piResult); // 4J Added piResult param // 4J-PB added for dispenser - static std::shared_ptr canSpawn(int iAuxVal, Level *level, int *piResult); + static shared_ptr canSpawn(int iAuxVal, Level *level, int *piResult); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/MonsterRoomFeature.cpp b/Minecraft.World/MonsterRoomFeature.cpp index cd8e4d53..cd44376a 100644 --- a/Minecraft.World/MonsterRoomFeature.cpp +++ b/Minecraft.World/MonsterRoomFeature.cpp @@ -84,12 +84,12 @@ bool MonsterRoomFeature::place(Level *level, Random *random, int x, int y, int z if (count != 1) continue; level->setTile(xc, yc, zc, Tile::chest_Id); - std::shared_ptr chest = dynamic_pointer_cast( level->getTileEntity(xc, yc, zc) ); + shared_ptr chest = dynamic_pointer_cast( level->getTileEntity(xc, yc, zc) ); if (chest != NULL ) { for (int j = 0; j < 8; j++) { - std::shared_ptr item = randomItem(random); + shared_ptr item = randomItem(random); if (item != NULL) chest->setItem(random->nextInt(chest->getContainerSize()), item); } } @@ -100,7 +100,7 @@ bool MonsterRoomFeature::place(Level *level, Random *random, int x, int y, int z level->setTile(x, y, z, Tile::mobSpawner_Id); - std::shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if( entity != NULL ) { entity->setEntityId(randomEntityId(random)); @@ -110,23 +110,23 @@ bool MonsterRoomFeature::place(Level *level, Random *random, int x, int y, int z } -std::shared_ptr MonsterRoomFeature::randomItem(Random *random) +shared_ptr MonsterRoomFeature::randomItem(Random *random) { int type = random->nextInt(12); - if (type == 0) return std::shared_ptr( new ItemInstance(Item::saddle) ); - if (type == 1) return std::shared_ptr( new ItemInstance(Item::ironIngot, random->nextInt(4) + 1) ); - if (type == 2) return std::shared_ptr( new ItemInstance(Item::bread) ); - if (type == 3) return std::shared_ptr( new ItemInstance(Item::wheat, random->nextInt(4) + 1) ); - if (type == 4) return std::shared_ptr( new ItemInstance(Item::sulphur, random->nextInt(4) + 1) ); - if (type == 5) return std::shared_ptr( new ItemInstance(Item::string, random->nextInt(4) + 1) ); - if (type == 6) return std::shared_ptr( new ItemInstance(Item::bucket_empty) ); - if (type == 7 && random->nextInt(100) == 0) return std::shared_ptr( new ItemInstance(Item::apple_gold) ); - if (type == 8 && random->nextInt(2) == 0) return std::shared_ptr( new ItemInstance(Item::redStone, random->nextInt(4) + 1) ); - if (type == 9 && random->nextInt(10) == 0) return std::shared_ptr( new ItemInstance( Item::items[Item::record_01->id + random->nextInt(2)]) ); - if (type == 10) return std::shared_ptr( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BROWN) ); + if (type == 0) return shared_ptr( new ItemInstance(Item::saddle) ); + if (type == 1) return shared_ptr( new ItemInstance(Item::ironIngot, random->nextInt(4) + 1) ); + if (type == 2) return shared_ptr( new ItemInstance(Item::bread) ); + if (type == 3) return shared_ptr( new ItemInstance(Item::wheat, random->nextInt(4) + 1) ); + if (type == 4) return shared_ptr( new ItemInstance(Item::sulphur, random->nextInt(4) + 1) ); + if (type == 5) return shared_ptr( new ItemInstance(Item::string, random->nextInt(4) + 1) ); + if (type == 6) return shared_ptr( new ItemInstance(Item::bucket_empty) ); + if (type == 7 && random->nextInt(100) == 0) return shared_ptr( new ItemInstance(Item::apple_gold) ); + if (type == 8 && random->nextInt(2) == 0) return shared_ptr( new ItemInstance(Item::redStone, random->nextInt(4) + 1) ); + if (type == 9 && random->nextInt(10) == 0) return shared_ptr( new ItemInstance( Item::items[Item::record_01->id + random->nextInt(2)]) ); + if (type == 10) return shared_ptr( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BROWN) ); if (type == 11) return Item::enchantedBook->createForRandomLoot(random); - return std::shared_ptr(); + return shared_ptr(); } wstring MonsterRoomFeature::randomEntityId(Random *random) diff --git a/Minecraft.World/MonsterRoomFeature.h b/Minecraft.World/MonsterRoomFeature.h index 81eeafde..88304ad6 100644 --- a/Minecraft.World/MonsterRoomFeature.h +++ b/Minecraft.World/MonsterRoomFeature.h @@ -11,6 +11,6 @@ public: virtual bool place(Level *level, Random *random, int x, int y, int z); private: - std::shared_ptr randomItem(Random *random); + shared_ptr randomItem(Random *random); wstring randomEntityId(Random *random); }; diff --git a/Minecraft.World/MoveEntityPacket.cpp b/Minecraft.World/MoveEntityPacket.cpp index ce33c019..b52482f5 100644 --- a/Minecraft.World/MoveEntityPacket.cpp +++ b/Minecraft.World/MoveEntityPacket.cpp @@ -4,7 +4,7 @@ #include "PacketListener.h" #include "MoveEntityPacket.h" -MoveEntityPacket::MoveEntityPacket() +MoveEntityPacket::MoveEntityPacket() { hasRot = false; @@ -28,7 +28,7 @@ MoveEntityPacket::MoveEntityPacket(int id) xRot = 0; } -void MoveEntityPacket::read(DataInputStream *dis) //throws IOException +void MoveEntityPacket::read(DataInputStream *dis) //throws IOException { id = dis->readShort(); } @@ -48,7 +48,7 @@ void MoveEntityPacket::handle(PacketListener *listener) listener->handleMoveEntity(shared_from_this()); } -int MoveEntityPacket::getEstimatedSize() +int MoveEntityPacket::getEstimatedSize() { return 2; } @@ -58,9 +58,9 @@ bool MoveEntityPacket::canBeInvalidated() return true; } -bool MoveEntityPacket::isInvalidatedBy(std::shared_ptr packet) +bool MoveEntityPacket::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target != NULL && target->id == id; } @@ -79,7 +79,7 @@ MoveEntityPacket::PosRot::PosRot(int id, char xa, char ya, char za, char yRot, c hasRot = true; } -void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException +void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException { MoveEntityPacket::read(dis); xa = dis->readByte(); @@ -89,7 +89,7 @@ void MoveEntityPacket::PosRot::read(DataInputStream *dis) //throws IOException xRot = dis->readByte(); } -void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException +void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException { MoveEntityPacket::write(dos); dos->writeByte(xa); @@ -99,12 +99,12 @@ void MoveEntityPacket::PosRot::write(DataOutputStream *dos) //throws IOException dos->writeByte(xRot); } -int MoveEntityPacket::PosRot::getEstimatedSize() +int MoveEntityPacket::PosRot::getEstimatedSize() { return 2+5; } -MoveEntityPacket::Pos::Pos() +MoveEntityPacket::Pos::Pos() { } @@ -115,7 +115,7 @@ MoveEntityPacket::Pos::Pos(int id, char xa, char ya, char za) : MoveEntityPacket this->za = za; } -void MoveEntityPacket::Pos::read(DataInputStream *dis) //throws IOException +void MoveEntityPacket::Pos::read(DataInputStream *dis) //throws IOException { MoveEntityPacket::read(dis); xa = dis->readByte(); @@ -136,7 +136,7 @@ int MoveEntityPacket::Pos::getEstimatedSize() return 2+3; } -MoveEntityPacket::Rot::Rot() +MoveEntityPacket::Rot::Rot() { hasRot = true; } @@ -148,14 +148,14 @@ MoveEntityPacket::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacket(id) hasRot = true; } -void MoveEntityPacket::Rot::read(DataInputStream *dis) //throws IOException +void MoveEntityPacket::Rot::read(DataInputStream *dis) //throws IOException { MoveEntityPacket::read(dis); yRot = dis->readByte(); xRot = dis->readByte(); } -void MoveEntityPacket::Rot::write(DataOutputStream *dos) //throws IOException +void MoveEntityPacket::Rot::write(DataOutputStream *dos) //throws IOException { MoveEntityPacket::write(dos); dos->writeByte(yRot); diff --git a/Minecraft.World/MoveEntityPacket.h b/Minecraft.World/MoveEntityPacket.h index 7dbe0c29..ab16ac3a 100644 --- a/Minecraft.World/MoveEntityPacket.h +++ b/Minecraft.World/MoveEntityPacket.h @@ -24,10 +24,10 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new MoveEntityPacket()); } + static shared_ptr create() { return shared_ptr(new MoveEntityPacket()); } virtual int getId() { return 30; } }; @@ -42,7 +42,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MoveEntityPacket::PosRot()); } + static shared_ptr create() { return shared_ptr(new MoveEntityPacket::PosRot()); } virtual int getId() { return 33; } }; @@ -57,7 +57,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MoveEntityPacket::Pos()); } + static shared_ptr create() { return shared_ptr(new MoveEntityPacket::Pos()); } virtual int getId() { return 31; } }; @@ -72,7 +72,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MoveEntityPacket::Rot()); } + static shared_ptr create() { return shared_ptr(new MoveEntityPacket::Rot()); } virtual int getId() { return 32; } }; \ No newline at end of file diff --git a/Minecraft.World/MoveEntityPacketSmall.cpp b/Minecraft.World/MoveEntityPacketSmall.cpp index 8a46537f..8216478f 100644 --- a/Minecraft.World/MoveEntityPacketSmall.cpp +++ b/Minecraft.World/MoveEntityPacketSmall.cpp @@ -5,7 +5,7 @@ #include "MoveEntityPacketSmall.h" -MoveEntityPacketSmall::MoveEntityPacketSmall() +MoveEntityPacketSmall::MoveEntityPacketSmall() { hasRot = false; @@ -35,7 +35,7 @@ MoveEntityPacketSmall::MoveEntityPacketSmall(int id) xRot = 0; } -void MoveEntityPacketSmall::read(DataInputStream *dis) //throws IOException +void MoveEntityPacketSmall::read(DataInputStream *dis) //throws IOException { id = dis->readShort(); } @@ -55,7 +55,7 @@ void MoveEntityPacketSmall::handle(PacketListener *listener) listener->handleMoveEntitySmall(shared_from_this()); } -int MoveEntityPacketSmall::getEstimatedSize() +int MoveEntityPacketSmall::getEstimatedSize() { return 2; } @@ -65,9 +65,9 @@ bool MoveEntityPacketSmall::canBeInvalidated() return true; } -bool MoveEntityPacketSmall::isInvalidatedBy(std::shared_ptr packet) +bool MoveEntityPacketSmall::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target != NULL && target->id == id; } @@ -86,18 +86,18 @@ MoveEntityPacketSmall::PosRot::PosRot(int id, char xa, char ya, char za, char yR hasRot = true; } -void MoveEntityPacketSmall::PosRot::read(DataInputStream *dis) //throws IOException +void MoveEntityPacketSmall::PosRot::read(DataInputStream *dis) //throws IOException { int idAndRot = dis->readShort(); this->id = idAndRot & 0x07ff; this->yRot = idAndRot >> 11; int xAndYAndZ = (int)dis->readShort(); - this->xa = xAndYAndZ >> 11; + this->xa = xAndYAndZ >> 11; this->ya = (xAndYAndZ << 21 ) >> 26; this->za = (xAndYAndZ << 27 ) >> 27; } -void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOException +void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOException { if( (id < 0 ) || (id >= 2048 ) ) { @@ -110,12 +110,12 @@ void MoveEntityPacketSmall::PosRot::write(DataOutputStream *dos) //throws IOExce dos->writeShort(xAndYAndZ); } -int MoveEntityPacketSmall::PosRot::getEstimatedSize() +int MoveEntityPacketSmall::PosRot::getEstimatedSize() { return 4; } -MoveEntityPacketSmall::Pos::Pos() +MoveEntityPacketSmall::Pos::Pos() { } @@ -126,7 +126,7 @@ MoveEntityPacketSmall::Pos::Pos(int id, char xa, char ya, char za) : MoveEntityP this->za = za; } -void MoveEntityPacketSmall::Pos::read(DataInputStream *dis) //throws IOException +void MoveEntityPacketSmall::Pos::read(DataInputStream *dis) //throws IOException { int idAndY = dis->readShort(); this->id = idAndY & 0x07ff; @@ -154,7 +154,7 @@ int MoveEntityPacketSmall::Pos::getEstimatedSize() return 3; } -MoveEntityPacketSmall::Rot::Rot() +MoveEntityPacketSmall::Rot::Rot() { hasRot = true; } @@ -167,14 +167,14 @@ MoveEntityPacketSmall::Rot::Rot(int id, char yRot, char xRot) : MoveEntityPacket hasRot = true; } -void MoveEntityPacketSmall::Rot::read(DataInputStream *dis) //throws IOException +void MoveEntityPacketSmall::Rot::read(DataInputStream *dis) //throws IOException { int idAndRot = (int)dis->readShort(); this->id = idAndRot & 0x07ff; this->yRot = idAndRot >> 11; } -void MoveEntityPacketSmall::Rot::write(DataOutputStream *dos) //throws IOException +void MoveEntityPacketSmall::Rot::write(DataOutputStream *dos) //throws IOException { if( (id < 0 ) || (id >= 2048 ) ) { diff --git a/Minecraft.World/MoveEntityPacketSmall.h b/Minecraft.World/MoveEntityPacketSmall.h index 2fc54dd6..4218f11b 100644 --- a/Minecraft.World/MoveEntityPacketSmall.h +++ b/Minecraft.World/MoveEntityPacketSmall.h @@ -24,10 +24,10 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new MoveEntityPacketSmall()); } + static shared_ptr create() { return shared_ptr(new MoveEntityPacketSmall()); } virtual int getId() { return 162; } }; @@ -42,7 +42,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MoveEntityPacketSmall::PosRot()); } + static shared_ptr create() { return shared_ptr(new MoveEntityPacketSmall::PosRot()); } virtual int getId() { return 165; } }; @@ -57,7 +57,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MoveEntityPacketSmall::Pos()); } + static shared_ptr create() { return shared_ptr(new MoveEntityPacketSmall::Pos()); } virtual int getId() { return 163; } }; @@ -73,7 +73,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MoveEntityPacketSmall::Rot()); } + static shared_ptr create() { return shared_ptr(new MoveEntityPacketSmall::Rot()); } virtual int getId() { return 164; } }; \ No newline at end of file diff --git a/Minecraft.World/MoveIndoorsGoal.cpp b/Minecraft.World/MoveIndoorsGoal.cpp index 697b2840..215f9a29 100644 --- a/Minecraft.World/MoveIndoorsGoal.cpp +++ b/Minecraft.World/MoveIndoorsGoal.cpp @@ -21,9 +21,9 @@ bool MoveIndoorsGoal::canUse() if ((mob->level->isDay() && !mob->level->isRaining()) || mob->level->dimension->hasCeiling) return false; if (mob->getRandom()->nextInt(50) != 0) return false; if (insideX != -1 && mob->distanceToSqr(insideX, mob->y, insideZ) < 2 * 2) return false; - std::shared_ptr village = mob->level->villages->getClosestVillage(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z), 14); + shared_ptr village = mob->level->villages->getClosestVillage(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z), 14); if (village == NULL) return false; - std::shared_ptr _doorInfo = village->getBestDoorInfo(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z)); + shared_ptr _doorInfo = village->getBestDoorInfo(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z)); doorInfo = _doorInfo; return _doorInfo != NULL; } @@ -36,7 +36,7 @@ bool MoveIndoorsGoal::canContinueToUse() void MoveIndoorsGoal::start() { insideX = -1; - std::shared_ptr _doorInfo = doorInfo.lock(); + shared_ptr _doorInfo = doorInfo.lock(); if( _doorInfo == NULL ) { doorInfo = weak_ptr(); @@ -52,7 +52,7 @@ void MoveIndoorsGoal::start() void MoveIndoorsGoal::stop() { - std::shared_ptr _doorInfo = doorInfo.lock(); + shared_ptr _doorInfo = doorInfo.lock(); if( _doorInfo == NULL ) { doorInfo = weak_ptr(); diff --git a/Minecraft.World/MovePlayerPacket.cpp b/Minecraft.World/MovePlayerPacket.cpp index e5153cb5..9f0a8867 100644 --- a/Minecraft.World/MovePlayerPacket.cpp +++ b/Minecraft.World/MovePlayerPacket.cpp @@ -4,7 +4,7 @@ #include "PacketListener.h" #include "MovePlayerPacket.h" -MovePlayerPacket::MovePlayerPacket() +MovePlayerPacket::MovePlayerPacket() { x = 0; y = 0; @@ -33,12 +33,12 @@ MovePlayerPacket::MovePlayerPacket(bool onGround, bool isFlying) this->isFlying = isFlying; } -void MovePlayerPacket::handle(PacketListener *listener) +void MovePlayerPacket::handle(PacketListener *listener) { listener->handleMovePlayer(shared_from_this()); } -void MovePlayerPacket::read(DataInputStream *dis) //throws IOException +void MovePlayerPacket::read(DataInputStream *dis) //throws IOException { char value = dis->read(); onGround = (value & 0x1) != 0; @@ -46,7 +46,7 @@ void MovePlayerPacket::read(DataInputStream *dis) //throws IOException //onGround = dis->read() != 0; } -void MovePlayerPacket::write(DataOutputStream *dos) //throws IOException +void MovePlayerPacket::write(DataOutputStream *dos) //throws IOException { char value = (onGround ? 0x1 : 0) | (isFlying ? 0x2 : 0); dos->write(value); @@ -63,7 +63,7 @@ bool MovePlayerPacket::canBeInvalidated() return true; } -bool MovePlayerPacket::isInvalidatedBy(std::shared_ptr packet) +bool MovePlayerPacket::isInvalidatedBy(shared_ptr packet) { return true; } @@ -88,7 +88,7 @@ MovePlayerPacket::PosRot::PosRot(double x, double y, double yView, double z, flo this->isFlying = isFlying; } -void MovePlayerPacket::PosRot::read(DataInputStream *dis) //throws IOException +void MovePlayerPacket::PosRot::read(DataInputStream *dis) //throws IOException { x = dis->readDouble(); y = dis->readDouble(); @@ -99,7 +99,7 @@ void MovePlayerPacket::PosRot::read(DataInputStream *dis) //throws IOException MovePlayerPacket::read(dis); } -void MovePlayerPacket::PosRot::write(DataOutputStream *dos) //throws IOException +void MovePlayerPacket::PosRot::write(DataOutputStream *dos) //throws IOException { dos->writeDouble(x); dos->writeDouble(y); @@ -120,7 +120,7 @@ MovePlayerPacket::Pos::Pos() hasPos = true; } -MovePlayerPacket::Pos::Pos(double x, double y, double yView, double z, bool onGround, bool isFlying) +MovePlayerPacket::Pos::Pos(double x, double y, double yView, double z, bool onGround, bool isFlying) { this->x = x; this->y = y; @@ -149,17 +149,17 @@ void MovePlayerPacket::Pos::write(DataOutputStream *dos) //throws IOException MovePlayerPacket::write(dos); } -int MovePlayerPacket::Pos::getEstimatedSize() +int MovePlayerPacket::Pos::getEstimatedSize() { return 8 * 4 + 1; } -MovePlayerPacket::Rot::Rot() +MovePlayerPacket::Rot::Rot() { hasRot = true; } -MovePlayerPacket::Rot::Rot(float yRot, float xRot, bool onGround, bool isFlying) +MovePlayerPacket::Rot::Rot(float yRot, float xRot, bool onGround, bool isFlying) { this->yRot = yRot; this->xRot = xRot; @@ -168,7 +168,7 @@ MovePlayerPacket::Rot::Rot(float yRot, float xRot, bool onGround, bool isFlying) this->isFlying = isFlying; } -void MovePlayerPacket::Rot::read(DataInputStream *dis) //throws IOException +void MovePlayerPacket::Rot::read(DataInputStream *dis) //throws IOException { yRot = dis->readFloat(); xRot = dis->readFloat(); @@ -182,7 +182,7 @@ void MovePlayerPacket::Rot::write(DataOutputStream *dos) //throws IOException MovePlayerPacket::write(dos); } -int MovePlayerPacket::Rot::getEstimatedSize() +int MovePlayerPacket::Rot::getEstimatedSize() { return 8 + 1; } diff --git a/Minecraft.World/MovePlayerPacket.h b/Minecraft.World/MovePlayerPacket.h index d91c0c37..26ae8392 100644 --- a/Minecraft.World/MovePlayerPacket.h +++ b/Minecraft.World/MovePlayerPacket.h @@ -24,10 +24,10 @@ public: virtual void write(DataOutputStream *dos); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new MovePlayerPacket()); } + static shared_ptr create() { return shared_ptr(new MovePlayerPacket()); } virtual int getId() { return 10; } }; @@ -42,7 +42,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MovePlayerPacket::PosRot()); } + static shared_ptr create() { return shared_ptr(new MovePlayerPacket::PosRot()); } virtual int getId() { return 13; } }; @@ -57,7 +57,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MovePlayerPacket::Pos()); } + static shared_ptr create() { return shared_ptr(new MovePlayerPacket::Pos()); } virtual int getId() { return 11; } }; @@ -72,7 +72,7 @@ public: virtual void write(DataOutputStream *dos); virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new MovePlayerPacket::Rot()); } + static shared_ptr create() { return shared_ptr(new MovePlayerPacket::Rot()); } virtual int getId() { return 12; } }; \ No newline at end of file diff --git a/Minecraft.World/MoveThroughVillageGoal.cpp b/Minecraft.World/MoveThroughVillageGoal.cpp index 40acca5d..2405374f 100644 --- a/Minecraft.World/MoveThroughVillageGoal.cpp +++ b/Minecraft.World/MoveThroughVillageGoal.cpp @@ -31,10 +31,10 @@ bool MoveThroughVillageGoal::canUse() if (onlyAtNight && mob->level->isDay()) return false; - std::shared_ptr village = mob->level->villages->getClosestVillage(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z), 0); + shared_ptr village = mob->level->villages->getClosestVillage(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z), 0); if (village == NULL) return false; - std::shared_ptr _doorInfo = getNextDoorInfo(village); + shared_ptr _doorInfo = getNextDoorInfo(village); if (_doorInfo == NULL) return false; doorInfo = _doorInfo; @@ -59,7 +59,7 @@ bool MoveThroughVillageGoal::canContinueToUse() { if (mob->getNavigation()->isDone()) return false; float dist = mob->bbWidth + 4.f; - std::shared_ptr _doorInfo = doorInfo.lock(); + shared_ptr _doorInfo = doorInfo.lock(); if( _doorInfo == NULL ) return false; return mob->distanceToSqr(_doorInfo->x, _doorInfo->y, _doorInfo->z) > dist * dist; @@ -73,7 +73,7 @@ void MoveThroughVillageGoal::start() void MoveThroughVillageGoal::stop() { - std::shared_ptr _doorInfo = doorInfo.lock(); + shared_ptr _doorInfo = doorInfo.lock(); if( _doorInfo == NULL ) return; if (mob->getNavigation()->isDone() || mob->distanceToSqr(_doorInfo->x, _doorInfo->y, _doorInfo->z) < 4 * 4) @@ -82,15 +82,15 @@ void MoveThroughVillageGoal::stop() } } -std::shared_ptr MoveThroughVillageGoal::getNextDoorInfo(std::shared_ptr village) +shared_ptr MoveThroughVillageGoal::getNextDoorInfo(shared_ptr village) { - std::shared_ptr closest = nullptr; + shared_ptr closest = nullptr; int closestDistSqr = Integer::MAX_VALUE; - vector > *doorInfos = village->getDoorInfos(); + vector > *doorInfos = village->getDoorInfos(); //for (DoorInfo di : doorInfos) for(AUTO_VAR(it, doorInfos->begin()); it != doorInfos->end(); ++it) { - std::shared_ptr di = *it; + shared_ptr di = *it; int distSqr = di->distanceToSqr(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z)); if (distSqr < closestDistSqr) { @@ -102,12 +102,12 @@ std::shared_ptr MoveThroughVillageGoal::getNextDoorInfo(std::shared_pt return closest; } -bool MoveThroughVillageGoal::hasVisited(std::shared_ptrdi) +bool MoveThroughVillageGoal::hasVisited(shared_ptrdi) { //for (DoorInfo di2 : visited) for(AUTO_VAR(it, visited.begin()); it != visited.end(); ) { - std::shared_ptr di2 = (*it).lock(); + shared_ptr di2 = (*it).lock(); if( di2 == NULL ) { it = visited.erase(it); diff --git a/Minecraft.World/MoveThroughVillageGoal.h b/Minecraft.World/MoveThroughVillageGoal.h index 1d14d587..a087e522 100644 --- a/Minecraft.World/MoveThroughVillageGoal.h +++ b/Minecraft.World/MoveThroughVillageGoal.h @@ -26,7 +26,7 @@ public: virtual void stop(); private: - std::shared_ptr getNextDoorInfo(std::shared_ptr village); - bool hasVisited(std::shared_ptr di); + shared_ptr getNextDoorInfo(shared_ptr village); + bool hasVisited(shared_ptr di); void updateVisited(); }; \ No newline at end of file diff --git a/Minecraft.World/MultiTextureTileItem.cpp b/Minecraft.World/MultiTextureTileItem.cpp index 6af8acd2..a41a896f 100644 --- a/Minecraft.World/MultiTextureTileItem.cpp +++ b/Minecraft.World/MultiTextureTileItem.cpp @@ -13,19 +13,19 @@ MultiTextureTileItem::MultiTextureTileItem(int id, Tile *parentTile, int *nameEx setStackedByData(true); } -Icon *MultiTextureTileItem::getIcon(int itemAuxValue) +Icon *MultiTextureTileItem::getIcon(int itemAuxValue) { return parentTile->getTexture(2, itemAuxValue); } -int MultiTextureTileItem::getLevelDataForAuxValue(int auxValue) +int MultiTextureTileItem::getLevelDataForAuxValue(int auxValue) { return auxValue; } unsigned int MultiTextureTileItem::getDescriptionId(int iData) { - if (iData < 0 || iData >= m_iNameExtensionsLength) + if (iData < 0 || iData >= m_iNameExtensionsLength) { iData = 0; } @@ -33,10 +33,10 @@ unsigned int MultiTextureTileItem::getDescriptionId(int iData) return nameExtensions[iData]; } -unsigned int MultiTextureTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int MultiTextureTileItem::getDescriptionId(shared_ptr instance) { int auxValue = instance->getAuxValue(); - if (auxValue < 0 || auxValue >= m_iNameExtensionsLength) + if (auxValue < 0 || auxValue >= m_iNameExtensionsLength) { auxValue = 0; } diff --git a/Minecraft.World/MultiTextureTileItem.h b/Minecraft.World/MultiTextureTileItem.h index 028169cd..078357ea 100644 --- a/Minecraft.World/MultiTextureTileItem.h +++ b/Minecraft.World/MultiTextureTileItem.h @@ -4,7 +4,7 @@ class Tile; -class MultiTextureTileItem : public TileItem +class MultiTextureTileItem : public TileItem { private: Tile *parentTile; @@ -18,5 +18,5 @@ public: virtual Icon *getIcon(int itemAuxValue); virtual int getLevelDataForAuxValue(int auxValue); virtual unsigned int getDescriptionId(int iData = -1); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; diff --git a/Minecraft.World/MushroomCow.cpp b/Minecraft.World/MushroomCow.cpp index 179746f1..a2aef158 100644 --- a/Minecraft.World/MushroomCow.cpp +++ b/Minecraft.World/MushroomCow.cpp @@ -20,18 +20,18 @@ MushroomCow::MushroomCow(Level *level) : Cow(level) this->setSize(0.9f, 1.3f); } -bool MushroomCow::interact(std::shared_ptr player) +bool MushroomCow::interact(shared_ptr player) { - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); if (item != NULL && item->id == Item::bowl_Id && getAge() >= 0) { - if (item->count == 1) + if (item->count == 1) { - player->inventory->setItem(player->inventory->selected, std::shared_ptr( new ItemInstance(Item::mushroomStew) ) ); + player->inventory->setItem(player->inventory->selected, shared_ptr( new ItemInstance(Item::mushroomStew) ) ); return true; } - if (player->inventory->add(std::shared_ptr(new ItemInstance(Item::mushroomStew))) && !player->abilities.instabuild) + if (player->inventory->add(shared_ptr(new ItemInstance(Item::mushroomStew))) && !player->abilities.instabuild) { player->inventory->removeItem(player->inventory->selected, 1); return true; @@ -45,16 +45,16 @@ bool MushroomCow::interact(std::shared_ptr player) { // 4J Stu - We don't need to check spawn limits when adding the new cow, as we are removing the MushroomCow remove(); - std::shared_ptr cow = std::shared_ptr( new Cow(level) ); + shared_ptr cow = shared_ptr( new Cow(level) ); cow->moveTo(x, y, z, yRot, xRot); cow->setHealth(getHealth()); cow->yBodyRot = yBodyRot; level->addEntity(cow); for (int i = 0; i < 5; i++) { - level->addEntity( std::shared_ptr( new ItemEntity(level, x, y + bbHeight, z, std::shared_ptr( new ItemInstance(Tile::mushroom2))) )); + level->addEntity( shared_ptr( new ItemEntity(level, x, y + bbHeight, z, shared_ptr( new ItemInstance(Tile::mushroom2))) )); } - return true; + return true; } return true; } @@ -70,12 +70,12 @@ bool MushroomCow::canSpawn() return ( level->getTile(xt, yt - 1, zt) == Tile::grass_Id || level->getTile(xt, yt - 1, zt) == Tile::mycel_Id ) && level->getDaytimeRawBrightness(xt, yt, zt) > 8 && PathfinderMob::canSpawn(); } -std::shared_ptr MushroomCow::getBreedOffspring(std::shared_ptr target) +shared_ptr MushroomCow::getBreedOffspring(shared_ptr target) { // 4J - added limit to number of animals that can be bred if( level->canCreateMore( GetType(), Level::eSpawnType_Breed) ) { - return std::shared_ptr( new MushroomCow(level) ); + return shared_ptr( new MushroomCow(level) ); } else { diff --git a/Minecraft.World/MushroomCow.h b/Minecraft.World/MushroomCow.h index 27bc9e35..4ec97476 100644 --- a/Minecraft.World/MushroomCow.h +++ b/Minecraft.World/MushroomCow.h @@ -11,7 +11,7 @@ public: public: MushroomCow(Level *level); - virtual bool interact(std::shared_ptr player); + virtual bool interact(shared_ptr player); virtual bool canSpawn(); // 4J added - virtual std::shared_ptr getBreedOffspring(std::shared_ptr target); + virtual shared_ptr getBreedOffspring(shared_ptr target); }; \ No newline at end of file diff --git a/Minecraft.World/MusicTile.cpp b/Minecraft.World/MusicTile.cpp index fe8503e2..ebdb9680 100644 --- a/Minecraft.World/MusicTile.cpp +++ b/Minecraft.World/MusicTile.cpp @@ -12,7 +12,7 @@ void MusicTile::neighborChanged(Level *level, int x, int y, int z, int type) { app.DebugPrintf("-------- Neighbour changed type %d\n", type); bool signal = level->hasNeighborSignal(x, y, z); - std::shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); app.DebugPrintf("-------- Signal is %s, tile is currently %s\n",signal?"TRUE":"FALSE", mte->on?"ON":"OFF"); if (mte != NULL && mte->on != signal) { @@ -30,11 +30,11 @@ bool MusicTile::TestUse() return true; } -bool MusicTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool MusicTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if (soundOnly) return false; if (level->isClientSide) return true; - std::shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if (mte != NULL ) { mte->tune(); @@ -43,16 +43,16 @@ bool MusicTile::use(Level *level, int x, int y, int z, std::shared_ptr p return true; } -void MusicTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void MusicTile::attack(Level *level, int x, int y, int z, shared_ptr player) { if (level->isClientSide) return; - std::shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if( mte != NULL ) mte->playNote(level, x, y, z); } -std::shared_ptr MusicTile::newTileEntity(Level *level) +shared_ptr MusicTile::newTileEntity(Level *level) { - return std::shared_ptr( new MusicTileEntity() ); + return shared_ptr( new MusicTileEntity() ); } void MusicTile::triggerEvent(Level *level, int x, int y, int z, int i, int note) diff --git a/Minecraft.World/MusicTile.h b/Minecraft.World/MusicTile.h index 09c4618b..47333870 100644 --- a/Minecraft.World/MusicTile.h +++ b/Minecraft.World/MusicTile.h @@ -9,8 +9,8 @@ public: MusicTile(int id); virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void attack(Level *level, int x, int y, int z, std::shared_ptr player); - virtual std::shared_ptr newTileEntity(Level *level); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual shared_ptr newTileEntity(Level *level); virtual void triggerEvent(Level *level, int x, int y, int z, int i, int note); }; \ No newline at end of file diff --git a/Minecraft.World/MusicTileEntity.cpp b/Minecraft.World/MusicTileEntity.cpp index 54e1568b..4c2d2615 100644 --- a/Minecraft.World/MusicTileEntity.cpp +++ b/Minecraft.World/MusicTileEntity.cpp @@ -13,7 +13,7 @@ MusicTileEntity::MusicTileEntity() : TileEntity() { note = 0; - + on = false; } @@ -23,7 +23,7 @@ void MusicTileEntity::save(CompoundTag *tag) tag->putByte(L"note", note); } -void MusicTileEntity::load(CompoundTag *tag) +void MusicTileEntity::load(CompoundTag *tag) { TileEntity::load(tag); note = tag->getByte(L"note"); @@ -31,7 +31,7 @@ void MusicTileEntity::load(CompoundTag *tag) if (note > 24) note = 24; } -void MusicTileEntity::tune() +void MusicTileEntity::tune() { note = (byte) ((note + 1) % 25); setChanged(); @@ -53,9 +53,9 @@ void MusicTileEntity::playNote(Level *level, int x, int y, int z) } // 4J Added -std::shared_ptr MusicTileEntity::clone() +shared_ptr MusicTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new MusicTileEntity() ); + shared_ptr result = shared_ptr( new MusicTileEntity() ); TileEntity::clone(result); result->note = note; diff --git a/Minecraft.World/MusicTileEntity.h b/Minecraft.World/MusicTileEntity.h index 6e631981..a4941ff1 100644 --- a/Minecraft.World/MusicTileEntity.h +++ b/Minecraft.World/MusicTileEntity.h @@ -22,5 +22,5 @@ public: void playNote(Level *level, int x, int y, int z); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); }; diff --git a/Minecraft.World/NearestAttackableTargetGoal.cpp b/Minecraft.World/NearestAttackableTargetGoal.cpp index 23bf8d0b..5ed9f4f1 100644 --- a/Minecraft.World/NearestAttackableTargetGoal.cpp +++ b/Minecraft.World/NearestAttackableTargetGoal.cpp @@ -9,7 +9,7 @@ NearestAttackableTargetGoal::DistComp::DistComp(Entity *source) this->source = source; } -bool NearestAttackableTargetGoal::DistComp::operator() (std::shared_ptr e1, std::shared_ptr e2) +bool NearestAttackableTargetGoal::DistComp::operator() (shared_ptr e1, shared_ptr e2) { // Should return true if e1 comes before e2 in the sorted list double distSqr1 = source->distanceToSqr(e1); @@ -38,7 +38,7 @@ bool NearestAttackableTargetGoal::canUse() if (randomInterval > 0 && mob->getRandom()->nextInt(randomInterval) != 0) return false; if (targetType == typeid(Player)) { - std::shared_ptr potentialTarget = mob->level->getNearestAttackablePlayer(mob->shared_from_this(), within); + shared_ptr potentialTarget = mob->level->getNearestAttackablePlayer(mob->shared_from_this(), within); if (canAttack(potentialTarget, false)) { target = weak_ptr(potentialTarget); @@ -47,12 +47,12 @@ bool NearestAttackableTargetGoal::canUse() } else { - vector > *entities = mob->level->getEntitiesOfClass(targetType, mob->bb->grow(within, 4, within)); + vector > *entities = mob->level->getEntitiesOfClass(targetType, mob->bb->grow(within, 4, within)); //Collections.sort(entities, distComp); std::sort(entities->begin(), entities->end(), *distComp); for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - std::shared_ptr potTarget = dynamic_pointer_cast(*it); + shared_ptr potTarget = dynamic_pointer_cast(*it); if (canAttack(potTarget, false)) { target = weak_ptr(potTarget); diff --git a/Minecraft.World/NearestAttackableTargetGoal.h b/Minecraft.World/NearestAttackableTargetGoal.h index af796840..a10e9264 100644 --- a/Minecraft.World/NearestAttackableTargetGoal.h +++ b/Minecraft.World/NearestAttackableTargetGoal.h @@ -13,7 +13,7 @@ public: public: DistComp(Entity *source); - bool operator() (std::shared_ptr e1, std::shared_ptr e2); + bool operator() (shared_ptr e1, shared_ptr e2); }; private: diff --git a/Minecraft.World/NetherBridgePieces.cpp b/Minecraft.World/NetherBridgePieces.cpp index d643904b..9a795e78 100644 --- a/Minecraft.World/NetherBridgePieces.cpp +++ b/Minecraft.World/NetherBridgePieces.cpp @@ -43,7 +43,7 @@ NetherBridgePieces::PieceWeight *NetherBridgePieces::bridgePieceWeights[NetherBr new PieceWeight(EPieceClass_StairsRoom, 10, 3), }; -NetherBridgePieces::PieceWeight *NetherBridgePieces::castlePieceWeights[NetherBridgePieces::CASTLE_PIECEWEIGHTS_COUNT] = +NetherBridgePieces::PieceWeight *NetherBridgePieces::castlePieceWeights[NetherBridgePieces::CASTLE_PIECEWEIGHTS_COUNT] = { new PieceWeight(EPieceClass_CastleStalkRoom, 30, 2), // 4J Stu - Increased weight to ensure that we have these (was 5), required for Nether Wart, and therefore required for brewing new PieceWeight(EPieceClass_CastleSmallCorridorPiece, 25, 0, true), @@ -325,7 +325,7 @@ NetherBridgePieces::BridgeStraight *NetherBridgePieces::BridgeStraight::createPi { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -3, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -386,7 +386,7 @@ NetherBridgePieces::BridgeEndFiller *NetherBridgePieces::BridgeEndFiller::create { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -3, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -475,7 +475,7 @@ NetherBridgePieces::BridgeCrossing *NetherBridgePieces::BridgeCrossing::createPi { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -8, -3, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -576,7 +576,7 @@ NetherBridgePieces::RoomCrossing *NetherBridgePieces::RoomCrossing::createPiece( { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -2, 0, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -641,7 +641,7 @@ NetherBridgePieces::StairsRoom *NetherBridgePieces::StairsRoom::createPiece(list { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -2, 0, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -711,7 +711,7 @@ NetherBridgePieces::MonsterThrone *NetherBridgePieces::MonsterThrone::createPiec { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -2, 0, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -757,7 +757,7 @@ bool NetherBridgePieces::MonsterThrone::postProcess(Level *level, Random *random { hasPlacedMobSpawner = true; level->setTile(x, y, z, Tile::mobSpawner_Id); - std::shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if (entity != NULL) entity->setEntityId(L"Blaze"); } } @@ -789,7 +789,7 @@ NetherBridgePieces::CastleEntrance *NetherBridgePieces::CastleEntrance::createPi { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -5, -3, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -915,7 +915,7 @@ NetherBridgePieces::CastleStalkRoom *NetherBridgePieces::CastleStalkRoom::create { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -5, -3, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1077,7 +1077,7 @@ NetherBridgePieces::CastleSmallCorridorPiece *NetherBridgePieces::CastleSmallCor BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 0, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1137,7 +1137,7 @@ NetherBridgePieces::CastleSmallCorridorCrossingPiece *NetherBridgePieces::Castle { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 0, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1193,7 +1193,7 @@ NetherBridgePieces::CastleSmallCorridorRightTurnPiece *NetherBridgePieces::Castl { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 0, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1254,7 +1254,7 @@ NetherBridgePieces::CastleSmallCorridorLeftTurnPiece *NetherBridgePieces::Castle { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 0, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1315,7 +1315,7 @@ NetherBridgePieces::CastleCorridorStairsPiece *NetherBridgePieces::CastleCorrido { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -7, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1393,7 +1393,7 @@ NetherBridgePieces::CastleCorridorTBalconyPiece *NetherBridgePieces::CastleCorri { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -3, 0, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) diff --git a/Minecraft.World/NetherStalkTile.cpp b/Minecraft.World/NetherStalkTile.cpp index 731552f8..eadf9646 100644 --- a/Minecraft.World/NetherStalkTile.cpp +++ b/Minecraft.World/NetherStalkTile.cpp @@ -92,7 +92,7 @@ void NetherStalkTile::spawnResources(Level *level, int x, int y, int z, int data } for (int i = 0; i < count; i++) { - popResource(level, x, y, z, std::shared_ptr(new ItemInstance(Item::netherStalkSeeds))); + popResource(level, x, y, z, shared_ptr(new ItemInstance(Item::netherStalkSeeds))); } } diff --git a/Minecraft.World/OcelotSitOnTileGoal.cpp b/Minecraft.World/OcelotSitOnTileGoal.cpp index 0d0af7de..f5cf7066 100644 --- a/Minecraft.World/OcelotSitOnTileGoal.cpp +++ b/Minecraft.World/OcelotSitOnTileGoal.cpp @@ -107,7 +107,7 @@ bool OcelotSitOnTileGoal::isValidTarget(Level *level, int x, int y, int z) if (tile == Tile::chest_Id) { - std::shared_ptr chest = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + shared_ptr chest = dynamic_pointer_cast(level->getTileEntity(x, y, z)); if (chest->openCount < 1) { diff --git a/Minecraft.World/OldChunkStorage.cpp b/Minecraft.World/OldChunkStorage.cpp index ca085cbe..c1515c12 100644 --- a/Minecraft.World/OldChunkStorage.cpp +++ b/Minecraft.World/OldChunkStorage.cpp @@ -211,9 +211,9 @@ bool OldChunkStorage::saveEntities(LevelChunk *lc, Level *level, CompoundTag *ta for (int i = 0; i < lc->ENTITY_BLOCKS_LENGTH; i++) { AUTO_VAR(itEnd, lc->entityBlocks[i]->end()); - for( vector >::iterator it = lc->entityBlocks[i]->begin(); it != itEnd; it++ ) + for( vector >::iterator it = lc->entityBlocks[i]->begin(); it != itEnd; it++ ) { - std::shared_ptr e = *it; + shared_ptr e = *it; lc->lastSaveHadEntities = true; CompoundTag *teTag = new CompoundTag(); if (e->save(teTag)) @@ -268,10 +268,10 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, DataOutputStream *dos) ListTag *tileEntityTags = new ListTag(); AUTO_VAR(itEnd, lc->tileEntities.end()); - for( unordered_map, TilePosKeyHash, TilePosKeyEq>::iterator it = lc->tileEntities.begin(); + for( unordered_map, TilePosKeyHash, TilePosKeyEq>::iterator it = lc->tileEntities.begin(); it != itEnd; it++) { - std::shared_ptr te = it->second; + shared_ptr te = it->second; CompoundTag *teTag = new CompoundTag(); te->save(teTag); tileEntityTags->add(teTag); @@ -357,10 +357,10 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, CompoundTag *tag) ListTag *tileEntityTags = new ListTag(); AUTO_VAR(itEnd, lc->tileEntities.end()); - for( unordered_map, TilePosKeyHash, TilePosKeyEq>::iterator it = lc->tileEntities.begin(); + for( unordered_map, TilePosKeyHash, TilePosKeyEq>::iterator it = lc->tileEntities.begin(); it != itEnd; it++) { - std::shared_ptr te = it->second; + shared_ptr te = it->second; CompoundTag *teTag = new CompoundTag(); te->save(teTag); tileEntityTags->add(teTag); @@ -402,7 +402,7 @@ void OldChunkStorage::loadEntities(LevelChunk *lc, Level *level, CompoundTag *ta for (int i = 0; i < entityTags->size(); i++) { CompoundTag *teTag = entityTags->get(i); - std::shared_ptr te = EntityIO::loadStatic(teTag, level); + shared_ptr te = EntityIO::loadStatic(teTag, level); lc->lastSaveHadEntities = true; if (te != NULL) { @@ -417,7 +417,7 @@ void OldChunkStorage::loadEntities(LevelChunk *lc, Level *level, CompoundTag *ta for (int i = 0; i < tileEntityTags->size(); i++) { CompoundTag *teTag = tileEntityTags->get(i); - std::shared_ptr te = TileEntity::loadStatic(teTag); + shared_ptr te = TileEntity::loadStatic(teTag); if (te != NULL) { lc->addTileEntity(te); diff --git a/Minecraft.World/OwnerHurtByTargetGoal.cpp b/Minecraft.World/OwnerHurtByTargetGoal.cpp index 521d859d..e576f575 100644 --- a/Minecraft.World/OwnerHurtByTargetGoal.cpp +++ b/Minecraft.World/OwnerHurtByTargetGoal.cpp @@ -12,7 +12,7 @@ OwnerHurtByTargetGoal::OwnerHurtByTargetGoal(TamableAnimal *tameAnimal) : Target bool OwnerHurtByTargetGoal::canUse() { if (!tameAnimal->isTame()) return false; - std::shared_ptr owner = tameAnimal->getOwner(); + shared_ptr owner = tameAnimal->getOwner(); if (owner == NULL) return false; ownerLastHurtBy = weak_ptr(owner->getLastHurtByMob()); return canAttack(ownerLastHurtBy.lock(), false); diff --git a/Minecraft.World/OwnerHurtTargetGoal.cpp b/Minecraft.World/OwnerHurtTargetGoal.cpp index 9782951b..c6c367d7 100644 --- a/Minecraft.World/OwnerHurtTargetGoal.cpp +++ b/Minecraft.World/OwnerHurtTargetGoal.cpp @@ -12,7 +12,7 @@ OwnerHurtTargetGoal::OwnerHurtTargetGoal(TamableAnimal *tameAnimal) : TargetGoal bool OwnerHurtTargetGoal::canUse() { if (!tameAnimal->isTame()) return false; - std::shared_ptr owner = tameAnimal->getOwner(); + shared_ptr owner = tameAnimal->getOwner(); if (owner == NULL) return false; ownerLastHurt = weak_ptr(owner->getLastHurtMob()); return canAttack(ownerLastHurt.lock(), false); diff --git a/Minecraft.World/Ozelot.cpp b/Minecraft.World/Ozelot.cpp index e43705ec..3c05f357 100644 --- a/Minecraft.World/Ozelot.cpp +++ b/Minecraft.World/Ozelot.cpp @@ -184,7 +184,7 @@ int Ozelot::getDeathLoot() return Item::leather_Id; } -bool Ozelot::doHurtTarget(std::shared_ptr target) +bool Ozelot::doHurtTarget(shared_ptr target) { return target->hurt(DamageSource::mobAttack(dynamic_pointer_cast(shared_from_this())), 3); } @@ -199,9 +199,9 @@ void Ozelot::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) { } -bool Ozelot::interact(std::shared_ptr player) +bool Ozelot::interact(shared_ptr player) { - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); if (isTame()) { if (equalsIgnoreCase(player->getUUID(), getOwnerUUID())) @@ -250,12 +250,12 @@ bool Ozelot::interact(std::shared_ptr player) return TamableAnimal::interact(player); } -std::shared_ptr Ozelot::getBreedOffspring(std::shared_ptr target) +shared_ptr Ozelot::getBreedOffspring(shared_ptr target) { // 4J - added limit to number of animals that can be bred if( level->canCreateMore( GetType(), Level::eSpawnType_Breed) ) { - std::shared_ptr offspring = std::shared_ptr( new Ozelot(level) ); + shared_ptr offspring = shared_ptr( new Ozelot(level) ); if (isTame()) { offspring->setOwnerUUID(getOwnerUUID()); @@ -270,17 +270,17 @@ std::shared_ptr Ozelot::getBreedOffspring(std::shared_ptr } } -bool Ozelot::isFood(std::shared_ptr itemInstance) +bool Ozelot::isFood(shared_ptr itemInstance) { return itemInstance != NULL && itemInstance->id == Item::fish_raw_Id; } -bool Ozelot::canMate(std::shared_ptr animal) +bool Ozelot::canMate(shared_ptr animal) { if (animal == shared_from_this()) return false; if (!isTame()) return false; - std::shared_ptr partner = dynamic_pointer_cast(animal); + shared_ptr partner = dynamic_pointer_cast(animal); if (partner == NULL) return false; if (!partner->isTame()) return false; diff --git a/Minecraft.World/Ozelot.h b/Minecraft.World/Ozelot.h index fd628f4b..c763f3bc 100644 --- a/Minecraft.World/Ozelot.h +++ b/Minecraft.World/Ozelot.h @@ -58,17 +58,17 @@ protected: virtual int getDeathLoot(); public: - virtual bool doHurtTarget(std::shared_ptr target); + virtual bool doHurtTarget(shared_ptr target); virtual bool hurt(DamageSource *source, int dmg); protected: virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: - virtual bool interact(std::shared_ptr player); - virtual std::shared_ptr getBreedOffspring(std::shared_ptr target); - virtual bool isFood(std::shared_ptr itemInstance); - virtual bool canMate(std::shared_ptr animal); + virtual bool interact(shared_ptr player); + virtual shared_ptr getBreedOffspring(shared_ptr target); + virtual bool isFood(shared_ptr itemInstance); + virtual bool canMate(shared_ptr animal); virtual int getCatType(); virtual void setCatType(int type); virtual bool canSpawn(); diff --git a/Minecraft.World/OzelotAttackGoal.cpp b/Minecraft.World/OzelotAttackGoal.cpp index 099a3f8a..27ca2b5c 100644 --- a/Minecraft.World/OzelotAttackGoal.cpp +++ b/Minecraft.World/OzelotAttackGoal.cpp @@ -20,7 +20,7 @@ OzelotAttackGoal::OzelotAttackGoal(Mob *mob) bool OzelotAttackGoal::canUse() { - std::shared_ptr bestTarget = mob->getTarget(); + shared_ptr bestTarget = mob->getTarget(); if (bestTarget == NULL) return false; target = weak_ptr(bestTarget); return true; diff --git a/Minecraft.World/Packet.cpp b/Minecraft.World/Packet.cpp index 48e203f7..8bac8629 100644 --- a/Minecraft.World/Packet.cpp +++ b/Minecraft.World/Packet.cpp @@ -207,7 +207,7 @@ void Packet::map(int id, bool receiveOnClient, bool receiveOnServer, bool sendTo } // 4J Added to record data for outgoing packets -void Packet::recordOutgoingPacket(std::shared_ptr packet) +void Packet::recordOutgoingPacket(shared_ptr packet) { #ifndef _CONTENT_PACKAGE #if PACKET_ENABLE_STAT_TRACKING @@ -285,7 +285,7 @@ int64_t Packet::getIndexedStatValue(unsigned int samplePos, unsigned int rendera } -std::shared_ptr Packet::getPacket(int id) +shared_ptr Packet::getPacket(int id) { // 4J - removed try/catch // try @@ -326,7 +326,7 @@ byteArray Packet::readBytes(DataInputStream *datainputstream) } -bool Packet::canSendToAnyClient(std::shared_ptr packet) +bool Packet::canSendToAnyClient(shared_ptr packet) { int packetId = packet->getId(); @@ -345,10 +345,10 @@ unordered_map Packet::statistics = unordered_ma //int Packet::nextPrint = 0; -std::shared_ptr Packet::readPacket(DataInputStream *dis, bool isServer) // throws IOException TODO 4J JEV, should this declare a throws? +shared_ptr Packet::readPacket(DataInputStream *dis, bool isServer) // throws IOException TODO 4J JEV, should this declare a throws? { int id = 0; - std::shared_ptr packet = nullptr; + shared_ptr packet = nullptr; // 4J - removed try/catch // try @@ -399,7 +399,7 @@ std::shared_ptr Packet::readPacket(DataInputStream *dis, bool isServer) return packet; } -void Packet::writePacket(std::shared_ptr packet, DataOutputStream *dos) // throws IOException TODO 4J JEV, should this declare a throws? +void Packet::writePacket(shared_ptr packet, DataOutputStream *dos) // throws IOException TODO 4J JEV, should this declare a throws? { //app.DebugPrintf("Writing packet %d\n", packet->getId()); dos->write(packet->getId()); @@ -519,7 +519,7 @@ bool Packet::canBeInvalidated() return false; } -bool Packet::isInvalidatedBy(std::shared_ptr packet) +bool Packet::isInvalidatedBy(shared_ptr packet) { return false; } @@ -530,16 +530,16 @@ bool Packet::isAync() } // 4J Stu - Brought these functions forward for enchanting/game rules -std::shared_ptr Packet::readItem(DataInputStream *dis) +shared_ptr Packet::readItem(DataInputStream *dis) { - std::shared_ptr item = nullptr; + shared_ptr item = nullptr; int id = dis->readShort(); if (id >= 0) { int count = dis->readByte(); int damage = dis->readShort(); - item = std::shared_ptr( new ItemInstance(id, count, damage) ); + item = shared_ptr( new ItemInstance(id, count, damage) ); // 4J Stu - Always read/write the tag //if (Item.items[id].canBeDepleted() || Item.items[id].shouldOverrideMultiplayerNBT()) { @@ -550,7 +550,7 @@ std::shared_ptr Packet::readItem(DataInputStream *dis) return item; } -void Packet::writeItem(std::shared_ptr item, DataOutputStream *dos) +void Packet::writeItem(shared_ptr item, DataOutputStream *dos) { if (item == NULL) { diff --git a/Minecraft.World/Packet.h b/Minecraft.World/Packet.h index 46499e0c..0bafe443 100644 --- a/Minecraft.World/Packet.h +++ b/Minecraft.World/Packet.h @@ -10,7 +10,7 @@ class DataOutputStream; class Packet; -typedef std::shared_ptr (*packetCreateFn)(); +typedef shared_ptr (*packetCreateFn)(); class Packet { @@ -62,10 +62,10 @@ public: Packet(); - static std::shared_ptr getPacket(int id); + static shared_ptr getPacket(int id); // 4J Added - static bool canSendToAnyClient(std::shared_ptr packet); + static bool canSendToAnyClient(shared_ptr packet); static void writeBytes(DataOutputStream *dataoutputstream, byteArray bytes); static byteArray readBytes(DataInputStream *datainputstream); @@ -80,7 +80,7 @@ private: static vector renderableStats; static int renderPos; public: - static void recordOutgoingPacket(std::shared_ptr packet); + static void recordOutgoingPacket(shared_ptr packet); static void renderPacketStats(int id); static void renderAllPacketStats(); static void renderAllPacketStatsKey(); @@ -91,8 +91,8 @@ private : //static int nextPrint; public: - static std::shared_ptr readPacket(DataInputStream *dis, bool isServer); - static void writePacket(std::shared_ptr packet, DataOutputStream *dos); + static shared_ptr readPacket(DataInputStream *dis, bool isServer); + static void writePacket(shared_ptr packet, DataOutputStream *dos); static void writeUtf(const wstring& value, DataOutputStream *dos); static wstring readUtf(DataInputStream *dis, int maxLength); virtual void read(DataInputStream *dis) = 0; // throws IOException = 0; TODO 4J JEV, should this declare a throws? @@ -100,12 +100,12 @@ public: virtual void handle(PacketListener *listener) = 0; virtual int getEstimatedSize() = 0; virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); virtual bool isAync(); // 4J Stu - Brought these functions forward for enchanting/game rules - static std::shared_ptr readItem(DataInputStream *dis); - static void writeItem(std::shared_ptr item, DataOutputStream *dos); + static shared_ptr readItem(DataInputStream *dis); + static void writeItem(shared_ptr item, DataOutputStream *dos); static CompoundTag *readNbt(DataInputStream *dis); protected: diff --git a/Minecraft.World/PacketListener.cpp b/Minecraft.World/PacketListener.cpp index 8c507cdc..2f051d7d 100644 --- a/Minecraft.World/PacketListener.cpp +++ b/Minecraft.World/PacketListener.cpp @@ -2,383 +2,383 @@ #include "net.minecraft.network.packet.h" #include "PacketListener.h" -void PacketListener::handleBlockRegionUpdate(std::shared_ptr packet) +void PacketListener::handleBlockRegionUpdate(shared_ptr packet) { } -void PacketListener::onUnhandledPacket(std::shared_ptr packet) +void PacketListener::onUnhandledPacket(shared_ptr packet) { } -void PacketListener::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) +void PacketListener::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) { } -void PacketListener::handleDisconnect(std::shared_ptr packet) +void PacketListener::handleDisconnect(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleLogin(std::shared_ptr packet) +void PacketListener::handleLogin(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleMovePlayer(std::shared_ptr packet) +void PacketListener::handleMovePlayer(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleChunkTilesUpdate(std::shared_ptr packet) +void PacketListener::handleChunkTilesUpdate(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handlePlayerAction(std::shared_ptr packet) +void PacketListener::handlePlayerAction(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTileUpdate(std::shared_ptr packet) +void PacketListener::handleTileUpdate(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleChunkVisibility(std::shared_ptr packet) +void PacketListener::handleChunkVisibility(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleAddPlayer(std::shared_ptr packet) +void PacketListener::handleAddPlayer(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleMoveEntity(std::shared_ptr packet) +void PacketListener::handleMoveEntity(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleMoveEntitySmall(std::shared_ptr packet) +void PacketListener::handleMoveEntitySmall(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTeleportEntity(std::shared_ptr packet) +void PacketListener::handleTeleportEntity(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleUseItem(std::shared_ptr packet) +void PacketListener::handleUseItem(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleSetCarriedItem(std::shared_ptr packet) +void PacketListener::handleSetCarriedItem(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleRemoveEntity(std::shared_ptr packet) +void PacketListener::handleRemoveEntity(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTakeItemEntity(std::shared_ptr packet) +void PacketListener::handleTakeItemEntity(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleChat(std::shared_ptr packet) +void PacketListener::handleChat(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleAddEntity(std::shared_ptr packet) +void PacketListener::handleAddEntity(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleAnimate(std::shared_ptr packet) +void PacketListener::handleAnimate(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handlePlayerCommand(std::shared_ptr packet) +void PacketListener::handlePlayerCommand(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handlePreLogin(std::shared_ptr packet) +void PacketListener::handlePreLogin(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleAddMob(std::shared_ptr packet) +void PacketListener::handleAddMob(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleSetTime(std::shared_ptr packet) +void PacketListener::handleSetTime(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleSetSpawn(std::shared_ptr packet) +void PacketListener::handleSetSpawn(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleSetEntityMotion(std::shared_ptr packet) +void PacketListener::handleSetEntityMotion(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleSetEntityData(std::shared_ptr packet) +void PacketListener::handleSetEntityData(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleRidePacket(std::shared_ptr packet) +void PacketListener::handleRidePacket(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleInteract(std::shared_ptr packet) +void PacketListener::handleInteract(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleEntityEvent(std::shared_ptr packet) +void PacketListener::handleEntityEvent(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleSetHealth(std::shared_ptr packet) +void PacketListener::handleSetHealth(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleRespawn(std::shared_ptr packet) +void PacketListener::handleRespawn(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTexture(std::shared_ptr packet) +void PacketListener::handleTexture(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTextureAndGeometry(std::shared_ptr packet) +void PacketListener::handleTextureAndGeometry(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleExplosion(std::shared_ptr packet) +void PacketListener::handleExplosion(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleContainerOpen(std::shared_ptr packet) +void PacketListener::handleContainerOpen(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleContainerClose(std::shared_ptr packet) +void PacketListener::handleContainerClose(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleContainerClick(std::shared_ptr packet) +void PacketListener::handleContainerClick(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleContainerSetSlot(std::shared_ptr packet) +void PacketListener::handleContainerSetSlot(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleContainerContent(std::shared_ptr packet) +void PacketListener::handleContainerContent(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleSignUpdate(std::shared_ptr packet) +void PacketListener::handleSignUpdate(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleContainerSetData(std::shared_ptr packet) +void PacketListener::handleContainerSetData(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleSetEquippedItem(std::shared_ptr packet) +void PacketListener::handleSetEquippedItem(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleContainerAck(std::shared_ptr packet) +void PacketListener::handleContainerAck(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleAddPainting(std::shared_ptr packet) +void PacketListener::handleAddPainting(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTileEvent(std::shared_ptr packet) +void PacketListener::handleTileEvent(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleAwardStat(std::shared_ptr packet) +void PacketListener::handleAwardStat(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleEntityActionAtPosition(std::shared_ptr packet) +void PacketListener::handleEntityActionAtPosition(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handlePlayerInput(std::shared_ptr packet) +void PacketListener::handlePlayerInput(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleGameEvent(std::shared_ptr packet) +void PacketListener::handleGameEvent(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleAddGlobalEntity(std::shared_ptr packet) +void PacketListener::handleAddGlobalEntity(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleComplexItemData(std::shared_ptr packet) +void PacketListener::handleComplexItemData(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleLevelEvent(std::shared_ptr packet) +void PacketListener::handleLevelEvent(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } // 1.8.2 -void PacketListener::handleGetInfo(std::shared_ptr packet) +void PacketListener::handleGetInfo(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleUpdateMobEffect(std::shared_ptr packet) +void PacketListener::handleUpdateMobEffect(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleRemoveMobEffect(std::shared_ptr packet) +void PacketListener::handleRemoveMobEffect(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handlePlayerInfo(std::shared_ptr packet) +void PacketListener::handlePlayerInfo(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleKeepAlive(std::shared_ptr packet) +void PacketListener::handleKeepAlive(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleSetExperience(std::shared_ptr packet) +void PacketListener::handleSetExperience(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleSetCreativeModeSlot(std::shared_ptr packet) +void PacketListener::handleSetCreativeModeSlot(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleAddExperienceOrb(std::shared_ptr packet) +void PacketListener::handleAddExperienceOrb(shared_ptr packet) { onUnhandledPacket(packet); } // 1.0.1 -void PacketListener::handleContainerButtonClick(std::shared_ptr packet) +void PacketListener::handleContainerButtonClick(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleTileEntityData(std::shared_ptr tileEntityDataPacket) +void PacketListener::handleTileEntityData(shared_ptr tileEntityDataPacket) { onUnhandledPacket(tileEntityDataPacket); } // 1.1 -void PacketListener::handleCustomPayload(std::shared_ptr customPayloadPacket) +void PacketListener::handleCustomPayload(shared_ptr customPayloadPacket) { onUnhandledPacket(customPayloadPacket); } // 1.2.3 -void PacketListener::handleRotateMob(std::shared_ptr rotateMobPacket) +void PacketListener::handleRotateMob(shared_ptr rotateMobPacket) { onUnhandledPacket(rotateMobPacket); } // 1.3.2 -void PacketListener::handleClientProtocolPacket(std::shared_ptr packet) +void PacketListener::handleClientProtocolPacket(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleServerAuthData(std::shared_ptr packet) +void PacketListener::handleServerAuthData(shared_ptr packet) { onUnhandledPacket(packet); } -//void PacketListener::handleSharedKey(std::shared_ptr packet) +//void PacketListener::handleSharedKey(shared_ptr packet) //{ // onUnhandledPacket(packet); //} -void PacketListener::handlePlayerAbilities(std::shared_ptr playerAbilitiesPacket) +void PacketListener::handlePlayerAbilities(shared_ptr playerAbilitiesPacket) { onUnhandledPacket(playerAbilitiesPacket); } -void PacketListener::handleChatAutoComplete(std::shared_ptr packet) +void PacketListener::handleChatAutoComplete(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleClientInformation(std::shared_ptr packet) +void PacketListener::handleClientInformation(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleSoundEvent(std::shared_ptr packet) +void PacketListener::handleSoundEvent(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleTileDestruction(std::shared_ptr packet) +void PacketListener::handleTileDestruction(shared_ptr packet) { onUnhandledPacket(packet); } -void PacketListener::handleClientCommand(std::shared_ptr packet) +void PacketListener::handleClientCommand(shared_ptr packet) { } -//void PacketListener::handleLevelChunks(std::shared_ptr packet) +//void PacketListener::handleLevelChunks(shared_ptr packet) //{ // onUnhandledPacket(packet); //} @@ -390,62 +390,62 @@ bool PacketListener::canHandleAsyncPackets() // 4J Added -void PacketListener::handleCraftItem(std::shared_ptr packet) +void PacketListener::handleCraftItem(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTradeItem(std::shared_ptr packet) +void PacketListener::handleTradeItem(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleDebugOptions(std::shared_ptr packet) +void PacketListener::handleDebugOptions(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleServerSettingsChanged(std::shared_ptr packet) +void PacketListener::handleServerSettingsChanged(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleChunkVisibilityArea(std::shared_ptr packet) +void PacketListener::handleChunkVisibilityArea(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleUpdateProgress(std::shared_ptr packet) +void PacketListener::handleUpdateProgress(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTextureChange(std::shared_ptr packet) +void PacketListener::handleTextureChange(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleTextureAndGeometryChange(std::shared_ptr packet) +void PacketListener::handleTextureAndGeometryChange(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleUpdateGameRuleProgressPacket(std::shared_ptr packet) +void PacketListener::handleUpdateGameRuleProgressPacket(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleKickPlayer(std::shared_ptr packet) +void PacketListener::handleKickPlayer(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleXZ(std::shared_ptr packet) +void PacketListener::handleXZ(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleGameCommand(std::shared_ptr packet) +void PacketListener::handleGameCommand(shared_ptr packet) { - onUnhandledPacket( (std::shared_ptr ) packet); + onUnhandledPacket( (shared_ptr ) packet); } diff --git a/Minecraft.World/PacketListener.h b/Minecraft.World/PacketListener.h index 85d8d122..93b14603 100644 --- a/Minecraft.World/PacketListener.h +++ b/Minecraft.World/PacketListener.h @@ -107,105 +107,105 @@ class PacketListener { public: virtual bool isServerPacketListener() = 0; - virtual void handleBlockRegionUpdate(std::shared_ptr packet); - virtual void onUnhandledPacket(std::shared_ptr packet); + virtual void handleBlockRegionUpdate(shared_ptr packet); + virtual void onUnhandledPacket(shared_ptr packet); virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); - virtual void handleDisconnect(std::shared_ptr packet); - virtual void handleLogin(std::shared_ptr packet); - virtual void handleMovePlayer(std::shared_ptr packet); - virtual void handleChunkTilesUpdate(std::shared_ptr packet); - virtual void handlePlayerAction(std::shared_ptr packet); - virtual void handleTileUpdate(std::shared_ptr packet); - virtual void handleChunkVisibility(std::shared_ptr packet); - virtual void handleAddPlayer(std::shared_ptr packet); - virtual void handleMoveEntity(std::shared_ptr packet); - virtual void handleMoveEntitySmall(std::shared_ptr packet); - virtual void handleTeleportEntity(std::shared_ptr packet); - virtual void handleUseItem(std::shared_ptr packet); - virtual void handleSetCarriedItem(std::shared_ptr packet); - virtual void handleRemoveEntity(std::shared_ptr packet); - virtual void handleTakeItemEntity(std::shared_ptr packet); - virtual void handleChat(std::shared_ptr packet); - virtual void handleAddEntity(std::shared_ptr packet); - virtual void handleAnimate(std::shared_ptr packet); - virtual void handlePlayerCommand(std::shared_ptr packet); - virtual void handlePreLogin(std::shared_ptr packet); - virtual void handleAddMob(std::shared_ptr packet); - virtual void handleSetTime(std::shared_ptr packet); - virtual void handleSetSpawn(std::shared_ptr packet); - virtual void handleSetEntityMotion(std::shared_ptr packet); - virtual void handleSetEntityData(std::shared_ptr packet); - virtual void handleRidePacket(std::shared_ptr packet); - virtual void handleInteract(std::shared_ptr packet); - virtual void handleEntityEvent(std::shared_ptr packet); - virtual void handleSetHealth(std::shared_ptr packet); - virtual void handleRespawn(std::shared_ptr packet); - virtual void handleExplosion(std::shared_ptr packet); - virtual void handleContainerOpen(std::shared_ptr packet); - virtual void handleContainerClose(std::shared_ptr packet); - virtual void handleContainerClick(std::shared_ptr packet); - virtual void handleContainerSetSlot(std::shared_ptr packet); - virtual void handleContainerContent(std::shared_ptr packet); - virtual void handleSignUpdate(std::shared_ptr packet); - virtual void handleContainerSetData(std::shared_ptr packet); - virtual void handleSetEquippedItem(std::shared_ptr packet); - virtual void handleContainerAck(std::shared_ptr packet); - virtual void handleAddPainting(std::shared_ptr packet); - virtual void handleTileEvent(std::shared_ptr packet); - virtual void handleAwardStat(std::shared_ptr packet); - virtual void handleEntityActionAtPosition(std::shared_ptr packet); - virtual void handlePlayerInput(std::shared_ptr packet); - virtual void handleGameEvent(std::shared_ptr packet); - virtual void handleAddGlobalEntity(std::shared_ptr packet); - virtual void handleComplexItemData(std::shared_ptr packet); - virtual void handleLevelEvent(std::shared_ptr packet); + virtual void handleDisconnect(shared_ptr packet); + virtual void handleLogin(shared_ptr packet); + virtual void handleMovePlayer(shared_ptr packet); + virtual void handleChunkTilesUpdate(shared_ptr packet); + virtual void handlePlayerAction(shared_ptr packet); + virtual void handleTileUpdate(shared_ptr packet); + virtual void handleChunkVisibility(shared_ptr packet); + virtual void handleAddPlayer(shared_ptr packet); + virtual void handleMoveEntity(shared_ptr packet); + virtual void handleMoveEntitySmall(shared_ptr packet); + virtual void handleTeleportEntity(shared_ptr packet); + virtual void handleUseItem(shared_ptr packet); + virtual void handleSetCarriedItem(shared_ptr packet); + virtual void handleRemoveEntity(shared_ptr packet); + virtual void handleTakeItemEntity(shared_ptr packet); + virtual void handleChat(shared_ptr packet); + virtual void handleAddEntity(shared_ptr packet); + virtual void handleAnimate(shared_ptr packet); + virtual void handlePlayerCommand(shared_ptr packet); + virtual void handlePreLogin(shared_ptr packet); + virtual void handleAddMob(shared_ptr packet); + virtual void handleSetTime(shared_ptr packet); + virtual void handleSetSpawn(shared_ptr packet); + virtual void handleSetEntityMotion(shared_ptr packet); + virtual void handleSetEntityData(shared_ptr packet); + virtual void handleRidePacket(shared_ptr packet); + virtual void handleInteract(shared_ptr packet); + virtual void handleEntityEvent(shared_ptr packet); + virtual void handleSetHealth(shared_ptr packet); + virtual void handleRespawn(shared_ptr packet); + virtual void handleExplosion(shared_ptr packet); + virtual void handleContainerOpen(shared_ptr packet); + virtual void handleContainerClose(shared_ptr packet); + virtual void handleContainerClick(shared_ptr packet); + virtual void handleContainerSetSlot(shared_ptr packet); + virtual void handleContainerContent(shared_ptr packet); + virtual void handleSignUpdate(shared_ptr packet); + virtual void handleContainerSetData(shared_ptr packet); + virtual void handleSetEquippedItem(shared_ptr packet); + virtual void handleContainerAck(shared_ptr packet); + virtual void handleAddPainting(shared_ptr packet); + virtual void handleTileEvent(shared_ptr packet); + virtual void handleAwardStat(shared_ptr packet); + virtual void handleEntityActionAtPosition(shared_ptr packet); + virtual void handlePlayerInput(shared_ptr packet); + virtual void handleGameEvent(shared_ptr packet); + virtual void handleAddGlobalEntity(shared_ptr packet); + virtual void handleComplexItemData(shared_ptr packet); + virtual void handleLevelEvent(shared_ptr packet); // 1.8.2 - virtual void handleGetInfo(std::shared_ptr packet); - virtual void handleUpdateMobEffect(std::shared_ptr packet); - virtual void handleRemoveMobEffect(std::shared_ptr packet); - virtual void handlePlayerInfo(std::shared_ptr packet); - virtual void handleKeepAlive(std::shared_ptr packet); - virtual void handleSetExperience(std::shared_ptr packet); - virtual void handleSetCreativeModeSlot(std::shared_ptr packet); - virtual void handleAddExperienceOrb(std::shared_ptr packet); + virtual void handleGetInfo(shared_ptr packet); + virtual void handleUpdateMobEffect(shared_ptr packet); + virtual void handleRemoveMobEffect(shared_ptr packet); + virtual void handlePlayerInfo(shared_ptr packet); + virtual void handleKeepAlive(shared_ptr packet); + virtual void handleSetExperience(shared_ptr packet); + virtual void handleSetCreativeModeSlot(shared_ptr packet); + virtual void handleAddExperienceOrb(shared_ptr packet); // 1.0.1 - virtual void handleContainerButtonClick(std::shared_ptr packet); - virtual void handleTileEntityData(std::shared_ptr tileEntityDataPacket); + virtual void handleContainerButtonClick(shared_ptr packet); + virtual void handleTileEntityData(shared_ptr tileEntityDataPacket); // 1.1s - virtual void handleCustomPayload(std::shared_ptr customPayloadPacket); + virtual void handleCustomPayload(shared_ptr customPayloadPacket); // 1.2.3 - virtual void handleRotateMob(std::shared_ptr rotateMobPacket); + virtual void handleRotateMob(shared_ptr rotateMobPacket); // 1.3.2 - virtual void handleClientProtocolPacket(std::shared_ptr packet); - virtual void handleServerAuthData(std::shared_ptr packet); - //virtual void handleSharedKey(std::shared_ptr packet); - virtual void handlePlayerAbilities(std::shared_ptr playerAbilitiesPacket); - virtual void handleChatAutoComplete(std::shared_ptr packet); - virtual void handleClientInformation(std::shared_ptr packet); - virtual void handleSoundEvent(std::shared_ptr packet); - virtual void handleTileDestruction(std::shared_ptr packet); - virtual void handleClientCommand(std::shared_ptr packet); - //virtual void handleLevelChunks(std::shared_ptr packet); + virtual void handleClientProtocolPacket(shared_ptr packet); + virtual void handleServerAuthData(shared_ptr packet); + //virtual void handleSharedKey(shared_ptr packet); + virtual void handlePlayerAbilities(shared_ptr playerAbilitiesPacket); + virtual void handleChatAutoComplete(shared_ptr packet); + virtual void handleClientInformation(shared_ptr packet); + virtual void handleSoundEvent(shared_ptr packet); + virtual void handleTileDestruction(shared_ptr packet); + virtual void handleClientCommand(shared_ptr packet); + //virtual void handleLevelChunks(shared_ptr packet); virtual bool canHandleAsyncPackets(); // 4J Added - virtual void handleCraftItem(std::shared_ptr packet); - virtual void handleTradeItem(std::shared_ptr packet); - virtual void handleDebugOptions(std::shared_ptr packet); - virtual void handleServerSettingsChanged(std::shared_ptr packet); - virtual void handleTexture(std::shared_ptr packet); - virtual void handleTextureAndGeometry(std::shared_ptr packet); - virtual void handleChunkVisibilityArea(std::shared_ptr packet); - virtual void handleUpdateProgress(std::shared_ptr packet); - virtual void handleTextureChange(std::shared_ptr packet); - virtual void handleTextureAndGeometryChange(std::shared_ptr packet); - virtual void handleUpdateGameRuleProgressPacket(std::shared_ptr packet); - virtual void handleKickPlayer(std::shared_ptr packet); - virtual void handleXZ(std::shared_ptr packet); - virtual void handleGameCommand(std::shared_ptr packet); + virtual void handleCraftItem(shared_ptr packet); + virtual void handleTradeItem(shared_ptr packet); + virtual void handleDebugOptions(shared_ptr packet); + virtual void handleServerSettingsChanged(shared_ptr packet); + virtual void handleTexture(shared_ptr packet); + virtual void handleTextureAndGeometry(shared_ptr packet); + virtual void handleChunkVisibilityArea(shared_ptr packet); + virtual void handleUpdateProgress(shared_ptr packet); + virtual void handleTextureChange(shared_ptr packet); + virtual void handleTextureAndGeometryChange(shared_ptr packet); + virtual void handleUpdateGameRuleProgressPacket(shared_ptr packet); + virtual void handleKickPlayer(shared_ptr packet); + virtual void handleXZ(shared_ptr packet); + virtual void handleGameCommand(shared_ptr packet); }; diff --git a/Minecraft.World/Painting.cpp b/Minecraft.World/Painting.cpp index bc4eef38..0d8f35fe 100644 --- a/Minecraft.World/Painting.cpp +++ b/Minecraft.World/Painting.cpp @@ -73,7 +73,7 @@ Painting::Painting(Level *level, int xTile, int yTile, int zTile, int dir) : Han // 4J Stu - If you use this ctor, then you need to call the PaintingPostConstructor } -// 4J Stu - Added this so that we can use some std::shared_ptr functions that were needed in the ctor +// 4J Stu - Added this so that we can use some shared_ptr functions that were needed in the ctor void Painting::PaintingPostConstructor(int dir) { vector *survivableMotives = new vector(); @@ -132,17 +132,17 @@ void Painting::readAdditionalSaveData(CompoundTag *tag) HangingEntity::readAdditionalSaveData(tag); } -int Painting::getWidth() +int Painting::getWidth() { return motive->w; } -int Painting::getHeight() +int Painting::getHeight() { return motive->h; } -void Painting::dropItem() +void Painting::dropItem() { - spawnAtLocation(std::shared_ptr(new ItemInstance(Item::painting)), 0.0f); + spawnAtLocation(shared_ptr(new ItemInstance(Item::painting)), 0.0f); } \ No newline at end of file diff --git a/Minecraft.World/Painting.h b/Minecraft.World/Painting.h index c382420e..7866b662 100644 --- a/Minecraft.World/Painting.h +++ b/Minecraft.World/Painting.h @@ -73,7 +73,7 @@ public: public: // int dir; -// +// // int xTile, yTile, zTile; Motive *motive; @@ -87,7 +87,7 @@ public: Painting(Level *level, int xTile, int yTile, int zTile, int dir); Painting(Level *level, int x, int y, int z, int dir, wstring motiveName); - // 4J Stu - Added this so that we can use some std::shared_ptr functions that were needed in the ctor + // 4J Stu - Added this so that we can use some shared_ptr functions that were needed in the ctor void PaintingPostConstructor(int dir); protected: diff --git a/Minecraft.World/Path.cpp b/Minecraft.World/Path.cpp index 61bd055e..538917f6 100644 --- a/Minecraft.World/Path.cpp +++ b/Minecraft.World/Path.cpp @@ -13,7 +13,7 @@ Path::~Path() } } -Path::Path(NodeArray nodes) +Path::Path(NodeArray nodes) { index = 0; @@ -30,26 +30,26 @@ Path::Path(NodeArray nodes) } } -void Path::next() +void Path::next() { index++; } -bool Path::isDone() +bool Path::isDone() { return index >= length; } -Node *Path::last() +Node *Path::last() { - if (length > 0) + if (length > 0) { return nodes[length - 1]; } return NULL; } -Node *Path::get(int i) +Node *Path::get(int i) { return nodes[i]; } @@ -74,7 +74,7 @@ void Path::setIndex(int index) this->index = index; } -Vec3 *Path::getPos(std::shared_ptr e, int index) +Vec3 *Path::getPos(shared_ptr e, int index) { double x = nodes[index]->x + (int) (e->bbWidth + 1) * 0.5; double y = nodes[index]->y; @@ -82,7 +82,7 @@ Vec3 *Path::getPos(std::shared_ptr e, int index) return Vec3::newTemp(x, y, z); } -Vec3 *Path::currentPos(std::shared_ptr e) +Vec3 *Path::currentPos(shared_ptr e) { return getPos(e, index); } diff --git a/Minecraft.World/Path.h b/Minecraft.World/Path.h index f0983e47..01f56e72 100644 --- a/Minecraft.World/Path.h +++ b/Minecraft.World/Path.h @@ -1,6 +1,6 @@ #pragma once -class Path +class Path { friend class PathFinder; @@ -21,9 +21,9 @@ public: void setSize(int length); int getIndex(); void setIndex(int index); - Vec3 *getPos(std::shared_ptr e, int index); + Vec3 *getPos(shared_ptr e, int index); NodeArray Getarray(); - Vec3 *currentPos(std::shared_ptr e); + Vec3 *currentPos(shared_ptr e); Vec3 *currentPos(); bool sameAs(Path *path); bool endsIn(Vec3 *pos); diff --git a/Minecraft.World/PathNavigation.cpp b/Minecraft.World/PathNavigation.cpp index 30140712..2bf01672 100644 --- a/Minecraft.World/PathNavigation.cpp +++ b/Minecraft.World/PathNavigation.cpp @@ -92,13 +92,13 @@ bool PathNavigation::moveTo(double x, double y, double z, float speed) return moveTo(newPath, speed); } -Path *PathNavigation::createPath(std::shared_ptr target) +Path *PathNavigation::createPath(shared_ptr target) { if (!canUpdatePath()) return NULL; return level->findPath(mob->shared_from_this(), target, maxDist, _canPassDoors, _canOpenDoors, avoidWater, canFloat); } -bool PathNavigation::moveTo(std::shared_ptr target, float speed) +bool PathNavigation::moveTo(shared_ptr target, float speed) { MemSect(53); Path *newPath = createPath(target); diff --git a/Minecraft.World/PathNavigation.h b/Minecraft.World/PathNavigation.h index 9dd40c1d..b8a8cfd6 100644 --- a/Minecraft.World/PathNavigation.h +++ b/Minecraft.World/PathNavigation.h @@ -37,8 +37,8 @@ public: void setCanFloat(bool canFloat); Path *createPath(double x, double y, double z); bool moveTo(double x, double y, double z, float speed); - Path *createPath(std::shared_ptr target); - bool moveTo(std::shared_ptr target, float speed); + Path *createPath(shared_ptr target); + bool moveTo(shared_ptr target, float speed); bool moveTo(Path *newPath, float speed); Path *getPath(); void tick(); diff --git a/Minecraft.World/PathfinderMob.cpp b/Minecraft.World/PathfinderMob.cpp index da6ccd55..b72e064f 100644 --- a/Minecraft.World/PathfinderMob.cpp +++ b/Minecraft.World/PathfinderMob.cpp @@ -71,7 +71,7 @@ void PathfinderMob::serverAiStep() } else if (!holdGround && ((path == NULL && (random->nextInt(180) == 0) || fleeTime > 0) || (random->nextInt(120) == 0 || fleeTime > 0))) { - if(noActionTime < SharedConstants::TICKS_PER_SECOND * 5) + if(noActionTime < SharedConstants::TICKS_PER_SECOND * 5) { findRandomStrollLocation(); } @@ -206,7 +206,7 @@ void PathfinderMob::findRandomStrollLocation(int quadrant/*=-1*/) // 4J - added } } -void PathfinderMob::checkHurtTarget(std::shared_ptr target, float d) +void PathfinderMob::checkHurtTarget(shared_ptr target, float d) { } @@ -215,9 +215,9 @@ float PathfinderMob::getWalkTargetValue(int x, int y, int z) return 0; } -std::shared_ptr PathfinderMob::findAttackTarget() +shared_ptr PathfinderMob::findAttackTarget() { - return std::shared_ptr(); + return shared_ptr(); } @@ -240,12 +240,12 @@ void PathfinderMob::setPath(Path *path) this->path = path; } -std::shared_ptr PathfinderMob::getAttackTarget() +shared_ptr PathfinderMob::getAttackTarget() { return attackTarget; } -void PathfinderMob::setAttackTarget(std::shared_ptr attacker) +void PathfinderMob::setAttackTarget(shared_ptr attacker) { attackTarget = attacker; } diff --git a/Minecraft.World/PathfinderMob.h b/Minecraft.World/PathfinderMob.h index df759f48..fdbadf8c 100644 --- a/Minecraft.World/PathfinderMob.h +++ b/Minecraft.World/PathfinderMob.h @@ -18,27 +18,27 @@ private: Path *path; protected: - std::shared_ptr attackTarget; + shared_ptr attackTarget; bool holdGround; int fleeTime; virtual bool shouldHoldGround(); virtual void serverAiStep(); virtual void findRandomStrollLocation(int quadrant = -1); - virtual void checkHurtTarget(std::shared_ptr target, float d); + virtual void checkHurtTarget(shared_ptr target, float d); public: virtual float getWalkTargetValue(int x, int y, int z); protected: - virtual std::shared_ptr findAttackTarget(); + virtual shared_ptr findAttackTarget(); public: virtual bool canSpawn(); bool isPathFinding(); void setPath(Path *path); - std::shared_ptr getAttackTarget(); - void setAttackTarget(std::shared_ptr attacker); + shared_ptr getAttackTarget(); + void setAttackTarget(shared_ptr attacker); protected: float getWalkingSpeedModifier(); diff --git a/Minecraft.World/PickaxeItem.cpp b/Minecraft.World/PickaxeItem.cpp index d545fba2..5876b9bb 100644 --- a/Minecraft.World/PickaxeItem.cpp +++ b/Minecraft.World/PickaxeItem.cpp @@ -52,7 +52,7 @@ bool PickaxeItem::canDestroySpecial(Tile *tile) } // 4J - brought forward from 1.2.3 -float PickaxeItem::getDestroySpeed(std::shared_ptr itemInstance, Tile *tile) +float PickaxeItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { if (tile != NULL && (tile->material == Material::metal || tile->material == Material::heavyMetal || tile->material == Material::stone)) { diff --git a/Minecraft.World/PickaxeItem.h b/Minecraft.World/PickaxeItem.h index 2ecf1263..52dac510 100644 --- a/Minecraft.World/PickaxeItem.h +++ b/Minecraft.World/PickaxeItem.h @@ -9,12 +9,12 @@ class PickaxeItem : public DiggerItem private: static TileArray *diggables; -public: // +public: // static void staticCtor(); PickaxeItem(int id, const Tier *tier); public: virtual bool canDestroySpecial(Tile *tile); - virtual float getDestroySpeed(std::shared_ptr itemInstance, Tile *tile); // 4J - brought forward from 1.2.3 + virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); // 4J - brought forward from 1.2.3 }; diff --git a/Minecraft.World/Pig.cpp b/Minecraft.World/Pig.cpp index 21086365..b556a936 100644 --- a/Minecraft.World/Pig.cpp +++ b/Minecraft.World/Pig.cpp @@ -56,49 +56,49 @@ int Pig::getMaxHealth() bool Pig::canBeControlledByRider() { - std::shared_ptr item = dynamic_pointer_cast(rider.lock())->getCarriedItem(); + shared_ptr item = dynamic_pointer_cast(rider.lock())->getCarriedItem(); return item != NULL && item->id == Item::carrotOnAStick_Id; } -void Pig::defineSynchedData() +void Pig::defineSynchedData() { Animal::defineSynchedData(); entityData->define(DATA_SADDLE_ID, (byte) 0); } -void Pig::addAdditonalSaveData(CompoundTag *tag) +void Pig::addAdditonalSaveData(CompoundTag *tag) { Animal::addAdditonalSaveData(tag); tag->putBoolean(L"Saddle", hasSaddle()); } -void Pig::readAdditionalSaveData(CompoundTag *tag) +void Pig::readAdditionalSaveData(CompoundTag *tag) { Animal::readAdditionalSaveData(tag); setSaddle(tag->getBoolean(L"Saddle")); } -int Pig::getAmbientSound() +int Pig::getAmbientSound() { return eSoundType_MOB_PIG_AMBIENT; } -int Pig::getHurtSound() +int Pig::getHurtSound() { return eSoundType_MOB_PIG_AMBIENT; } -int Pig::getDeathSound() +int Pig::getDeathSound() { return eSoundType_MOB_PIG_DEATH; } -bool Pig::interact(std::shared_ptr player) +bool Pig::interact(shared_ptr player) { if(!Animal::interact(player)) { - if (hasSaddle() && !level->isClientSide && (rider.lock() == NULL || rider.lock() == player)) + if (hasSaddle() && !level->isClientSide && (rider.lock() == NULL || rider.lock() == player)) { // 4J HEG - Fixed issue with player not being able to dismount pig (issue #4479) player->ride( rider.lock() == player ? nullptr : shared_from_this() ); @@ -109,7 +109,7 @@ bool Pig::interact(std::shared_ptr player) return true; } -int Pig::getDeathLoot() +int Pig::getDeathLoot() { if (this->isOnFire() ) return Item::porkChop_cooked->id; return Item::porkChop_raw_Id; @@ -133,18 +133,18 @@ void Pig::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) if (hasSaddle()) spawnAtLocation(Item::saddle_Id, 1); } -bool Pig::hasSaddle() +bool Pig::hasSaddle() { return (entityData->getByte(DATA_SADDLE_ID) & 1) != 0; } -void Pig::setSaddle(bool value) +void Pig::setSaddle(bool value) { - if (value) + if (value) { entityData->set(DATA_SADDLE_ID, (byte) 1); - } - else + } + else { entityData->set(DATA_SADDLE_ID, (byte) 0); } @@ -153,13 +153,13 @@ void Pig::setSaddle(bool value) void Pig::thunderHit(const LightningBolt *lightningBolt) { if (level->isClientSide) return; - std::shared_ptr pz = std::shared_ptr( new PigZombie(level) ); + shared_ptr pz = shared_ptr( new PigZombie(level) ); pz->moveTo(x, y, z, yRot, xRot); level->addEntity(pz); remove(); } -void Pig::causeFallDamage(float distance) +void Pig::causeFallDamage(float distance) { Animal::causeFallDamage(distance); if (distance > 5 && dynamic_pointer_cast( rider.lock() ) != NULL) @@ -168,12 +168,12 @@ void Pig::causeFallDamage(float distance) } } -std::shared_ptr Pig::getBreedOffspring(std::shared_ptr target) +shared_ptr Pig::getBreedOffspring(shared_ptr target) { // 4J - added limit to number of animals that can be bred if( level->canCreateMore( GetType(), Level::eSpawnType_Breed) ) { - return std::shared_ptr( new Pig(level) ); + return shared_ptr( new Pig(level) ); } else { @@ -181,7 +181,7 @@ std::shared_ptr Pig::getBreedOffspring(std::shared_ptr tar } } -bool Pig::isFood(std::shared_ptr itemInstance) +bool Pig::isFood(shared_ptr itemInstance) { return itemInstance != NULL && itemInstance->id == Item::carrots_Id; } diff --git a/Minecraft.World/Pig.h b/Minecraft.World/Pig.h index 34695b74..adcfbf4e 100644 --- a/Minecraft.World/Pig.h +++ b/Minecraft.World/Pig.h @@ -37,7 +37,7 @@ protected: virtual int getDeathSound(); public: - virtual bool interact(std::shared_ptr player); + virtual bool interact(shared_ptr player); protected: virtual int getDeathLoot(); @@ -52,7 +52,7 @@ protected: virtual void causeFallDamage(float distance); public: - virtual std::shared_ptr getBreedOffspring(std::shared_ptr target); - bool isFood(std::shared_ptr itemInstance); + virtual shared_ptr getBreedOffspring(shared_ptr target); + bool isFood(shared_ptr itemInstance); ControlledByPlayerGoal *getControlGoal(); }; diff --git a/Minecraft.World/PigZombie.cpp b/Minecraft.World/PigZombie.cpp index 35da6eb9..cc060484 100644 --- a/Minecraft.World/PigZombie.cpp +++ b/Minecraft.World/PigZombie.cpp @@ -14,11 +14,11 @@ -std::shared_ptr PigZombie::sword; +shared_ptr PigZombie::sword; void PigZombie::staticCtor() { - PigZombie::sword = std::shared_ptr( new ItemInstance(Item::sword_gold, 1) ); + PigZombie::sword = shared_ptr( new ItemInstance(Item::sword_gold, 1) ); } void PigZombie::_init() @@ -51,7 +51,7 @@ bool PigZombie::useNewAi() return false; } -int PigZombie::getTexture() +int PigZombie::getTexture() { return textureIdx; } @@ -69,7 +69,7 @@ void PigZombie::tick() Zombie::tick(); } -bool PigZombie::canSpawn() +bool PigZombie::canSpawn() { return level->difficulty > Difficulty::PEACEFUL && level->isUnobstructed(bb) && level->getCubes(shared_from_this(), bb)->empty() && !level->containsAnyLiquid(bb); } @@ -86,13 +86,13 @@ void PigZombie::readAdditionalSaveData(CompoundTag *tag) angerTime = tag->getShort(L"Anger"); } -std::shared_ptr PigZombie::findAttackTarget() +shared_ptr PigZombie::findAttackTarget() { #ifndef _FINAL_BUILD #ifdef _DEBUG_MENUS_ENABLED if(app.GetMobsDontAttackEnabled()) { - return std::shared_ptr(); + return shared_ptr(); } #endif #endif @@ -103,17 +103,17 @@ std::shared_ptr PigZombie::findAttackTarget() bool PigZombie::hurt(DamageSource *source, int dmg) { - std::shared_ptr sourceEntity = source->getEntity(); + shared_ptr sourceEntity = source->getEntity(); if (dynamic_pointer_cast(sourceEntity) != NULL) { - vector > *nearby = level->getEntities( shared_from_this(), bb->grow(32, 32, 32)); + vector > *nearby = level->getEntities( shared_from_this(), bb->grow(32, 32, 32)); AUTO_VAR(itEnd, nearby->end()); for (AUTO_VAR(it, nearby->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //nearby->at(i); + shared_ptr e = *it; //nearby->at(i); if (dynamic_pointer_cast(e) != NULL) { - std::shared_ptr pigZombie = dynamic_pointer_cast(e); + shared_ptr pigZombie = dynamic_pointer_cast(e); pigZombie->alert(sourceEntity); } } @@ -122,7 +122,7 @@ bool PigZombie::hurt(DamageSource *source, int dmg) return Zombie::hurt(source, dmg); } -void PigZombie::alert(std::shared_ptr target) +void PigZombie::alert(shared_ptr target) { this->attackTarget = target; angerTime = 20 * 20 + random->nextInt(20 * 20); @@ -162,7 +162,7 @@ void PigZombie::dropRareDeathLoot(int rareLootLevel) { if (rareLootLevel > 0) { - std::shared_ptr sword = std::shared_ptr( new ItemInstance(Item::sword_gold) ); + shared_ptr sword = shared_ptr( new ItemInstance(Item::sword_gold) ); EnchantmentHelper::enchantItem(random, sword, 5); spawnAtLocation(sword, 0); } @@ -195,8 +195,8 @@ void PigZombie::finalizeMobSpawn() setVillager(false); } -std::shared_ptr PigZombie::getCarriedItem() +shared_ptr PigZombie::getCarriedItem() { - // TODO 4J - could be of const std::shared_ptr type. - return (std::shared_ptr ) sword; + // TODO 4J - could be of const shared_ptr type. + return (shared_ptr ) sword; } diff --git a/Minecraft.World/PigZombie.h b/Minecraft.World/PigZombie.h index ff164edf..b47efacb 100644 --- a/Minecraft.World/PigZombie.h +++ b/Minecraft.World/PigZombie.h @@ -5,7 +5,7 @@ using namespace std; class DamageSource; -// SKIN BY XaPhobia Chris Beidler +// SKIN BY XaPhobia Chris Beidler class PigZombie : public Zombie { public: @@ -32,13 +32,13 @@ public: virtual void readAdditionalSaveData(CompoundTag *tag); protected: - virtual std::shared_ptr findAttackTarget(); + virtual shared_ptr findAttackTarget(); public: virtual bool hurt(DamageSource *source, int dmg); private: - void alert(std::shared_ptr target); + void alert(shared_ptr target); protected: virtual int getAmbientSound(); @@ -49,12 +49,12 @@ protected: virtual int getDeathLoot(); private: - static std::shared_ptr sword; + static shared_ptr sword; public: virtual void finalizeMobSpawn(); - std::shared_ptr getCarriedItem(); + shared_ptr getCarriedItem(); static void staticCtor(); }; diff --git a/Minecraft.World/PistonBaseTile.cpp b/Minecraft.World/PistonBaseTile.cpp index ab8199c3..cbad5cec 100644 --- a/Minecraft.World/PistonBaseTile.cpp +++ b/Minecraft.World/PistonBaseTile.cpp @@ -119,12 +119,12 @@ bool PistonBaseTile::isSolidRender(bool isServerLevel) return false; } -bool PistonBaseTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool PistonBaseTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { return false; } -void PistonBaseTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void PistonBaseTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int targetData = getNewFacing(level, x, y, z, dynamic_pointer_cast(by) ); level->setData(x, y, z, targetData); @@ -180,7 +180,7 @@ void PistonBaseTile::checkIfExtend(Level *level, int x, int y, int z) * This method checks neighbor signals for this block and the block above, * and directly beneath. However, it avoids checking blocks that would be * pushed by this block. - * + * * @param level * @param x * @param y @@ -249,7 +249,7 @@ void PistonBaseTile::triggerEvent(Level *level, int x, int y, int z, int param1, else if (param1 == TRIGGER_CONTRACT) { PIXBeginNamedEvent(0,"Contract phase A\n"); - std::shared_ptr prevTileEntity = level->getTileEntity(x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing]); + shared_ptr prevTileEntity = level->getTileEntity(x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing]); if (prevTileEntity != NULL && dynamic_pointer_cast(prevTileEntity) != NULL) { dynamic_pointer_cast(prevTileEntity)->finalTick(); @@ -280,10 +280,10 @@ void PistonBaseTile::triggerEvent(Level *level, int x, int y, int z, int param1, // the block two steps away is a moving piston block piece, // so replace it with the real data, since it's probably // this piston which is changing too fast - std::shared_ptr tileEntity = level->getTileEntity(twoX, twoY, twoZ); + shared_ptr tileEntity = level->getTileEntity(twoX, twoY, twoZ); if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL ) { - std::shared_ptr ppe = dynamic_pointer_cast(tileEntity); + shared_ptr ppe = dynamic_pointer_cast(tileEntity); if (ppe->getFacing() == facing && ppe->isExtending()) { @@ -337,7 +337,7 @@ void PistonBaseTile::triggerEvent(Level *level, int x, int y, int z, int param1, ignoreUpdate(false); } -void PistonBaseTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void PistonBaseTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { int data = (forceData == -1 ) ? level->getData(x, y, z) : forceData; @@ -377,7 +377,7 @@ void PistonBaseTile::updateDefaultShape() setShape(0, 0, 0, 1, 1, 1); } -void PistonBaseTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void PistonBaseTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { setShape(0, 0, 0, 1, 1, 1); Tile::addAABBs(level, x, y, z, box, boxes, source); @@ -404,9 +404,9 @@ bool PistonBaseTile::isExtended(int data) return (data & EXTENDED_BIT) != 0; } -int PistonBaseTile::getNewFacing(Level *level, int x, int y, int z, std::shared_ptr player) +int PistonBaseTile::getNewFacing(Level *level, int x, int y, int z, shared_ptr player) { - if (Mth::abs((float) player->x - x) < 2 && Mth::abs((float) player->z - z) < 2) + if (Mth::abs((float) player->x - x) < 2 && Mth::abs((float) player->z - z) < 2) { // If the player is above the block, the slot is on the top double py = player->y + 1.82 - player->heightOffset; @@ -456,7 +456,7 @@ bool PistonBaseTile::isPushable(int block, Level *level, int cx, int cy, int cz, { return false; } - + if (!allowDestroyable && Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_DESTROY) { return false; @@ -486,7 +486,7 @@ bool PistonBaseTile::canPush(Level *level, int sx, int sy, int sz, int facing) // out of bounds return false; } - + // 4J - added to also check for out of bounds in x/z for our finite world int minXZ = - (level->dimension->getXZSize() * 16 ) / 2; int maxXZ = (level->dimension->getXZSize() * 16 ) / 2 - 1; @@ -529,7 +529,7 @@ bool PistonBaseTile::canPush(Level *level, int sx, int sy, int sz, int facing) void PistonBaseTile::stopSharingIfServer(Level *level, int x, int y, int z) { if( !level->isClientSide ) - { + { MultiPlayerLevel *clientLevel = Minecraft::GetInstance()->getLevel(level->dimension->id); if( clientLevel ) { @@ -552,7 +552,7 @@ bool PistonBaseTile::createPush(Level *level, int sx, int sy, int sz, int facing // out of bounds return false; } - + // 4J - added to also check for out of bounds in x/z for our finite world int minXZ = - (level->dimension->getXZSize() * 16 ) / 2; int maxXZ = (level->dimension->getXZSize() * 16 ) / 2 - 1; diff --git a/Minecraft.World/PistonBaseTile.h b/Minecraft.World/PistonBaseTile.h index c61eec86..0fda1391 100644 --- a/Minecraft.World/PistonBaseTile.h +++ b/Minecraft.World/PistonBaseTile.h @@ -27,8 +27,8 @@ private: static DWORD tlsIdx; // 4J - was just a static but implemented with TLS for our version - static bool ignoreUpdate(); - static void ignoreUpdate(bool set); + static bool ignoreUpdate(); + static void ignoreUpdate(bool set); public: PistonBaseTile(int id, bool isSticky); @@ -42,8 +42,8 @@ public: virtual int getRenderShape(); virtual bool isSolidRender(bool isServerLevel = false); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual void onPlace(Level *level, int x, int y, int z); @@ -53,15 +53,15 @@ private: public: virtual void triggerEvent(Level *level, int x, int y, int z, int param1, int facing); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual void updateDefaultShape(); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual AABB *getAABB(Level *level, int x, int y, int z); virtual bool isCubeShaped(); static int getFacing(int data); static bool isExtended(int data); - static int getNewFacing(Level *level, int x, int y, int z, std::shared_ptr player); + static int getNewFacing(Level *level, int x, int y, int z, shared_ptr player); private: static bool isPushable(int block, Level *level, int cx, int cy, int cz, bool allowDestroyable); static bool canPush(Level *level, int sx, int sy, int sz, int facing); diff --git a/Minecraft.World/PistonExtensionTile.cpp b/Minecraft.World/PistonExtensionTile.cpp index 882a6116..1827ddde 100644 --- a/Minecraft.World/PistonExtensionTile.cpp +++ b/Minecraft.World/PistonExtensionTile.cpp @@ -103,7 +103,7 @@ int PistonExtensionTile::getResourceCount(Random *random) return 0; } -void PistonExtensionTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void PistonExtensionTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { int data = level->getData(x, y, z); @@ -156,7 +156,7 @@ void PistonExtensionTile::addAABBs(Level *level, int x, int y, int z, AABB *box, } -void PistonExtensionTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void PistonExtensionTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { int data = (forceData == -1 ) ? level->getData(x, y, z) : forceData; diff --git a/Minecraft.World/PistonExtensionTile.h b/Minecraft.World/PistonExtensionTile.h index 8ebb9bd1..a0b08729 100644 --- a/Minecraft.World/PistonExtensionTile.h +++ b/Minecraft.World/PistonExtensionTile.h @@ -23,8 +23,8 @@ public: virtual bool mayPlace(Level *level, int x, int y, int z); virtual bool mayPlace(Level *level, int x, int y, int z, int face); virtual int getResourceCount(Random *random); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual void neighborChanged(Level *level, int x, int y, int z, int type); static int getFacing(int data); virtual int cloneTileId(Level *level, int x, int y, int z); diff --git a/Minecraft.World/PistonMovingPiece.cpp b/Minecraft.World/PistonMovingPiece.cpp index a9d661ee..e141cebe 100644 --- a/Minecraft.World/PistonMovingPiece.cpp +++ b/Minecraft.World/PistonMovingPiece.cpp @@ -11,7 +11,7 @@ PistonMovingPiece::PistonMovingPiece(int id) : EntityTile(id, Material::piston, setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME); } -std::shared_ptr PistonMovingPiece::newTileEntity(Level *level) +shared_ptr PistonMovingPiece::newTileEntity(Level *level) { return nullptr; } @@ -22,7 +22,7 @@ void PistonMovingPiece::onPlace(Level *level, int x, int y, int z) void PistonMovingPiece::onRemove(Level *level, int x, int y, int z, int id, int data) { - std::shared_ptr tileEntity = level->getTileEntity(x, y, z); + shared_ptr tileEntity = level->getTileEntity(x, y, z); if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL) { dynamic_pointer_cast(tileEntity)->finalTick(); @@ -58,7 +58,7 @@ bool PistonMovingPiece::isCubeShaped() return false; } -bool PistonMovingPiece::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool PistonMovingPiece::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) return false; // this is a special case in order to help removing invisible, unbreakable, blocks in the world @@ -80,7 +80,7 @@ void PistonMovingPiece::spawnResources(Level *level, int x, int y, int z, int da { if (level->isClientSide) return; - std::shared_ptr entity = getEntity(level, x, y, z); + shared_ptr entity = getEntity(level, x, y, z); if (entity == NULL) { return; @@ -96,14 +96,14 @@ void PistonMovingPiece::neighborChanged(Level *level, int x, int y, int z, int t } } -std::shared_ptr PistonMovingPiece::newMovingPieceEntity(int block, int data, int facing, bool extending, bool isSourcePiston) +shared_ptr PistonMovingPiece::newMovingPieceEntity(int block, int data, int facing, bool extending, bool isSourcePiston) { - return std::shared_ptr(new PistonPieceEntity(block, data, facing, extending, isSourcePiston)); + return shared_ptr(new PistonPieceEntity(block, data, facing, extending, isSourcePiston)); } AABB *PistonMovingPiece::getAABB(Level *level, int x, int y, int z) { - std::shared_ptr entity = getEntity(level, x, y, z); + shared_ptr entity = getEntity(level, x, y, z); if (entity == NULL) { return NULL; @@ -118,9 +118,9 @@ AABB *PistonMovingPiece::getAABB(Level *level, int x, int y, int z) return getAABB(level, x, y, z, entity->getId(), progress, entity->getFacing()); } -void PistonMovingPiece::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void PistonMovingPiece::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - std::shared_ptr entity = dynamic_pointer_cast(forceEntity); + shared_ptr entity = dynamic_pointer_cast(forceEntity); if( entity == NULL ) entity = getEntity(level, x, y, z); if (entity != NULL) { @@ -188,9 +188,9 @@ AABB *PistonMovingPiece::getAABB(Level *level, int x, int y, int z, int tile, fl return aabb; } -std::shared_ptr PistonMovingPiece::getEntity(LevelSource *level, int x, int y, int z) +shared_ptr PistonMovingPiece::getEntity(LevelSource *level, int x, int y, int z) { - std::shared_ptr tileEntity = level->getTileEntity(x, y, z); + shared_ptr tileEntity = level->getTileEntity(x, y, z); if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL) { return dynamic_pointer_cast(tileEntity); diff --git a/Minecraft.World/PistonMovingPiece.h b/Minecraft.World/PistonMovingPiece.h index e27a6381..1b1a61dc 100644 --- a/Minecraft.World/PistonMovingPiece.h +++ b/Minecraft.World/PistonMovingPiece.h @@ -8,7 +8,7 @@ public: PistonMovingPiece(int id); protected: - virtual std::shared_ptr newTileEntity(Level *level); + virtual shared_ptr newTileEntity(Level *level); public: virtual void onPlace(Level *level, int x, int y, int z); @@ -18,18 +18,18 @@ public: virtual int getRenderShape(); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param; + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param; virtual int getResource(int data, Random *random, int playerBonusLevel); virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); virtual void neighborChanged(Level *level, int x, int y, int z, int type); - static std::shared_ptr newMovingPieceEntity(int block, int data, int facing, bool extending, bool isSourcePiston); + static shared_ptr newMovingPieceEntity(int block, int data, int facing, bool extending, bool isSourcePiston); virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param AABB *getAABB(Level *level, int x, int y, int z, int tile, float progress, int facing); private: - std::shared_ptr getEntity(LevelSource *level, int x, int y, int z); + shared_ptr getEntity(LevelSource *level, int x, int y, int z); public: virtual int cloneTileId(Level *level, int x, int y, int z); diff --git a/Minecraft.World/PistonPieceEntity.cpp b/Minecraft.World/PistonPieceEntity.cpp index 99b9e5ca..3498cec0 100644 --- a/Minecraft.World/PistonPieceEntity.cpp +++ b/Minecraft.World/PistonPieceEntity.cpp @@ -119,10 +119,10 @@ void PistonPieceEntity::moveCollidedEntities(float progress, float amount) AABB *aabb = Tile::pistonMovingPiece->getAABB(level, x, y, z, id, progress, facing); if (aabb != NULL) { - vector > *entities = level->getEntities(nullptr, aabb); + vector > *entities = level->getEntities(nullptr, aabb); if (!entities->empty()) { - vector< std::shared_ptr > collisionHolder; + vector< shared_ptr > collisionHolder; for( AUTO_VAR(it, entities->begin()); it != entities->end(); it++ ) { collisionHolder.push_back(*it); @@ -199,9 +199,9 @@ void PistonPieceEntity::save(CompoundTag *tag) } // 4J Added -std::shared_ptr PistonPieceEntity::clone() +shared_ptr PistonPieceEntity::clone() { - std::shared_ptr result = std::shared_ptr( new PistonPieceEntity() ); + shared_ptr result = shared_ptr( new PistonPieceEntity() ); TileEntity::clone(result); result->id = id; diff --git a/Minecraft.World/PistonPieceEntity.h b/Minecraft.World/PistonPieceEntity.h index 2a451207..8d8543ef 100644 --- a/Minecraft.World/PistonPieceEntity.h +++ b/Minecraft.World/PistonPieceEntity.h @@ -36,5 +36,5 @@ public: virtual void save(CompoundTag *tag); // 4J Added - std::shared_ptr clone(); + shared_ptr clone(); }; \ No newline at end of file diff --git a/Minecraft.World/PlayGoal.cpp b/Minecraft.World/PlayGoal.cpp index 07b94ff9..304e7758 100644 --- a/Minecraft.World/PlayGoal.cpp +++ b/Minecraft.World/PlayGoal.cpp @@ -25,14 +25,14 @@ bool PlayGoal::canUse() if (mob->getAge() >= 0) return false; if (mob->getRandom()->nextInt(400) != 0) return false; - vector > *children = mob->level->getEntitiesOfClass(typeid(Villager), mob->bb->grow(6, 3, 6)); + vector > *children = mob->level->getEntitiesOfClass(typeid(Villager), mob->bb->grow(6, 3, 6)); double closestDistSqr = Double::MAX_VALUE; //for (Entity c : children) for(AUTO_VAR(it, children->begin()); it != children->end(); ++it) { - std::shared_ptr c = *it; + shared_ptr c = *it; if (c.get() == mob) continue; - std::shared_ptr friendV = dynamic_pointer_cast(c); + shared_ptr friendV = dynamic_pointer_cast(c); if (friendV->isChasing()) continue; if (friendV->getAge() >= 0) continue; double distSqr = friendV->distanceToSqr(mob->shared_from_this()); diff --git a/Minecraft.World/Player.cpp b/Minecraft.World/Player.cpp index 25aeceb8..d4832e40 100644 --- a/Minecraft.World/Player.cpp +++ b/Minecraft.World/Player.cpp @@ -2,7 +2,7 @@ // All the instanceof s from Java have been converted to dynamic_cast in this file // Once all the classes are finished it may be that we do not need to use dynamic_cast -// for every test and a simple virtual function should suffice. We probably only need +// for every test and a simple virtual function should suffice. We probably only need // dynamic_cast to find one of the classes that an object derives from, and not to find // the derived class itself (which should own the virtual GetType function) @@ -44,7 +44,7 @@ void Player::_init() { - inventory = std::shared_ptr( new Inventory( this ) ); + inventory = shared_ptr( new Inventory( this ) ); userType = 0; score = 0; @@ -116,7 +116,7 @@ void Player::_init() m_ePlayerNameValidState=ePlayerNameValid_NotSet; #endif - enderChestInventory = std::shared_ptr(new PlayerEnderChestContainer()); + enderChestInventory = shared_ptr(new PlayerEnderChestContainer()); m_bAwardedOnARail=false; } @@ -186,7 +186,7 @@ void Player::defineSynchedData() entityData->define(DATA_PLAYER_RUNNING_ID, (byte) 0); } -std::shared_ptr Player::getUseItem() +shared_ptr Player::getUseItem() { return useItem; } @@ -245,7 +245,7 @@ void Player::tick() { if (useItem != NULL) { - std::shared_ptr item = inventory->getSelected(); + shared_ptr item = inventory->getSelected(); // 4J Stu - Fix for #45508 - TU5: Gameplay: Eating one piece of food will result in a second piece being eaten as well // Original code was item != useItem. Changed this now to use the equals function, and add the NULL check as well for the other possible not equals (useItem is not NULL if we are here) // This is because the useItem and item could be different objects due to an inventory update from the server, but still be the same item (with the same id,count and auxvalue) @@ -344,7 +344,7 @@ void Player::tick() zCloak += zca * 0.25; yCloak += yca * 0.25; - if (riding == NULL) + if (riding == NULL) { if( minecartAchievementPos != NULL ) { @@ -367,73 +367,73 @@ void Player::tick() #if 0 #ifdef _WINDOWS64 // Drop some items so we have them in inventory to play with - this->drop( std::shared_ptr( new ItemInstance(Tile::recordPlayer) ) ); - this->drop( std::shared_ptr( new ItemInstance(Item::map) ) ); - this->drop( std::shared_ptr( new ItemInstance(Item::record_01) ) ); - this->drop( std::shared_ptr( new ItemInstance(Item::record_02) ) ); - this->drop( std::shared_ptr(new ItemInstance( Item::pickAxe_diamond, 1 )) ); + this->drop( shared_ptr( new ItemInstance(Tile::recordPlayer) ) ); + this->drop( shared_ptr( new ItemInstance(Item::map) ) ); + this->drop( shared_ptr( new ItemInstance(Item::record_01) ) ); + this->drop( shared_ptr( new ItemInstance(Item::record_02) ) ); + this->drop( shared_ptr(new ItemInstance( Item::pickAxe_diamond, 1 )) ); #endif #ifdef __PS3__ // #ifdef _DEBUG // // Drop some items so we have them in inventory to play with - // this->drop( std::shared_ptr( new ItemInstance(Tile::recordPlayer) ) ); - // this->drop( std::shared_ptr( new ItemInstance(Item::map) ) ); - // this->drop( std::shared_ptr( new ItemInstance(Item::record_01) ) ); - // this->drop( std::shared_ptr( new ItemInstance(Item::record_02) ) ); - // this->drop( std::shared_ptr(new ItemInstance( Item::pickAxe_diamond, 1 )) ); + // this->drop( shared_ptr( new ItemInstance(Tile::recordPlayer) ) ); + // this->drop( shared_ptr( new ItemInstance(Item::map) ) ); + // this->drop( shared_ptr( new ItemInstance(Item::record_01) ) ); + // this->drop( shared_ptr( new ItemInstance(Item::record_02) ) ); + // this->drop( shared_ptr(new ItemInstance( Item::pickAxe_diamond, 1 )) ); // #endif #endif #ifdef _DURANGO // Drop some items so we have them in inventory to play with - this->drop( std::shared_ptr( new ItemInstance(Tile::recordPlayer) ) ); - this->drop( std::shared_ptr( new ItemInstance(Item::map) ) ); - this->drop( std::shared_ptr( new ItemInstance(Item::record_01) ) ); - this->drop( std::shared_ptr( new ItemInstance(Item::record_02) ) ); - this->drop( std::shared_ptr(new ItemInstance( Item::pickAxe_diamond, 1 )) ); + this->drop( shared_ptr( new ItemInstance(Tile::recordPlayer) ) ); + this->drop( shared_ptr( new ItemInstance(Item::map) ) ); + this->drop( shared_ptr( new ItemInstance(Item::record_01) ) ); + this->drop( shared_ptr( new ItemInstance(Item::record_02) ) ); + this->drop( shared_ptr(new ItemInstance( Item::pickAxe_diamond, 1 )) ); #endif #endif // 4J-PB - Throw items out at the start of the level //this->drop( new ItemInstance( Item::pickAxe_diamond, 1 ) ); //this->drop( new ItemInstance( Tile::workBench, 1 ) ); //this->drop( new ItemInstance( Tile::treeTrunk, 8 ) ); - //this->drop( std::shared_ptr( new ItemInstance( Item::milk, 3 ) ) ); - //this->drop( std::shared_ptr( new ItemInstance( Item::sugar, 2 ) ) ); + //this->drop( shared_ptr( new ItemInstance( Item::milk, 3 ) ) ); + //this->drop( shared_ptr( new ItemInstance( Item::sugar, 2 ) ) ); //this->drop( new ItemInstance( Tile::stoneBrick, 8 ) ); - //this->drop( std::shared_ptr( new ItemInstance( Item::wheat, 3 ) ) ); - //this->drop( std::shared_ptr( new ItemInstance( Item::egg, 1 ) ) ); + //this->drop( shared_ptr( new ItemInstance( Item::wheat, 3 ) ) ); + //this->drop( shared_ptr( new ItemInstance( Item::egg, 1 ) ) ); //this->drop( new ItemInstance( Item::bow, 1 ) ); //this->drop( new ItemInstance( Item::arrow, 10 ) ); - //this->drop( std::shared_ptr( new ItemInstance( Item::saddle, 10 ) ) ); - //this->drop( std::shared_ptr( new ItemInstance( Tile::fence, 64 ) ) ); - //this->drop( std::shared_ptr( new ItemInstance( Tile::fence, 64 ) ) ); - //this->drop( std::shared_ptr( new ItemInstance( Tile::fence, 64 ) ) ); + //this->drop( shared_ptr( new ItemInstance( Item::saddle, 10 ) ) ); + //this->drop( shared_ptr( new ItemInstance( Tile::fence, 64 ) ) ); + //this->drop( shared_ptr( new ItemInstance( Tile::fence, 64 ) ) ); + //this->drop( shared_ptr( new ItemInstance( Tile::fence, 64 ) ) ); - //std::shared_ptr mob = dynamic_pointer_cast(Pig::_class->newInstance( level )); + //shared_ptr mob = dynamic_pointer_cast(Pig::_class->newInstance( level )); //mob->moveTo(x+1, y, z+1, level->random->nextFloat() * 360, 0); //level->addEntity(mob); // 4J : WESTY : Spawn some wolves to befriend! /* - std::shared_ptr mob1 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); + shared_ptr mob1 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); mob1->moveTo(x+1, y, z+1, level->random->nextFloat() * 360, 0); level->addEntity(mob1); - std::shared_ptr mob2 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); + shared_ptr mob2 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); mob2->moveTo(x+2, y, z+1, level->random->nextFloat() * 360, 0); level->addEntity(mob2); - std::shared_ptr mob3 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); + shared_ptr mob3 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); mob3->moveTo(x+1, y, z+2, level->random->nextFloat() * 360, 0); level->addEntity(mob3); - std::shared_ptr mob4 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); + shared_ptr mob4 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); mob4->moveTo(x+3, y, z+1, level->random->nextFloat() * 360, 0); level->addEntity(mob4); - std::shared_ptr mob5 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); + shared_ptr mob5 = dynamic_pointer_cast(Wolf::_class->newInstance( level )); mob5->moveTo(x+1, y, z+3, level->random->nextFloat() * 360, 0); level->addEntity(mob5); */ @@ -454,10 +454,10 @@ void Player::tick() // minecart. For some reason some of the torches come off so it will also need some fixing along the way. static bool madeTrack = false; if( !madeTrack ) - { - this->drop( std::shared_ptr( new ItemInstance( Item::minecart, 1 ) ) ); - this->drop( std::shared_ptr( new ItemInstance( Tile::goldenRail, 10 ) ) ); - this->drop( std::shared_ptr( new ItemInstance( Tile::lever, 10 ) ) ); + { + this->drop( shared_ptr( new ItemInstance( Item::minecart, 1 ) ) ); + this->drop( shared_ptr( new ItemInstance( Tile::goldenRail, 10 ) ) ); + this->drop( shared_ptr( new ItemInstance( Tile::lever, 10 ) ) ); level->setTime( 0 ); int poweredCount = 0; @@ -523,7 +523,7 @@ void Player::tick() //End 4J sTU } -void Player::spawnEatParticles(std::shared_ptr useItem, int count) +void Player::spawnEatParticles(shared_ptr useItem, int count) { if (useItem->getUseAnimation() == UseAnim_drink) { @@ -558,7 +558,7 @@ void Player::completeUsingItem() spawnEatParticles(useItem, 16); int oldCount = useItem->count; - std::shared_ptr itemInstance = useItem->useTimeDepleted(level, dynamic_pointer_cast(shared_from_this())); + shared_ptr itemInstance = useItem->useTimeDepleted(level, dynamic_pointer_cast(shared_from_this())); if (itemInstance != useItem || (itemInstance != NULL && itemInstance->count != oldCount)) { inventory->items[inventory->selected] = itemInstance; @@ -594,7 +594,7 @@ void Player::closeContainer() containerMenu = inventoryMenu; } -void Player::ride(std::shared_ptr e) +void Player::ride(shared_ptr e) { if (riding != NULL && e == NULL) { @@ -611,8 +611,8 @@ void Player::ride(std::shared_ptr e) Mob::ride(e); } -void Player::setPlayerDefaultSkin(EDefaultSkins skin) -{ +void Player::setPlayerDefaultSkin(EDefaultSkins skin) +{ #ifndef _CONTENT_PACKAGE wprintf(L"Setting default skin to %d for player %ls\n", skin, name.c_str() ); #endif @@ -631,8 +631,8 @@ void Player::setCustomSkin(DWORD skinId) setAnimOverrideBitmask(getSkinAnimOverrideBitmask(skinId)); if( !GET_IS_DLC_SKIN_FROM_BITMASK(skinId) ) - { - // GET_UGC_SKIN_ID_FROM_BITMASK will always be zero - this was for a possible custom skin editor skin + { + // GET_UGC_SKIN_ID_FROM_BITMASK will always be zero - this was for a possible custom skin editor skin DWORD ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(skinId); DWORD defaultSkinIndex = GET_DEFAULT_SKIN_ID_FROM_BITMASK(skinId); if( ugcSkinIndex == 0 && defaultSkinIndex > 0 ) @@ -702,7 +702,7 @@ unsigned int Player::getSkinAnimOverrideBitmask(DWORD skinId) { unsigned long bitmask = 0L; if( GET_IS_DLC_SKIN_FROM_BITMASK(skinId) ) - { + { // Temp check for anim override switch( GET_DLC_SKIN_ID_FROM_BITMASK(skinId) ) { @@ -765,7 +765,7 @@ void Player::setCustomCape(DWORD capeId) else { MOJANG_DATA *pMojangData=app.GetMojangDataForXuid(getOnlineXuid()); - if(pMojangData) + if(pMojangData) { // Cape if(pMojangData->wchCape) @@ -802,7 +802,7 @@ void Player::setCustomCape(DWORD capeId) DWORD Player::getCapeIdFromPath(const wstring &cape) { - bool dlcCape = false; + bool dlcCape = false; unsigned int capeId = 0; if(cape.size() >= 14) @@ -866,7 +866,7 @@ void Player::ChangePlayerSkin() this->customTextureUrl=L""; } else - { + { if(m_uiPlayerCurrentSkin>0) { // change this players custom texture url @@ -880,7 +880,7 @@ void Player::prepareCustomTextures() { MOJANG_DATA *pMojangData=app.GetMojangDataForXuid(getOnlineXuid()); - if(pMojangData) + if(pMojangData) { // Skin if(pMojangData->wchSkin) @@ -943,7 +943,7 @@ void Player::rideTick() //xRot = preXRot; //yRot = preYRot; - std::shared_ptr pig = dynamic_pointer_cast(riding); + shared_ptr pig = dynamic_pointer_cast(riding); yBodyRot = pig->yBodyRot; while (yBodyRot - yBodyRotO < -180) @@ -1037,13 +1037,13 @@ void Player::aiStep() if (getHealth() > 0) { - vector > *entities = level->getEntities(shared_from_this(), bb->grow(1, 0, 1)); + vector > *entities = level->getEntities(shared_from_this(), bb->grow(1, 0, 1)); if (entities != NULL) { AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - std::shared_ptr e = *it; //entities->at(i); + shared_ptr e = *it; //entities->at(i); if (!e->removed) { touch(e); @@ -1054,7 +1054,7 @@ void Player::aiStep() } -void Player::touch(std::shared_ptr entity) +void Player::touch(shared_ptr entity) { entity->playerTouch( dynamic_pointer_cast( shared_from_this() ) ); } @@ -1062,7 +1062,7 @@ void Player::touch(std::shared_ptr entity) // 4J - Removed 1.0.1 //bool Player::addResource(int resource) //{ -// return inventory->add(std::shared_ptr( new ItemInstance(resource, 1, 0) ) ); +// return inventory->add(shared_ptr( new ItemInstance(resource, 1, 0) ) ); //} int Player::getScore() @@ -1080,7 +1080,7 @@ void Player::die(DamageSource *source) // 4J - TODO need to use a xuid if ( app.isXuidNotch( m_xuid ) ) { - drop(std::shared_ptr( new ItemInstance(Item::apple, 1) ), true); + drop(shared_ptr( new ItemInstance(Item::apple, 1) ), true); } inventory->dropAll(); @@ -1096,7 +1096,7 @@ void Player::die(DamageSource *source) this->heightOffset = 0.1f; } -void Player::awardKillScore(std::shared_ptr victim, int score) +void Player::awardKillScore(shared_ptr victim, int score) { this->score += score; } @@ -1125,21 +1125,21 @@ bool Player::isCreativeModeAllowed() return true; } -std::shared_ptr Player::drop() +shared_ptr Player::drop() { return drop(inventory->removeItem(inventory->selected, 1), false); } -std::shared_ptr Player::drop(std::shared_ptr item) +shared_ptr Player::drop(shared_ptr item) { return drop(item, false); } -std::shared_ptr Player::drop(std::shared_ptr item, bool randomly) +shared_ptr Player::drop(shared_ptr item, bool randomly) { if (item == NULL) return nullptr; - std::shared_ptr thrownItem = std::shared_ptr( new ItemEntity(level, x, y - 0.3f + getHeadHeight(), z, item) ); + shared_ptr thrownItem = shared_ptr( new ItemEntity(level, x, y - 0.3f + getHeadHeight(), z, item) ); thrownItem->throwTime = 20 * 2; thrownItem->setThrower(getName()); @@ -1175,7 +1175,7 @@ std::shared_ptr Player::drop(std::shared_ptr item, boo } -void Player::reallyDrop(std::shared_ptr thrownItem) +void Player::reallyDrop(shared_ptr thrownItem) { level->addEntity(thrownItem); } @@ -1290,7 +1290,7 @@ Pos *Player::getRespawnPosition(Level *level, CompoundTag *entityTag) return level->getSharedSpawnPos(); } -bool Player::openContainer(std::shared_ptr container) +bool Player::openContainer(shared_ptr container) { return true; } @@ -1310,7 +1310,7 @@ bool Player::startCrafting(int x, int y, int z) return true; } -void Player::take(std::shared_ptr e, int orgCount) +void Player::take(shared_ptr e, int orgCount) { } @@ -1349,7 +1349,7 @@ bool Player::hurt(DamageSource *source, int dmg) if (dmg == 0) return false; - std::shared_ptr attacker = source->getEntity(); + shared_ptr attacker = source->getEntity(); if ( dynamic_pointer_cast( attacker ) != NULL ) { if ((dynamic_pointer_cast(attacker))->owner != NULL) @@ -1395,7 +1395,7 @@ bool Player::isPlayerVersusPlayer() return false; } -void Player::directAllTameWolvesOnTarget(std::shared_ptr target, bool skipSitting) +void Player::directAllTameWolvesOnTarget(shared_ptr target, bool skipSitting) { // filter un-attackable mobs @@ -1406,7 +1406,7 @@ void Player::directAllTameWolvesOnTarget(std::shared_ptr target, bool skipS // never target wolves that has this player as owner if (dynamic_pointer_cast(target) != NULL) { - std::shared_ptr wolfTarget = dynamic_pointer_cast(target); + shared_ptr wolfTarget = dynamic_pointer_cast(target); if (wolfTarget->isTame() && m_UUID.compare( wolfTarget->getOwnerUUID() ) == 0 ) { return; @@ -1420,11 +1420,11 @@ void Player::directAllTameWolvesOnTarget(std::shared_ptr target, bool skipS // TODO: Optimize this? Most of the time players wont have pets: - vector > *nearbyWolves = level->getEntitiesOfClass(typeid(Wolf), AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(16, 4, 16)); + vector > *nearbyWolves = level->getEntitiesOfClass(typeid(Wolf), AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(16, 4, 16)); AUTO_VAR(itEnd, nearbyWolves->end()); for (AUTO_VAR(it, nearbyWolves->begin()); it != itEnd; it++) { - std::shared_ptr wolf = dynamic_pointer_cast(*it);; + shared_ptr wolf = dynamic_pointer_cast(*it);; if (wolf->isTame() && wolf->getAttackTarget() == NULL && m_UUID.compare( wolf->getOwnerUUID() ) == 0) { if (!skipSitting || !wolf->isSitting()) @@ -1474,26 +1474,26 @@ void Player::actuallyHurt(DamageSource *source, int dmg) } -bool Player::openFurnace(std::shared_ptr container) +bool Player::openFurnace(shared_ptr container) { return true; } -bool Player::openTrap(std::shared_ptr container) +bool Player::openTrap(shared_ptr container) { return true; } -void Player::openTextEdit(std::shared_ptr sign) +void Player::openTextEdit(shared_ptr sign) { } -bool Player::openBrewingStand(std::shared_ptr brewingStand) +bool Player::openBrewingStand(shared_ptr brewingStand) { return true; } -bool Player::openTrading(std::shared_ptr traderTarget) +bool Player::openTrading(shared_ptr traderTarget) { return true; } @@ -1503,16 +1503,16 @@ bool Player::openTrading(std::shared_ptr traderTarget) * * @param itemInstance */ -void Player::openItemInstanceGui(std::shared_ptr itemInstance) +void Player::openItemInstanceGui(shared_ptr itemInstance) { } -bool Player::interact(std::shared_ptr entity) +bool Player::interact(shared_ptr entity) { if (entity->interact( dynamic_pointer_cast( shared_from_this() ) )) return true; - std::shared_ptr item = getSelectedItem(); + shared_ptr item = getSelectedItem(); if (item != NULL && dynamic_pointer_cast( entity ) != NULL) - { + { // 4J - PC Comments // Hack to prevent item stacks from decrementing if the player has // the ability to instabuild @@ -1533,7 +1533,7 @@ bool Player::interact(std::shared_ptr entity) return false; } -std::shared_ptr Player::getSelectedItem() +shared_ptr Player::getSelectedItem() { return inventory->getSelected(); } @@ -1557,7 +1557,7 @@ void Player::swing() } } -void Player::attack(std::shared_ptr entity) +void Player::attack(shared_ptr entity) { if (!entity->isAttackable()) { @@ -1577,7 +1577,7 @@ void Player::attack(std::shared_ptr entity) int knockback = 0; int magicBoost = 0; - std::shared_ptr mob = dynamic_pointer_cast(entity); + shared_ptr mob = dynamic_pointer_cast(entity); if (mob != NULL) { magicBoost = EnchantmentHelper::getDamageBonus(inventory, mob); @@ -1596,7 +1596,7 @@ void Player::attack(std::shared_ptr entity) dmg += random->nextInt(dmg / 2 + 2); } dmg += magicBoost; - + // Ensure we put the entity on fire if we're hitting with a // fire-enchanted weapon bool setOnFireTemporatily = false; @@ -1635,14 +1635,14 @@ void Player::attack(std::shared_ptr entity) } setLastHurtMob(entity); - std::shared_ptr mob = dynamic_pointer_cast(entity); + shared_ptr mob = dynamic_pointer_cast(entity); if (mob) { ThornsEnchantment::doThornsAfterAttack(shared_from_this(), mob, random); } } - std::shared_ptr item = getSelectedItem(); + shared_ptr item = getSelectedItem(); if (item != NULL && dynamic_pointer_cast( entity ) != NULL) { item->hurtEnemy(dynamic_pointer_cast(entity), dynamic_pointer_cast( shared_from_this() ) ); @@ -1672,11 +1672,11 @@ void Player::attack(std::shared_ptr entity) } } -void Player::crit(std::shared_ptr entity) +void Player::crit(shared_ptr entity) { } -void Player::magicCrit(std::shared_ptr entity) +void Player::magicCrit(shared_ptr entity) { } @@ -1686,7 +1686,7 @@ void Player::respawn() } -void Player::animateRespawn(std::shared_ptr player, Level *level) +void Player::animateRespawn(shared_ptr player, Level *level) { for (int i = 0; i < 45; i++) @@ -1756,7 +1756,7 @@ Player::BedSleepingResult Player::startSleepInBed(int x, int y, int z, bool bTes double hRange = 8; double vRange = 5; - vector > *monsters = level->getEntitiesOfClass(typeid(Monster), AABB::newTemp(x - hRange, y - vRange, z - hRange, x + hRange, y + vRange, z + hRange)); + vector > *monsters = level->getEntitiesOfClass(typeid(Monster), AABB::newTemp(x - hRange, y - vRange, z - hRange, x + hRange, y + vRange, z + hRange)); if (!monsters->empty()) { return NOT_SAFE; @@ -1765,11 +1765,11 @@ Player::BedSleepingResult Player::startSleepInBed(int x, int y, int z, bool bTes } // This causes a message to be displayed, so we do want to show the tooltip in test mode - if (!bTestUse && level->isDay()) + if (!bTestUse && level->isDay()) { // may not sleep during day return NOT_POSSIBLE_NOW; - } + } } if(bTestUse) @@ -1852,7 +1852,7 @@ void Player::setBedOffset(int bedDirection) /** -* +* * @param forcefulWakeUp * If the player has been forced to wake up. When this happens, * the client will skip the wake-up animation. For example, when @@ -2136,7 +2136,7 @@ void Player::checkMovementStatistiscs(double dx, double dy, double dz) void Player::checkRidingStatistiscs(double dx, double dy, double dz) -{ +{ if (riding != NULL) { int distance = (int) Math::round(sqrt(dx * dx + dy * dy + dz * dz) * 100.0f); @@ -2158,7 +2158,7 @@ void Player::checkRidingStatistiscs(double dx, double dy, double dz) minecartAchievementPos = new Pos(Mth::floor(x), Mth::floor(y), Mth::floor(z)); } // 4J-PB - changed this because our world isn't big enough to go 1000m - else + else { // 4-JEV, changed slightly to add extra parameters for event on durango. int dist = minecartAchievementPos->dist(Mth::floor(x), Mth::floor(y), Mth::floor(z)); @@ -2185,7 +2185,7 @@ void Player::checkRidingStatistiscs(double dx, double dy, double dz) awardStat(GenericStats::onARail(), GenericStats::param_onARail(dist)); m_bAwardedOnARail=true; } -#endif +#endif } } @@ -2232,7 +2232,7 @@ void Player::causeFallDamage(float distance) } -void Player::killed(std::shared_ptr mob) +void Player::killed(shared_ptr mob) { // 4J-PB - added the lavaslime enemy - fix for #64007 - TU7: Code: Achievements: TCR#073: Killing Magma Cubes doesn't unlock "Monster Hunter" Achievement. if( dynamic_pointer_cast( mob ) != NULL || mob->GetType() == eTYPE_GHAST || mob->GetType() == eTYPE_SLIME || mob->GetType() == eTYPE_LAVASLIME || mob->GetType() == eTYPE_ENDERDRAGON) @@ -2247,13 +2247,13 @@ void Player::killed(std::shared_ptr mob) case eTYPE_SKELETON: if( mob->isRiding() && mob->riding->GetType() == eTYPE_SPIDER ) awardStat(GenericStats::killsSpiderJockey(), GenericStats::param_noArgs()); - else + else awardStat(GenericStats::killsSkeleton(), GenericStats::param_noArgs()); break; case eTYPE_SPIDER: if( mob->rider.lock() != NULL && mob->rider.lock()->GetType() == eTYPE_SKELETON ) awardStat(GenericStats::killsSpiderJockey(), GenericStats::param_noArgs()); - else + else awardStat(GenericStats::killsSpider(), GenericStats::param_noArgs()); break; case eTYPE_ZOMBIE: @@ -2282,7 +2282,7 @@ void Player::killed(std::shared_ptr mob) } } -Icon *Player::getItemInHandIcon(std::shared_ptr item, int layer) +Icon *Player::getItemInHandIcon(shared_ptr item, int layer) { Icon *icon = Mob::getItemInHandIcon(item, layer); if (item->id == Item::fishingRod->id && fishing != NULL) @@ -2312,7 +2312,7 @@ Icon *Player::getItemInHandIcon(std::shared_ptr item, int layer) return icon; } -std::shared_ptr Player::getArmor(int pos) +shared_ptr Player::getArmor(int pos) { return inventory->getArmor(pos); } @@ -2378,7 +2378,7 @@ void Player::levelUp() /** * This method adds on to the player's exhaustion, which may decrease the * player's food level. -* +* * @param amount * Amount of exhaustion to add, between 0 and 20 (setting it to * 20 will guarantee that at least 1, and at most 4, food points @@ -2413,7 +2413,7 @@ bool Player::isHurt() return getHealth() > 0 && getHealth() < getMaxHealth(); } -void Player::startUsingItem(std::shared_ptr instance, int duration) +void Player::startUsingItem(shared_ptr instance, int duration) { if (instance == useItem) return; useItem = instance; @@ -2438,7 +2438,7 @@ bool Player::mayBuild(int x, int y, int z) return abilities.mayBuild; } -int Player::getExperienceReward(std::shared_ptr killedBy) +int Player::getExperienceReward(shared_ptr killedBy) { int reward = experienceLevel * 7; if (reward > 100) @@ -2463,7 +2463,7 @@ void Player::changeDimension(int i) { } -void Player::restoreFrom(std::shared_ptr oldPlayer, bool restoreAll) +void Player::restoreFrom(shared_ptr oldPlayer, bool restoreAll) { if(restoreAll) { @@ -2514,17 +2514,17 @@ wstring Player::getDisplayName() //Language getLanguage() { return Language.getInstance(); } //String localize(String key, Object... args) { return getLanguage().getElement(key, args); } -std::shared_ptr Player::getEnderChestInventory() +shared_ptr Player::getEnderChestInventory() { return enderChestInventory; } -std::shared_ptr Player::getCarriedItem() +shared_ptr Player::getCarriedItem() { return inventory->getSelected(); } -bool Player::isInvisibleTo(std::shared_ptr player) +bool Player::isInvisibleTo(shared_ptr player) { return isInvisible(); } @@ -2555,7 +2555,7 @@ int Player::getTexture() } } -int Player::hash_fnct(const std::shared_ptr k) +int Player::hash_fnct(const shared_ptr k) { // TODO 4J Stu - Should we just be using the pointers and hashing them? #ifdef __PS3__ @@ -2565,7 +2565,7 @@ int Player::hash_fnct(const std::shared_ptr k) #endif //__PS3__ } -bool Player::eq_test(const std::shared_ptr x, const std::shared_ptr y) +bool Player::eq_test(const shared_ptr x, const shared_ptr y) { // TODO 4J Stu - Should we just be using the pointers and comparing them for equality? return x->name.compare( y->name ) == 0; // 4J Stu - Names are completely unique? @@ -2617,7 +2617,7 @@ void Player::setPlayerGamePrivilege(unsigned int &uiGamePrivileges, EPlayerGameP } } else if (privilege < ePlayerGamePrivilege_MAX ) - { + { if(value!=0) { uiGamePrivileges|=(1< item) +bool Player::isAllowedToUse(shared_ptr item) { bool allowed = true; if(item != NULL && app.GetGameHostOption(eGameHostOption_TrustPlayers) == 0) @@ -2765,7 +2765,7 @@ bool Player::isAllowedToUse(std::shared_ptr item) return allowed; } -bool Player::isAllowedToInteract(std::shared_ptr target) +bool Player::isAllowedToInteract(shared_ptr target) { bool allowed = true; if(app.GetGameHostOption(eGameHostOption_TrustPlayers) == 0) @@ -2774,7 +2774,7 @@ bool Player::isAllowedToInteract(std::shared_ptr target) { if (getPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanUseContainers) == 0) { - std::shared_ptr minecart = dynamic_pointer_cast( target ); + shared_ptr minecart = dynamic_pointer_cast( target ); if (minecart->type == Minecart::CHEST) allowed = false; } @@ -2830,7 +2830,7 @@ bool Player::isAllowedToAttackAnimals() return allowed; } -bool Player::isAllowedToHurtEntity(std::shared_ptr target) +bool Player::isAllowedToHurtEntity(shared_ptr target) { bool allowed = true; @@ -2921,7 +2921,7 @@ void Player::enableAllPlayerPrivileges(unsigned int &uigamePrivileges, bool enab } void Player::enableAllPlayerPrivileges(bool enable) -{ +{ Player::enableAllPlayerPrivileges(m_uiGamePrivileges,enable); } @@ -2930,8 +2930,8 @@ bool Player::canCreateParticles() return !hasInvisiblePrivilege(); } -vector *Player::GetAdditionalModelParts() -{ +vector *Player::GetAdditionalModelParts() +{ if(m_ppAdditionalModelParts==NULL && !m_bCheckedForModelParts) { bool hasCustomTexture = !customTextureUrl.empty(); @@ -2975,8 +2975,8 @@ vector *Player::GetAdditionalModelParts() return m_ppAdditionalModelParts; } -void Player::SetAdditionalModelParts(vector *ppAdditionalModelParts) -{ +void Player::SetAdditionalModelParts(vector *ppAdditionalModelParts) +{ m_ppAdditionalModelParts=ppAdditionalModelParts; } @@ -2987,7 +2987,7 @@ Player::ePlayerNameValidState Player::GetPlayerNameValidState(void) return m_ePlayerNameValidState; } -void Player::SetPlayerNameValidState(bool bState) +void Player::SetPlayerNameValidState(bool bState) { if(bState) { diff --git a/Minecraft.World/Player.h b/Minecraft.World/Player.h index 68088fc1..185a70a7 100644 --- a/Minecraft.World/Player.h +++ b/Minecraft.World/Player.h @@ -50,10 +50,10 @@ private: static const int DATA_PLAYER_RUNNING_ID = 17; public: - std::shared_ptr inventory; + shared_ptr inventory; private: - std::shared_ptr enderChestInventory; + shared_ptr enderChestInventory; public: AbstractContainerMenu *inventoryMenu; @@ -124,7 +124,7 @@ public: // 4J Stu - Made protected so that we can access it from MultiPlayerLocalPlayer protected: - std::shared_ptr useItem; + shared_ptr useItem; int useItemDuration; protected: @@ -146,7 +146,7 @@ protected: virtual void defineSynchedData(); public: - std::shared_ptr getUseItem(); + shared_ptr getUseItem(); int getUseItemDuration(); bool isUsingItem(); int getTicksUsingItem(); void releaseUsingItem(); @@ -156,7 +156,7 @@ public: virtual void tick(); protected: - void spawnEatParticles(std::shared_ptr useItem, int count); + void spawnEatParticles(shared_ptr useItem, int count); virtual void completeUsingItem(); public: @@ -167,7 +167,7 @@ protected: virtual void closeContainer(); public: - virtual void ride(std::shared_ptr e); + virtual void ride(shared_ptr e); void prepareCustomTextures(); virtual void rideTick(); virtual void resetPos(); @@ -182,13 +182,13 @@ public: virtual void aiStep(); private: - virtual void touch(std::shared_ptr entity); + virtual void touch(shared_ptr entity); public: //bool addResource(int resource); // 4J - Removed 1.0.1 int getScore(); virtual void die(DamageSource *source); - void awardKillScore(std::shared_ptr victim, int score); + void awardKillScore(shared_ptr victim, int score); protected: virtual int decreaseAirSupply(int currentSupply); @@ -196,12 +196,12 @@ protected: public: virtual bool isShootable(); bool isCreativeModeAllowed(); - virtual std::shared_ptr drop(); - std::shared_ptr drop(std::shared_ptr item); - std::shared_ptr drop(std::shared_ptr item, bool randomly); + virtual shared_ptr drop(); + shared_ptr drop(shared_ptr item); + shared_ptr drop(shared_ptr item, bool randomly); protected: - virtual void reallyDrop(std::shared_ptr thrownItem); + virtual void reallyDrop(shared_ptr thrownItem); public: float getDestroySpeed(Tile *tile); @@ -209,11 +209,11 @@ public: virtual void readAdditionalSaveData(CompoundTag *entityTag); virtual void addAdditonalSaveData(CompoundTag *entityTag); static Pos *getRespawnPosition(Level *level, CompoundTag *entityTag); - virtual bool openContainer(std::shared_ptr container); // 4J - added bool return + virtual bool openContainer(shared_ptr container); // 4J - added bool return virtual bool startEnchanting(int x, int y, int z); // 4J - added bool return virtual bool startRepairing(int x, int y, int z); // 4J - added bool return virtual bool startCrafting(int x, int y, int z); // 4J - added boo return - virtual void take(std::shared_ptr e, int orgCount); + virtual void take(shared_ptr e, int orgCount); virtual float getHeadHeight(); // 4J-PB - added to keep the code happy with the change to make the third person view per player @@ -224,14 +224,14 @@ protected: virtual void setDefaultHeadHeight(); public: - std::shared_ptr fishing; + shared_ptr fishing; virtual bool hurt(DamageSource *source, int dmg); protected: virtual int getDamageAfterMagicAbsorb(DamageSource *damageSource, int damage); virtual bool isPlayerVersusPlayer(); - void directAllTameWolvesOnTarget(std::shared_ptr target, bool skipSitting); + void directAllTameWolvesOnTarget(shared_ptr target, bool skipSitting); virtual void hurtArmor(int damage); public: @@ -244,24 +244,24 @@ protected: public: using Entity::interact; - virtual bool openFurnace(std::shared_ptr container); // 4J - added bool return - virtual bool openTrap(std::shared_ptr container); // 4J - added bool return - virtual void openTextEdit(std::shared_ptr sign); - virtual bool openBrewingStand(std::shared_ptr brewingStand); // 4J - added bool return - virtual bool openTrading(std::shared_ptr traderTarget); // 4J - added bool return - virtual void openItemInstanceGui(std::shared_ptr itemInstance); - virtual bool interact(std::shared_ptr entity); - virtual std::shared_ptr getSelectedItem(); + virtual bool openFurnace(shared_ptr container); // 4J - added bool return + virtual bool openTrap(shared_ptr container); // 4J - added bool return + virtual void openTextEdit(shared_ptr sign); + virtual bool openBrewingStand(shared_ptr brewingStand); // 4J - added bool return + virtual bool openTrading(shared_ptr traderTarget); // 4J - added bool return + virtual void openItemInstanceGui(shared_ptr itemInstance); + virtual bool interact(shared_ptr entity); + virtual shared_ptr getSelectedItem(); void removeSelectedItem(); virtual double getRidingHeight(); virtual void swing(); - virtual void attack(std::shared_ptr entity); - virtual void crit(std::shared_ptr entity); - virtual void magicCrit(std::shared_ptr entity); + virtual void attack(shared_ptr entity); + virtual void crit(shared_ptr entity); + virtual void magicCrit(shared_ptr entity); virtual void respawn(); protected: - static void animateRespawn(std::shared_ptr player, Level *level); + static void animateRespawn(shared_ptr player, Level *level); public: Slot *getInventorySlot(int slotId); @@ -281,7 +281,7 @@ private: public: /** - * + * * @param forcefulWakeUp * If the player has been forced to wake up. When this happens, * the client will skip the wake-up animation. For example, when @@ -336,9 +336,9 @@ protected: virtual void causeFallDamage(float distance); public: - virtual void killed(std::shared_ptr mob); - virtual Icon *getItemInHandIcon(std::shared_ptr item, int layer); - virtual std::shared_ptr getArmor(int pos); + virtual void killed(shared_ptr mob); + virtual Icon *getItemInHandIcon(shared_ptr item, int layer); + virtual shared_ptr getArmor(int pos); virtual void handleInsidePortal(); void increaseXp(int i); @@ -353,18 +353,18 @@ public: FoodData *getFoodData(); bool canEat(bool magicalItem); bool isHurt(); - virtual void startUsingItem(std::shared_ptr instance, int duration); + virtual void startUsingItem(shared_ptr instance, int duration); bool mayBuild(int x, int y, int z); protected: - virtual int getExperienceReward(std::shared_ptr killedBy); + virtual int getExperienceReward(shared_ptr killedBy); virtual bool isAlwaysExperienceDropper(); public: virtual wstring getAName(); virtual void changeDimension(int i); - virtual void restoreFrom(std::shared_ptr oldPlayer, bool restoreAll); + virtual void restoreFrom(shared_ptr oldPlayer, bool restoreAll); protected: bool makeStepSound(); @@ -378,19 +378,19 @@ public: //Language getLanguage() { return Language.getInstance(); } //String localize(String key, Object... args) { return getLanguage().getElement(key, args); } - std::shared_ptr getEnderChestInventory(); + shared_ptr getEnderChestInventory(); public: - virtual std::shared_ptr getCarriedItem(); + virtual shared_ptr getCarriedItem(); - virtual bool isInvisibleTo(std::shared_ptr player); + virtual bool isInvisibleTo(shared_ptr player); - static int hash_fnct(const std::shared_ptr k); - static bool eq_test(const std::shared_ptr x, const std::shared_ptr y); + static int hash_fnct(const shared_ptr k); + static bool eq_test(const shared_ptr x, const shared_ptr y); // 4J Stu - Added to allow callback to tutorial to stay within Minecraft.Client // Overidden in LocalPlayer - virtual void onCrafted(std::shared_ptr item) {} + virtual void onCrafted(shared_ptr item) {} // 4J Overriding this so that we can have some different default skins virtual int getTexture(); // 4J changed from wstring to int @@ -421,7 +421,7 @@ public: void setShowOnMaps(bool bVal) { m_bShownOnMaps = bVal; } bool canShowOnMaps() { return m_bShownOnMaps && !getPlayerGamePrivilege(ePlayerGamePrivilege_Invisible); } - + virtual void sendMessage(const wstring& message, ChatPacket::EChatPacketMessage type = ChatPacket::e_ChatCustom, int customData = -1, const wstring& additionalMessage = L"") { } private: PlayerUID m_xuid; @@ -493,12 +493,12 @@ public: static void setPlayerGamePrivilege(unsigned int &uiGamePrivileges, EPlayerGamePrivileges privilege, unsigned int value); bool isAllowedToUse(Tile *tile); - bool isAllowedToUse(std::shared_ptr item); - bool isAllowedToInteract(std::shared_ptr target); + bool isAllowedToUse(shared_ptr item); + bool isAllowedToInteract(shared_ptr target); bool isAllowedToMine(); bool isAllowedToAttackPlayers(); bool isAllowedToAttackAnimals(); - bool isAllowedToHurtEntity(std::shared_ptr target); + bool isAllowedToHurtEntity(shared_ptr target); bool isAllowedToFly(); bool isAllowedToIgnoreExhaustion(); bool isAllowedToTeleport(); @@ -513,7 +513,7 @@ public: public: // 4J Stu - Added hooks for the game rules - virtual void handleCollectItem(std::shared_ptr item) {} + virtual void handleCollectItem(shared_ptr item) {} vector *GetAdditionalModelParts(); void SetAdditionalModelParts(vector *ppAdditionalModelParts); @@ -541,13 +541,13 @@ private: struct PlayerKeyHash { - inline int operator() (const std::shared_ptr k) const + inline int operator() (const shared_ptr k) const { return Player::hash_fnct (k); } }; struct PlayerKeyEq { - inline bool operator() (const std::shared_ptr x, const std::shared_ptr y) const + inline bool operator() (const shared_ptr x, const shared_ptr y) const { return Player::eq_test (x, y); } }; diff --git a/Minecraft.World/PlayerAbilitiesPacket.cpp b/Minecraft.World/PlayerAbilitiesPacket.cpp index e0bfb21e..b1b854a5 100644 --- a/Minecraft.World/PlayerAbilitiesPacket.cpp +++ b/Minecraft.World/PlayerAbilitiesPacket.cpp @@ -131,7 +131,7 @@ bool PlayerAbilitiesPacket::canBeInvalidated() return true; } -bool PlayerAbilitiesPacket::isInvalidatedBy(std::shared_ptr packet) +bool PlayerAbilitiesPacket::isInvalidatedBy(shared_ptr packet) { return true; } \ No newline at end of file diff --git a/Minecraft.World/PlayerAbilitiesPacket.h b/Minecraft.World/PlayerAbilitiesPacket.h index 8a6e43a3..21c1fdc2 100644 --- a/Minecraft.World/PlayerAbilitiesPacket.h +++ b/Minecraft.World/PlayerAbilitiesPacket.h @@ -42,9 +42,9 @@ public: float getWalkingSpeed(); void setWalkingSpeed(float walkingSpeed); bool canBeInvalidated(); - bool isInvalidatedBy(std::shared_ptr packet); + bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new PlayerAbilitiesPacket()); } + static shared_ptr create() { return shared_ptr(new PlayerAbilitiesPacket()); } virtual int getId() { return 202; } }; \ No newline at end of file diff --git a/Minecraft.World/PlayerActionPacket.h b/Minecraft.World/PlayerActionPacket.h index 35221628..0228ebb4 100644 --- a/Minecraft.World/PlayerActionPacket.h +++ b/Minecraft.World/PlayerActionPacket.h @@ -24,7 +24,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new PlayerActionPacket()); } + static shared_ptr create() { return shared_ptr(new PlayerActionPacket()); } virtual int getId() { return 14; } }; diff --git a/Minecraft.World/PlayerCommandPacket.cpp b/Minecraft.World/PlayerCommandPacket.cpp index 626a71fc..6aecc0e6 100644 --- a/Minecraft.World/PlayerCommandPacket.cpp +++ b/Minecraft.World/PlayerCommandPacket.cpp @@ -22,19 +22,19 @@ PlayerCommandPacket::PlayerCommandPacket() action = 0; } -PlayerCommandPacket::PlayerCommandPacket(std::shared_ptr e, int action) +PlayerCommandPacket::PlayerCommandPacket(shared_ptr e, int action) { id = e->entityId; this->action = action; } -void PlayerCommandPacket::read(DataInputStream *dis) //throws IOException +void PlayerCommandPacket::read(DataInputStream *dis) //throws IOException { id = dis->readInt(); action = dis->readByte(); } -void PlayerCommandPacket::write(DataOutputStream *dos) //throws IOException +void PlayerCommandPacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(id); dos->writeByte(action); @@ -45,7 +45,7 @@ void PlayerCommandPacket::handle(PacketListener *listener) listener->handlePlayerCommand(shared_from_this()); } -int PlayerCommandPacket::getEstimatedSize() +int PlayerCommandPacket::getEstimatedSize() { return 5; } diff --git a/Minecraft.World/PlayerCommandPacket.h b/Minecraft.World/PlayerCommandPacket.h index 5e558358..dd6c8cb1 100644 --- a/Minecraft.World/PlayerCommandPacket.h +++ b/Minecraft.World/PlayerCommandPacket.h @@ -25,13 +25,13 @@ public: int action; PlayerCommandPacket(); - PlayerCommandPacket(std::shared_ptr e, int action); + PlayerCommandPacket(shared_ptr e, int action); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new PlayerCommandPacket()); } + static shared_ptr create() { return shared_ptr(new PlayerCommandPacket()); } virtual int getId() { return 19; } }; \ No newline at end of file diff --git a/Minecraft.World/PlayerEnderChestContainer.cpp b/Minecraft.World/PlayerEnderChestContainer.cpp index 9bcf07d2..466d9710 100644 --- a/Minecraft.World/PlayerEnderChestContainer.cpp +++ b/Minecraft.World/PlayerEnderChestContainer.cpp @@ -7,7 +7,7 @@ PlayerEnderChestContainer::PlayerEnderChestContainer() : SimpleContainer(IDS_TIL activeChest = nullptr; } -void PlayerEnderChestContainer::setActiveChest(std::shared_ptr activeChest) +void PlayerEnderChestContainer::setActiveChest(shared_ptr activeChest) { this->activeChest = activeChest; } @@ -31,7 +31,7 @@ ListTag *PlayerEnderChestContainer::createTag() ListTag *items = new ListTag(L"EnderItems"); for (int i = 0; i < getContainerSize(); i++) { - std::shared_ptr item = getItem(i); + shared_ptr item = getItem(i); if (item != NULL) { CompoundTag *tag = new CompoundTag(); @@ -43,7 +43,7 @@ ListTag *PlayerEnderChestContainer::createTag() return items; } -bool PlayerEnderChestContainer::stillValid(std::shared_ptr player) +bool PlayerEnderChestContainer::stillValid(shared_ptr player) { if (activeChest != NULL && !activeChest->stillValid(player)) { diff --git a/Minecraft.World/PlayerEnderChestContainer.h b/Minecraft.World/PlayerEnderChestContainer.h index 43bb3052..523417aa 100644 --- a/Minecraft.World/PlayerEnderChestContainer.h +++ b/Minecraft.World/PlayerEnderChestContainer.h @@ -7,15 +7,15 @@ class EnderChestTileEntity; class PlayerEnderChestContainer : public SimpleContainer { private: - std::shared_ptr activeChest; + shared_ptr activeChest; public: PlayerEnderChestContainer(); - void setActiveChest(std::shared_ptr activeChest); + void setActiveChest(shared_ptr activeChest); void setItemsByTag(ListTag *enderItemsList); ListTag *createTag(); - bool stillValid(std::shared_ptr player); + bool stillValid(shared_ptr player); void startOpen(); void stopOpen(); }; \ No newline at end of file diff --git a/Minecraft.World/PlayerIO.h b/Minecraft.World/PlayerIO.h index dc843605..559ab2ee 100644 --- a/Minecraft.World/PlayerIO.h +++ b/Minecraft.World/PlayerIO.h @@ -7,16 +7,16 @@ using namespace std; class Player; -class PlayerIO +class PlayerIO { public: - virtual void save(std::shared_ptr player) = 0; - virtual bool load(std::shared_ptr player) = 0; // 4J Changed return val to bool to check if new player or loaded player + virtual void save(shared_ptr player) = 0; + virtual bool load(shared_ptr player) = 0; // 4J Changed return val to bool to check if new player or loaded player virtual CompoundTag *loadPlayerDataTag(PlayerUID xuid) = 0; // 4J Changed from string name to xuid // 4J Added virtual void clearOldPlayerFiles() = 0; virtual void saveMapIdLookup() = 0; - virtual void deleteMapFilesForPlayer(std::shared_ptr player) = 0; + virtual void deleteMapFilesForPlayer(shared_ptr player) = 0; virtual void saveAllCachedData() = 0; }; \ No newline at end of file diff --git a/Minecraft.World/PlayerInfoPacket.cpp b/Minecraft.World/PlayerInfoPacket.cpp index d0d94c62..9cbe5f7c 100644 --- a/Minecraft.World/PlayerInfoPacket.cpp +++ b/Minecraft.World/PlayerInfoPacket.cpp @@ -25,7 +25,7 @@ PlayerInfoPacket::PlayerInfoPacket(BYTE networkSmallId, short playerColourIndex, m_entityId = -1; } -PlayerInfoPacket::PlayerInfoPacket(std::shared_ptr player) +PlayerInfoPacket::PlayerInfoPacket(shared_ptr player) { m_networkSmallId = 0; if(player->connection != NULL && player->connection->getNetworkPlayer() != NULL) m_networkSmallId = player->connection->getNetworkPlayer()->GetSmallId(); diff --git a/Minecraft.World/PlayerInfoPacket.h b/Minecraft.World/PlayerInfoPacket.h index f4ad972f..85e2ed64 100644 --- a/Minecraft.World/PlayerInfoPacket.h +++ b/Minecraft.World/PlayerInfoPacket.h @@ -19,7 +19,7 @@ class PlayerInfoPacket : public Packet, public enable_shared_from_this player); + PlayerInfoPacket(shared_ptr player); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); @@ -27,6 +27,6 @@ class PlayerInfoPacket : public Packet, public enable_shared_from_this create() { return std::shared_ptr(new PlayerInfoPacket()); } + static shared_ptr create() { return shared_ptr(new PlayerInfoPacket()); } virtual int getId() { return 201; } }; \ No newline at end of file diff --git a/Minecraft.World/PlayerInputPacket.h b/Minecraft.World/PlayerInputPacket.h index 93bbf797..8bc11d3e 100644 --- a/Minecraft.World/PlayerInputPacket.h +++ b/Minecraft.World/PlayerInputPacket.h @@ -31,6 +31,6 @@ public: bool isSneaking(); public: - static std::shared_ptr create() { return std::shared_ptr(new PlayerInputPacket()); } + static shared_ptr create() { return shared_ptr(new PlayerInputPacket()); } virtual int getId() { return 27; } }; \ No newline at end of file diff --git a/Minecraft.World/PortalForcer.cpp b/Minecraft.World/PortalForcer.cpp index e6c51a41..7c9b7a86 100644 --- a/Minecraft.World/PortalForcer.cpp +++ b/Minecraft.World/PortalForcer.cpp @@ -11,7 +11,7 @@ PortalForcer::PortalForcer() } -void PortalForcer::force(Level *level, std::shared_ptr e) +void PortalForcer::force(Level *level, shared_ptr e) { if (level->dimension->id == 1) { @@ -54,7 +54,7 @@ void PortalForcer::force(Level *level, std::shared_ptr e) } -bool PortalForcer::findPortal(Level *level, std::shared_ptr e) +bool PortalForcer::findPortal(Level *level, shared_ptr e) { // 4J Stu - Decrease the range at which we search for a portal in the nether given our smaller nether int r = 16;//* 8; @@ -133,7 +133,7 @@ bool PortalForcer::findPortal(Level *level, std::shared_ptr e) } -bool PortalForcer::createPortal(Level *level, std::shared_ptr e) +bool PortalForcer::createPortal(Level *level, shared_ptr e) { // 4J Stu - Increase the range at which we try and create a portal to stop creating them floating in mid air over lava int r = 16 * 3; @@ -147,7 +147,7 @@ bool PortalForcer::createPortal(Level *level, std::shared_ptr e) int XZSIZE = level->dimension->getXZSize() * 16; // XZSize is chunks, convert to blocks int XZOFFSET = (XZSIZE / 2) - 4; // Subtract 4 to stay away from the edges // TODO Make the 4 a constant in HellRandomLevelSource - // Move the positions that we want to check away from the edge of the world + // Move the positions that we want to check away from the edge of the world if( (xc - r) < -XZOFFSET ) { app.DebugPrintf("Adjusting portal creation x due to being too close to the edge\n"); @@ -215,7 +215,7 @@ bool PortalForcer::createPortal(Level *level, std::shared_ptr e) int yt = y + h; int zt = z + (s - 1) * za - b * xa; - // 4J Stu - Changes to stop Portals being created at the border of the nether inside the bedrock + // 4J Stu - Changes to stop Portals being created at the border of the nether inside the bedrock if( ( xt < -XZOFFSET ) || ( xt >= XZOFFSET ) || ( zt < -XZOFFSET ) || ( zt >= XZOFFSET ) ) { app.DebugPrintf("Skipping possible portal location as at least one block is too close to the edge\n"); @@ -275,7 +275,7 @@ bool PortalForcer::createPortal(Level *level, std::shared_ptr e) int yt = y + h; int zt = z + (s - 1) * za; - // 4J Stu - Changes to stop Portals being created at the border of the nether inside the bedrock + // 4J Stu - Changes to stop Portals being created at the border of the nether inside the bedrock if( ( xt < -XZOFFSET ) || ( xt >= XZOFFSET ) || ( zt < -XZOFFSET ) || ( zt >= XZOFFSET ) ) { app.DebugPrintf("Skipping possible portal location as at least one block is too close to the edge\n"); diff --git a/Minecraft.World/PortalForcer.h b/Minecraft.World/PortalForcer.h index b3dcd4e6..feb2f129 100644 --- a/Minecraft.World/PortalForcer.h +++ b/Minecraft.World/PortalForcer.h @@ -11,11 +11,11 @@ public: // 4J Stu Added - Java has no ctor, but we need to initialise random PortalForcer(); - void force(Level *level, std::shared_ptr e); + void force(Level *level, shared_ptr e); public: - bool findPortal(Level *level, std::shared_ptr e); + bool findPortal(Level *level, shared_ptr e); public: - bool createPortal(Level *level, std::shared_ptr e); + bool createPortal(Level *level, shared_ptr e); }; \ No newline at end of file diff --git a/Minecraft.World/PortalTile.cpp b/Minecraft.World/PortalTile.cpp index f97670a8..1b500a36 100644 --- a/Minecraft.World/PortalTile.cpp +++ b/Minecraft.World/PortalTile.cpp @@ -37,7 +37,7 @@ AABB *PortalTile::getAABB(Level *level, int x, int y, int z) return NULL; } -void PortalTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void PortalTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id) { @@ -195,7 +195,7 @@ int PortalTile::getRenderLayer() return 1; } -void PortalTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void PortalTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { if (entity->riding == NULL && entity->rider.lock() == NULL) entity->handleInsidePortal(); } diff --git a/Minecraft.World/PortalTile.h b/Minecraft.World/PortalTile.h index df6e4dee..7be4320f 100644 --- a/Minecraft.World/PortalTile.h +++ b/Minecraft.World/PortalTile.h @@ -10,7 +10,7 @@ public: PortalTile(int id); virtual void tick(Level *level, int x, int y, int z, Random *random); virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); virtual bool trySpawnPortal(Level *level, int x, int y, int z, bool actuallySpawn); @@ -18,7 +18,7 @@ public: virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); virtual int getResourceCount(Random *random); virtual int getRenderLayer(); - virtual void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); virtual int cloneTileId(Level *level, int x, int y, int z); virtual bool mayPick(); // 4J Added override diff --git a/Minecraft.World/PotatoTile.cpp b/Minecraft.World/PotatoTile.cpp index d348aaec..27ca1984 100644 --- a/Minecraft.World/PotatoTile.cpp +++ b/Minecraft.World/PotatoTile.cpp @@ -46,7 +46,7 @@ void PotatoTile::spawnResources(Level *level, int x, int y, int z, int data, flo { if (level->random->nextInt(50) == 0) { - popResource(level, x, y, z, std::shared_ptr(new ItemInstance(Item::potatoPoisonous))); + popResource(level, x, y, z, shared_ptr(new ItemInstance(Item::potatoPoisonous))); } } } diff --git a/Minecraft.World/PotionItem.cpp b/Minecraft.World/PotionItem.cpp index d7154c49..643e9661 100644 --- a/Minecraft.World/PotionItem.cpp +++ b/Minecraft.World/PotionItem.cpp @@ -30,7 +30,7 @@ PotionItem::PotionItem(int id) : Item(id) iconOverlay = NULL; } -vector *PotionItem::getMobEffects(std::shared_ptr potion) +vector *PotionItem::getMobEffects(shared_ptr potion) { return getMobEffects(potion->getAuxValue()); } @@ -48,7 +48,7 @@ vector *PotionItem::getMobEffects(int auxValue) return effects; } -std::shared_ptr PotionItem::useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr PotionItem::useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player) { if (!player->abilities.instabuild) instance->count--; @@ -68,46 +68,46 @@ std::shared_ptr PotionItem::useTimeDepleted(std::shared_ptrcount <= 0) { - return std::shared_ptr( new ItemInstance(Item::glassBottle) ); + return shared_ptr( new ItemInstance(Item::glassBottle) ); } else { - player->inventory->add( std::shared_ptr( new ItemInstance(Item::glassBottle) ) ); + player->inventory->add( shared_ptr( new ItemInstance(Item::glassBottle) ) ); } } return instance; } -int PotionItem::getUseDuration(std::shared_ptr itemInstance) +int PotionItem::getUseDuration(shared_ptr itemInstance) { return DRINK_DURATION; } -UseAnim PotionItem::getUseAnimation(std::shared_ptr itemInstance) +UseAnim PotionItem::getUseAnimation(shared_ptr itemInstance) { return UseAnim_drink; } -bool PotionItem::TestUse(Level *level, std::shared_ptr player) +bool PotionItem::TestUse(Level *level, shared_ptr player) { return true; } -std::shared_ptr PotionItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr PotionItem::use(shared_ptr instance, Level *level, shared_ptr player) { if (isThrowable(instance->getAuxValue())) { if (!player->abilities.instabuild) instance->count--; level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) level->addEntity(std::shared_ptr( new ThrownPotion(level, player, instance->getAuxValue()) )); + if (!level->isClientSide) level->addEntity(shared_ptr( new ThrownPotion(level, player, instance->getAuxValue()) )); return instance; } player->startUsingItem(instance, getUseDuration(instance)); return instance; } -bool PotionItem::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool PotionItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { return false; } @@ -140,7 +140,7 @@ int PotionItem::getColor(int data) return PotionBrewing::getColorValue(data, false); } -int PotionItem::getColor(std::shared_ptr item, int spriteLayer) +int PotionItem::getColor(shared_ptr item, int spriteLayer) { if (spriteLayer > 0) { @@ -173,7 +173,7 @@ bool PotionItem::hasInstantenousEffects(int itemAuxValue) return false; } -wstring PotionItem::getHoverName(std::shared_ptr itemInstance) +wstring PotionItem::getHoverName(shared_ptr itemInstance) { if (itemInstance->getAuxValue() == 0) { @@ -197,7 +197,7 @@ wstring PotionItem::getHoverName(std::shared_ptr itemInstance) //String postfixString = effects.get(0).getDescriptionId(); //postfixString += ".postfix"; //return elementName + " " + I18n.get(postfixString).trim(); - + elementName = replaceAll(elementName,L"{*prefix*}",L""); elementName = replaceAll(elementName,L"{*postfix*}",app.GetString(effects->at(0)->getPostfixDescriptionId())); } @@ -205,14 +205,14 @@ wstring PotionItem::getHoverName(std::shared_ptr itemInstance) { //String appearanceName = PotionBrewing.getAppearanceName(itemInstance.getAuxValue()); //return I18n.get(appearanceName).trim() + " " + elementName; - + elementName = replaceAll(elementName,L"{*prefix*}",app.GetString( PotionBrewing::getAppearanceName(itemInstance->getAuxValue()))); elementName = replaceAll(elementName,L"{*postfix*}",L""); } return elementName; } -void PotionItem::appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void PotionItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) { if (itemInstance->getAuxValue() == 0) { @@ -260,12 +260,12 @@ void PotionItem::appendHoverText(std::shared_ptr itemInstance, std if (MobEffect::effects[effect->getId()]->isHarmful()) { colour = eHTMLColor_c; - //lines->push_back(L"�c + effectString); //"�c" + //lines->push_back(L"c + effectString); //"c" } else { colour = eHTMLColor_7; - //lines->push_back(L"�7" + effectString); //"�7" + //lines->push_back(L"7" + effectString); //"7" } swprintf(formatted, 256, L"%ls",app.GetHTMLColour(colour),effectString.c_str()); lines->push_back(formatted); @@ -277,21 +277,21 @@ void PotionItem::appendHoverText(std::shared_ptr itemInstance, std //eHTMLColor_7 wchar_t formatted[256]; swprintf(formatted,256,L"%ls",app.GetHTMLColour(eHTMLColor_7),effectString.c_str()); - lines->push_back(formatted); //"�7" + lines->push_back(formatted); //"7" } } -bool PotionItem::isFoil(std::shared_ptr itemInstance) +bool PotionItem::isFoil(shared_ptr itemInstance) { vector *mobEffects = getMobEffects(itemInstance); return mobEffects != NULL && !mobEffects->empty(); } -unsigned int PotionItem::getUseDescriptionId(std::shared_ptr instance) +unsigned int PotionItem::getUseDescriptionId(shared_ptr instance) { int brew = instance->getAuxValue(); - + #define MACRO_POTION_IS_NIGHTVISION(aux) ((aux & 0x200F) == MASK_NIGHTVISION) #define MACRO_POTION_IS_INVISIBILITY(aux) ((aux & 0x200F) == MASK_INVISIBILITY) diff --git a/Minecraft.World/PotionItem.h b/Minecraft.World/PotionItem.h index 0d5dd181..d03d3308 100644 --- a/Minecraft.World/PotionItem.h +++ b/Minecraft.World/PotionItem.h @@ -24,26 +24,26 @@ private: public: PotionItem(int id); - virtual vector *getMobEffects(std::shared_ptr potion); + virtual vector *getMobEffects(shared_ptr potion); virtual vector *getMobEffects(int auxValue); - virtual std::shared_ptr useTimeDepleted(std::shared_ptr instance, Level *level, std::shared_ptr player); - virtual int getUseDuration(std::shared_ptr itemInstance); - virtual UseAnim getUseAnimation(std::shared_ptr itemInstance); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); - virtual bool TestUse(Level *level, std::shared_ptr player); - virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual shared_ptr useTimeDepleted(shared_ptr instance, Level *level, shared_ptr player); + virtual int getUseDuration(shared_ptr itemInstance); + virtual UseAnim getUseAnimation(shared_ptr itemInstance); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); + virtual bool TestUse(Level *level, shared_ptr player); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); virtual Icon *getIcon(int auxValue); virtual Icon *getLayerIcon(int auxValue, int spriteLayer); static bool isThrowable(int auxValue); int getColor(int data); - virtual int getColor(std::shared_ptr item, int spriteLayer); + virtual int getColor(shared_ptr item, int spriteLayer); virtual bool hasMultipleSpriteLayers(); virtual bool hasInstantenousEffects(int itemAuxValue); - virtual wstring getHoverName(std::shared_ptr itemInstance); - virtual void appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); - virtual bool isFoil(std::shared_ptr itemInstance); + virtual wstring getHoverName(shared_ptr itemInstance); + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); + virtual bool isFoil(shared_ptr itemInstance); - virtual unsigned int getUseDescriptionId(std::shared_ptr instance); + virtual unsigned int getUseDescriptionId(shared_ptr instance); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/PreLoginPacket.h b/Minecraft.World/PreLoginPacket.h index 2d73d630..243f2f36 100644 --- a/Minecraft.World/PreLoginPacket.h +++ b/Minecraft.World/PreLoginPacket.h @@ -34,6 +34,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new PreLoginPacket()); } + static shared_ptr create() { return shared_ptr(new PreLoginPacket()); } virtual int getId() { return 2; } }; \ No newline at end of file diff --git a/Minecraft.World/PressurePlateTile.cpp b/Minecraft.World/PressurePlateTile.cpp index 43dd9aed..eacdeb07 100644 --- a/Minecraft.World/PressurePlateTile.cpp +++ b/Minecraft.World/PressurePlateTile.cpp @@ -76,7 +76,7 @@ void PressurePlateTile::tick(Level *level, int x, int y, int z, Random *random) checkPressed(level, x, y, z); } -void PressurePlateTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void PressurePlateTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { if (level->isClientSide) return; @@ -94,7 +94,7 @@ void PressurePlateTile::checkPressed(Level *level, int x, int y, int z) bool shouldBePressed = false; float b = 2 / 16.0f; - vector > *entities = NULL; + vector > *entities = NULL; bool entitiesToBeFreed = false; if (sensitivity == PressurePlateTile::everything) entities = level->getEntities(nullptr, AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 0.25, z + 1 - b)); @@ -155,7 +155,7 @@ void PressurePlateTile::onRemove(Level *level, int x, int y, int z, int id, int Tile::onRemove(level, x, y, z, id, data); } -void PressurePlateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void PressurePlateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { bool pressed = level->getData(x, y, z) == 1; diff --git a/Minecraft.World/PressurePlateTile.h b/Minecraft.World/PressurePlateTile.h index e46f5a1a..0b70fca9 100644 --- a/Minecraft.World/PressurePlateTile.h +++ b/Minecraft.World/PressurePlateTile.h @@ -31,19 +31,19 @@ public: virtual bool mayPlace(Level *level, int x, int y, int z); virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); private: virtual void checkPressed(Level *level, int x, int y, int z); public: virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); virtual bool isSignalSource(); virtual void updateDefaultShape(); virtual int getPistonPushReaction(); void registerIcons(IconRegister *iconRegister); - + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); }; diff --git a/Minecraft.World/ProtectionEnchantment.cpp b/Minecraft.World/ProtectionEnchantment.cpp index b8311c85..39e3eca1 100644 --- a/Minecraft.World/ProtectionEnchantment.cpp +++ b/Minecraft.World/ProtectionEnchantment.cpp @@ -52,7 +52,7 @@ int ProtectionEnchantment::getDescriptionId() } bool ProtectionEnchantment::isCompatibleWith(Enchantment *other) const -{ +{ ProtectionEnchantment *pe = dynamic_cast( other ); if (pe != NULL) { @@ -69,7 +69,7 @@ bool ProtectionEnchantment::isCompatibleWith(Enchantment *other) const return Enchantment::isCompatibleWith(other); } -int ProtectionEnchantment::getFireAfterDampener(std::shared_ptr entity, int time) +int ProtectionEnchantment::getFireAfterDampener(shared_ptr entity, int time) { int level = EnchantmentHelper::getEnchantmentLevel(Enchantment::fireProtection->id, entity->getEquipmentSlots()); @@ -81,7 +81,7 @@ int ProtectionEnchantment::getFireAfterDampener(std::shared_ptr entity, return time; } -double ProtectionEnchantment::getExplosionKnockbackAfterDampener(std::shared_ptr entity, double power) +double ProtectionEnchantment::getExplosionKnockbackAfterDampener(shared_ptr entity, double power) { int level = EnchantmentHelper::getEnchantmentLevel(Enchantment::explosionProtection->id, entity->getEquipmentSlots()); diff --git a/Minecraft.World/ProtectionEnchantment.h b/Minecraft.World/ProtectionEnchantment.h index e9727254..910e32df 100644 --- a/Minecraft.World/ProtectionEnchantment.h +++ b/Minecraft.World/ProtectionEnchantment.h @@ -28,6 +28,6 @@ public: virtual int getDamageProtection(int level, DamageSource *source); virtual int getDescriptionId(); virtual bool isCompatibleWith(Enchantment *other) const; - static int getFireAfterDampener(std::shared_ptr entity, int time); - static double getExplosionKnockbackAfterDampener(std::shared_ptr entity, double power); + static int getFireAfterDampener(shared_ptr entity, int time); + static double getExplosionKnockbackAfterDampener(shared_ptr entity, double power); }; \ No newline at end of file diff --git a/Minecraft.World/PumpkinTile.cpp b/Minecraft.World/PumpkinTile.cpp index 22c31d3d..577b9a17 100644 --- a/Minecraft.World/PumpkinTile.cpp +++ b/Minecraft.World/PumpkinTile.cpp @@ -45,7 +45,7 @@ void PumpkinTile::onPlace(Level *level, int x, int y, int z) level->setTileNoUpdate(x, y, z, 0); level->setTileNoUpdate(x, y - 1, z, 0); level->setTileNoUpdate(x, y - 2, z, 0); - std::shared_ptr snowMan = std::shared_ptr(new SnowMan(level)); + shared_ptr snowMan = shared_ptr(new SnowMan(level)); snowMan->moveTo(x + 0.5, y - 1.95, z + 0.5, 0, 0); level->addEntity(snowMan); @@ -94,7 +94,7 @@ void PumpkinTile::onPlace(Level *level, int x, int y, int z) level->setTileNoUpdate(x, y - 1, z + 1, 0); } - std::shared_ptr villagerGolem = std::shared_ptr(new VillagerGolem(level)); + shared_ptr villagerGolem = shared_ptr(new VillagerGolem(level)); villagerGolem->setPlayerCreated(true); villagerGolem->moveTo(x + 0.5, y - 1.95, z + 0.5, 0, 0); level->addEntity(villagerGolem); @@ -155,7 +155,7 @@ bool PumpkinTile::mayPlace(Level *level, int x, int y, int z) } -void PumpkinTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void PumpkinTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = Mth::floor(by->yRot * 4 / (360) + 2.5) & 3; level->setData(x, y, z, dir); diff --git a/Minecraft.World/PumpkinTile.h b/Minecraft.World/PumpkinTile.h index 03e55569..1c808b54 100644 --- a/Minecraft.World/PumpkinTile.h +++ b/Minecraft.World/PumpkinTile.h @@ -26,6 +26,6 @@ public: virtual Icon *getTexture(int face, int data); virtual void onPlace(Level *level, int x, int y, int z); virtual bool mayPlace(Level *level, int x, int y, int z); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/QuartzBlockTile.cpp b/Minecraft.World/QuartzBlockTile.cpp index f719ff7a..a7beeb21 100644 --- a/Minecraft.World/QuartzBlockTile.cpp +++ b/Minecraft.World/QuartzBlockTile.cpp @@ -89,9 +89,9 @@ int QuartzBlockTile::getSpawnResourcesAuxValue(int data) return data; } -std::shared_ptr QuartzBlockTile::getSilkTouchItemInstance(int data) +shared_ptr QuartzBlockTile::getSilkTouchItemInstance(int data) { - if (data == TYPE_LINES_X || data == TYPE_LINES_Z) return std::shared_ptr(new ItemInstance(id, 1, TYPE_LINES_Y)); + if (data == TYPE_LINES_X || data == TYPE_LINES_Z) return shared_ptr(new ItemInstance(id, 1, TYPE_LINES_Y)); return Tile::getSilkTouchItemInstance(data); } diff --git a/Minecraft.World/QuartzBlockTile.h b/Minecraft.World/QuartzBlockTile.h index d812e8a1..bdb5af8b 100644 --- a/Minecraft.World/QuartzBlockTile.h +++ b/Minecraft.World/QuartzBlockTile.h @@ -39,7 +39,7 @@ public: int getSpawnResourcesAuxValue(int data); protected: - std::shared_ptr getSilkTouchItemInstance(int data); + shared_ptr getSilkTouchItemInstance(int data); public: int getRenderShape(); diff --git a/Minecraft.World/RailTile.cpp b/Minecraft.World/RailTile.cpp index c2d1befc..4ece48ca 100644 --- a/Minecraft.World/RailTile.cpp +++ b/Minecraft.World/RailTile.cpp @@ -397,7 +397,7 @@ HitResult *RailTile::clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b return Tile::clip(level, xt, yt, zt, a, b); } -void RailTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void RailTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { int data = level->getData(x, y, z); if (data >= 2 && data <= 5) diff --git a/Minecraft.World/RailTile.h b/Minecraft.World/RailTile.h index 9fb854ad..776d8454 100644 --- a/Minecraft.World/RailTile.h +++ b/Minecraft.World/RailTile.h @@ -66,7 +66,7 @@ public: virtual bool blocksLight(); virtual bool isSolidRender(bool isServerLevel = false); virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual Icon *getTexture(int face, int data); virtual bool isCubeShaped(); virtual int getRenderShape(); diff --git a/Minecraft.World/RandomPos.cpp b/Minecraft.World/RandomPos.cpp index a12c93a9..c2cfd908 100644 --- a/Minecraft.World/RandomPos.cpp +++ b/Minecraft.World/RandomPos.cpp @@ -5,12 +5,12 @@ Vec3 *RandomPos::tempDir = Vec3::newPermanent(0, 0, 0); -Vec3 *RandomPos::getPos(std::shared_ptr mob, int xzDist, int yDist, int quadrant/*=-1*/) // 4J - added quadrant +Vec3 *RandomPos::getPos(shared_ptr mob, int xzDist, int yDist, int quadrant/*=-1*/) // 4J - added quadrant { return generateRandomPos(mob, xzDist, yDist, NULL, quadrant); } -Vec3 *RandomPos::getPosTowards(std::shared_ptr mob, int xzDist, int yDist, Vec3 *towardsPos) +Vec3 *RandomPos::getPosTowards(shared_ptr mob, int xzDist, int yDist, Vec3 *towardsPos) { tempDir->x = towardsPos->x - mob->x; tempDir->y = towardsPos->y - mob->y; @@ -18,7 +18,7 @@ Vec3 *RandomPos::getPosTowards(std::shared_ptr mob, int xzDist, i return generateRandomPos(mob, xzDist, yDist, tempDir); } -Vec3 *RandomPos::getPosAvoid(std::shared_ptr mob, int xzDist, int yDist, Vec3 *avoidPos) +Vec3 *RandomPos::getPosAvoid(shared_ptr mob, int xzDist, int yDist, Vec3 *avoidPos) { tempDir->x = mob->x - avoidPos->x; tempDir->y = mob->y - avoidPos->y; @@ -26,7 +26,7 @@ Vec3 *RandomPos::getPosAvoid(std::shared_ptr mob, int xzDist, int return generateRandomPos(mob, xzDist, yDist, tempDir); } -Vec3 *RandomPos::generateRandomPos(std::shared_ptr mob, int xzDist, int yDist, Vec3 *dir, int quadrant/*=-1*/) // 4J - added quadrant +Vec3 *RandomPos::generateRandomPos(shared_ptr mob, int xzDist, int yDist, Vec3 *dir, int quadrant/*=-1*/) // 4J - added quadrant { Random *random = mob->getRandom(); bool hasBest = false; diff --git a/Minecraft.World/RandomPos.h b/Minecraft.World/RandomPos.h index a5ee447b..eceed17e 100644 --- a/Minecraft.World/RandomPos.h +++ b/Minecraft.World/RandomPos.h @@ -8,10 +8,10 @@ private: static Vec3 *tempDir; public: - static Vec3 *getPos(std::shared_ptr mob, int xzDist, int yDist, int quadrant = -1); // 4J added quadrant - static Vec3 *getPosTowards(std::shared_ptr mob, int xzDist, int yDist, Vec3 *towardsPos); - static Vec3 *getPosAvoid(std::shared_ptr mob, int xzDist, int yDist, Vec3 *avoidPos); + static Vec3 *getPos(shared_ptr mob, int xzDist, int yDist, int quadrant = -1); // 4J added quadrant + static Vec3 *getPosTowards(shared_ptr mob, int xzDist, int yDist, Vec3 *towardsPos); + static Vec3 *getPosAvoid(shared_ptr mob, int xzDist, int yDist, Vec3 *avoidPos); private: - static Vec3 *generateRandomPos(std::shared_ptr mob, int xzDist, int yDist, Vec3 *dir, int quadrant = -1); // 4J added quadrant + static Vec3 *generateRandomPos(shared_ptr mob, int xzDist, int yDist, Vec3 *dir, int quadrant = -1); // 4J added quadrant }; \ No newline at end of file diff --git a/Minecraft.World/Recipes.cpp b/Minecraft.World/Recipes.cpp index 066bd4a1..93be1dfb 100644 --- a/Minecraft.World/Recipes.cpp +++ b/Minecraft.World/Recipes.cpp @@ -45,7 +45,7 @@ void Recipes::_init() recipies = new RecipyList(); } -Recipes::Recipes() +Recipes::Recipes() { int iCount=0; _init(); @@ -55,7 +55,7 @@ Recipes::Recipes() pFoodRecipies = new FoodRecipies; pOreRecipies = new OreRecipies; pStructureRecipies = new StructureRecipies; - pToolRecipies = new ToolRecipies; + pToolRecipies = new ToolRecipies; pWeaponRecipies = new WeaponRecipies; // 4J Stu - These just don't work with our crafting menu @@ -74,8 +74,8 @@ Recipes::Recipes() L"#", // L'#', new ItemInstance(Tile::treeTrunk, 1, TreeTile::BIRCH_TRUNK), - L'S'); - + L'S'); + addShapedRecipy(new ItemInstance(Tile::wood, 4, TreeTile::DARK_TRUNK), // L"sczg", L"#", // @@ -99,7 +99,7 @@ Recipes::Recipes() L'S'); pToolRecipies->addRecipes(this); - pFoodRecipies->addRecipes(this); + pFoodRecipies->addRecipes(this); pStructureRecipies->addRecipes(this); @@ -146,8 +146,8 @@ Recipes::Recipes() L"#W#", // L'#', Item::stick, L'W', Tile::wood, - L'S'); - + L'S'); + addShapedRecipy(new ItemInstance(Tile::fence, 2), // L"sscig", L"###", // @@ -155,7 +155,7 @@ Recipes::Recipes() L'#', Item::stick, L'S'); - + addShapedRecipy(new ItemInstance(Tile::netherFence, 6), // L"ssctg", L"###", // @@ -303,10 +303,10 @@ Recipes::Recipes() L'#', Tile::quartzBlock, L'S'); - pArmorRecipes->addRecipes(this); + pArmorRecipes->addRecipes(this); //iCount=getRecipies()->size(); - pClothDyeRecipes->addRecipes(this); + pClothDyeRecipes->addRecipes(this); addShapedRecipy(new ItemInstance(Tile::snow, 1), // @@ -363,14 +363,14 @@ Recipes::Recipes() L"###", // L'#', Tile::rock, - L'S'); + L'S'); addShapedRecipy(new ItemInstance(Tile::stoneSlabHalf, 6, StoneSlabTile::COBBLESTONE_SLAB), // L"sctg", L"###", // L'#', Tile::stoneBrick, L'S'); - + addShapedRecipy(new ItemInstance(Tile::stoneSlabHalf, 6, StoneSlabTile::BRICK_SLAB), // L"sctg", L"###", // @@ -556,7 +556,7 @@ Recipes::Recipes() L"# X", // L" #X", // - L'X', Item::string,// + L'X', Item::string,// L'#', Item::stick, L'T'); @@ -566,8 +566,8 @@ Recipes::Recipes() L"#", // L"Y", // - L'Y', Item::feather,// - L'X', Item::flint,// + L'Y', Item::feather,// + L'X', Item::flint,// L'#', Item::stick, L'T'); @@ -715,7 +715,7 @@ Recipes::Recipes() L'#', Item::paper, L'X', Item::compass, L'T'); - + addShapedRecipy(new ItemInstance(Tile::button, 1), // L"sctg", L"#", // @@ -844,7 +844,7 @@ Recipes::Recipes() L'#', Item::stick, L'X', Item::leather, L'D'); - pOreRecipies->addRecipes(this); + pOreRecipies->addRecipes(this); addShapedRecipy(new ItemInstance(Item::goldIngot), // L"ssscig", @@ -894,17 +894,17 @@ Recipes::Recipes() // Sort so the largest recipes get checked first! /* 4J-PB - TODO - Collections.sort(recipies, new Comparator() + Collections.sort(recipies, new Comparator() { - public: int compare(Recipy r0, Recipy r1) + public: int compare(Recipy r0, Recipy r1) { // shapeless recipes are put in the back of the list - if (r0 instanceof ShapelessRecipy && r1 instanceof ShapedRecipy) + if (r0 instanceof ShapelessRecipy && r1 instanceof ShapedRecipy) { return 1; } - if (r1 instanceof ShapelessRecipy && r0 instanceof ShapedRecipy) + if (r1 instanceof ShapelessRecipy && r0 instanceof ShapedRecipy) { return -1; } @@ -957,7 +957,7 @@ ShapedRecipy *Recipes::addShapedRecipy(ItemInstance *result, ...) wchTypes = va_arg(vl,wchar_t *); - for(int i = 0; wchTypes[i] != L'\0'; ++i ) + for(int i = 0; wchTypes[i] != L'\0'; ++i ) { if(wchTypes[i+1]==L'\0' && wchTypes[i]!=L'g') { @@ -1051,15 +1051,15 @@ ShapedRecipy *Recipes::addShapedRecipy(ItemInstance *result, ...) ids = new ItemInstance *[width * height]; - for (int j = 0; j < width * height; j++) + for (int j = 0; j < width * height; j++) { wchar_t ch = map[j]; myMap::iterator it=mappings->find(ch); - if (it != mappings->end()) + if (it != mappings->end()) { ids[j] =it->second; - } - else + } + else { ids[j] = NULL; } @@ -1073,7 +1073,7 @@ ShapedRecipy *Recipes::addShapedRecipy(ItemInstance *result, ...) return recipe; } -void Recipes::addShapelessRecipy(ItemInstance *result,... ) +void Recipes::addShapelessRecipy(ItemInstance *result,... ) { va_list vl; wchar_t *szTypes; @@ -1092,7 +1092,7 @@ void Recipes::addShapelessRecipy(ItemInstance *result,... ) // t - Tile * szTypes = va_arg(vl,wchar_t *); - for(int i = 0; szTypes[i] != L'\0'; ++i ) + for(int i = 0; szTypes[i] != L'\0'; ++i ) { switch(szTypes[i]) { @@ -1143,17 +1143,17 @@ void Recipes::addShapelessRecipy(ItemInstance *result,... ) break; } } - recipies->push_back(new ShapelessRecipy(result, ingredients, group)); + recipies->push_back(new ShapelessRecipy(result, ingredients, group)); } -std::shared_ptr Recipes::getItemFor(std::shared_ptr craftSlots, Level *level) +shared_ptr Recipes::getItemFor(shared_ptr craftSlots, Level *level) { int count = 0; - std::shared_ptr first = nullptr; - std::shared_ptr second = nullptr; + shared_ptr first = nullptr; + shared_ptr second = nullptr; for (int i = 0; i < craftSlots->getContainerSize(); i++) { - std::shared_ptr item = craftSlots->getItem(i); + shared_ptr item = craftSlots->getItem(i); if (item != NULL) { if (count == 0) first = item; @@ -1170,7 +1170,7 @@ std::shared_ptr Recipes::getItemFor(std::shared_ptrgetMaxDamage() * 5 / 100; int resultDamage = item->getMaxDamage() - remaining; if (resultDamage < 0) resultDamage = 0; - return std::shared_ptr( new ItemInstance(first->id, 1, resultDamage) ); + return shared_ptr( new ItemInstance(first->id, 1, resultDamage) ); } AUTO_VAR(itEnd, recipies->end()); @@ -1182,13 +1182,13 @@ std::shared_ptr Recipes::getItemFor(std::shared_ptr *Recipes::getRecipies() +vector *Recipes::getRecipies() { return recipies; } // 4J-PB - added to deal with Xb0x 'crafting' -std::shared_ptr Recipes::getItemForRecipe(Recipy *r) +shared_ptr Recipes::getItemForRecipe(Recipy *r) { return r->assemble(nullptr); } @@ -1204,9 +1204,9 @@ void Recipes::buildRecipeIngredientsArray(void) int iCount=0; AUTO_VAR(itEndRec, recipies->end()); - for (AUTO_VAR(it, recipies->begin()); it != itEndRec; it++) + for (AUTO_VAR(it, recipies->begin()); it != itEndRec; it++) { - Recipy *recipe = *it; + Recipy *recipe = *it; //wprintf(L"RECIPE - [%d] is %w\n",iCount,recipe->getResultItem()->getItem()->getName()); recipe->requires(&m_pRecipeIngredientsRequired[iCount++]); } diff --git a/Minecraft.World/Recipes.h b/Minecraft.World/Recipes.h index 5d75b0e6..c5d091e1 100644 --- a/Minecraft.World/Recipes.h +++ b/Minecraft.World/Recipes.h @@ -62,12 +62,12 @@ private: eINSTANCEOF eType; }; -class Recipes +class Recipes { public: static const int ANY_AUX_VALUE = -1; -private: +private: static Recipes *instance; vector *recipies; @@ -75,25 +75,25 @@ private: public: static void staticCtor(); -public: - static Recipes *getInstance() +public: + static Recipes *getInstance() { return instance; } -private: +private: void _init(); // 4J add Recipes(); public: ShapedRecipy *addShapedRecipy(ItemInstance *, ... ); - void addShapelessRecipy(ItemInstance *result,... ); + void addShapelessRecipy(ItemInstance *result,... ); - std::shared_ptr getItemFor(std::shared_ptr craftSlots, Level *level); + shared_ptr getItemFor(shared_ptr craftSlots, Level *level); vector *getRecipies(); // 4J-PB - Added all below for new Xbox 'crafting' - std::shared_ptr getItemForRecipe(Recipy *r); + shared_ptr getItemForRecipe(Recipy *r); Recipy::INGREDIENTS_REQUIRED *getRecipeIngredientsArray(); private: diff --git a/Minecraft.World/Recipy.h b/Minecraft.World/Recipy.h index 96d6be35..88d9640a 100644 --- a/Minecraft.World/Recipy.h +++ b/Minecraft.World/Recipy.h @@ -1,5 +1,5 @@ // package net.minecraft.world.item.crafting; -// +// // import net.minecraft.world.inventory.CraftingContainer; // import net.minecraft.world.item.ItemInstance; @@ -10,7 +10,7 @@ #define RECIPE_TYPE_2x2 0 #define RECIPE_TYPE_3x3 1 -class Recipy +class Recipy { public: enum _eGroupType @@ -28,7 +28,7 @@ public: eGroupType; // to class the item produced by the recipe // 4J-PB - we'll classing an ingredient ID with a different aux value as a different IngID AuxVal pair - typedef struct + typedef struct { int iIngC; int iType; // Can be a 2x2 or a 3x3. Inventory crafting can only make a 2x2. @@ -42,11 +42,11 @@ public: } INGREDIENTS_REQUIRED; ~Recipy() {} - virtual bool matches(std::shared_ptr craftSlots, Level *level) = 0; - virtual std::shared_ptr assemble(std::shared_ptr craftSlots) = 0; + virtual bool matches(shared_ptr craftSlots, Level *level) = 0; + virtual shared_ptr assemble(shared_ptr craftSlots) = 0; virtual int size() = 0; virtual const ItemInstance *getResultItem() = 0; - virtual const int getGroup() = 0; + virtual const int getGroup() = 0; // 4J-PB virtual bool requires(int iRecipe) = 0; diff --git a/Minecraft.World/RecordPlayerTile.cpp b/Minecraft.World/RecordPlayerTile.cpp index 12fd3590..de5f7386 100644 --- a/Minecraft.World/RecordPlayerTile.cpp +++ b/Minecraft.World/RecordPlayerTile.cpp @@ -23,14 +23,14 @@ Icon *RecordPlayerTile::getTexture(int face, int data) } // 4J-PB - Adding a TestUse for tooltip display -bool RecordPlayerTile::TestUse(Level *level, int x, int y, int z, std::shared_ptr player) +bool RecordPlayerTile::TestUse(Level *level, int x, int y, int z, shared_ptr player) { // if the jukebox is empty, return true if (level->getData(x, y, z) == 0) return false; return true; } -bool RecordPlayerTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool RecordPlayerTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if (soundOnly) return false; if (level->getData(x, y, z) == 0) return false; @@ -42,7 +42,7 @@ void RecordPlayerTile::setRecord(Level *level, int x, int y, int z, int record) { if (level->isClientSide) return; - std::shared_ptr rte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr rte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); rte->record = record; rte->setChanged(); @@ -53,7 +53,7 @@ void RecordPlayerTile::dropRecording(Level *level, int x, int y, int z) { if (level->isClientSide) return; - std::shared_ptr rte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr rte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if( rte == NULL ) return; int oldRecord = rte->record; @@ -71,7 +71,7 @@ void RecordPlayerTile::dropRecording(Level *level, int x, int y, int z) double xo = level->random->nextFloat() * s + (1 - s) * 0.5; double yo = level->random->nextFloat() * s + (1 - s) * 0.2 + 0.6; double zo = level->random->nextFloat() * s + (1 - s) * 0.5; - std::shared_ptr item = std::shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, std::shared_ptr( new ItemInstance(oldRecord, 1, 0) ) ) ); + shared_ptr item = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(oldRecord, 1, 0) ) ) ); item->throwTime = 10; level->addEntity(item); } @@ -88,9 +88,9 @@ void RecordPlayerTile::spawnResources(Level *level, int x, int y, int z, int dat Tile::spawnResources(level, x, y, z, data, odds, 0); } -std::shared_ptr RecordPlayerTile::newTileEntity(Level *level) +shared_ptr RecordPlayerTile::newTileEntity(Level *level) { - return std::shared_ptr( new RecordPlayerTile::Entity() ); + return shared_ptr( new RecordPlayerTile::Entity() ); } void RecordPlayerTile::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/RecordPlayerTile.h b/Minecraft.World/RecordPlayerTile.h index 8d216af8..b6a2d901 100644 --- a/Minecraft.World/RecordPlayerTile.h +++ b/Minecraft.World/RecordPlayerTile.h @@ -37,9 +37,9 @@ public: } // 4J Added - std::shared_ptr clone() + shared_ptr clone() { - std::shared_ptr result = std::shared_ptr( new RecordPlayerTile::Entity() ); + shared_ptr result = shared_ptr( new RecordPlayerTile::Entity() ); TileEntity::clone(result); result->record = record; @@ -56,13 +56,13 @@ protected: public: virtual Icon *getTexture(int face, int data); - virtual bool TestUse(Level *level, int x, int y, int z, std::shared_ptr player); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool TestUse(Level *level, int x, int y, int z, shared_ptr player); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param void setRecord(Level *level, int x, int y, int z, int record); void dropRecording(Level *level, int x, int y, int z); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); - virtual std::shared_ptr newTileEntity(Level *level); + virtual shared_ptr newTileEntity(Level *level); void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/RecordingItem.cpp b/Minecraft.World/RecordingItem.cpp index dffd38c6..24be1190 100644 --- a/Minecraft.World/RecordingItem.cpp +++ b/Minecraft.World/RecordingItem.cpp @@ -17,7 +17,7 @@ Icon *RecordingItem::getIcon(int auxValue) return icon; } -bool RecordingItem::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool RecordingItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed if (level->getTile(x, y, z) == Tile::recordPlayer_Id && level->getData(x, y, z) == 0) @@ -40,9 +40,9 @@ bool RecordingItem::useOn(std::shared_ptr itemInstance, std::share return false; } -void RecordingItem::appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void RecordingItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) { - eMinecraftColour rarityColour = getRarity(std::shared_ptr())->color; + eMinecraftColour rarityColour = getRarity(shared_ptr())->color; int colour = app.GetHTMLColour(rarityColour); wchar_t formatted[256]; @@ -53,7 +53,7 @@ void RecordingItem::appendHoverText(std::shared_ptr itemInstance, unformattedStrings.push_back(recording); } -const Rarity *RecordingItem::getRarity(std::shared_ptr itemInstance) +const Rarity *RecordingItem::getRarity(shared_ptr itemInstance) { return (Rarity *)Rarity::rare; } diff --git a/Minecraft.World/RecordingItem.h b/Minecraft.World/RecordingItem.h index 5aba0b51..9b184c6a 100644 --- a/Minecraft.World/RecordingItem.h +++ b/Minecraft.World/RecordingItem.h @@ -13,10 +13,10 @@ public: // 4J Stu - Was protected in Java, but the can't access it where we need //@Override Icon *getIcon(int auxValue); - virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual void appendHoverText(std::shared_ptr itemInstance, std::shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); - virtual const Rarity *getRarity(std::shared_ptr itemInstance); + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); + virtual const Rarity *getRarity(shared_ptr itemInstance); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/RedStoneItem.cpp b/Minecraft.World/RedStoneItem.cpp index f2769e92..64201caa 100644 --- a/Minecraft.World/RedStoneItem.cpp +++ b/Minecraft.World/RedStoneItem.cpp @@ -10,7 +10,7 @@ RedStoneItem::RedStoneItem(int id) : Item(id) { } -bool RedStoneItem::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool RedStoneItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed if (level->getTile(x, y, z) != Tile::topSnow_Id) @@ -27,7 +27,7 @@ bool RedStoneItem::useOn(std::shared_ptr itemInstance, std::shared if (Tile::redStoneDust->mayPlace(level, x, y, z)) { if(!bTestUseOnOnly) - { + { // 4J-JEV: Hook for durango 'BlockPlaced' event. player->awardStat(GenericStats::blocksPlaced(Tile::redStoneDust_Id), GenericStats::param_blocksPlaced(Tile::redStoneDust_Id,itemInstance->getAuxValue(),1)); diff --git a/Minecraft.World/RedStoneItem.h b/Minecraft.World/RedStoneItem.h index 13ee7f13..01be92ff 100644 --- a/Minecraft.World/RedStoneItem.h +++ b/Minecraft.World/RedStoneItem.h @@ -3,11 +3,11 @@ using namespace std; #include "Item.h" - class RedStoneItem : public Item + class RedStoneItem : public Item { public: RedStoneItem(int id); public: - virtual bool useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); }; \ No newline at end of file diff --git a/Minecraft.World/RedStoneOreTile.cpp b/Minecraft.World/RedStoneOreTile.cpp index f08cf9fa..9317ffdd 100644 --- a/Minecraft.World/RedStoneOreTile.cpp +++ b/Minecraft.World/RedStoneOreTile.cpp @@ -17,13 +17,13 @@ int RedStoneOreTile::getTickDelay() return 30; } -void RedStoneOreTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void RedStoneOreTile::attack(Level *level, int x, int y, int z, shared_ptr player) { interact(level, x, y, z); Tile::attack(level, x, y, z, player); } -void RedStoneOreTile::stepOn(Level *level, int x, int y, int z, std::shared_ptr entity) +void RedStoneOreTile::stepOn(Level *level, int x, int y, int z, shared_ptr entity) { interact(level, x, y, z); Tile::stepOn(level, x, y, z, entity); @@ -35,7 +35,7 @@ bool RedStoneOreTile::TestUse() return true; } -bool RedStoneOreTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool RedStoneOreTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if (soundOnly) return false; interact(level, x, y, z); @@ -122,7 +122,7 @@ bool RedStoneOreTile::shouldTileTick(Level *level, int x,int y,int z) return id == Tile::redStoneOre_lit_Id; } -std::shared_ptr RedStoneOreTile::getSilkTouchItemInstance(int data) +shared_ptr RedStoneOreTile::getSilkTouchItemInstance(int data) { - return std::shared_ptr(new ItemInstance(Tile::redStoneOre)); + return shared_ptr(new ItemInstance(Tile::redStoneOre)); } \ No newline at end of file diff --git a/Minecraft.World/RedStoneOreTile.h b/Minecraft.World/RedStoneOreTile.h index 3e96a228..bc1d48d7 100644 --- a/Minecraft.World/RedStoneOreTile.h +++ b/Minecraft.World/RedStoneOreTile.h @@ -11,10 +11,10 @@ private: public: RedStoneOreTile(int id, bool lit); virtual int getTickDelay(); - virtual void attack(Level *level, int x, int y, int z, std::shared_ptr player); - virtual void stepOn(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual void stepOn(Level *level, int x, int y, int z, shared_ptr entity); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param private: virtual void interact(Level *level, int x, int y, int z); public: @@ -24,11 +24,11 @@ public: virtual int getResourceCount(Random *random); virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); virtual void animateTick(Level *level, int x, int y, int z, Random *random); - + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); private: void poofParticles(Level *level, int x, int y, int z); protected: - virtual std::shared_ptr getSilkTouchItemInstance(int data); + virtual shared_ptr getSilkTouchItemInstance(int data); }; diff --git a/Minecraft.World/Region.cpp b/Minecraft.World/Region.cpp index fb7a62d5..4c3a454d 100644 --- a/Minecraft.World/Region.cpp +++ b/Minecraft.World/Region.cpp @@ -137,7 +137,7 @@ LevelChunk* Region::getLevelChunk(int x, int y, int z) -std::shared_ptr Region::getTileEntity(int x, int y, int z) +shared_ptr Region::getTileEntity(int x, int y, int z) { int xc = (x >> 4) - xc1; int zc = (z >> 4) - zc1; diff --git a/Minecraft.World/Region.h b/Minecraft.World/Region.h index fad828ee..0d200a35 100644 --- a/Minecraft.World/Region.h +++ b/Minecraft.World/Region.h @@ -23,7 +23,7 @@ public: virtual ~Region(); bool isAllEmpty(); int getTile(int x, int y, int z); - std::shared_ptr getTileEntity(int x, int y, int z); + shared_ptr getTileEntity(int x, int y, int z); float getBrightness(int x, int y, int z, int emitt); float getBrightness(int x, int y, int z); int getLightColor(int x, int y, int z, int emitt, int tileId = -1); // 4J - change brought forward from 1.8.2 diff --git a/Minecraft.World/RegionHillsLayer.cpp b/Minecraft.World/RegionHillsLayer.cpp index 63d284e2..a1e17524 100644 --- a/Minecraft.World/RegionHillsLayer.cpp +++ b/Minecraft.World/RegionHillsLayer.cpp @@ -3,7 +3,7 @@ #include "IntCache.h" #include "RegionHillsLayer.h" -RegionHillsLayer::RegionHillsLayer(int64_t seed, std::shared_ptr parent) : Layer(seed) +RegionHillsLayer::RegionHillsLayer(int64_t seed, shared_ptr parent) : Layer(seed) { this->parent = parent; } diff --git a/Minecraft.World/RegionHillsLayer.h b/Minecraft.World/RegionHillsLayer.h index 23a63abc..5ad0bb75 100644 --- a/Minecraft.World/RegionHillsLayer.h +++ b/Minecraft.World/RegionHillsLayer.h @@ -5,7 +5,7 @@ class RegionHillsLayer : public Layer { public: - RegionHillsLayer(int64_t seed, std::shared_ptr parent); + RegionHillsLayer(int64_t seed, shared_ptr parent); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/RemoveEntitiesPacket.h b/Minecraft.World/RemoveEntitiesPacket.h index f6626d56..2e734e71 100644 --- a/Minecraft.World/RemoveEntitiesPacket.h +++ b/Minecraft.World/RemoveEntitiesPacket.h @@ -21,7 +21,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new RemoveEntitiesPacket()); } + static shared_ptr create() { return shared_ptr(new RemoveEntitiesPacket()); } virtual int getId() { return 29; } }; diff --git a/Minecraft.World/RemoveMobEffectPacket.h b/Minecraft.World/RemoveMobEffectPacket.h index ade1ed1b..d69a4ed4 100644 --- a/Minecraft.World/RemoveMobEffectPacket.h +++ b/Minecraft.World/RemoveMobEffectPacket.h @@ -18,6 +18,6 @@ class RemoveMobEffectPacket : public Packet, public enable_shared_from_this create() { return std::shared_ptr(new RemoveMobEffectPacket()); } + static shared_ptr create() { return shared_ptr(new RemoveMobEffectPacket()); } virtual int getId() { return 42; } }; \ No newline at end of file diff --git a/Minecraft.World/RepairMenu.cpp b/Minecraft.World/RepairMenu.cpp index c254eb21..d246b73f 100644 --- a/Minecraft.World/RepairMenu.cpp +++ b/Minecraft.World/RepairMenu.cpp @@ -6,10 +6,10 @@ #include "net.minecraft.world.item.enchantment.h" #include "RepairMenu.h" -RepairMenu::RepairMenu(std::shared_ptr inventory, Level *level, int xt, int yt, int zt, std::shared_ptr player) +RepairMenu::RepairMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt, shared_ptr player) { - resultSlots = std::shared_ptr( new ResultContainer() ); - repairSlots = std::shared_ptr( new RepairContainer(this,IDS_REPAIR_AND_NAME, 2) ); + resultSlots = shared_ptr( new ResultContainer() ); + repairSlots = shared_ptr( new RepairContainer(this,IDS_REPAIR_AND_NAME, 2) ); cost = 0; repairItemCountCost = 0; @@ -38,7 +38,7 @@ RepairMenu::RepairMenu(std::shared_ptr inventory, Level *level, int x } } -void RepairMenu::slotsChanged(std::shared_ptr container) +void RepairMenu::slotsChanged(shared_ptr container) { AbstractContainerMenu::slotsChanged(); @@ -47,7 +47,7 @@ void RepairMenu::slotsChanged(std::shared_ptr container) void RepairMenu::createResult() { - std::shared_ptr input = repairSlots->getItem(INPUT_SLOT); + shared_ptr input = repairSlots->getItem(INPUT_SLOT); cost = 0; int price = 0; int tax = 0; @@ -63,8 +63,8 @@ void RepairMenu::createResult() } else { - std::shared_ptr result = input->copy(); - std::shared_ptr addition = repairSlots->getItem(ADDITIONAL_SLOT); + shared_ptr result = input->copy(); + shared_ptr addition = repairSlots->getItem(ADDITIONAL_SLOT); unordered_map *enchantments = EnchantmentHelper::getEnchantments(result); bool usingBook = false; @@ -319,14 +319,14 @@ void RepairMenu::setData(int id, int value) if (id == DATA_TOTAL_COST) cost = value; } -void RepairMenu::removed(std::shared_ptr player) +void RepairMenu::removed(shared_ptr player) { AbstractContainerMenu::removed(player); if (level->isClientSide) return; for (int i = 0; i < repairSlots->getContainerSize(); i++) { - std::shared_ptr item = repairSlots->removeItemNoUpdate(i); + shared_ptr item = repairSlots->removeItemNoUpdate(i); if (item != NULL) { player->drop(item); @@ -334,20 +334,20 @@ void RepairMenu::removed(std::shared_ptr player) } } -bool RepairMenu::stillValid(std::shared_ptr player) +bool RepairMenu::stillValid(shared_ptr player) { if (level->getTile(x, y, z) != Tile::anvil_Id) return false; if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; return true; } -std::shared_ptr RepairMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr RepairMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = slots->at(slotIndex); if (slot != NULL && slot->hasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if (slotIndex == RESULT_SLOT) diff --git a/Minecraft.World/RepairMenu.h b/Minecraft.World/RepairMenu.h index acd7dc37..e0c90267 100644 --- a/Minecraft.World/RepairMenu.h +++ b/Minecraft.World/RepairMenu.h @@ -22,10 +22,10 @@ public: static const int DATA_TOTAL_COST = 0; private: - std::shared_ptr resultSlots; + shared_ptr resultSlots; // 4J Stu - anonymous class here now RepairContainer - std::shared_ptr repairSlots; + shared_ptr repairSlots; Level *level; int x, y, z; @@ -36,20 +36,20 @@ public: private: int repairItemCountCost; wstring itemName; - std::shared_ptr player; + shared_ptr player; public: using AbstractContainerMenu::slotsChanged; - RepairMenu(std::shared_ptr inventory, Level *level, int xt, int yt, int zt, std::shared_ptr player); + RepairMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt, shared_ptr player); - void slotsChanged(std::shared_ptr container); + void slotsChanged(shared_ptr container); void createResult(); void sendData(int id, int value); void addSlotListener(ContainerListener *listener); void setData(int id, int value); - void removed(std::shared_ptr player); - bool stillValid(std::shared_ptr player); - std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); + void removed(shared_ptr player); + bool stillValid(shared_ptr player); + shared_ptr quickMoveStack(shared_ptr player, int slotIndex); void setItemName(const wstring &name); }; diff --git a/Minecraft.World/RepairResultSlot.cpp b/Minecraft.World/RepairResultSlot.cpp index 651cd3a1..041a64a7 100644 --- a/Minecraft.World/RepairResultSlot.cpp +++ b/Minecraft.World/RepairResultSlot.cpp @@ -5,7 +5,7 @@ #include "net.minecraft.world.entity.player.h" #include "RepairResultSlot.h" -RepairResultSlot::RepairResultSlot(RepairMenu *menu, int xt, int yt, int zt, std::shared_ptr container, int slot, int x, int y) : Slot(container, slot, x, y) +RepairResultSlot::RepairResultSlot(RepairMenu *menu, int xt, int yt, int zt, shared_ptr container, int slot, int x, int y) : Slot(container, slot, x, y) { m_menu = menu; this->xt = xt; @@ -13,23 +13,23 @@ RepairResultSlot::RepairResultSlot(RepairMenu *menu, int xt, int yt, int zt, std this->zt = zt; } -bool RepairResultSlot::mayPlace(std::shared_ptr item) +bool RepairResultSlot::mayPlace(shared_ptr item) { return false; } -bool RepairResultSlot::mayPickup(std::shared_ptr player) +bool RepairResultSlot::mayPickup(shared_ptr player) { return (player->abilities.instabuild || player->experienceLevel >= m_menu->cost) && (m_menu->cost > 0 && hasItem()); } -void RepairResultSlot::onTake(std::shared_ptr player, std::shared_ptr carried) +void RepairResultSlot::onTake(shared_ptr player, shared_ptr carried) { if (!player->abilities.instabuild) player->withdrawExperienceLevels(m_menu->cost); m_menu->repairSlots->setItem(RepairMenu::INPUT_SLOT, nullptr); if (m_menu->repairItemCountCost > 0) { - std::shared_ptr addition = m_menu->repairSlots->getItem(RepairMenu::ADDITIONAL_SLOT); + shared_ptr addition = m_menu->repairSlots->getItem(RepairMenu::ADDITIONAL_SLOT); if (addition != NULL && addition->count > m_menu->repairItemCountCost) { addition->count -= m_menu->repairItemCountCost; @@ -69,7 +69,7 @@ void RepairResultSlot::onTake(std::shared_ptr player, std::shared_ptr second) +bool RepairResultSlot::mayCombine(shared_ptr second) { return false; } \ No newline at end of file diff --git a/Minecraft.World/RepairResultSlot.h b/Minecraft.World/RepairResultSlot.h index 92af20fe..1895ca30 100644 --- a/Minecraft.World/RepairResultSlot.h +++ b/Minecraft.World/RepairResultSlot.h @@ -11,10 +11,10 @@ private: int xt, yt, zt; public: - RepairResultSlot(RepairMenu *menu, int xt, int yt, int zt, std::shared_ptr container, int slot, int x, int y); + RepairResultSlot(RepairMenu *menu, int xt, int yt, int zt, shared_ptr container, int slot, int x, int y); - bool mayPlace(std::shared_ptr item); - bool mayPickup(std::shared_ptr player); - void onTake(std::shared_ptr player, std::shared_ptr carried); - virtual bool mayCombine(std::shared_ptr item); // 4J Added + bool mayPlace(shared_ptr item); + bool mayPickup(shared_ptr player); + void onTake(shared_ptr player, shared_ptr carried); + virtual bool mayCombine(shared_ptr item); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/RespawnPacket.h b/Minecraft.World/RespawnPacket.h index e8af00b0..3caf1ee3 100644 --- a/Minecraft.World/RespawnPacket.h +++ b/Minecraft.World/RespawnPacket.h @@ -29,6 +29,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new RespawnPacket()); } + static shared_ptr create() { return shared_ptr(new RespawnPacket()); } virtual int getId() { return 9; } }; diff --git a/Minecraft.World/RestrictOpenDoorGoal.cpp b/Minecraft.World/RestrictOpenDoorGoal.cpp index 2849aabc..e8620a71 100644 --- a/Minecraft.World/RestrictOpenDoorGoal.cpp +++ b/Minecraft.World/RestrictOpenDoorGoal.cpp @@ -13,9 +13,9 @@ RestrictOpenDoorGoal::RestrictOpenDoorGoal(PathfinderMob *mob) bool RestrictOpenDoorGoal::canUse() { if (mob->level->isDay()) return false; - std::shared_ptr village = mob->level->villages->getClosestVillage(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z), 16); + shared_ptr village = mob->level->villages->getClosestVillage(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z), 16); if (village == NULL) return false; - std::shared_ptr _doorInfo = village->getClosestDoorInfo(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z)); + shared_ptr _doorInfo = village->getClosestDoorInfo(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z)); if (_doorInfo == NULL) return false; doorInfo = _doorInfo; return _doorInfo->distanceToInsideSqr(Mth::floor(mob->x), Mth::floor(mob->y), Mth::floor(mob->z)) < 1.5 * 1.5; @@ -24,7 +24,7 @@ bool RestrictOpenDoorGoal::canUse() bool RestrictOpenDoorGoal::canContinueToUse() { if (mob->level->isDay()) return false; - std::shared_ptr _doorInfo = doorInfo.lock(); + shared_ptr _doorInfo = doorInfo.lock(); if ( _doorInfo == NULL ) return false; return !_doorInfo->removed && _doorInfo->isInsideSide(Mth::floor(mob->x), Mth::floor(mob->z)); } @@ -44,6 +44,6 @@ void RestrictOpenDoorGoal::stop() void RestrictOpenDoorGoal::tick() { - std::shared_ptr _doorInfo = doorInfo.lock(); + shared_ptr _doorInfo = doorInfo.lock(); if ( _doorInfo ) _doorInfo->incBookingCount(); } \ No newline at end of file diff --git a/Minecraft.World/ResultContainer.cpp b/Minecraft.World/ResultContainer.cpp index 782c2aa8..c28b3cf3 100644 --- a/Minecraft.World/ResultContainer.cpp +++ b/Minecraft.World/ResultContainer.cpp @@ -12,7 +12,7 @@ unsigned int ResultContainer::getContainerSize() return 1; } -std::shared_ptr ResultContainer::getItem(unsigned int slot) +shared_ptr ResultContainer::getItem(unsigned int slot) { return (*items)[0]; } @@ -22,29 +22,29 @@ int ResultContainer::getName() return 0; } -std::shared_ptr ResultContainer::removeItem(unsigned int slot, int count) +shared_ptr ResultContainer::removeItem(unsigned int slot, int count) { if ((*items)[0] != NULL) { - std::shared_ptr item = (*items)[0]; + shared_ptr item = (*items)[0]; (*items)[0] = nullptr; return item; } return nullptr; } -std::shared_ptr ResultContainer::removeItemNoUpdate(int slot) +shared_ptr ResultContainer::removeItemNoUpdate(int slot) { if ((*items)[0] != NULL) { - std::shared_ptr item = (*items)[0]; + shared_ptr item = (*items)[0]; (*items)[0] = nullptr; return item; } return nullptr; } -void ResultContainer::setItem(unsigned int slot, std::shared_ptr item) +void ResultContainer::setItem(unsigned int slot, shared_ptr item) { (*items)[0] = item; } @@ -58,7 +58,7 @@ void ResultContainer::setChanged() { } -bool ResultContainer::stillValid(std::shared_ptr player) +bool ResultContainer::stillValid(shared_ptr player) { return true; } \ No newline at end of file diff --git a/Minecraft.World/ResultContainer.h b/Minecraft.World/ResultContainer.h index 1b030d81..62df65d8 100644 --- a/Minecraft.World/ResultContainer.h +++ b/Minecraft.World/ResultContainer.h @@ -12,14 +12,14 @@ public: ResultContainer(); virtual unsigned int getContainerSize(); - virtual std::shared_ptr getItem(unsigned int slot); + virtual shared_ptr getItem(unsigned int slot); virtual int getName(); - virtual std::shared_ptr removeItem(unsigned int slot, int count); - virtual std::shared_ptr removeItemNoUpdate(int slot); - virtual void setItem(unsigned int slot, std::shared_ptr item); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); virtual int getMaxStackSize(); virtual void setChanged(); - virtual bool stillValid(std::shared_ptr player); + virtual bool stillValid(shared_ptr player); void startOpen() { } // TODO Auto-generated method stub void stopOpen() { } // TODO Auto-generated method stub diff --git a/Minecraft.World/ResultSlot.cpp b/Minecraft.World/ResultSlot.cpp index d44083c7..b79329af 100644 --- a/Minecraft.World/ResultSlot.cpp +++ b/Minecraft.World/ResultSlot.cpp @@ -6,19 +6,19 @@ #include "net.minecraft.world.level.tile.h" #include "ResultSlot.h" -ResultSlot::ResultSlot(Player *player, std::shared_ptr craftSlots, std::shared_ptr container, int id, int x, int y) : Slot( container, id, x, y ) +ResultSlot::ResultSlot(Player *player, shared_ptr craftSlots, shared_ptr container, int id, int x, int y) : Slot( container, id, x, y ) { this->player = player; this->craftSlots = craftSlots; removeCount = 0; } -bool ResultSlot::mayPlace(std::shared_ptr item) +bool ResultSlot::mayPlace(shared_ptr item) { return false; } -std::shared_ptr ResultSlot::remove(int c) +shared_ptr ResultSlot::remove(int c) { if (hasItem()) { @@ -27,13 +27,13 @@ std::shared_ptr ResultSlot::remove(int c) return Slot::remove(c); } -void ResultSlot::onQuickCraft(std::shared_ptr picked, int count) +void ResultSlot::onQuickCraft(shared_ptr picked, int count) { removeCount += count; checkTakeAchievements(picked); } -void ResultSlot::checkTakeAchievements(std::shared_ptr carried) +void ResultSlot::checkTakeAchievements(shared_ptr carried) { carried->onCraftedBy(player->level, dynamic_pointer_cast( player->shared_from_this() ), removeCount); removeCount = 0; @@ -49,17 +49,17 @@ void ResultSlot::checkTakeAchievements(std::shared_ptr carried) //else if (carried->id == Tile::enchantTable_Id) player->awardStat(GenericStats::enchantments(), GenericStats::param_achievement(eAward_)); else if (carried->id == Tile::bookshelf_Id) player->awardStat(GenericStats::bookcase(), GenericStats::param_bookcase()); - // 4J : WESTY : Added new acheivements. + // 4J : WESTY : Added new acheivements. else if (carried->id == Tile::dispenser_Id) player->awardStat(GenericStats::dispenseWithThis(), GenericStats::param_dispenseWithThis()); } -void ResultSlot::onTake(std::shared_ptr player, std::shared_ptr carried) +void ResultSlot::onTake(shared_ptr player, shared_ptr carried) { checkTakeAchievements(carried); for (unsigned int i = 0; i < craftSlots->getContainerSize(); i++) { - std::shared_ptr item = craftSlots->getItem(i); + shared_ptr item = craftSlots->getItem(i); if (item != NULL) { craftSlots->removeItem(i, 1); @@ -68,7 +68,7 @@ void ResultSlot::onTake(std::shared_ptr player, std::shared_ptr craftResult = std::shared_ptr(new ItemInstance(item->getItem()->getCraftingRemainingItem())); + shared_ptr craftResult = shared_ptr(new ItemInstance(item->getItem()->getCraftingRemainingItem())); /* * Try to place this in the player's inventory (See we.java @@ -96,7 +96,7 @@ void ResultSlot::onTake(std::shared_ptr player, std::shared_ptr second) +bool ResultSlot::mayCombine(shared_ptr second) { return false; } diff --git a/Minecraft.World/ResultSlot.h b/Minecraft.World/ResultSlot.h index b8308f66..28e464f0 100644 --- a/Minecraft.World/ResultSlot.h +++ b/Minecraft.World/ResultSlot.h @@ -5,22 +5,22 @@ class ResultSlot : public Slot { private: - std::shared_ptr craftSlots; - Player *player; // This can't be a std::shared_ptr, as we create a result slot in the inventorymenu in the Player ctor + shared_ptr craftSlots; + Player *player; // This can't be a shared_ptr, as we create a result slot in the inventorymenu in the Player ctor int removeCount; public: - ResultSlot(Player *player, std::shared_ptr craftSlots, std::shared_ptr container, int id, int x, int y); + ResultSlot(Player *player, shared_ptr craftSlots, shared_ptr container, int id, int x, int y); virtual ~ResultSlot() {} - virtual bool mayPlace(std::shared_ptr item); - virtual std::shared_ptr remove(int c); + virtual bool mayPlace(shared_ptr item); + virtual shared_ptr remove(int c); protected: - virtual void onQuickCraft(std::shared_ptr picked, int count); - virtual void checkTakeAchievements(std::shared_ptr carried); + virtual void onQuickCraft(shared_ptr picked, int count); + virtual void checkTakeAchievements(shared_ptr carried); public: - virtual void onTake(std::shared_ptr player, std::shared_ptr carried); - virtual bool mayCombine(std::shared_ptr item); // 4J Added + virtual void onTake(shared_ptr player, shared_ptr carried); + virtual bool mayCombine(shared_ptr item); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/RiverInitLayer.cpp b/Minecraft.World/RiverInitLayer.cpp index 33afa47d..86110e13 100644 --- a/Minecraft.World/RiverInitLayer.cpp +++ b/Minecraft.World/RiverInitLayer.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.level.newbiome.layer.h" -RiverInitLayer::RiverInitLayer(int64_t seed, std::shared_ptrparent) : Layer(seed) +RiverInitLayer::RiverInitLayer(int64_t seed, shared_ptrparent) : Layer(seed) { this->parent = parent; } diff --git a/Minecraft.World/RiverInitLayer.h b/Minecraft.World/RiverInitLayer.h index 7c9e8ef8..bc8dca1b 100644 --- a/Minecraft.World/RiverInitLayer.h +++ b/Minecraft.World/RiverInitLayer.h @@ -5,7 +5,7 @@ class RiverInitLayer : public Layer { public: - RiverInitLayer(int64_t seed, std::shared_ptrparent); + RiverInitLayer(int64_t seed, shared_ptrparent); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/RiverLayer.cpp b/Minecraft.World/RiverLayer.cpp index 09880f00..14cf3142 100644 --- a/Minecraft.World/RiverLayer.cpp +++ b/Minecraft.World/RiverLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.newbiome.layer.h" -RiverLayer::RiverLayer(int64_t seedMixup, std::shared_ptrparent) : Layer(seedMixup) +RiverLayer::RiverLayer(int64_t seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/RiverLayer.h b/Minecraft.World/RiverLayer.h index 3e2db6af..a76d3fab 100644 --- a/Minecraft.World/RiverLayer.h +++ b/Minecraft.World/RiverLayer.h @@ -5,6 +5,6 @@ class RiverLayer : public Layer { public: - RiverLayer(int64_t seedMixup, std::shared_ptrparent); + RiverLayer(int64_t seedMixup, shared_ptrparent); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/RiverMixerLayer.cpp b/Minecraft.World/RiverMixerLayer.cpp index 935832a6..4de49245 100644 --- a/Minecraft.World/RiverMixerLayer.cpp +++ b/Minecraft.World/RiverMixerLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.newbiome.layer.h" -RiverMixerLayer::RiverMixerLayer(int64_t seed, std::shared_ptrbiomes, std::shared_ptrrivers) : Layer(seed) +RiverMixerLayer::RiverMixerLayer(int64_t seed, shared_ptrbiomes, shared_ptrrivers) : Layer(seed) { this->biomes = biomes; this->rivers = rivers; diff --git a/Minecraft.World/RiverMixerLayer.h b/Minecraft.World/RiverMixerLayer.h index 4cad36a3..3a069c41 100644 --- a/Minecraft.World/RiverMixerLayer.h +++ b/Minecraft.World/RiverMixerLayer.h @@ -5,11 +5,11 @@ class RiverMixerLayer : public Layer { private: - std::shared_ptrbiomes; - std::shared_ptrrivers; + shared_ptrbiomes; + shared_ptrrivers; public: - RiverMixerLayer(int64_t seed, std::shared_ptrbiomes, std::shared_ptrrivers); + RiverMixerLayer(int64_t seed, shared_ptrbiomes, shared_ptrrivers); virtual void init(int64_t seed); virtual intArray getArea(int xo, int yo, int w, int h); diff --git a/Minecraft.World/RotateHeadPacket.cpp b/Minecraft.World/RotateHeadPacket.cpp index 46d48a99..a0cd02d7 100644 --- a/Minecraft.World/RotateHeadPacket.cpp +++ b/Minecraft.World/RotateHeadPacket.cpp @@ -39,9 +39,9 @@ bool RotateHeadPacket::canBeInvalidated() return true; } -bool RotateHeadPacket::isInvalidatedBy(std::shared_ptr packet) +bool RotateHeadPacket::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target->id == id; } diff --git a/Minecraft.World/RotateHeadPacket.h b/Minecraft.World/RotateHeadPacket.h index 78bd7a16..19ccf97f 100644 --- a/Minecraft.World/RotateHeadPacket.h +++ b/Minecraft.World/RotateHeadPacket.h @@ -18,10 +18,10 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); virtual bool isAync(); public: - static std::shared_ptr create() { return std::shared_ptr(new RotateHeadPacket()); } + static shared_ptr create() { return shared_ptr(new RotateHeadPacket()); } virtual int getId() { return 35; } }; \ No newline at end of file diff --git a/Minecraft.World/SaddleItem.cpp b/Minecraft.World/SaddleItem.cpp index 1f9c580d..0effeb53 100644 --- a/Minecraft.World/SaddleItem.cpp +++ b/Minecraft.World/SaddleItem.cpp @@ -9,12 +9,12 @@ SaddleItem::SaddleItem(int id) : Item(id) maxStackSize = 1; } -bool SaddleItem::interactEnemy(std::shared_ptr itemInstance, std::shared_ptr mob) +bool SaddleItem::interactEnemy(shared_ptr itemInstance, shared_ptr mob) { if ( dynamic_pointer_cast(mob) ) { - std::shared_ptr pig = dynamic_pointer_cast(mob); - if (!pig->hasSaddle() && !pig->isBaby()) + shared_ptr pig = dynamic_pointer_cast(mob); + if (!pig->hasSaddle() && !pig->isBaby()) { pig->setSaddle(true); itemInstance->count--; @@ -24,7 +24,7 @@ bool SaddleItem::interactEnemy(std::shared_ptr itemInstance, std:: return false; } -bool SaddleItem::hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker) +bool SaddleItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { interactEnemy(itemInstance, mob); return true; diff --git a/Minecraft.World/SaddleItem.h b/Minecraft.World/SaddleItem.h index de65ff50..129922db 100644 --- a/Minecraft.World/SaddleItem.h +++ b/Minecraft.World/SaddleItem.h @@ -8,6 +8,6 @@ class SaddleItem : public Item public: SaddleItem(int id); - virtual bool interactEnemy(std::shared_ptr itemInstance, std::shared_ptr mob); - virtual bool hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker); + virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr mob); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); }; \ No newline at end of file diff --git a/Minecraft.World/SaplingTileItem.cpp b/Minecraft.World/SaplingTileItem.cpp index 000955a1..c88275f3 100644 --- a/Minecraft.World/SaplingTileItem.cpp +++ b/Minecraft.World/SaplingTileItem.cpp @@ -9,18 +9,18 @@ SaplingTileItem::SaplingTileItem(int id) : TileItem(id) setStackedByData(true); } -int SaplingTileItem::getLevelDataForAuxValue(int auxValue) +int SaplingTileItem::getLevelDataForAuxValue(int auxValue) { return auxValue; } -Icon *SaplingTileItem::getIcon(int itemAuxValue) +Icon *SaplingTileItem::getIcon(int itemAuxValue) { return Tile::sapling->getTexture(0, itemAuxValue); } // 4J brought forward to have unique names for different sapling types -unsigned int SaplingTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int SaplingTileItem::getDescriptionId(shared_ptr instance) { int auxValue = instance->getAuxValue(); if (auxValue < 0 || auxValue >= Sapling::SAPLING_NAMES_SIZE) diff --git a/Minecraft.World/SaplingTileItem.h b/Minecraft.World/SaplingTileItem.h index feabb0de..f0b03cc4 100644 --- a/Minecraft.World/SaplingTileItem.h +++ b/Minecraft.World/SaplingTileItem.h @@ -12,5 +12,5 @@ public: virtual Icon *getIcon(int itemAuxValue); // 4J brought forward to have unique names for different sapling types - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; \ No newline at end of file diff --git a/Minecraft.World/SavedDataStorage.cpp b/Minecraft.World/SavedDataStorage.cpp index 67b15c51..cacfa688 100644 --- a/Minecraft.World/SavedDataStorage.cpp +++ b/Minecraft.World/SavedDataStorage.cpp @@ -8,11 +8,11 @@ #include "ConsoleSaveFileIO.h" -SavedDataStorage::SavedDataStorage(LevelStorage *levelStorage) +SavedDataStorage::SavedDataStorage(LevelStorage *levelStorage) { /* - cache = new unordered_map >; - savedDatas = new vector >; + cache = new unordered_map >; + savedDatas = new vector >; usedAuxIds = new unordered_map; */ @@ -20,28 +20,28 @@ SavedDataStorage::SavedDataStorage(LevelStorage *levelStorage) loadAuxValues(); } -std::shared_ptr SavedDataStorage::get(const type_info& clazz, const wstring& id) +shared_ptr SavedDataStorage::get(const type_info& clazz, const wstring& id) { AUTO_VAR(it, cache.find( id )); if (it != cache.end()) return (*it).second; - std::shared_ptr data = nullptr; + shared_ptr data = nullptr; if (levelStorage != NULL) { //File file = levelStorage->getDataFile(id); ConsoleSavePath file = levelStorage->getDataFile(id); - if (!file.getName().empty() && levelStorage->getSaveFile()->doesFileExist( file ) ) + if (!file.getName().empty() && levelStorage->getSaveFile()->doesFileExist( file ) ) { // mob = dynamic_pointer_cast(Mob::_class->newInstance( level )); //data = clazz.getConstructor(String.class).newInstance(id); if( clazz == typeid(MapItemSavedData) ) { - data = dynamic_pointer_cast( std::shared_ptr(new MapItemSavedData(id)) ); + data = dynamic_pointer_cast( shared_ptr(new MapItemSavedData(id)) ); } else if( clazz == typeid(Villages) ) { - data = dynamic_pointer_cast( std::shared_ptr(new Villages(id) ) ); + data = dynamic_pointer_cast( shared_ptr(new Villages(id) ) ); } else { @@ -59,13 +59,13 @@ std::shared_ptr SavedDataStorage::get(const type_info& clazz, const w if (data != NULL) { - cache.insert( unordered_map >::value_type( id , data ) ); + cache.insert( unordered_map >::value_type( id , data ) ); savedDatas.push_back(data); } return data; } -void SavedDataStorage::set(const wstring& id, std::shared_ptr data) +void SavedDataStorage::set(const wstring& id, shared_ptr data) { if (data == NULL) { @@ -91,7 +91,7 @@ void SavedDataStorage::save() AUTO_VAR(itEnd, savedDatas.end()); for (AUTO_VAR(it, savedDatas.begin()); it != itEnd; it++) { - std::shared_ptr data = *it; //savedDatas->at(i); + shared_ptr data = *it; //savedDatas->at(i); if (data->isDirty()) { save(data); @@ -100,7 +100,7 @@ void SavedDataStorage::save() } } -void SavedDataStorage::save(std::shared_ptr data) +void SavedDataStorage::save(shared_ptr data) { if (levelStorage == NULL) return; //File file = levelStorage->getDataFile(data->id); diff --git a/Minecraft.World/SavedDataStorage.h b/Minecraft.World/SavedDataStorage.h index 14d9776a..9a342ab6 100644 --- a/Minecraft.World/SavedDataStorage.h +++ b/Minecraft.World/SavedDataStorage.h @@ -4,27 +4,27 @@ using namespace std; class ConsoleSaveFile; #include "SavedData.h" -class SavedDataStorage +class SavedDataStorage { private: LevelStorage *levelStorage; - typedef unordered_map > cacheMapType; + typedef unordered_map > cacheMapType; cacheMapType cache; - vector > savedDatas; + vector > savedDatas; typedef unordered_map uaiMapType; uaiMapType usedAuxIds; public: SavedDataStorage(LevelStorage *); - std::shared_ptr get(const type_info& clazz, const wstring& id); - void set(const wstring& id, std::shared_ptr data); + shared_ptr get(const type_info& clazz, const wstring& id); + void set(const wstring& id, shared_ptr data); void save(); private: - void save(std::shared_ptr data); + void save(shared_ptr data); void loadAuxValues(); public: diff --git a/Minecraft.World/SeedFoodItem.cpp b/Minecraft.World/SeedFoodItem.cpp index d46b77c7..4ba9a14a 100644 --- a/Minecraft.World/SeedFoodItem.cpp +++ b/Minecraft.World/SeedFoodItem.cpp @@ -11,7 +11,7 @@ SeedFoodItem::SeedFoodItem(int id, int nutrition, float saturationMod, int resul } -bool SeedFoodItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool SeedFoodItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { if (face != Facing::UP) return false; diff --git a/Minecraft.World/SeedFoodItem.h b/Minecraft.World/SeedFoodItem.h index 0b9b79b5..fe24430f 100644 --- a/Minecraft.World/SeedFoodItem.h +++ b/Minecraft.World/SeedFoodItem.h @@ -11,5 +11,5 @@ private: public: SeedFoodItem(int id, int nutrition, float saturationMod, int resultId, int targetLand); - bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly); + bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly); }; \ No newline at end of file diff --git a/Minecraft.World/SeedItem.cpp b/Minecraft.World/SeedItem.cpp index 63fa9ac4..7a5ac1b8 100644 --- a/Minecraft.World/SeedItem.cpp +++ b/Minecraft.World/SeedItem.cpp @@ -14,7 +14,7 @@ SeedItem::SeedItem(int id, int resultId, int targetLand) : Item(id) this->targetLand = targetLand; } -bool SeedItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool SeedItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed if (face != 1) return false; @@ -23,7 +23,7 @@ bool SeedItem::useOn(std::shared_ptr instance, std::shared_ptrgetTile(x, y, z); - if (targetType == targetLand && level->isEmptyTile(x, y + 1, z)) + if (targetType == targetLand && level->isEmptyTile(x, y + 1, z)) { if(!bTestUseOnOnly) { diff --git a/Minecraft.World/SeedItem.h b/Minecraft.World/SeedItem.h index 820d9a8d..c16a76ce 100644 --- a/Minecraft.World/SeedItem.h +++ b/Minecraft.World/SeedItem.h @@ -3,7 +3,7 @@ using namespace std; #include "Item.h" -class SeedItem : public Item +class SeedItem : public Item { private: int resultId; @@ -12,5 +12,5 @@ private: public: SeedItem(int id, int resultId, int targetLand); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); }; \ No newline at end of file diff --git a/Minecraft.World/Sensing.cpp b/Minecraft.World/Sensing.cpp index f5d1cddc..d451f483 100644 --- a/Minecraft.World/Sensing.cpp +++ b/Minecraft.World/Sensing.cpp @@ -13,7 +13,7 @@ void Sensing::tick() unseen.clear(); } -bool Sensing::canSee(std::shared_ptr target) +bool Sensing::canSee(shared_ptr target) { //if ( find(seen.begin(), seen.end(), target) != seen.end() ) return true; //if ( find(unseen.begin(), unseen.end(), target) != unseen.end()) return false; diff --git a/Minecraft.World/Sensing.h b/Minecraft.World/Sensing.h index 844a3e60..d6428515 100644 --- a/Minecraft.World/Sensing.h +++ b/Minecraft.World/Sensing.h @@ -11,5 +11,5 @@ public: Sensing(Mob *mob); void tick(); - bool canSee(std::shared_ptr target); + bool canSee(shared_ptr target); }; \ No newline at end of file diff --git a/Minecraft.World/ServerSettingsChangedPacket.h b/Minecraft.World/ServerSettingsChangedPacket.h index b929348f..e6ab7356 100644 --- a/Minecraft.World/ServerSettingsChangedPacket.h +++ b/Minecraft.World/ServerSettingsChangedPacket.h @@ -26,6 +26,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new ServerSettingsChangedPacket()); } + static shared_ptr create() { return shared_ptr(new ServerSettingsChangedPacket()); } virtual int getId() { return 153; } }; \ No newline at end of file diff --git a/Minecraft.World/SetCarriedItemPacket.cpp b/Minecraft.World/SetCarriedItemPacket.cpp index f9fd8b08..2c640609 100644 --- a/Minecraft.World/SetCarriedItemPacket.cpp +++ b/Minecraft.World/SetCarriedItemPacket.cpp @@ -6,12 +6,12 @@ -SetCarriedItemPacket::SetCarriedItemPacket() +SetCarriedItemPacket::SetCarriedItemPacket() { slot = 0; } -SetCarriedItemPacket::SetCarriedItemPacket(int slot) +SetCarriedItemPacket::SetCarriedItemPacket(int slot) { this->slot = slot; } @@ -21,27 +21,27 @@ void SetCarriedItemPacket::read(DataInputStream *dis) //throws IOException slot = dis->readShort(); } -void SetCarriedItemPacket::write(DataOutputStream *dos) //throws IOException +void SetCarriedItemPacket::write(DataOutputStream *dos) //throws IOException { dos->writeShort(slot); } -void SetCarriedItemPacket::handle(PacketListener *listener) +void SetCarriedItemPacket::handle(PacketListener *listener) { listener->handleSetCarriedItem(shared_from_this()); } -int SetCarriedItemPacket::getEstimatedSize() +int SetCarriedItemPacket::getEstimatedSize() { return 2; } -bool SetCarriedItemPacket::canBeInvalidated() +bool SetCarriedItemPacket::canBeInvalidated() { return true; } -bool SetCarriedItemPacket::isInvalidatedBy(std::shared_ptr packet) +bool SetCarriedItemPacket::isInvalidatedBy(shared_ptr packet) { return true; } \ No newline at end of file diff --git a/Minecraft.World/SetCarriedItemPacket.h b/Minecraft.World/SetCarriedItemPacket.h index d9b6c94a..06fb3c30 100644 --- a/Minecraft.World/SetCarriedItemPacket.h +++ b/Minecraft.World/SetCarriedItemPacket.h @@ -16,9 +16,9 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new SetCarriedItemPacket()); } + static shared_ptr create() { return shared_ptr(new SetCarriedItemPacket()); } virtual int getId() { return 16; } }; \ No newline at end of file diff --git a/Minecraft.World/SetCreativeModeSlotPacket.cpp b/Minecraft.World/SetCreativeModeSlotPacket.cpp index d650327b..17e36b37 100644 --- a/Minecraft.World/SetCreativeModeSlotPacket.cpp +++ b/Minecraft.World/SetCreativeModeSlotPacket.cpp @@ -11,11 +11,11 @@ SetCreativeModeSlotPacket::SetCreativeModeSlotPacket() this->item = nullptr; } -SetCreativeModeSlotPacket::SetCreativeModeSlotPacket(int slotNum, std::shared_ptr item) +SetCreativeModeSlotPacket::SetCreativeModeSlotPacket(int slotNum, shared_ptr item) { this->slotNum = slotNum; // 4J - take copy of item as we want our packets to have full ownership of any referenced data - this->item = item ? item->copy() : std::shared_ptr(); + this->item = item ? item->copy() : shared_ptr(); } void SetCreativeModeSlotPacket::handle(PacketListener *listener) diff --git a/Minecraft.World/SetCreativeModeSlotPacket.h b/Minecraft.World/SetCreativeModeSlotPacket.h index ca46bf98..94ae7807 100644 --- a/Minecraft.World/SetCreativeModeSlotPacket.h +++ b/Minecraft.World/SetCreativeModeSlotPacket.h @@ -6,10 +6,10 @@ class SetCreativeModeSlotPacket : public Packet, public enable_shared_from_this< { public: int slotNum; - std::shared_ptr item; + shared_ptr item; SetCreativeModeSlotPacket(); - SetCreativeModeSlotPacket(int slotNum, std::shared_ptr item); + SetCreativeModeSlotPacket(int slotNum, shared_ptr item); virtual void handle(PacketListener *listener); virtual void read(DataInputStream *dis); @@ -18,6 +18,6 @@ class SetCreativeModeSlotPacket : public Packet, public enable_shared_from_this< public: - static std::shared_ptr create() { return std::shared_ptr(new SetCreativeModeSlotPacket()); } + static shared_ptr create() { return shared_ptr(new SetCreativeModeSlotPacket()); } virtual int getId() { return 107; } }; \ No newline at end of file diff --git a/Minecraft.World/SetEntityDataPacket.cpp b/Minecraft.World/SetEntityDataPacket.cpp index 6384200e..1538c152 100644 --- a/Minecraft.World/SetEntityDataPacket.cpp +++ b/Minecraft.World/SetEntityDataPacket.cpp @@ -7,7 +7,7 @@ -SetEntityDataPacket::SetEntityDataPacket() +SetEntityDataPacket::SetEntityDataPacket() { id = -1; packedItems = NULL; @@ -18,7 +18,7 @@ SetEntityDataPacket::~SetEntityDataPacket() delete packedItems; } -SetEntityDataPacket::SetEntityDataPacket(int id, std::shared_ptr entityData, bool notJustDirty) +SetEntityDataPacket::SetEntityDataPacket(int id, shared_ptr entityData, bool notJustDirty) { this->id = id; if(notJustDirty) @@ -37,7 +37,7 @@ void SetEntityDataPacket::read(DataInputStream *dis) //throws IOException packedItems = SynchedEntityData::unpack(dis); } -void SetEntityDataPacket::write(DataOutputStream *dos) //throws IOException +void SetEntityDataPacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(id); SynchedEntityData::pack(packedItems, dos); @@ -48,7 +48,7 @@ void SetEntityDataPacket::handle(PacketListener *listener) listener->handleSetEntityData(shared_from_this()); } -int SetEntityDataPacket::getEstimatedSize() +int SetEntityDataPacket::getEstimatedSize() { return 5; } @@ -58,7 +58,7 @@ bool SetEntityDataPacket::isAync() return true; } -vector > *SetEntityDataPacket::getUnpackedData() +vector > *SetEntityDataPacket::getUnpackedData() { return packedItems; } diff --git a/Minecraft.World/SetEntityDataPacket.h b/Minecraft.World/SetEntityDataPacket.h index 6978aac4..1b31aa4c 100644 --- a/Minecraft.World/SetEntityDataPacket.h +++ b/Minecraft.World/SetEntityDataPacket.h @@ -10,12 +10,12 @@ public: int id; private: - vector > *packedItems; + vector > *packedItems; public: SetEntityDataPacket(); ~SetEntityDataPacket(); - SetEntityDataPacket(int id, std::shared_ptr, bool notJustDirty); + SetEntityDataPacket(int id, shared_ptr, bool notJustDirty); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); @@ -23,9 +23,9 @@ public: virtual int getEstimatedSize(); virtual bool isAync(); - vector > *getUnpackedData(); + vector > *getUnpackedData(); public: - static std::shared_ptr create() { return std::shared_ptr(new SetEntityDataPacket()); } + static shared_ptr create() { return shared_ptr(new SetEntityDataPacket()); } virtual int getId() { return 40; } }; \ No newline at end of file diff --git a/Minecraft.World/SetEntityMotionPacket.cpp b/Minecraft.World/SetEntityMotionPacket.cpp index 49dd7d6b..a0749b74 100644 --- a/Minecraft.World/SetEntityMotionPacket.cpp +++ b/Minecraft.World/SetEntityMotionPacket.cpp @@ -32,22 +32,22 @@ void SetEntityMotionPacket::_init(int id, double xd, double yd, double zd) } } -SetEntityMotionPacket::SetEntityMotionPacket() +SetEntityMotionPacket::SetEntityMotionPacket() { _init(0, 0.0f, 0.0f, 0.0f); } -SetEntityMotionPacket::SetEntityMotionPacket(std::shared_ptr e) +SetEntityMotionPacket::SetEntityMotionPacket(shared_ptr e) { _init(e->entityId, e->xd, e->yd, e->zd); } SetEntityMotionPacket::SetEntityMotionPacket(int id, double xd, double yd, double zd) { - _init(id, xd, yd, zd); + _init(id, xd, yd, zd); } -void SetEntityMotionPacket::read(DataInputStream *dis) //throws IOException +void SetEntityMotionPacket::read(DataInputStream *dis) //throws IOException { short idAndFlag = dis->readShort(); id = idAndFlag & 0x07ff; @@ -73,7 +73,7 @@ void SetEntityMotionPacket::read(DataInputStream *dis) //throws IOException } } -void SetEntityMotionPacket::write(DataOutputStream *dos) //throws IOException +void SetEntityMotionPacket::write(DataOutputStream *dos) //throws IOException { if( useBytes ) { @@ -106,8 +106,8 @@ bool SetEntityMotionPacket::canBeInvalidated() return true; } -bool SetEntityMotionPacket::isInvalidatedBy(std::shared_ptr packet) +bool SetEntityMotionPacket::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target->id == id; } diff --git a/Minecraft.World/SetEntityMotionPacket.h b/Minecraft.World/SetEntityMotionPacket.h index ef9fefc5..00c019da 100644 --- a/Minecraft.World/SetEntityMotionPacket.h +++ b/Minecraft.World/SetEntityMotionPacket.h @@ -15,7 +15,7 @@ private: public: SetEntityMotionPacket(); - SetEntityMotionPacket(std::shared_ptr e); + SetEntityMotionPacket(shared_ptr e); SetEntityMotionPacket(int id, double xd, double yd, double zd); virtual void read(DataInputStream *dis); @@ -23,9 +23,9 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new SetEntityMotionPacket()); } + static shared_ptr create() { return shared_ptr(new SetEntityMotionPacket()); } virtual int getId() { return 28; } }; \ No newline at end of file diff --git a/Minecraft.World/SetEquippedItemPacket.cpp b/Minecraft.World/SetEquippedItemPacket.cpp index cbb71803..1da93b84 100644 --- a/Minecraft.World/SetEquippedItemPacket.cpp +++ b/Minecraft.World/SetEquippedItemPacket.cpp @@ -14,7 +14,7 @@ SetEquippedItemPacket::SetEquippedItemPacket() item = nullptr; } -SetEquippedItemPacket::SetEquippedItemPacket(int entity, int slot, std::shared_ptr item) +SetEquippedItemPacket::SetEquippedItemPacket(int entity, int slot, shared_ptr item) { this->entity = entity; this->slot = slot; @@ -23,7 +23,7 @@ SetEquippedItemPacket::SetEquippedItemPacket(int entity, int slot, std::shared_p this->item = item == NULL ? nullptr : item->copy(); } -void SetEquippedItemPacket::read(DataInputStream *dis) //throws IOException +void SetEquippedItemPacket::read(DataInputStream *dis) //throws IOException { entity = dis->readInt(); slot = dis->readShort(); @@ -32,7 +32,7 @@ void SetEquippedItemPacket::read(DataInputStream *dis) //throws IOException item = readItem(dis); } -void SetEquippedItemPacket::write(DataOutputStream *dos) //throws IOException +void SetEquippedItemPacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(entity); dos->writeShort(slot); @@ -41,7 +41,7 @@ void SetEquippedItemPacket::write(DataOutputStream *dos) //throws IOException writeItem(item, dos); } -void SetEquippedItemPacket::handle(PacketListener *listener) +void SetEquippedItemPacket::handle(PacketListener *listener) { listener->handleSetEquippedItem(shared_from_this()); } @@ -52,7 +52,7 @@ int SetEquippedItemPacket::getEstimatedSize() } // 4J Stu - Brought forward from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game -std::shared_ptr SetEquippedItemPacket::getItem() +shared_ptr SetEquippedItemPacket::getItem() { return item; } @@ -62,8 +62,8 @@ bool SetEquippedItemPacket::canBeInvalidated() return true; } -bool SetEquippedItemPacket::isInvalidatedBy(std::shared_ptr packet) +bool SetEquippedItemPacket::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target->entity == entity && target->slot == slot; } \ No newline at end of file diff --git a/Minecraft.World/SetEquippedItemPacket.h b/Minecraft.World/SetEquippedItemPacket.h index 9b907acc..def39120 100644 --- a/Minecraft.World/SetEquippedItemPacket.h +++ b/Minecraft.World/SetEquippedItemPacket.h @@ -11,23 +11,23 @@ public: private: // 4J Stu - Brought forward from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game - std::shared_ptr item; + shared_ptr item; public: SetEquippedItemPacket(); - SetEquippedItemPacket(int entity, int slot, std::shared_ptr item); + SetEquippedItemPacket(int entity, int slot, shared_ptr item); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); - + virtual bool isInvalidatedBy(shared_ptr packet); + // 4J Stu - Brought forward from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game - std::shared_ptr getItem(); + shared_ptr getItem(); public: - static std::shared_ptr create() { return std::shared_ptr(new SetEquippedItemPacket()); } + static shared_ptr create() { return shared_ptr(new SetEquippedItemPacket()); } virtual int getId() { return 5; } }; \ No newline at end of file diff --git a/Minecraft.World/SetExperiencePacket.cpp b/Minecraft.World/SetExperiencePacket.cpp index bd96a926..ffe90a67 100644 --- a/Minecraft.World/SetExperiencePacket.cpp +++ b/Minecraft.World/SetExperiencePacket.cpp @@ -48,7 +48,7 @@ bool SetExperiencePacket::canBeInvalidated() return true; } -bool SetExperiencePacket::isInvalidatedBy(std::shared_ptr packet) +bool SetExperiencePacket::isInvalidatedBy(shared_ptr packet) { return true; } diff --git a/Minecraft.World/SetExperiencePacket.h b/Minecraft.World/SetExperiencePacket.h index c8aff620..499b7efd 100644 --- a/Minecraft.World/SetExperiencePacket.h +++ b/Minecraft.World/SetExperiencePacket.h @@ -17,10 +17,10 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); virtual bool isAync(); public: - static std::shared_ptr create() { return std::shared_ptr(new SetExperiencePacket()); } + static shared_ptr create() { return shared_ptr(new SetExperiencePacket()); } virtual int getId() { return 43; } }; \ No newline at end of file diff --git a/Minecraft.World/SetHealthPacket.cpp b/Minecraft.World/SetHealthPacket.cpp index 63e1a593..55d7ccc3 100644 --- a/Minecraft.World/SetHealthPacket.cpp +++ b/Minecraft.World/SetHealthPacket.cpp @@ -25,7 +25,7 @@ SetHealthPacket::SetHealthPacket(int health, int food, float saturation, ETeleme this->damageSource = damageSource; } -void SetHealthPacket::read(DataInputStream *dis) //throws IOException +void SetHealthPacket::read(DataInputStream *dis) //throws IOException { health = dis->readShort(); food = dis->readShort(); @@ -35,7 +35,7 @@ void SetHealthPacket::read(DataInputStream *dis) //throws IOException damageSource = (ETelemetryChallenges)dis->readByte(); } -void SetHealthPacket::write(DataOutputStream *dos) //throws IOException +void SetHealthPacket::write(DataOutputStream *dos) //throws IOException { dos->writeShort(health); dos->writeShort(food); @@ -45,7 +45,7 @@ void SetHealthPacket::write(DataOutputStream *dos) //throws IOException dos->writeByte(damageSource); } -void SetHealthPacket::handle(PacketListener *listener) +void SetHealthPacket::handle(PacketListener *listener) { listener->handleSetHealth(shared_from_this()); } @@ -60,7 +60,7 @@ bool SetHealthPacket::canBeInvalidated() return true; } -bool SetHealthPacket::isInvalidatedBy(std::shared_ptr packet) +bool SetHealthPacket::isInvalidatedBy(shared_ptr packet) { return true; } \ No newline at end of file diff --git a/Minecraft.World/SetHealthPacket.h b/Minecraft.World/SetHealthPacket.h index 0f74075b..de8f4cb9 100644 --- a/Minecraft.World/SetHealthPacket.h +++ b/Minecraft.World/SetHealthPacket.h @@ -21,10 +21,10 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new SetHealthPacket()); } + static shared_ptr create() { return shared_ptr(new SetHealthPacket()); } virtual int getId() { return 8; } }; diff --git a/Minecraft.World/SetRidingPacket.cpp b/Minecraft.World/SetRidingPacket.cpp index de7b0bf2..454da047 100644 --- a/Minecraft.World/SetRidingPacket.cpp +++ b/Minecraft.World/SetRidingPacket.cpp @@ -13,13 +13,13 @@ SetRidingPacket::SetRidingPacket() riddenId = -1; } -SetRidingPacket::SetRidingPacket(std::shared_ptr rider, std::shared_ptr riding) +SetRidingPacket::SetRidingPacket(shared_ptr rider, shared_ptr riding) { this->riderId = rider->entityId; this->riddenId = riding != NULL ? riding->entityId : -1; } -int SetRidingPacket::getEstimatedSize() +int SetRidingPacket::getEstimatedSize() { return 8; } @@ -46,8 +46,8 @@ bool SetRidingPacket::canBeInvalidated() return true; } -bool SetRidingPacket::isInvalidatedBy(std::shared_ptr packet) +bool SetRidingPacket::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target->riderId == riderId; } diff --git a/Minecraft.World/SetRidingPacket.h b/Minecraft.World/SetRidingPacket.h index 049b9d13..60c3ac43 100644 --- a/Minecraft.World/SetRidingPacket.h +++ b/Minecraft.World/SetRidingPacket.h @@ -9,17 +9,17 @@ public: int riderId, riddenId; SetRidingPacket(); - SetRidingPacket(std::shared_ptr rider, std::shared_ptr riding); + SetRidingPacket(shared_ptr rider, shared_ptr riding); virtual int getEstimatedSize(); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new SetRidingPacket()); } + static shared_ptr create() { return shared_ptr(new SetRidingPacket()); } virtual int getId() { return 39; } }; \ No newline at end of file diff --git a/Minecraft.World/SetSpawnPositionPacket.cpp b/Minecraft.World/SetSpawnPositionPacket.cpp index 07ad2622..035da347 100644 --- a/Minecraft.World/SetSpawnPositionPacket.cpp +++ b/Minecraft.World/SetSpawnPositionPacket.cpp @@ -6,7 +6,7 @@ -SetSpawnPositionPacket::SetSpawnPositionPacket() +SetSpawnPositionPacket::SetSpawnPositionPacket() { x = 0; y = 0; @@ -27,19 +27,19 @@ void SetSpawnPositionPacket::read(DataInputStream *dis) //throws IOException z = dis->readInt(); } -void SetSpawnPositionPacket::write(DataOutputStream *dos) //throws IOException +void SetSpawnPositionPacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(x); dos->writeInt(y); dos->writeInt(z); } -void SetSpawnPositionPacket::handle(PacketListener *listener) +void SetSpawnPositionPacket::handle(PacketListener *listener) { listener->handleSetSpawn(shared_from_this()); } -int SetSpawnPositionPacket::getEstimatedSize() +int SetSpawnPositionPacket::getEstimatedSize() { return 3*4; } @@ -49,7 +49,7 @@ bool SetSpawnPositionPacket::canBeInvalidated() return true; } -bool SetSpawnPositionPacket::isInvalidatedBy(std::shared_ptr packet) +bool SetSpawnPositionPacket::isInvalidatedBy(shared_ptr packet) { return true; } diff --git a/Minecraft.World/SetSpawnPositionPacket.h b/Minecraft.World/SetSpawnPositionPacket.h index e9e5c7cd..3ba66af8 100644 --- a/Minecraft.World/SetSpawnPositionPacket.h +++ b/Minecraft.World/SetSpawnPositionPacket.h @@ -16,10 +16,10 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); virtual bool isAync(); public: - static std::shared_ptr create() { return std::shared_ptr(new SetSpawnPositionPacket()); } + static shared_ptr create() { return shared_ptr(new SetSpawnPositionPacket()); } virtual int getId() { return 6; } }; \ No newline at end of file diff --git a/Minecraft.World/SetTimePacket.cpp b/Minecraft.World/SetTimePacket.cpp index 0a5fe621..1f0701eb 100644 --- a/Minecraft.World/SetTimePacket.cpp +++ b/Minecraft.World/SetTimePacket.cpp @@ -41,7 +41,7 @@ bool SetTimePacket::canBeInvalidated() return true; } -bool SetTimePacket::isInvalidatedBy(std::shared_ptr packet) +bool SetTimePacket::isInvalidatedBy(shared_ptr packet) { return true; } diff --git a/Minecraft.World/SetTimePacket.h b/Minecraft.World/SetTimePacket.h index 8074ce9e..b7d3e645 100644 --- a/Minecraft.World/SetTimePacket.h +++ b/Minecraft.World/SetTimePacket.h @@ -16,10 +16,10 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); virtual bool isAync(); public: - static std::shared_ptr create() { return std::shared_ptr(new SetTimePacket()); } + static shared_ptr create() { return shared_ptr(new SetTimePacket()); } virtual int getId() { return 4; } }; \ No newline at end of file diff --git a/Minecraft.World/ShapedRecipy.cpp b/Minecraft.World/ShapedRecipy.cpp index 4e22dcd2..15ccca2d 100644 --- a/Minecraft.World/ShapedRecipy.cpp +++ b/Minecraft.World/ShapedRecipy.cpp @@ -1,5 +1,5 @@ // package net.minecraft.world.item.crafting; -// +// // import net.minecraft.world.inventory.CraftingContainer; // import net.minecraft.world.item.ItemInstance; @@ -12,7 +12,7 @@ #include "ShapedRecipy.h" // 4J-PB - for new crafting - Adding group to define type of item that the recipe produces -ShapedRecipy::ShapedRecipy(int width, int height, ItemInstance **recipeItems, ItemInstance *result, int iGroup) +ShapedRecipy::ShapedRecipy(int width, int height, ItemInstance **recipeItems, ItemInstance *result, int iGroup) : resultId(result->id) { this->width = width; @@ -23,21 +23,21 @@ ShapedRecipy::ShapedRecipy(int width, int height, ItemInstance **recipeItems, It _keepTag = false; } -const int ShapedRecipy::getGroup() +const int ShapedRecipy::getGroup() { return group; } -const ItemInstance *ShapedRecipy::getResultItem() +const ItemInstance *ShapedRecipy::getResultItem() { return result; } -bool ShapedRecipy::matches(std::shared_ptr craftSlots, Level *level) +bool ShapedRecipy::matches(shared_ptr craftSlots, Level *level) { - for (int xOffs = 0; xOffs <= (3 - width); xOffs++) + for (int xOffs = 0; xOffs <= (3 - width); xOffs++) { - for (int yOffs = 0; yOffs <= (3 - height); yOffs++) + for (int yOffs = 0; yOffs <= (3 - height); yOffs++) { if (matches(craftSlots, xOffs, yOffs, true)) return true; if (matches(craftSlots, xOffs, yOffs, false)) return true; @@ -46,32 +46,32 @@ bool ShapedRecipy::matches(std::shared_ptr craftSlots, Level return false; } -bool ShapedRecipy::matches(std::shared_ptr craftSlots, int xOffs, int yOffs, bool xFlip) +bool ShapedRecipy::matches(shared_ptr craftSlots, int xOffs, int yOffs, bool xFlip) { for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { int xs = x - xOffs; int ys = y - yOffs; ItemInstance *expected = NULL; - if (xs >= 0 && ys >= 0 && xs < width && ys < height) + if (xs >= 0 && ys >= 0 && xs < width && ys < height) { if (xFlip) expected = recipeItems[(width - xs - 1) + ys * width]; else expected = recipeItems[xs + ys * width]; } - std::shared_ptr item = craftSlots->getItem(x, y); - if (item == NULL && expected == NULL) + shared_ptr item = craftSlots->getItem(x, y); + if (item == NULL && expected == NULL) { continue; } - if ((item == NULL && expected != NULL) || (item != NULL && expected == NULL)) + if ((item == NULL && expected != NULL) || (item != NULL && expected == NULL)) { return false; } - if (expected->id != item->id) + if (expected->id != item->id) { return false; } - if (expected->getAuxValue() != Recipes::ANY_AUX_VALUE && expected->getAuxValue() != item->getAuxValue()) + if (expected->getAuxValue() != Recipes::ANY_AUX_VALUE && expected->getAuxValue() != item->getAuxValue()) { return false; } @@ -80,15 +80,15 @@ bool ShapedRecipy::matches(std::shared_ptr craftSlots, int xO return true; } -std::shared_ptr ShapedRecipy::assemble(std::shared_ptr craftSlots) +shared_ptr ShapedRecipy::assemble(shared_ptr craftSlots) { - std::shared_ptr result = getResultItem()->copy(); + shared_ptr result = getResultItem()->copy(); if (_keepTag && craftSlots != NULL) { for (int i = 0; i < craftSlots->getContainerSize(); i++) { - std::shared_ptr item = craftSlots->getItem(i); + shared_ptr item = craftSlots->getItem(i); if (item != NULL && item->hasTag()) { @@ -100,25 +100,25 @@ std::shared_ptr ShapedRecipy::assemble(std::shared_ptrid); } } @@ -130,7 +130,7 @@ bool ShapedRecipy::requires(int iRecipe) return false; } -void ShapedRecipy::requires(INGREDIENTS_REQUIRED *pIngReq) +void ShapedRecipy::requires(INGREDIENTS_REQUIRED *pIngReq) { //printf("ShapedRecipy %d\n",iRecipe); @@ -151,16 +151,16 @@ void ShapedRecipy::requires(INGREDIENTS_REQUIRED *pIngReq) memset(TempIngReq.iIngAuxValA,Recipes::ANY_AUX_VALUE,sizeof(int)*9); ZeroMemory(TempIngReq.uiGridA,sizeof(unsigned int)*9); - for (int x = 0; x < 3; x++) + for (int x = 0; x < 3; x++) { - for (int y = 0; y < 3; y++) + for (int y = 0; y < 3; y++) { - if (x < width && y < height) + if (x < width && y < height) { ItemInstance *expected = recipeItems[x+y*width]; - if (expected!=NULL) - { + if (expected!=NULL) + { int iAuxVal = expected->getAuxValue(); TempIngReq.uiGridA[x+y*3]=expected->id | iAuxVal<<24; diff --git a/Minecraft.World/ShapedRecipy.h b/Minecraft.World/ShapedRecipy.h index 387cf17b..56cae3fd 100644 --- a/Minecraft.World/ShapedRecipy.h +++ b/Minecraft.World/ShapedRecipy.h @@ -1,6 +1,6 @@ #pragma once -class ShapedRecipy : public Recipy +class ShapedRecipy : public Recipy { private: int width, height, group; @@ -15,13 +15,13 @@ public: virtual const ItemInstance *getResultItem(); virtual const int getGroup(); - virtual bool matches(std::shared_ptr craftSlots, Level *level); + virtual bool matches(shared_ptr craftSlots, Level *level); private: - bool matches(std::shared_ptr craftSlots, int xOffs, int yOffs, bool xFlip); + bool matches(shared_ptr craftSlots, int xOffs, int yOffs, bool xFlip); public: - virtual std::shared_ptr assemble(std::shared_ptr craftSlots); + virtual shared_ptr assemble(shared_ptr craftSlots); virtual int size(); ShapedRecipy *keepTag(); diff --git a/Minecraft.World/ShapelessRecipy.cpp b/Minecraft.World/ShapelessRecipy.cpp index 46a58524..67ed0381 100644 --- a/Minecraft.World/ShapelessRecipy.cpp +++ b/Minecraft.World/ShapelessRecipy.cpp @@ -1,7 +1,7 @@ // package net.minecraft.world.item.crafting; -// +// // import java.util.*; -// +// // import net.minecraft.world.inventory.CraftingContainer; // import net.minecraft.world.item.ItemInstance; #include "stdafx.h" @@ -19,27 +19,27 @@ ShapelessRecipy::ShapelessRecipy(ItemInstance *result, vector *i { } -const int ShapelessRecipy::getGroup() -{ +const int ShapelessRecipy::getGroup() +{ return group; } -const ItemInstance *ShapelessRecipy::getResultItem() +const ItemInstance *ShapelessRecipy::getResultItem() { return result; } -bool ShapelessRecipy::matches(std::shared_ptr craftSlots, Level *level) +bool ShapelessRecipy::matches(shared_ptr craftSlots, Level *level) { vector tempList = *ingredients; - - for (int y = 0; y < 3; y++) + + for (int y = 0; y < 3; y++) { - for (int x = 0; x < 3; x++) + for (int x = 0; x < 3; x++) { - std::shared_ptr item = craftSlots->getItem(x, y); + shared_ptr item = craftSlots->getItem(x, y); - if (item != NULL) + if (item != NULL) { bool found = false; @@ -47,7 +47,7 @@ bool ShapelessRecipy::matches(std::shared_ptr craftSlots, Lev for (AUTO_VAR(cit, ingredients->begin()); cit != citEnd; ++cit) { ItemInstance *ingredient = *cit; - if (item->id == ingredient->id && (ingredient->getAuxValue() == Recipes::ANY_AUX_VALUE || item->getAuxValue() == ingredient->getAuxValue())) + if (item->id == ingredient->id && (ingredient->getAuxValue() == Recipes::ANY_AUX_VALUE || item->getAuxValue() == ingredient->getAuxValue())) { found = true; AUTO_VAR( it, find(tempList.begin(), tempList.end(), ingredient ) ); @@ -56,7 +56,7 @@ bool ShapelessRecipy::matches(std::shared_ptr craftSlots, Lev } } - if (!found) + if (!found) { return false; } @@ -67,18 +67,18 @@ bool ShapelessRecipy::matches(std::shared_ptr craftSlots, Lev return tempList.empty(); } -std::shared_ptr ShapelessRecipy::assemble(std::shared_ptr craftSlots) +shared_ptr ShapelessRecipy::assemble(shared_ptr craftSlots) { return result->copy(); } -int ShapelessRecipy::size() +int ShapelessRecipy::size() { return (int)ingredients->size(); } // 4J-PB -bool ShapelessRecipy::requires(int iRecipe) +bool ShapelessRecipy::requires(int iRecipe) { vector *tempList = new vector; @@ -91,7 +91,7 @@ bool ShapelessRecipy::requires(int iRecipe) for (vector::iterator ingredient = ingredients->begin(); ingredient != citEnd; ingredient++) { //printf("\tIngredient %d is %d\n",iCount++,(*ingredient)->id); - //if (item->id == (*ingredient)->id && ((*ingredient)->getAuxValue() == Recipes::ANY_AUX_VALUE || item->getAuxValue() == (*ingredient)->getAuxValue())) + //if (item->id == (*ingredient)->id && ((*ingredient)->getAuxValue() == Recipes::ANY_AUX_VALUE || item->getAuxValue() == (*ingredient)->getAuxValue())) tempList->erase(ingredient); } @@ -99,7 +99,7 @@ bool ShapelessRecipy::requires(int iRecipe) return false; } -void ShapelessRecipy::requires(INGREDIENTS_REQUIRED *pIngReq) +void ShapelessRecipy::requires(INGREDIENTS_REQUIRED *pIngReq) { int iCount=0; bool bFound; @@ -125,8 +125,8 @@ void ShapelessRecipy::requires(INGREDIENTS_REQUIRED *pIngReq) { ItemInstance *expected = *ingredient; - if (expected!=NULL) - { + if (expected!=NULL) + { int iAuxVal = (*ingredient)->getAuxValue(); TempIngReq.uiGridA[iCount++]=expected->id | iAuxVal<<24; // 4J-PB - put the ingredients in boxes 1,2,4,5 so we can see them in a 2x2 crafting screen diff --git a/Minecraft.World/ShapelessRecipy.h b/Minecraft.World/ShapelessRecipy.h index 88de0060..5f7f6076 100644 --- a/Minecraft.World/ShapelessRecipy.h +++ b/Minecraft.World/ShapelessRecipy.h @@ -1,6 +1,6 @@ #pragma once -class ShapelessRecipy : public Recipy +class ShapelessRecipy : public Recipy { private: _eGroupType group; @@ -12,12 +12,12 @@ public: virtual const ItemInstance *getResultItem(); virtual const int getGroup(); - virtual bool matches(std::shared_ptr craftSlots, Level *level); - virtual std::shared_ptr assemble(std::shared_ptr craftSlots); + virtual bool matches(shared_ptr craftSlots, Level *level); + virtual shared_ptr assemble(shared_ptr craftSlots); virtual int size(); // 4J-PB - to return the items required to make a recipe virtual bool requires(int iRecipe); - virtual void requires(INGREDIENTS_REQUIRED *pIngReq); + virtual void requires(INGREDIENTS_REQUIRED *pIngReq); }; diff --git a/Minecraft.World/ShearsItem.cpp b/Minecraft.World/ShearsItem.cpp index 00372e29..7f4d8d51 100644 --- a/Minecraft.World/ShearsItem.cpp +++ b/Minecraft.World/ShearsItem.cpp @@ -9,7 +9,7 @@ ShearsItem::ShearsItem(int itemId) : Item(itemId) setMaxDamage(238); } -bool ShearsItem::mineBlock(std::shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, std::shared_ptr owner) +bool ShearsItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { if (tile == Tile::leaves_Id || tile == Tile::web_Id || tile == Tile::tallgrass_Id || tile == Tile::vine_Id || tile == Tile::tripWire_Id) { @@ -24,7 +24,7 @@ bool ShearsItem::canDestroySpecial(Tile *tile) return tile->id == Tile::web_Id || tile->id == Tile::redStoneDust_Id || tile->id == Tile::tripWire_Id; } -float ShearsItem::getDestroySpeed(std::shared_ptr itemInstance, Tile *tile) +float ShearsItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { if (tile->id == Tile::web_Id || tile->id == Tile::leaves_Id) { diff --git a/Minecraft.World/ShearsItem.h b/Minecraft.World/ShearsItem.h index fe713eaa..06078645 100644 --- a/Minecraft.World/ShearsItem.h +++ b/Minecraft.World/ShearsItem.h @@ -3,11 +3,11 @@ using namespace std; #include "Item.h" -class ShearsItem : public Item +class ShearsItem : public Item { public: ShearsItem(int itemId); - virtual bool mineBlock(std::shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, std::shared_ptr owner); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); virtual bool canDestroySpecial(Tile *tile); - virtual float getDestroySpeed(std::shared_ptr itemInstance, Tile *tile); + virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); }; \ No newline at end of file diff --git a/Minecraft.World/Sheep.cpp b/Minecraft.World/Sheep.cpp index cc1d69ed..30eeefcd 100644 --- a/Minecraft.World/Sheep.cpp +++ b/Minecraft.World/Sheep.cpp @@ -68,9 +68,9 @@ Sheep::Sheep(Level *level) : Animal( level ) goalSelector.addGoal(7, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(8, new RandomLookAroundGoal(this)); - container = std::shared_ptr(new CraftingContainer(new SheepContainer(), 2, 1)); - container->setItem(0, std::shared_ptr( new ItemInstance(Item::dye_powder, 1, 0))); - container->setItem(1, std::shared_ptr( new ItemInstance(Item::dye_powder, 1, 0))); + container = shared_ptr(new CraftingContainer(new SheepContainer(), 2, 1)); + container->setItem(0, shared_ptr( new ItemInstance(Item::dye_powder, 1, 0))); + container->setItem(1, shared_ptr( new ItemInstance(Item::dye_powder, 1, 0))); } bool Sheep::useNewAi() @@ -95,7 +95,7 @@ int Sheep::getMaxHealth() return 8; } -void Sheep::defineSynchedData() +void Sheep::defineSynchedData() { Animal::defineSynchedData(); @@ -108,7 +108,7 @@ void Sheep::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) if(!isSheared()) { // killing a non-sheared sheep will drop a single block of cloth - spawnAtLocation(std::shared_ptr( new ItemInstance(Tile::cloth_Id, 1, getColor()) ), 0.0f); + spawnAtLocation(shared_ptr( new ItemInstance(Tile::cloth_Id, 1, getColor()) ), 0.0f); } } @@ -160,9 +160,9 @@ float Sheep::getHeadEatAngleScale(float a) return ((xRot / (180.0f / PI))); } -bool Sheep::interact(std::shared_ptr player) +bool Sheep::interact(shared_ptr player) { - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); // 4J-JEV: Fix for #88212, // Untrusted players shouldn't be able to sheer sheep. @@ -177,7 +177,7 @@ bool Sheep::interact(std::shared_ptr player) int count = 1 + random->nextInt(3); for (int i = 0; i < count; i++) { - std::shared_ptr ie = spawnAtLocation(std::shared_ptr( new ItemInstance(Tile::cloth_Id, 1, getColor()) ), 1.0f); + shared_ptr ie = spawnAtLocation(shared_ptr( new ItemInstance(Tile::cloth_Id, 1, getColor()) ), 1.0f); ie->yd += random->nextFloat() * 0.05f; ie->xd += (random->nextFloat() - random->nextFloat()) * 0.1f; ie->zd += (random->nextFloat() - random->nextFloat()) * 0.1f; @@ -191,80 +191,80 @@ bool Sheep::interact(std::shared_ptr player) return Animal::interact(player); } -void Sheep::addAdditonalSaveData(CompoundTag *tag) +void Sheep::addAdditonalSaveData(CompoundTag *tag) { Animal::addAdditonalSaveData(tag); tag->putBoolean(L"Sheared", isSheared()); tag->putByte(L"Color", (byte) getColor()); } -void Sheep::readAdditionalSaveData(CompoundTag *tag) +void Sheep::readAdditionalSaveData(CompoundTag *tag) { Animal::readAdditionalSaveData(tag); setSheared(tag->getBoolean(L"Sheared")); setColor((int) tag->getByte(L"Color")); } -int Sheep::getAmbientSound() +int Sheep::getAmbientSound() { return eSoundType_MOB_SHEEP_AMBIENT; } -int Sheep::getHurtSound() +int Sheep::getHurtSound() { return eSoundType_MOB_SHEEP_AMBIENT; } -int Sheep::getDeathSound() +int Sheep::getDeathSound() { return eSoundType_MOB_SHEEP_AMBIENT; } -int Sheep::getColor() +int Sheep::getColor() { return (entityData->getByte(DATA_WOOL_ID) & 0x0f); } -void Sheep::setColor(int color) +void Sheep::setColor(int color) { byte current = entityData->getByte(DATA_WOOL_ID); entityData->set(DATA_WOOL_ID, (byte) ((current & 0xf0) | (color & 0x0f))); } -bool Sheep::isSheared() +bool Sheep::isSheared() { return (entityData->getByte(DATA_WOOL_ID) & 0x10) != 0; } -void Sheep::setSheared(bool value) +void Sheep::setSheared(bool value) { byte current = entityData->getByte(DATA_WOOL_ID); - if (value) + if (value) { entityData->set(DATA_WOOL_ID, (byte) (current | 0x10)); - } - else + } + else { entityData->set(DATA_WOOL_ID, (byte) (current & ~0x10)); } } -int Sheep::getSheepColor(Random *random) +int Sheep::getSheepColor(Random *random) { int nextInt = random->nextInt(100); - if (nextInt < 5) + if (nextInt < 5) { return 15 - DyePowderItem::BLACK; } - if (nextInt < 10) + if (nextInt < 10) { return 15 - DyePowderItem::GRAY; } - if (nextInt < 15) + if (nextInt < 15) { return 15 - DyePowderItem::SILVER; } - if (nextInt < 18) + if (nextInt < 18) { return 15 - DyePowderItem::BROWN; } @@ -272,13 +272,13 @@ int Sheep::getSheepColor(Random *random) return 0; // white } -std::shared_ptr Sheep::getBreedOffspring(std::shared_ptr target) +shared_ptr Sheep::getBreedOffspring(shared_ptr target) { // 4J - added limit to number of animals that can be bred if( level->canCreateMore( GetType(), Level::eSpawnType_Breed) ) { - std::shared_ptr otherSheep = dynamic_pointer_cast( target ); - std::shared_ptr sheep = std::shared_ptr( new Sheep(level) ); + shared_ptr otherSheep = dynamic_pointer_cast( target ); + shared_ptr sheep = shared_ptr( new Sheep(level) ); int color = getOffspringColor(dynamic_pointer_cast(shared_from_this()), otherSheep); sheep->setColor(15 - color); return sheep; @@ -309,7 +309,7 @@ void Sheep::finalizeMobSpawn() setColor(Sheep::getSheepColor(level->random)); } -int Sheep::getOffspringColor(std::shared_ptr animal, std::shared_ptr partner) +int Sheep::getOffspringColor(shared_ptr animal, shared_ptr partner) { int parent1DyeColor = getDyeColor(animal); int parent2DyeColor = getDyeColor(partner); @@ -317,7 +317,7 @@ int Sheep::getOffspringColor(std::shared_ptr animal, std::shared_ptrgetItem(0)->setAuxValue(parent1DyeColor); container->getItem(1)->setAuxValue(parent2DyeColor); - std::shared_ptr instance = Recipes::getInstance()->getItemFor(container, animal->level); + shared_ptr instance = Recipes::getInstance()->getItemFor(container, animal->level); int color = 0; if (instance != NULL && instance->getItem()->id == Item::dye_powder_Id) @@ -331,7 +331,7 @@ int Sheep::getOffspringColor(std::shared_ptr animal, std::shared_ptr animal) +int Sheep::getDyeColor(shared_ptr animal) { return 15 - dynamic_pointer_cast(animal)->getColor(); } diff --git a/Minecraft.World/Sheep.h b/Minecraft.World/Sheep.h index 098183e8..666e1d57 100644 --- a/Minecraft.World/Sheep.h +++ b/Minecraft.World/Sheep.h @@ -15,10 +15,10 @@ class Sheep : public Animal private: class SheepContainer : public AbstractContainerMenu { - bool stillValid(std::shared_ptr player) { return false; } + bool stillValid(shared_ptr player) { return false; } }; - std::shared_ptr container; + shared_ptr container; public: eINSTANCEOF GetType() { return eTYPE_SHEEP; } static Entity *create(Level *level) { return new Sheep(level); } @@ -58,7 +58,7 @@ public: float getHeadEatPositionScale(float a); float getHeadEatAngleScale(float a); - virtual bool interact(std::shared_ptr player); + virtual bool interact(shared_ptr player); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); @@ -74,13 +74,13 @@ public: void setSheared(bool value); static int getSheepColor(Random *random); - virtual std::shared_ptr getBreedOffspring(std::shared_ptr target); + virtual shared_ptr getBreedOffspring(shared_ptr target); virtual void ate(); void finalizeMobSpawn(); private: - int getOffspringColor(std::shared_ptr animal, std::shared_ptr partner); - int getDyeColor(std::shared_ptr animal); + int getOffspringColor(shared_ptr animal, shared_ptr partner); + int getDyeColor(shared_ptr animal); }; diff --git a/Minecraft.World/ShoreLayer.cpp b/Minecraft.World/ShoreLayer.cpp index 9640c736..7ae52557 100644 --- a/Minecraft.World/ShoreLayer.cpp +++ b/Minecraft.World/ShoreLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.newbiome.layer.h" #include "net.minecraft.world.level.biome.h" -ShoreLayer::ShoreLayer(int64_t seed, std::shared_ptr parent) : Layer(seed) +ShoreLayer::ShoreLayer(int64_t seed, shared_ptr parent) : Layer(seed) { this->parent = parent; } diff --git a/Minecraft.World/ShoreLayer.h b/Minecraft.World/ShoreLayer.h index a8aff680..a7053004 100644 --- a/Minecraft.World/ShoreLayer.h +++ b/Minecraft.World/ShoreLayer.h @@ -4,6 +4,6 @@ class ShoreLayer : public Layer { public: - ShoreLayer(int64_t seed, std::shared_ptr parent); + ShoreLayer(int64_t seed, shared_ptr parent); virtual intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/SignItem.cpp b/Minecraft.World/SignItem.cpp index fa9d6772..02ccf83d 100644 --- a/Minecraft.World/SignItem.cpp +++ b/Minecraft.World/SignItem.cpp @@ -13,7 +13,7 @@ SignItem::SignItem(int id) : Item(id) maxStackSize = 16; } -bool SignItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool SignItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed if (face == 0) return false; @@ -32,24 +32,24 @@ bool SignItem::useOn(std::shared_ptr instance, std::shared_ptryRot + 180) * 16) / 360 + 0.5) & 15; level->setTileAndData(x, y, z, Tile::sign_Id, rot); - } + } else { level->setTileAndData(x, y, z, Tile::wallSign_Id, face); } instance->count--; - std::shared_ptr ste = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr ste = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if (ste != NULL) player->openTextEdit(ste); // 4J-JEV: Hook for durango 'BlockPlaced' event. player->awardStat( GenericStats::blocksPlaced((face==1) ? Tile::sign_Id : Tile::wallSign_Id), - GenericStats::param_blocksPlaced( + GenericStats::param_blocksPlaced( (face==1) ? Tile::sign_Id : Tile::wallSign_Id, instance->getAuxValue(), 1) diff --git a/Minecraft.World/SignItem.h b/Minecraft.World/SignItem.h index 98e39c0f..6265e759 100644 --- a/Minecraft.World/SignItem.h +++ b/Minecraft.World/SignItem.h @@ -3,10 +3,10 @@ using namespace std; #include "Item.h" -class SignItem : public Item +class SignItem : public Item { public: SignItem(int id); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); }; \ No newline at end of file diff --git a/Minecraft.World/SignTile.cpp b/Minecraft.World/SignTile.cpp index 363ef5be..52dc1260 100644 --- a/Minecraft.World/SignTile.cpp +++ b/Minecraft.World/SignTile.cpp @@ -35,7 +35,7 @@ AABB *SignTile::getTileAABB(Level *level, int x, int y, int z) return EntityTile::getTileAABB(level, x, y, z); } -void SignTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void SignTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { if (onGround) return; @@ -75,11 +75,11 @@ bool SignTile::isSolidRender(bool isServerLevel) return false; } -std::shared_ptr SignTile::newTileEntity(Level *level) +shared_ptr SignTile::newTileEntity(Level *level) { //try { // 4J Stu - For some reason the newInstance wasn't working right, but doing it like the other TileEntities is fine - return std::shared_ptr( new SignTileEntity() ); + return shared_ptr( new SignTileEntity() ); //return dynamic_pointer_cast( clas->newInstance() ); //} catch (Exception e) { // TODO 4J Stu - Exception handling diff --git a/Minecraft.World/SignTile.h b/Minecraft.World/SignTile.h index 75d723ad..92163973 100644 --- a/Minecraft.World/SignTile.h +++ b/Minecraft.World/SignTile.h @@ -21,14 +21,14 @@ public: virtual void updateDefaultShape(); AABB *getAABB(Level *level, int x, int y, int z); AABB *getTileAABB(Level *level, int x, int y, int z); - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param int getRenderShape(); bool isCubeShaped(); virtual bool isPathfindable(LevelSource *level, int x, int y, int z); bool isSolidRender(bool isServerLevel = false); protected: - std::shared_ptr newTileEntity(Level *level); + shared_ptr newTileEntity(Level *level); public: int getResource(int data, Random *random, int playerBonusLevel); diff --git a/Minecraft.World/SignTileEntity.cpp b/Minecraft.World/SignTileEntity.cpp index b2219c94..09b8e022 100644 --- a/Minecraft.World/SignTileEntity.cpp +++ b/Minecraft.World/SignTileEntity.cpp @@ -40,7 +40,7 @@ SignTileEntity::~SignTileEntity() #endif } -void SignTileEntity::save(CompoundTag *tag) +void SignTileEntity::save(CompoundTag *tag) { TileEntity::save(tag); tag->putString(L"Text1", m_wsmessages[0] ); @@ -61,7 +61,7 @@ void SignTileEntity::load(CompoundTag *tag) { _isEditable = false; TileEntity::load(tag); - for (int i = 0; i < MAX_SIGN_LINES; i++) + for (int i = 0; i < MAX_SIGN_LINES; i++) { wchar_t *buf = new wchar_t[256]; swprintf(buf, 256, L"Text%d", (i+1) ); @@ -84,17 +84,17 @@ void SignTileEntity::load(CompoundTag *tag) setChanged(); } -std::shared_ptr SignTileEntity::getUpdatePacket() +shared_ptr SignTileEntity::getUpdatePacket() { wstring copy[MAX_SIGN_LINES]; - for (int i = 0; i < MAX_SIGN_LINES; i++) + for (int i = 0; i < MAX_SIGN_LINES; i++) { copy[i] = m_wsmessages[i]; } - return std::shared_ptr( new SignUpdatePacket(x, y, z, m_bVerified, m_bCensored, copy) ); + return shared_ptr( new SignUpdatePacket(x, y, z, m_bVerified, m_bCensored, copy) ); } -bool SignTileEntity::isEditable() +bool SignTileEntity::isEditable() { return _isEditable; } @@ -115,10 +115,10 @@ void SignTileEntity::setChanged() //if (pMinecraft->level->isClientSide) { WCHAR *wcMessages[MAX_SIGN_LINES]; - for (int i = 0; i < MAX_SIGN_LINES; ++i) + for (int i = 0; i < MAX_SIGN_LINES; ++i) { wcMessages[i]=new WCHAR [MAX_LINE_LENGTH+1]; - ZeroMemory(wcMessages[i],sizeof(WCHAR)*(MAX_LINE_LENGTH+1)); + ZeroMemory(wcMessages[i],sizeof(WCHAR)*(MAX_LINE_LENGTH+1)); if(m_wsmessages[i].length()>0) { memcpy(wcMessages[i],m_wsmessages[i].c_str(),m_wsmessages[i].length()*sizeof(WCHAR)); @@ -149,8 +149,8 @@ void SignTileEntity::setChanged() } -void SignTileEntity::SetMessage(int iIndex,wstring &wsText) -{ +void SignTileEntity::SetMessage(int iIndex,wstring &wsText) +{ m_wsmessages[iIndex]=wsText; } @@ -183,9 +183,9 @@ int SignTileEntity::StringVerifyCallback(LPVOID lpParam,STRING_VERIFY_RESPONSE * } // 4J Added -std::shared_ptr SignTileEntity::clone() +shared_ptr SignTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new SignTileEntity() ); + shared_ptr result = shared_ptr( new SignTileEntity() ); TileEntity::clone(result); result->m_wsmessages[0] = m_wsmessages[0]; diff --git a/Minecraft.World/SignTileEntity.h b/Minecraft.World/SignTileEntity.h index 8713c627..b963f12f 100644 --- a/Minecraft.World/SignTileEntity.h +++ b/Minecraft.World/SignTileEntity.h @@ -38,12 +38,12 @@ private: public: virtual void save(CompoundTag *tag); virtual void load(CompoundTag *tag); - virtual std::shared_ptr getUpdatePacket(); + virtual shared_ptr getUpdatePacket(); bool isEditable(); void setEditable(bool isEditable); virtual void setChanged(); static int StringVerifyCallback(LPVOID lpParam,STRING_VERIFY_RESPONSE *pResults); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); }; \ No newline at end of file diff --git a/Minecraft.World/SignUpdatePacket.h b/Minecraft.World/SignUpdatePacket.h index e3284ab1..80cc2968 100644 --- a/Minecraft.World/SignUpdatePacket.h +++ b/Minecraft.World/SignUpdatePacket.h @@ -21,6 +21,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new SignUpdatePacket()); } + static shared_ptr create() { return shared_ptr(new SignUpdatePacket()); } virtual int getId() { return 130; } }; \ No newline at end of file diff --git a/Minecraft.World/Silverfish.cpp b/Minecraft.World/Silverfish.cpp index 24745b6c..117dc41b 100644 --- a/Minecraft.World/Silverfish.cpp +++ b/Minecraft.World/Silverfish.cpp @@ -37,12 +37,12 @@ bool Silverfish::makeStepSound() return false; } -std::shared_ptr Silverfish::findAttackTarget() +shared_ptr Silverfish::findAttackTarget() { #ifndef _FINAL_BUILD if(app.GetMobsDontAttackEnabled()) { - return std::shared_ptr(); + return shared_ptr(); } #endif @@ -79,7 +79,7 @@ bool Silverfish::hurt(DamageSource *source, int dmg) return Monster::hurt(source, dmg); } -void Silverfish::checkHurtTarget(std::shared_ptr target, float d) +void Silverfish::checkHurtTarget(shared_ptr target, float d) { // super.checkHurtTarget(target, d); @@ -199,7 +199,7 @@ bool Silverfish::canSpawn() { if (Monster::canSpawn()) { - std::shared_ptr nearestPlayer = level->getNearestPlayer(shared_from_this(), 5.0); + shared_ptr nearestPlayer = level->getNearestPlayer(shared_from_this(), 5.0); return nearestPlayer == NULL; } return false; diff --git a/Minecraft.World/Silverfish.h b/Minecraft.World/Silverfish.h index 34d10842..0fd0cc06 100644 --- a/Minecraft.World/Silverfish.h +++ b/Minecraft.World/Silverfish.h @@ -17,7 +17,7 @@ public: protected: virtual bool makeStepSound(); - virtual std::shared_ptr findAttackTarget(); + virtual shared_ptr findAttackTarget(); virtual int getAmbientSound(); virtual int getHurtSound(); @@ -27,7 +27,7 @@ public: virtual bool hurt(DamageSource *source, int dmg); protected: - virtual void checkHurtTarget(std::shared_ptr target, float d); + virtual void checkHurtTarget(shared_ptr target, float d); virtual void playStepSound(int xt, int yt, int zt, int t); virtual int getDeathLoot(); diff --git a/Minecraft.World/SimpleContainer.cpp b/Minecraft.World/SimpleContainer.cpp index 20c253dc..e29bc790 100644 --- a/Minecraft.World/SimpleContainer.cpp +++ b/Minecraft.World/SimpleContainer.cpp @@ -34,24 +34,24 @@ void SimpleContainer::removeListener(net_minecraft_world::ContainerListener *lis listeners->erase( it ); } -std::shared_ptr SimpleContainer::getItem(unsigned int slot) +shared_ptr SimpleContainer::getItem(unsigned int slot) { return (*items)[slot]; } -std::shared_ptr SimpleContainer::removeItem(unsigned int slot, int count) +shared_ptr SimpleContainer::removeItem(unsigned int slot, int count) { if ((*items)[slot] != NULL) { if ((*items)[slot]->count <= count) { - std::shared_ptr item = (*items)[slot]; + shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; this->setChanged(); return item; } else { - std::shared_ptr i = (*items)[slot]->remove(count); + shared_ptr i = (*items)[slot]->remove(count); if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; this->setChanged(); return i; @@ -60,18 +60,18 @@ std::shared_ptr SimpleContainer::removeItem(unsigned int slot, int return nullptr; } -std::shared_ptr SimpleContainer::removeItemNoUpdate(int slot) +shared_ptr SimpleContainer::removeItemNoUpdate(int slot) { if ((*items)[slot] != NULL) { - std::shared_ptr item = (*items)[slot]; + shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; return item; } return nullptr; } -void SimpleContainer::setItem(unsigned int slot, std::shared_ptr item) +void SimpleContainer::setItem(unsigned int slot, shared_ptr item) { (*items)[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); @@ -104,7 +104,7 @@ void SimpleContainer::setChanged() #endif } -bool SimpleContainer::stillValid(std::shared_ptr player) +bool SimpleContainer::stillValid(shared_ptr player) { return true; } \ No newline at end of file diff --git a/Minecraft.World/SimpleContainer.h b/Minecraft.World/SimpleContainer.h index 1dfade29..98c193d3 100644 --- a/Minecraft.World/SimpleContainer.h +++ b/Minecraft.World/SimpleContainer.h @@ -19,12 +19,12 @@ public: void removeListener(net_minecraft_world::ContainerListener *listener); - std::shared_ptr getItem(unsigned int slot); + shared_ptr getItem(unsigned int slot); - std::shared_ptr removeItem(unsigned int slot, int count); - std::shared_ptr removeItemNoUpdate(int slot); + shared_ptr removeItem(unsigned int slot, int count); + shared_ptr removeItemNoUpdate(int slot); - void setItem(unsigned int slot, std::shared_ptr item); + void setItem(unsigned int slot, shared_ptr item); unsigned int getContainerSize(); @@ -34,7 +34,7 @@ public: void setChanged(); - bool stillValid(std::shared_ptr player); + bool stillValid(shared_ptr player); void startOpen() { } // TODO Auto-generated method stub void stopOpen() { } // TODO Auto-generated method stub diff --git a/Minecraft.World/SitGoal.cpp b/Minecraft.World/SitGoal.cpp index b01bb86a..90180201 100644 --- a/Minecraft.World/SitGoal.cpp +++ b/Minecraft.World/SitGoal.cpp @@ -20,7 +20,7 @@ bool SitGoal::canUse() if (mob->isInWater()) return false; if (!mob->onGround) return false; - std::shared_ptr owner = mob->getOwner(); + shared_ptr owner = mob->getOwner(); if (owner == NULL) return true; // owner not on level if (mob->distanceToSqr(owner) < FollowOwnerGoal::TeleportDistance * FollowOwnerGoal::TeleportDistance && owner->getLastHurtByMob() != NULL) return false; diff --git a/Minecraft.World/Skeleton.cpp b/Minecraft.World/Skeleton.cpp index 4f28327c..b6dbab1f 100644 --- a/Minecraft.World/Skeleton.cpp +++ b/Minecraft.World/Skeleton.cpp @@ -53,7 +53,7 @@ int Skeleton::getMaxHealth() return 20; } -int Skeleton::getAmbientSound() +int Skeleton::getAmbientSound() { return eSoundType_MOB_SKELETON_AMBIENT; } @@ -63,19 +63,19 @@ int Skeleton::getHurtSound() return eSoundType_MOB_SKELETON_HURT; } -int Skeleton::getDeathSound() +int Skeleton::getDeathSound() { return eSoundType_MOB_SKELETON_HURT; } -std::shared_ptr Skeleton::bow; +shared_ptr Skeleton::bow; -std::shared_ptr Skeleton::getCarriedItem() +shared_ptr Skeleton::getCarriedItem() { return bow; } -MobType Skeleton::getMobType() +MobType Skeleton::getMobType() { return UNDEAD; } @@ -83,7 +83,7 @@ MobType Skeleton::getMobType() void Skeleton::aiStep() { // isClientSide check brought forward from 1.8 (I assume it's related to the lighting changes) - if (level->isDay() && !level->isClientSide) + if (level->isDay() && !level->isClientSide) { float br = getBrightness(1); if (br > 0.5f) @@ -101,7 +101,7 @@ void Skeleton::aiStep() void Skeleton::die(DamageSource *source) { Monster::die(source); - std::shared_ptr player = dynamic_pointer_cast( source->getEntity() ); + shared_ptr player = dynamic_pointer_cast( source->getEntity() ); if ( dynamic_pointer_cast( source->getDirectEntity() ) != NULL && player != NULL) { double xd = player->x - x; @@ -113,7 +113,7 @@ void Skeleton::die(DamageSource *source) } } -int Skeleton::getDeathLoot() +int Skeleton::getDeathLoot() { return Item::arrow->id; } @@ -122,7 +122,7 @@ void Skeleton::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) { // drop some arrows int count = random->nextInt(3 + playerBonusLevel); - for (int i = 0; i < count; i++) + for (int i = 0; i < count; i++) { spawnAtLocation(Item::arrow->id, 1); } @@ -138,7 +138,7 @@ void Skeleton::dropRareDeathLoot(int rareLootLevel) { if (rareLootLevel > 0) { - std::shared_ptr bow = std::shared_ptr( new ItemInstance(Item::bow) ); + shared_ptr bow = shared_ptr( new ItemInstance(Item::bow) ); EnchantmentHelper::enchantItem(random, bow, 5); spawnAtLocation(bow, 0); } @@ -150,5 +150,5 @@ void Skeleton::dropRareDeathLoot(int rareLootLevel) void Skeleton::staticCtor() { - Skeleton::bow = std::shared_ptr( new ItemInstance(Item::bow, 1) ); + Skeleton::bow = shared_ptr( new ItemInstance(Item::bow, 1) ); } diff --git a/Minecraft.World/Skeleton.h b/Minecraft.World/Skeleton.h index d5760e9a..b85d9afe 100644 --- a/Minecraft.World/Skeleton.h +++ b/Minecraft.World/Skeleton.h @@ -20,7 +20,7 @@ protected: virtual int getDeathSound(); public: - virtual std::shared_ptr getCarriedItem(); + virtual shared_ptr getCarriedItem(); virtual MobType getMobType(); virtual void aiStep(); virtual void die(DamageSource *source); @@ -31,7 +31,7 @@ protected: virtual void dropRareDeathLoot(int rareLootLevel); private: - static std::shared_ptr bow; + static shared_ptr bow; public: diff --git a/Minecraft.World/SkullItem.cpp b/Minecraft.World/SkullItem.cpp index 36825d9f..643021dc 100644 --- a/Minecraft.World/SkullItem.cpp +++ b/Minecraft.World/SkullItem.cpp @@ -18,7 +18,7 @@ SkullItem::SkullItem(int id) : Item(id) setStackedByData(true); } -bool SkullItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) //float clickX, float clickY, float clickZ) +bool SkullItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) //float clickX, float clickY, float clickZ) { if (face == 0) return false; if (!level->getMaterial(x, y, z)->isSolid()) return false; @@ -45,8 +45,8 @@ bool SkullItem::useOn(std::shared_ptr instance, std::shared_ptryRot) * 16) / 360 + 0.5) & 15; } - std::shared_ptr skullTE = level->getTileEntity(x, y, z); - std::shared_ptr skull = dynamic_pointer_cast(skullTE); + shared_ptr skullTE = level->getTileEntity(x, y, z); + shared_ptr skull = dynamic_pointer_cast(skullTE); if (skull != NULL) { @@ -65,7 +65,7 @@ bool SkullItem::useOn(std::shared_ptr instance, std::shared_ptr player, std::shared_ptr item) +bool SkullItem::mayPlace(Level *level, int x, int y, int z, int face, shared_ptr player, shared_ptr item) { int currentTile = level->getTile(x, y, z); if (currentTile == Tile::topSnow_Id) @@ -108,7 +108,7 @@ unsigned int SkullItem::getDescriptionId(int iData) return NAMES[iData]; } -unsigned int SkullItem::getDescriptionId(std::shared_ptr instance) +unsigned int SkullItem::getDescriptionId(shared_ptr instance) { int auxValue = instance->getAuxValue(); if (auxValue < 0 || auxValue >= SKULL_COUNT) @@ -118,7 +118,7 @@ unsigned int SkullItem::getDescriptionId(std::shared_ptr instance) return NAMES[auxValue]; } -wstring SkullItem::getHoverName(std::shared_ptr itemInstance) +wstring SkullItem::getHoverName(shared_ptr itemInstance) { #if 0 if (itemInstance->getAuxValue() == SkullTileEntity::TYPE_CHAR && itemInstance->hasTag() && itemInstance->getTag()->contains(L"SkullOwner")) diff --git a/Minecraft.World/SkullItem.h b/Minecraft.World/SkullItem.h index 2cd828e9..fc23be2f 100644 --- a/Minecraft.World/SkullItem.h +++ b/Minecraft.World/SkullItem.h @@ -18,12 +18,12 @@ private: public: SkullItem(int id); - bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - bool mayPlace(Level *level, int x, int y, int z, int face, std::shared_ptr player, std::shared_ptr item); + bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + bool mayPlace(Level *level, int x, int y, int z, int face, shared_ptr player, shared_ptr item); Icon *getIcon(int itemAuxValue); int getLevelDataForAuxValue(int auxValue); virtual unsigned int getDescriptionId(int iData = -1); - unsigned int getDescriptionId(std::shared_ptr instance); - wstring getHoverName(std::shared_ptr itemInstance); + unsigned int getDescriptionId(shared_ptr instance); + wstring getHoverName(shared_ptr itemInstance); void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/SkullTile.cpp b/Minecraft.World/SkullTile.cpp index 38c47479..73aef0e1 100644 --- a/Minecraft.World/SkullTile.cpp +++ b/Minecraft.World/SkullTile.cpp @@ -25,7 +25,7 @@ bool SkullTile::isCubeShaped() return false; } -void SkullTile::updateShape(LevelSource *level, int x, int y, int z, int forceData , std::shared_ptr forceEntity) +void SkullTile::updateShape(LevelSource *level, int x, int y, int z, int forceData , shared_ptr forceEntity) { int data = level->getData(x, y, z) & PLACEMENT_MASK; @@ -56,15 +56,15 @@ AABB *SkullTile::getAABB(Level *level, int x, int y, int z) return EntityTile::getAABB(level, x, y, z); } -void SkullTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void SkullTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = Mth::floor(by->yRot * 4 / (360) + 2.5) & 3; level->setData(x, y, z, dir); } -std::shared_ptr SkullTile::newTileEntity(Level *level) +shared_ptr SkullTile::newTileEntity(Level *level) { - return std::shared_ptr(new SkullTileEntity()); + return shared_ptr(new SkullTileEntity()); } int SkullTile::cloneTileId(Level *level, int x, int y, int z) @@ -74,8 +74,8 @@ int SkullTile::cloneTileId(Level *level, int x, int y, int z) int SkullTile::cloneTileData(Level *level, int x, int y, int z) { - std::shared_ptr tileEntity = level->getTileEntity(x, y, z); - std::shared_ptr skull = dynamic_pointer_cast(tileEntity); + shared_ptr tileEntity = level->getTileEntity(x, y, z); + shared_ptr skull = dynamic_pointer_cast(tileEntity); if (skull != NULL) { return skull->getSkullType(); @@ -96,7 +96,7 @@ void SkullTile::spawnResources(Level *level, int x, int y, int z, int data, floa // ... because the tile entity is removed prior to spawnResources } -void SkullTile::playerWillDestroy(Level *level, int x, int y, int z, int data, std::shared_ptr player) +void SkullTile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player) { // 4J Stu - Not implemented #if 0 @@ -116,8 +116,8 @@ void SkullTile::onRemove(Level *level, int x, int y, int z)//, int id, int data) int data = level->getData(x, y, z); if ((data & NO_DROP_BIT) == 0) { - std::shared_ptr item = std::shared_ptr(new ItemInstance(Item::skull_Id, 1, cloneTileData(level, x, y, z))); - std::shared_ptr entity = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + shared_ptr item = shared_ptr(new ItemInstance(Item::skull_Id, 1, cloneTileData(level, x, y, z))); + shared_ptr entity = dynamic_pointer_cast(level->getTileEntity(x, y, z)); if (entity->getSkullType() == SkullTileEntity::TYPE_CHAR && !entity->getExtraType().empty()) { @@ -135,7 +135,7 @@ int SkullTile::getResource(int data, Random *random, int playerBonusLevel) return Item::skull_Id; } -void SkullTile::checkMobSpawn(Level *level, int x, int y, int z, std::shared_ptr placedSkull) +void SkullTile::checkMobSpawn(Level *level, int x, int y, int z, shared_ptr placedSkull) { // 4J Stu - Don't have Withers yet, so don't need this #if 0 @@ -244,8 +244,8 @@ bool SkullTile::isSkullAt(Level *level, int x, int y, int z, int skullType) { return false; } - std::shared_ptr te = level->getTileEntity(x, y, z); - std::shared_ptr skull = dynamic_pointer_cast(te); + shared_ptr te = level->getTileEntity(x, y, z); + shared_ptr skull = dynamic_pointer_cast(te); if (skull == NULL) { return false; diff --git a/Minecraft.World/SkullTile.h b/Minecraft.World/SkullTile.h index 0d33723f..1d514acd 100644 --- a/Minecraft.World/SkullTile.h +++ b/Minecraft.World/SkullTile.h @@ -21,18 +21,18 @@ public: int getRenderShape(); bool isSolidRender(bool isServerLevel = false); bool isCubeShaped(); - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); AABB *getAABB(Level *level, int x, int y, int z); - void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); - std::shared_ptr newTileEntity(Level *level); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + shared_ptr newTileEntity(Level *level); int cloneTileId(Level *level, int x, int y, int z); int cloneTileData(Level *level, int x, int y, int z); int getSpawnResourcesAuxValue(int data); void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); - void playerWillDestroy(Level *level, int x, int y, int z, int data, std::shared_ptr player); + void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player); void onRemove(Level *level, int x, int y, int z); //, int id, int data); int getResource(int data, Random *random, int playerBonusLevel); - void checkMobSpawn(Level *level, int x, int y, int z, std::shared_ptr placedSkull); + void checkMobSpawn(Level *level, int x, int y, int z, shared_ptr placedSkull); private: bool isSkullAt(Level *level, int x, int y, int z, int skullType); diff --git a/Minecraft.World/SkullTileEntity.cpp b/Minecraft.World/SkullTileEntity.cpp index e36f4e6a..ea19b446 100644 --- a/Minecraft.World/SkullTileEntity.cpp +++ b/Minecraft.World/SkullTileEntity.cpp @@ -26,11 +26,11 @@ void SkullTileEntity::load(CompoundTag *tag) if (tag->contains(L"ExtraType")) extraType = tag->getString(L"ExtraType"); } -std::shared_ptr SkullTileEntity::getUpdatePacket() +shared_ptr SkullTileEntity::getUpdatePacket() { CompoundTag *tag = new CompoundTag(); save(tag); - return std::shared_ptr(new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_SKULL, tag)); + return shared_ptr(new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_SKULL, tag)); } void SkullTileEntity::setSkullType(int skullType, const wstring &extra) @@ -60,11 +60,11 @@ wstring SkullTileEntity::getExtraType() } // 4J Added -std::shared_ptr SkullTileEntity::clone() +shared_ptr SkullTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new SkullTileEntity() ); + shared_ptr result = shared_ptr( new SkullTileEntity() ); TileEntity::clone(result); - + result->skullType = skullType; result->rotation = rotation; result->extraType = extraType; diff --git a/Minecraft.World/SkullTileEntity.h b/Minecraft.World/SkullTileEntity.h index db1580fa..4b24457b 100644 --- a/Minecraft.World/SkullTileEntity.h +++ b/Minecraft.World/SkullTileEntity.h @@ -24,7 +24,7 @@ public: void save(CompoundTag *tag); void load(CompoundTag *tag); - std::shared_ptr getUpdatePacket(); + shared_ptr getUpdatePacket(); void setSkullType(int skullType, const wstring &extra); int getSkullType(); int getRotation(); @@ -32,5 +32,5 @@ public: wstring getExtraType(); // 4J Added - virtual std::shared_ptr clone(); + virtual shared_ptr clone(); }; \ No newline at end of file diff --git a/Minecraft.World/Slime.cpp b/Minecraft.World/Slime.cpp index 47b64482..7941fbe0 100644 --- a/Minecraft.World/Slime.cpp +++ b/Minecraft.World/Slime.cpp @@ -116,7 +116,7 @@ void Slime::tick() level->addParticle(getParticleName(), x + xd, bb->y0, z + zd, 0, 0, 0); } - if (doPlayLandSound()) + if (doPlayLandSound()) { level->playSound(shared_from_this(), getSquishSound(), getSoundVolume(), ((random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f) / 0.8f); } @@ -130,15 +130,15 @@ void Slime::tick() decreaseSquish(); } -void Slime::serverAiStep() +void Slime::serverAiStep() { checkDespawn(); - std::shared_ptr player = level->getNearestAttackablePlayer(shared_from_this(), 16); + shared_ptr player = level->getNearestAttackablePlayer(shared_from_this(), 16); if (player != NULL) { lookAt(player, 10, 20); } - if (onGround && jumpDelay-- <= 0) + if (onGround && jumpDelay-- <= 0) { jumpDelay = getJumpDelay(); if (player != NULL) @@ -155,7 +155,7 @@ void Slime::serverAiStep() //targetSquish = 1; xxa = 1 - random->nextFloat() * 2; yya = (float) 1 * getSize(); - } + } else { jumping = false; @@ -176,9 +176,9 @@ int Slime::getJumpDelay() return random->nextInt(20) + 10; } -std::shared_ptr Slime::createChild() +shared_ptr Slime::createChild() { - return std::shared_ptr( new Slime(level) ); + return shared_ptr( new Slime(level) ); } void Slime::remove() @@ -196,7 +196,7 @@ void Slime::remove() { float xd = (i % 2 - 0.5f) * size / 4.0f; float zd = (i / 2 - 0.5f) * size / 4.0f; - std::shared_ptr slime = createChild(); + shared_ptr slime = createChild(); slime->setSize(size / 2); slime->moveTo(x + xd, y + 0.5, z + zd, random->nextFloat() * 360, 0); level->addEntity(slime); @@ -206,7 +206,7 @@ void Slime::remove() Mob::remove(); } -void Slime::playerTouch(std::shared_ptr player) +void Slime::playerTouch(shared_ptr player) { if (isDealsDamage()) { @@ -233,7 +233,7 @@ int Slime::getAttackDamage() return getSize(); } -int Slime::getHurtSound() +int Slime::getHurtSound() { return eSoundType_MOB_SLIME; } @@ -266,7 +266,7 @@ bool Slime::canSpawn() return false; } -float Slime::getSoundVolume() +float Slime::getSoundVolume() { return 0.4f * getSize(); } diff --git a/Minecraft.World/Slime.h b/Minecraft.World/Slime.h index b9ea741f..6fa56056 100644 --- a/Minecraft.World/Slime.h +++ b/Minecraft.World/Slime.h @@ -27,7 +27,7 @@ private: public: Slime(Level *level); -protected: +protected: virtual void defineSynchedData(); public: @@ -50,11 +50,11 @@ protected: virtual void serverAiStep(); virtual void decreaseSquish(); virtual int getJumpDelay(); - virtual std::shared_ptr createChild(); + virtual shared_ptr createChild(); public: virtual void remove(); - virtual void playerTouch(std::shared_ptr player); + virtual void playerTouch(shared_ptr player); protected: virtual bool isDealsDamage(); diff --git a/Minecraft.World/Slot.cpp b/Minecraft.World/Slot.cpp index 1f7415f2..30fd9125 100644 --- a/Minecraft.World/Slot.cpp +++ b/Minecraft.World/Slot.cpp @@ -5,7 +5,7 @@ #include "net.minecraft.world.item.crafting.h" #include "Slot.h" -Slot::Slot(std::shared_ptr container, int slot, int x, int y) : container( container ), slot( slot ) +Slot::Slot(shared_ptr container, int slot, int x, int y) : container( container ), slot( slot ) { this->x = x; this->y = y; @@ -13,7 +13,7 @@ Slot::Slot(std::shared_ptr container, int slot, int x, int y) : conta this->index = 0; } -void Slot::onQuickCraft(std::shared_ptr picked, std::shared_ptr original) +void Slot::onQuickCraft(shared_ptr picked, shared_ptr original) { if (picked == NULL || original == NULL) { @@ -31,18 +31,18 @@ void Slot::onQuickCraft(std::shared_ptr picked, std::shared_ptr picked, int count) +void Slot::onQuickCraft(shared_ptr picked, int count) { } -void Slot::checkTakeAchievements(std::shared_ptr picked) +void Slot::checkTakeAchievements(shared_ptr picked) { } void Slot::swap(Slot *other) { - std::shared_ptr item1 = container->getItem(slot); - std::shared_ptr item2 = other->container->getItem(other->slot); + shared_ptr item1 = container->getItem(slot); + shared_ptr item2 = other->container->getItem(other->slot); if (item1 != NULL && item1->count > other->getMaxStackSize()) { @@ -60,17 +60,17 @@ void Slot::swap(Slot *other) setChanged(); } -void Slot::onTake(std::shared_ptr player, std::shared_ptr carried) +void Slot::onTake(shared_ptr player, shared_ptr carried) { setChanged(); } -bool Slot::mayPlace(std::shared_ptr item) +bool Slot::mayPlace(shared_ptr item) { return true; } -std::shared_ptr Slot::getItem() +shared_ptr Slot::getItem() { return container->getItem(slot); } @@ -80,7 +80,7 @@ bool Slot::hasItem() return getItem() != NULL; } -void Slot::set(std::shared_ptr item) +void Slot::set(shared_ptr item) { container->setItem(slot, item); setChanged(); @@ -101,24 +101,24 @@ Icon *Slot::getNoItemIcon() return NULL; } -std::shared_ptr Slot::remove(int c) +shared_ptr Slot::remove(int c) { return container->removeItem(slot, c); } -bool Slot::isAt(std::shared_ptr c, int s) +bool Slot::isAt(shared_ptr c, int s) { return c == container && s == slot; } -bool Slot::mayPickup(std::shared_ptr player) +bool Slot::mayPickup(shared_ptr player) { return true; } -bool Slot::mayCombine(std::shared_ptr second) +bool Slot::mayCombine(shared_ptr second) { - std::shared_ptr first = getItem(); + shared_ptr first = getItem(); if(first == NULL || second == NULL) return false; @@ -138,12 +138,12 @@ bool Slot::mayCombine(std::shared_ptr second) return false; } -std::shared_ptr Slot::combine(std::shared_ptr item) +shared_ptr Slot::combine(shared_ptr item) { - std::shared_ptr result = nullptr; - std::shared_ptr first = getItem(); + shared_ptr result = nullptr; + shared_ptr first = getItem(); - std::shared_ptr craftSlots = std::shared_ptr( new CraftingContainer(NULL, 2, 2) ); + shared_ptr craftSlots = shared_ptr( new CraftingContainer(NULL, 2, 2) ); craftSlots->setItem(0, item); craftSlots->setItem(1, first); diff --git a/Minecraft.World/Slot.h b/Minecraft.World/Slot.h index 13827b5a..6289ec0e 100644 --- a/Minecraft.World/Slot.h +++ b/Minecraft.World/Slot.h @@ -8,34 +8,34 @@ private: int slot; public: - std::shared_ptr container; + shared_ptr container; public: int index; int x, y; - Slot(std::shared_ptr container, int slot, int x, int y); + Slot(shared_ptr container, int slot, int x, int y); virtual ~Slot() {} - void onQuickCraft(std::shared_ptr picked, std::shared_ptr original); + void onQuickCraft(shared_ptr picked, shared_ptr original); protected: - virtual void onQuickCraft(std::shared_ptr picked, int count); - virtual void checkTakeAchievements(std::shared_ptr picked); + virtual void onQuickCraft(shared_ptr picked, int count); + virtual void checkTakeAchievements(shared_ptr picked); public: void swap(Slot *other); - virtual void onTake(std::shared_ptr player, std::shared_ptr carried); - virtual bool mayPlace(std::shared_ptr item); - virtual std::shared_ptr getItem(); + virtual void onTake(shared_ptr player, shared_ptr carried); + virtual bool mayPlace(shared_ptr item); + virtual shared_ptr getItem(); virtual bool hasItem(); - virtual void set(std::shared_ptr item); + virtual void set(shared_ptr item); virtual void setChanged(); virtual int getMaxStackSize(); virtual Icon *getNoItemIcon(); - virtual std::shared_ptr remove(int c); - virtual bool isAt(std::shared_ptr c, int s); - virtual bool mayPickup(std::shared_ptr player); - virtual bool mayCombine(std::shared_ptr item); // 4J Added - virtual std::shared_ptr combine(std::shared_ptr item); // 4J Added + virtual shared_ptr remove(int c); + virtual bool isAt(shared_ptr c, int s); + virtual bool mayPickup(shared_ptr player); + virtual bool mayCombine(shared_ptr item); // 4J Added + virtual shared_ptr combine(shared_ptr item); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/SmallFireball.cpp b/Minecraft.World/SmallFireball.cpp index be84e82c..a1fa5cb1 100644 --- a/Minecraft.World/SmallFireball.cpp +++ b/Minecraft.World/SmallFireball.cpp @@ -11,7 +11,7 @@ SmallFireball::SmallFireball(Level *level) : Fireball(level) setSize(5 / 16.0f, 5 / 16.0f); } -SmallFireball::SmallFireball(Level *level, std::shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) +SmallFireball::SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) { setSize(5 / 16.0f, 5 / 16.0f); } diff --git a/Minecraft.World/SmallFireball.h b/Minecraft.World/SmallFireball.h index 3b63e2e0..38ad8efd 100644 --- a/Minecraft.World/SmallFireball.h +++ b/Minecraft.World/SmallFireball.h @@ -12,7 +12,7 @@ public: public: SmallFireball(Level *level); - SmallFireball(Level *level, std::shared_ptr mob, double xa, double ya, double za); + SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za); SmallFireball(Level *level, double x, double y, double z, double xa, double ya, double za); protected: diff --git a/Minecraft.World/SmoothLayer.cpp b/Minecraft.World/SmoothLayer.cpp index 698a9428..e94ae36d 100644 --- a/Minecraft.World/SmoothLayer.cpp +++ b/Minecraft.World/SmoothLayer.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.level.newbiome.layer.h" -SmoothLayer::SmoothLayer(int64_t seedMixup, std::shared_ptrparent) : Layer(seedMixup) +SmoothLayer::SmoothLayer(int64_t seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/SmoothLayer.h b/Minecraft.World/SmoothLayer.h index a6ac07d8..14e3d152 100644 --- a/Minecraft.World/SmoothLayer.h +++ b/Minecraft.World/SmoothLayer.h @@ -5,7 +5,7 @@ class SmoothLayer : public Layer { public: - SmoothLayer(int64_t seedMixup, std::shared_ptrparent); + SmoothLayer(int64_t seedMixup, shared_ptrparent); virtual intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/SmoothStoneBrickTileItem.cpp b/Minecraft.World/SmoothStoneBrickTileItem.cpp index 7d18bfc0..e0326130 100644 --- a/Minecraft.World/SmoothStoneBrickTileItem.cpp +++ b/Minecraft.World/SmoothStoneBrickTileItem.cpp @@ -21,7 +21,7 @@ int SmoothStoneBrickTileItem::getLevelDataForAuxValue(int auxValue) return auxValue; } -unsigned int SmoothStoneBrickTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int SmoothStoneBrickTileItem::getDescriptionId(shared_ptr instance) { int auxValue = instance->getAuxValue(); if (auxValue < 0 || auxValue >= SmoothStoneBrickTile::SMOOTH_STONE_BRICK_NAMES_LENGTH) diff --git a/Minecraft.World/SmoothStoneBrickTileItem.h b/Minecraft.World/SmoothStoneBrickTileItem.h index 94f71ec0..18b640a3 100644 --- a/Minecraft.World/SmoothStoneBrickTileItem.h +++ b/Minecraft.World/SmoothStoneBrickTileItem.h @@ -13,5 +13,5 @@ public: virtual Icon *getIcon(int itemAuxValue); virtual int getLevelDataForAuxValue(int auxValue); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; \ No newline at end of file diff --git a/Minecraft.World/SmoothZoomLayer.cpp b/Minecraft.World/SmoothZoomLayer.cpp index 66429658..2df34a3b 100644 --- a/Minecraft.World/SmoothZoomLayer.cpp +++ b/Minecraft.World/SmoothZoomLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.newbiome.layer.h" #include "System.h" -SmoothZoomLayer::SmoothZoomLayer(int64_t seedMixup, std::shared_ptrparent) : Layer(seedMixup) +SmoothZoomLayer::SmoothZoomLayer(int64_t seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } @@ -50,12 +50,12 @@ intArray SmoothZoomLayer::getArea(int xo, int yo, int w, int h) return result; } -std::shared_ptrSmoothZoomLayer::zoom(int64_t seed, std::shared_ptrsup, int count) +shared_ptrSmoothZoomLayer::zoom(int64_t seed, shared_ptrsup, int count) { - std::shared_ptrresult = sup; + shared_ptrresult = sup; for (int i = 0; i < count; i++) { - result = std::shared_ptr(new SmoothZoomLayer(seed + i, result)); + result = shared_ptr(new SmoothZoomLayer(seed + i, result)); } return result; } \ No newline at end of file diff --git a/Minecraft.World/SmoothZoomLayer.h b/Minecraft.World/SmoothZoomLayer.h index 59d81f40..90cc292e 100644 --- a/Minecraft.World/SmoothZoomLayer.h +++ b/Minecraft.World/SmoothZoomLayer.h @@ -5,8 +5,8 @@ class SmoothZoomLayer : public Layer { public: - SmoothZoomLayer(int64_t seedMixup, std::shared_ptrparent); + SmoothZoomLayer(int64_t seedMixup, shared_ptrparent); virtual intArray getArea(int xo, int yo, int w, int h); - static std::shared_ptrzoom(int64_t seed, std::shared_ptrsup, int count); + static shared_ptrzoom(int64_t seed, shared_ptrsup, int count); }; \ No newline at end of file diff --git a/Minecraft.World/Snowball.cpp b/Minecraft.World/Snowball.cpp index 37983a68..cdcefb1b 100644 --- a/Minecraft.World/Snowball.cpp +++ b/Minecraft.World/Snowball.cpp @@ -19,7 +19,7 @@ Snowball::Snowball(Level *level) : Throwable(level) _init(); } -Snowball::Snowball(Level *level, std::shared_ptr mob) : Throwable(level,mob) +Snowball::Snowball(Level *level, shared_ptr mob) : Throwable(level,mob) { _init(); } diff --git a/Minecraft.World/Snowball.h b/Minecraft.World/Snowball.h index d3ccfa1d..82971726 100644 --- a/Minecraft.World/Snowball.h +++ b/Minecraft.World/Snowball.h @@ -16,7 +16,7 @@ private: public: Snowball(Level *level); - Snowball(Level *level, std::shared_ptr mob); + Snowball(Level *level, shared_ptr mob); Snowball(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/SnowballItem.cpp b/Minecraft.World/SnowballItem.cpp index 706cd75d..41dd2b7c 100644 --- a/Minecraft.World/SnowballItem.cpp +++ b/Minecraft.World/SnowballItem.cpp @@ -11,13 +11,13 @@ SnowballItem::SnowballItem(int id) : Item(id) this->maxStackSize = 16; } -std::shared_ptr SnowballItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr SnowballItem::use(shared_ptr instance, Level *level, shared_ptr player) { if (!player->abilities.instabuild) { instance->count--; } - level->playSound((std::shared_ptr ) player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) level->addEntity( std::shared_ptr( new Snowball(level, player) ) ); + level->playSound((shared_ptr ) player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + if (!level->isClientSide) level->addEntity( shared_ptr( new Snowball(level, player) ) ); return instance; } \ No newline at end of file diff --git a/Minecraft.World/SnowballItem.h b/Minecraft.World/SnowballItem.h index 97680968..bf2d20cb 100644 --- a/Minecraft.World/SnowballItem.h +++ b/Minecraft.World/SnowballItem.h @@ -8,5 +8,5 @@ class SnowballItem : public Item public: SnowballItem(int id); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/Spider.cpp b/Minecraft.World/Spider.cpp index a80543e4..ba58ce54 100644 --- a/Minecraft.World/Spider.cpp +++ b/Minecraft.World/Spider.cpp @@ -61,13 +61,13 @@ bool Spider::makeStepSound() return false; } -std::shared_ptr Spider::findAttackTarget() +shared_ptr Spider::findAttackTarget() { #ifndef _FINAL_BUILD #ifdef _DEBUG_MENUS_ENABLED if(app.GetMobsDontAttackEnabled()) { - return std::shared_ptr(); + return shared_ptr(); } #endif #endif @@ -78,7 +78,7 @@ std::shared_ptr Spider::findAttackTarget() double maxDist = 16; return level->getNearestAttackablePlayer(shared_from_this(), maxDist); } - return std::shared_ptr(); + return shared_ptr(); } int Spider::getAmbientSound() @@ -96,7 +96,7 @@ int Spider::getDeathSound() return eSoundType_MOB_SPIDER_DEATH; } -void Spider::checkHurtTarget(std::shared_ptr target, float d) +void Spider::checkHurtTarget(shared_ptr target, float d) { float br = getBrightness(1); if (br > 0.5f && random->nextInt(100) == 0) @@ -107,7 +107,7 @@ void Spider::checkHurtTarget(std::shared_ptr target, float d) if (d > 2 && d < 6 && random->nextInt(10) == 0) { - if (onGround) + if (onGround) { double xdd = target->x - x; double zdd = target->z - z; @@ -116,7 +116,7 @@ void Spider::checkHurtTarget(std::shared_ptr target, float d) zd = (zdd / dd * 0.5f) * 0.8f + zd * 0.2f; yd = 0.4f; } - } + } else { Monster::checkHurtTarget(target, d); @@ -143,11 +143,11 @@ void Spider::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) * to climb walls. */ -bool Spider::onLadder() +bool Spider::onLadder() { return isClimbing(); } - + void Spider::makeStuckInWeb() { // do nothing - spiders don't get stuck in web diff --git a/Minecraft.World/Spider.h b/Minecraft.World/Spider.h index e73555cc..f0257d6c 100644 --- a/Minecraft.World/Spider.h +++ b/Minecraft.World/Spider.h @@ -25,17 +25,17 @@ public: protected: virtual bool makeStepSound(); - virtual std::shared_ptr findAttackTarget(); + virtual shared_ptr findAttackTarget(); virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); - virtual void checkHurtTarget(std::shared_ptr target, float d); + virtual void checkHurtTarget(shared_ptr target, float d); virtual int getDeathLoot(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: virtual bool onLadder(); - + virtual void makeStuckInWeb(); virtual float getModelScale(); virtual MobType getMobType(); diff --git a/Minecraft.World/SpikeFeature.cpp b/Minecraft.World/SpikeFeature.cpp index cb24e457..e8886d00 100644 --- a/Minecraft.World/SpikeFeature.cpp +++ b/Minecraft.World/SpikeFeature.cpp @@ -26,7 +26,7 @@ bool SpikeFeature::place(Level *level, Random *random, int x, int y, int z) int zd = zz - z; if (xd * xd + zd * zd <= r * r + 1) { - if (level->getTile(xx, y - 1, zz) != tile) + if (level->getTile(xx, y - 1, zz) != tile) { return false; } @@ -50,7 +50,7 @@ bool SpikeFeature::place(Level *level, Random *random, int x, int y, int z) } else break; } - std::shared_ptr enderCrystal = std::shared_ptr(new EnderCrystal(level)); + shared_ptr enderCrystal = shared_ptr(new EnderCrystal(level)); enderCrystal->moveTo(x + 0.5f, y + hh, z + 0.5f, random->nextFloat() * 360, 0); level->addEntity(enderCrystal); level->setTile(x, y + hh, z, Tile::unbreakable_Id); @@ -111,8 +111,8 @@ bool SpikeFeature::placeWithIndex(Level *level, Random *random, int x, int y, in } } } - } - else + } + else { app.DebugPrintf("Breaking out of spike feature\n"); break; @@ -145,8 +145,8 @@ bool SpikeFeature::placeWithIndex(Level *level, Random *random, int x, int y, in } } } - } - else + } + else { app.DebugPrintf("Breaking out of spike feature\n"); break; @@ -155,7 +155,7 @@ bool SpikeFeature::placeWithIndex(Level *level, Random *random, int x, int y, in // and cap off the top int yy = y + hh + 3; - + if (yy < Level::genDepth) { for (int xx = x - 2; xx <= x + 2; xx++) @@ -168,7 +168,7 @@ bool SpikeFeature::placeWithIndex(Level *level, Random *random, int x, int y, in } } - std::shared_ptr enderCrystal = std::shared_ptr(new EnderCrystal(level)); + shared_ptr enderCrystal = shared_ptr(new EnderCrystal(level)); enderCrystal->moveTo(x + 0.5f, y + hh, z + 0.5f, random->nextFloat() * 360, 0); level->addEntity(enderCrystal); placeBlock(level, x, y + hh, z, Tile::unbreakable_Id, 0); diff --git a/Minecraft.World/Squid.cpp b/Minecraft.World/Squid.cpp index 06d0318d..3e36777c 100644 --- a/Minecraft.World/Squid.cpp +++ b/Minecraft.World/Squid.cpp @@ -47,27 +47,27 @@ int Squid::getMaxHealth() return 10; } -int Squid::getAmbientSound() +int Squid::getAmbientSound() { return -1; } -int Squid::getHurtSound() +int Squid::getHurtSound() { return -1; } -int Squid::getDeathSound() +int Squid::getDeathSound() { return -1; } -float Squid::getSoundVolume() +float Squid::getSoundVolume() { return 0.4f; } -int Squid::getDeathLoot() +int Squid::getDeathLoot() { return 0; } @@ -75,18 +75,18 @@ int Squid::getDeathLoot() void Squid::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) { int count = random->nextInt(3 + playerBonusLevel) + 1; - for (int i = 0; i < count; i++) + for (int i = 0; i < count; i++) { - spawnAtLocation(std::shared_ptr( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLACK) ), 0.0f); + spawnAtLocation(shared_ptr( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLACK) ), 0.0f); } } -bool Squid::isInWater() +bool Squid::isInWater() { return level->checkAndHandleWater(bb->grow(0, -0.6f, 0), Material::water, shared_from_this() ); } -void Squid::aiStep() +void Squid::aiStep() { WaterAnimal::aiStep(); @@ -97,37 +97,37 @@ void Squid::aiStep() oldTentacleAngle = tentacleAngle; tentacleMovement += tentacleSpeed; - if (tentacleMovement > (float) PI * 2.0f) + if (tentacleMovement > (float) PI * 2.0f) { tentacleMovement -= (float) PI * 2.0f; if (random->nextInt(10) == 0) tentacleSpeed = 1 / (random->nextFloat() + 1) * 0.2f; } - if (isInWater()) + if (isInWater()) { - if (tentacleMovement < PI) + if (tentacleMovement < PI) { float tentacleScale = tentacleMovement / PI; tentacleAngle = Mth::sin(tentacleScale * tentacleScale * PI) * PI * 0.25f; - if (tentacleScale > .75) + if (tentacleScale > .75) { speed = 1.0f; rotateSpeed = 1.0f; - } - else + } + else { rotateSpeed = rotateSpeed * 0.8f; } - } - else + } + else { tentacleAngle = 0.0f; speed = speed * 0.9f; rotateSpeed = rotateSpeed * 0.99f; } - if (!level->isClientSide) + if (!level->isClientSide) { xd = tx * speed; yd = ty * speed; @@ -141,11 +141,11 @@ void Squid::aiStep() zBodyRot = zBodyRot + (float) PI * rotateSpeed * 1.5f; xBodyRot += ((-(float) atan2(horizontalMovement, this->yd) * 180 / PI) - xBodyRot) * 0.1f; } - else + else { tentacleAngle = Mth::abs(Mth::sin(tentacleMovement)) * PI * 0.25f; - if (!level->isClientSide) + if (!level->isClientSide) { // unable to move, apply gravity xd = 0.0f; @@ -173,7 +173,7 @@ void Squid::serverAiStep() { tx = ty = tz = 0; } - else if (random->nextInt(50) == 0 || !wasInWater || (tx == 0 && ty == 0 && tz == 0)) + else if (random->nextInt(50) == 0 || !wasInWater || (tx == 0 && ty == 0 && tz == 0)) { float angle = random->nextFloat() * PI * 2.0f; tx = Mth::cos(angle) * 0.2f; diff --git a/Minecraft.World/StairTile.cpp b/Minecraft.World/StairTile.cpp index ca617494..7a80e9ff 100644 --- a/Minecraft.World/StairTile.cpp +++ b/Minecraft.World/StairTile.cpp @@ -22,7 +22,7 @@ StairTile::StairTile(int id, Tile *base,int basedata) : Tile(id, base->material, setLightBlock(255); } -void StairTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void StairTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { if (isClipping) { @@ -309,7 +309,7 @@ bool StairTile::setInnerPieceShape(LevelSource *level, int x, int y, int z) return hasInnerPiece; } -void StairTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void StairTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { setBaseShape(level, x, y, z); Tile::addAABBs(level, x, y, z, box, boxes, source); @@ -380,7 +380,7 @@ void StairTile::animateTick(Level *level, int x, int y, int z, Random *random) base->animateTick(level, x, y, z, random); } -void StairTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void StairTile::attack(Level *level, int x, int y, int z, shared_ptr player) { base->attack(level, x, y, z, player); } @@ -401,7 +401,7 @@ float StairTile::getBrightness(LevelSource *level, int x, int y, int z) return base->getBrightness(level, x, y, z); } -float StairTile::getExplosionResistance(std::shared_ptr source) +float StairTile::getExplosionResistance(shared_ptr source) { return base->getExplosionResistance(source); } @@ -426,7 +426,7 @@ AABB *StairTile::getTileAABB(Level *level, int x, int y, int z) return base->getTileAABB(level, x, y, z); } -void StairTile::handleEntityInside(Level *level, int x, int y, int z, std::shared_ptr e, Vec3 *current) +void StairTile::handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current) { base->handleEntityInside(level, x, y, z, e, current); } @@ -462,7 +462,7 @@ void StairTile::prepareRender(Level *level, int x, int y, int z) base->prepareRender(level, x, y, z); } -void StairTile::stepOn(Level *level, int x, int y, int z, std::shared_ptr entity) +void StairTile::stepOn(Level *level, int x, int y, int z, shared_ptr entity) { base->stepOn(level, x, y, z, entity); } @@ -479,7 +479,7 @@ void StairTile::tick(Level *level, int x, int y, int z, Random *random) // return true; //} -bool StairTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool StairTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if (soundOnly) return false; return base->use(level, x, y, z, player, 0, 0, 0, 0); @@ -490,7 +490,7 @@ void StairTile::wasExploded(Level *level, int x, int y, int z) base->wasExploded(level, x, y, z); } -void StairTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void StairTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = ( Mth::floor(by->yRot * 4 / (360) + 0.5) ) & 3; int usd = level->getData(x, y, z) & UPSIDEDOWN_BIT; diff --git a/Minecraft.World/StairTile.h b/Minecraft.World/StairTile.h index 33c5a30e..d4797f04 100644 --- a/Minecraft.World/StairTile.h +++ b/Minecraft.World/StairTile.h @@ -32,7 +32,7 @@ protected: StairTile(int id, Tile *base, int basedata); public: - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param bool isSolidRender(bool isServerLevel = false); bool isCubeShaped(); @@ -49,7 +49,7 @@ public: bool setStepShape(LevelSource *level, int x, int y, int z); bool setInnerPieceShape(LevelSource *level, int x, int y, int z); - void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); /** DELEGATES: **/ @@ -58,14 +58,14 @@ public: void animateTick(Level *level, int x, int y, int z, Random *random); - void attack(Level *level, int x, int y, int z, std::shared_ptr player); + void attack(Level *level, int x, int y, int z, shared_ptr player); void destroy(Level *level, int x, int y, int z, int data); int getLightColor(LevelSource *level, int x, int y, int z, int tileId = -1); float getBrightness(LevelSource *level, int x, int y, int z); - float getExplosionResistance(std::shared_ptr source); + float getExplosionResistance(shared_ptr source); int getRenderLayer(); @@ -75,7 +75,7 @@ public: AABB *getTileAABB(Level *level, int x, int y, int z); - void handleEntityInside(Level *level, int x, int y, int z, std::shared_ptr e, Vec3 *current); + void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); bool mayPick(); @@ -89,15 +89,15 @@ public: void prepareRender(Level *level, int x, int y, int z); - void stepOn(Level *level, int x, int y, int z, std::shared_ptr entity); + void stepOn(Level *level, int x, int y, int z, shared_ptr entity); void tick(Level *level, int x, int y, int z, Random *random); - bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param void wasExploded(Level *level, int x, int y, int z); - void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); diff --git a/Minecraft.World/Stat.h b/Minecraft.World/Stat.h index c9751d1c..3c2ab071 100644 --- a/Minecraft.World/Stat.h +++ b/Minecraft.World/Stat.h @@ -57,5 +57,5 @@ public: public: // 4J-JEV, for Durango stats - virtual void handleParamBlob(std::shared_ptr plr, byteArray param) { app.DebugPrintf("'Stat.h', Unhandled AwardStat blob.\n"); return; } + virtual void handleParamBlob(shared_ptr plr, byteArray param) { app.DebugPrintf("'Stat.h', Unhandled AwardStat blob.\n"); return; } }; diff --git a/Minecraft.World/StemTile.cpp b/Minecraft.World/StemTile.cpp index 7ddbacef..15c412eb 100644 --- a/Minecraft.World/StemTile.cpp +++ b/Minecraft.World/StemTile.cpp @@ -145,7 +145,7 @@ void StemTile::updateDefaultShape() this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, 0.25f, 0.5f + ss); } -void StemTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void StemTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); tls->yy1 = (level->getData(x, y, z) * 2 + 2) / 16.0f; @@ -192,7 +192,7 @@ void StemTile::spawnResources(Level *level, int x, int y, int z, int data, float float xo = level->random->nextFloat() * s + (1 - s) * 0.5f; float yo = level->random->nextFloat() * s + (1 - s) * 0.5f; float zo = level->random->nextFloat() * s + (1 - s) * 0.5f; - std::shared_ptr item = std::shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, std::shared_ptr(new ItemInstance(seed)))); + shared_ptr item = shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr(new ItemInstance(seed)))); item->throwTime = 10; level->addEntity(item); } diff --git a/Minecraft.World/StemTile.h b/Minecraft.World/StemTile.h index 2f726c17..ac4fc40c 100644 --- a/Minecraft.World/StemTile.h +++ b/Minecraft.World/StemTile.h @@ -29,7 +29,7 @@ public: virtual int getColor(LevelSource *level, int x, int y, int z); virtual void updateDefaultShape(); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual int getRenderShape(); int getConnectDir(LevelSource *level, int x, int y, int z); diff --git a/Minecraft.World/StoneMonsterTile.cpp b/Minecraft.World/StoneMonsterTile.cpp index ad5982f8..d3d6a846 100644 --- a/Minecraft.World/StoneMonsterTile.cpp +++ b/Minecraft.World/StoneMonsterTile.cpp @@ -41,7 +41,7 @@ void StoneMonsterTile::destroy(Level *level, int x, int y, int z, int data) // Also limit the amount of silverfish specifically if(level->countInstanceOf( eTYPE_SILVERFISH, true) < 15 ) { - std::shared_ptr silverfish = std::shared_ptr(new Silverfish(level)); + shared_ptr silverfish = shared_ptr(new Silverfish(level)); silverfish->moveTo(x + .5, y, z + .5, 0, 0); level->addEntity(silverfish); @@ -88,7 +88,7 @@ Tile *StoneMonsterTile::getHostBlockForData(int data) } } -std::shared_ptr StoneMonsterTile::getSilkTouchItemInstance(int data) +shared_ptr StoneMonsterTile::getSilkTouchItemInstance(int data) { Tile *tile = Tile::rock; if (data == HOST_COBBLE) @@ -99,7 +99,7 @@ std::shared_ptr StoneMonsterTile::getSilkTouchItemInstance(int dat { tile = Tile::stoneBrickSmooth; } - return std::shared_ptr(new ItemInstance(tile)); + return shared_ptr(new ItemInstance(tile)); } int StoneMonsterTile::cloneTileData(Level *level, int x, int y, int z) diff --git a/Minecraft.World/StoneMonsterTile.h b/Minecraft.World/StoneMonsterTile.h index 96063a14..9c0b58fd 100644 --- a/Minecraft.World/StoneMonsterTile.h +++ b/Minecraft.World/StoneMonsterTile.h @@ -31,7 +31,7 @@ public: virtual unsigned int getDescriptionId(int iData = -1); protected: - virtual std::shared_ptr getSilkTouchItemInstance(int data); + virtual shared_ptr getSilkTouchItemInstance(int data); public: int cloneTileData(Level *level, int x, int y, int z); diff --git a/Minecraft.World/StoneMonsterTileItem.cpp b/Minecraft.World/StoneMonsterTileItem.cpp index fd6f1ee4..4ecdf627 100644 --- a/Minecraft.World/StoneMonsterTileItem.cpp +++ b/Minecraft.World/StoneMonsterTileItem.cpp @@ -19,7 +19,7 @@ Icon *StoneMonsterTileItem::getIcon(int itemAuxValue) return Tile::monsterStoneEgg->getTexture(0, itemAuxValue); } -unsigned int StoneMonsterTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int StoneMonsterTileItem::getDescriptionId(shared_ptr instance) { int auxValue = instance->getAuxValue(); if (auxValue < 0 || auxValue >= StoneMonsterTile::STONE_MONSTER_NAMES_LENGTH) diff --git a/Minecraft.World/StoneMonsterTileItem.h b/Minecraft.World/StoneMonsterTileItem.h index 6a4ec228..bb12d2e1 100644 --- a/Minecraft.World/StoneMonsterTileItem.h +++ b/Minecraft.World/StoneMonsterTileItem.h @@ -12,5 +12,5 @@ public: virtual int getLevelDataForAuxValue(int auxValue); virtual Icon *getIcon(int itemAuxValue); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; \ No newline at end of file diff --git a/Minecraft.World/StoneSlabTile.cpp b/Minecraft.World/StoneSlabTile.cpp index 1a51ef11..5c8d8b07 100644 --- a/Minecraft.World/StoneSlabTile.cpp +++ b/Minecraft.World/StoneSlabTile.cpp @@ -32,7 +32,7 @@ Icon *StoneSlabTile::getTexture(int face, int data) case STONE_SLAB: if (face == Facing::UP || face == Facing::DOWN) return icon; return iconSide; - break; + break; case SAND_SLAB: return Tile::sandStone->getTexture(face); case WOOD_SLAB: @@ -48,7 +48,7 @@ Icon *StoneSlabTile::getTexture(int face, int data) case QUARTZ_SLAB: return Tile::quartzBlock->getTexture(face); } - + return icon; } @@ -69,16 +69,16 @@ unsigned int StoneSlabTile::getDescriptionId(int iData /*= -1*/) return StoneSlabTile::SLAB_NAMES[iData]; } -int StoneSlabTile::getAuxName(int auxValue) +int StoneSlabTile::getAuxName(int auxValue) { - if (auxValue < 0 || auxValue >= SLAB_NAMES_LENGTH) + if (auxValue < 0 || auxValue >= SLAB_NAMES_LENGTH) { auxValue = 0; } return SLAB_NAMES[auxValue];//super.getDescriptionId() + "." + SLAB_NAMES[auxValue]; } -std::shared_ptr StoneSlabTile::getSilkTouchItemInstance(int data) +shared_ptr StoneSlabTile::getSilkTouchItemInstance(int data) { - return std::shared_ptr(new ItemInstance(Tile::stoneSlabHalf_Id, 2, data & TYPE_MASK)); + return shared_ptr(new ItemInstance(Tile::stoneSlabHalf_Id, 2, data & TYPE_MASK)); } diff --git a/Minecraft.World/StoneSlabTile.h b/Minecraft.World/StoneSlabTile.h index 42972c40..4380b04c 100644 --- a/Minecraft.World/StoneSlabTile.h +++ b/Minecraft.World/StoneSlabTile.h @@ -35,5 +35,5 @@ public: virtual unsigned int getDescriptionId(int iData = -1); virtual int getAuxName(int auxValue); protected: - virtual std::shared_ptr getSilkTouchItemInstance(int data); + virtual shared_ptr getSilkTouchItemInstance(int data); }; \ No newline at end of file diff --git a/Minecraft.World/StoneSlabTileItem.cpp b/Minecraft.World/StoneSlabTileItem.cpp index 8113600e..ea636f65 100644 --- a/Minecraft.World/StoneSlabTileItem.cpp +++ b/Minecraft.World/StoneSlabTileItem.cpp @@ -17,24 +17,24 @@ StoneSlabTileItem::StoneSlabTileItem(int id, HalfSlabTile *halfTile, HalfSlabTil setStackedByData(true); } -Icon *StoneSlabTileItem::getIcon(int itemAuxValue) +Icon *StoneSlabTileItem::getIcon(int itemAuxValue) { return Tile::tiles[id]->getTexture(2, itemAuxValue); } -int StoneSlabTileItem::getLevelDataForAuxValue(int auxValue) +int StoneSlabTileItem::getLevelDataForAuxValue(int auxValue) { return auxValue; } -unsigned int StoneSlabTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int StoneSlabTileItem::getDescriptionId(shared_ptr instance) { return halfTile->getAuxName(instance->getAuxValue()); } -bool StoneSlabTileItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool StoneSlabTileItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { - if (isFull) + if (isFull) { return TileItem::useOn(instance, player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnOnly); } @@ -47,14 +47,14 @@ bool StoneSlabTileItem::useOn(std::shared_ptr instance, std::share int slabType = currentData & HalfSlabTile::TYPE_MASK; bool isUpper = (currentData & HalfSlabTile::TOP_SLOT_BIT) != 0; - if (((face == Facing::UP && !isUpper) || (face == Facing::DOWN && isUpper)) && currentTile == halfTile->id && slabType == instance->getAuxValue()) + if (((face == Facing::UP && !isUpper) || (face == Facing::DOWN && isUpper)) && currentTile == halfTile->id && slabType == instance->getAuxValue()) { if(bTestUseOnOnly) { return true; } - if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType)) + if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType)) { // level.playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile.soundType.getPlaceSound(), (fullTile.soundType.getVolume() + 1) / 2, fullTile.soundType.getPitch() * 0.8f); // instance.count--; @@ -62,19 +62,19 @@ bool StoneSlabTileItem::useOn(std::shared_ptr instance, std::share instance->count--; } return true; - } - else if (tryConvertTargetTile(instance, player, level, x, y, z, face, bTestUseOnOnly)) + } + else if (tryConvertTargetTile(instance, player, level, x, y, z, face, bTestUseOnOnly)) { return true; - } - else + } + else { return TileItem::useOn(instance, player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnOnly); } } -bool StoneSlabTileItem::mayPlace(Level *level, int x, int y, int z, int face,std::shared_ptr player, std::shared_ptr item) +bool StoneSlabTileItem::mayPlace(Level *level, int x, int y, int z, int face,shared_ptr player, shared_ptr item) { int ox = x, oy = y, oz = z; @@ -83,7 +83,7 @@ bool StoneSlabTileItem::mayPlace(Level *level, int x, int y, int z, int face,std int slabType = currentData & HalfSlabTile::TYPE_MASK; boolean isUpper = (currentData & HalfSlabTile::TOP_SLOT_BIT) != 0; - if (((face == Facing::UP && !isUpper) || (face == Facing::DOWN && isUpper)) && currentTile == halfTile->id && slabType == item->getAuxValue()) + if (((face == Facing::UP && !isUpper) || (face == Facing::DOWN && isUpper)) && currentTile == halfTile->id && slabType == item->getAuxValue()) { return true; } @@ -100,7 +100,7 @@ bool StoneSlabTileItem::mayPlace(Level *level, int x, int y, int z, int face,std slabType = currentData & HalfSlabTile::TYPE_MASK; isUpper = (currentData & HalfSlabTile::TOP_SLOT_BIT) != 0; - if (currentTile == halfTile->id && slabType == item->getAuxValue()) + if (currentTile == halfTile->id && slabType == item->getAuxValue()) { return true; } @@ -108,7 +108,7 @@ bool StoneSlabTileItem::mayPlace(Level *level, int x, int y, int z, int face,std return TileItem::mayPlace(level, ox, oy, oz, face, player, item); } -bool StoneSlabTileItem::tryConvertTargetTile(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly) +bool StoneSlabTileItem::tryConvertTargetTile(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly) { if (face == 0) y--; if (face == 1) y++; @@ -121,17 +121,17 @@ bool StoneSlabTileItem::tryConvertTargetTile(std::shared_ptr insta int currentData = level->getData(x, y, z); int slabType = currentData & HalfSlabTile::TYPE_MASK; - if (currentTile == halfTile->id && slabType == instance->getAuxValue()) + if (currentTile == halfTile->id && slabType == instance->getAuxValue()) { if(bTestUseOnOnly) { return true; - } - if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType)) + } + if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType)) { //level.playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile.soundType.getPlaceSound(), (fullTile.soundType.getVolume() + 1) / 2, fullTile.soundType.getPitch() * 0.8f); level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile->soundType->getStepSound(), (fullTile->soundType->getVolume() + 1) / 2, fullTile->soundType->getPitch() * 0.8f); - instance->count--; + instance->count--; } return true; } diff --git a/Minecraft.World/StoneSlabTileItem.h b/Minecraft.World/StoneSlabTileItem.h index a54c7802..417dcba0 100644 --- a/Minecraft.World/StoneSlabTileItem.h +++ b/Minecraft.World/StoneSlabTileItem.h @@ -15,10 +15,10 @@ public: virtual Icon *getIcon(int itemAuxValue); virtual int getLevelDataForAuxValue(int auxValue); - virtual unsigned int getDescriptionId(std::shared_ptr instance); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual unsigned int getDescriptionId(shared_ptr instance); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual bool mayPlace(Level *level, int x, int y, int z, int face,std::shared_ptr player, std::shared_ptr item); + virtual bool mayPlace(Level *level, int x, int y, int z, int face,shared_ptr player, shared_ptr item); private: - bool tryConvertTargetTile(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly); + bool tryConvertTargetTile(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly); }; \ No newline at end of file diff --git a/Minecraft.World/StrongholdPieces.cpp b/Minecraft.World/StrongholdPieces.cpp index 05ccec39..0168b2ba 100644 --- a/Minecraft.World/StrongholdPieces.cpp +++ b/Minecraft.World/StrongholdPieces.cpp @@ -352,13 +352,13 @@ StructurePiece *StrongholdPieces::StrongholdPiece::generateSmallDoorChildRight(S } return NULL; } - + bool StrongholdPieces::StrongholdPiece::isOkBox(BoundingBox *box, StartPiece *startRoom) { //return box != NULL && box->y0 > LOWEST_Y_POSITION; - + bool bIsOk = false; - + if(box != NULL) { if( box->y0 > LOWEST_Y_POSITION ) bIsOk = true; @@ -393,7 +393,7 @@ BoundingBox *StrongholdPieces::FillerCorridor::findPieceBox(listfront()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -582,7 +582,7 @@ StrongholdPieces::Straight *StrongholdPieces::Straight::createPiece(listfront()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -625,7 +625,7 @@ bool StrongholdPieces::Straight::postProcess(Level *level, Random *random, Bound return true; } -WeighedTreasure *StrongholdPieces::ChestCorridor::treasureItems[TREASURE_ITEMS_COUNT] = +WeighedTreasure *StrongholdPieces::ChestCorridor::treasureItems[TREASURE_ITEMS_COUNT] = { new WeighedTreasure(Item::enderPearl_Id, 0, 1, 1, 10), new WeighedTreasure(Item::diamond_Id, 0, 1, 3, 3), @@ -658,7 +658,7 @@ StrongholdPieces::ChestCorridor *StrongholdPieces::ChestCorridor::createPiece(li { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -724,7 +724,7 @@ StrongholdPieces::StraightStairsDown *StrongholdPieces::StraightStairsDown::crea { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 4 - height, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -790,7 +790,7 @@ StrongholdPieces::LeftTurn *StrongholdPieces::LeftTurn::createPiece(listfront()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -870,7 +870,7 @@ bool StrongholdPieces::RightTurn::postProcess(Level *level, Random *random, Boun StrongholdPieces::RoomCrossing::RoomCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)), type(random->nextInt(5)) { orientation = direction; - boundingBox = stairsBox; + boundingBox = stairsBox; } void StrongholdPieces::RoomCrossing::addChildren(StructurePiece *startPiece, list *pieces, Random *random) @@ -884,7 +884,7 @@ StrongholdPieces::RoomCrossing *StrongholdPieces::RoomCrossing::createPiece(list { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, height, depth, direction); - StartPiece *startPiece = NULL; + StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -896,7 +896,7 @@ StrongholdPieces::RoomCrossing *StrongholdPieces::RoomCrossing::createPiece(list return new RoomCrossing(genDepth, random, box, direction); } -WeighedTreasure *StrongholdPieces::RoomCrossing::smallTreasureItems[SMALL_TREASURE_ITEMS_COUNT] = +WeighedTreasure *StrongholdPieces::RoomCrossing::smallTreasureItems[SMALL_TREASURE_ITEMS_COUNT] = { new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 10), new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 5), @@ -1030,7 +1030,7 @@ StrongholdPieces::PrisonHall *StrongholdPieces::PrisonHall::createPiece(listfront()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1091,7 +1091,7 @@ StrongholdPieces::Library *StrongholdPieces::Library::createPiece(listfront()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1110,7 +1110,7 @@ StrongholdPieces::Library *StrongholdPieces::Library::createPiece(listfront()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1358,7 +1358,7 @@ StrongholdPieces::PortalRoom *StrongholdPieces::PortalRoom::createPiece(listfront()); if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) @@ -1443,7 +1443,7 @@ bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, Bou } // 4J-PB - Removed for Christmas update since we don't have The End - + // 4J-PB - not going to remove it, so that maps generated will have it in, but it can't be activated placeBlock(level, Tile::endPortalFrameTile_Id, north + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 4, 3, 8, chunkBB); placeBlock(level, Tile::endPortalFrameTile_Id, north + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 5, 3, 8, chunkBB); @@ -1457,7 +1457,7 @@ bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, Bou placeBlock(level, Tile::endPortalFrameTile_Id, west + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 7, 3, 9, chunkBB); placeBlock(level, Tile::endPortalFrameTile_Id, west + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 7, 3, 10, chunkBB); placeBlock(level, Tile::endPortalFrameTile_Id, west + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 7, 3, 11, chunkBB); - + if (!hasPlacedMobSpawner) { @@ -1466,14 +1466,14 @@ bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, Bou if (chunkBB->isInside(x, y, z)) { // 4J Stu - The mob spawner location is close enough for the map icon display, and this ensures that we only need to set the position once - app.AddTerrainFeaturePosition(eTerrainFeature_StrongholdEndPortal,x,z); + app.AddTerrainFeaturePosition(eTerrainFeature_StrongholdEndPortal,x,z); level->getLevelData()->setXStrongholdEndPortal(x); level->getLevelData()->setZStrongholdEndPortal(z); level->getLevelData()->setHasStrongholdEndPortal(); hasPlacedMobSpawner = true; level->setTile(x, y, z, Tile::mobSpawner_Id); - std::shared_ptr entity = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + shared_ptr entity = dynamic_pointer_cast(level->getTileEntity(x, y, z)); if (entity != NULL) entity->setEntityId(L"Silverfish"); } } diff --git a/Minecraft.World/StructurePiece.cpp b/Minecraft.World/StructurePiece.cpp index e4fd3fab..1d41a608 100644 --- a/Minecraft.World/StructurePiece.cpp +++ b/Minecraft.World/StructurePiece.cpp @@ -13,7 +13,7 @@ #include "DoorItem.h" /** -* +* * A structure piece is a construction or room, located somewhere in the world * with a given orientatino (out of Direction.java). Structure pieces have a * bounding box that says where the piece is located and its bounds, and the @@ -89,7 +89,7 @@ StructurePiece* StructurePiece::findCollisionPiece( list< StructurePiece* > *pie } // 4J-PB - Added from 1.2.3 -TilePos *StructurePiece::getLocatorPosition() +TilePos *StructurePiece::getLocatorPosition() { return new TilePos(boundingBox->getXCenter(), boundingBox->getYCenter(), boundingBox->getZCenter()); } @@ -523,7 +523,7 @@ void StructurePiece::placeBlock( Level* level, int block, int data, int x, int y * The purpose of this method is to wrap the getTile call on Level, in order * to prevent the level from generating chunks that shouldn't be loaded yet. * Returns 0 if the call is out of bounds. -* +* * @param level * @param x * @param y @@ -781,7 +781,7 @@ bool StructurePiece::createChest( Level* level, BoundingBox* chunkBB, Random* ra if ( level->getTile( worldX, worldY, worldZ ) != Tile::chest->id ) { level->setTile( worldX, worldY, worldZ, Tile::chest->id ); - std::shared_ptr chest = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); + shared_ptr chest = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); if ( chest != NULL ) WeighedTreasure::addChestItems( random, treasure, chest, numRolls ); return true; } @@ -800,7 +800,7 @@ bool StructurePiece::createDispenser(Level *level, BoundingBox *chunkBB, Random if (level->getTile(worldX, worldY, worldZ) != Tile::dispenser_Id) { level->setTileAndData(worldX, worldY, worldZ, Tile::dispenser_Id, getOrientationData(Tile::dispenser_Id, facing)); - std::shared_ptr dispenser = dynamic_pointer_cast(level->getTileEntity(worldX, worldY, worldZ)); + shared_ptr dispenser = dynamic_pointer_cast(level->getTileEntity(worldX, worldY, worldZ)); if (dispenser != NULL) WeighedTreasure::addDispenserItems(random, items, dispenser, numRolls); return true; } diff --git a/Minecraft.World/SwampRiversLayer.cpp b/Minecraft.World/SwampRiversLayer.cpp index 4840a434..cd22cae8 100644 --- a/Minecraft.World/SwampRiversLayer.cpp +++ b/Minecraft.World/SwampRiversLayer.cpp @@ -3,7 +3,7 @@ #include "IntCache.h" #include "SwampRiversLayer.h" -SwampRiversLayer::SwampRiversLayer(int64_t seed, std::shared_ptr parent) : Layer(seed) +SwampRiversLayer::SwampRiversLayer(int64_t seed, shared_ptr parent) : Layer(seed) { this->parent = parent; } diff --git a/Minecraft.World/SwampRiversLayer.h b/Minecraft.World/SwampRiversLayer.h index 3ede59d5..97bab0f4 100644 --- a/Minecraft.World/SwampRiversLayer.h +++ b/Minecraft.World/SwampRiversLayer.h @@ -5,7 +5,7 @@ class SwampRiversLayer : public Layer { public: - SwampRiversLayer(int64_t seed, std::shared_ptr parent); + SwampRiversLayer(int64_t seed, shared_ptr parent); intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/SwellGoal.cpp b/Minecraft.World/SwellGoal.cpp index 289ada73..9065ba16 100644 --- a/Minecraft.World/SwellGoal.cpp +++ b/Minecraft.World/SwellGoal.cpp @@ -15,7 +15,7 @@ SwellGoal::SwellGoal(Creeper *creeper) bool SwellGoal::canUse() { - std::shared_ptr target = creeper->getTarget(); + shared_ptr target = creeper->getTarget(); return creeper->getSwellDir() > 0 || (target != NULL && (creeper->distanceToSqr(target) < 3 * 3)); } diff --git a/Minecraft.World/SynchedEntityData.cpp b/Minecraft.World/SynchedEntityData.cpp index b5f31bfa..9f1aa1f7 100644 --- a/Minecraft.World/SynchedEntityData.cpp +++ b/Minecraft.World/SynchedEntityData.cpp @@ -19,7 +19,7 @@ void SynchedEntityData::define(int id, int value) MemSect(17); checkId(id); int type = TYPE_INT; - std::shared_ptr dataItem = std::shared_ptr( new DataItem(type, id, value) ); + shared_ptr dataItem = shared_ptr( new DataItem(type, id, value) ); itemsById[id] = dataItem; MemSect(0); m_isEmpty = false; @@ -30,7 +30,7 @@ void SynchedEntityData::define(int id, byte value) MemSect(17); checkId(id); int type = TYPE_BYTE; - std::shared_ptr dataItem = std::shared_ptr( new DataItem(type, id, value) ); + shared_ptr dataItem = shared_ptr( new DataItem(type, id, value) ); itemsById[id] = dataItem; MemSect(0); m_isEmpty = false; @@ -41,7 +41,7 @@ void SynchedEntityData::define(int id, short value) MemSect(17); checkId(id); int type = TYPE_SHORT; - std::shared_ptr dataItem = std::shared_ptr( new DataItem(type, id, value) ); + shared_ptr dataItem = shared_ptr( new DataItem(type, id, value) ); itemsById[id] = dataItem; MemSect(0); m_isEmpty = false; @@ -52,7 +52,7 @@ void SynchedEntityData::define(int id, const wstring& value) MemSect(17); checkId(id); int type = TYPE_STRING; - std::shared_ptr dataItem = std::shared_ptr( new DataItem(type, id, value) ); + shared_ptr dataItem = shared_ptr( new DataItem(type, id, value) ); itemsById[id] = dataItem; MemSect(0); m_isEmpty = false; @@ -63,7 +63,7 @@ void SynchedEntityData::defineNULL(int id, void *pVal) MemSect(17); checkId(id); int type = TYPE_ITEMINSTANCE; - std::shared_ptr dataItem = std::shared_ptr( new DataItem(type, id, std::shared_ptr()) ); + shared_ptr dataItem = shared_ptr( new DataItem(type, id, shared_ptr()) ); itemsById[id] = dataItem; MemSect(0); m_isEmpty = false; @@ -109,7 +109,7 @@ wstring SynchedEntityData::getString(int id) return itemsById[id]->getValue_wstring(); } -std::shared_ptr SynchedEntityData::getItemInstance(int id) +shared_ptr SynchedEntityData::getItemInstance(int id) { //assert(false); // 4J - not currently implemented return itemsById[id]->getValue_itemInstance(); @@ -123,7 +123,7 @@ Pos *SynchedEntityData::getPos(int id) void SynchedEntityData::set(int id, int value) { - std::shared_ptr dataItem = itemsById[id]; + shared_ptr dataItem = itemsById[id]; // update the value if it has changed if (value != dataItem->getValue_int()) @@ -136,7 +136,7 @@ void SynchedEntityData::set(int id, int value) void SynchedEntityData::set(int id, byte value) { - std::shared_ptr dataItem = itemsById[id]; + shared_ptr dataItem = itemsById[id]; // update the value if it has changed if (value != dataItem->getValue_byte()) @@ -149,7 +149,7 @@ void SynchedEntityData::set(int id, byte value) void SynchedEntityData::set(int id, short value) { - std::shared_ptr dataItem = itemsById[id]; + shared_ptr dataItem = itemsById[id]; // update the value if it has changed if (value != dataItem->getValue_short()) @@ -162,7 +162,7 @@ void SynchedEntityData::set(int id, short value) void SynchedEntityData::set(int id, const wstring& value) { - std::shared_ptr dataItem = itemsById[id]; + shared_ptr dataItem = itemsById[id]; // update the value if it has changed if (value != dataItem->getValue_wstring()) @@ -173,9 +173,9 @@ void SynchedEntityData::set(int id, const wstring& value) } } -void SynchedEntityData::set(int id, std::shared_ptr value) +void SynchedEntityData::set(int id, shared_ptr value) { - std::shared_ptr dataItem = itemsById[id]; + shared_ptr dataItem = itemsById[id]; // update the value if it has changed if (value != dataItem->getValue_itemInstance()) @@ -197,7 +197,7 @@ bool SynchedEntityData::isDirty() return m_isDirty; } -void SynchedEntityData::pack(vector > *items, DataOutputStream *output) // TODO throws IOException +void SynchedEntityData::pack(vector > *items, DataOutputStream *output) // TODO throws IOException { if (items != NULL) @@ -205,7 +205,7 @@ void SynchedEntityData::pack(vector > *items, DataOutp AUTO_VAR(itEnd, items->end()); for (AUTO_VAR(it, items->begin()); it != itEnd; it++) { - std::shared_ptr dataItem = *it; + shared_ptr dataItem = *it; writeDataItem(output, dataItem); } } @@ -214,24 +214,24 @@ void SynchedEntityData::pack(vector > *items, DataOutp output->writeByte(EOF_MARKER); } -vector > *SynchedEntityData::packDirty() +vector > *SynchedEntityData::packDirty() { - vector > *result = NULL; + vector > *result = NULL; if (m_isDirty) { AUTO_VAR(itEnd, itemsById.end()); for ( AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ ) { - std::shared_ptr dataItem = (*it).second; + shared_ptr dataItem = (*it).second; if (dataItem->isDirty()) { dataItem->setDirty(false); if (result == NULL) { - result = new vector >(); + result = new vector >(); } result->push_back(dataItem); } @@ -247,7 +247,7 @@ void SynchedEntityData::packAll(DataOutputStream *output) // throws IOException AUTO_VAR(itEnd, itemsById.end()); for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ ) { - std::shared_ptr dataItem = (*it).second; + shared_ptr dataItem = (*it).second; writeDataItem(output, dataItem); } @@ -255,18 +255,18 @@ void SynchedEntityData::packAll(DataOutputStream *output) // throws IOException output->writeByte(EOF_MARKER); } -vector > *SynchedEntityData::getAll() +vector > *SynchedEntityData::getAll() { - vector > *result = NULL; + vector > *result = NULL; AUTO_VAR(itEnd, itemsById.end()); for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ ) { if (result == NULL) { - result = new vector >(); + result = new vector >(); } - std::shared_ptr dataItem = (*it).second; + shared_ptr dataItem = (*it).second; result->push_back(dataItem); } @@ -274,7 +274,7 @@ vector > *SynchedEntityData::getAll } -void SynchedEntityData::writeDataItem(DataOutputStream *output, std::shared_ptr dataItem) //throws IOException +void SynchedEntityData::writeDataItem(DataOutputStream *output, shared_ptr dataItem) //throws IOException { // pack type and id int header = ((dataItem->getType() << TYPE_SHIFT) | (dataItem->getId() & MAX_ID_VALUE)) & 0xff; @@ -285,7 +285,7 @@ void SynchedEntityData::writeDataItem(DataOutputStream *output, std::shared_ptr< { case TYPE_BYTE: output->writeByte( dataItem->getValue_byte()); - break; + break; case TYPE_INT: output->writeInt( dataItem->getValue_int()); break; @@ -295,23 +295,23 @@ void SynchedEntityData::writeDataItem(DataOutputStream *output, std::shared_ptr< case TYPE_STRING: Packet::writeUtf(dataItem->getValue_wstring(), output); break; - case TYPE_ITEMINSTANCE: + case TYPE_ITEMINSTANCE: { - std::shared_ptr instance = (std::shared_ptr )dataItem->getValue_itemInstance(); + shared_ptr instance = (shared_ptr )dataItem->getValue_itemInstance(); Packet::writeItem(instance, output); } break; - + default: assert(false); // 4J - not implemented break; } } -vector > *SynchedEntityData::unpack(DataInputStream *input) //throws IOException +vector > *SynchedEntityData::unpack(DataInputStream *input) //throws IOException { - vector > *result = NULL; + vector > *result = NULL; int currentHeader = input->readByte(); @@ -320,40 +320,40 @@ vector > *SynchedEntityData::unpack if (result == NULL) { - result = new vector >(); + result = new vector >(); } // split type and id int itemType = (currentHeader & TYPE_MASK) >> TYPE_SHIFT; int itemId = (currentHeader & MAX_ID_VALUE); - std::shared_ptr item = std::shared_ptr(); + shared_ptr item = shared_ptr(); switch (itemType) { case TYPE_BYTE: { byte dataRead = input->readByte(); - item = std::shared_ptr( new DataItem(itemType, itemId, dataRead) ); + item = shared_ptr( new DataItem(itemType, itemId, dataRead) ); } break; case TYPE_SHORT: { short dataRead = input->readShort(); - item = std::shared_ptr( new DataItem(itemType, itemId, dataRead) ); + item = shared_ptr( new DataItem(itemType, itemId, dataRead) ); } break; case TYPE_INT: { int dataRead = input->readInt(); - item = std::shared_ptr( new DataItem(itemType, itemId, dataRead) ); + item = shared_ptr( new DataItem(itemType, itemId, dataRead) ); } break; case TYPE_STRING: - item = std::shared_ptr( new DataItem(itemType, itemId, Packet::readUtf(input, MAX_STRING_DATA_LENGTH)) ); + item = shared_ptr( new DataItem(itemType, itemId, Packet::readUtf(input, MAX_STRING_DATA_LENGTH)) ); break; - case TYPE_ITEMINSTANCE: + case TYPE_ITEMINSTANCE: { - item = std::shared_ptr(new DataItem(itemType, itemId, Packet::readItem(input))); + item = shared_ptr(new DataItem(itemType, itemId, Packet::readItem(input))); } break; default: @@ -372,16 +372,16 @@ vector > *SynchedEntityData::unpack /** * Assigns values from a list of data items. -* +* * @param items */ -void SynchedEntityData::assignValues(vector > *items) +void SynchedEntityData::assignValues(vector > *items) { AUTO_VAR(itEnd, items->end()); for (AUTO_VAR(it, items->begin()); it != itEnd; it++) { - std::shared_ptr item = *it; + shared_ptr item = *it; AUTO_VAR(itemFromId, itemsById.find(item->getId())); if (itemFromId != itemsById.end() ) { @@ -418,11 +418,11 @@ bool SynchedEntityData::isEmpty() int SynchedEntityData::getSizeInBytes() { int size = 1; - + AUTO_VAR(itEnd, itemsById.end()); for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ ) { - std::shared_ptr dataItem = (*it).second; + shared_ptr dataItem = (*it).second; size += 1; @@ -431,7 +431,7 @@ int SynchedEntityData::getSizeInBytes() { case TYPE_BYTE: size += 1; - break; + break; case TYPE_SHORT: size += 2; break; @@ -481,7 +481,7 @@ SynchedEntityData::DataItem::DataItem(int type, int id, const wstring& value) : this->dirty = true; } -SynchedEntityData::DataItem::DataItem(int type, int id, std::shared_ptr itemInstance) : type( type ), id( id ) +SynchedEntityData::DataItem::DataItem(int type, int id, shared_ptr itemInstance) : type( type ), id( id ) { this->value_itemInstance = itemInstance; this->dirty = true; @@ -512,7 +512,7 @@ void SynchedEntityData::DataItem::setValue(const wstring& value) this->value_wstring = value; } -void SynchedEntityData::DataItem::setValue(std::shared_ptr itemInstance) +void SynchedEntityData::DataItem::setValue(shared_ptr itemInstance) { this->value_itemInstance = itemInstance; } @@ -537,7 +537,7 @@ wstring SynchedEntityData::DataItem::getValue_wstring() return value_wstring; } -std::shared_ptr SynchedEntityData::DataItem::getValue_itemInstance() +shared_ptr SynchedEntityData::DataItem::getValue_itemInstance() { return value_itemInstance; } diff --git a/Minecraft.World/SynchedEntityData.h b/Minecraft.World/SynchedEntityData.h index 05a6fef2..e79a10b8 100644 --- a/Minecraft.World/SynchedEntityData.h +++ b/Minecraft.World/SynchedEntityData.h @@ -19,7 +19,7 @@ public: int value_int; short value_short; wstring value_wstring; - std::shared_ptr value_itemInstance; + shared_ptr value_itemInstance; bool dirty; public: @@ -27,7 +27,7 @@ public: DataItem(int type, int id, byte value); DataItem(int type, int id, int value); DataItem(int type, int id, const wstring& value); - DataItem(int type, int id, std::shared_ptr itemInstance); + DataItem(int type, int id, shared_ptr itemInstance); DataItem(int type, int id, short value); int getId(); @@ -35,12 +35,12 @@ public: void setValue(int value); void setValue(short value); void setValue(const wstring& value); - void setValue(std::shared_ptr value); + void setValue(shared_ptr value); byte getValue_byte(); int getValue_int(); short getValue_short(); wstring getValue_wstring(); - std::shared_ptr getValue_itemInstance(); + shared_ptr getValue_itemInstance(); int getType(); bool isDirty(); void setDirty(bool dirty); @@ -71,7 +71,7 @@ private: // the id value must fit in the remaining bits static const int MAX_ID_VALUE = ~TYPE_MASK & 0xff; - unordered_map > itemsById; + unordered_map > itemsById; bool m_isDirty; public: @@ -91,35 +91,35 @@ public: int getInteger(int id); float getFloat(int id); wstring getString(int id); - std::shared_ptr getItemInstance(int id); + shared_ptr getItemInstance(int id); Pos *getPos(int id); // 4J - using overloads rather than template here void set(int id, byte value); void set(int id, int value); void set(int id, short value); void set(int id, const wstring& value); - void set(int id, std::shared_ptr); + void set(int id, shared_ptr); void markDirty(int id); bool isDirty(); - static void pack(vector > *items, DataOutputStream *output); // TODO throws IOException - vector > *packDirty(); + static void pack(vector > *items, DataOutputStream *output); // TODO throws IOException + vector > *packDirty(); void packAll(DataOutputStream *output); // throws IOException - vector > *getAll(); + vector > *getAll(); private: - static void writeDataItem(DataOutputStream *output, std::shared_ptr dataItem); //throws IOException + static void writeDataItem(DataOutputStream *output, shared_ptr dataItem); //throws IOException public: - static vector > *unpack(DataInputStream *input); // throws IOException + static vector > *unpack(DataInputStream *input); // throws IOException /** * Assigns values from a list of data items. - * + * * @param items */ public: - void assignValues(vector > *items); + void assignValues(vector > *items); bool isEmpty(); // 4J Added diff --git a/Minecraft.World/TakeFlowerGoal.cpp b/Minecraft.World/TakeFlowerGoal.cpp index e67edd86..34c584c6 100644 --- a/Minecraft.World/TakeFlowerGoal.cpp +++ b/Minecraft.World/TakeFlowerGoal.cpp @@ -23,7 +23,7 @@ bool TakeFlowerGoal::canUse() if (villager->getAge() >= 0) return false; if (!villager->level->isDay()) return false; - vector > *golems = villager->level->getEntitiesOfClass(typeid(VillagerGolem), villager->bb->grow(6, 2, 6)); + vector > *golems = villager->level->getEntitiesOfClass(typeid(VillagerGolem), villager->bb->grow(6, 2, 6)); if (golems->size() == 0) { delete golems; @@ -33,7 +33,7 @@ bool TakeFlowerGoal::canUse() //for (Entity e : golems) for(AUTO_VAR(it,golems->begin()); it != golems->end(); ++it) { - std::shared_ptr vg = dynamic_pointer_cast(*it); + shared_ptr vg = dynamic_pointer_cast(*it); if (vg->getOfferFlowerTick() > 0) { golem = weak_ptr(vg); diff --git a/Minecraft.World/TakeItemEntityPacket.h b/Minecraft.World/TakeItemEntityPacket.h index da785696..7c4b45fe 100644 --- a/Minecraft.World/TakeItemEntityPacket.h +++ b/Minecraft.World/TakeItemEntityPacket.h @@ -17,6 +17,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TakeItemEntityPacket()); } + static shared_ptr create() { return shared_ptr(new TakeItemEntityPacket()); } virtual int getId() { return 22; } }; \ No newline at end of file diff --git a/Minecraft.World/TallGrass.cpp b/Minecraft.World/TallGrass.cpp index d4a3d027..e2e7cb19 100644 --- a/Minecraft.World/TallGrass.cpp +++ b/Minecraft.World/TallGrass.cpp @@ -79,17 +79,17 @@ int TallGrass::getResourceCountForLootBonus(int bonusLevel, Random *random) return 1 + random->nextInt(bonusLevel * 2 + 1); } -void TallGrass::playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data) +void TallGrass::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { if (!level->isClientSide && player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears->id) { player->awardStat( - GenericStats::blocksMined(id), + GenericStats::blocksMined(id), GenericStats::param_blocksMined(id,data,1) ); // drop leaf block instead of sapling - popResource(level, x, y, z, std::shared_ptr(new ItemInstance(Tile::tallgrass, 1, data))); + popResource(level, x, y, z, shared_ptr(new ItemInstance(Tile::tallgrass, 1, data))); } else { diff --git a/Minecraft.World/TallGrass.h b/Minecraft.World/TallGrass.h index 78019c01..9b4c5515 100644 --- a/Minecraft.World/TallGrass.h +++ b/Minecraft.World/TallGrass.h @@ -35,7 +35,7 @@ public: virtual int getResource(int data, Random *random, int playerBonusLevel); virtual int getResourceCountForLootBonus(int bonusLevel, Random *random); - virtual void playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data); + virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); virtual int cloneTileData(Level *level, int x, int y, int z); virtual unsigned int getDescriptionId(int iData = -1); diff --git a/Minecraft.World/TamableAnimal.cpp b/Minecraft.World/TamableAnimal.cpp index abefb097..b065d7bd 100644 --- a/Minecraft.World/TamableAnimal.cpp +++ b/Minecraft.World/TamableAnimal.cpp @@ -148,7 +148,7 @@ void TamableAnimal::setOwnerUUID(const wstring &name) entityData->set(DATA_OWNERUUID_ID, name); } -std::shared_ptr TamableAnimal::getOwner() +shared_ptr TamableAnimal::getOwner() { return level->getPlayerByUUID(getOwnerUUID()); } diff --git a/Minecraft.World/TamableAnimal.h b/Minecraft.World/TamableAnimal.h index 5b4938cc..71502788 100644 --- a/Minecraft.World/TamableAnimal.h +++ b/Minecraft.World/TamableAnimal.h @@ -33,6 +33,6 @@ public: virtual void setSitting(bool value); virtual wstring getOwnerUUID(); virtual void setOwnerUUID(const wstring &name); - virtual std::shared_ptr getOwner(); + virtual shared_ptr getOwner(); virtual SitGoal *getSitGoal(); }; \ No newline at end of file diff --git a/Minecraft.World/TargetGoal.cpp b/Minecraft.World/TargetGoal.cpp index 28102c60..c3ac4f59 100644 --- a/Minecraft.World/TargetGoal.cpp +++ b/Minecraft.World/TargetGoal.cpp @@ -32,7 +32,7 @@ TargetGoal::TargetGoal(Mob *mob, float within, bool mustSee, bool mustReach) bool TargetGoal::canContinueToUse() { - std::shared_ptr target = mob->getTarget(); + shared_ptr target = mob->getTarget(); if (target == NULL) return false; if (!target->isAlive()) return false; if (mob->distanceToSqr(target) > within * within) return false; @@ -62,17 +62,17 @@ void TargetGoal::stop() mob->setTarget(nullptr); } -bool TargetGoal::canAttack(std::shared_ptr target, bool allowInvulnerable) +bool TargetGoal::canAttack(shared_ptr target, bool allowInvulnerable) { if (target == NULL) return false; if (target == mob->shared_from_this()) return false; if (!target->isAlive()) return false; if (!mob->canAttackType(target->GetType())) return false; - std::shared_ptr tamableAnimal = dynamic_pointer_cast(mob->shared_from_this()); + shared_ptr tamableAnimal = dynamic_pointer_cast(mob->shared_from_this()); if (tamableAnimal != NULL && tamableAnimal->isTame()) { - std::shared_ptr tamableTarget = dynamic_pointer_cast(target); + shared_ptr tamableTarget = dynamic_pointer_cast(target); if (tamableTarget != NULL && tamableTarget->isTame()) return false; if (target == tamableAnimal->getOwner()) return false; } @@ -95,7 +95,7 @@ bool TargetGoal::canAttack(std::shared_ptr target, bool allowInvulnerable) return true; } -bool TargetGoal::canReach(std::shared_ptr target) +bool TargetGoal::canReach(shared_ptr target) { reachCacheTime = 10 + mob->getRandom()->nextInt(5); Path *path = mob->getNavigation()->createPath(target); diff --git a/Minecraft.World/TargetGoal.h b/Minecraft.World/TargetGoal.h index 2e6765fe..3bb9da09 100644 --- a/Minecraft.World/TargetGoal.h +++ b/Minecraft.World/TargetGoal.h @@ -37,8 +37,8 @@ public: virtual void stop(); protected: - virtual bool canAttack(std::shared_ptr target, bool allowInvulnerable); + virtual bool canAttack(shared_ptr target, bool allowInvulnerable); private: - bool canReach(std::shared_ptr target); + bool canReach(shared_ptr target); }; \ No newline at end of file diff --git a/Minecraft.World/TeleportEntityPacket.cpp b/Minecraft.World/TeleportEntityPacket.cpp index 1ca53966..f0ed1e95 100644 --- a/Minecraft.World/TeleportEntityPacket.cpp +++ b/Minecraft.World/TeleportEntityPacket.cpp @@ -17,7 +17,7 @@ TeleportEntityPacket::TeleportEntityPacket() xRot = 0; } -TeleportEntityPacket::TeleportEntityPacket(std::shared_ptr e) +TeleportEntityPacket::TeleportEntityPacket(shared_ptr e) { id = e->entityId; x = Mth::floor(e->x * 32); @@ -53,7 +53,7 @@ void TeleportEntityPacket::read(DataInputStream *dis) //throws IOException xRot = (byte) dis->read(); } -void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException +void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException { dos->writeShort(id); #ifdef _LARGE_WORLDS @@ -69,12 +69,12 @@ void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException dos->write(xRot); } -void TeleportEntityPacket::handle(PacketListener *listener) +void TeleportEntityPacket::handle(PacketListener *listener) { listener->handleTeleportEntity(shared_from_this()); } -int TeleportEntityPacket::getEstimatedSize() +int TeleportEntityPacket::getEstimatedSize() { return 2 + 2 + 2 + 2 + 1 + 1; } @@ -84,8 +84,8 @@ bool TeleportEntityPacket::canBeInvalidated() return true; } -bool TeleportEntityPacket::isInvalidatedBy(std::shared_ptr packet) +bool TeleportEntityPacket::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target->id == id; } \ No newline at end of file diff --git a/Minecraft.World/TeleportEntityPacket.h b/Minecraft.World/TeleportEntityPacket.h index cccc1ce0..6fc28732 100644 --- a/Minecraft.World/TeleportEntityPacket.h +++ b/Minecraft.World/TeleportEntityPacket.h @@ -11,7 +11,7 @@ public: byte yRot, xRot; TeleportEntityPacket(); - TeleportEntityPacket(std::shared_ptr e); + TeleportEntityPacket(shared_ptr e); TeleportEntityPacket(int id, int x, int y, int z, byte yRot, byte xRot); virtual void read(DataInputStream *dis); @@ -19,9 +19,9 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new TeleportEntityPacket()); } + static shared_ptr create() { return shared_ptr(new TeleportEntityPacket()); } virtual int getId() { return 34; } }; \ No newline at end of file diff --git a/Minecraft.World/TemperatureLayer.cpp b/Minecraft.World/TemperatureLayer.cpp index 484f9506..b4963925 100644 --- a/Minecraft.World/TemperatureLayer.cpp +++ b/Minecraft.World/TemperatureLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.newbiome.layer.h" -TemperatureLayer::TemperatureLayer(std::shared_ptr parent) : Layer(0) +TemperatureLayer::TemperatureLayer(shared_ptr parent) : Layer(0) { this->parent = parent; } diff --git a/Minecraft.World/TemperatureLayer.h b/Minecraft.World/TemperatureLayer.h index 0da46402..34791caa 100644 --- a/Minecraft.World/TemperatureLayer.h +++ b/Minecraft.World/TemperatureLayer.h @@ -5,7 +5,7 @@ class TemperatureLayer : public Layer { public: - TemperatureLayer(std::shared_ptr parent); + TemperatureLayer(shared_ptr parent); virtual intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/TemperatureMixerLayer.cpp b/Minecraft.World/TemperatureMixerLayer.cpp index 38358e92..27fbdf68 100644 --- a/Minecraft.World/TemperatureMixerLayer.cpp +++ b/Minecraft.World/TemperatureMixerLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.newbiome.layer.h" -TemperatureMixerLayer::TemperatureMixerLayer(std::shared_ptrtemp, std::shared_ptrparent, int layer) : Layer(0) +TemperatureMixerLayer::TemperatureMixerLayer(shared_ptrtemp, shared_ptrparent, int layer) : Layer(0) { this->parent = parent; this->temp = temp; diff --git a/Minecraft.World/TemperatureMixerLayer.h b/Minecraft.World/TemperatureMixerLayer.h index 0e7abf93..3b3f56e0 100644 --- a/Minecraft.World/TemperatureMixerLayer.h +++ b/Minecraft.World/TemperatureMixerLayer.h @@ -5,11 +5,11 @@ class TemperatureMixerLayer : public Layer { private: - std::shared_ptrtemp; + shared_ptrtemp; int layer; public: - TemperatureMixerLayer(std::shared_ptrtemp, std::shared_ptrparent, int layer); + TemperatureMixerLayer(shared_ptrtemp, shared_ptrparent, int layer); virtual intArray getArea(int xo, int yo, int w, int h); }; \ No newline at end of file diff --git a/Minecraft.World/TemptGoal.cpp b/Minecraft.World/TemptGoal.cpp index d17c02bc..cf0ee3d2 100644 --- a/Minecraft.World/TemptGoal.cpp +++ b/Minecraft.World/TemptGoal.cpp @@ -31,7 +31,7 @@ bool TemptGoal::canUse() player = weak_ptr(mob->level->getNearestPlayer(mob->shared_from_this(), 10)); if (player.lock() == NULL) return false; mob->setDespawnProtected(); // If we've got a nearby player, then consider this mob as something we'd miss if it despawned - std::shared_ptr item = player.lock()->getSelectedItem(); + shared_ptr item = player.lock()->getSelectedItem(); if (item == NULL) return false; if (item->id != itemId) return false; return true; diff --git a/Minecraft.World/TextureAndGeometryChangePacket.cpp b/Minecraft.World/TextureAndGeometryChangePacket.cpp index d3279ba2..04c88bed 100644 --- a/Minecraft.World/TextureAndGeometryChangePacket.cpp +++ b/Minecraft.World/TextureAndGeometryChangePacket.cpp @@ -15,7 +15,7 @@ TextureAndGeometryChangePacket::TextureAndGeometryChangePacket() dwSkinID = 0; } -TextureAndGeometryChangePacket::TextureAndGeometryChangePacket(std::shared_ptr e, const wstring &path) +TextureAndGeometryChangePacket::TextureAndGeometryChangePacket(shared_ptr e, const wstring &path) { id = e->entityId; this->path = path; @@ -28,26 +28,26 @@ TextureAndGeometryChangePacket::TextureAndGeometryChangePacket(std::shared_ptrreadInt(); dwSkinID = dis->readInt(); path = dis->readUTF(); } -void TextureAndGeometryChangePacket::write(DataOutputStream *dos) //throws IOException +void TextureAndGeometryChangePacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(id); dos->writeInt(dwSkinID); dos->writeUTF(path); } -void TextureAndGeometryChangePacket::handle(PacketListener *listener) +void TextureAndGeometryChangePacket::handle(PacketListener *listener) { listener->handleTextureAndGeometryChange(shared_from_this()); } -int TextureAndGeometryChangePacket::getEstimatedSize() +int TextureAndGeometryChangePacket::getEstimatedSize() { return 8 + (int)path.size(); } diff --git a/Minecraft.World/TextureAndGeometryChangePacket.h b/Minecraft.World/TextureAndGeometryChangePacket.h index e13b547e..dabe78fa 100644 --- a/Minecraft.World/TextureAndGeometryChangePacket.h +++ b/Minecraft.World/TextureAndGeometryChangePacket.h @@ -12,7 +12,7 @@ public: DWORD dwSkinID; TextureAndGeometryChangePacket(); - TextureAndGeometryChangePacket(std::shared_ptr e, const wstring &path); + TextureAndGeometryChangePacket(shared_ptr e, const wstring &path); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); @@ -20,6 +20,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TextureAndGeometryChangePacket()); } + static shared_ptr create() { return shared_ptr(new TextureAndGeometryChangePacket()); } virtual int getId() { return 161; } }; \ No newline at end of file diff --git a/Minecraft.World/TextureAndGeometryPacket.h b/Minecraft.World/TextureAndGeometryPacket.h index d2f8def0..8577f03d 100644 --- a/Minecraft.World/TextureAndGeometryPacket.h +++ b/Minecraft.World/TextureAndGeometryPacket.h @@ -20,9 +20,9 @@ public: TextureAndGeometryPacket(); ~TextureAndGeometryPacket(); - TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes); - TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, DLCSkinFile *pDLCSkinFile); - TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector *pvSkinBoxes, unsigned int uiAnimOverrideBitmask); + TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes); + TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, DLCSkinFile *pDLCSkinFile); + TextureAndGeometryPacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes, vector *pvSkinBoxes, unsigned int uiAnimOverrideBitmask); virtual void handle(PacketListener *listener); virtual void read(DataInputStream *dis); @@ -30,6 +30,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TextureAndGeometryPacket()); } + static shared_ptr create() { return shared_ptr(new TextureAndGeometryPacket()); } virtual int getId() { return 160; } }; \ No newline at end of file diff --git a/Minecraft.World/TextureChangePacket.cpp b/Minecraft.World/TextureChangePacket.cpp index 8a5dd9c0..2368136c 100644 --- a/Minecraft.World/TextureChangePacket.cpp +++ b/Minecraft.World/TextureChangePacket.cpp @@ -14,33 +14,33 @@ TextureChangePacket::TextureChangePacket() path = L""; } -TextureChangePacket::TextureChangePacket(std::shared_ptr e, ETextureChangeType action, const wstring &path) +TextureChangePacket::TextureChangePacket(shared_ptr e, ETextureChangeType action, const wstring &path) { id = e->entityId; this->action = action; this->path = path; } -void TextureChangePacket::read(DataInputStream *dis) //throws IOException +void TextureChangePacket::read(DataInputStream *dis) //throws IOException { id = dis->readInt(); action = (ETextureChangeType)dis->readByte(); path = dis->readUTF(); } -void TextureChangePacket::write(DataOutputStream *dos) //throws IOException +void TextureChangePacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(id); dos->writeByte(action); dos->writeUTF(path); } -void TextureChangePacket::handle(PacketListener *listener) +void TextureChangePacket::handle(PacketListener *listener) { listener->handleTextureChange(shared_from_this()); } -int TextureChangePacket::getEstimatedSize() +int TextureChangePacket::getEstimatedSize() { return 5 + (int)path.size(); } diff --git a/Minecraft.World/TextureChangePacket.h b/Minecraft.World/TextureChangePacket.h index 7d99b3b3..959fc4fe 100644 --- a/Minecraft.World/TextureChangePacket.h +++ b/Minecraft.World/TextureChangePacket.h @@ -17,7 +17,7 @@ public: wstring path; TextureChangePacket(); - TextureChangePacket(std::shared_ptr e, ETextureChangeType action, const wstring &path); + TextureChangePacket(shared_ptr e, ETextureChangeType action, const wstring &path); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); @@ -25,6 +25,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TextureChangePacket()); } + static shared_ptr create() { return shared_ptr(new TextureChangePacket()); } virtual int getId() { return 157; } }; \ No newline at end of file diff --git a/Minecraft.World/TexturePacket.h b/Minecraft.World/TexturePacket.h index 587a094e..c2dce25f 100644 --- a/Minecraft.World/TexturePacket.h +++ b/Minecraft.World/TexturePacket.h @@ -11,7 +11,7 @@ public: DWORD dwBytes; TexturePacket(); - ~TexturePacket(); + ~TexturePacket(); TexturePacket(const wstring &textureName, PBYTE pbData, DWORD dwBytes); virtual void handle(PacketListener *listener); @@ -20,6 +20,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TexturePacket()); } + static shared_ptr create() { return shared_ptr(new TexturePacket()); } virtual int getId() { return 154; } }; \ No newline at end of file diff --git a/Minecraft.World/TheEndBiomeDecorator.cpp b/Minecraft.World/TheEndBiomeDecorator.cpp index a6360a73..31823c80 100644 --- a/Minecraft.World/TheEndBiomeDecorator.cpp +++ b/Minecraft.World/TheEndBiomeDecorator.cpp @@ -58,14 +58,14 @@ void TheEndBiomeDecorator::decorate() } if (xo == 0 && zo == 0) { - std::shared_ptr enderDragon = std::shared_ptr(new EnderDragon(level)); + shared_ptr enderDragon = shared_ptr(new EnderDragon(level)); enderDragon->moveTo(0, 128, 0, random->nextFloat() * 360, 0); level->addEntity(enderDragon); } // end podium radius is 4, position is 0,0, so chunk needs to be the -16,-16 one since this guarantees that all chunks required for the podium are loaded if (xo == -16 && zo == -16) - { + { endPodiumFeature->place(level, random, 0, Level::genDepth / 2, 0); } } \ No newline at end of file diff --git a/Minecraft.World/TheEndPortal.cpp b/Minecraft.World/TheEndPortal.cpp index 78e154f4..19d95b1f 100644 --- a/Minecraft.World/TheEndPortal.cpp +++ b/Minecraft.World/TheEndPortal.cpp @@ -26,12 +26,12 @@ TheEndPortal::TheEndPortal(int id, Material *material) : EntityTile(id, material this->setLightEmission(1.0f); } -std::shared_ptr TheEndPortal::newTileEntity(Level *level) +shared_ptr TheEndPortal::newTileEntity(Level *level) { - return std::shared_ptr(new TheEndPortalTileEntity()); + return shared_ptr(new TheEndPortalTileEntity()); } -void TheEndPortal::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void TheEndPortal::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { float r = 1 / 16.0f; this->setShape(0, 0, 0, 1, r, 1); @@ -43,7 +43,7 @@ bool TheEndPortal::shouldRenderFace(LevelSource *level, int x, int y, int z, int return EntityTile::shouldRenderFace(level, x, y, z, face); } -void TheEndPortal::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void TheEndPortal::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { } @@ -62,7 +62,7 @@ int TheEndPortal::getResourceCount(Random *random) return 0; } -void TheEndPortal::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void TheEndPortal::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { if (entity->riding == NULL && entity->rider.lock() == NULL) { diff --git a/Minecraft.World/TheEndPortal.h b/Minecraft.World/TheEndPortal.h index 5715fbd4..31cddb2d 100644 --- a/Minecraft.World/TheEndPortal.h +++ b/Minecraft.World/TheEndPortal.h @@ -6,19 +6,19 @@ class TheEndPortal : public EntityTile public: static DWORD tlsIdx; // 4J - was just a static but implemented with TLS for our version - static bool allowAnywhere(); - static void allowAnywhere(bool set); + static bool allowAnywhere(); + static void allowAnywhere(bool set); TheEndPortal(int id, Material *material); - virtual std::shared_ptr newTileEntity(Level *level); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual shared_ptr newTileEntity(Level *level); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); virtual int getResourceCount(Random *random); - virtual void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); virtual int getRenderShape(); virtual void onPlace(Level *level, int x, int y, int z); diff --git a/Minecraft.World/TheEndPortalFrameTile.cpp b/Minecraft.World/TheEndPortalFrameTile.cpp index 2bf557f8..cab8319f 100644 --- a/Minecraft.World/TheEndPortalFrameTile.cpp +++ b/Minecraft.World/TheEndPortalFrameTile.cpp @@ -52,7 +52,7 @@ void TheEndPortalFrameTile::updateDefaultShape() setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); } -void TheEndPortalFrameTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void TheEndPortalFrameTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); Tile::addAABBs(level, x, y, z, box, boxes, source); @@ -76,7 +76,7 @@ int TheEndPortalFrameTile::getResource(int data, Random *random, int playerBonus return 0; } -void TheEndPortalFrameTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void TheEndPortalFrameTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 2) % 4; level->setData(x, y, z, dir); diff --git a/Minecraft.World/TheEndPortalFrameTile.h b/Minecraft.World/TheEndPortalFrameTile.h index bedad14d..b48d3c09 100644 --- a/Minecraft.World/TheEndPortalFrameTile.h +++ b/Minecraft.World/TheEndPortalFrameTile.h @@ -19,8 +19,8 @@ public: virtual bool isSolidRender(bool isServerLevel = false); virtual int getRenderShape(); virtual void updateDefaultShape(); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); static bool hasEye(int data); virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); }; \ No newline at end of file diff --git a/Minecraft.World/TheEndPortalTileEntity.cpp b/Minecraft.World/TheEndPortalTileEntity.cpp index 2dee6a6a..fa9b3544 100644 --- a/Minecraft.World/TheEndPortalTileEntity.cpp +++ b/Minecraft.World/TheEndPortalTileEntity.cpp @@ -2,9 +2,9 @@ #include "TheEndPortalTileEntity.h" // 4J Added -std::shared_ptr TheEndPortalTileEntity::clone() +shared_ptr TheEndPortalTileEntity::clone() { - std::shared_ptr result = std::shared_ptr( new TheEndPortalTileEntity() ); + shared_ptr result = shared_ptr( new TheEndPortalTileEntity() ); TileEntity::clone(result); return result; } \ No newline at end of file diff --git a/Minecraft.World/TheEndPortalTileEntity.h b/Minecraft.World/TheEndPortalTileEntity.h index 0bc0b46c..29752d44 100644 --- a/Minecraft.World/TheEndPortalTileEntity.h +++ b/Minecraft.World/TheEndPortalTileEntity.h @@ -8,5 +8,5 @@ public: static TileEntity *create() { return new TheEndPortalTileEntity(); } // 4J Added - std::shared_ptr clone(); + shared_ptr clone(); }; \ No newline at end of file diff --git a/Minecraft.World/ThinFenceTile.cpp b/Minecraft.World/ThinFenceTile.cpp index 3a102abe..bd1f1687 100644 --- a/Minecraft.World/ThinFenceTile.cpp +++ b/Minecraft.World/ThinFenceTile.cpp @@ -42,7 +42,7 @@ bool ThinFenceTile::shouldRenderFace(LevelSource *level, int x, int y, int z, in return Tile::shouldRenderFace(level, x, y, z, face); } -void ThinFenceTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void ThinFenceTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { bool n = attachsTo(level->getTile(x, y, z - 1)); bool s = attachsTo(level->getTile(x, y, z + 1)); @@ -86,7 +86,7 @@ void ThinFenceTile::updateDefaultShape() setShape(0, 0, 0, 1, 1, 1); } -void ThinFenceTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void ThinFenceTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { float minX = 7.0f / 16.0f; float maxX = 9.0f / 16.0f; @@ -142,9 +142,9 @@ bool ThinFenceTile::isSilkTouchable() return true; } -std::shared_ptr ThinFenceTile::getSilkTouchItemInstance(int data) +shared_ptr ThinFenceTile::getSilkTouchItemInstance(int data) { - return std::shared_ptr(new ItemInstance(id, 1, data)); + return shared_ptr(new ItemInstance(id, 1, data)); } void ThinFenceTile::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/ThinFenceTile.h b/Minecraft.World/ThinFenceTile.h index ab3829ba..ca3c501f 100644 --- a/Minecraft.World/ThinFenceTile.h +++ b/Minecraft.World/ThinFenceTile.h @@ -12,20 +12,20 @@ private: public: ThinFenceTile(int id, const wstring &tex, const wstring &edgeTex, Material *material, bool dropsResources); - virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int getResource(int data, Random *random, int playerBonusLevel); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); virtual int getRenderShape(); virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual void updateDefaultShape(); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual Icon *getEdgeTexture(); bool attachsTo(int tile); protected: bool isSilkTouchable(); - std::shared_ptr getSilkTouchItemInstance(int data); + shared_ptr getSilkTouchItemInstance(int data); public: void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/ThornsEnchantment.cpp b/Minecraft.World/ThornsEnchantment.cpp index 8fbfab63..e2d9f1fa 100644 --- a/Minecraft.World/ThornsEnchantment.cpp +++ b/Minecraft.World/ThornsEnchantment.cpp @@ -27,7 +27,7 @@ int ThornsEnchantment::getMaxLevel() return 3; } -bool ThornsEnchantment::canEnchant(std::shared_ptr item) +bool ThornsEnchantment::canEnchant(shared_ptr item) { ArmorItem *armor = dynamic_cast(item->getItem()); if (armor) return true; @@ -52,10 +52,10 @@ int ThornsEnchantment::getDamage(int level, Random *random) } } -void ThornsEnchantment::doThornsAfterAttack(std::shared_ptr source, std::shared_ptr target, Random *random) +void ThornsEnchantment::doThornsAfterAttack(shared_ptr source, shared_ptr target, Random *random) { int level = EnchantmentHelper::getArmorThorns(target); - std::shared_ptr item = EnchantmentHelper::getRandomItemWith(Enchantment::thorns, target); + shared_ptr item = EnchantmentHelper::getRandomItemWith(Enchantment::thorns, target); if (shouldHit(level, random)) { diff --git a/Minecraft.World/ThornsEnchantment.h b/Minecraft.World/ThornsEnchantment.h index 240888a0..42f4326b 100644 --- a/Minecraft.World/ThornsEnchantment.h +++ b/Minecraft.World/ThornsEnchantment.h @@ -13,8 +13,8 @@ public: virtual int getMinCost(int level); virtual int getMaxCost(int level); virtual int getMaxLevel(); - virtual bool canEnchant(std::shared_ptr item); + virtual bool canEnchant(shared_ptr item); static bool shouldHit(int level, Random *random); static int getDamage(int level, Random *random); - static void doThornsAfterAttack(std::shared_ptr source, std::shared_ptr target, Random *random); + static void doThornsAfterAttack(shared_ptr source, shared_ptr target, Random *random); }; \ No newline at end of file diff --git a/Minecraft.World/Throwable.cpp b/Minecraft.World/Throwable.cpp index 7c5beb7d..2f9567a1 100644 --- a/Minecraft.World/Throwable.cpp +++ b/Minecraft.World/Throwable.cpp @@ -37,7 +37,7 @@ bool Throwable::shouldRenderAtSqrDistance(double distance) return distance < size * size; } -Throwable::Throwable(Level *level, std::shared_ptr mob) : Entity(level) +Throwable::Throwable(Level *level, shared_ptr mob) : Entity(level) { _throwableInit(); this->owner = mob; @@ -171,12 +171,12 @@ void Throwable::tick() if (!level->isClientSide) { - std::shared_ptr hitEntity = nullptr; - vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); + shared_ptr hitEntity = nullptr; + vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); double nearest = 0; for (int i = 0; i < objects->size(); i++) { - std::shared_ptr e = objects->at(i); + shared_ptr e = objects->at(i); if (!e->isPickable() || (e == owner && flightTime < 5)) continue; float rr = 0.3f; diff --git a/Minecraft.World/Throwable.h b/Minecraft.World/Throwable.h index 81f4cacc..4d7daea0 100644 --- a/Minecraft.World/Throwable.h +++ b/Minecraft.World/Throwable.h @@ -20,7 +20,7 @@ public: int shakeTime; protected: - std::shared_ptr owner; + shared_ptr owner; private: int life; @@ -37,7 +37,7 @@ protected: public: virtual bool shouldRenderAtSqrDistance(double distance); - Throwable(Level *level, std::shared_ptr mob); + Throwable(Level *level, shared_ptr mob); Throwable(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/ThrownEgg.cpp b/Minecraft.World/ThrownEgg.cpp index dbdbf431..45e5ca8c 100644 --- a/Minecraft.World/ThrownEgg.cpp +++ b/Minecraft.World/ThrownEgg.cpp @@ -21,7 +21,7 @@ ThrownEgg::ThrownEgg(Level *level) : Throwable(level) _init(); } -ThrownEgg::ThrownEgg(Level *level, std::shared_ptr mob) : Throwable(level,mob) +ThrownEgg::ThrownEgg(Level *level, shared_ptr mob) : Throwable(level,mob) { _init(); } @@ -47,7 +47,7 @@ void ThrownEgg::onHit(HitResult *res) if (random->nextInt(32) == 0) count = 4; for (int i = 0; i < count; i++) { - std::shared_ptr chicken = std::shared_ptr( new Chicken(level) ); + shared_ptr chicken = shared_ptr( new Chicken(level) ); chicken->setAge(-20 * 60 * 20); chicken->moveTo(x, y, z, yRot, 0); diff --git a/Minecraft.World/ThrownEgg.h b/Minecraft.World/ThrownEgg.h index 691ad5ae..864755b7 100644 --- a/Minecraft.World/ThrownEgg.h +++ b/Minecraft.World/ThrownEgg.h @@ -15,7 +15,7 @@ private: public: ThrownEgg(Level *level); - ThrownEgg(Level *level, std::shared_ptr mob); + ThrownEgg(Level *level, shared_ptr mob); ThrownEgg(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/ThrownEnderpearl.cpp b/Minecraft.World/ThrownEnderpearl.cpp index 778a4701..1cddfb1f 100644 --- a/Minecraft.World/ThrownEnderpearl.cpp +++ b/Minecraft.World/ThrownEnderpearl.cpp @@ -16,7 +16,7 @@ ThrownEnderpearl::ThrownEnderpearl(Level *level) : Throwable(level) this->defineSynchedData(); } -ThrownEnderpearl::ThrownEnderpearl(Level *level, std::shared_ptr mob) : Throwable(level,mob) +ThrownEnderpearl::ThrownEnderpearl(Level *level, shared_ptr mob) : Throwable(level,mob) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called @@ -47,7 +47,7 @@ void ThrownEnderpearl::onHit(HitResult *res) { // Fix for #67486 - TCR #001: BAS Game Stability: Customer Encountered: TU8: Code: Gameplay: The title crashes on Host's console when Client Player leaves the game before the Ender Pearl thrown by him touches the ground. // If the owner has been removed, then ignore - std::shared_ptr serverPlayer = dynamic_pointer_cast(owner); + shared_ptr serverPlayer = dynamic_pointer_cast(owner); if (serverPlayer != NULL && !serverPlayer->removed) { if(!serverPlayer->connection->done && serverPlayer->level == this->level) diff --git a/Minecraft.World/ThrownEnderpearl.h b/Minecraft.World/ThrownEnderpearl.h index fc4035f2..6f16ebfc 100644 --- a/Minecraft.World/ThrownEnderpearl.h +++ b/Minecraft.World/ThrownEnderpearl.h @@ -11,7 +11,7 @@ public: static Entity *create(Level *level) { return new ThrownEnderpearl(level); } ThrownEnderpearl(Level *level); - ThrownEnderpearl(Level *level, std::shared_ptr mob); + ThrownEnderpearl(Level *level, shared_ptr mob); ThrownEnderpearl(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/ThrownExpBottle.cpp b/Minecraft.World/ThrownExpBottle.cpp index 9640895e..75d3d9a1 100644 --- a/Minecraft.World/ThrownExpBottle.cpp +++ b/Minecraft.World/ThrownExpBottle.cpp @@ -11,7 +11,7 @@ ThrownExpBottle::ThrownExpBottle(Level *level) : Throwable(level) { } -ThrownExpBottle::ThrownExpBottle(Level *level, std::shared_ptr mob) : Throwable(level,mob) +ThrownExpBottle::ThrownExpBottle(Level *level, shared_ptr mob) : Throwable(level,mob) { } @@ -47,7 +47,7 @@ void ThrownExpBottle::onHit(HitResult *res) { int newCount = ExperienceOrb::getExperienceValue(xpCount); xpCount -= newCount; - level->addEntity(std::shared_ptr( new ExperienceOrb(level, x, y, z, newCount) ) ); + level->addEntity(shared_ptr( new ExperienceOrb(level, x, y, z, newCount) ) ); } remove(); diff --git a/Minecraft.World/ThrownExpBottle.h b/Minecraft.World/ThrownExpBottle.h index 555c51ae..8430794b 100644 --- a/Minecraft.World/ThrownExpBottle.h +++ b/Minecraft.World/ThrownExpBottle.h @@ -11,7 +11,7 @@ public: static Entity *create(Level *level) { return new ThrownExpBottle(level); } public: ThrownExpBottle(Level *level); - ThrownExpBottle(Level *level, std::shared_ptr mob); + ThrownExpBottle(Level *level, shared_ptr mob); ThrownExpBottle(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/ThrownPotion.cpp b/Minecraft.World/ThrownPotion.cpp index 09280476..7375d661 100644 --- a/Minecraft.World/ThrownPotion.cpp +++ b/Minecraft.World/ThrownPotion.cpp @@ -14,7 +14,7 @@ const double ThrownPotion::SPLASH_RANGE = 4.0; const double ThrownPotion::SPLASH_RANGE_SQ = ThrownPotion::SPLASH_RANGE * ThrownPotion::SPLASH_RANGE; void ThrownPotion::_init() -{ +{ // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); @@ -27,7 +27,7 @@ ThrownPotion::ThrownPotion(Level *level) : Throwable(level) _init(); } -ThrownPotion::ThrownPotion(Level *level, std::shared_ptr mob, int potionValue) : Throwable(level,mob) +ThrownPotion::ThrownPotion(Level *level, shared_ptr mob, int potionValue) : Throwable(level,mob) { _init(); @@ -74,15 +74,15 @@ void ThrownPotion::onHit(HitResult *res) if (mobEffects != NULL && !mobEffects->empty()) { AABB *aoe = bb->grow(SPLASH_RANGE, SPLASH_RANGE / 2, SPLASH_RANGE); - vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(Mob), aoe); + vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(Mob), aoe); if (entitiesOfClass != NULL && !entitiesOfClass->empty()) { //for (Entity e : entitiesOfClass) for(AUTO_VAR(it, entitiesOfClass->begin()); it != entitiesOfClass->end(); ++it) { - //std::shared_ptr e = *it; - std::shared_ptr e = dynamic_pointer_cast( *it ); + //shared_ptr e = *it; + shared_ptr e = dynamic_pointer_cast( *it ); double dist = distanceToSqr(e); if (dist < SPLASH_RANGE_SQ) { diff --git a/Minecraft.World/ThrownPotion.h b/Minecraft.World/ThrownPotion.h index 517b05ef..cf27491c 100644 --- a/Minecraft.World/ThrownPotion.h +++ b/Minecraft.World/ThrownPotion.h @@ -22,7 +22,7 @@ private: public: ThrownPotion(Level *level); - ThrownPotion(Level *level, std::shared_ptr mob, int potionValue); + ThrownPotion(Level *level, shared_ptr mob, int potionValue); ThrownPotion(Level *level, double x, double y, double z, int potionValue); protected: diff --git a/Minecraft.World/Tile.cpp b/Minecraft.World/Tile.cpp index 5862c934..77a62c8d 100644 --- a/Minecraft.World/Tile.cpp +++ b/Minecraft.World/Tile.cpp @@ -798,7 +798,7 @@ AABB *Tile::getTileAABB(Level *level, int x, int y, int z) return AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1); } -void Tile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void Tile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { AABB *aabb = getAABB(level, x, y, z); if (aabb != NULL && box->intersects(aabb)) boxes->push_back(aabb); @@ -870,7 +870,7 @@ int Tile::getResource(int data, Random *random, int playerBonusLevel) return id; } -float Tile::getDestroyProgress(std::shared_ptr player, Level *level, int x, int y, int z) +float Tile::getDestroyProgress(shared_ptr player, Level *level, int x, int y, int z) { float destroySpeed = getDestroySpeed(level, x, y, z); if (destroySpeed < 0) return 0; @@ -893,11 +893,11 @@ void Tile::spawnResources(Level *level, int x, int y, int z, int data, float odd int type = getResource(data, level->random, playerBonusLevel); if (type <= 0) continue; - popResource(level, x, y, z, std::shared_ptr( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data) ) ) ); + popResource(level, x, y, z, shared_ptr( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data) ) ) ); } } -void Tile::popResource(Level *level, int x, int y, int z, std::shared_ptr itemInstance) +void Tile::popResource(Level *level, int x, int y, int z, shared_ptr itemInstance) { if( level->isClientSide ) return; @@ -905,7 +905,7 @@ void Tile::popResource(Level *level, int x, int y, int z, std::shared_ptrrandom->nextFloat() * s + (1 - s) * 0.5; double yo = level->random->nextFloat() * s + (1 - s) * 0.5; double zo = level->random->nextFloat() * s + (1 - s) * 0.5; - std::shared_ptr item = std::shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, itemInstance ) ); + shared_ptr item = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, itemInstance ) ); item->throwTime = 10; level->addEntity(item); } @@ -919,7 +919,7 @@ void Tile::popExperience(Level *level, int x, int y, int z, int amount) { int newCount = ExperienceOrb::getExperienceValue(amount); amount -= newCount; - level->addEntity(std::shared_ptr( new ExperienceOrb(level, x + .5, y + .5, z + .5, newCount))); + level->addEntity(shared_ptr( new ExperienceOrb(level, x + .5, y + .5, z + .5, newCount))); } } } @@ -929,7 +929,7 @@ int Tile::getSpawnResourcesAuxValue(int data) return 0; } -float Tile::getExplosionResistance(std::shared_ptr source) +float Tile::getExplosionResistance(shared_ptr source) { return explosionResistance / 5.0f; } @@ -1030,17 +1030,17 @@ bool Tile::TestUse() return false; } -bool Tile::TestUse(Level *level, int x, int y, int z, std::shared_ptr player) +bool Tile::TestUse(Level *level, int x, int y, int z, shared_ptr player) { return false; } -bool Tile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool Tile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { return false; } -void Tile::stepOn(Level *level, int x, int y, int z, std::shared_ptr entity) +void Tile::stepOn(Level *level, int x, int y, int z, shared_ptr entity) { } @@ -1053,15 +1053,15 @@ void Tile::prepareRender(Level *level, int x, int y, int z) { } -void Tile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void Tile::attack(Level *level, int x, int y, int z, shared_ptr player) { } -void Tile::handleEntityInside(Level *level, int x, int y, int z, std::shared_ptr e, Vec3 *current) +void Tile::handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current) { } -void Tile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void Tile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); // 4J Stu - Added this so that the TLS shape is correct for this tile @@ -1151,7 +1151,7 @@ bool Tile::isSignalSource() return false; } -void Tile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void Tile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { } @@ -1165,7 +1165,7 @@ void Tile::updateDefaultShape() setShape(0,0,0,1,1,1); } -void Tile::playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data) +void Tile::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { // 4J Stu - Special case - only record a crop destroy if is fully grown if( id==Tile::crops_Id ) @@ -1208,7 +1208,7 @@ void Tile::playerDestroy(Level *level, std::shared_ptr player, int x, in if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player->inventory)) { - std::shared_ptr item = getSilkTouchItemInstance(data); + shared_ptr item = getSilkTouchItemInstance(data); if (item != NULL) { popResource(level, x, y, z, item); @@ -1226,14 +1226,14 @@ bool Tile::isSilkTouchable() return isCubeShaped() && !_isEntityTile; } -std::shared_ptr Tile::getSilkTouchItemInstance(int data) +shared_ptr Tile::getSilkTouchItemInstance(int data) { int popData = 0; if (id >= 0 && id < Item::items.length && Item::items[id]->isStackedByData()) { popData = data; } - return std::shared_ptr(new ItemInstance(id, 1, popData)); + return shared_ptr(new ItemInstance(id, 1, popData)); } int Tile::getResourceCountForLootBonus(int bonusLevel, Random *random) @@ -1246,7 +1246,7 @@ bool Tile::canSurvive(Level *level, int x, int y, int z) return true; } -void Tile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void Tile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { } @@ -1307,7 +1307,7 @@ float Tile::getShadeBrightness(LevelSource *level, int x, int y, int z) return level->isSolidBlockingTile(x, y, z) ? 0.2f : 1.0f; } -void Tile::fallOn(Level *level, int x, int y, int z, std::shared_ptr entity, float fallDistance) +void Tile::fallOn(Level *level, int x, int y, int z, shared_ptr entity, float fallDistance) { } @@ -1321,7 +1321,7 @@ int Tile::cloneTileData(Level *level, int x, int y, int z) return getSpawnResourcesAuxValue(level->getData(x, y, z)); } -void Tile::playerWillDestroy(Level *level, int x, int y, int z, int data, std::shared_ptr player) +void Tile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player) { } diff --git a/Minecraft.World/Tile.h b/Minecraft.World/Tile.h index 999f10c9..fb17f917 100644 --- a/Minecraft.World/Tile.h +++ b/Minecraft.World/Tile.h @@ -545,7 +545,7 @@ public: virtual Icon *getTexture(int face, int data); virtual Icon *getTexture(int face); virtual AABB *getTileAABB(Level *level, int x, int y, int z); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual AABB *getAABB(Level *level, int x, int y, int z); virtual bool isSolidRender(bool isServerLevel = false); // 4J - Added isServerLevel param virtual bool mayPick(int data, bool liquid); @@ -560,16 +560,16 @@ public: virtual void onRemove(Level *level, int x, int y, int z, int id, int data); virtual int getResourceCount(Random *random); virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual float getDestroyProgress(std::shared_ptr player, Level *level, int x, int y, int z); + virtual float getDestroyProgress(shared_ptr player, Level *level, int x, int y, int z); virtual void spawnResources(Level *level, int x, int y, int z, int data, int playerBonusLevel); virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); protected: - virtual void popResource(Level *level, int x, int y, int z, std::shared_ptr itemInstance); + virtual void popResource(Level *level, int x, int y, int z, shared_ptr itemInstance); virtual void popExperience(Level *level, int x, int y, int z, int amount); public: virtual int getSpawnResourcesAuxValue(int data); - virtual float getExplosionResistance(std::shared_ptr source); + virtual float getExplosionResistance(shared_ptr source); virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); private: virtual bool containsX(Vec3 *v); @@ -581,14 +581,14 @@ public: virtual bool mayPlace(Level *level, int x, int y, int z, int face); virtual bool mayPlace(Level *level, int x, int y, int z); virtual bool TestUse(); - virtual bool TestUse(Level *level, int x, int y, int z, std::shared_ptr player); - virtual bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void stepOn(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual bool TestUse(Level *level, int x, int y, int z, shared_ptr player); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void stepOn(Level *level, int x, int y, int z, shared_ptr entity); virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); virtual void prepareRender(Level *level, int x, int y, int z); - virtual void attack(Level *level, int x, int y, int z, std::shared_ptr player); - virtual void handleEntityInside(Level *level, int x, int y, int z, std::shared_ptr e, Vec3 *current); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual double getShapeX0(); virtual double getShapeX1(); virtual double getShapeY0(); @@ -602,17 +602,17 @@ public: virtual bool getSignal(LevelSource *level, int x, int y, int z); virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); virtual bool isSignalSource(); - virtual void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); virtual void updateDefaultShape(); - virtual void playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data); + virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); virtual bool canSurvive(Level *level, int x, int y, int z); protected: virtual bool isSilkTouchable(); - virtual std::shared_ptr getSilkTouchItemInstance(int data); + virtual shared_ptr getSilkTouchItemInstance(int data); public: virtual int getResourceCountForLootBonus(int bonusLevel, Random *random); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); virtual void finalizePlacement(Level *level, int x, int y, int z, int data); virtual Tile *setDescriptionId(unsigned int id); virtual wstring getName(); @@ -630,10 +630,10 @@ protected: public: virtual int getPistonPushReaction(); virtual float getShadeBrightness(LevelSource *level, int x, int y, int z); // 4J - brought forward from 1.8.2 - virtual void fallOn(Level *level, int x, int y, int z, std::shared_ptr entity, float fallDistance); + virtual void fallOn(Level *level, int x, int y, int z, shared_ptr entity, float fallDistance); virtual int cloneTileId(Level *level, int x, int y, int z); virtual int cloneTileData(Level *level, int x, int y, int z); - virtual void playerWillDestroy(Level *level, int x, int y, int z, int data, std::shared_ptr player); + virtual void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player); virtual void onRemoving(Level *level, int x, int y, int z, int data); virtual void handleRain(Level *level, int x, int y, int z); virtual void levelTimeChanged(Level *level, int64_t delta, int64_t newTime); diff --git a/Minecraft.World/TileDestructionPacket.cpp b/Minecraft.World/TileDestructionPacket.cpp index 98aa4ad5..e009e0e0 100644 --- a/Minecraft.World/TileDestructionPacket.cpp +++ b/Minecraft.World/TileDestructionPacket.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.network.packet.h" #include "TileDestructionPacket.h" -TileDestructionPacket::TileDestructionPacket() +TileDestructionPacket::TileDestructionPacket() { id = 0; x = 0; @@ -78,8 +78,8 @@ bool TileDestructionPacket::canBeInvalidated() return true; } -bool TileDestructionPacket::isInvalidatedBy(std::shared_ptr packet) +bool TileDestructionPacket::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target->id == id; } \ No newline at end of file diff --git a/Minecraft.World/TileDestructionPacket.h b/Minecraft.World/TileDestructionPacket.h index 394ffaa1..20cd7db9 100644 --- a/Minecraft.World/TileDestructionPacket.h +++ b/Minecraft.World/TileDestructionPacket.h @@ -27,9 +27,9 @@ public: int getState(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new TileDestructionPacket()); } + static shared_ptr create() { return shared_ptr(new TileDestructionPacket()); } virtual int getId() { return 55; } }; \ No newline at end of file diff --git a/Minecraft.World/TileEntity.cpp b/Minecraft.World/TileEntity.cpp index d4874928..0790601d 100644 --- a/Minecraft.World/TileEntity.cpp +++ b/Minecraft.World/TileEntity.cpp @@ -89,14 +89,14 @@ void TileEntity::tick() { } -std::shared_ptr TileEntity::loadStatic(CompoundTag *tag) +shared_ptr TileEntity::loadStatic(CompoundTag *tag) { - std::shared_ptr entity = nullptr; + shared_ptr entity = nullptr; //try //{ AUTO_VAR(it, idCreateMap.find(tag->getString(L"id"))); - if (it != idCreateMap.end() ) entity = std::shared_ptr(it->second()); + if (it != idCreateMap.end() ) entity = shared_ptr(it->second()); //} //catch (Exception e) //{ @@ -152,7 +152,7 @@ Tile *TileEntity::getTile() return tile; } -std::shared_ptr TileEntity::getUpdatePacket() +shared_ptr TileEntity::getUpdatePacket() { return nullptr; } @@ -200,7 +200,7 @@ void TileEntity::upgradeRenderRemoveStage() } // 4J Added -void TileEntity::clone(std::shared_ptr tileEntity) +void TileEntity::clone(shared_ptr tileEntity) { tileEntity->level = this->level; tileEntity->x = this->x; diff --git a/Minecraft.World/TileEntity.h b/Minecraft.World/TileEntity.h index 87a3483a..aa3ced4f 100644 --- a/Minecraft.World/TileEntity.h +++ b/Minecraft.World/TileEntity.h @@ -54,13 +54,13 @@ public: virtual void load(CompoundTag *tag); virtual void save(CompoundTag *tag); virtual void tick(); - static std::shared_ptr loadStatic(CompoundTag *tag); + static shared_ptr loadStatic(CompoundTag *tag); int getData(); void setData(int data); void setChanged(); double distanceToSqr(double xPlayer, double yPlayer, double zPlayer); Tile *getTile(); - virtual std::shared_ptr getUpdatePacket(); + virtual shared_ptr getUpdatePacket(); virtual bool isRemoved(); virtual void setRemoved(); virtual void clearRemoved(); @@ -68,7 +68,7 @@ public: virtual void clearCache(); // 4J Added - virtual std::shared_ptr clone() = 0; + virtual shared_ptr clone() = 0; protected: - void clone(std::shared_ptr tileEntity); + void clone(shared_ptr tileEntity); }; \ No newline at end of file diff --git a/Minecraft.World/TileEntityDataPacket.h b/Minecraft.World/TileEntityDataPacket.h index 522392ed..2ee998f3 100644 --- a/Minecraft.World/TileEntityDataPacket.h +++ b/Minecraft.World/TileEntityDataPacket.h @@ -31,6 +31,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TileEntityDataPacket()); } + static shared_ptr create() { return shared_ptr(new TileEntityDataPacket()); } virtual int getId() { return 132; } }; \ No newline at end of file diff --git a/Minecraft.World/TileEventPacket.h b/Minecraft.World/TileEventPacket.h index b1d60bad..ca2685fa 100644 --- a/Minecraft.World/TileEventPacket.h +++ b/Minecraft.World/TileEventPacket.h @@ -17,6 +17,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TileEventPacket()); } + static shared_ptr create() { return shared_ptr(new TileEventPacket()); } virtual int getId() { return 54; } }; \ No newline at end of file diff --git a/Minecraft.World/TileItem.cpp b/Minecraft.World/TileItem.cpp index 12ed3257..8f624bff 100644 --- a/Minecraft.World/TileItem.cpp +++ b/Minecraft.World/TileItem.cpp @@ -17,13 +17,13 @@ using namespace std; #include -TileItem::TileItem(int id) : Item(id) +TileItem::TileItem(int id) : Item(id) { this->tileId = id + 256; itemIcon = NULL; } -int TileItem::getTileId() +int TileItem::getTileId() { return tileId; } @@ -46,18 +46,18 @@ Icon *TileItem::getIcon(int auxValue) return Tile::tiles[tileId]->getTexture(Facing::UP, auxValue); } -bool TileItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool TileItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed int currentTile = level->getTile(x, y, z); - if (currentTile == Tile::topSnow_Id) + if (currentTile == Tile::topSnow_Id) { face = Facing::UP; } else if (currentTile == Tile::vine_Id || currentTile == Tile::tallgrass_Id || currentTile == Tile::deadBush_Id) { } - else + else { if (face == 0) y--; if (face == 1) y++; @@ -75,7 +75,7 @@ bool TileItem::useOn(std::shared_ptr instance, std::shared_ptrgetTile(x,y-1,z); // For 'BodyGuard' achievement. - if (level->mayPlace(tileId, x, y, z, false, face, player)) + if (level->mayPlace(tileId, x, y, z, false, face, player)) { if(!bTestUseOnOnly) { @@ -83,7 +83,7 @@ bool TileItem::useOn(std::shared_ptr instance, std::shared_ptrgetAuxValue()); int dataValue = Tile::tiles[tileId]->getPlacedOnFaceDataValue(level, x, y, z, face, clickX, clickY, clickZ, itemValue); - if (level->setTileAndData(x, y, z, tileId, dataValue)) + if (level->setTileAndData(x, y, z, tileId, dataValue)) { // 4J-JEV: Snow/Iron Golems do not have owners apparently. int newTileId = level->getTile(x,y,z); @@ -115,7 +115,7 @@ bool TileItem::useOn(std::shared_ptr instance, std::shared_ptrsetPlacedBy(level, x, y, z, player); Tile::tiles[tileId]->finalizePlacement(level, x, y, z, dataValue); } - + // 4J-PB - Java 1.4 change - getStepSound replaced with getPlaceSound //level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, tile->soundType->getStepSound(), (tile->soundType->getVolume() + 1) / 2, tile->soundType->getPitch() * 0.8f); #ifdef _DEBUG @@ -125,7 +125,7 @@ bool TileItem::useOn(std::shared_ptr instance, std::shared_ptr instance, std::shared_ptr player, std::shared_ptr item) +bool TileItem::mayPlace(Level *level, int x, int y, int z, int face, shared_ptr player, shared_ptr item) { int currentTile = level->getTile(x, y, z); - if (currentTile == Tile::topSnow_Id) + if (currentTile == Tile::topSnow_Id) { face = Facing::UP; - } - else if (currentTile != Tile::vine_Id && currentTile != Tile::tallgrass_Id && currentTile != Tile::deadBush_Id) + } + else if (currentTile != Tile::vine_Id && currentTile != Tile::tallgrass_Id && currentTile != Tile::deadBush_Id) { if (face == 0) y--; if (face == 1) y++; @@ -188,25 +188,25 @@ int TileItem::getColor(int itemAuxValue, int spriteLayer) return Tile::tiles[tileId]->getColor(); } -unsigned int TileItem::getDescriptionId(std::shared_ptr instance) +unsigned int TileItem::getDescriptionId(shared_ptr instance) { return Tile::tiles[tileId]->getDescriptionId(); } -unsigned int TileItem::getDescriptionId(int iData /*= -1*/) +unsigned int TileItem::getDescriptionId(int iData /*= -1*/) { return Tile::tiles[tileId]->getDescriptionId(iData); } -unsigned int TileItem::getUseDescriptionId(std::shared_ptr instance) +unsigned int TileItem::getUseDescriptionId(shared_ptr instance) { return Tile::tiles[tileId]->getUseDescriptionId(); } -unsigned int TileItem::getUseDescriptionId() +unsigned int TileItem::getUseDescriptionId() { return Tile::tiles[tileId]->getUseDescriptionId(); } diff --git a/Minecraft.World/TileItem.h b/Minecraft.World/TileItem.h index c1492c38..ac341acc 100644 --- a/Minecraft.World/TileItem.h +++ b/Minecraft.World/TileItem.h @@ -11,13 +11,13 @@ class TileItem : public Item public: static const int _class = 0; using Item::getColor; -private: +private: int tileId; Icon *itemIcon; public: - TileItem(int id); - + TileItem(int id); + virtual int getTileId(); //@Override @@ -26,18 +26,18 @@ public: //@Override Icon *getIcon(int auxValue); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual unsigned int getDescriptionId(shared_ptr instance); virtual unsigned int getDescriptionId(int iData = -1); // 4J Added virtual int getColor(int itemAuxValue, int spriteLayer); // 4J Added - virtual unsigned int getUseDescriptionId(std::shared_ptr instance); + virtual unsigned int getUseDescriptionId(shared_ptr instance); virtual unsigned int getUseDescriptionId(); - virtual bool mayPlace(Level *level, int x, int y, int z, int face, std::shared_ptr player, std::shared_ptr item); + virtual bool mayPlace(Level *level, int x, int y, int z, int face, shared_ptr player, shared_ptr item); //@Override virtual void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/TilePlanterItem.cpp b/Minecraft.World/TilePlanterItem.cpp index 3b281ba9..883da76e 100644 --- a/Minecraft.World/TilePlanterItem.cpp +++ b/Minecraft.World/TilePlanterItem.cpp @@ -15,14 +15,14 @@ TilePlanterItem::TilePlanterItem(int id, Tile *tile) : Item(id) this->tileId = tile->id; } -bool TilePlanterItem::useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool TilePlanterItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed int currentTile = level->getTile(x, y, z); - if (currentTile == Tile::topSnow_Id) + if (currentTile == Tile::topSnow_Id) { face = Facing::UP; - } + } else if (currentTile == Tile::vine_Id || currentTile == Tile::tallgrass_Id || currentTile == Tile::deadBush_Id) { } @@ -39,7 +39,7 @@ bool TilePlanterItem::useOn(std::shared_ptr instance, std::shared_ if (!player->mayBuild(x, y, z)) return false; if (instance->count == 0) return false; - if (level->mayPlace(tileId, x, y, z, false, face, nullptr)) + if (level->mayPlace(tileId, x, y, z, false, face, nullptr)) { if(!bTestUseOnOnly) { @@ -63,13 +63,13 @@ bool TilePlanterItem::useOn(std::shared_ptr instance, std::shared_ // 4J-PB - If we have the debug option on, don't reduce the number of this item #ifndef _FINAL_BUILD if(!(app.DebugSettingsOn() && app.GetGameSettingsDebugMask()&(1L<count--; } } - } + } } else { diff --git a/Minecraft.World/TilePlanterItem.h b/Minecraft.World/TilePlanterItem.h index a7cb4386..d1577cd1 100644 --- a/Minecraft.World/TilePlanterItem.h +++ b/Minecraft.World/TilePlanterItem.h @@ -11,5 +11,5 @@ private: public: TilePlanterItem(int id, Tile *tile); - virtual bool useOn(std::shared_ptr instance, std::shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); }; \ No newline at end of file diff --git a/Minecraft.World/TileUpdatePacket.h b/Minecraft.World/TileUpdatePacket.h index 4ed1a9c8..fe69c763 100644 --- a/Minecraft.World/TileUpdatePacket.h +++ b/Minecraft.World/TileUpdatePacket.h @@ -18,6 +18,6 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TileUpdatePacket()); } + static shared_ptr create() { return shared_ptr(new TileUpdatePacket()); } virtual int getId() { return 53; } }; \ No newline at end of file diff --git a/Minecraft.World/TimeCommand.cpp b/Minecraft.World/TimeCommand.cpp index 0c387b79..e667a420 100644 --- a/Minecraft.World/TimeCommand.cpp +++ b/Minecraft.World/TimeCommand.cpp @@ -10,7 +10,7 @@ EGameCommand TimeCommand::getId() return eGameCommand_Time; } -void TimeCommand::execute(std::shared_ptr source, byteArray commandData) +void TimeCommand::execute(shared_ptr source, byteArray commandData) { ByteArrayInputStream bais(commandData); DataInputStream dis(&bais); @@ -52,7 +52,7 @@ void TimeCommand::execute(std::shared_ptr source, byteArray comma //throw new UsageException("commands.time.usage"); } -void TimeCommand::doSetTime(std::shared_ptr source, int value) +void TimeCommand::doSetTime(shared_ptr source, int value) { for (int i = 0; i < MinecraftServer::getInstance()->levels.length; i++) { @@ -60,7 +60,7 @@ void TimeCommand::doSetTime(std::shared_ptr source, int value) } } -void TimeCommand::doAddTime(std::shared_ptr source, int value) +void TimeCommand::doAddTime(shared_ptr source, int value) { for (int i = 0; i < MinecraftServer::getInstance()->levels.length; i++) { @@ -69,12 +69,12 @@ void TimeCommand::doAddTime(std::shared_ptr source, int value) } } -std::shared_ptr TimeCommand::preparePacket(bool night) +shared_ptr TimeCommand::preparePacket(bool night) { ByteArrayOutputStream baos; DataOutputStream dos(&baos); dos.writeBoolean(night); - return std::shared_ptr( new GameCommandPacket(eGameCommand_Time, baos.toByteArray() )); + return shared_ptr( new GameCommandPacket(eGameCommand_Time, baos.toByteArray() )); } \ No newline at end of file diff --git a/Minecraft.World/TimeCommand.h b/Minecraft.World/TimeCommand.h index da7008b2..f87fb27c 100644 --- a/Minecraft.World/TimeCommand.h +++ b/Minecraft.World/TimeCommand.h @@ -6,12 +6,12 @@ class TimeCommand : public Command { public: virtual EGameCommand getId(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); protected: - void doSetTime(std::shared_ptr source, int value); - void doAddTime(std::shared_ptr source, int value); + void doSetTime(shared_ptr source, int value); + void doAddTime(shared_ptr source, int value); public: - static std::shared_ptr preparePacket(bool night); + static shared_ptr preparePacket(bool night); }; \ No newline at end of file diff --git a/Minecraft.World/TntTile.cpp b/Minecraft.World/TntTile.cpp index 5d47a2ac..b422959c 100644 --- a/Minecraft.World/TntTile.cpp +++ b/Minecraft.World/TntTile.cpp @@ -53,13 +53,13 @@ void TntTile::wasExploded(Level *level, int x, int y, int z) { // 4J - added - don't every create on the client, I think this must be the cause of a bug reported in the java // version where white tnts are created in the network game - if (level->isClientSide) return; + if (level->isClientSide) return; // 4J - added condition to have finite limit of these // 4J-JEV: Fix for #90934 - Customer Encountered: TU11: Content: Gameplay: TNT blocks are triggered by explosions even though "TNT explodes" option is unchecked. if( level->newPrimedTntAllowed() && app.GetGameHostOption(eGameHostOption_TNT) ) { - std::shared_ptr primed = std::shared_ptr( new PrimedTnt(level, x + 0.5f, y + 0.5f, z + 0.5f) ); + shared_ptr primed = shared_ptr( new PrimedTnt(level, x + 0.5f, y + 0.5f, z + 0.5f) ); primed->life = level->random->nextInt(primed->life / 4) + primed->life / 8; level->addEntity(primed); } @@ -74,14 +74,14 @@ void TntTile::destroy(Level *level, int x, int y, int z, int data) // 4J - added condition to have finite limit of these if( level->newPrimedTntAllowed() && app.GetGameHostOption(eGameHostOption_TNT) ) { - std::shared_ptr tnt = std::shared_ptr( new PrimedTnt(level, x + 0.5f, y + 0.5f, z + 0.5f) ); + shared_ptr tnt = shared_ptr( new PrimedTnt(level, x + 0.5f, y + 0.5f, z + 0.5f) ); level->addEntity(tnt); level->playSound(tnt, eSoundType_RANDOM_FUSE, 1, 1.0f); } } } -bool TntTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool TntTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if (soundOnly) return false; if (player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::flintAndSteel_Id) @@ -93,12 +93,12 @@ bool TntTile::use(Level *level, int x, int y, int z, std::shared_ptr pla return Tile::use(level, x, y, z, player, clickedFace, clickX, clickY, clickZ); } -void TntTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void TntTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { if (entity->GetType() == eTYPE_ARROW && !level->isClientSide) { // 4J Stu - Don't need to cast this - //std::shared_ptr arrow = dynamic_pointer_cast(entity); + //shared_ptr arrow = dynamic_pointer_cast(entity); if (entity->isOnFire()) { destroy(level, x, y, z, EXPLODE_BIT); @@ -107,12 +107,12 @@ void TntTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr TntTile::getSilkTouchItemInstance(int data) +shared_ptr TntTile::getSilkTouchItemInstance(int data) { return nullptr; } -void TntTile::registerIcons(IconRegister *iconRegister) +void TntTile::registerIcons(IconRegister *iconRegister) { icon = iconRegister->registerIcon(L"tnt_side"); iconTop = iconRegister->registerIcon(L"tnt_top"); diff --git a/Minecraft.World/TntTile.h b/Minecraft.World/TntTile.h index b628e01c..27b788c6 100644 --- a/Minecraft.World/TntTile.h +++ b/Minecraft.World/TntTile.h @@ -23,9 +23,9 @@ public: void destroy(Level *level, int x, int y, int z, int data); - bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); - virtual std::shared_ptr getSilkTouchItemInstance(int data); + void entityInside(Level *level, int x, int y, int z, shared_ptr entity); + virtual shared_ptr getSilkTouchItemInstance(int data); void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/ToggleDownfallCommand.cpp b/Minecraft.World/ToggleDownfallCommand.cpp index 9eebc3f3..1ae2f3a9 100644 --- a/Minecraft.World/ToggleDownfallCommand.cpp +++ b/Minecraft.World/ToggleDownfallCommand.cpp @@ -12,7 +12,7 @@ EGameCommand ToggleDownfallCommand::getId() return eGameCommand_ToggleDownfall; } -void ToggleDownfallCommand::execute(std::shared_ptr source, byteArray commandData) +void ToggleDownfallCommand::execute(shared_ptr source, byteArray commandData) { doToggleDownfall(); logAdminAction(source, ChatPacket::e_ChatCustom, L"commands.downfall.success"); @@ -24,7 +24,7 @@ void ToggleDownfallCommand::doToggleDownfall() MinecraftServer::getInstance()->levels[0]->getLevelData()->setThundering(true); } -std::shared_ptr ToggleDownfallCommand::preparePacket() +shared_ptr ToggleDownfallCommand::preparePacket() { - return std::shared_ptr( new GameCommandPacket(eGameCommand_ToggleDownfall, byteArray() )); + return shared_ptr( new GameCommandPacket(eGameCommand_ToggleDownfall, byteArray() )); } \ No newline at end of file diff --git a/Minecraft.World/ToggleDownfallCommand.h b/Minecraft.World/ToggleDownfallCommand.h index a19b7251..2954962b 100644 --- a/Minecraft.World/ToggleDownfallCommand.h +++ b/Minecraft.World/ToggleDownfallCommand.h @@ -7,11 +7,11 @@ class ToggleDownfallCommand : public Command { public: virtual EGameCommand getId(); - virtual void execute(std::shared_ptr source, byteArray commandData); + virtual void execute(shared_ptr source, byteArray commandData); protected: void doToggleDownfall(); public: - static std::shared_ptr preparePacket(); + static shared_ptr preparePacket(); }; \ No newline at end of file diff --git a/Minecraft.World/TopSnowTile.cpp b/Minecraft.World/TopSnowTile.cpp index c9e92f4a..9bcf5527 100644 --- a/Minecraft.World/TopSnowTile.cpp +++ b/Minecraft.World/TopSnowTile.cpp @@ -64,7 +64,7 @@ void TopSnowTile::updateDefaultShape() updateShape(0); } -void TopSnowTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void TopSnowTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { updateShape(level->getData(x, y, z)); } @@ -104,14 +104,14 @@ bool TopSnowTile::checkCanSurvive(Level *level, int x, int y, int z) } -void TopSnowTile::playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data) +void TopSnowTile::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { int type = Item::snowBall->id; float s = 0.7f; double xo = level->random->nextFloat() * s + (1 - s) * 0.5; double yo = level->random->nextFloat() * s + (1 - s) * 0.5; double zo = level->random->nextFloat() * s + (1 - s) * 0.5; - std::shared_ptr item = std::shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, std::shared_ptr( new ItemInstance(type, 1, 0) ) ) ); + shared_ptr item = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(type, 1, 0) ) ) ); item->throwTime = 10; level->addEntity(item); level->setTile(x, y, z, 0); diff --git a/Minecraft.World/TopSnowTile.h b/Minecraft.World/TopSnowTile.h index ba4c69a5..059f0f42 100644 --- a/Minecraft.World/TopSnowTile.h +++ b/Minecraft.World/TopSnowTile.h @@ -32,7 +32,7 @@ public: public: void updateDefaultShape(); - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param protected: void updateShape(int data); @@ -47,7 +47,7 @@ private: bool checkCanSurvive(Level *level, int x, int y, int z); public: - void playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data); + void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); public: int getResource(int data, Random *random, int playerBonusLevel); @@ -60,7 +60,7 @@ public: public: bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); }; diff --git a/Minecraft.World/TorchTile.cpp b/Minecraft.World/TorchTile.cpp index 5cbeeae7..ea1d2ab7 100644 --- a/Minecraft.World/TorchTile.cpp +++ b/Minecraft.World/TorchTile.cpp @@ -20,7 +20,7 @@ AABB *TorchTile::getTileAABB(Level *level, int x, int y, int z) return Tile::getTileAABB(level, x, y, z); } -void TorchTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void TorchTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { setShape(level->getData(x, y, z)); } @@ -75,7 +75,7 @@ bool TorchTile::isConnection(Level *level, int x, int y, int z) return true; } int tile = level->getTile(x, y, z); - if (tile == Tile::fence_Id || tile == Tile::netherFence_Id + if (tile == Tile::fence_Id || tile == Tile::netherFence_Id || tile == Tile::glass_Id || tile == Tile::cobbleWall_Id) { return true; diff --git a/Minecraft.World/TorchTile.h b/Minecraft.World/TorchTile.h index 7b6c8bac..7e27f2ee 100644 --- a/Minecraft.World/TorchTile.h +++ b/Minecraft.World/TorchTile.h @@ -13,7 +13,7 @@ protected: public: virtual AABB *getAABB(Level *level, int x, int y, int z); virtual AABB *getTileAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param using Tile::setShape; virtual void setShape(int data); virtual bool isSolidRender(bool isServerLevel = false); @@ -30,7 +30,7 @@ private: public: virtual HitResult *clip(Level *level, int x, int y, int z, Vec3 *a, Vec3 *b); virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); - + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); }; diff --git a/Minecraft.World/TradeItemPacket.h b/Minecraft.World/TradeItemPacket.h index c6c8ae28..ecd0f707 100644 --- a/Minecraft.World/TradeItemPacket.h +++ b/Minecraft.World/TradeItemPacket.h @@ -25,7 +25,7 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new TradeItemPacket()); } + static shared_ptr create() { return shared_ptr(new TradeItemPacket()); } virtual int getId() { return 151; } }; diff --git a/Minecraft.World/TradeWithPlayerGoal.cpp b/Minecraft.World/TradeWithPlayerGoal.cpp index 97d417e5..e8b791d1 100644 --- a/Minecraft.World/TradeWithPlayerGoal.cpp +++ b/Minecraft.World/TradeWithPlayerGoal.cpp @@ -18,7 +18,7 @@ bool TradeWithPlayerGoal::canUse() if (!mob->onGround) return false; if (mob->hurtMarked) return false; - std::shared_ptr trader = mob->getTradingPlayer(); + shared_ptr trader = mob->getTradingPlayer(); if (trader == NULL) { // no interaction diff --git a/Minecraft.World/TrapDoorTile.cpp b/Minecraft.World/TrapDoorTile.cpp index b8afca43..fc9d6580 100644 --- a/Minecraft.World/TrapDoorTile.cpp +++ b/Minecraft.World/TrapDoorTile.cpp @@ -55,7 +55,7 @@ AABB *TrapDoorTile::getAABB(Level *level, int x, int y, int z) } -void TrapDoorTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void TrapDoorTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { setShape(level->getData(x, y, z)); } @@ -83,7 +83,7 @@ void TrapDoorTile::setShape(int data) } -void TrapDoorTile::attack(Level *level, int x, int y, int z, std::shared_ptr player) +void TrapDoorTile::attack(Level *level, int x, int y, int z, shared_ptr player) { use(level, x, y, z, player, 0, 0, 0, 0); } @@ -94,7 +94,7 @@ bool TrapDoorTile::TestUse() return true; } -bool TrapDoorTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool TrapDoorTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if (material == Material::metal) return true; diff --git a/Minecraft.World/TrapDoorTile.h b/Minecraft.World/TrapDoorTile.h index 5f6a52e7..19cec150 100644 --- a/Minecraft.World/TrapDoorTile.h +++ b/Minecraft.World/TrapDoorTile.h @@ -43,7 +43,7 @@ public: AABB *getAABB(Level *level, int x, int y, int z); public: - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param public: void updateDefaultShape(); @@ -53,11 +53,11 @@ public: void setShape(int data); public: - void attack(Level *level, int x, int y, int z, std::shared_ptr player); + void attack(Level *level, int x, int y, int z, shared_ptr player); public: virtual bool TestUse(); - bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param public: void setOpen(Level *level, int x, int y, int z, bool shouldOpen); diff --git a/Minecraft.World/TrapMenu.cpp b/Minecraft.World/TrapMenu.cpp index da43347a..5e59c6fe 100644 --- a/Minecraft.World/TrapMenu.cpp +++ b/Minecraft.World/TrapMenu.cpp @@ -5,7 +5,7 @@ #include "Slot.h" #include "TrapMenu.h" -TrapMenu::TrapMenu(std::shared_ptr inventory, std::shared_ptr trap) +TrapMenu::TrapMenu(shared_ptr inventory, shared_ptr trap) { this->trap = trap; @@ -30,19 +30,19 @@ TrapMenu::TrapMenu(std::shared_ptr inventory, std::shared_ptr player) +bool TrapMenu::stillValid(shared_ptr player) { return trap->stillValid(player); } // 4J Stu - Brought forward from 1.2 -std::shared_ptr TrapMenu::quickMoveStack(std::shared_ptr player, int slotIndex) +shared_ptr TrapMenu::quickMoveStack(shared_ptr player, int slotIndex) { - std::shared_ptr clicked = nullptr; + shared_ptr clicked = nullptr; Slot *slot = slots->at(slotIndex); if (slot != NULL && slot->hasItem()) { - std::shared_ptr stack = slot->getItem(); + shared_ptr stack = slot->getItem(); clicked = stack->copy(); if (slotIndex < INV_SLOT_START) diff --git a/Minecraft.World/TrapMenu.h b/Minecraft.World/TrapMenu.h index 6e5cc517..e3fb4965 100644 --- a/Minecraft.World/TrapMenu.h +++ b/Minecraft.World/TrapMenu.h @@ -12,11 +12,11 @@ private: static const int USE_ROW_SLOT_START = INV_SLOT_END; static const int USE_ROW_SLOT_END = USE_ROW_SLOT_START + 9; private: - std::shared_ptr trap; + shared_ptr trap; public: - TrapMenu(std::shared_ptr inventory, std::shared_ptr trap); + TrapMenu(shared_ptr inventory, shared_ptr trap); - virtual bool stillValid(std::shared_ptr player); - virtual std::shared_ptr quickMoveStack(std::shared_ptr player, int slotIndex); + virtual bool stillValid(shared_ptr player); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); }; \ No newline at end of file diff --git a/Minecraft.World/TreeTile.cpp b/Minecraft.World/TreeTile.cpp index fa734a7c..29871625 100644 --- a/Minecraft.World/TreeTile.cpp +++ b/Minecraft.World/TreeTile.cpp @@ -60,7 +60,7 @@ void TreeTile::onRemove(Level *level, int x, int y, int z, int id, int data) } } -void TreeTile::setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by) +void TreeTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int type = level->getData(x, y, z) & MASK_TYPE; int dir = PistonBaseTile::getNewFacing(level, x, y, z, dynamic_pointer_cast(by)); @@ -93,7 +93,7 @@ Icon *TreeTile::getTexture(int face, int data) if (dir == FACING_Y && (face == Facing::UP || face == Facing::DOWN)) { return iconTop; - } + } else if (dir == FACING_X && (face == Facing::EAST || face == Facing::WEST)) { return iconTop; @@ -123,10 +123,10 @@ int TreeTile::getWoodType(int data) return data & MASK_TYPE; } -std::shared_ptr TreeTile::getSilkTouchItemInstance(int data) +shared_ptr TreeTile::getSilkTouchItemInstance(int data) { // fix to avoid getting silktouched sideways logs - return std::shared_ptr(new ItemInstance(id, 1, getWoodType(data))); + return shared_ptr(new ItemInstance(id, 1, getWoodType(data))); } void TreeTile::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/TreeTile.h b/Minecraft.World/TreeTile.h index 5a4f0a29..b7e0d56d 100644 --- a/Minecraft.World/TreeTile.h +++ b/Minecraft.World/TreeTile.h @@ -6,7 +6,7 @@ class ChunkRebuildData; class Player; class TreeTile : public Tile -{ +{ friend class Tile; friend class ChunkRebuildData; public: @@ -39,7 +39,7 @@ public: virtual int getResourceCount(Random *random); virtual int getResource(int data, Random *random, int playerBonusLevel); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual void setPlacedBy(Level *level, int x, int y, int z, std::shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); virtual Icon *getTexture(int face, int data); virtual unsigned int getDescriptionId(int iData = -1); @@ -51,5 +51,5 @@ public: void registerIcons(IconRegister *iconRegister); protected: - virtual std::shared_ptr getSilkTouchItemInstance(int data); + virtual shared_ptr getSilkTouchItemInstance(int data); }; \ No newline at end of file diff --git a/Minecraft.World/TreeTileItem.cpp b/Minecraft.World/TreeTileItem.cpp index d260a556..30406821 100644 --- a/Minecraft.World/TreeTileItem.cpp +++ b/Minecraft.World/TreeTileItem.cpp @@ -15,12 +15,12 @@ Icon *TreeTileItem::getIcon(int itemAuxValue) return parentTile->getTexture(2, itemAuxValue); } -int TreeTileItem::getLevelDataForAuxValue(int auxValue) +int TreeTileItem::getLevelDataForAuxValue(int auxValue) { return auxValue; } -unsigned int TreeTileItem::getDescriptionId(std::shared_ptr instance) +unsigned int TreeTileItem::getDescriptionId(shared_ptr instance) { int auxValue = instance->getAuxValue(); if (auxValue < 0 || auxValue >= TreeTile::TREE_NAMES_LENGTH) diff --git a/Minecraft.World/TreeTileItem.h b/Minecraft.World/TreeTileItem.h index dea75075..7f7b2825 100644 --- a/Minecraft.World/TreeTileItem.h +++ b/Minecraft.World/TreeTileItem.h @@ -3,7 +3,7 @@ using namespace std; #include "TileItem.h" -class TreeTileItem : public TileItem +class TreeTileItem : public TileItem { private: Tile *parentTile; @@ -14,5 +14,5 @@ public: virtual Icon *getIcon(int itemAuxValue); virtual int getLevelDataForAuxValue(int auxValue); - virtual unsigned int getDescriptionId(std::shared_ptr instance); + virtual unsigned int getDescriptionId(shared_ptr instance); }; \ No newline at end of file diff --git a/Minecraft.World/TripWireSourceTile.cpp b/Minecraft.World/TripWireSourceTile.cpp index 1b560019..33f857fa 100644 --- a/Minecraft.World/TripWireSourceTile.cpp +++ b/Minecraft.World/TripWireSourceTile.cpp @@ -108,7 +108,7 @@ void TripWireSourceTile::neighborChanged(Level *level, int x, int y, int z, int } } -void TripWireSourceTile::calculateState(Level *level, int x, int y, int z, int id, int data, bool canUpdate, +void TripWireSourceTile::calculateState(Level *level, int x, int y, int z, int id, int data, bool canUpdate, /*4J-Jev, these parameters only used with 'updateSource' -->*/ int wireSource, int wireSourceData) { @@ -116,7 +116,7 @@ void TripWireSourceTile::calculateState(Level *level, int x, int y, int z, int i int dir = data & MASK_DIR; bool wasAttached = (data & MASK_ATTACHED) == MASK_ATTACHED; bool wasPowered = (data & MASK_POWERED) == MASK_POWERED; - bool attached = id == Tile::tripWireSource_Id; // id is only != TripwireSource_id when 'onRemove' + bool attached = id == Tile::tripWireSource_Id; // id is only != TripwireSource_id when 'onRemove' bool powered = false; bool suspended = !level->isTopSolidBlocking(x, y - 1, z); int stepX = Direction::STEP_X[dir]; @@ -208,7 +208,7 @@ void TripWireSourceTile::calculateState(Level *level, int x, int y, int z, int i wireData &= ~TripWireTile::MASK_ATTACHED; } - + level->setData(xx, y, zz, wireData); } } @@ -273,7 +273,7 @@ bool TripWireSourceTile::checkCanSurvive(Level *level, int x, int y, int z) return true; } -void TripWireSourceTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) +void TripWireSourceTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) { int dir = level->getData(x, y, z) & MASK_DIR; float r = 3 / 16.0f; diff --git a/Minecraft.World/TripWireSourceTile.h b/Minecraft.World/TripWireSourceTile.h index a5a26ad1..c86e781d 100644 --- a/Minecraft.World/TripWireSourceTile.h +++ b/Minecraft.World/TripWireSourceTile.h @@ -35,7 +35,7 @@ private: bool checkCanSurvive(Level *level, int x, int y, int z); public: - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); void onRemove(Level *level, int x, int y, int z, int id, int data); virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); diff --git a/Minecraft.World/TripWireTile.cpp b/Minecraft.World/TripWireTile.cpp index 92560185..40ad93f8 100644 --- a/Minecraft.World/TripWireTile.cpp +++ b/Minecraft.World/TripWireTile.cpp @@ -13,7 +13,7 @@ TripWireTile::TripWireTile(int id) : Tile(id, Material::decoration, isSolidRende int TripWireTile::getTickDelay(Level *level) { - // 4J: Increased (x2); quick update caused problems with shared + // 4J: Increased (x2); quick update caused problems with shared // data between client and server. return 20; // 10; } @@ -70,7 +70,7 @@ void TripWireTile::neighborChanged(Level *level, int x, int y, int z, int type) } } -void TripWireTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) +void TripWireTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) { int data = level->getData(x, y, z); bool attached = (data & MASK_ATTACHED) == MASK_ATTACHED; @@ -102,7 +102,7 @@ void TripWireTile::onRemove(Level *level, int x, int y, int z, int id, int data) updateSource(level, x, y, z, data | MASK_POWERED); } -void TripWireTile::playerWillDestroy(Level *level, int x, int y, int z, int data, std::shared_ptr player) +void TripWireTile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player) { if (level->isClientSide) return; @@ -141,7 +141,7 @@ void TripWireTile::updateSource(Level *level, int x, int y, int z, int data) } } -void TripWireTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void TripWireTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { if (level->isClientSide) return; @@ -164,9 +164,9 @@ void TripWireTile::checkPressed(Level *level, int x, int y, int z) int data = level->getData(x, y, z); bool wasPressed = (data & MASK_POWERED) == MASK_POWERED; bool shouldBePressed = false; - + ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); - vector > *entities = level->getEntities(nullptr, AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1)); + vector > *entities = level->getEntities(nullptr, AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1)); if (!entities->empty()) { shouldBePressed = true; diff --git a/Minecraft.World/TripWireTile.h b/Minecraft.World/TripWireTile.h index 664541c5..7880e664 100644 --- a/Minecraft.World/TripWireTile.h +++ b/Minecraft.World/TripWireTile.h @@ -23,16 +23,16 @@ public: int getResource(int data, Random *random, int playerBonusLevel); int cloneTileId(Level *level, int x, int y, int z); void neighborChanged(Level *level, int x, int y, int z, int type); - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); void onPlace(Level *level, int x, int y, int z); void onRemove(Level *level, int x, int y, int z, int id, int data); - void playerWillDestroy(Level *level, int x, int y, int z, int data, std::shared_ptr player); + void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player); private: void updateSource(Level *level, int x, int y, int z, int data); public: - void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + void entityInside(Level *level, int x, int y, int z, shared_ptr entity); void tick(Level *level, int x, int y, int z, Random *random); private: diff --git a/Minecraft.World/UntouchingEnchantment.cpp b/Minecraft.World/UntouchingEnchantment.cpp index b0e2e295..1e5a41b7 100644 --- a/Minecraft.World/UntouchingEnchantment.cpp +++ b/Minecraft.World/UntouchingEnchantment.cpp @@ -27,7 +27,7 @@ bool UntouchingEnchantment::isCompatibleWith(Enchantment *other) const return Enchantment::isCompatibleWith(other) && other->id != resourceBonus->id; } -bool UntouchingEnchantment::canEnchant(std::shared_ptr item) +bool UntouchingEnchantment::canEnchant(shared_ptr item) { if (item->getItem()->id == Item::shears_Id) return true; return Enchantment::canEnchant(item); diff --git a/Minecraft.World/UntouchingEnchantment.h b/Minecraft.World/UntouchingEnchantment.h index 14ce0b49..db827c27 100644 --- a/Minecraft.World/UntouchingEnchantment.h +++ b/Minecraft.World/UntouchingEnchantment.h @@ -11,5 +11,5 @@ public: virtual int getMaxCost(int level); virtual int getMaxLevel(); virtual bool isCompatibleWith(Enchantment *other) const; - virtual bool canEnchant(std::shared_ptr item); + virtual bool canEnchant(shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/UpdateGameRuleProgressPacket.h b/Minecraft.World/UpdateGameRuleProgressPacket.h index 65df6dfe..b3384fa1 100644 --- a/Minecraft.World/UpdateGameRuleProgressPacket.h +++ b/Minecraft.World/UpdateGameRuleProgressPacket.h @@ -21,6 +21,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new UpdateGameRuleProgressPacket()); } + static shared_ptr create() { return shared_ptr(new UpdateGameRuleProgressPacket()); } virtual int getId() { return 158; } }; \ No newline at end of file diff --git a/Minecraft.World/UpdateMobEffectPacket.cpp b/Minecraft.World/UpdateMobEffectPacket.cpp index 7274152e..dec8d79f 100644 --- a/Minecraft.World/UpdateMobEffectPacket.cpp +++ b/Minecraft.World/UpdateMobEffectPacket.cpp @@ -53,8 +53,8 @@ bool UpdateMobEffectPacket::canBeInvalidated() return true; } -bool UpdateMobEffectPacket::isInvalidatedBy(std::shared_ptr packet) +bool UpdateMobEffectPacket::isInvalidatedBy(shared_ptr packet) { - std::shared_ptr target = dynamic_pointer_cast(packet); + shared_ptr target = dynamic_pointer_cast(packet); return target->entityId == entityId && target->effectId == effectId; } \ No newline at end of file diff --git a/Minecraft.World/UpdateMobEffectPacket.h b/Minecraft.World/UpdateMobEffectPacket.h index a69d32b2..d17d1be4 100644 --- a/Minecraft.World/UpdateMobEffectPacket.h +++ b/Minecraft.World/UpdateMobEffectPacket.h @@ -20,9 +20,9 @@ public: virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); - virtual bool isInvalidatedBy(std::shared_ptr packet); + virtual bool isInvalidatedBy(shared_ptr packet); public: - static std::shared_ptr create() { return std::shared_ptr(new UpdateMobEffectPacket()); } + static shared_ptr create() { return shared_ptr(new UpdateMobEffectPacket()); } virtual int getId() { return 41; } }; \ No newline at end of file diff --git a/Minecraft.World/UpdateProgressPacket.h b/Minecraft.World/UpdateProgressPacket.h index edfaef96..beca6509 100644 --- a/Minecraft.World/UpdateProgressPacket.h +++ b/Minecraft.World/UpdateProgressPacket.h @@ -20,6 +20,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new UpdateProgressPacket()); } + static shared_ptr create() { return shared_ptr(new UpdateProgressPacket()); } virtual int getId() { return 156; } }; \ No newline at end of file diff --git a/Minecraft.World/UseItemPacket.cpp b/Minecraft.World/UseItemPacket.cpp index 87180610..d9699130 100644 --- a/Minecraft.World/UseItemPacket.cpp +++ b/Minecraft.World/UseItemPacket.cpp @@ -7,11 +7,11 @@ const float UseItemPacket::CLICK_ACCURACY = 16.0f; -UseItemPacket::~UseItemPacket() +UseItemPacket::~UseItemPacket() { } -UseItemPacket::UseItemPacket() +UseItemPacket::UseItemPacket() { x = 0; y = 0; @@ -23,20 +23,20 @@ UseItemPacket::UseItemPacket() clickZ = 0.0f; } -UseItemPacket::UseItemPacket(int x, int y, int z, int face, std::shared_ptr item, float clickX, float clickY, float clickZ) +UseItemPacket::UseItemPacket(int x, int y, int z, int face, shared_ptr item, float clickX, float clickY, float clickZ) { this->x = x; this->y = y; this->z = z; this->face = face; // 4J - take copy of item as we want our packets to have full ownership of any referenced data - this->item = item ? item->copy() : std::shared_ptr(); + this->item = item ? item->copy() : shared_ptr(); this->clickX = clickX; this->clickY = clickY; this->clickZ = clickZ; } -void UseItemPacket::read(DataInputStream *dis) //throws IOException +void UseItemPacket::read(DataInputStream *dis) //throws IOException { x = dis->readInt(); y = dis->read(); @@ -48,7 +48,7 @@ void UseItemPacket::read(DataInputStream *dis) //throws IOException clickZ = dis->read() / CLICK_ACCURACY; } -void UseItemPacket::write(DataOutputStream *dos) //throws IOException +void UseItemPacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(x); dos->write(y); @@ -91,7 +91,7 @@ int UseItemPacket::getFace() return face; } -std::shared_ptr UseItemPacket::getItem() +shared_ptr UseItemPacket::getItem() { return item; } diff --git a/Minecraft.World/UseItemPacket.h b/Minecraft.World/UseItemPacket.h index 2619ce94..44e20457 100644 --- a/Minecraft.World/UseItemPacket.h +++ b/Minecraft.World/UseItemPacket.h @@ -8,12 +8,12 @@ class UseItemPacket : public Packet, public enable_shared_from_this item; + shared_ptr item; float clickX, clickY, clickZ; public: UseItemPacket(); - UseItemPacket(int x, int y, int z, int face, std::shared_ptr item, float clickX, float clickY, float clickZ); + UseItemPacket(int x, int y, int z, int face, shared_ptr item, float clickX, float clickY, float clickZ); ~UseItemPacket(); virtual void read(DataInputStream *dis); @@ -25,12 +25,12 @@ public: int getY(); int getZ(); int getFace(); - std::shared_ptr getItem(); + shared_ptr getItem(); float getClickX(); float getClickY(); float getClickZ(); public: - static std::shared_ptr create() { return std::shared_ptr(new UseItemPacket()); } + static shared_ptr create() { return shared_ptr(new UseItemPacket()); } virtual int getId() { return 15; } }; diff --git a/Minecraft.World/Village.cpp b/Minecraft.World/Village.cpp index 51e89c25..aef38066 100644 --- a/Minecraft.World/Village.cpp +++ b/Minecraft.World/Village.cpp @@ -8,7 +8,7 @@ #include "BasicTypeContainers.h" #include "Village.h" -Village::Aggressor::Aggressor(std::shared_ptr mob, int timeStamp) +Village::Aggressor::Aggressor(shared_ptr mob, int timeStamp) { this->mob = mob; this->timeStamp = timeStamp; @@ -71,7 +71,7 @@ void Village::tick(int tick) Vec3 *spawnPos = findRandomSpawnPos(center->x, center->y, center->z, 2, 4, 2); if (spawnPos != NULL) { - std::shared_ptr vg = std::shared_ptr( new VillagerGolem(level) ); + shared_ptr vg = shared_ptr( new VillagerGolem(level) ); vg->setPos(spawnPos->x, spawnPos->y, spawnPos->z); level->addEntity(vg); ++golemCount; @@ -123,14 +123,14 @@ bool Village::canSpawnAt(int x, int y, int z, int sx, int sy, int sz) void Village::countGolem() { // Fix - let bots report themselves? - vector > *golems = level->getEntitiesOfClass(typeid(VillagerGolem), AABB::newTemp(center->x - radius, center->y - 4, center->z - radius, center->x + radius, center->y + 4, center->z + radius)); + vector > *golems = level->getEntitiesOfClass(typeid(VillagerGolem), AABB::newTemp(center->x - radius, center->y - 4, center->z - radius, center->x + radius, center->y + 4, center->z + radius)); golemCount = golems->size(); delete golems; } void Village::countPopulation() { - vector > *villagers = level->getEntitiesOfClass(typeid(Villager), AABB::newTemp(center->x - radius, center->y - 4, center->z - radius, center->x + radius, center->y + 4, center->z + radius)); + vector > *villagers = level->getEntitiesOfClass(typeid(Villager), AABB::newTemp(center->x - radius, center->y - 4, center->z - radius, center->x + radius, center->y + 4, center->z + radius)); populationSize = villagers->size(); delete villagers; @@ -171,19 +171,19 @@ bool Village::isInside(int xx, int yy, int zz) return center->distSqr(xx, yy, zz) < radius * radius; } -vector > *Village::getDoorInfos() +vector > *Village::getDoorInfos() { return &doorInfos; } -std::shared_ptr Village::getClosestDoorInfo(int x, int y, int z) +shared_ptr Village::getClosestDoorInfo(int x, int y, int z) { - std::shared_ptr closest = nullptr; + shared_ptr closest = nullptr; int closestDistSqr = Integer::MAX_VALUE; //for (DoorInfo dm : doorInfos) for(AUTO_VAR(it, doorInfos.begin()); it != doorInfos.end(); ++it) { - std::shared_ptr dm = *it; + shared_ptr dm = *it; int distSqr = dm->distanceToSqr(x, y, z); if (distSqr < closestDistSqr) { @@ -194,14 +194,14 @@ std::shared_ptr Village::getClosestDoorInfo(int x, int y, int z) return closest; } -std::shared_ptrVillage::getBestDoorInfo(int x, int y, int z) +shared_ptrVillage::getBestDoorInfo(int x, int y, int z) { - std::shared_ptr closest = nullptr; + shared_ptr closest = nullptr; int closestDist = Integer::MAX_VALUE; //for (DoorInfo dm : doorInfos) for(AUTO_VAR(it, doorInfos.begin()); it != doorInfos.end(); ++it) { - std::shared_ptrdm = *it; + shared_ptrdm = *it; int distSqr = dm->distanceToSqr(x, y, z); if (distSqr > 16 * 16) distSqr *= 1000; @@ -221,19 +221,19 @@ bool Village::hasDoorInfo(int x, int y, int z) return getDoorInfo(x, y, z) != NULL; } -std::shared_ptrVillage::getDoorInfo(int x, int y, int z) +shared_ptrVillage::getDoorInfo(int x, int y, int z) { if (center->distSqr(x, y, z) > radius * radius) return nullptr; //for (DoorInfo di : doorInfos) for(AUTO_VAR(it, doorInfos.begin()); it != doorInfos.end(); ++it) { - std::shared_ptr di = *it; + shared_ptr di = *it; if (di->x == x && di->z == z && abs(di->y - y) <= 1) return di; } return nullptr; } -void Village::addDoorInfo(std::shared_ptr di) +void Village::addDoorInfo(shared_ptr di) { doorInfos.push_back(di); accCenter->x += di->x; @@ -248,7 +248,7 @@ bool Village::canRemove() return doorInfos.empty(); } -void Village::addAggressor(std::shared_ptr mob) +void Village::addAggressor(shared_ptr mob) { //for (Aggressor a : aggressors) for(AUTO_VAR(it, aggressors.begin()); it != aggressors.end(); ++it) @@ -263,7 +263,7 @@ void Village::addAggressor(std::shared_ptr mob) aggressors.push_back(new Aggressor(mob, _tick)); } -std::shared_ptr Village::getClosestAggressor(std::shared_ptr from) +shared_ptr Village::getClosestAggressor(shared_ptr from) { double closestSqr = Double::MAX_VALUE; Aggressor *closest = NULL; @@ -279,10 +279,10 @@ std::shared_ptr Village::getClosestAggressor(std::shared_ptr from) return closest != NULL ? closest->mob : nullptr; } -std::shared_ptr Village::getClosestBadStandingPlayer(std::shared_ptr from) // 4J Stu - Should be LivingEntity when we add that +shared_ptr Village::getClosestBadStandingPlayer(shared_ptr from) // 4J Stu - Should be LivingEntity when we add that { double closestSqr = Double::MAX_VALUE; - std::shared_ptr closest = nullptr; + shared_ptr closest = nullptr; //for (String player : playerStanding.keySet()) for(AUTO_VAR(it,playerStanding.begin()); it != playerStanding.end(); ++it) @@ -290,7 +290,7 @@ std::shared_ptr Village::getClosestBadStandingPlayer(std::shared_ptrfirst; if (isVeryBadStanding(player)) { - std::shared_ptr mob = level->getPlayerByName(player); + shared_ptr mob = level->getPlayerByName(player); if (mob != NULL) { double distSqr = mob->distanceToSqr(from); @@ -330,7 +330,7 @@ void Village::updateDoors() //for (Iterator it = doorInfos.iterator(); it.hasNext();) for(AUTO_VAR(it, doorInfos.begin()); it != doorInfos.end();) { - std::shared_ptr dm = *it; //it.next(); + shared_ptr dm = *it; //it.next(); if (resetBookings) dm->resetBookingCount(); if (!isDoor(dm->x, dm->y, dm->z) || abs(_tick - dm->timeStamp) > 1200) { @@ -373,7 +373,7 @@ void Village::calcInfo() //for (DoorInfo dm : doorInfos) for(AUTO_VAR(it, doorInfos.begin()); it != doorInfos.end(); ++it) { - std::shared_ptr dm = *it; + shared_ptr dm = *it; maxRadiusSqr = max(dm->distanceToSqr(center->x, center->y, center->z), maxRadiusSqr); } int doorDist= Villages::MaxDoorDist; // Take into local int for PS4 as max takes a reference to the const int there and then needs the value to exist for the linker @@ -433,7 +433,7 @@ void Village::readAdditionalSaveData(CompoundTag *tag) { CompoundTag *dTag = doorTags->get(i); - std::shared_ptr door = std::shared_ptr(new DoorInfo(dTag->getInt(L"X"), dTag->getInt(L"Y"), dTag->getInt(L"Z"), dTag->getInt(L"IDX"), dTag->getInt(L"IDZ"), dTag->getInt(L"TS"))); + shared_ptr door = shared_ptr(new DoorInfo(dTag->getInt(L"X"), dTag->getInt(L"Y"), dTag->getInt(L"Z"), dTag->getInt(L"IDX"), dTag->getInt(L"IDZ"), dTag->getInt(L"TS"))); doorInfos.push_back(door); } @@ -464,7 +464,7 @@ void Village::addAdditonalSaveData(CompoundTag *tag) //for (DoorInfo dm : doorInfos) for(AUTO_VAR(it,doorInfos.begin()); it != doorInfos.end(); ++it) { - std::shared_ptr dm = *it; + shared_ptr dm = *it; CompoundTag *doorTag = new CompoundTag(L"Door"); doorTag->putInt(L"X", dm->x); doorTag->putInt(L"Y", dm->y); diff --git a/Minecraft.World/Village.h b/Minecraft.World/Village.h index 27839d4e..07858ef9 100644 --- a/Minecraft.World/Village.h +++ b/Minecraft.World/Village.h @@ -4,7 +4,7 @@ class Village { private: Level *level; - vector > doorInfos; + vector > doorInfos; Pos *accCenter; Pos *center; @@ -19,10 +19,10 @@ private: class Aggressor { public: - std::shared_ptr mob; + shared_ptr mob; int timeStamp; - Aggressor(std::shared_ptr mob, int timeStamp); + Aggressor(shared_ptr mob, int timeStamp); }; vector aggressors; @@ -50,16 +50,16 @@ public: int getStableAge(); int getPopulationSize(); bool isInside(int xx, int yy, int zz); - vector > *getDoorInfos(); - std::shared_ptr getClosestDoorInfo(int x, int y, int z); - std::shared_ptr getBestDoorInfo(int x, int y, int z); + vector > *getDoorInfos(); + shared_ptr getClosestDoorInfo(int x, int y, int z); + shared_ptr getBestDoorInfo(int x, int y, int z); bool hasDoorInfo(int x, int y, int z); - std::shared_ptr getDoorInfo(int x, int y, int z); - void addDoorInfo(std::shared_ptr di); + shared_ptr getDoorInfo(int x, int y, int z); + void addDoorInfo(shared_ptr di); bool canRemove(); - void addAggressor(std::shared_ptr mob); - std::shared_ptr getClosestAggressor(std::shared_ptr from); - std::shared_ptr getClosestBadStandingPlayer(std::shared_ptr from); // 4J Stu - Should be LivingEntity when we add that + void addAggressor(shared_ptr mob); + shared_ptr getClosestAggressor(shared_ptr from); + shared_ptr getClosestBadStandingPlayer(shared_ptr from); // 4J Stu - Should be LivingEntity when we add that private: void updateAggressors(); diff --git a/Minecraft.World/VillagePieces.cpp b/Minecraft.World/VillagePieces.cpp index e535675d..27b21aa5 100644 --- a/Minecraft.World/VillagePieces.cpp +++ b/Minecraft.World/VillagePieces.cpp @@ -347,7 +347,7 @@ void VillagePieces::VillagePiece::spawnVillagers(Level *level, BoundingBox *chun { spawnedVillagerCount++; - std::shared_ptr villager = std::shared_ptr(new Villager(level, getVillagerProfession(i))); + shared_ptr villager = shared_ptr(new Villager(level, getVillagerProfession(i))); villager->moveTo(worldX + 0.5, worldY, worldZ + 0.5, 0, 0); level->addEntity(villager); } @@ -620,14 +620,14 @@ void VillagePieces::StraightRoad::addChildren(StructurePiece *startPiece, listx1 + 1, boundingBox->y0, boundingBox->z0, Direction::EAST, getGenDepth()); - break; - case Direction::SOUTH: + break; + case Direction::SOUTH: generateAndAddRoadPiece((StartPiece *) startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0, boundingBox->z1 - 2, Direction::EAST, getGenDepth()); - break; - case Direction::EAST: + break; + case Direction::EAST: generateAndAddRoadPiece((StartPiece *) startPiece, pieces, random, boundingBox->x1 - 2, boundingBox->y0, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth()); - break; - case Direction::WEST: + break; + case Direction::WEST: generateAndAddRoadPiece((StartPiece *) startPiece, pieces, random, boundingBox->x0, boundingBox->y0, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth()); break; } @@ -914,7 +914,7 @@ bool VillagePieces::SmallTemple::postProcess(Level *level, Random *random, Bound } - for (int z = 0; z < depth; z++) + for (int z = 0; z < depth; z++) { for (int x = 0; x < width; x++) { diff --git a/Minecraft.World/VillageSiege.cpp b/Minecraft.World/VillageSiege.cpp index afd378fc..55b2a3e8 100644 --- a/Minecraft.World/VillageSiege.cpp +++ b/Minecraft.World/VillageSiege.cpp @@ -77,12 +77,12 @@ void VillageSiege::tick() bool VillageSiege::tryToSetupSiege() { - vector > *players = &level->players; + vector > *players = &level->players; //for (Player player : players) for(AUTO_VAR(it, players->begin()); it != players->end(); ++it) { - std::shared_ptr player = *it; - std::shared_ptr _village = level->villages->getClosestVillage((int) player->x, (int) player->y, (int) player->z, 1); + shared_ptr player = *it; + shared_ptr _village = level->villages->getClosestVillage((int) player->x, (int) player->y, (int) player->z, 1); village = _village; if (_village == NULL) continue; @@ -101,11 +101,11 @@ bool VillageSiege::tryToSetupSiege() spawnY = center->y; spawnZ = center->z + (int) (Mth::sin(level->random->nextFloat() * PI * 2.f) * radius * 0.9); overlaps = false; - vector > *villages = level->villages->getVillages(); + vector > *villages = level->villages->getVillages(); //for (Village v : level.villages.getVillages()) for(AUTO_VAR(itV, villages->begin()); itV != villages->end(); ++itV) { - std::shared_ptrv = *itV; + shared_ptrv = *itV; if (v == _village) continue; if (v->isInside(spawnX, spawnY, spawnZ)) { @@ -131,10 +131,10 @@ bool VillageSiege::trySpawn() { Vec3 *spawnPos = findRandomSpawnPos(spawnX, spawnY, spawnZ); if (spawnPos == NULL) return false; - std::shared_ptr mob; + shared_ptr mob; //try { - mob = std::shared_ptr( new Zombie(level) ); + mob = shared_ptr( new Zombie(level) ); mob->finalizeMobSpawn(); mob->setVillager(false); } @@ -144,7 +144,7 @@ bool VillageSiege::trySpawn() //} mob->moveTo(spawnPos->x, spawnPos->y, spawnPos->z, level->random->nextFloat() * 360, 0); level->addEntity(mob); - std::shared_ptr _village = village.lock(); + shared_ptr _village = village.lock(); if( _village == NULL ) return false; Pos *center = _village->getCenter(); @@ -154,7 +154,7 @@ bool VillageSiege::trySpawn() Vec3 *VillageSiege::findRandomSpawnPos(int x, int y, int z) { - std::shared_ptr _village = village.lock(); + shared_ptr _village = village.lock(); if( _village == NULL ) return NULL; for (int i = 0; i < 10; ++i) diff --git a/Minecraft.World/Villager.cpp b/Minecraft.World/Villager.cpp index 4618e4be..328c0c70 100644 --- a/Minecraft.World/Villager.cpp +++ b/Minecraft.World/Villager.cpp @@ -94,7 +94,7 @@ void Villager::serverAiMobStep() level->villages->queryUpdateAround(Mth::floor(x), Mth::floor(y), Mth::floor(z)); villageUpdateInterval = 70 + random->nextInt(50); - std::shared_ptr _village = level->villages->getClosestVillage(Mth::floor(x), Mth::floor(y), Mth::floor(z), Villages::MaxDoorDist); + shared_ptr _village = level->villages->getClosestVillage(Mth::floor(x), Mth::floor(y), Mth::floor(z), Villages::MaxDoorDist); village = _village; if (_village == NULL) clearRestriction(); else @@ -145,10 +145,10 @@ void Villager::serverAiMobStep() AgableMob::serverAiMobStep(); } -bool Villager::interact(std::shared_ptr player) +bool Villager::interact(shared_ptr player) { // [EB]: Truly dislike this code but I don't see another easy way - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); bool holdingSpawnEgg = item != NULL && item->id == Item::monsterPlacer_Id; if (!holdingSpawnEgg && isAlive() && !isTrading() && !isBaby()) @@ -281,15 +281,15 @@ bool Villager::isChasing() return chasing; } -void Villager::setLastHurtByMob(std::shared_ptr mob) +void Villager::setLastHurtByMob(shared_ptr mob) { AgableMob::setLastHurtByMob(mob); - std::shared_ptr _village = village.lock(); + shared_ptr _village = village.lock(); if (_village != NULL && mob != NULL) { _village->addAggressor(mob); - std::shared_ptr player = dynamic_pointer_cast(mob); + shared_ptr player = dynamic_pointer_cast(mob); if (player) { int amount = -1; @@ -308,15 +308,15 @@ void Villager::setLastHurtByMob(std::shared_ptr mob) void Villager::die(DamageSource *source) { - std::shared_ptr _village = village.lock(); + shared_ptr _village = village.lock(); if (_village != NULL) { - std::shared_ptr sourceEntity = source->getEntity(); + shared_ptr sourceEntity = source->getEntity(); if (sourceEntity != NULL) { if ((sourceEntity->GetType() & eTYPE_PLAYER) == eTYPE_PLAYER) { - std::shared_ptr player = dynamic_pointer_cast(sourceEntity); + shared_ptr player = dynamic_pointer_cast(sourceEntity); _village->modifyStanding(player->getName(), -2); } else if ((sourceEntity->GetType() & eTYPE_ENEMY) == eTYPE_ENEMY) @@ -328,7 +328,7 @@ void Villager::die(DamageSource *source) { // if the villager was killed by the world (such as lava or falling), blame // the nearest player by not reproducing for a while - std::shared_ptr nearestPlayer = level->getNearestPlayer(shared_from_this(), 16.0f); + shared_ptr nearestPlayer = level->getNearestPlayer(shared_from_this(), 16.0f); if (nearestPlayer != NULL) { _village->resetNoBreedTimer(); @@ -339,12 +339,12 @@ void Villager::die(DamageSource *source) AgableMob::die(source); } -void Villager::setTradingPlayer(std::shared_ptr player) +void Villager::setTradingPlayer(shared_ptr player) { tradingPlayer = weak_ptr(player); } -std::shared_ptr Villager::getTradingPlayer() +shared_ptr Villager::getTradingPlayer() { return tradingPlayer.lock(); } @@ -381,7 +381,7 @@ void Villager::notifyTrade(MerchantRecipe *activeRecipe) } } -void Villager::notifyTradeUpdated(std::shared_ptr item) +void Villager::notifyTradeUpdated(shared_ptr item) { if (!level->isClientSide && (ambientSoundTime > (-getAmbientSoundInterval() + SharedConstants::TICKS_PER_SECOND))) { @@ -397,7 +397,7 @@ void Villager::notifyTradeUpdated(std::shared_ptr item) } } -MerchantRecipeList *Villager::getOffers(std::shared_ptr forPlayer) +MerchantRecipeList *Villager::getOffers(shared_ptr forPlayer) { if (offers == NULL) { @@ -436,7 +436,7 @@ void Villager::addOffers(int addCount) addItemForPurchase(newOffers, Item::arrow_Id, random, getRecipeChance(.5f)); if (random->nextFloat() < .5f) { - newOffers->push_back(new MerchantRecipe(std::shared_ptr( new ItemInstance(Tile::gravel, 10) ), std::shared_ptr( new ItemInstance(Item::emerald) ), std::shared_ptr( new ItemInstance(Item::flint_Id, 2 + random->nextInt(2), 0)))); + newOffers->push_back(new MerchantRecipe(shared_ptr( new ItemInstance(Tile::gravel, 10) ), shared_ptr( new ItemInstance(Item::emerald) ), shared_ptr( new ItemInstance(Item::flint_Id, 2 + random->nextInt(2), 0)))); } break; case PROFESSION_BUTCHER: @@ -493,10 +493,10 @@ void Villager::addOffers(int addCount) { Enchantment *enchantment = Enchantment::validEnchantments[random->nextInt(Enchantment::validEnchantments.size())]; int level = Mth::nextInt(random, enchantment->getMinLevel(), enchantment->getMaxLevel()); - std::shared_ptr book = Item::enchantedBook->createForEnchantment(new EnchantmentInstance(enchantment, level)); + shared_ptr book = Item::enchantedBook->createForEnchantment(new EnchantmentInstance(enchantment, level)); int cost = 2 + random->nextInt(5 + (level * 10)) + 3 * level; - newOffers->push_back(new MerchantRecipe(std::shared_ptr(new ItemInstance(Item::book)), std::shared_ptr(new ItemInstance(Item::emerald, cost)), book)); + newOffers->push_back(new MerchantRecipe(shared_ptr(new ItemInstance(Item::book)), shared_ptr(new ItemInstance(Item::emerald, cost)), book)); } break; case PROFESSION_PRIEST: @@ -514,9 +514,9 @@ void Villager::addOffers(int addCount) int id = enchantItems[i]; if (random->nextFloat() < getRecipeChance(.05f)) { - newOffers->push_back(new MerchantRecipe(std::shared_ptr(new ItemInstance(id, 1, 0)), - std::shared_ptr(new ItemInstance(Item::emerald, 2 + random->nextInt(3), 0)), - EnchantmentHelper::enchantItem(random, std::shared_ptr(new ItemInstance(id, 1, 0)), 5 + random->nextInt(15)))); + newOffers->push_back(new MerchantRecipe(shared_ptr(new ItemInstance(id, 1, 0)), + shared_ptr(new ItemInstance(Item::emerald, 2 + random->nextInt(3), 0)), + EnchantmentHelper::enchantItem(random, shared_ptr(new ItemInstance(id, 1, 0)), 5 + random->nextInt(15)))); } } } @@ -636,9 +636,9 @@ void Villager::addItemForTradeIn(MerchantRecipeList *list, int itemId, Random *r } } -std::shared_ptr Villager::getItemTradeInValue(int itemId, Random *random) +shared_ptr Villager::getItemTradeInValue(int itemId, Random *random) { - return std::shared_ptr(new ItemInstance(itemId, getTradeInValue(itemId, random), 0)); + return shared_ptr(new ItemInstance(itemId, getTradeInValue(itemId, random), 0)); } int Villager::getTradeInValue(int itemId, Random *random) @@ -670,17 +670,17 @@ void Villager::addItemForPurchase(MerchantRecipeList *list, int itemId, Random * if (random->nextFloat() < likelyHood) { int purchaseCost = getPurchaseCost(itemId, random); - std::shared_ptr rubyItem; - std::shared_ptr resultItem; + shared_ptr rubyItem; + shared_ptr resultItem; if (purchaseCost < 0) { - rubyItem = std::shared_ptr( new ItemInstance(Item::emerald_Id, 1, 0) ); - resultItem = std::shared_ptr( new ItemInstance(itemId, -purchaseCost, 0) ); + rubyItem = shared_ptr( new ItemInstance(Item::emerald_Id, 1, 0) ); + resultItem = shared_ptr( new ItemInstance(itemId, -purchaseCost, 0) ); } else { - rubyItem = std::shared_ptr( new ItemInstance(Item::emerald_Id, purchaseCost, 0) ); - resultItem = std::shared_ptr( new ItemInstance(itemId, 1, 0) ); + rubyItem = shared_ptr( new ItemInstance(Item::emerald_Id, purchaseCost, 0) ); + resultItem = shared_ptr( new ItemInstance(itemId, 1, 0) ); } list->push_back(new MerchantRecipe(rubyItem, resultItem)); } @@ -705,7 +705,7 @@ void Villager::handleEntityEvent(byte id) { if (id == EntityEvent::LOVE_HEARTS) { - addParticlesAroundSelf(eParticleType_heart); + addParticlesAroundSelf(eParticleType_heart); } else if (id == EntityEvent::VILLAGER_ANGRY) { @@ -742,12 +742,12 @@ void Villager::setRewardPlayersInVillage() rewardPlayersOnFirstVillage = true; } -std::shared_ptr Villager::getBreedOffspring(std::shared_ptr target) +shared_ptr Villager::getBreedOffspring(shared_ptr target) { // 4J - added limit to villagers that can be bred if(level->canCreateMore(GetType(), Level::eSpawnType_Breed) ) { - std::shared_ptr villager = std::shared_ptr(new Villager(level)); + shared_ptr villager = shared_ptr(new Villager(level)); villager->finalizeMobSpawn(); return villager; } diff --git a/Minecraft.World/Villager.h b/Minecraft.World/Villager.h index 98bfa692..b6ad7d1c 100644 --- a/Minecraft.World/Villager.h +++ b/Minecraft.World/Villager.h @@ -58,7 +58,7 @@ protected: virtual void serverAiMobStep(); public: - virtual bool interact(std::shared_ptr player); + virtual bool interact(shared_ptr player); protected: virtual void defineSynchedData(); @@ -83,7 +83,7 @@ public: void setInLove(bool inLove); void setChasing(bool chasing); bool isChasing(); - void setLastHurtByMob(std::shared_ptr mob); + void setLastHurtByMob(shared_ptr mob); void die(DamageSource *source); void handleEntityEvent(byte id); @@ -92,12 +92,12 @@ private: void addParticlesAroundSelf(ePARTICLE_TYPE particle); public: - void setTradingPlayer(std::shared_ptr player); - std::shared_ptr getTradingPlayer(); + void setTradingPlayer(shared_ptr player); + shared_ptr getTradingPlayer(); bool isTrading(); void notifyTrade(MerchantRecipe *activeRecipe); - void notifyTradeUpdated(std::shared_ptr item); - MerchantRecipeList *getOffers(std::shared_ptr forPlayer); + void notifyTradeUpdated(shared_ptr item); + MerchantRecipeList *getOffers(shared_ptr forPlayer); private: float baseRecipeChanceMod; @@ -125,7 +125,7 @@ private: * @param likelyHood */ static void addItemForTradeIn(MerchantRecipeList *list, int itemId, Random *random, float likelyHood); - static std::shared_ptr getItemTradeInValue(int itemId, Random *random); + static shared_ptr getItemTradeInValue(int itemId, Random *random); static int getTradeInValue(int itemId, Random *random); /** @@ -143,7 +143,7 @@ private: public: void finalizeMobSpawn(); void setRewardPlayersInVillage(); - std::shared_ptr getBreedOffspring(std::shared_ptr target); + shared_ptr getBreedOffspring(shared_ptr target); virtual int getDisplayName(); }; \ No newline at end of file diff --git a/Minecraft.World/VillagerGolem.cpp b/Minecraft.World/VillagerGolem.cpp index 3856aff6..a0f05472 100644 --- a/Minecraft.World/VillagerGolem.cpp +++ b/Minecraft.World/VillagerGolem.cpp @@ -69,7 +69,7 @@ void VillagerGolem::serverAiMobStep() if (--villageUpdateInterval <= 0) { villageUpdateInterval = 70 + random->nextInt(50); - std::shared_ptr _village = level->villages->getClosestVillage(Mth::floor(x), Mth::floor(y), Mth::floor(z), Villages::MaxDoorDist); + shared_ptr _village = level->villages->getClosestVillage(Mth::floor(x), Mth::floor(y), Mth::floor(z), Villages::MaxDoorDist); village = _village; if (_village == NULL) clearRestriction(); else @@ -133,7 +133,7 @@ void VillagerGolem::readAdditionalSaveData(CompoundTag *tag) setPlayerCreated(tag->getBoolean(L"PlayerCreated")); } -bool VillagerGolem::doHurtTarget(std::shared_ptr target) +bool VillagerGolem::doHurtTarget(shared_ptr target) { attackAnimationTick = 10; level->broadcastEntityEvent(shared_from_this(), EntityEvent::START_ATTACKING); @@ -157,7 +157,7 @@ void VillagerGolem::handleEntityEvent(byte id) else Golem::handleEntityEvent(id); } -std::shared_ptr VillagerGolem::getVillage() +shared_ptr VillagerGolem::getVillage() { return village.lock(); } diff --git a/Minecraft.World/VillagerGolem.h b/Minecraft.World/VillagerGolem.h index c5e4b4e8..dfcd3ac0 100644 --- a/Minecraft.World/VillagerGolem.h +++ b/Minecraft.World/VillagerGolem.h @@ -43,9 +43,9 @@ public: virtual bool canAttackType(eINSTANCEOF targetType); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); - virtual bool doHurtTarget(std::shared_ptr target); + virtual bool doHurtTarget(shared_ptr target); virtual void handleEntityEvent(byte id); - virtual std::shared_ptr getVillage(); + virtual shared_ptr getVillage(); virtual int getAttackAnimationTick(); virtual void offerFlower(bool offer); diff --git a/Minecraft.World/Villages.cpp b/Minecraft.World/Villages.cpp index 826e9bbe..995befe8 100644 --- a/Minecraft.World/Villages.cpp +++ b/Minecraft.World/Villages.cpp @@ -32,7 +32,7 @@ void Villages::setLevel(Level *level) //for (Village village : villages) for(AUTO_VAR(it, villages.begin()); it != villages.end(); ++it) { - std::shared_ptr village = *it; + shared_ptr village = *it; village->setLevel(level); } } @@ -49,7 +49,7 @@ void Villages::tick() //for (Village village : villages) for(AUTO_VAR(it, villages.begin()); it != villages.end(); ++it) { - std::shared_ptr village = *it; + shared_ptr village = *it; village->tick(_tick); } removeVillages(); @@ -67,7 +67,7 @@ void Villages::removeVillages() //for (Iterator it = villages.iterator(); it.hasNext();) for(AUTO_VAR(it, villages.begin()); it != villages.end(); ) { - std::shared_ptr village = *it; //it.next(); + shared_ptr village = *it; //it.next(); if (village->canRemove()) { it = villages.erase(it); @@ -81,19 +81,19 @@ void Villages::removeVillages() } } -vector > *Villages::getVillages() +vector > *Villages::getVillages() { return &villages; } -std::shared_ptr Villages::getClosestVillage(int x, int y, int z, int maxDist) +shared_ptr Villages::getClosestVillage(int x, int y, int z, int maxDist) { - std::shared_ptr closest = nullptr; + shared_ptr closest = nullptr; float closestDistSqr = Float::MAX_VALUE; //for (Village village : villages) for(AUTO_VAR(it, villages.begin()); it != villages.end(); ++it) { - std::shared_ptr village = *it; + shared_ptr village = *it; float distSqr = village->getCenter()->distSqr(x, y, z); if (distSqr >= closestDistSqr) continue; @@ -121,13 +121,13 @@ void Villages::cluster() //for (int i = 0; i < unclustered.size(); ++i) for(AUTO_VAR(it, unclustered.begin()); it != unclustered.end(); ++it) { - std::shared_ptr di = *it; //unclustered.get(i); + shared_ptr di = *it; //unclustered.get(i); bool found = false; //for (Village village : villages) for(AUTO_VAR(itV, villages.begin()); itV != villages.end(); ++itV) { - std::shared_ptr village = *itV; + shared_ptr village = *itV; int dist = (int) village->getCenter()->distSqr(di->x, di->y, di->z); int radius = MaxDoorDist + village->getRadius(); if (dist > radius * radius) continue; @@ -138,7 +138,7 @@ void Villages::cluster() if (found) continue; // create new Village - std::shared_ptr village = std::shared_ptr(new Village(level)); + shared_ptr village = shared_ptr(new Village(level)); village->addDoorInfo(di); villages.push_back(village); setDirty(); @@ -157,7 +157,7 @@ void Villages::addDoorInfos(Pos *pos) { if (isDoor(xx, yy, zz)) { - std::shared_ptr currentDoor = getDoorInfo(xx, yy, zz); + shared_ptr currentDoor = getDoorInfo(xx, yy, zz); if (currentDoor == NULL) createDoorInfo(xx, yy, zz); else currentDoor->timeStamp = _tick; } @@ -166,19 +166,19 @@ void Villages::addDoorInfos(Pos *pos) } } -std::shared_ptr Villages::getDoorInfo(int x, int y, int z) +shared_ptr Villages::getDoorInfo(int x, int y, int z) { //for (DoorInfo di : unclustered) for(AUTO_VAR(it,unclustered.begin()); it != unclustered.end(); ++it) { - std::shared_ptr di = *it; + shared_ptr di = *it; if (di->x == x && di->z == z && abs(di->y - y) <= 1) return di; } //for (Village v : villages) for(AUTO_VAR(it,villages.begin()); it != villages.end(); ++it) { - std::shared_ptr v = *it; - std::shared_ptr di = v->getDoorInfo(x, y, z); + shared_ptr v = *it; + shared_ptr di = v->getDoorInfo(x, y, z); if (di != NULL) return di; } return nullptr; @@ -194,7 +194,7 @@ void Villages::createDoorInfo(int x, int y, int z) if (level->canSeeSky(x + i, y, z)) canSeeX--; for (int i = 1; i <= 5; ++i) if (level->canSeeSky(x + i, y, z)) canSeeX++; - if (canSeeX != 0) unclustered.push_back(std::shared_ptr(new DoorInfo(x, y, z, canSeeX > 0 ? -2 : 2, 0, _tick))); + if (canSeeX != 0) unclustered.push_back(shared_ptr(new DoorInfo(x, y, z, canSeeX > 0 ? -2 : 2, 0, _tick))); } else { @@ -203,7 +203,7 @@ void Villages::createDoorInfo(int x, int y, int z) if (level->canSeeSky(x, y, z + i)) canSeeZ--; for (int i = 1; i <= 5; ++i) if (level->canSeeSky(x, y, z + i)) canSeeZ++; - if (canSeeZ != 0) unclustered.push_back(std::shared_ptr(new DoorInfo(x, y, z, 0, canSeeZ > 0 ? -2 : 2, _tick))); + if (canSeeZ != 0) unclustered.push_back(shared_ptr(new DoorInfo(x, y, z, 0, canSeeZ > 0 ? -2 : 2, _tick))); } } @@ -231,7 +231,7 @@ void Villages::load(CompoundTag *tag) for (int i = 0; i < villageTags->size(); i++) { CompoundTag *compoundTag = villageTags->get(i); - std::shared_ptr village = std::shared_ptr(new Village()); + shared_ptr village = shared_ptr(new Village()); village->readAdditionalSaveData(compoundTag); villages.push_back(village); } @@ -244,7 +244,7 @@ void Villages::save(CompoundTag *tag) //for (Village village : villages) for(AUTO_VAR(it, villages.begin()); it != villages.end(); ++it) { - std::shared_ptr village = *it; + shared_ptr village = *it; CompoundTag *villageTag = new CompoundTag(L"Village"); village->addAdditonalSaveData(villageTag); villageTags->add(villageTag); diff --git a/Minecraft.World/Villages.h b/Minecraft.World/Villages.h index e6715372..030edc33 100644 --- a/Minecraft.World/Villages.h +++ b/Minecraft.World/Villages.h @@ -12,8 +12,8 @@ public: private: Level *level; deque queries; - vector > unclustered; - vector > villages; + vector > unclustered; + vector > villages; int _tick; public: @@ -29,14 +29,14 @@ private: void removeVillages(); public: - vector > *getVillages(); - std::shared_ptr getClosestVillage(int x, int y, int z, int maxDist); + vector > *getVillages(); + shared_ptr getClosestVillage(int x, int y, int z, int maxDist); private: void processNextQuery(); void cluster(); void addDoorInfos(Pos *pos); - std::shared_ptrgetDoorInfo(int x, int y, int z); + shared_ptrgetDoorInfo(int x, int y, int z); void createDoorInfo(int x, int y, int z); bool hasQuery(int x, int y, int z); bool isDoor(int x, int y, int z); diff --git a/Minecraft.World/VineTile.cpp b/Minecraft.World/VineTile.cpp index a5e4ad7e..1170caf2 100644 --- a/Minecraft.World/VineTile.cpp +++ b/Minecraft.World/VineTile.cpp @@ -33,7 +33,7 @@ bool VineTile::isCubeShaped() return false; } -void VineTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) // 4J added forceData, forceEntity param +void VineTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { const float thickness = 1.0f / 16.0f; @@ -368,7 +368,7 @@ int VineTile::getResourceCount(Random *random) return 0; } -void VineTile::playerDestroy(Level *level, std::shared_ptrplayer, int x, int y, int z, int data) +void VineTile::playerDestroy(Level *level, shared_ptrplayer, int x, int y, int z, int data) { if (!level->isClientSide && player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears->id) { @@ -378,7 +378,7 @@ void VineTile::playerDestroy(Level *level, std::shared_ptrplayer, int x, ); // drop leaf block instead of sapling - popResource(level, x, y, z, std::shared_ptr(new ItemInstance(Tile::vine, 1, 0))); + popResource(level, x, y, z, shared_ptr(new ItemInstance(Tile::vine, 1, 0))); } else { diff --git a/Minecraft.World/VineTile.h b/Minecraft.World/VineTile.h index c4e891d0..bdea2cdc 100644 --- a/Minecraft.World/VineTile.h +++ b/Minecraft.World/VineTile.h @@ -18,7 +18,7 @@ public: virtual int getRenderShape(); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual AABB *getAABB(Level *level, int x, int y, int z); virtual bool mayPlace(Level *level, int x, int y, int z, int face); private: @@ -34,5 +34,5 @@ public: virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); virtual int getResource(int data, Random *random, int playerBonusLevel); virtual int getResourceCount(Random *random); - virtual void playerDestroy(Level *level, std::shared_ptr player, int x, int y, int z, int data); + virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); }; \ No newline at end of file diff --git a/Minecraft.World/VoronoiZoom.cpp b/Minecraft.World/VoronoiZoom.cpp index 58f27d53..f62cc9b6 100644 --- a/Minecraft.World/VoronoiZoom.cpp +++ b/Minecraft.World/VoronoiZoom.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.newbiome.layer.h" #include "System.h" -VoronoiZoom::VoronoiZoom(int64_t seedMixup, std::shared_ptrparent) : Layer(seedMixup) +VoronoiZoom::VoronoiZoom(int64_t seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } diff --git a/Minecraft.World/VoronoiZoom.h b/Minecraft.World/VoronoiZoom.h index 131388d1..43a8de66 100644 --- a/Minecraft.World/VoronoiZoom.h +++ b/Minecraft.World/VoronoiZoom.h @@ -5,7 +5,7 @@ class VoronoiZoom : public Layer { public: - VoronoiZoom(int64_t seedMixup, std::shared_ptrparent); + VoronoiZoom(int64_t seedMixup, shared_ptrparent); virtual intArray getArea(int xo, int yo, int w, int h); diff --git a/Minecraft.World/WallTile.cpp b/Minecraft.World/WallTile.cpp index 4e92b923..6275eef7 100644 --- a/Minecraft.World/WallTile.cpp +++ b/Minecraft.World/WallTile.cpp @@ -51,7 +51,7 @@ bool WallTile::isSolidRender(bool isServerLevel) return false; } -void WallTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) +void WallTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) { bool n = connectsTo(level, x, y, z - 1); bool s = connectsTo(level, x, y, z + 1); @@ -131,7 +131,7 @@ AABB *WallTile::getAABB(Level *level, int x, int y, int z) /* 4J-JEV: Stopping the width changing here, it's causing cows/mobs/passers-by to 'jump' up when they are pressed against the - wall and then the wall section is upgraded to a wall post expanding the bounding box. + wall and then the wall section is upgraded to a wall post expanding the bounding box. It's only a 1/16 of a block difference, it shouldn't matter if we leave it a little larger. */ if (n && s && !w && !e) diff --git a/Minecraft.World/WallTile.h b/Minecraft.World/WallTile.h index e693f9a4..a9a383d1 100644 --- a/Minecraft.World/WallTile.h +++ b/Minecraft.World/WallTile.h @@ -22,7 +22,7 @@ public: bool isCubeShaped(); bool isPathfindable(LevelSource *level, int x, int y, int z); bool isSolidRender(bool isServerLevel = false); - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); AABB *getAABB(Level *level, int x, int y, int z); bool connectsTo(LevelSource *level, int x, int y, int z); int getSpawnResourcesAuxValue(int data); diff --git a/Minecraft.World/WaterAnimal.cpp b/Minecraft.World/WaterAnimal.cpp index 654f930b..0a7313d1 100644 --- a/Minecraft.World/WaterAnimal.cpp +++ b/Minecraft.World/WaterAnimal.cpp @@ -36,7 +36,7 @@ bool WaterAnimal::removeWhenFarAway() return true; } -int WaterAnimal::getExperienceReward(std::shared_ptr killedBy) +int WaterAnimal::getExperienceReward(shared_ptr killedBy) { return 1 + level->random->nextInt(3); } \ No newline at end of file diff --git a/Minecraft.World/WaterAnimal.h b/Minecraft.World/WaterAnimal.h index db7272bb..23b984f5 100644 --- a/Minecraft.World/WaterAnimal.h +++ b/Minecraft.World/WaterAnimal.h @@ -14,5 +14,5 @@ public: protected: virtual bool removeWhenFarAway(); - virtual int getExperienceReward(std::shared_ptr killedBy); + virtual int getExperienceReward(shared_ptr killedBy); }; diff --git a/Minecraft.World/WaterLevelChunk.cpp b/Minecraft.World/WaterLevelChunk.cpp index ba1414c9..19f3e8a1 100644 --- a/Minecraft.World/WaterLevelChunk.cpp +++ b/Minecraft.World/WaterLevelChunk.cpp @@ -53,15 +53,15 @@ void WaterLevelChunk::setBrightness(LightLayer::variety layer, int x, int y, int { } -void WaterLevelChunk::addEntity(std::shared_ptr e) +void WaterLevelChunk::addEntity(shared_ptr e) { } -void WaterLevelChunk::removeEntity(std::shared_ptr e) +void WaterLevelChunk::removeEntity(shared_ptr e) { } -void WaterLevelChunk::removeEntity(std::shared_ptr e, int yc) +void WaterLevelChunk::removeEntity(shared_ptr e, int yc) { } @@ -69,16 +69,16 @@ void WaterLevelChunk::skyBrightnessChanged() { } -std::shared_ptr WaterLevelChunk::getTileEntity(int x, int y, int z) +shared_ptr WaterLevelChunk::getTileEntity(int x, int y, int z) { - return std::shared_ptr(); + return shared_ptr(); } -void WaterLevelChunk::addTileEntity(std::shared_ptr te) +void WaterLevelChunk::addTileEntity(shared_ptr te) { } -void WaterLevelChunk::setTileEntity(int x, int y, int z, std::shared_ptr tileEntity) +void WaterLevelChunk::setTileEntity(int x, int y, int z, shared_ptr tileEntity) { } @@ -98,11 +98,11 @@ void WaterLevelChunk::markUnsaved() { } -void WaterLevelChunk::getEntities(std::shared_ptr except, AABB bb, vector > &es) +void WaterLevelChunk::getEntities(shared_ptr except, AABB bb, vector > &es) { } -void WaterLevelChunk::getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es) +void WaterLevelChunk::getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es) { } diff --git a/Minecraft.World/WaterLevelChunk.h b/Minecraft.World/WaterLevelChunk.h index 5014d8b3..43e7e0c6 100644 --- a/Minecraft.World/WaterLevelChunk.h +++ b/Minecraft.World/WaterLevelChunk.h @@ -21,19 +21,19 @@ public: bool setData(int x, int y, int z, int val, int mask, bool *maskedBitsChanged); // 4J added mask void setBrightness(LightLayer::variety layer, int x, int y, int z, int brightness); void setLevelChunkBrightness(LightLayer::variety layer, int x, int y, int z, int brightness); // 4J added - calls the setBrightness method of the parent class - void addEntity(std::shared_ptr e); - void removeEntity(std::shared_ptr e); - void removeEntity(std::shared_ptr e, int yc); + void addEntity(shared_ptr e); + void removeEntity(shared_ptr e); + void removeEntity(shared_ptr e, int yc); void skyBrightnessChanged(); - std::shared_ptr getTileEntity(int x, int y, int z); - void addTileEntity(std::shared_ptr te); - void setTileEntity(int x, int y, int z, std::shared_ptr tileEntity); + shared_ptr getTileEntity(int x, int y, int z); + void addTileEntity(shared_ptr te); + void setTileEntity(int x, int y, int z, shared_ptr tileEntity); void removeTileEntity(int x, int y, int z); void load(); void unload(bool unloadTileEntities) ; // 4J - added parameter void markUnsaved(); - void getEntities(std::shared_ptr except, AABB bb, vector > &es); - void getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es); + void getEntities(shared_ptr except, AABB bb, vector > &es); + void getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es); int countEntities(); bool shouldSave(bool force); void setBlocks(byteArray newBlocks, int sub); diff --git a/Minecraft.World/WaterLilyTile.cpp b/Minecraft.World/WaterLilyTile.cpp index 936005dd..91203922 100644 --- a/Minecraft.World/WaterLilyTile.cpp +++ b/Minecraft.World/WaterLilyTile.cpp @@ -23,7 +23,7 @@ int WaterlilyTile::getRenderShape() return Tile::SHAPE_LILYPAD; } -void WaterlilyTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source) +void WaterlilyTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { if (source == NULL || !(dynamic_pointer_cast(source))) { diff --git a/Minecraft.World/WaterLilyTile.h b/Minecraft.World/WaterLilyTile.h index 213af5c5..af07269c 100644 --- a/Minecraft.World/WaterLilyTile.h +++ b/Minecraft.World/WaterLilyTile.h @@ -11,7 +11,7 @@ public: virtual void updateDefaultShape(); // 4J Added override virtual int getRenderShape(); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, std::shared_ptr source); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual AABB *getAABB(Level *level, int x, int y, int z); virtual int getColor() const; virtual int getColor(int auxData); diff --git a/Minecraft.World/WaterLilyTileItem.cpp b/Minecraft.World/WaterLilyTileItem.cpp index de125008..13814e5c 100644 --- a/Minecraft.World/WaterLilyTileItem.cpp +++ b/Minecraft.World/WaterLilyTileItem.cpp @@ -10,7 +10,7 @@ WaterLilyTileItem::WaterLilyTileItem(int id) : ColoredTileItem(id, false) { } -bool WaterLilyTileItem::TestUse(Level *level, std::shared_ptr player) +bool WaterLilyTileItem::TestUse(Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, true); if (hr == NULL) return false; @@ -39,7 +39,7 @@ bool WaterLilyTileItem::TestUse(Level *level, std::shared_ptr player) return false; } -std::shared_ptr WaterLilyTileItem::use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player) +shared_ptr WaterLilyTileItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, true); if (hr == NULL) return itemInstance; diff --git a/Minecraft.World/WaterLilyTileItem.h b/Minecraft.World/WaterLilyTileItem.h index 3fc23314..c0c5db99 100644 --- a/Minecraft.World/WaterLilyTileItem.h +++ b/Minecraft.World/WaterLilyTileItem.h @@ -8,7 +8,7 @@ public: using ColoredTileItem::getColor; WaterLilyTileItem(int id); - virtual std::shared_ptr use(std::shared_ptr itemInstance, Level *level, std::shared_ptr player); - virtual bool TestUse(Level *level, std::shared_ptr player); + virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); + virtual bool TestUse(Level *level, shared_ptr player); virtual int getColor(int data, int spriteLayer); }; diff --git a/Minecraft.World/WeaponItem.cpp b/Minecraft.World/WeaponItem.cpp index 0dd58d83..82b16bde 100644 --- a/Minecraft.World/WeaponItem.cpp +++ b/Minecraft.World/WeaponItem.cpp @@ -13,7 +13,7 @@ WeaponItem::WeaponItem(int id, const Tier *tier) : Item(id), tier( tier ) damage = 4 + tier->getAttackDamageBonus(); } -float WeaponItem::getDestroySpeed(std::shared_ptr itemInstance, Tile *tile) +float WeaponItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { if (tile->id == Tile::web_Id) { @@ -23,20 +23,20 @@ float WeaponItem::getDestroySpeed(std::shared_ptr itemInstance, Ti return 1.5f; } -bool WeaponItem::hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker) +bool WeaponItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { itemInstance->hurt(1, attacker); return true; } -bool WeaponItem::mineBlock(std::shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, std::shared_ptr owner) +bool WeaponItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { // Don't damage weapons if the tile can be destroyed in one hit. if (Tile::tiles[tile]->getDestroySpeed(level, x, y, z) != 0.0) itemInstance->hurt(2, owner); return true; } -int WeaponItem::getAttackDamage(std::shared_ptr entity) +int WeaponItem::getAttackDamage(shared_ptr entity) { return damage; } @@ -46,17 +46,17 @@ bool WeaponItem::isHandEquipped() return true; } -UseAnim WeaponItem::getUseAnimation(std::shared_ptr itemInstance) +UseAnim WeaponItem::getUseAnimation(shared_ptr itemInstance) { return UseAnim_block; -} +} -int WeaponItem::getUseDuration(std::shared_ptr itemInstance) +int WeaponItem::getUseDuration(shared_ptr itemInstance) { return 20 * 60 * 60; // Block for a maximum of one hour! } -std::shared_ptr WeaponItem::use(std::shared_ptr instance, Level *level, std::shared_ptr player) +shared_ptr WeaponItem::use(shared_ptr instance, Level *level, shared_ptr player) { player->startUsingItem(instance, getUseDuration(instance)); return instance; @@ -77,7 +77,7 @@ const Item::Tier *WeaponItem::getTier() return tier; } -bool WeaponItem::isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem) +bool WeaponItem::isValidRepairItem(shared_ptr source, shared_ptr repairItem) { if (tier->getTierItemId() == repairItem->id) { diff --git a/Minecraft.World/WeaponItem.h b/Minecraft.World/WeaponItem.h index 162866d6..2150f6e9 100644 --- a/Minecraft.World/WeaponItem.h +++ b/Minecraft.World/WeaponItem.h @@ -12,17 +12,17 @@ private: public: WeaponItem(int id, const Tier *tier); - virtual float getDestroySpeed(std::shared_ptr itemInstance, Tile *tile); - virtual bool hurtEnemy(std::shared_ptr itemInstance, std::shared_ptr mob, std::shared_ptr attacker); - virtual bool mineBlock(std::shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, std::shared_ptr owner); - virtual int getAttackDamage(std::shared_ptr entity); + virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); + virtual int getAttackDamage(shared_ptr entity); virtual bool isHandEquipped(); - virtual UseAnim getUseAnimation(std::shared_ptr itemInstance); - virtual int getUseDuration(std::shared_ptr itemInstance); - virtual std::shared_ptr use(std::shared_ptr instance, Level *level, std::shared_ptr player); + virtual UseAnim getUseAnimation(shared_ptr itemInstance); + virtual int getUseDuration(shared_ptr itemInstance); + virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); virtual bool canDestroySpecial(Tile *tile); virtual int getEnchantmentValue(); const Tier *getTier(); - bool isValidRepairItem(std::shared_ptr source, std::shared_ptr repairItem); + bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); }; \ No newline at end of file diff --git a/Minecraft.World/WebTile.cpp b/Minecraft.World/WebTile.cpp index 0642bb57..a724c36d 100644 --- a/Minecraft.World/WebTile.cpp +++ b/Minecraft.World/WebTile.cpp @@ -8,7 +8,7 @@ WebTile::WebTile(int id) : Tile(id, Material::web) } -void WebTile::entityInside(Level *level, int x, int y, int z, std::shared_ptr entity) +void WebTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { entity->makeStuckInWeb(); } diff --git a/Minecraft.World/WebTile.h b/Minecraft.World/WebTile.h index 54661717..ca1f4dae 100644 --- a/Minecraft.World/WebTile.h +++ b/Minecraft.World/WebTile.h @@ -10,7 +10,7 @@ public: public: - void entityInside(Level *level, int x, int y, int z, std::shared_ptr entity); + void entityInside(Level *level, int x, int y, int z, shared_ptr entity); public: diff --git a/Minecraft.World/WeighedTreasure.cpp b/Minecraft.World/WeighedTreasure.cpp index 540727e3..d7044644 100644 --- a/Minecraft.World/WeighedTreasure.cpp +++ b/Minecraft.World/WeighedTreasure.cpp @@ -6,19 +6,19 @@ WeighedTreasure::WeighedTreasure(int itemId, int auxValue, int minCount, int maxCount, int weight) : WeighedRandomItem(weight) { - this->item = std::shared_ptr( new ItemInstance(itemId, 1, auxValue) ); + this->item = shared_ptr( new ItemInstance(itemId, 1, auxValue) ); this->minCount = minCount; this->maxCount = maxCount; } -WeighedTreasure::WeighedTreasure(std::shared_ptr item, int minCount, int maxCount, int weight) : WeighedRandomItem(weight) +WeighedTreasure::WeighedTreasure(shared_ptr item, int minCount, int maxCount, int weight) : WeighedRandomItem(weight) { this->item = item; this->minCount = minCount; this->maxCount = maxCount; } -void WeighedTreasure::addChestItems(Random *random, WeighedTreasureArray items, std::shared_ptr dest, int numRolls) +void WeighedTreasure::addChestItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls) { for (int r = 0; r < numRolls; r++) { @@ -27,7 +27,7 @@ void WeighedTreasure::addChestItems(Random *random, WeighedTreasureArray items, int count = treasure->minCount + random->nextInt(treasure->maxCount - treasure->minCount + 1); if (treasure->item->getMaxStackSize() >= count) { - std::shared_ptr copy = treasure->item->copy(); + shared_ptr copy = treasure->item->copy(); copy->count = count; dest->setItem(random->nextInt(dest->getContainerSize()), copy); } @@ -36,7 +36,7 @@ void WeighedTreasure::addChestItems(Random *random, WeighedTreasureArray items, // use multiple slots for (int c = 0; c < count; c++) { - std::shared_ptr copy = treasure->item->copy(); + shared_ptr copy = treasure->item->copy(); copy->count = 1; dest->setItem(random->nextInt(dest->getContainerSize()), copy); } @@ -44,7 +44,7 @@ void WeighedTreasure::addChestItems(Random *random, WeighedTreasureArray items, } } -void WeighedTreasure::addDispenserItems(Random *random, WeighedTreasureArray items, std::shared_ptr dest, int numRolls) +void WeighedTreasure::addDispenserItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls) { for (int r = 0; r < numRolls; r++) { @@ -53,7 +53,7 @@ void WeighedTreasure::addDispenserItems(Random *random, WeighedTreasureArray ite int count = treasure->minCount + random->nextInt(treasure->maxCount - treasure->minCount + 1); if (treasure->item->getMaxStackSize() >= count) { - std::shared_ptr copy = treasure->item->copy(); + shared_ptr copy = treasure->item->copy(); copy->count = count; dest->setItem(random->nextInt(dest->getContainerSize()), copy); } @@ -62,7 +62,7 @@ void WeighedTreasure::addDispenserItems(Random *random, WeighedTreasureArray ite // use multiple slots for (int c = 0; c < count; c++) { - std::shared_ptr copy = treasure->item->copy(); + shared_ptr copy = treasure->item->copy(); copy->count = 1; dest->setItem(random->nextInt(dest->getContainerSize()), copy); } diff --git a/Minecraft.World/WeighedTreasure.h b/Minecraft.World/WeighedTreasure.h index 7b0ecd4c..a37bc6ae 100644 --- a/Minecraft.World/WeighedTreasure.h +++ b/Minecraft.World/WeighedTreasure.h @@ -5,15 +5,15 @@ class WeighedTreasure : public WeighedRandomItem { private: - std::shared_ptr item; + shared_ptr item; int minCount; int maxCount; public: WeighedTreasure(int itemId, int auxValue, int minCount, int maxCount, int weight); - WeighedTreasure(std::shared_ptr item, int minCount, int maxCount, int weight); + WeighedTreasure(shared_ptr item, int minCount, int maxCount, int weight); - static void addChestItems(Random *random, WeighedTreasureArray items, std::shared_ptr dest, int numRolls); - static void addDispenserItems(Random *random, WeighedTreasureArray items, std::shared_ptr dest, int numRolls); + static void addChestItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls); + static void addDispenserItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls); static WeighedTreasureArray addToTreasure(WeighedTreasureArray items, WeighedTreasure *extra); }; \ No newline at end of file diff --git a/Minecraft.World/Wolf.cpp b/Minecraft.World/Wolf.cpp index 2e98e7cc..8ffc45c6 100644 --- a/Minecraft.World/Wolf.cpp +++ b/Minecraft.World/Wolf.cpp @@ -60,7 +60,7 @@ bool Wolf::useNewAi() return true; } -void Wolf::setTarget(std::shared_ptr target) +void Wolf::setTarget(shared_ptr target) { TamableAnimal::setTarget(target); if ( dynamic_pointer_cast(target) == NULL ) @@ -87,7 +87,7 @@ int Wolf::getMaxHealth() return START_HEALTH; } -void Wolf::defineSynchedData() +void Wolf::defineSynchedData() { TamableAnimal::defineSynchedData(); entityData->define(DATA_HEALTH_ID, getHealth()); @@ -95,25 +95,25 @@ void Wolf::defineSynchedData() entityData->define(DATA_COLLAR_COLOR, (byte) ClothTile::getTileDataForItemAuxValue(DyePowderItem::RED)); } -bool Wolf::makeStepSound() +bool Wolf::makeStepSound() { return false; } -int Wolf::getTexture() +int Wolf::getTexture() { - if (isTame()) + if (isTame()) { return TN_MOB_WOLF_TAME; // 4J was L"/mob/wolf_tame.png"; } - if (isAngry()) + if (isAngry()) { return TN_MOB_WOLF_ANGRY; // 4J was L"/mob/wolf_angry.png"; } return TamableAnimal::getTexture(); } -void Wolf::addAdditonalSaveData(CompoundTag *tag) +void Wolf::addAdditonalSaveData(CompoundTag *tag) { TamableAnimal::addAdditonalSaveData(tag); @@ -121,7 +121,7 @@ void Wolf::addAdditonalSaveData(CompoundTag *tag) tag->putByte(L"CollarColor", (byte) getCollarColor()); } -void Wolf::readAdditionalSaveData(CompoundTag *tag) +void Wolf::readAdditionalSaveData(CompoundTag *tag) { TamableAnimal::readAdditionalSaveData(tag); @@ -129,20 +129,20 @@ void Wolf::readAdditionalSaveData(CompoundTag *tag) if (tag->contains(L"CollarColor")) setCollarColor(tag->getByte(L"CollarColor")); } -bool Wolf::removeWhenFarAway() +bool Wolf::removeWhenFarAway() { return !isTame(); } -int Wolf::getAmbientSound() +int Wolf::getAmbientSound() { - if (isAngry()) + if (isAngry()) { return eSoundType_MOB_WOLF_GROWL; } - if (random->nextInt(3) == 0) + if (random->nextInt(3) == 0) { - if (isTame() && entityData->getInteger(DATA_HEALTH_ID) < 10) + if (isTame() && entityData->getInteger(DATA_HEALTH_ID) < 10) { return eSoundType_MOB_WOLF_WHINE; } @@ -151,31 +151,31 @@ int Wolf::getAmbientSound() return eSoundType_MOB_WOLF_BARK; } -int Wolf::getHurtSound() +int Wolf::getHurtSound() { return eSoundType_MOB_WOLF_HURT; } -int Wolf::getDeathSound() +int Wolf::getDeathSound() { return eSoundType_MOB_WOLF_DEATH; } -float Wolf::getSoundVolume() +float Wolf::getSoundVolume() { return 0.4f; } -int Wolf::getDeathLoot() +int Wolf::getDeathLoot() { return -1; } -void Wolf::aiStep() +void Wolf::aiStep() { TamableAnimal::aiStep(); - if (!level->isClientSide && m_isWet && !isShaking && !isPathFinding() && onGround) + if (!level->isClientSide && m_isWet && !isShaking && !isPathFinding() && onGround) { isShaking = true; shakeAnim = 0; @@ -185,37 +185,37 @@ void Wolf::aiStep() } } -void Wolf::tick() +void Wolf::tick() { TamableAnimal::tick(); interestedAngleO = interestedAngle; - if (isInterested()) + if (isInterested()) { interestedAngle = interestedAngle + (1 - interestedAngle) * 0.4f; - } - else + } + else { interestedAngle = interestedAngle + (0 - interestedAngle) * 0.4f; } - if (isInterested()) + if (isInterested()) { lookTime = 10; } - if (isInWaterOrRain()) + if (isInWaterOrRain()) { m_isWet = true; isShaking = false; shakeAnim = 0; shakeAnimO = 0; - } - else if (m_isWet || isShaking) + } + else if (m_isWet || isShaking) { - if (isShaking) + if (isShaking) { - if (shakeAnim == 0) + if (shakeAnim == 0) { level->playSound(shared_from_this(), eSoundType_MOB_WOLF_SHAKE, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); } @@ -223,7 +223,7 @@ void Wolf::tick() shakeAnimO = shakeAnim; shakeAnim += 0.05f; - if (shakeAnimO >= 2) + if (shakeAnimO >= 2) { m_isWet = false; isShaking = false; @@ -231,11 +231,11 @@ void Wolf::tick() shakeAnim = 0; } - if (shakeAnim > 0.4f) + if (shakeAnim > 0.4f) { float yt = (float) bb->y0; int shakeCount = (int) (Mth::sin((shakeAnim - 0.4f) * PI) * 7.0f); - for (int i = 0; i < shakeCount; i++) + for (int i = 0; i < shakeCount; i++) { float xo = (random->nextFloat() * 2 - 1) * bbWidth * 0.5f; float zo = (random->nextFloat() * 2 - 1) * bbWidth * 0.5f; @@ -246,55 +246,55 @@ void Wolf::tick() } } -bool Wolf::isWet() +bool Wolf::isWet() { return m_isWet; } -float Wolf::getWetShade(float a) +float Wolf::getWetShade(float a) { return 0.75f + ((shakeAnimO + (shakeAnim - shakeAnimO) * a) / 2.0f) * 0.25f; } -float Wolf::getBodyRollAngle(float a, float offset) +float Wolf::getBodyRollAngle(float a, float offset) { float progress = ((shakeAnimO + (shakeAnim - shakeAnimO) * a) + offset) / 1.8f; - if (progress < 0) + if (progress < 0) { progress = 0; - } - else if (progress > 1) + } + else if (progress > 1) { progress = 1; } return Mth::sin(progress * PI) * Mth::sin(progress * PI * 11.0f) * 0.15f * PI; } -float Wolf::getHeadRollAngle(float a) +float Wolf::getHeadRollAngle(float a) { return (interestedAngleO + (interestedAngle - interestedAngleO) * a) * 0.15f * PI; } -float Wolf::getHeadHeight() +float Wolf::getHeadHeight() { return bbHeight * 0.8f; } -int Wolf::getMaxHeadXRot() +int Wolf::getMaxHeadXRot() { - if (isSitting()) + if (isSitting()) { return 20; } return TamableAnimal::getMaxHeadXRot(); } -bool Wolf::hurt(DamageSource *source, int dmg) +bool Wolf::hurt(DamageSource *source, int dmg) { if (isInvulnerable()) return false; - std::shared_ptr sourceEntity = source->getEntity(); + shared_ptr sourceEntity = source->getEntity(); sitGoal->wantToSit(false); - if (sourceEntity != NULL && !(dynamic_pointer_cast(sourceEntity) != NULL || dynamic_pointer_cast(sourceEntity) != NULL)) + if (sourceEntity != NULL && !(dynamic_pointer_cast(sourceEntity) != NULL || dynamic_pointer_cast(sourceEntity) != NULL)) { // take half damage from non-players and arrows dmg = (dmg + 1) / 2; @@ -302,13 +302,13 @@ bool Wolf::hurt(DamageSource *source, int dmg) return TamableAnimal::hurt(source, dmg); } -bool Wolf::doHurtTarget(std::shared_ptr target) +bool Wolf::doHurtTarget(shared_ptr target) { int damage = isTame() ? 4 : 2; return target->hurt(DamageSource::mobAttack(dynamic_pointer_cast(shared_from_this())), damage); } -void Wolf::tame(const wstring &wsOwnerUUID, bool bDisplayTamingParticles, bool bSetSitting) +void Wolf::tame(const wstring &wsOwnerUUID, bool bDisplayTamingParticles, bool bSetSitting) { setTame(true); setPath(NULL); @@ -322,11 +322,11 @@ void Wolf::tame(const wstring &wsOwnerUUID, bool bDisplayTamingParticles, bool b spawnTamingParticles(bDisplayTamingParticles); } -bool Wolf::interact(std::shared_ptr player) +bool Wolf::interact(shared_ptr player) { - std::shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); - if (isTame()) + if (isTame()) { if (item != NULL) { @@ -343,7 +343,7 @@ bool Wolf::interact(std::shared_ptr player) if (player->abilities.instabuild==false) { item->count--; - if (item->count <= 0) + if (item->count <= 0) { player->inventory->setItem(player->inventory->selected, nullptr); } @@ -351,7 +351,7 @@ bool Wolf::interact(std::shared_ptr player) return true; } else return TamableAnimal::interact(player); - } + } } else if (item->id == Item::dye_powder_Id) { @@ -381,7 +381,7 @@ bool Wolf::interact(std::shared_ptr player) } else { - if (item != NULL && item->id == Item::bone->id && !isAngry()) + if (item != NULL && item->id == Item::bone->id && !isAngry()) { // 4J-PB - don't lose the bone in creative mode if (player->abilities.instabuild==false) @@ -393,9 +393,9 @@ bool Wolf::interact(std::shared_ptr player) } } - if (!level->isClientSide) + if (!level->isClientSide) { - if (random->nextInt(3) == 0) + if (random->nextInt(3) == 0) { // 4J : WESTY: Added for new acheivements. player->awardStat(GenericStats::tamedEntity(eTYPE_WOLF),GenericStats::param_tamedEntity(eTYPE_WOLF)); @@ -404,8 +404,8 @@ bool Wolf::interact(std::shared_ptr player) tame(player->getUUID(),true,true); level->broadcastEntityEvent(shared_from_this(), EntityEvent::TAMING_SUCCEEDED); - } - else + } + else { spawnTamingParticles(false); level->broadcastEntityEvent(shared_from_this(), EntityEvent::TAMING_FAILED); @@ -424,15 +424,15 @@ bool Wolf::interact(std::shared_ptr player) return TamableAnimal::interact(player); } -void Wolf::handleEntityEvent(byte id) +void Wolf::handleEntityEvent(byte id) { if (id == EntityEvent::SHAKE_WETNESS) { isShaking = true; shakeAnim = 0; shakeAnimO = 0; - } - else + } + else { TamableAnimal::handleEntityEvent(id); } @@ -440,18 +440,18 @@ void Wolf::handleEntityEvent(byte id) float Wolf::getTailAngle() { - if (isAngry()) + if (isAngry()) { return 0.49f * PI; - } - else if (isTame()) + } + else if (isTame()) { return (0.55f - (MAX_HEALTH - entityData->getInteger(DATA_HEALTH_ID)) * 0.02f) * PI; } return 0.20f * PI; } -bool Wolf::isFood(std::shared_ptr item) +bool Wolf::isFood(shared_ptr item) { if (item == NULL) return false; if (dynamic_cast(Item::items[item->id]) == NULL) return false; @@ -464,18 +464,18 @@ int Wolf::getMaxSpawnClusterSize() return 4; } -bool Wolf::isAngry() +bool Wolf::isAngry() { return (entityData->getByte(DATA_FLAGS_ID) & 0x02) != 0; } -void Wolf::setAngry(bool value) +void Wolf::setAngry(bool value) { byte current = entityData->getByte(DATA_FLAGS_ID); - if (value) + if (value) { entityData->set(DATA_FLAGS_ID, (byte) (current | 0x02)); - } + } else { entityData->set(DATA_FLAGS_ID, (byte) (current & ~0x02)); @@ -493,17 +493,17 @@ void Wolf::setCollarColor(int color) } // 4J-PB added for tooltips -int Wolf::GetSynchedHealth() +int Wolf::GetSynchedHealth() { return getEntityData()->getInteger(DATA_HEALTH_ID); -} +} -std::shared_ptr Wolf::getBreedOffspring(std::shared_ptr target) +shared_ptr Wolf::getBreedOffspring(shared_ptr target) { // 4J - added limit to wolves that can be bred if( level->canCreateMore( GetType(), Level::eSpawnType_Breed) ) { - std::shared_ptr pBabyWolf = std::shared_ptr( new Wolf(level) ); + shared_ptr pBabyWolf = shared_ptr( new Wolf(level) ); if(!getOwnerUUID().empty()) { @@ -532,11 +532,11 @@ void Wolf::setIsInterested(bool value) } } -bool Wolf::canMate(std::shared_ptr animal) +bool Wolf::canMate(shared_ptr animal) { if (animal == shared_from_this()) return false; if (!isTame()) return false; - std::shared_ptr partner = dynamic_pointer_cast(animal); + shared_ptr partner = dynamic_pointer_cast(animal); if (partner == NULL) return false; if (!partner->isTame()) return false; if (partner->isSitting()) return false; diff --git a/Minecraft.World/Wolf.h b/Minecraft.World/Wolf.h index 8667a0f5..52f2a23b 100644 --- a/Minecraft.World/Wolf.h +++ b/Minecraft.World/Wolf.h @@ -26,7 +26,7 @@ private: public: Wolf(Level *level); virtual bool useNewAi(); - virtual void setTarget(std::shared_ptr target); + virtual void setTarget(shared_ptr target); protected: virtual void serverAiMobStep(); @@ -61,11 +61,11 @@ public: float getHeadHeight(); int getMaxHeadXRot(); virtual bool hurt(DamageSource *source, int dmg); - virtual bool doHurtTarget(std::shared_ptr target); - virtual bool interact(std::shared_ptr player); + virtual bool doHurtTarget(shared_ptr target); + virtual bool interact(shared_ptr player); virtual void handleEntityEvent(byte id); float getTailAngle(); - virtual bool isFood(std::shared_ptr item); + virtual bool isFood(shared_ptr item); virtual int getMaxSpawnClusterSize(); bool isAngry(); void setAngry(bool value); @@ -77,10 +77,10 @@ public: int GetSynchedHealth(); protected: - virtual std::shared_ptr getBreedOffspring(std::shared_ptr target); + virtual shared_ptr getBreedOffspring(shared_ptr target); public: virtual void setIsInterested(bool isInterested); - virtual bool canMate(std::shared_ptr animal); + virtual bool canMate(shared_ptr animal); bool isInterested(); }; diff --git a/Minecraft.World/WoodSlabTile.cpp b/Minecraft.World/WoodSlabTile.cpp index 92244069..ba3a98e5 100644 --- a/Minecraft.World/WoodSlabTile.cpp +++ b/Minecraft.World/WoodSlabTile.cpp @@ -31,9 +31,9 @@ int WoodSlabTile::getResource(int data, Random *random, int playerBonusLevel) return Tile::woodSlabHalf_Id; } -std::shared_ptr WoodSlabTile::getSilkTouchItemInstance(int data) +shared_ptr WoodSlabTile::getSilkTouchItemInstance(int data) { - return std::shared_ptr(new ItemInstance(Tile::woodSlabHalf, 2, data & TYPE_MASK)); + return shared_ptr(new ItemInstance(Tile::woodSlabHalf, 2, data & TYPE_MASK)); } int WoodSlabTile::getAuxName(int auxValue) diff --git a/Minecraft.World/WoodSlabTile.h b/Minecraft.World/WoodSlabTile.h index bf78d2a9..b91f7136 100644 --- a/Minecraft.World/WoodSlabTile.h +++ b/Minecraft.World/WoodSlabTile.h @@ -6,7 +6,7 @@ class Player; class WoodSlabTile : HalfSlabTile -{ +{ friend class Tile; public: @@ -18,11 +18,11 @@ public: WoodSlabTile(int id, bool fullSize); virtual Icon *getTexture(int face, int data); virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual int getAuxName(int auxValue); + virtual int getAuxName(int auxValue); - virtual std::shared_ptr getSilkTouchItemInstance(int data); + virtual shared_ptr getSilkTouchItemInstance(int data); void registerIcons(IconRegister *iconRegister); - + // 4J added virtual unsigned int getDescriptionId(int iData = -1); }; \ No newline at end of file diff --git a/Minecraft.World/WoolCarpetTile.cpp b/Minecraft.World/WoolCarpetTile.cpp index b1534219..16a3d0aa 100644 --- a/Minecraft.World/WoolCarpetTile.cpp +++ b/Minecraft.World/WoolCarpetTile.cpp @@ -46,7 +46,7 @@ void WoolCarpetTile::updateDefaultShape() updateShape(0); } -void WoolCarpetTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, std::shared_ptr forceEntity) +void WoolCarpetTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) { updateShape(level->getData(x, y, z)); } diff --git a/Minecraft.World/WoolCarpetTile.h b/Minecraft.World/WoolCarpetTile.h index ef84514c..af0cd28a 100644 --- a/Minecraft.World/WoolCarpetTile.h +++ b/Minecraft.World/WoolCarpetTile.h @@ -15,7 +15,7 @@ public: bool isSolidRender(bool isServerLevel = false); bool isCubeShaped(); void updateDefaultShape(); - void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, std::shared_ptr forceEntity = std::shared_ptr()); + void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); protected: void updateShape(int data); diff --git a/Minecraft.World/WorkbenchTile.cpp b/Minecraft.World/WorkbenchTile.cpp index 108ec546..7af19755 100644 --- a/Minecraft.World/WorkbenchTile.cpp +++ b/Minecraft.World/WorkbenchTile.cpp @@ -32,7 +32,7 @@ bool WorkbenchTile::TestUse() return true; } -bool WorkbenchTile::use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +bool WorkbenchTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly ) return false; if (level->isClientSide) diff --git a/Minecraft.World/WorkbenchTile.h b/Minecraft.World/WorkbenchTile.h index bbbdcb85..1e7fd4ec 100644 --- a/Minecraft.World/WorkbenchTile.h +++ b/Minecraft.World/WorkbenchTile.h @@ -22,5 +22,5 @@ public: public: virtual bool TestUse(); - bool use(Level *level, int x, int y, int z, std::shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param }; \ No newline at end of file diff --git a/Minecraft.World/XZPacket.h b/Minecraft.World/XZPacket.h index 4154084f..0c4115e0 100644 --- a/Minecraft.World/XZPacket.h +++ b/Minecraft.World/XZPacket.h @@ -25,6 +25,6 @@ public: virtual int getEstimatedSize(); public: - static std::shared_ptr create() { return std::shared_ptr(new XZPacket()); } + static shared_ptr create() { return shared_ptr(new XZPacket()); } virtual int getId() { return 166; } }; \ No newline at end of file diff --git a/Minecraft.World/Zombie.cpp b/Minecraft.World/Zombie.cpp index ba6d30a5..b167635f 100644 --- a/Minecraft.World/Zombie.cpp +++ b/Minecraft.World/Zombie.cpp @@ -29,7 +29,7 @@ Zombie::Zombie(Level *level) : Monster( level ) attackDamage = 4; villagerConversionTime = 0; - + registeredBBWidth = -1; registeredBBHeight = 0; @@ -153,7 +153,7 @@ int Zombie::getHurtSound() int Zombie::getDeathSound() { return eSoundType_MOB_ZOMBIE_DEATH; -} +} int Zombie::getDeathLoot() { @@ -211,7 +211,7 @@ void Zombie::readAdditionalSaveData(CompoundTag *tag) if (tag->contains(L"ConversionTime") && tag->getInt(L"ConversionTime") > -1) startConverting(tag->getInt(L"ConversionTime")); } -void Zombie::killed(std::shared_ptr mob) +void Zombie::killed(shared_ptr mob) { Monster::killed(mob); @@ -220,7 +220,7 @@ void Zombie::killed(std::shared_ptr mob) if( !level->canCreateMore( GetType(), Level::eSpawnType_Egg) ) return; if (level->difficulty == Difficulty::NORMAL && random->nextBoolean()) return; - std::shared_ptr zombie = std::shared_ptr(new Zombie(level)); + shared_ptr zombie = shared_ptr(new Zombie(level)); zombie->copyPosition(mob); level->removeEntity(mob); zombie->finalizeMobSpawn(); @@ -263,9 +263,9 @@ void Zombie::finalizeMobSpawn() #endif } -bool Zombie::interact(std::shared_ptr player) +bool Zombie::interact(shared_ptr player) { - std::shared_ptr item = player->getSelectedItem(); + shared_ptr item = player->getSelectedItem(); if (item != NULL && item->getItem() == Item::apple_gold && item->getAuxValue() == 0 && isVillager() && hasEffect(MobEffect::weakness)) { @@ -319,7 +319,7 @@ bool Zombie::isConverting() void Zombie::finishConversion() { - std::shared_ptr villager = std::shared_ptr(new Villager(level)); + shared_ptr villager = shared_ptr(new Villager(level)); villager->copyPosition(shared_from_this()); villager->finalizeMobSpawn(); villager->setRewardPlayersInVillage(); diff --git a/Minecraft.World/Zombie.h b/Minecraft.World/Zombie.h index ffb48e5d..237db15b 100644 --- a/Minecraft.World/Zombie.h +++ b/Minecraft.World/Zombie.h @@ -48,7 +48,7 @@ public: void setVillager(bool villager); virtual void aiStep(); virtual void tick(); - + protected: virtual int getAmbientSound(); virtual int getHurtSound(); @@ -64,9 +64,9 @@ protected: public: virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); - void killed(std::shared_ptr mob); + void killed(shared_ptr mob); virtual void finalizeMobSpawn(); - bool interact(std::shared_ptr player); + bool interact(shared_ptr player); protected: void startConverting(int time); diff --git a/Minecraft.World/ZonedChunkStorage.cpp b/Minecraft.World/ZonedChunkStorage.cpp index 0e3851c6..aed408c6 100644 --- a/Minecraft.World/ZonedChunkStorage.cpp +++ b/Minecraft.World/ZonedChunkStorage.cpp @@ -207,12 +207,12 @@ void ZonedChunkStorage::loadEntities(Level *level, LevelChunk *lc) int type = tag->getInt(L"_TYPE"); if (type == 0) { - std::shared_ptr e = EntityIO::loadStatic(tag, level); + shared_ptr e = EntityIO::loadStatic(tag, level); if (e != NULL) lc->addEntity(e); } else if (type == 1) { - std::shared_ptr te = TileEntity::loadStatic(tag); + shared_ptr te = TileEntity::loadStatic(tag); if (te != NULL) lc->addTileEntity(te); } } @@ -232,12 +232,12 @@ void ZonedChunkStorage::saveEntities(Level *level, LevelChunk *lc) #endif for (int i = 0; i < LevelChunk::ENTITY_BLOCKS_LENGTH; i++) { - vector > *entities = lc->entityBlocks[i]; + vector > *entities = lc->entityBlocks[i]; AUTO_VAR(itEndTags, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEndTags; it++) { - std::shared_ptr e = *it; //entities->at(j); + shared_ptr e = *it; //entities->at(j); CompoundTag *cp = new CompoundTag(); cp->putInt(L"_TYPE", 0); e->save(cp); @@ -250,10 +250,10 @@ void ZonedChunkStorage::saveEntities(Level *level, LevelChunk *lc) LeaveCriticalSection(&lc->m_csEntities); #endif - for( unordered_map , TilePosKeyHash, TilePosKeyEq>::iterator it = lc->tileEntities.begin(); + for( unordered_map , TilePosKeyHash, TilePosKeyEq>::iterator it = lc->tileEntities.begin(); it != lc->tileEntities.end(); it++) { - std::shared_ptr te = it->second; + shared_ptr te = it->second; CompoundTag *cp = new CompoundTag(); cp->putInt(L"_TYPE", 1); te->save(cp); diff --git a/Minecraft.World/ZoomLayer.cpp b/Minecraft.World/ZoomLayer.cpp index cc6a6f1d..c2123785 100644 --- a/Minecraft.World/ZoomLayer.cpp +++ b/Minecraft.World/ZoomLayer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.level.newbiome.layer.h" #include "System.h" -ZoomLayer::ZoomLayer(int64_t seedMixup, std::shared_ptrparent) : Layer(seedMixup) +ZoomLayer::ZoomLayer(int64_t seedMixup, shared_ptrparent) : Layer(seedMixup) { this->parent = parent; } @@ -81,12 +81,12 @@ int ZoomLayer::random(int a, int b, int c, int d) return d; } -std::shared_ptrZoomLayer::zoom(int64_t seed, std::shared_ptr sup, int count) +shared_ptrZoomLayer::zoom(int64_t seed, shared_ptr sup, int count) { - std::shared_ptrresult = sup; + shared_ptrresult = sup; for (int i = 0; i < count; i++) { - result = std::shared_ptr(new ZoomLayer(seed + i, result)); + result = shared_ptr(new ZoomLayer(seed + i, result)); } return result; } \ No newline at end of file diff --git a/Minecraft.World/ZoomLayer.h b/Minecraft.World/ZoomLayer.h index 76d41a4e..8ec93c8a 100644 --- a/Minecraft.World/ZoomLayer.h +++ b/Minecraft.World/ZoomLayer.h @@ -5,7 +5,7 @@ class ZoomLayer : public Layer { public: - ZoomLayer(int64_t seedMixup, std::shared_ptr parent); + ZoomLayer(int64_t seedMixup, shared_ptr parent); virtual intArray getArea(int xo, int yo, int w, int h); @@ -14,5 +14,5 @@ protected: int random(int a, int b, int c, int d); public: - static std::shared_ptr zoom(int64_t seed, std::shared_ptrsup, int count); + static shared_ptr zoom(int64_t seed, shared_ptrsup, int count); }; \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.ContainerListener.h b/Minecraft.World/net.minecraft.world.ContainerListener.h index 8ef4d63a..1ac036a5 100644 --- a/Minecraft.World/net.minecraft.world.ContainerListener.h +++ b/Minecraft.World/net.minecraft.world.ContainerListener.h @@ -3,7 +3,7 @@ class SimpleContainer; // TODO 4J Stu -// There are 2 classes called ContainerListener. One in net.minecraft.world.inventory and +// There are 2 classes called ContainerListener. One in net.minecraft.world.inventory and // another one in net.minecraft.world . To avoid clashes I have renamed both and put them in a namespace // to avoid confusion. @@ -13,6 +13,6 @@ namespace net_minecraft_world { friend class SimpleContainer; private: - virtual void containerChanged(std::shared_ptr simpleContainer) = 0; + virtual void containerChanged(shared_ptr simpleContainer) = 0; }; } \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.inventory.ContainerListener.h b/Minecraft.World/net.minecraft.world.inventory.ContainerListener.h index 979311a3..ff9dfa2e 100644 --- a/Minecraft.World/net.minecraft.world.inventory.ContainerListener.h +++ b/Minecraft.World/net.minecraft.world.inventory.ContainerListener.h @@ -3,7 +3,7 @@ using namespace std; class AbstractContainerMenu; // 4J Stu -// There are 2 classes called ContainerListener. Once here in net.minecraft.world.inventory and +// There are 2 classes called ContainerListener. Once here in net.minecraft.world.inventory and // another once in net.minecraft.world . To avoid clashes I have renamed both and put them in a namespace // to avoid confusion. @@ -12,9 +12,9 @@ namespace net_minecraft_world_inventory class ContainerListener { public: - virtual void refreshContainer(AbstractContainerMenu *container, vector > *items) = 0; + virtual void refreshContainer(AbstractContainerMenu *container, vector > *items) = 0; - virtual void slotChanged(AbstractContainerMenu *container, int slotIndex, std::shared_ptr item) = 0; + virtual void slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item) = 0; virtual void setContainerData(AbstractContainerMenu *container, int id, int value) = 0; }; -- cgit v1.2.3 From b3feddfef372618c8a9d7a0abcaf18cfad866c18 Mon Sep 17 00:00:00 2001 From: daoge <3523206925@qq.com> Date: Tue, 3 Mar 2026 03:04:10 +0800 Subject: feat: TU19 (Dec 2014) Features & Content (#155) * try to resolve merge conflict * feat: TU19 (Dec 2014) Features & Content (#32) * December 2014 files * Working release build * Fix compilation issues * Add sound to Windows64Media * Add DLC content and force Tutorial DLC * Revert "Add DLC content and force Tutorial DLC" This reverts commit 97a43994725008e35fceb984d5549df9c8cea470. * Disable broken light packing * Disable breakpoint during DLC texture map load Allows DLC loading but the DLC textures are still broken * Fix post build not working * ... * fix vs2022 build * fix cmake build --------- Co-authored-by: Loki --- CMakeLists.txt | 24 +- .../AbstractProjectileDispenseBehavior.cpp | 37 + .../AbstractProjectileDispenseBehavior.h | 17 + Minecraft.Client/AbstractTexturePack.cpp | 41 +- Minecraft.Client/ArrowRenderer.cpp | 9 +- Minecraft.Client/ArrowRenderer.h | 4 + Minecraft.Client/BatModel.cpp | 107 + Minecraft.Client/BatModel.h | 20 + Minecraft.Client/BatRenderer.cpp | 50 + Minecraft.Client/BatRenderer.h | 20 + Minecraft.Client/BeaconRenderer.cpp | 138 + Minecraft.Client/BeaconRenderer.h | 13 + Minecraft.Client/BlazeModel.cpp | 7 +- Minecraft.Client/BlazeModel.h | 2 +- Minecraft.Client/BlazeRenderer.cpp | 9 +- Minecraft.Client/BlazeRenderer.h | 5 +- Minecraft.Client/BoatRenderer.cpp | 10 +- Minecraft.Client/BoatRenderer.h | 5 +- Minecraft.Client/BookModel.cpp | 4 +- Minecraft.Client/BookModel.h | 2 +- Minecraft.Client/BossMobGuiInfo.cpp | 16 + Minecraft.Client/BossMobGuiInfo.h | 14 + Minecraft.Client/BufferedImage.cpp | 2 +- Minecraft.Client/Camera.cpp | 6 +- Minecraft.Client/Camera.h | 6 +- Minecraft.Client/CaveSpiderRenderer.cpp | 20 + Minecraft.Client/CaveSpiderRenderer.h | 18 + Minecraft.Client/ChestRenderer.cpp | 49 +- Minecraft.Client/ChestRenderer.h | 9 +- Minecraft.Client/ChickenModel.cpp | 4 +- Minecraft.Client/ChickenModel.h | 4 +- Minecraft.Client/ChickenRenderer.cpp | 9 +- Minecraft.Client/ChickenRenderer.h | 7 +- Minecraft.Client/Chunk.cpp | 33 +- Minecraft.Client/ClientConnection.cpp | 1413 +++- Minecraft.Client/ClientConnection.h | 28 +- Minecraft.Client/ClockTexture.cpp | 4 +- Minecraft.Client/Common/App_Defines.h | 28 +- Minecraft.Client/Common/App_enums.h | 69 +- Minecraft.Client/Common/App_structs.h | 4 + .../Common/Audio/Consoles_SoundEngine.cpp | 39 + .../Common/Audio/Consoles_SoundEngine.h | 19 + Minecraft.Client/Common/Audio/SoundEngine.cpp | 16 + Minecraft.Client/Common/Audio/SoundNames.cpp | 72 + Minecraft.Client/Common/BuildVer.h | 8 +- Minecraft.Client/Common/Colours/ColourTable.cpp | 15 + Minecraft.Client/Common/Console_Debug_enum.h | 6 +- Minecraft.Client/Common/Consoles_App.cpp | 1307 ++- Minecraft.Client/Common/Consoles_App.h | 106 +- Minecraft.Client/Common/DLC/DLCManager.cpp | 26 +- Minecraft.Client/Common/DLC/DLCManager.h | 2 + Minecraft.Client/Common/DLC/DLCPack.cpp | 22 +- Minecraft.Client/Common/DLC/DLCPack.h | 2 + Minecraft.Client/Common/DLC/DLCTextureFile.cpp | 1 + .../Common/GameRules/ConsoleGenerateStructure.h | 4 + .../Common/GameRules/ConsoleSchematicFile.cpp | 16 +- .../Common/GameRules/GameRuleManager.cpp | 50 +- .../Common/GameRules/LevelGenerationOptions.cpp | 241 +- .../Common/GameRules/LevelGenerationOptions.h | 12 +- Minecraft.Client/Common/GameRules/StartFeature.cpp | 14 +- Minecraft.Client/Common/GameRules/StartFeature.h | 4 +- .../XboxStructureActionPlaceContainer.cpp | 6 +- .../GameRules/XboxStructureActionPlaceSpawner.cpp | 4 +- .../Common/Leaderboards/LeaderboardInterface.cpp | 88 + .../Common/Leaderboards/LeaderboardInterface.h | 35 + .../Common/Leaderboards/SonyLeaderboardManager.cpp | 1131 +++ .../Common/Leaderboards/SonyLeaderboardManager.h | 133 + Minecraft.Client/Common/Leaderboards/base64.cpp | 131 + Minecraft.Client/Common/Leaderboards/base64.h | 7 + Minecraft.Client/Common/Media/BeaconMenu1080.swf | Bin 0 -> 18172 bytes Minecraft.Client/Common/Media/BeaconMenu480.swf | Bin 0 -> 18158 bytes Minecraft.Client/Common/Media/BeaconMenu720.swf | Bin 0 -> 18157 bytes .../Common/Media/BeaconMenuSplit1080.swf | Bin 0 -> 18124 bytes .../Common/Media/BeaconMenuSplit720.swf | Bin 0 -> 18180 bytes Minecraft.Client/Common/Media/BeaconMenuVita.swf | Bin 0 -> 18155 bytes Minecraft.Client/Common/Media/Controls1080.swf | Bin 17511 -> 18094 bytes .../Common/Media/Crafting2x2Menu1080.swf | Bin 18508 -> 19943 bytes .../Common/Media/Crafting2x2MenuVita.swf | Bin 19461 -> 19522 bytes .../Common/Media/Crafting3x3MenuSplit1080.swf | Bin 18310 -> 19326 bytes .../Common/Media/CreateWorldMenu1080.swf | Bin 22989 -> 23717 bytes .../Common/Media/CreateWorldMenu480.swf | Bin 19894 -> 23724 bytes .../Common/Media/CreateWorldMenu720.swf | Bin 20545 -> 23807 bytes .../Common/Media/CreateWorldMenuVita.swf | Bin 22081 -> 23720 bytes Minecraft.Client/Common/Media/CreativeMenuVita.swf | Bin 18748 -> 19302 bytes .../Common/Media/FireworksMenu1080.swf | Bin 0 -> 17487 bytes Minecraft.Client/Common/Media/FireworksMenu480.swf | Bin 0 -> 17483 bytes Minecraft.Client/Common/Media/FireworksMenu720.swf | Bin 0 -> 17482 bytes .../Common/Media/FireworksMenuSplit1080.swf | Bin 0 -> 17500 bytes .../Common/Media/FireworksMenuSplit720.swf | Bin 0 -> 17474 bytes .../Common/Media/FireworksMenuVita.swf | Bin 0 -> 17479 bytes .../Common/Media/Graphics/Beacon_1.png | Bin 0 -> 326 bytes .../Common/Media/Graphics/Beacon_2.png | Bin 0 -> 364 bytes .../Common/Media/Graphics/Beacon_3.png | Bin 0 -> 379 bytes .../Common/Media/Graphics/Beacon_4.png | Bin 0 -> 331 bytes .../Common/Media/Graphics/Beacon_Button_Cross.png | Bin 0 -> 305 bytes .../Media/Graphics/Beacon_Button_Disabled.png | Bin 0 -> 138 bytes .../Common/Media/Graphics/Beacon_Button_Hover.png | Bin 0 -> 142 bytes .../Common/Media/Graphics/Beacon_Button_Normal.png | Bin 0 -> 137 bytes .../Media/Graphics/Beacon_Button_Pressed.png | Bin 0 -> 139 bytes .../Common/Media/Graphics/Beacon_Button_Tick.png | Bin 0 -> 241 bytes .../Media/Graphics/HUD/Health_Full_Absorb.png | Bin 0 -> 193 bytes .../Media/Graphics/HUD/Health_Full_Wither.png | Bin 0 -> 248 bytes .../Graphics/HUD/Health_Full_Wither_Flash.png | Bin 0 -> 197 bytes .../Media/Graphics/HUD/Health_Half_Absorb.png | Bin 0 -> 177 bytes .../Media/Graphics/HUD/Health_Half_Wither.png | Bin 0 -> 216 bytes .../Graphics/HUD/Health_Half_Wither_Flash.png | Bin 0 -> 194 bytes .../Common/Media/Graphics/HUD/HorseHealth_Full.png | Bin 0 -> 224 bytes .../Media/Graphics/HUD/HorseHealth_Full_Flash.png | Bin 0 -> 230 bytes .../Common/Media/Graphics/HUD/HorseHealth_Half.png | Bin 0 -> 204 bytes .../Media/Graphics/HUD/HorseHealth_Half_Flash.png | Bin 0 -> 202 bytes .../Media/Graphics/HUD/HorseJump_bar_empty.png | Bin 0 -> 339 bytes .../Media/Graphics/HUD/HorseJump_bar_full.png | Bin 0 -> 1799 bytes .../Common/Media/Graphics/Horse_Armor_Slot.png | Bin 0 -> 198 bytes .../Common/Media/Graphics/Horse_Saddle_Slot.png | Bin 0 -> 219 bytes .../Media/Graphics/HowToPlay/HowToPlay_Beacon.png | Bin 0 -> 17277 bytes .../Graphics/HowToPlay/HowToPlay_Beacon_Small.png | Bin 0 -> 11848 bytes .../Graphics/HowToPlay/HowToPlay_Fireworks.png | Bin 0 -> 19522 bytes .../HowToPlay/HowToPlay_Fireworks_Small.png | Bin 0 -> 11541 bytes .../Media/Graphics/HowToPlay/HowToPlay_Hopper.png | Bin 0 -> 15145 bytes .../Graphics/HowToPlay/HowToPlay_Hopper_Small.png | Bin 0 -> 9222 bytes .../Media/Graphics/HowToPlay/HowToPlay_Horses.png | Bin 0 -> 138491 bytes .../Graphics/HowToPlay/HowToPlay_Horses_Small.png | Bin 0 -> 54859 bytes .../Graphics/PanelsAndTabs/GameOptionsTabOn.png | Bin 0 -> 678 bytes .../PanelsAndTabs/GameOptionsTabOn_Small.png | Bin 0 -> 367 bytes .../Graphics/PanelsAndTabs/MoreOptionsTabOff.png | Bin 0 -> 678 bytes .../PanelsAndTabs/MoreOptionsTabOff_Small.png | Bin 0 -> 349 bytes .../Graphics/PanelsAndTabs/WorldOptionsTabOn.png | Bin 0 -> 675 bytes .../PanelsAndTabs/WorldOptionsTabOn_Small.png | Bin 0 -> 367 bytes .../Potion_Effect_Icon_HealthBoost.png | Bin 0 -> 418 bytes .../PotionEffect/Potion_Effect_Icon_Wither.png | Bin 0 -> 771 bytes .../Media/Graphics/TutorialExitScreenshot.png | Bin 75532 -> 60176 bytes .../Graphics/X360ControllerIcons/ButtonRS_TT.png | Bin 0 -> 1355 bytes Minecraft.Client/Common/Media/HTMLColours.col | Bin 838 -> 838 bytes Minecraft.Client/Common/Media/HTMLColours.xml | 4 +- Minecraft.Client/Common/Media/HUD1080.swf | Bin 10512 -> 11926 bytes Minecraft.Client/Common/Media/HUD480.swf | Bin 10508 -> 11923 bytes Minecraft.Client/Common/Media/HUD720.swf | Bin 10507 -> 11925 bytes Minecraft.Client/Common/Media/HUDSplit1080.swf | Bin 11055 -> 12006 bytes Minecraft.Client/Common/Media/HUDSplit720.swf | Bin 11018 -> 11976 bytes Minecraft.Client/Common/Media/HUDVita.swf | Bin 10947 -> 11914 bytes Minecraft.Client/Common/Media/HopperMenu1080.swf | Bin 0 -> 25722 bytes Minecraft.Client/Common/Media/HopperMenu480.swf | Bin 0 -> 17211 bytes Minecraft.Client/Common/Media/HopperMenu720.swf | Bin 0 -> 17217 bytes .../Common/Media/HopperMenuSplit1080.swf | Bin 0 -> 17239 bytes .../Common/Media/HopperMenuSplit720.swf | Bin 0 -> 17216 bytes Minecraft.Client/Common/Media/HopperMenuVita.swf | Bin 0 -> 17388 bytes .../Common/Media/HorseInventoryMenu1080.swf | Bin 15454 -> 17745 bytes .../Common/Media/HorseInventoryMenu480.swf | Bin 15456 -> 17750 bytes .../Common/Media/HorseInventoryMenu720.swf | Bin 15427 -> 17711 bytes .../Common/Media/HorseInventoryMenuSplit1080.swf | Bin 15471 -> 17832 bytes .../Common/Media/HorseInventoryMenuSplit720.swf | Bin 15454 -> 17744 bytes .../Common/Media/HorseInventoryMenuVita.swf | Bin 0 -> 17763 bytes Minecraft.Client/Common/Media/HowToPlay1080.swf | Bin 10489 -> 11764 bytes Minecraft.Client/Common/Media/HowToPlay480.swf | Bin 10604 -> 11829 bytes Minecraft.Client/Common/Media/HowToPlay720.swf | Bin 10536 -> 11833 bytes .../Common/Media/HowToPlayMenu1080.swf | Bin 12764 -> 14501 bytes Minecraft.Client/Common/Media/HowToPlayMenu480.swf | Bin 12331 -> 14497 bytes Minecraft.Client/Common/Media/HowToPlayMenu720.swf | Bin 12444 -> 14501 bytes .../Common/Media/HowToPlayMenuSplit1080.swf | Bin 12372 -> 14496 bytes .../Common/Media/HowToPlayMenuSplit720.swf | Bin 12338 -> 14493 bytes .../Common/Media/HowToPlayMenuVita.swf | Bin 13919 -> 14499 bytes .../Common/Media/HowToPlaySplit1080.swf | Bin 10465 -> 11740 bytes .../Common/Media/HowToPlaySplit720.swf | Bin 9931 -> 11801 bytes Minecraft.Client/Common/Media/HowToPlayVita.swf | Bin 10782 -> 11990 bytes .../Common/Media/InGameHostOptions1080.swf | Bin 14384 -> 15836 bytes .../Common/Media/InGameHostOptions480.swf | Bin 14490 -> 16003 bytes .../Common/Media/InGameHostOptions720.swf | Bin 14486 -> 15944 bytes .../Common/Media/InGameHostOptionsSplit1080.swf | Bin 14382 -> 15903 bytes .../Common/Media/InGameHostOptionsSplit720.swf | Bin 14492 -> 16020 bytes .../Common/Media/InGameHostOptionsVita.swf | Bin 14493 -> 16001 bytes .../Common/Media/InGamePlayerOptions1080.swf | Bin 15224 -> 16386 bytes .../Common/Media/InGamePlayerOptions480.swf | Bin 15570 -> 16777 bytes .../Common/Media/InGamePlayerOptions720.swf | Bin 15336 -> 16485 bytes .../Common/Media/InGamePlayerOptionsSplit1080.swf | Bin 15538 -> 16728 bytes .../Common/Media/InGamePlayerOptionsSplit720.swf | Bin 15349 -> 16493 bytes .../Common/Media/InGamePlayerOptionsVita.swf | Bin 15575 -> 16779 bytes Minecraft.Client/Common/Media/Intro1080.swf | Bin 207241 -> 344032 bytes Minecraft.Client/Common/Media/Intro480.swf | Bin 89823 -> 91385 bytes Minecraft.Client/Common/Media/Intro720.swf | Bin 88977 -> 90484 bytes Minecraft.Client/Common/Media/IntroVita.swf | Bin 79876 -> 80539 bytes .../Common/Media/InventoryMenu1080.swf | Bin 18495 -> 18911 bytes Minecraft.Client/Common/Media/InventoryMenu480.swf | Bin 18456 -> 18883 bytes Minecraft.Client/Common/Media/InventoryMenu720.swf | Bin 18452 -> 18890 bytes .../Common/Media/InventoryMenuSplit1080.swf | Bin 18459 -> 18891 bytes .../Common/Media/InventoryMenuSplit720.swf | Bin 18452 -> 18974 bytes .../Common/Media/InventoryMenuVita.swf | Bin 18461 -> 18877 bytes .../Common/Media/LanguagesMenu1080.swf | Bin 0 -> 14423 bytes Minecraft.Client/Common/Media/LanguagesMenu480.swf | Bin 0 -> 14405 bytes Minecraft.Client/Common/Media/LanguagesMenu720.swf | Bin 0 -> 14411 bytes .../Common/Media/LanguagesMenuSplit1080.swf | Bin 0 -> 14403 bytes .../Common/Media/LanguagesMenuSplit720.swf | Bin 0 -> 14414 bytes .../Common/Media/LanguagesMenuVita.swf | Bin 0 -> 14406 bytes .../Common/Media/LaunchMoreOptionsMenu1080.swf | Bin 18592 -> 21323 bytes .../Common/Media/LaunchMoreOptionsMenu480.swf | Bin 16682 -> 20949 bytes .../Common/Media/LaunchMoreOptionsMenu720.swf | Bin 16212 -> 20730 bytes .../Common/Media/LaunchMoreOptionsMenuVita.swf | Bin 16674 -> 20948 bytes Minecraft.Client/Common/Media/LoadMenu1080.swf | Bin 21745 -> 22608 bytes Minecraft.Client/Common/Media/LoadMenu480.swf | Bin 19169 -> 22529 bytes Minecraft.Client/Common/Media/LoadMenu720.swf | Bin 18616 -> 22606 bytes Minecraft.Client/Common/Media/LoadMenuVita.swf | Bin 20837 -> 22549 bytes Minecraft.Client/Common/Media/MediaDurango.arc | Bin 19606036 -> 15586417 bytes Minecraft.Client/Common/Media/MediaOrbis.arc | Bin 14344887 -> 10450632 bytes Minecraft.Client/Common/Media/MediaPS3.arc | Bin 10951528 -> 11855941 bytes Minecraft.Client/Common/Media/MediaPSVita.arc | Bin 8137376 -> 8834315 bytes Minecraft.Client/Common/Media/MediaWindows64.arc | Bin 22628631 -> 21409239 bytes .../Common/Media/PressStartToPlay1080.swf | Bin 14283 -> 15323 bytes .../Common/Media/PressStartToPlay720.swf | Bin 13585 -> 15166 bytes .../Common/Media/QuadrantSignin1080.swf | Bin 18748 -> 19420 bytes .../Common/Media/QuadrantSignin720.swf | Bin 26510 -> 19398 bytes .../Common/Media/SettingsOptionsMenu1080.swf | Bin 15424 -> 16235 bytes .../Common/Media/SettingsOptionsMenu480.swf | Bin 15617 -> 16426 bytes .../Common/Media/SettingsOptionsMenu720.swf | Bin 15614 -> 16427 bytes .../Common/Media/SettingsOptionsMenuSplit1080.swf | Bin 15468 -> 15799 bytes .../Common/Media/SettingsOptionsMenuSplit720.swf | Bin 15616 -> 15938 bytes .../Common/Media/SettingsOptionsMenuVita.swf | Bin 15692 -> 16423 bytes .../Common/Media/SkinSelectMenu1080.swf | Bin 18198 -> 18546 bytes .../Common/Media/SkinSelectMenu720.swf | Bin 18106 -> 18498 bytes .../Common/Media/SkinSelectMenuSplit1080.swf | Bin 17924 -> 18420 bytes .../Common/Media/SkinSelectMenuSplit720.swf | Bin 17560 -> 18049 bytes .../Common/Media/SkinSelectMenuVita.swf | Bin 17806 -> 18296 bytes Minecraft.Client/Common/Media/ToolTips1080.swf | Bin 13932 -> 15824 bytes Minecraft.Client/Common/Media/ToolTips480.swf | Bin 13933 -> 15821 bytes Minecraft.Client/Common/Media/ToolTips720.swf | Bin 13929 -> 15820 bytes .../Common/Media/ToolTipsSplit1080.swf | Bin 13930 -> 15827 bytes Minecraft.Client/Common/Media/ToolTipsSplit720.swf | Bin 13929 -> 15810 bytes Minecraft.Client/Common/Media/ToolTipsVita.swf | Bin 14881 -> 15996 bytes Minecraft.Client/Common/Media/TradingMenu1080.swf | Bin 16835 -> 18200 bytes Minecraft.Client/Common/Media/TradingMenu480.swf | Bin 16821 -> 18209 bytes Minecraft.Client/Common/Media/TradingMenu720.swf | Bin 17622 -> 18210 bytes .../Common/Media/TradingMenuSplit1080.swf | Bin 16840 -> 18232 bytes .../Common/Media/TradingMenuSplit720.swf | Bin 16828 -> 18221 bytes Minecraft.Client/Common/Media/TradingMenuVita.swf | Bin 18165 -> 18226 bytes .../Common/Media/TutorialPopup1080.swf | Bin 14136 -> 15117 bytes Minecraft.Client/Common/Media/TutorialPopup480.swf | Bin 14143 -> 14544 bytes Minecraft.Client/Common/Media/TutorialPopup720.swf | Bin 14131 -> 14534 bytes .../Common/Media/TutorialPopupSplit1080.swf | Bin 14714 -> 15120 bytes .../Common/Media/TutorialPopupSplit720.swf | Bin 14138 -> 14540 bytes .../Common/Media/TutorialPopupVita.swf | Bin 14142 -> 14544 bytes Minecraft.Client/Common/Media/de-DE/strings.resx | 969 ++- .../Common/Media/es-ES/4J_strings.resx | 8 +- Minecraft.Client/Common/Media/es-ES/strings.resx | 1031 ++- Minecraft.Client/Common/Media/font/CHS/MSYH.ttf | Bin 0 -> 21576796 bytes Minecraft.Client/Common/Media/fr-FR/strings.resx | 977 ++- Minecraft.Client/Common/Media/it-IT/strings.resx | 993 ++- .../Common/Media/ja-JP/4J_strings.resx | 6 +- Minecraft.Client/Common/Media/ja-JP/strings.resx | 1003 ++- .../Common/Media/ko-KR/4J_strings.resx | 6 +- Minecraft.Client/Common/Media/ko-KR/strings.resx | 973 ++- Minecraft.Client/Common/Media/movies1080.txt | 10 + Minecraft.Client/Common/Media/movies480.txt | 5 + Minecraft.Client/Common/Media/movies720.txt | 10 + Minecraft.Client/Common/Media/moviesVita.txt | 5 + Minecraft.Client/Common/Media/pt-BR/strings.resx | 1014 ++- .../Common/Media/pt-PT/4J_strings.resx | 8 +- Minecraft.Client/Common/Media/pt-PT/strings.resx | 1013 ++- Minecraft.Client/Common/Media/skin.swf | Bin 145819 -> 146035 bytes Minecraft.Client/Common/Media/skinGraphics.swf | Bin 1828637 -> 2054094 bytes Minecraft.Client/Common/Media/skinGraphicsHud.swf | Bin 11637 -> 14403 bytes .../Common/Media/skinGraphicsInGame.swf | Bin 90765 -> 167207 bytes Minecraft.Client/Common/Media/skinHD.swf | Bin 152571 -> 152798 bytes Minecraft.Client/Common/Media/skinHDGraphics.swf | Bin 3930937 -> 1557529 bytes .../Common/Media/skinHDGraphicsHud.swf | Bin 11926 -> 14693 bytes .../Common/Media/skinHDGraphicsInGame.swf | Bin 111299 -> 292436 bytes Minecraft.Client/Common/Media/skinHDHud.swf | Bin 7688 -> 9077 bytes Minecraft.Client/Common/Media/skinHDInGame.swf | Bin 23251 -> 24729 bytes Minecraft.Client/Common/Media/skinHDLabels.swf | Bin 5780 -> 6309 bytes Minecraft.Client/Common/Media/skinHud.swf | Bin 7799 -> 9203 bytes Minecraft.Client/Common/Media/skinInGame.swf | Bin 23315 -> 24769 bytes Minecraft.Client/Common/Media/skinLabels.swf | Bin 6264 -> 6357 bytes Minecraft.Client/Common/Media/skin_Minecraft.xui | 4017 ++++++++- Minecraft.Client/Common/Media/splashes.txt | 6 +- Minecraft.Client/Common/Media/strings.resx | 3341 +++++--- Minecraft.Client/Common/Media/xuiscene_anvil_480.h | 369 + .../Common/Media/xuiscene_anvil_small.h | 390 + Minecraft.Client/Common/Media/xuiscene_base.h | 8 + Minecraft.Client/Common/Media/xuiscene_base.xui | 96 + Minecraft.Client/Common/Media/xuiscene_base_480.h | 4 + .../Common/Media/xuiscene_base_480.xui | 48 + Minecraft.Client/Common/Media/xuiscene_beacon.h | 406 + Minecraft.Client/Common/Media/xuiscene_beacon.xui | 6508 ++++++++++++++ .../Common/Media/xuiscene_beacon_480.xui | 5215 ++++++++++++ .../Common/Media/xuiscene_beacon_Small.xui | 5215 ++++++++++++ .../Common/Media/xuiscene_craftingpanel_3x3.h | 36 + .../Common/Media/xuiscene_craftingpanel_3x3.xui | 506 +- Minecraft.Client/Common/Media/xuiscene_enchant.h | 19 + Minecraft.Client/Common/Media/xuiscene_fireworks.h | 166 + .../Common/Media/xuiscene_fireworks.xui | 2359 ++++++ .../Common/Media/xuiscene_fireworks_480.xui | 1973 +++++ .../Common/Media/xuiscene_fireworks_small.xui | 1558 ++++ Minecraft.Client/Common/Media/xuiscene_hopper.h | 99 + Minecraft.Client/Common/Media/xuiscene_hopper.xui | 1436 ++++ .../Common/Media/xuiscene_hopper_480.h | 141 + .../Common/Media/xuiscene_hopper_480.xui | 1891 +++++ .../Common/Media/xuiscene_hopper_small.h | 99 + .../Common/Media/xuiscene_hopper_small.xui | 1348 +++ Minecraft.Client/Common/Media/xuiscene_horse.h | 160 + Minecraft.Client/Common/Media/xuiscene_horse.xui | 2281 +++++ Minecraft.Client/Common/Media/xuiscene_horse_480.h | 209 + .../Common/Media/xuiscene_horse_480.xui | 2770 ++++++ .../Common/Media/xuiscene_horse_small.h | 163 + .../Common/Media/xuiscene_horse_small.xui | 2175 +++++ Minecraft.Client/Common/Media/xuiscene_howtoplay.h | 18 + .../Common/Media/xuiscene_howtoplay.xui | 176 +- .../Common/Media/xuiscene_howtoplay_480.h | 18 + .../Common/Media/xuiscene_howtoplay_480.xui | 165 +- .../Common/Media/xuiscene_howtoplay_small.h | 18 + .../Common/Media/xuiscene_howtoplay_small.xui | 165 +- Minecraft.Client/Common/Media/xuiscene_hud.h | 55 +- Minecraft.Client/Common/Media/xuiscene_hud.xui | 353 +- Minecraft.Client/Common/Media/xuiscene_hud_480.h | 55 +- Minecraft.Client/Common/Media/xuiscene_hud_480.xui | 353 +- Minecraft.Client/Common/Media/xuiscene_hud_small.h | 55 +- .../Common/Media/xuiscene_hud_small.xui | 353 +- .../Common/Media/xuiscene_ingame_host_options.h | 7 + .../Common/Media/xuiscene_ingame_host_options.xui | 104 +- .../Media/xuiscene_ingame_host_options_480.h | 7 + .../Media/xuiscene_ingame_host_options_480.xui | 117 +- .../Media/xuiscene_ingame_host_options_small.h | 7 + .../Media/xuiscene_ingame_host_options_small.xui | 117 +- .../Common/Media/xuiscene_inventory_creative.h | 19 + .../Common/Media/xuiscene_inventory_creative.xui | 287 +- .../Common/Media/xuiscene_load_settings.h | 3 + .../Common/Media/xuiscene_load_settings.xui | 65 +- .../Common/Media/xuiscene_load_settings_480.h | 3 + .../Common/Media/xuiscene_load_settings_480.xui | 79 +- .../Common/Media/xuiscene_multi_create.h | 7 +- .../Common/Media/xuiscene_multi_create.xui | 144 +- .../Common/Media/xuiscene_multi_create_480.h | 7 +- .../Common/Media/xuiscene_multi_create_480.xui | 149 +- .../Media/xuiscene_multi_launch_more_options.h | 32 +- .../Media/xuiscene_multi_launch_more_options.xui | 472 +- .../Media/xuiscene_multi_launch_more_options_480.h | 40 +- .../xuiscene_multi_launch_more_options_480.xui | 513 +- .../Common/Media/xuiscene_trading_480.h | 463 + .../Common/Media/xuiscene_trading_small.h | 445 + .../Common/Media/zh-CHT/4J_strings.resx | 4 +- Minecraft.Client/Common/Media/zh-CHT/strings.resx | 1079 ++- .../Common/Network/GameNetworkManager.cpp | 197 +- .../Common/Network/GameNetworkManager.h | 1 + .../Common/Network/NetworkPlayerInterface.h | 5 +- .../Common/Network/Sony/NetworkPlayerSony.cpp | 31 +- .../Common/Network/Sony/NetworkPlayerSony.h | 6 +- .../Network/Sony/PlatformNetworkManagerSony.cpp | 26 +- .../Common/Network/Sony/SQRNetworkManager.cpp | 73 + .../Common/Network/Sony/SQRNetworkManager.h | 16 +- .../Common/Network/Sony/SQRNetworkPlayer.cpp | 258 +- .../Common/Network/Sony/SQRNetworkPlayer.h | 52 +- .../Common/Network/Sony/SonyCommerce.h | 4 + .../Common/Network/Sony/SonyRemoteStorage.cpp | 249 +- .../Common/Network/Sony/SonyRemoteStorage.h | 45 +- Minecraft.Client/Common/Potion_Macros.h | 2 + .../Common/Tutorial/DiggerItemHint.cpp | 2 +- Minecraft.Client/Common/Tutorial/FullTutorial.cpp | 75 +- .../Common/Tutorial/HorseChoiceTask.cpp | 43 + Minecraft.Client/Common/Tutorial/HorseChoiceTask.h | 23 + .../Common/Tutorial/LookAtTileHint.cpp | 12 +- .../Common/Tutorial/RideEntityTask.cpp | 30 + Minecraft.Client/Common/Tutorial/RideEntityTask.h | 22 + Minecraft.Client/Common/Tutorial/Tutorial.cpp | 260 +- Minecraft.Client/Common/Tutorial/Tutorial.h | 3 +- Minecraft.Client/Common/Tutorial/TutorialEnum.h | 32 +- Minecraft.Client/Common/Tutorial/TutorialTask.h | 6 +- Minecraft.Client/Common/Tutorial/TutorialTasks.h | 2 + Minecraft.Client/Common/Tutorial/UseItemTask.h | 1 - Minecraft.Client/Common/UI/IUIController.h | 2 +- .../Common/UI/IUIScene_AbstractContainerMenu.cpp | 353 +- .../Common/UI/IUIScene_AbstractContainerMenu.h | 58 +- Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp | 12 +- Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h | 4 +- Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp | 410 + Minecraft.Client/Common/UI/IUIScene_BeaconMenu.h | 31 + .../Common/UI/IUIScene_CommandBlockMenu.cpp | 25 + .../Common/UI/IUIScene_CommandBlockMenu.h | 18 + .../Common/UI/IUIScene_CraftingMenu.cpp | 148 +- Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h | 1 + .../Common/UI/IUIScene_CreativeMenu.cpp | 537 +- Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h | 27 +- .../Common/UI/IUIScene_FireworksMenu.cpp | 129 + .../Common/UI/IUIScene_FireworksMenu.h | 9 + Minecraft.Client/Common/UI/IUIScene_HUD.cpp | 264 + Minecraft.Client/Common/UI/IUIScene_HUD.h | 85 + Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp | 77 + Minecraft.Client/Common/UI/IUIScene_HopperMenu.h | 12 + .../Common/UI/IUIScene_HorseInventoryMenu.cpp | 251 + .../Common/UI/IUIScene_HorseInventoryMenu.h | 20 + Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp | 60 +- Minecraft.Client/Common/UI/IUIScene_StartGame.cpp | 4 +- .../Common/UI/IUIScene_TradingMenu.cpp | 49 +- Minecraft.Client/Common/UI/IUIScene_TradingMenu.h | 9 +- Minecraft.Client/Common/UI/UI.h | 8 + Minecraft.Client/Common/UI/UIBitmapFont.cpp | 16 +- .../Common/UI/UIComponent_Panorama.cpp | 2 +- .../Common/UI/UIComponent_PressStartToPlay.cpp | 13 +- .../Common/UI/UIComponent_Tooltips.cpp | 61 +- Minecraft.Client/Common/UI/UIComponent_Tooltips.h | 12 +- .../Common/UI/UIComponent_TutorialPopup.cpp | 10 +- .../Common/UI/UIComponent_TutorialPopup.h | 2 + Minecraft.Client/Common/UI/UIControl.h | 1 + Minecraft.Client/Common/UI/UIControl_Base.cpp | 20 +- Minecraft.Client/Common/UI/UIControl_Base.h | 9 +- .../Common/UI/UIControl_BeaconEffectButton.cpp | 121 + .../Common/UI/UIControl_BeaconEffectButton.h | 49 + Minecraft.Client/Common/UI/UIControl_Button.cpp | 2 +- Minecraft.Client/Common/UI/UIControl_Button.h | 4 +- .../Common/UI/UIControl_ButtonList.cpp | 44 + Minecraft.Client/Common/UI/UIControl_ButtonList.h | 14 + Minecraft.Client/Common/UI/UIControl_CheckBox.cpp | 2 +- Minecraft.Client/Common/UI/UIControl_CheckBox.h | 2 +- .../Common/UI/UIControl_EnchantmentBook.cpp | 4 +- .../Common/UI/UIControl_EnchantmentButton.cpp | 12 + .../Common/UI/UIControl_EnchantmentButton.h | 2 +- Minecraft.Client/Common/UI/UIControl_Label.cpp | 24 +- Minecraft.Client/Common/UI/UIControl_Label.h | 8 +- .../Common/UI/UIControl_MinecraftHorse.cpp | 103 + .../Common/UI/UIControl_MinecraftHorse.h | 15 + .../Common/UI/UIControl_MinecraftPlayer.cpp | 3 +- .../Common/UI/UIControl_PlayerSkinPreview.cpp | 7 +- Minecraft.Client/Common/UI/UIControl_Progress.cpp | 2 +- Minecraft.Client/Common/UI/UIControl_Progress.h | 2 +- Minecraft.Client/Common/UI/UIControl_Slider.cpp | 3 +- Minecraft.Client/Common/UI/UIControl_Slider.h | 2 +- Minecraft.Client/Common/UI/UIControl_SlotList.cpp | 7 + Minecraft.Client/Common/UI/UIControl_SlotList.h | 2 + .../Common/UI/UIControl_SpaceIndicatorBar.cpp | 2 +- .../Common/UI/UIControl_SpaceIndicatorBar.h | 2 +- Minecraft.Client/Common/UI/UIControl_TextInput.cpp | 2 +- Minecraft.Client/Common/UI/UIControl_TextInput.h | 2 +- Minecraft.Client/Common/UI/UIController.cpp | 268 +- Minecraft.Client/Common/UI/UIController.h | 46 +- Minecraft.Client/Common/UI/UIEnums.h | 28 +- Minecraft.Client/Common/UI/UIGroup.cpp | 14 +- Minecraft.Client/Common/UI/UIGroup.h | 2 + Minecraft.Client/Common/UI/UILayer.cpp | 43 +- Minecraft.Client/Common/UI/UILayer.h | 2 + Minecraft.Client/Common/UI/UIScene.cpp | 26 +- Minecraft.Client/Common/UI/UIScene.h | 7 + .../Common/UI/UIScene_AbstractContainerMenu.cpp | 33 +- .../Common/UI/UIScene_AbstractContainerMenu.h | 7 +- Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp | 22 +- Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp | 519 ++ Minecraft.Client/Common/UI/UIScene_BeaconMenu.h | 71 + .../Common/UI/UIScene_BrewingStandMenu.cpp | 4 +- .../Common/UI/UIScene_ConnectingProgress.cpp | 2 +- .../Common/UI/UIScene_ContainerMenu.cpp | 2 +- .../Common/UI/UIScene_ControlsMenu.cpp | 2 +- .../Common/UI/UIScene_CraftingMenu.cpp | 20 +- Minecraft.Client/Common/UI/UIScene_CraftingMenu.h | 6 + .../Common/UI/UIScene_CreateWorldMenu.cpp | 251 +- .../Common/UI/UIScene_CreateWorldMenu.h | 18 +- .../Common/UI/UIScene_CreativeMenu.cpp | 26 +- Minecraft.Client/Common/UI/UIScene_CreativeMenu.h | 1 - Minecraft.Client/Common/UI/UIScene_Credits.cpp | 43 +- Minecraft.Client/Common/UI/UIScene_Credits.h | 10 +- Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp | 35 +- Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h | 2 +- .../Common/UI/UIScene_DLCOffersMenu.cpp | 24 +- Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp | 12 +- .../Common/UI/UIScene_DebugOptions.cpp | 6 +- .../Common/UI/UIScene_DebugOverlay.cpp | 4 +- .../Common/UI/UIScene_DispenserMenu.cpp | 4 +- .../Common/UI/UIScene_EnchantingMenu.cpp | 4 +- Minecraft.Client/Common/UI/UIScene_EndPoem.cpp | 11 +- .../Common/UI/UIScene_FireworksMenu.cpp | 233 + Minecraft.Client/Common/UI/UIScene_FireworksMenu.h | 44 + .../Common/UI/UIScene_FullscreenProgress.cpp | 6 +- Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp | 8 +- Minecraft.Client/Common/UI/UIScene_HUD.cpp | 440 +- Minecraft.Client/Common/UI/UIScene_HUD.h | 55 +- .../Common/UI/UIScene_HelpAndOptionsMenu.cpp | 17 +- Minecraft.Client/Common/UI/UIScene_HopperMenu.cpp | 197 + Minecraft.Client/Common/UI/UIScene_HopperMenu.h | 40 + .../Common/UI/UIScene_HorseInventoryMenu.cpp | 338 + .../Common/UI/UIScene_HorseInventoryMenu.h | 54 + Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp | 59 +- Minecraft.Client/Common/UI/UIScene_HowToPlay.h | 20 + .../Common/UI/UIScene_HowToPlayMenu.cpp | 46 +- Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h | 5 + .../Common/UI/UIScene_InGameHostOptionsMenu.cpp | 61 +- .../Common/UI/UIScene_InGameHostOptionsMenu.h | 18 +- .../Common/UI/UIScene_InGameInfoMenu.cpp | 303 +- .../Common/UI/UIScene_InGameInfoMenu.h | 22 +- .../Common/UI/UIScene_InGamePlayerOptionsMenu.cpp | 88 +- .../Common/UI/UIScene_InGamePlayerOptionsMenu.h | 2 + .../Common/UI/UIScene_InGameSaveManagementMenu.cpp | 2 +- Minecraft.Client/Common/UI/UIScene_Intro.cpp | 14 +- Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp | 58 +- .../Common/UI/UIScene_LanguageSelector.cpp | 129 + .../Common/UI/UIScene_LanguageSelector.h | 165 + .../Common/UI/UIScene_LaunchMoreOptionsMenu.cpp | 265 +- .../Common/UI/UIScene_LaunchMoreOptionsMenu.h | 132 +- .../Common/UI/UIScene_LeaderboardsMenu.cpp | 50 +- .../Common/UI/UIScene_LeaderboardsMenu.h | 8 +- Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp | 473 +- Minecraft.Client/Common/UI/UIScene_LoadMenu.h | 12 +- .../Common/UI/UIScene_LoadOrJoinMenu.cpp | 358 +- .../Common/UI/UIScene_LoadOrJoinMenu.h | 10 + Minecraft.Client/Common/UI/UIScene_MainMenu.cpp | 250 +- Minecraft.Client/Common/UI/UIScene_MainMenu.h | 32 +- Minecraft.Client/Common/UI/UIScene_MessageBox.h | 3 +- .../Common/UI/UIScene_NewUpdateMessage.cpp | 121 + .../Common/UI/UIScene_NewUpdateMessage.h | 45 + Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp | 134 +- .../Common/UI/UIScene_QuadrantSignin.cpp | 137 +- .../Common/UI/UIScene_QuadrantSignin.h | 13 +- Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp | 22 +- .../Common/UI/UIScene_SettingsMenu.cpp | 23 +- .../Common/UI/UIScene_SettingsOptionsMenu.cpp | 223 +- .../Common/UI/UIScene_SettingsOptionsMenu.h | 15 + .../Common/UI/UIScene_SkinSelectMenu.cpp | 274 +- .../Common/UI/UIScene_SkinSelectMenu.h | 6 + Minecraft.Client/Common/UI/UIScene_Timer.cpp | 2 +- Minecraft.Client/Common/UI/UIScene_Timer.h | 2 +- Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp | 33 +- Minecraft.Client/Common/UI/UIScene_TradingMenu.h | 8 +- .../Common/UI/UIScene_TrialExitUpsell.cpp | 2 +- Minecraft.Client/Common/UI/UIString.cpp | 176 + Minecraft.Client/Common/UI/UIString.h | 103 + Minecraft.Client/Common/UI/UIStructs.h | 118 +- Minecraft.Client/Common/UI/UITTFFont.cpp | 13 +- Minecraft.Client/Common/UI/UITTFFont.h | 6 +- .../res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp | Bin 3590769 -> 4186611 bytes .../res/TitleUpdate/DLC/Candy/Data/x16Data.pck | Bin 869992 -> 922699 bytes .../TitleUpdate/DLC/Cartoon/Data/TexturePack.xzp | Bin 0 -> 3252842 bytes .../res/TitleUpdate/DLC/Cartoon/Data/x32Data.pck | Bin 0 -> 1340321 bytes .../res/TitleUpdate/DLC/City/Data/TexturePack.xzp | Bin 4060458 -> 4641946 bytes .../res/TitleUpdate/DLC/City/Data/x32Data.pck | Bin 2636993 -> 2808253 bytes .../TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp | Bin 4777159 -> 5512680 bytes .../res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck | Bin 2527182 -> 2691065 bytes .../res/TitleUpdate/DLC/Festive/Data/Festive.mcs | Bin 0 -> 9037178 bytes .../res/TitleUpdate/DLC/Festive/Data/GameRules.grf | Bin 0 -> 499 bytes .../TitleUpdate/DLC/Festive/Data/TexturePack.xzp | Bin 0 -> 5378108 bytes .../res/TitleUpdate/DLC/Festive/Data/x16Data.pck | Bin 0 -> 1121604 bytes .../res/TitleUpdate/DLC/Festive/TexturePack.pck | Bin 0 -> 237468 bytes .../TitleUpdate/DLC/Halloween/Data/TexturePack.xzp | Bin 3705530 -> 4039115 bytes .../res/TitleUpdate/DLC/Halloween/Data/x16Data.pck | Bin 786598 -> 944327 bytes .../res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp | Bin 4123875 -> 4504823 bytes .../res/TitleUpdate/DLC/Halo/Data/x16Data.pck | Bin 967988 -> 961022 bytes .../res/TitleUpdate/DLC/Halo/TexturePack.pck | Bin 217553 -> 222568 bytes .../DLC/MassEffect/Data/TexturePack.xzp | Bin 3022739 -> 3249263 bytes .../TitleUpdate/DLC/MassEffect/Data/masseffect.mcs | Bin 3485486 -> 3485102 bytes .../TitleUpdate/DLC/MassEffect/Data/x16Data.pck | Bin 733891 -> 775721 bytes .../res/TitleUpdate/DLC/MassEffect/TexturePack.pck | Bin 176514 -> 180503 bytes .../TitleUpdate/DLC/Natural/Data/TexturePack.xzp | Bin 4166364 -> 4582759 bytes .../res/TitleUpdate/DLC/Natural/Data/x32Data.pck | Bin 2894225 -> 3042432 bytes .../TitleUpdate/DLC/Plastic/Data/TexturePack.xzp | Bin 2607406 -> 2818128 bytes .../res/TitleUpdate/DLC/Plastic/Data/x16Data.pck | Bin 567845 -> 581566 bytes .../TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp | Bin 3413075 -> 3767760 bytes .../res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck | Bin 996979 -> 1143990 bytes .../res/TitleUpdate/DLC/Skyrim/TexturePack.pck | Bin 181667 -> 187182 bytes .../TitleUpdate/DLC/Steampunk/Data/TexturePack.xzp | Bin 0 -> 4897015 bytes .../res/TitleUpdate/DLC/Steampunk/Data/x32Data.pck | Bin 0 -> 3341040 bytes .../Common/res/TitleUpdate/GameRules/Tutorial.mcs | Bin 0 -> 9184230 bytes .../Common/res/TitleUpdate/GameRules/Tutorial.pck | Bin 90648 -> 2025 bytes .../Common/res/TitleUpdate/audio/1.6.4.xwb | Bin 0 -> 13988264 bytes .../Common/res/TitleUpdate/audio/Minecraft.xgs | Bin 488 -> 488 bytes .../Common/res/TitleUpdate/audio/additional.xsb | Bin 3047 -> 7361 bytes .../Common/res/TitleUpdate/res/colours.col | Bin 5258 -> 5546 bytes .../Common/res/TitleUpdate/res/colours.xml | 16 + .../Common/res/TitleUpdate/res/font/Default.png | Bin 4343 -> 4616 bytes .../res/TitleUpdate/res/font/Mojangles_11.png | Bin 7024 -> 7013 bytes .../res/TitleUpdate/res/font/Mojangles_7.png | Bin 5322 -> 5328 bytes .../Common/res/TitleUpdate/res/item/christmas.png | Bin 0 -> 2195 bytes .../res/TitleUpdate/res/item/christmas_double.png | Bin 0 -> 2911 bytes .../Common/res/TitleUpdate/res/item/lead_knot.png | Bin 0 -> 746 bytes .../Common/res/TitleUpdate/res/item/trapped.png | Bin 0 -> 1720 bytes .../res/TitleUpdate/res/item/trapped_double.png | Bin 0 -> 2219 bytes .../Common/res/TitleUpdate/res/items.png | Bin 121590 -> 39203 bytes .../res/TitleUpdate/res/misc/beacon_beam.png | Bin 0 -> 260 bytes .../Common/res/TitleUpdate/res/mob/bat.png | Bin 0 -> 2935 bytes .../res/mob/horse/armor/horse_armor_diamond.png | Bin 0 -> 5177 bytes .../res/mob/horse/armor/horse_armor_gold.png | Bin 0 -> 5140 bytes .../res/mob/horse/armor/horse_armor_iron.png | Bin 0 -> 5064 bytes .../res/TitleUpdate/res/mob/horse/donkey.png | Bin 0 -> 11755 bytes .../res/TitleUpdate/res/mob/horse/horse_black.png | Bin 0 -> 9191 bytes .../res/TitleUpdate/res/mob/horse/horse_brown.png | Bin 0 -> 9931 bytes .../TitleUpdate/res/mob/horse/horse_chestnut.png | Bin 0 -> 10512 bytes .../res/TitleUpdate/res/mob/horse/horse_creamy.png | Bin 0 -> 9674 bytes .../TitleUpdate/res/mob/horse/horse_darkbrown.png | Bin 0 -> 9271 bytes .../res/TitleUpdate/res/mob/horse/horse_gray.png | Bin 0 -> 11698 bytes .../res/mob/horse/horse_markings_blackdots.png | Bin 0 -> 5401 bytes .../res/mob/horse/horse_markings_white.png | Bin 0 -> 3668 bytes .../res/mob/horse/horse_markings_whitedots.png | Bin 0 -> 4000 bytes .../res/mob/horse/horse_markings_whitefield.png | Bin 0 -> 4727 bytes .../TitleUpdate/res/mob/horse/horse_skeleton.png | Bin 0 -> 11643 bytes .../res/TitleUpdate/res/mob/horse/horse_white.png | Bin 0 -> 9414 bytes .../res/TitleUpdate/res/mob/horse/horse_zombie.png | Bin 0 -> 13998 bytes .../Common/res/TitleUpdate/res/mob/horse/mule.png | Bin 0 -> 11294 bytes .../Common/res/TitleUpdate/res/mob/witch.png | Bin 0 -> 2228 bytes .../res/TitleUpdate/res/mob/wither/wither.png | Bin 0 -> 2702 bytes .../TitleUpdate/res/mob/wither/wither_armor.png | Bin 0 -> 3477 bytes .../res/mob/wither/wither_invulnerable.png | Bin 0 -> 3045 bytes .../Common/res/TitleUpdate/res/terrain.png | Bin 122236 -> 142406 bytes .../res/TitleUpdate/res/terrainMipMapLevel2.png | Bin 30830 -> 43876 bytes .../res/TitleUpdate/res/terrainMipMapLevel3.png | Bin 10551 -> 12618 bytes Minecraft.Client/CompassTexture.cpp | 4 +- Minecraft.Client/CowRenderer.cpp | 7 + Minecraft.Client/CowRenderer.h | 5 + Minecraft.Client/CreeperModel.cpp | 4 +- Minecraft.Client/CreeperModel.h | 2 +- Minecraft.Client/CreeperRenderer.cpp | 20 +- Minecraft.Client/CreeperRenderer.h | 14 +- Minecraft.Client/DLCTexturePack.cpp | 6 +- Minecraft.Client/DLCTexturePack.h | 6 +- Minecraft.Client/DefaultRenderer.h | 3 +- Minecraft.Client/DemoLevel.cpp | 4 - Minecraft.Client/DirtyChunkSorter.cpp | 2 +- Minecraft.Client/DirtyChunkSorter.h | 4 +- Minecraft.Client/DispenserBootstrap.cpp | 1 + Minecraft.Client/DispenserBootstrap.h | 29 + Minecraft.Client/DragonModel.cpp | 2 +- Minecraft.Client/DragonModel.h | 2 +- Minecraft.Client/EnchantTableRenderer.cpp | 5 +- Minecraft.Client/EnchantTableRenderer.h | 3 +- Minecraft.Client/EnderChestRenderer.cpp | 10 +- Minecraft.Client/EnderChestRenderer.h | 2 +- Minecraft.Client/EnderCrystalRenderer.cpp | 9 +- Minecraft.Client/EnderCrystalRenderer.h | 3 +- Minecraft.Client/EnderDragonRenderer.cpp | 38 +- Minecraft.Client/EnderDragonRenderer.h | 20 +- Minecraft.Client/EndermanModel.cpp | 5 +- Minecraft.Client/EndermanModel.h | 2 +- Minecraft.Client/EndermanRenderer.cpp | 29 +- Minecraft.Client/EndermanRenderer.h | 10 +- Minecraft.Client/EntityRenderDispatcher.cpp | 202 +- Minecraft.Client/EntityRenderDispatcher.h | 10 +- Minecraft.Client/EntityRenderer.cpp | 390 +- Minecraft.Client/EntityRenderer.h | 19 +- Minecraft.Client/EntityTileRenderer.cpp | 6 + Minecraft.Client/EntityTileRenderer.h | 1 + Minecraft.Client/EntityTracker.cpp | 65 +- Minecraft.Client/EntityTracker.h | 1 + Minecraft.Client/ExperienceOrbRenderer.cpp | 20 +- Minecraft.Client/ExperienceOrbRenderer.h | 9 +- Minecraft.Client/FallingTileRenderer.cpp | 77 +- Minecraft.Client/FallingTileRenderer.h | 2 +- Minecraft.Client/FireballRenderer.cpp | 10 +- Minecraft.Client/FireballRenderer.h | 3 +- Minecraft.Client/FireworksParticles.cpp | 491 ++ Minecraft.Client/FireworksParticles.h | 77 + Minecraft.Client/FishingHookRenderer.cpp | 21 +- Minecraft.Client/FishingHookRenderer.h | 4 + Minecraft.Client/FolderTexturePack.cpp | 2 +- Minecraft.Client/FolderTexturePack.h | 2 +- Minecraft.Client/Font.cpp | 9 +- Minecraft.Client/Font.h | 6 +- Minecraft.Client/FootstepParticle.cpp | 5 +- Minecraft.Client/FootstepParticle.h | 2 + Minecraft.Client/GameRenderer.cpp | 967 +-- Minecraft.Client/GameRenderer.h | 9 + Minecraft.Client/GhastModel.cpp | 4 +- Minecraft.Client/GhastModel.h | 2 +- Minecraft.Client/GhastRenderer.cpp | 17 +- Minecraft.Client/GhastRenderer.h | 9 +- Minecraft.Client/GiantMobRenderer.cpp | 9 +- Minecraft.Client/GiantMobRenderer.h | 4 +- Minecraft.Client/Gui.cpp | 231 +- Minecraft.Client/Gui.h | 38 +- Minecraft.Client/HorseRenderer.cpp | 102 + Minecraft.Client/HorseRenderer.h | 31 + Minecraft.Client/HugeExplosionParticle.cpp | 5 +- Minecraft.Client/HugeExplosionParticle.h | 1 + Minecraft.Client/HumanoidMobRenderer.cpp | 208 +- Minecraft.Client/HumanoidMobRenderer.h | 20 +- Minecraft.Client/HumanoidModel.cpp | 84 +- Minecraft.Client/HumanoidModel.h | 5 +- Minecraft.Client/Input.cpp | 4 +- Minecraft.Client/ItemFrameRenderer.cpp | 7 +- Minecraft.Client/ItemFrameRenderer.h | 2 +- Minecraft.Client/ItemInHandRenderer.cpp | 192 +- Minecraft.Client/ItemInHandRenderer.h | 16 +- Minecraft.Client/ItemRenderer.cpp | 95 +- Minecraft.Client/ItemRenderer.h | 2 + Minecraft.Client/ItemSpriteRenderer.cpp | 8 +- Minecraft.Client/ItemSpriteRenderer.h | 1 + Minecraft.Client/LavaSlimeModel.cpp | 4 +- Minecraft.Client/LavaSlimeModel.h | 2 +- Minecraft.Client/LavaSlimeRenderer.cpp | 20 +- Minecraft.Client/LavaSlimeRenderer.h | 7 +- Minecraft.Client/LeashKnotModel.cpp | 37 + Minecraft.Client/LeashKnotModel.h | 15 + Minecraft.Client/LeashKnotRenderer.cpp | 39 + Minecraft.Client/LeashKnotRenderer.h | 19 + Minecraft.Client/LevelRenderer.cpp | 262 +- Minecraft.Client/LevelRenderer.h | 17 +- Minecraft.Client/LivingEntityRenderer.cpp | 656 ++ Minecraft.Client/LivingEntityRenderer.h | 47 + Minecraft.Client/LocalPlayer.cpp | 451 +- Minecraft.Client/LocalPlayer.h | 82 +- Minecraft.Client/MinecartRenderer.cpp | 169 +- Minecraft.Client/MinecartRenderer.h | 12 +- Minecraft.Client/MinecartSpawnerRenderer.cpp | 15 + Minecraft.Client/MinecartSpawnerRenderer.h | 10 + Minecraft.Client/Minecraft.Client.vcxproj | 8844 +++++++++++++++++--- Minecraft.Client/Minecraft.Client.vcxproj.filters | 377 +- Minecraft.Client/Minecraft.cpp | 904 +- Minecraft.Client/Minecraft.h | 17 +- Minecraft.Client/MinecraftServer.cpp | 1008 ++- Minecraft.Client/MinecraftServer.h | 40 +- Minecraft.Client/MobRenderer.cpp | 568 +- Minecraft.Client/MobRenderer.h | 44 +- Minecraft.Client/MobSpawnerRenderer.cpp | 8 +- Minecraft.Client/MobSpawnerRenderer.h | 3 + Minecraft.Client/Model.h | 7 +- Minecraft.Client/ModelHorse.cpp | 635 ++ Minecraft.Client/ModelHorse.h | 66 + Minecraft.Client/ModelPart.cpp | 5 + Minecraft.Client/ModelPart.h | 1 + Minecraft.Client/MultiPlayerChunkCache.cpp | 20 +- Minecraft.Client/MultiPlayerChunkCache.h | 21 +- Minecraft.Client/MultiPlayerGameMode.cpp | 121 +- Minecraft.Client/MultiPlayerGameMode.h | 4 +- Minecraft.Client/MultiPlayerLevel.cpp | 388 +- Minecraft.Client/MultiPlayerLevel.h | 49 +- Minecraft.Client/MultiPlayerLocalPlayer.cpp | 147 +- Minecraft.Client/MultiPlayerLocalPlayer.h | 24 +- Minecraft.Client/MushroomCowRenderer.cpp | 24 +- Minecraft.Client/MushroomCowRenderer.h | 7 +- Minecraft.Client/OcelotModel.cpp | 248 + Minecraft.Client/OcelotModel.h | 43 + Minecraft.Client/OcelotRenderer.cpp | 43 + Minecraft.Client/OcelotRenderer.h | 19 + Minecraft.Client/PSVita/4JLibs/inc/4J_Profile.h | 72 +- Minecraft.Client/PSVita/4JLibs/inc/4J_Render.h | 10 +- Minecraft.Client/PSVita/4JLibs/inc/4J_Storage.h | 2 +- Minecraft.Client/PSVita/4JLibs/libs/4J_Input.a | Bin 399700 -> 397820 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Input_d.a | Bin 677400 -> 673732 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Input_r.a | Bin 140788 -> 140792 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Profile.a | Bin 1330094 -> 1609112 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_d.a | Bin 5996680 -> 6593336 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_r.a | Bin 427640 -> 602986 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Render.a | Bin 2733136 -> 1720522 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Render_d.a | Bin 4887672 -> 3217922 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Render_r.a | Bin 823522 -> 578550 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Storage.a | Bin 870476 -> 871108 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_d.a | Bin 2251332 -> 2251302 bytes Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_r.a | Bin 321036 -> 323480 bytes Minecraft.Client/PSVita/GameConfig/Minecraft.spa.h | 1 + .../Leaderboards/PSVitaLeaderboardManager.cpp | 1054 +-- .../PSVita/Leaderboards/PSVitaLeaderboardManager.h | 104 +- .../PSVita/Network/PSVita_NPToolkit.cpp | 23 +- .../Network/SQRNetworkManager_AdHoc_Vita.cpp | 218 +- .../PSVita/Network/SQRNetworkManager_AdHoc_Vita.h | 3 +- .../PSVita/Network/SQRNetworkManager_Vita.cpp | 66 +- .../PSVita/Network/SQRNetworkManager_Vita.h | 1 + .../PSVita/Network/SonyCommerce_Vita.cpp | 31 +- .../PSVita/Network/SonyCommerce_Vita.h | 3 + .../PSVita/Network/SonyRemoteStorage_Vita.cpp | 44 +- .../PSVita/Network/SonyRemoteStorage_Vita.h | 1 - .../PSVita/PSVitaExtras/PsVitaStubs.cpp | 34 +- Minecraft.Client/PSVita/PSVita_App.cpp | 81 +- Minecraft.Client/PSVita/PSVita_App.h | 3 +- Minecraft.Client/PSVita/PSVita_Minecraft.cpp | 23 +- Minecraft.Client/PSVita/Sentient/TelemetryEnum.h | 9 + Minecraft.Client/PSVita/Sound/Minecraft.msscmp | Bin 12276954 -> 14439642 bytes Minecraft.Client/PSVita/Tutorial/Tutorial.mcs | Bin 0 -> 9184230 bytes Minecraft.Client/PSVita/Tutorial/Tutorial.pck | Bin 0 -> 3119 bytes Minecraft.Client/PSVita/app/Region/SCEA/param.sfo | Bin 840 -> 840 bytes Minecraft.Client/PSVita/app/Region/SCEE/param.sfo | Bin 840 -> 840 bytes Minecraft.Client/PSVita/app/Region/SCEJ/param.sfo | Bin 840 -> 840 bytes Minecraft.Client/PSVitaMedia/Media/languages.loc | Bin 3530400 -> 3964204 bytes Minecraft.Client/PSVitaMedia/Media/media.txt | 1 - Minecraft.Client/PSVitaMedia/Media/skinVita.swf | Bin 1178409 -> 1127515 bytes Minecraft.Client/PSVitaMedia/Minecraft.Client.self | Bin 0 -> 9664821 bytes Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.mcs | Bin 0 -> 9184230 bytes Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.pck | Bin 0 -> 3119 bytes .../PSVitaMedia/loc/AdditionalStrings.xml | 12 +- Minecraft.Client/PSVitaMedia/loc/EULA.xml | 25 +- .../loc/da-DA/4J_stringsPlatformSpecific.xml | 62 +- .../PSVitaMedia/loc/da-DA/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/da-DA/stringsGeneric.xml | 8724 ++++++++++--------- .../loc/da-DA/stringsPlatformSpecific.xml | 334 +- .../loc/de-DE/4J_stringsPlatformSpecific.xml | 63 +- .../PSVitaMedia/loc/de-DE/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/de-DE/stringsGeneric.xml | 8323 ++++++++++-------- .../loc/de-DE/stringsPlatformSpecific.xml | 334 +- .../loc/el-EL/4J_stringsPlatformSpecific.xml | 66 +- .../PSVitaMedia/loc/el-EL/AdditionalStrings.xml | 14 +- .../PSVitaMedia/loc/el-EL/stringsGeneric.xml | 8695 ++++++++++--------- .../loc/el-EL/stringsPlatformSpecific.xml | 339 +- .../loc/es-ES/4J_stringsPlatformSpecific.xml | 62 +- .../PSVitaMedia/loc/es-ES/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/es-ES/stringsGeneric.xml | 8328 ++++++++++-------- .../loc/es-ES/stringsPlatformSpecific.xml | 337 +- .../loc/fi-FI/4J_stringsPlatformSpecific.xml | 62 +- .../PSVitaMedia/loc/fi-FI/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/fi-FI/stringsGeneric.xml | 8433 ++++++++++--------- .../loc/fi-FI/stringsPlatformSpecific.xml | 337 +- .../loc/fr-FR/4J_stringsPlatformSpecific.xml | 62 +- .../PSVitaMedia/loc/fr-FR/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/fr-FR/stringsGeneric.xml | 8236 ++++++++++-------- .../loc/fr-FR/stringsPlatformSpecific.xml | 335 +- .../loc/it-IT/4J_stringsPlatformSpecific.xml | 62 +- .../PSVitaMedia/loc/it-IT/AdditionalStrings.xml | 14 +- .../PSVitaMedia/loc/it-IT/stringsGeneric.xml | 8378 ++++++++++-------- .../loc/it-IT/stringsPlatformSpecific.xml | 339 +- .../loc/ja-JP/4J_stringsPlatformSpecific.xml | 64 +- .../PSVitaMedia/loc/ja-JP/AdditionalStrings.xml | 16 +- Minecraft.Client/PSVitaMedia/loc/ja-JP/EULA.xml | 14 +- .../PSVitaMedia/loc/ja-JP/stringsGeneric.xml | 8258 ++++++++++-------- .../loc/ja-JP/stringsPlatformSpecific.xml | 338 +- .../loc/ko-KR/4J_stringsPlatformSpecific.xml | 62 +- .../PSVitaMedia/loc/ko-KR/AdditionalStrings.xml | 16 +- Minecraft.Client/PSVitaMedia/loc/ko-KR/EULA.xml | 14 +- .../PSVitaMedia/loc/ko-KR/stringsGeneric.xml | 8422 ++++++++++--------- .../loc/ko-KR/stringsPlatformSpecific.xml | 341 +- .../loc/la-LAS/4J_stringsPlatformSpecific.xml | 65 +- .../PSVitaMedia/loc/la-LAS/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/la-LAS/stringsGeneric.xml | 8812 ++++++++++--------- .../loc/la-LAS/stringsPlatformSpecific.xml | 337 +- .../loc/nl-NL/4J_stringsPlatformSpecific.xml | 62 +- .../PSVitaMedia/loc/nl-NL/AdditionalStrings.xml | 14 +- .../PSVitaMedia/loc/nl-NL/stringsGeneric.xml | 8761 ++++++++++--------- .../loc/nl-NL/stringsPlatformSpecific.xml | 337 +- .../loc/no-NO/4J_stringsPlatformSpecific.xml | 62 +- .../PSVitaMedia/loc/no-NO/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/no-NO/stringsGeneric.xml | 8695 ++++++++++--------- .../loc/no-NO/stringsPlatformSpecific.xml | 343 +- .../loc/pl-PL/4J_stringsPlatformSpecific.xml | 63 +- .../PSVitaMedia/loc/pl-PL/AdditionalStrings.xml | 14 +- .../PSVitaMedia/loc/pl-PL/stringsGeneric.xml | 8586 ++++++++++--------- .../loc/pl-PL/stringsPlatformSpecific.xml | 338 +- .../loc/pt-BR/4J_stringsPlatformSpecific.xml | 65 +- .../PSVitaMedia/loc/pt-BR/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/pt-BR/stringsGeneric.xml | 8832 ++++++++++--------- .../loc/pt-BR/stringsPlatformSpecific.xml | 338 +- .../loc/pt-PT/4J_stringsPlatformSpecific.xml | 64 +- .../PSVitaMedia/loc/pt-PT/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/pt-PT/stringsGeneric.xml | 8439 ++++++++++--------- .../loc/pt-PT/stringsPlatformSpecific.xml | 335 +- .../loc/ru-RU/4J_stringsPlatformSpecific.xml | 65 +- .../PSVitaMedia/loc/ru-RU/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/ru-RU/stringsGeneric.xml | 8831 ++++++++++--------- .../loc/ru-RU/stringsPlatformSpecific.xml | 339 +- .../PSVitaMedia/loc/stringsGeneric.xml | 2432 ++++-- .../PSVitaMedia/loc/stringsLanguages.xml | 40 + .../PSVitaMedia/loc/stringsPlatformSpecific.xml | 8 +- .../loc/sv-SV/4J_stringsPlatformSpecific.xml | 67 +- .../PSVitaMedia/loc/sv-SV/AdditionalStrings.xml | 12 +- .../PSVitaMedia/loc/sv-SV/stringsGeneric.xml | 8791 ++++++++++--------- .../loc/sv-SV/stringsPlatformSpecific.xml | 335 +- .../loc/tr-TR/4J_stringsPlatformSpecific.xml | 58 +- .../PSVitaMedia/loc/tr-TR/AdditionalStrings.xml | 12 +- Minecraft.Client/PSVitaMedia/loc/tr-TR/EULA.xml | 2 +- .../PSVitaMedia/loc/tr-TR/stringsGeneric.xml | 8721 ++++++++++--------- .../loc/tr-TR/stringsPlatformSpecific.xml | 332 +- .../loc/zh-CHT/4J_stringsPlatformSpecific.xml | 65 +- .../PSVitaMedia/loc/zh-CHT/AdditionalStrings.xml | 16 +- Minecraft.Client/PSVitaMedia/loc/zh-CHT/EULA.xml | 14 +- .../PSVitaMedia/loc/zh-CHT/stringsGeneric.xml | 8484 ++++++++++--------- .../loc/zh-CHT/stringsPlatformSpecific.xml | 340 +- Minecraft.Client/PSVitaMedia/strings.h | 4245 +++++----- Minecraft.Client/PaintingRenderer.cpp | 164 +- Minecraft.Client/PaintingRenderer.h | 2 + Minecraft.Client/Particle.cpp | 9 + Minecraft.Client/ParticleEngine.cpp | 189 +- Minecraft.Client/ParticleEngine.h | 22 +- Minecraft.Client/PendingConnection.cpp | 169 +- Minecraft.Client/PendingConnection.h | 37 +- Minecraft.Client/PigRenderer.cpp | 26 +- Minecraft.Client/PigRenderer.h | 8 +- Minecraft.Client/PistonPieceRenderer.cpp | 7 +- Minecraft.Client/PistonPieceRenderer.h | 2 + Minecraft.Client/PlayerChunkMap.cpp | 91 +- Minecraft.Client/PlayerChunkMap.h | 9 + Minecraft.Client/PlayerConnection.cpp | 373 +- Minecraft.Client/PlayerConnection.h | 1 + Minecraft.Client/PlayerList.cpp | 851 +- Minecraft.Client/PlayerList.h | 18 +- Minecraft.Client/PlayerRenderer.cpp | 193 +- Minecraft.Client/PlayerRenderer.h | 32 +- Minecraft.Client/PreStitchedTextureMap.cpp | 1188 +-- Minecraft.Client/PreStitchedTextureMap.h | 7 +- Minecraft.Client/QuadrupedModel.cpp | 4 +- Minecraft.Client/QuadrupedModel.h | 2 +- Minecraft.Client/RemotePlayer.cpp | 25 +- Minecraft.Client/RemotePlayer.h | 6 +- Minecraft.Client/ResourceLocation.h | 71 + Minecraft.Client/ServerChunkCache.cpp | 116 +- Minecraft.Client/ServerChunkCache.h | 5 + Minecraft.Client/ServerConnection.cpp | 13 +- Minecraft.Client/ServerConnection.h | 1 + Minecraft.Client/ServerLevel.cpp | 574 +- Minecraft.Client/ServerLevel.h | 41 +- Minecraft.Client/ServerLevelListener.cpp | 10 +- Minecraft.Client/ServerLevelListener.h | 3 +- Minecraft.Client/ServerPlayer.cpp | 791 +- Minecraft.Client/ServerPlayer.h | 99 +- Minecraft.Client/ServerPlayerGameMode.cpp | 181 +- Minecraft.Client/ServerScoreboard.cpp | 231 + Minecraft.Client/ServerScoreboard.h | 44 + Minecraft.Client/SheepFurModel.cpp | 6 +- Minecraft.Client/SheepFurModel.h | 6 +- Minecraft.Client/SheepModel.cpp | 6 +- Minecraft.Client/SheepModel.h | 4 +- Minecraft.Client/SheepRenderer.cpp | 32 +- Minecraft.Client/SheepRenderer.h | 7 +- Minecraft.Client/SignRenderer.cpp | 3 +- Minecraft.Client/SignRenderer.h | 1 + Minecraft.Client/SilverfishModel.cpp | 6 +- Minecraft.Client/SilverfishModel.h | 2 +- Minecraft.Client/SilverfishRenderer.cpp | 11 +- Minecraft.Client/SilverfishRenderer.h | 9 +- Minecraft.Client/SimpleIcon.cpp | 2 +- Minecraft.Client/SimpleIcon.h | 2 +- Minecraft.Client/SkeletonHeadModel.cpp | 6 +- Minecraft.Client/SkeletonHeadModel.h | 2 +- Minecraft.Client/SkeletonModel.cpp | 46 +- Minecraft.Client/SkeletonModel.h | 3 +- Minecraft.Client/SkeletonRenderer.cpp | 35 + Minecraft.Client/SkeletonRenderer.h | 17 + Minecraft.Client/SkiModel.cpp | 65 + Minecraft.Client/SkiModel.h | 19 + Minecraft.Client/SkullTileRenderer.cpp | 22 +- Minecraft.Client/SkullTileRenderer.h | 5 + Minecraft.Client/SlimeModel.cpp | 2 +- Minecraft.Client/SlimeRenderer.cpp | 17 +- Minecraft.Client/SlimeRenderer.h | 8 +- Minecraft.Client/SnowManModel.cpp | 6 +- Minecraft.Client/SnowManModel.h | 2 +- Minecraft.Client/SnowManRenderer.cpp | 11 +- Minecraft.Client/SnowManRenderer.h | 5 +- Minecraft.Client/SpiderModel.cpp | 4 +- Minecraft.Client/SpiderModel.h | 2 +- Minecraft.Client/SpiderRenderer.cpp | 42 +- Minecraft.Client/SpiderRenderer.h | 11 +- Minecraft.Client/SquidModel.cpp | 4 +- Minecraft.Client/SquidModel.h | 2 +- Minecraft.Client/SquidRenderer.cpp | 11 +- Minecraft.Client/SquidRenderer.h | 10 +- Minecraft.Client/StatsCounter.cpp | 108 +- Minecraft.Client/StitchedTexture.cpp | 5 +- Minecraft.Client/StitchedTexture.h | 5 +- Minecraft.Client/StringTable.cpp | 25 +- Minecraft.Client/StringTable.h | 2 + Minecraft.Client/Tesselator.cpp | 2 +- Minecraft.Client/Texture.cpp | 1 + Minecraft.Client/TextureAtlas.cpp | 6 + Minecraft.Client/TextureAtlas.h | 10 + Minecraft.Client/TexturePack.cpp | 37 +- Minecraft.Client/TexturePack.h | 2 +- Minecraft.Client/Textures.cpp | 122 +- Minecraft.Client/Textures.h | 46 +- Minecraft.Client/TheEndPortalRenderer.cpp | 27 +- Minecraft.Client/TheEndPortalRenderer.h | 6 + Minecraft.Client/TileEntityRenderDispatcher.cpp | 88 +- Minecraft.Client/TileEntityRenderDispatcher.h | 4 +- Minecraft.Client/TileEntityRenderer.cpp | 8 +- Minecraft.Client/TileEntityRenderer.h | 8 +- Minecraft.Client/TileRenderer.cpp | 3540 +++++--- Minecraft.Client/TileRenderer.h | 25 +- Minecraft.Client/TitleScreen.cpp | 2 +- Minecraft.Client/TntMinecartRenderer.cpp | 45 + Minecraft.Client/TntMinecartRenderer.h | 10 + Minecraft.Client/TntRenderer.cpp | 18 +- Minecraft.Client/TntRenderer.h | 3 +- Minecraft.Client/TrackedEntity.cpp | 774 +- Minecraft.Client/TrackedEntity.h | 8 +- Minecraft.Client/User.cpp | 60 +- Minecraft.Client/ViewportCuller.cpp | 2 +- Minecraft.Client/ViewportCuller.h | 2 +- Minecraft.Client/VillagerGolemModel.cpp | 6 +- Minecraft.Client/VillagerGolemModel.h | 4 +- Minecraft.Client/VillagerGolemRenderer.cpp | 19 +- Minecraft.Client/VillagerGolemRenderer.h | 13 +- Minecraft.Client/VillagerModel.cpp | 40 +- Minecraft.Client/VillagerModel.h | 8 +- Minecraft.Client/VillagerRenderer.cpp | 32 +- Minecraft.Client/VillagerRenderer.h | 23 +- Minecraft.Client/VillagerZombieModel.cpp | 4 +- Minecraft.Client/VillagerZombieModel.h | 2 +- .../Windows64/Sentient/TelemetryEnum.h | 14 +- .../Windows64Media/Media/languages.loc | Bin 1469999 -> 1345627 bytes .../Windows64Media/Sound/Minecraft.msscmp | Bin 0 -> 12276954 bytes .../Windows64Media/loc/4J_stringsGeneric.xml | 8 +- .../loc/4J_stringsPlatformSpecific.xml | 4 + .../Windows64Media/loc/AdditionalStrings.xml | 123 + Minecraft.Client/Windows64Media/loc/EULA.xml | 99 + Minecraft.Client/Windows64Media/loc/extra.xml | 14 + .../Windows64Media/loc/stringsDynafont.xml | 7 + .../Windows64Media/loc/stringsGeneric.xml | 2314 +++-- .../Windows64Media/loc/stringsLanguages.xml | 40 + .../Windows64Media/loc/stringsLeaderboards.xml | 91 +- .../Windows64Media/loc/stringsRichPresence.xml | 66 + Minecraft.Client/Windows64Media/strings.h | 4214 +++++----- Minecraft.Client/WitchModel.cpp | 73 + Minecraft.Client/WitchModel.h | 17 + Minecraft.Client/WitchRenderer.cpp | 118 + Minecraft.Client/WitchRenderer.h | 21 + Minecraft.Client/WitherBossModel.cpp | 80 + Minecraft.Client/WitherBossModel.h | 18 + Minecraft.Client/WitherBossRenderer.cpp | 110 + Minecraft.Client/WitherBossRenderer.h | 24 + Minecraft.Client/WitherSkullRenderer.cpp | 52 + Minecraft.Client/WitherSkullRenderer.h | 21 + Minecraft.Client/WolfModel.cpp | 8 +- Minecraft.Client/WolfModel.h | 4 +- Minecraft.Client/WolfRenderer.cpp | 27 +- Minecraft.Client/WolfRenderer.h | 14 +- .../Xbox/Network/NetworkPlayerXbox.cpp | 23 +- Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h | 6 +- Minecraft.Client/ZombieModel.cpp | 4 +- Minecraft.Client/ZombieModel.h | 2 +- Minecraft.Client/ZombieRenderer.cpp | 27 +- Minecraft.Client/ZombieRenderer.h | 18 +- Minecraft.Client/compat_shims.cpp | 5 + Minecraft.Client/iob_shim.asm | 12 + Minecraft.Client/sce_sys/keystone_vita | Bin 0 -> 96 bytes Minecraft.Client/stdafx.h | 2 +- Minecraft.World/AABB.cpp | 310 +- Minecraft.World/AABB.h | 2 +- Minecraft.World/Abilities.cpp | 4 +- Minecraft.World/AbsoptionMobEffect.cpp | 20 + Minecraft.World/AbsoptionMobEffect.h | 14 + Minecraft.World/AbstractContainerMenu.cpp | 344 +- Minecraft.World/AbstractContainerMenu.h | 56 +- .../AbstractProjectileDispenseBehavior.cpp | 48 + .../AbstractProjectileDispenseBehavior.h | 17 + Minecraft.World/AddEntityPacket.h | 33 +- Minecraft.World/AddGlobalEntityPacket.cpp | 6 +- Minecraft.World/AddMobPacket.cpp | 2 +- Minecraft.World/AddMobPacket.h | 4 +- Minecraft.World/AddPlayerPacket.cpp | 2 +- Minecraft.World/AgableMob.cpp | 50 +- Minecraft.World/AgableMob.h | 7 +- Minecraft.World/AmbientCreature.cpp | 17 + Minecraft.World/AmbientCreature.h | 16 + Minecraft.World/Animal.cpp | 85 +- Minecraft.World/Animal.h | 6 +- Minecraft.World/AnimalChest.cpp | 11 + Minecraft.World/AnimalChest.h | 10 + Minecraft.World/AnvilMenu.cpp | 426 + Minecraft.World/AnvilMenu.h | 55 + Minecraft.World/AnvilTile.cpp | 10 +- Minecraft.World/AnvilTile.h | 2 +- Minecraft.World/ArmorDyeRecipe.cpp | 8 +- Minecraft.World/ArmorItem.cpp | 43 +- Minecraft.World/ArmorItem.h | 35 +- Minecraft.World/ArmorRecipes.cpp | 16 +- Minecraft.World/ArmorSlot.cpp | 4 + Minecraft.World/ArrayWithLength.h | 1 + Minecraft.World/Arrow.cpp | 110 +- Minecraft.World/Arrow.h | 44 +- Minecraft.World/AttackDamageMobEffect.cpp | 19 + Minecraft.World/AttackDamageMobEffect.h | 13 + Minecraft.World/Attribute.cpp | 18 + Minecraft.World/Attribute.h | 71 + Minecraft.World/AttributeInstance.h | 22 + Minecraft.World/AttributeModifier.cpp | 129 + Minecraft.World/AttributeModifier.h | 69 + Minecraft.World/AvoidPlayerGoal.cpp | 29 +- Minecraft.World/AvoidPlayerGoal.h | 18 +- Minecraft.World/BaseAttribute.cpp | 31 + Minecraft.World/BaseAttribute.h | 20 + Minecraft.World/BaseAttributeMap.cpp | 82 + Minecraft.World/BaseAttributeMap.h | 29 + Minecraft.World/BaseEntityTile.cpp | 33 + Minecraft.World/BaseEntityTile.h | 15 + Minecraft.World/BaseMobSpawner.cpp | 401 + Minecraft.World/BaseMobSpawner.h | 70 + Minecraft.World/BasePressurePlateTile.cpp | 189 + Minecraft.World/BasePressurePlateTile.h | 55 + Minecraft.World/BaseRailTile.cpp | 511 ++ Minecraft.World/BaseRailTile.h | 89 + Minecraft.World/BasicTypeContainers.cpp | 2 + Minecraft.World/BasicTypeContainers.h | 1 + Minecraft.World/Bat.cpp | 258 + Minecraft.World/Bat.h | 58 + Minecraft.World/BeachBiome.cpp | 4 +- Minecraft.World/BeaconMenu.cpp | 140 + Minecraft.World/BeaconMenu.h | 44 + Minecraft.World/BeaconTile.cpp | 64 + Minecraft.World/BeaconTile.h | 19 + Minecraft.World/BeaconTileEntity.cpp | 372 + Minecraft.World/BeaconTileEntity.h | 75 + Minecraft.World/BedItem.cpp | 8 +- Minecraft.World/BedTile.cpp | 238 +- Minecraft.World/BedTile.h | 33 +- Minecraft.World/Behavior.h | 5 + Minecraft.World/BehaviorRegistry.cpp | 30 + Minecraft.World/BehaviorRegistry.h | 17 + Minecraft.World/Biome.cpp | 95 +- Minecraft.World/Biome.h | 77 +- Minecraft.World/BiomeDecorator.cpp | 30 +- Minecraft.World/BiomeSource.cpp | 67 +- Minecraft.World/BirchFeature.cpp | 79 +- Minecraft.World/Blaze.cpp | 18 +- Minecraft.World/Blaze.h | 2 +- Minecraft.World/BlockRegionUpdatePacket.cpp | 16 +- Minecraft.World/BlockSource.h | 36 + Minecraft.World/BlockSourceImpl.cpp | 68 + Minecraft.World/BlockSourceImpl.h | 29 + Minecraft.World/Boat.cpp | 62 +- Minecraft.World/Boat.h | 6 +- Minecraft.World/BoatItem.cpp | 32 +- Minecraft.World/BoatItem.h | 2 +- Minecraft.World/BodyControl.cpp | 2 +- Minecraft.World/BodyControl.h | 4 +- Minecraft.World/BonusChestFeature.cpp | 48 +- Minecraft.World/BossMob.h | 21 +- Minecraft.World/BottleItem.cpp | 6 +- Minecraft.World/BottleItem.h | 2 +- Minecraft.World/BoundingBox.cpp | 129 +- Minecraft.World/BoundingBox.h | 4 + Minecraft.World/BowItem.cpp | 4 +- Minecraft.World/BreakDoorGoal.cpp | 3 +- Minecraft.World/BreedGoal.cpp | 21 +- Minecraft.World/BreedGoal.h | 4 +- Minecraft.World/BrewingStandMenu.cpp | 22 +- Minecraft.World/BrewingStandTile.cpp | 109 +- Minecraft.World/BrewingStandTile.h | 33 +- Minecraft.World/BrewingStandTileEntity.cpp | 373 +- Minecraft.World/BrewingStandTileEntity.h | 51 +- Minecraft.World/BucketItem.cpp | 89 +- Minecraft.World/BucketItem.h | 15 +- Minecraft.World/Bush.cpp | 18 +- Minecraft.World/ButtonTile.cpp | 216 +- Minecraft.World/ButtonTile.h | 36 +- Minecraft.World/ByteArrayTag.h | 10 +- Minecraft.World/ByteTag.h | 2 +- Minecraft.World/C4JThread.h | 9 + Minecraft.World/CactusFeature.cpp | 28 +- Minecraft.World/CactusTile.cpp | 49 +- Minecraft.World/CakeTile.cpp | 77 +- Minecraft.World/Calendar.cpp | 19 + Minecraft.World/Calendar.h | 10 + Minecraft.World/CanyonFeature.cpp | 168 +- Minecraft.World/CarrotOnAStickItem.cpp | 2 +- Minecraft.World/CarrotTile.cpp | 2 +- Minecraft.World/CauldronTile.cpp | 111 +- Minecraft.World/CauldronTile.h | 9 +- Minecraft.World/CaveFeature.cpp | 104 +- Minecraft.World/CaveSpider.cpp | 25 +- Minecraft.World/CaveSpider.h | 20 +- Minecraft.World/ChatPacket.cpp | 28 +- Minecraft.World/ChatPacket.h | 33 +- Minecraft.World/ChestTile.cpp | 312 +- Minecraft.World/ChestTile.h | 40 +- Minecraft.World/ChestTileEntity.cpp | 279 +- Minecraft.World/ChestTileEntity.h | 48 +- Minecraft.World/Chicken.cpp | 37 +- Minecraft.World/Chicken.h | 7 +- Minecraft.World/ChunkSource.h | 51 +- Minecraft.World/Class.h | 662 +- Minecraft.World/ClassDiagram.cd | 2 + Minecraft.World/ClayFeature.cpp | 34 +- Minecraft.World/ClientInformationPacket.h | 11 +- Minecraft.World/ClientSideMerchant.cpp | 4 +- Minecraft.World/ClientSideMerchant.h | 22 +- Minecraft.World/ClothDyeRecipes.cpp | 126 +- Minecraft.World/CoalItem.cpp | 19 +- Minecraft.World/CoalItem.h | 6 + Minecraft.World/CocoaTile.cpp | 10 +- Minecraft.World/CocoaTile.h | 2 +- Minecraft.World/ColoredTile.cpp | 36 + Minecraft.World/ColoredTile.h | 21 + Minecraft.World/CombatEntry.cpp | 71 + Minecraft.World/CombatEntry.h | 29 + Minecraft.World/CombatTracker.cpp | 252 + Minecraft.World/CombatTracker.h | 54 + Minecraft.World/Command.cpp | 5 + Minecraft.World/Command.h | 13 + Minecraft.World/CommandBlock.cpp | 96 + Minecraft.World/CommandBlock.h | 22 + Minecraft.World/CommandBlockEntity.cpp | 121 + Minecraft.World/CommandBlockEntity.h | 41 + Minecraft.World/CommandDispatcher.cpp | 4 +- Minecraft.World/CommandDispatcher.h | 2 +- Minecraft.World/CommandsEnum.h | 1 + Minecraft.World/CommonStats.cpp | 4 +- Minecraft.World/ComparatorTile.cpp | 253 + Minecraft.World/ComparatorTile.h | 60 + Minecraft.World/ComparatorTileEntity.cpp | 36 + Minecraft.World/ComparatorTileEntity.h | 22 + Minecraft.World/ComplexItemDataPacket.cpp | 4 +- Minecraft.World/CompoundContainer.cpp | 35 +- Minecraft.World/CompoundContainer.h | 30 +- Minecraft.World/CompoundTag.h | 226 +- Minecraft.World/CompressedTileStorage.cpp | 1 + Minecraft.World/Connection.cpp | 37 +- Minecraft.World/ConsoleSaveFileConverter.cpp | 13 +- Minecraft.World/ConsoleSaveFileOriginal.cpp | 9 + Minecraft.World/ConsoleSaveFileSplit.cpp | 1711 ---- Minecraft.World/ConsoleSaveFileSplit.h | 143 - Minecraft.World/Container.h | 24 +- Minecraft.World/ContainerClickPacket.cpp | 10 +- Minecraft.World/ContainerClickPacket.h | 4 +- Minecraft.World/ContainerMenu.cpp | 19 +- Minecraft.World/ContainerMenu.h | 5 +- Minecraft.World/ContainerOpenPacket.cpp | 54 +- Minecraft.World/ContainerOpenPacket.h | 20 +- Minecraft.World/ControlledByPlayerGoal.cpp | 10 +- Minecraft.World/ControlledByPlayerGoal.h | 5 + Minecraft.World/Cow.cpp | 44 +- Minecraft.World/Cow.h | 5 +- Minecraft.World/CraftingContainer.cpp | 19 +- Minecraft.World/CraftingContainer.h | 5 +- Minecraft.World/CraftingMenu.cpp | 13 +- Minecraft.World/CraftingMenu.h | 5 + Minecraft.World/Creeper.cpp | 119 +- Minecraft.World/Creeper.h | 24 +- Minecraft.World/CropTile.cpp | 29 +- Minecraft.World/CropTile.h | 20 +- Minecraft.World/CustomLevelSource.cpp | 45 +- Minecraft.World/CustomLevelSource.h | 3 + Minecraft.World/DamageEnchantment.cpp | 8 +- Minecraft.World/DamageEnchantment.h | 2 +- Minecraft.World/DamageSource.cpp | 84 +- Minecraft.World/DamageSource.h | 21 +- Minecraft.World/DataInputStream.cpp | 7 + Minecraft.World/DataInputStream.h | 1 + Minecraft.World/DataOutputStream.cpp | 8 + Minecraft.World/DataOutputStream.h | 1 + Minecraft.World/DaylightDetectorTile.cpp | 114 + Minecraft.World/DaylightDetectorTile.h | 27 + Minecraft.World/DaylightDetectorTileEntity.cpp | 29 + Minecraft.World/DaylightDetectorTileEntity.h | 16 + Minecraft.World/DeadBushFeature.cpp | 28 +- Minecraft.World/DefaultDispenseItemBehavior.cpp | 82 + Minecraft.World/DefaultDispenseItemBehavior.h | 40 + Minecraft.World/DefaultGameModeCommand.cpp | 19 +- Minecraft.World/DefendVillageTargetGoal.cpp | 20 +- Minecraft.World/DefendVillageTargetGoal.h | 2 +- Minecraft.World/DelayedRelease.cpp | 2 +- Minecraft.World/DelayedRelease.h | 2 +- Minecraft.World/DerivedLevelData.cpp | 20 +- Minecraft.World/DerivedLevelData.h | 9 +- Minecraft.World/DesertBiome.cpp | 4 +- Minecraft.World/DesertWellFeature.cpp | 34 +- Minecraft.World/DetectorRailTile.cpp | 117 +- Minecraft.World/DetectorRailTile.h | 14 +- Minecraft.World/DiggerItem.cpp | 26 +- Minecraft.World/DiggerItem.h | 10 +- Minecraft.World/Dimension.cpp | 145 +- Minecraft.World/Dimension.h | 45 +- Minecraft.World/DiodeTile.cpp | 285 +- Minecraft.World/DiodeTile.h | 90 +- Minecraft.World/Direction.cpp | 80 +- Minecraft.World/Direction.h | 31 +- Minecraft.World/DirectionalTile.cpp | 4 - Minecraft.World/DirectionalTile.h | 1 - Minecraft.World/DirectoryLevelStorage.cpp | 35 +- Minecraft.World/DirectoryLevelStorage.h | 2 +- Minecraft.World/DispenseItemBehavior.cpp | 10 + Minecraft.World/DispenseItemBehavior.h | 29 + Minecraft.World/DispenserTile.cpp | 448 +- Minecraft.World/DispenserTile.h | 41 +- Minecraft.World/DispenserTileEntity.cpp | 105 +- Minecraft.World/DispenserTileEntity.h | 23 +- Minecraft.World/DoorItem.cpp | 8 +- Minecraft.World/DoorTile.cpp | 60 +- Minecraft.World/DoorTile.h | 15 +- Minecraft.World/DoubleTag.h | 2 +- Minecraft.World/DragonFireball.cpp | 21 +- Minecraft.World/DragonFireball.h | 9 +- Minecraft.World/DropperTile.cpp | 74 + Minecraft.World/DropperTile.h | 23 + Minecraft.World/DropperTileEntity.cpp | 19 + Minecraft.World/DropperTileEntity.h | 15 + Minecraft.World/DummyCriteria.cpp | 24 + Minecraft.World/DummyCriteria.h | 16 + Minecraft.World/DungeonFeature.cpp | 248 +- Minecraft.World/DurangoStats.cpp | 22 +- Minecraft.World/DyePowderItem.cpp | 277 +- Minecraft.World/DyePowderItem.h | 4 +- Minecraft.World/EatTileGoal.cpp | 7 +- Minecraft.World/EffectCommand.cpp | 86 + Minecraft.World/EffectCommand.h | 18 + Minecraft.World/EggItem.cpp | 8 +- Minecraft.World/EggTile.cpp | 64 +- Minecraft.World/EggTile.h | 18 +- Minecraft.World/EmptyLevelChunk.cpp | 35 +- Minecraft.World/EmptyLevelChunk.h | 5 +- Minecraft.World/EmptyMapItem.cpp | 43 + Minecraft.World/EmptyMapItem.h | 11 + Minecraft.World/EnchantItemCommand.cpp | 2 +- Minecraft.World/EnchantedBookItem.cpp | 7 +- Minecraft.World/EnchantedBookItem.h | 2 +- Minecraft.World/Enchantment.cpp | 14 +- Minecraft.World/Enchantment.h | 4 +- Minecraft.World/EnchantmentContainer.cpp | 7 +- Minecraft.World/EnchantmentContainer.h | 1 + Minecraft.World/EnchantmentHelper.cpp | 53 +- Minecraft.World/EnchantmentHelper.h | 30 +- Minecraft.World/EnchantmentMenu.cpp | 16 +- Minecraft.World/EnchantmentTableEntity.cpp | 39 +- Minecraft.World/EnchantmentTableEntity.h | 17 +- Minecraft.World/EnchantmentTableTile.cpp | 56 +- Minecraft.World/EnchantmentTableTile.h | 24 +- Minecraft.World/EndPodiumFeature.cpp | 2 +- Minecraft.World/EndTag.h | 2 +- Minecraft.World/EnderChestTile.cpp | 6 +- Minecraft.World/EnderChestTile.h | 8 +- Minecraft.World/EnderChestTileEntity.cpp | 4 +- Minecraft.World/EnderChestTileEntity.h | 2 +- Minecraft.World/EnderCrystal.cpp | 10 +- Minecraft.World/EnderCrystal.h | 2 +- Minecraft.World/EnderDragon.cpp | 381 +- Minecraft.World/EnderDragon.h | 48 +- Minecraft.World/EnderEyeItem.cpp | 27 +- Minecraft.World/EnderEyeItem.h | 2 +- Minecraft.World/EnderMan.cpp | 140 +- Minecraft.World/EnderMan.h | 10 +- Minecraft.World/EnderpearlItem.cpp | 6 +- Minecraft.World/EnderpearlItem.h | 2 +- Minecraft.World/Enemy.cpp | 11 +- Minecraft.World/Enemy.h | 21 +- Minecraft.World/Entity.cpp | 671 +- Minecraft.World/Entity.h | 80 +- Minecraft.World/EntityActionAtPositionPacket.cpp | 2 +- Minecraft.World/EntityDamageSource.cpp | 37 +- Minecraft.World/EntityDamageSource.h | 8 +- Minecraft.World/EntityDiagram.cd | 805 ++ Minecraft.World/EntityHorse.cpp | 1841 ++++ Minecraft.World/EntityHorse.h | 342 + Minecraft.World/EntityIO.cpp | 165 +- Minecraft.World/EntitySelector.cpp | 42 + Minecraft.World/EntitySelector.h | 32 + Minecraft.World/EntityTile.h | 10 +- Minecraft.World/ExperienceCommand.cpp | 68 +- Minecraft.World/ExperienceCommand.h | 4 +- Minecraft.World/ExperienceItem.cpp | 4 +- Minecraft.World/ExperienceItem.h | 2 +- Minecraft.World/ExperienceOrb.cpp | 7 +- Minecraft.World/ExperienceOrb.h | 2 +- Minecraft.World/Explosion.cpp | 145 +- Minecraft.World/Explosion.h | 1 + Minecraft.World/ExtremeHillsBiome.cpp | 18 +- Minecraft.World/ExtremeHillsBiome.h | 2 + Minecraft.World/EyeOfEnderSignal.cpp | 12 +- Minecraft.World/Facing.cpp | 2 + Minecraft.World/Facing.h | 14 +- Minecraft.World/FacingEnum.cpp | 47 + Minecraft.World/FacingEnum.h | 31 + Minecraft.World/FallingTile.cpp | 57 +- Minecraft.World/FallingTile.h | 4 + Minecraft.World/FarmTile.cpp | 102 +- Minecraft.World/Feature.cpp | 11 +- Minecraft.World/Feature.h | 2 + Minecraft.World/FenceGateTile.cpp | 53 +- Minecraft.World/FenceGateTile.h | 22 +- Minecraft.World/FenceTile.cpp | 146 +- Minecraft.World/FenceTile.h | 8 +- Minecraft.World/File.cpp | 2 +- Minecraft.World/FileHeader.cpp | 1 + Minecraft.World/FileHeader.h | 6 + Minecraft.World/FireChargeItem.cpp | 10 +- Minecraft.World/FireTile.cpp | 55 +- Minecraft.World/FireTile.h | 42 +- Minecraft.World/Fireball.cpp | 77 +- Minecraft.World/Fireball.h | 16 +- Minecraft.World/FireworksChargeItem.cpp | 211 + Minecraft.World/FireworksChargeItem.h | 24 + Minecraft.World/FireworksItem.cpp | 81 + Minecraft.World/FireworksItem.h | 31 + Minecraft.World/FireworksMenu.cpp | 150 + Minecraft.World/FireworksMenu.h | 43 + Minecraft.World/FireworksRecipe.cpp | 418 + Minecraft.World/FireworksRecipe.h | 46 + Minecraft.World/FireworksRocketEntity.cpp | 181 + Minecraft.World/FireworksRocketEntity.h | 38 + Minecraft.World/FishingHook.cpp | 30 +- Minecraft.World/FishingRodItem.cpp | 10 +- Minecraft.World/FishingRodItem.h | 4 - Minecraft.World/FixedBiomeSource.cpp | 6 +- Minecraft.World/FlatGeneratorInfo.cpp | 250 + Minecraft.World/FlatGeneratorInfo.h | 41 + Minecraft.World/FlatLayerInfo.cpp | 78 + Minecraft.World/FlatLayerInfo.h | 26 + Minecraft.World/FlatLevelSource.cpp | 7 +- Minecraft.World/FlatLevelSource.h | 1 + Minecraft.World/FleeSunGoal.cpp | 6 +- Minecraft.World/FleeSunGoal.h | 4 +- Minecraft.World/FlintAndSteelItem.cpp | 8 +- Minecraft.World/FloatTag.h | 2 +- Minecraft.World/FlowerFeature.cpp | 23 +- Minecraft.World/FlowerPotTile.cpp | 12 +- Minecraft.World/FlyingMob.cpp | 6 + Minecraft.World/FlyingMob.h | 1 + Minecraft.World/FollowOwnerGoal.cpp | 15 +- Minecraft.World/FollowOwnerGoal.h | 6 +- Minecraft.World/FollowParentGoal.cpp | 6 +- Minecraft.World/FollowParentGoal.h | 4 +- Minecraft.World/FoodConstants.cpp | 1 + Minecraft.World/FoodConstants.h | 53 +- Minecraft.World/FoodData.cpp | 21 +- Minecraft.World/FoodItem.cpp | 2 +- Minecraft.World/FoodRecipies.cpp | 62 +- Minecraft.World/FurnaceMenu.cpp | 10 +- Minecraft.World/FurnaceMenu.h | 3 +- Minecraft.World/FurnaceRecipes.cpp | 6 +- Minecraft.World/FurnaceTile.cpp | 55 +- Minecraft.World/FurnaceTile.h | 26 +- Minecraft.World/FurnaceTileEntity.cpp | 164 +- Minecraft.World/FurnaceTileEntity.h | 40 +- Minecraft.World/GameDifficultyCommand.h | 75 + Minecraft.World/GameModeCommand.cpp | 29 +- Minecraft.World/GameModeCommand.h | 2 +- Minecraft.World/GameRuleCommand.h | 83 + Minecraft.World/GameRules.cpp | 193 + Minecraft.World/GameRules.h | 56 + Minecraft.World/Ghast.cpp | 210 +- Minecraft.World/Ghast.h | 17 +- Minecraft.World/Giant.cpp | 21 +- Minecraft.World/Giant.h | 7 +- Minecraft.World/GiveItemCommand.cpp | 11 +- Minecraft.World/GiveItemCommand.h | 1 + Minecraft.World/GlowstoneTile.cpp | 22 + Minecraft.World/GlowstoneTile.h | 13 + Minecraft.World/GoalSelector.cpp | 27 + Minecraft.World/GoalSelector.h | 1 + Minecraft.World/GoldenAppleItem.cpp | 4 +- Minecraft.World/GrassTile.cpp | 40 +- Minecraft.World/GravelTile.cpp | 5 +- Minecraft.World/GroundBushFeature.cpp | 4 +- Minecraft.World/HalfSlabTile.cpp | 79 +- Minecraft.World/HalfSlabTile.h | 8 +- Minecraft.World/HalfTransparentTile.h | 2 +- Minecraft.World/HangingEntity.cpp | 38 +- Minecraft.World/HangingEntity.h | 14 +- Minecraft.World/HangingEntityItem.cpp | 47 +- Minecraft.World/HangingEntityItem.h | 4 +- Minecraft.World/Hasher.cpp | 4 +- Minecraft.World/HatchetItem.cpp | 2 +- Minecraft.World/HayBlockTile.cpp | 23 + Minecraft.World/HayBlockTile.h | 18 + Minecraft.World/HealthBoostMobEffect.cpp | 16 + Minecraft.World/HealthBoostMobEffect.h | 14 + Minecraft.World/HealthCriteria.cpp | 27 + Minecraft.World/HealthCriteria.h | 12 + Minecraft.World/HeavyTile.cpp | 57 +- Minecraft.World/HeavyTile.h | 14 +- Minecraft.World/HellBiome.cpp | 11 +- Minecraft.World/HellFireFeature.cpp | 18 +- Minecraft.World/HellFlatLevelSource.cpp | 104 +- Minecraft.World/HellFlatLevelSource.h | 21 +- Minecraft.World/HellPortalFeature.cpp | 44 +- Minecraft.World/HellRandomLevelSource.cpp | 543 +- Minecraft.World/HellRandomLevelSource.h | 33 +- Minecraft.World/HellSpringFeature.cpp | 51 +- Minecraft.World/HellSpringFeature.h | 5 +- Minecraft.World/HitResult.cpp | 4 +- Minecraft.World/HoeItem.cpp | 8 +- Minecraft.World/Hopper.h | 14 + Minecraft.World/HopperMenu.cpp | 76 + Minecraft.World/HopperMenu.h | 24 + Minecraft.World/HopperTile.cpp | 211 + Minecraft.World/HopperTile.h | 56 + Minecraft.World/HopperTileEntity.cpp | 505 ++ Minecraft.World/HopperTileEntity.h | 80 + Minecraft.World/HorseInventoryMenu.cpp | 132 + Minecraft.World/HorseInventoryMenu.h | 41 + Minecraft.World/HouseFeature.cpp | 263 +- Minecraft.World/HtmlString.cpp | 57 + Minecraft.World/HtmlString.h | 16 + Minecraft.World/HugeMushroomFeature.cpp | 128 +- Minecraft.World/HugeMushroomTile.cpp | 58 +- Minecraft.World/HugeMushroomTile.h | 9 +- Minecraft.World/HurtByTargetGoal.cpp | 22 +- Minecraft.World/HurtByTargetGoal.h | 5 +- Minecraft.World/IceTile.cpp | 12 +- Minecraft.World/IndirectEntityDamageSource.cpp | 20 +- Minecraft.World/IndirectEntityDamageSource.h | 6 +- Minecraft.World/InputStream.cpp | 4 +- Minecraft.World/IntArrayTag.h | 10 +- Minecraft.World/IntTag.h | 2 +- Minecraft.World/Inventory.cpp | 86 +- Minecraft.World/Inventory.h | 44 +- Minecraft.World/InventoryMenu.cpp | 21 +- Minecraft.World/InventoryMenu.h | 3 +- Minecraft.World/Item.cpp | 448 +- Minecraft.World/Item.h | 117 +- Minecraft.World/ItemDispenseBehaviors.cpp | 457 + Minecraft.World/ItemDispenseBehaviors.h | 117 + Minecraft.World/ItemEntity.cpp | 19 +- Minecraft.World/ItemEntity.h | 4 +- Minecraft.World/ItemFrame.cpp | 56 +- Minecraft.World/ItemFrame.h | 11 +- Minecraft.World/ItemInstance.cpp | 504 +- Minecraft.World/ItemInstance.h | 52 +- Minecraft.World/JukeboxTile.cpp | 167 + Minecraft.World/JukeboxTile.h | 55 + Minecraft.World/JungleBiome.cpp | 2 +- Minecraft.World/KillCommand.cpp | 9 +- Minecraft.World/KillCommand.h | 1 + Minecraft.World/LadderTile.cpp | 58 +- Minecraft.World/LakeFeature.cpp | 179 +- Minecraft.World/LargeCaveFeature.cpp | 250 +- Minecraft.World/LargeFireball.cpp | 47 + Minecraft.World/LargeFireball.h | 24 + Minecraft.World/LargeHellCaveFeature.cpp | 247 +- Minecraft.World/LargeHellCaveFeature.h | 4 +- Minecraft.World/LavaSlime.cpp | 21 +- Minecraft.World/LavaSlime.h | 4 + Minecraft.World/Layer.cpp | 2 +- Minecraft.World/LeafTile.cpp | 259 +- Minecraft.World/LeapAtTargetGoal.cpp | 4 +- Minecraft.World/LeapAtTargetGoal.h | 2 +- Minecraft.World/LeashFenceKnotEntity.cpp | 157 + Minecraft.World/LeashFenceKnotEntity.h | 36 + Minecraft.World/LeashItem.cpp | 74 + Minecraft.World/LeashItem.h | 13 + Minecraft.World/Level.cpp | 1628 ++-- Minecraft.World/Level.h | 119 +- Minecraft.World/LevelChunk.cpp | 851 +- Minecraft.World/LevelChunk.h | 118 +- Minecraft.World/LevelData.cpp | 424 +- Minecraft.World/LevelData.h | 174 +- Minecraft.World/LevelEvent.h | 33 +- Minecraft.World/LevelEventPacket.cpp | 9 +- Minecraft.World/LevelEventPacket.h | 4 +- Minecraft.World/LevelListener.h | 4 +- Minecraft.World/LevelParticlesPacket.cpp | 110 + Minecraft.World/LevelParticlesPacket.h | 39 + Minecraft.World/LevelSettings.cpp | 16 +- Minecraft.World/LevelSettings.h | 7 +- Minecraft.World/LevelSource.h | 1 + Minecraft.World/LevelType.cpp | 6 +- Minecraft.World/LevelType.h | 2 + Minecraft.World/LeverTile.cpp | 241 +- Minecraft.World/LeverTile.h | 30 +- Minecraft.World/LightGemFeature.cpp | 44 +- Minecraft.World/LightningBolt.cpp | 69 +- Minecraft.World/LiquidTile.cpp | 357 +- Minecraft.World/LiquidTile.h | 10 +- Minecraft.World/LiquidTileDynamic.cpp | 343 +- Minecraft.World/LiquidTileDynamic.h | 11 +- Minecraft.World/LiquidTileStatic.cpp | 60 +- Minecraft.World/ListTag.h | 84 +- Minecraft.World/LivingEntity.cpp | 2005 +++++ Minecraft.World/LivingEntity.h | 323 + Minecraft.World/LocatableSource.h | 8 + Minecraft.World/Location.h | 11 + Minecraft.World/LockedChestTile.cpp | 2 +- Minecraft.World/LongTag.h | 2 +- Minecraft.World/LookAtPlayerGoal.cpp | 17 +- Minecraft.World/LookControl.cpp | 15 +- Minecraft.World/MakeLoveGoal.cpp | 8 +- Minecraft.World/MapCloningRecipe.h | 63 + Minecraft.World/MapExtendingRecipe.h | 46 + Minecraft.World/MapItem.cpp | 55 +- Minecraft.World/MapItem.h | 2 +- Minecraft.World/MapItemSavedData.cpp | 50 +- Minecraft.World/MapItemSavedData.h | 14 +- Minecraft.World/McRegionChunkStorage.cpp | 7 + Minecraft.World/MegaTreeFeature.cpp | 10 +- Minecraft.World/MeleeAttackGoal.cpp | 50 +- Minecraft.World/MeleeAttackGoal.h | 14 +- Minecraft.World/MelonTile.cpp | 7 +- Minecraft.World/MelonTile.h | 9 +- Minecraft.World/MenuBackup.cpp | 10 +- Minecraft.World/Merchant.h | 2 +- Minecraft.World/MerchantContainer.cpp | 17 +- Minecraft.World/MerchantContainer.h | 5 +- Minecraft.World/MerchantMenu.cpp | 2 +- Minecraft.World/MineShaftFeature.cpp | 28 +- Minecraft.World/MineShaftFeature.h | 13 + Minecraft.World/MineShaftPieces.cpp | 116 +- Minecraft.World/MineShaftPieces.h | 54 +- Minecraft.World/MineShaftStart.cpp | 7 +- Minecraft.World/MineShaftStart.h | 5 + Minecraft.World/Minecart.cpp | 1127 ++- Minecraft.World/Minecart.h | 94 +- Minecraft.World/MinecartChest.cpp | 51 + Minecraft.World/MinecartChest.h | 23 + Minecraft.World/MinecartContainer.cpp | 233 + Minecraft.World/MinecartContainer.h | 48 + Minecraft.World/MinecartFurnace.cpp | 179 + Minecraft.World/MinecartFurnace.h | 51 + Minecraft.World/MinecartHopper.cpp | 165 + Minecraft.World/MinecartHopper.h | 64 + Minecraft.World/MinecartItem.cpp | 69 +- Minecraft.World/MinecartItem.h | 14 + Minecraft.World/MinecartRideable.cpp | 39 + Minecraft.World/MinecartRideable.h | 17 + Minecraft.World/MinecartSpawner.cpp | 95 + Minecraft.World/MinecartSpawner.h | 45 + Minecraft.World/MinecartTNT.cpp | 168 + Minecraft.World/MinecartTNT.h | 43 + Minecraft.World/Minecraft.World.cpp | 68 +- Minecraft.World/Minecraft.World.vcxproj | 893 +- Minecraft.World/Minecraft.World.vcxproj.filters | 1311 ++- Minecraft.World/Mob.cpp | 1980 ++--- Minecraft.World/Mob.h | 323 +- Minecraft.World/MobCategory.cpp | 34 +- Minecraft.World/MobCategory.h | 11 +- Minecraft.World/MobEffect.cpp | 199 +- Minecraft.World/MobEffect.h | 103 +- Minecraft.World/MobEffectInstance.cpp | 80 +- Minecraft.World/MobEffectInstance.h | 18 +- Minecraft.World/MobGroupData.h | 8 + Minecraft.World/MobSpawner.cpp | 191 +- Minecraft.World/MobSpawner.h | 12 +- Minecraft.World/MobSpawnerTile.cpp | 2 +- Minecraft.World/MobSpawnerTile.h | 12 +- Minecraft.World/MobSpawnerTileEntity.cpp | 225 +- Minecraft.World/MobSpawnerTileEntity.h | 50 +- Minecraft.World/ModifiableAttributeInstance.cpp | 185 + Minecraft.World/ModifiableAttributeInstance.h | 40 + Minecraft.World/Monster.cpp | 137 +- Minecraft.World/Monster.h | 20 +- Minecraft.World/MonsterRoomFeature.cpp | 68 +- Minecraft.World/MonsterRoomFeature.h | 9 +- Minecraft.World/MoveControl.cpp | 16 +- Minecraft.World/MoveControl.h | 6 +- Minecraft.World/MoveIndoorsGoal.cpp | 4 +- Minecraft.World/MoveThroughVillageGoal.cpp | 6 +- Minecraft.World/MoveThroughVillageGoal.h | 4 +- Minecraft.World/MoveTowardsRestrictionGoal.cpp | 6 +- Minecraft.World/MoveTowardsRestrictionGoal.h | 4 +- Minecraft.World/MoveTowardsTargetGoal.cpp | 8 +- Minecraft.World/MoveTowardsTargetGoal.h | 7 +- Minecraft.World/Mth.cpp | 131 +- Minecraft.World/Mth.h | 42 +- Minecraft.World/MultiEntityMob.h | 10 + Minecraft.World/MultiEntityMobPart.cpp | 42 + Minecraft.World/MultiEntityMobPart.h | 27 + Minecraft.World/MultiTextureTileItem.cpp | 29 +- Minecraft.World/MultiTextureTileItem.h | 3 +- Minecraft.World/Mushroom.cpp | 104 +- Minecraft.World/Mushroom.h | 7 +- Minecraft.World/MushroomCow.cpp | 21 +- Minecraft.World/MushroomCow.h | 2 +- Minecraft.World/MusicTileEntity.cpp | 6 +- Minecraft.World/MycelTile.cpp | 28 +- Minecraft.World/NameTagItem.cpp | 23 + Minecraft.World/NameTagItem.h | 11 + Minecraft.World/NearestAttackableTargetGoal.cpp | 60 +- Minecraft.World/NearestAttackableTargetGoal.h | 26 +- Minecraft.World/NetherBridgeFeature.cpp | 47 +- Minecraft.World/NetherBridgeFeature.h | 14 +- Minecraft.World/NetherBridgePieces.cpp | 252 +- Minecraft.World/NetherBridgePieces.h | 466 +- Minecraft.World/NetherWartTile.cpp | 112 + Minecraft.World/NetherWartTile.h | 31 + Minecraft.World/NetherrackTile.cpp | 6 + Minecraft.World/NetherrackTile.h | 8 + Minecraft.World/NonTameRandomTargetGoal.cpp | 7 +- Minecraft.World/NonTameRandomTargetGoal.h | 2 +- Minecraft.World/NotGateTile.cpp | 216 +- Minecraft.World/NotGateTile.h | 45 +- Minecraft.World/NoteBlockTile.cpp | 86 + Minecraft.World/NoteBlockTile.h | 16 + Minecraft.World/Objective.cpp | 38 + Minecraft.World/Objective.h | 26 + Minecraft.World/ObjectiveCriteria.cpp | 12 + Minecraft.World/ObjectiveCriteria.h | 17 + Minecraft.World/Ocelot.cpp | 361 + Minecraft.World/Ocelot.h | 90 + Minecraft.World/OcelotAttackGoal.cpp | 61 + Minecraft.World/OcelotAttackGoal.h | 25 + Minecraft.World/OcelotSitOnTileGoal.cpp | 18 +- Minecraft.World/OcelotSitOnTileGoal.h | 8 +- Minecraft.World/OldChunkStorage.cpp | 52 +- Minecraft.World/OpenDoorGoal.cpp | 2 +- Minecraft.World/OreFeature.cpp | 104 +- Minecraft.World/OreRecipies.cpp | 34 +- Minecraft.World/OreRecipies.h | 4 +- Minecraft.World/OwnableEntity.h | 8 + Minecraft.World/OwnerHurtByTargetGoal.cpp | 17 +- Minecraft.World/OwnerHurtByTargetGoal.h | 3 +- Minecraft.World/OwnerHurtTargetGoal.cpp | 19 +- Minecraft.World/OwnerHurtTargetGoal.h | 3 +- Minecraft.World/Packet.cpp | 181 +- Minecraft.World/Packet.h | 28 +- Minecraft.World/PacketListener.cpp | 44 +- Minecraft.World/PacketListener.h | 23 +- Minecraft.World/Painting.cpp | 44 +- Minecraft.World/Painting.h | 9 +- Minecraft.World/PanicGoal.cpp | 8 +- Minecraft.World/PanicGoal.h | 4 +- Minecraft.World/ParticleTypes.h | 3 + Minecraft.World/PathFinder.cpp | 213 +- Minecraft.World/PathFinder.h | 30 +- Minecraft.World/PathNavigation.cpp | 37 +- Minecraft.World/PathNavigation.h | 17 +- Minecraft.World/PathfinderMob.cpp | 133 +- Minecraft.World/PathfinderMob.h | 30 +- Minecraft.World/PickaxeItem.cpp | 60 +- Minecraft.World/PickaxeItem.h | 4 +- Minecraft.World/Pig.cpp | 47 +- Minecraft.World/Pig.h | 10 +- Minecraft.World/PigZombie.cpp | 159 +- Minecraft.World/PigZombie.h | 35 +- Minecraft.World/PistonBaseTile.cpp | 583 +- Minecraft.World/PistonBaseTile.h | 44 +- Minecraft.World/PistonExtensionTile.cpp | 226 +- Minecraft.World/PistonExtensionTile.h | 35 +- Minecraft.World/PistonMovingPiece.cpp | 131 +- Minecraft.World/PistonMovingPiece.h | 32 +- Minecraft.World/PistonPieceEntity.cpp | 10 +- Minecraft.World/PlainsBiome.cpp | 2 + Minecraft.World/PlayGoal.cpp | 14 +- Minecraft.World/PlayGoal.h | 6 +- Minecraft.World/PlaySoundCommand.h | 88 + Minecraft.World/Player.cpp | 829 +- Minecraft.World/Player.h | 157 +- Minecraft.World/PlayerAbilitiesPacket.cpp | 32 +- Minecraft.World/PlayerAbilitiesPacket.h | 1 - Minecraft.World/PlayerActionPacket.cpp | 8 +- Minecraft.World/PlayerActionPacket.h | 2 +- Minecraft.World/PlayerCommandPacket.cpp | 15 +- Minecraft.World/PlayerCommandPacket.h | 10 +- Minecraft.World/PlayerEnderChestContainer.cpp | 13 +- Minecraft.World/PlayerEnderChestContainer.h | 3 + Minecraft.World/PlayerIO.h | 2 +- Minecraft.World/PlayerInputPacket.cpp | 46 +- Minecraft.World/PlayerInputPacket.h | 14 +- Minecraft.World/PlayerSelector.h | 247 + Minecraft.World/PlayerTeam.cpp | 120 + Minecraft.World/PlayerTeam.h | 49 + Minecraft.World/PortalForcer.cpp | 263 +- Minecraft.World/PortalForcer.h | 27 +- Minecraft.World/PortalTile.cpp | 222 +- Minecraft.World/Pos.cpp | 67 +- Minecraft.World/Pos.h | 33 +- Minecraft.World/Position.h | 9 + Minecraft.World/PositionImpl.h | 34 + Minecraft.World/PotatoTile.cpp | 2 +- Minecraft.World/PotionBrewing.cpp | 15 +- Minecraft.World/PotionBrewing.h | 15 + Minecraft.World/PotionItem.cpp | 102 +- Minecraft.World/PotionItem.h | 4 +- Minecraft.World/PoweredMetalTile.cpp | 17 + Minecraft.World/PoweredMetalTile.h | 12 + Minecraft.World/PoweredRailTile.cpp | 187 + Minecraft.World/PoweredRailTile.h | 21 + Minecraft.World/PressurePlateTile.cpp | 215 +- Minecraft.World/PressurePlateTile.h | 53 +- Minecraft.World/PrimedTnt.cpp | 14 +- Minecraft.World/PrimedTnt.h | 4 +- Minecraft.World/Projectile.h | 7 + Minecraft.World/ProtectionEnchantment.cpp | 6 +- Minecraft.World/PumpkinFeature.cpp | 22 +- Minecraft.World/PumpkinTile.cpp | 96 +- Minecraft.World/PumpkinTile.h | 8 +- Minecraft.World/QuartzBlockTile.cpp | 20 +- Minecraft.World/RailTile.cpp | 662 +- Minecraft.World/RailTile.h | 82 +- Minecraft.World/RandomLevelSource.cpp | 768 +- Minecraft.World/RandomLevelSource.h | 54 +- Minecraft.World/RandomScatteredLargeFeature.cpp | 96 +- Minecraft.World/RandomScatteredLargeFeature.h | 24 + Minecraft.World/RandomStrollGoal.cpp | 6 +- Minecraft.World/RandomStrollGoal.h | 4 +- Minecraft.World/RangedAttackGoal.cpp | 105 + Minecraft.World/RangedAttackGoal.h | 32 + Minecraft.World/RangedAttackMob.h | 7 + Minecraft.World/RangedAttribute.cpp | 31 + Minecraft.World/RangedAttribute.h | 21 + Minecraft.World/Recipes.cpp | 219 +- Minecraft.World/Recipes.h | 6 +- Minecraft.World/RecordingItem.cpp | 34 +- Minecraft.World/RecordingItem.h | 8 +- Minecraft.World/RedStoneDustTile.cpp | 174 +- Minecraft.World/RedStoneDustTile.h | 34 +- Minecraft.World/RedStoneItem.cpp | 4 +- Minecraft.World/RedStoneOreTile.cpp | 10 +- Minecraft.World/RedStoneOreTile.h | 16 +- Minecraft.World/RedlightTile.cpp | 6 +- Minecraft.World/Redstone.cpp | 8 + Minecraft.World/Redstone.h | 9 + Minecraft.World/ReedTile.cpp | 12 +- Minecraft.World/ReedsFeature.cpp | 38 +- Minecraft.World/Region.cpp | 76 +- Minecraft.World/Region.h | 3 +- Minecraft.World/RegionFileCache.cpp | 6 + Minecraft.World/RegionFileCache.h | 1 + Minecraft.World/RepairContainer.cpp | 9 +- Minecraft.World/RepairContainer.h | 7 +- Minecraft.World/RepairResultSlot.cpp | 18 +- Minecraft.World/RepairResultSlot.h | 6 +- Minecraft.World/RepeaterTile.cpp | 132 + Minecraft.World/RepeaterTile.h | 40 + Minecraft.World/ResultContainer.cpp | 36 +- Minecraft.World/ResultContainer.h | 12 +- Minecraft.World/ResultSlot.cpp | 12 +- Minecraft.World/RotatedPillarTile.cpp | 77 + Minecraft.World/RotatedPillarTile.h | 35 + Minecraft.World/RunAroundLikeCrazyGoal.cpp | 62 + Minecraft.World/RunAroundLikeCrazyGoal.h | 21 + Minecraft.World/SaddleItem.cpp | 24 +- Minecraft.World/SaddleItem.h | 4 +- Minecraft.World/SandFeature.cpp | 38 +- Minecraft.World/Sapling.cpp | 65 +- Minecraft.World/Sapling.h | 10 +- Minecraft.World/SavedDataStorage.cpp | 4 + Minecraft.World/ScatteredFeaturePieces.cpp | 319 +- Minecraft.World/ScatteredFeaturePieces.h | 50 +- Minecraft.World/Score.cpp | 68 + Minecraft.World/Score.h | 44 + Minecraft.World/ScoreHolder.h | 9 + Minecraft.World/Scoreboard.cpp | 328 + Minecraft.World/Scoreboard.h | 59 + Minecraft.World/ScoreboardSaveData.h | 189 + Minecraft.World/SeedFoodItem.cpp | 4 +- Minecraft.World/SeedItem.cpp | 18 +- Minecraft.World/ServersideAttributeMap.cpp | 83 + Minecraft.World/ServersideAttributeMap.h | 24 + Minecraft.World/SetDisplayObjectivePacket.cpp | 46 + Minecraft.World/SetDisplayObjectivePacket.h | 24 + Minecraft.World/SetEntityDataPacket.cpp | 5 - Minecraft.World/SetEntityDataPacket.h | 1 - Minecraft.World/SetEntityLinkPacket.cpp | 57 + Minecraft.World/SetEntityLinkPacket.h | 29 + Minecraft.World/SetExperiencePacket.cpp | 5 - Minecraft.World/SetExperiencePacket.h | 1 - Minecraft.World/SetHealthPacket.cpp | 10 +- Minecraft.World/SetHealthPacket.h | 5 +- Minecraft.World/SetObjectivePacket.cpp | 42 + Minecraft.World/SetObjectivePacket.h | 28 + Minecraft.World/SetPlayerTeamPacket.cpp | 114 + Minecraft.World/SetPlayerTeamPacket.h | 35 + Minecraft.World/SetPlayerTimeoutCommand.h | 36 + Minecraft.World/SetScorePacket.cpp | 63 + Minecraft.World/SetScorePacket.h | 30 + Minecraft.World/SetTimePacket.cpp | 28 +- Minecraft.World/SetTimePacket.h | 5 +- Minecraft.World/SharedConstants.cpp | 2 +- Minecraft.World/SharedConstants.h | 3 +- Minecraft.World/SharedMonsterAttributes.cpp | 108 + Minecraft.World/SharedMonsterAttributes.h | 26 + Minecraft.World/ShearsItem.cpp | 24 +- Minecraft.World/ShearsItem.h | 2 +- Minecraft.World/Sheep.cpp | 88 +- Minecraft.World/Sheep.h | 10 +- Minecraft.World/ShortTag.h | 2 +- Minecraft.World/ShovelItem.cpp | 3 +- Minecraft.World/ShowSeedCommand.h | 38 + Minecraft.World/SignItem.cpp | 11 +- Minecraft.World/SignTile.cpp | 8 +- Minecraft.World/SignTile.h | 4 +- Minecraft.World/SignTileEntity.cpp | 16 + Minecraft.World/SignTileEntity.h | 3 + Minecraft.World/Silverfish.cpp | 58 +- Minecraft.World/Silverfish.h | 5 +- Minecraft.World/SimpleContainer.cpp | 40 +- Minecraft.World/SimpleContainer.h | 47 +- Minecraft.World/SimpleFoiledItem.cpp | 12 + Minecraft.World/SimpleFoiledItem.h | 11 + Minecraft.World/SitGoal.cpp | 2 +- Minecraft.World/Skeleton.cpp | 309 +- Minecraft.World/Skeleton.h | 48 +- Minecraft.World/SkullItem.cpp | 10 +- Minecraft.World/SkullTile.cpp | 247 +- Minecraft.World/SkullTile.h | 10 +- Minecraft.World/Slime.cpp | 64 +- Minecraft.World/Slime.h | 3 +- Minecraft.World/Slot.cpp | 5 + Minecraft.World/Slot.h | 1 + Minecraft.World/SmallFireball.cpp | 6 +- Minecraft.World/SmallFireball.h | 4 +- Minecraft.World/SmoothStoneBrickTile.cpp | 6 +- Minecraft.World/SnowItem.cpp | 45 + Minecraft.World/SnowItem.h | 11 + Minecraft.World/SnowMan.cpp | 37 +- Minecraft.World/SnowMan.h | 11 +- Minecraft.World/SnowTile.cpp | 4 +- Minecraft.World/Snowball.cpp | 6 +- Minecraft.World/Snowball.h | 2 +- Minecraft.World/SnowballItem.cpp | 8 +- Minecraft.World/Socket.cpp | 12 +- Minecraft.World/SoulSandTile.cpp | 21 + Minecraft.World/SoulSandTile.h | 11 + Minecraft.World/SoundTypes.h | 68 +- Minecraft.World/Source.h | 5 + Minecraft.World/SpawnEggItem.cpp | 378 + Minecraft.World/SpawnEggItem.h | 48 + Minecraft.World/Spider.cpp | 112 +- Minecraft.World/Spider.h | 27 +- Minecraft.World/SpikeFeature.cpp | 124 +- Minecraft.World/SpreadPlayersCommand.h | 328 + Minecraft.World/SpringFeature.cpp | 40 +- Minecraft.World/Squid.cpp | 28 +- Minecraft.World/Squid.h | 3 +- Minecraft.World/StainedGlassBlock.cpp | 54 + Minecraft.World/StainedGlassBlock.h | 27 + Minecraft.World/StainedGlassPaneBlock.cpp | 52 + Minecraft.World/StainedGlassPaneBlock.h | 23 + Minecraft.World/StairTile.cpp | 63 +- Minecraft.World/StairTile.h | 77 +- Minecraft.World/Stats.cpp | 32 +- Minecraft.World/StemTile.cpp | 163 +- Minecraft.World/StemTile.h | 29 +- Minecraft.World/StoneButtonTile.cpp | 12 + Minecraft.World/StoneButtonTile.h | 11 + Minecraft.World/StoneMonsterTile.cpp | 73 +- Minecraft.World/StoneSlabTile.cpp | 4 +- Minecraft.World/StoneSlabTileItem.cpp | 15 +- Minecraft.World/StoneTile.cpp | 2 +- Minecraft.World/StringHelpers.cpp | 14 + Minecraft.World/StringHelpers.h | 23 +- Minecraft.World/StringTag.h | 2 +- Minecraft.World/StrongholdFeature.cpp | 126 +- Minecraft.World/StrongholdFeature.h | 27 +- Minecraft.World/StrongholdPieces.cpp | 1764 ++-- Minecraft.World/StrongholdPieces.h | 381 +- Minecraft.World/StructureFeature.cpp | 167 +- Minecraft.World/StructureFeature.h | 70 +- Minecraft.World/StructureFeatureIO.cpp | 104 + Minecraft.World/StructureFeatureIO.h | 93 + Minecraft.World/StructureFeatureSavedData.cpp | 47 + Minecraft.World/StructureFeatureSavedData.h | 21 + Minecraft.World/StructurePiece.cpp | 57 +- Minecraft.World/StructurePiece.h | 135 +- Minecraft.World/StructureRecipies.cpp | 23 +- Minecraft.World/StructureStart.cpp | 121 +- Minecraft.World/StructureStart.h | 30 +- Minecraft.World/SwampBiome.cpp | 2 + Minecraft.World/SwellGoal.cpp | 8 +- Minecraft.World/SwellGoal.h | 2 +- Minecraft.World/SynchedEntityData.cpp | 168 +- Minecraft.World/SynchedEntityData.h | 18 +- Minecraft.World/Tag.cpp | 7 +- Minecraft.World/Tag.h | 5 +- Minecraft.World/TakeFlowerGoal.cpp | 2 +- Minecraft.World/TallGrass.cpp | 2 +- Minecraft.World/TallGrassFeature.cpp | 28 +- Minecraft.World/TamableAnimal.cpp | 38 +- Minecraft.World/TamableAnimal.h | 8 +- Minecraft.World/TargetGoal.cpp | 50 +- Minecraft.World/TargetGoal.h | 20 +- Minecraft.World/Team.cpp | 16 + Minecraft.World/Team.h | 13 + Minecraft.World/TeleportEntityPacket.cpp | 4 +- Minecraft.World/TemptGoal.cpp | 6 +- Minecraft.World/TemptGoal.h | 4 +- Minecraft.World/TheEndBiome.cpp | 15 +- Minecraft.World/TheEndBiomeDecorator.cpp | 15 +- Minecraft.World/TheEndLevelRandomLevelSource.cpp | 435 +- Minecraft.World/TheEndLevelRandomLevelSource.h | 35 +- Minecraft.World/TheEndPortal.cpp | 55 +- Minecraft.World/TheEndPortal.h | 28 +- Minecraft.World/TheEndPortalFrameTile.cpp | 56 +- Minecraft.World/TheEndPortalFrameTile.h | 20 +- Minecraft.World/ThinFenceTile.cpp | 4 +- Minecraft.World/ThinFenceTile.h | 2 +- Minecraft.World/ThornsEnchantment.cpp | 6 +- Minecraft.World/ThornsEnchantment.h | 2 +- Minecraft.World/Throwable.cpp | 54 +- Minecraft.World/Throwable.h | 10 +- Minecraft.World/ThrownEgg.cpp | 2 +- Minecraft.World/ThrownEgg.h | 2 +- Minecraft.World/ThrownEnderpearl.cpp | 25 +- Minecraft.World/ThrownEnderpearl.h | 2 +- Minecraft.World/ThrownExpBottle.cpp | 2 +- Minecraft.World/ThrownExpBottle.h | 2 +- Minecraft.World/ThrownPotion.cpp | 52 +- Minecraft.World/ThrownPotion.h | 6 +- Minecraft.World/TickNextTickData.cpp | 26 +- Minecraft.World/TickNextTickData.h | 9 +- Minecraft.World/Tile.cpp | 693 +- Minecraft.World/Tile.h | 778 +- Minecraft.World/TileDestructionPacket.cpp | 2 +- Minecraft.World/TileEditorOpenPacket.cpp | 44 + Minecraft.World/TileEditorOpenPacket.h | 25 + Minecraft.World/TileEntity.cpp | 26 +- Minecraft.World/TileEntity.h | 19 +- Minecraft.World/TileEventPacket.cpp | 4 +- Minecraft.World/TileItem.cpp | 102 +- Minecraft.World/TilePlanterItem.cpp | 40 +- Minecraft.World/TileUpdatePacket.cpp | 2 +- Minecraft.World/TimeCommand.cpp | 9 +- Minecraft.World/TimeCommand.h | 1 + Minecraft.World/TntTile.cpp | 53 +- Minecraft.World/TntTile.h | 25 +- Minecraft.World/ToggleDownfallCommand.cpp | 5 + Minecraft.World/ToggleDownfallCommand.h | 1 + Minecraft.World/ToolRecipies.cpp | 17 +- Minecraft.World/TopSnowTile.cpp | 75 +- Minecraft.World/TorchTile.cpp | 27 +- Minecraft.World/TorchTile.h | 29 +- Minecraft.World/TrapDoorTile.cpp | 19 +- Minecraft.World/TrapMenu.cpp | 2 +- Minecraft.World/TreeFeature.cpp | 3 +- Minecraft.World/TreeTile.cpp | 75 +- Minecraft.World/TreeTile.h | 16 +- Minecraft.World/TripWireSourceTile.cpp | 43 +- Minecraft.World/TripWireSourceTile.h | 4 +- Minecraft.World/TripWireTile.cpp | 18 +- Minecraft.World/UpdateAttributesPacket.cpp | 141 + Minecraft.World/UpdateAttributesPacket.h | 46 + Minecraft.World/UpdateMobEffectPacket.cpp | 29 +- Minecraft.World/UpdateMobEffectPacket.h | 1 + Minecraft.World/UseItemPacket.cpp | 10 +- Minecraft.World/Vec3.cpp | 175 +- Minecraft.World/Vec3.h | 4 + Minecraft.World/Village.cpp | 8 +- Minecraft.World/Village.h | 10 +- Minecraft.World/VillageFeature.cpp | 186 +- Minecraft.World/VillageFeature.h | 30 +- Minecraft.World/VillagePieces.cpp | 395 +- Minecraft.World/VillagePieces.h | 268 +- Minecraft.World/VillageSiege.cpp | 2 +- Minecraft.World/Villager.cpp | 133 +- Minecraft.World/Villager.h | 25 +- Minecraft.World/VillagerGolem.cpp | 66 +- Minecraft.World/VillagerGolem.h | 8 +- Minecraft.World/Villages.cpp | 9 +- Minecraft.World/VineTile.cpp | 367 +- Minecraft.World/VinesFeature.cpp | 2 +- Minecraft.World/WallTile.cpp | 4 +- Minecraft.World/WaterAnimal.cpp | 22 + Minecraft.World/WaterAnimal.h | 3 + Minecraft.World/WaterLevelChunk.cpp | 5 + Minecraft.World/WaterLevelChunk.h | 1 + Minecraft.World/WaterLilyTile.cpp | 14 +- Minecraft.World/WaterLilyTileItem.cpp | 26 +- Minecraft.World/WaterLilyTileItem.h | 2 +- Minecraft.World/WaterlilyFeature.cpp | 22 +- Minecraft.World/WeaponItem.cpp | 58 +- Minecraft.World/WeaponItem.h | 10 +- Minecraft.World/WeaponRecipies.cpp | 9 +- Minecraft.World/WeatherCommand.h | 73 + Minecraft.World/WeighedTreasure.cpp | 2 +- Minecraft.World/WeighedTreasure.h | 2 +- Minecraft.World/WeightedPressurePlateTile.cpp | 46 + Minecraft.World/WeightedPressurePlateTile.h | 18 + Minecraft.World/Witch.cpp | 224 + Minecraft.World/Witch.h | 48 + Minecraft.World/WitherBoss.cpp | 584 ++ Minecraft.World/WitherBoss.h | 109 + Minecraft.World/WitherSkull.cpp | 130 + Minecraft.World/WitherSkull.h | 43 + Minecraft.World/Wolf.cpp | 183 +- Minecraft.World/Wolf.h | 24 +- Minecraft.World/WoodButtonTile.cpp | 12 + Minecraft.World/WoodButtonTile.h | 11 + Minecraft.World/WoodTile.cpp | 4 +- Minecraft.World/WoolCarpetTile.cpp | 4 +- Minecraft.World/WoolTileItem.cpp | 149 + Minecraft.World/WoolTileItem.h | 20 + Minecraft.World/WorkbenchTile.cpp | 1 + Minecraft.World/WorldlyContainer.h | 11 + Minecraft.World/WrittenBookItem.h | 82 + Minecraft.World/Zombie.cpp | 310 +- Minecraft.World/Zombie.h | 80 +- Minecraft.World/net.minecraft.commands.common.h | 1 + Minecraft.World/net.minecraft.core.h | 16 + Minecraft.World/net.minecraft.network.packet.h | 11 +- .../net.minecraft.world.ContainerListener.h | 4 +- Minecraft.World/net.minecraft.world.damagesource.h | 2 + Minecraft.World/net.minecraft.world.effect.h | 3 + .../net.minecraft.world.entity.ai.attributes.h | 10 + .../net.minecraft.world.entity.ai.goal.h | 5 +- .../net.minecraft.world.entity.ambient.h | 4 + .../net.minecraft.world.entity.animal.h | 8 +- Minecraft.World/net.minecraft.world.entity.boss.h | 3 +- Minecraft.World/net.minecraft.world.entity.h | 10 +- Minecraft.World/net.minecraft.world.entity.item.h | 7 + .../net.minecraft.world.entity.monster.h | 7 +- .../net.minecraft.world.entity.projectile.h | 8 +- Minecraft.World/net.minecraft.world.h | 4 +- Minecraft.World/net.minecraft.world.inventory.h | 7 +- .../net.minecraft.world.item.crafting.h | 1 + Minecraft.World/net.minecraft.world.item.h | 19 +- Minecraft.World/net.minecraft.world.level.h | 9 +- .../net.minecraft.world.level.levelgen.flat.h | 4 + .../net.minecraft.world.level.levelgen.structure.h | 4 + .../net.minecraft.world.level.redstone.h | 3 + .../net.minecraft.world.level.tile.entity.h | 7 + Minecraft.World/net.minecraft.world.level.tile.h | 35 +- .../net.minecraft.world.scores.criteria.h | 5 + Minecraft.World/net.minecraft.world.scores.h | 9 + Minecraft.World/stdafx.h | 2 +- Minecraft.World/system.cpp | 7 +- Minecraft.World/x64headers/extraX64.h | 7 +- README.md | 4 + cmake/ClientSources.cmake | 161 +- cmake/WorldSources.cmake | 522 +- 2069 files changed, 247767 insertions(+), 122447 deletions(-) create mode 100644 Minecraft.Client/AbstractProjectileDispenseBehavior.cpp create mode 100644 Minecraft.Client/AbstractProjectileDispenseBehavior.h create mode 100644 Minecraft.Client/BatModel.cpp create mode 100644 Minecraft.Client/BatModel.h create mode 100644 Minecraft.Client/BatRenderer.cpp create mode 100644 Minecraft.Client/BatRenderer.h create mode 100644 Minecraft.Client/BeaconRenderer.cpp create mode 100644 Minecraft.Client/BeaconRenderer.h create mode 100644 Minecraft.Client/BossMobGuiInfo.cpp create mode 100644 Minecraft.Client/BossMobGuiInfo.h create mode 100644 Minecraft.Client/CaveSpiderRenderer.cpp create mode 100644 Minecraft.Client/CaveSpiderRenderer.h create mode 100644 Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp create mode 100644 Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h create mode 100644 Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp create mode 100644 Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h create mode 100644 Minecraft.Client/Common/Leaderboards/base64.cpp create mode 100644 Minecraft.Client/Common/Leaderboards/base64.h create mode 100644 Minecraft.Client/Common/Media/BeaconMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/BeaconMenu480.swf create mode 100644 Minecraft.Client/Common/Media/BeaconMenu720.swf create mode 100644 Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/BeaconMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/BeaconMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/FireworksMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/FireworksMenu480.swf create mode 100644 Minecraft.Client/Common/Media/FireworksMenu720.swf create mode 100644 Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/FireworksMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/FireworksMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_1.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_2.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_3.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_4.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png create mode 100644 Minecraft.Client/Common/Media/HopperMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/HopperMenu480.swf create mode 100644 Minecraft.Client/Common/Media/HopperMenu720.swf create mode 100644 Minecraft.Client/Common/Media/HopperMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/HopperMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/HopperMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/LanguagesMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/LanguagesMenu480.swf create mode 100644 Minecraft.Client/Common/Media/LanguagesMenu720.swf create mode 100644 Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/LanguagesMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/font/CHS/MSYH.ttf create mode 100644 Minecraft.Client/Common/Media/xuiscene_anvil_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_anvil_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_beacon.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_beacon.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_beacon_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_beacon_Small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_fireworks.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_fireworks.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_fireworks_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_fireworks_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_hopper.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_hopper.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_hopper_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_hopper_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_hopper_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_hopper_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_horse.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_horse.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_horse_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_horse_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_horse_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_horse_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trading_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_trading_small.h create mode 100644 Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/HorseChoiceTask.h create mode 100644 Minecraft.Client/Common/Tutorial/RideEntityTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/RideEntityTask.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_BeaconMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_FireworksMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_FireworksMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_HUD.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_HUD.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_HopperMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.h create mode 100644 Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.h create mode 100644 Minecraft.Client/Common/UI/UIControl_MinecraftHorse.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_MinecraftHorse.h create mode 100644 Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_BeaconMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_FireworksMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_FireworksMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_HopperMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_HopperMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_HorseInventoryMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_HorseInventoryMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_LanguageSelector.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_LanguageSelector.h create mode 100644 Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.h create mode 100644 Minecraft.Client/Common/UI/UIString.cpp create mode 100644 Minecraft.Client/Common/UI/UIString.h create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Cartoon/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Cartoon/Data/x32Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/Festive.mcs create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/GameRules.grf create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/x16Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/TexturePack.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Steampunk/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Steampunk/Data/x32Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.mcs create mode 100644 Minecraft.Client/Common/res/TitleUpdate/audio/1.6.4.xwb create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/item/christmas.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/item/christmas_double.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/item/lead_knot.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/item/trapped.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/item/trapped_double.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/misc/beacon_beam.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/bat.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_diamond.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_gold.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_iron.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/donkey.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_black.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_brown.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_chestnut.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_creamy.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_darkbrown.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_gray.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_blackdots.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_white.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_whitedots.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_whitefield.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_skeleton.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_white.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_zombie.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/mule.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/witch.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither_armor.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither_invulnerable.png create mode 100644 Minecraft.Client/DispenserBootstrap.cpp create mode 100644 Minecraft.Client/DispenserBootstrap.h create mode 100644 Minecraft.Client/FireworksParticles.cpp create mode 100644 Minecraft.Client/FireworksParticles.h create mode 100644 Minecraft.Client/HorseRenderer.cpp create mode 100644 Minecraft.Client/HorseRenderer.h create mode 100644 Minecraft.Client/LeashKnotModel.cpp create mode 100644 Minecraft.Client/LeashKnotModel.h create mode 100644 Minecraft.Client/LeashKnotRenderer.cpp create mode 100644 Minecraft.Client/LeashKnotRenderer.h create mode 100644 Minecraft.Client/LivingEntityRenderer.cpp create mode 100644 Minecraft.Client/LivingEntityRenderer.h create mode 100644 Minecraft.Client/MinecartSpawnerRenderer.cpp create mode 100644 Minecraft.Client/MinecartSpawnerRenderer.h create mode 100644 Minecraft.Client/ModelHorse.cpp create mode 100644 Minecraft.Client/ModelHorse.h create mode 100644 Minecraft.Client/OcelotModel.cpp create mode 100644 Minecraft.Client/OcelotModel.h create mode 100644 Minecraft.Client/OcelotRenderer.cpp create mode 100644 Minecraft.Client/OcelotRenderer.h create mode 100644 Minecraft.Client/PSVita/Tutorial/Tutorial.mcs create mode 100644 Minecraft.Client/PSVita/Tutorial/Tutorial.pck create mode 100644 Minecraft.Client/PSVitaMedia/Minecraft.Client.self create mode 100644 Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.mcs create mode 100644 Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.pck create mode 100644 Minecraft.Client/PSVitaMedia/loc/stringsLanguages.xml create mode 100644 Minecraft.Client/ResourceLocation.h create mode 100644 Minecraft.Client/ServerScoreboard.cpp create mode 100644 Minecraft.Client/ServerScoreboard.h create mode 100644 Minecraft.Client/SkeletonRenderer.cpp create mode 100644 Minecraft.Client/SkeletonRenderer.h create mode 100644 Minecraft.Client/SkiModel.cpp create mode 100644 Minecraft.Client/SkiModel.h create mode 100644 Minecraft.Client/TextureAtlas.cpp create mode 100644 Minecraft.Client/TextureAtlas.h create mode 100644 Minecraft.Client/TntMinecartRenderer.cpp create mode 100644 Minecraft.Client/TntMinecartRenderer.h create mode 100644 Minecraft.Client/Windows64Media/Sound/Minecraft.msscmp create mode 100644 Minecraft.Client/Windows64Media/loc/AdditionalStrings.xml create mode 100644 Minecraft.Client/Windows64Media/loc/EULA.xml create mode 100644 Minecraft.Client/Windows64Media/loc/extra.xml create mode 100644 Minecraft.Client/Windows64Media/loc/stringsDynafont.xml create mode 100644 Minecraft.Client/Windows64Media/loc/stringsLanguages.xml create mode 100644 Minecraft.Client/Windows64Media/loc/stringsRichPresence.xml create mode 100644 Minecraft.Client/WitchModel.cpp create mode 100644 Minecraft.Client/WitchModel.h create mode 100644 Minecraft.Client/WitchRenderer.cpp create mode 100644 Minecraft.Client/WitchRenderer.h create mode 100644 Minecraft.Client/WitherBossModel.cpp create mode 100644 Minecraft.Client/WitherBossModel.h create mode 100644 Minecraft.Client/WitherBossRenderer.cpp create mode 100644 Minecraft.Client/WitherBossRenderer.h create mode 100644 Minecraft.Client/WitherSkullRenderer.cpp create mode 100644 Minecraft.Client/WitherSkullRenderer.h create mode 100644 Minecraft.Client/compat_shims.cpp create mode 100644 Minecraft.Client/iob_shim.asm create mode 100644 Minecraft.Client/sce_sys/keystone_vita create mode 100644 Minecraft.World/AbsoptionMobEffect.cpp create mode 100644 Minecraft.World/AbsoptionMobEffect.h create mode 100644 Minecraft.World/AbstractProjectileDispenseBehavior.cpp create mode 100644 Minecraft.World/AbstractProjectileDispenseBehavior.h create mode 100644 Minecraft.World/AmbientCreature.cpp create mode 100644 Minecraft.World/AmbientCreature.h create mode 100644 Minecraft.World/AnimalChest.cpp create mode 100644 Minecraft.World/AnimalChest.h create mode 100644 Minecraft.World/AnvilMenu.cpp create mode 100644 Minecraft.World/AnvilMenu.h create mode 100644 Minecraft.World/AttackDamageMobEffect.cpp create mode 100644 Minecraft.World/AttackDamageMobEffect.h create mode 100644 Minecraft.World/Attribute.cpp create mode 100644 Minecraft.World/Attribute.h create mode 100644 Minecraft.World/AttributeInstance.h create mode 100644 Minecraft.World/AttributeModifier.cpp create mode 100644 Minecraft.World/AttributeModifier.h create mode 100644 Minecraft.World/BaseAttribute.cpp create mode 100644 Minecraft.World/BaseAttribute.h create mode 100644 Minecraft.World/BaseAttributeMap.cpp create mode 100644 Minecraft.World/BaseAttributeMap.h create mode 100644 Minecraft.World/BaseEntityTile.cpp create mode 100644 Minecraft.World/BaseEntityTile.h create mode 100644 Minecraft.World/BaseMobSpawner.cpp create mode 100644 Minecraft.World/BaseMobSpawner.h create mode 100644 Minecraft.World/BasePressurePlateTile.cpp create mode 100644 Minecraft.World/BasePressurePlateTile.h create mode 100644 Minecraft.World/BaseRailTile.cpp create mode 100644 Minecraft.World/BaseRailTile.h create mode 100644 Minecraft.World/Bat.cpp create mode 100644 Minecraft.World/Bat.h create mode 100644 Minecraft.World/BeaconMenu.cpp create mode 100644 Minecraft.World/BeaconMenu.h create mode 100644 Minecraft.World/BeaconTile.cpp create mode 100644 Minecraft.World/BeaconTile.h create mode 100644 Minecraft.World/BeaconTileEntity.cpp create mode 100644 Minecraft.World/BeaconTileEntity.h create mode 100644 Minecraft.World/Behavior.h create mode 100644 Minecraft.World/BehaviorRegistry.cpp create mode 100644 Minecraft.World/BehaviorRegistry.h create mode 100644 Minecraft.World/BlockSource.h create mode 100644 Minecraft.World/BlockSourceImpl.cpp create mode 100644 Minecraft.World/BlockSourceImpl.h create mode 100644 Minecraft.World/Calendar.cpp create mode 100644 Minecraft.World/Calendar.h create mode 100644 Minecraft.World/ClassDiagram.cd create mode 100644 Minecraft.World/ColoredTile.cpp create mode 100644 Minecraft.World/ColoredTile.h create mode 100644 Minecraft.World/CombatEntry.cpp create mode 100644 Minecraft.World/CombatEntry.h create mode 100644 Minecraft.World/CombatTracker.cpp create mode 100644 Minecraft.World/CombatTracker.h create mode 100644 Minecraft.World/CommandBlock.cpp create mode 100644 Minecraft.World/CommandBlock.h create mode 100644 Minecraft.World/CommandBlockEntity.cpp create mode 100644 Minecraft.World/CommandBlockEntity.h create mode 100644 Minecraft.World/ComparatorTile.cpp create mode 100644 Minecraft.World/ComparatorTile.h create mode 100644 Minecraft.World/ComparatorTileEntity.cpp create mode 100644 Minecraft.World/ComparatorTileEntity.h delete mode 100644 Minecraft.World/ConsoleSaveFileSplit.cpp delete mode 100644 Minecraft.World/ConsoleSaveFileSplit.h create mode 100644 Minecraft.World/DaylightDetectorTile.cpp create mode 100644 Minecraft.World/DaylightDetectorTile.h create mode 100644 Minecraft.World/DaylightDetectorTileEntity.cpp create mode 100644 Minecraft.World/DaylightDetectorTileEntity.h create mode 100644 Minecraft.World/DefaultDispenseItemBehavior.cpp create mode 100644 Minecraft.World/DefaultDispenseItemBehavior.h create mode 100644 Minecraft.World/DispenseItemBehavior.cpp create mode 100644 Minecraft.World/DispenseItemBehavior.h create mode 100644 Minecraft.World/DropperTile.cpp create mode 100644 Minecraft.World/DropperTile.h create mode 100644 Minecraft.World/DropperTileEntity.cpp create mode 100644 Minecraft.World/DropperTileEntity.h create mode 100644 Minecraft.World/DummyCriteria.cpp create mode 100644 Minecraft.World/DummyCriteria.h create mode 100644 Minecraft.World/EffectCommand.cpp create mode 100644 Minecraft.World/EffectCommand.h create mode 100644 Minecraft.World/EmptyMapItem.cpp create mode 100644 Minecraft.World/EmptyMapItem.h create mode 100644 Minecraft.World/EntityDiagram.cd create mode 100644 Minecraft.World/EntityHorse.cpp create mode 100644 Minecraft.World/EntityHorse.h create mode 100644 Minecraft.World/EntitySelector.cpp create mode 100644 Minecraft.World/EntitySelector.h create mode 100644 Minecraft.World/FacingEnum.cpp create mode 100644 Minecraft.World/FacingEnum.h create mode 100644 Minecraft.World/FireworksChargeItem.cpp create mode 100644 Minecraft.World/FireworksChargeItem.h create mode 100644 Minecraft.World/FireworksItem.cpp create mode 100644 Minecraft.World/FireworksItem.h create mode 100644 Minecraft.World/FireworksMenu.cpp create mode 100644 Minecraft.World/FireworksMenu.h create mode 100644 Minecraft.World/FireworksRecipe.cpp create mode 100644 Minecraft.World/FireworksRecipe.h create mode 100644 Minecraft.World/FireworksRocketEntity.cpp create mode 100644 Minecraft.World/FireworksRocketEntity.h create mode 100644 Minecraft.World/FlatGeneratorInfo.cpp create mode 100644 Minecraft.World/FlatGeneratorInfo.h create mode 100644 Minecraft.World/FlatLayerInfo.cpp create mode 100644 Minecraft.World/FlatLayerInfo.h create mode 100644 Minecraft.World/GameDifficultyCommand.h create mode 100644 Minecraft.World/GameRuleCommand.h create mode 100644 Minecraft.World/GameRules.cpp create mode 100644 Minecraft.World/GameRules.h create mode 100644 Minecraft.World/GlowstoneTile.cpp create mode 100644 Minecraft.World/GlowstoneTile.h create mode 100644 Minecraft.World/HayBlockTile.cpp create mode 100644 Minecraft.World/HayBlockTile.h create mode 100644 Minecraft.World/HealthBoostMobEffect.cpp create mode 100644 Minecraft.World/HealthBoostMobEffect.h create mode 100644 Minecraft.World/HealthCriteria.cpp create mode 100644 Minecraft.World/HealthCriteria.h create mode 100644 Minecraft.World/Hopper.h create mode 100644 Minecraft.World/HopperMenu.cpp create mode 100644 Minecraft.World/HopperMenu.h create mode 100644 Minecraft.World/HopperTile.cpp create mode 100644 Minecraft.World/HopperTile.h create mode 100644 Minecraft.World/HopperTileEntity.cpp create mode 100644 Minecraft.World/HopperTileEntity.h create mode 100644 Minecraft.World/HorseInventoryMenu.cpp create mode 100644 Minecraft.World/HorseInventoryMenu.h create mode 100644 Minecraft.World/HtmlString.cpp create mode 100644 Minecraft.World/HtmlString.h create mode 100644 Minecraft.World/ItemDispenseBehaviors.cpp create mode 100644 Minecraft.World/ItemDispenseBehaviors.h create mode 100644 Minecraft.World/JukeboxTile.cpp create mode 100644 Minecraft.World/JukeboxTile.h create mode 100644 Minecraft.World/LargeFireball.cpp create mode 100644 Minecraft.World/LargeFireball.h create mode 100644 Minecraft.World/LeashFenceKnotEntity.cpp create mode 100644 Minecraft.World/LeashFenceKnotEntity.h create mode 100644 Minecraft.World/LeashItem.cpp create mode 100644 Minecraft.World/LeashItem.h create mode 100644 Minecraft.World/LevelParticlesPacket.cpp create mode 100644 Minecraft.World/LevelParticlesPacket.h create mode 100644 Minecraft.World/LivingEntity.cpp create mode 100644 Minecraft.World/LivingEntity.h create mode 100644 Minecraft.World/LocatableSource.h create mode 100644 Minecraft.World/Location.h create mode 100644 Minecraft.World/MapCloningRecipe.h create mode 100644 Minecraft.World/MapExtendingRecipe.h create mode 100644 Minecraft.World/MinecartChest.cpp create mode 100644 Minecraft.World/MinecartChest.h create mode 100644 Minecraft.World/MinecartContainer.cpp create mode 100644 Minecraft.World/MinecartContainer.h create mode 100644 Minecraft.World/MinecartFurnace.cpp create mode 100644 Minecraft.World/MinecartFurnace.h create mode 100644 Minecraft.World/MinecartHopper.cpp create mode 100644 Minecraft.World/MinecartHopper.h create mode 100644 Minecraft.World/MinecartRideable.cpp create mode 100644 Minecraft.World/MinecartRideable.h create mode 100644 Minecraft.World/MinecartSpawner.cpp create mode 100644 Minecraft.World/MinecartSpawner.h create mode 100644 Minecraft.World/MinecartTNT.cpp create mode 100644 Minecraft.World/MinecartTNT.h create mode 100644 Minecraft.World/MobGroupData.h create mode 100644 Minecraft.World/ModifiableAttributeInstance.cpp create mode 100644 Minecraft.World/ModifiableAttributeInstance.h create mode 100644 Minecraft.World/MultiEntityMob.h create mode 100644 Minecraft.World/MultiEntityMobPart.cpp create mode 100644 Minecraft.World/MultiEntityMobPart.h create mode 100644 Minecraft.World/NameTagItem.cpp create mode 100644 Minecraft.World/NameTagItem.h create mode 100644 Minecraft.World/NetherWartTile.cpp create mode 100644 Minecraft.World/NetherWartTile.h create mode 100644 Minecraft.World/NetherrackTile.cpp create mode 100644 Minecraft.World/NetherrackTile.h create mode 100644 Minecraft.World/NoteBlockTile.cpp create mode 100644 Minecraft.World/NoteBlockTile.h create mode 100644 Minecraft.World/Objective.cpp create mode 100644 Minecraft.World/Objective.h create mode 100644 Minecraft.World/ObjectiveCriteria.cpp create mode 100644 Minecraft.World/ObjectiveCriteria.h create mode 100644 Minecraft.World/Ocelot.cpp create mode 100644 Minecraft.World/Ocelot.h create mode 100644 Minecraft.World/OcelotAttackGoal.cpp create mode 100644 Minecraft.World/OcelotAttackGoal.h create mode 100644 Minecraft.World/OwnableEntity.h create mode 100644 Minecraft.World/PlaySoundCommand.h create mode 100644 Minecraft.World/PlayerSelector.h create mode 100644 Minecraft.World/PlayerTeam.cpp create mode 100644 Minecraft.World/PlayerTeam.h create mode 100644 Minecraft.World/Position.h create mode 100644 Minecraft.World/PositionImpl.h create mode 100644 Minecraft.World/PoweredMetalTile.cpp create mode 100644 Minecraft.World/PoweredMetalTile.h create mode 100644 Minecraft.World/PoweredRailTile.cpp create mode 100644 Minecraft.World/PoweredRailTile.h create mode 100644 Minecraft.World/Projectile.h create mode 100644 Minecraft.World/RangedAttackGoal.cpp create mode 100644 Minecraft.World/RangedAttackGoal.h create mode 100644 Minecraft.World/RangedAttackMob.h create mode 100644 Minecraft.World/RangedAttribute.cpp create mode 100644 Minecraft.World/RangedAttribute.h create mode 100644 Minecraft.World/Redstone.cpp create mode 100644 Minecraft.World/Redstone.h create mode 100644 Minecraft.World/RepeaterTile.cpp create mode 100644 Minecraft.World/RepeaterTile.h create mode 100644 Minecraft.World/RotatedPillarTile.cpp create mode 100644 Minecraft.World/RotatedPillarTile.h create mode 100644 Minecraft.World/RunAroundLikeCrazyGoal.cpp create mode 100644 Minecraft.World/RunAroundLikeCrazyGoal.h create mode 100644 Minecraft.World/Score.cpp create mode 100644 Minecraft.World/Score.h create mode 100644 Minecraft.World/ScoreHolder.h create mode 100644 Minecraft.World/Scoreboard.cpp create mode 100644 Minecraft.World/Scoreboard.h create mode 100644 Minecraft.World/ScoreboardSaveData.h create mode 100644 Minecraft.World/ServersideAttributeMap.cpp create mode 100644 Minecraft.World/ServersideAttributeMap.h create mode 100644 Minecraft.World/SetDisplayObjectivePacket.cpp create mode 100644 Minecraft.World/SetDisplayObjectivePacket.h create mode 100644 Minecraft.World/SetEntityLinkPacket.cpp create mode 100644 Minecraft.World/SetEntityLinkPacket.h create mode 100644 Minecraft.World/SetObjectivePacket.cpp create mode 100644 Minecraft.World/SetObjectivePacket.h create mode 100644 Minecraft.World/SetPlayerTeamPacket.cpp create mode 100644 Minecraft.World/SetPlayerTeamPacket.h create mode 100644 Minecraft.World/SetPlayerTimeoutCommand.h create mode 100644 Minecraft.World/SetScorePacket.cpp create mode 100644 Minecraft.World/SetScorePacket.h create mode 100644 Minecraft.World/SharedMonsterAttributes.cpp create mode 100644 Minecraft.World/SharedMonsterAttributes.h create mode 100644 Minecraft.World/ShowSeedCommand.h create mode 100644 Minecraft.World/SimpleFoiledItem.cpp create mode 100644 Minecraft.World/SimpleFoiledItem.h create mode 100644 Minecraft.World/SnowItem.cpp create mode 100644 Minecraft.World/SnowItem.h create mode 100644 Minecraft.World/SoulSandTile.cpp create mode 100644 Minecraft.World/SoulSandTile.h create mode 100644 Minecraft.World/Source.h create mode 100644 Minecraft.World/SpawnEggItem.cpp create mode 100644 Minecraft.World/SpawnEggItem.h create mode 100644 Minecraft.World/SpreadPlayersCommand.h create mode 100644 Minecraft.World/StainedGlassBlock.cpp create mode 100644 Minecraft.World/StainedGlassBlock.h create mode 100644 Minecraft.World/StainedGlassPaneBlock.cpp create mode 100644 Minecraft.World/StainedGlassPaneBlock.h create mode 100644 Minecraft.World/StoneButtonTile.cpp create mode 100644 Minecraft.World/StoneButtonTile.h create mode 100644 Minecraft.World/StructureFeatureIO.cpp create mode 100644 Minecraft.World/StructureFeatureIO.h create mode 100644 Minecraft.World/StructureFeatureSavedData.cpp create mode 100644 Minecraft.World/StructureFeatureSavedData.h create mode 100644 Minecraft.World/Team.cpp create mode 100644 Minecraft.World/Team.h create mode 100644 Minecraft.World/TileEditorOpenPacket.cpp create mode 100644 Minecraft.World/TileEditorOpenPacket.h create mode 100644 Minecraft.World/UpdateAttributesPacket.cpp create mode 100644 Minecraft.World/UpdateAttributesPacket.h create mode 100644 Minecraft.World/WeatherCommand.h create mode 100644 Minecraft.World/WeightedPressurePlateTile.cpp create mode 100644 Minecraft.World/WeightedPressurePlateTile.h create mode 100644 Minecraft.World/Witch.cpp create mode 100644 Minecraft.World/Witch.h create mode 100644 Minecraft.World/WitherBoss.cpp create mode 100644 Minecraft.World/WitherBoss.h create mode 100644 Minecraft.World/WitherSkull.cpp create mode 100644 Minecraft.World/WitherSkull.h create mode 100644 Minecraft.World/WoodButtonTile.cpp create mode 100644 Minecraft.World/WoodButtonTile.h create mode 100644 Minecraft.World/WoolTileItem.cpp create mode 100644 Minecraft.World/WoolTileItem.h create mode 100644 Minecraft.World/WorldlyContainer.h create mode 100644 Minecraft.World/WrittenBookItem.h create mode 100644 Minecraft.World/net.minecraft.core.h create mode 100644 Minecraft.World/net.minecraft.world.entity.ai.attributes.h create mode 100644 Minecraft.World/net.minecraft.world.entity.ambient.h create mode 100644 Minecraft.World/net.minecraft.world.level.levelgen.flat.h create mode 100644 Minecraft.World/net.minecraft.world.level.redstone.h create mode 100644 Minecraft.World/net.minecraft.world.scores.criteria.h create mode 100644 Minecraft.World/net.minecraft.world.scores.h (limited to 'Minecraft.World/Connection.cpp') diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b055af0..18f30e54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.24) -project(MinecraftConsoles LANGUAGES C CXX) +project(MinecraftConsoles LANGUAGES C CXX ASM_MASM) if(NOT WIN32) message(FATAL_ERROR "This CMake build currently supports Windows only.") @@ -28,7 +28,11 @@ target_compile_definitions(MinecraftWorld PRIVATE $<$>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64> ) if(MSVC) - target_compile_options(MinecraftWorld PRIVATE /W3 /MP /EHsc) + target_compile_options(MinecraftWorld PRIVATE + $<$:/W3> + $<$:/MP> + $<$:/EHsc> + ) endif() add_executable(MinecraftClient WIN32 ${MINECRAFT_CLIENT_SOURCES}) @@ -43,7 +47,11 @@ target_compile_definitions(MinecraftClient PRIVATE $<$>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64> ) if(MSVC) - target_compile_options(MinecraftClient PRIVATE /W3 /MP /EHsc) + target_compile_options(MinecraftClient PRIVATE + $<$:/W3> + $<$:/MP> + $<$:/EHsc> + ) endif() set_target_properties(MinecraftClient PROPERTIES @@ -55,18 +63,20 @@ target_link_libraries(MinecraftClient PRIVATE d3d11 XInput9_1_0 Shcore + wsock32 + legacy_stdio_definitions "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggy_w64.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggyperfmon_w64.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggyexpruntime_w64.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Miles/lib/mss64.lib" $<$: "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input_d.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage_d.lib" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Profile_d.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC_d.lib" > $<$>: - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input_r.lib" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage_r.lib" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Profile_r.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC.lib" > ) diff --git a/Minecraft.Client/AbstractProjectileDispenseBehavior.cpp b/Minecraft.Client/AbstractProjectileDispenseBehavior.cpp new file mode 100644 index 00000000..5e4b888b --- /dev/null +++ b/Minecraft.Client/AbstractProjectileDispenseBehavior.cpp @@ -0,0 +1,37 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.core.h" +#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "AbstractProjectileDispenseBehavior.h" + +shared_ptr AbstractProjectileDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed) +{ + Level *world = source->getWorld(); + Position position = DispenserTile::getDispensePosition(source); + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + shared_ptr arrow = getProjectile(world, position); + arrow->shoot(facing->getStepX(), facing->getStepY() + .1f, facing->getStepZ(), getPower(), getUncertainty()); + world->addEntity(arrow); + + dispensed->remove(1); + + return dispensed; +} + +void AbstractProjectileDispenseBehavior::playSound(BlockSource *source) +{ + source->getWorld()->levelEvent(LevelEvent::SOUND_LAUNCH, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); +} + + +float AbstractProjectileDispenseBehavior::getUncertainty() +{ + return 6; +} + +float AbstractProjectileDispenseBehavior::getPower() +{ + return 1.1f; +} diff --git a/Minecraft.Client/AbstractProjectileDispenseBehavior.h b/Minecraft.Client/AbstractProjectileDispenseBehavior.h new file mode 100644 index 00000000..30705a8a --- /dev/null +++ b/Minecraft.Client/AbstractProjectileDispenseBehavior.h @@ -0,0 +1,17 @@ +#pragma once + +#include "..\Minecraft.World\DefaultDispenseItemBehavior.h" + +class Projectile; + +class AbstractProjectileDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + shared_ptr execute(BlockSource *source, shared_ptr dispensed); + +protected: + virtual void playSound(BlockSource *source); + virtual shared_ptr getProjectile(Level *world, Position *position) = 0; + virtual float getUncertainty(); + virtual float getPower(); +}; \ No newline at end of file diff --git a/Minecraft.Client/AbstractTexturePack.cpp b/Minecraft.Client/AbstractTexturePack.cpp index a4eb7f01..80799a4c 100644 --- a/Minecraft.Client/AbstractTexturePack.cpp +++ b/Minecraft.Client/AbstractTexturePack.cpp @@ -187,30 +187,34 @@ wstring AbstractTexturePack::getAnimationString(const wstring &textureName, cons wstring animationDefinitionFile = textureName + L".txt"; bool requiresFallback = !hasFile(L"\\" + textureName + L".png", false); + + wstring result = L""; InputStream *fileStream = getResource(L"\\" + path + animationDefinitionFile, requiresFallback); - //Minecraft::getInstance()->getLogger().info("Found animation info for: " + animationDefinitionFile); + if(fileStream) + { + //Minecraft::getInstance()->getLogger().info("Found animation info for: " + animationDefinitionFile); #ifndef _CONTENT_PACKAGE - wprintf(L"Found animation info for: %ls\n", animationDefinitionFile.c_str() ); + app.DebugPrintf("Found animation info for: %ls\n", animationDefinitionFile.c_str() ); #endif - InputStreamReader isr(fileStream); - BufferedReader br(&isr); - - wstring result = L""; + InputStreamReader isr(fileStream); + BufferedReader br(&isr); - wstring line = br.readLine(); - while (!line.empty()) - { - line = trimString(line); - if (line.length() > 0) + + wstring line = br.readLine(); + while (!line.empty()) { - result.append(L","); - result.append(line); + line = trimString(line); + if (line.length() > 0) + { + result.append(L","); + result.append(line); + } + line = br.readLine(); } - line = br.readLine(); + delete fileStream; } - delete fileStream; return result; } @@ -253,7 +257,14 @@ void AbstractTexturePack::loadColourTable() void AbstractTexturePack::loadDefaultColourTable() { // Load the file +#ifdef __PS3__ + // need to check if it's a BD build, so pass in the name + File coloursFile(AbstractTexturePack::getPath(true,app.GetBootedFromDiscPatch()?"colours.col":NULL).append(L"res/colours.col")); + +#else File coloursFile(AbstractTexturePack::getPath(true).append(L"res/colours.col")); +#endif + if(coloursFile.exists()) { diff --git a/Minecraft.Client/ArrowRenderer.cpp b/Minecraft.Client/ArrowRenderer.cpp index 65c4ee71..4698cd6e 100644 --- a/Minecraft.Client/ArrowRenderer.cpp +++ b/Minecraft.Client/ArrowRenderer.cpp @@ -3,12 +3,14 @@ #include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" #include "..\Minecraft.World\Mth.h" +ResourceLocation ArrowRenderer::ARROW_LOCATION = ResourceLocation(TN_ITEM_ARROWS); + void ArrowRenderer::render(shared_ptr _arrow, double x, double y, double z, float rot, float a) { // 4J - original version used generics and thus had an input parameter of type Arrow rather than shared_ptr we have here - // do some casting around instead shared_ptr arrow = dynamic_pointer_cast(_arrow); - bindTexture(TN_ITEM_ARROWS); // 4J - was L"/item/arrows.png" + bindTexture(_arrow); // 4J - was L"/item/arrows.png" glPushMatrix(); @@ -83,4 +85,9 @@ void ArrowRenderer::render(shared_ptr _arrow, double x, double y, double } glDisable(GL_RESCALE_NORMAL); glPopMatrix(); +} + +ResourceLocation *ArrowRenderer::getTextureLocation(shared_ptr mob) +{ + return &ARROW_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/ArrowRenderer.h b/Minecraft.Client/ArrowRenderer.h index 2731f7c2..95867f5e 100644 --- a/Minecraft.Client/ArrowRenderer.h +++ b/Minecraft.Client/ArrowRenderer.h @@ -3,6 +3,10 @@ class ArrowRenderer : public EntityRenderer { +private: + static ResourceLocation ARROW_LOCATION; + public: virtual void render(shared_ptr _arrow, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; diff --git a/Minecraft.Client/BatModel.cpp b/Minecraft.Client/BatModel.cpp new file mode 100644 index 00000000..ec582fef --- /dev/null +++ b/Minecraft.Client/BatModel.cpp @@ -0,0 +1,107 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.world.entity.ambient.h" +#include "BatModel.h" +#include "ModelPart.h" + +BatModel::BatModel() : Model() +{ + texWidth = 64; + texHeight = 64; + + head = new ModelPart(this, 0, 0); + head->addBox(-3, -3, -3, 6, 6, 6); + + ModelPart *rightEar = new ModelPart(this, 24, 0); + rightEar->addBox(-4, -6, -2, 3, 4, 1); + head->addChild(rightEar); + ModelPart *leftEar = new ModelPart(this, 24, 0); + leftEar->bMirror = true; + leftEar->addBox(1, -6, -2, 3, 4, 1); + head->addChild(leftEar); + + body = new ModelPart(this, 0, 16); + body->addBox(-3, 4, -3, 6, 12, 6); + body->texOffs(0, 34)->addBox(-5, 16, 0, 10, 6, 1); + + rightWing = new ModelPart(this, 42, 0); + rightWing->addBox(-12, 1, 1.5f, 10, 16, 1); + rightWingTip = new ModelPart(this, 24, 16); + rightWingTip->setPos(-12, 1, 1.5f); + rightWingTip->addBox(-8, 1, 0, 8, 12, 1); + + leftWing = new ModelPart(this, 42, 0); + leftWing->bMirror = true; + leftWing->addBox(2, 1, 1.5f, 10, 16, 1); + leftWingTip = new ModelPart(this, 24, 16); + leftWingTip->bMirror = true; + leftWingTip->setPos(12, 1, 1.5f); + leftWingTip->addBox(0, 1, 0, 8, 12, 1); + + body->addChild(rightWing); + body->addChild(leftWing); + rightWing->addChild(rightWingTip); + leftWing->addChild(leftWingTip); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + // 4J Stu - Not just performance, but alpha+depth tests don't work right unless we compile here + head->compile(1.0f/16.0f); + body->compile(1.0f/16.0f); + rightWing->compile(1.0f/16.0f); + leftWing->compile(1.0f/16.0f); + rightWingTip->compile(1.0f/16.0f); + leftWingTip->compile(1.0f/16.0f); + rightEar->compile(1.0f/16.0f); + leftEar->compile(1.0f/16.0f); +} + +int BatModel::modelVersion() +{ + return 36; +} + +void BatModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + shared_ptr bat = dynamic_pointer_cast(entity); + if (bat->isResting()) + { + float rad = 180 / PI; + head->xRot = xRot / rad; + head->yRot = PI - yRot / rad; + head->zRot = PI; + + head->setPos(0, -2, 0); + rightWing->setPos(-3, 0, 3); + leftWing->setPos(3, 0, 3); + + body->xRot = PI; + + rightWing->xRot = -PI * .05f; + rightWing->yRot = -PI * .40f; + rightWingTip->yRot = -PI * .55f; + leftWing->xRot = rightWing->xRot; + leftWing->yRot = -rightWing->yRot; + leftWingTip->yRot = -rightWingTip->yRot; + } + else + { + float rad = 180 / PI; + head->xRot = xRot / rad; + head->yRot = yRot / rad; + head->zRot = 0; + + head->setPos(0, 0, 0); + rightWing->setPos(0, 0, 0); + leftWing->setPos(0, 0, 0); + + body->xRot = PI * .25f + cos(bob * .1f) * .15f; + body->yRot = 0; + + rightWing->yRot = cos(bob * 1.3f) * PI * .25f; + leftWing->yRot = -rightWing->yRot; + rightWingTip->yRot = rightWing->yRot * .5f; + leftWingTip->yRot = -rightWing->yRot * .5f; + } + + head->render(scale, usecompiled); + body->render(scale, usecompiled); +} \ No newline at end of file diff --git a/Minecraft.Client/BatModel.h b/Minecraft.Client/BatModel.h new file mode 100644 index 00000000..6893d478 --- /dev/null +++ b/Minecraft.Client/BatModel.h @@ -0,0 +1,20 @@ +#pragma once +#include "Model.h" + +class BatModel : public Model +{ +private: + ModelPart *head; + ModelPart *body; + ModelPart *rightWing; + ModelPart *leftWing; + ModelPart *rightWingTip; + ModelPart *leftWingTip; + +public: + BatModel(); + + int modelVersion(); + + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); +}; \ No newline at end of file diff --git a/Minecraft.Client/BatRenderer.cpp b/Minecraft.Client/BatRenderer.cpp new file mode 100644 index 00000000..629fe014 --- /dev/null +++ b/Minecraft.Client/BatRenderer.cpp @@ -0,0 +1,50 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.world.entity.ambient.h" +#include "BatRenderer.h" +#include "BatModel.h" + +ResourceLocation BatRenderer::BAT_LOCATION = ResourceLocation(TN_MOB_BAT); + +BatRenderer::BatRenderer() : MobRenderer(new BatModel(), 0.25f) +{ + modelVersion = ((BatModel *)model)->modelVersion(); +} + +void BatRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + int modelVersion = (dynamic_cast(model))->modelVersion(); + if (modelVersion != this->modelVersion) { + this->modelVersion = modelVersion; + model = new BatModel(); + } + MobRenderer::render(_mob, x, y, z, rot, a); +} + +ResourceLocation *BatRenderer::getTextureLocation(shared_ptr mob) +{ + return &BAT_LOCATION; +} + +void BatRenderer::scale(shared_ptr mob, float a) +{ + glScalef(.35f, .35f, .35f); +} + +void BatRenderer::setupPosition(shared_ptr mob, double x, double y, double z) +{ + MobRenderer::setupPosition(mob, x, y, z); +} + +void BatRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) +{ + shared_ptr mob = dynamic_pointer_cast(_mob); + if (!mob->isResting()) + { + glTranslatef(0, cos(bob * .3f) * .1f, 0); + } + else + { + glTranslatef(0, -.1f, 0); + } + MobRenderer::setupRotations(mob, bob, bodyRot, a); +} \ No newline at end of file diff --git a/Minecraft.Client/BatRenderer.h b/Minecraft.Client/BatRenderer.h new file mode 100644 index 00000000..88205046 --- /dev/null +++ b/Minecraft.Client/BatRenderer.h @@ -0,0 +1,20 @@ +#pragma once +#include "MobRenderer.h" + +class BatModel; + +class BatRenderer : public MobRenderer +{ + static ResourceLocation BAT_LOCATION; + int modelVersion; + +public: + BatRenderer(); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + +protected: + virtual ResourceLocation *getTextureLocation(shared_ptr mob); + virtual void scale(shared_ptr mob, float a); + virtual void setupPosition(shared_ptr mob, double x, double y, double z); + virtual void setupRotations(shared_ptr mob, float bob, float bodyRot, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/BeaconRenderer.cpp b/Minecraft.Client/BeaconRenderer.cpp new file mode 100644 index 00000000..959df6a8 --- /dev/null +++ b/Minecraft.Client/BeaconRenderer.cpp @@ -0,0 +1,138 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "BeaconRenderer.h" +#include "Tesselator.h" + +ResourceLocation BeaconRenderer::BEAM_LOCATION = ResourceLocation(TN_MISC_BEACON_BEAM); + +void BeaconRenderer::render(shared_ptr _beacon, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) +{ + shared_ptr beacon = dynamic_pointer_cast(_beacon); + + float scale = beacon->getAndUpdateClientSideScale(); + + if (scale > 0) + { + Tesselator *t = Tesselator::getInstance(); + + bindTexture(&BEAM_LOCATION); + + // TODO: 4J: Put this back in + //assert(0); + //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + glDepthMask(true); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + float tt = beacon->getLevel()->getGameTime() + a; + float texVOff = -tt * .20f - floor(-tt * .10f); + + { + int r = 1; + + double rot = tt * .025 * (1 - (r & 1) * 2.5); + + t->begin(); + t->color(255, 255, 255, 32); + + double rr1 = r * 0.2; + + double wnx = .5 + cos(rot + PI * .75) * rr1; + double wnz = .5 + sin(rot + PI * .75) * rr1; + double enx = .5 + cos(rot + PI * .25) * rr1; + double enz = .5 + sin(rot + PI * .25) * rr1; + + double wsx = .5 + cos(rot + PI * 1.25) * rr1; + double wsz = .5 + sin(rot + PI * 1.25) * rr1; + double esx = .5 + cos(rot + PI * 1.75) * rr1; + double esz = .5 + sin(rot + PI * 1.75) * rr1; + + double top = 256 * scale; + + double uu1 = 0; + double uu2 = 1; + double vv2 = -1 + texVOff; + double vv1 = 256 * scale * (.5 / rr1) + vv2; + + t->vertexUV(x + wnx, y + top, z + wnz, uu2, vv1); + t->vertexUV(x + wnx, y, z + wnz, uu2, vv2); + t->vertexUV(x + enx, y, z + enz, uu1, vv2); + t->vertexUV(x + enx, y + top, z + enz, uu1, vv1); + + t->vertexUV(x + esx, y + top, z + esz, uu2, vv1); + t->vertexUV(x + esx, y, z + esz, uu2, vv2); + t->vertexUV(x + wsx, y, z + wsz, uu1, vv2); + t->vertexUV(x + wsx, y + top, z + wsz, uu1, vv1); + + t->vertexUV(x + enx, y + top, z + enz, uu2, vv1); + t->vertexUV(x + enx, y, z + enz, uu2, vv2); + t->vertexUV(x + esx, y, z + esz, uu1, vv2); + t->vertexUV(x + esx, y + top, z + esz, uu1, vv1); + + t->vertexUV(x + wsx, y + top, z + wsz, uu2, vv1); + t->vertexUV(x + wsx, y, z + wsz, uu2, vv2); + t->vertexUV(x + wnx, y, z + wnz, uu1, vv2); + t->vertexUV(x + wnx, y + top, z + wnz, uu1, vv1); + + t->end(); + } + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthMask(false); + + { + t->begin(); + t->color(255, 255, 255, 32); + + double wnx = .2; + double wnz = .2; + double enx = .8; + double enz = .2; + + double wsx = .2; + double wsz = .8; + double esx = .8; + double esz = .8; + + double top = 256 * scale; + + double uu1 = 0; + double uu2 = 1; + double vv2 = -1 + texVOff; + double vv1 = 256 * scale + vv2; + + t->vertexUV(x + wnx, y + top, z + wnz, uu2, vv1); + t->vertexUV(x + wnx, y, z + wnz, uu2, vv2); + t->vertexUV(x + enx, y, z + enz, uu1, vv2); + t->vertexUV(x + enx, y + top, z + enz, uu1, vv1); + + t->vertexUV(x + esx, y + top, z + esz, uu2, vv1); + t->vertexUV(x + esx, y, z + esz, uu2, vv2); + t->vertexUV(x + wsx, y, z + wsz, uu1, vv2); + t->vertexUV(x + wsx, y + top, z + wsz, uu1, vv1); + + t->vertexUV(x + enx, y + top, z + enz, uu2, vv1); + t->vertexUV(x + enx, y, z + enz, uu2, vv2); + t->vertexUV(x + esx, y, z + esz, uu1, vv2); + t->vertexUV(x + esx, y + top, z + esz, uu1, vv1); + + t->vertexUV(x + wsx, y + top, z + wsz, uu2, vv1); + t->vertexUV(x + wsx, y, z + wsz, uu2, vv2); + t->vertexUV(x + wnx, y, z + wnz, uu1, vv2); + t->vertexUV(x + wnx, y + top, z + wnz, uu1, vv1); + + t->end(); + } + + glEnable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); + + glDepthMask(true); + } +} \ No newline at end of file diff --git a/Minecraft.Client/BeaconRenderer.h b/Minecraft.Client/BeaconRenderer.h new file mode 100644 index 00000000..0626b374 --- /dev/null +++ b/Minecraft.Client/BeaconRenderer.h @@ -0,0 +1,13 @@ +#pragma once +#include "TileEntityRenderer.h" + +class BeaconTileEntity; + +class BeaconRenderer : public TileEntityRenderer +{ +private: + static ResourceLocation BEAM_LOCATION; + +public: + virtual void render(shared_ptr _beacon, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled); +}; diff --git a/Minecraft.Client/BlazeModel.cpp b/Minecraft.Client/BlazeModel.cpp index 5af894ac..68d9ef46 100644 --- a/Minecraft.Client/BlazeModel.cpp +++ b/Minecraft.Client/BlazeModel.cpp @@ -32,18 +32,17 @@ int BlazeModel::modelVersion() void BlazeModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); - head->render(scale,usecompiled); + head->render(scale, usecompiled); for (unsigned int i = 0; i < upperBodyParts.length; i++) { upperBodyParts[i]->render(scale, usecompiled); } } -void BlazeModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void BlazeModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - float angle = bob * PI * -.1f; for (int i = 0; i < 4; i++) { diff --git a/Minecraft.Client/BlazeModel.h b/Minecraft.Client/BlazeModel.h index 27ee2060..9895801a 100644 --- a/Minecraft.Client/BlazeModel.h +++ b/Minecraft.Client/BlazeModel.h @@ -12,5 +12,5 @@ public: BlazeModel(); int modelVersion(); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); }; diff --git a/Minecraft.Client/BlazeRenderer.cpp b/Minecraft.Client/BlazeRenderer.cpp index 7d5210dc..8e0da036 100644 --- a/Minecraft.Client/BlazeRenderer.cpp +++ b/Minecraft.Client/BlazeRenderer.cpp @@ -3,9 +3,11 @@ #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "BlazeRenderer.h" +ResourceLocation BlazeRenderer::BLAZE_LOCATION = ResourceLocation(TN_MOB_BLAZE); + BlazeRenderer::BlazeRenderer() : MobRenderer(new BlazeModel(), 0.5f) { - this->modelVersion = ((BlazeModel *) model)->modelVersion(); + modelVersion = ((BlazeModel *) model)->modelVersion(); } void BlazeRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) @@ -21,4 +23,9 @@ void BlazeRenderer::render(shared_ptr _mob, double x, double y, double z model = new BlazeModel(); } MobRenderer::render(mob, x, y, z, rot, a); +} + +ResourceLocation *BlazeRenderer::getTextureLocation(shared_ptr mob) +{ + return &BLAZE_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/BlazeRenderer.h b/Minecraft.Client/BlazeRenderer.h index fc575e9b..5a009b74 100644 --- a/Minecraft.Client/BlazeRenderer.h +++ b/Minecraft.Client/BlazeRenderer.h @@ -1,14 +1,15 @@ #pragma once - #include "MobRenderer.h" class BlazeRenderer : public MobRenderer { private: - int modelVersion; + static ResourceLocation BLAZE_LOCATION; + int modelVersion; public: BlazeRenderer(); virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/BoatRenderer.cpp b/Minecraft.Client/BoatRenderer.cpp index f1367ae4..4c2e9baf 100644 --- a/Minecraft.Client/BoatRenderer.cpp +++ b/Minecraft.Client/BoatRenderer.cpp @@ -4,6 +4,8 @@ #include "..\Minecraft.World\net.minecraft.world.entity.item.h" #include "..\Minecraft.World\Mth.h" +ResourceLocation BoatRenderer::BOAT_LOCATION = ResourceLocation(TN_ITEM_BOAT); + BoatRenderer::BoatRenderer() : EntityRenderer() { this->shadowRadius = 0.5f; @@ -29,13 +31,17 @@ void BoatRenderer::render(shared_ptr _boat, double x, double y, double z glRotatef(Mth::sin(hurt)*hurt*dmg/10*boat->getHurtDir(), 1, 0, 0); } - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" float ss = 12/16.0f; glScalef(ss, ss, ss); glScalef(1/ss, 1/ss, 1/ss); - bindTexture(TN_ITEM_BOAT); // 4J was L"/item/boat.png" + bindTexture(boat); glScalef(-1, -1, 1); model->render(boat, 0, 0, -0.1f, 0, 0, 1 / 16.0f, true); glPopMatrix(); +} + +ResourceLocation *BoatRenderer::getTextureLocation(shared_ptr mob) +{ + return &BOAT_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/BoatRenderer.h b/Minecraft.Client/BoatRenderer.h index 1cc9c1d9..9396b477 100644 --- a/Minecraft.Client/BoatRenderer.h +++ b/Minecraft.Client/BoatRenderer.h @@ -3,11 +3,14 @@ class BoatRenderer : public EntityRenderer { +private: + static ResourceLocation BOAT_LOCATION; + protected: Model *model; - public: BoatRenderer(); virtual void render(shared_ptr boat, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/BookModel.cpp b/Minecraft.Client/BookModel.cpp index bc4769bd..d032a7f5 100644 --- a/Minecraft.Client/BookModel.cpp +++ b/Minecraft.Client/BookModel.cpp @@ -35,7 +35,7 @@ BookModel::BookModel() void BookModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); leftLid->render(scale,usecompiled); rightLid->render(scale,usecompiled); @@ -48,7 +48,7 @@ void BookModel::render(shared_ptr entity, float time, float r, float bob flipPage2->render(scale,usecompiled); } -void BookModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void BookModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { float openness = (Mth::sin(time * 0.02f) * 0.10f + 1.25f) * yRot; diff --git a/Minecraft.Client/BookModel.h b/Minecraft.Client/BookModel.h index 8b367a34..e35e7def 100644 --- a/Minecraft.Client/BookModel.h +++ b/Minecraft.Client/BookModel.h @@ -12,5 +12,5 @@ public: BookModel(); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); }; diff --git a/Minecraft.Client/BossMobGuiInfo.cpp b/Minecraft.Client/BossMobGuiInfo.cpp new file mode 100644 index 00000000..1cc3cae8 --- /dev/null +++ b/Minecraft.Client/BossMobGuiInfo.cpp @@ -0,0 +1,16 @@ +#include "stdafx.h" +#include "BossMobGuiInfo.h" +#include "../Minecraft.World/BossMob.h" + +float BossMobGuiInfo::healthProgress = 0.0f; +int BossMobGuiInfo::displayTicks = 0; +wstring BossMobGuiInfo::name = L""; +bool BossMobGuiInfo::darkenWorld = false; + +void BossMobGuiInfo::setBossHealth(shared_ptr boss, bool darkenWorld) +{ + healthProgress = (float) boss->getHealth() / (float) boss->getMaxHealth(); + displayTicks = SharedConstants::TICKS_PER_SECOND * 5; + name = boss->getAName(); + BossMobGuiInfo::darkenWorld = darkenWorld; +} \ No newline at end of file diff --git a/Minecraft.Client/BossMobGuiInfo.h b/Minecraft.Client/BossMobGuiInfo.h new file mode 100644 index 00000000..bc0d46c9 --- /dev/null +++ b/Minecraft.Client/BossMobGuiInfo.h @@ -0,0 +1,14 @@ +#pragma once + +class BossMob; + +class BossMobGuiInfo +{ +public: + static float healthProgress; + static int displayTicks; + static wstring name; + static bool darkenWorld; + + static void setBossHealth(shared_ptr boss, bool darkenWorld); +}; \ No newline at end of file diff --git a/Minecraft.Client/BufferedImage.cpp b/Minecraft.Client/BufferedImage.cpp index 658e9341..37662d8a 100644 --- a/Minecraft.Client/BufferedImage.cpp +++ b/Minecraft.Client/BufferedImage.cpp @@ -162,7 +162,7 @@ BufferedImage::BufferedImage(const wstring& File, bool filenameHasExtension /*=f const char *pchTextureName=wstringtofilename(name); -#ifdef _DEBUG +#ifndef _CONTENT_PACKAGE app.DebugPrintf("\n--- Loading TEXTURE - %s\n\n",pchTextureName); #endif diff --git a/Minecraft.Client/Camera.cpp b/Minecraft.Client/Camera.cpp index db6072b2..4de96349 100644 --- a/Minecraft.Client/Camera.cpp +++ b/Minecraft.Client/Camera.cpp @@ -88,12 +88,12 @@ void Camera::prepare(shared_ptr player, bool mirror) ya = cosf(xRot * PI / 180.0f); } -TilePos *Camera::getCameraTilePos(shared_ptr player, double alpha) +TilePos *Camera::getCameraTilePos(shared_ptr player, double alpha) { return new TilePos(getCameraPos(player, alpha)); } -Vec3 *Camera::getCameraPos(shared_ptr player, double alpha) +Vec3 *Camera::getCameraPos(shared_ptr player, double alpha) { double xx = player->xo + (player->x - player->xo) * alpha; double yy = player->yo + (player->y - player->yo) * alpha + player->getHeadHeight(); @@ -106,7 +106,7 @@ Vec3 *Camera::getCameraPos(shared_ptr player, double alpha) return Vec3::newTemp(xt, yt, zt); } -int Camera::getBlockAt(Level *level, shared_ptr player, float alpha) +int Camera::getBlockAt(Level *level, shared_ptr player, float alpha) { Vec3 *p = Camera::getCameraPos(player, alpha); TilePos tp = TilePos(p); diff --git a/Minecraft.Client/Camera.h b/Minecraft.Client/Camera.h index cccb0b2d..456c8858 100644 --- a/Minecraft.Client/Camera.h +++ b/Minecraft.Client/Camera.h @@ -26,7 +26,7 @@ public: static void prepare(shared_ptr player, bool mirror); - static TilePos *getCameraTilePos(shared_ptr player, double alpha); - static Vec3 *getCameraPos(shared_ptr player, double alpha); - static int getBlockAt(Level *level, shared_ptr player, float alpha); + static TilePos *getCameraTilePos(shared_ptr player, double alpha); + static Vec3 *getCameraPos(shared_ptr player, double alpha); + static int getBlockAt(Level *level, shared_ptr player, float alpha); }; \ No newline at end of file diff --git a/Minecraft.Client/CaveSpiderRenderer.cpp b/Minecraft.Client/CaveSpiderRenderer.cpp new file mode 100644 index 00000000..cbf59bb3 --- /dev/null +++ b/Minecraft.Client/CaveSpiderRenderer.cpp @@ -0,0 +1,20 @@ +#include "stdafx.h" +#include "CaveSpiderRenderer.h" + +ResourceLocation CaveSpiderRenderer::CAVE_SPIDER_LOCATION = ResourceLocation(TN_MOB_CAVE_SPIDER); +float CaveSpiderRenderer::s_scale = 0.7f; + +CaveSpiderRenderer::CaveSpiderRenderer() : SpiderRenderer() +{ + shadowRadius *= s_scale; +} + +void CaveSpiderRenderer::scale(shared_ptr mob, float a) +{ + glScalef(s_scale, s_scale, s_scale); +} + +ResourceLocation *CaveSpiderRenderer::getTextureLocation(shared_ptr mob) +{ + return &CAVE_SPIDER_LOCATION; +} \ No newline at end of file diff --git a/Minecraft.Client/CaveSpiderRenderer.h b/Minecraft.Client/CaveSpiderRenderer.h new file mode 100644 index 00000000..63a931a0 --- /dev/null +++ b/Minecraft.Client/CaveSpiderRenderer.h @@ -0,0 +1,18 @@ +#pragma once +#include "SpiderRenderer.h" + +class CaveSpider; + +class CaveSpiderRenderer : public SpiderRenderer +{ +private: + static ResourceLocation CAVE_SPIDER_LOCATION; + static float s_scale; + +public: + CaveSpiderRenderer(); + +protected: + virtual void scale(shared_ptr mob, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); +}; \ No newline at end of file diff --git a/Minecraft.Client/ChestRenderer.cpp b/Minecraft.Client/ChestRenderer.cpp index d1b5cf91..97954b55 100644 --- a/Minecraft.Client/ChestRenderer.cpp +++ b/Minecraft.Client/ChestRenderer.cpp @@ -5,11 +5,29 @@ #include "ModelPart.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\Calendar.h" -ChestRenderer::ChestRenderer() +ResourceLocation ChestRenderer::CHEST_LARGE_TRAP_LOCATION = ResourceLocation(TN_TILE_LARGE_TRAP_CHEST); +//ResourceLocation ChestRenderer::CHEST_LARGE_XMAS_LOCATION = ResourceLocation(TN_TILE_LARGE_XMAS_CHEST); +ResourceLocation ChestRenderer::CHEST_LARGE_LOCATION = ResourceLocation(TN_TILE_LARGE_CHEST); +ResourceLocation ChestRenderer::CHEST_TRAP_LOCATION = ResourceLocation(TN_TILE_TRAP_CHEST); +//ResourceLocation ChestRenderer::CHEST_XMAS_LOCATION = ResourceLocation(TN_TILE_XMAS_CHEST); +ResourceLocation ChestRenderer::CHEST_LOCATION = ResourceLocation(TN_TILE_CHEST); + +ChestRenderer::ChestRenderer() : TileEntityRenderer() { chestModel = new ChestModel(); largeChestModel = new LargeChestModel(); + + xmasTextures = false; + + // 4J Stu - Disable this +#if 0 + if (Calendar::GetMonth() + 1 == 12 && Calendar::GetDayOfMonth() >= 24 && Calendar::GetDayOfMonth() <= 26) + { + xmasTextures = true; + } +#endif } ChestRenderer::~ChestRenderer() @@ -34,7 +52,7 @@ void ChestRenderer::render(shared_ptr _chest, double x, double y, d Tile *tile = chest->getTile(); data = chest->getData(); - if (tile != NULL && data == 0) + if (dynamic_cast(tile) != NULL && data == 0) { ((ChestTile *) tile)->recalcLockDir(chest->getLevel(), chest->x, chest->y, chest->z); data = chest->getData(); @@ -49,12 +67,35 @@ void ChestRenderer::render(shared_ptr _chest, double x, double y, d if (chest->e.lock() != NULL || chest->s.lock() != NULL) { model = largeChestModel; - bindTexture(TN_TILE_LARGE_CHEST); // 4J Was "/item/largechest.png" + + if (chest->getType() == ChestTile::TYPE_TRAP) + { + bindTexture(&CHEST_LARGE_TRAP_LOCATION); + } + //else if (xmasTextures) + //{ + // bindTexture(&CHEST_LARGE_XMAS_LOCATION); + //} + else + { + bindTexture(&CHEST_LARGE_LOCATION); + } } else { model = chestModel; - bindTexture(TN_TILE_CHEST); // 4J Was "/item/chest.png" + if (chest->getType() == ChestTile::TYPE_TRAP) + { + bindTexture(&CHEST_TRAP_LOCATION); + } + //else if (xmasTextures) + //{ + // bindTexture(&CHEST_XMAS_LOCATION); + //} + else + { + bindTexture(&CHEST_LOCATION); + } } glPushMatrix(); diff --git a/Minecraft.Client/ChestRenderer.h b/Minecraft.Client/ChestRenderer.h index 06c6bfff..3d9345b9 100644 --- a/Minecraft.Client/ChestRenderer.h +++ b/Minecraft.Client/ChestRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "TileEntityRenderer.h" class ChestModel; @@ -7,8 +6,16 @@ class ChestModel; class ChestRenderer : public TileEntityRenderer { private: + static ResourceLocation CHEST_LARGE_TRAP_LOCATION; + //static ResourceLocation CHEST_LARGE_XMAS_LOCATION; + static ResourceLocation CHEST_LARGE_LOCATION; + static ResourceLocation CHEST_TRAP_LOCATION; + //static ResourceLocation CHEST_XMAS_LOCATION; + static ResourceLocation CHEST_LOCATION; + ChestModel *chestModel; ChestModel *largeChestModel; + boolean xmasTextures; public: ChestRenderer(); diff --git a/Minecraft.Client/ChickenModel.cpp b/Minecraft.Client/ChickenModel.cpp index 21dc2059..98ef9358 100644 --- a/Minecraft.Client/ChickenModel.cpp +++ b/Minecraft.Client/ChickenModel.cpp @@ -51,7 +51,7 @@ ChickenModel::ChickenModel() : Model() void ChickenModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); if (young) { float ss = 2; @@ -84,7 +84,7 @@ void ChickenModel::render(shared_ptr entity, float time, float r, float } } -void ChickenModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void ChickenModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { head->xRot = xRot / (float) (180 / PI); head->yRot = yRot / (float) (180 / PI); diff --git a/Minecraft.Client/ChickenModel.h b/Minecraft.Client/ChickenModel.h index 9ee0858e..60d9c262 100644 --- a/Minecraft.Client/ChickenModel.h +++ b/Minecraft.Client/ChickenModel.h @@ -6,6 +6,6 @@ public: ModelPart *head, *hair, *body, *leg0, *leg1, *wing0,* wing1, *beak, *redThing; ChickenModel(); - virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); }; diff --git a/Minecraft.Client/ChickenRenderer.cpp b/Minecraft.Client/ChickenRenderer.cpp index 908ba506..4f369df3 100644 --- a/Minecraft.Client/ChickenRenderer.cpp +++ b/Minecraft.Client/ChickenRenderer.cpp @@ -3,6 +3,8 @@ #include "ChickenRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +ResourceLocation ChickenRenderer::CHICKEN_LOCATION = ResourceLocation(TN_MOB_CHICKEN); + ChickenRenderer::ChickenRenderer(Model *model, float shadow) : MobRenderer(model,shadow) { } @@ -12,7 +14,7 @@ void ChickenRenderer::render(shared_ptr _mob, double x, double y, double MobRenderer::render(_mob, x, y, z, rot, a); } -float ChickenRenderer::getBob(shared_ptr _mob, float a) +float ChickenRenderer::getBob(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -21,4 +23,9 @@ float ChickenRenderer::getBob(shared_ptr _mob, float a) float flapSpeed = mob->oFlapSpeed+(mob->flapSpeed-mob->oFlapSpeed)*a; return (Mth::sin(flap)+1)*flapSpeed; +} + +ResourceLocation *ChickenRenderer::getTextureLocation(shared_ptr mob) +{ + return &CHICKEN_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/ChickenRenderer.h b/Minecraft.Client/ChickenRenderer.h index b81c9133..7e0a5d9a 100644 --- a/Minecraft.Client/ChickenRenderer.h +++ b/Minecraft.Client/ChickenRenderer.h @@ -3,9 +3,14 @@ class ChickenRenderer : public MobRenderer { +private: + static ResourceLocation CHICKEN_LOCATION; + public: ChickenRenderer(Model *model, float shadow); virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); + protected: - virtual float getBob(shared_ptr _mob, float a); + virtual float getBob(shared_ptr _mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/Chunk.cpp b/Minecraft.Client/Chunk.cpp index 99933db3..d039227b 100644 --- a/Minecraft.Client/Chunk.cpp +++ b/Minecraft.Client/Chunk.cpp @@ -15,6 +15,8 @@ #include "C4JThread_SPU.h" #include "C4JSpursJob.h" +//#define DISABLE_SPU_CODE + #endif int Chunk::updates = 0; @@ -233,7 +235,7 @@ void Chunk::rebuild() byteArray tileArray = byteArray(tileIds, 16 * 16 * Level::maxBuildHeight); level->getChunkAt(x,z)->getBlockData(tileArray); // 4J - TODO - now our data has been re-arranged, we could just extra the vertical slice of this chunk rather than the whole thing - LevelSource *region = new Region(level, x0 - r, y0 - r, z0 - r, x1 + r, y1 + r, z1 + r); + LevelSource *region = new Region(level, x0 - r, y0 - r, z0 - r, x1 + r, y1 + r, z1 + r, r); TileRenderer *tileRenderer = new TileRenderer(region, this->x, this->y, this->z, tileIds); // AP - added a caching system for Chunk::rebuild to take advantage of @@ -278,15 +280,15 @@ void Chunk::rebuild() // Establish whether this tile and its neighbours are all made of rock, dirt, unbreakable tiles, or have already // been determined to meet this criteria themselves and have a tile of 255 set. - if( !( ( tileId == Tile::rock_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; + if( !( ( tileId == Tile::stone_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; tileId = tileIds[ offset + ( ( ( xx - 1 ) << 11 ) | ( ( zz + 0 ) << 7 ) | ( indexY + 0 )) ]; - if( !( ( tileId == Tile::rock_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; + if( !( ( tileId == Tile::stone_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; tileId = tileIds[ offset + ( ( ( xx + 1 ) << 11 ) | ( ( zz + 0 ) << 7 ) | ( indexY + 0 )) ]; - if( !( ( tileId == Tile::rock_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; + if( !( ( tileId == Tile::stone_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; tileId = tileIds[ offset + ( ( ( xx + 0 ) << 11 ) | ( ( zz - 1 ) << 7 ) | ( indexY + 0 )) ]; - if( !( ( tileId == Tile::rock_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; + if( !( ( tileId == Tile::stone_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; tileId = tileIds[ offset + ( ( ( xx + 0 ) << 11 ) | ( ( zz + 1 ) << 7 ) | ( indexY + 0 )) ]; - if( !( ( tileId == Tile::rock_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; + if( !( ( tileId == Tile::stone_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; // Treat the bottom of the world differently - we shouldn't ever be able to look up at this, so consider tiles as invisible // if they are surrounded on sides other than the bottom if( yy > 0 ) @@ -299,7 +301,7 @@ void Chunk::rebuild() yMinusOneOffset = Level::COMPRESSED_CHUNK_SECTION_TILES; } tileId = tileIds[ yMinusOneOffset + ( ( ( xx + 0 ) << 11 ) | ( ( zz + 0 ) << 7 ) | indexYMinusOne ) ]; - if( !( ( tileId == Tile::rock_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; + if( !( ( tileId == Tile::stone_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; } int indexYPlusOne = yy + 1; int yPlusOneOffset = 0; @@ -309,7 +311,7 @@ void Chunk::rebuild() yPlusOneOffset = Level::COMPRESSED_CHUNK_SECTION_TILES; } tileId = tileIds[ yPlusOneOffset + ( ( ( xx + 0 ) << 11 ) | ( ( zz + 0 ) << 7 ) | indexYPlusOne ) ]; - if( !( ( tileId == Tile::rock_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; + if( !( ( tileId == Tile::stone_Id ) || ( tileId == Tile::dirt_Id ) || ( tileId == Tile::unbreakable_Id ) || ( tileId == 255) ) ) continue; // This tile is surrounded. Flag it as not requiring to be rendered by setting its id to 255. tileIds[ offset + ( ( ( xx + 0 ) << 11 ) | ( ( zz + 0 ) << 7 ) | ( indexY + 0 ) ) ] = 0xff; @@ -618,8 +620,6 @@ ChunkRebuildData g_rebuildDataOut __attribute__((__aligned__(16))); TileCompressData_SPU g_tileCompressDataIn __attribute__((__aligned__(16))); unsigned char* g_tileCompressDataOut = (unsigned char*)&g_rebuildDataIn.m_tileIds; -#define TILE_RENDER_SPU - void RunSPURebuild() { @@ -667,7 +667,7 @@ void Chunk::rebuild_SPU() int r = 1; - Region region(level, x0 - r, y0 - r, z0 - r, x1 + r, y1 + r, z1 + r); + Region region(level, x0 - r, y0 - r, z0 - r, x1 + r, y1 + r, z1 + r, r); TileRenderer tileRenderer(®ion); int lists = levelRenderer->getGlobalIndexForChunk(this->x,this->y,this->z,level) * 2; @@ -722,19 +722,12 @@ void Chunk::rebuild_SPU() intArray_SPU tesselatorArray((unsigned int*)g_rebuildDataIn.m_tesselator.m_PPUArray); g_rebuildDataIn.m_tesselator._array = &tesselatorArray; g_rebuildDataIn.m_currentLayer = currentLayer; - #ifdef TILE_RENDER_SPU g_tileCompressDataIn.setForChunk(®ion, x0, y0, z0); RunSPURebuild(); g_rebuildDataOut.storeInTesselator(); pOutData = &g_rebuildDataOut; - #else - g_rebuildDataIn.disableUnseenTiles(); - TileRenderer_SPU *pTileRenderer = new TileRenderer_SPU(&g_rebuildDataIn); - g_rebuildDataIn.tesselateAllTiles(pTileRenderer); - g_rebuildDataIn.storeInTesselator(); - pOutData = &g_rebuildDataIn; - #endif - if(pOutData->m_flags & ChunkRebuildData::e_flag_Rendered) + + if(pOutData->m_flags & ChunkRebuildData::e_flag_Rendered) rendered = true; // 4J - changed loop order here to leave y as the innermost loop for better cache performance diff --git a/Minecraft.Client/ClientConnection.cpp b/Minecraft.Client/ClientConnection.cpp index 5ba3cb85..52cec351 100644 --- a/Minecraft.Client/ClientConnection.cpp +++ b/Minecraft.Client/ClientConnection.cpp @@ -13,7 +13,9 @@ #include "..\Minecraft.World\net.minecraft.world.level.chunk.h" #include "..\Minecraft.World\net.minecraft.stats.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.ai.attributes.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.npc.h" #include "..\Minecraft.World\net.minecraft.world.entity.item.h" #include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" @@ -41,6 +43,7 @@ #include "MinecraftServer.h" #include "ClientConstants.h" #include "..\Minecraft.World\SoundTypes.h" +#include "..\Minecraft.World\BasicTypeContainers.h" #include "TexturePackRepository.h" #ifdef _XBOX #include "Common\XUI\XUI_Scene_Trading.h" @@ -65,15 +68,15 @@ ClientConnection::ClientConnection(Minecraft *minecraft, const wstring& ip, int // 4J - added initiliasers random = new Random(); done = false; - level = false; - started = false; + level = false; + started = false; - this->minecraft = minecraft; + this->minecraft = minecraft; Socket *socket; if( gNetworkManager.IsHost() ) { - socket = new Socket(); // 4J - Local connection + socket = new Socket(); // 4J - Local connection } else { @@ -82,7 +85,7 @@ ClientConnection::ClientConnection(Minecraft *minecraft, const wstring& ip, int createdOk = socket->createdOk; if( createdOk ) { - connection = new Connection(socket, L"Client", this); + connection = new Connection(socket, L"Client", this); } else { @@ -97,12 +100,12 @@ ClientConnection::ClientConnection(Minecraft *minecraft, Socket *socket, int iUs // 4J - added initiliasers random = new Random(); done = false; - level = NULL; - started = false; + level = NULL; + started = false; savedDataStorage = new SavedDataStorage(NULL); maxPlayers = 20; - this->minecraft = minecraft; + this->minecraft = minecraft; if( iUserIndex < 0 ) { @@ -115,13 +118,13 @@ ClientConnection::ClientConnection(Minecraft *minecraft, Socket *socket, int iUs if( socket == NULL ) { - socket = new Socket(); // 4J - Local connection + socket = new Socket(); // 4J - Local connection } createdOk = socket->createdOk; if( createdOk ) { - connection = new Connection(socket, L"Client", this); + connection = new Connection(socket, L"Client", this); } else { @@ -129,6 +132,8 @@ ClientConnection::ClientConnection(Minecraft *minecraft, Socket *socket, int iUs // TODO 4J Stu - This will cause issues since the session player owns the socket //delete socket; } + + deferredEntityLinkPackets = vector(); } ClientConnection::~ClientConnection() @@ -140,8 +145,8 @@ ClientConnection::~ClientConnection() void ClientConnection::tick() { - if (!done) connection->tick(); - connection->flush(); + if (!done) connection->tick(); + connection->flush(); } INetworkPlayer *ClientConnection::getNetworkPlayer() @@ -152,7 +157,7 @@ INetworkPlayer *ClientConnection::getNetworkPlayer() void ClientConnection::handleLogin(shared_ptr packet) { - if (done) return; + if (done) return; PlayerUID OnlineXuid; ProfileManager.GetXUID(m_userIndex,&OnlineXuid,true); // online xuid @@ -405,26 +410,18 @@ void ClientConnection::handleLogin(shared_ptr packet) void ClientConnection::handleAddEntity(shared_ptr packet) { - double x = packet->x / 32.0; - double y = packet->y / 32.0; - double z = packet->z / 32.0; - shared_ptr e; - boolean setRot = true; + double x = packet->x / 32.0; + double y = packet->y / 32.0; + double z = packet->z / 32.0; + shared_ptr e; + bool setRot = true; // 4J-PB - replacing this massive if nest with switch switch(packet->type) { - case AddEntityPacket::MINECART_RIDEABLE: - e = shared_ptr( new Minecart(level, x, y, z, Minecart::RIDEABLE) ); - break; - case AddEntityPacket::MINECART_CHEST: - e = shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); - break; - - case AddEntityPacket::MINECART_FURNACE: - e = shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); + case AddEntityPacket::MINECART: + e = Minecart::createMinecart(level, x, y, z, packet->data); break; - case AddEntityPacket::FISH_HOOK: { // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing @@ -446,9 +443,10 @@ void ClientConnection::handleAddEntity(shared_ptr packet) } } } - shared_ptr player = dynamic_pointer_cast(owner); - if (player != NULL) + + if (owner->instanceof(eTYPE_PLAYER)) { + shared_ptr player = dynamic_pointer_cast(owner); shared_ptr hook = shared_ptr( new FishingHook(level, x, y, z, player) ); e = hook; // 4J Stu - Move the player->fishing out of the ctor as we cannot reference 'this' @@ -463,17 +461,17 @@ void ClientConnection::handleAddEntity(shared_ptr packet) case AddEntityPacket::SNOWBALL: e = shared_ptr( new Snowball(level, x, y, z) ); break; - case AddEntityPacket::ITEM_FRAME: + case AddEntityPacket::ITEM_FRAME: { int ix=(int) x; int iy=(int) y; int iz = (int) z; app.DebugPrintf("ClientConnection ITEM_FRAME xyz %d,%d,%d\n",ix,iy,iz); } - e = shared_ptr(new ItemFrame(level, (int) x, (int) y, (int) z, packet->data)); - packet->data = 0; - setRot = false; - break; + e = shared_ptr(new ItemFrame(level, (int) x, (int) y, (int) z, packet->data)); + packet->data = 0; + setRot = false; + break; case AddEntityPacket::THROWN_ENDERPEARL: e = shared_ptr( new ThrownEnderpearl(level, x, y, z) ); break; @@ -481,7 +479,7 @@ void ClientConnection::handleAddEntity(shared_ptr packet) e = shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); break; case AddEntityPacket::FIREBALL: - e = shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + e = shared_ptr( new LargeFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; break; case AddEntityPacket::SMALL_FIREBALL: @@ -507,7 +505,7 @@ void ClientConnection::handleAddEntity(shared_ptr packet) e = shared_ptr( new Boat(level, x, y, z) ); break; case AddEntityPacket::PRIMED_TNT: - e = shared_ptr( new PrimedTnt(level, x, y, z) ); + e = shared_ptr( new PrimedTnt(level, x, y, z, nullptr) ); break; case AddEntityPacket::ENDER_CRYSTAL: e = shared_ptr( new EnderCrystal(level, x, y, z) ); @@ -519,14 +517,28 @@ void ClientConnection::handleAddEntity(shared_ptr packet) e = shared_ptr( new FallingTile(level, x, y, z, packet->data & 0xFFFF, packet->data >> 16) ); packet->data = 0; break; - - - + case AddEntityPacket::WITHER_SKULL: + e = shared_ptr(new WitherSkull(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0)); + packet->data = 0; + break; + case AddEntityPacket::FIREWORKS: + e = shared_ptr(new FireworksRocketEntity(level, x, y, z, nullptr)); + break; + case AddEntityPacket::LEASH_KNOT: + e = shared_ptr(new LeashFenceKnotEntity(level, (int) x, (int) y, (int) z)); + packet->data = 0; + break; +#ifndef _FINAL_BUILD + default: + // Not a known entity (?) + assert(0); +#endif } + /* if (packet->type == AddEntityPacket::MINECART_RIDEABLE) e = shared_ptr( new Minecart(level, x, y, z, Minecart::RIDEABLE) ); - if (packet->type == AddEntityPacket::MINECART_CHEST) e = shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); - if (packet->type == AddEntityPacket::MINECART_FURNACE) e = shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); - if (packet->type == AddEntityPacket::FISH_HOOK) + if (packet->type == AddEntityPacket::MINECART_CHEST) e = shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); + if (packet->type == AddEntityPacket::MINECART_FURNACE) e = shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); + if (packet->type == AddEntityPacket::FISH_HOOK) { // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing shared_ptr owner = getEntity(packet->data); @@ -558,21 +570,21 @@ void ClientConnection::handleAddEntity(shared_ptr packet) packet->data = 0; } - if (packet->type == AddEntityPacket::ARROW) e = shared_ptr( new Arrow(level, x, y, z) ); - if (packet->type == AddEntityPacket::SNOWBALL) e = shared_ptr( new Snowball(level, x, y, z) ); + if (packet->type == AddEntityPacket::ARROW) e = shared_ptr( new Arrow(level, x, y, z) ); + if (packet->type == AddEntityPacket::SNOWBALL) e = shared_ptr( new Snowball(level, x, y, z) ); if (packet->type == AddEntityPacket::THROWN_ENDERPEARL) e = shared_ptr( new ThrownEnderpearl(level, x, y, z) ); if (packet->type == AddEntityPacket::EYEOFENDERSIGNAL) e = shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); - if (packet->type == AddEntityPacket::FIREBALL) + if (packet->type == AddEntityPacket::FIREBALL) { - e = shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); - packet->data = 0; - } + e = shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + packet->data = 0; + } if (packet->type == AddEntityPacket::SMALL_FIREBALL) { e = shared_ptr( new SmallFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; } - if (packet->type == AddEntityPacket::EGG) e = shared_ptr( new ThrownEgg(level, x, y, z) ); + if (packet->type == AddEntityPacket::EGG) e = shared_ptr( new ThrownEgg(level, x, y, z) ); if (packet->type == AddEntityPacket::THROWN_POTION) { e = shared_ptr( new ThrownPotion(level, x, y, z, packet->data) ); @@ -583,20 +595,20 @@ void ClientConnection::handleAddEntity(shared_ptr packet) e = shared_ptr( new ThrownExpBottle(level, x, y, z) ); packet->data = 0; } - if (packet->type == AddEntityPacket::BOAT) e = shared_ptr( new Boat(level, x, y, z) ); - if (packet->type == AddEntityPacket::PRIMED_TNT) e = shared_ptr( new PrimedTnt(level, x, y, z) ); + if (packet->type == AddEntityPacket::BOAT) e = shared_ptr( new Boat(level, x, y, z) ); + if (packet->type == AddEntityPacket::PRIMED_TNT) e = shared_ptr( new PrimedTnt(level, x, y, z) ); if (packet->type == AddEntityPacket::ENDER_CRYSTAL) e = shared_ptr( new EnderCrystal(level, x, y, z) ); - if (packet->type == AddEntityPacket::FALLING_SAND) e = shared_ptr( new FallingTile(level, x, y, z, Tile::sand->id) ); - if (packet->type == AddEntityPacket::FALLING_GRAVEL) e = shared_ptr( new FallingTile(level, x, y, z, Tile::gravel->id) ); + if (packet->type == AddEntityPacket::FALLING_SAND) e = shared_ptr( new FallingTile(level, x, y, z, Tile::sand->id) ); + if (packet->type == AddEntityPacket::FALLING_GRAVEL) e = shared_ptr( new FallingTile(level, x, y, z, Tile::gravel->id) ); if (packet->type == AddEntityPacket::FALLING_EGG) e = shared_ptr( new FallingTile(level, x, y, z, Tile::dragonEgg_Id) ); */ - if (e != NULL) + if (e != NULL) { - e->xp = packet->x; - e->yp = packet->y; - e->zp = packet->z; + e->xp = packet->x; + e->yp = packet->y; + e->zp = packet->z; float yRot = packet->yRot * 360 / 256.0f; float xRot = packet->xRot * 360 / 256.0f; @@ -622,20 +634,29 @@ void ClientConnection::handleAddEntity(shared_ptr packet) } } - // Note - not doing this move for frame, as the ctor for these objects does some adjustments on the position based on direction to move the object out slightly from what it is attached to, and this just overwrites it - if( packet->type != AddEntityPacket::ITEM_FRAME ) + if (packet->type == AddEntityPacket::LEASH_KNOT) + { + // 4J: "Move" leash knot to it's current position, this sets old position (like frame, leash has adjusted position) + e->absMoveTo(e->x, e->y, e->z, yRot, xRot); + } + else if(packet->type == AddEntityPacket::ITEM_FRAME) + { + // Not doing this move for frame, as the ctor for these objects does some adjustments on the position based on direction to move the object out slightly from what it is attached to, and this just overwrites it + } + else { - e->absMoveTo(x,y,z,yRot,xRot); + // For everything else, set position + e->absMoveTo(x, y, z, yRot, xRot); } - e->entityId = packet->id; - level->putEntity(packet->id, e); + e->entityId = packet->id; + level->putEntity(packet->id, e); - if (packet->data > -1) // 4J - changed "no data" value to be -1, we can have a valid entity id of 0 + if (packet->data > -1) // 4J - changed "no data" value to be -1, we can have a valid entity id of 0 { - if (packet->type == AddEntityPacket::ARROW) + if (packet->type == AddEntityPacket::ARROW) { - shared_ptr owner = getEntity(packet->data); + shared_ptr owner = getEntity(packet->data); // 4J - check all local players to find match if( owner == NULL ) @@ -653,16 +674,18 @@ void ClientConnection::handleAddEntity(shared_ptr packet) } } - if (dynamic_pointer_cast(owner) != NULL) + if ( owner != NULL && owner->instanceof(eTYPE_LIVINGENTITY) ) { - dynamic_pointer_cast(e)->owner = dynamic_pointer_cast(owner); - } - } + dynamic_pointer_cast(e)->owner = dynamic_pointer_cast(owner); + } + } - e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); - } - } + e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); + } + // 4J: Check our deferred entity link packets + checkDeferredEntityLinkPackets(e->entityId); + } } void ClientConnection::handleAddExperienceOrb(shared_ptr packet) @@ -679,43 +702,43 @@ void ClientConnection::handleAddExperienceOrb(shared_ptr void ClientConnection::handleAddGlobalEntity(shared_ptr packet) { - double x = packet->x / 32.0; - double y = packet->y / 32.0; - double z = packet->z / 32.0; - shared_ptr e;// = nullptr; - if (packet->type == AddGlobalEntityPacket::LIGHTNING) e = shared_ptr( new LightningBolt(level, x, y, z) ); - if (e != NULL) + double x = packet->x / 32.0; + double y = packet->y / 32.0; + double z = packet->z / 32.0; + shared_ptr e;// = nullptr; + if (packet->type == AddGlobalEntityPacket::LIGHTNING) e = shared_ptr( new LightningBolt(level, x, y, z) ); + if (e != NULL) { - e->xp = packet->x; - e->yp = packet->y; - e->zp = packet->z; - e->yRot = 0; - e->xRot = 0; - e->entityId = packet->id; - level->addGlobalEntity(e); - } + e->xp = packet->x; + e->yp = packet->y; + e->zp = packet->z; + e->yRot = 0; + e->xRot = 0; + e->entityId = packet->id; + level->addGlobalEntity(e); + } } void ClientConnection::handleAddPainting(shared_ptr packet) { - shared_ptr painting = shared_ptr( new Painting(level, packet->x, packet->y, packet->z, packet->dir, packet->motive) ); - level->putEntity(packet->id, painting); + shared_ptr painting = shared_ptr( new Painting(level, packet->x, packet->y, packet->z, packet->dir, packet->motive) ); + level->putEntity(packet->id, painting); } void ClientConnection::handleSetEntityMotion(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); } void ClientConnection::handleSetEntityData(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e != NULL && packet->getUnpackedData() != NULL) + shared_ptr e = getEntity(packet->id); + if (e != NULL && packet->getUnpackedData() != NULL) { - e->getEntityData()->assignValues(packet->getUnpackedData()); - } + e->getEntityData()->assignValues(packet->getUnpackedData()); + } } void ClientConnection::handleAddPlayer(shared_ptr packet) @@ -750,15 +773,15 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) } #endif - double x = packet->x / 32.0; - double y = packet->y / 32.0; - double z = packet->z / 32.0; - float yRot = packet->yRot * 360 / 256.0f; - float xRot = packet->xRot * 360 / 256.0f; - shared_ptr player = shared_ptr( new RemotePlayer(minecraft->level, packet->name) ); - player->xo = player->xOld = player->xp = packet->x; - player->yo = player->yOld = player->yp = packet->y; - player->zo = player->zOld = player->zp = packet->z; + double x = packet->x / 32.0; + double y = packet->y / 32.0; + double z = packet->z / 32.0; + float yRot = packet->yRot * 360 / 256.0f; + float xRot = packet->xRot * 360 / 256.0f; + shared_ptr player = shared_ptr( new RemotePlayer(minecraft->level, packet->name) ); + player->xo = player->xOld = player->xp = packet->x; + player->yo = player->yOld = player->yp = packet->y; + player->zo = player->zOld = player->zp = packet->z; player->xRotp = packet->xRot; player->yRotp = packet->yRot; player->yHeadRot = packet->yHeadRot * 360 / 256.0f; @@ -767,24 +790,24 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) #ifdef _DURANGO // On Durango request player display name from network manager INetworkPlayer *networkPlayer = g_NetworkManager.GetPlayerByXuid(player->getXuid()); - if (networkPlayer != NULL) player->displayName = networkPlayer->GetDisplayName(); + if (networkPlayer != NULL) player->m_displayName = networkPlayer->GetDisplayName(); #else // On all other platforms display name is just gamertag so don't check with the network manager - player->displayName = player->name; + player->m_displayName = player->name; #endif // printf("\t\t\t\t%d: Add player\n",packet->id,packet->yRot); - int item = packet->carriedItem; - if (item == 0) + int item = packet->carriedItem; + if (item == 0) { - player->inventory->items[player->inventory->selected] = shared_ptr(); // NULL; - } + player->inventory->items[player->inventory->selected] = shared_ptr(); // NULL; + } else { - player->inventory->items[player->inventory->selected] = shared_ptr( new ItemInstance(item, 1, 0) ); - } - player->absMoveTo(x, y, z, yRot, xRot); + player->inventory->items[player->inventory->selected] = shared_ptr( new ItemInstance(item, 1, 0) ); + } + player->absMoveTo(x, y, z, yRot, xRot); player->setPlayerIndex( packet->m_playerIndex ); player->setCustomSkin( packet->m_skinId ); @@ -824,7 +847,7 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) app.DebugPrintf("Custom cape for player %ls is %ls\n",player->name.c_str(),player->customTextureUrl2.c_str()); - level->putEntity(packet->id, player); + level->putEntity(packet->id, player); vector > *unpackedData = packet->getUnpackedData(); if (unpackedData != NULL) @@ -836,37 +859,44 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) void ClientConnection::handleTeleportEntity(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - e->xp = packet->x; - e->yp = packet->y; - e->zp = packet->z; - double x = e->xp / 32.0; - double y = e->yp / 32.0 + 1 / 64.0f; - double z = e->zp / 32.0; + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + e->xp = packet->x; + e->yp = packet->y; + e->zp = packet->z; + double x = e->xp / 32.0; + double y = e->yp / 32.0 + 1 / 64.0f; + double z = e->zp / 32.0; // 4J - make sure xRot stays within -90 -> 90 range int ixRot = packet->xRot; if( ixRot >= 128 ) ixRot -= 256; - float yRot = packet->yRot * 360 / 256.0f; - float xRot = ixRot * 360 / 256.0f; + float yRot = packet->yRot * 360 / 256.0f; + float xRot = ixRot * 360 / 256.0f; e->yRotp = packet->yRot; e->xRotp = ixRot; // printf("\t\t\t\t%d: Teleport to %d (lerp to %f)\n",packet->id,packet->yRot,yRot); - e->lerpTo(x, y, z, yRot, xRot, 3); + e->lerpTo(x, y, z, yRot, xRot, 3); +} + +void ClientConnection::handleSetCarriedItem(shared_ptr packet) +{ + if (packet->slot >= 0 && packet->slot < Inventory::getSelectionSize()) { + Minecraft::GetInstance()->localplayers[m_userIndex].get()->inventory->selected = packet->slot; + } } void ClientConnection::handleMoveEntity(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - e->xp += packet->xa; - e->yp += packet->ya; - e->zp += packet->za; - double x = e->xp / 32.0; + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + e->xp += packet->xa; + e->yp += packet->ya; + e->zp += packet->za; + double x = e->xp / 32.0; // 4J - The original code did not add the 1/64.0f like the teleport above did, which caused minecarts to fall through the ground - double y = e->yp / 32.0 + 1 / 64.0f; - double z = e->zp / 32.0; + double y = e->yp / 32.0 + 1 / 64.0f; + double z = e->zp / 32.0; // 4J - have changed rotation to be relative here too e->yRotp += packet->yRot; e->xRotp += packet->xRot; @@ -874,7 +904,7 @@ void ClientConnection::handleMoveEntity(shared_ptr packet) float xRot = ( e->xRotp * 360 ) / 256.0f; // float yRot = packet->hasRot ? packet->yRot * 360 / 256.0f : e->yRot; // float xRot = packet->hasRot ? packet->xRot * 360 / 256.0f : e->xRot; - e->lerpTo(x, y, z, yRot, xRot, 3); + e->lerpTo(x, y, z, yRot, xRot, 3); } void ClientConnection::handleRotateMob(shared_ptr packet) @@ -887,15 +917,15 @@ void ClientConnection::handleRotateMob(shared_ptr packet) void ClientConnection::handleMoveEntitySmall(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - e->xp += packet->xa; - e->yp += packet->ya; - e->zp += packet->za; - double x = e->xp / 32.0; + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + e->xp += packet->xa; + e->yp += packet->ya; + e->zp += packet->za; + double x = e->xp / 32.0; // 4J - The original code did not add the 1/64.0f like the teleport above did, which caused minecarts to fall through the ground - double y = e->yp / 32.0 + 1 / 64.0f; - double z = e->zp / 32.0; + double y = e->yp / 32.0 + 1 / 64.0f; + double z = e->zp / 32.0; // 4J - have changed rotation to be relative here too e->yRotp += packet->yRot; e->xRotp += packet->xRot; @@ -903,7 +933,7 @@ void ClientConnection::handleMoveEntitySmall(shared_ptr p float xRot = ( e->xRotp * 360 ) / 256.0f; // float yRot = packet->hasRot ? packet->yRot * 360 / 256.0f : e->yRot; // float xRot = packet->hasRot ? packet->xRot * 360 / 256.0f : e->xRot; - e->lerpTo(x, y, z, yRot, xRot, 3); + e->lerpTo(x, y, z, yRot, xRot, 3); } void ClientConnection::handleRemoveEntity(shared_ptr packet) @@ -916,51 +946,51 @@ void ClientConnection::handleRemoveEntity(shared_ptr packe void ClientConnection::handleMovePlayer(shared_ptr packet) { - shared_ptr player = minecraft->localplayers[m_userIndex]; //minecraft->player; - - double x = player->x; - double y = player->y; - double z = player->z; - float yRot = player->yRot; - float xRot = player->xRot; - - if (packet->hasPos) - { - x = packet->x; - y = packet->y; - z = packet->z; - } - if (packet->hasRot) - { - yRot = packet->yRot; - xRot = packet->xRot; - } - - player->ySlideOffset = 0; - player->xd = player->yd = player->zd = 0; - player->absMoveTo(x, y, z, yRot, xRot); - packet->x = player->x; - packet->y = player->bb->y0; - packet->z = player->z; - packet->yView = player->y; - connection->send(packet); - if (!started) + shared_ptr player = minecraft->localplayers[m_userIndex]; //minecraft->player; + + double x = player->x; + double y = player->y; + double z = player->z; + float yRot = player->yRot; + float xRot = player->xRot; + + if (packet->hasPos) + { + x = packet->x; + y = packet->y; + z = packet->z; + } + if (packet->hasRot) + { + yRot = packet->yRot; + xRot = packet->xRot; + } + + player->ySlideOffset = 0; + player->xd = player->yd = player->zd = 0; + player->absMoveTo(x, y, z, yRot, xRot); + packet->x = player->x; + packet->y = player->bb->y0; + packet->z = player->z; + packet->yView = player->y; + connection->send(packet); + if (!started) { if(!g_NetworkManager.IsHost() ) { Minecraft::GetInstance()->progressRenderer->progressStagePercentage((eCCConnected * 100)/ (eCCConnected)); } - player->xo = player->x; - player->yo = player->y; - player->zo = player->z; + player->xo = player->x; + player->yo = player->y; + player->zo = player->z; // 4J - added setting xOld/yOld/zOld here too, as otherwise at the start of the game we interpolate the player position from the origin to wherever its first position really is player->xOld = player->x; player->yOld = player->y; player->zOld = player->z; - started = true; - minecraft->setScreen(NULL); + started = true; + minecraft->setScreen(NULL); // Fix for #105852 - TU12: Content: Gameplay: Local splitscreen Players are spawned at incorrect places after re-joining previously saved and loaded "Mass Effect World". // Move this check from Minecraft::createExtraLocalPlayer @@ -969,7 +999,7 @@ void ClientConnection::handleMovePlayer(shared_ptr packet) { ui.CloseUIScenes(m_userIndex); } - } + } } @@ -1067,24 +1097,37 @@ void ClientConnection::handleBlockRegionUpdate(shared_ptrbIsFullChunk) { y1 = Level::maxBuildHeight; - if(packet->buffer.length > 0) LevelChunk::reorderBlocksAndDataToXZY(packet->y, packet->xs, packet->ys, packet->zs, &packet->buffer); + if(packet->buffer.length > 0) + { + PIXBeginNamedEvent(0, "Reordering to XZY"); + LevelChunk::reorderBlocksAndDataToXZY(packet->y, packet->xs, packet->ys, packet->zs, &packet->buffer); + PIXEndNamedEvent(); + } } + PIXBeginNamedEvent(0,"Clear rest region"); dimensionLevel->clearResetRegion(packet->x, packet->y, packet->z, packet->x + packet->xs - 1, y1 - 1, packet->z + packet->zs - 1); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"setBlocksAndData"); // Only full chunks send lighting information now - added flag to end of this call dimensionLevel->setBlocksAndData(packet->x, packet->y, packet->z, packet->xs, packet->ys, packet->zs, packet->buffer, packet->bIsFullChunk); + PIXEndNamedEvent(); // OutputDebugString("END BRU\n"); + PIXBeginNamedEvent(0,"removeUnusedTileEntitiesInRegion"); // 4J - remove any tite entities in this region which are associated with a tile that is now no longer a tile entity. Without doing this we end up with stray // tile entities kicking round, which leads to a bug where chests can't be properly placed again in a location after (say) a chest being removed by TNT dimensionLevel->removeUnusedTileEntitiesInRegion(packet->x, packet->y, packet->z, packet->x + packet->xs, y1, packet->z + packet->zs ); + PIXEndNamedEvent(); // If this is a full packet for a chunk, make sure that the cache now considers that it has data for this chunk - this is used to determine whether to bother // rendering mobs or not, so we don't have them in crazy positions before the data is there if( packet->bIsFullChunk ) { + PIXBeginNamedEvent(0,"dateReceivedForChunk"); dimensionLevel->dataReceivedForChunk( packet->x >> 4, packet->z >> 4 ); + PIXEndNamedEvent(); } PIXEndNamedEvent(); } @@ -1150,22 +1193,22 @@ void ClientConnection::handleTileUpdate(shared_ptr packet) void ClientConnection::handleDisconnect(shared_ptr packet) { connection->close(DisconnectPacket::eDisconnect_Kicked); - done = true; + done = true; Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->connectionDisconnected( m_userIndex , packet->reason ); app.SetDisconnectReason( packet->reason ); app.SetAction(m_userIndex,eAppAction_ExitWorld,(void *)TRUE); - //minecraft->setLevel(NULL); + //minecraft->setLevel(NULL); //minecraft->setScreen(new DisconnectedScreen(L"disconnect.disconnected", L"disconnect.genericReason", &packet->reason)); } void ClientConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) { - if (done) return; - done = true; + if (done) return; + done = true; Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->connectionDisconnected( m_userIndex , reason ); @@ -1180,34 +1223,34 @@ void ClientConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_EXITING_GAME, IDS_GENERIC_ERROR, uiIDA, 1, ProfileManager.GetPrimaryPad(),&ClientConnection::HostDisconnectReturned,NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_EXITING_GAME, IDS_GENERIC_ERROR, uiIDA, 1, ProfileManager.GetPrimaryPad(),&ClientConnection::HostDisconnectReturned,NULL); } else { app.SetAction(m_userIndex,eAppAction_ExitWorld,(void *)TRUE); } - //minecraft->setLevel(NULL); - //minecraft->setScreen(new DisconnectedScreen(L"disconnect.lost", reason, reasonObjects)); + //minecraft->setLevel(NULL); + //minecraft->setScreen(new DisconnectedScreen(L"disconnect.lost", reason, reasonObjects)); } void ClientConnection::sendAndDisconnect(shared_ptr packet) { - if (done) return; - connection->send(packet); - connection->sendAndQuit(); + if (done) return; + connection->send(packet); + connection->sendAndQuit(); } void ClientConnection::send(shared_ptr packet) { - if (done) return; - connection->send(packet); + if (done) return; + connection->send(packet); } void ClientConnection::handleTakeItemEntity(shared_ptr packet) { - shared_ptr from = getEntity(packet->itemId); - shared_ptr to = dynamic_pointer_cast(getEntity(packet->playerId)); + shared_ptr from = getEntity(packet->itemId); + shared_ptr to = dynamic_pointer_cast(getEntity(packet->playerId)); // 4J - the original game could assume that if getEntity didn't find the player, it must be the local player. We // need to search all local players @@ -1225,15 +1268,15 @@ void ClientConnection::handleTakeItemEntity(shared_ptr pac } } - if (to == NULL) + if (to == NULL) { // Don't know if this should ever really happen, but seems safest to try and remove the entity that has been collected even if we can't // create a particle as we don't know what really collected it level->removeEntity(packet->itemId); - return; - } + return; + } - if (from != NULL) + if (from != NULL) { // If this is a local player, then we only want to do processing for it if this connection is associated with the player it is for. In // particular, we don't want to remove the item entity until we are processing it for the right connection, or else we won't have a valid @@ -1277,7 +1320,7 @@ void ClientConnection::handleTakeItemEntity(shared_ptr pac minecraft->particleEngine->add( shared_ptr( new TakeAnimationParticle(minecraft->level, from, to, -0.5f) ) ); level->removeEntity(packet->itemId); } - } + } } @@ -1287,6 +1330,10 @@ void ClientConnection::handleChat(shared_ptr packet) int iPos; bool displayOnGui = true; + bool replacePlayer = false; + bool replaceEntitySource = false; + bool replaceItem = false; + wstring playerDisplayName = L""; wstring sourceDisplayName = L""; @@ -1337,134 +1384,213 @@ void ClientConnection::handleChat(shared_ptr packet) break; case ChatPacket::e_ChatDeathInFire: message=app.GetString(IDS_DEATH_INFIRE); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathOnFire: message=app.GetString(IDS_DEATH_ONFIRE); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathLava: message=app.GetString(IDS_DEATH_LAVA); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathInWall: message=app.GetString(IDS_DEATH_INWALL); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathDrown: message=app.GetString(IDS_DEATH_DROWN); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathStarve: message=app.GetString(IDS_DEATH_STARVE); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathCactus: message=app.GetString(IDS_DEATH_CACTUS); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathFall: message=app.GetString(IDS_DEATH_FALL); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathOutOfWorld: message=app.GetString(IDS_DEATH_OUTOFWORLD); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathGeneric: message=app.GetString(IDS_DEATH_GENERIC); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathExplosion: message=app.GetString(IDS_DEATH_EXPLOSION); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathMagic: message=app.GetString(IDS_DEATH_MAGIC); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathAnvil: message=app.GetString(IDS_DEATH_FALLING_ANVIL); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathFallingBlock: message=app.GetString(IDS_DEATH_FALLING_TILE); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathDragonBreath: message=app.GetString(IDS_DEATH_DRAGON_BREATH); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathMob: message=app.GetString(IDS_DEATH_MOB); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathPlayer: message=app.GetString(IDS_DEATH_PLAYER); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathArrow: message=app.GetString(IDS_DEATH_ARROW); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathFireball: message=app.GetString(IDS_DEATH_FIREBALL); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",packet->m_stringArgs[1]); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathThrown: message=app.GetString(IDS_DEATH_THROWN); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathIndirectMagic: message=app.GetString(IDS_DEATH_INDIRECT_MAGIC); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathThorns: message=app.GetString(IDS_DEATH_THORNS); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; + break; + + + case ChatPacket::e_ChatDeathFellAccidentLadder: + message=app.GetString(IDS_DEATH_FELL_ACCIDENT_LADDER); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellAccidentVines: + message=app.GetString(IDS_DEATH_FELL_ACCIDENT_VINES); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellAccidentWater: + message=app.GetString(IDS_DEATH_FELL_ACCIDENT_WATER); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellAccidentGeneric: + message=app.GetString(IDS_DEATH_FELL_ACCIDENT_GENERIC); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellKiller: + //message=app.GetString(IDS_DEATH_FELL_KILLER); + //replacePlayer = true; + //replaceEntitySource = true; + + // 4J Stu - The correct string for here, IDS_DEATH_FELL_KILLER is incorrect. We can't change localisation, so use a different string for now + message=app.GetString(IDS_DEATH_FALL); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellAssist: + message=app.GetString(IDS_DEATH_FELL_ASSIST); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathFellAssistItem: + message=app.GetString(IDS_DEATH_FELL_ASSIST_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathFellFinish: + message=app.GetString(IDS_DEATH_FELL_FINISH); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathFellFinishItem: + message=app.GetString(IDS_DEATH_FELL_FINISH_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathInFirePlayer: + message=app.GetString(IDS_DEATH_INFIRE_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathOnFirePlayer: + message=app.GetString(IDS_DEATH_ONFIRE_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathLavaPlayer: + message=app.GetString(IDS_DEATH_LAVA_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathDrownPlayer: + message=app.GetString(IDS_DEATH_DROWN_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathCactusPlayer: + message=app.GetString(IDS_DEATH_CACTUS_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathExplosionPlayer: + message=app.GetString(IDS_DEATH_EXPLOSION_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathWither: + message=app.GetString(IDS_DEATH_WITHER); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathPlayerItem: + message=app.GetString(IDS_DEATH_PLAYER_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathArrowItem: + message=app.GetString(IDS_DEATH_ARROW_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathFireballItem: + message=app.GetString(IDS_DEATH_FIREBALL_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathThrownItem: + message=app.GetString(IDS_DEATH_THROWN_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathIndirectMagicItem: + message=app.GetString(IDS_DEATH_INDIRECT_MAGIC_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; break; + case ChatPacket::e_ChatPlayerEnteredEnd: message=app.GetString(IDS_PLAYER_ENTERED_END); iPos=message.find(L"%s"); @@ -1498,6 +1624,9 @@ void ClientConnection::handleChat(shared_ptr packet) case ChatPacket::e_ChatPlayerMaxWolves: message=app.GetString(IDS_MAX_WOLVES_SPAWNED); break; + case ChatPacket::e_ChatPlayerMaxBats: + message=app.GetString(IDS_MAX_BATS_SPAWNED); + break; // Breeding case ChatPacket::e_ChatPlayerMaxBredPigsSheepCows: @@ -1535,23 +1664,23 @@ void ClientConnection::handleChat(shared_ptr packet) case ChatPacket::e_ChatCommandTeleportSuccess: message=app.GetString(IDS_COMMAND_TELEPORT_SUCCESS); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) { - message = replaceAll(message,L"{*DESTINATION*}",packet->m_stringArgs[1]); + message = replaceAll(message,L"{*DESTINATION*}", sourceDisplayName); } else { - message = replaceAll(message,L"{*DESTINATION*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); + message = replaceAll(message,L"{*DESTINATION*}", app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); } break; case ChatPacket::e_ChatCommandTeleportMe: message=app.GetString(IDS_COMMAND_TELEPORT_ME); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatCommandTeleportToMe: message=app.GetString(IDS_COMMAND_TELEPORT_TO_ME); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; default: @@ -1559,30 +1688,63 @@ void ClientConnection::handleChat(shared_ptr packet) break; } + + if(replacePlayer) + { + message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + } + + if(replaceEntitySource) + { + if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) + { + message = replaceAll(message,L"{*SOURCE*}", sourceDisplayName); + } + else + { + wstring entityName; + + // Check for a custom mob name + if (packet->m_stringArgs.size() >= 2 && !packet->m_stringArgs[1].empty()) + { + entityName = packet->m_stringArgs[1]; + } + else + { + entityName = app.getEntityName((eINSTANCEOF) packet->m_intArgs[0]); + } + + message = replaceAll(message,L"{*SOURCE*}", entityName); + } + } + + if (replaceItem) + { + message = replaceAll(message,L"{*ITEM*}", packet->m_stringArgs[2]); + } + // flag that a message is a death message - bool bIsDeathMessage = (packet->m_messageType>=ChatPacket::e_ChatDeathInFire) && (packet->m_messageType<=ChatPacket::e_ChatDeathDragonBreath); + bool bIsDeathMessage = (packet->m_messageType>=ChatPacket::e_ChatDeathInFire) && (packet->m_messageType<=ChatPacket::e_ChatDeathIndirectMagicItem); if( displayOnGui ) minecraft->gui->addMessage(message,m_userIndex, bIsDeathMessage); } void ClientConnection::handleAnimate(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - if (packet->action == AnimatePacket::SWING) + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + if (packet->action == AnimatePacket::SWING) { - shared_ptr player = dynamic_pointer_cast(e); - if(player != NULL) player->swing(); - } + if (e->instanceof(eTYPE_LIVINGENTITY)) dynamic_pointer_cast(e)->swing(); + } else if (packet->action == AnimatePacket::HURT) { - e->animateHurt(); - } + e->animateHurt(); + } else if (packet->action == AnimatePacket::WAKE_UP) { - shared_ptr player = dynamic_pointer_cast(e); - if(player != NULL) player->stopSleepInBed(false, false, false); - } + if (e->instanceof(eTYPE_PLAYER)) dynamic_pointer_cast(e)->stopSleepInBed(false, false, false); + } else if (packet->action == AnimatePacket::RESPAWN) { } @@ -1597,27 +1759,27 @@ void ClientConnection::handleAnimate(shared_ptr packet) shared_ptr critParticle = shared_ptr( new CritParticle(minecraft->level, e, eParticleType_magicCrit) ); critParticle->CritParticlePostConstructor(); minecraft->particleEngine->add(critParticle); - } - else if (packet->action == AnimatePacket::EAT && dynamic_pointer_cast(e) != NULL) + } + else if ( (packet->action == AnimatePacket::EAT) && e->instanceof(eTYPE_REMOTEPLAYER) ) { - } + } } void ClientConnection::handleEntityActionAtPosition(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - if (packet->action == EntityActionAtPositionPacket::START_SLEEP) + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + if (packet->action == EntityActionAtPositionPacket::START_SLEEP) { - shared_ptr player = dynamic_pointer_cast(e); - player->startSleepInBed(packet->x, packet->y, packet->z); + shared_ptr player = dynamic_pointer_cast(e); + player->startSleepInBed(packet->x, packet->y, packet->z); if( player == minecraft->localplayers[m_userIndex] ) { TelemetryManager->RecordEnemyKilledOrOvercome(m_userIndex, 0, player->y, 0, 0, 0, 0, eTelemetryInGame_UseBed); } - } + } } void ClientConnection::handlePreLogin(shared_ptr packet) @@ -1660,7 +1822,7 @@ void ClientConnection::handlePreLogin(shared_ptr packet) PlayerUID playerXuid = INVALID_XUID; if( ProfileManager.IsSignedInLive(idx) ) { - ProfileManager.GetXUID(idx,&playerXuid,true); + ProfileManager.GetXUID(idx,&playerXuid,true); } if( playerXuid != INVALID_XUID ) { @@ -1690,7 +1852,7 @@ void ClientConnection::handlePreLogin(shared_ptr packet) PlayerUID playerXuid = INVALID_XUID; if( ProfileManager.IsSignedInLive(m_userIndex) ) { - ProfileManager.GetXUID(m_userIndex,&playerXuid,true); + ProfileManager.GetXUID(m_userIndex,&playerXuid,true); } if( playerXuid != INVALID_XUID ) { @@ -1718,11 +1880,11 @@ void ClientConnection::handlePreLogin(shared_ptr packet) if( ProfileManager.IsSignedInLive(idx) ) { // need to use the XUID here - PlayerUID playerXUID = INVALID_XUID; + PlayerUID playerXUID = INVALID_XUID; if( !ProfileManager.IsGuest( idx ) ) { // Guest don't have an offline XUID as they cannot play offline, so use their online one - ProfileManager.GetXUID(idx,&playerXUID,true); + ProfileManager.GetXUID(idx,&playerXUID,true); } if( ProfileManager.AreXUIDSEqual(playerXUID,packet->m_playerXuids[i]) ) localPlayer = true; } @@ -1995,8 +2157,8 @@ void ClientConnection::handlePreLogin(shared_ptr packet) app.DebugPrintf("Exiting player %d on handling Pre-Login packet due UGC privileges: %d\n", m_userIndex, reason); UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - if(!isFriendsWithHost) ui.RequestMessageBox( IDS_CANTJOIN_TITLE, IDS_NOTALLOWED_FRIENDSOFFRIENDS, uiIDA,1,m_userIndex,NULL,NULL, app.GetStringTable()); - else ui.RequestMessageBox( IDS_CANTJOIN_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL, uiIDA,1,m_userIndex,NULL,NULL, app.GetStringTable()); + if(!isFriendsWithHost) ui.RequestErrorMessage( IDS_CANTJOIN_TITLE, IDS_NOTALLOWED_FRIENDSOFFRIENDS, uiIDA,1,m_userIndex); + else ui.RequestErrorMessage( IDS_CANTJOIN_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL, uiIDA,1,m_userIndex); app.SetDisconnectReason( reason ); @@ -2029,7 +2191,9 @@ void ClientConnection::handlePreLogin(shared_ptr packet) app.DebugPrintf("Could not select texture pack %d from Pre-Login packet, requesting from host\n", packet->m_texturePackId); // 4J-PB - we need to upsell the texture pack to the player - //app.SetAction(m_userIndex,eAppAction_TexturePackRequired); +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + app.SetAction(m_userIndex,eAppAction_TexturePackRequired); +#endif // Let the player go into the game, and we'll check that they are using the right texture pack when in } } @@ -2039,12 +2203,12 @@ void ClientConnection::handlePreLogin(shared_ptr packet) Minecraft::GetInstance()->progressRenderer->progressStagePercentage((eCCPreLoginReceived * 100)/ (eCCConnected)); } // need to use the XUID here - PlayerUID offlineXUID = INVALID_XUID; + PlayerUID offlineXUID = INVALID_XUID; PlayerUID onlineXUID = INVALID_XUID; if( ProfileManager.IsSignedInLive(m_userIndex) ) { // Guest don't have an offline XUID as they cannot play offline, so use their online one - ProfileManager.GetXUID(m_userIndex,&onlineXUID,true); + ProfileManager.GetXUID(m_userIndex,&onlineXUID,true); } #ifdef __PSVITA__ if(CGameNetworkManager::usingAdhocMode() && onlineXUID.getOnlineID()[0] == 0) @@ -2060,7 +2224,7 @@ void ClientConnection::handlePreLogin(shared_ptr packet) #endif { // All other players we use their offline XUID so that they can play the game offline - ProfileManager.GetXUID(m_userIndex,&offlineXUID,false); + ProfileManager.GetXUID(m_userIndex,&offlineXUID,false); } BOOL allAllowed, friendsAllowed; ProfileManager.AllowedPlayerCreatedContent(m_userIndex,true,&allAllowed,&friendsAllowed); @@ -2074,25 +2238,25 @@ void ClientConnection::handlePreLogin(shared_ptr packet) } #else // 4J - removed - if (packet->loginKey.equals("-")) { - send(new LoginPacket(minecraft->user.name, SharedConstants.NETWORK_PROTOCOL_VERSION)); - } else { - try { - URL url = new URL("http://www.minecraft->net/game/joinserver.jsp?user=" + minecraft->user.name + "&sessionId=" + minecraft->user.sessionId + "&serverId=" + packet->loginKey); - BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); - String msg = br.readLine(); - br.close(); - - if (msg.equalsIgnoreCase("ok")) { - send(new LoginPacket(minecraft->user.name, SharedConstants.NETWORK_PROTOCOL_VERSION)); - } else { - connection.close("disconnect.loginFailedInfo", msg); - } - } catch (Exception e) { - e.printStackTrace(); - connection.close("disconnect.genericReason", "Internal client error: " + e.toString()); - } - } + if (packet->loginKey.equals("-")) { + send(new LoginPacket(minecraft->user.name, SharedConstants.NETWORK_PROTOCOL_VERSION)); + } else { + try { + URL url = new URL("http://www.minecraft->net/game/joinserver.jsp?user=" + minecraft->user.name + "&sessionId=" + minecraft->user.sessionId + "&serverId=" + packet->loginKey); + BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); + String msg = br.readLine(); + br.close(); + + if (msg.equalsIgnoreCase("ok")) { + send(new LoginPacket(minecraft->user.name, SharedConstants.NETWORK_PROTOCOL_VERSION)); + } else { + connection.close("disconnect.loginFailedInfo", msg); + } + } catch (Exception e) { + e.printStackTrace(); + connection.close("disconnect.genericReason", "Internal client error: " + e.toString()); + } + } #endif } @@ -2100,8 +2264,8 @@ void ClientConnection::close() { // If it's already done, then we don't need to do anything here. And in fact trying to do something could cause a crash if(done) return; - done = true; - connection->flush(); + done = true; + connection->flush(); connection->close(DisconnectPacket::eDisconnect_Closed); } @@ -2113,7 +2277,7 @@ void ClientConnection::handleAddMob(shared_ptr packet) float yRot = packet->yRot * 360 / 256.0f; float xRot = packet->xRot * 360 / 256.0f; - shared_ptr mob = dynamic_pointer_cast(EntityIO::newById(packet->type, level)); + shared_ptr mob = dynamic_pointer_cast(EntityIO::newById(packet->type, level)); mob->xp = packet->x; mob->yp = packet->y; mob->zp = packet->z; @@ -2160,43 +2324,83 @@ void ClientConnection::handleAddMob(shared_ptr packet) void ClientConnection::handleSetTime(shared_ptr packet) { - minecraft->level->setTime(packet->time); + minecraft->level->setGameTime(packet->gameTime); + minecraft->level->setDayTime(packet->dayTime); } void ClientConnection::handleSetSpawn(shared_ptr packet) { - //minecraft->player->setRespawnPosition(new Pos(packet->x, packet->y, packet->z)); - minecraft->localplayers[m_userIndex]->setRespawnPosition(new Pos(packet->x, packet->y, packet->z)); - minecraft->level->getLevelData()->setSpawn(packet->x, packet->y, packet->z); + //minecraft->player->setRespawnPosition(new Pos(packet->x, packet->y, packet->z)); + minecraft->localplayers[m_userIndex]->setRespawnPosition(new Pos(packet->x, packet->y, packet->z), true); + minecraft->level->getLevelData()->setSpawn(packet->x, packet->y, packet->z); } -void ClientConnection::handleRidePacket(shared_ptr packet) +void ClientConnection::handleEntityLinkPacket(shared_ptr packet) { - shared_ptr rider = getEntity(packet->riderId); - shared_ptr ridden = getEntity(packet->riddenId); + shared_ptr sourceEntity = getEntity(packet->sourceId); + shared_ptr destEntity = getEntity(packet->destId); - shared_ptr boat = dynamic_pointer_cast(ridden); - //if (packet->riderId == minecraft->player->entityId) rider = minecraft->player; - if (packet->riderId == minecraft->localplayers[m_userIndex]->entityId) + // 4J: If the destination entity couldn't be found, defer handling of this packet + // This was added to support leashing (the entity link packet is sent before the add entity packet) + if (destEntity == NULL && packet->destId >= 0) { - rider = minecraft->localplayers[m_userIndex]; + // We don't handle missing source entities because it shouldn't happen + assert(!(sourceEntity == NULL && packet->sourceId >= 0)); - if (boat) boat->setDoLerp(false); + deferredEntityLinkPackets.push_back(DeferredEntityLinkPacket(packet)); + return; } - else if (boat) + + if (packet->type == SetEntityLinkPacket::RIDING) { - boat->setDoLerp(true); - } - if (rider == NULL) return; + bool displayMountMessage = false; + if (packet->sourceId == Minecraft::GetInstance()->localplayers[m_userIndex].get()->entityId) + { + sourceEntity = Minecraft::GetInstance()->localplayers[m_userIndex]; - rider->ride(ridden); + if (destEntity != NULL && destEntity->instanceof(eTYPE_BOAT)) (dynamic_pointer_cast(destEntity))->setDoLerp(false); + + displayMountMessage = (sourceEntity->riding == NULL && destEntity != NULL); + } + else if (destEntity != NULL && destEntity->instanceof(eTYPE_BOAT)) + { + (dynamic_pointer_cast(destEntity))->setDoLerp(true); + } + + if (sourceEntity == NULL) return; + + sourceEntity->ride(destEntity); + + // 4J TODO: pretty sure this message is a tooltip so not needed + /* + if (displayMountMessage) { + Options options = minecraft.options; + minecraft.gui.setOverlayMessage(I18n.get("mount.onboard", Options.getTranslatedKeyMessage(options.keySneak.key)), false); + } + */ + } + else if (packet->type == SetEntityLinkPacket::LEASH) + { + if ( (sourceEntity != NULL) && sourceEntity->instanceof(eTYPE_MOB) ) + { + if (destEntity != NULL) + { + + (dynamic_pointer_cast(sourceEntity))->setLeashedTo(destEntity, false); + } + else + { + (dynamic_pointer_cast(sourceEntity))->dropLeash(false, false); + } + } + } } void ClientConnection::handleEntityEvent(shared_ptr packet) { - shared_ptr e = getEntity(packet->entityId); - if (e != NULL) e->handleEntityEvent(packet->eventId); + shared_ptr e = getEntity(packet->entityId); + if (e != NULL) e->handleEntityEvent(packet->eventId); } shared_ptr ClientConnection::getEntity(int entityId) @@ -2326,9 +2530,8 @@ void ClientConnection::handleTextureAndGeometry(shared_ptr packet) { shared_ptr e = getEntity(packet->id); - if (e == NULL) return; + if ( (e == NULL) || !e->instanceof(eTYPE_PLAYER) ) return; shared_ptr player = dynamic_pointer_cast(e); - if( e == NULL) return; bool isLocalPlayer = false; for( int i = 0; i < XUSER_MAX_COUNT; i++ ) @@ -2426,11 +2629,11 @@ void ClientConnection::handleTextureAndGeometryChange(shared_ptr packet) { - //if (packet->dimension != minecraft->player->dimension) + //if (packet->dimension != minecraft->player->dimension) if( packet->dimension != minecraft->localplayers[m_userIndex]->dimension || packet->mapSeed != minecraft->localplayers[m_userIndex]->level->getSeed() ) { int oldDimension = minecraft->localplayers[m_userIndex]->dimension; - started = false; + started = false; // Remove client connection from this level level->removeClientConnection(this, false); @@ -2474,7 +2677,7 @@ void ClientConnection::handleRespawn(shared_ptr packet) //minecraft->player->dimension = packet->dimension; minecraft->localplayers[m_userIndex]->dimension = packet->dimension; - //minecraft->setScreen(new ReceivingLevelScreen(this)); + //minecraft->setScreen(new ReceivingLevelScreen(this)); // minecraft->addPendingLocalConnection(m_userIndex, this); #ifdef _XBOX @@ -2524,15 +2727,15 @@ void ClientConnection::handleRespawn(shared_ptr packet) } app.SetAction( m_userIndex, eAppAction_WaitForDimensionChangeComplete); - } + } - //minecraft->respawnPlayer(minecraft->player->GetXboxPad(),true, packet->dimension); + //minecraft->respawnPlayer(minecraft->player->GetXboxPad(),true, packet->dimension); // Wrap respawnPlayer call up in code to set & restore the player/gamemode etc. as some things // in there assume that we are set up for the player that the respawn is coming in for int oldIndex = minecraft->getLocalPlayerIdx(); minecraft->setLocalPlayerIdx(m_userIndex); - minecraft->respawnPlayer(minecraft->localplayers[m_userIndex]->GetXboxPad(),packet->dimension,packet->m_newEntityId); + minecraft->respawnPlayer(minecraft->localplayers[m_userIndex]->GetXboxPad(),packet->dimension,packet->m_newEntityId); ((MultiPlayerGameMode *) minecraft->localgameModes[m_userIndex])->setLocalMode(packet->playerGameType); minecraft->setLocalPlayerIdx(oldIndex); } @@ -2543,7 +2746,7 @@ void ClientConnection::handleExplosion(shared_ptr packet) { //app.DebugPrintf("Received ExplodePacket with explosion data\n"); PIXBeginNamedEvent(0,"Handling explosion"); - Explosion *e = new Explosion(minecraft->level, nullptr, packet->x, packet->y, packet->z, packet->r); + Explosion *e = new Explosion(minecraft->level, nullptr, packet->x, packet->y, packet->z, packet->r); PIXBeginNamedEvent(0,"Finalizing"); // Fix for #81758 - TCR 006 BAS Non-Interactive Pause: TU9: Performance: Gameplay: After detonating bunch of TNT, game enters unresponsive state for couple of seconds. @@ -2575,9 +2778,38 @@ void ClientConnection::handleContainerOpen(shared_ptr packe shared_ptr player = minecraft->localplayers[m_userIndex]; switch(packet->type) { + case ContainerOpenPacket::BONUS_CHEST: + case ContainerOpenPacket::LARGE_CHEST: + case ContainerOpenPacket::ENDER_CHEST: case ContainerOpenPacket::CONTAINER: + case ContainerOpenPacket::MINECART_CHEST: { - if( player->openContainer(shared_ptr( new SimpleContainer(packet->title, packet->size) ))) + int chestString; + switch (packet->type) + { + case ContainerOpenPacket::MINECART_CHEST: chestString = IDS_ITEM_MINECART; break; + case ContainerOpenPacket::BONUS_CHEST: chestString = IDS_BONUS_CHEST; break; + case ContainerOpenPacket::LARGE_CHEST: chestString = IDS_CHEST_LARGE; break; + case ContainerOpenPacket::ENDER_CHEST: chestString = IDS_TILE_ENDERCHEST; break; + case ContainerOpenPacket::CONTAINER: chestString = IDS_CHEST; break; + default: assert(false); chestString = -1; break; + } + + if( player->openContainer(shared_ptr( new SimpleContainer(chestString, packet->title, packet->customName, packet->size) ))) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::HOPPER: + { + shared_ptr hopper = shared_ptr(new HopperTileEntity()); + if (packet->customName) hopper->setCustomName(packet->title); + if(player->openHopper(hopper)) { player->containerMenu->containerId = packet->containerId; } @@ -2589,7 +2821,9 @@ void ClientConnection::handleContainerOpen(shared_ptr packe break; case ContainerOpenPacket::FURNACE: { - if( player->openFurnace(shared_ptr( new FurnaceTileEntity() )) ) + shared_ptr furnace = shared_ptr(new FurnaceTileEntity()); + if (packet->customName) furnace->setCustomName(packet->title); + if(player->openFurnace(furnace)) { player->containerMenu->containerId = packet->containerId; } @@ -2601,7 +2835,10 @@ void ClientConnection::handleContainerOpen(shared_ptr packe break; case ContainerOpenPacket::BREWING_STAND: { - if( player->openBrewingStand(shared_ptr( new BrewingStandTileEntity() )) ) + shared_ptr brewingStand = shared_ptr(new BrewingStandTileEntity()); + if (packet->customName) brewingStand->setCustomName(packet->title); + + if( player->openBrewingStand(brewingStand)) { player->containerMenu->containerId = packet->containerId; } @@ -2611,9 +2848,27 @@ void ClientConnection::handleContainerOpen(shared_ptr packe } } break; + case ContainerOpenPacket::DROPPER: + { + shared_ptr dropper = shared_ptr(new DropperTileEntity()); + if (packet->customName) dropper->setCustomName(packet->title); + + if( player->openTrap(dropper)) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; case ContainerOpenPacket::TRAP: { - if( player->openTrap(shared_ptr( new DispenserTileEntity() )) ) + shared_ptr dispenser = shared_ptr(new DispenserTileEntity()); + if (packet->customName) dispenser->setCustomName(packet->title); + + if( player->openTrap(dispenser)) { player->containerMenu->containerId = packet->containerId; } @@ -2637,7 +2892,7 @@ void ClientConnection::handleContainerOpen(shared_ptr packe break; case ContainerOpenPacket::ENCHANTMENT: { - if( player->startEnchanting(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)) ) + if( player->startEnchanting(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z), packet->customName ? packet->title : L"") ) { player->containerMenu->containerId = packet->containerId; } @@ -2649,9 +2904,9 @@ void ClientConnection::handleContainerOpen(shared_ptr packe break; case ContainerOpenPacket::TRADER_NPC: { - shared_ptr csm = shared_ptr(new ClientSideMerchant(player,packet->title)); + shared_ptr csm = shared_ptr(new ClientSideMerchant(player, packet->title)); csm->createContainer(); - if(player->openTrading(csm)) + if(player->openTrading(csm, packet->customName ? packet->title : L"")) { player->containerMenu->containerId = packet->containerId; } @@ -2661,6 +2916,21 @@ void ClientConnection::handleContainerOpen(shared_ptr packe } } break; + case ContainerOpenPacket::BEACON: + { + shared_ptr beacon = shared_ptr(new BeaconTileEntity()); + if (packet->customName) beacon->setCustomName(packet->title); + + if(player->openBeacon(beacon)) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; case ContainerOpenPacket::REPAIR_TABLE: { if(player->startRepairing(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z))) @@ -2673,7 +2943,42 @@ void ClientConnection::handleContainerOpen(shared_ptr packe } } break; - }; + case ContainerOpenPacket::HORSE: + { + shared_ptr entity = dynamic_pointer_cast( getEntity(packet->entityId) ); + int iTitle = IDS_CONTAINER_ANIMAL; + switch(entity->getType()) + { + case EntityHorse::TYPE_DONKEY: + iTitle = IDS_DONKEY; + break; + case EntityHorse::TYPE_MULE: + iTitle = IDS_MULE; + break; + }; + if(player->openHorseInventory(dynamic_pointer_cast(entity), shared_ptr(new AnimalChest(iTitle, packet->title, packet->customName, packet->size)))) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::FIREWORKS: + { + if( player->openFireworks(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)) ) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + } if(failed) { @@ -2694,13 +2999,13 @@ void ClientConnection::handleContainerOpen(shared_ptr packe void ClientConnection::handleContainerSetSlot(shared_ptr packet) { shared_ptr player = minecraft->localplayers[m_userIndex]; - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) { - player->inventory->setCarried(packet->item); - } + player->inventory->setCarried(packet->item); + } else { - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) { // 4J Stu - Reworked a bit to fix a bug where things being collected while the creative menu was up replaced items in the creative menu if(packet->slot >= 36 && packet->slot < 36 + 9) @@ -2718,72 +3023,90 @@ void ClientConnection::handleContainerSetSlot(shared_ptr } else if (packet->containerId == player->containerMenu->containerId) { - player->containerMenu->setItem(packet->slot, packet->item); - } - } + player->containerMenu->setItem(packet->slot, packet->item); + } + } } void ClientConnection::handleContainerAck(shared_ptr packet) { shared_ptr player = minecraft->localplayers[m_userIndex]; - AbstractContainerMenu *menu = NULL; - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) + AbstractContainerMenu *menu = NULL; + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) { - menu = player->inventoryMenu; - } + menu = player->inventoryMenu; + } else if (packet->containerId == player->containerMenu->containerId) { - menu = player->containerMenu; - } - if (menu != NULL) + menu = player->containerMenu; + } + if (menu != NULL) { - if (!packet->accepted) + if (!packet->accepted) { - send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) )); - } - } + send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) )); + } + } } void ClientConnection::handleContainerContent(shared_ptr packet) { shared_ptr player = minecraft->localplayers[m_userIndex]; - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) { - player->inventoryMenu->setAll(&packet->items); - } + player->inventoryMenu->setAll(&packet->items); + } else if (packet->containerId == player->containerMenu->containerId) { - player->containerMenu->setAll(&packet->items); - } + player->containerMenu->setAll(&packet->items); + } +} + +void ClientConnection::handleTileEditorOpen(shared_ptr packet) +{ + shared_ptr tileEntity = level->getTileEntity(packet->x, packet->y, packet->z); + if (tileEntity != NULL) + { + minecraft->localplayers[m_userIndex]->openTextEdit(tileEntity); + } + else if (packet->editorType == TileEditorOpenPacket::SIGN) + { + shared_ptr localSignDummy = shared_ptr(new SignTileEntity()); + localSignDummy->setLevel(level); + localSignDummy->x = packet->x; + localSignDummy->y = packet->y; + localSignDummy->z = packet->z; + minecraft->player->openTextEdit(localSignDummy); + } } void ClientConnection::handleSignUpdate(shared_ptr packet) { app.DebugPrintf("ClientConnection::handleSignUpdate - "); - if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) + if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) { - shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); + shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); // 4J-PB - on a client connecting, the line below fails - if (dynamic_pointer_cast(te) != NULL) + if (dynamic_pointer_cast(te) != NULL) { - shared_ptr ste = dynamic_pointer_cast(te); - for (int i = 0; i < MAX_SIGN_LINES; i++) + shared_ptr ste = dynamic_pointer_cast(te); + for (int i = 0; i < MAX_SIGN_LINES; i++) { ste->SetMessage(i,packet->lines[i]); - } + } app.DebugPrintf("verified = %d\tCensored = %d\n",packet->m_bVerified,packet->m_bCensored); ste->SetVerified(packet->m_bVerified); ste->SetCensored(packet->m_bCensored); - ste->setChanged(); - } + ste->setChanged(); + } else { app.DebugPrintf("dynamic_pointer_cast(te) == NULL\n"); } - } + } else { app.DebugPrintf("hasChunkAt failed\n"); @@ -2802,14 +3125,14 @@ void ClientConnection::handleTileEntityData(shared_ptr pac { dynamic_pointer_cast(te)->load(packet->tag); } - //else if (packet.type == TileEntityDataPacket.TYPE_ADV_COMMAND && (te instanceof CommandBlockEntity)) - //{ - // ((CommandBlockEntity) te).load(packet.tag); - //} - //else if (packet.type == TileEntityDataPacket.TYPE_BEACON && (te instanceof BeaconTileEntity)) - //{ - // ((BeaconTileEntity) te).load(packet.tag); - //} + else if (packet->type == TileEntityDataPacket::TYPE_ADV_COMMAND && dynamic_pointer_cast(te) != NULL) + { + dynamic_pointer_cast(te)->load(packet->tag); + } + else if (packet->type == TileEntityDataPacket::TYPE_BEACON && dynamic_pointer_cast(te) != NULL) + { + dynamic_pointer_cast(te)->load(packet->tag); + } else if (packet->type == TileEntityDataPacket::TYPE_SKULL && dynamic_pointer_cast(te) != NULL) { dynamic_pointer_cast(te)->load(packet->tag); @@ -2820,26 +3143,26 @@ void ClientConnection::handleTileEntityData(shared_ptr pac void ClientConnection::handleContainerSetData(shared_ptr packet) { - onUnhandledPacket(packet); - if (minecraft->localplayers[m_userIndex]->containerMenu != NULL && minecraft->localplayers[m_userIndex]->containerMenu->containerId == packet->containerId) + onUnhandledPacket(packet); + if (minecraft->localplayers[m_userIndex]->containerMenu != NULL && minecraft->localplayers[m_userIndex]->containerMenu->containerId == packet->containerId) { - minecraft->localplayers[m_userIndex]->containerMenu->setData(packet->id, packet->value); - } + minecraft->localplayers[m_userIndex]->containerMenu->setData(packet->id, packet->value); + } } void ClientConnection::handleSetEquippedItem(shared_ptr packet) { - shared_ptr entity = getEntity(packet->entity); - if (entity != NULL) + shared_ptr entity = getEntity(packet->entity); + if (entity != NULL) { // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game - entity->setEquippedSlot(packet->slot, packet->getItem() ); - } + entity->setEquippedSlot(packet->slot, packet->getItem() ); + } } void ClientConnection::handleContainerClose(shared_ptr packet) { - minecraft->localplayers[m_userIndex]->closeContainer(); + minecraft->localplayers[m_userIndex]->clientSideCloseContainer(); } void ClientConnection::handleTileEvent(shared_ptr packet) @@ -2861,24 +3184,24 @@ bool ClientConnection::canHandleAsyncPackets() void ClientConnection::handleGameEvent(shared_ptr gameEventPacket) { - int event = gameEventPacket->_event; + int event = gameEventPacket->_event; int param = gameEventPacket->param; - if (event >= 0 && event < GameEventPacket::EVENT_LANGUAGE_ID_LENGTH) + if (event >= 0 && event < GameEventPacket::EVENT_LANGUAGE_ID_LENGTH) { - if (GameEventPacket::EVENT_LANGUAGE_ID[event] > 0) // 4J - was NULL check + if (GameEventPacket::EVENT_LANGUAGE_ID[event] > 0) // 4J - was NULL check { minecraft->localplayers[m_userIndex]->displayClientMessage(GameEventPacket::EVENT_LANGUAGE_ID[event]); - } - } - if (event == GameEventPacket::START_RAINING) + } + } + if (event == GameEventPacket::START_RAINING) { - level->getLevelData()->setRaining(true); - level->setRainLevel(1); - } + level->getLevelData()->setRaining(true); + level->setRainLevel(1); + } else if (event == GameEventPacket::STOP_RAINING) { - level->getLevelData()->setRaining(false); - level->setRainLevel(0); + level->getLevelData()->setRaining(false); + level->setRainLevel(0); } else if (event == GameEventPacket::CHANGE_GAME_MODE) { @@ -2923,6 +3246,11 @@ void ClientConnection::handleGameEvent(shared_ptr gameEventPack { if(!g_NetworkManager.IsHost() ) app.SetGameStarted(true); } + else if ( event == GameEventPacket::SUCCESSFUL_BOW_HIT ) + { + shared_ptr player = minecraft->localplayers[m_userIndex]; + level->playLocalSound(player->x, player->y + player->getHeadHeight(), player->z, eSoundType_RANDOM_BOW_HIT , 0.18f, 0.45f, false); + } } void ClientConnection::handleComplexItemData(shared_ptr packet) @@ -2941,26 +3269,27 @@ void ClientConnection::handleComplexItemData(shared_ptr p void ClientConnection::handleLevelEvent(shared_ptr packet) { - switch(packet->type) + if (packet->type == LevelEvent::SOUND_DRAGON_DEATH) { - case LevelEvent::SOUND_DRAGON_DEATH: + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { - Minecraft *pMinecraft = Minecraft::GetInstance(); - for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + if(minecraft->localplayers[i] != NULL && minecraft->localplayers[i]->level != NULL && minecraft->localplayers[i]->level->dimension->id == 1) { - if(pMinecraft->localplayers[i] != NULL && pMinecraft->localplayers[i]->level != NULL && pMinecraft->localplayers[i]->level->dimension->id == 1) - { - pMinecraft->localplayers[i]->awardStat(GenericStats::completeTheEnd(),GenericStats::param_noArgs()); - } + minecraft->localplayers[i]->awardStat(GenericStats::completeTheEnd(),GenericStats::param_noArgs()); } } - minecraft->level->levelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); + } - break; - default: + if (packet->isGlobalEvent()) + { + minecraft->level->globalLevelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); + } + else + { minecraft->level->levelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); - break; } + + minecraft->level->levelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); } void ClientConnection::handleAwardStat(shared_ptr packet) @@ -2971,17 +3300,21 @@ void ClientConnection::handleAwardStat(shared_ptr packet) void ClientConnection::handleUpdateMobEffect(shared_ptr packet) { shared_ptr e = getEntity(packet->entityId); - if (e == NULL || dynamic_pointer_cast(e) == NULL) return; + if ( (e == NULL) || !e->instanceof(eTYPE_LIVINGENTITY) ) return; + + //( dynamic_pointer_cast(e) )->addEffect(new MobEffectInstance(packet->effectId, packet->effectDurationTicks, packet->effectAmplifier)); - ( dynamic_pointer_cast(e) )->addEffect(new MobEffectInstance(packet->effectId, packet->effectDurationTicks, packet->effectAmplifier)); + MobEffectInstance *mobEffectInstance = new MobEffectInstance(packet->effectId, packet->effectDurationTicks, packet->effectAmplifier); + mobEffectInstance->setNoCounter(packet->isSuperLongDuration()); + dynamic_pointer_cast(e)->addEffect(mobEffectInstance); } void ClientConnection::handleRemoveMobEffect(shared_ptr packet) { shared_ptr e = getEntity(packet->entityId); - if (e == NULL || dynamic_pointer_cast(e) == NULL) return; + if ( (e == NULL) || !e->instanceof(eTYPE_LIVINGENTITY) ) return; - ( dynamic_pointer_cast(e) )->removeEffectNoUpdate(packet->effectId); + ( dynamic_pointer_cast(e) )->removeEffectNoUpdate(packet->effectId); } bool ClientConnection::isServerPacketListener() @@ -3006,7 +3339,7 @@ void ClientConnection::handlePlayerInfo(shared_ptr packet) app.UpdatePlayerInfo(packet->m_networkSmallId, packet->m_playerColourIndex, packet->m_playerPrivileges); shared_ptr entity = getEntity(packet->m_entityId); - if(entity != NULL && entity->GetType() == eTYPE_PLAYER) + if(entity != NULL && entity->instanceof(eTYPE_PLAYER)) { shared_ptr player = dynamic_pointer_cast(entity); player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_playerPrivileges); @@ -3154,11 +3487,12 @@ void ClientConnection::handlePlayerAbilities(shared_ptr p player->abilities.invulnerable = playerAbilitiesPacket->isInvulnerable(); player->abilities.mayfly = playerAbilitiesPacket->canFly(); player->abilities.setFlyingSpeed(playerAbilitiesPacket->getFlyingSpeed()); + player->abilities.setWalkingSpeed(playerAbilitiesPacket->getWalkingSpeed()); } void ClientConnection::handleSoundEvent(shared_ptr packet) { - minecraft->level->playLocalSound(packet->getX(), packet->getY(), packet->getZ(), packet->getSound(), packet->getVolume(), packet->getPitch()); + minecraft->level->playLocalSound(packet->getX(), packet->getY(), packet->getZ(), packet->getSound(), packet->getVolume(), packet->getPitch(), false); } void ClientConnection::handleCustomPayload(shared_ptr customPayloadPacket) @@ -3297,7 +3631,7 @@ int ClientConnection::HostDisconnectReturned(void *pParam,int iPad,C4JStorage::E 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(),&ClientConnection::ExitGameAndSaveReturned,NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&ClientConnection::ExitGameAndSaveReturned,NULL); } else #else @@ -3312,7 +3646,7 @@ int ClientConnection::HostDisconnectReturned(void *pParam,int iPad,C4JStorage::E 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(),&ClientConnection::ExitGameAndSaveReturned,NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&ClientConnection::ExitGameAndSaveReturned,NULL); } else #endif @@ -3360,3 +3694,208 @@ wstring ClientConnection::GetDisplayNameByGamertag(wstring gamertag) return gamertag; #endif } + +void ClientConnection::handleAddObjective(shared_ptr packet) +{ +#if 0 + Scoreboard scoreboard = level->getScoreboard(); + + if (packet->method == SetObjectivePacket::METHOD_ADD) + { + Objective objective = scoreboard->addObjective(packet->objectiveName, ObjectiveCriteria::DUMMY); + objective->setDisplayName(packet->displayName); + } + else + { + Objective objective = scoreboard->getObjective(packet->objectiveName); + + if (packet->method == SetObjectivePacket::METHOD_REMOVE) + { + scoreboard->removeObjective(objective); + } + else if (packet->method == SetObjectivePacket::METHOD_CHANGE) + { + objective->setDisplayName(packet->displayName); + } + } +#endif +} + +void ClientConnection::handleSetScore(shared_ptr packet) +{ +#if 0 + Scoreboard scoreboard = level->getScoreboard(); + Objective objective = scoreboard->getObjective(packet->objectiveName); + + if (packet->method == SetScorePacket::METHOD_CHANGE) + { + Score score = scoreboard->getPlayerScore(packet->owner, objective); + score->setScore(packet->score); + } + else if (packet->method == SetScorePacket::METHOD_REMOVE) + { + scoreboard->resetPlayerScore(packet->owner); + } +#endif +} + +void ClientConnection::handleSetDisplayObjective(shared_ptr packet) +{ +#if 0 + Scoreboard scoreboard = level->getScoreboard(); + + if (packet->objectiveName->length() == 0) + { + scoreboard->setDisplayObjective(packet->slot, null); + } + else + { + Objective objective = scoreboard->getObjective(packet->objectiveName); + scoreboard->setDisplayObjective(packet->slot, objective); + } +#endif +} + +void ClientConnection::handleSetPlayerTeamPacket(shared_ptr packet) +{ +#if 0 + Scoreboard scoreboard = level->getScoreboard(); + PlayerTeam *team; + + if (packet->method == SetPlayerTeamPacket::METHOD_ADD) + { + team = scoreboard->addPlayerTeam(packet->name); + } + else + { + team = scoreboard->getPlayerTeam(packet->name); + } + + if (packet->method == SetPlayerTeamPacket::METHOD_ADD || packet->method == SetPlayerTeamPacket::METHOD_CHANGE) + { + team->setDisplayName(packet->displayName); + team->setPrefix(packet->prefix); + team->setSuffix(packet->suffix); + team->unpackOptions(packet->options); + } + + if (packet->method == SetPlayerTeamPacket::METHOD_ADD || packet->method == SetPlayerTeamPacket::METHOD_JOIN) + { + for (int i = 0; i < packet->players.size(); i++) + { + scoreboard->addPlayerToTeam(packet->players[i], team); + } + } + + if (packet->method == SetPlayerTeamPacket::METHOD_LEAVE) + { + for (int i = 0; i < packet->players.size(); i++) + { + scoreboard->removePlayerFromTeam(packet->players[i], team); + } + } + + if (packet->method == SetPlayerTeamPacket::METHOD_REMOVE) + { + scoreboard->removePlayerTeam(team); + } +#endif +} + +void ClientConnection::handleParticleEvent(shared_ptr packet) +{ + for (int i = 0; i < packet->getCount(); i++) + { + double xVarience = random->nextGaussian() * packet->getXDist(); + double yVarience = random->nextGaussian() * packet->getYDist(); + double zVarience = random->nextGaussian() * packet->getZDist(); + double xa = random->nextGaussian() * packet->getMaxSpeed(); + double ya = random->nextGaussian() * packet->getMaxSpeed(); + double za = random->nextGaussian() * packet->getMaxSpeed(); + + // TODO: determine particle ID from name + assert(0); + ePARTICLE_TYPE particleId = eParticleType_heart; + + level->addParticle(particleId, packet->getX() + xVarience, packet->getY() + yVarience, packet->getZ() + zVarience, xa, ya, za); + } +} + +void ClientConnection::handleUpdateAttributes(shared_ptr packet) +{ + shared_ptr entity = getEntity(packet->getEntityId()); + if (entity == NULL) return; + + if ( !entity->instanceof(eTYPE_LIVINGENTITY) ) + { + // Entity is not a living entity! + assert(0); + } + + BaseAttributeMap *attributes = (dynamic_pointer_cast(entity))->getAttributes(); + unordered_set attributeSnapshots = packet->getValues(); + for (AUTO_VAR(it,attributeSnapshots.begin()); it != attributeSnapshots.end(); ++it) + { + UpdateAttributesPacket::AttributeSnapshot *attribute = *it; + AttributeInstance *instance = attributes->getInstance(attribute->getId()); + + if (instance == NULL) + { + // 4J - TODO: revisit, not familiar with the attribute system, why are we passing in MIN_NORMAL (Java's smallest non-zero value conforming to IEEE Standard 754 (?)) and MAX_VALUE + instance = attributes->registerAttribute(new RangedAttribute(attribute->getId(), 0, Double::MIN_NORMAL, Double::MAX_VALUE)); + } + + instance->setBaseValue(attribute->getBase()); + instance->removeModifiers(); + + unordered_set *modifiers = attribute->getModifiers(); + + for (AUTO_VAR(it2,modifiers->begin()); it2 != modifiers->end(); ++it2) + { + AttributeModifier* modifier = *it2; + instance->addModifier(new AttributeModifier(modifier->getId(), modifier->getAmount(), modifier->getOperation() ) ); + } + } +} + +// 4J: Check for deferred entity link packets related to this entity ID and handle them +void ClientConnection::checkDeferredEntityLinkPackets(int newEntityId) +{ + if (deferredEntityLinkPackets.empty()) return; + + for (int i = 0; i < deferredEntityLinkPackets.size(); i++) + { + DeferredEntityLinkPacket *deferred = &deferredEntityLinkPackets[i]; + + bool remove = false; + + // Only consider recently deferred packets + int tickInterval = GetTickCount() - deferred->m_recievedTick; + if (tickInterval < MAX_ENTITY_LINK_DEFERRAL_INTERVAL) + { + // Note: we assume it's the destination entity + if (deferred->m_packet->destId == newEntityId) + { + handleEntityLinkPacket(deferred->m_packet); + remove = true; + } + } + else + { + // This is an old packet, remove (shouldn't really come up but seems prudent) + remove = true; + } + + if (remove) + { + deferredEntityLinkPackets.erase(deferredEntityLinkPackets.begin() + i); + i--; + } + } +} + +ClientConnection::DeferredEntityLinkPacket::DeferredEntityLinkPacket(shared_ptr packet) +{ + m_recievedTick = GetTickCount(); + m_packet = packet; +} \ No newline at end of file diff --git a/Minecraft.Client/ClientConnection.h b/Minecraft.Client/ClientConnection.h index 2ce46ce0..a80c10f7 100644 --- a/Minecraft.Client/ClientConnection.h +++ b/Minecraft.Client/ClientConnection.h @@ -17,6 +17,7 @@ private: eCCLoginReceived, eCCConnected }; + private: bool done; Connection *connection; @@ -58,6 +59,7 @@ public: virtual void handleSetEntityData(shared_ptr packet); virtual void handleAddPlayer(shared_ptr packet); virtual void handleTeleportEntity(shared_ptr packet); + virtual void handleSetCarriedItem(shared_ptr packet); virtual void handleMoveEntity(shared_ptr packet); virtual void handleRotateMob(shared_ptr packet); virtual void handleMoveEntitySmall(shared_ptr packet); @@ -86,7 +88,7 @@ public: virtual void handleAddMob(shared_ptr packet); virtual void handleSetTime(shared_ptr packet); virtual void handleSetSpawn(shared_ptr packet); - virtual void handleRidePacket(shared_ptr packet); + virtual void handleEntityLinkPacket(shared_ptr packet); virtual void handleEntityEvent(shared_ptr packet); private: shared_ptr getEntity(int entityId); @@ -100,6 +102,7 @@ public: virtual void handleContainerSetSlot(shared_ptr packet); virtual void handleContainerAck(shared_ptr packet); virtual void handleContainerContent(shared_ptr packet); + virtual void handleTileEditorOpen(shared_ptr packet); virtual void handleSignUpdate(shared_ptr packet); virtual void handleTileEntityData(shared_ptr packet); virtual void handleContainerSetData(shared_ptr packet); @@ -137,4 +140,27 @@ public: virtual void handleXZ(shared_ptr packet); void displayPrivilegeChanges(shared_ptr player, unsigned int oldPrivileges); + + virtual void handleAddObjective(shared_ptr packet); + virtual void handleSetScore(shared_ptr packet); + virtual void handleSetDisplayObjective(shared_ptr packet); + virtual void handleSetPlayerTeamPacket(shared_ptr packet); + virtual void handleParticleEvent(shared_ptr packet); + virtual void handleUpdateAttributes(shared_ptr packet); + +private: + // 4J: Entity link packet deferred + class DeferredEntityLinkPacket + { + public: + DWORD m_recievedTick; + shared_ptr m_packet; + + DeferredEntityLinkPacket(shared_ptr packet); + }; + + vector deferredEntityLinkPackets; + static const int MAX_ENTITY_LINK_DEFERRAL_INTERVAL = 1000; + + void checkDeferredEntityLinkPackets(int newEntityId); }; \ No newline at end of file diff --git a/Minecraft.Client/ClockTexture.cpp b/Minecraft.Client/ClockTexture.cpp index d8abb785..837532fb 100644 --- a/Minecraft.Client/ClockTexture.cpp +++ b/Minecraft.Client/ClockTexture.cpp @@ -7,14 +7,14 @@ #include "Texture.h" #include "ClockTexture.h" -ClockTexture::ClockTexture() : StitchedTexture(L"compass") +ClockTexture::ClockTexture() : StitchedTexture(L"clock", L"clock") { rot = rota = 0.0; m_dataTexture = NULL; m_iPad = XUSER_INDEX_ANY; } -ClockTexture::ClockTexture(int iPad, ClockTexture *dataTexture) : StitchedTexture(L"compass") +ClockTexture::ClockTexture(int iPad, ClockTexture *dataTexture) : StitchedTexture(L"clock", L"clock") { rot = rota = 0.0; m_dataTexture = dataTexture; diff --git a/Minecraft.Client/Common/App_Defines.h b/Minecraft.Client/Common/App_Defines.h index de1d1bdc..7e96896c 100644 --- a/Minecraft.Client/Common/App_Defines.h +++ b/Minecraft.Client/Common/App_Defines.h @@ -36,8 +36,29 @@ #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_NOTOWNER 0x00080000 +#define GAME_HOST_OPTION_BITMASK_WORLDSIZE 0x00700000 // 3 bits, 5 values (unset(0), classic(1), small(2), medium(3), large(4)) +#define GAME_HOST_OPTION_BITMASK_MOBGRIEFING 0x00800000 +#define GAME_HOST_OPTION_BITMASK_KEEPINVENTORY 0x01000000 +#define GAME_HOST_OPTION_BITMASK_DOMOBSPAWNING 0x02000000 +#define GAME_HOST_OPTION_BITMASK_DOMOBLOOT 0x04000000 +#define GAME_HOST_OPTION_BITMASK_DOTILEDROPS 0x08000000 +#define GAME_HOST_OPTION_BITMASK_NATURALREGEN 0x10000000 +#define GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE 0x20000000 #define GAME_HOST_OPTION_BITMASK_ALL 0xFFFFFFFF +#define GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT 20 + +enum EGameHostOptionWorldSize +{ + e_worldSize_Unknown = 0, + e_worldSize_Classic, + e_worldSize_Small, + e_worldSize_Medium, + e_worldSize_Large +}; + + #ifdef _XBOX #define PROFILE_VERSION_1 1 #define PROFILE_VERSION_2 2 @@ -53,7 +74,12 @@ #define PROFILE_VERSION_10 12 // 4J-JEV: New Statistics and Achievements for 'NexGen' platforms. -#define PROFILE_VERSION_BUILD_JUNE14 13 +#define PROFILE_VERSION_11 13 + +// Java 1.6.4 +#define PROFILE_VERSION_12 14 + +#define PROFILE_VERSION_CURRENT PROFILE_VERSION_12 #define MAX_FAVORITE_SKINS 10 // these are stored in the profile data so keep it small diff --git a/Minecraft.Client/Common/App_enums.h b/Minecraft.Client/Common/App_enums.h index b6c484dc..db7bf70b 100644 --- a/Minecraft.Client/Common/App_enums.h +++ b/Minecraft.Client/Common/App_enums.h @@ -73,6 +73,7 @@ enum eXuiAction eAppAction_LevelInBanLevelList, eAppAction_ReloadTexturePack, + eAppAction_ReloadFont, eAppAction_TexturePackRequired, // when the user has joined from invite, but doesn't have the texture pack #ifdef __ORBIS__ @@ -380,6 +381,10 @@ enum eMinecraftColour eMinecraftColour_Effect_Hunger, eMinecraftColour_Effect_Weakness, eMinecraftColour_Effect_Poison, + eMinecraftColour_Effect_Wither, + eMinecraftColour_Effect_HealthBoost, + eMinecraftColour_Effect_Absoprtion, + eMinecraftColour_Effect_Saturation, eMinecraftColour_Potion_BaseColour, @@ -425,6 +430,12 @@ enum eMinecraftColour eMinecraftColour_Mob_Ocelot_Colour2, eMinecraftColour_Mob_Villager_Colour1, eMinecraftColour_Mob_Villager_Colour2, + eMinecraftColour_Mob_Bat_Colour1, + eMinecraftColour_Mob_Bat_Colour2, + eMinecraftColour_Mob_Witch_Colour1, + eMinecraftColour_Mob_Witch_Colour2, + eMinecraftColour_Mob_Horse_Colour1, + eMinecraftColour_Mob_Horse_Colour2, eMinecraftColour_Armour_Default_Leather_Colour, @@ -443,6 +454,11 @@ enum eMinecraftColour eMinecraftColour_Sign_Text, eMinecraftColour_Map_Text, + eMinecraftColour_Leash_Light_Colour, + eMinecraftColour_Leash_Dark_Colour, + + eMinecraftColour_Fire_Overlay, + eHTMLColor_0, eHTMLColor_1, eHTMLColor_2, @@ -487,20 +503,20 @@ enum eMinecraftColour 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_1 = 0x0000aa, //r:0 , g: 0, b: aa, i: 1 // blue, quite dark + //eHTMLColor_2 = 0x109e10, // Changed by request of Dave //0x00aa00, //r:0 , g: aa, b: 0, i: 2 // green + //eHTMLColor_3 = 0x109e9e, // Changed by request of Dave //0x00aaaa, //r:0 , g: aa, b: aa, i: 3 // cyan + //eHTMLColor_4 = 0xaa0000, //r:aa , g: 0, b: 0, i: 4 // red + //eHTMLColor_5 = 0xaa00aa, //r:aa , g: 0, b: aa, i: 5 // purple + //eHTMLColor_6 = 0xffaa00, //r:ff , g: aa, b: 0, i: 6 // orange + //eHTMLColor_7 = 0xaaaaaa, //r:aa , g: aa, b: aa, i: 7 // light gray + //eHTMLColor_8 = 0x555555, //r:55 , g: 55, b: 55, i: 8 // gray + //eHTMLColor_9 = 0x5555ff, //r:55 , g: 55, b: ff, i: 9 // blue + //eHTMLColor_a = 0x55ff55, //r:55 , g: ff, b: 55, i: a // green + //eHTMLColor_b = 0x55ffff, //r:55 , g: ff, b: ff, i: b // cyan + //eHTMLColor_c = 0xff5555, //r:ff , g: 55, b: 55, i: c // red pink + //eHTMLColor_d = 0xff55ff, //r:ff , g: 55, b: ff, i: d // bright pink + //eHTMLColor_e = 0xffff55, //r:ff , g: ff, b: 55, i: e // yellow //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 @@ -509,12 +525,12 @@ enum eMinecraftColour //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_7_dark = 0x2a2a2a, //r:2a , g: 2a, b: 2a, i: 17 // dark gray //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_c_dark = 0x3f1515, //r:3f , g: 15, b: 15, i: 1c // brown //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 @@ -617,9 +633,19 @@ enum eGameHostOption eGameHostOption_HostCanBeInvisible, eGameHostOption_BedrockFog, eGameHostOption_NoHUD, + eGameHostOption_WorldSize, eGameHostOption_All, eGameHostOption_DisableSaving, + eGameHostOption_WasntSaveOwner, // Added for PS3 save transfer, so we can add a nice message in the future instead of the creative mode one + + eGameHostOption_MobGriefing, + eGameHostOption_KeepInventory, + eGameHostOption_DoMobSpawning, + eGameHostOption_DoMobLoot, + eGameHostOption_DoTileDrops, + eGameHostOption_NaturalRegeneration, + eGameHostOption_DoDaylightCycle, }; // 4J-PB - If any new DLC items are added to the TMSFiles, this array needs updated @@ -639,6 +665,8 @@ enum _TMSFILES TMS_SPM, TMS_SPI, TMS_SPG, + TMS_SPD1, + TMS_SPSW1, TMS_THST, TMS_THIR, @@ -748,6 +776,8 @@ enum _TMSFILES TMS_MPSR_DAT, TMS_MPHA, TMS_MPHA_DAT, + TMS_MPFE, + TMS_MPFE_DAT, TMS_TP01, TMS_TP01_DAT, @@ -761,6 +791,8 @@ enum _TMSFILES TMS_TP06_DAT, TMS_TP07, TMS_TP07_DAT, + TMS_TP08, + TMS_TP08_DAT, TMS_COUNT }; @@ -875,7 +907,7 @@ enum eMCLang eMCLang_plPL, eMCLang_trTR, eMCLang_elEL, - eMCLang_zhCHS, + eMCLang_csCS, eMCLang_zhCHT, eMCLang_laLAS, @@ -910,4 +942,7 @@ enum eMCLang eMCLang_elGR, eMCLang_nnNO, eMCLang_skSK, + + eMCLang_hans, + eMCLang_hant, }; \ No newline at end of file diff --git a/Minecraft.Client/Common/App_structs.h b/Minecraft.Client/Common/App_structs.h index ed321b5f..a7552ec0 100644 --- a/Minecraft.Client/Common/App_structs.h +++ b/Minecraft.Client/Common/App_structs.h @@ -100,6 +100,10 @@ typedef struct // PS3 1.05 - Adding Greek, so need a language unsigned char ucLanguage; + + // 29/Oct/2014 - Language selector. + unsigned char ucLocale; + // 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)]; diff --git a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp index 269b605b..e440316d 100644 --- a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp @@ -35,4 +35,43 @@ void ConsoleSoundEngine::SetIsPlayingNetherMusic(bool bVal) m_bIsPlayingNetherMusic=bVal; } +void ConsoleSoundEngine::tick() +{ + if (scheduledSounds.empty()) + { + return; + } + + for(AUTO_VAR(it,scheduledSounds.begin()); it != scheduledSounds.end();) + { + SoundEngine::ScheduledSound *next = *it; + next->delay--; + + if (next->delay <= 0) + { + play(next->iSound, next->x, next->y, next->z, next->volume, next->pitch); + it =scheduledSounds.erase(it); + delete next; + } + else + { + ++it; + } + } +} +void ConsoleSoundEngine::schedule(int iSound, float x, float y, float z, float volume, float pitch, int delayTicks) +{ + scheduledSounds.push_back(new SoundEngine::ScheduledSound(iSound, x, y, z, volume, pitch, delayTicks)); +} + +ConsoleSoundEngine::ScheduledSound::ScheduledSound(int iSound, float x, float y, float z, float volume, float pitch, int delay) +{ + this->iSound = iSound; + this->x = x; + this->y = y; + this->z = z; + this->volume = volume; + this->pitch = pitch; + this->delay = delay; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h index 4ec76036..b29b4378 100644 --- a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h @@ -69,6 +69,25 @@ public: static const WCHAR *wchSoundNames[eSoundType_MAX]; static const WCHAR *wchUISoundNames[eSFX_MAX]; +public: + void tick(); + void schedule(int iSound, float x, float y, float z, float volume, float pitch, int delayTicks); + +private: + class ScheduledSound + { + public: + int iSound; + float x, y, z; + float volume, pitch; + int delay; + + public: + ScheduledSound(int iSound, float x, float y, float z, float volume, float pitch, int delay); + }; + + vector scheduledSounds; + private: // platform specific functions diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp index dfed0de7..4d356c13 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -490,6 +490,12 @@ void SoundEngine::updateMiles() case eSoundType_MOB_ENDERDRAGON_HIT: distanceScaler=100.0f; break; + case eSoundType_FIREWORKS_BLAST: + case eSoundType_FIREWORKS_BLAST_FAR: + case eSoundType_FIREWORKS_LARGE_BLAST: + case eSoundType_FIREWORKS_LARGE_BLAST_FAR: + distanceScaler=100.0f; + break; case eSoundType_MOB_GHAST_MOAN: case eSoundType_MOB_GHAST_SCREAM: case eSoundType_MOB_GHAST_DEATH: @@ -624,6 +630,7 @@ static S32 running = AIL_ms_count(); void SoundEngine::tick(shared_ptr *players, float a) { + ConsoleSoundEngine::tick(); #ifdef __DISABLE_MILES__ return; #endif @@ -1129,6 +1136,11 @@ int SoundEngine::OpenStreamThreadProc( void* lpParameter ) #endif SoundEngine *soundEngine = (SoundEngine *)lpParameter; soundEngine->m_hStream = AIL_open_stream(soundEngine->m_hDriver,soundEngine->m_szStreamName,0); + + if(soundEngine->m_hStream==0) + { + app.DebugPrintf("SoundEngine::OpenStreamThreadProc - Could not open - %s\n",soundEngine->m_szStreamName); + } return 0; } @@ -1225,7 +1237,11 @@ void SoundEngine::playMusicUpdate() char szName[255]; wcstombs(szName,wstrSoundName.c_str(),255); +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + string strFile="TPACK:/Data/" + string(szName) + ".binka"; +#else string strFile="TPACK:\\Data\\" + string(szName) + ".binka"; +#endif std::string mountedPath = StorageManager.GetMountedPath(strFile); strcpy(m_szStreamName,mountedPath.c_str()); #endif diff --git a/Minecraft.Client/Common/Audio/SoundNames.cpp b/Minecraft.Client/Common/Audio/SoundNames.cpp index 170c87a0..1ab709b2 100644 --- a/Minecraft.Client/Common/Audio/SoundNames.cpp +++ b/Minecraft.Client/Common/Audio/SoundNames.cpp @@ -151,6 +151,78 @@ const WCHAR *ConsoleSoundEngine::wchSoundNames[eSoundType_MAX]= L"dig.snow", // eSoundType_DIG_SNOW L"dig.stone", // eSoundType_DIG_STONE L"dig.wood", // eSoundType_DIG_WOOD + + // 1.6.4 + L"fireworks.launch", //eSoundType_FIREWORKS_LAUNCH, + L"fireworks.blast", //eSoundType_FIREWORKS_BLAST, + L"fireworks.blast_far", //eSoundType_FIREWORKS_BLAST_FAR, + L"fireworks.large_blast", //eSoundType_FIREWORKS_LARGE_BLAST, + L"fireworks.large_blast_far", //eSoundType_FIREWORKS_LARGE_BLAST_FAR, + L"fireworks.twinkle", //eSoundType_FIREWORKS_TWINKLE, + L"fireworks.twinkle_far", //eSoundType_FIREWORKS_TWINKLE_FAR, + + L"mob.bat.idle", //eSoundType_MOB_BAT_IDLE, + L"mob.bat.hurt", //eSoundType_MOB_BAT_HURT, + L"mob.bat.death", //eSoundType_MOB_BAT_DEATH, + L"mob.bat.takeoff", //eSoundType_MOB_BAT_TAKEOFF, + + L"mob.wither.spawn", //eSoundType_MOB_WITHER_SPAWN, + L"mob.wither.idle", //eSoundType_MOB_WITHER_IDLE, + L"mob.wither.hurt", //eSoundType_MOB_WITHER_HURT, + L"mob.wither.death", //eSoundType_MOB_WITHER_DEATH, + L"mob.wither.shoot", //eSoundType_MOB_WITHER_SHOOT, + + L"mob.cow.step", //eSoundType_MOB_COW_STEP, + L"mob.chicken.step", //eSoundType_MOB_CHICKEN_STEP, + L"mob.pig.step", //eSoundType_MOB_PIG_STEP, + L"mob.enderman.stare", //eSoundType_MOB_ENDERMAN_STARE, + L"mob.enderman.scream", //eSoundType_MOB_ENDERMAN_SCREAM, + L"mob.sheep.shear", //eSoundType_MOB_SHEEP_SHEAR, + L"mob.sheep.step", //eSoundType_MOB_SHEEP_STEP, + L"mob.skeleton.death", //eSoundType_MOB_SKELETON_DEATH, + L"mob.skeleton.step", //eSoundType_MOB_SKELETON_STEP, + L"mob.spider.step", //eSoundType_MOB_SPIDER_STEP, + L"mob.wolf.step", //eSoundType_MOB_WOLF_STEP, + L"mob.zombie.step", //eSoundType_MOB_ZOMBIE_STEP, + + L"liquid.swim", //eSoundType_LIQUID_SWIM, + + L"mob.horse.land", //eSoundType_MOB_HORSE_LAND, + L"mob.horse.armor", //eSoundType_MOB_HORSE_ARMOR, + L"mob.horse.leather", //eSoundType_MOB_HORSE_LEATHER, + L"mob.horse.zombie.death", //eSoundType_MOB_HORSE_ZOMBIE_DEATH, + L"mob.horse.skeleton.death", //eSoundType_MOB_HORSE_SKELETON_DEATH, + L"mob.horse.donkey.death", //eSoundType_MOB_HORSE_DONKEY_DEATH, + L"mob.horse.death", //eSoundType_MOB_HORSE_DEATH, + L"mob.horse.zombie.hit", //eSoundType_MOB_HORSE_ZOMBIE_HIT, + L"mob.horse.skeleton.hit", //eSoundType_MOB_HORSE_SKELETON_HIT, + L"mob.horse.donkey.hit", //eSoundType_MOB_HORSE_DONKEY_HIT, + L"mob.horse.hit", //eSoundType_MOB_HORSE_HIT, + L"mob.horse.zombie.idle", //eSoundType_MOB_HORSE_ZOMBIE_IDLE, + L"mob.horse.skeleton.idle", //eSoundType_MOB_HORSE_SKELETON_IDLE, + L"mob.horse.donkey.idle", //eSoundType_MOB_HORSE_DONKEY_IDLE, + L"mob.horse.idle", //eSoundType_MOB_HORSE_IDLE, + L"mob.horse.donkey.angry", //eSoundType_MOB_HORSE_DONKEY_ANGRY, + L"mob.horse.angry", //eSoundType_MOB_HORSE_ANGRY, + L"mob.horse.gallop", //eSoundType_MOB_HORSE_GALLOP, + L"mob.horse.breathe", //eSoundType_MOB_HORSE_BREATHE, + L"mob.horse.wood", //eSoundType_MOB_HORSE_WOOD, + L"mob.horse.soft", //eSoundType_MOB_HORSE_SOFT, + L"mob.horse.jump", //eSoundType_MOB_HORSE_JUMP, + + L"mob.witch.idle", //eSoundType_MOB_WITCH_IDLE, <--- missing + L"mob.witch.hurt", //eSoundType_MOB_WITCH_HURT, <--- missing + L"mob.witch.death", //eSoundType_MOB_WITCH_DEATH, <--- missing + + L"mob.slime.big", //eSoundType_MOB_SLIME_BIG, + L"mob.slime.small", //eSoundType_MOB_SLIME_SMALL, + + L"eating", //eSoundType_EATING <--- missing + L"random.levelup", //eSoundType_RANDOM_LEVELUP + + // 4J-PB - Some sounds were updated, but we can't do that for the 360 or we have to do a new sound bank + // instead, we'll add the sounds as new ones and change the code to reference them + L"fire.new_ignite", }; diff --git a/Minecraft.Client/Common/BuildVer.h b/Minecraft.Client/Common/BuildVer.h index ee558b03..9248a8eb 100644 --- a/Minecraft.Client/Common/BuildVer.h +++ b/Minecraft.Client/Common/BuildVer.h @@ -7,14 +7,14 @@ // 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 +#define VER_PRODUCTBUILD 560 // This goes up if there is any change to network traffic or code in a build -#define VER_NETWORK 495 +#define VER_NETWORK 560 #define VER_PRODUCTBUILD_QFE 0 -#define VER_FILEVERSION_STRING "1.3" +#define VER_FILEVERSION_STRING "1.6" #define VER_PRODUCTVERSION_STRING VER_FILEVERSION_STRING -#define VER_FILEVERSION_STRING_W L"1.3" +#define VER_FILEVERSION_STRING_W L"1.6" #define VER_PRODUCTVERSION_STRING_W VER_FILEVERSION_STRING_W #define VER_FILEBETA_STR "" #undef VER_FILEVERSION diff --git a/Minecraft.Client/Common/Colours/ColourTable.cpp b/Minecraft.Client/Common/Colours/ColourTable.cpp index dc58cfb1..5c74d5ec 100644 --- a/Minecraft.Client/Common/Colours/ColourTable.cpp +++ b/Minecraft.Client/Common/Colours/ColourTable.cpp @@ -201,6 +201,10 @@ wchar_t *ColourTable::ColourTableElements[eMinecraftColour_COUNT] = L"Effect_Hunger", L"Effect_Weakness", L"Effect_Poison", + L"Effect_Wither", + L"Effect_HealthBoost", + L"Effect_Absorption", + L"Effect_Saturation", L"Potion_BaseColour", @@ -246,6 +250,12 @@ wchar_t *ColourTable::ColourTableElements[eMinecraftColour_COUNT] = L"Mob_Ocelot_Colour2", L"Mob_Villager_Colour1", L"Mob_Villager_Colour2", + L"Mob_Bat_Colour1", + L"Mob_Bat_Colour2", + L"Mob_Witch_Colour1", + L"Mob_Witch_Colour2", + L"Mob_Horse_Colour1", + L"Mob_Horse_Colour2", L"Armour_Default_Leather_Colour", L"Under_Water_Clear_Colour", @@ -262,6 +272,11 @@ wchar_t *ColourTable::ColourTableElements[eMinecraftColour_COUNT] = L"Sign_Text", L"Map_Text", + + L"Leash_Light_Colour", + L"Leash_Dark_Colour", + + L"Fire_Overlay", L"HTMLColor_0", L"HTMLColor_1", diff --git a/Minecraft.Client/Common/Console_Debug_enum.h b/Minecraft.Client/Common/Console_Debug_enum.h index 4e6c2b14..3d2b97af 100644 --- a/Minecraft.Client/Common/Console_Debug_enum.h +++ b/Minecraft.Client/Common/Console_Debug_enum.h @@ -12,15 +12,15 @@ enum eDebugSetting eDebugSetting_CraftAnything, eDebugSetting_UseDpadForDebug, eDebugSetting_MobsDontTick, - eDebugSetting_InstantDestroy, + eDebugSetting_ArtTools, //eDebugSetting_InstantDestroy, eDebugSetting_ShowUIConsole, eDebugSetting_DistributableSave, eDebugSetting_DebugLeaderboards, - eDebugSetting_EnableHeightWaterBiomeOverride, //eDebugSetting_TipsAlwaysOn, + eDebugSetting_EnableHeightWaterOverride, //eDebugSetting_TipsAlwaysOn, eDebugSetting_SuperflatNether, //eDebugSetting_LightDarkBackground, eDebugSetting_RegularLightning, - eDebugSetting_GoToNether, + eDebugSetting_EnableBiomeOverride, //eDebugSetting_GoToNether, //eDebugSetting_GoToEnd, eDebugSetting_GoToOverworld, eDebugSetting_UnlockAllDLC, // eDebugSetting_ToggleFont, diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp index b047f58e..30bc8533 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -1,10 +1,12 @@  #include "stdafx.h" - -#include "..\..\Minecraft.World\Recipy.h" -#include "..\..\Minecraft.Client\Options.h" -#include "..\..\Minecraft.World\AABB.h" -#include "..\..\Minecraft.World\Vec3.h" +#include "..\..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\Minecraft.World\compression.h" +#include "..\Options.h" #include "..\MinecraftServer.h" #include "..\MultiPlayerLevel.h" #include "..\GameRenderer.h" @@ -35,8 +37,6 @@ #include "..\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" @@ -155,8 +155,8 @@ CMinecraftApp::CMinecraftApp() ZeroMemory(&m_InviteData,sizeof(JoinFromInviteData) ); -// m_bRead_TMS_XUIDS_XML=false; -// m_bRead_TMS_DLCINFO_XML=false; + // m_bRead_TMS_XUIDS_XML=false; + // m_bRead_TMS_DLCINFO_XML=false; m_pDLCFileBuffer=NULL; m_dwDLCFileSize=0; @@ -178,6 +178,12 @@ CMinecraftApp::CMinecraftApp() m_uiGameHostSettings=0; +#ifdef _LARGE_WORLDS + m_GameNewWorldSize = 0; + m_bGameNewWorldSizeUseMoat = false; + m_GameNewHellScale = 0; +#endif + ZeroMemory(m_playerColours,MINECRAFT_NET_MAX_PLAYERS); m_iDLCOfferC=0; @@ -198,10 +204,10 @@ CMinecraftApp::CMinecraftApp() m_dwRequiredTexturePackID=0; m_bResetNether=false; - + #ifdef _XBOX -// m_bTransferSavesToXboxOne=false; -// m_uiTransferSlotC=5; + // m_bTransferSavesToXboxOne=false; + // m_uiTransferSlotC=5; #endif #if (defined _CONTENT_PACAKGE) || (defined _XBOX) @@ -308,7 +314,15 @@ LPCWSTR CMinecraftApp::GetString(int iID) void CMinecraftApp::SetAction(int iPad, eXuiAction action, LPVOID param) { - if(m_eXuiAction[iPad] == eAppAction_ExitWorldCapturedThumbnail && action != eAppAction_Idle) + if( ( m_eXuiAction[iPad] == eAppAction_ReloadTexturePack ) && ( action == eAppAction_EthernetDisconnected ) ) + { + app.DebugPrintf("Invalid change of App action for pad %d from %d to %d, ignoring\n", iPad, m_eXuiAction[iPad], action); + } + else if( ( m_eXuiAction[iPad] == eAppAction_ReloadTexturePack ) && ( action == eAppAction_ExitWorld ) ) + { + app.DebugPrintf("Invalid change of App action for pad %d from %d to %d, ignoring\n", iPad, m_eXuiAction[iPad], action); + } + else 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); } @@ -352,17 +366,17 @@ void CMinecraftApp::HandleButtonPresses() 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) @@ -463,7 +477,32 @@ bool CMinecraftApp::LoadCrafting3x3Menu(int iPad,shared_ptr player, return success; } -bool CMinecraftApp::LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level) +bool CMinecraftApp::LoadFireworksMenu(int iPad,shared_ptr player, int x, int y, int z) +{ + bool success = true; + + FireworksScreenInput* initData = new FireworksScreenInput(); + initData->player = player; + initData->iPad = iPad; + initData->x = x; + initData->y = y; + initData->z = z; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_FireworksMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_FireworksMenu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level, const wstring &name) { bool success = true; @@ -474,6 +513,7 @@ bool CMinecraftApp::LoadEnchantingMenu(int iPad,shared_ptr inventory, initData->y = y; initData->z = z; initData->iPad = iPad; + initData->name = name; if(app.GetLocalPlayerCount()>1) { @@ -634,7 +674,7 @@ bool CMinecraftApp::LoadRepairingMenu(int iPad,shared_ptr inventory, return success; } -bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level) +bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level, const wstring &name) { bool success = true; @@ -651,6 +691,71 @@ bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, s return success; } +bool CMinecraftApp::LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper) +{ + bool success = true; + + HopperScreenInput *initData = new HopperScreenInput(); + initData->inventory = inventory; + initData->hopper = hopper; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_HopperMenu, initData); + + return success; +} + +bool CMinecraftApp::LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper) +{ + bool success = true; + + HopperScreenInput *initData = new HopperScreenInput(); + initData->inventory = inventory; + initData->hopper = dynamic_pointer_cast(hopper); + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_HopperMenu, initData); + + return success; +} + + +bool CMinecraftApp::LoadHorseMenu(int iPad ,shared_ptr inventory, shared_ptr container, shared_ptr horse) +{ + bool success = true; + + HorseScreenInput *initData = new HorseScreenInput(); + initData->inventory = inventory; + initData->container = container; + initData->horse = horse; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_HorseMenu, initData); + + return success; +} + +bool CMinecraftApp::LoadBeaconMenu(int iPad ,shared_ptr inventory, shared_ptr beacon) +{ + bool success = true; + + BeaconScreenInput *initData = new BeaconScreenInput(); + initData->inventory = inventory; + initData->beacon = beacon; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_BeaconMenu, initData); + + return success; +} ////////////////////////////////////////////// // GAME SETTINGS @@ -750,15 +855,32 @@ int CMinecraftApp::SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,con // TU 13 GameSettingsA[iPad]->uiMashUpPackWorldsDisplay=0xFFFFFFFF; + // 1.6.4 + app.SetGameHostOption(eGameHostOption_MobGriefing, 1); + app.SetGameHostOption(eGameHostOption_KeepInventory, 0); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, 1 ); + app.SetGameHostOption(eGameHostOption_DoMobLoot, 1 ); + app.SetGameHostOption(eGameHostOption_DoTileDrops, 1 ); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, 1 ); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, 1 ); + // 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__ + //#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 + + // 4J-JEV: We cannot change these in-game, as they could affect localised strings and font. + // XB1: Fix for #172947 - Content: Gameplay: While playing in language different form system default one and resetting options to their defaults in active gameplay causes in-game language to change and HUD to disappear + if (!app.GetGameStarted()) + { + GameSettingsA[iPad]->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + GameSettingsA[iPad]->ucLocale = MINECRAFT_LANGUAGE_DEFAULT; // use the system locale + } + + //#endif #if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) GameSettingsA[iPad]->bSettingsChanged=bWriteProfile; @@ -780,7 +902,7 @@ int CMinecraftApp::DefaultOptionsCallback(LPVOID pParam,C_4JProfile::PROFILESETT 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(); @@ -790,6 +912,28 @@ int CMinecraftApp::DefaultOptionsCallback(LPVOID pParam,C_4JProfile::PROFILESETT #if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) +wstring CMinecraftApp::toStringOptionsStatus(const C4JStorage::eOptionsCallback &eStatus) +{ +#ifndef _CONTENT_PACKAGE + switch(eStatus) + { + case C4JStorage::eOptions_Callback_Idle: return L"Idle"; + case C4JStorage::eOptions_Callback_Write: return L"Write"; + case C4JStorage::eOptions_Callback_Write_Fail_NoSpace: return L"Write_Fail_NoSpace"; + case C4JStorage::eOptions_Callback_Write_Fail: return L"Write_Fail"; + case C4JStorage::eOptions_Callback_Read: return L"Read"; + case C4JStorage::eOptions_Callback_Read_Fail: return L"Read_Fail"; + case C4JStorage::eOptions_Callback_Read_FileNotFound: return L"Read_FileNotFound"; + case C4JStorage::eOptions_Callback_Read_Corrupt: return L"Read_Corrupt"; + case C4JStorage::eOptions_Callback_Read_CorruptDeletePending: return L"Read_CorruptDeletePending"; + case C4JStorage::eOptions_Callback_Read_CorruptDeleted: return L"Read_CorruptDeleted"; + default: return L"[UNRECOGNISED_OPTIONS_STATUS]"; + } +#else + return L""; +#endif +} + #ifdef __ORBIS__ int CMinecraftApp::OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus,int iBlocksRequired) { @@ -808,7 +952,13 @@ int CMinecraftApp::GetOptionsBlocksRequired(int iPad) int CMinecraftApp::OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus) { CMinecraftApp *pApp=(CMinecraftApp *)pParam; - pApp->m_eOptionsStatusA[iPad]=eStatus; + +#ifndef _CONTENT_PACKAGE + pApp->DebugPrintf("[OptionsDataCallback] Pad_%i: new status == %ls(%i).\n", iPad, pApp->toStringOptionsStatus(eStatus).c_str(), (int) eStatus); +#endif + + pApp->m_eOptionsStatusA[iPad] = eStatus; + return 0; } #endif @@ -850,7 +1000,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat pGameSettings->uiBitmaskValues=0L; // reset pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on - //eGameSetting_GameSetting_Invite - off + //eGameSetting_GameSetting_Invite - off pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) // TU6 @@ -885,7 +1035,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat pGameSettings->uiBitmaskValues=0L; // reset pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on - //eGameSetting_GameSetting_Invite - off + //eGameSetting_GameSetting_Invite - off pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) // TU6 @@ -917,7 +1067,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat 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 @@ -1040,7 +1190,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; // reset the display new message counter - //pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (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; @@ -1057,8 +1207,9 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat // PS3DEC13 { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off - + // PS3 1.05 - added Greek pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language @@ -1067,18 +1218,29 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat case PROFILE_VERSION_10: { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; - + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language } break; - + case PROFILE_VERSION_11: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + } + break; + case PROFILE_VERSION_12: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + } + 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 +#ifndef _CONTENT_PACKAGE + // __debugbreak(); +#endif GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu @@ -1208,7 +1370,7 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) { 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 @@ -1278,7 +1440,7 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) } } break; -// Interim TU 1.6.6 + // 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 @@ -1414,7 +1576,7 @@ DWORD CMinecraftApp::GetPlayerSkinId(int iPad) { // 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) @@ -1439,10 +1601,10 @@ DWORD CMinecraftApp::GetPlayerSkinId(int iPad) return dwSkin; } - DWORD CMinecraftApp::GetAdditionalModelParts(int iPad) - { +DWORD CMinecraftApp::GetAdditionalModelParts(int iPad) +{ return m_dwAdditionalModelParts[iPad]; - } +} void CMinecraftApp::SetPlayerCape(int iPad,const wstring &name) @@ -1518,7 +1680,7 @@ unsigned int CMinecraftApp::GetPlayerFavoriteSkinsCount(int iPad) void CMinecraftApp::ValidateFavoriteSkins(int iPad) { unsigned int uiCount=GetPlayerFavoriteSkinsCount(iPad); - + // remove invalid skins unsigned int uiValidSkin=0; wchar_t chars[256]; @@ -1558,12 +1720,6 @@ void CMinecraftApp::HideMashupPackWorld(int iPad, unsigned int iMashupPackID) GameSettingsA[iPad]->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; @@ -1575,6 +1731,12 @@ unsigned int CMinecraftApp::GetMashupPackWorlds(int iPad) return GameSettingsA[iPad]->uiMashUpPackWorldsDisplay; } +void CMinecraftApp::SetMinecraftLanguage(int iPad, unsigned char ucLanguage) +{ + GameSettingsA[iPad]->ucLanguage = ucLanguage; + GameSettingsA[iPad]->bSettingsChanged = true; +} + unsigned char CMinecraftApp::GetMinecraftLanguage(int iPad) { // if there are no game settings read yet, return the default language @@ -1588,6 +1750,25 @@ unsigned char CMinecraftApp::GetMinecraftLanguage(int iPad) } } +void CMinecraftApp::SetMinecraftLocale(int iPad, unsigned char ucLocale) +{ + GameSettingsA[iPad]->ucLocale = ucLocale; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +unsigned char CMinecraftApp::GetMinecraftLocale(int iPad) +{ + // if there are no game settings read yet, return the default language + if(GameSettingsA[iPad]==NULL) + { + return 0; + } + else + { + return GameSettingsA[iPad]->ucLocale; + } +} + void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucVal) { //Minecraft *pMinecraft=Minecraft::GetInstance(); @@ -1958,7 +2139,7 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV } break; - // TU9 + // TU9 case eGameSetting_DeathMessages: if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DEATHMESSAGES)!=(ucVal&0x01)<<10) { @@ -2091,7 +2272,7 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) case eGameSetting_SplitScreenVertical: return ((GameSettingsA[iPad]->usBitmaskValues&0x0100)>>8); break; - // 4J-PB - Added for Interim TU for 1.6.6 + // 4J-PB - Added for Interim TU for 1.6.6 case eGameSetting_Sensitivity_InMenu: return GameSettingsA[iPad]->ucMenuSensitivity; break; @@ -2116,7 +2297,7 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) case eGameSetting_InterfaceOpacity: return GameSettingsA[iPad]->ucInterfaceOpacity; break; - + case eGameSetting_Clouds: return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CLOUDS); break; @@ -2144,7 +2325,7 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) case eGameSetting_CustomSkinAnim: return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CUSTOMSKINANIM)>>9; break; - // TU9 + // TU9 case eGameSetting_DeathMessages: return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DEATHMESSAGES)>>10; break; @@ -2333,18 +2514,18 @@ void CMinecraftApp::ActionDebugMask(int iPad,bool bSetAllClear) } break; - //case eDebugSetting_HandRenderingOff: - // if(ulBitmask&(1<func = &UIScene_PauseMenu::SaveWorldThreadProc; loadingParams->lpParam = (LPVOID)false; @@ -2593,7 +2774,7 @@ void CMinecraftApp::HandleXuiActions(void) } loadingParams->completionData = completionData; - + // 4J Stu - Xbox only #ifdef _XBOX // Temporarily make this scene fullscreen @@ -2624,12 +2805,12 @@ void CMinecraftApp::HandleXuiActions(void) // 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; @@ -2642,7 +2823,7 @@ void CMinecraftApp::HandleXuiActions(void) completionData->iPad = ProfileManager.GetPrimaryPad(); //completionData->bAutosaveWasMenuDisplayed=ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad()); loadingParams->completionData = completionData; - + // 4J Stu - Xbox only #ifdef _XBOX // Temporarily make this scene fullscreen @@ -2676,11 +2857,11 @@ void CMinecraftApp::HandleXuiActions(void) #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(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 @@ -2747,11 +2928,11 @@ void CMinecraftApp::HandleXuiActions(void) } } } - + #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(i); #endif - + SetAction(i,eAppAction_Idle); } break; @@ -2936,12 +3117,12 @@ void CMinecraftApp::HandleXuiActions(void) 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()); + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2, i,&CMinecraftApp::UnlockFullExitReturned,this); } // Change the presence info // Are we offline or online, and how many players are there - + if(g_NetworkManager.GetPlayerCount()>1) { for(int j=0;jplayerLeftTutorial( idx ); @@ -3031,14 +3212,14 @@ void CMinecraftApp::HandleXuiActions(void) 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 ); @@ -3054,7 +3235,7 @@ void CMinecraftApp::HandleXuiActions(void) completionData->type = e_ProgressCompletion_NavigateToHomeMenu; completionData->iPad = DEFAULT_XUI_MENU_USER; loadingParams->completionData = completionData; - + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); } @@ -3072,7 +3253,7 @@ void CMinecraftApp::HandleXuiActions(void) 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); @@ -3100,7 +3281,7 @@ void CMinecraftApp::HandleXuiActions(void) // 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(); @@ -3135,8 +3316,8 @@ void CMinecraftApp::HandleXuiActions(void) // clear the progress messages -// pMinecraft->progressRenderer->progressStart(-1); -// pMinecraft->progressRenderer->progressStage(-1); + // pMinecraft->progressRenderer->progressStart(-1); + // pMinecraft->progressRenderer->progressStage(-1); } else if(!g_NetworkManager.IsInGameplay()) { @@ -3173,10 +3354,10 @@ void CMinecraftApp::HandleXuiActions(void) 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()); + // 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); @@ -3215,7 +3396,7 @@ void CMinecraftApp::HandleXuiActions(void) // 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++) + for(int j = 0; j < pMinecraft->levels.length; j++) { if (pMinecraft->levels.data[i] != NULL) { @@ -3239,7 +3420,7 @@ void CMinecraftApp::HandleXuiActions(void) 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()); + ui.RequestErrorMessage(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this); } else { @@ -3250,6 +3431,15 @@ void CMinecraftApp::HandleXuiActions(void) } else { +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + if(UIScene_LoadOrJoinMenu::isSaveTransferRunning()) + { + // the save transfer is still in progress, delay jumping back to the main menu until we've cleaned up + SetAction(i,eAppAction_EthernetDisconnected); + } + else +#endif + { 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 ]; @@ -3257,12 +3447,14 @@ void CMinecraftApp::HandleXuiActions(void) 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()); + ui.RequestErrorMessage(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this); + + } } } } break; - // We currently handle both these returns the same way. + // We currently handle both these returns the same way. case eAppAction_EthernetDisconnectedReturned: case eAppAction_PrimaryPlayerSignedOutReturned: { @@ -3294,14 +3486,14 @@ void CMinecraftApp::HandleXuiActions(void) 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 ); @@ -3352,7 +3544,7 @@ void CMinecraftApp::HandleXuiActions(void) 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()); + ui.RequestErrorMessage(IDS_TRIALOVER_TITLE, IDS_TRIALOVER_TEXT, uiIDA, 2, i,&CMinecraftApp::TrialOverReturned,this); } break; @@ -3366,7 +3558,7 @@ void CMinecraftApp::HandleXuiActions(void) 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()); + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this); } break; case eAppAction_ExitAndJoinFromInvite: @@ -3384,7 +3576,7 @@ void CMinecraftApp::HandleXuiActions(void) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this); } else #else @@ -3394,7 +3586,7 @@ void CMinecraftApp::HandleXuiActions(void) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this); } else #endif @@ -3406,13 +3598,13 @@ void CMinecraftApp::HandleXuiActions(void) // 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()); + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this); } 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 2,i,&CMinecraftApp::ExitAndJoinFromInvite,this); } } } @@ -3430,14 +3622,14 @@ void CMinecraftApp::HandleXuiActions(void) 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 ); @@ -3567,8 +3759,8 @@ void CMinecraftApp::HandleXuiActions(void) // 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.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_CONNECTION_LOST_SERVER, uiIDA,1,ProfileManager.GetPrimaryPad()); + ui.NavigateToHomeMenu(); ui.UpdatePlayerBasePositions(); } @@ -3580,7 +3772,7 @@ void CMinecraftApp::HandleXuiActions(void) 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() ) @@ -3597,11 +3789,11 @@ void CMinecraftApp::HandleXuiActions(void) 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; @@ -3663,7 +3855,7 @@ void CMinecraftApp::HandleXuiActions(void) CheckGameSettingsChanged(true,i); break; - + case eAppAction_RemoteServerSave: { // If the remote server save has already finished, don't complete the action @@ -3674,7 +3866,7 @@ void CMinecraftApp::HandleXuiActions(void) } SetAction(i,eAppAction_WaitRemoteServerSaveComplete); - + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { ui.CloseUIScenes(i, true); @@ -3716,7 +3908,7 @@ void CMinecraftApp::HandleXuiActions(void) { 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()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); if(result != C4JStorage::EMessage_Busy) SetAction(i,eAppAction_Idle); } break; @@ -3736,7 +3928,7 @@ void CMinecraftApp::HandleXuiActions(void) 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 @@ -3780,7 +3972,7 @@ void CMinecraftApp::HandleXuiActions(void) { 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); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_BANNED_LEVEL_TITLE, IDS_PLAYER_BANNED_LEVEL, uiIDA,2,i,&CMinecraftApp::BannedLevelDialogReturned,this, wchFormat); if(result != C4JStorage::EMessage_Busy) SetAction(i,eAppAction_Idle); } else @@ -3809,7 +4001,7 @@ void CMinecraftApp::HandleXuiActions(void) Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->textures->reloadAll(); pMinecraft->skins->updateUI(); - + if(!pMinecraft->skins->isUsingDefaultSkin()) { TexturePack *pTexturePack = pMinecraft->skins->getSelected(); @@ -3833,11 +4025,37 @@ void CMinecraftApp::HandleXuiActions(void) Minecraft::GetInstance()->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); } } + break; + + case eAppAction_ReloadFont: + { +#ifndef _XBOX + app.DebugPrintf( + "[Consoles_App] eAppAction_ReloadFont, ingame='%s'.\n", + app.GetGameStarted() ? "Yes" : "No" ); + + SetAction(i,eAppAction_Idle); + + ui.SetTooltips(i, -1); + + ui.ReloadSkin(); + ui.StartReloadSkinThread(); + ui.setCleanupOnReload(); +#endif + } break; case eAppAction_TexturePackRequired: { +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + UINT uiIDA[2]; + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; // let them continue without the texture pack here (as this is only really for r + // Give the player a warning about the texture pack missing + ui.RequestErrorMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::TexturePackDialogReturned,this); + SetAction(i,eAppAction_Idle); +#else #ifdef _XBOX ULONGLONG ullOfferID_Full; app.GetDLCFullOfferIDForPackID(app.GetRequiredTexturePackID(),&ullOfferID_Full); @@ -3850,8 +4068,9 @@ void CMinecraftApp::HandleXuiActions(void) 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()); + ui.RequestErrorMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::TexturePackDialogReturned,this); SetAction(i,eAppAction_Idle); +#endif } break; @@ -3877,7 +4096,7 @@ void CMinecraftApp::HandleXuiActions(void) app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,eTMSAction_TMSPP_UserFileList); #else SetTMSAction(i,eTMSAction_TMSPP_UserFileList); - #endif +#endif break; #ifdef _XBOX @@ -3983,47 +4202,47 @@ void CMinecraftApp::HandleXuiActions(void) // TMS files -/* case eTMSAction_TMS_RetrieveFiles_CreateLoad_SignInReturned: - case eTMSAction_TMS_RetrieveFiles_RunPlayGame: -#ifdef _XBOX + /* 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 + #else SetTMSAction(i,eTMSAction_TMS_DLCFile); -#endif + #endif break; - case eTMSAction_TMS_DLCFile: -#ifdef _XBOX + 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 + #else SetTMSAction(i,eTMSAction_TMS_BannedListFile); -#endif + #endif break; - case eTMSAction_TMS_RetrieveFiles_HelpAndOptions: - case eTMSAction_TMS_RetrieveFiles_DLCMain: -#ifdef _XBOX + 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 + #else SetTMSAction(i,eTMSAction_Idle); -#endif + #endif break; - case eTMSAction_TMS_BannedListFile: -#ifdef _XBOX + 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 + #else SetTMSAction(i,eTMSAction_TMS_RetrieveFiles_Complete); -#endif + #endif break; @@ -4102,12 +4321,12 @@ void CMinecraftApp::loadMediaArchive() #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 ); + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, + NULL ); if( hFile != INVALID_HANDLE_VALUE ) { @@ -4120,10 +4339,10 @@ void CMinecraftApp::loadMediaArchive() DWORD m_fSize = 0; BOOL hr = ReadFile( hFile, - m_fBody, - dwFileSize, - &m_fSize, - NULL ); + m_fBody, + dwFileSize, + &m_fSize, + NULL ); assert( m_fSize == dwFileSize ); @@ -4199,10 +4418,8 @@ int CMinecraftApp::EthernetDisconnectReturned(void *pParam,int iPad,const C4JSto 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(); +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); #endif app.SetAction(iPad,eAppAction_EthernetDisconnectedReturned_Menus); } @@ -4326,7 +4543,7 @@ int CMinecraftApp::SignoutExitWorldThreadProc( void* lpParameter ) 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() ) { @@ -4362,7 +4579,7 @@ int CMinecraftApp::UnlockFullInviteReturned(void *pParam,int iPad,C4JStorage::EM { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -4377,7 +4594,7 @@ int CMinecraftApp::UnlockFullInviteReturned(void *pParam,int iPad,C4JStorage::EM 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); } #endif @@ -4407,7 +4624,7 @@ int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMes { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -4422,7 +4639,7 @@ int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMes 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); } #elif defined(__ORBIS__) else @@ -4435,14 +4652,14 @@ int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMes UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); } } #endif @@ -4472,7 +4689,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -4491,7 +4708,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app); } #elif defined(__ORBIS__) else @@ -4504,7 +4721,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); // still need to exit the trial or we'll be in the Pause menu with input ignored pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); } @@ -4513,7 +4730,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes // 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app); } } #endif @@ -4545,7 +4762,7 @@ int CMinecraftApp::TrialOverReturned(void *pParam,int iPad,C4JStorage::EMessageR { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -4561,7 +4778,7 @@ int CMinecraftApp::TrialOverReturned(void *pParam,int iPad,C4JStorage::EMessageR 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); // 4J Stu - We can't actually exit the game, so just exit back to the main menu //pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); @@ -4629,7 +4846,7 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange { // Primary Player gone or there's been a sign out and sign in of the primary player, so kick them out pApp->SetAction(iPrimaryPlayer,eAppAction_PrimaryPlayerSignedOut); - + // 4J-PB - invalidate their banned level list pApp->InvalidateBannedList(iPrimaryPlayer); @@ -4665,7 +4882,7 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange { 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()); + ui.RequestErrorMessage(IDS_GUEST_ORDER_CHANGED_TITLE, IDS_GUEST_ORDER_CHANGED_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } // 4J Stu - On PS4 we can also cause to exit players if they are signed out here, but we shouldn't do that if @@ -4687,7 +4904,7 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange 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); + pApp->SetAction(i, eAppAction_ExitPlayer); } else { @@ -4705,11 +4922,13 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange // 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) + + // 4J-HG: If either the player is in the network manager or in the game, need to exit player + // TODO: Do we need to check the network manager? + if (g_NetworkManager.GetLocalPlayerByUserIndex(i) != NULL || Minecraft::GetInstance()->localplayers[i] != NULL) { pApp->DebugPrintf("Player %d signed out\n", i); - pApp->SetAction(i,eAppAction_ExitPlayer); + pApp->SetAction(i, eAppAction_ExitPlayer); } } } @@ -4735,15 +4954,20 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange 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() ) ) { +#ifdef __PSVITA__ + if(!CGameNetworkManager::usingAdhocMode()) // if we're in adhoc mode, we can ignore this +#endif + { 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. @@ -4930,16 +5154,16 @@ void CMinecraftApp::UpsellReturnedCallback(LPVOID pParam, eUpsellType type, eUps #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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); break; #endif case eUpsellResponse_Declined: @@ -4963,6 +5187,13 @@ void CMinecraftApp::UpsellReturnedCallback(LPVOID pParam, eUpsellType type, eUps TelemetryManager->RecordUpsellResponded(ProfileManager.GetPrimaryPad(), eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, senResponse); } +#ifdef _DEBUG_MENUS_ENABLED +bool CMinecraftApp::DebugArtToolsOn() +{ + return DebugSettingsOn() && (GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L< 0) { - Minecraft *pMinecraft=Minecraft::GetInstance(); - pMinecraft->levelRenderer->AddDLCSkinsToMemTextures(); + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->levelRenderer->AddDLCSkinsToMemTextures(); } */ @@ -5108,9 +5339,19 @@ void CMinecraftApp::MountNextDLC(int iPad) } } #endif - } -} - +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + { + TexturePack* currentTPack = Minecraft::GetInstance()->skins->getSelected(); + TexturePack* requiredTPack = Minecraft::GetInstance()->skins->getTexturePackById(app.GetRequiredTexturePackID()); + if(currentTPack != requiredTPack) + { + Minecraft::GetInstance()->skins->selectTexturePackById(app.GetRequiredTexturePackID()); + } + } +#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) @@ -5142,7 +5383,7 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d 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)); @@ -5211,20 +5452,25 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d // } // } - void CMinecraftApp::HandleDLC(DLCPack *pack) - { - DWORD dwFilesProcessed = 0; +void CMinecraftApp::HandleDLC(DLCPack *pack) +{ + DWORD dwFilesProcessed = 0; #ifndef _XBOX #if defined(__PS3__) || defined(__ORBIS__) || defined(_WINDOWS64) || defined (__PSVITA__) - std::vector dlcFilenames; + std::vector dlcFilenames; #elif defined _DURANGO - std::vector dlcFilenames; + std::vector dlcFilenames; +#endif + StorageManager.GetMountedDLCFileList("DLCDrive", dlcFilenames); +#ifdef __ORBIS__ + // 4J Stu - I don't know why we handle more than one file here any more, however this doesn't seem to work with the PS4 patches + if(dlcFilenames.size() > 0) m_dlcManager.readDLCDataFile(dwFilesProcessed, dlcFilenames[0], pack); +#else + for(int i=0; iucRefCount; @@ -5667,7 +5913,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad 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()); + ui.RequestErrorMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,pClass); return S_OK; } @@ -5683,7 +5929,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad 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()); + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned,pClass); return 0; } else @@ -5701,7 +5947,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad 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()); + ui.RequestErrorMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned,pClass); return 0; } @@ -5712,6 +5958,102 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad int CMinecraftApp::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { + // 4J Stu - I added this in when fixing an X1 bug. We should probably add this as well but I don't have time to test all platforms atm +#if 0 //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.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + } + 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 + 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.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); + } + } + } + +#endif #ifdef _XBOX CMinecraftApp* pClass = (CMinecraftApp*)pParam; @@ -5777,7 +6119,7 @@ int CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4 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()); + ui.RequestErrorMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,NULL); return S_OK; } @@ -5797,7 +6139,7 @@ int CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned(void *pParam,int iPa if(result==C4JStorage::EMessage_ResultDecline) { #if defined(_XBOX_ONE) || defined(__ORBIS__) - StorageManager.SetSaveDisabled(false); + StorageManager.SetSaveDisabled(false); #endif MinecraftServer::getInstance()->setSaveOnExit( false ); // flag a app action of exit and join game from invite @@ -5919,9 +6261,9 @@ void CMinecraftApp::InitialiseTips() // randomise then quicksort // going to leave the multiplayer tip so it is always first -// Only randomise the content package build + // Only randomise the content package build #ifdef _CONTENT_PACKAGE - + for(int i=1;inextInt(); @@ -6019,7 +6361,7 @@ int CMinecraftApp::GetHTMLFontSize(EHTMLFontSize 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"
" ); @@ -6094,6 +6436,8 @@ wstring CMinecraftApp::FormatHTMLString(int iPad, const wstring &desc, int shado 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_ACTION_MENU_PAGEDOWN*}", GetActionReplacement(iPad,ACTION_MENU_PAGEDOWN ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DISMOUNT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_SNEAK_TOGGLE ) ); 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) ); @@ -6198,20 +6542,20 @@ wstring CMinecraftApp::GetActionReplacement(int iPad, unsigned char ucAction) 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) - ) + (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) - ) + (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"; } @@ -6465,7 +6809,7 @@ HRESULT CMinecraftApp::RegisterMojangData(WCHAR *pXuidName, PlayerUID xuid, WCHA 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; @@ -6483,27 +6827,27 @@ 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 + // #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; @@ -6630,18 +6974,18 @@ HRESULT CMinecraftApp::RegisterDLCData(eDLCContentType eType, WCHAR *pwchBannerN { case e_DLC_MashupPacks: case e_DLC_TexturePacks: - DLCTextures_PackID[iConfig]=pDLCData->wsProductId; + DLCTextures_PackID[iConfig]=pDLCData->wsProductId; break; } if(pwchFirstSkin[0]!=0) DLCInfo_SkinName[pwchFirstSkin]=pDLCData->wsProductId; - #ifdef _XBOX_ONE +#ifdef _XBOX_ONE // ignore the names, and use the product id instead DLCInfo_Full[pDLCData->wsProductId]=pDLCData; - #else +#else DLCInfo_Full[pDLCData->wsDisplayName]=pDLCData; - #endif +#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; @@ -6689,11 +7033,11 @@ HRESULT CMinecraftApp::RegisterDLCData(char *pchDLCName, unsigned int uiSortInde 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; + // 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; + // DLCInfo[ullOfferID_Trial]=pDLCData; return hr; } @@ -6965,7 +7309,7 @@ DLC_INFO *CMinecraftApp::GetDLCInfoForProductName(WCHAR *pwchProductName) } ++it; } - + return NULL; } @@ -6998,6 +7342,8 @@ void CMinecraftApp::EnterSaveNotificationSection() EnterCriticalSection(&m_saveNotificationCriticalSection); if( m_saveNotificationDepth++ == 0 ) { + if(g_NetworkManager.IsInSession()) // this can be triggered from the front end if we're downloading a save + { MinecraftServer::getInstance()->broadcastStartSavingPacket(); if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) @@ -7005,6 +7351,7 @@ void CMinecraftApp::EnterSaveNotificationSection() app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); } } + } LeaveCriticalSection(&m_saveNotificationCriticalSection); } @@ -7013,6 +7360,8 @@ void CMinecraftApp::LeaveSaveNotificationSection() EnterCriticalSection(&m_saveNotificationCriticalSection); if( --m_saveNotificationDepth == 0 ) { + if(g_NetworkManager.IsInSession()) // this can be triggered from the front end if we're downloading a save + { MinecraftServer::getInstance()->broadcastStopSavingPacket(); if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) @@ -7020,6 +7369,7 @@ void CMinecraftApp::LeaveSaveNotificationSection() app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); } } + } LeaveCriticalSection(&m_saveNotificationCriticalSection); } @@ -7069,12 +7419,12 @@ int CMinecraftApp::RemoteSaveThreadProc( void* lpParameter ) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, primaryPad,&CMinecraftApp::ExitGameFromRemoteSaveDialogReturned,NULL); } int CMinecraftApp::ExitGameFromRemoteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) @@ -7212,12 +7562,12 @@ void CMinecraftApp::RemoveLevelFromBannedLevelList(int iPad, PlayerUID xuid, cha { //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 @@ -7327,8 +7677,8 @@ void CMinecraftApp::SetGameHostOption(eGameHostOption eVal,unsigned int uiVal) } -void CMinecraftApp::SetGameHostOption(unsigned int &uiHostSettings, eGameHostOption eVal,unsigned int uiVal) - { +void CMinecraftApp::SetGameHostOption(unsigned int &uiHostSettings, eGameHostOption eVal, unsigned int uiVal) +{ switch(eVal) { case eGameHostOption_FriendsOfFriends: @@ -7530,6 +7880,99 @@ void CMinecraftApp::SetGameHostOption(unsigned int &uiHostSettings, eGameHostOpt uiHostSettings&=~GAME_HOST_OPTION_BITMASK_DISABLESAVE; } break; + case eGameHostOption_WasntSaveOwner: + if(uiVal!=0) + { + uiHostSettings|=GAME_HOST_OPTION_BITMASK_NOTOWNER; + } + else + { + // off + uiHostSettings&=~GAME_HOST_OPTION_BITMASK_NOTOWNER; + } + break; + case eGameHostOption_MobGriefing: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_MOBGRIEFING; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_MOBGRIEFING; + } + break; + case eGameHostOption_KeepInventory: + if(uiVal!=0) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_KEEPINVENTORY; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_KEEPINVENTORY; + } + break; + case eGameHostOption_DoMobSpawning: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_DOMOBSPAWNING; + } + else + { + // off + uiHostSettings &=~ GAME_HOST_OPTION_BITMASK_DOMOBSPAWNING; + } + break; + case eGameHostOption_DoMobLoot: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_DOMOBLOOT; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_DOMOBLOOT; + } + break; + case eGameHostOption_DoTileDrops: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_DOTILEDROPS; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_DOTILEDROPS; + } + break; + case eGameHostOption_NaturalRegeneration: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_NATURALREGEN; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_NATURALREGEN; + } + break; + case eGameHostOption_DoDaylightCycle: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE; + } + break; + case eGameHostOption_WorldSize: + // clear the difficulty first + uiHostSettings&=~GAME_HOST_OPTION_BITMASK_WORLDSIZE; + uiHostSettings|=(GAME_HOST_OPTION_BITMASK_WORLDSIZE & (uiVal<> GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT; + case eGameHostOption_MobGriefing: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_MOBGRIEFING); + case eGameHostOption_KeepInventory: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_KEEPINVENTORY); + case eGameHostOption_DoMobSpawning: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DOMOBSPAWNING); + case eGameHostOption_DoMobLoot: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DOMOBLOOT); + case eGameHostOption_DoTileDrops: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DOTILEDROPS); + case eGameHostOption_NaturalRegeneration: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_NATURALREGEN); + case eGameHostOption_DoDaylightCycle: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE); + break; } return false; @@ -7614,11 +8081,18 @@ unsigned int CMinecraftApp::GetGameHostOption(unsigned int uiHostSettings, eGame bool CMinecraftApp::CanRecordStatsAndAchievements() { + bool isTutorial = Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->isTutorial(); // 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)); + app.GetGameHostOption(eGameHostOption_HostCanFly) || + app.GetGameHostOption(eGameHostOption_WasntSaveOwner) || + !app.GetGameHostOption(eGameHostOption_MobGriefing) || + app.GetGameHostOption(eGameHostOption_KeepInventory) || + !app.GetGameHostOption(eGameHostOption_DoMobSpawning) || + (!app.GetGameHostOption(eGameHostOption_DoDaylightCycle) && !isTutorial ) + ); } void CMinecraftApp::processSchematics(LevelChunk *levelChunk) @@ -7723,8 +8197,8 @@ void CMinecraftApp::GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsig bHostOptionsRead = true; // read the host options value unsigned int uiValueC=0; - unsigned char pszHostOptions[8]; // Hex representation of unsigned int - ZeroMemory(&pszHostOptions,8); + unsigned char pszHostOptions[9]; // Hex representation of unsigned int + ZeroMemory(&pszHostOptions,9); while(*pszKeyword!=0 && (pszKeyword < ucPtr + uiCount + uiChunkLen) && uiValueC < 8) { pszHostOptions[uiValueC++]=*pszKeyword; @@ -7740,8 +8214,8 @@ void CMinecraftApp::GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsig { // read the texture pack value unsigned int uiValueC=0; - unsigned char pszTexturePack[8]; // Hex representation of unsigned int - ZeroMemory(&pszTexturePack,8); + unsigned char pszTexturePack[9]; // Hex representation of unsigned int + ZeroMemory(&pszTexturePack,9); while(*pszKeyword!=0 && (pszKeyword < ucPtr + uiCount + uiChunkLen) && uiValueC < 8) { pszTexturePack[uiValueC++]=*pszKeyword; @@ -7830,7 +8304,7 @@ bool CMinecraftApp::GetTerrainFeaturePosition(_eTerrainFeatureType eType,int *pX for(AUTO_VAR(it, m_vTerrainFeatures.begin()); it < m_vTerrainFeatures.end(); ++it) { FEATURE_DATA *pFeatureData=*it; - + if(pFeatureData->eTerrainFeature==eType) { *pX=pFeatureData->x; @@ -7936,7 +8410,14 @@ wstring CMinecraftApp::getEntityName(eINSTANCEOF type) // 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); - + case eTYPE_HORSE: + return app.GetString(IDS_HORSE); + case eTYPE_WITCH: + return app.GetString(IDS_WITCH); + case eTYPE_WITHERBOSS: + return app.GetString(IDS_WITHER); + case eTYPE_BAT: + return app.GetString(IDS_BAT); }; return L""; @@ -8015,29 +8496,29 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) { - TMSPPRequest *pCurrent = *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(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; + // re-ordered the list, so leave now + LeaveCriticalSection(&csTMSPPDownloadQueue); + return 0; } */ @@ -8185,7 +8666,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool //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 @@ -8329,7 +8810,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto #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 @@ -8343,7 +8824,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto { #ifdef _XBOX_ONE - + switch(pCurrent->eType) { @@ -8365,10 +8846,10 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto 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); + 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); } @@ -8407,7 +8888,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto } break; } - + } LeaveCriticalSection(&pClass->csTMSPPDownloadQueue); @@ -8661,7 +9142,7 @@ void CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, D m_AdditionalModelParts.insert( std::pair *>(dwSkinID, pvModelPart) ); m_AdditionalSkinBoxes.insert( std::pair *>(dwSkinID, pvSkinBoxes) ); - + LeaveCriticalSection( &csAdditionalSkinBoxes ); LeaveCriticalSection( &csAdditionalModelParts ); @@ -8725,7 +9206,7 @@ vector *CMinecraftApp::GetAdditionalSkinBoxes(DWORD dwSkinID) pvSkinBoxes = (*it).second; } } - + LeaveCriticalSection( &csAdditionalSkinBoxes ); return pvSkinBoxes; } @@ -8770,14 +9251,14 @@ 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 @@ -8801,7 +9282,7 @@ wstring CMinecraftApp::getSkinPathFromId(DWORD 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 { @@ -8822,6 +9303,61 @@ wstring CMinecraftApp::getSkinPathFromId(DWORD skinId) int CMinecraftApp::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { + + +#if defined __PSVITA__ || defined __PS3__ || defined __ORBIS__ + if(result==C4JStorage::EMessage_ResultAccept) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->skins->selectTexturePackById(app.GetRequiredTexturePackID()) ) + { + // it's been installed already + } + else + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo(app.GetRequiredTexturePackID()); + 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); + // 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(app.CheckForEmptyStore(iPad)==false) + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } + } + else + { + app.DebugPrintf("Continuing without installing texture pack\n"); + } +#endif + #ifdef _XBOX if(result!=C4JStorage::EMessage_Cancelled) { @@ -8993,7 +9529,7 @@ bool CMinecraftApp::IsLocalMultiplayerAvailable() void CMinecraftApp::getLocale(vector &vecWstrLocales) { vector locales; - + DWORD dwSystemLanguage = XGetLanguage( ); // 4J-PB - restrict the 360 language until we're ready to have them in @@ -9101,6 +9637,8 @@ void CMinecraftApp::getLocale(vector &vecWstrLocales) case XC_LOCALE_CHILE: case XC_LOCALE_COLOMBIA: case XC_LOCALE_UNITED_STATES: + case XC_LOCALE_LATIN_AMERICA: + locales.push_back(eMCLang_laLAS); locales.push_back(eMCLang_esMX); break; default://XC_LOCALE_SPAIN @@ -9127,6 +9665,7 @@ void CMinecraftApp::getLocale(vector &vecWstrLocales) default: break; } + locales.push_back(eMCLang_hant); locales.push_back(eMCLang_zhCHT); break; case XC_LANGUAGE_PORTUGUESE : @@ -9170,26 +9709,21 @@ void CMinecraftApp::getLocale(vector &vecWstrLocales) { case XC_LOCALE_SINGAPORE: locales.push_back(eMCLang_zhSG); - break; + break; default: break; } - locales.push_back(eMCLang_zhCHS); + locales.push_back(eMCLang_hans); + locales.push_back(eMCLang_csCS); 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; @@ -9238,7 +9772,7 @@ DWORD CMinecraftApp::get_xcLang(WCHAR *pwchLocale) void CMinecraftApp::LocaleAndLanguageInit() { m_localeA[eMCLang_zhCHT] =L"zh-CHT"; - m_localeA[eMCLang_zhCHS] =L"zh-CHS"; + m_localeA[eMCLang_csCS] =L"cs-CS"; m_localeA[eMCLang_laLAS] =L"la-LAS"; m_localeA[eMCLang_null] =L"en-EN"; m_localeA[eMCLang_enUS] =L"en-US"; @@ -9294,14 +9828,17 @@ void CMinecraftApp::LocaleAndLanguageInit() m_localeA[eMCLang_esCO] =L"es-CO"; m_localeA[eMCLang_esUS] =L"es-US"; m_localeA[eMCLang_svSE] =L"sv-SE"; - + m_localeA[eMCLang_csCZ] =L"cs-CZ"; m_localeA[eMCLang_elGR] =L"el-GR"; m_localeA[eMCLang_nnNO] =L"nn-NO"; m_localeA[eMCLang_skSK] =L"sk-SK"; - m_eMCLangA[L"zh-CHT"] =eMCLang_zhCHS; - m_eMCLangA[L"zh-CHS"] =eMCLang_zhCHT; + m_localeA[eMCLang_hans] =L"zh-HANS"; + m_localeA[eMCLang_hant] =L"zh-HANT"; + + m_eMCLangA[L"zh-CHT"] =eMCLang_zhCHT; + m_eMCLangA[L"cs-CS"] =eMCLang_csCS; m_eMCLangA[L"la-LAS"] =eMCLang_laLAS; m_eMCLangA[L"en-EN"] =eMCLang_null; m_eMCLangA[L"en-US"] =eMCLang_enUS; @@ -9363,8 +9900,11 @@ void CMinecraftApp::LocaleAndLanguageInit() m_eMCLangA[L"nn-NO"] =eMCLang_nnNO; m_eMCLangA[L"sk-SK"] =eMCLang_skSK; + m_eMCLangA[L"zh-HANS"] =eMCLang_hans; + m_eMCLangA[L"zh-HANT"] =eMCLang_hant; + m_xcLangA[L"zh-CHT"] =XC_LOCALE_CHINA; - m_xcLangA[L"zh-CHS"] =XC_LOCALE_CHINA; + m_xcLangA[L"cs-CS"] =XC_LOCALE_CHINA; m_xcLangA[L"en-EN"] =XC_LOCALE_UNITED_STATES; m_xcLangA[L"en-US"] =XC_LOCALE_UNITED_STATES; m_xcLangA[L"en-GB"] =XC_LOCALE_GREAT_BRITAIN; @@ -9428,6 +9968,9 @@ void CMinecraftApp::LocaleAndLanguageInit() m_xcLangA[L"cs-CZ"] =XC_LOCALE_CZECH_REPUBLIC; m_xcLangA[L"el-GR"] =XC_LOCALE_GREECE; m_xcLangA[L"sk-SK"] =XC_LOCALE_SLOVAK_REPUBLIC; + + m_xcLangA[L"zh-HANS"] =XC_LOCALE_CHINA; + m_xcLangA[L"zh-HANT"] =XC_LOCALE_CHINA; } void CMinecraftApp::SetTickTMSDLCFiles(bool bVal) @@ -9436,17 +9979,15 @@ void CMinecraftApp::SetTickTMSDLCFiles(bool bVal) m_bTickTMSDLCFiles=bVal; } -wstring CMinecraftApp::getFilePath(DWORD packId, wstring filename, bool bAddDataFolder) +wstring CMinecraftApp::getFilePath(DWORD packId, wstring filename, bool bAddDataFolder, wstring mountPoint) { -#ifdef _XBOX - wstring path = getRootPath(packId, true, bAddDataFolder) + filename; + wstring path = getRootPath(packId, true, bAddDataFolder, mountPoint) + filename; File f(path); if(f.exists()) { return path; } -#endif - return getRootPath(packId, false, true) + filename; + return getRootPath(packId, false, true, mountPoint) + filename; } #ifdef _XBOX @@ -9456,13 +9997,16 @@ enum ETitleUpdateTexturePacks eTUTP_MassEffect = 0x400, eTUTP_Skyrim = 0x401, eTUTP_Halo = 0x402, + eTUTP_Festive = 0x405, eTUTP_Plastic = 0x801, eTUTP_Candy = 0x802, eTUTP_Fantasy = 0x803, eTUTP_Halloween = 0x804, eTUTP_Natural = 0x805, - eTUTP_City = 0x01000806 // 4J Stu - The released City pack had a sub-pack ID + eTUTP_City = 0x01000806, // 4J Stu - The released City pack had a sub-pack ID + eTUTP_Cartoon = 0x807, + eTUTP_Steampunk = 0x01000808, // 4J Stu - The released Steampunk pack had a sub-pack ID }; #ifdef _TU_BUILD @@ -9470,11 +10014,41 @@ wstring titleUpdateTexturePackRoot = L"UPDATE:\\res\\DLC\\"; #else wstring titleUpdateTexturePackRoot = L"GAME:\\res\\TitleUpdate\\DLC\\"; #endif +#else +enum ETitleUpdateTexturePacks +{ + //eTUTP_MassEffect = 0x400, + //eTUTP_Skyrim = 0x401, + //eTUTP_Halo = 0x402, + //eTUTP_Festive = 0x405, + + //eTUTP_Plastic = 0x801, + //eTUTP_Candy = 0x802, + //eTUTP_Fantasy = 0x803, + eTUTP_Halloween = 0x804, + //eTUTP_Natural = 0x805, + //eTUTP_City = 0x01000806, // 4J Stu - The released City pack had a sub-pack ID + //eTUTP_Cartoon = 0x807, + //eTUTP_Steampunk = 0x01000808, // 4J Stu - The released Steampunk pack had a sub-pack ID +}; + +#ifdef _WINDOWS64 +wstring titleUpdateTexturePackRoot = L"Windows64\\DLC\\"; +#elif defined(__ORBIS__) +wstring titleUpdateTexturePackRoot = L"/app0/orbis/CU/DLC/"; +#elif defined(__PSVITA__) +wstring titleUpdateTexturePackRoot = L"PSVita/CU/DLC/"; +#elif defined(__PS3__) +wstring titleUpdateTexturePackRoot = L"PS3/CU/DLC/"; +#else +wstring titleUpdateTexturePackRoot = L"CU\\DLC\\"; +#endif + #endif -wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder) +wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder, wstring mountPoint) { - wstring path = L"TPACK:"; + wstring path = mountPoint; #ifdef _XBOX if(allowOverride) { @@ -9489,6 +10063,9 @@ wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDa case eTUTP_Halo: path = titleUpdateTexturePackRoot + L"Halo"; break; + case eTUTP_Festive: + path = titleUpdateTexturePackRoot + L"Festive"; + break; case eTUTP_Plastic: path = titleUpdateTexturePackRoot + L"Plastic"; break; @@ -9507,11 +10084,32 @@ wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDa case eTUTP_City: path = titleUpdateTexturePackRoot + L"City"; break; + case eTUTP_Cartoon: + path = titleUpdateTexturePackRoot + L"Cartoon"; + break; + case eTUTP_Steampunk: + path = titleUpdateTexturePackRoot + L"Steampunk"; + break; }; File folder(path); if(!folder.exists()) { - path = L"TPACK:"; + path = mountPoint; + } + } +#else + if(allowOverride) + { + switch(packId) + { + case eTUTP_Halloween: + path = titleUpdateTexturePackRoot + L"Halloween Texture Pack"; + break; + }; + File folder(path); + if(!folder.exists()) + { + path = mountPoint; } } #endif @@ -9524,6 +10122,7 @@ wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDa { return path + L"\\"; } + } #ifdef _XBOX_ONE diff --git a/Minecraft.Client/Common/Consoles_App.h b/Minecraft.Client/Common/Consoles_App.h index 110054f2..ec36b765 100644 --- a/Minecraft.Client/Common/Consoles_App.h +++ b/Minecraft.Client/Common/Consoles_App.h @@ -39,6 +39,11 @@ class Container; class DispenserTileEntity; class SignTileEntity; class BrewingStandTileEntity; +class CommandBlockEntity; +class HopperTileEntity; +class MinecartHopper; +class EntityHorse; +class BeaconTileEntity; class LocalPlayer; class DLCPack; class LevelRuleset; @@ -87,9 +92,9 @@ public: #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. - */ + * 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 @@ -108,7 +113,7 @@ public: 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;} @@ -127,23 +132,30 @@ public: 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 LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level, const wstring &name); 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 LoadFireworksMenu(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 LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level, const wstring &name); + + bool LoadCommandBlockMenu(int iPad, shared_ptr commandBlock) { return false; } + bool LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper); + bool LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper); + bool LoadHorseMenu(int iPad ,shared_ptr inventory, shared_ptr container, shared_ptr horse); + bool LoadBeaconMenu(int iPad ,shared_ptr inventory, shared_ptr beacon); bool GetTutorialMode() { return m_bTutorialMode;} void SetTutorialMode(bool bSet) {m_bTutorialMode=bSet;} void SetSpecialTutorialCompletionFlag(int iPad, int index); - static LPCWSTR GetString(int iID); + static LPCWSTR GetString(int iID); eGameMode GetGameMode() { return m_eGameMode;} void SetGameMode(eGameMode eMode) { m_eGameMode=eMode;} @@ -159,7 +171,7 @@ public: 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; } @@ -206,6 +218,7 @@ public: static int OldProfileVersionCallback(LPVOID pParam,unsigned char *pucData, const unsigned short usVersion, const int iPad); #if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) + wstring toStringOptionsStatus(const C4JStorage::eOptionsCallback &eStatus); static int DefaultOptionsCallback(LPVOID pParam,C4JStorage::PROFILESETTINGS *pSettings, const int iPad); int SetDefaultOptions(C4JStorage::PROFILESETTINGS *pSettings,const int iPad,bool bWriteProfile=true); #ifdef __ORBIS__ @@ -224,7 +237,7 @@ public: #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 @@ -247,7 +260,8 @@ public: // Minecraft language select void SetMinecraftLanguage(int iPad, unsigned char ucLanguage); unsigned char GetMinecraftLanguage(int iPad); - + void SetMinecraftLocale(int iPad, unsigned char ucLanguage); + unsigned char GetMinecraftLocale(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]; } @@ -301,9 +315,11 @@ public: #endif #ifdef _DEBUG_MENUS_ENABLED - bool DebugSettingsOn() { return m_bDebugOptions;} + bool DebugSettingsOn() { return m_bDebugOptions;} + bool DebugArtToolsOn(); #else - bool DebugSettingsOn() { return false;} + bool DebugSettingsOn() { return false;} + bool DebugArtToolsOn() { return false;} #endif void SetDebugSequence(const char *pchSeq); static int DebugInputCallback(LPVOID pParam); @@ -424,10 +440,10 @@ public: 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); @@ -440,7 +456,7 @@ private: // Container scene for some menu -// CXuiScene debugContainerScene; + // CXuiScene debugContainerScene; //bool m_bSplitScreenEnabled; @@ -482,14 +498,14 @@ public: static const DWORD m_dwOfferID = 0x00000001; -// timer + // timer void InitTime(); void UpdateTime(); // trial timer void SetTrialTimerStart(void); float getTrialTimer(void); - + // notifications from the game for qnet VNOTIFICATIONS *GetNotifications() {return &m_vNotifications;} @@ -599,7 +615,7 @@ public: unsigned int GetDLCCreditsCount(); SCreditTextItemDef * GetDLCCredits(int iIndex); -// TMS + // TMS void ReadDLCFileFromTMS(int iPad,eTMSAction action, bool bCallback=false); void ReadXuidsFileFromTMS(int iPad,eTMSAction action,bool bCallback=false); @@ -633,8 +649,8 @@ private: 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_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 @@ -651,13 +667,13 @@ public: XUSER_SIGNIN_INFO m_currentSigninInfo[XUSER_MAX_COUNT]; //void OverrideFontRenderer(bool set, bool immediate = true); -// void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); } + // void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); } BANNEDLIST BannedListA[XUSER_MAX_COUNT]; private: -// XUI_FontRenderer *m_fontRenderer; -// bool m_bFontRendererOverridden; -// bool m_bOverrideFontRenderer; + // XUI_FontRenderer *m_fontRenderer; + // bool m_bFontRendererOverridden; + // bool m_bOverrideFontRenderer; bool m_bRead_BannedListA[XUSER_MAX_COUNT]; @@ -667,7 +683,7 @@ private: public: void SetBanListCheck(int iPad,bool bVal) {m_BanListCheck[iPad]=bVal;} bool GetBanListCheck(int iPad) { return m_BanListCheck[iPad];} -// AUTOSAVE + // AUTOSAVE public: void SetAutosaveTimerTime(void); bool AutosaveDue(void); @@ -685,6 +701,11 @@ private: unsigned int m_uiGameHostSettings; static unsigned char m_szPNG[8]; +#ifdef _LARGE_WORLDS + unsigned int m_GameNewWorldSize; + bool m_bGameNewWorldSizeUseMoat; + unsigned int m_GameNewHellScale; +#endif unsigned int FromBigEndian(unsigned int uiValue); public: @@ -695,6 +716,13 @@ public: unsigned int GetGameHostOption(eGameHostOption eVal); unsigned int GetGameHostOption(unsigned int uiHostSettings, eGameHostOption eVal); +#ifdef _LARGE_WORLDS + void SetGameNewWorldSize(unsigned int newSize, bool useMoat) { m_GameNewWorldSize = newSize; m_bGameNewWorldSizeUseMoat = useMoat; } + unsigned int GetGameNewWorldSize() { return m_GameNewWorldSize; } + unsigned int GetGameNewWorldSizeUseMoat() { return m_bGameNewWorldSizeUseMoat; } + void SetGameNewHellScale(unsigned int newScale) { m_GameNewHellScale = newScale; } + unsigned int GetGameNewHellScale() { return m_GameNewHellScale; } +#endif void SetResetNether(bool bResetNether) {m_bResetNether=bResetNether;} bool GetResetNether() {return m_bResetNether;} bool CanRecordStatsAndAchievements(); @@ -808,9 +836,9 @@ 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); + // 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); @@ -875,27 +903,27 @@ public: void SetTickTMSDLCFiles(bool bVal); - wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder); + wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder, wstring mountPoint = L"TPACK:"); private: - unordered_mapm_localeA; - unordered_mapm_eMCLangA; - unordered_mapm_xcLangA; - wstring getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder); + unordered_mapm_localeA; + unordered_mapm_eMCLangA; + unordered_mapm_xcLangA; + wstring getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder, wstring mountPoint); public: #ifdef _XBOX -// bool m_bTransferSavesToXboxOne; -// unsigned int m_uiTransferSlotC; - + // bool m_bTransferSavesToXboxOne; + // unsigned int m_uiTransferSlotC; + #elif defined (__PS3__) - + #elif defined _DURANGO - + #elif defined _WINDOWS64 //CMinecraftAudio audio; #else // PS4 - + #endif #ifdef _XBOX_ONE diff --git a/Minecraft.Client/Common/DLC/DLCManager.cpp b/Minecraft.Client/Common/DLC/DLCManager.cpp index 123e4266..17c9fc6d 100644 --- a/Minecraft.Client/Common/DLC/DLCManager.cpp +++ b/Minecraft.Client/Common/DLC/DLCManager.cpp @@ -91,6 +91,28 @@ void DLCManager::removePack(DLCPack *pack) } } +void DLCManager::removeAllPacks(void) +{ + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = (DLCPack *)*it; + delete pack; + } + + m_packs.clear(); +} + +void DLCManager::LanguageChanged(void) +{ + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = (DLCPack *)*it; + // update the language + pack->UpdateLanguage(); + } + +} + DLCPack *DLCManager::getPack(const wstring &name) { DLCPack *pack = NULL; @@ -292,12 +314,12 @@ DWORD DLCManager::checkForCorruptDLCAndAlert(bool showMessage /*= true*/) 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); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL,wchFormat); } else { - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC_MULTIPLE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC_MULTIPLE, uiIDA,1,ProfileManager.GetPrimaryPad()); } } diff --git a/Minecraft.Client/Common/DLC/DLCManager.h b/Minecraft.Client/Common/DLC/DLCManager.h index 55a62312..27765232 100644 --- a/Minecraft.Client/Common/DLC/DLCManager.h +++ b/Minecraft.Client/Common/DLC/DLCManager.h @@ -74,6 +74,8 @@ public: void addPack(DLCPack *pack); void removePack(DLCPack *pack); + void removeAllPacks(void); + void LanguageChanged(void); DLCPack *getPack(const wstring &name); #ifdef _XBOX_ONE diff --git a/Minecraft.Client/Common/DLC/DLCPack.cpp b/Minecraft.Client/Common/DLC/DLCPack.cpp index 507e51a7..4a003d05 100644 --- a/Minecraft.Client/Common/DLC/DLCPack.cpp +++ b/Minecraft.Client/Common/DLC/DLCPack.cpp @@ -191,7 +191,8 @@ DLCFile *DLCPack::addFile(DLCManager::EDLCType type, const wstring &path) { case DLCManager::e_DLCType_Skin: { - std::vector splitPath = stringSplit(path,L'/'); + wstring newPath = replaceAll(path, L"\\", L"/"); + std::vector splitPath = stringSplit(newPath,L'/'); wstring strippedPath = splitPath.back(); newFile = new DLCSkinFile(strippedPath); @@ -211,7 +212,8 @@ DLCFile *DLCPack::addFile(DLCManager::EDLCType type, const wstring &path) break; case DLCManager::e_DLCType_Cape: { - std::vector splitPath = stringSplit(path,L'/'); + wstring newPath = replaceAll(path, L"\\", L"/"); + std::vector splitPath = stringSplit(newPath,L'/'); wstring strippedPath = splitPath.back(); newFile = new DLCCapeFile(strippedPath); } @@ -411,3 +413,19 @@ bool DLCPack::hasPurchasedFile(DLCManager::EDLCType type, const wstring &path) return true; }*/ } + +void DLCPack::UpdateLanguage() +{ + // find the language file + DLCManager::e_DLCType_LocalisationData; + DLCFile *file = NULL; + + if(m_files[DLCManager::e_DLCType_LocalisationData].size() > 0) + { + file = m_files[DLCManager::e_DLCType_LocalisationData][0]; + DLCLocalisationFile *localisationFile = (DLCLocalisationFile *)getFile(DLCManager::e_DLCType_LocalisationData, L"languages.loc"); + StringTable *strTable = localisationFile->getStringTable(); + strTable->ReloadStringTable(); + } + +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCPack.h b/Minecraft.Client/Common/DLC/DLCPack.h index 856744c2..df1f65f0 100644 --- a/Minecraft.Client/Common/DLC/DLCPack.h +++ b/Minecraft.Client/Common/DLC/DLCPack.h @@ -68,6 +68,8 @@ public: DWORD getLicenseMask( ) { return m_dwLicenseMask; } wstring getName() { return m_packName; } + + void UpdateLanguage(); #ifdef _XBOX_ONE wstring getPurchaseOfferId() { return m_wsProductId; } #else diff --git a/Minecraft.Client/Common/DLC/DLCTextureFile.cpp b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp index cf99465a..edf071c6 100644 --- a/Minecraft.Client/Common/DLC/DLCTextureFile.cpp +++ b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp @@ -30,6 +30,7 @@ void DLCTextureFile::addParameter(DLCManager::EDLCParameterType type, const wstr { case DLCManager::e_DLCParamType_Anim: m_animString = value; + if(m_animString.empty()) m_animString = L","; m_bIsAnim = true; break; diff --git a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h index 5b97b108..91c4ef35 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h @@ -35,4 +35,8 @@ public: bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); virtual int getMinY(); + + EStructurePiece GetType() { return (EStructurePiece)0; } + void addAdditonalSaveData(CompoundTag *tag) {} + void readAdditonalSaveData(CompoundTag *tag) {} }; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp index 4a4e27b2..3b995000 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp @@ -278,7 +278,7 @@ __int64 ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkB //{ // if(blockData[i] == Tile::sand_Id || blockData[i] == Tile::sandStone_Id) // { - // blockData[i] = Tile::whiteStone_Id; + // blockData[i] = Tile::endStone_Id; // } //} @@ -706,15 +706,19 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l shared_ptr e = *it; bool mobCanBeSaved = false; - if(bSaveMobs) + 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 ) ) + if ( e->instanceof(eTYPE_MONSTER) || e->instanceof(eTYPE_WATERANIMAL) || e->instanceof(eTYPE_ANIMAL) || (e->GetType() == eTYPE_VILLAGER) ) + + // 4J-JEV: All these are derived from eTYPE_ANIMAL and true implicitly. + //|| ( e->GetType() == eTYPE_CHICKEN ) || ( e->GetType() == eTYPE_WOLF ) || ( 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) + + // 4J-JEV: Changed to check for instances of minecarts and hangingEntities instead of just eTYPE_PAINTING, eTYPE_ITEM_FRAME and eTYPE_MINECART + if (mobCanBeSaved || e->instanceof(eTYPE_MINECART) || e->GetType() == eTYPE_BOAT || e->instanceof(eTYPE_HANGING_ENTITY)) { CompoundTag *eTag = new CompoundTag(); if( e->save(eTag) ) @@ -725,7 +729,7 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l pos->get(1)->data -= yStart; pos->get(2)->data -= zStart; - if( e->GetType() == eTYPE_PAINTING || e->GetType() == eTYPE_ITEM_FRAME ) + if( e->instanceof(eTYPE_HANGING_ENTITY) ) { ((IntTag *) eTag->get(L"TileX") )->data -= xStart; ((IntTag *) eTag->get(L"TileY") )->data -= yStart; diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp index 0c6a7804..6e5688cc 100644 --- a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp @@ -106,17 +106,14 @@ void GameRuleManager::loadGameRules(DLCPack *pack) DWORD dSize; byte *dData = dlcHeader->getData(dSize); - LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(pack); // = loadGameRules(dData, dSize); //, strings); createdLevelGenerationOptions->setGrSource( dlcHeader ); + createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); - createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); - - - //createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); dlcHeader->lgo = createdLevelGenerationOptions; } @@ -128,15 +125,13 @@ void GameRuleManager::loadGameRules(DLCPack *pack) DWORD dSize; byte *dData = dlcFile->getData(dSize); - LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(pack); // = loadGameRules(dData, dSize); //, strings); createdLevelGenerationOptions->setGrSource( new JustGrSource() ); - readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); - createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_tutorial ); - - //createdLevelGenerationOptions->set_DLCGameRulesFile( dlcFile ); + + readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); createdLevelGenerationOptions->setLoadedData(); } @@ -659,6 +654,25 @@ void GameRuleManager::loadDefaultGameRules() #else // _XBOX +#ifdef _WINDOWS64 + File packedTutorialFile(L"Windows64Media\\Tutorial\\Tutorial.pck"); + if(!packedTutorialFile.exists()) packedTutorialFile = File(L"Windows64\\Tutorial\\Tutorial.pck"); +#elif defined(__ORBIS__) + File packedTutorialFile(L"/app0/orbis/Tutorial/Tutorial.pck"); +#elif defined(__PSVITA__) + File packedTutorialFile(L"PSVita/Tutorial/Tutorial.pck"); +#elif defined(__PS3__) + File packedTutorialFile(L"PS3/Tutorial/Tutorial.pck"); +#else + File packedTutorialFile(L"Tutorial\\Tutorial.pck"); +#endif + 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)); + } +#if 0 wstring fpTutorial = L"Tutorial.pck"; if(app.getArchiveFileSize(fpTutorial) >= 0) { @@ -667,25 +681,18 @@ void GameRuleManager::loadDefaultGameRules() 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)); + //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 #endif } bool GameRuleManager::loadGameRulesPack(File *path) { bool success = false; -#ifdef _XBOX if(path->exists()) { DLCPack *pack = new DLCPack(L"",0xffffffff); @@ -700,12 +707,13 @@ bool GameRuleManager::loadGameRulesPack(File *path) delete pack; } } -#endif return success; } void GameRuleManager::setLevelGenerationOptions(LevelGenerationOptions *levelGen) { + unloadCurrentGameRules(); + m_currentGameRuleDefinitions = NULL; m_currentLevelGenerationOptions = levelGen; diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp index 717b066e..9ebd3428 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp @@ -7,6 +7,7 @@ #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 "Common\DLC\DLCGameRulesHeader.h" #include "..\..\StringTable.h" #include "LevelGenerationOptions.h" #include "ConsoleGameRules.h" @@ -41,7 +42,7 @@ void JustGrSource::setBaseSavePath(const wstring &x) { m_baseSavePath = x; m_bRe bool JustGrSource::ready() { return true; } -LevelGenerationOptions::LevelGenerationOptions() +LevelGenerationOptions::LevelGenerationOptions(DLCPack *parentPack) { m_spawnPos = NULL; m_stringTable = NULL; @@ -49,6 +50,7 @@ LevelGenerationOptions::LevelGenerationOptions() m_hasLoadedData = false; m_seed = 0; + m_bHasBeenInCreative = true; m_useFlatWorld = false; m_bHaveMinY = false; m_minY = INT_MAX; @@ -56,6 +58,9 @@ LevelGenerationOptions::LevelGenerationOptions() m_pbBaseSaveData = NULL; m_dwBaseSaveSize = 0; + + m_parentDLCPack = parentPack; + m_bLoadingData = false; } LevelGenerationOptions::~LevelGenerationOptions() @@ -70,17 +75,17 @@ LevelGenerationOptions::~LevelGenerationOptions() { 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; @@ -93,7 +98,7 @@ ConsoleGameRules::EGameRuleType LevelGenerationOptions::getActionType() { return 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); @@ -110,12 +115,12 @@ void LevelGenerationOptions::writeAttributes(DataOutputStream *dos, UINT numAttr 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++) @@ -190,24 +195,24 @@ void LevelGenerationOptions::addAttribute(const wstring &attributeName, const ws { 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)); + wstring string(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)); + wstring string(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)); + wstring string(attributeValue); if(!string.empty()) setDisplayName( string ); else setDisplayName( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter displayName=%ls\n", getDisplayName()); @@ -228,6 +233,12 @@ void LevelGenerationOptions::addAttribute(const wstring &attributeName, const ws setBaseSavePath( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter baseSaveName=%ls\n", getBaseSavePath().c_str()); } + else if(attributeName.compare(L"hasBeenInCreative") == 0) + { + bool value = _fromString(attributeValue); + m_bHasBeenInCreative = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter gameMode=%d\n", m_bHasBeenInCreative); + } else { GameRuleDefinition::addAttribute(attributeName, attributeValue); @@ -297,7 +308,7 @@ bool LevelGenerationOptions::checkIntersects(int x0, int y0, int z0, int x1, int 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; @@ -413,14 +424,14 @@ void LevelGenerationOptions::getBiomeOverride(int biomeId, BYTE &tile, BYTE &top } } -bool LevelGenerationOptions::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature) +bool LevelGenerationOptions::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation) { bool isFeature = false; for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) { StartFeature *sf = *it; - if(sf->isFeatureChunk(chunkX, chunkZ, feature)) + if(sf->isFeatureChunk(chunkX, chunkZ, feature, orientation)) { isFeature = true; break; @@ -442,15 +453,175 @@ unordered_map *LevelGenerationOptions::getUnfin = new unordered_map(); for (AUTO_VAR(it, usedFiles.begin()); it!=usedFiles.end(); it++) out->insert( pair(*it, getSchematicFile(*it)) ); - + return out; } +void LevelGenerationOptions::loadBaseSaveData() +{ + int mountIndex = -1; + if(m_parentDLCPack != NULL) mountIndex = m_parentDLCPack->GetDLCMountIndex(); + + if(mountIndex > -1) + { +#ifdef _DURANGO + if(StorageManager.MountInstalledDLC(ProfileManager.GetPrimaryPad(),mountIndex,&LevelGenerationOptions::packMounted,this,L"WPACK")!=ERROR_IO_PENDING) +#else + if(StorageManager.MountInstalledDLC(ProfileManager.GetPrimaryPad(),mountIndex,&LevelGenerationOptions::packMounted,this,"WPACK")!=ERROR_IO_PENDING) +#endif + { + // corrupt DLC + setLoadedData(); + app.DebugPrintf("Failed to mount LGO DLC %d for pad %d\n",mountIndex,ProfileManager.GetPrimaryPad()); + } + else + { + m_bLoadingData = true; + app.DebugPrintf("Attempted to mount DLC data for LGO %d\n", mountIndex); + } + } + else + { + setLoadedData(); + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); + } +} + +int LevelGenerationOptions::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask) +{ + LevelGenerationOptions *lgo = (LevelGenerationOptions *)pParam; + lgo->m_bLoadingData = false; + if(dwErr!=ERROR_SUCCESS) + { + // corrupt DLC + app.DebugPrintf("Failed to mount LGO DLC for pad %d: %d\n",iPad,dwErr); + } + else + { + app.DebugPrintf("Mounted DLC for LGO, attempting to load data\n"); + DWORD dwFilesProcessed = 0; + int gameRulesCount = lgo->m_parentDLCPack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader); + for(int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesHeader *dlcFile = (DLCGameRulesHeader *) lgo->m_parentDLCPack->getFile(DLCManager::e_DLCType_GameRulesHeader, i); + + if (!dlcFile->getGrfPath().empty()) + { + File grf( app.getFilePath(lgo->m_parentDLCPack->GetPackID(), dlcFile->getGrfPath(),true, L"WPACK:" ) ); + if (grf.exists()) + { +#ifdef _UNICODE + wstring path = grf.getPath(); + const WCHAR *pchFilename=path.c_str(); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#else + const char *pchFilename=wstringtofilename(grf.getPath()); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#endif + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD dwFileSize = grf.length(); + DWORD bytesRead; + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(fileHandle); + + // 4J-PB - is it possible that we can get here after a read fail and it's not an error? + dlcFile->setGrfData(pbData, dwFileSize, lgo->m_stringTable); + + delete [] pbData; + + app.m_gameRules.setLevelGenerationOptions( dlcFile->lgo ); + } + } + } + } + if(lgo->requiresBaseSave() && !lgo->getBaseSavePath().empty() ) + { + File save(app.getFilePath(lgo->m_parentDLCPack->GetPackID(), lgo->getBaseSavePath(),true, L"WPACK:" )); + if (save.exists()) + { +#ifdef _UNICODE + wstring path = save.getPath(); + const WCHAR *pchFilename=path.c_str(); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#else + const char *pchFilename=wstringtofilename(save.getPath()); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#endif + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD bytesRead,dwFileSize = GetFileSize(fileHandle,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(fileHandle); + + // 4J-PB - is it possible that we can get here after a read fail and it's not an error? + lgo->setBaseSaveData(pbData, dwFileSize); + } + } + + } +#ifdef _DURANGO + DWORD result = StorageManager.UnmountInstalledDLC(L"WPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("WPACK"); +#endif + + } + + lgo->setLoadedData(); + + return 0; +} + void LevelGenerationOptions::reset_start() { for ( AUTO_VAR( it, m_schematicRules.begin()); - it != m_schematicRules.end(); - it++ ) + it != m_schematicRules.end(); + it++ ) { (*it)->reset(); } @@ -478,9 +649,38 @@ 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::getDefaultSaveName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getDefaultSaveName() ); + case eSrc_fromDLC: return getString( info()->getDefaultSaveName() ); + case eSrc_tutorial: return app.GetString(IDS_TUTORIALSAVENAME); + } + return L""; +} +LPCWSTR LevelGenerationOptions::getWorldName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getWorldName() ); + case eSrc_fromDLC: return getString( info()->getWorldName() ); + case eSrc_tutorial: return app.GetString(IDS_PLAY_TUTORIAL); + } + return L""; +} +LPCWSTR LevelGenerationOptions::getDisplayName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getDisplayName() ); + case eSrc_fromDLC: return getString( info()->getDisplayName() ); + case eSrc_tutorial: return L""; + } + return L""; +} + wstring LevelGenerationOptions::getGrfPath() { return info()->getGrfPath(); } bool LevelGenerationOptions::requiresBaseSave() { return info()->requiresBaseSave(); } wstring LevelGenerationOptions::getBaseSavePath() { return info()->getBaseSavePath(); } @@ -506,6 +706,7 @@ bool LevelGenerationOptions::hasLoadedData() { return m_hasLoadedData; } void LevelGenerationOptions::setLoadedData() { m_hasLoadedData = true; } __int64 LevelGenerationOptions::getLevelSeed() { return m_seed; } +int LevelGenerationOptions::getLevelHasBeenInCreative() { return m_bHasBeenInCreative; } Pos *LevelGenerationOptions::getSpawnPos() { return m_spawnPos; } bool LevelGenerationOptions::getuseFlatWorld() { return m_useFlatWorld; } diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h index 0cc9da79..aa128ff8 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h @@ -149,6 +149,7 @@ private: __int64 m_seed; bool m_useFlatWorld; Pos *m_spawnPos; + int m_bHasBeenInCreative; vector m_schematicRules; vector m_structureRules; bool m_bHaveMinY; @@ -162,8 +163,11 @@ private: StringTable *m_stringTable; + DLCPack *m_parentDLCPack; + bool m_bLoadingData; + public: - LevelGenerationOptions(); + LevelGenerationOptions(DLCPack *parentPack = NULL); ~LevelGenerationOptions(); virtual ConsoleGameRules::EGameRuleType getActionType(); @@ -174,6 +178,7 @@ public: virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); __int64 getLevelSeed(); + int getLevelHasBeenInCreative(); Pos *getSpawnPos(); bool getuseFlatWorld(); @@ -197,12 +202,15 @@ public: LevelRuleset *getRequiredGameRules(); void getBiomeOverride(int biomeId, BYTE &tile, BYTE &topTile); - bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature); + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation = NULL); void loadStringTable(StringTable *table); LPCWSTR getString(const wstring &key); unordered_map *getUnfinishedSchematicFiles(); + + void loadBaseSaveData(); + static int packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask); // 4J-JEV: // ApplySchematicRules contain limited state diff --git a/Minecraft.Client/Common/GameRules/StartFeature.cpp b/Minecraft.Client/Common/GameRules/StartFeature.cpp index 9d5f15c0..7f0c8b5c 100644 --- a/Minecraft.Client/Common/GameRules/StartFeature.cpp +++ b/Minecraft.Client/Common/GameRules/StartFeature.cpp @@ -6,12 +6,13 @@ StartFeature::StartFeature() { m_chunkX = 0; m_chunkZ = 0; + m_orientation = 0; m_feature = StructureFeature::eFeature_Temples; } void StartFeature::writeAttributes(DataOutputStream *dos, UINT numAttrs) { - GameRuleDefinition::writeAttributes(dos, numAttrs + 3); + GameRuleDefinition::writeAttributes(dos, numAttrs + 4); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_chunkX); dos->writeUTF(_toString(m_chunkX)); @@ -19,6 +20,8 @@ void StartFeature::writeAttributes(DataOutputStream *dos, UINT numAttrs) dos->writeUTF(_toString(m_chunkZ)); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_feature); dos->writeUTF(_toString((int)m_feature)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_orientation); + dos->writeUTF(_toString(m_orientation)); } void StartFeature::addAttribute(const wstring &attributeName, const wstring &attributeValue) @@ -35,6 +38,12 @@ void StartFeature::addAttribute(const wstring &attributeName, const wstring &att m_chunkZ = value; app.DebugPrintf("StartFeature: Adding parameter chunkZ=%d\n",m_chunkZ); } + else if(attributeName.compare(L"orientation") == 0) + { + int value = _fromString(attributeValue); + m_orientation = value; + app.DebugPrintf("StartFeature: Adding parameter orientation=%d\n",m_orientation); + } else if(attributeName.compare(L"feature") == 0) { int value = _fromString(attributeValue); @@ -47,7 +56,8 @@ void StartFeature::addAttribute(const wstring &attributeName, const wstring &att } } -bool StartFeature::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature) +bool StartFeature::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation) { + if(orientation != NULL) *orientation = m_orientation; 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 index d3f1280a..b198a2fa 100644 --- a/Minecraft.Client/Common/GameRules/StartFeature.h +++ b/Minecraft.Client/Common/GameRules/StartFeature.h @@ -7,7 +7,7 @@ using namespace std; class StartFeature : public GameRuleDefinition { private: - int m_chunkX, m_chunkZ; + int m_chunkX, m_chunkZ, m_orientation; StructureFeature::EFeatureTypes m_feature; public: @@ -18,5 +18,5 @@ public: 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); + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp index 8184f45b..d81a2b03 100644 --- a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp @@ -74,16 +74,16 @@ bool XboxStructureActionPlaceContainer::placeContainerInLevel(StructurePiece *st { // Remove the current tile entity level->removeTileEntity( worldX, worldY, worldZ ); - level->setTile( worldX, worldY, worldZ, 0 ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_ALL ); } - level->setTile( worldX, worldY, worldZ, m_tile ); + level->setTileAndData( worldX, worldY, worldZ, m_tile, 0, Tile::UPDATE_ALL ); 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); + level->setData( worldX, worldY, worldZ, m_data, Tile::UPDATE_CLIENTS); // Add items int slotId = 0; for(AUTO_VAR(it, m_items.begin()); it != m_items.end() && (slotId < container->getContainerSize()); ++it, ++slotId ) diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp index 1eca3342..3f6204af 100644 --- a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp @@ -50,10 +50,10 @@ bool XboxStructureActionPlaceSpawner::placeSpawnerInLevel(StructurePiece *struct { // Remove the current tile entity level->removeTileEntity( worldX, worldY, worldZ ); - level->setTile( worldX, worldY, worldZ, 0 ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_ALL ); } - level->setTile( worldX, worldY, worldZ, m_tile ); + level->setTileAndData( worldX, worldY, worldZ, m_tile, 0, Tile::UPDATE_ALL ); shared_ptr entity = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); #ifndef _CONTENT_PACKAGE diff --git a/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp new file mode 100644 index 00000000..07463517 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp @@ -0,0 +1,88 @@ +#include "stdafx.h" +#include "LeaderboardInterface.h" + +LeaderboardInterface::LeaderboardInterface(LeaderboardManager *man) +{ + m_manager = man; + m_pending = false; + + m_filter = (LeaderboardManager::EFilterMode) -1; + m_callback = NULL; + m_difficulty = 0; + m_type = LeaderboardManager::eStatsType_UNDEFINED; + m_startIndex = 0; + m_readCount = 0; + + m_manager->OpenSession(); +} + +LeaderboardInterface::~LeaderboardInterface() +{ + m_manager->CancelOperation(); + m_manager->CloseSession(); +} + +void LeaderboardInterface::ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_Friends; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_myUID = myUID; + m_startIndex = startIndex; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_MyScore; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_myUID = myUID; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, unsigned int startIndex, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_TopRank; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_startIndex = startIndex; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::CancelOperation() +{ + m_manager->CancelOperation(); + m_pending = false; +} + +void LeaderboardInterface::tick() +{ + if (m_pending) m_pending = !callManager(); +} + +bool LeaderboardInterface::callManager() +{ + switch (m_filter) + { + case LeaderboardManager::eFM_Friends: return m_manager->ReadStats_Friends(m_callback, m_difficulty, m_type, m_myUID, m_startIndex, m_readCount); + case LeaderboardManager::eFM_MyScore: return m_manager->ReadStats_MyScore(m_callback, m_difficulty, m_type, m_myUID, m_readCount); + case LeaderboardManager::eFM_TopRank: return m_manager->ReadStats_TopRank(m_callback, m_difficulty, m_type, m_startIndex, m_readCount); + default: assert(false); return true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h new file mode 100644 index 00000000..089c482b --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h @@ -0,0 +1,35 @@ +#pragma once + +#include "LeaderboardManager.h" + +// 4J-JEV: Simple interface for handling ReadStat failures. +class LeaderboardInterface +{ +private: + LeaderboardManager *m_manager; + bool m_pending; + + // Arguments. + LeaderboardManager::EFilterMode m_filter; + LeaderboardReadListener *m_callback; + int m_difficulty; + LeaderboardManager::EStatsType m_type; + PlayerUID m_myUID; + unsigned int m_startIndex; + unsigned int m_readCount; + +public: + LeaderboardInterface(LeaderboardManager *man); + ~LeaderboardInterface(); + + void ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount); + void ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int readCount); + void ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, unsigned int startIndex, unsigned int readCount); + + void CancelOperation(); + + void tick(); + +private: + bool callManager(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp new file mode 100644 index 00000000..78d62568 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp @@ -0,0 +1,1131 @@ +#include "stdafx.h" + +#include +#include +//#include + +#include "SonyLeaderboardManager.h" + +#include "base64.h" + +#include "Common\Consoles_App.h" +#include "Common\Network\Sony\SQRNetworkManager.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" + + +#ifdef __ORBIS__ +#include "Orbis\OrbisExtras\ShutdownManager.h" +#include "Orbis\Orbis_App.h" +#elif defined __PSVITA__ +#include "PSVita\PSVitaExtras\ShutdownManager.h" +#include "PSVita\PSVita_App.h" +#elif defined __PS3__ +#include "PS3\PS3Extras\ShutdownManager.h" +#include "PS3\PS3_App.h" +#else +#error "SonyLeaderboardManager is included for a non-sony platform." +#endif + +SonyLeaderboardManager::SonyLeaderboardManager() +{ + m_eStatsState = eStatsState_Idle; + + m_titleContext = -1; + + m_myXUID = INVALID_XUID; + + m_scores = NULL; + + m_statsType = eStatsType_Kills; + m_difficulty = 0; + + m_requestId = 0; + + m_openSessions = 0; + + InitializeCriticalSection(&m_csViewsLock); + + m_running = false; + m_threadScoreboard = NULL; +} + +SonyLeaderboardManager::~SonyLeaderboardManager() +{ + m_running = false; + + // 4J-JEV: Wait for thread to stop and hope it doesn't take too long. + long long startShutdown = System::currentTimeMillis(); + while (m_threadScoreboard->isRunning()) + { + Sleep(1); + assert( (System::currentTimeMillis() - startShutdown) < 16 ); + } + + delete m_threadScoreboard; + + DeleteCriticalSection(&m_csViewsLock); +} + +int SonyLeaderboardManager::scoreboardThreadEntry(LPVOID lpParam) +{ + ShutdownManager::HasStarted(ShutdownManager::eLeaderboardThread); + SonyLeaderboardManager *self = reinterpret_cast(lpParam); + + self->m_running = true; + app.DebugPrintf("[SonyLeaderboardManager] Thread started.\n"); + + bool needsWriting = false; + do + { + if (self->m_openSessions > 0 || needsWriting) + { + self->scoreboardThreadInternal(); + } + + EnterCriticalSection(&self->m_csViewsLock); + needsWriting = self->m_views.size() > 0; + LeaveCriticalSection(&self->m_csViewsLock); + + // 4J Stu - We can't write while we aren't signed in to live + if (!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + needsWriting = false; + } + + if ( (!needsWriting) && (self->m_eStatsState != eStatsState_Getting) ) + { + Sleep(50); // 4J-JEV: When we're not reading or writing. + } + + } while ( (self->m_running || self->m_eStatsState == eStatsState_Getting || needsWriting) + && ShutdownManager::ShouldRun(ShutdownManager::eLeaderboardThread) + ); + + // 4J-JEV, moved this here so setScore can finish up. + self->destroyTitleContext(self->m_titleContext); + + // TODO sceNpScoreTerm(); + app.DebugPrintf("[SonyLeaderboardManager] Thread closed.\n"); + ShutdownManager::HasFinished(ShutdownManager::eLeaderboardThread); + return 0; +} + +void SonyLeaderboardManager::scoreboardThreadInternal() +{ + // 4J-JEV: Just initialise the context the once now. + if (m_titleContext == -1) + { + int primaryPad = ProfileManager.GetPrimaryPad(); + + if (!ProfileManager.IsSignedInLive(primaryPad)) return; + + int ret = initialiseScoreUtility(); + if (ret < 0) + { + if ( !scoreUtilityAlreadyInitialised(ret) ) + { + app.DebugPrintf("[SonyLeaderboardManager] initialiseScoreUtility() failed. ret = 0x%x\n", ret); + return; + } + else + { + app.DebugPrintf("[SonyLeaderboardManager] initialiseScoreUtility() already initialised, (0x%x)\n", ret); + } + } + + SceNpId npId; + ProfileManager.GetSceNpId(primaryPad,&npId); + + ret = createTitleContext(npId); + + if (ret < 0) return; + else m_titleContext = ret; + } + else assert( m_titleContext > 0 ); //Paranoia + + + switch (m_eStatsState) + { + case eStatsState_Getting: + // Player starts using async multiplayer feature + // 4J-PB - Fix for SCEA FQA #4 - TRC R4064 - Incorrect usage of AsyncMultiplay + // Note 1: + // The following NP call should be reserved for asynchronous multiplayer modes that require PS Plus to be accessed. + // + // Note 2: + // The message is not displayed with a user without PlayStationPlus subscription and they are able to access the Leaderboards. + + // NotifyAsyncPlusFeature(); + + switch(m_eFilterMode) + { + case eFM_MyScore: + case eFM_Friends: + getScoreByIds(); + break; + case eFM_TopRank: + getScoreByRange(); + break; + } + break; + + case eStatsState_Canceled: + case eStatsState_Failed: + case eStatsState_Ready: + case eStatsState_Idle: + + // 4J-JEV: Moved this here, I don't want reading and + // writing going on at the same time. + // -- + // 4J-JEV: Writing no longer changes the manager state, + // we'll manage the write queue seperately. + + EnterCriticalSection(&m_csViewsLock); + bool hasWork = !m_views.empty(); + LeaveCriticalSection(&m_csViewsLock); + + if (hasWork) + { + setScore(); + } + + break; + } +} + +HRESULT SonyLeaderboardManager::fillByIdsQuery(const SceNpId &myNpId, SceNpId* &npIds, uint32_t &len) +{ + HRESULT ret; + + // Get queried users. + switch(m_eFilterMode) + { + case eFM_Friends: + { + // 4J-JEV: Implementation for Orbis & Vita as they a very similar. +#if (defined __ORBIS__) || (defined __PSVITA__) + + sce::Toolkit::NP::Utilities::Future s_friendList; + ret = getFriendsList(s_friendList); + + if(ret != SCE_TOOLKIT_NP_SUCCESS) + { + // Error handling + if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager] 'getFriendslist' fail, 0x%x.\n", ret); + return false; + } + else if (s_friendList.hasResult()) + { + // 4J-JEV: Friends list doesn't include player, leave space for them. + len = s_friendList.get()->size() + 1; + + npIds = new SceNpId[len]; + + int i = 0; + + sce::Toolkit::NP::FriendsList::const_iterator itr; + for (itr = s_friendList.get()->begin(); itr != s_friendList.get()->end(); itr++) + { + npIds[i] = itr->npid; + i++; + } + + npIds[len-1] = myNpId; // 4J-JEV: Append player to end of query. + } + else + { + // 4J-JEV: Something terrible must have happend, + // 'getFriendslist' was supposed to be a synchronous operation. + __debugbreak(); + + // 4J-JEV: We can at least fall-back to just the players score. + len = 1; + npIds = new SceNpId[1]; + + npIds[0] = myNpId; + } + +#elif (defined __PS3__) + // PS3 + + // 4J-JEV: Doesn't include the player (its just their friends). + ret = sceNpBasicGetFriendListEntryCount(&len); + len += 1; + + npIds = new SceNpId[len]; + + + for (uint32_t i = 0; i < len-1; i++) + { + ret = sceNpBasicGetFriendListEntry(i, npIds+i); + if (ret<0) return ret; + + } + npIds[len-1] = myNpId; // 4J-JEV: Append player to end of query. + +#endif + } + break; + case eFM_MyScore: + { + len = 1; + npIds = new SceNpId[1]; + npIds[0] = myNpId; + } + break; + } + + return S_OK; +} + +bool SonyLeaderboardManager::getScoreByIds() +{ + if (m_eStatsState == eStatsState_Canceled) return false; + + // ---------------------------- + SonyRtcTick last_sort_date; + SceNpScoreRankNumber mTotalRecord; + + SceNpId *npIds = NULL; + + int ret; + uint32_t num = 0; + + SceNpScorePlayerRankData *ptr; + SceNpScoreComment *comments; + // ---------------------------- + + // Check for invalid LManager state. + assert( m_eFilterMode == eFM_Friends + || m_eFilterMode == eFM_MyScore); + + SceNpId myNpId; + // 4J-PB - should it be user 0? + if(!ProfileManager.IsSignedInLive(0)) + { + app.DebugPrintf("[SonyLeaderboardManager] OpenSession() fail: User isn't signed in to PSN\n"); + return false; + } + ProfileManager.GetSceNpId(0,&myNpId); + + ret = fillByIdsQuery(myNpId, npIds, num); +#ifdef __PS3__ + if (ret < 0) goto error2; +#endif + + ptr = new SceNpScorePlayerRankData[num]; + comments = new SceNpScoreComment[num]; + + ZeroMemory(ptr, sizeof(SceNpScorePlayerRankData) * num); + ZeroMemory(comments, sizeof(SceNpScoreComment) * num); + + /* app.DebugPrintf("sceNpScoreGetRankingByNpId(\n\t transaction=%i,\n\t boardID=0,\n\t npId=%i,\n\t friendCount*sizeof(SceNpId)=%i*%i=%i,\ + rankData=%i,\n\t friendCount*sizeof(SceNpScorePlayerRankData)=%i,\n\t NULL, 0, NULL, 0,\n\t friendCount=%i,\n...\n", + transaction, npId, friendCount, sizeof(SceNpId), friendCount*sizeof(SceNpId), + rankData, friendCount*sizeof(SceNpScorePlayerRankData), friendCount + ); */ + + int boardId = getBoardId(m_difficulty, m_statsType); + + // 4J-JEV: Orbis can only do with 100 ids max, so we use batches. +#ifdef __ORBIS__ + for (int batch=0; batchrankData.scoreValue + ); + + // Sort scores + std::sort(m_scores, m_scores + m_readCount, SortByRank); + + delete [] ptr; + delete [] comments; + delete [] npIds; + + m_eStatsState = eStatsState_Ready; + return true; + + // Error. +error3: + if (ret!=SCE_NP_COMMUNITY_ERROR_ABORTED) //0x8002a109 + destroyTransactionContext(m_requestId); + m_requestId = 0; + delete [] ptr; + delete [] comments; +error2: + if (npIds != NULL) delete [] npIds; +error1: + if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager] getScoreByIds() FAILED, ret=0x%X\n", ret); + return false; +} + +bool SonyLeaderboardManager::getScoreByRange() +{ + SonyRtcTick last_sort_date; + SceNpScoreRankNumber mTotalRecord; + + unsigned int num = m_readCount; + SceNpScoreRankData *ptr; + SceNpScoreComment *comments; + + assert(m_eFilterMode == eFM_TopRank); + + int ret = createTransactionContext(m_titleContext); + if (m_eStatsState == eStatsState_Canceled) + { + // Cancel operation has been called, abort. + app.DebugPrintf("[SonyLeaderboardManager]\tgetScoreByRange() - m_eStatsState == eStatsState_Canceled.\n"); + destroyTransactionContext(ret); + return false; + } + else if (ret < 0) + { + // Error occurred creating a transaction, abort. + m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager]\tgetScoreByRange() - createTransaction failed, ret=0x%X\n", ret); + return false; + } + else + { + // Transaction created successfully, continue. + m_requestId = ret; + } + + ptr = new SceNpScoreRankData[num]; + comments = new SceNpScoreComment[num]; + + int boardId = getBoardId(m_difficulty, m_statsType); + ret = sceNpScoreGetRankingByRange( + m_requestId, + boardId, // BoardId + + m_startIndex, + + ptr, sizeof(SceNpScoreRankData) * num, //OUT: Rank Data + + comments, sizeof(SceNpScoreComment) * num, //OUT: Comment Data + + NULL, 0, // GameData. + + num, + + &last_sort_date, + &m_maxRank, // 'Total number of players registered in the target scoreboard.' + + NULL // Reserved, specify null. + ); + + if (ret == SCE_NP_COMMUNITY_ERROR_ABORTED) + { + ret = destroyTransactionContext(m_requestId); + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(): 'sceNpScoreGetRankingByRange' aborted (0x%X).\n", ret); + + delete [] ptr; + delete [] comments; + + return false; + } + else if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND) + { + ret = destroyTransactionContext(m_requestId); + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(): Game ranking not found."); + + delete [] ptr; + delete [] comments; + + m_scores = NULL; + m_readCount = 0; + + m_eStatsState = eStatsState_Ready; + return false; + } + else if (ret<0) goto error2; + else + { + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(), success, 1stScore=%i.\n", ptr->scoreValue); + } + + // Return. + destroyTransactionContext(m_requestId); + m_requestId = 0; + + //m_stats = ptr; //Maybe: addPadding(num,ptr); + + if (m_scores != NULL) delete [] m_scores; + m_readCount = ret; + m_scores = new ReadScore[m_readCount]; + for (int i=0; i 0) + ret = eStatsReturn_Success; + + if (m_readListener != NULL) + { + app.DebugPrintf("[SonyLeaderboardManager] OnStatsReadComplete(%i, %i, _), m_readCount=%i.\n", ret, m_maxRank, m_readCount); + m_readListener->OnStatsReadComplete(ret, m_maxRank, view); + } + + m_eStatsState = eStatsState_Idle; + + delete [] m_scores; + m_scores = NULL; + } + break; + + case eStatsState_Failed: + { + view.m_numQueries = 0; + view.m_queries = NULL; + + if ( m_readListener != NULL ) + m_readListener->OnStatsReadComplete(eStatsReturn_NetworkError, 0, view); + + m_eStatsState = eStatsState_Idle; + } + break; + + case eStatsState_Canceled: + { + m_eStatsState = eStatsState_Idle; + } + break; + + default: // Getting or Idle. + break; + } +} + +bool SonyLeaderboardManager::OpenSession() +{ + if (m_openSessions == 0) + { + if (m_threadScoreboard == NULL) + { + m_threadScoreboard = new C4JThread(&scoreboardThreadEntry, this, "4JScoreboard"); + m_threadScoreboard->SetProcessor(CPU_CORE_LEADERBOARDS); + m_threadScoreboard->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); + m_threadScoreboard->Run(); + } + + app.DebugPrintf("[SonyLeaderboardManager] OpenSession(): Starting sceNpScore utility.\n"); + } + else + { + app.DebugPrintf("[SonyLeaderboardManager] OpenSession(): Another session opened, total=%i\n", m_openSessions+1); + } + + m_openSessions++; + return true; +} + +void SonyLeaderboardManager::CloseSession() +{ + m_openSessions--; + + if (m_openSessions == 0) app.DebugPrintf("[SonyLeaderboardManager] CloseSession(): Quitting sceNpScore utility.\n"); + else app.DebugPrintf("[SonyLeaderboardManager] CloseSession(): %i sessions still open.\n", m_openSessions); +} + +void SonyLeaderboardManager::DeleteSession() {} + +bool SonyLeaderboardManager::WriteStats(unsigned int viewCount, ViewIn views) +{ + // Need to cancel read/write operation first. + //if (m_eStatsState != eStatsState_Idle) return false; + + // Write relevant parameters. + //RegisterScore *regScore = reinterpret_cast(views); + + EnterCriticalSection(&m_csViewsLock); + for (int i=0; i> (8-dIndex); + + fivebits = (fivebits>>3) & 0x1F; + + if (fivebits < 10) // 0 - 9 + chars[i] = '0' + fivebits; + else if (fivebits < 32) // A - V + chars[i] = 'A' + (fivebits-10); + else + assert(false); + } + + toSymbols( getComment(out) ); +} + +void SonyLeaderboardManager::fromBase32(void *out, SceNpScoreComment *in) +{ + PBYTE bytes = (PBYTE) out; + ZeroMemory(bytes, RECORD_SIZE); + + fromSymbols( getComment(in) ); + + char ch[2] = { 0, 0 }; + for (int i = 0; i < SCE_NP_SCORE_COMMENT_MAXLEN; i++) + { + ch[0] = getComment(in)[i]; + unsigned char fivebits = strtol(ch, NULL, 32) << 3; + + int sByte = (i*5) / 8; + int eByte = (5+(i*5)) / 8; + int dIndex = (i*5) % 8; + + *(bytes + sByte) = *(bytes+sByte) | (fivebits >> dIndex); + + if (eByte != sByte) + *(bytes + eByte) = fivebits << (8-dIndex); + } +} + +char symbBase32[32] = { + ' ', '!','\"', '#', '$', '%', '&','\'', '(', ')', + '*', '+', '`', '-', '.', '/', ':', ';', '<', '=', + '>', '?', '[','\\', ']', '^', '_', '{', '|', '}', + '~', '@' +}; + +char charBase32[32] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V' +}; + +void SonyLeaderboardManager::toSymbols(char *str) +{ + for (int i = 0; i < 63; i++) + { + for (int j=0; j < 32; j++) + { + if (str[i]==charBase32[j]) + str[i] =symbBase32[j]; + } + } +} + +void SonyLeaderboardManager::fromSymbols(char *str) +{ + for (int i = 0; i < 63; i++) + { + for (int j=0; j < 32; j++) + { + if (str[i]==symbBase32[j]) + str[i] =charBase32[j]; + } + } +} + +bool SonyLeaderboardManager::test_string(string testing) +{ +#ifndef _CONTENT_PACKAGE + static SceNpScoreComment comment; + ZeroMemory(&comment, sizeof(SceNpScoreComment)); + memcpy(&comment, testing.c_str(), SCE_NP_SCORE_COMMENT_MAXLEN); + + int ctx = createTransactionContext(m_titleContext); + if (ctx<0) return false; + + int ret = sceNpScoreCensorComment(ctx, (const char *) &comment, NULL); + + if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_CENSORED) + { + app.DebugPrintf("\n[TEST_STRING]: REJECTED "); + } + else if (ret < 0) + { + destroyTransactionContext(ctx); + return false; + } + else + { + app.DebugPrintf("\n[TEST_STRING]: permitted "); + } + + app.DebugPrintf("'%s'\n", getComment(&comment)); + destroyTransactionContext(ctx); + return true; +#else + return true; +#endif +} + +void SonyLeaderboardManager::initReadScoreStruct(ReadScore &out, SceNpScoreRankData &rankData) +{ + ZeroMemory(&out, sizeof(ReadScore)); + + // Init rank and onlineID + out.m_uid.setOnlineID( rankData.npId.handle, true ); + out.m_rank = rankData.rank; + + // Convert to wstring and copy name. + wstring wstrName = convStringToWstring( string(rankData.npId.handle.data) ).c_str(); + //memcpy(&out.m_name, wstrName.c_str(), XUSER_NAME_SIZE); + out.m_name=wstrName; +} + +void SonyLeaderboardManager::fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment) +{ + StatsData statsData; + fromBase32( (void *) &statsData, &comment ); + + switch (statsData.m_statsType) + { + case eStatsType_Farming: + out.m_statsSize = 6; + out.m_statsData[0] = statsData.m_farming.m_eggs; + out.m_statsData[1] = statsData.m_farming.m_wheat; + out.m_statsData[2] = statsData.m_farming.m_mushroom; + out.m_statsData[3] = statsData.m_farming.m_sugarcane; + out.m_statsData[4] = statsData.m_farming.m_milk; + out.m_statsData[5] = statsData.m_farming.m_pumpkin; + break; + case eStatsType_Mining: + out.m_statsSize = 7; + out.m_statsData[0] = statsData.m_mining.m_dirt; + out.m_statsData[1] = statsData.m_mining.m_cobblestone; + out.m_statsData[2] = statsData.m_mining.m_sand; + out.m_statsData[3] = statsData.m_mining.m_stone; + out.m_statsData[4] = statsData.m_mining.m_gravel; + out.m_statsData[5] = statsData.m_mining.m_clay; + out.m_statsData[6] = statsData.m_mining.m_obsidian; + break; + case eStatsType_Kills: + out.m_statsSize = 7; + out.m_statsData[0] = statsData.m_kills.m_zombie; + out.m_statsData[1] = statsData.m_kills.m_skeleton; + out.m_statsData[2] = statsData.m_kills.m_creeper; + out.m_statsData[3] = statsData.m_kills.m_spider; + out.m_statsData[4] = statsData.m_kills.m_spiderJockey; + out.m_statsData[5] = statsData.m_kills.m_zombiePigman; + out.m_statsData[6] = statsData.m_kills.m_slime; + break; + case eStatsType_Travelling: + out.m_statsSize = 4; + out.m_statsData[0] = statsData.m_travelling.m_walked; + out.m_statsData[1] = statsData.m_travelling.m_fallen; + out.m_statsData[2] = statsData.m_travelling.m_minecart; + out.m_statsData[3] = statsData.m_travelling.m_boat; + break; + } +} + +bool SonyLeaderboardManager::SortByRank(const ReadScore &lhs, const ReadScore &rhs) +{ + return lhs.m_rank < rhs.m_rank; +} diff --git a/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h new file mode 100644 index 00000000..3b2c26c5 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h @@ -0,0 +1,133 @@ +#pragma once + +#include "Common\Leaderboards\LeaderboardManager.h" + +#ifdef __PS3__ +typedef CellRtcTick SonyRtcTick; +#else +typedef SceRtcTick SonyRtcTick; +#endif + +class SonyLeaderboardManager : public LeaderboardManager +{ +protected: + enum EStatsState + { + eStatsState_Idle, + eStatsState_Getting, + eStatsState_Failed, + eStatsState_Ready, + eStatsState_Canceled, + eStatsState_Max + }; + +public: + SonyLeaderboardManager(); + virtual ~SonyLeaderboardManager(); + +protected: + unsigned short m_openSessions; + + C4JThread *m_threadScoreboard; + bool m_running; + + int m_titleContext; + int32_t m_requestId; + + //SceNpId m_myNpId; + + static int scoreboardThreadEntry(LPVOID lpParam); + void scoreboardThreadInternal(); + + virtual bool getScoreByIds(); + virtual bool getScoreByRange(); + + virtual bool setScore(); + + queue m_views; + + CRITICAL_SECTION m_csViewsLock; + + EStatsState m_eStatsState; //State of the stats read + // EFilterMode m_eFilterMode; + + ReadScore *m_scores; + unsigned int m_maxRank; + //SceNpScoreRankData *m_stats; + +public: + virtual void Tick(); + + //Open a session + virtual bool OpenSession(); + + //Close a session + virtual void CloseSession(); + + //Delete a session + virtual void DeleteSession(); + + //Write the given stats + //This is called synchronously and will not free any memory allocated for views when it is done + + virtual bool WriteStats(unsigned int viewCount, ViewIn views); + + virtual bool ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount); + virtual bool ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount); + virtual bool ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount); + + //Perform a flush of the stats + virtual void FlushStats(); + + //Cancel the current operation + virtual void CancelOperation(); + + //Is the leaderboard manager idle. + virtual bool isIdle(); + +protected: + int getBoardId(int difficulty, EStatsType); + + SceNpScorePlayerRankData *addPadding(unsigned int num, SceNpScoreRankData *rankData); + + void convertToOutput(unsigned int &num, ReadScore *out, SceNpScorePlayerRankData *rankData, SceNpScoreComment *comm); + + void toBinary(void *out, SceNpScoreComment *in); + void fromBinary(SceNpScoreComment **out, void *in); + + void toBase32(SceNpScoreComment *out, void *in); + void fromBase32(void *out, SceNpScoreComment *in); + + void toSymbols(char *); + void fromSymbols(char *); + + bool test_string(string); + + void initReadScoreStruct(ReadScore &out, SceNpScoreRankData &); + void fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment); + + static bool SortByRank(const ReadScore &lhs, const ReadScore &rhs); + + +protected: + // 4J-JEV: Interface differences: + + // Sce NP score library function redirects. + virtual HRESULT initialiseScoreUtility() { return ERROR_SUCCESS; } + virtual bool scoreUtilityAlreadyInitialised(HRESULT hr) { return false; } + + virtual HRESULT createTitleContext(const SceNpId &npId) = 0; + virtual HRESULT destroyTitleContext(int titleContext) = 0; + + virtual HRESULT createTransactionContext(int titleContext) = 0; + virtual HRESULT abortTransactionContext(int transactionContext) = 0; + virtual HRESULT destroyTransactionContext(int transactionContext) = 0; + + virtual HRESULT fillByIdsQuery(const SceNpId &myNpId, SceNpId* &npIds, uint32_t &len); + +#if (defined __ORBIS__) || (defined __PSVITA__) + virtual HRESULT getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList) = 0; +#endif + + virtual char * getComment(SceNpScoreComment *comment) = 0; +}; diff --git a/Minecraft.Client/Common/Leaderboards/base64.cpp b/Minecraft.Client/Common/Leaderboards/base64.cpp new file mode 100644 index 00000000..19106cc4 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/base64.cpp @@ -0,0 +1,131 @@ +/* + base64.cpp and base64.h + + Copyright (C) 2004-2008 Ren Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author 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 source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + 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 source code. + + 3. This notice may not be removed or altered from any source distribution. + + Ren Nyffenegger rene.nyffenegger@adp-gmbh.ch + +*/ + +#include "stdafx.h" + +#include "base64.h" +#include + +static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + +static inline bool is_base64(unsigned char c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} + +// 4J ADDED, +std::string base64_encode(std::string str) +{ + return base64_encode( reinterpret_cast(str.c_str()), str.length() ); +} + +std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) { + char_array_3[i++] = *(bytes_to_encode++); + if (i == 3) { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(int ii = 0; (ii <4) ; ii++) + ret += base64_chars[char_array_4[ii]]; + i = 0; + } + } + + if (i) + { + for(j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += base64_chars[char_array_4[j]]; + + while((i++ < 3)) + ret += '='; + + } + + return ret; + +} + +std::string base64_decode(std::string const& encoded_string) { + int in_len = encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { + char_array_4[i++] = encoded_string[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = base64_chars.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/base64.h b/Minecraft.Client/Common/Leaderboards/base64.h new file mode 100644 index 00000000..7f6a1e49 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/base64.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +std::string base64_encode(std::string str); +std::string base64_encode(unsigned char const* , unsigned int len); +std::string base64_decode(std::string const& s); \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/BeaconMenu1080.swf b/Minecraft.Client/Common/Media/BeaconMenu1080.swf new file mode 100644 index 00000000..f84c9101 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenu480.swf b/Minecraft.Client/Common/Media/BeaconMenu480.swf new file mode 100644 index 00000000..b04e2919 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenu720.swf b/Minecraft.Client/Common/Media/BeaconMenu720.swf new file mode 100644 index 00000000..c470b04e Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf b/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf new file mode 100644 index 00000000..02647e98 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf b/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf new file mode 100644 index 00000000..1a68b14f Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuVita.swf b/Minecraft.Client/Common/Media/BeaconMenuVita.swf new file mode 100644 index 00000000..ab91a154 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Controls1080.swf b/Minecraft.Client/Common/Media/Controls1080.swf index 36051b8c..9ec38f92 100644 Binary files a/Minecraft.Client/Common/Media/Controls1080.swf and b/Minecraft.Client/Common/Media/Controls1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf index 65cb014a..e462de70 100644 Binary files a/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf and b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf index 041e7663..27a0b580 100644 Binary files a/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf and b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf index cc42f3d1..155db47e 100644 Binary files a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf and b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf index 245bbf65..282c51f8 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf 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 index 9426b616..2773341d 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu480.swf 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 index b7474a63..985ef7a1 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu720.swf 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 index 814efa9c..f7fe1071 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf and b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuVita.swf b/Minecraft.Client/Common/Media/CreativeMenuVita.swf index ecbbb3db..01797a06 100644 Binary files a/Minecraft.Client/Common/Media/CreativeMenuVita.swf and b/Minecraft.Client/Common/Media/CreativeMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu1080.swf b/Minecraft.Client/Common/Media/FireworksMenu1080.swf new file mode 100644 index 00000000..20250d06 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu480.swf b/Minecraft.Client/Common/Media/FireworksMenu480.swf new file mode 100644 index 00000000..81a8290b Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu720.swf b/Minecraft.Client/Common/Media/FireworksMenu720.swf new file mode 100644 index 00000000..917736e1 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf b/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf new file mode 100644 index 00000000..f8537492 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf b/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf new file mode 100644 index 00000000..c3e56007 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuVita.swf b/Minecraft.Client/Common/Media/FireworksMenuVita.swf new file mode 100644 index 00000000..e54cdd78 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_1.png b/Minecraft.Client/Common/Media/Graphics/Beacon_1.png new file mode 100644 index 00000000..7e272400 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_1.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_2.png b/Minecraft.Client/Common/Media/Graphics/Beacon_2.png new file mode 100644 index 00000000..1668e204 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_3.png b/Minecraft.Client/Common/Media/Graphics/Beacon_3.png new file mode 100644 index 00000000..818adb91 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_4.png b/Minecraft.Client/Common/Media/Graphics/Beacon_4.png new file mode 100644 index 00000000..70d5a9e6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png new file mode 100644 index 00000000..b8194456 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png new file mode 100644 index 00000000..55f7727e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png new file mode 100644 index 00000000..85e785c8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png new file mode 100644 index 00000000..29b0cd58 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png new file mode 100644 index 00000000..9c94f518 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png new file mode 100644 index 00000000..47e0ad46 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png new file mode 100644 index 00000000..e51ce707 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png new file mode 100644 index 00000000..004bc5c5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png new file mode 100644 index 00000000..3a20d5f2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png new file mode 100644 index 00000000..e9529e1a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png new file mode 100644 index 00000000..0746bdd9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png new file mode 100644 index 00000000..c14d3625 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png new file mode 100644 index 00000000..c4e90222 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png new file mode 100644 index 00000000..f64c5c55 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png new file mode 100644 index 00000000..e07dce1b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png new file mode 100644 index 00000000..d5d5ad61 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png new file mode 100644 index 00000000..368e9848 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png new file mode 100644 index 00000000..b7eaca73 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png b/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png new file mode 100644 index 00000000..5445c58b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png b/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png new file mode 100644 index 00000000..7df8dbfc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png new file mode 100644 index 00000000..3a22ce06 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png new file mode 100644 index 00000000..0d5f33b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png new file mode 100644 index 00000000..4d0e5bac Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png new file mode 100644 index 00000000..fb1e3a80 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png new file mode 100644 index 00000000..23a09824 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png new file mode 100644 index 00000000..6454bcab Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png new file mode 100644 index 00000000..872584b8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png new file mode 100644 index 00000000..93ba58c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png new file mode 100644 index 00000000..519b87a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png new file mode 100644 index 00000000..90f65b5b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png new file mode 100644 index 00000000..8c408680 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png new file mode 100644 index 00000000..336895b0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png new file mode 100644 index 00000000..04c41d25 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png new file mode 100644 index 00000000..d5752af8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png new file mode 100644 index 00000000..dc57f82f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png new file mode 100644 index 00000000..8fa22b21 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png index b8475962..4052436a 100644 Binary files a/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png and b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png new file mode 100644 index 00000000..e6d47265 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.col b/Minecraft.Client/Common/Media/HTMLColours.col index 50999d5a..21db75ae 100644 Binary files a/Minecraft.Client/Common/Media/HTMLColours.col 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 index ea6ef00c..8f17132c 100644 --- a/Minecraft.Client/Common/Media/HTMLColours.xml +++ b/Minecraft.Client/Common/Media/HTMLColours.xml @@ -7,14 +7,14 @@ - + - + diff --git a/Minecraft.Client/Common/Media/HUD1080.swf b/Minecraft.Client/Common/Media/HUD1080.swf index c9a05166..261be0e6 100644 Binary files a/Minecraft.Client/Common/Media/HUD1080.swf 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 index d8a65a41..25cc211c 100644 Binary files a/Minecraft.Client/Common/Media/HUD480.swf 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 index 3527bb70..b044e31f 100644 Binary files a/Minecraft.Client/Common/Media/HUD720.swf 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 index cff338b9..c22cfc85 100644 Binary files a/Minecraft.Client/Common/Media/HUDSplit1080.swf 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 index 405cb99d..ba9937e1 100644 Binary files a/Minecraft.Client/Common/Media/HUDSplit720.swf 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 index 3197a722..03b05f42 100644 Binary files a/Minecraft.Client/Common/Media/HUDVita.swf and b/Minecraft.Client/Common/Media/HUDVita.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu1080.swf b/Minecraft.Client/Common/Media/HopperMenu1080.swf new file mode 100644 index 00000000..84394e94 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu480.swf b/Minecraft.Client/Common/Media/HopperMenu480.swf new file mode 100644 index 00000000..6a9efe29 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu720.swf b/Minecraft.Client/Common/Media/HopperMenu720.swf new file mode 100644 index 00000000..bbfc69b7 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf b/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf new file mode 100644 index 00000000..98dd6cde Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuSplit720.swf b/Minecraft.Client/Common/Media/HopperMenuSplit720.swf new file mode 100644 index 00000000..030e18aa Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuVita.swf b/Minecraft.Client/Common/Media/HopperMenuVita.swf new file mode 100644 index 00000000..fcb93ba7 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf index 2f383848..db0f4d36 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf 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 index 1c1d8177..599c3e38 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf 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 index b07966bc..eee79a2f 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf 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 index c90925e5..edfa8430 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf 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 index d4814571..5883cba4 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf new file mode 100644 index 00000000..606f515e Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay1080.swf b/Minecraft.Client/Common/Media/HowToPlay1080.swf index 8a74aae1..c1e91110 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay1080.swf 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 index 60449f75..e7cbe808 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay480.swf 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 index eb7652ac..3e12dbb0 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay720.swf 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 index 5dc90de1..6e128ffa 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf 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 index df33898a..5e25feaf 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu480.swf 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 index 0f01ef70..ef85f005 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu720.swf 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 index 2c1515ce..f44140b6 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf 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 index c861543a..fe33c20e 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf 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 index b2db55a1..aa1ca7a7 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf 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 index db806225..3ba64d5a 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf 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 index 1735af41..bc9542e3 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlaySplit720.swf 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 index 7ead38e2..51f2397d 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayVita.swf 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 index 9caefeab..207c86a7 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions1080.swf 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 index 6177ad68..f0d0e0c6 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions480.swf 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 index 448b39a3..f4e55bf4 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions720.swf 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 index 281f75d9..a45e8a37 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf 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 index 328a3115..7f76aaaf 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf 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 index c9f6c0d7..a7276f10 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf and b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf index 12a15405..601cc467 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf 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 index 707d8fdb..9e0b0ad9 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf 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 index 36c7ea04..bc9c4f6b 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf 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 index 65772a1b..c4187a09 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf 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 index 1c3b7820..ab0b3a7e 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf 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 index c8d8d370..13c0b653 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/Intro1080.swf b/Minecraft.Client/Common/Media/Intro1080.swf index 92569e1a..c9f2d3ba 100644 Binary files a/Minecraft.Client/Common/Media/Intro1080.swf 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 index 2b289ff8..425c01fe 100644 Binary files a/Minecraft.Client/Common/Media/Intro480.swf 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 index 42c086d4..0c2bb3eb 100644 Binary files a/Minecraft.Client/Common/Media/Intro720.swf 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 index 54a9b2d5..8229640d 100644 Binary files a/Minecraft.Client/Common/Media/IntroVita.swf 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 index f7e84e8a..47434cc3 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu1080.swf 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 index c5facdc4..5c129e1d 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu480.swf 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 index e6f3cee0..3de2da83 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu720.swf 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 index 4f6e78c5..efe2d484 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf 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 index 1e7d00ed..a9d13a05 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf 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 index e38bb07d..1eae726a 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuVita.swf and b/Minecraft.Client/Common/Media/InventoryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu1080.swf b/Minecraft.Client/Common/Media/LanguagesMenu1080.swf new file mode 100644 index 00000000..9c0bef5a Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu480.swf b/Minecraft.Client/Common/Media/LanguagesMenu480.swf new file mode 100644 index 00000000..5cea7c87 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu720.swf b/Minecraft.Client/Common/Media/LanguagesMenu720.swf new file mode 100644 index 00000000..09022fd6 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf b/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf new file mode 100644 index 00000000..24d7a0b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf b/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf new file mode 100644 index 00000000..99b9076f Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuVita.swf b/Minecraft.Client/Common/Media/LanguagesMenuVita.swf new file mode 100644 index 00000000..cffdba59 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf index 3db865f8..07d81207 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf 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 index ea1132c0..666f1127 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf 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 index 1cdf4d22..e77beb4e 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf 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 index 21fede27..5c1d44d9 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu1080.swf b/Minecraft.Client/Common/Media/LoadMenu1080.swf index e89f1875..d0d61ec7 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu1080.swf 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 index ce7ac1ad..e105c9e7 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu480.swf 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 index c3976f49..ef33463e 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu720.swf 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 index 8bbf94e7..a5be6f3f 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenuVita.swf and b/Minecraft.Client/Common/Media/LoadMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/MediaDurango.arc b/Minecraft.Client/Common/Media/MediaDurango.arc index 53e9b222..50240c42 100644 Binary files a/Minecraft.Client/Common/Media/MediaDurango.arc 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 index fcb53c05..aea52dc1 100644 Binary files a/Minecraft.Client/Common/Media/MediaOrbis.arc 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 index 7ab3a320..5eb550f8 100644 Binary files a/Minecraft.Client/Common/Media/MediaPS3.arc 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 index 01aa7466..8683db23 100644 Binary files a/Minecraft.Client/Common/Media/MediaPSVita.arc 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 index 130661a2..5ea229dc 100644 Binary files a/Minecraft.Client/Common/Media/MediaWindows64.arc and b/Minecraft.Client/Common/Media/MediaWindows64.arc differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay1080.swf b/Minecraft.Client/Common/Media/PressStartToPlay1080.swf index d15bedfc..87de331d 100644 Binary files a/Minecraft.Client/Common/Media/PressStartToPlay1080.swf and b/Minecraft.Client/Common/Media/PressStartToPlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay720.swf b/Minecraft.Client/Common/Media/PressStartToPlay720.swf index 30255042..2554a31d 100644 Binary files a/Minecraft.Client/Common/Media/PressStartToPlay720.swf and b/Minecraft.Client/Common/Media/PressStartToPlay720.swf differ diff --git a/Minecraft.Client/Common/Media/QuadrantSignin1080.swf b/Minecraft.Client/Common/Media/QuadrantSignin1080.swf index 760a0319..92e2f348 100644 Binary files a/Minecraft.Client/Common/Media/QuadrantSignin1080.swf 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 index fd3542ff..d22c12a2 100644 Binary files a/Minecraft.Client/Common/Media/QuadrantSignin720.swf and b/Minecraft.Client/Common/Media/QuadrantSignin720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf index 9dc478c4..ede96935 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf 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 index 717e8ac9..d3d5b93e 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf 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 index 05a1bc63..ce8434bf 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf 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 index 5bef6ed3..b435a238 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf 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 index e6bf0a4e..d178d4cb 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf 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 index a3ca1b24..562a0c22 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf and b/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf b/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf index 002d7639..5eaf67fb 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf and b/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu720.swf b/Minecraft.Client/Common/Media/SkinSelectMenu720.swf index ae8b3ed3..059ae199 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenu720.swf 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 index a6666acf..03c532fe 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf 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 index b090beaa..a49f20e8 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf 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 index 34950165..f46cda9b 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf and b/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips1080.swf b/Minecraft.Client/Common/Media/ToolTips1080.swf index 6bb2e367..2251f80e 100644 Binary files a/Minecraft.Client/Common/Media/ToolTips1080.swf 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 index 735361e7..3ebebb9b 100644 Binary files a/Minecraft.Client/Common/Media/ToolTips480.swf 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 index f29f1649..7c5a5ba4 100644 Binary files a/Minecraft.Client/Common/Media/ToolTips720.swf 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 index 91d6327c..820fdda1 100644 Binary files a/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf 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 index 260092c5..7c5ae7ea 100644 Binary files a/Minecraft.Client/Common/Media/ToolTipsSplit720.swf 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 index f8aa42fc..c2b9dfe8 100644 Binary files a/Minecraft.Client/Common/Media/ToolTipsVita.swf 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 index b4bd5ebd..75b6292e 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenu1080.swf 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 index e6fa8b5f..035b4747 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenu480.swf 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 index 1ce0cfb1..774e14b8 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenu720.swf 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 index ac6c27ae..2545ebb0 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf 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 index 73ece9f8..5677b19b 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenuSplit720.swf 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 index f36749fb..e93787ae 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenuVita.swf and b/Minecraft.Client/Common/Media/TradingMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup1080.swf b/Minecraft.Client/Common/Media/TutorialPopup1080.swf index 01619554..edd94f4f 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopup1080.swf 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 index fbea78ea..321dd391 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopup480.swf 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 index 0d3dcb20..94b6958e 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopup720.swf 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 index cdb09fc9..bb088d8c 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf 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 index 2234e02c..3626e9c7 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf 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 index e671b2c5..e4866163 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopupVita.swf and b/Minecraft.Client/Common/Media/TutorialPopupVita.swf differ diff --git a/Minecraft.Client/Common/Media/de-DE/strings.resx b/Minecraft.Client/Common/Media/de-DE/strings.resx index 219cb1b9..430711f8 100644 --- a/Minecraft.Client/Common/Media/de-DE/strings.resx +++ b/Minecraft.Client/Common/Media/de-DE/strings.resx @@ -150,7 +150,7 @@ Minecraft ist ein Spiel, bei dem du Blöcke platzierst, um alles zu bauen, was d 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. +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..{*B*}{*B*} 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. @@ -228,13 +228,13 @@ Du wirst selbst mit Kombinationen von Zutaten experimentieren müssen, um alle v {*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*} +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*} +Zauberbücher werden beim Amboss benutzt, um Verzauberungen auf Gegenstände anzuwenden. Das gibt dir mehr Kontrolle darüber, welche Verzauberungen du auf deinen Gegenständen möchtest.{*B*} {*T3*}SO WIRD GESPIELT: TIERHALTUNG{*ETW*}{*B*}{*B*} @@ -301,6 +301,27 @@ Beim Laden oder Erstellen einer Welt kannst du mit der Schaltfläche "Weitere Op {*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*} + {*T2*}Tageslichtzyklus{*ETW*}{*B*} + Bei Deaktivierung ändert sich die Tageszeit nicht.{*B*}{*B*} + + {*T2*}Inventar behalten{*ETW*}{*B*} + Bei Aktivierung behalten Spieler ihr Inventar, wenn sie sterben.{*B*}{*B*} + + {*T2*}NPC-Eintritt{*ETW*}{*B*} + Bei Deaktivierung erscheinen keine NPCs auf natürlichem Weg.{*B*}{*B*} + + {*T2*}NPC-Griefing{*ETW*}{*B*} + Bei Deaktivierung können Monster und Tiere keine Blöcke verändern (z. B. werden bei Creeper-Explosionen keine Blöcke zerstört und Schafe entfernen kein Gras) oder Gegenstände aufheben.{*B*}{*B*} + + {*T2*}NPC-Beute{*ETW*}{*B*} + Bei Deaktivierung lassen Monster und Tiere keine Beute fallen (z. B. lassen Creeper kein Schießpulver fallen).{*B*}{*B*} + + {*T2*}Felderertrag{*ETW*}{*B*} + Bei Deaktivierung lassen Blöcke keine Gegenstände zurück, wenn sie zerstört werden (z. B. hinterlassen Steinblöcke keine Pflastersteine).{*B*}{*B*} + + {*T2*}Natürliche Erholung{*ETW*}{*B*} + Bei Deaktivierung wird die Gesundheit von Spielern nicht auf natürlichem Weg wiederhergestellt.{*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*} @@ -317,7 +338,7 @@ Beim Erstellen einer neuen Welt gibt es einige zusätzliche Optionen.{*B*}{*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*} + Während des Spielens hast du Zugriff auf eine Reihe von Optionen, indem du mit {*BACK_BUTTON*} 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*} @@ -344,24 +365,26 @@ Um die Privilegien für einen Spieler zu bearbeiten, rufst du mit {*CONTROLLER_V 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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*} + + {*T2*}Kann teleportieren{*ETW*}{*B*} Dies erlaubt dem Spieler, sich selbst oder andere Spieler zu anderen Spielern in der Welt zu bewegen. +Mit dieser Option wird ein Spieler, der nicht auf der {*PLATFORM_NAME*} Konsole des Hosts spielt, vom Spiel ausgeschlossen; andere Spieler auf der {*PLATFORM_NAME*} Konsole des ausgeschlossenen Spielers werden ebenfalls ausgeschlossen. Dieser Spieler kann dem Spiel erst wieder beitreten, wenn es neu gestartet wird. + Nächste Seite Vorige Seite @@ -374,7 +397,7 @@ Wenn "Hostprivilegien" aktiviert ist, kann der Host-Spieler einige seiner eigene Truhen -Dinge herstellen +Crafting Ofen @@ -425,63 +448,95 @@ sie können dir also leicht zu Hilfe kommen. 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*} +{*T3*}Veränderungen und Neuerungen{*ETW*}{*B*}{*B*} +- Neue Gegenstände hinzugefügt: Ausgehärteter Lehm, gefärbter Lehm, Kohleblock, Heuballen, Aktivierungsschiene, Redstone-Block, Tageslichtsensor, Auswurfblock, Trichter, Lore mit Trichter, Lore mit TNT, Redstone-Vergleicher, beschwerte Druckplatte, Signalfeuer, eingeklemmte Truhe, Feuerwerksrakete, Feuerwerksstern, Netherstern, Leine, Pferderüstung, Namensschild, Pferde-Eintrittsei.{*B*} +- Neue NPCs hinzugefügt: Dürre, Dörrskelette, Hexen, Fledermäuse, Pferde, Esel und Maultiere.{*B*} +- Neue Geländeerstellungsfunktionen hinzugefügt: Hexenhütten.{*B*} +- Signalfeuer-Oberfläche hinzugefügt.{*B*} +- Pferde-Oberfläche hinzugefügt.{*B*} +Trichter-Oberfläche hinzugefügt.{*B*} +- Feuerwerk hinzugefügt: Die Feuerwerk-Oberfläche kann von der Werkbank aufgerufen werden, wenn du die Zutaten zum Craften eines Feuerwerkssterns oder einer Feuerwerksrakete hast.{*B*} +- Abenteuermodus hinzugefügt: Du kannst Blöcke nur mit den richtigen Werkzeugen abbauen.{*B*} +- Viele neue Sounds hinzugefügt.{*B*} +NPCs, Gegenstände und Projektile können jetzt durch Portale gehen.{*B*} +- Repeater können jetzt gesperrt werden, indem ihre Seiten von einem weiteren Repeater mit Strom versorgt werden.{*B*} +- Zombies und Skelette können jetzt andere Waffen und Rüstungen haben.{*B*} +- Neue Todesmeldungen.{*B*} +- Benenne NPCs mit einem Namensschild und benenne Behälter um, um den Titel des geöffneten Menüs zu ändern.{*B*} +- Knochenmehl lässt nicht mehr alles sofort zu voller Größe wachsen, sondern in zufälligen Stufen.{*B*} +- Ein Redstone-Signal, das den Inhalt von Truhen, Brauständen, Dispensern und Jukeboxen beschreibt, kann aufgefangen werden, indem ein Redstone-Vergleicher direkt daran platziert wird.{*B*} +- Dispenser können in jede Richtung zeigen.{*B*} +- Goldene Äpfel verleihen Spielern kurzfristig zusätzliche Absorptions-Gesundheit.{*B*} +- In einem Gebiet erscheinende Monster werden mit zunehmender Dauer des Aufenthalts immer schwieriger.{*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*} +{*T1*}Neue Gegenstände{*ETB*} – Ausgehärteter Lehm, gefärbter Lehm, Kohleblock, Heuballen, Aktivierungsschiene, Redstone-Block, Tageslichtsensor, Auswurfblock, Trichter, Lore mit Trichter, Lore mit TNT, Redstone-Vergleicher, beschwerte Druckplatte, Signalfeuer, eingeklemmte Truhe, Feuerwerksrakete, Feuerwerksstern, Netherstern, Leine, Pferderüstung, Namensschild, Pferde-Eintrittsei.{*B*}{*B*} +{*T1*}Neue NPCs{*ETB*} – Dürre, Dörrskelette, Hexen, Fledermäuse, Pferde, Esel und Maultiere.{*B*}{*B*} +{*T1*}Neue Features{*ETB*} – Zähme und reite ein Pferd, crafte Feuerkwerk für eine Show, benenne Tiere und Monster mit einem Namensschild, erschaffe fortgeschrittenere Redstone-Schaltkreise und neue Hostoptionen zur Kontrolle der Gastberechtigungen!{*B*}{*B*} +{*T1*}Neue Tutorial-Welt{*ETB*} – Lerne den Umgang mit neuen und alten Features. Versuche, alle geheimen Schallplatten in der Welt zu finden!{*B*}{*B*} +Pferde + +{*T3*}SO WIRD GESPIELT: PFERDE{*ETW*}{*B*}{*B*} +Pferde und Esel findet man hauptsächlich auf freiem Feld. Maultiere sind die Nachfahren von jeweils einem Esel und einem Pferd, sie sind aber selbst unfruchtbar.{*B*} +Alle ausgewachsenen Pferde, Esel und Maultiere können geritten werden. Allerdings können nur Pferden Rüstungen angelegt werden und nur Maultiere sowie Esel können mit Satteltaschen für den Transport von Gegenständen ausgestattet werden.{*B*}{*B*} +Pferde, Esel und Maultiere müssen vor dem Gebrauch gezähmt werden. Du zähmst ein Pferd, indem du versuchst, es zu reiten, und oben bleibst, wenn es versucht, dich abzuwerfen.{*B*} +Wenn um das Pferd herum Liebesherzen erscheinen, ist es zahm und versucht nicht mehr, dich abzuwerfen. Um ein Pferd beim Reiten zu lenken, musst du ihm einen Sattel anlegen.{*B*}{*B*} +Du kannst Sättel von Dorfbewohnern kaufen oder in versteckten Truhen in der Welt finden.{*B*} +Du kannst zahmen Eseln und Maultieren Satteltaschen geben, indem du eine Truhe anbringst. Du kannst dann während des Reitens oder beim Schleichen auf die Taschen zugreifen.{*B*}{*B*} +Pferde und Esel (nicht aber Maultiere) können wie andere Tiere mithilfe von goldenen Äpfeln oder goldenen Karotten gezüchtet werden.{*B*} +Fohlen wachsen mit der Zeit zu Pferden heran und du kannst dies beschleunigen, indem du sie mit Weizen oder Heu fütterst.{*B*} + + +Signalfeuer + +{*T3*}SO WIRD GESPIELT: SIGNALFEUER{*ETW*}{*B*}{*B*} +Aktive Signalfeuer werfen einen hellen Lichtstrahl in den Himmel und gewähren Spielern in der Nähe Kräfte.{*B*} +Sie werden aus Glas, Obsidian und Nethersternen gefertigt, die du erhältst, wenn du die Dürre besiegst.{*B*}{*B*} +Signalfeuer müssen auf Pyramiden aus Eisen, Gold, Smaragd oder Diamant so platziert werden, dass sie tagsüber dem Sonnenlicht ausgesetzt sind.{*B*} +Das Material der Unterlage hat keine Auswirkungen auf die Kraft des Signalfeuers.{*B*}{*B*} +Im Signalfeuermenü kannst du eine Hauptkraft für dein Signalfeuer auswählen. Je mehr Stufen deine Pyramide hat, desto mehr Kräfte stehen dir zur Auswahl.{*B*} +Bei einem Signalfeuer auf einer Pyramide mit mindestens vier Stufen hast du außerdem die Option, entweder die Regeneration als Zweitkraft oder eine stärkere Hauptkraft auszuwählen.{*B*}{*B*} +Um die Kräfte deines Signalfeuers einzustellen, musst du einen Smaragd, Diamant, Gold- oder Eisenbarren im Bezahl-Slot opfern.{*B*} +Danach strahlt das Signalfeuer für unbegrenzte Zeit die Kräfte aus.{*B*} + + +Feuerwerk + +{*T3*}SO WIRD GESPIELT: FEUERWERK{*ETW*}{*B*}{*B*} +Feuerwerk sind dekorative Gegenstände, die manuell oder von Dispensern gestartet werden können. Sie werden aus Papier, Schießpulver und wahlweise einigen Feuerwerkssternen gecraftet.{*B*} +Farben, Verblassen, Form, Größe und Effekte (wie Spuren und Funkeln) von Feuerwerkssternen können beim Craften durch zusätzliche Zutaten angepasst werden.{*B*}{*B*} +Feuerkwerk craftest du, indem du Schießpulver und Papier in das 3x3-Crafting-Raster legst, das über deinem Inventar angezeigt wird.{*B*} +Du kannst wahlweise mehrere Feuerwerkssterne in das Raster legen, um sie dem Feuerwerk hinzuzufügen.{*B*} +Mehr Schießpulver im Raster erhöht die Höhe, in der Feuerwerkssterne explodieren.{*B*}{*B*} +Du kannst das fertige Feuerwerk dann aus dem Ausgabeplatz nehmen.{*B*}{*B*} +Feuerwerkssterne werden hergestellt, indem du Schießpulver und Farbe in das Raster legst.{*B*} + – Die Explosion des Feuerwerkssterns nimmt die jeweilige Farbe an.{*B*} + – Die Form des Feuerwerkssterns ändert sich durch das Hinzufügen von Feuerkugeln, Goldklumpen, Federn oder NPC-Köpfen.{*B*} + – Spur oder Funkeln können mit Diamanten oder Glowstone-Staub hinzugefügt werden.{*B*}{*B*} +Wenn ein Feuerwerksstern gecraftet wurde, kannst du das Verblassen mit Farbe ändern. + + +Trichter + +{*T3*}SO WIRD GESPIELT: TRICHTER{*ETW*}{*B*}{*B*} +Mit Trichtern kannst du Gegenstände in Behälter füllen oder sie daraus entnehmen sowie automatisch Gegenstände aufheben, die hineingeworfen werden.{*B*} +Sie können mit Brauständen, Truhen, Dispensern, Auswurfblöcken, Loren mit Truhen, Loren mit Trichtern sowie anderen Trichtern verwendet werden.{*B*}{*B*} +Trichter versuchen fortwährend, Gegenstände aus einem geeigneten Behälter aufzusaugen, der über ihnen platziert wird. Sie versuchen auch, gelagerte Gegenstände in einen Ausgabebehälter zu legen.{*B*} +Wenn ein Trichter mit Redstone betrieben wird, wird er inaktiv und hört auf, Gegenstände aufzusaugen und einzufügen.{*B*}{*B*} +Ein Trichter zeigt in die Ausgaberichtung für Gegenstände. Damit ein Trichter auf einen bestimmten Block zeigt, platzierst du ihn dagegen, während du schleichst.{*B*} + + +Auswurfblöcke + +{*T3*}SO WIRD GESPIELT: AUSWURFBLÖCKE{*ETW*}{*B*}{*B*} +Von Redstone mit Energie versorgte Auswurfblöcke lassen einen einzelnen, zufälligen Gegenstand fallen. Öffne den Auswurfblock mit {*CONTROLLER_ACTION_USE*} und fülle ihn dann mit Gegenständen aus deinem Inventar.{*B*} +Wenn der Auswurfblock einer Truhe oder einem anderen Behälter zugewandt ist, wird der Gegenstand stattdessen darin abgelegt. Lange Ketten aus Auswurfblöcken können hergestellt werden, um Gegenstände über längere Entfernungen zu transportieren. Dafür müssen sie abwechselnd ein- und ausgeschaltet werden. + + 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. @@ -613,10 +668,36 @@ haben. Erzeugt ein Abbild einer Gegend, bei deren Erforschung du sie in der Hand hattest. Nützlich, um den Weg zu finden. +Wird bei Benutzung zu einem Kartenteil der aktuellen Welt und füllt sich, wenn du die Gegend erkundest. + Erlaubt Fernangriffe mit Pfeilen. Wird als Munition für Bögen verwendet. +Von der Dürre fallen gelassen, wird zur Herstellung von Signalfeuern verwendet. + +Erzeugt bei Aktivierung bunte Explosionen. Die Farbe, der Effekt, die Form und das Verblassen hängen davon ab, welcher Feuerwerksstern zur Herstellung verwendet wird. + +Legt die Farbe, den Effekt und die Form eines Feuerwerks fest. + +Wird in Redstone-Schaltkreisen verwendet, um die Signalstärke aufrechtzuerhalten, zu vergleichen oder zu mindern, oder um bestimmte Blockzustände zu messen. + +Ein Lorentyp, der als beweglicher TNT-Block funktioniert. + +Ein Block, der auf Grundlage des Sonnenlichts (oder des Mangels an Sonnenlicht) ein Redstone-Signal ausgibt. + +Ein besonderer Lorentyp, der ähnlich funktioniert wie ein Trichter. Er sammelt Gegenstände, die auf Schienen liegen, und aus Behältern darüber. + +Ein besonderer Rüstungstyp, der einem Pferd angelegt werden kann. Gewährt 5 Rüstungspunkte. + +Ein besonderer Rüstungstyp, der einem Pferd angelegt werden kann. Gewährt 7 Rüstungspunkte. + +Ein besonderer Rüstungstyp, der einem Pferd angelegt werden kann. Gewährt 11 Rüstungspunkte. + +Hiermit kannst du NPCs am Spieler oder an Zaunpfosten festbinden. + +Hiermit kannst du NPCs in der Welt Namen geben. + Regeneriert 2,5{*ICON_SHANK_01*}. Regeneriert 1,5{*ICON_SHANK_01*}. Kann 6-mal verwendet werden. @@ -668,7 +749,7 @@ Kann auch genutzt werden, um ein wenig Licht zu erzeugen. 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. +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. @@ -944,100 +1025,158 @@ statt nur 3.) NPC-Köpfe können als Dekoration platziert werden oder als Maske anstatt eines Helms getragen werden. +Hiermit werden Befehle ausgeführt. + +Wirft einen Lichtstrahl in den Himmel und kann Spielern in der Nähe Statuseffekte gewähren. + +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. Die eingeklemmte Truhe erstellt beim Öffnen außerdem eine Redstone-Ladung. + +Gewährt eine Redstone-Ladung. Die Ladung wird stärker, wenn mehr Gegenstände auf der Platte liegen. + +Gewährt eine Redstone-Ladung. Die Ladung wird stärker, wenn mehr Gegenstände auf der Platte liegen. Erfordert mehr Gewicht als die leichte Platte. + +Dient als Redstone-Energiequelle. Kann in Redstone zurückverwandelt werden. + +Kann Gegenstände fangen oder sie in Behälter legen bzw. aus ihnen entfernen. + +Ein Schienentyp, der Loren mit Trichtern aktivieren oder deaktivieren und Loren mit TNT auslösen kann. + +Kann Gegenstände lagern und ablegen oder in einen anderen Behälter schieben, wenn er einen Impuls von einem Redstone-Stromkreis erhält. + +Bunte Blöcke aus gefärbtem, ausgehärtetem Lehm. + +Kann an Pferde, Esel oder Maultiere verfüttert werden, um bis zu 10 Herzen zu heilen. Lässt Fohlen schneller wachsen. + +Wird hergestellt, indem man Lehm in einem Ofen schmilzt. + +Wird aus Glas und einer Farbe hergestellt. + +Wird aus Buntglas hergestellt. + +Eine kompakte Art, Kohle zu lagern. Kann als Brennstoff in Öfen verwendet 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. - + +Fledermaus + +Diese fliegenden Geschöpfe findet man in Höhlen oder anderen großen geschlossenen Räumen. + +Hexe + +Diese Feinde findet man in Sümpfen, und sie werfen mit Tränken nach dir, um dich anzugreifen. Wenn sie sterben, lassen sie Tränke fallen. + +Pferd + +Diese Tiere können gezähmt und dann geritten werden. + +Esel + +Diese Tiere können gezähmt und dann geritten werden. Du kannst Truhen an ihnen anbringen. + +Maultier + +Eine Kreuzung aus einem Pferd und einem Esel. Diese Tiere können gezähmt und dann geritten werden. Sie können Truhen tragen. + +Zombiepferd + +Skelettpferd + +Dürre + +Werden aus Dörrschädeln und Seelensand hergestellt. Feuern explodierende Schädel auf dich ab. + Explosives Animator Concept Artist @@ -1384,6 +1523,8 @@ statt nur 3.) Karte +Leere Karte + Schallplatte - "13" Schallplatte - "cat" @@ -1486,6 +1627,28 @@ statt nur 3.) Creeper-Kopf +Netherstern + +Feuerwerksrakete + +Feuerwerksstern + +Redstone-Vergleicher + +Lore mit TNT + +Lore mit Trichter + +Eisen-Pferderüstung + +Gold-Pferderüstung + +Diamant-Pferderüstung + +Leine + +Namensschild + Stein Grasblock @@ -1502,6 +1665,8 @@ statt nur 3.) Dschungelholzbretter +Holzbretter (jeder Typ) + Setzling Eichensetzling @@ -1838,6 +2003,190 @@ statt nur 3.) Schädel +Befehlsblock + +Signalfeuer + +Eingeklemmte Truhe + +Beschwerte Druckplatte (leicht) + +Beschwerte Druckplatte (schwer) + +Redstone-Vergleicher + +Tageslichtsensor + +Redstone-Block + +Trichter + +Aktivierungsschiene + +Auswurfblock + +Gefärbter Lehm + +Heuballen + +Ausgehärteter Lehm + +Kohleblock + +Schwarz gefärbter Lehm + +Rot gefärbter Lehm + +Grün gefärbter Lehm + +Braun gefärbter Lehm + +Blau gefärbter Lehm + +Lila gefärbter Lehm + +Cyanfarbener gefärbter Lehm + +Hellgrau gefärbter Lehm + +Grau gefärbter Lehm + +Rosa gefärbter Lehm + +Hellgrün gefärbter Lehm + +Gelb gefärbter Lehm + +Hellblau gefärbter Lehm + +Magentafarben gefärbter Lehm + +Orange gefärbter Lehm + +Weiß gefärbter Lehm + +Buntglas + +Schwarzes Buntglas + +Rotes Buntglas + +Grünes Buntglas + +Braunes Buntglas + +Blaues Buntglas + +Lila Buntglas + +Cyanfarbenes Buntglas + +Hellgraues Buntglas + +Graues Buntglas + +Rosa Buntglas + +Hellgrünes Buntglas + +Gelbes Buntglas + +Hellblaues Buntglas + +Magentafarbenes Buntglas + +Oranges Buntglas + +Weißes Buntglas + +Buntglasscheibe + +Schwarze Buntglasscheibe + +Rote Buntglasscheibe + +Grüne Buntglasscheibe + +Braune Buntglasscheibe + +Blaue Buntglasscheibe + +Lila Buntglasscheibe + +Cyanfarbene Buntglasscheibe + +Hellgraue Buntglasscheibe + +Graue Buntglasscheibe + +Rosa Buntglasscheibe + +Hellgrüne Buntglasscheibe + +Gelbe Buntglasscheibe + +Hellblaue Buntglasscheibe + +Magentafarbene Buntglasscheibe + +Orange Buntglasscheibe + +Weiße Buntglasscheibe + +Kleiner Ball + +Großer Ball + +Sternförmig + +Creeper-förmig + +Explosion + +Unbekannte Form + +Schwarz + +Rot + +Grün + +Braun + +Blau + +Lila + +Cyan + +Hellgrau + +Grau + +Rosa + +Hellgrün + +Gelb + +Hellblau + +Magenta + +Orange + +Weiß + +Andere + +Verblassen + +Funkeln + +Spur + +Flugdauer: +  Derzeitige Steuerung Layout @@ -2015,8 +2364,7 @@ Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor 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. @@ -2037,7 +2385,7 @@ Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor - Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_VK_RT*}. + Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2071,7 +2419,7 @@ Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor - Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_VK_RT*}. + Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2618,6 +2966,211 @@ Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Hungerleiste und die Nahrungsaufnahme weißt. + + Dies ist das Pferdeinventar. + + + + {*B*}Drücke zum Fortfahren {*CONTROLLER_VK_A*}. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Pferdeinventar verwendet wird. + + + + Im Pferdeinventar kannst du Gegenstände an dein Pferd, deinen Esel oder dein Maultier übertragen oder es mit ihnen ausrüsten. + + + + Sattle dein Pferd, indem du einen Sattel im Sattel-Slot platzierst. Pferde können Rüstungen tragen, wenn du Pferderüstung im Rüstungs-Slot platzierst. + + + + Du kannst hier auch Gegenstände zwischen deinem eigenen Inventar und den Satteltaschen von Eseln und Maultieren austauschen. + + +Du hast ein Pferd gefunden. + +Du hast einen Esel gefunden. + +Du hast ein Maultier gefunden. + + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Pferde, Esel und Maultiere zu erfahren. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Pferde, Esel und Maultiere weißt. + + + + Pferde und Esel findet man hauptsächlich auf freiem Feld. Maultiere sind die Nachfahren von jeweils einem Esel und einem Pferd, sie sind aber selbst unfruchtbar. + + + + Alle ausgewachsenen Pferde, Esel und Maultiere können geritten werden. Allerdings können nur Pferden Rüstungen angelegt werden und nur Maultiere sowie Esel können mit Satteltaschen für den Transport von Gegenständen ausgestattet werden. + + + + Pferde, Esel und Maultiere müssen vor dem Gebrauch gezähmt werden. Du zähmst ein Pferd, indem du versuchst, es zu reiten, und oben bleibst, wenn es versucht, dich abzuwerfen. + + + + Wenn das Tier gezähmt ist, erscheinen Liebesherzen und es versucht nicht mehr, dich abzuwerfen. + + + + Versuche jetzt, dieses Pferd zu reiten. Verwende {*CONTROLLER_ACTION_USE*} ohne Gegenstände oder Werkzeuge in der Hand, um aufzusteigen. + + + + Um ein Pferd beim Reiten zu lenken, musst du ihm einen Sattel anlegen. Du kannst Sättel von Dorfbewohnern kaufen oder in versteckten Truhen in der Welt finden. + + + + Du kannst zahmen Eseln und Maultieren Satteltaschen geben, indem du eine Truhe anbringst. Du kannst dann während des Reitens oder beim Schleichen auf die Taschen zugreifen. + + + + Pferde und Esel (nicht aber Maultiere) können wie andere Tiere mithilfe von goldenen Äpfeln oder goldenen Karotten gezüchtet werden. Fohlen wachsen mit der Zeit zu Pferden heran und du kannst dies beschleunigen, indem du sie mit Weizen oder Heu fütterst. + + + + Du kannst versuchen, die Pferde und Esel hier zu zähmen, und in den Truhen in der Nähe liegen Sättel, Pferderüstungen und andere nützliche Dinge. + + + + Dies ist das Signalfeuermenü. Hier kannst du auswählen, welche Kräfte dein Signalfeuer gewähren soll. + + + + {*B*}Drücke zum Fortfahren {*CONTROLLER_VK_A*}. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Signalfeuermenü verwendet wird. + + + + Im Signalfeuermenü kannst du 1 Hauptkraft für dein Signalfeuer auswählen. Je mehr Stufen deine Pyramide hat, desto mehr Kräfte stehen dir zur Auswahl. + + + + Bei einem Signalfeuer auf einer Pyramide mit mindestens 4 Stufen hast du außerdem die Option, entweder die Regeneration als Zweitkraft oder eine stärkere Hauptkraft auszuwählen. + + + + Um die Kräfte deines Signalfeuers einzustellen, musst du einen Smaragd, Diamant, Gold- oder Eisenbarren im Bezahl-Slot opfern. Danach strahlt das Signalfeuer für unbegrenzte Zeit die Kräfte aus. + + +Auf der Spitze dieser Pyramide steht ein inaktives Signalfeuer. + + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Signalfeuer zu erfahren. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Signalfeuer weißt. + + + + Aktive Signalfeuer werfen einen hellen Lichtstrahl in den Himmel und gewähren Spielern in der Nähe Kräfte. Sie werden aus Glas, Obsidian und Nethersternen gefertigt, die du erhältst, wenn du die Dürre besiegst. + + + + Signalfeuer müssen auf Pyramiden aus Eisen, Gold, Smaragd oder Diamant so platziert werden, dass sie tagsüber dem Sonnenlicht ausgesetzt sind. Das Material der Unterlage hat aber keine Auswirkungen auf die Kraft des Signalfeuers. + + + + Verwende das Signalfeuer, um die gewährte Kraft festzulegen. Du kannst mit den bereitgestellten Eisenbarren bezahlen. + + +Dieser Raum enthält Trichter. + + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Trichter zu erfahren. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Trichter weißt. + + + + Mit Trichtern kannst du Gegenstände in Behälter füllen oder sie daraus entnehmen sowie automatisch Gegenstände aufheben, die hineingeworfen werden. + + + + Sie können mit Brauständen, Truhen, Dispensern, Auswurfblöcken, Loren mit Truhen, Loren mit Trichtern sowie anderen Trichtern verwendet werden. + + + + Trichter versuchen fortwährend, Gegenstände aus einem geeigneten Behälter aufzusaugen, der über ihnen platziert wird. Sie versuchen auch, gelagerte Gegenstände in einen Ausgabebehälter zu legen. + + + + Wenn ein Trichter allerdings mit Redstone betrieben wird, wird er inaktiv und hört auf, Gegenstände aufzusaugen und einzufügen. + + + + Ein Trichter zeigt in die Ausgaberichtung für Gegenstände. Damit ein Trichter auf einen bestimmten Block zeigt, platzierst du ihn dagegen, während du schleichst. + + + + Es gibt viele nützliche Anwendungsmöglichkeiten für Trichter. In diesem Raum kannst du sie dir ansehen und ausprobieren. + + + + Dies ist das Feuerwerkmenü. Hier kannst du Feuerwerk und Feuerwerkssterne craften. + + + + {*B*}Drücke zum Fortfahren {*CONTROLLER_VK_A*}. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Signalfeuermenü verwendet wird. + + + + Leg Schießpulver und Papier in das 3x3-Crafting-Raster, das über deinem Inventar angezeigt wird, um Feuerwerk zu craften. + + + + Du kannst wahlweise mehrere Feuerwerkssterne in das Raster legen, um sie dem Feuerwerk hinzuzufügen. + + + + Mehr Schießpulver im Raster erhöht die Höhe, in der Feuerwerkssterne explodieren. + + + + Du kannst das fertige Feuerwerk dann aus dem Ausgabeplatz nehmen. + + + + Feuerwerkssterne werden hergestellt, indem du Schießpulver und Farbe in das Raster legst. + + + + Die Explosion des Feuerwerkssterns nimmt die jeweilige Farbe an. + + + + Die Form des Feuerwerkssterns ändert sich durch das Hinzufügen von Feuerkugeln, Goldklumpen, Federn oder NPC-Köpfen. + + + + Spur oder Funkeln können mit Diamanten oder Glowstone-Staub hinzugefügt werden. + + + + Wenn ein Feuerwerksstern gecraftet wurde, kannst du das Verblassen mit Farbe ändern. + + + + In diesen Truhen befinden sich verschiedene Gegenstände, die bei der Herstellung von FEUERWERK verwendet werden! + + + + {*B*}Drück{*CONTROLLER_VK_A*}, um mehr über Feuerwerk zu erfahren. + {*B*}Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Feuerwerk weißt. + + + + Feuerwerk sind dekorative Gegenstände, die manuell oder von Dispensern gestartet werden können. Sie werden aus Papier, Schießpulver und wahlweise einigen Feuerwerkssternen gecraftet. + + + + Farben, Verblassen, Form, Größe und Effekte (wie Spuren und Funkeln) von Feuerwerkssternen können beim Craften durch zusätzliche Zutaten angepasst werden. + + + + Probiere, Feuerwerk mit verschiedenen Zutaten aus den Truhen an der Werkbank herzustellen. + +  Auswählen Verwenden @@ -2678,7 +3231,7 @@ Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach Schnellauswahl leeren -? +Was ist das? Auf Facebook teilen @@ -2840,6 +3393,22 @@ Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach Spielstand für Xbox One hochladen +Aufsteigen + +Absteigen + +Truhe befestigen + +Starten + +Festbinden + +Losbinden + +Befestigen + +Name + OK Abbrechen @@ -3150,6 +3719,20 @@ Möchtest du das vollständige Spiel freischalten? Dispenser +Pferd + +Auswurfblock + +Trichter + +Signalfeuer + +Hauptkraft + +Zweitkraft + +Lore + Es stehen derzeit keine entsprechenden Inhalte zum Herunterladen für diesen Titel zur Verfügung. %s ist dem Spiel beigetreten. @@ -3309,10 +3892,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Spielmodus: Kreativ +Spielmodus: Abenteuer + Überleben Kreativ +Abenteuer + Im Überlebensmodus Im Kreativmodus @@ -3333,6 +3920,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Superflach +Gib einen Seed ein, um das gleiche Gelände erneut zu erstellen. Lass das Feld leer, um eine zufällige Welt zu erstellen. + Wenn dies aktiviert ist, ist das Spiel online. Wenn dies aktiviert ist, können nur eingeladene Spieler beitreten. @@ -3349,7 +3938,7 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? 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. +Bei Aktivierung wird der Nether neu erstellt. Nützlich bei alten Spielständen, die keine Netherfestungen enthalten. Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden. @@ -3357,6 +3946,20 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird. +Bei Deaktivierung können Monster und Tiere keine Blöcke verändern (z. B. werden bei Creeper-Explosionen keine Blöcke zerstört und Schafe entfernen kein Gras) oder Gegenstände aufheben. + +Bei Aktivierung behalten Spieler ihr Inventar, wenn sie sterben. + +Bei Deaktivierung erscheinen keine NPCs auf natürlichem Weg. + +Bei Deaktivierung lassen Monster und Tiere keine Beute fallen (z. B. lassen Creeper kein Schießpulver fallen). + +Bei Deaktivierung lassen Blöcke keine Gegenstände zurück, wenn sie zerstört werden (z. B. hinterlassen Steinblöcke keine Pflastersteine). + +Bei Deaktivierung wird die Gesundheit von Spielern nicht auf natürlichem Weg wiederhergestellt. + +Bei Deaktivierung ändert sich die Tageszeit nicht. + Skinpakete Themen @@ -3405,7 +4008,49 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? {*PLAYER*} wurde von {*SOURCE*} erschlagen. -{*PLAYER*} wurde durch {*SOURCE*} getötet. +{*PLAYER*} wurde durch {*SOURCE*} mit Magie getötet. + +{*PLAYER*} ist von einer Leiter gefallen. + +{*PLAYER*} ist von Ranken heruntergefallen. + +{*PLAYER*} ist aus dem Wasser gefallen. + +{*PLAYER*} ist aus großer Höhe heruntergefallen. + +{*PLAYER*} wurde von {*SOURCE*} zum Absturz verdammt. + +{*PLAYER*} wurde von {*SOURCE*} zum Absturz verdammt. + +{*PLAYER*} wurde von {*SOURCE*} mit {*ITEM*} zum Absturz verdammt. + +{*PLAYER*} ist zu tief gefallen und wurde von {*SOURCE*} erledigt. + +{*PLAYER*} ist zu tief gefallen und wurde von {*SOURCE*} mit {*ITEM*} erledigt. + +{*PLAYER*} ist im Kampf gegen {*SOURCE*} ins Feuer gegangen. + +{*PLAYER*} wurde im Kampf gegen {*SOURCE*} eingeäschert. + +{*PLAYER*} hat versucht, in Lava zu schwimmen, um {*SOURCE*} zu entkommen. + +{*PLAYER*} ist beim Versuch ertrunken, {*SOURCE*} zu entkommen. + +{*PLAYER*} ist beim Versuch, {*SOURCE*} zu entkommen, in einen Kaktus gelaufen. + +{*PLAYER*} wurde von {*SOURCE*} in die Luft gejagt. + +{*PLAYER*} ist verdorrt. + +{*PLAYER*} wurde durch {*SOURCE*} mit {*ITEM*} getötet. + +{*PLAYER*} wurde von {*SOURCE*} mit {*ITEM*} erschossen. + +{*PLAYER*} starb durch einen Feuerball von {*SOURCE*} mit {*ITEM*}. + +{*PLAYER*} wurde von {*SOURCE*} mit {*ITEM*} erschlagen. + +{*PLAYER*} wurde durch {*SOURCE*} mit {*ITEM*} getötet. Grundgesteinnebel @@ -3570,9 +4215,9 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Nether nicht zurücksetzen -Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. +Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen, Katzen und Pferden 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 Schweinen, Schafen, Kühen, Katzen und Pferden wurde erreicht. Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Pilzkühen wurde erreicht. @@ -3582,6 +4227,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Tintenfischen in einer Welt wurde erreicht. +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Fledermäusen 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. @@ -3590,12 +4237,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? 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 Schweine, Schafe, Kühen, Katzen und Pferden 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 Pferde 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. @@ -3623,27 +4272,43 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Mitwirkende Inhalte neu installieren - + Debug-Einstellungen - + Feuer breitet sich aus - + TNT explodiert - + Spieler gegen Spieler - + Spielern vertrauen - + Hostprivilegien - + Strukturen erzeugen - + Superflache Welt - + Bonustruhe - + Weltoptionen - + +Spieloptionen + +NPC-Griefing + +Inventar behalten + +NPC-Eintritt + +NPC-Beute + +Felderertrag + +Natürliche Erholung + +Tageslichtzyklus + Kann bauen und abbauen Kann Türen und Schalter verwenden @@ -3830,6 +4495,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Gift +Dürre + +Gesundheitsbonus + +Absorption + +Sättigung + der Geschwindigkeit der Langsamkeit @@ -3868,6 +4541,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? des Gifts +des Verfalls + +des Gesundheitsbonus + +der Absorption + +der Sättigung + II @@ -3964,6 +4645,22 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Verringert mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern. +Bei Anwendung: + +Pferdesprungstärke + +Zombie-Verstärkungen + +Max. Gesundheit + +NPC-Folgereichweite + +Rückstoßwiderstand + +Geschwindigkeit + +Angriffsschaden + Schärfe Bann @@ -4054,7 +4751,7 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? 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 1{*ICON_SHANK_01*}, doch du kannst dich damit vergiften. Regeneriert 3{*ICON_SHANK_01*}. Wird aus einer Karotte und Goldnuggets hergestellt. @@ -4452,7 +5149,7 @@ Alle Endertruhen in einer Welt sind verknüpft, sodass Gegenstände, die in eine Xbox 360 -Back +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. diff --git a/Minecraft.Client/Common/Media/es-ES/4J_strings.resx b/Minecraft.Client/Common/Media/es-ES/4J_strings.resx index ea428db6..4882271b 100644 --- a/Minecraft.Client/Common/Media/es-ES/4J_strings.resx +++ b/Minecraft.Client/Common/Media/es-ES/4J_strings.resx @@ -73,11 +73,11 @@ 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. +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. +Esta característica requiere un perfil de jugador con sesión iniciada en Xbox LIVE. -Conectarse a Xbox Live +Conectarse a Xbox LIVE Seguir jugando sin conexión @@ -100,7 +100,7 @@ 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. +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 index 6fbeff35..1e07927c 100644 --- a/Minecraft.Client/Common/Media/es-ES/strings.resx +++ b/Minecraft.Client/Common/Media/es-ES/strings.resx @@ -11,7 +11,7 @@ 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. +Dale un hueso a un lobo para domarlo. 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*}. @@ -87,7 +87,7 @@ 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. +Los lobos domados 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. @@ -216,7 +216,7 @@ 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*}Lágrima de Ghast{*ETW*}{*B*} * {*T2*}Polvo de llama{*ETW*}{*B*} * {*T2*}Crema de magma{*ETW*}{*B*} * {*T2*}Melón resplandeciente{*ETW*}{*B*} @@ -229,7 +229,7 @@ Tendrás que experimentar y combinar ingredientes para averiguar cuántas pocion {*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*} +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*} @@ -286,19 +286,40 @@ En modo de vuelo, puedes mantener pulsado{*CONTROLLER_ACTION_JUMP*} para subir y 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*} + Si está habilitado, 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*} + Si está deshabilitado, 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*} + Si está habilitado, 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*} + Si está habilitado, la dinamita explota cuando se denota. 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*} + Si está habilitado, el host puede activar su habilidad para volar, deshabilitar la extenuación y hacerse invisible desde el menú de juego. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Ciclo de luz diurna{*ETW*}{*B*} + Al desactivarse, la hora del día no cambiará.{*B*}{*B*} + + {*T2*}Mantener inventario{*ETW*}{*B*} + Al activarse, los jugadores mantendrán el inventario al morir.{*B*}{*B*} + + {*T2*}Generación de enemigos{*ETW*}{*B*} + Al desactivarse, los enemigos no se generarán de forma natural.{*B*}{*B*} + + {*T2*}Vandalismo de enemigos{*ETW*}{*B*} + Cuando se desactiva, impide que monstruos y animales cambien bloques (por ejemplo, las explosiones de Creepers no destruirán bloques y las ovejas no quitarán el césped) o recojan objetos.{*B*}{*B*} + + {*T2*}Botín de enemigos{*ETW*}{*B*} + Al desactivarse, los monstruos y animales no soltarán botín (por ejemplo, los Creepers no soltarán pólvora).{*B*}{*B*} + + {*T2*}Soltar casillas{*ETW*}{*B*} + Al desactivarse, los bloques no soltarán objetos cuando se destruyan (por ejemplo, los bloques de piedra no soltarán guijarros).{*B*}{*B*} + + {*T2*}Regeneración natural{*ETW*}{*B*} + Al desactivarse, los jugadores no regenerarán salud de forma natural.{*B*}{*B*} {*T1*}Opciones de generación del mundo{*ETW*}{*B*} Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} @@ -313,10 +334,10 @@ Cuando se crea un mundo existen opciones adicionales.{*B*}{*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*} + Si está habilitado, el mundo inferior se regenerará. 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*} + Dentro del juego se pueden acceder a varias opciones pulsando {*BACK_BUTTON*} 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*} @@ -325,42 +346,44 @@ Cuando se crea un mundo existen opciones adicionales.{*B*}{*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*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. Cuando esta opción está habilitada, el jugador puede interaccionar con el mundo de forma normal. Cuando está deshabilitado 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*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. 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*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. 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*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. 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*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. 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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*} + + {*T2*}Desactiva la 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*} + + {*T2*}Puede teletransportarse{*ETW*}{*B*} Permite al jugador desplazarse o desplazar a otros hasta la posición de otros jugadores en el mundo. +En el caso de jugadores que no estén en la misma {*PLATFORM_NAME*} que el host, si se selecciona esta opción se expulsará al jugador de la partida y a cualquier otro jugador en la misma {*PLATFORM_NAME*}. El jugador no podrá volver a unirse al juego hasta que se reinicie. + Página siguiente Página anterior @@ -424,62 +447,94 @@ para que puedan unirse a ti con facilidad. 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*} +{*T3*}Cambios e incorporaciones{*ETW*}{*B*}{*B*} +- Nuevos objetos añadidos: arcilla endurecida, arcilla tintada, bloque de hulla, fardo de heno, raíl activador, bloque de piedra rojiza, sensor de luz diurna, soltador, embudo, vagoneta con embudo, vagoneta con dinamita, comparador de piedra rojiza, plato de presión por peso, faro, cofre trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del mundo inferior, rienda, armadura para caballo, etiqueta de nombre y huevo generador de caballos.{*B*} +- Nuevos enemigos añadidos: Wither, esqueletos atrofiados, brujas, murciélagos, caballos, burros y mulas.{*B*} +- Nuevas funciones de generación de terrenos: chozas de bruja.{*B*} +- Nueva interfaz de faro.{*B*} +- Nueva interfaz de caballo.{*B*} +- Nueva interfaz de embudo.{*B*} +- Nueva interfaz de fuegos artificiales: podrás acceder a ella desde la mesa de creación cuando tengas los ingredientes necesarios para fabricar una estrella de fuegos artificiales o un cohete de fuegos artificiales.{*B*} +- Nuevo modo Aventura: en él solo podrás romper bloques con las herramientas correctas.{*B*} +- Nuevos efectos de sonido.{*B*} +- Los enemigos, los objetos y los proyectiles podrán pasar ahora a través de portales.{*B*} +- Ahora los repetidores se pueden bloquear proporcionándoles energía con otros repetidores.{*B*} +- Los zombis y esqueletos pueden generarse con diferentes armas y armaduras.{*B*} +- Nuevos mensajes de muerte.{*B*} +- Ponles nombre a tus enemigos con una etiqueta y cámbiales el nombre a los contenedores para que aparezca en el título del menú.{*B*} +- Ahora la carne de hueso no hará crecer todo a su máximo tamaño, sino que lo hará por fases.{*B*} +- La señal de piedra rojiza que describe el contenido de los cofres, puestos de destilado, dispensadores y tocadiscos se puede detectar con un comparador de piedra rojiza.{*B*} +- Los dispensadores se pueden orientar en cualquier dirección.{*B*} +- Comerse una manzana dorada le da al jugador salud de "absorción" extra durante un corto periodo de tiempo.{*B*} +- Cuanto más tiempo permanezcas en una zona, más fuertes serán los monstruos que se generen en dicha zona.{*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*} - +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*}: arcilla endurecida, arcilla tintada, bloque de hulla, fardo de heno, raíl activador, bloque de piedra rojiza, sensor de luz diurna, soltador, embudo, vagoneta con embudo, vagoneta con dinamita, comparador de piedra rojiza, plato de presión por peso, faro, cofre trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del mundo inferior, rienda, armadura para caballo, etiqueta de nombre y huevo generador de caballos.{*B*}{*B*} +{*T1*}Nuevos enemigos{*ETB*}: Wither, esqueletos atrofiados, brujas, murciélagos, caballos, burros y mulas.{*B*}{*B*} +{*T1*}Nuevas funciones{*ETB*}: doma caballos y móntalos, fabrica fuegos artificiales y lánzalos, ponle nombre a los animales y a los monstruos con etiquetas, crea circuitos de piedra rojiza más avanzados y, además, descubre las nuevas opciones de host que te ayudarán a controlar lo que tus invitados pueden hacer en tu mundo.{*B*}{*B*} +{*T1*}Nuevos mundo tutorial{*ETB*} – ¡Aprende a utilizar las antiguas y las nuevas funciones con el mundo tutorial! ¡A ver si puedes encontrar todos los discos secretos ocultos en el mundo!{*B*}{*B*} + + +Caballos + +{*T3*}CÓMO SE JUEGA: CABALLOS{*ETW*}{*B*}{*B*} +Los caballos y los burros se suelen encontrar en las llanuras abiertas. Las mulas son las crías de un burro y un caballo, pero no son fértiles.{*B*} +Todos los caballos, burros y mulas adultos se pueden montar. Sin embargo, solo los caballos pueden llevar armadura, y solo las mulas y los burros pueden equiparse con alforjas para llevar objetos.{*B*}{*B*} +Los caballos, burros y mulas deben domarse antes de poder usarse. Un caballo se doma intentando montarlo y logrando mantenerse sobre él mientras trata de tirarte.{*B*} +Cuando estén domados, aparecerán corazones de amor a su alrededor y ya no intentarán tirarte. Para dirigir un caballo, debes equiparlo con una silla de montar.{*B*}{*B*} +Puedes comprar sillas de montar a los aldeanos o encontrarlas en cofres ocultos por el mundo.{*B*} +Puedes poner alforjas a los burros y mulas domados; solo tienes que colocarles un cofre. Puedes acceder a estas alforjas mientras montas o acechas.{*B*}{*B*} +Los caballos y los burros (pero no las mulas) pueden cruzarse como los demás animales utilizando manzanas doradas o zanahorias doradas.{*B*} +Los potros se convertirán en caballos adultos con el tiempo, aunque alimentarlos con trigo o heno acelerará el proceso.{*B*} + + +Faros + +{*T3*}CÓMO SE JUEGA: FAROS{*ETW*}{*B*}{*B*} +Los faros activos proyectan un rayo de luz brillante hacia el cielo y otorgan poderes a los jugadores cercanos.{*B*} +Se crean con cristal, obsidiana y estrellas del mundo inferior, que se pueden obtener derrotando al Wither.{*B*}{*B*} +Los faros deben situarse de modo que queden al sol durante el día. Los faros deben colocarse en pirámides de hierro, oro, esmeralda o diamante.{*B*} +El material sobre el que se sitúe el faro no tiene ningún efecto sobre el poder del mismo.{*B*}{*B*} +En el menú de faro puedes elegir un poder principal para este. Podrás elegir entre más poderes cuantas más plantas tenga la pirámide.{*B*} +Un faro sobre una pirámide de al menos cuatro plantas también ofrece la posibilidad de o bien tener el poder secundario Regeneración, o bien tener un poder principal más fuerte.{*B*}{*B*} +Para establecer los poderes del faro, debes sacrificar un lingote de esmeralda, diamante, oro o hierro en el espacio de pago.{*B*} +Una vez establecidos, los poderes emanarán del faro indefinidamente.{*B*} + + +Fuegos artificiales + +{*T3*}CÓMO SE JUEGA: FUEGOS ARTIFICIALES{*ETW*}{*B*}{*B*} +Los fuegos artificiales son objetos decorativos que se pueden lanzar manualmente o con dispensadores. Se pueden crear usando papel, pólvora y, opcionalmente, una cantidad específica de estrellas de fuegos artificiales.{*B*} +Se pueden personalizar el color, el desvanecimiento, la forma, el tamaño y los efectos (como estelas y brillos) de las estrellas de fuegos artificiales si se les incluye ingredientes adicionales durante la creación.{*B*}{*B*} +Para crear un fuego artificial, coloca pólvora y papel en el recuadro de creación de 3x3 que se ve en tu inventario.{*B*} +También puedes colocar varias estrellas de fuegos artificiales en el recuadro de creación para agregarlas a los fuegos artificiales.{*B*} +Cuanta más pólvora utilices durante la creación, más ascenderá la estrella de fuegos artificiales antes de explotar.{*B*}{*B*} +Luego recoge el fuego artificial que has creado del espacio de producción.{*B*}{*B*} +Las estrellas de fuegos artificiales se pueden crear con pólvora y tinte.{*B*} + - El tinte determinará el color de la estrella al explotar.{*B*} + - La forma de la estrella se puede determinar añadiéndole descargas de fuego, pepitas de oro, plumas o cabeza de enemigos.{*B*} + - Se puede añadir una estela o un brillo usando diamantes o polvo de piedra brillante.{*B*}{*B*} +Cuando hayas creado un fuego artificial, puedes determinar el color de desvanecimiento de la estrella con tinte. + + +Embudos + +{*T3*}CÓMO SE JUEGA: EMBUDOS{*ETW*}{*B*}{*B*} +Los embudos se utilizan para insertar o quitar objetos de contenedores y para recoger de forma automática los objetos que se hayan lanzado en su interior.{*B*} +Pueden afectar a puestos de destilado, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con embudos y otros embudos.{*B*}{*B*} +Los embudos intentarán absorber sin cesar objetos de un contenedor apto que se coloque sobre ellos. También tratarán de insertar objetos almacenados en un contenedor de salida.{*B*} +Si un embudo funciona con piedra rojiza, se volverá inactivo y dejará tanto de absorber como de insertar objetos.{*B*}{*B*} +Un embudo apunta en la dirección en la que intenta soltar objetos. Para que un embudo apunte a cierto bloque, colócalo contra dicho bloque mientras acechas.{*B*} + + +Soltadores + +{*T3*}CÓMO SE JUEGA: SOLTADORES{*ETW*}{*B*}{*B*} +Cuando se encuentren junto a una piedra rojiza, los soltadores dejarán caer un objeto aleatorio. Usa {*CONTROLLER_ACTION_USE*} para abrir el soltador y cargarlo con objetos de tu inventario.{*B*} +Si el soltador se encuentra frente a un cofre o a otro tipo de contenedor, el objeto caerá en dicho cofre o contenedor. Se pueden construir largas cadenas de soltadores para transportar objetos a grandes distancias. Para que esto funcione, se los tiene que activar y desactivar alternativamente. + Causa más daño que a mano. @@ -606,10 +661,36 @@ Los colores de la cama siempre son los mismos, independientemente del color de l Cuando se porta, crea una imagen del área explorada. Se puede usar para buscar rutas. +Al usarse, se convierte en un mapa de la parte del mundo en la que te encuentras y se llena conforme lo exploras. + Permite ataques a distancia con flechas. Se usa como munición para arcos. +La suelta el Wither y se utiliza para crear faros. + +Cuando se activan, crean coloridas explosiones. El color, efecto, forma y desaparición vienen determinados por la estrella de fuegos artificiales que se utilice al crear unos fuegos artificiales. + +Se utiliza para determinar el color, efecto y forma de unos fuegos artificiales. + +Se utiliza en los circuitos de piedra rojiza para mantener, comparar o sustraer fuerza de señal, o para medir el estado de ciertos bloques. + +Es un tipo de vagoneta que funciona como un bloque de dinamita móvil. + +Es un bloque que emite una señal de piedra rojiza en función de la luz solar (o la falta de la misma). + +Es un tipo especial de vagoneta que funciona de forma similar a un embudo. Recogerá objetos que estén sueltos en las vías y de los contenedores de encima. + +Un tipo especial de armadura con la que se puede equipar un caballo. Proporciona 5 de armadura. + +Un tipo especial de armadura con la que se puede equipar un caballo. Proporciona 7 de armadura. + +Un tipo especial de armadura con la que se puede equipar un caballo. Proporciona 11 de armadura. + +Se utiliza para atar enemigos al jugador o a postes de valla. + +Se utiliza para nombrar enemigos del mundo. + Restablece 2,5{*ICON_SHANK_01*}. Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. @@ -626,7 +707,7 @@ Los colores de la cama siempre son los mismos, independientemente del color de l 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 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en el horno. Restablece 1.5{*ICON_SHANK_01*}, o se puede cocinar en el horno. @@ -667,7 +748,7 @@ de nivel bajo. 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. +Funciona como un plato de presión, ya que envía una señal de piedra rojiza cuando se activa, pero solo una vagoneta puede hacer que se active. Se usa para transportarte a ti, a un animal o a un monstruo por raíles. @@ -731,7 +812,7 @@ de tinta en vez de 3). Se usa para crear libros y mapas. -Se usa para crear una estantería o para hechizar libros. +Se usa para crear estanterías o libros hechizados. Permite crear hechizos más potentes cuando se coloca alrededor de una mesa de hechizos. @@ -881,7 +962,7 @@ de tinta en vez de 3). 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. +Se usa para destilar pociones. Lo sueltan los Ghast 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. @@ -911,7 +992,7 @@ de tinta en vez de 3). 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 para construir fortalezas del mundo inferior. Inmume a las bolas de fuego del Ghast. Se usa en las fortalezas del mundo inferior. @@ -947,100 +1028,158 @@ de tinta en vez de 3). Las cabezas de enemigos pueden colocarse como decoración o llevarse como una máscara en el espacio de casco. +Se utiliza para ejecutar comandos. + +Proyecta un rayo de luz hacia el cielo y puede causar efectos de estado en los jugadores cercanos. + +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. El cofre trampa también crea una descarga de piedra rojiza cuando se abre. + +Proporciona una descarga de piedra rojiza. La descarga será más fuerte si hay más objetos en el plato. + +Proporciona una descarga de piedra rojiza. La descarga será más fuerte si hay más objetos en el plato. Requiere más peso que el plato ligero. + +Se usa como fuente de energía de piedra rojiza. Se puede volver a transformar en piedra rojiza. + +Se utiliza para coger objetos o transferir objetos dentro o fuera de contenedores. + +Un tipo de raíl que puede activar o desactivar vagonetas con embudos y activar vagonetas con dinamita. + +Se usa para sujetar y soltar objetos, o para empujarlos dentro de otro contenedor cuando recibe una descarga de piedra rojiza. + +Bloques coloridos que se crean tiñendo arcilla endurecida. + +Se le puede dar de comer a los caballos, burros o mulas para curar hasta 10 corazones. Acelera el crecimiento de los potros. + +Se crea al fundir arcilla en un horno. + +Se crea a partir de cristal y un tinte. + +Se crea a partir de vidrio tintado. + +Una manera de almacenar hulla de forma compacta. Se puede usar como combustible en un horno. + 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. - + +Se divide en 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á. - + +Se encuentran en junglas. Pueden domarse 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. - + +Murciélago + +Estas criaturas voladoras se encuentran en cuevas y otros grandes espacios cerrados. + +Bruja + +Estos enemigos pueden encontrarse en pantanos y atacan lanzando pociones. Si las matas, sueltan pociones. + +Caballo + +Estos animales se pueden domar y montar. + +Burro + +Estos animales se pueden domar y montar. Es posible colocarles un cofre. + +Mula + +Nace del cruce de un caballo y un burro. Estos animales se pueden domar y, después, montar y usar para transportar cofres. + +Caballo zombi + +Caballo esqueleto + +Wither + +Se crea a partir de calaveras atrofiadas y arena de almas. Dispara calaveras explosivas. + Explosives Animator Concept Artist @@ -1203,7 +1342,7 @@ de tinta en vez de 3). Casco de malla -Peto de malla +Coraza de malla Mallas de malla @@ -1319,7 +1458,7 @@ de tinta en vez de 3). Libro -Repugnante +Bola de limo Vagoneta con cofre @@ -1387,6 +1526,8 @@ de tinta en vez de 3). Mapa +Mapa vacío + Disco: "13" Disco: "gato" @@ -1433,7 +1574,7 @@ de tinta en vez de 3). Barra de llama -Lágrima de espectro +Lágrima de Ghast Pepita de oro @@ -1489,6 +1630,28 @@ de tinta en vez de 3). Cabeza de Creeper +Estrella del mundo inferior + +Cohete de fuegos artificiales + +Estrella de fuegos artificiales + +Comparador de piedra rojiza + +Vagoneta con dinamita + +Vagoneta con embudo + +Armadura para caballo de hierro + +Armadura para caballo de oro + +Armadura para caballo de diamante + +Rienda + +Etiqueta de nombre + Piedra Bloque de hierba @@ -1505,6 +1668,8 @@ de tinta en vez de 3). Tablones de la jungla +Tablones (de cualquier tipo) + Arbolillo Arbolillo de roble @@ -1765,7 +1930,7 @@ de tinta en vez de 3). Ladrillos de piedra musgosa -Ladrillos de piedra requebrajada +Ladrillos de piedra resquebrajada Ladrillos de piedra cincelados @@ -1841,6 +2006,190 @@ de tinta en vez de 3). Calavera +Bloque de comando + +Faro + +Cofre trampa + +Plato de presión por peso (ligero) + +Plato de presión por peso (pesado) + +Comparador de piedra rojiza + +Sensor de luz diurna + +Bloque de piedra rojiza + +Embudo + +Raíl activador + +Soltador + +Arcilla tintada + +Fardo de heno + +Arcilla endurecida + +Bloque de hulla + +Arcilla tintada negra + +Arcilla tintada roja + +Arcilla tintada verde + +Arcilla tintada marrón + +Arcilla tintada azul + +Arcilla tintada púrpura + +Arcilla tintada cian + +Arcilla tintada gris claro + +Arcilla tintada gris + +Arcilla tintada rosa + +Arcilla tintada lima + +Arcilla tintada amarilla + +Arcilla tintada azul claro + +Arcilla tintada magenta + +Arcilla tintada naranja + +Arcilla tintada blanca + +Vidrio tintado + +Vidrio tintado negro + +Vidrio tintado rojo + +Vidrio tintado verde + +Vidrio tintado marrón + +Vidrio tintado azul + +Vidrio tintado púrpura + +Vidrio tintado cian + +Vidrio tintado gris claro + +Vidrio tintado gris + +Vidrio tintado rosa + +Vidrio tintado lima + +Vidrio tintado amarillo + +Vidrio tintado azul claro + +Vidrio tintado magenta + +Vidrio tintado naranja + +Vidrio tintado blanco + +Panel de vidrio tintado + +Panel de vidrio tintado negro + +Panel de vidrio tintado rojo + +Panel de vidrio tintado verde + +Panel de vidrio tintado marrón + +Panel de vidrio tintado azul + +Panel de vidrio tintado púrpura + +Panel de vidrio tintado cian + +Panel de vidrio tintado gris claro + +Panel de vidrio tintado gris + +Panel de vidrio tintado rosa + +Panel de vidrio tintado lima + +Panel de vidrio tintado amarillo + +Panel de vidrio tintado azul claro + +Panel de vidrio tintado magenta + +Panel de vidrio tintado naranja + +Panel de vidrio tintado blanco + +Bola pequeña + +Bola grande + +Forma de estrella + +Forma de Creeper + +Explosión + +Forma desconocida + +Negros + +Rojos + +Verdes + +Marrones + +Azules + +Púrpuras + +Cian + +Gris claro + +Grises + +Rosas + +Lima + +Amarillos + +Azul claro + +Magenta + +Naranjas + +Blancos + +Personalizados + +Desaparición en + +Destello + +Rastro + +Duración del vuelo: +  Controles actuales Diseño @@ -2018,8 +2367,7 @@ Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} 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. @@ -2040,7 +2388,7 @@ Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} - Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_VK_RT*} . + Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . @@ -2074,7 +2422,7 @@ Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} - Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_VK_RT*} . + Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . @@ -2540,7 +2888,7 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci 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. + Los lobos salvajes se pueden domar dándoles huesos. Una vez domados, 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. @@ -2620,6 +2968,211 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Pulsa{*CONTROLLER_VK_B*} si ya tienes información sobre la barra de comida y cómo comer. + + Esta es la interfaz del inventario equino. + + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario equino. + + + + El inventario equino te permite transferir o equipar con objetos tu caballo, burro o mula. + + + + Ensilla tu caballo colocando una silla de montar en el espacio correspondiente. Puedes poner armaduras a los caballos; solo tienes que colocar la armadura para caballo en el espacio correspondiente. + + + + También puedes transferir objetos entre tu propio inventario y las alforjas que llevan los burros y mulas desde este menú. + + +Has encontrado un caballo. + +Has encontrado un burro. + +Has encontrado una mula. + + + {*B*}Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los caballos, los burros y las mulas. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los caballos, los burros y las mulas. + + + + Los caballos y los burros se suelen encontrar en las llanuras abiertas. Las mulas se pueden criar a partir de un burro y un caballo, pero no son fértiles. + + + + Todos los caballos, burros y mulas adultos se pueden montar. Sin embargo, solo los caballos pueden llevar armadura, y solo las mulas y los burros pueden equiparse con alforjas para llevar objetos. + + + + Los caballos, burros y mulas deben domarse antes de poder usarse. Un caballo se doma intentando montarlo y logrando mantenerse sobre él mientras trata de tirarte. + + + + Cuando estén domados, aparecerán corazones de amor a su alrededor y ya no intentarán tirarte. + + + + Ahora intenta montar este caballo. Usa {*CONTROLLER_ACTION_USE*} sin objetos ni herramientas en las manos para montarlo. + + + + Para dirigir un caballo, debe estar equipado antes con una silla de montar que se puede comprar a los aldeanos o encontrar en cofres ocultos por el mundo. + + + + Puedes poner alforjas a los burros y mulas domados; solo tienes que colocarles un cofre. Puedes acceder a estas alforjas mientras montas o acechas. + + + + Los caballos y los burros (pero no las mulas) pueden cruzarse como los demás animales utilizando manzanas doradas o zanahorias doradas. Los potros se convertirán en caballos adultos con el tiempo, aunque alimentarlos con trigo o heno acelerará el proceso. + + + + Aquí puedes intentar domar los caballos y burros, y hay sillas de montar, armaduras de caballo y otros objetos útiles para caballos en los cofres de la zona. + + + + Esta es la interfaz de faro, que puedes utilizar para elegir los poderes que otorgará tu faro. + + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo usar la interfaz de faro. + + + + En el menú de faro puedes elegir un poder principal para este. Podrás elegir entre más poderes cuantas más plantas tenga la pirámide. + + + + Un faro sobre una pirámide de al menos cuatro plantas también ofrece la posibilidad de o bien tener el poder secundario Regeneración, o bien tener un poder principal más fuerte. + + + + Para establecer los poderes del faro, debes sacrificar un lingote de esmeralda, diamante, oro o hierro en el espacio de pago. Una vez establecidos, los poderes emanarán del faro indefinidamente. + + +En lo alto de esta pirámide hay un faro inactivo. + + + {*B*}Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los faros. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los faros. + + + + Los faros activos proyectan un rayo de luz brillante hacia el cielo y otorgan poderes a los jugadores cercanos. Se crean con cristal, obsidiana y estrellas del mundo inferior, que se pueden obtener derrotando al Wither. + + + + Los faros deben situarse de modo que queden al sol durante el día. Los faros deben colocarse en pirámides de hierro, oro, esmeralda o diamante. Sin embargo, el material sobre el que se sitúe el faro no tiene ningún efecto sobre el poder del mismo. + + + + Intenta utilizar el faro para establecer los poderes que otorga; puedes pagar con los lingotes de hierro que se te han proporcionado. + + +Esta sala contiene embudos + + + {*B*}Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los embudos. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los embudos. + + + + Los embudos se utilizan para insertar o quitar objetos de contenedores y para recoger de forma automática los objetos que se hayan lanzado en su interior. + + + + Pueden afectar a puestos de destilado, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con embudos y otros embudos. + + + + Los embudos intentarán absorber sin cesar objetos de un contenedor apto que se coloque sobre ellos. También tratarán de insertar objetos almacenados en un contenedor de salida. + + + + Sin embargo, si un embudo funciona con piedra rojiza, se volverá inactivo y dejará tanto de absorber como de insertar objetos. + + + + Un embudo apunta en la dirección en la que intenta soltar objetos. Para que un embudo apunte a cierto bloque, colócalo contra dicho bloque mientras acechas. + + + + Hay varias configuraciones útiles de embudo que ver y probar en esta sala. + + + + Esta es la interfaz de fuegos artificiales, que puedes utilizar para fabricar fuegos artificiales y estrellas de fuegos artificiales. + + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar la interfaz de fuegos artificiales. + + + + Para crear un fuego artificial, coloca pólvora y papel en el recuadro de creación de 3x3 que se ve en tu inventario. + + + + También puedes colocar varias estrellas de fuegos artificiales en el recuadro de creación para agregarlas a los fuegos artificiales. + + + + Cuanta más pólvora utilices durante la creación, más ascenderá la estrella de fuegos artificiales antes de explotar. + + + + Luego recoge el fuego artificial que has creado del espacio de producción si quieres usarlo. + + + + Las estrellas de fuegos artificiales se pueden crear con pólvora y tinte. + + + + El tinte determinará el color de la estrella al explotar. + + + + La forma de la estrella se puede determinar añadiéndole descargas de fuego, pepitas de oro, plumas o cabeza de enemigos. + + + + Se puede añadir una estela o un brillo usando diamantes o polvo de piedra brillante. + + + + Cuando hayas creado un fuego artificial, puedes determinar el color de desvanecimiento de la estrella con tinte. + + + + ¡Dentro del cofre hay varios objetos que puedes usar para crear FUEGOS ARTIFICIALES! + + + + {*B*}Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los fuegos artificiales. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los fuegos artificiales. + + + + Los fuegos artificiales son objetos decorativos que se pueden lanzar manualmente o con dispensadores. Se pueden crear usando papel, pólvora y, opcionalmente, una cantidad específica de estrellas de fuegos artificiales. + + + + Se pueden personalizar el color, el desvanecimiento, la forma, el tamaño y los efectos (como estelas y brillos) de las estrellas de fuegos artificiales si se les incluye ingredientes adicionales durante la creación. + + + + Prueba a crear fuegos artificiales en la mesa de creación usando los ingredientes que desees de los cofres. + +  Seleccionar Usar @@ -2708,7 +3261,7 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Alimentar -Domesticar +Domar Curar @@ -2816,7 +3369,7 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Equipar -Retirar +Tensar Soltar @@ -2840,8 +3393,24 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Eliminar todos los espacios -Subir partida guardada para Xbox One +Cargar partida guardada para Xbox One +Montar + +Desmontar + +Colocar cofre + +Lanzar + +Atar + +Soltar + +Colocar + +Nombre + Aceptar Cancelar @@ -3152,6 +3721,20 @@ Ve a la Interfaz para seleccionar este tema. Dispensador +Caballo + +Soltador + +Embudo + +Faro + +Poder principal + +Poder secundario + +Vagoneta + No existen ofertas de descarga de contenido de este tipo disponibles para este título en este momento. %s se ha unido al juego. @@ -3311,10 +3894,14 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Modo juego: Creativo +Modo juego: Aventura + Supervivencia Creativo +Aventura + En modo Supervivencia En modo Creativo @@ -3335,6 +3922,8 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Superplano +Introduce una semilla para volver a generar el mismo terreno. Déjalo vacío para un mundo aleatorio. + Si está habilitado, el juego será un juego en línea. Si está habilitado, solo los jugadores invitados pueden unirse. @@ -3359,6 +3948,20 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador. +Cuando se desactiva, impide que monstruos y animales cambien bloques (por ejemplo, las explosiones de Creepers no destruirán bloques y las ovejas no quitarán el césped) o recojan objetos. + +Al activarse, los jugadores mantendrán el inventario al morir. + +Al desactivarse, los enemigos no se generarán de forma natural. + +Al desactivarse, los monstruos y animales no soltarán botín (por ejemplo, los Creepers no soltarán pólvora). + +Al desactivarse, los bloques no soltarán objetos cuando se destruyan (por ejemplo, los bloques de piedra no soltarán guijarros). + +Al desactivarse, los jugadores no regenerarán salud de forma natural. + +Al desactivarse, la hora del día no cambiará. + Packs de aspecto Temas @@ -3407,7 +4010,49 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. {*SOURCE*} apaleó a {*PLAYER*} -{*PLAYER*} ha muerto a manos de {*SOURCE*} +{*SOURCE*} mató a {*PLAYER*} con magia. + +{*PLAYER*} se cayó de una escalera. + +{*PLAYER*} se cayó de unas hiedras. + +{*PLAYER*} se cayó del agua. + +{*PLAYER*} se cayó de un lugar alto. + +{*SOURCE*} condenó a caer a {*PLAYER*}. + +{*SOURCE*} condenó a caer a {*PLAYER*}. + +{*SOURCE*} condenó a caer a {*PLAYER*} con {*ITEM*}. + + {*PLAYER*} cayó demasiado lejos y murió a manos de {*SOURCE*}. + + {*PLAYER*} cayó demasiado lejos y murió a manos de {*SOURCE*}, que utilizó {*ITEM*}. + +{*PLAYER*} tropezó con fuego mientras luchaba contra {*SOURCE*}. + +{*PLAYER*} acabó cual tostada chamuscada mientras luchaba contra {*SOURCE*}. + +{*PLAYER*} intentó nadar en la lava para escapar de {*SOURCE*}. + +{*PLAYER*} se ahogó mientras intentaba escapar de {*SOURCE*}. + +{*PLAYER*} tropezó con un cactus mientras intentaba escapar de {*SOURCE*}. + +{*SOURCE*} hizo volar por los aires a {*PLAYER*}. + +{*PLAYER*} sufrió los efectos del Wither. + +{*SOURCE*} asesinó a {*PLAYER*} con {*ITEM*}. + +{*SOURCE*} disparó a {*PLAYER*} con {*ITEM*}. + +{*SOURCE*} quemó con bolas de fuego a {*PLAYER*} con {*ITEM*}. + +{*SOURCE*} apaleó a {*PLAYER*} con {*ITEM*}. + +{*PLAYER*} ha muerto a manos de {*SOURCE*}, que utilizó {*ITEM*}. Niebla de lecho de roca @@ -3574,7 +4219,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. 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 en este momento. Límite de cerdos, ovejas, vacas y gatos alcanzado. No se pueden usar huevos generadores ahora. Límite de champiñacas en un mundo alcanzado. @@ -3584,6 +4229,8 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. 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 murciélagos 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. @@ -3592,12 +4239,14 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. 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. Límite de cría de cerdos, ovejas, vacas, gatos y caballos alcanzado. 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 caballos. + 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. @@ -3610,7 +4259,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. ¡Has muerto! -Regenerarse +Regenerar Descarga de contenido @@ -3625,40 +4274,56 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. 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 - + +Opciones de juego + +Vandalismo de enemigos + +Mantener inventario + +Generación de enemigos + +Botín de enemigos + +Soltar casillas + +Regeneración natural + +Ciclo de luz diurna + Puede construir y extraer -Puedes usar puertas e interruptores. +Puede usar puertas e interruptores -Puedes abrir contenedores. +Puede abrir contenedores -Puede atacar a los jugadores +Puede atacar a jugadores -Puedes atacar a animales. +Puede atacar a animales Moderador -Expulsar +Expulsar jugador Puede volar @@ -3832,6 +4497,14 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Veneno +Wither + +Mejora de salud + +Absorción + +Saturación + de rapidez de lentitud @@ -3870,6 +4543,14 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. de veneno +de decadencia + +de mejora de salud + +de absorción + +de saturación + II @@ -3966,6 +4647,22 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Disminuye la salud de los jugadores, animales y monstruos afectados con el tiempo. +Cuando se aplica: + +Fuerza de salto de caballo + +Refuerzos zombis + +Salud máxima + +Alcance de seguimiento de enemigos + +Resistencia a derribo + +Velocidad + +Daño de ataque + Afilado Aporrear @@ -4056,7 +4753,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. 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 1{*ICON_SHANK_01*}. 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. @@ -4066,7 +4763,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. 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 crea fundiendo minerales de cuarzo del mundo inferior. Se le puede dar forma de bloque de cuarzo. Se fabrica con lana. Se usa como decoración. @@ -4092,7 +4789,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Cuarzo del mundo inferior -Mena de esmeralda +Mineral de esmeralda Cofre de Ender @@ -4120,7 +4817,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Yunque muy dañado -Mena de cuarzo del mundo inferior +Mineral de cuarzo del mundo inferior Bloque de cuarzo @@ -4435,7 +5132,7 @@ Todos los cofres de Ender de un mundo están vinculados, y los objetos que conti - Una vez domesticados, los lobos siempre llevarán un collar. Tíñelo para cambiarlo de color. + Una vez domados, 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. @@ -4458,7 +5155,7 @@ Todos los cofres de Ender de un mundo están vinculados, y los objetos que conti 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 +Cargar partida guardada para Xbox One Subir datos guardados diff --git a/Minecraft.Client/Common/Media/font/CHS/MSYH.ttf b/Minecraft.Client/Common/Media/font/CHS/MSYH.ttf new file mode 100644 index 00000000..96d1db19 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/CHS/MSYH.ttf differ diff --git a/Minecraft.Client/Common/Media/fr-FR/strings.resx b/Minecraft.Client/Common/Media/fr-FR/strings.resx index 788799ff..541bbb7d 100644 --- a/Minecraft.Client/Common/Media/fr-FR/strings.resx +++ b/Minecraft.Client/Common/Media/fr-FR/strings.resx @@ -230,11 +230,11 @@ Vous devrez essayer diverses combinaisons d'ingrédients pour découvrir toutes {*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*} +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*} +Tous les ingrédients nécessaires à une table d'enchantement peuvent se trouver dans les villages, ou bien en minant et cultivant.{*B*}{*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*} @@ -274,14 +274,14 @@ Pour ce faire, affichez le menu Pause puis appuyez sur{*CONTROLLER_VK_RB*} pour 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*} +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. 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*} +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. +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, {*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*} +{*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*} @@ -299,7 +299,28 @@ Lorsque vous chargez ou créez un monde, appuyez sur le bouton Plus d'options po 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*} + 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*} + + {*T2*}Cycle jour/nuit{*ETW*}{*B*} + Si vous désactivez cette option, le moment de la journée ne change pas.{*B*}{*B*} + + {*T2*}Conservation d'inventaire{*ETW*}{*B*} + Si vous activez cette option, les joueurs conservent leur inventaire après leur mort.{*B*}{*B*} + + {*T2*}Apparition des monstres{*ETW*}{*B*} + Si vous désactivez cette option, les monstres n'apparaissent pas automatiquement.{*B*}{*B*} + + {*T2*}Ingérence des monstres{*ETW*}{*B*} + Si vous désactivez cette option, les monstres et animaux ne peuvent ni modifier des blocs (par exemple, les explosions des Creepers ne détruisent pas les blocs et les moutons ne retirent pas d'herbe), ni ramasser des objets.{*B*}{*B*} + + {*T2*}Butin des monstres{*ETW*}{*B*} + Si vous désactivez cette option, les monstres et animaux ne laissent pas d'objets (par exemple, les Creepers ne laissent pas de poudre à canon).{*B*}{*B*} + + {*T2*}Butin des blocs{*ETW*}{*B*} + Si vous désactivez cette option, les blocs ne laissent pas d'objets après être détruits (par exemple, les blocs de pierre ne laissent pas de pierre taillée).{*B*}{*B*} + + {*T2*}Régénération auto{*ETW*}{*B*} + Si vous désactivez cette option, les joueurs ne regagnent pas leur santé automatiquement.{*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*} @@ -314,10 +335,10 @@ Lorsque vous créez un monde, vous disposez d'options supplémentaires.{*B*}{*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*} + Activé, le Nether se régénérera. Utile si vous avez une ancienne sauvegarde 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*} + Appuyez sur {*BACK_BUTTON*} 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*} @@ -337,38 +358,40 @@ Pour modifier les privilèges d'un joueur, sélectionnez son nom et appuyez sur{ {*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*} + {*T2*}Peut attaquer les 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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*} + + {*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. +Pour les joueurs qui ne sont pas sur la même console {*PLATFORM_NAME*} que le joueur hôte, la sélection de cette option éjectera le joueur de la partie, ainsi que tous les autres joueurs connectés sur sa console {*PLATFORM_NAME*}. Ce joueur ne pourra rejoindre la partie qu'après son redémarrage. + Page suivante Page précédente Principes -Interface principale +Interface Inventaire @@ -411,7 +434,7 @@ L'Ender est une autre dimension du jeu, atteinte par un portail de l'Ender actif 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. +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*} @@ -425,63 +448,95 @@ et ils pourront facilement vous rejoindre. 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*} +{*T3*}Modifications et ajouts{*ETW*}{*B*}{*B*} +- Ajout de nouveaux objets : argile durcie, argile colorée, bloc de charbon, botte de foin, rail activateur, bloc de redstone, capteur de lumière, dropper, entonnoir, chariot de mine avec entonnoir, chariot de mine avec TNT, comparateur de redstone, plaque de détection lestée, balise, coffre piégé, fusée d'artifice, étoile à feux d'artifice, étoile du Nether, laisse, caparaçon, étiquette, œuf d'apparition de cheval{*B*} +- Ajout de nouveaux monstres et animaux : Wither, Withers squelettes, sorcières, chauves-souris, chevaux, ânes et mules{*B*} +- Ajout de nouvelles fonctions de génération de terrain : cabanes de sorcières.{*B*} +- Ajout d'une interface pour les balises.{*B*} +- Ajout d'une interface pour les chevaux.{*B*} +- Ajout d'une interface pour les entonnoirs.{*B*} +- Ajout de feux d'artifice : l'interface des feux d'artifice est accessible depuis l'atelier, quand vous disposez des ingrédients nécessaires à la fabrication d'une étoile à feux d'artifice ou d'une fusée d'artifice.{*B*} +- Ajout d'un "mode Aventure" : il vous faut les bons outils pour briser les blocs.{*B*} +- Ajout de nouveaux sons en pagaille.{*B*} +- Les monstres, animaux, objets et projectiles peuvent désormais traverser les portails.{*B*} +- Il est maintenant possible de verrouiller les répéteurs en alimentant leurs flancs avec un autre répéteur.{*B*} +- Les zombies et squelettes peuvent maintenant apparaître avec différentes armes et armures.{*B*} +- Nouveaux messages de mort.{*B*} +- Nommez les monstres et animaux à l'aide d'une étiquette et renommez les conteneurs pour modifier leur titre quand le menu est ouvert.{*B*} +- La poudre d'os ne fait plus tout grandir immédiatement à sa taille maximale, mais par étapes aléatoires.{*B*} +- Vous pouvez détecter un signal de redstone décrivant le contenu des coffres, alambics, distributeurs et juke-box en plaçant un comparateur directement devant l'objet en question.{*B*} +- Les distributeurs peuvent être orientés dans toutes les directions.{*B*} +- Si vous mangez une pomme dorée, vous bénéficiez temporairement d'un bonus d'absorption de santé.{*B*} +- Plus vous restez dans une zone, plus les montres qui y apparaissent sont dangereux.{*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*} +Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jetez un œil à l'aperçu qui suit et amusez-vous bien !{*B*}{*B*} +{*T1*}Nouveaux objets{*ETB*} : argile durcie, argile colorée, bloc de charbon, botte de foin, rail activateur, bloc de redstone, capteur de lumière, dropper, entonnoir, chariot de mine avec entonnoir, chariot de mine avec TNT, comparateur de redstone, plaque de détection lestée, balise, coffre piégé, fusée d'artifice, étoile à feux d'artifice, étoile du Nether, laisse, caparaçon, étiquette, œuf d'apparition de cheval{*B*}{*B*} +{*T1*}Nouveaux monstres et animaux{*ETB*} : Wither, Withers squelettes, sorcières, chauves-souris, chevaux, ânes et mules{*B*}{*B*} +{*T1*}Nouvelles fonctions{*ETB*} : domptez et montez un cheval, fabriquez des feux d'artifice et assurez le spectacle, nommez les animaux et monstres à l'aide d'une étiquette, créez des circuits de redstone plus complexes et accédez en tant qu'hôte à de nouvelles options pour mieux contrôler les actions de vos visiteurs !{*B*}{*B*} +{*T1*}Nouveau monde didacticiel{*ETB*} : découvrez comment utiliser les fonctions existantes et nouvelles dans le monde didacticiel. Arriverez-vous à trouver tous les disques vinyles qui s'y cachent ?{*B*}{*B*} +Chevaux + +{*T3*}COMMENT JOUER : CHEVAUX{*ETW*}{*B*}{*B*} +C'est surtout dans les plaines que l'on trouve des chevaux et des ânes. En croisant ces deux espèces, on obtient une mule, mais celle-ci ne peut pas avoir de descendance.{*B*} +Vous pouvez monter tous les chevaux, ânes et mules adultes. En revanche, seuls les chevaux peuvent porter une armure (appelée caparaçon), alors que les ânes et les mules peuvent être équipés de sacoches pour transporter des objets.{*B*}{*B*} +Avant de pouvoir utiliser un cheval, un âne ou une mule, il faut le dompter. Un cheval se dompte en essayant de monter dessus et de vous y maintenir pendant qu'il tente de vous désarçonner.{*B*} +Quand des cœurs apparaissent autour du cheval, c'est que vous l'avez dompté : il n'essaiera plus de vous désarçonner. Pour diriger un cheval, vous devez l'équiper d'une selle.{*B*}{*B*} +Vous pouvez trouver des selles auprès des villageois ou dans les coffres cachés dans l'environnement.{*B*} +Un âne ou une mule dompté peut être équipé d'une sacoche en lui associant un coffre. Vous pourrez ensuite accéder à cette sacoche en vous faufilant devant l'animal ou en le chevauchant.{*B*}{*B*} +Les chevaux et les ânes (mais pas les mules) s'élèvent comme les autres animaux, à l'aide de pommes dorées ou de carottes dorées.{*B*} +Les poulains deviennent adultes au fil du temps, mais vous pouvez accélérer le processus en leur donnant du blé ou du foin à manger.{*B*} + + +Balises + +{*T3*}COMMENT JOUER : BALISES{*ETW*}{*B*}{*B*} +Les balises actives projettent un intense rayon de lumière dans le ciel et octroient des pouvoirs aux joueurs avoisinants.{*B*} +Vous pouvez les fabriquer à l'aide de verre, d'obsidienne et d'étoiles du Nether, qui s'obtiennent en terrassant le Wither.{*B*}{*B*} +Une balise doit être placée au sommet d'une pyramide de fer, d'or, d'émeraude ou de diamant, et doit pouvoir recevoir la lumière du soleil le jour.{*B*} +Le matériau sur lequel la balise est placée n'a aucun effet sur son pouvoir.{*B*}{*B*} +Ouvrez le menu de la balise pour sélectionner son pouvoir principal. Plus votre pyramide a d'étages, plus il y a de pouvoirs disponibles.{*B*} +Une balise sur une pyramide d'au moins quatre étages dispose en outre d'un pouvoir secondaire (Régénération), ou d'un pouvoir principal plus puissant.{*B*}{*B*} +Pour définir les pouvoirs de votre balise, vous devez sacrifier un lingot d'émeraude, de diamant, d'or ou de fer dans l'emplacement de paiement.{*B*} +Cela fait, la balise restera active indéfiniment.{*B*} + + +Feux d'artifice + +{*T3*}COMMENT JOUER : FEUX D'ARTIFICE{*ETW*}{*B*}{*B*} +Les feux d'artifice sont des objets décoratifs pouvant être lancés à la main ou depuis un distributeur. Ils se fabriquent à l'aide de papier, de poudre à canon et (facultatif) de plusieurs étoiles à feux d'artifice.{*B*} +En ajoutant des ingrédients supplémentaires lors de la fabrication, vous pouvez personnaliser les étoiles à feux d'artifice : couleurs, disparition, forme, taille et effets (traînée, scintillement, etc.).{*B*}{*B*} +Pour fabriquer un feu d'artifice, placez de la poudre à canon et du papier dans la grille d'artisanat 3x3 qui s'affiche au-dessus de votre inventaire.{*B*} +Vous pouvez aussi placer plusieurs étoiles à feux d'artifice dans la grille d'artisanat pour les ajouter au feu d'artifice.{*B*} +Plus il y a de cases contenant de la poudre à canon dans la grille d'artisanat, plus les étoiles à feux d'artifice explosent haut.{*B*}{*B*} +Vous pouvez ensuite récupérer le feu d'artifice terminé dans la case de résultat.{*B*}{*B*} +Vous pouvez fabriquer une étoile à feux d'artifice en plaçant de la poudre à canon et un colorant dans la grille d'artisanat.{*B*} + - Ce colorant définit la couleur que prend l'étoile à feux d'artifice en explosant.{*B*} + - Pour définir la forme de l'étoile à feux d'artifice, ajoutez une boule de feu, une pépite d'or, une plume ou un crâne de monstre.{*B*} + - Pour ajouter une traînée ou un scintillement, utilisez des diamants ou de la poudre glowstone.{*B*}{*B*} +Après avoir fabriqué une étoile à feux d'artifice, vous pouvez définir sa couleur de disparition en lui ajoutant un colorant. + + +Entonnoirs + +{*T3*}COMMENT JOUER : ENTONNOIRS{*ETW*}{*B*}{*B*} +Les entonnoirs servent à insérer ou retirer des objets d'un conteneur et à ramasser automatiquement les objets qu'on y jette.{*B*} +Ils peuvent interagir avec les alambics, les coffres, les distributeurs, les droppers, les chariots de mine avec coffre, les chariots de mine avec entonnoir, et d'autres entonnoirs.{*B*}{*B*} +Un entonnoir cherche en permanence à aspirer les objets d'un conteneur compatible placé au-dessus. Il tente également d'insérer les objets stockés dans un conteneur de destination.{*B*} +Si un entonnoir est alimenté par un bloc de redstone, il devient inactif et arrête à la fois d'aspirer et d'insérer.{*B*}{*B*} +Un entonnoir est orienté dans la direction vers laquelle il essaie d'insérer des objets. Pour l'orienter vers un bloc précis, placez-le contre ce bloc tout en vous faufilant.{*B*} + + +Droppers + +{*T3*}COMMENT JOUER : DROPPERS{*ETW*}{*B*}{*B*} +Quand un dropper est alimenté par la redstone, il dépose au sol un unique objet aléatoire qu'il contient. Utilisez {*CONTROLLER_ACTION_USE*} pour ouvrir le dropper, après quoi vous pouvez y insérer des objets de votre inventaire.{*B*} +Si le dropper fait face à un coffre ou tout autre conteneur, l'objet sera transféré dedans. Il est possible de construire de longues chaînes de droppers pour transporter des objets en les allumant et éteignant à tour de rôle. + + 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. @@ -609,13 +664,39 @@ La couleur des lits est toujours la même. Tenue en main, la carte crée l'image d'une zone explorée. Peut servir à la détermination d'un trajet. +Si vous utilisez cet objet, il devient une carte de la zone géographique dans laquelle vous vous trouvez et se remplit au fur et à mesure de votre exploration. + Permet d'attaquer à distance à l'aide de flèches. Sert de munitions pour les arcs. +Produite par le Wither, sert à fabriquer des balises. + +Crée des explosions colorées après activation. La couleur, l'effet, la forme et la disparition dépendent de l'étoile à feux d'artifice utilisée pour créer le feu d'artifice. + +Détermine la couleur, l'effet et la forme d'un feu d'artifice. + +À utiliser dans un circuit de redstone pour entretenir, comparer ou réduire la force du signal, ou encore mesurer l'état de blocs précis. + +Type de chariot de mine qui se comporte comme un bloc de TNT mobile. + +Bloc qui émet un signal de redstone selon l'ensoleillement (ou le manque d'ensoleillement). + +Type de chariot de mine spécial qui se comporte comme un entonnoir. Il connecte les objets sur le rail et les conteneurs au-dessus. + +Type d'armure spécial pour chevaux. Confère une armure de 5. + +Type d'armure spécial pour chevaux. Confère une armure de 7. + +Type d'armure spécial pour chevaux. Confère une armure de 11. + +Sert à tenir les monstres en laisse ou à les attacher à un piquet de barrière. + +Sert à nommer les monstres dans le monde. + Restitue 2,5{*ICON_SHANK_01*}. -Restitue 1{*ICON_SHANK_01*}.. Peut s'utiliser jusqu'à 6 fois. +Restitue 1{*ICON_SHANK_01*}. Peut s'utiliser jusqu'à 6 fois. Restitue 1{*ICON_SHANK_01*}. @@ -938,100 +1019,158 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Les crânes peuvent servir de décoration ou être portés comme masques dans l'emplacement pour le casque. +Sert à exécuter un ordre. + +Projette un rayon de lumière dans le ciel et peut octroyer des altérations aux joueurs avoisinants. + +Permet d'entreposer des blocs et objets. Placez deux coffres côte à côte pour former un grand coffre à la capacité doublée. Le coffre piégé crée en outre une charge de redstone à l'ouverture. + +Fournit une charge de redstone. Plus il y a d'objets sur la plaque, plus la charge est puissante. + +Fournit une charge de redstone. Plus il y a d'objets sur la plaque, plus la charge est puissante. Nécessite plus de poids que la plaque légère. + +Source d'alimentation de redstone. Peut être retransformé en redstone. + +Sert à intercepter des objets ou à en transférer depuis un conteneur vers un autre. + +Type de rail permettant d'activer ou de désactiver les chariots de mine avec entonnoir, ou encore de déclencher les chariots de mine avec du TNT. + +Sert à entreposer et distribuer des objets, ou à les pousser vers un autre conteneur, lorsqu'on lui applique une charge de redstone. + +Des blocs colorés en argile durcie puis teinte. + +Nourriture pour chevaux, ânes et mules qui restitue jusqu'à 10 cœurs. Accélère la croissance des poulains. + +Obtenue en fondant de l'argile dans un four. + +Mélange de verre et d'un colorant. + +Panneau de verre coloré. + +Un moyen peu encombrant d'entreposer du charbon. Peut servir de combustible dans un four. + 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. - + +Chauve-souris + +Ces créatures volantes habitent les cavernes et autres grands espaces fermés. + +Sorcière + +Ces ennemis des marécages vous attaquent en lançant des potions, et en abandonnent aussi à leur mort. + +Cheval + +Vous pouvez monter ces animaux, à condition de les dompter d'abord. + +Âne + +Vous pouvez monter ces animaux, à condition de les dompter d'abord. Il est possible de leur associer un coffre. + +Mule + +Croisement entre un cheval et un âne. Vous pouvez monter ces animaux, à condition de les dompter d'abord. Ils peuvent aussi porter des sacoches. + +Cheval zombie + +Cheval squelette + +Wither + +Il vous faut des crânes de Wither et du sable des âmes pour créer ce monstre, qui vous attaque en tirant des crânes explosifs. + Explosives Animator Concept Artist @@ -1378,6 +1517,8 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Carte +Carte vide + Disque vinyle "13" Disque vinyle "cat" @@ -1480,6 +1621,28 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Crâne de creeper +Étoile du Nether + +Fusée d'artifice + +Étoile à feux d'artifice + +Comparateur de redstone + +Chariot de mine avec TNT + +Chariot de mine avec entonnoir + +Caparaçon en fer + +Caparaçon en or + +Caparaçon en diamant + +Plomb + +Étiquette + Pierre Bloc d'herbe @@ -1496,6 +1659,8 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Planches de bois tropical +Planches de bois (tout type) + Pousse d'arbre Pousse de chêne @@ -1832,6 +1997,190 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Crâne +Bloc de commande + +Balise + +Coffre piégé + +Plaque de détection lestée (légère) + +Plaque de détection lestée (lourde) + +Comparateur de redstone + +Capteur de lumière + +Bloc de redstone + +Entonnoir + +Rail activateur + +Dropper + +Argile colorée + +Botte de foin + +Argile durcie + +Bloc de charbon + +Argile noire + +Argile rouge + +Argile verte + +Argile marron + +Argile bleue + +Argile violette + +Argile cyan + +Argile gris clair + +Argile grise + +Argile rose + +Argile vert clair + +Argile jaune + +Argile bleu ciel + +Argile magenta + +Argile orange + +Argile blanche + +Verre coloré + +Verre gris + +Verre rouge + +Verre vert + +Verre marron + +Verre bleu + +Verre violet + +Verre cyan + +Verre gris clair + +Verre gris + +Verre rose + +Verre vert clair + +Verre jaune + +Verre bleu ciel + +Verre magenta + +Verre orange + +Verre blanc + +Vitrail + +Vitrail gris + +Vitrail rouge + +Vitrail vert + +Vitrail marron + +Vitrail bleu + +Vitrail violet + +Vitrail cyan + +Vitrail gris clair + +Vitrail gris + +Vitrail rose + +Vitrail vert clair + +Vitrail jaune + +Vitrail bleu ciel + +Vitrail magenta + +Vitrail orange + +Vitrail blanc + +Petite boule + +Grande boule + +Étoile + +Creeper + +Explosion + +Forme inconnue + +Noir + +Rouge + +Vert + +Marron + +Bleu + +Violet + +Cyan + +Gris clair + +Gris + +Rose + +Vert clair + +Jaune + +Bleu ciel + +Magenta + +Orange + +Blanc + +Perso. + +Dégradé + +Scintillement + +Traînée + +Durée du vol : +  Commandes actuelles Config. @@ -2009,8 +2358,7 @@ La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant l 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. @@ -2031,7 +2379,7 @@ La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant l - Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_RT*}. + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2065,7 +2413,7 @@ La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant l - Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_RT*}. + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2612,6 +2960,211 @@ En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTI 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. + + Voici l'interface d'inventaire du cheval. + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire du cheval. + + + + L'inventaire du cheval vous permet de transférer des objets ou d'en équiper votre cheval, âne ou mule. + + + + Sellez votre cheval en plaçant une selle dans l'emplacement à cet effet. Vous pouvez aussi l'équiper d'une armure en plaçant un caparaçon dans l'emplacement d'armure. + + + + Ce menu permet aussi de transférer des objets de votre inventaire vers les sacoches de votre âne ou mule, et vice versa. + + +Vous avez trouvé un cheval. + +Vous avez trouvé un âne. + +Vous avez trouvé une mule. + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les chevaux, ânes et mules. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + + C'est surtout dans les plaines et la savane que l'on trouve des chevaux et des ânes. En croisant ces deux espèces, on obtient une mule, mais celle-ci ne peut pas avoir de descendance. + + + + Vous pouvez monter tous les chevaux, ânes et mules adultes. En revanche, seuls les chevaux peuvent porter une armure (appelée caparaçon), alors que les ânes et les mules peuvent être équipés de sacoches pour transporter des objets. + + + + Avant de pouvoir utiliser un cheval, un âne ou une mule, il faut le dompter. Un cheval se dompte en essayant de monter dessus et de vous y maintenir pendant qu'il tente de vous désarçonner. + + + + Quand des cœurs apparaissent autour du cheval, c'est que vous l'avez dompté : il n'essaiera plus de vous désarçonner. + + + + Essayez de monter ce cheval. Utilisez {*CONTROLLER_ACTION_USE*} sans objet ni outil en main pour le chevaucher. + + + + Pour diriger un cheval, vous devez l'équiper d'une selle que vous trouverez auprès des villageois, en pêchant, ou dans les coffres cachés à travers l'environnement. + + + + Un âne ou une mule dompté peut être équipé d'une sacoche en lui associant un coffre. Vous pourrez ensuite accéder à cette sacoche en vous faufilant devant l'animal ou en le chevauchant. + + + + Les chevaux et les ânes (mais pas les mules) s'élèvent comme les autres animaux, à l'aide de pommes dorées ou de carottes dorées. Les poulains deviennent adultes au fil du temps, mais vous pouvez accélérer le processus en leur donnant du blé ou du foin à manger. + + + + Vous pouvez essayer de dompter les chevaux et les ânes ici. Les coffres des environs contiennent également des selles, caparaçons et autres objets utiles pour chevaux. + + + + Vous êtes dans l'interface de la balise, qui vous permet de choisir les pouvoirs qu'octroiera votre balise. + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser cet inventaire. + + + + Le menu de la balise vous permet de sélectionner son pouvoir principal. Plus votre pyramide a d'étages, plus il y a de pouvoirs disponibles. + + + + Une balise sur une pyramide d'au moins quatre étages dispose d'un pouvoir secondaire (Régénération), ou d'un pouvoir principal plus puissant. + + + + Pour définir les pouvoirs de votre balise, vous devez sacrifier un lingot d'émeraude, de diamant, d'or ou de fer dans l'emplacement de paiement. Cela fait, la balise restera active indéfiniment. + + +Cette pyramide est surmontée d'une balise inactive. + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les balises. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + + Les balises actives projettent un intense rayon de lumière dans le ciel et octroient des pouvoirs aux joueurs avoisinants. Vous pouvez les fabriquer à l'aide de verre, d'obsidienne et d'étoiles du Nether, qui s'obtiennent en terrassant le Wither. + + + + Une balise doit être placée au sommet d'une pyramide de fer, d'or, d'émeraude ou de diamant, et doit pouvoir recevoir la lumière du soleil le jour. Le matériau sur lequel la balise est placée n'a aucun effet sur son pouvoir. + + + + Essayez d'utiliser la balise pour définir ses pouvoirs. Vous pouvez utiliser en guise de paiement les lingots de fer fournis. + + +Cette pièce contient des entonnoirs. + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les entonnoirs. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + + Les entonnoirs servent à insérer ou retirer des objets d'un conteneur et à ramasser automatiquement les objets qu'on y jette. + + + + Ils peuvent interagir avec les alambics, les coffres, les distributeurs, les droppers, les chariots de mine avec coffre, les chariots de mine avec entonnoir, et d'autres entonnoirs. + + + + Un entonnoir cherche en permanence à aspirer un objet d'un conteneur compatible placé au-dessus. Il tente également d'insérer les objets stockés dans un conteneur de destination. + + + + Si un entonnoir est alimenté par un bloc de redstone, il devient inactif et arrête à la fois d'aspirer et d'insérer. + + + + Un entonnoir est orienté dans la direction vers laquelle il essaie d'insérer des objets. Pour l'orienter vers un bloc précis, placez-le contre ce bloc tout en vous faufilant. + + + + Cette salle contient diverses configurations d'entonnoirs qui méritent d'être étudiées et testées. + + + + Vous êtes dans l'interface des feux d'artifice, qui vous permet de fabriquer des feux d'artifice et des étoile à feux d'artifice. + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser cet inventaire. + + + + Pour fabriquer un feu d'artifice, placez de la poudre à canon et du papier dans la grille d'artisanat 3x3 qui apparaît au-dessus de votre inventaire. + + + + Facultatif : vous pouvez placer plusieurs étoiles à feux d'artifice dans la grille d'artisanat pour les ajouter au feu d'artifice. + + + + Plus il y a de cases contenant de la poudre à canon dans la grille d'artisanat, plus les étoiles à feux d'artifice explosent haut. + + + + Vous pouvez ensuite récupérer le feu d'artifice terminé dans la case de résultat. + + + + Vous pouvez fabriquer une étoile à feux d'artifice en plaçant de la poudre à canon et un colorant dans la grille d'artisanat. + + + + Ce colorant définit la couleur que prend l'étoile à feux d'artifice en explosant. + + + + Pour définir la forme de l'étoile à feux d'artifice, ajoutez une boule de feu, une pépite d'or, une plume ou un crâne. + + + + Pour ajouter une traînée ou un scintillement, utilisez des diamants ou de la poudre glowstone. + + + + Après avoir fabriqué une étoile à feux d'artifice, vous pouvez définir sa couleur de disparition en lui ajoutant un colorant. + + + + Les coffres des environs contiennent divers objets servant à créer des FEUX D'ARTIFICE ! + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les feux d'artifice. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + + Les feux d'artifice sont des objets décoratifs pouvant être lancés à la main ou depuis un distributeur. Ils se fabriquent à l'aide de papier, de poudre à canon et (facultatif) de plusieurs étoiles à feux d'artifice. + + + + En ajoutant des ingrédients supplémentaires lors de la fabrication, vous pouvez personnaliser les étoiles à feux d'artifice : couleurs, disparition, forme, taille et effets (traînée, scintillement, etc.). + + + + Essayez de fabriquer un feu d'artifice à l'atelier en combinant les ingrédients que contiennent les coffres. + +  Sélectionner Utiliser @@ -2834,6 +3387,22 @@ En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTI Charger la sauvegarde pour Xbox One +Monter + +Descendre + +Associer un coffre + +Lancer + +Tenir en laisse + +Lâcher + +Fixer + +Nom + O.K. Annuler @@ -3144,6 +3713,20 @@ Voulez-vous déverrouiller le jeu complet ? Distributeur +Cheval + +Dropper + +Entonnoir + +Balise + +Pouvoir principal + +Pouvoir secondaire + +Chariot de mine + Aucun contenu téléchargeable de ce type n'est actuellement disponible pour ce jeu. %s a rejoint la partie. @@ -3303,10 +3886,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Mode de jeu : Créatif +Mode de jeu : Aventure + Survie Créatif +Aventure + Créé en mode Survie Créé en mode Créatif @@ -3327,6 +3914,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Superplat +Saisissez une valeur initiale pour générer à nouveau le même terrain. Champ vide = monde aléatoire. + Une fois activé, le jeu sera un jeu en ligne. Une fois activé, seuls les joueurs invités peuvent participer. @@ -3343,7 +3932,7 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? 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. +Activé, le Nether se régénérera. Utile si vous avez une ancienne sauvegarde sans forteresse du Nether. Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde. @@ -3351,6 +3940,20 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur. +Si vous désactivez cette option, les monstres et animaux ne peuvent ni modifier des blocs (par exemple, les explosions des creepers ne détruisent pas les blocs et les moutons ne retirent pas d'herbe), ni ramasser des objets. + +Si vous activez cette option, les joueurs conservent leur inventaire après leur mort. + +Si vous désactivez cette option, les monstres n'apparaissent pas automatiquement. + +Si vous désactivez cette option, les monstres et animaux ne laissent pas d'objets (par exemple, les creepers ne laissent pas de poudre à canon). + +Si vous désactivez cette option, les blocs ne laissent pas d'objets après être détruits (par exemple, les blocs de pierre ne laissent pas de pierre taillée). + +Si vous désactivez cette option, les joueurs ne regagnent pas leur santé automatiquement. + +Si vous désactivez cette option, le moment de la journée ne change pas. + Packs de skins Thèmes @@ -3399,7 +4002,49 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? {*PLAYER*} s'est fait rouer de coups par {*SOURCE*} -{*PLAYER*} s'est fait tuer par {*SOURCE*} +{*SOURCE*} a tué {*PLAYER*} par magie + +{*PLAYER*} a chuté d'une échelle + +{*PLAYER*} a chuté d'une liane + +{*PLAYER*} a chuté hors de l'eau + +{*PLAYER*} a chuté d'un endroit élevé + +{*PLAYER*} s'est fait pousser par {*SOURCE*} + +{*PLAYER*} s'est fait pousser par {*SOURCE*} + +{*PLAYER*} s'est fait pousser par {*SOURCE*} avec {*ITEM*} + +Après une lourde chute, {*SOURCE*} a achevé {*PLAYER*} + +Après une lourde chute, {*SOURCE*} a achevé {*PLAYER*} avec {*ITEM*} + +{*PLAYER*} a marché dans le feu tout en combattant {*SOURCE*} + +{*PLAYER*} s'est fait carboniser tout en combattant {*SOURCE*} + +{*PLAYER*} a piqué une tête dans la lave pour échapper à {*SOURCE*} + +{*PLAYER*} a péri par noyade en tentant d'échapper à {*SOURCE*} + +{*PLAYER*} a percuté un cactus en tentant d'échapper à {*SOURCE*} + +{*PLAYER*} s'est fait exploser par {*SOURCE*} + +{*PLAYER*} s'est fait Witherifier + +{*PLAYER*} s'est fait occire par {*SOURCE*} avec {*ITEM*} + +{*PLAYER*} s'est fait tirer dessus par {*SOURCE*} avec {*ITEM*} + +{*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} avec {*ITEM*} + +{*PLAYER*} s'est fait rouer de coups par {*SOURCE*} avec {*ITEM*} + +{*PLAYER*} s'est fait tuer par {*SOURCE*} avec {*ITEM*} Brouillard d'adminium @@ -3413,7 +4058,7 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Personnage animé -Animations personnalisée pour skin +Anim. pers. pour skin Vous ne pouvez plus miner ou utiliser d'objet @@ -3566,9 +4211,9 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? 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. +Pas de tonte de champimeuh pour le moment. Le nombre max de cochons, moutons, vaches chats et chevaux 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 cochons, moutons, vaches, chats et chevaux. Impossible d'utiliser l'œuf d'apparition pour le moment. Vous avez atteint le nombre maximum de champimeuh. @@ -3578,6 +4223,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Impossible d'utiliser l'œuf d'apparition pour le moment. Vous avez atteint le nombre maximum de pieuvres dans un monde. +Impossible d'utiliser l'œuf d'apparition pour le moment. Vous avez atteint le nombre maximum de chauves-souris 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. @@ -3586,12 +4233,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? 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 cochons, moutons, vaches, chats et chevaux 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. Le nombre maximum de chevaux 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. @@ -3619,27 +4268,43 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ?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 - + +Options du joueur + +Ingérence des monstres + +Conservation d'inventaire + +Apparition des monstres + +Butin des monstres + +Butin des blocs + +Régénération auto + +Cycle jour/nuit + Peut construire et miner Utilisation de portes et leviers possible @@ -3648,7 +4313,7 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Peut attaquer les joueurs -Attaque d'animaux possible +Peut attaquer les animaux Modérateur @@ -3826,6 +4491,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Poison +Wither + +Boost de santé + +Absorption + +Saturation + de rapidité de lenteur @@ -3864,6 +4537,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? de poison +de flétrissure + +de boost de santé + +d'absorption + +de saturation + II @@ -3960,6 +4641,22 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Réduit progressivement la santé des joueurs, animaux et monstres affectés. +À l'application : + +Force de saut du cheval + +Renforts zombies + +Santé max + +Portée d'aggro + +Résistance au recul + +Vitesse + +Dégâts d'attaque + Tranchant Châtiment @@ -4050,7 +4747,7 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? 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 1{*ICON_SHANK_01*} mais peut vous rendre malade. Restitue 3{*ICON_SHANK_01*}. Se fabrique avec une carotte et des pépites d'or. diff --git a/Minecraft.Client/Common/Media/it-IT/strings.resx b/Minecraft.Client/Common/Media/it-IT/strings.resx index 8082dfdc..6eb30dc3 100644 --- a/Minecraft.Client/Common/Media/it-IT/strings.resx +++ b/Minecraft.Client/Common/Media/it-IT/strings.resx @@ -300,6 +300,27 @@ Quando carichi o crei un mondo, se premi il pulsante "Altre opzioni" accederai a {*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*} + {*T2*}Ciclo giorno/notte{*ETW*}{*B*} + Se disattivato, l'ora del giorno non cambia.{*B*}{*B*} + + {*T2*}Mantieni inventario{*ETW*}{*B*} + Se attivato, i giocatori mantengono l'inventario quando muoiono.{*B*}{*B*} + + {*T2*}Generazione mostri{*ETW*}{*B*} + Se disattivata, i mostri non vengono generati naturalmente.{*B*}{*B*} + + {*T2*}Immutabilità{*ETW*}{*B*} + Se disattivata, impedisce a mostri e animali di modificare i blocchi (per esempio, le esplosioni dei creeper non distruggono i blocchi e le pecore non brucano l'erba) o raccogliere oggetti.{*B*}{*B*} + + {*T2*}Bottino mostri{*ETW*}{*B*} + Se disattivato, mostri e animali non rilasciano bottino (per esempio, i creeper non rilasciano polvere da sparo).{*B*}{*B*} + + {*T2*}Rilascio blocchi{*ETW*}{*B*} + Se disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (per esempio, i blocchi di pietra non rilasciano ciottoli).{*B*}{*B*} + + {*T2*}Rigenerazione naturale{*ETW*}{*B*} + Se disattivata, la salute dei giocatori non si rigenera naturalmente.{*B*}{*B*} + {*T1*}Opzioni di generazione del mondo{*ETW*}{*B*} Quando crei un nuovo mondo, sono disponibili alcune opzioni aggiuntive.{*B*}{*B*} @@ -316,7 +337,7 @@ Quando crei un nuovo mondo, sono disponibili alcune opzioni aggiuntive.{*B*}{*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*} + Durante la partita, premi{*BACK_BUTTON*}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*} @@ -325,42 +346,44 @@ Quando crei un nuovo mondo, sono disponibili alcune opzioni aggiuntive.{*B*}{*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*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Quando l'opzione è attiva, il giocatore può interagire normalmente con il mondo di gioco. Se, invece, l'opzione è disattivata, il giocatore non può posizionare né distruggere blocchi e non potrà interagire con oggetti e blocchi di vario tipo.{*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*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di usare né le porte né gli interruttori.{*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*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di aprire i contenitori, come le casse.{*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*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, impedisce al giocatore di causare danni agli altri utenti.{*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*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di infliggere danni agli animali.{*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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*} +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. + Permette al giocatore di spostare se stesso o gli altri utenti, raggiungendo altri giocatori presenti nel mondo. +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. Il giocatore non potrà accedere nuovamente finché il gioco non sarà stato riavviato. + Pagina successiva Pagina precedente @@ -424,63 +447,95 @@ così saranno in grado di raggiungerti facilmente. 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*} +{*T3*}Modifiche e aggiunte{*ETW*}{*B*}{*B*} +- Aggiunti nuovi oggetti: argilla indurita, argilla colorata, blocco di carbone, balla di fieno, binario attivatore, blocco di pietra rossa, sensore luce diurna, sgancio, vagoncino, carrello con vagoncino, carrello con TNT, comparatore pietra rossa, piastra a pressione con peso, segnale, cassa intrappolata, razzo d'artificio, stella Fuoco d'artificio, stella del Sottomondo, piombo, corazza per cavalli, targhetta nome, uovo generazione cavallo{*B*} +- Aggiunti nuovi mostri: Avvizzito, scheletri avvizziti, streghe, pipistrelli, cavalli, asini e muli{*B*} +- Aggiunte nuove funzionalità di generazione del terreno: capanna della strega.{*B*} +- Aggiunta interfaccia del segnale.{*B*} +- Aggiunta interfaccia del cavallo.{*B*} +- Aggiunta interfaccia del vagoncino.{*B*} +- Aggiunti i fuochi d'artificio, la cui interfaccia è accessibile dal tavolo da lavoro quando si dispone degli ingredienti per la produzione di una stella Fuoco d'artificio o di un razzo d'artificio.{*B*} +- Aggiunta la modalità Avventura: puoi distruggere i blocchi solo se disponi degli attrezzi adatti.{*B*} +- Aggiunti numerosi nuovi suoni.{*B*} +- Ora mostri, oggetti e proiettili possono attraversare i portali.{*B*} +- Ora i ripetitori possono essere bloccati attivandone i lati con un altro ripetitore.{*B*} +- Zombie e scheletri ora possono essere generati con diverse armi e armature.{*B*} +- Nuovi messaggi in caso di morte del giocatore.{*B*} +- Possibilità di dare un nome ai mostri con una targhetta e di rinominare i contenitori al fine di modificarne il titolo quando viene visualizzato il relativo menu.{*B*} +- La farina d'ossa non fa più crescere qualsiasi oggetto istantaneamente alla dimensione massima, invece lo fa crescere casualmente di vari livelli.{*B*} +- Collocando un comparatore di pietra rossa accanto a casse, banchi di distillazione, distributori e jukebox, è possibile rilevare un segnale pietra rossa che ne illustra il contenuto.{*B*} +- I distributori possono essere rivolti in qualsiasi direzione.{*B*} +- Mangiando una mela d'oro, il giocatore ottiene un "assorbimento" extra di salute temporaneo.{*B*} +- Maggiore è il tempo trascorso in un'area, più i mostri generati in quel luogo saranno potenti.{*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*} +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*} - Argilla indurita, argilla colorata, blocco di carbone, balla di fieno, binario attivatore, blocco di pietra rossa, sensore luce diurna, sgancio, vagoncino, carrello con vagoncino, carrello con TNT, comparatore pietra rossa, piastra a pressione con peso, segnale, cassa intrappolata, razzo d'artificio, stella Fuoco d'artificio, stella del Sottomondo, piombo, corazza per cavalli, targhetta nome, uovo generazione cavallo{*B*}{*B*} +{*T1*}Nuovi mostri{*ETB*} - Avvizzito, scheletri avvizziti, streghe, pipistrelli, cavalli, asini e muli{*B*}{*B*} +{*T1*}Nuove funzionalità{*ETB*} - Doma e cavalca i cavalli, produci e usa i fuochi d'artificio, usa le targhette per dare un nome ad animali e mostri, crea circuiti a pietra rossa più avanzati e usa le nuove opzioni host per controllare le azioni disponibili per i visitatori del tuo mondo!{*B*}{*B*} +{*T1*}Nuovo mondo tutorial{*ETB*} – Scopri funzionalità nuove e familiari nel mondo tutorial. Cerca di trovare tutti i dischi nascosti!{*B*}{*B*} +Cavalli + +{*T3*}COME GIOCARE: CAVALLI{*ETW*}{*B*}{*B*} +Cavalli e asini si trovano principalmente nelle pianure. Se un asino si accoppia con una cavalla, nasce un mulo, il quale però è sterile.{*B*} +Puoi cavalcare tutti i cavalli, asini e muli adulti, ma solo i cavalli possono essere dotati di armatura, così come le borse da sella per il trasporto di oggetti sono riservate ad asini e muli.{*B*}{*B*} +Prima di poter cavalcare un cavallo, un asino o un mulo, dovrai domarlo tentando di cavalcarlo e rimanendo in groppa mentre cerca di disarcionarti.{*B*} +Quando compaiono dei cuoricini intorno all'animale, significa che è domato e potrai cavalcarlo. Per controllare un cavallo, devi dotarlo di una sella.{*B*}{*B*} +Puoi acquistare le selle dagli abitanti dei villaggi oppure trovarle nelle casse nascoste un po' ovunque.{*B*} +Puoi mettere una borsa da sella su un asino o un mulo domato assicurandovi una cassa. Potrai accedere alle borse da sella mentre cavalchi o sei in modalità furtiva.{*B*}{*B*} +Puoi allevare cavalli e asini (ma non muli) come gli altri animali, usando mele d'oro o carote d'oro.{*B*} +Col passare del tempo, i puledri diventeranno adulti, comunque puoi velocizzare l'operazione nutrendoli con fieno o grano.{*B*} + + +Segnali + +{*T3*}COME GIOCARE: SEGNALI{*ETW*}{*B*}{*B*} +I segnali attivi proiettano un raggio di luce nel cielo, conferendo poteri speciali ai giocatori nelle vicinanze.{*B*} +Per produrli servono vetro, ossidiana e stelle del Sottomondo, le quali si ottengono sconfiggendo l'Avvizzito.{*B*}{*B*} +I segnali devono essere collocati in modo tale che siano colpiti dalla luce del sole durante il giorno; inoltre vanno posti su piramidi di ferro, oro, smeraldo o diamante.{*B*} +Il materiale su cui è collocato il segnale non influisce sul suo potere.{*B*}{*B*} +Nel menu dei segnali puoi selezionare un potere principale per il tuo segnale: più livelli possiede la piramide, maggiore sarà il numero di poteri tra cui scegliere.{*B*} +Un segnale su una piramide con almeno quattro livelli offre inoltre il potere secondario Rigenerazione o un potere principale rafforzato.{*B*}{*B*} +Per impostare i poteri del tuo segnale, devi sacrificare un lingotto di smeraldo, diamante, oro o ferro nello slot di pagamento.{*B*} +Una volta impostati, i poteri saranno emanati dal segnale senza scadenze o limiti.{*B*} + + +Fuochi d'artificio + +{*T3*}COME GIOCARE: FUOCHI D'ARTIFICIO{*ETW*}{*B*}{*B*} +I fuochi d'artificio sono oggetti decorativi che possono essere lanciati manualmente o dai distributori. Si producono usando carta, povere da sparo e alcune stelle Fuoco d'artificio (facoltative).{*B*} +Colori, dissolvenza, forma, dimensione ed effetti (come scia o scintillii) delle stelle Fuoco d'artificio possono essere personalizzati includendo ingredienti aggiuntivi durante la produzione.{*B*}{*B*} +Per produrre un fuoco d'artificio, inserisci polvere da sparo e carta nella griglia di produzione 3x3 al di sopra dell'inventario.{*B*} +Se lo desideri, puoi inserire alcune stelle Fuoco d'artificio nella griglia di produzione, per aggiungerle al fuoco d'artificio.{*B*} +Più caselle occupi con la polvere da sparo, maggiore sarà l'altezza a cui esploderanno le stelle Fuoco d'artificio.{*B*}{*B*} +Quando vuoi produrre il fuoco d'artificio, prendilo dalla casella di produzione.{*B*}{*B*} +Per produrre le stelle Fuoco d'artificio, inserisci polvere da sparo e tintura nella griglia di produzione.{*B*} + - La tintura stabilisce il colore dell'esplosione della stella Fuoco d'artificio.{*B*} + - Per decidere la forma della stella Fuoco d'artificio, aggiungi una scarica di fuoco, una pepita d'oro, una piuma o una testa di mostro.{*B*} + - Puoi aggiungere una scia usando diamanti e polvere di pietra brillante.{*B*}{*B*} +Una volta creata una stella Fuoco d'artificio, puoi stabilirne il colore di dissolvenza usando la tintura. + + +Vagoncini + +{*T3*}COME GIOCARE: VAGONCINI{*ETW*}{*B*}{*B*} +I vagoncini si usano per inserire o rimuovere oggetti dai contenitori e per raccogliere automaticamente gli oggetti che vi vengono riposti.{*B*} +Possono influire su Banchi di distillazione, casse, distributori, sganci, carrelli con casse, carrelli con vagoncini e altri vagoncini.{*B*}{*B*} +I vagoncini tentano continuamente di estrarre oggetti da un contenitore adatto posizionato sopra di essi. Inoltre, cercheranno di inserire gli oggetti in essi riposti in un contenitore di scarico.{*B*} +Se un vagoncino funziona grazie a una pietra rossa, si disattiverà e smetterà di prelevare e consegnare oggetti.{*B*}{*B*} +Il vagoncino punta nella direzione in cui cerca di scaricare gli oggetti. Per rivolgere un vagoncino verso un blocco particolare, posizionalo a ridosso di tale blocco mentre ti muovi furtivamente.{*B*} + + +Sganci + +{*T3*}COME GIOCARE: SGANCI{*ETW*}{*B*}{*B*} +Se attivati da una pietra rossa, gli sganci rilasciano un oggetto casuale sul terreno. Usa {*CONTROLLER_ACTION_USE*} per aprire lo sgancio e inserisci gli oggetti del tuo inventario.{*B*} +Se lo sgancio è rivolto verso un forziere o un altro tipo di contenitore, l'oggetto verrà riposto lì. Puoi creare lunghe serie di sganci per trasportare gli oggetti, ma affinché funzionino devono essere alternativamente attivati e disattivati. + + 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. @@ -553,7 +608,7 @@ torta di zucca, pozione della visione notturna, pozione dell'invisibilità, quar 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. +Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. La torcia si usa per fare luce, nonché per sciogliere neve e ghiaccio. @@ -606,10 +661,36 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Mentre la tieni in mano, crea un'immagine di un'area esplorata. Può essere utile per orientarti. +Quando viene utilizzata, diventa una mappa della parte del mondo in cui ti trovi e si compila man mano che procedi nell'esplorazione. + Consente attacchi a distanza con le frecce. Si usa come munizione per l'arco. +Rilasciato dall'Avvizzito, si usa per produrre segnali. + +Quando si attiva, crea esplosioni colorate. Colore, effetto, forma e dissolvenza sono determinati dalla stella Fuoco d'artificio utilizzata al momento della sua produzione. + +Si usa per determinare colore, effetto e forma di un fuoco d'artificio. + +Si usa nei circuiti con pietre rosse per mantenere, confrontare o sottrarre forza al segnale o per misurare le condizioni di determinati blocchi. + +È un tipo di carrello che funge da blocco di TNT mobile. + +È un blocco che emette un segnale pietra rossa in base alla luce del sole (o alla sua assenza). + +È uno speciale tipo di carrello che funziona in modo simile al vagoncino. Raccoglie gli oggetti sui binari e dai contenitori sopra di esso. + +Speciale tipo di corazza che si può far indossare a un cavallo. Garantisce 5 punti armatura. + +Speciale tipo di corazza che si può far indossare a un cavallo. Garantisce 7 punti armatura. + +Speciale tipo di corazza che si può far indossare a un cavallo. Garantisce 11 punti armatura. + +Serve per allacciare il nemico al giocatore o alle recinzioni. + +Serve per dare un nome ai nemici nel mondo. + Reintegra 2,5{*ICON_SHANK_01*}. Reintegra 1{*ICON_SHANK_01*}. Utilizzabile 6 volte. @@ -628,7 +709,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. 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 1,5{*ICON_SHANK_01*}, o può essere cucinato in una fornace. Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando una costoletta di maiale in una fornace. @@ -661,7 +742,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. 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. +Funziona come la piastra a pressione (invia un segnale pietra rossa mentre è in funzione) ma è attivabile solo dal carrello da miniera. Trasporta te, un animale o un mostro sui binari. @@ -934,100 +1015,158 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Le teste di Mob si possono collocare come decorazioni o indossare come maschere nello slot per l'elmo. +Serve per eseguire ordini. + +Proietta un raggio di luce nel cielo e conferisce effetti positivi ai giocatori vicini. + +Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. La cassa intrappolata crea inoltre una carica di pietra rossa quando viene aperta. + +Fornisce una carica di pietra rossa. La carica è più potente se ci sono più oggetti sulla piastra. + +Fornisce una carica di pietra rossa. La carica è più potente se ci sono più oggetti sulla piastra. Richiede un peso maggiore rispetto alla piastra leggera. + +Si usa come fonte energetica per la pietra rossa. Riconvertibile in pietra rossa. + +Si usa per prelevare oggetti o per trasferirli dentro e fuori vari contenitori. + +Un tipo di binario che attiva o disattiva i carrelli con vagoncini e attiva i carrelli con TNT. + +Serve per custodire e depositare oggetti o per spingerli in un altro contenitore quando viene fornita una carica di pietra rossa. + +Blocchi colorati prodotti tingendo l'argilla indurita. + +Si può usare per nutrire cavalli, asini o muli e reintegrare fino a 10 cuori. Accelera la crescita dei puledri. + +Si crea fondendo argilla nella fornace. + +Si produce usando vetro e tintura. + +Si produce con il vetro colorato. + +Per conservare il carbone in poco spazio. Utilizzabile per il funzionamento della fornace. + 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. - + +Pipistrello + +Queste creature volanti si trovano nelle caverne o in altri grandi spazi chiusi. + +Strega + +Si trovano nelle paludi e attaccano lanciando pozioni. Quando vengono uccise, rilasciano pozioni. + +Cavallo + +Questi animali possono essere domati e quindi cavalcati. + +Asino + +Questi animali possono essere domati e quindi cavalcati. Possono trasportare una cassa. + +Mulo + +Nasce dall'incrocio tra un cavallo e un asino. Questi animali possono essere domati e quindi cavalcati; inoltre possono trasportare casse. + +Cavallo zombie + +Cavallo scheletro + +Avvizzito + +Si producono usando teschi di Avvizzito e sabbie mobili. Scagliano teschi esplosivi contro di te. + Explosives Animator Concept Artist @@ -1374,6 +1513,8 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Mappa +Mappa vuota + Disco - "13" Disco - "gatto" @@ -1452,9 +1593,9 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Scarica di fuoco -Scarica di fuoco (carbone vegetale) +Scarica fuoco (carbone veg.) -Scarica di fuoco (carbone) +Scarica fuoco (carbone) Espositore @@ -1476,6 +1617,28 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Testa di Creeper +Stella del Sottomondo + +Razzo d'artificio + +Stella Fuoco d'artificio + +Comparatore pietra rossa + +Carrello con TNT + +Carrello con vagoncino + +Corazza di ferro per cavallo + +Corazza d'oro per cavallo + +Corazza di diamante per cavallo + +Piombo + +Targhetta nome + Pietra Blocco d'erba @@ -1492,6 +1655,8 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Assi di legno della giungla +Assi di legno (qualsiasi tipo) + Arbusto Arbusto di quercia @@ -1604,7 +1769,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Lastra di arenaria -Lastra di legno +Lastra di legno di quercia Lastra acciottolata @@ -1612,15 +1777,15 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Lastra di mattoni di pietra -Lastra di legna di quercia +Lastra di legno di quercia Lastra di arbusto Lastra di legno di betulla -Lastra di legno della giungla +Lastra di legno tropicale -Lastra di mattoni del Sottomondo +Lastra matt. Sottomondo Mattoni @@ -1750,7 +1915,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Mattoni di pietra -Mattoni di pietra coperti di muschio +Mattoni di pietra muschiati Mattoni di pietra lesionati @@ -1790,9 +1955,9 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Mattone del Sottomondo -Recinzione di mattoni del Sottomondo +Recinzione matt. Sottomondo -Scale di mattoni del Sottomondo +Scale matt. Sottomondo Verruca del Sottomondo @@ -1820,7 +1985,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Scale di legno di betulla -Scala di legno della giungla +Scala di legno tropicale Torcia di pietra rossa @@ -1828,6 +1993,190 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Teschio +Blocco di comando + +Segnale + +Cassa intrappolata + +Piastra a press. pesata (leggera) + +Piastra a press. pesata (pesante) + +Comparatore pietra rossa + +Sensore luce diurna + +Blocco di pietra rossa + +Vagoncino + +Binario attivatore + +Sgancio + +Argilla colorata + +Balla di fieno + +Argilla indurita + +Blocco di carbone + +Argilla colorata nera + +Argilla colorata rossa + +Argilla colorata verde + +Argilla colorata marrone + +Argilla colorata blu + +Argilla colorata viola + +Argilla colorata turchese + +Arg. col. grigio chiaro + +Argilla colorata grigia + +Argilla colorata rosa + +Arg. col. verde acido + +Argilla colorata gialla + +Argilla colorata azzurra + +Argilla colorata magenta + +Argilla colorata arancione + +Argilla colorata bianca + +Vetro colorato + +Vetro colorato nero + +Vetro colorato rosso + +Vetro colorato verde + +Vetro colorato marrone + +Vetro colorato blu + +Vetro colorato viola + +Vetro colorato turchese + +Vetro colorato grigio chiaro + +Vetro colorato grigio + +Vetro colorato rosa + +Vetro colorato verde lime + +Vetro colorato giallo + +Vetro colorato azzurro + +Vetro colorato magenta + +Vetro colorato arancione + +Vetro colorato bianco + +Lastra di vetro colorato + +Lastra di vetro colorato nera + +Lastra di vetro colorato rossa + +Lastra di vetro colorato verde + +Lastra di vetro colorato marrone + +Lastra di vetro colorato blu + +Lastra di vetro colorato viola + +Lastra di vetro colorato turchese + +Lastra di vetro colorato grigio chiaro + +Lastra di vetro colorato grigia + +Lastra di vetro colorato rosa + +Lastra di vetro colorato verde lime + +Lastra di vetro colorato gialla + +Lastra di vetro colorato azzurra + +Lastra di vetro colorato magenta + +Lastra di vetro colorato arancione + +Lastra di vetro colorato bianca + +Sfera piccola + +Sfera grande + +A forma di stella + +A forma di creeper + +Esplosione + +Forma sconosciuta + +Nero + +Rosso + +Verde + +Marrone + +Blu + +Viola + +Turchese + +Grigio chiaro + +Grigio + +Rosa + +Verde lime + +Giallo + +Azzurro + +Magenta + +Arancione + +Bianco + +Personalizzato + +Dissolvenza + +Luccichio + +Scia + +Durata volo: +  Comandi attuali Layout @@ -2005,8 +2354,7 @@ Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. 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. @@ -2027,8 +2375,8 @@ Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. - Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_RT*}. - + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario. @@ -2061,8 +2409,8 @@ Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. - Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_RT*}. - + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario della modalità Creativa. @@ -2608,6 +2956,211 @@ Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CON Premi{*CONTROLLER_VK_B*} se sai già come funzionano la barra del cibo e l'alimentazione. + + Questa è l'interfaccia dell'inventario del cavallo. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già usare l'inventario del cavallo. + + + + L'inventario del cavallo ti consente di trasferire o equipaggiare oggetti per il tuo cavallo, asino o mulo. + + + + Sella il tuo cavallo inserendo una sella nel relativo slot. Puoi far indossare una corazza a un cavallo collocandola nel relativo slot. + + + + In questo menu puoi anche trasferire oggetti tra l'inventario e le borse da sella sulla groppa di asini e muli. + + +Hai trovato un cavallo. + +Hai trovato un asino. + +Hai trovato un mulo. + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più su cavalli, asini e muli. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto su cavalli, asini e muli. + + + + Cavalli e asini si trovano principalmente nelle pianure, mentre i muli nascono dall'accoppiamento tra un asino e un cavallo, ma ricorda che sono sterili e non potranno riprodursi a loro volta. + + + + Puoi cavalcare tutti i cavalli, i muli e gli asini adulti, ma puoi far indossare una corazza soltanto ai cavalli, mentre asini e muli possono essere dotati di una borsa da sella per il trasporto di oggetti. + + + + Prima di poter cavalcare un cavallo, un asino o un mulo, è necessario domarlo tentando di cavalcarlo e resistendo mentre cerca di disarcionarti. + + + + Quando compaiono dei cuori e non tenta più di farti finire a terra, significa che è stato domato. + + + + Ora prova a cavalcare questo cavallo. Usa {*CONTROLLER_ACTION_USE*} senza impugnare oggetti o attrezzi per salirgli in groppa. + + + + Per controllare un cavallo, devi dotarlo di una sella, che puoi acquistare dagli abitanti dei villaggi o trovare nelle casse sparse per il mondo. + + + + Puoi mettere una borsa da sella su un asino o un mulo domato assicurandovi una cassa. Potrai accedere alle borse da sella mentre cavalchi o sei in modalità furtiva. + + + + Cavalli e asini (non i muli) possono essere allevati come gli altri animali, usando mele d'oro o carote d'oro. Col passare del tempo, i puledri diventeranno cavalli adulti, ma puoi velocizzare il processo nutrendoli con fieno o grano. + + + + Qui puoi provare a domare cavalli e asini; inoltre, troverai selle, corazze e altre oggetti utili nelle casse. + + + + Questa è l'interfaccia del segnale, che puoi usare per scegliere i poteri conferiti dai tuoi segnali. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già usare l'inventario del segnale. + + + + Nel menu del segnale, puoi selezionare un potere principale: più livelli possiede la piramide, maggiore sarà il numero di poteri tra cui scegliere. + + + + Un segnale su una piramide con almeno quattro livelli offre inoltre il potere secondario Rigenerazione o un potere principale rafforzato. + + + + Per impostare i poteri del tuo segnale, devi sacrificare un lingotto di smeraldo, diamante, oro o ferro nello slot di pagamento. Una volta impostati, i poteri saranno emanati dal segnale senza scadenze o limiti. + + +Sulla cima di questa piramide c'è un segnale inattivo. + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui segnali. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui segnali. + + + + I segnali attivi proiettano un raggio di luce nel cielo, conferendo poteri speciali ai giocatori nelle vicinanze. Per produrli servono vetro, ossidiana e stelle del Sottomondo, le quali si ottengono sconfiggendo l'Avvizzito. + + + + I segnali devono essere collocati in modo tale che siano colpiti dalla luce del sole durante il giorno; inoltre vanno posti su piramidi di ferro, oro, smeraldo o diamante. Il materiale su cui è collocato il segnale non influisce sul suo potere. + + + + Prova a usare il segnale per impostare il potere concesso: per il pagamento, puoi usare i lingotti di ferro che ti abbiamo fornito. + + +Questa stanza contiene dei vagoncini + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui vagoncini. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui vagoncini. + + + + I vagoncini si usano per inserire o rimuovere oggetti dai contenitori e per raccogliere automaticamente gli oggetti che vi vengono riposti. + + + + Possono influire su Banchi di distillazione, casse, distributori, sganci, carrelli con casse, carrelli con vagoncini e altri vagoncini. + + + + I vagoncini tentano continuamente di estrarre oggetti da un contenitore adatto posizionato sopra di essi. Inoltre, cercheranno di inserire gli oggetti in essi riposti in un contenitore di scarico. + + + + Se un vagoncino funziona grazie a una pietra rossa, si disattiverà e smetterà di prelevare e consegnare oggetti. + + + + Il vagoncino punta nella direzione in cui cerca di scaricare gli oggetti. Per rivolgere un vagoncino verso un blocco particolare, posizionalo a ridosso di tale blocco mentre ti muovi furtivamente. + + + + In questa stanza puoi sperimentare diverse configurazioni di vagoncini. + + + + Questa è l'interfaccia dei fuochi d'artificio, che si usa per produrre i fuochi d'artificio e le relative stelle. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già usare l'inventario dei fuochi d'artificio. + + + + Per produrre un fuoco d'artificio, inserisci polvere da sparo e carta nella griglia di produzione 3x3 al di sopra dell'inventario. + + + + Se lo desideri, puoi inserire alcune stelle Fuoco d'artificio nella griglia di produzione, per aggiungerle al fuoco d'artificio. + + + + Più caselle occupi con la polvere da sparo, maggiore sarà l'altezza a cui esploderanno le stelle Fuoco d'artificio. + + + + Quando vuoi produrre il fuoco d'artificio, prendilo dalla casella di produzione. + + + + Per produrre le stelle Fuoco d'artificio, inserisci polvere da sparo e tintura nella griglia di produzione. + + + + La tintura stabilisce il colore dell'esplosione della stella Fuoco d'artificio. + + + + Per decidere la forma della stella Fuoco d'artificio, aggiungi una scarica di fuoco, una pepita d'oro, una piuma o una testa. + + + + Puoi aggiungere uno scintillio usando diamanti e polvere di pietra brillante. + + + + Una volta creata una stella Fuoco d'artificio, puoi stabilirne il colore di dissolvenza usando la tintura. + + + + In queste casse ci sono vari oggetti usati nella produzione di FUOCHI D'ARTIFICIO! + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui fuochi d'artificio. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui fuochi d'artificio. + + + + I fuochi d'artificio sono oggetti decorativi che possono essere lanciati manualmente o dai distributori. Si producono usando carta, povere da sparo e alcune stelle Fuoco d'artificio (facoltative). + + + + Colori, dissolvenza, forma, dimensione ed effetti (come scia o scintillii) delle stelle Fuoco d'artificio possono essere personalizzati includendo ingredienti aggiuntivi durante la produzione. + + + + Prova a realizzare un fuoco d'artificio al tavolo da lavoro usando gli ingredienti che trovi nelle casse. + +  Seleziona Usa @@ -2830,6 +3383,22 @@ Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CON Carica salvataggio per Xbox One +Sali + +Scendi + +Posiziona cassa + +Lancia + +Guinzaglio + +Rilascia + +Attacca + +Nomina + OK Annulla @@ -3068,7 +3637,7 @@ Vuoi sbloccare il gioco completo? Disconnesso -Sei tornato alla schermata iniziale perché il tuo profilo giocatore si è disconnesso +Sei tornato alla schermata iniziale perché il tuo profilo giocatore si è disconnesso. Difficoltà @@ -3140,6 +3709,20 @@ Vuoi sbloccare il gioco completo? Dispenser +Cavallo + +Sgancio + +Vagoncino + +Segnale + +Potere principale + +Potere secondario + +Carrello da miniera + Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. %s si unisce alla partita. @@ -3299,10 +3882,14 @@ Vuoi installare uno dei due pacchetti ora? Modalità: Creativa +Modalità: Avventura + Sopravvivenza Creativa +Avventura + In modalità Sopravvivenza In modalità Creativa @@ -3323,6 +3910,8 @@ Vuoi installare uno dei due pacchetti ora? Superpiatto +Inserisci un seme per generare di nuovo lo stesso terreno. Lascia vuoto per un mondo casuale. + Se attivato, il gioco sarà un gioco online. Se attivato, i giocatori potranno unirsi solo su invito. @@ -3347,6 +3936,20 @@ Vuoi installare uno dei due pacchetti ora? Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. +Se disattivato, impedisce a mostri e animali di cambiare i blocchi (per esempio, le esplosioni dei creeper non distruggono i blocchi e le pecore non brucano erba) o di raccogliere oggetti. + +Se attivo, i giocatori mantengono il proprio inventario quando muoiono. + +Se disattivato, i nemici non vengono generati naturalmente. + +Se disattivato, mostri e animali non rilasciano bottino (per esempio, i creeper non rilasciano polvere da sparo). + +Se disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (per esempio, i blocchi di pietra non rilasciano ciottoli). + +Se disattivato, la salute dei giocatori non si rigenera naturalmente. + +Se disattivato, l'ora del giorno non cambia. + Pacchetti di skin Temi @@ -3395,7 +3998,49 @@ Vuoi installare uno dei due pacchetti ora? {*PLAYER*} è stato pestato a morte da {*SOURCE*} -{*PLAYER*} è stato ucciso da {*SOURCE*} +{*PLAYER*} è stato ucciso da {*SOURCE*} con la magia + +{*PLAYER*} è caduto da una scala + +{*PLAYER*} è caduto dai rampicanti + +{*PLAYER*} è caduto fuori dall'acqua + +{*PLAYER*} è caduto da una grande altezza + +{*SOURCE*} ha condannato {*PLAYER*} alla caduta + +{*SOURCE*} ha condannato {*PLAYER*} alla caduta + +{*SOURCE*} ha condannato {*PLAYER*} alla caduta usando {*ITEM*} + +{*PLAYER*} è caduto troppo lontano ed è stato fatto fuori da {*SOURCE*} + +{*PLAYER*} è caduto troppo lontano ed è stato fatto fuori da {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} è finito nel fuoco mentre affrontava {*SOURCE*} + +{*PLAYER*} è finito arrosto mentre affrontava {*SOURCE*} + +{*PLAYER*} ha cercato di nuotare nella lava per sfuggire a {*SOURCE*} + +{*PLAYER*} è annegato mentre cercava di sfuggire a {*SOURCE*} + +{*PLAYER*} è finito contro un cactus mentre cercava di sfuggire a {*SOURCE*} + +{*SOURCE*} ha fatto esplodere {*PLAYER*} + +{*PLAYER*} è avvizzito + +{*SOURCE*} ha massacrato {*PLAYER*} usando {*ITEM*} + +{*SOURCE*} ha sparato a {*PLAYER*} usando {*ITEM*} + +{*SOURCE*} ha lanciato una sfera di fuoco a {*PLAYER*} usando {*ITEM*} + +{*SOURCE*} ha preso a pugni {*PLAYER*} usando {*ITEM*} + +{*SOURCE*} ha ucciso {*PLAYER*} usando {*ITEM*} Nebbia substrato roccioso @@ -3560,9 +4205,9 @@ Vuoi installare uno dei due pacchetti ora? Non ripristinare il Sottomondo -Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. +Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. -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 maiali, pecore, mucche, gatti e cavalli. Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di muccafunghi. @@ -3572,6 +4217,8 @@ Vuoi installare uno dei due pacchetti ora? Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di calamari. +Impossibile usare l'uovo generazione al momento. È stato raggiunto il numero massimo di pipistrelli per mondo. + 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. @@ -3580,12 +4227,14 @@ Vuoi installare uno dei due pacchetti ora? 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 maiali, pecore, mucche, gatti e cavalli. 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 cavalli. + 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. @@ -3613,27 +4262,43 @@ Vuoi installare uno dei due pacchetti ora? 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 - + +Opzioni di gioco + +Immutabilità + +Mantieni inventario + +Generazione mostri + +Bottino mostri + +Rilascio blocchi + +Rigenerazione naturale + +Ciclo giorno/notte + Può costruire e scavare Può usare porte e interruttori @@ -3820,6 +4485,14 @@ Vuoi installare uno dei due pacchetti ora? Veleno +Avvizzito + +Bonus salute + +Assorbimento + +Saturazione + della Velocità della Lentezza @@ -3858,6 +4531,14 @@ Vuoi installare uno dei due pacchetti ora? del Veleno +del decadimento + +del bonus salute + +dell'assorbimento + +della saturazione + II @@ -3954,6 +4635,22 @@ Vuoi installare uno dei due pacchetti ora? Riduce progressivamente la salute di giocatori, animali e mostri affetti. +Quando applicato: + +Forza salto cavallo + +Rinforzi zombie + +Salute massima + +Distanza inseguimento mostri + +Resistenza ad atterramento + +Velocità + +Danno attacco + Acutezza Percossa @@ -4044,7 +4741,7 @@ Vuoi installare uno dei due pacchetti ora? 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. +Fa recuperare 1 {*ICON_SHANK_01*}. Può avvelenarti. Reintegra 3 {*ICON_SHANK_01*}. Si realizza usando una carota e delle pepite d'oro. @@ -4092,7 +4789,7 @@ Vuoi installare uno dei due pacchetti ora? Muro di ciottoli -Muro di ciottoli coperto di muschio +Muro di ciottoli muschiato Vaso di fiori diff --git a/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx b/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx index 63927afe..5ef7111d 100644 --- a/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx +++ b/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx @@ -73,9 +73,9 @@ Xbox LIVE にサインインしていません -このゲームの一部の機能では、Xbox LIVE にサインインしているゲーマー プロフィールが必要となります。現在は Xbox LIVE にサインインしていません +このゲームの一部の機能では、Xbox LIVE にサインインしているゲーマー プロフィールが必要となります。現在は Xbox LIVE にサインインしていません。 -この機能を使うには、Xbox LIVE にサインインしているゲーマー プロフィールが必要です +この機能を使うには、Xbox LIVE にサインインしているゲーマー プロフィールが必要です。 Xbox LIVE にサインイン @@ -100,7 +100,7 @@ 完全版を購入 これは Minecraft のお試し版です。完全版であれば、今すぐ獲得できる実績があります! -完全版を購入して、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 index 132435fb..5326fb11 100644 --- a/Minecraft.Client/Common/Media/ja-JP/strings.resx +++ b/Minecraft.Client/Common/Media/ja-JP/strings.resx @@ -159,7 +159,7 @@ Minecraft は自由な発想でブロックを積み上げて、探検したり 経験値ゲージも画面に表示され、現在の経験値レベルと次のレベルまでに必要な値を確認できます。 経験値は、生き物を倒した時、特定のブロックを採掘した時、動物を繁殖させた時、釣り、かまどで鉱石を製錬した時などに獲得できる経験値オーブを集めると貯まっていきます。{*B*}{*B*} さらに使用できるアイテムも表示され、{*CONTROLLER_ACTION_LEFT_SCROLL*} と {*CONTROLLER_ACTION_RIGHT_SCROLL*} で手に持つアイテムを切り替えられます -{{*T3*}遊び方: 持ち物{*ETW*}{*B*}{*B*} +{*T3*}遊び方: 持ち物{*ETW*}{*B*}{*B*} 持ち物は {*CONTROLLER_ACTION_INVENTORY*} で見ることができます。{*B*}{*B*} この画面では、手にしている使用可能なアイテム、所有しているアイテムのリスト、現在装備している防具を確認できます。{*B*}{*B*} ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かして、アイテムに合わせてから {*CONTROLLER_VK_A*} を押すと、アイテムを選択できます。そのアイテムを複数所有している場合は、そのすべてが選択されます。半分だけ選択するには {*CONTROLLER_VK_X*} を使用します。{*B*}{*B*} @@ -231,7 +231,7 @@ Minecraft は自由な発想でブロックを積み上げて、探検したり エンチャントに必要な経験値は、不足している場合は赤、足りている場合は緑で表示されます。{*B*}{*B*} エンチャントは消費可能な経験値の範囲でランダムに選択されます。{*B*}{*B*} エンチャントテーブルの周囲に、テーブルとブロック 1 つ分のすき間を空けて本棚 (最大 15 台) を並べることで、エンチャントのレベルが上がります。また本棚からテーブル上の本に向けて文字が流れ込むエフェクトが表示されます。{*B*}{*B*} -エンチャントテーブルに必要な材料はすべて村や採掘、農耕などで手に入ります。{*B*}{*B} +エンチャントテーブルに必要な材料はすべて村や採掘、農耕などで手に入ります。{*B*}{*B*} エンチャントした本は金床を使ってアイテムをエンチャントすることができます。これによりアイテムにより多くのエンチャントを選択することができます{*B*} @@ -280,9 +280,9 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに {*CONTROLLER_ACTION_DPAD_LEFT*} で左に、{*CONTROLLER_ACTION_DPAD_RIGHT*} で右に飛べます {*T3*}遊び方: ホストとプレイヤーのオプション{*ETW*}{*B*}{*B*} - + {*T1*}ゲーム オプション{*ETW*}{*B*} -世界をロードまたは生成する際、[その他のオプション] を選択して、より詳細な設定ができるようになりました。{*B*}{*B*} +世界をロードまたは生成する際、[その他のオプション] を選択して、さらに詳細な設定ができるようになりました。{*B*}{*B*} {*T2*}PvP{*ETW*}{*B*} 有効にすると、プレイヤーが他のプレイヤーにダメージを与えられるようになります (サバイバル モードのみ)。{*B*}{*B*} @@ -299,6 +299,27 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに {*T2*}ホスト特権{*ETW*}{*B*} 有効にすると、ホストの飛行能力、疲労無効、ゲーム内メニューでの非表示を切り替えられます。{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}時刻の変化{*ETW*}{*B*} + 無効にすると、時刻が変わりません。{*B*}{*B*} + + {*T2*}持ち物の保持{*ETW*}{*B*} + 有効にすると、ゲームオーバー時にプレイヤーの持ち物が失われません。{*B*}{*B*} + + {*T2*}生き物の出現{*ETW*}{*B*} + 無効にすると、生き物は自然に出現しません。{*B*}{*B*} + + {*T2*}生き物による妨害{*ETW*}{*B*} + 無効にすると、モンスターや動物がブロックを変更したり (例: Creeper が爆発してもブロックが破壊されない、羊が草を取り除かない)、アイテムを拾いません。{*B*}{*B*} + + {*T2*}生き物からの戦利品{*ETW*}{*B*} + 無効にすると、モンスターや動物は戦利品をドロップしません (例: Creeper は火薬をドロップしない)。{*B*}{*B*} + + {*T2*}タイルからのアイテム入手{*ETW*}{*B*} + 無効にすると、ブロックを壊してもアイテムを落としません (例: 石ブロックが丸石を落とさない)。{*B*}{*B*} + + {*T2*}自然再生{*ETW*}{*B*} + 無効にすると、プレイヤーの HP は自然に再生されません。{*B*}{*B*} + {*T1*}世界の生成のオプション{*ETW*}{*B*} 世界の生成にオプションが追加されました。{*B*}{*B*} @@ -315,7 +336,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 有効にすると暗黒界を再生成します。暗黒砦が存在しないセーブ データがある場合に便利です{*B*}{*B*} {*T1*}ゲーム内のオプション{*ETW*}{*B*} - ゲーム中に BACK を押すと、様々なオプション メニューを開くことができます。{*B*}{*B*} + ゲーム中に {*BACK_BUTTON*} を押すと、様々なオプション メニューを開くことができます。{*B*}{*B*} {*T2*}ホスト オプション{*ETW*}{*B*} ホストプレイヤーと [ホストオプションを変更できる] に設定されたプレイヤーは [ホスト オプション] メニューを使用できます。このメニューでは火の延焼や TNT の爆発などを切り替えることができます。{*B*}{*B*} @@ -333,7 +354,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに [高度な操作を許可] を無効にしている場合のみ使えるオプションです。無効にすると、このゲームに参加したプレイヤーはチェストなどの入れ物を使用できません。{*B*}{*B*} {*T2*}プレイヤーを攻撃可能{*ETW*}{*B*} - [高度な操作を許可] を無効にしている場合のみ使えるオプションです。無効にすると、プレイヤーが他のプレイヤーにダメージを与えられなくなります。{*B*}{*B*} + [高度な操作を許可] を無効にしている場合のみ使えるオプションです。無効にすると、プレイヤーが他のプレイヤーにダメージを与えられなくなります。{*B*}{*B*} {*T2*}動物を攻撃可能{*ETW*}{*B*} [高度な操作を許可] を無効にしている場合のみ使えるオプションです。無効にすると、プレイヤーが動物にダメージを与えられなくなります。{*B*}{*B*} @@ -342,12 +363,12 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに この設定を有効にすると、そのプレイヤーは「高度な操作を許可」が無効の場合に、ホストを除く他のプレイヤーの特権や、プレイヤーの追放、火の延焼と TNT の爆発の設定ができるようになります。{*B*}{*B*} {*T2*}プレイヤーを追放{*ETW*}{*B*} - ホストプレイヤーと同じ {*PLATFORM_NAME*} を使用していないプレイヤーに対してこのオプションを選択すると、そのプレイヤーおよび対象プレイヤーと同じ {*PLATFORM_NAME*} を使用している他のプレイヤーがゲームから追放されます。追放されたプレイヤーは、ゲームが再起動されるまでは再び参加できません。{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}*}{*B*}{*B*} {*T1*}ホストプレイヤー オプション{*ETW*}{*B*} [ホスト特権] が有効の場合、ホストプレイヤーは自分に特権を設定できます。ホスト特権を変更するには、プレイヤー名を選択して {*CONTROLLER_VK_A*} で特権のメニューを開き、次のオプションを設定してください。{*B*}{*B*} - - {*T2*}飛行可能{*ETW*}{*B*} + + {*T2*}飛行可能{*ETW*}{*B*} 有効にすると、飛行できるようになります。クリエイティブ モードでは全プレイヤーが飛行できるため、サバイバル モードにのみ適用されます。{*B*}{*B*} {*T2*}疲労無効{*ETW*}{*B*} @@ -356,10 +377,13 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに {*T2*}不可視{*ETW*}{*B*} 有効にするとプレイヤーは他のプレイヤーから見えなくなり、ダメージも受けなくなります。{*B*}{*B*} - {*T2*テレポート可能{*ETW*}{*B*} - 自分や他のプレイヤーを世界にいる他のプレイヤーの場所に移動することができます + {*T2*}テレポート可能{*ETW*}{*B*} + 自分や他のプレイヤーを世界にいる他のプレイヤーの場所に移動することができます。 + +ホストプレイヤーと同じ {*PLATFORM_NAME*} を使用していないプレイヤーに対してこのオプションを選択すると、そのプレイヤーおよび対象プレイヤーと同じ {*PLATFORM_NAME*} を使用している他のプレイヤーがゲームから追放されます。追放されたプレイヤーは、ゲームが再起動されるまでは再び参加できません + 次へ 前へ @@ -423,61 +447,94 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 最新情報 -{*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*} - + +{*T3*}修正と追加{*ETW*}{*B*}{*B*} +- 新しいアイテムを追加しました。堅焼き粘土、色付き粘土、石炭のブロック、干し草の俵、アクティベーター レール、レッドストーンのブロック、日照センサー、ドロッパー、ホッパー、ホッパー付きトロッコ、TNT 付きトロッコ、レッドストーン コンパレーター、重量感知板、ビーコン、トラップ チェスト、ロケット花火、花火の星、ネザー スター、首ひも、馬よろい、名札、馬のスポーン エッグを追加しました。{*B*} +- 新しい生き物、ウィザー、ウィザー スケルトン、ウィッチ、コウモリ、馬、ロバ、およびラバを追加しました。{*B*} +- 新しい地形生成機能、ウィッチの小屋を追加しました。{*B*} +- ビーコンのインターフェイスを追加しました。{*B*} +- 馬のインターフェイスを追加しました。{*B*} +- ホッパーのインターフェイスを追加しました。{*B*} +- 花火を追加しました。花火のインターフェイスには、花火の星またはロケット花火を作るための材料を所持している場合、作業台からアクセスすることができます。{*B*} +- 「アドベンチャー モード」を追加しました。ブロックは正しいツールでのみ壊すことができます。{*B*} +- 新しいサウンドを多数追加しました。{*B*} +- 生き物、アイテム、発射物も、ポータルを通れるようになりました。{*B*} +- リピーターに横から別のリピーターで電源を送ることで、ロックできるようになりました。{*B*} +- ゾンビとスケルトンは異なった武器と防具を装備して出現するようになりました。{*B*} +- 新しいゲームオーバー メッセージ。{*B*} +- 名札を使って生き物に名前を付けたり、メニューを開いた状態で入れ物の名前を変えてタイトルを変更します。{*B*} +- 骨粉を使ってもすべてが瞬時に成長しなくなりました。成長はランダムに段階的になります。{*B*} +- チェスト、調合台、発射装置、ジュークボックスの中身を示すレッドストーン信号は、レッドストーン コンパレーターをそちらに向けて直接設置すれば検出できます。{*B*} +- 発射装置はどの方向にも向けることができます。{*B*} +- 金のリンゴを食べると、プレイヤーは短時間、追加の「吸収」HP を獲得できます。{*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*} - +{*T1*}新アイテム{*ETB*} - 堅焼き粘土、色付き粘土、石炭のブロック、干し草の俵、アクティベーター レール、レッドストーンのブロック、日照センサー、ドロッパー、ホッパー、ホッパー付きトロッコ、TNT 付きトロッコ、レッドストーン コンパレーター、重量感知板、ビーコン、トラップ チェスト、ロケット花火、花火の星、ネザー スター、首ひも、馬よろい、名札、馬のスポーン エッグ{*B*}{*B*} + {*T1*}新しい生き物{*ETB*} - ウィザー、ウィザー スケルトン、ウィッチ、コウモリ、馬、ロバ、およびラバ{*B*}{*B*} +{*T1*}新機能{*ETB*} - 馬の手なづけと騎乗、花火の作製とショーの催し、名札による動物とモンスターの名付け、さらに高度なレッドストーン回路の作成、そして新しいホスト オプションによる自世界でゲストができることの管理!{*B*}{*B*} +{*T1*}新しいチュートリアル{*ETB*} チュートリアルで新旧機能の使い方を学びましょう。世界に隠された秘密の音楽ディスクをすべて見つけられるでしょうか。{*B*}{*B*} + + + + +{*T3*}使い方: 馬{*ETW*}{*B*}{*B*} +馬とロバは、主に草原で見られます。ラバはロバと馬から生まれますが、それ自体では繁殖しません。{*B*} +馬、ロバ、ラバの成体には乗ることができます。ただし、よろいを着けられるのは馬のみで、アイテムを運ぶために鞍袋を着けられるのはロバとラバのみです。{*B*}{*B*} +馬、ロバ、ラバを利用するには、最初に手なずける必要があります。騎乗して、振り落とされそうになっても乗り続けると、手なずけることができます。{*B*} +馬の周りにハートが表示されると手なずけ完了で、以降はプレイヤーを振り落とさなくなります。 馬を操縦するには鞍を置く必要があります。{*B*}{*B*} +鞍は村人から購入する、または世界の中に隠されたチェスト内に見つけることができます。{*B*} +手なずけたロバとラバにチェストを装着すれば鞍袋を背負わせることができます。この鞍袋には、騎乗またはしのび足している間にアクセスできます。{*B*}{*B*} +馬とロバ (ラバは除く) は、他の動物と同様に金のリンゴまたは金のニンジンを使って繁殖させることが可能です。{*B*} +子馬や子ロバは時間の経過とともに成長しますが、小麦または干し草を与えれば成長が早まります。{*B*} + + +ビーコン + +{*T3*}使い方: ビーコン{*ETW*}{*B*}{*B*} +アクティブなビーコンは、明るい光線を空へ放ち、近くにいるプレイヤーにパワーを与えます。{*B*} +作るには、ガラス、黒曜石、ウィザーを倒すことで手に入るネザー スターを使います。{*B*}{*B*} +ビーコンは、日中に日光が当たる場所に配置する必要があります。また、ビーコンは鉄、金、エメラルド、またはダイヤモンドのピラミッドの上に配置する必要があります。{*B*} +どの建材上にビーコンを配置するかは、ビーコンのパワーに影響しません。{*B*}{*B*} +ビーコン メニューで、ビーコンのプライマリ パワーを 1 つ選択することができます。ピラミッドの階層が増えるほど、パワーの選択肢が増えます。{*B*} +少なくとも 4 段以上のピラミッド上に配置されたビーコンでは、「回復」のセカンダリ パワーか、さらに強力なプライマリ パワーも選択可能になります。{*B*}{*B*} +ビーコンのパワーを設定するには、支払いスロットでエメラルド、ダイヤモンド、金または鉄のインゴットのいずれかを消費しなければなりません。{*B*} +設定が済むと、ビーコンからのパワーは無限に発せられます。{*B*} + + +花火 + +{*T3*}使い方: 花火{*ETW*}{*B*}{*B*} +花火は装飾アイテムで、手動、または発射装置から打ち上げることができます。作るには、紙、火薬、オプションとして数々の花火の星を使用します。{*B*} +花火の星の色、色変化、形状、サイズ、効果 (例: 光跡、点滅) は、作成時に追加の材料を含めることでカスタマイズできます。{*B*}{*B*} +花火を作るには、火薬と紙を持ち物の上に表示される 3x3 のクラフト グリッドに置きます。{*B*} +オプションとして、クラフト グリッド上に複数の花火の星を置いて、花火に加えることもできます。{*B*} +クラフト グリッドのスロットに置く火薬が多くなれば、花火の星はより高い位置で破裂します。{*B*}{*B*} +作った花火は、取り出し口から取り出せます。{*B*}{*B*} +花火の星は、火薬と染料をクラフト グリッドに置くと作れます。{*B*} + - 染料は、花火の星が破裂する際の色を設定します。{*B*} + - 花火の星の形状は、発火剤、金塊、羽根、または生き物のヘッドを追加することで設定します。{*B*} + - 光跡や点滅は、ダイヤモンドまたはグロウストーンの粉を使うことで追加できます。{*B*}{*B*} +花火の星を作った後、さらに染料を加えることで、花火の星の色変化を決めることもできます。 + + +ホッパー + +{*T3*}使い方: ホッパー{*ETW*}{*B*}{*B*} +ホッパーは、入れ物にアイテムを出し入れするために、また、その上に投げられたアイテムを自動的に拾うのに使います。{*B*} +ホッパーは調合台、チェスト、発射装置、ドロッパー、チェスト付きトロッコ、ホッパー付きトロッコ、および他のホッパーに対して作用させることができます。{*B*}{*B*} +ホッパーは、その上に位置する適切な入れ物からアイテムを吸い出し続けます。また、保管されたアイテムを出力先の入れ物に格納しようとします。{*B*} +レッドストーンが電源の場合、ホッパーは非アクティブになり、アイテムの吸い出しも格納も停止します。{*B*}{*B*} +ホッパーは向いている方向にアイテムを出します。ホッパーが特定のブロックに向くようにするには、そのブロックに向けてしのび足でホッパーを設置します。 {*B*} + + +ドロッパー + +{*T3*}使い方: ドロッパー{*ETW*}{*B*}{*B*} +レッドストーンが電源の場合、ドロッパーは格納しているアイテムをランダムに 1 つ、地上にドロップします。{*CONTROLLER_ACTION_USE*} を使ってドロッパーを開くと、自分の持ち物からアイテムをドロッパーに投入することができます。{*B*} +ドロッパーがチェストまたは他の種類の入れ物に面している場合、アイテムはドロッパーではなく、そちらへ投入されます。ドロッパーを多数つなげて設置すれば、離れた場所との間でアイテムを運べます。そのように動作させるには、電源を交互にオンとオフにする必要があります。 + 手よりも攻撃力が高い @@ -503,7 +560,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 装備するとアーマーポイント +1 -装備するとアーマーポイント +3 +装備するとアーマーポイント +3。 装備するとアーマーポイント +2 @@ -513,7 +570,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 装備するとアーマーポイント +5 -装備するとアーマーポイント +4 +装備するとアーマーポイント +4。 装備するとアーマーポイント +1 @@ -529,17 +586,17 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 装備するとアーマーポイント +5 -装備するとアーマーポイント +3 +装備するとアーマーポイント +3。 装備するとアーマーポイント +1 -装備するとアーマーポイント +3 +装備するとアーマーポイント +3。 装備するとアーマーポイント +8 装備するとアーマーポイント +6 -装備するとアーマーポイント +3 +装備するとアーマーポイント +3。 光沢を放つ延べ棒、道具を作る材料として使う。かまどで鉱石を精錬して作る @@ -604,19 +661,45 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 手に持っていると、探索済みのエリアの地図を表示する。道を確認するのに使う +使用すると、プレイヤーの世界内での現在位置周辺の地図になる。探検するにつれて図面が埋まっていく + 矢を射る攻撃ができる 弓と組み合わせて、武器として使う -2.5{*ICON_SHANK_01*} 回復する +ウィザーが落とす。ビーコンを作るのに使う。 + +作動すると、色とりどりの火花を作り出す。その色、形状、色変化は、花火を作る際に使う花火の星によって決まる。 + +花火の色、効果、形状を決めるために使う。 + +レッドストーン回路で、信号強度を維持、比較、または減算したり、特定のブロックの状態を測定したりするために使う。 + +移動する TNT ブロックとして機能する、トロッコの一種。 + +日光 (またはその不足) に応じてレッドストーン信号を出力するブロック。 + +ホッパーと同じように機能する特別な種類のトロッコ。軌道上に落ちているアイテムや、上に位置する入れ物からのアイテムを収集する。 + +馬に装着できる特別な種類の防具。防御力 +5。 + +馬に装着できる特別な種類の防具。防御力 +7。 + +馬に装着できる特別な種類の防具。防御力 +11。 + +生き物をプレイヤーまたはフェンスの柱につなぐために使う。 + +世界内の生き物に名前をつけるのに使う。 + +2.5{*ICON_SHANK_01*} 回復する。 -1{*ICON_SHANK_01*} 回復する。6 回まで使用できる +1{*ICON_SHANK_01*} 回復する。6 回まで使用できる。 -1{*ICON_SHANK_01*} 回復する +1{*ICON_SHANK_01*} 回復する。 -1{*ICON_SHANK_01*} 回復する +1{*ICON_SHANK_01*} 回復する。 -3{*ICON_SHANK_01*} 回復する +3{*ICON_SHANK_01*} 回復する。 1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。病気になる場合もある @@ -634,7 +717,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 2.5{*ICON_SHANK_01*} 回復する。生魚をかまどで調理するとできる -2{*ICON_SHANK_01*} 回復する。金のリンゴの材料となる +2{*ICON_SHANK_01*} 回復する。金のリンゴの材料となる。 2{*ICON_SHANK_01*} 回復し、さらに HP が 4 秒間、自動回復する。リンゴと金の塊から作る @@ -659,7 +742,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 電源が入っている時、上を走るトロッコを加速させる。電源が入っていない時は、上でトロッコが止まる -トロッコ専用の重量感知板として機能する。電源が入っている時にレッドストーンの信号を送る +トロッコ専用の重量感知板として機能する。電源が入っている時にレッドストーンの信号を送る。 プレイヤーや動物、モンスターを乗せて、レールの上を移動できる @@ -716,7 +799,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 本や地図を作るのに使う -本棚を作るのに使ったり、エンチャントしてエンチャントした本を作るために使う +本棚を作るのに使ったり、エンチャントしてエンチャントした本を作るために使う。 エンチャントテーブルの周囲に置いて、より強力なエンチャントを作る @@ -932,100 +1015,158 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに ヘッド類は飾り付けとして並べたり、ヘルメットのスロットからマスクとして着用もできる +コマンドを実行するのに使う。 + +空に向けて光線を放ち、付近のプレイヤーにステータス効果をもたらすことができる。 + +中にブロックとアイテムを保管する。2 つのチェストを隣同士に置くと、容量 2 倍の大きなチェストを作ることができる。トラップ チェストは開いた時に、レッドストーン電源も供給する。 + +レッドストーンによる電源を供給する。板上のアイテムが多いほど、チャージは強力になる。 + +レッドストーンによる電源を供給する。板上のアイテムが多いほど、チャージは強力になる。軽量板よりも重さを必要とする。 + +レッドストーン電源として使う。レッドストーンに作り戻すことができる。 + +アイテムの受け取り、または入れ物からのアイテムの出し入れに使われる。 + +レールの一種。ホッパー付きトロッコを有効または無効にしたり、TNT 付きトロッコを動作させたりできる。 + +アイテムを保管または落とすのに使われる。レッドストーン電源がある場合には、他の入れ物へアイテムを移すのにも使える。 + +カラフルなブロック。堅焼き粘土を染色して作る。 + +馬、ロバ、またはラバに餌として与えることができ、10 ハートまで回復させる。子馬や子ロバの成長を早める効果もある。 + +かまどの中で粘土を精錬して作られる。 + +ガラスと染料から作られる。 + +ステンドグラスから作られる。 + +木炭を保管するのに使える。かまどで燃料として使用することができる + イカ - + 倒すと墨袋を落とす - + - + 倒すと革を落とす。バケツがあればミルクも取れる - + - + 毛を刈るときウールを落とす (毛が残っている場合)。ウールはいろいろな色に染められる - + ニワトリ - + 倒すと羽根を落とす。タマゴを持っている場合もある - + - + 倒すと豚肉を落とす。鞍があれば乗ることもできる - + オオカミ - + 普段はおとなしいが、攻撃すると反撃してくる。骨を使うと手なずけることができ、プレイヤーについて回って、プレイヤーを攻撃してくる敵を攻撃してくれる - + Creeper - + 近づきすぎると爆発する! - + ガイコツ - + 矢を放ってくる。倒すと矢を落とす - + クモ - + 近づくと攻撃してくる。壁を登ることができる。倒すと糸を落とす - + ゾンビ - + 近づくと攻撃してくる - + ゾンビ Pigman - + 最初はおとなしいが、1 匹を攻撃すると集団で反撃してくる - + Ghast - + 当たると爆発する火の玉を放ってくる - + スライム - + ダメージを与えると、小さなスライムに分裂する - + Enderman - + 照準を向けると攻撃してくる。ブロックを移動できる - + Silverfish - + 攻撃すると、近くに隠れている Silverfish も集まってくる。石ブロックの中に隠れている - + 洞窟グモ - + 牙に毒がある - + Mooshroom - + 空のおわんを使うときのこシチューが採れる。ハサミで毛刈りをするときのこを落とすが、普通の牛になってしまう - + スノー ゴーレム - + 雪ブロックとカボチャで作れるゴーレム。作った人の敵に向かって雪玉を投げつける - + エンダー ドラゴン - + 果ての世界に存在する大きな黒竜 - + Blaze - + 暗黒界に出現する敵。主に暗黒砦内にいる。倒すと Blaze ロッドを落とす - + マグマ キューブ - + 暗黒界に出現する。Slime 同様、倒すと小さな Lava Slime に分裂する - + 村人 - + ヤマネコ - + ジャングルに生息。生魚を与えて飼い慣らせる。不意な動きに驚いてすぐに逃げるため、接近するのは簡単ではない - + アイアン ゴーレム - + 村に出現して村人を守ってくれる。鉄のブロックとカボチャで作ることもできる - + +コウモリ + +この空飛ぶ生き物は、洞窟やその他の大きな閉じた空間で見つかる。 + +ウィッチ + +この敵は沼地で見られ、ポーションを投げて攻撃してくる。倒すとポーションを落とす。 + + + +この動物は手なずけて、乗ることができる。 + +ロバ + +この動物は手なずけて、乗ることができる。チェストを装着することもできる。 + +ラバ + +馬とロバの交配によって生まれる。この動物は手なずけて、乗ったり、チェストを運ばせたりすることができる。 + +馬のゾンビ + +馬のスケルトン + +ウィザー + +ウィザー スカルとソウル サンドから作られる。爆発するスカルを撃ってくる。 + Explosives Animator Concept Artist @@ -1372,6 +1513,8 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 地図 +空っぽの地図 + 音楽ディスク: 13 音楽ディスク: cat @@ -1474,6 +1617,28 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに Creeper ヘッド +ネザースター + +ロケット花火 + +花火の星 + +レッドストーン コンパレーター + +TNT 付きトロッコ + +ホッパー付きトロッコ + +鉄の馬よろい + +金の馬よろい + +ダイヤモンドの馬よろい + +首ひも + +名札 + 草ブロック @@ -1490,6 +1655,8 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに ジャングルの木の板 + 木の板 (全種類) + 苗木 樫の苗木 @@ -1826,6 +1993,190 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに スカル +コマンド ブロック + +ビーコン + +トラップ チェスト + +重量感知板 (軽) + +重量感知板 (重) + +レッドストーン コンパレーター + +日照センサー + +レッドストーンのブロック + +ホッパー + +アクティベーター レール + +ドロッパー + +色付き粘土 + +干し草の俵 + +堅焼き粘土 + +石炭のブロック + +黒の色付き粘土 + +赤の色付き粘土 + +緑の色付き粘土 + +茶色の色付き粘土 + +青の色付き粘土 + +紫の色付き粘土 + +青緑の色付き粘土 + +薄灰色の色付き粘土 + +灰色の色付き粘土 + +ピンクの色付き粘土 + +黄緑の色付き粘土 + +黄色の色付き粘土 + +空色の色付き粘土 + +赤紫の色付き粘土 + +オレンジの色付き粘土 + +白の色付き粘土 + +ステンドグラス + +黒のステンドグラス + +赤のステンドグラス + +緑のステンドグラス + +茶色のステンドグラス + +青のステンドグラス + +紫のステンドグラス + +赤紫のステンドグラス + +薄灰色のステンドグラス + +灰色のステンドグラス + +ピンクのステンドグラス + +黄緑のステンドグラス + +黄色のステンドグラス + +空色のステンドグラス + +赤紫のステンドグラス + +オレンジのステンドグラス + +白のステンドグラス + +ステンドグラス窓 + +黒のステンドグラス窓 + +赤のステンドグラス窓 + +緑のステンドグラス窓 + +茶色のステンドグラス窓 + +青のステンドグラス窓 + +紫のステンドグラス窓 + +赤紫のステンドグラス窓 + +薄灰色のステンドグラス窓 + +灰色のステンドグラス窓 + +ピンクのステンドグラス窓 + +黄緑のステンドグラス窓 + +黄色のステンドグラス窓 + +空色のステンドグラス窓 + +赤紫のステンドグラス窓 + +オレンジのステンドグラス窓 + +白のステンドグラス窓 + +小玉 + +大玉 + +星形 + +Creeper 形 + +破裂 + +未知の形 + + + + + + + +茶色 + + + + + +青緑 + +薄灰色 + +灰色 + +ピンク + +黄緑 + +黄色 + +空色 + +赤紫 + +オレンジ + + + +カスタム + +変化後の色 + +点滅 + +光跡 + +滞空時間: +  現在の操作方法 レイアウト @@ -2003,8 +2354,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに これがあなたの持ち物です。手で持って使用できるアイテムと、所有しているアイテムのリスト、現在装備している防具を確認できます - - + {*B*} 持ち物の説明を続ける: {*CONTROLLER_VK_A*}{*B*} 持ち物の説明を飛ばす: {*CONTROLLER_VK_B*} @@ -2025,7 +2375,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに - アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_VK_RT*} を押してください + アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_ACTION_MENU_PAGEDOWN*} を押してください @@ -2060,7 +2410,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに - アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_VK_RT*} を押します + アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_ACTION_MENU_PAGEDOWN*} を押してください @@ -2442,7 +2792,7 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに - ポータルを起動するには、火打石と打ち金で、フレーム内の黒曜石に火をつけましょう。枠が壊れたり、近くで爆発が起きたり、液体を流したりすると、ポータルは停止します + ポータルを起動するには、火打石と打ち金で、フレーム内の黒曜石に火をつけましょう。枠が壊れたり、近くで爆発が起きたり、液体を流したりすると、ポータルは停止します。 @@ -2607,6 +2957,211 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに すでに十分知っている場合は {*CONTROLLER_VK_B*} を押してください。 + + これは馬のインベントリ インターフェイスです。 + + + + {*B*}続行するには {*CONTROLLER_VK_A*} を押します。 + {*B*}馬のインベントリの使い方を既に知っている場合は、{*CONTROLLER_VK_B*} を押します。 + + + + 馬のインベントリを使うと、自分の馬、ロバ、またはラバにアイテムを移したり、装備させたりすることができます。 + + + + 馬に鞍をのせるには、鞍スロットに鞍を置きます。防具スロットに馬よろいを置けば、馬に防具を装備させることもできます。 + + + + このメニューでは、自分の持ち物とロバまたはラバに装着した鞍袋との間で、アイテムを移動することもできます。 + + +馬を見つけました。 + +ロバを見つけました。 + +ラバを見つけました。 + + + {*B*}馬、ロバ、ラバについてもっと知るには {*CONTROLLER_VK_A*} を押します。 + {*B*}馬、ロバ、ラバについて既に知っている場合は、{*CONTROLLER_VK_B*} を押します。 + + + + 馬とロバは主にひらけた草原で見つかります。ラバはロバと馬から繁殖できますが、それ自体では子を産みません。 + + + + 馬、ロバ、ラバの成体には乗ることができます。ただし防具を装備できるのは馬だけです。アイテムを運搬するための鞍袋を着けられるのはラバとロバだけです。 + + + + 馬、ロバ、ラバは使う前に手なずける必要があります。騎乗して、振り落とされそうになっても乗り続ければ、手なずけることができます。 + + + + 手なずけると周りにハートが表示されて、二度とプレイヤーを振り落とそうとはしません。 + + + + この馬に乗ってみましょう。騎乗するには、手にアイテムやツールは何も持たないで {*CONTROLLER_ACTION_USE*} を使います。 + + + + 馬を操縦するには鞍を置く必要があります。鞍は村人から購入するか、世界のどこかに隠されたチェストの中から見つかります。 + + + + 手なずけたロバとラバに鞍袋を着けるにはチェストを取り付けます。鞍袋にアクセスできるのは、騎乗時またはしのび足している時です。 + + + + 馬とロバ (ラバは除く) は、他の動物と同様に金のリンゴや金のニンジンを使って繁殖することができます。子馬や子ロバは時間とともに成体になりますが、小麦か干し草を与えると成長が早まります。 + + + + ここでは馬とロバを手なずけてみることができます。この周辺のチェストには鞍や馬よろいなどの便利な馬用アイテムもあります。 + + + + これはビーコンのインターフェイスです。これを使うとビーコンに割り当てるパワーを選択できます。 + + + + {*B*}続行するには {*CONTROLLER_VK_A*} を押します。 + {*B*}ビーコンのインターフェイスの使い方を既に知っている場合は、{*CONTROLLER_VK_B*} を押します。 + + + + ビーコン メニューでは、ビーコンに割り当てるプライマリ パワーを 1 つ選択できます。ピラミッドの階層が増えると、パワーの選択肢も増えます。 + + + + 少なくとも 4 層以上のピラミッドに置かれたビーコンには、追加オプションとして「回復」のセカンダリ パワーか、さらに強力なプライマリ パワーが付与されます。 + + + + ビーコンのパワーを設定するには、エメラルド、ダイヤモンド、金または鉄のインゴットを支払いスロットで消費する必要があります。一度設定すると、ビーコンはパワーを無限に発します。 + + +このピラミッドの頂上には、アクティブでないビーコンがある。 + + + {*B*}ビーコンについてもっと知るには {*CONTROLLER_VK_A*} を押します。 + {*B*}ビーコンについて既に知っている場合は、{*CONTROLLER_VK_B*} を押します。 + + + + アクティブなビーコンは空に向けて明るい光線を放ち、付近のプレイヤーにパワーを与えます。ビーコンはガラス、黒曜石、ウィザーを倒すと入手できるネザースターから作ります。 + + + + ビーコンは、昼間に日光を受ける場所に設置する必要があります。また、ビーコンは鉄、金、エメラルド、またはダイヤモンドのピラミッド上に設置しなければなりません。ただし建材の違いによるビーコンのパワーへの影響はありません。 + + + + ビーコンを使って、そこから与えるパワーを設定してみましょう。必要な支払いには鉄のインゴットを使うことができます。 + + +この部屋にはホッパーがある + + + {*B*}ホッパーについてもっと知るには {*CONTROLLER_VK_A*} を押します。 + {*B*}ホッパーについて既に知っている場合は、{*CONTROLLER_VK_B*} を押します。 + + + + ホッパーは入れ物にアイテムを出し入れするために、またはホッパー上に投げられたアイテムを自動的に拾うために使います。 + + + + ホッパーは調合台、チェスト、発射装置、ドロッパー、チェスト付きトロッコ、ホッパー付きトロッコ、および他のホッパーに対して作用できます。 + + + + ホッパーは、その上に位置する適切な入れ物からアイテムを吸い出し続けます。また、保管されたアイテムを出力先の入れ物に格納します。 + + + + しかし、レッドストーンが電源の場合、ホッパーは非アクティブになり、アイテムの吸い出しも格納も停止します。 + + + + ホッパーの向きはアイテムを排出する方向を示します。ホッパーが特定のブロックに向くようにするには、しのび足しながらそのブロックに向けて設置します。 + + + + この部屋には様々な役立つホッパーのレイアウトが用意してあり、目で見て試せます。 + + + + これは花火のインターフェイスです。これを使えば花火と、花火の星を作ることができます。 + + + + {*B*}続行するには {*CONTROLLER_VK_A*} を押します。 + {*B*}花火のインターフェイスの使い方を既に知っている場合は、{*CONTROLLER_VK_B*} を押します。 + + + + 花火を作るには、火薬と紙をインベントリの上に表示される 3x3 のクラフト グリッドに置きます。 + + + + オプションとして、クラフト グリッド上に複数の花火の星を置いて、花火に追加することもできます。 + + + + クラフト グリッドのスロットに火薬を多く置くほど、花火の星はさらに高いところで破裂します。 + + + + 作った花火は、作りたい時にいつでも取り出し口から取り出せます。 + + + + 花火の星を作るには、火薬と染料をクラフト グリッドに置きます。 + + + + 染料を使って、花火の星が破裂する際の色を決めます。 + + + + 花火の星の形状は、発火剤、金塊、羽根、またはヘッドを追加して決定します。 + + + + 光跡や点滅は、ダイヤモンドまたはグロウストーンの粉を使って追加できます。 + + + + 花火の星を作った後、さらに染料を加えれば、花火の星の色変化を決められます。 + + + + ここにあるチェストの中には、花火作りに使われる様々なアイテムが入っています! + + + + {*B*}花火についてもっと知るには {*CONTROLLER_VK_A*} を押します。 + {*B*}花火について既に知っている場合は、{*CONTROLLER_VK_B*} を押します。 + + + + 花火は装飾アイテムで、手動、または発射装置から打ち上げることができます。作るには、紙、火薬、およびオプションとして数々の花火の星を使います。 + + + + 花火の星の色、色変化、形状、サイズ、効果 (光跡、点滅など) は、作る際に材料を追加すればでカスタマイズできます。 + + + + チェストにあるいろいろな材料を使って、作業台で花火を作ってみましょう。 + +  選択 使う @@ -2829,6 +3384,22 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに Xbox One 用にセーブをアップロード +騎乗する + +降りる + +チェストを着ける + +打ち上げる + +首ひもをつける + +首ひもをはずす + +装着する + +名前をつける + OK キャンセル @@ -3143,6 +3714,20 @@ Minecraft Xbox 360 版は、初期設定でマルチプレイヤー ゲームに 発射装置 + + +ドロッパー + +ホッパー + +ビーコン + +プライマリ パワー + +セカンダリ パワー + +トロッコ + 現在、このタイプのダウンロード コンテンツはありません %s が世界にやってきました @@ -3302,10 +3887,14 @@ OK を選択すると、この世界でのプレイを終了します ゲームモード: クリエイティブ +ゲーム モード: アドベンチャー + サバイバル クリエイティブ +アドベンチャー + サバイバル モードで作成 クリエイティブ モードで作成 @@ -3326,6 +3915,8 @@ OK を選択すると、この世界でのプレイを終了します スーパーフラット +同じ地形を再度生成するには種を入れます。ランダムな世界の場合、空欄のままにします。 + 有効にすると、オンラインのゲームになります 有効にすると、招待されたプレイヤーしか参加できません @@ -3350,6 +3941,20 @@ OK を選択すると、この世界でのプレイを終了します 有効にすると、プレイヤーの復活地点の近くに便利なアイテムの入ったチェストが出現します +無効にすると、モンスターや動物がブロックを変えることがなくなり (例: Creeper が爆発してもブロックが破壊されない、羊が草を取り除かない)、アイテムも拾いません。 + +有効にすると、ゲームオーバー時にプレイヤーの持ち物が失われません。 + +無効にすると、生き物は自然に出現しません。 + +無効にすると、モンスターや動物は戦利品をドロップしません (例: Creeper は火薬をドロップしない)。 + +無効にすると、ブロックを壊してもアイテムを落としません (例: 石ブロックが丸石を落とさない)。 + +無効にすると、プレイヤーの HP を自然に再生されません。 + +無効にすると、時刻が変わりません。 + スキン パック テーマ @@ -3398,7 +4003,49 @@ OK を選択すると、この世界でのプレイを終了します {*PLAYER*} は {*SOURCE*} に叩き潰された -{*PLAYER*} は {*SOURCE*} に倒された +{*PLAYER*} は {*SOURCE*} の魔法によって倒された + +{*PLAYER*} はハシゴから落ちた + +{*PLAYER*} は、つるから落ちた + +{*PLAYER*} は水から落ちた + +{*PLAYER*} は高いところから落ちた + +{*PLAYER*} は {*SOURCE*} によって滅びる運命にあった + +{*PLAYER*} は {*SOURCE*} によって滅びる運命にあった + +{*PLAYER*} は {*SOURCE*} の {*ITEM*} によって滅びる運命にあった + +{*PLAYER*} はあまりに高いところから落ち、{*SOURCE*} にとどめを刺された + +{*PLAYER*} はあまりに高いところから落ち、{*SOURCE*} に {*ITEM*} でとどめを刺された + +{*PLAYER*} は {*SOURCE*} と戦ううちに火の中へと進んで行った + +{*PLAYER*} は {*SOURCE*} と戦ううちにカリカリに焼かれた + +{*PLAYER*} は {*SOURCE*} から逃れるために溶岩の中を泳ごうとした + +{*PLAYER*} は {*SOURCE*} から逃れようとするうちに溺れた + +{*PLAYER*} は {*SOURCE*} から逃れようとするうちにサボテンに足を踏み入れた + +{*PLAYER*} は {*SOURCE*} に吹き飛ばされた + +{*PLAYER*} は弱り果てた + +{*PLAYER*} は {*SOURCE*} に {*ITEM*} で倒された + +{*PLAYER*} は {*SOURCE*} に {*ITEM*} で撃たれた + +{*PLAYER*} は {*SOURCE*} に {*ITEM*} で火だるまにされた + +{*PLAYER*} は {*SOURCE*} に {*ITEM*} で火だるまにされた + +{*PLAYER*} は {*SOURCE*} に {*ITEM*} で倒された 岩盤の霧 @@ -3552,7 +4199,7 @@ OK を選択すると、この世界でのプレイを終了します {*C2*}「そして僕が君を愛するのは、君自身が愛であるからだ」{*EF*}{*B*}{*B*} {*C3*}ゲームは終わり、プレイヤーは夢から目覚め、また新しい夢が始まります。次にプレイヤーが見る夢はもっと素晴らしいものでしょう。プレイヤーは宇宙であり、愛でした{*EF*}{*B*}{*B*} {*C3*}さあ、プレイヤー{*EF*}{*B*}{*B*} -{*C2*}目を覚まして{*EF*}{*B*}{*B*} +{*C2*}目を覚まして{*EF*} 暗黒界をリセットする @@ -3563,9 +4210,9 @@ OK を選択すると、この世界でのプレイを終了します 暗黒界をリセットしない -現在、Mooshroom は毛刈りできません。豚、羊、牛、ネコの数が最大数に達しました。 +現在、Mooshroom は毛刈りできません。豚、羊、牛、ネコ、馬の数が最大数に達しました。 -現在、スポーン エッグを使用できません。 豚、羊、牛、ネコの数が最大数に達しました +現在、スポーン エッグを使用できません。 豚、羊、牛、ネコ、馬の数が最大数に達しました。 現在、スポーン エッグを使用できません。 Mooshroom の数が最大数に達しました @@ -3575,6 +4222,8 @@ OK を選択すると、この世界でのプレイを終了します 現在、スポーン エッグを使用できません。 世界のイカの数が最大数に達しました +現在、スポーン エッグを使用できません。 世界の村人の数が最大数に達しました + 現在、スポーン エッグを使用できません。 世界の敵の数が最大数に達しました 現在、スポーン エッグを使用できません。 世界の村人の数が最大数に達しました @@ -3583,12 +4232,14 @@ OK を選択すると、この世界でのプレイを終了します 難易度「ピース」では敵を出現させることはできません。 -この動物は求愛モードにできません。豚、羊、牛、ネコの繁殖数が最大数に達しました +この動物は求愛モードにできません。豚、羊、牛、ネコ、馬の繁殖数が最大数に達しました。 この動物は求愛モードにできません。オオカミの繁殖数が最大数に達しました この動物は求愛モードにできません。ニワトリの繁殖数が最大数に達しました +この動物は求愛モードにできません。馬の繁殖数が最大数に達しました。 + この動物は求愛モードにできません。Mooshroom の繁殖数が最大数に達しました 世界のボートの数が最大数に達しました @@ -3616,27 +4267,43 @@ OK を選択すると、この世界でのプレイを終了します クレジット コンテンツを再インストール - + デバッグ設定 - + 火の延焼 - + TNT の爆発 - + PvP - + 高度な操作を許可 - + ホスト特権 - + 建物を生成する - + スーパーフラット - + ボーナス チェスト - + 世界のオプション - + +ゲーム オプション + +生き物による妨害 + +持ち物の保持 + +生き物の出現 + +生き物からの戦利品 + +タイルからのアイテム入手 + +自然再生 + +時刻の変化 + 建設と採掘の許可 ドアとスイッチを使用可能 @@ -3647,7 +4314,7 @@ OK を選択すると、この世界でのプレイを終了します 動物を攻撃可能 -ホストオプションを変更できる +ホストオプションを変更可能 プレイヤーを追放 @@ -3675,7 +4342,7 @@ OK を選択すると、この世界でのプレイを終了します 世界の種 -ランダムに種を決める場合、空白のままにしてください +空白のままで種をランダムに決定する プレイヤー @@ -3697,17 +4364,17 @@ OK を選択すると、この世界でのプレイを終了します ゲームに戻る -セーブ +ゲームをセーブ 難易度: -ゲームタイプ: +ゲーム タイプ: ゲーマータグ: 建物: -レベルタイプ: +レベル タイプ: PvP: @@ -3823,6 +4490,14 @@ OK を選択すると、この世界でのプレイを終了します +ウィザー + +HP ブースト + +吸収 + +飽和 + スピードの 鈍化の @@ -3861,6 +4536,14 @@ OK を選択すると、この世界でのプレイを終了します 毒の + (衰弱) + + (HP ブースト) + + (吸収) + + (飽和) + II @@ -3957,6 +4640,22 @@ OK を選択すると、この世界でのプレイを終了します プレイヤー、動物、モンスターの HP を時間とともに減少させます +適用時: + +馬のジャンプ強さ + +ゾンビの援軍 + +最大 HP + +生き物による追尾範囲 + +ノックバック耐性 + +スピード + +攻撃ダメージ + 鋭さ 聖なる力 @@ -4047,13 +4746,13 @@ OK を選択すると、この世界でのプレイを終了します 3{*ICON_SHANK_01*} 回復する。ジャガイモをかまどで調理するとできる -1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。農地に植えることができる。病気になる場合がある +1{*ICON_SHANK_01*} 回復する。病気になる場合がある 3{*ICON_SHANK_01*} 回復する。ニンジンと金の塊から作る 鞍を着けた豚に乗った時、操縦するのに使う -4{*ICON_SHANK_01*} 回復する +4{*ICON_SHANK_01*} 回復する。 武器、道具、防具をエンチャントするのに金床と一緒に使用する @@ -4445,7 +5144,7 @@ OK を選択すると、この世界でのプレイを終了します Xbox 360 -Back +戻る このオプションでは、実績およびランキング更新は無効になります。 diff --git a/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx b/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx index a084ef5d..dfa720ac 100644 --- a/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx +++ b/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx @@ -73,11 +73,11 @@ 게이머 프로필이 오프라인 상태입니다. -이 게임 기능 중 일부는 게이머 프로필로 Xbox Live에 로그인해야 이용할 수 있습니다. 현재는 오프라인 상태입니다. +이 게임 기능 중 일부는 게이머 프로필로 Xbox LIVE에 로그인해야 이용할 수 있습니다. 현재는 오프라인 상태입니다. -이 기능을 이용하려면 게이머 프로필로 Xbox Live에 로그인해야 합니다. +이 기능을 이용하려면 게이머 프로필로 Xbox LIVE에 로그인해야 합니다. -Xbox Live 연결 +Xbox LIVE 연결 오프라인으로 계속하기 diff --git a/Minecraft.Client/Common/Media/ko-KR/strings.resx b/Minecraft.Client/Common/Media/ko-KR/strings.resx index 17c67711..6516a2f4 100644 --- a/Minecraft.Client/Common/Media/ko-KR/strings.resx +++ b/Minecraft.Client/Common/Media/ko-KR/strings.resx @@ -150,7 +150,7 @@ Minecraft는 블록을 배치하여 무엇이든 상상한 대로 만들 수 있 {*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_MOVE*}을 앞으로 빠르게 두 번 누르면 질주합니다. {*CONTROLLER_ACTION_MOVE*}를 계속 누르고 있으면 질주 시간이 다 되거나 음식 막대가 {*ICON_SHANK_03*} 이하가 될 때까지 계속 질주합니다.{*B*}{*B*} {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손이나 도구를 사용해 채굴하거나 벌목합니다. 특정 블록을 채굴하려면 도구를 만들어야 할 수 있습니다.{*B*}{*B*} 손에 아이템을 들고 있다면 {*CONTROLLER_ACTION_USE*}를 눌러 사용하거나 {*CONTROLLER_ACTION_DROP*}를 눌러 버릴 수 있습니다. @@ -229,11 +229,11 @@ HUD는 체력이나 산소(물속에 있을 때), 배고픔 레벨(배고픔을 {*T3*}플레이 방법: 효과부여{*ETW*}{*B*}{*B*} 괴물 및 동물을 처치하거나 또는 특정 블록을 채굴하거나 녹여서 얻을 수 있는 경험치로 도구, 무기 및 방어구에 효과를 부여할 수 있습니다.{*B*} -검, 활, 도끼, 곡괭이, 삽 또는 방어구를 효과부여대에 놓인 책 아래에 있는 슬롯에 넣으면 슬롯 오른쪽에 각각 경험치 비용이 쓰인 단추 세 개가 나타납니다.{*B*} +검, 활, 도끼, 곡괭이, 삽 또는 방어구를 효과부여대에 놓인 책 아래에 있는 슬롯에 넣으면 슬롯 오른쪽에 각각 경험치 비용이 쓰인 단추 세 개가 나타납니다.{*B*} 효과부여에 필요한 경험치가 모자란 항목은 빨간색으로 나타나며, 그렇지 않다면 초록색으로 나타납니다.{*B*}{*B*} 실제 효과부여는 표시된 비용에 기반을 두고 무작위로 적용됩니다.{*B*}{*B*} 효과부여대가 한 블록 간격을 두고 책장에 둘러싸여 있으면(최대 책장 15개까지) 효과부여 레벨이 상승하며, 효과부여대에 놓인 책에 신비한 문양이 나타납니다.{*B*}{*B*} -효과부여대를 만들 때 쓰이는 모든 재료는 월드 안의 마을에서 찾거나 월드 안에서 채굴 및 경작을 통해 얻을 수 있습니다.{*B*} +효과부여대를 만들 때 쓰이는 모든 재료는 월드 안의 마을에서 찾거나 월드 안에서 채굴 및 경작을 통해 얻을 수 있습니다.{*B*}{*B*} 효과부여 책은 모루에서 아이템에 효과를 부여하는 데 사용합니다. 이것으로 아이템에 더 효율적으로 효과를 부여할 수 있습니다.{*B*} @@ -281,9 +281,9 @@ Xbox 360 본체용 Minecraft는 멀티 플레이 게임이 기본값으로 되 {*CONTROLLER_ACTION_DPAD_LEFT*}를 누르면 왼쪽으로 이동하고 {*CONTROLLER_ACTION_DPAD_RIGHT*}를 누르면 오른쪽으로 이동합니다. {*T3*}플레이 방법: 호스트 및 플레이어 옵션{*ETW*}{*B*}{*B*} - + {*T1*}게임 옵션{*ETW*}{*B*} -월드를 불러오거나 새로 만들 때 "추가 옵션" 단추를 누르면 게임의 세부 사항을 조정할 수 있는 메뉴가 열립니다.{*B*}{*B*} +월드를 불러오거나 새로 만들 때 "추가 옵션"을 누르면 게임의 세부 사항을 조정할 수 있는 메뉴가 열립니다.{*B*}{*B*} {*T2*}플레이어 대 플레이어{*ETW*}{*B*} 이 옵션을 켜면 플레이어가 다른 플레이어를 공격할 수 있습니다. 생존 모드에만 적용됩니다.{*B*}{*B*} @@ -300,6 +300,27 @@ Xbox 360 본체용 Minecraft는 멀티 플레이 게임이 기본값으로 되 {*T2*}호스트 특권{*ETW*}{*B*} 이 옵션을 켜면 호스트는 게임 메뉴에서 플레이어에게 비행 능력을 주거나, 지치지 않게 하거나, 투명하게 만들 수 있습니다.{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}시간대 전환{*ETW*}{*B*} + 비활성화하면 시간대가 변하지 않습니다.{*B*}{*B*} + + {*T2*}소지품 유지{*ETW*}{*B*} + 활성화하면 플레이어가 죽어도 소지품의 아이템을 잃지 않습니다.{*B*}{*B*} + + {*T2*}괴물 생성{*ETW*}{*B*} + 비활성화하면 괴물이나 동물이 자연적으로 생성되지 않습니다.{*B*}{*B*} + + {*T2*}괴물에 의한 괴롭힘{*ETW*}{*B*} + 비활성화하면 몬스터와 동물이 블록을 교체하거나 아이템을 집지 못하게 합니다. 예를 들어 Creeper가 폭발해도 블록이 파괴되지 않으며, 양은 풀을 제거하지 못합니다.{*B*}{*B*} + + {*T2*}괴물 전리품{*ETW*}{*B*} + 비활성화하면 괴물과 동물이 전리품을 떨어트리지 않습니다. 예를 들어 Creeper가 화약을 떨어트리지 않습니다.{*B*}{*B*} + + {*T2*}타일 아이템{*ETW*}{*B*} + 비활성화하면 블록이 파괴돼도 아이템을 떨어트리지 않습니다. 예를 들어 돌 블록에서 조약돌을 얻을 수 없습니다.{*B*}{*B*} + + {*T2*}자연 재생{*ETW*}{*B*} + 비활성화하면 플레이어의 체력이 자연적으로 재생되지 않습니다.{*B*}{*B*} + {*T1*}월드 생성 옵션{*ETW*}{*B*} 새 월드를 생성할 때 선택할 수 있는 추가 옵션입니다.{*B*}{*B*} @@ -316,13 +337,13 @@ Xbox 360 본체용 Minecraft는 멀티 플레이 게임이 기본값으로 되 이 옵션을 켜면 지하가 재건됩니다. 사전에 지하 요새가 없는 곳에 미리 저장하면 유용합니다.{*B*}{*B*} {*T1*}게임 메뉴 옵션{*ETW*}{*B*} - 게임 플레이 중에 {*BACK_BUTTON*} 단추를 눌러서 게임 메뉴로 이동한 다음 사용할 수 있는 옵션입니다.{*B*}{*B*} + 게임 플레이 중에 {*BACK_BUTTON*}을 눌러 게임 메뉴로 이동한 다음 사용할 수 있는 옵션입니다.{*B*}{*B*} {*T2*}호스트 옵션{*ETW*}{*B*} 호스트 플레이어나 관리자로 설정된 플레이어는 "호스트 옵션" 메뉴에 들어갈 수 있습니다. 이 메뉴에서 불 확산과 TNT 폭발을 켜거나 끌 수 있습니다.{*B*}{*B*} {*T1*}플레이어 옵션{*ETW*}{*B*} -플레이어의 행동 권한을 변경하려면 플레이어 이름을 선택하고 {*CONTROLLER_VK_A*} 단추를 눌러 플레이어 특권 메뉴에서 다음 옵션을 조정하십시오.{*B*}{*B*} +플레이어의 행동 권한을 변경하려면 플레이어 이름을 선택하고 {*CONTROLLER_VK_A*}를 눌러 플레이어 특권 메뉴에서 다음 옵션을 조정하십시오.{*B*}{*B*} {*T2*}건설 및 채광 가능{*ETW*}{*B*} 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 켜면 플레이어는 월드에서 일반적인 행동을 모두 할 수 있습니다. 이 옵션을 끄면 플레이어는 블록을 놓거나 파괴하지 못합니다.{*B*}{*B*} @@ -340,27 +361,29 @@ Xbox 360 본체용 Minecraft는 멀티 플레이 게임이 기본값으로 되 이 옵션은 "플레이어 신뢰"를 껐을 때만 사용할 수 있습니다. 이 옵션을 끄면 플레이어는 동물에게 피해를 줄 수 없습니다.{*B*}{*B*} {*T2*}관리자{*ETW*}{*B*} - 이 옵션을 켜면 플레이어는 다른 플레이어의 특권을 변경할 수 있습니다(호스트 제외). “플레이어 신뢰”를 끄면 플레이어를 추방하거나 불 확산과 TNT 폭발을 켜거나 끌 수 있습니다.{*B*}{*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*} - 플레이어가 플레이어 자신 또는 다른 플레이어를 월드 내 다른 곳으로 이동시킬 수 있습니다. + + {*T2*}순간이동 가능{*ETW*}{*B*} + 플레이어가 플레이어 자신 또는 다른 플레이어를 월드 내 다른 곳으로 이동시킬 수 있습니다. +호스트 플레이어와 같은 {*PLATFORM_NAME*} 본체로 플레이하는 플레이어를 제외하고, 이 옵션을 선택하면 다른 {*PLATFORM_NAME*} 본체로 접속하는 플레이어를 추방할 수 있습니다. 추방당한 플레이어는 게임이 새로 시작되기 전까지 다시 참가할 수 없습니다. + 다음 페이지 이전 페이지 @@ -426,61 +449,95 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E {*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*} +- 새로운 아이템 추가 - 단단한 찰흙, 색상 찰흙, 석탄 블록, 건초 더미, 작동기 레일, 레드스톤 블록, 일광 센서, 드로퍼, 호퍼, 호퍼가 부착된 광물 수레, TNT가 실린 광물 수레, 레드스톤 비교 회로, 압력판, 신호기, 함정 상자, 폭죽 로켓, 폭죽 별, 지옥의 별, 끈, 말 방어구, 이름 태그, 말 생성 알{*B*} +- 새로운 괴물 추가 - 위더, 말라비틀어진 해골, 마녀, 박쥐, 말, 당나귀 및 노새{*B*} +- 새로운 지역 생성 기능 추가 - 마녀 오두막{*B*} +- 신호기 인터페이스가 추가됩니다.{*B*} +- 말 인터페이스가 추가됩니다.{*B*} +- 호퍼 인터페이스가 추가됩니다.{*B*} +- 폭죽 추가 - 폭죽 별이나 폭죽 로켓 재료를 가지고 있으면 작업대에서 폭죽 인터페이스가 활성화됩니다.{*B*} +- '모험 모드' 추가 - 올바른 도구로만 블록을 깰 수 있습니다.{*B*} +- 새로운 사운드가 다수 추가됩니다.{*B*} +- 이제 괴물 및 동물, 아이템, 발사체가 차원문을 통과할 수 있습니다.{*B*} +- 이제 탐지기 옆에 다른 탐지기로 동력을 공급해 잠글 수 있습니다.{*B*} +- 좀비와 해골이 다른 무기와 방어구를 가지고 생성될 수 있습니다.{*B*} +- 새로운 사망 메시지가 추가됩니다.{*B*} +- 이름 태그로 괴물 및 동물에 이름을 붙일 수 있으며, 보관함 이름을 변경하여 메뉴를 열었을 때 표시되는 제목을 바꿀 수 있습니다.{*B*} +- 뼛가루는 더 이상 모든 것을 최대 크기로 즉시 성장시키지 않으며, 무작위로 여러 단계에 걸쳐 성장시킵니다.{*B*} +- 레드스톤 비교 회로를 직접 부착해서 상자, 양조대, 디스펜서, 주크박스 내용물을 알려주는 레드스톤 신호를 감지할 수 있습니다.{*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*} +새로운 기능이 많이 추가됐습니다. 추가된 주요 기능 일부를 소개해 드리니 읽어보고 신 나는 게임의 세계로 여행을 떠나십시오!{*B*}{*B*} +{*T1*}New Items{*ETB*} - 단단한 찰흙, 색상 찰흙, 석탄 블록, 건초 더미, 작동기 레일, 레드스톤 블록, 일광 센서, 드로퍼, 호퍼, 호퍼가 부착된 광물 수레, TNT가 실린 광물 수레, 레드스톤 비교 회로, 압력판, 신호기, 함정 상자, 폭죽 로켓, 폭죽 별, 지옥의 별, 끈, 말 방어구, 이름 태그, 말 생성 알{*B*}{*B*} +{*T1*} 새로운 괴물 및 동물 {*ETB*} - 위더, 말라비틀어진 해골, 마녀, 박쥐, 말, 당나귀 및 노새{*B*}{*B*} +{*T1*} 새로운 기능 {*ETB*} - 말 길들이기 및 타기, 폭죽 만들어 터뜨리기, 이름 태그로 동물 및 괴물에 이름 붙이기, 보다 고성능의 레드스톤 회로 만들기, 손님이 자신의 월드에서 할 수 있는 행동을 제어하는 새로운 호스트 옵션 {*B*}{*B*} +{*T1*} 새로운 튜토리얼 월드 {*ETB*} – 기존 및 새 기능의 사용법을 튜토리얼 월드에서 배우십시오. 또한 월드에 숨겨진 모든 비밀 음반 찾기에도 도전해 보십시오!{*B*}{*B*} + + +{*T3*}플레이 방법: 말{*ETW*}{*B*}{*B*} +말과 당나귀는 주로 탁 트인 평원에서 찾을 수 있습니다. 노새는 당나귀와 말의 새끼이지만 번식 능력이 없습니다.{*B*} +다 자란 말과 당나귀, 노새는 타고 다닐 수 있습니다. 하지만 방어구는 말에게만 입힐 수 있으며, 아이템 운반에 필요한 안장 가방은 당나귀와 노새에게만 착용시킬 수 있습니다.{*B*}{*B*} +말과 당나귀, 노새는 길을 들여야 사용할 수 있습니다. 말은 타려고 시도함으로써 길을 들일 수 있지만, 이 과정에서 말은 기수를 떨어트리려고 할 것이므로 말등에 잘 타고 있어야 합니다.{*B*} +길이 들면 주변에 하트 표시가 나타나며, 더 이상 기수를 떨어트리려고 하지 않습니다. 말의 방향을 조정하려면 안장을 착용시켜야 합니다.{*B*}{*B*} +안장은 마을 주민으로부터 구매하거나 곳곳에 숨겨진 상자에 들어 있습니다.{*B*} +길이 든 당나귀와 노새에 상자를 부착하면 안장 가방을 달아줄 수 있습니다. 이 가방은 당나귀 또는 노새를 타거나 수그린 상태에서 사용 가능합니다.{*B*}{*B*} +말과 당나귀(노새 제외)는 황금 사과나 황금 당근을 사용해 다른 동물들처럼 교배할 수 있습니다.{*B*} +망아지는 시간이 지나면 성장하여 말이 되며, 밀이나 건초를 먹이면 성장 시간이 단축됩니다.{*B*} + + +신호기 + +{*T3*}플레이 방법: 신호기{*ETW*}{*B*}{*B*} +작동하는 신호기는 하늘로 밝은 광선을 쏘아 올리고 주변 플레이어에게 능력을 부여합니다.{*B*} +신호기는 위더를 잡고 얻을 수 있는 유리와 흑요석, 지옥의 별로 만듭니다.{*B*}{*B*} +신호기는 낮에 햇빛을 받을 수 장소에 놓아야 하며, 반드시 철, 황금, 에메랄드 및 다이아몬드 등의 피라미드 위에 설치해야 합니다.{*B*} +하지만 어떤 재료를 선택해도 신호기의 능력에는 영향을 주지 않습니다.{*B*}{*B*} +신호기 메뉴에서 신호기의 주 능력 1개를 선택할 수 있습니다. 피라미드의 층수가 많을수록 능력 선택의 폭이 더 넓어집니다.{*B*} +4층 이상 되는 피라미드 위의 신호기는 보조 능력인 '재생'이나 주 능력 강화 중 한 가지를 추가로 선택할 수 있습니다.{*B*}{*B*} +신호기의 능력을 설정하려면 지불 슬롯에 에메랄드, 다이아몬드, 황금 또는 철 주괴를 넣어야 합니다.{*B*} +재료를 넣으면 신호기에서 능력이 무기한으로 발동됩니다.{*B*} + + +폭죽 + +{*T3*}플레이 방법: 폭죽{*ETW*}{*B*}{*B*} +폭죽은 손이나 디스펜서로 발사할 수 있는 장식 아이템이며, 기본 재료인 종이와 화약에 폭죽 별을 부가적으로 더해 만들 수 있습니다.{*B*} +폭죽 별을 만들 때 추가 재료를 넣으면 색상과 사라지는 형태, 모양, 크기, 효과(궤적이나 반짝임 등)를 원하는 대로 바꿀 수 있습니다.{*B*}{*B*} +폭죽을 만들려면 소지품 위 3x3 제작칸에 화약과 종이를 넣으십시오.{*B*} +제작칸에 폭죽 별 여러 개를 추가로 넣어 폭죽에 조합할 수 있습니다.{*B*} +제작칸 슬롯에 화약을 더 많이 채우면 폭죽 별이 폭발하는 높이가 증가합니다.{*B*}{*B*} +그런 다음 결과물 슬롯 밖으로 완성된 폭죽을 꺼낼 수 있습니다.{*B*}{*B*} +폭죽 별은 화약과 염료를 제작칸에 넣어 만들 수 있습니다.{*B*} + – 염료는 폭죽 별이 폭발할 때의 색상을 결정합니다.{*B*} + – 폭죽 별의 모양은 불쏘시개, 금덩이, 깃털, 괴물 머리를 추가해 바꿀 수 있습니다.{*B*} + – 다이아몬드나 발광석 가루를 사용하면 궤적이나 반짝임 효과가 추가됩니다.{*B*}{*B*} +폭죽 별을 만든 후에는 염료와 함께 조합해, 폭발 후 사라질 때의 색상을 조절할 수 있습니다. + + +호퍼 + +{*T3*}플레이 방법: 호퍼{*ETW*}{*B*}{*B*} +호퍼는 보관함에 아이템을 넣거나 빼고, 보관함 안에 들어간 아이템을 자동으로 집습니다.{*B*} +호퍼는 양조대, 상자, 디스펜서, 드로퍼, 상자가 든 광물 수레, 호퍼가 부착된 광물 수레, 다른 호퍼에 영향을 줄 수 있습니다.{*B*}{*B*} +호퍼는 그 위에 설치된 적절한 보관함으로부터 계속 아이템을 빨아들이려고 시도합니다. 또한 보관된 아이템을 배출구 쪽 보관함에 넣으려고 합니다.{*B*} +호퍼에 레드스톤의 동력이 공급되면 작동을 멈추고 아이템 빨아들이기와 넣기를 중지합니다.{*B*}{*B*} +호퍼는 아이템을 내보내려는 방향을 가리킵니다. 호퍼가 특정 블록을 가리키게 하려면 호퍼를 해당 블록과 대치되는 방향에 설치하십시오.{*B*} + + + +드로퍼 + +{*T3*}플레이 방법: 드로퍼{*ETW*}{*B*}{*B*} +드로퍼에 레드스톤의 동력이 주입되면 그 안에 든 아이템 하나를 무작위로 땅에 떨어트립니다. {*CONTROLLER_ACTION_USE*}을(를) 눌러 드로퍼를 열면 소지품의 아이템을 드로퍼에 넣을 수 있습니다.{*B*} +드로퍼가 상자나 다른 종류의 보관함을 향해 놓였다면 아이템은 땅이 아니라 해당 상자 안에 들어갑니다. 드로퍼 여러 개를 길게 연결하면 먼 거리로 아이템을 보낼 수 있으며, 이 기능을 작동시키려면 각 드로퍼에 별도로 동력을 공급하거나 차단해야 합니다. + + 맨손 공격보다 위력이 강합니다. 손을 사용하는 것보다 흙, 잡초, 모래, 자갈, 눈을 더 빨리 파냅니다. 눈덩이를 파내려면 삽이 필요합니다. @@ -606,10 +663,36 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 지도를 들고 있을 동안 탐험한 지역의 이미지를 만들어냅니다. 길을 찾는 데 사용할 수 있습니다. +사용하면 현재 속한 월드의 지도 일부가 되며, 지역을 탐험하면 나머지 부분이 채워집니다. + 화살과 함께 사용하여 원거리 공격을 합니다. 활에 장전하여 사용합니다. +위더에게서 얻을 수 있으며 신호기의 재료로 사용합니다. + +작동하면 화려한 색의 폭발을 일으킵니다. 색상과 효과, 모양과 사라지는 패턴은 폭죽을 만들 때 사용한 폭죽 별에 따라 결정됩니다. + +폭죽의 색상, 효과, 모양을 결정하는 재료입니다. + +레드스톤 회로에 사용하여 신호 강도를 유지, 비교, 낮추거나 특정 블록 상태를 측정합니다. + +움직이는 TNT 블록처럼 작동하는 광물 수레의 한 종류입니다. + +햇빛이 있거나 없음에 따라 레드스톤 신호를 발산하는 블록입니다. + +호퍼와 비슷하게 작동하는 특별한 광물 수레입니다. 트랙에 있는 아이템을 주워 담거나 수레 위에 있는 보관함에서 아이템을 빼냅니다. + +말에 입힐 수 있는 특별한 방어구입니다. 방어력이 5 증가합니다. + +말에 입힐 수 있는 특별한 방어구입니다. 방어력이 7 증가합니다. + +말에 입힐 수 있는 특별한 방어구입니다. 방어력이 11 증가합니다. + +괴물 및 동물을 플레이어나 울타리에 매어둡니다. + +괴물 및 동물 이름 짓기에 사용됩니다. + {*ICON_SHANK_01*}를 2.5만큼 회복합니다. {*ICON_SHANK_01*}를 1만큼 회복합니다. 효과가 6번까지 중복됩니다. @@ -934,100 +1017,158 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 괴물 머리는 장식용으로 놓아둘 수도 있고, 투구 슬롯에 놓아 마스크로 쓸 수도 있습니다. +명령을 실행하는 데 사용합니다. + +하늘로 광선을 발사하고 주변 플레이어에게 상태 효과를 부여합니다. + +안에 블록과 아이템을 보관합니다. 상자 2개를 나란히 붙이면 용량이 2배인 큰 상자가 만들어집니다. 함정 상자는 열었을 때 레드스톤 전기도 발생시킵니다. + +레드스톤 전기를 발생시킵니다. 아이템이 많이 올려져 있으면 전기가 강해집니다. + +레드스톤 전기를 발생시킵니다. 아이템이 많이 올려져 있으면 전기가 강해집니다. 가벼운 발판보다 무거운 무게를 필요로 합니다. + +레드스톤의 동력원으로 사용됩니다. 다시 레드스톤으로 변환할 수 있습니다. + +아이템을 잡거나 보관함 안으로 또는 밖으로 아이템을 옮기는 데 사용합니다. + +호퍼가 부착된 광물 수레를 사용 가능 또는 불가능하게 하고 TNT가 실린 광물 수레를 작동시킬 수 있는 레일입니다. + +레드스톤 전기를 흘리면 아이템을 잡고 있거나, 떨어트리거나, 다른 보관함으로 아이템을 밀어보냅니다. + +단단한 찰흙으로 만든 색이 화려한 블록입니다. + +말, 당나귀, 노새에게 먹여 체력을 10 회복시킵니다. 망아지가 더 빨리 성장하게 합니다. + +화로에서 찰흙을 제련해서 만듭니다. + +유리와 염료로 만듭니다. + +스테인드글라스로부터 만듭니다. + +석탄을 보관할 수 있는 편리한 방법입니다. 화로에서 연료로 사용할 수 있습니다. + 오징어 - + 잡으면 먹물 주머니를 얻을 수 있습니다. - + - + 잡으면 가죽을 얻을 수 있습니다. 또한 우유를 짜서 양동이에 담을 수 있습니다. - + - + 가위를 사용하면 양털을 얻을 수 있습니다. 이미 털을 깎았다면 양털이 나오지 않습니다. 털을 염색하여 색을 바꿀 수 있습니다. - + - + 잡으면 깃털이 나옵니다. 가끔 알을 낳습니다. - + 돼지 - + 잡으면 돼지고기를 얻을 수 있습니다. 안장을 사용하면 타고 다닐 수 있습니다. - + 늑대 - + 공격받기 전까지는 위협적이지 않으며, 공격하면 뒤를 습격합니다. 뼈를 이용해서 길들이면 데리고 다닐 수 있으며, 플레이어를 공격하는 대상을 공격합니다. - + Creeper - + 가까이 다가가면 폭발합니다! - + 해골 - + 플레이어에게 화살을 쏩니다. 처치하면 화살을 떨어뜨립니다. - + 거미 - + 가까이 다가가면 공격합니다. 벽을 타고 오를 수 있으며, 처치하면 실을 떨어뜨립니다. - + 좀비 - + 가까이 다가가면 공격합니다. - + Pigman 좀비 - + 먼저 공격하지 않지만, 공격을 받으면 무리를 지어 달려듭니다. - + Ghast - + 닿으면 폭발하는 불덩어리를 던집니다. - + 슬라임 - + 피해를 입으면 작은 슬라임으로 분리됩니다. - + Enderman - + 플레이어가 바라보면 공격합니다. 블록을 들어 옮길 수도 있습니다. - + Sliverfish - + 공격하면 근처의 Sliverfish를 끌어들입니다. 돌 블록에 숨어 있습니다. - + 동굴 거미 - + 독이 있습니다. - + Mooshroom - + 그릇과 함께 사용하면 버섯죽을 만들 수 있습니다. 가위를 사용하면 버섯을 떨어뜨리고 보통 소가 됩니다. - + 눈 골렘 - + 플레이어는 눈 블록과 호박을 사용해 눈 골렘을 만들 수 있습니다. 눈 골렘은 플레이어의 적에게 눈덩이를 던집니다. - + Ender 드래곤 - + Ender에서 찾아볼 수 있는 거대한 검은색 드래곤입니다. - + Blaze - + 주로 지하 요새에서 찾아볼 수 있는 적입니다. 죽으면 Blaze 막대를 떨어뜨립니다. - + 마그마 큐브 - + 지하에서 찾아볼 수 있습니다. 슬라임처럼 죽으면 분열하여 여러 개의 조그만 큐브가 됩니다. - + 마을 사람 - + 오셀롯 - + 정글에서 찾을 수 있으며 날생선을 먹여서 조련이 가능합니다. 이때 갑자기 움직이면 오셀롯이 겁을 먹고 도망치기 때문에, 오셀롯이 다가오게 만들어야 합니다. - + 철 골렘 - + 마을을 보호하기 위해 나타납니다. 철 블록과 호박으로 만들 수 있습니다. - + +박쥐 + +이 날아다니는 동물은 동굴이나 그 외의 넓고 폐쇄된 공간에서 발견됩니다. + +마녀 + +늪에서 만날 수 있는 이 적은 물약을 던지며 공격합니다. 처치하면 물약을 떨어트립니다. + + + +이 동물은 길들여서 타고 다닐 수 있습니다. + +당나귀 + +이 동물은 길들여서 타고 다닐 수 있으며, 상자를 달아줄 수 있습니다. + +노새 + +말과 당나귀를 교배시켜 낳습니다. 이 동물은 길들여서 타고 다닐 수 있으며 상자를 달아줄 수 있습니다. + +좀비 말 + +해골 말 + +위더 + +위더의 해골과 영혼 모래로 만듭니다. 플레이어를 향해 폭발하는 해골을 발사합니다. + Explosives Animator Concept Artist @@ -1042,7 +1183,7 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E Rest of Mojang Office -리드 게임 프로그래머 Minecraft PC +Lead Game Programmer Minecraft PC Code Ninja @@ -1374,6 +1515,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 지도 +빈 지도 + 음악 디스크 - "13" 음악 디스크 - "cat" @@ -1476,6 +1619,28 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E Creeper 머리 +지옥의 별 + +폭죽 로켓 + +폭죽 별 + +레드스톤 비교 회로 + +TNT가 실린 광물 수레 + +호퍼가 부착된 광물 수레 + +철제 말 방어구 + +황금 말 방어구 + +다이아몬드 말 방어구 + + + +이름 태그 + 잡초 블록 @@ -1492,6 +1657,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 정글 나무 판자 +나무 판자(종류 무관) + 묘목 참나무 묘목 @@ -1828,6 +1995,190 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 두개골 +명령 블록 + +신호기 + +함정 상자 + +가벼운 압력판 + +무거운 압력판 + +레드스톤 비교 회로 + +일광 센서 + +레드스톤 블록 + +호퍼 + +작동기 레일 + +드로퍼 + +색상 찰흙 + +건초 더미 + +단단한 찰흙 + +석탄 블록 + +검은색 찰흙 + +빨간색 찰흙 + +녹색 찰흙 + +갈색 찰흙 + +파란색 찰흙 + +자주색 찰흙 + +청록색 찰흙 + +밝은 회색 찰흙 + +회색 찰흙 + +분홍색 찰흙 + +라임색 찰흙 + +노란색 찰흙 + +밝은 파란색 찰흙 + +자홍색 찰흙 + +주황색 찰흙 + +흰색 찰흙 + +스테인드글라스 + +검은색 스테인드글라스 + +빨간색 스테인드글라스 + +녹색 스테인드글라스 + +갈색 스테인드글라스 + +파란색 스테인드글라스 + +자주색 스테인드글라스 + +청록색 스테인드글라스 + +밝은 회색 스테인드글라스 + +회색 스테인드글라스 + +분홍색 스테인드글라스 + +라임색 스테인드글라스 + +노란색 스테인드글라스 + +밝은 파란색 스테인드글라스 + +자홍색 스테인드글라스 + +주황색 스테인드글라스 + +흰색 스테인드글라스 + +스테인드글라스 판유리 + +검은색 스테인드글라스 판유리 + +빨간색 스테인드글라스 판유리 + +녹색 스테인드글라스 판유리 + +갈색 스테인드글라스 판유리 + +파란색 스테인드글라스 판유리 + +자주색 스테인드글라스 판유리 + +청록색 스테인드글라스 판유리 + +밝은 회색 스테인드글라스 판유리 + +회색 스테인드글라스 판유리 + +분홍색 스테인드글라스 판유리 + +라임색 스테인드글라스 판유리 + +노란색 스테인드글라스 판유리 + +밝은 파란색 스테인드글라스 판유리 + +자홍색 스테인드글라스 판유리 + +주황색 스테인드글라스 판유리 + +흰색 스테인드글라스 판유리 + +작은 공 + +큰 공 + +별 모양 + +Creeper 모양 + +폭발 + +알 수 없는 모양 + +검은색 + +빨간색 + +녹색 + +갈색 + +파란색 + +자주색 + +청록색 + +밝은 회색 + +회색 + +분홍색 + +라임색 + +노란색 + +밝은 파란색 + +자홍색 + +주황색 + +흰색 + +사용자 지정 + +사라지는 패턴: + +반짝임 + +궤적 + +효과 시간: +  현재 컨트롤 배치 @@ -1854,9 +2205,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 버리기 -살금살금 걷기 +조용히 걷기 -살금살금 걷기/아래로 비행 +조용히 걷기/아래로 비행 카메라 모드 변경 @@ -2005,8 +2356,7 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 이곳은 소지품입니다. 이 화면에는 손에 들고 쓸 수 있는 아이템과 가지고 다닐 수 있는 아이템이 모두 표시됩니다. 방어력 또한 이 화면에서 확인할 수 있습니다. - - + {*B*} 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} 소지품 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. @@ -2027,7 +2377,7 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E - 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_VK_RT*}를 누르십시오. + 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_ACTION_MENU_PAGEDOWN*}을 누르십시오. @@ -2061,7 +2411,7 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E - 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_VK_RT*}를 누르십시오. + 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_ACTION_MENU_PAGEDOWN*}을 누르십시오. @@ -2608,6 +2958,211 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 음식 막대와 음식 먹는 법에 대해 이미 알고 있다면{*CONTROLLER_VK_B*} 단추를 누르십시오. + + 여기는 말 소지품 인터페이스입니다. + + + + {*B*}계속하려면 {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}말 소지품에 대해 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 말 소지품은 말, 당나귀, 노새에 아이템을 옮기거나 착용시킬 수 있게 해줍니다. + + + + 안장 슬롯에 안장을 넣어 말에 안장을 채울 수 있습니다. 방어구 슬롯에 방어구를 넣으면 말이 방어구를 착용해 방어력이 오릅니다. + + + + 이 메뉴에서 자신의 소지품과, 당나귀 또는 노새에 달린 안장 가방의 아이템을 교환할 수 있습니다. + + +말을 찾았습니다. + +당나귀를 찾았습니다. + +노새를 찾았습니다. + + + {*B*}{*CONTROLLER_VK_A*}를 누르면 말과 당나귀, 노새에 대해 더 알아볼 수 있습니다. + {*B*}말과 당나귀, 노새에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 말과 당나귀는 주로 넓은 평지에서 발견됩니다. 노새는 말과 당나귀를 교배시켜 얻을 수 있지만, 노새 자체는 교배 능력이 없습니다. + + + + 다 자란 말과 당나귀, 노새는 타고 다닐 수 있습니다. 하지만 방어구는 말에게만 입힐 수 있으며, 아이템 운반에 필요한 안장 가방은 당나귀와 노새에게만 착용시킬 수 있습니다. + + + + 말과 당나귀, 노새는 길을 들여야 사용할 수 있습니다. 말은 타려고 시도하면서, 기수를 떨어트리려는 말에 대항해 단단히 붙잡은 채 타고 있으면 길을 들일 수 있습니다. + + + + 길이 들면 주변에 하트 표시가 나타나며, 더 이상 기수를 떨어트리려고 하지 않습니다. + + + + 지금 말타기를 시도해 보십시오. 손에 아이템이나 도구를 들지 않은 채로 {*CONTROLLER_ACTION_USE*}을 조작하면 올라탑니다. + + + + 말의 방향을 조정하려면 안장을 착용시켜야 합니다. 안장은 마을 주민으로부터 구매하거나 곳곳에 숨겨진 상자에 들어 있습니다. + + + + 길이 든 당나귀와 노새에 상자를 부착하면 안장 가방을 달아줄 수 있습니다. 이 가방은 당나귀 또는 노새를 타거나 몸을 수그린 상태에서 사용 가능합니다. + + + + 말과 당나귀(노새 제외)는 황금 사과나 황금 당근을 사용해 다른 동물들처럼 교배할 수 있습니다. 망아지는 시간이 지나면 성장하여 말이 되며, 밀이나 건초를 먹이면 성장 시간이 단축됩니다. + + + + 이곳에서 말과 당나귀 길들이기를 시도할 수 있으며, 주변의 상자에는 안장과 말 방어구를 비롯해 말에게 사용할 수 있는 유용한 아이템도 들어있습니다. + + + + 이것은 신호기 인터페이스입니다. 여기서 신호기의 능력을 선택할 수 있습니다. + + + + {*B*}계속하려면 {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}신호기 인터페이스 사용 방법을 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 신호기 메뉴에서 신호기의 주 능력 1개를 선택할 수 있습니다. 피라미드의 층수가 많을수록 능력 선택의 폭이 더 넓어집니다. + + + + 4층 이상 되는 피라미드 위의 신호기는 보조 능력인 '재생'이나 주 능력 강화 중 한 가지를 추가로 선택할 수 있습니다. + + + + 신호기의 능력을 설정하려면 지불 슬롯에 에메랄드, 다이아몬드, 황금 또는 철 주괴를 넣어야 합니다. 재료를 넣으면 신호기에서 능력이 무기한으로 발동됩니다. + + +이 피라미드 꼭대기에는 정지한 신호기가 있습니다. + + + {*B*}신호기에 대해 더 알아보려면 {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}신호기에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 작동하는 신호기는 하늘로 밝은 광선을 쏘아올리고 주변 플레이어에게 능력을 부여합니다. 신호기는 위더를 잡고 얻을 수 있는 유리와 흑요석, 지옥의 별로 만듭니다. + + + + 신호기는 낮에 햇빛을 받을 수 장소에 놓아야 하며, 반드시 철, 황금, 에메랄드 및 다이아몬드 등의 피라미드 위에 설치해야 합니다. 하지만 어떤 재료를 선택해도 신호기의 능력에는 영향을 주지 않습니다. + + + + 신호기를 사용해 능력을 설정해 보십시오. 제공되는 철 주괴를 대가로 지불할 수 있습니다. + + +여기에는 호퍼가 있습니다. + + + {*B*}호퍼에 대해 더 알아보려면 {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}호퍼에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 호퍼는 보관함에 아이템을 넣거나 빼고, 보관함 안에 들어간 아이템을 자동으로 집습니다. + + + + 호퍼는 양조대, 상자, 디스펜서, 드로퍼, 상자가 든 광물 수레, 호퍼가 부착된 광물 수레, 다른 호퍼에 영향을 줄 수 있습니다. + + + + 호퍼는 그 위에 설치된 적절한 보관함으로부터 계속 아이템을 빨아들이려고 시도합니다. 또한 보관된 아이템을 배출구 쪽 보관함에 넣으려고 합니다. + + + + 하지만 호퍼에 레드스톤의 동력이 공급되면 작동을 멈추고 아이템 빨아들이기와 넣기를 중지합니다. + + + + 호퍼는 아이템을 내보내려는 방향을 가리킵니다. 호퍼가 특정 블록을 가리키게 하려면 호퍼에 아이템이 들어있을 때 해당 블록과 대치되는 방향에 설치하십시오. + + + + 이곳에서 호퍼 배열을 확인하고 실험해볼 수 있습니다. + + + + 이것은 폭죽 인터페이스입니다. 여기에서 폭죽과 폭죽 별을 만들 수 있습니다. + + + + {*B*}계속하려면 {*CONTROLLER_VK_A*}를 누르십시오. + {*B*} 폭죽 인터페이스 사용 방법을 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 폭죽을 만들려면 소지품 위 3x3 제작칸에 화약과 종이를 넣으십시오. + + + + 제작칸에 폭죽 별 여러 개를 추가로 넣어 폭죽에 섞을 수 있습니다. + + + + 제작칸 슬롯에 화약을 더 많이 채우면 폭죽 별이 폭발하는 높이가 증가합니다. + + + + 그런 다음 결과물 슬롯 밖으로 완성된 폭죽을 꺼낼 수 있습니다. + + + + 폭죽 별은 화약과 염료를 제작칸에 넣어 만들 수 있습니다. + + + + 염료는 폭죽 별이 폭발할 때의 색상을 결정합니다. + + + + 폭죽 별의 모양은 불쏘시개, 금덩이, 깃털, 괴물 머리를 추가해 바꿀 수 있습니다. + + + + 다이아몬드나 발광석 가루를 사용하면 궤적이나 반짝임 효과가 추가됩니다. + + + + 폭죽 별을 만든 후에는 염료와 함께 조합해, 폭발 후 사라질 때의 색상을 조절할 수 있습니다. + + + + 이 상자들에는 폭죽을 만드는 데 쓸 수 있는 다양한 아이템이 들어있습니다! + + + + {*B*}폭죽에 대해 더 알아보려면 {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}폭죽에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 폭죽은 손이나 디스펜서로 발사할 수 있는 장식 아이템이며, 기본 재료인 종이와 화약에 폭죽 별을 부가적으로 더해 만들 수 있습니다. + + + + 폭죽 별을 만들 때 추가 재료를 넣으면 색상과 사라지는 형태, 모양, 크기, 효과(궤적이나 반짝임 등)를 원하는 대로 바꿀 수 있습니다. + + + + 작업대에서 상자에 든 재료들을 이용해 폭죽을 만들어 보십시오. + +  선택 사용 @@ -2812,9 +3367,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 블록 -페이지 위로 +페이지 올림 -페이지 아래로 +페이지 내림 사랑 모드 @@ -2830,6 +3385,22 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E Xbox One 저장 데이터 업로드 +타기 + +내리기 + +상자 달기 + +발사 + +줄 묶기 + +놓기 + +부착 + +이름 + 확인 취소 @@ -3144,6 +3715,20 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 디스펜서 + + +드로퍼 + +호퍼 + +신호기 + +주 능력 + +보조 능력 + +광물 수레 + 현재 이 게임에서 구매할 수 있는 해당 유형의 다운로드 콘텐츠가 없습니다. %s님이 게임에 참가했습니다. @@ -3303,10 +3888,14 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 게임 모드: 창작 +게임 모드: 모험 + 생존 창작 +모험 + 생존 모드에서 생성 창작 모드에서 생성 @@ -3327,6 +3916,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 완전평면 +시드를 입력해서 같은 지역을 만드십시오. 공백으로 두면 무작위 월드가 생성됩니다. + 이 옵션을 켜면 온라인 게임으로 플레이합니다. 이 옵션을 켜면 초대받은 플레이어만 게임에 참가할 수 있습니다. @@ -3351,6 +3942,20 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 이 옵션을 켜면 쓸모있는 아이템이 든 상자가 플레이어 생성 지점 근처에 나타납니다. +비활성화하면 몬스터와 동물이 블록을 교체하거나 아이템을 집지 못하게 합니다. 예를 들어 Creeper가 폭발해도 블록이 파괴되지 않으며, 양은 풀을 제거하지 못합니다. + +활성화하면 플레이어가 죽어도 소지품의 아이템을 잃지 않습니다. + +비활성화하면 괴물이나 동물이 자연적으로 생성되지 않습니다. + +비활성화하면 괴물과 동물이 전리품을 떨어트리지 않습니다. 예를 들어 Creeper가 화약을 떨어트리지 않습니다. + +비활성화하면 블록이 파괴돼도 아이템을 떨어트리지 않습니다. 예를 들어 돌 블록에서 조약돌을 얻을 수 없습니다. + +비활성화하면 플레이어의 체력이 자연적으로 재생되지 않습니다. + +비활성화하면 시간대가 변하지 않습니다. + 스킨 팩 테마 @@ -3399,7 +4004,49 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E {*PLAYER*} {*SOURCE*}에 타격에 의해 사망 -{*PLAYER*}님이 {*SOURCE*}에 의해 살해당했습니다. +{*PLAYER*} 님이 {*SOURCE*}의 마법에 살해당했습니다. + +{*PLAYER*} 님이 사다리에서 떨어졌습니다. + +{*PLAYER*} 님이 덩굴에서 떨어졌습니다. + +{*PLAYER*} 님이 물 밖으로 떨어졌습니다. + +{*PLAYER*} 님이 높은 곳에서 떨어졌습니다. + +{*PLAYER*} 님이 {*SOURCE*}에 의해 떨어져 사망했습니다. + +{*PLAYER*} 님이 {*SOURCE*}에 의해 떨어져 사망했습니다. + +{*PLAYER*} 님이 {*SOURCE*}의 {*ITEM*}에 의해 떨어져 사망했습니다. + +{*PLAYER*} 님이 너무 멀리 떨어져 {*SOURCE*}에 의해 사망했습니다. + +{*PLAYER*} 님이 너무 멀리 떨어져 {*SOURCE*}의 {*ITEM*}에 의해 사망했습니다. + +{*PLAYER*} 님이 {*SOURCE*}과(와) 싸우던 중 불 속으로 걸어 들어갔습니다. + +{*PLAYER*} 님이 {*SOURCE*}과(와) 싸우던 중 까맣게 타버렸습니다. + +{*PLAYER*} 님이 {*SOURCE*}을(를) 피하다 용암에서 수영을 했습니다. + +{*PLAYER*} 님이 {*SOURCE*}을(를) 피하려다 익사했습니다. + +{*PLAYER*} 님이 {*SOURCE*}을(를) 피하려다 선인장에 찔렸습니다. + +{*PLAYER*} 님이 {*SOURCE*}에 의해 날아갔습니다. + +{*PLAYER*} 님이 말라 죽었습니다. + +{*PLAYER*} 님이 {*SOURCE*}의 {*ITEM*}에 의해 사망했습니다. + +{*PLAYER*} 님이 {*SOURCE*}의 {*ITEM*}에 맞아 사망했습니다. + +{*PLAYER*} 님이 {*SOURCE*}의 {*ITEM*}에 의해 불덩어리를 맞았습니다. + +{*PLAYER*} 님이 {*SOURCE*}의 {*ITEM*}에 의해 찌부러졌습니다. + +{*PLAYER*} 님이 {*SOURCE*}의 {*ITEM*}에 살해당했습니다. 기반암 안개 @@ -3564,9 +4211,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 지하 초기화를 하지 않습니다. -Mooshroom의 털을 자를 수 없습니다. 돼지, 양, 소, 고양이의 수가 최대치에 도달했습니다. +Mooshroom의 털을 자를 수 없습니다. 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. -낳은 알을 사용할 수 없습니다. 돼지, 양, 소, 고양이의 수가 최대치에 도달했습니다. +낳은 알을 사용할 수 없습니다. 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. 낳은 알을 사용할 수 없습니다. Mooshroom의 수가 최대치에 도달했습니다. @@ -3576,6 +4223,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 낳은 알을 사용할 수 없습니다. 오징어의 수가 최대치에 도달했습니다. +낳은 알을 사용할 수 없습니다. 마을 사람의 수가 최대치에 도달했습니다. + 낳은 알을 사용할 수 없습니다. 적의 수가 최대치에 도달했습니다. 낳은 알을 사용할 수 없습니다. 마을 사람의 수가 최대치에 도달했습니다. @@ -3584,12 +4233,14 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 낙원 모드에서는 적을 생성할 수 없습니다. -이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 돼지, 양, 소, 고양이의 수가 최대치에 도달했습니다. +이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 늑대의 수가 최대치에 도달했습니다. 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 닭의 수가 최대치에 도달했습니다. +이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 말의 수가 최대치에 도달했습니다. + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 Mooshroom의 수가 최대치에 도달했습니다. 배의 수가 최대치에 도달했습니다. @@ -3617,27 +4268,43 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 제작진 콘텐츠 재설치 - + 디버그 설정 - + 불 확산 - + TNT 폭발 - + 플레이어 대 플레이어 - + 플레이어 신뢰 - + 호스트 특권 - + 건물 생성 - + 완전평면 월드 - + 보너스 상자 - + 월드 옵션 - + +게임 옵션 + +괴물에 의한 괴롭힘 + +소지품 유지 + +괴물 생성 + +괴물 전리품 + +타일 아이템 + +자연 재생 + +시간대 전환 + 건설 및 채광 가능 문과 스위치 사용 가능 @@ -3824,6 +4491,14 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E +위더 + +체력 강화 + +흡수 + +포만 + - 신속 - 속도 저하 @@ -3862,6 +4537,14 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E - 독 +만큼 부패 + +만큼 체력 강화 + +만큼 흡수 + +만큼 포만 + II @@ -3958,6 +4641,22 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 감소합니다. +복용 시: + +말 점프 강화 + +좀비 증원 + +최대 체력 + +괴물 따라오기 거리 + +밀치기 저항 + +속도 + +공격력 + 예리 강타 @@ -4048,7 +4747,7 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E {*ICON_SHANK_01*}를 3만큼 회복합니다. 화로에서 감자를 조리하여 만듭니다. -먹어서 {*ICON_SHANK_01*}를 1만큼 회복하거나 화로에서 조리할 수 있습니다. 농지에 심을 수 있으며 먹으면 중독될 수 있습니다. +먹어서 {*ICON_SHANK_01*}를 1만큼 회복합니다. 먹으면 중독될 수 있습니다. {*ICON_SHANK_01*}를 3만큼 회복합니다. 당근과 금덩이를 사용해 만듭니다. @@ -4278,7 +4977,7 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E {*B*} - 거래 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 거래 인터페이스에 대해 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} 거래 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. diff --git a/Minecraft.Client/Common/Media/movies1080.txt b/Minecraft.Client/Common/Media/movies1080.txt index f72fa4cf..782dd5bc 100644 --- a/Minecraft.Client/Common/Media/movies1080.txt +++ b/Minecraft.Client/Common/Media/movies1080.txt @@ -7,6 +7,7 @@ skinHDHud.swf skinHDLabels.swf skinHDInGame.swf AnvilMenu1080.swf +BeaconMenu1080.swf BrewingStandMenu1080.swf ChestMenu1080.swf ChestLargeMenu1080.swf @@ -31,9 +32,12 @@ DispenserMenu1080.swf EnchantingMenu1080.swf EndPoem1080.swf EULA1080.swf +FireworksMenu1080.swf FullscreenProgress1080.swf FurnaceMenu1080.swf HelpAndOptionsMenu1080.swf +HopperMenu1080.swf +HorseInventoryMenu1080.swf HowToPlay1080.swf HowToPlayMenu1080.swf HUD1080.swf @@ -44,6 +48,8 @@ InGameTeleportMenu1080.swf Intro1080.swf InventoryMenu1080.swf JoinMenu1080.swf +LanguagesMenu1080.swf +LanguagesMenuSplit1080.swf LoadOrJoinMenu1080.swf LaunchMoreOptionsMenu1080.swf LeaderboardMenu1080.swf @@ -72,6 +78,7 @@ ToolTips1080.swf TradingMenu1080.swf TutorialPopup1080.swf AnvilMenuSplit1080.swf +BeaconMenuSplit1080.swf BrewingStandMenuSplit1080.swf ChestMenuSplit1080.swf ChestLargeMenuSplit1080.swf @@ -82,9 +89,12 @@ CreativeMenuSplit1080.swf DeathMenuSplit1080.swf DispenserMenuSplit1080.swf EnchantingMenuSplit1080.swf +FireworksMenuSplit1080.swf FurnaceMenuSplit1080.swf FullscreenProgressSplit1080.swf HelpAndOptionsMenuSplit1080.swf +HopperMenuSplit1080.swf +HorseInventoryMenuSplit1080.swf HowToPlaySplit1080.swf HowToPlayMenuSplit1080.swf HUDSplit1080.swf diff --git a/Minecraft.Client/Common/Media/movies480.txt b/Minecraft.Client/Common/Media/movies480.txt index a3ab2ec6..bbc4f2a5 100644 --- a/Minecraft.Client/Common/Media/movies480.txt +++ b/Minecraft.Client/Common/Media/movies480.txt @@ -1,4 +1,5 @@ AnvilMenu480.swf +BeaconMenu480.swf BrewingStandMenu480.swf ChestLargeMenu480.swf ChestMenu480.swf @@ -15,9 +16,12 @@ DLCMainMenu480.swf EnchantingMenu480.swf EndPoem480.swf EULA480.swf +FireworksMenu480.swf FullscreenProgress480.swf FurnaceMenu480.swf HelpAndOptionsMenu480.swf +HopperMenu480.swf +HorseInventoryMenu480.swf HowToPlay480.swf HowToPlayMenu480.swf HUD480.swf @@ -27,6 +31,7 @@ InGamePlayerOptions480.swf Intro480.swf InventoryMenu480.swf JoinMenu480.swf +LanguagesMenu480.swf LaunchMoreOptionsMenu480.swf LeaderboardMenu480.swf LoadMenu480.swf diff --git a/Minecraft.Client/Common/Media/movies720.txt b/Minecraft.Client/Common/Media/movies720.txt index ee89748b..524fcee0 100644 --- a/Minecraft.Client/Common/Media/movies720.txt +++ b/Minecraft.Client/Common/Media/movies720.txt @@ -7,6 +7,7 @@ skinHud.swf skinLabels.swf skinInGame.swf AnvilMenu720.swf +BeaconMenu720.swf BrewingStandMenu720.swf ChestMenu720.swf ChestLargeMenu720.swf @@ -29,9 +30,12 @@ DispenserMenu720.swf EnchantingMenu720.swf EndPoem720.swf EULA720.swf +FireworksMenu720.swf FullscreenProgress720.swf FurnaceMenu720.swf HelpAndOptionsMenu720.swf +HopperMenu720.swf +HorseInventoryMenu720.swf HowToPlay720.swf HowToPlayMenu720.swf HUD720.swf @@ -42,6 +46,8 @@ InGameTeleportMenu720.swf Intro720.swf InventoryMenu720.swf JoinMenu720.swf +LanguagesMenu720.swf +LanguagesMenuSplit720.swf LoadOrJoinMenu720.swf LaunchMoreOptionsMenu720.swf LeaderboardMenu720.swf @@ -69,6 +75,7 @@ ToolTips720.swf TradingMenu720.swf TutorialPopup720.swf AnvilMenuSplit720.swf +BeaconMenuSplit720.swf BrewingStandMenuSplit720.swf ChestMenuSplit720.swf ChestLargeMenuSplit720.swf @@ -80,10 +87,13 @@ CreativeMenuSplit720.swf DeathMenuSplit720.swf DispenserMenuSplit720.swf EnchantingMenuSplit720.swf +FireworksMenuSplit720.swf FurnaceMenuSplit720.swf FullscreenProgressSplit720.swf GamertagSplit720.swf HelpAndOptionsMenuSplit720.swf +HopperMenuSplit720.swf +HorseInventoryMenuSplit720.swf HowToPlaySplit720.swf HowToPlayMenuSplit720.swf HUDSplit720.swf diff --git a/Minecraft.Client/Common/Media/moviesVita.txt b/Minecraft.Client/Common/Media/moviesVita.txt index 7a05e006..97627ca6 100644 --- a/Minecraft.Client/Common/Media/moviesVita.txt +++ b/Minecraft.Client/Common/Media/moviesVita.txt @@ -7,6 +7,7 @@ skinHud.swf skinLabels.swf skinInGame.swf AnvilMenuVita.swf +BeaconMenuVita.swf BrewingStandMenuVita.swf ChestLargeMenuVita.swf ChestMenuVita.swf @@ -24,9 +25,12 @@ DLCMainMenuVita.swf EnchantingMenuVita.swf EndPoemVita.swf EULAVita.swf +FireworksMenuVita.swf FullscreenProgressVita.swf FurnaceMenuVita.swf HelpAndOptionsMenuVita.swf +HopperMenuVita.swf +HorseInventoryMenuVita.swf HowToPlayMenuVita.swf HowToPlayVita.swf HUDVita.swf @@ -37,6 +41,7 @@ InGameTeleportMenuVita.swf IntroVita.swf InventoryMenuVita.swf JoinMenuVita.swf +LanguagesMenuVita.swf LaunchMoreOptionsMenuVita.swf LeaderboardMenuVita.swf LoadMenuVita.swf diff --git a/Minecraft.Client/Common/Media/pt-BR/strings.resx b/Minecraft.Client/Common/Media/pt-BR/strings.resx index 0fd411ec..67369181 100644 --- a/Minecraft.Client/Common/Media/pt-BR/strings.resx +++ b/Minecraft.Client/Common/Media/pt-BR/strings.resx @@ -147,29 +147,29 @@ {*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. +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. +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*} +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. - +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.{*B*}{*B*} +É 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*} +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. @@ -180,20 +180,20 @@ Dois baús colocados lado a lado serão combinados para formar um Baú Grande. E {*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. +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*} +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*} +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. @@ -201,7 +201,7 @@ Se o item que você estiver examinando for um ingrediente ou combustível para a {*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*} +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. @@ -229,11 +229,11 @@ Você deve experimentar todas as combinações de ingredientes para descobrir to {*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*} +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} +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*} @@ -257,28 +257,28 @@ 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). +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).{*B*} 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*} +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. +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. +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*} @@ -300,6 +300,27 @@ Ao carregar ou criar um mundo, você pode pressionar o botão "Mais Opções" pa {*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*} + {*T2*}Ciclo do dia{*ETW*}{*B*} + Quando desativado, a hora do dia não muda.{*B*}{*B*} + + {*T2*}Manter inventário{*ETW*}{*B*} + Quando ativada, jogadores vão manter o inventário ao morrer.{*B*}{*B*} + + {*T2*}Surgimento de criaturas{*ETW*}{*B*} + Quando desativado, criaturas não aparecerão naturalmente.{*B*}{*B*} + + {*T2*}Assédio por criaturas{*ETW*}{*B*} + Quando desativado,impede monstros e animais de mudar blocos (por exemplo, explosões de Creepers não destróem blocos e ovelhas não removem grama) ou pegar itens.{*B*}{*B*} + + {*T2*}Itens de criaturas{*ETW*}{*B*} + Quando desativado, monstros e animais não derrubam itens (por exemplo, Creepers não derrubam pólvora).{*B*}{*B*} + + {*T2*}Itens de blocos{*ETW*}{*B*} + Quando desativado, blocos não derrubam itens ao serem destruídos (por exemplo, blocos de pedra não derrubam paralelepípedos).{*B*}{*B*} + + {*T2*}Regeneração natural{*ETW*}{*B*} + Quando desativada, jogadores não regeneram vida naturalmente.{*B*}{*B*} + {*T1*}Opções de Geração de Mundo{*ETW*}{*B*} Ao criar um novo mundo, há algumas opções adicionais.{*B*}{*B*} @@ -316,7 +337,7 @@ Ao criar um novo mundo, há algumas opções adicionais.{*B*}{*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*} + Durante o jogo, várias opções podem ser acessadas pressionando {*BACK_BUTTON*} 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*} @@ -325,13 +346,13 @@ Ao criar um novo mundo, há algumas opções adicionais.{*B*}{*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*} + Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. 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 abrir recipientes{*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 recipientes, 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*} @@ -343,7 +364,7 @@ Para modificar os privilégios de um jogador, selecione o nome dele e pressione 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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*} @@ -353,14 +374,16 @@ Se "Privilégios do Host" estiver habilitado, o jogador host poderá modificar a {*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*} + + {*T2*}É possível Teleportar{*ETW*}{*B*} Isto permite que o jogador mova a si mesmo ou outros jogadores para outros jogadores no mundo. +Para jogadores que não estão no mesmo console {*PLATFORM_NAME*} que o host, selecionar esta opção vai expulsá-los junto com qualquer jogador conectado em seu console {*PLATFORM_NAME*}. Este jogador não poderá se juntar novamente ao jogo até que seja reiniciado. + Próxima Página Página Anterior @@ -424,56 +447,93 @@ portanto, poderão facilmente se juntar a você. 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*} +{*T3*}Alterações e adições{*ETW*}{*B*}{*B*} +- Novos itens adicionados - Argila endurecida, Argila colorida, Bloco de carvão, fardo de feno, trilho ativador, bloco de redstone, sensor de luz solar, monólito, tremonha, carrinho com tremonha, carrinho com TNT, comparador Redstone, placa de pressão ponderada, farol, baú preso, foguete de artifício, estrela de artifício, estrela do submundo, chumbo, armadura para cavalo, crachá, ovo de surgimento de cavalos{*B*} +- Novas criaturas adicionadas - Wither, esqueletos murchos, bruxas, morcegos, cavalos, burros e mulas{*B*} +- Adicionados novos recursos de geração de terreno - cabanas de bruxas.{*B*} +- Adicionada interface de farol.{*B*} +- Adicionada interface de cavalo.{*B*} +- Adicionada interface de tremonha.{*B*} +- Adicionados fogos de artifício - A interface dos fogos de artifício pode ser acessada na bancada quando tem os ingredientes para fazer uma estrela ou foguete de artifício.{*B*} +- Adicionado 'modo de aventura' - Você só pode quebrar blocos com as ferramentas corretas.{*B*} +- Adicionados muitos sons novos.{*B*} +- Criaturas, itens e projéteis agora podem passar pelos portais.{*B*} +- Repetidores agora podem ser trancados alimentando suas laterais com outro repetidor.{*B*} +- Agora zumbis e esqueletos podem surgir com armas e armaduras diferentes.{*B*} +- Novas mensagens de morte.{*B*} +- Nomeie criaturas com um crachá, e renomeie recipientes para mudar o título quando o menu está aberto.{*B*} +- Farelo de osso não mais faz tudo crescer imediatamente, agora cresce aleatoriamente em estágios.{*B*} +- Um sinal de redstone descrevendo o conteúdo de baús, barracas de poções, distribuidores e jukeboxes podem ser detectados colocando um comparador redstone diretamente contra eles.{*B*} +- Distribuidores podem ser colocados em qualquer direção.{*B*} +- Comer uma maçã dourada dá ao jogador vida "de absorção" extra por um curto período.{*B*} +- Quanto mais você fica em uma área, mais difíceis são as criaturas que surgem naquela área.{*B*} + +{*ETB*}Bem-vindo(a) 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*} - Argila endurecida, argila colorida, bloco de carvão, fardo de feno, trilho ativador, bloco de redstone, sensor de luz do dia, distribuidor, tremonha, carrinho com tremonha, carrinho com TNT, comparador redstone, placa de pressão ponderada, farol, baú preso, estrela e foguete de artifício, estrela do Submundo, chumbo, armadura de cavalos, crachá, ovo de surgimento de cavalos{*B*}{*B*} +{*T1*}Novas criaturas{*ETB*} - Wither, esqueletos murchos, bruxas, morcegos, cavalos, burros e mulas{*B*}{*B*} +{*T1*}Novos recursos{*ETB*} - Dome e cavalgue um cavalo, faça fogos de artifício e dê um show, nomeie animais e monstros com um crachá, crie circuitos redstone mais avançados, e novas opções de anfitrião para ajudar a controlar o que os convidados podem fazer no seu mundo!{*B*}{*B*} +{*T1*}Novo mundo tutorial{*ETB*} – Aprenda a usar os recursos novos e velhos no mundo tutorial. Veja se consegue encontrar todos os discos de música secretos escondidos no mundo!{*B*}{*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 +Cavalos + +{*T3*}COMO JOGAR: CAVALOS{*ETW*}{*B*}{*B*} +Cavalos e burros são encontrados principalmente em planícies. Mulas são o fruto de um burro e um cavalo, mas são estéreis.{*B*} +Todos os cavalos, burros e mulas adultos são animais de montaria. No entanto, apenas os cavalos podem usar armadura, ao passo que só as mulas e os burros podem portar alforjes para transportar itens.{*B*}{*B*} +Cavalos, burros e mulas devem ser domesticados antes que possam ser usados. Para domesticar um cavalo, basta tentar montá-lo e permanecer montado enquanto ele tenta arremessar o montador.{*B*} +Quando aparecem coraçõezinhos em volta do cavalo, ele terá sido domesticado e não tentará mais se livrar do(a) jogador(a). Para guiar um cavalo, o jogador deve equipar uma sela sobre o animal.{*B*}{*B*} +As selas podem ser compradas de aldeões ou encontradas dentro de Baús no mundo.{*B*} +Você pode equipar alforjes em burros e mulas domesticados ao amarrar um Baú. Esses alforjes podem, então, ser acessados enquanto você monta ou se esgueira.{*B*}{*B*} +Cavalos e burros (mas não mulas) podem ser criados como os outros animais utilizando-se Maçãs Douradas ou Cenouras Douradas.{*B*} +Potros se tornarão cavalos adultos com o tempo, embora alimentá-los com Trigo ou Feno acelere o processo.{*B*} + + +Faróis + +{*T3*}COMO JOGAR: FARÓIS{*ETW*}{*B*}{*B*} +Faróis ativos projetam um feixe de luz clara no céu e concedem poderes aos jogadores próximos.{*B*} +Eles podem ser produzidos com Vidro, Obsidiana e Estrelas do Submundo, obtidas ao derrotar-se o Wither.{*B*}{*B*} +Os faróis devem ser posicionados de forma a receberem luz solar durante o dia. Eles devem ser colocados em pirâmides de ferro, ouro, esmeralda ou diamante.{*B*} +O material sobre o qual é posicionado não afeta o poder do farol.{*B*}{*B*} +No menu do Farol, você pode selecionar o poder principal deste farol. Quanto mais níveis sua pirâmide tiver, maior será o número de opções de poderes disponível para escolha.{*B*} +Um farol em uma pirâmide com pelo menos quatro níveis também concede a opção de Regenerar o segundo poder ou aumentar o poder do primeiro.{*B*}{*B*} +Para definir os poderes do seu farol, sacrifique uma esmeralda, um diamante, um ouro ou um lingote de ferro no espaço de pagamento.{*B*} +Quando tudo estiver montado, os poderes emanarão do farol indefinidamente.{*B*} + + +Fogos de artifício + +{*T3*}COMO JOGAR : FOGOS DE ARTIFÍCIO{*ETW*}{*B*}{*B*} +Fogos de artifício são itens decorativos que podem ser lançaodos à mão ou de distribuidores. Eles são criados usando papel, pólvora e opcionalmente um número de estrelas de artifício.{*B*} +As cores, desvanecimento, forma, tamanho e efeitos (como trilhas e brilho) das estrelas de artifício podem ser customizados incluindo ingredientes adicionais na criação.{*B*}{*B*} +Para criar um fogo de artifício coloque pólvora e papel na grade de criação 3x3 que é mostrada acima do seu inventário.{*B*} +Opcionalmente, você pode colocar várias estrelas de artifício na grade de criação para adicioná-los ao fogo de artifício.{*B*} +Encher mais vagas na grade de criação com pólvora aumenta a altura na qual as estrelas de artifício explodem.{*B*}{*B*} +Depois você pode tirar o fogo de artifício do espaço de resultado.{*B*}{*B*} +Estrelas de artifício podem ser criadas colocando pólvora e corante na grade de criação.{*B*} + - O corante ajusta a cor da explosão da estrela de artifício.{*B*} + - A forma da estrela de artifício é configurada adicionando uma carga de fogo, barra de ouro, pena ou cabeça de criatura.{*B*} + - Uma trilha ou um brilho podem ser adicionados usando diamantes ou pó de glowstone.{*B*}{*B*} +Depois que uma estrela de fogos de artifício foi criada, você pode ajustar a cor de desvanecimento da estrela de artifício combinando-a com um corante. + + +Tremonhas + +{*T3*}COMO JOGAR: TREMONHAS{*ETW*}{*B*}{*B*} +Tremonhas são usadas para inserir ou remover itens de recipientes e para pegar automaticamente os itens lançados dentro delas.{*B*} +Elas afetam Barraca de Poções, Baús, Distribuidor, Monólitos, Carrinhos com Baús, Carrinhos com Tremonhas, assim como outras Tremonhas.{*B*}{*B*} +Tremonhas farão tentativas contínuas de sugar os itens de recipientes convenientes que estejam acima delas. Além disso, também tentarão inserir itens depositados em um recipiente de saída.{*B*} +Se uma Tremonha for movida a Redstone, ela se tornará inativa e deixará de sugar e inserir itens.{*B*}{*B*} +Uma Tremonha aponta na direção que tenta retirar os itens. Para fazer uma Tremonha apontar para um bloco específico, coloque-a em frente a este bloco enquanto se esgueira.{*B*} + + +Monólitos + +{*T3*}COMO JOGAR : MONÓLITOS{*ETW*}{*B*}{*B*} +Quando alimentado com um sinal de Redstone, monólitos derrubam aleatoriamente um dos itens armazenados. Use {*CONTROLLER_ACTION_USE*} para abrir o monólito e então carregá-lo com itens do seu inventário.{*B*} +Se o monólito estiver de frente para um baú ou outro tipo de recipiente, o item será colocado ali ao invés de cair no chão. Longas correntes de monólitos podem ser construídos para carregar itens. Para que isso funcione, eles devem ser ativados e desativados alternadamente. + Causa mais danos que à mão. @@ -600,10 +660,36 @@ As cores da cama são sempre as mesmas, independentemente da cor da lã usada. Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. +Quando usado, vira um mapa da parte do mundo onde você está, sendo preenchido conforme você explora. + Permite ataques à distância usando flechas. Usada como munição para arcos. +Derrubados pelo Wither, utilizado na produção de Faróis. + +Quando ativado, cria explosões coloridas. Determina-se a cor, o efeito, o formato e o desvanecimento pela Estrela de Artifício usada na criação do Fogo de Artifício. + +Usado para determinar a cor, efeito e formato do Fogo de Artifício. + +Usados em circuito de Redstone para manter, comparar e subtrair a força do sinal ou para medir os estados de determinados blocos. + +Um tipo de Carrinho de Minas que funciona como um bloco de TNT móvel. + +É um bloco que produz um sinal Redstone derivado de luz do sol (ou a falta dela). + +Tipo especial de Carrinho de Minas que funciona de forma similar a uma Tremonha. Ele coletará os itens deixados nos trilhos e nos recipientes acima dele. + +Tipo especial de armadura que pode ser equipada em um cavalo. Oferece 5 de Armadura. + +Tipo especial de armadura que pode ser equipada em um cavalo. Oferece 7 de Armadura. + +Tipo especial de armadura que pode ser equipada em um cavalo. Oferece 11 de Armadura. + +Usado para amarrar criaturas ao jogador ou postes de cercas + +Usado para nomear criaturas no mundo. + Restaura 2,5{*ICON_SHANK_01*}. Restaura 1{*ICON_SHANK_01*}. Pode ser usado 6 vezes. @@ -655,7 +741,7 @@ Também pode ser usado para pouca iluminação. 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. +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. @@ -928,100 +1014,158 @@ Também pode ser usado para pouca iluminação. As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. +Usado para executar comandos. + +Projeta um feixe de luz no céu e pode oferecer efeitos de status para os jogadores próximos. + +Armazena blocos e itens dentro. Coloque dois baús, lado a lado, para criar um baú maior com o dobro de capacidade. Além disso, o baú preso cria uma carga Redstone quando aberto. + +Oferece uma carga Redstone. A carga será mais forte se houver mais itens na chapa. + +Oferece uma carga Redstone. A carga será mais forte se houver mais itens na chapa. Exige mais peso que uma chapa leve. + +Usado como fonte de energia redstone. Redstones podem ser criadas a partir dele. + +Usado para capturar itens, transferi-los ou retirá-los de recipientes. + +Um tipo de corrimão que habilita ou desabilita Carrinhos de Minas com Tremonhas e aciona Carrinhos de Minas com TNT. + +Usado para segurar e derrubar itens ou empurrá-los em outros recipientes quando recebem carga Redstone. + +Blocos coloridos produzidos ao tingir-se a argila endurecida. + +Pode alimentar Cavalos, Burros e Mulas para curar até 10 Corações. Acelera o crescimento de potros. + +Criado ao cozinhar a argila no forno. + +Criado a partir de vidro e um corante. + +Criado a partir de um vitral + +Uma forma compacta de armazenar carvão. Pode ser usado como combustível em fornalhas. + 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. - + +Morcego + +Estas criaturas voadoras são encontradas nas cavernas ou em outros espaços fechados. + +Bruxa + +Estas inimigas podem ser encontradas em pântanos e atacam atirando Poções. Derrubam Poções quando mortas. + +Cavalo + +Estes animais podem ser domesticados e então montados. + +Burro + +Estes animais podem ser domesticados e então montados. Podem portar baús amarrados. + +Mula + +Fruto do cruzamento entre um cavalo e um burro. Estes animais podem ser domesticados e então montados, e podem carregar baús. + +Cavalo Zumbi + +Cavalo Esqueleto + +Wither + +Estes são criados a partir de Caveiras Murchas ou Areia Movediça. Atiram caveiras explosivas em você. + Explosives Animator Concept Artist @@ -1368,6 +1512,8 @@ Também pode ser usado para pouca iluminação. Mapa +Mapa vazio + Disco - "13" Disco de Música - "cat" @@ -1470,6 +1616,28 @@ Também pode ser usado para pouca iluminação. Cabeça de creeper +Estrela do Submundo + +Foguete de Artifício + +Estrela de Artifício + +Comparador Redstone + +Carrinho com TNT + +Carrinho com Tremonha + +Armadura de Ferro para Cavalo + +Armadura de Ouro para Cavalo + +Armadura de Diamante para Cavalo + +Chumbo + +Crachá + Pedra Bloco de Grama @@ -1486,6 +1654,8 @@ Também pode ser usado para pouca iluminação. Tábua de madeira de floresta +Tábuas (qualquer tipo) + Muda Muda de Carvalho @@ -1822,6 +1992,190 @@ Também pode ser usado para pouca iluminação. Caveira +Bloco de Comando + +Farol + +Baú Preso + +Chapa de Pressão Ponderada (Leve) + +Chapa de Pressão Ponderada (Pesada) + +Comparador Redstone + +Sensor de Luz Solar + +Bloco de Redstone + +Tremonha + +Trilho Ativador + +Monólito + +Argila colorida + +Fardo de Feno + +Argila endurecida + +Bloco de carvão + +Argila colorida preta + +Argila colorida vermelha + +Argila colorida verde + +Argila colorida marrom + +Argila colorida azul + +Argila colorida roxa + +Argila colorida ciano + +Argila colorida cinza claro + +Argila colorida cinza + +Argila colorida rosa + +Argila colorida verde-limão + +Argila colorida amarela + +Argila colorida azul claro + +Argila colorida magenta + +Argila colorida laranja + +Argila colorida branca + +Vitral + +Vitral preto + +Vitral vermelho + +Vitral verde + +Vitral marrom + +Vitral azul + +Vitral roxo + +Vitral ciano + +Vitral cinza claro + +Vitral cinza escuro + +Vitral rosa + +Vitral verde-limão + +Vitral amarelo + +Vitral azul claro + +Vitral magenta + +Vitral laranja + +Vitral branco + +Painel de vitral + +Painel de vitral preto + +Painel de vitral vermelho + +Painel de vitral verde + +Painel de vitral marrom + +Painel de vitral azul + +Painel de vitral roxo + +Painel de vitral ciano + +Painel de vitral cinza claro + +Painel de vitral cinza + +Painel de vitral rosa + +Painel de vitral verde-limão + +Painel de vitral amarelo + +Painel de vitral azul claro + +Painel de vitral magenta + +Painel de vitral laranja + +Painel de vitral branco + +Bola pequena + +Bola grande + +Forma Estelar + +Forma de Creeper + +Explosão + +Formato desconhecido + +Preto + +Vermelho + +Verde + +Marrom + +Azul + +Roxo + +Ciano + +Cinza claro + +Cinza + +Rosa + +Verde-limão + +Amarelo + +Azul claro + +Magenta + +Laranja + +Branco + +Personalizado + +Desbotado + +Brilho + +Trilho + +Duração do voo: +  Controles Atuais Estilo @@ -1999,8 +2353,7 @@ Também pode ser usado para pouca iluminação. 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. @@ -2021,7 +2374,7 @@ Também pode ser usado para pouca iluminação. - Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_VK_RT*}. + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . @@ -2055,7 +2408,7 @@ Também pode ser usado para pouca iluminação. - Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_VK_RT*}. + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . @@ -2602,6 +2955,211 @@ No modo de voo, mantenha pressionado {*CONTROLLER_ACTION_JUMP*}para se mover par Pressione {*CONTROLLER_VK_B*}se já souber usar a barra de alimentos e como comer. + + Esta é a interface do inventário do cavalo. + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe usar o inventário do cavalo. + + + + O inventário do cavalo permite a você transferir ou equipar itens no seu Cavalo, Burro ou Mula. + + + + Sele o cavalo posicionando a sela em seu respectivo espaço. Cavalos podem receber armadura ao se posicionar a Armadura de Cavalo em seu respectivo espaço. + + + + Você também pode transferir os itens entre o seu inventário e os alforjes amarrados aos burros e mulas neste menu. + + +Você encontrou um Cavalo. + +Você encontrou um Burro. + +Você encontrou uma Mula. + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre Cavalos, Burros e Mulas. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe sobre Cavalos, Burros e Mulas. + + + + Cavalos e burros são encontradas principalmente em planícies abertas. Mulas são o fruto de um burro e um cavalo, mas são estéreis. + + + + Todos os cavalos, burros e mulas adultos são animais de montaria. No entanto, apenas os cavalos podem usar armadura, ao passo que só as mulas e os burros podem portar alforjes para transportar itens. + + + + Cavalos, burros e mulas devem ser domesticados antes que possam ser usados. Para domesticar um cavalo, basta tentar montá-lo e permanecer montado enquanto ele tenta tenta arremessar quem o monta. + + + + \Quando aparecem coraçõezinhos em volta do cavalo, ele terá sido domesticado e não tentará mais se livrar do(a) jogador(a). + + + + Tente montar agora neste cavalo. Use {*CONTROLLER_ACTION_USE*} sem itens ou ferramentas na mão para montar. + + + + Para guiar um cavalo, o jogador deve equipar uma sela sobre o animal, que pode ser comprada de aldeões, pescada ou encontrada dentro de baús no mundo. + + + + Você pode equipar alforjes em burros e mulas domesticados ao amarrar um Baú. Estes alforjes podem então ser acessados enquanto você monta ou se esgueira. + + + + Cavalos e burros (mas não mulas) podem ser criados como outros animais utilizando-se Maçãs Douradas ou Cenouras Douradas. Potros se tornarão cavalos adultos com o tempo, embora alimentá-los com Trigo ou Feno acelere o processo. + + + + Você pode tentar domesticar cavalos e burros aqui; além disso, há selas, armaduras de cavalos e outros itens úteis para cavalos nos baús pelas redondezas. + + + + Esta é a interface do Farol, que você pode usar para escolher os poderes que o seu farol vai conceder. + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe usar a interface do Farol. + + + + No menu do Farol, você pode selecionar o poder principal deste farol. Quanto mais níveis sua pirâmide tiver, maior será o número de opções de poderes disponível para escolha. + + + + Um farol em uma pirâmide com pelo menos 4 níveis também concede a opção de Regenerar o segundo poder ou aumentar o poder do primeiro. + + + + Para definir os poderes do seu farol, sacrifique uma Esmeralda, Diamante, Ouro ou Lingote de Ferro no espaço de pagamento. Quando tudo estiver montado, os poderes emanarão do farol indefinidamente. + + +Há um farol inativo no topo desta pirâmide. + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre os Faróis. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe sobre os Faróis. + + + + Faróis ativos projetam um feixe de luz clara no céu e concedem poderes aos jogadores próximos. Eles podem ser produzidos com vidro, obsidiana e estrelas do Submundo, obtidas ao derrotar o Wither. + + + + Os faróis devem ser posicionados de forma a receberem luz solar durante o dia. Eles devem ser colocados em pirâmides de ferro, ouro, esmeralda ou diamante. No entanto, o material sobre o qual um farol é posicionado não afeta o poder do farol. + + + + Tente usar o Farol para definir os poderes que ele concede. Você pode usar lingotes de ferro concedidos como o pagamento necessário. + + +Esta sala contém Tremonhas + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre as Tremonhas. + {*B*}Press{*CONTROLLER_VK_B*} se você já sabe sobre as Tremonhas. + + + + Tremonhas são usadas para inserir ou remover itens de recipientes e para pegar itens lançados dentro delas automaticamente. + + + + Elas afetam as Barraca de Poções, Baús, Distribuidor, Monólitos, Carrinhos com Baús, Carrinhos com Tremonhas, assim como outras Tremonhas. + + + + Tremonhas farão tentativas contínuas de sugar os itens de recipientes apropriados acima delas. Além disso, também tentarão inserir itens depositados em um recipiente de saída. + + + + Se uma Tremonha for movida a Redstone, ela se tornará inativa e deixará de sugar e inserir itens. + + + + Uma Tremonha aponta na direção que tenta retirar os itens. Para fazer uma Tremonha apontar para um bloco específico, coloque-a em frente a este bloco enquanto se esgueira. + + + + Há diversos modelos de Tremonhas para você ver e experimentar nesta sala. + + + + Essa é a interface de fogos de artifício, que você pode usar para fazer fogos de artifício e estrelas de fogos de artifício. + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe usar a interface do Farol. + + + + Para fazer fogos de artifício coloque pólvora e papel na grade de fabricação 3x3 acima do seu inventário. + + + + Opcionalmente, você pode colotar múltiplas estrelas de fogos de artifício na grade de fabricação, para adicioná-las ao fogo de artifício sendo fabricado. + + + + Encher mais espaços na grade de fabricação com pólvora aumenta a altura na qual as estrelas de fogos de artifício explodem. + + + + Depois você pode remover o fogo de artifício do espaço de resultado, quando quiser criá-lo. + + + + Estrelas de fogo de artifício podem ser feitas colocando pólvora e corante na grade de fabricação. + + + + O corante define a cor da explosão na estrela de fogos de artifício. + + + + A forma da estrela de fogos de artifício é definida ao adicionar uma carga de fogo, barra de ouro, pena or cabeça. + + + + Uma trilha ou brilho pode ser adicionado usando diamantes e pó de glowstone. + + + + Depois da criação de uma estrela de fogos de artifício, você pode ajustar a cor de desvanecimento combinando-a com um corante. + + + + Contido nos baús aqui estão vários itens usados na criação de FOGOS DE ARTIFÍCIO! + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para aprender mais sobre fogos de artifício. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe sobre fogos de artifício. + + + + Fogos de artifício são itens decorativos que podem ser lançados à mão ou de distribuidores. Eles podem ser criados com papel, pólvora e opcionalmente um punhado de estrelas de fogos de artifício. + + + + As cores, desvanecimento, forma, tamanho e efeitos (como trilhas e brilhos) das estrelas de fogos de artifício podem ser customizados usando ingredientes extras na criação. + + + + Tente criar um fogo de artifício na bancada usando um sortimento de ingredientes dos baús. + +  Selecionar Usar @@ -2824,6 +3382,22 @@ No modo de voo, mantenha pressionado {*CONTROLLER_ACTION_JUMP*}para se mover par Carregar jogo salvo para o Xbox One +Montar + +Desmontar + +Baú amarrado + +Lançar + +Rédea + +Soltar + +Amarrar + +Nomear + OK Cancelar @@ -3134,6 +3708,20 @@ Deseja desbloquear a versão integral do jogo? Distribuidor +Cavalo + +Monólito + +Tremonha + +Farol + +Poder Principal + +Poder Secundário + +Carrinho de Minas + Não há ofertas de conteúdo para baixar desse tipo disponíveis para este título no momento. %s entrou no jogo. @@ -3293,10 +3881,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Modo Jogo Criativo +Modo de Jogo: Aventura + Sobrevivência Criativo +Aventura + Criado em Sobrevivência Criado em Criativo @@ -3317,6 +3909,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Superplano +Insira uma semente para gerar novamente o mesmo terreno. Deixe vazio para um mundo aleatório. + Quando habilitado, o jogo será um jogo online. Quando habilitado, apenas jogadores convidados poderão entrar. @@ -3333,7 +3927,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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. +Ao ativar, recria o Submundo. Útil para mundos criados quando Fortalezas do Submundo ainda não existiam. Quando habilitado, estruturas como Vilas e Fortalezas serão geradas no mundo. @@ -3341,6 +3935,20 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador. +Quando desativada, impede que monstros e animais alterem os bloco (por exemplo, as explosões dos Creepers não destroem os blocos e as Ovelhas não removem a Grama) ou peguem itens. + +Quando ativada, os jogadores manterão o inventário ao morrer. + +Quando desativada, as criaturas não aparecerão naturalmente. + +Quando desativada, monstros e animais não deixarão itens (por exemplo, os Creepers não vão deixar cair pólvora). + +Quando desativada, os blocos vão parar de derrubar itens ao serem destruídos (por exemplo, blocos de pedra não derrubarão mais paralelepípedos). + +Quando desativada, os jogadores não regenerarão a saúde naturalmente. + +Quando desativada, a hora do dia não sofrerá alteração. + Pacotes de Capas Temas @@ -3389,7 +3997,49 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? {*PLAYER*} foi esmurrado por {*SOURCE*} -{*PLAYER*} foi morto por {*SOURCE*} +{*PLAYER*} foi morto por {*SOURCE*} usando magia + +{*PLAYER*} caiu da escada + +{*PLAYER*} caiu de algumas videiras + +{*PLAYER*} caiu para fora da água + +{*PLAYER*} caiu de um lugar alto + +{*PLAYER*} foi condenado(a) a cair por {*SOURCE*} + +{*PLAYER*} foi condenado(a) a cair por {*SOURCE*} + +{*PLAYER*} foi condenado(a) a cair por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} caiu muito longe e foi eliminado(a) por {*SOURCE*} + +{*PLAYER*} caiu muito longe e foi eliminado(a) por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} andou sobre as chamas enquanto lutava {*SOURCE*} + +{*PLAYER*} virou cinzas enquanto lutava {*SOURCE*} + +{*PLAYER*} tentou nadar na lava para escapar{*SOURCE*} + +{*PLAYER*} afogou-se enquanto tentava escapar{*SOURCE*} + +{*PLAYER*} pisou no cacto enquanto tentava escapar {*SOURCE*} + +{*PLAYER*} foi explodido(a) por {*SOURCE*} + +{*PLAYER*} secou até morrer + +{*PLAYER*} foi assassinado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi baleado(a) {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} levou uma bola de fogo de {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi socado(a) por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi morto(a) por {*SOURCE*} usando {*ITEM*} Neblina Base @@ -3566,6 +4216,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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 pode usar um Ovo de Criação no momento. O número máximo de Morcegos 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. @@ -3574,12 +4226,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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 no Modo do 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 no Modo do Amor. O número máximo de cavalos reprodutores 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. @@ -3607,27 +4261,43 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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 - + +Opções de Jogo + +Assédio por criatura + +Manter inventário + +Surgimento de criaturas + +Itens de criaturas + +Itens de Espaços + +Regeneração Natural + +Ciclo da Luz do Dia + Pode Construir e Minerar Pode Usar Portas e Acionadores @@ -3666,7 +4336,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Semente para Criação de Mundo -Deixar em branco para semente aleatória +Deixar livre p/ uma semente aleatória Jogadores @@ -3700,7 +4370,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Tipo de Nível: -JxJ: +JvJ: Confiar Jogadores: @@ -3732,7 +4402,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Restaurar Padrões -Exibir Oscilação +Oscilação da visão Dicas @@ -3754,7 +4424,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Editar mensagem da placa: -Vejam o que fiz no Minecraft: Xbox 360 Edition! +Olha o que eu fiz no Minecraft: Xbox 360 Edition! Texturas, ícones e interface do usuário clássicos do Minecraft! @@ -3814,6 +4484,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Veneno +Wither + +Reforço de Saúde + +Absorção + +Saturação + de Rapidez de Lentidão @@ -3852,6 +4530,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? de Veneno +da Decadência + +do Reforço de Saúde + +da Absorção + +da Saturação + II @@ -3948,6 +4634,22 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Reduz a saúde dos jogadores, animais e monstros afetados com o tempo. +Quando aplicado: + +Força de pulo para o cavalo + +Reforços Zumbis + +Saúde Máxima + +Limite de acomp. pelas criaturas + +Resistência a empurrão + +Velocidade + +Dano de ataque + Nitidez Atacar @@ -4038,7 +4740,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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 1{*ICON_SHANK_01*} Comer isso pode te envenenar. Restaura 3{*ICON_SHANK_01*}. Criado com uma cenoura e barras de ouro. diff --git a/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx b/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx index a612c335..ab38c1c5 100644 --- a/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx +++ b/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx @@ -73,11 +73,11 @@ 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. +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. +Esta funcionalidade requer um perfil de jogador ligado ao Xbox LIVE. -Ligar ao Xbox Live +Ligar ao Xbox LIVE Continuar a jogar offline @@ -100,7 +100,7 @@ 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. +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 index 132c30f2..6fee7199 100644 --- a/Minecraft.Client/Common/Media/pt-PT/strings.resx +++ b/Minecraft.Client/Common/Media/pt-PT/strings.resx @@ -156,7 +156,7 @@ Se estiveres a segurar um objeto, usa{*CONTROLLER_ACTION_USE*} para o utilizares {*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*} +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*}{*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*} @@ -233,7 +233,7 @@ Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro n 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*} +Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias de um mundo, ou escavando ou cultivando no mundo.{*B*}{*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*} @@ -282,7 +282,7 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C {*T3*}INSTRUÇÕES DE JOGO : OPÇÕES DE ANFITRIÃO E JOGADOR{*ETW*}{*B*}{*B*} -{*T1*}Opções de jogo{*ETW*}{*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*} @@ -300,6 +300,27 @@ Ao carregar ou criar um mundo, prime o botão "Mais Opções" para abrir um menu {*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*} + {*T2*}Ciclo da Luz do Dia{*ETW*}{*B*} + Quando desativada, a hora do dia não muda.{*B*}{*B*} + + {*T2*}Manter Inventário{*ETW*}{*B*} + Quando ativada, os jogadores mantêm o inventário quando morrem.{*B*}{*B*} + + {*T2*}Geração de Criaturas{*ETW*}{*B*} + Quando desativada, as criaturas não se geram naturalmente.{*B*}{*B*} + + {*T2*}Perturbação de Criaturas{*ETW*}{*B*} + Quando desativada, impede que monstros e animais mudem blocos (por exemplo, explosões de Creeper não destroem blocos e as Ovelhas não comem Erva) ou apanhem objetos.{*B*}{*B*} + + {*T2*}Saques de Criaturas{*ETW*}{*B*} + Quando desativada, os monstros e os animais não deixam cair saques (por exemplo, os Creepers não deixam cair pólvora).{*B*}{*B*} + + {*T2*}Queda de Peças{*ETW*}{*B*} + Quando desativada, os blocos não deixam cair objetos quando são destruídos (por exemplo, os blocos de Pedra não deixam cair Pedra Arredondada).{*B*}{*B*} + + {*T2*}Regeneração Natural{*ETW*}{*B*} + Quando desativada, os jogadores não regeneram naturalmente a sua saúde.{*B*}{*B*} + {*T1*}Opções de Criação de Mundos{*ETW*}{*B*} Ao criar um novo mundo, existem opções adicionais.{*B*}{*B*} @@ -343,24 +364,26 @@ Para modificar os privilégios de um jogador, seleciona o nome e prime{*CONTROLL 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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*} + + {*T2*}Pode Teletransportar{*ETW*}{*B*} Permite que o jogador se transporte ou transporte outros jogadores até si ou até outros jogadores no mundo. +Selecionar esta opção fará com que os jogadores que não estão na mesma consola {*PLATFORM_NAME*} que o anfitrião sejam expulsos do jogo, juntamente com outros jogadores na sua consola {*PLATFORM_NAME*}. Este jogador não poderá voltar ao jogo até este ser reiniciado. + Página Seguinte Página Anterior @@ -383,7 +406,7 @@ Se "Privilégios de Anfitrião" estiver ativada, o jogador anfitrião pode modif Animais de Criação -Preparação de Poções +Poções Feitiço @@ -426,60 +449,92 @@ pelo que facilmente se juntarão a ti. {*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*} +- Novos objetos adicionados - Barro Endurecido, Barro Manchado, Bloco de Carvão, Fardo de Palha, Carril Ativador, Bloco de Redstone, Sensor de Luz do Dia, Soltador, Funil, Vagoneta com Funil, Vagoneta com TNT, Comparador de Redstone, Placa de Pressão Ponderada, Farol, Baú Preso, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Corda de Conduzir, Armadura de Cavalo, Etiqueta, Ovo de Geração de Cavalo{*B*} +- Novas Criaturas adicionadas - Cérbero, Esqueletos de Cérbero, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*} +- Novas funcionalidades de geração de terreno - Cabanas de Bruxa.{*B*} +- Adicionada interface de Farol.{*B*} +- Adicionada interface de Cavalo.{*B*} +- Adicionada interface de Funil.{*B*} +- Adicionado Fogo de Artifício - a interface de Fogo de Artifício pode ser acedida a partir da Mesa de Criação quando tens os ingredientes para criar uma Estrela de Fogo de Artifício ou um Foguete de Fogo de Artifício.{*B*} +- Adicionado 'Modo Aventura' - Só podes quebrar blocos com as ferramentas corretas.{*B*} +- Adicionados imensos sons novos.{*B*} +- Habitantes, objetos e projéteis agora passam através de portais.{*B*} +- Os Repetidores podem agora ser trancados alimentando a sua lateral com outro Repetidor.{*B*} +- Mortos-vivos e Esqueletos podem agora gerar-se com diferentes armas e armaduras.{*B*} +- Novas mensagens de morte.{*B*} +- Nomeia as criaturas com uma Etiqueta, e dá novos nomes a contentores para mudar o título quando se abre o menu.{*B*} +- O Pó de Ossos já não faz tudo crescer instantaneamente até ao tamanho máximo, e passa a fazê-lo por fases de forma aleatória.{*B*} +- Um sinal de Redstone que descreve os conteúdos dos Baús, dos Postos de Poções, dos Distribuidores e das Jukeboxes pode ser detetado colocando um Comparador de Redstone diretamente contra eles.{*B*} +- Os Distribuidores podem ficar virados em qualquer direção.{*B*} +- Comer uma Maçã Dourada dá ao jogador uma saúde de "absorção" adicional durante um curto período.{*B*} +- Quanto mais tempo permaneceres numa zona, mais difíceis serão os monstros que se geram nessa zona.{*B*} + +{*ETB*}Bem-vindo de volta! Podes não ter reparado, mas o Minecraft foi atualizado.{*B*}{*B*} +Há muitas funcionalidades novas para explorares com os teus amigos. Aqui ficam algumas. Lê e depois diverte-te!{*B*}{*B*} +{*T1*}Novos Objetos{*ETB*} - Barro Endurecido, Barro Manchado, Bloco de Carvão, Fardo de Palha, Carril Ativador, Bloco de Redstone, Sensor de Luz do Dia, Soltador, Funil, Vagoneta com Funil, Vagoneta com TNT, Comparador de Redstone, Placa de Pressão Ponderada, Farol, Baú Preso, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Corda de Conduzir, Armadura de Cavalo, Etiqueta, Ovo de Geração de Cavalo{*B*}{*B*} +{*T1*}Novas Criaturas{*ETB*} - Cérbero, Esqueletos de Cérbero, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*}{*B*} +{*T1*}Novas Funcionalidades{*ETB*} - Domestica e cavalga um cavalo, cria fogo de artifício e dá espetáculo, nomeia animais e monstros com uma Etiqueta, cria circuitos de Redstone mais avançados, e novas Opções de Anfitrião para ajudar a controlar aquilo que os convidados podem fazer no teu mundo!{*B*}{*B*} +{*T1*}Novo Mundo Tutorial{*ETB*} – Aprende a usar as funcionalidades antigas e recentes no Mundo Tutorial. Vê se consegues descobrir todos os Discos de Música secretos escondidos no mundo!{*B*}{*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*} - +Cavalos + +{*T3*}INSTRUÇÕES DE JOGO: CAVALOS{*ETW*}{*B*}{*B*} +Os Cavalos e os Burros estão sobretudo nas planícies. As Mulas são descendentes de um Burro e de um Cavalo, mas são inférteis.{*B*} +Todos os Cavalos, Burros e Mulas adultos podem ser montados. Porém, só os Cavalos podem ter armadura, e só as Mulas e os Burros podem ser equipados com alforjes para transportar objetos.{*B*}{*B*} +Os Cavalos, os Burros e as Mulas têm de ser domesticados antes de poderem ser usados. Para domesticar um cavalo, é preciso montá-lo e conseguir ficar em cima dele enquanto ele tenta atirar o jogador para o chão.{*B*} +Quando surgem Corações de Amor à volta do cavalo, ele está domesticado e já não tentará atirar o jogador para o chão. Para guiar um cavalo, é preciso equipá-lo com uma Sela.{*B*}{*B*} +Podes comprar Selas aos aldeões ou encontrá-las dentro de Baús escondidos pelo mundo.{*B*} +Os Burros e Mulas domesticados podem receber alforjes se lhes prenderes um Baú. Poderás depois aceder aos alforjes enquanto montas ou quando te aproximas furtivamente do animal.{*B*}{*B*} +Os Cavalos e os Burros (as Mulas não) podem ser procriados como os outros animais, usando Maçãs Douradas ou Cenouras Douradas.{*B*} +Os potros tornam-se cavalos adultos ao fim de algum tempo, mas podes acelerar o processo alimentando-os com Trigo ou Feno.{*B*} + + +Faróis + +{*T3*}INSTRUÇÕES DE JOGO: FARÓIS{*ETW*}{*B*}{*B*} +Os Faróis Ativos projetam um feixe de luz brilhante para o céu e atribuem poderes a jogadores próximos.{*B*} +São criados a partir de Vidro, Obsidiana e Estrelas do Submundo, que podem ser obtidos derrotando o Cérbero.{*B*}{*B*} +Os Faróis têm de ser colocados de modo a apanhar sol durante o dia. Eles têm de ser colocados em Pirâmides de Ferro, Ouro, Esmeralda ou Diamante.{*B*} +O material do Farol em cima do qual este é colocado não tem qualquer efeito na sua potência.{*B*}{*B*} +No menu do Farol podes selecionar um poder principal para o teu Farol. Quantos mais camadas tiver a tua pirâmide, mais poderes terás à escolha.{*B*} +Um Farol numa pirâmide com pelo menos quatro camadas também te permite escolher entre o poder secundário de Regeneração ou um poder principal mais forte.{*B*}{*B*} +Para definir os poderes do teu Farol tens de sacrificar uma Esmeralda, um Diamante, Lingotes de Ferro ou Ouro na ranhura de pagamento.{*B*} +Uma vez definidos, os poderes irão emanar indefinidamente do Farol.{*B*} + + +Fogo de artifício + +{*T3*}INSTRUÇÕES DE JOGO: FOGO DE ARTIFÍCIO{*ETW*}{*B*}{*B*} +O Fogo de Artifício é um objeto decorativo que pode ser lançado à mão ou a partir de Distribuidores. Pode ser criado usando Papel, Pólvora e, opcionalmente, algumas Estrelas de Fogo de Artifício.{*B*} +As cores, o desaparecimento, a forma, o tamanho e os efeitos (como os rastos e a cintilância) das Estrelas de Fogo de Artifício podem ser personalizados incluindo ingredientes adicionais no momento da criação.{*B*}{*B*} +Para criar um Fogo de Artifício, coloca Pólvora e Papel na grelha de criação de 3x3 que aparece acima do teu inventário.{*B*} +Opcionalmente, podes colocar múltiplas Estrelas de Fogo de Artifício na grelha para as adicionar ao Fogo de Artifício.{*B*} +Preencher mais ranhuras na grelha de criação com Pólvora aumenta a altura a que as Estrelas de Fogo de Artifício vão explodir.{*B*}{*B*} +Podes então retirar o Fogo de Artifício criado da ranhura de saída.{*B*}{*B*} +As Estrelas de Fogo de Artifício podem ser criadas colocando Pólvora e Tinta na grelha de criação.{*B*} + - A Tinta definirá a cor da explosão da Estrela de Fogo de Artifício.{*B*} + - A forma da Estrela de Fogo de Artifício é definida adicionando uma Carga de Fogo, uma Pepita de Ouro, uma Pena ou uma Cabeça de Criatura.{*B*} + - Um rasto ou uma cintilância podem ser adicionados usando Diamantes ou Pó de Glowstone.{*B*}{*B*} +Depois de ser criada uma Estrela de Fogo de Artifício, podes definir a cor de desaparecimento da Estrela de Fogo de Artifício criando-a com Tinta. + + +Funis + +{*T3*}INSTRUÇÕES DE JOGO: FUNIS{*ETW*}{*B*}{*B*} +Os Funis são usados para inserir ou remover objetos de contentores, e para recolher automaticamente objetos atirados a eles.{*B*} +Eles podem afetar Postos de Poções, Baús, Distribuidores, Soltadores, Vagonetas com Baús, Vagonetas com Funis, bem como outros Funis.{*B*}{*B*} +Os Funis vão tentar continuamente sugar objetos de um contentor adequado colocado acima deles. Também vão tentar inserir objetos armazenados num contentor de destino.{*B*} +Se um Funil for alimentado por Redstone tornar-se-á inativo e parará de sugar e de inserir objetos.{*B*}{*B*} +Um Funil aponta na direção em que tenta colocar objetos. Para levar um Funil a apontar para um determinado bloco, coloca-o frente a esse bloco enquanto andas furtivamente.{*B*} + + +Soltadores + +{*T3*}INSTRUÇÕES DE JOGO: SOLTADORES{*ETW*}{*B*}{*B*} +Quando alimentados por Redstone, os Soltadores vão largar no chão um objeto ao acaso que contenham. Usa {*CONTROLLER_ACTION_USE*} para abrir o Soltador e depois podes carregar o Soltador com objetos do teu inventário.{*B*} +Se o Soltador estiver perante um Baú ou outro tipo de Contentor, o objeto será colocado aí e não no chão. Podes criar longas cadeias de Soltadores para transportar objetos ao longo de um caminho. Para que isto funcione, eles terão de ser, alternadamente, ligados e desligados. + Provoca mais danos do que com a mão. @@ -553,7 +608,7 @@ Tarte de Abóbora, Poção de Visão Nocturna, Poção de Invisibilidade, Quartz 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. +Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. Utilizadas para criar luz. As tochas também derretem a neve e o gelo. @@ -606,10 +661,36 @@ As cores da cama são sempre as mesmas, independentemente das cores da lã usada Quando seguras no mapa, poderás ver a imagem de uma área explorada. Pode ser utilizado para descobrir caminhos. +Quando se usa torna-se um mapa da parte do mundo em que estás, e vai-se preenchendo à medida que exploras. + Utilizado para ataques à distância com setas. Utilizadas como munição para os arcos. +Largado pelo Cérbero, usado no fabrico de Faróis. + +Quando ativados, criam explosões coloridas. Cor, efeito, forma e desaparecimento são determinados pela Estrela de Fogo de Artifício usada quando é criado o Fogo de Artifício. + +Usada para determinar cor, efeito e forma de um Fogo de Artifício. + +Usado em circuitos Redstone para manter, comparar ou subtrair a força do sinal, ou para medir determinados estados de blocos. + +É um tipo de Vagoneta que atua como bloco de TNT móvel. + +É um bloco que produz um sinal Redstone com base na luz solar (ou na ausência desta). + +É um tipo de Vagoneta especial que funciona de modo similar a um Funil. Recolhe objetos que estão nos carris e nos contentores acima. + +Um tipo especial de Armadura que pode ser colocada num cavalo. Fornece 5 de Armadura. + +Um tipo especial de Armadura que pode ser colocada num cavalo. Fornece 7 de Armadura. + +Um tipo especial de Armadura que pode ser colocada num cavalo. Fornece 11 de Armadura. + +Usado para atrelar criaturas ao jogador ou a postes de Vedação. + +Utilizada para nomear criaturas no mundo. + Restitui 2,5{*ICON_SHANK_01*}. Restitui 1{*ICON_SHANK_01*}. Podes usar até 6 vezes. @@ -628,7 +709,7 @@ As cores da cama são sempre as mesmas, independentemente das cores da lã usada Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando bife cru numa fornalha. -Restituem 1,5{*ICON_SHANK_01*} ou podem ser cozinhadas numa fornalha. +Restitui 1,5{*ICON_SHANK_01*} ou pode ser cozinhado numa fornalha. Restituem 4{*ICON_SHANK_01*}. Criadas ao cozinhar costeletas de porco cruas numa fornalha. @@ -646,7 +727,7 @@ As cores da cama são sempre as mesmas, independentemente das cores da lã usada 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. +Envia constantemente uma descarga elétrica ou pode ser utilizada como recetor/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. @@ -661,7 +742,7 @@ Pode também ser utilizada para iluminação reduzida. 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. +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. @@ -822,7 +903,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm 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. +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. @@ -932,102 +1013,160 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm 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. +As Cabeças de Criatura podem ser colocadas como decoração ou usadas como máscara na ranhura de capacete. +Utilizado para executar ordens. + +Projeta um feixe de luz para o céu e pode fornecer Efeitos de Estado a jogadores próximos. + +Armazena blocos e objetos lá dentro. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. O baú preso também cria uma carga de Redstone quando aberto. + +Fornece uma carga de Redstone. A carga será mais forte se houver mais objetos na placa. + +Fornece uma carga de Redstone. A carga será mais forte se houver mais objetos na placa. Requer mais peso do que a placa leve. + +Usado como fonte de poder de Redstone. Pode voltar a ser transformado em Redstone. + +Usado para apanhar objetos ou para transferi-los para dentro e para fora de contentores. + +Um tipo de carril que pode ativar ou desativar Vagonetas com Funis e despoletar Vagonetas com TNT. + +Usado para agarrar e soltar objetos, ou para empurrar objetos para outro contentor, quando recebe uma carga de Redstone. + +Blocos coloridos criados através da aplicação de tinta em Barro Endurecido. + +Pode ser dado como alimento a Cavalos, Burros ou Mulas para curar até 10 Corações. Acelera o crescimento dos potros. + +Criado através da fundição de Barro numa fornalha. + +Fabricado a partir de vidro e de uma tinta. + +Fabricado a partir de Vidro Manchado. + +Uma forma compacta de armazenar Carvão. Pode ser usado como combustível numa Fornalha. + 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. - + +Morcego + +Estas criaturas voadoras estão em cavernas ou noutros grandes espaços fechados. + +Bruxa + +Estas inimigas estão nos pântanos e atacam-te atirando Poções. Largam Poções quando são mortas. + +Cavalo + +Estes animais podem ser domesticados e depois podem ser montados. + +Burro + +Estes animais podem ser domesticados e depois podem ser montados. Têm um baú preso a eles. + +Mula + +Nascem do cruzamento de um Cavalo com um Burro. Estes animais podem ser domesticados e depois podem ser montados e carregar baús. + +Cavalo Morto-vivo + +Cavalo Esqueleto + +Cérbero + +São criados a partir de Caveiras de Cérbero e Areia Movediça. Atiram caveiras explosivas contra ti. + Explosives Animator Concept Artist @@ -1374,6 +1513,8 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Mapa +Mapa Vazio + Disco Música - "13" Disco Música - "cat" @@ -1434,7 +1575,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Olho de Aranha -Olho de Aranha Fermentado +Olho Aranha Ferment. Pó de Blaze @@ -1452,7 +1593,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Carga de Fogo -Carga de Fogo (Carvão veg.) +Carga Fogo (Carv. veg.) Carga de Fogo (Carvão) @@ -1476,6 +1617,28 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Cabeça de Creeper +Estrela do Submundo + +Foguete Fogo de Art. + +Estrela Fogo de Art. + +Comparador de Redstone + +Vagoneta com TNT + +Vagoneta com Funil + +Armadura de Cavalo em Ferro + +Armadura de Cavalo em Ouro + +Armadura de Cavalo em Diamante + +Corda de Conduzir + +Etiqueta + Pedra Bloco de Erva @@ -1492,6 +1655,8 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Tábuas Madeira Selva +Placas de Madeira (qualquer) + Rebento Carvalho Jovem @@ -1606,7 +1771,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Placa Madeira Carvalho -Placa de Cobblestone +Placa Pedra Arredond. Placa de Tijolo @@ -1828,6 +1993,190 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Caveira +Bloco de Ordens + +Farol + +Baú Preso + +Placa Pressão Pond. (Leve) + +Placa Press. Pond. (Pesada) + +Comparador de Redstone + +Sensor de Luz do Dia + +Bloco de Redstone + +Funil + +Carril Ativador + +Soltador + +Barro Manchado + +Fardo de Palha + +Barro Endurecido + +Bloco de Carvão + +Barro Manchado Preto + +Barro Manchado Vermelho + +Barro Manchado Verde + +Barro Manchado Castanho + +Barro Manchado Azul + +Barro Manchado Roxo + +Barro Manchado Azul Ciano + +Barro Manch. Cinz. Claro + +Barro Manchado Cinzento + +Barro Manchado Rosa + +Barro Manchado Lima + +Barro Manchado Amarelo + +Barro Manch. Azul Claro + +Barro Manchado Magenta + +Barro Manchado Laranja + +Barro Manchado Branco + +Vidro Manchado + +Vidro Manchado Preto + +Vidro Manchado Vermelho + +Vidro Manchado Verde + +Vidro Manchado Castanho + +Vidro Manchado Azul + +Vidro Manchado Roxo + +Vidro Manchado Azul Ciano + +Vidro Manchado Cinzento Claro + +Vidro Manchado Cinzento + +Vidro Manchado Rosa + +Vidro Manchado Lima + +Vidro Manchado Amarelo + +Vidro Manchado Azul Claro + +Vidro Manchado Magenta + +Vidro Manchado Laranja + +Vidro Manchado Branco + +Painel de Vidro Manchado + +Painel de Vidro Manchado Preto + +Painel de Vidro Manchado Vermelho + +Painel de Vidro Manchado Verde + +Painel de Vidro Manchado Castanho + +Painel de Vidro Manchado Azul + +Painel de Vidro Manchado Roxo + +Painel de Vidro Manchado Azul Ciano + +Painel de Vidro Manchado Cinzento Claro + +Painel de Vidro Manchado Cinzento + +Painel de Vidro Manchado Rosa + +Painel de Vidro Manchado Lima + +Painel de Vidro Manchado Amarelo + +Painel de Vidro Manchado Azul Claro + +Painel de Vidro Manchado Magenta + +Painel de Vidro Manchado Laranja + +Painel de Vidro Manchado Branco + +Bola Pequena + +Bola Grande + +Forma de Estrela + +Forma de Creeper + +Explosão + +Forma Desconhecida + +Preto + +Vermelho + +Verde + +Castanho + +Azul + +Roxo + +Azul Ciano + +Cinzento Claro + +Cinzento + +Rosa + +Lima + +Amarelo + +Azul Claro + +Magenta + +Laranja + +Branco + +Personalizado + +Desaparecimento + +Cintilância + +Rasto + +Duração do Voo: +  Controlos Atuais Esquema @@ -2005,8 +2354,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm 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. @@ -2027,7 +2375,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm - Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_RT*}. + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2061,7 +2409,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm - Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_RT*}. + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2425,7 +2773,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm - 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. + 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. Há mais exemplos fora da área do tutorial. @@ -2443,7 +2791,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm - 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 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 através dos blocos. @@ -2608,6 +2956,211 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a barra de comida e a alimentação. + + Esta é a interface de inventário do cavalo. + + + + {*B*}Prime {*CONTROLLER_VK_A*} para continuar. + {*B*}Prime {*CONTROLLER_VK_B*} se já souberes como usar o inventário do cavalo. + + + + O inventário do cavalo permite-te equipar ou transferir objetos para o teu Cavalo, Burro ou Mula. + + + + Sela o teu Cavalo colocando-lhe uma Sela na ranhura para selas. Os Cavalos podem receber uma Armadura de Cavalo na ranhura para armaduras. + + + + Neste menu também podes transferir objetos entre o teu inventário e os alforjes presos aos Burros e Mulas. + + +Encontraste um Cavalo. + +Encontraste um Burro. + +Encontraste uma Mula. + + + {*B*}Prime {*CONTROLLER_VK_A*} para saber mais sobre Cavalos, Burros e Mulas. + {*B*}Prime {*CONTROLLER_VK_B*} se já souberes o que precisas sobre Cavalos, Burros e Mulas. + + + + Os Cavalos e os Burros estão sobretudo nas planícies. As Mulas podem ser criadas cruzando um Burro com um Cavalo, mas são inférteis. + + + + Todos os Cavalos, Burros e Mulas adultos podem ser montados. Porém, só os Cavalos podem receber uma armadura, e só as Mulas e os Burros podem ser equipados com alforjes para transportar objetos. + + + + Os Cavalos, os Burros e as Mulas têm de ser domesticados antes de poderem ser usados. Para domesticar um cavalo é preciso tentar montá-lo e conseguir permanecer em cima dele enquanto ele tenta sacudir o jogador para o chão. + + + + Quando ficam domesticados, surgem Corações de Amor à volta deles e deixam de tentar sacudir o jogador. + + + + Experimenta montar este cavalo agora. Usa {*CONTROLLER_ACTION_USE*} sem objetos ou ferramentas na mão para montá-lo. + + + + Para guiar um cavalo, tens de equipá-lo com uma sela, que podes comprar aos aldeões ou encontrar dentro de baús escondidos no mundo. + + + + Burros e Mulas domesticados podem receber alforjes se lhes prenderes um baú. Podes aceder aos alforjes enquanto montas ou quando te aproximas furtivamente do animal. + + + + Os Cavalos e os Burros (as Mulas não) podem ser procriados como os outros animais, usando Maçãs Douradas ou Cenouras Douradas. Os potros tornam-se cavalos adultos ao fim de algum tempo, mas podes acelerar o processo alimentando-os com trigo ou feno. + + + + Podes tentar domesticar Cavalos e Burros aqui, e nos baús que por aqui andam também encontrarás Selas, Armaduras de Cavalo e outros objetos úteis para Cavalos. + + + + Esta é a interface do Farol, que podes usar para escolher os poderes que o teu Farol concede. + + + + {*B*}Prime {*CONTROLLER_VK_A*} para continuar. + {*B*}Prime {*CONTROLLER_VK_B*} se já sabes como usar a interface do Farol. + + + + No menu do Farol podes selecionar 1 poder principal para o teu Farol. Quanto mais camadas tiver a tua pirâmide, mais poderes terás à escolha. + + + + Um Farol numa pirâmide com pelo menos 4 camadas permite-te escolher entre o poder secundário de Regeneração ou um poder principal mais forte. + + + + Para definir os poderes do teu Farol tens de sacrificar uma Esmeralda, um Diamante, Lingotes de Ferro ou Ouro na ranhura de pagamento. Uma vez definidos, os poderes irão emanar indefinidamente do Farol. + + +No topo desta pirâmide há um Farol inativo. + + + {*B*}Prime {*CONTROLLER_VK_A*} para saber mais sobre Faróis. + {*B*}Prime {*CONTROLLER_VK_B*} se já sabes o que precisas sobre Faróis. + + + + Os Faróis Ativos projetam um feixe de luz brilhante para o céu e atribuem poderes a jogadores próximos. São feitos com Vidro, Obsidiana e Estrelas do Submundo, que podem ser obtidas derrotando o Cérbero. + + + + Os Faróis têm de ser colocados de modo a captar a luz solar durante o dia. Os Faróis têm de ser colocados sobre Pirâmides de Ferro, Ouro, Esmeralda ou Diamante. Porém, o tipo de material não tem qualquer efeito na potência do farol. + + + + Experimenta usar o Farol para definir os poderes que ele concede. Podes usar os Lingotes de Ferro disponibilizados como forma de pagamento. + + +Esta divisão contém Funis. + + + {*B*}Prime {*CONTROLLER_VK_A*} para saber mais sobre Funis. + {*B*}Prime {*CONTROLLER_VK_B*} se já sabes o que precisas sobre Funis. + + + + Os Funis são usados para inserir ou remover objetos de contentores, e para recolher automaticamente os objetos que são atirados neles. + + + + Eles podem afetar Postos de Poções, Baús, Distribuidores, Soltadores, Vagonetas com Baús, Vagonetas com Funis, bem como outros Funis. + + + + Os Funis vão tentar sempre sugar objetos dos contentores adequados acima deles. Também vão tentar inserir objetos armazenados num contentor de destino. + + + + Porém, se um Funil for alimentado por Redstone tornar-se-á inativo e parará de sugar e de inserir objetos. + + + + Um Funil aponta na direção em que tenta colocar objetos. Para levar um Funil a apontar para um determinado bloco, coloca-o frente a esse bloco enquanto andas furtivamente. + + + + Há vários modelos de Funil para veres e experimentares nesta divisão. + + + + Esta é a interface do Fogo de Artifício, que podes usar para criar Fogo de Artifício e Estrelas de Fogo de Artifício. + + + + {*B*}Prime {*CONTROLLER_VK_A*} para continuar. + {*B*}Prime {*CONTROLLER_VK_B*} se já sabes como usar a interface do Farol. + + + + Para criar um Fogo de Artifício, coloca Pólvora e Papel na grelha de 3x3 que é apresentada acima do teu inventário. + + + + Opcionalmente, podes colocar várias Estrelas de Fogo de Artifício na grelha e adicioná-las ao Fogo de Artifício. + + + + Preencher mais ranhuras na grelha com Pólvora aumentará a altura a que todas as Estrelas de Fogo de Artifício vão explodir. + + + + Podes então retirar o Fogo de Artifício criado da ranhura de saída. + + + + As Estrelas de Fogo de Artifício podem ser criadas colocando Pólvora e Tinta na grelha. + + + + A tinta definirá a cor da explosão da Estrela de Fogo de Artifício. + + + + A forma da Estrela de Fogo de Artifício é definida adicionando um destes elementos: Carga de Fogo, Pepita de Ouro, Pena ou Cabeça de Criatura. + + + + Podes adicionar um rasto ou uma cintilância usando Diamantes ou Pó de Glowstone. + + + + Depois de criares uma Estrela de Fogo de Artifício, podes definir a cor de desaparecimento da Estrela de Fogo de Artifício criando-a com Tinta. + + + + Dentro dos baús há vários objetos que podem ser usados na criação de FOGO DE ARTIFÍCIO! + + + + {*B*}Prime{*CONTROLLER_VK_A*} para saber mais sobre Fogo de Artifício. + {*B*}Prime{*CONTROLLER_VK_B*} se já sabes o que queres sobre Fogo de Artifício. + + + + O Fogo de Artifício é um objeto decorativo que pode ser lançado à mão ou a partir de Distribuidores. É feito usando Papel, Pólvora e, opcionalmente, uma série de Estrelas de Fogo de Artifício. + + + + As cores, o desaparecimento, a forma, a dimensão e os efeitos (como rastos e cintilâncias) das Estrelas de Fogo de Artifício podem ser personalizados através da inclusão de ingredientes extra aquando da criação. + + + + Experimenta criar um Fogo de Artifício na Mesa de Criação usando um sortido de ingredientes dos baús. + +  Selecionar Usar @@ -2646,25 +3199,25 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C Retirar -Retirar tudo +Retirar Tudo -Retirar metade +Retirar Metade Colocar -Colocar tudo +Colocar Tudo -Colocar um +Colocar Um Largar -Largar tudo +Largar Tudo -Largar um +Largar Um Trocar -Mover rápido +Mover Rápido Limpar Seleção Rápida @@ -2830,6 +3383,22 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C Carregar Gravação para Xbox One +Montar + +Desmontar + +Prender Baú + +Lançar + +Atrelar + +Soltar + +Prender + +Nomear + OK Cancelar @@ -2842,7 +3411,7 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C Guardar Jogo -Sair sem guardar +Sair Sem Guardar Tens a certeza de que queres substituir os jogos guardados anteriormente pela versão atual deste mundo? @@ -3058,7 +3627,7 @@ Queres desbloquear o jogo completo? Vários -Preparação de Poções +Poções Poções @@ -3140,6 +3709,20 @@ Queres desbloquear o jogo completo? Distribuidor +Cavalo + +Soltador + +Funil + +Farol + +Poder Principal + +Poder Secundário + +Vagoneta + De momento, não existem ofertas de conteúdo transferível deste tipo disponíveis para este título. %s juntou-se ao jogo. @@ -3203,7 +3786,7 @@ Queres desbloquear o jogo completo? 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? +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. @@ -3225,7 +3808,7 @@ 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 +A Preparar Gravação Automática do Nível Tamanho HUD @@ -3299,10 +3882,14 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Modo Criativo +Modo de Jogo: Aventura + Sobrevivência Criativo +Aventura + Criado em Sobrevivência Criado em Criativo @@ -3323,6 +3910,8 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Superplano +Introduz uma semente para gerar novamente o mesmo terreno. Deixa em branco para um mundo aleatório. + Quando ativado, o jogo ficará online. Quando ativado, só os jogadores convidados podem aderir. @@ -3347,6 +3936,20 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Quanto ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador. +Quando desativada, impede que monstros e animais mudem blocos (por exemplo, explosões de Creeper não destroem blocos e as Ovelhas não comem Erva) ou apanhem objetos. + +Quando ativado, os jogadores mantêm o inventário quando morrem. + +Quando desativada, as criaturas não se reproduzem naturalmente. + +Quando desativado, os monstros e animais não deixam cair saques (por exemplo, os Creepers não largam pólvora). + +Quando desativada, os blocos não largam objetos quando são destruídos (por exemplo, os blocos de Pedra não deixam cair Pedra Arredondada). + +Quando desativada, os jogadores não regeneram naturalmente a sua saúde. + +Quando desativado, a hora do dia não muda. + Pacotes de Skins Temas @@ -3395,7 +3998,49 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? {*PLAYER*} foi agredido por {*SOURCE*} -{*PLAYER*} foi morto por {*SOURCE*} +{*PLAYER*} foi morto por {*SOURCE*} usando magia + +{*PLAYER*} caiu de uma escada + +{*PLAYER*} caiu de umas videiras + +{*PLAYER*} caiu fora da água + +{*PLAYER*} caiu de um local elevado + +{*PLAYER*} foi condenado a cair por {*SOURCE*} + +{*PLAYER*} foi condenado a cair por {*SOURCE*} + +{*PLAYER*} foi condenado a cair por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} caiu demasiado longe e foi liquidado por {*SOURCE*} + +{*PLAYER*} caiu demasiado longe e foi liquidado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} entrou no fogo enquanto combatia {*SOURCE*} + +{*PLAYER*} ficou esturricado enquanto combatia {*SOURCE*} + +{*PLAYER*} tentou nadar em lava para fugir de {*SOURCE*} + +{*PLAYER*} afogou-se enquanto tentava fugir de {*SOURCE*} + +{*PLAYER*} foi de encontro a um cato enquanto tentava fugir de {*SOURCE*} + +{*PLAYER*} foi rebentado por {*SOURCE*} + +{*PLAYER*} feneceu + +{*PLAYER*} foi assassinado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi alvejado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi atingido por uma bola de fogo por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi esmagado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi morto por {*SOURCE*} usando {*ITEM*} Rochas Enevoadas @@ -3427,9 +4072,9 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Já não podes usar contentores (tais como baús) -Já não podes atacar habitantes +Já não podes atacar criaturas -Já podes atacar habitantes +Já podes atacar criaturas Já não podes atacar jogadores @@ -3560,9 +4205,9 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? 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 tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos. -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. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos 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. @@ -3572,6 +4217,8 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? 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 Ovo de Geração. Foi alcançado o número máximo de Morcegos 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. @@ -3580,17 +4227,19 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? 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. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos 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 cavalos 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. +O número máximo de Cabeças de Criatura num mundo foi alcançado. Inverter @@ -3600,7 +4249,7 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Regenerar -Conteúdo transferível +Conteúdo Transferível Alterar Skin @@ -3613,27 +4262,43 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? 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 - + +Opções de Jogo + +Perturbação de Criaturas + +Manter Inventário + +Geração de Criaturas + +Saques de Criaturas + +Queda de Peças + +Regeneração Natural + +Ciclo da Luz do Dia + Pode Construir e Escavar Pode Usar Portas e Interruptores @@ -3672,7 +4337,7 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Semente para o Gerador de Mundos -Deixar livre para uma semente aleatória +Deixar livre p/ semente aleatória Jogadores @@ -3820,6 +4485,14 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Veneno +Cérbero + +Aumento de Saúde + +Absorção + +Saturação + de Velocidade de Lentidão @@ -3858,6 +4531,14 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? de Veneno +de Decadência + +de Aumento de Saúde + +de Absorção + +de Saturação + II @@ -3954,6 +4635,22 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Reduz a saúde dos jogadores, animais e monstros afetados ao longo do tempo. +Quando se Aplica: + +Força de Salto de Cavalo + +Reforços Mortos-vivos + +Saúde Máx. + +Alcance de Seguimento das Criaturas + +Resistência a Ataques + +Velocidade + +Danos de Ataque + Precisão Golpear @@ -4044,7 +4741,7 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? 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 1{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. Restitui 3{*ICON_SHANK_01*}. Fabricada a partir de uma cenoura e de pepitas de ouro. @@ -4112,7 +4809,7 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Bloco de Quartzo -Bloco de Quartzo Esculpido +Bloc. Quartzo Esculpido Bloco Pilar de Quartzo @@ -4442,11 +5139,11 @@ Todos os Baús Ender de um mundo estão ligados. Os objetos colocados num Baú E Xbox 360 -BACK +Anterior 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 Grav. Xbox One Carregar Gravação diff --git a/Minecraft.Client/Common/Media/skin.swf b/Minecraft.Client/Common/Media/skin.swf index c4660d59..6206ca47 100644 Binary files a/Minecraft.Client/Common/Media/skin.swf 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 index 8438f11d..f0482ec7 100644 Binary files a/Minecraft.Client/Common/Media/skinGraphics.swf 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 index 55123e69..7f75f423 100644 Binary files a/Minecraft.Client/Common/Media/skinGraphicsHud.swf 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 index 6612beaf..639f5bda 100644 Binary files a/Minecraft.Client/Common/Media/skinGraphicsInGame.swf and b/Minecraft.Client/Common/Media/skinGraphicsInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHD.swf b/Minecraft.Client/Common/Media/skinHD.swf index c80fa406..12d35caf 100644 Binary files a/Minecraft.Client/Common/Media/skinHD.swf 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 index 27e3798a..7ba08bc8 100644 Binary files a/Minecraft.Client/Common/Media/skinHDGraphics.swf 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 index 2c467474..bb51379e 100644 Binary files a/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf 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 index 7a39b099..d014d317 100644 Binary files a/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf and b/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDHud.swf b/Minecraft.Client/Common/Media/skinHDHud.swf index fcdbe396..0e2a9ef2 100644 Binary files a/Minecraft.Client/Common/Media/skinHDHud.swf 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 index cfc91228..b9aaa068 100644 Binary files a/Minecraft.Client/Common/Media/skinHDInGame.swf 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 index 5ed2b349..dd80d1e7 100644 Binary files a/Minecraft.Client/Common/Media/skinHDLabels.swf 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 index c98bf708..31b3ff00 100644 Binary files a/Minecraft.Client/Common/Media/skinHud.swf 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 index bee85d33..fd3147b6 100644 Binary files a/Minecraft.Client/Common/Media/skinInGame.swf 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 index 04a41d33..e562acbe 100644 Binary files a/Minecraft.Client/Common/Media/skinLabels.swf 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 index 5d4517d2..da03a9ab 100644 --- a/Minecraft.Client/Common/Media/skin_Minecraft.xui +++ b/Minecraft.Client/Common/Media/skin_Minecraft.xui @@ -2,7 +2,7 @@ 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] +[LayerFolders]7|+How To Play|44|+|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|19|+|0|-Inventory Containers Special|41|+|0|+Inventory Containers Shared|24|+|0|+Lists|0|+Leaderboard|4|+|0|+Players|6|+|25|+|0|+Tooltips|22|+|0|+Credits|8|+|0|-Labels and Text|53|+|0|+Other|11|+|0|+ImagePresenters|2|+|0|+Default Controls|18|+|0[/LayerFolders] @@ -12951,6 +12951,406 @@ +RStick_Button +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +61.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +rs_graphic +58.000000 +48.000000 +0.000000,-5.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRS_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 + + + +rs_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 + + + + + + +RStick_ButtonSmall +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\ButtonRS_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 + + + + + + XuiListTexturePackButtonSmall 40.000000 40.000000 @@ -29314,6 +29714,177 @@ +ItemIconBlankSmall +22.000000 +22.000000 + + + +image +22.000000 +22.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +ItemIconBlank +42.000000 +42.000000 + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + ItemIcon 64.000000 64.000000 @@ -29345,68 +29916,2150 @@ Normal - - -EndNormal - -stop - - -Focus + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +BeaconButton +44.000000 +44.000000 +15 + + + +Button +44.000000 +44.000000 +Graphics\Beacon_Button_Normal.png + + + + +Icon +36.000000 +36.000000 +4.000000,4.000000,0.000000 +15 +true + + + +Icon +36.000000 +36.000000 +false +16 +48 + + + + + +Normal + +stop + + +Tick + +stop + + +Cross + +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 + + +Wither + +stop + + +HealthBoost + +stop + + +Absorption + +stop + + + +Icon +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\Beacon_Button_Tick.png + + + +0 +true + + + + +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 + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Wither.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + + + + + +Normal + +stop + + +Pressed + +stop + + +Disabled + +stop + + +Hover + +stop + + + +Button +ImagePath + + +0 +Graphics\Beacon_Button_Normal.png + + + +0 +Graphics\Beacon_Button_Pressed.png + + + +0 +Graphics\Beacon_Button_Disabled.png + + + +0 +Graphics\Beacon_Button_Hover.png + + + + + + +BeaconButtonSmall +22.000000 +22.000000 +15 + + + +Button +22.000000 +22.000000 +8 +Graphics\Beacon_Button_Normal.png + + + + +Icon +18.000000 +18.000000 +2.000000,2.000000,0.000000 +15 +true + + + +Icon +18.000000 +18.000000 +false +16 +48 + + + + + +Normal + +stop + + +Tick + +stop + + +Cross + +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 + + +Wither + +stop + + +HealthBoost + +stop + + +Absorption + +stop + + + +Icon +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\Beacon_Button_Tick.png + + + +0 +true + + + + +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 + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Wither.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + + + + + +Normal + +stop + + +Pressed + +stop + + +Disabled + +stop + + +Hover + +stop + + + +Button +ImagePath +SizeMode + + +0 +Graphics\Beacon_Button_Normal.png +8 + + + +0 +Graphics\Beacon_Button_Pressed.png +4 + + + +0 +Graphics\Beacon_Button_Disabled.png +8 + + + +0 +Graphics\Beacon_Button_Hover.png +8 + + + + + + +ItemGridHorseArmor +42.000000 +42.000000 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonHorseArmor +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonHorseArmor +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 +16 +Graphics\Horse_Armor_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 + + + + + + +ItemGridHorseSaddle +42.000000 +42.000000 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonHorseSaddle +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonHorseSaddle +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 +16 +Graphics\Horse_Saddle_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 + + + + + + +HorsePanel +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, + + + + +HorseControl +283.000000 +36.000000 +15 +CXuiCtrlMinecraftHorse + + + + + +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 + + - - -FocusLoop +0 +0xff0f0f0f + + - - -EndFocus +1 +0xff0f0f0f + + -gotoandplay -FocusLoop - - -NormalDisable +0 +0xff0f0f0f + + - - -EndNormalDisable - -stop - - -FocusDisable +0 +0xffebebeb + + - - -InactiveFocusLoop +0 +0xffebebeb + + - - -EndFocusDisable +0 +0xffebebeb + + -gotoandplay -InactiveFocusLoop - - -Press +0 +0xffebebeb + + - - -EndPress - -stop - - -NormalSel - - - -EndNormalSel - -stop - - +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + @@ -29912,6 +32565,419 @@ stop + +Wither + +stop + + +HealthBoost + +stop + + +Absorption + +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 + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Wither.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.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 + + +Wither + +stop + + +HealthBoost + +stop + + +Absorption + +stop + Icon @@ -30025,370 +33091,23 @@ 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 +Graphics\PotionEffect\Potion_Effect_Icon_Wither.png - + 0 true -Graphics\PotionEffect\Potion_Effect_Icon_Water_Breathing.png +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png - + 0 true -Graphics\PotionEffect\Potion_Effect_Icon_Weakness.png +Graphics\PotionEffect\Potion_Effect_Icon_HealthBoost.png @@ -34088,6 +36807,121 @@ +HorseJumpProgress +548.000000 +15.000000 + + + +ProgressBody +548.000000 +15.000000 + + + +back +182.000000 +5.000000 +15 +4 +Graphics\HUD\HorseJump_bar_empty.png +48 + + + + +bar +182.000000 +5.000000 +15 +false +true + + + +bar +182.000000 +5.000000 +4 +Graphics\HUD\HorseJump_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 + + + + + + + BossHealthLabel 500.000000 66.000000 @@ -35336,6 +38170,56 @@ stop + +FullWither + +stop + + +FullWitherFlash + +stop + + +HalfWither + +stop + + +HalfWitherFlash + +stop + + +FullAbsorb + +stop + + +HalfAbsorb + +stop + + +Horse_Full + +stop + + +Horse_Full_Flash + +stop + + +Horse_Half + +stop + + +Horse_Half_Flash + +stop + Border @@ -35350,6 +38234,46 @@ 0 Graphics\HUD\Health_Background_Flash.png + + +0 +Graphics\HUD\Health_Background.png + + + +0 +Graphics\HUD\Health_Background_Flash.png + + + +0 +Graphics\HUD\Health_Background.png + + + +0 +Graphics\HUD\Health_Background_Flash.png + + + +0 +Graphics\HUD\Health_Background.png + + + +0 +Graphics\HUD\Health_Background_Flash.png + + + +0 +Graphics\HUD\Health_Background.png + + + +0 +Graphics\HUD\Health_Background_Flash.png + Heart @@ -35415,6 +38339,66 @@ true Graphics\HUD\Health_Full_Poison_Flash.png + + +0 +true +Graphics\HUD\Health_Full_Wither.png + + + +0 +true +Graphics\HUD\Health_Full_Wither_Flash.png + + + +0 +true +Graphics\HUD\Health_Half_Wither.png + + + +0 +true +Graphics\HUD\Health_Half_Wither_Flash.png + + + +0 +true +Graphics\HUD\Health_Full_Absorb.png + + + +0 +true +Graphics\HUD\Health_Half_Absorb.png + + + +0 +true +Graphics\HUD\HorseHealth_Full.png + + + +0 +true +Graphics\HUD\HorseHealth_Full_Flash.png + + + +0 +true +Graphics\HUD\HorseHealth_Half.png + + + +0 +true +Graphics\HUD\HorseHealth_Half_Flash.png + @@ -42205,6 +45189,23 @@ +ImHowToPlayEnderchest +339.000000 +342.000000 + + + +XuiImageBreeding +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Enderchest.png + + + + + ImHowToPlayBrewing 339.000000 342.000000 @@ -42698,18 +45699,130 @@ -ImHowToPlayEnderchest -339.000000 -342.000000 +ImHowToPlayBeaconSmall +260.000000 +290.000000 -XuiImageBreeding -451.000000 -455.000000 -0.750000,0.750000,0.750000 +Image +336.000000 +290.000000 1 -Graphics\HowToPlay\HowToPlay_Enderchest.png +Graphics\HowToPlay\HowToPlay_Beacon_Small.png + + + + + +ImHowToPlayBeacon +430.000000 +430.000000 + + + +Image +430.000000 +430.000000 +1 +Graphics\HowToPlay\HowToPlay_Beacon.png + + + + + +ImHowToPlayHorsesSmall +248.000000 +146.000000 + + + +Image +248.000000 +146.000000 +1 +Graphics\HowToPlay\HowToPlay_Horses_Small.png +48 + + + + + +ImHowToPlayHorses +525.000000 +308.000000 + + + +Image +516.000000 +302.000000 +1 +Graphics\HowToPlay\HowToPlay_Horses.png + + + + + +ImHowToPlayFireworksSmall +260.000000 +280.000000 + + + +Image +260.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Fireworks_Small.png + + + + + +ImHowToPlayFireworks +428.000000 +450.000000 + + + +Image +428.000000 +450.000000 +1 +Graphics\HowToPlay\HowToPlay_Fireworks.png + + + + + +ImHowToPlayHopperSmall +260.000000 +220.000000 + + + +Image +260.000000 +220.000000 +1 +Graphics\HowToPlay\HowToPlay_Hopper_Small.png + + + + + +ImHowToPlayHopper +430.000000 +336.000000 + + + +Image +430.000000 +336.000000 +1 +Graphics\HowToPlay\HowToPlay_Hopper.png @@ -42769,4 +45882,76 @@ + + +Beacon_1 +40.000000 +40.000000 + + + +Image +40.000000 +40.000000 +15 +8 +Graphics\Beacon_1.png +48 + + + + + +Beacon_2 +40.000000 +40.000000 + + + +Image +40.000000 +40.000000 +15 +8 +Graphics\Beacon_2.png +48 + + + + + +Beacon_3 +40.000000 +40.000000 + + + +Image +40.000000 +40.000000 +15 +8 +Graphics\Beacon_3.png +48 + + + + + +Beacon_4 +40.000000 +40.000000 + + + +Image +40.000000 +40.000000 +15 +8 +Graphics\Beacon_4.png +48 + + + diff --git a/Minecraft.Client/Common/Media/splashes.txt b/Minecraft.Client/Common/Media/splashes.txt index c12a2f9c..86e38941 100644 --- a/Minecraft.Client/Common/Media/splashes.txt +++ b/Minecraft.Client/Common/Media/splashes.txt @@ -295,7 +295,7 @@ 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 +SOPA means LOSER in Swedish! Big Pointy Teeth! Bekarton guards the gate! Mmmph, mmph! @@ -309,4 +309,6 @@ Pretty scary! I have a suggestion. Now with extra hugs! Almost java 6! -Woah. \ No newline at end of file +Woah. +HURNERJSGER? +What's up, Doc? \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/strings.resx b/Minecraft.Client/Common/Media/strings.resx index 21a7078a..9e824d0f 100644 --- a/Minecraft.Client/Common/Media/strings.resx +++ b/Minecraft.Client/Common/Media/strings.resx @@ -408,6 +408,27 @@ When loading or creating a world, you can press the "More Options" button to ent {*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*} + {*T2*}Daylight Cycle{*ETW*}{*B*} + When disabled, the time of day will not change.{*B*}{*B*} + + {*T2*}Keep Inventory{*ETW*}{*B*} + When enabled, players will keep their inventory when they die.{*B*}{*B*} + + {*T2*}Mob Spawning{*ETW*}{*B*} + When disabled, mobs will not spawn naturally.{*B*}{*B*} + + {*T2*}Mob Griefing{*ETW*}{*B*} + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items.{*B*}{*B*} + + {*T2*}Mob Loot{*ETW*}{*B*} + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder).{*B*}{*B*} + + {*T2*}Tile Drops{*ETW*}{*B*} + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone).{*B*}{*B*} + + {*T2*}Natural Regeneration{*ETW*}{*B*} + When disabled, players will not regenerate health naturally.{*B*}{*B*} + {*T1*}World Generation Options{*ETW*}{*B*} When creating a new world there are some additional options.{*B*}{*B*} @@ -451,25 +472,29 @@ To modify the privileges for a player, select their name and press{*CONTROLLER_V 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*} + {*KICK_PLAYER_DESCRIPTION*}{*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. + + 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. + + Next Page @@ -566,100 +591,148 @@ so they can easily join you. - -{*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*} + {*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- Added new items - Hardened Clay, Stained Clay, Block of Coal, Hay Bale, Activator Rail, Block of Redstone, Daylight Sensor, Dropper, Hopper, Minecart with Hopper, Minecart with TNT, Redstone Comparator, Weighted Pressure Plate, Beacon, Trapped Chest, Firework Rocket, Firework Star, Nether Star, Lead, Horse Armor, Name Tag, Horse Spawn Egg{*B*} +- Added new Mobs - Wither, Wither Skeletons, Witches, Bats, Horses, Donkeys and Mules{*B*} +- Added new terrain generation features - Witch Huts.{*B*} +- Added Beacon interface.{*B*} +- Added Horse interface.{*B*} +- Added Hopper interface.{*B*} +- Added Fireworks - Fireworks interface is accessible from the Crafting Table when you have the ingredients to craft a Firework Star or Firework Rocket.{*B*} +- Added 'Adventure Mode' - You can only break blocks with the correct tools.{*B*} +- Added lots of new sounds.{*B*} +- Mobs, items and projectiles can now pass through portals.{*B*} +- Repeaters can now be locked by powering their sides with another Repeater.{*B*} +- Zombies and Skeletons can now spawn with different weapons and armor.{*B*} +- New death messages.{*B*} +- Name mobs with a Name Tag, and rename containers to change the title when the menu is open.{*B*} +- Bonemeal no longer instantly grows everything to full size, and instead randomly grows in stages.{*B*} +- A Redstone signal describing the contents of Chests, Brewing Stands, Dispensers and Jukeboxes can be detected by placing a Redstone Comparator directly against them.{*B*} +- Dispensers can face in any direction.{*B*} +- Eating a Golden Apple gives the player extra "absorption" health for a short period.{*B*} +- The longer you remain in an area the harder the monsters that spawn in that area will 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*} - 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*} - +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*} - Hardened Clay, Stained Clay, Block of Coal, Hay Bale, Activator Rail, Block of Redstone, Daylight Sensor, Dropper, Hopper, Minecart with Hopper, Minecart with TNT, Redstone Comparator, Weighted Pressure Plate, Beacon, Trapped Chest, Firework Rocket, Firework Star, Nether Star, Lead, Horse Armor, Name Tag, Horse Spawn Egg{*B*}{*B*} +{*T1*}New Mobs{*ETB*} - Wither, Wither Skeletons, Witches, Bats, Horses, Donkeys and Mules{*B*}{*B*} +{*T1*}New Features{*ETB*} - Tame and ride a horse, craft fireworks and put on a show, name animals and monsters with a Name Tag, create more advanced Redstone circuits, and new Host Options to help control what guests to your world can do!{*B*}{*B*} +{*T1*}New Tutorial World{*ETB*} – Learn how to use the old and new features in the Tutorial World. See if you can find all the secret Music Discs hidden in the world!{*B*}{*B*} + + + + + Horses + + + {*T3*}HOW TO PLAY : HORSES{*ETW*}{*B*}{*B*} +Horses and Donkeys are found mainly in open plains. Mules are the offspring of a Donkey and a Horse, but are infertile themselves.{*B*} +All adult Horses, Donkeys and Mules can be ridden. However only Horses can be armored, and only Mules and Donkeys may be equipped with saddlebags for transporting items.{*B*}{*B*} +Horses, Donkeys and Mules must be tamed before they can be used. A horse is tamed by attempting to ride it, and managing to stay on the horse while it attempts to throw the rider off.{*B*} +When Love Hearts appear around the horse, it is tame, and will no longer attempt to throw the player off. To steer a horse, the player must equip the horse with a Saddle.{*B*}{*B*} +Saddles can be bought from villagers or found inside Chests hidden in the world.{*B*} +Tame Donkeys and Mules can be given saddlebags by attaching a Chest. These saddlebags can then be accessed whilst riding or sneaking.{*B*}{*B*} +Horses and Donkeys (but not Mules) can be bred like other animals using Golden Apples or Golden Carrots.{*B*} +Foals will grow into adult horses over time, although feeding them Wheat or Hay will speed this up.{*B*} + + + + + Beacons + + + {*T3*}HOW TO PLAY : BEACONS{*ETW*}{*B*}{*B*} +Active Beacons project a bright beam of light into the sky and grant powers to nearby players.{*B*} +They are crafted with Glass, Obsidian and Nether Stars, which can be obtained by defeating the Wither.{*B*}{*B*} +Beacons must be placed so that they are in sunlight during the day. Beacons must be placed on Pyramids of Iron, Gold, Emerald or Diamond.{*B*} +The material the Beacon is placed on has no effect on the power of the Beacon.{*B*}{*B*} +In the Beacon menu you can select one primary power for your Beacon. The more tiers your pyramid has the more powers you will have to choose from.{*B*} +A Beacon on a pyramid with at least four tiers also gives the option of either the Regeneration secondary power or a stronger primary power.{*B*}{*B*} +To set the powers of your Beacon you must sacrifice an Emerald, Diamond, Gold or Iron Ingot in the payment slot.{*B*} +Once set, the powers will emanate from the Beacon indefinitely.{*B*} + + + + + Fireworks + + + {*T3*}HOW TO PLAY : FIREWORKS{*ETW*}{*B*}{*B*} +Fireworks are decorative items that can be launched by hand or from Dispensers. They are crafted using Paper, Gunpowder and optionally a number of Firework Stars.{*B*} +The colors, fade, shape, size, and effects (such as trails and twinkle) of Firework Stars can be customized by including additional ingredients when crafting.{*B*}{*B*} +To craft a Firework place Gunpowder and Paper in the 3x3 crafting grid that is shown above your inventory.{*B*} +You can optionally place multiple Firework Stars in the crafting grid to add them to the Firework.{*B*} +Filling more slots in the crafting grid with Gunpowder will increase the height at which all the Firework Stars will explode.{*B*}{*B*} +You can then take the crafted Firework out of the output slot.{*B*}{*B*} +Firework Stars can be crafted by placing Gunpowder and Dye into the crafting grid.{*B*} + - The Dye will set the color of the explosion of the Firework Star.{*B*} + - The shape of the Firework Star is set by adding either a Fire Charge, Gold Nugget, Feather or Mob Head.{*B*} + - A trail or a twinkle can be added using Diamonds or Glowstone Dust.{*B*}{*B*} +After a Firework Star has been crafted, you can set the fade color of the Firework Star by crafting it with Dye. + + + + + Hoppers + + + {*T3*}HOW TO PLAY : HOPPERS{*ETW*}{*B*}{*B*} +Hoppers are used to insert or remove items from containers, and to automatically pick up items thrown into them.{*B*} +They can affect Brewing Stands, Chests, Dispensers, Droppers, Minecarts with Chests, Minecarts with Hoppers, as well as other Hoppers.{*B*}{*B*} +Hoppers will continuously attempt to suck items out of a suitable container placed above them. They will also attempt to insert stored items into an output container.{*B*} +If a Hopper is powered by Redstone it will become inactive and stop both sucking and inserting items.{*B*}{*B*} +A Hopper points in the direction it tries to output items. To make a Hopper point to a particular block, place the Hopper against that block whilst sneaking.{*B*} + + + Droppers + + + {*T3*}HOW TO PLAY : DROPPERS{*ETW*}{*B*}{*B*} +When powered by Redstone, Droppers will drop a single random item contained within them onto the ground. Use {*CONTROLLER_ACTION_USE*} to open the Dropper and then you can load the Dropper with items from your inventory.{*B*} +If the Dropper is facing a Chest or another type of Container, the item will be placed into that instead. Long chains of Droppers can be constructed to transport items over a distance, but for this to work they will have to be alternately powered on and off. + + + +  - Deals more damage than by hand. + 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. + 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. + Required to mine stone-related blocks and ore. - Used to chop wood-related blocks faster than by hand. + Used to chop wood-related blocks faster than by hand. - Used to till dirt and grass blocks to prepare for crops. + Used to till dirt and grass blocks to prepare for crops. - Wooden doors are activated by using, hitting them or with Redstone. + Wooden doors are activated by using, hitting them or with Redstone. - Iron doors can only be opened by Redstone, buttons or switches. + Iron doors can only be opened by Redstone, buttons or switches. - - NOT USED + + NOT USED - NOT USED + NOT USED - NOT USED + NOT USED - NOT USED + NOT USED @@ -679,807 +752,936 @@ Pumpkin Pie, Night Vision Potion, Invisibility Potion, Nether Quartz, Nether Qua - Gives the user 2 Armor when worn. + Gives the user 2 Armor when worn. - Gives the user 5 Armor when worn. + Gives the user 5 Armor when worn. - Gives the user 4 Armor when worn. + Gives the user 4 Armor when worn. - Gives the user 1 Armor when worn. + Gives the user 1 Armor when worn. - Gives the user 2 Armor when worn. + Gives the user 2 Armor when worn. - Gives the user 6 Armor when worn. + Gives the user 6 Armor when worn. - Gives the user 5 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 2 Armor when worn. + Gives the user 2 Armor when worn. - Gives the user 5 Armor when worn. + Gives the user 5 Armor when worn. - Gives the user 3 Armor when worn. + Gives the user 3 Armor when worn. - Gives the user 1 Armor when worn. + Gives the user 1 Armor when worn. - Gives the user 3 Armor when worn. + Gives the user 3 Armor when worn. - Gives the user 8 Armor when worn. + Gives the user 8 Armor when worn. - Gives the user 6 Armor when worn. + Gives the user 6 Armor when worn. - Gives the user 3 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. + 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. + 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 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 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 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 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 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. Is not influenced by gravity like normal Sand. - Used as a building material. + Used as a building material. - Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. + 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. + 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 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. + 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. + 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 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. + 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. + 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. + 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 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 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 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, lava and milk. - Used to hold and transport water. + Used to hold and transport water. - Used to hold and transport lava. + Used to hold and transport lava. - Used to hold and transport milk. + Used to hold and transport milk. - Used to create fire, ignite TNT, and open a portal once it has been built. + Used to create fire, ignite TNT, and open a portal once it has been built. - Used to catch fish. + Used to catch fish. - Displays positions of the Sun and Moon. + Displays positions of the Sun and Moon. - Points to your start point. + Points to your start point. - Will create an image of an area explored while held. This can be used for path-finding. + Will create an image of an area explored while held. This can be used for path-finding. + + + When used becomes a map of the part of the world that you are in, and gets filled in as you explore. - Allows for ranged attacks by using arrows. + Allows for ranged attacks by using arrows. - Used as ammunition for bows. + Used as ammunition for bows. + + + Dropped by the Wither, used in crafting Beacons. + + + When activated, create colorful explosions. The color, effect, shape and fade are determined by the Firework Star used when the Firework is created. + + + Used to determine the color, effect and shape of a Firework. + + + Used in Redstone circuits to maintain, compare, or subtract signal strength, or to measure certain block states. + + + Is a type of Minecart that acts as a moving TNT block. + + + Is a block that outputs a Redstone signal based on sunlight (or lack of sunlight). + + + Is a special type of Minecart that functions similarly to a Hopper. It will collect items lying on tracks and from containers above it. + + + A special type of Armor that can be equipped to a horse. Provides 5 Armor. + + + A special type of Armor that can be equipped to a horse. Provides 7 Armor. + + + A special type of Armor that can be equipped to a horse. Provides 11 Armor. + + + Used to leash mobs to the player or Fence posts. + + + Used to name mobs in the world. + - Restores 2.5{*ICON_SHANK_01*}. + Restores 2.5{*ICON_SHANK_01*}. - Restores 1{*ICON_SHANK_01*}. Can be used 6 times. + Restores 1{*ICON_SHANK_01*}. Can be used 6 times. - Restores 1{*ICON_SHANK_01*}. + Restores 1{*ICON_SHANK_01*}. - Restores 1{*ICON_SHANK_01*}. + Restores 1{*ICON_SHANK_01*}. - Restores 3{*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 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 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 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 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 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 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 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.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 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*}, 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. + 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 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. + 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. + 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 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 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. + 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. + 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. + Used to guide minecarts. - When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. + 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. + 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 you, an animal, or a monster along rails. - Used to transport goods along rails. + Used to transport goods along rails. - Will move along rails and can push other minecarts when coal is put in it. + Will move along rails and can push other minecarts when coal is put in it. - Used to travel in water more quickly than swimming. + Used to travel in water more quickly than swimming. - Collected from sheep, and can be colored with dyes. + 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 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 black wool. - Used as a dye to create green 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 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 silver wool. - Used as a dye to create yellow wool. + Used as a dye to create yellow wool. - Used as a dye to create red 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 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 pink wool. - Used as a dye to create orange wool. + Used as a dye to create orange wool. - Used as a dye to create lime wool. + Used as a dye to create lime wool. - Used as a dye to create gray wool. + Used as a dye to create gray wool. - Used as a dye to create light 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 light blue wool. - Used as a dye to create cyan wool. + Used as a dye to create cyan wool. - Used as a dye to create purple wool. + Used as a dye to create purple wool. - Used as a dye to create magenta wool. + Used as a dye to create magenta wool. - Used as dye to create Blue Wool. + Used as dye to create Blue Wool. - Plays Music Discs. + Plays Music Discs. - Use these to create very strong tools, weapons or armor. + 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 brighter light than torches. Melts snow/ice and can be used underwater. - Used to create books and maps. + Used to create books and maps. - Can be used to create a bookshelves or enchanted to make Enchanted Books. + Can be used to create bookshelves or enchanted to make Enchanted Books. - Allows the creation of more powerful enchantments when placed around the Enchantment Table. + Allows the creation of more powerful enchantments when placed around the Enchantment Table. - 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 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 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 pickaxe to collect coal. - Can be mined with a stone pickaxe or better to collect lapis lazuli. + 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 diamonds. - Can be mined with an iron pickaxe or better to collect redstone dust. + Can be mined with an iron pickaxe or better to collect redstone dust. - Can be mined with a pickaxe to collect cobblestone. + Can be mined with a pickaxe to collect cobblestone. - Collected using a shovel. Can be used for construction. + Collected using a shovel. Can be used for construction. - Can be planted and it will eventually grow into a tree. + Can be planted and it will eventually grow into a tree. - This cannot be broken. + This cannot be broken. - Sets fire to anything that touches it. Can be collected in a bucket. + 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. 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. + 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. + 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. + 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. + Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. - Baked from clay in a furnace. + Baked from clay in a furnace. - Can be baked into bricks 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. + When broken drops clay balls which can be baked into bricks in a furnace. - A compact way to store snowballs. + A compact way to store snowballs. - Can be dug with a shovel to create snowballs. + Can be dug with a shovel to create snowballs. - Sometimes produces wheat seeds when broken. + Sometimes produces wheat seeds when broken. - Can be crafted into a dye. + Can be crafted into a dye. - Can be crafted with a bowl to make stew. + 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. + 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. + 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. + 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. + When fully grown, crops can be harvested to collect wheat. - Ground that has been prepared ready to plant seeds. + Ground that has been prepared ready to plant seeds. - Can be cooked in a furnace to create a green dye. + Can be cooked in a furnace to create a green dye. - Can be crafted to create sugar. + 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. + 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. + Burns forever if set alight. - Slows the movement of anything walking over it. + Slows the movement of anything walking over it. - Standing in the portal allows you to pass between the Overworld and the Nether. + 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. + 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 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 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. + 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! + 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. + 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. + 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. + 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 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 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. + 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. + 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 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 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. + 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. + 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. + 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. + Found in dungeons, can be used for construction and decoration. - Used to obtain wool from sheep and harvest leaf blocks. + 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 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. + 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. + Made from Stone blocks, and commonly found in Strongholds. - Used as a barrier, similar to fences. + Used as a barrier, similar to fences. - Similar to a door, but used primarily with fences. + Similar to a door, but used primarily with fences. - Can be crafted from Melon Slices. + Can be crafted from Melon Slices. - Transparent blocks that can be used as an alternative to Glass Blocks. + Transparent blocks that can be used as an alternative to Glass Blocks. - Can be planted to grow pumpkins. + Can be planted to grow pumpkins. - Can be planted to grow melons. + 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. + 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. + 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. + Can be used for construction and decoration. - Slows movement when walking through it. Can be destroyed using shears to collect string. + 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. + 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. + 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. + 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. + 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, 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. + 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. + 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. + 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. + 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. + 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. + 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, 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, or crafted with other items to make Eye of Ender or Magma Cream. - Used in potion brewing. + Used in potion brewing. - Used for making Potions and Splash Potions. + 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. + 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. + 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. + Used in potion brewing. - Similar to Grass Blocks, but very good for growing mushrooms on. + Similar to Grass Blocks, but very good for growing mushrooms on. - Floats on water, and can be walked on. + Floats on water, and can be walked on. - Used to build Nether Fortresses. Immune to Ghast's fireballs. + Used to build Nether Fortresses. Immune to Ghast's fireballs. - Used in Nether Fortresses. + Used in Nether Fortresses. - Found in Nether Fortresses, and will drop Nether Wart when broken. + 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 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. + 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. + 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. + 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. + 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. + 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. + 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. + 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. + 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. - - 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. + + Created by smelting Netherrack in a furnace. Can be crafted into Nether Brick blocks. - - When powered they emit light. + + When powered they emit light. - - Can be farmed to collect Cocoa Beans. + + 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 + Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + Used to execute commands. + + + Projects a beam of light into the sky and can provide Status Effects to nearby players. + + + Stores blocks and items inside. Place two chest side by side to create a larger chest with double capacity. The trapped chest also creates a Redstone charge when opened. + + + Provides a Redstone charge. The charge will be stronger if more items are on the plate. + + + Provides a Redstone charge. The charge will be stronger if more items are on the plate. Requires more weight than the light plate. + + + Used as a redstone power source. Can be crafted back into Redstone. + + + Used to catch items or to transfer items into and out of containers. + + + A type of rail that can enable or disable Minecarts with Hoppers and trigger Minecarts with TNT. + + + Used to hold and drop items, or push items into another container, when given a Redstone charge. + + + Colorful blocks crafted by dyeing Hardened clay. + + + Can be fed to Horses, Donkeys or Mules to heal up to 10 Hearts. Speeds up the growth of foals. + + + Created by smelting Clay in a furnace. + + + Crafted from glass and a dye. + + + Crafted from Stained Glass + + + A compact way of storing Coal. Can be used as fuel in a Furnace. + + + + 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. + - - 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. - + + Bat + + + These flying creatures are found in caverns or other large enclosed spaces. + + + Witch + + + These enemies can be found in swamps and attack you by throwing Potions. They drop Potions when killed. + + + Horse + + + These animals can be tamed and can then be ridden. + + + Donkey + + + These animals can be tamed and can then be ridden. They can have a chest attached. + + + Mule + + + Born when a Horse and a Donkey breed. These animals can be tamed and can then be ridden and carry chests. + + + Zombie Horse + + + Skeleton Horse + + + Wither + + + These are crafted from Wither Skulls and Soul Sand. They fire exploding skulls at you. +  @@ -2006,6 +2208,9 @@ Can also be used for low-level lighting. Map + + Empty Map + Music Disc - "13" @@ -2159,6 +2364,42 @@ Can also be used for low-level lighting. Creeper Head + + Nether Star + + + Firework Rocket + + + Firework Star + + + Redstone Comparator + + + Minecart with TNT + + + Minecart with Hopper + + + Iron Horse Armor + + + Gold Horse Armor + + + Diamond Horse Armor + + + Lead + + + Name Tag + + + + Stone @@ -2183,6 +2424,9 @@ Can also be used for low-level lighting. Jungle Wood Planks + + Wood Planks (any type) + Sapling @@ -2333,17 +2577,13 @@ Can also be used for low-level lighting. Block of Gold - A compact way of storing Gold. - A compact way of storing Iron. - - - + Block of Iron @@ -2382,7 +2622,6 @@ Can also be used for low-level lighting. Nether Brick Slab - Bricks @@ -2401,7 +2640,6 @@ Can also be used for low-level lighting. Torch - Torch (Coal) @@ -2429,11 +2667,9 @@ Can also be used for low-level lighting. Block of Diamond - A compact way of storing Diamonds. - Crafting Table @@ -2530,11 +2766,9 @@ Can also be used for low-level lighting. Lapis Lazuli Block - A compact way of storing Lapis Lazuli. - Dispenser @@ -2697,86 +2931,370 @@ Can also be used for low-level lighting. Skull - - - Current Controls + + + + Command Block - - Layout + + Beacon - - Move/Sprint + + Trapped Chest - - Look + + Weighted Pressure Plate (Light) - - Pause + + Weighted Pressure Plate (Heavy) - - Jump + + Redstone Comparator - - Jump/Fly Up + + Daylight Sensor - - Inventory + + Block of Redstone - - Cycle Held Item + + Hopper - - Action + + Activator Rail - - Use + + Dropper - - Crafting + + Stained Clay - - Drop + + Hay Bale - - Sneak + + Hardened Clay - - Sneak/Fly Down + + Block of Coal - - Change Camera Mode + + + Black Stained Clay - - Players/Invite + + Red Stained Clay - - Movement (When Flying) + + Green Stained Clay - - Layout 1 + + Brown Stained Clay - - Layout 2 + + Blue Stained Clay - - Layout 3 + + Purple Stained Clay - - ]]> + + Cyan Stained Clay - - ]]> + + Light Gray Stained Clay - - ]]> + + Gray Stained Clay - - ]]> + + Pink Stained Clay - - ]]> + + Lime Stained Clay - + + Yellow Stained Clay + + + Light Blue Stained Clay + + + Magenta Stained Clay + + + Orange Stained Clay + + + White Stained Clay + + + + Stained Glass + + + Black Stained Glass + + + Red Stained Glass + + + Green Stained Glass + + + Brown Stained Glass + + + Blue Stained Glass + + + Purple Stained Glass + + + Cyan Stained Glass + + + Light Gray Stained Glass + + + Gray Stained Glass + + + Pink Stained Glass + + + Lime Stained Glass + + + Yellow Stained Glass + + + Light Blue Stained Glass + + + Magenta Stained Glass + + + Orange Stained Glass + + + White Stained Glass + + + + Stained Glass Pane + + + Black Stained Glass Pane + + + Red Stained Glass Pane + + + Green Stained Glass Pane + + + Brown Stained Glass Pane + + + Blue Stained Glass Pane + + + Purple Stained Glass Pane + + + Cyan Stained Glass Pane + + + Light Gray Stained Glass Pane + + + Gray Stained Glass Pane + + + Pink Stained Glass Pane + + + Lime Stained Glass Pane + + + Yellow Stained Glass Pane + + + Light Blue Stained Glass Pane + + + Magenta Stained Glass Pane + + + Orange Stained Glass Pane + + + White Stained Glass Pane + + + + + Small Ball + + + Large Ball + + + Star-shaped + + + Creeper-shaped + + + Burst + + + Unknown Shape + + + + Black + + + Red + + + Green + + + Brown + + + Blue + + + Purple + + + Cyan + + + Light Gray + + + Gray + + + Pink + + + Lime + + + Yellow + + + Light Blue + + + Magenta + + + Orange + + + White + + + Custom + + + + Fade to + + + Twinkle + + + Trail + + + Flight Duration: +  + + 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 + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + ]]> @@ -2829,7 +3347,7 @@ Can also be used for low-level lighting. {*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. +Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. @@ -2859,7 +3377,7 @@ At night monsters come out, make sure to build a shelter before that happens. As you collect and craft more items, your inventory will fill up.{*B*} - Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. +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. @@ -2907,19 +3425,13 @@ At night monsters come out, make sure to build a shelter before that happens.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. - + 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. - + 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. - + 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*} @@ -2946,607 +3458,395 @@ At night monsters come out, make sure to build a shelter before that happens.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. - + 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. - + {*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. - - + 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. - +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. - + 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. - + 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 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*} . - + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Press{*CONTROLLER_VK_B*} now to exit the inventory. - + 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. - + 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. - +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. - + 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. - + 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*}. - + 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. - + 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*} . - + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Press{*CONTROLLER_VK_B*} now to exit the creative mode inventory. - + 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. - + 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_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. - +Press{*CONTROLLER_VK_X*} to show the item description. {*B*} - Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. - +Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. {*B*} - Press{*CONTROLLER_VK_X*} to show the inventory again. - +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. - + 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. - + 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. - + 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 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 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 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. - + 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 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*} - + 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*} - + 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*} - + 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. - + 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*} - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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*}. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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*} - + 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. - +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*} - + 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 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*} - + 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. - + {*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*} - + 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*} - + 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. - + {*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*} - + 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*} - + 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*} - + 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*} - + 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. - + {*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*} - + 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*} - + 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. - + 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. - + {*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. - + 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. - + 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 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*} - + 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*} - + 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 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! - + 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. - + {*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. - + 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 activate a Nether Portal, set fire to the Obsidian 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. - + 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 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. - + 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. - + 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. - + {*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. @@ -3566,16 +3866,12 @@ When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{ - - In this area a farm has been set up. Farming enables you to create a renewable source of food and other items. - + 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. - + {*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. @@ -3606,16 +3902,12 @@ When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{ - - In this area animals have been penned in. You can breed animals to produce baby versions of themselves. - + 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. - + {*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'. @@ -3634,9 +3926,7 @@ When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{ - - 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. - + 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. @@ -3644,16 +3934,12 @@ When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{ - - In this area are some pumpkins and blocks to make a Snow Golem and an Iron Golem. - + 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. - + {*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. @@ -3715,9 +4001,7 @@ When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{ - - 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! - + 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. @@ -3736,7 +4020,7 @@ When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{ {*B*}Press{*CONTROLLER_VK_A*} to play through the tutorial as normal.{*B*} - Press{*CONTROLLER_VK_B*} to skip the main tutorial. +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. @@ -3746,19 +4030,182 @@ When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{ - - Your food bar has depleted to a level where you will no longer heal. - + 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. - + {*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. - + + This is the horse inventory interface. + + + {*B*}Press{*CONTROLLER_VK_A*} to continue. +{*B*}Press{*CONTROLLER_VK_B*} if you already know how to use the horse inventory. + + + The horse inventory allows you to transfer, or equip items to your Horse, Donkey or Mule. + + + Saddle your Horse by placing a Saddle in the saddle slot. Horses can be given armor by placing Horse Armor in the armor slot. + + + You can also transfer items between your own inventory and the saddlebags strapped to Donkeys and Mules in this menu. + + + You have found a Horse. + + + You have found a Donkey. + + + You have found a Mule. + + + {*B*}Press{*CONTROLLER_VK_A*} to learn more about Horses, Donkeys and Mules. +{*B*}Press{*CONTROLLER_VK_B*} if you already know about Horses, Donkeys and Mules. + + + Horses and Donkeys are found mainly in open plains. Mules can be bred from a Donkey and a Horse, but are infertile themselves. + + + All adult Horses, Donkeys and Mules can be ridden. However only Horses can be armored, and only Mules and Donkeys may be equipped with saddlebags for transporting items. + + + Horses, Donkeys and Mules must be tamed before they can be used. A horse is tamed by attempting to ride it, and managing to stay on the horse while it attempts to throw the rider off. + + + When tamed Love Hearts will appear around them and they will no longer buck the player off. + + + Try to ride this horse now. Use {*CONTROLLER_ACTION_USE*} with no items or tools in your hand to mount it. + + + To steer a horse they must then be equipped with a saddle, which can be bought from villagers or found inside chests hidden in the world. + + + Tame Donkeys and Mules can be given saddlebags by attaching a chest. These bags can be accessed whilst riding or when sneaking. + + + Horses and Donkeys (but not Mules) can be bred like other animals using Golden Apples or Golden Carrots. Foals will grow into adult horses over time, although feeding them wheat or hay will speed this up. + + + You can try to tame the Horses and Donkeys here, and there are Saddles, Horse Armor and other useful items for Horses in chests around here too. + + + This is the Beacon interface, which you can use to choose powers for your Beacon to grant. + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the Beacon interface. + + + In the Beacon menu you can select 1 primary power for your Beacon. The more tiers your pyramid has the more powers you will have to choose from. + + + A Beacon on a pyramid with at least 4 tiers grants an additional option of either the Regeneration secondary power or a stronger primary power. + + + To set the powers of your Beacon you must sacrifice an Emerald, Diamond, Gold or Iron Ingot in the payment slot. Once set, the powers will emanate from the Beacon indefinitely. + + + At the top of this pyramid there is an inactivate Beacon. + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Beacons.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Beacons. + + + Active Beacons project a bright beam of light into the sky and grant powers to nearby players. They are crafted with Glass, Obsidian and Nether Stars, which can be obtained by defeating the Wither. + + + Beacons must be placed so that they are in sunlight during the day. Beacons must be placed on Pyramids of Iron, Gold, Emerald or Diamond. However the choice of material has no effect on the power of the beacon. + + + Try using the Beacon to set the powers it grants. You can use the Iron Ingots provided as the necessary payment. + + + This room contains Hoppers + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Hoppers.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Hoppers. + + + Hoppers are used to insert or remove items from containers, and to automatically pick-up items thrown into them. + + + They can affect Brewing Stands, Chests, Dispensers, Droppers, Minecarts with Chests, Minecarts with Hoppers, as well as other Hoppers. + + + Hoppers will continuously attempt to suck items out of suitable container placed above them. It will also attempt to insert stored items into an output container. + + + However if a Hopper is powered by Redstone it will become inactive and stop both sucking and inserting items. + + + A Hopper points in the direction it tries to output items. To make a Hopper point to a particular block, place the Hopper against that block whilst sneaking. + + + There are various useful Hopper layouts for you to see and experiment with in this room. + + + This is the Firework interface, which you can use to craft Fireworks and Firework Stars. + + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the Firework interface. + + + To craft a Firework, place Gunpowder and Paper in the 3x3 crafting grid that is shown above your inventory. + + + You can optionally place multiple Firework Stars in the crafting grid to add them to the Firework. + + + Filling more slots in the crafting grid with Gunpowder will increase the height at which all the Firework Stars will explode. + + + You can then take the crafted Firework out of the output slot when you wish to craft it. + + + Firework Stars can be crafted by placing Gunpowder and Dye into the crafting grid. + + + The Dye will set the color of the explosion of the Firework Star. + + + The shape of the Firework Star is set by adding either a Fire Charge, Gold Nugget, Feather or Mob Head. + + + A trail or a twinkle can be added using Diamonds or Glowstone Dust. + + + After a Firework Star has been crafted, you can set the fade color of the Firework Star by crafting it with Dye. + + + Contained within the chests here there are various items used in the creation of FIREWORKS! + + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Fireworks. {*B*} +Press{*CONTROLLER_VK_B*} if you already know about Fireworks. + + + Fireworks are decorative items that can be launched by hand or from Dispensers. They are crafted using Paper, Gunpowder and optionally a number of Firework Stars. + + + The colors, fade, shape, size, and effects (such as trails and twinkles) of Firework Stars can be customized by including additional ingredients when crafting. + + + Try crafting a Firework at the Crafting Table using an assortment of ingredients from the chests. +  Select @@ -4094,546 +4541,593 @@ When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{ Upload Save for Xbox One + + + Mount + + + Dismount + + + Attach Chest + + + Launch + + + Leash + + + Release + + + Attach + + + Name +  - OK + OK - Cancel + Cancel - Minecraft Store + Minecraft Store - Are you sure you want to leave your current game and join the new one? Any unsaved progress will be lost. + Are you sure you want to leave your current game and join the new one? Any unsaved progress will be lost. - Exit Game + Exit Game - Save Game + Save Game - - Exit Without Saving + + 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 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! + + Are you sure you want to exit without saving? You will lose all progress in this world! - Start Game + 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? + 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. 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. + 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? + 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 + Damaged Save - - This save is corrupt or damaged. Would you like to delete it? + + 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. + + 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 and save - Exit without saving + 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? Any unsaved progress will be lost. - Are you sure you want to exit to the main menu? Your progress will be lost! + Are you sure you want to exit to the main menu? Your progress will be lost! - Create New World + Create New World - Play Tutorial + Play Tutorial - - Tutorial + + Tutorial - Name Your World + Name Your World - Enter a name for your world + Enter a name for your world - Input the seed for your world generation + Input the seed for your world generation - Load Saved World + Load Saved World - Press START to join game + Press START to join game - Exiting the game + Exiting the game - An error occurred. Exiting to the main menu. + An error occurred. Exiting to the main menu. - Connection failed + Connection failed - Connection lost + Connection lost - Connection to the server was lost. Exiting to the main menu. + 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. Exiting to the main menu. - Connection to Xbox Live was lost. + Connection to Xbox Live was lost. - Disconnected by the server + Disconnected by the server - You were kicked from the game + You were kicked from the game - You were kicked from the game for flying + You were kicked from the game for flying - Connection attempt took too long + Connection attempt took too long - The server is full + The server is full - The host has exited the game. + 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 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 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 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. + You cannot join this game as the player you are trying to join is running a newer version of the game. - New World + New World - Award Unlocked! + Award Unlocked! - Hurray - you've been awarded a gamerpic featuring Steve from Minecraft! + 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 a gamerpic featuring a Creeper! - Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition t-shirt! + 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! + 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! + 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! + Hurray - you've been awarded the Minecraft: Xbox 360 Edition theme! Go to the dashboard to select this theme. - Unlock Full Game + Unlock Full Game - You're playing the trial game, but you'll need the full game to be able to save your 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! + 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! + 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! + 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! + 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. + 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. + Guest players cannot unlock the full game. Please sign in with an Xbox Live user ID. - Please wait + Please wait - No results + No results - Filter: + Filter: - Friends + Friends - My Score + My Score - Overall + Overall - Entries: + Entries: - Rank + Rank - Gamertag + Gamertag - Preparing to Save Level + Preparing to Save Level - Preparing Chunks... + Preparing Chunks... - Finalizing... + Finalizing... - Building Terrain + Building Terrain - Simulating world for a bit + Simulating world for a bit - Initializing server + Initializing server - Generating spawn area + Generating spawn area - Loading spawn area + Loading spawn area - Entering The Nether + Entering The Nether - Leaving The Nether + Leaving The Nether - Respawning + Respawning - Generating level + Generating level - Loading level + Loading level - Saving players + Saving players - Connecting to host + Connecting to host - Downloading terrain + Downloading terrain - Switching to offline game + Switching to offline game - Please wait while the host saves the game + Please wait while the host saves the game - Entering The END + Entering The END - Leaving The END + Leaving The END - Finding Seed for the World Generator + Finding Seed for the World Generator - This bed is occupied + This bed is occupied - You can only sleep at night + 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. + %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 + Your home bed was missing or obstructed - You may not rest now, there are monsters nearby + 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. + You are sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. - Tools and Weapons + Tools and Weapons - Weapons + Weapons - Food + Food - Structures + Structures - Armor + Armor - Mechanisms + Mechanisms - Transport + Transport - Decorations + Decorations - Building Blocks + Building Blocks - Redstone & Transportation + Redstone & Transportation - Miscellaneous + Miscellaneous - Brewing + Brewing - - Brewing + + Brewing - Tools, Weapons & Armor + Tools, Weapons & Armor - Materials + Materials - Signed out + Signed out - You have been returned to the title screen because your gamer profile was signed out + You have been returned to the title screen because your gamer profile was signed out - Difficulty + Difficulty - Music + Music - Sound + Sound - Gamma + Gamma - Game Sensitivity + Game Sensitivity - Interface Sensitivity + Interface Sensitivity - - Peaceful + + Peaceful - Easy + Easy - Normal + Normal - Hard + Hard - In this mode, the player regains health over time, and there are no enemies in the environment. + 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, 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 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! + 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 + 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? + 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 + Game full - Failed to join game as there are no spaces left + Failed to join game as there are no spaces left - Enter Sign Text + Enter Sign Text - Enter a line of text for your sign + Enter a line of text for your sign - Enter Title + Enter Title - Enter a title for your post + Enter a title for your post - Enter Caption + Enter Caption - Enter a caption for your post + Enter a caption for your post - Enter Description + Enter Description - Enter a description for your post + Enter a description for your post - - Inventory + + Inventory - - Ingredients + + Ingredients - - Brewing Stand + + Brewing Stand - - Chest + + Chest - - Enchant + + Enchant - - Furnace + + Furnace - - Ingredient + + Ingredient - - Fuel + + Fuel - - Dispenser + + Dispenser + + + Horse + + + Dropper + + + Hopper + + + Beacon - - There are no downloadable content offers of this type available for this title at the moment. + + Primary Power - - %s has joined the game. + + Secondary Power - - %s has left the game. + + Minecart - - %s was kicked from the game. + + + 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? + + Are you sure you want to delete this save game? - Awaiting approval + Awaiting approval - Censored + Censored - Now playing: + Now playing: - Reset Settings + Reset Settings - Are you sure you would like to reset your settings to their default values? + Are you sure you would like to reset your settings to their default values? - Loading Error + Loading Error - "Minecraft: Xbox 360 Edition" has failed to load, and cannot continue. + "Minecraft: Xbox 360 Edition" has failed to load, and cannot continue. - - %s's Game + + %s's Game - - Unknown host game + + Unknown host game @@ -4642,13 +5136,13 @@ Would you like to unlock the full game? 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 @@ -4679,7 +5173,7 @@ Would you like to unlock the full game? No Pack: Default Skins - + Favorite Skins @@ -4733,7 +5227,7 @@ Please do not turn off your Xbox 360 console while this icon is on-screen. - Preparing to Autosave Level + Preparing to Autosave Level @@ -4748,128 +5242,134 @@ Please do not turn off your Xbox 360 console while this icon is on-screen. - Unlock Skin Pack + Unlock Skin Pack - To use the skin you have selected, you need to unlock this 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 + Unlock Texture Pack - To use this texture pack for your world, you need to unlock it. + To use this texture pack for your world, you need to unlock it. Would you like to unlock it now? - Trial Texture Pack + 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. + 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 + Texture Pack Not Present - Unlock Full Version + Unlock Full Version - - Download Trial Version + + Download Trial Version - - Download Full Version + + Download Full Version - This world uses a mash-up pack or texture pack you don't have! + 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 Trial Version - Get Full Version + Get Full Version - Kick player + 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. + 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 + Gamerpics Packs - Themes + Themes - Skins Packs + Skins Packs - Allow friends of friends + Allow friends of friends - You cannot join this game because it has been limited to players who are friends of the host. + You cannot join this game because it has been limited to players who are friends of the host. - Can't Join Game + Can't Join Game - Selected + Selected - Selected skin: + Selected skin: - Corrupt Downloadable Content + 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. + 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. + 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 + Your game mode has been changed - Rename Your World + Rename Your World - Enter the new name for your world + Enter the new name for your world - Game Mode: Survival + Game Mode: Survival - Game Mode: Creative + Game Mode: Creative + + + Game Mode: Adventure - Survival + Survival - Creative + Creative + + + Adventure - Created in Survival Mode + Created in Survival Mode - Created in Creative Mode + Created in Creative Mode - Render Clouds + Render Clouds - What would you like to do with this save game? + What would you like to do with this save game? Rename Save @@ -4890,6 +5390,9 @@ Would you like to install the mash-up pack or texture pack now? Superflat + + Enter a seed to generate the same terrain again. Leave blank for a random world. + When enabled, the game will be an online game. @@ -4926,6 +5429,29 @@ Would you like to install the mash-up pack or texture pack now? When enabled, a chest containing some useful items will be created near the player spawn point. + + + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items. + + + When enabled, players will keep their inventory when they die. + + + When disabled, mobs will not spawn naturally. + + + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder). + + + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone). + + + When disabled, players will not regenerate health naturally. + + + When disabled, the time of day will not change. + + Skin Packs @@ -5001,7 +5527,72 @@ Would you like to install the mash-up pack or texture pack now? {*PLAYER*} was pummeled by {*SOURCE*} - {*PLAYER*} was killed by {*SOURCE*} + {*PLAYER*} was killed by {*SOURCE*} using magic + + + + + {*PLAYER*} fell off a ladder + + + {*PLAYER*} fell off some vines + + + {*PLAYER*} fell out of the water + + + {*PLAYER*} fell from a high place + + + {*PLAYER*} was doomed to fall by {*SOURCE*} + + + {*PLAYER*} was doomed to fall by {*SOURCE*} + + + {*PLAYER*} was doomed to fall by {*SOURCE*} using {*ITEM*} + + + {*PLAYER*} fell too far and was finished by {*SOURCE*} + + + {*PLAYER*} fell too far and was finished by {*SOURCE*} using {*ITEM*} + + + {*PLAYER*} walked into fire whilst fighting {*SOURCE*} + + + {*PLAYER*} was burnt to a crisp whilst fighting {*SOURCE*} + + + {*PLAYER*} tried to swim in lava to escape {*SOURCE*} + + + {*PLAYER*} drowned whilst trying to escape {*SOURCE*} + + + {*PLAYER*} walked into a cactus whilst trying to escape {*SOURCE*} + + + {*PLAYER*} was blown up by {*SOURCE*} + + + {*PLAYER*} withered away + + + {*PLAYER*} was slain by {*SOURCE*} using {*ITEM*} + + + {*PLAYER*} was shot by {*SOURCE*} using {*ITEM*} + + + {*PLAYER*} was fireballed by {*SOURCE*} using {*ITEM*} + + + {*PLAYER*} was pummeled by {*SOURCE*} using {*ITEM*} + + + {*PLAYER*} was killed by {*SOURCE*} using {*ITEM*} @@ -5210,348 +5801,380 @@ Would you like to install the mash-up pack or texture pack now? - Reset Nether + 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! + 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 + Reset Nether - Don't 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 shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows, Cats and Horses 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 Pigs, Sheep, Cows, Cats and Horses 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 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 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 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 Squid in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Bats 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 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. + 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. + The maximum number of Paintings/Item Frames in a world has been reached. - You can't spawn enemies in Peaceful mode. + 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 Pigs, Sheep, Cows, Cats and Horses 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 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 Chickens has been reached. + + This animal can't enter Love Mode. The maximum number of breeding horses has been reached. + - This animal can't enter Love Mode. The maximum number of breeding Mooshrooms 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 Boats in a world has been reached. - The maximum number of Mob Heads in a world has been reached. + The maximum number of Mob Heads in a world has been reached. - - Invert Look + + Invert Look - - Southpaw + + Southpaw - - You Died! + + You Died! - - Respawn + + Respawn - - Downloadable Content Offers + + Downloadable Content Offers - - Change Skin - - - How To Play - - - Controls + + Change Skin - - Settings + + How To Play - - Credits + + Controls - - Reinstall Content + + Settings - - Debug 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 - + + Fire Spreads + + + TNT Explodes + + + Player vs Player + + + Trust Players + + + Host Privileges + + + Generate Structures + + + Superflat World + + + Bonus Chest + + + + World Options + + + Game Options + + + + Mob Griefing + + + Keep Inventory + + + Mob Spawning + + + Mob Loot + + + Tile Drops + + + Natural Regeneration + + + Daylight Cycle + - - Can Build and Mine + + Can Build and Mine - - Can Use Doors and Switches + + Can Use Doors and Switches - - Can Open Containers + + Can Open Containers - - Can Attack Players + + Can Attack Players - - Can Attack Animals + + Can Attack Animals - - Moderator + + Moderator - - Kick Player + + Kick Player - - Can Fly + + Can Fly - - Disable Exhaustion + + Disable Exhaustion - - Invisible + + Invisible - - Host Options + + Host Options - - Players/Invite + + Players/Invite - - Online Game + + Online Game - - Invite Only + + Invite Only - - More Options + + More Options - - Load + + Load - - New World + + New World - - World Name + + World Name - - Seed for the World Generator + + Seed for the World Generator - - Leave blank for a random seed + + Leave blank for a random seed - - Players + + Players - - Join Game + + Join Game - - Start Game + + Start Game - - No Games Found + + No Games Found - - Play Game + + Play Game - - Leaderboards + + Leaderboards - - Achievements + + Achievements - - Help & Options + + Help & Options - - Unlock Full Game + + Unlock Full Game - - Resume Game + + Resume Game - - Save Game + + Save Game - - Difficulty: + + Difficulty: - - Game Type: + + Game Type: - - Gamertags: + + Gamertags: - - Structures: + + Structures: - - Level Type: + + Level Type: - - PvP: + + PvP: - - Trust Players: + + Trust Players: - - TNT: + + TNT: - - Fire Spreads: + + Fire Spreads: - - Reinstall Theme + + Reinstall Theme - - Reinstall Gamerpic 1 + + Reinstall Gamerpic 1 - - Reinstall Gamerpic 2 + + Reinstall Gamerpic 2 - - Reinstall Avatar Item 1 + + Reinstall Avatar Item 1 - - Reinstall Avatar Item 2 + + Reinstall Avatar Item 2 - - Reinstall Avatar Item 3 + + Reinstall Avatar Item 3 - - Options + + Options - - Audio + + Audio - - Control + + Control - - Graphics + + Graphics - - User Interface + + User Interface - - Reset to Defaults + + Reset to Defaults - - View Bobbing + + View Bobbing - - Hints + + Hints - - In-Game Tooltips + + In-Game Tooltips - - In-Game Gamertags + + In-Game Gamertags - - 2 Player Split-screen Vertical + + 2 Player Split-screen Vertical - - Done + + Done - - Edit sign message: + + Edit sign message: - - Fill in the details to accompany your screenshot + + Fill in the details to accompany your screenshot - - Caption + + Caption - - Screenshot from in-game + + Screenshot from in-game - - Edit sign message: + + Edit sign message: - - Look what I made in Minecraft: Xbox 360 Edition! + + Look what I made in Minecraft: Xbox 360 Edition! - - The classic Minecraft textures, icons and user interface! + + The classic Minecraft textures, icons and user interface! - - Show all Mash-up Worlds + + Show all Mash-up Worlds Select Transfer Save Slot @@ -5635,6 +6258,18 @@ Would you like to install the mash-up pack or texture pack now? Poison + + Wither + + + Health Boost + + + Absorption + + + Saturation + of Swiftness @@ -5693,6 +6328,18 @@ Would you like to install the mash-up pack or texture pack now? of Poison + + of Decay + + + of Health Boost + + + of Absorption + + + of Saturation + @@ -5841,6 +6488,32 @@ Would you like to install the mash-up pack or texture pack now? Reduces health of the affected players, animals and monsters over time. + + + When Applied: + + + + Horse Jump Strength + + + Zombie Reinforcements + + + Max Health + + + Mob Follow Range + + + Knockback Resistance + + + Speed + + + Attack Damage + Sharpness @@ -5983,7 +6656,7 @@ Would you like to install the mash-up pack or texture pack now? 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 1{*ICON_SHANK_01*}. Eating this can cause you to become poisoned. Restores 3{*ICON_SHANK_01*}. Crafted from a carrot and gold nuggets. diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil_480.h b/Minecraft.Client/Common/Media/xuiscene_anvil_480.h new file mode 100644 index 00000000..9d59bc38 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil_480.h @@ -0,0 +1,369 @@ +#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_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_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_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_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_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_small.h b/Minecraft.Client/Common/Media/xuiscene_anvil_small.h new file mode 100644 index 00000000..fdedc7b5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil_small.h @@ -0,0 +1,390 @@ +#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_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_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_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_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_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_base.h b/Minecraft.Client/Common/Media/xuiscene_base.h index a4e71ad6..28701d0a 100644 --- a/Minecraft.Client/Common/Media/xuiscene_base.h +++ b/Minecraft.Client/Common/Media/xuiscene_base.h @@ -6,6 +6,7 @@ #define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" #define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" #define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -16,6 +17,7 @@ #define IDC_BButton L"BButton" #define IDC_AButton L"AButton" #define IDC_Tooltips L"Tooltips" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -47,6 +49,7 @@ #define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" #define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" #define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -57,6 +60,7 @@ #define IDC_BButton L"BButton" #define IDC_AButton L"AButton" #define IDC_Tooltips L"Tooltips" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -88,6 +92,7 @@ #define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" #define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" #define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -98,6 +103,7 @@ #define IDC_BButton L"BButton" #define IDC_AButton L"AButton" #define IDC_Tooltips L"Tooltips" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -129,6 +135,7 @@ #define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" #define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" #define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -139,6 +146,7 @@ #define IDC_BButton L"BButton" #define IDC_AButton L"AButton" #define IDC_Tooltips L"Tooltips" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" diff --git a/Minecraft.Client/Common/Media/xuiscene_base.xui b/Minecraft.Client/Common/Media/xuiscene_base.xui index fcc7881d..bab72bca 100644 --- a/Minecraft.Client/Common/Media/xuiscene_base.xui +++ b/Minecraft.Client/Common/Media/xuiscene_base.xui @@ -111,6 +111,18 @@ +RStick +200.000000 +40.000000 +15 +false +RStick_Button +true +22532 + + + + LStick 200.000000 40.000000 @@ -227,6 +239,18 @@ +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + LStick 200.000000 28.000000 @@ -549,6 +573,18 @@ +RStick +200.000000 +40.000000 +15 +false +RStick_Button +true +22532 + + + + LStick 200.000000 40.000000 @@ -665,6 +701,18 @@ +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + LStick 200.000000 28.000000 @@ -987,6 +1035,18 @@ +RStick +200.000000 +40.000000 +15 +false +RStick_Button +true +22532 + + + + LStick 200.000000 40.000000 @@ -1103,6 +1163,18 @@ +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + LStick 200.000000 28.000000 @@ -1425,6 +1497,18 @@ +RStick +200.000000 +40.000000 +15 +false +RStick_Button +true +22532 + + + + LStick 200.000000 40.000000 @@ -1541,6 +1625,18 @@ +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + LStick 200.000000 28.000000 diff --git a/Minecraft.Client/Common/Media/xuiscene_base_480.h b/Minecraft.Client/Common/Media/xuiscene_base_480.h index ae2129db..e17dce13 100644 --- a/Minecraft.Client/Common/Media/xuiscene_base_480.h +++ b/Minecraft.Client/Common/Media/xuiscene_base_480.h @@ -16,6 +16,7 @@ #define IDC_Tooltips L"Tooltips" #define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" #define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -56,6 +57,7 @@ #define IDC_Tooltips L"Tooltips" #define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" #define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -96,6 +98,7 @@ #define IDC_Tooltips L"Tooltips" #define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" #define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" @@ -136,6 +139,7 @@ #define IDC_Tooltips L"Tooltips" #define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" #define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_RStick L"RStick" #define IDC_LStick L"LStick" #define IDC_LBButton L"LBButton" #define IDC_RBButton L"RBButton" diff --git a/Minecraft.Client/Common/Media/xuiscene_base_480.xui b/Minecraft.Client/Common/Media/xuiscene_base_480.xui index 461421bf..6470bea4 100644 --- a/Minecraft.Client/Common/Media/xuiscene_base_480.xui +++ b/Minecraft.Client/Common/Media/xuiscene_base_480.xui @@ -227,6 +227,18 @@ +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + LStick 200.000000 25.000000 @@ -659,6 +671,18 @@ +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + LStick 200.000000 25.000000 @@ -1091,6 +1115,18 @@ +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + LStick 200.000000 25.000000 @@ -1523,6 +1559,18 @@ +RStick +200.000000 +28.000000 +15 +false +RStick_ButtonSmall +true +22532 + + + + LStick 200.000000 25.000000 diff --git a/Minecraft.Client/Common/Media/xuiscene_beacon.h b/Minecraft.Client/Common/Media/xuiscene_beacon.h new file mode 100644 index 00000000..80fcd67f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_beacon.h @@ -0,0 +1,406 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_Inventory L"Inventory" +#define IDC_SecondaryPanel L"SecondaryPanel" +#define IDC_PrimaryPanel L"PrimaryPanel" +#define IDC_PrimaryText L"PrimaryText" +#define IDC_SecondaryText L"SecondaryText" +#define IDC_PrimaryTierOneOne L"PrimaryTierOneOne" +#define IDC_PrimaryTierOneTwo L"PrimaryTierOneTwo" +#define IDC_PrimaryTierTwoOne L"PrimaryTierTwoOne" +#define IDC_PrimaryTierTwoTwo L"PrimaryTierTwoTwo" +#define IDC_PrimaryTierThree L"PrimaryTierThree" +#define IDC_SecondaryOne L"SecondaryOne" +#define IDC_SecondaryTwo L"SecondaryTwo" +#define IDC_Confirm L"Confirm" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Payment L"Payment" +#define IDC_Emerald L"Emerald" +#define IDC_Diamond L"Diamond" +#define IDC_Gold L"Gold" +#define IDC_Iron L"Iron" +#define IDC_Beacon_4 L"Beacon_4" +#define IDC_Beacon_3 L"Beacon_3" +#define IDC_Beacon_2 L"Beacon_2" +#define IDC_Beacon_1 L"Beacon_1" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_BeaconMenu L"BeaconMenu" diff --git a/Minecraft.Client/Common/Media/xuiscene_beacon.xui b/Minecraft.Client/Common/Media/xuiscene_beacon.xui new file mode 100644 index 00000000..5b422935 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_beacon.xui @@ -0,0 +1,6508 @@ + + +1280.000000 +720.000000 + + + +BeaconMenu +1280.000000 +720.000000 +CXuiSceneBeacon +XuiBlankScene +Pointer + + + +Group +520.000000 +510.000000 +380.000031,120.000046,0.000000 +15 +XuiScene +Pointer + + + +UseRow +381.000000 +50.000000 +70.000000,444.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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Inventory +378.000000 +150.000000 +70.000000,305.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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +SecondaryPanel +234.000000 +210.000000 +262.000000,24.000000,0.000000 +PanelRecessed +false + + + + +PrimaryPanel +234.000000 +210.000000 +24.000000,24.000000,0.000000 +PanelRecessed +false + + + + +PrimaryText +230.000000 +32.000000 +26.000000,26.000000,0.000000 +9 +XuiLabelDarkCentredWrap +Primary Power + + + + +SecondaryText +230.000000 +63.000000 +264.000061,26.000008,0.000000 +3 +XuiLabelDarkCentredWrap +Secondary Power + + + + +PrimaryTierOneOne +44.000000 +44.000000 +122.000000,66.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButton +false + + + + +PrimaryTierOneTwo +44.000000 +44.000000 +186.000000,66.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButton +false + + + + +PrimaryTierTwoOne +44.000000 +44.000000 +122.000000,120.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButton +false + + + + +PrimaryTierTwoTwo +44.000000 +44.000000 +186.000000,120.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButton +false + + + + +PrimaryTierThree +44.000000 +44.000000 +154.000000,174.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButton +false + + + + +SecondaryOne +44.000000 +44.000000 +324.000031,148.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButton +false + + + + +SecondaryTwo +44.000000 +44.000000 +388.000092,148.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButton +false + + + + +Confirm +44.000000 +44.000000 +403.000000,246.000031,0.000000 +8 +CXuiCtrlBeaconButton +BeaconButton +false + + + + +Payment +42.000000 +42.000000 +280.000092,248.000046,0.000000 +9 +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 +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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Emerald +42.000000 +42.000000 +70.000046,247.999969,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlank + + + + +Diamond +42.000000 +42.000000 +118.000031,248.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlank + + + + +Gold +42.000000 +42.000000 +166.000015,248.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlank + + + + +Iron +42.000000 +42.000000 +214.000000,248.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlank + + + + +Beacon_1 +40.000000 +40.000000 +50.000000,68.000000,0.000000 +2 +Beacon_1 +false + + + + +Beacon_2 +40.000000 +40.000000 +50.000000,122.000000,0.000000 +2 +Beacon_2 +false + + + + +Beacon_3 +40.000000 +40.000000 +50.000000,176.000000,0.000000 +2 +Beacon_3 +false + + + + +Beacon_4 +40.000000 +40.000000 +358.000000,94.000000,0.000000 +2 +Beacon_4 +false + + + + +Pointer +42.000000 +42.000000 +-185.000000,-9.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + +Normal + + + +EndNormal + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +380.000031,120.000046,0.000000 + + + +0 +380.000000,120.000000,0.000000 + + + +2 +100 +-100 +50 +380.000000,120.000000,0.000000 + + + +0 +120.000000,120.000000,0.000000 + + + +2 +100 +-100 +50 +120.000000,120.000000,0.000000 + + + +0 +380.000000,120.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_beacon_480.xui b/Minecraft.Client/Common/Media/xuiscene_beacon_480.xui new file mode 100644 index 00000000..9b5c4104 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_beacon_480.xui @@ -0,0 +1,5215 @@ + + +640.000000 +480.000000 + + + +BeaconMenu +640.000000 +480.000000 +CXuiSceneBeacon +XuiBlankScene +Pointer + + + +Group +336.000000 +290.000000 +190.000000,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +78.000000 +51.000000,164.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 +51.000000,252.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +SecondaryPanel +154.000000 +120.000000 +170.000000,12.000000,0.000000 +PanelRecessed +false + + + + +PrimaryPanel +154.000000 +120.000000 +12.000000,12.000000,0.000000 +PanelRecessed +false + + + + +PrimaryText +150.000000 +36.000000 +14.000000,14.000000,0.000000 +9 +XuiLabelDarkCentredWrapSmall +Primary Power + + + + +SecondaryText +150.000000 +51.000000 +172.000000,14.000000,0.000000 +3 +XuiLabelDarkCentredWrapSmall +Secondary Power + + + + +PrimaryTierOneOne +22.000000 +22.000000 +80.000000,46.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +PrimaryTierOneTwo +22.000000 +22.000000 +111.000000,46.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +PrimaryTierTwoOne +22.000000 +22.000000 +80.000000,74.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +PrimaryTierTwoTwo +22.000000 +22.000000 +111.000000,74.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +PrimaryTierThree +22.000000 +22.000000 +95.073303,104.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +SecondaryOne +22.000000 +22.000000 +220.000000,84.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +SecondaryTwo +22.000000 +22.000000 +254.000000,84.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +Confirm +22.000000 +22.000000 +261.000092,137.000015,0.000000 +8 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +Payment +24.000000 +24.000000 +182.000092,136.000046,0.000000 +9 +CXuiCtrlSlotList +ItemGridVertical24 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +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 + + + + + +Emerald +22.000000 +22.000000 +52.482300,136.999969,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlank + + + + +Diamond +22.000000 +22.000000 +79.000031,137.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlank + + + + +Gold +22.000000 +22.000000 +105.000015,137.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlankSmall + + + + +Iron +22.000000 +22.000000 +131.000000,137.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlankSmall + + + + +Beacon_1 +20.000000 +20.000000 +38.000000,46.000000,0.000000 +2 +Beacon_1 +false + + + + +Beacon_2 +20.000000 +20.000000 +38.000000,74.000000,0.000000 +2 +Beacon_2 +false + + + + +Beacon_3 +20.000000 +20.000000 +38.000000,104.000000,0.000000 +2 +Beacon_3 +false + + + + +Beacon_4 +20.000000 +20.000000 +238.000000,58.000000,0.000000 +2 +Beacon_4 +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,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_beacon_Small.xui b/Minecraft.Client/Common/Media/xuiscene_beacon_Small.xui new file mode 100644 index 00000000..622aeca9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_beacon_Small.xui @@ -0,0 +1,5215 @@ + + +640.000000 +360.000000 + + + +BeaconMenu +640.000000 +360.000000 +CXuiSceneBeacon +XuiBlankScene +Pointer + + + +Group +336.000000 +290.000000 +152.000031,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +78.000000 +51.000000,164.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 +51.000000,252.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +SecondaryPanel +154.000000 +120.000000 +170.000000,12.000000,0.000000 +PanelRecessed +false + + + + +PrimaryPanel +154.000000 +120.000000 +12.000000,12.000000,0.000000 +PanelRecessed +false + + + + +PrimaryText +150.000000 +35.000000 +14.000000,14.000000,0.000000 +9 +XuiLabelDarkCentredWrapSmall +Primary Power + + + + +SecondaryText +150.000000 +40.000000 +172.000000,14.000000,0.000000 +3 +XuiLabelDarkCentredWrapSmall +Secondary Power + + + + +PrimaryTierOneOne +22.000000 +22.000000 +80.000000,46.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +PrimaryTierOneTwo +22.000000 +22.000000 +111.000000,46.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +PrimaryTierTwoOne +22.000000 +22.000000 +80.000000,74.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +PrimaryTierTwoTwo +22.000000 +22.000000 +111.000000,74.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +PrimaryTierThree +22.000000 +22.000000 +95.073303,104.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +SecondaryOne +22.000000 +22.000000 +220.000000,84.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +SecondaryTwo +22.000000 +22.000000 +254.000000,84.000000,0.000000 +2 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +Confirm +22.000000 +22.000000 +261.000092,137.000015,0.000000 +8 +CXuiCtrlBeaconButton +BeaconButtonSmall +false + + + + +Payment +24.000000 +24.000000 +182.000092,136.000046,0.000000 +9 +CXuiCtrlSlotList +ItemGridVertical24 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +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 + + + + + +Emerald +22.000000 +22.000000 +52.482300,136.999969,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlank + + + + +Diamond +22.000000 +22.000000 +79.000031,137.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlank + + + + +Gold +22.000000 +22.000000 +105.000015,137.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlankSmall + + + + +Iron +22.000000 +22.000000 +131.000000,137.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemIconBlankSmall + + + + +Beacon_1 +20.000000 +20.000000 +38.000000,46.000000,0.000000 +2 +Beacon_1 +false + + + + +Beacon_2 +20.000000 +20.000000 +38.000000,74.000000,0.000000 +2 +Beacon_2 +false + + + + +Beacon_3 +20.000000 +20.000000 +38.000000,104.000000,0.000000 +2 +Beacon_3 +false + + + + +Beacon_4 +20.000000 +20.000000 +238.000000,56.000000,0.000000 +2 +Beacon_4 +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 +152.000031,2.000000,0.000000 + + + +0 +152.000031,2.000000,0.000000 + + + +2 +100 +-100 +50 +152.000031,2.000000,0.000000 + + + +0 +50.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +50.000000,2.000000,0.000000 + + + +0 +152.000031,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h index 9400ba1e..cd3c9870 100644 --- a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h @@ -130,6 +130,24 @@ #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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" @@ -207,6 +225,24 @@ #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui index b3386eda..1895ecc3 100644 --- a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui @@ -537,7 +537,7 @@ XuiItemName 281.000000 50.000000 --2.000000,-24.000000,0.000000 +-2.000000,-29.000000,0.000000 XuiLabelDarkCentredWrap yyyyyyWWWWWWWWWWWWWWWW yyyyyyWWWWWWWWWWWWWW @@ -1676,6 +1676,258 @@ yyyyyyWWWWWWWWWWWWWW 4 + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + @@ -2749,6 +3001,258 @@ yyyyyyWWWWWWWWWWWWWW 4 + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant.h b/Minecraft.Client/Common/Media/xuiscene_enchant.h index a074055a..d8a4fdc8 100644 --- a/Minecraft.Client/Common/Media/xuiscene_enchant.h +++ b/Minecraft.Client/Common/Media/xuiscene_enchant.h @@ -8,6 +8,7 @@ #define IDC_control_ListItem L"control_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" @@ -99,6 +100,15 @@ #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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" @@ -190,6 +200,15 @@ #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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" diff --git a/Minecraft.Client/Common/Media/xuiscene_fireworks.h b/Minecraft.Client/Common/Media/xuiscene_fireworks.h new file mode 100644 index 00000000..52c36d88 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fireworks.h @@ -0,0 +1,166 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_Arrow L"Arrow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_FireworksText L"FireworksText" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredients L"Ingredients" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_FireworksScene L"FireworksScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_fireworks.xui b/Minecraft.Client/Common/Media/xuiscene_fireworks.xui new file mode 100644 index 00000000..9bae3aec --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fireworks.xui @@ -0,0 +1,2359 @@ + + +1280.000000 +720.000000 + + + +FireworksScene +1280.000000 +720.000000 +CXuiSceneFireworks +XuiBlankScene +Pointer + + + +Group +428.000000 +450.000000 +426.000000,130.000000,0.000000 +15 +XuiScene +Pointer + + + +Result +64.000000 +64.000000 +304.000000,96.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 + + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + + +Arrow +72.000000 +48.000000 +206.000015,104.000000,0.000000 +ArrowProgressState +24 + + + + +Inventory +380.000000 +128.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 + + + + + +UseRow +380.000000 +44.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 + + + + + +InventoryText +378.000000 +34.000000 +26.000000,210.000000,0.000000 +12 +LabelContainerSceneLeft + + + + +FireworksText +380.000000 +34.000000 +26.000000,14.000000,0.000000 +LabelContainerSceneLeft + + + + +Ingredients +128.000000 +128.000000 +59.000065,64.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 +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 + + + + + +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,130.000000,0.000000 + + + +0 +426.000000,130.000000,0.000000 + + + +2 +100 +-100 +50 +424.500031,130.000000,0.000000 + + + +0 +160.000000,130.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,130.000000,0.000000 + + + +0 +426.000000,130.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_fireworks_480.xui b/Minecraft.Client/Common/Media/xuiscene_fireworks_480.xui new file mode 100644 index 00000000..820736d6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fireworks_480.xui @@ -0,0 +1,1973 @@ + + +640.000000 +480.000000 + + + +DispenserScene +1280.000000 +720.000000 +CXuiSceneFireworks +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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Ingredients +80.000000 +80.000000 +42.000000,38.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 + + + + +FireworksText +240.000000 +25.000000 +12.000000,6.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Arrow +32.000000 +32.000000 +132.000000,62.000000,0.000000 +ArrowProgressStateSmall +24 + + + + +Result +44.000000 +44.000000 +172.000000,56.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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +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_fireworks_small.xui b/Minecraft.Client/Common/Media/xuiscene_fireworks_small.xui new file mode 100644 index 00000000..d50b5ef7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fireworks_small.xui @@ -0,0 +1,1558 @@ + + +640.000000 +360.000000 + + + +DispenserScene +640.000000 +360.000000 +CXuiSceneFireworks +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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Ingredients +80.000000 +80.000000 +42.000000,38.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 + + + + +FireworksText +240.000000 +25.000000 +12.000000,6.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Arrow +32.000000 +32.000000 +132.000000,62.000000,0.000000 +ArrowProgressStateSmall +24 + + + + +Result +44.000000 +44.000000 +172.000000,56.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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +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,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_hopper.h b/Minecraft.Client/Common/Media/xuiscene_hopper.h new file mode 100644 index 00000000..ca6d0389 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hopper.h @@ -0,0 +1,99 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_Hopper L"Hopper" +#define IDC_InventoryText L"InventoryText" +#define IDC_HopperText L"HopperText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_HopperScene L"HopperScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hopper.xui b/Minecraft.Client/Common/Media/xuiscene_hopper.xui new file mode 100644 index 00000000..762f3f5d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hopper.xui @@ -0,0 +1,1436 @@ + + +1280.000000 +720.000000 + + + +HopperScene +1280.000000 +720.000000 +CXuiSceneHopper +XuiBlankScene +Pointer + + + +Group +430.000000 +335.000000 +425.000000,192.500046,0.000000 +15 +XuiScene +Pointer + + + +Inventory +378.000000 +128.000000 +26.000017,138.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 +378.000000 +45.000000 +26.000017,276.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 + + + + + +Hopper +210.000000 +45.000000 +110.000015,50.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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.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,108.000000,0.000000 +8 +LabelContainerSceneLeft + + + + +HopperText +374.000000 +28.000017,16.000000,0.000000 +2 +LabelContainerSceneCentre + + + + +Pointer +42.000000 +42.000000 +-185.000000,-246.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +425.000000,192.500046,0.000000 + + + +0 +425.000000,192.500031,0.000000 + + + +2 +100 +-100 +50 +425.000000,192.500031,0.000000 + + + +0 +160.000000,192.500031,0.000000 + + + +2 +100 +-100 +50 +160.000000,192.500031,0.000000 + + + +0 +425.000000,192.500031,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_hopper_480.h b/Minecraft.Client/Common/Media/xuiscene_hopper_480.h new file mode 100644 index 00000000..263aeddf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hopper_480.h @@ -0,0 +1,141 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_Hopper L"Hopper" +#define IDC_InventoryText L"InventoryText" +#define IDC_HopperText L"HopperText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_HoperScene L"HoperScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hopper_480.xui b/Minecraft.Client/Common/Media/xuiscene_hopper_480.xui new file mode 100644 index 00000000..ba4c2cbc --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hopper_480.xui @@ -0,0 +1,1891 @@ + + +640.000000 +480.000000 + + + +HoperScene +640.000000 +480.000000 +CXuiSceneHopper +XuiBlankScene +Pointer + + + +Group +260.000000 +220.000000 +190.000015,130.000031,0.000000 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +13.000001,92.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 +13.000001,180.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 + + + + + +Hopper +130.000000 +65.000015,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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 +13.000000,72.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +HopperText +160.000000 +25.000000 +50.000008,14.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-100.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000015,130.000031,0.000000 + + + +0 +190.000000,130.000031,0.000000 + + + +2 +100 +-100 +50 +190.000000,130.000031,0.000000 + + + +0 +33.750000,130.000031,0.000000 + + + +2 +100 +-100 +50 +60.000000,130.000031,0.000000 + + + +0 +190.000000,130.000031,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_hopper_small.h b/Minecraft.Client/Common/Media/xuiscene_hopper_small.h new file mode 100644 index 00000000..ca6d0389 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hopper_small.h @@ -0,0 +1,99 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_Hopper L"Hopper" +#define IDC_InventoryText L"InventoryText" +#define IDC_HopperText L"HopperText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_HopperScene L"HopperScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hopper_small.xui b/Minecraft.Client/Common/Media/xuiscene_hopper_small.xui new file mode 100644 index 00000000..d6f09756 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hopper_small.xui @@ -0,0 +1,1348 @@ + + +640.000000 +360.000000 + + + +HopperScene +640.000000 +360.000000 +CXuiSceneHopper +XuiBlankScene +Pointer + + + +Group +260.000000 +220.000000 +190.000000,0.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +13.000009,91.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,180.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 + + + + + +Hopper +130.000000 +65.000015,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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 +13.000000,70.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +HopperText +162.000000 +25.000000 +49.000008,14.000000,0.000000 +2 +LabelContainerSceneCentreSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-110.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_horse.h b/Minecraft.Client/Common/Media/xuiscene_horse.h new file mode 100644 index 00000000..c122d1f7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_horse.h @@ -0,0 +1,160 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_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_Chest L"Chest" +#define IDC_InventoryText L"InventoryText" +#define IDC_HorseText L"HorseText" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Saddle L"Saddle" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_Horse L"Horse" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_HorseScene L"HorseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_horse.xui b/Minecraft.Client/Common/Media/xuiscene_horse.xui new file mode 100644 index 00000000..193df21a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_horse.xui @@ -0,0 +1,2281 @@ + + +1280.000000 +720.000000 + + + +HorseScene +1280.000000 +720.000000 +CXuiSceneHorseInventory +XuiBlankScene +Pointer + + + +Group +430.000000 +430.000000 +425.000000,135.000031,0.000000 +15 +XuiScene +Pointer + + + +Inventory +378.000000 +128.000000 +26.000017,234.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 + + + + + +UseRow +382.000000 +45.000000 +26.000000,372.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 + + + + + +Chest +210.000000 +126.000000 +194.000000,56.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 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.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,202.000000,0.000000 +8 +LabelContainerSceneLeft + + + + +HorseText +374.000000 +26.000000,16.000000,0.000000 +2 +LabelContainerSceneLeft + + + + +Saddle +45.000000 +45.000000 +26.000000,56.000000,0.000000 +2 +CXuiCtrlSlotList +ItemGridHorseSaddle + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonHorseSaddle +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonHorseSaddle +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonHorseSaddle +22594 +4 + + + + + +Armor +45.000000 +45.000000 +26.000000,102.000000,0.000000 +2 +CXuiCtrlSlotList +ItemGridHorseArmor + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonHorseArmor +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonHorseArmor +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonHorseArmor +22594 +4 + + + + + +Horse +120.000000 +126.000000 +71.000000,56.000000,0.000000 +3 +HorsePanel +..\Images\img1.png + + + + +Pointer +42.000000 +42.000000 +-185.000000,-151.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +425.000000,135.000031,0.000000 + + + +0 +425.000000,135.000046,0.000000 + + + +2 +100 +-100 +50 +425.000000,135.000046,0.000000 + + + +0 +160.000000,135.000046,0.000000 + + + +2 +100 +-100 +50 +160.000000,135.000046,0.000000 + + + +0 +425.000000,135.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_horse_480.h b/Minecraft.Client/Common/Media/xuiscene_horse_480.h new file mode 100644 index 00000000..f6375dc6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_horse_480.h @@ -0,0 +1,209 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_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_Chest L"Chest" +#define IDC_InventoryText L"InventoryText" +#define IDC_HopperText L"HopperText" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Saddle L"Saddle" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_Horse L"Horse" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_HorseScene L"HorseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_horse_480.xui b/Minecraft.Client/Common/Media/xuiscene_horse_480.xui new file mode 100644 index 00000000..83d3496f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_horse_480.xui @@ -0,0 +1,2770 @@ + + +640.000000 +480.000000 + + + +HorseScene +640.000000 +480.000000 +CXuiSceneHorseInventory +XuiBlankScene +Pointer + + + +Group +260.000000 +285.000000 +190.000015,98.000000,0.000000 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +12.000000,156.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 + + + + + +UseRow +234.000000 +12.000000,244.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 + + + + + +Chest +130.000000 +90.000000 +116.000000,40.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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 + + + + +HopperText +160.000000 +25.000000 +12.000000,14.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Saddle +30.000000 +12.000000,40.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Armor +30.000000 +12.000000,68.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Horse +74.000000 +78.000000 +40.000000,40.000000,0.000000 +3 +HorsePanel +..\Images\img1.png + + + + +Pointer +26.000000 +26.000000 +-50.000000,-35.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000015,98.000000,0.000000 + + + +0 +190.000000,98.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,98.000000,0.000000 + + + +0 +33.750000,98.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,98.000000,0.000000 + + + +0 +190.000000,98.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_horse_small.h b/Minecraft.Client/Common/Media/xuiscene_horse_small.h new file mode 100644 index 00000000..a1311742 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_horse_small.h @@ -0,0 +1,163 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_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_Chest L"Chest" +#define IDC_InventoryText L"InventoryText" +#define IDC_HorseText L"HorseText" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Saddle L"Saddle" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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_Horse L"Horse" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_HorseScene L"HorseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_horse_small.xui b/Minecraft.Client/Common/Media/xuiscene_horse_small.xui new file mode 100644 index 00000000..36d04ba6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_horse_small.xui @@ -0,0 +1,2175 @@ + + +640.000000 +360.000000 + + + +HorseScene +640.000000 +360.000000 +CXuiSceneHorseInventory +XuiBlankScene +Pointer + + + +Group +260.000000 +285.000000 +190.000000,0.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +12.000000,156.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 + + + + + +UseRow +234.000000 +12.000000,244.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 + + + + + +Chest +130.000000 +78.000000 +116.000000,40.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +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,134.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +HorseText +162.000000 +25.000000 +12.000000,14.000000,0.000000 +2 +LabelContainerSceneLeftSmall + + + + +Saddle +30.000000 +12.000000,40.000004,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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Armor +30.000000 +12.000000,68.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 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Horse +74.000000 +78.000000 +40.000000,40.000000,0.000000 +3 +HorsePanel +..\Images\img1.png + + + + +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,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_howtoplay.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay.h index 488aec69..c51696ea 100644 --- a/Minecraft.Client/Common/Media/xuiscene_howtoplay.h +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay.h @@ -70,4 +70,22 @@ #define IDC_TInventory L"TInventory" #define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" #define IDC_XuiImageEnderchest L"XuiImageEnderchest" +#define IDC_XuiHtmlControlHorses L"XuiHtmlControlHorses" +#define IDC_XuiImageHorses L"XuiImageHorses" +#define IDC_XuiHtmlControlBeacon L"XuiHtmlControlBeacon" +#define IDC_XuiImageBeacon L"XuiImageBeacon" +#define IDC_BeSecond L"BeSecond" +#define IDC_BeFirst L"BeFirst" +#define IDC_XuiImageDropper L"XuiImageDropper" +#define IDC_XuiHtmlControlDropper L"XuiHtmlControlDropper" +#define IDC_DrInventory L"DrInventory" +#define IDC_DrText L"DrText" +#define IDC_XuiImageHopper L"XuiImageHopper" +#define IDC_XuiHtmlControlHopper L"XuiHtmlControlHopper" +#define IDC_HInventory L"HInventory" +#define IDC_HText L"HText" +#define IDC_XuiImageFireworks L"XuiImageFireworks" +#define IDC_XuiHtmlControlFireworks L"XuiHtmlControlFireworks" +#define IDC_FiInventory L"FiInventory" +#define IDC_FiText L"FiText" #define IDC_SceneHowToPlay L"SceneHowToPlay" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay.xui index 09960371..f169f718 100644 --- a/Minecraft.Client/Common/Media/xuiscene_howtoplay.xui +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay.xui @@ -8,7 +8,7 @@ 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] +[LayerFolders]0|-Fireworks|4|+|0|-Hopper|4|+|0|-Dropper|4|+|0|-Beacon|4|+|0|-Horses|2|+|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 @@ -441,7 +441,7 @@ XuiImageBreeding 339.000000 342.000000 -611.000000,246.000000,0.000000 +612.000000,246.000000,0.000000 ImHowToPlayBreeding @@ -459,7 +459,7 @@ XuiImageFarmingAnimals 339.000000 342.000000 -611.000000,246.000000,0.000000 +612.000000,246.000000,0.000000 ImHowToPlayFarmingAnimals @@ -477,7 +477,7 @@ XuiImageBrewing 339.000000 342.000000 -611.000000,241.000000,0.000000 +612.000000,241.000000,0.000000 ImHowToPlayBrewing @@ -513,7 +513,7 @@ XuiImageEnchantment 339.000000 342.000000 -611.000000,226.000000,0.000000 +612.000000,226.000000,0.000000 ImHowToPlayEnchantment @@ -657,9 +657,173 @@ XuiImageEnderchest 339.000000 342.000000 -611.000000,246.000000,0.000000 +612.000000,246.000000,0.000000 ImHowToPlayEnderchest + + +XuiHtmlControlHorses +380.000000 +331.000000 +176.000076,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageHorses +516.000000 +302.000000 +588.000061,266.000000,0.000000 +ImHowToPlayHorses + + + + +XuiHtmlControlBeacon +380.000000 +359.000000 +208.000000,222.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageBeacon +430.000000 +430.000000 +640.000000,198.000000,0.000000 +ImHowToPlayBeacon + + + + +BeSecond +190.000000 +34.000000 +861.125000,218.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + + + +BeFirst +190.000000 +34.000000 +659.125061,218.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +XuiImageDropper +453.000000 +431.000000 +632.000000,186.000000,0.000000 +ImHowToPlayDispenser + + + + +XuiHtmlControlDropper +380.000000 +296.000000 +194.000000,252.000000,0.000000 +XuiHtmlControl_H2P + + + + +DrInventory +372.000000 +28.000000 +670.500061,376.000000,0.000000 +LabelContainerSceneLeft + + + + +DrText +260.000000 +32.000000 +794.500061,214.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiImageHopper +430.000000 +336.000000 +620.000000,206.000000,0.000000 +ImHowToPlayHopper + + + + +XuiHtmlControlHopper +380.000000 +296.000000 +206.000000,220.000000,0.000000 +XuiHtmlControl_H2P + + + + +HInventory +372.000000 +28.000000 +648.000000,316.000000,0.000000 +LabelContainerSceneLeft + + + + +HText +392.000000 +32.000000 +640.000000,220.000000,0.000000 +LabelContainerSceneCentre + + + + +XuiImageFireworks +428.000000 +450.000000 +636.000000,176.000000,0.000000 +ImHowToPlayFireworks + + + + +XuiHtmlControlFireworks +380.000000 +400.000000 +214.000000,196.000000,0.000000 +XuiHtmlControl_H2P + + + + +FiInventory +372.000000 +28.000000 +665.500061,382.000000,0.000000 +LabelContainerSceneLeft + + + + +FiText +260.000000 +32.000000 +665.500061,194.000000,0.000000 +LabelContainerSceneLeft + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h index 8ef840c6..447482ea 100644 --- a/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h @@ -69,4 +69,22 @@ #define IDC_TVillagerOffers L"TVillagerOffers" #define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" #define IDC_XuiImageEnderchest L"XuiImageEnderchest" +#define IDC_XuiHtmlControlHorses L"XuiHtmlControlHorses" +#define IDC_XuiImageHorses L"XuiImageHorses" +#define IDC_XuiHtmlControlBeacon L"XuiHtmlControlBeacon" +#define IDC_XuiImageBeacon L"XuiImageBeacon" +#define IDC_BeSecond L"BeSecond" +#define IDC_BeFirst L"BeFirst" +#define IDC_XuiImageDropper L"XuiImageDropper" +#define IDC_XuiHtmlControlDropper L"XuiHtmlControlDropper" +#define IDC_DrInventory L"DrInventory" +#define IDC_DrText L"DrText" +#define IDC_XuiImageHopper L"XuiImageHopper" +#define IDC_XuiHtmlControlHopper L"XuiHtmlControlHopper" +#define IDC_HInventory L"HInventory" +#define IDC_HText L"HText" +#define IDC_XuiImageFireworks L"XuiImageFireworks" +#define IDC_XuiHtmlControlFireworks L"XuiHtmlControlFireworks" +#define IDC_FiInventory L"FiInventory" +#define IDC_FiText L"FiText" #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 index f0d5790f..b4612e3e 100644 --- a/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.xui +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.xui @@ -8,7 +8,7 @@ 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] +[LayerFolders]0|-Fireworks|4|+|0|-Hopper|4|+|0|-Dropper|4|+|0|-Beacon|4|+|0|-Horses|2|+|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 @@ -664,5 +664,168 @@ ImHowToPlayEnderchestSmall + + +XuiHtmlControlHorses +282.000000 +239.000000 +48.000114,134.000061,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageHorses +248.000000 +146.000000 +346.000092,178.000061,0.000000 +ImHowToPlayHorsesSmall + + + + +XuiHtmlControlBeacon +204.000000 +240.000000 +49.999985,136.000061,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBeacon +336.000000 +290.000000 +270.000000,124.000053,0.000000 +ImHowToPlayBeaconSmall + + + + +BeSecond +144.000000 +34.000000 +444.000000,138.000061,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +BeFirst +144.000000 +34.000000 +286.000000,138.000061,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +XuiImageDropper +262.000000 +280.000000 +340.000000,132.000061,0.000000 +ImHowToPlayDispenserSmall + + + + +XuiHtmlControlDropper +282.000000 +240.000000 +42.000000,138.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +DrInventory +230.000000 +24.000000 +354.000000,262.000061,0.000000 +LabelContainerSceneLeftSmall + + + + +DrText +160.000000 +24.000000 +422.000000,142.000061,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiImageHopper +260.000000 +220.000000 +340.000000,162.000000,0.000000 +ImHowToPlayHopperSmall + + + + +XuiHtmlControlHopper +282.000000 +240.000000 +42.000000,140.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +HInventory +230.000000 +24.000000 +354.000000,236.000061,0.000000 +LabelContainerSceneLeftSmall + + + + +HText +230.000000 +24.000000 +356.000000,170.000061,0.000000 +LabelContainerSceneCentreSmall + + + + +XuiImageFireworks +260.000000 +280.000000 +344.000000,134.000061,0.000000 +ImHowToPlayFireworksSmall + + + + +XuiHtmlControlFireworks +282.000000 +240.000000 +46.000000,140.000000,0.000000 +XuiHtmlControl_H2P_Small +false + + + + +FiInventory +230.000000 +28.000000 +358.000000,266.000061,0.000000 +LabelContainerSceneLeftSmall + + + + +FiText +230.000000 +24.000000 +358.000000,144.000061,0.000000 +LabelContainerSceneLeftSmall + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h index 29f6a8a2..12377729 100644 --- a/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h @@ -69,4 +69,22 @@ #define IDC_TInventory L"TInventory" #define IDC_XuiImageEnderchest L"XuiImageEnderchest" #define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" +#define IDC_XuiHtmlControlHorses L"XuiHtmlControlHorses" +#define IDC_XuiImageHorses L"XuiImageHorses" +#define IDC_XuiHtmlControlBeacon L"XuiHtmlControlBeacon" +#define IDC_XuiImageBeacon L"XuiImageBeacon" +#define IDC_BeSecond L"BeSecond" +#define IDC_BeFirst L"BeFirst" +#define IDC_XuiImageDropper L"XuiImageDropper" +#define IDC_XuiHtmlControlDropper L"XuiHtmlControlDropper" +#define IDC_DrInventory L"DrInventory" +#define IDC_DrText L"DrText" +#define IDC_XuiImageHopper L"XuiImageHopper" +#define IDC_XuiHtmlControlHopper L"XuiHtmlControlHopper" +#define IDC_HInventory L"HInventory" +#define IDC_HText L"HText" +#define IDC_XuiImageFireworks L"XuiImageFireworks" +#define IDC_XuiHtmlControlFireworks L"XuiHtmlControlFireworks" +#define IDC_FiInventory L"FiInventory" +#define IDC_FiText L"FiText" #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 index 359860d1..989ab6c0 100644 --- a/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.xui +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.xui @@ -8,7 +8,7 @@ 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] +[LayerFolders]0|-Fireworks|4|+|0|-Hopper|4|+|0|-Dropper|4|+|0|-Beacon|4|+|0|-Horses|2|+|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 @@ -665,5 +665,168 @@ XuiHtmlControl_H2P_Small + + +XuiHtmlControlHorses +282.000000 +239.000000 +74.000114,13.000046,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageHorses +248.000000 +146.000000 +372.000092,58.000046,0.000000 +ImHowToPlayHorsesSmall + + + + +XuiHtmlControlBeacon +204.000000 +240.000000 +76.999985,14.000046,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBeacon +336.000000 +290.000000 +296.000000,2.000048,0.000000 +ImHowToPlayBeaconSmall + + + + +BeSecond +144.000000 +34.000000 +470.000000,16.000046,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +BeFirst +144.000000 +34.000000 +312.000000,16.000046,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +XuiImageDropper +262.000000 +280.000000 +372.000000,8.000046,0.000000 +ImHowToPlayDispenserSmall + + + + +XuiHtmlControlDropper +282.000000 +240.000000 +74.000000,14.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +DrInventory +230.000000 +24.000000 +386.000000,139.000046,0.000000 +LabelContainerSceneLeftSmall + + + + +DrText +160.000000 +24.000000 +454.000000,18.000048,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiImageHopper +260.000000 +220.000000 +372.000000,36.000000,0.000000 +ImHowToPlayHopperSmall + + + + +XuiHtmlControlHopper +282.000000 +240.000000 +74.000000,14.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +HInventory +230.000000 +24.000000 +386.000000,110.000046,0.000000 +LabelContainerSceneLeftSmall + + + + +HText +230.000000 +24.000000 +387.000000,44.000046,0.000000 +LabelContainerSceneCentreSmall + + + + +XuiImageFireworks +260.000000 +280.000000 +372.000000,8.000050,0.000000 +ImHowToPlayFireworksSmall + + + + +XuiHtmlControlFireworks +282.000000 +240.000000 +74.000000,14.000000,0.000000 +XuiHtmlControl_H2P_Small +false + + + + +FiInventory +230.000000 +28.000000 +386.000000,140.000046,0.000000 +LabelContainerSceneLeftSmall + + + + +FiText +230.000000 +24.000000 +386.000000,18.000046,0.000000 +LabelContainerSceneLeftSmall + + diff --git a/Minecraft.Client/Common/Media/xuiscene_hud.h b/Minecraft.Client/Common/Media/xuiscene_hud.h index 8bf537f5..1c1fb549 100644 --- a/Minecraft.Client/Common/Media/xuiscene_hud.h +++ b/Minecraft.Client/Common/Media/xuiscene_hud.h @@ -11,17 +11,7 @@ #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_HorseJumpProgress L"HorseJumpProgress" #define IDC_Armour0 L"Armour0" #define IDC_Armour1 L"Armour1" #define IDC_Armour2 L"Armour2" @@ -33,6 +23,49 @@ #define IDC_Armour8 L"Armour8" #define IDC_Armour9 L"Armour9" #define IDC_Armour L"Armour" +#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_HealthAbsorb L"HealthAbsorb" +#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_Health9 L"Health9" +#define IDC_Health8 L"Health8" +#define IDC_Health7 L"Health7" +#define IDC_Health6 L"Health6" +#define IDC_Health5 L"Health5" +#define IDC_Health4 L"Health4" +#define IDC_Health3 L"Health3" +#define IDC_Health2 L"Health2" +#define IDC_Health1 L"Health1" +#define IDC_Health0 L"Health0" +#define IDC_Health19 L"Health19" +#define IDC_Health18 L"Health18" +#define IDC_Health17 L"Health17" +#define IDC_Health16 L"Health16" +#define IDC_Health15 L"Health15" +#define IDC_Health14 L"Health14" +#define IDC_Health13 L"Health13" +#define IDC_Health12 L"Health12" +#define IDC_Health11 L"Health11" +#define IDC_Health10 L"Health10" +#define IDC_HorseHealth L"HorseHealth" #define IDC_Food9 L"Food9" #define IDC_Food8 L"Food8" #define IDC_Food7 L"Food7" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud.xui b/Minecraft.Client/Common/Media/xuiscene_hud.xui index 13986320..7eea76d4 100644 --- a/Minecraft.Client/Common/Media/xuiscene_hud.xui +++ b/Minecraft.Client/Common/Media/xuiscene_hud.xui @@ -160,6 +160,210 @@ 200 + + +HorseJumpProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +HorseJumpProgress +200 + + + + +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 + + + + + +HealthAbsorb +81.000000 +9.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 + + + Health @@ -260,98 +464,189 @@ -Armour +HorseHealth 81.000000 +19.000000 +101.000000,0.000000,0.000000 + + + +Health9 +9.000000 9.000000 +0.000031,10.000061,0.000000 +HudHealth + -Armour0 +Health8 +9.000000 +9.000000 +8.000000,10.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +16.000000,10.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +24.000000,10.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +32.000000,10.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +40.000000,10.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +48.000000,10.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +56.000000,10.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +64.000000,10.000061,0.000000 +HudHealth + + + + +Health0 +9.000000 +9.000000 +72.000031,10.000061,0.000000 +HudHealth + + + + +Health19 9.000000 9.000000 0.000031,0.000061,0.000000 -HudArmour +HudHealth -Armour1 +Health18 9.000000 9.000000 -8.000031,0.000061,0.000000 -HudArmour +8.000000,0.000061,0.000000 +HudHealth -Armour2 +Health17 9.000000 9.000000 -16.000029,0.000061,0.000000 -HudArmour +16.000000,0.000061,0.000000 +HudHealth -Armour3 +Health16 9.000000 9.000000 -24.000027,0.000061,0.000000 -HudArmour +24.000000,0.000061,0.000000 +HudHealth -Armour4 +Health15 9.000000 9.000000 -32.000027,0.000061,0.000000 -HudArmour +32.000000,0.000061,0.000000 +HudHealth -Armour5 +Health14 9.000000 9.000000 -40.000027,0.000061,0.000000 -HudArmour +40.000000,0.000061,0.000000 +HudHealth -Armour6 +Health13 9.000000 9.000000 -48.000023,0.000061,0.000000 -HudArmour +48.000000,0.000061,0.000000 +HudHealth -Armour7 +Health12 9.000000 9.000000 -56.000023,0.000061,0.000000 -HudArmour +56.000000,0.000061,0.000000 +HudHealth -Armour8 +Health11 9.000000 9.000000 -64.000023,0.000061,0.000000 -HudArmour +64.000000,0.000061,0.000000 +HudHealth -Armour9 +Health10 9.000000 9.000000 72.000031,0.000061,0.000000 -HudArmour +HudHealth diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_480.h b/Minecraft.Client/Common/Media/xuiscene_hud_480.h index 8bf537f5..1c1fb549 100644 --- a/Minecraft.Client/Common/Media/xuiscene_hud_480.h +++ b/Minecraft.Client/Common/Media/xuiscene_hud_480.h @@ -11,17 +11,7 @@ #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_HorseJumpProgress L"HorseJumpProgress" #define IDC_Armour0 L"Armour0" #define IDC_Armour1 L"Armour1" #define IDC_Armour2 L"Armour2" @@ -33,6 +23,49 @@ #define IDC_Armour8 L"Armour8" #define IDC_Armour9 L"Armour9" #define IDC_Armour L"Armour" +#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_HealthAbsorb L"HealthAbsorb" +#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_Health9 L"Health9" +#define IDC_Health8 L"Health8" +#define IDC_Health7 L"Health7" +#define IDC_Health6 L"Health6" +#define IDC_Health5 L"Health5" +#define IDC_Health4 L"Health4" +#define IDC_Health3 L"Health3" +#define IDC_Health2 L"Health2" +#define IDC_Health1 L"Health1" +#define IDC_Health0 L"Health0" +#define IDC_Health19 L"Health19" +#define IDC_Health18 L"Health18" +#define IDC_Health17 L"Health17" +#define IDC_Health16 L"Health16" +#define IDC_Health15 L"Health15" +#define IDC_Health14 L"Health14" +#define IDC_Health13 L"Health13" +#define IDC_Health12 L"Health12" +#define IDC_Health11 L"Health11" +#define IDC_Health10 L"Health10" +#define IDC_HorseHealth L"HorseHealth" #define IDC_Food9 L"Food9" #define IDC_Food8 L"Food8" #define IDC_Food7 L"Food7" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_480.xui b/Minecraft.Client/Common/Media/xuiscene_hud_480.xui index 4364039e..14d62faa 100644 --- a/Minecraft.Client/Common/Media/xuiscene_hud_480.xui +++ b/Minecraft.Client/Common/Media/xuiscene_hud_480.xui @@ -160,6 +160,210 @@ 200 + + +HorseJumpProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +HorseJumpProgress +200 + + + + +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 + + + + + +HealthAbsorb +81.000000 +9.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 + + + Health @@ -260,98 +464,189 @@ -Armour +HorseHealth 81.000000 +19.000000 +101.000000,0.000000,0.000000 + + + +Health9 +9.000000 9.000000 +0.000031,10.000061,0.000000 +HudHealth + -Armour0 +Health8 +9.000000 +9.000000 +8.000000,10.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +16.000000,10.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +24.000000,10.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +32.000000,10.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +40.000000,10.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +48.000000,10.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +56.000000,10.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +64.000000,10.000061,0.000000 +HudHealth + + + + +Health0 +9.000000 +9.000000 +72.000031,10.000061,0.000000 +HudHealth + + + + +Health19 9.000000 9.000000 0.000031,0.000061,0.000000 -HudArmour +HudHealth -Armour1 +Health18 9.000000 9.000000 -8.000031,0.000061,0.000000 -HudArmour +8.000000,0.000061,0.000000 +HudHealth -Armour2 +Health17 9.000000 9.000000 -16.000029,0.000061,0.000000 -HudArmour +16.000000,0.000061,0.000000 +HudHealth -Armour3 +Health16 9.000000 9.000000 -24.000027,0.000061,0.000000 -HudArmour +24.000000,0.000061,0.000000 +HudHealth -Armour4 +Health15 9.000000 9.000000 -32.000027,0.000061,0.000000 -HudArmour +32.000000,0.000061,0.000000 +HudHealth -Armour5 +Health14 9.000000 9.000000 -40.000027,0.000061,0.000000 -HudArmour +40.000000,0.000061,0.000000 +HudHealth -Armour6 +Health13 9.000000 9.000000 -48.000023,0.000061,0.000000 -HudArmour +48.000000,0.000061,0.000000 +HudHealth -Armour7 +Health12 9.000000 9.000000 -56.000023,0.000061,0.000000 -HudArmour +56.000000,0.000061,0.000000 +HudHealth -Armour8 +Health11 9.000000 9.000000 -64.000023,0.000061,0.000000 -HudArmour +64.000000,0.000061,0.000000 +HudHealth -Armour9 +Health10 9.000000 9.000000 72.000031,0.000061,0.000000 -HudArmour +HudHealth diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_small.h b/Minecraft.Client/Common/Media/xuiscene_hud_small.h index 8bf537f5..1c1fb549 100644 --- a/Minecraft.Client/Common/Media/xuiscene_hud_small.h +++ b/Minecraft.Client/Common/Media/xuiscene_hud_small.h @@ -11,17 +11,7 @@ #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_HorseJumpProgress L"HorseJumpProgress" #define IDC_Armour0 L"Armour0" #define IDC_Armour1 L"Armour1" #define IDC_Armour2 L"Armour2" @@ -33,6 +23,49 @@ #define IDC_Armour8 L"Armour8" #define IDC_Armour9 L"Armour9" #define IDC_Armour L"Armour" +#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_HealthAbsorb L"HealthAbsorb" +#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_Health9 L"Health9" +#define IDC_Health8 L"Health8" +#define IDC_Health7 L"Health7" +#define IDC_Health6 L"Health6" +#define IDC_Health5 L"Health5" +#define IDC_Health4 L"Health4" +#define IDC_Health3 L"Health3" +#define IDC_Health2 L"Health2" +#define IDC_Health1 L"Health1" +#define IDC_Health0 L"Health0" +#define IDC_Health19 L"Health19" +#define IDC_Health18 L"Health18" +#define IDC_Health17 L"Health17" +#define IDC_Health16 L"Health16" +#define IDC_Health15 L"Health15" +#define IDC_Health14 L"Health14" +#define IDC_Health13 L"Health13" +#define IDC_Health12 L"Health12" +#define IDC_Health11 L"Health11" +#define IDC_Health10 L"Health10" +#define IDC_HorseHealth L"HorseHealth" #define IDC_Food9 L"Food9" #define IDC_Food8 L"Food8" #define IDC_Food7 L"Food7" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_small.xui b/Minecraft.Client/Common/Media/xuiscene_hud_small.xui index cea7e2bd..84d5b6df 100644 --- a/Minecraft.Client/Common/Media/xuiscene_hud_small.xui +++ b/Minecraft.Client/Common/Media/xuiscene_hud_small.xui @@ -160,6 +160,210 @@ 200 + + +HorseJumpProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +HorseJumpProgress +200 + + + + +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 + + + + + +HealthAbsorb +81.000000 +9.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 + + + Health @@ -260,98 +464,189 @@ -Armour +HorseHealth 81.000000 +19.000000 +101.000000,0.000000,0.000000 + + + +Health9 +9.000000 9.000000 +0.000031,10.000061,0.000000 +HudHealth + -Armour0 +Health8 +9.000000 +9.000000 +8.000000,10.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +16.000000,10.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +24.000000,10.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +32.000000,10.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +40.000000,10.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +48.000000,10.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +56.000000,10.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +64.000000,10.000061,0.000000 +HudHealth + + + + +Health0 +9.000000 +9.000000 +72.000031,10.000061,0.000000 +HudHealth + + + + +Health19 9.000000 9.000000 0.000031,0.000061,0.000000 -HudArmour +HudHealth -Armour1 +Health18 9.000000 9.000000 -8.000031,0.000061,0.000000 -HudArmour +8.000000,0.000061,0.000000 +HudHealth -Armour2 +Health17 9.000000 9.000000 -16.000029,0.000061,0.000000 -HudArmour +16.000000,0.000061,0.000000 +HudHealth -Armour3 +Health16 9.000000 9.000000 -24.000027,0.000061,0.000000 -HudArmour +24.000000,0.000061,0.000000 +HudHealth -Armour4 +Health15 9.000000 9.000000 -32.000027,0.000061,0.000000 -HudArmour +32.000000,0.000061,0.000000 +HudHealth -Armour5 +Health14 9.000000 9.000000 -40.000027,0.000061,0.000000 -HudArmour +40.000000,0.000061,0.000000 +HudHealth -Armour6 +Health13 9.000000 9.000000 -48.000023,0.000061,0.000000 -HudArmour +48.000000,0.000061,0.000000 +HudHealth -Armour7 +Health12 9.000000 9.000000 -56.000023,0.000061,0.000000 -HudArmour +56.000000,0.000061,0.000000 +HudHealth -Armour8 +Health11 9.000000 9.000000 -64.000023,0.000061,0.000000 -HudArmour +64.000000,0.000061,0.000000 +HudHealth -Armour9 +Health10 9.000000 9.000000 72.000031,0.000061,0.000000 -HudArmour +HudHealth diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h index 330eac41..4ba8da05 100644 --- a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h @@ -1,3 +1,10 @@ +#define IDC_CheckboxNaturalRegen L"CheckboxNaturalRegen" +#define IDC_CheckboxTileDrops L"CheckboxTileDrops" +#define IDC_CheckboxMobLoot L"CheckboxMobLoot" +#define IDC_CheckboxMobGriefing L"CheckboxMobGriefing" +#define IDC_CheckboxMobSpawning L"CheckboxMobSpawning" +#define IDC_CheckboxKeepInventory L"CheckboxKeepInventory" +#define IDC_CheckboxDaylightCycle L"CheckboxDaylightCycle" #define IDC_CheckboxTNT L"CheckboxTNT" #define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" #define IDC_ButtonTeleportToPlayer L"ButtonTeleportToPlayer" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui index af2b53ca..decdffab 100644 --- a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui @@ -7,23 +7,109 @@ InGameHostOptions 454.666687 -196.000000 -412.666718,262.000031,0.000000 +435.000000 +412.666718,140.000031,0.000000 CScene_InGameHostOptions XuiScene GameOptions\CheckboxFireSpreads +2 GameOptions 450.000000 -173.000000 -0.000000,18.000000,0.000000 +411.000000 +0.000000,16.000000,0.000000 2 XuiBlankScene +CheckboxNaturalRegen +402.000000 +34.000000 +22.000000,274.000000,0.000000 +2 +XuiCheckbox +CheckboxTileDrops +ButtonTeleportToPlayer +ButtonTeleportToPlayer + + + + +CheckboxTileDrops +402.000000 +34.000000 +22.000000,240.000000,0.000000 +2 +XuiCheckbox +CheckboxMobLoot +CheckboxNaturalRegen + + + + +CheckboxMobLoot +402.000000 +34.000000 +22.000000,204.000000,0.000000 +2 +XuiCheckbox +CheckboxMobGriefing +CheckboxTileDrops + + + + +CheckboxMobGriefing +402.000000 +34.000000 +22.000000,170.000000,0.000000 +2 +XuiCheckbox +CheckboxMobSpawning +CheckboxMobLoot + + + + +CheckboxMobSpawning +402.000000 +34.000000 +22.000000,136.000000,0.000000 +2 +XuiCheckbox +CheckboxKeepInventory +CheckboxMobGriefing + + + + +CheckboxKeepInventory +402.000000 +34.000000 +22.000000,102.000000,0.000000 +2 +XuiCheckbox +CheckboxDaylightCycle +CheckboxMobSpawning + + + + +CheckboxDaylightCycle +402.000000 +34.000000 +22.000000,68.000000,0.000000 +2 +XuiCheckbox +CheckboxTNT +CheckboxKeepInventory + + + + CheckboxTNT 402.000000 34.000000 @@ -31,7 +117,7 @@ 2 XuiCheckbox CheckboxFireSpreads -ButtonTeleportToPlayer +CheckboxDaylightCycle @@ -39,7 +125,7 @@ CheckboxFireSpreads 402.000000 34.000000 -22.000000,0.000000,0.000000 +22.000000,1.000000,0.000000 2 XuiCheckbox CheckboxTNT @@ -50,8 +136,8 @@ ButtonTeleportToPlayer 412.000000 40.000000 -22.000000,72.999985,0.000000 -CheckboxTNT +21.000000,311.000000,0.000000 +CheckboxNaturalRegen ButtonTeleportPlayerToMe @@ -60,7 +146,7 @@ ButtonTeleportPlayerToMe 412.000000 40.000000 -22.000000,119.999985,0.000000 +21.000000,360.000000,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 index 330eac41..4ba8da05 100644 --- a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.h +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.h @@ -1,3 +1,10 @@ +#define IDC_CheckboxNaturalRegen L"CheckboxNaturalRegen" +#define IDC_CheckboxTileDrops L"CheckboxTileDrops" +#define IDC_CheckboxMobLoot L"CheckboxMobLoot" +#define IDC_CheckboxMobGriefing L"CheckboxMobGriefing" +#define IDC_CheckboxMobSpawning L"CheckboxMobSpawning" +#define IDC_CheckboxKeepInventory L"CheckboxKeepInventory" +#define IDC_CheckboxDaylightCycle L"CheckboxDaylightCycle" #define IDC_CheckboxTNT L"CheckboxTNT" #define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" #define IDC_ButtonTeleportToPlayer L"ButtonTeleportToPlayer" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui index df6888f3..0db33e51 100644 --- a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui @@ -6,42 +6,125 @@ InGameHostOptions -462.444458 -189.444443 -88.777794,145.277802,0.000000 +440.000000 +330.000000 +100.000038,75.000000,0.000000 CScene_InGameHostOptions -XuiScene +GraphicPanel GameOptions\CheckboxFireSpreads GameOptions -450.000000 -170.999985 -0.000000,18.000000,0.000000 +440.000000 +330.000000 2 XuiBlankScene +CheckboxNaturalRegen +402.000000 +24.000000 +15.000016,206.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTileDrops +ButtonTeleportToPlayer + + + + +CheckboxTileDrops +402.000000 +24.000000 +15.000016,182.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxMobLoot +CheckboxNaturalRegen + + + + +CheckboxMobLoot +402.000000 +24.000000 +15.000016,158.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxMobGriefing +CheckboxTileDrops + + + + +CheckboxMobGriefing +402.000000 +24.000000 +15.000016,134.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxMobSpawning +CheckboxMobLoot + + + + +CheckboxMobSpawning +402.000000 +24.000000 +15.000016,110.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxKeepInventory +CheckboxMobGriefing + + + + +CheckboxKeepInventory +402.000000 +24.000000 +15.000016,86.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxDaylightCycle +CheckboxMobSpawning + + + + +CheckboxDaylightCycle +402.000000 +24.000000 +15.000016,62.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTNT +CheckboxKeepInventory + + + + CheckboxTNT 402.000000 -34.000000 -22.000000,34.000000,0.000000 +24.000000 +15.000016,38.000000,0.000000 2 -XuiCheckbox +XuiCheckboxSmall CheckboxFireSpreads -ButtonTeleportToPlayer +CheckboxDaylightCycle CheckboxFireSpreads 402.000000 -34.000000 -22.000000,0.000000,0.000000 +24.000000 +15.000016,14.000000,0.000000 2 -XuiCheckbox +XuiCheckboxSmall CheckboxTNT @@ -50,9 +133,9 @@ ButtonTeleportToPlayer 410.000000 36.000000 -26.000004,72.000015,0.000000 +15.000020,232.000000,0.000000 XuiMainMenuButton_L_Thin -CheckboxTNT +CheckboxNaturalRegen ButtonTeleportPlayerToMe @@ -61,7 +144,7 @@ ButtonTeleportPlayerToMe 410.000000 36.000000 -26.000004,116.000015,0.000000 +15.000020,276.000000,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 index 330eac41..4ba8da05 100644 --- a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.h +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.h @@ -1,3 +1,10 @@ +#define IDC_CheckboxNaturalRegen L"CheckboxNaturalRegen" +#define IDC_CheckboxTileDrops L"CheckboxTileDrops" +#define IDC_CheckboxMobLoot L"CheckboxMobLoot" +#define IDC_CheckboxMobGriefing L"CheckboxMobGriefing" +#define IDC_CheckboxMobSpawning L"CheckboxMobSpawning" +#define IDC_CheckboxKeepInventory L"CheckboxKeepInventory" +#define IDC_CheckboxDaylightCycle L"CheckboxDaylightCycle" #define IDC_CheckboxTNT L"CheckboxTNT" #define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" #define IDC_ButtonTeleportToPlayer L"ButtonTeleportToPlayer" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui index 0b759663..9041e773 100644 --- a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui @@ -6,42 +6,125 @@ InGameHostOptions -462.444458 -189.444443 -88.777809,85.277794,0.000000 +440.000000 +330.000000 +100.000038,0.000000,0.000000 CScene_InGameHostOptions -XuiScene +GraphicPanel GameOptions\CheckboxFireSpreads GameOptions -450.000000 -170.999985 -0.000000,18.000000,0.000000 +440.000000 +330.000000 2 XuiBlankScene +CheckboxNaturalRegen +402.000000 +24.000000 +15.000016,206.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTileDrops +ButtonTeleportToPlayer + + + + +CheckboxTileDrops +402.000000 +24.000000 +15.000016,182.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxMobLoot +CheckboxNaturalRegen + + + + +CheckboxMobLoot +402.000000 +24.000000 +15.000016,158.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxMobGriefing +CheckboxTileDrops + + + + +CheckboxMobGriefing +402.000000 +24.000000 +15.000016,134.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxMobSpawning +CheckboxMobLoot + + + + +CheckboxMobSpawning +402.000000 +24.000000 +15.000016,110.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxKeepInventory +CheckboxMobGriefing + + + + +CheckboxKeepInventory +402.000000 +24.000000 +15.000016,86.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxDaylightCycle +CheckboxMobSpawning + + + + +CheckboxDaylightCycle +402.000000 +24.000000 +15.000016,62.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTNT +CheckboxKeepInventory + + + + CheckboxTNT 402.000000 -34.000000 -22.000000,34.000000,0.000000 +24.000000 +15.000016,38.000000,0.000000 2 -XuiCheckbox +XuiCheckboxSmall CheckboxFireSpreads -ButtonTeleportToPlayer +CheckboxDaylightCycle CheckboxFireSpreads 402.000000 -34.000000 -22.000000,0.000000,0.000000 +24.000000 +15.000016,14.000000,0.000000 2 -XuiCheckbox +XuiCheckboxSmall CheckboxTNT @@ -50,9 +133,9 @@ ButtonTeleportToPlayer 410.000000 36.000000 -26.000004,72.000015,0.000000 +15.000020,232.000000,0.000000 XuiMainMenuButton_L_Thin -CheckboxTNT +CheckboxNaturalRegen ButtonTeleportPlayerToMe @@ -61,7 +144,7 @@ ButtonTeleportPlayerToMe 410.000000 36.000000 -26.000004,116.000015,0.000000 +15.000020,276.000000,0.000000 XuiMainMenuButton_L_Thin ButtonTeleportToPlayer diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h index 12dfbaf8..3eff3adc 100644 --- a/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h @@ -228,6 +228,15 @@ #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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" @@ -490,6 +499,16 @@ #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_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" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui index 0163464d..ca184ee5 100644 --- a/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui @@ -3241,6 +3241,132 @@ 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 + + @@ -6901,20 +7027,159 @@ 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 + + Group_Tab_Images -1280.000000 -200.000000 --319.300049,-48.999992,0.000000 +643.000000 +78.000000 TabImage1 83.000000 78.000000 -319.000000,46.000000,0.000000 +0.000000,-2.000000,0.000000 CreativeInventoryTabLeft @@ -6923,7 +7188,7 @@ TabImage2 83.000000 78.000000 -399.000000,46.000000,0.000000 +80.000000,-2.000000,0.000000 CreativeInventoryTabMiddle @@ -6932,7 +7197,7 @@ TabImage3 83.000000 78.000000 -479.000000,46.000000,0.000000 +160.000000,-2.000000,0.000000 CreativeInventoryTabMiddle @@ -6941,7 +7206,7 @@ TabImage4 83.000000 78.000000 -559.000000,46.000000,0.000000 +240.000000,-2.000000,0.000000 CreativeInventoryTabMiddle @@ -6950,7 +7215,7 @@ TabImage5 83.000000 78.000000 -639.000000,46.000000,0.000000 +320.000000,-2.000000,0.000000 CreativeInventoryTabMiddle @@ -6959,7 +7224,7 @@ TabImage6 83.000000 78.000000 -719.000000,46.000000,0.000000 +400.000000,-2.000000,0.000000 CreativeInventoryTabMiddle @@ -6968,7 +7233,7 @@ TabImage7 83.000000 78.000000 -799.000000,46.000000,0.000000 +480.000000,-2.000000,0.000000 CreativeInventoryTabMiddle @@ -6977,7 +7242,7 @@ TabImage8 83.000000 78.000000 -879.000000,46.000000,0.000000 +560.000000,-2.000000,0.000000 CreativeInventoryTabRight diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings.h b/Minecraft.Client/Common/Media/xuiscene_load_settings.h index fdacf6fd..027a45fb 100644 --- a/Minecraft.Client/Common/Media/xuiscene_load_settings.h +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings.h @@ -6,6 +6,9 @@ #define IDC_Background L"Background" #define IDC_XuiLoadSettings L"XuiLoadSettings" #define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_CheckboxOnline L"CheckboxOnline" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings.xui b/Minecraft.Client/Common/Media/xuiscene_load_settings.xui index 8cf791a0..781f3da2 100644 --- a/Minecraft.Client/Common/Media/xuiscene_load_settings.xui +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings.xui @@ -17,8 +17,8 @@ TexturePackDetails 334.000000 -432.000000 -260.000000,10.000000,0.000000 +462.000000 +260.000000,14.000000,0.000000 LeaderboardHeaderPanel @@ -26,7 +26,7 @@ ComparisonPic 292.000000 160.000000 -26.000000,256.000000,0.000000 +26.000000,291.000000,0.000000 CXuiCtrl4JIcon XuiVisualImagePresenter @@ -54,9 +54,9 @@ TexturePackDescription 292.000000 -160.000000 +180.000000 26.000000,86.000000,0.000000 -XuiLabelDesc_LftWrp +XuiHtmlControl @@ -64,14 +64,14 @@ MainScene 490.000000 -450.000000 +484.000000 140.000031,0.000000,0.000000 Background 490.000000 -450.000000 +484.000000 15 XuiScene @@ -81,7 +81,7 @@ XuiLoadSettings 440.000000 40.000000 -25.000015,384.000000,0.000000 +25.000015,420.000000,0.000000 XuiMainMenuButton_L XuiMoreOptions @@ -91,13 +91,24 @@ XuiMoreOptions 440.000000 40.000000 -25.000015,334.000000,0.000000 +25.000015,370.000000,0.000000 XuiMainMenuButton_L -TexturePacksList +CheckboxOnline XuiLoadSettings 22528 + + +CheckboxOnline +402.000000 +34.000000 +25.000015,330.000000,0.000000 +XuiCheckbox +TexturePacksList +XuiMoreOptions + + TexturePacksList @@ -107,7 +118,7 @@ CXuiCtrl4JList XuiListTexturePack XuiSliderDifficulty\XuiSlider -XuiMoreOptions +CheckboxOnline true @@ -308,6 +319,28 @@ 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 + + @@ -449,27 +482,27 @@ 0 -260.000000,10.000000,0.000000 +260.000000,14.000000,0.000000 0 -260.000000,10.000000,0.000000 +260.000000,14.000000,0.000000 0 -434.000000,10.000000,0.000000 +434.000000,14.000000,0.000000 0 -434.000000,10.000000,0.000000 +434.000000,14.000000,0.000000 0 -260.000000,10.000000,0.000000 +260.000000,14.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 index 9942515e..df3b2198 100644 --- a/Minecraft.Client/Common/Media/xuiscene_load_settings_480.h +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.h @@ -6,6 +6,9 @@ #define IDC_Background L"Background" #define IDC_XuiLoadSettings L"XuiLoadSettings" #define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_CheckboxOnline L"CheckboxOnline" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui index fd9eaa91..d39f0940 100644 --- a/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui @@ -17,8 +17,8 @@ TexturePackDetails 230.000000 -358.000000 -183.500015,9.999999,0.000000 +378.000000 +184.000000,2.000000,0.000000 LeaderboardHeaderPanel @@ -26,7 +26,7 @@ ComparisonPic 196.000000 112.000000 -20.000000,234.000000,0.000000 +20.000000,254.000000,0.000000 CXuiCtrl4JIcon XuiVisualImagePresenter @@ -35,9 +35,9 @@ TexturePackDescription 196.000000 -96.000000 +106.000000 20.000010,132.000000,0.000000 -XuiLabelDesc_LftWrp_Small +XuiHtmlControl_Small @@ -64,14 +64,14 @@ MainScene 380.000000 -375.000000 -108.500015,0.000000,0.000000 +401.000000 +108.500015,-12.999970,0.000000 Background 380.000000 -375.000000 +401.000000 15 XuiScene @@ -81,7 +81,7 @@ XuiLoadSettings 344.000000 36.000000 -18.000000,326.000000,0.000000 +18.000000,342.000000,0.000000 XuiMainMenuButton_L_Thin XuiMoreOptions 22528 @@ -92,13 +92,24 @@ XuiMoreOptions 344.000000 36.000000 -18.000000,281.000000,0.000000 +18.000000,297.000000,0.000000 XuiMainMenuButton_L_Thin -TexturePacksList +CheckboxOnline XuiLoadSettings 22528 + + +CheckboxOnline +304.000000 +26.000000 +20.000000,272.000000,0.000000 +XuiCheckboxSmall +TexturePacksList +XuiMoreOptions + + TexturePacksList @@ -108,7 +119,7 @@ CXuiCtrl4JList XuiListTexturePackSmall XuiSliderDifficulty\XuiSlider -XuiMoreOptions +CheckboxOnline true @@ -313,6 +324,30 @@ 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 + + @@ -424,27 +459,27 @@ 0 -108.500015,0.000000,0.000000 +108.500015,-12.999970,0.000000 0 -108.500008,0.000000,0.000000 +108.500008,-12.999985,0.000000 0 -0.000000,0.000000,0.000000 +0.000000,-12.999985,0.000000 0 -0.000000,0.000000,0.000000 +0.000000,-12.999985,0.000000 0 -108.500015,0.000000,0.000000 +108.500015,-12.999985,0.000000 @@ -453,27 +488,27 @@ 0 -183.500015,9.999999,0.000000 +184.000000,2.000000,0.000000 0 -183.500015,9.999999,0.000000 +184.000000,2.000000,0.000000 0 -366.000000,9.999999,0.000000 +366.000000,2.000000,0.000000 0 -366.000000,9.999999,0.000000 +366.000000,2.000000,0.000000 0 -183.500015,9.999999,0.000000 +183.500015,2.000000,0.000000 diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create.h b/Minecraft.Client/Common/Media/xuiscene_multi_create.h index 69e78136..56e7204d 100644 --- a/Minecraft.Client/Common/Media/xuiscene_multi_create.h +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create.h @@ -6,6 +6,7 @@ #define IDC_Background L"Background" #define IDC_XuiNewWorld L"XuiNewWorld" #define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_CheckboxOnline L"CheckboxOnline" #define IDC_XuiSlider L"XuiSlider" #define IDC_FocusSink L"FocusSink" #define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" @@ -24,12 +25,12 @@ #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_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 index 81e03066..e96753ab 100644 --- a/Minecraft.Client/Common/Media/xuiscene_multi_create.xui +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create.xui @@ -7,7 +7,7 @@ MultiGameCreate 810.000000 -498.000000 +532.000000 235.000092,110.000000,0.000000 CScene_MultiGameCreate XuiBlankScene @@ -17,8 +17,8 @@ TexturePackDetails 334.000000 -432.000000 -287.000000,48.000000,0.000000 +410.000000 +238.000046,64.000000,0.000000 LeaderboardHeaderPanel @@ -26,7 +26,7 @@ ComparisonPic 292.000000 160.000000 -26.000000,256.000000,0.000000 +26.000000,236.000000,0.000000 CXuiCtrl4JIcon XuiVisualImagePresenter @@ -50,28 +50,29 @@ XuiLabelLight_FRONT_END_Shd_Wrp - + TexturePackDescription 292.000000 -160.000000 +126.000000 26.000000,86.000000,0.000000 -XuiLabelDesc_LftWrp +XuiHtmlControl - + MainScene 490.000000 -498.000000 -159.000000,0.000000,0.000000 +433.000000 +159.000000,49.000000,0.000000 Background 490.000000 -498.000000 +433.000000 +0.833344,0.000000,0.000000 15 XuiScene @@ -81,7 +82,7 @@ XuiNewWorld 440.000000 40.000000 -25.000015,438.000000,0.000000 +25.000015,369.000000,0.000000 XuiMainMenuButton_L XuiMoreOptions 22528 @@ -92,24 +93,35 @@ XuiMoreOptions 440.000000 40.000000 -25.000015,388.000000,0.000000 +25.000015,319.000000,0.000000 XuiMainMenuButton_L -XuiSliderDifficulty\XuiSlider +CheckboxOnline XuiNewWorld 22528 + + +CheckboxOnline +402.000000 +34.000000 +25.000015,285.000000,0.000000 +XuiCheckbox +TexturePacksList +XuiMoreOptions + + XuiSliderDifficulty 446.000000 38.000000 -22.000017,344.000000,0.000000 +22.000017,144.000000,0.000000 5 CXuiCtrlSliderWrapper XuiSliderWrapper -TexturePacksList -XuiMoreOptions +XuiGameModeToggle +TexturePacksList FocusSink @@ -134,11 +146,11 @@ TexturePacksList 428.000000 96.000000 -32.000000,244.000000,0.000000 +32.000000,189.000000,0.000000 CXuiCtrl4JList XuiListTexturePack -XuiGameModeToggle -XuiSliderDifficulty\XuiSlider +XuiSliderDifficulty\XuiSlider +CheckboxOnline true @@ -306,40 +318,52 @@ 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 +25.000015,96.999992,0.000000 XuiMainMenuButton_L -XuiEditSeed -TexturePacksList +XuiEditWorldName +XuiSliderDifficulty\XuiSlider 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 @@ -348,8 +372,7 @@ 28.000000,52.000000,0.000000 CXuiCtrl4JEdit XuiEdit -CheckboxAllowFoF -XuiEditSeed +XuiGameModeToggle @@ -361,15 +384,6 @@ XuiLabelDark - - -XuiLabelSeed -440.000000 -26.172791 -25.000000,96.000000,0.000000 -XuiLabelDark - - @@ -403,27 +417,27 @@ 0 -159.000000,0.000000,0.000000 +159.000000,49.000000,0.000000 0 -159.000000,0.000000,0.000000 +159.000000,49.000000,0.000000 0 -0.000000,0.000000,0.000000 +0.000000,49.000000,0.000000 0 -0.000000,0.000000,0.000000 +0.000000,49.000000,0.000000 0 -159.000000,0.000000,0.000000 +159.000000,49.000000,0.000000 @@ -432,27 +446,27 @@ 0 -287.000000,48.000000,0.000000 +238.000046,64.000000,0.000000 0 -287.000000,48.000000,0.000000 +287.000000,65.000000,0.000000 0 -477.000000,48.000000,0.000000 +477.000000,65.000000,0.000000 0 -477.000000,48.000000,0.000000 +477.000000,65.000000,0.000000 0 -287.000000,48.000000,0.000000 +287.000000,65.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 index 41ef7a17..760e559e 100644 --- a/Minecraft.Client/Common/Media/xuiscene_multi_create_480.h +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.h @@ -6,6 +6,7 @@ #define IDC_Background L"Background" #define IDC_XuiNewWorld L"XuiNewWorld" #define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_CheckboxOnline L"CheckboxOnline" #define IDC_XuiSlider L"XuiSlider" #define IDC_FocusSink L"FocusSink" #define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" @@ -27,11 +28,11 @@ #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_ListItem" #define IDC_control_ListItem L"control_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" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui index 12efc6e6..ccf74533 100644 --- a/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui @@ -17,8 +17,8 @@ TexturePackDetails 230.000000 -382.000000 -163.500046,7.999999,0.000000 +334.000000 +163.500046,40.000000,0.000000 LeaderboardHeaderPanel @@ -26,26 +26,26 @@ ComparisonPic 196.000000 112.000000 -20.000000,258.000000,0.000000 +20.000000,212.000000,0.000000 CXuiCtrl4JIcon XuiVisualImagePresenter - + TexturePackDescription 196.000000 -122.000000 -20.000010,130.000000,0.000000 -XuiLabelDesc_LftWrp_Small +80.000000 +20.000000,122.000000,0.000000 +XuiHtmlControl - + TexturePackName 196.000000 43.000000 -20.000000,80.000008,0.000000 +20.000000,74.000008,0.000000 XuiLabelLight_FRONT_END_Shd_Wrp_Small @@ -54,7 +54,7 @@ Icon 64.000000 64.000000 -88.000000,10.000000,0.000000 +88.000000,6.000000,0.000000 CXuiCtrl4JIcon XuiVisualImagePresenter @@ -64,14 +64,14 @@ MainScene 340.000000 -400.000000 -108.500015,0.000000,0.000000 +355.000000 +108.500015,27.500019,0.000000 Background 340.000000 -398.000000 +353.000000 15 XuiScene @@ -81,7 +81,7 @@ XuiNewWorld 304.000000 36.000000 -18.000000,344.000000,0.000000 +18.000000,292.000000,0.000000 XuiMainMenuButton_L_Thin XuiMoreOptions 22528 @@ -92,24 +92,35 @@ XuiMoreOptions 304.000000 36.000000 -18.000000,302.000000,0.000000 +18.000000,250.000000,0.000000 XuiMainMenuButton_L_Thin -XuiSliderDifficulty\XuiSlider +CheckboxOnline XuiNewWorld 22528 + + +CheckboxOnline +304.000000 +26.000000 +18.000000,228.000000,0.000000 +XuiCheckboxSmall +TexturePacksList +XuiMoreOptions + + XuiSliderDifficulty 310.000000 38.000000 -15.000000,260.000000,0.000000 +15.000000,112.000000,0.000000 5 CXuiCtrlSliderWrapper XuiSliderWrapper -TexturePacksList -XuiMoreOptions +XuiGameModeToggle +TexturePacksList FocusSink @@ -134,11 +145,11 @@ TexturePacksList 304.000000 74.000000 -18.000000,186.000000,0.000000 +18.000000,150.000000,0.000000 CXuiCtrl4JList XuiListTexturePackSmall -XuiGameModeToggle -XuiSliderDifficulty\XuiSlider +XuiSliderDifficulty\XuiSlider +CheckboxOnline true @@ -345,48 +356,55 @@ 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 +18.000000,70.000000,0.000000 XuiMainMenuButton_L_Thin -XuiEditSeed -TexturePacksList +XuiEditWorldName +XuiSliderDifficulty\XuiSlider 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 @@ -394,8 +412,7 @@ 21.000000,32.000000,0.000000 CXuiCtrl4JEdit XuiEdit -CheckboxAllowFoF -XuiEditSeed +XuiGameModeToggle @@ -440,27 +457,27 @@ 0 -108.500015,0.000000,0.000000 +108.500015,27.500019,0.000000 0 -108.500015,0.000000,0.000000 +108.500015,27.500019,0.000000 0 -0.000000,0.000000,0.000000 +0.000000,27.500019,0.000000 0 -0.000000,0.000000,0.000000 +0.000000,27.500019,0.000000 0 -108.500015,0.000000,0.000000 +108.500015,27.500019,0.000000 @@ -469,27 +486,27 @@ 0 -163.500046,7.999999,0.000000 +163.500046,40.000000,0.000000 0 -163.500046,8.000000,0.000000 +163.500046,40.000000,0.000000 0 -327.000000,8.000000,0.000000 +327.000000,40.000000,0.000000 0 -327.000000,8.000000,0.000000 +327.000000,40.000000,0.000000 0 -163.500046,8.000000,0.000000 +163.500046,40.000000,0.000000 diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h index ac9daa38..9a34c335 100644 --- a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h @@ -1,18 +1,34 @@ -#define IDC_CheckboxResetNether L"CheckboxResetNether" +#define IDC_OptionsTab_off L"OptionsTab_off" +#define IDC_GameOptionsDescription L"GameOptionsDescription" +#define IDC_CheckboxNaturalRegeneration L"CheckboxNaturalRegeneration" +#define IDC_CheckboxTileDrops L"CheckboxTileDrops" +#define IDC_CheckboxMobLoot L"CheckboxMobLoot" +#define IDC_CheckboxMobGriefing L"CheckboxMobGriefing" +#define IDC_CheckboxMobSpawning L"CheckboxMobSpawning" +#define IDC_CheckboxKeepInventory L"CheckboxKeepInventory" +#define IDC_CheckboxDayLightCycle L"CheckboxDayLightCycle" #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_GameOptions L"GameOptions" +#define IDC_GameOptionsGroup L"GameOptionsGroup" +#define IDC_WorldOptionsDescription L"WorldOptionsDescription" +#define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" +#define IDC_CheckboxTNT L"CheckboxTNT" +#define IDC_CheckboxTrustSystem L"CheckboxTrustSystem" +#define IDC_CheckboxResetNether L"CheckboxResetNether" #define IDC_CheckboxBonusChest L"CheckboxBonusChest" #define IDC_CheckboxFlatWorld L"CheckboxFlatWorld" #define IDC_CheckboxStructures L"CheckboxStructures" +#define IDC_XuiLabelRandomSeed L"XuiLabelRandomSeed" +#define IDC_XuiEditSeed L"XuiEditSeed" +#define IDC_XuiLabelSeed L"XuiLabelSeed" #define IDC_WorldOptions L"WorldOptions" -#define IDC_WO_Box L"WO_Box" -#define IDC_GenerationOptions L"GenerationOptions" -#define IDC_Description L"Description" +#define IDC_WorldOptionsGroup L"WorldOptionsGroup" +#define IDC_WorldOptionsTab L"WorldOptionsTab" +#define IDC_GameOptionsTab L"GameOptionsTab" +#define IDC_LabelGameOptions L"LabelGameOptions" +#define IDC_LabelWorldOptions L"LabelWorldOptions" #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 index 339ae0a4..25ee4a1d 100644 --- a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.xui +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.xui @@ -6,80 +6,144 @@ MultiGameLaunchMoreOptions -450.000000 -486.000000 -415.000031,55.000000,0.000000 +1280.000000 +720.000000 CScene_MultiGameLaunchMoreOptions -XuiScene -HostOptions\CheckboxOnline +XuiBlankScene +WorldOptionsGroup\WorldOptions\XuiEditSeed + + + +OptionsTab_off +244.000000 +58.000000 +534.000000,108.000008,0.000000 +1 +Graphics\PanelsAndTabs\MoreOptionsTabOff.png +48 + + + + +GameOptionsGroup +700.000000 +430.000000 +290.000061,146.000015,0.000000 +false +true + + +GameOptionsDescription +260.000000 +418.000000 +486.000000,14.000000,0.000000 +10 +TipPanel + + -HostOptions -450.000000 -306.000000 -0.000000,10.000000,0.000000 +GameOptions +488.000000 +440.000000 +0.000013,0.000000,0.000000 +10 +XuiScene + + + +CheckboxNaturalRegeneration +402.000000 +34.000000 +24.000015,393.000000,0.000000 2 -XuiBlankScene +XuiCheckbox +CheckboxTileDrops + -CheckboxResetNether +CheckboxTileDrops 402.000000 34.000000 -23.000000,272.000000,0.000000 +24.000015,359.000000,0.000000 2 XuiCheckbox -CheckboxHostPrivileges -..\GenerationOptions\CheckboxStructures +CheckboxMobLoot +CheckboxNaturalRegeneration -CheckboxHostPrivileges +CheckboxMobLoot 402.000000 34.000000 -23.000000,238.000000,0.000000 +24.000015,325.000000,0.000000 2 XuiCheckbox -CheckboxTNT -CheckboxResetNether +CheckboxMobGriefing +CheckboxTileDrops -CheckboxTNT +CheckboxMobGriefing 402.000000 34.000000 -23.000000,204.000000,0.000000 +24.000015,291.000000,0.000000 2 XuiCheckbox -CheckboxFireSpreads -CheckboxHostPrivileges +CheckboxMobSpawning +CheckboxMobLoot -CheckboxFireSpreads +CheckboxMobSpawning 402.000000 34.000000 -23.000000,170.000000,0.000000 +24.000015,257.000000,0.000000 2 XuiCheckbox -CheckboxTrustSystem -CheckboxTNT +CheckboxKeepInventory +CheckboxMobGriefing -CheckboxTrustSystem +CheckboxKeepInventory 402.000000 34.000000 -23.000000,136.000000,0.000000 +24.000015,223.000015,0.000000 +2 +XuiCheckbox +CheckboxDayLightCycle +CheckboxMobSpawning + + + + +CheckboxDayLightCycle +402.000000 +34.000000 +24.000015,189.000015,0.000000 +2 +XuiCheckbox +CheckboxHostPrivileges +CheckboxKeepInventory + + + + +CheckboxHostPrivileges +402.000000 +34.000000 +24.000015,154.166672,0.000000 2 XuiCheckbox CheckboxPVP -CheckboxFireSpreads +CheckboxDayLightCycle @@ -87,11 +151,11 @@ CheckboxPVP 402.000000 34.000000 -23.000000,101.999992,0.000000 +24.000015,121.000008,0.000000 2 XuiCheckbox CheckboxAllowFoF -CheckboxTrustSystem +CheckboxHostPrivileges @@ -99,7 +163,7 @@ CheckboxAllowFoF 402.000000 34.000000 -23.000000,68.000000,0.000000 +24.000015,87.000015,0.000000 XuiCheckbox CheckboxInviteOnly CheckboxPVP @@ -110,7 +174,7 @@ CheckboxInviteOnly 402.000000 34.000000 -23.000000,34.000000,0.000000 +24.000015,53.000015,0.000000 XuiCheckbox CheckboxOnline CheckboxAllowFoF @@ -121,29 +185,92 @@ CheckboxOnline 402.000000 34.000000 -23.000000,0.000000,0.000000 +24.000015,19.000015,0.000000 XuiCheckbox CheckboxInviteOnly + + + +WorldOptionsGroup +700.000000 +369.000000 +290.000031,146.000000,0.000000 +true + + + +WorldOptionsDescription +260.000000 +352.000000 +486.000031,14.000000,0.000000 +10 +TipPanel + + -GenerationOptions -450.000000 -138.000000 -0.000000,334.000000,0.000000 -XuiBlankScene +WorldOptions +488.000000 +370.000000 +0.000029,0.000008,0.000000 +10 +XuiScene + + + +CheckboxFireSpreads +402.000000 +34.000000 +24.000015,318.000000,0.000000 +XuiCheckbox +CheckboxTNT + + + + +CheckboxTNT +402.000000 +34.000000 +24.000015,284.000000,0.000000 +XuiCheckbox +CheckboxTrustSystem +CheckboxFireSpreads + + + +CheckboxTrustSystem +402.000000 +34.000000 +24.000015,250.000000,0.000000 +XuiCheckbox +CheckboxResetNether +CheckboxTNT + + + + +CheckboxResetNether +402.000000 +34.000000 +24.000015,216.000000,0.000000 +XuiCheckbox +CheckboxBonusChest +CheckboxTrustSystem + + CheckboxBonusChest 402.000000 34.000000 -33.000000,98.000000,0.000000 +24.000015,182.000000,0.000000 XuiCheckbox -false CheckboxFlatWorld +CheckboxResetNether @@ -151,9 +278,8 @@ CheckboxFlatWorld 402.000000 34.000000 -33.000000,63.999992,0.000000 +24.000015,148.000000,0.000000 XuiCheckbox -false CheckboxStructures CheckboxBonusChest @@ -163,120 +289,198 @@ CheckboxStructures 402.000000 34.000000 -33.000000,29.999992,0.000000 +24.000015,114.000000,0.000000 XuiCheckbox -false -..\HostOptions\CheckboxResetNether +XuiEditSeed CheckboxFlatWorld -WorldOptions +XuiLabelRandomSeed 402.000000 -26.000000 -23.000000,0.000000,0.000000 -XuiLabelDark +31.000000 +24.000000,82.000000,0.000000 +XuiLabelDarkLeftWrap - + -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, +XuiEditSeed +402.000000 +32.000000 +24.000000,44.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +CheckboxStructures - - + + +XuiLabelSeed 402.000000 -2.000000 -0.000029,0.000015,0.000000 - - -0xff000000 +26.000000 +24.000000,16.000000,0.000000 +XuiLabelDark - - + + + + -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, +WorldOptionsTab +244.000000 +58.000000 +290.000000,103.000008,0.000000 +1 +Graphics\PanelsAndTabs\WorldOptionsTabOn.png +48 - - + + -402.000000 -2.000000 -0.000029,110.000015,0.000000 - - -0xff000000 +GameOptionsTab +244.000000 +58.000000 +534.000000,103.000008,0.000000 +false +1 +Graphics\PanelsAndTabs\GameOptionsTabOn.png +48 - - + + -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, +LabelGameOptions +224.000000 +24.000000 +544.000000,122.000000,0.000000 +XuiLabelDarkCentred +Game Options - - - + -Description -450.000000 -140.000000 -0.000015,496.000000,0.000000 -8 -TipPanel +LabelWorldOptions +224.000000 +24.000000 +300.000000,116.000000,0.000000 +XuiLabelDarkCentred +World Options + + + + +WorldOptions + +stop + + +GameOptions + +stop + + + +GameOptionsGroup +Show + + +0 +false + + + +0 +true + + + +WorldOptionsGroup +Show + + +0 +true + + + +0 +false + + + +OptionsTab_off +Position + + +0 +534.000000,108.000008,0.000000 + + + +0 +290.000000,108.000008,0.000000 + + + +WorldOptionsTab +Show + + +0 +true + + + +0 +false + + + +GameOptionsTab +Show + + +0 +false + + + +0 +true + + + +LabelGameOptions +Position + + +0 +544.000000,122.000000,0.000000 + + + +0 +544.000000,116.000000,0.000000 + + + +LabelWorldOptions +Position + + +0 +300.000000,116.000000,0.000000 + + + +0 +300.000000,122.000000,0.000000 + + + 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 index b2de27dd..9a34c335 100644 --- a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.h +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.h @@ -1,18 +1,34 @@ -#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_OptionsTab_off L"OptionsTab_off" +#define IDC_GameOptionsDescription L"GameOptionsDescription" +#define IDC_CheckboxNaturalRegeneration L"CheckboxNaturalRegeneration" +#define IDC_CheckboxTileDrops L"CheckboxTileDrops" +#define IDC_CheckboxMobLoot L"CheckboxMobLoot" +#define IDC_CheckboxMobGriefing L"CheckboxMobGriefing" +#define IDC_CheckboxMobSpawning L"CheckboxMobSpawning" +#define IDC_CheckboxKeepInventory L"CheckboxKeepInventory" +#define IDC_CheckboxDayLightCycle L"CheckboxDayLightCycle" #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_GameOptions L"GameOptions" +#define IDC_GameOptionsGroup L"GameOptionsGroup" +#define IDC_WorldOptionsDescription L"WorldOptionsDescription" +#define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" +#define IDC_CheckboxTNT L"CheckboxTNT" +#define IDC_CheckboxTrustSystem L"CheckboxTrustSystem" +#define IDC_CheckboxResetNether L"CheckboxResetNether" +#define IDC_CheckboxBonusChest L"CheckboxBonusChest" +#define IDC_CheckboxFlatWorld L"CheckboxFlatWorld" +#define IDC_CheckboxStructures L"CheckboxStructures" +#define IDC_XuiLabelRandomSeed L"XuiLabelRandomSeed" +#define IDC_XuiEditSeed L"XuiEditSeed" +#define IDC_XuiLabelSeed L"XuiLabelSeed" +#define IDC_WorldOptions L"WorldOptions" +#define IDC_WorldOptionsGroup L"WorldOptionsGroup" +#define IDC_WorldOptionsTab L"WorldOptionsTab" +#define IDC_GameOptionsTab L"GameOptionsTab" +#define IDC_LabelGameOptions L"LabelGameOptions" +#define IDC_LabelWorldOptions L"LabelWorldOptions" #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 index 976f9260..20fec429 100644 --- a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.xui +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.xui @@ -6,204 +6,228 @@ MultiGameLaunchMoreOptions -340.000000 -356.000000 -150.000031,8.500015,0.000000 +640.000000 +480.000000 CScene_MultiGameLaunchMoreOptions -XuiScene -HostOptions\CheckboxOnline +XuiBlankScene +WorldOptionsGroup\WorldOptions\XuiEditSeed + + +OptionsTab_off +175.000000 +40.000000 +235.000000,44.000000,0.000000 +1 +Graphics\PanelsAndTabs\MoreOptionsTabOff_Small.png +48 + + + + +GameOptionsGroup +510.000000 +328.000000 +60.000000,76.000015,0.000000 +false +true + + + +GameOptionsDescription +182.000000 +312.000000 +347.000000,10.000000,0.000000 +10 +TipPanel + + -GenerationOptions -340.000000 -104.000000 -0.000000,244.000000,0.000000 -XuiBlankScene +GameOptions +350.000000 +328.000000 +0.000015,0.000002,0.000000 +GraphicPanel -CheckboxBonusChest +CheckboxNaturalRegeneration 304.000000 26.000000 -19.000000,77.000000,0.000000 +16.000000,299.000000,0.000000 XuiCheckboxSmall -false -CheckboxFlatWorld +CheckboxTileDrops -CheckboxFlatWorld +CheckboxTileDrops 304.000000 26.000000 -19.000000,50.999992,0.000000 +16.000000,273.000000,0.000000 XuiCheckboxSmall -false -CheckboxStructures -CheckboxBonusChest +CheckboxMobLoot +CheckboxNaturalRegeneration -CheckboxStructures +CheckboxMobLoot 304.000000 26.000000 -19.000000,24.999992,0.000000 +16.000000,247.000000,0.000000 XuiCheckboxSmall -false -..\HostOptions\CheckboxResetNether -CheckboxFlatWorld +CheckboxMobGriefing +CheckboxTileDrops - + -WorldOptions +CheckboxMobGriefing 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 +26.000000 +16.000000,221.000000,0.000000 +XuiCheckboxSmall +CheckboxMobSpawning +CheckboxMobLoot - - + + -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, +CheckboxMobSpawning +304.000000 +26.000000 +16.000000,195.000000,0.000000 +XuiCheckboxSmall +CheckboxKeepInventory +CheckboxMobGriefing - - + + +CheckboxKeepInventory 304.000000 -2.000000 -0.000029,0.000015,0.000000 - - -0xff000000 +26.000000 +16.000000,169.000000,0.000000 +XuiCheckboxSmall +CheckboxDayLightCycle +CheckboxMobSpawning - - + + -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, +CheckboxDayLightCycle +304.000000 +26.000000 +16.000000,143.000000,0.000000 +XuiCheckboxSmall +CheckboxHostPrivileges +CheckboxKeepInventory - - + + +CheckboxHostPrivileges 304.000000 -2.000000 -0.000029,80.000015,0.000000 - - -0xff000000 +26.000000 +16.000000,116.999992,0.000000 +XuiCheckboxSmall +CheckboxPVP +CheckboxDayLightCycle - - + + -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, +CheckboxPVP +304.000000 +26.000000 +16.000000,90.999992,0.000000 +XuiCheckboxSmall +CheckboxAllowFoF +CheckboxHostPrivileges - - - - + + -HostOptions -340.000000 -233.000000 -0.000000,11.000000,0.000000 -XuiBlankScene +CheckboxAllowFoF +304.000000 +25.000000 +16.000000,66.000000,0.000000 +XuiCheckboxSmall +CheckboxInviteOnly +CheckboxPVP + -CheckboxResetNether +CheckboxInviteOnly 304.000000 26.000000 -16.000000,207.000000,0.000000 +16.000000,39.999992,0.000000 XuiCheckboxSmall -CheckboxHostPrivileges -..\GenerationOptions\CheckboxStructures +CheckboxOnline +CheckboxAllowFoF -CheckboxHostPrivileges +CheckboxOnline 304.000000 26.000000 -16.000000,181.000000,0.000000 +16.000000,13.999992,0.000000 XuiCheckboxSmall -CheckboxTNT -CheckboxResetNether +CheckboxInviteOnly + + + + +WorldOptionsGroup +510.000000 +305.000000 +60.000000,76.000000,0.000000 +true + + + +WorldOptionsDescription +182.000000 +298.000000 +347.000000,10.000000,0.000000 +10 +TipPanel + + + + +WorldOptions +350.000000 +315.000000 +0.000015,0.000000,0.000000 +10 +GraphicPanel + -CheckboxTNT +CheckboxFireSpreads 304.000000 26.000000 -16.000000,155.000000,0.000000 +19.000000,253.000000,0.000000 XuiCheckboxSmall -CheckboxFireSpreads -CheckboxHostPrivileges +CheckboxTNT -CheckboxFireSpreads +CheckboxTNT 304.000000 26.000000 -16.000000,129.000000,0.000000 +19.000000,227.000000,0.000000 XuiCheckboxSmall CheckboxTrustSystem -CheckboxTNT +CheckboxFireSpreads @@ -211,68 +235,247 @@ CheckboxTrustSystem 304.000000 26.000000 -16.000000,102.999992,0.000000 +19.000000,201.000000,0.000000 XuiCheckboxSmall -CheckboxPVP -CheckboxFireSpreads +CheckboxResetNether +CheckboxTNT -CheckboxPVP +CheckboxResetNether 304.000000 26.000000 -16.000000,76.999992,0.000000 +19.000000,175.000000,0.000000 XuiCheckboxSmall -CheckboxAllowFoF +CheckboxBonusChest CheckboxTrustSystem -CheckboxAllowFoF +CheckboxBonusChest 304.000000 -25.000000 -16.000000,52.000000,0.000000 +26.000000 +19.000000,149.000000,0.000000 XuiCheckboxSmall -CheckboxInviteOnly -CheckboxPVP +CheckboxFlatWorld +CheckboxResetNether -CheckboxInviteOnly +CheckboxFlatWorld 304.000000 26.000000 -16.000000,25.999992,0.000000 +19.000000,123.000000,0.000000 XuiCheckboxSmall -CheckboxOnline -CheckboxAllowFoF +CheckboxStructures +CheckboxBonusChest -CheckboxOnline +CheckboxStructures 304.000000 26.000000 -16.000000,-0.000008,0.000000 +19.000000,97.000000,0.000000 XuiCheckboxSmall -CheckboxInviteOnly +XuiEditSeed +CheckboxFlatWorld + + +XuiLabelRandomSeed +304.000000 +21.924896 +18.000000,70.000000,0.000000 +XuiLabelDarkLeftWrapSmall8 + + + + +XuiEditSeed +310.000000 +20.000000,36.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +CheckboxStructures + + + + +XuiLabelSeed +303.444427 +28.000000 +18.000000,18.000000,0.000000 +XuiLabelDarkLeftWrapSmall10 + + + + + +WorldOptionsTab +175.000000 +40.000000 +60.000000,44.000000,0.000000 +1 +Graphics\PanelsAndTabs\WorldOptionsTabOn_Small.png +48 + + + + +GameOptionsTab +175.000000 +40.000000 +235.000000,44.000000,0.000000 +false +1 +Graphics\PanelsAndTabs\GameOptionsTabOn_Small.png +48 + + -Description -500.000000 -64.000000 --80.000000,358.000000,0.000000 -8 -TipPanel -6666666666666666666666 -666666666666666666666666 -6666666666666666666666666 +LabelGameOptions +160.000000 +24.000000 +242.000000,52.000000,0.000000 +XuiLabelDarkCentredSmall +Game Options + + + + +LabelWorldOptions +160.000000 +24.000000 +68.000000,48.000000,0.000000 +XuiLabelDarkCentredSmall +World Options + + + + +WorldOptions + +stop + + +GameOptions + +stop + + + +GameOptionsGroup +Show +Position + + +0 +false +60.000000,76.000015,0.000000 + + + +0 +true +60.000000,76.000023,0.000000 + + + +WorldOptionsGroup +Show +Height + + +0 +true +305.000000 + + + +0 +false +282.000000 + + + +LabelWorldOptions +Position + + +0 +68.000000,48.000000,0.000000 + + + +0 +68.000000,52.000000,0.000000 + + + +LabelGameOptions +Position + + +0 +242.000000,52.000000,0.000000 + + + +0 +242.000000,48.000000,0.000000 + + + +GameOptionsTab +Show + + +0 +false + + + +0 +true + + + +OptionsTab_off +Position + + +0 +235.000000,44.000000,0.000000 + + + +0 +60.000000,44.000000,0.000000 + + + +WorldOptionsTab +Show + + +0 +true + + + +0 +false + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trading_480.h b/Minecraft.Client/Common/Media/xuiscene_trading_480.h new file mode 100644 index 00000000..5898253b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading_480.h @@ -0,0 +1,463 @@ +#define IDC_TradingWindow L"TradingWindow" +#define IDC_TradingWindow1 L"TradingWindow1" +#define IDC_RequiredLabel L"RequiredLabel" +#define IDC_VillagerText L"VillagerText" +#define IDC_Offer2Label L"Offer2Label" +#define IDC_Offer1Label L"Offer1Label" +#define IDC_ScrollLeftArrow L"ScrollLeftArrow" +#define IDC_ScrollRightArrow L"ScrollRightArrow" +#define IDC_Request1 L"Request1" +#define IDC_Request2 L"Request2" +#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_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_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_small.h b/Minecraft.Client/Common/Media/xuiscene_trading_small.h new file mode 100644 index 00000000..f2bb799f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading_small.h @@ -0,0 +1,445 @@ +#define IDC_TradingWindow L"TradingWindow" +#define IDC_TradingWindow1 L"TradingWindow1" +#define IDC_RequiredLabel L"RequiredLabel" +#define IDC_VillagerText L"VillagerText" +#define IDC_Offer2Label L"Offer2Label" +#define IDC_Offer1Label L"Offer1Label" +#define IDC_ScrollLeftArrow L"ScrollLeftArrow" +#define IDC_ScrollRightArrow L"ScrollRightArrow" +#define IDC_Request1 L"Request1" +#define IDC_Request2 L"Request2" +#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_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_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/zh-CHT/4J_strings.resx b/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx index 90cddc7f..341189b0 100644 --- a/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx +++ b/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx @@ -17,7 +17,7 @@ 沒有可用空間 -已選取儲存裝置沒有足夠的可用空間來建立遊戲存檔。 +您所選取的儲存裝置沒有足夠的可用空間來建立遊戲存檔。 再選取一次 @@ -27,7 +27,7 @@ 要覆寫存檔嗎? -已選取儲存裝置已經有這個存檔,確定要覆寫該存檔嗎? +您所選取的儲存裝置已經有這個存檔,確定要覆寫該存檔嗎? 否:不要覆寫 diff --git a/Minecraft.Client/Common/Media/zh-CHT/strings.resx b/Minecraft.Client/Common/Media/zh-CHT/strings.resx index 7c9861f8..4efef5a7 100644 --- a/Minecraft.Client/Common/Media/zh-CHT/strings.resx +++ b/Minecraft.Client/Common/Media/zh-CHT/strings.resx @@ -287,20 +287,41 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 當載入或建立世界時,您可以按下 [更多選項] 按鈕,來選擇更多遊戲的相關設定。{*B*}{*B*} {*T2*}玩家 vs 玩家{*ETW*}{*B*} - 啟用此選項時,玩家對其他玩家可以造成傷害。此選項只在生存模式下可使用。{*B*}{*B*} + 啟用此選項時,玩家可以對其他玩家造成傷害。此選項只在生存模式下可使用。{*B*}{*B*} {*T2*}信任玩家{*ETW*}{*B*} - 停用此選項時,會限制加入遊戲的玩家只能從事限定的活動。他們無法進行開採或使用項目、放置方塊、使用門與開關、使用容器、攻擊玩家,或攻擊動物。您可以使用遊戲選單為特定玩家變更上述的選項。{*B*}{*B*} + 停用此選項會限制加入遊戲的玩家可以進行的活動。他們無法進行開採或使用項目、放置方塊、使用門與開關、使用容器、攻擊玩家或動物。您可以使用遊戲選單為特定玩家變更上述的選項。{*B*}{*B*} {*T2*}火會蔓延{*ETW*}{*B*} - 啟用此選項時,火會蔓延到附近易燃的方塊。可以從遊戲中變更此選項。{*B*}{*B*} + 啟用此選項時,火會蔓延到附近易燃的方塊。您也可以從遊戲中變更此選項。{*B*}{*B*} {*T2*}炸藥會爆炸{*ETW*}{*B*} - 啟用此選項時,引爆炸藥時會爆炸。可以從遊戲中變更此選項。{*B*}{*B*} + 啟用此選項時,引爆炸藥後就會發生爆炸。您也可以從遊戲中變更此選項。{*B*}{*B*} {*T2*}主持人特權{*ETW*}{*B*} 啟用此選項時,主持人可以在遊戲中切換自己的飛翔能力、停用疲勞功能,或是讓自己隱形。{*DISABLES_ACHIEVEMENTS*}{*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*} + 停用此選項時,怪獸與動物無法撒下劫掠物 (例如:Creeper 無法撒下火藥) 。{*B*}{*B*} + + {*T2*}磚瓦拋落{*ETW*}{*B*} + 停用此選項時,方塊無法被摧毀時拋落項目 (例如:石頭方塊無法拋落鵝卵石) 。{*B*}{*B*} + + {*T2*}自然再生{*ETW*}{*B*} + 停用此選項時,玩家無法自然回復健康。{*B*}{*B*} + {*T1*}產生新世界選項{*ETW*}{*B*} 建立新世界時,有些額外的選項可使用。{*B*}{*B*} @@ -311,56 +332,59 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 啟用此選項時,會在地上世界與地獄世界中產生完全平坦的世界。{*B*}{*B*} {*T2*}贈品箱{*ETW*}{*B*} - 啟用此選項時,會在玩家再生點附近創造內含一些有用項目的贈品箱。{*B*}{*B*} + 啟用此選項時,玩家再生點附近會出現一個放了有用物品的箱子。{*B*}{*B*} {*T2*}重設地獄{*ETW*}{*B*} 啟用此選項時,會再度產生地獄。如果您的舊存檔中沒有地獄要塞,這將會很有用。{*B*}{*B*} - {*T1*}遊戲中選項{*ETW*}{*B*} - 玩遊戲時,按下 BACK 鍵可以叫出遊戲中功能表,存取某些選項。{*B*}{*B*} + {*T1*}遊戲中選項{*ETW*}{*B*} + 玩遊戲時,按下 {*BACK_BUTTON*} 鍵可以叫出遊戲中功能表,存取某些選項。{*B*}{*B*} {*T2*}主持人選項{*ETW*}{*B*} - 玩家主持人或設定為管理員的玩家,可以存取 [主持人選項] 功能表。這些人可以啟用或取消「火會蔓延」及「炸藥會爆炸」的選項。{*B*}{*B*} + 玩家主持人及設定為管理員的玩家,可以存取 [主持人選項] 功能表。這些人可以啟用或取消「火會蔓延」及「炸藥會爆炸」的選項。{*B*}{*B*} {*T1*}玩家選項{*ETW*}{*B*} 若要修改玩家的特權,可以選取玩家的名字並按下 {*CONTROLLER_VK_A*},這會叫出玩家特權功能表,您可以使用列出的選項。{*B*}{*B*} {*T2*}可以建造和開採{*ETW*}{*B*} - 只有在關閉信任玩家時才可以使用此選項。啟用此選項時,玩家可以像是在正常狀況下一樣與世界互動。取消使用此選項時,玩家將無法放置或摧毀方塊,並無法與許多項目及方塊互動。{*B*}{*B*} + 只有在「信任玩家」選項已關閉時才可以使用此選項。啟用此選項時,玩家可以在正常狀況下與世界互動。停止使用此選項後,玩家將無法放置或摧毀方塊,並無法與項目及方塊互動。{*B*}{*B*} {*T2*}可以使用門與開關{*ETW*}{*B*} - 只有在關閉信任玩家時才可以使用此選項。停用此選項時,玩家將無法使用門與開關。{*B*}{*B*} + 只有在「信任玩家」選項已關閉時才可以使用此選項。停用此選項時,玩家將無法使用門與開關。{*B*}{*B*} {*T2*}可以打開容器{*ETW*}{*B*} - 只有在關閉信任玩家時才可以使用此選項。停用此選項時,玩家將無法打開箱子等容器。{*B*}{*B*} + 只有在「信任玩家」選項已關閉時才可以使用此選項。停用此選項時,玩家將無法打開箱子等容器。{*B*}{*B*} - {*T2*}可以攻擊玩家{*ETW*}{*B*} - 只有在關閉信任玩家時才可以使用此選項。取消使用此選項時,玩家將無法對其他玩家造成傷害。{*B*}{*B*} + {*T2*}可以攻擊玩家{*ETW*}{*B*} + 只有在「信任玩家」選項已關閉時才可以使用此選項。停用此選項時,玩家將無法傷害其他玩家。{*B*}{*B*} {*T2*}可以攻擊動物{*ETW*}{*B*} - 只有在關閉信任玩家時才可以使用此選項。停用此選項時,玩家將無法對動物造成傷害。{*B*}{*B*} + 只有在「信任玩家」選項已關閉時才可以使用此選項。停用此選項時,玩家將無法傷害動物。{*B*}{*B*} {*T2*}管理員{*ETW*}{*B*} - 啟用此選項時,玩家可以修改主持人以外其他玩家的特權 (在「信任玩家」關閉的狀態下)、踢出玩家,並啟用或停用「火會蔓延」及「炸藥會爆炸」功能。{*B*}{*B*} + 啟用此選項時,玩家可以修改主持人以外其他玩家的特權 (在「信任玩家」選項關閉的狀態下)、踢出玩家,並啟用或停用「火會蔓延」及「炸藥會爆炸」功能。{*B*}{*B*} {*T2*}踢出玩家{*ETW*}{*B*} - 對使用與主持人玩家不同 {*PLATFORM_NAME*} 主機的玩家選取此選項,會將該玩家或使用其他 {*PLATFORM_NAME*} 主機的玩家踢出遊戲。除非重新啟動,否則被踢出的玩家無法再加入遊戲。{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}主機的玩家選取此選項,會將該玩家或使用其他 {*PLATFORM_NAME*} 主機的玩家踢出遊戲。除非重新啟動,否則被踢出的玩家無法再加入遊戲。{*B*}{*B*} {*T1*}主持人玩家選項{*ETW*}{*B*} -如果已經啟用主持人特權,則主持人玩家可以修改自己的某些特權。若要修改玩家的特權,可以選取玩家的名字並按下 {*CONTROLLER_VK_A*},這會叫出玩家特權功能表,您可以使用列出的選項。{*B*}{*B*} +如果主持人特權已經啟用,主持人玩家可以修改自己的某些特權。若要修改玩家的特權,可以選取玩家的名字並按下 {*CONTROLLER_VK_A*},這會叫出玩家特權功能表,您可以使用下列選項。{*B*}{*B*} {*T2*}可以飛翔{*ETW*}{*B*} - 啟用此選項時,玩家可以擁有飛翔的能力。只能在生存模式中選擇是否使用此選項。在創造模式中,所有的玩家都有飛翔的能力。{*B*}{*B*} + 啟用此選項時,玩家可以擁有飛翔的能力。您只能在生存模式中選擇是否使用此選項,因為在創造模式中,所有的玩家都有飛翔的能力。{*B*}{*B*} {*T2*}停用疲勞{*ETW*}{*B*} - 只能在生存模式中選擇是否使用此選項。啟用時,消耗體力的活動 (行走/奔跑/跳躍等等) 不會讓食物列減少。然而,如果玩家受傷,在玩家回復生命值期間,食物列會緩慢減少。{*B*}{*B*} + 只能在生存模式中選擇是否使用此選項。啟用時,消耗體力的活動 (行走/奔跑/跳躍等等) 不會讓食物列減少。然而,如果玩家受傷,在玩家回復生命值期間,食物列會慢慢減少。{*B*}{*B*} {*T2*}隱形{*ETW*}{*B*} - 啟用此選項時,其他玩家將無法看見玩家,且玩家會變成刀槍不入。{*B*}{*B*} - {*T2*}可以傳送{*ETW*}{*B*} - 這可以讓玩家傳送其他玩家或者他自己到其他玩家身邊。 + 啟用此選項時,其他玩家將無法看見玩家,而且玩家會變成刀槍不入。{*B*}{*B*} + + {*T2*}可以傳送{*ETW*}{*B*} + 這可以讓玩家在世界中傳送其他玩家或者他自己到其他玩家身邊。 +不是同一個玩家{*PLATFORM_NAME*}主控台為主機播放程式中,選取此選項將踢出玩家的遊戲和其他玩家在其{*PLATFORM_NAME*}主控台。這位玩家不能再加入遊戲,直到重新啟動。 + 下一頁 上一頁 @@ -379,7 +403,7 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 發射器 -豢養動物 +飼養動物 繁殖動物 @@ -425,61 +449,93 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 最新資訊 {*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*} - +- 新增物品:硬化黏土、染色黏土、煤炭方塊、乾草捆、啟動鐵軌、紅石方塊、陽光感測器、投擲器、漏斗、漏斗礦車、火藥礦車、紅石比較器、測重壓力板、燈塔、陷阱儲物箱、煙火火箭、煙火星、幽冥星、繩索、馬鎧、名牌、馬重生蛋。{*B*} +- 新增生物:凋零怪、凋零骷髏、女巫、蝙蝠、馬、驢和騾。{*B*} +- 新增地形生成功能:女巫屋。{*B*} +- 新增燈塔介面。{*B*} +- 新增馬介面。{*B*} +- 新增漏斗介面。{*B*} +- 新增煙火:您擁有製作煙火星或煙火火箭的材料時,可以從工作台進入煙火介面。{*B*} +- 新增「冒險模式」:您只能用正確的工具打破方塊。{*B*} +- 新增許多聲音。{*B*} +- 生物、物品和投射物現在能通過入口。{*B*} +- 現在只要用另一個中繼器為中繼器供電,就可以把它鎖起來。{*B*} +- 殭屍和骷髏現在可以用不同的武器和護甲重生。{*B*} +- 新死亡訊息。{*B*} +- 用命名牌為生物命名,以及在功能表開啟時為容器重新命名來變更標題。{*B*} +- 骨粉不再讓每樣東西立即完全長大,而是會隨機讓每樣東西於不同的階段生長。{*B*} +- 直接朝儲物箱、釀造台、發射器和唱片機放置紅石比較器,即可偵測到說明這些東西裡面內容物的紅石訊號。{*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*} +我們為您和您的好友新增了許多功能,我們在此為您重點列舉幾項,趕快瞭解並開始遊戲吧!{*B*}{*B*} +{*T1*}新物品{*ETB*}:硬化黏土、染色黏土、煤炭方塊、乾草捆、啟動鐵軌、紅石方塊、陽光感測器、投擲器、漏斗、漏斗礦車、火藥礦車、紅石比較器、測重壓力板、燈塔、陷阱儲物箱、煙火火箭、煙火星、幽冥星、繩索、馬鎧、名牌、馬重生蛋。{*B*}{*B*} +{*T1*}新生物{*ETB*}:凋零怪、凋零骷髏、女巫、蝙蝠、馬、驢和騾。{*B*}{*B*} +{*T1*}新功能{*ETB*}:馴服馬後騎上馬背、製作煙火及惡搞一番、用名牌為動物和怪物命名、建立更進階的紅石電路,還有主持人選項協助控制世界訪客的能耐!{*B*}{*B*} +{*T1*}新的教學世界{*ETB*}:在教學世界中學習新舊功能的使用方式。看您是否有能耐把藏在世界中的所有神祕唱片都找出來!{*B*}{*B*} + + +{*T3*}遊戲方式:馬{*ETW*}{*B*}{*B*} +馬和驢主要居住在開闊的平原。騾是驢和馬的後代,但本身不具生殖能力。{*B*} +所有成年的馬、驢和騾都可供人騎乘,但是只有馬能夠穿上護甲,只有騾和驢可以裝上鞍囊去運輸物品。{*B*}{*B*} +馬、驢和騾必須先馴服才可以使用。馴服馬的方式是騎上去,然後騎士必須想辦法不被馬摔下馬背。{*B*} +當愛心出現在馬的周圍時,牠已經被馴服,再也不會把玩家摔下馬背。玩家必須幫馬裝上馬鞍,才能操縱一匹馬。{*B*}{*B*} +您可以向村民購買,或是從藏在世界中的儲物箱尋找馬鞍。{*B*} +若要為已馴服的驢和騾加鞍囊,玩家要把儲物箱裝在牠們身上。之後騎乘或蹲伏時玩家就能使用這些鞍囊.{*B*}{*B*} +使用金蘋果或金蘿蔔餵食馬和驢即可繁殖牠們,就像繁殖其他動物一樣,但是騾就不行。{*B*} +小馬經過一段時間就會長成成年馬,不過給牠們餵食小麥或乾草就會加速生長。{*B*} + + +燈塔 + +{*T3*}遊戲方式:燈塔{*ETW*}{*B*}{*B*} +啟動的燈塔會向天空投射明亮的光束,賦予附近的玩家力量。{*B*} +製作燈塔的材料包括玻璃、黑曜石和幽冥星,擊敗凋零怪即可獲得。{*B*}{*B*} +燈塔必須放置,白天才能沐浴在陽光之下。燈塔必須放置於鐵、黃金、翡翠或鑽石金字塔上。{*B*} +用來放置燈塔的材料不會影響燈塔的力量。{*B*}{*B*} +您可以在燈塔選單中,為燈塔選取一種主要的力量。金字塔越多層,可供選擇的力量越多。{*B*} +至少有四層的金字塔上的燈塔,還能夠讓您選擇再生次要力量或是更強大的主要力量。{*B*}{*B*} +您必須在付費空格奉上翡翠、鑽石、黃金或鐵塊,才能設定燈塔的力量。{*B*} +設定後,燈塔就會無限期發出力量。{*B*} + + +煙火 + +{*T3*}遊戲方式︰煙火{*ETW*}{*B*}{*B*} +煙火屬於裝飾品,可以手動或利用發射器發射,製作的材料包括紙、火藥,也有人會選擇加入幾顆煙火星。{*B*} +煙火星的顏色、淡化、形狀、大小與效果 (例如尾巴和閃爍) 可自訂,方法是在製作時加入額外材料。{*B*}{*B*} +若要製作煙火,請將火藥和紙放在庫存上方的 3x3 工作台。{*B*} +您可以選擇在工作台放置多顆煙火星,加入煙火。{*B*} +用火藥在工作台填滿的空格越多,所有煙火星會爆炸的高度越高。{*B*}{*B*} +然後您便可從輸出空格取出製作的煙火。{*B*}{*B*} +將火藥和染料放進工作台,即可製作煙火星。{*B*} + - 染料會決定煙火星爆炸的顏色。{*B*} + - 煙火星的形狀則是取決於加入火焰彈、金塊、羽毛或生物的頭。{*B*} + - 使用鑽石或螢光粉即可新增尾巴或閃爍。{*B*}{*B*} +煙火星製作完成後,以染料製作即可決定煙火星的淡出顏色。 + + +漏斗 + +{*T3*}遊戲方式:漏斗{*ETW*}{*B*}{*B*} +您可以使用漏斗將物品插入容器或是從容器移除物品,以及自動拾取丟入容器的物品。{*B*} +漏斗能夠影響釀造台、儲物箱、發射器、投擲器、運輸礦車、漏斗礦車及其他漏斗。{*B*}{*B*} +漏斗會一直嘗試從放在上方的合適容器吸取物品,還會嘗試將儲存的物品插入輸出容器。{*B*} +如果漏斗是用紅石發電就會停用,並且停止吸取和插入物品。{*B*}{*B*} +漏斗會指向嘗試輸出物品的方向。若要讓漏斗指向特定方塊,淺行時將漏斗放在背對該方塊的位置即可。{*B*} + + +投擲器 + +{*T3*}遊戲方式︰投擲器{*ETW*}{*B*}{*B*} +投擲器由紅石供電時,會隨機掉落一件物品至地面。使用 {*CONTROLLER_ACTION_USE*} 即可開啟投擲器,然後即可將庫存中的物品裝進投擲器。{*B*} +如果投擲器朝向儲物箱或另一種容器,物品則會放進那裡面。您可以打造投擲器的長鏈子運輸物品,但是必須交替開啟關閉電源才能發揮功能。 + + 能造成比用手劈砍更大的傷害。 用來挖泥土、青草、沙子、礫石及白雪時的速度,會比用手挖還要快。您需要用鏟子才能挖雪球。 @@ -605,10 +661,36 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 用手握住時,會顯示某個地區中已探索區域的影像。可讓您用來尋找能前往某個地點的路。 +使用後會成為您身處世界的地圖,而且會隨著您的探索腳步填滿。 + 可射出箭來遠距攻擊。 可與弓組成武器。 +凋零怪所扔下,用於製作燈塔。 + +啟動時,建立彩色爆炸。顏色、效果、形狀和淡出取決於建立煙火時使用的煙火星。 + +用來決定煙火的顏色、效果和形狀。 + +用於紅石電路,以維持、比較或除去信號強度,或是測量若干方塊的狀態。 + +屬於一種貨物礦車類型,功能是移動的 TNT 方塊。 + +是根據陽光 (或缺乏陽光) 發出紅石信號的方塊。 + +屬於特殊的貨物礦車類型,功能類似漏斗,會收集軌道上的物品以及上方容器內的物品。 + +特殊護甲類型,可以裝在馬上。提供 5 護甲。 + +特殊護甲類型,可以裝在馬上。提供 7 護甲。 + +特殊護甲類型,可以裝在馬上。提供 11 護甲。 + +用來將生物拴在玩家或柵欄柱 + +用來為世界上的生物命名。 + 可回復 2.5 個 {*ICON_SHANK_01*}。 使用 1 次可回復 1 個 {*ICON_SHANK_01*},總共能使用 6 次。 @@ -933,205 +1015,263 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 生物頭顱可當裝飾品或當做面具戴在頭盔空格中。 +用來執行指令。 + +朝天空發射光束,而且能夠為附近玩家提供狀態效果。 + +將方塊和物品儲存在裡面。將兩個儲物箱並排在一起,即可建立兩倍容量的大型儲物箱。陷阱儲物箱還會在開啟時建立紅石彈。 + +提供紅石彈,當板上的物品越多,彈的力量越強大。 + +提供紅石彈,板上物品越多越強大。相較於輕型板子,需要更多重量。 + +用來當成紅石能源。可製作還原回紅石。 + +用來接住物品,或是將物品送進容器或從容器取出。 + +這種類型的軌道能夠啟用或停用漏斗礦車,以及觸發 TNT 礦車。 + +用來裝物品及扔下物品,或是在獲得紅石彈時,將物品推入另一個容器。 + +為硬化黏土染色,即可製作彩色方塊。 + +能夠餵食馬、驢或騾,最多治癒 10 顆心。加快小馬和小驢生長的速度。 + +在熔爐熔黏土即可製造出來。 + +用玻璃和染料製作。 + +用彩繪玻璃製作 + +儲存煤的壓縮方法。可以當做爐的燃料。 + 烏賊 - + 被殺死時會掉落墨囊。 - + 乳牛 - + 被殺死時會掉落皮革。您也可以用桶子來擠牛奶。 - + 綿羊 - + 被剪羊毛時會掉落羊毛 (前提是牠的羊毛還沒被剪掉)。可染色來讓綿羊擁有不同色彩的羊毛。 - + - + 被殺死時會掉落羽毛,還會隨機生蛋。 - + - + 被殺死時會掉落豬肉。您還可以使用鞍座來騎在豬上。 - + - + 狼是溫馴的動物,但當您攻擊牠時,牠就會攻擊您。您可以使用骨頭來馴服狼,這會讓牠跟著您走,並攻擊任何在攻擊您的東西。 - + 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 +其餘 Mojang 辦公室 -Lead Game Programmer Minecraft PC +領導遊戲程式設計師 Minecraft PC -Ninja Coder +Ninja 程式編碼者 -CEO +首席執行長 -White Collar Worker +白領勞工 -Customer Support +客戶支援 -Office DJ +辦公室 DJ -Designer/Programmer Minecraft - Pocket Edition +設計者/程式設計師 Minecraft - 袖珍版 -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 +董事, XBLA 公佈 -Business Development +業務開發 -Portfolio Director +投資董事 -Product Manager +製作經理 -Marketing +行銷 - Community Manager +社群經理 -Europe Localization Team +歐洲在地化團隊 -Redmond Localization Team +Redmond 在地化團隊 -Asia Localization Team +亞洲在地化團隊 -User Research Team +使用者研究團隊 -MGS Central Teams +MGS 中心團隊 -Milestone Acceptance Tester +里程碑驗收測試員 -Special Thanks +特別感謝 -Test Manager +測試經理 -Senior Test Lead +資深測試主管 SDET -Project STE +專案 STE -Additional STE +其他 STE -Test Associates +測試相關 Jon Kagstrom -Tobias Mollstam +Tobias Möllstam -Rise Lugo +Risë Lugo 木劍 @@ -1373,6 +1513,8 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 地圖 +空白地圖 + 唱片:13 唱片:Cat @@ -1475,6 +1617,28 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 Creeper 頭顱 +幽冥星 + +煙火火箭 + +煙火星 + +紅石比較器 + +TNT 礦車 + +漏斗礦車 + +鐵馬鎧 + +黃金馬鎧 + +鑽石馬鎧 + +繩索 + +名牌 + 石頭 青草方塊 @@ -1491,6 +1655,8 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 熱帶叢林厚木板 +木材厚木板 (任何類型) + 樹苗 橡樹樹苗 @@ -1827,6 +1993,193 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 骷髏 +指令方塊 + +燈塔 + +陷阱儲物箱 + +測重壓力板(輕型) + +測重壓力板(重型) + +紅石比較器 + +陽光感測器 + +紅石方塊 + +漏斗 + +啟動鐵軌 + +投擲器 + +染色黏土塊 + +乾草捆 + +硬化黏土 + +煤炭塊 + +黑色染色黏土塊 + +紅色染色黏土塊 + +綠色染色黏土塊 + +棕色染色黏土塊 + +藍色染色黏土塊 + +紫色染色黏土塊 + +青綠色染色黏土塊 + +淺灰色染色黏土塊 + +灰色染色黏土塊 + +粉紅色染色黏土塊 + +淡黃綠色染色黏土塊 + +黃色染色黏土塊 + +淺藍色染色黏土塊 + +洋紅色染色黏土塊 + +橘色染色黏土塊 + +白色染色黏土塊 + +彩繪玻璃 + +黑色彩繪玻璃 + +紅色彩繪玻璃 + +綠色彩繪玻璃 + +棕色彩繪玻璃 + +藍色彩繪玻璃 + +紫色彩繪玻璃 + +青綠色彩繪玻璃 + +淺灰色彩繪玻璃 + +灰色彩繪玻璃 + +粉紅色彩繪玻璃 + +淡黃綠色彩繪玻璃 + +黃色彩繪玻璃 + +淺藍色彩繪玻璃 + +洋紅色彩繪玻璃 + +橘色彩繪玻璃 + +白色彩繪玻璃 + +彩繪玻璃窗格 + + +黑色彩繪玻璃窗格 + + +紅色彩繪玻璃窗格 + + +綠色彩繪玻璃窗格 + +棕色彩繪玻璃窗格 + +藍色彩繪玻璃窗格 + +紫色彩繪玻璃窗格 + +青綠色彩繪玻璃窗格 + +淺灰色彩繪玻璃窗格 + +灰色彩繪玻璃窗格 + +粉紅色彩繪玻璃窗格 + +淡黃綠色彩繪玻璃窗格 + +黃色彩繪玻璃窗格 + +淺藍色彩繪玻璃窗格 + +洋紅色彩繪玻璃窗格 + +橘色彩繪玻璃窗格 + +白色彩繪玻璃窗格 + +小球 + +大球 + +星型 + +Creeper 型 + +爆裂 + +不明形狀 + +黑色 + +紅色 + +綠色 + +棕色 + +藍色 + +紫色 + +青綠色 + +淺灰色 + +灰色 + +粉紅色 + +淡黃綠色 + +黃色 + +淺藍色 + +洋紅色 + +橘色 + +白色 + +自訂 + +淡化 + +閃爍 + +鐵軌 + +戰鬥持續時間: +  目前的控制方式 配置 @@ -2004,8 +2357,7 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 這是您的物品欄。這裡會顯示可在您手中使用的物品,以及您身上的所有其他物品。您穿戴的護甲也會顯示在這裡。 - - + {*B*} 請按下 {*CONTROLLER_VK_A*} 來繼續。{*B*} 如果您已經了解物品欄的使用方式,請按下 {*CONTROLLER_VK_B*}。 @@ -2026,7 +2378,7 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 - 如果您想知道某個物品的詳細資訊,只要把游標移動到該物品上面,然後按下 {*CONTROLLER_VK_RT*} 即可。 + 如果您想知道某個物品的詳細資訊,只要把游標移動到該物品上面,然後按下{*CONTROLLER_ACTION_MENU_PAGEDOWN*}即可。 @@ -2060,7 +2412,7 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 - 如果您想知道某個物品的詳細資訊,只要把游標移動到該物品上面,然後按下 {*CONTROLLER_VK_RT*} 即可。 + 如果您想知道某個物品的詳細資訊,只要把游標移動到該物品上面,然後按下{*CONTROLLER_ACTION_MENU_PAGEDOWN*}即可。 @@ -2606,6 +2958,211 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 如果您已經了解食物列的使用方式,以及吃東西的方法,請按下 {*CONTROLLER_VK_B*} 。 + + 這是馬的物品欄介面。 + + + + {*B*}按下{*CONTROLLER_VK_A*} 繼續。 + {*B*}如果您已經知道如何使用馬物品欄,請按下{*CONTROLLER_VK_B*}。 + + + + 馬物品欄能讓您傳送或安裝物品至馬、驢或騾身上。 + + + + 在馬鞍空格放置馬鞍,即可為馬裝上馬鞍。在護甲空格放置馬護甲,即可為馬裝上護甲。 + + + + 您還可以在這個選單中,於自己的物品欄與綁在驢和騾的鞍囊之間傳送物品。 + + +您發現了一匹馬。 + +您發現了一匹驢。 + +您發現了一匹騾。 + + + {*B*}按下{*CONTROLLER_VK_A*} 進一步瞭解馬、驢和騾。 + {*B*}如果您已經瞭解馬、驢和騾,請按下{*CONTROLLER_VK_B*}。 + + + + 馬和驢居住在開闊的平原。驢和馬交配即可產下騾,但是本身不具生育能力。 + + + + 所有成年的馬、驢和騾都可供騎乘,但是只有馬能夠穿上護甲,只有騾和驢可以裝上鞍囊運輸物品。 + + + + 馬、驢和騾必須先馴服才堪用。馴服馬的方式是騎上去,過程中馬會想辦法將騎士摔下馬背,騎士必須想辦法留在馬背上。 + + + + 當愛心出現在馬的周圍時,牠已經被馴服,再也不會把玩家摔下馬背。 + + + + 馬上嘗試騎這匹馬。手上不要拿物品或工具,使用 {*CONTROLLER_ACTION_USE*} 騎上馬背。 + + + + 您必須幫馬裝上馬鞍,才能操縱馬的方向。馬鞍可以向村民購買,或是從藏在世界中的儲物箱尋找。 + + + + 裝上儲物箱,就能為馴服的驢和騾加鞍囊。騎乘或潛行時就能使用這些鞍囊。 + + + + 餵食金蘋果或金蘿蔔即可繁殖馬和驢,就像繁殖其他動物一樣(但是騾不行)。小馬經過一段時間就會長成成年馬,不過如果餵食小麥或乾草就會加速長大。 + + + + 您可以嘗試在這裡馴服馬和驢,這裡附近的儲物箱裡面,還有馬鞍、馬鎧及其他實用的馬相關物品。 + + + + 這是燈塔介面,可用來選擇燈塔要授與哪種力量。 + + + + {*B*}按下{*CONTROLLER_VK_A*} 繼續。 + {*B*}如果您已經知道如何使用燈塔介面,請按下{*CONTROLLER_VK_B*}。 + + + + 您可以在燈塔選單中,為燈塔選取一種主要的力量。金字塔越多層,可供選擇的力量越多。 + + + + 至少有四層的金字塔上的燈塔,還能夠讓您選擇再生次要力量或是更強大的主要力量。 + + + + 您必須在付費空格奉上翡翠、鑽石、黃金或鐵塊,才能設定燈塔的力量。設定後,燈塔就會無限期發出力量。 + + +這座金字塔上方有停用的燈塔。 + + + {*B*}按下{*CONTROLLER_VK_A*} 進一步瞭解燈塔。 + {*B*}如果您已經瞭解燈塔,請按下{*CONTROLLER_VK_B*}。 + + + + 啟動的燈塔會向天空投射明亮的光束,賦予附近的玩家力量。製作燈塔的材料包括玻璃、黑曜石和幽冥星,擊敗凋零怪即可獲得。 + + + + 燈塔必須放置,白天才能在沐浴在陽光之下。燈塔必須放置於鐵、黃金、翡翠或鑽石金字塔上,不過選擇的材料不會影響燈塔的力量。 + + + + 嘗試用燈塔設定它所賦予的力量,您可以拿隨附鐵塊支付必要費用。 + + +這個房間內有漏斗 + + + {*B*}按下{*CONTROLLER_VK_A*} 進一步瞭解漏斗。 + {*B*}如果您已經瞭解漏斗,請按下{*CONTROLLER_VK_B*}。 + + + + 您可以使用漏斗將物品插入容器或是從容器移除物品,以及自動拾取丟入容器的物品。 + + + + 漏斗能夠影響釀造台、儲物箱、發射器、投擲器、運輸礦車、漏斗礦車及其他漏斗。 + + + + 漏斗會一直嘗試從放在上方的合適容器吸取物品,還會嘗試將儲存的物品插入輸出容器。 + + + + 然而,如果漏斗是用紅石發電就會停用,並且停止吸取和插入物品。 + + + + 漏斗會指向嘗試輸出物品的方向。若要讓漏斗指向特定方塊,潛行時將漏斗放在背對該方塊的位置即可。 + + + + 在這個房間裡面,有好幾種實用的漏斗配置供您參考與實驗。 + + + + 這是煙火介面,可以用來製作煙火和煙火星。 + + + + {*B*}按下{*CONTROLLER_VK_A*} 繼續。 + {*B*}如果您已經知道如何使用燈塔介面,請按下{*CONTROLLER_VK_B*}。 + + + + \若要製作煙火,請將火藥和紙放在庫存上方的 3x3 工作台。 + + + + \您可以選擇在工作台放置多顆煙火星,加入煙火。 + + + + 用火藥在工作台填滿的空格越多,所有煙火星會爆炸的高度越高。 + + + + 然後等您想製作時,便可從輸出空格取出製作的煙火。 + + + + 將火藥和染料放進工作台,即可製作煙火星。 + + + + 染料會決定煙火星爆炸的顏色。 + + + + 煙火星的形狀取決於加入火焰彈、金塊、羽毛或生物的頭。 + + + + 使用鑽石或螢光粉即可新增尾巴或閃爍。 + + + + 煙火星製作完成後,以染料製作即可決定煙火星的淡出顏色。 + + + + 此處儲物箱內有製作煙火用的各種物品! + + + + {*B*}按下{*CONTROLLER_VK_A*} 即可進一步瞭解煙火。 + {*B*}如果您已經瞭解煙火,請按下{*CONTROLLER_VK_B*}。 + + + + 煙火屬於裝飾品,可以手動或利用發射器發射,製作的材料包括紙、火藥,也有人會選擇加入幾顆煙火星。 + + + + 煙火星的顏色、淡化、形狀、大小與效果 (例如尾巴和閃爍) 可自訂,方法是在製作時加入額外材料。 + + + + 嘗試用儲物箱內的各式各樣材料製作煙火。 + +  選取 使用 @@ -2724,7 +3281,7 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 播放 -騎/搭乘 +搭乘 乘船 @@ -2828,6 +3385,22 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 上傳供 Xbox One 使用的存檔 +騎上 + +下馬 + +騎下 + +發射 + +栓住 + +射箭 + +裝上 + +命名 + 確定 取消 @@ -3142,6 +3715,20 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 發射器 + + +投擲器 + +漏斗 + +燈塔 + +主要力量 + +次要力量 + +礦車 + 這款遊戲目前沒有此類型的下載內容。 %s 已經加入遊戲。 @@ -3301,10 +3888,14 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 遊戲模式:創造 +遊戲模式:冒險 + 生存 創造 +冒險 + 在生存模式中建立 在創造模式中建立 @@ -3325,6 +3916,8 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 非常平坦 +輸入種子,再度產生相同的地形。留白會隨機挑選世界。 + 啟用時,本遊戲將成為線上遊戲。 啟用時,只限被邀請的玩家加入。 @@ -3349,6 +3942,20 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 啟用時,玩家的再生點附近會有個裝著有用物品的箱子。 +停用時,怪物和動物無法變更方塊(例如:Creeper 爆炸不會摧毀方塊,綿羊無法移除草)或拾起物品 + +啟用時,玩家死掉時可以保留物品欄。 + +停用時,生物不會自然重生。 + +停用時,怪物和動物不會落下戰利品(例如:Creeper 不會落下火藥)。 + +停用時,方塊摧毀時不會落下物品(例如,石頭方塊不會落下鵝卵石)。 + +停用時,玩家不會自然恢復生命值。 + +停用時,時間不會更改。 + 角色外觀套件 主題 @@ -3397,7 +4004,49 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 {*PLAYER*} 被 {*SOURCE*} 的拳頭打死了 -{*PLAYER*} 已被 {*SOURCE*} 殺死。 +{*PLAYER*} 已被 {*SOURCE*} 用魔法殺死 + +{*PLAYER*} 從梯子跌落 + +{*PLAYER*} 從藤蔓跌落 + +{*PLAYER*} 從水中掉出來 + +{*PLAYER*} 從高處跌落 + +{*PLAYER*} 受到 {*SOURCE*} 的跌落詛咒 + +{*PLAYER*} 受到 {*SOURCE*} 的跌落詛咒 + +{*PLAYER*} 受到 {*SOURCE*} 利用 {*ITEM*} 的跌落詛咒 + +{*PLAYER*} 跌落距離太遠,遭到 {*SOURCE*} 消滅 + +{*PLAYER*} 跌落距離太遠,遭到 {*SOURCE*} 用 {*ITEM*} 消滅 + +{*PLAYER*} 在與 {*SOURCE*} 作戰時走入火中 + +{*PLAYER*} 在與 {*SOURCE*} 作戰時燒成灰燼 + +{*PLAYER*} 嘗試在岩漿中游泳,以逃離 {*SOURCE*} + +{*PLAYER*} 在嘗試逃離 {*SOURCE*} 時溺水 + +{*PLAYER*} 在嘗試逃離 {*SOURCE*} 時走入仙人掌 + +{*PLAYER*} 遭 {*SOURCE*} 轟炸 + +{*PLAYER*} 已凋零 + +{*PLAYER*} 已被 {*SOURCE*} 用 {*ITEM*} 屠殺 + +{*PLAYER*} 已被 {*SOURCE*} 用 {*ITEM*} 射死 + +{*PLAYER*} 已被 {*SOURCE*} 用 {*ITEM*} 遭火球擊中 + +{*PLAYER*} 已被 {*SOURCE*} 用 {*ITEM*} 搥打 + +{*PLAYER*} 已被 {*SOURCE*} 用 {*ITEM*} 殺死 基岩迷霧 @@ -3574,6 +4223,8 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 目前已達到遊戲世界的烏賊數量上限,無法使用角色蛋。 +目前已達到遊戲世界的村民數量上限,無法使用角色蛋。 + 目前已達到遊戲世界的敵人數量上限,無法使用角色蛋。 目前已達到遊戲世界的村民數量上限,無法使用角色蛋。 @@ -3588,6 +4239,8 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 雞已達到繁殖數量上限,該動物無法進入戀愛模式。 +這種動物不能進入愛情模式,已經達到繁殖馬的數量上限。 + Mooshrooms 已達到繁殖數量上限,該動物無法進入戀愛模式。 目前這個世界的小船已達到數量上限。 @@ -3615,27 +4268,43 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 製作群 重新安裝內容 - + 偵錯設定 - + 火會蔓延 - + 炸藥會爆炸 - + 玩家對玩家 - + 信任玩家 - + 主持人特權 - + 產生建築 - + 非常平坦的世界 - + 贈品箱 - + 世界選項 - + +遊戲選項 + +生物惡意破壞 + +保留物品欄 + +生物重生 + +生物戰利品 + +磚塊掉落 + +自然再生 + +陽光循環 + 可以建造和開採 可以使用門與開關 @@ -3822,6 +4491,14 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 巨毒 +凋零怪 + +生命值加乘 + +吸收 + +飽和 + 敏捷 緩慢 @@ -3860,6 +4537,14 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 巨毒 +腐朽 + +生命值加乘 + +吸收 + +飽和 + 2 @@ -3956,6 +4641,22 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 隨著時間自動減少受影響玩家、動物和怪物的生命值。 +套用時: + +馬跳躍力量 + +殭屍援軍 + +生命值上限 + +生物跟蹤範圍 + +擊退防禦力 + +速度 + +攻擊殺傷力 + 鋒利 重擊 @@ -4046,7 +4747,7 @@ Xbox One 主機上的 Minecraft 預設為多人遊戲。如果您選擇高畫質 可回復 3 點 {*ICON_SHANK_01*}。在熔爐中烹煮馬鈴薯即可獲得。 -可回復 1 個 {*ICON_SHANK_01*},或可在熔爐中烹煮。可以栽種在農地上。食用可能會讓您中毒。 +可回復 1 個 {*ICON_SHANK_01*}。 吃這個可能會讓您中毒。 可回復 3 個 {*ICON_SHANK_01*}。用胡蘿蔔和碎金塊精製而成。 diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.cpp b/Minecraft.Client/Common/Network/GameNetworkManager.cpp index 2a80f80a..940a148e 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/GameNetworkManager.cpp @@ -6,6 +6,7 @@ #include "..\..\..\Minecraft.World\ThreadName.h" #include "..\..\..\Minecraft.World\Entity.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\FireworksRecipe.h" #include "..\..\ClientConnection.h" #include "..\..\Minecraft.h" #include "..\..\User.h" @@ -30,7 +31,7 @@ #ifdef _XBOX #include "Common\XUI\XUI_PauseMenu.h" -#elif !(defined __PSVITA__) +#else #include "Common\UI\UI.h" #include "Common\UI\UIScene_PauseMenu.h" #include "..\..\Xbox\Network\NetworkPlayerXbox.h" @@ -204,7 +205,79 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame } else { - param->seed = seed = app.getLevelGenerationOptions()->getLevelSeed(); + param->seed = seed = app.getLevelGenerationOptions()->getLevelSeed(); + + if(param->levelGen->isTutorial()) + { + // Load the tutorial save data here + if(param->levelGen->requiresBaseSave() && !param->levelGen->getBaseSavePath().empty() ) + { +#ifdef _XBOX +#ifdef _TU_BUILD + wstring fileRoot = L"UPDATE:\\res\\GameRules\\" + param->levelGen->getBaseSavePath(); +#else + wstring fileRoot = L"GAME:\\res\\TitleUpdate\\GameRules\\" + param->levelGen->getBaseSavePath(); +#endif +#else +#ifdef _WINDOWS64 + wstring fileRoot = L"Windows64Media\\Tutorial\\" + param->levelGen->getBaseSavePath(); + File root(fileRoot); + if(!root.exists()) fileRoot = L"Windows64\\Tutorial\\" + param->levelGen->getBaseSavePath(); +#elif defined(__ORBIS__) + wstring fileRoot = L"/app0/orbis/Tutorial/" + param->levelGen->getBaseSavePath(); +#elif defined(__PSVITA__) + wstring fileRoot = L"PSVita/Tutorial/" + param->levelGen->getBaseSavePath(); +#elif defined(__PS3__) + wstring fileRoot = L"PS3/Tutorial/" + param->levelGen->getBaseSavePath(); +#else + wstring fileRoot = L"Tutorial\\" + param->levelGen->getBaseSavePath(); +#endif +#endif + File grf(fileRoot); + if (grf.exists()) + { +#ifdef _UNICODE + wstring path = grf.getPath(); + const WCHAR *pchFilename=path.c_str(); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#else + const char *pchFilename=wstringtofilename(grf.getPath()); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#endif + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD bytesRead,dwFileSize = GetFileSize(fileHandle,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(fileHandle); + + // 4J-PB - is it possible that we can get here after a read fail and it's not an error? + param->levelGen->setBaseSaveData(pbData, dwFileSize); + } + } + } + } } } } @@ -694,7 +767,7 @@ int CGameNetworkManager::JoinFromInvite_SignInReturned(void *pParam,bool bContin { UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); return 0; } @@ -738,7 +811,7 @@ int CGameNetworkManager::JoinFromInvite_SignInReturned(void *pParam,bool bContin { 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()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { @@ -856,6 +929,16 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter ) NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; seed = param->seed; app.SetGameHostOption(eGameHostOption_All,param->settings); + + // 4J Stu - If we are loading a DLC save that's separate from the texture pack, load + if( param->levelGen != NULL && (param->texturePackId == 0 || param->levelGen->getRequiredTexturePackId() != param->texturePackId) ) + { + while((Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin())) + { + Sleep(1); + } + param->levelGen->loadBaseSaveData(); + } } SetThreadName(-1, "Minecraft Server thread"); @@ -867,6 +950,7 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter ) Entity::useSmallIds(); Level::enableLightingCache(); Tile::CreateNewThreadStorage(); + FireworksRecipe::CreateNewThreadStorage(); MinecraftServer::main(seed, lpParameter); //saveData, app.GetGameHostOption(eGameHostOption_All)); @@ -889,10 +973,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) Compression::UseDefaultThreadStorage(); //app.SetGameStarted(false); - -#ifndef __PSVITA__ UIScene_PauseMenu::_ExitWorld(NULL); -#endif while( g_NetworkManager.IsInSession() ) { @@ -900,7 +981,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) } // Xbox should always be online when receiving invites - on PS3 we need to check & ask the user to sign in -#ifndef __PS3__ +#if !defined(__PS3__) && !defined(__PSVITA__) JoinFromInviteData *inviteData = (JoinFromInviteData *)lpParam; app.SetAction(inviteData->dwUserIndex, eAppAction_JoinFromInvite, lpParam); #else @@ -914,7 +995,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_0,lpParam); } #endif @@ -1053,16 +1134,16 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) { 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()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( 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()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( 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()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( 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 @@ -1073,7 +1154,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) { 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()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( 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 ); } @@ -1215,6 +1296,13 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) // Update the network player pMinecraft->m_pendingLocalConnections[index]->getConnection()->getSocket()->setPlayer(g_NetworkManager.GetLocalPlayerByUserIndex(index)); } + else if ( pMinecraft->m_connectionFailed[index] && (pMinecraft->m_connectionFailedReason[index] == DisconnectPacket::eDisconnect_ConnectionCreationFailed) ) + { + pMinecraft->removeLocalPlayerIdx(index); +#ifdef _XBOX_ONE + ProfileManager.RemoveGamepadFromGame(index); +#endif + } } } } @@ -1572,7 +1660,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else if (ProfileManager.isSignedInPSN(iPadNotSignedInLive)) { @@ -1581,57 +1669,36 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPadNotSignedInLive); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPadNotSignedInLive, &CGameNetworkManager::MustSignInReturned_1, (void *)pInviteInfo); } 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 this is the trial game, we'll check and send the user to unlock the game later, in HandleInviteWhenInMenus + if(ProfileManager.IsFullVersion()) { - if ( ProfileManager.IsSignedIn(index) - && !ProfileManager.HasPlayStationPlus(userIndex) ) + // 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++) { - m_pInviteInfo = (INVITE_INFO *) pInviteInfo; - m_iPlayerInvited = userIndex; + if ( ProfileManager.IsSignedIn(index) + && !ProfileManager.HasPlayStationPlus(userIndex) ) + { + m_pInviteInfo = (INVITE_INFO *) pInviteInfo; + m_iPlayerInvited = userIndex; - m_pUpsell = new PsPlusUpsellWrapper(index); - m_pUpsell->displayUpsell(); + 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; + } } - return; } #endif @@ -1675,17 +1742,22 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * 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()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN, uiIDA,1,XUSER_INDEX_ANY); } else #endif if( noUGC ) { +#ifdef __PSVITA__ + // showing the system message for chat restriction here instead now, to fix FQA bug report + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); +#else 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); +#endif } #if defined(__PS3__) || defined __PSVITA__ else if(bContentRestricted) @@ -1703,7 +1775,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * // 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()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,XUSER_INDEX_ANY); } else { @@ -1717,10 +1789,11 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * #endif if( !g_NetworkManager.IsInSession() ) { -#ifndef __PS3__ - HandleInviteWhenInMenus(userIndex, pInviteInfo); -#else +#if defined (__PS3__) || defined (__PSVITA__) // 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 + + // Determine why they're not "signed in live" + // MGH - On Vita we need to add a new message at some point for connecting when already signed in if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) { HandleInviteWhenInMenus(userIndex, pInviteInfo); @@ -1730,8 +1803,12 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_1,(void *)pInviteInfo); } + + +#else + HandleInviteWhenInMenus(userIndex, pInviteInfo); #endif } else @@ -1777,7 +1854,9 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I } else { +#ifndef _XBOX_ONE ProfileManager.SetPrimaryPad(userIndex); +#endif // 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); @@ -1787,7 +1866,11 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I // 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); +#ifdef _XBOX_ONE + if((!app.IsLocalMultiplayerAvailable())&&InputManager.IsPadLocked(userIndex)) +#else if(!app.IsLocalMultiplayerAvailable()) +#endif { bool noPrivileges=!ProfileManager.AllowedToPlayMultiplayer(userIndex); @@ -1795,7 +1878,7 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I { 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()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Network/GameNetworkManager.h index 1bb532da..01db2724 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.h +++ b/Minecraft.Client/Common/Network/GameNetworkManager.h @@ -22,6 +22,7 @@ using namespace std; class ClientConnection; class Minecraft; +const int NON_QNET_SENDDATA_ACK_REQUIRED = 1; // 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 diff --git a/Minecraft.Client/Common/Network/NetworkPlayerInterface.h b/Minecraft.Client/Common/Network/NetworkPlayerInterface.h index 501b08ff..d26252da 100644 --- a/Minecraft.Client/Common/Network/NetworkPlayerInterface.h +++ b/Minecraft.Client/Common/Network/NetworkPlayerInterface.h @@ -9,8 +9,9 @@ class INetworkPlayer public: virtual ~INetworkPlayer() {} virtual unsigned char GetSmallId() = 0; - virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority) = 0; + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack) = 0; virtual bool IsSameSystem(INetworkPlayer *player) = 0; + virtual int GetOutstandingAckCount() = 0; virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ) = 0; virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ) = 0; virtual int GetCurrentRtt() = 0; @@ -28,4 +29,6 @@ public: virtual const wchar_t *GetOnlineName() = 0; virtual wstring GetDisplayName() = 0; virtual PlayerUID GetUID() = 0; + virtual void SentChunkPacket() = 0; + virtual int GetTimeSinceLastChunkPacket_ms() = 0; }; diff --git a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp index 9c750e95..a7a4628b 100644 --- a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp +++ b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp @@ -5,6 +5,7 @@ NetworkPlayerSony::NetworkPlayerSony(SQRNetworkPlayer *qnetPlayer) { m_sqrPlayer = qnetPlayer; m_pSocket = NULL; + m_lastChunkPacketTime = 0; } unsigned char NetworkPlayerSony::GetSmallId() @@ -12,10 +13,10 @@ unsigned char NetworkPlayerSony::GetSmallId() return m_sqrPlayer->GetSmallId(); } -void NetworkPlayerSony::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority) +void NetworkPlayerSony::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack) { // TODO - handle priority - m_sqrPlayer->SendData( ((NetworkPlayerSony *)player)->m_sqrPlayer, pvData, dataSize ); + m_sqrPlayer->SendData( ((NetworkPlayerSony *)player)->m_sqrPlayer, pvData, dataSize, ack ); } bool NetworkPlayerSony::IsSameSystem(INetworkPlayer *player) @@ -23,14 +24,19 @@ bool NetworkPlayerSony::IsSameSystem(INetworkPlayer *player) return m_sqrPlayer->IsSameSystem(((NetworkPlayerSony *)player)->m_sqrPlayer); } +int NetworkPlayerSony::GetOutstandingAckCount() +{ + return m_sqrPlayer->GetOutstandingAckCount(); +} + int NetworkPlayerSony::GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ) { - return 0; // TODO + return m_sqrPlayer->GetSendQueueSizeBytes(); } int NetworkPlayerSony::GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ) { - return 0; // TODO + return m_sqrPlayer->GetSendQueueSizeMessages(); } int NetworkPlayerSony::GetCurrentRtt() @@ -112,3 +118,20 @@ void NetworkPlayerSony::SetUID(PlayerUID UID) { m_sqrPlayer->SetUID(UID); } + +void NetworkPlayerSony::SentChunkPacket() +{ + m_lastChunkPacketTime = System::currentTimeMillis(); +} + +int NetworkPlayerSony::GetTimeSinceLastChunkPacket_ms() +{ + // If we haven't ever sent a packet, return maximum + if( m_lastChunkPacketTime == 0 ) + { + return INT_MAX; + } + + __int64 currentTime = System::currentTimeMillis(); + return (int)( currentTime - m_lastChunkPacketTime ); +} diff --git a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h index 5c8605fb..f3415a41 100644 --- a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h +++ b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h @@ -11,8 +11,9 @@ public: // Common player interface NetworkPlayerSony(SQRNetworkPlayer *sqrPlayer); virtual unsigned char GetSmallId(); - virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority); + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack); virtual bool IsSameSystem(INetworkPlayer *player); + virtual int GetOutstandingAckCount(); virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ); virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ); virtual int GetCurrentRtt(); @@ -33,7 +34,10 @@ public: void SetUID(PlayerUID UID); + virtual void SentChunkPacket(); + virtual int GetTimeSinceLastChunkPacket_ms(); private: SQRNetworkPlayer *m_sqrPlayer; Socket *m_pSocket; + __int64 m_lastChunkPacketTime; }; diff --git a/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp index 009993cb..67fd058c 100644 --- a/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp +++ b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp @@ -54,10 +54,8 @@ void CPlatformNetworkManagerSony::HandleStateChange(SQRNetworkManager::eSQRNetwo 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(); +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); #endif m_bLeavingGame = false; m_bLeaveGameOnTick = false; @@ -459,16 +457,16 @@ int CPlatformNetworkManagerSony::CorrectErrorIDS(int IDS) // 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__ + +#if defined __PSVITA__ // MGH - to fix devtrack #6258 + if(!ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) + preferSignoutError = true; +#elif defined __ORBIS__ + if(!ProfileManager.isSignedInPSN(ProfileManager.GetPrimaryPad())) + preferSignoutError = true; +#elif defined __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 ) @@ -476,6 +474,7 @@ int CPlatformNetworkManagerSony::CorrectErrorIDS(int IDS) preferSignoutError = true; } } +#endif #ifdef __PSVITA__ // If we're in ad-hoc mode this problem definitely wasn't PSN related @@ -1446,7 +1445,8 @@ void CPlatformNetworkManagerSony::startAdhocMatching( ) bool CPlatformNetworkManagerSony::checkValidInviteData(const INVITE_INFO* pInviteInfo) { - if(((SQRNetworkManager_Vita*)m_pSQRNet_Vita)->GetHostUID() == pInviteInfo->hostPlayerUID) + SQRNetworkManager_Vita* pSQR = (SQRNetworkManager_Vita*)m_pSQRNet_Vita; + if(pSQR->IsOnlineGame() && !pSQR->IsHost()&& (pSQR->GetHostUID() == pInviteInfo->hostPlayerUID)) { // we're trying to join a game we're already in, so we just ignore this return false; diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp index 20f2641c..f23a0a63 100644 --- a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp @@ -8,3 +8,76 @@ void SQRNetworkManager::SafeToRespondToGameBootInvite() { s_safeToRespondToGameBootInvite = true; } + +int SQRNetworkManager::GetSendQueueSizeBytes() +{ + int queueSize = 0; + int playerCount = GetPlayerCount(); + for(int i = 0; i < playerCount; ++i) + { + SQRNetworkPlayer *player = GetPlayerByIndex( i ); + if( player != NULL ) + { + queueSize += player->GetTotalSendQueueBytes(); + } + } + return queueSize; +} + +int SQRNetworkManager::GetSendQueueSizeMessages() +{ + int queueSize = 0; + int playerCount = GetPlayerCount(); + for(int i = 0; i < playerCount; ++i) + { + SQRNetworkPlayer *player = GetPlayerByIndex( i ); + if( player != NULL ) + { + queueSize += player->GetTotalSendQueueMessages(); + } + } + return queueSize; +} + +int SQRNetworkManager::GetOutstandingAckCount(SQRNetworkPlayer *pSQRPlayer) +{ + int ackCount = 0; + int playerCount = GetPlayerCount(); + for(int i = 0; i < playerCount; ++i) + { + SQRNetworkPlayer *pSQRPlayer2 = GetPlayerByIndex( i ); + if( pSQRPlayer2 ) + { + if( ( pSQRPlayer == pSQRPlayer2 ) || (pSQRPlayer->IsSameSystem(pSQRPlayer2) ) ) + { + ackCount += pSQRPlayer2->m_acksOutstanding; + } + } + } + return ackCount; +} + +void SQRNetworkManager::RequestWriteAck(int smallId) +{ + EnterCriticalSection(&m_csAckQueue); + m_queuedAckRequests.push(smallId); + LeaveCriticalSection(&m_csAckQueue); +} + +void SQRNetworkManager::TickWriteAcks() +{ + EnterCriticalSection(&m_csAckQueue); + while(m_queuedAckRequests.size() > 0) + { + int smallId = m_queuedAckRequests.front(); + m_queuedAckRequests.pop(); + SQRNetworkPlayer *player = GetPlayerBySmallId(smallId); + if( player ) + { + LeaveCriticalSection(&m_csAckQueue); + player->WriteAck(); + EnterCriticalSection(&m_csAckQueue); + } + } + LeaveCriticalSection(&m_csAckQueue); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h index c93368d8..e3f15aca 100644 --- a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h @@ -11,6 +11,9 @@ #include #include +#if defined __PSVITA__ +#include "..\..\Minecraft.Client\PSVita\4JLibs\inc\4J_Profile.h" +#endif class SQRNetworkPlayer; class ISQRNetworkManagerListener; @@ -30,7 +33,9 @@ public: protected: friend class SQRNetworkPlayer; friend class SonyVoiceChat; - +#ifdef __PSVITA__ + friend class HelloSyncInfo; +#endif static const int MAX_FRIENDS = 100; #ifdef __PS3__ @@ -231,6 +236,8 @@ protected: std::queue m_stateChangeQueue; CRITICAL_SECTION m_csStateChangeQueue; CRITICAL_SECTION m_csMatching; + CRITICAL_SECTION m_csAckQueue; + std::queue m_queuedAckRequests; typedef enum { @@ -295,6 +302,13 @@ public: static void SafeToRespondToGameBootInvite(); + int GetOutstandingAckCount(SQRNetworkPlayer *pSonyPlayer); + int GetSendQueueSizeBytes(); + int GetSendQueueSizeMessages(); + void RequestWriteAck(int smallId); + void TickWriteAcks(); + + }; diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp index e244b34c..a040b28b 100644 --- a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp @@ -16,6 +16,15 @@ #endif +//#define PRINT_ACK_STATS + +#ifdef __PS3__ +static const int sc_wouldBlockFlag = CELL_RUDP_ERROR_WOULDBLOCK; +#else // __ORBIS__ +static const int sc_wouldBlockFlag = SCE_RUDP_ERROR_WOULDBLOCK; +#endif + + static const bool sc_verbose = false; @@ -84,6 +93,8 @@ SQRNetworkPlayer::SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayer m_host = onHost; m_manager = manager; m_customData = 0; + m_acksOutstanding = 0; + m_totalBytesInSendQueue = 0; if( pUID ) { memcpy(&m_ISD.m_UID,pUID,sizeof(PlayerUID)); @@ -102,6 +113,7 @@ SQRNetworkPlayer::SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayer } SetNameFromUID(); InitializeCriticalSection(&m_csQueue); + InitializeCriticalSection(&m_csAcks); #ifdef __ORBIS__ if(IsLocal()) { @@ -109,6 +121,14 @@ SQRNetworkPlayer::SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayer } #endif +#ifndef _CONTENT_PACKAGE + m_minAckTime = INT_MAX; + m_maxAckTime = 0; + m_totalAcks = 0; + m_totalAckTime = 0; + m_averageAckTime = 0; +#endif + } SQRNetworkPlayer::~SQRNetworkPlayer() @@ -190,13 +210,8 @@ bool SQRNetworkPlayer::HasSmallIdConfirmed() // 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) ); + SendInternal(&m_ISD, sizeof(InitSendData), e_flag_AckNotRequested); + // 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"); @@ -205,8 +220,9 @@ void SQRNetworkPlayer::ConfirmReady() // 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 ) +void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize, bool ack ) { + AckFlags ackFlags = ack ? e_flag_AckRequested : e_flag_AckNotRequested; // 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 ) @@ -224,7 +240,7 @@ void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *da 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); + pPlayerTarget->SendInternal(data,dataSize, ackFlags); } else { @@ -237,7 +253,7 @@ void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *da 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); + SendInternal(data, dataSize, ackFlags); } else { @@ -250,15 +266,30 @@ void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *da // 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) +void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize, AckFlags ackFlags) { EnterCriticalSection(&m_csQueue); - + bool bOutstandingPackets = (m_sendQueue.size() > 0); // check if there are still packets in the queue, we won't be calling SendMoreInternal here if there are QueuedSendBlock sendBlock; unsigned char *dataCurrent = (unsigned char *)data; unsigned int dataRemaining = dataSize; + if(ackFlags == e_flag_AckReturning) + { + // no data, just the flag + assert(dataSize == 0); + assert(data == NULL); + int dataSize = dataRemaining; + if( dataSize > SNP_MAX_PAYLOAD ) dataSize = SNP_MAX_PAYLOAD; + sendBlock.start = NULL; + sendBlock.end = NULL; + sendBlock.current = NULL; + sendBlock.ack = ackFlags; + m_sendQueue.push(sendBlock); + } + else + { while( dataRemaining ) { int dataSize = dataRemaining; @@ -266,19 +297,203 @@ void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize) sendBlock.start = new unsigned char [dataSize]; sendBlock.end = sendBlock.start + dataSize; sendBlock.current = sendBlock.start; + sendBlock.ack = ackFlags; memcpy( sendBlock.start, dataCurrent, dataSize); m_sendQueue.push(sendBlock); dataRemaining -= dataSize; dataCurrent += dataSize; } - // Now try and send as much as we can - SendMoreInternal(); + } + m_totalBytesInSendQueue += dataSize; + + // if the queue had something in it already, then the UDP callback will fire and call SendMoreInternal + // so we don't call it here, to avoid a deadlock + if(!bOutstandingPackets) + { + // Now try and send as much as we can + SendMoreInternal(); + } LeaveCriticalSection(&m_csQueue); } +int SQRNetworkPlayer::WriteDataPacket(const void* data, int dataSize, AckFlags ackFlags) + { + DataPacketHeader header(dataSize, ackFlags); + int headerSize = sizeof(header); + int packetSize = dataSize+headerSize; + unsigned char* packetData = new unsigned char[packetSize]; + *((DataPacketHeader*)packetData) = header; + memcpy(&packetData[headerSize], data, dataSize); + +#ifndef _CONTENT_PACKAGE + if(ackFlags == e_flag_AckRequested) + m_ackStats.push_back(System::currentTimeMillis()); +#endif + +#ifdef __PS3__ + int ret = cellRudpWrite( m_rudpCtx, packetData, packetSize, 0);//CELL_RUDP_MSG_LATENCY_CRITICAL ); +#else // __ORBIS__ && __PSVITA__ + int ret = sceRudpWrite( m_rudpCtx, packetData, packetSize, 0);//SCE_RUDP_MSG_LATENCY_CRITICAL ); +#endif + if(ret == sc_wouldBlockFlag) + { + // nothing was sent! + } + else + { + assert(ret==packetSize || ret > headerSize); // we must make sure we've sent the entire packet or the header and some data at least + ret -= headerSize; + if(ackFlags == e_flag_AckRequested) + { + EnterCriticalSection(&m_csAcks); + m_acksOutstanding++; + LeaveCriticalSection(&m_csAcks); + } + } + delete packetData; + + return ret; +} + +int SQRNetworkPlayer::GetPacketDataSize() +{ + unsigned int ackFlag; + int headerSize = sizeof(ackFlag); +#ifdef __PS3__ + unsigned int packetSize = cellRudpGetSizeReadable(m_rudpCtx); +#else + unsigned int packetSize = sceRudpGetSizeReadable(m_rudpCtx); +#endif + if(packetSize == 0) + return 0; + + unsigned int dataSize = packetSize - headerSize; + assert(dataSize >= 0); + if(dataSize == 0) + { + // header only, must just be an ack returning + ReadAck(); + } + return dataSize; +} + +int SQRNetworkPlayer::ReadDataPacket(void* data, int dataSize) +{ + int headerSize = sizeof(DataPacketHeader); + int packetSize = dataSize+headerSize; + + unsigned char* packetData = new unsigned char[packetSize]; +#ifdef __PS3__ + int bytesRead = cellRudpRead( m_rudpCtx, packetData, packetSize, 0, NULL ); +#else // __ORBIS__ && __PSVITA__ + int bytesRead = sceRudpRead( m_rudpCtx, packetData, packetSize, 0, NULL ); +#endif + if(bytesRead == sc_wouldBlockFlag) + { + delete packetData; + return 0; + } + // check the header, and see if we need to send back an ack + DataPacketHeader header = *((DataPacketHeader*)packetData); + if(header.GetAckFlags() == e_flag_AckRequested) + { + // Don't send the ack back directly from here, as this is called from a rudp event callback, and we end up in a thread lock situation between the lock librudp uses + // internally (which is locked already here since we are being called in the event handler), and our own lock that we do for processing our write queue + m_manager->RequestWriteAck(GetSmallId()); + } + else + { + assert(header.GetAckFlags() == e_flag_AckNotRequested); + } + if(bytesRead > 0) + { + bytesRead -= headerSize; + memcpy(data, &packetData[headerSize], bytesRead); + } + assert(header.GetDataSize() == bytesRead); + + delete packetData; + + return bytesRead; +} + + + +void SQRNetworkPlayer::ReadAck() +{ + DataPacketHeader header; +#ifdef __PS3__ + int bytesRead = cellRudpRead( m_rudpCtx, &header, sizeof(header), 0, NULL ); +#else // __ORBIS__ && __PSVITA__ + int bytesRead = sceRudpRead( m_rudpCtx, &header, sizeof(header), 0, NULL ); +#endif + if(bytesRead == sc_wouldBlockFlag) + { + return; + } + + assert(header.GetAckFlags() == e_flag_AckReturning); + EnterCriticalSection(&m_csAcks); + m_acksOutstanding--; + assert(m_acksOutstanding >=0); + LeaveCriticalSection(&m_csAcks); + +#ifndef _CONTENT_PACKAGE +#ifdef PRINT_ACK_STATS + __int64 timeTaken = System::currentTimeMillis() - m_ackStats[0]; + if(timeTaken < m_minAckTime) + m_minAckTime = timeTaken; + if(timeTaken > m_maxAckTime) + m_maxAckTime = timeTaken; + m_totalAcks++; + m_totalAckTime += timeTaken; + m_averageAckTime = m_totalAckTime / m_totalAcks; + app.DebugPrintf("RUDP ctx : %d : Time taken for ack - %4d ms : min - %4d : max %4d : avg %4d\n", m_rudpCtx, timeTaken, m_minAckTime, m_maxAckTime, m_averageAckTime); + m_ackStats.erase(m_ackStats.begin()); +#endif +#endif +} + +void SQRNetworkPlayer::WriteAck() +{ + SendInternal(NULL, 0, e_flag_AckReturning); +} + +int SQRNetworkPlayer::GetOutstandingAckCount() +{ + return m_manager->GetOutstandingAckCount(this); +} + +int SQRNetworkPlayer::GetTotalOutstandingAckCount() +{ + return m_acksOutstanding; +} + +int SQRNetworkPlayer::GetTotalSendQueueBytes() +{ + return m_totalBytesInSendQueue; +} + +int SQRNetworkPlayer::GetTotalSendQueueMessages() +{ + CriticalSectionScopeLock lock(&m_csQueue); + return m_sendQueue.size(); + +} + +int SQRNetworkPlayer::GetSendQueueSizeBytes() +{ + return m_manager->GetSendQueueSizeBytes(); +} + +int SQRNetworkPlayer::GetSendQueueSizeMessages() +{ + return m_manager->GetSendQueueSizeMessages(); +} + // 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, @@ -287,6 +502,8 @@ void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize) void SQRNetworkPlayer::SendMoreInternal() { EnterCriticalSection(&m_csQueue); + assert(m_sendQueue.size() > 0); // this should never be called with an empty queue. + bool keepSending; do { @@ -296,17 +513,12 @@ void SQRNetworkPlayer::SendMoreInternal() // 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; + int ret = WriteDataPacket(data, dataSize, m_sendQueue.front().ack); -#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 + m_totalBytesInSendQueue -= ret; delete [] m_sendQueue.front().start; m_sendQueue.pop(); if( m_sendQueue.size() ) @@ -314,15 +526,15 @@ void SQRNetworkPlayer::SendMoreInternal() keepSending = true; } } - else if( ( ret >= 0 ) || ( ret == wouldBlockFlag ) ) + else if( ( ret >= 0 ) || ( ret == sc_wouldBlockFlag ) ) { - // Things left to send - adjust this element in the queue int remainingBytes; if( ret >= 0 ) { // Only ret bytes sent so far + m_totalBytesInSendQueue -= ret; remainingBytes = dataSize - ret; assert(remainingBytes > 0 ); } diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h index 0cd56e8d..d0efe635 100644 --- a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h @@ -48,12 +48,41 @@ class SQRNetworkPlayer 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; + enum AckFlags + { + e_flag_AckUnknown, + e_flag_AckNotRequested, + e_flag_AckRequested, + e_flag_AckReturning + }; + + class DataPacketHeader + { + unsigned short m_dataSize; + unsigned short m_ackFlags; + public: + DataPacketHeader() : m_dataSize(0), m_ackFlags(e_flag_AckUnknown) {} + DataPacketHeader(int dataSize, AckFlags ackFlags) : m_dataSize(dataSize), m_ackFlags(ackFlags) { } + AckFlags GetAckFlags() { return (AckFlags)m_ackFlags;} + int GetDataSize() { return m_dataSize; } + }; + +#ifndef _CONTENT_PACKAGE + std::vector<__int64> m_ackStats; + int m_minAckTime; + int m_maxAckTime; + int m_totalAcks; + __int64 m_totalAckTime; + int m_averageAckTime; +#endif + class QueuedSendBlock { public: unsigned char *start; unsigned char *end; unsigned char *current; + AckFlags ack; }; class InitSendData @@ -75,11 +104,26 @@ class SQRNetworkPlayer 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 SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize, bool ack ); void ConfirmReady(); - void SendInternal(const void *data, unsigned int dataSize); + void SendInternal(const void *data, unsigned int dataSize, AckFlags ackFlags); void SendMoreInternal(); + int GetPacketDataSize(); + int ReadDataPacket(void* data, int dataSize); + int WriteDataPacket(const void* data, int dataSize, AckFlags ackFlags); + void ReadAck(); + void WriteAck(); + + int GetOutstandingAckCount(); + int GetSendQueueSizeBytes(); + int GetSendQueueSizeMessages(); + + int GetTotalOutstandingAckCount(); + int GetTotalSendQueueBytes(); + int GetTotalSendQueueMessages(); + + #ifdef __PSVITA__ void SendInternal_VitaAdhoc(const void *data, unsigned int dataSize, EAdhocDataTag tag = e_dataTag_Normal); void SendMoreInternal_VitaAdhoc(); @@ -99,5 +143,9 @@ class SQRNetworkPlayer wchar_t m_name[21]; uintptr_t m_customData; CRITICAL_SECTION m_csQueue; + CRITICAL_SECTION m_csAcks; std::queue m_sendQueue; + int m_totalBytesInSendQueue; + + int m_acksOutstanding; }; diff --git a/Minecraft.Client/Common/Network/Sony/SonyCommerce.h b/Minecraft.Client/Common/Network/Sony/SonyCommerce.h index 6df04947..ff9423e8 100644 --- a/Minecraft.Client/Common/Network/Sony/SonyCommerce.h +++ b/Minecraft.Client/Common/Network/Sony/SonyCommerce.h @@ -170,4 +170,8 @@ public: virtual void CheckForTrialUpgradeKey() = 0; virtual bool LicenseChecked() = 0; +#if defined __ORBIS__ || defined __PSVITA__ + virtual void ShowPsStoreIcon() = 0; + virtual void HidePsStoreIcon() = 0; +#endif }; diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp index ccb1957d..4468d163 100644 --- a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp @@ -36,6 +36,37 @@ static SceRemoteStorageStatus statParams; +void SonyRemoteStorage::SetRetrievedDescData() +{ + DescriptionData* pDescDataTest = (DescriptionData*)m_remoteFileInfo->fileDescription; + ESavePlatform testPlatform = (ESavePlatform)MAKE_FOURCC(pDescDataTest->m_platform[0], pDescDataTest->m_platform[1], pDescDataTest->m_platform[2], pDescDataTest->m_platform[3]); + if(testPlatform == SAVE_FILE_PLATFORM_NONE) + { + // new version of the descData + DescriptionData_V2* pDescData2 = (DescriptionData_V2*)m_remoteFileInfo->fileDescription; + m_retrievedDescData.m_descDataVersion = GetU32FromHexBytes(pDescData2->m_descDataVersion); + m_retrievedDescData.m_savePlatform = (ESavePlatform)MAKE_FOURCC(pDescData2->m_platform[0], pDescData2->m_platform[1], pDescData2->m_platform[2], pDescData2->m_platform[3]); + m_retrievedDescData.m_seed = GetU64FromHexBytes(pDescData2->m_seed); + m_retrievedDescData.m_hostOptions = GetU32FromHexBytes(pDescData2->m_hostOptions); + m_retrievedDescData.m_texturePack = GetU32FromHexBytes(pDescData2->m_texturePack); + m_retrievedDescData.m_saveVersion = GetU32FromHexBytes(pDescData2->m_saveVersion); + memcpy(m_retrievedDescData.m_saveNameUTF8, pDescData2->m_saveNameUTF8, sizeof(pDescData2->m_saveNameUTF8)); + assert(m_retrievedDescData.m_descDataVersion > 1 && m_retrievedDescData.m_descDataVersion <= sc_CurrentDescDataVersion); + } + else + { + // old version,copy the data across to the new version + DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; + m_retrievedDescData.m_descDataVersion = 1; + m_retrievedDescData.m_savePlatform = (ESavePlatform)MAKE_FOURCC(pDescData->m_platform[0], pDescData->m_platform[1], pDescData->m_platform[2], pDescData->m_platform[3]); + m_retrievedDescData.m_seed = GetU64FromHexBytes(pDescData->m_seed); + m_retrievedDescData.m_hostOptions = GetU32FromHexBytes(pDescData->m_hostOptions); + m_retrievedDescData.m_texturePack = GetU32FromHexBytes(pDescData->m_texturePack); + m_retrievedDescData.m_saveVersion = SAVE_FILE_VERSION_COMPRESSED_CHUNK_STORAGE; // the last save version before we added it to this data + memcpy(m_retrievedDescData.m_saveNameUTF8, pDescData->m_saveNameUTF8, sizeof(pDescData->m_saveNameUTF8)); + } + +} @@ -51,8 +82,9 @@ void getSaveInfoReturnCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int if(strcmp(statParams.data[i].fileName, sc_remoteSaveFilename) == 0) { // found the file we need in the cloud - pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_infoFound; pRemoteStorage->m_remoteFileInfo = &statParams.data[i]; + pRemoteStorage->SetRetrievedDescData(); + pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_infoFound; } } } @@ -104,7 +136,7 @@ void SonyRemoteStorage::getSaveInfo() bool SonyRemoteStorage::getSaveData( const char* localDirname, CallbackFunc cb, LPVOID lpParam ) { m_startTime = System::currentTimeMillis(); - m_dataProgress = 0; + m_dataProgress = -1; return getData(sc_remoteSaveFilename, localDirname, cb, lpParam); } @@ -131,7 +163,9 @@ bool SonyRemoteStorage::setSaveData(PSAVE_INFO info, CallbackFunc cb, void* lpPa m_setDataStatus = e_settingData; m_initCallbackFunc = cb; m_initCallbackParam = lpParam; - m_dataProgress = 0; + m_dataProgress = -1; + m_uploadSaveSize = 0; + m_startTime = System::currentTimeMillis(); bool bOK = init(setSaveDataInitCallback, this); if(!bOK) m_setDataStatus = e_settingDataFailed; @@ -148,16 +182,14 @@ const char* SonyRemoteStorage::getSaveNameUTF8() { if(m_getInfoStatus != e_infoFound) return NULL; - DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; - return pDescData->m_saveNameUTF8; + return m_retrievedDescData.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]); + return m_retrievedDescData.m_savePlatform; } @@ -165,51 +197,23 @@ __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; + return m_retrievedDescData.m_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; + return m_retrievedDescData.m_hostOptions; } 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; + return m_retrievedDescData.m_texturePack; } const char* SonyRemoteStorage::getRemoteSaveFilename() @@ -292,14 +296,41 @@ bool SonyRemoteStorage::saveIsAvailable() #endif } +bool SonyRemoteStorage::saveVersionSupported() +{ + return (m_retrievedDescData.m_saveVersion <= SAVE_FILE_VERSION_NUMBER); +} + + + int SonyRemoteStorage::getDataProgress() { + if(m_dataProgress < 0) + return 0; + int chunkSize = 1024*1024; // 1mb chunks when downloading + int totalSize = getSaveFilesize(); + int transferRatePerSec = 300*1024; // a pessimistic download transfer rate + if(getStatus() == e_setDataInProgress) + { + chunkSize = 5 * 1024 * 1024; // 5mb chunks when uploading + totalSize = m_uploadSaveSize; + transferRatePerSec = 20*1024; // a pessimistic upload transfer rate + } + int sizeTransferred = (totalSize * m_dataProgress) / 100; + int nextChunk = ((sizeTransferred + chunkSize) * 100) / totalSize; + + __int64 time = System::currentTimeMillis(); int elapsedSecs = (time - m_startTime) / 1000; - int progVal = m_dataProgress + (elapsedSecs/3); - if(progVal > 95) + float estimatedTransfered = float(elapsedSecs * transferRatePerSec); + int progVal = m_dataProgress + (estimatedTransfered / float(totalSize)) * 100; + if(progVal > nextChunk) + return nextChunk; + if(progVal > 99) { - return m_dataProgress; + if(m_dataProgress > 99) + return m_dataProgress; + return 99; } return progVal; } @@ -338,3 +369,139 @@ void SonyRemoteStorage::waitForStorageManagerIdle() storageState = StorageManager.GetSaveState(); } } +void SonyRemoteStorage::GetDescriptionData(char* descData) +{ + switch(sc_CurrentDescDataVersion) + { + case 1: + { + DescriptionData descData_V1; + GetDescriptionData(descData_V1); + memcpy(descData, &descData_V1, sizeof(descData_V1)); + } + break; + case 2: + { + DescriptionData_V2 descData_V2; + GetDescriptionData(descData_V2); + memcpy(descData, &descData_V2, sizeof(descData_V2)); + } + break; + default: + assert(0); + break; + } +} + +void SonyRemoteStorage::GetDescriptionData( DescriptionData& descData) +{ + ZeroMemory(&descData, sizeof(DescriptionData)); + descData.m_platform[0] = SAVE_FILE_PLATFORM_LOCAL & 0xff; + descData.m_platform[1] = (SAVE_FILE_PLATFORM_LOCAL >> 8) & 0xff; + descData.m_platform[2] = (SAVE_FILE_PLATFORM_LOCAL >> 16) & 0xff; + descData.m_platform[3] = (SAVE_FILE_PLATFORM_LOCAL >> 24)& 0xff; + + if(m_thumbnailData) + { + unsigned int uiHostOptions; + bool bHostOptionsRead; + DWORD uiTexturePack; + char seed[22]; + app.GetImageTextData(m_thumbnailData, m_thumbnailDataSize,(unsigned char *)seed, uiHostOptions, bHostOptionsRead, uiTexturePack); + + __int64 iSeed = strtoll(seed,NULL,10); + SetU64HexBytes(descData.m_seed, iSeed); + // Save the host options that this world was last played with + SetU32HexBytes(descData.m_hostOptions, uiHostOptions); + // Save the texture pack id + SetU32HexBytes(descData.m_texturePack, uiTexturePack); + } + + memcpy(descData.m_saveNameUTF8, m_saveFileDesc, strlen(m_saveFileDesc)); + +} + +void SonyRemoteStorage::GetDescriptionData( DescriptionData_V2& descData) +{ + ZeroMemory(&descData, sizeof(DescriptionData_V2)); + descData.m_platformNone[0] = SAVE_FILE_PLATFORM_NONE & 0xff; + descData.m_platformNone[1] = (SAVE_FILE_PLATFORM_NONE >> 8) & 0xff; + descData.m_platformNone[2] = (SAVE_FILE_PLATFORM_NONE >> 16) & 0xff; + descData.m_platformNone[3] = (SAVE_FILE_PLATFORM_NONE >> 24)& 0xff; + + // Save descData version + char descDataVersion[9]; + sprintf(descDataVersion,"%08x",sc_CurrentDescDataVersion); + memcpy(descData.m_descDataVersion,descDataVersion,8); // Don't copy null + + + descData.m_platform[0] = SAVE_FILE_PLATFORM_LOCAL & 0xff; + descData.m_platform[1] = (SAVE_FILE_PLATFORM_LOCAL >> 8) & 0xff; + descData.m_platform[2] = (SAVE_FILE_PLATFORM_LOCAL >> 16) & 0xff; + descData.m_platform[3] = (SAVE_FILE_PLATFORM_LOCAL >> 24)& 0xff; + + if(m_thumbnailData) + { + unsigned int uiHostOptions; + bool bHostOptionsRead; + DWORD uiTexturePack; + char seed[22]; + app.GetImageTextData(m_thumbnailData, m_thumbnailDataSize,(unsigned char *)seed, uiHostOptions, bHostOptionsRead, uiTexturePack); + + __int64 iSeed = strtoll(seed,NULL,10); + SetU64HexBytes(descData.m_seed, iSeed); + // Save the host options that this world was last played with + SetU32HexBytes(descData.m_hostOptions, uiHostOptions); + // Save the texture pack id + SetU32HexBytes(descData.m_texturePack, uiTexturePack); + // Save the savefile version + SetU32HexBytes(descData.m_saveVersion, SAVE_FILE_VERSION_NUMBER); + // clear out the future data with underscores + memset(descData.m_futureData, '_', sizeof(descData.m_futureData)); + } + + memcpy(descData.m_saveNameUTF8, m_saveFileDesc, strlen(m_saveFileDesc)); + +} + + +uint32_t SonyRemoteStorage::GetU32FromHexBytes(char* hexBytes) +{ + char hexString[9]; + ZeroMemory(hexString,9); + memcpy(hexString, hexBytes,8); + + uint32_t u32Val = 0; + std::stringstream ss; + ss << hexString; + ss >> std::hex >> u32Val; + return u32Val; +} + +uint64_t SonyRemoteStorage::GetU64FromHexBytes(char* hexBytes) +{ + char hexString[17]; + ZeroMemory(hexString,17); + memcpy(hexString, hexBytes,16); + + uint64_t u64Val = 0; + std::stringstream ss; + ss << hexString; + ss >> std::hex >> u64Val; + return u64Val; + +} + +void SonyRemoteStorage::SetU32HexBytes(char* hexBytes, uint32_t u32) +{ + char hexString[9]; + sprintf(hexString,"%08x",u32); + memcpy(hexBytes,hexString,8); // Don't copy null +} + +void SonyRemoteStorage::SetU64HexBytes(char* hexBytes, uint64_t u64) +{ + char hexString[17]; + sprintf(hexString,"%016llx",u64); + memcpy(hexBytes,hexString,16); // Don't copy null +} diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h index f435848e..d38a06e2 100644 --- a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h @@ -40,6 +40,7 @@ public: PSAVE_INFO m_setSaveDataInfo; SceRemoteStorageData* m_remoteFileInfo; + char m_saveFileDesc[128]; class DescriptionData { @@ -52,6 +53,47 @@ public: char m_saveNameUTF8[128]; }; + class DescriptionData_V2 + { + // this stuff is read from a JSON query, so it all has to be text based, max 256 bytes + public: + char m_platformNone[4]; // set to no platform, to indicate we're using the newer version of the data + char m_descDataVersion[8]; // 4 bytes as hex - version number will be 2 in this case + 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_saveVersion[8]; // 4 bytes as hex + char m_futureData[64]; // some space for future data in case we need to expand this at all + char m_saveNameUTF8[128]; + }; + + class DescriptionDataParsed + { + public: + int m_descDataVersion; + ESavePlatform m_savePlatform; + __int64 m_seed; + uint32_t m_hostOptions; + uint32_t m_texturePack; + uint32_t m_saveVersion; + char m_saveNameUTF8[128]; + }; + + static const int sc_CurrentDescDataVersion = 2; + + void GetDescriptionData(char* descData); + void GetDescriptionData(DescriptionData& descData); + void GetDescriptionData(DescriptionData_V2& descData); + uint32_t GetU32FromHexBytes(char* hexBytes); + uint64_t GetU64FromHexBytes(char* hexBytes); + + void SetU32HexBytes(char* hexBytes, uint32_t u32); + void SetU64HexBytes(char* hexBytes, uint64_t u64); + + DescriptionDataParsed m_retrievedDescData; + void SetRetrievedDescData(); + CallbackFunc m_callbackFunc; void* m_callbackParam; @@ -62,6 +104,7 @@ public: void getSaveInfo(); bool waitingForSaveInfo() { return (m_getInfoStatus == e_gettingInfo); } bool saveIsAvailable(); + bool saveVersionSupported(); int getSaveFilesize(); bool getSaveData(const char* localDirname, CallbackFunc cb, LPVOID lpParam); @@ -115,6 +158,6 @@ protected: bool m_bAborting; bool m_bTransferStarted; - + int m_uploadSaveSize; }; diff --git a/Minecraft.Client/Common/Potion_Macros.h b/Minecraft.Client/Common/Potion_Macros.h index 29f3e03a..d458ac4b 100644 --- a/Minecraft.Client/Common/Potion_Macros.h +++ b/Minecraft.Client/Common/Potion_Macros.h @@ -35,6 +35,8 @@ #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_NIGHTVISION(aux) ((aux & 0x200F) == MASK_NIGHTVISION) +#define MACRO_POTION_IS_INVISIBILITY(aux) ((aux & 0x200F) == MASK_INVISIBILITY) #define MACRO_POTION_IS_SPLASH(aux) ((aux & MASK_SPLASH) == MASK_SPLASH) #define MACRO_POTION_IS_BOTTLE(aux) ((aux & MASK_SPLASH) == 0) diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp index 1367f411..86dbe500 100644 --- a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp +++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp @@ -62,7 +62,7 @@ int DiggerItemHint::attack(shared_ptr item, shared_ptr ent 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 ) + if( entity->instanceof(eTYPE_MOB) ) { return IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL; } diff --git a/Minecraft.Client/Common/Tutorial/FullTutorial.cpp b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp index 123ab9de..d0fda62e 100644 --- a/Minecraft.Client/Common/Tutorial/FullTutorial.cpp +++ b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp @@ -140,7 +140,7 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) 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 PickupTask( Tile::cobblestone_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 ) ); @@ -522,8 +522,8 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) 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) ); + eTutorial_State tradingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Trading, tradingStates, 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) ); @@ -535,6 +535,75 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) } } + /* + * + * + * FIREWORKS + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"fireworksArea"); + if(area != NULL) + { + eTutorial_State fireworkStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Fireworks, fireworkStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Fireworks, new ChoiceTask(this, IDS_TUTORIAL_TASK_FIREWORK_OVERVIEW, IDS_TUTORIAL_PROMPT_FIREWORK_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Trading) ); + + addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_CUSTOMISE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); // + addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_CRAFTING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * BEACON + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"beaconArea"); + if(area != NULL) + { + eTutorial_State beaconStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Beacon, beaconStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Beacon, new ChoiceTask(this, IDS_TUTORIAL_TASK_BEACON_OVERVIEW, IDS_TUTORIAL_PROMPT_BEACON_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Beacon) ); + + addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_DESIGN, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_CHOOSING_POWERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * HOPPER + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"hopperArea"); + if(area != NULL) + { + eTutorial_State hopperStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Hopper, hopperStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Hopper, new ChoiceTask(this, IDS_TUTORIAL_TASK_HOPPER_OVERVIEW, IDS_TUTORIAL_PROMPT_HOPPER_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Hopper) ); + + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_CONTAINERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_MECHANICS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_REDSTONE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_OUTPUT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_AREA, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + /* * * diff --git a/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp new file mode 100644 index 00000000..e1d50fbf --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp @@ -0,0 +1,43 @@ +#include "stdafx.h" + +#include + +#include "Minecraft.h" +#include "Tutorial.h" + +#include "..\Minecraft.World\EntityHorse.h" + +#include "HorseChoiceTask.h" + +HorseChoiceTask::HorseChoiceTask(Tutorial *tutorial, int iDescHorse, int iDescDonkey, int iDescMule, int iPromptId, + bool requiresUserInput, int iConfirmMapping, int iCancelMapping, + eTutorial_CompletionAction cancelAction, ETelemetryChallenges telemetryEvent) + + : ChoiceTask(tutorial, -1, iPromptId, requiresUserInput, iConfirmMapping, iCancelMapping, cancelAction, telemetryEvent) +{ + m_eHorseType = -1; + m_iDescMule = iDescMule; + m_iDescDonkey = iDescDonkey; + m_iDescHorse = iDescHorse; +} + +int HorseChoiceTask::getDescriptionId() +{ + switch (m_eHorseType) + { + case EntityHorse::TYPE_HORSE: return m_iDescHorse; + case EntityHorse::TYPE_DONKEY: return m_iDescDonkey; + case EntityHorse::TYPE_MULE: return m_iDescMule; + default: return -1; + } + return -1; +} + +void HorseChoiceTask::onLookAtEntity(shared_ptr entity) +{ + if ( (m_eHorseType < 0) && entity->instanceof(eTYPE_HORSE) ) + { + shared_ptr horse = dynamic_pointer_cast(entity); + if ( horse->isAdult() ) m_eHorseType = horse->getType(); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h new file mode 100644 index 00000000..5130a7c7 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h @@ -0,0 +1,23 @@ +#pragma once +using namespace std; + +#include "ChoiceTask.h" + + +// Same as choice task, but switches description based on horse type. +class HorseChoiceTask : public ChoiceTask +{ +protected: + int m_eHorseType; + + int m_iDescHorse, m_iDescDonkey, m_iDescMule; + +public: + HorseChoiceTask(Tutorial *tutorial, int iDescHorse, int iDescDonkey, int iDescMule, int iPromptId = -1, + bool requiresUserInput = false, int iConfirmMapping = 0, int iCancelMapping = 0, + eTutorial_CompletionAction cancelAction = e_Tutorial_Completion_None, ETelemetryChallenges telemetryEvent = eTelemetryChallenges_Unknown); + + virtual int getDescriptionId(); + + virtual void onLookAtEntity(shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp index 0a953a7b..c8723a84 100644 --- a/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp +++ b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp @@ -50,15 +50,11 @@ bool LookAtTileHint::onLookAt(int id,int iData) else { message->m_icon = id; - if(m_iDataOverride > -1) - { - message->m_iAuxVal = m_iDataOverride; - } - else - { - message->m_iAuxVal = iData; - } } + + // 4J-JEV: Moved to keep data override even if we're overriding the icon as well. + message->m_iAuxVal = (m_iDataOverride > -1) ? m_iDataOverride : iData; + message->m_messageId = Item::items[id]->getUseDescriptionId(); message->m_titleId = Item::items[id]->getDescriptionId(message->m_iAuxVal); return m_tutorial->setMessage(this, message); diff --git a/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp b/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp new file mode 100644 index 00000000..29fe592d --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp @@ -0,0 +1,30 @@ +#include "stdafx.h" + +#include + +#include "Minecraft.h" +#include "Tutorial.h" + +#include "..\Minecraft.World\EntityHorse.h" + +#include "RideEntityTask.h" + +RideEntityTask::RideEntityTask(const int eType, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ), + m_eType( eType ) +{ +} + +bool RideEntityTask::isCompleted() +{ + return bIsCompleted; +} + +void RideEntityTask::onRideEntity(shared_ptr entity) +{ + if (entity->instanceof((eINSTANCEOF) m_eType)) + { + bIsCompleted = true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/RideEntityTask.h b/Minecraft.Client/Common/Tutorial/RideEntityTask.h new file mode 100644 index 00000000..d9b6d41e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/RideEntityTask.h @@ -0,0 +1,22 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Level; + +// 4J-JEV: Tasks that involve riding an entity. +class RideEntityTask : public TutorialTask +{ +protected: + const int m_eType; + +public: + RideEntityTask(const int eTYPE, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion = false, vector *inConstraints = NULL, + bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true ); + + virtual bool isCompleted(); + + virtual void onRideEntity(shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.cpp b/Minecraft.Client/Common/Tutorial/Tutorial.cpp index b0a0d665..057e2171 100644 --- a/Minecraft.Client/Common/Tutorial/Tutorial.cpp +++ b/Minecraft.Client/Common/Tutorial/Tutorial.cpp @@ -289,9 +289,9 @@ void Tutorial::staticCtor() 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( e_Tutorial_Hint_CommandBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_Beacon ); + s_completableTasks.push_back( e_Tutorial_Hint_Activator_Rail ); s_completableTasks.push_back( eTutorial_Telemetry_TrialStart ); s_completableTasks.push_back( eTutorial_Telemetry_Halfway ); @@ -317,9 +317,31 @@ void Tutorial::staticCtor() 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 ); + s_completableTasks.push_back( e_Tutorial_State_Horse_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Hopper_Menu ); + + s_completableTasks.push_back( e_Tutorial_Hint_Wither ); + s_completableTasks.push_back( e_Tutorial_Hint_Witch ); + s_completableTasks.push_back( e_Tutorial_Hint_Bat ); + s_completableTasks.push_back( e_Tutorial_Hint_Horse ); + + s_completableTasks.push_back( e_Tutorial_Hint_RedstoneBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_DaylightDetector ); + s_completableTasks.push_back( e_Tutorial_Hint_Dropper ); + s_completableTasks.push_back( e_Tutorial_Hint_Hopper ); + s_completableTasks.push_back( e_Tutorial_Hint_Comparator ); + s_completableTasks.push_back( e_Tutorial_Hint_ChestTrap ); + s_completableTasks.push_back( e_Tutorial_Hint_HayBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_ClayHardened ); + s_completableTasks.push_back( e_Tutorial_Hint_ClayHardenedColored ); + s_completableTasks.push_back( e_Tutorial_Hint_CoalBlock ); + + s_completableTasks.push_back( e_Tutorial_State_Beacon_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Fireworks_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Horse ); + s_completableTasks.push_back( e_Tutorial_State_Hopper ); + s_completableTasks.push_back( e_Tutorial_State_Beacon ); + s_completableTasks.push_back( e_Tutorial_State_Fireworks ); if( s_completableTasks.size() > TUTORIAL_PROFILE_STORAGE_BITS ) { @@ -376,10 +398,10 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) /* * TILE HINTS */ - int rockItems[] = {Tile::rock_Id}; + int rockItems[] = {Tile::stone_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}; + int stoneItems[] = {Tile::cobblestone_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}; @@ -438,7 +460,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sandstone, this, sandstoneItems, 1, -1, SandStoneTile::TYPE_SMOOTHSIDE ) ); } - int noteBlockItems[] = {Tile::musicBlock_Id}; + int noteBlockItems[] = {Tile::noteblock_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}; @@ -455,13 +477,13 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::FERN ) ); } - int woolItems[] = {Tile::cloth_Id}; + int woolItems[] = {Tile::wool_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}; + int mushroomItems[] = {Tile::mushroom_brown_Id, Tile::mushroom_red_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}; @@ -499,7 +521,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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}; + int mossStoneItems[] = {Tile::mossyCobblestone_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}; @@ -526,7 +548,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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}; + int cropsItems[] = {Tile::wheat_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}; @@ -544,7 +566,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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}; + int stairsStoneItems[] = {Tile::stairs_stone_Id,Tile::stairs_bricks_Id,Tile::stairs_stoneBrick_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}; @@ -562,7 +584,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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}; + int redstoneTorchItems[] = {Tile::redstoneTorch_off_Id, Tile::redstoneTorch_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}; @@ -583,19 +605,19 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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}; + int recordPlayerItems[] = {Tile::jukebox_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}; + int hellRockItems[] = {Tile::netherRack_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}; + int hellSandItems[] = {Tile::soulsand_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}; + int glowstoneItems[] = {Tile::glowstone_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}; @@ -608,7 +630,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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 ) ); + if(!isHintCompleted(e_Tutorial_Hint_Redstone_Repeater)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Repeater, this, redstoneRepeaterItems, 2, Item::repeater_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 ) ); @@ -622,10 +644,10 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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}; + int stoneBrickSmoothItems[] = {Tile::stoneBrick_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}; + int hugeMushroomItems[] = {Tile::hugeMushroom_brown_Id,Tile::hugeMushroom_red_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}; @@ -673,7 +695,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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}; + int whiteStoneItems[] = {Tile::endStone_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}; @@ -683,7 +705,7 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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 ) ); + if(!isHintCompleted(e_Tutorial_Hint_Cocoa)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cocoa, this, cocoaItems, 1, Item::dye_powder_Id, -1, DyePowderItem::BROWN) ); 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 ) ); @@ -734,6 +756,45 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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 ) ); + + int commandBlockItems[] = {Tile::commandBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_CommandBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_CommandBlock, this, commandBlockItems, 1 ) ); + + int beaconItems[] = {Tile::beacon_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Beacon)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Beacon, this, beaconItems, 1 ) ); + + int activatorRailItems[] = {Tile::activatorRail_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Activator_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Activator_Rail, this, activatorRailItems, 1 ) ); + + int redstoneBlockItems[] = {Tile::redstoneBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_RedstoneBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_RedstoneBlock, this, redstoneBlockItems, 1 ) ); + + int daylightDetectorItems[] = {Tile::daylightDetector_Id}; + if(!isHintCompleted(e_Tutorial_Hint_DaylightDetector)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_DaylightDetector, this, daylightDetectorItems, 1 ) ); + + int dropperItems[] = {Tile::dropper_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Dropper)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Dropper, this, dropperItems, 1 ) ); + + int hopperItems[] = {Tile::hopper_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Hopper)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Hopper, this, hopperItems, 1 ) ); + + int comparatorItems[] = {Tile::comparator_off_Id, Tile::comparator_on_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Comparator)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Comparator, this, comparatorItems, 2, Item::comparator_Id ) ); + + int trappedChestItems[] = {Tile::chest_trap_Id}; + if(!isHintCompleted(e_Tutorial_Hint_ChestTrap)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_ChestTrap, this, trappedChestItems, 1 ) ); + + int hayBlockItems[] = {Tile::hayBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_HayBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_HayBlock, this, hayBlockItems, 1 ) ); + + int clayHardenedItems[] = {Tile::clayHardened_Id}; + if(!isHintCompleted(e_Tutorial_Hint_ClayHardened)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_ClayHardened, this, clayHardenedItems, 1 ) ); + + int clayHardenedColoredItems[] = {Tile::clayHardened_colored_Id}; + if(!isHintCompleted(e_Tutorial_Hint_ClayHardenedColored)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_ClayHardenedColored, this, clayHardenedColoredItems, 1 ) ); + + int coalBlockItems[] = {Tile::coalBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_CoalBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_CoalBlock, this, coalBlockItems, 1 ) ); /* * ENTITY HINTS @@ -760,8 +821,12 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) 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_Ozelot)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Ozelot, this, IDS_DESC_OZELOT, IDS_OZELOT, eTYPE_OCELOT ) ); 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) ); + if(!isHintCompleted(e_Tutorial_Hint_Wither)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Wither, this, IDS_DESC_WITHER, IDS_WITHER, eTYPE_WITHERBOSS) ); + if(!isHintCompleted(e_Tutorial_Hint_Witch)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Witch, this, IDS_DESC_WITCH, IDS_WITCH, eTYPE_WITCH) ); + if(!isHintCompleted(e_Tutorial_Hint_Bat)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Bat, this, IDS_DESC_BAT, IDS_BAT, eTYPE_BAT) ); + if(!isHintCompleted(e_Tutorial_Hint_Horse)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Horse, this, IDS_DESC_HORSE, IDS_HORSE, eTYPE_HORSE) ); /* @@ -929,6 +994,86 @@ Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) } // Other tasks can be added in the derived classes + /* + * + * + * HORSE ENCOUNTER + * + */ + if(isFullTutorial || !isStateCompleted(e_Tutorial_State_Horse) ) + { + addTask(e_Tutorial_State_Horse, + new HorseChoiceTask(this, IDS_TUTORIAL_TASK_HORSE_OVERVIEW, IDS_TUTORIAL_TASK_DONKEY_OVERVIEW, IDS_TUTORIAL_TASK_MULE_OVERVIEW, IDS_TUTORIAL_PROMPT_HORSE_OVERVIEW, + true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Horse) ); + + addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_INTRO, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_TAMING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_TAMING2, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + // 4J-JEV: Only force the RideEntityTask if we're on the full-tutorial. + if (isFullTutorial) addTask(e_Tutorial_State_Horse, new RideEntityTask(eTYPE_HORSE, this, IDS_TUTORIAL_TASK_HORSE_RIDE, true, NULL, false, false, false) ); + else addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_RIDE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_SADDLES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_SADDLEBAGS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Horse, new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_BREEDING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * HORSE MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Horse_Menu ) ) + { + ProcedureCompoundTask *horseMenuTask = new ProcedureCompoundTask( this ); + horseMenuTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_HORSE_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_HORSE_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_HorseMenu) ); + horseMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_MENU_LAYOUT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + horseMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_MENU_EQUIPMENT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + horseMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_HORSE_MENU_SADDLEBAGS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Horse_Menu, horseMenuTask ); + } + + /* + * + * + * FIREWORKS MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Fireworks_Menu ) ) + { + ProcedureCompoundTask *fireworksMenuTask = new ProcedureCompoundTask( this ); + fireworksMenuTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_FIREWORK_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_FireworksMenu) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_STARS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_HEIGHT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_CRAFT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_COLOUR, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_SHAPE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_EFFECT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + fireworksMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_FADE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Fireworks_Menu, fireworksMenuTask ); + } + + /* + * + * + * BEACON MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Beacon_Menu ) ) + { + ProcedureCompoundTask *beaconMenuTask = new ProcedureCompoundTask( this ); + beaconMenuTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_BEACON_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_BEACON_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_BeaconMenu) ); + beaconMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_MENU_PRIMARY_POWERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + beaconMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_MENU_SECONDARY_POWER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + beaconMenuTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_MENU_ACTIVATION, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Beacon_Menu, beaconMenuTask ); + } + /* * * @@ -1203,27 +1348,15 @@ void Tutorial::tick() // 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 + pMinecraft->level->setDayTime(m_iTutorialFreezeTimeValue); // Always daytime + app.SetGameHostOption(eGameHostOption_DoDaylightCycle,0); 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); + MinecraftServer::SetTimeOfDay(m_iTutorialFreezeTimeValue); + pMinecraft->level->setDayTime(m_iTutorialFreezeTimeValue); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle,1); m_timeFrozen = false; } @@ -1569,10 +1702,22 @@ bool Tutorial::setMessage(PopupMessageDetails *message) { TutorialMessage *messageString = it->second; text = wstring( messageString->getMessageForDisplay() ); + + // 4J Stu - Quick fix for boat tutorial being incorrect + if(message->m_messageId == IDS_TUTORIAL_TASK_BOAT_OVERVIEW) + { + text = replaceAll(text, L"{*CONTROLLER_ACTION_USE*}", L"{*CONTROLLER_ACTION_DISMOUNT*}"); + } } else { text = wstring( app.GetString(message->m_messageId) ); + + // 4J Stu - Quick fix for boat tutorial being incorrect + if(message->m_messageId == IDS_TUTORIAL_TASK_BOAT_OVERVIEW) + { + text = replaceAll(text, L"{*CONTROLLER_ACTION_USE*}", L"{*CONTROLLER_ACTION_DISMOUNT*}"); + } } } @@ -1916,7 +2061,7 @@ void Tutorial::onLookAt(int id, int iData) } } -void Tutorial::onLookAtEntity(eINSTANCEOF type) +void Tutorial::onLookAtEntity(shared_ptr entity) { if( m_hintDisplayed ) return; @@ -1924,12 +2069,39 @@ void Tutorial::onLookAtEntity(eINSTANCEOF type) for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) { TutorialHint *hint = *it; - hintNeeded = hint->onLookAtEntity(type); + hintNeeded = hint->onLookAtEntity(entity->GetType()); if(hintNeeded) { break; } } + + if ( (m_CurrentState == e_Tutorial_State_Gameplay) && entity->instanceof(eTYPE_HORSE) ) + { + changeTutorialState(e_Tutorial_State_Horse); + } + + for (AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it != activeTasks[m_CurrentState].end(); ++it) + { + (*it)->onLookAtEntity(entity); + } +} + +void Tutorial::onRideEntity(shared_ptr entity) +{ + if(m_CurrentState == e_Tutorial_State_Gameplay) + { + switch (entity->GetType()) + { + case eTYPE_MINECART: changeTutorialState(e_Tutorial_State_Riding_Minecart); break; + case eTYPE_BOAT: changeTutorialState(e_Tutorial_State_Riding_Boat); break; + } + } + + for (AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it != activeTasks[m_CurrentState].end(); ++it) + { + (*it)->onRideEntity(entity); + } } void Tutorial::onEffectChanged(MobEffect *effect, bool bRemoved) diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.h b/Minecraft.Client/Common/Tutorial/Tutorial.h index aaaaba0a..169c33e3 100644 --- a/Minecraft.Client/Common/Tutorial/Tutorial.h +++ b/Minecraft.Client/Common/Tutorial/Tutorial.h @@ -165,7 +165,8 @@ public: 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 onLookAtEntity(shared_ptr entity); + void onRideEntity(shared_ptr entity); void onEffectChanged(MobEffect *effect, bool bRemoved=false); bool canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt); diff --git a/Minecraft.Client/Common/Tutorial/TutorialEnum.h b/Minecraft.Client/Common/Tutorial/TutorialEnum.h index 33f2e67d..1de6bbad 100644 --- a/Minecraft.Client/Common/Tutorial/TutorialEnum.h +++ b/Minecraft.Client/Common/Tutorial/TutorialEnum.h @@ -62,9 +62,14 @@ enum eTutorial_State 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_Horse, + e_Tutorial_State_Horse_Menu, + e_Tutorial_State_Hopper, + e_Tutorial_State_Hopper_Menu, + e_Tutorial_State_Beacon, + e_Tutorial_State_Beacon_Menu, + e_Tutorial_State_Fireworks, + e_Tutorial_State_Fireworks_Menu, e_Tutorial_State_Max }; @@ -201,9 +206,12 @@ enum eTutorial_Hint e_Tutorial_Hint_EnderDragon, e_Tutorial_Hint_Blaze, e_Tutorial_Hint_Lava_Slime, - e_Tutorial_Hint_Ozelot, e_Tutorial_Hint_Villager, + e_Tutorial_Hint_Wither, + e_Tutorial_Hint_Witch, + e_Tutorial_Hint_Bat, + e_Tutorial_Hint_Horse, e_Tutorial_Hint_Item_Shovel, e_Tutorial_Hint_Item_Hatchet, @@ -292,9 +300,19 @@ enum eTutorial_Hint 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_CommandBlock, + e_Tutorial_Hint_Beacon, + e_Tutorial_Hint_Activator_Rail, + e_Tutorial_Hint_RedstoneBlock, + e_Tutorial_Hint_DaylightDetector, + e_Tutorial_Hint_Dropper, + e_Tutorial_Hint_Hopper, + e_Tutorial_Hint_Comparator, + e_Tutorial_Hint_ChestTrap, + e_Tutorial_Hint_HayBlock, + e_Tutorial_Hint_ClayHardened, + e_Tutorial_Hint_ClayHardenedColored, + e_Tutorial_Hint_CoalBlock, e_Tutorial_Hint_Item_Max, }; diff --git a/Minecraft.Client/Common/Tutorial/TutorialTask.h b/Minecraft.Client/Common/Tutorial/TutorialTask.h index 92cb5999..b589ab27 100644 --- a/Minecraft.Client/Common/Tutorial/TutorialTask.h +++ b/Minecraft.Client/Common/Tutorial/TutorialTask.h @@ -6,6 +6,7 @@ class Level; class Tutorial; class TutorialConstraint; class MobEffect; +class Entity; // A class that represents each individual task in the tutorial. // @@ -33,7 +34,7 @@ protected: vector constraints; bool areConstraintsEnabled; public: - TutorialTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ); + TutorialTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime=false, bool bAllowFade=true, bool bTaskReminders=true ); virtual ~TutorialTask(); virtual int getDescriptionId() { return descriptionId; } @@ -60,4 +61,7 @@ public: 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) { } + + virtual void onLookAtEntity(shared_ptr entity) { } + virtual void onRideEntity(shared_ptr entity) { } }; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialTasks.h b/Minecraft.Client/Common/Tutorial/TutorialTasks.h index 591e9564..b3db973f 100644 --- a/Minecraft.Client/Common/Tutorial/TutorialTasks.h +++ b/Minecraft.Client/Common/Tutorial/TutorialTasks.h @@ -9,6 +9,8 @@ #include "XuiCraftingTask.h" #include "StateChangeTask.h" #include "ChoiceTask.h" +#include "HorseChoiceTask.h" +#include "RideEntityTask.h" #include "FullTutorialActiveTask.h" #include "AreaTask.h" #include "ProgressFlagTask.h" diff --git a/Minecraft.Client/Common/Tutorial/UseItemTask.h b/Minecraft.Client/Common/Tutorial/UseItemTask.h index 46d71be4..6c729540 100644 --- a/Minecraft.Client/Common/Tutorial/UseItemTask.h +++ b/Minecraft.Client/Common/Tutorial/UseItemTask.h @@ -10,7 +10,6 @@ class UseItemTask : public TutorialTask { private: const int itemId; - bool completed; public: UseItemTask(const int itemId, Tutorial *tutorial, int descriptionId, diff --git a/Minecraft.Client/Common/UI/IUIController.h b/Minecraft.Client/Common/UI/IUIController.h index 319185d8..3040c2cc 100644 --- a/Minecraft.Client/Common/UI/IUIController.h +++ b/Minecraft.Client/Common/UI/IUIController.h @@ -29,7 +29,7 @@ public: 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 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, int iRS=-1, int iBack=-1, bool forceUpdate = false) = 0; virtual void EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ) = 0; virtual void RefreshTooltips(unsigned int iPad) = 0; diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp index cc1c1b82..ffe83081 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp @@ -104,7 +104,7 @@ int IUIScene_AbstractContainerMenu::GetSectionDimensions( ESceneSection eSection return( ( *piNumRows ) * ( *piNumColumns ) ); } -void IUIScene_AbstractContainerMenu::updateSlotPosition( ESceneSection eSection, ESceneSection newSection, ETapState eTapDirection, int *piTargetX, int *piTargetY, int xOffset ) +void IUIScene_AbstractContainerMenu::updateSlotPosition( ESceneSection eSection, ESceneSection newSection, ETapState eTapDirection, int *piTargetX, int *piTargetY, int xOffset, int yOffset ) { // Update the target slot based on the size of the current section int columns, rows; @@ -124,10 +124,19 @@ void IUIScene_AbstractContainerMenu::updateSlotPosition( ESceneSection eSection, { (*piTargetY) = 0; } - if( (*piTargetY) < 0 ) + int offsetY = (*piTargetY) - yOffset; + if( offsetY < 0 ) { (*piTargetY) = 0; } + else if(offsetY >= rows) + { + (*piTargetY) = rows - 1; + } + else + { + (*piTargetY) = offsetY; + } // Update X int offsetX = (*piTargetX) - xOffset; @@ -340,124 +349,124 @@ void IUIScene_AbstractContainerMenu::onMouseTick() { // 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; + // 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 ); + // Check for potential tap input to jump slot. + ETapState eNewTapInput = GetTapInputType( fInputX, fInputY ); - switch( m_eCurrTapState ) + switch( m_eCurrTapState ) + { + case eTapStateNoInput: + m_eCurrTapState = eNewTapInput; + break; + + case eTapStateUp: + case eTapStateDown: + case eTapStateLeft: + case eTapStateRight: + if ( ( eNewTapInput != m_eCurrTapState ) && ( eNewTapInput != eTapStateNoInput ) ) { - 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; + // 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; + // 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) ); - } + // 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; - } + 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; + // 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; - } + fInputX *= fInputScale; + fInputY *= fInputScale; - 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 ); +#ifdef USE_POINTER_ACCEL + m_fPointerAccelX += fInputX / 50.0f; + m_fPointerAccelY += fInputY / 50.0f; - 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; + if ( fabsf( fInputX ) > fabsf( m_fPointerVelX + m_fPointerAccelX ) ) + { + m_fPointerVelX += m_fPointerAccelX; + } + else + { + m_fPointerAccelX = fInputX - m_fPointerVelX; + m_fPointerVelX = fInputX; + } - bStickInput = true; + if ( fabsf( fInputY ) > fabsf( m_fPointerVelY + m_fPointerAccelY ) ) + { + m_fPointerVelY += m_fPointerAccelY; } 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 + 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__ } @@ -589,6 +598,9 @@ void IUIScene_AbstractContainerMenu::onMouseTick() } } + // 4J - TomK - set to section none if this is a non-visible section + if(!IsVisible(eSectionUnderPointer)) eSectionUnderPointer = eSectionNone; + // If we are not over any slot, set focus elsewhere. if ( eSectionUnderPointer == eSectionNone ) { @@ -768,20 +780,26 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if( bPointerIsOverSlot && bSlotHasItem ) { - vector unformattedStrings; - wstring desc = GetItemDescription( slot, unformattedStrings ); - SetPointerText(desc, unformattedStrings, slot != m_lastPointerLabelSlot); + vector *desc = GetItemDescription(slot); + SetPointerText(desc, slot != m_lastPointerLabelSlot); m_lastPointerLabelSlot = slot; + delete desc; + } + else if (eSectionUnderPointer != eSectionNone && !IsSectionSlotList(eSectionUnderPointer) ) + { + vector *desc = GetSectionHoverText(eSectionUnderPointer); + SetPointerText(desc, false); + m_lastPointerLabelSlot = NULL; + delete desc; } else { - vector unformattedStrings; - SetPointerText(L"", unformattedStrings, false); + SetPointerText(NULL, false); m_lastPointerLabelSlot = NULL; } - EToolTipItem buttonA, buttonX, buttonY, buttonRT; - buttonA = buttonX = buttonY = buttonRT = eToolTipNone; + EToolTipItem buttonA, buttonX, buttonY, buttonRT, buttonBack; + buttonA = buttonX = buttonY = buttonRT = buttonBack = eToolTipNone; if ( bPointerIsOverSlot ) { SetPointerOutsideMenu( false ); @@ -865,13 +883,22 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if ( iSlotCount == 1 ) { buttonA = eToolTipPickUpGeneric; - buttonRT = eToolTipWhatIsThis; } else { // Multiple items in slot. buttonA = eToolTipPickUpAll; buttonX = eToolTipPickUpHalf; + } + +#ifdef __PSVITA__ + if (!InputManager.IsVitaTV()) + { + buttonBack = eToolTipWhatIsThis; + } + else +#endif + { buttonRT = eToolTipWhatIsThis; } } @@ -1051,7 +1078,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() bool bValidIngredient=false; //bool bValidIngredientBottom=false; - if(Item::items[iId]->hasPotionBrewingFormula() || (iId == Item::netherStalkSeeds_Id)) + if(Item::items[iId]->hasPotionBrewingFormula() || (iId == Item::netherwart_seeds_Id)) { bValidIngredient=true; } @@ -1124,10 +1151,10 @@ void IUIScene_AbstractContainerMenu::onMouseTick() 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_leather_Id: + case Item::chestplate_leather_Id: + case Item::leggings_leather_Id: + case Item::boots_leather_Id: case Item::helmet_chain_Id: case Item::chestplate_chain_Id: @@ -1201,13 +1228,13 @@ void IUIScene_AbstractContainerMenu::onMouseTick() shared_ptr item = nullptr; if(bPointerIsOverSlot && bSlotHasItem) item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); - overrideTooltips(eSectionUnderPointer, item, bIsItemCarried, bSlotHasItem, bCarriedIsSameAsSlot, iSlotStackSizeRemaining, buttonA, buttonX, buttonY, buttonRT); + overrideTooltips(eSectionUnderPointer, item, bIsItemCarried, bSlotHasItem, bCarriedIsSameAsSlot, iSlotStackSizeRemaining, buttonA, buttonX, buttonY, buttonRT, buttonBack); SetToolTip( eToolTipButtonA, buttonA ); SetToolTip( eToolTipButtonX, buttonX ); SetToolTip( eToolTipButtonY, buttonY ); SetToolTip( eToolTipButtonRT, buttonRT ); - + SetToolTip( eToolTipButtonBack, buttonBack ); // Offset back to image top left. vPointerPos.x -= m_fPointerImageOffsetX; @@ -1278,7 +1305,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b BOOL quickKeyHeld=FALSE; // Represents shift key on PC BOOL validKeyPress = FALSE; - //BOOL itemEditorKeyPress = FALSE; + bool itemEditorKeyPress = false; // Ignore input from other players //if(pMinecraft->player->GetXboxPad()!=pInputData->UserIndex) return S_OK; @@ -1286,11 +1313,9 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b switch(iAction) { #ifdef _DEBUG_MENUS_ENABLED -#if TO_BE_IMPLEMENTED - case VK_PAD_RTHUMB_PRESS: + case ACTION_MENU_OTHER_STICK_PRESS: itemEditorKeyPress = TRUE; break; -#endif #endif case ACTION_MENU_A: #ifdef __ORBIS__ @@ -1419,13 +1444,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b 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 ) ) { @@ -1491,46 +1510,18 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b 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 ); + if( IsSectionSlotList( m_eCurrSection ) ) + { + ItemEditorInput *initData = new ItemEditorInput(); + initData->iPad = getPad(); + initData->slot = getSlot( m_eCurrSection, getCurrentIndex(m_eCurrSection) ); 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); + ui.NavigateToScene(getPad(),eUIScene_DebugItemEditor,(void *)initData); } } -#endif #endif else { @@ -1552,7 +1543,7 @@ void IUIScene_AbstractContainerMenu::handleOutsideClicked(int iPad, int buttonNu // 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); + slotClicked(AbstractContainerMenu::SLOT_CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false); } void IUIScene_AbstractContainerMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) @@ -1597,8 +1588,7 @@ bool IUIScene_AbstractContainerMenu::IsSameItemAs(shared_ptr itemA { if(itemA == NULL || itemB == NULL) return false; - bool bStackedByData = itemA->isStackedByData(); - return ( ( itemA->id == itemB->id ) && ( (bStackedByData && itemA->getAuxValue() == itemB->getAuxValue()) || !bStackedByData ) ); + return (itemA->id == itemB->id && (!itemB->isStackedByData() || itemB->getAuxValue() == itemA->getAuxValue()) && ItemInstance::tagMatches(itemB, itemA) ); } int IUIScene_AbstractContainerMenu::GetEmptyStackSpace(Slot *slot) @@ -1622,38 +1612,27 @@ int IUIScene_AbstractContainerMenu::GetEmptyStackSpace(Slot *slot) return iResult; } -wstring IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slot, vector &unformattedStrings) +vector *IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slot) { - if(slot == NULL) return L""; + if(slot == NULL) return NULL; + + vector *lines = slot->getItem()->getHoverText(nullptr, false); - wstring desc = L""; - vector *strings = slot->getItem()->getHoverText(nullptr, false, unformattedStrings); - bool firstLine = true; - for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) + // Add rarity to first line + if (lines->size() > 0) { - wstring thisString = *it; - if(!firstLine) + lines->at(0).color = slot->getItem()->getRarity()->color; + + if(slot->getItem()->hasCustomHoverName()) { - desc.append( L"
" ); + lines->at(0).color = eTextColor_RenamedItemTitle; } - 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); - } + return lines; +} - swprintf(formatted, 256, L"%ls",colour,thisString.c_str()); - thisString = formatted; - } - desc.append( thisString ); - } - strings->clear(); - delete strings; - return desc; +vector *IUIScene_AbstractContainerMenu::GetSectionHoverText(ESceneSection eSection) +{ + return NULL; } diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h index bdb8bb4c..7d16f522 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h @@ -52,7 +52,6 @@ protected: eSectionInventoryCreativeUsing, eSectionInventoryCreativeSelector, -#ifndef _XBOX eSectionInventoryCreativeTab_0, eSectionInventoryCreativeTab_1, eSectionInventoryCreativeTab_2, @@ -62,7 +61,6 @@ protected: eSectionInventoryCreativeTab_6, eSectionInventoryCreativeTab_7, eSectionInventoryCreativeSlider, -#endif eSectionInventoryCreativeMax, eSectionEnchantUsing, @@ -88,6 +86,37 @@ protected: eSectionAnvilResult, eSectionAnvilName, eSectionAnvilMax, + + eSectionBeaconUsing, + eSectionBeaconInventory, + eSectionBeaconItem, + eSectionBeaconPrimaryTierOneOne, + eSectionBeaconPrimaryTierOneTwo, + eSectionBeaconPrimaryTierTwoOne, + eSectionBeaconPrimaryTierTwoTwo, + eSectionBeaconPrimaryTierThree, + eSectionBeaconSecondaryOne, + eSectionBeaconSecondaryTwo, + eSectionBeaconConfirm, + eSectionBeaconMax, + + eSectionHopperUsing, + eSectionHopperInventory, + eSectionHopperContents, + eSectionHopperMax, + + eSectionHorseUsing, + eSectionHorseInventory, + eSectionHorseChest, + eSectionHorseArmor, + eSectionHorseSaddle, + eSectionHorseMax, + + eSectionFireworksUsing, + eSectionFireworksInventory, + eSectionFireworksResult, + eSectionFireworksIngredients, + eSectionFireworksMax, }; AbstractContainerMenu* m_menu; @@ -162,13 +191,14 @@ protected: virtual bool IsSectionSlotList( ESceneSection eSection ) { return eSection != eSectionNone; } virtual bool CanHaveFocus( ESceneSection eSection ) { return true; } + virtual bool IsVisible( 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 ); + void updateSlotPosition( ESceneSection eSection, ESceneSection newSection, ETapState eTapDirection, int *piTargetX, int *piTargetY, int xOffset = 0, int yOffset = 0 ); #ifdef TAP_DETECTION ETapState GetTapInputType( float fInputX, float fInputY ); @@ -200,18 +230,32 @@ protected: 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 void SetPointerText(vector *description, bool newSlot) = 0; + virtual vector *GetSectionHoverText(ESceneSection eSection); virtual shared_ptr getSlotItem(ESceneSection eSection, int iSlot) = 0; + virtual Slot *getSlot(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; } + virtual bool overrideTooltips( + ESceneSection sectionUnderPointer, + shared_ptr itemUnderPointer, + bool bIsItemCarried, + bool bSlotHasItem, + bool bCarriedIsSameAsSlot, + int iSlotStackSizeRemaining, + EToolTipItem &buttonA, + EToolTipItem &buttonX, + EToolTipItem &buttonY, + EToolTipItem &buttonRT, + EToolTipItem &buttonBack + ) { return false; } private: bool IsSameItemAs(shared_ptr itemA, shared_ptr itemB); int GetEmptyStackSpace(Slot *slot); - wstring GetItemDescription(Slot *slot, vector &unformattedStrings); + + vector *GetItemDescription(Slot *slot); protected: diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp index 81451c7a..10d1bcc4 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp @@ -206,7 +206,7 @@ void IUIScene_AnvilMenu::handleTick() m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); canAfford = false; } - else if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem()) + else if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->hasItem()) { // Do nothing } @@ -216,7 +216,7 @@ void IUIScene_AnvilMenu::handleTick() 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()))) + if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) { canAfford = false; } @@ -224,13 +224,13 @@ void IUIScene_AnvilMenu::handleTick() } 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(); + bool crossVisible = (m_repairMenu->getSlot(AnvilMenu::INPUT_SLOT)->hasItem() || m_repairMenu->getSlot(AnvilMenu::ADDITIONAL_SLOT)->hasItem()) && !m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->hasItem(); showCross(crossVisible); } void IUIScene_AnvilMenu::updateItemName() { - Slot *slot = m_repairMenu->getSlot(RepairMenu::INPUT_SLOT); + Slot *slot = m_repairMenu->getSlot(AnvilMenu::INPUT_SLOT); if (slot != NULL && slot->hasItem()) { if (!slot->getItem()->hasCustomHoverName() && m_itemName.compare(slot->getItem()->getHoverName())==0) @@ -250,12 +250,12 @@ void IUIScene_AnvilMenu::updateItemName() void IUIScene_AnvilMenu::refreshContainer(AbstractContainerMenu *container, vector > *items) { - slotChanged(container, RepairMenu::INPUT_SLOT, container->getSlot(0)->getItem()); + slotChanged(container, AnvilMenu::INPUT_SLOT, container->getSlot(0)->getItem()); } void IUIScene_AnvilMenu::slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item) { - if (slotIndex == RepairMenu::INPUT_SLOT) + if (slotIndex == AnvilMenu::INPUT_SLOT) { m_itemName = item == NULL ? L"" : item->getHoverName(); setEditNameValue(m_itemName); diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h index 6c4348f2..4e9e3aa7 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h @@ -11,13 +11,13 @@ #define ANVIL_SCENE_ITEM2_SLOT_DOWN_OFFSET 4 class Inventory; -class RepairMenu; +class AnvilMenu; class IUIScene_AnvilMenu : public virtual IUIScene_AbstractContainerMenu, public net_minecraft_world_inventory::ContainerListener { protected: shared_ptr m_inventory; - RepairMenu *m_repairMenu; + AnvilMenu *m_repairMenu; wstring m_itemName; protected: diff --git a/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp new file mode 100644 index 00000000..76d21406 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp @@ -0,0 +1,410 @@ +#include "stdafx.h" +#include "..\Minecraft.World\CustomPayloadPacket.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\Minecraft.World\HtmlString.h" +#include "IUIScene_BeaconMenu.h" +#include "Minecraft.h" +#include "MultiPlayerLocalPlayer.h" +#include "ClientConnection.h" + +IUIScene_BeaconMenu::IUIScene_BeaconMenu() +{ + m_beacon = nullptr; + m_initPowerButtons = true; +} + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_BeaconMenu::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 eSectionBeaconInventory: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconUsing; + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX < 4 ) + { + newSection = eSectionBeaconPrimaryTierThree; + } + else if ( *piTargetX < 7) + { + newSection = eSectionBeaconItem; + } + else + { + newSection = eSectionBeaconConfirm; + } + } + break; + case eSectionBeaconUsing: + if(eTapDirection == eTapStateDown) + { + if( *piTargetX < 2) + { + newSection = eSectionBeaconPrimaryTierOneOne; + } + else if( *piTargetX < 5) + { + newSection = eSectionBeaconPrimaryTierOneTwo; + } + else if( *piTargetX > 8 && GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) + { + newSection = eSectionBeaconSecondaryTwo; + } + else + { + newSection = eSectionBeaconSecondaryOne; + } + } + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconInventory; + break; + case eSectionBeaconItem: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionBeaconInventory; + xOffset = -5; + } + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconSecondaryOne; + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconConfirm; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconConfirm; + break; + case eSectionBeaconPrimaryTierOneOne: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierTwoOne; + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconUsing; + xOffset = -1; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierOneTwo; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierOneTwo; + break; + case eSectionBeaconPrimaryTierOneTwo: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierTwoTwo; + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconUsing; + xOffset = -3; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierOneOne; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierOneOne; + break; + case eSectionBeaconPrimaryTierTwoOne: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierThree; + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierOneOne; + else if(eTapDirection == eTapStateLeft) + { + if(GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) + { + newSection = eSectionBeaconSecondaryTwo; + } + else + { + newSection = eSectionBeaconSecondaryOne; + } + } + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierTwoTwo; + break; + case eSectionBeaconPrimaryTierTwoTwo: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierThree; + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierOneTwo; + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierTwoOne; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconSecondaryOne; + break; + case eSectionBeaconPrimaryTierThree: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionBeaconInventory; + xOffset = -3; + } + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierTwoOne; + break; + case eSectionBeaconSecondaryOne: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconItem; + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconUsing; + xOffset = -7; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierTwoTwo; + else if(eTapDirection == eTapStateRight) + { + if(GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) + { + newSection = eSectionBeaconSecondaryTwo; + } + else + { + newSection = eSectionBeaconPrimaryTierTwoOne; + } + } + break; + case eSectionBeaconSecondaryTwo: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconItem; + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconUsing; + xOffset = -8; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconSecondaryOne; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierTwoOne; + break; + case eSectionBeaconConfirm: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionBeaconInventory; + xOffset = -8; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconSecondaryOne; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconItem; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconItem; + break; + default: + assert(false); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_BeaconMenu::getSectionStartOffset(IUIScene_AbstractContainerMenu::ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionBeaconItem: + offset = BeaconMenu::PAYMENT_SLOT; + break; + case eSectionBeaconInventory: + offset = BeaconMenu::INV_SLOT_START; + break; + case eSectionBeaconUsing: + offset = BeaconMenu::USE_ROW_SLOT_START; + break; + default: + assert( false ); + break; + } + return offset; +} + +bool IUIScene_BeaconMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionBeaconItem: + case eSectionBeaconInventory: + case eSectionBeaconUsing: + return true; + } + return false; +} + +void IUIScene_BeaconMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + switch(eSection) + { + case eSectionBeaconConfirm: + { + if( (m_beacon->getItem(0) == NULL) || (m_beacon->getPrimaryPower() <= 0) ) return; + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + dos.writeInt(m_beacon->getPrimaryPower()); + dos.writeInt(m_beacon->getSecondaryPower()); + + Minecraft::GetInstance()->localplayers[getPad()]->connection->send(shared_ptr(new CustomPayloadPacket(CustomPayloadPacket::SET_BEACON_PACKET, baos.toByteArray()))); + + if (m_beacon->getPrimaryPower() > 0) + { + int effectId = m_beacon->getPrimaryPower(); + + bool active = true; + bool selected = false; + + int tier = 3; + if (tier >= m_beacon->getLevels()) + { + active = false; + } + else if (effectId == m_beacon->getSecondaryPower()) + { + selected = true; + } + + AddPowerButton(GetId(tier, m_beacon->getPrimaryPower()), MobEffect::effects[m_beacon->getPrimaryPower()]->getIcon(), tier, 1, active, selected); + } + } + break; + case eSectionBeaconPrimaryTierOneOne: + case eSectionBeaconPrimaryTierOneTwo: + case eSectionBeaconPrimaryTierTwoOne: + case eSectionBeaconPrimaryTierTwoTwo: + case eSectionBeaconPrimaryTierThree: + case eSectionBeaconSecondaryOne: + case eSectionBeaconSecondaryTwo: + if(IsPowerButtonSelected(eSection)) + { + return; + } + + int id = GetPowerButtonId(eSection); + int effectId = (id & 0xff); + int tier = (id >> 8); + + if (tier < 3) + { + m_beacon->setPrimaryPower(effectId); + } + else + { + m_beacon->setSecondaryPower(effectId); + } + SetPowerButtonSelected(eSection); + break; + }; +} + +void IUIScene_BeaconMenu::handleTick() +{ + if (m_initPowerButtons && m_beacon->getLevels() >= 0) + { + m_initPowerButtons = false; + for (int tier = 0; tier <= 2; tier++) + { + int count = BeaconTileEntity::BEACON_EFFECTS_EFFECTS;//BEACON_EFFECTS[tier].length; + int totalWidth = count * 22 + (count - 1) * 2; + + for (int c = 0; c < count; c++) + { + if(BeaconTileEntity::BEACON_EFFECTS[tier][c] == NULL) continue; + + int effectId = BeaconTileEntity::BEACON_EFFECTS[tier][c]->id; + int icon = BeaconTileEntity::BEACON_EFFECTS[tier][c]->getIcon(); + + bool active = true; + bool selected = false; + + if (tier >= m_beacon->getLevels()) + { + active = false; + } + else if (effectId == m_beacon->getPrimaryPower()) + { + selected = true; + } + + AddPowerButton(GetId(tier, effectId), icon, tier, c, active, selected); + } + } + + { + int tier = 3; + + int count = BeaconTileEntity::BEACON_EFFECTS_EFFECTS + 1;//BEACON_EFFECTS[tier].length + 1; + int totalWidth = count * 22 + (count - 1) * 2; + + for (int c = 0; c < count - 1; c++) + { + if(BeaconTileEntity::BEACON_EFFECTS[tier][c] == NULL) continue; + + int effectId = BeaconTileEntity::BEACON_EFFECTS[tier][c]->id; + int icon = BeaconTileEntity::BEACON_EFFECTS[tier][c]->getIcon(); + + bool active = true; + bool selected = false; + + if (tier >= m_beacon->getLevels()) + { + active = false; + } + else if (effectId == m_beacon->getSecondaryPower()) + { + selected = true; + } + + AddPowerButton(GetId(tier, effectId), icon, tier, c, active, selected); + } + if (m_beacon->getPrimaryPower() > 0) + { + int effectId = m_beacon->getPrimaryPower(); + + bool active = true; + bool selected = false; + + if (tier >= m_beacon->getLevels()) + { + active = false; + } + else if (effectId == m_beacon->getSecondaryPower()) + { + selected = true; + } + + AddPowerButton(GetId(tier, m_beacon->getPrimaryPower()), MobEffect::effects[m_beacon->getPrimaryPower()]->getIcon(), tier, 1, active, selected); + } + } + } + + SetConfirmButtonEnabled( (m_beacon->getItem(0) != NULL) && (m_beacon->getPrimaryPower() > 0) ); +} + +int IUIScene_BeaconMenu::GetId(int tier, int effectId) +{ + return (tier << 8) | effectId; +} + +vector *IUIScene_BeaconMenu::GetSectionHoverText(ESceneSection eSection) +{ + vector *desc = NULL; + switch(eSection) + { + case eSectionBeaconSecondaryTwo: + if(GetPowerButtonId(eSectionBeaconSecondaryTwo) == 0) + { + // This isn't visible + break; + } + // Fall through otherwise + case eSectionBeaconPrimaryTierOneOne: + case eSectionBeaconPrimaryTierOneTwo: + case eSectionBeaconPrimaryTierTwoOne: + case eSectionBeaconPrimaryTierTwoTwo: + case eSectionBeaconPrimaryTierThree: + case eSectionBeaconSecondaryOne: + { + int id = GetPowerButtonId(eSection); + int effectId = (id & 0xff); + + desc = new vector(); + + HtmlString string( app.GetString(MobEffect::effects[effectId]->getDescriptionId()), eHTMLColor_White ); + desc->push_back( string ); + } + break; + } + return desc; +} + +bool IUIScene_BeaconMenu::IsVisible( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionBeaconSecondaryTwo: + if(GetPowerButtonId(eSectionBeaconSecondaryTwo) == 0) + { + // This isn't visible + return false; + } + } + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.h b/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.h new file mode 100644 index 00000000..1f5f7340 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.h @@ -0,0 +1,31 @@ +#pragma once +#include "Common\UI\IUIScene_AbstractContainerMenu.h" + +class BeaconTileEntity; + +class IUIScene_BeaconMenu : public virtual IUIScene_AbstractContainerMenu +{ +public: + IUIScene_BeaconMenu(); + + 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); + virtual bool IsSectionSlotList( ESceneSection eSection ); + virtual vector *GetSectionHoverText(ESceneSection eSection); + bool IsVisible( ESceneSection eSection ); + +protected: + void handleTick(); + int GetId(int tier, int effectId); + + virtual void SetConfirmButtonEnabled(bool enabled) = 0; + virtual void AddPowerButton(int id, int icon, int tier, int count, bool active, bool selected) = 0; + virtual int GetPowerButtonId(ESceneSection eSection) = 0; + virtual bool IsPowerButtonSelected(ESceneSection eSection) = 0; + virtual void SetPowerButtonSelected(ESceneSection eSection) = 0; + + shared_ptr m_beacon; + bool m_initPowerButtons; +}; + diff --git a/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.cpp new file mode 100644 index 00000000..4371b4e5 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" +#include "../../../Minecraft.World/CustomPayloadPacket.h" +#include "MultiPlayerLocalPlayer.h" +#include "ClientConnection.h" +#include "IUIScene_CommandBlockMenu.h" + +void IUIScene_CommandBlockMenu::Initialise(CommandBlockEntity *commandBlock) +{ + m_commandBlock = commandBlock; + SetCommand(m_commandBlock->getCommand()); +} + +void IUIScene_CommandBlockMenu::ConfirmButtonClicked() +{ + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + + dos.writeInt(m_commandBlock->x); + dos.writeInt(m_commandBlock->y); + dos.writeInt(m_commandBlock->z); + dos.writeUTF(GetCommand()); + + Minecraft::GetInstance()->localplayers[GetPad()]->connection->send(shared_ptr(new CustomPayloadPacket(CustomPayloadPacket::SET_ADVENTURE_COMMAND_PACKET, baos.toByteArray()))); +} + diff --git a/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.h b/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.h new file mode 100644 index 00000000..db0aff82 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.h @@ -0,0 +1,18 @@ +#pragma once +#include "../Minecraft.World/net.minecraft.world.level.tile.entity.h" + +class IUIScene_CommandBlockMenu +{ +public: + void Initialise(CommandBlockEntity *commandBlock); + +protected: + void ConfirmButtonClicked(); + + virtual wstring GetCommand(); + virtual void SetCommand(wstring command); + virtual int GetPad(); + +private: + CommandBlockEntity *m_commandBlock; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp index f158b174..05a44202 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp @@ -267,65 +267,68 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) //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;iid != Item::fireworksCharge_Id && pTempItemInst->id != Item::fireworks_Id) { - for(int j=0;j ingItemInst = nullptr; - // do we need to remove a specific aux value? - if(pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]!=Recipes::ANY_AUX_VALUE) + for(int j=0;jinventory->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()) + shared_ptr 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 { - // replace item with remaining result - m_pPlayer->inventory->add( shared_ptr( new ItemInstance(ingItemInst->getItem()->getCraftingRemainingItem()) ) ); + 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 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; - } + //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(); + // 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 { @@ -1067,35 +1070,43 @@ void IUIScene_CraftingMenu::DisplayIngredients() int id=pRecipeIngredientsRequired[iRecipe].iIngIDA[i]; int iAuxVal=pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]; Item *item = Item::items[id]; - if( (iAuxVal & 0xFF) == 0xFF) // 4J Stu - If the aux value is set to match any - iAuxVal = 0; - - // 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(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)) ) + if( ((pTempItemInst->id==Item::bed_Id) &&(id==Tile::wool_Id)) || + ((pTempItemInst->id==Item::painting_Id) &&(id==Tile::wool_Id)) ) { idescID=IDS_ANY_WOOL; } + else if((pTempItemInst->id==Item::fireworksCharge_Id) && (id==Item::dye_powder_Id)) + { + idescID=IDS_ITEM_DYE_POWDER; + iAuxVal = 1; + } else { idescID=itemInst->getDescriptionId(); } setIngredientDescriptionText(i,app.GetString(idescID)); + + + if( (iAuxVal & 0xFF) == 0xFF) // 4J Stu - If the aux value is set to match any + iAuxVal = 0; + + // 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; + } + itemInst->setAuxValue(iAuxVal); + + setIngredientDescriptionItem(getPad(),i,itemInst); + setIngredientDescriptionRedBox(i,false); } // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture @@ -1141,6 +1152,10 @@ void IUIScene_CraftingMenu::DisplayIngredients() { iAuxVal = 0xFF; } + else if( pTempItemInst->id==Item::fireworksCharge_Id && id == Item::dye_powder_Id) + { + iAuxVal = 1; + } 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 @@ -1368,6 +1383,15 @@ void IUIScene_CraftingMenu::UpdateTooltips() }*/ } +void IUIScene_CraftingMenu::HandleInventoryUpdated() +{ + // Check which recipes are available with the resources we have + CheckRecipesAvailable(); + UpdateVerticalSlots(); + UpdateHighlight(); + UpdateTooltips(); +} + bool IUIScene_CraftingMenu::isItemSelected(int itemId) { bool isSelected = false; diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h index 05227fff..03a58378 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h @@ -86,6 +86,7 @@ protected: void DisplayIngredients(); void UpdateTooltips(); void UpdateDescriptionText(bool); + void HandleInventoryUpdated(); public: Recipy::_eGroupType getCurrentGroup() { return m_pGroupA[m_iGroupIndex]; } diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp index 7ce33234..c3348e58 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp @@ -8,6 +8,9 @@ #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" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "..\..\..\Minecraft.World\JavaMath.h" // 4J JEV - Images for each tab. IUIScene_CreativeMenu::TabSpec **IUIScene_CreativeMenu::specs = NULL; @@ -26,14 +29,15 @@ void IUIScene_CreativeMenu::staticCtor() // Building Blocks DEF(eCreativeInventory_BuildingBlocks) - ITEM(Tile::rock_Id) + ITEM(Tile::stone_Id) ITEM(Tile::grass_Id) ITEM(Tile::dirt_Id) - ITEM(Tile::stoneBrick_Id) + ITEM(Tile::cobblestone_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::coalBlock_Id) ITEM(Tile::goldBlock_Id) ITEM(Tile::ironBlock_Id) ITEM(Tile::lapisBlock_Id) @@ -59,24 +63,29 @@ void IUIScene_CreativeMenu::staticCtor() ITEM_AUX(Tile::treeTrunk_Id, TreeTile::JUNGLE_TRUNK) ITEM(Tile::gravel_Id) ITEM(Tile::redBrick_Id) - ITEM(Tile::mossStone_Id) + ITEM(Tile::mossyCobblestone_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(Tile::netherRack_Id) + ITEM(Tile::soulsand_Id) + ITEM(Tile::glowstone_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_AUX(Tile::stoneBrick_Id,SmoothStoneBrickTile::TYPE_DEFAULT) + ITEM_AUX(Tile::stoneBrick_Id,SmoothStoneBrickTile::TYPE_MOSSY) + ITEM_AUX(Tile::stoneBrick_Id,SmoothStoneBrickTile::TYPE_CRACKED) + ITEM_AUX(Tile::stoneBrick_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(Tile::endStone_Id) ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_CHISELED) ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_LINES_Y) ITEM(Tile::trapdoor_Id) @@ -102,11 +111,28 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Tile::stairs_junglewood_Id) ITEM(Tile::stairs_stone_Id) ITEM(Tile::stairs_bricks_Id) - ITEM(Tile::stairs_stoneBrickSmooth_Id) + ITEM(Tile::stairs_stoneBrick_Id) ITEM(Tile::stairs_netherBricks_Id) ITEM(Tile::stairs_sandstone_Id) ITEM(Tile::stairs_quartz_Id) + ITEM(Tile::clayHardened_Id) + ITEM_AUX(Tile::clayHardened_colored_Id,14) // Red + ITEM_AUX(Tile::clayHardened_colored_Id,1) // Orange + ITEM_AUX(Tile::clayHardened_colored_Id,4) // Yellow + ITEM_AUX(Tile::clayHardened_colored_Id,5) // Lime + ITEM_AUX(Tile::clayHardened_colored_Id,3) // Light Blue + ITEM_AUX(Tile::clayHardened_colored_Id,9) // Cyan + ITEM_AUX(Tile::clayHardened_colored_Id,11) // Blue + ITEM_AUX(Tile::clayHardened_colored_Id,10) // Purple + ITEM_AUX(Tile::clayHardened_colored_Id,2) // Magenta + ITEM_AUX(Tile::clayHardened_colored_Id,6) // Pink + ITEM_AUX(Tile::clayHardened_colored_Id,0) // White + ITEM_AUX(Tile::clayHardened_colored_Id,8) // Light Gray + ITEM_AUX(Tile::clayHardened_colored_Id,7) // Gray + ITEM_AUX(Tile::clayHardened_colored_Id,15) // Black + ITEM_AUX(Tile::clayHardened_colored_Id,13) // Green + ITEM_AUX(Tile::clayHardened_colored_Id,12) // Brown // Decoration DEF(eCreativeInventory_Decoration) @@ -136,8 +162,8 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Tile::deadBush_Id) ITEM(Tile::flower_Id) ITEM(Tile::rose_Id) - ITEM(Tile::mushroom1_Id) - ITEM(Tile::mushroom2_Id) + ITEM(Tile::mushroom_brown_Id) + ITEM(Tile::mushroom_red_Id) ITEM(Tile::cactus_Id) ITEM(Tile::topSnow_Id) // 4J-PB - Already got sugar cane in Materials ITEM_11(Tile::reeds_Id) @@ -149,22 +175,23 @@ void IUIScene_CreativeMenu::staticCtor() 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(Tile::hayBlock_Id) + ITEM_AUX(Tile::wool_Id,14) // Red + ITEM_AUX(Tile::wool_Id,1) // Orange + ITEM_AUX(Tile::wool_Id,4) // Yellow + ITEM_AUX(Tile::wool_Id,5) // Lime + ITEM_AUX(Tile::wool_Id,3) // Light Blue + ITEM_AUX(Tile::wool_Id,9) // Cyan + ITEM_AUX(Tile::wool_Id,11) // Blue + ITEM_AUX(Tile::wool_Id,10) // Purple + ITEM_AUX(Tile::wool_Id,2) // Magenta + ITEM_AUX(Tile::wool_Id,6) // Pink + ITEM_AUX(Tile::wool_Id,0) // White + ITEM_AUX(Tile::wool_Id,8) // Light Gray + ITEM_AUX(Tile::wool_Id,7) // Gray + ITEM_AUX(Tile::wool_Id,15) // Black + ITEM_AUX(Tile::wool_Id,13) // Green + ITEM_AUX(Tile::wool_Id,12) // Brown ITEM_AUX(Tile::woolCarpet_Id,14) // Red ITEM_AUX(Tile::woolCarpet_Id,1) // Orange @@ -183,11 +210,102 @@ void IUIScene_CreativeMenu::staticCtor() ITEM_AUX(Tile::woolCarpet_Id,13) // Green ITEM_AUX(Tile::woolCarpet_Id,12) // Brown +#if 0 + ITEM_AUX(Tile::stained_glass_Id,14) // Red + ITEM_AUX(Tile::stained_glass_Id,1) // Orange + ITEM_AUX(Tile::stained_glass_Id,4) // Yellow + ITEM_AUX(Tile::stained_glass_Id,5) // Lime + ITEM_AUX(Tile::stained_glass_Id,3) // Light Blue + ITEM_AUX(Tile::stained_glass_Id,9) // Cyan + ITEM_AUX(Tile::stained_glass_Id,11) // Blue + ITEM_AUX(Tile::stained_glass_Id,10) // Purple + ITEM_AUX(Tile::stained_glass_Id,2) // Magenta + ITEM_AUX(Tile::stained_glass_Id,6) // Pink + ITEM_AUX(Tile::stained_glass_Id,0) // White + ITEM_AUX(Tile::stained_glass_Id,8) // Light Gray + ITEM_AUX(Tile::stained_glass_Id,7) // Gray + ITEM_AUX(Tile::stained_glass_Id,15) // Black + ITEM_AUX(Tile::stained_glass_Id,13) // Green + ITEM_AUX(Tile::stained_glass_Id,12) // Brown + + ITEM_AUX(Tile::stained_glass_pane_Id,14) // Red + ITEM_AUX(Tile::stained_glass_pane_Id,1) // Orange + ITEM_AUX(Tile::stained_glass_pane_Id,4) // Yellow + ITEM_AUX(Tile::stained_glass_pane_Id,5) // Lime + ITEM_AUX(Tile::stained_glass_pane_Id,3) // Light Blue + ITEM_AUX(Tile::stained_glass_pane_Id,9) // Cyan + ITEM_AUX(Tile::stained_glass_pane_Id,11) // Blue + ITEM_AUX(Tile::stained_glass_pane_Id,10) // Purple + ITEM_AUX(Tile::stained_glass_pane_Id,2) // Magenta + ITEM_AUX(Tile::stained_glass_pane_Id,6) // Pink + ITEM_AUX(Tile::stained_glass_pane_Id,0) // White + ITEM_AUX(Tile::stained_glass_pane_Id,8) // Light Gray + ITEM_AUX(Tile::stained_glass_pane_Id,7) // Gray + ITEM_AUX(Tile::stained_glass_pane_Id,15) // Black + ITEM_AUX(Tile::stained_glass_pane_Id,13) // Green + ITEM_AUX(Tile::stained_glass_pane_Id,12) // Brown +#endif + +#ifndef _CONTENT_PACKAGE + DEF(eCreativeInventory_ArtToolsDecorations) + if(app.DebugSettingsOn()) + { + for(unsigned int i = 0; i < Painting::LAST_VALUE; ++i) + { + ITEM_AUX(Item::painting_Id, i + 1) + } + + BuildFirework(list, FireworksItem::TYPE_BIG, DyePowderItem::PURPLE, 1, false, false); + + BuildFirework(list, FireworksItem::TYPE_SMALL, DyePowderItem::RED, 1, false, false); + BuildFirework(list, FireworksItem::TYPE_SMALL, DyePowderItem::RED, 2, false, false); + BuildFirework(list, FireworksItem::TYPE_SMALL, DyePowderItem::RED, 3, false, false); + + BuildFirework(list, FireworksItem::TYPE_BURST, DyePowderItem::GREEN, 1, false, true); + BuildFirework(list, FireworksItem::TYPE_CREEPER, DyePowderItem::BLUE, 1, true, false); + BuildFirework(list, FireworksItem::TYPE_STAR, DyePowderItem::YELLOW, 1, false, false); + BuildFirework(list, FireworksItem::TYPE_BIG, DyePowderItem::WHITE, 1, true, true); + + ITEM_AUX(Tile::stained_glass_Id,14) // Red + ITEM_AUX(Tile::stained_glass_Id,1) // Orange + ITEM_AUX(Tile::stained_glass_Id,4) // Yellow + ITEM_AUX(Tile::stained_glass_Id,5) // Lime + ITEM_AUX(Tile::stained_glass_Id,3) // Light Blue + ITEM_AUX(Tile::stained_glass_Id,9) // Cyan + ITEM_AUX(Tile::stained_glass_Id,11) // Blue + ITEM_AUX(Tile::stained_glass_Id,10) // Purple + ITEM_AUX(Tile::stained_glass_Id,2) // Magenta + ITEM_AUX(Tile::stained_glass_Id,6) // Pink + ITEM_AUX(Tile::stained_glass_Id,0) // White + ITEM_AUX(Tile::stained_glass_Id,8) // Light Gray + ITEM_AUX(Tile::stained_glass_Id,7) // Gray + ITEM_AUX(Tile::stained_glass_Id,15) // Black + ITEM_AUX(Tile::stained_glass_Id,13) // Green + ITEM_AUX(Tile::stained_glass_Id,12) // Brown + + ITEM_AUX(Tile::stained_glass_pane_Id,14) // Red + ITEM_AUX(Tile::stained_glass_pane_Id,1) // Orange + ITEM_AUX(Tile::stained_glass_pane_Id,4) // Yellow + ITEM_AUX(Tile::stained_glass_pane_Id,5) // Lime + ITEM_AUX(Tile::stained_glass_pane_Id,3) // Light Blue + ITEM_AUX(Tile::stained_glass_pane_Id,9) // Cyan + ITEM_AUX(Tile::stained_glass_pane_Id,11) // Blue + ITEM_AUX(Tile::stained_glass_pane_Id,10) // Purple + ITEM_AUX(Tile::stained_glass_pane_Id,2) // Magenta + ITEM_AUX(Tile::stained_glass_pane_Id,6) // Pink + ITEM_AUX(Tile::stained_glass_pane_Id,0) // White + ITEM_AUX(Tile::stained_glass_pane_Id,8) // Light Gray + ITEM_AUX(Tile::stained_glass_pane_Id,7) // Gray + ITEM_AUX(Tile::stained_glass_pane_Id,15) // Black + ITEM_AUX(Tile::stained_glass_pane_Id,13) // Green + ITEM_AUX(Tile::stained_glass_pane_Id,12) // Brown + } +#endif // Redstone DEF(eCreativeInventory_Redstone) ITEM(Tile::dispenser_Id) - ITEM(Tile::musicBlock_Id) + ITEM(Tile::noteblock_Id) ITEM(Tile::pistonBase_Id) ITEM(Tile::pistonStickyBase_Id) ITEM(Tile::tnt_Id) @@ -197,20 +315,31 @@ void IUIScene_CreativeMenu::staticCtor() 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::redstoneBlock_Id) + ITEM(Tile::redstoneTorch_on_Id) + ITEM(Item::repeater_Id) ITEM(Tile::redstoneLight_Id) ITEM(Tile::tripWireSource_Id) + ITEM(Tile::daylightDetector_Id) + ITEM(Tile::dropper_Id) + ITEM(Tile::hopper_Id) + ITEM(Item::comparator_Id) + ITEM(Tile::chest_trap_Id) + ITEM(Tile::weightedPlate_heavy_Id) + ITEM(Tile::weightedPlate_light_Id) // Transport DEF(eCreativeInventory_Transport) ITEM(Tile::rail_Id) ITEM(Tile::goldenRail_Id) ITEM(Tile::detectorRail_Id) + ITEM(Tile::activatorRail_Id) ITEM(Tile::ladder_Id) ITEM(Item::minecart_Id) ITEM(Item::minecart_chest_Id) ITEM(Item::minecart_furnace_Id) + ITEM(Item::minecart_hopper_Id) + ITEM(Item::minecart_tnt_Id) ITEM(Item::saddle_Id) ITEM(Item::boat_Id) @@ -222,25 +351,49 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Tile::furnace_Id) ITEM(Item::brewingStand_Id) ITEM(Tile::enchantTable_Id) + ITEM(Tile::beacon_Id) ITEM(Tile::endPortalFrameTile_Id) - ITEM(Tile::recordPlayer_Id) + ITEM(Tile::jukebox_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::bucket_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::nameTag_Id) + ITEM(Item::netherStar_Id) + ITEM_AUX(Item::spawnEgg_Id, 50); // Creeper + ITEM_AUX(Item::spawnEgg_Id, 51); // Skeleton + ITEM_AUX(Item::spawnEgg_Id, 52); // Spider + ITEM_AUX(Item::spawnEgg_Id, 54); // Zombie + ITEM_AUX(Item::spawnEgg_Id, 55); // Slime + ITEM_AUX(Item::spawnEgg_Id, 56); // Ghast + ITEM_AUX(Item::spawnEgg_Id, 57); // Zombie Pigman + ITEM_AUX(Item::spawnEgg_Id, 58); // Enderman + ITEM_AUX(Item::spawnEgg_Id, 59); // Cave Spider + ITEM_AUX(Item::spawnEgg_Id, 60); // Silverfish + ITEM_AUX(Item::spawnEgg_Id, 61); // Blaze + ITEM_AUX(Item::spawnEgg_Id, 62); // Magma Cube + ITEM_AUX(Item::spawnEgg_Id, 65); // Bat + ITEM_AUX(Item::spawnEgg_Id, 66); // Witch + ITEM_AUX(Item::spawnEgg_Id, 90); // Pig + ITEM_AUX(Item::spawnEgg_Id, 91); // Sheep + ITEM_AUX(Item::spawnEgg_Id, 92); // Cow + ITEM_AUX(Item::spawnEgg_Id, 93); // Chicken + ITEM_AUX(Item::spawnEgg_Id, 94); // Squid + ITEM_AUX(Item::spawnEgg_Id, 95); // Wolf + ITEM_AUX(Item::spawnEgg_Id, 96); // Mooshroom + ITEM_AUX(Item::spawnEgg_Id, 98); // Ozelot + ITEM_AUX(Item::spawnEgg_Id, 100); // Horse + ITEM_AUX(Item::spawnEgg_Id, 100 | ((EntityHorse::TYPE_DONKEY + 1) << 12) ); // Donkey + ITEM_AUX(Item::spawnEgg_Id, 100 | ((EntityHorse::TYPE_MULE + 1) << 12)); // Mule + ITEM_AUX(Item::spawnEgg_Id, 120); // Villager ITEM(Item::record_01_Id) ITEM(Item::record_02_Id) ITEM(Item::record_03_Id) @@ -253,27 +406,26 @@ void IUIScene_CreativeMenu::staticCtor() 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 + + BuildFirework(list, FireworksItem::TYPE_SMALL, DyePowderItem::LIGHT_BLUE, 1, true, false); + BuildFirework(list, FireworksItem::TYPE_CREEPER, DyePowderItem::GREEN, 2, false, false); + BuildFirework(list, FireworksItem::TYPE_MAX, DyePowderItem::RED, 2, false, false, DyePowderItem::ORANGE); + BuildFirework(list, FireworksItem::TYPE_BURST, DyePowderItem::MAGENTA, 3, true, false, DyePowderItem::BLUE); + BuildFirework(list, FireworksItem::TYPE_STAR, DyePowderItem::YELLOW, 2, false, true, DyePowderItem::ORANGE); + +#ifndef _CONTENT_PACKAGE + DEF(eCreativeInventory_ArtToolsMisc) + if(app.DebugSettingsOn()) + { + ITEM_AUX(Item::spawnEgg_Id, 100 | ((EntityHorse::TYPE_SKELETON + 1) << 12)); // Skeleton + ITEM_AUX(Item::spawnEgg_Id, 100 | ((EntityHorse::TYPE_UNDEAD + 1) << 12)); // Zombie + ITEM_AUX(Item::spawnEgg_Id, 98 | ((Ocelot::TYPE_BLACK + 1) << 12)); + ITEM_AUX(Item::spawnEgg_Id, 98 | ((Ocelot::TYPE_RED + 1) << 12)); + ITEM_AUX(Item::spawnEgg_Id, 98 | ((Ocelot::TYPE_SIAMESE + 1) << 12)); + ITEM_AUX(Item::spawnEgg_Id, 52 | (2 << 12)); // Spider-Jockey + ITEM_AUX(Item::spawnEgg_Id, 63); // Enderdragon + } +#endif // Food DEF(eCreativeInventory_Food) @@ -305,17 +457,17 @@ void IUIScene_CreativeMenu::staticCtor() // 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::helmet_leather_Id) + ITEM(Item::chestplate_leather_Id) + ITEM(Item::leggings_leather_Id) + ITEM(Item::boots_leather_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::emptyMap_Id) ITEM(Item::helmet_chain_Id) ITEM(Item::chestplate_chain_Id) ITEM(Item::leggings_chain_Id) @@ -364,6 +516,10 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::shears_Id) ITEM(Item::fishingRod_Id) ITEM(Item::carrotOnAStick_Id) + ITEM(Item::lead_Id) + ITEM(Item::horseArmorDiamond_Id) + ITEM(Item::horseArmorGold_Id) + ITEM(Item::horseArmorMetal_Id) for(unsigned int i = 0; i < Enchantment::enchantments.length; ++i) { @@ -372,6 +528,16 @@ void IUIScene_CreativeMenu::staticCtor() list->push_back(Item::enchantedBook->createForEnchantment(new EnchantmentInstance(enchantment, enchantment->getMaxLevel()))); } +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn()) + { + shared_ptr debugSword = shared_ptr(new ItemInstance(Item::sword_diamond_Id, 1, 0)); + debugSword->enchant( Enchantment::damageBonus, 50 ); + debugSword->setHoverName(L"Sword of Debug"); + list->push_back(debugSword); + } +#endif + // Materials DEF(eCreativeInventory_Materials) ITEM(Item::coal_Id) @@ -390,7 +556,7 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::feather_Id) ITEM(Item::flint_Id) ITEM(Item::leather_Id) - ITEM(Item::sulphur_Id) + ITEM(Item::gunpowder_Id) ITEM(Item::clay_Id) ITEM(Item::yellowDust_Id) ITEM(Item::seeds_wheat_Id) @@ -403,7 +569,7 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::slimeBall_Id) ITEM(Item::blazeRod_Id) ITEM(Item::goldNugget_Id) - ITEM(Item::netherStalkSeeds_Id) + ITEM(Item::netherwart_seeds_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 @@ -538,22 +704,28 @@ void IUIScene_CreativeMenu::staticCtor() // Top Row ECreative_Inventory_Groups blocksGroup[] = {eCreativeInventory_BuildingBlocks}; - specs[eCreativeInventoryTab_BuildingBlocks] = new TabSpec(L"Structures", IDS_GROUPNAME_BUILDING_BLOCKS, 1, blocksGroup, 0, NULL); - + specs[eCreativeInventoryTab_BuildingBlocks] = new TabSpec(L"Structures", IDS_GROUPNAME_BUILDING_BLOCKS, 1, blocksGroup); + +#ifndef _CONTENT_PACKAGE + ECreative_Inventory_Groups decorationsGroup[] = {eCreativeInventory_Decoration}; + ECreative_Inventory_Groups debugDecorationsGroup[] = {eCreativeInventory_ArtToolsDecorations}; + specs[eCreativeInventoryTab_Decorations] = new TabSpec(L"Decoration", IDS_GROUPNAME_DECORATIONS, 1, decorationsGroup, 0, NULL, 1, debugDecorationsGroup); +#else ECreative_Inventory_Groups decorationsGroup[] = {eCreativeInventory_Decoration}; - specs[eCreativeInventoryTab_Decorations] = new TabSpec(L"Decoration", IDS_GROUPNAME_DECORATIONS, 1, decorationsGroup, 0, NULL); + specs[eCreativeInventoryTab_Decorations] = new TabSpec(L"Decoration", IDS_GROUPNAME_DECORATIONS, 1, decorationsGroup); +#endif ECreative_Inventory_Groups redAndTranGroup[] = {eCreativeInventory_Transport, eCreativeInventory_Redstone}; - specs[eCreativeInventoryTab_RedstoneAndTransport] = new TabSpec(L"RedstoneAndTransport", IDS_GROUPNAME_REDSTONE_AND_TRANSPORT, 2, redAndTranGroup, 0, NULL); + specs[eCreativeInventoryTab_RedstoneAndTransport] = new TabSpec(L"RedstoneAndTransport", IDS_GROUPNAME_REDSTONE_AND_TRANSPORT, 2, redAndTranGroup); ECreative_Inventory_Groups materialsGroup[] = {eCreativeInventory_Materials}; - specs[eCreativeInventoryTab_Materials] = new TabSpec(L"Materials", IDS_GROUPNAME_MATERIALS, 1, materialsGroup, 0, NULL); + specs[eCreativeInventoryTab_Materials] = new TabSpec(L"Materials", IDS_GROUPNAME_MATERIALS, 1, materialsGroup); ECreative_Inventory_Groups foodGroup[] = {eCreativeInventory_Food}; - specs[eCreativeInventoryTab_Food] = new TabSpec(L"Food", IDS_GROUPNAME_FOOD, 1, foodGroup, 0, NULL); + specs[eCreativeInventoryTab_Food] = new TabSpec(L"Food", IDS_GROUPNAME_FOOD, 1, foodGroup); ECreative_Inventory_Groups toolsGroup[] = {eCreativeInventory_ToolsArmourWeapons}; - specs[eCreativeInventoryTab_ToolsWeaponsArmor] = new TabSpec(L"Tools", IDS_GROUPNAME_TOOLS_WEAPONS_ARMOR, 1, toolsGroup, 0, NULL); + specs[eCreativeInventoryTab_ToolsWeaponsArmor] = new TabSpec(L"Tools", IDS_GROUPNAME_TOOLS_WEAPONS_ARMOR, 1, toolsGroup); ECreative_Inventory_Groups brewingGroup[] = {eCreativeInventory_Brewing, eCreativeInventory_Potions_Level2_Extended, eCreativeInventory_Potions_Extended, eCreativeInventory_Potions_Level2, eCreativeInventory_Potions_Basic}; @@ -561,16 +733,21 @@ void IUIScene_CreativeMenu::staticCtor() // 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); + specs[eCreativeInventoryTab_Brewing] = new TabSpec(L"Brewing", IDS_GROUPNAME_POTIONS_480, 5, brewingGroup); } // else // { // specs[eCreativeInventoryTab_Brewing] = new TabSpec(L"icon_brewing.png", IDS_GROUPNAME_POTIONS, 1, brewingGroup, 4, potionsGroup); // } +#ifndef _CONTENT_PACKAGE ECreative_Inventory_Groups miscGroup[] = {eCreativeInventory_Misc}; - specs[eCreativeInventoryTab_Misc] = new TabSpec(L"Misc", IDS_GROUPNAME_MISCELLANEOUS, 1, miscGroup, 0, NULL); - + ECreative_Inventory_Groups debugMiscGroup[] = {eCreativeInventory_ArtToolsMisc}; + specs[eCreativeInventoryTab_Misc] = new TabSpec(L"Misc", IDS_GROUPNAME_MISCELLANEOUS, 1, miscGroup, 0, NULL, 1, debugMiscGroup); +#else + ECreative_Inventory_Groups miscGroup[] = {eCreativeInventory_Misc}; + specs[eCreativeInventoryTab_Misc] = new TabSpec(L"Misc", IDS_GROUPNAME_MISCELLANEOUS, 1, miscGroup); +#endif } IUIScene_CreativeMenu::IUIScene_CreativeMenu() @@ -600,10 +777,33 @@ void IUIScene_CreativeMenu::switchTab(ECreativeInventoryTabs tab) specs[tab]->populateMenu(itemPickerMenu,m_tabDynamicPos[m_curTab], m_tabPage[m_curTab]); } +void IUIScene_CreativeMenu::ScrollBar(UIVec2D pointerPos) +{ + UIVec2D pos; + UIVec2D size; + GetItemScreenData(eSectionInventoryCreativeSlider, 0, &pos, &size); + float fPosition = ((float)pointerPos.y - pos.y) / size.y; + + // 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); +} + // 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) +IUIScene_CreativeMenu::TabSpec::TabSpec(LPCWSTR icon, int descriptionId, int staticGroupsCount, ECreative_Inventory_Groups *staticGroups, int dynamicGroupsCount, ECreative_Inventory_Groups *dynamicGroups, int debugGroupsCount /*= 0*/, ECreative_Inventory_Groups *debugGroups /*= NULL*/) + : m_icon(icon), m_descriptionId(descriptionId), m_staticGroupsCount(staticGroupsCount), m_dynamicGroupsCount(dynamicGroupsCount), m_debugGroupsCount(debugGroupsCount) { m_pages = 0; @@ -622,8 +822,20 @@ IUIScene_CreativeMenu::TabSpec::TabSpec(LPCWSTR icon, int descriptionId, int sta } } + m_debugGroupsA = NULL; + m_debugItems = 0; + if(debugGroupsCount > 0) + { + m_debugGroupsA = new ECreative_Inventory_Groups[debugGroupsCount]; + for(int i = 0; i < debugGroupsCount; ++i) + { + m_debugGroupsA[i] = debugGroups[i]; + m_debugItems += categoryGroups[m_debugGroupsA[i]].size(); + } + } + m_dynamicGroupsA = NULL; - if(dynamicGroupsCount > 0) + if(dynamicGroupsCount > 0 && dynamicGroups != NULL) { m_dynamicGroupsA = new ECreative_Inventory_Groups[dynamicGroupsCount]; for(int i = 0; i < dynamicGroupsCount; ++i) @@ -641,6 +853,7 @@ IUIScene_CreativeMenu::TabSpec::~TabSpec() { if(m_staticGroupsA != NULL) delete [] m_staticGroupsA; if(m_dynamicGroupsA != NULL) delete [] m_dynamicGroupsA; + if(m_debugGroupsA != NULL) delete [] m_debugGroupsA; } void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page) @@ -659,12 +872,12 @@ void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, i // 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; + bool displayStatic = false; for(; currentGroup < m_staticGroupsCount; ++currentGroup) { int size = categoryGroups[m_staticGroupsA[currentGroup]].size(); @@ -673,26 +886,79 @@ void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, i currentIndex += size; continue; } + displayStatic = true; currentItem = size - ((currentIndex + size) - startIndex); break; } - for(; lastSlotIndex < MAX_SIZE;) + int lastStaticPageCount = currentIndex; + while(lastStaticPageCount > m_staticPerPage) lastStaticPageCount -= m_staticPerPage; + + if(displayStatic) { - Slot *slot = menu->getSlot(lastSlotIndex++); - slot->set(categoryGroups[m_staticGroupsA[currentGroup]][currentItem]); + 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; + } + } + } + } - ++currentItem; - if(currentItem >= categoryGroups[m_staticGroupsA[currentGroup]].size()) +#ifndef _CONTENT_PACKAGE + if(app.DebugArtToolsOn()) + { + if(m_debugGroupsCount > 0) { + startIndex = 0; + if(lastStaticPageCount != 0) + { + startIndex = m_staticPerPage - lastStaticPageCount; + } + currentIndex = 0; + currentGroup = 0; currentItem = 0; - ++currentGroup; - if(currentGroup >= m_staticGroupsCount) + bool showDebug = false; + for(; currentGroup < m_debugGroupsCount; ++currentGroup) { + int size = categoryGroups[m_debugGroupsA[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_debugGroupsA[currentGroup]][currentItem]); + + ++currentItem; + if(currentItem >= categoryGroups[m_debugGroupsA[currentGroup]].size()) + { + currentItem = 0; + ++currentGroup; + if(currentGroup >= m_debugGroupsCount) + { + break; + } + } + } } } +#endif for(; lastSlotIndex < MAX_SIZE; ++lastSlotIndex) { @@ -703,7 +969,16 @@ void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, i unsigned int IUIScene_CreativeMenu::TabSpec::getPageCount() { - return m_pages; +#ifndef _CONTENT_PACKAGE + if(app.DebugArtToolsOn()) + { + return (int)ceil((float)(m_staticItems + m_debugItems) / m_staticPerPage); + } + else +#endif + { + return m_pages; + } } @@ -763,7 +1038,6 @@ IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionA newSection = eSectionInventoryCreativeSelector; } break; -#ifndef _XBOX case eSectionInventoryCreativeTab_0: case eSectionInventoryCreativeTab_1: case eSectionInventoryCreativeTab_2: @@ -775,7 +1049,6 @@ IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionA case eSectionInventoryCreativeSlider: /* do nothing */ break; -#endif default: assert( false ); break; @@ -800,7 +1073,7 @@ bool IUIScene_CreativeMenu::handleValidKeyPress(int iPad, int buttonNum, BOOL qu { 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); + pMinecraft->localgameModes[iPad]->handleCreativeModeItemAdd(nullptr, i - (int)m_menu->slots.size() + 9 + InventoryMenu::USE_ROW_SLOT_START); } } return true; @@ -930,7 +1203,7 @@ void IUIScene_CreativeMenu::handleSlotListClicked(ESceneSection eSection, int bu 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); + pMinecraft->localgameModes[getPad()]->handleCreativeModeItemAdd(newItem, currentIndex - (int)m_menu->slots.size() + 9 + InventoryMenu::USE_ROW_SLOT_START); if(m_bCarryingCreativeItem) { @@ -978,7 +1251,7 @@ bool IUIScene_CreativeMenu::getEmptyInventorySlot(shared_ptr item, 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() )) + if( slotItem != NULL && slotItem->sameItemWithTags(item) && (slotItem->GetCount() + item->GetCount() <= item->getMaxStackSize() )) { sameItemFound = true; slotX = i - TabSpec::MAX_SIZE; @@ -1021,7 +1294,7 @@ int IUIScene_CreativeMenu::getSectionStartOffset(ESceneSection eSection) } 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) + EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT, EToolTipItem &buttonBack) { bool _override = false; @@ -1030,7 +1303,6 @@ bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, if(bSlotHasItem) { buttonA = eToolTipPickUpGeneric; - buttonRT = eToolTipWhatIsThis; if(itemUnderPointer->isStackable()) { @@ -1051,3 +1323,74 @@ bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, return _override; } + +void IUIScene_CreativeMenu::BuildFirework(vector > *list, byte type, int color, int sulphur, bool flicker, bool trail, int fadeColor/*= -1*/) +{ + ///////////////////////////////// + // Create firecharge + ///////////////////////////////// + + + CompoundTag *expTag = new CompoundTag(FireworksItem::TAG_EXPLOSION); + + vector colors; + + colors.push_back(DyePowderItem::COLOR_RGB[color]); + + // glowstone dust gives flickering + if (flicker) expTag->putBoolean(FireworksItem::TAG_E_FLICKER, true); + + // diamonds give trails + if (trail) expTag->putBoolean(FireworksItem::TAG_E_TRAIL, true); + + intArray colorArray(colors.size()); + for (int i = 0; i < colorArray.length; i++) + { + colorArray[i] = colors.at(i); + } + expTag->putIntArray(FireworksItem::TAG_E_COLORS, colorArray); + // delete colorArray.data; + + expTag->putByte(FireworksItem::TAG_E_TYPE, type); + + if (fadeColor != -1) + { + //////////////////////////////////// + // Apply fade colors to firecharge + //////////////////////////////////// + + vector colors; + colors.push_back(DyePowderItem::COLOR_RGB[fadeColor]); + + intArray colorArray(colors.size()); + for (int i = 0; i < colorArray.length; i++) + { + colorArray[i] = colors.at(i); + } + expTag->putIntArray(FireworksItem::TAG_E_FADECOLORS, colorArray); + } + + ///////////////////////////////// + // Create fireworks + ///////////////////////////////// + + shared_ptr firework; + + { + firework = shared_ptr( new ItemInstance(Item::fireworks) ); + CompoundTag *itemTag = new CompoundTag(); + CompoundTag *fireTag = new CompoundTag(FireworksItem::TAG_FIREWORKS); + ListTag *expTags = new ListTag(FireworksItem::TAG_EXPLOSIONS); + + expTags->add(expTag); + + fireTag->put(FireworksItem::TAG_EXPLOSIONS, expTags); + fireTag->putByte(FireworksItem::TAG_FLIGHT, (byte) sulphur); + + itemTag->put(FireworksItem::TAG_FIREWORKS, fireTag); + + firework->setTag(itemTag); + } + + list->push_back(firework); +} diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h index 7ab3ff7e..64b78029 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h @@ -38,6 +38,8 @@ public: eCreativeInventory_Potions_Extended, eCreativeInventory_Potions_Level2_Extended, eCreativeInventory_Misc, + eCreativeInventory_ArtToolsDecorations, + eCreativeInventory_ArtToolsMisc, eCreativeInventoryGroupsCount }; @@ -57,14 +59,17 @@ public: ECreative_Inventory_Groups *m_staticGroupsA; const int m_dynamicGroupsCount; ECreative_Inventory_Groups *m_dynamicGroupsA; + const int m_debugGroupsCount; + ECreative_Inventory_Groups *m_debugGroupsA; private: unsigned int m_pages; unsigned int m_staticPerPage; unsigned int m_staticItems; + unsigned int m_debugItems; public: - TabSpec( LPCWSTR icon, int descriptionId, int staticGroupsCount, ECreative_Inventory_Groups *staticGroups, int dynamicGroupsCount, ECreative_Inventory_Groups *dynamicGroups ); + TabSpec( LPCWSTR icon, int descriptionId, int staticGroupsCount, ECreative_Inventory_Groups *staticGroups, int dynamicGroupsCount = 0, ECreative_Inventory_Groups *dynamicGroups = NULL, int debugGroupsCount = 0, ECreative_Inventory_Groups *debugGroups = NULL ); ~TabSpec(); void populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page); @@ -104,7 +109,8 @@ protected: int m_tabDynamicPos[eCreativeInventoryTab_COUNT]; int m_tabPage[eCreativeInventoryTab_COUNT]; - void switchTab(ECreativeInventoryTabs tab); + void switchTab(ECreativeInventoryTabs tab); + void ScrollBar(UIVec2D pointerPos); 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 ); @@ -117,6 +123,19 @@ protected: 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); + virtual bool overrideTooltips( + ESceneSection sectionUnderPointer, + shared_ptr itemUnderPointer, + bool bIsItemCarried, + bool bSlotHasItem, + bool bCarriedIsSameAsSlot, + int iSlotStackSizeRemaining, + EToolTipItem &buttonA, + EToolTipItem &buttonX, + EToolTipItem &buttonY, + EToolTipItem &buttonRT, + EToolTipItem &buttonBack + ); + + static void BuildFirework(vector > *list, byte type, int color, int sulphur, bool flicker, bool trail, int fadeColor = -1); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.cpp new file mode 100644 index 00000000..7f90fe8f --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.cpp @@ -0,0 +1,129 @@ +#include "stdafx.h" + +#include "IUIScene_FireworksMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_FireworksMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + int xOffset = 0; + int yOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionFireworksIngredients: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFireworksInventory; + xOffset = -1; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionFireworksUsing; + xOffset = -1; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFireworksResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFireworksResult; + } + break; + case eSectionFireworksResult: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFireworksInventory; + xOffset = -7; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionFireworksUsing; + xOffset = -7; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFireworksIngredients; + yOffset = -1; + *piTargetX = getSectionColumns(eSectionFireworksIngredients); + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFireworksIngredients; + yOffset = -1; + *piTargetX = 0; + } + break; + case eSectionFireworksInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFireworksUsing; + } + else if(eTapDirection == eTapStateUp) + { + if(*piTargetX < 6) + { + newSection = eSectionFireworksIngredients; + xOffset = 1; + } + else + { + newSection = eSectionFireworksResult; + } + } + break; + case eSectionFireworksUsing: + if(eTapDirection == eTapStateDown) + { + if(*piTargetX < 6) + { + newSection = eSectionFireworksIngredients; + xOffset = 1; + } + else + { + newSection = eSectionFireworksResult; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionFireworksInventory; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset, yOffset); + + return newSection; +} + +int IUIScene_FireworksMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + + case eSectionFireworksIngredients: + offset = FireworksMenu::CRAFT_SLOT_START; + break; + + case eSectionFireworksResult: + offset = FireworksMenu::RESULT_SLOT; + break; + case eSectionFireworksInventory: + offset = FireworksMenu::INV_SLOT_START; + break; + case eSectionFireworksUsing: + offset = FireworksMenu::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_FireworksMenu.h b/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.h new file mode 100644 index 00000000..4764d72c --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.h @@ -0,0 +1,9 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" + +class IUIScene_FireworksMenu : 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_HUD.cpp b/Minecraft.Client/Common/UI/IUIScene_HUD.cpp new file mode 100644 index 00000000..03adbd2c --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HUD.cpp @@ -0,0 +1,264 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.ai.attributes.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.monster.h" +#include "IUIScene_HUD.h" + +IUIScene_HUD::IUIScene_HUD() +{ + m_lastActiveSlot = -1; + m_iGuiScale = -1; + m_bToolTipsVisible = true; + m_lastExpProgress = 0.0f; + m_lastExpLevel = 0; + m_iCurrentHealth = 0; + m_lastMaxHealth = 20; + m_lastHealthBlink = false; + m_lastHealthPoison = false; + m_iCurrentFood = -1; + m_lastFoodPoison = false; + m_lastAir = 10; + m_currentExtraAir = 0; + m_lastArmour = 0; + m_showHealth = true; + m_showHorseHealth = true; + m_showFood = true; + m_showAir = true; + m_showArmour = true; + m_showExpBar = true; + m_bRegenEffectEnabled = false; + m_iFoodSaturation = 0; + m_lastDragonHealth = 0.0f; + m_showDragonHealth = false; + m_ticksWithNoBoss = 0; + m_uiSelectedItemOpacityCountDown = 0; + m_displayName = L""; + m_lastShowDisplayName = true; + m_bRidingHorse = true; + m_horseHealth = 1; + m_lastHealthWither = true; + m_iCurrentHealthAbsorb = -1; + m_horseJumpProgress = 1.0f; + m_iHeartOffsetIndex = -1; + m_bHealthAbsorbActive = false; + m_iHorseMaxHealth = -1; + m_bIsJumpable = false; +} + +void IUIScene_HUD::updateFrameTick() +{ + int iPad = getPad(); + Minecraft *pMinecraft = Minecraft::GetInstance(); + + int iGuiScale; + + if(pMinecraft->localplayers[iPad]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + iGuiScale=app.GetGameSettings(iPad,eGameSetting_UISize); + } + else + { + iGuiScale=app.GetGameSettings(iPad,eGameSetting_UISizeSplitscreen); + } + SetHudSize(iGuiScale); + + SetDisplayName(ProfileManager.GetDisplayName(iPad)); + + SetTooltipsEnabled(((ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) || (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) != 0))); + + SetActiveSlot(pMinecraft->localplayers[iPad]->inventory->selected); + + if (pMinecraft->localgameModes[iPad]->canHurtPlayer()) + { + renderPlayerHealth(); + } + else + { + //SetRidingHorse(false, 0); + shared_ptr riding = pMinecraft->localplayers[iPad]->riding; + if(riding == NULL) + { + SetRidingHorse(false, false, 0); + } + else + { + SetRidingHorse(true, pMinecraft->localplayers[iPad]->isRidingJumpable(), 0); + } + ShowHorseHealth(false); + m_horseHealth = 0; + ShowHealth(false); + ShowFood(false); + ShowAir(false); + ShowArmour(false); + ShowExpBar(false); + SetHealthAbsorb(0); + } + + if(pMinecraft->localplayers[iPad]->isRidingJumpable()) + { + SetHorseJumpBarProgress(pMinecraft->localplayers[iPad]->getJumpRidingScale()); + } + else if (pMinecraft->localgameModes[iPad]->hasExperience()) + { + // Update xp progress + ShowExpBar(true); + + SetExpBarProgress(pMinecraft->localplayers[iPad]->experienceProgress, pMinecraft->localplayers[iPad]->getXpNeededForNextLevel()); + + // Update xp level + SetExpLevel(pMinecraft->localplayers[iPad]->experienceLevel); + } + else + { + ShowExpBar(false); + SetExpLevel(0); + } + + 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(iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(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(iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + fVal=0.01f*(float)ucAlpha; + } + SetOpacity(fVal); + + bool bDisplayGui=app.GetGameStarted() && !ui.GetMenuDisplayed(iPad) && !(app.GetXuiAction(iPad)==eAppAction_AutosaveSaveGameCapturedThumbnail) && app.GetGameSettings(iPad,eGameSetting_DisplayHUD)!=0; + if(bDisplayGui && pMinecraft->localplayers[iPad] != NULL) + { + SetVisible(true); + } + else + { + SetVisible(false); + } +} + +void IUIScene_HUD::renderPlayerHealth() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + int iPad = getPad(); + + ShowHealth(true); + + SetRegenerationEffect(pMinecraft->localplayers[iPad]->hasEffect(MobEffect::regeneration)); + + // Update health + bool blink = pMinecraft->localplayers[iPad]->invulnerableTime / 3 % 2 == 1; + if (pMinecraft->localplayers[iPad]->invulnerableTime < 10) blink = false; + int currentHealth = pMinecraft->localplayers[iPad]->getHealth(); + int oldHealth = pMinecraft->localplayers[iPad]->lastHealth; + bool bHasPoison = pMinecraft->localplayers[iPad]->hasEffect(MobEffect::poison); + bool bHasWither = pMinecraft->localplayers[iPad]->hasEffect(MobEffect::wither); + AttributeInstance *maxHealthAttribute = pMinecraft->localplayers[iPad]->getAttribute(SharedMonsterAttributes::MAX_HEALTH); + float maxHealth = (float)maxHealthAttribute->getValue(); + float totalAbsorption = pMinecraft->localplayers[iPad]->getAbsorptionAmount(); + + // Update armour + int armor = pMinecraft->localplayers[iPad]->getArmorValue(); + + SetHealth(currentHealth, oldHealth, blink, bHasPoison || bHasWither, bHasWither); + SetHealthAbsorb(totalAbsorption); + + if(armor > 0) + { + ShowArmour(true); + SetArmour(armor); + } + else + { + ShowArmour(false); + } + + shared_ptr riding = pMinecraft->localplayers[iPad]->riding; + + if(riding == NULL || riding && !riding->instanceof(eTYPE_LIVINGENTITY)) + { + SetRidingHorse(false, false, 0); + + ShowFood(true); + ShowHorseHealth(false); + m_horseHealth = 0; + + // Update food + //bool foodBlink = false; + FoodData *foodData = pMinecraft->localplayers[iPad]->getFoodData(); + int food = foodData->getFoodLevel(); + int oldFood = foodData->getLastFoodLevel(); + bool hasHungerEffect = pMinecraft->localplayers[iPad]->hasEffect(MobEffect::hunger); + int saturationLevel = pMinecraft->localplayers[iPad]->getFoodData()->getSaturationLevel(); + + SetFood(food, oldFood, hasHungerEffect); + SetFoodSaturationLevel(saturationLevel); + + // Update air + if (pMinecraft->localplayers[iPad]->isUnderLiquid(Material::water)) + { + ShowAir(true); + int count = (int) ceil((pMinecraft->localplayers[iPad]->getAirSupply() - 2) * 10.0f / Player::TOTAL_AIR_SUPPLY); + int extra = (int) ceil((pMinecraft->localplayers[iPad]->getAirSupply()) * 10.0f / Player::TOTAL_AIR_SUPPLY) - count; + SetAir(count, extra); + } + else + { + ShowAir(false); + } + } + else if(riding->instanceof(eTYPE_LIVINGENTITY) ) + { + shared_ptr living = dynamic_pointer_cast(riding); + int riderCurrentHealth = (int) ceil(living->getHealth()); + float maxRiderHealth = living->getMaxHealth(); + + SetRidingHorse(true, pMinecraft->localplayers[iPad]->isRidingJumpable(), maxRiderHealth); + SetHorseHealth(riderCurrentHealth); + ShowHorseHealth(true); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HUD.h b/Minecraft.Client/Common/UI/IUIScene_HUD.h new file mode 100644 index 00000000..0f643dd3 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HUD.h @@ -0,0 +1,85 @@ +#pragma once + +class IUIScene_HUD +{ +protected: + int m_lastActiveSlot; + int m_iGuiScale; + bool m_bToolTipsVisible; + float m_lastExpProgress; + int m_lastExpLevel; + int m_iCurrentHealth; + int m_lastMaxHealth; + bool m_lastHealthBlink, m_lastHealthPoison, m_lastHealthWither; + int m_iCurrentFood; + bool m_lastFoodPoison; + int m_lastAir, m_currentExtraAir; + int m_lastArmour; + float m_lastDragonHealth; + bool m_showDragonHealth; + int m_ticksWithNoBoss; + bool m_lastShowDisplayName; + int m_horseHealth; + int m_iCurrentHealthAbsorb; + float m_horseJumpProgress; + int m_iHeartOffsetIndex; + bool m_bHealthAbsorbActive; + int m_iHorseMaxHealth; + + bool m_showHealth, m_showHorseHealth, m_showFood, m_showAir, m_showArmour, m_showExpBar, m_bRidingHorse, m_bIsJumpable; + bool m_bRegenEffectEnabled; + int m_iFoodSaturation; + + unsigned int m_uiSelectedItemOpacityCountDown; + + wstring m_displayName; + + IUIScene_HUD(); + + virtual int getPad() = 0; + virtual void SetOpacity(float opacity) = 0; + virtual void SetVisible(bool visible) = 0; + + virtual void SetHudSize(int scale) = 0; + virtual void SetExpBarProgress(float progress, int xpNeededForNextLevel) = 0; + virtual void SetExpLevel(int level) = 0; + virtual void SetActiveSlot(int slot) = 0; + + virtual void SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison, bool bWither) = 0; + virtual void SetFood(int iFood, int iLastFood, bool bPoison) = 0; + virtual void SetAir(int iAir, int extra) = 0; + virtual void SetArmour(int iArmour) = 0; + + virtual void ShowHealth(bool show) = 0; + virtual void ShowHorseHealth(bool show) = 0; + virtual void ShowFood(bool show) = 0; + virtual void ShowAir(bool show) = 0; + virtual void ShowArmour(bool show) = 0; + virtual void ShowExpBar(bool show) = 0; + + virtual void SetRegenerationEffect(bool bEnabled) = 0; + virtual void SetFoodSaturationLevel(int iSaturation) = 0; + + virtual void SetDragonHealth(float health) = 0; + virtual void SetDragonLabel(const wstring &label) = 0; + virtual void ShowDragonHealth(bool show) = 0; + + virtual void HideSelectedLabel() = 0; + + virtual void SetDisplayName(const wstring &displayName) = 0; + + virtual void SetTooltipsEnabled(bool bEnabled) = 0; + + virtual void SetRidingHorse(bool ridingHorse, bool bIsJumpable, int maxHorseHealth) = 0; + virtual void SetHorseHealth(int health, bool blink = false) = 0; + virtual void SetHorseJumpBarProgress(float progress) = 0; + + virtual void SetHealthAbsorb(int healthAbsorb) = 0; + + virtual void SetSelectedLabel(const wstring &label) = 0; + virtual void ShowDisplayName(bool show) = 0; + +public: + void updateFrameTick(); + void renderPlayerHealth(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp new file mode 100644 index 00000000..392c12d4 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "IUIScene_HopperMenu.h" +#include "../Minecraft.World/net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_HopperMenu::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 eSectionHopperContents: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionHopperInventory; + xOffset = -2; + } + else if(eTapDirection == eTapStateUp) + { + xOffset = -2; + newSection = eSectionHopperUsing; + } + break; + case eSectionHopperInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionHopperUsing; + } + else if(eTapDirection == eTapStateUp) + { + xOffset = 2; + newSection = eSectionHopperContents; + } + break; + case eSectionHopperUsing: + if(eTapDirection == eTapStateDown) + { + xOffset = 2; + newSection = eSectionHopperContents; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionHopperInventory; + } + break; + default: + assert(false); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_HopperMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionHopperContents: + offset = HopperMenu::CONTENTS_SLOT_START; + break; + case eSectionHopperInventory: + offset = HopperMenu::INV_SLOT_START; + break; + case eSectionHopperUsing: + offset = HopperMenu::USE_ROW_SLOT_START; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HopperMenu.h b/Minecraft.Client/Common/UI/IUIScene_HopperMenu.h new file mode 100644 index 00000000..ef6d8d25 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HopperMenu.h @@ -0,0 +1,12 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" +#include "../../../Minecraft.World/Container.h" +#include "../../../Minecraft.World/Inventory.h" + +class IUIScene_HopperMenu : public virtual IUIScene_AbstractContainerMenu +{ +public: + virtual ESceneSection GetSectionAndSlotInDirection(ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY); + int getSectionStartOffset(ESceneSection eSection); +}; diff --git a/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.cpp new file mode 100644 index 00000000..8f1caab8 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.cpp @@ -0,0 +1,251 @@ +#include "stdafx.h" +#include "IUIScene_HorseInventoryMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.animal.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_HorseInventoryMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + int xOffset = 0; + int yOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionHorseUsing: + if(eTapDirection == eTapStateDown) + { + if(m_horse->isChestedHorse() && *piTargetX >= 4) + { + newSection = eSectionHorseChest; + xOffset = 4; + } + else + { + newSection = eSectionHorseSaddle; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionHorseInventory; + } + break; + case eSectionHorseInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionHorseUsing; + } + else if(eTapDirection == eTapStateUp) + { + if(m_horse->isChestedHorse() && *piTargetX >= 4) + { + xOffset = 4; + newSection = eSectionHorseChest; + } + else if(m_horse->canWearArmor()) + { + newSection = eSectionHorseArmor; + } + else + { + newSection = eSectionHorseSaddle; + } + } + break; + case eSectionHorseChest: + if(eTapDirection == eTapStateDown) + { + xOffset = -4; + newSection = eSectionHorseInventory; + } + else if(eTapDirection == eTapStateUp) + { + xOffset = -4; + newSection = eSectionHorseUsing; + } + else if(eTapDirection == eTapStateLeft) + { + if(*piTargetX < 0) + { + if(m_horse->canWearArmor() && *piTargetY == 1) + { + newSection = eSectionHorseArmor; + } + else if( *piTargetY == 0) + { + newSection = eSectionHorseSaddle; + } + } + } + else if(eTapDirection == eTapStateRight) + { + if(*piTargetX >= getSectionColumns(eSectionHorseChest)) + { + if(m_horse->canWearArmor() && *piTargetY == 1) + { + newSection = eSectionHorseArmor; + } + else if( *piTargetY == 0) + { + newSection = eSectionHorseSaddle; + } + } + } + break; + case eSectionHorseArmor: + if(eTapDirection == eTapStateDown) + { + if(m_horse->isChestedHorse()) + { + newSection = eSectionHorseChest; + } + else + { + newSection = eSectionHorseInventory; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionHorseSaddle; + } + else if(eTapDirection == eTapStateRight) + { + if(m_horse->isChestedHorse()) + { + yOffset = -1; + *piTargetX = 0; + newSection = eSectionHorseChest; + } + } + else if(eTapDirection == eTapStateLeft) + { + if(m_horse->isChestedHorse()) + { + yOffset = -1; + *piTargetX = getSectionColumns(eSectionHorseChest); + newSection = eSectionHorseChest; + } + } + break; + case eSectionHorseSaddle: + if(eTapDirection == eTapStateDown) + { + if(m_horse->canWearArmor()) + { + newSection = eSectionHorseArmor; + } + else + { + newSection = eSectionHorseInventory; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionHorseUsing; + } + else if(eTapDirection == eTapStateRight) + { + if(m_horse->isChestedHorse()) + { + *piTargetX = 0; + newSection = eSectionHorseChest; + } + } + else if(eTapDirection == eTapStateLeft) + { + if(m_horse->isChestedHorse()) + { + *piTargetX = getSectionColumns(eSectionHorseChest); + newSection = eSectionHorseChest; + } + } + break; + default: + assert(false); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset, yOffset); + + return newSection; +} + +// TODO: Offset will vary by type of horse, add in once horse menu and horse entity are implemented +int IUIScene_HorseInventoryMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionHorseSaddle: + offset = EntityHorse::INV_SLOT_SADDLE; + break; + case eSectionHorseArmor: + offset = EntityHorse::INV_SLOT_ARMOR; + break; + case eSectionHorseChest: + offset = EntityHorse::INV_BASE_COUNT; + break; + case eSectionHorseInventory: + offset = EntityHorse::INV_BASE_COUNT; + if(m_horse->isChestedHorse()) + { + offset += EntityHorse::INV_DONKEY_CHEST_COUNT; + } + break; + case eSectionHorseUsing: + offset = EntityHorse::INV_BASE_COUNT + 27; + if(m_horse->isChestedHorse()) + { + offset += EntityHorse::INV_DONKEY_CHEST_COUNT; + } + break; + default: + assert( false ); + break; + } + return offset; +} + +bool IUIScene_HorseInventoryMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionHorseChest: + if(!m_horse->isChestedHorse()) + return false; + else + return true; + case eSectionHorseArmor: + if(!m_horse->canWearArmor()) + return false; + else + return true; + case eSectionHorseSaddle: + case eSectionHorseInventory: + case eSectionHorseUsing: + return true; + } + return false; +} + +bool IUIScene_HorseInventoryMenu::IsVisible( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionHorseChest: + if(!m_horse->isChestedHorse()) + return false; + else + return true; + case eSectionHorseArmor: + if(!m_horse->canWearArmor()) + return false; + else + return true; + case eSectionHorseSaddle: + case eSectionHorseInventory: + case eSectionHorseUsing: + return true; + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.h b/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.h new file mode 100644 index 00000000..6df2001e --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.h @@ -0,0 +1,20 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" +#include "../../../Minecraft.World/Container.h" +#include "../../../Minecraft.World/Inventory.h" +#include "../../../Minecraft.World/EntityHorse.h" + +class IUIScene_HorseInventoryMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + shared_ptr m_inventory; + shared_ptr m_container; + shared_ptr m_horse; + +public: + virtual ESceneSection GetSectionAndSlotInDirection(ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY); + int getSectionStartOffset(ESceneSection eSection); + bool IsSectionSlotList( ESceneSection eSection ); + bool IsVisible( ESceneSection eSection ); +}; diff --git a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp index 79203e7c..ab1767d4 100644 --- a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp @@ -11,15 +11,23 @@ #include "..\..\DLCTexturePack.h" #include "..\..\..\Minecraft.World\StringHelpers.h" +#ifndef _XBOX +#include "UI.h" +#endif + int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; +#ifdef _XBOX + IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam; +#else + IUIScene_PauseMenu *pScene = dynamic_cast(ui.GetSceneFromCallbackId((size_t)pParam)); +#endif // Results switched for this dialog if(result==C4JStorage::EMessage_ResultDecline) { - scene->SetIgnoreInput(true); + if(pScene) pScene->SetIgnoreInput(true); app.SetAction(iPad,eAppAction_ExitWorld); } return 0; @@ -28,7 +36,11 @@ int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage: int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; +#ifdef _XBOX + IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam; +#else + IUIScene_PauseMenu *pScene = dynamic_cast(ui.GetSceneFromCallbackId((size_t)pParam)); +#endif // Exit with or without saving // Decline means save in this dialog @@ -62,7 +74,7 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor 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); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() , &IUIScene_PauseMenu::WarningTrialTexturePackReturned, pParam); return S_OK; } @@ -78,7 +90,7 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor 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); + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameAndSaveReturned, pParam); return 0; } else @@ -95,11 +107,11 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor 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); + ui.RequestAlertMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameDeclineSaveReturned, pParam); return 0; } - scene->SetIgnoreInput(true); + if(pScene) pScene->SetIgnoreInput(true); app.SetAction(iPad,eAppAction_ExitWorld); } @@ -110,7 +122,11 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor 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; +#ifdef _XBOX + IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam; +#else + IUIScene_PauseMenu *pScene = dynamic_cast(ui.GetSceneFromCallbackId((size_t)pParam)); +#endif // results switched for this dialog if(result==C4JStorage::EMessage_ResultDecline) @@ -121,7 +137,7 @@ int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage #if defined(_XBOX_ONE) || defined(__ORBIS__) StorageManager.SetSaveDisabled(false); #endif - scene->SetIgnoreInput(true); + if(pScene) pScene->SetIgnoreInput(true); MinecraftServer::getInstance()->setSaveOnExit( true ); // flag a app action of exit game app.SetAction(iPad,eAppAction_ExitWorld); @@ -139,11 +155,11 @@ int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); } } } @@ -154,7 +170,11 @@ int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; +#ifdef _XBOX + IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam; +#else + IUIScene_PauseMenu *pScene = dynamic_cast(ui.GetSceneFromCallbackId((size_t)pParam)); +#endif // results switched for this dialog if(result==C4JStorage::EMessage_ResultDecline) @@ -163,7 +183,7 @@ int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JSto // 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); + if(pScene) pScene->SetIgnoreInput(true); MinecraftServer::getInstance()->setSaveOnExit( false ); // flag a app action of exit game app.SetAction(iPad,eAppAction_ExitWorld); @@ -181,11 +201,11 @@ int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JSto 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); } } @@ -214,7 +234,7 @@ int IUIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4 { 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); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else { @@ -288,7 +308,7 @@ int IUIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4 { // 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } } } @@ -498,7 +518,7 @@ void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter) 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()); + if( ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) ui.RequestErrorMessage( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); exitReasonStringId = -1; // 4J - Force a disconnection, this handles the situation that the server has already disconnected @@ -596,7 +616,7 @@ void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter) UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); exitReasonStringId = -1; } } @@ -644,7 +664,7 @@ int IUIScene_PauseMenu::SaveGameDialogReturned(void *pParam,int iPad,C4JStorage: 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); + ui.RequestAlertMessage(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,pParam); #else // flag a app action of save game app.SetAction(iPad,eAppAction_SaveGame); diff --git a/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp index be611778..d3a9e8f0 100644 --- a/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp @@ -239,7 +239,7 @@ void IUIScene_StartGame::UpdateCurrentTexturePack(int iSlot) // 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()); + ui.RequestErrorMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&:TexturePackDialogReturned,this); // do set the texture pack id, and on the user pressing create world, check they have it m_MoreOptionsParams.dwTexturePack = ListItem.iData; @@ -368,7 +368,7 @@ int IUIScene_StartGame::TexturePackDialogReturned(void *pParam,int iPad,C4JStora { // 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } } } diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp index 658bcdfb..8cc04940 100644 --- a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp @@ -1,6 +1,7 @@ #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.world.item.h" #include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" #include "..\..\Minecraft.h" #include "..\..\MultiPlayerLocalPlayer.h" @@ -77,6 +78,9 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) int buyBMatches = player->inventory->countMatches(buyBItem); if( (buyAItem != NULL && buyAMatches >= buyAItem->count) && (buyBItem == NULL || buyBMatches >= buyBItem->count) ) { + // 4J-JEV: Fix for PS4 #7111: [PATCH 1.12] Trading Librarian villagers for multiple Enchanted Books will cause the title to crash. + int actualShopItem = m_activeOffers.at(selectedShopItem).second; + m_merchant->notifyTrade(activeRecipe); // Remove the items we are purchasing with @@ -91,7 +95,6 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) } // 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(); @@ -238,15 +241,14 @@ void IUIScene_TradingMenu::updateDisplay() // 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())); + wsTemp = replaceAll(wsTemp,L"{*VILLAGER_TYPE*}",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); + vector *offerDescription = GetItemDescription(activeRecipe->getSellItem()); + setOfferDescription(offerDescription); shared_ptr buyAItem = activeRecipe->getBuyAItem(); shared_ptr buyBItem = activeRecipe->getBuyBItem(); @@ -299,13 +301,15 @@ void IUIScene_TradingMenu::updateDisplay() } else { - setTitle(app.GetString(m_merchant->getDisplayName())); + setTitle(m_merchant->getDisplayName()); setRequest1Name(L""); setRequest2Name(L""); setRequest1RedBox(false); setRequest2RedBox(false); setRequest1Item(nullptr); - setRequest2Item(nullptr); + setRequest2Item(nullptr); + vector offerDescription; + setOfferDescription(&offerDescription); } m_bHasUpdatedOnce = true; @@ -361,27 +365,20 @@ void IUIScene_TradingMenu::setTradeItem(int index, shared_ptr item { } -wstring IUIScene_TradingMenu::GetItemDescription(shared_ptr item, vector &unformattedStrings) +vector *IUIScene_TradingMenu::GetItemDescription(shared_ptr item) { - if(item == NULL) return L""; + vector *lines = item->getHoverText(nullptr, false); - wstring desc = L""; - vector *strings = item->getHoverTextOnly(nullptr, false, unformattedStrings); - bool firstLine = true; - for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) + // Add rarity to first line + if (lines->size() > 0) { - wstring thisString = *it; - if(!firstLine) - { - desc.append( L"
" ); - } - else - { - firstLine = false; - } - desc.append( thisString ); + lines->at(0).color = item->getRarity()->color; } - strings->clear(); - delete strings; - return desc; + + return lines; } + +void IUIScene_TradingMenu::HandleInventoryUpdated() +{ + updateDisplay(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h index c8edda67..726f13c7 100644 --- a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h @@ -40,16 +40,19 @@ protected: 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 setOfferDescription(vector *description) = 0; virtual void setRequest1Item(shared_ptr item); virtual void setRequest2Item(shared_ptr item); virtual void setTradeItem(int index, shared_ptr item); -private: void updateDisplay(); + void HandleInventoryUpdated(); + +private: bool canMake(MerchantRecipe *recipe); - wstring GetItemDescription(shared_ptr item, vector &unformattedStrings); + + vector *GetItemDescription(shared_ptr item); public: shared_ptr getMerchant(); diff --git a/Minecraft.Client/Common/UI/UI.h b/Minecraft.Client/Common/UI/UI.h index 622ccf84..428b3b90 100644 --- a/Minecraft.Client/Common/UI/UI.h +++ b/Minecraft.Client/Common/UI/UI.h @@ -31,10 +31,12 @@ #include "UIControl_HTMLLabel.h" #include "UIControl_DynamicLabel.h" #include "UIControl_MinecraftPlayer.h" +#include "UIControl_MinecraftHorse.h" #include "UIControl_PlayerSkinPreview.h" #include "UIControl_EnchantmentButton.h" #include "UIControl_EnchantmentBook.h" #include "UIControl_SpaceIndicatorBar.h" +#include "UIControl_BeaconEffectButton.h" #ifdef __PSVITA__ #include "UIControl_Touch.h" @@ -85,6 +87,7 @@ #include "UIScene_SettingsUIMenu.h" #include "UIScene_SkinSelectMenu.h" #include "UIScene_HowToPlayMenu.h" +#include "UIScene_LanguageSelector.h" #include "UIScene_HowToPlay.h" #include "UIScene_ControlsMenu.h" #include "UIScene_Credits.h" @@ -101,6 +104,10 @@ #include "UIScene_CreativeMenu.h" #include "UIScene_TradingMenu.h" #include "UIScene_AnvilMenu.h" +#include "UIScene_HorseInventoryMenu.h" +#include "UIScene_HopperMenu.h" +#include "UIScene_BeaconMenu.h" +#include "UIScene_FireworksMenu.h" #include "UIScene_CraftingMenu.h" #include "UIScene_SignEntryMenu.h" @@ -116,3 +123,4 @@ #include "UIScene_TeleportMenu.h" #include "UIScene_EndPoem.h" #include "UIScene_EULA.h" +#include "UIScene_NewUpdateMessage.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIBitmapFont.cpp b/Minecraft.Client/Common/UI/UIBitmapFont.cpp index ec49eea3..afc2b139 100644 --- a/Minecraft.Client/Common/UI/UIBitmapFont.cpp +++ b/Minecraft.Client/Common/UI/UIBitmapFont.cpp @@ -39,16 +39,16 @@ UIAbstractBitmapFont::UIAbstractBitmapFont(const string &fontname) void UIAbstractBitmapFont::registerFont() { - if(m_registered) + if (!m_registered) { - return; + // 4J-JEV: These only need registering the once when we first use this font in Iggy. + m_bitmapFontProvider->num_glyphs = m_numGlyphs; + IggyFontInstallBitmapUTF8( m_bitmapFontProvider, m_fontname.c_str(), -1, IGGY_FONTFLAG_none ); + m_registered = true; } - 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; + // 4J-JEV: Reset the font redirect to these fonts (we must do this everytime in-case we switched away elsewhere). + IggyFontSetIndirectUTF8( m_fontname.c_str(), -1, IGGY_FONTFLAG_all, m_fontname.c_str(), -1, IGGY_FONTFLAG_none ); } IggyFontMetrics * RADLINK UIAbstractBitmapFont::GetFontMetrics_Callback(void *user_context,IggyFontMetrics *metrics) @@ -357,7 +357,7 @@ rrbool UIBitmapFont::GetGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacte } //Callback function type for freeing a bitmap shape returned by GetGlyphBitmap -void RADLINK UIBitmapFont::FreeGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +void 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/UIComponent_Panorama.cpp b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp index a418fcda..cb6443a1 100644 --- a/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp @@ -51,7 +51,7 @@ void UIComponent_Panorama::tick() // 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; + i64TimeOfDay = pMinecraft->level->getLevelData()->getGameTime() % 24000; } if(i64TimeOfDay>14000) diff --git a/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp index 2feb94c1..9af43df4 100644 --- a/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp @@ -21,18 +21,15 @@ UIComponent_PressStartToPlay::UIComponent_PressStartToPlay(int iPad, void *initD m_labelTrialTimer.init(L""); m_labelTrialTimer.setVisible(false); + // 4J-JEV: This object is persistent, so this string needs to be able to handle language changes. #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()); + m_labelPressStart.init( (UIString) [] { return replaceAll(app.GetString(IDS_PRESS_X_TO_JOIN), L"{*CONTROLLER_VK_A*}", app.GetVKReplacement(VK_PAD_A) ); }); #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()); + m_labelPressStart.init( (UIString) [] { return replaceAll(app.GetString(IDS_PRESS_START_TO_JOIN), L"{*CONTROLLER_VK_START*}", app.GetVKReplacement(VK_PAD_START) ); }); #else - m_labelPressStart.init(app.GetString(IDS_PRESS_START_TO_JOIN)); + m_labelPressStart.init(IDS_PRESS_START_TO_JOIN); #endif + m_controlSaveIcon.setVisible(false); m_controlPressStartPanel.setVisible(false); m_playerDisplayName.setVisible(false); diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp index 63eba1a5..255740c9 100644 --- a/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp @@ -177,6 +177,18 @@ void UIComponent_Tooltips::tick() fVal=0.01f*(float)ucAlpha; } setOpacity(fVal); + + bool layoutChanges = false; + for (int i = 0; i < eToolTipNumButtons; i++) + { + if ( !ui.IsReloadingSkin() && m_tooltipValues[i].show && m_tooltipValues[i].label.needsUpdating() ) + { + layoutChanges = true; + _SetTooltip(i, m_tooltipValues[i].label, m_tooltipValues[i].show, true); + m_tooltipValues[i].label.setUpdated(); + } + } + if (layoutChanges) _Relayout(); } void UIComponent_Tooltips::render(S32 width, S32 height, C4JRender::eViewportType viewport) @@ -272,7 +284,7 @@ void UIComponent_Tooltips::ShowTooltip( unsigned int tooltip, bool show ) } } -void UIComponent_Tooltips::SetTooltips( int iA, int iB, int iX, int iY , int iLT, int iRT, int iLB, int iRB, int iLS, bool forceUpdate) +void UIComponent_Tooltips::SetTooltips( int iA, int iB, int iX, int iY , int iLT, int iRT, int iLB, int iRB, int iLS, int iRS, int iBack, bool forceUpdate) { bool needsRelayout = false; needsRelayout = _SetTooltip( eToolTipButtonA, iA ) || needsRelayout; @@ -284,8 +296,10 @@ void UIComponent_Tooltips::SetTooltips( int iA, int iB, int iX, int iY , int iLT needsRelayout = _SetTooltip( eToolTipButtonLB, iLB ) || needsRelayout; needsRelayout = _SetTooltip( eToolTipButtonRB, iRB ) || needsRelayout; needsRelayout = _SetTooltip( eToolTipButtonLS, iLS ) || needsRelayout; - - if(needsRelayout)_Relayout(); + needsRelayout = _SetTooltip( eToolTipButtonRS, iRS ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonRS, iRS ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonBack, iBack ) || needsRelayout; + if (needsRelayout) _Relayout(); } void UIComponent_Tooltips::EnableTooltip( unsigned int tooltip, bool enable ) @@ -299,20 +313,21 @@ bool UIComponent_Tooltips::_SetTooltip(unsigned int iToolTip, int iTextID) { 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); + if(iTextID > -1) _SetTooltip(iToolTip, 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) +void UIComponent_Tooltips::_SetTooltip(unsigned int iToolTipId, UIString label, bool show, bool force) { if(!force && !show && !m_tooltipValues[iToolTipId].show) { return; } m_tooltipValues[iToolTipId].show = show; + m_tooltipValues[iToolTipId].label = label; IggyDataValue result; IggyDataValue value[3]; @@ -330,7 +345,7 @@ void UIComponent_Tooltips::_SetTooltip(unsigned int iToolTipId, const wstring &l value[2].boolval = show; IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetTooltip , 3 , value ); - app.DebugPrintf("Actual tooltip update!\n"); + //app.DebugPrintf("Actual tooltip update!\n"); } void UIComponent_Tooltips::_Relayout() @@ -350,6 +365,10 @@ void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int //app.DebugPrintf("ToolTip Touch ID = %i\n", iId); bool handled = false; + // 4J - TomK no tooltips no touch! + if((!ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) && (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) == 0)) + return; + // perform action on release if(bReleased) { @@ -357,11 +376,17 @@ void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int { case ETouchInput_Touch_A: app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_X\n", iId); - InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_X); + if(InputManager.IsCircleCrossSwapped()) + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_O); + else + 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); + if(InputManager.IsCircleCrossSwapped()) + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_X); + else + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_O); break; case ETouchInput_Touch_X: app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_SQUARE\n", iId); @@ -376,8 +401,8 @@ void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int 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); + app.DebugPrintf("ToolTip no action\n", iId); + /* no action */ break; case ETouchInput_Touch_LeftBumper: app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_L1\n", iId); @@ -391,6 +416,14 @@ void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int app.DebugPrintf("ToolTip no action\n", iId); /* no action */ break; + case ETouchInput_Touch_RightStick: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_DPAD_DOWN\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_DPAD_DOWN); + break; + case ETouchInput_Touch_Select: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_SELECT\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_SELECT); + break; } } } @@ -413,14 +446,14 @@ void UIComponent_Tooltips::handleReload() for(unsigned int i = 0; i < eToolTipNumButtons; ++i) { - _SetTooltip(i,app.GetString(m_tooltipValues[i].iString), m_tooltipValues[i].show, true); + _SetTooltip(i, 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]) + if( (0 <= iPad) && (iPad <= 3) && m_overrideSFX[iPad][key] ) { // don't play a sound for this action switch(key) diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.h b/Minecraft.Client/Common/UI/UIComponent_Tooltips.h index 4b4c8268..f8db9439 100644 --- a/Minecraft.Client/Common/UI/UIComponent_Tooltips.h +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.h @@ -13,6 +13,8 @@ protected: bool show; int iString; + UIString label; + _TooltipValues() { show = false; @@ -23,7 +25,7 @@ protected: TooltipValues m_tooltipValues[eToolTipNumButtons]; IggyName m_funcSetTooltip, m_funcSetOpacity, m_funcSetABSwap, m_funcUpdateLayout; - + #ifdef __PSVITA__ enum ETouchInput { @@ -36,6 +38,8 @@ protected: ETouchInput_Touch_LeftBumper, ETouchInput_Touch_RightBumper, ETouchInput_Touch_LeftStick, + ETouchInput_Touch_RightStick, + ETouchInput_Touch_Select, ETouchInput_Count, }; @@ -53,6 +57,8 @@ protected: 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") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_RightStick], "Touch_RightStick") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_Select], "Touch_Select") #endif UI_MAP_NAME( m_funcSetTooltip, L"SetToolTip") UI_MAP_NAME( m_funcSetOpacity, L"SetOpacity") @@ -88,7 +94,7 @@ public: 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 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, int iRS=-1, int iBack=-1, bool forceUpdate = false); virtual void EnableTooltip( unsigned int tooltip, bool enable ); virtual void handleReload(); @@ -99,7 +105,7 @@ public: private: bool _SetTooltip(unsigned int iToolTip, int iTextID); - void _SetTooltip(unsigned int iToolTipId, const wstring &label, bool show, bool force = false); + void _SetTooltip(unsigned int iToolTipId, UIString label, bool show, bool force = false); void _Relayout(); bool m_overrideSFX[XUSER_MAX_COUNT][ACTION_MAX_MENU]; diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp index 858a8b43..3b4eb097 100644 --- a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp @@ -21,6 +21,7 @@ UIComponent_TutorialPopup::UIComponent_TutorialPopup(int iPad, void *initData, U m_bContainerMenuVisible = false; m_bSplitscreenGamertagVisible = false; + m_iconType = e_ICON_TYPE_IGGY; m_labelDescription.init(L""); } @@ -63,6 +64,8 @@ void UIComponent_TutorialPopup::handleReload() 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 ); + + setupIconHolder(m_iconType); } void UIComponent_TutorialPopup::SetTutorialDescription(TutorialPopupInfo *info) @@ -317,7 +320,7 @@ wstring UIComponent_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, } else if(temp.find(L"{*StoneIcon*}")!=wstring::npos) { - m_iconItem = shared_ptr(new ItemInstance(Tile::rock_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::stone_Id,1,0)); } else { @@ -428,6 +431,7 @@ void UIComponent_TutorialPopup::UpdateInteractScenePosition(bool visible) bool bAllowAnim=false; bool isCraftingScene = (m_interactScene->getSceneType() == eUIScene_Crafting2x2Menu) || (m_interactScene->getSceneType() == eUIScene_Crafting3x3Menu); bool isCreativeScene = (m_interactScene->getSceneType() == eUIScene_CreativeMenu); + bool isTradingScene = (m_interactScene->getSceneType() == eUIScene_TradingMenu); switch(Minecraft::GetInstance()->localplayers[m_iPad]->m_iScreenSection) { case C4JRender::VIEWPORT_TYPE_FULLSCREEN: @@ -437,7 +441,7 @@ void UIComponent_TutorialPopup::UpdateInteractScenePosition(bool visible) break; default: // anim allowed for everything except the crafting 2x2 and 3x3, and the creative menu - if(!isCraftingScene && !isCreativeScene) + if(!isCraftingScene && !isCreativeScene && !isTradingScene) { bAllowAnim=true; } @@ -536,4 +540,6 @@ void UIComponent_TutorialPopup::setupIconHolder(EIcons icon) value[0].type = IGGY_DATATYPE_number; value[0].number = (F64)icon; IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetupIconHolder , 1 , value ); + + m_iconType = icon; } diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h index 36f78300..4e5f4285 100644 --- a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h @@ -39,6 +39,8 @@ private: e_ICON_TYPE_TRANSPORT = 11, }; + EIcons m_iconType; + public: UIComponent_TutorialPopup(int iPad, void *initData, UILayer *parentLayer); diff --git a/Minecraft.Client/Common/UI/UIControl.h b/Minecraft.Client/Common/UI/UIControl.h index 3b4ef050..e37f04de 100644 --- a/Minecraft.Client/Common/UI/UIControl.h +++ b/Minecraft.Client/Common/UI/UIControl.h @@ -20,6 +20,7 @@ public: eLabel, eLeaderboardList, eMinecraftPlayer, + eMinecraftHorse, ePlayerList, ePlayerSkinPreview, eProgress, diff --git a/Minecraft.Client/Common/UI/UIControl_Base.cpp b/Minecraft.Client/Common/UI/UIControl_Base.cpp index 18af2f63..7a4a24e5 100644 --- a/Minecraft.Client/Common/UI/UIControl_Base.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Base.cpp @@ -7,7 +7,7 @@ UIControl_Base::UIControl_Base() { m_bLabelChanged = false; - m_label = L""; + m_label; m_id = 0; } @@ -27,7 +27,7 @@ void UIControl_Base::tick() { UIControl::tick(); - if(m_bLabelChanged) + if ( m_label.needsUpdating() || m_bLabelChanged ) { //app.DebugPrintf("Calling SetLabel - '%ls'\n", m_label.c_str()); m_bLabelChanged = false; @@ -37,15 +37,17 @@ void UIControl_Base::tick() value[0].type = IGGY_DATATYPE_string_UTF16; IggyStringUTF16 stringVal; - stringVal.string = (IggyUTF16*)m_label.c_str(); + 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 ); + + m_label.setUpdated(); } } -void UIControl_Base::setLabel(const wstring &label, bool instant, bool force) +void UIControl_Base::setLabel(UIString label, bool instant, bool force) { if( force || ((!m_label.empty() || !label.empty()) && m_label.compare(label) != 0) ) m_bLabelChanged = true; m_label = label; @@ -67,20 +69,14 @@ void UIControl_Base::setLabel(const wstring &label, bool instant, bool force) } } -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 ); + 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); + m_label = wstring((wchar_t *)result.string16.string, result.string16.length); } return m_label.c_str(); diff --git a/Minecraft.Client/Common/UI/UIControl_Base.h b/Minecraft.Client/Common/UI/UIControl_Base.h index e70997c3..73ecac5a 100644 --- a/Minecraft.Client/Common/UI/UIControl_Base.h +++ b/Minecraft.Client/Common/UI/UIControl_Base.h @@ -1,6 +1,7 @@ #pragma once #include "UIControl.h" +#include "UIString.h" // This class maps to the FJ_Base class in actionscript class UIControl_Base : public UIControl @@ -12,7 +13,8 @@ protected: IggyName m_funcCheckLabelWidths; bool m_bLabelChanged; - wstring m_label; + UIString m_label; + public: UIControl_Base(); @@ -20,8 +22,9 @@ public: virtual void tick(); - virtual void setLabel(const wstring &label, bool instant = false, bool force = false); - virtual void setLabel(const string &label); + virtual void setLabel(UIString label, bool instant = false, bool force = false); + //virtual void setLabel(wstring label, bool instant = false, bool force = false) { this->setLabel(UIString::CONSTANT(label), instant, force); } + const wchar_t* getLabel(); virtual void setAllPossibleLabels(int labelCount, wchar_t labels[][256]); int getId() { return m_id; } diff --git a/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.cpp b/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.cpp new file mode 100644 index 00000000..7ee79307 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.cpp @@ -0,0 +1,121 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_BeaconEffectButton.h" + +UIControl_BeaconEffectButton::UIControl_BeaconEffectButton() +{ + m_data = 0; + m_icon = 0; + m_selected = false; + m_active = false; + m_focus = false; +} + +bool UIControl_BeaconEffectButton::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + bool success = UIControl::setupControl(scene,parent,controlName); + + m_funcChangeState = registerFastName(L"ChangeState"); + m_funcSetIcon = registerFastName(L"SetIcon"); + + return success; +} + +void UIControl_BeaconEffectButton::SetData(int data, int icon, bool active, bool selected) +{ + m_data = data; + m_active = active; + m_selected = selected; + + SetIcon(icon); + UpdateButtonState(); +} + +int UIControl_BeaconEffectButton::GetData() +{ + return m_data; +} + +void UIControl_BeaconEffectButton::SetButtonSelected(bool selected) +{ + if(selected != m_selected) + { + m_selected = selected; + + UpdateButtonState(); + } +} + +bool UIControl_BeaconEffectButton::IsButtonSelected() +{ + return m_selected; +} + +void UIControl_BeaconEffectButton::SetButtonActive(bool active) +{ + if(m_active != active) + { + m_active = active; + + UpdateButtonState(); + } +} + +void UIControl_BeaconEffectButton::setFocus(bool focus) +{ + if(m_focus != focus) + { + m_focus = focus; + + UpdateButtonState(); + } +} + +void UIControl_BeaconEffectButton::SetIcon(int icon) +{ + if(icon != m_icon) + { + m_icon = icon; + + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_icon; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetIcon , 1 , value ); + } +} + +void UIControl_BeaconEffectButton::UpdateButtonState() +{ + EState state = eState_Disabled; + + if(!m_active) + { + state = eState_Disabled; + } + else if(m_selected) + { + state = eState_Pressed; + } + else if(m_focus) + { + state = eState_Enabled_Selected; + } + else + { + state = eState_Enabled_Unselected; + } + + if(state != m_lastState) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = state; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcChangeState , 1 , value ); + + if(out == IGGY_RESULT_SUCCESS) m_lastState = state; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.h b/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.h new file mode 100644 index 00000000..788213da --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.h @@ -0,0 +1,49 @@ +#pragma once + +#include "UIControl.h" + +class UIControl_BeaconEffectButton : public UIControl +{ +private: + static const int BUTTON_DISABLED = 0; + static const int BUTTON_ENABLED_UNSELECTED = 1; + static const int BUTTON_ENABLED_SELECTED = 2; + static const int BUTTON_PRESSED = 3; + + enum EState + { + eState_Disabled, + eState_Enabled_Unselected, + eState_Enabled_Selected, + eState_Pressed + }; + EState m_lastState; + + int m_data; + int m_icon; + bool m_selected; + bool m_active; + bool m_focus; + + IggyName m_funcChangeState, m_funcSetIcon; + +public: + UIControl_BeaconEffectButton(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void SetData(int data, int icon, bool active, bool selected); + int GetData(); + + void SetButtonSelected(bool selected); + bool IsButtonSelected(); + + void SetButtonActive(bool active); + + virtual void setFocus(bool focus); + + void SetIcon(int icon); + +private: + void UpdateButtonState(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Button.cpp b/Minecraft.Client/Common/UI/UIControl_Button.cpp index 96ddb8eb..70adb6b1 100644 --- a/Minecraft.Client/Common/UI/UIControl_Button.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Button.cpp @@ -17,7 +17,7 @@ bool UIControl_Button::setupControl(UIScene *scene, IggyValuePath *parent, const return success; } -void UIControl_Button::init(const wstring &label, int id) +void UIControl_Button::init(UIString label, int id) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_Button.h b/Minecraft.Client/Common/UI/UIControl_Button.h index 367a48d7..7369e8a0 100644 --- a/Minecraft.Client/Common/UI/UIControl_Button.h +++ b/Minecraft.Client/Common/UI/UIControl_Button.h @@ -12,7 +12,9 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id); + void init(UIString label, int id); + //void init(const wstring &label, int id) { init(UIString::CONSTANT(label), id); } + virtual void ReInit(); void setEnable(bool enable); diff --git a/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp b/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp index 32db4843..68a3d655 100644 --- a/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp +++ b/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp @@ -195,3 +195,47 @@ bool UIControl_ButtonList::CanTouchTrigger(S32 iX, S32 iY) return bCanTouchTrigger; } #endif + + +void UIControl_DynamicButtonList::tick() +{ + UIControl_ButtonList::tick(); + + int buttonIndex = 0; + vector::iterator itr; + for (itr = m_labels.begin(); itr != m_labels.end(); itr++) + { + if ( itr->needsUpdating() ) + { + setButtonLabel(buttonIndex, itr->getString()); + itr->setUpdated(); + } + buttonIndex++; + } +} + +void UIControl_DynamicButtonList::addItem(UIString label, int data) +{ + if (data < 0) data = m_itemCount; + + if (data < m_labels.size()) + { + m_labels[data] = label; + } + else + { + while (data > m_labels.size()) + { + m_labels.push_back(UIString()); + } + m_labels.push_back(label); + } + + UIControl_ButtonList::addItem(label.getString(), data); +} + +void UIControl_DynamicButtonList::removeItem(int index) +{ + m_labels.erase( m_labels.begin() + index ); + UIControl_ButtonList::removeItem(index); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_ButtonList.h b/Minecraft.Client/Common/UI/UIControl_ButtonList.h index a3c5da3a..44484ac3 100644 --- a/Minecraft.Client/Common/UI/UIControl_ButtonList.h +++ b/Minecraft.Client/Common/UI/UIControl_ButtonList.h @@ -41,4 +41,18 @@ public: void SetTouchFocus(S32 iX, S32 iY, bool bRepeat); bool CanTouchTrigger(S32 iX, S32 iY); #endif + }; + +class UIControl_DynamicButtonList : public UIControl_ButtonList +{ +protected: + vector m_labels; + +public: + virtual void tick(); + + virtual void addItem(UIString label, int data = -1); + + virtual void removeItem(int index); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp b/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp index d3bdf758..1c3e8afe 100644 --- a/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp +++ b/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp @@ -21,7 +21,7 @@ bool UIControl_CheckBox::setupControl(UIScene *scene, IggyValuePath *parent, con return success; } -void UIControl_CheckBox::init(const wstring &label, int id, bool checked) +void UIControl_CheckBox::init(UIString label, int id, bool checked) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_CheckBox.h b/Minecraft.Client/Common/UI/UIControl_CheckBox.h index 924e9c68..f8c0284b 100644 --- a/Minecraft.Client/Common/UI/UIControl_CheckBox.h +++ b/Minecraft.Client/Common/UI/UIControl_CheckBox.h @@ -14,7 +14,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, bool checked); + void init(UIString label, int id, bool checked); bool IsChecked(); bool IsEnabled(); diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp index ef7c0e94..9664dbf4 100644 --- a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp @@ -34,9 +34,7 @@ void UIControl_EnchantmentBook::render(IggyCustomDrawCallbackRegion *region) 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); + glScalef(-57/ssX, 57/ssX, 360.0f); glRotatef(45 + 90, 0, 1, 0); Lighting::turnOn(); diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp index e1490e0b..37f8fcf6 100644 --- a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp @@ -35,6 +35,18 @@ void UIControl_EnchantmentButton::init(int index) m_index = index; } + +void UIControl_EnchantmentButton::ReInit() +{ + UIControl_Button::ReInit(); + + + m_lastState = eState_Inactive; + m_lastCost = 0; + m_bHasFocus = false; + updateState(); +} + void UIControl_EnchantmentButton::tick() { updateState(); diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h index 9b8a3c8f..f7a703b3 100644 --- a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h @@ -46,7 +46,7 @@ public: virtual void tick(); void init(int index); - + virtual void ReInit(); void render(IggyCustomDrawCallbackRegion *region); void updateState(); diff --git a/Minecraft.Client/Common/UI/UIControl_Label.cpp b/Minecraft.Client/Common/UI/UIControl_Label.cpp index 1481fea1..47374d21 100644 --- a/Minecraft.Client/Common/UI/UIControl_Label.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Label.cpp @@ -5,6 +5,7 @@ UIControl_Label::UIControl_Label() { + m_reinitEnabled = true; } bool UIControl_Label::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) @@ -17,7 +18,7 @@ bool UIControl_Label::setupControl(UIScene *scene, IggyValuePath *parent, const return success; } -void UIControl_Label::init(const wstring &label) +void UIControl_Label::init(UIString label) { m_label = label; @@ -32,22 +33,13 @@ void UIControl_Label::init(const wstring &label) 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); + + // 4J-JEV: This can't be reinitialised. + if (m_reinitEnabled) + { + init(m_label); + } } diff --git a/Minecraft.Client/Common/UI/UIControl_Label.h b/Minecraft.Client/Common/UI/UIControl_Label.h index aa0f3f14..21eb35a6 100644 --- a/Minecraft.Client/Common/UI/UIControl_Label.h +++ b/Minecraft.Client/Common/UI/UIControl_Label.h @@ -4,12 +4,16 @@ class UIControl_Label : public UIControl_Base { +private: + bool m_reinitEnabled; + public: UIControl_Label(); virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label); - void init(const string &label); + void init(UIString label); virtual void ReInit(); + + void disableReinitialisation() { m_reinitEnabled = false; } }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.cpp b/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.cpp new file mode 100644 index 00000000..457e2028 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\EntityRenderDispatcher.h" + +#include "..\..\PlayerRenderer.h" +#include "..\..\HorseRenderer.h" + +#include "..\..\HumanoidModel.h" +#include "..\..\ModelHorse.h" + +#include "..\..\Lighting.h" +#include "..\..\ModelPart.h" +#include "..\..\Options.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +//#include "..\..\..\Minecraft.World\net.minecraft.world.entity.animal.EntityHorse.h" + +#include "..\..\MultiplayerLocalPlayer.h" +#include "UI.h" +#include "UIControl_MinecraftHorse.h" + +UIControl_MinecraftHorse::UIControl_MinecraftHorse() +{ + UIControl::setControlType(UIControl::eMinecraftHorse); + + 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_MinecraftHorse::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; + + // dynamic y offset according to region height + glTranslatef(xo, yo - (height / 7.5f), 50.0f); + + //UIScene_InventoryMenu *containerMenu = (UIScene_InventoryMenu *)m_parentScene; + UIScene_HorseInventoryMenu *containerMenu = (UIScene_HorseInventoryMenu *)m_parentScene; + + shared_ptr entityHorse = containerMenu->m_horse; + + // Base scale on height of this control + // Potentially we might want separate x & y scales here + float ss = width / (m_fScreenWidth / m_fScreenHeight) * 0.71f; + + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + float oybr = entityHorse->yBodyRot; + float oyr = entityHorse->yRot; + float oxr = entityHorse->xRot; + float oyhr = entityHorse->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); + + entityHorse->yBodyRot = (float) atan(xd / 40.0f) * 20; + entityHorse->yRot = (float) atan(xd / 40.0f) * 40; + entityHorse->xRot = -(float) atan(yd / 40.0f) * 20; + entityHorse->yHeadRot = entityHorse->yRot; + //entityHorse->glow = 1; + glTranslatef(0, entityHorse->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(entityHorse, 0, 0, 0, 0, 1, false, false); + pMinecraft->options->hideGui = wasHidingGui; + //entityHorse->glow = 0; + + entityHorse->yBodyRot = oybr; + entityHorse->yRot = oyr; + entityHorse->xRot = oxr; + entityHorse->yHeadRot = oyhr; + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.h b/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.h new file mode 100644 index 00000000..ec355527 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.h @@ -0,0 +1,15 @@ +#pragma once + +#include "UIControl.h" + +class UIControl_MinecraftHorse : public UIControl +{ +private: + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + +public: + UIControl_MinecraftHorse(); + + void render(IggyCustomDrawCallbackRegion *region); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp index 3a18ed53..d0625bce 100644 --- a/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp @@ -37,7 +37,8 @@ void UIControl_MinecraftPlayer::render(IggyCustomDrawCallbackRegion *region) float xo = width/2; float yo = height; - glTranslatef(xo, yo - 7.0f, 50.0f); + // dynamic y offset according to region height + glTranslatef(xo, yo - (height / 9.0f), 50.0f); float ss; diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp index 544b4da1..2d7c0224 100644 --- a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp @@ -217,7 +217,7 @@ void UIControl_PlayerSkinPreview::render(IggyCustomDrawCallbackRegion *region) pMinecraft->options->hideGui = true; //EntityRenderDispatcher::instance->render(pMinecraft->localplayers[0], 0, 0, 0, 0, 1); - EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_PLAYER); + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_LOCALPLAYER); if (renderer != NULL) { // 4J-PB - any additional parts to turn on for this player (skin dependent) @@ -335,7 +335,12 @@ void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, dou float s = 15 / 16.0f; glScalef(s, s, s); + // 4J - TomK - pull up character a bit more to make sure extra geo around feet doesn't cause rendering problems on PSVita +#ifdef __PSVITA__ + glTranslatef(0, -24 * _scale - 1.0f / 16.0f, 0); +#else glTranslatef(0, -24 * _scale - 0.125f / 16.0f, 0); +#endif #ifdef SKIN_PREVIEW_WALKING_ANIM m_walkAnimSpeedO = m_walkAnimSpeed; diff --git a/Minecraft.Client/Common/UI/UIControl_Progress.cpp b/Minecraft.Client/Common/UI/UIControl_Progress.cpp index e2ab817d..78e7c1d0 100644 --- a/Minecraft.Client/Common/UI/UIControl_Progress.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Progress.cpp @@ -23,7 +23,7 @@ bool UIControl_Progress::setupControl(UIScene *scene, IggyValuePath *parent, con return success; } -void UIControl_Progress::init(const wstring &label, int id, int min, int max, int current) +void UIControl_Progress::init(UIString label, int id, int min, int max, int current) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_Progress.h b/Minecraft.Client/Common/UI/UIControl_Progress.h index 8398a188..10601237 100644 --- a/Minecraft.Client/Common/UI/UIControl_Progress.h +++ b/Minecraft.Client/Common/UI/UIControl_Progress.h @@ -17,7 +17,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, int min, int max, int current); + void init(UIString label, int id, int min, int max, int current); virtual void ReInit(); void setProgress(int current); diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.cpp b/Minecraft.Client/Common/UI/UIControl_Slider.cpp index bd3b1ada..c2168002 100644 --- a/Minecraft.Client/Common/UI/UIControl_Slider.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Slider.cpp @@ -22,7 +22,7 @@ bool UIControl_Slider::setupControl(UIScene *scene, IggyValuePath *parent, const return success; } -void UIControl_Slider::init(const wstring &label, int id, int min, int max, int current) +void UIControl_Slider::init(UIString label, int id, int min, int max, int current) { m_label = label; m_id = id; @@ -104,6 +104,7 @@ S32 UIControl_Slider::GetRealWidth() void UIControl_Slider::setAllPossibleLabels(int labelCount, wchar_t labels[][256]) { + m_allPossibleLabels.clear(); for(unsigned int i = 0; i < labelCount; ++i) { m_allPossibleLabels.push_back(labels[i]); diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.h b/Minecraft.Client/Common/UI/UIControl_Slider.h index 0b57c2f1..505f6dd2 100644 --- a/Minecraft.Client/Common/UI/UIControl_Slider.h +++ b/Minecraft.Client/Common/UI/UIControl_Slider.h @@ -21,7 +21,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, int min, int max, int current); + void init(UIString label, int id, int min, int max, int current); void handleSliderMove(int newValue); void SetSliderTouchPos(float fTouchPos); diff --git a/Minecraft.Client/Common/UI/UIControl_SlotList.cpp b/Minecraft.Client/Common/UI/UIControl_SlotList.cpp index e2130431..01d7b9e5 100644 --- a/Minecraft.Client/Common/UI/UIControl_SlotList.cpp +++ b/Minecraft.Client/Common/UI/UIControl_SlotList.cpp @@ -22,6 +22,13 @@ bool UIControl_SlotList::setupControl(UIScene *scene, IggyValuePath *parent, con return success; } +void UIControl_SlotList::ReInit() +{ + UIControl_Base::ReInit(); + + m_lastHighlighted = -1; +} + void UIControl_SlotList::addSlot(int id) { IggyDataValue result; diff --git a/Minecraft.Client/Common/UI/UIControl_SlotList.h b/Minecraft.Client/Common/UI/UIControl_SlotList.h index ee741c4d..5bc1dc9a 100644 --- a/Minecraft.Client/Common/UI/UIControl_SlotList.h +++ b/Minecraft.Client/Common/UI/UIControl_SlotList.h @@ -14,6 +14,8 @@ public: UIControl_SlotList(); virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void ReInit(); void addSlot(int id); void addSlots(int iStartValue, int iCount); diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp index dfdea93e..74683a62 100644 --- a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp @@ -24,7 +24,7 @@ bool UIControl_SpaceIndicatorBar::setupControl(UIScene *scene, IggyValuePath *pa return success; } -void UIControl_SpaceIndicatorBar::init(const wstring &label, int id, __int64 min, __int64 max) +void UIControl_SpaceIndicatorBar::init(UIString label, int id, __int64 min, __int64 max) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h index 39f9a746..8eed3944 100644 --- a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h @@ -18,7 +18,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, __int64 min, __int64 max); + void init(UIString label, int id, __int64 min, __int64 max); virtual void ReInit(); void reset(); diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp index 4cb78d50..dc7bc532 100644 --- a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp @@ -20,7 +20,7 @@ bool UIControl_TextInput::setupControl(UIScene *scene, IggyValuePath *parent, co return success; } -void UIControl_TextInput::init(const wstring &label, int id) +void UIControl_TextInput::init(UIString label, int id) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.h b/Minecraft.Client/Common/UI/UIControl_TextInput.h index d4023884..98032d85 100644 --- a/Minecraft.Client/Common/UI/UIControl_TextInput.h +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.h @@ -13,7 +13,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id); + void init(UIString label, int id); void ReInit(); virtual void setFocus(bool focus); diff --git a/Minecraft.Client/Common/UI/UIController.cpp b/Minecraft.Client/Common/UI/UIController.cpp index 87c495d2..8b38bbb3 100644 --- a/Minecraft.Client/Common/UI/UIController.cpp +++ b/Minecraft.Client/Common/UI/UIController.cpp @@ -163,11 +163,17 @@ UIController::UIController() { m_uiDebugConsole = NULL; m_reloadSkinThread = NULL; + m_navigateToHomeOnReload = false; - m_mcTTFFont= NULL; + + m_bCleanupOnReload = false; + m_mcTTFFont = NULL; m_moj7 = NULL; m_moj11 = NULL; + // 4J-JEV: It's important that these remain the same, unless updateCurrentLanguage is going to be called. + m_eCurrentFont = m_eTargetFont = eFont_NotLoaded; + #ifdef ENABLE_IGGY_ALLOCATOR InitializeCriticalSection(&m_Allocatorlock); #endif @@ -211,6 +217,7 @@ UIController::UIController() m_bCustomRenderPosition = false; m_winUserIndex = 0; m_accumulatedTicks = 0; + m_lastUiSfx = 0; InitializeCriticalSection(&m_navigationLock); InitializeCriticalSection(&m_registeredCallbackScenesCS); @@ -303,79 +310,149 @@ void UIController::postInit() NavigateToScene(0, eUIScene_Intro); } -void UIController::SetupFont() -{ - bool bBitmapFont=false; - if(m_mcTTFFont!=NULL) +UIController::EFont UIController::getFontForLanguage(int language) { - delete m_mcTTFFont; + switch(language) + { + case XC_LANGUAGE_JAPANESE: return eFont_Japanese; +#ifdef _DURANGO + case XC_LANGUAGE_SCHINESE: return eFont_SimpChinese; +#endif + case XC_LANGUAGE_TCHINESE: return eFont_TradChinese; + case XC_LANGUAGE_KOREAN: return eFont_Korean; + default: return eFont_Bitmap; } +} - switch(XGetLanguage()) +UITTFFont *UIController::createFont(EFont fontLanguage) + { + switch(fontLanguage) { #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: + case eFont_Japanese: return new UITTFFont("Mojangles_TTF_jaJP", "Common/Media/font/JPN/DF-DotDotGothic16.ttf", 0x203B); // JPN + // case eFont_SimpChinese: Simplified Chinese is unsupported. + case eFont_TradChinese: return new UITTFFont("Mojangles_TTF_cnTD", "Common/Media/font/CHT/DFTT_R5.TTC", 0x203B); // CHT + case eFont_Korean: return new UITTFFont("Mojangles_TTF_koKR", "Common/Media/font/KOR/candadite2.ttf", 0x203B); // KOR #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; + case eFont_Japanese: return new UITTFFont("Mojangles_TTF_jaJP", "Common/Media/font/JPN/DFGMaruGothic-Md.ttf", 0x2022); // JPN +#ifdef _DURANGO + case eFont_SimpChinese: return new UITTFFont("Mojangled_TTF_cnCN", "Common/Media/font/CHS/MSYH.ttf", 0x2022); // CHS #endif - default: - bBitmapFont=true; - // m_mcTTFFont = new UITTFFont("Common/Media/font/Mojangles.ttf", 0x2022); // 4J-JEV: Shouldn't be using this. - break; + case eFont_TradChinese: return new UITTFFont("Mojangles_TTF_cnTD", "Common/Media/font/CHT/DFHeiMedium-B5.ttf", 0x2022); // CHT + case eFont_Korean: return new UITTFFont("Mojangles_TTF_koKR", "Common/Media/font/KOR/BOKMSD.ttf", 0x2022); // KOR +#endif + // 4J-JEV, Cyrillic characters have been added to this font now, (4/July/14) + // XC_LANGUAGE_RUSSIAN and XC_LANGUAGE_GREEK: + default: return NULL; + } +} + +void UIController::SetupFont() +{ + // 4J-JEV: Language hasn't changed or is already changing. + if ( (m_eCurrentFont != m_eTargetFont) || !UIString::setCurrentLanguage() ) return; + + DWORD nextLanguage = UIString::getCurrentLanguage(); + m_eTargetFont = getFontForLanguage(nextLanguage); + + // flag a language change to reload the string tables in the DLC + app.m_dlcManager.LanguageChanged(); + + app.loadStringTable(); // Switch to use new string table, + + if (m_eTargetFont == m_eCurrentFont) + { + // 4J-JEV: If we're ingame, reload the font to update all the text. + if (app.GetGameStarted()) app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadFont); + return; + } + + if (m_eCurrentFont != eFont_NotLoaded) app.DebugPrintf("[UIController] Font switch required for language transition to %i.\n", nextLanguage); + else app.DebugPrintf("[UIController] Initialising font for language %i.\n", nextLanguage); + + if (m_mcTTFFont != NULL) + { + delete m_mcTTFFont; + m_mcTTFFont = NULL; } - if(bBitmapFont) + if(m_eTargetFont == eFont_Bitmap) { // 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(); - } + if (m_moj7 == NULL) m_moj7 = new UIBitmapFont(SFontData::Mojangles_7); + if (m_moj11 == NULL) m_moj11 = new UIBitmapFont(SFontData::Mojangles_11); + + // 4J-JEV: Ensure we redirect to them correctly, even if the objects were previously initialised. + m_moj7->registerFont(); + m_moj11->registerFont(); + } + else if (m_eTargetFont != eFont_NotLoaded) + { + m_mcTTFFont = createFont(m_eTargetFont); + + app.DebugPrintf("[Iggy] Set font indirect to '%hs'.\n", m_mcTTFFont->getFontName().c_str()); + IggyFontSetIndirectUTF8( "Mojangles7", -1, IGGY_FONTFLAG_all, m_mcTTFFont->getFontName().c_str(), -1, IGGY_FONTFLAG_none ); + IggyFontSetIndirectUTF8( "Mojangles11", -1, IGGY_FONTFLAG_all, m_mcTTFFont->getFontName().c_str(), -1, IGGY_FONTFLAG_none ); } 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 ); + assert(false); + } + + // Reload ui to set new font. + if (m_eCurrentFont != eFont_NotLoaded) + { + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadFont); } + else + { + updateCurrentFont(); + } +} + +bool UIController::PendingFontChange() +{ + return getFontForLanguage( XGetLanguage() ) != m_eCurrentFont; +} + +void UIController::setCleanupOnReload() +{ + m_bCleanupOnReload = true; +} + +void UIController::updateCurrentFont() +{ + m_eCurrentFont = m_eTargetFont; +} + +bool UIController::UsingBitmapFont() +{ + return m_eCurrentFont == eFont_Bitmap; } // TICKING void UIController::tick() { - if(m_navigateToHomeOnReload && !ui.IsReloadingSkin()) + SetupFont(); // If necessary, change font. + + if ( (m_navigateToHomeOnReload || m_bCleanupOnReload) && !ui.IsReloadingSkin() ) { ui.CleanUpSkinReload(); + + if (m_navigateToHomeOnReload || !g_NetworkManager.IsInSession()) + { + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MainMenu); + } + else + { + ui.CloseAllPlayersScenes(); + } + + updateCurrentFont(); + m_navigateToHomeOnReload = false; - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MainMenu); + m_bCleanupOnReload = false; } for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) @@ -398,9 +475,6 @@ void UIController::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();) @@ -562,11 +636,12 @@ void UIController::ReloadSkin() // 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); + + // 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->Run(); //// Load new skin @@ -620,7 +695,7 @@ bool UIController::IsReloadingSkin() bool UIController::IsExpectingOrReloadingSkin() { - return Minecraft::GetInstance()->skins->getSelected()->isLoadingData() || Minecraft::GetInstance()->skins->needsUIUpdate() || IsReloadingSkin(); + return Minecraft::GetInstance()->skins->getSelected()->isLoadingData() || Minecraft::GetInstance()->skins->needsUIUpdate() || IsReloadingSkin() || PendingFontChange(); } void UIController::CleanUpSkinReload() @@ -1431,6 +1506,15 @@ void UIController::unregisterSubstitutionTexture(const wstring &textureName, boo // NAVIGATION bool UIController::NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer, EUIGroup group) { + static bool bSeenUpdateTextThisSession = false; + // If you're navigating to the multigamejoinload, and the player hasn't seen the updates message yet, display it now + // display this message the first 3 times + if((scene==eUIScene_LoadOrJoinMenu) && (bSeenUpdateTextThisSession==false) && ( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplayUpdateMessage)!=0)) + { + scene=eUIScene_NewUpdateMessage; + bSeenUpdateTextThisSession=true; + } + // 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)) { @@ -1451,6 +1535,8 @@ bool UIController::NavigateToScene(int iPad, EUIScene scene, void *initData, EUI case eUIScene_BrewingStandMenu: case eUIScene_AnvilMenu: case eUIScene_TradingMenu: + case eUIScene_BeaconMenu: + case eUIScene_HorseMenu: 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; @@ -1941,7 +2027,7 @@ void UIController::ShowTooltip( unsigned int iPad, unsigned int tooltip, bool sh 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) +void UIController::SetTooltips( unsigned int iPad, int iA, int iB, int iX, int iY, int iLT, int iRT, int iLB, int iRB, int iLS, int iRS, int iBack, bool forceUpdate) { EUIGroup group; @@ -1967,7 +2053,7 @@ void UIController::SetTooltips( unsigned int iPad, int iA, int iB, int iX, int i { 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); + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->SetTooltips(iA, iB, iX, iY, iLT, iRT, iLB, iRB, iLS, iRS, iBack, forceUpdate); } void UIController::EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ) @@ -2033,6 +2119,13 @@ void UIController::OverrideSFX(int iPad, int iAction,bool bVal) void UIController::PlayUISFX(ESoundEffect eSound) { + __uint64 time = System::currentTimeMillis(); + + // Don't play multiple SFX on the same tick + // (prevents horrible sounds when programmatically setting multiple checkboxes) + if (time - m_lastUiSfx < 10) { return; } + m_lastUiSfx = time; + Minecraft::GetInstance()->soundEngine->playUI(eSound,1.0f,1.0f); } @@ -2118,7 +2211,13 @@ void UIController::HandleTMSBanFileRetrieved(int iPad) void UIController::HandleInventoryUpdated(int iPad) { - app.DebugPrintf(app.USER_SR, "UIController::HandleInventoryUpdated not implemented\n"); + EUIGroup group = eUIGroup_Fullscreen; + if( app.GetGameStarted() && ( iPad != 255 ) && ( iPad >= 0 ) ) + { + group = (EUIGroup)(iPad+1); + } + + m_groups[group]->HandleMessage(eUIMessage_InventoryUpdated, NULL); } void UIController::HandleGameTick() @@ -2173,16 +2272,8 @@ void UIController::SetTutorialDescription(int iPad, TutorialPopupInfo *info) 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( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->RemoveInteractSceneReference(scene); } #endif @@ -2438,14 +2529,19 @@ 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::RequestAlertMessage(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, WCHAR *pwchFormatString) +{ + return RequestMessageBox(uiTitle, uiText, uiOptionA, uiOptionC, dwPad, Func, lpParam, pwchFormatString, 0, false); +} + +C4JStorage::EMessageResult UIController::RequestErrorMessage(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, WCHAR *pwchFormatString) +{ + return RequestMessageBox(uiTitle, uiText, uiOptionA, uiOptionC, dwPad, Func, lpParam, pwchFormatString, 0, true); +} + 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 + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError) + { MessageBoxInfo param; param.uiTitle = uiTitle; @@ -2453,7 +2549,7 @@ C4JStorage::EMessageResult UIController::RequestMessageBox(UINT uiTitle, UINT ui param.uiOptionA = uiOptionA; param.uiOptionC = uiOptionC; param.dwPad = dwPad; - param.Func = Func;\ + param.Func = Func; param.lpParam = lpParam; param.pwchFormatString = pwchFormatString; param.dwFocusButton = dwFocusButton; @@ -2512,11 +2608,11 @@ C4JStorage::EMessageResult UIController::RequestUGCMessageBox(UINT title/* = -1 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); + return ui.RequestAlertMessage( title, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, iPad, Func, lpParam); #else UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - return ui.RequestMessageBox( title, message, uiIDA, 1, iPad, Func, lpParam, app.GetStringTable(), NULL, 0, false); + return ui.RequestAlertMessage( title, message, uiIDA, 1, iPad, Func, lpParam); #endif } @@ -2551,7 +2647,7 @@ C4JStorage::EMessageResult UIController::RequestContentRestrictedMessageBox(UINT #else UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - return ui.RequestMessageBox( title, message, uiIDA, 1, iPad, Func, lpParam, app.GetStringTable(), NULL, 0, false); + return ui.RequestAlertMessage( title, message, uiIDA, 1, iPad, Func, lpParam); #endif } @@ -2705,10 +2801,13 @@ void UIController::TouchBoxRebuild(UIScene *pUIScene) control->getControlType() == UIControl::eLeaderboardList || control->getControlType() == UIControl::eTouchControl) { - // 4J-TomK update the control (it might have been moved by flash / AS) - control->UpdateControl(); + if(control->getVisible()) + { + // 4J-TomK update the control (it might have been moved by flash / AS) + control->UpdateControl(); - ui.TouchBoxAdd(control,eUIGroup,eUILayer,eUIscene, pUIScene->GetMainPanel()); + ui.TouchBoxAdd(control,eUIGroup,eUILayer,eUIscene, pUIScene->GetMainPanel()); + } } } } @@ -2960,7 +3059,8 @@ void UIController::HandleTouchInput(unsigned int iPad, unsigned int key, bool bP if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) { UIControl_CheckBox *pCheckbox=(UIControl_CheckBox *)m_ActiveUIElement->pControl; - pCheckbox->TouchSetCheckbox(!pCheckbox->IsChecked()); + if(pCheckbox->IsEnabled()) // only proceed if checkbox is enabled! + pCheckbox->TouchSetCheckbox(!pCheckbox->IsChecked()); } bReleased = false; break; diff --git a/Minecraft.Client/Common/UI/UIController.h b/Minecraft.Client/Common/UI/UIController.h index ef064f80..49c78032 100644 --- a/Minecraft.Client/Common/UI/UIController.h +++ b/Minecraft.Client/Common/UI/UIController.h @@ -38,10 +38,37 @@ private: S32 m_tileOriginX, m_tileOriginY; + enum EFont + { + eFont_NotLoaded = 0, + + eFont_Bitmap, + eFont_Japanese, + eFont_SimpChinese, + eFont_TradChinese, + eFont_Korean, + + }; + + // 4J-JEV: It's important that currentFont == targetFont, unless updateCurrentLanguage is going to be called. + EFont m_eCurrentFont, m_eTargetFont; + + // 4J-JEV: Behaves like navigateToHome when not ingame. When in-game, it closes all player scenes instead. + bool m_bCleanupOnReload; + + EFont getFontForLanguage(int language); + UITTFFont *createFont(EFont fontLanguage); + UIAbstractBitmapFont *m_mcBitmapFont; UITTFFont *m_mcTTFFont; UIBitmapFont *m_moj7, *m_moj11; +public: + void setCleanupOnReload(); + void updateCurrentFont(); + + +private: // 4J-PB - ui element type for PSVita touch control #ifdef __PSVITA__ @@ -136,6 +163,7 @@ private: C4JThread *m_reloadSkinThread; bool m_navigateToHomeOnReload; int m_accumulatedTicks; + __uint64 m_lastUiSfx; // Tracks time (ms) of last UI sound effect D3D11_RECT m_customRenderingClearRect; @@ -182,6 +210,9 @@ protected: public: CRITICAL_SECTION m_Allocatorlock; void SetupFont(); + bool PendingFontChange(); + bool UsingBitmapFont(); + public: // TICKING virtual void tick(); @@ -295,7 +326,7 @@ public: 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 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, int iRS=-1, int iBack=-1, bool forceUpdate = false); virtual void EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ); virtual void RefreshTooltips(unsigned int iPad); @@ -341,15 +372,12 @@ public: 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 + virtual C4JStorage::EMessageResult RequestAlertMessage(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, WCHAR *pwchFormatString=NULL); + virtual C4JStorage::EMessageResult RequestErrorMessage(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, WCHAR *pwchFormatString=NULL); +private: + virtual C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad,int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError); +public: 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); diff --git a/Minecraft.Client/Common/UI/UIEnums.h b/Minecraft.Client/Common/UI/UIEnums.h index c68b6740..45aff87d 100644 --- a/Minecraft.Client/Common/UI/UIEnums.h +++ b/Minecraft.Client/Common/UI/UIEnums.h @@ -54,7 +54,7 @@ enum EUIScene eUIScene_DebugOptions, eUIScene_DebugTips, eUIScene_HelpAndOptionsMenu, - eUIScene_HowToPlay, + eUIScene_HowToPlay, eUIScene_HowToPlayMenu, eUIScene_ControlsMenu, eUIScene_SettingsOptionsMenu, @@ -94,13 +94,23 @@ enum EUIScene eUIScene_TradingMenu, eUIScene_AnvilMenu, eUIScene_TeleportMenu, + eUIScene_HopperMenu, + eUIScene_BeaconMenu, + eUIScene_HorseMenu, + eUIScene_FireworksMenu, #ifdef _XBOX // eUIScene_TransferToXboxOne, #endif + // **************************************** + // **************************************** + // ********** IMPORTANT ****************** + // **************************************** + // **************************************** // 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 + // Also update UILayer::updateFocusState #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 @@ -117,6 +127,7 @@ enum EUIScene eUIScene_Timer, eUIScene_EULA, eUIScene_InGameSaveManagementMenu, + eUIScene_LanguageSelector, #endif // ndef _XBOX #ifdef _DEBUG_MENUS_ENABLED @@ -154,6 +165,8 @@ enum EToolTipButton eToolTipButtonLB, eToolTipButtonRB, eToolTipButtonLS, + eToolTipButtonRS, + eToolTipButtonBack, eToolTipNumButtons }; @@ -209,6 +222,12 @@ enum EHowToPlayPage eHowToPlay_Breeding, eHowToPlay_Trading, + eHowToPlay_Horses, + eHowToPlay_Beacons, + eHowToPlay_Fireworks, + eHowToPlay_Hoppers, + eHowToPlay_Droppers, + eHowToPlay_NetherPortal, eHowToPlay_TheEnd, #ifdef _XBOX @@ -229,6 +248,13 @@ enum ECreditTextTypes eNumTextTypes }; +enum EUIMessage +{ + eUIMessage_InventoryUpdated, + + eUIMessage_COUNT, +}; + #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/UIGroup.cpp b/Minecraft.Client/Common/UI/UIGroup.cpp index 1899d05b..e8bb9fe6 100644 --- a/Minecraft.Client/Common/UI/UIGroup.cpp +++ b/Minecraft.Client/Common/UI/UIGroup.cpp @@ -13,6 +13,8 @@ UIGroup::UIGroup(EUIGroup group, int iPad) m_updateFocusStateCountdown = 0; + m_viewportType = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) { m_layers[i] = new UILayer(this); @@ -39,8 +41,6 @@ UIGroup::UIGroup(EUIGroup group, int iPad) 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); @@ -318,6 +318,16 @@ void UIGroup::HandleDLCLicenseChange() } #endif +void UIGroup::HandleMessage(EUIMessage message, void *data) +{ + // 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]->HandleMessage(message, data); + } +} + bool UIGroup::IsFullscreenGroup() { return m_group == eUIGroup_Fullscreen; diff --git a/Minecraft.Client/Common/UI/UIGroup.h b/Minecraft.Client/Common/UI/UIGroup.h index e20fbb02..0ffee0ca 100644 --- a/Minecraft.Client/Common/UI/UIGroup.h +++ b/Minecraft.Client/Common/UI/UIGroup.h @@ -96,6 +96,8 @@ public: #ifdef _XBOX_ONE virtual void HandleDLCLicenseChange(); #endif + virtual void HandleMessage(EUIMessage message, void *data); + bool IsFullscreenGroup(); void handleUnlockFullVersion(); diff --git a/Minecraft.Client/Common/UI/UILayer.cpp b/Minecraft.Client/Common/UI/UILayer.cpp index 15bde2fa..13b26c84 100644 --- a/Minecraft.Client/Common/UI/UILayer.cpp +++ b/Minecraft.Client/Common/UI/UILayer.cpp @@ -189,7 +189,7 @@ void UILayer::ReloadAll(bool force) int lowestRenderable = 0; for(;lowestRenderable < m_sceneStack.size(); ++lowestRenderable) { - m_sceneStack[lowestRenderable]->reloadMovie(); + m_sceneStack[lowestRenderable]->reloadMovie(force); } } } @@ -253,6 +253,18 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) case eUIScene_AnvilMenu: newScene = new UIScene_AnvilMenu(iPad, initData, this); break; + case eUIScene_HopperMenu: + newScene = new UIScene_HopperMenu(iPad, initData, this); + break; + case eUIScene_BeaconMenu: + newScene = new UIScene_BeaconMenu(iPad, initData, this); + break; + case eUIScene_HorseMenu: + newScene = new UIScene_HorseInventoryMenu(iPad, initData, this); + break; + case eUIScene_FireworksMenu: + newScene = new UIScene_FireworksMenu(iPad, initData, this); + break; // Help and Options case eUIScene_HelpAndOptionsMenu: @@ -282,6 +294,9 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) case eUIScene_HowToPlayMenu: newScene = new UIScene_HowToPlayMenu(iPad, initData, this); break; + case eUIScene_LanguageSelector: + newScene = new UIScene_LanguageSelector(iPad, initData, this); + break; case eUIScene_HowToPlay: newScene = new UIScene_HowToPlay(iPad, initData, this); break; @@ -386,6 +401,9 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) case eUIScene_EULA: newScene = new UIScene_EULA(iPad, initData, this); break; + case eUIScene_NewUpdateMessage: + newScene = new UIScene_NewUpdateMessage(iPad, initData, this); + break; // Other case eUIScene_Keyboard: @@ -700,6 +718,12 @@ bool UILayer::updateFocusState(bool allowedFocus /* = false */) m_scenesToDestroy.push_back(scene); #endif } + + if (scene->getSceneType() == eUIScene_SettingsOptionsMenu) + { + scene->loseFocus(); + m_scenesToDestroy.push_back(scene); + } } /// UPDATE STACK STATES @@ -723,6 +747,12 @@ bool UILayer::updateFocusState(bool allowedFocus /* = false */) case eUIScene_DispenserMenu: case eUIScene_BrewingStandMenu: case eUIScene_EnchantingMenu: + case eUIScene_TradingMenu: + case eUIScene_HopperMenu: + case eUIScene_HorseMenu: + case eUIScene_FireworksMenu: + case eUIScene_BeaconMenu: + case eUIScene_AnvilMenu: m_bContainerMenuDisplayed=true; // Intentional fall-through @@ -786,7 +816,7 @@ void UILayer::handleInput(int iPad, int key, bool repeat, bool pressed, bool rel } // 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(); + handled = handled || scene->hidesLowerScenes() || scene->blocksInput(); if(handled ) break; } @@ -823,6 +853,15 @@ void UILayer::HandleDLCLicenseChange() } #endif +void UILayer::HandleMessage(EUIMessage message, void *data) +{ + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *topScene = *it; + topScene->HandleMessage(message, data); + } +} + bool UILayer::IsFullscreenGroup() { return m_parentGroup->IsFullscreenGroup(); diff --git a/Minecraft.Client/Common/UI/UILayer.h b/Minecraft.Client/Common/UI/UILayer.h index 2840f23f..47c776ab 100644 --- a/Minecraft.Client/Common/UI/UILayer.h +++ b/Minecraft.Client/Common/UI/UILayer.h @@ -83,6 +83,8 @@ public: #ifdef _XBOX_ONE virtual void HandleDLCLicenseChange(); #endif + virtual void HandleMessage(EUIMessage message, void *data); + void handleUnlockFullVersion(); UIScene *FindScene(EUIScene sceneType); diff --git a/Minecraft.Client/Common/UI/UIScene.cpp b/Minecraft.Client/Common/UI/UIScene.cpp index e7d907ec..ba253643 100644 --- a/Minecraft.Client/Common/UI/UIScene.cpp +++ b/Minecraft.Client/Common/UI/UIScene.cpp @@ -93,6 +93,7 @@ void UIScene::reloadMovie(bool force) (*it)->ReInit(); } + updateComponents(); handleReload(); IggyDataValue result; @@ -740,6 +741,9 @@ void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, shared_pt PIXBeginNamedEvent(0,"Render and decorate"); if(m_pItemRenderer == NULL) m_pItemRenderer = new ItemRenderer(); + RenderManager.StateSetBlendEnable(true); + RenderManager.StateSetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + RenderManager.StateSetBlendFactor(0xffffffff); m_pItemRenderer->renderAndDecorateItem(pMinecraft->font, pMinecraft->textures, item, x, y,scaleX,scaleY,fAlpha,isFoil,false, !usingCommandBuffer); PIXEndNamedEvent(); @@ -827,7 +831,7 @@ void UIScene::gainFocus() app.DebugPrintf("Sent gain focus event to scene\n"); */ bHasFocus = true; - if(app.GetGameStarted() && needsReloaded()) + if(needsReloaded()) { reloadMovie(); } @@ -882,7 +886,8 @@ void UIScene::handleGainFocus(bool navBack) void UIScene::updateTooltips() { - ui.SetTooltips(m_iPad, -1); + if(!ui.IsReloadingSkin()) + ui.SetTooltips(m_iPad, -1); } void UIScene::sendInputToMovie(int key, bool repeat, bool pressed, bool released) @@ -906,6 +911,7 @@ void UIScene::sendInputToMovie(int key, bool repeat, bool pressed, bool released int UIScene::convertGameActionToIggyKeycode(int action) { + // TODO: This action to key mapping should probably use the control mapping int keycode = -1; switch(action) { @@ -946,7 +952,16 @@ int UIScene::convertGameActionToIggyKeycode(int action) keycode = IGGY_KEYCODE_PAGE_UP; break; case ACTION_MENU_PAGEDOWN: - keycode = IGGY_KEYCODE_PAGE_DOWN; +#ifdef __PSVITA__ + if (!InputManager.IsVitaTV()) + { + keycode = IGGY_KEYCODE_F6; + } + else +#endif + { + keycode = IGGY_KEYCODE_PAGE_DOWN; + } break; case ACTION_MENU_RIGHT_SCROLL: keycode = IGGY_KEYCODE_F3; @@ -957,6 +972,7 @@ int UIScene::convertGameActionToIggyKeycode(int action) case ACTION_MENU_STICK_PRESS: break; case ACTION_MENU_OTHER_STICK_PRESS: + keycode = IGGY_KEYCODE_F5; break; case ACTION_MENU_OTHER_STICK_UP: keycode = IGGY_KEYCODE_F11; @@ -1233,6 +1249,10 @@ void UIScene::UpdateSceneControls() } #endif +void UIScene::HandleMessage(EUIMessage message, void *data) +{ +} + size_t UIScene::GetCallbackUniqueId() { if( m_callbackUniqueId == 0) diff --git a/Minecraft.Client/Common/UI/UIScene.h b/Minecraft.Client/Common/UI/UIScene.h index 823c510c..8c20aaae 100644 --- a/Minecraft.Client/Common/UI/UIScene.h +++ b/Minecraft.Client/Common/UI/UIScene.h @@ -169,6 +169,9 @@ public: // 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 true if this scene should block input to lower scenes (works like hidesLowerScenes but doesn't interfere with rendering) + virtual bool blocksInput() { return false; } + // returns main panel if controls are not living in the root virtual UIControl* GetMainPanel(); @@ -251,6 +254,9 @@ public: #ifdef _XBOX_ONE virtual void HandleDLCLicenseChange() {} #endif + + virtual void HandleMessage(EUIMessage message, void *data); + void registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength, bool deleteData = false); bool hasRegisteredSubstitutionTexture(const wstring &textureName); @@ -260,6 +266,7 @@ public: protected: + #ifdef _DURANGO virtual long long getDefaultGtcButtons() { return _360_GTC_BACK; } #endif diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp index 7823fb4e..0ee92eef 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp @@ -50,7 +50,10 @@ void UIScene_AbstractContainerMenu::handleDestroy() // 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(); + if(pMinecraft->localplayers[m_iPad] != NULL && pMinecraft->localplayers[m_iPad]->containerMenu->containerId == m_menu->containerId) + { + pMinecraft->localplayers[m_iPad]->closeContainer(); + } ui.OverrideSFX(m_iPad,ACTION_MENU_A,false); ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false); @@ -311,7 +314,7 @@ void UIScene_AbstractContainerMenu::render(S32 width, S32 height, C4JRender::eVi if(m_needsCacheRendered) { - m_expectedCachedSlotCount = 0; + m_expectedCachedSlotCount = GetBaseSlotCount(); unsigned int count = m_menu->getSize(); for(unsigned int i = 0; i < count; ++i) { @@ -333,6 +336,7 @@ void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *reg if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; shared_ptr item = nullptr; + int slotId = -1; if(wcscmp((wchar_t *)region->name,L"pointerIcon")==0) { m_cacheSlotRenders = false; @@ -340,7 +344,6 @@ void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *reg } else { - int slotId = -1; swscanf((wchar_t*)region->name,L"slot_%d",&slotId); if (slotId == -1) { @@ -354,7 +357,7 @@ void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *reg } } - if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true); + if(item != NULL) customDrawSlotControl(region,m_iPad,item,m_menu->isValidIngredient(item, slotId)?1.0f:0.5f,item->isFoil(),true); } void UIScene_AbstractContainerMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) @@ -370,21 +373,24 @@ void UIScene_AbstractContainerMenu::handleInput(int iPad, int key, bool repeat, } } -void UIScene_AbstractContainerMenu::SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot) +void UIScene_AbstractContainerMenu::SetPointerText(vector *description, bool newSlot) { - //app.DebugPrintf("Setting pointer text\n"); - m_cursorPath.setLabel(description,false,newSlot); + m_cursorPath.setLabel(HtmlString::Compose(description), false, newSlot); } void UIScene_AbstractContainerMenu::setSectionFocus(ESceneSection eSection, int iPad) { + UIControl *newFocus = getSection(eSection); + if(newFocus) newFocus->setFocus(true); + if(m_focusSection != eSectionNone) { UIControl *currentFocus = getSection(m_focusSection); - if(currentFocus) currentFocus->setFocus(false); + // 4J-TomK only set current focus to false if it differs from last (previously this continuously fired iggy functions when they were identical! + if(currentFocus != newFocus) + if(currentFocus) currentFocus->setFocus(false); } - UIControl *newFocus = getSection(eSection); - if(newFocus) newFocus->setFocus(true); + m_focusSection = eSection; } @@ -405,6 +411,13 @@ shared_ptr UIScene_AbstractContainerMenu::getSlotItem(ESceneSectio else return nullptr; } +Slot *UIScene_AbstractContainerMenu::getSlot(ESceneSection eSection, int iSlot) +{ + Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot ); + if(slot) return slot; + else return NULL; +} + bool UIScene_AbstractContainerMenu::isSlotEmpty(ESceneSection eSection, int iSlot) { Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot ); diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h index 26688dc5..8afa44f7 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h @@ -48,15 +48,20 @@ protected: 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); + void SetPointerText(vector *description, bool newSlot); virtual shared_ptr getSlotItem(ESceneSection eSection, int iSlot); + virtual Slot *getSlot(ESceneSection eSection, int iSlot); virtual bool isSlotEmpty(ESceneSection eSection, int iSlot); virtual void adjustPointerForSafeZone(); virtual UIControl *getSection(ESceneSection eSection) { return NULL; } + virtual int GetBaseSlotCount() { return 0; } public: virtual void tick(); + + // 4J - TomK If update tooltips is called then make sure the correct parent is invoked! (both UIScene AND IUIScene_AbstractContainerMenu have an instance of said function!) + virtual void updateTooltips() { IUIScene_AbstractContainerMenu::UpdateTooltips(); } virtual void render(S32 width, S32 height, C4JRender::eViewportType viewpBort); virtual void customDraw(IggyCustomDrawCallbackRegion *region); diff --git a/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp index 7b9886bc..c810ad45 100644 --- a/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp @@ -27,14 +27,14 @@ UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void *_initData, UILayer *parentL 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 = new AnvilMenu( 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 ); + Initialize( iPad, m_repairMenu, true, AnvilMenu::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); + m_slotListItem1.addSlots(AnvilMenu::INPUT_SLOT, 1); + m_slotListItem2.addSlots(AnvilMenu::ADDITIONAL_SLOT, 1); + m_slotListResult.addSlots(AnvilMenu::RESULT_SLOT, 1); bool expensive = false; wstring m_costString = L""; @@ -46,7 +46,7 @@ UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void *_initData, UILayer *parentL m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); expensive = true; } - else if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem()) + else if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->hasItem()) { // Do nothing } @@ -56,7 +56,7 @@ UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void *_initData, UILayer *parentL 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()))) + if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) { expensive = true; } @@ -85,11 +85,11 @@ wstring UIScene_AnvilMenu::getMoviePath() void UIScene_AnvilMenu::handleReload() { - Initialize( m_iPad, m_menu, true, RepairMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); + Initialize( m_iPad, m_menu, true, AnvilMenu::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); + m_slotListItem1.addSlots(AnvilMenu::INPUT_SLOT, 1); + m_slotListItem2.addSlots(AnvilMenu::ADDITIONAL_SLOT, 1); + m_slotListResult.addSlots(AnvilMenu::RESULT_SLOT, 1); } void UIScene_AnvilMenu::tick() diff --git a/Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp b/Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp new file mode 100644 index 00000000..e70397d6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp @@ -0,0 +1,519 @@ +#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_BeaconMenu.h" + +UIScene_BeaconMenu::UIScene_BeaconMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelPrimary.init(IDS_CONTAINER_BEACON_PRIMARY_POWER); + m_labelSecondary.init(IDS_CONTAINER_BEACON_SECONDARY_POWER); + + m_buttonsPowers[eControl_Primary1].setVisible(false); + m_buttonsPowers[eControl_Primary2].setVisible(false); + m_buttonsPowers[eControl_Primary3].setVisible(false); + m_buttonsPowers[eControl_Primary4].setVisible(false); + m_buttonsPowers[eControl_Primary5].setVisible(false); + m_buttonsPowers[eControl_Secondary1].setVisible(false); + m_buttonsPowers[eControl_Secondary2].setVisible(false); + + BeaconScreenInput *initData = (BeaconScreenInput *)_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_Beacon_Menu, this); + } + + m_beacon = initData->beacon; + + BeaconMenu *menu = new BeaconMenu(initData->inventory, initData->beacon); + + Initialize( initData->iPad, menu, true, BeaconMenu::INV_SLOT_START, eSectionBeaconUsing, eSectionBeaconMax ); + + m_slotListActivator.addSlots(BeaconMenu::PAYMENT_SLOT, 1); + + m_slotListActivatorIcons.addSlots(m_menu->getSize(),4); + + //app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_BEACON); + + delete initData; +} + +wstring UIScene_BeaconMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"BeaconMenuSplit"; + } + else + { + return L"BeaconMenu"; + } +} + +void UIScene_BeaconMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, BeaconMenu::INV_SLOT_START, eSectionBeaconUsing, eSectionBeaconMax ); + + m_slotListActivator.addSlots(BeaconMenu::PAYMENT_SLOT, 1); + + m_slotListActivatorIcons.addSlots(m_menu->getSize(),4); +} + +void UIScene_BeaconMenu::tick() +{ + UIScene_AbstractContainerMenu::tick(); + + handleTick(); +} + +int UIScene_BeaconMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionBeaconItem: + cols = 1; + break; + case eSectionBeaconInventory: + cols = 9; + break; + case eSectionBeaconUsing: + cols = 9; + break; + default: + assert( false ); + break; + }; + return cols; +} + +int UIScene_BeaconMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionBeaconItem: + rows = 1; + break; + case eSectionBeaconInventory: + rows = 3; + break; + case eSectionBeaconUsing: + rows = 1; + break; + default: + assert( false ); + break; + }; + return rows; +} + +void UIScene_BeaconMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionBeaconItem: + pPosition->x = m_slotListActivator.getXPos(); + pPosition->y = m_slotListActivator.getYPos(); + break; + case eSectionBeaconInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionBeaconUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + + case eSectionBeaconPrimaryTierOneOne: + pPosition->x = m_buttonsPowers[eControl_Primary1].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary1].getYPos(); + break; + case eSectionBeaconPrimaryTierOneTwo: + pPosition->x = m_buttonsPowers[eControl_Primary2].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary2].getYPos(); + break; + case eSectionBeaconPrimaryTierTwoOne: + pPosition->x = m_buttonsPowers[eControl_Primary3].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary3].getYPos(); + break; + case eSectionBeaconPrimaryTierTwoTwo: + pPosition->x = m_buttonsPowers[eControl_Primary4].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary4].getYPos(); + break; + case eSectionBeaconPrimaryTierThree: + pPosition->x = m_buttonsPowers[eControl_Primary5].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary5].getYPos(); + break; + case eSectionBeaconSecondaryOne: + pPosition->x = m_buttonsPowers[eControl_Secondary1].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Secondary1].getYPos(); + break; + case eSectionBeaconSecondaryTwo: + pPosition->x = m_buttonsPowers[eControl_Secondary2].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Secondary2].getYPos(); + break; + case eSectionBeaconConfirm: + pPosition->x = m_buttonConfirm.getXPos(); + pPosition->y = m_buttonConfirm.getYPos(); + break; + default: + assert( false ); + break; + }; +} + +void UIScene_BeaconMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + switch( eSection ) + { + case eSectionBeaconItem: + sectionSize.x = m_slotListActivator.getWidth(); + sectionSize.y = m_slotListActivator.getHeight(); + break; + case eSectionBeaconInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionBeaconUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + + case eSectionBeaconPrimaryTierOneOne: + sectionSize.x = m_buttonsPowers[eControl_Primary1].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary1].getHeight(); + break; + case eSectionBeaconPrimaryTierOneTwo: + sectionSize.x = m_buttonsPowers[eControl_Primary2].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary2].getHeight(); + break; + case eSectionBeaconPrimaryTierTwoOne: + sectionSize.x = m_buttonsPowers[eControl_Primary3].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary3].getHeight(); + break; + case eSectionBeaconPrimaryTierTwoTwo: + sectionSize.x = m_buttonsPowers[eControl_Primary4].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary4].getHeight(); + break; + case eSectionBeaconPrimaryTierThree: + sectionSize.x = m_buttonsPowers[eControl_Primary5].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary5].getHeight(); + break; + case eSectionBeaconSecondaryOne: + sectionSize.x = m_buttonsPowers[eControl_Secondary1].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Secondary1].getHeight(); + break; + case eSectionBeaconSecondaryTwo: + sectionSize.x = m_buttonsPowers[eControl_Secondary2].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Secondary2].getHeight(); + break; + case eSectionBeaconConfirm: + sectionSize.x = m_buttonConfirm.getWidth(); + sectionSize.y = m_buttonConfirm.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_BeaconMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionBeaconItem: + slotList = &m_slotListActivator; + break; + case eSectionBeaconInventory: + slotList = &m_slotListInventory; + break; + case eSectionBeaconUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + }; + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_BeaconMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionBeaconItem: + control = &m_slotListActivator; + break; + case eSectionBeaconInventory: + control = &m_slotListInventory; + break; + case eSectionBeaconUsing: + control = &m_slotListHotbar; + break; + + case eSectionBeaconPrimaryTierOneOne: + control = &m_buttonsPowers[eControl_Primary1]; + break; + case eSectionBeaconPrimaryTierOneTwo: + control = &m_buttonsPowers[eControl_Primary2]; + break; + case eSectionBeaconPrimaryTierTwoOne: + control = &m_buttonsPowers[eControl_Primary3]; + break; + case eSectionBeaconPrimaryTierTwoTwo: + control = &m_buttonsPowers[eControl_Primary4]; + break; + case eSectionBeaconPrimaryTierThree: + control = &m_buttonsPowers[eControl_Primary5]; + break; + case eSectionBeaconSecondaryOne: + control = &m_buttonsPowers[eControl_Secondary1]; + break; + case eSectionBeaconSecondaryTwo: + control = &m_buttonsPowers[eControl_Secondary2]; + break; + case eSectionBeaconConfirm: + control = &m_buttonConfirm; + break; + + default: + assert( false ); + break; + }; + return control; +} + +void UIScene_BeaconMenu::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 >= 0 && slotId >= m_menu->getSize() ) + { + int icon = slotId - m_menu->getSize(); + switch(icon) + { + case 0: + item = shared_ptr(new ItemInstance(Item::emerald) ); + break; + case 1: + item = shared_ptr(new ItemInstance(Item::diamond) ); + break; + case 2: + item = shared_ptr(new ItemInstance(Item::goldIngot) ); + break; + case 3: + item = shared_ptr(new ItemInstance(Item::ironIngot) ); + break; + default: + assert(false); + break; + }; + if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true); + } + else + { + UIScene_AbstractContainerMenu::customDraw(region); + } +} + +void UIScene_BeaconMenu::SetConfirmButtonEnabled(bool enabled) +{ + m_buttonConfirm.SetButtonActive(enabled); +} + +void UIScene_BeaconMenu::AddPowerButton(int id, int icon, int tier, int count, bool active, bool selected) +{ + switch(tier) + { + case 0: + if(count == 0) + { + m_buttonsPowers[eControl_Primary1].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary1].setVisible(true); + } + else + { + m_buttonsPowers[eControl_Primary2].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary2].setVisible(true); + } + break; + case 1: + if(count == 0) + { + m_buttonsPowers[eControl_Primary3].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary3].setVisible(true); + } + else + { + m_buttonsPowers[eControl_Primary4].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary4].setVisible(true); + } + break; + case 2: + m_buttonsPowers[eControl_Primary5].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary5].setVisible(true); + break; + case 3: + if(count == 0) + { + m_buttonsPowers[eControl_Secondary1].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Secondary1].setVisible(true); + } + else + { + m_buttonsPowers[eControl_Secondary2].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Secondary2].setVisible(true); + } + break; + }; +} + +int UIScene_BeaconMenu::GetPowerButtonId(ESceneSection eSection) +{ + switch(eSection) + { + case eSectionBeaconPrimaryTierOneOne: + return m_buttonsPowers[eControl_Primary1].GetData(); + break; + case eSectionBeaconPrimaryTierOneTwo: + return m_buttonsPowers[eControl_Primary2].GetData(); + break; + case eSectionBeaconPrimaryTierTwoOne: + return m_buttonsPowers[eControl_Primary3].GetData(); + break; + case eSectionBeaconPrimaryTierTwoTwo: + return m_buttonsPowers[eControl_Primary4].GetData(); + break; + case eSectionBeaconPrimaryTierThree: + return m_buttonsPowers[eControl_Primary5].GetData(); + break; + case eSectionBeaconSecondaryOne: + return m_buttonsPowers[eControl_Secondary1].GetData(); + break; + case eSectionBeaconSecondaryTwo: + return m_buttonsPowers[eControl_Secondary2].GetData(); + break; + }; + return 0; +} + +bool UIScene_BeaconMenu::IsPowerButtonSelected(ESceneSection eSection) +{ + switch(eSection) + { + case eSectionBeaconPrimaryTierOneOne: + return m_buttonsPowers[eControl_Primary1].IsButtonSelected(); + break; + case eSectionBeaconPrimaryTierOneTwo: + return m_buttonsPowers[eControl_Primary2].IsButtonSelected(); + break; + case eSectionBeaconPrimaryTierTwoOne: + return m_buttonsPowers[eControl_Primary3].IsButtonSelected(); + break; + case eSectionBeaconPrimaryTierTwoTwo: + return m_buttonsPowers[eControl_Primary4].IsButtonSelected(); + break; + case eSectionBeaconPrimaryTierThree: + return m_buttonsPowers[eControl_Primary5].IsButtonSelected(); + break; + case eSectionBeaconSecondaryOne: + return m_buttonsPowers[eControl_Secondary1].IsButtonSelected(); + break; + case eSectionBeaconSecondaryTwo: + return m_buttonsPowers[eControl_Secondary2].IsButtonSelected(); + break; + }; + return false; +} + +void UIScene_BeaconMenu::SetPowerButtonSelected(ESceneSection eSection) +{ + switch(eSection) + { + case eSectionBeaconPrimaryTierOneOne: + case eSectionBeaconPrimaryTierOneTwo: + case eSectionBeaconPrimaryTierTwoOne: + case eSectionBeaconPrimaryTierTwoTwo: + case eSectionBeaconPrimaryTierThree: + m_buttonsPowers[eControl_Primary1].SetButtonSelected(false); + m_buttonsPowers[eControl_Primary2].SetButtonSelected(false); + m_buttonsPowers[eControl_Primary3].SetButtonSelected(false); + m_buttonsPowers[eControl_Primary4].SetButtonSelected(false); + m_buttonsPowers[eControl_Primary5].SetButtonSelected(false); + break; + case eSectionBeaconSecondaryOne: + case eSectionBeaconSecondaryTwo: + m_buttonsPowers[eControl_Secondary1].SetButtonSelected(false); + m_buttonsPowers[eControl_Secondary2].SetButtonSelected(false); + break; + }; + + + switch(eSection) + { + case eSectionBeaconPrimaryTierOneOne: + return m_buttonsPowers[eControl_Primary1].SetButtonSelected(true); + break; + case eSectionBeaconPrimaryTierOneTwo: + return m_buttonsPowers[eControl_Primary2].SetButtonSelected(true); + break; + case eSectionBeaconPrimaryTierTwoOne: + return m_buttonsPowers[eControl_Primary3].SetButtonSelected(true); + break; + case eSectionBeaconPrimaryTierTwoTwo: + return m_buttonsPowers[eControl_Primary4].SetButtonSelected(true); + break; + case eSectionBeaconPrimaryTierThree: + return m_buttonsPowers[eControl_Primary5].SetButtonSelected(true); + break; + case eSectionBeaconSecondaryOne: + return m_buttonsPowers[eControl_Secondary1].SetButtonSelected(true); + break; + case eSectionBeaconSecondaryTwo: + return m_buttonsPowers[eControl_Secondary2].SetButtonSelected(true); + break; + }; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_BeaconMenu.h b/Minecraft.Client/Common/UI/UIScene_BeaconMenu.h new file mode 100644 index 00000000..ccd9366f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_BeaconMenu.h @@ -0,0 +1,71 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "UIControl_SlotList.h" +#include "IUIScene_BeaconMenu.h" + +class UIScene_BeaconMenu : public UIScene_AbstractContainerMenu, public IUIScene_BeaconMenu +{ +private: + enum EControls + { + eControl_Primary1, + eControl_Primary2, + eControl_Primary3, + eControl_Primary4, + eControl_Primary5, + eControl_Secondary1, + eControl_Secondary2, + + eControl_EFFECT_COUNT, + }; +public: + UIScene_BeaconMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_BeaconMenu;} + +protected: + UIControl_SlotList m_slotListActivator; + UIControl_SlotList m_slotListActivatorIcons; + UIControl_Label m_labelPrimary, m_labelSecondary; + UIControl_BeaconEffectButton m_buttonsPowers[eControl_EFFECT_COUNT]; + UIControl_BeaconEffectButton m_buttonConfirm; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListActivator, "ActivatorSlot") + UI_MAP_ELEMENT( m_slotListActivatorIcons, "ActivatorList") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary1], "Primary_Slot_01") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary2], "Primary_Slot_02") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary3], "Primary_Slot_03") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary4], "Primary_Slot_04") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary5], "Primary_Slot_05") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Secondary1], "Secondary_Slot_01") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Secondary2], "Secondary_Slot_02") + UI_MAP_ELEMENT( m_buttonConfirm, "ConfirmButton") + UI_MAP_ELEMENT( m_labelPrimary, "PrimaryPowerLabel") + UI_MAP_ELEMENT( m_labelSecondary, "SecondaryPowerLabel") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + virtual void tick(); + virtual int GetBaseSlotCount() { return 4; } + + 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 SetConfirmButtonEnabled(bool enabled); + virtual void AddPowerButton(int id, int icon, int tier, int count, bool active, bool selected); + virtual int GetPowerButtonId(ESceneSection eSection); + virtual bool IsPowerButtonSelected(ESceneSection eSection); + virtual void SetPowerButtonSelected(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp index cd56bd84..8563054c 100644 --- a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp @@ -14,11 +14,11 @@ UIScene_BrewingStandMenu::UIScene_BrewingStandMenu(int iPad, void *_initData, UI 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; + m_labelBrewingStand.init( m_brewingStand->getName() ); + Minecraft *pMinecraft = Minecraft::GetInstance(); if( pMinecraft->localgameModes[initData->iPad] != NULL ) { diff --git a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp index 0ea99a36..968072a8 100644 --- a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp +++ b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp @@ -188,7 +188,7 @@ void UIScene_ConnectingProgress::handleTimerComplete(int id) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); exitReasonStringId = -1; //app.NavigateToHomeMenu(); diff --git a/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp index a0b25d18..9e48a57b 100644 --- a/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp @@ -19,7 +19,7 @@ UIScene_ContainerMenu::UIScene_ContainerMenu(int iPad, void *_initData, UILayer // Setup all the Iggy references we need for this scene initialiseMovie(); - m_labelChest.init(app.GetString(initData->container->getName())); + m_labelChest.init(initData->container->getName()); ContainerMenu* menu = new ContainerMenu( initData->inventory, initData->container ); diff --git a/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp index c05b502e..57567248 100644 --- a/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp @@ -37,7 +37,7 @@ UIScene_ControlsMenu::UIScene_ControlsMenu(int iPad, void *initData, UILayer *pa // 4J-PB - stop the label showing in the in-game controls menu else { - m_labelVersion.init(" "); + m_labelVersion.init(L" "); } m_bCreativeMode = !bNotInGame && Minecraft::GetInstance()->localplayers[m_iPad] && Minecraft::GetInstance()->localplayers[m_iPad]->abilities.mayfly; diff --git a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp index 5b729069..66d8c41e 100644 --- a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp @@ -197,7 +197,10 @@ void UIScene_CraftingMenu::handleDestroy() } // 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(); + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL && Minecraft::GetInstance()->localplayers[m_iPad]->containerMenu->containerId == m_menu->containerId) + { + Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + } ui.OverrideSFX(m_iPad,ACTION_MENU_A,false); ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false); @@ -763,6 +766,21 @@ void UIScene_CraftingMenu::updateHighlightAndScrollPositions() } } +void UIScene_CraftingMenu::HandleMessage(EUIMessage message, void *data) +{ + switch(message) + { + case eUIMessage_InventoryUpdated: + handleInventoryUpdated(data); + break; + }; +} + +void UIScene_CraftingMenu::handleInventoryUpdated(LPVOID data) +{ + HandleInventoryUpdated(); +} + 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 index 44a39d61..84c9ba65 100644 --- a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h @@ -202,4 +202,10 @@ protected: virtual void updateVSlotPositions(int iSlots, int i); virtual void UpdateMultiPanel(); + + virtual void HandleMessage(EUIMessage message, void *data); + void handleInventoryUpdated(LPVOID data); + + // 4J - TomK If update tooltips is called then make sure the correct parent is invoked! (both UIScene AND IUIScene_CraftingMenu have an instance of said function!) + virtual void updateTooltips() { IUIScene_CraftingMenu::UpdateTooltips(); } }; diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp index 6be67bed..f7cca84b 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp @@ -45,11 +45,8 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay 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); @@ -75,7 +72,16 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay m_MoreOptionsParams.bTNT = TRUE; m_MoreOptionsParams.iPad = iPad; - m_bGameModeSurvival=true; + m_MoreOptionsParams.bMobGriefing = true; + m_MoreOptionsParams.bKeepInventory = false; + m_MoreOptionsParams.bDoMobSpawning = true; + m_MoreOptionsParams.bDoMobLoot = true; + m_MoreOptionsParams.bDoTileDrops = true; + m_MoreOptionsParams.bNaturalRegeneration = true; + m_MoreOptionsParams.bDoDaylightCycle = true; + + m_bGameModeCreative = false; + m_iGameModeId = GameType::SURVIVAL->getId(); m_pDLCPack = NULL; m_bRebuildTouchBoxes = false; @@ -121,28 +127,23 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay } } -#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); - } + // Set up online game checkbox + bool bOnlineGame = m_MoreOptionsParams.bOnlineGame; + m_checkboxOnline.SetEnable(true); - if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) - { - m_checkboxOnline.SetEnable(false); - bOnlineGame = false; - } + // 4J-PB - to stop an offline game being able to select the online flag + if(ProfileManager.IsSignedInLive(m_iPad) == false) + { + m_checkboxOnline.SetEnable(false); + } - m_checkboxOnline.init(app.GetString(IDS_ONLINE_GAME), eControl_OnlineGame, bOnlineGame); + if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + m_checkboxOnline.SetEnable(false); + bOnlineGame = false; } -#endif + + m_checkboxOnline.init(app.GetString(IDS_ONLINE_GAME), eControl_OnlineGame, bOnlineGame); addTimer( GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME ); #if TO_BE_IMPLEMENTED @@ -176,6 +177,7 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay swprintf(imageName,64,L"tpack%08x",tp->getId()); registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); m_texturePackList.addPack(i,imageName); + app.DebugPrintf("Adding texture pack %ls at %d\n",imageName,i); } } @@ -323,7 +325,7 @@ void UIScene_CreateWorldMenu::tick() 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); + ui.RequestAlertMessage(IDS_PLAY_OFFLINE,IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::ContinueOffline,dynamic_cast(this)); } } break; @@ -374,7 +376,7 @@ void UIScene_CreateWorldMenu::handleInput(int iPad, int key, bool repeat, bool p 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } #endif @@ -386,22 +388,17 @@ void UIScene_CreateWorldMenu::handleInput(int iPad, int key, bool repeat, bool p 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) { - bool bOnlineGame = m_checkboxOnline.IsChecked(); - if (m_MoreOptionsParams.bOnlineGame != bOnlineGame) - { - m_MoreOptionsParams.bOnlineGame = bOnlineGame; + m_MoreOptionsParams.bOnlineGame = bOnlineGame; - if (!m_MoreOptionsParams.bOnlineGame) - { - m_MoreOptionsParams.bInviteOnly = false; - m_MoreOptionsParams.bAllowFriendsOfFriends = false; - } + if (!m_MoreOptionsParams.bOnlineGame) + { + m_MoreOptionsParams.bInviteOnly = false; + m_MoreOptionsParams.bAllowFriendsOfFriends = false; } } -#endif handled = true; break; @@ -423,39 +420,20 @@ void UIScene_CreateWorldMenu::handlePress(F64 controlId, F64 childId) 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) + switch(m_iGameModeId) { + case 0: // Survival m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); - m_bGameModeSurvival=false; - } - else - { + m_iGameModeId = GameType::CREATIVE->getId(); + m_bGameModeCreative = true; + break; + case 1: // Creative m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL)); - m_bGameModeSurvival=true; - } + m_iGameModeId = GameType::SURVIVAL->getId(); + m_bGameModeCreative = false; + break; + }; break; case eControl_MoreOptions: ui.NavigateToScene(m_iPad, eUIScene_LaunchMoreOptionsMenu, &m_MoreOptionsParams); @@ -533,7 +511,7 @@ void UIScene_CreateWorldMenu::StartSharedLaunchFlow() 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); + ui.RequestAlertMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&TexturePackDialogReturned,this); return; } } @@ -603,13 +581,13 @@ void UIScene_CreateWorldMenu::StartSharedLaunchFlow() // 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); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 1, m_iPad,&TrialTexturePackWarningReturned,this); #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); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this); #endif #if defined _XBOX_ONE || defined __ORBIS__ @@ -684,13 +662,9 @@ void UIScene_CreateWorldMenu::handleTimerComplete(int id) 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_checkboxOnline.SetEnable(bMultiplayerAllowed); + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); + m_bMultiplayerAllowed = bMultiplayerAllowed; } } @@ -742,13 +716,7 @@ 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 + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); } } @@ -774,28 +742,6 @@ int UIScene_CreateWorldMenu::KeyboardCompleteWorldNameCallback(LPVOID lpParam,bo 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(); @@ -832,7 +778,7 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { @@ -840,7 +786,7 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_CreateWorldMenu::MustSignInReturnedPSN, this); } return; /* 4J-PB - Add this after release @@ -852,21 +798,21 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() // 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()); + ui.RequestErrorMessage(IDS_PRO_CURRENTLY_NOT_ONLINE_TITLE, IDS_PRO_PSNOFFLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); return; #endif } @@ -894,6 +840,16 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() { m_bIgnoreInput=false; + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return; + } + + // 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(); @@ -915,18 +871,18 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() } #endif - if(m_bGameModeSurvival != true || m_MoreOptionsParams.bHostPrivileges == TRUE) + if(m_bGameModeCreative == true || m_MoreOptionsParams.bHostPrivileges == TRUE) { UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - if(m_bGameModeSurvival != true) + if(m_bGameModeCreative == true) { - ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_CreateWorldMenu::ConfirmCreateReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_CreateWorldMenu::ConfirmCreateReturned,this); } 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); + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&UIScene_CreateWorldMenu::ConfirmCreateReturned,this); } } else @@ -973,6 +929,15 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() { m_bIgnoreInput=false; + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return; + } + // 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(); @@ -1024,6 +989,16 @@ void UIScene_CreateWorldMenu::checkStateAndStartGame() else if(isOnlineGame && isSignedInLive && (bPlayStationPlus==false)) { m_bIgnoreInput=false; + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return; + } + + setVisible( true ); // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! @@ -1164,7 +1139,7 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD 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_GameType,pClass->m_iGameModeId ); app.SetGameHostOption(eGameHostOption_LevelType,pClass->m_MoreOptionsParams.bFlatWorld ); app.SetGameHostOption(eGameHostOption_Structures,pClass->m_MoreOptionsParams.bStructures ); app.SetGameHostOption(eGameHostOption_BonusChest,pClass->m_MoreOptionsParams.bBonusChest ); @@ -1176,6 +1151,21 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD app.SetGameHostOption(eGameHostOption_HostCanFly,pClass->m_MoreOptionsParams.bHostPrivileges); app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + + app.SetGameHostOption(eGameHostOption_MobGriefing, pClass->m_MoreOptionsParams.bMobGriefing); + app.SetGameHostOption(eGameHostOption_KeepInventory, pClass->m_MoreOptionsParams.bKeepInventory); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, pClass->m_MoreOptionsParams.bDoMobSpawning); + app.SetGameHostOption(eGameHostOption_DoMobLoot, pClass->m_MoreOptionsParams.bDoMobLoot); + app.SetGameHostOption(eGameHostOption_DoTileDrops, pClass->m_MoreOptionsParams.bDoTileDrops); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, pClass->m_MoreOptionsParams.bNaturalRegeneration); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, pClass->m_MoreOptionsParams.bDoDaylightCycle); + + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, false); +#ifdef _LARGE_WORLDS + app.SetGameHostOption(eGameHostOption_WorldSize, pClass->m_MoreOptionsParams.worldSize+1 ); // 0 is GAME_HOST_OPTION_WORLDSIZE_UNKNOWN + pClass->m_MoreOptionsParams.currentWorldSize = (EGameHostOptionWorldSize)(pClass->m_MoreOptionsParams.worldSize+1); + pClass->m_MoreOptionsParams.newWorldSize = (EGameHostOptionWorldSize)(pClass->m_MoreOptionsParams.worldSize+1); +#endif g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); @@ -1186,26 +1176,23 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD { case 0: // Classic - param->xzSize = 1 * 54; - param->hellScale = 3; + param->xzSize = LEVEL_WIDTH_CLASSIC; + param->hellScale = HELL_LEVEL_SCALE_CLASSIC; // hellsize = 54/3 = 18 break; case 1: // Small - param->xzSize = 1 * 64; - param->hellScale = 3; + param->xzSize = LEVEL_WIDTH_SMALL; + param->hellScale = HELL_LEVEL_SCALE_SMALL; // hellsize = ceil(64/3) = 22 break; case 2: // Medium - param->xzSize = 3 * 64; - param->hellScale = 6; + param->xzSize = LEVEL_WIDTH_MEDIUM; + param->hellScale = HELL_LEVEL_SCALE_MEDIUM; // hellsize= ceil(3*64/6) = 32 break; case 3: - //param->xzSize = 5 * 64; - //param->hellScale = 8; - // Large - param->xzSize = LEVEL_MAX_WIDTH; - param->hellScale = HELL_LEVEL_MAX_SCALE; + param->xzSize = LEVEL_WIDTH_LARGE; + param->hellScale = HELL_LEVEL_SCALE_LARGE; // hellsize = ceil(5*64/8) = 40 break; }; #else @@ -1283,7 +1270,7 @@ int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinu // 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()); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { @@ -1291,14 +1278,14 @@ int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinu 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_CreateWorldMenu::MustSignInReturnedPSN, pClass); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); return 0; #endif } @@ -1318,14 +1305,14 @@ int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinu 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); + ui.RequestAlertMessage( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad()); } 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); + ui.RequestAlertMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } } else @@ -1389,7 +1376,7 @@ int UIScene_CreateWorldMenu::ConfirmCreateReturned(void *pParam,int iPad,C4JStor 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); + ui.RequestAlertMessage( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h index ebb383e8..d6ae1c04 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h @@ -8,7 +8,6 @@ private: enum EControls { eControl_EditWorldName, - eControl_EditSeed, eControl_TexturePackList, eControl_GameModeToggle, eControl_Difficulty, @@ -24,14 +23,11 @@ private: wstring m_seed; UIControl m_controlMainPanel; - UIControl_Label m_labelWorldName, m_labelSeed, m_labelRandomSeed; + UIControl_Label m_labelWorldName; UIControl_Button m_buttonGamemode, m_buttonMoreOptions, m_buttonCreateWorld; - UIControl_TextInput m_editWorldName, m_editSeed; + UIControl_TextInput m_editWorldName; UIControl_Slider m_sliderDifficulty; - -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 UIControl_CheckBox m_checkboxOnline; -#endif UIControl_BitmapIcon m_bitmapIcon, m_bitmapComparison; @@ -40,22 +36,17 @@ private: 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_bGameModeCreative; + int m_iGameModeId; bool m_bMultiplayerAllowed; DLCPack * m_pDLCPack; bool m_bRebuildTouchBoxes; @@ -97,7 +88,6 @@ private: 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); diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp index 569cc8ba..0895cdff 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp @@ -21,7 +21,7 @@ UIScene_CreativeMenu::UIScene_CreativeMenu(int iPad, void *_initData, UILayer *p InventoryScreenInput *initData = (InventoryScreenInput *)_initData; - shared_ptr creativeContainer = shared_ptr(new SimpleContainer( 0, TabSpec::MAX_SIZE )); + shared_ptr creativeContainer = shared_ptr(new SimpleContainer( 0, L"", false, TabSpec::MAX_SIZE )); itemPickerMenu = new ItemPickerMenu(creativeContainer, initData->player->inventory); Initialize( initData->iPad, itemPickerMenu, false, -1, eSectionInventoryCreativeUsing, eSectionInventoryCreativeMax, initData->bNavigateBack); @@ -158,26 +158,6 @@ void UIScene_CreativeMenu::handleOtherClicked(int iPad, ESceneSection eSection, } } -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 ); @@ -191,6 +171,10 @@ void UIScene_CreativeMenu::handleReload() { m_slotListHotbar.addSlot(i); } + + ECreativeInventoryTabs lastTab = m_curTab; + m_curTab = eCreativeInventoryTab_COUNT; + switchTab(lastTab); } void UIScene_CreativeMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h index 6fbec2ba..530a7512 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h @@ -80,7 +80,6 @@ public: virtual void handleTouchBoxRebuild(); virtual void handleTimerComplete(int id); #endif - virtual void ScrollBar(UIVec2D pointerPos); private: // IUIScene_CreativeMenu diff --git a/Minecraft.Client/Common/UI/UIScene_Credits.cpp b/Minecraft.Client/Common/UI/UIScene_Credits.cpp index 11558598..75ddf92f 100644 --- a/Minecraft.Client/Common/UI/UIScene_Credits.cpp +++ b/Minecraft.Client/Common/UI/UIScene_Credits.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "UI.h" +#include "..\Minecraft.World\StringHelpers.h" #include "UIScene_Credits.h" #define CREDIT_ICON -2 @@ -50,7 +51,16 @@ SCreditTextItemDef UIScene_Credits::gs_aCreditDefs[MAX_CREDIT_STRINGS] = { 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"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + +// Added credit for horses + { L"Developers of Mo' Creatures:", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"John Olarte (DrZhark)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kent Christian Jensen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dan Roque", 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 }, @@ -584,27 +594,38 @@ void UIScene_Credits::tick() // 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. { + wstring sanitisedString = wstring(pDef->m_Text); + + // 4J-JEV: Some DLC credits contain copyright or registered symbols that are not rendered in some fonts. + if ( !ui.UsingBitmapFont() ) + { + sanitisedString = replaceAll(sanitisedString, L"\u00A9", L"(C)"); + sanitisedString = replaceAll(sanitisedString, L"\u00AE", L"(R)"); + sanitisedString = replaceAll(sanitisedString, L"\u2013", L"-"); + } + LPWSTR creditsString = new wchar_t[ 128 ]; - if(pDef->m_iStringID[1]!=NO_TRANSLATED_STRING) + if (pDef->m_iStringID[0]==NO_TRANSLATED_STRING) + { + ZeroMemory(creditsString, 128); + memcpy( creditsString, sanitisedString.c_str(), sizeof(WCHAR) * sanitisedString.length() ); + } + else 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] ) ); + swprintf( creditsString, 128, sanitisedString.c_str(), 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] ) ); + swprintf( creditsString, 128, sanitisedString.c_str(), app.GetString( pDef->m_iStringID[0] ) ); } + setNextLabel(creditsString,pDef->m_eType); delete [] creditsString; } diff --git a/Minecraft.Client/Common/UI/UIScene_Credits.h b/Minecraft.Client/Common/UI/UIScene_Credits.h index 4116628d..ccb62831 100644 --- a/Minecraft.Client/Common/UI/UIScene_Credits.h +++ b/Minecraft.Client/Common/UI/UIScene_Credits.h @@ -2,10 +2,10 @@ #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 PS3_CREDITS_COUNT 80 +#define PSVITA_CREDITS_COUNT 82 +#define PS4_CREDITS_COUNT 80 +#define XBOXONE_CREDITS_COUNT (80+318) #define MILES_AND_IGGY_CREDITS_COUNT 8 #define DYNAMODE_FONT_CREDITS_COUNT 2 #define PS3_DOLBY_CREDIT 4 @@ -15,7 +15,7 @@ #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 +#elif defined(_DURANGO) || defined _WINDOWS64 #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) diff --git a/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp index 0d36dcdf..77ffdffd 100644 --- a/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp @@ -15,7 +15,7 @@ UIScene_DLCMainMenu::UIScene_DLCMainMenu(int iPad, void *initData, UILayer *pare // 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_labelOffers.init(IDS_DOWNLOADABLE_CONTENT_OFFERS); m_buttonListOffers.init(eControl_OffersList); #if defined _XBOX_ONE || defined __ORBIS__ @@ -33,7 +33,7 @@ UIScene_DLCMainMenu::UIScene_DLCMainMenu(int iPad, void *initData, UILayer *pare if(m_loadedResolution == eSceneResolution_1080) { #ifdef _DURANGO - m_labelXboxStore.init( app.GetString(IDS_XBOX_STORE) ); + m_labelXboxStore.init(IDS_XBOX_STORE); #else m_labelXboxStore.init( L"" ); #endif @@ -42,9 +42,9 @@ UIScene_DLCMainMenu::UIScene_DLCMainMenu(int iPad, void *initData, UILayer *pare #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); + m_buttonListOffers.addItem(IDS_DLC_MENU_SKINPACKS,e_DLC_SkinPack); + m_buttonListOffers.addItem(IDS_DLC_MENU_TEXTUREPACKS,e_DLC_TexturePacks); + m_buttonListOffers.addItem(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 @@ -53,10 +53,8 @@ UIScene_DLCMainMenu::UIScene_DLCMainMenu(int iPad, void *initData, UILayer *pare 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); +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->ShowPsStoreIcon(); #endif #if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) @@ -71,6 +69,11 @@ UIScene_DLCMainMenu::~UIScene_DLCMainMenu() #if defined _XBOX_ONE || defined __ORBIS__ app.FreeLocalDLCImages(); #endif + +#ifdef _XBOX_ONE + // 4J-JEV: Have to switch back to user preferred languge now. + setLanguageOverride(true); +#endif } wstring UIScene_DLCMainMenu::getMoviePath() @@ -93,10 +96,8 @@ void UIScene_DLCMainMenu::handleInput(int iPad, int key, bool repeat, bool press case ACTION_MENU_CANCEL: if(pressed) { -#ifdef __ORBIS__ - sceNpCommerceHidePsStoreIcon(); -#elif defined __PSVITA__ - sceNpCommerce2HidePsStoreIcon(); +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); #endif navigateBack(); } @@ -155,7 +156,7 @@ void UIScene_DLCMainMenu::handleTimerComplete(int id) // 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()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_DLCMainMenu::ExitDLCMainMenu,this); } #endif break; @@ -167,10 +168,8 @@ int UIScene_DLCMainMenu::ExitDLCMainMenu(void *pParam,int iPad,C4JStorage::EMess { UIScene_DLCMainMenu* pClass = (UIScene_DLCMainMenu*)pParam; -#ifdef __ORBIS__ - sceNpCommerceHidePsStoreIcon(); -#elif defined __PSVITA__ - sceNpCommerce2HidePsStoreIcon(); +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); #endif pClass->navigateBack(); diff --git a/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h index 15272fe1..f23ee4b0 100644 --- a/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h @@ -10,7 +10,7 @@ private: eControl_OffersList, }; - UIControl_ButtonList m_buttonListOffers; + UIControl_DynamicButtonList m_buttonListOffers; UIControl_Label m_labelOffers, m_labelXboxStore; UIControl m_Timer; UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) diff --git a/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp index 9dbdc3d4..65c1b6fc 100644 --- a/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp @@ -34,8 +34,8 @@ UIScene_DLCOffersMenu::UIScene_DLCOffersMenu(int iPad, void *initData, UILayer * m_labelOffers.init(app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS)); m_buttonListOffers.init(eControl_OffersList); - m_labelHTMLSellText.init(" "); - m_labelPriceTag.init(" "); + m_labelHTMLSellText.init(L" "); + m_labelPriceTag.init(L" "); TelemetryManager->RecordMenuShown(m_iPad, eUIScene_DLCOffersMenu, 0); m_bHasPurchased = false; @@ -93,7 +93,7 @@ void UIScene_DLCOffersMenu::handleTimerComplete(int id) // 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()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_DLCOffersMenu::ExitDLCOffersMenu,this); } #endif break; @@ -105,10 +105,8 @@ int UIScene_DLCOffersMenu::ExitDLCOffersMenu(void *pParam,int iPad,C4JStorage::E { UIScene_DLCOffersMenu* pClass = (UIScene_DLCOffersMenu*)pParam; -#ifdef __ORBIS__ - sceNpCommerceHidePsStoreIcon(); -#elif defined __PSVITA__ - sceNpCommerce2HidePsStoreIcon(); +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); #endif ui.NavigateToHomeMenu();//iPad,eUIScene_MainMenu); @@ -446,7 +444,7 @@ void UIScene_DLCOffersMenu::tick() SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfoFromKeyname(info.productId); // does the DLC info have an image? - if(pSONYDLCInfo->dwImageBytes!=0) + if(pSONYDLCInfo && pSONYDLCInfo->dwImageBytes!=0) { pbImageData=pSONYDLCInfo->pbImageData; iImageDataBytes=pSONYDLCInfo->dwImageBytes; @@ -645,6 +643,16 @@ void UIScene_DLCOffersMenu::tick() int iIndex = getControlChildFocus(); MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager.GetOffer(iIndex); + if (!ui.UsingBitmapFont()) // 4J-JEV: Replace characters we don't have. + { + for (int i=0; xOffer.wszCurrencyPrice[i]!=0; i++) + { + WCHAR *c = &xOffer.wszCurrencyPrice[i]; + if (*c == L'\u20A9') *c = L'\uFFE6'; // Korean Won. + else if (*c == L'\u00A5') *c = L'\uFFE5'; // Japanese Yen. + } + } + if(UpdateDisplay(xOffer)) { // image was available diff --git a/Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp index 2026bfca..8f0f4c11 100644 --- a/Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp @@ -117,13 +117,13 @@ void UIScene_DeathMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&IUIScene_PauseMenu::ExitGameSaveDialogReturned,(LPVOID)GetCallbackUniqueId()); } 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,(LPVOID)GetCallbackUniqueId()); } #else @@ -131,7 +131,7 @@ void UIScene_DeathMenu::handlePress(F64 controlId, F64 childId) { 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,(LPVOID)GetCallbackUniqueId()); } else { @@ -141,14 +141,14 @@ void UIScene_DeathMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&IUIScene_PauseMenu::ExitGameSaveDialogReturned,(LPVOID)GetCallbackUniqueId()); } 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,(LPVOID)GetCallbackUniqueId()); } } #endif @@ -175,7 +175,7 @@ void UIScene_DeathMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,(LPVOID)GetCallbackUniqueId()); } else { diff --git a/Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp b/Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp index 658a8517..c7db8db9 100644 --- a/Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp +++ b/Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp @@ -14,15 +14,15 @@ LPCWSTR UIScene_DebugOptionsMenu::m_DebugCheckboxTextA[eDebugSetting_Max+1]= L"Craft Anything", L"Use DPad for debug", L"Mobs don't tick", - L"Instant Mine", + L"Art tools", //L"Instant Mine", L"Show UI Console", L"Distributable Save", L"Debug Leaderboards", - L"Height-Water-Biome Maps", + L"Height-Water Maps", L"Superflat Nether", //L"Light/Dark background", L"More lightning when thundering", - L"Go To Nether", + L"Biome override", //L"Go To End", L"Go To Overworld", L"Unlock All DLC", //L"Toggle Font", diff --git a/Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp b/Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp index 44a7e6c5..8e45c324 100644 --- a/Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp +++ b/Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp @@ -26,7 +26,7 @@ UIScene_DebugOverlay::UIScene_DebugOverlay(int iPad, void *initData, UILayer *pa swprintf( (WCHAR *)TempString, 256, L"Set fov (%d)", (int)pMinecraft->gameRenderer->GetFovVal()); m_sliderFov.init(TempString,eControl_FOV,0,100,(int)pMinecraft->gameRenderer->GetFovVal()); - float currentTime = pMinecraft->level->getLevelData()->getTime() % 24000; + float currentTime = pMinecraft->level->getLevelData()->getGameTime() % 24000; swprintf( (WCHAR *)TempString, 256, L"Set time (unsafe) (%d)", (int)currentTime); m_sliderTime.init(TempString,eControl_Time,0,240,currentTime/100); @@ -242,7 +242,7 @@ void UIScene_DebugOverlay::handleSliderMove(F64 sliderId, F64 currentValue) // 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); + pMinecraft->level->getLevelData()->setGameTime(currentValue * 100); WCHAR TempString[256]; float currentTime = currentValue * 100; diff --git a/Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp index 1eda1660..97cf842a 100644 --- a/Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp @@ -10,10 +10,10 @@ UIScene_DispenserMenu::UIScene_DispenserMenu(int iPad, void *_initData, UILayer // Setup all the Iggy references we need for this scene initialiseMovie(); - m_labelDispenser.init(app.GetString(IDS_DISPENSER)); - TrapScreenInput *initData = (TrapScreenInput *)_initData; + m_labelDispenser.init(initData->trap->getName()); + Minecraft *pMinecraft = Minecraft::GetInstance(); if( pMinecraft->localgameModes[initData->iPad] != NULL ) { diff --git a/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp index 8a4f1c6d..27459ccc 100644 --- a/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp @@ -10,13 +10,13 @@ UIScene_EnchantingMenu::UIScene_EnchantingMenu(int iPad, void *_initData, UILaye // 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; + + m_labelEnchant.init( initData->name.empty() ? app.GetString(IDS_ENCHANT) : initData->name ); Minecraft *pMinecraft = Minecraft::GetInstance(); if( pMinecraft->localgameModes[initData->iPad] != NULL ) diff --git a/Minecraft.Client/Common/UI/UIScene_EndPoem.cpp b/Minecraft.Client/Common/UI/UIScene_EndPoem.cpp index f825efd0..c5a8e61a 100644 --- a/Minecraft.Client/Common/UI/UIScene_EndPoem.cpp +++ b/Minecraft.Client/Common/UI/UIScene_EndPoem.cpp @@ -219,7 +219,16 @@ void UIScene_EndPoem::updateNoise() replaceString = L""; for(int i = 0; i < length; ++i) { - randomChar = SharedConstants::acceptableLetters[random->nextInt((int)SharedConstants::acceptableLetters.length())]; + if (ui.UsingBitmapFont()) + { + randomChar = SharedConstants::acceptableLetters[random->nextInt((int)SharedConstants::acceptableLetters.length())]; + } + else + { + // 4J-JEV: It'd be nice to avoid null characters when using asian languages. + static wstring acceptableLetters = L"!\"#$%&'()*+,-./0123456789:;<=>?@[\\]^_'|}~"; + randomChar = acceptableLetters[ random->nextInt((int)acceptableLetters.length()) ]; + } wstring randomCharStr = L""; randomCharStr.push_back(randomChar); diff --git a/Minecraft.Client/Common/UI/UIScene_FireworksMenu.cpp b/Minecraft.Client/Common/UI/UIScene_FireworksMenu.cpp new file mode 100644 index 00000000..1d24f989 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FireworksMenu.cpp @@ -0,0 +1,233 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\Minecraft.h" +#include "..\..\LocalPlayer.h" +#include "UIScene_FireworksMenu.h" + +UIScene_FireworksMenu::UIScene_FireworksMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + FireworksScreenInput *initData = (FireworksScreenInput *)_initData; + + m_labelFireworks.init(app.GetString(IDS_HOW_TO_PLAY_MENU_FIREWORKS)); + + 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_Fireworks_Menu, this); + } + + FireworksMenu* menu = new FireworksMenu( initData->player->inventory, initData->player->level, initData->x, initData->y, initData->z ); + + Initialize( initData->iPad, menu, true, FireworksMenu::INV_SLOT_START, eSectionFireworksUsing, eSectionFireworksMax ); + + m_slotListResult.addSlots(FireworksMenu::RESULT_SLOT,1); + m_slotList3x3.addSlots(FireworksMenu::CRAFT_SLOT_START, 9); + ShowLargeCraftingGrid(true); + + delete initData; +} + +wstring UIScene_FireworksMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"FireworksMenuSplit"; + } + else + { + return L"FireworksMenu"; + } +} + +void UIScene_FireworksMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, FireworksMenu::INV_SLOT_START, eSectionFireworksUsing, eSectionFireworksMax ); + + m_slotListResult.addSlots(FireworksMenu::RESULT_SLOT,1); + m_slotList3x3.addSlots(FireworksMenu::CRAFT_SLOT_START, 9); + ShowLargeCraftingGrid(true); +} + +int UIScene_FireworksMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionFireworksIngredients: + cols = 3; + break; + case eSectionFireworksResult: + cols = 1; + break; + case eSectionFireworksInventory: + cols = 9; + break; + case eSectionFireworksUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_FireworksMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionFireworksIngredients: + rows = 3; + break; + case eSectionFireworksResult: + rows = 1; + break; + case eSectionFireworksInventory: + rows = 3; + break; + case eSectionFireworksUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_FireworksMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionFireworksIngredients: + pPosition->x = m_slotList3x3.getXPos(); + pPosition->y = m_slotList3x3.getYPos(); + break; + case eSectionFireworksResult: + pPosition->x = m_slotListResult.getXPos(); + pPosition->y = m_slotListResult.getYPos(); + break; + case eSectionFireworksInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionFireworksUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_FireworksMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + switch( eSection ) + { + case eSectionFireworksIngredients: + sectionSize.x = m_slotList3x3.getWidth(); + sectionSize.y = m_slotList3x3.getHeight(); + break; + case eSectionFireworksResult: + sectionSize.x = m_slotListResult.getWidth(); + sectionSize.y = m_slotListResult.getHeight(); + break; + case eSectionFireworksInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionFireworksUsing: + 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_FireworksMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionFireworksIngredients: + slotList = &m_slotList3x3; + break; + case eSectionFireworksResult: + slotList = &m_slotListResult; + break; + case eSectionFireworksInventory: + slotList = &m_slotListInventory; + break; + case eSectionFireworksUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_FireworksMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionFireworksIngredients: + control = &m_slotList3x3; + break; + case eSectionFireworksResult: + control = &m_slotListResult; + break; + case eSectionFireworksInventory: + control = &m_slotListInventory; + break; + case eSectionFireworksUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} + +// bShow == true removes the 2x2 crafting grid and bShow == false removes the 3x3 crafting grid +void UIScene_FireworksMenu::ShowLargeCraftingGrid(boolean bShow) +{ + app.DebugPrintf("ShowLargeCraftingGrid to %d\n", bShow); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bShow; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowLargeCraftingGrid , 1 , value ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_FireworksMenu.h b/Minecraft.Client/Common/UI/UIScene_FireworksMenu.h new file mode 100644 index 00000000..b56443b9 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FireworksMenu.h @@ -0,0 +1,44 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_FireworksMenu.h" + +class InventoryMenu; + +class UIScene_FireworksMenu : public UIScene_AbstractContainerMenu, public IUIScene_FireworksMenu +{ +public: + UIScene_FireworksMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_FireworksMenu;} + +protected: + UIControl_SlotList m_slotListResult, m_slotList3x3, m_slotList2x2; + UIControl_Label m_labelFireworks; + IggyName m_funcShowLargeCraftingGrid; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListResult, "Result") + UI_MAP_ELEMENT( m_slotList3x3, "Fireworks3x3") + UI_MAP_ELEMENT( m_slotList2x2, "Fireworks2x2") + UI_MAP_ELEMENT( m_labelFireworks, "FireworksLabel") + + UI_MAP_NAME( m_funcShowLargeCraftingGrid, L"ShowLargeCraftingGrid") + 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); + + void ShowLargeCraftingGrid(boolean bShow); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp index ed31cfaf..fb17bda4 100644 --- a/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp +++ b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp @@ -187,7 +187,7 @@ void UIScene_FullscreenProgress::tick() 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.RequestErrorMessage( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_FAILED), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_SERVER), uiIDA,1, XUSER_INDEX_ANY); ui.NavigateToHomeMenu(); ui.UpdatePlayerBasePositions(); @@ -199,6 +199,10 @@ void UIScene_FullscreenProgress::tick() { m_threadCompleted = true; m_buttonConfirm.setVisible( true ); + // 4J-TomK - rebuild touch after confirm button made visible again +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif updateTooltips(); } else diff --git a/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp index 1ba4053d..392221a6 100644 --- a/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp @@ -10,16 +10,16 @@ UIScene_FurnaceMenu::UIScene_FurnaceMenu(int iPad, void *_initData, UILayer *par // Setup all the Iggy references we need for this scene initialiseMovie(); - m_labelFurnace.init(app.GetString(IDS_FURNACE)); + FurnaceScreenInput *initData = (FurnaceScreenInput *)_initData; + m_furnace = initData->furnace; + + m_labelFurnace.init(m_furnace->getName()); 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 ) { diff --git a/Minecraft.Client/Common/UI/UIScene_HUD.cpp b/Minecraft.Client/Common/UI/UIScene_HUD.cpp index 27eeb76b..c3d52cf9 100644 --- a/Minecraft.Client/Common/UI/UIScene_HUD.cpp +++ b/Minecraft.Client/Common/UI/UIScene_HUD.cpp @@ -1,13 +1,12 @@ #include "stdafx.h" #include "UI.h" #include "UIScene_HUD.h" +#include "BossMobGuiInfo.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) @@ -17,32 +16,6 @@ UIScene_HUD::UIScene_HUD(int iPad, void *initData, UILayer *parentLayer) : UISce // 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""); @@ -146,33 +119,35 @@ void UIScene_HUD::tick() return; } - if(pMinecraft->localplayers[m_iPad]->dimension == 1) + // Is boss present? + bool noBoss = BossMobGuiInfo::name.empty() || BossMobGuiInfo::displayTicks <= 0; + if (noBoss) { - if (EnderDragonRenderer::bossInstance == NULL) + if (m_showDragonHealth) { - if(m_ticksWithNoBoss<=20) + // No boss and health is visible + if(m_ticksWithNoBoss <= 20) { ++m_ticksWithNoBoss; } - if( m_ticksWithNoBoss > 20 ) + else { 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); + BossMobGuiInfo::displayTicks--; + + m_ticksWithNoBoss = 0; + SetDragonHealth(BossMobGuiInfo::healthProgress); + + if (!m_showDragonHealth) + { + SetDragonLabel(BossMobGuiInfo::name); + ShowDragonHealth(true); + } } } } @@ -229,34 +204,46 @@ void UIScene_HUD::customDraw(IggyCustomDrawCallbackRegion *region) void UIScene_HUD::handleReload() { - m_lastActiveSlot = 0; - m_lastScale = 1; + m_lastActiveSlot = -1; + m_iGuiScale = -1; m_bToolTipsVisible = true; m_lastExpProgress = 0.0f; m_lastExpLevel = 0; + m_iCurrentHealth = 0; m_lastMaxHealth = 20; m_lastHealthBlink = false; m_lastHealthPoison = false; - m_lastMaxFood = 20; + m_iCurrentFood = -1; m_lastFoodPoison = false; m_lastAir = 10; + m_currentExtraAir = 0; m_lastArmour = 0; m_showHealth = true; + m_showHorseHealth = true; m_showFood = true; - m_showAir = true; + m_showAir = false; // get's initialised invisible anyways, by setting it to false we ensure it will remain visible when switching in and out of split screen! m_showArmour = true; m_showExpBar = true; - m_lastRegenEffect = false; - m_lastSaturation = 0; + m_bRegenEffectEnabled = false; + m_iFoodSaturation = 0; m_lastDragonHealth = 0.0f; m_showDragonHealth = false; m_ticksWithNoBoss = 0; m_uiSelectedItemOpacityCountDown = 0; m_displayName = L""; + m_lastShowDisplayName = true; + m_bRidingHorse = true; + m_horseHealth = 1; + m_lastHealthWither = true; + m_iCurrentHealthAbsorb = -1; + m_horseJumpProgress = 1.0f; + m_iHeartOffsetIndex = -1; + m_bHealthAbsorbActive = false; + m_iHorseMaxHealth = -1; m_labelDisplayName.setVisible(m_lastShowDisplayName); - SetDragonLabel( app.GetString( IDS_BOSS_ENDERDRAGON_HEALTH ) ); + SetDragonLabel(BossMobGuiInfo::name); SetSelectedLabel(L""); for(unsigned int i = 0; i < CHAT_LINES_COUNT; ++i) @@ -284,11 +271,26 @@ void UIScene_HUD::handleReload() SetTooltipsEnabled(((ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) || (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) != 0))); } +int UIScene_HUD::getPad() +{ + return m_iPad; +} + +void UIScene_HUD::SetOpacity(float opacity) +{ + setOpacity(opacity); +} + +void UIScene_HUD::SetVisible(bool visible) +{ + setVisible(visible); +} + void UIScene_HUD::SetHudSize(int scale) { - if(scale != m_lastScale) + if(scale != m_iGuiScale) { - m_lastScale = scale; + m_iGuiScale = scale; IggyDataValue result; IggyDataValue value[1]; @@ -298,7 +300,7 @@ void UIScene_HUD::SetHudSize(int scale) } } -void UIScene_HUD::SetExpBarProgress(float progress) +void UIScene_HUD::SetExpBarProgress(float progress, int xpNeededForNextLevel) { if(progress != m_lastExpProgress) { @@ -340,24 +342,27 @@ void UIScene_HUD::SetActiveSlot(int slot) } } -void UIScene_HUD::SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison) +void UIScene_HUD::SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison, bool bWither) { int maxHealth = max(iHealth, iLastHealth); - if(maxHealth != m_lastMaxHealth || bBlink != m_lastHealthBlink || bPoison != m_lastHealthPoison) + if(maxHealth != m_lastMaxHealth || bBlink != m_lastHealthBlink || bPoison != m_lastHealthPoison || bWither != m_lastHealthWither) { m_lastMaxHealth = maxHealth; m_lastHealthBlink = bBlink; m_lastHealthPoison = bPoison; + m_lastHealthWither = bWither; IggyDataValue result; - IggyDataValue value[3]; + IggyDataValue value[4]; 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 ); + value[3].type = IGGY_DATATYPE_boolean; + value[3].boolval = bWither; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetHealth , 4 , value ); } } @@ -365,9 +370,9 @@ 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) + if(maxFood != m_iCurrentFood || bPoison != m_lastFoodPoison) { - m_lastMaxFood = maxFood; + m_iCurrentFood = maxFood; m_lastFoodPoison = bPoison; IggyDataValue result; @@ -380,7 +385,7 @@ void UIScene_HUD::SetFood(int iFood, int iLastFood, bool bPoison) } } -void UIScene_HUD::SetAir(int iAir) +void UIScene_HUD::SetAir(int iAir, int extra) { if(iAir != m_lastAir) { @@ -425,6 +430,21 @@ void UIScene_HUD::ShowHealth(bool show) } } +void UIScene_HUD::ShowHorseHealth(bool show) +{ + if(show != m_showHorseHealth) + { + app.DebugPrintf("ShowHorseHealth to %s\n", show?"TRUE":"FALSE"); + m_showHorseHealth = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowHorseHealth , 1 , value ); + } +} + void UIScene_HUD::ShowFood(bool show) { if(show != m_showFood) @@ -487,10 +507,10 @@ void UIScene_HUD::ShowExpBar(bool show) void UIScene_HUD::SetRegenerationEffect(bool bEnabled) { - if(bEnabled != m_lastRegenEffect) + if(bEnabled != m_bRegenEffectEnabled) { app.DebugPrintf("SetRegenerationEffect to %s\n", bEnabled?"TRUE":"FALSE"); - m_lastRegenEffect = bEnabled; + m_bRegenEffectEnabled = bEnabled; IggyDataValue result; IggyDataValue value[1]; @@ -502,10 +522,10 @@ void UIScene_HUD::SetRegenerationEffect(bool bEnabled) void UIScene_HUD::SetFoodSaturationLevel(int iSaturation) { - if(iSaturation != m_lastSaturation) + if(iSaturation != m_iFoodSaturation) { app.DebugPrintf("Set saturation to %d\n", iSaturation); - m_lastSaturation = iSaturation; + m_iFoodSaturation = iSaturation; IggyDataValue result; IggyDataValue value[1]; @@ -578,6 +598,77 @@ void UIScene_HUD::HideSelectedLabel() IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcHideSelectedLabel , 0 , NULL ); } + +void UIScene_HUD::SetRidingHorse(bool ridingHorse, bool bIsJumpable, int maxHorseHealth) +{ + if(m_bRidingHorse != ridingHorse || maxHorseHealth != m_iHorseMaxHealth) + { + app.DebugPrintf("SetRidingHorse to %s\n", ridingHorse?"TRUE":"FALSE"); + m_bRidingHorse = ridingHorse; + m_bIsJumpable = bIsJumpable; + m_iHorseMaxHealth = maxHorseHealth; + + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = ridingHorse; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bIsJumpable; + value[2].type = IGGY_DATATYPE_number; + value[2].number = maxHorseHealth; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetRidingHorse , 3 , value ); + } +} + +void UIScene_HUD::SetHorseHealth(int health, bool blink /*= false*/) +{ + if(m_bRidingHorse && m_horseHealth != health) + { + app.DebugPrintf("SetHorseHealth to %d\n", health); + m_horseHealth = health; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = health; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = blink; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetHorseHealth , 2 , value ); + } +} + +void UIScene_HUD::SetHorseJumpBarProgress(float progress) +{ + if(m_bRidingHorse && m_horseJumpProgress != progress) + { + app.DebugPrintf("SetHorseJumpBarProgress to %f\n", progress); + m_horseJumpProgress = progress; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = progress; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetHorseJumpBarProgress , 1 , value ); + } +} + +void UIScene_HUD::SetHealthAbsorb(int healthAbsorb) +{ + if(m_iCurrentHealthAbsorb != healthAbsorb) + { + app.DebugPrintf("SetHealthAbsorb to %d\n", healthAbsorb); + m_iCurrentHealthAbsorb = healthAbsorb; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = healthAbsorb > 0; + value[1].type = IGGY_DATATYPE_number; + value[1].number = healthAbsorb; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetHealthAbsorb , 2 , value ); + } +} + void UIScene_HUD::render(S32 width, S32 height, C4JRender::eViewportType viewport) { if(m_bSplitscreen) @@ -775,223 +866,6 @@ void UIScene_HUD::handleGameTick() } 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); - } + updateFrameTick(); } -} +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_HUD.h b/Minecraft.Client/Common/UI/UIScene_HUD.h index cd0d8806..9d58ba4b 100644 --- a/Minecraft.Client/Common/UI/UIScene_HUD.h +++ b/Minecraft.Client/Common/UI/UIScene_HUD.h @@ -1,38 +1,15 @@ #pragma once #include "UIScene.h" +#include "IUIScene_HUD.h" #define CHAT_LINES_COUNT 10 -class UIScene_HUD : public UIScene +class UIScene_HUD : public UIScene, public IUIScene_HUD { 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; @@ -41,11 +18,13 @@ protected: 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_funcShowHealth, m_funcShowHorseHealth, 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; + IggyName m_funcSetRidingHorse, m_funcSetHorseHealth, m_funcSetHorseJumpBarProgress; + IggyName m_funcSetHealthAbsorb; UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) UI_MAP_ELEMENT(m_labelChatText[0],"Label1") UI_MAP_ELEMENT(m_labelChatText[1],"Label2") @@ -84,6 +63,7 @@ protected: UI_MAP_NAME(m_funcSetArmour, L"SetArmour") UI_MAP_NAME(m_funcShowHealth, L"ShowHealth") + UI_MAP_NAME(m_funcShowHorseHealth, L"ShowHorseHealth") UI_MAP_NAME(m_funcShowFood, L"ShowFood") UI_MAP_NAME(m_funcShowAir, L"ShowAir") UI_MAP_NAME(m_funcShowArmour, L"ShowArmour") @@ -103,6 +83,12 @@ protected: UI_MAP_NAME(m_funcSetDisplayName, L"SetGamertag") UI_MAP_NAME(m_funcSetTooltipsEnabled, L"SetTooltipsEnabled") + + UI_MAP_NAME(m_funcSetRidingHorse, L"SetRidingHorse") + UI_MAP_NAME(m_funcSetHorseHealth, L"SetHorseHealth") + UI_MAP_NAME(m_funcSetHorseJumpBarProgress, L"SetHorseJumpBarProgress") + + UI_MAP_NAME(m_funcSetHealthAbsorb, L"SetHealthAbsorb") UI_END_MAP_ELEMENTS_AND_NAMES() public: @@ -133,17 +119,22 @@ public: virtual void handleReload(); private: + virtual int getPad(); + virtual void SetOpacity(float opacity); + virtual void SetVisible(bool visible); + void SetHudSize(int scale); - void SetExpBarProgress(float progress); + void SetExpBarProgress(float progress, int xpNeededForNextLevel); void SetExpLevel(int level); void SetActiveSlot(int slot); - void SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison); + void SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison, bool bWither); void SetFood(int iFood, int iLastFood, bool bPoison); - void SetAir(int iAir); + void SetAir(int iAir, int extra); void SetArmour(int iArmour); void ShowHealth(bool show); + void ShowHorseHealth(bool show); void ShowFood(bool show); void ShowAir(bool show); void ShowArmour(bool show); @@ -162,6 +153,12 @@ private: void SetTooltipsEnabled(bool bEnabled); + void SetRidingHorse(bool ridingHorse, bool bIsJumpable, int maxHorseHealth); + void SetHorseHealth(int health, bool blink = false); + void SetHorseJumpBarProgress(float progress); + + void SetHealthAbsorb(int healthAbsorb); + public: void SetSelectedLabel(const wstring &label); void ShowDisplayName(bool show); diff --git a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp index 3fe03325..a0d63172 100644 --- a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp @@ -10,21 +10,19 @@ UIScene_HelpAndOptionsMenu::UIScene_HelpAndOptionsMenu(int iPad, void *initData, 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_CHANGESKIN].init(IDS_CHANGE_SKIN,BUTTON_HAO_CHANGESKIN); + m_buttons[BUTTON_HAO_HOWTOPLAY].init(IDS_HOW_TO_PLAY,BUTTON_HAO_HOWTOPLAY); + m_buttons[BUTTON_HAO_CONTROLS].init(IDS_CONTROLS,BUTTON_HAO_CONTROLS); + m_buttons[BUTTON_HAO_SETTINGS].init(IDS_SETTINGS,BUTTON_HAO_SETTINGS); + m_buttons[BUTTON_HAO_CREDITS].init(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); + m_buttons[BUTTON_HAO_DEBUG].init(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 @@ -75,6 +73,9 @@ UIScene_HelpAndOptionsMenu::UIScene_HelpAndOptionsMenu(int iPad, void *initData, removeControl( &m_buttons[BUTTON_HAO_CHANGESKIN], false); } + // 4J-TomK Moved horizontal resize check to the end to prevent horizontal scaling for buttons that might get removed anyways (debug options for example) + doHorizontalResizeCheck(); + //StorageManager.TMSPP_GetUserQuotaInfo(C4JStorage::eGlobalStorage_TitleUser,iPad); //StorageManager.WebServiceRequestGetFriends(iPad); } diff --git a/Minecraft.Client/Common/UI/UIScene_HopperMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HopperMenu.cpp new file mode 100644 index 00000000..f0f6db18 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HopperMenu.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_HopperMenu.h" + +UIScene_HopperMenu::UIScene_HopperMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + HopperScreenInput *initData = (HopperScreenInput *)_initData; + + m_labelDispenser.init(initData->hopper->getName()); + + 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_Hopper_Menu, this); + } + + HopperMenu* menu = new HopperMenu( initData->inventory, initData->hopper ); + + m_containerSize = initData->hopper->getContainerSize(); + Initialize( initData->iPad, menu, true, m_containerSize, eSectionHopperUsing, eSectionHopperMax ); + + m_slotListTrap.addSlots(0, 9); + + delete initData; +} + +wstring UIScene_HopperMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"HopperMenuSplit"; + } + else + { + return L"HopperMenu"; + } +} + +void UIScene_HopperMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, m_containerSize, eSectionHopperUsing, eSectionHopperMax ); + + m_slotListTrap.addSlots(0, 9); +} + +int UIScene_HopperMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionHopperContents: + cols = 5; + break; + case eSectionHopperInventory: + cols = 9; + break; + case eSectionHopperUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_HopperMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionHopperContents: + rows = 1; + break; + case eSectionHopperInventory: + rows = 3; + break; + case eSectionHopperUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_HopperMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionHopperContents: + pPosition->x = m_slotListTrap.getXPos(); + pPosition->y = m_slotListTrap.getYPos(); + break; + case eSectionHopperInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionHopperUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_HopperMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + switch( eSection ) + { + case eSectionHopperContents: + sectionSize.x = m_slotListTrap.getWidth(); + sectionSize.y = m_slotListTrap.getHeight(); + break; + case eSectionHopperInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionHopperUsing: + 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_HopperMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionHopperContents: + slotList = &m_slotListTrap; + break; + case eSectionHopperInventory: + slotList = &m_slotListInventory; + break; + case eSectionHopperUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_HopperMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionHopperContents: + control = &m_slotListTrap; + break; + case eSectionHopperInventory: + control = &m_slotListInventory; + break; + case eSectionHopperUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_HopperMenu.h b/Minecraft.Client/Common/UI/UIScene_HopperMenu.h new file mode 100644 index 00000000..ff058fe8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HopperMenu.h @@ -0,0 +1,40 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_HopperMenu.h" + +class InventoryMenu; + +class UIScene_HopperMenu : public UIScene_AbstractContainerMenu, public IUIScene_HopperMenu +{ +private: + int m_containerSize; + +public: + UIScene_HopperMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_HopperMenu;} + +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_HorseInventoryMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HorseInventoryMenu.cpp new file mode 100644 index 00000000..ab98e30f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HorseInventoryMenu.cpp @@ -0,0 +1,338 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "MultiPlayerLocalPlayer.h" +#include "..\..\Minecraft.h" +#include "UIScene_HorseInventoryMenu.h" + +UIScene_HorseInventoryMenu::UIScene_HorseInventoryMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + HorseScreenInput *initData = (HorseScreenInput *)_initData; + + m_labelHorse.init( initData->container->getName() ); + m_inventory = initData->inventory; + m_horse = initData->horse; + + 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_Horse_Menu, this); + } + + HorseInventoryMenu *horseMenu = new HorseInventoryMenu(initData->inventory, initData->container, initData->horse); + + int startSlot = EntityHorse::INV_BASE_COUNT; + if(m_horse->isChestedHorse()) + { + startSlot += EntityHorse::INV_DONKEY_CHEST_COUNT; + } + Initialize( iPad, horseMenu, true, startSlot, eSectionHorseUsing, eSectionHorseMax ); + + m_slotSaddle.addSlots(EntityHorse::INV_SLOT_SADDLE,1); + m_slotArmor.addSlots(EntityHorse::INV_SLOT_ARMOR,1); + + if(m_horse->isChestedHorse()) + { + // also starts at one, because a donkey can't wear armor! + m_slotListChest.addSlots(EntityHorse::INV_BASE_COUNT, EntityHorse::INV_DONKEY_CHEST_COUNT); + } + + // remove horse inventory + if(!m_horse->isChestedHorse()) + SetHasInventory(false); + + // cannot wear armor? remove armor slot! + if(!m_horse->canWearArmor()) + SetIsDonkey(true); + + if(initData) delete initData; + + setIgnoreInput(false); + + //app.SetRichPresenceContext(iPad, CONTEXT_GAME_STATE_HORSE); +} + +wstring UIScene_HorseInventoryMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"HorseInventoryMenuSplit"; + } + else + { + return L"HorseInventoryMenu"; + } +} + +void UIScene_HorseInventoryMenu::handleReload() +{ + int startSlot = EntityHorse::INV_BASE_COUNT; + if(m_horse->isChestedHorse()) + { + startSlot += EntityHorse::INV_DONKEY_CHEST_COUNT; + } + Initialize( m_iPad, m_menu, true, startSlot, eSectionHorseUsing, eSectionHorseMax ); + + m_slotSaddle.addSlots(EntityHorse::INV_SLOT_SADDLE,1); + m_slotArmor.addSlots(EntityHorse::INV_SLOT_ARMOR,1); + + if(m_horse->isChestedHorse()) + { + // also starts at one, because a donkey can't wear armor! + m_slotListChest.addSlots(EntityHorse::INV_BASE_COUNT, EntityHorse::INV_DONKEY_CHEST_COUNT); + } + + // remove horse inventory + if(!m_horse->isChestedHorse()) + SetHasInventory(false); + + // cannot wear armor? remove armor slot! + if(!m_horse->canWearArmor()) + SetIsDonkey(true); +} + +int UIScene_HorseInventoryMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionHorseArmor: + cols = 1; + break; + case eSectionHorseSaddle: + cols = 1; + break; + case eSectionHorseChest: + cols = 5; + break; + case eSectionHorseInventory: + cols = 9; + break; + case eSectionHorseUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_HorseInventoryMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionHorseArmor: + rows = 1; + break; + case eSectionHorseSaddle: + rows = 1; + break; + case eSectionHorseChest: + rows = 3; + break; + case eSectionHorseInventory: + rows = 3; + break; + case eSectionHorseUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_HorseInventoryMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionHorseArmor: + pPosition->x = m_slotArmor.getXPos(); + pPosition->y = m_slotArmor.getYPos(); + break; + case eSectionHorseSaddle: + pPosition->x = m_slotSaddle.getXPos(); + pPosition->y = m_slotSaddle.getYPos(); + break; + case eSectionHorseChest: + pPosition->x = m_slotListChest.getXPos(); + pPosition->y = m_slotListChest.getYPos(); + break; + case eSectionHorseInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionHorseUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_HorseInventoryMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionHorseArmor: + sectionSize.x = m_slotArmor.getWidth(); + sectionSize.y = m_slotArmor.getHeight(); + break; + case eSectionHorseSaddle: + sectionSize.x = m_slotSaddle.getWidth(); + sectionSize.y = m_slotSaddle.getHeight(); + break; + case eSectionHorseChest: + sectionSize.x = m_slotListChest.getWidth(); + sectionSize.y = m_slotListChest.getHeight(); + break; + case eSectionHorseInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionHorseUsing: + 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_HorseInventoryMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionHorseArmor: + slotList = &m_slotArmor; + break; + case eSectionHorseSaddle: + slotList = &m_slotSaddle; + break; + case eSectionHorseChest: + slotList = &m_slotListChest; + break; + case eSectionHorseInventory: + slotList = &m_slotListInventory; + break; + case eSectionHorseUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_HorseInventoryMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionHorseArmor: + control = &m_slotArmor; + break; + case eSectionHorseSaddle: + control = &m_slotSaddle; + break; + case eSectionHorseChest: + control = &m_slotListChest; + break; + case eSectionHorseInventory: + control = &m_slotListInventory; + break; + case eSectionHorseUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} + +void UIScene_HorseInventoryMenu::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"horse")==0) + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + m_horsePreview.render(region); + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } + else + { + UIScene_AbstractContainerMenu::customDraw(region); + } +} + +void UIScene_HorseInventoryMenu::SetHasInventory(bool bHasInventory) +{ + app.DebugPrintf("SetHasInventory to %d\n", bHasInventory); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bHasInventory; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetHasInventory , 1 , value ); +} + +void UIScene_HorseInventoryMenu::SetIsDonkey(bool bSetIsDonkey) +{ + app.DebugPrintf("SetIsDonkey to %d\n", bSetIsDonkey); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bSetIsDonkey; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetIsDonkey , 1 , value ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_HorseInventoryMenu.h b/Minecraft.Client/Common/UI/UIScene_HorseInventoryMenu.h new file mode 100644 index 00000000..063e1128 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HorseInventoryMenu.h @@ -0,0 +1,54 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_HorseInventoryMenu.h" + +class InventoryMenu; + +class UIScene_HorseInventoryMenu : public UIScene_AbstractContainerMenu, public IUIScene_HorseInventoryMenu +{ + friend class UIControl_MinecraftHorse; +public: + UIScene_HorseInventoryMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_HorseMenu;} + +protected: + UIControl_SlotList m_slotSaddle, m_slotArmor, m_slotListChest; + UIControl_Label m_labelHorse; + + IggyName m_funcSetIsDonkey, m_funcSetHasInventory; + + UIControl_MinecraftHorse m_horsePreview; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotSaddle, "SlotSaddle") + UI_MAP_ELEMENT( m_slotArmor, "SlotArmor") + UI_MAP_ELEMENT( m_slotListChest, "DonkeyInventoryList") + UI_MAP_ELEMENT( m_labelHorse, "horseinventoryText") + + UI_MAP_ELEMENT( m_horsePreview, "iggy_horse") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcSetIsDonkey, L"SetIsDonkey") + UI_MAP_NAME(m_funcSetHasInventory, L"SetHasInventory") + 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); + + void SetHasInventory(bool bHasInventory); + void SetIsDonkey(bool bSetIsDonkey); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp b/Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp index 68c7591f..e33e24fe 100644 --- a/Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp @@ -24,6 +24,11 @@ static UIScene_HowToPlay::SHowToPlayPageDef gs_aPageDefs[ eHowToPlay_NumPages ] { 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_HORSES, 0, 0}, // eHowToPlay_Horses + { IDS_HOW_TO_PLAY_BEACONS, 0, 0}, // eHowToPlay_Beacons + { IDS_HOW_TO_PLAY_FIREWORKS, 0, 0}, // eHowToPlay_Fireworks + { IDS_HOW_TO_PLAY_HOPPERS, 0, 0}, // eHowToPlay_Hoppers + { IDS_HOW_TO_PLAY_DROPPERS, 0, 0}, // eHowToPlay_Droppers { IDS_HOW_TO_PLAY_NETHERPORTAL, 0, 0}, // eHowToPlay_NetherPortal { IDS_HOW_TO_PLAY_THEEND, 0, 0}, // eHowToPlay_NetherPortal #ifdef _XBOX @@ -56,6 +61,12 @@ int gs_pageToFlashMapping[eHowToPlay_NumPages] = 15, //eHowToPlay_Breeding, 22, //eHowToPlay_Trading, + 24, //eHowToPlay_Horses + 25, //eHowToPlay_Beacons + 26, //eHowToPlay_Fireworks + 27, //eHowToPlay_Hoppers + 28, //eHowToPlay_Droppers + 16, //eHowToPlay_NetherPortal, 17, //eHowToPlay_TheEnd, #ifdef _XBOX @@ -83,7 +94,7 @@ UIScene_HowToPlay::UIScene_HowToPlay(int iPad, void *initData, UILayer *parentLa 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_LabelLCChest].init(app.GetString(IDS_CHEST_LARGE)); m_labels[ eHowToPlay_LabelSCInventory].init(inventoryString); m_labels[ eHowToPlay_LabelSCChest].init(app.GetString(IDS_CHEST)); m_labels[ eHowToPlay_LabelIInventory].init(inventoryString); @@ -105,6 +116,18 @@ UIScene_HowToPlay::UIScene_HowToPlay(int iPad, void *initData, UILayer *parentLa m_labels[ eHowToPlay_LabelTrading_Offer1].init(app.GetString(IDS_ITEM_EMERALD)); m_labels[ eHowToPlay_LabelTrading_NeededForTrade].init(app.GetString(IDS_REQUIRED_ITEMS_FOR_TRADE)); + m_labels[ eHowToPlay_LabelBeacon_PrimaryPower].init(app.GetString(IDS_CONTAINER_BEACON_PRIMARY_POWER)); + m_labels[ eHowToPlay_LabelBeacon_SecondaryPower].init(app.GetString(IDS_CONTAINER_BEACON_SECONDARY_POWER)); + + m_labels[ eHowToPlay_LabelFireworksText].init(app.GetString(IDS_HOW_TO_PLAY_MENU_FIREWORKS)); + m_labels[ eHowToPlay_LabelFireworksInventory].init(inventoryString.c_str()); + + m_labels[ eHowToPlay_LabelHopperText].init(app.GetString(IDS_TILE_HOPPER)); + m_labels[ eHowToPlay_LabelHopperInventory].init(inventoryString.c_str()); + + m_labels[ eHowToPlay_LabelDropperText].init(app.GetString(IDS_TILE_DROPPER)); + m_labels[ eHowToPlay_LabelDropperInventory].init(inventoryString.c_str()); + 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)); @@ -138,13 +161,9 @@ void UIScene_HowToPlay::updateTooltips() 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__) + + // 4J Stu - Add back for future platforms +#if 0 // No What's New for the first PS4 and Xbox One builds if(true) { @@ -212,18 +231,8 @@ void UIScene_HowToPlay::handleInput(int iPad, int key, bool repeat, bool 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__) + // 4J Stu - Add back for future platforms +#if 0 // No What's New for the first PS4 and Xbox One builds if(true) { @@ -266,15 +275,21 @@ void UIScene_HowToPlay::StartPage( EHowToPlayPage ePage ) 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)); + // 4J-JEV: Temporary fix: LOC: Minecraft: XB1: KO: Font: Uncategorized: Squares appear instead of hyphens in FIREWORKS description + if (!ui.UsingBitmapFont()) + { + replacedText = replaceAll(replacedText, L"\u00A9", L"(C)"); + replacedText = replaceAll(replacedText, L"\u00AE", L"(R)"); + replacedText = replaceAll(replacedText, L"\u2013", L"-"); + } + // strip out any tab characters and repeated spaces stripWhitespaceForHtml( replacedText, true ); diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlay.h b/Minecraft.Client/Common/UI/UIScene_HowToPlay.h index cff07256..fe845896 100644 --- a/Minecraft.Client/Common/UI/UIScene_HowToPlay.h +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlay.h @@ -39,6 +39,14 @@ public: eHowToPlay_LabelTrading_Offer1, eHowToPlay_LabelTrading_NeededForTrade, eHowToPlay_LabelTrading_VillagerOffers, + eHowToPlay_LabelBeacon_PrimaryPower, + eHowToPlay_LabelBeacon_SecondaryPower, + eHowToPlay_LabelFireworksText, + eHowToPlay_LabelFireworksInventory, + eHowToPlay_LabelHopperText, + eHowToPlay_LabelHopperInventory, + eHowToPlay_LabelDropperText, + eHowToPlay_LabelDropperInventory, eHowToPlay_NumLabels }; @@ -99,6 +107,18 @@ private: 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_ELEMENT( m_labels[ eHowToPlay_LabelBeacon_PrimaryPower ] , "Label1_25" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelBeacon_SecondaryPower ] , "Label2_25" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFireworksText ] , "Label1_26" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFireworksInventory ] , "Label2_26" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelHopperText ] , "Label1_27" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelHopperInventory ] , "Label2_27" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelDropperText ] , "Label1_28" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelDropperInventory ] , "Label2_28" ) UI_MAP_NAME(m_funcLoadPage, L"LoadHowToPlayPage") UI_END_MAP_ELEMENTS_AND_NAMES() diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp index 5fc6e02b..92e8bdef 100644 --- a/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp @@ -23,6 +23,12 @@ unsigned int UIScene_HowToPlayMenu::m_uiHTPButtonNameA[]= IDS_HOW_TO_PLAY_MENU_BREEDANIMALS, // eHTPButton_Breeding, IDS_HOW_TO_PLAY_MENU_TRADING, + IDS_HOW_TO_PLAY_MENU_HORSES, + IDS_HOW_TO_PLAY_MENU_BEACONS, + IDS_HOW_TO_PLAY_MENU_FIREWORKS, + IDS_HOW_TO_PLAY_MENU_HOPPERS, + IDS_HOW_TO_PLAY_MENU_DROPPERS, + IDS_HOW_TO_PLAY_MENU_NETHERPORTAL, // eHTPButton_NetherPortal, IDS_HOW_TO_PLAY_MENU_THEEND, // eHTPButton_TheEnd, #ifdef _XBOX @@ -53,6 +59,12 @@ unsigned int UIScene_HowToPlayMenu::m_uiHTPSceneA[]= eHowToPlay_Breeding, eHowToPlay_Trading, + eHowToPlay_Horses, + eHowToPlay_Beacons, + eHowToPlay_Fireworks, + eHowToPlay_Hoppers, + eHowToPlay_Droppers, + eHowToPlay_NetherPortal, eHowToPlay_TheEnd, #ifdef _XBOX @@ -71,18 +83,9 @@ UIScene_HowToPlayMenu::UIScene_HowToPlayMenu(int iPad, void *initData, UILayer * 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 + // 4J Stu - Re-add for future platforms +#if 0 + // No What's New if(true) { if(!(i==eHTPButton_WhatsNew) ) @@ -96,6 +99,8 @@ UIScene_HowToPlayMenu::UIScene_HowToPlayMenu(int iPad, void *initData, UILayer * m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i);//iCount++); } } + + doHorizontalResizeCheck(); } wstring UIScene_HowToPlayMenu::getMoviePath() @@ -136,18 +141,9 @@ 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 + // 4J Stu - Re-add for future platforms +#if 0 + // No What's New if(true) { if(!(i==eHTPButton_WhatsNew) ) @@ -161,6 +157,8 @@ void UIScene_HowToPlayMenu::handleReload() m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i); } } + + doHorizontalResizeCheck(); } void UIScene_HowToPlayMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h index 5a60cdd0..1afcec38 100644 --- a/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h @@ -28,6 +28,11 @@ private: eHTPButton_FarmingAnimals, eHTPButton_Breeding, eHTPButton_Trading, + eHTPButton_Horses, + eHTPButton_Beacons, + eHTPButton_Fireworks, + eHTPButton_Hoppers, + eHTPButton_Droppers, eHTPButton_NetherPortal, eHTPButton_TheEnd, #ifdef _XBOX diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp index de8af0ac..68ac537e 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp @@ -15,6 +15,24 @@ UIScene_InGameHostOptionsMenu::UIScene_InGameHostOptionsMenu(int iPad, void *ini 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); + m_checkboxDoMobLoot.init(app.GetString(IDS_MOB_LOOT), eControl_DoMobLoot, app.GetGameHostOption(eGameHostOption_DoMobLoot)); + m_checkboxDoTileDrops.init(app.GetString(IDS_TILE_DROPS), eControl_DoTileDrops, app.GetGameHostOption(eGameHostOption_DoTileDrops)); + m_checkboxNaturalRegeneration.init(app.GetString(IDS_NATURAL_REGEN), eControl_NaturalRegeneration, app.GetGameHostOption(eGameHostOption_NaturalRegeneration)); + + // If cheats are disabled, remove checkboxes + if (!app.GetGameHostOption(eGameHostOption_CheatsEnabled)) + { + removeControl(&m_checkboxMobGriefing, true); + removeControl(&m_checkboxKeepInventory, true); + removeControl(&m_checkboxDoMobSpawning, true); + removeControl(&m_checkboxDoDaylightCycle, true); + } + + m_checkboxMobGriefing.init(app.GetString(IDS_MOB_GRIEFING), eControl_MobGriefing, app.GetGameHostOption(eGameHostOption_MobGriefing)); + m_checkboxKeepInventory.init(app.GetString(IDS_KEEP_INVENTORY), eControl_KeepInventory, app.GetGameHostOption(eGameHostOption_KeepInventory)); + m_checkboxDoMobSpawning.init(app.GetString(IDS_MOB_SPAWNING), eControl_DoMobSpawning, app.GetGameHostOption(eGameHostOption_DoMobSpawning)); + m_checkboxDoDaylightCycle.init(app.GetString(IDS_DAYLIGHT_CYCLE), eControl_DoDaylightCycle, app.GetGameHostOption(eGameHostOption_DoDaylightCycle)); + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); unsigned int privs = app.GetPlayerPrivileges(localPlayer->GetSmallId()); if(app.GetGameHostOption(eGameHostOption_CheatsEnabled) @@ -48,6 +66,33 @@ void UIScene_InGameHostOptionsMenu::updateTooltips() ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); } +void UIScene_InGameHostOptionsMenu::handleReload() +{ + UIScene::handleReload(); + + // If cheats are disabled, remove checkboxes + if (!app.GetGameHostOption(eGameHostOption_CheatsEnabled)) + { + removeControl(&m_checkboxMobGriefing, true); + removeControl(&m_checkboxKeepInventory, true); + removeControl(&m_checkboxDoMobSpawning, true); + removeControl(&m_checkboxDoDaylightCycle, true); + } + + 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) + { + } + else + { + removeControl(&m_buttonTeleportToPlayer, true); + removeControl(&m_buttonTeleportToMe, true); + } +} + 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"); @@ -59,8 +104,20 @@ void UIScene_InGameHostOptionsMenu::handleInput(int iPad, int key, bool repeat, 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()); + app.SetGameHostOption(hostOptions, eGameHostOption_FireSpreads, m_checkboxFireSpreads.IsChecked()); + app.SetGameHostOption(hostOptions, eGameHostOption_TNT, m_checkboxTNT.IsChecked()); + app.SetGameHostOption(hostOptions, eGameHostOption_DoMobLoot, m_checkboxDoMobLoot.IsChecked()); + app.SetGameHostOption(hostOptions, eGameHostOption_DoTileDrops, m_checkboxDoTileDrops.IsChecked()); + app.SetGameHostOption(hostOptions, eGameHostOption_NaturalRegeneration, m_checkboxNaturalRegeneration.IsChecked()); + + // If cheats are enabled, set cheat values + if (app.GetGameHostOption(eGameHostOption_CheatsEnabled)) + { + app.SetGameHostOption(hostOptions, eGameHostOption_MobGriefing, m_checkboxMobGriefing.IsChecked()); + app.SetGameHostOption(hostOptions, eGameHostOption_KeepInventory, m_checkboxKeepInventory.IsChecked()); + app.SetGameHostOption(hostOptions, eGameHostOption_DoMobSpawning, m_checkboxDoMobSpawning.IsChecked()); + app.SetGameHostOption(hostOptions, eGameHostOption_DoDaylightCycle, m_checkboxDoDaylightCycle.IsChecked()); + } // Send update settings packet to server if(hostOptions != app.GetGameHostOption(eGameHostOption_All) ) diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h index 24711412..b198974f 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h @@ -9,15 +9,29 @@ private: { eControl_FireSpreads, eControl_TNT, + eControl_MobGriefing, + eControl_KeepInventory, + eControl_DoMobSpawning, + eControl_DoMobLoot, + eControl_DoTileDrops, + eControl_NaturalRegeneration, + eControl_DoDaylightCycle, eControl_TeleportToPlayer, eControl_TeleportToMe, }; - UIControl_CheckBox m_checkboxFireSpreads, m_checkboxTNT; + UIControl_CheckBox m_checkboxFireSpreads, m_checkboxTNT, m_checkboxMobGriefing, m_checkboxKeepInventory, m_checkboxDoMobSpawning, m_checkboxDoMobLoot, m_checkboxDoTileDrops, m_checkboxNaturalRegeneration, m_checkboxDoDaylightCycle; 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_checkboxMobGriefing, "CheckboxMobGriefing") + UI_MAP_ELEMENT( m_checkboxKeepInventory, "CheckboxKeepInventory") + UI_MAP_ELEMENT( m_checkboxDoMobSpawning, "CheckboxMobSpawning") + UI_MAP_ELEMENT( m_checkboxDoMobLoot, "CheckboxMobLoot") + UI_MAP_ELEMENT( m_checkboxDoTileDrops, "CheckboxTileDrops") + UI_MAP_ELEMENT( m_checkboxNaturalRegeneration, "CheckboxNaturalRegeneration") + UI_MAP_ELEMENT( m_checkboxDoDaylightCycle, "CheckboxDayLightCycle") UI_MAP_ELEMENT( m_buttonTeleportToPlayer, "TeleportToPlayer") UI_MAP_ELEMENT( m_buttonTeleportToMe, "TeleportPlayerToMe") UI_END_MAP_ELEMENTS_AND_NAMES() @@ -27,6 +41,8 @@ public: virtual EUIScene getSceneType() { return eUIScene_InGameHostOptionsMenu;} virtual void updateTooltips(); + virtual void handleReload(); + protected: // TODO: This should be pure virtual in this class virtual wstring getMoviePath(); diff --git a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp index 5c3f73f6..57acf345 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp @@ -15,59 +15,20 @@ UIScene_InGameInfoMenu::UIScene_InGameInfoMenu(int iPad, void *initData, UILayer 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""; - } + m_players = vector(); 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(); - } + PlayerInfo *info = BuildPlayerInfo(player); - 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); + m_players.push_back(info); + m_playerList.addItem(info->m_name, info->m_colorState, info->m_voiceStatus); } } @@ -98,6 +59,12 @@ UIScene_InGameInfoMenu::UIScene_InGameInfoMenu(int iPad, void *initData, UILayer #endif } +UIScene_InGameInfoMenu::~UIScene_InGameInfoMenu() +{ + // Delete player infos + for (int i = 0; i < m_players.size(); i++) { delete m_players[i]; } +} + wstring UIScene_InGameInfoMenu::getMoviePath() { if(app.GetLocalPlayerCount() > 1) @@ -126,8 +93,7 @@ void UIScene_InGameInfoMenu::updateTooltips() if(CGameNetworkManager::usingAdhocMode()) keyX = -1; #endif - - INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ m_playerList.getCurrentSelection() ] ); + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId(m_players[m_playerList.getCurrentSelection()]->m_smallId); int keyA = -1; Minecraft *pMinecraft = Minecraft::GetInstance(); @@ -198,52 +164,20 @@ void UIScene_InGameInfoMenu::handleReload() { DWORD playerCount = g_NetworkManager.GetPlayerCount(); - m_playersCount = 0; + // Remove all player info + for (int i = 0; i < m_players.size(); i++) { delete m_players[i]; } + m_players.clear(); + 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; - } - } + PlayerInfo *info = BuildPlayerInfo(player); - 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); + m_players.push_back(info); + m_playerList.addItem(info->m_name, info->m_colorState, info->m_voiceStatus); } } @@ -270,63 +204,36 @@ void UIScene_InGameInfoMenu::tick() { UIScene::tick(); - for(DWORD i = 0; i < m_playersCount; ++i) + // Update players by index + for(DWORD i = 0; i < m_players.size(); ++i) { INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); - if( player != NULL ) + 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 ); - } + PlayerInfo *info = BuildPlayerInfo(player); - short icon = app.GetPlayerColour( m_players[i] ); + m_players[i]->m_smallId = info->m_smallId; - if(icon != m_playersColourState[i]) + if(info->m_voiceStatus != m_players[i]->m_voiceStatus) { - m_playersColourState[i] = icon; - m_playerList.setPlayerIcon( i, (int)app.GetPlayerColour( m_players[i] ) ); + m_players[i]->m_voiceStatus = info->m_voiceStatus; + m_playerList.setVOIPIcon(i, info->m_voiceStatus); } - - wstring playerName = L""; -#ifndef _CONTENT_PACKAGE - if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<m_colorState != m_players[i]->m_colorState) { - playerName = L"WWWWWWWWWWWWWWWW"; + m_players[i]->m_colorState = info->m_colorState; + m_playerList.setPlayerIcon(i, info->m_colorState); } - else -#endif - { - playerName = player->GetDisplayName(); - } - if(playerName.compare( m_playerNames[i] ) != 0 ) + + if(info->m_name.compare( m_players[i]->m_name ) != 0 ) { - m_playerList.setButtonLabel(i, playerName); - m_playerNames[i] = playerName; + m_playerList.setButtonLabel(i, info->m_name); + m_players[i]->m_name = info->m_name; } + + delete info; } } } @@ -357,7 +264,7 @@ void UIScene_InGameInfoMenu::handleInput(int iPad, int key, bool repeat, bool pr 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_InGameInfoMenu::MustSignInReturnedPSN,this); } else #endif @@ -373,9 +280,9 @@ void UIScene_InGameInfoMenu::handleInput(int iPad, int key, bool repeat, bool pr #else - if(pressed && m_playerList.hasFocus() && (m_playerList.getItemCount() > 0) && (m_playerList.getCurrentSelection() < m_playersCount) ) + if(pressed && m_playerList.hasFocus() && (m_playerList.getItemCount() > 0) && (m_playerList.getCurrentSelection() < m_players.size()) ) { - INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId(m_players[m_playerList.getCurrentSelection()]); + INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId(m_players[m_playerList.getCurrentSelection()]->m_smallId); if( player != NULL ) { PlayerUID uid = player->GetUID(); @@ -428,7 +335,7 @@ void UIScene_InGameInfoMenu::handlePress(F64 controlId, F64 childId) break; case eControl_GamePlayers: int currentSelection = (int)childId; - INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ currentSelection ] ); + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId(m_players[currentSelection]->m_smallId); Minecraft *pMinecraft = Minecraft::GetInstance(); shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; @@ -448,20 +355,20 @@ void UIScene_InGameInfoMenu::handlePress(F64 controlId, F64 childId) { InGamePlayerOptionsInitData *pInitData = new InGamePlayerOptionsInitData(); pInitData->iPad = m_iPad; - pInitData->networkSmallId = m_players[ currentSelection ]; - pInitData->playerPrivileges = app.GetPlayerPrivileges(m_players[ currentSelection ] ); + pInitData->networkSmallId = m_players[currentSelection]->m_smallId; + pInitData->playerPrivileges = app.GetPlayerPrivileges(m_players[currentSelection]->m_smallId); 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]; + *smallId = m_players[currentSelection]->m_smallId; 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); + ui.RequestAlertMessage(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&UIScene_InGameInfoMenu::KickPlayerReturned,smallId); } } break; @@ -480,71 +387,53 @@ void UIScene_InGameInfoMenu::handleFocusChange(F64 controlId, F64 childId) void UIScene_InGameInfoMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) { + app.DebugPrintf(" Player \"%ls\" %s (smallId: %d)\n", pPlayer->GetOnlineName(), leaving ? "leaving" : "joining", pPlayer->GetSmallId()); + UIScene_InGameInfoMenu *scene = (UIScene_InGameInfoMenu *)callbackParam; bool playerFound = false; int foundIndex = 0; - for(int i = 0; i < scene->m_playersCount; ++i) + for(int i = 0; i < scene->m_players.size(); ++i) { - if(!playerFound && scene->m_players[i] == pPlayer->GetSmallId() ) + if(!playerFound && scene->m_players[i]->m_smallId == pPlayer->GetSmallId() ) { if( scene->m_playerList.getCurrentSelection() == scene->m_playerList.getItemCount() - 1 ) { scene->m_playerList.setCurrentSelection( scene->m_playerList.getItemCount() - 2 ); } - // Player removed + + // Player found 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 (leaving && !playerFound) app.DebugPrintf(" Error: Player \"%ls\" leaving but not found in list\n", pPlayer->GetOnlineName()); + if (!leaving && playerFound) app.DebugPrintf(" Error: Player \"%ls\" joining but already in list\n", pPlayer->GetOnlineName()); - if( !playerFound ) + // If the player was found remove them (even if they're joining, they'll be added again later) + if(playerFound) { - // Player added - scene->m_players[scene->m_playersCount] = pPlayer->GetSmallId(); - ++scene->m_playersCount; + app.DebugPrintf(" Player \"%ls\" found, removing\n", pPlayer->GetOnlineName()); - wstring playerName = L""; -#ifndef _CONTENT_PACKAGE - if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); - } + // Remove player info + delete scene->m_players[foundIndex]; + scene->m_players.erase(scene->m_players.begin() + foundIndex); - 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; - } - } + // Remove player from list + scene->m_playerList.removeItem(foundIndex); + } - scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); + // If the player is joining + if(!leaving) + { + app.DebugPrintf(" Player \"%ls\" not found, adding\n", pPlayer->GetOnlineName()); + + PlayerInfo *info = scene->BuildPlayerInfo(pPlayer); + scene->m_players.push_back(info); + + // Note that the tick updates buttons every tick so it's only really important that we + // add the button (not the order or content) + scene->m_playerList.addItem(info->m_name, info->m_colorState, info->m_voiceStatus); } } @@ -566,6 +455,50 @@ int UIScene_InGameInfoMenu::KickPlayerReturned(void *pParam,int iPad,C4JStorage: return 0; } +UIScene_InGameInfoMenu::PlayerInfo *UIScene_InGameInfoMenu::BuildPlayerInfo(INetworkPlayer *player) +{ + PlayerInfo *info = new PlayerInfo(); + info->m_smallId = player->GetSmallId(); + + 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; + } + } + + info->m_voiceStatus = voiceStatus; + info->m_colorState = app.GetPlayerColour(info->m_smallId); + info->m_name = playerName; + + return info; +} + #if defined __PS3__ || defined __PSVITA__ int UIScene_InGameInfoMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) { @@ -596,10 +529,10 @@ int UIScene_InGameInfoMenu::ViewInvites_SignInReturned(void *pParam,bool bContin 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; + SQRNetworkManager_Vita::RecvInviteGUI(); #endif } } return 0; } -#endif +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h index 94966fa3..464c83a0 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h @@ -10,13 +10,22 @@ private: eControl_GameOptions, eControl_GamePlayers, }; + + typedef struct _PlayerInfo + { + byte m_smallId; + char m_voiceStatus; + short m_colorState; + wstring m_name; + + } PlayerInfo; 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]; + //int m_playersCount; + vector m_players; // A vector of player info structs + //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; @@ -28,6 +37,7 @@ private: UI_END_MAP_ELEMENTS_AND_NAMES() public: UIScene_InGameInfoMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_InGameInfoMenu(); virtual EUIScene getSceneType() { return eUIScene_InGameInfoMenu;} virtual void updateTooltips(); @@ -55,6 +65,8 @@ public: static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); private: + PlayerInfo *BuildPlayerInfo(INetworkPlayer *player); + #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); diff --git a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp index 6eb22b09..d7196849 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp @@ -232,6 +232,92 @@ void UIScene_InGamePlayerOptionsMenu::updateTooltips() ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); } +void UIScene_InGamePlayerOptionsMenu::handleReload() +{ + UIScene::handleReload(); + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + INetworkPlayer *editingPlayer = g_NetworkManager.GetPlayerBySmallId(m_networkSmallId); + + 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 ); + } + + if(m_editingSelf) + { +#if (defined(_CONTENT_PACKAGE) || defined(_FINAL_BUILD) && !defined(_DEBUG_MENUS_ENABLED)) + removeControl( &m_checkboxes[eControl_Op], true ); +#endif + + removeControl( &m_buttonKick, true ); + removeControl( &m_checkboxes[eControl_CheatTeleport], true ); + + if(cheats) + { + 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 + { + removeControl( &m_checkboxes[eControl_HostInvisible], true ); + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + } + } + else + { + if(!localPlayer->IsHost()) + { + removeControl( &m_checkboxes[eControl_Op], true ); + } + + if(localPlayer->IsHost() && cheats ) + { + + 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 + { + 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) + { + 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 ); +} + void UIScene_InGamePlayerOptionsMenu::tick() { UIScene::tick(); @@ -352,7 +438,7 @@ void UIScene_InGamePlayerOptionsMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&UIScene_InGamePlayerOptionsMenu::KickPlayerReturned,smallId); } break; }; diff --git a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h index 78e30f6e..e78b6748 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h @@ -62,6 +62,8 @@ public: virtual EUIScene getSceneType() { return eUIScene_InGamePlayerOptionsMenu;} virtual void updateTooltips(); + virtual void handleReload(); + protected: // TODO: This should be pure virtual in this class virtual wstring getMoviePath(); diff --git a/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp index b0dbc59f..fa2c7e61 100644 --- a/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp @@ -442,7 +442,7 @@ void UIScene_InGameSaveManagementMenu::handlePress(F64 controlId, F64 childId) 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.RequestErrorMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,m_iPad,&UIScene_InGameSaveManagementMenu::DeleteSaveDialogReturned,this); ui.PlayUISFX(eSFX_Press); break; diff --git a/Minecraft.Client/Common/UI/UIScene_Intro.cpp b/Minecraft.Client/Common/UI/UIScene_Intro.cpp index 2c50612f..7fc435b2 100644 --- a/Minecraft.Client/Common/UI/UIScene_Intro.cpp +++ b/Minecraft.Client/Common/UI/UIScene_Intro.cpp @@ -11,12 +11,16 @@ UIScene_Intro::UIScene_Intro(int iPad, void *initData, UILayer *parentLayer) : U m_bAnimationEnded = false; bool bSkipESRB = false; + bool bChina = false; #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) bSkipESRB = app.GetProductSKU() != e_sku_SCEA; #elif defined(_XBOX) || defined(_DURANGO) bSkipESRB = !ProfileManager.LocaleIsUSorCanada(); #endif +#ifdef _DURANGO + bChina = ProfileManager.LocaleIsChina(); +#endif // 4J Stu - These map to values in the Actionscript #ifdef _WINDOWS64 int platformIdx = 0; @@ -33,13 +37,17 @@ UIScene_Intro::UIScene_Intro(int iPad, void *initData, UILayer *parentLayer) : U #endif IggyDataValue result; - IggyDataValue value[2]; + IggyDataValue value[3]; 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 ); + value[1].boolval = bChina?true:bSkipESRB; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = bChina; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetIntroPlatform , 3 , value ); #ifdef __PSVITA__ // initialise vita touch controls with ids diff --git a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp index cad86dce..c036f7bf 100644 --- a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp @@ -140,6 +140,10 @@ void UIScene_JoinMenu::tick() { m_labelValues[eLabel_GameType].init( app.GetString(IDS_CREATIVE) ); } + else if(option == GameType::ADVENTURE->getId()) + { + m_labelValues[eLabel_GameType].init( app.GetString(IDS_ADVENTURE) ); + } else { m_labelValues[eLabel_GameType].init( app.GetString(IDS_SURVIVAL) ); @@ -209,9 +213,9 @@ void UIScene_JoinMenu::tick() 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()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_DISCONNECTED_SERVER_QUIT, uiIDA,1,m_iPad,ErrorDialogReturned,this); #else - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA,1,m_iPad,ErrorDialogReturned,this, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA,1,m_iPad,ErrorDialogReturned,this); #endif } @@ -307,7 +311,7 @@ void UIScene_JoinMenu::handlePress(F64 controlId, F64 childId) ui.PlayUISFX(eSFX_Press); #ifdef _DURANGO - ProfileManager.CheckMultiplayerPrivileges(m_iPad, true, &checkPrivilegeCallback, this); + ProfileManager.CheckMultiplayerPrivileges(m_iPad, true, &checkPrivilegeCallback, (LPVOID)GetCallbackUniqueId()); #else StartSharedLaunchFlow(); #endif @@ -331,15 +335,18 @@ void UIScene_JoinMenu::handleFocusChange(F64 controlId, F64 childId) #ifdef _DURANGO void UIScene_JoinMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad) { - UIScene_JoinMenu* pClass = (UIScene_JoinMenu*)lpParam; + UIScene_JoinMenu* pClass = (UIScene_JoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); - if(hasPrivilege) - { - pClass->StartSharedLaunchFlow(); -} - else + if(pClass) { - pClass->m_bIgnoreInput = false; + if(hasPrivilege) + { + pClass->StartSharedLaunchFlow(); + } + else + { + pClass->m_bIgnoreInput = false; + } } } #endif @@ -355,7 +362,7 @@ void UIScene_JoinMenu::StartSharedLaunchFlow() //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.lpParam = (LPVOID)GetCallbackUniqueId(); info.requireOnline = true; ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); } @@ -363,24 +370,27 @@ void UIScene_JoinMenu::StartSharedLaunchFlow() int UIScene_JoinMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) { - UIScene_JoinMenu* pClass = (UIScene_JoinMenu*)pParam; + UIScene_JoinMenu* pClass = (UIScene_JoinMenu*)ui.GetSceneFromCallbackId((size_t)pParam); - if(bContinue==true) + if(pClass) { - // It's possible that the player has not signed in - they can back out - if(ProfileManager.IsSignedIn(iPad)) + if(bContinue==true) { - JoinGame(pClass); + // 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; } } - else - { - pClass->m_bIgnoreInput=false; - } return 0; } @@ -442,7 +452,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else #endif @@ -450,7 +460,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) 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()); + ui.RequestErrorMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } return; } @@ -495,7 +505,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) 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()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { @@ -530,7 +540,7 @@ void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); exitReasonStringId = -1; ui.NavigateToHomeMenu(); diff --git a/Minecraft.Client/Common/UI/UIScene_LanguageSelector.cpp b/Minecraft.Client/Common/UI/UIScene_LanguageSelector.cpp new file mode 100644 index 00000000..e9dc7eb9 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LanguageSelector.cpp @@ -0,0 +1,129 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LanguageSelector.h" + +// strings for buttons in the list +const unsigned int UIScene_LanguageSelector::m_uiHTPButtonNameA[]= +{ + HAS_LANGUAGE_SYSTEM(IDS_LANG_SYSTEM) + HAS_LANGUAGE_EN_US(IDS_LANG_ENGLISH) + HAS_LANGUAGE_DE_DE(IDS_LANG_GERMAN) + HAS_LANGUAGE_ES_ES(IDS_LANG_SPANISH_SPAIN) + HAS_LANGUAGE_ES_MX(IDS_LANG_SPANISH_LATIN_AMERICA) + HAS_LANGUAGE_FR_FR(IDS_LANG_FRENCH) + HAS_LANGUAGE_IT_IT(IDS_LANG_ITALIAN) + HAS_LANGUAGE_PT_PT(IDS_LANG_PORTUGUESE_PORTUGAL) + HAS_LANGUAGE_PT_BR(IDS_LANG_PORTUGUESE_BRAZIL) + HAS_LANGUAGE_JA_JP(IDS_LANG_JAPANESE) + HAS_LANGUAGE_KO_KR(IDS_LANG_KOREAN) + HAS_LANGUAGE_CN_TW(IDS_LANG_CHINESE_TRADITIONAL) + HAS_LANGUAGE_CN_CN(IDS_LANG_CHINESE_SIMPLIFIED) + HAS_LANGUAGE_DA_DK(IDS_LANG_DANISH) + HAS_LANGUAGE_FI_FI(IDS_LANG_FINISH) + HAS_LANGUAGE_NL_NL(IDS_LANG_DUTCH) + HAS_LANGUAGE_PL_PL(IDS_LANG_POLISH) + HAS_LANGUAGE_RU_RU(IDS_LANG_RUSSIAN) + HAS_LANGUAGE_SV_SE(IDS_LANG_SWEDISH) + HAS_LANGUAGE_NB_NO(IDS_LANG_NORWEGIAN) + HAS_LANGUAGE_SK_SK(IDS_LANG_SLOVAK) + HAS_LANGUAGE_CZ_CZ(IDS_LANG_CZECH) + HAS_LANGUAGE_EL_GR(IDS_LANG_GREEK) + HAS_LANGUAGE_TR_TR(IDS_LANG_TURKISH) +}; + + +UIScene_LanguageSelector::UIScene_LanguageSelector(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 < eLanguageSelector_MAX; ++i) + { + m_buttonListHowTo.addItem( m_uiHTPButtonNameA[i] , i); + } +} + +wstring UIScene_LanguageSelector::getMoviePath() +{ + if (app.GetLocalPlayerCount() > 1) return L"LanguagesMenuSplit"; + else return L"LanguagesMenu"; +} + +void UIScene_LanguageSelector::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK); +} + +void UIScene_LanguageSelector::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_LanguageSelector::handleReload() +{ + for (unsigned int i = 0; i < eLanguageSelector_MAX; ++i) + { + m_buttonListHowTo.addItem( m_uiHTPButtonNameA[i], i); + } +} + +void UIScene_LanguageSelector::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(); + //ui.NavigateToScene(m_iPad, eUIScene_SettingsOptionsMenu); + } + 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_LanguageSelector::handlePress(F64 controlId, F64 childId) +{ + if( (int)controlId == eControl_Buttons ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + int newLanguage, newLocale; + newLanguage = uiLangMap[(int)childId]; + newLocale = uiLocaleMap[(int)childId]; + + app.SetMinecraftLanguage(m_iPad, newLanguage); + app.SetMinecraftLocale(m_iPad, newLocale); + + app.CheckGameSettingsChanged(true, m_iPad); + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_LanguageSelector.h b/Minecraft.Client/Common/UI/UIScene_LanguageSelector.h new file mode 100644 index 00000000..b5c3d4c6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LanguageSelector.h @@ -0,0 +1,165 @@ +#pragma once + +#include "UIScene.h" + +#define HAS_LANGUAGE_SYSTEM(exp) exp, + +#define HAS_LANGUAGE_EN_US(exp) exp, +#define HAS_LANGUAGE_DE_DE(exp) exp, +#define HAS_LANGUAGE_ES_ES(exp) exp, +#define HAS_LANGUAGE_ES_MX(exp) exp, +#define HAS_LANGUAGE_FR_FR(exp) exp, +#define HAS_LANGUAGE_IT_IT(exp) exp, +#define HAS_LANGUAGE_PT_PT(exp) exp, +#define HAS_LANGUAGE_PT_BR(exp) exp, +#define HAS_LANGUAGE_JA_JP(exp) exp, +#define HAS_LANGUAGE_KO_KR(exp) exp, +#define HAS_LANGUAGE_CN_TW(exp) exp, + +#ifdef _DURANGO +#define HAS_LANGUAGE_CN_CN(exp) exp, +#define HAS_LANGUAGE_SK_SK(exp) exp, +#define HAS_LANGUAGE_CZ_CZ(exp) exp, +#else +#define HAS_LANGUAGE_CN_CN(exp) +#define HAS_LANGUAGE_SK_SK(exp) +#define HAS_LANGUAGE_CZ_CZ(exp) +#endif + +#define HAS_LANGUAGE_DA_DK(exp) exp, +#define HAS_LANGUAGE_FI_FI(exp) exp, +#define HAS_LANGUAGE_NL_NL(exp) exp, +#define HAS_LANGUAGE_PL_PL(exp) exp, +#define HAS_LANGUAGE_RU_RU(exp) exp, +#define HAS_LANGUAGE_SV_SE(exp) exp, +#define HAS_LANGUAGE_NB_NO(exp) exp, +#define HAS_LANGUAGE_EL_GR(exp) exp, + +#if defined(__ORBIS__) || defined(__PS3__) || defined(__PSVITA__) +#define HAS_LANGUAGE_TR_TR(exp) exp, +#else +#define HAS_LANGUAGE_TR_TR(exp) +#endif + +class UIScene_LanguageSelector : public UIScene +{ +public: + enum ELangButtons + { + eLanguageSelector_LabelNone = -1, + HAS_LANGUAGE_SYSTEM(eLanguageSelector_system) + HAS_LANGUAGE_EN_US(eLanguageSelector_EN_US) + HAS_LANGUAGE_DE_DE(eLanguageSelector_DE_DE) + HAS_LANGUAGE_ES_ES(eLanguageSelector_ES_ES) + HAS_LANGUAGE_ES_MX(eLanguageSelector_ES_MX) + HAS_LANGUAGE_FR_FR(eLanguageSelector_FR_FR) + HAS_LANGUAGE_IT_IT(eLanguageSelector_IT_IT) + HAS_LANGUAGE_PT_PT(eLanguageSelector_PT_PT) + HAS_LANGUAGE_PT_BR(eLanguageSelector_PT_BR) + HAS_LANGUAGE_JA_JP(eLanguageSelector_JA_JP) + HAS_LANGUAGE_KO_KR(eLanguageSelector_KO_KR) + HAS_LANGUAGE_CN_TW(eLanguageSelector_CN_TW) + HAS_LANGUAGE_CN_CN(eLanguageSelector_CN_CN) + HAS_LANGUAGE_DA_DK(eLanguageSelector_DA_DK) + HAS_LANGUAGE_FI_FI(eLanguageSelector_FI_FI) + HAS_LANGUAGE_NL_NL(eLanguageSelector_NL_NL) + HAS_LANGUAGE_PL_PL(eLanguageSelector_PL_PL) + HAS_LANGUAGE_RU_RU(eLanguageSelector_RU_RU) + HAS_LANGUAGE_SV_SE(eLanguageSelector_SV_SE) + HAS_LANGUAGE_NB_NO(eLanguageSelector_NB_NO) + HAS_LANGUAGE_SK_SK(eLanguageSelector_SK_SK) + HAS_LANGUAGE_CZ_CZ(eLanguageSelector_CZ_CZ) + HAS_LANGUAGE_EL_GR(eLanguageSelector_EL_GR) + HAS_LANGUAGE_TR_TR(eLanguageSelector_TR_TR) + eLanguageSelector_MAX + }; + +private: + enum EControls + { + eControl_Buttons, + }; + + static const unsigned int m_uiHTPButtonNameA[eLanguageSelector_MAX]; + + UIControl_DynamicButtonList m_buttonListHowTo; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListHowTo, "HowToList") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_LanguageSelector(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_LanguageSelector; } + + 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); +}; + +const int uiLangMap[UIScene_LanguageSelector::eLanguageSelector_MAX] = +{ + HAS_LANGUAGE_SYSTEM(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_EN_US(XC_LANGUAGE_ENGLISH) + HAS_LANGUAGE_DE_DE(XC_LANGUAGE_GERMAN) + HAS_LANGUAGE_ES_ES(XC_LANGUAGE_SPANISH) + HAS_LANGUAGE_ES_MX(XC_LANGUAGE_SPANISH) + HAS_LANGUAGE_FR_FR(XC_LANGUAGE_FRENCH) + HAS_LANGUAGE_IT_IT(XC_LANGUAGE_ITALIAN) + HAS_LANGUAGE_PT_PT(XC_LANGUAGE_PORTUGUESE) + HAS_LANGUAGE_PT_BR(XC_LANGUAGE_PORTUGUESE) + HAS_LANGUAGE_JA_JP(XC_LANGUAGE_JAPANESE) + HAS_LANGUAGE_KO_KR(XC_LANGUAGE_KOREAN) + HAS_LANGUAGE_CN_TW(XC_LANGUAGE_TCHINESE) + HAS_LANGUAGE_CN_CN(XC_LANGUAGE_SCHINESE) + HAS_LANGUAGE_DA_DK(XC_LANGUAGE_DANISH) + HAS_LANGUAGE_FI_FI(XC_LANGUAGE_FINISH) + HAS_LANGUAGE_NL_NL(XC_LANGUAGE_DUTCH) + HAS_LANGUAGE_PL_PL(XC_LANGUAGE_POLISH) + HAS_LANGUAGE_RU_RU(XC_LANGUAGE_RUSSIAN) + HAS_LANGUAGE_SV_SE(XC_LANGUAGE_SWEDISH) + HAS_LANGUAGE_NB_NO(XC_LANGUAGE_BNORWEGIAN) + HAS_LANGUAGE_SK_SK(XC_LANGUAGE_SLOVAK) + HAS_LANGUAGE_CZ_CZ(XC_LANGUAGE_CZECH) + HAS_LANGUAGE_EL_GR(XC_LANGUAGE_GREEK) + HAS_LANGUAGE_TR_TR(XC_LANGUAGE_TURKISH) +}; + +const int uiLocaleMap[UIScene_LanguageSelector::eLanguageSelector_MAX] = +{ + HAS_LANGUAGE_SYSTEM(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_EN_US(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_DE_DE(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_ES_ES(XC_LOCALE_SPAIN) + HAS_LANGUAGE_ES_MX(XC_LOCALE_LATIN_AMERICA) + HAS_LANGUAGE_FR_FR(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_IT_IT(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_PT_PT(XC_LOCALE_PORTUGAL) + HAS_LANGUAGE_PT_BR(XC_LOCALE_BRAZIL) + HAS_LANGUAGE_JA_JP(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_KO_KR(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_CN_TW(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_CN_CN(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_DA_DK(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_FI_FI(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_NL_NL(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_PL_PL(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_RU_RU(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_SV_SE(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_NB_NO(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_SK_SK(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_CZ_CZ(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_EL_GR(MINECRAFT_LANGUAGE_DEFAULT) + HAS_LANGUAGE_TR_TR(MINECRAFT_LANGUAGE_DEFAULT) +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp index 6d472b50..d6f89832 100644 --- a/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp @@ -25,10 +25,28 @@ UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *ini m_labelWorldOptions.init(app.GetString(IDS_WORLD_OPTIONS)); IggyDataValue result; + +#ifdef _LARGE_WORLDS + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_params->bGenerateOptions ? 0 : 1; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = false; + if(m_params->currentWorldSize == e_worldSize_Classic || + m_params->currentWorldSize == e_worldSize_Small || + m_params->currentWorldSize == e_worldSize_Medium ) + { + // don't show the increase world size stuff if we're already large, or the size is unknown. + value[1].boolval = true; + } + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetMenuType , 2 , value ); +#else IggyDataValue value[1]; value[0].type = IGGY_DATATYPE_number; - value[0].number = m_params->bGenerateOptions?0:1; + value[0].number = m_params->bGenerateOptions ? 0 : 1; IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetMenuType , 1 , value ); +#endif m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_params->iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); @@ -54,11 +72,15 @@ UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *ini } else if(!m_params->bOnlineGame) { - m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(false); m_checkboxes[eLaunchCheckbox_AllowFoF].SetEnable(false); } + // Init cheats + m_bUpdateCheats = false; + // Update cheat checkboxes + UpdateCheats(); + 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); @@ -72,19 +94,35 @@ UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *ini 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) - { + m_checkboxes[eLaunchCheckbox_KeepInventory].init(app.GetString(IDS_KEEP_INVENTORY), eLaunchCheckbox_KeepInventory, m_params->bKeepInventory); + m_checkboxes[eLaunchCheckbox_MobSpawning].init(app.GetString(IDS_MOB_SPAWNING), eLaunchCheckbox_MobSpawning, m_params->bDoMobSpawning); + m_checkboxes[eLaunchCheckbox_MobLoot].init(app.GetString(IDS_MOB_LOOT), eLaunchCheckbox_MobLoot, m_params->bDoMobLoot); + m_checkboxes[eLaunchCheckbox_MobGriefing].init(app.GetString(IDS_MOB_GRIEFING), eLaunchCheckbox_MobGriefing, m_params->bMobGriefing); + m_checkboxes[eLaunchCheckbox_TileDrops].init(app.GetString(IDS_TILE_DROPS), eLaunchCheckbox_TileDrops, m_params->bDoTileDrops); + m_checkboxes[eLaunchCheckbox_NaturalRegeneration].init(app.GetString(IDS_NATURAL_REGEN), eLaunchCheckbox_NaturalRegeneration, m_params->bNaturalRegeneration); + m_checkboxes[eLaunchCheckbox_DayLightCycle].init(app.GetString(IDS_DAYLIGHT_CYCLE), eLaunchCheckbox_DayLightCycle, m_params->bDoDaylightCycle); + + 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); + #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 + 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 ); + + if(m_params->currentWorldSize != e_worldSize_Unknown) + { + m_labelWorldResize.init(app.GetString(IDS_INCREASE_WORLD_SIZE)); + int min= int(m_params->currentWorldSize)-1; + int max=3; + int curr = int(m_params->newWorldSize)-1; + m_sliderWorldResize.init(app.GetString(m_iWorldSizeTitleA[curr]),eControl_WorldResize,min,max,curr); + m_checkboxes[eLaunchCheckbox_WorldResizeType].init(app.GetString(IDS_INCREASE_WORLD_SIZE_OVERWRITE_EDGES),eLaunchCheckbox_WorldResizeType,m_params->newWorldSizeOverwriteEdges); } +#endif // Only the Xbox 360 needs a reset nether // 4J-PB - PS3 needs it now @@ -92,6 +130,8 @@ UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *ini // if(!m_params->bGenerateOptions) removeControl( &m_checkboxes[eLaunchCheckbox_ResetNether], false ); // #endif + m_tabIndex = m_params->bGenerateOptions ? TAB_WORLD_OPTIONS : TAB_GAME_OPTIONS; + // set the default text #ifdef _LARGE_WORLDS wstring wsText=L""; @@ -114,36 +154,37 @@ UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *ini wchar_t startTags[64]; swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); wsText= startTags + wsText; - m_labelDescription.init(wsText); + if (m_tabIndex == TAB_WORLD_OPTIONS) + m_labelDescription_WorldOptions.setLabel(wsText); + else + m_labelDescription_GameOptions.setLabel(wsText); addTimer(GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME); #ifdef __PSVITA__ + // initialise vita tab controls with ids + m_TouchTabWorld.init(ETouchInput_TabWorld); + m_TouchTabGame.init(ETouchInput_TabGame); + 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 == TAB_GAME_OPTIONS) { - // Set tooltip for change tab (only two tabs) - if (m_tabIndex == 0) - { - changeTabTooltip = IDS_GAME_OPTIONS; - } - else - { - changeTabTooltip = IDS_WORLD_OPTIONS; - } + changeTabTooltip = IDS_WORLD_OPTIONS; + } + else + { + changeTabTooltip = IDS_GAME_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; @@ -154,11 +195,11 @@ void UIScene_LaunchMoreOptionsMenu::updateTooltips() void UIScene_LaunchMoreOptionsMenu::updateComponents() { m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); -#ifdef _LARGE_WORLDS - m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); -#else +//#ifdef _LARGE_WORLDS +// m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +//#else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); -#endif +//#endif } wstring UIScene_LaunchMoreOptionsMenu::getMoviePath() @@ -186,6 +227,19 @@ void UIScene_LaunchMoreOptionsMenu::tick() m_bMultiplayerAllowed = bMultiplayerAllowed; } + + // Check cheats + if (m_bUpdateCheats) + { + UpdateCheats(); + m_bUpdateCheats = false; + } + // check online + if(m_bUpdateOnline) + { + UpdateOnline(); + m_bUpdateOnline = false; + } } void UIScene_LaunchMoreOptionsMenu::handleDestroy() @@ -227,7 +281,7 @@ void UIScene_LaunchMoreOptionsMenu::handleInput(int iPad, int key, bool repeat, 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } } #endif @@ -245,7 +299,7 @@ void UIScene_LaunchMoreOptionsMenu::handleInput(int iPad, int key, bool repeat, break; case ACTION_MENU_LEFT_SCROLL: case ACTION_MENU_RIGHT_SCROLL: - if(pressed && m_loadedResolution == eSceneResolution_1080) + if(pressed) { // Toggle tab index m_tabIndex = m_tabIndex == 0 ? 1 : 0; @@ -257,6 +311,39 @@ void UIScene_LaunchMoreOptionsMenu::handleInput(int iPad, int key, bool repeat, } } +#ifdef __PSVITA__ +void UIScene_LaunchMoreOptionsMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + if(bPressed) + { + switch(iId) + { + case ETouchInput_TabWorld: + case ETouchInput_TabGame: + // Toggle tab index + int iNewTabIndex = (iId == ETouchInput_TabWorld) ? 0 : 1; + if(m_tabIndex != iNewTabIndex) + { + m_tabIndex = iNewTabIndex; + updateTooltips(); + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcChangeTab , 0 , NULL ); + } + ui.TouchBoxRebuild(this); + break; + } + } +} + +UIControl* UIScene_LaunchMoreOptionsMenu::GetMainPanel() +{ + if(m_tabIndex == 0) + return &m_worldOptions; + else + return &m_gameOptions; +} +#endif + void UIScene_LaunchMoreOptionsMenu::handleCheckboxToggled(F64 controlId, bool selected) { //CD - Added for audio @@ -266,6 +353,7 @@ void UIScene_LaunchMoreOptionsMenu::handleCheckboxToggled(F64 controlId, bool se { case eLaunchCheckbox_Online: m_params->bOnlineGame = selected; + m_bUpdateOnline = true; break; case eLaunchCheckbox_InviteOnly: m_params->bInviteOnly = selected; @@ -287,6 +375,7 @@ void UIScene_LaunchMoreOptionsMenu::handleCheckboxToggled(F64 controlId, bool se break; case eLaunchCheckbox_HostPrivileges: m_params->bHostPrivileges = selected; + m_bUpdateCheats = true; break; case eLaunchCheckbox_ResetNether: m_params->bResetNether = selected; @@ -300,9 +389,34 @@ void UIScene_LaunchMoreOptionsMenu::handleCheckboxToggled(F64 controlId, bool se case eLaunchCheckbox_BonusChest: m_params->bBonusChest = selected; break; +#ifdef _LARGE_WORLDS case eLaunchCheckbox_DisableSaving: m_params->bDisableSaving = selected; break; + case eLaunchCheckbox_WorldResizeType: + m_params->newWorldSizeOverwriteEdges = selected; + break; +#endif + case eLaunchCheckbox_KeepInventory: + m_params->bKeepInventory = selected; + break; + case eLaunchCheckbox_MobSpawning: + m_params->bDoMobSpawning = selected; + break; + case eLaunchCheckbox_MobLoot: + m_params->bDoMobLoot = selected; + case eLaunchCheckbox_MobGriefing: + m_params->bMobGriefing = selected; + break; + case eLaunchCheckbox_TileDrops: + m_params->bDoTileDrops = selected; + break; + case eLaunchCheckbox_NaturalRegeneration: + m_params->bNaturalRegeneration = selected; + break; + case eLaunchCheckbox_DayLightCycle: + m_params->bDoDaylightCycle = selected; + break; }; } @@ -347,16 +461,43 @@ void UIScene_LaunchMoreOptionsMenu::handleFocusChange(F64 controlId, F64 childId case eLaunchCheckbox_BonusChest: stringId = IDS_GAMEOPTION_BONUS_CHEST; break; -#ifdef _LARGE_WORLDS + case eLaunchCheckbox_KeepInventory: + stringId = IDS_GAMEOPTION_KEEP_INVENTORY; + break; + case eLaunchCheckbox_MobSpawning: + stringId = IDS_GAMEOPTION_MOB_SPAWNING; + break; + case eLaunchCheckbox_MobLoot: + stringId = IDS_GAMEOPTION_MOB_LOOT; // PLACEHOLDER + break; + case eLaunchCheckbox_MobGriefing: + stringId = IDS_GAMEOPTION_MOB_GRIEFING; // PLACEHOLDER + break; + case eLaunchCheckbox_TileDrops: + stringId = IDS_GAMEOPTION_TILE_DROPS; + break; + case eLaunchCheckbox_NaturalRegeneration: + stringId = IDS_GAMEOPTION_NATURAL_REGEN; + break; + case eLaunchCheckbox_DayLightCycle: + stringId = IDS_GAMEOPTION_DAYLIGHT_CYCLE; + break; case eControl_EditSeed: stringId = IDS_GAMEOPTION_SEED; break; +#ifdef _LARGE_WORLDS case eControl_WorldSize: stringId = IDS_GAMEOPTION_WORLD_SIZE; break; + case eControl_WorldResize: + stringId = IDS_GAMEOPTION_INCREASE_WORLD_SIZE; + break; case eLaunchCheckbox_DisableSaving: stringId = IDS_GAMEOPTION_DISABLE_SAVING; break; + case eLaunchCheckbox_WorldResizeType: + stringId = IDS_GAMEOPTION_INCREASE_WORLD_SIZE_OVERWRITE_EDGES; + break; #endif }; @@ -368,9 +509,12 @@ void UIScene_LaunchMoreOptionsMenu::handleFocusChange(F64 controlId, F64 childId } wchar_t startTags[64]; swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); - wsText= startTags + wsText; + wsText = startTags + wsText; - m_labelDescription.setLabel(wsText); + if (m_tabIndex == TAB_WORLD_OPTIONS) + m_labelDescription_WorldOptions.setLabel(wsText); + else + m_labelDescription_GameOptions.setLabel(wsText); } void UIScene_LaunchMoreOptionsMenu::handleTimerComplete(int id) @@ -405,8 +549,14 @@ int UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback(LPVOID lpParam,b // 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_params->seed = (wchar_t *)pchText; @@ -456,7 +606,50 @@ void UIScene_LaunchMoreOptionsMenu::handleSliderMove(F64 sliderId, F64 currentVa m_sliderWorldSize.handleSliderMove(value); m_params->worldSize = value; m_sliderWorldSize.setLabel(app.GetString(m_iWorldSizeTitleA[value])); +#endif + break; + case eControl_WorldResize: +#ifdef _LARGE_WORLDS + EGameHostOptionWorldSize changedSize = EGameHostOptionWorldSize(value+1); + if(changedSize >= m_params->currentWorldSize) + { + m_sliderWorldResize.handleSliderMove(value); + m_params->newWorldSize = EGameHostOptionWorldSize(value+1); + m_sliderWorldResize.setLabel(app.GetString(m_iWorldSizeTitleA[value])); + } #endif break; } } + +void UIScene_LaunchMoreOptionsMenu::UpdateCheats() +{ + bool cheatsOn = m_params->bHostPrivileges; + + m_checkboxes[eLaunchCheckbox_KeepInventory].SetEnable(cheatsOn); + m_checkboxes[eLaunchCheckbox_MobSpawning].SetEnable(cheatsOn); + m_checkboxes[eLaunchCheckbox_MobGriefing].SetEnable(cheatsOn); + m_checkboxes[eLaunchCheckbox_DayLightCycle].SetEnable(cheatsOn); + + if (!cheatsOn) + { + // Set defaults + m_params->bMobGriefing = true; + m_params->bKeepInventory = false; + m_params->bDoMobSpawning = true; + m_params->bDoDaylightCycle = true; + + m_checkboxes[eLaunchCheckbox_KeepInventory].setChecked(m_params->bKeepInventory); + m_checkboxes[eLaunchCheckbox_MobSpawning].setChecked(m_params->bDoMobSpawning); + m_checkboxes[eLaunchCheckbox_MobGriefing].setChecked(m_params->bMobGriefing); + m_checkboxes[eLaunchCheckbox_DayLightCycle].setChecked(m_params->bDoDaylightCycle); + } +} + +void UIScene_LaunchMoreOptionsMenu::UpdateOnline() +{ + bool bOnline = m_params->bOnlineGame; + + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(bOnline); + m_checkboxes[eLaunchCheckbox_AllowFoF].SetEnable(bOnline); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h index 62d75115..367db10d 100644 --- a/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h @@ -5,6 +5,9 @@ class UIScene_LaunchMoreOptionsMenu : public UIScene { private: + static const int TAB_WORLD_OPTIONS = 0; + static const int TAB_GAME_OPTIONS = 1; + enum EControls { // Add all checkboxes at the start as they also index into a checkboxes array @@ -21,81 +24,106 @@ private: eLaunchCheckbox_FlatWorld, eLaunchCheckbox_BonusChest, eLaunchCheckbox_DisableSaving, + eLaunchCheckbox_WorldResizeType, + eLaunchCheckbox_KeepInventory, + eLaunchCheckbox_MobSpawning, + eLaunchCheckbox_MobLoot, + eLaunchCheckbox_MobGriefing, + eLaunchCheckbox_TileDrops, + eLaunchCheckbox_NaturalRegeneration, + eLaunchCheckbox_DayLightCycle, eLaunchCheckboxes_Count, eControl_EditSeed, eControl_WorldSize, + eControl_WorldResize, + + eControl_Count }; +#ifdef __PSVITA__ + enum ETouchInput + { + ETouchInput_TabWorld = eControl_Count, + ETouchInput_TabGame, + + ETouchInput_Count + }; + UIControl_Touch m_TouchTabWorld, m_TouchTabGame; + UIControl m_controlWorldPanel, m_controlGamePanel; +#endif 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_HTMLLabel m_labelDescription_GameOptions, m_labelDescription_WorldOptions; + UIControl_Label m_labelSeed, m_labelRandomSeed, m_labelWorldSize, m_labelWorldResize; UIControl_TextInput m_editSeed; UIControl_Slider m_sliderWorldSize; - IggyName m_funcSetMenuType, m_funcChangeTab; + UIControl_Slider m_sliderWorldResize; + IggyName m_funcSetMenuType, m_funcChangeTab, m_funcSetDescription; 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_labelGameOptions, "LabelGame") + UI_MAP_ELEMENT( m_labelWorldOptions, "LabelWorld") + + UI_MAP_ELEMENT( m_gameOptions, "GameOptions") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_gameOptions) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchTabGame, "TouchTabGame" ) +#endif + UI_MAP_ELEMENT( m_labelDescription_GameOptions, "Description_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_DayLightCycle], "CheckboxDayLightCycle") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_KeepInventory], "CheckboxKeepInventory") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_MobSpawning], "CheckboxMobSpawning") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_MobGriefing], "CheckboxMobGriefing") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_MobLoot], "CheckboxMobLoot") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_TileDrops], "CheckboxTileDrops") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_NaturalRegeneration], "CheckboxNaturalRegeneration") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT(m_worldOptions, "WorldOptions") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_worldOptions) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchTabWorld, "TouchTabWorld" ) +#endif + UI_MAP_ELEMENT( m_labelDescription_WorldOptions, "Description_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_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_checkboxes[eLaunchCheckbox_FlatWorld], "CheckboxFlatWorld") + + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_ResetNether], "CheckboxResetNether") + + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_DisableSaving], "CheckboxDisableSaving") + 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_labelDescription, "Description") + UI_MAP_ELEMENT( m_labelWorldResize, "ResizeLabel") + UI_MAP_ELEMENT( m_sliderWorldResize, "ChangeWorldSizeSlider") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_WorldResizeType], "CheckboxResizeType") + UI_END_MAP_CHILD_ELEMENTS() + UI_MAP_NAME( m_funcChangeTab, L"ChangeTab") 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; + int m_tabIndex; public: UIScene_LaunchMoreOptionsMenu(int iPad, void *initData, UILayer *parentLayer); @@ -122,4 +150,16 @@ public: protected: void handleCheckboxToggled(F64 controlId, bool selected); + +private: + bool m_bUpdateCheats; // If true, update cheats on next tick + void UpdateCheats(); + + bool m_bUpdateOnline; // If true, update online settings on next tick + void UpdateOnline(); + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); + virtual UIControl* GetMainPanel(); +#endif //__PSVITA__ }; diff --git a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp index 80db57f8..12b21905 100644 --- a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp @@ -12,8 +12,8 @@ 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 }, + { Tile::dirt_Id, Tile::cobblestone_Id, Tile::sand_Id, Tile::stone_Id, Tile::gravel_Id, Tile::clay_Id, Tile::obsidian_Id }, + { Item::egg_Id, Item::wheat_Id, Tile::mushroom_brown_Id, Tile::reeds_Id, Item::bucket_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] = { @@ -43,7 +43,8 @@ const UIScene_LeaderboardsMenu::LeaderboardDescriptor UIScene_LeaderboardsMenu:: }, }; -UIScene_LeaderboardsMenu::UIScene_LeaderboardsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +UIScene_LeaderboardsMenu::UIScene_LeaderboardsMenu(int iPad, void *initData, UILayer *parentLayer) + : UIScene(iPad, parentLayer), m_interface(LeaderboardManager::Instance()) { // Setup all the Iggy references we need for this scene initialiseMovie(); @@ -60,8 +61,6 @@ UIScene_LeaderboardsMenu::UIScene_LeaderboardsMenu(int iPad, void *initData, UIL // Alert the app the we want to be informed of ethernet connections app.SetLiveLinkRequired( true ); - LeaderboardManager::Instance()->OpenSession(); - //GetFriends(); m_currentLeaderboard = 0; @@ -86,9 +85,6 @@ UIScene_LeaderboardsMenu::UIScene_LeaderboardsMenu(int iPad, void *initData, UIL 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 ); } @@ -159,6 +155,12 @@ wstring UIScene_LeaderboardsMenu::getMoviePath() return L"LeaderboardMenu"; } +void UIScene_LeaderboardsMenu::tick() +{ + UIScene::tick(); + m_interface.tick(); +} + void UIScene_LeaderboardsMenu::handleReload() { // We don't allow this in splitscreen, so just go back @@ -457,16 +459,19 @@ void UIScene_LeaderboardsMenu::ReadStats(int startIndex) switch (filtermode) { case LeaderboardManager::eFM_TopRank: - LeaderboardManager::Instance()->ReadStats_TopRank( this, - m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, - m_newEntryIndex, m_newReadSize - ); + { + m_interface.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_interface.ReadStats_MyScore( this, m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, uid /*ignored on PS3*/, m_newReadSize @@ -477,7 +482,7 @@ void UIScene_LeaderboardsMenu::ReadStats(int startIndex) { PlayerUID uid; ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(),&uid, true); - LeaderboardManager::Instance()->ReadStats_Friends( this, + m_interface.ReadStats_Friends( this, m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, uid /*ignored on PS3*/, m_newEntryIndex, m_newReadSize @@ -501,14 +506,11 @@ bool UIScene_LeaderboardsMenu::OnStatsReadComplete(LeaderboardManager::eStatsRet 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; - + + m_numStats = numResults; + m_stats = results; + ret = RetrieveStats(); + //else LeaderboardManager::Instance()->SetStatsRetrieved(false); PopulateLeaderboard(retIn); @@ -632,7 +634,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() } break; } - } + } } // If not set, default to start index @@ -1021,7 +1023,7 @@ void UIScene_LeaderboardsMenu::handleTimerComplete(int id) // 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()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_LeaderboardsMenu::ExitLeaderboards,this); } #endif break; diff --git a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h index 20bf0002..bcd4fe87 100644 --- a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h @@ -1,7 +1,8 @@ #pragma once #include "UIScene.h" -#include "..\Leaderboards\LeaderboardManager.h" +// #include "..\Leaderboards\LeaderboardManager.h" +#include "..\Leaderboards\LeaderboardInterface.h" class UIScene_LeaderboardsMenu : public UIScene, public LeaderboardReadListener { @@ -72,6 +73,8 @@ private: bool m_bPopulatedOnce; bool m_bReady; + LeaderboardInterface m_interface; + UIControl_LeaderboardList m_listEntries; UIControl_Label m_labelFilter, m_labelLeaderboard, m_labelEntries, m_labelInfo; UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) @@ -105,7 +108,8 @@ protected: virtual wstring getMoviePath(); public: - void handleReload(); + virtual void tick(); + virtual void handleReload(); // INPUT virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp index 1c07e540..d4d83228 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp @@ -33,24 +33,27 @@ int UIScene_LoadMenu::m_iDifficultyTitleSettingA[4]= int UIScene_LoadMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) { - UIScene_LoadMenu *pClass= (UIScene_LoadMenu *)lpParam; + UIScene_LoadMenu *pClass= (UIScene_LoadMenu *)ui.GetSceneFromCallbackId((size_t)lpParam); - app.DebugPrintf("Received data for a thumbnail\n"); - - if(pbThumbnail && dwThumbnailBytes) + if(pClass) { - pClass->registerSubstitutionTexture(pClass->m_thumbnailName,pbThumbnail,dwThumbnailBytes); + app.DebugPrintf("Received data for a thumbnail\n"); - 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; + 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; } - pClass->m_bRetrievingSaveThumbnail = false; return 0; } @@ -90,8 +93,10 @@ UIScene_LoadMenu::UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLaye m_iSaveGameInfoIndex=params->iSaveGameInfoIndex; m_levelGen = params->levelGen; - m_bGameModeSurvival=true; + m_bGameModeCreative = false; + m_iGameModeId = GameType::SURVIVAL->getId(); m_bHasBeenInCreative = false; + m_bIsSaveOwner = true; m_bSaveThumbnailReady = false; m_bRetrievingSaveThumbnail = true; @@ -103,6 +108,7 @@ UIScene_LoadMenu::UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLaye m_bRebuildTouchBoxes = false; m_bThumbnailGetFailed = false; m_seed = 0; + m_bIsCorrupt = 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. @@ -136,29 +142,23 @@ UIScene_LoadMenu::UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLaye } } - -#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); + // 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; - } + // 4J-PB - to stop an offline game being able to select the online flag + if(ProfileManager.IsSignedInLive(m_iPad) == false) + { + m_checkboxOnline.SetEnable(false); + } - m_checkboxOnline.init(app.GetString(IDS_ONLINE_GAME), eControl_OnlineGame, bOnlineGame); + if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + m_checkboxOnline.SetEnable(false); + bOnlineGame = false; } -#endif + + m_checkboxOnline.init(app.GetString(IDS_ONLINE_GAME), eControl_OnlineGame, bOnlineGame); // Level gen if(m_levelGen) @@ -185,8 +185,15 @@ UIScene_LoadMenu::UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLaye } } // 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) ); + m_bHasBeenInCreative = m_levelGen->getLevelHasBeenInCreative(); + if(m_bHasBeenInCreative) + { + m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_CREATIVE) ); + } + else + { + m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_SURVIVAL) ); + } } else { @@ -225,17 +232,19 @@ UIScene_LoadMenu::UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLaye #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); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataThumbnailReturned,(LPVOID)GetCallbackUniqueId(),true); #else - C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataThumbnailReturned,this); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataThumbnailReturned,(LPVOID)GetCallbackUniqueId()); #endif m_bShowTimer = true; } #if defined(_DURANGO) m_labelGameName.init(params->saveDetails->UTF16SaveName); #else - - m_labelGameName.init(params->saveDetails->UTF8SaveName); + wchar_t wSaveName[128]; + ZeroMemory(wSaveName, 128 * sizeof(wchar_t) ); + mbstowcs(wSaveName, params->saveDetails->UTF8SaveName, strlen(params->saveDetails->UTF8SaveName)+1); // plus null + m_labelGameName.init(wSaveName); #endif #endif } @@ -457,6 +466,26 @@ void UIScene_LoadMenu::tick() 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; + m_MoreOptionsParams.currentWorldSize = (EGameHostOptionWorldSize)app.GetGameHostOption(uiHostOptions,eGameHostOption_WorldSize); + m_MoreOptionsParams.newWorldSize = m_MoreOptionsParams.currentWorldSize; + + m_MoreOptionsParams.bMobGriefing = app.GetGameHostOption(uiHostOptions, eGameHostOption_MobGriefing); + m_MoreOptionsParams.bKeepInventory = app.GetGameHostOption(uiHostOptions, eGameHostOption_KeepInventory); + m_MoreOptionsParams.bDoMobSpawning = app.GetGameHostOption(uiHostOptions, eGameHostOption_DoMobSpawning); + m_MoreOptionsParams.bDoMobLoot = app.GetGameHostOption(uiHostOptions, eGameHostOption_DoMobLoot); + m_MoreOptionsParams.bDoTileDrops = app.GetGameHostOption(uiHostOptions, eGameHostOption_DoTileDrops); + m_MoreOptionsParams.bNaturalRegeneration = app.GetGameHostOption(uiHostOptions, eGameHostOption_NaturalRegeneration); + m_MoreOptionsParams.bDoDaylightCycle = app.GetGameHostOption(uiHostOptions, eGameHostOption_DoDaylightCycle); + + bool cheatsOn = m_MoreOptionsParams.bHostPrivileges; + if (!cheatsOn) + { + // Set defaults + m_MoreOptionsParams.bMobGriefing = true; + m_MoreOptionsParams.bKeepInventory = false; + m_MoreOptionsParams.bDoMobSpawning = true; + m_MoreOptionsParams.bDoDaylightCycle = true; + } // turn off creative mode on the save // #ifdef _DEBUG @@ -464,6 +493,11 @@ void UIScene_LoadMenu::tick() // app.SetGameHostOption(eGameHostOption_HasBeenInCreative, 0); // #endif + if(app.GetGameHostOption(uiHostOptions,eGameHostOption_WasntSaveOwner)>0) + { + m_bIsSaveOwner = false; + } + m_bHasBeenInCreative = app.GetGameHostOption(uiHostOptions,eGameHostOption_HasBeenInCreative)>0; if(app.GetGameHostOption(uiHostOptions,eGameHostOption_HasBeenInCreative)>0) { @@ -474,11 +508,27 @@ void UIScene_LoadMenu::tick() m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_SURVIVAL) ); } - if(app.GetGameHostOption(uiHostOptions,eGameHostOption_GameType)>0) - { + switch(app.GetGameHostOption(uiHostOptions,eGameHostOption_GameType)) + { + case 1: // Creative m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); - m_bGameModeSurvival=false; - } + m_bGameModeCreative=true; + m_iGameModeId = GameType::CREATIVE->getId(); + break; +#ifdef _ADVENTURE_MODE_ENABLED + case 2: // Adventure + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_ADVENTURE)); + m_bGameModeCreative=false; + m_iGameModeId = GameType::ADVENTURE->getId(); + break; +#endif + case 0: // Survival + default: + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_bGameModeCreative=false; + m_iGameModeId = GameType::SURVIVAL->getId(); + break; + }; bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); if(app.GetGameHostOption(uiHostOptions,eGameHostOption_FriendsOfFriends) && !(m_bMultiplayerAllowed && bGameSetting_Online)) @@ -545,7 +595,7 @@ void UIScene_LoadMenu::tick() 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); + ui.RequestAlertMessage(IDS_PLAY_OFFLINE,IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::ContinueOffline,this); } } break; @@ -599,7 +649,7 @@ void UIScene_LoadMenu::handleInput(int iPad, int key, bool repeat, bool pressed, 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } #endif @@ -610,23 +660,19 @@ void UIScene_LoadMenu::handleInput(int iPad, int key, bool repeat, bool pressed, 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) { - bool bOnlineGame = m_checkboxOnline.IsChecked(); - if (m_MoreOptionsParams.bOnlineGame != bOnlineGame) - { - m_MoreOptionsParams.bOnlineGame = bOnlineGame; + m_MoreOptionsParams.bOnlineGame = bOnlineGame; - if (!m_MoreOptionsParams.bOnlineGame) - { - m_MoreOptionsParams.bInviteOnly = false; - m_MoreOptionsParams.bAllowFriendsOfFriends = false; - } + if (!m_MoreOptionsParams.bOnlineGame) + { + m_MoreOptionsParams.bInviteOnly = false; + m_MoreOptionsParams.bAllowFriendsOfFriends = false; } } -#endif + handled = true; break; } @@ -642,16 +688,26 @@ void UIScene_LoadMenu::handlePress(F64 controlId, F64 childId) switch((int)controlId) { case eControl_GameMode: - if(m_bGameModeSurvival) + switch(m_iGameModeId) { + case 0: // Survival m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); - m_bGameModeSurvival=false; - } - else - { + m_iGameModeId = GameType::CREATIVE->getId(); + m_bGameModeCreative = true; + break; + case 1: // Creative +#ifdef _ADVENTURE_MODE_ENABLED + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_ADVENTURE)); + m_iGameModeId = GameType::ADVENTURE->getId(); + m_bGameModeCreative = false; + break; + case 2: // Adventure +#endif m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL)); - m_bGameModeSurvival=true; - } + m_iGameModeId = GameType::SURVIVAL->getId(); + m_bGameModeCreative = false; + break; + }; break; case eControl_MoreOptions: ui.NavigateToScene(m_iPad, eUIScene_LaunchMoreOptionsMenu, &m_MoreOptionsParams); @@ -729,7 +785,7 @@ void UIScene_LoadMenu::StartSharedLaunchFlow() 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); + ui.RequestAlertMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&TexturePackDialogReturned,this); return; } } @@ -799,13 +855,13 @@ void UIScene_LoadMenu::StartSharedLaunchFlow() // 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); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 1, m_iPad,&TrialTexturePackWarningReturned,this); #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); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this); #endif #if defined _XBOX_ONE || defined __ORBIS__ @@ -815,11 +871,45 @@ void UIScene_LoadMenu::StartSharedLaunchFlow() } } } + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, (!m_bIsSaveOwner)); #if defined _XBOX_ONE || defined __ORBIS__ app.SetGameHostOption(eGameHostOption_DisableSaving, m_MoreOptionsParams.bDisableSaving?1:0); - StorageManager.SetSaveDisabled(m_MoreOptionsParams.bDisableSaving); + + int newWorldSize = 0; + int newHellScale = 0; + switch(m_MoreOptionsParams.newWorldSize) + { + case e_worldSize_Unknown: + newWorldSize = 0; + newHellScale = 0; + break; + case e_worldSize_Classic: + newWorldSize = LEVEL_WIDTH_CLASSIC; + newHellScale = HELL_LEVEL_SCALE_CLASSIC; + break; + case e_worldSize_Small: + newWorldSize = LEVEL_WIDTH_SMALL; + newHellScale = HELL_LEVEL_SCALE_SMALL; + break; + case e_worldSize_Medium: + newWorldSize = LEVEL_WIDTH_MEDIUM; + newHellScale = HELL_LEVEL_SCALE_MEDIUM; + break; + case e_worldSize_Large: + newWorldSize = LEVEL_WIDTH_LARGE; + newHellScale = HELL_LEVEL_SCALE_LARGE; + break; + default: + assert(0); + break; + } + bool bUseMoat = !m_MoreOptionsParams.newWorldSizeOverwriteEdges; + app.SetGameNewWorldSize(newWorldSize, bUseMoat); + app.SetGameNewHellScale(newHellScale); + app.SetGameHostOption(eGameHostOption_WorldSize, m_MoreOptionsParams.newWorldSize); + #endif #if TO_BE_IMPLEMENTED @@ -834,7 +924,7 @@ void UIScene_LoadMenu::StartSharedLaunchFlow() 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); + ui.RequestAlertMessage(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this); } else { @@ -905,13 +995,9 @@ void UIScene_LoadMenu::handleTimerComplete(int id) 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_checkboxOnline.SetEnable(bMultiplayerAllowed); + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); m_bMultiplayerAllowed = bMultiplayerAllowed; } @@ -988,17 +1074,17 @@ void UIScene_LoadMenu::LaunchGame(void) killTimer(CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID); #endif - if( (m_bGameModeSurvival != true || m_bHasBeenInCreative) || m_MoreOptionsParams.bHostPrivileges == TRUE) + if( (m_bGameModeCreative == 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) + if(m_bGameModeCreative == true || m_bHasBeenInCreative) { // 4J-PB - Need different text for Survival mode with a level that has been saved in Creative - if(m_bGameModeSurvival) + if(!m_bGameModeCreative) { - ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_SAVEDINCREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_SAVEDINCREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this); } else // it's creative mode { @@ -1012,7 +1098,8 @@ void UIScene_LoadMenu::LaunchGame(void) if(m_levelGen != NULL) { - LoadLevelGen(m_levelGen); + m_bIsCorrupt = false; + LoadDataComplete(this); } else { @@ -1032,7 +1119,7 @@ void UIScene_LoadMenu::LaunchGame(void) 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); + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); } #endif @@ -1041,20 +1128,21 @@ void UIScene_LoadMenu::LaunchGame(void) 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); + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this); } } } 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); + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this); } } else { if(m_levelGen != NULL) { - LoadLevelGen(m_levelGen); + m_bIsCorrupt = false; + LoadDataComplete(this); } else { @@ -1073,7 +1161,7 @@ void UIScene_LoadMenu::LaunchGame(void) 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); + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); } #endif } @@ -1113,7 +1201,8 @@ int UIScene_LoadMenu::ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMes { if(pClass->m_levelGen != NULL) { - pClass->LoadLevelGen(pClass->m_levelGen); + pClass->m_bIsCorrupt = false; + pClass->LoadDataComplete(pClass); } else { @@ -1132,9 +1221,9 @@ int UIScene_LoadMenu::ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMes 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); + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); } -#endif +#endif } } else @@ -1183,7 +1272,7 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { @@ -1191,14 +1280,14 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_LoadMenu::MustSignInReturnedPSN, pClass); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); return 0; #endif } @@ -1257,6 +1346,15 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) pClass->setVisible( true ); pClass->m_bIgnoreInput=false; + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return 0; + } + // 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(); @@ -1317,6 +1415,15 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) pClass->setVisible( true ); pClass->m_bIgnoreInput=false; + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return 0; + } + // 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(); @@ -1357,7 +1464,7 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) 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); + ui.RequestAlertMessage(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, pClass->m_iPad,&UIScene_LoadMenu::DeleteSaveDialogReturned,pClass); } @@ -1369,6 +1476,14 @@ int UIScene_LoadMenu::LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bI UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; pClass->m_bIsCorrupt=bIsCorrupt; + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + if(app.GetGameHostOption(eGameHostOption_WasntSaveOwner)) + { + bIsOwner = false; + } +#endif + if(bIsOwner) { LoadDataComplete(pClass); @@ -1382,8 +1497,9 @@ int UIScene_LoadMenu::LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bI // 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()); + ui.RequestErrorMessage(IDS_SAVEDATA_COPIED_TITLE, IDS_SAVEDATA_COPIED_TEXT, uiIDA, 1, + pClass->m_iPad,&UIScene_LoadMenu::TrophyDialogReturned,pClass); + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, true); #endif } @@ -1427,9 +1543,18 @@ int UIScene_LoadMenu::DeleteSaveDataReturned(void *pParam,bool bSuccess) // 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); + if(pClass->m_levelGen == NULL) + { + 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); + } + else + { + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle(pClass->m_levelGen->getDefaultSaveName().c_str()); + } bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; #ifdef __PSVITA__ @@ -1446,7 +1571,8 @@ void UIScene_LoadMenu::StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocal NetworkGameInitData *param = new NetworkGameInitData(); param->seed = pClass->m_seed; - param->saveData = NULL; + param->saveData = NULL; + param->levelGen = pClass->m_levelGen; param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; Minecraft *pMinecraft = Minecraft::GetInstance(); @@ -1467,12 +1593,26 @@ void UIScene_LoadMenu::StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocal app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + app.SetGameHostOption(eGameHostOption_MobGriefing, pClass->m_MoreOptionsParams.bMobGriefing); + app.SetGameHostOption(eGameHostOption_KeepInventory, pClass->m_MoreOptionsParams.bKeepInventory); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, pClass->m_MoreOptionsParams.bDoMobSpawning); + app.SetGameHostOption(eGameHostOption_DoMobLoot, pClass->m_MoreOptionsParams.bDoMobLoot); + app.SetGameHostOption(eGameHostOption_DoTileDrops, pClass->m_MoreOptionsParams.bDoTileDrops); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, pClass->m_MoreOptionsParams.bNaturalRegeneration); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, pClass->m_MoreOptionsParams.bDoDaylightCycle); + +#ifdef _LARGE_WORLDS + app.SetGameHostOption(eGameHostOption_WorldSize, pClass->m_MoreOptionsParams.worldSize+1 ); // 0 is GAME_HOST_OPTION_WORLDSIZE_UNKNOWN +#endif +// app.SetGameNewWorldSize(64, true ); +// app.SetGameNewWorldSize(0, false ); + // 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() ); + app.SetGameHostOption(eGameHostOption_GameType,pClass->m_iGameModeId ); g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); @@ -1508,7 +1648,7 @@ void UIScene_LoadMenu::checkStateAndStartGame() 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); + ui.RequestAlertMessage(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this); } else { @@ -1516,113 +1656,6 @@ void UIScene_LoadMenu::checkStateAndStartGame() } } -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; @@ -1670,7 +1703,7 @@ int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { @@ -1678,14 +1711,14 @@ int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_LoadMenu::MustSignInReturnedPSN, pClass); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); return 0; #endif } @@ -1706,7 +1739,7 @@ int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int 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); + ui.RequestAlertMessage( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { @@ -1714,7 +1747,7 @@ int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int 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); + ui.RequestAlertMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } } else @@ -1754,13 +1787,7 @@ 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 + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame == TRUE); } } diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h index e45fa09c..12955151 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h @@ -22,10 +22,8 @@ private: 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" ) @@ -35,10 +33,7 @@ private: 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") @@ -51,8 +46,10 @@ private: int m_iSaveGameInfoIndex; int m_CurrentDifficulty; - bool m_bGameModeSurvival; + bool m_bGameModeCreative; + int m_iGameModeId; bool m_bHasBeenInCreative; + bool m_bIsSaveOwner; bool m_bRetrievingSaveThumbnail; bool m_bSaveThumbnailReady; bool m_bMultiplayerAllowed; @@ -104,7 +101,6 @@ protected: private: void StartSharedLaunchFlow(); virtual void checkStateAndStartGame(); - void LoadLevelGen(LevelGenerationOptions *levelGen); void LaunchGame(void); #ifdef _DURANGO diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp index 1d90da77..4e48e395 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp @@ -8,7 +8,6 @@ #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" @@ -17,6 +16,7 @@ #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) #include "Common\Network\Sony\SonyHttp.h" #include "Common\Network\Sony\SonyRemoteStorage.h" +#include "DLCTexturePack.h" #endif #if defined(__ORBIS__) || defined(__PSVITA__) #include @@ -29,6 +29,7 @@ #ifdef SONY_REMOTE_STORAGE_DOWNLOAD unsigned long UIScene_LoadOrJoinMenu::m_ulFileSize=0L; wstring UIScene_LoadOrJoinMenu::m_wstrStageText=L""; +bool UIScene_LoadOrJoinMenu::m_bSaveTransferRunning = false; #endif @@ -103,9 +104,9 @@ UIScene_LoadOrJoinMenu::UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer 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_labelSavesListTitle.init( IDS_START_GAME ); + m_labelJoinListTitle.init( IDS_JOIN_GAME ); + m_labelNoGames.init( IDS_NO_GAMES_FOUND ); m_labelNoGames.setVisible( false ); m_controlSavesTimer.setVisible( true ); m_controlJoinTimer.setVisible( true ); @@ -308,6 +309,14 @@ UIScene_LoadOrJoinMenu::~UIScene_LoadOrJoinMenu() void UIScene_LoadOrJoinMenu::updateTooltips() { +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + if(m_eSaveTransferState!=eSaveTransfer_Idle) + { + // we're in a full screen progress for the save download here, so don't change the tooltips + return; + } +#endif + // 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 @@ -548,6 +557,8 @@ void UIScene_LoadOrJoinMenu::tick() { UIScene::tick(); + + #if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined _WINDOWS64 || defined __PSVITA__) if(m_bExitScene) // navigate forward or back { @@ -560,6 +571,11 @@ void UIScene_LoadOrJoinMenu::tick() // Stop loading thumbnails if we navigate forwards if(hasFocus(m_iPad)) { +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + // if the loadOrJoin menu has focus again, we can clear the saveTransfer flag now. Added so we can delay the ehternet disconnect till it's cleaned up + if(m_eSaveTransferState == eSaveTransfer_Idle) + m_bSaveTransferRunning = false; +#endif #if defined(_XBOX_ONE) || defined(__ORBIS__) if(m_bUpdateSaveSize) { @@ -775,7 +791,7 @@ void UIScene_LoadOrJoinMenu::tick() { 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()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); } #endif @@ -896,7 +912,7 @@ void UIScene_LoadOrJoinMenu::AddDefaultButtons() m_iMashUpButtonsC=0; m_generators.clear(); - m_buttonListSaves.addItem(app.GetString(IDS_CREATE_NEW_WORLD)); + m_buttonListSaves.addItem(app.GetString(IDS_CREATE_NEW_WORLD)); m_iDefaultButtonsC++; int i = 0; @@ -919,8 +935,10 @@ void UIScene_LoadOrJoinMenu::AddDefaultButtons() } } + // 4J-JEV: For debug. Ignore worlds with no name. + LPCWSTR wstr = levelGen->getWorldName(); + m_buttonListSaves.addItem( wstr ); m_generators.push_back(levelGen); - m_buttonListSaves.addItem(levelGen->getWorldName()); if(uiTexturePackID!=0) { @@ -1005,7 +1023,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr { UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); break; } @@ -1018,7 +1036,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr 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); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(), &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this); } else { @@ -1061,7 +1079,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr 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.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); } else { @@ -1083,7 +1101,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr 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); + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVEOPTIONS, IDS_TEXT_SAVEOPTIONS, uiIDA, numOptions, iPad,&UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned,this); } else { @@ -1092,7 +1110,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr 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.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); } } ui.PlayUISFX(eSFX_Press); @@ -1293,7 +1311,7 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); } else @@ -1324,7 +1342,7 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_LOAD_SAVED_WORLD, IDS_CONFIRM_SYNC_REQUIRED, uiIDA, 2, ProfileManager.GetPrimaryPad(),&NeedSyncMessageReturned,this); } else #endif @@ -1411,7 +1429,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) 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); + ui.RequestAlertMessage(IDS_ONLINE_GAME, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, m_iPad,NULL,this); #else // Not allowed to play online ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, 0 ); @@ -1440,16 +1458,26 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,iPadNotSignedInLive, &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + ui.RequestErrorMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,iPadNotSignedInLive, &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this); } return; } else if(bPlayStationPlus==false) { + + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return; + } + // 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 @@ -1514,10 +1542,19 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) // 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); + ui.RequestAlertMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, m_iPad,&UIScene_LoadOrJoinMenu::TexturePackDialogReturned,this); return; } + +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && !SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + // not connected to adhoc anymore, must have connected back to PSN to buy texture pack so sign in again + SQRNetworkManager_AdHoc_Vita::AttemptAdhocSignIn(&UIScene_LoadOrJoinMenu::SignInAdhocReturned, this); + return; + } +#endif } m_controlJoinTimer.setVisible( false ); @@ -2125,7 +2162,7 @@ int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JS 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); + ui.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,pClass); } break; @@ -2136,7 +2173,7 @@ int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JS 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); + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_TEXT, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::SaveTransferDialogReturned,pClass); } break; #endif // SONY_REMOTE_STORAGE_UPLOAD @@ -2147,7 +2184,7 @@ int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JS 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); + ui.RequestAlertMessage(IDS_COPYSAVE, IDS_TEXT_COPY_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::CopySaveDialogReturned,pClass); } break; #endif @@ -2164,6 +2201,91 @@ int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JS return 0; } + +#if defined (__PSVITA__) + +int UIScene_LoadOrJoinMenu::SignInAdhocReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + pClass->m_bIgnoreInput = false; + return 0; + +} + + + +int UIScene_LoadOrJoinMenu::MustSignInTexturePack(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::MustSignInReturnedTexturePack, pClass); + } + else + { + pClass->m_bIgnoreInput = false; + } + + return 0; +} + + +int UIScene_LoadOrJoinMenu::MustSignInReturnedTexturePack(void *pParam,bool bContinue, int iPad) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + int commerceState = app.GetCommerceState(); + while( commerceState != CConsoleMinecraftApp::eCommerce_State_Offline && + commerceState != CConsoleMinecraftApp::eCommerce_State_Online && + commerceState != CConsoleMinecraftApp::eCommerce_State_Error) + { + Sleep(10); + commerceState = app.GetCommerceState(); + } + + if(bContinue==true) + { + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo(pClass->m_initData->selectedSession->data.texturePackParentId); + 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); + // 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(app.CheckForEmptyStore(iPad)==false) + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } + pClass->m_bIgnoreInput = false; + return 0; +} + +#endif + int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { UIScene_LoadOrJoinMenu *pClass = (UIScene_LoadOrJoinMenu *)pParam; @@ -2173,24 +2295,53 @@ int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JS { // 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 defined __PSVITA__ || defined __PS3__ || defined __ORBIS__ +#ifdef __PSVITA__ + if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && CGameNetworkManager::usingAdhocMode()) + { + // get them to sign in to online + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::MustSignInTexturePack,pClass); + return; + } +#endif - if( result==C4JStorage::EMessage_ResultAccept ) // Full version - { - ullIndexA[0]=ullOfferID_Full; - StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo(pClass->m_initData->selectedSession->data.texturePackParentId); + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; - } - else // trial version - { - DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); - ullIndexA[0]=pDLCInfo->ullOfferID_Trial; - StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); - } + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // 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(app.CheckForEmptyStore(iPad)==false) + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } #endif @@ -2208,7 +2359,7 @@ int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JS { // 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } } #endif @@ -2256,8 +2407,7 @@ int UIScene_LoadOrJoinMenu::PSN_SignInReturned(void *pParam,bool bContinue, int 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; + SQRNetworkManager_Vita::RecvInviteGUI(); #else SQRNetworkManager_Orbis::RecvInviteGUI(); #endif @@ -2377,9 +2527,14 @@ bool g_bForceVitaSaveWipe = false; int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter ) { + m_bSaveTransferRunning = true; +#ifdef __PS3__ + StorageManager.SetSaveTransferInProgress(true); +#endif Compression::UseDefaultThreadStorage(); UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParameter; pClass->m_saveTransferDownloadCancelled = false; + m_bSaveTransferRunning = true; bool bAbortCalled = false; Minecraft *pMinecraft=Minecraft::GetInstance(); bool bSaveFileCreated = false; @@ -2416,14 +2571,24 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter { if(app.getRemoteStorage()->saveIsAvailable()) { - pClass->m_eSaveTransferState = eSaveTransfer_CreateDummyFile; + if(app.getRemoteStorage()->saveVersionSupported()) + { + pClass->m_eSaveTransferState = eSaveTransfer_CreateDummyFile; + } + else + { + // must be a newer version of the save in the cloud that we don't support yet + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_WRONG_VERSION, uiIDA, 1, ProfileManager.GetPrimaryPad(),RemoteSaveNotFoundCallback,pClass); + } } - else + 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); + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_NOT_AVAILABLE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),RemoteSaveNotFoundCallback,pClass); } } break; @@ -2446,7 +2611,11 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); - int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, app.getRemoteStorage()->getSaveHostOptions(), app.getRemoteStorage()->getSaveTexturePack() ); + unsigned int hostOptions = app.getRemoteStorage()->getSaveHostOptions(); +#ifdef __ORBIS__ + app.SetGameHostOption(hostOptions, eGameHostOption_WorldSize, e_worldSize_Classic); // force the classic world size on, otherwise it's unknown and we can't expand +#endif + int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, hostOptions, app.getRemoteStorage()->getSaveTexturePack() ); // set the icon and save image StorageManager.SetSaveImages(pbThumbnailData,dwThumbnailDataSize,pbDataSaveImage,dwDataSizeSaveImage,bTextMetadata,iTextMetadataBytes); @@ -2606,7 +2775,9 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); - int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, app.getRemoteStorage()->getSaveHostOptions(), app.getRemoteStorage()->getSaveTexturePack() ); + unsigned int remoteHostOptions = app.getRemoteStorage()->getSaveHostOptions(); + app.SetGameHostOption(eGameHostOption_All, remoteHostOptions ); + int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, remoteHostOptions, app.getRemoteStorage()->getSaveTexturePack() ); // set the icon and save image StorageManager.SetSaveImages(pbThumbnailData,dwThumbnailDataSize,pbDataSaveImage,dwDataSizeSaveImage,bTextMetadata,iTextMetadataBytes); @@ -2668,7 +2839,7 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter 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()); + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass); pClass->m_eSaveTransferState = eSaveTransfer_Finished; } break; @@ -2709,20 +2880,20 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter } 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; + // 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; @@ -2743,7 +2914,25 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter { 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()); + UINT errorMessage = IDS_SAVE_TRANSFER_DOWNLOADFAILED; + if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + errorMessage = IDS_ERROR_NETWORK; // show "A network error has occurred." +#ifdef __ORBIS__ + if(!ProfileManager.isSignedInPSN(ProfileManager.GetPrimaryPad())) + { + errorMessage = IDS_PRO_NOTONLINE_TEXT; // show "not signed into PSN" + } +#endif +#ifdef __VITA__ + if(!ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) + { + errorMessage = IDS_PRO_NOTONLINE_TEXT; // show "not signed into PSN" + } +#endif + + } + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, errorMessage, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass); pClass->m_eSaveTransferState = eSaveTransfer_Finished; } if(bSaveFileCreated) // save file has been created, then deleted. @@ -2755,14 +2944,16 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter break; case eSaveTransfer_Finished: { - } // waiting to dismiss the dialog break; } Sleep(50); } - + m_bSaveTransferRunning = false; +#ifdef __PS3__ + StorageManager.SetSaveTransferInProgress(false); +#endif return 0; } @@ -2887,7 +3078,7 @@ int UIScene_LoadOrJoinMenu::UploadSonyCrossSaveThreadProc( LPVOID lpParameter ) { 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()); + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass); pClass->m_eSaveUploadState = esaveUpload_Finished; } break; @@ -2904,7 +3095,7 @@ int UIScene_LoadOrJoinMenu::UploadSonyCrossSaveThreadProc( LPVOID lpParameter ) { 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()); + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass); pClass->m_eSaveUploadState = esaveUpload_Finished; } } @@ -2927,7 +3118,7 @@ void UIScene_LoadOrJoinMenu::SaveUploadReturned(LPVOID lpParam, SonyRemoteStorag 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() ); + ui.RequestErrorMessage( IDS_CANCEL_UPLOAD_TITLE, IDS_CANCEL_UPLOAD_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), CrossSaveUploadFinishedCallback, pClass ); pClass->m_eSaveUploadState=esaveUpload_Finished; } else @@ -3054,8 +3245,18 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) switch(UIScene_LoadOrJoinMenu::s_eSaveTransferFile) { case eSaveTransferFile_Marker: - UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_Metadata; - RequestFileSize( pStateContainer, L"metadata" ); + // MGH - the marker file now contains the save file version number + // if the version is higher than we handle, cancel the download. + if(UIScene_LoadOrJoinMenu::s_transferData[0] > SAVE_FILE_VERSION_NUMBER) + { + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_NONE_FOUND); + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + } + else + { + UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_Metadata; + RequestFileSize( pStateContainer, L"metadata" ); + } break; case eSaveTransferFile_Metadata: { @@ -3078,7 +3279,28 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) byteArray ba(thumbnailSize); dis.readFully(ba); - StorageManager.SetSaveImages(ba.data, ba.length, NULL, 0, NULL, 0); + + + // retrieve the seed value from the image metadata, we need to change to host options, then set it back again + bool bHostOptionsRead = false; + unsigned int uiHostOptions = 0; + DWORD dwTexturePack; + __int64 seedVal; + + char szSeed[50]; + ZeroMemory(szSeed,50); + app.GetImageTextData(ba.data,ba.length,(unsigned char *)&szSeed,uiHostOptions,bHostOptionsRead,dwTexturePack); + sscanf_s(szSeed, "%I64d", &seedVal); + + app.SetGameHostOption(uiHostOptions, eGameHostOption_WorldSize, e_worldSize_Classic); // force the classic world size on, otherwise it's unknown and we can't expand + + + BYTE bTextMetadata[88]; + ZeroMemory(bTextMetadata,88); + + int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, seedVal, true, uiHostOptions, dwTexturePack); + // set the icon and save image + StorageManager.SetSaveImages(ba.data, ba.length, NULL, 0, bTextMetadata, iTextMetadataBytes); delete ba.data; } @@ -3468,12 +3690,12 @@ int UIScene_LoadOrJoinMenu::CopySaveDataReturned(LPVOID lpParam, bool success, C 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()); + ui.RequestErrorMessage(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_LOCAL, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam); } 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()); + ui.RequestErrorMessage(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_QUOTA, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam); } else { diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h index 01d94b05..3599aa37 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h @@ -153,6 +153,12 @@ public: static int DeleteSaveDataReturned(LPVOID lpParam,bool bRes); static int RenameSaveDataReturned(LPVOID lpParam,bool bRes); static int KeyboardCompleteWorldNameCallback(LPVOID lpParam,bool bRes); +#ifdef __PSVITA__ + static int MustSignInTexturePack(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int MustSignInReturnedTexturePack(void *pParam,bool bContinue, int iPad); + static int SignInAdhocReturned(void *pParam,bool bContinue, int iPad); +#endif + protected: void handlePress(F64 controlId, F64 childId); void LoadLevelGen(LevelGenerationOptions *levelGen); @@ -250,6 +256,7 @@ private: eSaveTransferState m_eSaveTransferState; static unsigned long m_ulFileSize; static wstring m_wstrStageText; + static bool m_bSaveTransferRunning; int m_iProgress; char m_downloadedUniqueFilename[64];//SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE]; bool m_saveTransferDownloadCancelled; @@ -265,6 +272,9 @@ private: static ConsoleSaveFile* SonyCrossSaveConvert(); static void CancelSaveTransferCallback(LPVOID lpParam); +public: + static bool isSaveTransferRunning() { return m_bSaveTransferRunning; } +private: #endif #ifdef SONY_REMOTE_STORAGE_UPLOAD diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp index e05b6df8..fe743adc 100644 --- a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp @@ -12,6 +12,8 @@ Random *UIScene_MainMenu::random = new Random(); +EUIScene UIScene_MainMenu::eNavigateWhenReady = (EUIScene) -1; + UIScene_MainMenu::UIScene_MainMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) { #ifdef __ORBIS @@ -31,31 +33,31 @@ UIScene_MainMenu::UIScene_MainMenu(int iPad, void *initData, UILayer *parentLaye m_bIgnorePress=false; - m_buttons[(int)eControl_PlayGame].init(app.GetString(IDS_PLAY_GAME),eControl_PlayGame); + m_buttons[(int)eControl_PlayGame].init(IDS_PLAY_GAME,eControl_PlayGame); #ifdef _XBOX_ONE - if(!ProfileManager.IsFullVersion()) m_buttons[(int)eControl_PlayGame].setLabel(app.GetString(IDS_PLAY_TRIAL_GAME)); + if(!ProfileManager.IsFullVersion()) m_buttons[(int)eControl_PlayGame].setLabel(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); + m_buttons[(int)eControl_Leaderboards].init(IDS_LEADERBOARDS,eControl_Leaderboards); + m_buttons[(int)eControl_Achievements].init( (UIString)IDS_ACHIEVEMENTS,eControl_Achievements); + m_buttons[(int)eControl_HelpAndOptions].init(IDS_HELP_AND_OPTIONS,eControl_HelpAndOptions); if(ProfileManager.IsFullVersion()) { m_bTrialVersion=false; - m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_DOWNLOADABLECONTENT),eControl_UnlockOrDLC); + m_buttons[(int)eControl_UnlockOrDLC].init(IDS_DOWNLOADABLECONTENT,eControl_UnlockOrDLC); } else { m_bTrialVersion=true; - m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_UNLOCK_FULL_GAME),eControl_UnlockOrDLC); + m_buttons[(int)eControl_UnlockOrDLC].init(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); + m_buttons[(int)eControl_XboxHelp].init(IDS_XBOX_HELP_APP, eControl_XboxHelp); #endif #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) @@ -151,6 +153,11 @@ void UIScene_MainMenu::handleGainFocus(bool navBack) ui.ShowPlayerDisplayname(false); m_bIgnorePress=false; + if (eNavigateWhenReady >= 0) + { + return; + } + // 4J-JEV: This needs to come before SetLockedProfile(-1) as it wipes the XbLive contexts. if (!navBack) { @@ -175,7 +182,7 @@ void UIScene_MainMenu::handleGainFocus(bool navBack) if(navBack && ProfileManager.IsFullVersion()) { // Replace the Unlock Full Game with Downloadable Content - m_buttons[(int)eControl_UnlockOrDLC].setLabel(app.GetString(IDS_DOWNLOADABLECONTENT)); + m_buttons[(int)eControl_UnlockOrDLC].setLabel(IDS_DOWNLOADABLECONTENT); } #if TO_BE_IMPLEMENTED @@ -223,11 +230,25 @@ wstring UIScene_MainMenu::getMoviePath() return L"MainMenu"; } +void UIScene_MainMenu::handleReload() +{ +#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 ); +#endif +#ifdef _DURANGO + // Allowed to not have achievements in the menu + removeControl( &m_buttons[(int)eControl_Achievements], false ); +#endif +} + 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 ( m_bIgnorePress || (eNavigateWhenReady >= 0) ) return; #if defined (__ORBIS__) || defined (__PSVITA__) // ignore all players except player 0 - it's their profile that is currently being used @@ -265,7 +286,7 @@ void UIScene_MainMenu::handleInput(int iPad, int key, bool repeat, bool pressed, 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); + ui.RequestErrorMessage(IDS_SELECT_NETWORK_MODE_TITLE, IDS_SELECT_NETWORK_MODE_TEXT, uiIDA, 2, XUSER_INDEX_ANY, &UIScene_MainMenu::SelectNetworkModeReturned,this); } break; #endif @@ -281,7 +302,11 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) { int primaryPad = ProfileManager.GetPrimaryPad(); +#ifdef _XBOX_ONE + int (*signInReturnedFunc) (LPVOID,const bool, const int iPad, const int iController) = NULL; +#else int (*signInReturnedFunc) (LPVOID,const bool, const int iPad) = NULL; +#endif switch((int)controlId) { @@ -343,7 +368,7 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestErrorMessage(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); } else { @@ -390,7 +415,7 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) 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()); + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, this); } } } @@ -557,7 +582,15 @@ int UIScene_MainMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EM SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass); break; case eAction_RunGamePSN: - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass); + if(CGameNetworkManager::usingAdhocMode()) + { + SQRNetworkManager_AdHoc_Vita::AttemptAdhocSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass); + } + else + { + 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 @@ -604,7 +637,11 @@ int UIScene_MainMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EM } #endif +#ifdef _XBOX_ONE +int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad, int iController) +#else int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad) +#endif { UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam; @@ -621,7 +658,7 @@ int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue, #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu); + proceedToScene(iPad, eUIScene_HelpAndOptionsMenu); } #if TO_BE_IMPLEMENTED else @@ -662,16 +699,20 @@ int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue, } #ifdef _XBOX_ONE -int UIScene_MainMenu::ChooseUser_SignInReturned(void *pParam, bool bContinue, int iPad) +int UIScene_MainMenu::ChooseUser_SignInReturned(void *pParam, bool bContinue, int iPad, int iController) { UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; pClass->m_bIgnorePress = false; - + pClass->updateTooltips(); return 0; } #endif +#ifdef _XBOX_ONE +int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, int iPad, int iController) +#else int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, int iPad) +#endif { UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; @@ -685,7 +726,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad())) { pClass->m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -723,7 +764,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in if(ProfileManager.IsGuest(iPad)) { pClass->m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -741,7 +782,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); } else { @@ -804,7 +845,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); #endif } } @@ -818,7 +859,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); #endif } } @@ -869,7 +910,11 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in return 0; } +#ifdef _XBOX_ONE +int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,int iPad,int iController) +#else int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,int iPad) +#endif { UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam; @@ -884,12 +929,12 @@ int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,in if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad())) { pClass->m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(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); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); } else { @@ -900,11 +945,11 @@ int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,in 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 +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE) ) // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); #endif } else @@ -913,7 +958,7 @@ int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,in #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LeaderboardsMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LeaderboardsMenu); } } } @@ -935,7 +980,11 @@ int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,in return 0; } +#ifdef _XBOX_ONE +int UIScene_MainMenu::Achievements_SignInReturned(void *pParam,bool bContinue,int iPad,int iController) +#else int UIScene_MainMenu::Achievements_SignInReturned(void *pParam,bool bContinue,int iPad) +#endif { UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam; @@ -965,7 +1014,11 @@ int UIScene_MainMenu::Achievements_SignInReturned(void *pParam,bool bContinue,in return 0; } +#ifdef _XBOX_ONE +int UIScene_MainMenu::UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad,int iController) +#else int UIScene_MainMenu::UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad) +#endif { UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; @@ -995,8 +1048,8 @@ int UIScene_MainMenu::UnlockFullGame_SignInReturned(void *pParam,bool bContinue, return 0; } -#ifdef _DURANGO -int UIScene_MainMenu::XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad) +#ifdef _XBOX_ONE +int UIScene_MainMenu::XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad, int iController) { UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; @@ -1096,7 +1149,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_PlayGame(void * { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, pClass); return; } @@ -1123,7 +1176,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_PlayGame(void * 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()); + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass); } } } @@ -1188,7 +1241,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_Leaderboards(vo { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, pClass); return; } @@ -1213,7 +1266,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_Leaderboards(vo 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()); + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass); } } } @@ -1257,7 +1310,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) uiIDA[0]=IDS_OK; m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -1308,7 +1361,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) { 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()); + ui.RequestErrorMessage(IDS_PRO_NOTADHOCONLINE_TITLE, IDS_PRO_NOTADHOCONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); } else { @@ -1330,12 +1383,12 @@ void UIScene_MainMenu::RunPlayGame(int iPad) 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); } #else - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this); #endif #elif defined __ORBIS__ @@ -1349,7 +1402,7 @@ void UIScene_MainMenu::RunPlayGame(int 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()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this); } else { @@ -1358,7 +1411,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this); return; } #else @@ -1366,7 +1419,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); #endif } else @@ -1438,7 +1491,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); #endif } } @@ -1482,7 +1535,7 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) // guests can't look at leaderboards if(ProfileManager.IsGuest(iPad)) { - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else if(!ProfileManager.IsSignedInLive(iPad)) { @@ -1491,7 +1544,7 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) // 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); /* 4J-PB - Add this after release #elif defined __PSVITA__ @@ -1522,18 +1575,18 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this); return; } #else - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); #endif } else @@ -1551,11 +1604,11 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) #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 +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE)) // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this); #endif } else @@ -1567,7 +1620,7 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(iPad, eUIScene_LeaderboardsMenu); + proceedToScene(iPad, eUIScene_LeaderboardsMenu); } } } @@ -1626,7 +1679,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, this); return; } @@ -1637,7 +1690,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) if(ProfileManager.IsGuest(iPad)) { m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -1656,11 +1709,11 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) 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 +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE)) // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this); #endif } else @@ -1669,7 +1722,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_DLCMainMenu); } } #if defined _XBOX_ONE @@ -1710,7 +1763,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) UINT uiIDA[1]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; //uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); #elif defined __ORBIS__ m_eAction=eAction_RunUnlockOrDLCPSN; // Determine why they're not "signed in live" @@ -1722,20 +1775,20 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this); return; } #else UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); #endif } } @@ -1745,7 +1798,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) if(ProfileManager.IsGuest(iPad)) { m_bIgnorePress=false; - ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_GUEST_TEXT, uiIDA, 1,iPad); + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_GUEST_TEXT, uiIDA, 1,iPad); } else if(!ProfileManager.IsSignedInLive(iPad)) { @@ -1754,7 +1807,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) // 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); #elif defined __ORBIS__ m_eAction=eAction_RunUnlockOrDLCPSN; // Determine why they're not "signed in live" @@ -1766,20 +1819,20 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } 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()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this); return; } #else UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); #endif } @@ -1805,6 +1858,60 @@ void UIScene_MainMenu::tick() { UIScene::tick(); + if ( (eNavigateWhenReady >= 0) ) + { + + int lockedProfile = ProfileManager.GetLockedProfile(); + +#ifdef _DURANGO + // 4J-JEV: DLC menu contains text localised to system language which we can't change. + // We need to switch to this language in-case it uses a different font. + if (eNavigateWhenReady == eUIScene_DLCMainMenu) setLanguageOverride(false); + + bool isSignedIn; + C4JStorage::eOptionsCallback status; + bool pendingFontChange; + if (lockedProfile >= 0) + { + isSignedIn = ProfileManager.IsSignedIn(lockedProfile); + status = app.GetOptionsCallbackStatus(lockedProfile); + pendingFontChange = ui.PendingFontChange(); + + if(status == C4JStorage::eOptions_Callback_Idle) + { + // make sure the TMS banned list data is ditched - the player may have gone in to help & options, backed out, and signed out + app.InvalidateBannedList(lockedProfile); + + // need to ditch any DLCOffers info + StorageManager.ClearDLCOffers(); + app.ClearAndResetDLCDownloadQueue(); + app.ClearDLCInstalled(); + } + } + + if ( (lockedProfile >= 0) + && isSignedIn + && ((status == C4JStorage::eOptions_Callback_Read)||(status == C4JStorage::eOptions_Callback_Write)) + && !pendingFontChange + ) +#endif + { + app.DebugPrintf("[MainMenu] Navigating away from MainMenu.\n"); + ui.NavigateToScene(lockedProfile, eNavigateWhenReady); + eNavigateWhenReady = (EUIScene) -1; + } +#ifdef _DURANGO + else + { + app.DebugPrintf("[MainMenu] Delaying navigation: lockedProfile=%i, %s, status=%ls, %s.\n", + lockedProfile, + isSignedIn ? "SignedIn" : "SignedOut", + app.toStringOptionsStatus(status).c_str(), + pendingFontChange ? "Pending font change" : "font OK"); + } +#endif + } + #if defined(__PS3__) || defined (__ORBIS__) || defined(__PSVITA__) if(m_bLaunchFullVersionPurchase) { @@ -1823,7 +1930,7 @@ void UIScene_MainMenu::tick() { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else { @@ -1851,7 +1958,7 @@ void UIScene_MainMenu::tick() { m_bWaitingForDLCInfo=false; ProfileManager.SetLockedProfile(m_iPad); - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_DLCMainMenu); } } @@ -1859,7 +1966,7 @@ void UIScene_MainMenu::tick() { 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()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); } #endif @@ -1882,7 +1989,7 @@ void UIScene_MainMenu::tick() // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, this); } m_bErrorDialogRunning=false; @@ -1907,7 +2014,7 @@ void UIScene_MainMenu::RunAchievements(int iPad) // guests can't look at achievements if(ProfileManager.IsGuest(iPad)) { - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -1922,7 +2029,7 @@ void UIScene_MainMenu::RunHelpAndOptions(int iPad) { UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -1938,7 +2045,7 @@ void UIScene_MainMenu::RunHelpAndOptions(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu); + proceedToScene(iPad, eUIScene_HelpAndOptionsMenu); } #if TO_BE_IMPLEMENTED else @@ -1976,6 +2083,7 @@ void UIScene_MainMenu::LoadTrial(void) // No saving in the trial StorageManager.SetSaveDisabled(true); + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, false); // Set the global flag, so that we don't disable saving again once the save is complete app.SetGameHostOption(eGameHostOption_DisableSaving, 1); @@ -2021,7 +2129,7 @@ void UIScene_MainMenu::LoadTrial(void) void UIScene_MainMenu::handleUnlockFullVersion() { - m_buttons[(int)eControl_UnlockOrDLC].setLabel(app.GetString(IDS_DOWNLOADABLECONTENT),true); + m_buttons[(int)eControl_UnlockOrDLC].setLabel(IDS_DOWNLOADABLECONTENT,true); } diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.h b/Minecraft.Client/Common/UI/UIScene_MainMenu.h index f1b358da..2b49a44b 100644 --- a/Minecraft.Client/Common/UI/UIScene_MainMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.h @@ -90,10 +90,20 @@ private: }; eActions m_eAction; + +private: + // 4J-JEV: Delay navigation until font changes. + static EUIScene eNavigateWhenReady; + + static void proceedToScene(int iPad, EUIScene eScene) + { + eNavigateWhenReady = eScene; + } + 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; } @@ -113,6 +123,7 @@ protected: public: virtual void tick(); + virtual void handleReload(); // INPUT virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); @@ -137,8 +148,20 @@ private: static void LoadTrial(); #ifdef _XBOX_ONE - static int ChooseUser_SignInReturned(void *pParam,bool bContinue, int iPad); -#endif + static int ChooseUser_SignInReturned(void *pParam,bool bContinue, int iPad, int iController); + static int CreateLoad_SignInReturned(void *pParam,bool bContinue, int iPad, int iController); + static int HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad, int iController); + static int Achievements_SignInReturned(void *pParam,bool bContinue,int iPad, int iController); + static int MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + static int Leaderboards_SignInReturned(void* pParam, bool bContinue, int iPad, int iController); + static int UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad, int iController); + static int ExitGameReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + + static int XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad, int iController); +#else + 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); @@ -157,9 +180,6 @@ private: 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__ diff --git a/Minecraft.Client/Common/UI/UIScene_MessageBox.h b/Minecraft.Client/Common/UI/UIScene_MessageBox.h index 3c349dea..c10f6ab8 100644 --- a/Minecraft.Client/Common/UI/UIScene_MessageBox.h +++ b/Minecraft.Client/Common/UI/UIScene_MessageBox.h @@ -41,7 +41,8 @@ public: 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; } + virtual bool hidesLowerScenes() { return false; } + virtual bool blocksInput() { return true; } protected: // TODO: This should be pure virtual in this class diff --git a/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.cpp b/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.cpp new file mode 100644 index 00000000..998679ca --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.cpp @@ -0,0 +1,121 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_NewUpdateMessage.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIScene_NewUpdateMessage::UIScene_NewUpdateMessage(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); + + wstring message = app.GetString(IDS_TITLEUPDATE); + message.append(L"\r\n"); + + message=app.FormatHTMLString(m_iPad,message); + + vector paragraphs; + int lastIndex = 0; + for ( int index = message.find(L"\r\n", lastIndex, 2); + index != wstring::npos; + index = message.find(L"\r\n", lastIndex, 2) + ) + { + paragraphs.push_back( message.substr(lastIndex, index-lastIndex) + L" " ); + lastIndex = index + 2; + } + paragraphs.push_back( message.substr( lastIndex, message.length() - lastIndex ) ); + + for(unsigned int i = 0; i < paragraphs.size(); ++i) + { + m_labelDescription.addText(paragraphs[i],i == (paragraphs.size() - 1) ); + } + + m_bIgnoreInput=false; + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_NewUpdateMessage::~UIScene_NewUpdateMessage() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +wstring UIScene_NewUpdateMessage::getMoviePath() +{ + return L"EULA"; +} + +void UIScene_NewUpdateMessage::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT ); +} + +void UIScene_NewUpdateMessage::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) + { + case ACTION_MENU_B: + { + 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); + ui.NavigateBack(m_iPad); + } + break; +#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_NewUpdateMessage::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Confirm: + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + 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); + ui.NavigateBack(m_iPad); + } + break; + }; +} diff --git a/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.h b/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.h new file mode 100644 index 00000000..1529187f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.h @@ -0,0 +1,45 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_NewUpdateMessage : 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_NewUpdateMessage(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_NewUpdateMessage(); + + 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_PauseMenu.cpp b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp index d9569cc9..6f502db8 100644 --- a/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp @@ -428,7 +428,7 @@ void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else // Determine why they're not "signed in live" @@ -439,20 +439,20 @@ void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId() ); } #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); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId() ); #endif } else @@ -493,7 +493,7 @@ void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed 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); + ui.RequestAlertMessage(IDS_ACTION_BAN_LEVEL_TITLE, IDS_ACTION_BAN_LEVEL_DESCRIPTION, uiIDA, 2, iPad,&UIScene_PauseMenu::BanGameDialogReturned,(LPVOID)GetCallbackUniqueId() ); //rfHandled = TRUE; } @@ -524,7 +524,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) // 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); + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else if(!ProfileManager.IsSignedInLive(m_iPad)) { @@ -541,7 +541,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); break;; } @@ -553,7 +553,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::MustSignInReturnedPSN,(LPVOID)GetCallbackUniqueId() ); #elif defined(__ORBIS__) m_eAction=eAction_ViewLeaderboardsPSN; int npAvailability = ProfileManager.getNPAvailability(m_iPad); @@ -562,7 +562,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); } else // Determine why they're not "signed in live" @@ -575,18 +575,18 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId() ); } #else UINT uiIDA[1] = { IDS_OK }; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, m_iPad); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, m_iPad); #endif } else @@ -597,11 +597,11 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) #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 +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE)) // 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); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); #endif } else @@ -627,7 +627,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) { 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); + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else { @@ -671,27 +671,27 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); } } 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } #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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } else { @@ -703,11 +703,11 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); } } else @@ -715,7 +715,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } } #endif @@ -753,7 +753,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } else @@ -788,12 +788,12 @@ void UIScene_PauseMenu::PerformActionSaveGame() // Unlock the full version? if(!ProfileManager.IsSignedInLive(m_iPad)) { -#if defined(__PS3__) +#if defined(__PS3__) || defined (__PSVITA__) 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); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::MustSignInReturnedPSN,(LPVOID)GetCallbackUniqueId()); #elif defined(__ORBIS__) m_eAction=eAction_SaveGamePSN; int npAvailability = ProfileManager.getNPAvailability(m_iPad); @@ -802,7 +802,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); } else // Determine why they're not "signed in live" @@ -813,14 +813,14 @@ void UIScene_PauseMenu::PerformActionSaveGame() UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId()); } #endif } @@ -829,7 +829,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() 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); + ui.RequestAlertMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2,m_iPad,&UIScene_PauseMenu::UnlockFullSaveReturned,(LPVOID)GetCallbackUniqueId()); } return; @@ -865,7 +865,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() 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); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, m_iPad,&UIScene_PauseMenu::WarningTrialTexturePackReturned,(LPVOID)GetCallbackUniqueId()); } return; @@ -888,7 +888,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() 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); + ui.RequestAlertMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DeviceRemovedDialogReturned,(LPVOID)GetCallbackUniqueId()); } else #endif @@ -899,7 +899,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() 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); + ui.RequestAlertMessage(IDS_TITLE_DISABLE_AUTOSAVE, IDS_CONFIRM_DISABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DisableAutosaveDialogReturned,(LPVOID)GetCallbackUniqueId()); } else #endif @@ -909,7 +909,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() 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); + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::SaveGameDialogReturned,(LPVOID)GetCallbackUniqueId()); } else { @@ -917,7 +917,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() 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); + ui.RequestAlertMessage(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,(LPVOID)GetCallbackUniqueId()); #else // flag a app action of save game app.SetAction(m_iPad,eAppAction_SaveGame); @@ -970,7 +970,6 @@ void UIScene_PauseMenu::HandleDLCMountingComplete() 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) @@ -985,7 +984,7 @@ int UIScene_PauseMenu::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage:: { 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); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -1004,11 +1003,12 @@ int UIScene_PauseMenu::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage:: int UIScene_PauseMenu::SaveGame_SignInReturned(void *pParam,bool bContinue, int iPad) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if(pClass) pClass->SetIgnoreInput(false); if(bContinue==true) { - pClass->PerformActionSaveGame(); + if(pClass) pClass->PerformActionSaveGame(); } return 0; @@ -1029,24 +1029,23 @@ int UIScene_PauseMenu::BanGameDialogReturned(void *pParam,int iPad,C4JStorage::E #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) + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if(result==C4JStorage::EMessage_ResultAccept && pClass) { #ifdef __PS3__ switch(pClass->m_eAction) { case eAction_ViewLeaderboardsPSN: - SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pClass); + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pParam); break; case eAction_ViewInvitesPSN: - SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pClass); + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pParam); break; case eAction_SaveGamePSN: - SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pClass); + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pParam); break; case eAction_BuyTexturePackPSN: - SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pClass); + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pParam); break; } #elif defined __PSVITA__ @@ -1059,16 +1058,17 @@ int UIScene_PauseMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::E //Force off CGameNetworkManager::setAdhocMode(false); //Now Sign-in - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pClass); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pParam); break; case eAction_ViewInvitesPSN: - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pClass); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pParam); break; case eAction_SaveGamePSN: - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pClass); + pClass->SetIgnoreInput(true); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pParam, true); break; case eAction_BuyTexturePackPSN: - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pClass); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pParam); break; } #else @@ -1095,7 +1095,8 @@ int UIScene_PauseMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::E int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContinue, int iPad) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if(!pClass) return 0; if(bContinue==true) { @@ -1105,7 +1106,7 @@ int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContin // 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); + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else if(ProfileManager.IsSignedInLive(iPad)) { @@ -1115,7 +1116,7 @@ int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContin 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); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -1130,11 +1131,11 @@ int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContin int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); #ifdef __ORBIS__ // If a patch is available, can't proceed - if (pClass->CheckForPatch()) return 0; + if (!pClass || pClass->CheckForPatch()) return 0; #endif #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) @@ -1142,7 +1143,7 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J { if(!ProfileManager.IsSignedInLive(iPad)) { - pClass->m_eAction=eAction_SaveGamePSN; + if(pClass) 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) @@ -1150,7 +1151,7 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J // 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else // Determine why they're not "signed in live" @@ -1161,20 +1162,20 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } 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); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, pParam); } #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); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, iPad,&UIScene_PauseMenu::MustSignInReturnedPSN,pParam); #endif } else @@ -1187,7 +1188,7 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J { 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); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else #endif @@ -1249,8 +1250,6 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J 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 @@ -1266,7 +1265,7 @@ int UIScene_PauseMenu::BuyTexturePack_SignInReturned(void *pParam,bool bContinue { 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); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else #endif @@ -1350,7 +1349,6 @@ int UIScene_PauseMenu::ViewInvites_SignInReturned(void *pParam,bool bContinue, i 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) @@ -1383,7 +1381,7 @@ int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStora 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); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() ,&UIScene_PauseMenu::WarningTrialTexturePackReturned, pParam); return S_OK; } @@ -1399,7 +1397,7 @@ int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStora 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); + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameAndSaveReturned, pParam); return 0; } else @@ -1416,7 +1414,7 @@ int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStora 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); + ui.RequestAlertMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameDeclineSaveReturned, pParam); return 0; } diff --git a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp index 4f1b9742..0cb6cf2b 100644 --- a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp +++ b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp @@ -16,41 +16,8 @@ UIScene_QuadrantSignin::UIScene_QuadrantSignin(int iPad, void *_initData, UILaye 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); - } - } + + _initQuadrants(); #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) if(InputManager.IsCircleCrossSwapped()) @@ -96,6 +63,8 @@ bool UIScene_QuadrantSignin::hidesLowerScenes() void UIScene_QuadrantSignin::tick() { + if(!getMovie()) return; + UIScene::tick(); updateState(); @@ -115,7 +84,7 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr { if(pressed) { -#ifdef _DURANGO +#ifdef _XBOX_ONE if(InputManager.IsPadLocked(iPad)) { if(iPad != ProfileManager.GetPrimaryPad()) @@ -132,7 +101,7 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr navigateBack(); } } -#ifdef _DURANGO +#ifdef _XBOX_ONE } #endif } @@ -144,12 +113,16 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr if(pressed) { m_bIgnoreInput = true; +#ifdef _XBOX_ONE + if(ProfileManager.IsSignedIn(iPad)&&InputManager.IsPadLocked(iPad)) +#else if(ProfileManager.IsSignedIn(iPad)) +#endif { app.DebugPrintf("Signed in pad pressed\n"); ProfileManager.CancelProfileAvatarRequest(); -#ifdef _DURANGO +#ifdef _XBOX_ONE // 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 @@ -158,8 +131,18 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr } else { - app.DebugPrintf("Non-signed in pad pressed\n"); - ProfileManager.RequestSignInUI(false, false, false, true, true,&UIScene_QuadrantSignin::SignInReturned, this, iPad); +#ifdef _XBOX_ONE + if(ProfileManager.IsSignedIn(0)&&!InputManager.IsPadLocked(0)) + { + app.DebugPrintf("Signed in pad with no controller bound pressed\n"); + ProfileManager.RequestSignInUI(false, false, false, true, false,&UIScene_QuadrantSignin::SignInReturned, this, iPad); + } + else +#endif + { + app.DebugPrintf("Non-signed in pad pressed\n"); + ProfileManager.RequestSignInUI(false, false, false, true, true,&UIScene_QuadrantSignin::SignInReturned, this, iPad); + } } } break; @@ -176,15 +159,23 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr handled = true; } +#ifdef _XBOX_ONE +int UIScene_QuadrantSignin::SignInReturned(void *pParam,bool bContinue, int iPad, int iController) +#else int UIScene_QuadrantSignin::SignInReturned(void *pParam,bool bContinue, int iPad) +#endif { app.DebugPrintf("SignInReturned for pad %d\n", iPad); UIScene_QuadrantSignin *pClass = (UIScene_QuadrantSignin *)pParam; -#ifdef _DURANGO +#ifdef _XBOX_ONE if(bContinue && pClass->m_signInInfo.requireOnline && ProfileManager.IsSignedIn(iPad)) { + if( !InputManager.IsPadLocked(iPad) ) + { + ProfileManager.ForcePrimaryPadController(iController); + } ProfileManager.CheckMultiplayerPrivileges(iPad, true, &checkAllPrivilegesCallback, pClass); } else @@ -197,7 +188,7 @@ int UIScene_QuadrantSignin::SignInReturned(void *pParam,bool bContinue, int iPad return 0; } -#ifdef _DURANGO +#ifdef _XBOX_ONE void UIScene_QuadrantSignin::checkAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad) { UIScene_QuadrantSignin* pClass = (UIScene_QuadrantSignin*)lpParam; @@ -219,7 +210,17 @@ void UIScene_QuadrantSignin::updateState() { //app.DebugPrintf("Index %d is signed in, display name - '%s'\n", i, ProfileManager.GetDisplayName(i).data()); - setControllerState(i, eControllerStatus_PlayerDetails); +#ifdef _XBOX_ONE + if(!InputManager.IsPadLocked(i)) + { + setControllerState(i, eControllerStatus_PressToJoin_LoggedIn); + } + else +#endif + { + setControllerState(i, eControllerStatus_PlayerDetails); + } + m_labelDisplayName[i].setLabel(ProfileManager.GetDisplayName(i)); //m_buttonControllers[i].setLabel(app.GetString(IDS_TOOLTIPS_CONTINUE),i); @@ -289,3 +290,53 @@ int UIScene_QuadrantSignin::AvatarReturned(LPVOID lpParam,PBYTE pbThumbnail,DWOR return 0; } + +void UIScene_QuadrantSignin::_initQuadrants() +{ + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_iconRequested[i] = false; + + m_labelPressToJoin[i].init(IDS_MUST_SIGN_IN_TITLE); + m_labelConnectController[i].init(L""); + m_labelAccountType[i].init(L""); + + m_controllerStatus[i] = eControllerStatus_ConnectController; + + if(ProfileManager.IsSignedIn(i)) + { + app.DebugPrintf("Index %d is signed in\n", i); + +#ifdef _XBOX_ONE + if(!InputManager.IsPadLocked(i)) + { + setControllerState(i, eControllerStatus_PressToJoin_LoggedIn); + } + else +#endif + { + 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); + } + } +} + +void UIScene_QuadrantSignin::handleReload() +{ + _initQuadrants(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h index b500fcc3..691bb199 100644 --- a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h +++ b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h @@ -9,7 +9,9 @@ private: { eControllerStatus_ConnectController, eControllerStatus_PressToJoin, - eControllerStatus_PlayerDetails + eControllerStatus_PlayerDetails, + eControllerStatus_PressToJoin_LoggedIn, + eControllerStatus_PressToJoin_NoController, }; bool m_bIgnoreInput; @@ -98,7 +100,11 @@ public: virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); private: +#ifdef _XBOX_ONE + static int SignInReturned(void *pParam,bool bContinue, int iPad, int iController); +#else static int SignInReturned(void *pParam,bool bContinue, int iPad); +#endif static int AvatarReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); void updateState(); @@ -107,4 +113,9 @@ private: #ifdef _DURANGO static void checkAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad); #endif + +protected: + void _initQuadrants(); + + virtual void handleReload(); }; diff --git a/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp b/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp index a91d5aa8..b58f86fd 100644 --- a/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp @@ -156,10 +156,10 @@ void UIScene_SaveMessage::handleTimerComplete(int id) 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()); + UINT uiIDA[2]; + uiIDA[0]=IDS_CORRUPT_OPTIONS_RETRY; + uiIDA[1]=IDS_CORRUPT_OPTIONS_DELETE; + ui.RequestErrorMessage(IDS_CORRUPT_FILE, IDS_CORRUPT_OPTIONS, uiIDA, 2, 0,&UIScene_SaveMessage::DeleteOptionsDialogReturned,this); break; } #endif @@ -173,10 +173,16 @@ void UIScene_SaveMessage::handleTimerComplete(int id) int UIScene_SaveMessage::DeleteOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { //UIScene_SaveMessage* pClass = (UIScene_SaveMessage*)pParam; - - // kick off the delete - StorageManager.DeleteOptionsData(iPad); - + if(result == C4JStorage::EMessage_ResultAccept) + { + // retry loading the options file + StorageManager.ReadFromProfile(iPad); + } + else // result == EMessage_ResultDecline + { + // kick off the delete + StorageManager.DeleteOptionsData(iPad); + } return 0; } #endif diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp index 4ef7eb5d..39a0b7c6 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp @@ -10,17 +10,17 @@ UIScene_SettingsMenu::UIScene_SettingsMenu(int iPad, void *initData, UILayer *pa 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); + m_buttons[BUTTON_ALL_OPTIONS].init(IDS_OPTIONS,BUTTON_ALL_OPTIONS); + m_buttons[BUTTON_ALL_AUDIO].init(IDS_AUDIO,BUTTON_ALL_AUDIO); + m_buttons[BUTTON_ALL_CONTROL].init(IDS_CONTROL,BUTTON_ALL_CONTROL); + m_buttons[BUTTON_ALL_GRAPHICS].init(IDS_GRAPHICS,BUTTON_ALL_GRAPHICS); + m_buttons[BUTTON_ALL_UI].init(IDS_USER_INTERFACE,BUTTON_ALL_UI); + m_buttons[BUTTON_ALL_RESETTODEFAULTS].init(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); + removeControl( &m_buttons[BUTTON_ALL_AUDIO], bNotInGame); + removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], bNotInGame); } doHorizontalResizeCheck(); @@ -51,10 +51,11 @@ wstring UIScene_SettingsMenu::getMoviePath() void UIScene_SettingsMenu::handleReload() { + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); if(ProfileManager.GetPrimaryPad()!=m_iPad) { - removeControl( &m_buttons[BUTTON_ALL_AUDIO], true); - removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], true); + removeControl( &m_buttons[BUTTON_ALL_AUDIO], bNotInGame); + removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], bNotInGame); } doHorizontalResizeCheck(); @@ -142,7 +143,7 @@ void UIScene_SettingsMenu::handlePress(F64 controlId, F64 childId) 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); + ui.RequestAlertMessage(IDS_DEFAULTS_TITLE, IDS_DEFAULTS_TEXT, uiIDA, 2, m_iPad,&UIScene_SettingsMenu::ResetDefaultsDialogReturned,this); } break; } diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp index 72576ded..6898d489 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp @@ -2,6 +2,10 @@ #include "UI.h" #include "UIScene_SettingsOptionsMenu.h" +#if defined(_XBOX_ONE) +#define _ENABLE_LANGUAGE_SELECT +#endif + int UIScene_SettingsOptionsMenu::m_iDifficultySettingA[4]= { IDS_DIFFICULTY_PEACEFUL, @@ -20,22 +24,24 @@ int UIScene_SettingsOptionsMenu::m_iDifficultyTitleSettingA[4]= UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) { + m_bNavigateToLanguageSelector = false; + // 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)); + m_checkboxViewBob.init(IDS_VIEW_BOBBING,eControl_ViewBob,(app.GetGameSettings(m_iPad,eGameSetting_ViewBob)!=0)); + m_checkboxShowHints.init(IDS_HINTS,eControl_ShowHints,(app.GetGameSettings(m_iPad,eGameSetting_Hints)!=0)); + m_checkboxShowTooltips.init(IDS_IN_GAME_TOOLTIPS,eControl_ShowTooltips,(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)!=0)); + m_checkboxInGameGamertags.init(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); + m_checkboxMashupWorlds.init(IDS_UNHIDE_MASHUP_WORLDS,eControl_ShowMashUpWorlds,false); } else { @@ -92,7 +98,6 @@ UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initDat 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; @@ -128,6 +133,22 @@ UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initDat removeControl(&m_checkboxInGameGamertags, true); } + // 4J-JEV: Changing languages in-game will produce many a bug. + // MGH - disabled the language select for the patch build, we'll re-enable afterwards + // 4J Stu - Removed it with a preprocessor def as we turn this off in various places +#ifdef _ENABLE_LANGUAGE_SELECT + if (app.GetGameStarted()) + { + removeControl( &m_buttonLanguageSelect, false ); + } + else + { + m_buttonLanguageSelect.init(IDS_LANGUAGE_SELECTOR, eControl_Languages); + } +#else + removeControl( &m_buttonLanguageSelect, false ); +#endif + doHorizontalResizeCheck(); if(app.GetLocalPlayerCount()>1) @@ -136,12 +157,26 @@ UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initDat app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); #endif } + + m_labelDifficultyText.disableReinitialisation(); } UIScene_SettingsOptionsMenu::~UIScene_SettingsOptionsMenu() { } +void UIScene_SettingsOptionsMenu::tick() +{ + UIScene::tick(); + + if (m_bNavigateToLanguageSelector) + { + m_bNavigateToLanguageSelector = false; + setGameSettings(); + ui.NavigateToScene(m_iPad, eUIScene_LanguageSelector); + } +} + wstring UIScene_SettingsOptionsMenu::getMoviePath() { if(app.GetLocalPlayerCount() > 1) @@ -173,7 +208,6 @@ void UIScene_SettingsOptionsMenu::updateComponents() if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,RenderManager.IsHiDef()); else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); - } } @@ -185,22 +219,7 @@ void UIScene_SettingsOptionsMenu::handleInput(int iPad, int key, bool repeat, bo 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); - + setGameSettings(); navigateBack(); } break; @@ -219,9 +238,146 @@ void UIScene_SettingsOptionsMenu::handleInput(int iPad, int key, bool repeat, bo } } +void UIScene_SettingsOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((int)controlId) + { + case eControl_Languages: + m_bNavigateToLanguageSelector = true; + break; + } +} + +void UIScene_SettingsOptionsMenu::handleReload() +{ + m_bNavigateToLanguageSelector = false; + + m_checkboxViewBob.init(IDS_VIEW_BOBBING,eControl_ViewBob,(app.GetGameSettings(m_iPad,eGameSetting_ViewBob)!=0)); + m_checkboxShowHints.init(IDS_HINTS,eControl_ShowHints,(app.GetGameSettings(m_iPad,eGameSetting_Hints)!=0)); + m_checkboxShowTooltips.init(IDS_IN_GAME_TOOLTIPS,eControl_ShowTooltips,(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)!=0)); + m_checkboxInGameGamertags.init(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; + } + 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; + + 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); + } + + // MGH - disabled the language select for the patch build, we'll re-enable afterwards + // 4J Stu - Removed it with a preprocessor def as we turn this off in various places +#ifdef _ENABLE_LANGUAGE_SELECT + // 4J-JEV: Changing languages in-game will produce many a bug. + if (app.GetGameStarted()) + { + removeControl( &m_buttonLanguageSelect, false ); + } + else + { + } +#else + removeControl( &m_buttonLanguageSelect, false ); +#endif + + doHorizontalResizeCheck(); +} + void UIScene_SettingsOptionsMenu::handleSliderMove(F64 sliderId, F64 currentValue) { - WCHAR TempString[256]; int value = (int)currentValue; switch((int)sliderId) { @@ -251,3 +407,22 @@ void UIScene_SettingsOptionsMenu::handleSliderMove(F64 sliderId, F64 currentValu break; } } + +void UIScene_SettingsOptionsMenu::setGameSettings() +{ + // 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); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h index 265a0790..e9abb0a9 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h @@ -13,6 +13,7 @@ private: eControl_InGameGamertags, eControl_ShowMashUpWorlds, eControl_Autosave, + eControl_Languages, eControl_Difficulty }; protected: @@ -23,6 +24,8 @@ 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 + UIControl_Button m_buttonLanguageSelect; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) UI_MAP_ELEMENT( m_checkboxViewBob, "ViewBob") UI_MAP_ELEMENT( m_checkboxShowHints, "ShowHints") @@ -32,16 +35,21 @@ private: UI_MAP_ELEMENT( m_sliderAutosave, "Autosave") UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") UI_MAP_ELEMENT( m_labelDifficultyText, "DifficultyText") + UI_MAP_ELEMENT( m_buttonLanguageSelect, "Languages") UI_END_MAP_ELEMENTS_AND_NAMES() bool m_bNotInGame; bool m_bMashUpWorldsUnhideOption; + bool m_bNavigateToLanguageSelector; + public: UIScene_SettingsOptionsMenu(int iPad, void *initData, UILayer *parentLayer); virtual ~UIScene_SettingsOptionsMenu(); virtual EUIScene getSceneType() { return eUIScene_SettingsOptionsMenu;} + virtual void tick(); + virtual void updateTooltips(); virtual void updateComponents(); @@ -52,6 +60,13 @@ protected: 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 handleReload(); virtual void handleSliderMove(F64 sliderId, F64 currentValue); + +protected: + void setGameSettings(); + }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp index 33f41994..d4f26ae7 100644 --- a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp @@ -222,170 +222,7 @@ void UIScene_SkinSelectMenu::handleInput(int iPad, int key, bool repeat, bool pr #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; - } + InputActionOK(iPad); } break; case ACTION_MENU_UP: @@ -614,17 +451,62 @@ void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) //if(true) if(!m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() )) { +#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]; uiIDA[0]=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.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + } + 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); + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1,iPad); } -#if defined(__PS3__) || defined(__ORBIS__) +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ // are we online? else if(!ProfileManager.IsSignedInLive(iPad)) { @@ -656,11 +538,11 @@ void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) #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 +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE)) // 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); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); #endif } else @@ -674,7 +556,7 @@ void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) 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); + ui.RequestAlertMessage(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, iPad,&UIScene_SkinSelectMenu::UnlockSkinReturned,this); } } } @@ -703,7 +585,10 @@ void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) AddFavoriteSkin(iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); } - if (renableInputAfterOperation) m_bIgnoreInput = false; + if (renableInputAfterOperation) + { + m_bIgnoreInput = false; + } } ui.PlayUISFX(eSFX_Press); @@ -1652,7 +1537,18 @@ void UIScene_SkinSelectMenu::showNotOnlineDialog(int iPad) SQRNetworkManager_PS3::AttemptPSNSignIn(NULL, this); #elif defined(__PSVITA__) - SQRNetworkManager_Vita::AttemptPSNSignIn(NULL, this); + if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + // we're in adhoc mode, we really need to ask before disconnecting + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_CANCEL; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_SkinSelectMenu::MustSignInReturned,NULL); + } + else + { + SQRNetworkManager_Vita::AttemptPSNSignIn(NULL, this); + } #elif defined(__ORBIS__) SQRNetworkManager_Orbis::AttemptPSNSignIn(NULL, this, false, iPad); @@ -1660,7 +1556,7 @@ void UIScene_SkinSelectMenu::showNotOnlineDialog(int 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() ); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad ); #endif } @@ -1723,9 +1619,9 @@ int UIScene_SkinSelectMenu::UnlockSkinReturned(void *pParam,int iPad,C4JStorage: 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; } + // need to re-enable input because the user can back out of the store purchase, and we'll be stuck + pScene->m_bIgnoreInput = false; // MGH - moved this to outside the pSONYDLCInfo, so we don't get stuck #elif defined _XBOX_ONE StorageManager.InstallOffer(1,(WCHAR *)(pScene->m_currentPack->getPurchaseOfferId().c_str()), &RenableInput, pScene, NULL); #endif @@ -1810,4 +1706,32 @@ void UIScene_SkinSelectMenu::HandleDLCLicenseChange() // update the lock flag handleSkinIndexChanged(); } -#endif \ No newline at end of file +#endif + + + + +#ifdef __PSVITA__ +int UIScene_SkinSelectMenu::MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_SkinSelectMenu::PSNSignInReturned, pParam,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_SkinSelectMenu::PSNSignInReturned, pParam,true); +#elif defined __ORBIS__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_SkinSelectMenu::PSNSignInReturned, pParam,true); +#endif + } + return 0; +} + +int UIScene_SkinSelectMenu::PSNSignInReturned(void* pParam, bool bContinue, int iPad) +{ + if( bContinue ) + { + } + return 0; +} +#endif // __PSVITA__ \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h index c9ed6691..e8d76096 100644 --- a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h @@ -183,6 +183,12 @@ private: bool m_bErrorDialogRunning; #endif +#ifdef __PSVITA__ + static int MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int PSNSignInReturned(void* pParam, bool bContinue, int iPad); +#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_Timer.cpp b/Minecraft.Client/Common/UI/UIScene_Timer.cpp index 61586e87..3dec20a3 100644 --- a/Minecraft.Client/Common/UI/UIScene_Timer.cpp +++ b/Minecraft.Client/Common/UI/UIScene_Timer.cpp @@ -20,7 +20,7 @@ wstring UIScene_Timer::getMoviePath() return L"Timer"; } -void UIScene_Timer::reloadMovie() +void UIScene_Timer::reloadMovie(bool force) { // Never needs reloaded } diff --git a/Minecraft.Client/Common/UI/UIScene_Timer.h b/Minecraft.Client/Common/UI/UIScene_Timer.h index 5a75103a..ef6aae94 100644 --- a/Minecraft.Client/Common/UI/UIScene_Timer.h +++ b/Minecraft.Client/Common/UI/UIScene_Timer.h @@ -20,7 +20,7 @@ public: // 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 void reloadMovie(bool force); virtual bool needsReloaded(); protected: diff --git a/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp index dc2bac48..0a35c8e5 100644 --- a/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "UI.h" #include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" #include "..\..\..\Minecraft.World\net.minecraft.world.item.trading.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "MultiPlayerLocalPlayer.h" @@ -118,6 +119,15 @@ void UIScene_TradingMenu::handleReload() m_slotListInventory.addSlots(MerchantMenu::INV_SLOT_START, 27); m_slotListHotbar.addSlots(MerchantMenu::USE_ROW_SLOT_START, 9); + + updateDisplay(); + + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_selectedSlot; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetActiveSlot , 1 , value ); } void UIScene_TradingMenu::tick() @@ -253,16 +263,33 @@ void UIScene_TradingMenu::setTradeRedBox(int index, bool show) m_slotListTrades.showSlotRedBox(index,show); } -void UIScene_TradingMenu::setOfferDescription(const wstring &name, vector &unformattedStrings) +void UIScene_TradingMenu::setOfferDescription(vector *description) { + wstring descriptionStr = HtmlString::Compose(description); + IggyDataValue result; IggyDataValue value[1]; IggyStringUTF16 stringVal; - stringVal.string = (IggyUTF16*)name.c_str(); - stringVal.length = name.length(); + stringVal.string = (IggyUTF16*)descriptionStr.c_str(); + stringVal.length = descriptionStr.length(); value[0].type = IGGY_DATATYPE_string_UTF16; value[0].string16 = stringVal; IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetOfferDescription , 1 , value ); } + +void UIScene_TradingMenu::HandleMessage(EUIMessage message, void *data) +{ + switch(message) + { + case eUIMessage_InventoryUpdated: + handleInventoryUpdated(data); + break; + }; +} + +void UIScene_TradingMenu::handleInventoryUpdated(LPVOID data) +{ + HandleInventoryUpdated(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_TradingMenu.h b/Minecraft.Client/Common/UI/UIScene_TradingMenu.h index 08263a1c..a22ba0cf 100644 --- a/Minecraft.Client/Common/UI/UIScene_TradingMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.h @@ -23,7 +23,7 @@ protected: UIControl_Label m_labelTrading, m_labelRequired; UIControl_Label m_labelRequest1, m_labelRequest2; - IggyName m_funcMoveSelector, m_funcShowScrollRightArrow, m_funcShowScrollLeftArrow, m_funcSetOfferDescription; + IggyName m_funcMoveSelector, m_funcShowScrollRightArrow, m_funcShowScrollLeftArrow, m_funcSetOfferDescription, m_funcSetActiveSlot; UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) @@ -48,6 +48,7 @@ protected: UI_MAP_NAME(m_funcShowScrollRightArrow, L"ShowScrollRightArrow") UI_MAP_NAME(m_funcShowScrollLeftArrow, L"ShowScrollLeftArrow") UI_MAP_NAME(m_funcSetOfferDescription, L"SetOfferDescription") + UI_MAP_NAME(m_funcSetActiveSlot, L"SetSelectorSlot") UI_END_MAP_ELEMENTS_AND_NAMES() virtual wstring getMoviePath(); @@ -72,7 +73,10 @@ protected: virtual void setRequest2RedBox(bool show); virtual void setTradeRedBox(int index, bool show); - virtual void setOfferDescription(const wstring &name, vector &unformattedStrings); + virtual void setOfferDescription(vector *description); + + virtual void HandleMessage(EUIMessage message, void *data); + void handleInventoryUpdated(LPVOID data); 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 index b395bc4c..9ef8f189 100644 --- a/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp +++ b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp @@ -55,7 +55,7 @@ void UIScene_TrialExitUpsell::handleInput(int iPad, int key, bool repeat, bool p { 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()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif diff --git a/Minecraft.Client/Common/UI/UIString.cpp b/Minecraft.Client/Common/UI/UIString.cpp new file mode 100644 index 00000000..288fa87a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIString.cpp @@ -0,0 +1,176 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" + +#include "UIString.h" + +bool UIString::setCurrentLanguage() +{ + int nextLanguage, nextLocale; + nextLanguage = XGetLanguage(); + nextLocale = XGetLocale(); + + if ( (nextLanguage != s_currentLanguage) || (nextLocale != s_currentLocale) ) + { + s_currentLanguage = nextLanguage; + s_currentLocale = nextLocale; + return true; + } + + return false; +} + +int UIString::getCurrentLanguage() +{ + return s_currentLanguage; +} + +UIString::UIStringCore::UIStringCore(StringBuilder wstrBuilder) +{ + m_bIsConstant = false; + + m_lastSetLanguage = m_lastSetLocale = -1; + m_lastUpdatedLanguage = m_lastUpdatedLocale = -1; + + m_fStringBuilder = wstrBuilder; + + m_wstrCache = L""; + update(true); +} + +UIString::UIStringCore::UIStringCore(const wstring &str) +{ + m_bIsConstant = true; + + m_lastSetLanguage = m_lastSetLocale = -1; + m_lastUpdatedLanguage = m_lastUpdatedLocale = -1; + + m_wstrCache = str; +} + +wstring &UIString::UIStringCore::getString() +{ + if (hasNewString()) update(true); + return m_wstrCache; +} + +bool UIString::UIStringCore::hasNewString() +{ + if (m_bIsConstant) return false; + return (m_lastSetLanguage != s_currentLanguage) || (m_lastSetLocale != s_currentLocale); +} + +bool UIString::UIStringCore::update(bool force) +{ + if ( !m_bIsConstant && (force || hasNewString()) ) + { + m_wstrCache = m_fStringBuilder(); + m_lastSetLanguage = s_currentLanguage; + m_lastSetLocale = s_currentLocale; + return true; + } + return false; +} + +bool UIString::UIStringCore::needsUpdating() +{ + if (m_bIsConstant) return false; + return (m_lastSetLanguage != s_currentLanguage) || (m_lastUpdatedLanguage != m_lastSetLanguage) + || (m_lastSetLocale != s_currentLocale) || (m_lastUpdatedLocale != m_lastSetLocale); +} + +void UIString::UIStringCore::setUpdated() +{ + m_lastUpdatedLanguage = m_lastSetLanguage; + m_lastUpdatedLocale = m_lastSetLocale; +} + +int UIString::s_currentLanguage = -1; +int UIString::s_currentLocale = -1; + +UIString::UIString() +{ + m_core = shared_ptr(); +} + +UIString::UIString(int ids) +{ +#ifdef __PS3__ + StringBuilder builder = StringBuilder( new IdsStringBuilder(ids) ); +#else + StringBuilder builder = [ids](){ return app.GetString(ids); }; +#endif + UIStringCore *core = new UIStringCore( builder ); + m_core = shared_ptr(core); +} + +UIString::UIString(StringBuilder wstrBuilder) +{ + UIStringCore *core = new UIStringCore(wstrBuilder); + m_core = shared_ptr(core); +} + +UIString::UIString(const string &constant) +{ + wstring wstr = convStringToWstring(constant); + UIStringCore *core = new UIStringCore( wstr ); + m_core = shared_ptr(core); +} + +UIString::UIString(const wstring &constant) +{ + UIStringCore *core = new UIStringCore(constant); + m_core = shared_ptr(core); +} + +UIString::UIString(const wchar_t *constant) +{ + wstring str = wstring(constant); + UIStringCore *core = new UIStringCore(str); + m_core = shared_ptr(core); +} + +UIString::~UIString() +{ +#ifndef __PS3__ + m_core = nullptr; +#endif +} + +bool UIString::empty() +{ + return m_core.get() == NULL; +} + +bool UIString::compare(const UIString &uiString) +{ + return m_core.get() != uiString.m_core.get(); +} + +bool UIString::needsUpdating() +{ + if (m_core != NULL) return m_core->needsUpdating(); + else return false; +} + +void UIString::setUpdated() +{ + if (m_core != NULL) m_core->setUpdated(); +} + +wstring &UIString::getString() +{ + static wstring blank(L""); + if (m_core != NULL) return m_core->getString(); + else return blank; +} + +const wchar_t *UIString::c_str() +{ + return getString().c_str(); +} + +unsigned int UIString::length() +{ + return getString().length(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIString.h b/Minecraft.Client/Common/UI/UIString.h new file mode 100644 index 00000000..29e5a068 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIString.h @@ -0,0 +1,103 @@ +#pragma once + +#include +#include + + +#ifndef __PS3__ + +typedef function StringBuilder; + +#else + +class StringBuilderCore +{ +public: + virtual wstring getString() = 0; +}; + +struct StringBuilder +{ + shared_ptr m_coreBuilder; + virtual wstring operator()() { return m_coreBuilder->getString(); } + StringBuilder() {} + StringBuilder(StringBuilderCore *core) { m_coreBuilder = shared_ptr(core); } +}; + +class IdsStringBuilder : public StringBuilderCore +{ + const int m_ids; +public: + IdsStringBuilder(int ids) : m_ids(ids) {} + virtual wstring getString(void) { return app.GetString(m_ids); } +}; +#endif + +using namespace std; + +class UIString +{ +protected: + static int s_currentLanguage; + static int s_currentLocale; + +public: + static bool setCurrentLanguage(); + static int getCurrentLanguage(); + +protected: + class UIStringCore : public enable_shared_from_this + { + private: + int m_lastSetLanguage; + int m_lastSetLocale; + + int m_lastUpdatedLanguage; + int m_lastUpdatedLocale; + + wstring m_wstrCache; + + bool m_bIsConstant; + + StringBuilder m_fStringBuilder; + + public: + UIStringCore(StringBuilder wstrBuilder); + UIStringCore(const wstring &str); + + wstring &getString(); + + bool hasNewString(); + bool update(bool force); + + bool needsUpdating(); + void setUpdated(); + }; + + shared_ptr m_core; + +public: + UIString(); + + UIString(int ids); // Create a dynamic UI string from a string id value. + + UIString(StringBuilder wstrBuilder); // Create a dynamic UI string with a custom update function. + + // Create a UIString with a constant value. + UIString(const string &constant); + UIString(const wstring &constant); + UIString(const wchar_t *constant); + + ~UIString(); + + bool empty(); + bool compare(const UIString &uiString); + + bool needsUpdating(); // Language has been change since the last time setUpdated was called. + void setUpdated(); // The new text has been used. + + wstring &getString(); + + const wchar_t *c_str(); + unsigned int length(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIStructs.h b/Minecraft.Client/Common/UI/UIStructs.h index 2dd03c8c..c41f2276 100644 --- a/Minecraft.Client/Common/UI/UIStructs.h +++ b/Minecraft.Client/Common/UI/UIStructs.h @@ -13,6 +13,10 @@ class SignTileEntity; class LevelGenerationOptions; class LocalPlayer; class Merchant; +class EntityHorse; +class BeaconTileEntity; +class Slot; +class AbstractContainerMenu; // 4J Stu - Structs shared by Iggy and Xui scenes. typedef struct _UIVec2D @@ -74,7 +78,9 @@ typedef struct _EnchantingScreenInput int z; int iPad; bool bSplitscreen; -} EnchantingScreenInput; + wstring name; +} +EnchantingScreenInput; // Furnace typedef struct _FurnaceScreenInput @@ -98,6 +104,18 @@ typedef struct _CraftingPanelScreenInput } CraftingPanelScreenInput; +// Fireworks +typedef struct _FireworksScreenInput +{ + shared_ptr player; + bool bSplitscreen; + int iPad; + int x; + int y; + int z; +} +FireworksScreenInput; + // Trading typedef struct _TradingScreenInput { @@ -122,6 +140,37 @@ typedef struct _AnvilScreenInput } AnvilScreenInput; +// Hopper +typedef struct _HopperScreenInput +{ + shared_ptr inventory; + shared_ptr hopper; + int iPad; + bool bSplitscreen; +} +HopperScreenInput; + +// Horse +typedef struct _HorseScreenInput +{ + shared_ptr inventory; + shared_ptr container; + shared_ptr horse; + int iPad; + bool bSplitscreen; +} +HorseScreenInput; + +// Beacon +typedef struct _BeaconScreenInput +{ + shared_ptr inventory; + shared_ptr beacon; + int iPad; + bool bSplitscreen; +} +BeaconScreenInput; + // Sign typedef struct _SignEntryScreenInput { @@ -236,24 +285,32 @@ typedef struct _JoinMenuInitData // More Options typedef struct _LaunchMoreOptionsMenuInitData { - BOOL bOnlineGame; - BOOL bInviteOnly; - BOOL bAllowFriendsOfFriends; + bool bOnlineGame; + bool bInviteOnly; + bool bAllowFriendsOfFriends; + + bool bGenerateOptions; + bool bStructures; + bool bFlatWorld; + bool bBonusChest; - BOOL bGenerateOptions; - BOOL bStructures; - BOOL bFlatWorld; - BOOL bBonusChest; + bool bPVP; + bool bTrust; + bool bFireSpreads; + bool bTNT; - BOOL bPVP; - BOOL bTrust; - BOOL bFireSpreads; - BOOL bTNT; + bool bHostPrivileges; + bool bResetNether; - BOOL bHostPrivileges; - BOOL bResetNether; + bool bMobGriefing; + bool bKeepInventory; + bool bDoMobSpawning; + bool bDoMobLoot; + bool bDoTileDrops; + bool bNaturalRegeneration; + bool bDoDaylightCycle; - BOOL bOnlineSettingChangedBySystem; + bool bOnlineSettingChangedBySystem; int iPad; @@ -263,18 +320,32 @@ typedef struct _LaunchMoreOptionsMenuInitData int worldSize; bool bDisableSaving; + EGameHostOptionWorldSize currentWorldSize; + EGameHostOptionWorldSize newWorldSize; + bool newWorldSizeOverwriteEdges; + _LaunchMoreOptionsMenuInitData() { memset(this,0,sizeof(_LaunchMoreOptionsMenuInitData)); - bOnlineGame = TRUE; - bAllowFriendsOfFriends = TRUE; - bPVP = TRUE; - bFireSpreads = TRUE; - bTNT = TRUE; + bOnlineGame = true; + bAllowFriendsOfFriends = true; + bPVP = true; + bFireSpreads = true; + bTNT = true; iPad = -1; worldSize = 3; seed = L""; bDisableSaving = false; + newWorldSize = e_worldSize_Unknown; + newWorldSizeOverwriteEdges = false; + + bMobGriefing = true; + bKeepInventory = false; + bDoMobSpawning = true; + bDoMobLoot = true; + bDoTileDrops = true; + bNaturalRegeneration = true; + bDoDaylightCycle = true; } } LaunchMoreOptionsMenuInitData; @@ -407,3 +478,10 @@ typedef struct _CustomDrawData float x0, y0, x1, y1; // the bounding box of the original DisplayObject, in object space float mat[16]; } CustomDrawData; + +typedef struct _ItemEditorInput +{ + int iPad; + Slot *slot; + AbstractContainerMenu *menu; +} ItemEditorInput; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UITTFFont.cpp b/Minecraft.Client/Common/UI/UITTFFont.cpp index eb343382..5d72ed97 100644 --- a/Minecraft.Client/Common/UI/UITTFFont.cpp +++ b/Minecraft.Client/Common/UI/UITTFFont.cpp @@ -4,7 +4,8 @@ #include "..\..\..\Minecraft.World\File.h" #include "UITTFFont.h" -UITTFFont::UITTFFont(const string &path, S32 fallbackCharacter) +UITTFFont::UITTFFont(const string &name, const string &path, S32 fallbackCharacter) + : m_strFontName(name) { app.DebugPrintf("UITTFFont opening %s\n",path.c_str()); @@ -36,9 +37,9 @@ UITTFFont::UITTFFont(const string &path, S32 fallbackCharacter) } CloseHandle(file); - IggyFontInstallTruetypeUTF8 ( (void *)pbData, IGGY_TTC_INDEX_none, "Mojangles_TTF", -1, IGGY_FONTFLAG_none ); + IggyFontInstallTruetypeUTF8 ( (void *)pbData, IGGY_TTC_INDEX_none, m_strFontName.c_str(), -1, IGGY_FONTFLAG_none ); - IggyFontInstallTruetypeFallbackCodepointUTF8( "Mojangles_TTF", -1, IGGY_FONTFLAG_none, fallbackCharacter ); + IggyFontInstallTruetypeFallbackCodepointUTF8( m_strFontName.c_str(), -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 ); @@ -48,4 +49,10 @@ UITTFFont::UITTFFont(const string &path, S32 fallbackCharacter) UITTFFont::~UITTFFont() { +} + + +string UITTFFont::getFontName() +{ + return m_strFontName; } \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UITTFFont.h b/Minecraft.Client/Common/UI/UITTFFont.h index 0de7c4e0..023bd51b 100644 --- a/Minecraft.Client/Common/UI/UITTFFont.h +++ b/Minecraft.Client/Common/UI/UITTFFont.h @@ -3,10 +3,14 @@ class UITTFFont { private: + const string m_strFontName; + PBYTE pbData; //DWORD dwDataSize; public: - UITTFFont(const string &path, S32 fallbackCharacter); + UITTFFont(const string &name, const string &path, S32 fallbackCharacter); ~UITTFFont(); + + string getFontName(); }; diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp index f2e865fc..2eae0020 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp 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 index 50d5d4ee..7c548119 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Cartoon/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Cartoon/Data/TexturePack.xzp new file mode 100644 index 00000000..9ceb5e40 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Cartoon/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Cartoon/Data/x32Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Cartoon/Data/x32Data.pck new file mode 100644 index 00000000..f8c3536f Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Cartoon/Data/x32Data.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 index b2d02efd..d96eeeee 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/TexturePack.xzp 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 index 4968ba01..52f0f98f 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/x32Data.pck 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 index 87fc9d91..00b9d61c 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp 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 index 9d909b93..103a8d82 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/Festive.mcs b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/Festive.mcs new file mode 100644 index 00000000..1d3dd63d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/Festive.mcs differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/GameRules.grf b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/GameRules.grf new file mode 100644 index 00000000..a260f16b Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/GameRules.grf differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/TexturePack.xzp new file mode 100644 index 00000000..d458e2e8 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/x16Data.pck new file mode 100644 index 00000000..6c9439cb Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/TexturePack.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/TexturePack.pck new file mode 100644 index 00000000..11a01367 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Festive/TexturePack.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 index ce7ea034..ca0a01ad 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/TexturePack.xzp 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 index 9da2ef1b..f519e006 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck 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 index 73339be4..908ce222 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp 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 index 63d88194..7e2c79bf 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/x16Data.pck 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 index fddfbb38..5820cd20 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck 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 index 5b2df78a..3f021e56 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/TexturePack.xzp 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 index c3e1cb8d..fdb2b532 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/masseffect.mcs 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 index 2c01acae..85ac50a8 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/x16Data.pck 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 index e0576ed8..1b60faf7 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/TexturePack.pck 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 index 34f7dc99..a5509dff 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/TexturePack.xzp 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 index 4224184c..d211b05c 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/x32Data.pck 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 index 033840eb..3f3cceea 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/TexturePack.xzp 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 index b5b5c14a..3e9f17fd 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck 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 index 45c24d41..a0ad5910 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp 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 index 82a5965d..1560a2c1 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck 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 index 2dc382a1..2f52919d 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/TexturePack.pck and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/TexturePack.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Steampunk/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Steampunk/Data/TexturePack.xzp new file mode 100644 index 00000000..1672acd8 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Steampunk/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Steampunk/Data/x32Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Steampunk/Data/x32Data.pck new file mode 100644 index 00000000..795346cb Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Steampunk/Data/x32Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.mcs b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.mcs new file mode 100644 index 00000000..9a50985e Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.mcs differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.pck b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.pck index 8f44945b..e506da13 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.pck and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/1.6.4.xwb b/Minecraft.Client/Common/res/TitleUpdate/audio/1.6.4.xwb new file mode 100644 index 00000000..f2723fcc Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/1.6.4.xwb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs b/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs index 5d6c55be..c6e34ce0 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs 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 index e60b3524..86c6ac69 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb and b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/colours.col b/Minecraft.Client/Common/res/TitleUpdate/res/colours.col index abe91ebe..ebdcf7a9 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/res/colours.col 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 index f6a85645..6c45b660 100644 --- a/Minecraft.Client/Common/res/TitleUpdate/res/colours.xml +++ b/Minecraft.Client/Common/res/TitleUpdate/res/colours.xml @@ -218,6 +218,10 @@ if __name__=="__main__": notecolors() + + + + @@ -263,6 +267,12 @@ if __name__=="__main__": notecolors() + + + + + + @@ -280,4 +290,10 @@ if __name__=="__main__": notecolors() + + + + + + \ 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 index 07ec8d9d..9c499811 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/res/font/Default.png 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 index cfa86446..32cbd515 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_11.png 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 index 9de84520..7a1b3870 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png and b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/christmas.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/christmas.png new file mode 100644 index 00000000..44591121 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/christmas.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/christmas_double.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/christmas_double.png new file mode 100644 index 00000000..9e44eebb Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/christmas_double.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/lead_knot.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/lead_knot.png new file mode 100644 index 00000000..ab4d3b3a Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/lead_knot.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/trapped.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/trapped.png new file mode 100644 index 00000000..3aef1901 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/trapped.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/trapped_double.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/trapped_double.png new file mode 100644 index 00000000..00eebe5d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/trapped_double.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/items.png b/Minecraft.Client/Common/res/TitleUpdate/res/items.png index c86026a0..5456083c 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/res/items.png and b/Minecraft.Client/Common/res/TitleUpdate/res/items.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/beacon_beam.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/beacon_beam.png new file mode 100644 index 00000000..67545b45 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/beacon_beam.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/bat.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/bat.png new file mode 100644 index 00000000..803860ed Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/bat.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_diamond.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_diamond.png new file mode 100644 index 00000000..39068f25 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_diamond.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_gold.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_gold.png new file mode 100644 index 00000000..4a0786de Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_gold.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_iron.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_iron.png new file mode 100644 index 00000000..533b2dd9 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/armor/horse_armor_iron.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/donkey.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/donkey.png new file mode 100644 index 00000000..b94bc630 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/donkey.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_black.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_black.png new file mode 100644 index 00000000..dde716e2 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_black.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_brown.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_brown.png new file mode 100644 index 00000000..ec0158f4 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_brown.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_chestnut.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_chestnut.png new file mode 100644 index 00000000..40322ff9 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_chestnut.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_creamy.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_creamy.png new file mode 100644 index 00000000..bc42bcce Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_creamy.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_darkbrown.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_darkbrown.png new file mode 100644 index 00000000..b38e914c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_darkbrown.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_gray.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_gray.png new file mode 100644 index 00000000..49875329 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_gray.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_blackdots.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_blackdots.png new file mode 100644 index 00000000..73206486 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_blackdots.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_white.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_white.png new file mode 100644 index 00000000..b1f0a697 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_white.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_whitedots.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_whitedots.png new file mode 100644 index 00000000..20e19546 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_whitedots.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_whitefield.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_whitefield.png new file mode 100644 index 00000000..baa2c06f Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_markings_whitefield.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_skeleton.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_skeleton.png new file mode 100644 index 00000000..29d4ed5d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_skeleton.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_white.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_white.png new file mode 100644 index 00000000..e90e6e7f Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_white.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_zombie.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_zombie.png new file mode 100644 index 00000000..22d55faa Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/horse_zombie.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/mule.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/mule.png new file mode 100644 index 00000000..241bdaac Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/horse/mule.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/witch.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/witch.png new file mode 100644 index 00000000..24035708 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/witch.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither.png new file mode 100644 index 00000000..0882d052 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither_armor.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither_armor.png new file mode 100644 index 00000000..a6b5cf5b Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither_armor.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither_invulnerable.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither_invulnerable.png new file mode 100644 index 00000000..717750b4 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wither/wither_invulnerable.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png b/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png index d5d3751d..0246b41d 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png 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 index 771bb2d5..02686b3e 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel2.png 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 index 900ba0f3..dddef615 100644 Binary files a/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png and b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png differ diff --git a/Minecraft.Client/CompassTexture.cpp b/Minecraft.Client/CompassTexture.cpp index 93d6a62c..bba43b78 100644 --- a/Minecraft.Client/CompassTexture.cpp +++ b/Minecraft.Client/CompassTexture.cpp @@ -9,7 +9,7 @@ CompassTexture *CompassTexture::instance = NULL; -CompassTexture::CompassTexture() : StitchedTexture(L"compass") +CompassTexture::CompassTexture() : StitchedTexture(L"compass",L"compass") { instance = this; @@ -19,7 +19,7 @@ CompassTexture::CompassTexture() : StitchedTexture(L"compass") rot = rota = 0.0; } -CompassTexture::CompassTexture(int iPad, CompassTexture *dataTexture) : StitchedTexture(L"compass") +CompassTexture::CompassTexture(int iPad, CompassTexture *dataTexture) : StitchedTexture(L"compass",L"compass") { m_dataTexture = dataTexture; m_iPad = iPad; diff --git a/Minecraft.Client/CowRenderer.cpp b/Minecraft.Client/CowRenderer.cpp index c4eaf261..ee0dd99f 100644 --- a/Minecraft.Client/CowRenderer.cpp +++ b/Minecraft.Client/CowRenderer.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" #include "CowRenderer.h" +ResourceLocation CowRenderer::COW_LOCATION = ResourceLocation(TN_MOB_COW); + CowRenderer::CowRenderer(Model *model, float shadow) : MobRenderer(model, shadow) { } @@ -8,4 +10,9 @@ CowRenderer::CowRenderer(Model *model, float shadow) : MobRenderer(model, shadow void CowRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { MobRenderer::render(_mob, x, y, z, rot, a); +} + +ResourceLocation *CowRenderer::getTextureLocation(shared_ptr mob) +{ + return &COW_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/CowRenderer.h b/Minecraft.Client/CowRenderer.h index e99e1c12..3e4e9a0c 100644 --- a/Minecraft.Client/CowRenderer.h +++ b/Minecraft.Client/CowRenderer.h @@ -3,7 +3,12 @@ class CowRenderer : public MobRenderer { +private: + static ResourceLocation COW_LOCATION; + public: CowRenderer(Model *model, float shadow); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/CreeperModel.cpp b/Minecraft.Client/CreeperModel.cpp index 51237ce6..dd9ef193 100644 --- a/Minecraft.Client/CreeperModel.cpp +++ b/Minecraft.Client/CreeperModel.cpp @@ -58,7 +58,7 @@ CreeperModel::CreeperModel(float g) : Model() void CreeperModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); head->render(scale, usecompiled); body->render(scale, usecompiled); @@ -68,7 +68,7 @@ void CreeperModel::render(shared_ptr entity, float time, float r, float leg3->render(scale, usecompiled); } -void CreeperModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void CreeperModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { head->yRot = yRot / (float) (180 / PI); head->xRot = xRot / (float) (180 / PI); diff --git a/Minecraft.Client/CreeperModel.h b/Minecraft.Client/CreeperModel.h index 06231d0e..93334a18 100644 --- a/Minecraft.Client/CreeperModel.h +++ b/Minecraft.Client/CreeperModel.h @@ -10,5 +10,5 @@ public: CreeperModel(); CreeperModel(float g); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/CreeperRenderer.cpp b/Minecraft.Client/CreeperRenderer.cpp index 483d14e3..a9d16314 100644 --- a/Minecraft.Client/CreeperRenderer.cpp +++ b/Minecraft.Client/CreeperRenderer.cpp @@ -4,12 +4,15 @@ #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "..\Minecraft.World\Mth.h" -CreeperRenderer::CreeperRenderer() : MobRenderer( new CreeperModel(), 0.5f ) +ResourceLocation CreeperRenderer::POWER_LOCATION = ResourceLocation(TN_POWERED_CREEPER); +ResourceLocation CreeperRenderer::CREEPER_LOCATION = ResourceLocation(TN_MOB_CREEPER); + +CreeperRenderer::CreeperRenderer() : MobRenderer(new CreeperModel(), 0.5f) { armorModel = new CreeperModel(2); } -void CreeperRenderer::scale(shared_ptr mob, float a) +void CreeperRenderer::scale(shared_ptr mob, float a) { shared_ptr creeper = dynamic_pointer_cast(mob); @@ -25,7 +28,7 @@ void CreeperRenderer::scale(shared_ptr mob, float a) glScalef(s, hs, s); } -int CreeperRenderer::getOverlayColor(shared_ptr mob, float br, float a) +int CreeperRenderer::getOverlayColor(shared_ptr mob, float br, float a) { shared_ptr creeper = dynamic_pointer_cast(mob); @@ -44,7 +47,7 @@ int CreeperRenderer::getOverlayColor(shared_ptr mob, float br, float a) return (_a << 24) | (r << 16) | (g << 8) | b; } -int CreeperRenderer::prepareArmor(shared_ptr _mob, int layer, float a) +int CreeperRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -56,7 +59,7 @@ int CreeperRenderer::prepareArmor(shared_ptr _mob, int layer, float a) if (layer == 1) { float time = mob->tickCount + a; - bindTexture(TN_POWERED_CREEPER);// was L"/armor/power.png"); + bindTexture(&POWER_LOCATION); glMatrixMode(GL_TEXTURE); glLoadIdentity(); float uo = time * 0.01f; @@ -84,7 +87,12 @@ int CreeperRenderer::prepareArmor(shared_ptr _mob, int layer, float a) } -int CreeperRenderer::prepareArmorOverlay(shared_ptr mob, int layer, float a) +int CreeperRenderer::prepareArmorOverlay(shared_ptr mob, int layer, float a) { return -1; +} + +ResourceLocation *CreeperRenderer::getTextureLocation(shared_ptr mob) +{ + return &CREEPER_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/CreeperRenderer.h b/Minecraft.Client/CreeperRenderer.h index 4d0fac10..23718e0a 100644 --- a/Minecraft.Client/CreeperRenderer.h +++ b/Minecraft.Client/CreeperRenderer.h @@ -4,13 +4,17 @@ class CreeperRenderer: public MobRenderer { private: - Model *armorModel; + static ResourceLocation POWER_LOCATION; + static ResourceLocation CREEPER_LOCATION; + Model *armorModel; public: CreeperRenderer(); + protected: - virtual void scale(shared_ptr _mob, float a); - virtual int getOverlayColor(shared_ptr mob, float br, float a); - virtual int prepareArmor(shared_ptr mob, int layer, float a); - virtual int prepareArmorOverlay(shared_ptr _mob, int layer, float a); + virtual void scale(shared_ptr _mob, float a); + virtual int getOverlayColor(shared_ptr mob, float br, float a); + virtual int prepareArmor(shared_ptr mob, int layer, float a); + virtual int prepareArmorOverlay(shared_ptr _mob, int layer, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/DLCTexturePack.cpp b/Minecraft.Client/DLCTexturePack.cpp index 3d1e05a2..553128d9 100644 --- a/Minecraft.Client/DLCTexturePack.cpp +++ b/Minecraft.Client/DLCTexturePack.cpp @@ -132,7 +132,7 @@ bool DLCTexturePack::isTerrainUpdateCompatible() return true; } -wstring DLCTexturePack::getPath(bool bTitleUpdateTexture /*= false*/) +wstring DLCTexturePack::getPath(bool bTitleUpdateTexture /*= false*/, const char *pchBDPatchFilename) { return L""; } @@ -482,8 +482,8 @@ int DLCTexturePack::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicen iEndStart=iOverworldC+iNetherC; iEndC=dlcFile->GetCountofType(DLCAudioFile::e_AudioType_End); - Minecraft::GetInstance()->soundEngine->SetStreamingSounds(iOverworldStart,iOverworldStart+iOverworldC, - iNetherStart,iNetherStart+iNetherC,iEndStart,iEndStart+iEndC,iEndStart+iEndC); // push the CD start to after + Minecraft::GetInstance()->soundEngine->SetStreamingSounds(iOverworldStart,iOverworldStart+iOverworldC-1, + iNetherStart,iNetherStart+iNetherC-1,iEndStart,iEndStart+iEndC-1,iEndStart+iEndC); // push the CD start to after } #endif } diff --git a/Minecraft.Client/DLCTexturePack.h b/Minecraft.Client/DLCTexturePack.h index 14e6ea23..153f3d43 100644 --- a/Minecraft.Client/DLCTexturePack.h +++ b/Minecraft.Client/DLCTexturePack.h @@ -27,6 +27,10 @@ public: virtual wstring getResource(const wstring& name); virtual DLCPack * getDLCPack(); + virtual wstring getDesc1() {return m_stringTable->getString(L"IDS_TP_DESCRIPTION");} + virtual wstring getName() {return m_stringTable->getString(L"IDS_DISPLAY_NAME");} + virtual wstring getWorldName() { return m_stringTable->getString(L"IDS_WORLD_NAME");} + // Added for sound banks with MashUp packs #ifdef _XBOX IXACT3WaveBank *m_pStreamedWaveBank; @@ -46,7 +50,7 @@ public: bool isTerrainUpdateCompatible(); // 4J Added - virtual wstring getPath(bool bTitleUpdateTexture = false); + virtual wstring getPath(bool bTitleUpdateTexture = false, const char *pchBDPatchFilename=NULL); virtual wstring getAnimationString(const wstring &textureName, const wstring &path); virtual BufferedImage *getImageResource(const wstring& File, bool filenameHasExtension = false, bool bTitleUpdateTexture=false, const wstring &drive =L""); virtual void loadColourTable(); diff --git a/Minecraft.Client/DefaultRenderer.h b/Minecraft.Client/DefaultRenderer.h index dcb5a9c3..04b95390 100644 --- a/Minecraft.Client/DefaultRenderer.h +++ b/Minecraft.Client/DefaultRenderer.h @@ -4,5 +4,6 @@ class DefaultRenderer : public EntityRenderer { public: - virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob) { return NULL; }; }; \ No newline at end of file diff --git a/Minecraft.Client/DemoLevel.cpp b/Minecraft.Client/DemoLevel.cpp index 52edc0ba..91d23397 100644 --- a/Minecraft.Client/DemoLevel.cpp +++ b/Minecraft.Client/DemoLevel.cpp @@ -6,10 +6,6 @@ DemoLevel::DemoLevel(shared_ptr levelStorage, const wstring& level { } -DemoLevel::DemoLevel(Level *level, Dimension *dimension): Level(level, dimension) -{ -} - void DemoLevel::setInitialSpawn() { levelData->setSpawn(DEMO_SPAWN_X, DEMO_SPAWN_Y, DEMO_SPAWN_Z); diff --git a/Minecraft.Client/DirtyChunkSorter.cpp b/Minecraft.Client/DirtyChunkSorter.cpp index 1a7c10cc..ebeed96d 100644 --- a/Minecraft.Client/DirtyChunkSorter.cpp +++ b/Minecraft.Client/DirtyChunkSorter.cpp @@ -3,7 +3,7 @@ #include "../Minecraft.World/net.minecraft.world.entity.player.h" #include "Chunk.h" -DirtyChunkSorter::DirtyChunkSorter(shared_ptr cameraEntity, int playerIndex) // 4J - added player index +DirtyChunkSorter::DirtyChunkSorter(shared_ptr cameraEntity, int playerIndex) // 4J - added player index { this->cameraEntity = cameraEntity; this->playerIndex = playerIndex; diff --git a/Minecraft.Client/DirtyChunkSorter.h b/Minecraft.Client/DirtyChunkSorter.h index 4caa2fac..1bf8b61f 100644 --- a/Minecraft.Client/DirtyChunkSorter.h +++ b/Minecraft.Client/DirtyChunkSorter.h @@ -5,10 +5,10 @@ class Mob; class DirtyChunkSorter : public std::binary_function { private: - shared_ptr cameraEntity; + shared_ptr cameraEntity; int playerIndex; // 4J added public: - DirtyChunkSorter(shared_ptr cameraEntity, int playerIndex); // 4J - added player index + DirtyChunkSorter(shared_ptr cameraEntity, int playerIndex); // 4J - added player index bool operator()(const Chunk *a, const Chunk *b) const; }; \ No newline at end of file diff --git a/Minecraft.Client/DispenserBootstrap.cpp b/Minecraft.Client/DispenserBootstrap.cpp new file mode 100644 index 00000000..1577c4e3 --- /dev/null +++ b/Minecraft.Client/DispenserBootstrap.cpp @@ -0,0 +1 @@ +#include "stdafx.h" \ No newline at end of file diff --git a/Minecraft.Client/DispenserBootstrap.h b/Minecraft.Client/DispenserBootstrap.h new file mode 100644 index 00000000..84dde91a --- /dev/null +++ b/Minecraft.Client/DispenserBootstrap.h @@ -0,0 +1,29 @@ +#pragma once +#include "../Minecraft.World/net.minecraft.world.item.h" +#include "../Minecraft.World/DispenserTile.h" +#include "../Minecraft.World/net.minecraft.core.h" +#include "../Minecraft.World/LevelEvent.h" + +class DispenserBootstrap +{ +public: + static void bootStrap() + { + DispenserTile::REGISTRY.add(Item::arrow, new ArrowDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::egg, new EggDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::snowBall, new SnowballDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::expBottle, new ExpBottleDispenseBehavior()); + + DispenserTile::REGISTRY.add(Item::potion, new PotionDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::spawnEgg, new SpawnEggDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::fireworks, new FireworksDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::fireball, new FireballDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::boat, new BoatDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::bucket_lava, new FilledBucketDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::bucket_water, new FilledBucketDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::bucket_empty, new EmptyBucketDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::flintAndSteel, new FlintAndSteelDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::dye_powder, new DyeDispenseBehavior()); + DispenserTile::REGISTRY.add(Item::items[Tile::tnt_Id], new TntDispenseBehavior()); + } +}; \ No newline at end of file diff --git a/Minecraft.Client/DragonModel.cpp b/Minecraft.Client/DragonModel.cpp index 39861829..9e0499a9 100644 --- a/Minecraft.Client/DragonModel.cpp +++ b/Minecraft.Client/DragonModel.cpp @@ -106,7 +106,7 @@ DragonModel::DragonModel(float g) : Model() rearFoot->compile(1.0f/16.0f); } -void DragonModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +void DragonModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { this->a = a; } diff --git a/Minecraft.Client/DragonModel.h b/Minecraft.Client/DragonModel.h index 47c20cba..7adbc137 100644 --- a/Minecraft.Client/DragonModel.h +++ b/Minecraft.Client/DragonModel.h @@ -26,7 +26,7 @@ public: ModelPart *cubes[5]; DragonModel(float g); - void prepareMobModel(shared_ptr mob, float time, float r, float a); + void prepareMobModel(shared_ptr mob, float time, float r, float a); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); private: diff --git a/Minecraft.Client/EnchantTableRenderer.cpp b/Minecraft.Client/EnchantTableRenderer.cpp index 43f2b040..ff539fcd 100644 --- a/Minecraft.Client/EnchantTableRenderer.cpp +++ b/Minecraft.Client/EnchantTableRenderer.cpp @@ -4,6 +4,8 @@ #include "..\Minecraft.World\Mth.h" #include "EnchantTableRenderer.h" +ResourceLocation EnchantTableRenderer::BOOK_LOCATION = ResourceLocation(TN_ITEM_BOOK); + EnchantTableRenderer::EnchantTableRenderer() { bookModel = new BookModel(); @@ -41,7 +43,7 @@ void EnchantTableRenderer::render(shared_ptr _table, double x, doubl glRotatef(-yRot * 180 / PI, 0, 1, 0); glRotatef(80, 0, 0, 1); - bindTexture(TN_ITEM_BOOK); // 4J was "/item/book.png" + bindTexture(&BOOK_LOCATION); // 4J was "/item/book.png" float ff1 = table->oFlip + (table->flip - table->oFlip) * a + 0.25f; float ff2 = table->oFlip + (table->flip - table->oFlip) * a + 0.75f; @@ -54,6 +56,7 @@ void EnchantTableRenderer::render(shared_ptr _table, double x, doubl if (ff2 > 1) ff2 = 1; float o = table->oOpen + (table->open - table->oOpen) * a; + glEnable(GL_CULL_FACE); bookModel->render(nullptr, tt, ff1, ff2, o, 0, 1 / 16.0f,true); glPopMatrix(); } diff --git a/Minecraft.Client/EnchantTableRenderer.h b/Minecraft.Client/EnchantTableRenderer.h index 0b738ca9..0710d1ec 100644 --- a/Minecraft.Client/EnchantTableRenderer.h +++ b/Minecraft.Client/EnchantTableRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "TileEntityRenderer.h" class BookModel; @@ -9,6 +8,8 @@ class EnchantTableRenderer : public TileEntityRenderer friend class CXuiCtrlEnchantmentBook; friend class UIControl_EnchantmentBook; private: + static ResourceLocation BOOK_LOCATION; + BookModel *bookModel; public: diff --git a/Minecraft.Client/EnderChestRenderer.cpp b/Minecraft.Client/EnderChestRenderer.cpp index 2996b65f..52fdede9 100644 --- a/Minecraft.Client/EnderChestRenderer.cpp +++ b/Minecraft.Client/EnderChestRenderer.cpp @@ -3,6 +3,8 @@ #include "ModelPart.h" #include "EnderChestRenderer.h" +ResourceLocation EnderChestRenderer::ENDER_CHEST_LOCATION = ResourceLocation(TN_TILE_ENDER_CHEST); + void EnderChestRenderer::render(shared_ptr _chest, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J Convert as we aren't using a templated class @@ -15,7 +17,7 @@ void EnderChestRenderer::render(shared_ptr _chest, double x, double data = chest->getData(); } - bindTexture(TN_TILE_ENDER_CHEST); //"/item/enderchest.png"); + bindTexture(&ENDER_CHEST_LOCATION); glPushMatrix(); glEnable(GL_RESCALE_NORMAL); @@ -31,12 +33,6 @@ void EnderChestRenderer::render(shared_ptr _chest, double x, double if (data == 4) rot = 90; if (data == 5) rot = -90; - // if (data == 2) { - // glTranslatef(1, 0, 0); - // } - // if (data == 5) { - // glTranslatef(0, 0, -1); - // } glRotatef(rot, 0, 1, 0); glTranslatef(-0.5f, -0.5f, -0.5f); diff --git a/Minecraft.Client/EnderChestRenderer.h b/Minecraft.Client/EnderChestRenderer.h index d0521ae0..b3c5223e 100644 --- a/Minecraft.Client/EnderChestRenderer.h +++ b/Minecraft.Client/EnderChestRenderer.h @@ -1,11 +1,11 @@ #pragma once - #include "TileEntityRenderer.h" #include "ChestModel.h" class EnderChestRenderer : public TileEntityRenderer { private: + static ResourceLocation ENDER_CHEST_LOCATION; ChestModel chestModel; public: diff --git a/Minecraft.Client/EnderCrystalRenderer.cpp b/Minecraft.Client/EnderCrystalRenderer.cpp index 452206bc..d2eba5e8 100644 --- a/Minecraft.Client/EnderCrystalRenderer.cpp +++ b/Minecraft.Client/EnderCrystalRenderer.cpp @@ -3,6 +3,8 @@ #include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" #include "EnderCrystalRenderer.h" +ResourceLocation EnderCrystalRenderer::ENDER_CRYSTAL_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON_ENDERCRYSTAL); + EnderCrystalRenderer::EnderCrystalRenderer() { currentModel = -1; @@ -24,10 +26,15 @@ void EnderCrystalRenderer::render(shared_ptr _crystal, double x, double float tt = crystal->time + a; glPushMatrix(); glTranslatef((float) x, (float) y, (float) z); - bindTexture(TN_MOB_ENDERDRAGON_ENDERCRYSTAL); // 4J was "/mob/enderdragon/crystal.png" + bindTexture(&ENDER_CRYSTAL_LOCATION); float hh = sin(tt * 0.2f) / 2 + 0.5f; hh = hh * hh + hh; model->render(crystal, 0, tt * 3, hh * 0.2f, 0, 0, 1 / 16.0f, true); glPopMatrix(); +} + +ResourceLocation *EnderCrystalRenderer::getTextureLocation(shared_ptr mob) +{ + return &ENDER_CRYSTAL_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/EnderCrystalRenderer.h b/Minecraft.Client/EnderCrystalRenderer.h index de5dc820..76e3b171 100644 --- a/Minecraft.Client/EnderCrystalRenderer.h +++ b/Minecraft.Client/EnderCrystalRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "EntityRenderer.h" class Model; @@ -9,9 +8,11 @@ class EnderCrystalRenderer : public EntityRenderer private: int currentModel; Model *model; + static ResourceLocation ENDER_CRYSTAL_LOCATION; public: EnderCrystalRenderer(); virtual void render(shared_ptr _crystal, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/EnderDragonRenderer.cpp b/Minecraft.Client/EnderDragonRenderer.cpp index 8c531d4e..037552ed 100644 --- a/Minecraft.Client/EnderDragonRenderer.cpp +++ b/Minecraft.Client/EnderDragonRenderer.cpp @@ -4,18 +4,20 @@ #include "Tesselator.h" #include "Lighting.h" #include "EnderDragonRenderer.h" +#include "BossMobGuiInfo.h" -shared_ptr EnderDragonRenderer::bossInstance; -int EnderDragonRenderer::currentModel; +ResourceLocation EnderDragonRenderer::DRAGON_EXPLODING_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON_SHUFFLE); +ResourceLocation EnderDragonRenderer::CRYSTAL_BEAM_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON_BEAM); +ResourceLocation EnderDragonRenderer::DRAGON_EYES_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON_ENDEREYES); +ResourceLocation EnderDragonRenderer::DRAGON_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON); EnderDragonRenderer::EnderDragonRenderer() : MobRenderer(new DragonModel(0), 0.5f) { - currentModel = 0; dragonModel = (DragonModel *) model; - this->setArmor(model); + setArmor(model); // TODO: Make second constructor that assigns this. } -void EnderDragonRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) +void EnderDragonRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -46,7 +48,7 @@ void EnderDragonRenderer::setupRotations(shared_ptr _mob, float bob, float } } -void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) +void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -57,7 +59,7 @@ void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float w glDepthFunc(GL_LEQUAL); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, tt); - bindTexture(mob->customTextureUrl, TN_MOB_ENDERDRAGON_SHUFFLE); // 4J was "/mob/enderdragon/shuffle.png" + bindTexture(&DRAGON_EXPLODING_LOCATION); // 4J was "/mob/enderdragon/shuffle.png" model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); glAlphaFunc(GL_GREATER, 0.1f); @@ -65,7 +67,7 @@ void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float w } - bindTexture(mob->customTextureUrl, mob->getTexture()); + bindTexture(mob); model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); if (mob->hurtTime > 0) @@ -91,12 +93,7 @@ void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, do { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); - EnderDragonRenderer::bossInstance = mob; - if (currentModel != DragonModel::MODEL_ID) - { - model = new DragonModel(0); - currentModel = DragonModel::MODEL_ID; - } + BossMobGuiInfo::setBossHealth(mob, false); MobRenderer::render(mob, x, y, z, rot, a); if (mob->nearestCrystal != NULL) { @@ -135,7 +132,7 @@ void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, do glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA); - bindTexture(TN_MOB_ENDERDRAGON_BEAM); // 4J was "/mob/enderdragon/beam.png" + bindTexture(&CRYSTAL_BEAM_LOCATION); // 4J was "/mob/enderdragon/beam.png" glShadeModel(GL_SMOOTH); @@ -167,7 +164,12 @@ void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, do } } -void EnderDragonRenderer::additionalRendering(shared_ptr _mob, float a) +ResourceLocation *EnderDragonRenderer::getTextureLocation(shared_ptr mob) +{ + return &DRAGON_LOCATION; +} + +void EnderDragonRenderer::additionalRendering(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -227,7 +229,7 @@ void EnderDragonRenderer::additionalRendering(shared_ptr _mob, float a) } -int EnderDragonRenderer::prepareArmor(shared_ptr _mob, int layer, float a) +int EnderDragonRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -238,7 +240,7 @@ int EnderDragonRenderer::prepareArmor(shared_ptr _mob, int layer, float a) } if (layer != 0) return -1; - bindTexture(TN_MOB_ENDERDRAGON_ENDEREYES); // 4J was "/mob/enderdragon/ender_eyes.png" + bindTexture(&DRAGON_EYES_LOCATION); // 4J was "/mob/enderdragon/ender_eyes.png" float br = 1; glEnable(GL_BLEND); // 4J Stu - We probably don't need to do this on 360 either (as we force it back on the renderer) diff --git a/Minecraft.Client/EnderDragonRenderer.h b/Minecraft.Client/EnderDragonRenderer.h index ab508d99..19209a45 100644 --- a/Minecraft.Client/EnderDragonRenderer.h +++ b/Minecraft.Client/EnderDragonRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "MobRenderer.h" #ifdef _XBOX @@ -9,11 +8,11 @@ class DragonModel; class EnderDragonRenderer : public MobRenderer { -public: - static shared_ptr bossInstance; - private: - static int currentModel; + static ResourceLocation DRAGON_EXPLODING_LOCATION; + static ResourceLocation CRYSTAL_BEAM_LOCATION; + static ResourceLocation DRAGON_EYES_LOCATION; + static ResourceLocation DRAGON_LOCATION; protected: DragonModel *dragonModel; @@ -22,15 +21,14 @@ public: EnderDragonRenderer(); protected: - virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); - -protected: - void renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + virtual void renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); public: virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: - virtual void additionalRendering(shared_ptr _mob, float a); - virtual int prepareArmor(shared_ptr _mob, int layer, float a); + virtual void additionalRendering(shared_ptr _mob, float a); + virtual int prepareArmor(shared_ptr _mob, int layer, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/EndermanModel.cpp b/Minecraft.Client/EndermanModel.cpp index 02b9a53d..3a32f011 100644 --- a/Minecraft.Client/EndermanModel.cpp +++ b/Minecraft.Client/EndermanModel.cpp @@ -51,12 +51,11 @@ EndermanModel::EndermanModel() : HumanoidModel(0, -14, 64, 32) leg0->compile(1.0f/16.0f); leg1->compile(1.0f/16.0f); hair->compile(1.0f/16.0f); - } -void EndermanModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void EndermanModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, uiBitmaskOverrideAnim); + HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, entity, uiBitmaskOverrideAnim); head->visible = true; diff --git a/Minecraft.Client/EndermanModel.h b/Minecraft.Client/EndermanModel.h index 3760e796..5042f553 100644 --- a/Minecraft.Client/EndermanModel.h +++ b/Minecraft.Client/EndermanModel.h @@ -9,5 +9,5 @@ public: bool creepy; EndermanModel(); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/EndermanRenderer.cpp b/Minecraft.Client/EndermanRenderer.cpp index 8802376a..f6e5220a 100644 --- a/Minecraft.Client/EndermanRenderer.cpp +++ b/Minecraft.Client/EndermanRenderer.cpp @@ -1,9 +1,13 @@ #include "stdafx.h" #include "EndermanRenderer.h" #include "EndermanModel.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" +ResourceLocation EndermanRenderer::ENDERMAN_EYES_LOCATION = ResourceLocation(TN_MOB_ENDERMAN_EYES); +ResourceLocation EndermanRenderer::ENDERMAN_LOCATION = ResourceLocation(TN_MOB_ENDERMAN); + EndermanRenderer::EndermanRenderer() : MobRenderer(new EndermanModel(), 0.5f) { model = (EndermanModel *) MobRenderer::model; @@ -29,7 +33,12 @@ void EndermanRenderer::render(shared_ptr _mob, double x, double y, doubl MobRenderer::render(mob, x, y, z, rot, a); } -void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) +ResourceLocation *EndermanRenderer::getTextureLocation(shared_ptr mob) +{ + return &ENDERMAN_LOCATION; +} + +void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) { // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - // do some casting around instead @@ -47,7 +56,7 @@ void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) s *= 1.00f; glRotatef(20, 1, 0, 0); glRotatef(45, 0, 1, 0); - glScalef(s, -s, s); + glScalef(-s, -s, s); if (SharedConstants::TEXTURE_LIGHTING) @@ -61,14 +70,14 @@ void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) } glColor4f(1, 1, 1, 1); - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: bind by icon tileRenderer->renderTile(Tile::tiles[mob->getCarryingTile()], mob->getCarryingData(), 1); glPopMatrix(); glDisable(GL_RESCALE_NORMAL); } } -int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) +int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - // do some casting around instead @@ -76,7 +85,7 @@ int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) if (layer != 0) return -1; - bindTexture(TN_MOB_ENDERMAN_EYES); // 4J was L"/mob/enderman_eyes.png" + bindTexture(&ENDERMAN_EYES_LOCATION); // 4J was L"/mob/enderman_eyes.png" float br = 1; glEnable(GL_BLEND); // 4J Stu - We probably don't need to do this on 360 either (as we force it back on the renderer) @@ -88,8 +97,14 @@ int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) glBlendFunc(GL_ONE, GL_ONE); glDisable(GL_LIGHTING); - if (mob->isInvisible()) glDepthMask(false); - else glDepthMask(true); + if (mob->isInvisible()) + { + glDepthMask(false); + } + else + { + glDepthMask(true); + } if (SharedConstants::TEXTURE_LIGHTING) { diff --git a/Minecraft.Client/EndermanRenderer.h b/Minecraft.Client/EndermanRenderer.h index 6f5126bd..a65464c0 100644 --- a/Minecraft.Client/EndermanRenderer.h +++ b/Minecraft.Client/EndermanRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "MobRenderer.h" class EnderMan; @@ -10,13 +9,16 @@ class EndermanRenderer : public MobRenderer private: EndermanModel *model; Random random; + static ResourceLocation ENDERMAN_EYES_LOCATION; + static ResourceLocation ENDERMAN_LOCATION; public: EndermanRenderer(); - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); - virtual void additionalRendering(shared_ptr _mob, float a); + void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + ResourceLocation *getTextureLocation(shared_ptr mob); + void additionalRendering(shared_ptr _mob, float a); protected: - virtual int prepareArmor(shared_ptr _mob, int layer, float a); + int prepareArmor(shared_ptr _mob, int layer, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/EntityRenderDispatcher.cpp b/Minecraft.Client/EntityRenderDispatcher.cpp index dfc9a11e..f23c713c 100644 --- a/Minecraft.Client/EntityRenderDispatcher.cpp +++ b/Minecraft.Client/EntityRenderDispatcher.cpp @@ -50,6 +50,14 @@ #include "EnderDragonRenderer.h" #include "EnderCrystalRenderer.h" #include "BlazeRenderer.h" +#include "SkeletonRenderer.h" +#include "WitchRenderer.h" +#include "WitherBossRenderer.h" +#include "LeashKnotRenderer.h" +#include "WitherSkullRenderer.h" +#include "TntMinecartRenderer.h" +#include "MinecartSpawnerRenderer.h" +#include "HorseRenderer.h" #include "SpiderModel.h" #include "PigModel.h" #include "SheepModel.h" @@ -65,12 +73,15 @@ #include "HumanoidModel.h" #include "SheepFurModel.h" #include "SkeletonModel.h" +#include "ModelHorse.h" #include "Options.h" #include "ItemFrameRenderer.h" -#include "OzelotRenderer.h" +#include "OcelotRenderer.h" #include "VillagerGolemRenderer.h" -#include "OzelotModel.h" +#include "OcelotModel.h" #include "ZombieRenderer.h" +#include "BatRenderer.h" +#include "CaveSpiderRenderer.h" double EntityRenderDispatcher::xOff = 0.0; double EntityRenderDispatcher::yOff = 0.0; @@ -87,22 +98,23 @@ EntityRenderDispatcher::EntityRenderDispatcher() { glEnable(GL_LIGHTING); renderers[eTYPE_SPIDER] = new SpiderRenderer(); - renderers[eTYPE_CAVESPIDER] = new SpiderRenderer(); + renderers[eTYPE_CAVESPIDER] = new CaveSpiderRenderer(); renderers[eTYPE_PIG] = new PigRenderer(new PigModel(), new PigModel(0.5f), 0.7f); renderers[eTYPE_SHEEP] = new SheepRenderer(new SheepModel(), new SheepFurModel(), 0.7f); renderers[eTYPE_COW] = new CowRenderer(new CowModel(), 0.7f); renderers[eTYPE_MUSHROOMCOW] = new MushroomCowRenderer(new CowModel(), 0.7f); renderers[eTYPE_WOLF] = new WolfRenderer(new WolfModel(), new WolfModel(), 0.5f); renderers[eTYPE_CHICKEN] = new ChickenRenderer(new ChickenModel(), 0.3f); - renderers[eTYPE_OZELOT] = new OzelotRenderer(new OzelotModel(), 0.4f); + renderers[eTYPE_OCELOT] = new OcelotRenderer(new OcelotModel(), 0.4f); renderers[eTYPE_SILVERFISH] = new SilverfishRenderer(); renderers[eTYPE_CREEPER] = new CreeperRenderer(); renderers[eTYPE_ENDERMAN] = new EndermanRenderer(); renderers[eTYPE_SNOWMAN] = new SnowManRenderer(); - renderers[eTYPE_SKELETON] = new HumanoidMobRenderer(new SkeletonModel(), 0.5f); + renderers[eTYPE_SKELETON] = new SkeletonRenderer(); + renderers[eTYPE_WITCH] = new WitchRenderer(); renderers[eTYPE_BLAZE] = new BlazeRenderer(); renderers[eTYPE_ZOMBIE] = new ZombieRenderer(); - renderers[eTYPE_PIGZOMBIE] = new HumanoidMobRenderer(new ZombieModel(), 0.5f); + renderers[eTYPE_PIGZOMBIE] = new ZombieRenderer(); renderers[eTYPE_SLIME] = new SlimeRenderer(new SlimeModel(16), new SlimeModel(0), 0.25f); renderers[eTYPE_LAVASLIME] = new LavaSlimeRenderer(); renderers[eTYPE_PLAYER] = new PlayerRenderer(); @@ -111,12 +123,19 @@ EntityRenderDispatcher::EntityRenderDispatcher() renderers[eTYPE_SQUID] = new SquidRenderer(new SquidModel(), 0.7f); renderers[eTYPE_VILLAGER] = new VillagerRenderer(); renderers[eTYPE_VILLAGERGOLEM] = new VillagerGolemRenderer(); + renderers[eTYPE_BAT] = new BatRenderer(); + renderers[eTYPE_MOB] = new MobRenderer(new HumanoidModel(), 0.5f); + renderers[eTYPE_ENDERDRAGON] = new EnderDragonRenderer(); renderers[eTYPE_ENDER_CRYSTAL] = new EnderCrystalRenderer(); + + renderers[eTYPE_WITHERBOSS] = new WitherBossRenderer(); + renderers[eTYPE_ENTITY] = new DefaultRenderer(); - renderers[eTYPE_PAINTING] = new PaintingRenderer(); + renderers[eTYPE_PAINTING] = new PaintingRenderer(); renderers[eTYPE_ITEM_FRAME] = new ItemFrameRenderer(); + renderers[eTYPE_LEASHFENCEKNOT] = new LeashKnotRenderer(); renderers[eTYPE_ARROW] = new ArrowRenderer(); renderers[eTYPE_SNOWBALL] = new ItemSpriteRenderer(Item::snowBall); renderers[eTYPE_THROWNENDERPEARL] = new ItemSpriteRenderer(Item::enderPearl); @@ -124,18 +143,30 @@ EntityRenderDispatcher::EntityRenderDispatcher() renderers[eTYPE_THROWNEGG] = new ItemSpriteRenderer(Item::egg); renderers[eTYPE_THROWNPOTION] = new ItemSpriteRenderer(Item::potion, PotionBrewing::THROWABLE_MASK); renderers[eTYPE_THROWNEXPBOTTLE] = new ItemSpriteRenderer(Item::expBottle); - renderers[eTYPE_FIREBALL] = new FireballRenderer(2.0f); + renderers[eTYPE_FIREWORKS_ROCKET] = new ItemSpriteRenderer(Item::fireworks); + renderers[eTYPE_LARGE_FIREBALL] = new FireballRenderer(2.0f); renderers[eTYPE_SMALL_FIREBALL] = new FireballRenderer(0.5f); renderers[eTYPE_DRAGON_FIREBALL] = new FireballRenderer(2.0f); // 4J Added TU9 + renderers[eTYPE_WITHER_SKULL] = new WitherSkullRenderer(); renderers[eTYPE_ITEMENTITY] = new ItemRenderer(); renderers[eTYPE_EXPERIENCEORB] = new ExperienceOrbRenderer(); renderers[eTYPE_PRIMEDTNT] = new TntRenderer(); renderers[eTYPE_FALLINGTILE] = new FallingTileRenderer(); - renderers[eTYPE_MINECART] = new MinecartRenderer(); + + renderers[eTYPE_MINECART_TNT] = new TntMinecartRenderer(); + renderers[eTYPE_MINECART_SPAWNER] = new MinecartSpawnerRenderer(); + renderers[eTYPE_MINECART_RIDEABLE] = new MinecartRenderer(); + + renderers[eTYPE_MINECART_FURNACE] = new MinecartRenderer(); + renderers[eTYPE_MINECART_CHEST] = new MinecartRenderer(); + renderers[eTYPE_MINECART_HOPPER] = new MinecartRenderer(); + renderers[eTYPE_BOAT] = new BoatRenderer(); renderers[eTYPE_FISHINGHOOK] = new FishingHookRenderer(); + + renderers[eTYPE_HORSE] = new HorseRenderer(new ModelHorse(), .75f); + renderers[eTYPE_LIGHTNINGBOLT] = new LightningBoltRenderer(); - renderers[eTYPE_ARROW] = new ArrowRenderer(); glDisable(GL_LIGHTING); AUTO_VAR(itEnd, renderers.end()); @@ -149,22 +180,24 @@ EntityRenderDispatcher::EntityRenderDispatcher() EntityRenderer *EntityRenderDispatcher::getRenderer(eINSTANCEOF e) { + if( (e & eTYPE_PLAYER) == eTYPE_PLAYER) e = eTYPE_PLAYER; //EntityRenderer * r = renderers[e]; AUTO_VAR(it, renderers.find( e )); // 4J Stu - The .at and [] accessors insert elements if they don't exist if( it == renderers.end() ) { + app.DebugPrintf("Couldn't find renderer for entity of type %d\n", e); // New renderer mapping required in above table __debugbreak(); } /* 4J - not doing this hierarchical search anymore. We need to explicitly add renderers for any eINSTANCEOF type that we want to be able to render - if (it == renderers.end() && e != Entity::_class) + if (it == renderers.end() && e != Entity::_class) { - EntityRenderer *r = getRenderer(dynamic_cast( e->getSuperclass() )); - renderers.insert( classToRendererMap::value_type( e, r ) ); - return r; - //assert(false); - }*/ + EntityRenderer *r = getRenderer(dynamic_cast( e->getSuperclass() )); + renderers.insert( classToRendererMap::value_type( e, r ) ); + return r; + //assert(false); + }*/ return it->second; } @@ -173,29 +206,30 @@ EntityRenderer *EntityRenderDispatcher::getRenderer(shared_ptr e) return getRenderer(e->GetType()); } -void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, Options *options, float a) +void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, shared_ptr crosshairPickMob, Options *options, float a) { - this->level = level; - this->textures = textures; - this->options = options; - this->cameraEntity = player; - this->font = font; + this->level = level; + this->textures = textures; + this->options = options; + this->cameraEntity = player; + this->font = font; + this->crosshairPickMob = crosshairPickMob; - if (player->isSleeping()) + if (player->isSleeping()) { - int t = level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); - if (t == Tile::bed_Id) + int t = level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + if (t == Tile::bed_Id) { - int data = level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + int data = level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); - int direction = data & 3; - playerRotY = (float)(direction * 90 + 180); - playerRotX = 0; - } - } else { - playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; - playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; - } + int direction = data & 3; + playerRotY = (float)(direction * 90 + 180); + playerRotX = 0; + } + } else { + playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; + playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; + } shared_ptr pl = dynamic_pointer_cast(player); if (pl->ThirdPersonView() == 2) @@ -203,17 +237,17 @@ void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *fon playerRotY += 180; } - xPlayer = player->xOld + (player->x - player->xOld) * a; - yPlayer = player->yOld + (player->y - player->yOld) * a; - zPlayer = player->zOld + (player->z - player->zOld) * a; + xPlayer = player->xOld + (player->x - player->xOld) * a; + yPlayer = player->yOld + (player->y - player->yOld) * a; + zPlayer = player->zOld + (player->z - player->zOld) * a; } void EntityRenderDispatcher::render(shared_ptr entity, float a) { - double x = entity->xOld + (entity->x - entity->xOld) * a; - double y = entity->yOld + (entity->y - entity->yOld) * a; - double z = entity->zOld + (entity->z - entity->zOld) * a; + double x = entity->xOld + (entity->x - entity->xOld) * a; + double y = entity->yOld + (entity->y - entity->yOld) * a; + double z = entity->zOld + (entity->z - entity->zOld) * a; // Fix for #61057 - TU7: Gameplay: Boat is glitching when player float forward and turning. // Fix to handle the case that yRot and yRotO wrap over the 0/360 line @@ -229,39 +263,39 @@ void EntityRenderDispatcher::render(shared_ptr entity, float a) rotDiff = entity->yRot - (entity->yRotO - 360); } } - float r = entity->yRotO + (rotDiff) * a; - - int col = entity->getLightColor(a); + float r = entity->yRotO + (rotDiff) * a; + + int col = entity->getLightColor(a); if (entity->isOnFire()) { col = SharedConstants::FULLBRIGHT_LIGHTVALUE; } - int u = col % 65536; - int v = col / 65536; - glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); - glColor4f(1, 1, 1, 1); + int u = col % 65536; + int v = col / 65536; + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); - render(entity, x - xOff, y - yOff, z - zOff, r, a); + render(entity, x - xOff, y - yOff, z - zOff, r, a); } void EntityRenderDispatcher::render(shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame, bool bRenderPlayerShadow) { EntityRenderer *renderer = getRenderer(entity); - if (renderer != NULL) + if (renderer != NULL) { renderer->SetItemFrame(bItemFrame); - + renderer->render(entity, x, y, z, rot, a); - renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow); - } + renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow); + } } double EntityRenderDispatcher::distanceToSqr(double x, double y, double z) { - double xd = x - xPlayer; - double yd = y - yPlayer; - double zd = z - zPlayer; - return xd * xd + yd * yd + zd * zd; + double xd = x - xPlayer; + double yd = y - yPlayer; + double zd = z - zPlayer; + return xd * xd + yd * yd + zd * zd; } Font *EntityRenderDispatcher::getFont() @@ -277,4 +311,60 @@ void EntityRenderDispatcher::registerTerrainTextures(IconRegister *iconRegister) EntityRenderer *renderer = it->second; renderer->registerTerrainTextures(iconRegister); } +} + +void EntityRenderDispatcher::renderHitbox(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + glDepthMask(false); + glDisable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + + glPushMatrix(); + Tesselator *t = Tesselator::getInstance(); + + t->begin(); + t->color(255, 255, 255, 32); + + double wnx = -entity->bbWidth / 2; + double wnz = -entity->bbWidth / 2; + double enx = entity->bbWidth / 2; + double enz = -entity->bbWidth / 2; + + double wsx = -entity->bbWidth / 2; + double wsz = entity->bbWidth / 2; + double esx = entity->bbWidth / 2; + double esz = entity->bbWidth / 2; + + double top = entity->bbHeight; + + t->vertex(x + wnx, y + top, z + wnz); + t->vertex(x + wnx, y, z + wnz); + t->vertex(x + enx, y, z + enz); + t->vertex(x + enx, y + top, z + enz); + + t->vertex(x + esx, y + top, z + esz); + t->vertex(x + esx, y, z + esz); + t->vertex(x + wsx, y, z + wsz); + t->vertex(x + wsx, y + top, z + wsz); + + t->vertex(x + enx, y + top, z + enz); + t->vertex(x + enx, y, z + enz); + t->vertex(x + esx, y, z + esz); + t->vertex(x + esx, y + top, z + esz); + + t->vertex(x + wsx, y + top, z + wsz); + t->vertex(x + wsx, y, z + wsz); + t->vertex(x + wnx, y, z + wnz); + t->vertex(x + wnx, y + top, z + wnz); + + t->end(); + glPopMatrix(); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glDepthMask(true); } \ No newline at end of file diff --git a/Minecraft.Client/EntityRenderDispatcher.h b/Minecraft.Client/EntityRenderDispatcher.h index 248be18f..07ab7c4d 100644 --- a/Minecraft.Client/EntityRenderDispatcher.h +++ b/Minecraft.Client/EntityRenderDispatcher.h @@ -26,7 +26,8 @@ public: Textures *textures; ItemInHandRenderer *itemInHandRenderer; Level *level; - shared_ptr cameraEntity; + shared_ptr cameraEntity; + shared_ptr crosshairPickMob; float playerRotY; float playerRotX; Options *options; @@ -36,14 +37,19 @@ public: private: EntityRenderDispatcher(); + public: EntityRenderer *getRenderer(eINSTANCEOF e); EntityRenderer *getRenderer(shared_ptr e); - void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, Options *options, float a); + void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, shared_ptr crosshairPickMob, Options *options, float a); void render(shared_ptr entity, float a); void render(shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame = false, bool bRenderPlayerShadow = true); void setLevel(Level *level); double distanceToSqr(double x, double y, double z); Font *getFont(); void registerTerrainTextures(IconRegister *iconRegister); + +private: + void renderHitbox(shared_ptr entity, double x, double y, double z, float rot, float a); + }; diff --git a/Minecraft.Client/EntityRenderer.cpp b/Minecraft.Client/EntityRenderer.cpp index 6c0247ed..9aa4ad7d 100644 --- a/Minecraft.Client/EntityRenderer.cpp +++ b/Minecraft.Client/EntityRenderer.cpp @@ -1,24 +1,27 @@ #include "stdafx.h" #include "EntityRenderer.h" -#include "HumanoidModel.h" #include "EntityRenderDispatcher.h" +#include "HumanoidModel.h" +#include "LocalPlayer.h" #include "Options.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "..\Minecraft.World\net.minecraft.world.h" -#include "..\Minecraft.World\Entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" #include "..\Minecraft.World\Level.h" #include "..\Minecraft.World\AABB.h" #include "..\Minecraft.World\Mth.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" -#include "LocalPlayer.h" + +ResourceLocation EntityRenderer::SHADOW_LOCATION = ResourceLocation(TN__CLAMP__MISC_SHADOW); // 4J - added EntityRenderer::EntityRenderer() { model = NULL; tileRenderer = new TileRenderer(); - shadowRadius = 0; - shadowStrength = 1.0f; + shadowRadius = 0; + shadowStrength = 1.0f; } EntityRenderer::~EntityRenderer() @@ -26,14 +29,14 @@ EntityRenderer::~EntityRenderer() delete tileRenderer; } -void EntityRenderer::bindTexture(int resourceName) +void EntityRenderer::bindTexture(shared_ptr entity) { - entityRenderDispatcher->textures->bindTexture(resourceName); + bindTexture(getTextureLocation(entity)); } -void EntityRenderer::bindTexture(const wstring& resourceName) +void EntityRenderer::bindTexture(ResourceLocation *location) { - entityRenderDispatcher->textures->bindTexture(resourceName); + entityRenderDispatcher->textures->bindTexture(location); } bool EntityRenderer::bindTexture(const wstring& urlTexture, int backupTexture) @@ -57,9 +60,9 @@ bool EntityRenderer::bindTexture(const wstring& urlTexture, int backupTexture) } } -bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring& backupTexture) +bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring &backupTexture) { - Textures *t = entityRenderDispatcher->textures; + Textures *t = entityRenderDispatcher->textures; // 4J-PB - no http textures on the xbox, mem textures instead @@ -70,161 +73,153 @@ bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring& backu { glBindTexture(GL_TEXTURE_2D, id); t->clearLastBoundId(); - return true; - } + return true; + } else { - return false; - } + return false; + } } void EntityRenderer::renderFlame(shared_ptr e, double x, double y, double z, float a) { - glDisable(GL_LIGHTING); + glDisable(GL_LIGHTING); Icon *fire1 = Tile::fire->getTextureLayer(0); Icon *fire2 = Tile::fire->getTextureLayer(1); - glPushMatrix(); - glTranslatef((float) x, (float) y, (float) z); + glPushMatrix(); + glTranslatef((float) x, (float) y, (float) z); - float s = e->bbWidth * 1.4f; - glScalef(s, s, s); + float s = e->bbWidth * 1.4f; + glScalef(s, s, s); MemSect(31); - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + bindTexture(&TextureAtlas::LOCATION_BLOCKS); MemSect(0); - Tesselator *t = Tesselator::getInstance(); + Tesselator *t = Tesselator::getInstance(); - float r = 0.5f; - float xo = 0.0f; + float r = 0.5f; + float xo = 0.0f; - float h = e->bbHeight / s; - float yo = (float) (e->y - e->bb->y0); + float h = e->bbHeight / s; + float yo = (float) (e->y - e->bb->y0); - glRotatef(-entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(-entityRenderDispatcher->playerRotY, 0, 1, 0); - glTranslatef(0, 0, -0.3f + ((int) h) * 0.02f); - glColor4f(1, 1, 1, 1); - float zo = 0; - int ss = 0; - t->begin(); - while (h > 0) + glTranslatef(0, 0, -0.3f + ((int) h) * 0.02f); + glColor4f(1, 1, 1, 1); + float zo = 0; + int ss = 0; + t->begin(); + while (h > 0) { Icon *tex = NULL; - if (ss % 2 == 0) + if (ss % 2 == 0) { - tex = fire1; - } + tex = fire1; + } else { - tex = fire2; - } + tex = fire2; + } float u0 = tex->getU0(); float v0 = tex->getV0(); float u1 = tex->getU1(); float v1 = tex->getV1(); - if (ss / 2 % 2 == 0) + if (ss / 2 % 2 == 0) { - float tmp = u1; - u1 = u0; - u0 = tmp; - } - t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( zo), (float)( u1), (float)( v1)); - t->vertexUV((float)(-r - xo), (float)( 0 - yo), (float)( zo), (float)( u0), (float)( v1)); - t->vertexUV((float)(-r - xo), (float)( 1.4f - yo), (float)( zo), (float)( u0), (float)( v0)); - t->vertexUV((float)(r - xo), (float)( 1.4f - yo), (float)( zo), (float)( u1), (float)( v0)); - h -= 0.45f; - yo -= 0.45f; - r *= 0.9f; - zo += 0.03f; - ss++; - } - t->end(); - glPopMatrix(); - glEnable(GL_LIGHTING); + float tmp = u1; + u1 = u0; + u0 = tmp; + } + t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( zo), (float)( u1), (float)( v1)); + t->vertexUV((float)(-r - xo), (float)( 0 - yo), (float)( zo), (float)( u0), (float)( v1)); + t->vertexUV((float)(-r - xo), (float)( 1.4f - yo), (float)( zo), (float)( u0), (float)( v0)); + t->vertexUV((float)(r - xo), (float)( 1.4f - yo), (float)( zo), (float)( u1), (float)( v0)); + h -= 0.45f; + yo -= 0.45f; + r *= 0.9f; + zo += 0.03f; + ss++; + } + t->end(); + glPopMatrix(); + glEnable(GL_LIGHTING); } void EntityRenderer::renderShadow(shared_ptr e, double x, double y, double z, float pow, float a) { glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); MemSect(31); - entityRenderDispatcher->textures->bindTexture(TN__CLAMP__MISC_SHADOW);//L"%clamp%/misc/shadow.png")); + entityRenderDispatcher->textures->bindTexture(&SHADOW_LOCATION); MemSect(0); - Level *level = getLevel(); + Level *level = getLevel(); - glDepthMask(false); - float r = shadowRadius; - shared_ptr mob = dynamic_pointer_cast(e); - bool isLocalPlayer = false; + glDepthMask(false); + float r = shadowRadius; float fYLocalPlayerShadowOffset=0.0f; - //if (dynamic_pointer_cast(e) != NULL) - if (mob != NULL) + if (e->instanceof(eTYPE_MOB)) { - //shared_ptr mob = dynamic_pointer_cast(e); + shared_ptr mob = dynamic_pointer_cast(e); r *= mob->getSizeScale(); - shared_ptr animal = dynamic_pointer_cast(mob); - if (animal != NULL) + + if (mob->instanceof(eTYPE_ANIMAL)) { - if (animal->isBaby()) + if (dynamic_pointer_cast(mob)->isBaby()) { r *= 0.5f; } } - - if(dynamic_pointer_cast(mob)!=NULL) - { - isLocalPlayer=true; - } } - double ex = e->xOld + (e->x - e->xOld) * a; - double ey = e->yOld + (e->y - e->yOld) * a + e->getShadowHeightOffs(); + double ex = e->xOld + (e->x - e->xOld) * a; + double ey = e->yOld + (e->y - e->yOld) * a + e->getShadowHeightOffs(); // 4J-PB - local players seem to have a position at their head, and remote players have a foot position. // get the shadow to render by changing the check here depending on the player type - if(isLocalPlayer) + if(e->instanceof(eTYPE_LOCALPLAYER)) { ey-=1.62; fYLocalPlayerShadowOffset=-1.62f; } - double ez = e->zOld + (e->z - e->zOld) * a; + double ez = e->zOld + (e->z - e->zOld) * a; - int x0 = Mth::floor(ex - r); - int x1 = Mth::floor(ex + r); - int y0 = Mth::floor(ey - r); - int y1 = Mth::floor(ey); - int z0 = Mth::floor(ez - r); - int z1 = Mth::floor(ez + r); + int x0 = Mth::floor(ex - r); + int x1 = Mth::floor(ex + r); + int y0 = Mth::floor(ey - r); + int y1 = Mth::floor(ey); + int z0 = Mth::floor(ez - r); + int z1 = Mth::floor(ez + r); - double xo = x - ex; + double xo = x - ex; double yo = y - ey; - double zo = z - ez; + double zo = z - ez; - Tesselator *tt = Tesselator::getInstance(); - tt->begin(); - for (int xt = x0; xt <= x1; xt++) - for (int yt = y0; yt <= y1; yt++) - for (int zt = z0; zt <= z1; zt++) + Tesselator *tt = Tesselator::getInstance(); + tt->begin(); + for (int xt = x0; xt <= x1; xt++) + for (int yt = y0; yt <= y1; yt++) + for (int zt = z0; zt <= z1; zt++) { int t = level->getTile(xt, yt - 1, zt); if (t > 0 && level->getRawBrightness(xt, yt, zt) > 3) { renderTileShadow(Tile::tiles[t], x, y + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, z, xt, yt , zt, pow, r, xo, yo + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, zo); } - } - tt->end(); + } + tt->end(); - glColor4f(1, 1, 1, 1); - glDisable(GL_BLEND); - glDepthMask(true); + glColor4f(1, 1, 1, 1); + glDisable(GL_BLEND); + glDepthMask(true); glEnable(GL_LIGHTING); } @@ -237,114 +232,114 @@ Level *EntityRenderer::getLevel() void EntityRenderer::renderTileShadow(Tile *tt, double x, double y, double z, int xt, int yt, int zt, float pow, float r, double xo, double yo, double zo) { Tesselator *t = Tesselator::getInstance(); - if (!tt->isCubeShaped()) return; + if (!tt->isCubeShaped()) return; - double a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt); - if (a < 0) return; - if (a > 1) a = 1; + double a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt); + if (a < 0) return; + if (a > 1) a = 1; - t->color(1.0f, 1.0f, 1.0f, (float) a); - // glColor4f(1, 1, 1, (float) a); - - double x0 = xt + tt->getShapeX0() + xo; - double x1 = xt + tt->getShapeX1() + xo; - double y0 = yt + tt->getShapeY0() + yo + 1.0 / 64.0f; - double z0 = zt + tt->getShapeZ0() + zo; - double z1 = zt + tt->getShapeZ1() + zo; - - float u0 = (float) ((x - (x0)) / 2 / r + 0.5f); - float u1 = (float) ((x - (x1)) / 2 / r + 0.5f); - float v0 = (float) ((z - (z0)) / 2 / r + 0.5f); - float v1 = (float) ((z - (z1)) / 2 / r + 0.5f); - - // u0 = 0; - // v0 = 0; - // u1 = 1; - // v1 = 1; - - t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( u0), (float)( v0)); - t->vertexUV((float)(x0), (float)( y0), (float)( z1), (float)( u0), (float)( v1)); - t->vertexUV((float)(x1), (float)( y0), (float)( z1), (float)( u1), (float)( v1)); - t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( u1), (float)( v0)); + t->color(1.0f, 1.0f, 1.0f, (float) a); + // glColor4f(1, 1, 1, (float) a); + + double x0 = xt + tt->getShapeX0() + xo; + double x1 = xt + tt->getShapeX1() + xo; + double y0 = yt + tt->getShapeY0() + yo + 1.0 / 64.0f; + double z0 = zt + tt->getShapeZ0() + zo; + double z1 = zt + tt->getShapeZ1() + zo; + + float u0 = (float) ((x - (x0)) / 2 / r + 0.5f); + float u1 = (float) ((x - (x1)) / 2 / r + 0.5f); + float v0 = (float) ((z - (z0)) / 2 / r + 0.5f); + float v1 = (float) ((z - (z1)) / 2 / r + 0.5f); + + // u0 = 0; + // v0 = 0; + // u1 = 1; + // v1 = 1; + + t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( u0), (float)( v0)); + t->vertexUV((float)(x0), (float)( y0), (float)( z1), (float)( u0), (float)( v1)); + t->vertexUV((float)(x1), (float)( y0), (float)( z1), (float)( u1), (float)( v1)); + t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( u1), (float)( v0)); } void EntityRenderer::render(AABB *bb, double xo, double yo, double zo) { - glDisable(GL_TEXTURE_2D); - Tesselator *t = Tesselator::getInstance(); - glColor4f(1, 1, 1, 1); - t->begin(); - t->offset((float)xo, (float)yo, (float)zo); - t->normal(0, 0, -1); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); - - t->normal(0, 0, 1); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); - - t->normal(0, -1, 0); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); - - t->normal(0, 1, 0); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); - - t->normal(-1, 0, 0); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); - - t->normal(1, 0, 0); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); - t->offset(0, 0, 0); - t->end(); - glEnable(GL_TEXTURE_2D); - // model.render(0, 1) + glDisable(GL_TEXTURE_2D); + Tesselator *t = Tesselator::getInstance(); + glColor4f(1, 1, 1, 1); + t->begin(); + t->offset((float)xo, (float)yo, (float)zo); + t->normal(0, 0, -1); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + + t->normal(0, 0, 1); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + + t->normal(0, -1, 0); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + + t->normal(0, 1, 0); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + + t->normal(-1, 0, 0); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + + t->normal(1, 0, 0); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->offset(0, 0, 0); + t->end(); + glEnable(GL_TEXTURE_2D); + // model.render(0, 1) } void EntityRenderer::renderFlat(AABB *bb) { - Tesselator *t = Tesselator::getInstance(); - t->begin(); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); - t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); - t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); - t->end(); + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x0), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x0), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z0)); + t->vertex((float)(bb->x1), (float)( bb->y1), (float)( bb->z1)); + t->vertex((float)(bb->x1), (float)( bb->y0), (float)( bb->z1)); + t->end(); } void EntityRenderer::renderFlat(float x0, float y0, float z0, float x1, float y1, float z1) @@ -407,4 +402,9 @@ Font *EntityRenderer::getFont() void EntityRenderer::registerTerrainTextures(IconRegister *iconRegister) { +} + +ResourceLocation *EntityRenderer::getTextureLocation(shared_ptr mob) +{ + return NULL; } \ No newline at end of file diff --git a/Minecraft.Client/EntityRenderer.h b/Minecraft.Client/EntityRenderer.h index e0c264a5..ef3b63bd 100644 --- a/Minecraft.Client/EntityRenderer.h +++ b/Minecraft.Client/EntityRenderer.h @@ -1,15 +1,17 @@ #pragma once - #include "Model.h" #include "TileRenderer.h" #include "Tesselator.h" #include "Textures.h" #include "ItemInHandRenderer.h" +#include "ResourceLocation.h" + class Tile; class Entity; class Level; class AABB; class IconRegister; +class ResourceLocation; using namespace std; @@ -24,7 +26,11 @@ protected: EntityRenderDispatcher *entityRenderDispatcher; private: - Model *model; // 4J - TODO - check why exactly this is here, it seems to get shadowed by classes inheriting from this by their own + static ResourceLocation SHADOW_LOCATION; + +protected: + Model *model; // TODO 4J: Check why exactly this is here, it seems to get shadowed by classes inheriting from this by their own + protected: TileRenderer *tileRenderer; // 4J - changed to protected so derived classes can use instead of shadowing their own @@ -38,11 +44,12 @@ public: public: virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a) = 0; protected: - virtual void bindTexture(int resourceName); // 4J - added - virtual void bindTexture(const wstring& resourceName); + virtual void bindTexture(shared_ptr entity); + virtual void bindTexture(ResourceLocation *location); + virtual bool bindTexture(const wstring& urlTexture, int backupTexture); + virtual bool bindTexture(const wstring& urlTexture, const wstring& backupTexture); - virtual bool bindTexture(const wstring& urlTexture, int backupTexture); // 4J added - virtual bool bindTexture(const wstring& urlTexture, const wstring& backupTexture); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); private: virtual void renderFlame(shared_ptr e, double x, double y, double z, float a); virtual void renderShadow(shared_ptr e, double x, double y, double z, float pow, float a); diff --git a/Minecraft.Client/EntityTileRenderer.cpp b/Minecraft.Client/EntityTileRenderer.cpp index a2301d42..deed369e 100644 --- a/Minecraft.Client/EntityTileRenderer.cpp +++ b/Minecraft.Client/EntityTileRenderer.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "EntityTileRenderer.h" #include "TileEntityRenderDispatcher.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" EntityTileRenderer *EntityTileRenderer::instance = new EntityTileRenderer; @@ -8,6 +9,7 @@ EntityTileRenderer *EntityTileRenderer::instance = new EntityTileRenderer; EntityTileRenderer::EntityTileRenderer() { chest = shared_ptr(new ChestTileEntity()); + trappedChest = shared_ptr(new ChestTileEntity(ChestTile::TYPE_TRAP)); enderChest = shared_ptr(new EnderChestTileEntity()); } @@ -17,6 +19,10 @@ void EntityTileRenderer::render(Tile *tile, int data, float brightness, float al { TileEntityRenderDispatcher::instance->render(enderChest, 0, 0, 0, 0, setColor, alpha, useCompiled); } + else if (tile->id == Tile::chest_trap_Id) + { + TileEntityRenderDispatcher::instance->render(trappedChest, 0, 0, 0, 0, setColor, alpha, useCompiled); + } else { TileEntityRenderDispatcher::instance->render(chest, 0, 0, 0, 0, setColor, alpha, useCompiled); diff --git a/Minecraft.Client/EntityTileRenderer.h b/Minecraft.Client/EntityTileRenderer.h index cc572cad..b5f714dc 100644 --- a/Minecraft.Client/EntityTileRenderer.h +++ b/Minecraft.Client/EntityTileRenderer.h @@ -11,6 +11,7 @@ class EntityTileRenderer private: shared_ptr chest; + shared_ptr trappedChest; shared_ptr enderChest; public: diff --git a/Minecraft.Client/EntityTracker.cpp b/Minecraft.Client/EntityTracker.cpp index 8f1dbcd8..adc230ee 100644 --- a/Minecraft.Client/EntityTracker.cpp +++ b/Minecraft.Client/EntityTracker.cpp @@ -18,6 +18,7 @@ #include "..\Minecraft.World\net.minecraft.network.h" #include "..\Minecraft.World\net.minecraft.world.level.dimension.h" #include "..\Minecraft.World\BasicTypeContainers.h" +#include "..\Minecraft.World\net.minecraft.world.level.chunk.h" #include "PlayerConnection.h" EntityTracker::EntityTracker(ServerLevel *level) @@ -28,7 +29,7 @@ EntityTracker::EntityTracker(ServerLevel *level) void EntityTracker::addEntity(shared_ptr e) { - if (e->GetType() == eTYPE_SERVERPLAYER) + if (e->instanceof(eTYPE_SERVERPLAYER)) { addEntity(e, 32 * 16, 2); shared_ptr player = dynamic_pointer_cast(e); @@ -40,29 +41,32 @@ void EntityTracker::addEntity(shared_ptr e) } } } - else if (e->GetType() == eTYPE_FISHINGHOOK) addEntity(e, 16 * 4, 5, true); - else if (e->GetType() == eTYPE_SMALL_FIREBALL) addEntity(e, 16 * 4, 10, false); - else if (e->GetType() == eTYPE_DRAGON_FIREBALL) addEntity(e, 16 * 4, 10, false); // 4J Added TU9 - else if (e->GetType() == eTYPE_ARROW) addEntity(e, 16 * 4, 20, false); - else if (e->GetType() == eTYPE_FIREBALL) addEntity(e, 16 * 4, 10, false); - else if (e->GetType() == eTYPE_SNOWBALL) addEntity(e, 16 * 4, 10, true); - else if (e->GetType() == eTYPE_THROWNENDERPEARL) addEntity(e, 16 * 4, 10, true); - else if (e->GetType() == eTYPE_EYEOFENDERSIGNAL ) addEntity(e, 16 * 4, 4, true); - else if (e->GetType() == eTYPE_THROWNEGG) addEntity(e, 16 * 4, 10, true); - else if (e->GetType() == eTYPE_THROWNPOTION ) addEntity(e, 16 * 4, 10, true); - else if (e->GetType() == eTYPE_THROWNEXPBOTTLE) addEntity(e, 16 * 4, 10, true); - else if (e->GetType() == eTYPE_ITEMENTITY) addEntity(e, 16 * 4, 20, true); - else if (e->GetType() == eTYPE_MINECART) addEntity(e, 16 * 5, 3, true); - else if (e->GetType() == eTYPE_BOAT) addEntity(e, 16 * 5, 3, true); - else if (e->GetType() == eTYPE_SQUID) addEntity(e, 16 * 4, 3, true); + else if (e->instanceof(eTYPE_FISHINGHOOK)) addEntity(e, 16 * 4, 5, true); + else if (e->instanceof(eTYPE_SMALL_FIREBALL)) addEntity(e, 16 * 4, 10, false); + else if (e->instanceof(eTYPE_DRAGON_FIREBALL)) addEntity(e, 16 * 4, 10, false); // 4J Added TU9 + else if (e->instanceof(eTYPE_ARROW)) addEntity(e, 16 * 4, 20, false); + else if (e->instanceof(eTYPE_FIREBALL)) addEntity(e, 16 * 4, 10, false); + else if (e->instanceof(eTYPE_SNOWBALL)) addEntity(e, 16 * 4, 10, true); + else if (e->instanceof(eTYPE_THROWNENDERPEARL)) addEntity(e, 16 * 4, 10, true); + else if (e->instanceof(eTYPE_EYEOFENDERSIGNAL)) addEntity(e, 16 * 4, 4, true); + else if (e->instanceof(eTYPE_THROWNEGG)) addEntity(e, 16 * 4, 10, true); + else if (e->instanceof(eTYPE_THROWNPOTION)) addEntity(e, 16 * 4, 10, true); + else if (e->instanceof(eTYPE_THROWNEXPBOTTLE)) addEntity(e, 16 * 4, 10, true); + else if (e->instanceof(eTYPE_FIREWORKS_ROCKET)) addEntity(e, 16 * 4, 10, true); + else if (e->instanceof(eTYPE_ITEMENTITY)) addEntity(e, 16 * 4, 20, true); + else if (e->instanceof(eTYPE_MINECART)) addEntity(e, 16 * 5, 3, true); + else if (e->instanceof(eTYPE_BOAT)) addEntity(e, 16 * 5, 3, true); + else if (e->instanceof(eTYPE_SQUID)) addEntity(e, 16 * 4, 3, true); + else if (e->instanceof(eTYPE_WITHERBOSS)) addEntity(e, 16 * 5, 3, false); + else if (e->instanceof(eTYPE_BAT)) addEntity(e, 16 * 5, 3, false); else if (dynamic_pointer_cast(e)!=NULL) addEntity(e, 16 * 5, 3, true); - else if (e->GetType() == eTYPE_ENDERDRAGON ) addEntity(e, 16 * 10, 3, true); - else if (e->GetType() == eTYPE_PRIMEDTNT) addEntity(e, 16 * 10, 10, true); - else if (e->GetType() == eTYPE_FALLINGTILE) addEntity(e, 16 * 10, 20, true); - else if (e->GetType() == eTYPE_PAINTING) addEntity(e, 16 * 10, INT_MAX, false); - else if (e->GetType() == eTYPE_EXPERIENCEORB) addEntity(e, 16 * 10, 20, true); - else if (e->GetType() == eTYPE_ENDER_CRYSTAL) addEntity(e, 16 * 16, INT_MAX, false); - else if (e->GetType() == eTYPE_ITEM_FRAME) addEntity(e, 16 * 10, INT_MAX, false); + else if (e->instanceof(eTYPE_ENDERDRAGON)) addEntity(e, 16 * 10, 3, true); + else if (e->instanceof(eTYPE_PRIMEDTNT)) addEntity(e, 16 * 10, 10, true); + else if (e->instanceof(eTYPE_FALLINGTILE)) addEntity(e, 16 * 10, 20, true); + else if (e->instanceof(eTYPE_HANGING_ENTITY)) addEntity(e, 16 * 10, INT_MAX, false); + else if (e->instanceof(eTYPE_EXPERIENCEORB)) addEntity(e, 16 * 10, 20, true); + else if (e->instanceof(eTYPE_ENDER_CRYSTAL)) addEntity(e, 16 * 16, INT_MAX, false); + else if (e->instanceof(eTYPE_ITEM_FRAME)) addEntity(e, 16 * 10, INT_MAX, false); } void EntityTracker::addEntity(shared_ptr e, int range, int updateInterval) @@ -110,6 +114,9 @@ void EntityTracker::removePlayer(shared_ptr e) { (*it)->removePlayer(player); } + + // 4J: Flush now to ensure remove packets are sent before player respawns and add entity packets are sent + player->flushEntitiesToRemove(); } } @@ -211,6 +218,18 @@ void EntityTracker::clear(shared_ptr serverPlayer) } } +void EntityTracker::playerLoadedChunk(shared_ptr player, LevelChunk *chunk) +{ + for (AUTO_VAR(it,entities.begin()); it != entities.end(); ++it) + { + shared_ptr te = *it; + if (te->e != player && te->e->xChunk == chunk->x && te->e->zChunk == chunk->z) + { + te->updatePlayer(this, player); + } + } +} + // AP added for Vita so the range can be increased once the level starts void EntityTracker::updateMaxRange() { diff --git a/Minecraft.Client/EntityTracker.h b/Minecraft.Client/EntityTracker.h index 82b01d07..6ff9fe0f 100644 --- a/Minecraft.Client/EntityTracker.h +++ b/Minecraft.Client/EntityTracker.h @@ -28,6 +28,7 @@ public: void broadcast(shared_ptr e, shared_ptr packet); void broadcastAndSend(shared_ptr e, shared_ptr packet); void clear(shared_ptr serverPlayer); + void playerLoadedChunk(shared_ptr player, LevelChunk *chunk); void updateMaxRange(); // AP added for Vita diff --git a/Minecraft.Client/ExperienceOrbRenderer.cpp b/Minecraft.Client/ExperienceOrbRenderer.cpp index 1771f833..c0eae756 100644 --- a/Minecraft.Client/ExperienceOrbRenderer.cpp +++ b/Minecraft.Client/ExperienceOrbRenderer.cpp @@ -8,17 +8,14 @@ #include "..\Minecraft.World\Mth.h" #include "..\Minecraft.World\JavaMath.h" +ResourceLocation ExperienceOrbRenderer::XP_ORB_LOCATION = ResourceLocation(TN_ITEM_EXPERIENCE_ORB); + ExperienceOrbRenderer::ExperienceOrbRenderer() { - // 4J In class Java initialisors - tileRenderer = new TileRenderer(); - setColor = true; - - this->shadowRadius = 0.15f; - this->shadowStrength = 0.75f; + shadowRadius = 0.15f; + shadowStrength = 0.75f; } - void ExperienceOrbRenderer::render(shared_ptr _orb, double x, double y, double z, float rot, float a) { shared_ptr orb = dynamic_pointer_cast(_orb); @@ -26,8 +23,7 @@ void ExperienceOrbRenderer::render(shared_ptr _orb, double x, double y, glTranslatef((float) x, (float) y, (float) z); int icon = orb->getIcon(); - bindTexture(TN_ITEM_EXPERIENCE_ORB); // 4J was L"/item/xporb.png" - Tesselator *t = Tesselator::getInstance(); + bindTexture(orb); // 4J was L"/item/xporb.png" float u0 = ((icon % 4) * 16 + 0) / 64.0f; float u1 = ((icon % 4) * 16 + 16) / 64.0f; @@ -62,6 +58,7 @@ void ExperienceOrbRenderer::render(shared_ptr _orb, double x, double y, glRotatef(-entityRenderDispatcher->playerRotX, 1, 0, 0); float s = 0.3f; glScalef(s, s, s); + Tesselator *t = Tesselator::getInstance(); t->begin(); t->color(col, 128); t->normal(0, 1, 0); @@ -76,6 +73,11 @@ void ExperienceOrbRenderer::render(shared_ptr _orb, double x, double y, glPopMatrix(); } +ResourceLocation *ExperienceOrbRenderer::getTextureLocation(shared_ptr mob) +{ + return &XP_ORB_LOCATION; +} + void ExperienceOrbRenderer::blit(int x, int y, int sx, int sy, int w, int h) { float blitOffset = 0; diff --git a/Minecraft.Client/ExperienceOrbRenderer.h b/Minecraft.Client/ExperienceOrbRenderer.h index ebd166f4..68047b80 100644 --- a/Minecraft.Client/ExperienceOrbRenderer.h +++ b/Minecraft.Client/ExperienceOrbRenderer.h @@ -1,17 +1,16 @@ #pragma once - #include "EntityRenderer.h" class ExperienceOrbRenderer : public EntityRenderer { private: - TileRenderer *tileRenderer; + static ResourceLocation XP_ORB_LOCATION; public: - bool setColor; - ExperienceOrbRenderer(); - void render(shared_ptr _orb, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _orb, double x, double y, double z, float rot, float a); void blit(int x, int y, int sx, int sy, int w, int h); + + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/FallingTileRenderer.cpp b/Minecraft.Client/FallingTileRenderer.cpp index 02e23dad..2d9f5dae 100644 --- a/Minecraft.Client/FallingTileRenderer.cpp +++ b/Minecraft.Client/FallingTileRenderer.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "FallingTileRenderer.h" +#include "TextureAtlas.h" #include "TileRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.item.h" #include "..\Minecraft.World\net.minecraft.world.level.h" @@ -16,41 +17,51 @@ void FallingTileRenderer::render(shared_ptr _tile, double x, double y, d { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr tile = dynamic_pointer_cast(_tile); - glPushMatrix(); - glTranslatef((float) x, (float) y, (float) z); - - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - Tile *tt = Tile::tiles[tile->tile]; - Level *level = tile->getLevel(); - glDisable(GL_LIGHTING); - glColor4f(1, 1, 1, 1); // 4J added - this wouldn't be needed in real opengl as the block render has vertex colours and so this isn't use, but our pretend gl always modulates with this - if (tt == Tile::anvil && tt->getRenderShape() == Tile::SHAPE_ANVIL) - { - tileRenderer->level = level; - Tesselator *t = Tesselator::getInstance(); - t->begin(); - t->offset(-Mth::floor(tile->x) - 0.5f, -Mth::floor(tile->y) - 0.5f, -Mth::floor(tile->z) - 0.5f); - tileRenderer->tesselateAnvilInWorld((AnvilTile *) tt, Mth::floor(tile->x), Mth::floor(tile->y), Mth::floor(tile->z), tile->data); - t->offset(0, 0, 0); - t->end(); - } - else if (tt == Tile::dragonEgg) - { - tileRenderer->level = level; - Tesselator *t = Tesselator::getInstance(); - t->begin(); - t->offset(-Mth::floor(tile->x) - 0.5f, -Mth::floor(tile->y) - 0.5f, -Mth::floor(tile->z) - 0.5f); - tileRenderer->tesselateInWorld(tt, Mth::floor(tile->x), Mth::floor(tile->y), Mth::floor(tile->z)); - t->offset(0, 0, 0); - t->end(); - } - else if( tt != NULL ) + if (level->getTile(floor(tile->x), floor(tile->y), floor(tile->z)) != tile->tile) { - tileRenderer->setShape(tt); - tileRenderer->renderBlock(tt, level, Mth::floor(tile->x), Mth::floor(tile->y), Mth::floor(tile->z), tile->data); + glPushMatrix(); + glTranslatef((float) x, (float) y, (float) z); + + bindTexture(tile); // 4J was L"/terrain.png" + Tile *tt = Tile::tiles[tile->tile]; + + Level *level = tile->getLevel(); + + glDisable(GL_LIGHTING); + glColor4f(1, 1, 1, 1); // 4J added - this wouldn't be needed in real opengl as the block render has vertex colours and so this isn't use, but our pretend gl always modulates with this + if (tt == Tile::anvil && tt->getRenderShape() == Tile::SHAPE_ANVIL) + { + tileRenderer->level = level; + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->offset(-Mth::floor(tile->x) - 0.5f, -Mth::floor(tile->y) - 0.5f, -Mth::floor(tile->z) - 0.5f); + tileRenderer->tesselateAnvilInWorld((AnvilTile *) tt, Mth::floor(tile->x), Mth::floor(tile->y), Mth::floor(tile->z), tile->data); + t->offset(0, 0, 0); + t->end(); + } + else if (tt == Tile::dragonEgg) + { + tileRenderer->level = level; + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->offset(-Mth::floor(tile->x) - 0.5f, -Mth::floor(tile->y) - 0.5f, -Mth::floor(tile->z) - 0.5f); + tileRenderer->tesselateInWorld(tt, Mth::floor(tile->x), Mth::floor(tile->y), Mth::floor(tile->z)); + t->offset(0, 0, 0); + t->end(); + } + else if( tt != NULL ) + { + tileRenderer->setShape(tt); + tileRenderer->renderBlock(tt, level, Mth::floor(tile->x), Mth::floor(tile->y), Mth::floor(tile->z), tile->data); + } + glEnable(GL_LIGHTING); + glPopMatrix(); } - glEnable(GL_LIGHTING); - glPopMatrix(); +} + +ResourceLocation *FallingTileRenderer::getTextureLocation(shared_ptr mob) +{ + return &TextureAtlas::LOCATION_BLOCKS; } \ No newline at end of file diff --git a/Minecraft.Client/FallingTileRenderer.h b/Minecraft.Client/FallingTileRenderer.h index 0ece6033..de4c5bfc 100644 --- a/Minecraft.Client/FallingTileRenderer.h +++ b/Minecraft.Client/FallingTileRenderer.h @@ -1,7 +1,6 @@ #pragma once #include "EntityRenderer.h" - class FallingTileRenderer : public EntityRenderer { private: @@ -11,4 +10,5 @@ public: FallingTileRenderer(); virtual void render(shared_ptr _tile, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/FireballRenderer.cpp b/Minecraft.Client/FireballRenderer.cpp index 836e8be3..3b1ab924 100644 --- a/Minecraft.Client/FireballRenderer.cpp +++ b/Minecraft.Client/FireballRenderer.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "FireballRenderer.h" #include "EntityRenderDispatcher.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" @@ -25,7 +26,7 @@ void FireballRenderer::render(shared_ptr _fireball, double x, double y, glScalef(s / 1.0f, s / 1.0f, s / 1.0f); Icon *icon = Item::fireball->getIcon(fireball->GetType()==eTYPE_DRAGON_FIREBALL?1:0);//14 + 2 * 16; MemSect(31); - bindTexture(TN_GUI_ITEMS); // 4J was L"/gui/items.png" + bindTexture(fireball); MemSect(0); Tesselator *t = Tesselator::getInstance(); @@ -65,7 +66,7 @@ void FireballRenderer::renderFlame(shared_ptr e, double x, double y, dou float s = e->bbWidth * 1.4f; glScalef(s, s, s); MemSect(31); - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + bindTexture(&TextureAtlas::LOCATION_BLOCKS); MemSect(0); Tesselator *t = Tesselator::getInstance(); @@ -106,4 +107,9 @@ void FireballRenderer::renderFlame(shared_ptr e, double x, double y, dou t->end(); glPopMatrix(); glEnable(GL_LIGHTING); +} + +ResourceLocation *FireballRenderer::getTextureLocation(shared_ptr mob) +{ + return &TextureAtlas::LOCATION_ITEMS; } \ No newline at end of file diff --git a/Minecraft.Client/FireballRenderer.h b/Minecraft.Client/FireballRenderer.h index 9b22e74a..44b8b4c4 100644 --- a/Minecraft.Client/FireballRenderer.h +++ b/Minecraft.Client/FireballRenderer.h @@ -13,5 +13,6 @@ public: private: // 4J Added override - virtual void renderFlame(shared_ptr e, double x, double y, double z, float a); + virtual void renderFlame(shared_ptr entity, double x, double y, double z, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; diff --git a/Minecraft.Client/FireworksParticles.cpp b/Minecraft.Client/FireworksParticles.cpp new file mode 100644 index 00000000..fd19b011 --- /dev/null +++ b/Minecraft.Client/FireworksParticles.cpp @@ -0,0 +1,491 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "FireworksParticles.h" +#include "Tesselator.h" +#include "../Minecraft.World/Level.h" + +FireworksParticles::FireworksStarter::FireworksStarter(Level *level, double x, double y, double z, double xd, double yd, double zd, ParticleEngine *engine, CompoundTag *infoTag) : Particle(level, x, y, z, 0, 0, 0) +{ + life = 0; + twinkleDelay = false; + + this->xd = xd; + this->yd = yd; + this->zd = zd; + this->engine = engine; + lifetime = 8; + + if (infoTag != NULL) + { + explosions = (ListTag *)infoTag->getList(FireworksItem::TAG_EXPLOSIONS)->copy(); + if (explosions->size() == 0) + { + explosions = NULL; + } + else + { + lifetime = explosions->size() * 2 - 1; + + // check if any of the explosions has flickering + for (int e = 0; e < explosions->size(); e++) + { + CompoundTag *compoundTag = explosions->get(e); + if (compoundTag->getBoolean(FireworksItem::TAG_E_FLICKER)) + { + twinkleDelay = true; + lifetime += 15; + break; + } + } + } + } + else + { + // 4J: + explosions = NULL; + } +} + +void FireworksParticles::FireworksStarter::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + // Do nothing +} + +void FireworksParticles::FireworksStarter::tick() +{ + if (life == 0 && explosions != NULL) + { + bool farEffect = isFarAwayFromCamera(); + + bool largeExplosion = false; + if (explosions->size() >= 3) + { + largeExplosion = true; + } + else + { + for (int e = 0; e < explosions->size(); e++) + { + CompoundTag *compoundTag = explosions->get(e); + if (compoundTag->getByte(FireworksItem::TAG_E_TYPE) == FireworksItem::TYPE_BIG) + { + largeExplosion = true; + break; + } + } + } + + eSOUND_TYPE soundId; + + if (largeExplosion && farEffect) + { + soundId = eSoundType_FIREWORKS_LARGE_BLAST_FAR; + } + else if (largeExplosion && !farEffect) + { + soundId = eSoundType_FIREWORKS_LARGE_BLAST; + } + else if (!largeExplosion && farEffect) + { + soundId = eSoundType_FIREWORKS_BLAST_FAR; + } + else + { + soundId = eSoundType_FIREWORKS_BLAST; + } + + level->playLocalSound(x, y, z, soundId, 20, .95f + random->nextFloat() * .1f, true, 100.0f); + } + + if ((life % 2) == 0 && explosions != NULL && (life / 2) < explosions->size()) + { + int eIndex = life / 2; + CompoundTag *compoundTag = explosions->get(eIndex); + + int type = compoundTag->getByte(FireworksItem::TAG_E_TYPE); + bool trail = compoundTag->getBoolean(FireworksItem::TAG_E_TRAIL); + bool flicker = compoundTag->getBoolean(FireworksItem::TAG_E_FLICKER); + intArray colors = compoundTag->getIntArray(FireworksItem::TAG_E_COLORS); + intArray fadeColors = compoundTag->getIntArray(FireworksItem::TAG_E_FADECOLORS); + + if (type == FireworksItem::TYPE_BIG) + { + // large ball + createParticleBall(.5, 4, colors, fadeColors, trail, flicker); + } + else if (type == FireworksItem::TYPE_STAR) + { + double coords[6][2] = { + 0.0, 1.0, + 0.3455, 0.3090, + 0.9511, 0.3090, + 93.0 / 245.0, -31.0 / 245.0, + 150.0 / 245.0, -197.0 / 245.0, + 0.0, -88.0 / 245.0, + }; + coords2DArray coordsArray(6, 2); + for(unsigned int i = 0; i < coordsArray.length; ++i) + { + for(unsigned int j = 0; j < coordsArray[i]->length; ++j) + { + coordsArray[i]->data[j] = coords[i][j]; + } + } + + // star-shape + createParticleShape(.5, coordsArray, colors, fadeColors, trail, flicker, false); + + for(unsigned int i = 0; i < coordsArray.length; ++i) + { + delete [] coordsArray[i]->data; + } + delete [] coordsArray.data; + } + else if (type == FireworksItem::TYPE_CREEPER) + { + double coords[12][2] = { + 0.0, 0.2, + 0.2, 0.2, + 0.2, 0.6, + 0.6, 0.6, + 0.6, 0.2, + 0.2, 0.2, + 0.2, 0.0, + 0.4, 0.0, + 0.4, -0.6, + 0.2, -0.6, + 0.2, -0.4, + 0.0, -0.4, + }; + coords2DArray coordsArray(12, 2); + for(unsigned int i = 0; i < coordsArray.length; ++i) + { + for(unsigned int j = 0; j < coordsArray[i]->length; ++j) + { + coordsArray[i]->data[j] = coords[i][j]; + } + } + + // creeper-shape + createParticleShape(.5, coordsArray, colors, fadeColors, trail, flicker, true); + + for(unsigned int i = 0; i < coordsArray.length; ++i) + { + delete [] coordsArray[i]->data; + } + delete [] coordsArray.data; + } + else if (type == FireworksItem::TYPE_BURST) + { + createParticleBurst(colors, fadeColors, trail, flicker); + } + else + { + // small ball + createParticleBall(.25, 2, colors, fadeColors, trail, flicker); + } + { + int rgb = colors[0]; + float r = (float) ((rgb & 0xff0000) >> 16) / 255.0f; + float g = (float) ((rgb & 0x00ff00) >> 8) / 255.0f; + float b = (float) ((rgb & 0x0000ff) >> 0) / 255.0f; + shared_ptr fireworksOverlayParticle = shared_ptr(new FireworksParticles::FireworksOverlayParticle(level, x, y, z)); + fireworksOverlayParticle->setColor(r, g, b); + fireworksOverlayParticle->setAlpha(0.99f); // 4J added + engine->add(fireworksOverlayParticle); + } + } + life++; + if (life > lifetime) + { + if (twinkleDelay) + { + bool farEffect = isFarAwayFromCamera(); + eSOUND_TYPE soundId = farEffect ? eSoundType_FIREWORKS_TWINKLE_FAR : eSoundType_FIREWORKS_TWINKLE; + level->playLocalSound(x, y, z, soundId, 20, .90f + random->nextFloat() * .15f, true, 100.0f); + + } + remove(); + } +} + +bool FireworksParticles::FireworksStarter::isFarAwayFromCamera() +{ + Minecraft *instance = Minecraft::GetInstance(); + if (instance != NULL && instance->cameraTargetPlayer != NULL) + { + if (instance->cameraTargetPlayer->distanceToSqr(x, y, z) < 16 * 16) + { + return false; + } + } + return true; +} + +void FireworksParticles::FireworksStarter::createParticle(double x, double y, double z, double xa, double ya, double za, intArray rgbColors, intArray fadeColors, bool trail, bool flicker) +{ + shared_ptr fireworksSparkParticle = shared_ptr(new FireworksSparkParticle(level, x, y, z, xa, ya, za, engine)); + fireworksSparkParticle->setAlpha(0.99f); + fireworksSparkParticle->setTrail(trail); + fireworksSparkParticle->setFlicker(flicker); + + int color = random->nextInt(rgbColors.length); + fireworksSparkParticle->setColor(rgbColors[color]); + if (/*fadeColors != NULL &&*/ fadeColors.length > 0) + { + fireworksSparkParticle->setFadeColor(fadeColors[random->nextInt(fadeColors.length)]); + } + engine->add(fireworksSparkParticle); +} + +void FireworksParticles::FireworksStarter::createParticleBall(double baseSpeed, int steps, intArray rgbColors, intArray fadeColors, bool trail, bool flicker) { + + double xx = x; + double yy = y; + double zz = z; + + for (int yStep = -steps; yStep <= steps; yStep++) { + for (int xStep = -steps; xStep <= steps; xStep++) { + for (int zStep = -steps; zStep <= steps; zStep++) { + double xa = xStep + (random->nextDouble() - random->nextDouble()) * .5; + double ya = yStep + (random->nextDouble() - random->nextDouble()) * .5; + double za = zStep + (random->nextDouble() - random->nextDouble()) * .5; + double len = sqrt(xa * xa + ya * ya + za * za) / baseSpeed + random->nextGaussian() * .05; + + createParticle(xx, yy, zz, xa / len, ya / len, za / len, rgbColors, fadeColors, trail, flicker); + + if (yStep != -steps && yStep != steps && xStep != -steps && xStep != steps) { + zStep += steps * 2 - 1; + } + } + } + } +} + +void FireworksParticles::FireworksStarter::createParticleShape(double baseSpeed, coords2DArray coords, intArray rgbColors, intArray fadeColors, bool trail, bool flicker, bool flat) +{ + double sx = coords[0]->data[0]; + double sy = coords[0]->data[1]; + + { + createParticle(x, y, z, sx * baseSpeed, sy * baseSpeed, 0, rgbColors, fadeColors, trail, flicker); + } + + float baseAngle = random->nextFloat() * PI; + double angleMod = (flat ? .034 : .34); + for (int angleStep = 0; angleStep < 3; angleStep++) + { + double angle = baseAngle + angleStep * PI * angleMod; + + double ox = sx; + double oy = sy; + + for (int c = 1; c < coords.length; c++) + { + double tx = coords[c]->data[0]; + double ty = coords[c]->data[1]; + + for (double subStep = .25; subStep <= 1.0; subStep += .25) + { + double xa = (ox + (tx - ox) * subStep) * baseSpeed; + double ya = (oy + (ty - oy) * subStep) * baseSpeed; + + double za = xa * sin(angle); + xa = xa * cos(angle); + + for (double flip = -1; flip <= 1; flip += 2) + { + createParticle(x, y, z, xa * flip, ya, za * flip, rgbColors, fadeColors, trail, flicker); + } + } + ox = tx; + oy = ty; + } + + } +} + +void FireworksParticles::FireworksStarter::createParticleBurst(intArray rgbColors, intArray fadeColors, bool trail, bool flicker) +{ + double baseOffX = random->nextGaussian() * .05; + double baseOffZ = random->nextGaussian() * .05; + + for (int i = 0; i < 70; i++) { + + double xa = xd * .5 + random->nextGaussian() * .15 + baseOffX; + double za = zd * .5 + random->nextGaussian() * .15 + baseOffZ; + double ya = yd * .5 + random->nextDouble() * .5; + + createParticle(x, y, z, xa, ya, za, rgbColors, fadeColors, trail, flicker); + } +} + +int FireworksParticles::FireworksStarter::getParticleTexture() +{ + return ParticleEngine::MISC_TEXTURE; +} + +FireworksParticles::FireworksSparkParticle::FireworksSparkParticle(Level *level, double x, double y, double z, double xa, double ya, double za, ParticleEngine *engine) : Particle(level, x, y, z) +{ + baseTex = 10 * 16; + + xd = xa; + yd = ya; + zd = za; + this->engine = engine; + + size *= 0.75f; + + lifetime = 48 + random->nextInt(12); +#ifdef __PSVITA__ + noPhysics = true; // 4J - optimisation, these are just too slow on Vita to be running with physics on +#else + noPhysics = false; +#endif + + + trail = false; + flicker = false; + + fadeR = 0.0f; + fadeG = 0.0f; + fadeB = 0.0f; + hasFade = false; +} + +void FireworksParticles::FireworksSparkParticle::setTrail(bool trail) +{ + this->trail = trail; +} + +void FireworksParticles::FireworksSparkParticle::setFlicker(bool flicker) +{ + this->flicker = flicker; +} + +void FireworksParticles::FireworksSparkParticle::setColor(int rgb) +{ + float r = (float) ((rgb & 0xff0000) >> 16) / 255.0f; + float g = (float) ((rgb & 0x00ff00) >> 8) / 255.0f; + float b = (float) ((rgb & 0x0000ff) >> 0) / 255.0f; + float scale = 1.0f; + Particle::setColor(r * scale, g * scale, b * scale); +} + +void FireworksParticles::FireworksSparkParticle::setFadeColor(int rgb) +{ + fadeR = (float) ((rgb & 0xff0000) >> 16) / 255.0f; + fadeG = (float) ((rgb & 0x00ff00) >> 8) / 255.0f; + fadeB = (float) ((rgb & 0x0000ff) >> 0) / 255.0f; + hasFade = true; +} + +AABB *FireworksParticles::FireworksSparkParticle::getCollideBox() +{ + return NULL; +} + +bool FireworksParticles::FireworksSparkParticle::isPushable() +{ + return false; +} + +void FireworksParticles::FireworksSparkParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + if (!flicker || age < (lifetime / 3) || (((age + lifetime) / 3) % 2) == 0) + { + Particle::render(t, a, xa, ya, za, xa2, za2); + } +} + +void FireworksParticles::FireworksSparkParticle::tick() +{ + xo = x; + yo = y; + zo = z; + + if (age++ >= lifetime) remove(); + if (age > lifetime / 2) + { + setAlpha(1.0f - (((float) age - lifetime / 2) / (float) lifetime)); + + if (hasFade) + { + rCol = rCol + (fadeR - rCol) * .2f; + gCol = gCol + (fadeG - gCol) * .2f; + bCol = bCol + (fadeB - bCol) * .2f; + } + } + + setMiscTex(baseTex + (7 - age * 8 / lifetime)); + + yd -= 0.004; + move(xd, yd, zd, true); // 4J - changed so these don't attempt to collide with entities + xd *= 0.91f; + yd *= 0.91f; + zd *= 0.91f; + + if (onGround) + { + xd *= 0.7f; + zd *= 0.7f; + } + + if (trail && (age < lifetime / 2) && ((age + lifetime) % 2) == 0) + { + shared_ptr fireworksSparkParticle = shared_ptr(new FireworksParticles::FireworksSparkParticle(level, x, y, z, 0, 0, 0, engine)); + fireworksSparkParticle->setAlpha(0.99f); + fireworksSparkParticle->setColor(rCol, gCol, bCol); + fireworksSparkParticle->age = fireworksSparkParticle->lifetime / 2; + if (hasFade) + { + fireworksSparkParticle->hasFade = true; + fireworksSparkParticle->fadeR = fadeR; + fireworksSparkParticle->fadeG = fadeG; + fireworksSparkParticle->fadeB = fadeB; + } + fireworksSparkParticle->flicker = flicker; + engine->add(fireworksSparkParticle); + } +} + +void FireworksParticles::FireworksSparkParticle::setBaseTex(int baseTex) +{ + this->baseTex = baseTex; +} + +int FireworksParticles::FireworksSparkParticle::getLightColor(float a) +{ + return SharedConstants::FULLBRIGHT_LIGHTVALUE; +} + +float FireworksParticles::FireworksSparkParticle::getBrightness(float a) +{ + return 1; +} + +FireworksParticles::FireworksOverlayParticle::FireworksOverlayParticle(Level *level, double x, double y, double z) : Particle(level, x, y, z) +{ + lifetime = 4; +} + +void FireworksParticles::FireworksOverlayParticle::render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2) +{ + float u0 = 32.0f / 128.0f; + float u1 = u0 + 32.0f / 128.0f; + float v0 = 16.0f / 128.0f; + float v1 = v0 + 32.0f / 128.0f; + float r = 7.1f * sin(((float) age + a - 1.0f) * .25f * PI); + alpha = 0.6f - ((float) age + a - 1.0f) * .25f * .5f; + + float x = (float) (xo + (this->x - xo) * a - xOff); + float y = (float) (yo + (this->y - yo) * a - yOff); + float z = (float) (zo + (this->z - zo) * a - zOff); + + t->color(rCol, gCol, bCol, alpha); + + t->vertexUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u1, v1); + t->vertexUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u1, v0); + t->vertexUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0); + t->vertexUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v1); +} \ No newline at end of file diff --git a/Minecraft.Client/FireworksParticles.h b/Minecraft.Client/FireworksParticles.h new file mode 100644 index 00000000..ac06be07 --- /dev/null +++ b/Minecraft.Client/FireworksParticles.h @@ -0,0 +1,77 @@ +#pragma once +#include "Particle.h" +#include "..\Minecraft.World\CompoundTag.h" + +class ParticleEngine; + +class FireworksParticles +{ +public: + + class FireworksStarter : public Particle + { + public: + virtual eINSTANCEOF GetType() { return eType_FIREWORKSSTARTERPARTICLE; } + + private: + int life; + ParticleEngine *engine; + ListTag *explosions; + bool twinkleDelay; + + public: + FireworksStarter(Level *level, double x, double y, double z, double xd, double yd, double zd, ParticleEngine *engine, CompoundTag *infoTag); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); + bool isFarAwayFromCamera(); + void createParticle(double x, double y, double z, double xa, double ya, double za, intArray rgbColors, intArray fadeColors, bool trail, bool flicker); + void createParticleBall(double baseSpeed, int steps, intArray rgbColors, intArray fadeColors, bool trail, bool flicker); + void createParticleShape(double baseSpeed, coords2DArray coords, intArray rgbColors, intArray fadeColors, bool trail, bool flicker, bool flat); + void createParticleBurst(intArray rgbColors, intArray fadeColors, bool trail, bool flicker); + + public: + int getParticleTexture(); + }; + + class FireworksSparkParticle : public Particle + { + public: + virtual eINSTANCEOF GetType() { return eType_FIREWORKSSPARKPARTICLE; } + + private: + int baseTex; + bool trail; + bool flicker; + ParticleEngine *engine; + + float fadeR; + float fadeG; + float fadeB; + bool hasFade; + + public: + FireworksSparkParticle(Level *level, double x, double y, double z, double xa, double ya, double za, ParticleEngine *engine); + void setTrail(bool trail); + void setFlicker(bool flicker); + using Particle::setColor; + void setColor(int rgb); + void setFadeColor(int rgb); + virtual AABB *getCollideBox(); + virtual bool isPushable(); + virtual void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + virtual void tick(); + virtual void setBaseTex(int baseTex); + virtual int getLightColor(float a); + virtual float getBrightness(float a); + }; + + class FireworksOverlayParticle : public Particle + { + public: + virtual eINSTANCEOF GetType() { return eType_FIREWORKSOVERLAYPARTICLE; } + + FireworksOverlayParticle(Level *level, double x, double y, double z); + + void render(Tesselator *t, float a, float xa, float ya, float za, float xa2, float za2); + }; +}; \ No newline at end of file diff --git a/Minecraft.Client/FishingHookRenderer.cpp b/Minecraft.Client/FishingHookRenderer.cpp index 0408e96e..9d60a9ac 100644 --- a/Minecraft.Client/FishingHookRenderer.cpp +++ b/Minecraft.Client/FishingHookRenderer.cpp @@ -8,6 +8,8 @@ #include "..\Minecraft.World\Mth.h" #include "MultiPlayerLocalPlayer.h" +ResourceLocation FishingHookRenderer::PARTICLE_LOCATION = ResourceLocation(TN_PARTICLES); + void FishingHookRenderer::render(shared_ptr _hook, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version @@ -20,13 +22,13 @@ void FishingHookRenderer::render(shared_ptr _hook, double x, double y, d glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); int xi = 1; int yi = 2; - bindTexture(TN_PARTICLES); // 4J was L"/particles.png" + bindTexture(hook); // 4J was L"/particles.png" Tesselator *t = Tesselator::getInstance(); - float u0 = ((xi) * 8 + 0) / 128.0f; - float u1 = ((xi) * 8 + 8) / 128.0f; - float v0 = ((yi) * 8 + 0) / 128.0f; - float v1 = ((yi) * 8 + 8) / 128.0f; + float u0 = (xi * 8 + 0) / 128.0f; + float u1 = (xi * 8 + 8) / 128.0f; + float v0 = (yi * 8 + 0) / 128.0f; + float v1 = (yi * 8 + 8) / 128.0f; float r = 1.0f; @@ -50,7 +52,7 @@ void FishingHookRenderer::render(shared_ptr _hook, double x, double y, d if (hook->owner != NULL) { float swing = hook->owner->getAttackAnim(a); - float swing2 = (float) Mth::sin((sqrt(swing)) * PI); + float swing2 = (float) Mth::sin(sqrt(swing) * PI); Vec3 *vv = Vec3::newTemp(-0.5, 0.03, 0.8); @@ -62,7 +64,7 @@ void FishingHookRenderer::render(shared_ptr _hook, double x, double y, d double xp = hook->owner->xo + (hook->owner->x - hook->owner->xo) * a + vv->x; double yp = hook->owner->yo + (hook->owner->y - hook->owner->yo) * a + vv->y; double zp = hook->owner->zo + (hook->owner->z - hook->owner->zo) * a + vv->z; - double yOffset = hook->owner != dynamic_pointer_cast(Minecraft::GetInstance()->player) ? hook->owner->getHeadHeight() : 0; + double yOffset = hook->owner == dynamic_pointer_cast(Minecraft::GetInstance()->player) ? 0 : hook->owner->getHeadHeight(); // 4J-PB - changing this to be per player //if (this->entityRenderDispatcher->options->thirdPersonView) @@ -99,3 +101,8 @@ void FishingHookRenderer::render(shared_ptr _hook, double x, double y, d glEnable(GL_TEXTURE_2D); } } + +ResourceLocation *FishingHookRenderer::getTextureLocation(shared_ptr mob) +{ + return &PARTICLE_LOCATION; +} diff --git a/Minecraft.Client/FishingHookRenderer.h b/Minecraft.Client/FishingHookRenderer.h index 2683f187..8c58ea9b 100644 --- a/Minecraft.Client/FishingHookRenderer.h +++ b/Minecraft.Client/FishingHookRenderer.h @@ -3,6 +3,10 @@ class FishingHookRenderer : public EntityRenderer { +private: + static ResourceLocation PARTICLE_LOCATION; + public: virtual void render(shared_ptr _hook, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/FolderTexturePack.cpp b/Minecraft.Client/FolderTexturePack.cpp index 45475688..4b65dc7f 100644 --- a/Minecraft.Client/FolderTexturePack.cpp +++ b/Minecraft.Client/FolderTexturePack.cpp @@ -58,7 +58,7 @@ bool FolderTexturePack::isTerrainUpdateCompatible() return true; } -wstring FolderTexturePack::getPath(bool bTitleUpdateTexture /*= false*/) +wstring FolderTexturePack::getPath(bool bTitleUpdateTexture /*= false*/,const char *pchBDPatchFilename) { wstring wDrive; #ifdef _XBOX diff --git a/Minecraft.Client/FolderTexturePack.h b/Minecraft.Client/FolderTexturePack.h index fff4abf5..40921078 100644 --- a/Minecraft.Client/FolderTexturePack.h +++ b/Minecraft.Client/FolderTexturePack.h @@ -20,7 +20,7 @@ public: bool isTerrainUpdateCompatible(); // 4J Added - virtual wstring getPath(bool bTitleUpdateTexture = false); + virtual wstring getPath(bool bTitleUpdateTexture = false, const char *pchBDPatchFilename=NULL); virtual void loadUI(); virtual void unloadUI(); }; \ No newline at end of file diff --git a/Minecraft.Client/Font.cpp b/Minecraft.Client/Font.cpp index 17f72853..7a37dd7b 100644 --- a/Minecraft.Client/Font.cpp +++ b/Minecraft.Client/Font.cpp @@ -3,12 +3,13 @@ #include "Font.h" #include "Options.h" #include "Tesselator.h" +#include "ResourceLocation.h" #include "..\Minecraft.World\IntBuffer.h" #include "..\Minecraft.World\net.minecraft.h" #include "..\Minecraft.World\StringHelpers.h" #include "..\Minecraft.World\Random.h" -Font::Font(Options *options, const wstring& name, Textures* textures, bool enforceUnicode, TEXTURE_NAME textureName, int cols, int rows, int charWidth, int charHeight, unsigned short charMap[]/* = nullptr */) : textures(textures) +Font::Font(Options *options, const wstring& name, Textures* textures, bool enforceUnicode, ResourceLocation *textureLocation, int cols, int rows, int charWidth, int charHeight, unsigned short charMap[]/* = nullptr */) : textures(textures) { int charC = cols * rows; // Number of characters in the font @@ -26,7 +27,7 @@ Font::Font(Options *options, const wstring& name, Textures* textures, bool enfor m_rows = rows; m_charWidth = charWidth; m_charHeight = charHeight; - m_textureName = textureName; + m_textureLocation = textureLocation; // Build character map if (charMap != NULL) @@ -40,7 +41,7 @@ Font::Font(Options *options, const wstring& name, Textures* textures, bool enfor random = new Random(); // Load the image - BufferedImage *img = textures->readImage(m_textureName, name); + BufferedImage *img = textures->readImage(textureLocation->getTexture(), name); /* - 4J - TODO try { @@ -195,7 +196,7 @@ wstring Font::reorderBidi(const wstring &str) void Font::draw(const wstring &str, bool dropShadow) { // Bind the texture - textures->bindTexture(m_textureName); + textures->bindTexture(m_textureLocation); bool noise = false; wstring cleanStr = sanitize(str); diff --git a/Minecraft.Client/Font.h b/Minecraft.Client/Font.h index b6ad555d..18d9bf91 100644 --- a/Minecraft.Client/Font.h +++ b/Minecraft.Client/Font.h @@ -1,7 +1,9 @@ #pragma once + class IntBuffer; class Options; class Textures; +class ResourceLocation; class Font { @@ -26,11 +28,11 @@ private: int m_rows; // Number of rows in font sheet int m_charWidth; // Maximum character width int m_charHeight; // Maximum character height - TEXTURE_NAME m_textureName; // Texture + ResourceLocation *m_textureLocation; // Texture std::map m_charMap; public: - Font(Options *options, const wstring& name, Textures* textures, bool enforceUnicode, TEXTURE_NAME textureName, int cols, int rows, int charWidth, int charHeight, unsigned short charMap[] = NULL); + Font(Options *options, const wstring& name, Textures* textures, bool enforceUnicode, ResourceLocation *textureLocation, int cols, int rows, int charWidth, int charHeight, unsigned short charMap[] = NULL); #ifndef _XBOX // 4J Stu - This dtor clashes with one in xui! We never delete these anyway so take it out for now. Can go back when we have got rid of XUI ~Font(); diff --git a/Minecraft.Client/FootstepParticle.cpp b/Minecraft.Client/FootstepParticle.cpp index 18331b32..300575eb 100644 --- a/Minecraft.Client/FootstepParticle.cpp +++ b/Minecraft.Client/FootstepParticle.cpp @@ -4,6 +4,9 @@ #include "Tesselator.h" #include "..\Minecraft.World\Mth.h" #include "..\Minecraft.World\net.minecraft.world.level.h" +#include "ResourceLocation.h" + +ResourceLocation FootstepParticle::FOOTPRINT_LOCATION = ResourceLocation(TN_MISC_FOOTSTEP); FootstepParticle::FootstepParticle(Textures *textures, Level *level, double x, double y, double z) : Particle(level, x, y, z, 0, 0, 0) { @@ -34,7 +37,7 @@ void FootstepParticle::render(Tesselator *t, float a, float xa, float ya, float float br = level->getBrightness(Mth::floor(x), Mth::floor(y), Mth::floor(z)); - textures->bindTexture(TN_MISC_FOOTSTEP);//L"/misc/footprint.png")); + textures->bindTexture(&FOOTPRINT_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); diff --git a/Minecraft.Client/FootstepParticle.h b/Minecraft.Client/FootstepParticle.h index 50e5e36d..56f2b915 100644 --- a/Minecraft.Client/FootstepParticle.h +++ b/Minecraft.Client/FootstepParticle.h @@ -6,7 +6,9 @@ class FootstepParticle : public Particle { public: virtual eINSTANCEOF GetType() { return eType_FOOTSTEPPARTICLE; } + private: + static ResourceLocation FOOTPRINT_LOCATION; int life; int lifeTime; Textures *textures; diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp index 508b3a1a..5e52459c 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -18,14 +18,15 @@ #include "MultiPlayerLevel.h" #include "Chunk.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" -#include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" -#include "..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\Minecraft.World\net.minecraft.world.item.enchantment.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\net.minecraft.world.level.material.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "..\Minecraft.World\net.minecraft.world.level.chunk.h" #include "..\Minecraft.World\net.minecraft.world.level.biome.h" #include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.phys.h" #include "..\Minecraft.World\System.h" #include "..\Minecraft.World\FloatBuffer.h" #include "..\Minecraft.World\ThreadName.h" @@ -45,9 +46,11 @@ #include "..\Minecraft.World\Item.h" #include "..\Minecraft.World\compression.h" #include "PS3\PS3Extras\ShutdownManager.h" +#include "BossMobGuiInfo.h" #include "TexturePackRepository.h" #include "TexturePack.h" +#include "TextureAtlas.h" bool GameRenderer::anaglyph3d = false; int GameRenderer::anaglyphPass = 0; @@ -64,6 +67,9 @@ vector GameRenderer::m_deleteStackSparseDataStorage; #endif CRITICAL_SECTION GameRenderer::m_csDeleteStack; +ResourceLocation GameRenderer::RAIN_LOCATION = ResourceLocation(TN_ENVIRONMENT_RAIN); +ResourceLocation GameRenderer::SNOW_LOCATION = ResourceLocation(TN_ENVIRONMENT_SNOW); + GameRenderer::GameRenderer(Minecraft *mc) { // 4J - added this block of initialisers @@ -77,9 +83,9 @@ GameRenderer::GameRenderer(Minecraft *mc) thirdTilt = 0; thirdTiltO = 0; - accumulatedSmoothXO = 0; + accumulatedSmoothXO = 0; accumulatedSmoothYO = 0; - tickSmoothXO = 0; + tickSmoothXO = 0; tickSmoothYO = 0; lastTickA = 0; @@ -120,6 +126,8 @@ GameRenderer::GameRenderer(Minecraft *mc) blg = 0.0f; blgt = 0.0f; + darkenWorldAmount = 0.0f; + darkenWorldAmountO = 0.0f; m_fov=70.0f; @@ -188,92 +196,20 @@ void GameRenderer::tick(bool first) // 4J - add bFirst fovOffsetO = fovOffset; cameraRollO = cameraRoll; - if (ClientConstants::DEADMAU5_CAMERA_CHEATS) + if (mc->options->smoothCamera) { - if (mc->screen == NULL) - { - float distanceDelta = 0; - float rotationDelta = 0; - float tiltDelta = 0; - float rollDelta = 0; - - if (Keyboard::isKeyDown(Keyboard::KEY_U)) - { - distanceDelta -= .3f * mc->options->cameraSpeed; - } - else if (Keyboard::isKeyDown(Keyboard::KEY_O)) - { - distanceDelta += .3f * mc->options->cameraSpeed; - } - if (Keyboard::isKeyDown(Keyboard::KEY_J)) - { - rotationDelta += 8.0f * mc->options->cameraSpeed; - } - else if (Keyboard::isKeyDown(Keyboard::KEY_L)) - { - rotationDelta -= 8.0f * mc->options->cameraSpeed; - } - if (Keyboard::isKeyDown(Keyboard::KEY_I)) - { - tiltDelta += 6.0f * mc->options->cameraSpeed; - } - else if (Keyboard::isKeyDown(Keyboard::KEY_K)) - { - tiltDelta -= 6.0f * mc->options->cameraSpeed; - } - if (Keyboard::isKeyDown(Keyboard::KEY_Y) && Keyboard::isKeyDown(Keyboard::KEY_H)) - { - fovOffset = 0; - } - else if (Keyboard::isKeyDown(Keyboard::KEY_Y)) - { - fovOffset -= 3.0f; - } - else if (Keyboard::isKeyDown(Keyboard::KEY_H)) - { - fovOffset += 3.0f; - } - if (Keyboard::isKeyDown(Keyboard::KEY_N) && Keyboard::isKeyDown(Keyboard::KEY_M)) - { - cameraRoll = 0; - } - else if (Keyboard::isKeyDown(Keyboard::KEY_N)) - { - rollDelta -= 8.0f * mc->options->cameraSpeed; - } - else if (Keyboard::isKeyDown(Keyboard::KEY_M)) - { - rollDelta += 8.0f * mc->options->cameraSpeed; - } + // update player view in tick() instead of render() to maintain + // camera movement regardless of FPS + float ss = mc->options->sensitivity * 0.6f + 0.2f; + float sens = (ss * ss * ss) * 8; + tickSmoothXO = smoothTurnX.getNewDeltaValue(accumulatedSmoothXO, 0.05f * sens); + tickSmoothYO = smoothTurnY.getNewDeltaValue(accumulatedSmoothYO, 0.05f * sens); + lastTickA = 0; - if (mc->options->smoothCamera) - { - distanceDelta = smoothDistance.getNewDeltaValue(distanceDelta, .5f * mc->options->sensitivity); - rotationDelta = smoothRotation.getNewDeltaValue(rotationDelta, .5f * mc->options->sensitivity); - tiltDelta = smoothTilt.getNewDeltaValue(tiltDelta, .5f * mc->options->sensitivity); - rollDelta = smoothRoll.getNewDeltaValue(rollDelta, .5f * mc->options->sensitivity); - } - thirdDistance += distanceDelta; - thirdRotation += rotationDelta; - thirdTilt += tiltDelta; - cameraRoll += rollDelta; - } + accumulatedSmoothXO = 0; + accumulatedSmoothYO = 0; } - if (mc->options->smoothCamera) - { - // update player view in tick() instead of render() to maintain -// camera movement regardless of FPS - float ss = mc->options->sensitivity * 0.6f + 0.2f; - float sens = (ss * ss * ss) * 8; - tickSmoothXO = smoothTurnX.getNewDeltaValue(accumulatedSmoothXO, 0.05f * sens); - tickSmoothYO = smoothTurnY.getNewDeltaValue(accumulatedSmoothYO, 0.05f * sens); - lastTickA = 0; - - accumulatedSmoothXO = 0; - accumulatedSmoothYO = 0; - } - if (mc->cameraTargetPlayer == NULL) { mc->cameraTargetPlayer = dynamic_pointer_cast(mc->player); @@ -290,6 +226,21 @@ void GameRenderer::tick(bool first) // 4J - add bFirst tickRain(); PIXEndNamedEvent(); + darkenWorldAmountO = darkenWorldAmount; + if (BossMobGuiInfo::darkenWorld) + { + darkenWorldAmount += 1.0f / ((float) SharedConstants::TICKS_PER_SECOND * 1); + if (darkenWorldAmount > 1) + { + darkenWorldAmount = 1; + } + BossMobGuiInfo::darkenWorld = false; + } + else if (darkenWorldAmount > 0) + { + darkenWorldAmount -= 1.0f / ((float) SharedConstants::TICKS_PER_SECOND * 4); + } + if( mc->player != mc->localplayers[ProfileManager.GetPrimaryPad()] ) return; // 4J added for split screen - only do rest of processing for once per frame _tick++; @@ -300,6 +251,8 @@ void GameRenderer::pick(float a) if (mc->cameraTargetPlayer == NULL) return; if (mc->level == NULL) return; + mc->crosshairPickMob = nullptr; + double range = mc->gameMode->getPickRange(); delete mc->hitResult; MemSect(31); @@ -348,18 +301,18 @@ void GameRenderer::pick(float a) dist = mc->hitResult->pos->distanceTo(from); } - Vec3 *b = mc->cameraTargetPlayer->getViewVector(a); - Vec3 *to = from->add(b->x * range, b->y * range, b->z * range); - hovered = nullptr; - float overlap = 1; - vector > *objects = mc->level->getEntities(mc->cameraTargetPlayer, mc->cameraTargetPlayer->bb->expand(b->x * (range), b->y * (range), b->z * (range))->grow(overlap, overlap, overlap)); - double nearest = dist; + Vec3 *b = mc->cameraTargetPlayer->getViewVector(a); + Vec3 *to = from->add(b->x * range, b->y * range, b->z * range); + hovered = nullptr; + float overlap = 1; + vector > *objects = mc->level->getEntities(mc->cameraTargetPlayer, mc->cameraTargetPlayer->bb->expand(b->x * (range), b->y * (range), b->z * (range))->grow(overlap, overlap, overlap)); + double nearest = dist; AUTO_VAR(itEnd, objects->end()); for (AUTO_VAR(it, objects->begin()); it != itEnd; it++) { - shared_ptr e = *it; //objects->at(i); - if (!e->isPickable()) continue; + shared_ptr e = *it; //objects->at(i); + if (!e->isPickable()) continue; float rr = e->getPickRadius(); AABB *bb = e->bb->grow(rr, rr, rr); @@ -375,7 +328,14 @@ void GameRenderer::pick(float a) else if (p != NULL) { double dd = from->distanceTo(p->pos); - if (dd < nearest || nearest == 0) + if (e == mc->cameraTargetPlayer->riding != NULL) + { + if (nearest == 0) + { + hovered = e; + } + } + else { hovered = e; nearest = dd; @@ -391,6 +351,10 @@ void GameRenderer::pick(float a) if( mc->hitResult != NULL ) delete mc->hitResult; mc->hitResult = new HitResult(hovered); + if (hovered->instanceof(eTYPE_LIVINGENTITY)) + { + mc->crosshairPickMob = dynamic_pointer_cast(hovered); + } } } } @@ -410,10 +374,13 @@ void GameRenderer::tickFov() shared_ptrplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); int playerIdx = player ? player->GetXboxPad() : 0; - tFov[playerIdx] = player->getFieldOfViewModifier(); + tFov[playerIdx] = player->getFieldOfViewModifier(); + + oFov[playerIdx] = fov[playerIdx]; + fov[playerIdx] += (tFov[playerIdx] - fov[playerIdx]) * 0.5f; - oFov[playerIdx] = fov[playerIdx]; - fov[playerIdx] += (tFov[playerIdx] - fov[playerIdx]) * 0.5f; + if (fov[playerIdx] > 1.5f) fov[playerIdx] = 1.5f; + if (fov[playerIdx] < 0.1f) fov[playerIdx] = 0.1f; } float GameRenderer::getFov(float a, bool applyEffects) @@ -423,11 +390,11 @@ float GameRenderer::getFov(float a, bool applyEffects) shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); int playerIdx = player ? player->GetXboxPad() : 0; float fov = m_fov;//70; - if (applyEffects) + if (applyEffects) { - fov += mc->options->fov * 40; - fov *= this->oFov[playerIdx] + (this->fov[playerIdx] - this->oFov[playerIdx]) * a; - } + fov += mc->options->fov * 40; + fov *= oFov[playerIdx] + (this->fov[playerIdx] - oFov[playerIdx]) * a; + } if (player->getHealth() <= 0) { float duration = player->deathTime + a; @@ -435,8 +402,8 @@ float GameRenderer::getFov(float a, bool applyEffects) fov /= ((1 - 500 / (duration + 500)) * 2.0f + 1); } - int t = Camera::getBlockAt(mc->level, player, a); - if (t != 0 && Tile::tiles[t]->material == Material::water) fov = fov * 60 / 70; + int t = Camera::getBlockAt(mc->level, player, a); + if (t != 0 && Tile::tiles[t]->material == Material::water) fov = fov * 60 / 70; return fov + fovOffsetO + (fovOffset - fovOffsetO) * a; @@ -444,7 +411,7 @@ float GameRenderer::getFov(float a, bool applyEffects) void GameRenderer::bobHurt(float a) { - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; float hurt = player->hurtTime - a; @@ -470,12 +437,9 @@ void GameRenderer::bobHurt(float a) void GameRenderer::bobView(float a) { + if (!mc->cameraTargetPlayer->instanceof(eTYPE_LIVINGENTITY)) return; + shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); - if(player==NULL) - { - return; - } - //shared_ptr player = dynamic_pointer_cast(mc->cameraTargetPlayer); float wda = player->walkDist - player->walkDistO; float b = -(player->walkDist + wda * a); @@ -489,7 +453,7 @@ void GameRenderer::bobView(float a) void GameRenderer::moveCameraToPlayer(float a) { - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); float heightOffset = player->heightOffset - 1.62f; @@ -537,15 +501,17 @@ void GameRenderer::moveCameraToPlayer(float a) else { // 4J - corrected bug where this used to just take player->xRot & yRot directly and so wasn't taking into account interpolation, allowing camera to go through walls - float yRot = player->yRotO + (player->yRot - player->yRotO) * a; - float xRot = player->xRotO + (player->xRot - player->xRotO) * a; + float playerYRot = player->yRotO + (player->yRot - player->yRotO) * a; + float playerXRot = player->xRotO + (player->xRot - player->xRotO) * a; + float yRot = playerYRot; + float xRot = playerXRot; // Thirdperson view values are now 0 for disabled, 1 for original mode, 2 for reversed. if( localplayer->ThirdPersonView() == 2 ) { - // Reverse y rotation - note that this is only used in doing collision to calculate our view + // Reverse x rotation - note that this is only used in doing collision to calculate our view // distance, the actual rotation itself is just below this else {} block - yRot += 180.0f; + xRot += 180.0f; } double xd = -Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI) * cameraDist; @@ -572,13 +538,16 @@ void GameRenderer::moveCameraToPlayer(float a) } } - // 4J - removed extra rotations here that aren't needed because our xRot/yRot don't ever - // deviate from the player's view direction -// glRotatef(player->xRot - xRot, 1, 0, 0); -// glRotatef(player->yRot - yRot, 0, 1, 0); + if ( localplayer->ThirdPersonView() == 2) + { + glRotatef(180, 0, 1, 0); + } + + glRotatef(playerXRot - xRot, 1, 0, 0); + glRotatef(playerYRot - yRot, 0, 1, 0); glTranslatef(0, 0, (float) -cameraDist); -// glRotatef(yRot - player->yRot, 0, 1, 0); -// glRotatef(xRot - player->xRot, 1, 0, 0); + glRotatef(yRot - playerYRot, 0, 1, 0); + glRotatef(xRot - playerXRot, 1, 0, 0); } } else @@ -589,15 +558,7 @@ void GameRenderer::moveCameraToPlayer(float a) if (!mc->options->fixedCamera) { glRotatef(player->xRotO + (player->xRot - player->xRotO) * a, 1, 0, 0); - if( localplayer->ThirdPersonView() == 2 ) - { - // Third person view is now 0 for disabled, 1 for original, 2 for flipped - glRotatef(player->yRotO + (player->yRot - player->yRotO) * a, 0, 1, 0); - } - else - { - glRotatef(player->yRotO + (player->yRot - player->yRotO) * a + 180, 0, 1, 0); - } + glRotatef(player->yRotO + (player->yRot - player->yRotO) * a + 180, 0, 1, 0); } glTranslatef(0, heightOffset, 0); @@ -613,9 +574,9 @@ void GameRenderer::moveCameraToPlayer(float a) void GameRenderer::zoomRegion(double zoom, double xa, double ya) { - this->zoom = zoom; - this->zoom_x = xa; - this->zoom_y = ya; + zoom = zoom; + zoom_x = xa; + zoom_y = ya; } void GameRenderer::unZoomRegion() @@ -665,11 +626,11 @@ void GameRenderer::setupCamera(float a, int eye) } gluPerspective(fov, aspect, 0.05f, renderDistance * 2); - if (mc->gameMode->isCutScene()) + if (mc->gameMode->isCutScene()) { - float s = 1 / 1.5f; - glScalef(1, s, 1); - } + float s = 1 / 1.5f; + glScalef(1, s, 1); + } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -679,7 +640,7 @@ void GameRenderer::setupCamera(float a, int eye) // 4J-PB - this is a per-player option //if (mc->options->bobView) bobView(a); - + bool bNoLegAnim =(mc->player->getAnimOverrideBitmask()&(1<player->getAnimOverrideBitmask()&(1<player->oPortalTime + (mc->player->portalTime - mc->player->oPortalTime) * a; if (pt > 0) { - int multiplier = 20; - if (mc->player->hasEffect(MobEffect::confusion)) + int multiplier = 20; + if (mc->player->hasEffect(MobEffect::confusion)) { - multiplier = 7; - } + multiplier = 7; + } float skew = 5 / (pt * pt + 5) - pt * 0.04f; skew *= skew; @@ -704,58 +665,59 @@ void GameRenderer::setupCamera(float a, int eye) moveCameraToPlayer(a); - if (cameraFlip > 0) + if (cameraFlip > 0) { - int i = cameraFlip - 1; - if (i == 1) glRotatef(90, 0, 1, 0); - if (i == 2) glRotatef(180, 0, 1, 0); - if (i == 3) glRotatef(-90, 0, 1, 0); - if (i == 4) glRotatef(90, 1, 0, 0); - if (i == 5) glRotatef(-90, 1, 0, 0); - } + int i = cameraFlip - 1; + if (i == 1) glRotatef(90, 0, 1, 0); + if (i == 2) glRotatef(180, 0, 1, 0); + if (i == 3) glRotatef(-90, 0, 1, 0); + if (i == 4) glRotatef(90, 1, 0, 0); + if (i == 5) glRotatef(-90, 1, 0, 0); + } } void GameRenderer::renderItemInHand(float a, int eye) { if (cameraFlip > 0) return; - shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + // 4J-JEV: I'm fairly confident this method would crash if the cameratarget isnt a local player anyway, but oh well. + shared_ptr localplayer = mc->cameraTargetPlayer->instanceof(eTYPE_LOCALPLAYER) ? dynamic_pointer_cast(mc->cameraTargetPlayer) : nullptr; + + bool renderHand = true; // 4J-PB - to turn off the hand for screenshots, but not when the item held is a map if ( localplayer!=NULL) { shared_ptr item = localplayer->inventory->getSelected(); - if(!(item && item->getItem()->id==Item::map_Id) && app.GetGameSettings(localplayer->GetXboxPad(),eGameSetting_DisplayHand)==0 ) return; + if(!(item && item->getItem()->id==Item::map_Id) && app.GetGameSettings(localplayer->GetXboxPad(),eGameSetting_DisplayHand)==0 ) renderHand = false; } glMatrixMode(GL_PROJECTION); glLoadIdentity(); - - float stereoScale = 0.07f; - if (mc->options->anaglyph3d) glTranslatef(-(eye * 2 - 1) * stereoScale, 0, 0); + float stereoScale = 0.07f; + if (mc->options->anaglyph3d) glTranslatef(-(eye * 2 - 1) * stereoScale, 0, 0); // 4J - have split out fov & aspect calculation so we can take into account viewports float fov, aspect; getFovAndAspect(fov, aspect, a, false); - if (zoom != 1) + if (zoom != 1) { - glTranslatef((float) zoom_x, (float) -zoom_y, 0); - glScaled(zoom, zoom, 1); - } - gluPerspective(fov, aspect, 0.05f, renderDistance * 2); + glTranslatef((float) zoom_x, (float) -zoom_y, 0); + glScaled(zoom, zoom, 1); + } + gluPerspective(fov, aspect, 0.05f, renderDistance * 2); - if (mc->gameMode->isCutScene()) + if (mc->gameMode->isCutScene()) { - float s = 1 / 1.5f; - glScalef(1, s, 1); - } - - glMatrixMode(GL_MODELVIEW); + float s = 1 / 1.5f; + glScalef(1, s, 1); + } + glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); + glLoadIdentity(); if (mc->options->anaglyph3d) glTranslatef((eye * 2 - 1) * 0.10f, 0, 0); glPushMatrix(); @@ -766,20 +728,25 @@ void GameRenderer::renderItemInHand(float a, int eye) bool bNoLegAnim =(localplayer->getAnimOverrideBitmask()&( (1<GetXboxPad(),eGameSetting_ViewBob) && !localplayer->abilities.flying && !bNoLegAnim) bobView(a); - // 4J-PB - changing this to be per player - //if (!mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) - if (!localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) + // 4J: Skip hand rendering if render hand is off + if (renderHand) { - if (!mc->options->hideGui && !mc->gameMode->isCutScene()) + // 4J-PB - changing this to be per player + //if (!mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) + if (!localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) { - turnOnLightLayer(a); - PIXBeginNamedEvent(0,"Item in hand render"); - itemInHandRenderer->render(a); - PIXEndNamedEvent(); - turnOffLightLayer(a); + if (!mc->options->hideGui && !mc->gameMode->isCutScene()) + { + turnOnLightLayer(a); + PIXBeginNamedEvent(0,"Item in hand render"); + itemInHandRenderer->render(a); + PIXEndNamedEvent(); + turnOffLightLayer(a); + } } } glPopMatrix(); + // 4J-PB - changing this to be per player //if (!mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) if (!localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) @@ -787,6 +754,7 @@ void GameRenderer::renderItemInHand(float a, int eye) itemInHandRenderer->renderScreenEffect(a); bobHurt(a); } + // 4J-PB - changing this to be per player //if (mc->options->bobView) bobView(a); if(app.GetGameSettings(localplayer->GetXboxPad(),eGameSetting_ViewBob) && !localplayer->abilities.flying && !bNoLegAnim) bobView(a); @@ -796,14 +764,14 @@ void GameRenderer::renderItemInHand(float a, int eye) void GameRenderer::turnOffLightLayer(double alpha) { // 4J - TODO #if 0 - if (SharedConstants::TEXTURE_LIGHTING) - { - glClientActiveTexture(GL_TEXTURE1); - glActiveTexture(GL_TEXTURE1); - glDisable(GL_TEXTURE_2D); - glClientActiveTexture(GL_TEXTURE0); - glActiveTexture(GL_TEXTURE0); - } + if (SharedConstants::TEXTURE_LIGHTING) + { + glClientActiveTexture(GL_TEXTURE1); + glActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + glClientActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0); + } #endif RenderManager.TextureBindVertex(-1); } @@ -812,49 +780,49 @@ void GameRenderer::turnOffLightLayer(double alpha) void GameRenderer::turnOnLightLayer(double alpha) { // 4J - TODO #if 0 - if (SharedConstants::TEXTURE_LIGHTING) - { - glClientActiveTexture(GL_TEXTURE1); - glActiveTexture(GL_TEXTURE1); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); -// float s = 1 / 16f / 15.0f*16/14.0f; - float s = 1 / 16.0f / 15.0f * 15 / 16; - glScalef(s, s, s); - glTranslatef(8f, 8f, 8f); - glMatrixMode(GL_MODELVIEW); - - mc->textures->bind(lightTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - glColor4f(1, 1, 1, 1); - glEnable(GL_TEXTURE_2D); - glClientActiveTexture(GL_TEXTURE0); - glActiveTexture(GL_TEXTURE0); - } + if (SharedConstants::TEXTURE_LIGHTING) + { + glClientActiveTexture(GL_TEXTURE1); + glActiveTexture(GL_TEXTURE1); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + // float s = 1 / 16f / 15.0f*16/14.0f; + float s = 1 / 16.0f / 15.0f * 15 / 16; + glScalef(s, s, s); + glTranslatef(8f, 8f, 8f); + glMatrixMode(GL_MODELVIEW); + + mc->textures->bind(lightTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glColor4f(1, 1, 1, 1); + glEnable(GL_TEXTURE_2D); + glClientActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0); + } #endif RenderManager.TextureBindVertex(getLightTexture(mc->player->GetXboxPad(), mc->level)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); } // 4J - change brought forward from 1.8.2 void GameRenderer::tickLightTexture() { - blrt += (float)((Math::random() - Math::random()) * Math::random() * Math::random()); - blgt += (float)((Math::random() - Math::random()) * Math::random() * Math::random()); - blrt *= 0.9; - blgt *= 0.9; - blr += (blrt - blr) * 1; - blg += (blgt - blg) * 1; - _updateLightTexture = true; + blrt += (float)((Math::random() - Math::random()) * Math::random() * Math::random()); + blgt += (float)((Math::random() - Math::random()) * Math::random() * Math::random()); + blrt *= 0.9; + blgt *= 0.9; + blr += (blrt - blr) * 1; + blg += (blgt - blg) * 1; + _updateLightTexture = true; } void GameRenderer::updateLightTexture(float a) @@ -868,7 +836,7 @@ void GameRenderer::updateLightTexture(float a) if (player == NULL) continue; Level *level = player->level; // 4J - was mc->level when it was just to update the one light texture - + float skyDarken1 = level->getSkyDarken((float) 1); for (int i = 0; i < 256; i++) { @@ -876,7 +844,7 @@ void GameRenderer::updateLightTexture(float a) float sky = level->dimension->brightnessRamp[i / 16] * darken; float block = level->dimension->brightnessRamp[i % 16] * (blr * 0.1f + 1.5f); - if (level->lightningBoltTime > 0) + if (level->skyFlashTime > 0) { sky = level->dimension->brightnessRamp[i / 16]; } @@ -897,6 +865,14 @@ void GameRenderer::updateLightTexture(float a) _g = _g * 0.96f + 0.03f; _b = _b * 0.96f + 0.03f; + if (darkenWorldAmount > 0) + { + float amount = darkenWorldAmountO + (darkenWorldAmount - darkenWorldAmountO) * a; + _r = _r * (1.0f - amount) + (_r * .7f) * amount; + _g = _g * (1.0f - amount) + (_g * .6f) * amount; + _b = _b * (1.0f - amount) + (_b * .6f) * amount; + } + if (level->dimension->id == 1) { _r = (0.22f + rb * 0.75f); @@ -923,11 +899,12 @@ void GameRenderer::updateLightTexture(float a) } } - float brightness = 0.0f; // 4J - TODO - was mc->options->gamma; if (_r > 1) _r = 1; if (_g > 1) _g = 1; if (_b > 1) _b = 1; + float brightness = 0.0f; // 4J - TODO - was mc->options->gamma; + float ir = 1 - _r; float ig = 1 - _g; float ib = 1 - _b; @@ -938,12 +915,10 @@ void GameRenderer::updateLightTexture(float a) _g = _g * (1 - brightness) + ig * brightness; _b = _b * (1 - brightness) + ib * brightness; - _r = _r * 0.96f + 0.03f; _g = _g * 0.96f + 0.03f; _b = _b * 0.96f + 0.03f; - if (_r > 1) _r = 1; if (_g > 1) _g = 1; if (_b > 1) _b = 1; @@ -951,21 +926,24 @@ void GameRenderer::updateLightTexture(float a) if (_g < 0) _g = 0; if (_b < 0) _b = 0; - int a = 255; + int alpha = 255; int r = (int) (_r * 255); int g = (int) (_g * 255); int b = (int) (_b * 255); #if ( defined _DURANGO || defined _WIN64 || __PSVITA__ ) - lightPixels[j][i] = a << 24 | b << 16 | g << 8 | r; + lightPixels[j][i] = alpha << 24 | b << 16 | g << 8 | r; #elif ( defined _XBOX || defined __ORBIS__ ) - lightPixels[j][i] = a << 24 | r << 16 | g << 8 | b; + lightPixels[j][i] = alpha << 24 | r << 16 | g << 8 | b; #else - lightPixels[j][i] = r << 24 | g << 16 | b << 8 | a; + lightPixels[j][i] = r << 24 | g << 16 | b << 8 | alpha; #endif } mc->textures->replaceTextureDirect( lightPixels[j], 16, 16, getLightTexture(j,level) ); + // lightTexture->upload(); // 4J: not relevant + + //_updateLightTexture = false; } } @@ -1009,7 +987,7 @@ void GameRenderer::render(float a, bool bFirst) } #if 0 // 4J - TODO - if (mc->mouseGrabbed) { + if (mc->mouseGrabbed && focused) { mc->mouseHandler.poll(); float ss = mc->options->sensitivity * 0.6f + 0.2f; @@ -1020,21 +998,6 @@ void GameRenderer::render(float a, bool bFirst) int yAxis = 1; if (mc->options->invertYMouse) yAxis = -1; - if (Minecraft.DEADMAU5_CAMERA_CHEATS) { - if (!mc->options->fixedCamera) { - if (Keyboard.isKeyDown(Keyboard.KEY_J)) { - xo = -12f * mc->options->sensitivity; - } else if (Keyboard.isKeyDown(Keyboard.KEY_L)) { - xo = 12f * mc->options->sensitivity; - } - if (Keyboard.isKeyDown(Keyboard.KEY_I)) { - yo = 12f * mc->options->sensitivity; - } else if (Keyboard.isKeyDown(Keyboard.KEY_K)) { - yo = -12f * mc->options->sensitivity; - } - } - } - if (mc->options->smoothCamera) { xo = smoothTurnX.getNewDeltaValue(xo, .05f * sens); @@ -1164,7 +1127,7 @@ int GameRenderer::runUpdate(LPVOID lpParam) m_updateEvents->Set(eUpdateCanRun); -// PIXBeginNamedEvent(0,"Updating dirty chunks %d",(count++)&7); + // PIXBeginNamedEvent(0,"Updating dirty chunks %d",(count++)&7); // Update chunks atomically until there aren't any very near ones left - they will be deferred for rendering // until the call to CBuffDeferredModeEnd if we have anything near to render here @@ -1179,8 +1142,8 @@ int GameRenderer::runUpdate(LPVOID lpParam) count++; } while ( shouldContinue && count < MAX_DEFERRED_UPDATES ); -// while( minecraft->levelRenderer->updateDirtyChunks() ) -// ; + // while( minecraft->levelRenderer->updateDirtyChunks() ) + // ; RenderManager.CBuffDeferredModeEnd(); // If any renderable tile entities were flagged in this last block of chunk(s) that were udpated, then change their @@ -1210,8 +1173,8 @@ int GameRenderer::runUpdate(LPVOID lpParam) } m_deleteStackSparseDataStorage.clear(); LeaveCriticalSection(&m_csDeleteStack); - -// PIXEndNamedEvent(); + + // PIXEndNamedEvent(); AABB::resetPool(); Vec3::resetPool(); @@ -1226,9 +1189,9 @@ int GameRenderer::runUpdate(LPVOID lpParam) void GameRenderer::EnableUpdateThread() { -// #ifdef __PS3__ // MGH - disable the update on PS3 for now -// return; -// #endif + // #ifdef __PS3__ // MGH - disable the update on PS3 for now + // return; + // #endif #ifdef MULTITHREAD_ENABLE if( updateRunning) return; app.DebugPrintf("------------------EnableUpdateThread--------------------\n"); @@ -1240,9 +1203,9 @@ void GameRenderer::EnableUpdateThread() void GameRenderer::DisableUpdateThread() { -// #ifdef __PS3__ // MGH - disable the update on PS3 for now -// return; -// #endif + // #ifdef __PS3__ // MGH - disable the update on PS3 for now + // return; + // #endif #ifdef MULTITHREAD_ENABLE if( !updateRunning) return; app.DebugPrintf("------------------DisableUpdateThread--------------------\n"); @@ -1254,7 +1217,7 @@ void GameRenderer::DisableUpdateThread() void GameRenderer::renderLevel(float a, __int64 until) { -// if (updateLightTexture) updateLightTexture(); // 4J - TODO - Java 1.0.1 has this line enabled, should check why - don't want to put it in now in case it breaks split-screen + // if (updateLightTexture) updateLightTexture(); // 4J - TODO - Java 1.0.1 has this line enabled, should check why - don't want to put it in now in case it breaks split-screen glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); @@ -1263,13 +1226,13 @@ void GameRenderer::renderLevel(float a, __int64 until) // going to do for the primary player, and the other players can just view whatever they have loaded in - we're sharing render data between players. bool updateChunks = ( mc->player == mc->localplayers[ProfileManager.GetPrimaryPad()] ); -// if (mc->cameraTargetPlayer == NULL) // 4J - removed condition as we want to update this is mc->player changes for different local players + // if (mc->cameraTargetPlayer == NULL) // 4J - removed condition as we want to update this is mc->player changes for different local players { mc->cameraTargetPlayer = mc->player; } pick(a); - shared_ptr cameraEntity = mc->cameraTargetPlayer; + shared_ptr cameraEntity = mc->cameraTargetPlayer; LevelRenderer *levelRenderer = mc->levelRenderer; ParticleEngine *particleEngine = mc->particleEngine; double xOff = cameraEntity->xOld + (cameraEntity->x - cameraEntity->xOld) * a; @@ -1311,7 +1274,7 @@ void GameRenderer::renderLevel(float a, __int64 until) PIXBeginNamedEvent(0,"Culling"); MemSect(31); -// Culler *frustum = new FrustumCuller(); + // Culler *frustum = new FrustumCuller(); FrustumCuller frustObj; Culler *frustum = &frustObj; MemSect(0); @@ -1342,14 +1305,22 @@ void GameRenderer::renderLevel(float a, __int64 until) PIXEndNamedEvent(); } #endif + + + if (cameraEntity->y < Level::genDepth) + { + prepareAndRenderClouds(levelRenderer, a); + } + Frustum::getFrustum(); // 4J added - re-calculate frustum as rendering the clouds does a scale & recalculates one that isn't any good for the rest of the level rendering + setupFog(0, a); glEnable(GL_FOG); MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + mc->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); // 4J was L"/terrain.png" MemSect(0); Lighting::turnOff(); PIXBeginNamedEvent(0,"Level render"); - levelRenderer->render(cameraEntity, 0, a, updateChunks); + levelRenderer->render(cameraEntity, 0, a, updateChunks); PIXEndNamedEvent(); GL11::glShadeModel(GL11::GL_FLAT); @@ -1376,33 +1347,31 @@ void GameRenderer::renderLevel(float a, __int64 until) PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Particle render"); turnOnLightLayer(a); // 4J - brought forward from 1.8.2 - particleEngine->renderLit(cameraEntity, a); + particleEngine->renderLit(cameraEntity, a, ParticleEngine::OPAQUE_LIST); Lighting::turnOff(); setupFog(0, a); - particleEngine->render(cameraEntity, a); + particleEngine->render(cameraEntity, a, ParticleEngine::OPAQUE_LIST); PIXEndNamedEvent(); turnOffLightLayer(a); // 4J - brought forward from 1.8.2 - shared_ptr player = dynamic_pointer_cast(cameraEntity); - if (mc->hitResult != NULL && cameraEntity->isUnderLiquid(Material::water) && player!=NULL) //&& !mc->options.hideGui) + if ( (mc->hitResult != NULL) && cameraEntity->isUnderLiquid(Material::water) && cameraEntity->instanceof(eTYPE_PLAYER) ) //&& !mc->options.hideGui) { - //shared_ptr player = dynamic_pointer_cast(cameraEntity); + shared_ptr player = dynamic_pointer_cast(cameraEntity); glDisable(GL_ALPHA_TEST); levelRenderer->renderHit(player, mc->hitResult, 0, player->inventory->getSelected(), a); - levelRenderer->renderHitOutline(player, mc->hitResult, 0, player->inventory->getSelected(), a); glEnable(GL_ALPHA_TEST); } } - glDisable(GL_BLEND); - glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glEnable(GL_CULL_FACE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(true); setupFog(0, a); glEnable(GL_BLEND); glDisable(GL_CULL_FACE); MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + mc->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); // 4J was L"/terrain.png" MemSect(0); // 4J - have changed this fancy rendering option to work with our command buffers. The original used to use frame buffer flags to disable // writing to colour when doing the z-only pass, but that value gets obliterated by our command buffers. Using alpha blend function instead @@ -1436,19 +1405,29 @@ void GameRenderer::renderLevel(float a, __int64 until) PIXEndNamedEvent(); } + // 4J - added - have split out translucent particle rendering so that it happens after the water is rendered, primarily for fireworks + PIXBeginNamedEvent(0,"Particle render (translucent)"); + Lighting::turnOn(); + turnOnLightLayer(a); // 4J - brought forward from 1.8.2 + particleEngine->renderLit(cameraEntity, a, ParticleEngine::TRANSLUCENT_LIST); + Lighting::turnOff(); + setupFog(0, a); + particleEngine->render(cameraEntity, a, ParticleEngine::TRANSLUCENT_LIST); + PIXEndNamedEvent(); + turnOffLightLayer(a); // 4J - brought forward from 1.8.2 + ////////////////////////// End of 4J added section glDepthMask(true); glEnable(GL_CULL_FACE); glDisable(GL_BLEND); - if (zoom == 1 && (dynamic_pointer_cast(cameraEntity)!=NULL)) //&& !mc->options.hideGui) + if ( (zoom == 1) && cameraEntity->instanceof(eTYPE_PLAYER) ) //&& !mc->options.hideGui) { if (mc->hitResult != NULL && !cameraEntity->isUnderLiquid(Material::water)) { shared_ptr player = dynamic_pointer_cast(cameraEntity); glDisable(GL_ALPHA_TEST); - levelRenderer->renderHit(player, mc->hitResult, 0, player->inventory->getSelected(), a); - levelRenderer->renderHitOutline(player, mc->hitResult, 0, player->inventory->getSelected(), a); + levelRenderer->renderHitOutline(player, mc->hitResult, 0, a); glEnable(GL_ALPHA_TEST); } } @@ -1465,17 +1444,9 @@ void GameRenderer::renderLevel(float a, __int64 until) levelRenderer->renderDestroyAnimation(Tesselator::getInstance(), dynamic_pointer_cast(cameraEntity), a); glDisable(GL_BLEND); - if (mc->options->isCloudsOn()) + if (cameraEntity->y >= Level::genDepth) { - glPushMatrix(); - setupFog(0, a); - glEnable(GL_FOG); - PIXBeginNamedEvent(0,"Rendering clouds"); - levelRenderer->renderClouds(a); - PIXEndNamedEvent(); - glDisable(GL_FOG); - setupFog(1, a); - glPopMatrix(); + prepareAndRenderClouds(levelRenderer, a); } // 4J - rain rendering moved here so that it renders after clouds & can blend properly onto them @@ -1502,6 +1473,22 @@ void GameRenderer::renderLevel(float a, __int64 until) glColorMask(true, true, true, false); } +void GameRenderer::prepareAndRenderClouds(LevelRenderer *levelRenderer, float a) +{ + if (mc->options->isCloudsOn()) + { + glPushMatrix(); + setupFog(0, a); + glEnable(GL_FOG); + PIXBeginNamedEvent(0,"Rendering clouds"); + levelRenderer->renderClouds(a); + PIXEndNamedEvent(); + glDisable(GL_FOG); + setupFog(1, a); + glPopMatrix(); + } +} + void GameRenderer::tickRain() { float rainLevel = mc->level->getRainLevel(1); @@ -1512,7 +1499,7 @@ void GameRenderer::tickRain() rainLevel /= ( mc->levelRenderer->activePlayers() + 1 ); random->setSeed(_tick * 312987231l); - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; Level *level = mc->level; int x0 = Mth::floor(player->x); @@ -1526,15 +1513,15 @@ void GameRenderer::tickRain() double rainPosZ = 0; int rainPosSamples = 0; - int rainCount = (int) (100 * rainLevel * rainLevel); - if (mc->options->particles == 1) + int rainCount = (int) (100 * rainLevel * rainLevel); + if (mc->options->particles == 1) { - rainCount >>= 1; - } else if (mc->options->particles == 2) + rainCount >>= 1; + } else if (mc->options->particles == 2) { - rainCount = 0; - } - for (int i = 0; i < rainCount; i++) + rainCount = 0; + } + for (int i = 0; i < rainCount; i++) { int x = x0 + random->nextInt(r) - random->nextInt(r); int z = z0 + random->nextInt(r) - random->nextInt(r); @@ -1592,27 +1579,27 @@ void GameRenderer::renderSnowAndRain(float a) // 4J - rain is relatively low poly, but high fill-rate - better to clip it RenderManager.StateSetEnableViewportClipPlanes(true); - this->turnOnLightLayer(a); + turnOnLightLayer(a); - if (rainXa == NULL) + if (rainXa == NULL) { - rainXa = new float[32 * 32]; - rainZa = new float[32 * 32]; + rainXa = new float[32 * 32]; + rainZa = new float[32 * 32]; - for (int z = 0; z < 32; z++) + for (int z = 0; z < 32; z++) { - for (int x = 0; x < 32; x++) + for (int x = 0; x < 32; x++) { - float xa = x - 16; - float za = z - 16; - float d = Mth::sqrt(xa * xa + za * za); - rainXa[z << 5 | x] = -za / d; - rainZa[z << 5 | x] = xa / d; - } - } - } + float xa = x - 16; + float za = z - 16; + float d = Mth::sqrt(xa * xa + za * za); + rainXa[z << 5 | x] = -za / d; + rainZa[z << 5 | x] = xa / d; + } + } + } - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; Level *level = mc->level; int x0 = Mth::floor(player->x); @@ -1627,7 +1614,7 @@ void GameRenderer::renderSnowAndRain(float a) glAlphaFunc(GL_GREATER, 0.01f); MemSect(31); - mc->textures->bindTexture(TN_ENVIRONMENT_SNOW); // 4J was L"/environment/snow.png" + mc->textures->bindTexture(&SNOW_LOCATION); // 4J was L"/environment/snow.png" MemSect(0); double xo = player->xOld + (player->x - player->xOld) * a; @@ -1641,35 +1628,35 @@ void GameRenderer::renderSnowAndRain(float a) // 4J - was if(mc.options.fancyGraphics) r = 10; switch( mc->levelRenderer->activePlayers() ) { - case 1: - default: - r = 9; - break; - case 2: - r = 7; - break; - case 3: - r = 5; - break; - case 4: - r = 5; - break; + case 1: + default: + r = 9; + break; + case 2: + r = 7; + break; + case 3: + r = 5; + break; + case 4: + r = 5; + break; } // 4J - some changes made here to access biome through new interface that caches results in levelchunk flags, as an optimisation - - int mode = -1; - float time = _tick + a; - glColor4f(1, 1, 1, 1); + int mode = -1; + float time = _tick + a; + + glColor4f(1, 1, 1, 1); for (int x = x0 - r; x <= x0 + r; x++) for (int z = z0 - r; z <= z0 + r; z++) { - int rainSlot = (z - z0 + 16) * 32 + (x - x0 + 16); - float xa = rainXa[rainSlot] * 0.5f; - float za = rainZa[rainSlot] * 0.5f; - + int rainSlot = (z - z0 + 16) * 32 + (x - x0 + 16); + float xa = rainXa[rainSlot] * 0.5f; + float za = rainZa[rainSlot] * 0.5f; + // 4J - changes here brought forward from 1.8.2 Biome *b = level->getBiome(x, z); if (!b->hasRain() && !b->hasSnow()) continue; @@ -1683,8 +1670,8 @@ void GameRenderer::renderSnowAndRain(float a) if (yy1 < floor) yy1 = floor; float s = 1; - int yl = floor; - if (yl < yMin) yl = yMin; + int yl = floor; + if (yl < yMin) yl = yMin; if (yy0 != yy1) { @@ -1694,13 +1681,13 @@ void GameRenderer::renderSnowAndRain(float a) float temp = b->getTemperature(); if (level->getBiomeSource()->scaleTemp(temp, floor) >= 0.15f) { - if (mode != 0) + if (mode != 0) { - if (mode >= 0) t->end(); - mode = 0; - mc->textures->bindTexture(TN_ENVIRONMENT_RAIN); - t->begin(); - } + if (mode >= 0) t->end(); + mode = 0; + mc->textures->bindTexture(&RAIN_LOCATION); + t->begin(); + } float ra = (((_tick + x * x * 3121 + x * 45238971 + z * z * 418711 + z * 13761) & 31) + a) / 32.0f * (3 + random->nextFloat()); @@ -1708,24 +1695,24 @@ void GameRenderer::renderSnowAndRain(float a) double zd = (z + 0.5f) - player->z; float dd = (float) Mth::sqrt(xd * xd + zd * zd) / r; - float br = 1; - t->offset(-xo * 1, -yo * 1, -zo * 1); + float br = 1; + t->offset(-xo * 1, -yo * 1, -zo * 1); #ifdef __PSVITA__ // AP - this will set up the 4 vertices in half the time float Alpha = ((1 - dd * dd) * 0.5f + 0.5f) * rainLevel; int tex2 = (level->getLightColor(x, yl, z, 0) * 3 + 0xf000f0) / 4; t->tileRainQuad(x - xa + 0.5, yy0, z - za + 0.5, 0 * s, yy0 * s / 4.0f + ra * s, - x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s, - x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s, - x - xa + 0.5, yy1, z - za + 0.5, 0 * s, yy1 * s / 4.0f + ra * s, - br, br, br, Alpha, br, br, br, 0, tex2); + x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s, + x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s, + x - xa + 0.5, yy1, z - za + 0.5, 0 * s, yy1 * s / 4.0f + ra * s, + br, br, br, Alpha, br, br, br, 0, tex2); #else - t->tex2(level->getLightColor(x, yl, z, 0)); - t->color(br, br, br, ((1 - dd * dd) * 0.5f + 0.5f) * rainLevel); - t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s, yy0 * s / 4.0f + ra * s); - t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s); + t->tex2(level->getLightColor(x, yl, z, 0)); + t->color(br, br, br, ((1 - dd * dd) * 0.5f + 0.5f) * rainLevel); + t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s, yy0 * s / 4.0f + ra * s); + t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s); t->color(br, br, br, 0.0f); // 4J - added to soften the top visible edge of the rain - t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s); + t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s); t->vertexUV(x - xa + 0.5, yy1, z - za + 0.5, 0 * s, yy1 * s / 4.0f + ra * s); #endif t->offset(0, 0, 0); @@ -1733,50 +1720,50 @@ void GameRenderer::renderSnowAndRain(float a) } else { - if (mode != 1) + if (mode != 1) { - if (mode >= 0) t->end(); - mode = 1; - mc->textures->bindTexture(TN_ENVIRONMENT_SNOW); - t->begin(); - } - float ra = (((_tick) & 511) + a) / 512.0f; - float uo = random->nextFloat() + time * 0.01f * (float) random->nextGaussian(); - float vo = random->nextFloat() + time * (float) random->nextGaussian() * 0.001f; - double xd = (x + 0.5f) - player->x; - double zd = (z + 0.5f) - player->z; - float dd = (float) sqrt(xd * xd + zd * zd) / r; - float br = 1; - t->offset(-xo * 1, -yo * 1, -zo * 1); + if (mode >= 0) t->end(); + mode = 1; + mc->textures->bindTexture(&SNOW_LOCATION); + t->begin(); + } + float ra = (((_tick) & 511) + a) / 512.0f; + float uo = random->nextFloat() + time * 0.01f * (float) random->nextGaussian(); + float vo = random->nextFloat() + time * (float) random->nextGaussian() * 0.001f; + double xd = (x + 0.5f) - player->x; + double zd = (z + 0.5f) - player->z; + float dd = (float) sqrt(xd * xd + zd * zd) / r; + float br = 1; + t->offset(-xo * 1, -yo * 1, -zo * 1); #ifdef __PSVITA__ // AP - this will set up the 4 vertices in half the time float Alpha = ((1 - dd * dd) * 0.3f + 0.5f) * rainLevel; int tex2 = (level->getLightColor(x, yl, z, 0) * 3 + 0xf000f0) / 4; t->tileRainQuad(x - xa + 0.5, yy0, z - za + 0.5, 0 * s + uo, yy0 * s / 4.0f + ra * s + vo, - x + xa + 0.5, yy0, z + za + 0.5, 1 * s + uo, yy0 * s / 4.0f + ra * s + vo, - x + xa + 0.5, yy1, z + za + 0.5, 1 * s + uo, yy1 * s / 4.0f + ra * s + vo, - x - xa + 0.5, yy1, z - za + 0.5, 0 * s + uo, yy1 * s / 4.0f + ra * s + vo, - br, br, br, Alpha, br, br, br, Alpha, tex2); + x + xa + 0.5, yy0, z + za + 0.5, 1 * s + uo, yy0 * s / 4.0f + ra * s + vo, + x + xa + 0.5, yy1, z + za + 0.5, 1 * s + uo, yy1 * s / 4.0f + ra * s + vo, + x - xa + 0.5, yy1, z - za + 0.5, 0 * s + uo, yy1 * s / 4.0f + ra * s + vo, + br, br, br, Alpha, br, br, br, Alpha, tex2); #else - t->tex2((level->getLightColor(x, yl, z, 0) * 3 + 0xf000f0) / 4); - t->color(br, br, br, ((1 - dd * dd) * 0.3f + 0.5f) * rainLevel); - t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s + uo, yy0 * s / 4.0f + ra * s + vo); - t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s + uo, yy0 * s / 4.0f + ra * s + vo); - t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s + uo, yy1 * s / 4.0f + ra * s + vo); - t->vertexUV(x - xa + 0.5, yy1, z - za + 0.5, 0 * s + uo, yy1 * s / 4.0f + ra * s + vo); + t->tex2((level->getLightColor(x, yl, z, 0) * 3 + 0xf000f0) / 4); + t->color(br, br, br, ((1 - dd * dd) * 0.3f + 0.5f) * rainLevel); + t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s + uo, yy0 * s / 4.0f + ra * s + vo); + t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s + uo, yy0 * s / 4.0f + ra * s + vo); + t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s + uo, yy1 * s / 4.0f + ra * s + vo); + t->vertexUV(x - xa + 0.5, yy1, z - za + 0.5, 0 * s + uo, yy1 * s / 4.0f + ra * s + vo); #endif - t->offset(0, 0, 0); - } + t->offset(0, 0, 0); + } } } - if( mode >= 0 ) t->end(); - glEnable(GL_CULL_FACE); - glDisable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.1f); - this->turnOffLightLayer(a); + if( mode >= 0 ) t->end(); + glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glAlphaFunc(GL_GREATER, 0.1f); + turnOffLightLayer(a); - RenderManager.StateSetEnableViewportClipPlanes(false); + RenderManager.StateSetEnableViewportClipPlanes(false); } // 4J - added forceScale parameter @@ -1796,7 +1783,7 @@ void GameRenderer::setupGuiScreen(int forceScale /*=-1*/) void GameRenderer::setupClearColor(float a) { Level *level = mc->level; - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; float whiteness = 1.0f / (4 - mc->options->viewDistance); whiteness = 1 - (float) pow((double)whiteness, 0.25); @@ -1811,23 +1798,23 @@ void GameRenderer::setupClearColor(float a) fg = (float) fogColor->y; fb = (float) fogColor->z; - if (mc->options->viewDistance < 2) + if (mc->options->viewDistance < 2) { Vec3 *sunAngle = Mth::sin(level->getSunAngle(a)) > 0 ? Vec3::newTemp(-1, 0, 0) : Vec3::newTemp(1, 0, 0); - float d = (float) player->getViewVector(a)->dot(sunAngle); - if (d < 0) d = 0; - if (d > 0) + float d = (float) player->getViewVector(a)->dot(sunAngle); + if (d < 0) d = 0; + if (d > 0) { - float *c = level->dimension->getSunriseColor(level->getTimeOfDay(a), a); - if (c != NULL) + float *c = level->dimension->getSunriseColor(level->getTimeOfDay(a), a); + if (c != NULL) { - d *= c[3]; - fr = fr * (1 - d) + c[0] * d; - fg = fg * (1 - d) + c[1] * d; - fb = fb * (1 - d) + c[2] * d; - } - } - } + d *= c[3]; + fr = fr * (1 - d) + c[0] * d; + fg = fg * (1 - d) + c[1] * d; + fb = fb * (1 - d) + c[2] * d; + } + } + } fr += (sr - fr) * whiteness; fg += (sg - fg) * whiteness; @@ -1861,19 +1848,19 @@ void GameRenderer::setupClearColor(float a) } else if (t != 0 && Tile::tiles[t]->material == Material::water) { - + float clearness = EnchantmentHelper::getOxygenBonus(player) * 0.2f; + unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Water_Clear_Colour ); byte redComponent = ((colour>>16)&0xFF); byte greenComponent = ((colour>>8)&0xFF); byte blueComponent = ((colour)&0xFF); - fr = (float)redComponent/256;//0.02f; - fg = (float)greenComponent/256;//0.02f; - fb = (float)blueComponent/256;//0.2f; + fr = (float)redComponent/256 + clearness;//0.02f; + fg = (float)greenComponent/256 + clearness;//0.02f; + fb = (float)blueComponent/256 + clearness;//0.2f; } else if (t != 0 && Tile::tiles[t]->material == Material::lava) { - unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Lava_Clear_Colour ); byte redComponent = ((colour>>16)&0xFF); byte greenComponent = ((colour>>8)&0xFF); @@ -1889,29 +1876,37 @@ void GameRenderer::setupClearColor(float a) fg *= brr; fb *= brr; - double yy = (player->yOld + (player->y - player->yOld) * a) * level->dimension->getClearColorScale(); // 4J - getClearColorScale brought forward from 1.2.3 + double yy = (player->yOld + (player->y - player->yOld) * a) * level->dimension->getClearColorScale(); // 4J - getClearColorScale brought forward from 1.2.3 - if (player->hasEffect(MobEffect::blindness)) + if (player->hasEffect(MobEffect::blindness)) { - int duration = player->getEffect(MobEffect::blindness)->getDuration(); - if (duration < 20) + int duration = player->getEffect(MobEffect::blindness)->getDuration(); + if (duration < 20) { - yy = yy * (1.0f - (float) duration / 20.0f); - } + yy = yy * (1.0f - (float) duration / 20.0f); + } else { - yy = 0; - } - } + yy = 0; + } + } - if (yy < 1) + if (yy < 1) { - if (yy < 0) yy = 0; - yy = yy * yy; - fr *= yy; - fg *= yy; - fb *= yy; - } + if (yy < 0) yy = 0; + yy = yy * yy; + fr *= yy; + fg *= yy; + fb *= yy; + } + + if (darkenWorldAmount > 0) + { + float amount = darkenWorldAmountO + (darkenWorldAmount - darkenWorldAmountO) * a; + fr = fr * (1.0f - amount) + (fr * .7f) * amount; + fg = fg * (1.0f - amount) + (fg * .6f) * amount; + fb = fb * (1.0f - amount) + (fb * .6f) * amount; + } if (player->hasEffect(MobEffect::nightVision)) { @@ -1953,90 +1948,70 @@ void GameRenderer::setupClearColor(float a) void GameRenderer::setupFog(int i, float alpha) { - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; // 4J - check for creative mode brought forward from 1.2.3 - bool creative = false; - if (dynamic_pointer_cast(player) ) + bool creative = false; + if ( player->instanceof(eTYPE_PLAYER) ) { - creative = (dynamic_pointer_cast(player))->abilities.instabuild; - } + creative = (dynamic_pointer_cast(player))->abilities.instabuild; + } - if (i == 999) + if (i == 999) { __debugbreak(); // 4J TODO /* - glFog(GL_FOG_COLOR, getBuffer(0, 0, 0, 1)); - glFogi(GL_FOG_MODE, GL_LINEAR); - glFogf(GL_FOG_START, 0); - glFogf(GL_FOG_END, 8); + glFog(GL_FOG_COLOR, getBuffer(0, 0, 0, 1)); + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, 0); + glFogf(GL_FOG_END, 8); - if (GLContext.getCapabilities().GL_NV_fog_distance) { - glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); - } + if (GLContext.getCapabilities().GL_NV_fog_distance) { + glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); + } - glFogf(GL_FOG_START, 0); + glFogf(GL_FOG_START, 0); */ - return; - } + return; + } glFog(GL_FOG_COLOR, getBuffer(fr, fg, fb, 1)); glNormal3f(0, -1, 0); glColor4f(1, 1, 1, 1); - int t = Camera::getBlockAt(mc->level, player, alpha); + int t = Camera::getBlockAt(mc->level, player, alpha); - if (player->hasEffect(MobEffect::blindness)) + if (player->hasEffect(MobEffect::blindness)) { - float distance = 5.0f; - int duration = player->getEffect(MobEffect::blindness)->getDuration(); - if (duration < 20) + float distance = 5.0f; + int duration = player->getEffect(MobEffect::blindness)->getDuration(); + if (duration < 20) { - distance = 5.0f + (renderDistance - 5.0f) * (1.0f - (float) duration / 20.0f); - } + distance = 5.0f + (renderDistance - 5.0f) * (1.0f - (float) duration / 20.0f); + } - glFogi(GL_FOG_MODE, GL_LINEAR); - if (i < 0) + glFogi(GL_FOG_MODE, GL_LINEAR); + if (i < 0) { - glFogf(GL_FOG_START, 0); - glFogf(GL_FOG_END, distance * 0.8f); - } + glFogf(GL_FOG_START, 0); + glFogf(GL_FOG_END, distance * 0.8f); + } else { - glFogf(GL_FOG_START, distance * 0.25f); - glFogf(GL_FOG_END, distance); - } + glFogf(GL_FOG_START, distance * 0.25f); + glFogf(GL_FOG_END, distance); + } // 4J - TODO investigate implementing this -// if (GLContext.getCapabilities().GL_NV_fog_distance) -// { -// glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); -// } - } + // if (GLContext.getCapabilities().GL_NV_fog_distance) + // { + // glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); + // } + } else if (isInClouds) { glFogi(GL_FOG_MODE, GL_EXP); glFogf(GL_FOG_DENSITY, 0.1f); // was 0.06 - - unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_In_Cloud_Fog_Colour ); - byte redComponent = ((colour>>16)&0xFF); - byte greenComponent = ((colour>>8)&0xFF); - byte blueComponent = ((colour)&0xFF); - - float rr = (float)redComponent/256;//1.0f; - float gg = (float)greenComponent/256;//1.0f; - float bb = (float)blueComponent/256;//1.0f; - - if (mc->options->anaglyph3d) - { - float rrr = (rr * 30 + gg * 59 + bb * 11) / 100; - float ggg = (rr * 30 + gg * 70) / (100); - float bbb = (rr * 30 + bb * 70) / (100); - - rr = rrr; - gg = ggg; - bb = bbb; - } } else if (t > 0 && Tile::tiles[t]->material == Material::water) { @@ -2047,57 +2022,17 @@ void GameRenderer::setupFog(int i, float alpha) } else { - glFogf(GL_FOG_DENSITY, 0.1f); // was 0.06 - } - - unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Water_Fog_Colour ); - byte redComponent = ((colour>>16)&0xFF); - byte greenComponent = ((colour>>8)&0xFF); - byte blueComponent = ((colour)&0xFF); - - float rr = (float)redComponent/256;//0.4f; - float gg = (float)greenComponent/256;//0.4f; - float bb = (float)blueComponent/256;//0.9f; - - if (mc->options->anaglyph3d) - { - float rrr = (rr * 30 + gg * 59 + bb * 11) / 100; - float ggg = (rr * 30 + gg * 70) / (100); - float bbb = (rr * 30 + bb * 70) / (100); - - rr = rrr; - gg = ggg; - bb = bbb; + glFogf(GL_FOG_DENSITY, 0.1f - (EnchantmentHelper::getOxygenBonus(player) * 0.03f)); // was 0.06 } } else if (t > 0 && Tile::tiles[t]->material == Material::lava) { glFogi(GL_FOG_MODE, GL_EXP); glFogf(GL_FOG_DENSITY, 2.0f); // was 0.06 - - unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Lava_Fog_Colour ); - byte redComponent = ((colour>>16)&0xFF); - byte greenComponent = ((colour>>8)&0xFF); - byte blueComponent = ((colour)&0xFF); - - float rr = (float)redComponent/256;//0.4f; - float gg = (float)greenComponent/256;//0.3f; - float bb = (float)blueComponent/256;//0.3f; - - if (mc->options->anaglyph3d) - { - float rrr = (rr * 30 + gg * 59 + bb * 11) / 100; - float ggg = (rr * 30 + gg * 70) / (100); - float bbb = (rr * 30 + bb * 70) / (100); - - rr = rrr; - gg = ggg; - bb = bbb; - } } else { - float distance = renderDistance; + float distance = renderDistance; if (!mc->level->dimension->hasCeiling) { // 4J - test for doing bedrockfog brought forward from 1.2.3 @@ -2122,16 +2057,16 @@ void GameRenderer::setupFog(int i, float alpha) { glFogf(GL_FOG_START, 0); glFogf(GL_FOG_END, distance * 0.8f); - } + } else { glFogf(GL_FOG_START, distance * 0.25f); glFogf(GL_FOG_END, distance); - } + } /* 4J - removed - TODO investigate if (GLContext.getCapabilities().GL_NV_fog_distance) { - glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); + glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); } */ @@ -2165,5 +2100,5 @@ int GameRenderer::getFpsCap(int option) void GameRenderer::updateAllChunks() { -// mc->levelRenderer->updateDirtyChunks(mc->cameraTargetPlayer, true); + // mc->levelRenderer->updateDirtyChunks(mc->cameraTargetPlayer, true); } diff --git a/Minecraft.Client/GameRenderer.h b/Minecraft.Client/GameRenderer.h index 3729726b..1db7713a 100644 --- a/Minecraft.Client/GameRenderer.h +++ b/Minecraft.Client/GameRenderer.h @@ -11,9 +11,14 @@ class SparseDataStorage; #include "..\Minecraft.World\SmoothFloat.h" #include "..\Minecraft.World\C4JThread.h" +#include "ResourceLocation.h" class GameRenderer { +private: + static ResourceLocation RAIN_LOCATION; + static ResourceLocation SNOW_LOCATION; + public: static bool anaglyph3d; static int anaglyphPass; @@ -64,6 +69,9 @@ private: float oFov[4]; float tFov[4]; + float darkenWorldAmount; + float darkenWorldAmountO; + bool isInClouds; float m_fov; @@ -116,6 +124,7 @@ public: private: Random *random; int rainSoundTime; + void prepareAndRenderClouds(LevelRenderer *levelRenderer, float a); void tickRain(); private: // 4J - brought forward from 1.8.2 diff --git a/Minecraft.Client/GhastModel.cpp b/Minecraft.Client/GhastModel.cpp index 460c28ff..14277c43 100644 --- a/Minecraft.Client/GhastModel.cpp +++ b/Minecraft.Client/GhastModel.cpp @@ -34,7 +34,7 @@ GhastModel::GhastModel() : Model() } } -void GhastModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void GhastModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { for (int i = 0; i < TENTACLESLENGTH; i++) // 4J - 9 was tentacles.length { @@ -44,7 +44,7 @@ void GhastModel::setupAnim(float time, float r, float bob, float yRot, float xRo void GhastModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); glPushMatrix(); glTranslatef(0, .6f, 0); diff --git a/Minecraft.Client/GhastModel.h b/Minecraft.Client/GhastModel.h index 22e9023c..25f7e116 100644 --- a/Minecraft.Client/GhastModel.h +++ b/Minecraft.Client/GhastModel.h @@ -9,6 +9,6 @@ public: ModelPart *tentacles[TENTACLESLENGTH]; GhastModel(); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/GhastRenderer.cpp b/Minecraft.Client/GhastRenderer.cpp index 1d8a2833..cecb4eaf 100644 --- a/Minecraft.Client/GhastRenderer.cpp +++ b/Minecraft.Client/GhastRenderer.cpp @@ -3,11 +3,14 @@ #include "GhastModel.h" #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +ResourceLocation GhastRenderer::GHAST_LOCATION = ResourceLocation(TN_MOB_GHAST); +ResourceLocation GhastRenderer::GHAST_SHOOTING_LOCATION = ResourceLocation(TN_MOB_GHAST_FIRE); + GhastRenderer::GhastRenderer() : MobRenderer(new GhastModel(), 0.5f) { } -void GhastRenderer::scale(shared_ptr mob, float a) +void GhastRenderer::scale(shared_ptr mob, float a) { shared_ptr ghast = dynamic_pointer_cast(mob); @@ -18,4 +21,16 @@ void GhastRenderer::scale(shared_ptr mob, float a) float hs = (8+1/ss)/2; glScalef(hs, s, hs); glColor4f(1, 1, 1, 1); +} + +ResourceLocation *GhastRenderer::getTextureLocation(shared_ptr mob) +{ + shared_ptr ghast = dynamic_pointer_cast(mob); + + if (ghast->isCharging()) + { + return &GHAST_SHOOTING_LOCATION; + } + + return &GHAST_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/GhastRenderer.h b/Minecraft.Client/GhastRenderer.h index 6778b9a5..eb4618b1 100644 --- a/Minecraft.Client/GhastRenderer.h +++ b/Minecraft.Client/GhastRenderer.h @@ -3,9 +3,14 @@ class GhastRenderer : public MobRenderer { +private: + static ResourceLocation GHAST_LOCATION; + static ResourceLocation GHAST_SHOOTING_LOCATION; + public: - GhastRenderer(); + GhastRenderer(); protected: - virtual void scale(shared_ptr mob, float a); + virtual void scale(shared_ptr mob, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/GiantMobRenderer.cpp b/Minecraft.Client/GiantMobRenderer.cpp index 6dabf7cb..6b232746 100644 --- a/Minecraft.Client/GiantMobRenderer.cpp +++ b/Minecraft.Client/GiantMobRenderer.cpp @@ -1,12 +1,19 @@ #include "stdafx.h" #include "GiantMobRenderer.h" +ResourceLocation GiantMobRenderer::ZOMBIE_LOCATION = ResourceLocation(TN_ITEM_ARROWS); + GiantMobRenderer::GiantMobRenderer(Model *model, float shadow, float _scale) : MobRenderer(model, shadow *_scale) { this->_scale = _scale; } -void GiantMobRenderer::scale(shared_ptr mob, float a) +void GiantMobRenderer::scale(shared_ptr mob, float a) { glScalef(_scale, _scale, _scale); +} + +ResourceLocation *GiantMobRenderer::getTextureLocation(shared_ptr mob) +{ + return &ZOMBIE_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/GiantMobRenderer.h b/Minecraft.Client/GiantMobRenderer.h index 5b1cce1d..420fbc49 100644 --- a/Minecraft.Client/GiantMobRenderer.h +++ b/Minecraft.Client/GiantMobRenderer.h @@ -4,11 +4,13 @@ class GiantMobRenderer : public MobRenderer { private: + static ResourceLocation ZOMBIE_LOCATION; float _scale; public: GiantMobRenderer(Model *model, float shadow, float scale); protected: - virtual void scale(shared_ptr mob, float a); + virtual void scale(shared_ptr mob, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/Gui.cpp b/Minecraft.Client/Gui.cpp index 7d76edbd..2db0c83c 100644 --- a/Minecraft.Client/Gui.cpp +++ b/Minecraft.Client/Gui.cpp @@ -5,6 +5,7 @@ #include "Options.h" #include "MultiplayerLocalPlayer.h" #include "Textures.h" +#include "TextureAtlas.h" #include "GameMode.h" #include "Lighting.h" #include "ChatScreen.h" @@ -28,6 +29,8 @@ #include "..\Minecraft.World\LevelChunk.h" #include "..\Minecraft.World\Biome.h" +ResourceLocation Gui::PUMPKIN_BLUR_LOCATION = ResourceLocation(TN__BLUR__MISC_PUMPKINBLUR); + #define RENDER_HUD 0 //#ifndef _XBOX //#undef RENDER_HUD @@ -78,7 +81,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) ScreenSizeCalculator ssc(minecraft->options, minecraft->width, minecraft->height, guiScale ); int screenWidth = ssc.getWidth(); int screenHeight = ssc.getHeight(); - int iSafezoneXHalf=0,iSafezoneYHalf=0; + int iSafezoneXHalf=0,iSafezoneYHalf=0,iSafezoneTopYHalf=0; int iTooltipsYOffset=0; int quickSelectWidth=182; int quickSelectHeight=22; @@ -106,11 +109,13 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // single player iSafezoneXHalf = screenWidth/20; // 5% iSafezoneYHalf = screenHeight/20; // 5% + iSafezoneTopYHalf = iSafezoneYHalf; iTooltipsYOffset=40+splitYOffset; break; case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: iSafezoneXHalf = screenWidth/10; // 5% (need to treat the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset; + iSafezoneTopYHalf = screenHeight/10; fScaleFactorWidth=0.5f; iWidthOffset=(int)((float)screenWidth*(1.0f - fScaleFactorWidth)); iTooltipsYOffset=44; @@ -120,6 +125,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: iSafezoneXHalf = screenWidth/10; // 5% (need to treat the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset + screenHeight/10;// 5% (need to treat the whole screen is 2x this screen) + iSafezoneTopYHalf = 0; fScaleFactorWidth=0.5f; iWidthOffset=(int)((float)screenWidth*(1.0f - fScaleFactorWidth)); iTooltipsYOffset=44; @@ -129,6 +135,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: iSafezoneXHalf = screenWidth/10; // 5% (the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset + screenHeight/10;// 5% (need to treat the whole screen is 2x this screen) + iSafezoneTopYHalf = screenHeight/10; fScaleFactorHeight=0.5f; iHeightOffset=screenHeight; iTooltipsYOffset=44; @@ -138,6 +145,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset + screenHeight/10;// 5% (need to treat the whole screen is 2x this screen) + iSafezoneTopYHalf = splitYOffset + screenHeight/10; fScaleFactorHeight=0.5f; iHeightOffset=screenHeight; iTooltipsYOffset=44; @@ -147,24 +155,28 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: iSafezoneXHalf = screenWidth/10; // 5% (the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset; + iSafezoneTopYHalf = screenHeight/10; iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset; // 5% + iSafezoneTopYHalf = screenHeight/10; iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: iSafezoneXHalf = screenWidth/10; // 5% (the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset + screenHeight/10; // 5% (the whole screen is 2x this screen) + iSafezoneTopYHalf = 0; iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset + screenHeight/10; // 5% (the whole screen is 2x this screen) + iSafezoneTopYHalf = 0; iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; @@ -421,93 +433,168 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) yLine2 = yLine1 - 10; } + double maxHealth = minecraft->localplayers[iPad]->getAttribute(SharedMonsterAttributes.MAX_HEALTH); + + double totalAbsorption = minecraft->localplayers[iPad]->getAbsorptionAmount(); + int numHealthRows = Mth.ceil((maxHealth + totalAbsorption) / 2 / (float) NUM_HEARTS_PER_ROW); + int healthRowHeight = Math.max(10 - (numHealthRows - 2), 3); + int yLine2 = yLine1 - (numHealthRows - 1) * healthRowHeight - 10; + absorption = totalAbsorption; + int armor = minecraft->player->getArmorValue(); int heartOffsetIndex = -1; if (minecraft->player->hasEffect(MobEffect::regeneration)) { - heartOffsetIndex = tickCount % 25; + heartOffsetIndex = tickCount % (int) ceil(maxHealth + 5); } // render health and armor + //minecraft.profiler.push("armor"); for (int i = 0; i < Player::MAX_HEALTH / 2; i++) { if (armor > 0) { int xo = xLeft + i * 8; - - // HEALTH - if (i * 2 + 1 < armor) blit(xo, yLine2, 16 + 2 * 9, 9 * 1, 9, 9); - if (i * 2 + 1 == armor) blit(xo, yLine2, 16 + 1 * 9, 9 * 1, 9, 9); - if (i * 2 + 1 > armor) blit(xo, yLine2, 16 + 0 * 9, 9 * 1, 9, 9); + if (i * 2 + 1 < armor) blit(xo, yLine2, 16 + 2 * 9, 9, 9, 9); + if (i * 2 + 1 == armor) blit(xo, yLine2, 16 + 1 * 9, 9, 9, 9); + if (i * 2 + 1 > armor) blit(xo, yLine2, 16 + 0 * 9, 9, 9, 9); } + } + //minecraft.profiler.popPush("health"); + for (int i = Mth.ceil((maxHealth + totalAbsorption) / 2) - 1; i >= 0; i--) + { int healthTexBaseX = 16; - if (minecraft->player->hasEffect(MobEffect::poison)) + if (minecraft.player.hasEffect(MobEffect.poison)) { healthTexBaseX += 4 * 9; } + else if (minecraft.player.hasEffect(MobEffect.wither)) + { + healthTexBaseX += 8 * 9; + } int bg = 0; if (blink) bg = 1; - int xo = xLeft + i * 8; - int yo = yLine1; - - if (iHealth <= 4) + int rowIndex = Mth.ceil((i + 1) / (float) NUM_HEARTS_PER_ROW) - 1; + int xo = xLeft + (i % NUM_HEARTS_PER_ROW) * 8; + int yo = yLine1 - rowIndex * healthRowHeight; + if (currentHealth <= 4) { - yo += random->nextInt(2); + yo += random.nextInt(2); } + if (i == heartOffsetIndex) { yo -= 2; } int y0 = 0; - // 4J-PB - no hardcore in xbox -// if (minecraft.level.getLevelData().isHardcore()) { -// y0 = 5; -// } - blit(xo, yo, 16 + bg * 9, 9 * 0, 9, 9); + + // No hardcore on console + /*if (minecraft->level.getLevelData().isHardcore()) + { + y0 = 5; + }*/ + + blit(xo, yo, 16 + bg * 9, 9 * y0, 9, 9); if (blink) { - if (i * 2 + 1 < iLastHealth) blit(xo, yo, healthTexBaseX + 6 * 9, 9 * y0, 9, 9); - if (i * 2 + 1 == iLastHealth) blit(xo, yo, healthTexBaseX + 7 * 9, 9 * y0, 9, 9); + if (i * 2 + 1 < oldHealth) blit(xo, yo, healthTexBaseX + 6 * 9, 9 * y0, 9, 9); + if (i * 2 + 1 == oldHealth) blit(xo, yo, healthTexBaseX + 7 * 9, 9 * y0, 9, 9); + } + + if (absorption > 0) + { + if (absorption == totalAbsorption && totalAbsorption % 2 == 1) + { + blit(xo, yo, healthTexBaseX + 17 * 9, 9 * y0, 9, 9); + } + else + { + blit(xo, yo, healthTexBaseX + 16 * 9, 9 * y0, 9, 9); + } + absorption -= 2; + } + else + { + if (i * 2 + 1 < currentHealth) blit(xo, yo, healthTexBaseX + 4 * 9, 9 * y0, 9, 9); + if (i * 2 + 1 == currentHealth) blit(xo, yo, healthTexBaseX + 5 * 9, 9 * y0, 9, 9); } - if (i * 2 + 1 < iHealth) blit(xo, yo, healthTexBaseX + 4 * 9, 9 * y0, 9, 9); - if (i * 2 + 1 == iHealth) blit(xo, yo, healthTexBaseX + 5 * 9, 9 * y0, 9, 9); } - // render food - for (int i = 0; i < FoodConstants::MAX_FOOD / 2; i++) + std::shared_ptr riding = minecraft->localplayers[iPad].get()->riding; + std::shared_ptr living = dynamic_pointer_cast(riding); + if (riding == NULL) { - int yo = yLine1; + // render food + for (int i = 0; i < FoodConstants::MAX_FOOD / 2; i++) + { + int yo = yLine1; - int texBaseX = 16; - int bg = 0; - if (minecraft->player->hasEffect(MobEffect::hunger)) - { - texBaseX += 4 * 9; - bg = 13; - } + int texBaseX = 16; + int bg = 0; + if (minecraft->player->hasEffect(MobEffect::hunger)) + { + texBaseX += 4 * 9; + bg = 13; + } - if (minecraft->player->getFoodData()->getSaturationLevel() <= 0) - { - if ((tickCount % (food * 3 + 1)) == 0) + if (minecraft->player->getFoodData()->getSaturationLevel() <= 0) + { + if ((tickCount % (food * 3 + 1)) == 0) + { + yo += random->nextInt(3) - 1; + } + } + + if (foodBlink) bg = 1; + int xo = xRight - i * 8 - 9; + blit(xo, yo, 16 + bg * 9, 9 * 3, 9, 9); + if (foodBlink) { - yo += random->nextInt(3) - 1; + if (i * 2 + 1 < oldFood) blit(xo, yo, texBaseX + 6 * 9, 9 * 3, 9, 9); + if (i * 2 + 1 == oldFood) blit(xo, yo, texBaseX + 7 * 9, 9 * 3, 9, 9); } + if (i * 2 + 1 < food) blit(xo, yo, texBaseX + 4 * 9, 9 * 3, 9, 9); + if (i * 2 + 1 == food) blit(xo, yo, texBaseX + 5 * 9, 9 * 3, 9, 9); + } + } + else if (living != nullptr) + { + // Render mount health + + int riderCurrentHealth = (int) ceil(living.get()->GetHealth()); + float maxRiderHealth = living->GetMaxHealth(); + int hearts = (int) (maxRiderHealth + .5f) / 2; + if (hearts > 30) + { + hearts = 30; } - if (foodBlink) bg = 1; - int xo = xRight - i * 8 - 9; - blit(xo, yo, 16 + bg * 9, 9 * 3, 9, 9); - if (foodBlink) + int yo = yLine1; + int baseHealth = 0; + + while (hearts > 0) { - if (i * 2 + 1 < oldFood) blit(xo, yo, texBaseX + 6 * 9, 9 * 3, 9, 9); - if (i * 2 + 1 == oldFood) blit(xo, yo, texBaseX + 7 * 9, 9 * 3, 9, 9); + int rowHearts = min(hearts, 10); + hearts -= rowHearts; + + for (int i = 0; i < rowHearts; i++) + { + int texBaseX = 52; + int bg = 0; + + if (foodBlink) bg = 1; + int xo = xRight - i * 8 - 9; + blit(xo, yo, texBaseX + bg * 9, 9 * 1, 9, 9); + if (i * 2 + 1 + baseHealth < riderCurrentHealth) blit(xo, yo, texBaseX + 4 * 9, 9 * 1, 9, 9); + if (i * 2 + 1 + baseHealth == riderCurrentHealth) blit(xo, yo, texBaseX + 5 * 9, 9 * 1, 9, 9); + } + yo -= 10; + baseHealth += 20; } - if (i * 2 + 1 < food) blit(xo, yo, texBaseX + 4 * 9, 9 * 3, 9, 9); - if (i * 2 + 1 == food) blit(xo, yo, texBaseX + 5 * 9, 9 * 3, 9, 9); } // render air bubbles @@ -595,46 +682,22 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) if( bDisplayGui && (displayCrouch || displaySprint || displayFlying) ) { - EntityRenderDispatcher::instance->prepare(minecraft->level, minecraft->textures, minecraft->font, minecraft->cameraTargetPlayer, minecraft->options, a); + EntityRenderDispatcher::instance->prepare(minecraft->level, minecraft->textures, minecraft->font, minecraft->cameraTargetPlayer, minecraft->crosshairPickMob, minecraft->options, a); glEnable(GL_RESCALE_NORMAL); glEnable(GL_COLOR_MATERIAL); - int xo = 0; - int yo = 0; - switch( minecraft->player->m_iScreenSection ) - { - case C4JRender::VIEWPORT_TYPE_FULLSCREEN: - default: - if(RenderManager.IsHiDef()) xo = -22; - yo = -36; - break; - case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: - xo = 0; yo = -25; - break; - case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: - xo = 0; yo = -48; - break; - case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: - xo = 0; yo = -25; - break; - case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: - xo = -43; yo = -25; - break; - case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: - xo = 0; yo = -25; - break; - case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: - xo = -43; yo = -25; - break; - case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: - xo = 0; yo = -48; - break; - case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: - xo = -43; yo = -48; - break; - } + // 4J - TomK now using safe zone values directly instead of the magic number calculation that lived here before (which only worked for medium scale, the other two were off!) + int xo = iSafezoneXHalf + 10; + int yo = iSafezoneTopYHalf + 10; + +#ifdef __PSVITA__ + // align directly with corners, there are no safe zones on vita + xo = 10; + yo = 10; +#endif + glPushMatrix(); - glTranslatef((float)xo + 51, (float)yo + 75, 50); + glTranslatef((float)xo, (float)yo, 50); float ss = 12; glScalef(-ss, ss, ss); glRotatef(180, 0, 0, 1); @@ -671,7 +734,9 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) minecraft->player->onFire = 0; minecraft->player->setSharedFlag(Entity::FLAG_ONFIRE, false); - glTranslatef(0, minecraft->player->heightOffset, 0); + // 4J - TomK don't offset the player. it's easier to align it with the safe zones that way! + //glTranslatef(0, minecraft->player->heightOffset, 0); + glTranslatef(0, 0, 0); EntityRenderDispatcher::instance->playerRotY = 180; EntityRenderDispatcher::instance->isGuiRender = true; EntityRenderDispatcher::instance->render(minecraft->player, 0, 0, 0, 0, 1); @@ -1066,7 +1131,7 @@ void Gui::renderPumpkin(int w, int h) glDisable(GL_ALPHA_TEST); MemSect(31); - minecraft->textures->bindTexture(TN__BLUR__MISC_PUMPKINBLUR);//L"%blur%/misc/pumpkinblur.png")); + minecraft->textures->bindTexture(&PUMPKIN_BLUR_LOCATION); MemSect(0); Tesselator *t = Tesselator::getInstance(); t->begin(); @@ -1124,7 +1189,7 @@ void Gui::renderTp(float br, int w, int h) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1, 1, 1, br); MemSect(31); - minecraft->textures->bindTexture(TN_TERRAIN);//L"/terrain.png")); + minecraft->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); MemSect(0); Icon *slot = Tile::portalTile->getTexture(Facing::UP); diff --git a/Minecraft.Client/Gui.h b/Minecraft.Client/Gui.h index 41762016..9352308f 100644 --- a/Minecraft.Client/Gui.h +++ b/Minecraft.Client/Gui.h @@ -1,6 +1,9 @@ #pragma once +#include "ResourceLocation.h" #include "GuiComponent.h" #include "GuiMessage.h" +#include "ResourceLocation.h" + class Random; class Minecraft; class ItemRenderer; @@ -8,21 +11,22 @@ class ItemRenderer; class Gui : public GuiComponent { private: + static ResourceLocation PUMPKIN_BLUR_LOCATION; // 4J-PB - this doesn't account for the safe zone, and the indent applied to messages //static const int MAX_MESSAGE_WIDTH = 320; static const int m_iMaxMessageWidth = 280; - static ItemRenderer *itemRenderer; - vector guiMessages[XUSER_MAX_COUNT]; - Random *random; + static ItemRenderer *itemRenderer; + vector guiMessages[XUSER_MAX_COUNT]; + Random *random; - Minecraft *minecraft; + Minecraft *minecraft; public: wstring selectedName; private: int tickCount; - wstring overlayMessageString; - int overlayMessageTime; - bool animateOverlayMessageColor; + wstring overlayMessageString; + int overlayMessageTime; + bool animateOverlayMessageColor; // 4J Added float lastTickA; @@ -33,26 +37,26 @@ public: float progress; -// private DecimalFormat df = new DecimalFormat("##.00"); + // private DecimalFormat df = new DecimalFormat("##.00"); public: Gui(Minecraft *minecraft); - void render(float a, bool mouseFree, int xMouse, int yMouse); - float tbr; + void render(float a, bool mouseFree, int xMouse, int yMouse); + float tbr; private: //void renderBossHealth(void); void renderPumpkin(int w, int h); - void renderVignette(float br, int w, int h); - void renderTp(float br, int w, int h); - void renderSlot(int slot, int x, int y, float a); + void renderVignette(float br, int w, int h); + void renderTp(float br, int w, int h); + void renderSlot(int slot, int x, int y, float a); public: void tick(); - void clearMessages(int iPad=-1); - void addMessage(const wstring& string, int iPad,bool bIsDeathMessage=false); - void setNowPlaying(const wstring& string); - void displayClientMessage(int messageId, int iPad); + void clearMessages(int iPad=-1); + void addMessage(const wstring& string, int iPad,bool bIsDeathMessage=false); + void setNowPlaying(const wstring& string); + void displayClientMessage(int messageId, int iPad); // 4J Added DWORD getMessagesCount(int iPad) { return (int)guiMessages[iPad].size(); } diff --git a/Minecraft.Client/HorseRenderer.cpp b/Minecraft.Client/HorseRenderer.cpp new file mode 100644 index 00000000..006f9e20 --- /dev/null +++ b/Minecraft.Client/HorseRenderer.cpp @@ -0,0 +1,102 @@ +#include "stdafx.h" +#include "HorseRenderer.h" +#include "MobRenderer.h" +#include "EntityRenderDispatcher.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" + +ResourceLocation HorseRenderer::HORSE_LOCATION = ResourceLocation(TN_MOB_HORSE_WHITE); +ResourceLocation HorseRenderer::HORSE_MULE_LOCATION = ResourceLocation(TN_MOB_MULE); +ResourceLocation HorseRenderer::HORSE_DONKEY_LOCATION = ResourceLocation(TN_MOB_DONKEY); +ResourceLocation HorseRenderer::HORSE_ZOMBIE_LOCATION = ResourceLocation(TN_MOB_HORSE_ZOMBIE); +ResourceLocation HorseRenderer::HORSE_SKELETON_LOCATION = ResourceLocation(TN_MOB_HORSE_SKELETON); + +std::map HorseRenderer::LAYERED_LOCATION_CACHE; + +HorseRenderer::HorseRenderer(Model *model, float f) : MobRenderer(model, f) +{ +} + +void HorseRenderer::adjustHeight(shared_ptr mob, float FHeight) +{ + glTranslatef(0.0F, FHeight, 0.0F); +} + +void HorseRenderer::scale(shared_ptr entityliving, float f) +{ + float sizeFactor = 1.0f; + + int type = dynamic_pointer_cast(entityliving)->getType(); + if (type == EntityHorse::TYPE_DONKEY) + { + sizeFactor *= 0.87F; + } + else if (type == EntityHorse::TYPE_MULE) + { + sizeFactor *= 0.92F; + } + glScalef(sizeFactor, sizeFactor, sizeFactor); + MobRenderer::scale(entityliving, f); +} + +void HorseRenderer::renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) +{ + if (mob->isInvisible()) + { + model->setupAnim(wp, ws, bob, headRotMinusBodyRot, headRotx, scale, mob); + } + else + { + EntityRenderer::bindTexture(mob); + model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); + // Ensure that any extra layers of texturing are disabled after rendering this horse + RenderManager.TextureBind(-1); + } +} + +void HorseRenderer::bindTexture(ResourceLocation *location) +{ + // Set up (potentially) multiple texture layers for the horse + entityRenderDispatcher->textures->bindTextureLayers(location); +} + +ResourceLocation *HorseRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr horse = dynamic_pointer_cast(entity); + + if (!horse->hasLayeredTextures()) + { + switch (horse->getType()) + { + default: + case EntityHorse::TYPE_HORSE: return &HORSE_LOCATION; + case EntityHorse::TYPE_MULE: return &HORSE_MULE_LOCATION; + case EntityHorse::TYPE_DONKEY: return &HORSE_DONKEY_LOCATION; + case EntityHorse::TYPE_UNDEAD: return &HORSE_ZOMBIE_LOCATION; + case EntityHorse::TYPE_SKELETON: return &HORSE_SKELETON_LOCATION; + } + } + + return getOrCreateLayeredTextureLocation(horse); +} + +ResourceLocation *HorseRenderer::getOrCreateLayeredTextureLocation(shared_ptr horse) +{ + wstring textureName = horse->getLayeredTextureHashName(); + + AUTO_VAR(it, LAYERED_LOCATION_CACHE.find(textureName)); + + ResourceLocation *location; + if (it != LAYERED_LOCATION_CACHE.end()) + { + location = it->second; + } + else + { + LAYERED_LOCATION_CACHE[textureName] = new ResourceLocation(horse->getLayeredTextureLayers()); + + it = LAYERED_LOCATION_CACHE.find(textureName); + location = it->second; + } + + return location; +} \ No newline at end of file diff --git a/Minecraft.Client/HorseRenderer.h b/Minecraft.Client/HorseRenderer.h new file mode 100644 index 00000000..cd3674d8 --- /dev/null +++ b/Minecraft.Client/HorseRenderer.h @@ -0,0 +1,31 @@ +#pragma once +#include "MobRenderer.h" +#include "ResourceLocation.h" + +class EntityHorse; +class PathfinderMob; + +class HorseRenderer : public MobRenderer +{ +private: + static std::map LAYERED_LOCATION_CACHE; + + static ResourceLocation HORSE_LOCATION; + static ResourceLocation HORSE_MULE_LOCATION; + static ResourceLocation HORSE_DONKEY_LOCATION; + static ResourceLocation HORSE_ZOMBIE_LOCATION; + static ResourceLocation HORSE_SKELETON_LOCATION; + +public: + HorseRenderer(Model *model, float f); + +protected: + void adjustHeight(shared_ptr mob, float FHeight); + virtual void scale(shared_ptr entityliving, float f); + virtual void renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); + virtual void bindTexture(ResourceLocation *location); + virtual ResourceLocation *getTextureLocation(shared_ptr entity); + +private: + ResourceLocation *getOrCreateLayeredTextureLocation(shared_ptr horse); +}; \ No newline at end of file diff --git a/Minecraft.Client/HugeExplosionParticle.cpp b/Minecraft.Client/HugeExplosionParticle.cpp index 273eed2b..2a104c19 100644 --- a/Minecraft.Client/HugeExplosionParticle.cpp +++ b/Minecraft.Client/HugeExplosionParticle.cpp @@ -4,6 +4,9 @@ #include "Textures.h" #include "Tesselator.h" #include "Lighting.h" +#include "ResourceLocation.h" + +ResourceLocation HugeExplosionParticle::EXPLOSION_LOCATION = ResourceLocation(TN_MISC_EXPLOSION); HugeExplosionParticle::HugeExplosionParticle(Textures *textures, Level *level, double x, double y, double z, double xa, double ya, double za) : Particle(level,x,y,z,0,0,0) { @@ -29,7 +32,7 @@ void HugeExplosionParticle::render(Tesselator *t, float a, float xa, float ya, f { int tex = (int) ((life + a) * 15 / lifeTime); if (tex > 15) return; - textures->bindTexture(TN_MISC_EXPLOSION); // 4J was "/misc/explosion.png" + textures->bindTexture(&EXPLOSION_LOCATION); float u0 = (tex % 4) / 4.0f; float u1 = u0 + 0.999f / 4.0f; diff --git a/Minecraft.Client/HugeExplosionParticle.h b/Minecraft.Client/HugeExplosionParticle.h index 0f02d122..5c386d63 100644 --- a/Minecraft.Client/HugeExplosionParticle.h +++ b/Minecraft.Client/HugeExplosionParticle.h @@ -5,6 +5,7 @@ class HugeExplosionParticle : public Particle { private: + static ResourceLocation EXPLOSION_LOCATION; int life; int lifeTime; Textures *textures; diff --git a/Minecraft.Client/HumanoidMobRenderer.cpp b/Minecraft.Client/HumanoidMobRenderer.cpp index 389116ed..a9ff25c4 100644 --- a/Minecraft.Client/HumanoidMobRenderer.cpp +++ b/Minecraft.Client/HumanoidMobRenderer.cpp @@ -10,12 +10,17 @@ #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "..\Minecraft.World\net.minecraft.h" +const wstring HumanoidMobRenderer::MATERIAL_NAMES[5] = { L"cloth", L"chain", L"iron", L"diamond", L"gold" }; +std::map HumanoidMobRenderer::ARMOR_LOCATION_CACHE; + void HumanoidMobRenderer::_init(HumanoidModel *humanoidModel, float scale) { this->humanoidModel = humanoidModel; this->_scale = scale; armorParts1 = NULL; armorParts2 = NULL; + + createArmorParts(); } HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow) : MobRenderer(humanoidModel, shadow) @@ -26,8 +31,61 @@ HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float sha HumanoidMobRenderer::HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow, float scale) : MobRenderer(humanoidModel, shadow) { _init(humanoidModel, scale); +} - createArmorParts(); +ResourceLocation *HumanoidMobRenderer::getArmorLocation(ArmorItem *armorItem, int layer) +{ + return getArmorLocation(armorItem, layer, false); +} + +ResourceLocation *HumanoidMobRenderer::getArmorLocation(ArmorItem *armorItem, int layer, bool overlay) +{ + switch(armorItem->modelIndex) + { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + }; + wstring path = wstring(L"armor/" + MATERIAL_NAMES[armorItem->modelIndex]).append(L"_").append(_toString(layer == 2 ? 2 : 1)).append((overlay ? L"_b" :L"")).append(L".png"); + + std::map::iterator it = ARMOR_LOCATION_CACHE.find(path); + + ResourceLocation *location; + if (it != ARMOR_LOCATION_CACHE.end()) + { + location = &it->second; + } + else + { + ARMOR_LOCATION_CACHE.insert(std::pair(path, ResourceLocation(path))); + + it = ARMOR_LOCATION_CACHE.find(path); + location = &it->second; + } + + return location; +} + +void HumanoidMobRenderer::prepareSecondPassArmor(shared_ptr mob, int layer, float a) +{ + shared_ptr itemInstance = mob->getArmor(3 - layer); + if (itemInstance != NULL) { + Item *item = itemInstance->getItem(); + if (dynamic_cast(item) != NULL) + { + bindTexture(getArmorLocation(dynamic_cast(item), layer, true)); + + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); + } + } } void HumanoidMobRenderer::createArmorParts() @@ -36,11 +94,97 @@ void HumanoidMobRenderer::createArmorParts() armorParts2 = new HumanoidModel(0.5f); } -void HumanoidMobRenderer::additionalRendering(shared_ptr mob, float a) +int HumanoidMobRenderer::prepareArmor(shared_ptr _mob, int layer, float a) +{ + shared_ptr mob = dynamic_pointer_cast(_mob); + + shared_ptr itemInstance = mob->getArmor(3 - layer); + if (itemInstance != NULL) + { + Item *item = itemInstance->getItem(); + if (dynamic_cast(item) != NULL) + { + ArmorItem *armorItem = dynamic_cast(item); + bindTexture(getArmorLocation(armorItem, layer)); + + HumanoidModel *armor = layer == 2 ? armorParts2 : armorParts1; + + armor->head->visible = layer == 0; + armor->hair->visible = layer == 0; + armor->body->visible = layer == 1 || layer == 2; + armor->arm0->visible = layer == 1; + armor->arm1->visible = layer == 1; + armor->leg0->visible = layer == 2 || layer == 3; + armor->leg1->visible = layer == 2 || layer == 3; + + setArmor(armor); + armor->attackTime = model->attackTime; + armor->riding = model->riding; + armor->young = model->young; + + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); + if (armorItem->getMaterial() == ArmorItem::ArmorMaterial::CLOTH) + { + int color = armorItem->getColor(itemInstance); + float red = (float) ((color >> 16) & 0xFF) / 0xFF; + float green = (float) ((color >> 8) & 0xFF) / 0xFF; + float blue = (float) (color & 0xFF) / 0xFF; + glColor3f(brightness * red, brightness * green, brightness * blue); + + if (itemInstance->isEnchanted()) return 0x1f; + return 0x10; + + } + else + { + glColor3f(brightness, brightness, brightness); + } + + if (itemInstance->isEnchanted()) return 15; + + return 1; + } + } + return -1; +} + +void HumanoidMobRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { + shared_ptr mob = dynamic_pointer_cast(_mob); + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); glColor3f(brightness, brightness, brightness); - shared_ptr item = mob->getCarriedItem(); + shared_ptr item = mob->getCarriedItem(); + + prepareCarriedItem(mob, item); + + double yp = y - mob->heightOffset; + if (mob->isSneaking()) { + yp -= 2 / 16.0f; + } + MobRenderer::render(mob, x, yp, z, rot, a); + armorParts1->bowAndArrow = armorParts2->bowAndArrow = humanoidModel->bowAndArrow = false; + armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = false; + armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = 0; +} + +ResourceLocation *HumanoidMobRenderer::getTextureLocation(shared_ptr mob) +{ + // TODO -- Figure out of we need some data in here + return NULL; +} + +void HumanoidMobRenderer::prepareCarriedItem(shared_ptr mob, shared_ptr item) +{ + armorParts1->holdingRightHand = armorParts2->holdingRightHand = humanoidModel->holdingRightHand = item != NULL ? 1 : 0; + armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = mob->isSneaking(); +} + +void HumanoidMobRenderer::additionalRendering(shared_ptr mob, float a) +{ + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); + shared_ptr item = mob->getCarriedItem(); shared_ptr headGear = mob->getArmor(3); if (headGear != NULL) @@ -82,9 +226,9 @@ void HumanoidMobRenderer::additionalRendering(shared_ptr mob, float a) } } - if (item != NULL) + if (item != NULL) { - glPushMatrix(); + glPushMatrix(); if (model->young) { @@ -94,18 +238,18 @@ void HumanoidMobRenderer::additionalRendering(shared_ptr mob, float a) glScalef(s, s, s); } - humanoidModel->arm0->translateTo(1 / 16.0f); - glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); + humanoidModel->arm0->translateTo(1 / 16.0f); + glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); - if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) + if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) { - float s = 8 / 16.0f; - glTranslatef(-0 / 16.0f, 3 / 16.0f, -5 / 16.0f); - s *= 0.75f; - glRotatef(20, 1, 0, 0); - glRotatef(45, 0, 1, 0); - glScalef(-s, -s, s); - } + float s = 8 / 16.0f; + glTranslatef(-0 / 16.0f, 3 / 16.0f, -5 / 16.0f); + s *= 0.75f; + glRotatef(20, 1, 0, 0); + glRotatef(45, 0, 1, 0); + glScalef(-s, -s, s); + } else if (item->id == Item::bow_Id) { float s = 10 / 16.0f; @@ -117,34 +261,34 @@ void HumanoidMobRenderer::additionalRendering(shared_ptr mob, float a) } else if (Item::items[item->id]->isHandEquipped()) { - float s = 10 / 16.0f; - glTranslatef(0, 3 / 16.0f, 0); - glScalef(s, -s, s); - glRotatef(-100, 1, 0, 0); - glRotatef(45, 0, 1, 0); - } + float s = 10 / 16.0f; + glTranslatef(0, 3 / 16.0f, 0); + glScalef(s, -s, s); + glRotatef(-100, 1, 0, 0); + glRotatef(45, 0, 1, 0); + } else { - float s = 6 / 16.0f; - glTranslatef(+4 / 16.0f, +3 / 16.0f, -3 / 16.0f); - glScalef(s, s, s); - glRotatef(60, 0, 0, 1); - glRotatef(-90, 1, 0, 0); - glRotatef(20, 0, 0, 1); - } + float s = 6 / 16.0f; + glTranslatef(+4 / 16.0f, +3 / 16.0f, -3 / 16.0f); + glScalef(s, s, s); + glRotatef(60, 0, 0, 1); + glRotatef(-90, 1, 0, 0); + glRotatef(20, 0, 0, 1); + } this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); if (item->getItem()->hasMultipleSpriteLayers()) { this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 1); } - - glPopMatrix(); - } + + glPopMatrix(); + } } -void HumanoidMobRenderer::scale(shared_ptr mob, float a) +void HumanoidMobRenderer::scale(shared_ptr mob, float a) { glScalef(_scale, _scale, _scale); } \ No newline at end of file diff --git a/Minecraft.Client/HumanoidMobRenderer.h b/Minecraft.Client/HumanoidMobRenderer.h index 6c718fb9..98d8b8db 100644 --- a/Minecraft.Client/HumanoidMobRenderer.h +++ b/Minecraft.Client/HumanoidMobRenderer.h @@ -1,10 +1,16 @@ #pragma once #include "MobRenderer.h" + class HumanoidModel; class Giant; +class ArmorItem; class HumanoidMobRenderer : public MobRenderer { +private: + static const wstring MATERIAL_NAMES[5]; + static std::map ARMOR_LOCATION_CACHE; + protected: HumanoidModel *humanoidModel; float _scale; @@ -13,10 +19,20 @@ protected: void _init(HumanoidModel *humanoidModel, float scale); public: + static ResourceLocation *getArmorLocation(ArmorItem *armorItem, int layer); + static ResourceLocation *getArmorLocation(ArmorItem *armorItem, int layer, bool overlay); + HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow); HumanoidMobRenderer(HumanoidModel *humanoidModel, float shadow, float scale); + + virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); + protected: virtual void createArmorParts(); - virtual void additionalRendering(shared_ptr mob, float a); - void scale(shared_ptr mob, float a); + virtual int prepareArmor(shared_ptr _mob, int layer, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); + virtual void prepareCarriedItem(shared_ptr mob, shared_ptr item); + virtual void additionalRendering(shared_ptr mob, float a); + virtual void scale(shared_ptr mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/HumanoidModel.cpp b/Minecraft.Client/HumanoidModel.cpp index 444d9c90..05d132fa 100644 --- a/Minecraft.Client/HumanoidModel.cpp +++ b/Minecraft.Client/HumanoidModel.cpp @@ -142,12 +142,12 @@ HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight void HumanoidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - if(entity!=NULL) + if(entity != NULL) { m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask(); } - setupAnim(time, r, bob, yRot, xRot, scale, m_uiAnimOverrideBitmask); + setupAnim(time, r, bob, yRot, xRot, scale, entity, m_uiAnimOverrideBitmask); if (young) { @@ -180,7 +180,7 @@ void HumanoidModel::render(shared_ptr entity, float time, float r, float } } -void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { //bool bIsAttacking = (attackTime > -9990.0f); @@ -189,6 +189,7 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float head->xRot = xRot / (float) (180.0f / PI); hair->yRot = head->yRot; hair->xRot = head->xRot; + body->z = 0.0f; // Does the skin have an override for anim? @@ -240,12 +241,22 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float if (riding) { - arm0->xRot += -HALF_PI * 0.4f; - arm1->xRot += -HALF_PI * 0.4f; - leg0->xRot = -HALF_PI * 0.8f; - leg1->xRot = -HALF_PI * 0.8f; - leg0->yRot = HALF_PI * 0.2f; - leg1->yRot = -HALF_PI * 0.2f; + if(uiBitmaskOverrideAnim&(1<xRot += -HALF_PI * 0.4f; + arm1->xRot += -HALF_PI * 0.4f; + leg0->xRot = -HALF_PI * 0.8f; + leg1->xRot = -HALF_PI * 0.8f; + leg0->yRot = HALF_PI * 0.2f; + leg1->yRot = -HALF_PI * 0.2f; + } + else + { + arm0->xRot += -HALF_PI * 0.4f; + arm1->xRot += -HALF_PI * 0.4f; + leg0->xRot = -HALF_PI * 0.4f; + leg1->xRot = -HALF_PI * 0.4f; + } } else if(idle && !sneaking ) { @@ -334,22 +345,45 @@ void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float if (sneaking) { - body->xRot = 0.5f; - leg0->xRot -= 0.0f; - leg1->xRot -= 0.0f; - arm0->xRot += 0.4f; - arm1->xRot += 0.4f; - leg0->z = +4.0f; - leg1->z = +4.0f; - body->y = 0.0f; - arm0->y = 2.0f; - arm1->y = 2.0f; - leg0->y = +9.0f; - leg1->y = +9.0f; - head->y = +1.0f; - hair->y = +1.0f; - ear->y = +1.0f; - cloak->y = 0.0f; + if(uiBitmaskOverrideAnim&(1<xRot = -0.5f; + leg0->xRot -= 0.0f; + leg1->xRot -= 0.0f; + arm0->xRot += 0.4f; + arm1->xRot += 0.4f; + leg0->z = -4.0f; + leg1->z = -4.0f; + body->z = 2.0f; + body->y = 0.0f; + arm0->y = 2.0f; + arm1->y = 2.0f; + leg0->y = +9.0f; + leg1->y = +9.0f; + head->y = +1.0f; + hair->y = +1.0f; + ear->y = +1.0f; + cloak->y = 0.0f; + } + else + { + body->xRot = 0.5f; + leg0->xRot -= 0.0f; + leg1->xRot -= 0.0f; + arm0->xRot += 0.4f; + arm1->xRot += 0.4f; + leg0->z = +4.0f; + leg1->z = +4.0f; + body->y = 0.0f; + arm0->y = 2.0f; + arm1->y = 2.0f; + leg0->y = +9.0f; + leg1->y = +9.0f; + head->y = +1.0f; + hair->y = +1.0f; + ear->y = +1.0f; + cloak->y = 0.0f; + } } else { diff --git a/Minecraft.Client/HumanoidModel.h b/Minecraft.Client/HumanoidModel.h index 0ca10f4b..52f9d98e 100644 --- a/Minecraft.Client/HumanoidModel.h +++ b/Minecraft.Client/HumanoidModel.h @@ -36,7 +36,8 @@ public: eAnim_DisableRenderTorso, eAnim_DisableRenderLeg0, eAnim_DisableRenderLeg1, - eAnim_DisableRenderHair + eAnim_DisableRenderHair, + eAnim_SmallModel // Maggie Simpson for riding horse, etc }; @@ -54,7 +55,7 @@ public: HumanoidModel(float g); HumanoidModel(float g, float yOffset, int texWidth, int texHeight); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); void renderHair(float scale, bool usecompiled); void renderEars(float scale, bool usecompiled); void renderCloak(float scale, bool usecompiled); diff --git a/Minecraft.Client/Input.cpp b/Minecraft.Client/Input.cpp index 716f4dfd..6933a2d7 100644 --- a/Minecraft.Client/Input.cpp +++ b/Minecraft.Client/Input.cpp @@ -83,8 +83,8 @@ void Input::tick(LocalPlayer *player) sprintForward = 0.0f; } - // 4J - in flying mode, don't actually toggle sneaking - if(!player->abilities.flying) + // 4J: In flying mode, don't actually toggle sneaking (unless we're riding in which case we need to sneak to dismount) + if(!player->abilities.flying || player->riding != NULL) { if((player->ullButtonsPressed&(1LL<localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_SNEAK_TOGGLE)) { diff --git a/Minecraft.Client/ItemFrameRenderer.cpp b/Minecraft.Client/ItemFrameRenderer.cpp index 40769fb9..2d7493ec 100644 --- a/Minecraft.Client/ItemFrameRenderer.cpp +++ b/Minecraft.Client/ItemFrameRenderer.cpp @@ -4,6 +4,7 @@ #include "entityRenderDispatcher.h" //#include "ItemFrame" #include "ItemFrameRenderer.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\JavaMath.h" #include "..\Minecraft.World\net.minecraft.world.entity.Item.h" @@ -18,6 +19,8 @@ #include "CompassTexture.h" #include "Minimap.h" +ResourceLocation ItemFrameRenderer::MAP_BACKGROUND_LOCATION = ResourceLocation(TN_MISC_MAPBG); + void ItemFrameRenderer::registerTerrainTextures(IconRegister *iconRegister) { backTexture = iconRegister->registerIcon(L"itemframe_back"); @@ -52,7 +55,7 @@ void ItemFrameRenderer::drawFrame(shared_ptr itemFrame) Minecraft *pMinecraft=Minecraft::GetInstance(); glPushMatrix(); - entityRenderDispatcher->textures->bindTexture(TN_TERRAIN); + entityRenderDispatcher->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); glRotatef(itemFrame->yRot, 0, 1, 0); Tile *wood = Tile::wood; @@ -134,7 +137,7 @@ void ItemFrameRenderer::drawItem(shared_ptr entity) if (itemEntity->getItem()->getItem() == Item::map) { - entityRenderDispatcher->textures->bindTexture(TN_MISC_MAPBG); + entityRenderDispatcher->textures->bindTexture(&MAP_BACKGROUND_LOCATION); Tesselator *t = Tesselator::getInstance(); glRotatef(180, 0, 1, 0); diff --git a/Minecraft.Client/ItemFrameRenderer.h b/Minecraft.Client/ItemFrameRenderer.h index 47f2fe90..a6eea8f4 100644 --- a/Minecraft.Client/ItemFrameRenderer.h +++ b/Minecraft.Client/ItemFrameRenderer.h @@ -4,9 +4,9 @@ class ItemFrameRenderer : public EntityRenderer { private: + static ResourceLocation MAP_BACKGROUND_LOCATION; Icon *backTexture; - //@Override public: void registerTerrainTextures(IconRegister *iconRegister); virtual void render(shared_ptr _itemframe, double x, double y, double z, float rot, float a); diff --git a/Minecraft.Client/ItemInHandRenderer.cpp b/Minecraft.Client/ItemInHandRenderer.cpp index cee9254d..1e1ca1dd 100644 --- a/Minecraft.Client/ItemInHandRenderer.cpp +++ b/Minecraft.Client/ItemInHandRenderer.cpp @@ -3,6 +3,7 @@ #include "TileRenderer.h" #include "Tesselator.h" #include "Textures.h" +#include "TextureAtlas.h" #include "EntityRenderer.h" #include "PlayerRenderer.h" #include "EntityRenderDispatcher.h" @@ -17,10 +18,15 @@ #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\net.minecraft.world.h" -int ItemInHandRenderer::list = -1; +ResourceLocation ItemInHandRenderer::ENCHANT_GLINT_LOCATION = ResourceLocation(TN__BLUR__MISC_GLINT); +ResourceLocation ItemInHandRenderer::MAP_BACKGROUND_LOCATION = ResourceLocation(TN_MISC_MAPBG); +ResourceLocation ItemInHandRenderer::UNDERWATER_LOCATION = ResourceLocation(TN_MISC_WATER); + +int ItemInHandRenderer::listItem = -1; +int ItemInHandRenderer::listTerrain = -1; int ItemInHandRenderer::listGlint = -1; -ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) +ItemInHandRenderer::ItemInHandRenderer(Minecraft *minecraft, bool optimisedMinimap) { // 4J - added height = 0; @@ -29,18 +35,18 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) tileRenderer = new TileRenderer(); lastSlot = -1; - this->mc = mc; - minimap = new Minimap(mc->font, mc->options, mc->textures, optimisedMinimap); + this->minecraft = minecraft; + minimap = new Minimap(minecraft->font, minecraft->options, minecraft->textures, optimisedMinimap); // 4J - replaced mesh that is used to render held items with individual cubes, so we can make it all join up properly without seams. This // has a lot more quads in it than the original, so is now precompiled with a UV matrix offset to put it in the final place for the // current icon. Compile it on demand for the first ItemInHandRenderer (list is static) - if( list == -1 ) + if( listItem == -1 ) { - list = MemoryTracker::genLists(1); + listItem = MemoryTracker::genLists(1); float dd = 1 / 16.0f; - glNewList(list, GL_COMPILE); + glNewList(listItem, GL_COMPILE); Tesselator *t = Tesselator::getInstance(); t->begin(); for( int yp = 0; yp < 16; yp++ ) @@ -92,6 +98,64 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) glEndList(); } + // Terrain texture is a different layout from the item texture + if( listTerrain == -1 ) + { + listTerrain = MemoryTracker::genLists(1); + float dd = 1 / 16.0f; + + glNewList(listTerrain, GL_COMPILE); + Tesselator *t = Tesselator::getInstance(); + t->begin(); + for( int yp = 0; yp < 16; yp++ ) + for( int xp = 0; xp < 16; xp++ ) + { + float u = (15-xp) / 256.0f; + float v = (15-yp) / 512.0f; + u += 0.5f / 256.0f; + v += 0.5f / 512.0f; + float x0 = xp / 16.0f; + float x1 = x0 + 1.0f/16.0f; + float y0 = yp / 16.0f; + float y1 = y0 + 1.0f/16.0f; + float z0 = 0.0f; + float z1 = -dd; + + t->normal(0, 0, 1); + t->vertexUV(x0, y0, z0, u, v); + t->vertexUV(x1, y0, z0, u, v); + t->vertexUV(x1, y1, z0, u, v); + t->vertexUV(x0, y1, z0, u, v); + t->normal(0, 0, -1); + t->vertexUV(x0, y1, z1, u, v); + t->vertexUV(x1, y1, z1, u, v); + t->vertexUV(x1, y0, z1, u, v); + t->vertexUV(x0, y0, z1, u, v); + t->normal(-1, 0, 0); + t->vertexUV(x0, y0, z1, u, v); + t->vertexUV(x0, y0, z0, u, v); + t->vertexUV(x0, y1, z0, u, v); + t->vertexUV(x0, y1, z1, u, v); + t->normal(1, 0, 0); + t->vertexUV(x1, y1, z1, u, v); + t->vertexUV(x1, y1, z0, u, v); + t->vertexUV(x1, y0, z0, u, v); + t->vertexUV(x1, y0, z1, u, v); + t->normal(0, 1, 0); + t->vertexUV(x1, y0, z0, u, v); + t->vertexUV(x0, y0, z0, u, v); + t->vertexUV(x0, y0, z1, u, v); + t->vertexUV(x1, y0, z1, u, v); + t->normal(0, -1, 0); + t->vertexUV(x1, y1, z1, u, v); + t->vertexUV(x0, y1, z1, u, v); + t->vertexUV(x0, y1, z0, u, v); + t->vertexUV(x1, y1, z0, u, v); + } + t->end(); + glEndList(); + } + // Also create special object for glint overlays - this is the same as the previous one, with a different UV scalings, and depth test set to equal if( listGlint == -1 ) { @@ -158,7 +222,7 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) } -void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor/* = true*/) +void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor/* = true*/) { // 4J - code borrowed from render method below, although not factoring in brightness as that should already be being taken into account // by texture lighting. This is for colourising things held in 3rd person view. @@ -177,9 +241,9 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptrgetIconType() == Icon::TYPE_TERRAIN && tile != NULL && TileRenderer::canRender(tile->getRenderShape())) { MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + minecraft->textures->bindTexture(minecraft->textures->getTextureLocation(Icon::TYPE_TERRAIN)); MemSect(0); - tileRenderer->renderTile(tile, item->getAuxValue(), SharedConstants::TEXTURE_LIGHTING ? 1.0f : mob->getBrightness(1)); // 4J - change brought forward from 1.8.2 + tileRenderer->renderTile(Tile::tiles[item->id], item->getAuxValue(), SharedConstants::TEXTURE_LIGHTING ? 1.0f : mob->getBrightness(1)); // 4J - change brought forward from 1.8.2 } else { @@ -192,14 +256,9 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptrgetIconType() == Icon::TYPE_TERRAIN) - { - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - } - else - { - mc->textures->bindTexture(TN_GUI_ITEMS); // 4J was L"/gui/items.png" - } + bool bIsTerrain = item->getIconType() == Icon::TYPE_TERRAIN; + minecraft->textures->bindTexture(minecraft->textures->getTextureLocation(item->getIconType())); + MemSect(0); Tesselator *t = Tesselator::getInstance(); @@ -238,13 +297,13 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptrgetSourceWidth(), icon->getSourceHeight(), 1 / 16.0f, false); + renderItem3D(t, u0, v0, u1, v1, icon->getSourceWidth(), icon->getSourceHeight(), 1 / 16.0f, false, bIsTerrain); if (item != NULL && item->isFoil() && layer == 0) { glDepthFunc(GL_EQUAL); glDisable(GL_LIGHTING); - mc->textures->bind(mc->textures->loadTexture(TN__BLUR__MISC_GLINT)); // 4J was L"%blur%/misc/glint.png" + minecraft->textures->bindTexture(&ENCHANT_GLINT_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); float br = 0.76f; @@ -257,14 +316,14 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptr mob, shared_ptr player = mc->player; + shared_ptr player = minecraft->player; // 4J - added so we can adjust the position of the hands for horizontal & vertical split screens float fudgeX = 0.0f; @@ -355,12 +414,12 @@ void ItemInHandRenderer::render(float a) shared_ptr item = selectedItem; - float br = mc->level->getBrightness(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + float br = minecraft->level->getBrightness(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); // 4J - change brought forward from 1.8.2 if (SharedConstants::TEXTURE_LIGHTING) { br = 1; - int col = mc->level->getLightColor(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z), 0); + int col = minecraft->level->getLightColor(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z), 0); int u = col % 65536; int v = col / 65536; glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); @@ -413,9 +472,9 @@ void ItemInHandRenderer::render(float a) { // 4J-PB - if we've got a player texture, use that - //glBindTexture(GL_TEXTURE_2D, mc->textures->loadHttpTexture(mc->player->customTextureUrl, mc->player->getTexture())); - glBindTexture(GL_TEXTURE_2D, mc->textures->loadMemTexture(mc->player->customTextureUrl, mc->player->getTexture())); - mc->textures->clearLastBoundId(); + //glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadHttpTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); + glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadMemTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); + minecraft->textures->clearLastBoundId(); for (int i = 0; i < 2; i++) { int flip = i * 2 - 1; @@ -427,7 +486,7 @@ void ItemInHandRenderer::render(float a) glRotatef(59, 0, 0, 1); glRotatef((float)(-65 * flip), 0, 1, 0); - EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(mc->player); + EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(minecraft->player); PlayerRenderer *playerRenderer = (PlayerRenderer *) er; float ss = 1; glScalef(ss, ss, ss); @@ -463,7 +522,7 @@ void ItemInHandRenderer::render(float a) glScalef(s, s, s); MemSect(31); - mc->textures->bindTexture(TN_MISC_MAPBG); // 4J was L"/misc/mapbg.png" + minecraft->textures->bindTexture(&MAP_BACKGROUND_LOCATION); // 4J was L"/misc/mapbg.png" MemSect(0); Tesselator *t = Tesselator::getInstance(); @@ -477,9 +536,9 @@ void ItemInHandRenderer::render(float a) t->vertexUV((float)(0 - vo), (float)( 0 - vo), (float)( 0), (float)( 0), (float)( 0)); t->end(); - shared_ptr data = Item::map->getSavedData(item, mc->level); + shared_ptr data = Item::map->getSavedData(item, minecraft->level); PIXBeginNamedEvent(0,"Minimap render"); - if(data != NULL) minimap->render(mc->player, mc->textures, data, mc->player->entityId); + if(data != NULL) minimap->render(minecraft->player, minecraft->textures, data, minecraft->player->entityId); PIXEndNamedEvent(); glPopMatrix(); @@ -633,12 +692,12 @@ void ItemInHandRenderer::render(float a) // 4J-PB - if we've got a player texture, use that - //glBindTexture(GL_TEXTURE_2D, mc->textures->loadHttpTexture(mc->player->customTextureUrl, mc->player->getTexture())); + //glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadHttpTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); MemSect(31); - glBindTexture(GL_TEXTURE_2D, mc->textures->loadMemTexture(mc->player->customTextureUrl, mc->player->getTexture())); + glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadMemTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); MemSect(0); - mc->textures->clearLastBoundId(); + minecraft->textures->clearLastBoundId(); glTranslatef(-1.0f, +3.6f, +3.5f); glRotatef(120, 0, 0, 1); glRotatef(180 + 20, 1, 0, 0); @@ -646,7 +705,7 @@ void ItemInHandRenderer::render(float a) glScalef(1.5f / 24.0f * 16, 1.5f / 24.0f * 16, 1.5f / 24.0f * 16); glTranslatef(5.6f, 0, 0); - EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(mc->player); + EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(minecraft->player); PlayerRenderer *playerRenderer = (PlayerRenderer *) er; float ss = 1; glScalef(ss, ss, ss); @@ -670,26 +729,19 @@ void ItemInHandRenderer::render(float a) void ItemInHandRenderer::renderScreenEffect(float a) { glDisable(GL_ALPHA_TEST); - if (mc->player->isOnFire()) + if (minecraft->player->isOnFire()) { - MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - MemSect(0); renderFire(a); } - - if (mc->player->isInWall()) // Inside a tile + if (minecraft->player->isInWall()) // Inside a tile { - int x = Mth::floor(mc->player->x); - int y = Mth::floor(mc->player->y); - int z = Mth::floor(mc->player->z); + int x = Mth::floor(minecraft->player->x); + int y = Mth::floor(minecraft->player->y); + int z = Mth::floor(minecraft->player->z); - MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - MemSect(0); - int tile = mc->level->getTile(x, y, z); - if (mc->level->isSolidBlockingTile(x, y, z)) + int tile = minecraft->level->getTile(x, y, z); + if (minecraft->level->isSolidBlockingTile(x, y, z)) { renderTex(a, Tile::tiles[tile]->getTexture(2)); } @@ -697,15 +749,15 @@ void ItemInHandRenderer::renderScreenEffect(float a) { for (int i = 0; i < 8; i++) { - float xo = ((i >> 0) % 2 - 0.5f) * mc->player->bbWidth * 0.9f; - float yo = ((i >> 1) % 2 - 0.5f) * mc->player->bbHeight * 0.2f; - float zo = ((i >> 2) % 2 - 0.5f) * mc->player->bbWidth * 0.9f; + float xo = ((i >> 0) % 2 - 0.5f) * minecraft->player->bbWidth * 0.9f; + float yo = ((i >> 1) % 2 - 0.5f) * minecraft->player->bbHeight * 0.2f; + float zo = ((i >> 2) % 2 - 0.5f) * minecraft->player->bbWidth * 0.9f; int xt = Mth::floor(x + xo); int yt = Mth::floor(y + yo); int zt = Mth::floor(z + zo); - if (mc->level->isSolidBlockingTile(xt, yt, zt)) + if (minecraft->level->isSolidBlockingTile(xt, yt, zt)) { - tile = mc->level->getTile(xt, yt, zt); + tile = minecraft->level->getTile(xt, yt, zt); } } } @@ -713,10 +765,10 @@ void ItemInHandRenderer::renderScreenEffect(float a) if (Tile::tiles[tile] != NULL) renderTex(a, Tile::tiles[tile]->getTexture(2)); } - if (mc->player->isUnderLiquid(Material::water)) + if (minecraft->player->isUnderLiquid(Material::water)) { MemSect(31); - mc->textures->bindTexture(TN_MISC_WATER); // 4J was L"/misc/water.png" + minecraft->textures->bindTexture(&UNDERWATER_LOCATION); // 4J was L"/misc/water.png" MemSect(0); renderWater(a); } @@ -726,6 +778,8 @@ void ItemInHandRenderer::renderScreenEffect(float a) void ItemInHandRenderer::renderTex(float a, Icon *slot) { + minecraft->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: get this data from Icon + Tesselator *t = Tesselator::getInstance(); float br = 0.1f; @@ -760,9 +814,11 @@ void ItemInHandRenderer::renderTex(float a, Icon *slot) void ItemInHandRenderer::renderWater(float a) { + minecraft->textures->bindTexture(&UNDERWATER_LOCATION); + Tesselator *t = Tesselator::getInstance(); - float br = mc->player->getBrightness(a); + float br = minecraft->player->getBrightness(a); glColor4f(br, br, br, 0.5f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -777,8 +833,8 @@ void ItemInHandRenderer::renderWater(float a) float y1 = +1; float z0 = -0.5f; - float uo = -mc->player->yRot / 64.0f; - float vo = +mc->player->xRot / 64.0f; + float uo = -minecraft->player->yRot / 64.0f; + float vo = +minecraft->player->xRot / 64.0f; t->begin(); t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( size + uo), (float)( size + vo)); @@ -796,7 +852,14 @@ void ItemInHandRenderer::renderWater(float a) void ItemInHandRenderer::renderFire(float a) { Tesselator *t = Tesselator::getInstance(); - glColor4f(1, 1, 1, 0.9f); + + unsigned int col = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Fire_Overlay ); + float aCol = ( (col>>24)&0xFF )/255.0f; + float rCol = ( (col>>16)&0xFF )/255.0f; + float gCol = ( (col>>8)&0xFF )/255.0; + float bCol = ( col&0xFF )/255.0; + + glColor4f(rCol, gCol, bCol, aCol); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -805,6 +868,7 @@ void ItemInHandRenderer::renderFire(float a) { glPushMatrix(); Icon *slot = Tile::fire->getTextureLayer(1); + minecraft->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: Get this from Icon float u0 = slot->getU0(true); float u1 = slot->getU1(true); @@ -837,7 +901,7 @@ void ItemInHandRenderer::tick() oHeight = height; - shared_ptr player = mc->player; + shared_ptr player = minecraft->player; shared_ptr nextTile = player->inventory->getSelected(); bool matches = lastSlot == player->inventory->selected && nextTile == selectedItem; diff --git a/Minecraft.Client/ItemInHandRenderer.h b/Minecraft.Client/ItemInHandRenderer.h index dee51a7f..b5d840a2 100644 --- a/Minecraft.Client/ItemInHandRenderer.h +++ b/Minecraft.Client/ItemInHandRenderer.h @@ -3,19 +3,25 @@ class Minecraft; class ItemInstance; class Minimap; -class Mob; +class LivingEntity; class TileRenderer; class Tesselator; class ItemInHandRenderer { +public: + // 4J - made these public + static ResourceLocation ENCHANT_GLINT_LOCATION; + static ResourceLocation MAP_BACKGROUND_LOCATION; + static ResourceLocation UNDERWATER_LOCATION; + private: - Minecraft *mc; + Minecraft *minecraft; shared_ptr selectedItem; float height; float oHeight; TileRenderer *tileRenderer; - static int list, listGlint; + static int listItem, listGlint, listTerrain; public: // 4J Stu - Made public so we can use it from ItemFramRenderer @@ -23,8 +29,8 @@ public: public: ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap = true); // 4J Added optimisedMinimap param - void renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor = true); // 4J added setColor parameter - static void renderItem3D(Tesselator *t, float u0, float v0, float u1, float v1, int width, int height, float depth, bool isGlint); // 4J added isGlint parameter + void renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor = true); // 4J added setColor parameter + static void renderItem3D(Tesselator *t, float u0, float v0, float u1, float v1, int width, int height, float depth, bool isGlint, bool isTerrain); // 4J added isGlint and isTerrain parameter public: void render(float a); void renderScreenEffect(float a); diff --git a/Minecraft.Client/ItemRenderer.cpp b/Minecraft.Client/ItemRenderer.cpp index 03d0d3a5..49e25060 100644 --- a/Minecraft.Client/ItemRenderer.cpp +++ b/Minecraft.Client/ItemRenderer.cpp @@ -10,6 +10,11 @@ #include "..\Minecraft.World\StringHelpers.h" #include "..\Minecraft.World\net.minecraft.world.h" #include "Options.h" +#include "TextureAtlas.h" + +#ifdef _XBOX +extern IDirect3DDevice9 *g_pD3DDevice; +#endif ItemRenderer::ItemRenderer() : EntityRenderer() { @@ -17,8 +22,8 @@ ItemRenderer::ItemRenderer() : EntityRenderer() setColor = true; blitOffset = 0; - this->shadowRadius = 0.15f; - this->shadowStrength = 0.75f; + shadowRadius = 0.15f; + shadowStrength = 0.75f; // 4J added m_bItemFrame= false; @@ -29,13 +34,38 @@ ItemRenderer::~ItemRenderer() delete random; } +ResourceLocation *ItemRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr itemEntity = dynamic_pointer_cast(entity); + return getTextureLocation(itemEntity->getItem()->getIconType()); +} + +ResourceLocation *ItemRenderer::getTextureLocation(int iconType) +{ + if (iconType == Icon::TYPE_TERRAIN) + { + return &TextureAtlas::LOCATION_BLOCKS;//L"/terrain.png")); + } + else + { +#ifdef _XBOX + // 4J - make sure we've got linear sampling on minification here as non-mipmapped things like this currently + // default to having point sampling, which makes very small icons render rather badly + g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); +#endif + return &TextureAtlas::LOCATION_ITEMS;//L"/gui/items.png")); + } +} + void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr itemEntity = dynamic_pointer_cast(_itemEntity); + bindTexture(itemEntity); random->setSeed(187); shared_ptr item = itemEntity->getItem(); + if (item->getItem() == NULL) return; glPushMatrix(); float bob = Mth::sin((itemEntity->age + a) / 10.0f + itemEntity->bobOffs) * 0.1f + 0.1f; @@ -45,11 +75,13 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do if (itemEntity->getItem()->count > 1) count = 2; if (itemEntity->getItem()->count > 5) count = 3; if (itemEntity->getItem()->count > 20) count = 4; + if (itemEntity->getItem()->count > 40) count = 5; glTranslatef((float) x, (float) y + bob, (float) z); glEnable(GL_RESCALE_NORMAL); Tile *tile = Tile::tiles[item->id]; + if (item->getIconType() == Icon::TYPE_TERRAIN && tile != NULL && TileRenderer::canRender(tile->getRenderShape())) { glRotatef(spin, 0, 1, 0); @@ -61,7 +93,6 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do glRotatef(-90, 0, 1, 0); } - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" float s = 1 / 4.0f; int shape = tile->getRenderShape(); if (shape == Tile::SHAPE_CROSS_TEXTURE || shape == Tile::SHAPE_STEM || shape == Tile::SHAPE_LEVER || shape == Tile::SHAPE_TORCH ) @@ -86,7 +117,7 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do glPopMatrix(); } } - else if (item->getItem()->hasMultipleSpriteLayers()) + else if (item->getIconType() == Icon::TYPE_ITEM && item->getItem()->hasMultipleSpriteLayers()) { if (m_bItemFrame) { @@ -99,7 +130,7 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); } - bindTexture(TN_GUI_ITEMS); // 4J was "/gui/items.png" + bindTexture(&TextureAtlas::LOCATION_ITEMS); // 4J was "/gui/items.png" for (int layer = 0; layer <= 1; layer++) { @@ -137,16 +168,9 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do // 4J Stu - For rendering the static compass, we give it a non-zero aux value if(item->id == Item::compass_Id) item->setAuxValue(255); - Icon *icon = item->getIcon(); if(item->id == Item::compass_Id) item->setAuxValue(0); - if (item->getIconType() == Icon::TYPE_TERRAIN) - { - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - } - else - { - bindTexture(TN_GUI_ITEMS); // 4J was L"/gui/items.png" - } + + Icon *icon = item->getIcon(); if (setColor) { int col = Item::items[item->id]->getColor(item,0); @@ -238,24 +262,28 @@ void ItemRenderer::renderItemBillboard(shared_ptr entity, Icon *icon for (int i = 0; i < count; i++) { glTranslatef(0, 0, width + margin); + + bool bIsTerrain = false; if (item->getIconType() == Icon::TYPE_TERRAIN && Tile::tiles[item->id] != NULL) { - bindTexture(TN_TERRAIN); // Was L"/terrain.png"); - } + bIsTerrain = true; + bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: Do this sanely by Icon + } else - { - bindTexture(TN_GUI_ITEMS); //L"/gui/items.png"); - } + { + bindTexture(&TextureAtlas::LOCATION_ITEMS); // TODO: Do this sanely by Icon + } + glColor4f(red, green, blue, 1); // 4J Stu - u coords were swapped in Java //ItemInHandRenderer::renderItem3D(t, u1, v0, u0, v1, icon->getSourceWidth(), icon->getSourceHeight(), width, false); - ItemInHandRenderer::renderItem3D(t, u0, v0, u1, v1, icon->getSourceWidth(), icon->getSourceHeight(), width, false); + ItemInHandRenderer::renderItem3D(t, u0, v0, u1, v1, icon->getSourceWidth(), icon->getSourceHeight(), width, false, bIsTerrain); if (item != NULL && item->isFoil()) { glDepthFunc(GL_EQUAL); glDisable(GL_LIGHTING); - entityRenderDispatcher->textures->bindTexture(TN__BLUR__MISC_GLINT); // was L"%blur%/misc/glint.png"); + entityRenderDispatcher->textures->bindTexture(&ItemInHandRenderer::ENCHANT_GLINT_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); float br = 0.76f; @@ -268,14 +296,14 @@ void ItemRenderer::renderItemBillboard(shared_ptr entity, Icon *icon glTranslatef(sx, 0, 0); glRotatef(-50, 0, 0, 1); - ItemInHandRenderer::renderItem3D(t, 0, 0, 1, 1, 255, 255, width, true); + ItemInHandRenderer::renderItem3D(t, 0, 0, 1, 1, 255, 255, width, true, bIsTerrain); glPopMatrix(); glPushMatrix(); glScalef(ss, ss, ss); sx = Minecraft::currentTimeMillis() % (3000 + 1873) / (3000 + 1873.0f) * 8; glTranslatef(-sx, 0, 0); glRotatef(10, 0, 0, 1); - ItemInHandRenderer::renderItem3D(t, 0, 0, 1, 1, 255, 255, width, true); + ItemInHandRenderer::renderItem3D(t, 0, 0, 1, 1, 255, 255, width, true, bIsTerrain); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glDisable(GL_BLEND); @@ -320,10 +348,6 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScaleX,float fScaleY, float fAlpha, bool useCompiled) { @@ -335,7 +359,7 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptrbindTexture(TN_TERRAIN);//L"/terrain.png")); + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); MemSect(0); Tile *tile = Tile::tiles[itemId]; @@ -371,7 +395,9 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptrbindTexture(TN_GUI_ITEMS); // "/gui/items.png" + + ResourceLocation *location = getTextureLocation(item->getIconType()); + textures->bindTexture(location); for (int layer = 0; layer <= 1; layer++) { @@ -403,11 +429,11 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptrgetIconType() == Icon::TYPE_TERRAIN) { - textures->bindTexture(TN_TERRAIN);//L"/terrain.png")); + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS);//L"/terrain.png")); } else { - textures->bindTexture(TN_GUI_ITEMS);//L"/gui/items.png")); + textures->bindTexture(&TextureAtlas::LOCATION_ITEMS);//L"/gui/items.png")); #ifdef _XBOX // 4J - make sure we've got linear sampling on minification here as non-mipmapped things like this currently // default to having point sampling, which makes very small icons render rather badly @@ -475,7 +501,7 @@ void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const s glDepthFunc(GL_GREATER); glDisable(GL_LIGHTING); glDepthMask(false); - textures->bindTexture(TN__BLUR__MISC_GLINT); // 4J was "%blur%/misc/glint.png" + textures->bindTexture(&ItemInHandRenderer::ENCHANT_GLINT_LOCATION); // 4J was "%blur%/misc/glint.png" blitOffset -= 50; if( !isConstantBlended ) glEnable(GL_BLEND); @@ -572,9 +598,6 @@ void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, shar return; } - glEnable(GL_BLEND); - RenderManager.StateSetBlendFactor(0xffffff |(((unsigned int)(fAlpha * 0xff))<<24)); - glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); if (item->count > 1 || !countText.empty() || item->GetForceNumberDisplay()) { MemSect(31); @@ -594,7 +617,7 @@ void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, shar MemSect(0); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); - font->drawShadow(amount, x + 19 - 2 - font->width(amount), y + 6 + 3, 0xffffff); + font->drawShadow(amount, x + 19 - 2 - font->width(amount), y + 6 + 3, 0xffffff |(((unsigned int)(fAlpha * 0xff))<<24)); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); } diff --git a/Minecraft.Client/ItemRenderer.h b/Minecraft.Client/ItemRenderer.h index 9690f77c..687b2491 100644 --- a/Minecraft.Client/ItemRenderer.h +++ b/Minecraft.Client/ItemRenderer.h @@ -19,6 +19,8 @@ public: ItemRenderer(); virtual ~ItemRenderer(); virtual void render(shared_ptr _itemEntity, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr entity); + virtual ResourceLocation *getTextureLocation(int iconType); private: virtual void renderItemBillboard(shared_ptr entity, Icon *icon, int count, float a, float red, float green, float blue); diff --git a/Minecraft.Client/ItemSpriteRenderer.cpp b/Minecraft.Client/ItemSpriteRenderer.cpp index 5a1ea620..5f1c7089 100644 --- a/Minecraft.Client/ItemSpriteRenderer.cpp +++ b/Minecraft.Client/ItemSpriteRenderer.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "ItemSpriteRenderer.h" #include "EntityRenderDispatcher.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" #include "..\Minecraft.World\net.minecraft.world.item.alchemy.h" #include "..\Minecraft.World\net.minecraft.world.item.h" @@ -31,7 +32,7 @@ void ItemSpriteRenderer::render(shared_ptr e, double x, double y, double glTranslatef((float) x, (float) y, (float) z); glEnable(GL_RESCALE_NORMAL); glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); - bindTexture(TN_GUI_ITEMS); // 4J - was L"/gui/items.png" + bindTexture(e); Tesselator *t = Tesselator::getInstance(); if (icon == PotionItem::getTexture(PotionItem::THROWABLE_ICON) ) @@ -76,4 +77,9 @@ void ItemSpriteRenderer::renderIcon(Tesselator *t, Icon *icon) t->vertexUV((float)(r - xo), (float)( r - yo), (float)( 0), (float)( u1), (float)( v0)); t->vertexUV((float)(0 - xo), (float)( r - yo), (float)( 0), (float)( u0), (float)( v0)); t->end(); +} + +ResourceLocation *ItemSpriteRenderer::getTextureLocation(shared_ptr mob) +{ + return &TextureAtlas::LOCATION_ITEMS; } \ No newline at end of file diff --git a/Minecraft.Client/ItemSpriteRenderer.h b/Minecraft.Client/ItemSpriteRenderer.h index e60feece..79499e94 100644 --- a/Minecraft.Client/ItemSpriteRenderer.h +++ b/Minecraft.Client/ItemSpriteRenderer.h @@ -12,6 +12,7 @@ public: ItemSpriteRenderer(Item *sourceItem, int sourceItemAuxValue = 0); //ItemSpriteRenderer(Item *icon); virtual void render(shared_ptr e, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); private: void renderIcon(Tesselator *t, Icon *icon); diff --git a/Minecraft.Client/LavaSlimeModel.cpp b/Minecraft.Client/LavaSlimeModel.cpp index 427b9547..052850f8 100644 --- a/Minecraft.Client/LavaSlimeModel.cpp +++ b/Minecraft.Client/LavaSlimeModel.cpp @@ -41,7 +41,7 @@ int LavaSlimeModel::getModelVersion() return 5; } -void LavaSlimeModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +void LavaSlimeModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { shared_ptr lavaSlime = dynamic_pointer_cast(mob); @@ -59,7 +59,7 @@ void LavaSlimeModel::prepareMobModel(shared_ptr mob, float time, float r, f void LavaSlimeModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); insideCube->render(scale, usecompiled); for (int i = 0; i < BODYCUBESLENGTH; i++) diff --git a/Minecraft.Client/LavaSlimeModel.h b/Minecraft.Client/LavaSlimeModel.h index 44bd1663..29e5e951 100644 --- a/Minecraft.Client/LavaSlimeModel.h +++ b/Minecraft.Client/LavaSlimeModel.h @@ -10,6 +10,6 @@ class LavaSlimeModel : public Model public: LavaSlimeModel(); int getModelVersion(); - virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; diff --git a/Minecraft.Client/LavaSlimeRenderer.cpp b/Minecraft.Client/LavaSlimeRenderer.cpp index 3d2cbf47..e828a353 100644 --- a/Minecraft.Client/LavaSlimeRenderer.cpp +++ b/Minecraft.Client/LavaSlimeRenderer.cpp @@ -3,27 +3,19 @@ #include "LavaSlimeModel.h" #include "LavaSlimeRenderer.h" +ResourceLocation LavaSlimeRenderer::MAGMACUBE_LOCATION = ResourceLocation(TN_MOB_LAVA); + LavaSlimeRenderer::LavaSlimeRenderer() : MobRenderer(new LavaSlimeModel(), .25f) { this->modelVersion = ((LavaSlimeModel *) model)->getModelVersion(); } -void LavaSlimeRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) -{ - // 4J - original version used generics and thus had an input parameter of type LavaSlime rather than shared_ptr we have here - - // do some casting around instead - shared_ptr mob = dynamic_pointer_cast(_mob); - int modelVersion = ((LavaSlimeModel *) model)->getModelVersion(); - if (modelVersion != this->modelVersion) - { - this->modelVersion = modelVersion; - model = new LavaSlimeModel(); - app.DebugPrintf("new lava slime model\n"); - } - MobRenderer::render(mob, x, y, z, rot, a); +ResourceLocation *LavaSlimeRenderer::getTextureLocation(shared_ptr mob) +{ + return &MAGMACUBE_LOCATION; } -void LavaSlimeRenderer::scale(shared_ptr _slime, float a) +void LavaSlimeRenderer::scale(shared_ptr _slime, float a) { // 4J - original version used generics and thus had an input parameter of type LavaSlime rather than shared_ptr we have here - // do some casting around instead diff --git a/Minecraft.Client/LavaSlimeRenderer.h b/Minecraft.Client/LavaSlimeRenderer.h index b0c44d1e..1743c574 100644 --- a/Minecraft.Client/LavaSlimeRenderer.h +++ b/Minecraft.Client/LavaSlimeRenderer.h @@ -1,17 +1,16 @@ #pragma once - #include "MobRenderer.h" class LavaSlimeRenderer : public MobRenderer { private: int modelVersion; + static ResourceLocation MAGMACUBE_LOCATION; public: LavaSlimeRenderer(); - - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: - virtual void scale(shared_ptr _slime, float a); + virtual void scale(shared_ptr _slime, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/LeashKnotModel.cpp b/Minecraft.Client/LeashKnotModel.cpp new file mode 100644 index 00000000..3d909600 --- /dev/null +++ b/Minecraft.Client/LeashKnotModel.cpp @@ -0,0 +1,37 @@ +#include "stdafx.h"; +#include "LeashKnotModel.h" +#include "ModelPart.h" + +LeashKnotModel::LeashKnotModel() +{ + _init(0, 0, 32, 32); +} + +LeashKnotModel::LeashKnotModel(int u, int v, int tw, int th) +{ + _init(u, v, tw, th); +} + +void LeashKnotModel::_init(int u, int v, int tw, int th) +{ + texWidth = tw; + texHeight = th; + knot = new ModelPart(this, u, v); + knot->addBox(-3, -6, -3, 6, 8, 6, 0); + knot->setPos(0, 0, 0); +} + +void LeashKnotModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + setupAnim(time, r, bob, yRot, xRot, scale, entity); + + knot->render(scale, usecompiled); +} + +void LeashKnotModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) +{ + Model::setupAnim(time, r, bob, yRot, xRot, scale, entity); + + knot->yRot = yRot / (180 / PI); + knot->xRot = xRot / (180 / PI); +} \ No newline at end of file diff --git a/Minecraft.Client/LeashKnotModel.h b/Minecraft.Client/LeashKnotModel.h new file mode 100644 index 00000000..45ec1647 --- /dev/null +++ b/Minecraft.Client/LeashKnotModel.h @@ -0,0 +1,15 @@ +#pragma once +#include "Model.h" + +class LeashKnotModel : public Model +{ +public: + ModelPart *knot; + + LeashKnotModel(); + LeashKnotModel(int u, int v, int tw, int th); + void _init(int u, int v, int tw, int th); + + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); +}; \ No newline at end of file diff --git a/Minecraft.Client/LeashKnotRenderer.cpp b/Minecraft.Client/LeashKnotRenderer.cpp new file mode 100644 index 00000000..b210379f --- /dev/null +++ b/Minecraft.Client/LeashKnotRenderer.cpp @@ -0,0 +1,39 @@ +#include "stdafx.h" +#include "LeashKnotRenderer.h" +#include "LeashKnotModel.h" + +ResourceLocation LeashKnotRenderer::KNOT_LOCATION = ResourceLocation(TN_ITEM_LEASHKNOT); + +LeashKnotRenderer::LeashKnotRenderer() : EntityRenderer() +{ + model = new LeashKnotModel(); +} + +LeashKnotRenderer::~LeashKnotRenderer() +{ + delete model; +} + +void LeashKnotRenderer::render(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + glPushMatrix(); + glDisable(GL_CULL_FACE); + + glTranslatef((float) x, (float) y, (float) z); + + float scale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + glEnable(GL_ALPHA_TEST); + + bindTexture(entity); + model->render(entity, 0, 0, 0, 0, 0, scale, true); + + glPopMatrix(); +} + +ResourceLocation *LeashKnotRenderer::getTextureLocation(shared_ptr entity) +{ + return &KNOT_LOCATION; +} \ No newline at end of file diff --git a/Minecraft.Client/LeashKnotRenderer.h b/Minecraft.Client/LeashKnotRenderer.h new file mode 100644 index 00000000..6eeca574 --- /dev/null +++ b/Minecraft.Client/LeashKnotRenderer.h @@ -0,0 +1,19 @@ +#pragma once +#include "EntityRenderer.h" + +class LeashKnotModel; + +class LeashKnotRenderer : public EntityRenderer +{ +private: + static ResourceLocation KNOT_LOCATION; + LeashKnotModel *model; + +public: + LeashKnotRenderer(); + ~LeashKnotRenderer(); + virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + +protected: + virtual ResourceLocation *getTextureLocation(shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/LevelRenderer.cpp b/Minecraft.Client/LevelRenderer.cpp index 98360078..8216f1fe 100644 --- a/Minecraft.Client/LevelRenderer.cpp +++ b/Minecraft.Client/LevelRenderer.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "LevelRenderer.h" #include "Textures.h" +#include "TextureAtlas.h" #include "Tesselator.h" #include "Chunk.h" #include "EntityRenderDispatcher.h" @@ -36,6 +37,7 @@ #include "DripParticle.h" #include "EchantmentTableParticle.h" #include "DragonBreathParticle.h" +#include "FireworksParticles.h" #include "Lighting.h" #include "Options.h" #include "MultiPlayerChunkCache.h" @@ -60,6 +62,8 @@ #include "FrustumCuller.h" #include "..\Minecraft.World\BasicTypeContainers.h" +//#define DISABLE_SPU_CODE + #ifdef __PS3__ #include "PS3\SPU_Tasks\LevelRenderer_cull\LevelRenderer_cull.h" #include "PS3\SPU_Tasks\LevelRenderer_FindNearestChunk\LevelRenderer_FindNearestChunk.h" @@ -69,6 +73,12 @@ static LevelRenderer_cull_DataIn g_cullDataIn[4] __attribute__((__aligned__(16)) static LevelRenderer_FindNearestChunk_DataIn g_findNearestChunkDataIn __attribute__((__aligned__(16))); #endif +ResourceLocation LevelRenderer::MOON_LOCATION = ResourceLocation(TN_TERRAIN_MOON); +ResourceLocation LevelRenderer::MOON_PHASES_LOCATION = ResourceLocation(TN_TERRAIN_MOON_PHASES); +ResourceLocation LevelRenderer::SUN_LOCATION = ResourceLocation(TN_TERRAIN_SUN); +ResourceLocation LevelRenderer::CLOUDS_LOCATION = ResourceLocation(TN_ENVIRONMENT_CLOUDS); +ResourceLocation LevelRenderer::END_SKY_LOCATION = ResourceLocation(TN_MISC_TUNNEL); + const unsigned int HALO_RING_RADIUS = 100; #ifdef _LARGE_WORLDS @@ -173,8 +183,8 @@ LevelRenderer::LevelRenderer(Minecraft *mc, Textures *textures) glDepthMask(false); // 4J - added to get depth mask disabled within the command buffer float yy; int s = 64; - int d = (256 / s) + 2; - yy = (float) (16); + int d = 256 / s + 2; + yy = (float) 16; for (int xx = -s * d; xx <= s * d; xx += s) { for (int zz = -s * d; zz <= s * d; zz += s) @@ -191,7 +201,7 @@ LevelRenderer::LevelRenderer(Minecraft *mc, Textures *textures) darkList = starList + 2; glNewList(darkList, GL_COMPILE); - yy = -(float) (16); + yy = -(float) 16; t->begin(); for (int xx = -s * d; xx <= s * d; xx += s) { @@ -288,7 +298,7 @@ void LevelRenderer::renderStars() { double ___xo = 0; double ___yo = ((c & 2) - 1) * ss; - double ___zo = (((c + 1) & 2) - 1) * ss; + double ___zo = ((c + 1 & 2) - 1) * ss; double __xo = ___xo; double __yo = ___yo * zCos - ___zo * zSin; @@ -497,7 +507,7 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) // 4J Stu - Set these up every time, even when not rendering as other things (like particle render) may depend on it for those frames. TileEntityRenderDispatcher::instance->prepare(level[playerIndex], textures, mc->font, mc->cameraTargetPlayer, a); - EntityRenderDispatcher::instance->prepare(level[playerIndex], textures, mc->font, mc->cameraTargetPlayer, mc->options, a); + EntityRenderDispatcher::instance->prepare(level[playerIndex], textures, mc->font, mc->cameraTargetPlayer, mc->crosshairPickMob, mc->options, a); if (noEntityRenderFrames > 0) { @@ -536,11 +546,24 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) { shared_ptr entity = *it; //entities[i]; - if ((entity->shouldRender(cam) && (entity->noCulling || culler->isVisible(entity->bb)))) + bool shouldRender = (entity->shouldRender(cam) && (entity->noCulling || culler->isVisible(entity->bb))); + + // Render the mob if the mob's leash holder is within the culler + if ( !shouldRender && entity->instanceof(eTYPE_MOB) ) + { + shared_ptr mob = dynamic_pointer_cast(entity); + if ( mob->isLeashed() && (mob->getLeashHolder() != NULL) ) + { + shared_ptr leashHolder = mob->getLeashHolder(); + shouldRender = culler->isVisible(leashHolder->bb); + } + } + + if (shouldRender) { // 4J-PB - changing this to be per player //if (entity == mc->cameraTargetPlayer && !mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) continue; - shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + shared_ptr localplayer = mc->cameraTargetPlayer->instanceof(eTYPE_LOCALPLAYER) ? dynamic_pointer_cast(mc->cameraTargetPlayer) : nullptr; if (localplayer && entity == mc->cameraTargetPlayer && !localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) continue; @@ -669,7 +692,7 @@ void LevelRenderer::resortChunks(int xc, int yc, int zc) LeaveCriticalSection(&m_csDirtyChunks); } -int LevelRenderer::render(shared_ptr player, int layer, double alpha, bool updateChunks) +int LevelRenderer::render(shared_ptr player, int layer, double alpha, bool updateChunks) { int playerIndex = mc->player->GetXboxPad(); @@ -741,7 +764,7 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha) #if 1 // 4J - cut down version, we're not using offsetted render lists, or a sorted chunk list, anymore mc->gameRenderer->turnOnLightLayer(alpha); // 4J - brought forward from 1.8.2 - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; double xOff = player->xOld + (player->x - player->xOld) * alpha; double yOff = player->yOld + (player->y - player->yOld) * alpha; double zOff = player->zOld + (player->z - player->zOld) * alpha; @@ -941,7 +964,7 @@ void LevelRenderer::renderSky(float alpha) glDepthMask(false); - textures->bind(textures->loadTexture(TN_MISC_TUNNEL)); // 4J was L"/1_2_2/misc/tunnel.png" + textures->bindTexture(&END_SKY_LOCATION); // 4J was L"/1_2_2/misc/tunnel.png" Tesselator *t = Tesselator::getInstance(); t->setMipmapEnable(false); for (int i = 0; i < 6; i++) @@ -1071,7 +1094,7 @@ void LevelRenderer::renderSky(float alpha) float ss = 30; MemSect(31); - textures->bindTexture(TN_TERRAIN_SUN); // 4J was L"/terrain/sun.png" + textures->bindTexture(&SUN_LOCATION); MemSect(0); t->begin(); t->vertexUV((float)(-ss), (float)( 100), (float)( -ss), (float)( 0), (float)( 0)); @@ -1081,8 +1104,8 @@ void LevelRenderer::renderSky(float alpha) t->end(); ss = 20; - textures->bindTexture(TN_TERRAIN_MOON_PHASES); // 4J was L"/1_2_2/terrain/moon_phases.png" - int phase = level[playerIndex]->getMoonPhase(alpha); + textures->bindTexture(&MOON_PHASES_LOCATION); // 4J was L"/1_2_2/terrain/moon_phases.png" + int phase = level[playerIndex]->getMoonPhase(); int u = phase % 4; int v = phase / 4 % 2; float u0 = (u + 0) / 4.0f; @@ -1264,7 +1287,7 @@ void LevelRenderer::renderClouds(float alpha) int d = 256 / s; Tesselator *t = Tesselator::getInstance(); - textures->bindTexture(TN_ENVIRONMENT_CLOUDS); // 4J was L"/environment/clouds.png" + textures->bindTexture(&CLOUDS_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1556,7 +1579,7 @@ void LevelRenderer::renderAdvancedClouds(float alpha) } MemSect(31); - textures->bindTexture(TN_ENVIRONMENT_CLOUDS); // 4J was L"/environment/clouds.png" + textures->bindTexture(&CLOUDS_LOCATION); // 4J was L"/environment/clouds.png" MemSect(0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1809,7 +1832,7 @@ bool LevelRenderer::updateDirtyChunks() static int throttle = 0; if( ( throttle % 100 ) == 0 ) { - app.DebugPrintf("CBuffSize: %d\n",memAlloc/(1024*1024)); + app.DebugPrintf("CBuffSize: %d\n",memAlloc/(1024*1024)); } throttle++; */ @@ -1919,7 +1942,7 @@ bool LevelRenderer::updateDirtyChunks() int py = (int)player->y; int pz = (int)player->z; -// app.DebugPrintf("!! %d %d %d, %d %d %d {%d,%d} ",px,py,pz,stackChunkDirty,nonStackChunkDirty,onlyRebuild, xChunks, zChunks); + // app.DebugPrintf("!! %d %d %d, %d %d %d {%d,%d} ",px,py,pz,stackChunkDirty,nonStackChunkDirty,onlyRebuild, xChunks, zChunks); int considered = 0; int wouldBeNearButEmpty = 0; @@ -2008,13 +2031,13 @@ bool LevelRenderer::updateDirtyChunks() } } } -// app.DebugPrintf("[%d,%d,%d]\n",nearestClipChunks.empty(),considered,wouldBeNearButEmpty); + // app.DebugPrintf("[%d,%d,%d]\n",nearestClipChunks.empty(),considered,wouldBeNearButEmpty); } #endif // __PS3__ PIXEndNamedEvent(); } - + Chunk *chunk = NULL; #ifdef _LARGE_WORLDS @@ -2160,7 +2183,6 @@ bool LevelRenderer::updateDirtyChunks() return false; } - void LevelRenderer::renderHit(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a) { Tesselator *t = Tesselator::getInstance(); @@ -2174,7 +2196,7 @@ void LevelRenderer::renderHit(shared_ptr player, HitResult *h, int mode, float br = (Mth::sin(Minecraft::currentTimeMillis() / 100.0f) * 0.2f + 0.8f); glColor4f(br, br, br, (Mth::sin(Minecraft::currentTimeMillis() / 200.0f) * 0.2f + 0.5f)); - textures->bindTexture(TN_TERRAIN); //L"/terrain.png"); + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); } glDisable(GL_BLEND); glDisable(GL_ALPHA_TEST); @@ -2191,7 +2213,7 @@ void LevelRenderer::renderDestroyAnimation(Tesselator *t, shared_ptr pla { glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); - textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); glColor4f(1, 1, 1, 0.5f); glPushMatrix(); @@ -2224,7 +2246,7 @@ void LevelRenderer::renderDestroyAnimation(Tesselator *t, shared_ptr pla int iPad = mc->player->GetXboxPad(); // 4J added int tileId = level[iPad]->getTile(block->getX(), block->getY(), block->getZ()); Tile *tile = tileId > 0 ? Tile::tiles[tileId] : NULL; - if (tile == NULL) tile = Tile::rock; + if (tile == NULL) tile = Tile::stone; tileRenderer[iPad]->tesselateInWorldFixedTexture(tile, block->getX(), block->getY(), block->getZ(), breakingTextures[block->getProgress()]); // 4J renamed to differentiate from tesselateInWorld } ++it; @@ -2246,7 +2268,7 @@ void LevelRenderer::renderDestroyAnimation(Tesselator *t, shared_ptr pla } } -void LevelRenderer::renderHitOutline(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a) +void LevelRenderer::renderHitOutline(shared_ptr player, HitResult *h, int mode, float a) { if (mode == 0 && h->type == HitResult::TILE) @@ -2590,6 +2612,10 @@ void LevelRenderer::playSound(shared_ptr entity,int iSound, double x, do { } +void LevelRenderer::playSoundExceptPlayer(shared_ptr player, int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist) +{ +} + // 4J-PB - original function. I've changed to an enum instead of string compares // 4J removed - /* @@ -2716,6 +2742,10 @@ shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticle case eParticleType_largeexplode: particle = shared_ptr(new HugeExplosionParticle(textures, lev, x, y, z, xa, ya, za)); break; + case eParticleType_fireworksspark: + particle = shared_ptr(new FireworksParticles::FireworksSparkParticle(lev, x, y, z, xa, ya, za, mc->particleEngine)); + particle->setAlpha(0.99f); + break; case eParticleType_bubble: particle = shared_ptr( new BubbleParticle(lev, x, y, z, xa, ya, za) ); @@ -2783,9 +2813,22 @@ shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticle particle = shared_ptr(new SpellParticle(lev, x, y, z, 0, 0, 0)); particle->setColor((float) xa, (float) ya, (float) za); break; + case eParticleType_mobSpellAmbient: + particle = shared_ptr(new SpellParticle(lev, x, y, z, 0, 0, 0)); + particle->setAlpha(0.15f); + particle->setColor((float) xa, (float) ya, (float) za); + break; case eParticleType_spell: particle = shared_ptr( new SpellParticle(lev, x, y, z, xa, ya, za) ); break; + case eParticleType_witchMagic: + { + particle = shared_ptr(new SpellParticle(lev, x, y, z, xa, ya, za)); + dynamic_pointer_cast(particle)->setBaseTex(9 * 16); + float randBrightness = lev->random->nextFloat() * 0.5f + 0.35f; + particle->setColor(1 * randBrightness, 0 * randBrightness, 1 * randBrightness); + } + break; case eParticleType_instantSpell: particle = shared_ptr(new SpellParticle(lev, x, y, z, xa, ya, za)); dynamic_pointer_cast(particle)->setBaseTex(9 * 16); @@ -2877,41 +2920,36 @@ shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticle void LevelRenderer::entityAdded(shared_ptr entity) { - entity->prepareCustomTextures(); - // 4J - these empty string comparisons used to check for NULL references, but we don't have string pointers (currently) in entities, - // hopefully this should be equivalent - /* 4J - removed temp */ - //if (entity->customTextureUrl != L"") textures->addHttpTexture(entity->customTextureUrl, new MobSkinTextureProcessor()); - //if (entity->customTextureUrl2 != L"") textures->addHttpTexture(entity->customTextureUrl2, new MobSkinTextureProcessor()); - - // 4J-PB - adding these from global title storage - if (entity->customTextureUrl != L"") - { - textures->addMemTexture(entity->customTextureUrl, new MobSkinMemTextureProcessor()); - } - if (entity->customTextureUrl2 != L"") + if(entity->instanceof(eTYPE_PLAYER)) { - textures->addMemTexture(entity->customTextureUrl2, new MobSkinMemTextureProcessor()); - } - - // if (entity->customTextureUrl2 != L"") textures->addHttpTexture(entity->customTextureUrl2, new MobSkinTextureProcessor()); - + shared_ptr player = dynamic_pointer_cast(entity); + player->prepareCustomTextures(); + // 4J-PB - adding these from global title storage + if (player->customTextureUrl != L"") + { + textures->addMemTexture(player->customTextureUrl, new MobSkinMemTextureProcessor()); + } + if (player->customTextureUrl2 != L"") + { + textures->addMemTexture(player->customTextureUrl2, new MobSkinMemTextureProcessor()); + } + } } void LevelRenderer::entityRemoved(shared_ptr entity) { - /* 4J - removed temp - if (entity->customTextureUrl != L"") textures->removeHttpTexture(entity->customTextureUrl); - if (entity->customTextureUrl2 != L"") textures->removeHttpTexture(entity->customTextureUrl2); - */ - if (entity->customTextureUrl != L"") + if(entity->instanceof(eTYPE_PLAYER)) { - textures->removeMemTexture(entity->customTextureUrl); - } - if (entity->customTextureUrl2 != L"") - { - textures->removeMemTexture(entity->customTextureUrl2); + shared_ptr player = dynamic_pointer_cast(entity); + if (player->customTextureUrl != L"") + { + textures->removeMemTexture(player->customTextureUrl); + } + if (player->customTextureUrl2 != L"") + { + textures->removeMemTexture(player->customTextureUrl2); + } } } @@ -2936,6 +2974,49 @@ void LevelRenderer::clear() MemoryTracker::releaseLists(chunkLists); } +void LevelRenderer::globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data) +{ + Level *lev; + int playerIndex = mc->player->GetXboxPad(); // 4J added + lev = level[playerIndex]; + + Random *random = lev->random; + + switch (type) + { + case LevelEvent::SOUND_WITHER_BOSS_SPAWN: + case LevelEvent::SOUND_DRAGON_DEATH: + if (mc->cameraTargetPlayer != NULL) + { + // play the sound at an offset from the player + double dx = sourceX - mc->cameraTargetPlayer->x; + double dy = sourceY - mc->cameraTargetPlayer->y; + double dz = sourceZ - mc->cameraTargetPlayer->z; + + double len = sqrt(dx * dx + dy * dy + dz * dz); + double sx = mc->cameraTargetPlayer->x; + double sy = mc->cameraTargetPlayer->y; + double sz = mc->cameraTargetPlayer->z; + + if (len > 0) + { + sx += dx / len * 2; + sy += dy / len * 2; + sz += dz / len * 2; + } + if (type == LevelEvent::SOUND_WITHER_BOSS_SPAWN) + { + lev->playLocalSound(sx, sy, sz, eSoundType_MOB_WITHER_SPAWN, 1.0f, 1.0f, false); + } + else if (type == LevelEvent::SOUND_DRAGON_DEATH) + { + lev->playLocalSound(sx, sy, sz, eSoundType_MOB_ENDERDRAGON_END, 5.0f, 1.0f, false); + } + } + break; + } +} + void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y, int z, int data) { int playerIndex = mc->player->GetXboxPad(); // 4J added @@ -2968,13 +3049,13 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y break; case LevelEvent::SOUND_CLICK_FAIL: //level[playerIndex]->playSound(x, y, z, L"random.click", 1.0f, 1.2f); - level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_CLICK, 1.0f, 1.2f); + level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_CLICK, 1.0f, 1.2f, false); break; case LevelEvent::SOUND_CLICK: - level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_CLICK, 1.0f, 1.0f); + level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_CLICK, 1.0f, 1.0f, false); break; case LevelEvent::SOUND_LAUNCH: - level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_BOW, 1.0f, 1.2f); + level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_BOW, 1.0f, 1.2f, false); break; case LevelEvent::PARTICLES_SHOOT: { @@ -3021,7 +3102,7 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y double yp = y; double zp = z; - ePARTICLE_TYPE particle = PARTICLE_ICONCRACK(Item::potion->id,0); + ePARTICLE_TYPE particle = PARTICLE_ICONCRACK(Item::potion->id, data); for (int i = 0; i < 8; i++) { addParticle(particle, xp, yp, zp, random->nextGaussian() * 0.15, random->nextDouble() * 0.2, random->nextGaussian() * 0.15); @@ -3056,7 +3137,7 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y spellParticle->setPower((float) dist); } } - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_GLASS, 1, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_GLASS, 1, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); } break; case LevelEvent::ENDERDRAGON_FIREBALL_SPLASH: @@ -3111,25 +3192,28 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y } break; } + case LevelEvent::PARTICLES_PLANT_GROWTH: + DyePowderItem::addGrowthParticles(level[playerIndex], x, y, z, data); + break; case LevelEvent::SOUND_OPEN_DOOR: if (Math::random() < 0.5) { - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_DOOR_OPEN, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_DOOR_OPEN, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); } else { - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_DOOR_CLOSE, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_DOOR_CLOSE, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); } break; case LevelEvent::SOUND_FIZZ: - level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (random->nextFloat() - random->nextFloat()) * 0.8f); + level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (random->nextFloat() - random->nextFloat()) * 0.8f, false); break; case LevelEvent::SOUND_ANVIL_BROKEN: - level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_BREAK, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_BREAK, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); break; case LevelEvent::SOUND_ANVIL_USED: - level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_USE, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_USE, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); break; case LevelEvent::SOUND_ANVIL_LAND: - level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_LAND, 0.3f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_LAND, 0.3f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); break; case LevelEvent::SOUND_PLAY_RECORDING: { @@ -3151,10 +3235,10 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y break; // 4J - new level event sounds brought forward from 1.2.3 case LevelEvent::SOUND_GHAST_WARNING: - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_CHARGE, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f, 80.0f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_CHARGE, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f, false, 80.0f); break; case LevelEvent::SOUND_GHAST_FIREBALL: - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_FIREBALL, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f, 80.0f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_FIREBALL, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f, false, 80.0f); break; case LevelEvent::SOUND_ZOMBIE_WOODEN_DOOR: level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_ZOMBIE_WOOD, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); @@ -3165,6 +3249,12 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y case LevelEvent::SOUND_ZOMBIE_IRON_DOOR: level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_ZOMBIE_METAL, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); break; + case LevelEvent::SOUND_BLAZE_FIREBALL: + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_FIREBALL, 2, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f);//, false); + break; + case LevelEvent::SOUND_WITHER_BOSS_SHOOT: + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_WITHER_SHOOT, 2, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f);//, false); + break; case LevelEvent::SOUND_ZOMBIE_INFECTED: level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_ZOMBIE_INFECT, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f);//, false); break; @@ -3176,6 +3266,9 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y // 4J Added to show the paricles when the End egg teleports after being attacked EggTile::generateTeleportParticles(level[playerIndex],x,y,z,data); break; + case LevelEvent::SOUND_BAT_LIFTOFF: + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_BAT_TAKEOFF, .05f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + break; } } @@ -3641,4 +3734,41 @@ int LevelRenderer::rebuildChunkThreadProc(LPVOID lpParam) void LevelRenderer::nonStackDirtyChunksAdded() { dirtyChunksLockFreeStack.Push((int *)1); -} \ No newline at end of file +} + +// 4J - for test purposes, check all chunks that are currently present for the player. Currently this is implemented to do tests to identify missing client chunks in flat worlds, but +// this could be extended to do other kinds of automated testing. Returns the number of chunks that are present, so that from the calling function we can determine when chunks have +// finished loading/generating round the current location. +int LevelRenderer::checkAllPresentChunks(bool *faultFound) +{ + int playerIndex = mc->player->GetXboxPad(); // 4J added + + int presentCount = 0; + ClipChunk *pClipChunk = chunks[playerIndex].data; + for( int i = 0; i < chunks[playerIndex].length; i++, pClipChunk++ ) + { + if(pClipChunk->chunk->y == 0 ) + { + bool chunkPresent = level[0]->reallyHasChunk(pClipChunk->chunk->x>>4,pClipChunk->chunk->z>>4); + if( chunkPresent ) + { + presentCount++; + LevelChunk *levelChunk = level[0]->getChunk(pClipChunk->chunk->x>>4,pClipChunk->chunk->z>>4); + + for( int cx = 4; cx <= 12; cx++ ) + { + for( int cz = 4; cz <= 12; cz++ ) + { + int t0 = levelChunk->getTile(cx, 0, cz); + if( ( t0 != Tile::unbreakable_Id ) && (t0 != Tile::dirt_Id) ) + { + *faultFound = true; + } + } + } + } + } + } + return presentCount; +} + diff --git a/Minecraft.Client/LevelRenderer.h b/Minecraft.Client/LevelRenderer.h index c0a98bba..46a4c31f 100644 --- a/Minecraft.Client/LevelRenderer.h +++ b/Minecraft.Client/LevelRenderer.h @@ -4,6 +4,7 @@ #include "OffsettedRenderList.h" #include "..\Minecraft.World\JavaIntHash.h" #include "..\Minecraft.World\Level.h" +#include "ResourceLocation.h" #include #ifdef __PS3__ #include "C4JSpursJob.h" @@ -35,6 +36,14 @@ using namespace std; class LevelRenderer : public LevelListener { friend class Chunk; + +private: + static ResourceLocation MOON_LOCATION; + static ResourceLocation MOON_PHASES_LOCATION; + static ResourceLocation SUN_LOCATION; + static ResourceLocation CLOUDS_LOCATION; + static ResourceLocation END_SKY_LOCATION; + public: static const int CHUNK_XZSIZE = 16; #ifdef _LARGE_WORLDS @@ -71,7 +80,7 @@ public: private: void resortChunks(int xc, int yc, int zc); public: - int render(shared_ptr player, int layer, double alpha, bool updateChunks); + int render(shared_ptr player, int layer, double alpha, bool updateChunks); private: int renderChunks(int from, int to, int layer, double alpha); public: @@ -89,7 +98,7 @@ public: public: void renderHit(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a); void renderDestroyAnimation(Tesselator *t, shared_ptr player, float a); - void renderHitOutline(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a); + void renderHitOutline(shared_ptr player, HitResult *h, int mode, float a); void render(AABB *b); void setDirty(int x0, int y0, int z0, int x1, int y1, int z1, Level *level); // 4J - added level param void tileChanged(int x, int y, int z); @@ -107,6 +116,7 @@ public: void playStreamingMusic(const wstring& name, int x, int y, int z); void playSound(int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); void playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); + void playSoundExceptPlayer(shared_ptr player, int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); void addParticle(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za); // 4J added shared_ptr addParticleInternal(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za); // 4J added void entityAdded(shared_ptr entity); @@ -114,6 +124,7 @@ public: void playerRemoved(shared_ptr entity) {} // 4J added - for when a player is removed from the level's player array, not just the entity storage void skyColorChanged(); void clear(); + void globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data); void levelEvent(shared_ptr source, int type, int x, int y, int z, int data); void destroyTileProgress(int id, int x, int y, int z, int progress); void registerTextures(IconRegister *iconRegister); @@ -274,4 +285,6 @@ public: CRITICAL_SECTION m_csChunkFlags; #endif void nonStackDirtyChunksAdded(); + + int checkAllPresentChunks(bool *faultFound); // 4J - added for testing }; diff --git a/Minecraft.Client/LivingEntityRenderer.cpp b/Minecraft.Client/LivingEntityRenderer.cpp new file mode 100644 index 00000000..89d65614 --- /dev/null +++ b/Minecraft.Client/LivingEntityRenderer.cpp @@ -0,0 +1,656 @@ +#include "stdafx.h" +#include "LivingEntityRenderer.h" +#include "Lighting.h" +#include "Cube.h" +#include "ModelPart.h" +#include "EntityRenderDispatcher.h" +#include "MultiPlayerLocalPlayer.h" +#include "..\Minecraft.World\Arrow.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\Player.h" + + +ResourceLocation LivingEntityRenderer::ENCHANT_GLINT_LOCATION = ResourceLocation(TN__BLUR__MISC_GLINT); +int LivingEntityRenderer::MAX_ARMOR_LAYERS = 4; + +LivingEntityRenderer::LivingEntityRenderer(Model *model, float shadow) +{ + this->model = model; + shadowRadius = shadow; + armor = NULL; +} + +void LivingEntityRenderer::setArmor(Model *armor) +{ + this->armor = armor; +} + +float LivingEntityRenderer::rotlerp(float from, float to, float a) +{ + float diff = to - from; + while (diff < -180) + diff += 360; + while (diff >= 180) + diff -= 360; + return from + a * diff; +} + +void LivingEntityRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + shared_ptr mob = dynamic_pointer_cast(_mob); + + glPushMatrix(); + glDisable(GL_CULL_FACE); + + model->attackTime = getAttackAnim(mob, a); + if (armor != NULL) armor->attackTime = model->attackTime; + model->riding = mob->isRiding(); + if (armor != NULL) armor->riding = model->riding; + model->young = mob->isBaby(); + if (armor != NULL) armor->young = model->young; + + /*try*/ + { + float bodyRot = rotlerp(mob->yBodyRotO, mob->yBodyRot, a); + float headRot = rotlerp(mob->yHeadRotO, mob->yHeadRot, a); + + if (mob->isRiding() && mob->riding->instanceof(eTYPE_LIVINGENTITY)) + { + shared_ptr riding = dynamic_pointer_cast(mob->riding); + bodyRot = rotlerp(riding->yBodyRotO, riding->yBodyRot, a); + + float headDiff = Mth::wrapDegrees(headRot - bodyRot); + if (headDiff < -85) headDiff = -85; + if (headDiff >= 85) headDiff = +85; + bodyRot = headRot - headDiff; + if (headDiff * headDiff > 50 * 50) + { + bodyRot += headDiff * 0.2f; + } + } + + float headRotx = (mob->xRotO + (mob->xRot - mob->xRotO) * a); + + setupPosition(mob, x, y, z); + + float bob = getBob(mob, a); + setupRotations(mob, bob, bodyRot, a); + + float fScale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + scale(mob, a); + glTranslatef(0, -24 * fScale - 0.125f / 16.0f, 0); + + float ws = mob->walkAnimSpeedO + (mob->walkAnimSpeed - mob->walkAnimSpeedO) * a; + float wp = mob->walkAnimPos - mob->walkAnimSpeed * (1 - a); + if (mob->isBaby()) + { + wp *= 3.0f; + } + + if (ws > 1) ws = 1; + + glEnable(GL_ALPHA_TEST); + model->prepareMobModel(mob, wp, ws, a); + renderModel(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale); + + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + int armorType = prepareArmor(mob, i, a); + if (armorType > 0) + { + armor->prepareMobModel(mob, wp, ws, a); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, true); + if ((armorType & 0xf0) == 16) + { + prepareSecondPassArmor(mob, i, a); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, true); + } + // 4J - added condition here for rendering player as part of the gui. Avoiding rendering the glint here as it involves using its own blending, and for gui rendering + // we are globally blending to be able to offer user configurable gui opacity. Note that I really don't know why GL_BLEND is turned off at the end of the first + // armour layer anyway, or why alpha testing is turned on... but we definitely don't want to be turning blending off during the gui render. + if( !entityRenderDispatcher->isGuiRender ) + { + if ((armorType & 0xf) == 0xf) + { + float time = mob->tickCount + a; + bindTexture(&ENCHANT_GLINT_LOCATION); + glEnable(GL_BLEND); + float br = 0.5f; + glColor4f(br, br, br, 1); + glDepthFunc(GL_EQUAL); + glDepthMask(false); + + for (int j = 0; j < 2; j++) + { + glDisable(GL_LIGHTING); + float brr = 0.76f; + glColor4f(0.5f * brr, 0.25f * brr, 0.8f * brr, 1); + glBlendFunc(GL_SRC_COLOR, GL_ONE); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + float uo = time * (0.001f + j * 0.003f) * 20; + float ss = 1 / 3.0f; + glScalef(ss, ss, ss); + glRotatef(30 - (j) * 60.0f, 0, 0, 1); + glTranslatef(0, uo, 0); + glMatrixMode(GL_MODELVIEW); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + } + + glColor4f(1, 1, 1, 1); + glMatrixMode(GL_TEXTURE); + glDepthMask(true); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_LIGHTING); + glDisable(GL_BLEND); + glDepthFunc(GL_LEQUAL); + + } + glDisable(GL_BLEND); + } + glEnable(GL_ALPHA_TEST); + } + } + glDepthMask(true); + + additionalRendering(mob, a); + float br = mob->getBrightness(a); + int overlayColor = getOverlayColor(mob, br, a); + glActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + + 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(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a) >= 0) + { + glColor4f(br, 0, 0, 0.4f); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, 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(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a) >= 0) + { + glColor4f(r, g, b, aa); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + } + } + } + + glDepthFunc(GL_LEQUAL); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + glEnable(GL_TEXTURE_2D); + } + glDisable(GL_RESCALE_NORMAL); + } + /* catch (Exception e) + { + e.printStackTrace(); + }*/ + + glActiveTexture(GL_TEXTURE1); + glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + glEnable(GL_CULL_FACE); + + glPopMatrix(); + + MemSect(31); + renderName(mob, x, y, z); + MemSect(0); +} + +void LivingEntityRenderer::renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) +{ + bindTexture(mob); + if (!mob->isInvisible()) + { + model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); + } + else if(!mob->isInvisibleTo(dynamic_pointer_cast(Minecraft::GetInstance()->player))) + { + glPushMatrix(); + glColor4f(1, 1, 1, 0.15f); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glAlphaFunc(GL_GREATER, 1.0f / 255.0f); + model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); + glDisable(GL_BLEND); + glAlphaFunc(GL_GREATER, .1f); + glPopMatrix(); + glDepthMask(true); + } + else + { + model->setupAnim(wp, ws, bob, headRotMinusBodyRot, headRotx, scale, mob); + } +} + +void LivingEntityRenderer::setupPosition(shared_ptr mob, double x, double y, double z) +{ + glTranslatef((float) x, (float) y, (float) z); +} + +void LivingEntityRenderer::setupRotations(shared_ptr mob, float bob, float bodyRot, float a) +{ + glRotatef(180 - bodyRot, 0, 1, 0); + if (mob->deathTime > 0) + { + float fall = (mob->deathTime + a - 1) / 20.0f * 1.6f; + fall = sqrt(fall); + if (fall > 1) fall = 1; + glRotatef(fall * getFlipDegrees(mob), 0, 0, 1); + } + else + { + wstring name = mob->getAName(); + if (name == L"Dinnerbone" || name == L"Grumm") + { + if ( !mob->instanceof(eTYPE_PLAYER) || !dynamic_pointer_cast(mob)->isCapeHidden() ) + { + glTranslatef(0, mob->bbHeight + 0.1f, 0); + glRotatef(180, 0, 0, 1); + } + } + } +} + +float LivingEntityRenderer::getAttackAnim(shared_ptr mob, float a) +{ + return mob->getAttackAnim(a); +} + +float LivingEntityRenderer::getBob(shared_ptr mob, float a) +{ + return (mob->tickCount + a); +} + +void LivingEntityRenderer::additionalRendering(shared_ptr mob, float a) +{ + +} + +void LivingEntityRenderer::renderArrows(shared_ptr mob, float a) +{ + int arrowCount = mob->getArrowCount(); + if (arrowCount > 0) + { + shared_ptr arrow = shared_ptr(new Arrow(mob->level, mob->x, mob->y, mob->z)); + Random random = Random(mob->entityId); + Lighting::turnOff(); + for (int i = 0; i < arrowCount; i++) + { + glPushMatrix(); + ModelPart *modelPart = model->getRandomModelPart(random); + Cube *cube = modelPart->cubes[random.nextInt(modelPart->cubes.size())]; + modelPart->translateTo(1 / 16.0f); + float xd = random.nextFloat(); + float yd = random.nextFloat(); + float zd = random.nextFloat(); + float xo = (cube->x0 + (cube->x1 - cube->x0) * xd) / 16.0f; + float yo = (cube->y0 + (cube->y1 - cube->y0) * yd) / 16.0f; + float zo = (cube->z0 + (cube->z1 - cube->z0) * zd) / 16.0f; + glTranslatef(xo, yo, zo); + xd = xd * 2 - 1; + yd = yd * 2 - 1; + zd = zd * 2 - 1; + if (true) + { + xd *= -1; + yd *= -1; + zd *= -1; + } + float sd = (float) sqrt(xd * xd + zd * zd); + arrow->yRotO = arrow->yRot = (float) (atan2(xd, zd) * 180 / PI); + arrow->xRotO = arrow->xRot = (float) (atan2(yd, sd) * 180 / PI); + double x = 0; + double y = 0; + double z = 0; + float yRot = 0; + entityRenderDispatcher->render(arrow, x, y, z, yRot, a); + glPopMatrix(); + } + Lighting::turnOn(); + } +} + +int LivingEntityRenderer::prepareArmorOverlay(shared_ptr mob, int layer, float a) +{ + return prepareArmor(mob, layer, a); +} + +int LivingEntityRenderer::prepareArmor(shared_ptr mob, int layer, float a) +{ + return -1; +} + +void LivingEntityRenderer::prepareSecondPassArmor(shared_ptr mob, int layer, float a) +{ +} + +float LivingEntityRenderer::getFlipDegrees(shared_ptr mob) +{ + return 90; +} + +int LivingEntityRenderer::getOverlayColor(shared_ptr mob, float br, float a) +{ + return 0; +} + +void LivingEntityRenderer::scale(shared_ptr mob, float a) +{ +} + +void LivingEntityRenderer::renderName(shared_ptr mob, double x, double y, double z) +{ + if (shouldShowName(mob) || Minecraft::renderDebug()) + { + float size = 1.60f; + float s = 1 / 60.0f * size; + double dist = mob->distanceToSqr(entityRenderDispatcher->cameraEntity); + + float maxDist = mob->isSneaking() ? 32 : 64; + + if (dist < maxDist * maxDist) + { + wstring msg = mob->getDisplayName(); + + if (!msg.empty()) + { + if (mob->isSneaking()) + { + if ( app.GetGameSettings(eGameSetting_DisplayHUD)==0 ) + { + // 4J-PB - turn off gamertag render + return; + } + + if(app.GetGameHostOption(eGameHostOption_Gamertags)==0) + { + // turn off gamertags if the host has set them off + return; + } + + Font *font = getFont(); + glPushMatrix(); + glTranslatef((float) x + 0, (float) y + mob->bbHeight + 0.5f, (float) z); + glNormal3f(0, 1, 0); + + glRotatef(-entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(entityRenderDispatcher->playerRotX, 1, 0, 0); + + glScalef(-s, -s, s); + glDisable(GL_LIGHTING); + + glTranslatef(0, 0.25f / s, 0); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Tesselator *t = Tesselator::getInstance(); + + glDisable(GL_TEXTURE_2D); + t->begin(); + int w = font->width(msg) / 2; + t->color(0.f, 0.f, 0.f, 0.25f); + t->vertex(-w - 1, -1, 0); + t->vertex(-w - 1, +8, 0); + t->vertex(+w + 1, +8, 0); + t->vertex(+w + 1, -1, 0); + t->end(); + glEnable(GL_TEXTURE_2D); + glDepthMask(true); + font->draw(msg, -font->width(msg) / 2, 0, 0x20ffffff); + glEnable(GL_LIGHTING); + glDisable(GL_BLEND); + glColor4f(1, 1, 1, 1); + glPopMatrix(); + } + else + { + renderNameTags(mob, x, y, z, msg, s, dist); + } + } + } + } +} + +bool LivingEntityRenderer::shouldShowName(shared_ptr mob) +{ + return Minecraft::renderNames() && mob != entityRenderDispatcher->cameraEntity && !mob->isInvisibleTo(Minecraft::GetInstance()->player) && mob->rider.lock() == NULL; +} + +void LivingEntityRenderer::renderNameTags(shared_ptr mob, double x, double y, double z, const wstring &msg, float scale, double dist) +{ + if (mob->isSleeping()) + { + renderNameTag(mob, msg, x, y - 1.5f, z, 64); + } + else + { + renderNameTag(mob, msg, x, y, z, 64); + } +} + +// 4J Added parameter for color here so that we can colour players names +void LivingEntityRenderer::renderNameTag(shared_ptr mob, const wstring &name, double x, double y, double z, int maxDist, int color /*= 0xff000000*/) +{ + if ( app.GetGameSettings(eGameSetting_DisplayHUD)==0 ) + { + // 4J-PB - turn off gamertag render + return; + } + + if(app.GetGameHostOption(eGameHostOption_Gamertags)==0) + { + // turn off gamertags if the host has set them off + return; + } + + float dist = mob->distanceTo(entityRenderDispatcher->cameraEntity); + + if (dist > maxDist ) + { + return; + } + + Font *font = getFont(); + + float size = 1.60f; + float s = 1 / 60.0f * size; + + glPushMatrix(); + glTranslatef((float) x + 0, (float) y + 2.3f, (float) z); + glNormal3f(0, 1, 0); + + glRotatef(-this->entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(this->entityRenderDispatcher->playerRotX, 1, 0, 0); + + glScalef(-s, -s, s); + glDisable(GL_LIGHTING); + + // 4J Stu - If it's beyond readable distance, then just render a coloured box + int readableDist = PLAYER_NAME_READABLE_FULLSCREEN; + if( !RenderManager.IsHiDef() ) + { + readableDist = PLAYER_NAME_READABLE_DISTANCE_SD; + } + else if ( app.GetLocalPlayerCount() > 2 ) + { + readableDist = PLAYER_NAME_READABLE_DISTANCE_SPLITSCREEN; + } + + float textOpacity = 1.0f; + if( dist >= readableDist ) + { + int diff = dist - readableDist; + + textOpacity /= (diff/2); + + if( diff > readableDist ) textOpacity = 0.0f; + } + + if( textOpacity < 0.0f ) textOpacity = 0.0f; + if( textOpacity > 1.0f ) textOpacity = 1.0f; + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Tesselator *t = Tesselator::getInstance(); + + int offs = 0; + + wstring playerName; + WCHAR wchName[2]; + + if(mob->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(mob); + + if(app.isXuidDeadmau5( player->getXuid() ) ) offs = -10; + +#if defined(__PS3__) || defined(__ORBIS__) + // Check we have all the font characters for this player name + switch(player->GetPlayerNameValidState()) + { + case Player::ePlayerNameValid_NotSet: + if(font->AllCharactersValid(name)) + { + playerName=name; + player->SetPlayerNameValidState(true); + } + else + { + memset(wchName,0,sizeof(WCHAR)*2); + swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); + playerName=wchName; + player->SetPlayerNameValidState(false); + } + break; + case Player::ePlayerNameValid_True: + playerName=name; + break; + case Player::ePlayerNameValid_False: + memset(wchName,0,sizeof(WCHAR)*2); + swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); + playerName=wchName; + break; + } +#else + playerName = name; +#endif + } + else + { + playerName = name; + } + + if( textOpacity > 0.0f ) + { + glColor4f(1.0f,1.0f,1.0f,textOpacity); + + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + + glDisable(GL_TEXTURE_2D); + + t->begin(); + int w = font->width(playerName) / 2; + + if( textOpacity < 1.0f ) + { + t->color(color, 255 * textOpacity); + } + else + { + t->color(0.0f, 0.0f, 0.0f, 0.25f); + } + t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); + t->vertex((float)(-w - 1), (float)( +8 + offs + 1), (float)( 0)); + t->vertex((float)(+w + 1), (float)( +8 + offs + 1), (float)( 0)); + t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); + t->end(); + + glEnable(GL_DEPTH_TEST); + glDepthMask(true); + glDepthFunc(GL_ALWAYS); + glLineWidth(2.0f); + t->begin(GL_LINE_STRIP); + t->color(color, 255 * textOpacity); + t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); + t->vertex((float)(-w - 1), (float)( +8 + offs + 1), (float)( 0)); + t->vertex((float)(+w + 1), (float)( +8 + offs + 1), (float)( 0)); + t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); + t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); + t->end(); + glDepthFunc(GL_LEQUAL); + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + + glEnable(GL_TEXTURE_2D); + font->draw(playerName, -font->width(playerName) / 2, offs, 0x20ffffff); + glEnable(GL_DEPTH_TEST); + + glDepthMask(true); + } + + if( textOpacity < 1.0f ) + { + glColor4f(1.0f,1.0f,1.0f,1.0f); + glDisable(GL_TEXTURE_2D); + glDepthFunc(GL_ALWAYS); + t->begin(); + int w = font->width(playerName) / 2; + t->color(color, 255); + t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); + t->vertex((float)(-w - 1), (float)( +8 + offs), (float)( 0)); + t->vertex((float)(+w + 1), (float)( +8 + offs), (float)( 0)); + t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); + t->end(); + glDepthFunc(GL_LEQUAL); + glEnable(GL_TEXTURE_2D); + + glTranslatef(0.0f, 0.0f, -0.04f); + } + + if( textOpacity > 0.0f ) + { + int textColor = ( ( (int)(textOpacity*255) << 24 ) | 0xffffff ); + font->draw(playerName, -font->width(playerName) / 2, offs, textColor); + } + + glEnable(GL_LIGHTING); + glDisable(GL_BLEND); + glColor4f(1, 1, 1, 1); + glPopMatrix(); +} \ No newline at end of file diff --git a/Minecraft.Client/LivingEntityRenderer.h b/Minecraft.Client/LivingEntityRenderer.h new file mode 100644 index 00000000..2f77e1b5 --- /dev/null +++ b/Minecraft.Client/LivingEntityRenderer.h @@ -0,0 +1,47 @@ +#pragma once +#include "ResourceLocation.h" +#include "EntityRenderer.h" +#include "..\Minecraft.World\LivingEntity.h" + +class LivingEntity; + +class LivingEntityRenderer : public EntityRenderer +{ + static const int PLAYER_NAME_READABLE_FULLSCREEN = 16; + static const int PLAYER_NAME_READABLE_DISTANCE_SPLITSCREEN = 8; + static const int PLAYER_NAME_READABLE_DISTANCE_SD = 8; + + static ResourceLocation ENCHANT_GLINT_LOCATION; + static int MAX_ARMOR_LAYERS; + +protected: + //Model *model; // 4J Stu - This shadows the one in EntityRenderer + Model *armor; + +public: + LivingEntityRenderer(Model *model, float shadow); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void setArmor(Model *armor); + +private: + float rotlerp(float from, float to, float a); + +protected: + virtual void renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); + virtual void setupPosition(shared_ptr mob, double x, double y, double z); + virtual void setupRotations(shared_ptr mob, float bob, float bodyRot, float a); + virtual float getAttackAnim(shared_ptr mob, float a); + virtual float getBob(shared_ptr mob, float a); + virtual void additionalRendering(shared_ptr mob, float a); + virtual void renderArrows(shared_ptr mob, float a); + virtual int prepareArmorOverlay(shared_ptr mob, int layer, float a); + virtual int prepareArmor(shared_ptr mob, int layer, float a); + virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); + virtual float getFlipDegrees(shared_ptr mob); + virtual int getOverlayColor(shared_ptr mob, float br, float a); + virtual void scale(shared_ptr mob, float a); + virtual void renderName(shared_ptr mob, double x, double y, double z); + virtual bool shouldShowName(shared_ptr mob); + virtual void renderNameTags(shared_ptr mob, double x, double y, double z, const wstring &msg, float scale, double dist); + virtual void renderNameTag(shared_ptr mob, const wstring &name, double x, double y, double z, int maxDist, int color = 0xff000000); +}; \ No newline at end of file diff --git a/Minecraft.Client/LocalPlayer.cpp b/Minecraft.Client/LocalPlayer.cpp index 97891046..bb25105f 100644 --- a/Minecraft.Client/LocalPlayer.cpp +++ b/Minecraft.Client/LocalPlayer.cpp @@ -16,18 +16,22 @@ #include "CreativeMode.h" #include "GameRenderer.h" #include "ItemInHandRenderer.h" +#include "..\Minecraft.World\AttributeInstance.h" #include "..\Minecraft.World\LevelData.h" #include "..\Minecraft.World\net.minecraft.world.damagesource.h" #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\net.minecraft.world.food.h" #include "..\Minecraft.World\net.minecraft.world.effect.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "..\Minecraft.World\ItemEntity.h" #include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "..\Minecraft.World\net.minecraft.world.phys.h" #include "..\Minecraft.World\net.minecraft.stats.h" #include "..\Minecraft.World\com.mojang.nbt.h" #include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\TileEntity.h" #include "..\Minecraft.World\Mth.h" #include "AchievementPopup.h" #include "CritParticle.h" @@ -55,7 +59,7 @@ -LocalPlayer::LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dimension) : Player(level) +LocalPlayer::LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dimension) : Player(level, user->name) { flyX = flyY = flyZ = 0.0f; // 4J added m_awardedThisSession = 0; @@ -65,20 +69,23 @@ LocalPlayer::LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dim twoJumpsRegistered = false; sprintTime = 0; m_uiInactiveTicks=0; + portalTime = 0.0f; + oPortalTime = 0.0f; + jumpRidingTicks = 0; + jumpRidingScale = 0.0f; yBob = xBob = yBobO = xBobO = 0.0f; - this->minecraft = minecraft; - this->dimension = dimension; + this->minecraft = minecraft; + this->dimension = dimension; - if (user != NULL && user->name.length() > 0) + if (user != NULL && user->name.length() > 0) { - customTextureUrl = L"http://s3.amazonaws.com/MinecraftSkins/" + user->name + L".png"; - } + customTextureUrl = L"http://s3.amazonaws.com/MinecraftSkins/" + user->name + L".png"; + } if( user != NULL ) { this->name = user->name; - m_UUID = name; //wprintf(L"Created LocalPlayer with name %ls\n", name.c_str() ); // check to see if this player's xuid is in the list of special players MOJANG_DATA *pMojangData=app.GetMojangDataForXuid(getOnlineXuid()); @@ -121,50 +128,20 @@ LocalPlayer::~LocalPlayer() delete input; } -// 4J - added noEntityCubes parameter -void LocalPlayer::move(double xa, double ya, double za, bool noEntityCubes) -{ - if (ClientConstants::DEADMAU5_CAMERA_CHEATS) - { - if (shared_from_this() == minecraft->player && minecraft->options->isFlying) - { - noPhysics = true; - float tmp = walkDist; // update - calculateFlight((float) xa, (float) ya, (float) za); - fallDistance = 0.0f; - yd = 0.0f; - Player::move(flyX, flyY, flyZ, noEntityCubes); - onGround = true; - walkDist = tmp; - } - else - { - noPhysics = false; - Player::move(xa, ya, za, noEntityCubes); - } - } - else - { - Player::move(xa, ya, za, noEntityCubes); - } - -} - void LocalPlayer::calculateFlight(float xa, float ya, float za) { - xa = xa * minecraft->options->flySpeed; - ya = 0; - za = za * minecraft->options->flySpeed; - - flyX = smoothFlyX.getNewDeltaValue(xa, .35f * minecraft->options->sensitivity); - flyY = smoothFlyY.getNewDeltaValue(ya, .35f * minecraft->options->sensitivity); - flyZ = smoothFlyZ.getNewDeltaValue(za, .35f * minecraft->options->sensitivity); + xa = xa * minecraft->options->flySpeed; + ya = 0; + za = za * minecraft->options->flySpeed; + flyX = smoothFlyX.getNewDeltaValue(xa, .35f * minecraft->options->sensitivity); + flyY = smoothFlyY.getNewDeltaValue(ya, .35f * minecraft->options->sensitivity); + flyZ = smoothFlyZ.getNewDeltaValue(za, .35f * minecraft->options->sensitivity); } void LocalPlayer::serverAiStep() { - Player::serverAiStep(); + Player::serverAiStep(); if( abilities.flying && abilities.mayfly ) { @@ -199,7 +176,7 @@ void LocalPlayer::serverAiStep() this->xxa = input->xa; this->yya = input->ya; } - this->jumping = input->jumping; + this->jumping = input->jumping; yBobO = yBob; xBobO = xBob; @@ -211,7 +188,7 @@ void LocalPlayer::serverAiStep() // mapPlayerChunk(8); } -bool LocalPlayer::isEffectiveAI() +bool LocalPlayer::isEffectiveAi() { return true; } @@ -237,26 +214,26 @@ void LocalPlayer::aiStep() y = 68.5; return; } - oPortalTime = portalTime; - if (isInsidePortal) + oPortalTime = portalTime; + if (isInsidePortal) { - if (!level->isClientSide) + if (!level->isClientSide) { - if (riding != NULL) this->ride(nullptr); - } - if (minecraft->screen != NULL) minecraft->setScreen(NULL); + if (riding != NULL) this->ride(nullptr); + } + if (minecraft->screen != NULL) minecraft->setScreen(NULL); - if (portalTime == 0) + if (portalTime == 0) { - minecraft->soundEngine->playUI(eSoundType_PORTAL_TRIGGER, 1, random->nextFloat() * 0.4f + 0.8f); - } - portalTime += 1 / 80.0f; - if (portalTime >= 1) + minecraft->soundEngine->playUI(eSoundType_PORTAL_TRIGGER, 1, random->nextFloat() * 0.4f + 0.8f); + } + portalTime += 1 / 80.0f; + if (portalTime >= 1) { - portalTime = 1; - } - isInsidePortal = false; - } + portalTime = 1; + } + isInsidePortal = false; + } else if (hasEffect(MobEffect::confusion) && getEffect(MobEffect::confusion)->getDuration() > (SharedConstants::TICKS_PER_SECOND * 3)) { portalTime += 1 / 150.0f; @@ -267,11 +244,11 @@ void LocalPlayer::aiStep() } else { - if (portalTime > 0) portalTime -= 1 / 20.0f; - if (portalTime < 0) portalTime = 0; - } + if (portalTime > 0) portalTime -= 1 / 20.0f; + if (portalTime < 0) portalTime = 0; + } - if (changingDimensionDelay > 0) changingDimensionDelay--; + if (changingDimensionDelay > 0) changingDimensionDelay--; bool wasJumping = input->jumping; float runTreshold = 0.8f; float sprintForward = input->sprintForward; @@ -281,22 +258,22 @@ void LocalPlayer::aiStep() // 4J-PB - make it a localplayer input->tick( this ); sprintForward = input->sprintForward; - if (isUsingItem()) + if (isUsingItem() && !isRiding()) { input->xa *= 0.2f; input->ya *= 0.2f; sprintTriggerTime = 0; } - // this.heightOffset = input.sneaking?1.30f:1.62f; // 4J - this was already commented out - if (input->sneaking) // 4J - removed - TODO replace + // this.heightOffset = input.sneaking?1.30f:1.62f; // 4J - this was already commented out + if (input->sneaking) // 4J - removed - TODO replace { - if (ySlideOffset < 0.2f) ySlideOffset = 0.2f; - } + if (ySlideOffset < 0.2f) ySlideOffset = 0.2f; + } - checkInTile(x - bbWidth * 0.35, bb->y0 + 0.5, z + bbWidth * 0.35); - checkInTile(x - bbWidth * 0.35, bb->y0 + 0.5, z - bbWidth * 0.35); - checkInTile(x + bbWidth * 0.35, bb->y0 + 0.5, z - bbWidth * 0.35); - checkInTile(x + bbWidth * 0.35, bb->y0 + 0.5, z + bbWidth * 0.35); + checkInTile(x - bbWidth * 0.35, bb->y0 + 0.5, z + bbWidth * 0.35); + checkInTile(x - bbWidth * 0.35, bb->y0 + 0.5, z - bbWidth * 0.35); + checkInTile(x + bbWidth * 0.35, bb->y0 + 0.5, z - bbWidth * 0.35); + checkInTile(x + bbWidth * 0.35, bb->y0 + 0.5, z + bbWidth * 0.35); bool enoughFoodToSprint = getFoodData()->getFoodLevel() > FoodConstants::MAX_FOOD * FoodConstants::FOOD_SATURATION_LOW; @@ -427,7 +404,49 @@ void LocalPlayer::aiStep() } } - Player::aiStep(); + if (isRidingJumpable()) + { + if (jumpRidingTicks < 0) + { + jumpRidingTicks++; + if (jumpRidingTicks == 0) + { + // reset scale (for gui) + jumpRidingScale = 0; + } + } + if (wasJumping && !input->jumping) + { + // jump release + jumpRidingTicks = -10; + sendRidingJump(); + } + else if (!wasJumping && input->jumping) + { + // jump press + jumpRidingTicks = 0; + jumpRidingScale = 0; + } + else if (wasJumping) + { + // calc jump scale + jumpRidingTicks++; + if (jumpRidingTicks < 10) + { + jumpRidingScale = (float) jumpRidingTicks * .1f; + } + else + { + jumpRidingScale = .8f + (2.f / ((float) (jumpRidingTicks - 9))) * .1f; + } + } + } + else + { + jumpRidingScale = 0; + } + + Player::aiStep(); // 4J-PB - If we're in Creative Mode, allow flying on ground if(!abilities.mayfly && !isAllowedToFly() ) @@ -494,7 +513,7 @@ void LocalPlayer::aiStep() fallDistance = 0.0f; yd = 0.0f; onGround = true; - } + } // Check if the player is idle and the rich presence needs updated if( !m_bIsIdle && InputManager.GetIdleSeconds( m_iPad ) > PLAYER_IDLE_TIME ) @@ -561,7 +580,9 @@ float LocalPlayer::getFieldOfViewModifier() // modify for movement if (abilities.flying) targetFov *= 1.1f; - targetFov *= ((walkingSpeed * getWalkingSpeedModifier()) / defaultWalkSpeed + 1) / 2; + + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + targetFov *= (speed->getValue() / abilities.getWalkingSpeed() + 1) / 2; // modify for bow =) if (isUsingItem() && getUseItem()->id == Item::bow->id) @@ -584,20 +605,20 @@ float LocalPlayer::getFieldOfViewModifier() void LocalPlayer::addAdditonalSaveData(CompoundTag *entityTag) { - Player::addAdditonalSaveData(entityTag); - entityTag->putInt(L"Score", score); + Player::addAdditonalSaveData(entityTag); + //entityTag->putInt(L"Score", score); } void LocalPlayer::readAdditionalSaveData(CompoundTag *entityTag) { - Player::readAdditionalSaveData(entityTag); - score = entityTag->getInt(L"Score"); + Player::readAdditionalSaveData(entityTag); + //score = entityTag->getInt(L"Score"); } void LocalPlayer::closeContainer() { - Player::closeContainer(); - minecraft->setScreen(NULL); + Player::closeContainer(); + minecraft->setScreen(NULL); // 4J - Close any xui here // Fix for #9164 - CRASH: MP: Title crashes upon opening a chest and having another user destroy it. @@ -605,9 +626,19 @@ void LocalPlayer::closeContainer() ui.CloseUIScenes( m_iPad ); } -void LocalPlayer::openTextEdit(shared_ptr sign) +void LocalPlayer::openTextEdit(shared_ptr tileEntity) { - bool success = app.LoadSignEntryMenu(GetXboxPad(), sign ); + bool success; + + if (tileEntity->GetType() == eTYPE_SIGNTILEENTITY) + { + success = app.LoadSignEntryMenu(GetXboxPad(), dynamic_pointer_cast(tileEntity)); + } + else if (tileEntity->GetType() == eTYPE_COMMANDBLOCKTILEENTITY) + { + success = app.LoadCommandBlockMenu(GetXboxPad(), dynamic_pointer_cast(tileEntity)); + } + if( success ) ui.PlayUISFX(eSFX_Press); //minecraft->setScreen(new TextEditScreen(sign)); } @@ -620,6 +651,30 @@ bool LocalPlayer::openContainer(shared_ptr container) return success; } +bool LocalPlayer::openHopper(shared_ptr container) +{ + //minecraft->setScreen(new HopperScreen(inventory, container)); + bool success = app.LoadHopperMenu(GetXboxPad(), inventory, container ); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + +bool LocalPlayer::openHopper(shared_ptr container) +{ + //minecraft->setScreen(new HopperScreen(inventory, container)); + bool success = app.LoadHopperMenu(GetXboxPad(), inventory, container ); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + +bool LocalPlayer::openHorseInventory(shared_ptr horse, shared_ptr container) +{ + //minecraft->setScreen(new HorseInventoryScreen(inventory, container, horse)); + bool success = app.LoadHorseMenu(GetXboxPad(), inventory, container, horse); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + bool LocalPlayer::startCrafting(int x, int y, int z) { bool success = app.LoadCrafting3x3Menu(GetXboxPad(), dynamic_pointer_cast( shared_from_this() ), x, y, z ); @@ -629,9 +684,16 @@ bool LocalPlayer::startCrafting(int x, int y, int z) return success; } -bool LocalPlayer::startEnchanting(int x, int y, int z) +bool LocalPlayer::openFireworks(int x, int y, int z) +{ + bool success = app.LoadFireworksMenu(GetXboxPad(), dynamic_pointer_cast( shared_from_this() ), x, y, z ); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + +bool LocalPlayer::startEnchanting(int x, int y, int z, const wstring &name) { - bool success = app.LoadEnchantingMenu(GetXboxPad(), inventory, x, y, z, level ); + bool success = app.LoadEnchantingMenu(GetXboxPad(), inventory, x, y, z, level, name); if( success ) ui.PlayUISFX(eSFX_Press); //minecraft.setScreen(new EnchantmentScreen(inventory, level, x, y, z)); return success; @@ -661,6 +723,14 @@ bool LocalPlayer::openBrewingStand(shared_ptr brewingSta return success; } +bool LocalPlayer::openBeacon(shared_ptr beacon) +{ + //minecraft->setScreen(new BeaconScreen(inventory, beacon)); + bool success = app.LoadBeaconMenu(GetXboxPad(), inventory, beacon); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + bool LocalPlayer::openTrap(shared_ptr trap) { bool success = app.LoadTrapMenu(GetXboxPad(),inventory, trap); @@ -669,9 +739,9 @@ bool LocalPlayer::openTrap(shared_ptr trap) return success; } -bool LocalPlayer::openTrading(shared_ptr traderTarget) +bool LocalPlayer::openTrading(shared_ptr traderTarget, const wstring &name) { - bool success = app.LoadTradingMenu(GetXboxPad(),inventory, traderTarget, level); + bool success = app.LoadTradingMenu(GetXboxPad(),inventory, traderTarget, level, name); if( success ) ui.PlayUISFX(eSFX_Press); //minecraft.setScreen(new MerchantScreen(inventory, traderTarget, level)); return success; @@ -705,30 +775,30 @@ bool LocalPlayer::isSneaking() return input->sneaking && !m_isSleeping; } -void LocalPlayer::hurtTo(int newHealth, ETelemetryChallenges damageSource) +void LocalPlayer::hurtTo(float newHealth, ETelemetryChallenges damageSource) { - int dmg = getHealth() - newHealth; - if (dmg <= 0) + float dmg = getHealth() - newHealth; + if (dmg <= 0) { - setHealth(newHealth); - if (dmg < 0) + setHealth(newHealth); + if (dmg < 0) { - invulnerableTime = invulnerableDuration / 2; - } - } + invulnerableTime = invulnerableDuration / 2; + } + } else { - lastHurt = dmg; - setHealth(getHealth()); - invulnerableTime = invulnerableDuration; - actuallyHurt(DamageSource::genericSource,dmg); - hurtTime = hurtDuration = 10; - } + lastHurt = dmg; + setHealth(getHealth()); + invulnerableTime = invulnerableDuration; + actuallyHurt(DamageSource::genericSource,dmg); + hurtTime = hurtDuration = 10; + } - if( this->health <= 0) + if( this->getHealth() <= 0) { - int deathTime = (int)(level->getTime() % Level::TICKS_PER_DAY)/1000; + int deathTime = (int)(level->getGameTime() % Level::TICKS_PER_DAY)/1000; int carriedId = inventory->getSelected() == NULL ? 0 : inventory->getSelected()->id; TelemetryManager->RecordPlayerDiedOrFailed(GetXboxPad(), 0, y, 0, 0, carriedId, 0, damageSource); @@ -774,16 +844,16 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) delete [] param.data; if (!app.CanRecordStatsAndAchievements()) return; - if (stat == NULL) return; + if (stat == NULL) return; - if (stat->isAchievement()) + if (stat->isAchievement()) { - Achievement *ach = (Achievement *) stat; + Achievement *ach = (Achievement *) stat; // 4J-PB - changed to attempt to award everytime - the award may need a storage device, so needs a primary player, and the player may not have been a primary player when they first 'got' the award // so let the award manager figure it out - //if (!minecraft->stats[m_iPad]->hasTaken(ach)) + //if (!minecraft->stats[m_iPad]->hasTaken(ach)) { - // 4J-PB - Don't display the java popup + // 4J-PB - Don't display the java popup //minecraft->achievementPopup->popup(ach); // 4J Stu - Added this function in the libraries as some achievements don't get awarded to all players @@ -811,14 +881,14 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) if (ProfileManager.IsFullVersion()) m_awardedThisSession |= achBit; } - } + } minecraft->stats[m_iPad]->award(stat, level->difficulty, count); - } + } else { // 4J : WESTY : Added for new achievements. StatsCounter* pStats = minecraft->stats[m_iPad]; - pStats->award(stat, level->difficulty, count); + pStats->award(stat, level->difficulty, count); // 4J-JEV: Check achievements for unlocks. @@ -1035,7 +1105,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) bool justPickedupWool = false; for (int i=0; i<16; i++) - if ( stat == GenericStats::itemsCollected(Tile::cloth_Id, i) ) + if ( stat == GenericStats::itemsCollected(Tile::wool_Id, i) ) justPickedupWool = true; if (justPickedupWool) @@ -1044,7 +1114,7 @@ void LocalPlayer::awardStat(Stat *stat, byteArray param) for (unsigned int i = 0; i < 16; i++) { - if (pStats->getTotalValue(GenericStats::itemsCollected(Tile::cloth_Id, i)) > 0) + if (pStats->getTotalValue(GenericStats::itemsCollected(Tile::wool_Id, i)) > 0) woolCount++; } @@ -1085,51 +1155,51 @@ bool LocalPlayer::isSolidBlock(int x, int y, int z) bool LocalPlayer::checkInTile(double x, double y, double z) { - int xTile = Mth::floor(x); - int yTile = Mth::floor(y); - int zTile = Mth::floor(z); + int xTile = Mth::floor(x); + int yTile = Mth::floor(y); + int zTile = Mth::floor(z); - double xd = x - xTile; - double zd = z - zTile; + double xd = x - xTile; + double zd = z - zTile; - if (isSolidBlock(xTile, yTile, zTile) || isSolidBlock(xTile, yTile + 1, zTile)) + if (isSolidBlock(xTile, yTile, zTile) || isSolidBlock(xTile, yTile + 1, zTile)) { - bool west = !isSolidBlock(xTile - 1, yTile, zTile) && !isSolidBlock(xTile - 1, yTile + 1, zTile); - bool east = !isSolidBlock(xTile + 1, yTile, zTile) && !isSolidBlock(xTile + 1, yTile + 1, zTile); - bool north = !isSolidBlock(xTile, yTile, zTile - 1) && !isSolidBlock(xTile, yTile + 1, zTile - 1); - bool south = !isSolidBlock(xTile, yTile, zTile + 1) && !isSolidBlock(xTile, yTile + 1, zTile + 1); - - int dir = -1; - double closest = 9999; - if (west && xd < closest) - { - closest = xd; - dir = 0; - } - if (east && 1 - xd < closest) - { - closest = 1 - xd; - dir = 1; - } - if (north && zd < closest) - { - closest = zd; - dir = 4; - } - if (south && 1 - zd < closest) - { - closest = 1 - zd; - dir = 5; - } - - float speed = 0.1f; - if (dir == 0) this->xd = -speed; - if (dir == 1) this->xd = +speed; - if (dir == 4) this->zd = -speed; - if (dir == 5) this->zd = +speed; - } - - return false; + bool west = !isSolidBlock(xTile - 1, yTile, zTile) && !isSolidBlock(xTile - 1, yTile + 1, zTile); + bool east = !isSolidBlock(xTile + 1, yTile, zTile) && !isSolidBlock(xTile + 1, yTile + 1, zTile); + bool north = !isSolidBlock(xTile, yTile, zTile - 1) && !isSolidBlock(xTile, yTile + 1, zTile - 1); + bool south = !isSolidBlock(xTile, yTile, zTile + 1) && !isSolidBlock(xTile, yTile + 1, zTile + 1); + + int dir = -1; + double closest = 9999; + if (west && xd < closest) + { + closest = xd; + dir = 0; + } + if (east && 1 - xd < closest) + { + closest = 1 - xd; + dir = 1; + } + if (north && zd < closest) + { + closest = zd; + dir = 4; + } + if (south && 1 - zd < closest) + { + closest = 1 - zd; + dir = 5; + } + + float speed = 0.1f; + if (dir == 0) this->xd = -speed; + if (dir == 1) this->xd = +speed; + if (dir == 4) this->zd = -speed; + if (dir == 5) this->zd = +speed; + } + + return false; } @@ -1142,9 +1212,44 @@ void LocalPlayer::setSprinting(bool value) void LocalPlayer::setExperienceValues(float experienceProgress, int totalExp, int experienceLevel) { - this->experienceProgress = experienceProgress; - this->totalExperience = totalExp; - this->experienceLevel = experienceLevel; + this->experienceProgress = experienceProgress; + this->totalExperience = totalExp; + this->experienceLevel = experienceLevel; +} + +// 4J: removed +//void LocalPlayer::sendMessage(ChatMessageComponent *message) +//{ +// minecraft->gui->getChat()->addMessage(message.toString(true)); +//} + +Pos LocalPlayer::getCommandSenderWorldPosition() +{ + return new Pos(floor(x + .5), floor(y + .5), floor(z + .5)); +} + +shared_ptr LocalPlayer::getCarriedItem() +{ + return inventory->getSelected(); +} + +void LocalPlayer::playSound(int soundId, float volume, float pitch) +{ + level->playLocalSound(x, y - heightOffset, z, soundId, volume, pitch, false); +} + +bool LocalPlayer::isRidingJumpable() +{ + return riding != NULL && riding->GetType() == eTYPE_HORSE; +} + +float LocalPlayer::getJumpRidingScale() +{ + return jumpRidingScale; +} + +void LocalPlayer::sendRidingJump() +{ } bool LocalPlayer::hasPermission(EGameCommand command) @@ -1215,14 +1320,14 @@ void LocalPlayer::handleMouseDown(int button, bool down) { return; } - if (!down) missTime = 0; - if (button == 0 && missTime > 0) return; + if (!down) missTime = 0; + if (button == 0 && missTime > 0) return; - if (down && minecraft->hitResult != NULL && minecraft->hitResult->type == HitResult::TILE && button == 0) + if (down && minecraft->hitResult != NULL && minecraft->hitResult->type == HitResult::TILE && button == 0) { - int x = minecraft->hitResult->x; - int y = minecraft->hitResult->y; - int z = minecraft->hitResult->z; + int x = minecraft->hitResult->x; + int y = minecraft->hitResult->y; + int z = minecraft->hitResult->z; // 4J - addition to stop layer mining out of the top or bottom of the world // 4J Stu - Allow this for The End @@ -1230,16 +1335,16 @@ void LocalPlayer::handleMouseDown(int button, bool down) minecraft->gameMode->continueDestroyBlock(x, y, z, minecraft->hitResult->f); - if(mayBuild(x,y,z)) + if(mayDestroyBlockAt(x,y,z)) { minecraft->particleEngine->crack(x, y, z, minecraft->hitResult->f); swing(); } - } + } else { - minecraft->gameMode->stopDestroyBlock(); - } + minecraft->gameMode->stopDestroyBlock(); + } } bool LocalPlayer::creativeModeHandleMouseClick(int button, bool buttonPressed) @@ -1550,15 +1655,15 @@ void LocalPlayer::updateRichPresence() { app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_MAP); } - else if(riding != NULL && dynamic_pointer_cast(riding) != NULL) + else if ( (riding != NULL) && riding->instanceof(eTYPE_MINECART) ) { app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_RIDING_MINECART); } - else if(riding != NULL && dynamic_pointer_cast(riding) != NULL) + else if ( (riding != NULL) && riding->instanceof(eTYPE_BOAT) ) { app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_BOATING); } - else if(riding != NULL && dynamic_pointer_cast(riding) != NULL) + else if ( (riding != NULL) && riding->instanceof(eTYPE_PIG) ) { app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_RIDING_PIG); } diff --git a/Minecraft.Client/LocalPlayer.h b/Minecraft.Client/LocalPlayer.h index b1e8dd23..0a5b14b2 100644 --- a/Minecraft.Client/LocalPlayer.h +++ b/Minecraft.Client/LocalPlayer.h @@ -23,6 +23,8 @@ class LocalPlayer : public Player public: static const int SPRINT_DURATION = 20 * 30; + eINSTANCEOF GetType() { return eTYPE_LOCALPLAYER; } + Input *input; protected: Minecraft *minecraft; @@ -43,15 +45,15 @@ public: float yBob, xBob; float yBobO, xBobO; + float portalTime; + float oPortalTime; + LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dimension); virtual ~LocalPlayer(); - void move(double xa, double ya, double za, bool noEntityCubes=false); // 4J - added noEntityCubes parameter - - int m_iScreenSection; // assuming 4player splitscreen for now, or -1 for single player __uint64 ullButtonsPressed; // Stores the button presses, since the inputmanager can be ticked faster than the minecraft - // player tick, and a button press and release combo can be missed in the minecraft::tick + // player tick, and a button press and release combo can be missed in the minecraft::tick __uint64 ullDpad_last; __uint64 ullDpad_this; @@ -68,7 +70,10 @@ public: private: float flyX, flyY, flyZ; - + + int jumpRidingTicks; + float jumpRidingScale; + protected: // 4J-PB - player's xbox pad int m_iPad; @@ -76,49 +81,54 @@ protected: bool m_bIsIdle; private: - // local player fly - // -------------------------------------------------------------------------- - // smooth camera settings + // local player fly + // -------------------------------------------------------------------------- + // smooth camera settings SmoothFloat smoothFlyX; - SmoothFloat smoothFlyY; - SmoothFloat smoothFlyZ; + SmoothFloat smoothFlyY; + SmoothFloat smoothFlyZ; - void calculateFlight(float xa, float ya, float za); + void calculateFlight(float xa, float ya, float za); public: virtual void serverAiStep(); protected: - bool isEffectiveAI(); + bool isEffectiveAi(); public: - virtual void aiStep(); + virtual void aiStep(); virtual void changeDimension(int i); virtual float getFieldOfViewModifier(); - virtual void addAdditonalSaveData(CompoundTag *entityTag); - virtual void readAdditionalSaveData(CompoundTag *entityTag); - virtual void closeContainer(); - virtual void openTextEdit(shared_ptr sign); - virtual bool openContainer(shared_ptr container); // 4J added bool return - virtual bool startCrafting(int x, int y, int z); // 4J added bool return - virtual bool startEnchanting(int x, int y, int z); // 4J added bool return + virtual void addAdditonalSaveData(CompoundTag *entityTag); + virtual void readAdditionalSaveData(CompoundTag *entityTag); + virtual void closeContainer(); + virtual void openTextEdit(shared_ptr sign); + virtual bool openContainer(shared_ptr container); // 4J added bool return + virtual bool openHopper(shared_ptr container); // 4J added bool return + virtual bool openHopper(shared_ptr container); // 4J added bool return + virtual bool openHorseInventory(shared_ptr horse, shared_ptr container); // 4J added bool return + virtual bool startCrafting(int x, int y, int z); // 4J added bool return + virtual bool openFireworks(int x, int y, int z); // 4J added + virtual bool startEnchanting(int x, int y, int z, const wstring &name); // 4J added bool return virtual bool startRepairing(int x, int y, int z); - virtual bool openFurnace(shared_ptr furnace); // 4J added bool return + virtual bool openFurnace(shared_ptr furnace); // 4J added bool return virtual bool openBrewingStand(shared_ptr brewingStand); // 4J added bool return - virtual bool openTrap(shared_ptr trap); // 4J added bool return - virtual bool openTrading(shared_ptr traderTarget); + virtual bool openBeacon(shared_ptr beacon); // 4J added bool return + virtual bool openTrap(shared_ptr trap); // 4J added bool return + virtual bool openTrading(shared_ptr traderTarget, const wstring &name); virtual void crit(shared_ptr e); virtual void magicCrit(shared_ptr e); - virtual void take(shared_ptr e, int orgCount); - virtual void chat(const wstring& message); + virtual void take(shared_ptr e, int orgCount); + virtual void chat(const wstring& message); virtual bool isSneaking(); //virtual bool isIdle(); - virtual void hurtTo(int newHealth, ETelemetryChallenges damageSource); - virtual void respawn(); - virtual void animateRespawn(); - virtual void displayClientMessage(int messageId); - virtual void awardStat(Stat *stat, byteArray param); + virtual void hurtTo(float newHealth, ETelemetryChallenges damageSource); + virtual void respawn(); + virtual void animateRespawn(); + virtual void displayClientMessage(int messageId); + virtual void awardStat(Stat *stat, byteArray param); virtual int ThirdPersonView() { return m_iThirdPersonView;} // 4J - have changed 3rd person view to be 0 if not enabled, 1 for mode like original, 2 reversed mode virtual void SetThirdPersonView(int val) {m_iThirdPersonView=val;} @@ -175,6 +185,17 @@ public: void setSprinting(bool value); void setExperienceValues(float experienceProgress, int totalExp, int experienceLevel); + // virtual void sendMessage(ChatMessageComponent *message); // 4J: removed + virtual Pos getCommandSenderWorldPosition(); + virtual shared_ptr getCarriedItem(); + virtual void playSound(int soundId, float volume, float pitch); + bool isRidingJumpable(); + float getJumpRidingScale(); + +protected: + virtual void sendRidingJump(); + +public: bool hasPermission(EGameCommand command); void updateRichPresence(); @@ -183,7 +204,6 @@ public: float m_sessionTimeStart; float m_dimensionTimeStart; -public: void SetSessionTimerStart(void); float getSessionTimer(void); diff --git a/Minecraft.Client/MinecartRenderer.cpp b/Minecraft.Client/MinecartRenderer.cpp index 0cae8346..fd907019 100644 --- a/Minecraft.Client/MinecartRenderer.cpp +++ b/Minecraft.Client/MinecartRenderer.cpp @@ -1,13 +1,17 @@ #include "stdafx.h" #include "MinecartRenderer.h" #include "MinecartModel.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\net.minecraft.world.entity.item.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" +ResourceLocation MinecartRenderer::MINECART_LOCATION(TN_ITEM_CART); + MinecartRenderer::MinecartRenderer() { - this->shadowRadius = 0.5f; - model = new MinecartModel(); + this->shadowRadius = 0.5f; + model = new MinecartModel(); + renderer = new TileRenderer(); } void MinecartRenderer::render(shared_ptr _cart, double x, double y, double z, float rot, float a) @@ -15,8 +19,10 @@ void MinecartRenderer::render(shared_ptr _cart, double x, double y, doub // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr cart = dynamic_pointer_cast(_cart); - glPushMatrix(); - + glPushMatrix(); + + bindTexture(cart); + __int64 seed = cart->entityId * 493286711l; seed = seed * seed * 4392167121l + seed * 98761; @@ -26,81 +32,120 @@ void MinecartRenderer::render(shared_ptr _cart, double x, double y, doub glTranslatef(xo, yo, zo); - double xx = cart->xOld + (cart->x - cart->xOld) * a; - double yy = cart->yOld + (cart->y - cart->yOld) * a; - double zz = cart->zOld + (cart->z - cart->zOld) * a; + double xx = cart->xOld + (cart->x - cart->xOld) * a; + double yy = cart->yOld + (cart->y - cart->yOld) * a; + double zz = cart->zOld + (cart->z - cart->zOld) * a; - double r = 0.3f; + double r = 0.3f; - Vec3 *p = cart->getPos(xx, yy, zz); + Vec3 *p = cart->getPos(xx, yy, zz); - float xRot = cart->xRotO + (cart->xRot - cart->xRotO) * a; + float xRot = cart->xRotO + (cart->xRot - cart->xRotO) * a; - if (p != NULL) + if (p != NULL) { - Vec3 *p0 = cart->getPosOffs(xx, yy, zz, r); - Vec3 *p1 = cart->getPosOffs(xx, yy, zz, -r); - if (p0 == NULL) p0 = p; - if (p1 == NULL) p1 = p; + Vec3 *p0 = cart->getPosOffs(xx, yy, zz, r); + Vec3 *p1 = cart->getPosOffs(xx, yy, zz, -r); + if (p0 == NULL) p0 = p; + if (p1 == NULL) p1 = p; - x += p->x - xx; - y += (p0->y + p1->y) / 2 - yy; - z += p->z - zz; + x += p->x - xx; + y += (p0->y + p1->y) / 2 - yy; + z += p->z - zz; - Vec3 *dir = p1->add(-p0->x, -p0->y, -p0->z); - if (dir->length() == 0) + Vec3 *dir = p1->add(-p0->x, -p0->y, -p0->z); + if (dir->length() == 0) { - } + } else { - dir = dir->normalize(); - rot = (float) (atan2(dir->z, dir->x) * 180 / PI); - xRot = (float) (atan(dir->y) * 73); - } - } - glTranslatef((float) x, (float) y, (float) z); - - glRotatef(180 - rot, 0, 1, 0); - glRotatef(-xRot, 0, 0, 1); - float hurt = cart->getHurtTime() - a; - float dmg = cart->getDamage() - a; - if (dmg < 0) dmg = 0; - if (hurt > 0) + dir = dir->normalize(); + rot = (float) (atan2(dir->z, dir->x) * 180 / PI); + xRot = (float) (atan(dir->y) * 73); + } + } + glTranslatef((float) x, (float) y, (float) z); + + glRotatef(180 - rot, 0, 1, 0); + glRotatef(-xRot, 0, 0, 1); + float hurt = cart->getHurtTime() - a; + float dmg = cart->getDamage() - a; + if (dmg < 0) dmg = 0; + if (hurt > 0) { - glRotatef(Mth::sin(hurt) * hurt * dmg / 10 * cart->getHurtDir(), 1, 0, 0); - } + glRotatef(Mth::sin(hurt) * hurt * dmg / 10 * cart->getHurtDir(), 1, 0, 0); + } + + int yOffset = cart->getDisplayOffset(); + Tile *tile = cart->getDisplayTile(); + int tileData = cart->getDisplayData(); - if (cart->type != Minecart::RIDEABLE) + if (tile != NULL) { glPushMatrix(); - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - float ss = 12 / 16.0f; - glScalef(ss, ss, ss); - // 4J - changes here brought forward from 1.2.3 - if (cart->type == Minecart::CHEST) - { - glTranslatef(0 / 16.0f, 8 / 16.0f, 0 / 16.0f); - TileRenderer *tr = new TileRenderer(); - tr->renderTile(Tile::chest, 0, cart->getBrightness(a)); - delete tr; - } - else if (cart->type == Minecart::FURNACE) - { - glTranslatef(0, 6 / 16.0f, 0); - TileRenderer *tr = new TileRenderer(); - tr->renderTile(Tile::furnace, 0, cart->getBrightness(a)); - delete tr; - } + bindTexture(&TextureAtlas::LOCATION_BLOCKS); + float ss = 12 / 16.0f; + + glScalef(ss, ss, ss); + glTranslatef(0 / 16.f, yOffset / 16.f, 0 / 16.f); + renderMinecartContents(cart, a, tile, tileData); + glPopMatrix(); glColor4f(1, 1, 1, 1); - } + bindTexture(cart); + } - bindTexture(TN_ITEM_CART); // 4J - was L"/item/cart.png" - glScalef(-1, -1, 1); - // model.render(0, 0, cart->getLootContent() * 7.1f - 0.1f, 0, 0, 1 / -// 16.0f); - model->render(cart, 0, 0, -0.1f, 0, 0, 1 / 16.0f, true); - glPopMatrix(); + glScalef(-1, -1, 1); + model->render(cart, 0, 0, -0.1f, 0, 0, 1 / 16.0f, true); + glPopMatrix(); + + /* + if (cart->type != Minecart::RIDEABLE) + { + glPushMatrix(); + bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + float ss = 12 / 16.0f; + glScalef(ss, ss, ss); + + // 4J - changes here brought forward from 1.2.3 + if (cart->type == Minecart::CHEST) + { + glTranslatef(0 / 16.0f, 8 / 16.0f, 0 / 16.0f); + TileRenderer *tr = new TileRenderer(); + tr->renderTile(Tile::chest, 0, cart->getBrightness(a)); + delete tr; + } + else if (cart->type == Minecart::FURNACE) + { + glTranslatef(0, 6 / 16.0f, 0); + TileRenderer *tr = new TileRenderer(); + tr->renderTile(Tile::furnace, 0, cart->getBrightness(a)); + delete tr; + } + glPopMatrix(); + glColor4f(1, 1, 1, 1); + } + + bindTexture(TN_ITEM_CART); // 4J - was L"/item/cart.png" + glScalef(-1, -1, 1); + // model.render(0, 0, cart->getLootContent() * 7.1f - 0.1f, 0, 0, 1 / + // 16.0f); + model->render(cart, 0, 0, -0.1f, 0, 0, 1 / 16.0f, true); + glPopMatrix(); + */ +} + +ResourceLocation *MinecartRenderer::getTextureLocation(shared_ptr mob) +{ + return &MINECART_LOCATION; +} + +void MinecartRenderer::renderMinecartContents(shared_ptr cart, float a, Tile *tile, int tileData) +{ + float brightness = cart->getBrightness(a); + glPushMatrix(); + renderer->renderTile(tile, tileData, brightness); + glPopMatrix(); } \ No newline at end of file diff --git a/Minecraft.Client/MinecartRenderer.h b/Minecraft.Client/MinecartRenderer.h index 0335ba8d..f35092a1 100644 --- a/Minecraft.Client/MinecartRenderer.h +++ b/Minecraft.Client/MinecartRenderer.h @@ -1,12 +1,22 @@ #pragma once #include "EntityRenderer.h" +class Minecart; + class MinecartRenderer : public EntityRenderer { +private: + static ResourceLocation MINECART_LOCATION; + protected: Model *model; + TileRenderer *renderer; public: MinecartRenderer(); - void render(shared_ptr _cart, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _cart, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); + +protected: + virtual void renderMinecartContents(shared_ptr cart, float a, Tile *tile, int tileData); }; \ No newline at end of file diff --git a/Minecraft.Client/MinecartSpawnerRenderer.cpp b/Minecraft.Client/MinecartSpawnerRenderer.cpp new file mode 100644 index 00000000..270db587 --- /dev/null +++ b/Minecraft.Client/MinecartSpawnerRenderer.cpp @@ -0,0 +1,15 @@ +#include "stdafx.h" +#include "MinecartSpawnerRenderer.h" +#include "../Minecraft.World/Tile.h" +#include "../Minecraft.World/net.minecraft.world.entity.item.h" +#include "MobSpawnerRenderer.h" + +void MinecartSpawnerRenderer::renderMinecartContents(shared_ptr cart, float a, Tile *tile, int tileData) +{ + MinecartRenderer::renderMinecartContents(cart, a, tile, tileData); + + if (tile == Tile::mobSpawner) + { + MobSpawnerRenderer::render(cart->getSpawner(), cart->x, cart->y, cart->z, a); + } +} \ No newline at end of file diff --git a/Minecraft.Client/MinecartSpawnerRenderer.h b/Minecraft.Client/MinecartSpawnerRenderer.h new file mode 100644 index 00000000..83d73a82 --- /dev/null +++ b/Minecraft.Client/MinecartSpawnerRenderer.h @@ -0,0 +1,10 @@ +#pragma once +#include "MinecartRenderer.h" + +class MinecartSpawner; + +class MinecartSpawnerRenderer : public MinecartRenderer +{ +protected: + void renderMinecartContents(shared_ptr cart, float a, Tile *tile, int tileData); +}; \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj index 607d158c..6a51baa4 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -17,6 +17,10 @@ ContentPackage_NO_TU PSVita + + ContentPackage_NO_TU + Win32 + ContentPackage_NO_TU x64 @@ -41,6 +45,10 @@ CONTENTPACKAGE_SYMBOLS PSVita + + CONTENTPACKAGE_SYMBOLS + Win32 + CONTENTPACKAGE_SYMBOLS x64 @@ -65,6 +73,10 @@ ContentPackage_Vita PSVita + + ContentPackage_Vita + Win32 + ContentPackage_Vita x64 @@ -89,6 +101,10 @@ ContentPackage PSVita + + ContentPackage + Win32 + ContentPackage x64 @@ -113,6 +129,10 @@ Debug PSVita + + Debug + Win32 + Debug x64 @@ -137,6 +157,10 @@ ReleaseForArt PSVita + + ReleaseForArt + Win32 + ReleaseForArt x64 @@ -161,6 +185,10 @@ Release PSVita + + Release + Win32 + Release x64 @@ -179,7 +207,6 @@ SAK Xbox360Proj title - 10.0 @@ -234,7 +261,11 @@ Application MultiByte v143 - 10.0 + + + Application + MultiByte + v143 Application @@ -246,13 +277,22 @@ Application MultiByte v143 - 10.0 + + + Application + MultiByte + v143 Application MultiByte v143 + + Application + MultiByte + v143 + Application Unicode @@ -340,24 +380,48 @@ true v143 + + Application + MultiByte + true + v143 + Application MultiByte true v143 + + Application + MultiByte + true + v143 + Application MultiByte true v143 + + Application + MultiByte + true + v143 + Application MultiByte true v143 + + Application + MultiByte + true + v143 + Application Unicode @@ -386,7 +450,7 @@ Application MultiByte true - v110 + v143 Clang @@ -411,6 +475,7 @@ + @@ -442,15 +507,24 @@ + + + + + + + + + @@ -496,15 +570,27 @@ + + + + + + + + + + + + @@ -545,7 +631,7 @@ true $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras false @@ -561,7 +647,7 @@ true $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras true @@ -573,6 +659,11 @@ $(OutDir)$(ProjectName)_D.xex $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + true $(OutDir)$(ProjectName)_D.xex @@ -594,11 +685,21 @@ $(OutDir)$(ProjectName)_D.xex $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + true $(OutDir)$(ProjectName)_D.xex $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + true $(OutDir)$(ProjectName)_D.xex @@ -657,7 +758,7 @@ true $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras false @@ -684,7 +785,7 @@ false $(OutDir)default$(TargetExt) $(OutDir)default.xex - $(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras .self @@ -705,24 +806,48 @@ $(OutDir)default.xex $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + false $(OutDir)default$(TargetExt) $(OutDir)default.xex $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + false $(OutDir)default$(TargetExt) $(OutDir)default.xex $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + false $(OutDir)default$(TargetExt) $(OutDir)default.xex $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + false $(OutDir)default$(TargetExt) @@ -1296,68 +1421,9 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" true $(OutDir)$(ProjectName).pdb - d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib + d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib;wsock32.lib NotSet false - MultiplyDefinedSymbolOnly - - - Run postbuild script - powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - - - Use - Level3 - ProgramDatabase - Disabled - Sync - true - $(OutDir)$(ProjectName).pch - MultiThreadedDebugDLL - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) - Disabled - Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - EnableFastChecks - false - true - true - $(ForcedInc) - $(SlashAI) - false - false - - - true - $(OutDir)$(ProjectName).pdb - ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Debug\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib - NotSet - true - Console - true - - - false - false - Default - kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib $(ProjectDir)xbox\xex-dev.xml @@ -1374,62 +1440,34 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res -xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font -xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media -xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound -xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music -xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ -xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ -xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose -xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" - Copying files for deployment + Run post-build script - - Package.appxmanifest - - - call $(ProjectDir)\Build\XboxOne\AppxPrebuild.cmd $(ProjectDir) - - - /VM %(AdditionalOptions) - - - call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) - $(ProjectDir)\Durango\Autogenerated.appxmanifest - Creating Autogenerated.appxmanifest - $(ProjectDir)\Durango\manifest.xml - true - - + Use Level3 ProgramDatabase - Full + Disabled Sync false $(OutDir)$(ProjectName).pch - MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + MultiThreadedDebug + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) Disabled Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) true true Default false - Speed true $(OutDir)$(ProjectName).pdb - d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib NotSet false @@ -1452,86 +1490,44 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU$(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - Use - Level3 - ProgramDatabase - Full - Sync - false - $(OutDir)$(ProjectName).pch - MultiThreaded - _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) - Disabled - Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - true - true - Default - false - Speed - - - true - $(OutDir)$(ProjectName).pdb - d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) - NotSet - false - - - $(ProjectDir)xbox\xex-dev.xml - - - 1480659447 - - - 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO - true - - - CopyToHardDrive - $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp - - - + Use Level3 ProgramDatabase - MaxSpeed + Disabled Sync true $(OutDir)$(ProjectName).pch - MultiThreadedDLL - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;PROFILE;NDEBUG;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_DEBUG;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions) Disabled Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) true true - Default + EnableFastChecks false - Speed true true $(ForcedInc) - false + $(SlashAI) + false false true $(OutDir)$(ProjectName).pdb - ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Release\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib + ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Debug\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib NotSet true Console + true - true - true - - - kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib + false + false Default + kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib $(ProjectDir)xbox\xex-dev.xml @@ -1555,11 +1551,269 @@ xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\C xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU + + + Copying files for deployment + + + Package.appxmanifest + + + call $(ProjectDir)\Build\XboxOne\AppxPrebuild.cmd $(ProjectDir) + + + /VM %(AdditionalOptions) + + + call $(ProjectDir)\DurangoBuild\AppxPrebuild.cmd $(ProjectDir) + $(ProjectDir)\Durango\Autogenerated.appxmanifest + Creating Autogenerated.appxmanifest + $(ProjectDir)\Durango\manifest.xml + true + + + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + legacy_stdio_definitions.lib;d3d11.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + Run postbuild script + powershell -ExecutionPolicy Bypass -File "$(ProjectDir)postbuild.ps1" -OutDir "$(OutDir)/" -ProjectDir "$(ProjectDir)/" + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + + + Use + Level3 + ProgramDatabase + MaxSpeed + Sync + true + $(OutDir)$(ProjectName).pch + MultiThreadedDLL + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;PROFILE;NDEBUG;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) + Disabled + Durango\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + true + true + $(ForcedInc) + false + false + + + true + $(OutDir)$(ProjectName).pdb + ws2_32.lib;pixEvt.lib;d3d11_x.lib;combase.lib;kernelx.lib;uuid.lib;xaudio2.lib;..\Minecraft.World\Durango_Release\Minecraft.World.lib;EtwPlus.lib;..\Minecraft.Client\Durango\DurangoExtras\xcompress.lib + NotSet + true + Console + + + true + true + + + kernel32.lib;oldnames.lib;runtimeobject.lib;ole32.lib + Default + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + xcopy /q /y /i /s /e $(ProjectDir)Common\res $(LayoutDir)Image\Loose\Common\res +xcopy /q /y /i /s /e $(ProjectDir)Common\media\font\*.ttf $(LayoutDir)Image\Loose\Common\media\font +xcopy /q /y $(ProjectDir)Durango\*.png $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)Common\media\MediaDurango.arc $(LayoutDir)Image\Loose\Common\media +xcopy /q /y /i /s /e $(ProjectDir)Durango\Sound $(LayoutDir)Image\Loose\Sound +xcopy /q /y /i /s /e $(ProjectDir)music $(LayoutDir)Image\Loose\music +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial +copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Loose\ +xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ +xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose +xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU Copying files for deployment @@ -2088,18 +2342,19 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" false $(OutDir)$(ProjectName).pch MultiThreaded - _EXTENDED_ACHIEVEMENTS;_RELEASE_FOR_ART;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) + _EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) true true Disabled Default 1700;613;1011 -Xpch_override=1 %(AdditionalOptions) - PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - Level2 - false + PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + Level3 + true Branchless2 Cpp11 + true true @@ -2107,7 +2362,7 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" false $(OutDir)default.pdb true - $(OutDir)Minecraft.World.a + -lSceDbg_stub;-lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-lSceDbgFont;-lSceRazorCapture_stub_weak;-lSceSysmodule_stub;-lSceDeflt;-lScePng;$(OutDir)Minecraft.World.a;libSceRtc_stub.a;libSceFios2_stub_weak.a;libSceCes.a;libScePerf_stub.a;libScePerf_stub_weak.a;libSceUlt_stub.a;libSceUlt_stub_weak.a;libSceNpManager_stub_weak.a;libSceNpCommon_stub_weak.a;libSceHttp_stub.a;libSceNpTrophy_stub.a;libSceNpScore_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_stub.a;libScePower_stub.a;libSceAppUtil_stub.a;libSceAppMgr_stub.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2.a;..\Minecraft.Client\PSVita\Miles\lib\binkapsp2.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2midi.a;..\Minecraft.Client\PSVita\Miles\lib\fltpsp2.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a xapilib.lib false false @@ -2115,6 +2370,7 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" None --strip-duplicates StripFuncsAndData + StripSymsAndDebug $(ProjectDir)xbox\xex.xml @@ -2254,6 +2510,46 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + Level3 @@ -2294,6 +2590,46 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_CONTENT_PACKAGE;%(PreprocessorDefinitions) + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + Level3 @@ -2334,6 +2670,46 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + Level3 @@ -2374,6 +2750,46 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + Level3 @@ -2429,7 +2845,8 @@ copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Lo xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU Copying files for deployment @@ -2753,7 +3170,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU StripFuncsAndData - ..\Minecraft.World\ORBIS_ReleaseForArt\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input_r.a;Orbis\4JLibs\libs\4J_Storage_r.a;Orbis\4JLibs\libs\4J_Profile_r.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak + ..\Minecraft.World\ORBIS_ReleaseForArt\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input_r.a;Orbis\4JLibs\libs\4J_Storage_r.a;Orbis\4JLibs\libs\4J_Profile_r.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak;-lSceGameLiveStreaming_stub_weak @@ -2836,12 +3253,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -2881,12 +3305,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -2926,12 +3357,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -2947,6 +3385,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + Document + true @@ -2979,12 +3420,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3024,12 +3472,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3068,12 +3523,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3113,12 +3575,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3158,12 +3627,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3203,12 +3679,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3240,12 +3723,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3274,12 +3764,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3316,12 +3813,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -3333,7 +3837,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -3341,6 +3847,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -3355,8 +3862,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -3373,7 +3883,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -3381,6 +3893,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -3395,8 +3908,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -3405,12 +3921,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3443,12 +3966,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3481,12 +4011,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3519,12 +4056,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3557,12 +4101,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3595,12 +4146,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3633,12 +4191,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3671,12 +4236,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3709,12 +4281,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3747,12 +4326,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3785,12 +4371,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3846,12 +4439,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3883,12 +4483,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3915,12 +4522,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -3946,12 +4560,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -3967,18 +4588,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -4005,18 +4633,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -4124,9 +4759,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU Designer true + true true true + true true + true true true true @@ -4178,18 +4816,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -4216,18 +4861,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -4264,7 +4916,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -4272,7 +4926,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -4288,16 +4971,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + + + + @@ -4306,9 +4994,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -4363,7 +5054,68 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + @@ -4405,15 +5157,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4427,15 +5183,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4449,15 +5209,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4471,15 +5235,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4506,12 +5274,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -4523,15 +5298,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4545,15 +5324,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4580,6 +5363,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -4587,6 +5371,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -4609,13 +5394,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + + + + @@ -4644,6 +5435,60 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true true @@ -4694,7 +5539,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4710,7 +5555,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4726,7 +5571,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4742,7 +5587,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4758,7 +5603,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4774,7 +5619,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4790,7 +5635,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4806,7 +5651,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4822,7 +5667,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4838,7 +5683,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4854,7 +5699,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4868,6 +5713,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + false true @@ -4879,7 +5725,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4908,12 +5754,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -5183,12 +6036,28 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true + + + true + true + true + true + true + true + true true @@ -5360,7 +6229,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5383,12 +6252,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false false + false false false false false false + false false false false @@ -5402,8 +6274,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false false + false false + false false @@ -5416,7 +6291,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5432,7 +6307,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5448,7 +6323,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5464,7 +6339,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5480,7 +6355,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5496,7 +6371,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5512,7 +6387,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5528,7 +6403,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5544,7 +6419,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5560,7 +6435,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -6007,6 +6882,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true true @@ -6262,6 +7146,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + true @@ -6279,10 +7164,115 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true true + true true + true true true true @@ -6311,16 +7301,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true true true @@ -6349,20 +7345,30 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true + true true + true true + true true + true true true true @@ -6389,14 +7395,225 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true true + true true + true true + true true + true true + true true + true true true true @@ -6425,8 +7642,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -6455,8 +7675,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false @@ -6484,12 +7707,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -6505,7 +7735,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true @@ -6513,18 +7745,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true false true true true true true + true false true true true true true + true true true @@ -6792,9 +8027,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true @@ -6810,7 +8048,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -6818,7 +8058,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -6833,7 +8102,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -6841,7 +8112,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -6859,12 +8159,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true + @@ -6893,12 +8197,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -6930,12 +8241,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -6967,12 +8285,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7004,12 +8329,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7050,12 +8382,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7090,11 +8429,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true true true @@ -7174,12 +8519,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7232,12 +8584,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7269,12 +8628,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7306,12 +8672,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7343,12 +8716,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7373,12 +8753,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7417,12 +8804,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7461,12 +8855,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7493,9 +8894,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7524,9 +8929,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7561,9 +8970,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7596,9 +9009,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7631,9 +9048,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7665,12 +9086,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7710,12 +9138,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7733,12 +9168,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7763,12 +9205,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7793,12 +9242,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7823,12 +9279,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7853,12 +9316,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7883,12 +9353,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7914,12 +9391,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7937,18 +9421,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true false false false false false true + true false true + true true + true false false true @@ -7989,12 +9480,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false @@ -8026,12 +9524,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8061,6 +9566,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -8079,7 +9585,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -8087,7 +9595,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -8099,6 +9636,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -8117,7 +9655,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -8125,7 +9665,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -8137,47 +9706,67 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + + false + false false false + false false + false false false + false + false false false + false false + false false false false + false false false + false false + false false false false + false false false + false false + false false false false + false false false + false false + false false false @@ -8217,12 +9806,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8254,12 +9850,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8288,12 +9891,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8322,12 +9932,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8356,12 +9973,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8390,12 +10014,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8424,12 +10055,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8458,61 +10096,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true true - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true true @@ -8544,12 +10145,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8589,12 +10197,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -8627,12 +10242,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -8665,12 +10287,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8709,12 +10338,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8728,6 +10364,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -8736,13 +10373,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true true true + true true true true @@ -8757,6 +10397,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -8773,11 +10414,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true @@ -8804,12 +10448,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8848,12 +10499,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8867,6 +10525,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -8883,11 +10542,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true @@ -8897,7 +10559,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -8911,10 +10575,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true true true @@ -8931,6 +10600,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false false @@ -8940,6 +10610,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -8969,12 +10640,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9018,12 +10696,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9063,12 +10748,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9108,12 +10800,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9139,12 +10838,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9187,12 +10893,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9215,9 +10928,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -9240,7 +10957,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -9248,6 +10967,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -9262,8 +10982,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -9300,12 +11023,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9345,12 +11075,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9390,12 +11127,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9435,12 +11179,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9480,12 +11231,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9525,12 +11283,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9570,12 +11335,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9615,12 +11387,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9629,17 +11408,20 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - + + true + true true true + true true + true true true @@ -9647,18 +11429,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -9671,18 +11460,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -9695,18 +11491,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -9719,18 +11522,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -9753,10 +11563,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true true true @@ -9782,7 +11597,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -9790,6 +11607,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -9804,8 +11622,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -9866,46 +11687,6 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true true @@ -9916,7 +11697,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -9924,6 +11707,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -9938,8 +11722,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -9948,12 +11735,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -9986,12 +11780,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -10024,18 +11825,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10062,8 +11870,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -10099,12 +11910,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -10146,12 +11964,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -10162,8 +11987,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -10194,18 +12022,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true + true true true true true true + true true true true @@ -10220,8 +12052,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -10249,12 +12084,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -10273,12 +12115,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -10318,12 +12167,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -10360,7 +12216,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -10368,6 +12226,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -10382,8 +12241,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -10400,7 +12262,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -10408,6 +12272,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -10422,8 +12287,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -10432,18 +12300,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10470,18 +12345,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10532,11 +12414,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false false false @@ -10549,18 +12437,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10603,18 +12498,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10646,9 +12548,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -10677,7 +12583,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -10685,6 +12593,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -10699,8 +12608,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -10709,18 +12621,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10747,18 +12666,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10778,18 +12704,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10816,18 +12749,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10854,18 +12794,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10892,18 +12839,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10930,18 +12884,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10968,12 +12929,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11006,12 +12974,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11044,12 +13019,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11082,12 +13064,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11120,12 +13109,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11158,12 +13154,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11196,12 +13199,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11234,12 +13244,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11272,12 +13289,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11310,12 +13334,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11348,12 +13379,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11386,12 +13424,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11424,12 +13469,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11462,12 +13514,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11500,12 +13559,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11538,12 +13604,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11576,12 +13649,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11614,12 +13694,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11652,12 +13739,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11690,12 +13784,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11728,12 +13829,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11766,12 +13874,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11804,12 +13919,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11842,12 +13964,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11880,12 +14009,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11918,12 +14054,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11956,12 +14099,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11994,12 +14144,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12032,12 +14189,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12070,12 +14234,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12108,12 +14279,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12146,12 +14324,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12184,12 +14369,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12222,12 +14414,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12260,12 +14459,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12298,12 +14504,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12336,12 +14549,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12374,12 +14594,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12412,12 +14639,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12450,12 +14684,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12488,12 +14729,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12526,12 +14774,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12564,12 +14819,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12602,12 +14864,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12640,12 +14909,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12678,12 +14954,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12716,12 +14999,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12754,12 +15044,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12792,12 +15089,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12830,12 +15134,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12868,12 +15179,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12906,12 +15224,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12944,12 +15269,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12982,12 +15314,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13020,12 +15359,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13058,12 +15404,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13096,12 +15449,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13134,12 +15494,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13172,12 +15539,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13210,12 +15584,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13248,12 +15629,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13286,12 +15674,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13324,12 +15719,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13362,12 +15764,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13400,12 +15809,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13438,12 +15854,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13476,12 +15899,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13514,12 +15944,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13552,12 +15989,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13590,12 +16034,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13628,12 +16079,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13666,12 +16124,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13704,12 +16169,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13742,12 +16214,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13780,12 +16259,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13818,12 +16304,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13856,12 +16349,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13894,12 +16394,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13932,12 +16439,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13970,12 +16484,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -14008,12 +16529,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -14053,7 +16581,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -14061,6 +16591,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true false @@ -14068,7 +16599,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -14102,12 +16635,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14139,12 +16679,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14176,12 +16723,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14213,12 +16767,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14251,12 +16812,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14288,12 +16856,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14325,12 +16900,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14362,12 +16944,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14399,12 +16988,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14436,12 +17032,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14473,49 +17076,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true + true true true true @@ -14547,12 +17120,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14584,12 +17164,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14628,12 +17215,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -14665,12 +17259,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14702,12 +17303,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14741,12 +17349,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14778,12 +17393,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14815,12 +17437,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14852,12 +17481,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14896,12 +17532,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -14933,12 +17576,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -14963,12 +17613,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15000,12 +17657,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15037,12 +17701,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15074,12 +17745,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15111,12 +17789,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15148,12 +17833,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15185,12 +17877,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15222,12 +17921,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15259,12 +17965,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15274,50 +17987,6 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true true @@ -15348,12 +18017,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -15385,12 +18061,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15422,12 +18105,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15459,12 +18149,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15496,12 +18193,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15533,12 +18237,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15570,12 +18281,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15588,13 +18306,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true + @@ -15605,9 +18327,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -15616,9 +18341,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -15654,6 +18382,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -15665,6 +18394,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + @@ -15683,9 +18414,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false true false + false false + false true true false @@ -15735,7 +18469,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -15743,9 +18479,39 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + @@ -15758,6 +18524,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -15770,7 +18537,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -15778,7 +18547,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -15807,12 +18605,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true @@ -15831,12 +18636,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true @@ -15855,12 +18667,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true @@ -15879,12 +18698,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true @@ -15903,12 +18729,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16162,12 +18995,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16241,12 +19081,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16286,12 +19133,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16362,12 +19216,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16407,12 +19268,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16452,12 +19320,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16497,12 +19372,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16542,12 +19424,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16587,12 +19476,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16632,12 +19528,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16677,12 +19580,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16746,12 +19656,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16760,23 +19677,35 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + + + + true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -16803,18 +19732,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -16841,18 +19777,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -16879,18 +19822,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -16921,9 +19871,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -16951,9 +19904,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -16981,9 +19937,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17011,18 +19970,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -17067,12 +20033,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true true true + true false true true @@ -17081,8 +20050,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false @@ -17118,12 +20090,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false false false false @@ -17140,11 +20119,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true true @@ -17155,8 +20137,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -17174,9 +20159,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17684,9 +20672,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17714,9 +20705,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17744,9 +20738,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17774,9 +20771,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17804,9 +20804,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17834,15 +20837,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -17889,18 +20899,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -17935,7 +20952,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true @@ -17943,6 +20962,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true false true true @@ -17957,26 +20977,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -18003,18 +21033,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -18041,15 +21078,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18083,15 +21127,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18125,15 +21176,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18167,15 +21225,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18209,15 +21274,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18251,15 +21323,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18293,15 +21372,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18335,15 +21421,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18377,15 +21470,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18419,15 +21519,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18461,15 +21568,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18503,15 +21617,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18545,15 +21666,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18587,15 +21715,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18629,15 +21764,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18671,15 +21813,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18713,15 +21862,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18755,15 +21911,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18797,15 +21960,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18839,15 +22009,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18881,15 +22058,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18923,15 +22107,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18965,15 +22156,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19007,15 +22205,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19049,15 +22254,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19091,15 +22303,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19133,15 +22352,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19175,15 +22401,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19217,15 +22450,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19259,15 +22499,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19301,15 +22548,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19343,15 +22597,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19385,15 +22646,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19427,15 +22695,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19469,15 +22744,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19511,15 +22793,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19553,15 +22842,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19595,15 +22891,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19637,15 +22940,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19679,15 +22989,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19721,15 +23038,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19763,15 +23087,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19805,15 +23136,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19847,15 +23185,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19889,15 +23234,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19931,15 +23283,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19973,15 +23332,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20015,15 +23381,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20057,15 +23430,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20099,15 +23479,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20141,15 +23528,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20183,15 +23577,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20225,15 +23626,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20267,15 +23675,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20309,15 +23724,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20351,15 +23773,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20393,15 +23822,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20435,15 +23871,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20477,15 +23920,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20519,15 +23969,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20561,15 +24018,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20603,15 +24067,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20645,15 +24116,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20687,15 +24165,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20729,15 +24214,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20771,15 +24263,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20813,15 +24312,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20855,15 +24361,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20897,15 +24410,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20939,15 +24459,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20981,15 +24508,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21023,15 +24557,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21065,15 +24606,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21107,15 +24655,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21149,15 +24704,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21191,15 +24753,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21233,15 +24802,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21275,15 +24851,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21317,8 +24900,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -21347,23 +24933,33 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21397,15 +24993,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21439,15 +25042,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21493,7 +25103,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -21501,13 +25113,38 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true - - true - NotUsing - @@ -21521,16 +25158,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + + + + @@ -21539,9 +25181,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -21571,6 +25216,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false @@ -21611,7 +25257,68 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -21650,15 +25357,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -21672,15 +25383,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -21694,15 +25409,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -21729,12 +25448,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -21773,12 +25499,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -21790,15 +25523,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -21824,6 +25561,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -21831,6 +25569,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -21845,13 +25584,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + + + + @@ -21886,6 +25631,60 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true true @@ -21936,7 +25735,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -21952,7 +25751,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -21968,7 +25767,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -21984,7 +25783,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22000,7 +25799,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22016,7 +25815,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22032,7 +25831,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22048,7 +25847,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22064,7 +25863,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22080,7 +25879,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22096,7 +25895,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22110,6 +25909,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + false true @@ -22121,7 +25921,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22150,12 +25950,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -22425,12 +26232,28 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true + + + true + true + true + true + true + true + true true @@ -22586,7 +26409,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22609,12 +26432,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false false + false false false false false false + false false false false @@ -22628,8 +26454,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false false + false false + false false @@ -22642,7 +26471,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22658,7 +26487,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22674,7 +26503,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22690,7 +26519,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22706,7 +26535,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22722,7 +26551,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22738,7 +26567,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22754,7 +26583,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22770,7 +26599,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22786,7 +26615,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -23224,6 +27053,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true true @@ -23479,6 +27317,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + true true @@ -23495,10 +27334,115 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true true + true true + true true true true @@ -23527,16 +27471,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true true true @@ -23565,20 +27515,30 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true + true true + true true + true true + true true true true @@ -23605,14 +27565,225 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true true + true true + true true + true true + true true + true true + true true true true @@ -23641,8 +27812,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -23671,8 +27845,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false @@ -23700,12 +27877,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -23721,7 +27905,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -23729,18 +27915,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true true true true true true + true true true true @@ -23771,12 +27960,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23818,12 +28014,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23863,12 +28066,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23908,12 +28118,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23953,12 +28170,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24005,12 +28229,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24057,12 +28288,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24109,12 +28347,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24161,12 +28406,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24206,12 +28458,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24251,12 +28510,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24296,12 +28562,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24341,12 +28614,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24386,12 +28666,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24431,12 +28718,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24454,12 +28748,18 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + NotUsing + true + true true true + true true + true true true @@ -24474,7 +28774,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -24482,7 +28784,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -24497,7 +28828,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -24505,7 +28838,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -24516,18 +28878,72 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true true + true true + true true true + @@ -24563,12 +28979,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -24601,12 +29024,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -24641,11 +29071,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true true true @@ -24664,7 +29100,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -24672,6 +29110,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false false @@ -24686,8 +29125,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -24703,7 +29145,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -24711,6 +29155,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false false @@ -24725,8 +29170,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -24755,12 +29203,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -24778,18 +29233,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true false false false false false true + true false true + true true + true false false true @@ -24837,12 +29299,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -24881,12 +29350,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -24918,12 +29394,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false @@ -24955,12 +29438,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -24999,12 +29489,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25031,9 +29528,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25079,12 +29580,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25123,12 +29631,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25167,12 +29682,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25211,12 +29733,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25239,9 +29768,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25276,9 +29809,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25311,9 +29848,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25346,9 +29887,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25393,12 +29938,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false @@ -25430,12 +29982,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25444,268 +30003,318 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - - - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - true - true - true - - - - - - - - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - - - - - - - - - - - Disabled - Disabled - Disabled - Disabled - false - false - - - - - - - - - false - false - false - false - false - false - - - false - false - false - false - false - false - - - - - - - - - - false - false - false - false - false - false - - - false - false - false - false - false - false - - - false - false - false - false - false - false - - - false - false - false - false - false - false - - - - - - - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + true + true + true + + + + + + + + + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + + + + + + + + + + + + Disabled + Disabled + Disabled + Disabled + false + false + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + false + false + false + false + false + false + false + false + false + + + + + + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true @@ -25737,12 +30346,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25781,12 +30397,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25800,6 +30423,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -25808,13 +30432,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true true true + true true true true @@ -25829,6 +30456,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -25845,11 +30473,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true @@ -25876,12 +30507,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25920,12 +30558,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25939,6 +30584,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -25955,11 +30601,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true @@ -25968,13 +30617,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true + true true true true @@ -25986,9 +30638,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -26028,12 +30684,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26073,12 +30736,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26118,12 +30788,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26163,12 +30840,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26191,9 +30875,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -26216,7 +30904,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -26224,6 +30914,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -26238,8 +30929,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -26268,12 +30962,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26305,12 +31006,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26342,12 +31050,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26356,8 +31071,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - + + @@ -26367,9 +31082,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -26392,10 +31110,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true true true @@ -26435,12 +31158,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false false true @@ -26462,7 +31192,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -26470,6 +31202,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -26484,48 +31217,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true + true true true true @@ -26542,7 +31238,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -26550,6 +31248,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -26564,8 +31263,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -26574,8 +31276,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -26611,12 +31316,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26658,12 +31370,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26674,8 +31393,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -26706,18 +31428,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true + true true true true true true + true true true true @@ -26754,12 +31480,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false true true @@ -26771,12 +31504,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -26816,12 +31556,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26858,7 +31605,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -26866,6 +31615,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -26880,8 +31630,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -26890,18 +31643,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -26952,11 +31712,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false false false @@ -26969,18 +31735,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -27007,18 +31780,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -27045,18 +31825,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -27088,9 +31875,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -27119,7 +31910,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -27135,8 +31928,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -27145,18 +31941,26 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true true + true true + true true + true true + true true + true true + true true + true true true true @@ -27189,50 +31993,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true + true true true true @@ -27265,12 +32038,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27303,12 +32083,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27341,12 +32128,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27379,12 +32173,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27417,12 +32218,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27455,12 +32263,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27493,12 +32308,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27531,12 +32353,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27569,12 +32398,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27607,12 +32443,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27645,12 +32488,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27683,12 +32533,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27721,12 +32578,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27759,12 +32623,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27797,12 +32668,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27842,7 +32720,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -27850,6 +32730,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true false @@ -27857,7 +32738,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -27891,49 +32774,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true + true true true true @@ -27965,12 +32818,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28002,12 +32862,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28046,12 +32913,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28083,12 +32957,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28120,12 +33001,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28157,12 +33045,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28171,192 +33066,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - + true true true @@ -28378,20 +33088,20 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true - false - false - false - false - false - false - false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28400,7 +33110,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + true true true @@ -28423,12 +33133,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28437,7 +33154,95 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + true true true @@ -28460,12 +33265,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28474,7 +33286,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + true true true @@ -28496,13 +33308,27 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + false + false + false + false + false + false + false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28511,7 +33337,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + true true true @@ -28534,12 +33360,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28548,7 +33381,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + true true true @@ -28571,12 +33404,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28585,7 +33425,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + true true true @@ -28607,20 +33447,20 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true - false - false - false - false - false - false - false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28629,35 +33469,51 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true + + true + true + true + true + true + true + true true - true + true true true true - true - true + true + true true - true + true true true true - true - true + true + true true - true + true + true + true true + true true + true true - true - true + true + true + true + true + true true - true + true true true true + true + true + + true true true @@ -28665,8 +33521,43 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true - + true true true @@ -28696,12 +33587,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28710,6 +33608,50 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true @@ -28740,12 +33682,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28756,9 +33705,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true @@ -28781,6 +33733,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -28792,6 +33745,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + @@ -28809,9 +33764,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false false @@ -28851,9 +33809,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUCreate Create Create + Create Create Create + Create Create + Create Create Create Create @@ -28869,18 +33830,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUCreate Create Create + Create Create + Create Create + Create Create + Create Create Create Create Create Create false + false false false + false false + false false false Create @@ -28929,7 +33897,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -28937,9 +33907,39 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + @@ -28952,6 +33952,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -28964,7 +33965,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -28972,7 +33975,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -29024,12 +34056,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false + false false + false false + false false + false false + false false + false true true true @@ -29081,12 +34120,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -29126,12 +34172,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -29237,17 +34290,29 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + + + + true + true true + true true + true true + true true + true true + true true + true true true true @@ -29280,9 +34345,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29310,9 +34378,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29340,9 +34411,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29388,12 +34462,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true true true + true false true true @@ -29402,8 +34479,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false @@ -29438,12 +34518,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false false false false @@ -29460,11 +34547,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true true @@ -29475,8 +34565,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -29484,9 +34577,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29514,9 +34610,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29553,9 +34652,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUNotUsing NotUsing NotUsing + NotUsing NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -29571,18 +34673,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUNotUsing NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing true + true true true + true true + true true true true @@ -29610,15 +34719,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -29648,15 +34764,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -29686,15 +34809,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -29732,7 +34862,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true @@ -29740,6 +34872,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true false true true @@ -29754,26 +34887,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -29800,15 +34943,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -29842,15 +34992,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -29884,15 +35041,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -29926,15 +35090,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -29968,15 +35139,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30010,15 +35188,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30052,15 +35237,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30094,15 +35286,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30136,15 +35335,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30178,15 +35384,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30220,15 +35433,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30262,15 +35482,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30304,15 +35531,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30346,15 +35580,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30388,15 +35629,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30430,15 +35678,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30472,15 +35727,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30514,15 +35776,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30556,15 +35825,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30598,15 +35874,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30640,15 +35923,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30682,15 +35972,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30724,15 +36021,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30766,15 +36070,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30808,15 +36119,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30850,15 +36168,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30892,15 +36217,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30934,15 +36266,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30976,15 +36315,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31018,15 +36364,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31060,15 +36413,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31102,15 +36462,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31158,15 +36525,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31200,15 +36574,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31242,15 +36623,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31284,15 +36672,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31326,15 +36721,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31368,15 +36770,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31410,15 +36819,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31452,15 +36868,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31494,15 +36917,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31536,15 +36966,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31578,15 +37015,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31620,15 +37064,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31662,15 +37113,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31704,15 +37162,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31746,15 +37211,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31788,15 +37260,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31830,15 +37309,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31872,15 +37358,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31914,15 +37407,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31956,15 +37456,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31998,15 +37505,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32040,15 +37554,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32082,15 +37603,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32124,15 +37652,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32166,15 +37701,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32208,15 +37750,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32250,15 +37799,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32292,15 +37848,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32334,15 +37897,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32376,15 +37946,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32418,15 +37995,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32460,15 +38044,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32502,15 +38093,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32544,15 +38142,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32586,15 +38191,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32628,15 +38240,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32670,15 +38289,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32712,15 +38338,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32754,15 +38387,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32796,15 +38436,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32838,15 +38485,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32880,15 +38534,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32922,15 +38583,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32964,15 +38632,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -33010,13 +38685,20 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true + true true + true true + true true + true true true true @@ -33030,14 +38712,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true true true + true true + true true + true true + true true + true true true true @@ -33078,12 +38767,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33115,12 +38811,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33153,12 +38856,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33198,12 +38908,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33214,9 +38931,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true false false true @@ -33234,9 +38954,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -33268,14 +38992,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true + true true + true true + true true + true true + true true true true @@ -33295,7 +39026,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -33303,12 +39036,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true @@ -33321,7 +39056,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -33329,12 +39066,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false true true true true + true true @@ -33347,7 +39086,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -33355,19 +39096,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true true true + true true + true true + true true true true @@ -33377,8 +39123,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true + true true + true true true true @@ -33389,8 +39138,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true + true true + true true true true @@ -33400,8 +39152,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true + true true + true true true true @@ -33411,13 +39166,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true @@ -33449,12 +39210,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33493,12 +39261,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33537,12 +39312,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33563,8 +39345,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33583,8 +39368,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33603,8 +39391,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33634,12 +39425,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33668,12 +39466,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33681,12 +39486,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33715,12 +39527,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33761,8 +39580,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33770,12 +39592,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33804,12 +39633,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33850,8 +39686,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33859,12 +39698,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33893,12 +39739,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33939,8 +39792,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33948,12 +39804,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33982,12 +39845,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -34028,8 +39898,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -34045,7 +39918,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -34053,6 +39928,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true @@ -34065,7 +39941,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -34073,6 +39951,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true @@ -34085,7 +39964,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -34093,12 +39974,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false true - true + false true false true @@ -34125,12 +40007,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34169,12 +40058,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34213,12 +40109,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34230,7 +40133,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false true - true + false true false true @@ -34257,12 +40160,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34301,12 +40211,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34345,12 +40262,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34362,139 +40286,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - false - true - true + false true false true @@ -34521,12 +40313,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34535,150 +40334,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - - - true - true - - - true - true - true - - - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - + + true + true + true + true + true + false + true true true true @@ -34701,12 +40364,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34715,22 +40385,310 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true + + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true - - + true + true + true true + true + true + true + true + true + true + true + true + true + true + + + false + true + false + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true - + + true + true + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + false + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true @@ -34741,12 +40699,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true false + false false + false true + true true true true @@ -34772,12 +40737,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true false + false true true true @@ -34810,12 +40782,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true false + false false + false true + true true true true @@ -34855,12 +40834,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false true + true true + true false + false true true true @@ -34879,7 +40865,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false true true true @@ -34887,20 +40875,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true true true true true true + true true true + true true @@ -34913,7 +40905,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -34921,20 +40915,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false true true true true true true + true true true true true true true + true true true + true true @@ -35070,18 +41068,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35113,18 +41118,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35153,8 +41165,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -35168,18 +41183,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35210,18 +41232,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35250,10 +41279,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true true true + true true @@ -35267,15 +41299,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -35311,18 +41350,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35346,18 +41392,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35388,18 +41441,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35428,10 +41488,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true true true + true true @@ -35464,12 +41527,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35508,12 +41578,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false true true @@ -35526,18 +41603,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35581,9 +41665,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -35599,9 +41687,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true + true true + true true true @@ -35657,12 +41748,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35697,12 +41795,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35737,12 +41842,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35791,12 +41903,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35824,12 +41943,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35864,12 +41990,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35904,12 +42037,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35944,12 +42084,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35984,12 +42131,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36024,12 +42178,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36066,12 +42227,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36106,12 +42274,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36146,12 +42321,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36198,12 +42380,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36233,12 +42422,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36273,12 +42469,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36313,12 +42516,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36353,12 +42563,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36393,12 +42610,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36433,12 +42657,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36471,12 +42702,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36510,12 +42748,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36549,12 +42794,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36606,12 +42858,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36633,12 +42892,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36672,12 +42938,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36711,12 +42984,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36750,12 +43030,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36789,12 +43076,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36828,12 +43122,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36860,20 +43161,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue

- - - + - + Durango\Network\windows.xbox.networking.realtimesession.winmd true - + + \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.filters b/Minecraft.Client/Minecraft.Client.vcxproj.filters index 451dec44..ab31a46e 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.filters +++ b/Minecraft.Client/Minecraft.Client.vcxproj.filters @@ -723,6 +723,9 @@ {0061db22-43de-4b54-a161-c43958cdcd7e} + + {889a84db-3009-4a7c-8234-4bf93d412690} + @@ -2434,15 +2437,9 @@ Common - - net\minecraft\client\model - net\minecraft\client\model - - net\minecraft\client\renderer\entity - net\minecraft\client\renderer\entity @@ -3193,9 +3190,6 @@ PS3\Source Files\Leaderboards - - PS3\Source Files\Leaderboards - Common\Source Files\Leaderboards @@ -3466,18 +3460,12 @@ PSVita - - PSVita\Source Files - PSVita\GameConfig Orbis\Network - - Orbis\Source Files\Leaderboards - Common\Source Files\UI\Scenes\Debug @@ -3574,9 +3562,6 @@ PSVita\Source Files\Network - - PSVita\Source Files\Leaderboards - PSVita\Source Files\Leaderboards @@ -3628,6 +3613,162 @@ Common\Source Files\UI\Scenes + + Common\Source Files\Leaderboards + + + Common\Source Files\Leaderboards + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\particle + + + net\minecraft\client\resources + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + net\minecraft\client\model + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Common\Source Files\UI\All Platforms + + + Xbox\Source Files\XUI\Containers + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI + + + Common\Source Files\UI\Controls + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\Leaderboards + @@ -4812,15 +4953,9 @@ net\minecraft\client\renderer\entity - - net\minecraft\client\renderer\entity - net\minecraft\client\model - - net\minecraft\client\model - Xbox\Source Files\Audio @@ -4839,9 +4974,6 @@ PS3\ChunkRebuild_SPU - - PS3\ChunkRebuild_SPU - PS3\ChunkRebuild_SPU @@ -5268,9 +5400,6 @@ PS3\Source Files\Leaderboards - - PS3\Source Files\Leaderboards - Common\Source Files\Leaderboards @@ -5490,9 +5619,6 @@ PSVita - - PSVita\Source Files - PSVita\Source Files @@ -5505,9 +5631,6 @@ Common\Source Files\Network\Sony - - Orbis\Source Files\Leaderboards - Common\Source Files\UI\Scenes\Debug @@ -5598,9 +5721,6 @@ PSVita\Source Files\Network - - PSVita\Source Files\Leaderboards - PSVita\Source Files\Leaderboards @@ -5640,7 +5760,160 @@ Common\Source Files\UI\Scenes - + + Common\Source Files\Leaderboards + + + Common\Source Files\Leaderboards + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\particle + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + net\minecraft\client\model + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Common\Source Files\UI\All Platforms + + + Xbox\Source Files\XUI\Containers + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Controls + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\Leaderboards + + Source Files @@ -5870,25 +6143,13 @@ PSVita\Iggy\Lib - - PSVita\Miles Sound System\lib - - - PSVita\Miles Sound System\lib - - - PSVita\Miles Sound System\lib - - - PSVita\Miles Sound System\lib - Xbox\4JLibs\libs Xbox\4JLibs\libs - + @@ -6017,4 +6278,12 @@ + + + Source Files + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp index 3192410d..87f1b8be 100644 --- a/Minecraft.Client/Minecraft.cpp +++ b/Minecraft.Client/Minecraft.cpp @@ -61,6 +61,7 @@ #include "..\Minecraft.World\Villager.h" #include "..\Minecraft.World\SparseLightStorage.h" #include "..\Minecraft.World\SparseDataStorage.h" +#include "..\Minecraft.World\ChestTileEntity.h" #include "TextureManager.h" #ifdef _XBOX #include "Xbox\Network\NetworkPlayerXbox.h" @@ -73,6 +74,7 @@ #include "Orbis\Network\PsPlusUpsellWrapper_Orbis.h" #endif +// #define DISABLE_SPU_CODE // 4J Turning this on will change the graph at the bottom of the debug overlay to show the number of packets of each type added per fram //#define DEBUG_RENDER_SHOWS_PACKETS 1 //#define SPLITSCREEN_TEST @@ -103,8 +105,16 @@ int QuickSelectBoxWidth[3]= 111, 142 }; + +// 4J - TomK ToDo: these really shouldn't be magic numbers, it should read the hud position from flash. +int iToolTipOffset = 85; + #endif +ResourceLocation Minecraft::DEFAULT_FONT_LOCATION = ResourceLocation(TN_DEFAULT_FONT); +ResourceLocation Minecraft::ALT_FONT_LOCATION = ResourceLocation(TN_ALT_FONT); + + Minecraft::Minecraft(Component *mouseComponent, Canvas *parent, MinecraftApplet *minecraftApplet, int width, int height, bool fullscreen) { // 4J - added this block of initialisers @@ -294,7 +304,7 @@ void Minecraft::init() */ } catch (LWJGLException e) { // This COULD be because of a bug! A delay followed by a new attempt - // is supposed to fix it. + // is supposed getWorkingDirectoryto fix it. e.printStackTrace(); try { Thread.sleep(1000); @@ -311,7 +321,7 @@ void Minecraft::init() // glClearColor(0.2f, 0.2f, 0.2f, 1); - workingDirectory = getWorkingDirectory(); + workingDirectory = File(L"");//getWorkingDirectory(); levelSource = new McRegionLevelStorageSource(File(workingDirectory, L"saves")); // levelSource = new MemoryLevelStorageSource(); options = new Options(this, workingDirectory); @@ -320,8 +330,8 @@ void Minecraft::init() textures = new Textures(skins, options); //renderLoadingScreen(); - font = new Font(options, L"font/Default.png", textures, false, TN_DEFAULT_FONT, 23, 20, 8, 8, SFontData::Codepoints); - altFont = new Font(options, L"font/alternate.png", textures, false, TN_ALT_FONT, 16, 16, 8, 8); + font = new Font(options, L"font/Default.png", textures, false, &DEFAULT_FONT_LOCATION, 23, 20, 8, 8, SFontData::Codepoints); + altFont = new Font(options, L"font/alternate.png", textures, false, &ALT_FONT_LOCATION, 16, 16, 8, 8); //if (options.languageCode != null) { // Language.getInstance().loadLanguage(options.languageCode); @@ -390,16 +400,13 @@ void Minecraft::init() // openGLCapabilities = new OpenGLCapabilities(); // 4J - removed levelRenderer = new LevelRenderer(this, textures); + //textures->register(&TextureAtlas::LOCATION_BLOCKS, new TextureAtlas(Icon::TYPE_TERRAIN, TN_TERRAIN)); + //textures->register(&TextureAtlas::LOCATION_ITEMS, new TextureAtlas(Icon::TYPE_ITEM, TN_GUI_ITEMS)); textures->stitch(); glViewport(0, 0, width, height); particleEngine = new ParticleEngine(level, textures); - // try { // 4J - removed try/catch - bgLoader = new BackgroundDownloader(workingDirectory, this); - bgLoader->start(); - // } catch (Exception e) { - // } MemSect(31); checkGlError(L"Post startup"); @@ -483,53 +490,6 @@ void Minecraft::blit(int x, int y, int sx, int sy, int w, int h) t->end(); } -File Minecraft::getWorkingDirectory() -{ - if (workDir.getPath().empty()) workDir = getWorkingDirectory(L"minecraft"); - return workDir; -} - -File Minecraft::getWorkingDirectory(const wstring& applicationName) -{ -#if 0 - // 4J - original version - final String userHome = System.getProperty("user.home", "."); - final File workingDirectory; - switch (getPlatform()) { - case linux: - case solaris: - workingDirectory = new File(userHome, '.' + applicationName + '/'); - break; - case windows: - final String applicationData = System.getenv("APPDATA"); - if (applicationData != null) workingDirectory = new File(applicationData, "." + applicationName + '/'); - else workingDirectory = new File(userHome, '.' + applicationName + '/'); - break; - case macos: - workingDirectory = new File(userHome, "Library/Application Support/" + applicationName); - break; - default: - workingDirectory = new File(userHome, applicationName + '/'); - } - if (!workingDirectory.exists()) if (!workingDirectory.mkdirs()) throw new RuntimeException("The working directory could not be created: " + workingDirectory); - return workingDirectory; -#else - wstring userHome = L"home"; // 4J - TODO - File workingDirectory(userHome, applicationName); - // 4J Removed - //if (!workingDirectory.exists()) - //{ - // workingDirectory.mkdirs(); - //} - return workingDirectory; -#endif -} - -Minecraft::OS Minecraft::getPlatform() -{ - return xbox; -} - LevelStorageSource *Minecraft::getLevelSource() { return levelSource; @@ -537,8 +497,6 @@ LevelStorageSource *Minecraft::getLevelSource() void Minecraft::setScreen(Screen *screen) { - if( dynamic_cast(this->screen) != NULL ) return; - if (this->screen != NULL) { this->screen->removed(); @@ -631,15 +589,6 @@ void Minecraft::destroy() /*stats->forceSend(); stats->forceSave();*/ - // 4J - all try/catch/finally things in here removed - // try { - if (this->bgLoader != NULL) - { - bgLoader->halt(); - } - // } catch (Exception e) { - // } - // try { setLevel(NULL); // } catch (Throwable e) { @@ -651,8 +600,6 @@ void Minecraft::destroy() // } soundEngine->destroy(); - Mouse::destroy(); - Keyboard::destroy(); //} finally { Display::destroy(); // if (!hasCrashed) System.exit(0); //4J - removed @@ -1088,7 +1035,7 @@ shared_ptr Minecraft::createExtraLocalPlayer(int idx, co localplayers[idx]->setOnlineXuid(playerXUIDOnline); localplayers[idx]->setIsGuest(ProfileManager.IsGuest(idx)); - localplayers[idx]->displayName = ProfileManager.GetDisplayName(idx); + localplayers[idx]->m_displayName = ProfileManager.GetDisplayName(idx); localplayers[idx]->m_iScreenSection = tempScreenSection; @@ -1177,7 +1124,7 @@ void Minecraft::removeLocalPlayerIdx(int idx) updateXui = false; #endif // 4J Stu - Adding this back in for exactly the reason my comment above suggests it was added in the first place -#ifdef _XBOX_ONE +#if defined(_XBOX_ONE) || defined(__ORBIS__) g_NetworkManager.RemoveLocalPlayerByUserIndex(idx); #endif } @@ -1463,7 +1410,7 @@ void Minecraft::run_middle() else { UINT uiIDA[1] = { IDS_OK }; - ui.RequestMessageBox( IDS_CANTJOIN_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, i, NULL, NULL, app.GetStringTable() ); + ui.RequestErrorMessage( IDS_CANTJOIN_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, i); } } else @@ -1704,7 +1651,7 @@ void Minecraft::run_middle() { UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, i, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, i); } else if (ProfileManager.IsSignedIn(i) && !ProfileManager.IsSignedInLive(i)) { @@ -1712,14 +1659,14 @@ void Minecraft::run_middle() 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, i,&Minecraft::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, i,&Minecraft::MustSignInReturnedPSN, this); } else #endif { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA, 1, i, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA, 1, i); } } //else @@ -1755,14 +1702,14 @@ void Minecraft::run_middle() { firstEmptyUser = i; break; + } } - } // 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; - if(!InputManager.ButtonPressed(iPad)) continue; + bool isPadLocked = InputManager.IsPadLocked(iPad), isPadConnected = InputManager.IsPadConnected(iPad), buttonPressed = InputManager.ButtonPressed(iPad); + if (isPadLocked || !isPadConnected || !buttonPressed) continue; if(!ui.PressStartPlaying(firstEmptyUser)) { @@ -1897,7 +1844,6 @@ void Minecraft::run_middle() PIXBeginNamedEvent(0,"Light update"); - if (level != NULL) level->updateLights(); glEnable(GL_TEXTURE_2D); PIXEndNamedEvent(); @@ -1978,6 +1924,10 @@ void Minecraft::run_middle() } */ +#if PACKET_ENABLE_STAT_TRACKING + Packet::updatePacketStatsPIX(); +#endif + if (options->renderDebug) { //renderFpsMeter(tickDuraction); @@ -2278,7 +2228,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if (!pause && level != NULL) gameMode->tick(); MemSect(31); - glBindTexture(GL_TEXTURE_2D, textures->loadTexture(TN_TERRAIN));//L"/terrain.png")); + glBindTexture(GL_TEXTURE_2D, textures->loadTexture(TN_TERRAIN)); //L"/terrain.png")); MemSect(0); if( bFirst ) { @@ -2330,7 +2280,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if (screen == NULL && !ui.GetMenuDisplayed(iPad) ) { // 4J-PB - add some tooltips if required - int iA=-1, iB=-1, iX, iY=IDS_CONTROLS_INVENTORY, iLT=-1, iRT=-1, iLB=-1, iRB=-1; + int iA=-1, iB=-1, iX, iY=IDS_CONTROLS_INVENTORY, iLT=-1, iRT=-1, iLB=-1, iRB=-1, iLS=-1, iRS=-1; if(player->abilities.instabuild) { @@ -2344,10 +2294,12 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) int *piAction; int *piJump; int *piUse; + int *piAlt; unsigned int uiAction = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal( iPad ) ,MINECRAFT_ACTION_ACTION ); unsigned int uiJump = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal( iPad ) ,MINECRAFT_ACTION_JUMP ); unsigned int uiUse = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal( iPad ) ,MINECRAFT_ACTION_USE ); + unsigned int uiAlt = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal( iPad ) ,MINECRAFT_ACTION_SNEAK_TOGGLE ); // Also need to handle PS3 having swapped triggers/bumpers switch(uiAction) @@ -2407,6 +2359,16 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; } + switch(uiAlt) + { + default: + case _360_JOY_BUTTON_LSTICK_RIGHT: + piAlt=&iRS; + break; + + //TODO + } + if (player->isUnderLiquid(Material::water)) { *piJump=IDS_TOOLTIPS_SWIMUP; @@ -2418,6 +2380,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) *piUse=-1; *piAction=-1; + *piAlt=-1; // 4J-PB another special case for when the player is sleeping in a bed if (player->isSleeping() && (level != NULL) && level->isClientSide) @@ -2426,6 +2389,20 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } else { + if (player->isRiding()) + { + shared_ptr mount = player->riding; + + if ( mount->instanceof(eTYPE_MINECART) || mount->instanceof(eTYPE_BOAT) ) + { + *piAlt = IDS_TOOLTIPS_EXIT; + } + else + { + *piAlt = IDS_TOOLTIPS_DISMOUNT; + } + } + // no hit result, but we may have something in our hand that we can do something with shared_ptr itemInstance = player->inventory->getSelected(); @@ -2470,11 +2447,12 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } break; - case Item::milk_Id: + case Item::bucket_milk_Id: *piUse=IDS_TOOLTIPS_DRINK; break; case Item::fishingRod_Id: // use + case Item::emptyMap_Id: *piUse=IDS_TOOLTIPS_USE; break; @@ -2504,6 +2482,11 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if (bUseItem) *piUse=IDS_TOOLTIPS_COLLECT; break; + case Item::bucket_lava_Id: + case Item::bucket_water_Id: + *piUse=IDS_TOOLTIPS_EMPTY; + break; + case Item::boat_Id: case Tile::waterLily_Id: if (bUseItem) *piUse=IDS_TOOLTIPS_PLACE; @@ -2568,8 +2551,8 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) { switch (itemInstance->getItem()->id) { - case Tile::mushroom1_Id: - case Tile::mushroom2_Id: + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: case Tile::tallgrass_Id: case Tile::cactus_Id: case Tile::sapling_Id: @@ -2589,28 +2572,10 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; case Item::seeds_wheat_Id: - case Item::netherStalkSeeds_Id: + case Item::netherwart_seeds_Id: *piUse=IDS_TOOLTIPS_PLANT; break; - case Item::bucket_empty_Id: - switch(iTileID) - { - // can collect lava or water in the empty bucket - case Tile::water_Id: - case Tile::calmWater_Id: - case Tile::lava_Id: - case Tile::calmLava_Id: - *piUse=IDS_TOOLTIPS_COLLECT; - break; - } - break; - - case Item::bucket_lava_Id: - case Item::bucket_water_Id: - *piUse=IDS_TOOLTIPS_EMPTY; - break; - case Item::dye_powder_Id: // bonemeal grows various plants if (itemInstance->getAuxValue() == DyePowderItem::WHITE) @@ -2618,10 +2583,10 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) switch(iTileID) { case Tile::sapling_Id: - case Tile::crops_Id: + case Tile::wheat_Id: case Tile::grass_Id: - case Tile::mushroom1_Id: - case Tile::mushroom2_Id: + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: case Tile::melonStem_Id: case Tile::pumpkinStem_Id: case Tile::carrots_Id: @@ -2641,6 +2606,14 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) *piUse=IDS_TOOLTIPS_IGNITE; break; + case Item::fireworks_Id: + *piUse=IDS_TOOLTIPS_FIREWORK_LAUNCH; + break; + + case Item::lead_Id: + *piUse=IDS_TOOLTIPS_ATTACH; + break; + default: *piUse=IDS_TOOLTIPS_PLACE; break; @@ -2662,29 +2635,38 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) case Tile::button_wood_Id: case Tile::trapdoor_Id: case Tile::fenceGate_Id: + case Tile::beacon_Id: *piAction=IDS_TOOLTIPS_MINE; *piUse=IDS_TOOLTIPS_USE; break; - case Tile::goldenRail_Id: - case Tile::detectorRail_Id: - case Tile::rail_Id: - if (bUseItemOn) *piUse=IDS_TOOLTIPS_PLACE; - *piAction=IDS_TOOLTIPS_MINE; + case Tile::chest_Id: + *piAction = IDS_TOOLTIPS_MINE; + *piUse = (Tile::chest->getContainer(level,x,y,z) != NULL) ? IDS_TOOLTIPS_OPEN : -1; break; - case Tile::chest_Id: case Tile::enderChest_Id: + case Tile::chest_trap_Id: + case Tile::dropper_Id: + case Tile::hopper_Id: *piUse=IDS_TOOLTIPS_OPEN; *piAction=IDS_TOOLTIPS_MINE; break; + case Tile::activatorRail_Id: + case Tile::goldenRail_Id: + case Tile::detectorRail_Id: + case Tile::rail_Id: + if (bUseItemOn) *piUse=IDS_TOOLTIPS_PLACE; + *piAction=IDS_TOOLTIPS_MINE; + break; + case Tile::bed_Id: if (bUseItemOn) *piUse=IDS_TOOLTIPS_SLEEP; *piAction=IDS_TOOLTIPS_MINE; break; - case Tile::musicBlock_Id: + case Tile::noteblock_Id: // if in creative mode, we will mine if (player->abilities.instabuild) *piAction=IDS_TOOLTIPS_MINE; else *piAction=IDS_TOOLTIPS_PLAY; @@ -2728,7 +2710,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } break; - case Tile::recordPlayer_Id: + case Tile::jukebox_Id: if (!bUseItemOn && itemInstance!=NULL) { int iID=itemInstance->getItem()->id; @@ -2740,7 +2722,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } else { - if (Tile::recordPlayer->TestUse(level, x, y, z, player)) // means we can eject + if (Tile::jukebox->TestUse(level, x, y, z, player)) // means we can eject { *piUse=IDS_TOOLTIPS_EJECT; } @@ -2759,8 +2741,8 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) case Tile::flower_Id: case Tile::rose_Id: case Tile::sapling_Id: - case Tile::mushroom1_Id: - case Tile::mushroom2_Id: + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: case Tile::cactus_Id: case Tile::deadBush_Id: *piUse=IDS_TOOLTIPS_PLANT; @@ -2775,6 +2757,31 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) *piAction=IDS_TOOLTIPS_MINE; break; + case Tile::comparator_off_Id: + case Tile::comparator_on_Id: + *piUse=IDS_TOOLTIPS_USE; + *piAction=IDS_TOOLTIPS_MINE; + break; + + case Tile::diode_off_Id: + case Tile::diode_on_Id: + *piUse=IDS_TOOLTIPS_USE; + *piAction=IDS_TOOLTIPS_MINE; + break; + + case Tile::redStoneOre_Id: + if (bUseItemOn) *piUse=IDS_TOOLTIPS_USE; + *piAction=IDS_TOOLTIPS_MINE; + break; + + case Tile::door_iron_Id: + if(*piUse==IDS_TOOLTIPS_PLACE) + { + *piUse = -1; + } + *piAction=IDS_TOOLTIPS_MINE; + break; + default: *piAction=IDS_TOOLTIPS_MINE; break; @@ -2785,177 +2792,198 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) case HitResult::ENTITY: eINSTANCEOF entityType = hitResult->entity->GetType(); - if( gameMode != NULL && gameMode->getTutorial() != NULL ) + if ( (gameMode != NULL) && (gameMode->getTutorial() != NULL) ) { // 4J Stu - For the tutorial we want to be able to record what items we look at so that we can give hints - gameMode->getTutorial()->onLookAtEntity(entityType); + gameMode->getTutorial()->onLookAtEntity(hitResult->entity); } + shared_ptr heldItem = nullptr; + if (player->inventory->IsHeldItem()) + { + heldItem = player->inventory->getSelected(); + } + int heldItemId = heldItem != NULL ? heldItem->getItem()->id : -1; + switch(entityType) { case eTYPE_CHICKEN: - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - // is there an object in hand? - if(player->inventory->IsHeldItem()) { - shared_ptr heldItem=player->inventory->getSelected(); - int iID=heldItem->getItem()->id; + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + + if (animal->isLeashed() && animal->getLeashHolder() == player) + { + *piUse=IDS_TOOLTIPS_UNLEASH; + break; + } - switch(iID) + switch(heldItemId) { + case Item::nameTag_Id: + *piUse=IDS_TOOLTIPS_NAME; + break; + + case Item::lead_Id: + if (!animal->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; + break; + default: { - shared_ptr animal = dynamic_pointer_cast(hitResult->entity); - if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) { *piUse=IDS_TOOLTIPS_LOVEMODE; } } break; + + case -1: break; // 4J-JEV: Empty hand. } } break; case eTYPE_COW: - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - // is there an object in hand? - if(player->inventory->IsHeldItem()) { - shared_ptr heldItem=player->inventory->getSelected(); - int iID=heldItem->getItem()->id; + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); - // It's an item - switch(iID) + if (animal->isLeashed() && animal->getLeashHolder() == player) { - // Things to USE - case Item::bucket_empty_Id: - *piUse=IDS_TOOLTIPS_MILK; + *piUse=IDS_TOOLTIPS_UNLEASH; break; - default: - { - shared_ptr animal = dynamic_pointer_cast(hitResult->entity); + } - if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) + switch (heldItemId) + { + // Things to USE + case Item::nameTag_Id: + *piUse=IDS_TOOLTIPS_NAME; + break; + case Item::lead_Id: + if (!animal->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; + break; + case Item::bucket_empty_Id: + *piUse=IDS_TOOLTIPS_MILK; + break; + default: { - *piUse=IDS_TOOLTIPS_LOVEMODE; + if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) + { + *piUse=IDS_TOOLTIPS_LOVEMODE; + } } + break; + + case -1: break; // 4J-JEV: Empty hand. } - break; - } } break; case eTYPE_MUSHROOMCOW: - // is there an object in hand? - if(player->inventory->IsHeldItem()) { + // 4J-PB - Fix for #13081 - No tooltip is displayed for hitting a cow when you have nothing in your hand if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - shared_ptr heldItem=player->inventory->getSelected(); - int iID=heldItem->getItem()->id; + shared_ptr animal = dynamic_pointer_cast(hitResult->entity); - // It's an item - switch(iID) + if (animal->isLeashed() && animal->getLeashHolder() == player) + { + *piUse=IDS_TOOLTIPS_UNLEASH; + break; + } + + // It's an item + switch(heldItemId) { // Things to USE - case Item::bowl_Id: - case Item::bucket_empty_Id: // You can milk a mooshroom with either a bowl (mushroom soup) or a bucket (milk)! - *piUse=IDS_TOOLTIPS_MILK; + case Item::nameTag_Id: + *piUse=IDS_TOOLTIPS_NAME; break; - case Item::shears_Id: - { - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - shared_ptr animal = dynamic_pointer_cast(hitResult->entity); - if(!animal->isBaby()) *piUse=IDS_TOOLTIPS_SHEAR; - } + + case Item::lead_Id: + if (!animal->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; break; - default: - { - shared_ptr animal = dynamic_pointer_cast(hitResult->entity); - if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) + case Item::bowl_Id: + case Item::bucket_empty_Id: // You can milk a mooshroom with either a bowl (mushroom soup) or a bucket (milk)! + *piUse=IDS_TOOLTIPS_MILK; + break; + case Item::shears_Id: + { + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + if(!animal->isBaby()) *piUse=IDS_TOOLTIPS_SHEAR; + } + break; + default: { - *piUse=IDS_TOOLTIPS_LOVEMODE; + if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) + { + *piUse=IDS_TOOLTIPS_LOVEMODE; + } } - } - break; + break; + + case -1: break; // 4J-JEV: Empty hand. } } - else - { - // 4J-PB - Fix for #13081 - No tooltip is displayed for hitting a cow when you have nothing in your hand - // nothing in your hand - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - } break; case eTYPE_BOAT: *piAction=IDS_TOOLTIPS_MINE; + *piUse=IDS_TOOLTIPS_SAIL; + break; - // are we in the boat already? - if (dynamic_pointer_cast( player->riding ) != NULL) - { - *piUse=IDS_TOOLTIPS_EXIT; - } - else - { - *piUse=IDS_TOOLTIPS_SAIL; - } + case eTYPE_MINECART_RIDEABLE: + *piAction = IDS_TOOLTIPS_MINE; + *piUse = IDS_TOOLTIPS_RIDE; // are we in the minecart already? - 4J-JEV: Doesn't matter anymore. + break; + + case eTYPE_MINECART_FURNACE: + *piAction = IDS_TOOLTIPS_MINE; + + // if you have coal, it'll go. Is there an object in hand? + if (heldItemId == Item::coal_Id) *piUse=IDS_TOOLTIPS_USE; break; - case eTYPE_MINECART: - *piAction=IDS_TOOLTIPS_MINE; - // are we in the minecart already? - if (dynamic_pointer_cast( player->riding ) != NULL) - { - *piUse=IDS_TOOLTIPS_EXIT; - } - else - { - switch(dynamic_pointer_cast(hitResult->entity)->type) - { - case Minecart::RIDEABLE: - *piUse=IDS_TOOLTIPS_RIDE; - break; - case Minecart::CHEST: - *piUse=IDS_TOOLTIPS_OPEN; - break; - case Minecart::FURNACE: - // if you have coal, it'll go - // is there an object in hand? - if(player->inventory->IsHeldItem()) - { - shared_ptr heldItem=player->inventory->getSelected(); - int iID=heldItem->getItem()->id; - if(iID==Item::coal->id) - { - *piUse=IDS_TOOLTIPS_USE; - } - else - { - *piUse=IDS_TOOLTIPS_HIT; - } - } - break; - } - } + case eTYPE_MINECART_CHEST: + case eTYPE_MINECART_HOPPER: + *piAction = IDS_TOOLTIPS_MINE; + *piUse = IDS_TOOLTIPS_OPEN; + break; + case eTYPE_MINECART_SPAWNER: + case eTYPE_MINECART_TNT: + *piUse = IDS_TOOLTIPS_MINE; break; + case eTYPE_SHEEP: - // can dye a sheep - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - if(player->inventory->IsHeldItem()) { - shared_ptr heldItem=player->inventory->getSelected(); - int iID=heldItem->getItem()->id; + // can dye a sheep + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + shared_ptr sheep = dynamic_pointer_cast(hitResult->entity); + + if (sheep->isLeashed() && sheep->getLeashHolder() == player) + { + *piUse=IDS_TOOLTIPS_UNLEASH; + break; + } - switch(iID) + switch(heldItemId) { + case Item::nameTag_Id: + *piUse=IDS_TOOLTIPS_NAME; + break; + + case Item::lead_Id: + if (!sheep->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; + break; + case Item::dye_powder_Id: { - shared_ptr sheep = dynamic_pointer_cast(hitResult->entity); // convert to tile-based color value (0 is white instead of black) - int newColor = ClothTile::getTileDataForItemAuxValue(heldItem->getAuxValue()); + int newColor = ColoredTile::getTileDataForItemAuxValue(heldItem->getAuxValue()); // can only use a dye on sheep that haven't been sheared if(!(sheep->isSheared() && sheep->getColor() != newColor)) @@ -2966,10 +2994,8 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; case Item::shears_Id: { - shared_ptr sheep = dynamic_pointer_cast(hitResult->entity); - // can only shear a sheep that hasn't been sheared - if(!sheep->isSheared() ) + if ( !sheep->isBaby() && !sheep->isSheared() ) { *piUse=IDS_TOOLTIPS_SHEAR; } @@ -2978,49 +3004,54 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; default: { - shared_ptr animal = dynamic_pointer_cast(hitResult->entity); - - if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) + if(!sheep->isBaby() && !sheep->isInLove() && (sheep->getAge() == 0) && sheep->isFood(heldItem)) { *piUse=IDS_TOOLTIPS_LOVEMODE; } } break; + + case -1: break; // 4J-JEV: Empty hand. } } - break; + case eTYPE_PIG: - // can ride a pig - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - if (dynamic_pointer_cast( player->riding ) != NULL) - { - *piUse=IDS_TOOLTIPS_EXIT; - } - else { - // does the pig have a saddle? - if(dynamic_pointer_cast(hitResult->entity)->hasSaddle()) + // can ride a pig + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + shared_ptr pig = dynamic_pointer_cast(hitResult->entity); + + if (pig->isLeashed() && pig->getLeashHolder() == player) + { + *piUse=IDS_TOOLTIPS_UNLEASH; + } + else if (heldItemId == Item::lead_Id) { - *piUse=IDS_TOOLTIPS_RIDE; + if (!pig->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; } - else if (!dynamic_pointer_cast(hitResult->entity)->isBaby()) + else if (heldItemId == Item::nameTag_Id) + { + *piUse = IDS_TOOLTIPS_NAME; + } + else if (pig->hasSaddle()) // does the pig have a saddle? + { + *piUse=IDS_TOOLTIPS_MOUNT; + } + else if (!pig->isBaby()) { if(player->inventory->IsHeldItem()) { - shared_ptr heldItem=player->inventory->getSelected(); - int iID=heldItem->getItem()->id; - - switch(iID) + switch(heldItemId) { case Item::saddle_Id: *piUse=IDS_TOOLTIPS_SADDLE; break; + default: { - shared_ptr animal = dynamic_pointer_cast(hitResult->entity); - - if(!animal->isBaby() && !animal->isInLove() && (animal->getAge() == 0) && animal->isFood(heldItem)) + if (!pig->isInLove() && (pig->getAge() == 0) && pig->isFood(heldItem)) { *piUse=IDS_TOOLTIPS_LOVEMODE; } @@ -3030,25 +3061,31 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } } } - break; + case eTYPE_WOLF: // can be tamed, fed, and made to sit/stand, or enter love mode { - int iID=-1; - shared_ptr heldItem=nullptr; shared_ptr wolf = dynamic_pointer_cast(hitResult->entity); - if(player->inventory->IsHeldItem()) + if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + + if (wolf->isLeashed() && wolf->getLeashHolder() == player) { - heldItem=player->inventory->getSelected(); - iID=heldItem->getItem()->id; + *piUse=IDS_TOOLTIPS_UNLEASH; + break; } - if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - - switch(iID) + switch(heldItemId) { + case Item::nameTag_Id: + *piUse=IDS_TOOLTIPS_NAME; + break; + + case Item::lead_Id: + if (!wolf->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; + break; + case Item::bone_Id: if (!wolf->isAngry() && !wolf->isTame()) { @@ -3073,7 +3110,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) case Item::dye_powder_Id: if (wolf->isTame()) { - if (ClothTile::getTileDataForItemAuxValue(heldItem->getAuxValue()) != wolf->getCollarColor()) + if (ColoredTile::getTileDataForItemAuxValue(heldItem->getAuxValue()) != wolf->getCollarColor()) { *piUse=IDS_TOOLTIPS_DYECOLLAR; } @@ -3123,21 +3160,25 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } } break; - case eTYPE_OZELOT: + case eTYPE_OCELOT: { - int iID=-1; - shared_ptr heldItem=nullptr; - shared_ptr ocelot = dynamic_pointer_cast(hitResult->entity); - - if(player->inventory->IsHeldItem()) - { - heldItem=player->inventory->getSelected(); - iID=heldItem->getItem()->id; - } + shared_ptr ocelot = dynamic_pointer_cast(hitResult->entity); if(player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; - if(ocelot->isTame()) + if (ocelot->isLeashed() && ocelot->getLeashHolder() == player) + { + *piUse = IDS_TOOLTIPS_UNLEASH; + } + else if (heldItemId == Item::lead_Id) + { + if (!ocelot->isLeashed()) *piUse = IDS_TOOLTIPS_LEASH; + } + else if (heldItemId == Item::nameTag_Id) + { + *piUse = IDS_TOOLTIPS_NAME; + } + else if(ocelot->isTame()) { // 4J-PB - if you have a raw fish in your hand, you will feed the ocelot rather than have it sit/follow if(ocelot->isFood(heldItem)) @@ -3158,7 +3199,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } } - else if (equalsIgnoreCase(player->getUUID(), ocelot->getOwnerUUID())) + else if (equalsIgnoreCase(player->getUUID(), ocelot->getOwnerUUID()) && !ocelot->isSittingOnTile() ) { if(ocelot->isSitting()) { @@ -3170,19 +3211,11 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } } } - else if(iID!=-1) + else if(heldItemId >= 0) { - switch(iID) - { - default: - { - if(ocelot->isFood(heldItem)) *piUse=IDS_TOOLTIPS_TAME; - } - break; - } + if (ocelot->isFood(heldItem)) *piUse=IDS_TOOLTIPS_TAME; } } - break; case eTYPE_PLAYER: @@ -3199,6 +3232,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } } break; + case eTYPE_ITEM_FRAME: { shared_ptr itemFrame = dynamic_pointer_cast(hitResult->entity); @@ -3212,17 +3246,17 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) else { // is there an object in hand? - if(player->inventory->IsHeldItem()) - { - *piUse=IDS_TOOLTIPS_PLACE; - } + if(heldItemId >= 0) *piUse=IDS_TOOLTIPS_PLACE; } *piAction=IDS_TOOLTIPS_HIT; } break; + case eTYPE_VILLAGER: { + // 4J-JEV: Cannot leash villagers. + shared_ptr villager = dynamic_pointer_cast(hitResult->entity); if (!villager->isBaby()) { @@ -3230,35 +3264,162 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } *piAction=IDS_TOOLTIPS_HIT; } - break; + break; + case eTYPE_ZOMBIE: { shared_ptr zomb = dynamic_pointer_cast(hitResult->entity); - shared_ptr heldItem=nullptr; + static GoldenAppleItem *goldapple = (GoldenAppleItem *) Item::apple_gold; + + //zomb->hasEffect(MobEffect::weakness) - not present on client. + if ( zomb->isVillager() && zomb->isWeakened() && (heldItemId == Item::apple_gold_Id) && !goldapple->isFoil(heldItem) ) + { + *piUse=IDS_TOOLTIPS_CURE; + } + *piAction=IDS_TOOLTIPS_HIT; + } + break; - if(player->inventory->IsHeldItem()) + case eTYPE_HORSE: + { + shared_ptr horse = dynamic_pointer_cast(hitResult->entity); + + bool heldItemIsFood = false, heldItemIsLove = false, heldItemIsArmour = false; + + switch( heldItemId ) { - heldItem=player->inventory->getSelected(); + case Item::wheat_Id: + case Item::sugar_Id: + case Item::bread_Id: + case Tile::hayBlock_Id: + case Item::apple_Id: + heldItemIsFood = true; + break; + case Item::carrotGolden_Id: + case Item::apple_gold_Id: + heldItemIsLove = true; + heldItemIsFood = true; + break; + case Item::horseArmorDiamond_Id: + case Item::horseArmorGold_Id: + case Item::horseArmorMetal_Id: + heldItemIsArmour = true; + break; } - if ( zomb->isVillager() && zomb->isWeakened() //zomb->hasEffect(MobEffect::weakness) - not present on client. - && heldItem != NULL && heldItem->getItem()->id == Item::apple_gold_Id ) + if (horse->isLeashed() && horse->getLeashHolder() == player) { - *piUse=IDS_TOOLTIPS_CURE; + *piUse=IDS_TOOLTIPS_UNLEASH; } - *piAction=IDS_TOOLTIPS_HIT; + else if ( heldItemId == Item::lead_Id) + { + if (!horse->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; + } + else if (heldItemId == Item::nameTag_Id) + { + *piUse = IDS_TOOLTIPS_NAME; + } + else if (horse->isBaby()) // 4J-JEV: Can't ride baby horses due to morals. + { + if (heldItemIsFood) + { + // 4j - Can feed foles to speed growth. + *piUse = IDS_TOOLTIPS_FEED; + } + } + else if ( !horse->isTamed() ) + { + if (heldItemId == -1) + { + // 4j - Player not holding anything, ride and attempt to break untamed horse. + *piUse = IDS_TOOLTIPS_TAME; + } + else if (heldItemIsFood) + { + // 4j - Attempt to make it like you more by feeding it. + *piUse = IDS_TOOLTIPS_FEED; + } + } + else if ( player->isSneaking() + || (heldItemId == Item::saddle_Id) + || (horse->canWearArmor() && heldItemIsArmour) + ) + { + // 4j - Access horses inventory + if (*piUse == -1) *piUse = IDS_TOOLTIPS_OPEN; + } + else if ( horse->canWearBags() + && !horse->isChestedHorse() + && (heldItemId == Tile::chest_Id) ) + { + // 4j - Attach saddle-bags (chest) to donkey or mule. + *piUse = IDS_TOOLTIPS_ATTACH; + } + else if ( horse->isReadyForParenting() + && heldItemIsLove ) + { + // 4j - Different food to mate horses. + *piUse = IDS_TOOLTIPS_LOVEMODE; + } + else if ( heldItemIsFood && (horse->getHealth() < horse->getMaxHealth()) ) + { + // 4j - Horse is damaged and can eat held item to heal + *piUse = IDS_TOOLTIPS_HEAL; + } + else + { + // 4j - Ride tamed horse. + *piUse = IDS_TOOLTIPS_MOUNT; + } + + if (player->isAllowedToAttackAnimals()) *piAction=IDS_TOOLTIPS_HIT; + } + break; + + case eTYPE_ENDERDRAGON: + // 4J-JEV: Enderdragon cannot be named. + *piAction = IDS_TOOLTIPS_HIT; + break; + + case eTYPE_LEASHFENCEKNOT: + *piAction = IDS_TOOLTIPS_UNLEASH; + if (heldItemId == Item::lead_Id && LeashItem::bindPlayerMobsTest(player, level, player->x, player->y, player->z)) + { + *piUse = IDS_TOOLTIPS_ATTACH; + } + else + { + *piUse = IDS_TOOLTIPS_UNLEASH; } break; + default: + if ( hitResult->entity->instanceof(eTYPE_MOB) ) + { + shared_ptr mob = dynamic_pointer_cast(hitResult->entity); + if (mob->isLeashed() && mob->getLeashHolder() == player) + { + *piUse=IDS_TOOLTIPS_UNLEASH; + } + else if (heldItemId == Item::lead_Id) + { + if (!mob->isLeashed()) *piUse=IDS_TOOLTIPS_LEASH; + } + else if (heldItemId == Item::nameTag_Id) + { + *piUse=IDS_TOOLTIPS_NAME; + } + } *piAction=IDS_TOOLTIPS_HIT; - break; + break; } break; } } } - ui.SetTooltips( iPad, iA,iB,iX,iY,iLT,iRT,iLB,iRB); + // 4J-JEV: Don't set tooltips when we're reloading the skin, it'll crash. + if (!ui.IsReloadingSkin()) ui.SetTooltips( iPad, iA, iB, iX, iY, iLT, iRT, iLB, iRB, iLS, iRS); int wheel = 0; if (InputManager.GetValue(iPad, MINECRAFT_ACTION_LEFT_SCROLL, true) > 0 && gameMode->isInputAllowed(MINECRAFT_ACTION_LEFT_SCROLL) ) @@ -3502,14 +3663,22 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_INVENTORY)) { - shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->player ); + shared_ptr player = Minecraft::GetInstance()->player; ui.PlayUISFX(eSFX_Press); - app.LoadInventoryMenu(iPad,player); + + if(gameMode->isServerControlledInventory()) + { + player->sendOpenInventory(); + } + else + { + app.LoadInventoryMenu(iPad,player); + } } if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_CRAFTING)) { - shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->player ); + shared_ptr player = Minecraft::GetInstance()->player; // 4J-PB - reordered the if statement so creative mode doesn't bring up the crafting table // Fix for #39014 - TU5: Creative Mode: Pressing X to access the creative menu while looking at a crafting table causes the crafting menu to display @@ -3561,8 +3730,9 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if(pTouchData->reportNum==1) { int iHudSize=app.GetGameSettings(iPad,eGameSetting_UISize); + int iYOffset = (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) == 0) ? iToolTipOffset : 0; if((pTouchData->report[0].x>QuickSelectRect[iHudSize].left)&&(pTouchData->report[0].xreport[0].y>QuickSelectRect[iHudSize].top)&&(pTouchData->report[0].yreport[0].y>QuickSelectRect[iHudSize].top+iYOffset)&&(pTouchData->report[0].yinventory->selected=(pTouchData->report[0].x-QuickSelectRect[iHudSize].left)/QuickSelectBoxWidth[iHudSize]; selected = true; @@ -3822,7 +3992,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) { if (!pause) { - if (levels[i]->lightningBoltTime > 0) levels[i]->lightningBoltTime--; + if (levels[i]->skyFlashTime > 0) levels[i]->skyFlashTime--; PIXBeginNamedEvent(0,"Level entity tick"); levels[i]->tickEntities(); PIXEndNamedEvent(); @@ -3841,7 +4011,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) setLocalPlayerIdx(idx); gameRenderer->setupCamera(timer->a, i); Camera::prepare(localplayers[idx], localplayers[idx]->ThirdPersonView() == 2); - shared_ptr cameraEntity = cameraTargetPlayer; + shared_ptr cameraEntity = cameraTargetPlayer; double xOff = cameraEntity->xOld + (cameraEntity->x - cameraEntity->xOld) * timer->a; double yOff = cameraEntity->yOld + (cameraEntity->y - cameraEntity->yOld) * timer->a; double zOff = cameraEntity->zOld + (cameraEntity->z - cameraEntity->zOld) * timer->a; @@ -4107,7 +4277,7 @@ void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, shared_pt player->setXuid(playerXUIDOffline); player->setOnlineXuid(playerXUIDOnline); - player->displayName = ProfileManager.GetDisplayName(iPrimaryPlayer); + player->m_displayName = ProfileManager.GetDisplayName(iPrimaryPlayer); @@ -4226,8 +4396,6 @@ void Minecraft::prepareLevel(int title) if(progressRenderer != NULL) this->progressRenderer->progressStagePercentage((pp++) * 100 / max); level->getTile(spawnPos->x + x, 64, spawnPos->z + z); if (!gameMode->isCutScene()) { - while (level->updateLights()) - ; } } } @@ -4239,34 +4407,6 @@ void Minecraft::prepareLevel(int title) } } -void Minecraft::fileDownloaded(const wstring& name, File *file) -{ - int p = (int)name.find(L"/"); - wstring category = name.substr(0, p); - wstring name2 = name.substr(p + 1); - toLower(category); - if (category==L"sound") - { - soundEngine->add(name, file); - } - else if (category==L"newsound") - { - soundEngine->add(name, file); - } - else if (category==L"streaming") - { - soundEngine->addStreaming(name, file); - } - else if (category==L"music") - { - soundEngine->addMusic(name, file); - } - else if (category==L"newmusic") - { - soundEngine->addMusic(name, file); - } -} - wstring Minecraft::gatherStats1() { //return levelRenderer->gatherStats1(); @@ -4300,7 +4440,6 @@ void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) if (localPlayer != NULL) { - level->removeEntity(localPlayer); } @@ -4321,7 +4460,7 @@ void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) player->setOnlineXuid(playerXUIDOnline); player->setIsGuest( ProfileManager.IsGuest(iTempPad) ); - player->displayName = ProfileManager.GetDisplayName(iPad); + player->m_displayName = ProfileManager.GetDisplayName(iPad); player->SetXboxPad(iTempPad); @@ -4520,24 +4659,26 @@ void Minecraft::main() #endif // 4J Stu - This block generates XML for the game rules schema - //for(unsigned int i = 0; i < Item::items.length; ++i) - //{ - // if(Item::items[i] != NULL) - // { - // wprintf(L"%ls\n", i, app.GetString( Item::items[i]->getDescriptionId() )); - // } - //} +#if 0 + for(unsigned int i = 0; i < Item::items.length; ++i) + { + if(Item::items[i] != NULL) + { + app.DebugPrintf("%ls\n", i, app.GetString( Item::items[i]->getDescriptionId() )); + } + } - //wprintf(L"\n\n\n\n\n"); - // - //for(unsigned int i = 0; i < 256; ++i) - //{ - // if(Tile::tiles[i] != NULL) - // { - // wprintf(L"%ls\n", i, app.GetString( Tile::tiles[i]->getDescriptionId() )); - // } - //} - //__debugbreak(); + app.DebugPrintf("\n\n\n\n\n"); + + for(unsigned int i = 0; i < 256; ++i) + { + if(Tile::tiles[i] != NULL) + { + app.DebugPrintf("%ls\n", i, app.GetString( Tile::tiles[i]->getDescriptionId() )); + } + } + __debugbreak(); +#endif // 4J-PB - Can't call this for the first 5 seconds of a game - MS rule //if (ProfileManager.IsFullVersion()) @@ -4577,7 +4718,7 @@ bool Minecraft::useFancyGraphics() bool Minecraft::useAmbientOcclusion() { - return (m_instance != NULL && m_instance->options->ambientOcclusion); + return (m_instance != NULL && m_instance->options->ambientOcclusion != Options::AO_OFF); } bool Minecraft::renderDebug() @@ -4587,43 +4728,6 @@ bool Minecraft::renderDebug() bool Minecraft::handleClientSideCommand(const wstring& chatMessage) { - /* 4J - TODO - if (chatMessage.startsWith("/")) { - if (DEADMAU5_CAMERA_CHEATS) { - if (chatMessage.startsWith("/follow")) { - String[] tokens = chatMessage.split(" "); - if (tokens.length >= 2) { - String playerName = tokens[1]; - - boolean found = false; - for (Player player : level.players) { - if (playerName.equalsIgnoreCase(player.name)) { - cameraTargetPlayer = player; - found = true; - break; - } - } - - if (!found) { - try { - int entityId = Integer.parseInt(playerName); - for (Entity e : level.entities) { - if (e.entityId == entityId && e instanceof Mob) { - cameraTargetPlayer = (Mob) e; - found = true; - break; - } - } - } catch (NumberFormatException e) { - } - } - } - - return true; - } - } - } - */ return false; } @@ -4848,7 +4952,7 @@ void Minecraft::inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasP { UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); ProfileManager.RemoveGamepadFromGame(iPad); } else if( ProfileManager.IsSignedInLive(iPad) && ProfileManager.AllowedToPlayMultiplayer(iPad) ) @@ -4876,7 +4980,11 @@ void Minecraft::inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasP } #endif +#ifdef _XBOX_ONE +int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad, int iController) +#else int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad) +#endif { Minecraft* pMinecraftClass = (Minecraft*)pParam; @@ -4905,7 +5013,7 @@ int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad) { UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(iPad); #endif @@ -4949,7 +5057,7 @@ int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad) //ProfileManager.RequestConvertOfflineToGuestUI( &Minecraft::InGame_SignInReturned, pMinecraftClass,iPad); UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,iPad,NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,iPad); #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(iPad); #endif @@ -5016,14 +5124,14 @@ ColourTable *Minecraft::getColourTable() #if defined __ORBIS__ int Minecraft::MustSignInReturnedPSN(void *pParam, int iPad, C4JStorage::EMessageResult result) { - Minecraft* pMinecraft = (Minecraft *)pParam; + Minecraft* pMinecraft = (Minecraft *)pParam; - if(result == C4JStorage::EMessage_ResultAccept) - { + if(result == C4JStorage::EMessage_ResultAccept) + { SQRNetworkManager_Orbis::AttemptPSNSignIn(&Minecraft::InGame_SignInReturned, pMinecraft, false, iPad); - } + } - return 0; + return 0; } #endif diff --git a/Minecraft.Client/Minecraft.h b/Minecraft.Client/Minecraft.h index caec4702..cc1e5d18 100644 --- a/Minecraft.Client/Minecraft.h +++ b/Minecraft.Client/Minecraft.h @@ -41,6 +41,7 @@ class PsPlusUpsellWrapper; #include "..\Minecraft.World\File.h" #include "..\Minecraft.World\DisconnectPacket.h" #include "..\Minecraft.World\C4JThread.h" +#include "ResourceLocation.h" using namespace std; @@ -51,6 +52,9 @@ private: linux, solaris, windows, macos, unknown, xbox }; + static ResourceLocation DEFAULT_FONT_LOCATION; + static ResourceLocation ALT_FONT_LOCATION; + public: static const wstring VERSION_STRING; Minecraft(Component *mouseComponent, Canvas *parent, MinecraftApplet *minecraftApplet, int width, int height, bool fullscreen); @@ -119,7 +123,8 @@ public: void updatePlayerViewportAssignments(); int unoccupiedQuadrant; // 4J - added - shared_ptr cameraTargetPlayer; + shared_ptr cameraTargetPlayer; + shared_ptr crosshairPickMob; ParticleEngine *particleEngine; User *user; wstring serverDomain; @@ -193,11 +198,6 @@ public: private: static File workDir; -public: - static File getWorkingDirectory(); - static File getWorkingDirectory(const wstring& applicationName); -private: - static OS getPlatform(); public: LevelStorageSource *getLevelSource(); void setScreen(Screen *screen); @@ -280,7 +280,6 @@ public: // 4J-PB - added to force in the 'other' level when the main player creates the level at game load time void forceaddLevel(MultiPlayerLevel *level); void prepareLevel(int title); // 4J - changed to public - void fileDownloaded(const wstring& name, File *file); // OpenGLCapabilities getOpenGLCapabilities(); // 4J - removed wstring gatherStats1(); @@ -305,8 +304,10 @@ public: #ifdef _DURANGO static void inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad); -#endif + static int InGame_SignInReturned(void *pParam,bool bContinue, int iPad, int iController); +#else static int InGame_SignInReturned(void *pParam,bool bContinue, int iPad); +#endif // 4J-PB Screen * getScreen(); diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index ceb9554b..4206a399 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -3,17 +3,19 @@ #include -#include "Options.h" -#include "MinecraftServer.h" #include "ConsoleInput.h" -#include "PlayerList.h" -#include "ServerLevel.h" #include "DerivedServerLevel.h" +#include "DispenserBootstrap.h" #include "EntityTracker.h" -#include "ServerConnection.h" -#include "Settings.h" +#include "MinecraftServer.h" +#include "Options.h" +#include "PlayerList.h" #include "ServerChunkCache.h" +#include "ServerConnection.h" +#include "ServerLevel.h" #include "ServerLevelListener.h" +#include "Settings.h" +#include "..\Minecraft.World\Command.h" #include "..\Minecraft.World\AABB.h" #include "..\Minecraft.World\Vec3.h" #include "..\Minecraft.World\net.minecraft.network.h" @@ -48,6 +50,10 @@ #include "..\Minecraft.World\BiomeSource.h" #include "PlayerChunkMap.h" #include "Common\Telemetry\TelemetryManager.h" +#include "PlayerConnection.h" +#ifdef _XBOX_ONE +#include "Durango\Network\NetworkPlayerDurango.h" +#endif #define DEBUG_SERVER_DONT_SPAWN_MOBS 0 @@ -60,9 +66,15 @@ __int64 MinecraftServer::setTimeOfDay = 0; bool MinecraftServer::m_bPrimaryPlayerSignedOut=false; bool MinecraftServer::s_bServerHalted=false; bool MinecraftServer::s_bSaveOnExitAnswered=false; +#ifdef _ACK_CHUNK_SEND_THROTTLING +bool MinecraftServer::s_hasSentEnoughPackets = false; +__int64 MinecraftServer::s_tickStartTime = 0; +vector MinecraftServer::s_sentTo; +#else int MinecraftServer::s_slowQueuePlayerIndex = 0; int MinecraftServer::s_slowQueueLastTime = 0; bool MinecraftServer::s_slowQueuePacketSent = false; +#endif unordered_map MinecraftServer::ironTimers; @@ -70,15 +82,15 @@ MinecraftServer::MinecraftServer() { // 4J - added initialisers connection = NULL; - settings = NULL; - players = NULL; + settings = NULL; + players = NULL; commands = NULL; - running = true; + running = true; m_bLoaded = false; stopped = false; - tickCount = 0; + tickCount = 0; wstring progressStatus; - progress = 0; + progress = 0; motd = L""; m_isServerPaused = false; @@ -90,9 +102,13 @@ MinecraftServer::MinecraftServer() m_ugcPlayersVersion = 0; m_texturePackId = 0; maxBuildHeight = Level::maxBuildHeight; + playerIdleTimeout = 0; m_postUpdateThread = NULL; + forceGameType = false; commandDispatcher = new ServerCommandDispatcher(); + + DispenserBootstrap::bootStrap(); } MinecraftServer::~MinecraftServer() @@ -103,171 +119,171 @@ bool MinecraftServer::initServer(__int64 seed, NetworkGameInitData *initData, DW { // 4J - removed #if 0 - commands = new ConsoleCommands(this); - - Thread t = new Thread() { - public void run() { - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - String line = null; - try { - while (!stopped && running && (line = br.readLine()) != null) { - handleConsoleInput(line, MinecraftServer.this); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - }; - t.setDaemon(true); - t.start(); - - - LogConfigurator.initLogger(); - logger.info("Starting minecraft server version " + VERSION); - - if (Runtime.getRuntime().maxMemory() / 1024 / 1024 < 512) { - logger.warning("**** NOT ENOUGH RAM!"); - logger.warning("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); - } - - logger.info("Loading properties"); + commands = new ConsoleCommands(this); + + Thread t = new Thread() { + public void run() { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String line = null; + try { + while (!stopped && running && (line = br.readLine()) != null) { + handleConsoleInput(line, MinecraftServer.this); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + t.setDaemon(true); + t.start(); + + + LogConfigurator.initLogger(); + logger.info("Starting minecraft server version " + VERSION); + + if (Runtime.getRuntime().maxMemory() / 1024 / 1024 < 512) { + logger.warning("**** NOT ENOUGH RAM!"); + logger.warning("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); + } + + logger.info("Loading properties"); #endif - settings = new Settings(new File(L"server.properties")); - - app.DebugPrintf("\n*** SERVER SETTINGS ***\n"); - app.DebugPrintf("ServerSettings: host-friends-only is %s\n",(app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0)?"on":"off"); - app.DebugPrintf("ServerSettings: game-type is %s\n",(app.GetGameHostOption(eGameHostOption_GameType)==0)?"Survival Mode":"Creative Mode"); - app.DebugPrintf("ServerSettings: pvp is %s\n",(app.GetGameHostOption(eGameHostOption_PvP)>0)?"on":"off"); - app.DebugPrintf("ServerSettings: fire spreads is %s\n",(app.GetGameHostOption(eGameHostOption_FireSpreads)>0)?"on":"off"); - app.DebugPrintf("ServerSettings: tnt explodes is %s\n",(app.GetGameHostOption(eGameHostOption_TNT)>0)?"on":"off"); - app.DebugPrintf("\n"); - - // TODO 4J Stu - Init a load of settings based on data passed as params - //settings->setBooleanAndSave( L"host-friends-only", (app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0) ); - - // 4J - Unused - //localIp = settings->getString(L"server-ip", L""); - //onlineMode = settings->getBoolean(L"online-mode", true); - //motd = settings->getString(L"motd", L"A Minecraft Server"); - //motd.replace('', '$'); - - setAnimals(settings->getBoolean(L"spawn-animals", true)); - setNpcsEnabled(settings->getBoolean(L"spawn-npcs", true)); - setPvpAllowed(app.GetGameHostOption( eGameHostOption_PvP )>0?true:false); // settings->getBoolean(L"pvp", true); - - // 4J Stu - We should never have hacked clients flying when they shouldn't be like the PC version, so enable flying always - // Fix for #46612 - TU5: Code: Multiplayer: A client can be banned for flying when accidentaly being blown by dynamite - setFlightAllowed(true); //settings->getBoolean(L"allow-flight", false); - - // 4J Stu - Enabling flight to stop it kicking us when we use it + settings = new Settings(new File(L"server.properties")); + + app.DebugPrintf("\n*** SERVER SETTINGS ***\n"); + app.DebugPrintf("ServerSettings: host-friends-only is %s\n",(app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: game-type is %s\n",(app.GetGameHostOption(eGameHostOption_GameType)==0)?"Survival Mode":"Creative Mode"); + app.DebugPrintf("ServerSettings: pvp is %s\n",(app.GetGameHostOption(eGameHostOption_PvP)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: fire spreads is %s\n",(app.GetGameHostOption(eGameHostOption_FireSpreads)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: tnt explodes is %s\n",(app.GetGameHostOption(eGameHostOption_TNT)>0)?"on":"off"); + app.DebugPrintf("\n"); + + // TODO 4J Stu - Init a load of settings based on data passed as params + //settings->setBooleanAndSave( L"host-friends-only", (app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0) ); + + // 4J - Unused + //localIp = settings->getString(L"server-ip", L""); + //onlineMode = settings->getBoolean(L"online-mode", true); + //motd = settings->getString(L"motd", L"A Minecraft Server"); + //motd.replace('', '$'); + + setAnimals(settings->getBoolean(L"spawn-animals", true)); + setNpcsEnabled(settings->getBoolean(L"spawn-npcs", true)); + setPvpAllowed(app.GetGameHostOption( eGameHostOption_PvP )>0?true:false); // settings->getBoolean(L"pvp", true); + + // 4J Stu - We should never have hacked clients flying when they shouldn't be like the PC version, so enable flying always + // Fix for #46612 - TU5: Code: Multiplayer: A client can be banned for flying when accidentaly being blown by dynamite + setFlightAllowed(true); //settings->getBoolean(L"allow-flight", false); + + // 4J Stu - Enabling flight to stop it kicking us when we use it #ifdef _DEBUG_MENUS_ENABLED - setFlightAllowed(true); + setFlightAllowed(true); #endif #if 1 - connection = new ServerConnection(this); - Socket::Initialise(connection); // 4J - added + connection = new ServerConnection(this); + Socket::Initialise(connection); // 4J - added #else - // 4J - removed - InetAddress localAddress = null; - if (localIp.length() > 0) localAddress = InetAddress.getByName(localIp); - port = settings.getInt("server-port", DEFAULT_MINECRAFT_PORT); - - logger.info("Starting Minecraft server on " + (localIp.length() == 0 ? "*" : localIp) + ":" + port); - try { - connection = new ServerConnection(this, localAddress, port); - } catch (IOException e) { - logger.warning("**** FAILED TO BIND TO PORT!"); - logger.log(Level.WARNING, "The exception was: " + e.toString()); - logger.warning("Perhaps a server is already running on that port?"); - return false; - } - - if (!onlineMode) { - logger.warning("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); - logger.warning("The server will make no attempt to authenticate usernames. Beware."); - logger.warning("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose."); - logger.warning("To change this, set \"online-mode\" to \"true\" in the server.settings file."); - } + // 4J - removed + InetAddress localAddress = null; + if (localIp.length() > 0) localAddress = InetAddress.getByName(localIp); + port = settings.getInt("server-port", DEFAULT_MINECRAFT_PORT); + + logger.info("Starting Minecraft server on " + (localIp.length() == 0 ? "*" : localIp) + ":" + port); + try { + connection = new ServerConnection(this, localAddress, port); + } catch (IOException e) { + logger.warning("**** FAILED TO BIND TO PORT!"); + logger.log(Level.WARNING, "The exception was: " + e.toString()); + logger.warning("Perhaps a server is already running on that port?"); + return false; + } + + if (!onlineMode) { + logger.warning("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); + logger.warning("The server will make no attempt to authenticate usernames. Beware."); + logger.warning("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose."); + logger.warning("To change this, set \"online-mode\" to \"true\" in the server.settings file."); + } #endif - setPlayers(new PlayerList(this)); + setPlayers(new PlayerList(this)); - // 4J-JEV: Need to wait for levelGenerationOptions to load. - while ( app.getLevelGenerationOptions() != NULL && !app.getLevelGenerationOptions()->hasLoadedData() ) - Sleep(1); + // 4J-JEV: Need to wait for levelGenerationOptions to load. + while ( app.getLevelGenerationOptions() != NULL && !app.getLevelGenerationOptions()->hasLoadedData() ) + Sleep(1); - if ( app.getLevelGenerationOptions() != NULL && !app.getLevelGenerationOptions()->ready() ) - { - // TODO: Stop loading, add error message. - } + if ( app.getLevelGenerationOptions() != NULL && !app.getLevelGenerationOptions()->ready() ) + { + // TODO: Stop loading, add error message. + } - __int64 levelNanoTime = System::nanoTime(); + __int64 levelNanoTime = System::nanoTime(); - wstring levelName = settings->getString(L"level-name", L"world"); - wstring levelTypeString; + wstring levelName = settings->getString(L"level-name", L"world"); + wstring levelTypeString; - bool gameRuleUseFlatWorld = false; - if(app.getLevelGenerationOptions() != NULL) - { - gameRuleUseFlatWorld = app.getLevelGenerationOptions()->getuseFlatWorld(); - } - if(gameRuleUseFlatWorld || app.GetGameHostOption(eGameHostOption_LevelType)>0) - { - levelTypeString = settings->getString(L"level-type", L"flat"); - } - else - { - levelTypeString = settings->getString(L"level-type",L"default"); - } + bool gameRuleUseFlatWorld = false; + if(app.getLevelGenerationOptions() != NULL) + { + gameRuleUseFlatWorld = app.getLevelGenerationOptions()->getuseFlatWorld(); + } + if(gameRuleUseFlatWorld || app.GetGameHostOption(eGameHostOption_LevelType)>0) + { + levelTypeString = settings->getString(L"level-type", L"flat"); + } + else + { + levelTypeString = settings->getString(L"level-type",L"default"); + } - LevelType *pLevelType = LevelType::getLevelType(levelTypeString); - if (pLevelType == NULL) - { - pLevelType = LevelType::lvl_normal; - } + LevelType *pLevelType = LevelType::getLevelType(levelTypeString); + if (pLevelType == NULL) + { + pLevelType = LevelType::lvl_normal; + } - ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; - mcprogress->progressStart(IDS_PROGRESS_INITIALISING_SERVER); + ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; + mcprogress->progressStart(IDS_PROGRESS_INITIALISING_SERVER); - if( findSeed ) - { + if( findSeed ) + { #ifdef __PSVITA__ - seed = BiomeSource::findSeed(pLevelType, &running); + seed = BiomeSource::findSeed(pLevelType, &running); #else - seed = BiomeSource::findSeed(pLevelType); + seed = BiomeSource::findSeed(pLevelType); #endif - } + } - setMaxBuildHeight(settings->getInt(L"max-build-height", Level::maxBuildHeight)); - setMaxBuildHeight(((getMaxBuildHeight() + 8) / 16) * 16); - setMaxBuildHeight(Mth::clamp(getMaxBuildHeight(), 64, Level::maxBuildHeight)); - //settings->setProperty(L"max-build-height", maxBuildHeight); + setMaxBuildHeight(settings->getInt(L"max-build-height", Level::maxBuildHeight)); + setMaxBuildHeight(((getMaxBuildHeight() + 8) / 16) * 16); + setMaxBuildHeight(Mth::clamp(getMaxBuildHeight(), 64, Level::maxBuildHeight)); + //settings->setProperty(L"max-build-height", maxBuildHeight); #if 0 - wstring levelSeedString = settings->getString(L"level-seed", L""); - __int64 levelSeed = (new Random())->nextLong(); - if (levelSeedString.length() > 0) - { - long newSeed = _fromString<__int64>(levelSeedString); - if (newSeed != 0) { - levelSeed = newSeed; - } - } + wstring levelSeedString = settings->getString(L"level-seed", L""); + __int64 levelSeed = (new Random())->nextLong(); + if (levelSeedString.length() > 0) + { + long newSeed = _fromString<__int64>(levelSeedString); + if (newSeed != 0) { + levelSeed = newSeed; + } + } #endif -// logger.info("Preparing level \"" + levelName + "\""); - m_bLoaded = loadLevel(new McRegionLevelStorageSource(File(L".")), levelName, seed, pLevelType, initData); -// logger.info("Done (" + (System.nanoTime() - levelNanoTime) + "ns)! For help, type \"help\" or \"?\""); + // logger.info("Preparing level \"" + levelName + "\""); + m_bLoaded = loadLevel(new McRegionLevelStorageSource(File(L".")), levelName, seed, pLevelType, initData); + // logger.info("Done (" + (System.nanoTime() - levelNanoTime) + "ns)! For help, type \"help\" or \"?\""); - // 4J delete passed in save data now - this is only required for the tutorial which is loaded by passing data directly in rather than using the storage manager - if( initData->saveData ) - { - delete initData->saveData->data; - initData->saveData->data = 0; - initData->saveData->fileSize = 0; - } + // 4J delete passed in save data now - this is only required for the tutorial which is loaded by passing data directly in rather than using the storage manager + if( initData->saveData ) + { + delete initData->saveData->data; + initData->saveData->data = 0; + initData->saveData->fileSize = 0; + } - g_NetworkManager.ServerReady(); // 4J added - return m_bLoaded; + g_NetworkManager.ServerReady(); // 4J added + return m_bLoaded; } @@ -305,7 +321,7 @@ int MinecraftServer::runPostUpdate(void* lpParam) } Sleep(1); } while (!server->m_postUpdateTerminate && ShutdownManager::ShouldRun(ShutdownManager::ePostProcessThread)); -//#ifndef __PS3__ + //#ifndef __PS3__ // One final pass through updates to make sure we're done EnterCriticalSection(&server->m_postProcessCS); int maxRequests = server->m_postProcessRequests.size(); @@ -325,7 +341,7 @@ int MinecraftServer::runPostUpdate(void* lpParam) EnterCriticalSection(&server->m_postProcessCS); } LeaveCriticalSection(&server->m_postProcessCS); -//#endif //__PS3__ + //#endif //__PS3__ Tile::ReleaseThreadStorage(); IntCache::ReleaseThreadStorage(); AABB::ReleaseThreadStorage(); @@ -377,15 +393,15 @@ void MinecraftServer::postProcessTerminate(ProgressRenderer *mcprogress) bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring& name, __int64 levelSeed, LevelType *pLevelType, NetworkGameInitData *initData) { -// 4J - TODO - do with new save stuff -// if (storageSource->requiresConversion(name)) -// { -// assert(false); -// } + // 4J - TODO - do with new save stuff + // if (storageSource->requiresConversion(name)) + // { + // assert(false); + // } ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; // 4J TODO - free levels here if there are already some? - levels = ServerLevelArray(3); + levels = ServerLevelArray(3); int gameTypeId = settings->getInt(L"gamemode", app.GetGameHostOption(eGameHostOption_GameType));//LevelSettings::GAMETYPE_SURVIVAL); GameType *gameType = LevelSettings::validateGameType(gameTypeId); @@ -404,7 +420,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring #ifdef SPLIT_SAVES ConsoleSaveFileOriginal oldFormatSave( initData->saveData->saveName, initData->saveData->data, initData->saveData->fileSize, false, initData->savePlatform ); ConsoleSaveFile* pSave = new ConsoleSaveFileSplit( &oldFormatSave ); - + //ConsoleSaveFile* pSave = new ConsoleSaveFileSplit( initData->saveData->saveName, initData->saveData->data, initData->saveData->fileSize, false, initData->savePlatform ); #else ConsoleSaveFile* pSave = new ConsoleSaveFileOriginal( initData->saveData->saveName, initData->saveData->data, initData->saveData->fileSize, false, initData->savePlatform ); @@ -444,21 +460,21 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring #endif } -// McRegionLevelStorage *storage = new McRegionLevelStorage(new ConsoleSaveFile( L"" ), L"", L"", 0); // original -// McRegionLevelStorage *storage = new McRegionLevelStorage(File(L"."), name, true); // TODO - for (unsigned int i = 0; i < levels.length; i++) + // McRegionLevelStorage *storage = new McRegionLevelStorage(new ConsoleSaveFile( L"" ), L"", L"", 0); // original + // McRegionLevelStorage *storage = new McRegionLevelStorage(File(L"."), name, true); // TODO + for (unsigned int i = 0; i < levels.length; i++) { if( s_bServerHalted || !g_NetworkManager.IsInSession() ) { - return false; + return false; } -// String levelName = name; -// if (i == 1) levelName += "_nether"; + // String levelName = name; + // if (i == 1) levelName += "_nether"; int dimension = 0; if (i == 1) dimension = -1; if (i == 2) dimension = 1; - if (i == 0) + if (i == 0) { levels[i] = new ServerLevel(this, storage, name, dimension, levelSettings); if(app.getLevelGenerationOptions() != NULL) @@ -473,24 +489,31 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring levels[i]->getLevelData()->setHasBeenInCreative(mapOptions->isFromDLC()); } } - else levels[i] = new DerivedServerLevel(this, storage, name, dimension, levelSettings, levels[0]); -// levels[i]->addListener(new ServerLevelListener(this, levels[i])); // 4J - have moved this to the ServerLevel ctor so that it is set up in time for the first chunk to load, which might actually happen there + else levels[i] = new DerivedServerLevel(this, storage, name, dimension, levelSettings, levels[0]); + // levels[i]->addListener(new ServerLevelListener(this, levels[i])); // 4J - have moved this to the ServerLevel ctor so that it is set up in time for the first chunk to load, which might actually happen there // 4J Stu - We set the levels difficulty based on the minecraft options - //levels[i]->difficulty = settings->getBoolean(L"spawn-monsters", true) ? Difficulty::EASY : Difficulty::PEACEFUL; + //levels[i]->difficulty = settings->getBoolean(L"spawn-monsters", true) ? Difficulty::EASY : Difficulty::PEACEFUL; Minecraft *pMinecraft = Minecraft::GetInstance(); -// m_lastSentDifficulty = pMinecraft->options->difficulty; + // m_lastSentDifficulty = pMinecraft->options->difficulty; levels[i]->difficulty = app.GetGameHostOption(eGameHostOption_Difficulty); //pMinecraft->options->difficulty; app.DebugPrintf("MinecraftServer::loadLevel - Difficulty = %d\n",levels[i]->difficulty); #if DEBUG_SERVER_DONT_SPAWN_MOBS - levels[i]->setSpawnSettings(false, false); + levels[i]->setSpawnSettings(false, false); #else levels[i]->setSpawnSettings(settings->getBoolean(L"spawn-monsters", true), animals); #endif levels[i]->getLevelData()->setGameType(gameType); - players->setLevel(levels); - } + + if(app.getLevelGenerationOptions() != NULL) + { + LevelGenerationOptions *mapOptions = app.getLevelGenerationOptions(); + levels[i]->getLevelData()->setHasBeenInCreative(mapOptions->getLevelHasBeenInCreative() ); + } + + players->setLevel(levels); + } if( levels[0]->isNew ) { @@ -548,19 +571,31 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring csf->closeHandle(fe); } - __int64 lastTime = System::currentTimeMillis(); + __int64 lastTime = System::currentTimeMillis(); +#ifdef _LARGE_WORLDS + if(app.GetGameNewWorldSize() > levels[0]->getLevelData()->getXZSizeOld()) + { + if(!app.GetGameNewWorldSizeUseMoat()) // check the moat settings to see if we should be overwriting the edge tiles + { + overwriteBordersForNewWorldSize(levels[0]); + } + // we're always overwriting hell edges + int oldHellSize = levels[0]->getLevelData()->getXZHellSizeOld(); + overwriteHellBordersForNewWorldSize(levels[1], oldHellSize); + } +#endif // 4J Stu - This loop is changed in 1.0.1 to only process the first level (ie the overworld), but I think we still want to do them all int i = 0; - for (int i = 0; i < levels.length ; i++) + for (int i = 0; i < levels.length ; i++) { -// logger.info("Preparing start region for level " + i); - if (i == 0 || settings->getBoolean(L"allow-nether", true)) + // logger.info("Preparing start region for level " + i); + if (i == 0 || settings->getBoolean(L"allow-nether", true)) { - ServerLevel *level = levels[i]; + ServerLevel *level = levels[i]; if(levelChunksNeedConverted) { -// storage->getSaveFile()->convertLevelChunks(level) + // storage->getSaveFile()->convertLevelChunks(level) } #if 0 @@ -588,13 +623,13 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring } #else __int64 lastStorageTickTime = System::currentTimeMillis(); - Pos *spawnPos = level->getSharedSpawnPos(); + Pos *spawnPos = level->getSharedSpawnPos(); int twoRPlusOne = r*2 + 1; int total = twoRPlusOne * twoRPlusOne; - for (int x = -r; x <= r && running; x += 16) + for (int x = -r; x <= r && running; x += 16) { - for (int z = -r; z <= r && running; z += 16) + for (int z = -r; z <= r && running; z += 16) { if( s_bServerHalted || !g_NetworkManager.IsInSession() ) { @@ -603,22 +638,22 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring postProcessTerminate(mcprogress); return false; } -// printf(">>>%d %d %d\n",i,x,z); -// __int64 now = System::currentTimeMillis(); -// if (now < lastTime) lastTime = now; -// if (now > lastTime + 1000) + // printf(">>>%d %d %d\n",i,x,z); + // __int64 now = System::currentTimeMillis(); + // if (now < lastTime) lastTime = now; + // if (now > lastTime + 1000) { - int pos = (x + r) * twoRPlusOne + (z + 1); -// setProgress(L"Preparing spawn area", (pos) * 100 / total); + int pos = (x + r) * twoRPlusOne + (z + 1); + // setProgress(L"Preparing spawn area", (pos) * 100 / total); mcprogress->progressStagePercentage((pos+r) * 100 / total); -// lastTime = now; - } + // lastTime = now; + } static int count = 0; PIXBeginNamedEvent(0,"Creating %d ", (count++)%8); - level->cache->create((spawnPos->x + x) >> 4, (spawnPos->z + z) >> 4, true); // 4J - added parameter to disable postprocessing here + level->cache->create((spawnPos->x + x) >> 4, (spawnPos->z + z) >> 4, true); // 4J - added parameter to disable postprocessing here PIXEndNamedEvent(); -// while (level->updateLights() && running) -// ; + // while (level->updateLights() && running) + // ; if( System::currentTimeMillis() - lastStorageTickTime > 50 ) { CompressedTileStorage::tick(); @@ -626,15 +661,15 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring SparseDataStorage::tick(); lastStorageTickTime = System::currentTimeMillis(); } - } - } + } + } // 4J - removed this as now doing the recheckGaps call when each chunk is post-processed, so can happen on things outside of the spawn area too #if 0 // 4J - added this code to propagate lighting properly in the spawn area before we go sharing it with the local client or across the network - for (int x = -r; x <= r && running; x += 16) + for (int x = -r; x <= r && running; x += 16) { - for (int z = -r; z <= r && running; z += 16) + for (int z = -r; z <= r && running; z += 16) { PIXBeginNamedEvent(0,"Lighting gaps for %d %d",x,z); level->getChunkAt(spawnPos->x + x, spawnPos->z + z)->recheckGaps(true); @@ -645,9 +680,9 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring delete spawnPos; #endif - } - } -// printf("Main thread complete at %dms\n",System::currentTimeMillis() - startTime); + } + } + // printf("Main thread complete at %dms\n",System::currentTimeMillis() - startTime); // Wait for post processing, then lighting threads, to end (post-processing may make more lighting changes) m_postUpdateTerminate = true; @@ -686,12 +721,12 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring app.DebugPrintf("===================================\n"); } -// printf("Post processing complete at %dms\n",System::currentTimeMillis() - startTime); + // printf("Post processing complete at %dms\n",System::currentTimeMillis() - startTime); -// printf("Lighting complete at %dms\n",System::currentTimeMillis() - startTime); + // printf("Lighting complete at %dms\n",System::currentTimeMillis() - startTime); if( s_bServerHalted || !g_NetworkManager.IsInSession() ) return false; - + if( levels[1]->isNew ) { levels[1]->save(true, mcprogress); @@ -710,7 +745,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring // 4J Stu - We also want to immediately save the tutorial if ( levels[0]->isNew ) saveGameRules(); - + if( levels[0]->isNew ) { levels[0]->save(true, mcprogress); @@ -725,35 +760,107 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring if( s_bServerHalted || !g_NetworkManager.IsInSession() ) return false; -/* -* int r = 24; for (int x = -r; x <= r; x++) { -* setProgress("Preparing spawn area", (x + r) * 100 / (r + r + 1)); for (int z -* = -r; z <= r; z++) { if (!running) return; level.cache.create((level.xSpawn -* >> 4) + x, (level.zSpawn >> 4) + z); while (running && level.updateLights()) -* ; } } -*/ - endProgress(); + /* + * int r = 24; for (int x = -r; x <= r; x++) { + * setProgress("Preparing spawn area", (x + r) * 100 / (r + r + 1)); for (int z + * = -r; z <= r; z++) { if (!running) return; level.cache.create((level.xSpawn + * >> 4) + x, (level.zSpawn >> 4) + z); while (running && level.updateLights()) + * ; } } + */ + endProgress(); return true; } +#ifdef _LARGE_WORLDS +void MinecraftServer::overwriteBordersForNewWorldSize(ServerLevel* level) +{ + // recreate the chunks round the border (2 chunks or 32 blocks deep), deleting any player data from them + app.DebugPrintf("Expanding level size\n"); + int oldSize = level->getLevelData()->getXZSizeOld(); + // top + int minVal = -oldSize/2; + int maxVal = (oldSize/2)-1; + for(int xVal = minVal; xVal <= maxVal; xVal++) + { + int zVal = minVal; + level->cache->overwriteLevelChunkFromSource(xVal, zVal); + level->cache->overwriteLevelChunkFromSource(xVal, zVal+1); + } + // bottom + for(int xVal = minVal; xVal <= maxVal; xVal++) + { + int zVal = maxVal; + level->cache->overwriteLevelChunkFromSource(xVal, zVal); + level->cache->overwriteLevelChunkFromSource(xVal, zVal-1); + } + // left + for(int zVal = minVal; zVal <= maxVal; zVal++) + { + int xVal = minVal; + level->cache->overwriteLevelChunkFromSource(xVal, zVal); + level->cache->overwriteLevelChunkFromSource(xVal+1, zVal); + } + // right + for(int zVal = minVal; zVal <= maxVal; zVal++) + { + int xVal = maxVal; + level->cache->overwriteLevelChunkFromSource(xVal, zVal); + level->cache->overwriteLevelChunkFromSource(xVal-1, zVal); + } +} + +void MinecraftServer::overwriteHellBordersForNewWorldSize(ServerLevel* level, int oldHellSize) +{ + // recreate the chunks round the border (1 chunk or 16 blocks deep), deleting any player data from them + app.DebugPrintf("Expanding level size\n"); + // top + int minVal = -oldHellSize/2; + int maxVal = (oldHellSize/2)-1; + for(int xVal = minVal; xVal <= maxVal; xVal++) + { + int zVal = minVal; + level->cache->overwriteHellLevelChunkFromSource(xVal, zVal, minVal, maxVal); + } + // bottom + for(int xVal = minVal; xVal <= maxVal; xVal++) + { + int zVal = maxVal; + level->cache->overwriteHellLevelChunkFromSource(xVal, zVal, minVal, maxVal); + } + // left + for(int zVal = minVal; zVal <= maxVal; zVal++) + { + int xVal = minVal; + level->cache->overwriteHellLevelChunkFromSource(xVal, zVal, minVal, maxVal); + } + // right + for(int zVal = minVal; zVal <= maxVal; zVal++) + { + int xVal = maxVal; + level->cache->overwriteHellLevelChunkFromSource(xVal, zVal, minVal, maxVal); + } +} + +#endif + void MinecraftServer::setProgress(const wstring& status, int progress) { - progressStatus = status; - this->progress = progress; -// logger.info(status + ": " + progress + "%"); + progressStatus = status; + this->progress = progress; + // logger.info(status + ": " + progress + "%"); } void MinecraftServer::endProgress() { - progressStatus = L""; - this->progress = 0; + progressStatus = L""; + this->progress = 0; } void MinecraftServer::saveAllChunks() { -// logger.info("Saving chunks"); - for (unsigned int i = 0; i < levels.length; i++) + // logger.info("Saving chunks"); + for (unsigned int i = 0; i < levels.length; i++) { // 4J Stu - Due to the way save mounting is handled on XboxOne, we can actually save after the player has signed out. #ifndef _XBOX_ONE @@ -762,7 +869,7 @@ void MinecraftServer::saveAllChunks() // 4J Stu - Save the levels in reverse order so we don't overwrite the level.dat // with the data from the nethers leveldata. // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. - ServerLevel *level = levels[levels.length - 1 - i]; + ServerLevel *level = levels[levels.length - 1 - i]; if( level ) // 4J - added check as level can be NULL if we end up in stopServer really early on due to network failure { level->save(true, Minecraft::GetInstance()->progressRenderer); @@ -774,7 +881,7 @@ void MinecraftServer::saveAllChunks() level->closeLevelStorage(); } } - } + } } // 4J-JEV: Added @@ -863,7 +970,7 @@ bool MinecraftServer::IsSuspending() return m_suspending; } -void MinecraftServer::stopServer() +void MinecraftServer::stopServer(bool didInit) { // 4J-PB - need to halt the rendering of the data, since we're about to remove it @@ -877,9 +984,9 @@ void MinecraftServer::stopServer() connection->stop(); app.DebugPrintf("Stopping server\n"); -// logger.info("Stopping server"); + // logger.info("Stopping server"); // 4J-PB - If the primary player has signed out, then don't attempt to save anything - + // also need to check for a profile switch here - primary player signs out, and another player signs in before dismissing the dash #ifdef _DURANGO // On Durango check if the primary user is signed in OR mid-sign-out @@ -892,8 +999,8 @@ void MinecraftServer::stopServer() // Always save on exit! Except if saves are disabled. if(!saveOnExitAnswered()) m_saveOnExit = true; #endif - // if trial version or saving is disabled, then don't save anything - if(m_saveOnExit && ProfileManager.IsFullVersion() && (!StorageManager.GetSaveDisabled())) + // if trial version or saving is disabled, then don't save anything. Also don't save anything if we didn't actually get through the server initialisation. + if(m_saveOnExit && ProfileManager.IsFullVersion() && (!StorageManager.GetSaveDisabled()) && didInit) { if (players != NULL) { @@ -907,7 +1014,7 @@ void MinecraftServer::stopServer() // ServerLevel *level = levels[i]; // if (level != NULL) // { - saveAllChunks(); + saveAllChunks(); // } //} @@ -1028,6 +1135,11 @@ void MinecraftServer::setFlightAllowed(bool allowFlight) this->allowFlight = allowFlight; } +bool MinecraftServer::isCommandBlockEnabled() +{ + return false; //settings.getBoolean("enable-command-block", false); +} + bool MinecraftServer::isNetherEnabled() { return true; //settings.getBoolean("allow-nether", true); @@ -1038,11 +1150,71 @@ bool MinecraftServer::isHardcore() return false; } +int MinecraftServer::getOperatorUserPermissionLevel() +{ + return Command::LEVEL_OWNERS; //settings.getInt("op-permission-level", Command.LEVEL_OWNERS); +} + CommandDispatcher *MinecraftServer::getCommandDispatcher() { return commandDispatcher; } +Pos *MinecraftServer::getCommandSenderWorldPosition() +{ + return new Pos(0, 0, 0); +} + +Level *MinecraftServer::getCommandSenderWorld() +{ + return levels[0]; +} + +int MinecraftServer::getSpawnProtectionRadius() +{ + return 16; +} + +bool MinecraftServer::isUnderSpawnProtection(Level *level, int x, int y, int z, shared_ptr player) +{ + if (level->dimension->id != 0) return false; + //if (getPlayers()->getOps()->empty()) return false; + if (getPlayers()->isOp(player->getName())) return false; + if (getSpawnProtectionRadius() <= 0) return false; + + Pos *spawnPos = level->getSharedSpawnPos(); + int xd = Mth::abs(x - spawnPos->x); + int zd = Mth::abs(z - spawnPos->z); + int dist = max(xd, zd); + + return dist <= getSpawnProtectionRadius(); +} + +void MinecraftServer::setForceGameType(bool forceGameType) +{ + this->forceGameType = forceGameType; +} + +bool MinecraftServer::getForceGameType() +{ + return forceGameType; +} + +__int64 MinecraftServer::getCurrentTimeMillis() +{ + return System::currentTimeMillis(); +} + +int MinecraftServer::getPlayerIdleTimeout() +{ + return playerIdleTimeout; +} + +void MinecraftServer::setPlayerIdleTimeout(int playerIdleTimeout) +{ + this->playerIdleTimeout = playerIdleTimeout; +} + extern int c0a, c0b, c1a, c1b, c1c, c2a, c2b; void MinecraftServer::run(__int64 seed, void *lpParameter) { @@ -1056,9 +1228,11 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) findSeed = initData->findSeed; m_texturePackId = initData->texturePackId; } -// try { // 4J - removed try/catch/finally - if (initServer(seed, initData, initSettings,findSeed)) + // try { // 4J - removed try/catch/finally + bool didInit = false; + if (initServer(seed, initData, initSettings,findSeed)) { + didInit = true; ServerLevel *levelNormalDimension = levels[0]; // 4J-PB - Set the Stronghold position in the leveldata if there isn't one in there Minecraft *pMinecraft = Minecraft::GetInstance(); @@ -1075,30 +1249,30 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) } } - __int64 lastTime = System::currentTimeMillis(); - __int64 unprocessedTime = 0; - while (running && !s_bServerHalted) + __int64 lastTime = getCurrentTimeMillis(); + __int64 unprocessedTime = 0; + while (running && !s_bServerHalted) { - __int64 now = System::currentTimeMillis(); + __int64 now = getCurrentTimeMillis(); // 4J Stu - When we pause the server, we don't want to count that as time passed // 4J Stu - TU-1 hotifx - Remove this line. We want to make sure that we tick connections at the proper rate when paused //Fix for #13191 - The host of a game can get a message informing them that the connection to the server has been lost //if(m_isServerPaused) lastTime = now; - __int64 passedTime = now - lastTime; - if (passedTime > MS_PER_TICK * 40) + __int64 passedTime = now - lastTime; + if (passedTime > MS_PER_TICK * 40) { -// logger.warning("Can't keep up! Did the system time change, or is the server overloaded?"); - passedTime = MS_PER_TICK * 40; - } - if (passedTime < 0) + // logger.warning("Can't keep up! Did the system time change, or is the server overloaded?"); + passedTime = MS_PER_TICK * 40; + } + if (passedTime < 0) { -// logger.warning("Time ran backwards! Did the system time change?"); - passedTime = 0; - } - unprocessedTime += passedTime; - lastTime = now; + // logger.warning("Time ran backwards! Did the system time change?"); + passedTime = 0; + } + unprocessedTime += passedTime; + lastTime = now; // 4J Added ability to pause the server if( !m_isServerPaused ) @@ -1111,29 +1285,18 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) } else { -// int tickcount = 0; -// __int64 beforeall = System::currentTimeMillis(); + // int tickcount = 0; + // __int64 beforeall = System::currentTimeMillis(); while (unprocessedTime > MS_PER_TICK) { unprocessedTime -= MS_PER_TICK; + chunkPacketManagement_PreTick(); // __int64 before = System::currentTimeMillis(); tick(); // __int64 after = System::currentTimeMillis(); // PIXReportCounter(L"Server time",(float)(after-before)); - // 4J Ensure that the slow queue owner keeps cycling if it's not been used in a while - int time = GetTickCount(); - if( ( s_slowQueuePacketSent ) || ( (time - s_slowQueueLastTime) > ( 2 * MINECRAFT_SERVER_SLOW_QUEUE_DELAY ) ) ) - { -// app.DebugPrintf("Considering cycling: (%d) %d - %d -> %d > %d\n",s_slowQueuePacketSent, time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); - MinecraftServer::cycleSlowQueueIndex(); - s_slowQueuePacketSent = false; - s_slowQueueLastTime = time; - } -// else -// { -// app.DebugPrintf("Not considering cycling: %d - %d -> %d > %d\n",time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); -// } + chunkPacketManagement_PostTick(); } // __int64 afterall = System::currentTimeMillis(); // PIXReportCounter(L"Server time all",(float)(afterall-beforeall)); @@ -1155,28 +1318,26 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) if(MinecraftServer::setTimeAtEndOfTick) { MinecraftServer::setTimeAtEndOfTick = false; - for (unsigned int i = 0; i < levels.length; i++) + for (unsigned int i = 0; i < levels.length; i++) { -// if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether + // if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether { ServerLevel *level = levels[i]; - level->setTime( MinecraftServer::setTime ); - level->setOverrideTimeOfDay( -1 ); + level->setGameTime( MinecraftServer::setTime ); } - } + } } if(MinecraftServer::setTimeOfDayAtEndOfTick) { MinecraftServer::setTimeOfDayAtEndOfTick = false; - for (unsigned int i = 0; i < levels.length; i++) + for (unsigned int i = 0; i < levels.length; i++) { if (i == 0 || settings->getBoolean(L"allow-nether", true)) { ServerLevel *level = levels[i]; - //level->setTime( MinecraftServer::setTime ); - level->setOverrideTimeOfDay( MinecraftServer::setTimeOfDay ); + level->setDayTime( MinecraftServer::setTimeOfDay ); } - } + } } // Process delayed actions @@ -1244,7 +1405,7 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) { players->saveAll(Minecraft::GetInstance()->progressRenderer); } - + players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); for (unsigned int j = 0; j < levels.length; j++) @@ -1255,7 +1416,7 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. ServerLevel *level = levels[levels.length - 1 - j]; level->save(true, Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); - + players->broadcastAll( shared_ptr( new UpdateProgressPacket(33 + (j*33) ) ) ); } if( !s_bServerHalted ) @@ -1269,19 +1430,19 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) case eXuiServerAction_DropItem: // Find the player, and drop the id at their feet { - shared_ptr player = players->players.at(0); - size_t id = (size_t) param; - player->drop( shared_ptr( new ItemInstance(id, 1, 0 ) ) ); + shared_ptr player = players->players.at(0); + size_t id = (size_t) param; + player->drop( shared_ptr( new ItemInstance(id, 1, 0 ) ) ); } break; case eXuiServerAction_SpawnMob: { - shared_ptr player = players->players.at(0); - eINSTANCEOF factory = (eINSTANCEOF)((size_t)param); - shared_ptr mob = dynamic_pointer_cast(EntityIO::newByEnumType(factory,player->level )); - mob->moveTo(player->x+1, player->y, player->z+1, player->level->random->nextFloat() * 360, 0); - mob->setDespawnProtected(); // 4J added, default to being protected against despawning (has to be done after initial position is set) - player->level->addEntity(mob); + shared_ptr player = players->players.at(0); + eINSTANCEOF factory = (eINSTANCEOF)((size_t)param); + shared_ptr mob = dynamic_pointer_cast(EntityIO::newByEnumType(factory,player->level )); + mob->moveTo(player->x+1, player->y, player->z+1, player->level->random->nextFloat() * 360, 0); + mob->setDespawnProtected(); // 4J added, default to being protected against despawning (has to be done after initial position is set) + player->level->addEntity(mob); } break; case eXuiServerAction_PauseServer: @@ -1318,7 +1479,7 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) case eXuiServerAction_ExportSchematic: #ifndef _CONTENT_PACKAGE app.EnterSaveNotificationSection(); - + //players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); if( !s_bServerHalted ) @@ -1353,13 +1514,13 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) app.DebugPrintf( "DEBUG: Player=%i\n", pos->player ); app.DebugPrintf( "DEBUG: Teleporting to pos=(%f.2, %f.2, %f.2), looking at=(%f.2,%f.2)\n", - pos->m_camX, pos->m_camY, pos->m_camZ, - pos->m_yRot, pos->m_elev - ); + pos->m_camX, pos->m_camY, pos->m_camZ, + pos->m_yRot, pos->m_elev + ); shared_ptr player = players->players.at(pos->player); player->debug_setPosition( pos->m_camX, pos->m_camY, pos->m_camZ, - pos->m_yRot, pos->m_elev ); + pos->m_yRot, pos->m_elev ); // Doesn't work //player->setYHeadRot(pos->m_yRot); @@ -1368,47 +1529,47 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) #endif break; } - + app.SetXuiServerAction(i,eXuiServerAction_Idle); } Sleep(1); - } - } + } + } //else //{ - // while (running) + // while (running) // { - // handleConsoleInputs(); + // handleConsoleInputs(); // Sleep(10); - // } - //} + // } + //} #if 0 +} catch (Throwable t) { + t.printStackTrace(); + logger.log(Level.SEVERE, "Unexpected exception", t); + while (running) { + handleConsoleInputs(); + try { + Thread.sleep(10); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + } +} finally { + try { + stopServer(); + stopped = true; } catch (Throwable t) { - t.printStackTrace(); - logger.log(Level.SEVERE, "Unexpected exception", t); - while (running) { - handleConsoleInputs(); - try { - Thread.sleep(10); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - } - } finally { - try { - stopServer(); - stopped = true; - } catch (Throwable t) { - t.printStackTrace(); - } finally { - System::exit(0); - } - } + t.printStackTrace(); + } finally { + System::exit(0); + } +} #endif // 4J Stu - Stop the server when the loops complete, as the finally would do - stopServer(); + stopServer(didInit); stopped = true; } @@ -1427,43 +1588,43 @@ void MinecraftServer::broadcastStopSavingPacket() void MinecraftServer::tick() { - vector toRemove; - for (AUTO_VAR(it, ironTimers.begin()); it != ironTimers.end(); it++ ) + vector toRemove; + for (AUTO_VAR(it, ironTimers.begin()); it != ironTimers.end(); it++ ) { - int t = it->second; - if (t > 0) + int t = it->second; + if (t > 0) { - ironTimers[it->first] = t - 1; - } + ironTimers[it->first] = t - 1; + } else { - toRemove.push_back(it->first); - } - } - for (unsigned int i = 0; i < toRemove.size(); i++) + toRemove.push_back(it->first); + } + } + for (unsigned int i = 0; i < toRemove.size(); i++) { - ironTimers.erase(toRemove[i]); - } + ironTimers.erase(toRemove[i]); + } + + AABB::resetPool(); + Vec3::resetPool(); - AABB::resetPool(); - Vec3::resetPool(); - - tickCount++; + tickCount++; // 4J We need to update client difficulty levels based on the servers Minecraft *pMinecraft = Minecraft::GetInstance(); // 4J-PB - sending this on the host changing the difficulty in the menus -/* if(m_lastSentDifficulty != pMinecraft->options->difficulty) + /* if(m_lastSentDifficulty != pMinecraft->options->difficulty) { - m_lastSentDifficulty = pMinecraft->options->difficulty; - players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_DIFFICULTY, pMinecraft->options->difficulty) ) ); + m_lastSentDifficulty = pMinecraft->options->difficulty; + players->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_DIFFICULTY, pMinecraft->options->difficulty) ) ); }*/ - for (unsigned int i = 0; i < levels.length; i++) + for (unsigned int i = 0; i < levels.length; i++) { -// if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether + // if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether { - ServerLevel *level = levels[i]; + ServerLevel *level = levels[i]; // 4J Stu - We set the levels difficulty based on the minecraft options level->difficulty = app.GetGameHostOption(eGameHostOption_Difficulty); //pMinecraft->options->difficulty; @@ -1474,23 +1635,19 @@ void MinecraftServer::tick() level->setSpawnSettings(level->difficulty > 0 && !Minecraft::GetInstance()->isTutorial(), animals); #endif - if (tickCount % 20 == 0) + if (tickCount % 20 == 0) { - players->broadcastAll( shared_ptr( new SetTimePacket(level->getTime() ) ), level->dimension->id); - } -// #ifndef __PS3__ + players->broadcastAll( shared_ptr( new SetTimePacket(level->getGameTime(), level->getDayTime(), level->getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT) ) ), level->dimension->id); + } + // #ifndef __PS3__ static __int64 stc = 0; __int64 st0 = System::currentTimeMillis(); PIXBeginNamedEvent(0,"Level tick %d",i); - ((Level *)level)->tick(); + ((Level *)level)->tick(); __int64 st1 = System::currentTimeMillis(); PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Update lights %d",i); - // 4J - used to be in a while loop, but we don't want the server locking up for a big chunk of time (could end up trying to process 1,000,000 lights...) - // Instead call this once, which will try and process up to 2000 lights per tick -// printf("lights: %d\n",level->getLightsToUpdate()); - while(level->updateLights() ) - ; + __int64 st2 = System::currentTimeMillis(); PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Entity tick %d",i); @@ -1520,32 +1677,32 @@ void MinecraftServer::tick() PIXEndNamedEvent(); __int64 st3 = System::currentTimeMillis(); -// printf(">>>>>>>>>>>>>>>>>>>>>> Tick %d %d %d : %d\n", st1 - st0, st2 - st1, st3 - st2, st0 - stc ); + // printf(">>>>>>>>>>>>>>>>>>>>>> Tick %d %d %d : %d\n", st1 - st0, st2 - st1, st3 - st2, st0 - stc ); stc = st0; -// #endif// __PS3__ - } - } + // #endif// __PS3__ + } + } Entity::tickExtraWandering(); // 4J added PIXBeginNamedEvent(0,"Connection tick"); - connection->tick(); + connection->tick(); PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Players tick"); - players->tick(); + players->tick(); PIXEndNamedEvent(); // 4J - removed #if 0 - for (int i = 0; i < tickables.size(); i++) { - tickables.get(i)-tick(); - } + for (int i = 0; i < tickables.size(); i++) { + tickables.get(i)-tick(); + } #endif -// try { // 4J - removed try/catch - handleConsoleInputs(); -// } catch (Exception e) { -// logger.log(Level.WARNING, "Unexpected exception while parsing console command", e); -// } + // try { // 4J - removed try/catch + handleConsoleInputs(); + // } catch (Exception e) { + // logger.log(Level.WARNING, "Unexpected exception while parsing console command", e); + // } } void MinecraftServer::handleConsoleInput(const wstring& msg, ConsoleInputSource *source) @@ -1555,13 +1712,13 @@ void MinecraftServer::handleConsoleInput(const wstring& msg, ConsoleInputSource void MinecraftServer::handleConsoleInputs() { - while (consoleInput.size() > 0) + while (consoleInput.size() > 0) { AUTO_VAR(it, consoleInput.begin()); - ConsoleInput *input = *it; + ConsoleInput *input = *it; consoleInput.erase(it); -// commands->handleCommand(input); // 4J - removed - TODO - do we want equivalent of console commands? - } + // commands->handleCommand(input); // 4J - removed - TODO - do we want equivalent of console commands? + } } void MinecraftServer::main(__int64 seed, void *lpParameter) @@ -1606,21 +1763,105 @@ wstring MinecraftServer::getConsoleName() ServerLevel *MinecraftServer::getLevel(int dimension) { - if (dimension == -1) return levels[1]; + if (dimension == -1) return levels[1]; else if (dimension == 1) return levels[2]; - else return levels[0]; + else return levels[0]; } // 4J added void MinecraftServer::setLevel(int dimension, ServerLevel *level) { - if (dimension == -1) levels[1] = level; + if (dimension == -1) levels[1] = level; else if (dimension == 1) levels[2] = level; - else levels[0] = level; + else levels[0] = level; +} + +#if defined _ACK_CHUNK_SEND_THROTTLING +bool MinecraftServer::chunkPacketManagement_CanSendTo(INetworkPlayer *player) +{ + if( s_hasSentEnoughPackets ) return false; + if( player == NULL ) return false; + + for( int i = 0; i < s_sentTo.size(); i++ ) + { + if( s_sentTo[i]->IsSameSystem(player) ) + { + return false; + } + } + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + return ( player->GetOutstandingAckCount() < 3 ); +#else + return ( player->GetOutstandingAckCount() < 2 ); +#endif +} + +void MinecraftServer::chunkPacketManagement_DidSendTo(INetworkPlayer *player) +{ + __int64 currentTime = System::currentTimeMillis(); + + if( ( currentTime - s_tickStartTime ) >= MAX_TICK_TIME_FOR_PACKET_SENDS ) + { + s_hasSentEnoughPackets = true; +// app.DebugPrintf("Sending, setting enough packet flag: %dms\n",currentTime - s_tickStartTime); + } + else + { +// app.DebugPrintf("Sending, more time: %dms\n",currentTime - s_tickStartTime); + } + + player->SentChunkPacket(); + + s_sentTo.push_back(player); } +void MinecraftServer::chunkPacketManagement_PreTick() +{ +// app.DebugPrintf("*************************************************************************************************************************************************************************\n"); + s_hasSentEnoughPackets = false; + s_tickStartTime = System::currentTimeMillis(); + s_sentTo.clear(); + + vector< shared_ptr > *players = connection->getPlayers(); + + if( players->size() ) + { + vector< shared_ptr > playersOrig = *players; + players->clear(); + + do + { + int longestTime = 0; + AUTO_VAR(playerConnectionBest,playersOrig.begin()); + for( AUTO_VAR(it, playersOrig.begin()); it != playersOrig.end(); it++) + { + int thisTime = 0; + INetworkPlayer *np = (*it)->getNetworkPlayer(); + if( np ) + { + thisTime = np->GetTimeSinceLastChunkPacket_ms(); + } + + if( thisTime > longestTime ) + { + playerConnectionBest = it; + longestTime = thisTime; + } + } + players->push_back(*playerConnectionBest); + playersOrig.erase(playerConnectionBest); + } while ( playersOrig.size() > 0 ); + } +} + +void MinecraftServer::chunkPacketManagement_PostTick() +{ +} + +#else // 4J Added -bool MinecraftServer::canSendOnSlowQueue(INetworkPlayer *player) +bool MinecraftServer::chunkPacketManagement_CanSendTo(INetworkPlayer *player) { if( player == NULL ) return false; @@ -1634,6 +1875,32 @@ bool MinecraftServer::canSendOnSlowQueue(INetworkPlayer *player) return false; } +void MinecraftServer::chunkPacketManagement_DidSendTo(INetworkPlayer *player) +{ + s_slowQueuePacketSent = true; +} + +void MinecraftServer::chunkPacketManagement_PreTick() +{ +} + +void MinecraftServer::chunkPacketManagement_PostTick() +{ + // 4J Ensure that the slow queue owner keeps cycling if it's not been used in a while + int time = GetTickCount(); + if( ( s_slowQueuePacketSent ) || ( (time - s_slowQueueLastTime) > ( 2 * MINECRAFT_SERVER_SLOW_QUEUE_DELAY ) ) ) + { +// app.DebugPrintf("Considering cycling: (%d) %d - %d -> %d > %d\n",s_slowQueuePacketSent, time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); + MinecraftServer::cycleSlowQueueIndex(); + s_slowQueuePacketSent = false; + s_slowQueueLastTime = time; + } +// else +// { +// app.DebugPrintf("Not considering cycling: %d - %d -> %d > %d\n",time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); +// } +} + void MinecraftServer::cycleSlowQueueIndex() { if( !g_NetworkManager.IsInSession() ) return; @@ -1666,6 +1933,7 @@ void MinecraftServer::cycleSlowQueueIndex() ); // app.DebugPrintf("Cycled slow queue index to %d\n", s_slowQueuePlayerIndex); } +#endif // 4J added - sets up a vector of flags to indicate which entities (with small Ids) have been removed from the level, but are still haven't constructed a network packet // to tell a remote client about it. These small Ids shouldn't be re-used. Most of the time this method shouldn't actually do anything, in which case it will return false @@ -1682,4 +1950,4 @@ bool MinecraftServer::flagEntitiesToBeRemoved(unsigned int *flags) } } return removedFound; -} \ No newline at end of file +} diff --git a/Minecraft.Client/MinecraftServer.h b/Minecraft.Client/MinecraftServer.h index e61001a3..5f33fa85 100644 --- a/Minecraft.Client/MinecraftServer.h +++ b/Minecraft.Client/MinecraftServer.h @@ -20,6 +20,10 @@ class CommandDispatcher; #define MINECRAFT_SERVER_SLOW_QUEUE_DELAY 250 +#if defined _XBOX_ONE || defined _XBOX || defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ +#define _ACK_CHUNK_SEND_THROTTLING +#endif + typedef struct _LoadSaveDataThreadParam { LPVOID data; @@ -107,6 +111,8 @@ public: bool allowFlight; wstring motd; int maxBuildHeight; + int playerIdleTimeout; + bool forceGameType; private: // 4J Added @@ -132,8 +138,12 @@ private: void endProgress(); void saveAllChunks(); void saveGameRules(); - void stopServer(); + void stopServer(bool didInit); +#ifdef _LARGE_WORLDS + void overwriteBordersForNewWorldSize(ServerLevel* level); + void overwriteHellBordersForNewWorldSize(ServerLevel* level, int oldHellSize); +#endif public: void setMaxBuildHeight(int maxBuildHeight); int getMaxBuildHeight(); @@ -148,9 +158,20 @@ public: void setPvpAllowed(bool pvp); bool isFlightAllowed(); void setFlightAllowed(bool allowFlight); + bool isCommandBlockEnabled(); bool isNetherEnabled(); bool isHardcore(); + int getOperatorUserPermissionLevel(); CommandDispatcher *getCommandDispatcher(); + Pos *getCommandSenderWorldPosition(); + Level *getCommandSenderWorld(); + int getSpawnProtectionRadius(); + bool isUnderSpawnProtection(Level *level, int x, int y, int z, shared_ptr player); + void setForceGameType(bool forceGameType); + bool getForceGameType(); + static __int64 getCurrentTimeMillis(); + int getPlayerIdleTimeout(); + void setPlayerIdleTimeout(int playerIdleTimeout); public: void halt(); @@ -220,10 +241,16 @@ private: bool m_isServerPaused; // 4J Added - A static that stores the QNet index of the player that is next allowed to send a packet in the slow queue +#ifdef _ACK_CHUNK_SEND_THROTTLING + static bool s_hasSentEnoughPackets; + static __int64 s_tickStartTime; + static vector s_sentTo; + static const int MAX_TICK_TIME_FOR_PACKET_SENDS = 35; +#else static int s_slowQueuePlayerIndex; static int s_slowQueueLastTime; -public: static bool s_slowQueuePacketSent; +#endif bool IsServerPaused() { return m_isServerPaused; } @@ -233,9 +260,14 @@ private: bool m_suspending; public: - //static int getSlowQueueIndex() { return s_slowQueuePlayerIndex; } - static bool canSendOnSlowQueue(INetworkPlayer *player); + static bool chunkPacketManagement_CanSendTo(INetworkPlayer *player); + static void chunkPacketManagement_DidSendTo(INetworkPlayer *player); +#ifndef _ACK_CHUNK_SEND_THROTTLING static void cycleSlowQueueIndex(); +#endif + + void chunkPacketManagement_PreTick(); + void chunkPacketManagement_PostTick(); void setSaveOnExit(bool save) { m_saveOnExit = save; s_bSaveOnExitAnswered = true; } void Suspend(); diff --git a/Minecraft.Client/MobRenderer.cpp b/Minecraft.Client/MobRenderer.cpp index 8874ab9c..ee512530 100644 --- a/Minecraft.Client/MobRenderer.cpp +++ b/Minecraft.Client/MobRenderer.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "MobRenderer.h" +#include "LivingEntityRenderer.h" #include "MultiPlayerLocalPlayer.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" @@ -8,508 +9,119 @@ #include "..\Minecraft.World\Mth.h" #include "entityRenderDispatcher.h" -MobRenderer::MobRenderer(Model *model, float shadow) : EntityRenderer() +MobRenderer::MobRenderer(Model *model, float shadow) : LivingEntityRenderer(model, shadow) { - this->model = model; - this->shadowRadius = shadow; - - this->armor = NULL; } -void MobRenderer::setArmor(Model *armor) +void MobRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) { - this->armor = armor; + shared_ptr mob = dynamic_pointer_cast(_mob); + + LivingEntityRenderer::render(mob, x, y, z, rot, a); + renderLeash(mob, x, y, z, rot, a); } -float MobRenderer::rotlerp(float from, float to, float a) +bool MobRenderer::shouldShowName(shared_ptr mob) { - float diff = to - from; - while (diff < -180) - diff += 360; - while (diff >= 180) - diff -= 360; - return from + a * diff; + return LivingEntityRenderer::shouldShowName(mob) && (mob->shouldShowName() || dynamic_pointer_cast(mob)->hasCustomName() && mob == entityRenderDispatcher->crosshairPickMob); } -void MobRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +void MobRenderer::renderLeash(shared_ptr entity, double x, double y, double z, float rot, float a) { - // 4J - added - this used to use generics so the input parameter could be a mob (or derived type), but we aren't - // able to do that so dynamically casting to get the more specific type here. - shared_ptr mob = dynamic_pointer_cast(_mob); - glPushMatrix(); - glDisable(GL_CULL_FACE); - - model->attackTime = getAttackAnim(mob, a); - if (armor != NULL) armor->attackTime = model->attackTime; - model->riding = mob->isRiding(); - if (armor != NULL) armor->riding = model->riding; - model->young = mob->isBaby(); - if (armor != NULL) armor->young = model->young; - - // 4J - removed try/catch -// try -// { - float bodyRot = rotlerp(mob->yBodyRotO, mob->yBodyRot, a); - float headRot = rotlerp(mob->yHeadRotO, mob->yHeadRot, a); - - if (mob->isRiding() && dynamic_pointer_cast(mob->riding)) - { - shared_ptr riding = dynamic_pointer_cast(mob->riding); - bodyRot = rotlerp(riding->yBodyRotO, riding->yBodyRot, a); - - float headDiff = Mth::wrapDegrees(headRot - bodyRot); - if (headDiff < -85) headDiff = -85; - if (headDiff >= 85) headDiff = +85; - bodyRot = headRot - headDiff; - if (headDiff * headDiff > 50 * 50) - { - bodyRot += headDiff * 0.2f; - } - } - - float headRotx = (mob->xRotO + (mob->xRot - mob->xRotO) * a); - - setupPosition(mob, x, y, z); - - float bob = getBob(mob, a); - setupRotations(mob, bob, bodyRot, a); - - float _scale = 1 / 16.0f; - glEnable(GL_RESCALE_NORMAL); - glScalef(-1, -1, 1); - - scale(mob, a); - glTranslatef(0, -24 * _scale - 0.125f / 16.0f, 0); - - - float ws = mob->walkAnimSpeedO + (mob->walkAnimSpeed - mob->walkAnimSpeedO) * a; - float wp = mob->walkAnimPos - mob->walkAnimSpeed * (1 - a); - if (mob->isBaby()) + shared_ptr roper = entity->getLeashHolder(); + // roper = entityRenderDispatcher.cameraEntity; + if (roper != NULL) + { + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + y -= (1.6 - entity->bbHeight) * .5; + Tesselator *tessellator = Tesselator::getInstance(); + double roperYRot = lerp(roper->yRotO, roper->yRot, a * .5f) * Mth::RAD_TO_GRAD; + double roperXRot = lerp(roper->xRotO, roper->xRot, a * .5f) * Mth::RAD_TO_GRAD; + double rotOffCos = cos(roperYRot); + double rotOffSin = sin(roperYRot); + double yOff = sin(roperXRot); + if (roper->instanceof(eTYPE_HANGING_ENTITY)) { - wp *= 3.0f; - } - - if (ws > 1) ws = 1; - - MemSect(31); - bindTexture(mob->customTextureUrl, mob->getTexture()); - MemSect(0); - glEnable(GL_ALPHA_TEST); - - model->prepareMobModel(mob, wp, ws, a); - renderModel(mob, wp, ws, bob, headRot - bodyRot, headRotx, _scale); - for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + rotOffCos = 0; + rotOffSin = 0; + yOff = -1; + } + double swingOff = cos(roperXRot); + double endX = lerp(roper->xo, roper->x, a) - (rotOffCos * 0.7) - (rotOffSin * 0.5 * swingOff); + double endY = lerp(roper->yo + roper->getHeadHeight() * .7, roper->y + roper->getHeadHeight() * .7, a) - (yOff * 0.5) - .25; + double endZ = lerp(roper->zo, roper->z, a) - (rotOffSin * 0.7) + (rotOffCos * 0.5 * swingOff); + + double entityYRot = lerp(entity->yBodyRotO, entity->yBodyRot, a) * Mth::RAD_TO_GRAD + PI * .5; + rotOffCos = cos(entityYRot) * entity->bbWidth * .4; + rotOffSin = sin(entityYRot) * entity->bbWidth * .4; + double startX = lerp(entity->xo, entity->x, a) + rotOffCos; + double startY = lerp(entity->yo, entity->y, a); + double startZ = lerp(entity->zo, entity->z, a) + rotOffSin; + x += rotOffCos; + z += rotOffSin; + + double dx = (float) (endX - startX); + double dy = (float) (endY - startY); + double dz = (float) (endZ - startZ); + + glDisable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + + unsigned int lightCol = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Leash_Light_Colour ); + float rLightCol = ( (lightCol>>16)&0xFF )/255.0f; + float gLightCol = ( (lightCol>>8)&0xFF )/255.0; + float bLightCol = ( lightCol&0xFF )/255.0; + + unsigned int darkCol = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Leash_Dark_Colour ); + float rDarkCol = ( (darkCol>>16)&0xFF )/255.0f; + float gDarkCol = ( (darkCol>>8)&0xFF )/255.0; + float bDarkCol = ( darkCol&0xFF )/255.0; + + int steps = 24; + double width = .025; + tessellator->begin(GL_TRIANGLE_STRIP); + for (int k = 0; k <= steps; k++) { - int armorType = prepareArmor(mob, i, a); - if (armorType > 0) + if (k % 2 == 0) { - armor->prepareMobModel(mob, wp, ws, a); - armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); - if ((armorType & 0xf0) == 16) - { - prepareSecondPassArmor(mob, i, a); - armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); - } - // 4J - added condition here for rendering player as part of the gui. Avoiding rendering the glint here as it involves using its own blending, and for gui rendering - // we are globally blending to be able to offer user configurable gui opacity. Note that I really don't know why GL_BLEND is turned off at the end of the first - // armour layer anyway, or why alpha testing is turned on... but we definitely don't want to be turning blending off during the gui render. - if( !entityRenderDispatcher->isGuiRender ) - { - if ((armorType & 0xf) == 0xf) //MGH - fix for missing enchantment glow - { - float time = mob->tickCount + a; - bindTexture(TN__BLUR__MISC_GLINT); // 4J was "%blur%/misc/glint.png" - glEnable(GL_BLEND); - float br = 0.5f; - glColor4f(br, br, br, 1); - glDepthFunc(GL_EQUAL); - glDepthMask(false); - - for (int j = 0; j < 2; j++) - { - glDisable(GL_LIGHTING); - float brr = 0.76f; - glColor4f(0.5f * brr, 0.25f * brr, 0.8f * brr, 1); - glBlendFunc(GL_SRC_COLOR, GL_ONE); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - float uo = time * (0.001f + j * 0.003f) * 20; - float ss = 1 / 3.0f; - glScalef(ss, ss, ss); - glRotatef(30 - (j) * 60.0f, 0, 0, 1); - glTranslatef(0, uo, 0); - glMatrixMode(GL_MODELVIEW); - armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); - } - - glColor4f(1, 1, 1, 1); - glMatrixMode(GL_TEXTURE); - glDepthMask(true); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glEnable(GL_LIGHTING); - glDisable(GL_BLEND); - glDepthFunc(GL_LEQUAL); - - } - glDisable(GL_BLEND); - } - glEnable(GL_ALPHA_TEST); + tessellator->color(rLightCol, gLightCol, bLightCol, 1.0F); } + else + { + tessellator->color(rDarkCol, gDarkCol, bDarkCol, 1.0F); + } + float aa = (float) k / (float) steps; + tessellator->vertex(x + (dx * aa) + 0, y + (dy * ((aa * aa) + aa) * 0.5) + ((((float) steps - (float) k) / (steps * 0.75F)) + 0.125F), z + (dz * aa)); + tessellator->vertex(x + (dx * aa) + width, y + (dy * ((aa * aa) + aa) * 0.5) + ((((float) steps - (float) k) / (steps * 0.75F)) + 0.125F) + width, z + (dz * aa)); } + tessellator->end(); - glDepthMask(true); - - additionalRendering(mob, a); - float br = mob->getBrightness(a); - int overlayColor = getOverlayColor(mob, br, a); - glActiveTexture(GL_TEXTURE1); - glDisable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0); - - if (((overlayColor >> 24) & 0xff) > 0 || mob->hurtTime > 0 || mob->deathTime > 0) + tessellator->begin(GL_TRIANGLE_STRIP); + for (int k = 0; k <= steps; k++) { - 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) + if (k % 2 == 0) { - glColor4f(br, 0, 0, 0.4f); - model->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); - for (int i = 0; i < MAX_ARMOR_LAYERS; i++) - { - if (prepareArmorOverlay(mob, i, a) >= 0) - { - glColor4f(br, 0, 0, 0.4f); - armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); - } - } + tessellator->color(rLightCol, gLightCol, bLightCol, 1.0F); } - - if (((overlayColor >> 24) & 0xff) > 0) + else { - 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(mob, wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); - for (int i = 0; i < MAX_ARMOR_LAYERS; i++) - { - if (prepareArmorOverlay(mob, i, a) >= 0) - { - glColor4f(r, g, b, aa); - armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); - } - } + tessellator->color(rDarkCol, gDarkCol, bDarkCol, 1.0F); } - - glDepthFunc(GL_LEQUAL); - glDisable(GL_BLEND); - glEnable(GL_ALPHA_TEST); - glEnable(GL_TEXTURE_2D); + float aa = (float) k / (float) steps; + tessellator->vertex(x + (dx * aa) + 0, y + (dy * ((aa * aa) + aa) * 0.5) + ((((float) steps - (float) k) / (steps * 0.75F)) + 0.125F) + width, z + (dz * aa)); + tessellator->vertex(x + (dx * aa) + width, y + (dy * ((aa * aa) + aa) * 0.5) + ((((float) steps - (float) k) / (steps * 0.75F)) + 0.125F), z + (dz * aa) + width); } - glDisable(GL_RESCALE_NORMAL); -// } -//catch (Exception e) { - // // System.out.println("Failed: " + modelNames[model]); - // e.printStackTrace(); - // } - glActiveTexture(GL_TEXTURE1); - glEnable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0); - - glEnable(GL_CULL_FACE); - - glPopMatrix(); - - MemSect(31); - renderName(mob, x, y, z); - MemSect(0); -} - -void MobRenderer::renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) -{ - shared_ptr player = dynamic_pointer_cast(Minecraft::GetInstance()->player); - - bindTexture(mob->customTextureUrl, mob->getTexture()); - if (!mob->isInvisible()) - { - model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); - } - else if ( !mob->isInvisibleTo(player) ) - { - glPushMatrix(); - glColor4f(1, 1, 1, 0.15f); - glDepthMask(false); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glAlphaFunc(GL_GREATER, 1.0f / 255.0f); - model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); - glDisable(GL_BLEND); - glAlphaFunc(GL_GREATER, .1f); - glPopMatrix(); - glDepthMask(true); - } - else - { - model->setupAnim(wp, ws, bob, headRotMinusBodyRot, headRotx, scale);//, mob); - } -} - -void MobRenderer::setupPosition(shared_ptr mob, double x, double y, double z) -{ - glTranslatef((float) x, (float) y, (float) z); -} + tessellator->end(); -void MobRenderer::setupRotations(shared_ptr mob, float bob, float bodyRot, float a) -{ - glRotatef(180 - bodyRot, 0, 1, 0); - if (mob->deathTime > 0) - { - float fall = (mob->deathTime + a - 1) / 20.0f * 1.6f; - fall = (float)sqrt(fall); - if (fall > 1) fall = 1; - glRotatef(fall * getFlipDegrees(mob), 0, 0, 1); + glEnable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); + glEnable(GL_CULL_FACE); } } -float MobRenderer::getAttackAnim(shared_ptr mob, float a) -{ - return mob->getAttackAnim(a); -} - -float MobRenderer::getBob(shared_ptr mob, float a) -{ - return (mob->tickCount + a); -} - -void MobRenderer::additionalRendering(shared_ptr mob, float a) -{ -} - -int MobRenderer::prepareArmorOverlay(shared_ptr mob, int layer, float a) +double MobRenderer::lerp(double prev, double next, double a) { - return prepareArmor(mob, layer, a); -} - -int MobRenderer::prepareArmor(shared_ptr mob, int layer, float a) -{ - return -1; -} - -void MobRenderer::prepareSecondPassArmor(shared_ptr mob, int layer, float a) -{ -} - -float MobRenderer::getFlipDegrees(shared_ptr mob) -{ - return 90; -} - -int MobRenderer::getOverlayColor(shared_ptr mob, float br, float a) -{ - return 0; -} - -void MobRenderer::scale(shared_ptr mob, float a) -{ -} - -void MobRenderer::renderName(shared_ptr mob, double x, double y, double z) -{ - if (Minecraft::renderDebug()) - { - //renderNameTag(mob, _toString(mob->entityId), x, y, z, 64); - } -} - -// 4J Added parameter for color here so that we can colour players names -void MobRenderer::renderNameTag(shared_ptr mob, const wstring& OriginalName, double x, double y, double z, int maxDist, int color /*= 0xffffffff*/) -{ - - if ( app.GetGameSettings(eGameSetting_DisplayHUD)==0 ) - { - // 4J-PB - turn off gamertag render - return; - } - - if(app.GetGameHostOption(eGameHostOption_Gamertags)==0) - { - // turn off gamertags if the host has set them off - return; - } - - float dist = mob->distanceTo(entityRenderDispatcher->cameraEntity); - - if (dist > maxDist) - { - return; - } - - Font *font = getFont(); - - float size = 1.60f; - float s = 1 / 60.0f * size; - - glPushMatrix(); - glTranslatef((float) x + 0, (float) y + 2.3f, (float) z); - glNormal3f(0, 1, 0); - - glRotatef(-this->entityRenderDispatcher->playerRotY, 0, 1, 0); - glRotatef(this->entityRenderDispatcher->playerRotX, 1, 0, 0); - - glScalef(-s, -s, s); - glDisable(GL_LIGHTING); - - // 4J Stu - If it's beyond readable distance, then just render a coloured box - int readableDist = PLAYER_NAME_READABLE_FULLSCREEN; - if( !RenderManager.IsHiDef() ) - { - readableDist = PLAYER_NAME_READABLE_DISTANCE_SD; - } - else if ( app.GetLocalPlayerCount() > 2 ) - { - readableDist = PLAYER_NAME_READABLE_DISTANCE_SPLITSCREEN; - } - - float textOpacity = 1.0f; - if( dist >= readableDist ) - { - int diff = dist - readableDist; - - textOpacity /= (diff/2); - - if( diff > readableDist ) textOpacity = 0.0f; - } - - if( textOpacity < 0.0f ) textOpacity = 0.0f; - if( textOpacity > 1.0f ) textOpacity = 1.0f; - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - Tesselator *t = Tesselator::getInstance(); - - int offs = 0; - shared_ptr player = dynamic_pointer_cast(mob); - if (player != NULL && app.isXuidDeadmau5( player->getXuid() ) ) offs = -10; - - wstring playerName; - WCHAR wchName[2]; - -#if defined(__PS3__) || defined(__ORBIS__) - // Check we have all the font characters for this player name - switch(player->GetPlayerNameValidState()) - { - case Player::ePlayerNameValid_NotSet: - if(font->AllCharactersValid(OriginalName)) - { - playerName=OriginalName; - player->SetPlayerNameValidState(true); - } - else - { - memset(wchName,0,sizeof(WCHAR)*2); - swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); - playerName=wchName; - player->SetPlayerNameValidState(false); - } - break; - case Player::ePlayerNameValid_True: - playerName=OriginalName; - break; - case Player::ePlayerNameValid_False: - memset(wchName,0,sizeof(WCHAR)*2); - swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); - playerName=wchName; - break; - } - -#else - playerName=OriginalName; -#endif - - if( textOpacity > 0.0f ) - { - glColor4f(1.0f,1.0f,1.0f,textOpacity); - - glDepthMask(false); - glDisable(GL_DEPTH_TEST); - - glDisable(GL_TEXTURE_2D); - - t->begin(); - int w = font->width(playerName) / 2; - - if( textOpacity < 1.0f ) - { - t->color(color, 255 * textOpacity); - } - else - { - t->color(0.0f, 0.0f, 0.0f, 0.25f); - } - t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); - t->vertex((float)(-w - 1), (float)( +8 + offs + 1), (float)( 0)); - t->vertex((float)(+w + 1), (float)( +8 + offs + 1), (float)( 0)); - t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); - t->end(); - - glEnable(GL_DEPTH_TEST); - glDepthMask(true); - glDepthFunc(GL_ALWAYS); - glLineWidth(2.0f); - t->begin(GL_LINE_STRIP); - t->color(color, 255 * textOpacity); - t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); - t->vertex((float)(-w - 1), (float)( +8 + offs + 1), (float)( 0)); - t->vertex((float)(+w + 1), (float)( +8 + offs + 1), (float)( 0)); - t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); - t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); - t->end(); - glDepthFunc(GL_LEQUAL); - glDepthMask(false); - glDisable(GL_DEPTH_TEST); - - glEnable(GL_TEXTURE_2D); - font->draw(playerName, -font->width(playerName) / 2, offs, 0x20ffffff); - glEnable(GL_DEPTH_TEST); - - glDepthMask(true); - } - - if( textOpacity < 1.0f ) - { - glColor4f(1.0f,1.0f,1.0f,1.0f); - glDisable(GL_TEXTURE_2D); - glDepthFunc(GL_ALWAYS); - t->begin(); - int w = font->width(playerName) / 2; - t->color(color, 255); - t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); - t->vertex((float)(-w - 1), (float)( +8 + offs), (float)( 0)); - t->vertex((float)(+w + 1), (float)( +8 + offs), (float)( 0)); - t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); - t->end(); - glDepthFunc(GL_LEQUAL); - glEnable(GL_TEXTURE_2D); - - glTranslatef(0.0f, 0.0f, -0.04f); - } - - if( textOpacity > 0.0f ) - { - int textColor = ( ( (int)(textOpacity*255) << 24 ) | 0xffffff ); - font->draw(playerName, -font->width(playerName) / 2, offs, textColor); - } - - glEnable(GL_LIGHTING); - glDisable(GL_BLEND); - glColor4f(1, 1, 1, 1); - glPopMatrix(); -} + return prev + (next - prev) * a; +} \ No newline at end of file diff --git a/Minecraft.Client/MobRenderer.h b/Minecraft.Client/MobRenderer.h index a8b2b93e..6ab4af0c 100644 --- a/Minecraft.Client/MobRenderer.h +++ b/Minecraft.Client/MobRenderer.h @@ -1,46 +1,24 @@ #pragma once -#include "EntityRenderer.h" +#include "LivingEntityRenderer.h" class Mob; using namespace std; -#define PLAYER_NAME_READABLE_FULLSCREEN 16 +// This was used in MobRenderer but lots of code moved to LivingEntity and I haven't put this back yet +/*#define PLAYER_NAME_READABLE_FULLSCREEN 16 #define PLAYER_NAME_READABLE_DISTANCE_SPLITSCREEN 8 -#define PLAYER_NAME_READABLE_DISTANCE_SD 8 +#define PLAYER_NAME_READABLE_DISTANCE_SD 8*/ // 4J - this used to be a generic : public class MobRenderer extends EntityRenderer -class MobRenderer : public EntityRenderer +class MobRenderer : public LivingEntityRenderer { -private: - static const int MAX_ARMOR_LAYERS = 4; - -protected: - Model *model; - Model *armor; - public: MobRenderer(Model *model, float shadow); - virtual void setArmor(Model *armor); -private: - float rotlerp(float from, float to, float a); -public: virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); -protected: - virtual void renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); - virtual void setupPosition(shared_ptr mob, double x, double y, double z); - virtual void setupRotations(shared_ptr mob, float bob, float bodyRot, float a); - virtual float getAttackAnim(shared_ptr mob, float a); - virtual float getBob(shared_ptr mob, float a); - virtual void additionalRendering(shared_ptr mob, float a); - virtual int prepareArmorOverlay(shared_ptr mob, int layer, float a); - virtual int prepareArmor(shared_ptr mob, int layer, float a); - virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); - virtual float getFlipDegrees(shared_ptr mob); - virtual int getOverlayColor(shared_ptr mob, float br, float a); - virtual void scale(shared_ptr mob, float a); - virtual void renderName(shared_ptr mob, double x, double y, double z); - virtual void renderNameTag(shared_ptr mob, const wstring& name, double x, double y, double z, int maxDist, int color = 0xff000000); -public: - // 4J Added - virtual Model *getModel() { return model; } +protected: + virtual bool shouldShowName(shared_ptr mob); + virtual void renderLeash(shared_ptr entity, double x, double y, double z, float rot, float a); + +private: + double lerp(double prev, double next, double a); }; diff --git a/Minecraft.Client/MobSpawnerRenderer.cpp b/Minecraft.Client/MobSpawnerRenderer.cpp index 4ee772dd..02aac27f 100644 --- a/Minecraft.Client/MobSpawnerRenderer.cpp +++ b/Minecraft.Client/MobSpawnerRenderer.cpp @@ -9,14 +9,19 @@ void MobSpawnerRenderer::render(shared_ptr _spawner, double x, doubl { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr spawner = dynamic_pointer_cast(_spawner); + render(spawner->getSpawner(), x, y, z, a); + glPopMatrix(); +} +void MobSpawnerRenderer::render(BaseMobSpawner *spawner, double x, double y, double z, float a) +{ glPushMatrix(); glTranslatef((float) x + 0.5f, (float) y, (float) z + 0.5f); shared_ptr e = spawner->getDisplayEntity(); if (e != NULL) { - e->setLevel(spawner->level); + e->setLevel(spawner->getLevel()); float s = 7 / 16.0f; glTranslatef(0, 0.4f, 0); glRotatef((float) (spawner->oSpin + (spawner->spin - spawner->oSpin) * a) * 10, 0, 1, 0); @@ -26,5 +31,4 @@ void MobSpawnerRenderer::render(shared_ptr _spawner, double x, doubl e->moveTo(x, y, z, 0, 0); EntityRenderDispatcher::instance->render(e, 0, 0, 0, 0, a); } - glPopMatrix(); } diff --git a/Minecraft.Client/MobSpawnerRenderer.h b/Minecraft.Client/MobSpawnerRenderer.h index ad7dfe67..984886e5 100644 --- a/Minecraft.Client/MobSpawnerRenderer.h +++ b/Minecraft.Client/MobSpawnerRenderer.h @@ -2,10 +2,13 @@ #include "TileEntityRenderer.h" using namespace std; +class BaseMobSpawner; + class MobSpawnerRenderer : public TileEntityRenderer { private: unordered_map > models; public: + static void render(BaseMobSpawner *spawner, double x, double y, double z, float a); virtual void render(shared_ptr _spawner, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); // 4J added setColor param }; diff --git a/Minecraft.Client/Model.h b/Minecraft.Client/Model.h index e4161d0c..5a4b6f2e 100644 --- a/Minecraft.Client/Model.h +++ b/Minecraft.Client/Model.h @@ -5,6 +5,7 @@ using namespace std; class Mob; class ModelPart; class TexOffs; +class LivingEntity; class Model @@ -20,9 +21,9 @@ public: Model(); // 4J added virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) {} - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0) {} - virtual void prepareMobModel(shared_ptr mob, float time, float r, float a) {} - virtual ModelPart *getRandomCube(Random random) {return cubes.at(random.nextInt((int)cubes.size()));} + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0) {} + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a) {} + virtual ModelPart *getRandomModelPart(Random random) {return cubes.at(random.nextInt((int)cubes.size()));} virtual ModelPart * AddOrRetrievePart(SKIN_BOX *pBox) { return NULL;} void setMapTex(wstring id, int x, int y); diff --git a/Minecraft.Client/ModelHorse.cpp b/Minecraft.Client/ModelHorse.cpp new file mode 100644 index 00000000..7a13d0ad --- /dev/null +++ b/Minecraft.Client/ModelHorse.cpp @@ -0,0 +1,635 @@ +#include "stdafx.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "ModelHorse.h" +#include "ModelPart.h" + +ModelHorse::ModelHorse() +{ + texWidth = 128; + texHeight = 128; + + // TODO: All rotation magic numbers in this method + Body = new ModelPart(this, 0, 34); + Body->addBox(-5.f, -8.f, -19.f, 10, 10, 24); + Body->setPos(0.f, 11.f, 9.f); + + TailA = new ModelPart(this, 44, 0); + TailA->addBox(-1.f, -1.f, 0.f, 2, 2, 3); + TailA->setPos(0.f, 3.f, 14.f); + setRotation(TailA, -1.134464f, 0.f, 0.f); + + TailB = new ModelPart(this, 38, 7); + TailB->addBox(-1.5f, -2.f, 3.f, 3, 4, 7); + TailB->setPos(0.f, 3.f, 14.f); + setRotation(TailB, -1.134464f, 0.f, 0.f); + + TailC = new ModelPart(this, 24, 3); + TailC->addBox(-1.5f, -4.5f, 9.f, 3, 4, 7); + TailC->setPos(0.f, 3.f, 14.f); + setRotation(TailC, -1.40215f, 0.f, 0.f); + + Leg1A = new ModelPart(this, 78, 29); + Leg1A->addBox(-2.5f, -2.f, -2.5f, 4, 9, 5); + Leg1A->setPos(4.f, 9.f, 11.f); + + Leg1B = new ModelPart(this, 78, 43); + Leg1B->addBox(-2.f, 0.f, -1.5f, 3, 5, 3); + Leg1B->setPos(4.f, 16.f, 11.f); + + Leg1C = new ModelPart(this, 78, 51); + Leg1C->addBox(-2.5f, 5.1f, -2.f, 4, 3, 4); + Leg1C->setPos(4.f, 16.f, 11.f); + + Leg2A = new ModelPart(this, 96, 29); + Leg2A->addBox(-1.5f, -2.f, -2.5f, 4, 9, 5); + Leg2A->setPos(-4.f, 9.f, 11.f); + + Leg2B = new ModelPart(this, 96, 43); + Leg2B->addBox(-1.f, 0.f, -1.5f, 3, 5, 3); + Leg2B->setPos(-4.f, 16.f, 11.f); + + Leg2C = new ModelPart(this, 96, 51); + Leg2C->addBox(-1.5f, 5.1f, -2.f, 4, 3, 4); + Leg2C->setPos(-4.f, 16.f, 11.f); + + Leg3A = new ModelPart(this, 44, 29); + Leg3A->addBox(-1.9f, -1.f, -2.1f, 3, 8, 4); + Leg3A->setPos(4.f, 9.f, -8.f); + + Leg3B = new ModelPart(this, 44, 41); + Leg3B->addBox(-1.9f, 0.f, -1.6f, 3, 5, 3); + Leg3B->setPos(4.f, 16.f, -8.f); + + Leg3C = new ModelPart(this, 44, 51); + Leg3C->addBox(-2.4f, 5.1f, -2.1f, 4, 3, 4); + Leg3C->setPos(4.f, 16.f, -8.f); + + Leg4A = new ModelPart(this, 60, 29); + Leg4A->addBox(-1.1f, -1.f, -2.1f, 3, 8, 4); + Leg4A->setPos(-4.f, 9.f, -8.f); + + Leg4B = new ModelPart(this, 60, 41); + Leg4B->addBox(-1.1f, 0.f, -1.6f, 3, 5, 3); + Leg4B->setPos(-4.f, 16.f, -8.f); + + Leg4C = new ModelPart(this, 60, 51); + Leg4C->addBox(-1.6f, 5.1f, -2.1f, 4, 3, 4); + Leg4C->setPos(-4.f, 16.f, -8.f); + + Head = new ModelPart(this, 0, 0); + Head->addBox(-2.5f, -10.f, -1.5f, 5, 5, 7); + Head->setPos(0.f, 4.f, -10.f); + setRotation(Head, 0.5235988f, 0.f, 0.f); + + UMouth = new ModelPart(this, 24, 18); + UMouth->addBox(-2.f, -10.f, -7.f, 4, 3, 6); + UMouth->setPos(0.f, 3.95f, -10.f); + setRotation(UMouth, 0.5235988f, 0.f, 0.f); + + LMouth = new ModelPart(this, 24, 27); + LMouth->addBox(-2.f, -7.f, -6.5f, 4, 2, 5); + LMouth->setPos(0.f, 4.f, -10.f); + setRotation(LMouth, 0.5235988f, 0.f, 0.f); + + Head->addChild(UMouth); + Head->addChild(LMouth); + + Ear1 = new ModelPart(this, 0, 0); + Ear1->addBox(0.45f, -12.f, 4.f, 2, 3, 1); + Ear1->setPos(0.f, 4.f, -10.f); + setRotation(Ear1, 0.5235988f, 0.f, 0.f); + + Ear2 = new ModelPart(this, 0, 0); + Ear2->addBox(-2.45f, -12.f, 4.f, 2, 3, 1); + Ear2->setPos(0.f, 4.f, -10.f); + setRotation(Ear2, 0.5235988f, 0.f, 0.f); + + MuleEarL = new ModelPart(this, 0, 12); + MuleEarL->addBox(-2.f, -16.f, 4.f, 2, 7, 1); + MuleEarL->setPos(0.f, 4.f, -10.f); + setRotation(MuleEarL, 0.5235988f, 0.f, 0.2617994f); + + MuleEarR = new ModelPart(this, 0, 12); + MuleEarR->addBox(0.f, -16.f, 4.f, 2, 7, 1); + MuleEarR->setPos(0.f, 4.f, -10.f); + setRotation(MuleEarR, 0.5235988f, 0.f, -0.2617994f); + + Neck = new ModelPart(this, 0, 12); + Neck->addBox(-2.05f, -9.8f, -2.f, 4, 14, 8); + Neck->setPos(0.f, 4.f, -10.f); + setRotation(Neck, 0.5235988f, 0.f, 0.f); + + Bag1 = new ModelPart(this, 0, 34); + Bag1->addBox(-3.f, 0.f, 0.f, 8, 8, 3); + Bag1->setPos(-7.5f, 3.f, 10.f); + setRotation(Bag1, 0.f, 1.570796f, 0.f); + + Bag2 = new ModelPart(this, 0, 47); + Bag2->addBox(-3.f, 0.f, 0.f, 8, 8, 3); + Bag2->setPos(4.5f, 3.f, 10.f); + setRotation(Bag2, 0.f, 1.570796f, 0.f); + + Saddle = new ModelPart(this, 80, 0); + Saddle->addBox(-5.f, 0.f, -3.f, 10, 1, 8); + Saddle->setPos(0.f, 2.f, 2.f); + + SaddleB = new ModelPart(this, 106, 9); + SaddleB->addBox(-1.5f, -1.f, -3.f, 3, 1, 2); + SaddleB->setPos(0.f, 2.f, 2.f); + + SaddleC = new ModelPart(this, 80, 9); + SaddleC->addBox(-4.f, -1.f, 3.f, 8, 1, 2); + SaddleC->setPos(0.f, 2.f, 2.f); + + SaddleL2 = new ModelPart(this, 74, 0); + SaddleL2->addBox(-0.5f, 6.f, -1.f, 1, 2, 2); + SaddleL2->setPos(5.f, 3.f, 2.f); + + SaddleL = new ModelPart(this, 70, 0); + SaddleL->addBox(-0.5f, 0.f, -0.5f, 1, 6, 1); + SaddleL->setPos(5.f, 3.f, 2.f); + + SaddleR2 = new ModelPart(this, 74, 4); + SaddleR2->addBox(-0.5f, 6.f, -1.f, 1, 2, 2); + SaddleR2->setPos(-5.f, 3.f, 2.f); + + SaddleR = new ModelPart(this, 80, 0); + SaddleR->addBox(-0.5f, 0.f, -0.5f, 1, 6, 1); + SaddleR->setPos(-5.f, 3.f, 2.f); + + SaddleMouthL = new ModelPart(this, 74, 13); + SaddleMouthL->addBox(1.5f, -8.f, -4.f, 1, 2, 2); + SaddleMouthL->setPos(0.f, 4.f, -10.f); + setRotation(SaddleMouthL, 0.5235988f, 0.f, 0.f); + + SaddleMouthR = new ModelPart(this, 74, 13); + SaddleMouthR->addBox(-2.5f, -8.f, -4.f, 1, 2, 2); + SaddleMouthR->setPos(0.f, 4.f, -10.f); + setRotation(SaddleMouthR, 0.5235988f, 0.f, 0.f); + + SaddleMouthLine = new ModelPart(this, 44, 10); + SaddleMouthLine->addBox(2.6f, -6.f, -6.f, 0, 3, 16); + SaddleMouthLine->setPos(0.f, 4.f, -10.f); + + SaddleMouthLineR = new ModelPart(this, 44, 5); + SaddleMouthLineR->addBox(-2.6f, -6.f, -6.f, 0, 3, 16); + SaddleMouthLineR->setPos(0.f, 4.f, -10.f); + + Mane = new ModelPart(this, 58, 0); + Mane->addBox(-1.f, -11.5f, 5.f, 2, 16, 4); + Mane->setPos(0.f, 4.f, -10.f); + setRotation(Mane, 0.5235988f, 0.f, 0.f); + + HeadSaddle = new ModelPart(this, 80, 12); + HeadSaddle->addBox(-2.5f, -10.1f, -7.f, 5, 5, 12, 0.2f); + HeadSaddle->setPos(0.f, 4.f, -10.f); + setRotation(HeadSaddle, 0.5235988f, 0.f, 0.f); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + Head->compile(1.0f/16.0f);; + UMouth->compile(1.0f/16.0f);; + LMouth->compile(1.0f/16.0f);; + Ear1->compile(1.0f/16.0f);; + Ear2->compile(1.0f/16.0f);; + MuleEarL->compile(1.0f/16.0f);; + MuleEarR->compile(1.0f/16.0f);; + Neck->compile(1.0f/16.0f);; + HeadSaddle->compile(1.0f/16.0f);; + Mane->compile(1.0f/16.0f);; + + Body->compile(1.0f/16.0f);; + TailA->compile(1.0f/16.0f);; + TailB->compile(1.0f/16.0f);; + TailC->compile(1.0f/16.0f);; + + Leg1A->compile(1.0f/16.0f);; + Leg1B->compile(1.0f/16.0f);; + Leg1C->compile(1.0f/16.0f);; + + Leg2A->compile(1.0f/16.0f);; + Leg2B->compile(1.0f/16.0f);; + Leg2C->compile(1.0f/16.0f);; + + Leg3A->compile(1.0f/16.0f);; + Leg3B->compile(1.0f/16.0f);; + Leg3C->compile(1.0f/16.0f);; + + Leg4A->compile(1.0f/16.0f);; + Leg4B->compile(1.0f/16.0f);; + Leg4C->compile(1.0f/16.0f);; + + Bag1->compile(1.0f/16.0f);; + Bag2->compile(1.0f/16.0f);; + + Saddle->compile(1.0f/16.0f);; + SaddleB->compile(1.0f/16.0f);; + SaddleC->compile(1.0f/16.0f);; + + SaddleL->compile(1.0f/16.0f);; + SaddleL2->compile(1.0f/16.0f);; + + SaddleR->compile(1.0f/16.0f);; + SaddleR2->compile(1.0f/16.0f);; + + SaddleMouthL->compile(1.0f/16.0f);; + SaddleMouthR->compile(1.0f/16.0f);; + + SaddleMouthLine->compile(1.0f/16.0f);; + SaddleMouthLineR->compile(1.0f/16.0f);; +} + + +void ModelHorse::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + shared_ptr entityhorse = dynamic_pointer_cast(entity); + + int type = entityhorse->getType(); + float eating = entityhorse->getEatAnim(0); + bool adult = (entityhorse->isAdult()); + bool saddled = adult && entityhorse->isSaddled(); + bool chested = adult && entityhorse->isChestedHorse(); + bool largeEars = type == EntityHorse::TYPE_DONKEY || type == EntityHorse::TYPE_MULE; + float sizeFactor = entityhorse->getFoalScale(); + + bool rider = (entityhorse->rider.lock() != NULL); + + if (saddled) + { + HeadSaddle->render(scale, usecompiled); + Saddle->render(scale, usecompiled); + SaddleB->render(scale, usecompiled); + SaddleC->render(scale, usecompiled); + SaddleL->render(scale, usecompiled); + SaddleL2->render(scale, usecompiled); + SaddleR->render(scale, usecompiled); + SaddleR2->render(scale, usecompiled); + SaddleMouthL->render(scale, usecompiled); + SaddleMouthR->render(scale, usecompiled); + + if (rider) + { + SaddleMouthLine->render(scale, usecompiled); + SaddleMouthLineR->render(scale, usecompiled); + } + } + + // render legs + if (!adult) + { + glPushMatrix(); + glScalef(sizeFactor, .5f + sizeFactor * .5f, sizeFactor); + glTranslatef(0, .95f * (1.0f - sizeFactor), 0); + } + Leg1A->render(scale, usecompiled); + Leg1B->render(scale, usecompiled); + Leg1C->render(scale, usecompiled); + + Leg2A->render(scale, usecompiled); + Leg2B->render(scale, usecompiled); + Leg2C->render(scale, usecompiled); + + Leg3A->render(scale, usecompiled); + Leg3B->render(scale, usecompiled); + Leg3C->render(scale, usecompiled); + + Leg4A->render(scale, usecompiled); + Leg4B->render(scale, usecompiled); + Leg4C->render(scale, usecompiled); + if (!adult) + { + glPopMatrix(); + + glPushMatrix(); + glScalef(sizeFactor, sizeFactor, sizeFactor); + glTranslatef(0, 1.35f * (1.0f - sizeFactor), 0); + } + // render body + Body->render(scale, usecompiled); + TailA->render(scale, usecompiled); + TailB->render(scale, usecompiled); + TailC->render(scale, usecompiled); + Neck->render(scale, usecompiled); + Mane->render(scale, usecompiled); + if (!adult) + { + glPopMatrix(); + + glPushMatrix(); + float headScale = .5f + (sizeFactor * sizeFactor) * .5f; + glScalef(headScale, headScale, headScale); + if (eating <= 0) + { + glTranslatef(0, 1.35f * (1.0f - sizeFactor), 0); + } + else + { + glTranslatef(0, .9f * (1.0f - sizeFactor) * eating + (1.35f * (1.0f - sizeFactor)) * (1.0f - eating), .15f * (1.0f - sizeFactor) * eating); + } + } + // render head + if (largeEars) + { + MuleEarL->render(scale, usecompiled); + MuleEarR->render(scale, usecompiled); + } + else + { + Ear1->render(scale, usecompiled); + Ear2->render(scale, usecompiled); + } + Head->render(scale, usecompiled); + if (!adult) + { + glPopMatrix(); + } + if (chested) + { + Bag1->render(scale, usecompiled); + Bag2->render(scale, usecompiled); + } +} + +void ModelHorse::setRotation(ModelPart *model, float x, float y, float z) +{ + model->xRot = x; + model->yRot = y; + model->zRot = z; +} + +float ModelHorse::rotlerp(float from, float to, float a) +{ + float diff = to - from; + while (diff < -180) + diff += 360; + while (diff >= 180) + diff -= 360; + return from + a * diff; +} + +void ModelHorse::prepareMobModel(shared_ptr mob, float wp, float ws, float a) +{ + Model::prepareMobModel(mob, wp, ws, a); + + float bodyRot = rotlerp(mob->yBodyRotO, mob->yBodyRot, a); + float headRot = rotlerp(mob->yHeadRotO, mob->yHeadRot, a); + float headRotx = (mob->xRotO + (mob->xRot - mob->xRotO) * a); + float headRotMinusBodyRot = headRot - bodyRot; + + // TODO: Magic numbers + float HeadXRot = (headRotx / 57.29578f); + if (headRotMinusBodyRot > 20.f) { + headRotMinusBodyRot = 20.f; + } + if (headRotMinusBodyRot < -20.f) { + headRotMinusBodyRot = -20.f; + } + + /** + * f = distance walked f1 = speed 0 - 1 f2 = timer + */ + if (ws > 0.2f) + { + HeadXRot = HeadXRot + (cos(wp * 0.4f) * 0.15f * ws); + } + + shared_ptr entityhorse = dynamic_pointer_cast(mob); + + float eating = entityhorse->getEatAnim(a); + float standing = entityhorse->getStandAnim(a); + float iStanding = 1.0f - standing; + float openMouth = entityhorse->getMouthAnim(a); + bool tail = entityhorse->tailCounter != 0; + bool saddled = entityhorse->isSaddled(); + bool rider = entityhorse->rider.lock() != NULL; + float bob = mob->tickCount + a; + + float legAnim1 = cos((wp * 0.6662f) + 3.141593f); + float legXRotAnim = legAnim1 * 0.8f * ws; + + Head->y = 4.0f; + Head->z = -10.f; + TailA->y = 3.f; + TailB->z = 14.f; + Bag2->y = 3.f; + Bag2->z = 10.f; + Body->xRot = 0.f; + + // TODO: Fix these magical numbers + Head->xRot = 0.5235988f + (HeadXRot); + Head->yRot = (headRotMinusBodyRot / 57.29578f);// fixes SMP bug + + // interpolate positions and rotations based on current eating and standing animations + { + // TODO: Magic numbers + Head->xRot = standing * ((15 * Mth::DEGRAD) + (HeadXRot)) + eating * 2.18166f + (1.0f - max(standing, eating)) * Head->xRot; + Head->yRot = standing * (headRotMinusBodyRot / 57.29578f) + (1.0f - max(standing, eating)) * Head->yRot; + + Head->y = standing * -6.f + eating * 11.0f + (1.0f - max(standing, eating)) * Head->y; + Head->z = standing * -1.f + eating * -10.f + (1.0f - max(standing, eating)) * Head->z; + + TailA->y = standing * 9.f + iStanding * TailA->y; + TailB->z = standing * 18.f + iStanding * TailB->z; + Bag2->y = standing * 5.5f + iStanding * Bag2->y; + Bag2->z = standing * 15.f + iStanding * Bag2->z; + Body->xRot = standing * (-45 / 57.29578f) + iStanding * Body->xRot; + } + + Ear1->y = Head->y; + Ear2->y = Head->y; + MuleEarL->y = Head->y; + MuleEarR->y = Head->y; + Neck->y = Head->y; + UMouth->y = 0 + .02f; + LMouth->y = 0; + Mane->y = Head->y; + + Ear1->z = Head->z; + Ear2->z = Head->z; + MuleEarL->z = Head->z; + MuleEarR->z = Head->z; + Neck->z = Head->z; + UMouth->z = 0 + .02f - openMouth * 1; + LMouth->z = 0 + openMouth * 1; + Mane->z = Head->z; + + Ear1->xRot = Head->xRot; + Ear2->xRot = Head->xRot; + MuleEarL->xRot = Head->xRot; + MuleEarR->xRot = Head->xRot; + Neck->xRot = Head->xRot; + UMouth->xRot = 0 - (PI * .03f) * openMouth; + LMouth->xRot = 0 + (PI * .05f) * openMouth; + + Mane->xRot = Head->xRot; + + Ear1->yRot = Head->yRot; + Ear2->yRot = Head->yRot; + MuleEarL->yRot = Head->yRot; + MuleEarR->yRot = Head->yRot; + Neck->yRot = Head->yRot; + UMouth->yRot = 0; + LMouth->yRot = 0; + Mane->yRot = Head->yRot; + + // (if chested) + Bag1->xRot = legXRotAnim / 5.f; + Bag2->xRot = -legXRotAnim / 5.f; + + /** + * knee joints Leg1 and Leg4 use LLegXRot Leg2 and Leg3 use RLegXRot + */ + { + float r90 = PI * .5f; + float r270 = PI * 1.5f; + float r300 = -60 * Mth::DEGRAD; + float standAngle = 15 * Mth::DEGRAD * standing; + float bobValue = Mth::cos((bob * 0.6f) + 3.141593f); + + Leg3A->y = -2.f * standing + 9.f * iStanding; + Leg3A->z = -2.f * standing + -8.f * iStanding; + Leg4A->y = Leg3A->y; + Leg4A->z = Leg3A->z; + + Leg1B->y = Leg1A->y + (Mth::sin(r90 + standAngle + iStanding * (-legAnim1 * 0.5f * ws)) * 7.f); + Leg1B->z = Leg1A->z + (Mth::cos(r270 + standAngle + iStanding * (-legAnim1 * 0.5f * ws)) * 7.f); + + Leg2B->y = Leg2A->y + (Mth::sin(r90 + standAngle + iStanding * (legAnim1 * 0.5f * ws)) * 7.f); + Leg2B->z = Leg2A->z + (Mth::cos(r270 + standAngle + iStanding * (legAnim1 * 0.5f * ws)) * 7.f); + + float rlegRot = (r300 + bobValue) * standing + legXRotAnim * iStanding; + float llegRot = (r300 + -bobValue) * standing + -legXRotAnim * iStanding; + Leg3B->y = Leg3A->y + (Mth::sin(r90 + rlegRot) * 7.f); + Leg3B->z = Leg3A->z + (Mth::cos(r270 + rlegRot) * 7.f); + + Leg4B->y = Leg4A->y + (Mth::sin(r90 + llegRot) * 7.f); + Leg4B->z = Leg4A->z + (Mth::cos(r270 + llegRot) * 7.f); + + Leg1A->xRot = standAngle + (-legAnim1 * 0.5f * ws) * iStanding; + Leg1B->xRot = (-5 * Mth::DEGRAD) * standing + ((-legAnim1 * 0.5f * ws) - max(0.0f, legAnim1 * .5f * ws)) * iStanding; + Leg1C->xRot = Leg1B->xRot; + + Leg2A->xRot = standAngle + (legAnim1 * 0.5f * ws) * iStanding; + Leg2B->xRot = (-5 * Mth::DEGRAD) * standing + ((legAnim1 * 0.5f * ws) - max(0.0f, -legAnim1 * .5f * ws)) * iStanding; + Leg2C->xRot = Leg2B->xRot; + + Leg3A->xRot = rlegRot; + Leg3B->xRot = (Leg3A->xRot + PI * max(0.0f, (.2f + bobValue * .2f))) * standing + (legXRotAnim + max(0.0f, legAnim1 * 0.5f * ws)) * iStanding; + Leg3C->xRot = Leg3B->xRot; + + Leg4A->xRot = llegRot; + Leg4B->xRot = (Leg4A->xRot + PI * max(0.0f, (.2f - bobValue * .2f))) * standing + (-legXRotAnim + max(0.0f, -legAnim1 * 0.5f * ws)) * iStanding; + Leg4C->xRot = Leg4B->xRot; + } + + Leg1C->y = Leg1B->y; + Leg1C->z = Leg1B->z; + Leg2C->y = Leg2B->y; + Leg2C->z = Leg2B->z; + Leg3C->y = Leg3B->y; + Leg3C->z = Leg3B->z; + Leg4C->y = Leg4B->y; + Leg4C->z = Leg4B->z; + + if (saddled) + { + + Saddle->y = standing * .5f + iStanding * 2.f; + Saddle->z = standing * 11.f + iStanding * 2.f; + + SaddleB->y = Saddle->y; + SaddleC->y = Saddle->y; + SaddleL->y = Saddle->y; + SaddleR->y = Saddle->y; + SaddleL2->y = Saddle->y; + SaddleR2->y = Saddle->y; + Bag1->y = Bag2->y; + + SaddleB->z = Saddle->z; + SaddleC->z = Saddle->z; + SaddleL->z = Saddle->z; + SaddleR->z = Saddle->z; + SaddleL2->z = Saddle->z; + SaddleR2->z = Saddle->z; + Bag1->z = Bag2->z; + + Saddle->xRot = Body->xRot; + SaddleB->xRot = Body->xRot; + SaddleC->xRot = Body->xRot; + + SaddleMouthLine->y = Head->y; + SaddleMouthLineR->y = Head->y; + HeadSaddle->y = Head->y; + SaddleMouthL->y = Head->y; + SaddleMouthR->y = Head->y; + + SaddleMouthLine->z = Head->z; + SaddleMouthLineR->z = Head->z; + HeadSaddle->z = Head->z; + SaddleMouthL->z = Head->z; + SaddleMouthR->z = Head->z; + + SaddleMouthLine->xRot = HeadXRot; + SaddleMouthLineR->xRot = HeadXRot; + HeadSaddle->xRot = Head->xRot; + SaddleMouthL->xRot = Head->xRot; + SaddleMouthR->xRot = Head->xRot; + HeadSaddle->yRot = Head->yRot; + SaddleMouthL->yRot = Head->yRot; + SaddleMouthLine->yRot = Head->yRot; + SaddleMouthR->yRot = Head->yRot; + SaddleMouthLineR->yRot = Head->yRot; + + if (rider) { + // TODO: Magic number (smells like radians :D) + SaddleL->xRot = -60 / 57.29578f; + SaddleL2->xRot = -60 / 57.29578f; + SaddleR->xRot = -60 / 57.29578f; + SaddleR2->xRot = -60 / 57.29578f; + + SaddleL->zRot = 0.f; + SaddleL2->zRot = 0.f; + SaddleR->zRot = 0.f; + SaddleR2->zRot = 0.f; + } else { + SaddleL->xRot = legXRotAnim / 3.f; + SaddleL2->xRot = legXRotAnim / 3.f; + SaddleR->xRot = legXRotAnim / 3.f; + SaddleR2->xRot = legXRotAnim / 3.f; + + SaddleL->zRot = legXRotAnim / 5.f; + SaddleL2->zRot = legXRotAnim / 5.f; + SaddleR->zRot = -legXRotAnim / 5.f; + SaddleR2->zRot = -legXRotAnim / 5.f; + } + } + + // TODO: Magic number + float tailMov = -1.3089f + (ws * 1.5f); + if (tailMov > 0) + { + tailMov = 0; + } + + if (tail) + { + TailA->yRot = Mth::cos(bob * 0.7f); + tailMov = 0; + } + else + { + TailA->yRot = 0.f; + } + TailB->yRot = TailA->yRot; + TailC->yRot = TailA->yRot; + + TailB->y = TailA->y; + TailC->y = TailA->y; + TailB->z = TailA->z; + TailC->z = TailA->z; + + // TODO: Magic number + TailA->xRot = tailMov; + TailB->xRot = tailMov; + TailC->xRot = -0.2618f + tailMov; +} \ No newline at end of file diff --git a/Minecraft.Client/ModelHorse.h b/Minecraft.Client/ModelHorse.h new file mode 100644 index 00000000..754be46a --- /dev/null +++ b/Minecraft.Client/ModelHorse.h @@ -0,0 +1,66 @@ +#pragma once +#include "Model.h" + +class ModelHorse : public Model +{ +private: + ModelPart *Head; + ModelPart *UMouth; + ModelPart *LMouth; + ModelPart *Ear1; + ModelPart *Ear2; + ModelPart *MuleEarL; + ModelPart *MuleEarR; + ModelPart *Neck; + ModelPart *HeadSaddle; + ModelPart *Mane; + + ModelPart *Body; + ModelPart *TailA; + ModelPart *TailB; + ModelPart *TailC; + + ModelPart *Leg1A; + ModelPart *Leg1B; + ModelPart *Leg1C; + + ModelPart *Leg2A; + ModelPart *Leg2B; + ModelPart *Leg2C; + + ModelPart *Leg3A; + ModelPart *Leg3B; + ModelPart *Leg3C; + + ModelPart *Leg4A; + ModelPart *Leg4B; + ModelPart *Leg4C; + + ModelPart *Bag1; + ModelPart *Bag2; + + ModelPart *Saddle; + ModelPart *SaddleB; + ModelPart *SaddleC; + + ModelPart *SaddleL; + ModelPart *SaddleL2; + + ModelPart *SaddleR; + ModelPart *SaddleR2; + + ModelPart *SaddleMouthL; + ModelPart *SaddleMouthR; + + ModelPart *SaddleMouthLine; + ModelPart *SaddleMouthLineR; + +public: + ModelHorse(); + void prepareMobModel(shared_ptr mob, float wp, float ws, float a); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + +private: + void setRotation(ModelPart *model, float x, float y, float z); + float rotlerp(float from, float to, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/ModelPart.cpp b/Minecraft.Client/ModelPart.cpp index 89386621..615ff8bd 100644 --- a/Minecraft.Client/ModelPart.cpp +++ b/Minecraft.Client/ModelPart.cpp @@ -16,6 +16,7 @@ void ModelPart::_init() neverRender = false; x=y=z = 0.0f; xRot=yRot=zRot = 0.0f; + translateX = translateY = translateZ = 0.0f; } ModelPart::ModelPart() @@ -158,6 +159,8 @@ void ModelPart::render(float scale, bool usecompiled, bool bHideParentBodyPart) if (!visible) return; if (!compiled) compile(scale); + glTranslatef(translateX, translateY, translateZ); + if (xRot != 0 || yRot != 0 || zRot != 0) { glPushMatrix(); @@ -243,6 +246,8 @@ void ModelPart::render(float scale, bool usecompiled, bool bHideParentBodyPart) } } } + + glTranslatef(-translateX, -translateY, -translateZ); } void ModelPart::renderRollable(float scale, bool usecompiled) diff --git a/Minecraft.Client/ModelPart.h b/Minecraft.Client/ModelPart.h index 65d6a03b..c6458e71 100644 --- a/Minecraft.Client/ModelPart.h +++ b/Minecraft.Client/ModelPart.h @@ -20,6 +20,7 @@ public: vector cubes; vector children; static const float RAD; + float translateX, translateY, translateZ; private: wstring id; diff --git a/Minecraft.Client/MultiPlayerChunkCache.cpp b/Minecraft.Client/MultiPlayerChunkCache.cpp index 8c6c90e7..b5e1dd25 100644 --- a/Minecraft.Client/MultiPlayerChunkCache.cpp +++ b/Minecraft.Client/MultiPlayerChunkCache.cpp @@ -46,7 +46,7 @@ MultiPlayerChunkCache::MultiPlayerChunkCache(Level *level) for( int z = 0; z < 16; z++ ) { unsigned char tileId = 0; - if( y <= ( level->getSeaLevel() - 10 ) ) tileId = Tile::rock_Id; + if( y <= ( level->getSeaLevel() - 10 ) ) tileId = Tile::stone_Id; else if( y < level->getSeaLevel() ) tileId = Tile::calmWater_Id; bytes[x << 11 | z << 7 | y] = tileId; @@ -141,16 +141,16 @@ void MultiPlayerChunkCache::drop(int x, int z) { // 4J Stu - We do want to drop any entities in the chunks, especially for the case when a player is dead as they will // not get the RemoveEntity packet if an entity is removed. - LevelChunk *chunk = getChunk(x, z); - if (!chunk->isEmpty()) + LevelChunk *chunk = getChunk(x, z); + if (!chunk->isEmpty()) { // Added parameter here specifies that we don't want to delete tile entities, as they won't get recreated unless they've got update packets // The tile entities are in general only created on the client by virtue of the chunk rebuild - chunk->unload(false); + chunk->unload(false); // 4J - We just want to clear out the entities in the chunk, but everything else should be valid chunk->loaded = true; - } + } } LevelChunk *MultiPlayerChunkCache::create(int x, int z) @@ -194,9 +194,9 @@ LevelChunk *MultiPlayerChunkCache::create(int x, int z) // 4J - changed to use new methods for lighting chunk->setSkyLightDataAllBright(); -// Arrays::fill(chunk->skyLight->data, (byte) 255); + // Arrays::fill(chunk->skyLight->data, (byte) 255); } - + chunk->loaded = true; LeaveCriticalSection(&m_csLoadCreate); @@ -285,13 +285,17 @@ TilePos *MultiPlayerChunkCache::findNearestMapFeature(Level *level, const wstrin return NULL; } +void MultiPlayerChunkCache::recreateLogicStructuresForChunk(int chunkX, int chunkZ) +{ +} + wstring MultiPlayerChunkCache::gatherStats() { EnterCriticalSection(&m_csLoadCreate); int size = (int)loadedChunkList.size(); LeaveCriticalSection(&m_csLoadCreate); return L"MultiplayerChunkCache: " + _toString(size); - + } void MultiPlayerChunkCache::dataReceived(int x, int z) diff --git a/Minecraft.Client/MultiPlayerChunkCache.h b/Minecraft.Client/MultiPlayerChunkCache.h index 8fc427a6..c180f858 100644 --- a/Minecraft.Client/MultiPlayerChunkCache.h +++ b/Minecraft.Client/MultiPlayerChunkCache.h @@ -24,23 +24,24 @@ private: int XZOFFSET; bool *hasData; - Level *level; + Level *level; public: MultiPlayerChunkCache(Level *level); ~MultiPlayerChunkCache(); - virtual bool hasChunk(int x, int z); + virtual bool hasChunk(int x, int z); virtual bool reallyHasChunk(int x, int z); - virtual void drop(int x, int z); - virtual LevelChunk *create(int x, int z); - virtual LevelChunk *getChunk(int x, int z); - virtual bool save(bool force, ProgressListener *progressListener); - virtual bool tick(); - virtual bool shouldSave(); - virtual void postProcess(ChunkSource *parent, int x, int z); - virtual wstring gatherStats(); + virtual void drop(int x, int z); + virtual LevelChunk *create(int x, int z); + virtual LevelChunk *getChunk(int x, int z); + virtual bool save(bool force, ProgressListener *progressListener); + virtual bool tick(); + virtual bool shouldSave(); + virtual void postProcess(ChunkSource *parent, int x, int z); + virtual wstring gatherStats(); virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z); virtual TilePos *findNearestMapFeature(Level *level, const wstring &featureName, int x, int y, int z); + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ); virtual void dataReceived(int x, int z); // 4J added virtual LevelChunk **getCache() { return cache; } // 4J added diff --git a/Minecraft.Client/MultiPlayerGameMode.cpp b/Minecraft.Client/MultiPlayerGameMode.cpp index 7de59803..cbf8a7ab 100644 --- a/Minecraft.Client/MultiPlayerGameMode.cpp +++ b/Minecraft.Client/MultiPlayerGameMode.cpp @@ -19,8 +19,8 @@ MultiPlayerGameMode::MultiPlayerGameMode(Minecraft *minecraft, ClientConnection xDestroyBlock = -1; yDestroyBlock = -1; zDestroyBlock = -1; + destroyingItem = nullptr; destroyProgress = 0; - oDestroyProgress = 0; destroyTicks = 0; destroyDelay = 0; isDestroying = false; @@ -66,10 +66,19 @@ bool MultiPlayerGameMode::canHurtPlayer() bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) { - if (localPlayerMode->isReadOnly()) + if (localPlayerMode->isAdventureRestricted()) { + if (!minecraft->player->mayDestroyBlockAt(x, y, z)) { + return false; + } + } + + if (localPlayerMode->isCreative()) { - return false; - } + if (minecraft->player->getCarriedItem() != NULL && dynamic_cast(minecraft->player->getCarriedItem()->getItem()) != NULL) + { + return false; + } + } Level *level = minecraft->level; Tile *oldTile = Tile::tiles[level->getTile(x, y, z)]; @@ -79,11 +88,12 @@ bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, x, y, z, oldTile->id + (level->getData(x, y, z) << Tile::TILE_NUM_SHIFT)); int data = level->getData(x, y, z); - bool changed = level->setTile(x, y, z, 0); + bool changed = level->removeTile(x, y, z); if (changed) { oldTile->destroy(level, x, y, z, data); } + yDestroyBlock = -1; if (!localPlayerMode->isCreative()) { @@ -104,10 +114,14 @@ bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) void MultiPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) { if(!minecraft->player->isAllowedToMine()) return; - if (localPlayerMode->isReadOnly()) + + if (localPlayerMode->isAdventureRestricted()) { - return; - } + if (!minecraft->player->mayDestroyBlockAt(x, y, z)) + { + return; + } + } if (localPlayerMode->isCreative()) { @@ -115,14 +129,18 @@ void MultiPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) creativeDestroyBlock(minecraft, this, x, y, z, face); destroyDelay = 5; } - else if (!isDestroying || x != xDestroyBlock || y != yDestroyBlock || z != zDestroyBlock) + else if (!isDestroying || !sameDestroyTarget(x, y, z)) { + if (isDestroying) + { + connection->send(shared_ptr(new PlayerActionPacket(PlayerActionPacket::ABORT_DESTROY_BLOCK, xDestroyBlock, yDestroyBlock, zDestroyBlock, face))); + } connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) ) ); int t = minecraft->level->getTile(x, y, z); if (t > 0 && destroyProgress == 0) Tile::tiles[t]->attack(minecraft->level, x, y, z, minecraft->player); if (t > 0 && - (Tile::tiles[t]->getDestroyProgress(minecraft->player, minecraft->player->level, x, y, z) >= 1 || - (app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getDestroyProgress(minecraft->player, minecraft->player->level, x, y, z) >= 1 + // ||(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<player->getCarriedItem(); + destroyProgress = 0; destroyTicks = 0; minecraft->level->destroyTileProgress(minecraft->player->entityId, xDestroyBlock, yDestroyBlock, zDestroyBlock, (int)(destroyProgress * 10) - 1); } @@ -175,7 +193,7 @@ void MultiPlayerGameMode::continueDestroyBlock(int x, int y, int z, int face) return; } - if (x == xDestroyBlock && y == yDestroyBlock && z == zDestroyBlock) + if (sameDestroyTarget(x, y, z)) { int t = minecraft->level->getTile(x, y, z); if (t == 0) @@ -205,7 +223,6 @@ void MultiPlayerGameMode::continueDestroyBlock(int x, int y, int z, int face) connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::STOP_DESTROY_BLOCK, x, y, z, face) ) ); destroyBlock(x, y, z, face); destroyProgress = 0; - oDestroyProgress = 0; destroyTicks = 0; destroyDelay = 5; } @@ -231,10 +248,23 @@ float MultiPlayerGameMode::getPickRange() void MultiPlayerGameMode::tick() { ensureHasSentCarriedItem(); - oDestroyProgress = destroyProgress; //minecraft->soundEngine->playMusicTick(); } +bool MultiPlayerGameMode::sameDestroyTarget(int x, int y, int z) +{ + shared_ptr selected = minecraft->player->getCarriedItem(); + bool sameItems = destroyingItem == NULL && selected == NULL; + if (destroyingItem != NULL && selected != NULL) + { + sameItems = + selected->id == destroyingItem->id && + ItemInstance::tagMatches(selected, destroyingItem) && + (selected->isDamageableItem() || selected->getAuxValue() == destroyingItem->getAuxValue()); + } + return x == xDestroyBlock && y == yDestroyBlock && z == zDestroyBlock && sameItems; +} + void MultiPlayerGameMode::ensureHasSentCarriedItem() { int newItem = minecraft->player->inventory->selected; @@ -258,34 +288,37 @@ bool MultiPlayerGameMode::useItemOn(shared_ptr player, Level *level, sha float clickY = (float) hit->y - y; float clickZ = (float) hit->z - z; bool didSomething = false; - int t = level->getTile(x, y, z); - - if (t > 0 && player->isAllowedToUse(Tile::tiles[t])) + + if (!player->isSneaking() || player->getCarriedItem() == NULL) { - if(bTestUseOnly) + int t = level->getTile(x, y, z); + if (t > 0 && player->isAllowedToUse(Tile::tiles[t])) { - switch(t) + if(bTestUseOnly) { - case Tile::recordPlayer_Id: - case Tile::bed_Id: // special case for a bed - if (Tile::tiles[t]->TestUse(level, x, y, z, player )) - { - return true; - } - else if (t==Tile::bed_Id) // 4J-JEV: You can still use items on record players (ie. set fire to them). + switch(t) { - // bed is too far away, or something - return false; - } - break; - default: - if (Tile::tiles[t]->TestUse()) return true; + case Tile::jukebox_Id: + case Tile::bed_Id: // special case for a bed + if (Tile::tiles[t]->TestUse(level, x, y, z, player )) + { + return true; + } + else if (t==Tile::bed_Id) // 4J-JEV: You can still use items on record players (ie. set fire to them). + { + // bed is too far away, or something + return false; + } break; + default: + if (Tile::tiles[t]->TestUse()) return true; + break; + } + } + else + { + if (Tile::tiles[t]->use(level, x, y, z, player, face, clickX, clickY, clickZ)) didSomething = true; } - } - else - { - if (Tile::tiles[t]->use(level, x, y, z, player, face, clickX, clickY, clickZ)) didSomething = true; } } @@ -321,6 +354,7 @@ bool MultiPlayerGameMode::useItemOn(shared_ptr player, Level *level, sha } else { + int t = level->getTile(x, y, z); // 4J - Bit of a hack, however seems preferable to any larger changes which would have more chance of causing unwanted side effects. // If we aren't going to be actually performing the use method locally, then call this method with its "soundOnly" parameter set to true. // This is an addition from the java version, and as its name suggests, doesn't actually perform the use locally but just makes any sounds that @@ -361,7 +395,7 @@ bool MultiPlayerGameMode::useItem(shared_ptr player, Level *level, share // 4J-PB added for tooltips to test use only if(bTestUseOnly) { - result = item->TestUse(level, player); + result = item->TestUse(item, level, player); } else { @@ -444,7 +478,7 @@ void MultiPlayerGameMode::releaseUsingItem(shared_ptr player) bool MultiPlayerGameMode::hasExperience() { - return true; + return localPlayerMode->isSurvival(); } bool MultiPlayerGameMode::hasMissTime() @@ -462,6 +496,13 @@ bool MultiPlayerGameMode::hasFarPickRange() return localPlayerMode->isCreative(); } +// Returns true when the inventory is opened from the server-side. Currently +// only happens when the player is riding a horse. +bool MultiPlayerGameMode::isServerControlledInventory() +{ + return minecraft->player->isRiding() && minecraft->player->riding->instanceof(eTYPE_HORSE); +} + bool MultiPlayerGameMode::handleCraftItem(int recipe, shared_ptr player) { short changeUid = player->containerMenu->backup(player->inventory); diff --git a/Minecraft.Client/MultiPlayerGameMode.h b/Minecraft.Client/MultiPlayerGameMode.h index c84410fa..76aa8fc8 100644 --- a/Minecraft.Client/MultiPlayerGameMode.h +++ b/Minecraft.Client/MultiPlayerGameMode.h @@ -10,8 +10,8 @@ private: int xDestroyBlock; int yDestroyBlock; int zDestroyBlock; + shared_ptr destroyingItem; float destroyProgress; - float oDestroyProgress; int destroyTicks; // 4J was float but doesn't seem to need to be int destroyDelay; bool isDestroying; @@ -39,6 +39,7 @@ private: int carriedItem; private: + bool sameDestroyTarget(int x, int y, int z); void ensureHasSentCarriedItem(); public: 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); @@ -55,6 +56,7 @@ public: virtual bool hasMissTime(); virtual bool hasInfiniteItems(); virtual bool hasFarPickRange(); + virtual bool isServerControlledInventory(); // 4J Stu - Added so we can send packets for this in the network game virtual bool handleCraftItem(int recipe, shared_ptr player); diff --git a/Minecraft.Client/MultiPlayerLevel.cpp b/Minecraft.Client/MultiPlayerLevel.cpp index 24b12bcd..5c27e450 100644 --- a/Minecraft.Client/MultiPlayerLevel.cpp +++ b/Minecraft.Client/MultiPlayerLevel.cpp @@ -9,18 +9,20 @@ #include "MinecraftServer.h" #include "ServerLevel.h" #include "Minecraft.h" +#include "FireworksParticles.h" #include "..\Minecraft.World\PrimedTnt.h" #include "..\Minecraft.World\Tile.h" #include "..\Minecraft.World\TileEntity.h" +#include "..\Minecraft.World\JavaMath.h" MultiPlayerLevel::ResetInfo::ResetInfo(int x, int y, int z, int tile, int data) { - this->x = x; - this->y = y; - this->z = z; - ticks = TICKS_BEFORE_RESET; - this->tile = tile; - this->data = data; + this->x = x; + this->y = y; + this->z = z; + ticks = TICKS_BEFORE_RESET; + this->tile = tile; + this->data = data; } MultiPlayerLevel::MultiPlayerLevel(ClientConnection *connection, LevelSettings *levelSettings, int dimension, int difficulty) @@ -41,7 +43,7 @@ MultiPlayerLevel::MultiPlayerLevel(ClientConnection *connection, LevelSettings * levelData->setInitialized(true); } - if(connection !=NULL) + if(connection !=NULL) { this->connections.push_back( connection ); } @@ -49,12 +51,12 @@ MultiPlayerLevel::MultiPlayerLevel(ClientConnection *connection, LevelSettings * // Fix for #62566 - TU7: Content: Gameplay: Compass needle stops pointing towards the original spawn point, once the player has entered the Nether. // 4J Stu - We should never be setting a specific spawn position for a multiplayer, this should only be set by receiving a packet from the server // (which happens when a player logs in) - //setSpawnPos(new Pos(8, 64, 8)); + //setSpawnPos(new Pos(8, 64, 8)); // The base ctor already has made some storage, so need to delete that if( this->savedDataStorage ) delete savedDataStorage; if(connection !=NULL) { - this->savedDataStorage = connection->savedDataStorage; + savedDataStorage = connection->savedDataStorage; } unshareCheckX = 0; unshareCheckZ = 0; @@ -91,27 +93,38 @@ void MultiPlayerLevel::shareChunkAt(int x, int z) void MultiPlayerLevel::tick() { PIXBeginNamedEvent(0,"Sky color changing"); - setTime(getTime() + 1); - /* 4J - change brought forward from 1.8.2 - int newDark = this->getSkyDarken(1); - if (newDark != skyDarken) + setGameTime(getGameTime() + 1); + if (getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT)) { - skyDarken = newDark; - for (unsigned int i = 0; i < listeners.size(); i++) + // 4J: Debug setting added to keep it at day time +#ifndef _FINAL_BUILD + bool freezeTime = app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<skyColorChanged(); - } - }*/ + setDayTime(getDayTime() + 1); + } + } + /* 4J - change brought forward from 1.8.2 + int newDark = this->getSkyDarken(1); + if (newDark != skyDarken) + { + skyDarken = newDark; + for (unsigned int i = 0; i < listeners.size(); i++) + { + listeners[i]->skyColorChanged(); + } + }*/ PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Entity re-entry"); EnterCriticalSection(&m_entitiesCS); - for (int i = 0; i < 10 && !reEntries.empty(); i++) + for (int i = 0; i < 10 && !reEntries.empty(); i++) { shared_ptr e = *(reEntries.begin()); - if (find(entities.begin(), entities.end(), e) == entities.end() ) addEntity(e); - } + if (find(entities.begin(), entities.end(), e) == entities.end() ) addEntity(e); + } LeaveCriticalSection(&m_entitiesCS); PIXEndNamedEvent(); @@ -127,21 +140,21 @@ void MultiPlayerLevel::tick() PIXBeginNamedEvent(0,"Updating resets"); unsigned int lastIndexToRemove = 0; bool eraseElements = false; - for (unsigned int i = 0; i < updatesToReset.size(); i++) + for (unsigned int i = 0; i < updatesToReset.size(); i++) { - ResetInfo& r = updatesToReset[i]; - if (--r.ticks == 0) + ResetInfo& r = updatesToReset[i]; + if (--r.ticks == 0) { - Level::setTileAndDataNoUpdate(r.x, r.y, r.z, r.tile, r.data); - Level::sendTileUpdated(r.x, r.y, r.z); - + Level::setTileAndData(r.x, r.y, r.z, r.tile, r.data, Tile::UPDATE_ALL); + Level::sendTileUpdated(r.x, r.y, r.z); + //updatesToReset.erase(updatesToReset.begin()+i); eraseElements = true; lastIndexToRemove = 0; i--; - } - } + } + } // 4J Stu - As elements in the updatesToReset vector are inserted with a fixed initial lifetime, the elements at the front should always be the oldest // Therefore we can always remove from the first element if(eraseElements) @@ -156,7 +169,7 @@ void MultiPlayerLevel::tick() // 4J - added this section. Each tick we'll check a different block, and force it to share data if it has been // more than 2 minutes since we last wanted to unshare it. This shouldn't really ever happen, and is added // here as a safe guard against accumulated memory leaks should a lot of chunks become unshared over time. - + int ls = dimension->getXZSize(); if( g_NetworkManager.IsHost() ) { @@ -232,16 +245,16 @@ void MultiPlayerLevel::tick() totalSLl += lc->getSkyLightPlanesLower(); } } - if( totalChunks ) - { - MEMORYSTATUS memStat; - GlobalMemoryStatus(&memStat); + if( totalChunks ) + { + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); - unsigned int totalBL = totalBLu + totalBLl; - unsigned int totalSL = totalSLu + totalSLl; - printf("%d: %d chunks, %d BL (%d + %d), %d SL (%d + %d ) (out of %d) - total %d %% (%dMB mem free)\n", - dimension->id, totalChunks, totalBL, totalBLu, totalBLl, totalSL, totalSLu, totalSLl, totalChunks * 256, ( 100 * (totalBL + totalSL) ) / ( totalChunks * 256 * 2),memStat.dwAvailPhys/(1024*1024) ); - } + unsigned int totalBL = totalBLu + totalBLl; + unsigned int totalSL = totalSLu + totalSLl; + printf("%d: %d chunks, %d BL (%d + %d), %d SL (%d + %d ) (out of %d) - total %d %% (%dMB mem free)\n", + dimension->id, totalChunks, totalBL, totalBLu, totalBLl, totalSL, totalSLu, totalSLl, totalChunks * 256, ( 100 * (totalBL + totalSL) ) / ( totalChunks * 256 * 2),memStat.dwAvailPhys/(1024*1024) ); + } } updateTick++; @@ -265,14 +278,14 @@ void MultiPlayerLevel::tick() totalData += lc->getDataPlanes(); } } - if( totalChunks ) - { - MEMORYSTATUS memStat; - GlobalMemoryStatus(&memStat); + if( totalChunks ) + { + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); - printf("%d: %d chunks, %d data (out of %d) - total %d %% (%dMB mem free)\n", - dimension->id, totalChunks, totalData, totalChunks * 128, ( 100 * totalData)/ ( totalChunks * 128),memStat.dwAvailPhys/(1024*1024) ); - } + printf("%d: %d chunks, %d data (out of %d) - total %d %% (%dMB mem free)\n", + dimension->id, totalChunks, totalData, totalChunks * 128, ( 100 * totalData)/ ( totalChunks * 128),memStat.dwAvailPhys/(1024*1024) ); + } } updateTick++; @@ -308,42 +321,42 @@ void MultiPlayerLevel::tick() total += thisSize; } } - printf("\n*****************************************************************************************************************************************\n"); - if( totalChunks ) - { - printf("%d (0) %d (1) %d (2) %d (4) %d (8)\n",total0/totalChunks,total1/totalChunks,total2/totalChunks,total4/totalChunks,total8/totalChunks); - MEMORYSTATUS memStat; - GlobalMemoryStatus(&memStat); + printf("\n*****************************************************************************************************************************************\n"); + if( totalChunks ) + { + printf("%d (0) %d (1) %d (2) %d (4) %d (8)\n",total0/totalChunks,total1/totalChunks,total2/totalChunks,total4/totalChunks,total8/totalChunks); + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); - printf("%d: %d chunks, %d KB (out of %dKB) : %d %% (%dMB mem free)\n", - dimension->id, totalChunks, total/1024, totalChunks * 32, ( ( total / 1024 ) * 100 ) / ( totalChunks * 32),memStat.dwAvailPhys/(1024*1024) ); - } + printf("%d: %d chunks, %d KB (out of %dKB) : %d %% (%dMB mem free)\n", + dimension->id, totalChunks, total/1024, totalChunks * 32, ( ( total / 1024 ) * 100 ) / ( totalChunks * 32),memStat.dwAvailPhys/(1024*1024) ); + } } updateTick++; #endif - // super.tick(); + // super.tick(); } void MultiPlayerLevel::clearResetRegion(int x0, int y0, int z0, int x1, int y1, int z1) { - for (unsigned int i = 0; i < updatesToReset.size(); i++) + for (unsigned int i = 0; i < updatesToReset.size(); i++) { - ResetInfo& r = updatesToReset[i]; - if (r.x >= x0 && r.y >= y0 && r.z >= z0 && r.x <= x1 && r.y <= y1 && r.z <= z1) + ResetInfo& r = updatesToReset[i]; + if (r.x >= x0 && r.y >= y0 && r.z >= z0 && r.x <= x1 && r.y <= y1 && r.z <= z1) { - updatesToReset.erase(updatesToReset.begin()+i); + updatesToReset.erase(updatesToReset.begin()+i); i--; - } - } + } + } } ChunkSource *MultiPlayerLevel::createChunkSource() { - chunkCache = new MultiPlayerChunkCache(this); + chunkCache = new MultiPlayerChunkCache(this); - return chunkCache; + return chunkCache; } void MultiPlayerLevel::validateSpawn() @@ -378,7 +391,7 @@ void MultiPlayerLevel::tickTiles() int xo = cp.x * 16; int zo = cp.z * 16; - LevelChunk *lc = this->getChunk(cp.x, cp.z); + LevelChunk *lc = getChunk(cp.x, cp.z); tickClientSideTiles(xo, zo, lc); } @@ -388,32 +401,32 @@ void MultiPlayerLevel::tickTiles() void MultiPlayerLevel::setChunkVisible(int x, int z, bool visible) { - if (visible) + if (visible) { chunkCache->create(x, z); } - else + else { chunkCache->drop(x, z); } - if (!visible) + if (!visible) { - this->setTilesDirty(x * 16, 0, z * 16, x * 16 + 15, Level::maxBuildHeight, z * 16 + 15); - } + setTilesDirty(x * 16, 0, z * 16, x * 16 + 15, Level::maxBuildHeight, z * 16 + 15); + } } bool MultiPlayerLevel::addEntity(shared_ptr e) { - bool ok = Level::addEntity(e); - forced.insert(e); + bool ok = Level::addEntity(e); + forced.insert(e); - if (!ok) + if (!ok) { - reEntries.insert(e); - } + reEntries.insert(e); + } - return ok; + return ok; } void MultiPlayerLevel::removeEntity(shared_ptr e) @@ -421,50 +434,50 @@ void MultiPlayerLevel::removeEntity(shared_ptr e) // 4J Stu - Add this remove from the reEntries collection to stop us continually removing and re-adding things, // in particular the MultiPlayerLocalPlayer when they die AUTO_VAR(it, reEntries.find(e)); - if (it!=reEntries.end()) + if (it!=reEntries.end()) { - reEntries.erase(it); - } + reEntries.erase(it); + } - Level::removeEntity(e); - forced.erase(e); + Level::removeEntity(e); + forced.erase(e); } void MultiPlayerLevel::entityAdded(shared_ptr e) { - Level::entityAdded(e); + Level::entityAdded(e); AUTO_VAR(it, reEntries.find(e)); - if (it!=reEntries.end()) + if (it!=reEntries.end()) { - reEntries.erase(it); - } + reEntries.erase(it); + } } void MultiPlayerLevel::entityRemoved(shared_ptr e) { - Level::entityRemoved(e); + Level::entityRemoved(e); AUTO_VAR(it, forced.find(e)); - if (it!=forced.end()) + if (it!=forced.end()) { - reEntries.insert(e); - } + reEntries.insert(e); + } } void MultiPlayerLevel::putEntity(int id, shared_ptr e) { - shared_ptr old = getEntity(id); - if (old != NULL) + shared_ptr old = getEntity(id); + if (old != NULL) { - removeEntity(old); - } + removeEntity(old); + } - forced.insert(e); - e->entityId = id; - if (!addEntity(e)) + forced.insert(e); + e->entityId = id; + if (!addEntity(e)) { - this->reEntries.insert(e); - } - entitiesById[id] = e; + reEntries.insert(e); + } + entitiesById[id] = e; } shared_ptr MultiPlayerLevel::getEntity(int id) @@ -488,7 +501,7 @@ shared_ptr MultiPlayerLevel::removeEntity(int id) else { } - return e; + return e; } // 4J Added to remove the entities from the forced list @@ -510,29 +523,40 @@ void MultiPlayerLevel::removeEntities(vector > *list) Level::removeEntities(list); } -bool MultiPlayerLevel::setDataNoUpdate(int x, int y, int z, int data) +bool MultiPlayerLevel::setData(int x, int y, int z, int data, int updateFlags, bool forceUpdate/*=false*/) // 4J added forceUpdate) { - int t = getTile(x, y, z); - int d = getData(x, y, z); + // First check if this isn't going to do anything, because if it isn't then the next stage (of unsharing data) is really quite + // expensive so far better to early out here + int d = getData(x, y, z); + + if( ( d == data ) ) + { + // If we early-out, its important that we still do a checkLight here (which would otherwise have happened as part of Level::setTileAndDataNoUpdate) + // This is because since we are potentially sharing tile/data but not lighting data, it is possible that the server might tell a client + // of a lighting update that doesn't need actioned on the client just because the chunk's data was being shared with the server when it was set. However, + // the lighting data will potentially now be out of sync on the client. + checkLight(x,y,z); + return false; + } // 4J - added - if this is the host, then stop sharing block data with the server at this point unshareChunkAt(x,z); - if (Level::setDataNoUpdate(x, y, z, data)) + if (Level::setData(x, y, z, data, updateFlags, forceUpdate)) { //if(m_bEnableResetChanges) updatesToReset.push_back(ResetInfo(x, y, z, t, d)); - return true; - } + return true; + } // Didn't actually need to stop sharing shareChunkAt(x,z); - return false; + return false; } -bool MultiPlayerLevel::setTileAndDataNoUpdate(int x, int y, int z, int tile, int data) +bool MultiPlayerLevel::setTileAndData(int x, int y, int z, int tile, int data, int updateFlags) { // First check if this isn't going to do anything, because if it isn't then the next stage (of unsharing data) is really quite // expensive so far better to early out here - int t = getTile(x, y, z); - int d = getData(x, y, z); + int t = getTile(x, y, z); + int d = getData(x, y, z); if( ( t == tile ) && ( d == data ) ) { @@ -546,49 +570,33 @@ bool MultiPlayerLevel::setTileAndDataNoUpdate(int x, int y, int z, int tile, int // 4J - added - if this is the host, then stop sharing block data with the server at this point unshareChunkAt(x,z); - if (Level::setTileAndDataNoUpdate(x, y, z, tile, data)) + if (Level::setTileAndData(x, y, z, tile, data, updateFlags)) { - //if(m_bEnableResetChanges) updatesToReset.push_back(ResetInfo(x, y, z, t, d)); - return true; - } + //if(m_bEnableResetChanges) updatesToReset.push_back(ResetInfo(x, y, z, t, d)); + return true; + } // Didn't actually need to stop sharing shareChunkAt(x,z); - return false; + return false; } -bool MultiPlayerLevel::setTileNoUpdate(int x, int y, int z, int tile) -{ - int t = getTile(x, y, z); - int d = getData(x, y, z); - // 4J - added - if this is the host, then stop sharing block data with the server at this point - unshareChunkAt(x,z); - - if (Level::setTileNoUpdate(x, y, z, tile)) - { - //if(m_bEnableResetChanges) updatesToReset.push_back(ResetInfo(x, y, z, t, d)); - return true; - } - // Didn't actually need to stop sharing - shareChunkAt(x,z); - return false; -} bool MultiPlayerLevel::doSetTileAndData(int x, int y, int z, int tile, int data) { - clearResetRegion(x, y, z, x, y, z); + clearResetRegion(x, y, z, x, y, z); // 4J - Don't bother setting this to dirty if it isn't going to visually change - we get a lot of // water changing from static to dynamic for instance. Note that this is only called from a client connection, // and so the thing being notified of any update through tileUpdated is the renderer int prevTile = getTile(x, y, z); bool visuallyImportant = (!( ( ( prevTile == Tile::water_Id ) && ( tile == Tile::calmWater_Id ) ) || - ( ( prevTile == Tile::calmWater_Id ) && ( tile == Tile::water_Id ) ) || - ( ( prevTile == Tile::lava_Id ) && ( tile == Tile::calmLava_Id ) ) || - ( ( prevTile == Tile::calmLava_Id ) && ( tile == Tile::calmLava_Id ) ) || - ( ( prevTile == Tile::calmLava_Id ) && ( tile == Tile::lava_Id ) ) ) ); + ( ( prevTile == Tile::calmWater_Id ) && ( tile == Tile::water_Id ) ) || + ( ( prevTile == Tile::lava_Id ) && ( tile == Tile::calmLava_Id ) ) || + ( ( prevTile == Tile::calmLava_Id ) && ( tile == Tile::calmLava_Id ) ) || + ( ( prevTile == Tile::calmLava_Id ) && ( tile == Tile::lava_Id ) ) ) ); // If we're the host, need to tell the renderer for updates even if they don't change things as the host // might have been sharing data and so set it already, but the renderer won't know to update - if( (Level::setTileAndData(x, y, z, tile, data) || g_NetworkManager.IsHost() ) ) + if( (Level::setTileAndData(x, y, z, tile, data, Tile::UPDATE_ALL) || g_NetworkManager.IsHost() ) ) { if( g_NetworkManager.IsHost() && visuallyImportant ) { @@ -598,8 +606,8 @@ bool MultiPlayerLevel::doSetTileAndData(int x, int y, int z, int tile, int data) tileUpdated(x, y, z, tile); } - return true; - } + return true; + } return false; } @@ -621,38 +629,38 @@ void MultiPlayerLevel::disconnect(bool sendDisconnect /*= true*/) } } -void MultiPlayerLevel::tickWeather() +Tickable *MultiPlayerLevel::makeSoundUpdater(shared_ptr minecart) { - if (dimension->hasCeiling) return; + return NULL; //new MinecartSoundUpdater(minecraft->soundEngine, minecart, minecraft->player); +} - if (lightningTime > 0) - { - lightningTime--; - } +void MultiPlayerLevel::tickWeather() +{ + if (dimension->hasCeiling) return; - oRainLevel = rainLevel; - if (levelData->isRaining()) + oRainLevel = rainLevel; + if (levelData->isRaining()) { - rainLevel += 0.01; - } + rainLevel += 0.01; + } else { - rainLevel -= 0.01; - } - if (rainLevel < 0) rainLevel = 0; - if (rainLevel > 1) rainLevel = 1; + rainLevel -= 0.01; + } + if (rainLevel < 0) rainLevel = 0; + if (rainLevel > 1) rainLevel = 1; - oThunderLevel = thunderLevel; - if (levelData->isThundering()) + oThunderLevel = thunderLevel; + if (levelData->isThundering()) { - thunderLevel += 0.01; - } + thunderLevel += 0.01; + } else { - thunderLevel -= 0.01; - } - if (thunderLevel < 0) thunderLevel = 0; - if (thunderLevel > 1) thunderLevel = 1; + thunderLevel -= 0.01; + } + if (thunderLevel < 0) thunderLevel = 0; + if (thunderLevel > 1) thunderLevel = 1; } @@ -687,7 +695,7 @@ void MultiPlayerLevel::animateTick(int xt, int yt, int zt) void MultiPlayerLevel::animateTickDoWork() { const int ticksPerChunk = 16; // This ought to give us roughly the same 1000/32768 chance of a tile being animated as the original - + // Horrible hack to communicate with the level renderer, which is just attached as a listener to this level. This let's the particle // rendering know to use this level (rather than try to work it out from the current player), and to not bother distance clipping particles // which would again be based on the current player. @@ -714,8 +722,8 @@ void MultiPlayerLevel::animateTickDoWork() int t = getTile(x, y, z); if (random->nextInt(8) > y && t == 0 && dimension->hasBedrockFog()) // 4J - test for bedrock fog brought forward from 1.2.3 { - addParticle(eParticleType_depthsuspend, x + random->nextFloat(), y + random->nextFloat(), z + random->nextFloat(), 0, 0, 0); - } + addParticle(eParticleType_depthsuspend, x + random->nextFloat(), y + random->nextFloat(), z + random->nextFloat(), 0, 0, 0); + } else if (t > 0) { Tile::tiles[t]->animateTick(this, x, y, z, animateRandom); @@ -735,7 +743,7 @@ void MultiPlayerLevel::playSound(shared_ptr entity, int iSound, float vo playLocalSound(entity->x, entity->y - entity->heightOffset, entity->z, iSound, volume, pitch); } -void MultiPlayerLevel::playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist) +void MultiPlayerLevel::playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, bool distanceDelay/*= false */, float fClipSoundDist) { //float dd = 16; if (volume > 1) fClipSoundDist *= volume; @@ -756,10 +764,46 @@ void MultiPlayerLevel::playLocalSound(double x, double y, double z, int iSound, if (minDistSq < fClipSoundDist * fClipSoundDist) { - minecraft->soundEngine->play(iSound, (float) x, (float) y, (float) z, volume, pitch); + if (distanceDelay && minDistSq > 10 * 10) + { + // exhaggerate sound speed effect by making speed of sound ~= + // 40 m/s instead of 300 m/s + double delayInSeconds = sqrt(minDistSq) / 40.0; + minecraft->soundEngine->schedule(iSound, (float) x, (float) y, (float) z, volume, pitch, (int) Math::round(delayInSeconds * SharedConstants::TICKS_PER_SECOND)); + } + else + { + minecraft->soundEngine->play(iSound, (float) x, (float) y, (float) z, volume, pitch); + } } } +void MultiPlayerLevel::createFireworks(double x, double y, double z, double xd, double yd, double zd, CompoundTag *infoTag) +{ + minecraft->particleEngine->add(shared_ptr(new FireworksParticles::FireworksStarter(this, x, y, z, xd, yd, zd, minecraft->particleEngine, infoTag))); +} + +void MultiPlayerLevel::setScoreboard(Scoreboard *scoreboard) +{ + this->scoreboard = scoreboard; +} + +void MultiPlayerLevel::setDayTime(__int64 newTime) +{ + // 4J: We send daylight cycle rule with host options so don't need this + /*if (newTime < 0) + { + newTime = -newTime; + getGameRules()->set(GameRules::RULE_DAYLIGHT, L"false"); + } + else + { + getGameRules()->set(GameRules::RULE_DAYLIGHT, L"true"); + }*/ + + Level::setDayTime(newTime); +} + void MultiPlayerLevel::removeAllPendingEntityRemovals() { //entities.removeAll(entitiesToRemove); @@ -853,7 +897,7 @@ void MultiPlayerLevel::removeClientConnection(ClientConnection *c, bool sendDisc { if( sendDisconnect ) { - c->sendAndDisconnect( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) ); + c->sendAndDisconnect( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Quitting) ) ); } AUTO_VAR(it, find( connections.begin(), connections.end(), c )); @@ -883,11 +927,11 @@ void MultiPlayerLevel::removeUnusedTileEntitiesInRegion(int x0, int y0, int z0, { EnterCriticalSection(&m_tileEntityListCS); - for (unsigned int i = 0; i < tileEntityList.size();) + for (unsigned int i = 0; i < tileEntityList.size();) { bool removed = false; - shared_ptr te = tileEntityList[i]; - if (te->x >= x0 && te->y >= y0 && te->z >= z0 && te->x < x1 && te->y < y1 && te->z < z1) + shared_ptr te = tileEntityList[i]; + if (te->x >= x0 && te->y >= y0 && te->z >= z0 && te->x < x1 && te->y < y1 && te->z < z1) { LevelChunk *lc = getChunk(te->x >> 4, te->z >> 4); if (lc != NULL) @@ -906,9 +950,9 @@ void MultiPlayerLevel::removeUnusedTileEntitiesInRegion(int x0, int y0, int z0, removed = true; } } - } + } if( !removed ) i++; - } + } LeaveCriticalSection(&m_tileEntityListCS); } diff --git a/Minecraft.Client/MultiPlayerLevel.h b/Minecraft.Client/MultiPlayerLevel.h index c07b5583..6e5b0086 100644 --- a/Minecraft.Client/MultiPlayerLevel.h +++ b/Minecraft.Client/MultiPlayerLevel.h @@ -15,12 +15,12 @@ class MultiPlayerLevel : public Level private: static const int TICKS_BEFORE_RESET = 20 * 4; - class ResetInfo + class ResetInfo { public: - int x, y, z, ticks, tile, data; - ResetInfo(int x, int y, int z, int tile, int data); - }; + int x, y, z, ticks, tile, data; + ResetInfo(int x, int y, int z, int tile, int data); + }; vector updatesToReset; // 4J - was linked list but vector seems more appropriate bool m_bEnableResetChanges; // 4J Added @@ -34,50 +34,51 @@ private: int unshareCheckZ; // 4J - added int compressCheckX; // 4J - added int compressCheckZ; // 4J - added - vector connections; // 4J Stu - Made this a vector as we can have more than one local connection - MultiPlayerChunkCache *chunkCache; + vector connections; // 4J Stu - Made this a vector as we can have more than one local connection + MultiPlayerChunkCache *chunkCache; Minecraft *minecraft; + Scoreboard *scoreboard; public: MultiPlayerLevel(ClientConnection *connection, LevelSettings *levelSettings, int dimension, int difficulty); virtual ~MultiPlayerLevel(); - virtual void tick() ; + virtual void tick() ; void clearResetRegion(int x0, int y0, int z0, int x1, int y1, int z1); protected: - ChunkSource *createChunkSource(); // 4J - was virtual, but was called from parent ctor + ChunkSource *createChunkSource(); // 4J - was virtual, but was called from parent ctor public: virtual void validateSpawn(); protected: virtual void tickTiles(); public: - void setChunkVisible(int x, int z, bool visible); + void setChunkVisible(int x, int z, bool visible); private: unordered_map, IntKeyHash2, IntKeyEq> entitiesById; // 4J - was IntHashMap - unordered_set > forced; - unordered_set > reEntries; + unordered_set > forced; + unordered_set > reEntries; public: virtual bool addEntity(shared_ptr e); - virtual void removeEntity(shared_ptr e); + virtual void removeEntity(shared_ptr e); protected: virtual void entityAdded(shared_ptr e); - virtual void entityRemoved(shared_ptr e); + virtual void entityRemoved(shared_ptr e); public: void putEntity(int id, shared_ptr e); - shared_ptr getEntity(int id); - shared_ptr removeEntity(int id); + shared_ptr getEntity(int id); + shared_ptr removeEntity(int id); virtual void removeEntities(vector > *list); // 4J Added override - virtual bool setDataNoUpdate(int x, int y, int z, int data); - virtual bool setTileAndDataNoUpdate(int x, int y, int z, int tile, int data); - virtual bool setTileNoUpdate(int x, int y, int z, int tile); - bool doSetTileAndData(int x, int y, int z, int tile, int data); - virtual void disconnect(bool sendDisconnect = true); + virtual bool setData(int x, int y, int z, int data, int updateFlags, bool forceUpdate =false ); + virtual bool setTileAndData(int x, int y, int z, int tile, int data, int updateFlags); + bool doSetTileAndData(int x, int y, int z, int tile, int data); + virtual void disconnect(bool sendDisconnect = true); void animateTick(int xt, int yt, int zt); protected: + virtual Tickable *makeSoundUpdater(shared_ptr minecart); virtual void tickWeather(); - + static const int ANIMATE_TICK_MAX_PARTICLES = 500; public: @@ -89,7 +90,11 @@ public: virtual void playSound(shared_ptr entity, int iSound, float volume, float pitch); - virtual void playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist=16.0f); + virtual void playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, bool distanceDelay = false, float fClipSoundDist = 16.0f); + + virtual void createFireworks(double x, double y, double z, double xd, double yd, double zd, CompoundTag *infoTag); + virtual void setScoreboard(Scoreboard *scoreboard); + virtual void setDayTime(__int64 newTime); // 4J Stu - Added so we can have multiple local connections void addClientConnection(ClientConnection *c) { connections.push_back( c ); } diff --git a/Minecraft.Client/MultiPlayerLocalPlayer.cpp b/Minecraft.Client/MultiPlayerLocalPlayer.cpp index bb2630e5..25bf06bf 100644 --- a/Minecraft.Client/MultiPlayerLocalPlayer.cpp +++ b/Minecraft.Client/MultiPlayerLocalPlayer.cpp @@ -12,9 +12,13 @@ #include "..\Minecraft.World\net.minecraft.world.effect.h" #include "..\Minecraft.World\LevelData.h" #include "..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "Input.h" +#include "LevelRenderer.h" - - +// 4J added for testing +#ifdef STRESS_TEST_MOVE +volatile bool stressTestEnabled = true; +#endif MultiplayerLocalPlayer::MultiplayerLocalPlayer(Minecraft *minecraft, Level *level, User *user, ClientConnection *connection) : LocalPlayer(minecraft, level, user, level->dimension->id) { @@ -31,12 +35,12 @@ MultiplayerLocalPlayer::MultiplayerLocalPlayer(Minecraft *minecraft, Level *leve this->connection = connection; } -bool MultiplayerLocalPlayer::hurt(DamageSource *source, int dmg) +bool MultiplayerLocalPlayer::hurt(DamageSource *source, float dmg) { return false; } -void MultiplayerLocalPlayer::heal(int heal) +void MultiplayerLocalPlayer::heal(float heal) { } @@ -56,12 +60,29 @@ void MultiplayerLocalPlayer::tick() if (!level->hasChunkAt(Mth::floor(x), 0, Mth::floor(z))) return; double tempX = x, tempY = y, tempZ = z; + LocalPlayer::tick(); - + + // 4J added for testing +#ifdef STRESS_TEST_MOVE + if(stressTestEnabled) + { + StressTestMove(&tempX,&tempY,&tempZ); + } +#endif + //if( !minecraft->localgameModes[m_iPad]->isTutorial() || minecraft->localgameModes[m_iPad]->getTutorial()->canMoveToPosition(tempX, tempY, tempZ, x, y, z) ) if(minecraft->localgameModes[m_iPad]->getTutorial()->canMoveToPosition(tempX, tempY, tempZ, x, y, z)) { - sendPosition(); + if (isRiding()) + { + connection->send(shared_ptr(new MovePlayerPacket::Rot(yRot, xRot, onGround, abilities.flying))); + connection->send(shared_ptr(new PlayerInputPacket(xxa, yya, input->jumping, input->sneaking))); + } + else + { + sendPosition(); + } } else { @@ -129,7 +150,7 @@ void MultiplayerLocalPlayer::sendPosition() } else { - connection->send( shared_ptr( new MovePlayerPacket(onGround, abilities.flying) ) ); + connection->send( shared_ptr( new MovePlayerPacket(onGround, abilities.flying) ) ); } } @@ -180,8 +201,9 @@ void MultiplayerLocalPlayer::respawn() } -void MultiplayerLocalPlayer::actuallyHurt(DamageSource *source, int dmg) +void MultiplayerLocalPlayer::actuallyHurt(DamageSource *source, float dmg) { + if (isInvulnerable()) return; setHealth(getHealth() - dmg); } @@ -211,7 +233,7 @@ void MultiplayerLocalPlayer::onEffectAdded(MobEffectInstance *effect) } -void MultiplayerLocalPlayer::onEffectUpdated(MobEffectInstance *effect) +void MultiplayerLocalPlayer::onEffectUpdated(MobEffectInstance *effect, bool doRefreshAttributes) { Minecraft *pMinecraft = Minecraft::GetInstance(); if(pMinecraft->localgameModes[m_iPad] != NULL ) @@ -220,7 +242,7 @@ void MultiplayerLocalPlayer::onEffectUpdated(MobEffectInstance *effect) Tutorial *tutorial = gameMode->getTutorial(); tutorial->onEffectChanged(MobEffect::effects[effect->getId()]); } - Player::onEffectUpdated(effect); + Player::onEffectUpdated(effect, doRefreshAttributes); } @@ -239,11 +261,17 @@ void MultiplayerLocalPlayer::onEffectRemoved(MobEffectInstance *effect) void MultiplayerLocalPlayer::closeContainer() { connection->send( shared_ptr( new ContainerClosePacket(containerMenu->containerId) ) ); + clientSideCloseContainer(); +} + +// close the container without sending a packet to the server +void MultiplayerLocalPlayer::clientSideCloseContainer() +{ inventory->setCarried(nullptr); LocalPlayer::closeContainer(); } -void MultiplayerLocalPlayer::hurtTo(int newHealth, ETelemetryChallenges damageSource) +void MultiplayerLocalPlayer::hurtTo(float newHealth, ETelemetryChallenges damageSource) { if (flashOnSetHealth) { @@ -294,12 +322,29 @@ bool MultiplayerLocalPlayer::isLocalPlayer() return true; } +void MultiplayerLocalPlayer::sendRidingJump() +{ + connection->send(shared_ptr(new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::RIDING_JUMP, (int) (getJumpRidingScale() * 100.0f)))); +} + +void MultiplayerLocalPlayer::sendOpenInventory() +{ + connection->send(shared_ptr(new PlayerCommandPacket(shared_from_this(), PlayerCommandPacket::OPEN_INVENTORY))); +} + void MultiplayerLocalPlayer::ride(shared_ptr e) { bool wasRiding = riding != NULL; LocalPlayer::ride(e); bool isRiding = riding != NULL; + // 4J Added + if(wasRiding && !isRiding) + { + setSneaking(false); + input->sneaking = false; + } + if( isRiding ) { ETelemetryChallenges eventType = eTelemetryChallenges_Unknown; @@ -334,10 +379,7 @@ void MultiplayerLocalPlayer::ride(shared_ptr e) } else if (!wasRiding && isRiding) { - if(dynamic_pointer_cast(e) != NULL) - gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Riding_Minecart); - else if(dynamic_pointer_cast(e) != NULL) - gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Riding_Boat); + gameMode->getTutorial()->onRideEntity(e); } } } @@ -367,3 +409,78 @@ void MultiplayerLocalPlayer::setAndBroadcastCustomCape(DWORD capeId) #endif if(getCustomCape() != oldCapeIndex) connection->send( shared_ptr( new TextureChangePacket( shared_from_this(), TextureChangePacket::e_TextureChange_Cape, app.GetPlayerCapeName(GetXboxPad()) ) ) ); } + +// 4J added for testing. This moves the player in a repeated sequence of 2 modes: +// Mode 0 - teleports to random location in the world, and waits for the number of chunks that are fully loaded/created to have setting for 2 seconds before changing to mode 1 +// Mode 1 - picks a random direction to move in for 200 ticks (~10 seconds), repeating for a total of 2000 ticks, before cycling back to mode 0 +// Whilst carrying out this movement pattern, this calls checkAllPresentChunks which checks the integrity of all currently loaded/created chunks round the player. +#ifdef STRESS_TEST_MOVE +void MultiplayerLocalPlayer::StressTestMove(double *tempX, double *tempY, double *tempZ) +{ + static volatile int64_t lastChangeTime = 0; + static volatile int64_t lastTeleportTime = 0; + static int lastCount = 0; + static int stressTestCount = 0; + const int dirChangeTickCount = 200; + + int64_t currentTime = System::currentTimeMillis(); + + bool faultFound = false; + int count = Minecraft::GetInstance()->levelRenderer->checkAllPresentChunks(&faultFound); + +/* + if( faultFound ) + { + app.DebugPrintf("Fault found\n"); + stressTestEnabled = false; + } + */ + if( count != lastCount ) + { + lastChangeTime = currentTime; + lastCount = count; + } + + static float angle = 30.0; + static float dx = cos(30.0); + static float dz = sin(30.0); + +#if 0 + if( ( stressTestCount % dirChangeTickCount) == 0 ) + { + int angledeg = rand() % 360; + angle = (((double)angledeg) / 360.0 ) * ( 2.0 * 3.141592654 ); + dx = cos(angle); + dz = sin(angle); + } +#endif + + float nx = x + ( dx * 1.2 ); + float nz = z + ( dz * 1.2 ); + float ny = y; + if( ny < 140.0f ) ny += 0.5f; + if( nx > 2539.0 ) + { + nx = 2539.0; + dx = -dx; + } + if( nz > 2539.0 ) + { + nz = 2539.0; + dz = -dz; + } + if( nx < -2550.0 ) + { + nx = -2550.0; + dx = -dx; + } + + if( nz < -2550.0 ) + { + nz = -2550.0; + dz = -dz; + } + absMoveTo(nx,ny,nz,yRot,xRot); + stressTestCount++; +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/MultiPlayerLocalPlayer.h b/Minecraft.Client/MultiPlayerLocalPlayer.h index 8687b36a..e660a96a 100644 --- a/Minecraft.Client/MultiPlayerLocalPlayer.h +++ b/Minecraft.Client/MultiPlayerLocalPlayer.h @@ -6,6 +6,8 @@ class ClientConnection; class Minecraft; class Level; +//#define STRESS_TEST_MOVE + class MultiplayerLocalPlayer : public LocalPlayer { private: @@ -20,8 +22,8 @@ private: double xLast, yLast1, yLast2, zLast; float yRotLast, xRotLast; public: - virtual bool hurt(DamageSource *source, int dmg); - virtual void heal(int heal); + virtual bool hurt(DamageSource *source, float dmg); + virtual void heal(float heal); virtual void tick(); private: bool lastOnGround; @@ -41,23 +43,30 @@ public: virtual void swing(); virtual void respawn(); protected: - virtual void actuallyHurt(DamageSource *source, int dmg); + virtual void actuallyHurt(DamageSource *source, float dmg); // 4J Added override to capture event for tutorial messages virtual void completeUsingItem(); // 4J Added overrides to capture events for tutorial virtual void onEffectAdded(MobEffectInstance *effect); - virtual void onEffectUpdated(MobEffectInstance *effect); + virtual void onEffectUpdated(MobEffectInstance *effect, bool doRefreshAttributes); virtual void onEffectRemoved(MobEffectInstance *effect); public: virtual void closeContainer(); - virtual void hurtTo(int newHealth, ETelemetryChallenges damageSource); + void clientSideCloseContainer(); + virtual void hurtTo(float newHealth, ETelemetryChallenges damageSource); virtual void awardStat(Stat *stat, byteArray param); void awardStatFromServer(Stat *stat, byteArray param); void onUpdateAbilities(); bool isLocalPlayer(); +protected: + virtual void sendRidingJump(); + +public: + virtual void sendOpenInventory(); + // 4J - send the custom skin texture data if there is one //void CustomSkin(PBYTE pbData, DWORD dwBytes); @@ -70,4 +79,9 @@ public: // 4J Added virtual void setAndBroadcastCustomSkin(DWORD skinId); virtual void setAndBroadcastCustomCape(DWORD capeId); + + // 4J added for testing +#ifdef STRESS_TEST_MOVE + void StressTestMove(double *tempX, double *tempY, double *tempZ); +#endif }; diff --git a/Minecraft.Client/MushroomCowRenderer.cpp b/Minecraft.Client/MushroomCowRenderer.cpp index 688fab5c..b5f9ba9f 100644 --- a/Minecraft.Client/MushroomCowRenderer.cpp +++ b/Minecraft.Client/MushroomCowRenderer.cpp @@ -1,9 +1,12 @@ #include "stdafx.h" -#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" -#include "..\Minecraft.World\net.minecraft.world.level.tile.h" -#include "QuadrupedModel.h" #include "ModelPart.h" #include "MushroomCowRenderer.h" +#include "TextureAtlas.h" +#include "QuadrupedModel.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" + +ResourceLocation MushroomCowRenderer::MOOSHROOM_LOCATION = ResourceLocation(TN_MOB_RED_COW); MushroomCowRenderer::MushroomCowRenderer(Model *model, float shadow) : MobRenderer(model, shadow) { @@ -19,23 +22,23 @@ void MushroomCowRenderer::render(shared_ptr _mob, double x, double y, do MobRenderer::render(_mob, x, y, z, rot, a); } -void MushroomCowRenderer::additionalRendering(shared_ptr _mob, float a) +void MushroomCowRenderer::additionalRendering(shared_ptr _mob, float a) { // 4J - original version used generics and thus had an input parameter of type MushroomCow rather than shared_ptr we have here - // do some casting around instead shared_ptr mob = dynamic_pointer_cast(_mob); MobRenderer::additionalRendering(mob, a); if (mob->isBaby()) return; - bindTexture(TN_TERRAIN); // 4J was "/terrain.png" + bindTexture(&TextureAtlas::LOCATION_BLOCKS); // 4J was "/terrain.png" glEnable(GL_CULL_FACE); glPushMatrix(); glScalef(1, -1, 1); glTranslatef(0.2f, 0.4f, 0.5f); glRotatef(42, 0, 1, 0); - tileRenderer->renderTile(Tile::mushroom2, 0, 1); + tileRenderer->renderTile(Tile::mushroom_red, 0, 1); glTranslatef(0.1f, 0, -0.6f); glRotatef(42, 0, 1, 0); - tileRenderer->renderTile(Tile::mushroom2, 0, 1); + tileRenderer->renderTile(Tile::mushroom_red, 0, 1); glPopMatrix(); glPushMatrix(); @@ -43,8 +46,13 @@ void MushroomCowRenderer::additionalRendering(shared_ptr _mob, float a) glScalef(1, -1, 1); glTranslatef(0, 0.75f, -0.2f); glRotatef(12, 0, 1, 0); - tileRenderer->renderTile(Tile::mushroom2, 0, 1); + tileRenderer->renderTile(Tile::mushroom_red, 0, 1); glPopMatrix(); glDisable(GL_CULL_FACE); +} + +ResourceLocation *MushroomCowRenderer::getTextureLocation(shared_ptr mob) +{ + return &MOOSHROOM_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/MushroomCowRenderer.h b/Minecraft.Client/MushroomCowRenderer.h index c5f6f3c4..69dc1dd7 100644 --- a/Minecraft.Client/MushroomCowRenderer.h +++ b/Minecraft.Client/MushroomCowRenderer.h @@ -1,14 +1,17 @@ #pragma once - #include "MobRenderer.h" class MushroomCowRenderer : public MobRenderer { +private: + static ResourceLocation MOOSHROOM_LOCATION; + public: MushroomCowRenderer(Model *model, float shadow); virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); protected: - virtual void additionalRendering(shared_ptr _mob, float a); + virtual void additionalRendering(shared_ptr _mob, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/OcelotModel.cpp b/Minecraft.Client/OcelotModel.cpp new file mode 100644 index 00000000..8e845597 --- /dev/null +++ b/Minecraft.Client/OcelotModel.cpp @@ -0,0 +1,248 @@ +#include "stdafx.h" +#include "ModelPart.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "..\Minecraft.World\Mth.h" +#include "OcelotModel.h" + +const float OcelotModel::xo = 0; +const float OcelotModel::yo = 16; +const float OcelotModel::zo = -9; + +const float OcelotModel::headWalkY = -1 + yo; +const float OcelotModel::headWalkZ = 0 + zo; +const float OcelotModel::bodyWalkY = -4 + yo; +const float OcelotModel::bodyWalkZ = -1 + zo; +const float OcelotModel::tail1WalkY = -1 + yo; +const float OcelotModel::tail1WalkZ = 17 + zo; +const float OcelotModel::tail2WalkY = 4 + yo; +const float OcelotModel::tail2WalkZ = 23 + zo; +const float OcelotModel::backLegY = 2.f + yo; +const float OcelotModel::backLegZ = 14 + zo; +const float OcelotModel::frontLegY = -2.2f + yo; +const float OcelotModel::frontLegZ = 4.f + zo; + +OcelotModel::OcelotModel() +{ + state = WALK_STATE; + + setMapTex(L"head.main", 0, 0); + setMapTex(L"head.nose", 0, 24); + setMapTex(L"head.ear1", 0, 10); + setMapTex(L"head.ear2", 6, 10); + + head = new ModelPart(this, L"head"); + head->addBox(L"main", -2.5f, -2, -3, 5, 4, 5); + head->addBox(L"nose", -1.5f, 0, -4, 3, 2, 2); + head->addBox(L"ear1", -2, -3, 0, 1, 1, 2); + head->addBox(L"ear2", 1, -3, 0, 1, 1, 2); + head->setPos(0 + xo, headWalkY, headWalkZ); + + body = new ModelPart(this, 20, 0); + body->addBox(-2, 3, -8, 4, 16, 6, 0); + body->setPos(0 + xo, bodyWalkY, bodyWalkZ); + + tail1 = new ModelPart(this, 0, 15); + tail1->addBox(-0.5f, 0, 0, 1, 8, 1); + tail1->xRot = 0.9f; + tail1->setPos(0 + xo, tail1WalkY, tail1WalkZ); + + tail2 = new ModelPart(this, 4, 15); + tail2->addBox(-0.5f, 0, 0, 1, 8, 1); + tail2->setPos(0 + xo, tail2WalkY, tail2WalkZ); + + backLegL = new ModelPart(this, 8, 13); + backLegL->addBox(-1, 0, 1, 2, 6, 2); + backLegL->setPos(1.1f + xo, backLegY, backLegZ); + + backLegR = new ModelPart(this, 8, 13); + backLegR->addBox(-1, 0, 1, 2, 6, 2); + backLegR->setPos(-1.1f + xo, backLegY, backLegZ); + + frontLegL = new ModelPart(this, 40, 0); + frontLegL->addBox(-1, 0, 0, 2, 10, 2); + frontLegL->setPos(1.2f + xo, frontLegY, frontLegZ); + + frontLegR = new ModelPart(this, 40, 0); + frontLegR->addBox(-1, 0, 0, 2, 10, 2); + frontLegR->setPos(-1.2f + xo, frontLegY, frontLegZ); + + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + head->compile(1.0f/16.0f); + body->compile(1.0f/16.0f); + tail1->compile(1.0f/16.0f); + tail2->compile(1.0f/16.0f); + backLegL->compile(1.0f/16.0f); + backLegR->compile(1.0f/16.0f); + backLegL->compile(1.0f/16.0f); + backLegR->compile(1.0f/16.0f); +} + +void OcelotModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + setupAnim(time, r, bob, yRot, xRot, scale, entity); + if (young) + { + float ss = 2.0f; + glPushMatrix(); + glScalef(1.5f / ss, 1.5f / ss, 1.5f / ss); + glTranslatef(0, 10 * scale, 4 * scale); + head->render(scale, usecompiled); + glPopMatrix(); + glPushMatrix(); + glScalef(1 / ss, 1 / ss, 1 / ss); + glTranslatef(0, 24 * scale, 0); + body->render(scale, usecompiled); + backLegL->render(scale, usecompiled); + backLegR->render(scale, usecompiled); + frontLegL->render(scale, usecompiled); + frontLegR->render(scale, usecompiled); + tail1->render(scale, usecompiled); + tail2->render(scale, usecompiled); + glPopMatrix(); + } + else + { + head->render(scale, usecompiled); + body->render(scale, usecompiled); + tail1->render(scale, usecompiled); + tail2->render(scale, usecompiled); + backLegL->render(scale, usecompiled); + backLegR->render(scale, usecompiled); + frontLegL->render(scale, usecompiled); + frontLegR->render(scale, usecompiled); + } +} + +void OcelotModel::render(OcelotModel *model, float scale, bool usecompiled) +{ + head->yRot = model->head->yRot; + head->xRot = model->head->xRot; + head->y = model->head->y; + head->x = model->head->x; + body->yRot = model->body->yRot; + body->xRot = model->body->xRot; + + tail1->yRot = model->body->yRot; + tail1->y = model->body->y; + tail1->x = model->body->x; + tail1->render(scale, usecompiled); + + tail2->yRot = model->body->yRot; + tail2->y = model->body->y; + tail2->x = model->body->x; + tail2->render(scale, usecompiled); + + backLegL->xRot = model->backLegL->xRot; + backLegR->xRot = model->backLegR->xRot; + backLegL->render(scale, usecompiled); + backLegR->render(scale, usecompiled); + + frontLegL->xRot = model->frontLegL->xRot; + frontLegR->xRot = model->frontLegR->xRot; + frontLegL->render(scale, usecompiled); + frontLegR->render(scale, usecompiled); + + head->render(scale, usecompiled); + body->render(scale, usecompiled); +} + +void OcelotModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) +{ + head->xRot = xRot / (float) (180 / PI); + head->yRot = yRot / (float) (180 / PI); + + if (state == SITTING_STATE) + { + + } + else + { + body->xRot = 90 / (float) (180 / PI); + if (state == SPRINT_STATE) + { + backLegL->xRot = ((float) Mth::cos(time * 0.6662f) * 1.f) * r; + backLegR->xRot = ((float) Mth::cos(time * 0.6662f + 0.3f) * 1.f) * r; + frontLegL->xRot = ((float) Mth::cos(time * 0.6662f + PI + 0.3f) * 1.f) * r; + frontLegR->xRot = ((float) Mth::cos(time * 0.6662f + PI) * 1.f) * r; + tail2->xRot = 0.55f * PI + 0.1f * PI * Mth::cos(time) * r; + } + else + { + backLegL->xRot = ((float) Mth::cos(time * 0.6662f) * 1.f) * r; + backLegR->xRot = ((float) Mth::cos(time * 0.6662f + PI) * 1.f) * r; + frontLegL->xRot = ((float) Mth::cos(time * 0.6662f + PI) * 1.f) * r; + frontLegR->xRot = ((float) Mth::cos(time * 0.6662f) * 1.f) * r; + + if (state == WALK_STATE) tail2->xRot = 0.55f * PI + 0.25f * PI * Mth::cos(time) * r; + else tail2->xRot = 0.55f * PI + 0.15f * PI * Mth::cos(time) * r; + } + } +} + +void OcelotModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +{ + shared_ptr ozelot = dynamic_pointer_cast(mob); + + body->y = bodyWalkY; + body->z = bodyWalkZ; + head->y = headWalkY; + head->z = headWalkZ; + tail1->y = tail1WalkY; + tail1->z = tail1WalkZ; + tail2->y = tail2WalkY; + tail2->z = tail2WalkZ; + frontLegL->y = frontLegR->y = frontLegY; + frontLegL->z = frontLegR->z = frontLegZ; + backLegL->y = backLegR->y = backLegY; + backLegL->z = backLegR->z = backLegZ; + tail1->xRot = 0.9f; + + if (ozelot->isSneaking()) + { + body->y += 1; + head->y += 2; + tail1->y += 1; + tail2->y += -4; + tail2->z += 2; + tail1->xRot = 0.5f * PI; + tail2->xRot = 0.5f * PI; + state = SNEAK_STATE; + } + else if (ozelot->isSprinting()) + { + tail2->y = tail1->y; + tail2->z += 2; + tail1->xRot = 0.5f * PI; + tail2->xRot = 0.5f * PI; + state = SPRINT_STATE; + } + else if (ozelot->isSitting()) + { + body->xRot = 45 / (float) (180 / PI); + body->y += -4; + body->z += 5; + head->y += -3.3f; + head->z += 1; + + tail1->y += 8; + tail1->z += -2; + tail2->y += 2; + tail2->z += -0.8f; + tail1->xRot = PI * 0.55f; + tail2->xRot = PI * 0.85f; + + frontLegL->xRot = frontLegR->xRot = -PI * 0.05f; + frontLegL->y = frontLegR->y = frontLegY + 2; + frontLegL->z = frontLegR->z = -7; + + backLegL->xRot = backLegR->xRot = -PI * 0.5f; + backLegL->y = backLegR->y = backLegY + 3; + backLegL->z = backLegR->z = backLegZ - 4; + state = SITTING_STATE; + } + else + { + state = WALK_STATE; + } +} \ No newline at end of file diff --git a/Minecraft.Client/OcelotModel.h b/Minecraft.Client/OcelotModel.h new file mode 100644 index 00000000..6e984f12 --- /dev/null +++ b/Minecraft.Client/OcelotModel.h @@ -0,0 +1,43 @@ +#pragma once + +#include "Model.h" + +class OcelotModel : public Model +{ +private: + ModelPart *backLegL, *backLegR; + ModelPart *frontLegL, *frontLegR; + ModelPart *tail1, *tail2, *head, *body; + + static const int SNEAK_STATE = 0; + static const int WALK_STATE = 1; + static const int SPRINT_STATE = 2; + static const int SITTING_STATE = 3; + + int state; + + static const float xo; + static const float yo; + static const float zo; + + static const float headWalkY; + static const float headWalkZ; + static const float bodyWalkY; + static const float bodyWalkZ; + static const float tail1WalkY; + static const float tail1WalkZ; + static const float tail2WalkY; + static const float tail2WalkZ; + static const float backLegY; + static const float backLegZ; + static const float frontLegY; + static const float frontLegZ ; + +public: + OcelotModel(); + + void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + void render(OcelotModel *model, float scale, bool usecompiled); + void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); + void prepareMobModel(shared_ptr mob, float time, float r, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/OcelotRenderer.cpp b/Minecraft.Client/OcelotRenderer.cpp new file mode 100644 index 00000000..3672714b --- /dev/null +++ b/Minecraft.Client/OcelotRenderer.cpp @@ -0,0 +1,43 @@ +#include "stdafx.h" +#include "OcelotRenderer.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" + +ResourceLocation OcelotRenderer::CAT_BLACK_LOCATION = ResourceLocation(TN_MOB_CAT_BLACK); +ResourceLocation OcelotRenderer::CAT_OCELOT_LOCATION = ResourceLocation(TN_MOB_OCELOT); +ResourceLocation OcelotRenderer::CAT_RED_LOCATION = ResourceLocation(TN_MOB_CAT_RED); +ResourceLocation OcelotRenderer::CAT_SIAMESE_LOCATION = ResourceLocation(TN_MOB_CAT_SIAMESE); + +OcelotRenderer::OcelotRenderer(Model *model, float shadow) : MobRenderer(model, shadow) +{ +} + +void OcelotRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + MobRenderer::render(_mob, x, y, z, rot, a); +} + +ResourceLocation *OcelotRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr cat = dynamic_pointer_cast(entity); + + switch (cat->getCatType()) + { + default: + case Ocelot::TYPE_OCELOT: return &CAT_OCELOT_LOCATION; + case Ocelot::TYPE_BLACK: return &CAT_BLACK_LOCATION; + case Ocelot::TYPE_RED: return &CAT_RED_LOCATION; + case Ocelot::TYPE_SIAMESE: return &CAT_SIAMESE_LOCATION; + } +} + +void OcelotRenderer::scale(shared_ptr _mob, float a) +{ + // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - + // do some casting around instead + shared_ptr mob = dynamic_pointer_cast(_mob); + MobRenderer::scale(mob, a); + if (mob->isTame()) + { + glScalef(.8f, .8f, .8f); + } +} \ No newline at end of file diff --git a/Minecraft.Client/OcelotRenderer.h b/Minecraft.Client/OcelotRenderer.h new file mode 100644 index 00000000..b059a799 --- /dev/null +++ b/Minecraft.Client/OcelotRenderer.h @@ -0,0 +1,19 @@ +#pragma once +#include "MobRenderer.h" + +class OcelotRenderer : public MobRenderer +{ +private: + static ResourceLocation CAT_BLACK_LOCATION; + static ResourceLocation CAT_OCELOT_LOCATION; + static ResourceLocation CAT_RED_LOCATION; + static ResourceLocation CAT_SIAMESE_LOCATION; + +public: + OcelotRenderer(Model *model, float shadow); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + +protected: + virtual ResourceLocation *getTextureLocation(shared_ptr entity); + virtual void scale(shared_ptr _mob, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/PSVita/4JLibs/inc/4J_Profile.h b/Minecraft.Client/PSVita/4JLibs/inc/4J_Profile.h index 2fc9385a..ab6b6131 100644 --- a/Minecraft.Client/PSVita/4JLibs/inc/4J_Profile.h +++ b/Minecraft.Client/PSVita/4JLibs/inc/4J_Profile.h @@ -7,6 +7,76 @@ using namespace sce::Toolkit::NP; using namespace sce::Toolkit::NP::Utilities; +class CXuiStringTable; + +// Note - there are now 3 types of PlayerUID +// (1) A full online ID - either the primary login, or a sub-signin through to PSN. This has m_onlineID set up as a normal SceNpOnlineId, with dummy[0] set to 0 +// (2) An offline ID, where there is also a primary login on the system. This has m_onlineID set up to copy the primary SceNpOnlineId, except with dummy[0] set to the controller ID of this other player +// (3) An offline ID, where there isn't a primary PSN login on the system. This has SceNpOnlineId fully zeroed. + +class PlayerUID +{ + char m_onlineID[SCE_NP_ONLINEID_MAX_LENGTH]; + char term; + bool m_bSignedIntoPSN : 1; + unsigned char m_quadrant : 2; + uint8_t m_macAddress[SCE_NET_ETHER_ADDR_LEN]; + int m_userID; // user logged on to the XMB + +public: + + class Hash + { + public: + std::size_t operator()(const PlayerUID& k) const; + }; + + PlayerUID(); + PlayerUID(int userID, SceNpOnlineId& onlineID, bool bSignedInPSN, int quadrant); + PlayerUID(std::wstring fromString); + + bool operator==(const PlayerUID& rhs) const; + bool operator!=(const PlayerUID& rhs); + void setCurrentMacAddress(); + std::wstring macAddressStr() const; + std::wstring userIDStr() const; + std::wstring toString() const; + void setOnlineID(SceNpOnlineId& id, bool bSignedIntoPSN); + void setUserID(unsigned int id); + + + const char* getOnlineID() const { return m_onlineID; } + int getUserID() const { return m_userID; } + int getQuadrant() const { return m_quadrant; } + bool isPrimaryUser() const; // only true if we're on the local machine and signed into the first quadrant; + bool isSignedIntoPSN() const { return m_bSignedIntoPSN; } + void setForAdhoc(); +private: +}; + +typedef PlayerUID *PPlayerUID; + +class GameSessionUID +{ + char m_onlineID[SCE_NP_ONLINEID_MAX_LENGTH]; + char term; + bool m_bSignedIntoPSN : 1; + unsigned char m_quadrant : 2; +public: + GameSessionUID(); + GameSessionUID(int nullVal); + + bool operator==(const GameSessionUID& rhs) const; + bool operator!=(const GameSessionUID& rhs); + GameSessionUID& operator=(const PlayerUID& rhs); + + const char* getOnlineID() const { return m_onlineID; } + int getQuadrant() const { return m_quadrant; } + bool isSignedIntoPSN() const { return m_bSignedIntoPSN; } + void setForAdhoc(); + +}; + enum eAwardType { eAwardType_Achievement = 0, @@ -101,7 +171,7 @@ public: int GetPrimaryPad(); void SetPrimaryPad(int iPad); char* GetGamertag(int iPad); - wstring GetDisplayName(int iPad); + std::wstring GetDisplayName(int iPad); bool IsFullVersion(); void SetFullVersion(bool bFull); diff --git a/Minecraft.Client/PSVita/4JLibs/inc/4J_Render.h b/Minecraft.Client/PSVita/4JLibs/inc/4J_Render.h index 750d5fc9..b08c9fba 100644 --- a/Minecraft.Client/PSVita/4JLibs/inc/4J_Render.h +++ b/Minecraft.Client/PSVita/4JLibs/inc/4J_Render.h @@ -2,6 +2,8 @@ #include + + class ImageFileBuffer { public: @@ -57,7 +59,7 @@ public: void Set_matrixDirty(); // Core - void Initialise(ID3D11Device *pDevice, IDXGISwapChain *pSwapChain); + void Initialise(); void InitialiseContext(); void StartFrame(); void Present(); @@ -79,6 +81,8 @@ public: VERTEX_TYPE_COMPRESSED, // Compressed format - see comment at top of VS_PS3_TS2_CS1.hlsl for description of layout VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_LIT, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with lighting applied, VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1_TEXGEN, // as VERTEX_TYPE_PF3_TF2_CB4_NB4_XW1 with tex gen + VERTEX_TYPE_COMPRESSED_FOG_1, + VERTEX_TYPE_COMPRESSED_FOG_2, VERTEX_TYPE_COUNT } eVertexType; @@ -86,6 +90,9 @@ public: typedef enum { PIXEL_SHADER_TYPE_STANDARD, + PIXEL_SHADER_TYPE_STANDARD2, + PIXEL_SHADER_TYPE_STANDARD3, + PIXEL_SHADER_TYPE_STANDARD4, PIXEL_SHADER_TYPE_PROJECTION, PIXEL_SHADER_COUNT } ePixelShaderType; @@ -151,6 +158,7 @@ public: int TextureCreate(); void TextureFree(int idx); void TextureBind(int idx); + void TextureBind(int layer, int idx); void TextureBindVertex(int idx); void TextureSetTextureLevels(int levels); int TextureGetTextureLevels(); diff --git a/Minecraft.Client/PSVita/4JLibs/inc/4J_Storage.h b/Minecraft.Client/PSVita/4JLibs/inc/4J_Storage.h index ecd4dbc3..552c247d 100644 --- a/Minecraft.Client/PSVita/4JLibs/inc/4J_Storage.h +++ b/Minecraft.Client/PSVita/4JLibs/inc/4J_Storage.h @@ -381,7 +381,7 @@ public: void SetDLCProductCode(const char* szProductCode); void SetProductUpgradeKey(const char* szKey); bool CheckForTrialUpgradeKey(void( *Func)(LPVOID, bool),LPVOID lpParam); - void SetDLCInfoMap(unordered_map* pSONYDLCMap); + void SetDLCInfoMap(std::unordered_map* pSONYDLCMap); void EntitlementsCallback(bool bFoundEntitlements); }; diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Input.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Input.a index 6ddf0cec..3dbc0fc6 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Input.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Input.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Input_d.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Input_d.a index 6b27613f..141b00b9 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Input_d.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Input_d.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Input_r.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Input_r.a index 3e966c35..5844343a 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Input_r.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Input_r.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile.a index d4bbcca4..0913ae64 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_d.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_d.a index 251e7cff..b00f82c4 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_d.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_d.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_r.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_r.a index 1fa7a3e9..b1ad68f8 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_r.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Profile_r.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Render.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Render.a index 71989e4c..ae0c2e5e 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Render.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Render.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Render_d.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Render_d.a index 60f78685..2e7d1011 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Render_d.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Render_d.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Render_r.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Render_r.a index a9611c74..77d47b5b 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Render_r.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Render_r.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage.a index acbe48e0..9ba5bd68 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_d.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_d.a index 066596cd..35b9c683 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_d.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_d.a differ diff --git a/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_r.a b/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_r.a index ca6ead44..631943a9 100644 Binary files a/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_r.a and b/Minecraft.Client/PSVita/4JLibs/libs/4J_Storage_r.a differ diff --git a/Minecraft.Client/PSVita/GameConfig/Minecraft.spa.h b/Minecraft.Client/PSVita/GameConfig/Minecraft.spa.h index e8234ff5..9bf94461 100644 --- a/Minecraft.Client/PSVita/GameConfig/Minecraft.spa.h +++ b/Minecraft.Client/PSVita/GameConfig/Minecraft.spa.h @@ -51,6 +51,7 @@ extern "C" { #define CONTEXT_GAME_STATE_BREWING 11 #define CONTEXT_GAME_STATE_ANVIL 12 #define CONTEXT_GAME_STATE_TRADING 13 +#define CONTEXT_GAME_STATE_HORSE 14 // Values for X_CONTEXT_PRESENCE diff --git a/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.cpp b/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.cpp index 981d1f40..958999e4 100644 --- a/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.cpp +++ b/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.cpp @@ -2,11 +2,10 @@ #include "PSVitaLeaderboardManager.h" -#include "base64.h" - -#include "..\PSVita_App.h" -#include "..\..\Common\Consoles_App.h" +#include "PSVita\PSVita_App.h" +#include "PSVita\PSVitaExtras\ShutdownManager.h" +#include "Common\Consoles_App.h" #include "Common\Network\Sony\SQRNetworkManager.h" #include "..\..\..\Minecraft.World\StringHelpers.h" @@ -15,1056 +14,51 @@ #include -#include "PSVita\PSVitaExtras\ShutdownManager.h" - - LeaderboardManager *LeaderboardManager::m_instance = new PSVitaLeaderboardManager(); //Singleton instance of the LeaderboardManager -PSVitaLeaderboardManager::PSVitaLeaderboardManager() -{ - m_eStatsState = eStatsState_Idle; - - m_titleContext = -1; - - m_myXUID = INVALID_XUID; +PSVitaLeaderboardManager::PSVitaLeaderboardManager() : SonyLeaderboardManager() {} - m_scores = NULL; //m_stats = NULL; - - m_statsType = eStatsType_Kills; - m_difficulty = 0; - - m_requestId = 0; - - m_openSessions = 0; - - InitializeCriticalSection(&m_csViewsLock); - - m_running = false; - m_threadScoreboard = NULL; -} - -PSVitaLeaderboardManager::~PSVitaLeaderboardManager() +HRESULT PSVitaLeaderboardManager::initialiseScoreUtility() { - m_running = false; - - // 4J-JEV: Wait for thread to stop and hope it doesn't take too long. - long long startShutdown = System::currentTimeMillis(); - while (m_threadScoreboard->isRunning()) - { - Sleep(1); - assert( (System::currentTimeMillis() - startShutdown) < 16 ); - } - - delete m_threadScoreboard; - - DeleteCriticalSection(&m_csViewsLock); + return sceNpScoreInit( SCE_KERNEL_DEFAULT_PRIORITY_USER, SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT, NULL); } -int PSVitaLeaderboardManager::scoreboardThreadEntry(LPVOID lpParam) -{ - ShutdownManager::HasStarted(ShutdownManager::eLeaderboardThread); - PSVitaLeaderboardManager *self = reinterpret_cast(lpParam); - - self->m_running = true; - app.DebugPrintf("[LeaderboardManager] Thread started.\n"); - - bool needsWriting = false; - do - { - if (self->m_openSessions > 0 || needsWriting) - { - self->scoreboardThreadInternal(); - } - - EnterCriticalSection(&self->m_csViewsLock); - needsWriting = self->m_views.size() > 0; - LeaveCriticalSection(&self->m_csViewsLock); - - // 4J Stu - We can't write while we aren't signed in to live - if (!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) - { - needsWriting = false; - } - - if ( (!needsWriting) && (self->m_eStatsState != eStatsState_Getting) ) - { - Sleep(50); // 4J-JEV: When we're not reading or writing. - } - - } while ( (self->m_running || self->m_eStatsState == eStatsState_Getting || needsWriting) - && ShutdownManager::ShouldRun(ShutdownManager::eLeaderboardThread) - ); - - // 4J-JEV, moved this here so setScore can finish up. - sceNpScoreDestroyTitleCtx(self->m_titleContext); - // TODO sceNpScoreTerm(); - app.DebugPrintf("[LeaderboardManager] Thread closed.\n"); - ShutdownManager::HasFinished(ShutdownManager::eLeaderboardThread); - return 0; +bool PSVitaLeaderboardManager::scoreUtilityAlreadyInitialised(HRESULT hr) +{ + return hr == SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED; } -void PSVitaLeaderboardManager::scoreboardThreadInternal() -{ - // 4J-JEV: Just initialise the context the once now. - if (m_titleContext == -1) - { - int primaryPad = ProfileManager.GetPrimaryPad(); - if (!ProfileManager.IsSignedInLive(primaryPad)) return; - - //CD - Init NP Score - int ret = sceNpScoreInit( SCE_KERNEL_DEFAULT_PRIORITY_USER, SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT, NULL); - if ( ret < 0 ) - { - if ( ret != SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED ) - { - app.DebugPrintf("[LeaderboardManager] sceNpScoreInit() failed. ret = 0x%x\n", ret); - return; - } - else - { - app.DebugPrintf("[LeaderboardManager] sceNpScoreInit() already initialised, (0x%x)\n", ret); - } - } - - SceNpId npId; - ProfileManager.GetSceNpId(primaryPad,&npId); - - ret = sceNpScoreCreateTitleCtx( &s_npCommunicationId, &s_npCommunicationPassphrase, &npId ); - - if (ret < 0) return; - else m_titleContext = ret; - } - else assert( m_titleContext > 0 ); //Paranoia - - - switch (m_eStatsState) - { - case eStatsState_Getting: - switch(m_eFilterMode) - { - case eFM_MyScore: - case eFM_Friends: - getScoreByIds(); - break; - case eFM_TopRank: - getScoreByRange(); - break; - } - break; - - case eStatsState_Canceled: - case eStatsState_Failed: - case eStatsState_Ready: - case eStatsState_Idle: - - // 4J-JEV: Moved this here, I don't want reading and - // writing going on at the same time. - // -- - // 4J-JEV: Writing no longer changes the manager state, - // we'll manage the write queue seperately. - - EnterCriticalSection(&m_csViewsLock); - bool hasWork = !m_views.empty(); - LeaveCriticalSection(&m_csViewsLock); - - if (hasWork) - { - setScore(); - } - - break; - } +HRESULT PSVitaLeaderboardManager::createTitleContext(const SceNpId &npId) +{ + return sceNpScoreCreateTitleCtx(&s_npCommunicationId, &s_npCommunicationPassphrase, &npId); } -bool PSVitaLeaderboardManager::getScoreByIds() +HRESULT PSVitaLeaderboardManager::destroyTitleContext(int titleContext) { - if (m_eStatsState == eStatsState_Canceled) return false; - - // ---------------------------- - SceRtcTick last_sort_date; - SceNpScoreRankNumber mTotalRecord; - - SceNpId *npIds = NULL; - - - int ret; - uint32_t num = 0; - - SceNpScorePlayerRankData *ptr; - SceNpScoreComment *comments; - // ---------------------------- - - // Check for invalid LManager state. - assert( m_eFilterMode == eFM_Friends - || m_eFilterMode == eFM_MyScore); - - SceNpId myNpId; - // 4J-PB - should it be user 0? - if(!ProfileManager.IsSignedInLive(0)) - { - app.DebugPrintf("[LeaderboardManager] OpenSession() fail: User isn't signed in to PSN\n"); - return false; - } - ProfileManager.GetSceNpId(0,&myNpId); - - // Get queried users. - if (m_eFilterMode == eFM_Friends) - { - //CD - Altered for Vita - //4J-JEV - Merged in my changes to Orbis. - sce::Toolkit::NP::Utilities::Future s_friendList; - int ret = sce::Toolkit::NP::Friends::Interface::getFriendslist(&s_friendList, false); - - if(ret != SCE_TOOLKIT_NP_SUCCESS) - { - // Error handling - if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; - app.DebugPrintf("[LeaderboardManager] getFriendslist fail\n"); - return false; - } - else if (s_friendList.hasResult()) - { - // 4J-JEV: Friends list doesn't include player, leave space for them. - num = s_friendList.get()->size() + 1; - - npIds = new SceNpId[num]; - - int i = 0; - - sce::Toolkit::NP::FriendsList::const_iterator itr; - for (itr = s_friendList.get()->begin(); itr != s_friendList.get()->end(); itr++) - { - npIds[i] = itr->npid; - i++; - } - - npIds[num-1] = myNpId; // 4J-JEV: Append player to end of query. - } - else - { - // 4J-JEV: Something terrible must have happend, - // 'getFriendslist' was supposed to be a synchronous operation. - __debugbreak(); - - // 4J-JEV: We can at least fall-back to just the players score. - num = 1; - npIds = new SceNpId[1]; - npIds[0] = myNpId; - } - } - else if (m_eFilterMode == eFM_MyScore) - { - num = 1; - npIds = new SceNpId[1]; - npIds[0] = myNpId; - } - - ret = sceNpScoreCreateRequest(m_titleContext); - if (m_eStatsState == eStatsState_Canceled) - { - // Cancel operation has been called, abort. - app.DebugPrintf("[LeaderboardManager]\tgetScoreByIds() - m_eStatsState == eStatsState_Canceled.\n"); - - sceNpScoreDeleteRequest(ret); - - if (npIds != NULL) delete [] npIds; - return false; - } - else if (ret < 0) - { - // Error occurred creating a transacion, abort. - app.DebugPrintf("[LeaderboardManager]\tgetScoreByIds() - createTransaction failed, ret=0x%X\n", ret); - - m_eStatsState = eStatsState_Failed; - - if (npIds != NULL) delete [] npIds; - return false; - } - else - { - // Transaction created successfully, continue. - m_requestId = ret; - app.DebugPrintf("[LeaderboardManager] REQUEST ID A = 0x%X\n",m_requestId ); - } - - ptr = new SceNpScorePlayerRankData[num]; - comments = new SceNpScoreComment[num]; - - /* app.DebugPrintf("sceNpScoreGetRankingByNpId(\n\t transaction=%i,\n\t boardID=0,\n\t npId=%i,\n\t friendCount*sizeof(SceNpId)=%i*%i=%i,\ - rankData=%i,\n\t friendCount*sizeof(SceNpScorePlayerRankData)=%i,\n\t NULL, 0, NULL, 0,\n\t friendCount=%i,\n...\n", - transaction, npId, friendCount, sizeof(SceNpId), friendCount*sizeof(SceNpId), - rankData, friendCount*sizeof(SceNpScorePlayerRankData), friendCount - ); */ - - int boardId = getBoardId(m_difficulty, m_statsType); - ret = sceNpScoreGetRankingByNpId( - m_requestId, - boardId, // BoardId - - npIds, sizeof(SceNpId) * num, //IN: Player IDs - ptr, sizeof(SceNpScorePlayerRankData) * num, //OUT: Rank Data - - comments, sizeof(SceNpScoreComment) * num, //OUT: Comments - - NULL, 0, // GameData. (unused) - - num, - - &last_sort_date, - &mTotalRecord, - - NULL // Reserved, specify null. - ); - - if (ret == SCE_NP_COMMUNITY_ERROR_ABORTED) - { - app.DebugPrintf("[LeaderboardManager] getScoreByIds(): 'sceNpScoreGetRankingByRange' aborted (0x%X).\n", ret); - - ret = sceNpScoreDeleteRequest(m_requestId); - m_requestId = 0; - - delete [] ptr; - delete [] comments; - delete [] npIds; - - return false; - } - else if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND) - { - app.DebugPrintf("[LeaderboardManager] getScoreByIds(): Game ranking not found.\n"); - - ret = sceNpScoreDeleteRequest(m_requestId); - m_requestId = 0; - - delete [] ptr; - delete [] comments; - delete [] npIds; - - m_scores = NULL; - m_readCount = 0; - m_maxRank = num; - - m_eStatsState = eStatsState_Ready; - return false; - } - else if (ret<0) goto error3; - - // Return. - sceNpScoreDeleteRequest(m_requestId); - m_requestId = 0; - - m_readCount = num; - - // Filter scorers and construct output structure. - if (m_scores != NULL) delete [] m_scores; - m_scores = new ReadScore[m_readCount]; - convertToOutput(m_readCount, m_scores, ptr, comments); - m_maxRank = m_readCount; - - app.DebugPrintf( - "[LeaderboardManager] getScoreByIds(), Success!\n" - "\t Board %i\n" - "\t %i of %i results have an entry\n" - "1stScore=%i\n", - boardId, - m_readCount, num, - ptr->rankData.scoreValue - ); - - // Sort scores - std::sort(m_scores, m_scores + m_readCount, SortByRank); - - delete [] ptr; - delete [] comments; - delete [] npIds; - - m_eStatsState = eStatsState_Ready; - return true; - - // Error. -error3: - if (ret!=SCE_NP_COMMUNITY_ERROR_ABORTED) //0x8002a109 - sceNpScoreDeleteRequest(m_requestId); - m_requestId = 0; - delete [] ptr; - delete [] comments; -error2: - if (npIds != NULL) delete [] npIds; -error1: - if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; - app.DebugPrintf("[LeaderboardManger] getScoreByIds() FAILED, ret=0x%X\n", ret); - return false; + return sceNpScoreDestroyTitleCtx(titleContext); } -bool PSVitaLeaderboardManager::getScoreByRange() +HRESULT PSVitaLeaderboardManager::createTransactionContext(int titleContext) { - SceRtcTick last_sort_date; - SceNpScoreRankNumber mTotalRecord; - - unsigned int num = m_readCount; - SceNpScoreRankData *ptr; - SceNpScoreComment *comments; - - assert(m_eFilterMode == eFM_TopRank); - - int ret = sceNpScoreCreateRequest(m_titleContext); - if (m_eStatsState == eStatsState_Canceled) - { - // Cancel operation has been called, abort. - app.DebugPrintf("[LeaderboardManager]\tgetScoreByRange() - m_eStatsState == eStatsState_Canceled.\n"); - sceNpScoreDeleteRequest(ret); - return false; - } - else if (ret < 0) - { - // Error occurred creating a transacion, abort. - m_eStatsState = eStatsState_Failed; - app.DebugPrintf("[LeaderboardManager]\tgetScoreByRange() - createTransaction failed, ret=0x%X\n", ret); - return false; - } - else - { - // Transaction created successfully, continue. - m_requestId = ret; - app.DebugPrintf("[LeaderboardManager] REQUEST ID B = 0x%X\n",m_requestId ); - } - - ptr = new SceNpScoreRankData[num]; - comments = new SceNpScoreComment[num]; - - int boardId = getBoardId(m_difficulty, m_statsType); - ret = sceNpScoreGetRankingByRange( - m_requestId, - boardId, // BoardId - - m_startIndex, - - ptr, sizeof(SceNpScoreRankData) * num, //OUT: Rank Data - - comments, sizeof(SceNpScoreComment) * num, //OUT: Comment Data - - NULL, 0, // GameData. - - num, - - &last_sort_date, - &m_maxRank, // 'Total number of players registered in the target scoreboard.' - - NULL // Reserved, specify null. - ); - - if (ret == SCE_NP_COMMUNITY_ERROR_ABORTED) - { - app.DebugPrintf("[LeaderboardManager] getScoreByRange(): 'sceNpScoreGetRankingByRange' aborted (0x%X).\n", ret); - - ret = sceNpScoreDeleteRequest(m_requestId); - m_requestId = 0; - - delete [] ptr; - delete [] comments; - - return false; - } - else if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND) - { - app.DebugPrintf("[LeaderboardManager] getScoreByRange(): Game ranking not found."); - - ret = sceNpScoreDeleteRequest(m_requestId); - m_requestId = 0; - - delete [] ptr; - delete [] comments; - - m_scores = NULL; - m_readCount = 0; - - m_eStatsState = eStatsState_Ready; - return false; - } - else if (ret<0) goto error2; - else - { - app.DebugPrintf("[LeaderboardManager] getScoreByRange(), success, 1stScore=%i.\n", ptr->scoreValue); - } - - // Return. - sceNpScoreDeleteRequest(m_requestId); - m_requestId = 0; - - //m_stats = ptr; //Maybe: addPadding(num,ptr); - - if (m_scores != NULL) delete [] m_scores; - m_readCount = ret; - m_scores = new ReadScore[m_readCount]; - for (int i=0; i 0) - ret = eStatsReturn_Success; - - if (m_readListener != NULL) - { - app.DebugPrintf("[LeaderboardManager] OnStatsReadComplete(%i, %i, _), m_readCount=%i.\n", ret, m_maxRank, m_readCount); - m_readListener->OnStatsReadComplete(ret, m_maxRank, view); - } - - m_eStatsState = eStatsState_Idle; - - delete [] m_scores; - m_scores = NULL; - } - break; - - case eStatsState_Failed: - { - view.m_numQueries = 0; - view.m_queries = NULL; - - if ( m_readListener != NULL ) - m_readListener->OnStatsReadComplete(eStatsReturn_NetworkError, 0, view); - - m_eStatsState = eStatsState_Idle; - } - break; - - case eStatsState_Canceled: - { - m_eStatsState = eStatsState_Idle; - } - break; - - default: // Getting or Idle. - break; - } -} - -bool PSVitaLeaderboardManager::OpenSession() -{ - if (m_openSessions == 0) - { - if (m_threadScoreboard == NULL) - { - m_threadScoreboard = new C4JThread(&scoreboardThreadEntry, this, "4JScoreboard"); - m_threadScoreboard->SetProcessor(CPU_CORE_LEADERBOARDS); - m_threadScoreboard->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); - m_threadScoreboard->Run(); - } - - app.DebugPrintf("[LeaderboardManager] OpenSession(): Starting sceNpScore utility.\n"); - } - else - { - app.DebugPrintf("[LeaderboardManager] OpenSession(): Another session opened, total=%i\n", m_openSessions+1); - } - - m_openSessions++; - return true; -} - -void PSVitaLeaderboardManager::CloseSession() -{ - m_openSessions--; - - if (m_openSessions == 0) app.DebugPrintf("[LeaderboardManager] CloseSession(): Quitting sceNpScore utility.\n"); - else app.DebugPrintf("[LeaderboardManager] CloseSession(): %i sessions still open.\n", m_openSessions); -} - -void PSVitaLeaderboardManager::DeleteSession() {} - -bool PSVitaLeaderboardManager::WriteStats(unsigned int viewCount, ViewIn views) -{ - // Need to cancel read/write operation first. - //if (m_eStatsState != eStatsState_Idle) return false; - - // Write relevant parameters. - //RegisterScore *regScore = reinterpret_cast(views); - - EnterCriticalSection(&m_csViewsLock); - for (int i=0; iutf8Comment; - - for (int i = 0; i < SCE_NP_SCORE_COMMENT_MAXLEN; i++) - { - int sByte = (i*5) / 8; - int eByte = (5+(i*5)) / 8; - int dIndex = (i*5) % 8; - - unsigned char fivebits = 0; - - fivebits = *(bytes+sByte) << dIndex; - - if (eByte != sByte) - fivebits = fivebits | *(bytes+eByte) >> (8-dIndex); - - fivebits = (fivebits>>3) & 0x1F; - - if (fivebits < 10) // 0 - 9 - chars[i] = '0' + fivebits; - else if (fivebits < 32) // A - V - chars[i] = 'A' + (fivebits-10); - else - assert(false); - } - - toSymbols(out->utf8Comment); + return sceNpScoreAbortRequest(transactionContext); } -void PSVitaLeaderboardManager::fromBase32(void *out, SceNpScoreComment *in) +HRESULT PSVitaLeaderboardManager::destroyTransactionContext(int transactionContext) { - PBYTE bytes = (PBYTE) out; - ZeroMemory(bytes, RECORD_SIZE); - - fromSymbols(in->utf8Comment); - - char ch[2] = { 0, 0 }; - for (int i = 0; i < SCE_NP_SCORE_COMMENT_MAXLEN; i++) - { - ch[0] = in->utf8Comment[i]; - unsigned char fivebits = strtol(ch, NULL, 32) << 3; - - int sByte = (i*5) / 8; - int eByte = (5+(i*5)) / 8; - int dIndex = (i*5) % 8; - - *(bytes + sByte) = *(bytes+sByte) | (fivebits >> dIndex); - - if (eByte != sByte) - *(bytes + eByte) = fivebits << (8-dIndex); - } + return sceNpScoreDeleteRequest(transactionContext); } -char symbBase32[32] = { - ' ', '!','\"', '#', '$', '%', '&','\'', '(', ')', - '*', '+', '`', '-', '.', '/', ':', ';', '<', '=', - '>', '?', '[','\\', ']', '^', '_', '{', '|', '}', - '~', '@' -}; - -char charBase32[32] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', - 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', - 'U', 'V' -}; - -void PSVitaLeaderboardManager::toSymbols(char *str) +HRESULT PSVitaLeaderboardManager::getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList) { - for (int i = 0; i < 63; i++) - { - for (int j=0; j < 32; j++) - { - if (str[i]==charBase32[j]) - str[i] =symbBase32[j]; - } - } -} - -void PSVitaLeaderboardManager::fromSymbols(char *str) -{ - for (int i = 0; i < 63; i++) - { - for (int j=0; j < 32; j++) - { - if (str[i]==symbBase32[j]) - str[i] =charBase32[j]; - } - } -} - -bool PSVitaLeaderboardManager::test_string(string testing) -{ -#ifndef _CONTENT_PACKAGE - static SceNpScoreComment comment; - ZeroMemory(&comment, sizeof(SceNpScoreComment)); - memcpy(&comment, testing.c_str(), SCE_NP_SCORE_COMMENT_MAXLEN); - - int ctx = sceNpScoreCreateRequest(m_titleContext); - if (ctx<0) return false; - - int ret = sceNpScoreCensorComment(ctx, (const char *) &comment, NULL); - - if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_CENSORED) - { - //app.DebugPrintf("\n[TEST_STRING]: REJECTED "); - } - else if (ret < 0) - { - sceNpScoreDeleteRequest(ctx); - return false; - } - else - { - //app.DebugPrintf("\n[TEST_STRING]: permitted "); - } - - //app.DebugPrintf("'%s'\n", comment.utf8Comment); - sceNpScoreDeleteRequest(ctx); - return true; -#else - return true; -#endif -} - -void PSVitaLeaderboardManager::initReadScoreStruct(ReadScore &out, SceNpScoreRankData &rankData) -{ - ZeroMemory(&out, sizeof(ReadScore)); - - // Init rank and onlineID - out.m_uid.setOnlineID( rankData.npId.handle, true ); - out.m_rank = rankData.rank; - - // Convert to wstring and copy name. - wstring wstrName = convStringToWstring( string(rankData.npId.handle.data) ).c_str(); - //memcpy(&out.m_name, wstrName.c_str(), XUSER_NAME_SIZE); - out.m_name=wstrName; -} - -void PSVitaLeaderboardManager::fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment) -{ - StatsData statsData; - fromBase32( (void *) &statsData, &comment ); - - switch (statsData.m_statsType) - { - case eStatsType_Farming: - out.m_statsSize = 6; - out.m_statsData[0] = statsData.m_farming.m_eggs; - out.m_statsData[1] = statsData.m_farming.m_wheat; - out.m_statsData[2] = statsData.m_farming.m_mushroom; - out.m_statsData[3] = statsData.m_farming.m_sugarcane; - out.m_statsData[4] = statsData.m_farming.m_milk; - out.m_statsData[5] = statsData.m_farming.m_pumpkin; - break; - case eStatsType_Mining: - out.m_statsSize = 7; - out.m_statsData[0] = statsData.m_mining.m_dirt; - out.m_statsData[1] = statsData.m_mining.m_cobblestone; - out.m_statsData[2] = statsData.m_mining.m_sand; - out.m_statsData[3] = statsData.m_mining.m_stone; - out.m_statsData[4] = statsData.m_mining.m_gravel; - out.m_statsData[5] = statsData.m_mining.m_clay; - out.m_statsData[6] = statsData.m_mining.m_obsidian; - break; - case eStatsType_Kills: - out.m_statsSize = 7; - out.m_statsData[0] = statsData.m_kills.m_zombie; - out.m_statsData[1] = statsData.m_kills.m_skeleton; - out.m_statsData[2] = statsData.m_kills.m_creeper; - out.m_statsData[3] = statsData.m_kills.m_spider; - out.m_statsData[4] = statsData.m_kills.m_spiderJockey; - out.m_statsData[5] = statsData.m_kills.m_zombiePigman; - out.m_statsData[6] = statsData.m_kills.m_slime; - break; - case eStatsType_Travelling: - out.m_statsSize = 4; - out.m_statsData[0] = statsData.m_travelling.m_walked; - out.m_statsData[1] = statsData.m_travelling.m_fallen; - out.m_statsData[2] = statsData.m_travelling.m_minecart; - out.m_statsData[3] = statsData.m_travelling.m_boat; - break; - } + return sce::Toolkit::NP::Friends::Interface::getFriendslist(&friendsList, false); } -bool PSVitaLeaderboardManager::SortByRank(const ReadScore &lhs, const ReadScore &rhs) +char *PSVitaLeaderboardManager::getComment(SceNpScoreComment *comment) { - return lhs.m_rank < rhs.m_rank; + return comment->utf8Comment; } \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.h b/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.h index 9038b277..8101aa31 100644 --- a/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.h +++ b/Minecraft.Client/PSVita/Leaderboards/PSVitaLeaderboardManager.h @@ -1,108 +1,34 @@ #pragma once +#include "Common\Leaderboards\SonyLeaderboardManager.h" #include "Common\Leaderboards\LeaderboardManager.h" + #include "Conf.h" -class PSVitaLeaderboardManager : public LeaderboardManager -{ -protected: - enum EStatsState - { - eStatsState_Idle, - eStatsState_Getting, - eStatsState_Failed, - eStatsState_Ready, - eStatsState_Canceled, - //eStatsState_Writing, - eStatsState_Max - }; +#include +class PSVitaLeaderboardManager : public SonyLeaderboardManager +{ public: PSVitaLeaderboardManager(); - virtual ~PSVitaLeaderboardManager(); - -private: - unsigned short m_openSessions; - - C4JThread *m_threadScoreboard; - bool m_running; - - int m_titleContext; - int32_t m_requestId; - - //SceNpId m_myNpId; - - static int scoreboardThreadEntry(LPVOID lpParam); - void scoreboardThreadInternal(); - - bool getScoreByIds(); - bool getScoreByRange(); - - bool setScore(); - queue m_views; - - CRITICAL_SECTION m_csViewsLock; - - EStatsState m_eStatsState; //State of the stats read - // EFilterMode m_eFilterMode; - - ReadScore *m_scores; - unsigned int m_maxRank; - //SceNpScoreRankData *m_stats; -public: - virtual void Tick();// {} - - //Open a session - virtual bool OpenSession();// { return true; } - - //Close a session - virtual void CloseSession();// {} - - //Delete a session - virtual void DeleteSession();// {} - - //Write the given stats - //This is called synchronously and will not free any memory allocated for views when it is done - - virtual bool WriteStats(unsigned int viewCount, ViewIn views);// { return false; } - - virtual bool ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount);// { return false; } - virtual bool ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount);// { return false; } - virtual bool ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount);// { return false; } - - //Perform a flush of the stats - virtual void FlushStats();// {} - - //Cancel the current operation - virtual void CancelOperation();// {} - - //Is the leaderboard manager idle. - virtual bool isIdle();// { return true; } - - -private: - int getBoardId(int difficulty, EStatsType); +protected: - //LeaderboardManager::ReadScore *filterJustScorers(unsigned int &num, LeaderboardManager::ReadScore *friendsData); + virtual HRESULT initialiseScoreUtility(); - SceNpScorePlayerRankData *addPadding(unsigned int num, SceNpScoreRankData *rankData); + virtual bool scoreUtilityAlreadyInitialised(HRESULT hr); - void convertToOutput(unsigned int &num, ReadScore *out, SceNpScorePlayerRankData *rankData, SceNpScoreComment *comm); + virtual HRESULT createTitleContext(const SceNpId &npId); - void toBinary(void *out, SceNpScoreComment *in); - void fromBinary(SceNpScoreComment **out, void *in); + virtual HRESULT destroyTitleContext(int titleContext); - void toBase32(SceNpScoreComment *out, void *in); - void fromBase32(void *out, SceNpScoreComment *in); + virtual HRESULT createTransactionContext(int titleContext); - void toSymbols(char *); - void fromSymbols(char *); + virtual HRESULT abortTransactionContext(int transactionContext); - bool test_string(string); + virtual HRESULT destroyTransactionContext(int transactionContext); - void initReadScoreStruct(ReadScore &out, SceNpScoreRankData &); - void fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment); + virtual HRESULT getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList); - static bool SortByRank(const ReadScore &lhs, const ReadScore &rhs); + virtual char * getComment(SceNpScoreComment *comment); }; diff --git a/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.cpp b/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.cpp index fb859761..1c5c45e3 100644 --- a/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.cpp +++ b/Minecraft.Client/PSVita/Network/PSVita_NPToolkit.cpp @@ -102,7 +102,16 @@ void PSVitaNPToolkit::coreCallback( const sce::Toolkit::NP::Event& event ) break; case sce::Toolkit::NP::Event::loggedIn: ///< An event from the NetCtl service generated when a connection to the PSN has been established. app.DebugPrintf("Received core callback: PSN sign in \n"); - ProfileManager.SetNetworkStatus(true, true); + SceNetCtlInfo info; + sceNetCtlInetGetInfo(SCE_NET_CTL_INFO_DEVICE, &info); + if(info.device == SCE_NET_CTL_DEVICE_PHONE) // 3G connection, we're not going to allow this + { + ProfileManager.SetNetworkStatus(false, true); + } + else + { + ProfileManager.SetNetworkStatus(true, true); + } break; case sce::Toolkit::NP::Event::loggedOut: ///< An event from the NetCtl service generated when a connection to the PSN has been lost. app.DebugPrintf("Received core callback: PSN sign out \n"); @@ -350,7 +359,17 @@ static void npStateCallback(SceNpServiceState state, int retCode, void *userdata ProfileManager.SetNetworkStatus(false, true); break; case SCE_NP_SERVICE_STATE_ONLINE: - ProfileManager.SetNetworkStatus(true, true); + SceNetCtlInfo info; + sceNetCtlInetGetInfo(SCE_NET_CTL_INFO_DEVICE, &info); + if(info.device == SCE_NET_CTL_DEVICE_PHONE) // 3G connection, we're not going to allow this + { + app.DebugPrintf("Online with 3G connection!!\n"); + ProfileManager.SetNetworkStatus(false, true); + } + else + { + ProfileManager.SetNetworkStatus(true, true); + } break; default: break; diff --git a/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.cpp b/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.cpp index 2b2ccec8..9a95ee08 100644 --- a/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.cpp +++ b/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.cpp @@ -31,6 +31,7 @@ class HelloSyncInfo public: SQRNetworkManager::PresenceSyncInfo m_presenceSyncInfo; GameSessionData m_gameSessionData; + SQRNetworkManager::RoomSyncData m_roomSyncData; }; @@ -64,6 +65,7 @@ bool SQRNetworkManager_AdHoc_Vita::b_inviteRecvGUIRunning = false; //unsigned int SQRNetworkManager_AdHoc_Vita::RoomSyncData::playerCount = 0; SQRNetworkManager_AdHoc_Vita* s_pAdhocVitaManager;// have to use a static var for this as the callback function doesn't take an arg +static bool s_attemptSignInAdhoc = true; // false if we're trying to sign in to the PSN while in adhoc mode, so we can ignore the error if it fails // This maps internal to extern states, and needs to match element-by-element the eSQRNetworkManagerInternalState enumerated type const SQRNetworkManager_AdHoc_Vita::eSQRNetworkManagerState SQRNetworkManager_AdHoc_Vita::m_INTtoEXTStateMappings[SQRNetworkManager_AdHoc_Vita::SNM_INT_STATE_COUNT] = @@ -134,6 +136,7 @@ SQRNetworkManager_AdHoc_Vita::SQRNetworkManager_AdHoc_Vita(ISQRNetworkManagerLis InitializeCriticalSection(&m_csRoomSyncData); InitializeCriticalSection(&m_csPlayerState); InitializeCriticalSection(&m_csStateChangeQueue); + InitializeCriticalSection(&m_csAckQueue); memset( &m_roomSyncData,0,sizeof(m_roomSyncData)); // MGH - added to fix problem when joining a full room, and the sync data wasn't populated @@ -482,6 +485,7 @@ void SQRNetworkManager_AdHoc_Vita::InitialiseAfterOnline() // General tick function to be called from main game loop - any internal tick functions should be called from here. void SQRNetworkManager_AdHoc_Vita::Tick() { + TickWriteAcks(); OnlineCheck(); int ret; if((ret = sceNetCtlCheckCallback()) < 0 ) @@ -494,6 +498,17 @@ void SQRNetworkManager_AdHoc_Vita::Tick() TickRichPresence(); // TickInviteGUI(); // TODO + // to fix the crash when spamming the x button on signing in to PSN, don't bring up all the disconnect stuff till the pause menu disappears + if(!ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + if(!m_offlineGame && m_bLinkDisconnected) + { + m_bLinkDisconnected = false; + m_listener->HandleDisconnect(false); + } + } + + // if( ( m_gameBootInvite m) && ( s_safeToRespondToGameBootInvite ) ) // { // m_listener->HandleInviteReceived( ProfileManager.GetPrimaryPad(), m_gameBootInvite ); @@ -678,6 +693,7 @@ void SQRNetworkManager_AdHoc_Vita::UpdateExternalRoomData() CPlatformNetworkManagerSony::SetSQRPresenceInfoFromExtData( &presenceInfo.m_presenceSyncInfo, m_joinExtData, m_room, m_serverId ); assert(m_joinExtDataSize == sizeof(GameSessionData)); memcpy(&presenceInfo.m_gameSessionData, m_joinExtData, sizeof(GameSessionData)); + memcpy(&presenceInfo.m_roomSyncData, &m_roomSyncData, sizeof(RoomSyncData)); SQRNetworkManager_AdHoc_Vita::UpdateRichPresenceCustomData(&presenceInfo, sizeof(HelloSyncInfo) ); // OrbisNPToolkit::createNPSession(); } @@ -1086,6 +1102,7 @@ void SQRNetworkManager_AdHoc_Vita::ResetToIdle() } memset( m_aRoomSlotPlayers, 0, sizeof(m_aRoomSlotPlayers) ); memset( &m_roomSyncData,0,sizeof(m_roomSyncData)); + m_hostMemberId = 0; LeaveCriticalSection(&m_csRoomSyncData); SetState(SNM_INT_STATE_IDLE); if(sc_voiceChatEnabled) @@ -1147,6 +1164,8 @@ bool SQRNetworkManager_AdHoc_Vita::JoinRoom(SceNetInAddr netAddr, int localPlaye int err = sceNetAdhocMatchingSelectTarget(m_matchingContext, &netAddr, 0, NULL); m_hostMemberId = getRoomMemberID(&netAddr); + m_hostIPAddr = netAddr; + assert(err == SCE_OK); return (err == SCE_OK); //GetServerContext( serverId ); @@ -1187,6 +1206,16 @@ void SQRNetworkManager_AdHoc_Vita::LeaveRoom(bool bActuallyLeaveRoom) // SceNpMatching2LeaveRoomRequest reqParam; // memset( &reqParam, 0, sizeof(reqParam) ); // reqParam.roomId = m_room; + if(!m_isHosting) + { + int ret = sceNetAdhocMatchingCancelTarget(m_matchingContext, &m_hostIPAddr); + if (ret < 0) + { + app.DebugPrintf("sceNetAdhocMatchingCancelTarget error :[%d] [%x]\n",ret,ret) ; + assert(0); + } + } + SetState(SNM_INT_STATE_LEAVING); @@ -1774,6 +1803,7 @@ void SQRNetworkManager_AdHoc_Vita::MatchingEventHandler(int id, int event, SceNe CPlatformNetworkManagerSony::MallocAndSetExtDataFromSQRPresenceInfo(&result.m_RoomExtDataReceived, &pso->m_presenceSyncInfo); result.m_gameSessionData = malloc(sizeof(GameSessionData)); memcpy(result.m_gameSessionData, &pso->m_gameSessionData, sizeof(GameSessionData)); + memcpy(&result.m_roomSyncData, &pso->m_roomSyncData, sizeof(RoomSyncData)); // check we don't have this already int currIndex = -1; bool bChanged = false; @@ -1786,6 +1816,8 @@ void SQRNetworkManager_AdHoc_Vita::MatchingEventHandler(int id, int event, SceNe bChanged = true; if(memcmp(&result.m_roomSyncData, &manager->m_aFriendSearchResults[i].m_roomSyncData, sizeof(RoomSyncData)) != 0) bChanged = true; + if(memcmp(&result.m_roomSyncData, &manager->m_aFriendSearchResults[i].m_roomSyncData, sizeof(RoomSyncData)) != 0) + bChanged = true; break; } } @@ -1793,6 +1825,7 @@ void SQRNetworkManager_AdHoc_Vita::MatchingEventHandler(int id, int event, SceNe manager->m_aFriendSearchResults.erase(manager->m_aFriendSearchResults.begin() + currIndex); if(currIndex<0 || bChanged) manager->m_aFriendSearchResults.push_back(result); + app.DebugPrintf("m_aFriendSearchResults playerCount : %d\n", result.m_roomSyncData.players[0].m_playerCount); } } else @@ -1891,13 +1924,16 @@ void SQRNetworkManager_AdHoc_Vita::MatchingEventHandler(int id, int event, SceNe break; - case SCE_NET_ADHOC_MATCHING_EVENT_LEAVE: // The participation agreement was canceled by the target player case SCE_NET_ADHOC_MATCHING_EVENT_DENY: + case SCE_NET_ADHOC_MATCHING_EVENT_LEAVE: // The participation agreement was canceled by the target player case SCE_NET_ADHOC_MATCHING_EVENT_CANCEL: // The join request was canceled by the client case SCE_NET_ADHOC_MATCHING_EVENT_ERROR: // A protocol error occurred case SCE_NET_ADHOC_MATCHING_EVENT_TIMEOUT: // The participation agreement was canceled because of a Keep Alive timeout case SCE_NET_ADHOC_MATCHING_EVENT_DATA_TIMEOUT: - app.SetDisconnectReason(DisconnectPacket::eDisconnect_TimeOut); + if(event == SCE_NET_ADHOC_MATCHING_EVENT_DENY) + app.SetDisconnectReason(DisconnectPacket::eDisconnect_ServerFull); + else + app.SetDisconnectReason(DisconnectPacket::eDisconnect_TimeOut); ret = sceNetAdhocMatchingCancelTarget(manager->m_matchingContext, peer); if ( ret < 0 ) { @@ -1910,7 +1946,12 @@ void SQRNetworkManager_AdHoc_Vita::MatchingEventHandler(int id, int event, SceNe { app.DebugPrintf("P2P SCE_NET_ADHOC_MATCHING_EVENT_BYE Received!!\n"); - + if(event == SCE_NET_ADHOC_MATCHING_EVENT_BYE && ! manager->IsInSession()) // + { + // the BYE event comes through like the HELLO event, so even even if we're not connected + // so make sure we're actually in session + break; + } SceNpMatching2RoomMemberId peerMemberId = getRoomMemberID(peer); if( manager->m_isHosting ) { @@ -2510,7 +2551,10 @@ void SQRNetworkManager_AdHoc_Vita::updateNetCheckDialog() // SCE_COMMON_DIALOG_RESULT_ABORTED // Failed, or user may have decided not to sign in - maybe need to differentiate here - SetState(SNM_INT_STATE_INITIALISE_FAILED); + if(s_attemptSignInAdhoc) // don't fail if it was an attempted PSN signin + { + SetState(SNM_INT_STATE_INITIALISE_FAILED); + } if( s_SignInCompleteCallbackFn ) { if( s_signInCompleteCallbackIfFailed ) @@ -2606,14 +2650,8 @@ void SQRNetworkManager_AdHoc_Vita::RudpContextCallback(int ctx_id, int event_id, } else { - unsigned int dataSize = sceRudpGetSizeReadable(ctx_id); - unsigned char* buffer = (unsigned char*)malloc(dataSize); - unsigned int bytesRead = sceRudpRead( ctx_id, buffer, dataSize, 0, NULL ); - assert(bytesRead == dataSize); - - unsigned char* bufferPos = buffer; - unsigned int dataLeft = dataSize; - + SQRNetworkPlayer *playerIncomingData = manager->GetPlayerFromRudpCtx( ctx_id ); + unsigned int dataSize = playerIncomingData->GetPacketDataSize(); // If we're the host, and this player hasn't yet had its small id confirmed, then the first byte sent to us should be this id if( manager->m_isHosting ) { @@ -2623,10 +2661,16 @@ void SQRNetworkManager_AdHoc_Vita::RudpContextCallback(int ctx_id, int event_id, if( dataSize >= sizeof(SQRNetworkPlayer::InitSendData) ) { SQRNetworkPlayer::InitSendData ISD; - memcpy(&ISD, bufferPos, sizeof(SQRNetworkPlayer::InitSendData)); - manager->NetworkPlayerInitialDataReceived(playerFrom, &ISD); - dataLeft -= sizeof(SQRNetworkPlayer::InitSendData); - bufferPos += sizeof(SQRNetworkPlayer::InitSendData); + int bytesRead = playerFrom->ReadDataPacket( &ISD, sizeof(SQRNetworkPlayer::InitSendData)); + if( bytesRead == sizeof(SQRNetworkPlayer::InitSendData) ) + { + manager->NetworkPlayerInitialDataReceived(playerFrom, &ISD); + dataSize -= sizeof(SQRNetworkPlayer::InitSendData); + } + else + { + assert(false); + } } else { @@ -2635,28 +2679,32 @@ void SQRNetworkManager_AdHoc_Vita::RudpContextCallback(int ctx_id, int event_id, } } - if( dataLeft > 0 ) + if( dataSize > 0 ) { - SQRNetworkPlayer *playerFrom, *playerTo; - if( manager->m_isHosting ) - { - // Data always going from a remote player, to the host - playerFrom = manager->GetPlayerFromRudpCtx( ctx_id ); - playerTo = manager->m_aRoomSlotPlayers[0]; - } - else + unsigned char *data = new unsigned char [ dataSize ]; + int bytesRead = playerIncomingData->ReadDataPacket( data, dataSize ); + if( bytesRead > 0 ) { - // Data always going from host player, to a local player - playerFrom = manager->m_aRoomSlotPlayers[0]; - playerTo = manager->GetPlayerFromRudpCtx( ctx_id ); - } - if( ( playerFrom != NULL ) && ( playerTo != NULL ) ) - { - manager->m_listener->HandleDataReceived( playerFrom, playerTo, bufferPos, dataLeft ); + SQRNetworkPlayer *playerFrom, *playerTo; + if( manager->m_isHosting ) + { + // Data always going from a remote player, to the host + playerFrom = manager->GetPlayerFromRudpCtx( ctx_id ); + playerTo = manager->m_aRoomSlotPlayers[0]; + } + else + { + // Data always going from host player, to a local player + playerFrom = manager->m_aRoomSlotPlayers[0]; + playerTo = manager->GetPlayerFromRudpCtx( ctx_id ); + } + if( ( playerFrom != NULL ) && ( playerTo != NULL ) ) + { + manager->m_listener->HandleDataReceived( playerFrom, playerTo, data, bytesRead ); + } } + delete [] data; } - - delete buffer; } } break; @@ -2682,16 +2730,20 @@ void SQRNetworkManager_AdHoc_Vita::NetCtlCallback(int eventType, void *arg) SQRNetworkManager_AdHoc_Vita *manager = (SQRNetworkManager_AdHoc_Vita *)arg; // Oddly, the disconnect event comes in with a new state of "CELL_NET_CTL_STATE_Connecting"... looks like the event is more important than the state to // determine what has just happened - if( eventType == SCE_NET_CTL_EVENT_TYPE_DISCONNECTED)// CELL_NET_CTL_EVENT_LINK_DISCONNECTED ) + switch(eventType) { + case SCE_NET_CTL_EVENT_TYPE_DISCONNECTED: + case SCE_NET_CTL_EVENT_TYPE_DISCONNECT_REQ_FINISHED: manager->m_bLinkDisconnected = true; - manager->m_listener->HandleDisconnect(false); - } - else //if( event == CELL_NET_CTL_EVENT_ESTABLISH ) - { +// manager->m_listener->HandleDisconnect(true, true); + break; + case SCE_NET_CTL_EVENT_TYPE_IPOBTAINED: manager->m_bLinkDisconnected = false; + break; + default: + assert(0); + break; } - } // Called when the context has been created, and we are intending to create a room. @@ -2877,16 +2929,18 @@ bool SQRNetworkManager_AdHoc_Vita::ForceErrorPoint(eSQRForceError err) } #endif -void SQRNetworkManager_AdHoc_Vita::AttemptPSNSignIn(int (*SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad), void *pParam, bool callIfFailed/*=false*/) +void SQRNetworkManager_AdHoc_Vita::AttemptAdhocSignIn(int (*SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad), void *pParam, bool callIfFailed/*=false*/) { s_SignInCompleteCallbackFn = SignInCompleteCallbackFn; s_signInCompleteCallbackIfFailed = callIfFailed; s_SignInCompleteParam = pParam; - + app.DebugPrintf("s_SignInCompleteCallbackFn - 0x%08x : s_SignInCompleteParam - 0x%08x\n", (unsigned int)s_SignInCompleteCallbackFn, (unsigned int)s_SignInCompleteParam); SceNetCheckDialogParam param; memset(¶m, 0x00, sizeof(param)); sceNetCheckDialogParamInit(¶m); + s_attemptSignInAdhoc = true; // so we know which sign in we're trying to make in the netCheckUpdate + SceNetAdhocctlGroupName groupName; memset(groupName.data, 0x00, SCE_NET_ADHOCCTL_GROUPNAME_LEN); @@ -2915,6 +2969,82 @@ void SQRNetworkManager_AdHoc_Vita::AttemptPSNSignIn(int (*SignInCompleteCallback } } + + +void SQRNetworkManager_AdHoc_Vita::AttemptPSNSignIn(int (*SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad), void *pParam, bool callIfFailed/*=false*/) +{ + s_SignInCompleteCallbackFn = SignInCompleteCallbackFn; + s_signInCompleteCallbackIfFailed = callIfFailed; + s_SignInCompleteParam = pParam; + app.DebugPrintf("s_SignInCompleteCallbackFn - 0x%08x : s_SignInCompleteParam - 0x%08x\n", (unsigned int)s_SignInCompleteCallbackFn, (unsigned int)s_SignInCompleteParam); + + if(SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + // if the adhoc connection is running, kill it here + sceNetCtlAdhocDisconnect(); + } + + SceNetCheckDialogParam param; + memset(¶m, 0x00, sizeof(param)); + sceNetCheckDialogParamInit(¶m); + param.mode = SCE_NETCHECK_DIALOG_MODE_PSN_ONLINE; + param.defaultAgeRestriction = ProfileManager.GetMinimumAge(); + + s_attemptSignInAdhoc = false; // so we know which sign in we're trying to make in the netCheckUpdate + + + // ------------------------------------------------------------- + // MGH - this code is duplicated in the PSN network manager now too, so any changes will have to be made there too + // ------------------------------------------------------------- + //CD - Only add if EU sku, not SCEA or SCEJ + if( app.GetProductSKU() == e_sku_SCEE ) + { + //CD - Added Country age restrictions + SceNetCheckDialogAgeRestriction restrictions[5]; + memset( restrictions, 0x0, sizeof(SceNetCheckDialogAgeRestriction) * 5 ); + //Germany + restrictions[0].age = ProfileManager.GetGermanyMinimumAge(); + memcpy( restrictions[0].countryCode, "de", 2 ); + //Russia + restrictions[1].age = ProfileManager.GetRussiaMinimumAge(); + memcpy( restrictions[1].countryCode, "ru", 2 ); + //Australia + restrictions[2].age = ProfileManager.GetAustraliaMinimumAge(); + memcpy( restrictions[2].countryCode, "au", 2 ); + //Japan + restrictions[3].age = ProfileManager.GetJapanMinimumAge(); + memcpy( restrictions[3].countryCode, "jp", 2 ); + //Korea + restrictions[4].age = ProfileManager.GetKoreaMinimumAge(); + memcpy( restrictions[4].countryCode, "kr", 2 ); + //Set + param.ageRestriction = restrictions; + param.ageRestrictionCount = 5; + } + + memcpy(¶m.npCommunicationId.data, &s_npCommunicationId, sizeof(s_npCommunicationId)); + param.npCommunicationId.term = '\0'; + param.npCommunicationId.num = 0; + + int ret = sceNetCheckDialogInit(¶m); + + ProfileManager.SetSysUIShowing( true ); + app.DebugPrintf("------------>>>>>>>> sceNetCheckDialogInit : PSN Mode\n"); + + if( ret < 0 ) + { + if(s_SignInCompleteCallbackFn) // MGH - added after crash on PS4 + { + if( s_signInCompleteCallbackIfFailed ) + { + s_SignInCompleteCallbackFn(s_SignInCompleteParam,false,0); + } + s_SignInCompleteCallbackFn = NULL; + } + } +} + + int SQRNetworkManager_AdHoc_Vita::SetRichPresence(const void *data) { const sce::Toolkit::NP::PresenceDetails *newPresenceInfo = (const sce::Toolkit::NP::PresenceDetails *)data; @@ -3010,6 +3140,7 @@ void SQRNetworkManager_AdHoc_Vita::SetPresenceDataStartHostingGame() CPlatformNetworkManagerSony::SetSQRPresenceInfoFromExtData( &presenceInfo.m_presenceSyncInfo, m_joinExtData, m_room, m_serverId ); assert(m_joinExtDataSize == sizeof(GameSessionData)); memcpy(&presenceInfo.m_gameSessionData, m_joinExtData, sizeof(GameSessionData)); + memcpy(&presenceInfo.m_roomSyncData, &m_roomSyncData, sizeof(RoomSyncData)); SQRNetworkManager_AdHoc_Vita::UpdateRichPresenceCustomData(&presenceInfo, sizeof(HelloSyncInfo) ); // OrbisNPToolkit::createNPSession(); } @@ -3116,4 +3247,5 @@ void SQRNetworkManager_AdHoc_Vita::UpdateLocalIPAddress() { m_localIPAddr = localIPAddr; } -} \ No newline at end of file +} + diff --git a/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.h b/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.h index 7d9948c9..c1b2d266 100644 --- a/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.h +++ b/Minecraft.Client/PSVita/Network/SQRNetworkManager_AdHoc_Vita.h @@ -104,7 +104,6 @@ public: static void GetInviteDataAndProcess(sce::Toolkit::NP::MessageAttachment* pInvite); static bool GetAdhocStatus() { return m_adhocStatus; } - int sendDataPacket(SceNetInAddr addr, EAdhocDataTag tag, void* data, int dataSize); int sendDataPacket(SceNetInAddr addr, void* data, int dataSize); @@ -125,6 +124,7 @@ private: bool m_nextIdleReasonIsFull; bool m_isHosting; SceNetInAddr m_localIPAddr; + SceNetInAddr m_hostIPAddr; SceNpMatching2RoomMemberId m_localMemberId; SceNpMatching2RoomMemberId m_hostMemberId; // if we're not the host int m_localPlayerCount; @@ -316,6 +316,7 @@ private: public: static void AttemptPSNSignIn(int (*SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad), void *pParam, bool callIfFailed = false); + static void AttemptAdhocSignIn(int (*SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad), void *pParam, bool callIfFailed = false); static int (*s_SignInCompleteCallbackFn)(void *pParam, bool bContinue, int pad); static bool s_signInCompleteCallbackIfFailed; static void *s_SignInCompleteParam; diff --git a/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.cpp b/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.cpp index 6a4e2c72..8182674a 100644 --- a/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.cpp +++ b/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.cpp @@ -108,6 +108,7 @@ SQRNetworkManager_Vita::SQRNetworkManager_Vita(ISQRNetworkManagerListener *liste InitializeCriticalSection(&m_csPlayerState); InitializeCriticalSection(&m_csStateChangeQueue); InitializeCriticalSection(&m_csMatching); + InitializeCriticalSection(&m_csAckQueue); memset( &m_roomSyncData,0,sizeof(m_roomSyncData)); // MGH - added to fix problem when joining a full room, and the sync data wasn't populated @@ -277,6 +278,10 @@ void SQRNetworkManager_Vita::Terminate() // into SNM_INT_STATE_IDLE at this stage. void SQRNetworkManager_Vita::InitialiseAfterOnline() { + // MGH - added, so we don't init the matching2 stuff in trial mode - devtrack #5921 + if(!ProfileManager.IsFullVersion()) + return; + // SceNpId npId; // int option = 0; @@ -358,6 +363,7 @@ void SQRNetworkManager_Vita::InitialiseAfterOnline() // General tick function to be called from main game loop - any internal tick functions should be called from here. void SQRNetworkManager_Vita::Tick() { + TickWriteAcks(); OnlineCheck(); sceNetCtlCheckCallback(); updateNetCheckDialog(); @@ -1527,7 +1533,7 @@ void SQRNetworkManager_Vita::TickJoinablePresenceData() // 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(), &MustSignInReturnedPresenceInvite, NULL, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &MustSignInReturnedPresenceInvite, NULL); } } @@ -2105,6 +2111,16 @@ bool SQRNetworkManager_Vita::GetServerContext2() // using mainly the same code by making a single element list. This is used when joining an existing room. bool SQRNetworkManager_Vita::GetServerContext(SceNpMatching2ServerId serverId) { + if(m_state == SNM_INT_STATE_STARTING_CONTEXT) + { + // MGH - added for devtrack 5936 : race between the context starting after going online, and trying to start it here, so skip this one if we're already starting. + m_serverCount = 1; + m_totalServerCount = m_serverCount; + m_aServerId = (SceNpMatching2ServerId *)realloc(m_aServerId, sizeof(SceNpMatching2ServerId) * m_serverCount ); + m_aServerId[0] = serverId; + SetState(SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT); + return true; + } assert(m_state == SNM_INT_STATE_IDLE); assert(m_serverContextValid == false); @@ -2895,7 +2911,9 @@ void SQRNetworkManager_Vita::DefaultRequestCallback(SceNpMatching2ContextId id, manager->SetState(SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED); if(errorCode == SCE_NP_MATCHING2_SERVER_ERROR_ROOM_FULL) // MGH - added to fix "host has exited" error when 2 players go after the final slot { + app.DebugPrintf("setting DisconnectPacket::eDisconnect_ServerFull\n"); Minecraft::GetInstance()->connectionDisconnected(ProfileManager.GetPrimaryPad(), DisconnectPacket::eDisconnect_ServerFull); + app.SetDisconnectReason(DisconnectPacket::eDisconnect_ServerFull); // MGH - added to fix when joining from an invite } break; // This is the response to sceNpMatching2GetRoomMemberDataInternal.This only happens on the host, as a response to an incoming connection being established, when we @@ -3339,6 +3357,17 @@ int SQRNetworkManager_Vita::BasicEventCallback(int event, int retCode, uint32_t // Implementation of SceNpManagerCallback void SQRNetworkManager_Vita::OnlineCheck() { + static bool s_bFullVersion = ProfileManager.IsFullVersion(); + if(s_bFullVersion != ProfileManager.IsFullVersion()) + { + s_bFullVersion = ProfileManager.IsFullVersion(); + // we've switched from trial to full version here, if we're already online, call InitialiseAfterOnline, as this is now returns immediately in trial mode (devtrack #5921) + if(GetOnlineStatus() == true) + { + InitialiseAfterOnline(); + } + } + bool bSignedIn = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()); if(GetOnlineStatus() == false) { @@ -3423,9 +3452,22 @@ void SQRNetworkManager_Vita::updateNetCheckDialog() ret = sceNetCheckDialogTerm(); app.DebugPrintf("NetCheckDialogTerm ret = 0x%x\n", ret); ProfileManager.SetSysUIShowing( false ); + + bool bConnectedOK = (netCheckResult.result == SCE_COMMON_DIALOG_RESULT_OK); + if(bConnectedOK) + { + SceNetCtlInfo info; + sceNetCtlInetGetInfo(SCE_NET_CTL_INFO_DEVICE, &info); + if(info.device == SCE_NET_CTL_DEVICE_PHONE) // 3G connection, we're not going to allow this + { + app.DebugPrintf("Online with 3G connection!!\n"); + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_WIFI_REQUIRED_OPERATION, 0 ); + bConnectedOK = false; + } + } app.DebugPrintf("------------>>>>>>>> sceNetCheckDialog finished\n"); - if( netCheckResult.result == SCE_COMMON_DIALOG_RESULT_OK ) + if( bConnectedOK ) { if( s_SignInCompleteCallbackFn ) { @@ -3521,7 +3563,8 @@ void SQRNetworkManager_Vita::RudpContextCallback(int ctx_id, int event_id, int e } else { - unsigned int dataSize = sceRudpGetSizeReadable(ctx_id); + SQRNetworkPlayer *playerIncomingData = manager->GetPlayerFromRudpCtx( ctx_id ); + unsigned int dataSize = playerIncomingData->GetPacketDataSize(); // If we're the host, and this player hasn't yet had its small id confirmed, then the first byte sent to us should be this id if( manager->m_isHosting ) { @@ -3531,7 +3574,7 @@ void SQRNetworkManager_Vita::RudpContextCallback(int ctx_id, int event_id, int e if( dataSize >= sizeof(SQRNetworkPlayer::InitSendData) ) { SQRNetworkPlayer::InitSendData ISD; - unsigned int bytesRead = sceRudpRead( ctx_id, &ISD, sizeof(SQRNetworkPlayer::InitSendData), 0, NULL ); + int bytesRead = playerFrom->ReadDataPacket( &ISD, sizeof(SQRNetworkPlayer::InitSendData)); if( bytesRead == sizeof(SQRNetworkPlayer::InitSendData) ) { manager->NetworkPlayerInitialDataReceived(playerFrom, &ISD); @@ -3552,7 +3595,7 @@ void SQRNetworkManager_Vita::RudpContextCallback(int ctx_id, int event_id, int e if( dataSize > 0 ) { unsigned char *data = new unsigned char [ dataSize ]; - unsigned int bytesRead = sceRudpRead( ctx_id, data, dataSize, 0, NULL ); + int bytesRead = playerIncomingData->ReadDataPacket( data, dataSize ); if( bytesRead > 0 ) { SQRNetworkPlayer *playerFrom, *playerTo; @@ -3868,6 +3911,9 @@ void SQRNetworkManager_Vita::AttemptPSNSignIn(int (*SignInCompleteCallbackFn)(vo param.mode = SCE_NETCHECK_DIALOG_MODE_PSN_ONLINE; param.defaultAgeRestriction = ProfileManager.GetMinimumAge(); + // ------------------------------------------------------------- + // MGH - this code is duplicated in the adhoc manager now too, so any changes will have to be made there too + // ------------------------------------------------------------- //CD - Only add if EU sku, not SCEA or SCEJ if( app.GetProductSKU() == e_sku_SCEE ) { @@ -3925,7 +3971,10 @@ int SQRNetworkManager_Vita::SetRichPresence(const void *data) s_lastPresenceInfo.presenceType = SCE_NP_BASIC_IN_GAME_PRESENCE_TYPE_DEFAULT; s_presenceStatusDirty = true; - SendLastPresenceInfo(); + if(s_resendPresenceCountdown == 0) + { + s_resendPresenceCountdown = 5; // wait a few ticks before setting the rich presence value, so if there's a few being set at one time (like on game startup) we can send them all in a single call + } // Return as if no error happened no matter what, as we'll be resending ourselves if we need to and don't want the calling system to retry return 0; @@ -3938,7 +3987,10 @@ void SQRNetworkManager_Vita::UpdateRichPresenceCustomData(void *data, unsigned i s_lastPresenceInfo.size = dataBytes; s_presenceStatusDirty = true; - SendLastPresenceInfo(); + if(s_resendPresenceCountdown == 0) + { + s_resendPresenceCountdown = 5; // wait a few ticks before setting the rich presence value, so if there's a few being set at one time (like on game startup) we can send them all in a single call + } } void SQRNetworkManager_Vita::TickRichPresence() diff --git a/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.h b/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.h index 592919d4..0fd0b414 100644 --- a/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.h +++ b/Minecraft.Client/PSVita/Network/SQRNetworkManager_Vita.h @@ -300,6 +300,7 @@ public: int GetJoiningReadyPercentage(); static void SetPresenceFailedCallback(); GameSessionUID GetHostUID() { return s_lastPresenceSyncInfo.hostPlayerUID; } + bool IsOnlineGame() { return !m_offlineGame; } private: static void UpdateRichPresenceCustomData(void *data, unsigned int dataBytes); static void TickRichPresence(); diff --git a/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.cpp b/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.cpp index 870930f6..09852ccb 100644 --- a/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.cpp +++ b/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.cpp @@ -54,6 +54,7 @@ sce::Toolkit::NP::Utilities::Future g_catego sce::Toolkit::NP::Utilities::Future g_detailedProductInfo; //sce::Toolkit::NP::Utilities::Future g_bgdlStatus; +static bool s_showingPSStoreIcon = false; SonyCommerce_Vita::ProductInfoDetailed s_trialUpgradeProductInfoDetailed; @@ -186,7 +187,10 @@ int SonyCommerce_Vita::TickLoop(void* lpParam) if(m_iClearDLCCountdown == 0) { app.ClearDLCInstalled(); - ui.HandleDLCInstalled(0); + if(g_NetworkManager.IsInSession()) // we're in-game, could be a purchase of a pack after joining an invite from another player + app.StartInstallDLCProcess(0); + else + ui.HandleDLCInstalled(0); } } @@ -591,7 +595,7 @@ void SonyCommerce_Vita::UpgradeTrialCallback2(LPVOID lpParam,int err) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); } m_trialUpgradeCallbackFunc(m_trialUpgradeCallbackParam, m_errorCode); } @@ -618,7 +622,7 @@ void SonyCommerce_Vita::UpgradeTrialCallback1(LPVOID lpParam,int err) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); m_trialUpgradeCallbackFunc(m_trialUpgradeCallbackParam, m_errorCode); } } @@ -1459,6 +1463,27 @@ bool SonyCommerce_Vita::getDLCUpgradePending() return false; } + +void SonyCommerce_Vita::ShowPsStoreIcon() +{ + if(!s_showingPSStoreIcon) + { + sceNpCommerce2ShowPsStoreIcon(SCE_NP_COMMERCE2_ICON_DISP_RIGHT); + s_showingPSStoreIcon = true; + } +} + +void SonyCommerce_Vita::HidePsStoreIcon() +{ + if(s_showingPSStoreIcon) + { + sceNpCommerce2HidePsStoreIcon(); + s_showingPSStoreIcon = false; + } +} + + + /* bool g_bDoCommerceCreateSession = false; bool g_bDoCommerceGetProductList = false; diff --git a/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.h b/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.h index ad114796..6285832c 100644 --- a/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.h +++ b/Minecraft.Client/PSVita/Network/SonyCommerce_Vita.h @@ -201,4 +201,7 @@ public: static bool getPurchasabilityUpdated(); static bool getDLCUpgradePending(); + virtual void ShowPsStoreIcon(); + virtual void HidePsStoreIcon(); + }; diff --git a/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp index 3d9483d2..c103b32f 100644 --- a/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp +++ b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.cpp @@ -116,7 +116,7 @@ void SonyRemoteStorage_Vita::internalCallback(const SceRemoteStorageEvent event, app.DebugPrintf("Set data progress: %i%%\n", retCode); m_status = e_setDataInProgress; m_dataProgress = retCode; - + m_startTime = System::currentTimeMillis(); break; case USER_ACCOUNT_LINKED: @@ -146,8 +146,12 @@ bool SonyRemoteStorage_Vita::init(CallbackFunc cb, LPVOID lpParam) m_callbackFunc = cb; m_callbackParam = lpParam; + m_bTransferStarted = false; + m_bAborting = false; + m_lastErrorCode = SCE_OK; + if(m_bInitialised) { internalCallback(USER_ACCOUNT_LINKED, 0); @@ -293,6 +297,10 @@ bool SonyRemoteStorage_Vita::setDataInternal() // CompressSaveData(); // check if we need to re-save the file compressed first snprintf(m_saveFilename, sizeof(m_saveFilename), "%s:%s/GAMEDATA.bin", "savedata0", m_setDataSaveInfo->UTF8SaveFilename); + + SceFiosSize outSize = sceFiosFileGetSizeSync(NULL, m_saveFilename); + m_uploadSaveSize = (int)outSize; + strcpy(m_saveFileDesc, m_setDataSaveInfo->UTF8SaveTitle); m_status = e_setDataInProgress; @@ -302,39 +310,7 @@ bool SonyRemoteStorage_Vita::setDataInternal() strcpy(params.pathLocation, m_saveFilename); sprintf(params.fileName, getRemoteSaveFilename()); - DescriptionData descData; - ZeroMemory(&descData, sizeof(DescriptionData)); - descData.m_platform[0] = SAVE_FILE_PLATFORM_LOCAL & 0xff; - descData.m_platform[1] = (SAVE_FILE_PLATFORM_LOCAL >> 8) & 0xff; - descData.m_platform[2] = (SAVE_FILE_PLATFORM_LOCAL >> 16) & 0xff; - descData.m_platform[3] = (SAVE_FILE_PLATFORM_LOCAL >> 24)& 0xff; - - if(m_thumbnailData) - { - unsigned int uiHostOptions; - bool bHostOptionsRead; - DWORD uiTexturePack; - char seed[22]; - app.GetImageTextData(m_thumbnailData, m_thumbnailDataSize,(unsigned char *)seed, uiHostOptions, bHostOptionsRead, uiTexturePack); - - __int64 iSeed = strtoll(seed,NULL,10); - char seedHex[17]; - sprintf(seedHex,"%016llx",iSeed); - memcpy(descData.m_seed,seedHex,16); // Don't copy null - - // Save the host options that this world was last played with - char hostOptions[9]; - sprintf(hostOptions,"%08x",uiHostOptions); - memcpy(descData.m_hostOptions,hostOptions,8); // Don't copy null - - // Save the texture pack id - char texturePack[9]; - sprintf(texturePack,"%08x",uiTexturePack); - memcpy(descData.m_texturePack,texturePack,8); // Don't copy null - } - - memcpy(descData.m_saveNameUTF8, m_saveFileDesc, strlen(m_saveFileDesc)+1); // plus null - memcpy(params.fileDescription, &descData, sizeof(descData)); + GetDescriptionData(params.fileDescription); if(m_bAborting) diff --git a/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.h b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.h index 9c636e41..13b37e3e 100644 --- a/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.h +++ b/Minecraft.Client/PSVita/Network/SonyRemoteStorage_Vita.h @@ -29,7 +29,6 @@ private: int m_getDataProgress; int m_setDataProgress; char m_saveFilename[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; - char m_saveFileDesc[SCE_REMOTE_STORAGE_DATA_DESCRIPTION_MAX_LEN]; char m_remoteFilename[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; diff --git a/Minecraft.Client/PSVita/PSVitaExtras/PsVitaStubs.cpp b/Minecraft.Client/PSVita/PSVitaExtras/PsVitaStubs.cpp index 87c59535..b9668250 100644 --- a/Minecraft.Client/PSVita/PSVitaExtras/PsVitaStubs.cpp +++ b/Minecraft.Client/PSVita/PSVitaExtras/PsVitaStubs.cpp @@ -304,7 +304,8 @@ LPVOID VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWO NumPagesRequired += 1; } - while( VirtualNumAllocs != NumPagesRequired ) + // allocate pages until we reach the required number of pages + while( VirtualNumAllocs < NumPagesRequired ) { // allocate a new page void* NewAlloc = malloc(VIRTUAL_PAGE_SIZE); @@ -941,35 +942,18 @@ int _wtoi(const wchar_t *_Str) DWORD XGetLanguage() { - unsigned char ucLang = app.GetMinecraftLanguage(0); - SceInt32 iLang; - // check if we should override the system language or not - if(ucLang==MINECRAFT_LANGUAGE_DEFAULT) - { - sceAppUtilSystemParamGetInt(SCE_SYSTEM_PARAM_ID_LANG,&iLang); - } - else - { - return (DWORD)ucLang; - } + unsigned char ucLang = app.GetMinecraftLanguage(0); + if (ucLang != MINECRAFT_LANGUAGE_DEFAULT) return ucLang; + SceInt32 iLang; + sceAppUtilSystemParamGetInt(SCE_SYSTEM_PARAM_ID_LANG,&iLang); switch(iLang) { case SCE_SYSTEM_PARAM_LANG_JAPANESE : return XC_LANGUAGE_JAPANESE; case SCE_SYSTEM_PARAM_LANG_ENGLISH_US : return XC_LANGUAGE_ENGLISH; case SCE_SYSTEM_PARAM_LANG_FRENCH : return XC_LANGUAGE_FRENCH; - - case SCE_SYSTEM_PARAM_LANG_SPANISH : - if(app.IsAmericanSKU()) - { - return XC_LANGUAGE_LATINAMERICANSPANISH; - } - else - { - return XC_LANGUAGE_SPANISH; - } - + case SCE_SYSTEM_PARAM_LANG_SPANISH : return XC_LANGUAGE_SPANISH; case SCE_SYSTEM_PARAM_LANG_GERMAN : return XC_LANGUAGE_GERMAN; case SCE_SYSTEM_PARAM_LANG_ITALIAN : return XC_LANGUAGE_ITALIAN; case SCE_SYSTEM_PARAM_LANG_PORTUGUESE_PT : return XC_LANGUAGE_PORTUGUESE; @@ -997,6 +981,10 @@ DWORD XGetLanguage() } DWORD XGetLocale() { + // check if we should override the system locale or not + unsigned char ucLocale = app.GetMinecraftLocale(0); + if (ucLocale != MINECRAFT_LANGUAGE_DEFAULT) return ucLocale; + SceInt32 iLang; sceAppUtilSystemParamGetInt(SCE_SYSTEM_PARAM_ID_LANG,&iLang); switch(iLang) diff --git a/Minecraft.Client/PSVita/PSVita_App.cpp b/Minecraft.Client/PSVita/PSVita_App.cpp index a21699c0..48aa25c4 100644 --- a/Minecraft.Client/PSVita/PSVita_App.cpp +++ b/Minecraft.Client/PSVita/PSVita_App.cpp @@ -17,7 +17,7 @@ #include "PSVita/Network/PSVita_NPToolkit.h" #include #include - +#include "Common\UI\UI.h" #include "PSVita\PSVitaExtras\PSVitaStrings.h" #define VITA_COMMERCE_ENABLED @@ -111,6 +111,17 @@ SONYDLC *CConsoleMinecraftApp::GetSONYDLCInfo(char *pchTitle) return pTemp;*/ } +SONYDLC *CConsoleMinecraftApp::GetSONYDLCInfo(int iTexturePackID) +{ + for ( AUTO_VAR(it, m_SONYDLCMap.begin()); it != m_SONYDLCMap.end(); ++it ) + { + if(it->second->iConfig == iTexturePackID) + return it->second; + } + return NULL; +} + + #define WRAPPED_READFILE(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped) {if(ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped)==FALSE) { return FALSE;}} BOOL CConsoleMinecraftApp::ReadProductCodes() { @@ -333,6 +344,14 @@ void CConsoleMinecraftApp::TemporaryCreateGameStart() app.SetGameHostOption(eGameHostOption_HostCanChangeHunger, 1); app.SetGameHostOption(eGameHostOption_HostCanBeInvisible, 1 ); + app.SetGameHostOption(eGameHostOption_MobGriefing, 1 ); + app.SetGameHostOption(eGameHostOption_KeepInventory, 0 ); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, 1 ); + app.SetGameHostOption(eGameHostOption_DoMobLoot, 1 ); + app.SetGameHostOption(eGameHostOption_DoTileDrops, 1 ); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, 1 ); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, 1 ); + param->settings = app.GetGameHostOption( eGameHostOption_All ); g_NetworkManager.FakeLocalPlayerJoined(); @@ -650,7 +669,7 @@ bool CConsoleMinecraftApp::UpgradeTrial() { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); return true; } else @@ -1057,19 +1076,22 @@ bool CConsoleMinecraftApp::CheckForEmptyStore(int iPad) SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); bool bEmptyStore=true; - if(pCategories->countOfProducts>0) - { - bEmptyStore=false; - } - else - { - for(int i=0;icountOfSubCategories;i++) + if(pCategories!=NULL) + { + if(pCategories->countOfProducts>0) { - std::vector*pvProductInfo=app.GetProductList(i); - if(pvProductInfo->size()>0) + bEmptyStore=false; + } + else + { + for(int i=0;icountOfSubCategories;i++) { - bEmptyStore=false; - break; + std::vector*pvProductInfo=app.GetProductList(i); + if(pvProductInfo->size()>0) + { + bEmptyStore=false; + break; + } } } } @@ -1197,7 +1219,7 @@ void CConsoleMinecraftApp::SaveDataTick() { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - C4JStorage::EMessageResult res = ui.RequestMessageBox( IDS_SAVE_INCOMPLETE_TITLE, IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL, app.GetStringTable()); + C4JStorage::EMessageResult res = ui.RequestErrorMessage( IDS_SAVE_INCOMPLETE_TITLE, IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA, uiIDA, 1, ProfileManager.GetPrimaryPad()); if( res != C4JStorage::EMessage_Busy ) { //Clear the error now it's been dealt with @@ -1217,18 +1239,30 @@ void CConsoleMinecraftApp::Callback_SaveGameIncomplete(void *pParam, C4JStorage: if (saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota || saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfLocalStorage) { - // 4J Stu - If it's quota then we definitely have to delete our saves, so don't show the system UI for this case - if(saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota) blocksRequired = -1; - UINT uiIDA[2]; - uiIDA[0]=IDS_CONFIRM_OK; - uiIDA[1]=IDS_CONFIRM_CANCEL; - C4JStorage::EMessageResult res = ui.RequestMessageBox( IDS_SAVE_INCOMPLETE_TITLE, IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA, uiIDA, 2, ProfileManager.GetPrimaryPad(), &NoSaveSpaceReturned, (void *)blocksRequired, app.GetStringTable()); + if(UIScene_LoadOrJoinMenu::isSaveTransferRunning()) + { + // 4J MGH - if we're trying to save from the save transfer stuff, only show "ok", and we won't try to save again + if(saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota) blocksRequired = -1; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult res = ui.RequestErrorMessage( IDS_SAVE_INCOMPLETE_TITLE, IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA, uiIDA, 1, ProfileManager.GetPrimaryPad(), &NoSaveSpaceReturned, (void *)blocksRequired); + + } + else + { + // 4J Stu - If it's quota then we definitely have to delete our saves, so don't show the system UI for this case + if(saveIncompleteType == C4JStorage::ESaveIncomplete_OutOfQuota) blocksRequired = -1; + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + C4JStorage::EMessageResult res = ui.RequestErrorMessage( IDS_SAVE_INCOMPLETE_TITLE, IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA, uiIDA, 2, ProfileManager.GetPrimaryPad(), &NoSaveSpaceReturned, (void *)blocksRequired); + } } } int CConsoleMinecraftApp::NoSaveSpaceReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - if(result==C4JStorage::EMessage_ResultAccept) + if(result==C4JStorage::EMessage_ResultAccept && !UIScene_LoadOrJoinMenu::isSaveTransferRunning()) // MGH - we won't try to save again during a save tranfer { int blocksRequired = (int)pParam; if(blocksRequired > 0) @@ -1489,12 +1523,11 @@ void CConsoleMinecraftApp::updateSaveDataDeleteDialog() IDS_CONFIRM_OK }; - ui.RequestMessageBox( + ui.RequestErrorMessage( IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, 0, - &cbConfirmDeleteMessageBox, this, - app.GetStringTable() + &cbConfirmDeleteMessageBox, this ); m_bSaveDataDeleteDialogState = eSaveDataDeleteState_userConfirmation; diff --git a/Minecraft.Client/PSVita/PSVita_App.h b/Minecraft.Client/PSVita/PSVita_App.h index 9a01a610..209fb91a 100644 --- a/Minecraft.Client/PSVita/PSVita_App.h +++ b/Minecraft.Client/PSVita/PSVita_App.h @@ -103,6 +103,7 @@ public: bool IsAmericanSKU(); //char *GetSKUPostfix(); SONYDLC *GetSONYDLCInfo(char *pchTitle); + SONYDLC *GetSONYDLCInfo(int iTexturePackID); int GetiFirstSkinFromName(char *pchName); int GetiConfigFromName(char *pchName); @@ -214,7 +215,7 @@ private: bool m_bCommerceInitialised; bool m_bCommerceProductListRetrieved; bool m_bProductListAdditionalDetailsRetrieved; - char m_pchSkuID[48]; + char m_pchSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; int m_eCommerce_State; int m_ProductListRetrievedC; diff --git a/Minecraft.Client/PSVita/PSVita_Minecraft.cpp b/Minecraft.Client/PSVita/PSVita_Minecraft.cpp index ee13a216..a82adf00 100644 --- a/Minecraft.Client/PSVita/PSVita_Minecraft.cpp +++ b/Minecraft.Client/PSVita/PSVita_Minecraft.cpp @@ -59,6 +59,7 @@ #include "Conf.h" #include "PSVita/Network/PSVita_NPToolkit.h" #include "PSVita\Network\SonyVoiceChat_Vita.h" +#include "..\..\Minecraft.World\FireworksRecipe.h" #include #include @@ -163,7 +164,7 @@ void DefineActions(void) InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_LEFT, _PSV_JOY_BUTTON_DPAD_LEFT | _360_JOY_BUTTON_LSTICK_LEFT); InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_RIGHT, _PSV_JOY_BUTTON_DPAD_RIGHT | _360_JOY_BUTTON_LSTICK_RIGHT); InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_PAGEUP, _360_JOY_BUTTON_LT); - InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_PAGEDOWN, _360_JOY_BUTTON_RT); + InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_PAGEDOWN, _360_JOY_BUTTON_BACK); InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_RIGHT_SCROLL, _PSV_JOY_BUTTON_R1); InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_LEFT_SCROLL, _PSV_JOY_BUTTON_L1); InputManager.SetGameJoypadMaps(MAP_STYLE_0,ACTION_MENU_PAUSEMENU, _PSV_JOY_BUTTON_START); @@ -297,11 +298,7 @@ int simpleMessageBoxCallback( UINT uiTitle, UINT uiText, int(*Func) (LPVOID,int,const C4JStorage::EMessageResult), LPVOID lpParam ) { - ui.RequestMessageBox( uiTitle, uiText, - uiOptionA, uiOptionC, dwPad, - Func, lpParam, app.GetStringTable(), - NULL, 0 - ); + ui.RequestErrorMessage( uiTitle, uiText, uiOptionA, uiOptionC, dwPad, Func, lpParam); return 0; } @@ -438,6 +435,7 @@ void LoadSysModule(uint16_t module, const char* moduleName) { #ifndef _CONTENT_PACKAGE printf("Error sceSysmoduleLoadModule %s failed (%d) \n", moduleName, ret ); + // are you running the debugger and don't have the Debugging/Mapping File set? - $(ProjectDir)\PSVita\configuration.psp2path #endif assert(0); } @@ -509,7 +507,7 @@ int main() // Compression::CreateNewThreadStorage(); app.loadMediaArchive(); - RenderManager.Initialise(NULL, NULL); + RenderManager.Initialise(); // Read the file containing the product codes if(app.ReadProductCodes()==FALSE) @@ -589,7 +587,7 @@ int main() ProfileManager.Initialise( s_npCommunicationConfig, app.GetCommerceCategory(),// s_serviceId, - PROFILE_VERSION_BUILD_JUNE14, + PROFILE_VERSION_CURRENT, NUM_PROFILE_VALUES, NUM_PROFILE_SETTINGS, dwProfileSettingsA, @@ -617,7 +615,7 @@ int main() byteArray baSaveThumbnail = app.getArchiveFile(L"DefaultSaveThumbnail64x64.png"); byteArray baSaveImage = app.getArchiveFile(L"DefaultSaveImage320x176.png"); - StorageManager.InitialiseProfileData(PROFILE_VERSION_BUILD_JUNE14, + StorageManager.InitialiseProfileData(PROFILE_VERSION_CURRENT, NUM_PROFILE_VALUES, NUM_PROFILE_SETTINGS, dwProfileSettingsA, @@ -667,9 +665,9 @@ int main() // debug switch to trial version //ProfileManager.SetDebugFullOverride(false); -#if 0 //ProfileManager.AddDLC(2); StorageManager.SetDLCPackageRoot("DLCDrive"); +#if 0 StorageManager.RegisterMarketplaceCountsCallback(&CConsoleMinecraftApp::MarketplaceCountsCallback,(LPVOID)&app); // Kinect ! @@ -693,7 +691,8 @@ int main() Compression::CreateNewThreadStorage(); OldChunkStorage::CreateNewThreadStorage(); Level::enableLightingCache(); - Tile::CreateNewThreadStorage(); + Tile::CreateNewThreadStorage(); + FireworksRecipe::CreateNewThreadStorage(); Minecraft::main(); Minecraft *pMinecraft=Minecraft::GetInstance(); @@ -1048,7 +1047,7 @@ int main() Vec3::resetPool(); // sceRazorCpuSync(); -#ifndef _CONTENT_PACKAGE +#if 0 //ndef _CONTENT_PACKAGE if( InputManager.ButtonDown(0, MINECRAFT_ACTION_DPAD_LEFT) ) { malloc_managed_size mmsize; diff --git a/Minecraft.Client/PSVita/Sentient/TelemetryEnum.h b/Minecraft.Client/PSVita/Sentient/TelemetryEnum.h index 77d39a39..3c120f13 100644 --- a/Minecraft.Client/PSVita/Sentient/TelemetryEnum.h +++ b/Minecraft.Client/PSVita/Sentient/TelemetryEnum.h @@ -225,5 +225,14 @@ enum ETelemetryChallenges eTelemetryTutorial_TradingMenu, eTelemetryTutorial_Enderchest, + eTelemetryTutorial_Horse, // Java 1.6.4 + eTelemetryTutorial_HorseMenu, + eTelemetryTutorial_Fireworks, + eTelemetryTutorial_FireworksMenu, + eTelemetryTutorial_Beacon, + eTelemetryTutorial_BeaconMenu, + eTelemetryTutorial_Hopper, + eTelemetryTutorial_HopperMenu, + // Sent over network as a byte }; \ No newline at end of file diff --git a/Minecraft.Client/PSVita/Sound/Minecraft.msscmp b/Minecraft.Client/PSVita/Sound/Minecraft.msscmp index a103fac1..0d0df508 100644 Binary files a/Minecraft.Client/PSVita/Sound/Minecraft.msscmp and b/Minecraft.Client/PSVita/Sound/Minecraft.msscmp differ diff --git a/Minecraft.Client/PSVita/Tutorial/Tutorial.mcs b/Minecraft.Client/PSVita/Tutorial/Tutorial.mcs new file mode 100644 index 00000000..df6af967 Binary files /dev/null and b/Minecraft.Client/PSVita/Tutorial/Tutorial.mcs differ diff --git a/Minecraft.Client/PSVita/Tutorial/Tutorial.pck b/Minecraft.Client/PSVita/Tutorial/Tutorial.pck new file mode 100644 index 00000000..edcf171d Binary files /dev/null and b/Minecraft.Client/PSVita/Tutorial/Tutorial.pck differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEA/param.sfo b/Minecraft.Client/PSVita/app/Region/SCEA/param.sfo index e1bf4c4c..ad95a296 100644 Binary files a/Minecraft.Client/PSVita/app/Region/SCEA/param.sfo and b/Minecraft.Client/PSVita/app/Region/SCEA/param.sfo differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEE/param.sfo b/Minecraft.Client/PSVita/app/Region/SCEE/param.sfo index 0483a017..b1ffcbab 100644 Binary files a/Minecraft.Client/PSVita/app/Region/SCEE/param.sfo and b/Minecraft.Client/PSVita/app/Region/SCEE/param.sfo differ diff --git a/Minecraft.Client/PSVita/app/Region/SCEJ/param.sfo b/Minecraft.Client/PSVita/app/Region/SCEJ/param.sfo index c2c21805..7a457568 100644 Binary files a/Minecraft.Client/PSVita/app/Region/SCEJ/param.sfo and b/Minecraft.Client/PSVita/app/Region/SCEJ/param.sfo differ diff --git a/Minecraft.Client/PSVitaMedia/Media/languages.loc b/Minecraft.Client/PSVitaMedia/Media/languages.loc index 88e0f4cc..9d950e01 100644 Binary files a/Minecraft.Client/PSVitaMedia/Media/languages.loc and b/Minecraft.Client/PSVitaMedia/Media/languages.loc differ diff --git a/Minecraft.Client/PSVitaMedia/Media/media.txt b/Minecraft.Client/PSVitaMedia/Media/media.txt index 46783c21..ef819833 100644 --- a/Minecraft.Client/PSVitaMedia/Media/media.txt +++ b/Minecraft.Client/PSVitaMedia/Media/media.txt @@ -1,5 +1,4 @@ languages.loc -Tutorial.pck skinVita.swf DLCOffersMenuVita.swf DefaultOptionsImage320x176.png diff --git a/Minecraft.Client/PSVitaMedia/Media/skinVita.swf b/Minecraft.Client/PSVitaMedia/Media/skinVita.swf index f014ea56..7389d17a 100644 Binary files a/Minecraft.Client/PSVitaMedia/Media/skinVita.swf and b/Minecraft.Client/PSVitaMedia/Media/skinVita.swf differ diff --git a/Minecraft.Client/PSVitaMedia/Minecraft.Client.self b/Minecraft.Client/PSVitaMedia/Minecraft.Client.self new file mode 100644 index 00000000..87b46526 Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Minecraft.Client.self differ diff --git a/Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.mcs b/Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.mcs new file mode 100644 index 00000000..df6af967 Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.mcs differ diff --git a/Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.pck b/Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.pck new file mode 100644 index 00000000..edcf171d Binary files /dev/null and b/Minecraft.Client/PSVitaMedia/Tutorial/Tutorial.pck differ diff --git a/Minecraft.Client/PSVitaMedia/loc/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/AdditionalStrings.xml index 069c0c9b..9834da86 100644 --- a/Minecraft.Client/PSVitaMedia/loc/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/AdditionalStrings.xml @@ -61,9 +61,17 @@ Your Options file is corrupt and needs to be deleted. - + + + + Delete options file. + + + + Retry loading options file. + - + Your Save Cache file is corrupt and needs to be deleted. diff --git a/Minecraft.Client/PSVitaMedia/loc/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/EULA.xml index c4450ee9..42a075b4 100644 --- a/Minecraft.Client/PSVitaMedia/loc/EULA.xml +++ b/Minecraft.Client/PSVitaMedia/loc/EULA.xml @@ -1,7 +1,7 @@ - - + + - Minecraft: PlayStation®Vita Edition - TERMS OF USE + Minecraft: PlayStation®Vita Edition - TERMS OF USE These Terms set out some rules for using Minecraft: PlayStation®Vita Edition ("Minecraft"). In order to protect Minecraft and the members of our community, we need these terms to set out some rules for downloading and using Minecraft. We don't like rules any more than you do, so we have tried to keep this as short as possible but if you buy, download, use or play Minecraft, you are agreeing to stick to these terms ("Terms"). Before we get going there is one thing we want to make really clear. Minecraft is a game that allows players to build and break things. If you play with other people (multiplayer) you can build with them or you can break what they have been building - and they can do the same to you. So don't play with other people if they don't behave like you want them to. Also sometimes people do things that they shouldn't. We don't like it but there is not a lot we can do to stop it except ask that everyone behaves properly. We rely on you and others like you in the community to let us know if someone isn’t behaving properly and if that is the case and / or you think someone is breaching the rules or these Terms or using Minecraft improperly please do tell us. We have a flagging / reporting system for doing that so please use it and we will do what is necessary to deal with it. To flag or report any issues please email us at support@mojang.com and give us as much information as you can such as the user's details and what has happened. @@ -15,10 +15,10 @@ ...and so that we are crystal clear, what we have made includes, but is not limited to, the client or the server software for Minecraft. It also includes modified versions of a Game, part of it or anything else we've made. Otherwise we are quite relaxed about what you do - in fact we really encourage you to do cool stuff (see below) - but just don't do those things that we say you can't. USING MINECRAFT - • You have bought Minecraft so you can use it, yourself, on your PlayStation®Vita system . + • You have bought Minecraft so you can use it, yourself, on your PlayStation®Vita system. • Below we also give you limited rights to do other things but we have to draw a line somewhere or else people will go too far. If you wish to make something related to anything we've made we're humbled, but please make sure that it can't be interpreted as being official and that it complies with these Terms and above all do not make commercial use of anything we've made. • The permission we give you to use and play Minecraft can be revoked if you break these Terms. - • When you buy Minecraft, we give you permission to install Minecraft on your own PlayStation®Vita system and use and play it on that PlayStation®Vita system as set out in these Terms. This permission is personal to you, so you are not allowed to distribute Minecraft (or any part of it) to anyone else (except as expressly permitted by us of course). + • When you buy Minecraft, we give you permission to install Minecraft on your own PlayStation®Vita system and use and play it on that PlayStation®Vita system as set out in these Terms. This permission is personal to you, so you are not allowed to distribute Minecraft (or any part of it) to anyone else (except as expressly permitted by us of course). • Within reason you're free to do whatever you want with screenshots and videos of Minecraft. By "within reason" we mean that you can't make any commercial use of them or do things that are unfair or adversely affect our rights. Also, don't just rip art resources and pass them around, that's no fun. • Essentially the simple rule is do not make commercial use of anything we've made unless specifically agreed by us, either in our brand and asset usage guidelines or under these Terms. Oh and if the law expressly allows it, such as under a "fair use" or "fair dealing" doctrine then that's ok too – but only to the extent that the law says so. OWNERSHIP OF MINECRAFT AND OTHER THINGS @@ -55,7 +55,7 @@ • the views expressed in any User Content are the views of the individual authors or creators and not us or anyone connected with us unless we specify otherwise; • we are not responsible for (and make no warranty or representation in relation to and disclaim all liability for) all User Content including any comments, views or remarks expressed in it; • by using Minecraft you acknowledge that we have no responsibility to review the content of any User Content and that all User Content is made available on the basis that we are not required to and do not exercise any control or judgement over it. - HOWEVER we (or our licensees like Sony Computer Entertainment) may remove, reject or suspend access to any User Content and remove or suspend your ability to post, make available or access User Content – including removing or suspending access to Minecraft or the "PSN" if we consider it is appropriate to do so, such as because you have breached these Terms or we receive a complaint. We will also act expeditiously to remove or disable access to User Content if and when we have actual knowledge of it being unlawful. + HOWEVER we (or our licensees like Sony Computer Entertainment) may remove, reject or suspend access to any User Content and remove or suspend your ability to post, make available or access User Content – including removing or suspending access to Minecraft or "PSN" if we consider it is appropriate to do so, such as because you have breached these Terms or we receive a complaint. We will also act expeditiously to remove or disable access to User Content if and when we have actual knowledge of it being unlawful. UPGRADES • We might make upgrades and updates available from time to time, but we don't have to. We are also not obliged to provide ongoing support or maintenance of any game. Of course, we hope to continue to release new updates for Minecraft, we just can't guarantee that we will do so. OUR LIABILITY @@ -66,7 +66,7 @@ • ANY BREACH OF THESE TERMS BY YOU; • ANY BREACH OF ANY TERMS BY ANY OTHER PERSON. TERMINATION - • If we want we can terminate your right to use Minecraft if you breach these Terms. You can terminate it too, at any time, all you have to do is uninstall Minecraft from your PlayStation®Vita system . In any case the paragraphs about "Ownership of Minecraft", "Our Liability" and "General Stuff" will continue to apply even after termination. + • If we want we can terminate your right to use Minecraft if you breach these Terms. You can terminate it too, at any time, all you have to do is uninstall Minecraft from your PlayStation®Vita system. In any case the paragraphs about "Ownership of Minecraft", "Our Liability" and "General Stuff" will continue to apply even after termination. GENERAL STUFF • These Terms are subject to any legal rights you might have. Nothing in these Terms will limit any of your rights that may not be excluded under law nor shall it exclude or limit our liability for death or personal injury resulting from our negligence nor any fraudulent representation. • We may also change these Terms from time to time but those changes will only be effective to the extent that they can legally apply. For example if you only use Minecraft in single player mode and don't use the updates we make available then the old EULA applies but if you do use the updates or use parts of Minecraft that rely on our providing ongoing online services then the new EULA will apply. In that case we may not be able to / don't need to tell you about the changes for them to have effect so you should check back here from time to time so you are aware of any changes to these Terms. We're not going to be unfair about this though - but sometimes the law changes or someone does something that affects other users of Minecraft and we therefore need to put a lid on it. @@ -80,13 +80,18 @@ SE-11853 Stockholm Sweden - Organization number: 556819-2388 + Organization number: 556819-2388 + - Any content purchased in an in-game store will be purchased from Sony Network Entertainment Europe Limited ("SNEE") and be subject to Sony Entertainment Network Terms of Service and User Agreement which is available on the PlayStation®Store. Please check usage rights for each purchase as these may differ from item to item. Unless otherwise shown, content available in any in-game store has the same age rating as the game. + + Any content purchased in an in-game store will be purchased from Sony Network Entertainment Europe Limited ("SNEE") and be subject to Sony Entertainment Network Terms of Service and User Agreement which is available on the PlayStation®Store. Please check usage rights for each purchase as these may differ from item to item. Unless otherwise shown, content available in any in-game store has the same age rating as the game. + - Purchase and use of items are subject to the Network Terms of Service and User Agreement. This online service has been sublicensed to you by Sony Computer Entertainment America. + + Purchase and use of items are subject to the Network Terms of Service and User Agreement. This online service has been sublicensed to you by Sony Computer Entertainment America. + Remember: Use of this software is subject to the Software Usage Terms at eu.playstation.com/legal. diff --git a/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsPlatformSpecific.xml index 2bb3b9a1..bda7b453 100644 --- a/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/4J_stringsPlatformSpecific.xml @@ -1,50 +1,50 @@  - - Der er ikke nok plads på dit systemlager til at oprette et gemt spil. - - - Du er blevet sendt tilbage til startskærmen, fordi du loggede ud af "PSN" + + Det lykkedes ikke at gemme indstillingerne til din Sony Entertainment Network-konto. - - Spillet er blevet afbrudt, fordi du loggede ud af "PSN" + + Sony Entertainment Network-kontoproblem - - Ikke logget ind. + + Der opstod et problem i forsøget på at tilgå din Sony Entertainment Network-konto. Du kan ikke få dit trophy i øjeblikket. - - Dette spil har funktioner, der kræver, at du skal have forbindelse til "PSN", men du er offline i øjeblikket. + + Dette er prøveversionen af Minecraft: PlayStation®3 Edition. Hvis du havde haft den komplette version af spillet, ville du have fået et trophy! +Lås op for den komplette version af spillet for at opleve det fulde omfang af Minecraft: PlayStation®3 Edition og spille med dine venner over hele verden på "PSN". +Vil du låse op for det komplette spil? - - Ad hoc-netværk offline. + + Opret forbindelse til Ad hoc-netværk Dette spil har funktioner, der kræver en Ad hoc-netværksforbindelse, men du er offline i øjeblikket. - - Denne funktion kræver, at du er logget ind på "PSN". - - - Tilslut til "PSN" - - - Opret forbindelse til Ad hoc-netværk + + Ad hoc-netværk offline. Trophy-problem - - Der opstod et problem i forsøget på at tilgå din Sony Entertainment Network-konto. Du kan ikke få dit trophy i øjeblikket. + + Spillet er blevet afbrudt, fordi du loggede ud af "PSN" - - Sony Entertainment Network-kontoproblem + + Du er blevet sendt tilbage til startskærmen, fordi du loggede ud af "PSN" - - Det lykkedes ikke at gemme indstillingerne til din Sony Entertainment Network-konto. + + Der er ikke nok plads på dit systemlager til at oprette et gemt spil. - - Dette er prøveversionen af Minecraft: PlayStation®3 Edition. Hvis du havde haft den komplette version af spillet, ville du have fået et trophy! -Lås op for den komplette version af spillet for at opleve det fulde omfang af Minecraft: PlayStation®3 Edition og spille med dine venner over hele verden på "PSN". -Vil du låse op for det komplette spil? + + Ikke logget ind. + + + Tilslut til "PSN" + + + Denne funktion kræver, at du er logget ind på "PSN". + + + Dette spil har funktioner, der kræver, at du skal have forbindelse til "PSN", men du er offline i øjeblikket. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/da-DA/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/AdditionalStrings.xml index 26d24a9a..a877ed86 100644 --- a/Minecraft.Client/PSVitaMedia/loc/da-DA/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/AdditionalStrings.xml @@ -48,6 +48,12 @@ Filen med indstillinger er ødelagt og skal slettes. + + Slet indstillingsfil. + + + Prøv at hente indstillingsfil igen. + Cache-filen til dit gemte spil er ødelagt og skal slettes. @@ -75,6 +81,9 @@ Onlinetjenesten er deaktiveret for din Sony Entertainment Network-konto på grund af indstillingerne for forældrekontrol for en af de lokale spillere. + + Online-funktioner er deaktiveret, fordi der er en opdatering til spillet. + Der er ikke nogen tilbud på indhold, der kan hentes, til dette spil i øjeblikket. @@ -84,7 +93,4 @@ Kom og spil Minecraft: PlayStation®Vita Edition! - - Online-funktioner er deaktiveret, fordi der er en opdatering til spillet. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsGeneric.xml index 4ee6548a..88ade111 100644 --- a/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsGeneric.xml @@ -1,5178 +1,6087 @@  - - Der er nyt indhold, der kan hentes! Find det via ikonet for Minecraft-butikken i hovedmenuen. + + Skifter til offlinespil - - Du kan ændre din figurs udseende med en overfladepakke fra Minecraft-butikken. Vælg "Minecraft-butik" i hovedmenuen for at se udbuddet af varer. - + + Vent venligst, mens værten gemmer spillet - - Tilpas lysstyrken for at gøre spillet lysere eller mørkere. + + Rejser til Mørket - - Hvis du indstiller sværhedsgraden til Fredfyldt, vil din energi automatisk blive gendannet, og der kommer ingen monstre om natten! + + Gemmer spillere - - Tæm en ulv ved at give den et ben. Derefter kan du få den til at sidde eller følge efter dig. + + Tilslutter til vært - - Du kan smide genstande fra Lager-menuen ved at trykke på {*CONTROLLER_VK_A*} uden for menuen. - + + Downloader terræn - - Når du sover i en seng, spoles tiden frem til morgen. I multiplayerspil sker det kun, hvis alle spillere sover i hver sin seng samtidig. + + Forlader Mørket - - Slagt grise for at få koteletter, som du kan stege og spise for at få mere energi. + + Din seng blev væk eller var blokeret - - Få læder fra køer til at lave rustninger med. + + Du kan ikke hvile nu, der er monstre i nærheden - - Hvis du har en tom spand, kan du fylde den med mælk fra en ko, vand eller lava! + + Du sover i en seng. Hvis I vil springe frem til daggry, skal alle spillere sove i hver sin seng på samme tid. - - Kultivér jorden med et lugejern, så du kan plante frø. + + Sengen er optaget - - Edderkopperne angriber dig ikke om dagen, medmindre du angriber dem. + + Du kan kun sove om natten - - Det er hurtigere at grave i jord eller sand med en spade end med dine hænder. + + %s sover i en seng. Hvis I vil springe frem til daggry, skal alle spillere sove i hver sin seng på samme tid. - - Hvis du spiser en stegt kotelet, får du mere energi, end hvis du spiser en rå. + + Indlæser bane - - Lav fakler for at få lys om natten. Monstrene undgår områder med fakler. + + Afslutter ... - - Du kan komme hurtigere omkring i en minevogn på skinner! + + Bygger terræn - - Hvis du planter stiklinger, vokser de og bliver til træer. + + Simulerer verdenen et kort stykke tid - - Grisemænd angriber dig ikke, medmindre du angriber dem. + + Rang - - Du kan skifte dit gendannelsespunkt og springe frem til daggry ved at sove i en seng. + + Forbereder at gemme banen - - Slå ildkuglerne tilbage mod gyslingen! + + Forbereder dele ... - - Når du bygger en portal, kan du rejse til en anden dimension: Afgrunden + + Starter server - - Tryk på {*CONTROLLER_VK_B*} for at smide den genstand, som du holder i hånden! + + Forlader Afgrunden - - Find det rigtige redskab til opgaven! + + Gendanner - - Hvis ikke du kan finde kul til dine fakler, kan du altid lave kul ved at brænde træ i ovnen. + + Skaber bane - - Det er ikke en god idé at grave lige ned eller lige op. + + Opretter fremkaldelsesområde - - Du kan bruge benmel (fremstilles af skeletben) som gødning. Det får dine planter til at vokse øjeblikkeligt! + + Indlæser fremkaldelsesområde - - Snigere eksploderer, når de kommer tæt på dig! + + Rejser til Afgrunden - - Obsidian bliver skabt ved at blande vand med flydende lava. + + Redskaber og våben - - Det kan tage nogle minutter, inden den flydende lava forsvinder FULDSTÆNDIGT, når lavablokken fjernes. + + Lysstyrke - - Gyslingens ildkugler kan ikke trænge igennem brosten, så derfor er det et effektivt materiale at bruge til at beskytte portaler med. + + Spilfølsomhed - - Blokke, der kan bruges som lyskilder, smelter sne og is. Det inkluderer fakler, glødestene og græskarlygter. + + Skærmfølsomhed - - Pas på, hvis du bygger en bygning i uld udendørs, da lynnedslag kan sætte den i brand. + + Sværhedsgrad - - En enkel spand lava kan smelte 100 blokke i ovnen. + + Musik - - Materialet under toneblokken afgør, hvilket instrument der spiller. + + Lyd - - Zombier og skeletter kan overleve i dagslys, hvis de opholder sig i vand. + + Fredfyldt - - Hvis du angriber en ulv, vil andre ulve i nærheden blive fjendtlige og angribe dig. Det samme gælder for zombificerede grisemænd. + + På denne sværhedsgrad får spilleren automatisk ny energi, og der er ingen fjender i omgivelserne. - - Ulve kan ikke rejse til Afgrunden. + + På denne sværhedsgrad er der fjender i omgivelserne, men spilleren tager mindre skade end normalt. - - Ulve kan ikke angribe snigere. + + På denne sværhedsgrad er der fjender i omgivelserne, og spilleren tager normal skade. - - Høns lægger æg hvert femte til tiende minut. + + Let - - Obsidian kan kun udvindes med en diamanthakke. + + Normal - - Snigere er den lettest tilgængelige kilde til krudt. + + Svær - - Hvis du sætter to kister ved siden af hinanden, bliver de til en stor kiste. + + Logget ud - - Tamme ulve viser deres energitilstand med deres hale. Giv dem kød for at genopfriske deres energi. + + Rustning - - Kog kaktusser i ovnen for at udvinde grøn farve. + + Mekanismer - - Du kan læse om de seneste opdateringer i spillet i sektionen Nyt i Sådan spiller du-menuerne. + + Transport - - Nu kan du stable hegn oven på hinanden i spillet. + + Våben - - Nogle dyr følger efter dig, hvis du har hvede i hånden. + + Mad - - Dyr forsvinder ikke ud af spillet, med mindre de kan bevæge sig mindst 20 blokke væk i en hvilken som helst retning. + + Strukturer - - Musik af C418! + + Dekorationer - - Notch har mere end en million følgere på Twitter! + + Brygning - - Ikke alle svenskere har lyst hår. Der er endda nogle, ligesom Jens fra Mojang, der har rødt hår! + + Redskaber, våben og rustninger - - Der kommer en opdatering til spillet før eller siden! + + Materialer - - Hvem er Notch? + + Byggeblokke - - Mojang har vundet flere priser, end de har medarbejdere! + + Rødsten og transport - - Visse berømtheder spiller Minecraft! + + Diverse - - deadmau5 er vild med Minecraft! + + Placeringer: - - Kig aldrig direkte på en programfejl. + + Afslut uden at gemme - - Snigerne blev født af en programfejl. + + Er du sikker på, at du vil afslutte til hovedmenuen? Alle fremskridt, der ikke er gemt, går tabt. - - Er det en kylling, eller er det en and? + + Er du sikker på, at du vil afslutte til hovedmenuen? Dine fremskridt går tabt! - - Var du på Minecon? + + Det gemte spil er ødelagt. Vil du slette det? - - Ingen hos Mojang har nogensinde set Junkboys ansigt. + + Er du sikker på, at du vil afslutte til hovedmenuen og fjerne alle spillere fra spillet? Alle fremskridt, der ikke er gemt, går tabt. - - Vidste du, at der er en wiki for Minecraft? + + Afslut og gem - - Mojangs nye kontorer er så seje! + + Skab ny verden - - Minecon 2013 blev afholdt i Orlando, Florida, USA! + + Indtast et navn til din verden - - .party() var alt for fedt! + + Indtast seed til skabelsen af din verden - - Antag altid, at rygter er falske, snarere end at tro, at de er sande! + + Indlæs gemt verden - - {*T3*}SÅDAN SPILLER DU: DET GRUNDLÆGGENDE{*ETW*}{*B*}{*B*} -Minecraft er et spil, der handler om at bygge alt, hvad du kan forestille dig, med blokke. Om natten kommer monstrene frem, så du skal sørge for at bygge et tilflugtssted, inden det sker.{*B*}{*B*} -Se dig omkring med {*CONTROLLER_ACTION_LOOK*}.{*B*}{*B*} -Bevæg dig omkring med {*CONTROLLER_ACTION_MOVE*}.{*B*}{*B*} -Tryk på {*CONTROLLER_ACTION_JUMP*} for at hoppe.{*B*}{*B*} -Skub {*CONTROLLER_ACTION_MOVE*} frem to gange hurtigt for at spurte. Hvis du bliver ved med at skubbe {*CONTROLLER_ACTION_MOVE*} fremad, vil du fortsætte med at spurte, indtil du løber tør for spurtetid, eller madbjælken viser mindre end {*ICON_SHANK_03*}.{*B*}{*B*} -Hold {*CONTROLLER_ACTION_ACTION*} nede for at hakke og hugge med hænderne eller det redskab, som du bruger. Du får brug for et redskab for at udvinde bestemte materialer.{*B*}{*B*} -Når du holder en genstand i hånden, kan du trykke på {*CONTROLLER_ACTION_USE*} for at bruge genstanden eller trykke på {*CONTROLLER_ACTION_DROP*} for at smide den. + + Spil introduktion - - {*T3*}SÅDAN SPILLER DU: DISPLAY{*ETW*}{*B*}{*B*} -Displayet viser dig oplysninger om din status, såsom din energi, dit iltniveau, når du er under vand, din sult (du skal spise mad for at blive mæt igen) og din rustning, hvis du har nogen på. Hvis du mister energi, men har ni eller flere {*ICON_SHANK_01*} på din madbjælke, vil din energi blive gendannet automatisk. Din madbjælke bliver fyldt igen, når du spiser.{*B*} -Her finder du også erfaringsbjælken, der viser dig dit niveau i form af et tal, samt en bjælke, der viser dig, hvor mange erfaringspoint, du mangler for at stige til næste niveau. Du får erfaringspoint ved at samle erfaringskugler, når du dræber væsner, udvinder bestemte former for materialer, avler dyr, fisker og smelter malm i en ovn.{*B*}{*B*} -Du kan også se, hvilke genstande du kan bruge. Brug {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for at udskifte den genstand, du har i hånden. + + Introduktion - - {*T3*}SÅDAN SPILLER DU: LAGER{*ETW*}{*B*}{*B*} -Du kan se dit lager ved at trykke på {*CONTROLLER_ACTION_INVENTORY*}.{*B*}{*B*} -Her kan du se alle de redskaber, du har ved hånden, samt alle de genstande, du bærer rundt på. Du kan også se din rustning.{*B*}{*B*} -Brug {*CONTROLLER_MENU_NAVIGATE*} for at flytte markøren. Brug {*CONTROLLER_VK_A*} for at samle en genstand op under markøren. Hvis der er mere end en genstand, samler du dem alle sammen op, eller du kan bruge {*CONTROLLER_VK_X*} for kun at samle halvdelen op.{*B*}{*B*} -Flyt genstanden med markøren til et andet felt i lageret, og læg den på den nye plads ved hjælp af {*CONTROLLER_VK_A*}. Når der er mange genstande på markøren, kan du bruge {*CONTROLLER_VK_A*} for at placere dem alle sammen eller {*CONTROLLER_VK_X*} for at placere en enkelt.{*B*}{*B*} -Hvis du bevæger markøren over et stykke af en rustning, vil du se et tip, der forklarer, hvordan du hurtigt kan flytte denne genstand til den rigtige plads for rustninger i lageret.{*B*}{*B*} -Du kan ændre farven på din læderrustning ved at farve den, det kan du gøre fra lagermenuen ved at holde farven med din markør og trykke på {*CONTROLLER_VK_X*}, mens markøren er over det stykke, du vil farve. + + Giv din verden et navn - - {*T3*}SÅDAN SPILLER DU: KISTE{*ETW*}{*B*}{*B*} -Når du har fremstillet en kiste, kan du placere den i verdenen og åbne den med {*CONTROLLER_ACTION_USE*} for at opbevare genstande fra dit lager.{*B*}{*B*} -Flyt genstande mellem dit lager og kisten med markøren.{*B*}{*B*} -Dine genstande bliver opbevaret i kisten, så du kan hente dem igen senere. - + + Ødelagt gemt spil - - {*T3*}SÅDAN SPILLER DU: STOR KISTE{*ETW*}{*B*}{*B*} -To kister ved siden af hinanden udgør en stor kiste. Den har plads til mere.{*B*}{*B*} -Du bruger den på samme måde som en almindelig kiste. - + + OK - - {*T3*}SÅDAN SPILLER DU: FREMSTILLING{*ETW*}{*B*}{*B*} -På fremstillingsskærmen kan du kombinere forskellige genstande fra dit lager for at skabe nye redskaber og våben. Åbn fremstillingsskærmen med {*CONTROLLER_ACTION_CRAFTING*}.{*B*}{*B*} -Skift mellem fanerne øverst på skærmen ved hjælp af {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at vælge kategorien, som genstanden tilhører, og vælg derefter genstanden ved hjælp af {*CONTROLLER_MENU_NAVIGATE*}.{*B*}{*B*} -Fremstillingsområdet viser, hvilke genstande der skal bruges for at fremstille den nye genstand. Tryk på {*CONTROLLER_VK_A*} for at fremstille genstanden og placere den i dit lager. - + + Annullér - - {*T3*}SÅDAN SPILLER DU: ARBEJDSBORD{*ETW*}{*B*}{*B*} -Du kan fremstille større genstande ved hjælp af et arbejdsbord.{*B*}{*B*} -Stil bordet et sted, og tryk på {*CONTROLLER_ACTION_USE*} for at bruge det.{*B*}{*B*} -Fremstilling på bordet fungerer ligesom almindelig fremstilling, men du har et større arbejdsområde og kan derfor lave flere forskellige genstande. - + + Minecraft-butikken - - {*T3*}SÅDAN SPILLER DU: OVN{*ETW*}{*B*}{*B*} -En ovn giver dig mulighed for at bearbejde materialerne ved hjælp af ild. Du kan eksempelvis støbe jernbarer ud af jernmalm i ovnen.{*B*}{*B*} -Stil ovnen et sted, og tryk på {*CONTROLLER_ACTION_USE*} for at bruge den.{*B*}{*B*} -Du skal fylde brændsel i ovnens nederste felt og materialet, du vil bearbejde, i det øverste. Så bliver ovnen tændt, og den går i gang med at bearbejde materialet.{*B*}{*B*} -Når materialet er færdigt, kan du flytte det fra resultatfeltet og over i dit lager.{*B*}{*B*} -Hvis du holder markøren over et materiale, der kan bruges som ingrediens eller brændsel i ovnen, får du vist et tip, der hjælper dig med at flytte materialet hurtigt over i ovnen. - + + Rotér - - {*T3*}SÅDAN SPILLER DU: AUTOMAT{*ETW*}{*B*}{*B*} -En automat kan skyde med forskellige genstande. Du skal bruge en kontakt, fx et håndtag, ved siden af automaten for at aktivere den.{*B*}{*B*} -Tryk på {*CONTROLLER_ACTION_USE*} for at åbne automaten, og flyt genstandene fra dit lager, som du vil fylde den med.{*B*}{*B*} -Når du derefter bruger kontakten, skyder automaten en genstand ud. - + + Skjul - - {*T3*}SÅDAN SPILLER DU: BRYGNING{*ETW*}{*B*}{*B*} -For at kunne brygge eliksirer skal du have et bryggestativ, og det kan du bygge på dit arbejdsbord. Alle eliksirer indeholder en flaske vand som grundelement, og den fremstiller du ved at fylde en glasflaske med vand fra en gryde eller en vandkilde.{*B*} -Bryggestativet har plads til tre flasker og kan fremstille tre eliksirer ad gangen. Du kan bruge en enkelt ingrediens i alle tre flasker, så sørg altid for at brygge tre eliksirer ad gangen for at få mest muligt ud af dine ressourcer.{*B*} -Når du putter en ingrediens i bryggestativets øverste felt, vil der blive fremstillet en grundeliksir efter et kort stykke tid. Grundeliksiren gør ikke noget i sig selv, men hvis du kombinerer den med en ingrediens mere, får den efterfølgende eliksir en effekt, som du kan bruge til noget.{*B*} -Herefter kan du tilføje en tredje ingrediens for at få effekten til at vare længere (med støv fra rødstens), blive kraftigere (med støv fra glødesten) eller gøre eliksiren giftig (med et gæret edderkoppeøje).{*B*} -Du kan tilføje krudt til eliksiren for at lave den til en kasteeliksir. Kasteeliksirer påvirker et område inden for en radius af, hvor den lander.{*B*} - -Grundingredienserne til eliksirer er:{*B*}{*B*} -* {*T2*}Afgrundsurt{*ETW*}{*B*} -* {*T2*}Edderkoppeøje{*ETW*}{*B*} -* {*T2*}Sukker{*ETW*}{*B*} -* {*T2*}Gyslingtåre{*ETW*}{*B*} -* {*T2*}Flammeåndpulver{*ETW*}{*B*} -* {*T2*}Magmacreme{*ETW*}{*B*} -* {*T2*}Glimmermelon{*ETW*}{*B*} -* {*T2*}Støv fra rødsten{*ETW*}{*B*} -* {*T2*}Støv fra glødesten{*ETW*}{*B*} -* {*T2*}Gæret edderkoppeøje{*ETW*}{*B*}{*B*} - -Du bliver nødt til at eksperimentere med forskellige kombinationer af ingredienser for at finde alle de forskellige slags eliksirer, som du kan lave. - + + Ryd alle pladser - - {*T3*}SÅDAN SPILLER DU: FORTRYLLELSE{*ETW*}{*B*}{*B*} -Du kan fortrylle redskaber, våben, rustninger og bøger ved at bruge de erfaringspoint, du får, når du dræber væsner eller udvinder og bearbejder bestemte materialer i ovnen.{*B*} -Når du placerer et sværd, en bue, økse, hakke, skovl, rustning eller bog i feltet under bogen på fortryllelsesbordet, vil de tre knapper til højre for pladsen vise nogle fortryllelser samt deres omkostninger i erfaringsniveau.{*B*} -Hvis dit erfaringsniveau ikke er højt nok til at bruge dem, vil omkostningerne stå med rødt, og ellers står de med grønt.{*B*}{*B*} -Selve fortryllelsen bliver valgt tilfældigt ud fra omkostningen.{*B*}{*B*} -Hvis fortryllelsesbordet er omgivet af bogreoler (op til 15 bogreoler) med et mellemrum på en blok mellem bogreol og fortryllelsesbord, bliver effekten af fortryllelsen kraftigere, og der vil strømme mystiske glyffer fra bøgerne og ned på fortryllelsesbordet.{*B*}{*B*} -Du kan finde alle ingredienserne til et fortryllelsesbord i landsbyerne rundt omkring eller ved at grave i miner og kultivere verdenen.{*B*}{*B*} -Du kan bruge fortryllede bøger med ambolten for at fortrylle genstande. Det giver dig mere kontrol over hvilke fortryllelser, du vil påføre dine genstande.{*B*} + + Er du sikker på, at du vil afslutte dit nuværende spil og slutte dig til et nyt? Alle fremskridt, der ikke er gemt, går tabt. - - {*T3*}SÅDAN SPILLER DU: HUSDYR{*ETW*}{*B*}{*B*} -Hvis du vil sørge for at holde dine dyr samlet på et sted, skal du bygge et indhegnet område på mindre end 20 gange 20 blokke og placere dine dyr inden for det. Så sikrer du dig, at de også er der, når du kommer tilbage for at se til dem. - + + Er du sikker på, at du vil overskrive de tidligere gemte spil fra denne verden med den nuværende version af denne verden? - - {*T3*}SÅDAN SPILLER DU: DYREAVL{*ETW*}{*B*}{*B*} -Hvis du holder husdyr i Minecraft, kan de få unger!{*B*} -Hvis du vil have dyrene til at parre sig, skal du sørge for at give dem det rigtige foder, så de bliver "elskovssyge".{*B*} -Hvis du giver hvede til køer, muhsvampe eller får, gulerødder til en gris, hvedefrø eller afgrundsurt til høns og kød til ulve, vil de begynde at se sig om efter en mage i nærheden, som også er elskovssyg.{*B*} -Når to elskovssyge dyr af samme art møder hinanden, kysser de hinanden i et par sekunder, hvorefter en dyreunge dukker op. Dyreungen følger efter sine forældre, indtil den selv har vokset sig stor.{*B*} -Når et dyr har været elskovssygt, skal der gå op til fem minutter, inden det kan blive det igen.{*B*} -Der er en grænse for antallet af dyr, der kan være i en verden, så du vil muligvis opdage, at dyrene ikke parrer sig, når du har mange af dem. + + Er du sikker på, at du vil afslutte uden at gemme? Du mister alle dine fremskridt i denne verden! - - {*T3*}SÅDAN SPILLER DU: PORTAL TIL AFGRUNDEN {*ETW*}{*B*}{*B*} -Med en portal til Afgrunden kan du rejse mellem Oververdenen og Afgrunden. Du kan rejse gennem Afgrunden for at skyde genvej i Oververdenen. Når du bevæger dig en blok frem i Afgrunden, svarer det til, at du bevæger dig tre blokke frem ovenpå. Så hvis du bygger en portal i Afgrunden og går igennem den, vil du vende tilbage til Oververdenen tre gange så langt væk fra det punkt, hvor du forlod den.{*B*}{*B*} -Du skal bruge mindst ti blokke af obsidian for at kunne bygge portalen, som skal være fem blokke høj, fire blokke bred og en blok dyb. Når rammen om portalen er bygget, skal du sætte ild til den for at aktivere den. Det kan du gøre ved hjælp af et fyrtøj eller andre genstande, der kan lave ild.{*B*}{*B*} -Billederne til højre viser eksempler på portalkonstruktioner. - + + Start spil - - {*T3*}SÅDAN SPILLER DU: BLOKÉR BANER{*ETW*}{*B*}{*B*} -Hvis du finder anstødeligt indhold i den bane, du spiller, kan du vælge at føje den til din liste over blokerede baner. -For at gøre dette skal du åbne pausemenuen og trykke på {*CONTROLLER_VK_RB*} for at vælge Blokér bane-tippet. -Hvis du derefter forsøger at tilslutte til banen igen, vil du blive mindet om, at den befinder sig på din liste over blokerede baner, hvorefter du får muligheden for at annullere eller fjerne den fra listen og fortsætte. + + Afslut spil - - {*T3*}SÅDAN SPILLER DU: INDSTILLINGER FOR VÆRT OG SPILLER{*ETW*}{*B*}{*B*} - -{*T1*}Indstillinger for spillet{*ETW*}{*B*} -Når du indlæser eller opretter en verden, kan du trykke på knappen "Flere indstillinger" for at åbne menuen, der giver dig mere kontrol over dine spil.{*B*}{*B*} - - {*T2*}Spiller mod spiller{*ETW*}{*B*} -Når denne funktion er slået til, kan spillerne påføre hinanden skade. Denne indstilling påvirker kun spil i Overlevelse.{*B*}{*B*} - - {*T2*}Stol på spillerne{*ETW*}{*B*} -Når denne funktion er slået fra, er der begrænsninger for, hvad andre spillere kan gøre. De kan ikke udvinde materialer eller bruge genstande, døre, kontakter og beholdere, placere blokke eller angribe spillere og dyr. Du kan ændre indstillinger for udvalgte spillere ved hjælp af menuen i menuen i spillet.{*B*}{*B*} - - {*T2*}Ilden spreder sig{*ETW*}{*B*} -Når denne funktion er slået til, kan ilden sprede sig til brandbare blokke i nærheden. Du kan slå denne funktion til eller fra inde i spillet.{*B*}{*B*} - - {*T2*}TNT eksploderer{*ETW*}{*B*} -Når denne funktion er slået til, eksploderer TNT, når det detoneres. Du kan slå denne funktion til eller fra inde i spillet.{*B*}{*B*} - - {*T2*}Værtsprivilegier{*ETW*}{*B*} -Når denne funktion er slået til, kan værten slå flyveevnen til og fra, slå udmattelse fra og gøre sig usynlig fra menuen i spillet. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} - -{*T1*}Indstillinger for skabelse af verden{*ETW*}{*B*} -Når du skaber en ny verden, får du nogle ekstra valgmuligheder.{*B*}{*B*} - - {*T2*}Opret strukturer{*ETW*}{*B*} -Når denne funktion er slået til, bliver der oprettet strukturer som landsbyer og fæstninger i verdenen.{*B*}{*B*} - - {*T2*}Helt flad verden{*ETW*}{*B*} -Når denne funktion er slået til, bliver der skabt en helt flad verden i Oververdenen og Afgrunden.{*B*}{*B*} - - {*T2*}Bonuskiste{*ETW*}{*B*} -Når denne funktion er slået til, bliver der skabt en kiste med nyttige genstande i nærheden af spillerens gendannelsespunkt.{*B*}{*B*} - - {*T2*}Gendan Afgrunden{*ETW*}{*B*} -Når denne funktion er slået til, bliver Afgrunden gendannet. Det er nyttigt, hvis du har et ældre gemt spil, hvor afgrundsfortet ikke var til stede.{*B*}{*B*} - -{*T1*}Indstillinger inde i spillet{*ETW*}{*B*} -Du kan få adgang til flere indstillinger inde i spillet ved at trykke på {*BACK_BUTTON*} for at åbne menuen.{*B*}{*B*} - - {*T2*}Indstillinger for vært{*ETW*}{*B*} -Værtsspilleren og spillere med moderatorrettigheder kan få adgang til menuen "Værtsindstillinger". I denne menu kan du slå spredning af ild og TNT-eksplosioner til og fra.{*B*}{*B*} - -{*T1*}Indstillinger for spiller{*ETW*}{*B*} -Du kan ændre en spillers privilegier ved at vælge vedkommendes navn og trykke på {*CONTROLLER_VK_A*} for at åbne menuen for spillerprivilegier, hvor du kan vælge følgende funktioner.{*B*}{*B*} - - {*T2*}Kan bygge og udvinde materialer{*ETW*}{*B*} -Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne indstilling er slået til, kan spilleren interagere med verden som normalt. Når denne funktion er slået fra, kan spilleren ikke længere placere eller ødelægge blokke eller interagere med mange andre genstande og blokke.{*B*}{*B*} - - {*T2*}Kan bruge døre og kontakter{*ETW*}{*B*} -Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne funktion er slået fra, kan spilleren ikke bruge døre og kontakter.{*B*}{*B*} - - {*T2*}Kan åbne beholdere{*ETW*}{*B*} -Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne funktion er slået fra, kan spilleren ikke åbne beholdere, såsom kister.{*B*}{*B*} - - {*T2*}Kan angribe spillere{*ETW*}{*B*} -Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne funktion er slået fra, kan spilleren forårsage skade på andre spillere.{*B*}{*B*} - - {*T2*}Kan angribe dyr{*ETW*}{*B*} -Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne funktion er slået fra, kan spilleren forårsage skade på dyr.{*B*}{*B*} - - {*T2*}Moderator{*ETW*}{*B*} -Når denne funktion er slået til, og hvis "Stol på spillere" er slået fra, kan spilleren ændre privilegier for andre spillere (undtagen værten) og smide spillere ud, og vedkommende kan også slå spredning af ild og TNT-eksplosioner til eller fra.{*B*}{*B*} - - {*T2*}Smid spiller ud{*ETW*}{*B*} -{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - -{*T1*}Indstillinger for værtsspiller{*ETW*}{*B*} -Hvis "Værtsprivilegier" er slået til, kan værtsspilleren ændre visse privilegier for sig selv. Du kan ændre privilegier for en spiller ved at vælge vedkommendes navn og trykke på {*CONTROLLER_VK_A*} for at åbne menuen for spillerprivilegier, hvor du kan vælge følgende indstillinger.{*B*}{*B*} - - {*T2*}Kan flyve{*ETW*}{*B*} -Når denne indstilling er slået til, kan spilleren flyve. Denne indstilling er kun relevant i spiltypen Overlevelse, eftersom flyveevnen er slået til automatisk for alle spillere i Kreativ.{*B*}{*B*} - - {*T2*}Slå udmattelse fra{*ETW*}{*B*} -Denne indstilling påvirker kun Overlevelse. Når den er slået til, vil fysiske aktiviteter (bevægelse/løb/hop osv.) ikke reducere madbjælken. Men hvis spilleren bliver såret, vil madbjælken langsomt blive reduceret, mens spillerens energi gendannes.{*B*}{*B*} - - {*T2*}Usynlig{*ETW*}{*B*} -Når denne funktion er slået til, er spilleren usynlig for andre spillere og usårlig.{*B*}{*B*} - - {*T2*}Kan teleportere{*ETW*}{*B*} -Dette gør det muligt for spilleren at flytte spillere eller sig selv hen til andre spillere i verden. + + Gem spil - - Næste side + + Afslut uden at gemme - - Forrige side + + Tryk på START-knappen for at deltage i spillet - - Det grundlæggende + + Hurra – du har låst op for et billede af Steve fra Minecraft! - - Display + + Hurra – du har låst op for et billede af en sniger fra Minecraft! - - Lager + + Lås op for det komplette spil - - Kister + + Du kan ikke deltage i dette spil, da værten spiller en nyere version af spillet. - - Fremstilling + + Ny verden - - Ovn + + Belønning oplåst! - - Automat + + Du spiller prøveversionen, men du skal købe det komplette spil for at kunne gemme dit spil. +Vil du låse op for det komplette spil nu? - - Husdyr + + Venner - - Dyreavl + + Mine point - - Brygning + + Sammenlagt - - Fortryllelse + + Vent venligst - - Portal til Afgrunden + + Ingen resultater - - Multiplayer + + Filter: - - Sådan deler du billeder + + Du kan ikke deltage i dette spil, da værten spiller en ældre version af spillet. - - Blokér baner + + Forbindelsen blev afbrudt - - Kreativ + + Forbindelsen til serveren blev afbrudt. Afslutter til hovedmenuen. - - Indstillinger for vært og spiller + + Serveren afbrød forbindelsen - - Handel + + Afslutter spillet - - Ambolt + + Der opstod en fejl. Afslutter til hovedmenuen. - - Mørket + + Kunne ikke oprette forbindelse - - {*T3*}SÅDAN SPILLER DU: MØRKET{*ETW*}{*B*}{*B*} -Mørket er en anden dimension i spillet, som du kan rejse til gennem en Mørket-portal. Du kan finde portalen til Mørket i en fæstning, som ligger dybt under jorden i Oververdenen.{*B*} -Du skal placere et mørkeøje i rammen af en portal til Mørket for at aktivere den.{*B*} -Når portalen er aktiveret, kan du hoppe ind i den og rejse til Mørket.{*B*}{*B*} -I Mørket møder du mørkedragen, som er en vild og mægtig fjende, samt masser af mørkemænd, så du skal sørge for at være forberedt til kamp, inden du rejser dertil!{*B*}{*B*} -Hvis du kigger godt efter, vil du se, at der er otte obsidianspir med mørkekrystaller ovenpå, som mørkedragen bruger til at hele sig selv med. Første trin i kampen er derfor at ødelægge dem.{*B*} -De første par stykker kan du ramme med pile, men de sidste er beskyttet af et jernbur, så derfor skal du bygge en vej op til dem.{*B*}{*B*} -Mens du gør det, flyver mørkedragen rundt om dig og angriber med mørkesyre!{*B*} -Hvis du nærmer dig æggepodiet i midten af piggene, kommer mørkedragen ned for at angribe dig, og her har du virkelig chancen for at skade den!{*B*} -Undgå mørkedragens syreånde, og sigt på dens øjne for at skade den mest muligt. Hvis du har mulighed for det, er det en god idé at tage nogle venner med til Mørket, som kan hjælpe dig med kampen!{*B*}{*B*} -Når du er rejst til Mørket, kan dine venner se på deres kort, hvor Mørke-portalen er placeret i deres respektive fæstninger, så de nemt kan finde hen til dig. + + Du blev smidt ud af spillet - - Spurt + + Værten har forladt spillet. - - Nyt + + Du kan ikke deltage i dette spil, fordi du ikke er venner med nogen i spillet. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Ændringer og tilføjelser{*ETW*}{*B*}{*B*} -– Tilføjede nye genstande – Smaragd, smaragd-malm, mørkekiste, snubletrådskrog, fortryllet guldæble, ambolt, blomsterkrukke, mure af brosten, mosbeklædte mure af brosten, visnemaling, kartoffel, bagt kartoffel, giftig kartoffel, gulerod, guldgulerod, gulerod på en fiskestang,Græskartærte, nattesynseliksir, usynlighedseliksir, afgrundskvarts, afgrundskvartsmalm, blok af kvarts, flise af kvarts, trappe af kvarts, tilhugget blok af kvarts, søjle af kvarts, fortryllet bog og tæppe.{*B*}– Tilføjede nye opskrifter for glat sandsten og tilhugget sandsten.{*B*}– Tilføjede nye væsner - Zombie-landsbyboer.{*B*}– Tilføjede nye funktioner til fremstilling af terræn – ørkentempler, ørkenlandsbyer, jungletempler.{*B*}– Tilføjede handel med landsbyboere.{*B*}– Tilføjede amboltskærm.{*B*}– Farvning af læderrustninger.{*B*}– Farvning af halsbånd til ulve.{*B*}– Styring af gris med en gulerod på en fiskestang.{*B*}– Opdaterede indhold i bonuskisten med flere genstande.{*B*}– Ændrede placering af halve blokke og andre blokke på halve blokke.{*B*}– Ændrede placering af omvendte trapper og fliser.{*B*}– Tilføjede erhverv for landsbyboere.{*B*}– Landsbyboere, der bliver fremkaldt med et fremkalde-æg, vil få et tilfældigt erhverv.{*B*}– Tilføjede sidelæns placering af træstamme.{*B*}– Træredskaber fungerer som brændsel i ovnen.{*B*}– Ruder af is og glas kan samles op med redskaber, der er fortryllet med silketryk.{*B*}– Træknapper og trætrykplader kan aktivers med pile.{*B*}– Afgrundsvæsner kan dukke op i Oververdenen via portaler.{*B*}– Snigere og edderkopper er aggressive overfor den seneste spiller, der angreb dem.{*B*}– Væsner i Kreativ bliver neutrale igen efter et stykke tid.{*B*}– Fjernede tilbageslag ved druknedød.{*B*}– Døre, der ødelægges af zombier, viser ikke længere skade.{*B*}– Is smelter i Afgrunden.{*B*}– Gryder bliver fyldt med vand, når de står udenfor i regnvejr.{*B*}– Det tager dobbelt så lang tid at opdatere stempler.{*B*}– Grisen smider sadlen, når den dør (hvis den havde en på).{*B*}– Himlens farve er ændret i Afgrunden.{*B*}– Snore kan erstattes (i snubletråde).{*B*}– Regnen drypper gennem blade.{*B*}– Håndtag kan placeres nederst på blokke.{*B*}– TNT gør varierende skade afhængig af sværhedsgraden.{*B*}– Opskriften for bøger er ændret.{*B*}– Båden ødelægger åkander i stedet for omvendt.{*B*}– Grise efterlader flere koteletter.{*B*}– Slim opstår sjældnere i helt flade verdener.{*B*}– Skaden og tilbageslagskraften fra snigere varierer efter sværhedsgraden.{*B*}– Rettede fejl, så mørkemænd ikke åbner kæben.{*B*}– Tilføjede teleportation af spillere (ved hjælp af {*BACK_BUTTON*}-menuen i spillet).{*B*}– Tilføjede nye værtsmuligheder for aktivering af flyveevne, usynlighed og usårlighed for fjernspillere.{*B*}– Føjede nye introduktioner til i Introduktionsverdenen for nye genstande og funktioner.{*B*}– Opdaterede placeringen af musikpladerne Introduktionsverdenen.{*B*} - + + Du kan ikke deltage i dette spil, fordi du tidligere er blevet smidt ud af værten. - - {*ETB*}Velkommen tilbage! Du har muligvis ikke lagt mærke til det, men Minecraft er lige blevet opdateret.{*B*}{*B*} -Der er masser af nye funktioner, som du og dine venner kan se frem til at bruge i spillet. Her giver vi dig bare et par af højdepunkterne. Læs mere om nyhederne, og skynd dig så ind i spillet!{*B*}{*B*} -{*T1*}Nye genstande{*ETB*} – Smaragd, smaragd-malm, mørkekiste, snubletrådskrog, fortryllet guldæble, ambolt, blomsterkrukke, mure af brosten, mosbeklædte mure af brosten, visnemaling, kartoffel, bagt kartoffel, giftig kartoffel, gulerod, guldgulerod, gulerod på en fiskestang, -Græskartærte, nattesynseliksir, usynlighedseliksir, afgrundskvarts, afgrundskvartsmalm, blok af kvarts, flise af kvarts, trappe af kvarts, tilhugget blok af kvarts, søjle af kvarts, fortryllet bog og tæppe.{*B*}{*B*} -{*T1*}Nye væsner{*ETB*} – Zombie-landsbyboere.{*B*}{*B*} -{*T1*}Nye funktioner{*ETB*} – Du kan handle med landsbyboer, reparere eller fortrylle våben og redskaber med en ambolt, opbevare ting i en mørkekiste, styre en gris, mens du ridder på den, ved hjælp af en gulerod på en fiskestang!{*B*}{*B*} -{*T1*}Nye mini-introduktioner{*ETB*} – Lær, hvordan du bruger de nye funktioner i introduktionsverdenen!{*B*}{*B*} -{*T1*}Nye "påskeæg"{*ETB*} – Vi har flyttet alle musikpladerne over i introduktionsverden. Kan du finde dem igen?{*B*}{*B*} + + Du blev smidt ud af spillet, fordi du fløj - - Gør mere skade end næver. + + Det tog for lang tid at oprette forbindelse - - Grav i jord, græs, sand, grus og sne hurtigere end med hænderne. Der skal bruges skovle for at grave snebolde op. + + Serveren er fyldt - - Kræves for at udvinde forskellige former for stenblokke og malm. + + På denne sværhedsgrad er der fjender i omgivelserne, og spilleren tager stor skade. Pas godt på snigerne – de stopper ikke deres eksplosionsangreb, selvom du går væk fra dem! - - Hug forskellige former for træ hurtigere end med hænderne. + + Temaer - - Opdyrk blokke med græs og jord for at gøre plads til afgrøder. + + Overfladepakker - - Åbn og luk trædøre ved at slå på dem, aktivere dem eller ved hjælp af rødsten. + + Tillad venner af venner - - Jerndøre kan kun åbnes ved hjælp af rødsten, knapper eller kontakter. + + Smid spiller ud - - BRUGES IKKE + + Er du sikker på, at du vil smide spilleren ud? Vedkommende kan ikke oprette forbindelse til dit spil igen, før du genstarter verdenen. - - BRUGES IKKE + + Pakker med spillerbilleder - - BRUGES IKKE + + Du kan ikke tilslutte til spillet, fordi det er begrænset til spillere, der er venner med værten. - - BRUGES IKKE + + Indholdet, der kan hentes, er ødelagt - - Giver dig 1 rustning, når du har den på. + + Indholdet, der kan hentes, er ødelagt og kan ikke bruges. Du skal slette det og geninstallere det fra menuen i Minecraft-butikken. - - Giver dig 3 rustning, når du har den på. + + Noget af dit indhold, der kan hentes, er ødelagt og kan ikke bruges. Du skal slette det og geninstallere det fra menuen i Minecraft-butikken. - - Giver dig 2 rustning, når du har den på. + + Kan ikke tilslutte til spil - - Giver dig 1 rustning, når du har den på. + + Valgt - - Giver dig 2 rustning, når du har den på. + + Valgt overflade: - - Giver dig 5 rustning, når du har den på. + + Hent den komplette version - - Giver dig 4 rustning, når du har den på. + + Lås op for teksturpakke - - Giver dig 1 rustning, når du har den på. + + Du skal låse op for denne teksturpakke for at bruge den i din verden. +Vil du låse op for den nu? - - Giver dig 2 rustning, når du har den på. + + Prøveversion af teksturpakke - - Giver dig 6 rustning, når du har den på. + + Seed - - Giver dig 5 rustning, når du har den på. + + Lås op for overfladepakke - - Giver dig 2 rustning, når du har den på. + + Du skal låse op for denne overfladepakke for at bruge den valgte overflade. +Vil du låse op for overfladepakken nu? - - Giver dig 2 rustning, når du har den på. + + Du bruger stadig en prøveversion af denne teksturpakke. Du kan først gemme verdenen, når du har låst op for den komplette version. +Vil du låse op for den komplette version af teksturpakken nu? - - Giver dig 5 rustning, når du har den på. + + Download komplet version - - Giver dig 3 rustning, når du har den på. + + Denne verden bruger en mash-up-pakke eller teksturpakke, som du mangler! +Vil du installere mash-up-pakken eller teksturpakken nu? - - Giver dig 1 rustning, når du har den på. + + Hent prøveversion - - Giver dig 3 rustning, når du har den på. + + Teksturpakken er ikke tilgængelig - - Giver dig 8 rustning, når du har den på. + + Lås op for den komplette version - - Giver dig 6 rustning, når du har den på. + + Download prøveversion - - Giver dig 3 rustning, når du har den på. + + Spiltypen er blevet ændret - - En funklende barre, som du kan lave redskaber ud af. Fremstillet ved bearbejdning af malm i ovnen. + + Når denne funktion er slået til, er det kun inviterede spillere, der kan deltage. - - Gør det muligt at fremstille blokke med barrer, juveler og farver, der kan placeres. Kan anvendes som en luksuriøs byggeblok eller som et kompakt malmlager. + + Når denne funktion er slået til, kan spillere, der er venner med personer på din venneliste, deltage i spillet. - - Sender en elektrisk ladning, når spilleren, et dyr eller et monster træder på den. Trykplader af træ kan også aktiveres ved at kaste noget hen på dem. + + Når denne funktion er slået til, kan spillerne skade hinanden. Gælder kun i Overlevelse. - - Kan bruges til at bygge kompakte trapper med. + + Normal - - Kan bruges til at bygge lange trapper med. To fliser oven på hinanden udgør en blok af normal størrelse. + + Meget flad - - Kan bruges til at bygge lange trapper med. To fliser placeret ovenpå hinanden skaber en blok af normal størrelse. + + Når denne funktion er slået til, bliver spillet til et onlinespil. - - Giver lys. Fakler kan også smelte sne og is. + + Når denne funktion er slået fra, kan spillere, der tilslutter sig spillet, ikke bygge eller udvinde materialer, før de har fået tilladelse. - - Bruges som byggemateriale og kan også anvendes til fremstilling af mange genstande. Kan fremstilles af enhver slags træ. + + Når denne funktion er slået til, bliver strukturer som landsbyer og fæstninger skabt i verdenen. - - Bruges som byggemateriale. Påvirkes ikke af tyngdekraften som normalt sand. + + Når denne funktion er slået til, bliver der skabt en helt flad verden i Oververdenen og Afgrunden. - - Bruges som byggemateriale. + + Når denne funktion er slået til, bliver der skabt en kiste med nyttige genstande i nærheden af spillerens gendannelsespunkt. - - Bruges til fremstilling af fakler, pile, skilte, stiger, hegn, samt håndtag til våben og redskaber. + + Når denne funktion er slået til, kan ilden sprede sig til brandbare blokke i nærheden. - - Får tiden til at springe frem til morgen, hvis alle spillerne i verdenen er i seng, og ændrer spillerens gendannelsespunkt. -Farverne på sengene er altid de samme, uanset farverne på uldet. + + Når denne funktion er slået til, eksploderer TNT, når det aktiveres. - - Giver dig mulighed for at fremstille et mere varieret udvalg af genstande end ellers. + + Når denne funktion er slået til, vil Afgrunden blive genskabt. Det er nyttigt, hvis du har et ældre gemt spil, hvor afgrundsfæstningen ikke er med. - - Giver dig mulighed for at smelte malm, fremstille kul og glas samt stege fisk og koteletter. + + Fra - - Kan opbevare blokke og genstande. Stil to kister ved siden af hinanden for at skabe en større kiste med dobbelt så meget plads. + + Spiltype: Kreativ - - En barriere, man ikke kan hoppe over. Tæller som 1,5 blokke i højden for spillere, dyr og monstre, men en blok i højden i forhold til andre blokke. - + + Overlevelse - - Bruges til at klatre lodret med. + + Kreativ - - Kan åbnes og lukkes ved at slå på dem, aktivere dem eller ved hjælp af rødsten. De fungerer som normale døre, men ligger fladt på jorden med dimensionerne én gange én. + + Omdøb din verden - - Viser tekst, der er skrevet af dig eller andre spillere. + + Indtast et nyt navn til din verden - - Giver kraftigere lys end fakler. Smelter sne og is og kan bruges under vand. + + Spiltype: Overlevelse - - Skaber eksplosioner. Stil sprængstoffet, og udløs det ved at tænde lunten med et fyrtøj eller en elektrisk ladning. + + Oprettet i Overlevelse - - Til svampestuvning. Du får lov at beholde skålen, når stuvningen er spist. + + Omdøb gemte spil - - Til opbevaring og transport af vand, lava og mælk. + + Gemmer automatisk om %d ... - - Til opbevaring og transport af vand. + + Til - - Til opbevaring og transport af lava. + + Oprettet i Kreativ - - Til opbevaring og transport af mælk. + + Vis skyer - - Tænder ild, udløser sprængstof og aktiverer portaler, når rammen er færdig. + + Hvad vil du gøre med det gemte spil? - - Bruges til at fiske med. + + Display-størrelse (delt skærm) - - Viser solens og månens placeringer. + + Ingrediens - - Peger mod din startposition. + + Brændsel - - Tegner et billede af et område, når du bruger det. Du kan bruge kortet til at finde vej med. + + Automat - - Gør det muligt at skyde med pile. + + Kiste - - Bruges som ammunition til buer. + + Fortryl - - Gendanner 2,5 {*ICON_SHANK_01*}. + + Ovn - - Gendanner 1 {*ICON_SHANK_01*}. Kan bruges seks gange. + + Der er ikke nogen tilbud på indhold, der kan hentes, af denne type i øjeblikket. - - Gendanner 1 {*ICON_SHANK_01*}. + + Er du sikker på, at du vil slette det gemte spil? - - Gendanner 1 {*ICON_SHANK_01*}. + + Afventer godkendelse - - Gendanner 3 {*ICON_SHANK_01*}. + + Censureret - - Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Indtagelse kan forgifte dig. + + %s har sluttet sig til spillet. - - Gendanner 3 {*ICON_SHANK_01*}. Fremstillet ved at stege rå kylling i en ovn. + + %s har forladt spillet. - - Gendanner 1,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. + + %s blev smidt ud af spillet. - - Gendanner 4 {*ICON_SHANK_01*}. Fremstillet ved at stege råt kød i en ovn. + + Bryggestativ - - Gendanner 1,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. + + Indtast tekst til skilt - - Gendanner 4 {*ICON_SHANK_01*}. Fremstillet ved at stege rå kotelet i en ovn. + + Indtast tekst til dit skilt - - Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Kan bruges til at tæmme en ozelot med. + + Indtast en titel - - Gendanner 2,5 {*ICON_SHANK_01*}. Fremstillet ved at stege rå fisk i en ovn. + + Prøveversionen er udløbet - - Gendanner 2 {*ICON_SHANK_01*} og kan bruges til at fremstille et guldæble med. + + Spillet er fyldt - - Gendanner 2 {*ICON_SHANK_01*} samt energi i fire sekunder. Fremstilles af et æble og guldklumper. + + Kunne ikke logge ind, fordi der ikke er flere ledige pladser - - Gendanner 2 {*ICON_SHANK_01*}. Indtagelse kan forgifte dig. + + Indtast en titel til dit opslag - - Bruges i kageopskriften og som ingrediens i eliksirer. + + Indtast en beskrivelse til dit opslag - - Sender en elektrisk ladning, når den tændes eller slukkes. Forbliver tændt eller slukket, indtil der bliver trykket på den igen. + + Lager - - Sender en konstant elektrisk strøm eller kan anvendes som modtager og sender, når den placeres på siden af en blok. -Kan også bruges til at give svag belysning. + + Ingredienser - - Bruges i rødstenskredsløb som gentager, forsinker og/eller diode. + + Indtast overskrift - - Sender en elektrisk strøm, når der trykkes på den. Forbliver aktiveret i cirka et sekund, inden den slukkes igen. + + Indtast en overskrift til dit opslag - - Skyder med genstande i tilfældig rækkefølge, når den modtager strøm fra rødsten. + + Indtast beskrivelse - - Spiller en tone, når den udløses. Slå på den for at ændre tonehøjde. Stil den på forskellige materialer for at skifte instrument. - + + Spiller nu: - - Bruges til at styre minevogne med. + + Er du sikker på, at du vil føje denne bane til din liste over blokerede baner? +Hvis du vælger OK, forlader du også spillet. - - Når der er sat strøm til, giver den minevogne fart på, når de passerer over den. Når den er slukket, bremser den minevogne, når de passerer over den. + + Fjern fra blokeringsliste - - Fungerer som en trykplade (sender rødstensstrøm, når den er aktiveret), men kan kun aktiveres af minevogne. + + Interval for automatisk gemte spil - - Kan transportere dig, et dyr eller et monster på skinnerne. + + Blokeret bane - - Kan transportere gods på skinnerne. + + Spillet, du opretter forbindelse til, er på din liste over blokerede baner. +Hvis du opretter forbindelse til spillet, bliver banen fjernet fra listen over blokerede baner. - - Kan køre på skinner og kan skubbe andre minevogne, når der er kul i den. + + Vil du blokere banen? - - Rejs hurtigere over vand end ved at svømme. + + Interval for automatisk gemte spil: FRA - - Indsamlet fra får og kan farves. + + Skærmgennemsigtighed - - Bruges som byggemateriale og kan farves. Denne opskrift anbefales ikke, fordi det er let at få fat i uld fra får. + + Gør forberedelser til at gemme banen automatisk - - Bruges som farve til sort uld. + + Display-størrelse - - Bruges som farve til grøn uld. + + Min. - - Bruges som farve til brun uld og ingrediens i småkager eller til dyrkning af kakaobønner. + + Kan ikke placeres her! - - Bruges som farve til sølvfarvet uld. + + Du må ikke placere lava tæt på gendannelsespunktet, da det skaber en risiko for, at gendannede spillere dør med det samme. - - Bruges som farve til gul uld. + + Favoritoverflade - - Bruges som farve til rødt uld. + + Spil tilhørende %s - - Bruges for at få afgrøder, højt græs, kæmpesvampe og blomster til at vokse øjeblikkeligt og kan bruges i farveopskrifter. + + Ukendt spilvært - - Bruges som farve til lyserødt uld. + + Gæst logget ud - - Bruges som farve til orange uld. + + Gendan indstillinger - - Bruges som farve til limegrøn uld. + + Er du sikker på, at du vil gendanne dine indstillinger til deres standardværdier? - - Bruges som farve til grå uld. + + Indlæsningsfejl - - Bruges som farve til lysegrå uld. -(Bemærk: Lysegrå farve kan også fremstilles ved at kombinere grå farve med benmel, så du kan fremstille fire portioner grå farve fra en blækpose i stedet for tre.) + + Alle gæstespillere er blevet logget ud, fordi en gæst forlod spillet. - - Bruges som farve til lyseblå uld. + + Kunne ikke oprette spil - - Bruges som farve til cyan uld. + + Autovalg - - Bruges som farve til lilla uld. + + Ingen pakker: Standardskins - - Bruges som farve til magentafarvet uld. - - - Bruges som farve til blå uld. + + Log ind - - Spiller musikplader. + + Du er ikke logget ind. Du skal være logget ind for at kunne spille. Vil du logge ind nu? - - Bruges til fremstilling af meget solide redskaber, våben og rustninger. + + Multiplayer er ikke tilladt - - Giver kraftigere lys end fakler. Smelter sne og is og kan bruges under vand. + + Drik - - Bruges til fremstilling af bøger og kort. + + + Der er blevet bygget en gård i dette område. Med en gård kan du opbygge en kilde til mad og andre genstande. + - - Bruges til fremstilling af bogreoler eller fortryllede bøger, når de er fortryllede. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om landbrug.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til landbrug. - - Skaber kraftigere fortryllelser, når de er placeret omkring et fortryllelsesbord. + + Hvede, græskar og meloner kommer fra frø. Du får hvedefrø ved at indsamle højt græs, og du kan få frø fra græskar og meloner fra deres respektive frø. - - Bruges som dekoration. + + Tryk på {*CONTROLLER_ACTION_CRAFTING*} for at åbne fremstillingsskærmen i Kreativ. - - Indeholder guld, der kan udvindes med en hakke af jern eller kraftigere materiale, og kan smeltes om til guldbarrer i en ovn. + + Gå over på den anden side af dette hul for at fortsætte. - - Indeholder jern, der kan udvindes med en hakke af sten eller kraftigere materiale, og kan smeltes om til jernbarrer i en ovn. + + Du har nu fuldført introduktionen i Kreativ. - - Indeholder kul, der kan udvindes med en hakke. + + Inden du planter frø, skal du kultivere jorden ved hjælp af et lugejern, så den bliver til landbrugsjord. Med en vandkilde i nærheden kan du sørge for at landbrugsjorden ikke tørrer ud, og at afgrøderne vokser hurtigere. Lys hjælper også planterne med at gro. - - Indeholder lasursten, der kan udvindes med en hakke af sten eller kraftigere materiale. + + Kaktusser skal plantes i sand og kan vokse sig op til tre blokke i højden. Ligesom med sukkerrør, så falder blokkene med ned, når du fælder den nederste del af en kaktus.{*ICON*}81{*/ICON*} - - Indeholder diamanter, der kan udvindes med en hakke af jern eller kraftigere materiale. + + Svampe skal plantes i svag belysning, så vil de sprede sig til andre svagt belyste blokke.{*ICON*}39{*/ICON*} - - Indeholder rødsten, der kan udvindes med en hakke af jern eller kraftigere materiale. + + Med benmel kan du få afgrøder til at vokse sig store øjeblikkeligt og svampe til at vokse sig til kæmpestørrelse.{*ICON*}351:15{*/ICON*} - - Indeholder brosten, der kan udvindes med en hakke. + + Hvede vokser gennem flere stadier og er klar til at blive høstet, når det får en mørkere farve.{*ICON*}59:7{*/ICON*} - - Graves op med en skovl. Bruges til at bygge med. + + Der skal være en tom plads ved siden af felter, hvor du planter græskar og meloner, så der er plads til frugten, når stænglen har vokset sig stor. - - Kan plantes og vil med tiden vokse og blive til et træ. + + Sukkerrør skal plantes i græs-, jord- eller sandblokke, der er lige ved siden af vand. Når du fælder en del af et sukkerrør, får du blokkene med, der er placeret oven på.{*ICON*}83{*/ICON*} - - Kan ikke ødelægges. + + I Kreativ har du et uendeligt antal af alle genstande og blokke til rådighed, du kan ødelægge blokke med et klik uden at bruge et redskab, du er usårlig, og du kan flyve. - - Sætter ild til alt det kommer i nærheden af. Kan opbevares i en spand. + + + Kisten i dette område indeholder nogle komponenter, som du kan bruge til at bygge stempelkredsløb med. Prøv at bruge eller fuldende kredsløbene i området, eller byg dine egne. Der er flere eksempler uden for introduktionsområdet. + - - Graves op med en skovl. Kan laves til glas i en ovn. Påvirkes af tyngdekraften, hvis ikke der er nogen blok nedenunder. + + + I dette område finder du en portal til Afgrunden! + - - Graves op med en skovl. Indeholder nogle gange flint, når det graves op. Påvirkes af tyngdekraften, hvis ikke der er nogen blok nedenunder. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om portaler og Afgrunden.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til portaler og Afgrunden. - - Hugges i stykker med en økse og kan bruges til brændsel eller til at fremstille planker med. + + + Du kan udvinde rødstensstøv fra rødstensmalm ved hjælp af en jernhakke, diamanthakke eller en guldhakke. Den kan levere strøm til op til 15 blokke, og strømmen kan bevæge sig inden for en afstand af en blok op eller ned. + {*ICON*}331{*/ICON*} + - - Fremstilles i en ovn ved at smelte sand. Kan bruges i bygninger, men går i stykker, hvis du forsøger at udvinde det. + + + Du kan bruge rødstensgentagere for at forlænge strømmens rækkevidde, eller du kan placere en forsinker i kredsløbet. + {*ICON*}356{*/ICON*} + - - Udvindes af sten med en hakke. Kan bruges til at bygge en ovn eller til at fremstille redskaber af sten med. + + + Når der er sat strøm til et stempel, hæver det sig og skubber op til 12 blokke. Når klisterstempler trækker sig sammen, kan de trække en blok af de fleste slags materialer. + {*ICON*}33{*/ICON*} + - - Fremstilles ved at brænde ler i en ovn. + + + Du kan bygge portaler ved at lave en ramme af obsidianblokke, der er fire blokke i bredden og fem blokke i højden. Du behøver ikke sætte blokke i hjørnerne. + - - Kan laves til mursten i en ovn. + + + Du kan rejse gennem Afgrunden for at skyde genvej i Oververdenen. Når du bevæger dig en blok frem i Afgrunden, svarer det til, at du bevæger dig tre blokke frem ovenpå. + - - Giver lerkugler, når det graves op, som kan bruges til at fremstille mursten med i en ovn. + + + Du spiller nu Kreativ. + - - En kompakt måde at opbevare snebolde på. + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om Kreativ.{*B*} + Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til Kreativ. + - - Indeholder snebolde, der kan graves op med en skovl. + + + Du aktiverer Afgrunden-portalen ved at tænde ild mellem obsidianblokkene i rammen med et fyrtøj. Portalerne deaktiveres, hvis rammen bliver brudt, der sker en eksplosion i nærheden, eller hvis der flyder vand igennem den. + - - Giver nogle gange hvedefrø, når de graves op. + + + Hvis du vil bruge portalen til Afgrunden, skal du gå ind i den. Skærmen bliver lilla, og du vil høre en lyd. I løbet af et par sekunder bliver du transporteret til en anden dimension. + - - Kan bruges i farve. + + + Afgrunden er fuld af lava og kan være et farligt sted, men du kan også finde afgrundssten, der brænder for evigt, når du har tændt dem, samt glødesten, der lyser. + - - Kan bruges til stuvning i en skål. + + Du har nu fuldført introduktionen til landbrug. - - Kan kun udvindes med en diamanthakke. Opstår ved at blande vand og stillestående lava og kan bruges til at bygge portaler med. + + Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en økse til at fælde træer med. - - Fremkalder monstre i verdenen. + + Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en hakke til sten og malm. Du får brug for at lave en hakke af et stærkere materiale for at kunne udvinde ressourcer fra visse blokke. - - Stilles på jorden for at lave strøm. Når den brygges i en eliksir, forlænges effekten. + + Nogle redskaber er bedre til at angribe fjender med end andre. Et sværd er godt at angribe med. - - Afgrøder giver hvede, når de er modne. + + Jerngolemmer dukker også naturligt op for at beskytte landsbyer og angriber dig, hvis du angriber landsbyboerne. - - Jord, der er blevet kultiveret og klar til beplantning. + + Du kan ikke forlade området, før du har gennemført introduktionen. - - Kan koges i en ovn for at fremstille grøn farve. + + Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en skovl til bløde materialer som jord og sand. - - Kan bruges til at fremstille sukker med. + + Tip: Hold {*CONTROLLER_ACTION_ACTION*} nede for at hakke og hugge med hænderne eller det redskab, som du bruger. Du får brug for et redskab for at udvinde bestemte materialer ... - - Kan bruges som hjelm eller sammen med en fakkel for at lave en græskarlygte. Det er også hovedingrediensen i græskartærte. + + I kisten ved siden af floden er der en båd. Du kan sætte dig i båden ved at pege med markøren på den og trykke på {*CONTROLLER_ACTION_USE*}. Ret markøren mod båden, og tryk på {*CONTROLLER_ACTION_USE*} for at sætte dig i den. - - Brænder for evigt, når den bliver tændt. + + I kisten ved siden af dammen er der en fiskestang. Tag fiskestangen fra kisten, og vælg den, så du holder den i hånden. - - Bremser bevægelseshastigheden på alt, der passerer hen over den. + + Denne avancerede stempelmekanisme skaber en bro, der reparerer sig selv! Tryk på knappen for at aktivere den, og prøv dernæst at kigge nærmere på, hvordan komponenterne interagerer for at lære mere. - - Når du står i en portal, kan du bevæge dig mellem Oververdenen og Afgrunden. + + Redskabet, du bruger, er blevet slidt. Hver gang du bruger et redskab, bliver det en smule mere slidt, indtil det går i stykker. Den farvede bjælke under redskabet i dit lager viser, hvor slidt redskabet er. - - Bruges som brændsel i en ovn eller til at fremstille fakler med. + + Hold {*CONTROLLER_ACTION_JUMP*} nede for at svømme op. - - Fås ved at dræbe en edderkop. Kan bruges til at lave en bue eller en fiskestang med eller placeres på jorden for at lave en snubletråd. + + I dette område finder du en minevogn på skinner. Du kan sætte dig i minevognen ved at pege med markøren på den og trykke på {*CONTROLLER_ACTION_USE*}. Brug {*CONTROLLER_ACTION_USE*} på knappen for at sætte minevognen i bevægelse. - - Fås ved at dræbe en kylling. Kan bruges til at lave pile med. + + Jerngolemmer skal laves af to jernblokke oven på hinanden med et græskar på toppen. Jerngolemmer angriber dine fjender. - - Fås ved at dræbe en sniger. Kan bruges til fremstilling af TNT eller som ingrediens i en eliksir. + + Hvis du giver hvede til køer, muhsvampe eller får, gulerødder til grise, hvedefrø eller afgrundsurt til høns og kød til ulve, vil de begynde at se sig om efter en mage i nærheden, som også er elskovssyg. - - Kan plantes på opdyrket jord for at få afgrøder. Sørg for, at der er nok lys, til at frøene kan gro! + + Når to elskovssyge dyr af samme art møder hinanden, kysser de hinanden i et par sekunder, hvorefter en dyreunge dukker op. Dyreungen følger efter sine forældre, indtil den selv har vokset sig stor. - - Fås fra afgrøder og kan bruges til at lave mad med. + + Når et dyr har været elskovssygt, skal der gå op til fem minutter, inden det kan blive det igen. - - Fås ved at skovle grus og kan bruges til at lave fyrtøj med. + + + I dette område er dyrene indhegnet. Du kan avle dyr for at få unger. + - - Når du lægger den på en gris, kan du ride på grisen. Du kan styre grisen ved hjælp af en gulerod på en fiskestang. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om avl.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til avl. - - Fås ved at skovle sne. Kan kastes. + + Du skal fodre dyrene for at gøre dem elskovssyge, så de kan få unger. - - Fås ved at dræbe en ko. Kan bruges til at lave rustninger eller bøger med. + + Nogle dyr følger efter dig, hvis du har mad i hånden. På den måde er det lettere at lokke dem sammen, så du kan avle dem.{*ICON*}296{*/ICON*} - - Fås ved at dræbe en slim og kan bruges som ingrediens i eliksirer eller til fremstillinger af klisterstempler. - - - Efterlades tilfældigt af høns og kan bruges til mad. + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om golemmer.{*B*} + Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til golemmer. + - - Fås ved at udvinde glødesten og kan bruges til at fremstille glødesten med igen eller brygges i eliksirer, så effekten forøges. + + Golemmer bliver skabt ved at placere et græskar oven på en stak blokke. - - Fås ved at dræbe et skelet. Kan bruges til benmel. Kan bruges til at tæmme en ulv med. + + Snegolemmer skal laves af to sneblokke oven på hinanden med et græskar på toppen. Snegolemmer kaster snebolde efter deres skabers fjender. - - Fås ved at få et skelet til at dræbe en sniger. Kan spilles i en jukebox. + + + Du kan tæmme vilde ulve ved at give dem ben. Der dukker hjerter op omkring dem, når de er tæmmet. Tamme ulve følger spilleren og forsvarer dem, med mindre de er blevet beordret til at sidde. + - - Slukker brande og får afgrøderne til at gro. Kan opbevares i en spand. + + Du har nu fuldført introduktionen til dyr og avl. - - Efterlader nogle gange en stikling, der kan plantes igen for at få et nyt træ. + + + I dette områder er der græskar og blokke, så du kan lave en snegolem og en jerngolem. + - - Findes i fangekældre og kan bruges til dekoration og til at bygge med. + + + Strømkildens placering og retning kan påvirke dens effekt på omkringliggende blokke. Du kan eksempelvis slukke for en rødstensfakkel, hvis du har placeret den på siden af en blok, der modtager strøm fra en anden strømkilde. + - - Bruges til at klippe får og til at klippe blade af træerne med. + + + Hvis gryden løber tør for vand, kan du fylde den med en vandspand. + - - Når det aktiveres (ved hjælp af rødsten i forbindelse med en knap, et håndtag, en trykplade eller en rødstensfakkel), skubbes stemplet op og flytter blokkene, hvis det kan. + + + Brug bryggestativet til at brygge en ildmodstandseliksir med. Du skal bruge en vandflaske, afgrundsurt og magmacreme. + - - Når det aktiveres (ved hjælp af rødsten i forbindelse med en knap, et håndtag, en trykplade eller en rødstensfakkel), skubbes stemplet op og flytter blokkene, hvis det kan. Når stemplet trækker sig sammen, trækker det blokken med, der står ovenpå. + + + Hold {*CONTROLLER_ACTION_USE*} nede, mens du har eliksiren i hånden, for at drikke den. Hvis det er en normal eliksir, drikker du den og påfører dig effekten, men hvis det er en kasteeliksir, påføres effekten væsnerne i nærheden af det område, den rammer. + Du kan lave kasteeliksirer ved at tilføje krudt til almindelige eliksirer. + - - Er lavet af sten og findes ofte i fæstninger. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om brygning og eliksirer.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til brygning og eliksirer. + - - Kan bruges som barriere på samme måde som et hegn. + + + Det første trin i at brygge en eliksir er at lave en vandflaske. Tag en glasflaske fra kisten. + - - Fungerer som en dør, men bruges ofte i et hegn. + + + Du kan fylde glasflasken med en gryde med vand i eller med en vandblok. Fyld din glasflaske ved at pege den mod en vandkilde og trykke på {*CONTROLLER_ACTION_USE*}. + - - Fremstilles af melonskiver. + + + Brug din ildmodstandseliksir på dig selv. + - - Gennemsigtig blok, der kan bruges som alternativ til glasblokke. + + + Hvis du vil fortrylle en genstand, skal du først placere den i fortryllelsesfeltet. Du kan fortrylle våben, rustninger og visse redskaber for at give dem en særlig egenskab, såsom større modstandsstyrke eller større udbytte af materialer, som du udvinder med redskabet. + - - Kan plantes for at få græskar. + + + Når du placerer en genstand i fortryllelsesfeltet, viser knapperne til højre et udvalg af tilfældige fortryllelser. + - - Kan plantes for at få meloner. + + + Tallet på knappen angiver omkostningen i erfaringsniveau, der skal bruges for at udføre fortryllelsen. Hvis dit niveau ikke er højt nok, vil knappen være deaktiveret. + - - Efterlades af mørkemænd, når de dør. Når du kaster den, bliver du teleporteret til det sted, hvor mørkeperlen lander, og du mister lidt energi. + + + Nu kan ild og lava ikke længere skade dig, og du kan prøve at se dig omkring efter områder, der var utilgængelige for dig før. + - - En jordblok med græs på toppen. Graves op med en skovl. Bruges til at bygge med. + + + Dette er fortryllelsesskærmen, hvor du kan fortrylle dine våben, rustninger og visse redskaber. + - - Bruges til dekoration og til at bygge med. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om fortryllelsesskærmen.{*B*} + Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til fortryllelsesskærmen. + - - Sænker farten på væsner, der går igennem det. Kan klippes i stykker med en saks for at få snor. + + + I dette område finder du et bryggestativ, en gryde og en kiste fyldt med ingredienser til brygning. + - - Fremkalder en sølvfisk, når blokken hugges i stykker. Kan også fremkalde en sølvfisk, hvis den er i nærheden af en anden sølvfisk, der bliver angrebet. + + + Kul kan bruges som brændsel og som ingrediens til en fakkel sammen med en pind. + - - Vokser med tiden, når den er blevet plantet. Kan klippes med en saks. Kan bruges som stige. + + + Du kan lave glas, hvis du placerer sand i ingrediensfeltet. Lav nogle glasblokke, som du kan bruge som vinduer i dit tilflugtssted. + - - Bliver glat, når du går på det. Blokken bliver til vand, hvis den hakkes i stykker, mens den står oven på en anden blok. Smelter, hvis den kommer tæt på en lyskilde eller placeres i Afgrunden. + + + Dette er bryggeskærmen. Her kan du brygge eliksirer med en lang række forskellige effekter. + - - Kan bruges som dekoration. + + + De fleste trægenstande kan bruges som brændsel, men de brænder ikke alle i lige lang tid. Du kan også finde andre genstande, der kan bruges som brændsel. + - - Bruges til eliksirbrygning og til at finde fæstninger med. Efterlades af flammeånder, der ofte findes i nærheden af eller inde i afgrundsfæstningen. + + + Når dine materialer er blevet bearbejdet, kan du fjerne resultatet fra feltet til højre og placere det i dit lager. Prøv at eksperimentere med forskellige materialer for at se, hvad der sker. + - - Bruges til eliksirbrygning. Efterlades af gyslinger, når de dør. + + + Du kan lave kul, hvis du bruger træ som ingrediens. Læg brændsel i ovnen og træ i ingrediensfeltet. Det tager lidt tid, inden ovnen er færdig med at lave kul. Du kan give dig til at lave noget andet i mellemtiden og kigge tilbage til ovnen senere. + - - Efterlades af zombiegrisemænd, når de dør. Zombiegrisemænd findes i Afgrunden. Bruges som ingrediens i eliksirer. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du bruger dit bryggestativ. + - - Bruges til eliksirbrygning. Vokser naturligt i afgrundsfæstningen. Kan også plantes i sjælesand. + + + Hvis du tilsætter et gæret edderkoppeøje forvrænges eliksiren og får nogle gange den helt modsatte effekt, og hvis du tilsætter krudt bliver eliksiren til en kasteeliksir, som du kan kaste med for at påvirke det område, hvor den lander. + - - Har forskellige effekter alt afhængigt af, hvad den bruges til. + + + Du kan brygge en ildmodstandseliksir ved først at putte afgrundsurt i en vandflaske og dernæst tilsætte magmacreme. + - - Kan fyldes med vand som grundingrediens i en eliksir i bryggestativet. + + + Tryk på {*CONTROLLER_VK_B*} for at lukke bryggeskærmen. + - - Er giftig at spise og kan bruges i eliksirer. Efterlades af edderkopper og huleedderkopper, når du dræber dem. + + + Du kan brygge eliksirer ved at placere en ingrediens i det øverste felt og en eliksir eller en vandflaske i de nederste felter (du kan brygge op til tre eliksirer ad gangen). Når du har sammensat en gyldig kombination starter bryggeprocessen, og eliksiren vil være færdig efter kort tid. + - - Bruges til eliksirbrygning ofte med negativ effekt. + + + Alle eliksirer starter med en vandflaske. I mange eliksirer skal du først starte med at tilsætte afgrundsurt for at brygge en akavet eliksir og dernæst tilsætte en ingrediens mere for at brygge den endelige eliksir. + - - Bruges til eliksirbrygning eller som ingrediens i fremstilling af mørkeøjne eller magmacreme. + + + Når du har brygget en eliksir, kan du ændre dens effekt. Hvis du tilsætter støv fra rødsten forlænges varigheden af effekten, og hvis du tilsætter støv fra glødesten forstærkes effekten. + - - Bruges til eliksirbrygning. + + + Vælg en fortryllelse, og tryk på {*CONTROLLER_VK_A*} for at fortrylle genstanden. Dit erfaringsniveau bliver fratrukket omkostningerne for fortryllelsen. + - - Bruges til fremstilling af eliksirer og kasteeliksirer. + + + Tryk på {*CONTROLLER_ACTION_USE*} for at kaste snøren ud. Tryk på {*CONTROLLER_ACTION_USE*} for at trække snøren ind igen. + {*FishingRodIcon*} + - - Fyldes med regnvand eller en spand vand, hvorefter den kan fylde glasflasker med vand. + + + Hvis du venter med at trække snøren ind igen, indtil korken forsvinder under vandoverfladen, fanger du en fisk. Du kan spise rå fisk eller stege dem i ovnen for at få energi. + {*FishIcon*} + - - Viser vejen til portalen til Mørket, når du kaster den. Sæt 12 mørkeøjne i portalen til Mørket for at aktivere den. + + + Ligesom mange andre redskaber kan fiskestangen kun bruges et begrænset antal gange. Dens brug er dog ikke kun begrænset til fiskeri. Prøv at eksperimentere med fiskestangen for at se, hvilke andre ting den kan fange eller aktivere ... + {*FishingRodIcon*} + - - Bruges til eliksirbrygning. + + + I en båd kan du sejle hurtigere over vandet. Du kan styre den med {*CONTROLLER_ACTION_MOVE*} og {*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + - - Som græsblokke, men kan bruges til at dyrke svampe på. + + + Nu bruger du en fiskestang. Tryk på {*CONTROLLER_ACTION_USE*} for at bruge den.{*FishingRodIcon*} + - - Flyder på vandet, og du kan gå på den. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om fiskeri.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til fiskeri. - - Bruges til at bygge afgrundsfæstningen med. Immun over for gyslingens ildkugler. + + Dette er en seng. Tryk på {*CONTROLLER_ACTION_USE*}, mens du peger på den med markøren om natten for at sove frem til daggry.{*ICON*}355{*/ICON*} - - Bruges i afgrundsfæstningen. + + + I dette område finder du nogle enkle rødstenskredsløb og stempelkredsløb samt en kiste med flere genstande, som du kan forbinde kredsløbene med. + - - Findes i afgrundsfæstningen og efterlader afgrundsurt, når den hakkes i stykker. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om rødstenskredsløb og stempler.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til rødstenskredsløb og stempler. - - Kan fortrylle sværd, hakker, økser, skovle, buer og rustninger for erfaringspoint. + + + Håndtag, knapper, trykplader og rødstensfakler giver alle strøm til kredsløb, når du enten kobler dem direkte til genstanden, som du vil aktivere, eller ved at tilslutte dem med støv fra rødsten. + - - Kan aktiveres med tolv mørkeøjne og giver adgang til Mørket. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om senge.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til senge. - - Bruges til at bygge portalen til Mørket med. + + + Sengen skal stå et sikkert og veloplyst sted, så du ikke bliver vækket af monstre midt om natten. Når du har brugt en seng, fungerer den som gendannelsespunkt, hvis du dør. + {*ICON*}355{*/ICON*} + - - En blok fra Mørket. Ekstremt solid og velegnet til at bygge med. + + + Hvis du spiller med andre, skal I alle ligge i jeres senge på samme tid for at kunne sove. + {*ICON*}355{*/ICON*} + - - Mørkedragen efterlader denne blok, når du besejrer den. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om både.{*B*} - - Efterlader erfaringskugler, når du smider den, der forøger dine erfaringspoint. + + + Med et fortryllelsesbord kan du føje særlige effekter til dine genstande, så eksempelvis dine våben, rustninger og redskaber bliver mere robuste, og du udvinder flere materialer med dem. + - - Sætter ild til ting, eller til at sætte ild til ting automatisk, når den affyres fra en automat. + + + Når du stiller bogreoler rundt om fortryllelsesbordet, forøges dets kraft og giver adgang til fortryllelser, der kræver højere erfaringsniveau. + - - En udstillingsmontre, der viser den genstand eller blok, der placeres i den. + + + Det koster erfaringsniveau at fortrylle genstande. Dem kan du optjene ved at samle erfaringskugler, der dukker op, når du dræber monstre og dyr, udvinder malm, avler husdyr, fisker og smelter/steger ting i en ovn. + - - Fremkalder et væsen af den pågældende type, når du kaster med den. + + + Fortryllelserne er tilfældige, men du kan først få de bedste fortryllelser, når dit erfaringsniveau er højt, og du har masser af bogreoler omkring fortryllelsesbordet til at forøge dets kraft. + - - Kan bruges til at bygge lange trapper med. To fliser oven på hinanden udgør en blok af normal størrelse. + + + Der er et fortryllelsesbord i dette område og nogle andre ting, der kan hjælpe dig med at lære om fortryllelse. + - - Kan bruges til at bygge lange trapper med. To fliser oven på hinanden udgør en blok af normal størrelse. + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om fortryllelse.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til fortryllelse. + - - Fremstillet ved bearbejdning af afgrundssten i ovnen. Bruges til fremstilling afgrundsmursten. + + + Du kan også optjene erfaringsniveauer med en erfaringseliksir, der efterlader erfaringskugler på det sted, hvor du smed den. Du kan samle kuglerne op. + - - Lyser, når der bliver sat strøm til. + + + En minevogn kører på skinner. Du kan også fremstille en minevogn med en ovn eller kiste i. + {*RailIcon*} + - - Giver kakaobønner. + + + Du kan også få vognen til at køre automatisk ved af fremstille elektriske skinner, som får kraft fra rødstensfakler. Du kan tilslutte dem til kontakter, håndtag og trykplader for at lave komplekse systemer. + {*PoweredRailIcon*} + - - Hoveder kan bruges som dekoration eller som en maske ved at blive placeret i lagerpladsen for hjelme. + + + Nu sejler du i en båd. Du kan forlade båden ved at pege med markøren på den og trykke på {*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + - - Blæksprutte + + + I kisterne i dette område kan du finde nogle fortryllede genstande, erfaringseliksirer og andre genstande, som endnu ikke er blevet fortryllede, og som du kan eksperimentere med på fortryllelsesbordet. + - - Efterlader en blækpose + + + Nu kører du i en minevogn. Du kan forlade minevognen ved at pege med markøren på den og trykke på {*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + - - Ko + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om minevogne.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til minevogne. - - Efterlader læder, når den bliver dræbt. Kan malkes for mælk med en spand. + + Hvis du flytter en genstand uden for skærmen, kan du smide den. - - Får + + Læs - - Efterlader uld, når du klipper det (hvis det ikke allerede er blevet klippet). Uld kan farves. + + Hæng - - Kylling + + Kast - - Efterlader fjer og indimellem også æg, når du dræber den. + + Åbn - - Gris + + Skift tonehøjde - - Efterlader koteletter, når den bliver dræbt. Kan bruges som ridedyr med en sadel. + + Detonér - - Ulv + + Plant - - Fredelig, indtil du angriber den. Så bider den igen. Kan tæmmes med ben, hvorefter ulven følger med dig og angriber de væsner, du angriber. + + Lås op for det komplette spil - - Sniger + + Slet gemt spil - - Eksploderer, hvis du kommer for tæt på! + + Slet - - Skelet + + Kultivér - - Skyder pile efter dig. Efterlader pile, når du dræber den. + + Høst - - Edderkop. + + Fortsæt - - Angriber, når du kommer tæt på. Kan klatre på vægge. Efterlader snor, når du dræber den. + + Svøm op - - Zombie + + Slå - - Angriber, når du kommer tæt på. + + Malk - - Zombiegrisemand + + Indsaml - - Fredelig, men angriber i flok, hvis du angriber den. + + Tøm - - Gysling + + Sadel - - Skyder med ildkugler, der eksploderer, når de rammer. + + Placér - - Slim + + Spis - - Deler sig i mindre slimklumper, når den bliver skadet. + + Rid - - Mørkemand + + Sejl - - Angriber dig, hvis du ser på den. Kan også flytte blokke. + + Dyrk - - Sølvfisk + + Sov - - Tiltrækker skjulte sølvfisk i nærheden, når den bliver angrebet. Skjuler sig i blokke af sten. + + Vågn op - - Huleedderkop + + Leg - - Har et giftigt bid. + + Indstillinger - - Muhsvamp + + Flyt rustning - - Kan bruges til svampestuvning i en skål. Efterlader svampe og bliver en normal ko, når du klipper den med en saks. + + Flyt våben - - Snegolem + + Anvend - - En snegolem består af sneblokke og et græskar. Den kaster snebolde efter dens skabers fjender. + + Flyt ingrediens - - Mørkedrage + + Flyt brændsel - - En stor sort drage, der lever i Mørket. + + Flyt redskab - - Flammeånd + + Træk - - Disse fjender lever i Afgrunden og oftest inde i afgrundsfæstninger. De efterlader flammestave, når de dør. + + Side op - - Magmablokke + + Side ned - - Magmablokkene lever i Afgrunden. Ligesom slim deler de sig i mindre stykker, hvis du dræber dem. + + Elskovssyg - - Landsbyboer + + Slip - - Ozelot + + Privilegier - - Lever i junglen. Kan tæmmes med rå fisk. Men du skal lade ozelotten komme til dig, da pludselige bevægelser skræmmer den væk. + + Blok - - Jerngolem + + Kreativ - - Beskytter landsbyerne. Kan fremstilles med blokke af jern og græskar. + + Blokér bane - - Sprængstofsanimator + + Vælg overflade - - Illustrator + + Tænd - - Talknuser + + Invitér venner - - Bøllekoordinator + + Acceptér - - Originalt design og programmering af + + Klip - - Projektkoordinator/producer + + Navigér - - Resten af holdet hos Mojang + + Geninstallér - - Lead Game Programmer på Minecraft til pc + + Gem indst. - - Ninjaprogrammør + + Udfør handling - - CEO + + Installér komplet version - - Flipproletar + + Installér prøveversion - - Kundeservice + + Installér - - Kontorets dj + + Smid ud - - Designer/programmør på Minecraft – Pocket Edition + + Opdatér oversigt over onlinespil - - Udvikler + + Party-spil - - Chief Architect + + Alle spil - - Art Developer + + Afslut - - Spilsmed + + Annullér - - Morskabschef + + Annullér tilslutning - - Musik og lyde + + Skift gruppe - - Programmering + + Fremstilling - - Art + + Skab - - QA + + Tag/placér - - Executive Producer + + Vis lager - - Lead Producer + + Vis beskrivelse - - Producer + + Vis ingredienser - - Test Lead + + Tilbage - - Lead Tester + + Påmindelse: - - Design Team + + - - Development Team + + Der er blevet føjet nye funktioner til i den seneste version af spillet, heriblandt nye områder i introduktionsverdenen. - - Release Management + + Du har ikke ingredienserne til denne genstand. Feltet nederst til venstre viser de ingredienser, der skal bruges til denne genstand. - - Director, XBLA Publishing + + + Tillykke, du har gennemført introduktionen. Tiden går nu normalt i spillet, og det varer ikke længe, før det bliver nat, og monstrene kommer frem! Byg dit tilflugtssted færdigt! + - - Business Development + + {*EXIT_PICTURE*} Når du er klar til at udforske mere af verdenen, er der en trappeopgang i området i nærheden af minearbejderens skur, der fører videre til en lille borg. - - Portfolio Director + + {*B*}Tryk på {*CONTROLLER_VK_A*} for at spille gennem introduktionen som sædvanlig.{*B*} + Tryk på {*CONTROLLER_VK_B*} for at springe den grundlæggende introduktion over. - - Product Manager + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om madbjælken og mad.{*B*} + Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til madbjælken og mad. + - - Marketing + + Vælg - - Community Manager + + Anvend - - Europe Localization Team + + Her finder du forskellige områder, der lærer dig om fiskeri, både, stempler og rødsten. - - Redmond Localization Team + + Uden for dette område finder du eksempler på bygninger, landbrug, minevogne, skinner, fortryllelse, brygning, handel smedearbejde og meget mere! - - Asia Localization Team + + + Din madbjælke er faldet til et niveau, hvor du ikke længere får ny energi. + - - User Research Team + + Tag - - MGS Central Teams + + Næste - - Milestone Acceptance Tester + + Forrige - - Særlig tak til + + Smid spiller ud - - Test Manager + + Send venneanmodning - - Senior Test Lead + + Side ned - - SDET + + Side op - - Project STE + + Farve - - Additional STE + + Helbred - - Test Associates + + Sid - - Jon Kågström + + Følg - - Tobias Möllstam + + Udvind - - Risë Lugo + + Fodr - - Træsværd + + Tæm - - Stensværd + + Skift filter - - Jernsværd + + Placér alt - - Diamantsværd + + Placér en - - Guldsværd + + Smid - - Træskovl + + Tag alt - - Stenskovl + + Tag halvdelen - - Jernskovl + + Placér - - Diamantskovl + + Smid alt - - Guldskovl + + Ryd hurtigt valg - - Træhakke + + Hvad er det? - - Stenhakke + + Del på Facebook - - Jernhakke + + Smid en - - Diamanthakke + + Byt - - Guldhakke + + Flyt hurtigt - - Træøkse + + Overfladepakker - - Stenøkse + + Rød mosaikrude - - Jernøkse + + Grøn mosaikrude - - Diamantøkse + + Brun mosaikrude - - Guldøkse + + Hvidt mosaikglas - - Lugejern af træ + + Mosaikglasrude - - Lugejern af sten + + Sort mosaikrude - - Lugejern af jern + + Blå mosaikrude - - Diamantlugejern + + Grå mosaikrude - - Guldlugejern + + Lyserød mosaikrude - - Trædør + + Limefarvet mosaikrude - - Jerndør + + Lilla mosaikrude - - Ringhjelm + + Cyanfarvet mosaikrude - - Ringbrynje + + Lysegrå mosaikrude - - Ringbukser + + Orange mosaikglas - - Ringstøvler + + Blåt mosaikglas - - Læderhætte + + Lilla mosaikglas - - Jernhjelm + + Cyanfarvet mosaikglas - - Diamanthjelm + + Rødt mosaikglas - - Guldhjelm + + Grønt mosaikglas - - Lædertunika + + Brunt mosaikglas - - Brystplade af jern + + Lysegråt mosaikglas - - Diamantbrystplade + + Gult mosaikglas - - Brystplade af guld + + Lyseblåt mosaikglas - - Læderbukser + + Magentafarvet mosaikglas - - Jernbukser + + Gråt mosaikglas - - Diamantbukser + + Lyserødt mosaikglas - - Guldbukser + + Limefarvet mosaikglas - - Læderstøvler + + Gul mosaikrude - - Jernstøvler + + Lysegrå - - Diamantstøvler + + Grå - - Guldstøvler + + Lyserød - - Jernbarre + + Blå - - Guldbarre + + Lilla - - Spand + + Cyanfarvet - - Vandspand + + Limefarvet - - Lavaspand + + Orange - - Fyrtøj + + Hvid - - Æble + + Tilpasset - - Bue + + Gul - - Pil + + Lyseblå - - Kul + + Magentafarvet - - Trækul + + Brun - - Diamant + + Hvid mosaikrude - - Pind + + Lille bold - - Skål + + Stor bold - - Svampestuvning + + Lyseblå mosaikrude - - Snor + + Magentafarvet mosaikrude - - Fjer + + Orange mosaikrude - - Krudt + + Stjerneformet - - Hvedefrø + + Sort - - Hvede + + Rød - - Brød + + Grøn - - Flint + + Snigerformet - - Rå kotelet + + Brag - - Stegt kotelet + + Ukendt form - - Maleri + + Sort mosaikglas - - Guldæble + + Hesteudrustning af jern - - Skilt + + Hesteudrustning af guld - - Minevogn + + Hesteudrustning af diamant - - Sadel + + Rødstenssammenligner - - Rødsten + + Minevogn med TNT - - Snebold + + Minevogn med springer - - Båd + + Line - - Læder + + Signallys - - Mælkespand + + Fældekiste - - Mursten + + Vægtet trykplade (let) - - Ler + + Navneskilt - - Sukkerrør + + Træplanker (af en hvilken som helst type) - - Papir + + Kommandoblok - - Bog + + Fyrværkeristjerne - - Slimklat + + Du kan tæmme disse dyr og bruge dem til at ride på. Du kan også sætte en kiste fast på dem. - - Minevogn med kiste + + Muldyr - - Minevogn med ovn + + Resultatet af, at en hest og et æsel parrer sig. Du kan tæmme disse dyr og bruge dem til at ride på og til at bære kister. - - Æg + + Hest - - Kompas + + Du kan tæmme disse dyr og bruge dem til at ride på. - - Fiskestang + + Æsel - - Ur + + Zombiehest - - Støv fra glødesten + + Blankt kort - - Rå fisk + + Mørkestjerne - - Stegt fisk + + Raket - - Farvepulver + + Skelethest - - Blækpose + + Wither - - Rosenrødt + + De her laves af Wither-kranier og sjælesand. De skyder sprængfarlige kranier efter dig. - - Kaktusgrønt + + Vægtet trykplade (tung) - - Kakaobønner + + Lysegråt, farvet ler - - Lasursten + + Gråt, farvet ler - - Lilla farve + + Lyserødt, farvet ler - - Cyan farve + + Blåt, farvet ler - - Lysegrå farve + + Lilla, farvet ler - - Grå farve + + Cyanfarvet ler - - Lyserød farve + + Limefarvet ler - - Limegrøn farve + + Orange, farvet ler - - Mælkebøttegul + + Hvidt, farvet ler - - Lyseblå farve + + Mosaikglas - - Magenta farve + + Gult, farvet ler - - Orange farve + + Lyseblåt, farvet ler - - Benmel + + Magentafarvet ler - - Ben + + Brunt, farvet ler - - Sukker + + Springer - - Kage + + Aktiveringsskinne - - Seng + + Dropper - - Rødstensgentager + + Rødstenssammenligner - - Småkage + + Dagslyssensor - - Kort + + Rødstensblok - - Musikplade – "13" + + Farvet ler - - Musikplade – "cat" + + Sort, farvet ler - - Musikplade – "blocks" + + Rødt, farvet ler - - Musikplade – "chirp" + + Grønt, farvet ler - - Musikplade – "far" + + Halmballe - - Musikplade – "mall" + + Hærdet ler - - Musikplade – "mellohi" + + Kulblok - - Musikplade – "stal" + + Falm til - - Musikplade – "strad" + + Når denne indstilling er slået fra, kan monstre og dyr ikke ændre blokke (snigereksplosioner ødelægger for eksempel ikke blokke, og får fjerner ikke græs) eller samle genstande op. - - Musikplade – "ward" + + Når denne indstilling er slået til, beholder spillere deres lager, når de dør. - - Musikplade – "11" + + Når denne indstilling er slået fra, opstår væsner ikke naturligt. - - Musikplade – "where are we now?" + + Spiltype: Eventyr - - Saks + + Eventyr - - Græskarfrø + + Indtast seed for at danne det samme terræn igen. Du får en tilfældig verden, hvis du ikke indtaster noget. - - Melonfrø + + Når denne indstilling er slået fra, taber monstre og dyr ikke bytte (snigere taber for eksempel ikke krudt). - - Rå kylling + + {*PLAYER*} faldt ned ad en stige - - Stegt kylling + + {*PLAYER*} faldt ned ad nogle lianer - - Råt kød + + {*PLAYER*} faldt ud af vandet - - Steak + + Når denne indstilling er slået fra, kommer der ikke genstande ud af blokke (stenblokke giver for eksempel ikke brosten). - - Rådden fisk + + Når denne indstilling er slået fra, heler spillere ikke naturligt. - - Mørkeperle + + Når denne indstilling er slået fra, ændrer tidspunktet på dagen sig ikke. - - Melonskive + + Minevogn - - Flammestav + + Bind - - Gyslingetåre + + Slip fri - - Guldklump + + Fastgør - - Afgrundsurt + + Stig af - - {*splash*}{*prefix*}Eliksir {*postfix*} + + Fastgør kiste - - Glasflaske + + Affyr - - Vandflaske + + Navn - - Edderkoppeøje + + Signallys - - Gæret edderkoppeøje + + Primær kraft - - Pulver fra flammeånd + + Sekundær kraft - - Magmacreme + + Hest - - Bryggestativ + + Dropper - - Gryde + + Springer - - Mørkeøje + + {*PLAYER*} faldt fra et højt sted - - Glimmermelon + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal flagermus i en verden er nået. - - Erfaringseliksir + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal avlende heste er nået. - - Ildladning + + Spilindstillinger - - Ildladning (trækul) + + {*PLAYER*} åd ildkugler fra {*SOURCE*}, der brugte {*ITEM*} - - Ildladning (kul) + + {*PLAYER*} blev mørbanket af {*SOURCE*}, der brugte {*ITEM*} - - Ramme + + {*PLAYER*} blev slået ihjel af {*SOURCE*}, der brugte {*ITEM*} - - Fremkald {*CREATURE*} + + Væsendestruktion - - Afgrundsmursten + + Feltbytte - - Kranium + + Naturlig heling - - Kranium fra skelet + + Dag og nat - - Kranium fra visneskelet + + Behold lager - - Zombiehoved + + Væseners opståen - - Hoved + + Væseners bytte - - Hoved fra %s + + {*PLAYER*} blev skudt af {*SOURCE*}, der brugte {*ITEM*} - - Snigerhoved + + {*PLAYER*} faldt for langt og fik nådestødet af {*SOURCE*} - - Sten + + {*PLAYER*} faldt for langt og fik nådestødet af {*SOURCE*}, der brugte {*ITEM*} - - Græsblok + + {*PLAYER*} gik ind i ilden i kampen mod {*SOURCE*} - - Jord + + {*PLAYER*} blev dømt til at falde af {*SOURCE*} - - Brosten + + {*PLAYER*} blev dømt til at falde af {*SOURCE*} - - Planker af bøgetræ + + {*PLAYER*} blev dømt til at falde af {*SOURCE*}, som brugte {*ITEM*} - - Planker af grantræ + + {*PLAYER*} blev brændt til aske i kampen mod {*SOURCE*} - - Planker af birketræ + + {*PLAYER*} blev sprængt i stumper og stykker af {*SOURCE*} - - Planker af jungletræ + + {*PLAYER*} visnede bort - - Stikling + + {*PLAYER*} blev dræbt af {*SOURCE*}, der brugte {*ITEM*} - - Stikling fra bøgetræ + + {*PLAYER*} prøvede at svømme i lava for at undslippe {*SOURCE*} - - Stikling fra grantræ + + {*PLAYER*} druknede under flugten fra {*SOURCE*} - - Stikling fra birketræ + + {*PLAYER*} gik ind i en kaktus i forsøget på at undslippe {*SOURCE*} - - Stikling fra jungletræ + + Stig op - - Grundfjeld + + + Hesten skal have en sadel, hvis du vil styre den. Du kan købe sadler af landsbyboere eller finde dem i kister rundt omkring. + - - Vand + + + Du kan give tamme æsler og muldyr sadeltasker ved at fastgøre en kiste. Du kan åbne disse tasker, mens du rider eller sniger. + - - Lava + + + Heste og æsler (men ikke muldyr) kan avle ligesom andre dyr med guldæbler eller guldgulerødder. Føl bliver med tiden til voksne heste, men processen kan fremskyndes ved at fodre dem med hvede eller hø. + - - Sand + + + Heste, æsler og muldyr skal tæmmes, før du kan bruge dem. Du tæmmer en hest ved at prøve at ride på den og så blive på den, mens den prøver at smide dig af. + - - Sandsten + + + Når den er tæmmet, bliver den omgivet af hjerter og holder op med at prøve at smide dig af. + - - Grus + + + Prøv at ridde på hesten nu. Brug {*CONTROLLER_ACTION_USE*} uden genstande eller værktøj i dine hænder for at sætte dig op på den. + - - Guldmalm + + + Du kan prøve at tæmme heste og æsler her, og der er også sadler, hesterustning og andre nyttige ting til heste i kister heromkring. + - - Jernmalm + + Et signallys på en pyramide med mindst fire lag giver muligheden for enten den sekundære virkning regenerering eller en stærkere primær virkning. - - Kulmalm + + Du skal ofre en smaragd, diamant, guld- eller jernbarre i betalingsfeltet for at indstille virkningen af dit signallys. Når denne er på plads, vil signallyset udsende sin virkning for evigt. - - Træ + + På toppen af denne pyramide er der et inaktivt signalfyr. - - Bøgetræ + + Dette er signallysskærmen, hvor du kan vælge, hvilken virkning dit signallys skal have. + - - Grantræ + + +{*B*}Tryk{*CONTROLLER_VK_A*} for at fortsætte. +{*B*}Tryk{*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan man bruger signallysskærmen. + - - Birketræ + + I signallysskærmen kan du vælge en primær virkning for dit signallys. Jo flere lag, din pyramide har, jo flere virkninger vil du kunne vælge imellem. - - Jungletræ + + + Du kan ride på alle voksne heste, æsler og muldyr. Kun heste kan bære rustning, og kun muldyr og æsler kan udstyres med sadeltasker, du kan transportere ting i. + - - Bøg + + + Dette er hestens lager. + - - Gran + + + {*B*}Tryk på{*CONTROLLER_VK_A*} for at fortsætte. + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til hesteskærmen. + - - Birk + + + Hesteskærmen lader dig overføre genstande til din hest, dit æsel eller dit muldyr, eller give dyret udstyr på. + - - Blade + + Glimmer - - Bøgeblade + + Spor - - Granblade + + Varighed i luften: - - Birkeblade + + + Du kan sadle din hest op ved at placere en sadel på sadelpladsen. Heste kan få rustning ved at placere hesterustning på rustningspladsen. + - - Jungleblade + + Du har fundet et muldyr. - - Svamp + + {*B*}Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om heste, æsler og muldyr. +{*B*}Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til heste, æsler og muldyr. - - Glas + + + Heste og æsler findes mest på åbne sletter. Muldyr kan avles fra et æsel og en hest, men de er selv sterile. + - - Uld + + + Du kan også overføre genstande mellem dit eger lager og de sadeltasker, der er spændt fast på æsler og muldyr, med denne menu. + - - Sort uld + + Du har fundet en hest. - - Rød uld + + Du har fundet et æsel. - - Grøn uld + + +{*B*}Tryk{*CONTROLLER_VK_A*} for at lære mere om signallys. +{*B*}Tryk{*CONTROLLER_VK_B*}, hvis du allerede kender til signallys. + - - Brun uld + + + Du kan lave fyrværkeristjerner ved at placere krudt og farve i fremstillingsgitteret. + - - Blå uld + + + Farven bestemmer farven på fyrværkeristjernens eksplosion. + - - Lilla uld + + + Faconen på fyrværkeristjernen vælges ved at tilføje enten en ildladning, en guldklump, en fjer eller et hoved. + - - Cyan uld + + + Du kan også lægge adskillige fyrværkeristjerner i fremstillingsgitteret for at føje dem til fyrværkeriet. + - - Lysegrå uld + + + Hvis du fylder flere felter i fremstillingsgitteret med krudt, når alle fyrværkeristjernerne højere op, før de eksploderer. + - - Grå uld + + + Så kan du tage det færdige fyrværkeri ud af produktionspladsen, når du vil fremstille det. + - - Lyserød uld + + + Et spor eller en funklen kan tilføjes med diamanter og glødestenstøv. + - - Limegul uld + + + Fyrværkeri er dekorative genstande, som kan affyres med håndkraft eller fra automater. Du kan lave dem med papir, krudt og eventuelt et antal fyrværkeristjerner. + - - Gul uld + + + Fyrværkeristjerners farver, falmen, facon, størrelse og effekter (som spor og funklen) kan tilpasses ved at inkludere yderligere ingredienser, når du laver dem. + - - Lyseblå uld + + + Prøv at lave noget fyrværkeri ved arbejdsbordet med forskellige ingredienser fra kisterne. + - - Magentafarvet uld + + + Når du har lavet en fyrværkeristjerne, kan du vælge, hvilken farve fyrværkeristjernen skal falme med ved at farve den med farve. + - - Orange uld + + + I disse kister er der forskellige genstande, som kan bruges til at lave fyrværkeri af! + - - Hvid uld + + {*B*}Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om fyrværkeri. +{*B*}Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til fyrværkeri. + - - Blomst + + + Du skal lægge krudt og papir i det 3x3-håndværksgitter, der vises over din oppakning. + - - Rose + + Dette rum indeholder springere - - Svamp + + {*B*}Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om springere. +{*B*} Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til springere. + - - Blok af guld + + + Springere bruges til at flytte ting ind i og ud af beholdere og til automatisk at samle genstande op, der bliver kastet ind i dem. + - - En kompakt måde at opbevare guld på. + + + Aktive signallys sender en klar stråle af lys op i himlen og giver kræfter til spillere i nærheden. De laves af glas, obsidian og mørkestjerner, som du kan få ved at besejre Withers. + - - Blok af jern + + Signallys skal placeres, så de står i sollys om dagen. Signallys skal placeres på pyramider af jern, guld, smaragd eller diamant. Materialet, som signallyset placeres på, påvirker ikke signallysets virkning. - - En kompakt måde at opbevare jern på. + + + Prøv at bruge signallyset til vælge hvilke kræfter, det skal give. Du kan bruge de udleverede jernbarrer til den nødvendige betaling. + - - Flise af sten + + + De virker på bryggerstande, kister, automater, droppere, minevogne med kister, minevogne med springere og på andre springere. - - Flise af sten + + + I dette rum kan du se og eksperimentere med forskellige, nyttige springer-arrangementer. + - - Sandstensflise + + + Dette er fyrværkeriskærmen, hvor du kan lave fyrværkeri og fyrværkeristjerner. + - - Flise af bøgetræ + + + {*B*}Tryk på{*CONTROLLER_VK_A*} for at fortsætte. + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til fyrværkeriskærmen. + - - Flise af brosten + + + Springere bliver ved med at prøve at suge genstande ud af en passende beholder, som er placeret over dem. De vil også forsøge at putte opbevarede genstande i en destinationsbeholder. + - - Flise af mursten + + + Men hvis en springer er drevet af rødsten, bliver den inaktiv og holder op med både at suge og videregive ting. + - - Flise af stenmursten + + + En springer peger i den retning, den sender genstande. Hvis du vil have en springer til at pege på en bestemt blok, skal du placere springeren mod den blok, mens du sniger. + - - Flise af bøgetræ + + Disse fjender findes i sumpe og angriber dig ved at kaste eliksirer. De efterlader eliksirer, når de dør. - - Flise af grantræ + + Det maksimale antal af malerier/rammer i verdenen er nået. - - Flise af birketræ + + Du kan ikke fremkalde fjender i spiltypen Fredfyldt. - - Flise af jungletræ + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal avlende grise, får, køer, katte og heste er nået. - - Flise af afgrundsmursten + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af blæksprutter i verdenen er nået. - - Mursten + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af fjender i verdenen er nået. - - TNT + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af landsbyboere i verdenen er nået. - - Bogreol + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede ulve er nået. - - Mossten + + Det maksimale antal af hoveder i verdenen er nået. - - Obsidian + + Vend kamera - - Fakkel + + Venstrehåndet - - Fakkel (kul) + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede høns er nået. - - Fakkel (trækul) + + Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede muhsvampe er nået. - - Ild + + Det maksimale antal af både i verdenen er nået. - - Monsterfremkalder + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af høns i verdenen er nået. - - Trappe af bøgetræ + + +{*C2*}Tag en dyb indånding nu. Tag en mere. Mærk luften i dine lunger. Lad dine lemmer komme tilbage. Ja, bevæg dine fingre. Få en krop igen. Mærk tyngdekraften, mærk luften. Lad dig gendanne i den lange drøm. Der er du. Hele din krop er nu atter i kontakt med universet, som om I var to forskellige ting. Som om vi var forskellige ting.{*EF*}{*B*}{*B*} +{*C3*}Hvem er vi? En gang blev vi kaldt bjergets ånd. Fader sol, moder måne. Forfædrenes ånder, dyrenes ånder. Flaskeånder. Spøgelser. Denne grønne mand. Dernæst guder og dæmoner. Engle. Poltergejster. Rumvæsner, fremmede. Leptoner, kvarker. Ordene forandrer sig. Vi forandrer os ikke.{*EF*}{*B*}{*B*} +{*C2*}Vi er universet. Vi er alt det, som du tror ikke er dig. Du kigger på os nu gennem din hud og dine øjne. Hvorfor rører universet ved din hud og kaster lys på dig? For at se dig, spiller. For at lære dig at kende. Og for at give sig selv til kende. Jeg vil fortælle dig en historie.{*EF*}{*B*}{*B*} +{*C2*}Der var engang en spiller.{*EF*}{*B*}{*B*} +{*C3*}Du var den spiller, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Engang i mellem betragtede den sig selv som et menneske placeret på den tynde overflade af en snurrende kugle fyldt med rødglødende stenmasser. Kuglen af rødglødende sten kredsede omkring en gigantisk klump af gas og ild, der var 330.000 gange større end den selv. De var så langt fra hinanden, at det tog lyset otte minutter at tilbagelægge afstanden mellem dem. Lyset var information fra en stjerne, og det kunne forbrænde din hud på 150.000.000 kilometers afstand.{*EF*}{*B*}{*B*} +{*C2*}Nogle gange drømte spilleren, at den var en minearbejder på overfladen af en verden, der var flad og uendelig. Solen var en hvid firkant. Dagene var korte. Der var meget, der skulle gøres, og døden en midlertidig ulejlighed.{*EF*}{*B*}{*B*} +{*C3*}Nogle gange drømte spilleren, at den var fortabt i en historie.{*EF*}{*B*}{*B*} +{*C2*}Nogle gange drømte spilleren, at den var noget andet et helt andet sted. Nogle gange var drømmene foruroligende. Nogle gange var de smukke. Nogle gange vågnede spilleren fra en drøm op i en anden for derefter at vågne i en tredje.{*EF*}{*B*}{*B*} +{*C3*}Nogle gange drømte spilleren, at den så ord på skærmen.{*EF*}{*B*}{*B*} +{*C2*}Lad os gå tilbage.{*EF*}{*B*}{*B*} +{*C2*}Spillerens atomer blev spredt i græsset, i floderne, i luften og i jorden. En kvinde samlede atomerne sammen. Hun drak, spiste og indhalerede dem og samlede spilleren i sin krop.{*EF*}{*B*}{*B*} +{*C2*}Og spilleren vågnede i den lange drøm fra det mørke varme i moderens krop.{*EF*}{*B*}{*B*} +{*C2*}Og spilleren var en ny fortælling, der aldrig var blevet fortalt før, skrevet med DNA'ens bogstaver. Og spilleren var et nyt program, der aldrig var blevet afviklet før, skabt af en kildekode, der var en milliard år gammel. Og spilleren var et nyt menneske, der aldrig havde levet før, skabt udelukkende af mælk og kærlighed.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren. Historien. Programmet. Mennesket. Skabt af mælk og kærlighed.{*EF*}{*B*}{*B*} +{*C2*}Lad os gå endnu længere tilbage.{*EF*}{*B*}{*B*} +{*C2*}De syv milliarder af milliarder atomer i spillerens krop blev skabt i hjertet af en stjerne længe inden spillet. Spilleren er dermed også information fra en stjerne. Og spilleren bevæger sig gennem en historie, der er en skov af informationer, som er blevet plantet af en mand ved navn Julian, i en flad uendelig verden, skabt af en anden mand ved navn Markus, som eksisterer i en lille privat verden, der er skabt af spilleren, som lever i et univers skabt af ...{*EF*}{*B*}{*B*} +{*C3*}Stille. Nogle gange skabte spilleren en lille privat verden, der var blød, varm og enkel. Andre gange var den hård, kold og kompliceret. Nogle gange byggede den en model af universet i sit hoved. Stumper af energi, der bevæger sig igennem det uendelige rum. Nogle gange kaldte den stumperne for "elektroner" og "protoner".{*EF*}{*B*}{*B*} + - - Kiste + + +{*C2*}Andre gange kaldte den dem for "planeter" og "stjerner".{*EF*}{*B*}{*B*} +{*C2*}Nogle gange troede den, at den var i et univers, der var lavet af energi, der bestod af stadierne tændt og slukket. Nuller og ettaller. Linjer af programkode. Nogle gange troede den, at den spillede et spil. Andre gange troede den, at den læste ordene på en skærm.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren, der læseren ordene ... {*EF*}{*B*}{*B*} +{*C2*}Stille ... Nogle gange læste spilleren linjer med programkode på en skærm. Afkodede dem, så de blev til ord. Afkodede ord, så de gav mening. Afkodede meningen, så den blev til følelser, teorier og idéer. Spilleren begyndte at trække vejret hurtigere og dybere og opdagede, at den var i live. Den var i live, og de tusinde dødsfald havde ikke været virkelige. Spilleren var i live{*EF*}{*B*}{*B*} +{*C3*}Dig. Dig. Du er i live.{*EF*}{*B*}{*B*} +{*C2*}og nogle gange troede spilleren, at universet havde talt til den gennem solskinnet, der brød gennem træernes kroner om sommeren{*EF*}{*B*}{*B*} +{*C3*}og nogle gange troede spilleren, at universet havde talt til den gennem lyset, der faldt fra den frostklare nattehimmel om vinteren, hvor lysglimtet i spillerens øjenkrog måske kunne være fra en stjerne, der var en million gange større end solen, og som havde forkullet alle planeterne omkring sig for at være synlig i dette korte øjeblik for spilleren, der var på vej hjem på den anden side af universet, og som pludselig kunne lugte mad uden for en velkendt dør, inden drømmen begyndte igen{*EF*}{*B*}{*B*} +{*C2*}og nogle gange troede spilleren, at universet havde talt til den gennem nuller og ettaller, gennem verdenens elektricitet, gennem de rullende ord på skærmen for enden af drømmen{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, jeg elsker dig{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at du havde spillet godt{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at alt du behøver findes i dig{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at du er stærkere, end du tror{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at du er sollyset{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at du er natten{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at mørket, du bekæmper, findes i dig{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at lyset, du søger, findes i dig{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at du ikke er alene{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, at du ikke er adskilt fra alt andet omkring dig{*EF*}{*B*}{*B*} +{*C3*}og universet sagde, at du er universet, der smager på sig selv, taler til sig selv, læser sin egen programkode{*EF*}{*B*}{*B*} +{*C2*}og universet sagde, jeg elsker dig, fordi du er kærlighed.{*EF*}{*B*}{*B*} +{*C3*}Og spillet var slut, og spilleren vågnede op fra drømmen. Og spilleren begyndte en ny drøm. Og spilleren drømte igen og drømte bedre. Og spilleren var universet. Og spilleren var kærlighed.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren.{*EF*}{*B*}{*B*} +{*C2*}Vågn op.{*EF*} + - - Støv fra rødsten + + Nulstil Afgrunden - - Diamantmalm + + %s er rejst til Mørket - - Blok af diamant + + %s har forladt Mørket - - En kompakt måde at opbevare diamanter på. + + +{*C3*}Jeg kan se spilleren, du tænker på.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Ja. Pas på dig selv. Den har opnået et højere niveau nu. Den kan læse vores tanker.{*EF*}{*B*}{*B*} +{*C2*}Det er ligegyldigt. Den tror, at vi er en del af spillet.{*EF*}{*B*}{*B*} +{*C3*}Jeg kan godt lide denne spiller. Spillede godt. Gav ikke op.{*EF*}{*B*}{*B*} +{*C2*}Den læser vores tanker, som var de blot ord på en skærm.{*EF*}{*B*}{*B*} +{*C3*}Det er sådan, den forestiller sig mange ting, når den befinder sig dybt i spillets drøm.{*EF*}{*B*}{*B*} +{*C2*}Ord er et vidunderligt interface. Meget fleksible. Og langt mindre skræmmende at stirre på end virkeligheden bag skærmen.{*EF*}{*B*}{*B*} +{*C3*}Før hørte de stemmer. Inden spillerne kunne læse. Det var dengang, hvor de, der ikke spillede, kaldte spillerne for hekse og troldkarle. Og spillerne drømte, at de fløj gennem luften på pinde ved hjælp af dæmonernes kraft.{*EF*}{*B*}{*B*} +{*C2*}Hvad drømte denne spiller om?{*EF*}{*B*}{*B*} +{*C3*}Denne spiller drømte om solskin og træer. Om ild og vand. Den drømte, at den skabte. Og den drømte, at den ødelagde. Den drømte, at den jagede, og den drømte, at den blev jaget. Den drømte om ly.{*EF*}{*B*}{*B*} +{*C2*}Ha, den oprindelige brugerflade. En million år på bagen og det virker stadig. Men hvilken struktur skabte denne spiller mon i virkeligheden bag skærmen?{*EF*}{*B*}{*B*} +{*C3*}Den arbejdede sammen med millioner af andre spillere for at forme en sand verden i folden på {*EF*}{*NOISE*}{*C3*}, og den skabte en {*EF*}{*NOISE*}{*C3*} til {*EF*}{*NOISE*}{*C3*} i {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Den tanke kan den ikke læse.{*EF*}{*B*}{*B*} +{*C3*}Nej. Den har endnu ikke opnået det højeste niveau. Det skal den opnå i den lange drøm om livet, ikke i den korte drøm om spillet.{*EF*}{*B*}{*B*} +{*C2*}Ved den, at vi elsker den? At universet er den venligt stemt?{*EF*}{*B*}{*B*} +{*C3*}Engang i mellem hører den universet gennem sine tankers støj.{*EF*}{*B*}{*B*} +{*C2*}Men andre gange bliver den trist i den lange drøm. Den skaber verdener uden somre, og den ryster i kulden under den mørke sol. Den forveksler sit triste skaberværk med virkeligheden.{*EF*}{*B*}{*B*} +{*C3*}Men det ville ødelægge den at blive befriet fra sin sørgmodighed. Sørgmodigheden er en del af dens private opgave. Vi må ikke blande os.{*EF*}{*B*}{*B*} +{*C2*}Når de ligger i den dybeste søvn, har jeg lyst til at fortælle dem, at de bygger ægte verdener i virkeligheden. Jeg har lyst til at fortælle dem om deres betydning for universet. Når de ikke har haft ægte kontakt i lang tid, får jeg lyst til at hjælpe dem med at sige det ord, de frygter.{*EF*}{*B*}{*B*} +{*C3*}Den læser vores tanker.{*EF*}{*B*}{*B*} +{*C2*}Nogle gange er jeg ligeglad. Nogle gange har jeg lyst til at fortælle dem, at den verden, som de tror er ægte, i virkeligheden er {*EF*}{*NOISE*}{*C2*} og {*EF*}{*NOISE*}{*C2*}. Jeg har lyst til at fortælle dem, at {*EF*}{*NOISE*}{*C2*} i {*EF*}{*NOISE*}{*C2*}. De ser så lidt af virkeligheden i deres lange drøm.{*EF*}{*B*}{*B*} +{*C3*}Og alligevel spiller de spillet.{*EF*}{*B*}{*B*} +{*C2*}Men det ville være så let at fortælle dem ...{*EF*}{*B*}{*B*} +{*C3*}For stærk til denne drøm. Hvis du fortæller dem, hvordan de skal leve, forhindrer du dem samtidig i at gøre det.{*EF*}{*B*}{*B*} +{*C2*}Jeg vil ikke fortælle spilleren, hvordan den skal leve.{*EF*}{*B*}{*B*} +{*C3*}Spilleren er rastløs.{*EF*}{*B*}{*B*} +{*C2*}Jeg vil fortælle spilleren en historie.{*EF*}{*B*}{*B*} +{*C3*}Men ikke sandheden.{*EF*}{*B*}{*B*} +{*C2*}Nej. En historie, der indeholder sandheden på en sikker måde. I et bur af ord. Ikke den skinbarlige sandhed, der brænder sig fast på en hvilken som helst afstand.{*EF*}{*B*}{*B*} +{*C3*}Giv den en krop igen.{*EF*}{*B*}{*B*} +{*C2*}Ja. Spiller ... {*EF*}{*B*}{*B*} +{*C3*}Brug dens navn.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Spiller af spil.{*EF*}{*B*}{*B*} +{*C3*}Godt.{*EF*}{*B*}{*B*} + - - Arbejdsbord + + Er du sikker på, at du vil nulstille Afgrunden i dette gemte spil til sin standardtilstand? Du vil miste alt, du har bygget i Afgrunden. - - Afgrøder + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af grise, får, køer, katte og heste er nået. - - Landbrugsjord + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af muhsvampe er nået. - - Ovn + + Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af ulve i verdenen er nået. - - Skilt + + Nulstil Afgrunden - - Trædør + + Lad være med at nulstille Afgrunden - - Stige + + Du kan ikke klippe denne muhsvamp i øjeblikket. Det maksimale antal af grise, får, køer, katte og heste er nået. - - Skinne + + Du døde! - - Strømskinne + + Verdensindstillinger - - Kontaktskinne + + Kan bygge og udvinde materialer - - Trappe af sten + + Kan bruge døre og kontakter - - Håndtag + + Opret strukturer - - Trykplade + + Helt flad verden - - Jerndør + + Bonuskiste - - Rødstensmalm + + Kan åbne beholdere - - Rødstensfakkel + + Smid spiller ud - - Knap + + Kan flyve - - Sne + + Slå udmattelse fra - - Is + + Kan angribe spillere - - Kaktus + + Kan angribe dyr - - Ler + + Moderator - - Sukkerrør + + Værtsprivilegier - - Jukebox + + Sådan spiller du - - Hegn + + Styring - - Græskar + + Indstillinger - - Græskarlygte + + Gendan - - Afgrundssten + + Tilbud på indhold, der kan hentes - - Sjælesand + + Skift overflade - - Glødesten + + Folkene bag - - Portal + + TNT eksploderer - - Lasurstensmalm + + Spiller mod spiller - - Blok af lasursten + + Stol på spillere - - En kompakt måde at opbevare lasursten på. + + Geninstallér indhold - - Automat + + Gendan indstillinger - - Nodeblok + + Ilden spreder sig - - Kage + + Mørkedrage - - Seng + + {*PLAYER*} blev dræbt af mørkedragens ånde - - Spindelvæv + + {*PLAYER*} blev dræbt af {*SOURCE*} - - Højt græs + + {*PLAYER*} blev dræbt af {*SOURCE*} - - Vissen busk + + {*PLAYER*} døde - - Diode + + {*PLAYER*} sprang i luften - - Låst kiste + + {*PLAYER*} blev dræbt af magi - - Faldlem + + {*PLAYER*} blev skudt af {*SOURCE*} - - Uld (en hvilken som helst farve) + + Grundfjeldståge - - Stempel + + Vis display - - Klistret stempel + + Vis hånd - - Blok med sølvfisk + + {*PLAYER*} blev skudt ned med ildkugler af {*SOURCE*} - - Mursten af sten + + {*PLAYER*} blev banket ihjel af {*SOURCE*} - - Mursten af mossten + + {*PLAYER*} blev dræbt af {*SOURCE*}, der brugte magi - - Revnet mursten af sten + + {*PLAYER*} faldt ud af verdenen - - Tilhugget mursten af sten + + Teksturpakker - - Svamp + + Mash-up-pakke - - Svamp + + {*PLAYER*} gik op i røg - - Jernbarrer + + Temaer - - Rude af glas + + Spillerbilleder - - Melon + + Avatargenstande - - Græskarstilk + + {*PLAYER*} brændte ihjel - - Melonstilk + + {*PLAYER*} sultede ihjel - - Vinranke + + {*PLAYER*} blev stukket ihjel - - Låge + + {*PLAYER*} ramte jorden for hurtigt - - Trappe af mursten + + {*PLAYER*} prøvede at svømme i lava - - Trappe af stenmursten + + {*PLAYER*} blev kvalt i en væg - - Sølvfisk fra sten + + {*PLAYER*} druknede - - Sølvfisk fra brosten + + Beskeder ved dødsfald - - Sølvfisk fra mursten af sten + + Du er ikke længere en moderator - - Mycelium + + Nu kan du flyve - - Åkandeblad + + Du kan ikke længere flyve - - Afgrundsmursten + + Du kan ikke længere angribe dyr - - Hegn af afgrundsmursten + + Nu kan du angribe dyr - - Trappe af afgrundsmursten + + Nu er du en moderator - - Afgrundsurt + + Du vil ikke længere blive udmattet - - Fortryllelsesbord + + Nu er du usårlig - - Bryggestativ + + Du er ikke længere usårlig - - Gryde + + %d MSP - - Portal til Mørket + + Nu bliver du udmattet - - Portalramme til Mørket + + Nu er du en usynlig - - Mørkesten + + Du er ikke længere usynlig - - Drageæg + + Nu kan du angribe andre spillere - - Buskads + + Nu kan du udvinde og bruge genstande - - Bregne + + Du kan ikke længere placere blokke - - Trappe af sandsten + + Nu kan du placere blokke - - Trappe af grantræ + + Animerede figurer - - Trappe af birketræ + + Tilpassede skinanimationer - - Trappe af jungletræ + + Du kan ikke længere udvinde eller bruge genstande - - Rødstenslampe + + Nu kan du bruge døre og kontakter - - Kakao + + Du kan ikke længere angribe væsner - - Kranium + + Nu kan du angribe væsner - - Nuværende styring + + Du kan ikke længere angribe andre spillere - - Layout + + Du kan ikke længere bruge døre og kontakter - - Gå/spurt + + Nu kan du bruge beholdere (fx kister) - - Synsvinkel + + Du kan ikke længere bruge beholdere (fx kister) - - Pause + + Usynlig - - Hop + + Signallys + + + {*T3*}SÅDAN SPILLER DU: SIGNALLYS{*ETW*}{*B*}{*B*} +Aktive signallys udsender en lysstråle op i luften og giver ekstra kræfter til spillere i nærheden.{*B*} +De fremstilles af glas, obsidian og afgrundsstjerner, som du kan få ved at bekæmpe Visneren.{*B*}{*B*} +Signallys skal placeres, så de står i sollys om dagen. Signallys skal placeres på pyramider af jern, guld, smaragd eller diamant.{*B*} +Materialet, som signallyset placeres på, påvirker ikke signallysets virkning.{*B*}{*B*} +I signallysmenuen kan du vælge en primær virkning for dit signallys. Jo flere lag din pyramide har, jo flere virkninger vil du kunne vælge imellem.{*B*} +Et signallys på en pyramide med mindst fire lag giver også muligheden for enten den sekundære virkning regenerering eller en stærkere primær virkning.{*B*}{*B*} +Du skal ofre en smaragd, diamant, guld- eller jernbarre i betalingsfeltet for at indstille virkningen af dit signallys.{*B*} +Signallyset vil udsende sin virkning for evigt, når denne er på plads.{*B*} + - - Hop/flyv op + + Fyrværkeri + + + Sprog + + + Heste + + + {*T3*}SÅDAN SPILLER DU: HESTE{*ETW*}{*B*}{*B*} +Heste og æsler findes hovedsagligt på åbne sletter. Muldyr er afkom af et æsel og en hest, men de er selv sterile.{*B*} +Du kan ride på alle voksne heste, æsler og muldyr. Kun heste kan bære rustning, og kun muldyr og æsler kan udstyres med sadeltasker, du kan transportere ting i. +Heste, æsler og muldyr skal tæmmes, før du kan bruge dem. Du tæmmer en hest ved at forsøge at ride på den og at holde dig på den, mens den forsøger at kaste dig af.{*B*} +Når der dukker hjerter op rundt om en hest, er den tam, og så vil den ikke længere prøve at kaste dig af. Du skal udstyre hesten med en sadel for at kunne styre den.{*B*}{*B*} +Sadler kan købes af landsbyboere, fanges, når du fisker, eller findes i kister rundt omkring i verden.{*B*} +Du kan give tamme æsler og muldyr sadeltasker ved at fastgøre en kiste. Du kan åbne sadeltaskerne, mens du rider eller sniger.{*B*}{*B*} +Heste og æsler (men ikke muldyr) kan avles ligesom andre dyr med guldæbler eller guldgulerødder.{*B*} +Føl vokser med tiden op og bliver til voksne heste, men det går hurtigere, hvis du fodrer dem med hvede eller hø.{*B*} + + + {*T3*}SÅDAN SPILLER DU: FYRVÆRKERI{*ETW*}{*B*}{*B*} +Fyrværkeri er dekorative genstande, som kan affyres med håndkraft eller fra automater. Du laver dem af papir og krudt, og du kan vælge også at bruge fyrværkeristjerner.{*B*} +Fyrværkeristjerners farver, falmen, facon, størrelse og effekter (såsom spor og funklen) kan tilpasses med yderligere ingredienser, når du laver dem.{*B*}{*B*} +Du laver fyrværkeri ved at placere krudt og papir i det 3x3-fremstillingsgitter, der vises over din oppakning.{*B*} +Du kan også placere flere fyrværkeristjerner i fremstillingsgitteret for at føje dem til fyrværkeriet.{*B*} +Hvis du fylder flere felter i fremstillingsgitteret med krudt, når fyrværkeristjernerne højere op, før de eksploderer.{*B*}{*B*} +Så kan du tage fyrværkeriet ud af produktionspladsen.{*B*}{*B*} +Fyrværkeristjerner kan laves ved at placere krudt og farve i fremstillingsgitteret.{*B*} +- Farven bestemmer farven på fyrværkeristjernens eksplosion.{*B*} +- Formen på fyrværkeristjernen bestemmes ved enten at tilføje en ildladning, en guldklump eller et hoved fra et væsen.{*B*} +- Du kan tilføje et spor eller en funklen ved at bruge diamanter eller glødestenstøv.{*B*}{*B*} +Når du har lavet en fyrværkeristjerne, kan du vælge dens falmefarve ved at lave den med farve. + + + + {*T3*}SÅDAN SPILLER DU: DROPPERE{*ETW*}{*B*}{*B*} +Når droppere får et rødstenssignal, spytter de en enkelt, tilfældig ting, som de indeholder, ud på jorden. Brug {*CONTROLLER_ACTION_USE*} til at åbne dropperen, så kan du fylde den med ting fra din oppakning.{*B*} +Hvis dropperen vender mod en kiste eller en anden type beholder, bliver genstanden puttet i den i stedet for. Lange kæder af droppere kan bruges til at transportere genstande langt. Hvis det skal virke, skal de skiftevis tændes og slukkes. + + + + Når du bruger det, bliver det til et kort over den del af verden, du er i, og så bliver det udfyldt, mens du udforsker. + + + Efterlades af Wither, anvendes til at lave signallys. + + + Springere + + + {*T3*}SÅDAN SPILLER DU: Springere{*ETW*}{*B*}{*B*} +Springere bruges til at tilføje eller fjerne ting fra containere og til automatisk at samle ting op, der bliver kastet ind i dem.{*B*} +De kan påvirke bryggerstande, kister, automater, droppere, minevogne med kister, minevogne med springere samt andre springere.{*B*}{*B*} +Springere bliver ved med at suge ting ud af en passende beholder, der er placeret over dem. De forsøger også at placere de opbevarede genstande i en destinationsbeholder.{*B*} +Hvis en springer er drevet af rødsten, bliver den inaktiv og holder op med både at suge genstande ind og at spytte dem ud.{*B*}{*B*} +En springer peger i den retning, den prøver at aflevere tingene i. Hvis du vil have en springertil at pege på en bestemt blok, skal du placere springere mod den blok, mens du sniger.{*B*} + + + + Droppere - - Lager + + BRUGES IKKE - - Skift anvendt genstand + + Øjeblikkelig energi - - Handling + + Øjeblikkelig skade - - Anvend + + Hoppeboost - - Fremstilling + + Minetræthed - - Smid + + Styrke - - List + + Svaghed - - List/flyv nedad + + Kvalme - - Skift kameravinkel + + BRUGES IKKE - - Spillere/invitér + + BRUGES IKKE - - Bevægelse (flyver) + + BRUGES IKKE - - Layout 1 + + Regenerering - - Layout 2 + + Modstand - - Layout 3 + + Finder seed til verdensgeneratoren - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Skaber kulørte eksplosioner, når de aktiveres. Deres farve, effekt, facon og falmen bestemmes af den fyrværkeristjerne, der blev brugt til at lave dem. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + En type skinner, der kan aktivere eller deaktivere minevogne med springere og udløse minevogne med TNT. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Bruges til at holde og smide genstande eller til at skubbe genstande over i en anden beholder, når den får rødstensstrøm. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Kulørte blokke, du kan lave ved at farve hærdet ler. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Udsender rødstensstrøm. Strømmen er stærkere, hvis der er flere genstande på pladen. Kræver mere vægt end den lette plade. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Bruges som rødstensenergikilde. Kan laves om til rødsten igen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Bruges til at fange genstande eller overføre genstande ind og ud af beholdere. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Kan fodres til heste, æsler eller muldyr for at helbrede op til 10 hjerter. Fremskynder føls vækst. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Flagermus - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Disse flyvende væsener findes i huler eller andre store, lukkede rum. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Heks - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Laves ved at smelte ler i en ovn. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Laves af glas og en farve. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Laves af mosaikglas. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Udsender rødstensstrøm. Strømmen er stærkere, hvis der er flere genstande på pladen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Er en blok, som sender et rødstenssignal baseret på sollys (eller mangel på sollys). - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Er en særlig type minevogn, der fungerer ligesom en springer. Den indsamler genstande, der ligger på skinnerne og fra beholdere over den. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + En særlig type rustning, som en hest kan bære. Giver fem rustning. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Bruges til at bestemme farven, effekten og formen af fyrværkeri. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Bruges i rødstenskredsløb til at vedligeholde, sammenligne eller fratrække signalstyrke eller til at måle visse bloktilstande. - - {*B*}Tryk på {*CONTROLLER_VK_A*} for at fortsætte. + + Er en type minevogn, der fungerer som en rullende TNT-blok. - - {*B*}Tryk på {*CONTROLLER_VK_A*} for at starte introduktionen.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du mener, at du er klar til at spille på egen hånd. + + En særlig type rustning, som en hest kan bære. Giver syv rustning. - - Minecraft er et spil, der handler om at bygge alt, du kan forstille dig, med blokke. -Om natten kommer monstrene frem, så du skal sørge for at bygge et tilflugtssted, inden det sker. + + Bruges til at udføre kommandoer. - - Brug {*CONTROLLER_ACTION_LOOK*} for at kigge op, ned og rundt omkring dig. + + Sender en stråle af lys op i himlen og giver statuseffekter til spillere i nærheden. - - Brug {*CONTROLLER_ACTION_MOVE*} for at gå. + + Kan opbevare blokke og genstande. Placér to kister ved siden af hinanden for at skabe en større kiste med dobbelt så meget plads. Fældekisten sender også et rødstenssignal, når den åbnes. - - Skub {*CONTROLLER_ACTION_MOVE*} fremad to gange hurtigt. Hvis du bliver ved med at skubbe {*CONTROLLER_ACTION_MOVE*} fremad, vil du fortsætte med at spurte, indtil du løber tør for spurtetid eller mad. - + + En særlig type rustning, som en hest kan bære. Giver 11 rustning. - - Tryk på {*CONTROLLER_ACTION_JUMP*} for at hoppe. + + Bruges til at tøjre monstre til spilleren eller hegnspæle. - - Hold {*CONTROLLER_ACTION_ACTION*} nede for at hakke og hugge med hænderne eller det redskab, som du bruger. Du får brug for et redskab for at udvinde bestemte materialer ... + + Bruges til at navngive monstre i verdenen. - - Hold {*CONTROLLER_ACTION_ACTION*} nede for at hugge fire blokke af træ (træstammer).{*B*}Når blokken går i stykker, kan du samle den svævende genstand op ved at stille dig i nærheden, hvorefter den dukker op i dit lager. + + Hast - - Tryk på {*CONTROLLER_ACTION_CRAFTING*} for at åbne fremstillingsskærmen. + + Oplås det fulde spil - - Dit lager bliver fyldt, efterhånden som du fremstiller og indsamler flere genstande.{*B*} - -Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. + + Genoptag spil - - I takt med at du udforsker omgivelserne, udvinder materialer og angriber andre væsner, bliver din madbjælke tømt {*ICON_SHANK_01*}. Du forbrænder meget mere mad, når du spurter eller spurthopper fremfor at gå og hoppe normalt. - + + Gem spil - - Hvis du mister energi, men har ni eller flere {*ICON_SHANK_01*} på din madbjælke, vil din energi blive gendannet automatisk. Din madbjælke bliver fyldt igen, når du spiser. + + Spil - - Hold {*CONTROLLER_ACTION_USE*} nede for at spise den mad, du holder i hånden, og fylde din madbjælke. Du kan ikke spise noget, hvis din madbjælke allerede er fuld. + + Ranglister - - Din madbjælke er snart tom, og du har mistet noget energi. Spis steaken fra dit lager for at fylde din madbjælke igen og få energi igen.{*ICON*}364{*/ICON*} + + Hjælp og indstillinger - - Du kan lave planker ud af det træ, du finder. Åbn fremstillingsskærmen for at lave dem.{*PlanksIcon*} + + Sværhedsgrad: - - Mange fremstillingsprocesser indeholder flere trin. Nu hvor du har nogle planker, er der flere genstande, som du kan lave. Byg et arbejdsbord.{*CraftingTableIcon*} + + PvP: - - Du kan samle blokke hurtigere, hvis du bygger et redskab, der kan hjælpe dig med arbejdet. Nogle redskaber har håndtag, der er lavet af pinde. Fremstil nogle pinde.{*SticksIcon*} + + Stol på spillere: - - Brug {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for at udskifte den genstand, du har i hånden. + + TNT: - - Tryk på {*CONTROLLER_ACTION_USE*} for at bruge genstande, interagere med genstande og placere ting. Når du har placeret en ting, kan du samle den op igen ved at hakke på den med det rigtige redskab. + + Spiltype: - - Vælg arbejdsbordet, og ret sigtekornet mod det sted, hvor du vil placere det. Tryk på {*CONTROLLER_ACTION_USE*} for at placere arbejdsbordet. + + Strukturer: - - Ret sigtekornet mod arbejdsbordet, og tryk på {*CONTROLLER_ACTION_USE*} for at åbne det. + + Banetype: - - Du kan grave bløde blokke som jord og sne hurtigere op, hvis du har en skovl. Efterhånden som du samler flere materialer, kan du lave redskaber, der er mere effektive og holder længere. Lav en træskovl.{*WoodenShovelIcon*} + + Fandt ingen spil - - Du kan hugge træ og lave fliser af træ hurtigere, hvis du har en økse. Efterhånden som du samler flere materialer kan du lave redskaber, der er mere effektive og holder længere. Lav en træøkse.{*WoodenHatchetIcon*} + + Kun for inviterede - - Du kan udvinde materialer fra hårde blokke som sten og malm, hvis du har en hakke. Efterhånden som du samler flere materialer kan du lave redskaber, der er mere effektive og holder længere, og som giver dig mulighed for at udvinde hårdere materialer. Lav en træhakke.{*WoodenPickaxeIcon*} + + Flere indstillinger - - Åbn beholderen + + Indlæs - - - Natten kommer pludseligt, og det er farligt at være udendørs, hvis du er uforberedt. Du kan lave våben og rustninger, men det er klogt at have et sikkert tilflugtssted. - + + Indstillinger for vært - - - I nærheden finder du en minearbejders forladte tilflugtssted, som du kan bygge færdigt for at få et sikkert sted at tilbringe natten. - + + Spillere/invitér - - - Du skal samle nogle ressourcer for at bygge tilflugtsstedet færdigt. Du kan lave vægge og tag af alle slags materialer, men du skal også bruge en dør, nogle vinduer og noget lys. - + + Onlinespil - - Hak nogle blokke af sten ud med din hakke. Blokke af sten giver brosten, når du hakker dem. Når du har samlet otte brosten, kan du bygge en ovn. Du skal muligvis grave gennem jord for at nå ned til sten, og det går hurtigere, hvis du bruger en skovl.{*StoneIcon*} + + Ny verden - - Du har samlet nok brosten til at bygge en ovn. Byg en på arbejdsbordet. + + Spillere + + + Tilslut spil + + + Start spil + + + Navn på verden + + + Seed til verdensgeneratoren + + + Lad stå tom for tilfældigt seed + + + Ilden spreder sig: + + + Redigér besked på skilt: + + + Indtast oplysningerne til dit billede + + + Overskrift + + + Redskabstips i spillet + + + Lodret delt skærm for to spillere + + + Afslut + + + Billede fra spillet + + + Ingen effekter + + + Fart + + + Langsomhed + + + Redigér besked på skilt: + + + Klassiske teksturer, ikoner og brugerdisplay fra Minecraft! + + + Vis alle mash-up-verdener + + + Tip + + + Geninstallér avatargenstand 1 + + + Geninstallér avatargenstand 2 + + + Geninstallér avatargenstand 3 + + + Geninstallér tema + + + Geninstallér spillerbillede 1 + + + Geninstallér spillerbillede 2 + + + Indstillinger + + + Brugerdisplay + + + Gendan standardindstillinger + + + Vis gangbevægelse + + + Lyd + + + Følsomhed + + + Grafik + + + Bruges til eliksirbrygning. Efterlades af gyslinger, når de dør. + + + Efterlades af zombiegrisemænd, når de dør. Zombiegrisemænd findes i Afgrunden. Bruges som ingrediens i eliksirer. + + + Bruges til eliksirbrygning. Vokser naturligt i afgrundsfæstningen. Kan også plantes i sjælesand. + + + Bliver glat, når du går på det. Blokken bliver til vand, hvis den hakkes i stykker, mens den står oven på en anden blok. Smelter, hvis den kommer tæt på en lyskilde eller placeres i Afgrunden. + + + Kan bruges som dekoration. + + + Bruges til eliksirbrygning og til at finde fæstninger med. Efterlades af flammeånder, der ofte findes i nærheden af eller inde i afgrundsfæstningen. + + + Har forskellige effekter alt afhængigt af, hvad den bruges til. + + + Bruges til eliksirbrygning eller som ingrediens i fremstilling af mørkeøjne eller magmacreme. + + + Bruges til eliksirbrygning. + + + Bruges til fremstilling af eliksirer og kasteeliksirer. + + + Kan fyldes med vand som grundingrediens i en eliksir i bryggestativet. + + + Er giftig at spise og kan bruges i eliksirer. Efterlades af edderkopper og huleedderkopper, når du dræber dem. + + + Bruges til eliksirbrygning ofte med negativ effekt. + + + Vokser med tiden, når den er blevet plantet. Kan klippes med en saks. Kan bruges som stige. + + + Fungerer som en dør, men bruges ofte i et hegn. + + + Fremstilles af melonskiver. + + + Gennemsigtig blok, der kan bruges som alternativ til glasblokke. + + + Når det aktiveres (ved hjælp af rødsten i forbindelse med en knap, et håndtag, en trykplade eller en rødstensfakkel), skubbes stemplet op og flytter blokkene, hvis det kan. Når stemplet trækker sig sammen, trækker det blokken med, der står ovenpå. + + + Er lavet af sten og findes ofte i fæstninger. + + + Kan bruges som barriere på samme måde som et hegn. + + + Kan plantes for at få græskar. + + + Bruges til dekoration og til at bygge med. + + + Sænker farten på væsner, der går igennem det. Kan klippes i stykker med en saks for at få snor. + + + Fremkalder en sølvfisk, når blokken hugges i stykker. Kan også fremkalde en sølvfisk, hvis den er i nærheden af en anden sølvfisk, der bliver angrebet. + + + Kan plantes for at få meloner. + + + Efterlades af mørkemænd, når de dør. Når du kaster den, bliver du teleporteret til det sted, hvor mørkeperlen lander, og du mister lidt energi. + + + En jordblok med græs på toppen. Graves op med en skovl. Bruges til at bygge med. + + + Fyldes med regnvand eller en spand vand, hvorefter den kan fylde glasflasker med vand. + + + Kan bruges til at bygge lange trapper med. To fliser oven på hinanden udgør en blok af normal størrelse. + + + Fremstillet ved bearbejdning af afgrundssten i ovnen. Bruges til fremstilling afgrundsmursten. + + + Lyser, når der bliver sat strøm til. + + + En udstillingsmontre, der viser den genstand eller blok, der placeres i den. + + + Fremkalder et væsen af den pågældende type, når du kaster med den. + + + Kan bruges til at bygge lange trapper med. To fliser oven på hinanden udgør en blok af normal størrelse. + + + Giver kakaobønner. + + + Ko + + + Efterlader læder, når den bliver dræbt. Kan malkes for mælk med en spand. + + + Får + + + Hoveder kan bruges som dekoration eller som en maske ved at blive placeret i lagerpladsen for hjelme. + + + Blæksprutte + + + Efterlader en blækpose + + + Sætter ild til ting, eller til at sætte ild til ting automatisk, når den affyres fra en automat. + + + Flyder på vandet, og du kan gå på den. + + + Bruges til at bygge afgrundsfæstningen med. Immun over for gyslingens ildkugler. + + + Bruges i afgrundsfæstningen. + + + Viser vejen til portalen til Mørket, når du kaster den. Sæt 12 mørkeøjne i portalen til Mørket for at aktivere den. + + + Bruges til eliksirbrygning. + + + Som græsblokke, men kan bruges til at dyrke svampe på. + + + Findes i afgrundsfæstningen og efterlader afgrundsurt, når den hakkes i stykker. + + + En blok fra Mørket. Ekstremt solid og velegnet til at bygge med. + + + Mørkedragen efterlader denne blok, når du besejrer den. + + + Efterlader erfaringskugler, når du smider den, der forøger dine erfaringspoint. + + + Kan fortrylle sværd, hakker, økser, skovle, buer og rustninger for erfaringspoint. + + + Kan aktiveres med tolv mørkeøjne og giver adgang til Mørket. + + + Bruges til at bygge portalen til Mørket med. + + + Når det aktiveres (ved hjælp af rødsten i forbindelse med en knap, et håndtag, en trykplade eller en rødstensfakkel), skubbes stemplet op og flytter blokkene, hvis det kan. + + + Fremstilles ved at brænde ler i en ovn. + + + Kan laves til mursten i en ovn. + + + Giver lerkugler, når det graves op, som kan bruges til at fremstille mursten med i en ovn. + + + Hugges i stykker med en økse og kan bruges til brændsel eller til at fremstille planker med. + + + Fremstilles i en ovn ved at smelte sand. Kan bruges i bygninger, men går i stykker, hvis du forsøger at udvinde det. + + + Udvindes af sten med en hakke. Kan bruges til at bygge en ovn eller til at fremstille redskaber af sten med. + + + En kompakt måde at opbevare snebolde på. + + + Kan bruges til stuvning i en skål. + + + Kan kun udvindes med en diamanthakke. Opstår ved at blande vand og stillestående lava og kan bruges til at bygge portaler med. + + + Fremkalder monstre i verdenen. + + + Indeholder snebolde, der kan graves op med en skovl. + + + Giver nogle gange hvedefrø, når de graves op. + + + Kan bruges i farve. + + + Graves op med en skovl. Indeholder nogle gange flint, når det graves op. Påvirkes af tyngdekraften, hvis ikke der er nogen blok nedenunder. + + + Indeholder kul, der kan udvindes med en hakke. + + + Indeholder lasursten, der kan udvindes med en hakke af sten eller kraftigere materiale. + + + Indeholder diamanter, der kan udvindes med en hakke af jern eller kraftigere materiale. + + + Bruges som dekoration. + + + Indeholder guld, der kan udvindes med en hakke af jern eller kraftigere materiale, og kan smeltes om til guldbarrer i en ovn. + + + Indeholder jern, der kan udvindes med en hakke af sten eller kraftigere materiale, og kan smeltes om til jernbarrer i en ovn. + + + Indeholder rødsten, der kan udvindes med en hakke af jern eller kraftigere materiale. + + + Kan ikke ødelægges. + + + Sætter ild til alt det kommer i nærheden af. Kan opbevares i en spand. + + + Graves op med en skovl. Kan laves til glas i en ovn. Påvirkes af tyngdekraften, hvis ikke der er nogen blok nedenunder. + + + Indeholder brosten, der kan udvindes med en hakke. + + + Graves op med en skovl. Bruges til at bygge med. + + + Kan plantes og vil med tiden vokse og blive til et træ. + + + Stilles på jorden for at lave strøm. Når den brygges i en eliksir, forlænges effekten. + + + Fås ved at dræbe en ko. Kan bruges til at lave rustninger eller bøger med. + + + Fås ved at dræbe en slim og kan bruges som ingrediens i eliksirer eller til fremstillinger af klisterstempler. + + + Efterlades tilfældigt af høns og kan bruges til mad. + + + Fås ved at skovle grus og kan bruges til at lave fyrtøj med. + + + Når du lægger den på en gris, kan du ride på grisen. Du kan styre grisen ved hjælp af en gulerod på en fiskestang. + + + Fås ved at skovle sne. Kan kastes. + + + Fås ved at udvinde glødesten og kan bruges til at fremstille glødesten med igen eller brygges i eliksirer, så effekten forøges. + + + Efterlader nogle gange en stikling, der kan plantes igen for at få et nyt træ. + + + Findes i fangekældre og kan bruges til dekoration og til at bygge med. + + + Bruges til at klippe får og til at klippe blade af træerne med. + + + Fås ved at dræbe et skelet. Kan bruges til benmel. Kan bruges til at tæmme en ulv med. + + + Fås ved at få et skelet til at dræbe en sniger. Kan spilles i en jukebox. + + + Slukker brande og får afgrøderne til at gro. Kan opbevares i en spand. + + + Fås fra afgrøder og kan bruges til at lave mad med. + + + Kan bruges til at fremstille sukker med. + + + Kan bruges som hjelm eller sammen med en fakkel for at lave en græskarlygte. Det er også hovedingrediensen i græskartærte. + + + Brænder for evigt, når den bliver tændt. + + + Afgrøder giver hvede, når de er modne. + + + Jord, der er blevet kultiveret og klar til beplantning. + + + Kan koges i en ovn for at fremstille grøn farve. + + + Bremser bevægelseshastigheden på alt, der passerer hen over den. + + + Fås ved at dræbe en kylling. Kan bruges til at lave pile med. + + + Fås ved at dræbe en sniger. Kan bruges til fremstilling af TNT eller som ingrediens i en eliksir. + + + Kan plantes på opdyrket jord for at få afgrøder. Sørg for, at der er nok lys, til at frøene kan gro! + + + Når du står i en portal, kan du bevæge dig mellem Oververdenen og Afgrunden. + + + Bruges som brændsel i en ovn eller til at fremstille fakler med. + + + Fås ved at dræbe en edderkop. Kan bruges til at lave en bue eller en fiskestang med eller placeres på jorden for at lave en snubletråd. + + + Efterlader uld, når du klipper det (hvis det ikke allerede er blevet klippet). Uld kan farves. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Morskabschef + + + Musik og lyde + + + Programmering + + + Chief Architect + + + Art Developer + + + Spilsmed + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Jernskovl + + + Diamantskovl + + + Guldskovl + + + Guldsværd + + + Træskovl + + + Stenskovl + + + Træhakke + + + Guldhakke + + + Træøkse + + + Stenøkse + + + Stenhakke + + + Jernhakke + + + Diamanthakke + + + Diamantsværd + + + SDET + + + Project STE + + + Additional STE + + + Særlig tak til + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Træsværd + + + Stensværd + + + Jernsværd + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Udvikler + + + Skyder med ildkugler, der eksploderer, når de rammer. + + + Slim + + + Deler sig i mindre slimklumper, når den bliver skadet. + + + Zombiegrisemand + + + Fredelig, men angriber i flok, hvis du angriber den. + + + Gysling + + + Mørkemand + + + Huleedderkop + + + Har et giftigt bid. + + + Muhsvamp + + + Angriber dig, hvis du ser på den. Kan også flytte blokke. + + + Sølvfisk + + + Tiltrækker skjulte sølvfisk i nærheden, når den bliver angrebet. Skjuler sig i blokke af sten. + + + Angriber, når du kommer tæt på. + + + Efterlader koteletter, når den bliver dræbt. Kan bruges som ridedyr med en sadel. + + + Ulv + + + Fredelig, indtil du angriber den. Så bider den igen. Kan tæmmes med ben, hvorefter ulven følger med dig og angriber de væsner, du angriber. + + + Kylling + + + Efterlader fjer og indimellem også æg, når du dræber den. + + + Gris + + + Sniger + + + Edderkop. + + + Angriber, når du kommer tæt på. Kan klatre på vægge. Efterlader snor, når du dræber den. + + + Zombie + + + Eksploderer, hvis du kommer for tæt på! + + + Skelet + + + Skyder pile efter dig. Efterlader pile, når du dræber den. + + + Kan bruges til svampestuvning i en skål. Efterlader svampe og bliver en normal ko, når du klipper den med en saks. + + + Originalt design og programmering af + + + Projektkoordinator/producer + + + Resten af holdet hos Mojang + + + Illustrator + + + Talknuser + + + Bøllekoordinator + + + Lead Game Programmer på Minecraft til pc + + + Kundeservice + + + Kontorets dj + + + Designer/programmør på Minecraft – Pocket Edition + + + Ninjaprogrammør + + + CEO + + + Flipproletar - - Placér ovnen i verden med {*CONTROLLER_ACTION_USE*}, og åbn den. + + Sprængstofsanimator - - Lav kul i ovnen. Mens du venter på, at det bliver færdigt, kan du samle flere materialer til dit tilflugtssted. + + En stor sort drage, der lever i Mørket. - - Lav glas i ovnen. Mens du venter på, at det bliver færdigt, kan du samle flere materialer til dit tilflugtssted. + + Flammeånd - - Et godt tilflugtssted skal have en dør, så du nemt kan komme ind og ud uden at behøve at hakke væggen i stykker og bygge den op igen. Lav en trædør.{*WoodenDoorIcon*} + + Disse fjender lever i Afgrunden og oftest inde i afgrundsfæstninger. De efterlader flammestave, når de dør. - - Placér døren med {*CONTROLLER_ACTION_USE*}. Du kan åbne og lukke en trædør ved hjælp af {*CONTROLLER_ACTION_USE*}. + + Snegolem - - Om natten bliver det meget mørkt, så du får brug for noget lys inde i dit tilflugtssted. Lav en fakkel med pinde og kul fra fremstillingsskærmen.{*TorchIcon*} + + En snegolem består af sneblokke og et græskar. Den kaster snebolde efter dens skabers fjender. - - - Du har gennemført den første del af introduktionen. - + + Mørkedrage - - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at fortsætte introduktionen.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du mener, at du er klar til at spille på egen hånd. - + + Magmablokke - - - Dette er dit lager. Det viser alle de genstande, du kan bruge, og alle de genstande, du bærer rundt på. Du kan også se din rustning. - + + Lever i junglen. Kan tæmmes med rå fisk. Men du skal lade ozelotten komme til dig, da pludselige bevægelser skræmmer den væk. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du bruger dit lager. - + + Jerngolem - - - Flyt markøren med {*CONTROLLER_MENU_NAVIGATE*}. Brug {*CONTROLLER_VK_A*} for at samle en genstand op under markøren. - Hvis der er mere end en genstand, samler du dem alle sammen op, eller du kan bruge {*CONTROLLER_VK_X*} for kun at samle halvdelen op. - + + Beskytter landsbyerne. Kan fremstilles med blokke af jern og græskar. - - Du kan flytte genstanden til et andet felt i lageret ved at flytte markøren til den nye plads og trykke på {*CONTROLLER_VK_A*}. - Når du har mange genstande på markøren, kan du placere dem alle med {*CONTROLLER_VK_A*} eller nøjes med at placere en med {*CONTROLLER_VK_X*}. + + Magmablokkene lever i Afgrunden. Ligesom slim deler de sig i mindre stykker, hvis du dræber dem. - - - Hvis du flytter markøren uden for kanten af skærmen, kan du smide en genstand. - + + Landsbyboer - - - Hvis du vil have flere oplysninger om en genstand, skal du flytte markøren over genstanden og trykke på {*CONTROLLER_VK_BACK*}. - + + Ozelot - - - Tryk på {*CONTROLLER_VK_B*} for at lukke lageret. - + + Skaber kraftigere fortryllelser, når de er placeret omkring et fortryllelsesbord. - - - Dette er lageret i Kreativ. Det viser alle de genstande, du kan bruge lige nu, og alle de andre genstande du kan vælge mellem. - + + {*T3*}SÅDAN SPILLER DU: OVN{*ETW*}{*B*}{*B*} +En ovn giver dig mulighed for at bearbejde materialerne ved hjælp af ild. Du kan eksempelvis støbe jernbarer ud af jernmalm i ovnen.{*B*}{*B*} +Stil ovnen et sted, og tryk på {*CONTROLLER_ACTION_USE*} for at bruge den.{*B*}{*B*} +Du skal fylde brændsel i ovnens nederste felt og materialet, du vil bearbejde, i det øverste. Så bliver ovnen tændt, og den går i gang med at bearbejde materialet.{*B*}{*B*} +Når materialet er færdigt, kan du flytte det fra resultatfeltet og over i dit lager.{*B*}{*B*} +Hvis du holder markøren over et materiale, der kan bruges som ingrediens eller brændsel i ovnen, får du vist et tip, der hjælper dig med at flytte materialet hurtigt over i ovnen. + - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du bruger dit lager i Kreativ. - + + {*T3*}SÅDAN SPILLER DU: AUTOMAT{*ETW*}{*B*}{*B*} +En automat kan skyde med forskellige genstande. Du skal bruge en kontakt, fx et håndtag, ved siden af automaten for at aktivere den.{*B*}{*B*} +Tryk på {*CONTROLLER_ACTION_USE*} for at åbne automaten, og flyt genstandene fra dit lager, som du vil fylde den med.{*B*}{*B*} +Når du derefter bruger kontakten, skyder automaten en genstand ud. + - - - Flyt markøren med {*CONTROLLER_MENU_NAVIGATE*}. - Brug {*CONTROLLER_VK_A*} for at vælge genstanden under markøren i genstandslisten, og brug {*CONTROLLER_VK_Y*} for at samle en hel stak op af den pågældende genstand. - + + {*T3*}SÅDAN SPILLER DU: BRYGNING{*ETW*}{*B*}{*B*} +For at kunne brygge eliksirer skal du have et bryggestativ, og det kan du bygge på dit arbejdsbord. Alle eliksirer indeholder en flaske vand som grundelement, og den fremstiller du ved at fylde en glasflaske med vand fra en gryde eller en vandkilde.{*B*} +Bryggestativet har plads til tre flasker og kan fremstille tre eliksirer ad gangen. Du kan bruge en enkelt ingrediens i alle tre flasker, så sørg altid for at brygge tre eliksirer ad gangen for at få mest muligt ud af dine ressourcer.{*B*} +Når du putter en ingrediens i bryggestativets øverste felt, vil der blive fremstillet en grundeliksir efter et kort stykke tid. Grundeliksiren gør ikke noget i sig selv, men hvis du kombinerer den med en ingrediens mere, får den efterfølgende eliksir en effekt, som du kan bruge til noget.{*B*} +Herefter kan du tilføje en tredje ingrediens for at få effekten til at vare længere (med støv fra rødstens), blive kraftigere (med støv fra glødesten) eller gøre eliksiren giftig (med et gæret edderkoppeøje).{*B*} +Du kan tilføje krudt til eliksiren for at lave den til en kasteeliksir. Kasteeliksirer påvirker et område inden for en radius af, hvor den lander.{*B*} + +Grundingredienserne til eliksirer er:{*B*}{*B*} +* {*T2*}Afgrundsurt{*ETW*}{*B*} +* {*T2*}Edderkoppeøje{*ETW*}{*B*} +* {*T2*}Sukker{*ETW*}{*B*} +* {*T2*}Gyslingtåre{*ETW*}{*B*} +* {*T2*}Flammeåndpulver{*ETW*}{*B*} +* {*T2*}Magmacreme{*ETW*}{*B*} +* {*T2*}Glimmermelon{*ETW*}{*B*} +* {*T2*}Støv fra rødsten{*ETW*}{*B*} +* {*T2*}Støv fra glødesten{*ETW*}{*B*} +* {*T2*}Gæret edderkoppeøje{*ETW*}{*B*}{*B*} + +Du bliver nødt til at eksperimentere med forskellige kombinationer af ingredienser for at finde alle de forskellige slags eliksirer, som du kan lave. + - - - Markøren rykker automatisk til næste felt i rækken af redskaber. Du kan placere den med {*CONTROLLER_VK_A*}. Når du har placeret genstanden, vender markøren tilbage til listen, hvor du kan vælge den næste genstand. - + + {*T3*}SÅDAN SPILLER DU: STOR KISTE{*ETW*}{*B*}{*B*} +To kister ved siden af hinanden udgør en stor kiste. Den har plads til mere.{*B*}{*B*} +Du bruger den på samme måde som en almindelig kiste. + - - - Hvis du flytter en genstand uden for kanten af skærmen, kan du smide genstanden i omgivelserne. Tryk på {*CONTROLLER_VK_X*} for at fjerne alle genstande i genvejsbjælken. - + + {*T3*}SÅDAN SPILLER DU: FREMSTILLING{*ETW*}{*B*}{*B*} +På fremstillingsskærmen kan du kombinere forskellige genstande fra dit lager for at skabe nye redskaber og våben. Åbn fremstillingsskærmen med {*CONTROLLER_ACTION_CRAFTING*}.{*B*}{*B*} +Skift mellem fanerne øverst på skærmen ved hjælp af {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at vælge kategorien, som genstanden tilhører, og vælg derefter genstanden ved hjælp af {*CONTROLLER_MENU_NAVIGATE*}.{*B*}{*B*} +Fremstillingsområdet viser, hvilke genstande der skal bruges for at fremstille den nye genstand. Tryk på {*CONTROLLER_VK_A*} for at fremstille genstanden og placere den i dit lager. + - - - Du kan bladre mellem fanerne Grupper øverst på skærmen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at vælge den gruppe af genstande, som du vil samle op. - + + {*T3*}SÅDAN SPILLER DU: ARBEJDSBORD{*ETW*}{*B*}{*B*} +Du kan fremstille større genstande ved hjælp af et arbejdsbord.{*B*}{*B*} +Stil bordet et sted, og tryk på {*CONTROLLER_ACTION_USE*} for at bruge det.{*B*}{*B*} +Fremstilling på bordet fungerer ligesom almindelig fremstilling, men du har et større arbejdsområde og kan derfor lave flere forskellige genstande. + - - - Hvis du vil have flere oplysninger om en genstand, skal du flytte markøren hen over genstanden og trykke på {*CONTROLLER_VK_BACK*}. - + + {*T3*}SÅDAN SPILLER DU: FORTRYLLELSE{*ETW*}{*B*}{*B*} +Du kan fortrylle redskaber, våben, rustninger og bøger ved at bruge de erfaringspoint, du får, når du dræber væsner eller udvinder og bearbejder bestemte materialer i ovnen.{*B*} +Når du placerer et sværd, en bue, økse, hakke, skovl, rustning eller bog i feltet under bogen på fortryllelsesbordet, vil de tre knapper til højre for pladsen vise nogle fortryllelser samt deres omkostninger i erfaringsniveau.{*B*} +Hvis dit erfaringsniveau ikke er højt nok til at bruge dem, vil omkostningerne stå med rødt, og ellers står de med grønt.{*B*}{*B*} +Selve fortryllelsen bliver valgt tilfældigt ud fra omkostningen.{*B*}{*B*} +Hvis fortryllelsesbordet er omgivet af bogreoler (op til 15 bogreoler) med et mellemrum på en blok mellem bogreol og fortryllelsesbord, bliver effekten af fortryllelsen kraftigere, og der vil strømme mystiske glyffer fra bøgerne og ned på fortryllelsesbordet.{*B*}{*B*} +Du kan finde alle ingredienserne til et fortryllelsesbord i landsbyerne rundt omkring eller ved at grave i miner og kultivere verdenen.{*B*}{*B*} +Du kan bruge fortryllede bøger med ambolten for at fortrylle genstande. Det giver dig mere kontrol over hvilke fortryllelser, du vil påføre dine genstande.{*B*} - - - Tryk på {*CONTROLLER_VK_B*} for at lukke lageret i Kreativ. - + + {*T3*}SÅDAN SPILLER DU: BLOKÉR BANER{*ETW*}{*B*}{*B*} +Hvis du finder anstødeligt indhold i den bane, du spiller, kan du vælge at føje den til din liste over blokerede baner. +For at gøre dette skal du åbne pausemenuen og trykke på {*CONTROLLER_VK_RB*} for at vælge Blokér bane-tippet. +Hvis du derefter forsøger at tilslutte til banen igen, vil du blive mindet om, at den befinder sig på din liste over blokerede baner, hvorefter du får muligheden for at annullere eller fjerne den fra listen og fortsætte. - + - Dette er fremstillingsskærmen. Her kan du fremstille nye genstande ved at kombinere de genstande, du har samlet sammen. + {*T3*}SÅDAN SPILLER DU: INDSTILLINGER FOR VÆRT OG SPILLER{*ETW*}{*B*}{*B*} + + {*T1*}Indstillinger for spillet{*ETW*}{*B*} + Når du indlæser eller opretter en verden, kan du trykke på knappen "Flere indstillinger" for at åbne menuen, der giver dig mere kontrol over dit spil.{*B*}{*B*} + + {*T2*}Spiller mod spiller{*ETW*}{*B*} + Når denne funktion er slået til, kan spillerne påføre hinanden skade. Denne indstilling påvirker kun spil i Overlevelse.{*B*}{*B*} + + {*T2*}Stol på spillerne{*ETW*}{*B*} + Når denne funktion er slået fra, er der begrænsninger for, hvad andre spillere kan gøre. De kan ikke udvinde materialer eller bruge genstande, døre, kontakter og beholdere, placere blokke eller angribe spillere og dyr. Du kan ændre indstillinger for udvalgte spillere ved hjælp af menuen i menuen i spillet.{*B*}{*B*} + + {*T2*}Ilden spreder sig{*ETW*}{*B*} + Når denne funktion er slået til, kan ilden sprede sig til brandbare blokke i nærheden. Du kan slå denne funktion til eller fra inde i spillet.{*B*}{*B*} + + {*T2*}TNT eksploderer{*ETW*}{*B*} + Når denne funktion er slået til, eksploderer TNT, når det detoneres. Du kan slå denne funktion til eller fra inde i spillet.{*B*}{*B*} + + {*T2*}Værtsprivilegier{*ETW*}{*B*} + Når denne funktion er slået til, kan værten slå flyveevnen til og fra, slå udmattelse fra og gøre sig usynlig fra menuen i spillet. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Dagstidscyklus{*ETW*}{*B*} + Når denne indstilling er slået fra, skifter dagstidscyklussen sig ikke.{*B*}{*B*} + + {*T2*}Behold indhold af lager{*ETW*}{*B*} + Når denne indstilling er slået til, beholder spillere indholdet af deres lager, når de dør.{*B*}{*B*} + + {*T2*}Nye væsener{*ETW*}{*B*} + Når denne indstilling er slået fra, kommer der ikke nye væsener naturligt.{*B*}{*B*} + + {*T2*}Destruktive væsener{*ETW*}{*B*} Når denne funktion er slået fra, kan monstre og dyr ikke ændre blokke (for eksempel kan sniger-eksplosioner ikke ødelægge blokke, og får kan ikke fjerne græs) eller tage genstande.{*B*}{*B*} {*T2*}Væsenplyndring{*ETW*}{*B*} Når denne funktion er slået fra, kan du ikke plyndre monstre og dyr (du kan for eksempel ikke få krudt fra snigere).{*B*}{*B*} {*T2*}Efterladning af felter{*ETW*}{*B*} Når denne funktion er slået fra, vil blokke ikke efterlade felter, når de bliver ødelagt (du kan for eksempel ikke få brosten fra stenblokke).{*B*}{*B*} {*T2*}Naturlig regenerering {*ETW*}{*B*} Når denne funktion er slået fra, bliver spillernes energi ikke gendannet naturligt.{*B*}{*B*}{*T1*}Indstillinger for skabelse af verden{*ETW*}{*B*}Når du skaber en ny verden, får du nogle ekstra valgmuligheder.{*B*}{*B*} {*T2*}Opret strukturer{*ETW*}{*B*} Når denne funktion er slået til, bliver der oprettet strukturer som landsbyer og fæstninger i verdenen.{*B*}{*B*} {*T2*}Helt flad verden{*ETW*}{*B*} Når denne funktion er slået til, bliver der skabt en helt flad verden i Oververdenen og Afgrunden.{*B*}{*B*} {*T2*}Bonuskiste{*ETW*}{*B*}Når denne funktion er slået til, bliver der skabt en kiste med nyttige genstande i nærheden af spillerens gendannelsespunkt.{*B*}{*B*}{*T2*}Gendan Afgrunden{*ETW*}{*B*} Når denne funktion er slået til, bliver Afgrunden gendannet. Det er nyttigt, hvis du har et ældre gemt spil, hvor afgrundsfortet ikke var til stede.{*B*}{*B*} {*T1*}Indstillinger inde i spillet{*ETW*}{*B*}Du kan få adgang til flere indstillinger inde i spillet ved at trykke på {*BACK_BUTTON*} for at åbne menuen.{*B*}{*B*} {*T2*}Indstillinger for vært{*ETW*}{*B*}Værtsspilleren og spillere med moderatorrettigheder kan få adgang til menuen "Værtsindstillinger". I denne menu kan du slå spredning af ild og TNT-eksplosioner til og fra.{*B*}{*B*} + +{*T1*}Indstillinger for spiller{*ETW*}{*B*} +Du kan ændre en spilleres privilegier ved at vælge vedkommendes navn og trykke på {*CONTROLLER_VK_A*} for at åbne menuen for spillerprivilegier, hvor du kan vælge følgende funktioner.{*B*}{*B*} + + {*T2*}Kan bygge og udvinde materialer{*ETW*}{*B*} +Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne indstilling er slået til, kan spilleren interagere med verden som normalt. Når denne funktion er slået fra, kan spilleren ikke længere placere eller ødelægge blokke eller interagere med mange andre genstande og blokke.{*B*}{*B*} + + {*T2*}Kan bruge døre og kontakter{*ETW*}{*B*} +Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne funktion er slået fra, kan spilleren ikke bruge døre og kontakter.{*B*}{*B*} + + {*T2*}Kan åbne beholdere{*ETW*}{*B*} +Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne funktion er slået fra, kan spilleren ikke åbne beholdere, såsom kister.{*B*}{*B*} + + {*T2*}Kan angribe spillere{*ETW*}{*B*} +Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne funktion er slået fra, kan spilleren forårsage skade på andre spillere.{*B*}{*B*} + + {*T2*}Kan angribe dyr{*ETW*}{*B*} +Denne indstilling er kun tilgængelig, når "Stol på spillere" er slået fra. Når denne funktion er slået fra, kan spilleren forårsage skade på dyr.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} +Når denne funktion er slået til, og hvis "Stol på spillere" er slået fra, kan spilleren ændre privilegier for andre spillere (undtagen værten) og smide spillere ud, og vedkommende kan også slå spredning af ild og TNT-eksplosioner til eller fra.{*B*}{*B*} + + {*T2*}Smid spiller ud{*ETW*}{*B*}{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*}{*T1*}Indstillinger for værtsspiller{*ETW*}{*B*}Hvis "Værtsprivilegier" er slået til, kan værtsspilleren ændre visse privilegier for sig selv. Du kan ændre privilegier for en spiller ved at vælge vedkommendes navn og trykke på {*CONTROLLER_VK_A*} for at åbne menuen for spillerprivilegier, hvor du kan vælge følgende indstillinger.{*B*}{*B*} + + {*T2*}Kan flyve{*ETW*}{*B*} + Når denne indstilling er slået til, kan spilleren flyve. Denne indstilling er kun relevant i spiltypen Overlevelse, eftersom flyveevnen er slået til automatisk for alle spillere i Kreativ.{*B*}{*B*} + + {*T2*}Slå udmattelse fra{*ETW*}{*B*} +Denne indstilling påvirker kun Overlevelse. Når den er slået til, vil fysiske aktiviteter (bevægelse/løb/hop osv.) ikke reducere madbjælken. Men hvis spilleren bliver såret, vil madbjælken langsomt blive reduceret, mens spillerens energi gendannes.{*B*}{*B*} + + {*T2*}Usynlig{*ETW*}{*B*} Når denne funktion er slået til, er spilleren usynlig for andre spillere og usårlig.{*B*}{*B*}{*T2*}Kan teleportere{*ETW*}{*B*} Dette gør det muligt for spilleren at flytte spillere eller sig selv hen til andre spillere i verden - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du fremstiller genstande og bearbejder materiale. - + + Næste side + + + {*T3*}SÅDAN SPILLER DU: HUSDYR{*ETW*}{*B*}{*B*} +Hvis du vil sørge for at holde dine dyr samlet på et sted, skal du bygge et indhegnet område på mindre end 20 gange 20 blokke og placere dine dyr inden for det. Så sikrer du dig, at de også er der, når du kommer tilbage for at se til dem. + + + + {*T3*}SÅDAN SPILLER DU: DYREAVL{*ETW*}{*B*}{*B*} +Hvis du holder husdyr i Minecraft, kan de få unger!{*B*} +Hvis du vil have dyrene til at parre sig, skal du sørge for at give dem det rigtige foder, så de bliver "elskovssyge".{*B*} +Hvis du giver hvede til køer, muhsvampe eller får, gulerødder til en gris, hvedefrø eller afgrundsurt til høns og kød til ulve, vil de begynde at se sig om efter en mage i nærheden, som også er elskovssyg.{*B*} +Når to elskovssyge dyr af samme art møder hinanden, kysser de hinanden i et par sekunder, hvorefter en dyreunge dukker op. Dyreungen følger efter sine forældre, indtil den selv har vokset sig stor.{*B*} +Når et dyr har været elskovssygt, skal der gå op til fem minutter, inden det kan blive det igen.{*B*} +Der er en grænse for antallet af dyr, der kan være i en verden, så du vil muligvis opdage, at dyrene ikke parrer sig, når du har mange af dem. + + + {*T3*}SÅDAN SPILLER DU: PORTAL TIL AFGRUNDEN {*ETW*}{*B*}{*B*} +Med en portal til Afgrunden kan du rejse mellem Oververdenen og Afgrunden. Du kan rejse gennem Afgrunden for at skyde genvej i Oververdenen. Når du bevæger dig en blok frem i Afgrunden, svarer det til, at du bevæger dig tre blokke frem ovenpå. Så hvis du bygger en portal i Afgrunden og går igennem den, vil du vende tilbage til Oververdenen tre gange så langt væk fra det punkt, hvor du forlod den.{*B*}{*B*} +Du skal bruge mindst ti blokke af obsidian for at kunne bygge portalen, som skal være fem blokke høj, fire blokke bred og en blok dyb. Når rammen om portalen er bygget, skal du sætte ild til den for at aktivere den. Det kan du gøre ved hjælp af et fyrtøj eller andre genstande, der kan lave ild.{*B*}{*B*} +Billederne til højre viser eksempler på portalkonstruktioner. + + + + {*T3*}SÅDAN SPILLER DU: KISTE{*ETW*}{*B*}{*B*} +Når du har fremstillet en kiste, kan du placere den i verdenen og åbne den med {*CONTROLLER_ACTION_USE*} for at opbevare genstande fra dit lager.{*B*}{*B*} +Flyt genstande mellem dit lager og kisten med markøren.{*B*}{*B*} +Dine genstande bliver opbevaret i kisten, så du kan hente dem igen senere. + + + + Var du på Minecon? + + + Ingen hos Mojang har nogensinde set Junkboys ansigt. + + + Vidste du, at der er en wiki for Minecraft? + + + Kig aldrig direkte på en programfejl. - - {*B*} - Tryk på {*CONTROLLER_VK_X*} for at se beskrivelsen af genstanden. - + + Snigerne blev født af en programfejl. - - {*B*} - Tryk på {*CONTROLLER_VK_X*} for at se de ingredienser, der skal bruges for at lave denne genstand. - + + Er det en kylling, eller er det en and? - - {*B*} - Tryk på {*CONTROLLER_VK_X*} for at se lageret igen. - + + Mojangs nye kontorer er så seje! - - - Du kan bladre mellem fanerne Grupper øverst på skærmen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at vælge den gruppe af genstande, som du vil fremstille noget fra. Vælg genstanden, du vil fremstille, med {*CONTROLLER_MENU_NAVIGATE*}. - + + {*T3*}SÅDAN SPILLER DU: DET GRUNDLÆGGENDE{*ETW*}{*B*}{*B*} +Minecraft er et spil, der handler om at bygge alt, hvad du kan forestille dig, med blokke. Om natten kommer monstrene frem, så du skal sørge for at bygge et tilflugtssted, inden det sker.{*B*}{*B*} +Se dig omkring med {*CONTROLLER_ACTION_LOOK*}.{*B*}{*B*} +Bevæg dig omkring med {*CONTROLLER_ACTION_MOVE*}.{*B*}{*B*} +Tryk på {*CONTROLLER_ACTION_JUMP*} for at hoppe.{*B*}{*B*} +Skub {*CONTROLLER_ACTION_MOVE*} frem to gange hurtigt for at spurte. Hvis du bliver ved med at skubbe {*CONTROLLER_ACTION_MOVE*} fremad, vil du fortsætte med at spurte, indtil du løber tør for spurtetid, eller madbjælken viser mindre end {*ICON_SHANK_03*}.{*B*}{*B*} +Hold {*CONTROLLER_ACTION_ACTION*} nede for at hakke og hugge med hænderne eller det redskab, som du bruger. Du får brug for et redskab for at udvinde bestemte materialer.{*B*}{*B*} +Når du holder en genstand i hånden, kan du trykke på {*CONTROLLER_ACTION_USE*} for at bruge genstanden eller trykke på {*CONTROLLER_ACTION_DROP*} for at smide den. - - - I fremstillingsområdet kan du se de genstande, du skal bruge for at fremstille en ny genstand. Tryk på {*CONTROLLER_VK_A*} for at fremstille genstanden og placere den i dit lager. - + + {*T3*}SÅDAN SPILLER DU: DISPLAY{*ETW*}{*B*}{*B*} +Displayet viser dig oplysninger om din status, såsom din energi, dit iltniveau, når du er under vand, din sult (du skal spise mad for at blive mæt igen) og din rustning, hvis du har nogen på. Hvis du mister energi, men har ni eller flere {*ICON_SHANK_01*} på din madbjælke, vil din energi blive gendannet automatisk. Din madbjælke bliver fyldt igen, når du spiser.{*B*} +Her finder du også erfaringsbjælken, der viser dig dit niveau i form af et tal, samt en bjælke, der viser dig, hvor mange erfaringspoint, du mangler for at stige til næste niveau. Du får erfaringspoint ved at samle erfaringskugler, når du dræber væsner, udvinder bestemte former for materialer, avler dyr, fisker og smelter malm i en ovn.{*B*}{*B*} +Du kan også se, hvilke genstande du kan bruge. Brug {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for at udskifte den genstand, du har i hånden. - - - Du kan fremstille mange flere genstande på et arbejdsbord. Det foregår på samme måde, som når du fremstiller genstande i hånden, men da du har et større fremstillingsområde, kan du kombinere flere ingredienser. - + + {*T3*}SÅDAN SPILLER DU: LAGER{*ETW*}{*B*}{*B*} +Du kan se dit lager ved at trykke på {*CONTROLLER_ACTION_INVENTORY*}.{*B*}{*B*} +Her kan du se alle de redskaber, du har ved hånden, samt alle de genstande, du bærer rundt på. Du kan også se din rustning.{*B*}{*B*} +Brug {*CONTROLLER_MENU_NAVIGATE*} for at flytte markøren. Brug {*CONTROLLER_VK_A*} for at samle en genstand op under markøren. Hvis der er mere end en genstand, samler du dem alle sammen op, eller du kan bruge {*CONTROLLER_VK_X*} for kun at samle halvdelen op.{*B*}{*B*} +Flyt genstanden med markøren til et andet felt i lageret, og læg den på den nye plads ved hjælp af {*CONTROLLER_VK_A*}. Når der er mange genstande på markøren, kan du bruge {*CONTROLLER_VK_A*} for at placere dem alle sammen eller {*CONTROLLER_VK_X*} for at placere en enkelt.{*B*}{*B*} +Hvis du bevæger markøren over et stykke af en rustning, vil du se et tip, der forklarer, hvordan du hurtigt kan flytte denne genstand til den rigtige plads for rustninger i lageret.{*B*}{*B*} +Du kan ændre farven på din læderrustning ved at farve den, det kan du gøre fra lagermenuen ved at holde farven med din markør og trykke på {*CONTROLLER_VK_X*}, mens markøren er over det stykke, du vil farve. - - - Den nederste højre del af fremstillingsskærmen viser dit lager. I dette område kan du også læse en beskrivelse af den valgte genstand, og se hvilke ingredienser der skal bruges for at fremstille den. - + + Minecon 2013 blev afholdt i Orlando, Florida, USA! - - - Beskrivelsen af den valgte genstand bliver vist. Den hjælper dig med at finde ud af, hvad genstanden kan bruges til. - + + .party() var alt for fedt! - - - Listen over de nødvendige ingredienser bliver vist. - + + Antag altid, at rygter er falske, snarere end at tro, at de er sande! - - Du kan lave planker ud af det træ, du finder. Vælg plankeikonet, og tryk på {*CONTROLLER_VK_A*} for at lave dem.{*PlanksIcon*} + + Forrige side - - - Nu skal du placere dit arbejdsbord, så du kan få adgang til et større udvalg af genstande.{*B*} - Tryk på {*CONTROLLER_VK_B*} for at lukke fremstillingsskærmen. - + + Handel - - - Tryk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at skifte til den gruppe af genstande, du ønsker at fremstille noget fra. Vælg gruppen med redskaber.{*ToolsIcon*} - + + Ambolt - - - Tryk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at skifte til den gruppe af genstande, du ønsker at fremstille noget fra. Vælg gruppen med strukturer.{*ToolsIcon*} - + + Mørket - - " - Skift til genstanden, du vil fremstille, med {*CONTROLLER_MENU_NAVIGATE*}. Der findes flere versioner af nogle genstande, afhængigt af materialerne du anvender. Vælg træskovlen.{*WoodenShovelIcon*} - " - + + Blokér baner - - " - Mange fremstillingsprocesser indeholder flere trin. Nu hvor du har nogle planker, er der flere genstande, som du kan lave. Skift til genstanden, du vil fremstille, med {*CONTROLLER_MENU_NAVIGATE*}. Vælg arbejdsbordet.{*CraftingTableIcon*} - " - + + Kreativ - - - Med de redskaber, du har bygget, er du kommet godt fra start, og du kan nu indsamle en masse forskellige materialer mere effektivt.{*B*} - Tryk på {*CONTROLLER_VK_B*} for at lukke fremstillingsskærmen. - + + Indstillinger for vært og spiller - - - Visse genstande kan ikke fremstilles på arbejdsbordet. Her skal du bruge en ovn. Byg en ovn.{*FurnaceIcon*} - + + {*T3*}SÅDAN SPILLER DU: MØRKET{*ETW*}{*B*}{*B*} +Mørket er en anden dimension i spillet, som du kan rejse til gennem en Mørket-portal. Du kan finde portalen til Mørket i en fæstning, som ligger dybt under jorden i Oververdenen.{*B*} +Du skal placere et mørkeøje i rammen af en portal til Mørket for at aktivere den.{*B*} +Når portalen er aktiveret, kan du hoppe ind i den og rejse til Mørket.{*B*}{*B*} +I Mørket møder du mørkedragen, som er en vild og mægtig fjende, samt masser af mørkemænd, så du skal sørge for at være forberedt til kamp, inden du rejser dertil!{*B*}{*B*} +Hvis du kigger godt efter, vil du se, at der er otte obsidianspir med mørkekrystaller ovenpå, som mørkedragen bruger til at hele sig selv med. Første trin i kampen er derfor at ødelægge dem.{*B*} +De første par stykker kan du ramme med pile, men de sidste er beskyttet bag af et jernbur, så derfor skal du bygge en vej op til dem.{*B*}{*B*} +Mens du gør det, flyver mørkedragen rundt om dig og angriber med mørkesyre!{*B*} +Hvis du nærmer dig æggepodiet i midten af piggene, kommer mørkedragen ned for at angribe dig, og her har du virkelig chancen for at skade den!{*B*} +Undgå mørkedragens syreånde, og sigt på dens øjne for at skade den mest muligt. Hvis du har mulighed for det, er det en god idé at tage nogle venner med til Mørket, som kan hjælpe dig med kampen!{*B*}{*B*} +Når du er rejst til Mørket, kan dine venner se på deres kort, hvor Mørke-portalen er placeret i deres respektive fæstninger, så de nemt kan finde hen til dig. + - - - Stil ovnen, du har bygget, et sted i omgivelserne. Det vil være end god ide at stille den inde i dit tilflugtssted.{*B*} - Tryk på {*CONTROLLER_VK_B*} for at lukke fremstillingsskærmen. + + {*ETB*}Velkommen tilbage! Du har muligvis ikke lagt mærke til det, men Minecraft er lige blevet opdateret.{*B*}{*B*} +Der er masser af nye funktioner, som du og dine venner kan se frem til at bruge i spillet. Her giver vi dig bare et par af højdepunkterne. Tjek ændringerne, og kom så i gang med at spille!{*B*}{*B*} +{*T1*}Nye genstande{*ETB*} - Hærdet ler, farvet ler, kulblok, halmballe, aktivatorskinne, rødstensblok, dagslyssensor, dropper, springer, minevogn med springer, minevogn med TNT, rødstenssammenligner, vægtet trykplade, signallys, fældekiste, fyrværkeriraket, fyrværkeristjerne, mørkestjerne, snor, hesterustning, navneskilt, hesteæg{*B*}{*B*} +{*T1*}Nye væsener{*ETB*} - Wither, Wither-skeletter, hekse, flagermus, heste, æsler og muldyr{*B*}{*B*} +{*T1*}Nye funktioner{*ETB*} - Tæm en hest og rid på den, lav fyrværkeri og vis det frem, navngiv dyr og monstre med et navneskilt, lav mere avancerede rødstenskredsløb, og brug de nye værtsindstillinger til at styre, hvad gæster i din verden kan gøre!{*B*}{*B*} +{*T1*}Ny introduktionsverden{*ETB*} - Lær, hvordan du bruger de gamle og nye funktioner i introduktionsverdenen. Prøv, om du kan finde alle de hemmelige musikdiske, der er skjult i verden!{*B*}{*B*} - - - Dette er ovnskærmen. En ovn giver dig mulighed for at bearbejde materialerne ved hjælp af ild. Du kan eksempelvis smelte jernmalm om til jernbarrer i en ovn. - + + Gør mere skade end næver. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du bruger din ovn. - + + Grav i jord, græs, sand, grus og sne hurtigere end med hænderne. Der skal bruges skovle for at grave snebolde op. - - - Du skal placere brændsel i ovnens nederste felt og genstanden, der skal bearbejdes, i det øverste. Derefter tændes ovnen og går i gang med at bearbejde materialet. Resultatet dukker op i feltet til højre. - + + Spurt - - - De fleste trægenstande kan bruges som brændsel, men de brænder ikke alle i lige lang tid. Du kan også finde andre genstande, der kan bruges som brændsel. - + + Nyt - - - Når dine materialer er blevet bearbejdet, kan du fjerne resultatet fra feltet til højre og placere det i dit lager. Prøv at eksperimentere med forskellige materialer for at se, hvad der sker. + + {*T3*}Ændringer og tilføjelser{*ETW*}{*B*}{*B*} +- Tilføjede nye genstande: hærdet ler, farvet ler, kulblok, halmballe, aktivatorskinne, rødstensblok, dagslyssensor, dropper, springer, minevogn med springer, minevogn med TNT, rødstenssammenligner, vægtet trykplade, signallys, fældekiste, fyrværkeriraket, fyrværkeristjerne, mørkestjerne, snor, hesterustning, navneskilt, hesteæg{*B*} +- Tilføjede nye væsener: Wither, Wither-skeletter, hekse, flagermus, heste, æsler og muldyr{*B*} +- Tilføjede nyt terræn: heksehytter.{*B*} +- Tilføjede signallys-brugerflade.{*B*} +- Tilføjede hestebrugerflade.{*B*} +- Tilføjede springerbrugerflade.{*B*} +- Tilføjede fyrværkeri: Du kan åbne fyrværkeribrugerfladen fra arbejdsbordet, når du har ingredienserne til en fyrværkeristjerne eller -raket.{*B*} +- Tilføjede "eventyrtilstand": Du kan kun knuse blokke med det rette værktøj.{*B*} +- Tilføjede mange nye lyde.{*B*} +- Væsener, genstande og projektiler kan nu passere gennem portaler.{*B*} +- Gentagere kan nu låses ved at drive deres sider med en anden gentager.{*B*} +- Zombier og skeletter kan nu opstå med forskellige våben og rustninger.{*B*} +- Nye dødsbeskeder.{*B*} +- Navngiv væsener med et navneskilt, og omdøb beholdere for at ændre titlen, når menuen er åben.{*B*} +- Benmel får ikke længere alting til at vokse til fuld størrelse, men vokser i stedet tilfældigt i stadier.{*B*} +- Et rødstenssignal, der beskriver indholdet af kister, bryggerstande, automater og jukebokse, kan registreres, hvis du placerer en rødstenssammenligner op mod dem.{*B*} +- Automater kan vende i alle retninger.{*B*} +- Hvis man spiser et guldæble, får man ekstra "absorptions"-helbred i en kort periode.{*B*} +- Jo længere du bliver i et område, desto sværere bliver de uhyrer, der opstår i området.{*B*} - - - Du kan lave kul, hvis du bruger træ som ingrediens. Læg brændsel i ovnen og træ i ingrediensfeltet. Det tager lidt tid, inden ovnen er færdig med at lave kul. Du kan give dig til at lave noget andet i mellemtiden og kigge tilbage til ovnen senere. - + + Sådan deler du billeder - - - Kul kan bruges som brændsel og som ingrediens til en fakkel sammen med en pind. - + + Kister - - - Du kan lave glas, hvis du placerer sand i ingrediensfeltet. Lav nogle glasblokke, som du kan bruge som vinduer i dit tilflugtssted. - + + Fremstilling - - - Dette er bryggeskærmen. Her kan du brygge eliksirer med en lang række forskellige effekter. - + + Ovn - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du bruger dit bryggestativ. - + + Det grundlæggende - - - Du kan brygge eliksirer ved at placere en ingrediens i det øverste felt og en eliksir eller en vandflaske i de nederste felter (du kan brygge op til tre eliksirer ad gangen). Når du har sammensat en gyldig kombination starter bryggeprocessen, og eliksiren vil være færdig efter kort tid. - + + Display - - - Alle eliksirer starter med en vandflaske. I mange eliksirer skal du først starte med at tilsætte afgrundsurt for at brygge en akavet eliksir og dernæst tilsætte en ingrediens mere for at brygge den endelige eliksir. - + + Lager - - - Når du har brygget en eliksir, kan du ændre dens effekt. Hvis du tilsætter støv fra rødsten forlænges varigheden af effekten, og hvis du tilsætter støv fra glødesten forstærkes effekten. - + + Automat - - - Hvis du tilsætter et gæret edderkoppeøje forvrænges eliksiren og får nogle gange den helt modsatte effekt, og hvis du tilsætter krudt bliver eliksiren til en kasteeliksir, som du kan kaste med for at påvirke det område, hvor den lander. - + + Fortryllelse - - - Du kan brygge en ildmodstandseliksir ved først at putte afgrundsurt i en vandflaske og dernæst tilsætte magmacreme. - + + Portal til Afgrunden - - - Tryk på {*CONTROLLER_VK_B*} for at lukke bryggeskærmen. - + + Multiplayer - - - I dette område finder du et bryggestativ, en gryde og en kiste fyldt med ingredienser til brygning. - + + Husdyr - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om brygning og eliksirer.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til brygning og eliksirer. - + + Dyreavl - - - Det første trin i at brygge en eliksir er at lave en vandflaske. Tag en glasflaske fra kisten. - + + Brygning - - - Du kan fylde glasflasken med en gryde med vand i eller med en vandblok. Fyld din glasflaske ved at pege den mod en vandkilde og trykke på {*CONTROLLER_ACTION_USE*}. - + + deadmau5 er vild med Minecraft! - - - Hvis gryden løber tør for vand, kan du fylde den med en vandspand. - + + Grisemænd angriber dig ikke, medmindre du angriber dem. - - - Brug bryggestativet til at brygge en ildmodstandseliksir med. Du skal bruge en vandflaske, afgrundsurt og magmacreme. - + + Du kan skifte dit gendannelsespunkt og springe frem til daggry ved at sove i en seng. - - - Hold {*CONTROLLER_ACTION_USE*} nede, mens du har eliksiren i hånden, for at drikke den. Hvis det er en normal eliksir, drikker du den og påfører dig effekten, men hvis det er en kasteeliksir, påføres effekten væsnerne i nærheden af det område, den rammer. - Du kan lave kasteeliksirer ved at tilføje krudt til almindelige eliksirer. - + + Slå ildkuglerne tilbage mod gyslingen! - - - Brug din ildmodstandseliksir på dig selv. - + + Lav fakler for at få lys om natten. Monstrene undgår områder med fakler. - - - Nu kan ild og lava ikke længere skade dig, og du kan prøve at se dig omkring efter områder, der var utilgængelige for dig før. - + + Du kan komme hurtigere omkring i en minevogn på skinner! - - - Dette er fortryllelsesskærmen, hvor du kan fortrylle dine våben, rustninger og visse redskaber. - + + Hvis du planter stiklinger, vokser de og bliver til træer. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om fortryllelsesskærmen.{*B*} - Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til fortryllelsesskærmen. - + + Når du bygger en portal, kan du rejse til en anden dimension: Afgrunden - - - Hvis du vil fortrylle en genstand, skal du først placere den i fortryllelsesfeltet. Du kan fortrylle våben, rustninger og visse redskaber for at give dem en særlig egenskab, såsom større modstandsstyrke eller større udbytte af materialer, som du udvinder med redskabet. - + + Det er ikke en god idé at grave lige ned eller lige op. - - - Når du placerer en genstand i fortryllelsesfeltet, viser knapperne til højre et udvalg af tilfældige fortryllelser. - + + Du kan bruge benmel (fremstilles af skeletben) som gødning. Det får dine planter til at vokse øjeblikkeligt! - - - Tallet på knappen angiver omkostningen i erfaringsniveau, der skal bruges for at udføre fortryllelsen. Hvis dit niveau ikke er højt nok, vil knappen være deaktiveret. - + + Snigere eksploderer, når de kommer tæt på dig! - - - Vælg en fortryllelse, og tryk på {*CONTROLLER_VK_A*} for at fortrylle genstanden. Dit erfaringsniveau bliver fratrukket omkostningerne for fortryllelsen. - + + Tryk på {*CONTROLLER_VK_B*} for at smide den genstand, som du holder i hånden! - - - Fortryllelserne er tilfældige, men du kan først få de bedste fortryllelser, når dit erfaringsniveau er højt, og du har masser af bogreoler omkring fortryllelsesbordet til at forøge dets kraft. - + + Find det rigtige redskab til opgaven! - - - Der er et fortryllelsesbord i dette område og nogle andre ting, der kan hjælpe dig med at lære om fortryllelse. - + + Hvis ikke du kan finde kul til dine fakler, kan du altid lave kul ved at brænde træ i ovnen. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om fortryllelse.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til fortryllelse. - + + Hvis du spiser en stegt kotelet, får du mere energi, end hvis du spiser en rå. - - - Med et fortryllelsesbord kan du føje særlige effekter til dine genstande, så eksempelvis dine våben, rustninger og redskaber bliver mere robuste, og du udvinder flere materialer med dem. - + + Hvis du indstiller sværhedsgraden til Fredfyldt, vil din energi automatisk blive gendannet, og der kommer ingen monstre om natten! - - - Når du stiller bogreoler rundt om fortryllelsesbordet, forøges dets kraft og giver adgang til fortryllelser, der kræver højere erfaringsniveau. - + + Tæm en ulv ved at give den et ben. Derefter kan du få den til at sidde eller følge efter dig. - - - Det koster erfaringsniveau at fortrylle genstande. Dem kan du optjene ved at samle erfaringskugler, der dukker op, når du dræber monstre og dyr, udvinder malm, avler husdyr, fisker og smelter/steger ting i en ovn. - + + Du kan smide genstande fra Lager-menuen ved at trykke på {*CONTROLLER_VK_A*} uden for menuen. + - - - Du kan også optjene erfaringsniveauer med en erfaringseliksir, der efterlader erfaringskugler på det sted, hvor du smed den. Du kan samle kuglerne op. - + + Der er nyt indhold, der kan hentes! Find det via ikonet for Minecraft-butikken i hovedmenuen. - - - I kisterne i dette område kan du finde nogle fortryllede genstande, erfaringseliksirer og andre genstande, som endnu ikke er blevet fortryllede, og som du kan eksperimentere med på fortryllelsesbordet. - + + Du kan ændre din figurs udseende med en overfladepakke fra Minecraft-butikken. Vælg "Minecraft-butik" i hovedmenuen for at se udbuddet af varer. + - - - Nu kører du i en minevogn. Du kan forlade minevognen ved at pege med markøren på den og trykke på {*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - + + Tilpas lysstyrken for at gøre spillet lysere eller mørkere. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om minevogne.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til minevogne. + + Når du sover i en seng, spoles tiden frem til morgen. I multiplayerspil sker det kun, hvis alle spillere sover i hver sin seng samtidig. - - - En minevogn kører på skinner. Du kan også fremstille en minevogn med en ovn eller kiste i. - {*RailIcon*} - + + Kultivér jorden med et lugejern, så du kan plante frø. - - - Du kan også få vognen til at køre automatisk ved af fremstille elektriske skinner, som får kraft fra rødstensfakler. Du kan tilslutte dem til kontakter, håndtag og trykplader for at lave komplekse systemer. - {*PoweredRailIcon*} - + + Edderkopperne angriber dig ikke om dagen, medmindre du angriber dem. - - - Nu sejler du i en båd. Du kan forlade båden ved at pege med markøren på den og trykke på {*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - + + Det er hurtigere at grave i jord eller sand med en spade end med dine hænder. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om både.{*B*} + + Slagt grise for at få koteletter, som du kan stege og spise for at få mere energi. - - - I en båd kan du sejle hurtigere over vandet. Du kan styre den med {*CONTROLLER_ACTION_MOVE*} og {*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - + + Få læder fra køer til at lave rustninger med. - - - Nu bruger du en fiskestang. Tryk på {*CONTROLLER_ACTION_USE*} for at bruge den.{*FishingRodIcon*} - + + Hvis du har en tom spand, kan du fylde den med mælk fra en ko, vand eller lava! - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om fiskeri.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til fiskeri. + + Obsidian bliver skabt ved at blande vand med flydende lava. - - - Tryk på {*CONTROLLER_ACTION_USE*} for at kaste snøren ud. Tryk på {*CONTROLLER_ACTION_USE*} for at trække snøren ind igen. - {*FishingRodIcon*} - + + Nu kan du stable hegn oven på hinanden i spillet. - - - Hvis du venter med at trække snøren ind igen, indtil korken forsvinder under vandoverfladen, fanger du en fisk. Du kan spise rå fisk eller stege dem i ovnen for at få energi. - {*FishIcon*} - + + Nogle dyr følger efter dig, hvis du har hvede i hånden. - - - Ligesom mange andre redskaber kan fiskestangen kun bruges et begrænset antal gange. Dens brug er dog ikke kun begrænset til fiskeri. Prøv at eksperimentere med fiskestangen for at se, hvilke andre ting den kan fange eller aktivere ... - {*FishingRodIcon*} - + + Dyr forsvinder ikke ud af spillet, med mindre de kan bevæge sig mindst 20 blokke væk i en hvilken som helst retning. - - Dette er en seng. Tryk på {*CONTROLLER_ACTION_USE*}, mens du peger på den med markøren om natten for at sove frem til daggry.{*ICON*}355{*/ICON*} + + Tamme ulve viser deres energitilstand med deres hale. Giv dem kød for at genopfriske deres energi. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om senge.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til senge. + + Kog kaktusser i ovnen for at udvinde grøn farve. - - - Sengen skal stå et sikkert og veloplyst sted, så du ikke bliver vækket af monstre midt om natten. Når du har brugt en seng, fungerer den som gendannelsespunkt, hvis du dør. - {*ICON*}355{*/ICON*} - + + Du kan læse om de seneste opdateringer i spillet i sektionen Nyt i Sådan spiller du-menuerne. - - - Hvis du spiller med andre, skal I alle ligge i jeres senge på samme tid for at kunne sove. - {*ICON*}355{*/ICON*} - + + Musik af C418! - - - I dette område finder du nogle enkle rødstenskredsløb og stempelkredsløb samt en kiste med flere genstande, som du kan forbinde kredsløbene med. - + + Hvem er Notch? - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om rødstenskredsløb og stempler.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til rødstenskredsløb og stempler. + + Mojang har vundet flere priser, end de har medarbejdere! - - - Håndtag, knapper, trykplader og rødstensfakler giver alle strøm til kredsløb, når du enten kobler dem direkte til genstanden, som du vil aktivere, eller ved at tilslutte dem med støv fra rødsten. - + + Visse berømtheder spiller Minecraft! - - - Strømkildens placering og retning kan påvirke dens effekt på omkringliggende blokke. Du kan eksempelvis slukke for en rødstensfakkel, hvis du har placeret den på siden af en blok, der modtager strøm fra en anden strømkilde. - + + Notch har mere end en million følgere på Twitter! - - - Du kan udvinde rødstensstøv fra rødstensmalm ved hjælp af en jernhakke, diamanthakke eller en guldhakke. Den kan levere strøm til op til 15 blokke, og strømmen kan bevæge sig inden for en afstand af en blok op eller ned. - {*ICON*}331{*/ICON*} - + + Ikke alle svenskere har lyst hår. Der er endda nogle, ligesom Jens fra Mojang, der har rødt hår! - - - Du kan bruge rødstensgentagere for at forlænge strømmens rækkevidde, eller du kan placere en forsinker i kredsløbet. - {*ICON*}356{*/ICON*} - + + Der kommer en opdatering til spillet før eller siden! - - - Når der er sat strøm til et stempel, hæver det sig og skubber op til 12 blokke. Når klisterstempler trækker sig sammen, kan de trække en blok af de fleste slags materialer. - {*ICON*}33{*/ICON*} - + + Hvis du sætter to kister ved siden af hinanden, bliver de til en stor kiste. - - - Kisten i dette område indeholder nogle komponenter, som du kan bruge til at bygge stempelkredsløb med. Prøv at bruge eller fuldende kredsløbene i området, eller byg dine egne. Der er flere eksempler uden for introduktionsområdet. - + + Pas på, hvis du bygger en bygning i uld udendørs, da lynnedslag kan sætte den i brand. - - - I dette område finder du en portal til Afgrunden! - + + En enkel spand lava kan smelte 100 blokke i ovnen. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om portaler og Afgrunden.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til portaler og Afgrunden. + + Materialet under toneblokken afgør, hvilket instrument der spiller. - - - Du kan bygge portaler ved at lave en ramme af obsidianblokke, der er fire blokke i bredden og fem blokke i højden. Du behøver ikke sætte blokke i hjørnerne. - + + Det kan tage nogle minutter, inden den flydende lava forsvinder FULDSTÆNDIGT, når lavablokken fjernes. - - - Du aktiverer Afgrunden-portalen ved at tænde ild mellem obsidianblokkene i rammen med et fyrtøj. Portalerne deaktiveres, hvis rammen bliver brudt, der sker en eksplosion i nærheden, eller hvis der flyder vand igennem den. - + + Gyslingens ildkugler kan ikke trænge igennem brosten, så derfor er det et effektivt materiale at bruge til at beskytte portaler med. - - - Hvis du vil bruge portalen til Afgrunden, skal du gå ind i den. Skærmen bliver lilla, og du vil høre en lyd. I løbet af et par sekunder bliver du transporteret til en anden dimension. - + + Blokke, der kan bruges som lyskilder, smelter sne og is. Det inkluderer fakler, glødestene og græskarlygter. - - - Afgrunden er fuld af lava og kan være et farligt sted, men du kan også finde afgrundssten, der brænder for evigt, når du har tændt dem, samt glødesten, der lyser. - + + Zombier og skeletter kan overleve i dagslys, hvis de opholder sig i vand. - - - Du kan rejse gennem Afgrunden for at skyde genvej i Oververdenen. Når du bevæger dig en blok frem i Afgrunden, svarer det til, at du bevæger dig tre blokke frem ovenpå. - + + Høns lægger æg hvert femte til tiende minut. - - - Du spiller nu Kreativ. - + + Obsidian kan kun udvindes med en diamanthakke. - - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om Kreativ.{*B*} - Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til Kreativ. - + + Snigere er den lettest tilgængelige kilde til krudt. - - I Kreativ har du et uendeligt antal af alle genstande og blokke til rådighed, du kan ødelægge blokke med et klik uden at bruge et redskab, du er usårlig, og du kan flyve. + + Hvis du angriber en ulv, vil andre ulve i nærheden blive fjendtlige og angribe dig. Det samme gælder for zombificerede grisemænd. - - Tryk på {*CONTROLLER_ACTION_CRAFTING*} for at åbne fremstillingsskærmen i Kreativ. + + Ulve kan ikke rejse til Afgrunden. - - Gå over på den anden side af dette hul for at fortsætte. + + Ulve kan ikke angribe snigere. - - Du har nu fuldført introduktionen i Kreativ. + + Kræves for at udvinde forskellige former for stenblokke og malm. - - - Der er blevet bygget en gård i dette område. Med en gård kan du opbygge en kilde til mad og andre genstande. - + + Bruges i kageopskriften og som ingrediens i eliksirer. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om landbrug.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til landbrug. + + Sender en elektrisk ladning, når den tændes eller slukkes. Forbliver tændt eller slukket, indtil der bliver trykket på den igen. - - Hvede, græskar og meloner kommer fra frø. Du får hvedefrø ved at indsamle højt græs, og du kan få frø fra græskar og meloner fra deres respektive frø. + + Sender en konstant elektrisk strøm eller kan anvendes som modtager og sender, når den placeres på siden af en blok. +Kan også bruges til at give svag belysning. - - Inden du planter frø, skal du kultivere jorden ved hjælp af et lugejern, så den bliver til landbrugsjord. Med en vandkilde i nærheden kan du sørge for at landbrugsjorden ikke tørrer ud, og at afgrøderne vokser hurtigere. Lys hjælper også planterne med at gro. + + Gendanner 2 {*ICON_SHANK_01*} og kan bruges til at fremstille et guldæble med. - - Hvede vokser gennem flere stadier og er klar til at blive høstet, når det får en mørkere farve.{*ICON*}59:7{*/ICON*} + + Gendanner 2 {*ICON_SHANK_01*} samt energi i fire sekunder. Fremstilles af et æble og guldklumper. - - Der skal være en tom plads ved siden af felter, hvor du planter græskar og meloner, så der er plads til frugten, når stænglen har vokset sig stor. + + Gendanner 2 {*ICON_SHANK_01*}. Indtagelse kan forgifte dig. - - Sukkerrør skal plantes i græs-, jord- eller sandblokke, der er lige ved siden af vand. Når du fælder en del af et sukkerrør, får du blokkene med, der er placeret oven på.{*ICON*}83{*/ICON*} + + Bruges i rødstenskredsløb som gentager, forsinker og/eller diode. - - Kaktusser skal plantes i sand og kan vokse sig op til tre blokke i højden. Ligesom med sukkerrør, så falder blokkene med ned, når du fælder den nederste del af en kaktus.{*ICON*}81{*/ICON*} + + Bruges til at styre minevogne med. - - Svampe skal plantes i svag belysning, så vil de sprede sig til andre svagt belyste blokke.{*ICON*}39{*/ICON*} + + Når der er sat strøm til, giver den minevogne fart på, når de passerer over den. Når den er slukket, bremser den minevogne, når de passerer over den. - - Med benmel kan du få afgrøder til at vokse sig store øjeblikkeligt og svampe til at vokse sig til kæmpestørrelse.{*ICON*}351:15{*/ICON*} + + Fungerer som en trykplade (sender et rødstenssignal, når den er aktiveret), men kan kun aktiveres af en minevogn. - - Du har nu fuldført introduktionen til landbrug. + + Sender en elektrisk strøm, når der trykkes på den. Forbliver aktiveret i cirka et sekund, inden den slukkes igen. - - - I dette område er dyrene indhegnet. Du kan avle dyr for at få unger. - + + Skyder med genstande i tilfældig rækkefølge, når den modtager strøm fra rødsten. - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om avl.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til avl. + + Spiller en tone, når den udløses. Slå på den for at ændre tonehøjde. Stil den på forskellige materialer for at skifte instrument. + - - Du skal fodre dyrene for at gøre dem elskovssyge, så de kan få unger. + + Gendanner 2,5 {*ICON_SHANK_01*}. Fremstillet ved at stege rå fisk i en ovn. - - Hvis du giver hvede til køer, muhsvampe eller får, gulerødder til grise, hvedefrø eller afgrundsurt til høns og kød til ulve, vil de begynde at se sig om efter en mage i nærheden, som også er elskovssyg. + + Gendanner 1 {*ICON_SHANK_01*}. - - Når to elskovssyge dyr af samme art møder hinanden, kysser de hinanden i et par sekunder, hvorefter en dyreunge dukker op. Dyreungen følger efter sine forældre, indtil den selv har vokset sig stor. + + Gendanner 1 {*ICON_SHANK_01*}. - - Når et dyr har været elskovssygt, skal der gå op til fem minutter, inden det kan blive det igen. + + Gendanner 3 {*ICON_SHANK_01*}. - - Nogle dyr følger efter dig, hvis du har mad i hånden. På den måde er det lettere at lokke dem sammen, så du kan avle dem.{*ICON*}296{*/ICON*} + + Bruges som ammunition til buer. - - - Du kan tæmme vilde ulve ved at give dem ben. Der dukker hjerter op omkring dem, når de er tæmmet. Tamme ulve følger spilleren og forsvarer dem, med mindre de er blevet beordret til at sidde. - + + Gendanner 2,5 {*ICON_SHANK_01*}. - - Du har nu fuldført introduktionen til dyr og avl. + + Gendanner 1 {*ICON_SHANK_01*}. Kan bruges seks gange. - - - I dette områder er der græskar og blokke, så du kan lave en snegolem og en jerngolem. - + + Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Indtagelse kan forgifte dig. - - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om golemmer.{*B*} - Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til golemmer. - + + Gendanner 1,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. - - Golemmer bliver skabt ved at placere et græskar oven på en stak blokke. + + Gendanner 4 {*ICON_SHANK_01*}. Fremstillet ved at stege rå kotelet i en ovn. - - Snegolemmer skal laves af to sneblokke oven på hinanden med et græskar på toppen. Snegolemmer kaster snebolde efter deres skabers fjender. + + Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Kan bruges til at tæmme en ozelot med. - - Jerngolemmer skal laves af to jernblokke oven på hinanden med et græskar på toppen. Jerngolemmer angriber dine fjender. + + Gendanner 3 {*ICON_SHANK_01*}. Fremstillet ved at stege rå kylling i en ovn. - - Jerngolemmer dukker også naturligt op for at beskytte landsbyer og angriber dig, hvis du angriber landsbyboerne. + + Gendanner 1,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. - - Du kan ikke forlade området, før du har gennemført introduktionen. + + Gendanner 4 {*ICON_SHANK_01*}. Fremstillet ved at stege råt kød i en ovn. - - Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en skovl til bløde materialer som jord og sand. + + Kan transportere dig, et dyr eller et monster på skinnerne. - - Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en økse til at fælde træer med. + + Bruges som farve til lyseblå uld. - - Nogle redskaber er bedre til visse materialer end andre. Du bør bruge en hakke til sten og malm. Du får brug for at lave en hakke af et stærkere materiale for at kunne udvinde ressourcer fra visse blokke. + + Bruges som farve til cyan uld. - - Nogle redskaber er bedre til at angribe fjender med end andre. Et sværd er godt at angribe med. + + Bruges som farve til lilla uld. - - Tip: Hold {*CONTROLLER_ACTION_ACTION*} nede for at hakke og hugge med hænderne eller det redskab, som du bruger. Du får brug for et redskab for at udvinde bestemte materialer ... + + Bruges som farve til limegrøn uld. - - Redskabet, du bruger, er blevet slidt. Hver gang du bruger et redskab, bliver det en smule mere slidt, indtil det går i stykker. Den farvede bjælke under redskabet i dit lager viser, hvor slidt redskabet er. + + Bruges som farve til grå uld. - - Hold {*CONTROLLER_ACTION_JUMP*} nede for at svømme op. + + Bruges som farve til lysegrå uld. +(Bemærk: Lysegrå farve kan også fremstilles ved at kombinere grå farve med benmel, så du kan fremstille fire portioner grå farve fra en blækpose i stedet for tre.) - - I dette område finder du en minevogn på skinner. Du kan sætte dig i minevognen ved at pege med markøren på den og trykke på {*CONTROLLER_ACTION_USE*}. Brug {*CONTROLLER_ACTION_USE*} på knappen for at sætte minevognen i bevægelse. + + Bruges som farve til magentafarvet uld. - - I kisten ved siden af floden er der en båd. Du kan sætte dig i båden ved at pege med markøren på den og trykke på {*CONTROLLER_ACTION_USE*}. Ret markøren mod båden, og tryk på {*CONTROLLER_ACTION_USE*} for at sætte dig i den. + + Giver kraftigere lys end fakler. Smelter sne og is og kan bruges under vand. - - I kisten ved siden af dammen er der en fiskestang. Tag fiskestangen fra kisten, og vælg den, så du holder den i hånden. + + Bruges til fremstilling af bøger og kort. + + + Bruges til fremstilling af bogreoler eller fortryllede bøger, når de er fortryllede. - - Denne avancerede stempelmekanisme skaber en bro, der reparerer sig selv! Tryk på knappen for at aktivere den, og prøv dernæst at kigge nærmere på, hvordan komponenterne interagerer for at lære mere. + + Bruges som farve til blå uld. - - Hvis du flytter en genstand uden for skærmen, kan du smide den. + + Spiller musikplader. - - Du har ikke ingredienserne til denne genstand. Feltet nederst til venstre viser de ingredienser, der skal bruges til denne genstand. + + Bruges til fremstilling af meget solide redskaber, våben og rustninger. - - - Tillykke, du har gennemført introduktionen. Tiden går nu normalt i spillet, og det varer ikke længe, før det bliver nat, og monstrene kommer frem! Byg dit tilflugtssted færdigt! - + + Bruges som farve til orange uld. - - {*EXIT_PICTURE*} Når du er klar til at udforske mere af verdenen, er der en trappeopgang i området i nærheden af minearbejderens skur, der fører videre til en lille borg. + + Indsamlet fra får og kan farves. - - Påmindelse: + + Bruges som byggemateriale og kan farves. Denne opskrift anbefales ikke, fordi det er let at få fat i uld fra får. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Bruges som farve til sort uld. - - Der er blevet føjet nye funktioner til i den seneste version af spillet, heriblandt nye områder i introduktionsverdenen. + + Kan transportere gods på skinnerne. - - {*B*}Tryk på {*CONTROLLER_VK_A*} for at spille gennem introduktionen som sædvanlig.{*B*} - Tryk på {*CONTROLLER_VK_B*} for at springe den grundlæggende introduktion over. + + Kan køre på skinner og kan skubbe andre minevogne, når der er kul i den. - - Her finder du forskellige områder, der lærer dig om fiskeri, både, stempler og rødsten. + + Rejs hurtigere over vand end ved at svømme. - - Uden for dette område finder du eksempler på bygninger, landbrug, minevogne, skinner, fortryllelse, brygning, handel smedearbejde og meget mere! + + Bruges som farve til grøn uld. - - - Din madbjælke er faldet til et niveau, hvor du ikke længere får ny energi. - + + Bruges som farve til rødt uld. - - - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om madbjælken og mad.{*B*} - Tryk på {*CONTROLLER_VK_B*} hvis du allerede kender til madbjælken og mad. - + + Bruges for at få afgrøder, højt græs, kæmpesvampe og blomster til at vokse øjeblikkeligt og kan bruges i farveopskrifter. - - Vælg + + Bruges som farve til lyserødt uld. - - Anvend + + Bruges som farve til brun uld og ingrediens i småkager eller til dyrkning af kakaobønner. - - Tilbage + + Bruges som farve til sølvfarvet uld. - - Afslut + + Bruges som farve til gul uld. - - Annullér + + Gør det muligt at skyde med pile. - - Annullér tilslutning + + Giver dig 5 rustning, når du har den på. - - Opdatér oversigt over onlinespil + + Giver dig 3 rustning, når du har den på. - - Party-spil + + Giver dig 1 rustning, når du har den på. - - Alle spil + + Giver dig 5 rustning, når du har den på. - - Skift gruppe + + Giver dig 2 rustning, når du har den på. - - Vis lager + + Giver dig 2 rustning, når du har den på. - - Vis beskrivelse + + Giver dig 3 rustning, når du har den på. - - Vis ingredienser + + En funklende barre, som du kan lave redskaber ud af. Fremstillet ved bearbejdning af malm i ovnen. - - Fremstilling + + Gør det muligt at fremstille blokke med barrer, juveler og farver, der kan placeres. Kan anvendes som en luksuriøs byggeblok eller som et kompakt malmlager. - - Skab + + Sender en elektrisk ladning, når spilleren, et dyr eller et monster træder på den. Trykplader af træ kan også aktiveres ved at kaste noget hen på dem. - - Tag/placér + + Giver dig 8 rustning, når du har den på. - - Tag + + Giver dig 6 rustning, når du har den på. - - Tag alt + + Giver dig 3 rustning, når du har den på. - - Tag halvdelen + + Giver dig 6 rustning, når du har den på. - - Placér + + Jerndøre kan kun åbnes ved hjælp af rødsten, knapper eller kontakter. - - Placér alt + + Giver dig 1 rustning, når du har den på. - - Placér en + + Giver dig 3 rustning, når du har den på. - - Smid + + Hug forskellige former for træ hurtigere end med hænderne. - - Smid alt + + Opdyrk blokke med græs og jord for at gøre plads til afgrøder. - - Smid en + + Åbn og luk trædøre ved at slå på dem, aktivere dem eller ved hjælp af rødsten. - - Byt + + Giver dig 2 rustning, når du har den på. - - Flyt hurtigt + + Giver dig 4 rustning, når du har den på. - - Ryd hurtigt valg + + Giver dig 1 rustning, når du har den på. - - Hvad er det? + + Giver dig 2 rustning, når du har den på. - - Del på Facebook + + Giver dig 1 rustning, når du har den på. - - Skift filter + + Giver dig 2 rustning, når du har den på. - - Send venneanmodning + + Giver dig 5 rustning, når du har den på. - - Side ned + + Kan bruges til at bygge kompakte trapper med. - - Side op + + Til svampestuvning. Du får lov at beholde skålen, når stuvningen er spist. - - Næste + + Til opbevaring og transport af vand, lava og mælk. - - Forrige + + Til opbevaring og transport af vand. - - Smid spiller ud + + Viser tekst, der er skrevet af dig eller andre spillere. - - Farve + + Giver kraftigere lys end fakler. Smelter sne og is og kan bruges under vand. - - Udvind + + Skaber eksplosioner. Stil sprængstoffet, og udløs det ved at tænde lunten med et fyrtøj eller en elektrisk ladning. - - Fodr + + Til opbevaring og transport af lava. - - Tæm + + Viser solens og månens placeringer. - - Helbred + + Peger mod din startposition. - - Sid + + Tegner et billede af et område, når du bruger det. Du kan bruge kortet til at finde vej med. - - Følg + + Til opbevaring og transport af mælk. - - Smid ud + + Tænder ild, udløser sprængstof og aktiverer portaler, når rammen er færdig. - - Tøm + + Bruges til at fiske med. - - Sadel + + Kan åbnes og lukkes ved at slå på dem, aktivere dem eller ved hjælp af rødsten. De fungerer som normale døre, men ligger fladt på jorden med dimensionerne én gange én. - - Placér + + Bruges som byggemateriale og kan også anvendes til fremstilling af mange genstande. Kan fremstilles af enhver slags træ. - - Slå + + Bruges som byggemateriale. Påvirkes ikke af tyngdekraften som normalt sand. - - Malk + + Bruges som byggemateriale. - - Indsaml + + Kan bruges til at bygge lange trapper med. To fliser oven på hinanden udgør en blok af normal størrelse. - - Spis + + Kan bruges til at bygge lange trapper med. To fliser placeret ovenpå hinanden skaber en blok af normal størrelse. - - Sov + + Giver lys. Fakler kan også smelte sne og is. - - Vågn op + + Bruges til fremstilling af fakler, pile, skilte, stiger, hegn, samt håndtag til våben og redskaber. - - Leg + + Kan opbevare blokke og genstande. Stil to kister ved siden af hinanden for at skabe en større kiste med dobbelt så meget plads. - - Rid + + En barriere, man ikke kan hoppe over. Tæller som 1,5 blokke i højden for spillere, dyr og monstre, men en blok i højden i forhold til andre blokke. + - - Sejl + + Bruges til at klatre lodret med. - - Dyrk + + Får tiden til at springe frem til morgen, hvis alle spillerne i verdenen er i seng, og ændrer spillerens gendannelsespunkt. +Farverne på sengene er altid de samme, uanset farverne på uldet. - - Svøm op + + Giver dig mulighed for at fremstille et mere varieret udvalg af genstande end ellers. - - Åbn + + Giver dig mulighed for at smelte malm, fremstille kul og glas samt stege fisk og koteletter. - - Skift tonehøjde + + Jernøkse - - Detonér + + Rødstenslampe - - Læs + + Trappe af jungletræ - - Hæng + + Trappe af birketræ - - Kast + + Nuværende styring - - Plant + + Kranium - - Kultivér + + Kakao - - Høst + + Trappe af grantræ - - Fortsæt + + Drageæg - - Lås op for det komplette spil + + Mørkesten - - Slet gemt spil + + Portalramme til Mørket - - Slet + + Trappe af sandsten - - Indstillinger + + Bregne - - Invitér venner + + Buskads - - Acceptér + + Layout - - Klip + + Fremstilling - - Blokér bane + + Anvend - - Vælg overflade + + Handling - - Tænd + + List/flyv nedad - - Navigér + + List - - Installér komplet version + + Smid - - Installér prøveversion + + Skift anvendt genstand - - Installér + + Pause - - Geninstallér + + Synsvinkel - - Gem indst. + + Gå/spurt - - Udfør handling + + Lager - - Kreativ + + Hop/flyv op - - Flyt ingrediens + + Hop - - Flyt brændsel + + Portal til Mørket - - Flyt redskab + + Græskarstilk - - Flyt rustning + + Melon - - Flyt våben + + Rude af glas - - Anvend + + Låge - - Træk + + Vinranke - - Slip + + Melonstilk - - Privilegier + + Jernbarrer - - Blok + + Revnet mursten af sten - - Side op + + Mursten af mossten - - Side ned + + Mursten af sten - - Elskovssyg + + Svamp - - Drik + + Svamp - - Rotér + + Tilhugget mursten af sten - - Skjul + + Trappe af mursten - - Ryd alle pladser + + Afgrundsurt - - OK + + Trappe af afgrundsmursten - - Annullér + + Hegn af afgrundsmursten - - Minecraft-butikken + + Gryde - - Er du sikker på, at du vil afslutte dit nuværende spil og slutte dig til et nyt? Alle fremskridt, der ikke er gemt, går tabt. + + Bryggestativ - - Afslut spil + + Fortryllelsesbord - - Gem spil + + Afgrundsmursten - - Afslut uden at gemme + + Sølvfisk fra brosten - - Er du sikker på, at du vil overskrive de tidligere gemte spil fra denne verden med den nuværende version af denne verden? + + Sølvfisk fra sten + + + Trappe af stenmursten - - Er du sikker på, at du vil afslutte uden at gemme? Du mister alle dine fremskridt i denne verden! + + Åkandeblad - - Start spil + + Mycelium - - Ødelagt gemt spil + + Sølvfisk fra mursten af sten - - Det gemte spil er ødelagt. Vil du slette det? + + Skift kameravinkel - - Er du sikker på, at du vil afslutte til hovedmenuen og fjerne alle spillere fra spillet? Alle fremskridt, der ikke er gemt, går tabt. + + Hvis du mister energi, men har ni eller flere {*ICON_SHANK_01*} på din madbjælke, vil din energi blive gendannet automatisk. Din madbjælke bliver fyldt igen, når du spiser. - - Afslut og gem + + I takt med at du udforsker omgivelserne, udvinder materialer og angriber andre væsner, bliver din madbjælke tømt {*ICON_SHANK_01*}. Du forbrænder meget mere mad, når du spurter eller spurthopper fremfor at gå og hoppe normalt. + - - Afslut uden at gemme + + Dit lager bliver fyldt, efterhånden som du fremstiller og indsamler flere genstande.{*B*} + +Tryk på {*CONTROLLER_ACTION_INVENTORY*} for at åbne lageret. - - Er du sikker på, at du vil afslutte til hovedmenuen? Alle fremskridt, der ikke er gemt, går tabt. + + Du kan lave planker ud af det træ, du finder. Åbn fremstillingsskærmen for at lave dem.{*PlanksIcon*} - - Er du sikker på, at du vil afslutte til hovedmenuen? Dine fremskridt går tabt! + + Din madbjælke er snart tom, og du har mistet noget energi. Spis steaken fra dit lager for at fylde din madbjælke igen og få energi igen.{*ICON*}364{*/ICON*} - - Skab ny verden + + Hold {*CONTROLLER_ACTION_USE*} nede for at spise den mad, du holder i hånden, og fylde din madbjælke. Du kan ikke spise noget, hvis din madbjælke allerede er fuld. - - Spil introduktion + + Tryk på {*CONTROLLER_ACTION_CRAFTING*} for at åbne fremstillingsskærmen. - - Introduktion + + Skub {*CONTROLLER_ACTION_MOVE*} fremad to gange hurtigt. Hvis du bliver ved med at skubbe {*CONTROLLER_ACTION_MOVE*} fremad, vil du fortsætte med at spurte, indtil du løber tør for spurtetid eller mad. + - - Giv din verden et navn + + Brug {*CONTROLLER_ACTION_MOVE*} for at gå. - - Indtast et navn til din verden + + Brug {*CONTROLLER_ACTION_LOOK*} for at kigge op, ned og rundt omkring dig. - - Indtast seed til skabelsen af din verden + + Hold {*CONTROLLER_ACTION_ACTION*} nede for at hugge fire blokke af træ (træstammer).{*B*}Når blokken går i stykker, kan du samle den svævende genstand op ved at stille dig i nærheden, hvorefter den dukker op i dit lager. - - Indlæs gemt verden + + Hold {*CONTROLLER_ACTION_ACTION*} nede for at hakke og hugge med hænderne eller det redskab, som du bruger. Du får brug for et redskab for at udvinde bestemte materialer ... - - Tryk på START-knappen for at deltage i spillet + + Tryk på {*CONTROLLER_ACTION_JUMP*} for at hoppe. - - Afslutter spillet + + Mange fremstillingsprocesser indeholder flere trin. Nu hvor du har nogle planker, er der flere genstande, som du kan lave. Byg et arbejdsbord.{*CraftingTableIcon*} - - Der opstod en fejl. Afslutter til hovedmenuen. + + + Natten kommer pludseligt, og det er farligt at være udendørs, hvis du er uforberedt. Du kan lave våben og rustninger, men det er klogt at have et sikkert tilflugtssted. + - - Kunne ikke oprette forbindelse + + Åbn beholderen - - Forbindelsen blev afbrudt + + Du kan udvinde materialer fra hårde blokke som sten og malm, hvis du har en hakke. Efterhånden som du samler flere materialer kan du lave redskaber, der er mere effektive og holder længere, og som giver dig mulighed for at udvinde hårdere materialer. Lav en træhakke.{*WoodenPickaxeIcon*} - - Forbindelsen til serveren blev afbrudt. Afslutter til hovedmenuen. + + Hak nogle blokke af sten ud med din hakke. Blokke af sten giver brosten, når du hakker dem. Når du har samlet otte brosten, kan du bygge en ovn. Du skal muligvis grave gennem jord for at nå ned til sten, og det går hurtigere, hvis du bruger en skovl.{*StoneIcon*} - - Serveren afbrød forbindelsen + + + Du skal samle nogle ressourcer for at bygge tilflugtsstedet færdigt. Du kan lave vægge og tag af alle slags materialer, men du skal også bruge en dør, nogle vinduer og noget lys. + - - Du blev smidt ud af spillet + + + I nærheden finder du en minearbejders forladte tilflugtssted, som du kan bygge færdigt for at få et sikkert sted at tilbringe natten. + - - Du blev smidt ud af spillet, fordi du fløj + + Du kan hugge træ og lave fliser af træ hurtigere, hvis du har en økse. Efterhånden som du samler flere materialer kan du lave redskaber, der er mere effektive og holder længere. Lav en træøkse.{*WoodenHatchetIcon*} - - Det tog for lang tid at oprette forbindelse + + Tryk på {*CONTROLLER_ACTION_USE*} for at bruge genstande, interagere med genstande og placere ting. Når du har placeret en ting, kan du samle den op igen ved at hakke på den med det rigtige redskab. - - Serveren er fyldt + + Brug {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for at udskifte den genstand, du har i hånden. - - Værten har forladt spillet. + + Du kan samle blokke hurtigere, hvis du bygger et redskab, der kan hjælpe dig med arbejdet. Nogle redskaber har håndtag, der er lavet af pinde. Fremstil nogle pinde.{*SticksIcon*} - - Du kan ikke deltage i dette spil, fordi du ikke er venner med nogen i spillet. + + Du kan grave bløde blokke som jord og sne hurtigere op, hvis du har en skovl. Efterhånden som du samler flere materialer, kan du lave redskaber, der er mere effektive og holder længere. Lav en træskovl.{*WoodenShovelIcon*} - - Du kan ikke deltage i dette spil, fordi du tidligere er blevet smidt ud af værten. + + Ret sigtekornet mod arbejdsbordet, og tryk på {*CONTROLLER_ACTION_USE*} for at åbne det. - - Du kan ikke deltage i dette spil, da værten spiller en ældre version af spillet. + + Vælg arbejdsbordet, og ret sigtekornet mod det sted, hvor du vil placere det. Tryk på {*CONTROLLER_ACTION_USE*} for at placere arbejdsbordet. - - Du kan ikke deltage i dette spil, da værten spiller en nyere version af spillet. + + Minecraft er et spil, der handler om at bygge alt, du kan forstille dig, med blokke. +Om natten kommer monstrene frem, så du skal sørge for at bygge et tilflugtssted, inden det sker. - - Ny verden + + - - Belønning oplåst! + + - - Hurra – du har låst op for et billede af Steve fra Minecraft! + + - - Hurra – du har låst op for et billede af en sniger fra Minecraft! + + - - Lås op for det komplette spil + + - - Du spiller prøveversionen, men du skal købe det komplette spil for at kunne gemme dit spil. -Vil du låse op for det komplette spil nu? + + - - Vent venligst + + - - Ingen resultater + + Layout 1 - - Filter: + + Bevægelse (flyver) - - Venner + + Spillere/invitér - - Mine point + + - - Sammenlagt + + Layout 3 - - Placeringer: + + Layout 2 - - Rang + + - - Forbereder at gemme banen + + - - Forbereder dele ... + + - - Afslutter ... + + - - Bygger terræn + + {*B*}Tryk på {*CONTROLLER_VK_A*} for at starte introduktionen.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du mener, at du er klar til at spille på egen hånd. - - Simulerer verdenen et kort stykke tid + + {*B*}Tryk på {*CONTROLLER_VK_A*} for at fortsætte. - - Starter server + + - - Opretter fremkaldelsesområde + + - - Indlæser fremkaldelsesområde + + - - Rejser til Afgrunden + + - - Forlader Afgrunden + + - - Gendanner + + - - Skaber bane + + - - Indlæser bane + + - - Gemmer spillere + + Blok med sølvfisk - - Tilslutter til vært + + Flise af sten - - Downloader terræn + + En kompakt måde at opbevare jern på. - - Skifter til offlinespil + + Blok af jern - - Vent venligst, mens værten gemmer spillet + + Flise af bøgetræ - - Rejser til Mørket + + Sandstensflise - - Forlader Mørket + + Flise af sten - - Sengen er optaget + + En kompakt måde at opbevare guld på. - - Du kan kun sove om natten + + Blomst - - %s sover i en seng. Hvis I vil springe frem til daggry, skal alle spillere sove i hver sin seng på samme tid. + + Hvid uld - - Din seng blev væk eller var blokeret + + Orange uld - - Du kan ikke hvile nu, der er monstre i nærheden + + Blok af guld - - Du sover i en seng. Hvis I vil springe frem til daggry, skal alle spillere sove i hver sin seng på samme tid. + + Svamp - - Redskaber og våben + + Rose - - Våben + + Flise af brosten - - Mad + + Bogreol - - Strukturer + + TNT - - Rustning + + Mursten - - Mekanismer + + Fakkel - - Transport + + Obsidian - - Dekorationer + + Mossten - - Byggeblokke + + Flise af afgrundsmursten - - Rødsten og transport + + Flise af bøgetræ - - Diverse + + Flise af stenmursten - - Brygning + + Flise af mursten - - Redskaber, våben og rustninger + + Flise af jungletræ - - Materialer + + Flise af birketræ - - Logget ud + + Flise af grantræ - - Sværhedsgrad + + Magentafarvet uld - - Musik + + Birkeblade - - Lyd + + Granblade - - Lysstyrke + + Bøgeblade - - Spilfølsomhed + + Glas - - Skærmfølsomhed + + Svamp - - Fredfyldt + + Jungleblade - - Let + + Blade - - Normal + + Bøg - - Svær + + Gran - - På denne sværhedsgrad får spilleren automatisk ny energi, og der er ingen fjender i omgivelserne. + + Birk - - På denne sværhedsgrad er der fjender i omgivelserne, men spilleren tager mindre skade end normalt. + + Grantræ - - På denne sværhedsgrad er der fjender i omgivelserne, og spilleren tager normal skade. + + Birketræ - - På denne sværhedsgrad er der fjender i omgivelserne, og spilleren tager stor skade. Pas godt på snigerne – de stopper ikke deres eksplosionsangreb, selvom du går væk fra dem! + + Jungletræ - - Prøveversionen er udløbet + + Uld - - Spillet er fyldt + + Lyserød uld - - Kunne ikke logge ind, fordi der ikke er flere ledige pladser + + Grå uld - - Indtast tekst til skilt + + Lysegrå uld - - Indtast tekst til dit skilt + + Lyseblå uld - - Indtast en titel + + Gul uld - - Indtast en titel til dit opslag + + Limegul uld - - Indtast overskrift + + Cyan uld - - Indtast en overskrift til dit opslag + + Grøn uld - - Indtast beskrivelse + + Rød uld - - Indtast en beskrivelse til dit opslag + + Sort uld - - Lager + + Lilla uld - - Ingredienser + + Blå uld - - Bryggestativ + + Brun uld - - Kiste + + Fakkel (kul) - - Fortryl + + Glødesten - - Ovn + + Sjælesand - - Ingrediens + + Afgrundssten - - Brændsel + + Blok af lasursten - - Automat + + Lasurstensmalm - - Der er ikke nogen tilbud på indhold, der kan hentes, af denne type i øjeblikket. + + Portal - - %s har sluttet sig til spillet. + + Græskarlygte - - %s har forladt spillet. + + Sukkerrør - - %s blev smidt ud af spillet. + + Ler - - Er du sikker på, at du vil slette det gemte spil? + + Kaktus - - Afventer godkendelse + + Græskar - - Censureret + + Hegn - - Spiller nu: + + Jukebox - - Gendan indstillinger + + En kompakt måde at opbevare lasursten på. - - Er du sikker på, at du vil gendanne dine indstillinger til deres standardværdier? + + Faldlem - - Indlæsningsfejl + + Låst kiste - - Spil tilhørende %s + + Diode - - Ukendt spilvært + + Klistret stempel - - Gæst logget ud + + Stempel - - Alle gæstespillere er blevet logget ud, fordi en gæst forlod spillet. + + Uld (en hvilken som helst farve) - - Log ind + + Vissen busk - - Du er ikke logget ind. Du skal være logget ind for at kunne spille. Vil du logge ind nu? + + Kage - - Multiplayer er ikke tilladt + + Nodeblok - - Kunne ikke oprette spil + + Automat - - Autovalg + + Højt græs - - Ingen pakker: Standardskins + + Spindelvæv - - Favoritoverflade + + Seng - - Blokeret bane + + Is - - Spillet, du opretter forbindelse til, er på din liste over blokerede baner. -Hvis du opretter forbindelse til spillet, bliver banen fjernet fra listen over blokerede baner. + + Arbejdsbord - - Vil du blokere banen? + + En kompakt måde at opbevare diamanter på. - - Er du sikker på, at du vil føje denne bane til din liste over blokerede baner? -Hvis du vælger OK, forlader du også spillet. + + Blok af diamant - - Fjern fra blokeringsliste + + Ovn - - Interval for automatisk gemte spil + + Landbrugsjord - - Interval for automatisk gemte spil: FRA + + Afgrøder - - Min. + + Diamantmalm - - Kan ikke placeres her! + + Monsterfremkalder - - Du må ikke placere lava tæt på gendannelsespunktet, da det skaber en risiko for, at gendannede spillere dør med det samme. + + Ild - - Skærmgennemsigtighed + + Fakkel (trækul) - - Gør forberedelser til at gemme banen automatisk + + Støv fra rødsten - - Display-størrelse + + Kiste - - Display-størrelse (delt skærm) + + Trappe af bøgetræ - - Seed + + Skilt - - Lås op for overfladepakke + + Rødstensmalm - - Du skal låse op for denne overfladepakke for at bruge den valgte overflade. -Vil du låse op for overfladepakken nu? + + Jerndør - - Lås op for teksturpakke + + Trykplade - - Du skal låse op for denne teksturpakke for at bruge den i din verden. -Vil du låse op for den nu? + + Sne - - Prøveversion af teksturpakke + + Knap - - Du bruger stadig en prøveversion af denne teksturpakke. Du kan først gemme verdenen, når du har låst op for den komplette version. -Vil du låse op for den komplette version af teksturpakken nu? + + Rødstensfakkel - - Teksturpakken er ikke tilgængelig + + Håndtag - - Lås op for den komplette version + + Skinne - - Download prøveversion + + Stige - - Download komplet version + + Trædør - - Denne verden bruger en mash-up-pakke eller teksturpakke, som du mangler! -Vil du installere mash-up-pakken eller teksturpakken nu? + + Trappe af sten - - Hent prøveversion + + Kontaktskinne - - Hent den komplette version + + Strømskinne - - Smid spiller ud + + Du har samlet nok brosten til at bygge en ovn. Byg en på arbejdsbordet. - - Er du sikker på, at du vil smide spilleren ud? Vedkommende kan ikke oprette forbindelse til dit spil igen, før du genstarter verdenen. + + Fiskestang - - Pakker med spillerbilleder + + Ur - - Temaer + + Støv fra glødesten - - Overfladepakker + + Minevogn med ovn - - Tillad venner af venner + + Æg - - Du kan ikke tilslutte til spillet, fordi det er begrænset til spillere, der er venner med værten. + + Kompas - - Kan ikke tilslutte til spil + + Rå fisk - - Valgt + + Rosenrødt - - Valgt overflade: + + Kaktusgrønt - - Indholdet, der kan hentes, er ødelagt + + Kakaobønner - - Indholdet, der kan hentes, er ødelagt og kan ikke bruges. Du skal slette det og geninstallere det fra menuen i Minecraft-butikken. + + Stegt fisk - - Noget af dit indhold, der kan hentes, er ødelagt og kan ikke bruges. Du skal slette det og geninstallere det fra menuen i Minecraft-butikken. + + Farvepulver - - Spiltypen er blevet ændret + + Blækpose - - Omdøb din verden + + Minevogn med kiste - - Indtast et nyt navn til din verden + + Snebold - - Spiltype: Overlevelse + + Båd - - Spiltype: Kreativ + + Læder - - Overlevelse + + Minevogn - - Kreativ + + Sadel - - Oprettet i Overlevelse + + Rødsten - - Oprettet i Kreativ + + Mælkespand - - Vis skyer + + Papir - - Hvad vil du gøre med det gemte spil? + + Bog - - Omdøb gemte spil + + Slimklat - - Gemmer automatisk om %d ... + + Mursten - - Til + + Ler - - Fra + + Sukkerrør - - Normal + + Lasursten - - Meget flad + + Kort - - Når denne funktion er slået til, bliver spillet til et onlinespil. + + Musikplade – "13" - - Når denne funktion er slået til, er det kun inviterede spillere, der kan deltage. + + Musikplade – "cat" - - Når denne funktion er slået til, kan spillere, der er venner med personer på din venneliste, deltage i spillet. + + Seng - - Når denne funktion er slået til, kan spillerne skade hinanden. Gælder kun i Overlevelse. + + Rødstensgentager - - Når denne funktion er slået fra, kan spillere, der tilslutter sig spillet, ikke bygge eller udvinde materialer, før de har fået tilladelse. + + Småkage - - Når denne funktion er slået til, kan ilden sprede sig til brandbare blokke i nærheden. + + Musikplade – "blocks" - - Når denne funktion er slået til, eksploderer TNT, når det aktiveres. + + Musikplade – "mellohi" - - Når denne funktion er slået til, vil Afgrunden blive genskabt. Det er nyttigt, hvis du har et ældre gemt spil, hvor afgrundsfæstningen ikke er med. + + Musikplade – "stal" - - Når denne funktion er slået til, bliver strukturer som landsbyer og fæstninger skabt i verdenen. + + Musikplade – "strad" - - Når denne funktion er slået til, bliver der skabt en helt flad verden i Oververdenen og Afgrunden. + + Musikplade – "chirp" - - Når denne funktion er slået til, bliver der skabt en kiste med nyttige genstande i nærheden af spillerens gendannelsespunkt. + + Musikplade – "far" - - Overfladepakker + + Musikplade – "mall" - - Temaer + + Kage - - Spillerbilleder + + Grå farve - - Avatargenstande + + Lyserød farve - - Teksturpakker + + Limegrøn farve - - Mash-up-pakke + + Lilla farve - - {*PLAYER*} gik op i røg + + Cyan farve - - {*PLAYER*} brændte ihjel + + Lysegrå farve - - {*PLAYER*} prøvede at svømme i lava + + Mælkebøttegul - - {*PLAYER*} blev kvalt i en væg + + Benmel - - {*PLAYER*} druknede + + Ben - - {*PLAYER*} sultede ihjel + + Sukker - - {*PLAYER*} blev stukket ihjel + + Lyseblå farve - - {*PLAYER*} ramte jorden for hurtigt + + Magenta farve - - {*PLAYER*} faldt ud af verdenen + + Orange farve - - {*PLAYER*} døde + + Skilt - - {*PLAYER*} sprang i luften + + Lædertunika - - {*PLAYER*} blev dræbt af magi + + Brystplade af jern - - {*PLAYER*} blev dræbt af mørkedragens ånde + + Diamantbrystplade - - {*PLAYER*} blev dræbt af {*SOURCE*} + + Jernhjelm - - {*PLAYER*} blev dræbt af {*SOURCE*} + + Diamanthjelm - - {*PLAYER*} blev skudt af {*SOURCE*} + + Guldhjelm - - {*PLAYER*} blev skudt ned med ildkugler af {*SOURCE*} + + Brystplade af guld - - {*PLAYER*} blev banket ihjel af {*SOURCE*} + + Guldbukser - - {*PLAYER*} blev dræbt af {*SOURCE*} + + Læderstøvler - - Grundfjeldståge + + Jernstøvler - - Vis display + + Læderbukser - - Vis hånd + + Jernbukser - - Beskeder ved dødsfald + + Diamantbukser - - Animerede figurer + + Læderhætte - - Tilpassede skinanimationer + + Lugejern af sten - - Du kan ikke længere udvinde eller bruge genstande + + Lugejern af jern - - Nu kan du udvinde og bruge genstande + + Diamantlugejern - - Du kan ikke længere placere blokke + + Diamantøkse - - Nu kan du placere blokke + + Guldøkse - - Nu kan du bruge døre og kontakter + + Lugejern af træ - - Du kan ikke længere bruge døre og kontakter + + Guldlugejern - - Nu kan du bruge beholdere (fx kister) + + Ringbrynje - - Du kan ikke længere bruge beholdere (fx kister) + + Ringbukser - - Du kan ikke længere angribe væsner + + Ringstøvler - - Nu kan du angribe væsner + + Trædør - - Du kan ikke længere angribe andre spillere + + Jerndør - - Nu kan du angribe andre spillere + + Ringhjelm - - Du kan ikke længere angribe dyr + + Diamantstøvler - - Nu kan du angribe dyr + + Fjer - - Nu er du en moderator + + Krudt - - Du er ikke længere en moderator + + Hvedefrø - - Nu kan du flyve + + Skål - - Du kan ikke længere flyve + + Svampestuvning - - Du vil ikke længere blive udmattet + + Snor - - Nu bliver du udmattet + + Hvede - - Nu er du en usynlig + + Stegt kotelet - - Du er ikke længere usynlig + + Maleri - - Nu er du usårlig + + Guldæble - - Du er ikke længere usårlig + + Brød - - %d MSP + + Flint - - Mørkedrage + + Rå kotelet - - %s er rejst til Mørket + + Pind - - %s har forladt Mørket + + Spand - - -{*C3*}Jeg kan se spilleren, du tænker på.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Ja. Pas på dig selv. Den har opnået et højere niveau nu. Den kan læse vores tanker.{*EF*}{*B*}{*B*} -{*C2*}Det er ligegyldigt. Den tror, at vi er en del af spillet.{*EF*}{*B*}{*B*} -{*C3*}Jeg kan godt lide denne spiller. Spillede godt. Gav ikke op.{*EF*}{*B*}{*B*} -{*C2*}Den læser vores tanker, som var de blot ord på en skærm.{*EF*}{*B*}{*B*} -{*C3*}Det er sådan, den forestiller sig mange ting, når den befinder sig dybt i spillets drøm.{*EF*}{*B*}{*B*} -{*C2*}Ord er et vidunderligt interface. Meget fleksible. Og langt mindre skræmmende at stirre på end virkeligheden bag skærmen.{*EF*}{*B*}{*B*} -{*C3*}Før hørte de stemmer. Inden spillerne kunne læse. Det var dengang, hvor de, der ikke spillede, kaldte spillerne for hekse og troldkarle. Og spillerne drømte, at de fløj gennem luften på pinde ved hjælp af dæmonernes kraft.{*EF*}{*B*}{*B*} -{*C2*}Hvad drømte denne spiller om?{*EF*}{*B*}{*B*} -{*C3*}Denne spiller drømte om solskin og træer. Om ild og vand. Den drømte, at den skabte. Og den drømte, at den ødelagde. Den drømte, at den jagede, og den drømte, at den blev jaget. Den drømte om ly.{*EF*}{*B*}{*B*} -{*C2*}Ha, den oprindelige brugerflade. En million år på bagen og det virker stadig. Men hvilken struktur skabte denne spiller mon i virkeligheden bag skærmen?{*EF*}{*B*}{*B*} -{*C3*}Den arbejdede sammen med millioner af andre spillere for at forme en sand verden i folden på {*EF*}{*NOISE*}{*C3*}, og den skabte en {*EF*}{*NOISE*}{*C3*} til {*EF*}{*NOISE*}{*C3*} i {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} -{*C2*}Den tanke kan den ikke læse.{*EF*}{*B*}{*B*} -{*C3*}Nej. Den har endnu ikke opnået det højeste niveau. Det skal den opnå i den lange drøm om livet, ikke i den korte drøm om spillet.{*EF*}{*B*}{*B*} -{*C2*}Ved den, at vi elsker den? At universet er den venligt stemt?{*EF*}{*B*}{*B*} -{*C3*}Engang i mellem hører den universet gennem sine tankers støj.{*EF*}{*B*}{*B*} -{*C2*}Men andre gange bliver den trist i den lange drøm. Den skaber verdener uden somre, og den ryster i kulden under den mørke sol. Den forveksler sit triste skaberværk med virkeligheden.{*EF*}{*B*}{*B*} -{*C3*}Men det ville ødelægge den at blive befriet fra sin sørgmodighed. Sørgmodigheden er en del af dens private opgave. Vi må ikke blande os.{*EF*}{*B*}{*B*} -{*C2*}Når de ligger i den dybeste søvn, har jeg lyst til at fortælle dem, at de bygger ægte verdener i virkeligheden. Jeg har lyst til at fortælle dem om deres betydning for universet. Når de ikke har haft ægte kontakt i lang tid, får jeg lyst til at hjælpe dem med at sige det ord, de frygter.{*EF*}{*B*}{*B*} -{*C3*}Den læser vores tanker.{*EF*}{*B*}{*B*} -{*C2*}Nogle gange er jeg ligeglad. Nogle gange har jeg lyst til at fortælle dem, at den verden, som de tror er ægte, i virkeligheden er {*EF*}{*NOISE*}{*C2*} og {*EF*}{*NOISE*}{*C2*}. Jeg har lyst til at fortælle dem, at {*EF*}{*NOISE*}{*C2*} i {*EF*}{*NOISE*}{*C2*}. De ser så lidt af virkeligheden i deres lange drøm.{*EF*}{*B*}{*B*} -{*C3*}Og alligevel spiller de spillet.{*EF*}{*B*}{*B*} -{*C2*}Men det ville være så let at fortælle dem ...{*EF*}{*B*}{*B*} -{*C3*}For stærk til denne drøm. Hvis du fortæller dem, hvordan de skal leve, forhindrer du dem samtidig i at gøre det.{*EF*}{*B*}{*B*} -{*C2*}Jeg vil ikke fortælle spilleren, hvordan den skal leve.{*EF*}{*B*}{*B*} -{*C3*}Spilleren er rastløs.{*EF*}{*B*}{*B*} -{*C2*}Jeg vil fortælle spilleren en historie.{*EF*}{*B*}{*B*} -{*C3*}Men ikke sandheden.{*EF*}{*B*}{*B*} -{*C2*}Nej. En historie, der indeholder sandheden på en sikker måde. I et bur af ord. Ikke den skinbarlige sandhed, der brænder sig fast på en hvilken som helst afstand.{*EF*}{*B*}{*B*} -{*C3*}Giv den en krop igen.{*EF*}{*B*}{*B*} -{*C2*}Ja. Spiller ... {*EF*}{*B*}{*B*} -{*C3*}Brug dens navn.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Spiller af spil.{*EF*}{*B*}{*B*} -{*C3*}Godt.{*EF*}{*B*}{*B*} - + + Vandspand - - -{*C2*}Tag en dyb indånding nu. Tag en mere. Mærk luften i dine lunger. Lad dine lemmer komme tilbage. Ja, bevæg dine fingre. Få en krop igen. Mærk tyngdekraften, mærk luften. Lad dig gendanne i den lange drøm. Der er du. Hele din krop er nu atter i kontakt med universet, som om I var to forskellige ting. Som om vi var forskellige ting.{*EF*}{*B*}{*B*} -{*C3*}Hvem er vi? En gang blev vi kaldt bjergets ånd. Fader sol, moder måne. Forfædrenes ånder, dyrenes ånder. Flaskeånder. Spøgelser. Denne grønne mand. Dernæst guder og dæmoner. Engle. Poltergejster. Rumvæsner, fremmede. Leptoner, kvarker. Ordene forandrer sig. Vi forandrer os ikke.{*EF*}{*B*}{*B*} -{*C2*}Vi er universet. Vi er alt det, som du tror ikke er dig. Du kigger på os nu gennem din hud og dine øjne. Hvorfor rører universet ved din hud og kaster lys på dig? For at se dig, spiller. For at lære dig at kende. Og for at give sig selv til kende. Jeg vil fortælle dig en historie.{*EF*}{*B*}{*B*} -{*C2*}Der var engang en spiller.{*EF*}{*B*}{*B*} -{*C3*}Du var den spiller, {*PLAYER*}.{*EF*}{*B*}{*B*} -{*C2*}Engang i mellem betragtede den sig selv som et menneske placeret på den tynde overflade af en snurrende kugle fyldt med rødglødende stenmasser. Kuglen af rødglødende sten kredsede omkring en gigantisk klump af gas og ild, der var 330.000 gange større end den selv. De var så langt fra hinanden, at det tog lyset otte minutter at tilbagelægge afstanden mellem dem. Lyset var information fra en stjerne, og det kunne forbrænde din hud på 150.000.000 kilometers afstand.{*EF*}{*B*}{*B*} -{*C2*}Nogle gange drømte spilleren, at den var en minearbejder på overfladen af en verden, der var flad og uendelig. Solen var en hvid firkant. Dagene var korte. Der var meget, der skulle gøres, og døden en midlertidig ulejlighed.{*EF*}{*B*}{*B*} -{*C3*}Nogle gange drømte spilleren, at den var fortabt i en historie.{*EF*}{*B*}{*B*} -{*C2*}Nogle gange drømte spilleren, at den var noget andet et helt andet sted. Nogle gange var drømmene foruroligende. Nogle gange var de smukke. Nogle gange vågnede spilleren fra en drøm op i en anden for derefter at vågne i en tredje.{*EF*}{*B*}{*B*} -{*C3*}Nogle gange drømte spilleren, at den så ord på skærmen.{*EF*}{*B*}{*B*} -{*C2*}Lad os gå tilbage.{*EF*}{*B*}{*B*} -{*C2*}Spillerens atomer blev spredt i græsset, i floderne, i luften og i jorden. En kvinde samlede atomerne sammen. Hun drak, spiste og indhalerede dem og samlede spilleren i sin krop.{*EF*}{*B*}{*B*} -{*C2*}Og spilleren vågnede i den lange drøm fra det mørke varme i moderens krop.{*EF*}{*B*}{*B*} -{*C2*}Og spilleren var en ny fortælling, der aldrig var blevet fortalt før, skrevet med DNA'ens bogstaver. Og spilleren var et nyt program, der aldrig var blevet afviklet før, skabt af en kildekode, der var en milliard år gammel. Og spilleren var et nyt menneske, der aldrig havde levet før, skabt udelukkende af mælk og kærlighed.{*EF*}{*B*}{*B*} -{*C3*}Du er spilleren. Historien. Programmet. Mennesket. Skabt af mælk og kærlighed.{*EF*}{*B*}{*B*} -{*C2*}Lad os gå endnu længere tilbage.{*EF*}{*B*}{*B*} -{*C2*}De syv milliarder af milliarder atomer i spillerens krop blev skabt i hjertet af en stjerne længe inden spillet. Spilleren er dermed også information fra en stjerne. Og spilleren bevæger sig gennem en historie, der er en skov af informationer, som er blevet plantet af en mand ved navn Julian, i en flad uendelig verden, skabt af en anden mand ved navn Markus, som eksisterer i en lille privat verden, der er skabt af spilleren, som lever i et univers skabt af ...{*EF*}{*B*}{*B*} -{*C3*}Stille. Nogle gange skabte spilleren en lille privat verden, der var blød, varm og enkel. Andre gange var den hård, kold og kompliceret. Nogle gange byggede den en model af universet i sit hoved. Stumper af energi, der bevæger sig igennem det uendelige rum. Nogle gange kaldte den stumperne for "elektroner" og "protoner".{*EF*}{*B*}{*B*} - + + Lavaspand - - -{*C2*}Andre gange kaldte den dem for "planeter" og "stjerner".{*EF*}{*B*}{*B*} -{*C2*}Nogle gange troede den, at den var i et univers, der var lavet af energi, der bestod af stadierne tændt og slukket. Nuller og ettaller. Linjer af programkode. Nogle gange troede den, at den spillede et spil. Andre gange troede den, at den læste ordene på en skærm.{*EF*}{*B*}{*B*} -{*C3*}Du er spilleren, der læseren ordene ... {*EF*}{*B*}{*B*} -{*C2*}Stille ... Nogle gange læste spilleren linjer med programkode på en skærm. Afkodede dem, så de blev til ord. Afkodede ord, så de gav mening. Afkodede meningen, så den blev til følelser, teorier og idéer. Spilleren begyndte at trække vejret hurtigere og dybere og opdagede, at den var i live. Den var i live, og de tusinde dødsfald havde ikke været virkelige. Spilleren var i live{*EF*}{*B*}{*B*} -{*C3*}Dig. Dig. Du er i live.{*EF*}{*B*}{*B*} -{*C2*}og nogle gange troede spilleren, at universet havde talt til den gennem solskinnet, der brød gennem træernes kroner om sommeren{*EF*}{*B*}{*B*} -{*C3*}og nogle gange troede spilleren, at universet havde talt til den gennem lyset, der faldt fra den frostklare nattehimmel om vinteren, hvor lysglimtet i spillerens øjenkrog måske kunne være fra en stjerne, der var en million gange større end solen, og som havde forkullet alle planeterne omkring sig for at være synlig i dette korte øjeblik for spilleren, der var på vej hjem på den anden side af universet, og som pludselig kunne lugte mad uden for en velkendt dør, inden drømmen begyndte igen{*EF*}{*B*}{*B*} -{*C2*}og nogle gange troede spilleren, at universet havde talt til den gennem nuller og ettaller, gennem verdenens elektricitet, gennem de rullende ord på skærmen for enden af drømmen{*EF*}{*B*}{*B*} -{*C3*}og universet sagde, jeg elsker dig{*EF*}{*B*}{*B*} -{*C2*}og universet sagde, at du havde spillet godt{*EF*}{*B*}{*B*} -{*C3*}og universet sagde, at alt du behøver findes i dig{*EF*}{*B*}{*B*} -{*C2*}og universet sagde, at du er stærkere, end du tror{*EF*}{*B*}{*B*} -{*C3*}og universet sagde, at du er sollyset{*EF*}{*B*}{*B*} -{*C2*}og universet sagde, at du er natten{*EF*}{*B*}{*B*} -{*C3*}og universet sagde, at mørket, du bekæmper, findes i dig{*EF*}{*B*}{*B*} -{*C2*}og universet sagde, at lyset, du søger, findes i dig{*EF*}{*B*}{*B*} -{*C3*}og universet sagde, at du ikke er alene{*EF*}{*B*}{*B*} -{*C2*}og universet sagde, at du ikke er adskilt fra alt andet omkring dig{*EF*}{*B*}{*B*} -{*C3*}og universet sagde, at du er universet, der smager på sig selv, taler til sig selv, læser sin egen programkode{*EF*}{*B*}{*B*} -{*C2*}og universet sagde, jeg elsker dig, fordi du er kærlighed.{*EF*}{*B*}{*B*} -{*C3*}Og spillet var slut, og spilleren vågnede op fra drømmen. Og spilleren begyndte en ny drøm. Og spilleren drømte igen og drømte bedre. Og spilleren var universet. Og spilleren var kærlighed.{*EF*}{*B*}{*B*} -{*C3*}Du er spilleren.{*EF*}{*B*}{*B*} -{*C2*}Vågn op.{*EF*} - + + Guldstøvler - - Nulstil Afgrunden + + Jernbarre - - Er du sikker på, at du vil nulstille Afgrunden i dette gemte spil til sin standardtilstand? Du vil miste alt, du har bygget i Afgrunden. + + Guldbarre - - Nulstil Afgrunden + + Fyrtøj - - Lad være med at nulstille Afgrunden + + Kul - - Du kan ikke klippe denne muhsvamp i øjeblikket. Det maksimale antal af grise, får, køer og katte er nået. + + Trækul - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af grise, får, køer og katte er nået. + + Diamant - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af muhsvampe er nået. + + Æble - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af ulve i verdenen er nået. + + Bue - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af høns i verdenen er nået. + + Pil - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af blæksprutter i verdenen er nået. + + Musikplade – "ward" - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af fjender i verdenen er nået. + + + Tryk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at skifte til den gruppe af genstande, du ønsker at fremstille noget fra. Vælg gruppen med strukturer.{*ToolsIcon*} + - - Du kan ikke fremkalde æg i øjeblikket. Det maksimale antal af landsbyboere i verdenen er nået. + + + Tryk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at skifte til den gruppe af genstande, du ønsker at fremstille noget fra. Vælg gruppen med redskaber.{*ToolsIcon*} + - - Det maksimale antal af malerier/rammer i verdenen er nået. + + + Nu skal du placere dit arbejdsbord, så du kan få adgang til et større udvalg af genstande.{*B*} + Tryk på {*CONTROLLER_VK_B*} for at lukke fremstillingsskærmen. + - - Du kan ikke fremkalde fjender i spiltypen Fredfyldt. + + + Med de redskaber, du har bygget, er du kommet godt fra start, og du kan nu indsamle en masse forskellige materialer mere effektivt.{*B*} + Tryk på {*CONTROLLER_VK_B*} for at lukke fremstillingsskærmen. + - - Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede grise, får, køer og katte er nået. + + " + Mange fremstillingsprocesser indeholder flere trin. Nu hvor du har nogle planker, er der flere genstande, som du kan lave. Skift til genstanden, du vil fremstille, med {*CONTROLLER_MENU_NAVIGATE*}. Vælg arbejdsbordet.{*CraftingTableIcon*} + " + - - Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede ulve er nået. + + " + Skift til genstanden, du vil fremstille, med {*CONTROLLER_MENU_NAVIGATE*}. Der findes flere versioner af nogle genstande, afhængigt af materialerne du anvender. Vælg træskovlen.{*WoodenShovelIcon*} + " + - - Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede høns er nået. + + Du kan lave planker ud af det træ, du finder. Vælg plankeikonet, og tryk på {*CONTROLLER_VK_A*} for at lave dem.{*PlanksIcon*} - - Dette dyr kan ikke blive elskovssygt. Det maksimale antal af avlede muhsvampe er nået. + + + Du kan fremstille mange flere genstande på et arbejdsbord. Det foregår på samme måde, som når du fremstiller genstande i hånden, men da du har et større fremstillingsområde, kan du kombinere flere ingredienser. + - - Det maksimale antal af både i verdenen er nået. + + + I fremstillingsområdet kan du se de genstande, du skal bruge for at fremstille en ny genstand. Tryk på {*CONTROLLER_VK_A*} for at fremstille genstanden og placere den i dit lager. + - - Det maksimale antal af hoveder i verdenen er nået. + + + Du kan bladre mellem fanerne Grupper øverst på skærmen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at vælge den gruppe af genstande, som du vil fremstille noget fra. Vælg genstanden, du vil fremstille, med {*CONTROLLER_MENU_NAVIGATE*}. + - - Vend kamera + + + Listen over de nødvendige ingredienser bliver vist. + - - Venstrehåndet + + + Beskrivelsen af den valgte genstand bliver vist. Den hjælper dig med at finde ud af, hvad genstanden kan bruges til. + - - Du døde! + + + Den nederste højre del af fremstillingsskærmen viser dit lager. I dette område kan du også læse en beskrivelse af den valgte genstand, og se hvilke ingredienser der skal bruges for at fremstille den. + - - Gendan + + + Visse genstande kan ikke fremstilles på arbejdsbordet. Her skal du bruge en ovn. Byg en ovn.{*FurnaceIcon*} + - - Tilbud på indhold, der kan hentes + + Grus - - Skift overflade + + Guldmalm - - Sådan spiller du + + Jernmalm - - Styring + + Lava - - Indstillinger + + Sand - - Folkene bag + + Sandsten - - Geninstallér indhold + + Kulmalm - - Gendan indstillinger + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du bruger din ovn. + - - Ilden spreder sig + + + Dette er ovnskærmen. En ovn giver dig mulighed for at bearbejde materialerne ved hjælp af ild. Du kan eksempelvis smelte jernmalm om til jernbarrer i en ovn. + - - TNT eksploderer + + + Stil ovnen, du har bygget, et sted i omgivelserne. Det vil være end god ide at stille den inde i dit tilflugtssted.{*B*} + Tryk på {*CONTROLLER_VK_B*} for at lukke fremstillingsskærmen. + - - Spiller mod spiller + + Træ - - Stol på spillere + + Bøgetræ - - Værtsprivilegier + + + Du skal placere brændsel i ovnens nederste felt og genstanden, der skal bearbejdes, i det øverste. Derefter tændes ovnen og går i gang med at bearbejde materialet. Resultatet dukker op i feltet til højre. + - - Opret strukturer + + {*B*} + Tryk på {*CONTROLLER_VK_X*} for at se lageret igen. + - - Helt flad verden + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du bruger dit lager. + - - Bonuskiste + + + Dette er dit lager. Det viser alle de genstande, du kan bruge, og alle de genstande, du bærer rundt på. Du kan også se din rustning. + - - Verdensindstillinger + + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at fortsætte introduktionen.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du mener, at du er klar til at spille på egen hånd. + - - Kan bygge og udvinde materialer + + + Hvis du flytter markøren uden for kanten af skærmen, kan du smide en genstand. + - - Kan bruge døre og kontakter + + Du kan flytte genstanden til et andet felt i lageret ved at flytte markøren til den nye plads og trykke på {*CONTROLLER_VK_A*}. + Når du har mange genstande på markøren, kan du placere dem alle med {*CONTROLLER_VK_A*} eller nøjes med at placere en med {*CONTROLLER_VK_X*}. - - Kan åbne beholdere + + + Flyt markøren med {*CONTROLLER_MENU_NAVIGATE*}. Brug {*CONTROLLER_VK_A*} for at samle en genstand op under markøren. + Hvis der er mere end en genstand, samler du dem alle sammen op, eller du kan bruge {*CONTROLLER_VK_X*} for kun at samle halvdelen op. + - - Kan angribe spillere + + + Du har gennemført den første del af introduktionen. + - - Kan angribe dyr + + Lav glas i ovnen. Mens du venter på, at det bliver færdigt, kan du samle flere materialer til dit tilflugtssted. - - Moderator + + Lav kul i ovnen. Mens du venter på, at det bliver færdigt, kan du samle flere materialer til dit tilflugtssted. - - Smid spiller ud + + Placér ovnen i verden med {*CONTROLLER_ACTION_USE*}, og åbn den. - - Kan flyve + + Om natten bliver det meget mørkt, så du får brug for noget lys inde i dit tilflugtssted. Lav en fakkel med pinde og kul fra fremstillingsskærmen.{*TorchIcon*} - - Slå udmattelse fra + + Placér døren med {*CONTROLLER_ACTION_USE*}. Du kan åbne og lukke en trædør ved hjælp af {*CONTROLLER_ACTION_USE*}. - - Usynlig + + Et godt tilflugtssted skal have en dør, så du nemt kan komme ind og ud uden at behøve at hakke væggen i stykker og bygge den op igen. Lav en trædør.{*WoodenDoorIcon*} - - Indstillinger for vært + + + Hvis du vil have flere oplysninger om en genstand, skal du flytte markøren hen over genstanden og trykke på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Spillere/invitér + + + Dette er fremstillingsskærmen. Her kan du fremstille nye genstande ved at kombinere de genstande, du har samlet sammen. + - - Onlinespil + + + Tryk på {*CONTROLLER_VK_B*} for at lukke lageret i Kreativ. + - - Kun for inviterede + + + Hvis du vil have flere oplysninger om en genstand, skal du flytte markøren hen over genstanden og trykke på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Flere indstillinger + + {*B*} + Tryk på {*CONTROLLER_VK_X*} for at se de ingredienser, der skal bruges for at lave denne genstand. + - - Indlæs + + {*B*} + Tryk på {*CONTROLLER_VK_X*} for at se beskrivelsen af genstanden. + - - Ny verden + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du fremstiller genstande og bearbejder materiale. + - - Navn på verden + + + Du kan bladre mellem fanerne Grupper øverst på skærmen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for at vælge den gruppe af genstande, som du vil samle op. + - - Seed til verdensgeneratoren + + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at fortsætte.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede ved, hvordan du bruger dit lager i Kreativ. + - - Lad stå tom for tilfældigt seed + + + Dette er lageret i Kreativ. Det viser alle de genstande, du kan bruge lige nu, og alle de andre genstande du kan vælge mellem. + - - Spillere + + + Tryk på {*CONTROLLER_VK_B*} for at lukke lageret. + - - Tilslut spil + + + Hvis du flytter en genstand uden for kanten af skærmen, kan du smide genstanden i omgivelserne. Tryk på {*CONTROLLER_VK_X*} for at fjerne alle genstande i genvejsbjælken. + - - Start spil + + + Markøren rykker automatisk til næste felt i rækken af redskaber. Du kan placere den med {*CONTROLLER_VK_A*}. Når du har placeret genstanden, vender markøren tilbage til listen, hvor du kan vælge den næste genstand. + - - Fandt ingen spil + + + Flyt markøren med {*CONTROLLER_MENU_NAVIGATE*}. + Brug {*CONTROLLER_VK_A*} for at vælge genstanden under markøren i genstandslisten, og brug {*CONTROLLER_VK_Y*} for at samle en hel stak op af den pågældende genstand. + - - Spil + + Vand - - Ranglister + + Glasflaske - - Hjælp og indstillinger + + Vandflaske - - Oplås det fulde spil + + Edderkoppeøje - - Genoptag spil + + Guldklump - - Gem spil + + Afgrundsurt - - Sværhedsgrad: + + {*splash*}{*prefix*}Eliksir {*postfix*} - - Spiltype: + + Gæret edderkoppeøje - - Strukturer: + + Gryde - - Banetype: + + Mørkeøje - - PvP: + + Glimmermelon - - Stol på spillere: + + Pulver fra flammeånd - - TNT: + + Magmacreme - - Ilden spreder sig: + + Bryggestativ - - Geninstallér tema + + Gyslingetåre - - Geninstallér spillerbillede 1 + + Græskarfrø - - Geninstallér spillerbillede 2 + + Melonfrø - - Geninstallér avatargenstand 1 + + Rå kylling - - Geninstallér avatargenstand 2 + + Musikplade – "11" - - Geninstallér avatargenstand 3 + + Musikplade – "where are we now?" - - Indstillinger + + Saks - - Lyd + + Stegt kylling - - Følsomhed + + Mørkeperle - - Grafik + + Melonskive - - Brugerdisplay + + Flammestav - - Gendan standardindstillinger + + Råt kød - - Vis gangbevægelse + + Steak - - Tip + + Rådden fisk - - Redskabstips i spillet + + Erfaringseliksir - - Lodret delt skærm for to spillere + + Planker af bøgetræ - - Afslut + + Planker af grantræ - - Redigér besked på skilt: + + Planker af birketræ - - Indtast oplysningerne til dit billede + + Græsblok - - Overskrift + + Jord - - Billede fra spillet + + Brosten - - Redigér besked på skilt: + + Planker af jungletræ - - Klassiske teksturer, ikoner og brugerdisplay fra Minecraft! + + Stikling fra birketræ - - Vis alle mash-up-verdener + + Stikling fra jungletræ - - Ingen effekter + + Grundfjeld - - Fart + + Stikling - - Langsomhed + + Stikling fra bøgetræ - - Hast + + Stikling fra grantræ - - Minetræthed + + Sten - - Styrke + + Ramme - - Svaghed + + Fremkald {*CREATURE*} - - Øjeblikkelig energi + + Afgrundsmursten - - Øjeblikkelig skade + + Ildladning - - Hoppeboost + + Ildladning (trækul) - - Kvalme + + Ildladning (kul) - - Regenerering + + Kranium - - Modstand + + Hoved - - Ildmodstand + + Hoved fra %s - - Vandvejrtrækning + + Snigerhoved - - Usynlighed + + Kranium fra skelet - - Blindhed + + Kranium fra visneskelet - - Nattesyn + + Zombiehoved - - Sult + + En kompakt måde at opbevare kul på. Kan bruges som brændstof i en ovn. Gift - - af hurtighed + + Sult af langsomhed - - af hast + + af hurtighed - - af sløvhed + + Usynlighed - - af styrke + + Vandvejrtrækning - - af svaghed + + Nattesyn - - af energi + + Blindhed af skade - - af spring + + af energi af kvalme @@ -5180,29 +6089,38 @@ Vil du installere mash-up-pakken eller teksturpakken nu? af regenerering - - af modstand + + af sløvhed - - af ildmodstand + + af hast - - af vandvejrtrækning + + af svaghed + + + af styrke + + + Ildmodstand - - af usynlighed + + Mætning - - af blindhed + + af modstand - - af nattesyn + + af spring - - af sult + + Wither - - af gift + + Helbredsbonus + + + Absorbering @@ -5213,29 +6131,41 @@ Vil du installere mash-up-pakken eller teksturpakken nu? III + + af usynlighed + IV - - Plask + + af vandvejrtrækning - - Banal + + af ildmodstand - - Uinteressant + + af nattesyn - - Kedelig + + af gift - - Klar + + af sult - - Mælket + + med absorbering - - Diffus + + med mætning + + + med helbredsbonus + + + af blindhed + + + med fordærv Kunstløs @@ -5243,17 +6173,17 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Tynd - - Akavet + + Diffus - - Flad + + Klar - - Pladskrævende + + Mælket - - Klodset + + Akavet Smørret @@ -5261,246 +6191,300 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Jævn - - Glat + + Klodset - - Rar + + Flad - - Tyk + + Pladskrævende - - Elegant + + Kedelig - - Fancy + + Plask - - Charmerende + + Banal + + + Uinteressant Flot - - Raffineret - Hjertelig + + Charmerende + + + Elegant + + + Fancy + Mousserende + + Rang + + + Harsk + + + Lugtfri + Potent Fæl - - Lugtfri + + Glat - - Rang + + Raffineret - - Harsk + + Tyk - - Stikkende + + Rar - - Klam + + Gendanner energi med tiden for spillere, dyr og monstre, som eliksiren bruges på. - - Stinkende + + Reducerer øjeblikkeligt energien for spillere, dyr og monstre, som eliksiren bruges på. - - Bruges som grundingrediens i alle eliksirer. Bruges i et bryggestativ for at brygge eliksirer. + + Gør spillere, dyr og monstre, som eliksiren bruges på, usårlige over for angreb på afstand med ild, lava og fra flammeånder. Har ingen effekt, men kan tilsættes flere ingredienser i et bryggestativ for at lave eliksirer. - - Forøger bevægelseshastigheden for spillere, dyr og monstre, som eliksiren bruges på, samt spillerens spurtehastighed, hoppelængde og synsfelt. + + Stikkende Reducerer bevægelseshastigheden for spillere, dyr og monstre, som eliksiren bruges på, samt spillerens spurtehastighed, hoppelængde og synsfelt. + + Forøger bevægelseshastigheden for spillere, dyr og monstre, som eliksiren bruges på, samt spillerens spurtehastighed, hoppelængde og synsfelt. + Forøger angrebsskaden, der forårsages af spillere og monstre, som eliksiren bruges på. + + Forøger øjeblikkeligt energien for spillere, dyr og monstre, som eliksiren bruges på. + Reducerer angrebsskaden, der forårsages af spillere og monstre, som eliksiren bruges på. - - Forøger øjeblikkeligt energien for spillere, dyr og monstre, som eliksiren bruges på. + + Bruges som grundingrediens i alle eliksirer. Bruges i et bryggestativ for at brygge eliksirer. - - Reducerer øjeblikkeligt energien for spillere, dyr og monstre, som eliksiren bruges på. + + Klam - - Gendanner energi med tiden for spillere, dyr og monstre, som eliksiren bruges på. + + Stinkende - - Gør spillere, dyr og monstre, som eliksiren bruges på, usårlige over for angreb på afstand med ild, lava og fra flammeånder. + + Fordriv + + + Skarphed Reducerer energi med tiden for spillere, dyr og monstre, som eliksiren bruges på. - - Skarphed + + Angrebsskade - - Fordriv + + Tilbageslag Leddyrenes banemand - - Tilbageslag + + Fart - - Ildaspekt + + Zombieforstærkninger - - Beskyttelse + + Hestehopstyrke + + + Ved brug: + + + Modstandskraft mod at blive slået tilbage + + + Væsners forfølgelsesradius + + + Maksimalt helbred + + + Silkeberøring + + + Effektivitet + + + Vandtilpasset + + + Held + + + Plyndring + + + Ubrydelig Beskyttelse mod ild + + Beskyttelse + + + Ildaspekt + Fjerfald - - Beskyttelse mod eksplosioner + + Respiration Beskyttelse mod projektiler - - Respiration - - - Vandtilpasset + + Beskyttelse mod eksplosioner - - Effektivitet + + IV - - Silkeberøring + + V - - Ubrydelig + + VI - - Plyndring + + Slag - - Held + + VII - - Kraft + + III Flamme - - Slag + + Kraft Uendelighed - - I - - - II - - - III + + II - - IV + + I - - V + + Aktiveres, når noget passerer gennem en forbundet snubletråd. - - VI + + Aktiverer en forbundet snubletrådskrog, når noget passerer gennem den. - - VII + + En kompakt måde at opbevare smaragder på. - - VIII + + Ligner en almindelig kiste, men alle genstande, der placeres i en mørkekiste, er tilgængelige i alle spillerens mørkekister selv i andre dimension. IX - - X + + VIII Indeholder smaragder, der kan udvindes med en hakke af jern eller kraftigere materiale. - - Ligner en almindelig kiste, men alle genstande, der placeres i en mørkekiste, er tilgængelige i alle spillerens mørkekister selv i andre dimension. - - - Aktiveres, når noget passerer gennem en forbundet snubletråd. + + X - - Aktiverer en forbundet snubletrådskrog, når noget passerer gennem den. + + Gendanner 2 {*ICON_SHANK_01*} og kan bruges til at fremstille en guldgulerod med. Kan plantes på opdyrket jord. - - En kompakt måde at opbevare smaragder på. + + Bruges som en dekoration. Der kan plantes blomster, stiklinger, kaktusser og svampe i den. En væg af brosten. - - Kan bruges til at reparere våben, redskaber og rustninger med. + + Gendanner 0,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Kan plantes på opdyrket jord. Smeltes i en ovn for at udvinde afgrundskvarts. - - Bruges som en dekoration. + + Kan bruges til at reparere våben, redskaber og rustninger med. Kan handles med landsbyboere. - - Bruges som en dekoration. Der kan plantes blomster, stiklinger, kaktusser og svampe i den. + + Bruges som en dekoration. - - Gendanner 2 {*ICON_SHANK_01*} og kan bruges til at fremstille en guldgulerod med. Kan plantes på opdyrket jord. + + Gendanner 4 {*ICON_SHANK_01*}. - - Gendanner 0,5 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Kan plantes på opdyrket jord. + + Gendanner 1 {*ICON_SHANK_01*}. Indtagelse kan forgifte dig. + + + Bruges til at styre en sadlet gris med, når du ridder på den. Gendanner 3 {*ICON_SHANK_01*}. Fremstillet ved at tilberede en kartoffel i en ovn. - - Gendanner 1 {*ICON_SHANK_01*} eller kan tilberedes i en ovn. Kan plantes på opdyrket jord. Indtagelse kan forgifte dig. - Gendanner 3 {*ICON_SHANK_01*}. Fremstillet af en gulerod og guldklumper. - - Bruges til at styre en sadlet gris med, når du ridder på den. - - - Gendanner 4 {*ICON_SHANK_01*}. - Bruges med en ambolt for at fortrylle våben, redskaber og rustninger. Laves ved at smelte afgrundskvartsmalm. Kan laves til en blok af afgrundskvarts. + + Kartoffel + + + Bagt kartoffel + + + Gulerod + Laves af uld. Bruges som en dekoration. @@ -5510,14 +6494,11 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Blomsterkrukke - - Gulerod - - - Kartoffel + + Græskartærte - - Bagt kartoffel + + Fortryllet bog Giftig kartoffel @@ -5528,11 +6509,11 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Gulerod på en fiskestang - - Græskartærte + + Snubletrådskrog - - Fortryllet bog + + Snubletråd Afgrundskvarts @@ -5543,11 +6524,8 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Mørkekiste - - Snubletrådskrog - - - Snubletråd + + Mosbeklædt mur af brosten Blok af smaragd @@ -5555,8 +6533,8 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Mur af brosten - - Mosbeklædt mur af brosten + + Kartofler Blomsterkrukke @@ -5564,8 +6542,8 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Gulerødder - - Kartofler + + Lettere beskadiget ambolt Ambolt @@ -5573,8 +6551,8 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Ambolt - - Lettere beskadiget ambolt + + Blok af kvarts Svært beskadiget ambolt @@ -5582,8 +6560,8 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Afgrundskvartsmalm - - Blok af kvarts + + Trappe af kvarts Tilhugget blok af kvarts @@ -5591,8 +6569,8 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Søjle af kvarts - - Trappe af kvarts + + Rødt tæppe Tæppe @@ -5600,8 +6578,8 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Sort tæppe - - Rødt tæppe + + Blåt tæppe Grønt tæppe @@ -5609,9 +6587,6 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Brunt tæppe - - Blåt tæppe - Lilla tæppe @@ -5624,18 +6599,18 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Gråt tæppe - - Lyserødt tæppe - Limegrønt tæppe - - Gult tæppe + + Lyserødt tæppe Lyseblåt tæppe + + Gult tæppe + Magentafarvet tæppe @@ -5648,72 +6623,77 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Tilhugget sandsten - - Glat sandsten - {*PLAYER*} blev dræbt i forsøget på at såre {*SOURCE*} + + Glat sandsten + {*PLAYER*} blev mast af en ambolt. {*PLAYER*} blev mast af en blok. - - Teleporterede {*PLAYER*} til {*DESTINATION*} - {*PLAYER*} teleporterede dig hen til vedkommendes position - - {*PLAYER*} teleporterede dig + + Teleporterede {*PLAYER*} til {*DESTINATION*} Torne - - Flise af kvarts + + {*PLAYER*} teleporterede dig Skaber dagslys på mørke steder selv under vand. + + Flise af kvarts + Gør spillere, dyr og monstre usynlige, som eliksiren bruges på. Reparér og navngiv + + For dyr + Omkostninger for fortryllelse: %d - - For dyr + + Du har: Omdøb - - Du har: + + {*VILLAGER_TYPE*} tilbyder %s Påkrævet for handel - - {*VILLAGER_TYPE*} tilbyder %s + + Handel Reparation - - Handel + + + Dette er amboltskærmen. Her kan du omdøbe, reparere og fortrylle våben, rustninger eller redskaber ved at betale med erfarings niveauer. + Farv krave - + - Dette er amboltskærmen. Her kan du omdøbe, reparere og fortrylle våben, rustninger eller redskaber ved at betale med erfarings niveauer. + Hvis du vil arbejde med en genstand, skal du placere den i det første inputfelt. @@ -5723,9 +6703,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til amboltskærmen. - + - Hvis du vil arbejde med en genstand, skal du placere den i det første inputfelt. + Eller du kan placere endnu en genstand, der er magen til den, som du allerede har placeret i det andet felt, for at kombinere de to genstande. @@ -5733,9 +6713,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Når du placerer et passende råmateriale i det andet inputfelt (fx jernbarrer til et beskadiget jernsværd), bliver den anbefalede reparation vist i resultatfeltet. - + - Eller du kan placere endnu en genstand, der er magen til den, som du allerede har placeret i det andet felt, for at kombinere de to genstande. + Omkostningerne for arbejdet bliver vist i erfaringsniveauer under resultatet. Hvis dit erfaringsniveau ikke er højt nok, vil knappen være deaktiveret. @@ -5743,9 +6723,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Hvis du vil fortrylle genstande på ambolten, skal du placere en fortryllet bog i det andet inputfelt. - + - Omkostningerne for arbejdet bliver vist i erfaringsniveauer under resultatet. Hvis dit erfaringsniveau ikke er højt nok, vil knappen være deaktiveret. + Når du fjerner den reparerede genstand, bliver begge ingredienser brugt af ambolten, og dit erfaringsniveau bliver fratrukket omkostningerne for arbejdet. @@ -5753,9 +6733,11 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Det er muligt at omdøbe genstanden ved at redigere navnet i tekstboksen. - + - Når du fjerner den reparerede genstand, bliver begge ingredienser brugt af ambolten, og dit erfaringsniveau bliver fratrukket omkostningerne for arbejdet. + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om ambolten.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til ambolten. @@ -5763,11 +6745,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? I dette område finder du en ambolt og en kiste, der indeholder en kiste med redskaber og våben, som du kan arbejde med. - + - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om ambolten.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til ambolten. + Du kan finde fortryllede bøger i kister i fangekældre, eller du kan fortrylle en normal bog på et fortryllelsesbord. @@ -5775,9 +6755,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Med en ambolt kan du reparere våben og redskaber for at forstærke deres holdbarhed, omdøbe dem eller fortrylle dem med fortryllede bøger. - + - Du kan finde fortryllede bøger i kister i fangekældre, eller du kan fortrylle en normal bog på et fortryllelsesbord. + Reparationsomkostningerne bliver afgjort af arbejdets karakter, genstandens værdi, antallet af fortryllelser samt antallet af forbedringer, der er foretaget tidligere. @@ -5785,9 +6765,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Det koster erfaringsniveauer at bruge ambolten, og der er en risiko for, at du beskadiger ambolten. - + - Reparationsomkostningerne bliver afgjort af arbejdets karakter, genstandens værdi, antallet af fortryllelser samt antallet af forbedringer, der er foretaget tidligere. + I kisten i dette område finder du en beskadiget hakke, råmaterialer, en erfaringseliksir og fortryllelsesbøger, som du kan eksperimentere med. @@ -5795,9 +6775,11 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Når du omdøber en genstand, ændres navnet for alle spillere, og omkostningerne for tidligere arbejde reduceres. - + - I kisten i dette område finder du en beskadiget hakke, råmaterialer, en erfaringseliksir og fortryllelsesbøger, som du kan eksperimentere med. + {*B*} + Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om handelsskærmen.{*B*} + Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til handelsskærmen. @@ -5805,11 +6787,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Dette er handelsskærmen, der viser, hvilke handler du kan gøre med en landsbyboer. - + - {*B*} - Tryk på {*CONTROLLER_VK_A*} for at få mere at vide om handelsskærmen.{*B*} - Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til handelsskærmen. + Hvis du mangler de nødvendige genstande, vil handlerne være utilgængelige og vist med rød tekst. @@ -5817,9 +6797,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Alle handler, som landsbyboeren vil gå med til i øjeblikket, bliver vist øverst på skærmen. - + - Hvis du mangler de nødvendige genstande, vil handlerne være utilgængelige og vist med rød tekst. + I de to felter til venstre kan du se det samlede antal af genstande, der skal bruges for at gennemføre handlen. @@ -5827,9 +6807,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? De to felter til venstre viser mængden og typen af genstande, som du tilbyder landsbyboeren. - + - I de to felter til venstre kan du se det samlede antal af genstande, der skal bruges for at gennemføre handlen. + I dette område finder du en landsbyboer og en kiste, der indeholder papir, som du kan købe genstande for. @@ -5837,9 +6817,9 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Tryk på {*CONTROLLER_VK_A*} for at handle med de genstande, som landsbyboeren har bedt om, for de genstande, der bliver tilbudt. - + - I dette område finder du en landsbyboer og en kiste, der indeholder papir, som du kan købe genstande for. + Spillerne kan handle med genstande fra deres lager med landsbyboere. @@ -5848,19 +6828,14 @@ Vil du installere mash-up-pakken eller teksturpakken nu? Tryk på {*CONTROLLER_VK_B*}, hvis du allerede kender til handel. - + - Spillerne kan handle med genstande fra deres lager med landsbyboere. + Når du udfører forskellige handler, ændres de handler, som landsbyboeren vil gå med til. Handlerne, som en landsbyboer vil tilbyde, afhænger af vedkommendes profession. - - - - - Når du udfører forskellige handler, ændres de handler, som landsbyboeren vil gå med til. @@ -6022,7 +6997,4 @@ Alle mørkekister i verdenen er forbundet. Når du placerer genstande i mørkeki Kurér - - Finder seed til verdensgeneratoren - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsPlatformSpecific.xml index d760b314..b8b9f306 100644 --- a/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/da-DA/stringsPlatformSpecific.xml @@ -1,241 +1,243 @@  - - IKKE BRUGT + + Vil du logge ind på "PSN"? - - Du kan bruge berøringskærmen på PlayStation®Vita-systemet til at navigere i menuerne! + + Hvis du vælger denne valgmulighed for en spiller, der ikke deltager på samme PlayStation®Vita-system som værten, vil spilleren blive smidt ud af spillet sammen med andre spillere, der deltager på vedkommendes PlayStation®Vita-system. Spilleren vil ikke kunne genoprette forbindelsen til spillet, før det bliver genstartet. - - minecraftforum indeholder en særlig sektion for PlayStation®Vita Edition + + SELECT - - Du kan få de seneste nyheder om spillet fra @4JStudios og @Kappische på Twitter! + + Når funktionen er slået til, bliver trophies og ranglister i verdenen deaktiverede, mens du spiller, og det samme gælder, hvis du indlæser den igen efter at have gemt spillet, mens funktionen var slået til. - - Du må aldrig kigge direkte på en mørkemand! + + PlayStation®Vita-system - - Vi tror, at 4J Studios har fjernet Herobrine fra spillet til PlayStation®Vita-systemet, men vi er ikke sikre. + + Du kan vælge Ad hoc-netværk for at oprette forbindelse til andre PlayStation®Vita-systemer i nærheden, eller du kan vælge "PSN" for at oprette forbindelse til venner over hele verden. - - Minecraft: PlayStation®Vita Edition slog mange rekorder! + + Ad hoc-netværk - - {*T3*}SÅDAN SPILLER DU: MULTIPLAYER{*ETW*}{*B*}{*B*} -Minecraft til PlayStation®Vita-systemet er et multiplayerspil i udgangspunktet.{*B*}{*B*} -Når du starter eller tilslutter til et onlinespil, bliver det synligt for alle på din venneliste (med mindre du har valgt Kun for inviterede, da du oprettede spillet), og hvis dine venner tilslutter sig spillet, bliver det også synligt for alle på deres venneliste (hvis du har valgt Tillad venner under valgmuligheden Venner).{*B*} -Når du er i et spil, kan du trykke på SELECT-knappen for at få vist en liste over alle andre i spillet og smide uønskede spillere ud af spillet. + + Skift netværkstilstand - - {*T3*}SÅDAN SPILLER DU: SÅDAN DELER DU BILLEDER{*ETW*}{*B*}{*B*} -Du kan dele et billede fra dit spil ved at åbne pausemenuen og trykke på {*CONTROLLER_VK_Y*} for at dele på Facebook. Du bliver vist en miniatureudgave af billedet, og du kan redigere teksten til opslaget på Facebook.{*B*}{*B*} -Der er en særlig kameravenlig visning i spillet, så du kan tage billeder af din figur set forfra – tryk på {*CONTROLLER_ACTION_CAMERA*}, indtil du kan se din figur forfra, inden du trykker på {*CONTROLLER_VK_Y*} for at dele.{*B*}{*B*} -Dit online-ID bliver ikke vist på billedet. + + Vælg netværkstilstand - - {*T3*}SÅDAN SPILLER DU: KREATIV{*ETW*}{*B*}{*B*} -I spiltypen Kreativ kan du overføre alle genstande i spillet til dit lager, uden at du behøver udvinde eller fremstille dem først. -Genstandene forsvinder ikke fra dit lager, når de bliver placeret eller anvendt i verdenen, så du kan fokusere på at bygge frem for at samle ressourcer.{*B*} -Hvis du skaber, indlæser eller gemmer en verden i Kreativ, er trophies og ranglister slået fra, også selvom den indlæses i Overlevelse.{*B*} -Du kan flyve i Kreativ ved at trykke to gange hurtigt på {*CONTROLLER_ACTION_JUMP*}. Gentag handlingen for at holde op med at flyve. Skub {*CONTROLLER_ACTION_MOVE*} frem to gange hurtigt for at flyve hurtigere. -Når du flyver, kan du holde {*CONTROLLER_ACTION_JUMP*} nede for at bevæge dig op og {*CONTROLLER_ACTION_SNEAK*} nede for at bevæge dig nedad, ellers kan du også trykke på {*CONTROLLER_ACTION_DPAD_UP*} for at bevæge dig op, {*CONTROLLER_ACTION_DPAD_DOWN*} for at bevæge dig ned, {*CONTROLLER_ACTION_DPAD_LEFT*} for at bevæge dig til venstre og {*CONTROLLER_ACTION_DPAD_RIGHT*} for at bevæge dig til højre. + + Online-ID for deltagere på delt skærm - - Tryk to gange hurtigt på {*CONTROLLER_ACTION_JUMP*} for at flyve. Gentag handlingen for at holde op med at flyve. Skub {*CONTROLLER_ACTION_MOVE*} frem to gange hurtigt for at flyve hurtigere. -Når du flyver, kan du holde {*CONTROLLER_ACTION_JUMP*} nede for at bevæge dig op og {*CONTROLLER_ACTION_SNEAK*} nede for at bevæge dig nedad, eller du kan bevæge dig op, ned, til venstre og til højre med retningsknapperne. + + Trophies - - BRUGES IKKE + + Dette spil har en funktion, der gemmer automatisk. Når du ser ovenstående ikon, gemmer spillet automatisk dine data. +Du må ikke slukke for dit PlayStation®Vita-system, når dette ikon vises på skærmen. - - BRUGES IKKE + + Når denne funktion er slået til, kan værten slå flyveevnen til eller fra, slå udmattelse fra og gøre sig usynlig fra menuen i spillet. Slår trophies og ranglister fra. - - "BRUGES IKKE" + + Online-ID'er: - - "BRUGES IKKE" + + Du bruger en prøveversion af denne teksturpakke. Du har altså fuld adgang til teksturpakkens indhold, men kan ikke gemme dine fremskridt. Hvis du prøver at gemme, mens du bruger prøveversionen, vil du blive spurgt, om du vil købe den komplette version. - - Invitér venner + + Opdatering 1.04 (titelopdatering 14) - - Hvis du skaber, indlæser eller gemmer en verden i spiltypen Kreativ, vil trophies og ranglister være slået fra for verdenen, selv hvis den indlæses senere i Overlevelse. Er du sikker på, at du vil fortsætte? + + Online-ID'er i spillet - - Denne verden er tidligere blevet gemt i Kreativ, og trophies og ranglister vil være slået fra. Er du sikker på, at du vil fortsætte? + + Se, hvad jeg har lavet i Minecraft: PlayStation®Vita Edition! - - Denne verden er tidligere blevet gemt i Kreativ, og trophies og ranglister vil være slået fra. + + Fejl ved download. Prøv igen senere. - - Hvis du skaber, indlæser eller gemmer en verden, hvor værtsprivilegier er slået til, vil trophies og ranglister være slået fra for verdenen, selv hvis den indlæses senere med denne funktion slået fra. Er du sikker på, at du vil fortsætte? + + Kunne ikke føje dig til spillet på grund af en restriktiv NAT-type. Se dine netværksindstillinger. - - Forbindelsen til "PSN" blev afbrudt. Afslutter til hovedmenuen. + + Fejl ved upload. Prøv igen senere. - - Forbindelsen til "PSN" blev afbrudt. + + Download gennemført! - - Dette er prøveversionen af Minecraft: PlayStation®Vita Edition. Hvis du havde haft den komplette version af spillet, ville du have fået et trophy! -Lås op for den komplette version af spillet for at opleve det fulde omfang af Minecraft: PlayStation®Vita Edition og spille med dine venner over hele verden på "PSN". -Vil du låse op for det komplette spil? + + +Der er ingen gemt fil i overførselsområdet i øjeblikket. +Du kan uploade en gemt verden til til overførselsområdet med Minecraft: PlayStation®3 Edition, aog så downloade denmed Minecraft: PlayStation®Vita Edition. + - - Dette er prøveversionen af Minecraft: PlayStation®Vita Edition. Hvis du havde haft den komplette version af spillet, ville du have fået et tema! -Lås op for den komplette version af spillet for at opleve det fulde omfang af Minecraft: PlayStation®Vita Edition og spille med dine venner over hele verden på "PSN". -Vil du låse op for det komplette spil? + + Kunne ikke gemme - - Dette er prøveversionen af Minecraft: PlayStation®Vita Edition. Du skal have den komplette version af spillet for at kunne acceptere denne invitation. -Vil du låse op for det komplette spil? + + Minecraft: PlayStation®Vita Edition er løbet tør for plads til at gemme på. Frigør mere plads ved at slette andre gemte spil i Minecraft: PlayStation®Vita Edition. - - Gæstespillere kan ikke låse op for det komplette spil. Log venligst ind med en Sony Entertainment Network-konto. + + Upload annulleret - - Online-ID + + Du har annulleret upload af disse gemte data til det sikre overførselssted. - - Brygning + + Upload gemt spil til Vita/PS4™-brug - - Du er blevet sendt tilbage til startskærmen, fordi du er blevet logget ud af "PSN". - + + Uploader data : %d%% - - Du har opbrugt den maksimalt tilladte spilletid af prøveversionen af Minecraft: PlayStation®Vita Edition! Vil du låse op for det komplette spil og fortsætte morskaben? + + "PSN" - - "Minecraft: PlayStation®Vita Edition" kunne ikke blive indlæst og kan derfor ikke fortsætte. + + Download gemt PS3™-spil - - Kunne ikke tilslutte til spillet, da en eller flere af spillerne ikke kan spille online på grund af chatbegrænsninger for deres Sony Entertainment Network-konto. + + Downloader data: %d%% - - Kunne ikke oprette et online spil, da en eller flere af spillerne ikke kan spille online på grund af chatbegrænsninger for deres Sony Entertainment Network-konto. Fjern mærket i feltet "Onlinespil" i "Flere indstillinger" for at starte et offlinespil. + + Gemmer - - Du må ikke deltage i denne spilsession, fordi Online er slået fra for din Sony Entertainment Network-konto på grund af chatbegrænsninger. + + Upload er gennemført! - - Du må ikke deltage i denne spilsession, fordi en af de lokale spillere har Online slået fra for sin Sony Entertainment Network-konto på grund af chatbegrænsninger. Fjern mærket i feltet "Onlinespil" i "Flere indstillinger" for at starte et offlinespil. + + Er du sikker på, at du vil uploade dette gemte spil og overskrive ethvert aktuelt gemt spil i overførselsområdet? - - Du må ikke oprette denne spilsession, fordi en af de lokale spillere har Online slået fra for sin Sony Entertainment Network-konto på grund af chatbegrænsninger. Fjern mærket i feltet "Onlinespil" i "Flere indstillinger" for at starte et offlinespil. + + Konverterer data - - Dette spil har en funktion, der gemmer automatisk. Når du ser ovenstående ikon, gemmer spillet automatisk dine data. -Du må ikke slukke for dit PlayStation®Vita-system, når dette ikon vises på skærmen. + + BRUGES IKKE - - Når denne funktion er slået til, kan værten slå flyveevnen til eller fra, slå udmattelse fra og gøre sig usynlig fra menuen i spillet. Slår trophies og ranglister fra. + + BRUGES IKKE - - Online-ID for deltagere på delt skærm + + {*T3*}SÅDAN SPILLER DU: KREATIV{*ETW*}{*B*}{*B*} +I spiltypen Kreativ kan du overføre alle genstande i spillet til dit lager, uden at du behøver udvinde eller fremstille dem først. +Genstandene forsvinder ikke fra dit lager, når de bliver placeret eller anvendt i verdenen, så du kan fokusere på at bygge frem for at samle ressourcer.{*B*} +Hvis du skaber, indlæser eller gemmer en verden i Kreativ, er trophies og ranglister slået fra, også selvom den indlæses i Overlevelse.{*B*} +Du kan flyve i Kreativ ved at trykke to gange hurtigt på {*CONTROLLER_ACTION_JUMP*}. Gentag handlingen for at holde op med at flyve. Skub {*CONTROLLER_ACTION_MOVE*} frem to gange hurtigt for at flyve hurtigere. +Når du flyver, kan du holde {*CONTROLLER_ACTION_JUMP*} nede for at bevæge dig op og {*CONTROLLER_ACTION_SNEAK*} nede for at bevæge dig nedad, ellers kan du også trykke på {*CONTROLLER_ACTION_DPAD_UP*} for at bevæge dig op, {*CONTROLLER_ACTION_DPAD_DOWN*} for at bevæge dig ned, {*CONTROLLER_ACTION_DPAD_LEFT*} for at bevæge dig til venstre og {*CONTROLLER_ACTION_DPAD_RIGHT*} for at bevæge dig til højre. - - Trophies + + Tryk to gange hurtigt på {*CONTROLLER_ACTION_JUMP*} for at flyve. Gentag handlingen for at holde op med at flyve. Skub {*CONTROLLER_ACTION_MOVE*} frem to gange hurtigt for at flyve hurtigere. +Når du flyver, kan du holde {*CONTROLLER_ACTION_JUMP*} nede for at bevæge dig op og {*CONTROLLER_ACTION_SNEAK*} nede for at bevæge dig nedad, eller du kan bevæge dig op, ned, til venstre og til højre med retningsknapperne. - - Online-ID'er: + + "BRUGES IKKE" - - Online-ID'er i spillet + + Hvis du skaber, indlæser eller gemmer en verden i spiltypen Kreativ, vil trophies og ranglister være slået fra for verdenen, selv hvis den indlæses senere i Overlevelse. Er du sikker på, at du vil fortsætte? - - Se, hvad jeg har lavet i Minecraft: PlayStation®Vita Edition! + + Denne verden er tidligere blevet gemt i Kreativ, og trophies og ranglister vil være slået fra. Er du sikker på, at du vil fortsætte? - - Du bruger en prøveversion af denne teksturpakke. Du har altså fuld adgang til teksturpakkens indhold, men kan ikke gemme dine fremskridt. Hvis du prøver at gemme, mens du bruger prøveversionen, vil du blive spurgt, om du vil købe den komplette version. + + "BRUGES IKKE" - - Opdatering 1.04 (titelopdatering 14) + + Invitér venner - - SELECT + + minecraftforum indeholder en særlig sektion for PlayStation®Vita Edition - - Når funktionen er slået til, bliver trophies og ranglister i verdenen deaktiverede, mens du spiller, og det samme gælder, hvis du indlæser den igen efter at have gemt spillet, mens funktionen var slået til. + + Du kan få de seneste nyheder om spillet fra @4JStudios og @Kappische på Twitter! - - Vil du logge ind på "PSN"? + + IKKE BRUGT - - Hvis du vælger denne valgmulighed for en spiller, der ikke deltager på samme PlayStation®Vita-system som værten, vil spilleren blive smidt ud af spillet sammen med andre spillere, der deltager på vedkommendes PlayStation®Vita-system. Spilleren vil ikke kunne genoprette forbindelsen til spillet, før det bliver genstartet. + + Du kan bruge berøringskærmen på PlayStation®Vita-systemet til at navigere i menuerne! - - PlayStation®Vita-system + + Du må aldrig kigge direkte på en mørkemand! - - Skift netværkstilstand + + {*T3*}SÅDAN SPILLER DU: MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft til PlayStation®Vita-systemet er et multiplayerspil i udgangspunktet.{*B*}{*B*} +Når du starter eller tilslutter til et onlinespil, bliver det synligt for alle på din venneliste (med mindre du har valgt Kun for inviterede, da du oprettede spillet), og hvis dine venner tilslutter sig spillet, bliver det også synligt for alle på deres venneliste (hvis du har valgt Tillad venner under valgmuligheden Venner).{*B*} +Når du er i et spil, kan du trykke på SELECT-knappen for at få vist en liste over alle andre i spillet og smide uønskede spillere ud af spillet. - - Vælg netværkstilstand + + {*T3*}SÅDAN SPILLER DU: SÅDAN DELER DU BILLEDER{*ETW*}{*B*}{*B*} +Du kan dele et billede fra dit spil ved at åbne pausemenuen og trykke på {*CONTROLLER_VK_Y*} for at dele på Facebook. Du bliver vist en miniatureudgave af billedet, og du kan redigere teksten til opslaget på Facebook.{*B*}{*B*} +Der er en særlig kameravenlig visning i spillet, så du kan tage billeder af din figur set forfra – tryk på {*CONTROLLER_ACTION_CAMERA*}, indtil du kan se din figur forfra, inden du trykker på {*CONTROLLER_VK_Y*} for at dele.{*B*}{*B*} +Dit online-ID bliver ikke vist på billedet. - - Du kan vælge Ad hoc-netværk for at oprette forbindelse til andre PlayStation®Vita-systemer i nærheden, eller du kan vælge "PSN" for at oprette forbindelse til venner over hele verden. + + Vi tror, at 4J Studios har fjernet Herobrine fra spillet til PlayStation®Vita-systemet, men vi er ikke sikre. - - Ad hoc-netværk + + Minecraft: PlayStation®Vita Edition slog mange rekorder! - - "PSN" + + Du har opbrugt den maksimalt tilladte spilletid af prøveversionen af Minecraft: PlayStation®Vita Edition! Vil du låse op for det komplette spil og fortsætte morskaben? - - Download gemt PlayStation®3-system spil - + + "Minecraft: PlayStation®Vita Edition" kunne ikke blive indlæst og kan derfor ikke fortsætte. - - Upload gemt spil til PlayStation®3/PlayStation®4-system brug + + Brygning - - Upload annulleret + + Du er blevet sendt tilbage til startskærmen, fordi du er blevet logget ud af "PSN". - - Du har annulleret upload af disse gemte data til det sikre overførselssted. + + Kunne ikke tilslutte til spillet, da en eller flere af spillerne ikke kan spille online på grund af chatbegrænsninger for deres Sony Entertainment Network-konto. - - Uploader data : %d%% + + Du må ikke deltage i denne spilsession, fordi en af de lokale spillere har Online slået fra for sin Sony Entertainment Network-konto på grund af chatbegrænsninger. Fjern mærket i feltet "Onlinespil" i "Flere indstillinger" for at starte et offlinespil. - - Downloader data: %d%% + + Du må ikke oprette denne spilsession, fordi en af de lokale spillere har Online slået fra for sin Sony Entertainment Network-konto på grund af chatbegrænsninger. Fjern mærket i feltet "Onlinespil" i "Flere indstillinger" for at starte et offlinespil. - - Er du sikker på, at du vil uploade dette gemte spil og overskrive ethvert aktuelt gemt spil i overførselsområdet? + + Kunne ikke oprette et online spil, da en eller flere af spillerne ikke kan spille online på grund af chatbegrænsninger for deres Sony Entertainment Network-konto. Fjern mærket i feltet "Onlinespil" i "Flere indstillinger" for at starte et offlinespil. - - Konverterer data + + Du må ikke deltage i denne spilsession, fordi Online er slået fra for din Sony Entertainment Network-konto på grund af chatbegrænsninger. - - Gemmer + + Forbindelsen til "PSN" blev afbrudt. Afslutter til hovedmenuen. - - Upload er gennemført! + + Forbindelsen til "PSN" blev afbrudt. - - Fejl ved upload. Prøv igen senere. + + Denne verden er tidligere blevet gemt i Kreativ, og trophies og ranglister vil være slået fra. - - Download gennemført! + + Hvis du skaber, indlæser eller gemmer en verden, hvor værtsprivilegier er slået til, vil trophies og ranglister være slået fra for verdenen, selv hvis den indlæses senere med denne funktion slået fra. Er du sikker på, at du vil fortsætte? - - Fejl ved download. Prøv igen senere. + + Dette er prøveversionen af Minecraft: PlayStation®Vita Edition. Hvis du havde haft den komplette version af spillet, ville du have fået et trophy! +Lås op for den komplette version af spillet for at opleve det fulde omfang af Minecraft: PlayStation®Vita Edition og spille med dine venner over hele verden på "PSN". +Vil du låse op for det komplette spil? - - Kunne ikke føje dig til spillet på grund af en restriktiv NAT-type. Se dine netværksindstillinger. + + Gæstespillere kan ikke låse op for det komplette spil. Log venligst ind med en Sony Entertainment Network-konto. - - Der er ingen gemte data tilgængelige i det sikre overførselssted i øjeblikket. -Du kan uploade en gemt verden til det sikre overførselssted via Minecraft: PlayStation®3 Edition, og så downloade det med Minecraft: PlayStation®Vita Edition. - + + Online-ID - - Kunne ikke gemme + + Dette er prøveversionen af Minecraft: PlayStation®Vita Edition. Hvis du havde haft den komplette version af spillet, ville du have fået et tema! +Lås op for den komplette version af spillet for at opleve det fulde omfang af Minecraft: PlayStation®Vita Edition og spille med dine venner over hele verden på "PSN". +Vil du låse op for det komplette spil? - - Minecraft: PlayStation®Vita Edition er løbet tør for plads til at gemme på. Frigør mere plads ved at slette andre gemte spil i Minecraft: PlayStation®Vita Edition. + + Dette er prøveversionen af Minecraft: PlayStation®Vita Edition. Du skal have den komplette version af spillet for at kunne acceptere denne invitation. +Vil du låse op for det komplette spil? + + + Den gemte fil i overførselsområdet har et versionsnummer, som Minecraft: PlayStation®Vita Edition ikke understøtter endnu. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/de-DE/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/4J_stringsPlatformSpecific.xml index 78a236e9..982086c4 100644 --- a/Minecraft.Client/PSVitaMedia/loc/de-DE/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/4J_stringsPlatformSpecific.xml @@ -1,51 +1,50 @@  - - Im Systemspeicher ist nicht genug freier Speicherplatz vorhanden, um einen Spielstand zu erstellen. - - - Du bist zum Titelbildschirm zurückgekehrt, weil du dich von "PSN" abgemeldet hast. + + Speichern der Einstellungen des Sony Entertainment Network-Kontos fehlgeschlagen. - - Das Spiel wurde beendet, weil du dich von "PSN" abgemeldet hast. + + Problem mit Sony Entertainment Network-Konto - - Derzeit nicht angemeldet. - + + Beim Zugriff auf dein Sony Entertainment Network-Konto ist ein Problem aufgetreten. Deine Trophäe kann derzeit nicht verliehen werden. - - Dieses Spiel verfügt über Funktionen, die eine Verbindung mit "PSN" erfordern, aber du bist derzeit offline. + + Dies ist die Testversion von Minecraft: PlayStation®3 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade eine Trophäe verdient! +Schalte das vollständige Spiel frei, um den ganzen Spaß von Minecraft: PlayStation®3 Edition zu erleben und zusammen mit deinen Freunden auf der ganzen Welt über "PSN" zu spielen. +Möchtest du jetzt das vollständige Spiel freischalten? - - Ad-hoc-Netzwerk offline. + + Mit Ad-hoc-Netzwerk verbinden Einige Funktionen dieses Spiels erfordern eine Ad-hoc-Netzwerkverbindung, allerdings bist du derzeit offline. - - Diese Funktion erfordert, dass du bei "PSN" angemeldet bist. - - - Mit "PSN" verbinden - - - Mit Ad-hoc-Netzwerk verbinden + + Ad-hoc-Netzwerk offline. Problem mit Trophäe - - Beim Zugriff auf dein Sony Entertainment Network-Konto ist ein Problem aufgetreten. Deine Trophäe kann derzeit nicht verliehen werden. + + Das Spiel wurde beendet, weil du dich von "PSN" abgemeldet hast. - - Problem mit Sony Entertainment Network-Konto + + Du bist zum Titelbildschirm zurückgekehrt, weil du dich von "PSN" abgemeldet hast. - - Speichern der Einstellungen des Sony Entertainment Network-Kontos fehlgeschlagen. + + Im Systemspeicher ist nicht genug freier Speicherplatz vorhanden, um einen Spielstand zu erstellen. - - Dies ist die Testversion von Minecraft: PlayStation®3 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade eine Trophäe verdient! -Schalte das vollständige Spiel frei, um den ganzen Spaß von Minecraft: PlayStation®3 Edition zu erleben und zusammen mit deinen Freunden auf der ganzen Welt über "PSN" zu spielen. -Möchtest du jetzt das vollständige Spiel freischalten? + + Derzeit nicht angemeldet. + + + Mit "PSN" verbinden + + + Diese Funktion erfordert, dass du bei "PSN" angemeldet bist. + + + Dieses Spiel verfügt über Funktionen, die eine Verbindung mit "PSN" erfordern, aber du bist derzeit offline. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/de-DE/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/AdditionalStrings.xml index 9ddf8393..0c324e42 100644 --- a/Minecraft.Client/PSVitaMedia/loc/de-DE/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/AdditionalStrings.xml @@ -48,6 +48,12 @@ Deine Optionen-Datei ist fehlerhaft und muss gelöscht werden. + + Lösche die Optionen-Datei. + + + Versuche erneut, die Optionen-Datei zu laden. + Deine Cache-Datei ist fehlerhaft und muss gelöscht werden. @@ -75,6 +81,9 @@ Online-Dienste sind für dein Sony Entertainment Network-Konto aufgrund von Kindersicherungseinstellungen für einen deiner lokalen Spieler deaktiviert. + + Online-Funktionen sind aufgrund einer verfügbaren Spielaktualisierung deaktiviert. + Für diesen Titel sind momentan keine herunterladbaren Inhalte im Angebot. @@ -84,7 +93,4 @@ Komm doch vorbei und spiel eine Runde Minecraft: PlayStation®Vita Edition! - - Online-Funktionen sind aufgrund einer verfügbaren Spielaktualisierung deaktiviert. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsGeneric.xml index 5d3076ee..28d59838 100644 --- a/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsGeneric.xml @@ -1,4996 +1,5850 @@  - - Es sind neue Inhalte zum Herunterladen verfügbar! Du kannst sie im Hauptmenü über die Schaltfläche „Minecraft Store“ herunterladen. + + Wechsel in den Offline-Modus. - - 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. + + Warte bitte, bis der Host das Spiel gespeichert hat. - - Ändere die Gamma-Einstellung, um das Spiel heller oder dunkler anzeigen zu lassen. + + Das ENDE betreten - - Wenn du die Spielschwierigkeit auf Friedlich setzt, wird deine Gesundheit automatisch regeneriert und nachts tauchen keine Monster auf! + + Spieler speichern - - Füttere einen Wolf mit einem Knochen, um ihn zu zähmen. Du kannst ihm dann befehlen, sich zu setzen oder dir zu folgen. + + Mit dem Host verbinden - - Du kannst vom Inventarmenü aus Gegenstände ablegen, indem du den Cursor aus dem Menü hinaus bewegst und{*CONTROLLER_VK_A*} drückst. + + Gelände herunterladen - - Wenn du nachts in einem Bett schläfst, wird die Zeit bis zum Sonnenaufgang vorgedreht. In einem Multiplayer-Spiel müssen dafür aber alle Spieler gleichzeitig im Bett sein. + + Das ENDE verlassen - - Hol dir Schweinefleisch von Schweinen. Koch und iss es, um deine Gesundheit zu regenerieren. + + Dein Bett fehlt oder ist versperrt. - - Hol dir Leder von Kühen und stell daraus Rüstungen her. + + Du kannst dich jetzt nicht ausruhen, es sind Monster in der Nähe. - - Wenn du einen leeren Eimer hast, kannst du ihn mit Kuhmilch, Wasser oder Lava füllen! + + Du schläfst in einem Bett. Um zum Sonnenaufgang zu wechseln, müssen alle Spieler gleichzeitig schlafen. - - Bereite mit einer Hacke den Boden aufs Bepflanzen vor. + + Dieses Bett ist belegt. - - Spinnen werden dich tagsüber nicht angreifen, es sei denn, du greifst sie an! + + Du kannst nur nachts schlafen. - - Erde oder Sand lässt sich mit einem Spaten schneller abbauen als per Hand! + + %s schläft in einem Bett. Um zum Sonnenaufgang vorzuspringen, müssen alle Spieler gleichzeitig in Betten schlafen. - - Mit gekochtem Schweinefleisch regeneriert die Gesundheit besser als mit rohem. + + Level laden - - Stelle Fackeln her, um nachts die Gegend zu erhellen. Monster werden die Bereiche rund um diese Fackeln meiden. + + Wird finalisiert ... - - Mit einer Lore und Schienen erreichst du dein Ziel schneller! + + Gelände bauen - - Pflanz ein paar Setzlinge. Sie werden zu Bäumen heranwachsen. + + Welt simulieren - - Pigmen greifen dich nicht an, es sei denn, du greifst sie an. + + Rang - - Du kannst deinen Wiedereintrittspunkt ändern und zum Sonnenaufgang vorspringen, indem du in einem Bett schläfst. + + Vorbereiten fürs Speichern des Levels - - Schleudere die Feuerbälle auf den Ghast zurück! + + Teile werden vorbereitet ... - - Wenn du ein Portal baust, kannst du damit in eine andere Dimension reisen – den Nether. + + Server initialisieren - - Drück{*CONTROLLER_VK_B*}, um den Gegenstand abzulegen, den du derzeit in der Hand hältst! + + Nether verlassen - - Verwende für jede Arbeit das geeignete Werkzeug! + + Erneut erscheinen - - Wenn du keine Kohle für deine Fackeln findest, kannst du immer noch im Ofen aus Bäumen Holzkohle herstellen. + + Level generieren - - Gerade nach unten oder oben zu graben, ist keine so gute Idee. + + Startbereich generieren - - Knochenmehl (hergestellt aus einem Skelettknochen) kann als Dünger verwendet werden und lässt Pflanzen sofort wachsen! + + Startbereich laden - - Creeper explodieren, wenn sie dir zu nahe kommen! + + Nether betreten - - Obsidian entsteht, wenn Wasser auf eine Lavaquelle trifft. + + Werkzeuge und Waffen - - Es kann Minuten dauern, bis die Lava VOLLSTÄNDIG verschwindet, nachdem die Lavaquelle entfernt wurde. + + Gamma - - Pflasterstein ist immun gegen die Feuerbälle von Ghasts und eignet sich daher zum Schutz von Portalen. + + Spielempfindlichkeit - - Alle Blöcke, die als Lichtquelle verwendet werden können, schmelzen Schnee und Eis. Dazu zählen Fackeln, Glowstone und Kürbislaternen. + + Menüempfindlichkeit - - Sei vorsichtig, wenn du unter freiem Himmel Strukturen aus Wolle baust, da Gewitterblitze Wolle entzünden können. + + Schwierigkeit - - Ein einziger Eimer Lava reicht als Brennmaterial, um in einem Ofen 100 Blöcke zu schmelzen. + + Musik - - Das Instrument, das ein Notenblock spielt, hängt von dem Material unter dem Block ab. + + Sound - - Zombies und Skelette können den Kontakt mit Tageslicht überleben, wenn sie sich im Wasser befinden. + + Friedlich - - 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. + + In diesem Modus regeneriert sich deine Gesundheit mit der Zeit, und es gibt keine Gegner in der Welt. - - Wölfe können nicht den Nether betreten. + + In diesem Modus erscheinen Gegner in der Umgebung, sie fügen dem Spieler aber weniger Schaden zu als im normalen Modus. - - Wölfe werden keine Creeper angreifen. + + In diesem Modus erscheinen Gegner in der Umgebung und fügen dem Spieler eine normale Menge Schaden zu. - - Hühner legen alle 5 bis 10 Minuten ein Ei. + + Leicht - - Obsidian kann nur mit einer Diamantspitzhacke abgebaut werden. + + Normal - - Creeper sind die einfachste Möglichkeit, zu Schießpulver zu kommen. + + Schwierig - - Wenn du zwei Truhen direkt nebeneinander stellst, entsteht eine große Truhe. + + Abgemeldet - - Zahme Wölfe zeigen ihre Gesundheit durch die Haltung ihres Schwanzes an. Füttere sie mit Fleisch, um sie zu heilen. + + Rüstung - - Koche Kaktus im Ofen, um grüne Farbe zu erhalten. + + Mechanismen - - Im Menü „So wird gespielt“ findest du im Abschnitt „Neuigkeiten“ die neuesten Update-Informationen! + + Transport - - Es gibt jetzt stapelbare Zäune im Spiel! + + Waffen - - Manche Tiere folgen dir, wenn du Weizen in deiner Hand hältst. + + Nahrung - - Wenn ein Tier sich nicht mehr als 20 Blöcke in eine beliebige Richtung bewegen kann, verschwindet es nicht. + + Strukturen - - Musik von C418! + + Dekorationen - - Notch hat mehr als eine Million Follower auf Twitter! + + Brauen - - Nicht alle Schweden sind blond. Manche wie Jens von Mojang haben sogar rote Haare! + + Werkzeuge, Waffen und Rüstungen - - Irgendwann wird es ein Update für dieses Spiel geben! + + Materialien - - Wer ist Notch? + + Blöcke bauen - - Mojang hat mehr Preise als Mitarbeiter! + + Redstone und Transport - - Es gibt berühmte Personen, die Minecraft spielen! + + Verschiedenes - - deadmau5 mag Minecraft! + + Einträge: - - Bitte schau nicht direkt auf die Bugs. + + Verlassen ohne speichern - - Creeper wurden aus einem Programmierfehler geboren. + + Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei gehen nicht gespeicherte Fortschritte verloren. - - Ist es ein Huhn oder eine Ente? + + Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei geht dein Fortschritt verloren! - - Warst du auf der MineCon? + + Diese Speicherdatei ist ungültig oder beschädigt. Möchtest du sie löschen? - - Niemand bei Mojang hat je das Gesicht von Junkboy gesehen. + + Möchtest du wirklich zum Hauptmenü zurückkehren und alle Spieler vom Spiel trennen? Dabei gehen nicht gespeicherte Fortschritte verloren. - - Wusstest du schon, dass es ein Minecraft Wiki gibt? + + Verlassen und speichern - - Mojangs neues Büro ist cool! + + Neue Welt erschaffen - - Die Minecon 2013 hat in Orlando, Florida (USA) stattgefunden! + + Gib einen Namen für deine Welt ein. - - .party() war exzellent! + + Gib den Seed fürs Erstellen deiner Welt ein - - Gerüchte sind sicherlich immer eher falsch als wahr! + + Gespeicherte Welt laden - - {*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.{*B*} -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. + + Tutorial spielen - - {*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.{*B*} -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.{*B*} -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. + + Tutorial - - {*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 dich eine Quickinfo über die Möglichkeit zum Aktivieren des schnellen Bewegens der Rüstung an den richtigen Rüstungsplatz im Inventar.{*B*}{*B*} -Du kannst die Farbe deiner Lederrüstung durch Färben verändern, indem du im Inventarmenü die Farbe in deinem Cursor hältst und dann{*CONTROLLER_VK_X*} drückst, wenn sich der Cursor über dem Teil befindet, das du färben möchtest. + + Benenne deine Welt - - {*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. + + Speicherdatei beschädigt - - {*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. + + O. K. - - {*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. + + Abbrechen - - {*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. + + Minecraft Store - - {*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. + + Drehen - - {*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. + + Ausblenden - - {*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. + + Alle Plätze leeren - - {*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 und basierend auf den Kosten 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*} -Mit Zauberbüchern kannst du am Amboss Verzauberungen auf Gegenstände anwenden. So kannst du besser kontrollieren, welche Verzauberungen du bei deinen Gegenständen anwenden möchtest.{*B*} + + Möchtest du dieses Spiel wirklich verlassen und dem neuen beitreten? Dabei gehen nicht gespeicherte Fortschritte verloren. - - {*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. + + Willst du wirklich mit der aktuellen Version dieser Welt alle früheren Speicherdateien für diese Welt überschreiben? - - {*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 eine bestimmte maximale Anzahl an Tieren haben; es kann also sein, dass Tiere sich nicht vermehren, wenn du schon viele hast. + + Möchtest du wirklich ohne Speichern aufhören? Du verlierst dabei alle Fortschritte in dieser Welt! - - {*T3*}SO WIRD GESPIELT: NETHERPORTAL{*ETW*}{*B*}{*B*} -Mithilfe eines Netherportals kannst du zwischen der oberirdischen Welt und der Netherwelt hin und her reisen. Die Netherwelt kannst du zum schnellen Reisen in der Oberwelt nutzen – 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. + + Spiel starten - - {*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. + + Spiel verlassen - - {*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*} -Bei Aktivierung können Spieler anderen Spielern Schaden zufügen. 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, Schalter und 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*} -Ist diese Option aktiviert, wird der Nether neu generiert. Dies ist nützlich, wenn du einen älteren Spielstand hast, in dem es keine Netherfestungen gab. {*B*}{*B*} - -{*T1*}Optionen im Spiel{*ETW*}{*B*} -Während des Spielens hast du Zugriff auf eine Reihe von Optionen, indem du mit {*BACK_BUTTON*} 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, wählst du den Namen des Spielers aus und rufst mit{*CONTROLLER_VK_A*} deren Privilegien-Menü 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 weder Blöcke platzieren oder zerstören noch 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*} -{*KICK_PLAYER_DESCRIPTION*}{*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 eines Spielers wählst du den Spielernamen aus und rufst 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 ermöglicht es dem Spieler, andere Spieler oder sich selbst zu anderen Spielern in der Welt zu bewegen. + + Spiel speichern - - Nächste Seite + + Verlassen ohne Speichern - - Vorige Seite + + Drück START, um beizutreten - - Grundlagen + + Hurra – du hast ein Spielerbild mit Steve von Minecraft gewonnen! - - Display + + Hurra – du hast ein Spielerbild mit einem Creeper gewonnen! - - Inventar + + Vollständiges Spiel freischalten - - Truhen + + Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine neuere Spielversion verwendet. - - Dinge herstellen + + Neue Welt - - Ofen - - - Dispenser + + Preis freigeschaltet! - - Tierhaltung + + Du spielst die Testversion, kannst deinen Spielstand aber nur im vollständigen Spiel speichern. +Möchtest du jetzt das vollständige Spiel freischalten? - - Tierzucht + + Freunde - - Brauen + + Meine Punkte - - Verzaubern + + Insgesamt - - Netherportal + + Bitte warten - - Multiplayer + + Keine Ergebnisse - - Screenshots teilen + + Filter: - - Level sperren + + Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine ältere Spielversion verwendet. - - Kreativmodus + + Verbindung verloren. - - Host- und Spieleroptionen + + Die Verbindung zum Server wurde unterbrochen. Zurück zum Hauptmenü. - - Handel + + Die Verbindung zum Server wurde getrennt. - - Amboss + + Spiel verlassen - - Das Ende + + Es ist ein Fehler aufgetreten. Zurück zum Hauptmenü. - - {*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 Enderleuten; 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, Freunde mit in Das Ende, die dir im Kampf beistehen!{*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. + + Fehler beim Herstellen der Verbindung - - Sprinten + + Du wurdest aus dem Spiel ausgeschlossen. - - Neuigkeiten + + Der Host hat das Spiel verlassen. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Änderungen und Ergänzungen {*ETW*}{*B*}{*B*} -- Neue Gegenstände hinzugefügt – Smaragd, Smaragderz, Smaragdblock, Endertruhe, Stolperdrahthaken, verzauberter goldener Apfel, Amboss, Blumentopf, Pflastersteinmauern, bemooste Pflastersteinmauern, Withergemälde, Kartoffel, Ofenkartoffel, giftige Kartoffel, Karotte, goldene Karotte, Karottenrute, Kürbiskuchen, Trank der Nachtsicht, Trank der Unsichtbarkeit, Netherquarz, Netherquarzerz, Quarzblock, Quarzstufe, Quarzstufen, gemeißelter Quarzblock, Quarzsäule, Zauberbuch, Teppich.{*B*}{*B*} -- Neue Rezepte für glatten Sandstein und gemeißelten Sandstein hinzugefügt.{*B*} -- Neue NPCs hinzugefügt – Zombie-Dorfbewohner.{*B*} -- Neue Geländegenerierungsfunktionen hinzugefügt – Wüstentempel, Wüstendörfer, Dschungeltempel.{*B*} -- Handel mit Dorfbewohnern hinzugefügt.{*B*} -- Amboss-Oberfläche hinzugefügt. {*B*} -- Rüstungen aus Leder können gefärbt werden.{*B*} -- Halsbänder von Wölfen können gefärbt werden.{*B*} -- Beim Reiten auf einem Schwein kann dieses mit einer Karottenrute gesteuert werden.{*B*} -- Bonustruhe wurde mit weiteren Gegenständen aktualisiert. {*B*} -- Platzierung von halben Blöcken und anderen Blöcken auf halben Blöcken wurde geändert.{*B*} -- Platzierung von umgekehrten Treppen und Stufen wurde geändert.{*B*} -- Verschiedene Dorfbewohner-Berufe wurden hinzugefügt. {*B*} -- Aus einem Eintrittsei erschienene Dorfbewohner haben einen zufälligen Beruf. {*B*} -- Seitliche Platzierung von Holzblöcken hinzugefügt. {*B*} -- Hölzerne Werkzeuge können als Brennstoff für Öfen verwendet werden.{*B*} -- Eis- und Glasscheiben können mit Werkzeugen gesammelt werden, die mit Behutsamkeit verzaubert sind.{*B*} -- Hölzerne Knöpfe und hölzerne Druckplatten können mit Pfeilen aktiviert werden.{*B*} -- Nether-NPCs können aus Portalen in der oberirdischen Welt erscheinen.{*B*} -- Creeper und Spinnen reagieren aggressiv auf den letzten Spieler, der sie getroffen hat.{*B*} -- NPCs im Kreativmodus werden nach einer kurzen Zeit wieder neutral.{*B*} -- Beim Ertrinken wurde Rückstoß entfernt.{*B*} -- Türen, die von Zombies zerbrochen werden, zeigen jetzt Schaden.{*B*} -- Eis schmilzt im Nether.{*B*} -- Kessel füllen sich im Regen.{*B*} -- Kolben brauchen jetzt doppelt so lange zum Aktualisieren.{*B*} -- Das Schwein lässt den Sattel fallen (wenn es einen hat), wenn es getötet wird.{*B*} -- Himmelsfarbe in "Das Ende" wurde verändert.{*B*} -- Es können Fäden platziert werden (für Stolperdrähte). {*B*} -- Regen tropft durch Blätter.{*B*} -- Hebel können auf der Unterseite von Blöcken platziert werden.{*B*} -- Je nach Schwierigkeitseinstellung verursacht TNT unterschiedlichen Schaden.{*B*} -- Buchrezept geändert.{*B*} -- Boote zerbrechen Seerosenblätter und nicht andersherum.{*B*} -- Schweine lassen mehr Schweinefleisch fallen.{*B*} -- Slimes erscheinen in superflachen Welten seltener.{*B*} -- Creeper-Schadenvariable basiert auf Schwierigkeitseinstellung, mehr Rückstoß.{*B*} -- Endermen öffnen jetzt den Rachen. {*B*} -- Teleportieren von Spielern hinzugefügt (über das {*BACK_BUTTON*}-Menü im Spiel).{*B*} -- Neue Hostoptionen für Fliegen, Unsichtbarkeit und Unverwundbarkeit für Remote-Spieler hinzugefügt.{*B*} -- Für neue Gegenstände und Funktionen wurden neue Tutorials zur Tutorial-Welt hinzugefügt. {*B*} -- Die Positionen der Schallplatten-Truhen in der Tutorial-Welt wurden aktualisiert.{*B*} + + Du kannst diesem Spiel nicht beitreten, da du mit niemandem in diesem Spiel befreundet bist. - - {*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 zieh los und hab Spaß!{*B*}{*B*} -{*T1*}Neue Gegenstände{*ETB*} – Smaragd, Smaragderz, Smaragdblock, Endertruhe, Stolperdrahthaken, verzauberter goldener Apfel, Amboss, Blumentopf, Pflastersteinmauern, bemooste Pflastersteinmauern, Withergemälde, Kartoffel, Ofenkartoffel, giftige Kartoffel, Karotte, goldene Karotte, Karottenrute, Kürbiskuchen, Trank der Nachtsicht, Trank der Unsichtbarkeit, Netherquarz, Netherquarzerz, Quarzblock, Quarzstufe, Quarzstufen, gemeißelter Quarzblock, Quarzsäule, Zauberbuch, Teppich.{*B*}{*B*} -{*T1*}Neue NPCs{*ETB*} – Zombie-Dorfbewohner.{*B*}{*B*} -{*T1*}Neue Features{*ETB*} – Handel mit Dorfbewohnern, Waffen und Werkzeug auf dem Amboss reparieren und verzaubern, Gegenstände in Endertruhen aufbewahren, Schwein beim Reiten mit Karottenrute steuern!{*B*}{*B*} -{*T1*}Neue Mini-Tutorials{*ETB*} – Hier erfährst du, wie die neuen Features in der Tutorial-Welt funktionieren!{*B*}{*B*} -{*T1*}Neue Easter Eggs{*ETB*} – Wir haben alle geheimen Schallplatten in der Tutorial-Welt neu versteckt! Findest du sie noch einmal?{*B*}{*B*} + + Du kannst diesem Spiel nicht beitreten, da du vom Host aus dem Spiel ausgeschlossen wurdest. - - Fügt mehr Schaden zu als eine leere Hand. + + Du wurdest wegen Fliegens aus dem Spiel ausgeschlossen. - - Hiermit kannst du Erde, Gras, Sand, Kies und Schnee schneller als mit der Hand abbauen. Du brauchst eine Schaufel, um Schneebälle abzubauen. + + Verbindungsversuch dauert zu lange. - - Wird benötigt, um Stein- und Erzblöcke abzubauen. + + Der Server ist voll. - - Wird verwendet, um Holzblöcke schneller als per Hand abzubauen. + + 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! - - Wird verwendet, um Erd- und Grasblöcke umzugraben und sie damit fürs Bepflanzen vorzubereiten. + + Themen - - Holztüren werden geöffnet, indem du sie verwendest, dagegen schlägst oder mittels Redstone. + + Skinpaket - - Eisentüren können nur mit Redstone, Knöpfen oder Schaltern geöffnet werden. + + Freunde von Freunden zulassen - - NICHT VERWENDET + + Spieler ausschließen - - NICHT VERWENDET + + 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. - - NICHT VERWENDET + + Spielerbilder-Paket - - NICHT VERWENDET + + Du kannst diesem Spiel nicht beitreten, da es auf Spieler beschränkt wurde, die mit dem Host befreundet sind. - - Verleiht dem Spieler beim Tragen 1 Rüstungspunkt. + + Inhalte zum Herunterladen def. - - Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + + 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. - - Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. + + 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. - - Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. + + Spielbeitritt nicht möglich - - Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. + + Ausgewählt - - Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. + + Ausgewählte Skin: - - Verleiht dem Spieler beim Tragen 4 Rüstungspunkte. + + Vollständiges Spiel holen - - Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. + + Texturpaket freischalten - - Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. + + Du musst das Texturpaket freischalten, um es für deine Welt zu verwenden. +Möchtest du es jetzt freischalten? - - Verleiht dem Spieler beim Tragen 6 Rüstungspunkte. + + Texturpaket-Testversion - - Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. + + Seed - - Verleihen dem Spieler beim Tragen 2 Rüstungspunkte. + + Skinpaket freischalten - - Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. + + Um die ausgewählte Skin zu verwenden, musst du dieses Skinpaket freischalten. +Möchtest du dieses Skinpaket jetzt freischalten? - - Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. + + 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? - - Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + + Vollversion herunterladen - - Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. + + Diese Welt verwendet ein Mash-up-Paket oder Texturpaket, das dir fehlt! +Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? - - Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + + Testversion holen - - Verleiht dem Spieler beim Tragen 8 Rüstungspunkte. + + Texturpaket nicht verfügbar - - Verleiht dem Spieler beim Tragen 6 Rüstungspunkte. + + Vollversion freischalten - - Verleihen dem Spieler beim Tragen 3 Rüstungspunkte. + + Testversion herunterladen - - Ein glänzender Barren, aus dem du Werkzeuge herstellen kannst, die aus diesem Material bestehen. Entsteht, wenn du im Ofen Erz schmilzt. + + Dein Spielmodus wurde geändert. - - Ermöglicht es, aus Barren, Diamanten oder Farben platzierbare Blöcke zu erzeugen. Kann als teurer Baublock oder kompakter Erzspeicher verwendet werden. + + Wenn dies aktiviert ist, können nur eingeladene Spieler beitreten. - - 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. + + Wenn dies aktiviert ist, können nur Freunde von Leuten auf deiner Freundeliste dem Spiel beitreten. - - Wird zum Bau platzsparender Treppen verwendet. + + Aktiviert, dass Spieler sich gegenseitig Schaden zufügen können. Hat nur Einfluss auf den Überlebensmodus. - - Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + + Normal - - Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + + Superflach - - Wird verwendet, um Licht zu erzeugen. Fackeln schmelzen außerdem Schnee und Eis. + + Wenn dies aktiviert ist, ist das Spiel online. - - Wird als Baumaterial und zur Herstellung vieler Dinge verwendet. Kann aus jeder Art von Holz hergestellt werden. + + Wenn deaktiviert, können Spieler, die dem Spiel beitreten, nicht bauen oder abbauen, bis sie autorisiert wurden. - - Wird als Baumaterial verwendet. Zerfällt nicht wie normaler Sand durch die Schwerkraft. + + Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden. - - Wird als Baumaterial verwendet. + + Aktiviert, dass eine völlig flache Welt in der Oberwelt und im Nether erschaffen wird. - - 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. + + Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird. - - Erlaubt dir, eine größere Auswahl von Gegenständen zu erschaffen als beim normalen Crafting. + + Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. - - Erlaubt dir, Erz zu schmelzen, Holzkohle und Glas herzustellen sowie Fisch und Schweinefleisch zu kochen. + + Aktiviert, dass aktiviertes TNT explodiert. - - 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. + + 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. - - 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. + + Aus - - Wird verwendet, um sich in vertikaler Richtung zu bewegen. + + Spielmodus: Kreativ - - 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. + + Überleben - - Zeigt den Text an, den du oder andere Spieler eingegeben haben. + + Kreativ - - Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. + + Welt umbenennen - - Erzeugt eine Explosion. Wird nach Platzieren mit dem Feuerzeug oder elektrisch gezündet. + + Gib den neuen Namen für deine Welt ein. - - Wird verwendet, um Pilzsuppe aufzubewahren. Wenn die Suppe aufgegessen ist, behältst du die Schüssel. + + Spielmodus: Überleben - - Wird zum Aufbewahren und zum Transport von Wasser, Lava und Milch verwendet. + + Im Überlebensmodus - - Wird zum Aufbewahren und zum Transport von Wasser verwendet. + + Spielstand umbenennen - - Wird zum Aufbewahren und zum Transport von Lava verwendet. + + Automatisches Speichern in %d ... - - Wird zum Aufbewahren und zum Transport von Milch verwendet. + + Ein - - Kann Feuer erzeugen, TNT zünden und ein Portal nach dem Bau öffnen. + + Im Kreativmodus - - Wird verwendet, um Fische zu fangen. + + Wolken erstellen - - Zeigt die Position der Sonne und des Mondes an. + + Was möchtest du mit diesem Spielstand tun? - - Zeigt auf deinen Startpunkt. + + Displaygr. (geteilter Bildsch.) - - Erzeugt ein Abbild einer Gegend, bei deren Erforschung du sie in der Hand hattest. Nützlich, um den Weg zu finden. + + Zutat - - Erlaubt Fernangriffe mit Pfeilen. + + Brennstoff - - Wird als Munition für Bögen verwendet. + + Dispenser - - Regeneriert 2,5{*ICON_SHANK_01*}. + + Truhe - - Regeneriert 1{*ICON_SHANK_01*}. Kann 6 Mal verwendet werden. + + Verzaubern - - Regeneriert 1{*ICON_SHANK_01*}. + + Ofen - - Regeneriert 1{*ICON_SHANK_01*}. + + Es stehen derzeit keine entsprechenden Inhalte zum Herunterladen für diesen Titel zur Verfügung. - - Regeneriert 3{*ICON_SHANK_01*}. + + Möchtest du diesen Spielstand wirklich löschen? - - Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Der Verzehr kann dich vergiften. + + Wird genehmigt ... - - Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man rohes Hühnchen im Ofen brät. + + Zensiert - - Regeneriert 1,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. + + %s ist dem Spiel beigetreten. - - Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Rindfleisch im Ofen brät. + + %s hat das Spiel verlassen. - - Regeneriert 1,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. + + %s wurde aus dem Spiel ausgeschlossen. - - Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Schweinefleisch im Ofen brät. + + Braustand - - Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Füttere einen Ozelot damit, um ihn zu zähmen. + + Schildtext eingeben - - Regeneriert 2,5{*ICON_SHANK_01*}. Entsteht, wenn man einen rohen Fisch im Ofen brät. + + Gib eine Textzeile für dein Schild ein. - - Regeneriert 2{*ICON_SHANK_01*} und kann zu einem goldenen Apfel verarbeitet werden. + + Titel eingeben - - Regeneriert 2{*ICON_SHANK_01*} und regeneriert 4 Sekunden lang Gesundheit. Kann aus einem Apfel und Goldklumpen hergestellt werden. + + Testversion abgelaufen - - Regeneriert 2{*ICON_SHANK_01*}. Der Verzehr kann dich vergiften. + + Spiel voll - - Wird für das Kuchenrezept verwendet und als Zutat beim Brauen von Tränken. + + Fehler beim Spielbeitritt, da keine Plätze mehr frei sind. - - Erzeugt einen elektrischen Impuls, wenn er gedrückt wird. Bleibt ein- oder ausgeschaltet, bis er erneut gedrückt wird. + + Gib einen Titel für deinen Beitrag ein. - - 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. + + Gib eine Beschreibung für deinen Beitrag ein. - - Wird in Redstone-Schaltkreisen als Repeater, Verzögerer und/oder als Diode eingesetzt. + + Inventar - - Erzeugt ein elektrisches Signal, wenn er gedrückt wird. Bleibt für ungefähr eine Sekunde aktiv, bevor er sich wieder deaktiviert. + + Zutaten - - Kann Gegenstände in zufälliger Reihenfolge verschießen, wenn er einen Impuls von einem Redstone-Stromkreis erhält. + + Überschrift eingeben - - 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. + + Gib eine Überschrift für deinen Beitrag ein. - - Wird verwendet, um Loren eine Richtung vorzugeben. + + Beschreibung eingeben - - Beschleunigt darüberfahrende Loren, wenn sie unter Strom steht. Wenn kein Strom anliegt, bewirkt sie, dass Loren auf ihr anhalten. + + Jetzt wird gespielt: - - Funktioniert wie eine Druckplatte – sendet ein Redstone-Signal, wenn sie aktiviert wird, kann aber nur durch Loren aktiviert werden. + + Möchtest du diesen Level wirklich deiner Liste gesperrter Level hinzufügen? +Wenn du O. K. auswählst, verlässt du dieses Spiel. - - Kann dich, ein Tier oder ein Monster auf Schienen transportieren. + + Von Liste gesperrter Level entfernen - - Wird verwendet, um Waren auf Schienen zu transportieren. + + Speicherintervall - - Bewegt sich auf Schienen und kann andere Loren schieben, wenn du Kohle hineinlegst. + + Gesperrter Level - - Wird verwendet, um schneller als schwimmend übers Wasser zu reisen. + + 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. - - Wird von Schafen eingesammelt und kann mit Farben gefärbt werden. + + Diesen Level sperren? - - Wird als Baumaterial verwendet und kann mit Farben gefärbt werden. Dieses Rezept ist nicht empfehlenswert, da man Wolle leicht von Schafen erhalten kann. + + Speicherintervall: AUS - - Wird als Farbe verwendet, um Wolle schwarz zu färben. + + Durchsichtigkeit - - Wird als Farbe verwendet, um Wolle grün zu färben. + + Autospeichern des Levels wird vorbereitet - - Wird als Farbe verwendet, um Wolle braun zu färben, als Zutat für Kekse oder um Kakaofrüchte zu züchten. + + Displaygröße - - Wird als Farbe verwendet, um Wolle silbern zu färben. + + Min - - Wird als Farbe verwendet, um Wolle gelb zu färben. + + Kann hier nicht platziert werden! - - Wird als Farbe verwendet, um Wolle rot zu färben. + + Das Platzieren von Lava neben dem Wiedereintrittspunkt ist nicht gestattet, da sonst Spieler beim Wiedereintritt in den Level sofort sterben könnten. - - 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. + + Skin-Favoriten - - Wird als Farbe verwendet, um Wolle rosa zu färben. + + Spiel von %s - - Wird als Farbe verwendet, um Wolle orange zu färben. + + Unbekanntes Hostspiel - - Wird als Farbe verwendet, um Wolle hellgrün zu färben. + + Gast abgemeldet - - Wird als Farbe verwendet, um Wolle grau zu färben. + + Einstellungen zurücksetzen - - 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.) + + Möchtest du deine Einstellungen wirklich auf die Standardwerte zurücksetzen? - - Wird als Farbe verwendet, um Wolle hellblau zu färben. + + Ladefehler - - Wird als Farbe verwendet, um Wolle cyanfarben zu färben. + + Ein Gastspieler hat sich abgemeldet, dadurch wurden alle Gastspieler aus dem Spiel entfernt. - - Wird als Farbe verwendet, um Wolle lila zu färben. + + Fehler beim Erstellen des Spiels - - Wird als Farbe verwendet, um Wolle magentafarben zu färben. + + Automatisch ausgewählt - - Wird als Farbe verwendet, um Wolle blau zu färben. + + Kein Paket: Standard-Skins - - Spielt Schallplatten ab. + + Anmelden - - Hieraus kannst du sehr beständige Werkzeuge, Waffen und Rüstungen herstellen. + + Du bist derzeit nicht angemeldet. Du musst angemeldet sein, um dieses Spiel zu spielen. Möchtest du dich jetzt anmelden? - - Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. + + Multiplayer nicht möglich - - Wird zur Herstellung von Büchern und Karten verwendet. + + Trinken - - Kann zur Herstellung von Bücherregalen verwendet oder verzaubert werden, um Zauberbücher herzustellen. + + In diesem Gebiet wurde eine Farm errichtet. Mithilfe von Landwirtschaft kannst du eine erneuerbare Quelle von Nahrung und anderen Gegenständen erschaffen. - - Ermöglicht die Herstellung noch mächtigerer Verzauberungen, wenn sie um den Zaubertisch herumgestellt werden. + + {*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. - - Wird als Dekoration eingesetzt. + + 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. - - Muss mit mindestens einer Eisenspitzhacke abgebaut und dann in einem Ofen geschmolzen werden, um Goldbarren zu erzeugen. + + Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Kreativinventar-Oberfläche zu öffnen. - - Muss mit mindestens einer Steinspitzhacke abgebaut und dann in einem Ofen geschmolzen werden, um Eisenbarren zu erzeugen. + + Begib dich auf die andere Seite dieses Lochs. - - Kann mit einer Spitzhacke abgebaut werden, um Kohle zu erhalten. + + Du hast jetzt das Tutorial zum Kreativmodus abgeschlossen. - - Muss mit mindestens einer Steinspitzhacke abgebaut werden, um Lapislazuli zu erhalten. + + 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. - - Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Diamanten zu erhalten. + + 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*} - - Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Redstone-Staub zu erhalten. + + Pilze solltest du in einem spärlich beleuchteten Gebiet pflanzen. Sie breiten sich auf umliegende spärlich beleuchtete Blöcke aus.{*ICON*}39{*/ICON*} - - Kann mit einer Spitzhacke abgebaut werden, um Pflasterstein zu erhalten. + + Man kann Knochenmehl verwenden, um Pflanzen schneller auswachsen zu lassen oder um Pilze zu Riesigen Pilzen wachsen zu lassen.{*ICON*}351:15{*/ICON*} - - Wird mithilfe einer Schaufel abgebaut. Kann für Bauarbeiten verwendet werden. + + Weizen durchläuft beim Wachstum mehrere Phasen. Er kann geerntet werden, wenn er dunkler aussieht.{*ICON*}59:7{*/ICON*} - - Kann gepflanzt werden und wächst mit der Zeit zu einem Baum heran. + + 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. - - Ist unzerstörbar. + + 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*} - - Setzt alles in Brand, was es berührt. Kann in einem Eimer eingesammelt werden. + + 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. - - 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. + + 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. - - 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. + + In diesem Gebiet gibt es ein Portal in den Nether! - - Kann mit einer Axt abgebaut und zur Herstellung von Holz oder als Brennstoff verwendet werden. + + {*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. - - Wird im Ofen durch Schmelzen von Sand hergestellt. Kann zum Bauen verwendet werden, bricht aber weg, wenn du versuchst, ihn abzubauen. + + 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*} + - - Kann aus Stein mit einer Spitzhacke abgebaut werden. Kann zum Bau von Öfen oder Steinwerkzeugen verwendet werden. + + 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*} + - - Wird in einem Ofen aus Lehm gebacken. + + + 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*} + - - Kann in einem Ofen zu Ziegeln gebacken werden. + + 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. - - Wenn er zerstört wird, entstehen Lehmbälle, die in einem Ofen zu Lehmziegeln gebacken werden können. + + 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. - - Eine platzsparende Art, Schneebälle zu lagern. + + Du bist jetzt im Kreativmodus. - - Kann mit einer Schaufel abgebaut werden, um Schneebälle zu erzeugen. + + {*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. - - Erzeugt beim Abbauen gelegentlich Weizensamen. + + Um ein Netherportal 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. - - Kann zu Farbe verarbeitet werden. + + Um ein Netherportal 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. - - Kann mithilfe einer Schüssel zu Suppe verarbeitet werden. + + 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. - - Kann nur mit einer Diamantspitzhacke abgebaut werden. Entsteht, wenn fließendes Wasser und ruhende Lava aufeinandertreffen. Wird zum Bauen von Portalen verwendet. + + Du hast jetzt das Tutorial zur Landwirtschaft abgeschlossen. - - Erschafft Monster und setzt sie in die Welt. + + Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Axt verwenden, um Baumstämme abzuhacken. - - Wird auf den Boden gelegt, um eine elektrische Ladung zu erzeugen. In einem Trank gebraut wird die Dauer des Effekts verlängert. + + 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. - - Im reifen Zustand kann Getreide geerntet werden, wodurch man Weizen erhält. + + Manche Werkzeuge eignen sich besser, um Gegner anzugreifen. Probier zum Angreifen mal ein Schwert aus. - - Boden, der vorbereitet wurde, um bepflanzt zu werden. + + Eisengolems erscheinen auch auf natürliche Art, um Dörfer zu verteidigen, und greifen dich an, falls du Dorfbewohner attackierst. - - Kann im Ofen gekocht werden, um grüne Farbe herzustellen. + + Du kannst diesen Bereich erst verlassen, wenn du das Tutorial abgeschlossen hast. - - Kann zu Zucker verarbeitet werden. + + Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Schaufel verwenden, um weiches Material wie Erde und Sand abzubauen. - - Kann als Helm getragen oder mit einer Fackel zu einer Kürbislaterne verarbeitet werden. Außerdem die Hauptzutat für Kürbiskuchen. + + 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. - - Brennt unendlich lange, wenn er angezündet wird. + + 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. - - Verlangsamt die Bewegung von allem, was darüber läuft. + + 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. - - Mit einem Portal kannst du dich zwischen der oberirdischen Welt und dem Nether hin und her bewegen. + + 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. - - Kann im Ofen als Brennstoff verwendet oder zu einer Fackel verarbeitet werden. + + 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. - - Erhält man durch Töten einer Spinne. Kann zu einem Bogen oder einer Angel verarbeitet oder auf dem Boden platziert werden, um Stolperdraht herzustellen. + + Halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um nach oben zu schwimmen. - - Erhält man durch Töten eines Huhns. Kann zu einem Pfeil verarbeitet werden. + + 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. - - Erhält man durch Töten eines Creepers. Kann zu TNT verarbeitet oder als Zutat beim Brauen von Tränken verwendet werden. + + Eisengolems bestehen aus vier Eisenblöcken im gezeigten Muster mit einem Kürbis auf dem mittleren Block. Eisengolems greifen deine Feinde an. - - Kann auf Ackerboden gepflanzt werden, um Getreide wachsen zu lassen. Achte darauf, dass es genügend Licht gibt, damit die Pflanzen wachsen können! + + 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. - - Erhält man durch Ernten von Getreide. Kann zu Nahrung verarbeitet werden. + + 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. - - Erhält man beim Abbauen von Kies. Kann zu einem Feuerzeug verarbeitet werden. + + Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann. - - Kann mit einem Schwein verwendet werden, wodurch es möglich ist, auf ihm zu reiten. Mit einer Karottenrute kann das Schwein gesteuert werden. + + In diesem Gebiet sind Tiere untergebracht. Du kannst Tiere dazu bringen, dass sie Tierbabys produzieren. - - Entsteht beim Abbauen von Schnee. Kann geworfen werden. + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Tierzucht zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Tierzucht weißt. + - - Erhält man durch Töten einer Kuh. Kann zu Rüstungen verarbeitet oder zur Herstellung von Büchern verwendet werden. + + Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den „Liebesmodus“ zu versetzen. - - Erhält man durch Töten eines Slimes. Wird als Zutat beim Brauen von Tränken verwendet oder zu haftenden Kolben verarbeitet. - - - Wird zufällig von Hühnern fallen gelassen. Kann zu Nahrung verarbeitet werden. + + Manche Tiere folgen dir, wenn du Futter in deiner Hand hältst. Das erleichtert es, Tiere zur Paarung in Gruppen zu versammeln.{*ICON*}296{*/ICON*} - - Erhält man durch Abbauen von Glowstone. Kann verarbeitet werden, um wieder Glowstone-Blöcke zu bilden. Kann mit einem Trank gebraut werden, um die Wirksamkeit des Effekts zu erhöhen. + + {*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. - - 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. + + Du erstellst Golems, indem du einen Kürbis auf einen Stapel Blöcke legst. - - Entsteht, wenn ein Creeper von einem Skelett getötet wird. Kann in einer Jukebox abgespielt werden. + + Schneegolems bestehen aus zwei aufeinanderliegenden Schneeblöcken mit einem Kürbis darauf. Schneegolems bewerfen deine Feinde mit Schneebällen. - - Löscht Feuer und lässt Getreide wachsen. Kann in einem Eimer eingesammelt werden. + + + Wilde Wölfe kannst du zähmen, indem du ihnen Knochen gibst. Sobald sie gezähmt sind, erscheinen Liebesherzen um sie herum. Zahme Wölfe folgen dir und verteidigen dich, sofern du ihnen nicht befohlen hast, sich zu setzen. + - - Wenn sie abgebaut werden, erscheint manchmal ein Setzling, den man wieder einpflanzen kann, woraus ein neuer Baum wächst. + + Du hast jetzt das Tutorial zur Tierzucht abgeschlossen. - - Findet man in Dungeons. Kann für Bauarbeiten und als Dekoration verwendet werden. + + In dieser Gegend gibt es Kürbisse und Blöcke, um einen Schneegolem und einen Eisengolem zu erstellen. - - Wird verwendet, um Wolle von Schafen zu erhalten und Blätterblöcke zu ernten. + + 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. - - 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 ein Kessel leer ist, kannst du ihn mit einem Wassereimer wieder auffüllen. - - Wenn Strom an einen Kolben angelegt wird, wird der Kolben länger und verschiebt Blöcke. Wenn der Kolben zurückgezogen wird, zieht er den Block mit zurück, der den Kolben berührt. + + Braue mithilfe des Braustandes einen Trank der Feuerresistenz. Du brauchst dazu eine Wasserflasche, eine Netherwarze und Magmacreme. - - Hergestellt aus Steinblöcken, findet man oft in Festungen. + + Nimm einen Trank in die 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. + - - Wird als Absperrung verwendet, ähnlich wie Zäune. + + {*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. - - Wie eine Tür, findet aber hauptsächlich in Zäunen Verwendung. + + Der erste Schritt zum Brauen eines Trankes ist es, eine Wasserflasche zu erschaffen. Nimm eine Glasflasche aus der Truhe. - - Kann aus Melonenscheiben hergestellt werden. + + 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. - - Transparente Blöcke, können als Alternative zu Glasblöcken verwendet werden. + + Verwende deinen Trank der Feuerresistenz für dich selbst. - - Kann gepflanzt werden, um Kürbisse wachsen zu lassen. + + 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. - - Kann gepflanzt werden, um Melonen wachsen zu lassen. + + Wenn ein Gegenstand in das Verzauberfeld gelegt wird, ändern sich die Schaltflächen rechts und zeigen eine Auswahl zufälliger Verzauberungen an. - - 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. + + 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. - - Ein Block Erde, auf dem Gras wächst. Wird mithilfe einer Schaufel abgebaut. Kann für Bauarbeiten verwendet werden. + + 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. - - Kann für Bauarbeiten und als Dekoration verwendet werden. + + Dies ist die Verzauberoberfläche, über die du Waffen, Rüstungen und einige Werkzeuge verzaubern kannst. - - Verlangsamt beim Darüberlaufen die Bewegung. Kann mit einer Schere zerstört werden, um Faden zu erhalten. + + {*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. - - Lässt bei Zerstörung einen Silberfisch entstehen. Kann auch Silberfische entstehen lassen, wenn in der Nähe Silberfische angegriffen werden. + + In diesem Gebiet gibt es einen Braustand, einen Kessel sowie eine Truhe mit Gegenständen zum Brauen. - - Wächst nach Platzierung mit der Zeit. Kann mit einer Schere eingesammelt werden. Du kannst daran wie an einer Leiter klettern. + + Holzkohle kann als Brennstoff verwendet werden, du kannst daraus aber auch mit einem Stock eine Fackel herstellen. - - Ist beim Darüberlaufen rutschig. Wird bei Zerstörung zu Wasser, wenn darunter ein anderer Block ist. Schmilzt in der Nähe einer Lichtquelle und wenn es im Nether platziert wird. + + Wenn du Sand ins Zutatenfeld legst, kannst du Glas herstellen. Erschaff ein paar Glasblöcke, die du als Fenster in deinem Unterstand verwenden kannst. - - Kann als Dekoration verwendet werden. + + Dies ist die Brau-Oberfläche. Hier kannst du Tränke erschaffen, die die verschiedensten Effekte haben können. - - Kann zum Brauen verwendet werden und zum Finden von Festungen. Wird von Lohen hinterlassen, die sich meist in oder nahe von Netherfestungen aufhalten. + + 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. - - Kann zum Brauen verwendet werden. Wird von sterbenden Ghasts fallen gelassen. + + 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. - - Wird von sterbenden Zombie Pigmen fallen gelassen. Zombie Pigmen findest du im Nether. Wird als Zutat beim Brauen von Tränken verwendet. + + 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. - - Kann zum Brauen verwendet werden. Wächst auf natürliche Weise in Netherfestungen. Kann auch auf Seelensand gepflanzt werden. + + {*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man den Braustand verwendet. - - Kann verschiedene Effekte haben, abhängig davon, worauf er angewendet wird. + + 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. - - Kann mit Wasser gefüllt werden und wird als Startzutat zum Brauen von Tränken am Braustand verwendet. + + Erzeuge einen Trank der Feuerresistenz, indem du zuerst eine Netherwarze zu einer Wasserflasche hinzufügst und dann Magmacreme. - - Giftige Nahrung und Brauzutat. Wird von Spinnen und Höhlenspinnen fallen gelassen, wenn sie von einem Spieler getötet werden. + + Drück jetzt{*CONTROLLER_VK_B*}, um die Brauoberfläche zu verlassen. - - Kann zum Brauen verwendet werden, hauptsächlich, um Tränke mit einem negativen Effekt herzustellen. + + 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. - - Kann zum Brauen verwendet werden oder um mit anderen Gegenständen Enderaugen oder Magmacreme herzustellen. + + 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. - - Kann zum Brauen verwendet werden. + + Wenn du einen Trank fertig hast, kannst du seinen Effekt noch weiter modifizieren. Wenn du ihm Redstonestaub hinzufügst, steigerst du die Dauer seines Effekts. Wenn du ihm Glowstonestaub hinzufügst, machst du ihn stärker. - - Wird verwendet, um Tränke und Wurftränke herzustellen. + + 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. - - Kann mithilfe eines Eimers mit Wasser oder durch Regen gefüllt werden, und kann dann verwendet werden, um Glasflaschen mit Wasser zu füllen. + + 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 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. + + 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*} - - Kann zum Brauen verwendet werden. + + 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*} - - Ähnlich wie Grasblöcke, eignet sich aber gut, um Pilze darauf wachsen zu lassen. + + Ein Boot erlaubt dir, schneller übers Wasser zu reisen. Du kannst es mit{*CONTROLLER_ACTION_MOVE*} und{*CONTROLLER_ACTION_LOOK*} steuern. + {*BoatIcon*} - - Schwimmt auf dem Wasser, und man kann darüber laufen. + + Du verwendest jetzt eine Angel. Drück{*CONTROLLER_ACTION_USE*}, um sie einzusetzen.{*FishingRodIcon*} - - Wird verwendet, um Netherfestungen zu bauen. Immun gegenüber den Feuerbällen von Ghasts. + + {*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. - - Wird in Netherfestungen verwendet. + + 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*} - - Findet man in Netherfestungen. Wenn man ihn zerbricht, erhält man Netherwarzen. + + In diesem Gebiet gibt es ein paar einfache Redstone-Schaltkreise und Kolben sowie eine Truhe mit weiteren Gegenständen, um diese Schaltkreise zu erweitern. - - Erlaubt es Spielern, Schwerter, Spitzhacken, Schaufeln, Äxte und Bögen sowie Rüstungen mithilfe der Erfahrungspunkte des Spielers zu verzaubern. + + {*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. - - Kann mit zwölf Enderaugen aktiviert werden, und erlaubt es dem Spieler, in die Enddimension zu reisen. + + Hebel, Schalter, Druckplatten und auch Redstone-Fackeln können Schaltkreise mit Strom versorgen, indem du sie entweder direkt oder mithilfe von Redstonestaub mit dem Gegenstand verbindest, den du aktivieren möchtest. - - Wird verwendet, um ein Endportal zu bilden. + + {*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 Block, den man im Ende findet. Ist sehr widerstandsfähig gegenüber Explosionen und daher ein nützliches Baumaterial. + + 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*} - - Dieser Block entsteht, wenn der Spieler im Ende den Drachen besiegt. + + 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*} - - Wenn man sie wirft, erscheint eine Erfahrungskugel, die deine Erfahrungspunkte steigert, wenn du sie einsammelst. + + {*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. - - Nützlich, um Dinge in Brand zu stecken oder willkürlich beim Abfeuern aus einem Dispenser Feuer zu legen. + + 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. - - Ähnelt einem Schaukasten und zeigt den Gegenstand oder Block, der darin platziert wurde. + + Wenn du Bücherregale rund um den Zaubertisch baust, steigerst du seine Zauberkraft und kannst Verzauberungen höherer Level erhalten. - - Wirft man damit, kann eine Kreatur des angegebenen Typs erscheinen. + + 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. - - Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + + 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. - - Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + + In diesem Gebiet stehen ein Zaubertisch und weitere Gegenstände, die dir helfen, etwas über das Verzaubern zu lernen. - - Entsteht, wenn du im Ofen Netherstein schmilzt. Kann zu Netherziegelblöcken verarbeitet werden. + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über das Verzaubern erfahren möchtest.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über das Verzaubern weißt. + - - Sie leuchten, wenn sie unter Strom stehen. + + Du kannst Erfahrung auch durch den Einsatz von Erfahrungsfläschchen erhalten. Wenn diese geworfen werden, entstehen Erfahrungskugeln rund um die Stelle, wo es gelandet ist. Diese Kugeln können eingesammelt werden. - - Kann angebaut werden, um Kakaobohnen zu erhalten. + + 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*} - - NPC-Köpfe können als Dekoration platziert werden oder als Maske anstatt eines Helms getragen werden. + + 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*} - - Tintenfisch + + Du segelst jetzt in einem Boot. Um das Boot zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - Wenn er getötet wird, lässt er einen Tintensack fallen. + + In den Truhen in dieser Gegend findest du ein paar verzauberte Gegenstände, Erfahrungsfläschchen und ein paar Gegenstände, die noch verzaubert werden müssen – also alles, was du brauchst, um mit dem Zaubertisch zu experimentieren. - - Kuh + + Du fährst jetzt in einer Lore. Um die Lore zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - Wenn sie getötet wird, lässt sie Leder fallen. Kann außerdem mit einem Eimer gemolken werden. + + {*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. - - Schaf + + Wenn du den Cursor über den Rand der Oberfläche hinaus bewegst, während du einen Gegenstand trägst, kannst du den Gegenstand ablegen. - - 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. + + Lesen - - Huhn + + Hängen - - Wenn es getötet wird, lässt es Federn fallen. Legt in zufälligen Abständen Eier. + + Werfen - - Schwein + + Öffnen - - Wenn es getötet wird, lässt es Schweinefleisch fallen. Kann mithilfe eines Sattels geritten werden. + + Tonhöhe ändern - - Wolf + + Explodieren - - 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. + + Pflanzen - - Creeper + + Vollständiges Spiel freischalten - - Explodiert, wenn du ihm zu nahe kommst! + + Spielstand löschen - - Skelett + + Löschen - - Schießt mit Pfeilen auf dich. Wenn es getötet wird, lässt es Pfeile und Knochen fallen. + + Umgraben - - Spinne + + Ernten - - Greift dich an, wenn du ihr zu nahe kommst. Kann Wände hochklettern. Wenn sie getötet wird, lässt sie Faden fallen. + + Weiter - - Zombie + + Hochschwimmen - - Greift dich an, wenn du ihm zu nahe kommst. + + Treffen - - Zombie-Schweinezüchter + + Melken - - Eigentlich friedlich, greift dich aber in Gruppen an, wenn du einen angreifst. + + Sammeln - - Ghast + + Leeren - - Schießt Feuerbälle auf dich, die beim Auftreffen explodieren. + + Sattel - - Slime + + Platzieren - - Zerfällt in kleinere Slimes, wenn er Schaden erhält. + + Essen - - Enderman + + Reiten - - Greift dich an, wenn du ihn ansiehst. Kann außerdem Blöcke bewegen. + + Segeln - - Silberfisch + + Anbauen - - Lockt in der Nähe versteckte Silberfische an, wenn er angegriffen wird. Versteckt sich in Steinblöcken. + + Schlafen - - Höhlenspinne + + Aufwachen - - Hat einen giftigen Biss. + + Spielen - - Pilzkuh + + Optionen - - Kann mithilfe einer Schüssel zu Pilzsuppe verarbeitet werden. Lässt Pilze fallen und wird zu einer normalen Kuh, wenn man sie schert. + + Rüstung bewegen - - Schneegolem + + Waffe bewegen - - Der Schneegolem entsteht, wenn Spieler Schneeblöcke und einen Kürbis kombinieren. Bewirft die Feinde seines Erbauers mit Schneebällen. + + Verwenden - - Enderdrache + + Zutat verschieben - - Ein großer schwarzer Drache, den man im Ende findet. + + Brennstoff verschieben - - Lohe + + Beweg-Werkzeug - - Gegner, die man im Nether findet, vorwiegend in Netherfestungen. Lassen Lohenruten fallen, wenn sie getötet werden. + + Ziehen - - Magmawürfel + + Seite hoch - - Findet man im Nether. Ähnlich wie Schleim zerfallen sie zu kleineren Versionen, wenn man sie tötet. + + Seite runter - - Dorfbewohner + + Liebesmodus - - Ozelot + + Loslassen - - 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. + + Privilegien - - Eisengolem + + Blocken - - Erscheinen in Dörfern, um sie zu beschützen, und können mittels Eisenblöcken und Kürbissen erstellt werden. + + Kreativ - - Explosives Animator + + Level sperren - - Concept Artist + + Skin auswählen - - Number Crunching and Statistics + + Anzünden - - Bully Coordinator + + Freunde einladen - - Original Design and Code by + + Annehmen - - Project Manager/Producer + + Schere - - Rest of Mojang Office + + Navigieren - - Lead Game Programmer Minecraft PC + + Neu installieren - - Ninja Coder + + Optionen - - CEO + + Kommando ausführen - - White Collar Worker + + Vollständiges Spiel installieren - - Customer Support + + Testversion installieren - - Office DJ + + Installieren - - Designer/Programmer Minecraft - Pocket Edition + + Auswerfen - - Developer + + Online-Spiele aktualisieren - - Chief Architect + + Partyspiele - - Art Developer + + Alle Spiele - - Game Crafter + + Verlassen - - Director of Fun + + Abbrechen - - Music and Sounds + + Beitritt abbrechen - - Programming + + Gruppe wechseln - - Art + + Crafting - - QA + + Erschaffen - - Executive Producer + + Nehmen/Ablegen - - Lead Producer + + Inventar - - Producer + + Beschreibung - - Test Lead + + Zutaten - - Lead Tester + + Zurück - - Design Team + + Erinnerung: - - Development Team + + - - Release Management + + Mit der aktuellen Version wurden dem Spiel neue Features hinzugefügt, darunter neue Gebiete in der Tutorial-Welt. - - Director, XBLA Publishing + + Du hast nicht alle Zutaten, die du brauchst, um diesen Gegenstand herzustellen. Das Feld unten links zeigt dir die benötigten Zutaten an. - - Business Development + + 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! - - Portfolio Director + + {*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. + - - Product Manager + + {*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. - - Marketing + + {*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. - - Community Manager + + Auswählen - - Europe Localization Team + + Verwenden - - Redmond Localization Team + + In diesem Gebiet gibt es Bereiche, in denen du mehr über das Angeln, Boote, Kolben und Redstone erfahren kannst. - - Asia Localization Team + + 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! - - User Research Team + + Deine Hungerleiste ist so weit geleert, dass du dich nicht mehr regenerieren kannst. - - MGS Central Teams + + Nehmen - - Milestone Acceptance Tester + + Weiter - - Special Thanks + + Zurück - - Test Manager + + Spieler ausschließen - - Senior Test Lead + + Freundschaftsanfrage - - SDET + + Seite runter - - Project STE + + Seite hoch - - Additional STE + + Färben - - Test Associates + + Heilen - - Jon Kågström + + Sitz - - Tobias Möllstam + + Folge mir - - Risë Lugo + + Abbauen - - Holzschwert + + Füttern - - Steinschwert + + Zähmen - - Eisenschwert + + Filter ändern - - Diamantschwert + + Alles platzieren - - Goldschwert + + Eins platzieren - - Holzschaufel + + Ablegen - - Steinschaufel + + Alles nehmen - - Eisenschaufel + + Hälfte nehmen - - Diamantschaufel + + Platzieren - - Goldschaufel + + Alles ablegen - - Holzspitzhacke + + Schnellauswahl leeren - - Steinspitzhacke + + Was ist das? - - Eisenspitzhacke + + Auf Facebook teilen - - Diamantspitzhacke + + Eins ablegen - - Goldspitzhacke + + Tauschen - - Holzaxt + + Verschieben - - Steinaxt + + Skinpakete - - Eisenaxt + + Rot gefärbte Glasscheibe - - Diamantaxt + + Grün gefärbte Glasscheibe - - Goldaxt + + Braun gefärbte Glasscheibe - - Holzhacke + + Weiß gefärbtes Glas - - Steinhacke + + Gefärbte Glasscheibe - - Eisenhacke + + Schwarz gefärbte Glasscheibe - - Diamanthacke + + Blau gefärbte Glasscheibe - - Goldhacke + + Grau gefärbte Glasscheibe - - Holztür + + Rosa gefärbte Glasscheibe - - Eisentür + + Hellgrün gefärbte Glasscheibe - - Kettenhelm + + Violett gefärbte Glasscheibe - - Kettenbrustplatte + + Türkis gefärbte Glasscheibe - - Kettenhose + + Hellgrau gefärbte Glasscheibe - - Kettenstiefel + + Orange gefärbtes Glas - - Lederkappe + + Blau gefärbtes Glas - - Eisenhelm + + Violett gefärbtes Glas - - Diamanthelm + + Türkis gefärbtes Glas - - Goldhelm + + Rot gefärbtes Glas - - Ledertunika + + Grün gefärbtes Glas - - Eisenbrustplatte + + Braun gefärbtes Glas - - Diamantbrustplatte + + Hellgrau gefärbtes Glas - - Goldbrustplatte + + Gelb gefärbtes Glas - - Lederhose + + Hellblau gefärbtes Glas - - Eisenhose + + Magenta gefärbtes Glas - - Diamanthose + + Grau gefärbtes Glas - - Goldhose + + Rosa gefärbtes Glas - - Lederstiefel + + Hellgrün gefärbtes Glas - - Eisenstiefel + + Gelb gefärbte Glasscheibe - - Diamantstiefel + + Hellgrau - - Goldstiefel + + Grau - - Eisenbarren + + Rosa - - Goldbarren + + Blau - - Eimer + + Violett - - Wassereimer + + Türkis - - Lavaeimer + + Hellgrün - - Feuerzeug + + Orange - - Apfel + + Weiß - - Bogen + + Benutzerdefiniert - - Pfeil + + Gelb - - Kohle + + Hellblau - - Holzkohle + + Magenta - - Diamant + + Braun - - Stock + + Weiß gefärbte Glasscheibe - - Schüssel + + Kleine Kugel - - Pilzsuppe + + Große Kugel - - Faden + + Hellblau gefärbte Glasscheibe - - Feder + + Magenta gefärbte Glasscheibe - - Schießpulver + + Orange gefärbte Glasscheibe - - Weizensamen + + Sternform - - Weizen + + Schwarz - - Brot + + Rot - - Feuerstein + + Grün - - Rohes Schweinefleisch + + Creeperform - - Gekochtes Schweinefleisch + + Explosion - - Gemälde + + Unbekannte Form - - Goldener Apfel + + Schwarz gefärbtes Glas - - Schild + + Eisen-Pferderüstung - - Lore + + Gold-Pferderüstung - - Sattel + + Diamant-Pferderüstung - - Redstone + + Redstone-Komparator - - Schneeball + + Lore mit TNT - - Boot + + Lore mit Trichter - - Leder + + Leine - - Milcheimer + + Leuchtfeuer - - Ziegel + + Fallentruhe - - Lehm + + Beschwerte Druckplatte (leicht) - - Zuckerrohr + + Namensschild - - Papier + + Holzbretter (beliebiger Typ) - - Buch + + Befehlsblock - - Schleimball + + Feuerwerksstern - - Lore mit Truhe + + Diese Tiere können gezähmt und danach geritten werden. Sie können mit einer Truhe verbunden werden. - - Lore mit Ofen + + Maultier - - Ei + + Wird geboren, wenn sich Pferd und Esel paaren. Diese Tiere können gezähmt und danach geritten werden und Rüstung und Truhen tragen. - - Kompass + + Pferd - - Angel + + Diese Tiere können gezähmt und danach geritten werden. - - Uhr + + Esel - - Glowstone-Staub + + Zombiepferd - - Roher Fisch + + Leere Karte - - Gekochter Fisch + + Netherstern - - Farbpulver + + Feuerwerksrakete - - Tintensack + + Skelettpferd - - Rosenrot + + Wither - - Kaktusgrün + + Diese werden aus Wither-Schädeln und Seelensand hergestellt. Sie feuern explodierende Schädel auf dich. - - Kakaobohnen + + Beschwerte Druckplatte (schwer) - - Lapislazuli + + Hellgrau gefärbter Lehm - - Lila Farbe + + Grau gefärbter Lehm - - Farbe Cyan + + Rosa gefärbter Lehm - - Hellgraue Farbe + + Blau gefärbter Lehm - - Graue Farbe + + Violett gefärbter Lehm - - Rosa Farbe + + Türkis gefärbter Lehm - - Hellgrüne Farbe + + Hellgrün gefärbter Lehm - - Löwenzahngelb + + Orange gefärbter Lehm - - Hellblaue Farbe + + Weiß gefärbter Lehm - - Farbe Magenta + + Gefärbtes Glas - - Farbe Orange + + Gelb gefärbter Lehm - - Knochenmehl + + Hellblau gefärbter Lehm - - Knochen + + Magenta gefärbter Lehm - - Zucker + + Braun gefärbter Lehm - - Kuchen + + Trichter - - Bett + + Aktivierungsschiene - - Redstone-Repeater + + Spender - - Keks + + Redstone-Komparator - - Karte + + Tageslichtsensor - - Schallplatte - „13“ + + Redstoneblock - - Schallplatte - „cat“ + + Gefärbter Lehm - - Schallplatte - „blocks“ + + Schwarz gefärbter Lehm - - Schallplatte - „chirp“ + + Rot gefärbter Lehm - - Schallplatte - „far“ + + Grün gefärbter Lehm - - Schallplatte - „mall“ + + Heuballen - - Schallplatte - „mellohi“ + + Gebrannter Lehm - - Schallplatte - „stal“ + + Kohleblock - - Schallplatte - „strad“ + + Fading nach - - Schallplatte - „ward“ + + Verhindert bei Deaktivierung, dass Monster und Tiere Blöcke verändern (beispielsweise zerstören Creeper-Explosionen keine Blöcke und Schafe entfernen kein Gras) oder Gegenstände aufnehmen. - - Schallplatte - „11“ + + Ist dies aktiviert, behalten Spieler nach dem Tod ihr Inventar. - - Schallplatte - „where are we now“ + + Bei Deaktivierung erscheinen keine NPCs auf natürliche Art. - - Schere + + Spielmodus: Abenteuer - - Kürbissamen + + Abenteuer - - Melonensamen + + Gib einen Startwert ein, um das gleiche Gelände erneut zu erstellen. Für eine zufallsgenerierte Welt leer lassen. - - Rohes Hühnchen + + Bei Deaktivierung lassen Monster und Tiere keine Beute fallen (beispielsweise werfen Creeper kein Schießpulver ab). - - Gebratenes Hühnchen + + {*PLAYER*} ist von einer Leiter gefallen. - - Rohes Rindfleisch + + {*PLAYER*} ist von ein paar Ranken gefallen. - - Steak + + {*PLAYER*} ist aus dem Wasser gefallen. - - Verrottetes Fleisch + + Bei Deaktivierung lassen Blöcke keine Gegenstände fallen, wenn sie zerstört werden (beispielsweise bringen Steinblöcke keine Pflastersteine hervor). - - Enderperle + + Bei Deaktivierung regenerieren Spieler Gesundheit nicht auf natürliche Art. - - Melonenscheibe + + Bei Deaktivierung verändert sich die Tageszeit nicht. - - Lohenrute + + Lore - - Ghastträne + + Leine - - Goldklumpen + + Freilassen - - Netherwarze + + Verbinden - - {*prefix*}{*splash*}Trank {*postfix*} + + Absteigen - - Glasflasche + + Truhe verbinden - - Wasserflasche + + Abfeuern - - Spinnenauge + + Name - - Ferment. Spinnenauge + + Leuchtfeuer - - Lohenstaub + + Primärkraft - - Magmacreme + + Sekundärkraft - - Braustand + + Pferd - - Kessel + + Spender - - Enderauge + + Trichter - - Funkelnde Melone + + {*PLAYER*} ist aus großer Höhe gestürzt. - - Erfahrungsfläschchen - - - Feuerkugel + + Eintrittsei kann momentan nicht verwendet werden. Die Höchstanzahl von Fledermäusen in einer Welt wurde erreicht. - - Feuerkugel (Holzkohle) + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pferde wurde erreicht. - - Feuerkugel (Kohle) + + Spieloptionen - - Gegenstandsrahmen + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} mit Feuerbällen abgeschossen. - - {*CREATURE*} erzeugen + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} verprügelt. - - Netherziegel + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} getötet. - - Schädel + + NPC-Griefing - - Skelettschädel + + Blockabwurf - - Dörrskelettschädel + + Natürliche Regeneration - - Zombiekopf + + Tageslichtzyklus - - Kopf + + Inventar behalten - - Kopf von %s + + NPC-Erzeugung - - Creeper-Kopf + + NPC-Beute - - Stein + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} erschossen. - - Grasblock + + {*PLAYER*} ist zu weit gefallen und wurde von {*SOURCE*} erledigt. - - Erde + + {*PLAYER*} ist zu tief gefallen und wurde durch {*SOURCE*} mithilfe von {*ITEM*} erledigt. - - Pflasterstein + + {*PLAYER*} ist beim Kampf gegen {*SOURCE*} ins Feuer gelaufen. - - Eichenholzbretter + + {*PLAYER*} wurde durch {*SOURCE*} zum Fallen verdammt. - - Fichtenholzbretter + + {*PLAYER*} wurde von {*SOURCE*} zum Fallen verdammt. - - Birkenholzbretter + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} zum Fallen verdammt. - - Dschungelholzbretter + + {*PLAYER*} wurde beim Kampf gegen {*SOURCE*} verbrannt. - - Setzling + + {*PLAYER*} wurde von {*SOURCE*} in die Luft gesprengt. - - Eichensetzling + + {*PLAYER*} ist eingegangen wie eine Primel. - - Fichtensetzling + + {*PLAYER*} wurde durch {*SOURCE*} mithilfe von {*ITEM*} getötet. - - Birkensetzling + + {*PLAYER*} hat versucht, durch Lava zu schwimmen, um {*SOURCE*} zu entkommen. - - Dschungelbaumsetzling + + {*PLAYER*} ist beim Versuch, {*SOURCE*} zu entkommen, ertrunken. - - Bedrock + + {*PLAYER*} ist auf der Flucht vor {*SOURCE*} gegen einen Kaktus gelaufen. - - Wasser + + Aufsteigen - - Lava + + Um ein Pferd zu steuern, muss es mit einem Sattel ausgestattet werden. Diesen kann man von einem Dorfbewohner kaufen oder in Truhen, die in der Welt versteckt sind, finden. - - Sand + + +Zahme Esel und Maultiere können mit Satteltaschen ausgestattet werden, indem eine Truhe verbunden wird. Auf diese Satteltaschen kann man dann beim Reiten oder Schleichen zugreifen. + - - Sandstein + + Pferde und Esel (aber nicht Maultiere) können wie andere Tiere auch mit goldenen Äpfeln und goldenen Karotten gezüchtet werden. Fohlen wachsen mit der Zeit zu erwachsenen Pferden heran, wobei dieser Prozess beschleunigt wird, wenn sie mit Weizen oder Heu gefüttert werden. - - Kies + + +Pferde, Esel und Maultiere müssen gezähmt werden, bevor man sie nutzen kann. Ein Pferd wird durch den erfolgreichen Versuch gezähmt, es zu reiten und sich auf dem Pferd zu halten, ohne von ihm abgeworfen zu werden. + - - Golderz + + Wenn sie zahm sind, erscheinen um sie herum Liebesherzen und sie versuchen nicht mehr, den Spieler abzuwerfen. - - Eisenerz + + Versuche jetzt, auf diesem Pferd zu reiten. Verwende {*CONTROLLER_ACTION_USE*}, ohne dass du Gegenstände oder Werkzeuge in der Hand hast, um aufzusteigen. - - Kohlenerz + + +Du kannst versuchen, die Pferde und Esel hier zu zähmen. Sättel, Pferderüstungen und andere nützliche Gegenstände für Pferde findest du auch in Truhen hier in der Gegend. + - - Baumstamm + + Für ein Leuchtfeuer, das auf einer Pyramide mit mindestens 4 Stufen steht, erhältst du zusätzlich entweder die Sekundärkraft Regeneration oder eine stärkere Primärkraft. - - Eichenholz + + Um die Kräfte deines Leuchtfeuers einzustellen, musst du eine Einheit Smaragd, Diamant, Gold oder Eisenbarren im Bezahlplatz opfern. Das Leuchtfeuer strahlt die Kräfte unbegrenzt lang aus, wenn sie einmal festgelegt wurden. - - Fichtenholz + + An der Spitze dieser Pyramide befindet sich ein inaktives Leuchtfeuer. - - Birkenholz + + Dies ist die Leuchtfeuer-Oberfläche, mit der du Kräfte auswählen kannst, die dein Leuchtfeuer anderen Spielern gewährt. - - Dschungelholz + + {*B*}Drücke zum Fortfahren{*CONTROLLER_VK_A*}. +{*B*}Drücke zum Fortfahren{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man die Leuchtfeuer-Oberfläche verwendet. - - Eiche + + Im Leuchtfeuer-Menü kannst du für dein Leuchtfeuer 1 Primärkraft festlegen. Je mehr Stufen deine Pyramide hat, desto mehr Kräfte stehen dir zur Auswahl. - - Fichte + + Alle erwachsenen Pferde, Esel und Maultiere können geritten werden. Gepanzert werden können allerdings nur Pferde, während nur Esel und Maultiere mit Satteltaschen zum Transport von Gegenständen ausgerüstet werden können. - - Birke + + Das ist die Pferdeinventar-Oberfläche. - - Blätter + + +{*B*}Drücke zum Fortfahren{*CONTROLLER_VK_A*}. +{*B*}Drücke zum Fortfahren{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man das Pferdeinventar verwendet. + - - Eichenblätter + + Das Pferdeinventar ermöglicht es dir, Gegenstände auf dein Pferd, deinen Esel oder dein Maultier zu übertragen oder diese damit auszurüsten. - - Fichtenblätter + + Glitzern - - Birkenblätter + + Spur - - Dschungelblätter + + Flugdauer: - - Schwamm + + +Sattle dein Pferd, indem du einen Sattel in den Sattelplatz legst. Pferde können gepanzert werden, indem Pferderüstung in den Rüstungsplatz gelegt wird. + - - Glas + + Du hast ein Maultier gefunden. - - Wolle + + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Pferde, Esel und Maultiere zu erfahren. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Pferde, Esel und Maultiere weißt. + - - Schwarze Wolle + + Pferde und Esel findet man hauptsächlich in weiten Ebenen. Maultiere sind Nachkommen von Pferd und Esel, selbst aber unfruchtbar. - - Rote Wolle + + In diesem Menü kannst du außerdem Gegenstände zwischen deinem eigenen Inventar und den Satteltaschen auf den Eseln und Maultieren verschieben. - - Grüne Wolle + + Du hast ein Pferd gefunden. - - Braune Wolle + + Du hast einen Esel gefunden. - - Blaue Wolle + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Leuchtfeuer zu erfahren. +{*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Leuchtfeuer weißt. - - Lila Wolle + + Feuerwerkssterne können hergestellt werden, indem im Craftingfeld Schießpulver und Farbstoff platziert werden. - - Cyanfarbene Wolle + + +Der Farbstoff bestimmt die Farbe der Explosion des Feuerwerkssterns. + - - Hellgraue Wolle + + +Die Form des Feuerwerkssterns wird durch Hinzufügen von Feuerkugel, Goldklumpen, Feder oder NPC-Kopf bestimmt. + - - Graue Wolle + + Optional können mehrere Feuerwerkssterne im Craftingfeld platziert werden, um sie dem Feuerwerk hinzuzufügen. - - Rosa Wolle + + Je mehr Plätze im Craftingfeld mit Schießpulver gefüllt werden, desto höher explodieren die Feuerwerkssterne. - - Hellgrüne Wolle + + Dann kannst du das hergestellte Feuerwerk aus dem Ausgabeplatz nehmen, wenn du es bearbeiten möchtest. - - Gelbe Wolle + + +Eine Spur oder ein Glitzern kann durch Verwendung von Diamanten oder Glowstone-Staub erzeugt werden. + - - Hellblaue Wolle + + Feuerwerk ist ein dekorativer Gegenstand, der per Hand oder aus Dispensern abgefeuert werden kann. Es wird aus Papier, Schießpulver und wahlweise einigen Feuerwerkssternen hergestellt. - - Magentafarbene Wolle + + +Farbe, Verglühen, Form, Größe und Effekt (wie etwa Spuren und Glitzern) von Feuerwerkssternen können durch den Zusatz weiterer Zutaten bei der Herstellung verändert werden. + - - Orangefarbene Wolle + + Versuche, an der Werkbank ein Feuerwerk herzustellen, indem du ein Sortiment von Zutaten aus den Truhen verwendest. - - Weiße Wolle + + +Nach der Herstellung des Feuerwerkssterns kann die Fading-Farbe durch Bearbeiten mit Farbstoff festgelegt werden. + - - Blume + + In diesen Truhen hier sind mehrere Gegenstände, die zur Herstellung von FEUERWERK verwendet werden! - - Rose + + {*B*}Drücke{*CONTROLLER_VK_A*}, um mehr über Feuerwerk zu erfahren. + {*B*}Drücke{*CONTROLLER_VK_B*}, wenn du schon alles über Feuerwerk weißt. - - Pilz + + +Um ein Feuerwerk herzustellen, musst du Schießpulver und Papier im 3x3-Craftingfeld platzieren, das über deinem Inventar angezeigt wird. + - - Goldblock + + Dieser Raum enthält Trichter. - - Ein kompakter Goldspeicher. + + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Trichter zu erfahren. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Trichter weißt. + - - Eisenblock + + Mit Trichtern werden Gegenstände in Container befördert oder aus ihnen entfernt. Gegenstände, die in sie hineingeworfen werden, werden automatisch eingesammelt. - - Ein kompakter Eisenspeicher. + + Aktive Leuchtfeuer werfen einen Lichtstrahl in den Himmel und gewähren Spielern in der Nähe Kräfte. Sie werden mit Glas, Obsidian und Nethersternen hergestellt, die man beim Sieg über den Wither erhält. - - Steinstufe + + Leuchtfeuer müssen so platziert werden, dass sie bei Tag in Sonnenlicht getaucht werden. Leuchtfeuer müssen auf Pyramiden aus Eisen, Gold, Smaragd oder Diamant platziert werden. Das Material, auf dem das Leuchtfeuer platziert wird, hat aber keinerlei Auswirkung auf die Kraft des Leuchtfeuers. - - Steinstufe + + Versuche, die Kräfte einzustellen, die dieses Leuchtfeuer gewähren soll. Du kannst die Eisenbarren als Bezahlung verwenden, die hier verfügbar sind. - - Sandsteinstufe + + Sie können sich auf Braustände, Truhen, Dispenser, Spender, Loren mit Truhen, Loren mit Trichtern und auch auf andere Trichter auswirken. - - Eichenholzstufe + + In diesem Raum kannst du mit verschiedenen Trichter-Layouts experimentieren. - - Pflastersteinstufe + + Das ist die Feuerwerk-Oberfläche, über die du Feuerwerk und Feuerwerkssterne herstellen kannst. - - Ziegelstufe + + {*B*}Drücke zum Fortfahren{*CONTROLLER_VK_A*}. +{*B*}Drücke{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie die Feuerwerk-Oberfläche verwendet wird. - - Steinziegelstufe + + Trichter versuchen ständig, Gegenstände aus einem passenden Container über ihnen aufzusaugen. Außerdem versuchen sie, gelagerte Gegenstände in einen Ausgabecontainer zu verfrachten. - - Eichenholzstufe + + +Wird aber ein Trichter von einem Redstone angetrieben, wird er inaktiv und saugt weder Gegenstände auf, noch legt er welche ab. + - - Fichtenholzstufe + + +Ein Trichter zeigt in die Richtung, in die er Gegenstände ausgeben will. Damit ein Trichter auf einen bestimmten Block zeigt, platziere den Trichter beim Schleichen an diesem Block. + - - Birkenholzstufe + + Diese Gegner findet man in Sümpfen. Sie greifen dich an, indem sie mit Tränken werfen. Sie lassen bei ihrem Tod Tränke fallen. - - Dschungelholzstufe + + Die Höchstanzahl von Gemälden/Gegenstandsrahmen in einer Welt wurde erreicht. - - Netherziegelstufe + + Im friedlichen Modus kannst du keine Feinde erscheinen lassen. - - Ziegel + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Schweine, Schafe, Kühe, Katzen und Pferden wurde erreicht. - - TNT + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Tintenfischen in einer Welt wurde erreicht. - - Bücherregal + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Feinden in einer Welt wurde erreicht. - - Bemooster Pflasterstein + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Dorfbewohnern in einer Welt wurde erreicht. - - Obsidian + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Wölfe wurde erreicht. - - Fackel + + Die Höchstanzahl von NPC-Köpfen in einer Welt wurde erreicht. - - Fackel (Kohle) + + Sicht umkehren - - Fackel (Holzkohle) + + Linkshänder - - Feuer + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Hühner wurde erreicht. - - Monster-Spawner + + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pilzkühe wurde erreicht. - - Eichenholztreppe + + Die Höchstanzahl von Booten in einer Welt wurde erreicht. - - Truhe + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Hühnern in einer Welt wurde erreicht. - - Redstone-Staub + + {*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 Kilometern 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*} - - Diamanterz + + {*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*} - - Diamantblock + + Nether zurücksetzen - - Ein kompakter Diamantspeicher. + + %s hat das Ende betreten. - - Werkbank + + %s hat das Ende verlassen. - - Getreide + + {*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 Furcht einflößend, als auf die Realität hinter dem Bildschirm zu starren.{*EF*}{*B*}{*B*} +{*C3*}Früher haben sie Stimmen gehört. Ehe 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*} - - Ackerland + + 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! - - Ofen + + Eintrittsei kann momentan nicht verwendet werden. Die Höchstanzahl von Schweinen, Schafen, Kühen, Katzen und Pferden wurde erreicht. - - Schild + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Pilzkühen wurde erreicht. - - Holztür + + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Wölfen in einer Welt wurde erreicht. - - Leiter + + Nether zurücksetzen - - Schiene + + Nether nicht zurücksetzen - - Booster-Schiene + + Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen, Katzen und Pferden wurde erreicht. - - Detektor-Schiene + + Gestorben! - - Steintreppe + + Weltoptionen - - Hebel + + Kann bauen und abbauen - - Druckplatte + + Kann Türen und Schalter verwenden - - Eisentür + + Strukturen erzeugen - - Redstone-Erz + + Superflache Welt - - Redstone-Fackel + + Bonustruhe - - Taste + + Kann Container öffnen - - Schnee + + Spieler ausschließen - - Eis + + Kann fliegen - - Kaktus + + Erschöpfung deaktivieren - - Lehm + + Kann Spieler angreifen - - Zuckerrohr + + Kann Tiere angreifen - - Jukebox + + Moderator - - Zaun + + Hostprivilegien - - Kürbis + + So wird gespielt - - Kürbislaterne + + Steuerung - - Netherrack + + Einstellungen - - Seelensand + + Wieder erscheinen - - Glowstone + + Inhalte zum Herunterladen - - Portal + + Skin ändern - - Lapislazulierz + + Mitwirkende - - Lapislazuliblock + + TNT explodiert - - Ein kompakter Lapislazulispeicher. + + Spieler gegen Spieler - - Dispenser + + Spielern vertrauen - - Notenblock + + Inhalte neu installieren - - Kuchen + + Debug-Einstellungen - - Bett + + Feuer breitet sich aus - - Netz + + Enderdrache - - Hohes Gras + + {*PLAYER*} wurde durch Enderdrachen-Odem getötet. - - Toter Strauch + + {*PLAYER*} wurde durch {*SOURCE*} getötet. - - Diode + + {*PLAYER*} wurde durch {*SOURCE*} getötet. - - Verschlossene Truhe + + {*PLAYER*} ist gestorben. - - Falltür + + {*PLAYER*} ist in die Luft gegangen. - - Wolle (beliebige Farbe) + + {*PLAYER*} wurde durch Magie getötet. - - Kolben + + {*PLAYER*} wurde von {*SOURCE*} erschossen. - - Haftender Kolben + + Grundgesteinnebel - - Silberfischblock + + Display anzeigen - - Steinziegel + + Hand anzeigen - - Bemooste Steinziegel + + {*PLAYER*} starb durch einen Feuerball von {*SOURCE*}. - - Rissige Steinziegel + + {*PLAYER*} wurde von {*SOURCE*} erschlagen. - - Gemeißelter Steinziegel + + {*PLAYER*} wurde durch {*SOURCE*} mit Magie getötet. - - Pilz + + {*PLAYER*} ist aus der Welt herausgefallen. - - Pilz + + Texturpakete - - Eisengitter + + Mash-up-Pakete - - Glasscheibe + + {*PLAYER*} ist in Flammen aufgegangen. - - Melone + + Themen - - Kürbispflanze + + Spielerbilder - - Melonenpflanze + + Avatargegenstände - - Ranken + + {*PLAYER*} ist zu Tode verbrannt. - - Zauntor + + {*PLAYER*} ist verhungert. - - Ziegeltreppe + + {*PLAYER*} wurde erstochen. - - Steinziegeltreppe + + {*PLAYER*} ist zu hart auf dem Boden aufgeschlagen. - - Silberfischstein + + {*PLAYER*} hat versucht, in Lava zu schwimmen. - - Silberfisch-Pflasterstein + + {*PLAYER*} ist in einer Wand erstickt. - - Silberfisch-Steinziegel + + {*PLAYER*} ist ertrunken. - - Myzel + + Todesmeldungen - - Seerosenblatt + + Du bist kein Moderator mehr. - - Netherziegel + + Du kannst jetzt fliegen. - - Netherzaun + + Du kannst nicht mehr fliegen. - - Netherziegeltreppe + + Du kannst keine Tiere mehr angreifen. - - Netherwarze + + Du kannst jetzt Tiere angreifen. - - Zaubertisch + + Du bist jetzt ein Moderator. - - Braustand + + Du wirst keine Erschöpfung mehr spüren. - - Kessel + + Du bist jetzt unverwundbar. - - Endportal + + Du bist nicht mehr unverwundbar. - - Endportalrahmen + + %d MSP - - Endstein + + Du wirst jetzt wieder Erschöpfung spüren. - - Drachenei + + Du bist jetzt unsichtbar. - - Strauch + + Du bist nicht mehr unsichtbar. - - Hohes Gras + + Du kannst jetzt Spieler angreifen. - - Sandsteintreppe + + Du kannst jetzt graben und Gegenstände verwenden. - - Fichtenholztreppe + + Du kannst keine Blöcke mehr platzieren. - - Birkenholztreppe + + Du kannst jetzt Blöcke platzieren. - - Dschungelholztreppe + + Animierte Spielfigur - - Redstone-Lampe + + Eigene Skin-Animation - - Kakao + + Du kannst nicht mehr graben und keine Gegenstände mehr verwenden. - - Schädel + + Du kannst jetzt Türen und Schalter verwenden. - - Derzeitige Steuerung + + Du kannst keine NPCs mehr angreifen. - - Layout + + Du kannst jetzt NPCs angreifen. - - Bewegen/Sprinten + + Du kannst keine Spieler mehr angreifen. - - Schauen + + Du kannst keine Türen und Schalter mehr verwenden. - - Pause + + Du kannst jetzt Container (z. B. Truhen) verwenden. - - Springen + + Du kannst keine Container (z. B. Truhen) mehr verwenden. - - Springen/Hochfliegen + + Unsichtbar - - Inventar + + Leuchtfeuer + + + {*T3*}SO WIRD GESPIELT: LEUCHTFEUER{*ETW*}{*B*}{*B*} +Aktive Leuchtfeuer werfen einen Lichtstrahl in den Himmel und gewähren Spielern in der Nähe Kräfte.{*B*} +Sie werden mit Glas, Obsidian und Nethersternen hergestellt, die man beim Sieg über den Wither erhält.{*B*}{*B*} +Leuchtfeuer müssen so platziert werden, dass sie bei Tag in Sonnenlicht getaucht werden. Leuchtfeuer müssen auf Pyramiden aus Eisen, Gold, Smaragd oder Diamant platziert werden.{*B*} +Das Material, auf dem das Leuchtfeuer platziert wird, hat keinerlei Auswirkung auf die Kraft des Leuchtfeuers.{*B*}{*B*} +Im Leuchtfeuer-Menü kannst du für dein Leuchtfeuer eine Primärkraft festlegen. Je mehr Stufen deine Pyramide hat, desto mehr Kräfte stehen dir zur Auswahl.{*B*} +Für ein Leuchtfeuer, das auf einer Pyramide mit mindestens vier Stufen steht, steht dir außerdem entweder die Sekundärkraft Regeneration oder eine stärkere Primärkraft zur Verfügung.{*B*}{*B*} +Um die Kräfte deines Leuchtfeuers einzustellen, musst du eine Einheit Smaragd, Diamant, Gold oder Eisenbarren im Bezahlplatz opfern.{*B*} +Wenn sie einmal festgelegt wurden, strahlt das Leuchtfeuer die Kräfte unbegrenzt lang aus.{*B*} + + + Feuerwerk + + + Sprachen + + + Pferde + + + {*T3*}SO WIRD GESPIELT: PFERDE{*ETW*}{*B*}{*B*} +Pferde und Esel findet man hauptsächlich in weiten Ebenen. Maultiere sind Nachkommen von Pferd und Esel, selbst aber unfruchtbar.{*B*} +Alle erwachsenen Pferde, Esel und Maultiere können geritten werden. Gepanzert werden können allerdings nur Pferde, während nur Esel und Maultiere mit Satteltaschen zum Transport von Gegenständen ausgerüstet werden können.{*B*}{*B*} +Pferde, Esel und Maultiere müssen gezähmt werden, bevor man sie nutzen kann. Ein Pferd wird durch den erfolgreichen Versuch gezähmt, es zu reiten, ohne von ihm abgeworfen zu werden.{*B*} +Wenn um das Pferd herum Liebesherzen erscheinen, ist es zahm und wird nicht mehr versuchen, den Spieler abzuwerfen. Um das Pferd zu steuern, muss der Spieler es mit einem Sattel ausstatten.{*B*}{*B*} +Sättel können von Dorfbewohnern gekauft oder in versteckten Truhen in der Welt gefunden werden.{*B*} +Zahme Esel und Maultiere können mit einer Satteltasche ausgestattet werden, indem eine Truhe angebracht wird. Auf diese Satteltaschen kann dann beim Reiten oder beim Schleichen zugegriffen werden.{*B*}{*B*} +Pferde und Esel (aber nicht Maultiere) können wie andere Tiere auch mit goldenen Äpfeln und goldenen Karotten gezüchtet werden.{*B*} +Fohlen wachsen mit der Zeit zu erwachsenen Pferden heran, wobei dieser Prozess beschleunigt wird, wenn sie mit Weizen oder Heu gefüttert werden.{*B*} + + + {*T3*}SO WIRD GESPIELT: FEUERWERK{*ETW*}{*B*}{*B*} +Feuerwerk ist ein dekorativer Gegenstand, der per Hand oder aus Dispensern abgefeuert werden kann. Es wird aus Papier, Schießpulver und wahlweise einigen Feuerwerkssternen hergestellt.{*B*} +Farbe, Fading, Form, Größe und Effekt (wie etwa Spuren und Glitzern) von Feuerwerkssternen können durch den Zusatz weiterer Zutaten bei der Herstellung verändert werden.{*B*}{*B*} +Um ein Feuerwerk herzustellen, musst du Schießpulver und Papier im 3x3-Craftingfeld platzieren, das über deinem Inventar angezeigt wird.{*B*} +Optional können mehrere Feuerwerkssterne im Craftingfeld platziert werden, um sie dem Feuerwerk hinzuzufügen.{*B*} +Je mehr Plätze im Craftingfeld mit Schießpulver gefüllt werden, desto höher explodieren die Feuerwerkssterne.{*B*}{*B*} +Anschließend kann das hergestellte Feuerwerk aus dem Ausgabeplatz genommen werden.{*B*}{*B*} +Feuerwerkssterne können hergestellt werden, indem im Craftingfeld Schießpulver und Farbstoff platziert werden.{*B*} + - Der Farbstoff bestimmt die Farbe der Explosion des Feuerwerkssterns.{*B*} + - Die Form des Feuerwerkssterns wird durch Hinzufügen von Feuerkugel, Goldklumpen, Feder oder NPC-Kopf festgelegt.{*B*} + - Eine Spur oder ein Glitzern können durch Verwendung von Diamanten oder Glowstone-Staub erzeugt werden.{*B*}{*B*} +Nach der Herstellung eines Feuerwerkssterns kann die Fading-Farbe durch Bearbeiten mit Farbstoff festgelegt werden. + + + {*T3*}SO WIRD GESPIELT: SPENDER{*ETW*}{*B*}{*B*} +Wenn sie von einem Redstone angetrieben werden, lassen Spender einen einzelnen, zufälligen Gegenstand, den sie in sich tragen, auf den Boden fallen. Mit {*CONTROLLER_ACTION_USE*} kannst du den Spender öffnen und ihn dann mit Gegenständen aus deinem Inventar füllen.{*B*} +Wenn der Spender vor einer Truhe oder einer anderen Art Container steht, wird der Gegenstand stattdessen dort hineingelegt. Lange Ketten von Spendern können konstruiert werden, um Gegenstände über größere Entfernungen zu transportieren. Damit das funktioniert, müssen sie abwechselnd ein- und ausgeschaltet werden. + + + Wird bei Verwendung zu einer Karte von dem Teil der Welt, in dem du dich befindest, und füllt sich, während du die Gegend erforschst. + + + Wird vom Wither fallen gelassen und zur Herstellung von Leuchtfeuern verwendet. + + + Trichter + + + {*T3*}SO WIRD GESPIELT: TRICHTER{*ETW*}{*B*}{*B*} +Mit Trichtern werden Gegenstände in Container befördert oder aus ihnen entfernt. Gegenstände, die in sie hineingeworfen werden, werden automatisch eingesammelt.{*B*} +Sie können sich auf Braustände, Truhen, Dispenser, Spender, Loren mit Truhen, Loren mit Trichtern und auch auf andere Trichter auswirken.{*B*}{*B*} +Trichter versuchen ständig, Gegenstände aus einem passenden Container über ihnen aufzusaugen. Außerdem versuchen sie, gelagerte Gegenstände in einen Ausgabecontainer zu verfrachten.{*B*} +Wird ein Trichter von einem Redstone angetrieben, wird er inaktiv und saugt weder Gegenstände auf, noch legt er welche ab.{*B*}{*B*} +Ein Trichter zeigt in die Richtung, in die er Gegenstände ausgeben will. Damit ein Trichter auf einen bestimmten Block zeigt, platziere den Trichter beim Schleichen an diesem Block.{*B*} + + + Spender - - Gegenstand wechseln + + NICHT VERWENDET - - Aktion + + Sofortgesundheit - - Verwenden + + Sofortschaden - - Crafting + + Sprungverstärkung - - Ablegen + + Grabmüdigkeit - - Schleichen + + Stärke - - Schleichen/Runterfliegen + + Schwäche - - Kameramodus ändern + + Verwirrtheit - - Spieler/Einladen + + NICHT VERWENDET - - Bewegen (beim Fliegen) + + NICHT VERWENDET - - Layout 1 + + NICHT VERWENDET - - Layout 2 + + Regeneration - - Layout 3 + + Widerstand - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Seed für den Weltengenerator finden - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Bringen bei Aktivierung farbenprächtige Explosionen hervor. Farbe, Effekt, Form und Fading sind abhängig vom Feuerwerksstern, der bei der Herstellung der Feuerwerksrakete verwendet wird. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Eine Schienenart, die Loren mit Trichtern aktivieren oder deaktivieren und Loren mit TNT auslösen kann. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Damit werden Gegenstände festgehalten oder fallen gelassen, oder in einen anderen Container gelegt, wenn ein Impuls von einem Redstone-Stromkreis empfangen wird. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Farbenfrohe Blöcke, die hergestellt werden, indem man gebrannten Lehm färbt. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Bietet einen Redstone-Stromkreis. Der Stromkreis wird stärker, wenn mehr Gegenstände auf die Platte gelegt werden. Erfordert mehr Gewicht als die leichte Platte. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Wird als Redstone-Stromquelle verwendet. Kann wieder zu Redstone zerlegt werden. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Wird zum Fangen von Gegenständen oder zu ihrem Transport in und aus Containern verwendet. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Kann an Pferde, Esel oder Maultiere verfüttert werden und heilt so bis zu 10 Herzen. Beschleunigt das Wachstum von Fohlen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Fledermaus - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Diese fliegenden Kreaturen findet man in Höhlen oder anderen großen, geschlossenen Gebieten. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Hexe - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Wird hergestellt, indem Lehm im Ofen geschmolzen wird. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Hergestellt aus Glas und Farbstoff. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Hergestellt aus gefärbtem Glas. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Stellt einen Redstone-Stromkreis zur Verfügung. Der Stromkreis wird stärker, wenn mehr Gegenstände auf die Platte gelegt werden. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Ein Block, der abhängig vom Sonnenlicht (oder vom Mangel an Sonnenlicht) ein Redstone-Signal abgibt. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Eine besondere Lore, die ähnlich funktioniert wie ein Trichter. Sie sammelt Gegenstände auf Schienen und in Containern über ihr. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Eine besondere Rüstung, mit der ein Pferd ausgerüstet werden kann. Verleiht 5 Rüstungspunkte. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Damit werden Farbe, Effekt und Form eines Feuerwerks festgelegt. - - {*B*}Drück zum Fortfahren{*CONTROLLER_VK_A*}. + + Wird in Redstone-Schaltkreisen eingesetzt, um die Signalstärke zu erhalten, zu vergleichen oder zu verringern oder um bestimmte Blockwerte zu messen. - - {*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. + + Eine Art Lore, die sich wie ein bewegender TNT-Block verhält. - - 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. + + Eine besondere Rüstung, mit der ein Pferd ausgerüstet werden kann. Verleiht 7 Rüstungspunkte. - - Mit{*CONTROLLER_ACTION_LOOK*} kannst du nach oben, unten und in die anderen Richtungen schauen. + + Wird zum Ausführen von Kommandos verwendet. - - Mit{*CONTROLLER_ACTION_MOVE*} kannst du dich umherbewegen. + + Wirft einen Lichtstrahl in den Himmel und kann Spieler in der Nähe mit Statuseffekten belegen. - - 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. + + Darin lagern Blöcke und Gegenstände. Platziere zwei Truhen direkt nebeneinander, um eine größere Truhe mit doppelter Kapazität zu erhalten. Eine Fallentruhe erschafft beim Öffnen außerdem einen Redstone-Stromkreis. - - Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen. + + Eine besondere Rüstung, mit der ein Pferd ausgerüstet werden kann. Verleiht 11 Rüstungspunkte. - - 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. + + Wird verwendet, um NPCs zum Spieler oder zu Zaunpfählen zu führen. - - 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. + + Wird verwendet, um NPCs in der Welt Namen zu geben. - - Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Crafting-Oberfläche zu öffnen. + + Grabeile - - 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. + + Vollständiges Spiel freischalten - - 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. + + Spiel fortsetzen - - 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. + + Spiel speichern - - 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. + + Spielen - - 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*} + + Bestenlisten - - Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Öffne dazu die Crafting-Oberfläche.{*PlanksIcon*} + + Hilfe und Optionen - - Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Erstell eine Werkbank.{*CraftingTableIcon*} + + Schwierigkeit: - - 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*} + + PvP: - - Wechsle mit{*CONTROLLER_ACTION_LEFT_SCROLL*} oder{*CONTROLLER_ACTION_RIGHT_SCROLL*} den Gegenstand in deiner Hand. + + Spielern vertrauen: - - 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. + + TNT: - - 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. + + Spieltyp: - - Zeig mit dem Fadenkreuz auf die Werkbank und drück{*CONTROLLER_ACTION_USE*}, um sie zu öffnen. + + Strukturen: - - 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*} + + Leveltyp: - - Mit einer Axt kannst du schneller Stämme und hölzerne Blöcke 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*} + + Keine Spiele gefunden - - 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*} + + Nur mit Einladung - - Container öffnen + + Weitere Optionen - - - 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. - + + Laden - - In der Nähe gibt es einen verlassenen Unterstand von Minenarbeitern, den du fertigstellen kannst, um nachts in Sicherheit zu sein. - + + Hostoptionen - - 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. - + + Spieler/Einladen - - 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*} + + Online-Spiel - - Du hast genügend Pflastersteine gesammelt, um einen Ofen zu bauen. Verwende deine Werkbank, um einen herzustellen. + + Neue Welt - - Drück{*CONTROLLER_ACTION_USE*}, um den Ofen in der Welt zu platzieren, und öffne ihn dann. + + Spieler - - 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? + + Spiel beitreten - - 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? + + Spiel starten - - 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*} + + Weltname - - 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. + + Seed für den Weltengenerator - - 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*} + + Freilassen für zufälligen Seed - - Du hast den ersten Teil des Tutorials abgeschlossen. + + Feuer breitet sich aus: - - {*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. + + Schildnachricht ändern: - - - 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. - + + Gib erklärende Texte zu deinem Screenshot ein. - - {*B*} - Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Inventar verwendet wird. + + Überschrift - - - 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. - + + Spiel-QuickInfos - - 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. - + + 2 Spieler, geteilter Bildschirm - - Wenn du den Cursor mit einem Gegenstand über den Rand der Oberfläche hinaus bewegst, kannst du den Gegenstand ablegen. - + + Fertig - - Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück {*CONTROLLER_VK_BACK*}. + + Screenshot aus dem Spiel - - Drück jetzt{*CONTROLLER_VK_B*}, um das Inventar zu verlassen. + + Keine Effekte - - 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. + + Geschwindigkeit - - {*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. + + Langsamkeit - - - 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. - + + Schildnachricht ändern: - - - 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. - + + Die klassischen Texturen, Symbole und Benutzeroberfläche aus Minecraft! - - 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. - + + Alle Mash-up-Welten anzeigen - - 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. - + + Tipps - - Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_VK_BACK*}. + + Avatar-Gegenstand 1 neu installieren - - Drück jetzt{*CONTROLLER_VK_B*}, um das Kreativmodus-Inventar zu verlassen. - + + Avatar-Gegenstand 2 neu installieren - - - Dies ist die Crafting-Oberfläche. Hier kannst du gesammelte Gegenstände kombinieren, um neue Gegenstände herzustellen. - + + Avatar-Gegenstand 3 neu installieren - - {*B*} - Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man craftet. + + Design neu installieren - - {*B*} - Drück{*CONTROLLER_VK_X*}, um eine Beschreibung des Gegenstands anzuzeigen. + + Spielerbild 1 neu installieren - - {*B*} - Drück{*CONTROLLER_VK_X*}, um die Zutaten anzuzeigen, die du für den aktuellen Gegenstand benötigst. + + Spielerbild 2 neu installieren - - {*B*} - Drück{*CONTROLLER_VK_X*}, um wieder das Inventar anzuzeigen. + + Optionen + + + Benutzeroberfläche + + + Standardeinstellungen + + + Kamerabewegung ansehen + + + Audio + + + Steuerung + + + Grafik + + + 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 beim Brauen von Tränken verwendet. + + + Kann zum Brauen verwendet werden. Wächst auf natürliche Weise in Netherfestungen. Kann auch auf Seelensand gepflanzt werden. + + + Ist beim Darüberlaufen rutschig. Wird bei Zerstörung zu Wasser, wenn darunter ein anderer Block ist. Schmilzt in der Nähe einer Lichtquelle und wenn es im Nether platziert wird. + + + 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 verschiedene Effekte haben, abhängig davon, worauf er angewendet wird. + + + 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 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. + + + Wächst nach Platzierung mit der Zeit. Kann mit einer Schere eingesammelt werden. Du kannst daran wie an einer Leiter klettern. + + + 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. + + + Wenn Strom an einen Kolben angelegt wird, wird der Kolben länger 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. + + + Kann gepflanzt werden, um Kürbisse wachsen zu lassen. + + + 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. + + + 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 mithilfe eines Eimers mit Wasser oder durch Regen gefüllt werden, und kann dann verwendet werden, um Glasflaschen mit Wasser zu füllen. + + + 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. + + + Ä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. + + + Kann angebaut werden, um Kakaobohnen zu erhalten. + + + Kuh + + + Wenn sie getötet wird, lässt sie Leder fallen. Kann außerdem mit einem Eimer gemolken werden. + + + Schaf + + + 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. + + + Nützlich, um Dinge in Brand zu stecken oder willkürlich beim Abfeuern aus einem Dispenser Feuer zu legen. + + + 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. + + + 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. + + + Findet man in Netherfestungen. Wenn man ihn zerbricht, erhält man Netherwarzen. + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. + + + Eine platzsparende Art, Schneebälle zu lagern. + + + 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. + + + Kann mit einer Schaufel abgebaut werden, um Schneebälle zu erzeugen. + + + Erzeugt beim Abbauen gelegentlich Weizensamen. + + + Kann zu Farbe verarbeitet werden. + + + 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 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. + + + 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. + + + Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Redstone-Staub zu erhalten. + + + 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. + + + 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. + + + Wird auf den Boden gelegt, um eine elektrische Ladung zu erzeugen. In einem Trank gebraut wird die Dauer des Effekts verlängert. + + + Erhält man durch Töten einer Kuh. Kann zu Rüstungen verarbeitet oder zur Herstellung von Büchern verwendet werden. + + + Erhält man durch Töten eines Slimes. Wird als Zutat beim Brauen von Tränken verwendet oder zu haftenden Kolben verarbeitet. + + + Wird zufällig von Hühnern fallen gelassen. 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. Mit einer Karottenrute kann das Schwein gesteuert werden. + + + Entsteht beim Abbauen von Schnee. Kann geworfen werden. + + + Erhält man durch Abbauen von Glowstone. Kann verarbeitet werden, um wieder Glowstone-Blöcke zu bilden. Kann mit einem Trank gebraut werden, um die Wirksamkeit des Effekts zu erhöhen. + + + Wenn sie abgebaut werden, erscheint manchmal ein Setzling, den man wieder einpflanzen kann, woraus ein neuer Baum wächst. + + + Findet man in Dungeons. Kann für Bauarbeiten und als Dekoration verwendet werden. + + + Wird verwendet, um Wolle von Schafen zu erhalten und Blätterblöcke zu ernten. + + + 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. + + + Erhält man durch Ernten von Getreide. Kann zu Nahrung verarbeitet werden. + + + Kann zu Zucker verarbeitet werden. + + + Kann als Helm getragen oder mit einer Fackel zu einer Kürbislaterne verarbeitet werden. Außerdem die Hauptzutat für Kürbiskuchen. + + + Brennt unendlich lange, wenn er angezündet wird. + + + 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. + + + Verlangsamt die Bewegung von allem, was darüber läuft. + + + 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 beim Brauen von Tränken 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! + + + 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 dem Boden platziert werden, um Stolperdraht herzustellen. + + + 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. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Eisenschaufel + + + Diamantschaufel + + + Goldschaufel + + + Goldschwert + + + Holzschaufel + + + Steinschaufel + + + Holzspitzhacke + + + Goldspitzhacke + + + Holzaxt + + + Steinaxt + + + Steinspitzhacke + + + Eisenspitzhacke + + + Diamantspitzhacke + + + Diamantschwert + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Holzschwert + + + Steinschwert + + + Eisenschwert + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Schießt Feuerbälle auf dich, die beim Auftreffen explodieren. + + + Slime + + + Zerfällt in kleinere Slimes, wenn er Schaden erhält. + + + Zombie-Schweinezüchter + + + Eigentlich friedlich, greift dich aber in Gruppen an, wenn du einen angreifst. + + + Ghast + + + Enderman + + + Höhlenspinne + + + Hat einen giftigen Biss. + + + Pilzkuh + + + 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. + + + Greift dich an, wenn du ihm zu nahe kommst. + + + 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. + + + Huhn + + + Wenn es getötet wird, lässt es Federn fallen. Legt in zufälligen Abständen Eier. + + + Schwein + + + Creeper + + + 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 + + + Explodiert, wenn du ihm zu nahe kommst! + + + Skelett + + + Schießt mit Pfeilen auf dich. Wenn es getötet wird, lässt es Pfeile und Knochen fallen. + + + Kann mithilfe einer Schüssel zu Pilzsuppe verarbeitet werden. Lässt Pilze fallen und wird zu einer normalen Kuh, wenn man sie schert. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator - - 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ähle dann den herzustellenden Gegenstand mit{*CONTROLLER_MENU_NAVIGATE*} aus. - + + Ein großer schwarzer Drache, den man im Ende findet. - - 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. - + + Lohe + + + Gegner, die man im Nether findet, vorwiegend in Netherfestungen. Lassen Lohenruten fallen, wenn sie getötet werden. + + + Schneegolem + + + Der Schneegolem entsteht, wenn Spieler Schneeblöcke und einen Kürbis kombinieren. Bewirft die Feinde seines Erbauers mit Schneebällen. + + + Enderdrache + + + Magmawürfel + + + 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. + + + Findet man im Nether. Ähnlich wie Schleim zerfallen sie zu kleineren Versionen, wenn man sie tötet. + + + Dorfbewohner + + + Ozelot + + + Ermöglicht die Herstellung noch mächtigerer Verzauberungen, wenn sie um den Zaubertisch herumgestellt werden. + + + {*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: 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: 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 und basierend auf den Kosten 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*} +Mit Zauberbüchern kannst du am Amboss Verzauberungen auf Gegenstände anwenden. So kannst du besser kontrollieren, welche Verzauberungen du bei deinen Gegenständen anwenden möchtest.{*B*} + + + {*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: 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*} +Bei Aktivierung können Spieler anderen Spielern Schaden zufügen. 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, Schalter und 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*} + + {*T2*}Tageslichtzyklus{*ETW*}{*B*} +Bei Deaktivierung verändert sich die Tageszeit nicht.{*B*}{*B*} + + {*T2*}Inventar behalten{*ETW*}{*B*} +Ist dies aktiviert, behalten Spieler nach dem Tod ihr Inventar.{*B*}{*B*} + + {*T2*}NPC-Erzeugung{*ETW*}{*B*} +Bei Deaktivierung erscheinen keine NPCs auf natürliche Art.{*B*}{*B*} + + {*T2*}NPC-Griefing{*ETW*}{*B*} +Verhindert bei Deaktivierung, dass Monster und Tiere Blöcke verändern (beispielsweise zerstören Creeper-Explosionen keine Blöcke und Schafe entfernen kein Gras) oder Gegenstände aufnehmen.{*B*}{*B*} + + {*T2*}NPC-Beute{*ETW*}{*B*} +Bei Deaktivierung lassen Monster und Tiere keine Beute fallen (beispielsweise werfen Creeper kein Schießpulver ab).{*B*}{*B*} + + {*T2*}Blockabwurf{*ETW*}{*B*} +Bei Deaktivierung lassen Blöcke keine Gegenstände fallen, wenn sie zerstört werden (beispielsweise bringen Steinblöcke keine Pflastersteine hervor).{*B*}{*B*} + + {*T2*}Natürliche Regeneration{*ETW*}{*B*} +Bei Deaktivierung regenerieren Spieler Gesundheit nicht auf natürliche Art.{*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*} +Ist diese Option aktiviert, wird der Nether neu generiert. Dies ist nützlich, wenn du einen älteren Spielstand hast, in dem es keine Netherfestungen gab. {*B*}{*B*} + +{*T1*}Optionen im Spiel{*ETW*}{*B*} +Während des Spielens hast du Zugriff auf eine Reihe von Optionen, indem du mit {*BACK_BUTTON*} 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, wählst du den Namen des Spielers aus und rufst mit{*CONTROLLER_VK_A*} deren Privilegien-Menü 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 weder Blöcke platzieren oder zerstören noch 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*} +{*KICK_PLAYER_DESCRIPTION*}{*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 eines Spielers wählst du den Spielernamen aus und rufst 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 ermöglicht es dem Spieler, andere Spieler oder sich selbst zu anderen Spielern in der Welt zu bewegen. + + + Nächste Seite + + + {*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 eine bestimmte maximale 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 der Netherwelt hin und her reisen. Die Netherwelt kannst du zum schnellen Reisen in der Oberwelt nutzen – 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: 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. + + + Warst du auf der MineCon? + + + Niemand bei Mojang hat je das Gesicht von Junkboy gesehen. + + + Wusstest du schon, dass es ein Minecraft Wiki gibt? + + + Bitte schau nicht direkt auf die Bugs. + + + Creeper wurden aus einem Programmierfehler geboren. + + + Ist es ein Huhn oder eine Ente? + + + Mojangs neues Büro ist cool! + + + {*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.{*B*} +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. - - 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. + + {*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.{*B*} +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.{*B*} +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. - - 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. + + {*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 dich eine Quickinfo über die Möglichkeit zum Aktivieren des schnellen Bewegens der Rüstung an den richtigen Rüstungsplatz im Inventar.{*B*}{*B*} +Du kannst die Farbe deiner Lederrüstung durch Färben verändern, indem du im Inventarmenü die Farbe in deinem Cursor hältst und dann{*CONTROLLER_VK_X*} drückst, wenn sich der Cursor über dem Teil befindet, das du färben möchtest. - - Jetzt wird die Beschreibung des derzeit ausgewählten Gegenstands angezeigt. Die Beschreibung hilft dir zu verstehen, wofür der Gegenstand eingesetzt werden kann. + + Die Minecon 2013 hat in Orlando, Florida (USA) stattgefunden! - - Jetzt wird die Liste der Zutaten angezeigt, die benötigt werden, um den ausgewählten Gegenstand herzustellen. + + .party() war exzellent! - - 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*} + + Gerüchte sind sicherlich immer eher falsch als wahr! - - 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. + + Vorige Seite - - 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*} + + Handel - - 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*} + + Amboss - - Ä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*} + + Das Ende - - 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*} + + Level sperren - - 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. + + Kreativmodus - - Manche Gegenstände kannst du nicht mit der Werkbank herstellen, sondern brauchst dafür einen Ofen. Stell jetzt einen Ofen her.{*FurnaceIcon*} + + Host- und Spieleroptionen - - 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. + + {*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 Enderleuten; 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, Freunde mit in Das Ende, die dir im Kampf beistehen!{*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. - - 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. + + {*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 zieh los und hab Spaß!{*B*}{*B*} +{*T1*}Neue Gegenstände{*ETB*} – gebrannter Lehm, gefärbter Lehm, Kohleblock, Heuballen, Aktivierungsschiene, Redstoneblock, Tageslichtsensor, Spender, Trichter, Lore mit Trichter, Lore mit TNT, Redstone-Komparator, beschwerte Druckplatte, Leuchtfeuer, Fallentruhe, Feuerwerksrakete, Feuerwerksstern, Netherstern, Leine, Pferderüstung, Namensschild, Pferde-Eintrittsei.{*B*}{*B*} +{*T1*}Neue NPCs{*ETB*} – Wither, Witherskelette, Hexen, Fledermäuse, Pferde, Esel und Maultiere.{*B*}{*B*} +{*T1*}Neue Features{*ETB*} – Pferd zähmen und reiten, Feuerwerk herstellen und eine Show abziehen, Tiere und Monster mit einem Namensschild versehen, mehr fortgeschrittene Redstone-Schaltkreise erstellen und neue Hostoptionen, um zu bestimmen, was Gäste in deiner Welt tun können!{*B*}{*B*} +{*T1*}Neue Tutorial-Welt{*ETB*} – Hier erfährst du, wie die alten und neuen Features in der Tutorial-Welt funktionieren. Versuche, alle geheimen Schallplatten, die in der Welt versteckt sind, zu finden!{*B*}{*B*} - - {*B*} - Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man einen Ofen verwendet. + + Fügt mehr Schaden zu als eine leere Hand. - - 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. + + Hiermit kannst du Erde, Gras, Sand, Kies und Schnee schneller als mit der Hand abbauen. Du brauchst eine Schaufel, um Schneebälle abzubauen. - - 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. + + Sprinten - - 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. + + Neuigkeiten - - 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. + + {*T3*}Änderungen und Ergänzungen {*ETW*}{*B*}{*B*} +- Neue Gegenstände hinzugefügt – gebrannter Lehm, gefärbter Lehm, Kohleblock, Heuballen, Aktivierungsschiene, Redstoneblock, Tageslichtsensor, Spender, Trichter, Lore mit Trichter, Lore mit TNT, Redstone-Komparator, beschwerte Druckplatte, Leuchtfeuer, Fallentruhe, Feuerwerksrakete, Feuerwerksstern, Netherstern, Leine, Pferderüstung, Namensschild, Pferde-Eintrittsei.{*B*}{*B*} +- Neue NPCs hinzugefügt – Wither, Witherskelette, Hexen, Fledermäuse, Pferde, Esel und Maultiere.{*B*} +- Neue Geländegenerierungsfunktionen hinzugefügt – Sumpfhütten.{*B*} +- Neue Leuchtfeuer-Oberfläche hinzugefügt. +- Neue Pferdeinventar-Oberfläche hinzugefügt. +- Neue Trichter-Oberfläche hinzugefügt. +- Feuerwerk hinzugefügt – Auf die Feuerwerk-Oberfläche kann über die Werkbank zugegriffen werden, wenn du die Materialien hast, um einen Feuerwerksstern oder eine Feuerwerksrakete herzustellen. +- Abenteuer-Modus hinzugefügt – Blöcke können nur mit den richtigen Werkzeugen zerstört werden.{*B*} +- Viele neue Geräusche hinzugefügt.{*B*} +- NPCs, Gegenstände und Projektile können jetzt durch Portale hindurch gelangen.{*B*} +- Repeater können jetzt gesperrt werden, indem die Seiten mit einem anderen Repeater mit Energie versorgt werden.{*B*} +- Zombies und Skelette können jetzt mit verschiedenen Waffen und Rüsten erscheinen.{*B*} +- Neue Todesmeldungen.{*B*} +- NPCs können mit einem Namensschild benannt werden und Container können umbenannt werden, um den Titel zu ändern, wenn das Menü geöffnet ist.{*B*} +- Knochenmehl lässt nicht mehr sofort alles zu vollständiger Größe wachsen, sondern zufällig in Schritten.{*B*} +- Ein Redstone-Signal, das den Inhalt von Truhen, Brauständen, Dispensern und Jukeboxes angibt, kann durch Platzieren eines Redstone-Komparators direkt daran entdeckt werden.{*B*} +- Dispenser können in jede beliebige Richtung gerichtet werden.{*B*} +- Durch das Essen eines goldenen Apfels erhält der Spieler für kurze Zeit extra Absorptionsgesundheit.{*B*} +- Je länger der Spieler in einem Bereich bleibt, desto schwieriger werden die Monster, die in diesem Gebiet erscheinen.{*B*} - - Holzkohle kann als Brennstoff verwendet werden, du kannst daraus aber auch mit einem Stock eine Fackel herstellen. + + Screenshots teilen - - Wenn du Sand ins Zutatenfeld legst, kannst du Glas herstellen. Erschaff ein paar Glasblöcke, die du als Fenster in deinem Unterstand verwenden kannst. + + Truhen - - Dies ist die Brau-Oberfläche. Hier kannst du Tränke erschaffen, die die verschiedensten Effekte haben können. + + Dinge herstellen - - {*B*} - Drück zum Fortfahren{*CONTROLLER_VK_A*}. {*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man den Braustand verwendet. + + Ofen - - 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. + + Grundlagen - - 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. + + Display - - Wenn du einen Trank fertig hast, kannst du seinen Effekt noch weiter modifizieren. Wenn du ihm Redstonestaub hinzufügst, steigerst du die Dauer seines Effekts. Wenn du ihm Glowstonestaub hinzufügst, machst du ihn stärker. + + Inventar - - 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. + + Dispenser - - Erzeuge einen Trank der Feuerresistenz, indem du zuerst eine Netherwarze zu einer Wasserflasche hinzufügst und dann Magmacreme. + + Verzaubern - - Drück jetzt{*CONTROLLER_VK_B*}, um die Brauoberfläche zu verlassen. + + Netherportal - - In diesem Gebiet gibt es einen Braustand, einen Kessel sowie eine Truhe mit Gegenständen zum Brauen. + + Multiplayer - - {*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. + + Tierhaltung - - Der erste Schritt zum Brauen eines Trankes ist es, eine Wasserflasche zu erschaffen. Nimm eine Glasflasche aus der Truhe. + + Tierzucht - - 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. + + Brauen - - Wenn ein Kessel leer ist, kannst du ihn mit einem Wassereimer wieder auffüllen. + + deadmau5 mag Minecraft! - - Braue mithilfe des Braustandes einen Trank der Feuerresistenz. Du brauchst dazu eine Wasserflasche, eine Netherwarze und Magmacreme. + + Pigmen greifen dich nicht an, es sei denn, du greifst sie an. - - Nimm einen Trank in die 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. - + + Du kannst deinen Wiedereintrittspunkt ändern und zum Sonnenaufgang vorspringen, indem du in einem Bett schläfst. - - Verwende deinen Trank der Feuerresistenz für dich selbst. + + Schleudere die Feuerbälle auf den Ghast zurück! - - 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. + + Stelle Fackeln her, um nachts die Gegend zu erhellen. Monster werden die Bereiche rund um diese Fackeln meiden. - - Dies ist die Verzauberoberfläche, über die du Waffen, Rüstungen und einige Werkzeuge verzaubern kannst. + + Mit einer Lore und Schienen erreichst du dein Ziel schneller! - - {*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. + + Pflanz ein paar Setzlinge. Sie werden zu Bäumen heranwachsen. - - 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 du ein Portal baust, kannst du damit in eine andere Dimension reisen – den Nether. - - Wenn ein Gegenstand in das Verzauberfeld gelegt wird, ändern sich die Schaltflächen rechts und zeigen eine Auswahl zufälliger Verzauberungen an. + + Gerade nach unten oder oben zu graben, ist keine so gute Idee. - - 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. + + Knochenmehl (hergestellt aus einem Skelettknochen) kann als Dünger verwendet werden und lässt Pflanzen sofort wachsen! - - 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. + + Creeper explodieren, wenn sie dir zu nahe kommen! - - 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. + + Drück{*CONTROLLER_VK_B*}, um den Gegenstand abzulegen, den du derzeit in der Hand hältst! - - In diesem Gebiet stehen ein Zaubertisch und weitere Gegenstände, die dir helfen, etwas über das Verzaubern zu lernen. + + Verwende für jede Arbeit das geeignete Werkzeug! - - {*B*} - Drück{*CONTROLLER_VK_A*}, wenn du mehr über das Verzaubern erfahren möchtest.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon alles über das Verzaubern weißt. - + + Wenn du keine Kohle für deine Fackeln findest, kannst du immer noch im Ofen aus Bäumen Holzkohle herstellen. - - 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. + + Mit gekochtem Schweinefleisch regeneriert die Gesundheit besser als mit rohem. - - Wenn du Bücherregale rund um den Zaubertisch baust, steigerst du seine Zauberkraft und kannst Verzauberungen höherer Level erhalten. + + Wenn du die Spielschwierigkeit auf Friedlich setzt, wird deine Gesundheit automatisch regeneriert und nachts tauchen keine Monster auf! - - 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. + + 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 Erfahrung auch durch den Einsatz von Erfahrungsfläschchen erhalten. Wenn diese geworfen werden, entstehen Erfahrungskugeln rund um die Stelle, wo es gelandet ist. Diese Kugeln können eingesammelt werden. + + Du kannst vom Inventarmenü aus Gegenstände ablegen, indem du den Cursor aus dem Menü hinaus bewegst und{*CONTROLLER_VK_A*} drückst. - - In den Truhen in dieser Gegend findest du ein paar verzauberte Gegenstände, Erfahrungsfläschchen und ein paar Gegenstände, die noch verzaubert werden müssen – also alles, was du brauchst, um mit dem Zaubertisch zu experimentieren. + + Es sind neue Inhalte zum Herunterladen verfügbar! Du kannst sie im Hauptmenü über die Schaltfläche „Minecraft Store“ herunterladen. - - Du fährst jetzt in einer Lore. Um die Lore zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + 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. - - {*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. + + Ändere die Gamma-Einstellung, um das Spiel heller oder dunkler anzeigen zu lassen. - - 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*} + + Wenn du nachts in einem Bett schläfst, wird die Zeit bis zum Sonnenaufgang vorgedreht. In einem Multiplayer-Spiel müssen dafür aber alle Spieler gleichzeitig im Bett sein. - - 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*} + + Bereite mit einer Hacke den Boden aufs Bepflanzen vor. - - Du segelst jetzt in einem Boot. Um das Boot zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + Spinnen werden dich tagsüber nicht angreifen, es sei denn, du greifst sie an! - - {*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. + + Erde oder Sand lässt sich mit einem Spaten schneller abbauen als per Hand! - - Ein Boot erlaubt dir, schneller übers Wasser zu reisen. Du kannst es mit{*CONTROLLER_ACTION_MOVE*} und{*CONTROLLER_ACTION_LOOK*} steuern. - {*BoatIcon*} + + Hol dir Schweinefleisch von Schweinen. Koch und iss es, um deine Gesundheit zu regenerieren. - - Du verwendest jetzt eine Angel. Drück{*CONTROLLER_ACTION_USE*}, um sie einzusetzen.{*FishingRodIcon*} + + Hol dir Leder von Kühen und stell daraus Rüstungen her. - - {*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. + + Wenn du einen leeren Eimer hast, kannst du ihn mit Kuhmilch, Wasser oder Lava füllen! - - 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*} + + Obsidian entsteht, wenn Wasser auf eine Lavaquelle trifft. - - 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*} + + Es gibt jetzt stapelbare Zäune im Spiel! - - 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*} + + Manche Tiere folgen dir, wenn du Weizen in deiner Hand hältst. - - 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*} + + Wenn ein Tier sich nicht mehr als 20 Blöcke in eine beliebige Richtung bewegen kann, verschwindet es nicht. - - {*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. + + Zahme Wölfe zeigen ihre Gesundheit durch die Haltung ihres Schwanzes an. Füttere sie mit Fleisch, um sie zu heilen. - - 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*} + + Koche Kaktus im Ofen, um grüne Farbe zu erhalten. - - 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*} + + Im Menü „So wird gespielt“ findest du im Abschnitt „Neuigkeiten“ die neuesten Update-Informationen! - - In diesem Gebiet gibt es ein paar einfache Redstone-Schaltkreise und Kolben sowie eine Truhe mit weiteren Gegenständen, um diese Schaltkreise zu erweitern. + + Musik von C418! - - {*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. + + Wer ist Notch? - - Hebel, Schalter, Druckplatten und auch Redstone-Fackeln können Schaltkreise mit Strom versorgen, indem du sie entweder direkt oder mithilfe von Redstonestaub mit dem Gegenstand verbindest, den du aktivieren möchtest. + + Mojang hat mehr Preise als Mitarbeiter! - - 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. + + Es gibt berühmte Personen, die Minecraft spielen! - - 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*} - + + Notch hat mehr als eine Million Follower auf Twitter! - - 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*} - + + Nicht alle Schweden sind blond. Manche wie Jens von Mojang haben sogar rote Haare! - - - 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*} - + + Irgendwann wird es ein Update für dieses Spiel geben! - - 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. + + Wenn du zwei Truhen direkt nebeneinander stellst, entsteht eine große Truhe. - - In diesem Gebiet gibt es ein Portal in den Nether! + + Sei vorsichtig, wenn du unter freiem Himmel Strukturen aus Wolle baust, da Gewitterblitze Wolle entzünden können. - - {*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. + + Ein einziger Eimer Lava reicht als Brennmaterial, um in einem Ofen 100 Blöcke zu schmelzen. - - 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. + + Das Instrument, das ein Notenblock spielt, hängt von dem Material unter dem Block ab. - - Um ein Netherportal 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. + + Es kann Minuten dauern, bis die Lava VOLLSTÄNDIG verschwindet, nachdem die Lavaquelle entfernt wurde. - - Um ein Netherportal 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. + + Pflasterstein ist immun gegen die Feuerbälle von Ghasts und eignet sich daher zum Schutz von Portalen. - - 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. + + Alle Blöcke, die als Lichtquelle verwendet werden können, schmelzen Schnee und Eis. Dazu zählen Fackeln, Glowstone und Kürbislaternen. - - 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. + + Zombies und Skelette können den Kontakt mit Tageslicht überleben, wenn sie sich im Wasser befinden. - - Du bist jetzt im Kreativmodus. + + Hühner legen alle 5 bis 10 Minuten ein Ei. - - {*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. + + Obsidian kann nur mit einer Diamantspitzhacke abgebaut werden. - - 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. + + Creeper sind die einfachste Möglichkeit, zu Schießpulver zu kommen. - - Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Kreativinventar-Oberfläche zu öffnen. + + 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. - - Begib dich auf die andere Seite dieses Lochs. + + Wölfe können nicht den Nether betreten. - - Du hast jetzt das Tutorial zum Kreativmodus abgeschlossen. + + Wölfe werden keine Creeper angreifen. - - In diesem Gebiet wurde eine Farm errichtet. Mithilfe von Landwirtschaft kannst du eine erneuerbare Quelle von Nahrung und anderen Gegenständen erschaffen. + + Wird benötigt, um Stein- und Erzblöcke abzubauen. - - {*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. + + Wird für das Kuchenrezept verwendet und als Zutat beim Brauen von Tränken. - - 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. + + Erzeugt einen elektrischen Impuls, wenn er gedrückt wird. Bleibt ein- oder ausgeschaltet, bis er erneut gedrückt wird. - - 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. + + 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. - - Weizen durchläuft beim Wachstum mehrere Phasen. Er kann geerntet werden, wenn er dunkler aussieht.{*ICON*}59:7{*/ICON*} + + Regeneriert 2{*ICON_SHANK_01*} und kann zu einem goldenen Apfel verarbeitet werden. - - 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. + + Regeneriert 2{*ICON_SHANK_01*} und regeneriert 4 Sekunden lang Gesundheit. Kann aus einem Apfel und Goldklumpen hergestellt werden. - - 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*} + + Regeneriert 2{*ICON_SHANK_01*}. Der Verzehr kann dich vergiften. - - 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*} + + Wird in Redstone-Schaltkreisen als Repeater, Verzögerer und/oder als Diode eingesetzt. - - Pilze solltest du in einem spärlich beleuchteten Gebiet pflanzen. Sie breiten sich auf umliegende spärlich beleuchtete Blöcke aus.{*ICON*}39{*/ICON*} + + Wird verwendet, um Loren eine Richtung vorzugeben. - - Man kann Knochenmehl verwenden, um Pflanzen schneller auswachsen zu lassen oder um Pilze zu Riesigen Pilzen wachsen zu lassen.{*ICON*}351:15{*/ICON*} + + Beschleunigt darüberfahrende Loren, wenn sie unter Strom steht. Wenn kein Strom anliegt, bewirkt sie, dass Loren auf ihr anhalten. - - Du hast jetzt das Tutorial zur Landwirtschaft abgeschlossen. + + Funktioniert wie eine Druckplatte (sendet ein Redstone-Signal, wenn sie aktiviert wird), kann aber nur durch eine Lore aktiviert werden. - - In diesem Gebiet sind Tiere untergebracht. Du kannst Tiere dazu bringen, dass sie Tierbabys produzieren. + + Erzeugt ein elektrisches Signal, wenn er gedrückt wird. Bleibt für ungefähr eine Sekunde aktiv, bevor er sich wieder deaktiviert. - - {*B*} - Drück{*CONTROLLER_VK_A*}, um mehr über Tierzucht zu erfahren.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Tierzucht weißt. - + + Kann Gegenstände in zufälliger Reihenfolge verschießen, wenn er einen Impuls von einem Redstone-Stromkreis erhält. - - Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den „Liebesmodus“ zu versetzen. + + 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. - - 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. + + Regeneriert 2,5{*ICON_SHANK_01*}. Entsteht, wenn man einen rohen Fisch im Ofen brät. - - 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. + + Regeneriert 1{*ICON_SHANK_01*}. - - Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann. + + Regeneriert 1{*ICON_SHANK_01*}. - - Manche Tiere folgen dir, wenn du Futter in deiner Hand hältst. Das erleichtert es, Tiere zur Paarung in Gruppen zu versammeln.{*ICON*}296{*/ICON*} + + Regeneriert 3{*ICON_SHANK_01*}. - - - Wilde Wölfe kannst du zähmen, indem du ihnen Knochen gibst. Sobald sie gezähmt sind, erscheinen Liebesherzen um sie herum. Zahme Wölfe folgen dir und verteidigen dich, sofern du ihnen nicht befohlen hast, sich zu setzen. - + + Wird als Munition für Bögen verwendet. + + + Regeneriert 2,5{*ICON_SHANK_01*}. - - Du hast jetzt das Tutorial zur Tierzucht abgeschlossen. + + Regeneriert 1{*ICON_SHANK_01*}. Kann 6 Mal verwendet werden. - - In dieser Gegend gibt es Kürbisse und Blöcke, um einen Schneegolem und einen Eisengolem zu erstellen. + + Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Der Verzehr kann dich vergiften. - - {*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. + + Regeneriert 1,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. - - Du erstellst Golems, indem du einen Kürbis auf einen Stapel Blöcke legst. + + Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Schweinefleisch im Ofen brät. - - Schneegolems bestehen aus zwei aufeinanderliegenden Schneeblöcken mit einem Kürbis darauf. Schneegolems bewerfen deine Feinde mit Schneebällen. + + Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Füttere einen Ozelot damit, um ihn zu zähmen. - - Eisengolems bestehen aus vier Eisenblöcken im gezeigten Muster mit einem Kürbis auf dem mittleren Block. Eisengolems greifen deine Feinde an. + + Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man rohes Hühnchen im Ofen brät. - - Eisengolems erscheinen auch auf natürliche Art, um Dörfer zu verteidigen, und greifen dich an, falls du Dorfbewohner attackierst. + + Regeneriert 1,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. - - Du kannst diesen Bereich erst verlassen, wenn du das Tutorial abgeschlossen hast. + + Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Rindfleisch im Ofen brät. - - Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Schaufel verwenden, um weiches Material wie Erde und Sand abzubauen. + + Kann dich, ein Tier oder ein Monster auf Schienen transportieren. - - Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Axt verwenden, um Baumstämme abzuhacken. + + Wird als Farbe verwendet, um Wolle hellblau zu färben. - - 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. + + Wird als Farbe verwendet, um Wolle cyanfarben zu färben. - - Manche Werkzeuge eignen sich besser, um Gegner anzugreifen. Probier zum Angreifen mal ein Schwert aus. + + Wird als Farbe verwendet, um Wolle lila zu färben. - - 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. + + Wird als Farbe verwendet, um Wolle hellgrün zu färben. - - 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. + + Wird als Farbe verwendet, um Wolle grau zu färben. - - Halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um nach oben zu schwimmen. + + 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.) - - 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. + + Wird als Farbe verwendet, um Wolle magentafarben zu färben. - - 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. + + Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. - - 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. + + Wird zur Herstellung von Büchern und Karten verwendet. - - 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. + + Kann zur Herstellung von Bücherregalen verwendet oder verzaubert werden, um Zauberbücher herzustellen. - - Wenn du den Cursor über den Rand der Oberfläche hinaus bewegst, während du einen Gegenstand trägst, kannst du den Gegenstand ablegen. + + Wird als Farbe verwendet, um Wolle blau zu färben. - - Du hast nicht alle Zutaten, die du brauchst, um diesen Gegenstand herzustellen. Das Feld unten links zeigt dir die benötigten Zutaten an. + + Spielt Schallplatten ab. - - 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! + + Hieraus kannst du sehr beständige Werkzeuge, Waffen und Rüstungen herstellen. - - {*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. - + + Wird als Farbe verwendet, um Wolle orange zu färben. - - Erinnerung: + + Wird von Schafen eingesammelt und kann mit Farben gefärbt werden. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Wird als Baumaterial verwendet und kann mit Farben gefärbt werden. Dieses Rezept ist nicht empfehlenswert, da man Wolle leicht von Schafen erhalten kann. - - Mit der aktuellen Version wurden dem Spiel neue Features hinzugefügt, darunter neue Gebiete in der Tutorial-Welt. + + Wird als Farbe verwendet, um Wolle schwarz zu färben. - - {*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. + + Wird verwendet, um Waren auf Schienen zu transportieren. - - In diesem Gebiet gibt es Bereiche, in denen du mehr über das Angeln, Boote, Kolben und Redstone erfahren kannst. + + Bewegt sich auf Schienen und kann andere Loren schieben, wenn du Kohle hineinlegst. - - 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! + + Wird verwendet, um schneller als schwimmend übers Wasser zu reisen. - - Deine Hungerleiste ist so weit geleert, dass du dich nicht mehr regenerieren kannst. + + Wird als Farbe verwendet, um Wolle grün zu färben. - - {*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. + + Wird als Farbe verwendet, um Wolle rot zu färben. - - Auswählen + + 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. - - Verwenden + + Wird als Farbe verwendet, um Wolle rosa zu färben. - - Zurück + + Wird als Farbe verwendet, um Wolle braun zu färben, als Zutat für Kekse oder um Kakaofrüchte zu züchten. - - Verlassen + + Wird als Farbe verwendet, um Wolle silbern zu färben. - - Abbrechen + + Wird als Farbe verwendet, um Wolle gelb zu färben. - - Beitritt abbrechen + + Erlaubt Fernangriffe mit Pfeilen. - - Online-Spiele aktualisieren + + Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. - - Partyspiele + + Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. - - Alle Spiele + + Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. - - Gruppe wechseln + + Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. - - Inventar + + Verleihen dem Spieler beim Tragen 2 Rüstungspunkte. - - Beschreibung + + Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. - - Zutaten + + Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. - - Crafting + + Ein glänzender Barren, aus dem du Werkzeuge herstellen kannst, die aus diesem Material bestehen. Entsteht, wenn du im Ofen Erz schmilzt. - - Erschaffen + + Ermöglicht es, aus Barren, Diamanten oder Farben platzierbare Blöcke zu erzeugen. Kann als teurer Baublock oder kompakter Erzspeicher verwendet werden. - - Nehmen/Ablegen + + 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. - - Nehmen + + Verleiht dem Spieler beim Tragen 8 Rüstungspunkte. - - Alles nehmen + + Verleiht dem Spieler beim Tragen 6 Rüstungspunkte. - - Hälfte nehmen + + Verleihen dem Spieler beim Tragen 3 Rüstungspunkte. - - Platzieren + + Verleiht dem Spieler beim Tragen 6 Rüstungspunkte. - - Alles platzieren + + Eisentüren können nur mit Redstone, Knöpfen oder Schaltern geöffnet werden. - - Eins platzieren + + Verleiht dem Spieler beim Tragen 1 Rüstungspunkt. - - Ablegen + + Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. - - Alles ablegen + + Wird verwendet, um Holzblöcke schneller als per Hand abzubauen. - - Eins ablegen + + Wird verwendet, um Erd- und Grasblöcke umzugraben und sie damit fürs Bepflanzen vorzubereiten. - - Tauschen + + Holztüren werden geöffnet, indem du sie verwendest, dagegen schlägst oder mittels Redstone. - - Verschieben + + Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. - - Schnellauswahl leeren + + Verleiht dem Spieler beim Tragen 4 Rüstungspunkte. - - Was ist das? + + Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. - - Auf Facebook teilen + + Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. - - Filter ändern + + Verleihen dem Spieler beim Tragen 1 Rüstungspunkt. + + + Verleiht dem Spieler beim Tragen 2 Rüstungspunkte. - - Freundschaftsanfrage + + Verleiht dem Spieler beim Tragen 5 Rüstungspunkte. - - Seite runter + + Wird zum Bau platzsparender Treppen verwendet. - - Seite hoch + + Wird verwendet, um Pilzsuppe aufzubewahren. Wenn die Suppe aufgegessen ist, behältst du die Schüssel. - - Weiter + + Wird zum Aufbewahren und zum Transport von Wasser, Lava und Milch verwendet. - - Zurück + + Wird zum Aufbewahren und zum Transport von Wasser verwendet. - - Spieler ausschließen + + Zeigt den Text an, den du oder andere Spieler eingegeben haben. - - Färben + + Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. - - Abbauen + + Erzeugt eine Explosion. Wird nach Platzieren mit dem Feuerzeug oder elektrisch gezündet. - - Füttern + + Wird zum Aufbewahren und zum Transport von Lava verwendet. - - Zähmen + + Zeigt die Position der Sonne und des Mondes an. - - Heilen + + Zeigt auf deinen Startpunkt. - - Sitz + + Erzeugt ein Abbild einer Gegend, bei deren Erforschung du sie in der Hand hattest. Nützlich, um den Weg zu finden. - - Folge mir + + Wird zum Aufbewahren und zum Transport von Milch verwendet. - - Auswerfen + + Kann Feuer erzeugen, TNT zünden und ein Portal nach dem Bau öffnen. - - Leeren + + Wird verwendet, um Fische zu fangen. - - Sattel + + 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. - - Platzieren + + Wird als Baumaterial und zur Herstellung vieler Dinge verwendet. Kann aus jeder Art von Holz hergestellt werden. - - Treffen + + Wird als Baumaterial verwendet. Zerfällt nicht wie normaler Sand durch die Schwerkraft. - - Melken + + Wird als Baumaterial verwendet. - - Sammeln + + Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. - - Essen + + Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. - - Schlafen + + Wird verwendet, um Licht zu erzeugen. Fackeln schmelzen außerdem Schnee und Eis. - - Aufwachen + + Wird zur Herstellung von Fackeln, Pfeilen, Schildern, Leitern, Zäunen und als Griff für Werkzeuge und Waffen verwendet. - - Spielen + + 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. - - Reiten + + 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. - - Segeln + + Wird verwendet, um sich in vertikaler Richtung zu bewegen. - - Anbauen + + 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. - - Hochschwimmen + + Erlaubt dir, eine größere Auswahl von Gegenständen zu erschaffen als beim normalen Crafting. - - Öffnen + + Erlaubt dir, Erz zu schmelzen, Holzkohle und Glas herzustellen sowie Fisch und Schweinefleisch zu kochen. - - Tonhöhe ändern + + Eisenaxt - - Explodieren + + Redstone-Lampe - - Lesen + + Dschungelholztreppe - - Hängen + + Birkenholztreppe - - Werfen + + Derzeitige Steuerung - - Pflanzen + + Schädel - - Umgraben + + Kakao - - Ernten + + Fichtenholztreppe - - Weiter + + Drachenei - - Vollständiges Spiel freischalten + + Endstein - - Spielstand löschen + + Endportalrahmen - - Löschen + + Sandsteintreppe - - Optionen + + Hohes Gras - - Freunde einladen + + Strauch - - Annehmen + + Layout - - Schere + + Crafting - - Level sperren + + Verwenden - - Skin auswählen + + Aktion - - Anzünden + + Schleichen/Runterfliegen - - Navigieren + + Schleichen - - Vollständiges Spiel installieren + + Ablegen - - Testversion installieren + + Gegenstand wechseln - - Installieren + + Pause - - Neu installieren + + Schauen - - Optionen + + Bewegen/Sprinten - - Kommando ausführen + + Inventar - - Kreativ + + Springen/Hochfliegen - - Zutat verschieben + + Springen - - Brennstoff verschieben + + Endportal - - Beweg-Werkzeug + + Kürbispflanze - - Rüstung bewegen + + Melone - - Waffe bewegen + + Glasscheibe - - Verwenden + + Zauntor - - Ziehen + + Ranken - - Loslassen + + Melonenpflanze - - Privilegien + + Eisengitter - - Blocken + + Rissige Steinziegel - - Seite hoch + + Bemooste Steinziegel - - Seite runter + + Steinziegel - - Liebesmodus + + Pilz - - Trinken + + Pilz - - Drehen + + Gemeißelter Steinziegel - - Ausblenden + + Ziegeltreppe - - Alle Plätze leeren + + Netherwarze - - O. K. + + Netherziegeltreppe - - Abbrechen + + Netherzaun - - Minecraft Store + + Kessel - - Möchtest du dieses Spiel wirklich verlassen und dem neuen beitreten? Dabei gehen nicht gespeicherte Fortschritte verloren. + + Braustand - - Spiel verlassen + + Zaubertisch - - Spiel speichern + + Netherziegel - - Verlassen ohne Speichern + + Silberfisch-Pflasterstein - - Willst du wirklich mit der aktuellen Version dieser Welt alle früheren Speicherdateien für diese Welt überschreiben? + + Silberfischstein - - Möchtest du wirklich ohne Speichern aufhören? Du verlierst dabei alle Fortschritte in dieser Welt! + + Steinziegeltreppe - - Spiel starten + + Seerosenblatt - - Speicherdatei beschädigt + + Myzel - - Diese Speicherdatei ist ungültig oder beschädigt. Möchtest du sie löschen? + + Silberfisch-Steinziegel - - Möchtest du wirklich zum Hauptmenü zurückkehren und alle Spieler vom Spiel trennen? Dabei gehen nicht gespeicherte Fortschritte verloren. + + Kameramodus ändern - - Verlassen und speichern + + 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. - - Verlassen ohne speichern + + 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. - - Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei gehen nicht gespeicherte Fortschritte verloren. + + 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. - - Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei geht dein Fortschritt verloren! + + Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Öffne dazu die Crafting-Oberfläche.{*PlanksIcon*} - - Neue Welt erschaffen + + 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*} - - Tutorial spielen + + 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. - - Tutorial + + Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Crafting-Oberfläche zu öffnen. - - Benenne deine Welt + + 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. - - Gib einen Namen für deine Welt ein. + + Mit{*CONTROLLER_ACTION_MOVE*} kannst du dich umherbewegen. - - Gib den Seed fürs Erstellen deiner Welt ein + + Mit{*CONTROLLER_ACTION_LOOK*} kannst du nach oben, unten und in die anderen Richtungen schauen. - - Gespeicherte Welt laden + + 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 START, um beizutreten + + 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. - - Spiel verlassen + + Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen. - - Es ist ein Fehler aufgetreten. Zurück zum Hauptmenü. + + Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Erstell eine Werkbank.{*CraftingTableIcon*} - - Fehler beim Herstellen der Verbindung + + + 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. + - - Verbindung verloren. + + Container öffnen - - Die Verbindung zum Server wurde unterbrochen. Zurück zum Hauptmenü. + + 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*} - - Die Verbindung zum Server wurde getrennt. + + 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 wurdest aus dem Spiel ausgeschlossen. + + 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. + - - Du wurdest wegen Fliegens aus dem Spiel ausgeschlossen. + + In der Nähe gibt es einen verlassenen Unterstand von Minenarbeitern, den du fertigstellen kannst, um nachts in Sicherheit zu sein. + - - Verbindungsversuch dauert zu lange. + + Mit einer Axt kannst du schneller Stämme und hölzerne Blöcke 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*} - - Der Server ist voll. + + 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. - - Der Host hat das Spiel verlassen. + + Wechsle mit{*CONTROLLER_ACTION_LEFT_SCROLL*} oder{*CONTROLLER_ACTION_RIGHT_SCROLL*} den Gegenstand in deiner Hand. - - Du kannst diesem Spiel nicht beitreten, da du mit niemandem in diesem Spiel befreundet bist. + + 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*} - - Du kannst diesem Spiel nicht beitreten, da du vom Host aus dem Spiel ausgeschlossen wurdest. + + 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*} - - Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine ältere Spielversion verwendet. + + Zeig mit dem Fadenkreuz auf die Werkbank und drück{*CONTROLLER_ACTION_USE*}, um sie zu öffnen. - - Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine neuere Spielversion verwendet. + + 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. - - Neue Welt + + 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. - - Preis freigeschaltet! + + - - Hurra – du hast ein Spielerbild mit Steve von Minecraft gewonnen! + + - - Hurra – du hast ein Spielerbild mit einem Creeper gewonnen! + + - - 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? + + - - Bitte warten + + - - Keine Ergebnisse + + - - Filter: + + Layout 1 - - Freunde + + Bewegen (beim Fliegen) - - Meine Punkte + + Spieler/Einladen - - Insgesamt + + - - Einträge: + + Layout 3 - - Rang + + Layout 2 - - Vorbereiten fürs Speichern des Levels + + - - Teile werden vorbereitet ... + + - - Wird finalisiert ... + + - - Gelände bauen + + - - Welt simulieren + + {*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. - - Server initialisieren + + {*B*}Drück zum Fortfahren{*CONTROLLER_VK_A*}. - - Startbereich generieren + + - - Startbereich laden + + - - Nether betreten + + - - Nether verlassen + + - - Erneut erscheinen + + - - Level generieren + + - - Level laden + + - - Spieler speichern + + - - Mit dem Host verbinden + + Silberfischblock - - Gelände herunterladen + + Steinstufe - - Wechsel in den Offline-Modus. + + Ein kompakter Eisenspeicher. - - Warte bitte, bis der Host das Spiel gespeichert hat. + + Eisenblock - - Das ENDE betreten + + Eichenholzstufe - - Das ENDE verlassen + + Sandsteinstufe - - Dieses Bett ist belegt. + + Steinstufe - - Du kannst nur nachts schlafen. + + Ein kompakter Goldspeicher. - - %s schläft in einem Bett. Um zum Sonnenaufgang vorzuspringen, müssen alle Spieler gleichzeitig in Betten schlafen. + + Blume - - Dein Bett fehlt oder ist versperrt. + + Weiße Wolle - - Du kannst dich jetzt nicht ausruhen, es sind Monster in der Nähe. + + Orangefarbene Wolle - - Du schläfst in einem Bett. Um zum Sonnenaufgang zu wechseln, müssen alle Spieler gleichzeitig schlafen. + + Goldblock - - Werkzeuge und Waffen + + Pilz - - Waffen + + Rose - - Nahrung + + Pflastersteinstufe - - Strukturen + + Bücherregal - - Rüstung + + TNT - - Mechanismen + + Ziegel - - Transport + + Fackel - - Dekorationen + + Obsidian - - Blöcke bauen + + Bemooster Pflasterstein - - Redstone und Transport + + Netherziegelstufe - - Verschiedenes + + Eichenholzstufe - - Brauen + + Steinziegelstufe - - Werkzeuge, Waffen und Rüstungen + + Ziegelstufe - - Materialien + + Dschungelholzstufe - - Abgemeldet + + Birkenholzstufe - - Schwierigkeit + + Fichtenholzstufe - - Musik + + Magentafarbene Wolle - - Sound + + Birkenblätter - - Gamma + + Fichtenblätter - - Spielempfindlichkeit + + Eichenblätter - - Menüempfindlichkeit + + Glas - - Friedlich + + Schwamm - - Leicht + + Dschungelblätter - - Normal + + Blätter - - Schwierig + + Eiche - - In diesem Modus regeneriert sich deine Gesundheit mit der Zeit, und es gibt keine Gegner in der Welt. + + Fichte - - In diesem Modus erscheinen Gegner in der Umgebung, sie fügen dem Spieler aber weniger Schaden zu als im normalen Modus. + + Birke - - In diesem Modus erscheinen Gegner in der Umgebung und fügen dem Spieler eine normale Menge Schaden zu. + + Fichtenholz - - 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! + + Birkenholz - - Testversion abgelaufen + + Dschungelholz - - Spiel voll + + Wolle - - Fehler beim Spielbeitritt, da keine Plätze mehr frei sind. + + Rosa Wolle - - Schildtext eingeben + + Graue Wolle - - Gib eine Textzeile für dein Schild ein. + + Hellgraue Wolle - - Titel eingeben + + Hellblaue Wolle - - Gib einen Titel für deinen Beitrag ein. + + Gelbe Wolle - - Überschrift eingeben + + Hellgrüne Wolle - - Gib eine Überschrift für deinen Beitrag ein. + + Cyanfarbene Wolle - - Beschreibung eingeben + + Grüne Wolle - - Gib eine Beschreibung für deinen Beitrag ein. + + Rote Wolle - - Inventar + + Schwarze Wolle - - Zutaten + + Lila Wolle - - Braustand + + Blaue Wolle - - Truhe + + Braune Wolle - - Verzaubern + + Fackel (Kohle) - - Ofen + + Glowstone - - Zutat + + Seelensand - - Brennstoff + + Netherrack - - Dispenser + + Lapislazuliblock - - Es stehen derzeit keine entsprechenden Inhalte zum Herunterladen für diesen Titel zur Verfügung. + + Lapislazulierz - - %s ist dem Spiel beigetreten. + + Portal - - %s hat das Spiel verlassen. + + Kürbislaterne - - %s wurde aus dem Spiel ausgeschlossen. + + Zuckerrohr - - Möchtest du diesen Spielstand wirklich löschen? + + Lehm - - Wird genehmigt ... + + Kaktus - - Zensiert + + Kürbis - - Jetzt wird gespielt: + + Zaun - - Einstellungen zurücksetzen + + Jukebox - - Möchtest du deine Einstellungen wirklich auf die Standardwerte zurücksetzen? + + Ein kompakter Lapislazulispeicher. - - Ladefehler + + Falltür - - Spiel von %s + + Verschlossene Truhe - - Unbekanntes Hostspiel + + Diode - - Gast abgemeldet + + Haftender Kolben - - Ein Gastspieler hat sich abgemeldet, dadurch wurden alle Gastspieler aus dem Spiel entfernt. + + Kolben - - Anmelden + + Wolle (beliebige Farbe) - - Du bist derzeit nicht angemeldet. Du musst angemeldet sein, um dieses Spiel zu spielen. Möchtest du dich jetzt anmelden? + + Toter Strauch - - Multiplayer nicht möglich + + Kuchen - - Fehler beim Erstellen des Spiels + + Notenblock - - Automatisch ausgewählt + + Dispenser - - Kein Paket: Standard-Skins + + Hohes Gras - - Skin-Favoriten + + Netz - - Gesperrter Level + + Bett - - 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. + + Eis - - Diesen Level sperren? + + Werkbank - - Möchtest du diesen Level wirklich deiner Liste gesperrter Level hinzufügen? -Wenn du O. K. auswählst, verlässt du dieses Spiel. + + Ein kompakter Diamantspeicher. - - Von Liste gesperrter Level entfernen + + Diamantblock - - Speicherintervall + + Ofen - - Speicherintervall: AUS + + Ackerland - - Min + + Getreide - - Kann hier nicht platziert werden! + + Diamanterz - - Das Platzieren von Lava neben dem Wiedereintrittspunkt ist nicht gestattet, da sonst Spieler beim Wiedereintritt in den Level sofort sterben könnten. + + Monster-Spawner - - Durchsichtigkeit + + Feuer - - Autospeichern des Levels wird vorbereitet + + Fackel (Holzkohle) - - Displaygröße + + Redstone-Staub - - Displaygr. (geteilter Bildsch.) + + Truhe - - Seed + + Eichenholztreppe - - Skinpaket freischalten + + Schild - - Um die ausgewählte Skin zu verwenden, musst du dieses Skinpaket freischalten. -Möchtest du dieses Skinpaket jetzt freischalten? + + Redstone-Erz - - Texturpaket freischalten + + Eisentür - - Du musst das Texturpaket freischalten, um es für deine Welt zu verwenden. -Möchtest du es jetzt freischalten? + + Druckplatte - - Texturpaket-Testversion + + Schnee - - 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? + + Taste - - Texturpaket nicht verfügbar + + Redstone-Fackel - - Vollversion freischalten + + Hebel - - Testversion herunterladen + + Schiene - - Vollversion herunterladen + + Leiter - - Diese Welt verwendet ein Mash-up-Paket oder Texturpaket, das dir fehlt! -Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? + + Holztür - - Testversion holen + + Steintreppe - - Vollständiges Spiel holen + + Detektor-Schiene - - Spieler ausschließen + + Booster-Schiene - - 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. + + Du hast genügend Pflastersteine gesammelt, um einen Ofen zu bauen. Verwende deine Werkbank, um einen herzustellen. - - Spielerbilder-Paket + + Angel - - Themen + + Uhr - - Skinpaket + + Glowstone-Staub - - Freunde von Freunden zulassen + + Lore mit Ofen - - Du kannst diesem Spiel nicht beitreten, da es auf Spieler beschränkt wurde, die mit dem Host befreundet sind. + + Ei - - Spielbeitritt nicht möglich + + Kompass - - Ausgewählt + + Roher Fisch - - Ausgewählte Skin: + + Rosenrot - - Inhalte zum Herunterladen def. + + Kaktusgrün - - 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. + + Kakaobohnen - - 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. + + Gekochter Fisch - - Dein Spielmodus wurde geändert. + + Farbpulver - - Welt umbenennen + + Tintensack - - Gib den neuen Namen für deine Welt ein. + + Lore mit Truhe - - Spielmodus: Überleben + + Schneeball - - Spielmodus: Kreativ + + Boot - - Überleben + + Leder - - Kreativ + + Lore - - Im Überlebensmodus + + Sattel - - Im Kreativmodus + + Redstone - - Wolken erstellen + + Milcheimer - - Was möchtest du mit diesem Spielstand tun? + + Papier - - Spielstand umbenennen + + Buch - - Automatisches Speichern in %d ... + + Schleimball - - Ein + + Ziegel - - Aus + + Lehm - - Normal + + Zuckerrohr - - Superflach + + Lapislazuli - - Wenn dies aktiviert ist, ist das Spiel online. + + Karte - - Wenn dies aktiviert ist, können nur eingeladene Spieler beitreten. + + Schallplatte - „13“ - - Wenn dies aktiviert ist, können nur Freunde von Leuten auf deiner Freundeliste dem Spiel beitreten. + + Schallplatte - „cat“ - - Aktiviert, dass Spieler sich gegenseitig Schaden zufügen können. Hat nur Einfluss auf den Überlebensmodus. + + Bett - - Wenn deaktiviert, können Spieler, die dem Spiel beitreten, nicht bauen oder abbauen, bis sie autorisiert wurden. + + Redstone-Repeater - - Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. + + Keks - - Aktiviert, dass aktiviertes TNT explodiert. + + Schallplatte - „blocks“ - - 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. + + Schallplatte - „mellohi“ - - Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden. + + Schallplatte - „stal“ - - Aktiviert, dass eine völlig flache Welt in der Oberwelt und im Nether erschaffen wird. + + Schallplatte - „strad“ - - Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird. + + Schallplatte - „chirp“ - - Skinpakete + + Schallplatte - „far“ - - Themen + + Schallplatte - „mall“ - - Spielerbilder + + Kuchen - - Avatargegenstände + + Graue Farbe - - Texturpakete + + Rosa Farbe - - Mash-up-Pakete + + Hellgrüne Farbe - - {*PLAYER*} ist in Flammen aufgegangen. + + Lila Farbe - - {*PLAYER*} ist zu Tode verbrannt. + + Farbe Cyan - - {*PLAYER*} hat versucht, in Lava zu schwimmen. + + Hellgraue Farbe - - {*PLAYER*} ist in einer Wand erstickt. + + Löwenzahngelb - - {*PLAYER*} ist ertrunken. + + Knochenmehl - - {*PLAYER*} ist verhungert. + + Knochen - - {*PLAYER*} wurde erstochen. + + Zucker - - {*PLAYER*} ist zu hart auf dem Boden aufgeschlagen. + + Hellblaue Farbe - - {*PLAYER*} ist aus der Welt herausgefallen. + + Farbe Magenta - - {*PLAYER*} ist gestorben. + + Farbe Orange - - {*PLAYER*} ist in die Luft gegangen. + + Schild - - {*PLAYER*} wurde durch Magie getötet. + + Ledertunika - - {*PLAYER*} wurde durch Enderdrachen-Odem getötet. + + Eisenbrustplatte - - {*PLAYER*} wurde durch {*SOURCE*} getötet. + + Diamantbrustplatte - - {*PLAYER*} wurde durch {*SOURCE*} getötet. + + Eisenhelm - - {*PLAYER*} wurde von {*SOURCE*} erschossen. + + Diamanthelm - - {*PLAYER*} starb durch einen Feuerball von {*SOURCE*}. + + Goldhelm - - {*PLAYER*} wurde von {*SOURCE*} erschlagen. + + Goldbrustplatte - - {*PLAYER*} wurde durch {*SOURCE*} getötet. + + Goldhose - - Grundgesteinnebel + + Lederstiefel - - Display anzeigen + + Eisenstiefel - - Hand anzeigen + + Lederhose - - Todesmeldungen + + Eisenhose - - Animierte Spielfigur + + Diamanthose - - Eigene Skin-Animation + + Lederkappe - - Du kannst nicht mehr graben und keine Gegenstände mehr verwenden. + + Steinhacke - - Du kannst jetzt graben und Gegenstände verwenden. + + Eisenhacke - - Du kannst keine Blöcke mehr platzieren. + + Diamanthacke - - Du kannst jetzt Blöcke platzieren. + + Diamantaxt - - Du kannst jetzt Türen und Schalter verwenden. + + Goldaxt - - Du kannst keine Türen und Schalter mehr verwenden. + + Holzhacke - - Du kannst jetzt Container (z. B. Truhen) verwenden. + + Goldhacke - - Du kannst keine Container (z. B. Truhen) mehr verwenden. + + Kettenbrustplatte - - Du kannst keine NPCs mehr angreifen. + + Kettenhose - - Du kannst jetzt NPCs angreifen. + + Kettenstiefel - - Du kannst keine Spieler mehr angreifen. + + Holztür - - Du kannst jetzt Spieler angreifen. + + Eisentür - - Du kannst keine Tiere mehr angreifen. + + Kettenhelm - - Du kannst jetzt Tiere angreifen. + + Diamantstiefel - - Du bist jetzt ein Moderator. + + Feder - - Du bist kein Moderator mehr. + + Schießpulver - - Du kannst jetzt fliegen. + + Weizensamen - - Du kannst nicht mehr fliegen. + + Schüssel - - Du wirst keine Erschöpfung mehr spüren. + + Pilzsuppe - - Du wirst jetzt wieder Erschöpfung spüren. + + Faden - - Du bist jetzt unsichtbar. + + Weizen - - Du bist nicht mehr unsichtbar. + + Gekochtes Schweinefleisch - - Du bist jetzt unverwundbar. + + Gemälde - - Du bist nicht mehr unverwundbar. + + Goldener Apfel - - %d MSP + + Brot - - Enderdrache + + Feuerstein - - %s hat das Ende betreten. + + Rohes Schweinefleisch - - %s hat das Ende verlassen. + + Stock - - {*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 Furcht einflößend, als auf die Realität hinter dem Bildschirm zu starren.{*EF*}{*B*}{*B*} -{*C3*}Früher haben sie Stimmen gehört. Ehe 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*} + + Eimer - - {*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 Kilometern 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*} + + Wassereimer - - {*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*} + + Lavaeimer - - Nether zurücksetzen + + Goldstiefel - - 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! + + Eisenbarren - - Nether zurücksetzen + + Goldbarren - - Nether nicht zurücksetzen + + Feuerzeug - - Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. + + Kohle - - Eintrittsei kann momentan nicht verwendet werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. + + Holzkohle - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Pilzkühen wurde erreicht. + + Diamant - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Wölfen in einer Welt wurde erreicht. + + Apfel - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Hühnern in einer Welt wurde erreicht. + + Bogen - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Tintenfischen in einer Welt wurde erreicht. + + Pfeil - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Feinden in einer Welt wurde erreicht. + + Schallplatte - „ward“ - - Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Dorfbewohnern in einer Welt wurde erreicht. + + 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*} - - Die Höchstanzahl von Gemälden/Gegenstandsrahmen in einer Welt wurde erreicht. + + 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*} - - Im friedlichen Modus kannst du keine Feinde erscheinen lassen. + + 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. - - Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Schweine, Schafe, Kühe und Katzen wurde erreicht. + + 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. - - Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Wölfe wurde erreicht. + + 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*} + + + Ä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*} - - Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Hühner wurde erreicht. + + 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*} - - Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pilzkühe wurde erreicht. + + 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. - - Die Höchstanzahl von Booten in einer Welt wurde erreicht. + + 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. + - - Die Höchstanzahl von NPC-Köpfen in einer Welt wurde erreicht. + + 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ähle dann den herzustellenden Gegenstand mit{*CONTROLLER_MENU_NAVIGATE*} aus. + - - Sicht umkehren + + Jetzt wird die Liste der Zutaten angezeigt, die benötigt werden, um den ausgewählten Gegenstand herzustellen. - - Linkshänder + + Jetzt wird die Beschreibung des derzeit ausgewählten Gegenstands angezeigt. Die Beschreibung hilft dir zu verstehen, wofür der Gegenstand eingesetzt werden kann. - - Gestorben! + + 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. - - Wieder erscheinen + + Manche Gegenstände kannst du nicht mit der Werkbank herstellen, sondern brauchst dafür einen Ofen. Stell jetzt einen Ofen her.{*FurnaceIcon*} - - Inhalte zum Herunterladen + + Kies - - Skin ändern + + Golderz - - So wird gespielt + + Eisenerz - - Steuerung + + Lava - - Einstellungen + + Sand - - Mitwirkende + + Sandstein - - Inhalte neu installieren + + Kohlenerz - - Debug-Einstellungen + + {*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man einen Ofen verwendet. - - Feuer breitet sich aus + + 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. - - TNT explodiert + + 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. - - Spieler gegen Spieler + + Baumstamm - - Spielern vertrauen + + Eichenholz - - Hostprivilegien + + 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. - - Strukturen erzeugen + + {*B*} + Drück{*CONTROLLER_VK_X*}, um wieder das Inventar anzuzeigen. - - Superflache Welt + + {*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Inventar verwendet wird. - - Bonustruhe + + + 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. + - - Weltoptionen + + {*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. - - Kann bauen und abbauen + + Wenn du den Cursor mit einem Gegenstand über den Rand der Oberfläche hinaus bewegst, kannst du den Gegenstand ablegen. + - - Kann Türen und Schalter verwenden + + 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. + - - Kann Container öffnen + + + 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. + - - Kann Spieler angreifen + + Du hast den ersten Teil des Tutorials abgeschlossen. - - Kann Tiere angreifen + + 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? - - Moderator + + 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? - - Spieler ausschließen + + Drück{*CONTROLLER_ACTION_USE*}, um den Ofen in der Welt zu platzieren, und öffne ihn dann. - - Kann fliegen + + 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*} - - Erschöpfung deaktivieren + + 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. - - Unsichtbar + + 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*} - - Hostoptionen + + + Wenn du mehr Informationen über einen Gegenstand brauchst, bewege den Cursor über den Gegenstand und drücke {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Spieler/Einladen + + + Dies ist die Crafting-Oberfläche. Hier kannst du gesammelte Gegenstände kombinieren, um neue Gegenstände herzustellen. + - - Online-Spiel + + Drück jetzt{*CONTROLLER_VK_B*}, um das Kreativmodus-Inventar zu verlassen. + - - Nur mit Einladung + + + Wenn du mehr Informationen über einen Gegenstand brauchst, bewege den Cursor über den Gegenstand und drücke {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Weitere Optionen + + {*B*} + Drück{*CONTROLLER_VK_X*}, um die Zutaten anzuzeigen, die du für den aktuellen Gegenstand benötigst. - - Laden + + {*B*} + Drück{*CONTROLLER_VK_X*}, um eine Beschreibung des Gegenstands anzuzeigen. - - Neue Welt + + {*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man craftet. - - Weltname + + 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. + - - Seed für den Weltengenerator + + {*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. - - Freilassen für zufälligen Seed + + 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. - - Spieler + + Drück jetzt{*CONTROLLER_VK_B*}, um das Inventar zu verlassen. - - Spiel beitreten + + 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. + - - Spiel starten + + + 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. + - - Keine Spiele gefunden + + + 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. + - - Spielen + + Wasser - - Bestenlisten + + Glasflasche - - Hilfe und Optionen + + Wasserflasche - - Vollständiges Spiel freischalten + + Spinnenauge - - Spiel fortsetzen + + Goldklumpen - - Spiel speichern + + Netherwarze - - Schwierigkeit: + + {*prefix*}{*splash*}Trank {*postfix*} - - Spieltyp: + + Ferment. Spinnenauge - - Strukturen: + + Kessel - - Leveltyp: + + Enderauge - - PvP: + + Funkelnde Melone - - Spielern vertrauen: + + Lohenstaub - - TNT: + + Magmacreme - - Feuer breitet sich aus: + + Braustand - - Design neu installieren + + Ghastträne - - Spielerbild 1 neu installieren + + Kürbissamen - - Spielerbild 2 neu installieren + + Melonensamen - - Avatar-Gegenstand 1 neu installieren + + Rohes Hühnchen - - Avatar-Gegenstand 2 neu installieren + + Schallplatte - „11“ - - Avatar-Gegenstand 3 neu installieren + + Schallplatte - „where are we now“ - - Optionen + + Schere - - Audio + + Gebratenes Hühnchen - - Steuerung + + Enderperle - - Grafik + + Melonenscheibe - - Benutzeroberfläche + + Lohenrute - - Standardeinstellungen + + Rohes Rindfleisch - - Kamerabewegung ansehen + + Steak - - Tipps + + Verrottetes Fleisch - - Spiel-QuickInfos + + Erfahrungsfläschchen - - 2 Spieler, geteilter Bildschirm + + Eichenholzbretter - - Fertig + + Fichtenholzbretter - - Schildnachricht ändern: + + Birkenholzbretter - - Gib erklärende Texte zu deinem Screenshot ein. + + Grasblock - - Überschrift + + Erde - - Screenshot aus dem Spiel + + Pflasterstein - - Schildnachricht ändern: + + Dschungelholzbretter - - Die klassischen Texturen, Symbole und Benutzeroberfläche aus Minecraft! + + Birkensetzling - - Alle Mash-up-Welten anzeigen + + Dschungelbaumsetzling - - Keine Effekte + + Bedrock - - Geschwindigkeit + + Setzling - - Langsamkeit + + Eichensetzling - - Grabeile + + Fichtensetzling - - Grabmüdigkeit + + Stein - - Stärke + + Gegenstandsrahmen - - Schwäche + + {*CREATURE*} erzeugen - - Sofortgesundheit + + Netherziegel - - Sofortschaden + + Feuerkugel - - Sprungverstärkung + + Feuerkugel (Holzkohle) - - Verwirrtheit + + Feuerkugel (Kohle) - - Regeneration + + Schädel - - Widerstand + + Kopf - - Feuerwiderstand + + Kopf von %s - - Wasseratmung + + Creeper-Kopf - - Unsichtbarkeit + + Skelettschädel - - Blindheit + + Dörrskelettschädel - - Nachtsicht + + Zombiekopf - - Hunger + + Eine komplexe Art der Kohlelagerung. Kann als Brennstoff in einem Ofen verwendet werden. Gift - - der Geschwindigkeit + + Hunger der Langsamkeit - - der Grabeile + + der Geschwindigkeit - - der Langsamkeit + + Unsichtbarkeit - - der Stärke + + Wasseratmung - - der Schwäche + + Nachtsicht - - der Heilung + + Blindheit des Schadens - - der Sprungverstärkung + + der Heilung der Verwirrtheit @@ -4998,29 +5852,38 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? der Regeneration - - des Widerstands + + der Langsamkeit - - des Feuerwiderstands + + der Grabeile - - der Wasseratmung + + der Schwäche - - der Unsichtbarkeit + + der Stärke - - der Blindheit + + Feuerwiderstand + + + Sättigung + + + des Widerstands - - der Nachtsicht + + der Sprungverstärkung - - des Hungers + + Austrockung - - des Gifts + + Gesundheitsverstärkung + + + Absorption @@ -5031,29 +5894,41 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? III + + der Unsichtbarkeit + IV - - Wurf- + + der Wasseratmung - - Mondäner + + des Feuerwiderstands - - Uninteressanter + + der Nachtsicht - - Fader + + des Gifts - - Farbloser + + des Hungers - - Milchiger + + der Absorption - - Diffuser + + der Sättigung + + + der Gesundheitsverstärkung + + + der Blindheit + + + des Zerfalls Schlichter @@ -5061,17 +5936,17 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Dünner - - Seltsamer + + Diffuser - - Flacher + + Farbloser - - Bauchiger + + Milchiger - - Gepfuschter + + Seltsamer Gebutterter @@ -5079,246 +5954,300 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Glatter - - Sanfter + + Gepfuschter - - Gefälliger + + Flacher - - Dicker + + Bauchiger - - Eleganter + + Fader - - Aparter + + Wurf- - - Charmanter + + Mondäner + + + Uninteressanter Schneidiger - - Veredelter - Belebender + + Charmanter + + + Eleganter + + + Aparter + Prickelnder + + Kräftiger + + + Harscher + + + Geruchloser + Potenter Fauler - - Geruchloser + + Sanfter - - Kräftiger + + Veredelter - - Harscher + + Dicker - - Beißender + + Gefälliger - - Ekliger + + Stellt mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern wieder her. - - Stinkender + + Verschlechtert sofort die Gesundheit betroffener Spieler, Tiere und Monster. - - Dient als Basis für alle Tränke. Wird in einem Braustand verwendet, um Tränke zu brauen. + + Macht die betroffenen Spieler, Tiere und Monster immun gegen Schaden durch Feuer, Lava und Fernangriffe von Lohen. 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. + + Beißender Verkleinert die Bewegungsgeschwindigkeit betroffener Spieler, Tiere und Monster sowie die Sprintgeschwindigkeit, die Sprungweite und das Gesichtsfeld von Spielern. + + Vergrößert 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. + + Verbessert sofort die Gesundheit betroffener Spieler, Tiere und Monster. + Verringert den Schaden, den betroffene Spieler und Monster beim Angreifen anrichten. - - Verbessert sofort die Gesundheit betroffener Spieler, Tiere und Monster. + + Dient als Basis für alle Tränke. Wird in einem Braustand verwendet, um Tränke zu brauen. - - Verschlechtert sofort die Gesundheit betroffener Spieler, Tiere und Monster. + + Ekliger - - Stellt mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern wieder her. + + Stinkender - - Macht die betroffenen Spieler, Tiere und Monster immun gegen Schaden durch Feuer, Lava und Fernangriffe von Lohen. + + Bann + + + Schärfe Verringert mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern. - - Schärfe + + Angriffsschaden - - Bann + + Rückstoß Nemesis der Gliederfüßer - - Rückstoß + + Geschwindigkeit - - Verbrennung + + Zombie-Verstärkungen - - Schutz + + Pferdesprungstärke + + + Bei Anwendung: + + + Rückstoßwiderstand + + + NPC-Verfolgungsreichweite + + + Max. Gesundheit + + + Behutsamkeit + + + Effizienz + + + Wasseraffinität + + + Glück + + + Plünderung + + + Haltbarkeit Feuerschutz + + Schutz + + + Verbrennung + Federfall - - Explosionsschutz + + Atmung Schusssicher - - Atmung - - - Wasseraffinität + + Explosionsschutz - - Effizienz + + IV - - Behutsamkeit + + V - - Haltbarkeit + + VI - - Plünderung + + Schlag - - Glück + + VII - - Stärke + + III Feuer - - Schlag + + Stärke Unendlichkeit - - I - II - - III - - - IV + + I - - V + + Wird aktiviert, wenn sich ein Objekt durch einen angeschlossenen Stolperdraht bewegt. - - VI + + Aktiviert einen angeschlossenen Stolperdrahthaken, wenn sich ein Objekt hindurchbewegt. - - VII + + Ein kompakter Smaragdspeicher. - - VIII + + Ähnlich wie eine Truhe, nur stehen Gegenstände, die du in eine Endertruhe legst, in jeder deiner Endertruhen zur Verfügung, sogar in anderen Dimensionen. IX - - X + + VIII Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Smaragde zu erhalten. - - Ähnlich wie eine Truhe, nur stehen Gegenstände, die du in eine Endertruhe legst, in jeder deiner Endertruhen zur Verfügung, sogar in anderen Dimensionen. - - - Wird aktiviert, wenn sich ein Objekt durch einen angeschlossenen Stolperdraht bewegt. + + X - - Aktiviert einen angeschlossenen Stolperdrahthaken, wenn sich ein Objekt hindurchbewegt. + + Regeneriert 2{*ICON_SHANK_01*} und kann zu einer goldenen Karotte verarbeitet werden. Kann auf Ackerland gepflanzt werden. - - Ein kompakter Smaragdspeicher. + + Wird als Dekoration verwendet. Blumen, Setzlinge, Kakteen und Pilze können hineingepflanzt werden. Eine Mauer aus Pflasterstein. - - Damit können Waffen, Werkzeuge und Rüstungen repariert werden. + + Regeneriert 0,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Kann auf Ackerland gepflanzt werden. Geschmolzen in einem Ofen, um Netherquarz herzustellen. - - Wird als Dekoration verwendet. + + Damit können Waffen, Werkzeuge und Rüstungen repariert werden. Kann mit Dorfbewohnern gehandelt werden. - - Wird als Dekoration verwendet. Blumen, Setzlinge, Kakteen und Pilze können hineingepflanzt werden. + + Wird als Dekoration verwendet. - - Regeneriert 2{*ICON_SHANK_01*} und kann zu einer goldenen Karotte verarbeitet werden. Kann auf Ackerland gepflanzt werden. + + Regeneriert 4{*ICON_SHANK_01*}. - - Regeneriert 0,5{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Kann auf Ackerland gepflanzt werden. + + Regeneriert 1{*ICON_SHANK_01*}. Der Verzehr kann dich vergiften. + + + Wird dazu verwendet, ein gesatteltes Schwein beim Reiten zu lenken. Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man eine Kartoffel im Ofen brät. - - Regeneriert 1{*ICON_SHANK_01*} oder kann im Ofen gebraten werden. Kann auf Ackerland gepflanzt werden. Der Verzehr kann dich vergiften. - Regeneriert 3{*ICON_SHANK_01*}. Aus einer Karotte und Goldklumpen hergestellt. - - Wird dazu verwendet, ein gesatteltes Schwein beim Reiten zu lenken. - - - Regeneriert 4{*ICON_SHANK_01*}. - Wird mit einem Amboss verwendet, um Waffen, Werkzeuge und Rüstungen zu verzaubern. Entsteht beim Abbau von Netherquarzerz. Kann zu einem Quarzblock verarbeitet werden. + + Kartoffel + + + Ofenkartoffel + + + Karotte + Aus Wolle hergestellt. Wird als Dekoration verwendet. @@ -5328,14 +6257,11 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Blumentopf - - Karotte - - - Kartoffel + + Kürbiskuchen - - Ofenkartoffel + + Zauberbuch Giftige Kartoffel @@ -5346,11 +6272,11 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Karottenrute - - Kürbiskuchen + + Stolperdrahthaken - - Zauberbuch + + Stolperdraht Netherquarz @@ -5361,11 +6287,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Endertruhe - - Stolperdrahthaken - - - Stolperdraht + + Bemooste Pflastersteinmauer Smaragdblock @@ -5373,8 +6296,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Pflastersteinmauer - - Bemooste Pflastersteinmauer + + Kartoffeln Blumentopf @@ -5382,8 +6305,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Karotten - - Kartoffeln + + Leicht beschädigter Amboss Amboss @@ -5391,8 +6314,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Amboss - - Leicht beschädigter Amboss + + Quarzblock Stark beschädigter Amboss @@ -5400,8 +6323,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Netherquarzerz - - Quarzblock + + Quarzstufen Gemeißelter Quarzblock @@ -5409,8 +6332,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Quarzsäule - - Quarzstufen + + Roter Teppich Teppich @@ -5418,8 +6341,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Schwarzer Teppich - - Roter Teppich + + Blauer Teppich Grüner Teppich @@ -5427,9 +6350,6 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Brauner Teppich - - Blauer Teppich - Lilafarbener Teppich @@ -5442,18 +6362,18 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Grauer Teppich - - Rosafarbener Teppich - Hellgrüner Teppich - - Gelber Teppich + + Rosafarbener Teppich Hellblauer Teppich + + Gelber Teppich + Pinker Teppich @@ -5466,88 +6386,83 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Gemeißelter Sandstein - - Glatter Sandstein - {*PLAYER*} starb beim Angriff auf {*SOURCE*}. + + Glatter Sandstein + {*PLAYER*} wurde von einem fallenden Amboss zerquetscht. {*PLAYER*} wurde von einem fallenden Block zerquetscht. - - {*PLAYER*} wurde zu {*DESTINATION*} teleportiert. - {*PLAYER*} hat dich an seine/ihre Position teleportiert. - - {*PLAYER*} hat sich zu dir teleportiert. + + {*PLAYER*} wurde zu {*DESTINATION*} teleportiert. Dornen - - Quarzstufe + + {*PLAYER*} hat sich zu dir teleportiert. Lässt dunkle Bereiche wie bei Tageslicht erscheinen, sogar unter Wasser. + + Quarzstufe + Macht betroffene Spieler, Tiere und Monster unsichtbar. Reparieren/Benennen - - Verzauberungskosten: %d - Zu teuer! - - Umbenennen + + Verzauberungskosten: %d Du hast: - - Für Handel erfdl. Gegenst. + + Umbenennen {*VILLAGER_TYPE*} bietet %s - - Reparieren + + Für Handel erfdl. Gegenst. Handel - - Halsband färben + + Reparieren Dies ist die Amboss-Oberfläche. Hier kannst du Waffen, Rüstungen oder Werkzeuge umbenennen, reparieren und verzaubern, büßt aber dafür Erfahrungslevel ein. - - - {*B*} - Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Amboss-Oberfläche erfahren möchtest.{*B*} - Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Amboss-Oberfläche weißt. - + + Halsband färben Um einen Gegenstand zu bearbeiten, lege ihn in den ersten Eingabeplatz. - + - Wenn das richtige Rohmaterial in den zweiten Eingabeplatz gelegt wird, (für ein beschädigtes Eisenschwert z. B. Eisenbarren), erscheint die vorgeschlagene Reparatur im Ausgabeplatz. + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Amboss-Oberfläche erfahren möchtest.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Amboss-Oberfläche weißt. @@ -5555,9 +6470,9 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Alternativ kann ein zweiter, identischer Gegenstand in den zweiten Platz gelegt werden, um die beiden Gegenstände zu kombinieren. - + - Um Gegenstände auf dem Amboss zu verzaubern, lege ein Zauberbuch in den zweiten Eingabeplatz. + Wenn das richtige Rohmaterial in den zweiten Eingabeplatz gelegt wird, (für ein beschädigtes Eisenschwert z. B. Eisenbarren), erscheint die vorgeschlagene Reparatur im Ausgabeplatz. @@ -5565,9 +6480,9 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Unter der Ausgabe wird angezeigt, wie viele Erfahrungslevel diese Arbeit kosten wird. Wenn du nicht genügend Erfahrungslevel hast, kann die Reparatur nicht ausgeführt werden. - + - Der Gegenstand lässt sich umbenennen, indem man den Namen bearbeitet, der im Textfeld angezeigt wird. + Um Gegenstände auf dem Amboss zu verzaubern, lege ein Zauberbuch in den zweiten Eingabeplatz. @@ -5575,10 +6490,10 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Beim Aufnehmen des reparierten Gegenstands werden beide Gegenstände verbraucht, die der Amboss verwendet hat, und dein Erfahrungslevel um den angegebenen Wert verringert. - + - In diesem Gebiet gibt es einen Amboss und eine Truhe mit Werkzeugen und Waffen, die du bearbeiten kannst. - + Der Gegenstand lässt sich umbenennen, indem man den Namen bearbeitet, der im Textfeld angezeigt wird. + @@ -5587,19 +6502,19 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Drück{*CONTROLLER_VK_B*}, wenn du schon alles über den Amboss weißt. - + - Mit einem Amboss können Waffen und Werkzeuge repariert werden, um ihre Haltbarkeit wiederherzustellen. Du kannst sie auch umbenennen oder mit Zauberbüchern verzaubern. - + In diesem Gebiet gibt es einen Amboss und eine Truhe mit Werkzeugen und Waffen, die du bearbeiten kannst. + Zauberbücher kannst du in Truhen in Dungeons finden oder aus normalen Büchern herstellen, die du auf dem Zaubertisch verzauberst. - + - Die Benutzung des Ambosses kostet Erfahrungslevel, und bei jeder Benutzung kann der Amboss unter Umständen beschädigt werden. + Mit einem Amboss können Waffen und Werkzeuge repariert werden, um ihre Haltbarkeit wiederherzustellen. Du kannst sie auch umbenennen oder mit Zauberbüchern verzaubern. @@ -5607,8 +6522,9 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Die Art der Arbeit, der Wert des Gegenstands, die Zahl der Verzauberungen und die Anzahl vorheriger Arbeitsgänge haben alle Einfluss auf die Reparaturkosten. - - Beim Umbenennen ändert sich der Name eines Gegenstands für alle Spieler und die Kosten vorheriger Arbeitsgänge werden dauerhaft verringert. + + + Die Benutzung des Ambosses kostet Erfahrungslevel, und bei jeder Benutzung kann der Amboss unter Umständen beschädigt werden. @@ -5616,9 +6532,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? In der Truhe in diesem Gebiet findest du beschädigte Spitzhacken, Rohmaterialien, Erfahrungsfläschchen und Zauberbücher zum Experimentieren. - - - Dies ist die Handels-Oberfläche. Sie zeigt mögliche Geschäfte mit Dorfbewohnern an. + + Beim Umbenennen ändert sich der Name eines Gegenstands für alle Spieler und die Kosten vorheriger Arbeitsgänge werden dauerhaft verringert. @@ -5626,15 +6541,25 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Handels-Oberfläche erfahren möchtest. {*B*} Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Handels-Oberfläche weißt. + + + + Dies ist die Handels-Oberfläche. Sie zeigt mögliche Geschäfte mit Dorfbewohnern an. + + + + + Geschäfte werden rot angezeigt und stehen nicht zur Verfügung, wenn du die erforderlichen Gegenstände nicht besitzt. + Alle Geschäfte, die ein Dorfbewohner im Moment anbietet, werden am oberen Rand angezeigt. - + - Geschäfte werden rot angezeigt und stehen nicht zur Verfügung, wenn du die erforderlichen Gegenstände nicht besitzt. + Die Gesamtzahl der erforderlichen Gegenstände für ein Geschäft findest du in den beiden Boxen links. @@ -5642,9 +6567,9 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Anzahl und Art der Gegenstände, die du dem Dorfbewohner gibst, werden in den beiden Feldern links angezeigt. - + - Die Gesamtzahl der erforderlichen Gegenstände für ein Geschäft findest du in den beiden Boxen links. + In diesem Gebiet gibt es einen Dorfbewohner und eine Truhe mit Papier, damit du Gegenstände kaufen kannst. @@ -5652,9 +6577,9 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Drück{*CONTROLLER_VK_A*}, um die Gegenstände, die der Dorfbewohner haben möchte, gegen den angebotenen Gegenstand einzutauschen. - + - In diesem Gebiet gibt es einen Dorfbewohner und eine Truhe mit Papier, damit du Gegenstände kaufen kannst. + Du kannst Gegenstände aus deinem Inventar mit Dorfbewohnern handeln. @@ -5663,19 +6588,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Drück{*CONTROLLER_VK_B*}, wenn du schon alles über den Handel weißt. - + - Du kannst Gegenstände aus deinem Inventar mit Dorfbewohnern handeln. - + Wenn Dorfbewohner verschiedene Geschäfte abschließen, werden ihre Angebote nach dem Zufallsprinzip aufgestockt oder aktualisiert. + Welche Geschäfte die Dorfbewohner üblicherweise anbieten, hängt von ihrem Beruf ab. - - - - - Wenn Dorfbewohner verschiedene Geschäfte abschließen, werden ihre Angebote nach dem Zufallsprinzip aufgestockt oder aktualisiert. @@ -5832,7 +6752,4 @@ Alle Endertruhen in einer Welt sind miteinander verbunden. Gegenstände, die in Heilmittel - - Seed für den Weltengenerator finden - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsPlatformSpecific.xml index 95e4d02f..b89c81a1 100644 --- a/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/de-DE/stringsPlatformSpecific.xml @@ -1,240 +1,244 @@  - - NOT USED + + Möchtest du dich bei "PSN" anmelden? - - Mit dem Touchscreen des PlayStation®Vita-Systems kannst du durch Menüs navigieren! + + Ist diese Option ausgewählt, werden Spieler vom Spiel ausgeschlossen, die nicht auf demselben PlayStation®Vita-System spielen wie der Host-Spieler. Das gilt auch für alle anderen Spieler auf dem PlayStation®Vita-System der ausgeschlossenen Spieler. Diese können dem Spiel erst wieder beitreten, wenn es neu gestartet wird. - - minecraftforum hat einen eigenen Bereich zur PlayStation®Vita Edition. + + SELECT - - Die neuesten Informationen von @4JStudios und @Kappische zu diesem Spiel findest du auf Twitter! + + Diese Option deaktiviert Trophäen und Bestenlisten-Aktualisierungen während des Spielens für diese Welt. Die Einstellung bleibt außerdem aktiv, wenn das Spiel nach dem Speichern mit aktivierter Option erneut geladen wird. - - Schau einem Enderman nie in die Augen! + + PlayStation®Vita-System - - Wir glauben, dass 4J Studios Herobrine aus dem PlayStation®Vita-System entfernt haben, aber wir sind uns nicht ganz sicher. + + Wähle „Ad-hoc-Netzwerk“, um dich mit anderen PlayStation®Vita-Systemen in der Nähe oder mit "PSN" zu verbinden, um mit Freunden auf der ganzen Welt in Kontakt zu kommen. - - Minecraft: PlayStation®Vita Edition hat jede Menge Rekorde gebrochen! + + Ad-hoc-Netzwerk - - {*T3*}SO WIRD GESPIELT: MULTIPLAYER{*ETW*}{*B*}{*B*} -Minecraft für das PlayStation®Vita-System ist standardmäßig ein Multiplayer-Spiel.{*B*}{*B*} -Wenn du ein Online-Spiel startest oder einem beitrittst, können die Spieler in deiner Freundeliste es sehen (es sei denn, du richtest das Spiel aus und hast „Nur mit Einladung“ ausgewählt), und wenn sie dem Spiel beitreten, können Spieler in ihrer Freundeliste 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 SELECT-Taste eine Liste aller anderen Spieler im Spiel aufrufen und Spieler aus dem Spiel ausschließen. + + Netzwerkmodus ändern - - {*T3*}SO WIRD GESPIELT: SCREENSHOTS TEILEN{*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 teilen. 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ücke{*CONTROLLER_ACTION_CAMERA*}, bis du deine Spielfigur von vorn siehst, bevor du zum Teilen{*CONTROLLER_VK_Y*} drückst.{*B*}{*B*} -Die Online-ID wird auf Screenshots nicht angezeigt. + + Netzwerkmodus wählen - - {*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 Trophäen und Ranglisten-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ücke beim Fliegen{*CONTROLLER_ACTION_MOVE*} zweimal schnell nach vorn.{*B*} -Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} 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. + + Online-IDs, geteilter Bildschirm - - Drücke zweimal schnell nacheinander {*CONTROLLER_ACTION_JUMP*}, um zu fliegen. Um das Fliegen zu beenden, wiederhole die Aktion. Um schneller zu fliegen, drücke{*CONTROLLER_ACTION_MOVE*} beim Fliegen zweimal schnell nach vorn. -Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um dich nach oben zu bewegen, und{*CONTROLLER_ACTION_SNEAK*}, um dich nach unten zu bewegen, oder verwende die Richtungstasten, um dich nach oben, nach unten, nach links oder nach rechts zu bewegen. + + Trophäen - - NOT USED + + Dieses Spiel hat eine automatische Levelspeicherfunktion. Wenn du das obige Symbol siehst, speichert das Spiel deine Daten. +Bitte schalte dein PlayStation®Vita-System nicht aus, solange dieses Symbol angezeigt wird. - - NOT USED + + Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. Deaktiviert Trophäen und Bestenlisten-Aktualisierungen. - - "NOT USED" + + Online-IDs: - - "NOT USED" + + Du verwendest die Testversion eines Texturpakets. Du erhältst Zugriff auf alle Inhalte des Texturpakets, aber du kannst deine Fortschritte nicht speichern. +Wenn du versuchst, mit der Testversion zu speichern, wird dir die Möglichkeit gegeben, die Vollversion zu kaufen. - - Freunde einladen + + Patch 1.04 (Titel-Update 14) - - Wenn du eine Welt im Kreativmodus erstellst, lädst oder speicherst, sind in dieser Welt Trophäen und Bestenlisten-Aktualisierungen deaktiviert, selbst wenn sie später im Überlebensmodus geladen wird. Möchtest du wirklich fortfahren? + + Online-IDs im Spiel - - Diese Welt wurde früher im Kreativmodus gespeichert, Trophäen und Bestenlisten-Aktualisierungen sind deaktiviert. Möchtest du wirklich fortfahren? + + Schau mal, was ich in Minecraft: PlayStation®Vita Edition erschaffen habe! - - Diese Welt wurde im Kreativmodus gespeichert, Trophäen und Bestenlisten-Aktualisierungen sind deaktiviert. + + Download fehlgeschlagen. Bitte versuche es später erneut. - - Wenn du eine Welt mit aktivierten Hostprivilegien erstellst, lädst oder speicherst, sind in dieser Welt Trophäen und Bestenlisten-Aktualisierungen deaktiviert, selbst wenn sie später ohne diese Privilegien geladen wird. Möchtest du wirklich fortfahren? + + Beitritt zum Spiel aufgrund eines eingeschränkten NAT-Typs fehlgeschlagen. Bitte überprüfe deine Netzwerkeinstellungen. - - Die Verbindung zu "PSN" wurde unterbrochen. Zurück zum Hauptmenü. + + Upload fehlgeschlagen. Bitte versuche es später erneut. - - Die Verbindung zu "PSN" wurde unterbrochen. + + Download abgeschlossen! - - Dies ist die Testversion von Minecraft: PlayStation®Vita Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade eine Trophäe verdient! -Schalte das vollständige Spiel frei, um den ganzen Spaß von Minecraft: PlayStation®Vita Edition zu erleben und zusammen mit deinen Freunden auf der ganzen Welt über "PSN" zu spielen. -Möchtest du jetzt das vollständige Spiel freischalten? + + +Im Spielstandtransferspeicher ist derzeit kein Spielstand verfügbar. +Du kannst mit der Minecraft: PlayStation®3 Edition einen Welt-Spielstand in den Spielstandtransferspeicher hochladen und ihn dann mit der Minecraft: PlayStation®Vita Edition herunterladen. + - - Dies ist die Testversion von Minecraft: PlayStation®Vita Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade ein Design verdient! -Schalte das vollständige Spiel frei, um den ganzen Spaß von Minecraft: PlayStation®Vita Edition zu erleben und zusammen mit deinen Freunden auf der ganzen Welt über "PSN" zu spielen. -Möchtest du jetzt das vollständige Spiel freischalten? + + Speicherung nicht vollständig. - - Dies ist die Testversion von Minecraft: PlayStation®Vita Edition. Du brauchst das vollständige Spiel, um diese Einladung anzunehmen. -Möchtest du das vollständige Spiel freischalten? + + Für Minecraft: PlayStation®Vita Edition steht kein Speicherplatz mehr für weitere Speicherdaten zur Verfügung. Lösche andere „Minecraft: PlayStation®Vita Edition“-Speicherdateien, um Platz zu schaffen. - - Gastspieler können das vollständige Spiel nicht freischalten. Melde dich mit einem Sony Entertainment Network-Konto an. + + Hochladen abgebrochen - - Online-ID + + Du hast das Hochladen dieses Spielstands in den Spielstandtransferspeicher abgebrochen. - - Brauen + + Spielstand für PS3™/PS4™ hochladen - - Du bist zum Titelbildschirm zurückgekehrt, weil du von "PSN" abgemeldet wurdest. + + Daten werden hochgeladen: %d %% - - Du hast die Testversion von Minecraft: PlayStation®Vita Edition die maximal erlaubte Zeit lang gespielt! Möchtest du jetzt das vollständige Spiel freischalten, um weiterhin Spaß zu haben? + + "PSN" - - Minecraft: PlayStation®Vita Edition konnte nicht geladen werden und kann daher nicht fortgesetzt werden. + + Spielstand für PS3™ herunterladen - - Spielbeitritt nicht möglich: Einer oder mehrere Spieler dürfen aufgrund einer Chat-Beschränkung ihres Sony Entertainment Network-Kontos nicht online spielen. + + Daten werden heruntergeladen: %d %% - - Erstellen des Online-Spiels nicht möglich: Einer oder mehrere Spieler haben aufgrund ihrer Chat-Beschränkungen keine aktivierte Online-Funktion für ihr Sony Entertainment Network-Konto. Deaktiviere die Option „Online-Spiel“ unter „Weitere Optionen“, um offline zu spielen. + + Speichert ... - - Du kannst dieser Spielsitzung nicht beitreten, weil Online-Funktionen aufgrund von Chat-Beschränkungen deines Sony Entertainment Network-Kontos deaktiviert sind. + + Upload abgeschlossen! - - Du kannst dieser Spielsitzung nicht beitreten, weil die Online-Funktionen von einem deiner lokalen Spieler aufgrund von Chat-Beschränkungen seines Sony Entertainment Network-Kontos deaktiviert sind. Deaktiviere die Option „Online-Spiel“ unter „Weitere Optionen“, um offline zu spielen. + + Möchtest du wirklich diesen Spielstand hochladen und damit den derzeit im Spielstandtransferspeicher befindlichen Spielstand überschreiben? - - Du kannst diese Spielsitzung nicht erstellen, weil die Online-Funktionen von einem deiner lokalen Spieler aufgrund von Chat-Beschränkungen seines Sony Entertainment Network-Kontos deaktiviert sind. Deaktiviere die Option „Online-Spiel“ unter „Weitere Optionen“, um offline zu spielen. + + Daten werden konvertiert - - Dieses Spiel hat eine automatische Levelspeicherfunktion. Wenn du das obige Symbol siehst, speichert das Spiel deine Daten. -Bitte schalte dein PlayStation®Vita-System nicht aus, solange dieses Symbol angezeigt wird. + + NOT USED - - Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. Deaktiviert Trophäen und Bestenlisten-Aktualisierungen. + + NOT USED - - Online-IDs, geteilter Bildschirm + + {*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 Trophäen und Ranglisten-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ücke beim Fliegen{*CONTROLLER_ACTION_MOVE*} zweimal schnell nach vorn.{*B*} +Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} 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. - - Trophäen + + Drücke zweimal schnell nacheinander {*CONTROLLER_ACTION_JUMP*}, um zu fliegen. Um das Fliegen zu beenden, wiederhole die Aktion. Um schneller zu fliegen, drücke{*CONTROLLER_ACTION_MOVE*} beim Fliegen zweimal schnell nach vorn. +Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um dich nach oben zu bewegen, und{*CONTROLLER_ACTION_SNEAK*}, um dich nach unten zu bewegen, oder verwende die Richtungstasten, um dich nach oben, nach unten, nach links oder nach rechts zu bewegen. - - Online-IDs: + + "NOT USED" - - Online-IDs im Spiel + + Wenn du eine Welt im Kreativmodus erstellst, lädst oder speicherst, sind in dieser Welt Trophäen und Bestenlisten-Aktualisierungen deaktiviert, selbst wenn sie später im Überlebensmodus geladen wird. Möchtest du wirklich fortfahren? - - Schau mal, was ich in Minecraft: PlayStation®Vita Edition erschaffen habe! + + Diese Welt wurde früher im Kreativmodus gespeichert, Trophäen und Bestenlisten-Aktualisierungen sind deaktiviert. Möchtest du wirklich fortfahren? - - Du verwendest die Testversion eines Texturpakets. Du erhältst Zugriff auf alle Inhalte des Texturpakets, aber du kannst deine Fortschritte nicht speichern. -Wenn du versuchst, mit der Testversion zu speichern, wird dir die Möglichkeit gegeben, die Vollversion zu kaufen. + + "NOT USED" - - Patch 1.04 (Titel-Update 14) + + Freunde einladen - - SELECT + + minecraftforum hat einen eigenen Bereich zur PlayStation®Vita Edition. - - Diese Option deaktiviert Trophäen und Bestenlisten-Aktualisierungen während des Spielens für diese Welt. Die Einstellung bleibt außerdem aktiv, wenn das Spiel nach dem Speichern mit aktivierter Option erneut geladen wird. + + Die neuesten Informationen von @4JStudios und @Kappische zu diesem Spiel findest du auf Twitter! - - Möchtest du dich bei "PSN" anmelden? + + NOT USED - - Ist diese Option ausgewählt, werden Spieler vom Spiel ausgeschlossen, die nicht auf demselben PlayStation®Vita-System spielen wie der Host-Spieler. Das gilt auch für alle anderen Spieler auf dem PlayStation®Vita-System der ausgeschlossenen Spieler. Diese können dem Spiel erst wieder beitreten, wenn es neu gestartet wird. + + Mit dem Touchscreen des PlayStation®Vita-Systems kannst du durch Menüs navigieren! - - PlayStation®Vita-System + + Schau einem Enderman nie in die Augen! - - Netzwerkmodus ändern + + {*T3*}SO WIRD GESPIELT: MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft für das PlayStation®Vita-System ist standardmäßig ein Multiplayer-Spiel.{*B*}{*B*} +Wenn du ein Online-Spiel startest oder einem beitrittst, können die Spieler in deiner Freundeliste es sehen (es sei denn, du richtest das Spiel aus und hast „Nur mit Einladung“ ausgewählt), und wenn sie dem Spiel beitreten, können Spieler in ihrer Freundeliste 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 SELECT-Taste eine Liste aller anderen Spieler im Spiel aufrufen und Spieler aus dem Spiel ausschließen. - - Netzwerkmodus wählen + + {*T3*}SO WIRD GESPIELT: SCREENSHOTS TEILEN{*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 teilen. 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ücke{*CONTROLLER_ACTION_CAMERA*}, bis du deine Spielfigur von vorn siehst, bevor du zum Teilen{*CONTROLLER_VK_Y*} drückst.{*B*}{*B*} +Die Online-ID wird auf Screenshots nicht angezeigt. - - Wähle „Ad-hoc-Netzwerk“, um dich mit anderen PlayStation®Vita-Systemen in der Nähe oder mit "PSN" zu verbinden, um mit Freunden auf der ganzen Welt in Kontakt zu kommen. + + Wir glauben, dass 4J Studios Herobrine aus dem PlayStation®Vita-System entfernt haben, aber wir sind uns nicht ganz sicher. - - Ad-hoc-Netzwerk + + Minecraft: PlayStation®Vita Edition hat jede Menge Rekorde gebrochen! - - "PSN" + + Du hast die Testversion von Minecraft: PlayStation®Vita Edition die maximal erlaubte Zeit lang gespielt! Möchtest du jetzt das vollständige Spiel freischalten, um weiterhin Spaß zu haben? - - PlayStation®3-System herunterladen + + Minecraft: PlayStation®Vita Edition konnte nicht geladen werden und kann daher nicht fortgesetzt werden. - - Spielstand für PlayStation®3/PlayStation®4-System hochladen + + Brauen - - Hochladen abgebrochen + + Du bist zum Titelbildschirm zurückgekehrt, weil du von "PSN" abgemeldet wurdest. - - Du hast das Hochladen dieses Spielstands in den Spielstandtransferspeicher abgebrochen. + + Spielbeitritt nicht möglich: Einer oder mehrere Spieler dürfen aufgrund einer Chat-Beschränkung ihres Sony Entertainment Network-Kontos nicht online spielen. - - Daten werden hochgeladen: %d %% + + Du kannst dieser Spielsitzung nicht beitreten, weil die Online-Funktionen von einem deiner lokalen Spieler aufgrund von Chat-Beschränkungen seines Sony Entertainment Network-Kontos deaktiviert sind. Deaktiviere die Option „Online-Spiel“ unter „Weitere Optionen“, um offline zu spielen. - - Daten werden heruntergeladen: %d %% + + Du kannst diese Spielsitzung nicht erstellen, weil die Online-Funktionen von einem deiner lokalen Spieler aufgrund von Chat-Beschränkungen seines Sony Entertainment Network-Kontos deaktiviert sind. Deaktiviere die Option „Online-Spiel“ unter „Weitere Optionen“, um offline zu spielen. - - Möchtest du wirklich diesen Spielstand hochladen und damit den derzeit im Spielstandtransferspeicher befindlichen Spielstand überschreiben? + + Erstellen des Online-Spiels nicht möglich: Einer oder mehrere Spieler haben aufgrund ihrer Chat-Beschränkungen keine aktivierte Online-Funktion für ihr Sony Entertainment Network-Konto. Deaktiviere die Option „Online-Spiel“ unter „Weitere Optionen“, um offline zu spielen. - - Daten werden konvertiert + + Du kannst dieser Spielsitzung nicht beitreten, weil Online-Funktionen aufgrund von Chat-Beschränkungen deines Sony Entertainment Network-Kontos deaktiviert sind. - - Speichert ... + + Die Verbindung zu "PSN" wurde unterbrochen. Zurück zum Hauptmenü. - - Upload abgeschlossen! + + Die Verbindung zu "PSN" wurde unterbrochen. - - Upload fehlgeschlagen. Bitte versuche es später erneut. + + Diese Welt wurde im Kreativmodus gespeichert, Trophäen und Bestenlisten-Aktualisierungen sind deaktiviert. - - Download abgeschlossen! + + Wenn du eine Welt mit aktivierten Hostprivilegien erstellst, lädst oder speicherst, sind in dieser Welt Trophäen und Bestenlisten-Aktualisierungen deaktiviert, selbst wenn sie später ohne diese Privilegien geladen wird. Möchtest du wirklich fortfahren? - - Download fehlgeschlagen. Bitte versuche es später erneut. + + Dies ist die Testversion von Minecraft: PlayStation®Vita Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade eine Trophäe verdient! +Schalte das vollständige Spiel frei, um den ganzen Spaß von Minecraft: PlayStation®Vita Edition zu erleben und zusammen mit deinen Freunden auf der ganzen Welt über "PSN" zu spielen. +Möchtest du jetzt das vollständige Spiel freischalten? - - Beitritt zum Spiel aufgrund eines eingeschränkten NAT-Typs fehlgeschlagen. Bitte überprüfe deine Netzwerkeinstellungen. + + Gastspieler können das vollständige Spiel nicht freischalten. Melde dich mit einem Sony Entertainment Network-Konto an. - - - Im Spielstandtransferspeicher ist derzeit kein Spielstand verfügbar. - Du kannst mit der Minecraft: PlayStation®3 Edition einen Welt-Spielstand in den Spielstandtransferspeicher hochladen und ihn dann mit der Minecraft: PlayStation®Vita Edition herunterladen. + + Online-ID - - Speicherung nicht vollständig. + + Dies ist die Testversion von Minecraft: PlayStation®Vita Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade ein Design verdient! +Schalte das vollständige Spiel frei, um den ganzen Spaß von Minecraft: PlayStation®Vita Edition zu erleben und zusammen mit deinen Freunden auf der ganzen Welt über "PSN" zu spielen. +Möchtest du jetzt das vollständige Spiel freischalten? - - Für Minecraft: PlayStation®Vita Edition steht kein Speicherplatz mehr für weitere Speicherdaten zur Verfügung. Lösche andere „Minecraft: PlayStation®Vita Edition“-Speicherdateien, um Platz zu schaffen. + + Dies ist die Testversion von Minecraft: PlayStation®Vita Edition. Du brauchst das vollständige Spiel, um diese Einladung anzunehmen. +Möchtest du das vollständige Spiel freischalten? + + + Die Speicherdatei im Spielstandtransferspeicher hat eine Versionsnummer, die Minecraft: PlayStation®Vita Edition noch nicht unterstützt. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/4J_stringsPlatformSpecific.xml index 0e94b57d..6621ccc9 100644 --- a/Minecraft.Client/PSVitaMedia/loc/el-EL/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/4J_stringsPlatformSpecific.xml @@ -1,53 +1,53 @@  - - Ο χώρος αποθήκευσης του συστήματός σας δεν διαθέτει επαρκή ελεύθερο χώρο για τη δημιουργία αποθήκευσης παιχνιδιού. + + Η αποθήκευση των ρυθμίσεων στο λογαριασμό σας στο Sony Entertainment Network απέτυχε. - - Επιστρέψατε στην οθόνη τίτλων, επειδή αποσυνδεθήκατε από το "PSN" + + Πρόβλημα με το λογαριασμό στο Sony Entertainment Network - - Ο αγώνας τελείωσε, επειδή αποσυνδεθήκατε από το "PSN" - + + Προέκυψε πρόβλημα με την πρόσβαση στο λογαριασμό σας στο Sony Entertainment Network. Δεν είναι δυνατή η απονομή του τροπαίου σας προς το παρόν. - - Αυτήν τη στιγμή δεν είστε συνδεδεμένοι. - + + Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®3 Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα τρόπαιο! +Ξεκλειδώστε το πλήρες παιχνίδι, για να απολαύσετε το Minecraft: PlayStation®3 Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". +Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; - - Αυτό το παιχνίδι διαθέτει ορισμένες λειτουργίες για τις οποίες απαιτείται να είστε συνδεδεμένοι στο "PSN", όμως προς το παρόν βρίσκεστε εκτός σύνδεσης. + + Συνδεδεμένο στο Δίκτυο Ad Hoc + + + Το παιχνίδι έχει ορισμένες λειτουργίες που απαιτούν σύνδεση δικτύου Ad Hoc, αλλά αυτήν τη στιγμή είστε εκτός σύνδεσης. Το Δίκτυο Ad Hoc είναι εκτός σύνδεσης. - - Το παιχνίδι έχει ορισμένες λειτουργίες που απαιτούν σύνδεση δικτύου Ad Hoc, αλλά αυτήν τη στιγμή είστε εκτός σύνδεσης. + + Πρόβλημα με τα Τρόπαια - - Για αυτήν τη λειτουργία απαιτείται σύνδεση στο "PSN". + + Ο αγώνας τελείωσε, επειδή αποσυνδεθήκατε από το "PSN" - - Σύνδεση στο "PSN" - - - Συνδεδεμένο στο Δίκτυο Ad Hoc + + Επιστρέψατε στην οθόνη τίτλων, επειδή αποσυνδεθήκατε από το "PSN" - - Πρόβλημα με τα Τρόπαια + + Ο χώρος αποθήκευσης του συστήματός σας δεν διαθέτει επαρκή ελεύθερο χώρο για τη δημιουργία αποθήκευσης παιχνιδιού. - - Προέκυψε πρόβλημα με την πρόσβαση στο λογαριασμό σας στο Sony Entertainment Network. Δεν είναι δυνατή η απονομή του τροπαίου σας προς το παρόν. + + Αυτήν τη στιγμή δεν είστε συνδεδεμένοι. + - - Πρόβλημα με το λογαριασμό στο Sony Entertainment Network + + Σύνδεση στο "PSN" - - Η αποθήκευση των ρυθμίσεων στο λογαριασμό σας στο Sony Entertainment Network απέτυχε. + + Για αυτήν τη λειτουργία απαιτείται σύνδεση στο "PSN". + - - Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®3 Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα τρόπαιο! -Ξεκλειδώστε το πλήρες παιχνίδι, για να απολαύσετε το Minecraft: PlayStation®3 Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". -Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + Αυτό το παιχνίδι διαθέτει ορισμένες λειτουργίες για τις οποίες απαιτείται να είστε συνδεδεμένοι στο "PSN", όμως προς το παρόν βρίσκεστε εκτός σύνδεσης. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/AdditionalStrings.xml index 6c988a86..0f9faed2 100644 --- a/Minecraft.Client/PSVitaMedia/loc/el-EL/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/AdditionalStrings.xml @@ -48,6 +48,12 @@ Το αρχείο Επιλογών είναι κατεστραμμένο και πρέπει να διαγραφεί. + + Διαγραφή αρχείου επιλογών. + + + Επανάληψη φόρτωσης αρχείου επιλογών. + Το αρχείο Αποθήκευσης της Κρυφής Μνήμης είναι κατεστραμμένο και πρέπει να διαγραφεί. @@ -61,7 +67,7 @@ Κρίσιμο σφάλμα: Η ενεργοποίηση των Τροπαίων απέτυχε. Βγείτε από το παιχνίδι. - Προβολή Προσκλήσεων Παιχνιδιού + Προβολή Προσκλήσεων Κατεστραμμένο Αρχείο @@ -75,6 +81,9 @@ Η Διαδικτυακή υπηρεσία απενεργοποιήθηκε στο Sony Entertainment Network λογαριασμό σας, λόγω ρυθμίσεων γονικού ελέγχου για έναν από τους τοπικούς σας παίκτες. + + Οι online λειτουργίες είναι απενεργοποιημένες, επειδή υπάρχει διαθέσιμη ενημέρωση παιχνιδιού. + Δεν υπάρχουν προσφορές για διαθέσιμο περιεχόμενο με δυνατότητα λήψης αυτήν τη στιγμή. @@ -84,7 +93,4 @@ Ελάτε να παίξετε ένα παιχνίδι του Minecraft: PlayStation®Vita Edition! - - Οι online λειτουργίες είναι απενεργοποιημένες, επειδή υπάρχει διαθέσιμη ενημέρωση παιχνιδιού. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsGeneric.xml index 32e690cc..61ff1ac7 100644 --- a/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsGeneric.xml @@ -1,5193 +1,6051 @@  - - Υπάρχει διαθέσιμο νέο περιεχόμενο για λήψη! Για να πραγματοποιήσετε τη λήψη πατήστε το κουμπί Minecraft Store στο Κύριο Μενού. + + Μετάβαση στο παιχνίδι εκτός διαδικτύου - - Μπορείτε να αλλάξετε την εμφάνιση του χαρακτήρα σας με ένα Πακέτο Skin από το Minecraft Store. Επιλέξτε το Minecraft Store στο Κύριο Μενού για να δείτε τι είναι διαθέσιμο. + + Περιμένετε έως ότου ο οικοδεσπότης αποθηκεύσει το παιχνίδι - - Τροποποιήστε τις ρυθμίσεις γάμμα για να κάνετε το παιχνίδι πιο φωτεινό ή πιο σκοτεινό. + + Είσοδος στο END - - Εάν ορίσετε τη δυσκολία του παιχνιδιού σε Γαλήνιο, η ζωή σας θα αναπληρωθεί αυτόματα και δεν θα εμφανιστούν τέρατα τη νύχτα! + + Αποθήκευση παικτών - - Ταΐστε το λύκο ένα κόκκαλο για να τον δαμάσετε. Τότε μπορείτε να τον κάνετε να κάτσει ή να σας ακολουθήσει. + + Σύνδεση με τον οικοδεσπότη - - Μπορείτε να ξεσκαρτάρετε αντικείμενα όταν βρίσκεστε στο μενού Απόθεμα μετακινώντας το δρομέα από το μενού και πατώντας{*CONTROLLER_VK_A*} + + Λήψη πεδίου - - Εάν κοιμηθείτε σε κρεβάτι τη νύχτα, τότε θα ξημερώσει πιο γρήγορα στο παιχνίδι, αλλά σε ένα παιχνίδι για πολλούς παίκτες πρέπει όλοι οι παίκτες να κοιμηθούν σε κρεβάτια ταυτόχρονα. + + Έξοδος από το END - - Πάρτε χοιρινές μπριζόλες από τα γουρούνια, και μαγειρέψτε και φάτε τις για να αναπληρώσετε τη ζωή σας. + + Το κρεβάτι στο σπίτι σας έλειπε ή κάτι εμπόδιζε την πρόσβαση σε αυτό - - Πάρτε δέρμα από τις αγελάδες και χρησιμοποιήστε το για να φτιάξετε πανοπλία. + + Δεν μπορείτε να ξεκουραστείτε αυτή τη στιγμή, τριγυρίζουν τέρατα - - Εάν έχετε έναν άδειο κουβά, μπορείτε να τον γεμίσετε με γάλα από μια αγελάδα, νερό ή λάβα! + + Κοιμάστε σε κρεβάτι. Για να μεταβείτε στο ξημέρωμα, όλοι οι παίκτες πρέπει να κοιμηθούν σε κρεβάτι την ίδια στιγμή. - - Χρησιμοποιήστε μια αξίνα για να προετοιμάσετε το έδαφος για φύτευση. + + Αυτό το κρεβάτι είναι κατειλημμένο - - Οι αράχνες δεν θα σας επιτεθούν κατά τη διάρκεια της ημέρας, εκτός εάν τις επιτεθείτε εσείς. + + Μόνο τη νύχτα μπορείτε να κοιμηθείτε - - Το σκάψιμο του εδάφους ή της άμμου με φτυάρι είναι πιο γρήγορο από ό,τι με το χέρι σας! + + Ο/Η %s κοιμάται σε κρεβάτι. Για να μεταβείτε στο ξημέρωμα, όλοι οι παίκτες πρέπει να κοιμηθούν σε κρεβάτι την ίδια στιγμή. - - Οι μαγειρεμένες χοιρινές μπριζόλες σάς δίνουν περισσότερη ζωή από τις ωμές χοιρινές μπριζόλες. + + Φόρτωση επιπέδου - - Φτιάξτε πυρσούς για να φωτίζετε περιοχές τη νύχτα. Τα τέρατα θα αποφεύγουν τις περιοχές γύρω από αυτούς τους πυρσούς. + + Ολοκλήρωση... - - Για να πάτε πιο γρήγορα στον προορισμό σας χρησιμοποιήστε βαγόνι ορυχείου και ράγες! + + Κατασκευή Πεδίου - - Φυτέψτε μερικά βλαστάρια και θα μεγαλώσουν σε δέντρα. + + Προσομοίωση κόσμου για λίγο - - Οι Γουρουνάνθρωποι δεν θα σας επιτεθούν, εκτός εάν τους επιτεθείτε εσείς. + + Κατάταξη - - Μπορείτε να αλλάξετε το σημείο επαναφοράς του παιχνιδιού και να μετακινηθείτε γρήγορα στην αυγή εάν κοιμηθείτε σε κρεβάτι. + + Προετοιμασία Αποθήκευσης Επιπέδου - - Στείλτε αυτές τις πύρινες σφαίρες πίσω στα Ghast! + + Προετοιμασία Κομματιών... - - Εάν χτίσετε μια πύλη, θα μπορέσετε να ταξιδέψετε σε άλλη διάσταση, στο Nether. + + Προετοιμασία διακομιστή - - Πατήστε{*CONTROLLER_VK_B*} για να ξεσκαρτάρετε το αντικείμενο που έχετε στο χέρι σας! + + Έξοδος από το Nether - - Χρησιμοποιήστε το κατάλληλο εργαλείο για τη δουλειά! + + Επαναγένεση - - Εάν δεν μπορείτε να βρείτε κάρβουνο για τους πυρσούς σας, μπορείτε πάντα να φτιάξετε ξυλοκάρβουνο από δέντρα σε ένα φούρνο. + + Δημιουργία επιπέδου - - Δεν είναι καλή ιδέα να σκάβετε απευθείας προς τα κάτω ή προς τα πάνω. + + Δημιουργία περιοχής γέννησης - - Η πάστα οστών (που κατασκευάστηκε από κόκκαλο Σκελετού) μπορεί να χρησιμοποιηθεί ως λίπασμα και κάνει τα πράγματα να μεγαλώνουν κατευθείαν! + + Φόρτωση περιοχής spawn - - Οι Creeper θα εκραγούν όταν έρθουν κοντά σας! + + Είσοδος στο Nether - - Ο οψιανός δημιουργείται όταν πέφτει νερό πάνω σε έναν κύβο λάβας. + + Εργαλεία και Όπλα - - Η λάβα μπορεί να χρειαστεί μερικά λεπτά για να εξαφανιστεί ΕΝΤΕΛΩΣ όταν αφαιρεθεί ο κύβος πηγής. + + Γάμμα - - Η πέτρα επίστρωσης είναι ανθεκτική στις πύρινες σφαίρες των Ghast και έτσι είναι χρήσιμη για τη φύλαξη των πυλών. + + Ευαισθησία Παιχνιδιού - - Οι κύβοι που μπορούν να χρησιμοποιηθούν ως πηγή φωτός λιώνουν το χιόνι και τον πάγο. Αυτά περιλαμβάνουν τους πυρσούς, τις λαμψόπετρες και τα φανάρια από κολοκύθα. + + Ευαισθησία Περιβάλλοντος Χρήστη - - Προσέχετε όταν δημιουργείτε κατασκευές από μαλλί σε ανοικτό χώρο, καθώς οι αστραπές από καταιγίδες μπορεί να βάλουν φωτιά στο μαλλί. + + Δυσκολία - - Ένας μόνο κουβάς από λάβα μπορεί να χρησιμοποιηθεί σε έναν φούρνο για τη δημιουργία 100 κύβων. + + Μουσική - - Το όργανο που παίζει έναν κύβο νότας εξαρτάται από το υλικό που βρίσκεται κάτω από αυτό. + + Ήχος - - Τα Ζόμπι και οι Σκελετοί μπορούν να επιβιώσουν στο φως της ημέρας εάν βρίσκονται στο νερό. + + Γαλήνιο - - Εάν επιτεθείτε σε ένα λύκο, τότε τυχόν λύκοι που βρίσκονται κοντά σας θα γίνουν εχθρικοί και θα σας επιτεθούν. Αυτό ισχύει και για τους Γουρουνάνθρωπους Ζόμπι. + + Σε αυτή τη λειτουργία, ο παίκτης ανακτά την υγεία του με την πάροδο του χρόνου και δεν υπάρχουν εχθροί στο περιβάλλον. - - Οι λύκοι δεν μπορούν να εισέλθουν στο Nether. + + Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον, αλλά προκαλούν μικρότερες βλάβες στον παίκτη σε σχέση με τη λειτουργία Κανονικό. - - Οι λύκοι δεν θα επιτεθούν στους Creeper. + + Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν τυπικές βλάβες στον παίκτη. - - Οι κότες γεννούν ένα αυγό κάθε 5 με 10 λεπτά. + + Εύκολο - - Ο οψιανός μπορεί να εξορυχτεί με αδαμάντινη αξίνα. + + Κανονικό - - Οι Creeper αποτελούν την πιο εύκολη πηγή για να αποκτήσετε πυρίτιδα. + + Δύσκολο - - Εάν τοποθετήσετε δύο σεντούκια το ένα δίπλα στο άλλο θα δημιουργηθεί ένα μεγάλο σεντούκι. + + Αποσυνδέθηκε - - Οι ήμεροι λύκοι δείχνουν την υγεία τους με τη θέση της ουράς τους. Ταΐστε τους κρέας για να τους θεραπεύσετε. + + Πανοπλία - - Μαγειρέψτε ένα κάκτο στο φούρνο για να πάρετε πράσινη βαφή. + + Μηχανισμοί - - Διαβάστε την ενότητα "Τι Νέο Υπάρχει" στα μενού "Τρόπος Παιχνιδιού" για να δείτε τις τελευταίες πληροφορίες σχετικά με την ενημερωμένη έκδοση του παιχνιδιού. + + Μεταφορά - - Τώρα στο παιχνίδι θα βρείτε και φράχτες που στοιβάζονται! + + Όπλα - - Ορισμένα ζώα θα σας ακολουθήσουν, εάν έχετε σιτάρι στο χέρι σας. + + Τροφή - - Εάν ένα ζώο δεν μπορεί να κινηθεί για περισσότερους από 20 κύβους σε οποιαδήποτε κατεύθυνση, δεν θα εξαφανιστεί. + + Οικοδομήματα - - Μουσική από τους C418! + + Διακοσμητικά - - Ο Notch έχει πάνω από ένα εκατομμύριο ακόλουθους στο twitter! + + Παρασκευή Φίλτρου - - Δεν έχουν όλοι οι Σουηδοί ξανθά μαλλιά. Μερικοι, όπως ο Jens από τη Mojang, έχουν ακόμη και κόκκινα μαλλιά! + + Εργαλεία, Όπλα και Πανοπλία - - Θα υπάρξει τελικά ενημέρωση σε αυτό το παιχνίδι! + + Υλικά - - Ποιος είναι ο Notch; + + Κύβοι για Κατασκευές - - Η Mojang έχει περισσότερα βραβεία από ότι προσωπικό! + + Κοκκινόπετρα και Μεταφορά - - Υπάρχουν και ορισμένοι διάσημοι που παίζουν Minecraft! + + Διάφορα - - Στον deadmau5 αρέσει το Minecraft! + + Συμμετοχές: - - Μην κοιτάτε απευθείας τα έντομα. + + Χωρίς αποθήκευση - - Οι Creeper γεννήθηκαν από ένα σφάλμα στον κώδικα. + + Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. - - Είναι κότα ή πάπια; + + Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού; Η πρόοδός σας θα χαθεί! - - Είχες παρευρεθεί στη Minecon; + + Αυτά τα δεδομένα αποθήκευσης είναι κατεστραμμένα ή έχουν υποστεί βλάβη. Θα θέλατε να τα διαγράψετε; - - Κανείς στη Mojang δεν έχει δει ποτέ το πρόσωπο του junkboy. + + Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού και να αποσυνδέσετε όλους τους παίκτες από το παιχνίδι; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. - - Γνωρίζατε ότι υπάρχει Minecraft Wiki; + + Με αποθήκευση - - Το νέο γραφείο της Mojang είναι τέλειο! + + Δημιουργία Νέου Κόσμου - - Η Minecon 2013 έγινε στο Ορλάντο, στη Φλόριντα των ΗΠΑ! + + Εισαγάγετε ένα όνομα για τον κόσμο σας - - To .party() ήταν τέλειο! + + Βάλτε τον seed για τη γενιά του κόσμου σας - - Πάντα να υποθέτετε ότι οι φήμες είναι ψεύτικες, παρά ότι είναι αληθινές! + + Φόρτωση Αποθηκευμένου Κόσμου + + + Αρχή Εκπαιδευτικού Μαθήματος + + + Εκπαιδευτικό Μάθημα + + + Ονομασία του Κόσμου σας + + + Βλάβη Δεδομένων Αποθήκευσης + + + OK + + + Ακύρωση + + + Minecraft Store + + + Περιστροφή + + + Απόκρυψη + + + Απαλοιφή Όλων των Υποδοχών + + + Είστε σίγουροι ότι θέλετε να εγκαταλείψετε το τρέχον παιχνίδι σας και να συμμετάσχετε στο νέο; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. + + + Είστε σίγουροι ότι θέλετε να αντικαταστήσετε τυχόν προηγούμενα αποθηκευμένα δεδομένα αυτού του κόσμου με την τρέχουσα εκδοχή αυτού του κόσμου; + + + Είστε σίγουροι ότι θέλετε να βγείτε από το παιχνίδι χωρίς να το αποθηκεύσετε; Θα χάσετε όλη την πρόοδο που έχετε σημειώσει σε αυτόν τον κόσμο! + + + Έναρξη Παιχνιδιού + + + Έξοδος + + + Αποθήκευση + + + Έξοδος Χωρίς Αποθήκευση + + + START για να παίξετε + + + Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" του Steve από το Minecraft! + + + Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" ενός Creeper! + + + Ξεκλείδωμα Πλήρους Παιχνιδιού + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει νεότερη έκδοση του παιχνιδιού. + + + Νέος Κόσμος + + + Το Βραβείο Ξεκλειδώθηκε! + + + Παίζετε τη δοκιμαστική έκδοση του παιχνιδιού, αλλά θα χρειαστείτε το πλήρες παιχνίδι για να μπορέσετε να αποθηκεύσετε την πρόοδό σας. +Θέλετε να ξεκλειδώσετε τώρα το πλήρες παιχνίδι; + + + Φίλοι + + + Η Βαθμολογία μου + + + Συνολική + + + Παρακαλώ περιμένετε + + + Δεν βρέθηκαν αποτελέσματα + + + Φίλτρο: + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει παλαιότερη έκδοση του παιχνιδιού. + + + Η σύνδεση χάθηκε + + + Η σύνδεση με τον διακομιστή χάθηκε. Μετάβαση στο βασικό μενού. + + + Αποσύνδεση από τον διακομιστή + + + Έξοδος από το παιχνίδι + + + Προέκυψε σφάλμα. Μετάβαση στο βασικό μενού. + + + Η σύνδεση απέτυχε + + + Αποβληθήκατε από το παιχνίδι + + + Ο οικοδεσπότης έχει βγει από το παιχνίδι. + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί δεν είστε φίλος με κανέναν από τους συμμετέχοντες. + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο οικοδεσπότης σας έχει αποβάλει από το παιχνίδι στο παρελθόν. + + + Αποβληθήκατε από το παιχνίδι γιατί πετούσατε + + + Η προσπάθεια σύνδεσης είχε υπερβολικά μεγάλη διάρκεια + + + Ο διακομιστής είναι πλήρης + + + Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν σοβαρές βλάβες στον παίκτη. Προσέξτε τα Creepers, γιατί δύσκολα θα «ξεχάσουν» την εκρηκτική επίθεση, ακόμα και αφού απομακρυνθείτε! + + + Θέματα + + + Πακέτα Skin + + + Να επιτρέπονται οι φίλοι φίλων + + + Αποβολή παίκτη + + + Είστε σίγουροι ότι θέλετε να αποβάλετε αυτόν τον παίκτη από το παιχνίδι; Δεν θα μπορέσει να συμμετάσχει ξανά έως ότου κάνετε επανεκκίνηση του κόσμου. + + + Πακέτα Εικόνων Παικτών + + + Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί η πρόσβαση σε αυτό επιτρέπεται σε παίκτες που είναι φίλοι του οικοδεσπότη. + + + Κατεστραμμένο Περιεχόμενο με Δυνατότητα Λήψης + + + Αυτό το περιεχόμενο με δυνατότητα λήψης είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. + + + Μέρος του περιεχομένου με δυνατότητα λήψης που διαθέτετε είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. + + + Δεν Μπορείτε να Συμμετάσχετε στο Παιχνίδι + + + Επιλεγμένο + + + Επιλεγμένη skin: + + + Απόκτηση Πλήρους Έκδοσης + + + Ξεκλείδωμα Πακέτου με Υφές + + + Για να χρησιμοποιήσετε αυτό το πακέτο με υφές στον κόσμο σας, πρέπει να το ξεκλειδώσετε. +Θέλετε να το ξεκλειδώσετε τώρα; + + + Δοκιμαστικό Πακέτο με Υφές + + + Seed + + + Ξεκλείδωμα Πακέτου Skin + + + Για να χρησιμοποιήσετε την εμφάνιση που έχετε επιλέξει, πρέπει να ξεκλειδώσετε αυτό το πακέτο skin. +Θέλετε να ξεκλειδώσετε το πακέτο skin τώρα; + + + Χρησιμοποιείτε μια δοκιμαστική έκδοση του πακέτου με υφές. Δεν θα μπορέσετε να αποθηκεύσετε αυτόν τον κόσμο αν δεν ξεκλειδώσετε την πλήρη έκδοση. +Θέλετε να ξεκλειδώσετε την πλήρη έκδοση του πακέτου με υφές; + + + Λήψη Πλήρους Έκδοσης + + + Αυτός ο κόσμος χρησιμοποιεί ένα μικτό πακέτο ή ένα πακέτο με υφές που δεν διαθέτετε! +Θέλετε να εγκαταστήσετε το μικτό πακέτο ή το πακέτο με υφές τώρα; + + + Απόκτηση Δοκιμαστικής Έκδοσης + + + Το Πακέτο με Υφές δεν Βρίσκεται Εδώ + + + Ξεκλείδωμα Πλήρους Έκδοσης + + + Λήψη Δοκιμαστικής Έκδοσης + + + Η λειτουργία παιχνιδιού έχει αλλάξει + + + Όταν είναι ενεργοποιημένο, μόνο παίκτες που έχουν προσκληθεί θα μπορούν να συμμετάσχουν. + + + Όταν είναι ενεργοποιημένο, φίλοι όσων βρίσκονται στη Λίστα Φίλων σας θα μπορούν να συμμετάσχουν στο παιχνίδι. + + + Όταν είναι ενεργοποιημένο, οι παίκτες θα μπορούν να προκαλέσουν βλάβες σε άλλους παίκτες. Επηρεάζει μόνο τη λειτουργία Επιβίωση. + + + Κανονικό + + + Εντελώς Επίπεδο + + + Όταν είναι ενεργοποιημένο, το παιχνίδι θα είναι διαδικτυακό. + + + Όταν είναι απενεργοποιημένο, οι παίκτες που συμμετέχουν στο παιχνίδι δεν μπορούν να κάνουν κατασκευές ή εξόρυξη έως ότου λάβουν άδεια. + + + Όταν είναι ενεργοποιημένο, οικοδομήματα όπως Χωριά και Οχυρά θα δημιουργηθούν στον κόσμο. + + + Όταν είναι ενεργοποιημένο, θα δημιουργηθεί ένας εντελώς επίπεδος κόσμος στο Overworld και στο Nether. + + + Όταν είναι ενεργοποιημένο, θα δημιουργηθεί ένα σεντούκι που θα περιέχει ορισμένα χρήσιμα αντικείμενα κοντά στο σημείο που θα κάνει spawn ο παίκτης. + + + Όταν είναι ενεργοποιημένο, η φωτιά μπορεί να επεκταθεί σε κοντινούς εύφλεκτους κύβους. + + + Όταν είναι ενεργοποιημένο, το ΤΝΤ θα ανατιναχθεί όταν πυροδοτηθεί. + + + Όταν είναι ενεργοποιημένο, ο κόσμος Nether θα αναδημιουργηθεί. Αυτό είναι χρήσιμο εάν έχετε αποθηκεύσει παλαιότερο παιχνίδι όταν δεν υπήρχαν Κάστρα Nether. + + + Ανενεργό + + + Λειτουργία Παιχνιδιού: Δημιουργία + + + Επιβίωση + + + Δημιουργία + + + Μετονομασία του Κόσμου σας + + + Εισαγάγετε το νέο όνομα για τον κόσμο σας + + + Λειτουργία Παιχνιδιού: Επιβίωση + + + Δημιουργήθηκε στην «Επιβίωση» + + + Μετονομασία Αποθήκευσης + + + Αυτόματη Αποθήκευση σε %d... + + + Ενεργό + + + Δημιουργήθηκε στη «Δημιουργία» + + + Αναπαράσταση Σύννεφων + + + Τι θέλετε να κάνετε με αυτό το αποθηκευμένο παιχνίδι; + + + Μέγεθος HUD (Διαχωρισμός Οθόνης) + + + Συστατικό + + + Καύσιμο + + + Διανομέας + + + Σεντούκι + + + Μαγεία + + + Φούρνος + + + Δεν υπάρχουν προσφορές για περιεχόμενο με δυνατότητα λήψης αυτού του τύπου για τον συγκεκριμένο τίτλο αυτή τη στιγμή. + + + Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αποθηκευμένο παιχνίδι; + + + Αναμονή έγκρισης + + + Λογοκριμένο + + + Ο/Η %s συμμετέχει στο παιχνίδι. + + + Ο/Η %s εγκατέλειψε το παιχνίδι. + + + Ο/Η %s αποβλήθηκε από το παιχνίδι. + + + Βάση Παρασκευής Φίλτρων + + + Εισαγωγή Κειμένου Πινακίδας + + + Εισαγάγετε ένα κείμενο για την πινακίδα σας + + + Εισαγωγή Τίτλου + + + Χρονικό Όριο Δοκιμαστικής Έκδοσης + + + Το παιχνίδι είναι πλήρες + + + Δεν ολοκληρώθηκε η συμμετοχή στο παιχνίδι, καθώς δεν υπάρχουν άλλες διαθέσιμες θέσεις + + + Εισαγάγετε έναν τίτλο για τη δημοσίευσή σας + + + Εισαγάγετε μια περιγραφή για τη δημοσίευσή σας + + + Απόθεμα + + + Συστατικά + + + Εισαγωγή Λεζάντας + + + Εισαγάγετε μια λεζάντα για τη δημοσίευσή σας + + + Εισαγωγή Περιγραφής + + + Παίζει τώρα: + + + + Είστε σίγουροι ότι θέλετε να προσθέσετε αυτό το επίπεδο στη λίστα σας με αποκλεισμένα επίπεδα; +Εάν επιλέξετε OK θα βγείτε και από το παιχνίδι. + + + Αφαίρεση από τη Λίστα Αποκλεισμένων + + + Διάστημα Αυτόματης Αποθήκευσης + + + Αποκλεισμένο Επίπεδο + + + Το παιχνίδι στο οποίο θα συμμετάσχετε βρίσκεται στη λίστα σας με αποκλεισμένα επίπεδα. +Εάν επιλέξετε να συμμετάσχετε στο παιχνίδι, το επίπεδο θα αφαιρεθεί από τη λίστα σας με αποκλεισμένα επίπεδα. + + + Αποκλεισμός Αυτού του Επιπέδου; + + + Διάστημα Αυτόματης Αποθήκευσης: ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ + + + Αδιαφάνεια Περιβάλλοντος Χρήστη + + + Προετοιμασία Αυτόματης Αποθήκευσης Επιπέδου + + + Μέγεθος HUD + + + Λεπτά + + + Δεν Μπορείτε να την Τοποθετήσετε Εδώ! + + + Η τοποθέτηση λάβας κοντά στο σημείο spawn επιπέδου δεν επιτρέπεται, λόγω πιθανότητας άμεσου θανάτου των παικτών που κάνουν spawn. + + + Αγαπημένα Skin + + + Παιχνίδι του/της %s + + + Παιχνίδι άγνωστου οικοδεσπότη + + + Ο προσκεκλημένος παίκτης αποσυνδέθηκε + + + Επαναφορά + + + Είστε σίγουροι ότι θέλετε να επαναφέρετε τις ρυθμίσεις σας στις προεπιλεγμένες τιμές; + + + Σφάλμα Φόρτωσης + + + Ένας προσκεκλημένος παίκτης αποσυνδέθηκε, προκαλώντας την απομάκρυνση όλων των προσκεκλημένων παικτών από το παιχνίδι. + + + Αποτυχία δημιουργίας παιχνιδιού + + + Αυτόματη Επιλογή + + + Προεπιλεγμένα Skin + + + Σύνδεση + + + Δεν έχετε συνδεθεί. Για να παίξετε αυτό το παιχνίδι, θα πρέπει να συνδεθείτε. Θέλετε να συνδεθείτε τώρα; + + + Δεν επιτρέπεται το παιχνίδι για πολλούς παίκτες + + + Ποτό + + + + Σε αυτήν την περιοχή, έχει στηθεί μια φάρμα. Οι γεωργικές ασχολίες σάς δίνουν τη δυνατότητα να δημιουργείτε ανανεώσιμες πηγές τροφών και άλλα αντικείμενα. + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις γεωργικές ασχολίες.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις γεωργικές ασχολίες. + + + + Το Σιτάρι, οι Κολοκύθες και τα Καρπούζια καλλιεργούνται φυτεύοντας σπόρους. Η συλλογή των σπόρων σιταριού γίνεται κόβοντας Ψηλό Γρασίδι ή θερίζοντας σιτάρι, ενώ οι Σπόροι Κολοκύθας και Καρπουζιού δημιουργούνται από Κολοκύθες και Καρπούζια αντίστοιχα. + + + Πατήστε{*CONTROLLER_ACTION_CRAFTING*} για να ανοίξετε το περιβάλλον χρήστη αποθέματος δημιουργίας. + + + Για να συνεχίσετε, πρέπει να φτάσετε στην αντίθετη πλευρά αυτής της τρύπας. + + + Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τη λειτουργία Δημιουργίας. + + + Πριν από τη φύτευση των σπόρων, θα πρέπει να μετατραπούν οι κύβοι χώματος σε Αγρόκτημα με τη βοήθεια ενός Σκαλιστηριού. Μια κοντινή πηγή νερού θα συμβάλλει στο καλό πότισμα του Αγροκτήματος και τη γρήγορη ανάπτυξη της σοδειάς, όπως επίσης και η διασφάλιση φωτός για την περιοχή. + + + Οι Κάκτοι πρέπει να φυτεύονται στην Άμμο και μεγαλώνοντας το ύψος του μπορεί να φτάσει έως και τρεις κύβους. Όπως συμβαίνει με τα Ζαχαροκάλαμα, εάν καταστρέψετε τον χαμηλότερο κύβο, θα μπορείτε να συλλέξετε τους κύβους από επάνω του.{*ICON*}81{*/ICON*} + + + Τα Μανιτάρια πρέπει να φυτεύονται σε περιοχή με λίγο φως. Εξαπλώνονται στις κοντινές, φτωχά φωτισμένες περιοχές.{*ICON*}39{*/ICON*} + + + Η Πάστα Οστών μπορεί να χρησιμοποιηθεί για την πλήρη ανάπτυξη των σοδειών ή για την καλλιέργεια Μανιταριών ώστε να γίνουν Τεράστια Μανιτάρια.{*ICON*}351:15{*/ICON*} + + + Το Σιτάρι περνάει από αρκετά στάδια κατά την ανάπτυξή του και είναι έτοιμο για συγκομιδή όταν είναι πιο σκούρο.{*ICON*}59:7{*/ICON*} + + + Για τις Κολοκύθες και τα Καρπούζια, θα πρέπει να υπάρχει ένας κύβος δίπλα από το σημείο που φυτέψατε το σπόρο για να μπορέσει να μεγαλώσει το φρούτο, όταν μεγαλώσει το κοτσάνι. + + + Τα Ζαχαροκάλαμα πρέπει να φυτεύονται σε κύβους Γρασιδιού, Χώματος ή Άμμου που βρίσκονται ακριβώς δίπλα σε κύβους νερού. Εάν κόψετε έναν κύβο Ζαχαροκάλαμου, θα πέσουν όλοι οι κύβοι που βρίσκονται από επάνω του.{*ICON*}83{*/ICON*} + + + Όταν βρίσκεστε σε λειτουργία Δημιουργίας, έχετε απεριόριστο αριθμό διαθέσιμων αντικειμένων και κύβους, μπορείτε να καταστρέφετε κύβους με ένα κλικ χωρίς εργαλεία, είστε άτρωτοι και μπορείτε να πετάτε. + + + + Στο σεντούκι αυτής της περιοχής, υπάρχουν ορισμένα εξαρτήματα για τη δημιουργία κυκλωμάτων με έμβολα. Δοκιμάστε να χρησιμοποιήσετε ή να ολοκληρώσετε τα κυκλώματα σε αυτήν την περιοχή ή να δημιουργήσετε τα δικά σας. Υπάρχουν περισσότερα παραδείγματα εκτός της περιοχής εκπαίδευσης. + + + + + Σε αυτήν την περιοχή, υπάρχει μια Πύλη για τον κόσμο του Nether! + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις Πύλες και το Nether.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις Πύλες και το Nether. + + + + + Μπορείτε να συλλέγετε σκόνη Κοκκινόπετρας εξορύσσοντας κομμάτια κοκκινόπετρας με τη βοήθεια μιας Σιδερένιας, Αδαμάντινης ή Χρυσής αξίνας. Μπορείτε να τη χρησιμοποιείτε για την τροφοδοσία έως 15 κύβων και μπορεί να μετακινηθεί ένας κύβος προς τα επάνω ή προς τα κάτω σε ύψος. + {*ICON*}331{*/ICON*} + + + + + Οι αναμεταδότες Κοκκινόπετρας μπορούν να χρησιμοποιηθούν για την επέκταση της απόστασης στην οποία μεταδίδεται το ρεύμα ή για τη δημιουργία καθυστέρησης σε ένα κύκλωμα. + {*ICON*}356{*/ICON*} + + + + + Όταν τροφοδοτείται ένα Έμβολο, εκτείνεται σπρώχνοντας έως 12 κύβους. Όταν μαζεύονται, τα Έμβολα με Κόλλα μπορούν να τραβήξουν μαζί τους έναν κύβο από τα περισσότερα διαθέσιμα είδη. + {*ICON*}33{*/ICON*} + + + + + Οι Πύλες δημιουργούνται τοποθετώντας κύβους Οψιανού σε ένα πλαίσιο πλάτους τεσσάρων κύβων και ύψους πέντε κύβων. Οι γωνιακοί κύβοι δεν είναι υποχρεωτικοί. + + + + + Ο κόσμος του Nether μπορεί να χρησιμοποιηθεί για να ταξιδεύετε γρήγορα στον Overworld - εάν διανύσετε απόσταση ενός κύβου στο Nether, αυτό ισοδυναμεί με 3 κύβους στον Overworld. + + + + + Τώρα βρίσκεστε στη λειτουργία Δημιουργίας. + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τη λειτουργία Δημιουργίας.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη λειτουργία Δημιουργίας. + + + + + Για να ενεργοποιήσετε μια Πύλη για το Nether, βάλτε φωτιά στους κύβους Οψιανού μέσα στο πλαίσιο χρησιμοποιώντας έναν Πυρόλιθο και Χάλυβα. Οι Πύλες μπορούν να απενεργοποιηθούν εάν χαλάσει το πλαίσιο, εάν προκύψει κάποια έκρηξη σε κοντινό μέρος ή περάσει κάποιο υγρό από μέσα τους. + + + + + Για να χρησιμοποιήσετε μια Πύλη για το Nether, μπείτε μέσα της. Η οθόνη σας θα γίνει μωβ και θα ακουστεί ένας ήχος. Μετά από μερικά δευτερόλεπτα, θα μεταφερθείτε σε μια άλλη διάσταση. + + + + + Το Nether είναι ένα μέρος γεμάτο κινδύνους και πολλή λάβα, αλλά μπορεί να σας φανεί χρήσιμο να συλλέξετε το Netherrack, το οποίο αν το ανάψετε μπορεί να καίει για πάντα, καθώς και για τη Λαμψόπετρας, που παράγει φως. + + + + Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τις γεωργικές ασχολίες. + + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα τσεκούρι για να κόψετε κορμούς δέντρων. + + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε μια αξίνα για να εξορύσσετε πέτρες και μεταλλεύματα. Μπορεί να χρειαστεί να φτιάξετε την αξίνα από καλύτερα υλικά για να εξάγετε πόρους από ορισμένους κύβους. + + + Ορισμένα εργαλεία είναι καλύτερα για επίθεση κατά των εχθρών. Συνιστάται η χρήση σπαθιού για τις επιθέσεις σας. + + + Τα Σιδερένια Γκόλεμ επίσης εμφανίζονται φυσικά για να προστατεύουν χωριά και σε περίπτωση που επιτεθείτε στους χωρικούς, θα αντεπιτεθούν. + + + Δεν μπορείτε να φύγετε από αυτήν την περιοχή μέχρι να ολοκληρώσετε τον εκπαιδευτικό οδηγό. + + + Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα φτυάρι για να εξορύσσετε μαλακά υλικά, όπως χώμα και άμμο. + + + Συμβουλή: Πατήστε παρατεταμένα {*CONTROLLER_ACTION_ACTION*}για να εξορύξετε και να κόψετε χρησιμοποιώντας το χέρι σας ή οτιδήποτε κρατάτε. Μπορεί να χρειαστεί να κατασκευάσετε ένα εργαλείο για την εξόρυξη ορισμένων κύβων... + + + Στο σεντούκι δίπλα στο ποτάμι, υπάρχει μια βάρκα. Για να χρησιμοποιήσετε τη βάρκα, τοποθετήστε το δείκτη επάνω της και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} με το δείκτη επάνω στη βάρκα για να ανεβείτε επάνω. + + + Στο σεντούκι δίπλα στη λίμνη, υπάρχει ένα καλάμι ψαρέματος. Πάρτε το καλάμι από το σεντούκι και επιλέξτε το ως το τρέχον αντικείμενο στο χέρι σας για να το χρησιμοποιήσετε. + + + Αυτός ο πιο προηγμένος μηχανισμός εμβόλου δημιουργεί μια αυτοεπισκευαζόμενη γέφυρα! Πατήστε το κουμπί για να ενεργοποιηθεί και έπειτα παρακολουθήστε πώς αλληλεπιδρούν τα εξαρτήματα για να μάθετε περισσότερα. + + + Το εργαλείο που χρησιμοποιείτε έχει καταστραφεί. Κάθε φορά που χρησιμοποιείτε ένα εργαλείο, αυτό καταστρέφεται σιγά σιγά και στο τέλος διαλύεται. Η χρωματιστή μπάρα κάτω από το αντικείμενο στο απόθεμά σας δείχνει την τρέχουσα κατάσταση ζημιάς. + + + Πατήστε παρατεταμένα{*CONTROLLER_ACTION_JUMP*} για να κολυμπήσετε προς τα επάνω. + + + Σε αυτήν την περιοχή, υπάρχει ένα βαγόνι ορυχείου σε μια πλατφόρμα. Για να μπείτε στο βαγόνι, τοποθετήστε το δείκτη επάνω του και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} στο κουμπί για να μετακινήσετε το βαγόνι. + + + Τα Σιδερένια Γκόλεμ δημιουργούνται με τέσσερις Σιδερένιους Κύβους στο προβαλλόμενο μοτίβο, με μια κολοκύθα επάνω στον μεσαίο κύβο. Τα Σιδερένια Γκόλεμ επιτίθενται στους εχθρούς σας. + + + Δώστε Σιτάρι στις αγελάδες, τα mooshroom ή τα πρόβατα, Καρότα στα γουρούνια, Σπόρους Σιταριού ή Φυτά Nether στις κότες ή οποιοδήποτε είδος κρέατος στους λύκους και θα αρχίσουν να αναζητούν κάποιο άλλο ζώο ίδιου είδους που να υπάρχει κοντά τους το οποίο βρίσκεται επίσης σε Λειτουργία Αγάπης. + + + Όταν συναντιούνται δύο ζώα ίδιου είδους και βρίσκονται και τα δύο σε "Λειτουργία Αγάπης", θα φιληθούν για λίγα δευτερόλεπτα και στη συνέχεια θα εμφανιστεί το μωρό τους. Το μικρό ζωάκι θα ακολουθεί τους γονείς του για λίγο μέχρι να μεγαλώσει και να γίνει και το ίδιο μεγάλο ζώο. + + + Αφού βρεθεί σε Λειτουργία Αγάπης, το ζώο δεν θα μπορεί να εισέλθει ξανά σε αυτή την κατάσταση για περίπου πέντε λεπτά. + + + + Σε αυτήν την περιοχή, είναι συγκεντρωμένα ζώα. Μπορείτε να εκθρέψετε ζώα με σκοπό να αναπαραχθούν. + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα ζώα και τη ζωική αναπαραγωγή.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα ζώα και τη ζωική αναπαραγωγή. + + + + Για να αναπαραχθούν τα ζώα, θα πρέπει να τα ταΐζετε με την κατάλληλη τροφή για να ενεργοποιηθεί η "Λειτουργία Αγάπης". + + + Ορισμένα ζώα θα σας ακολουθήσουν, εάν έχετε την αγαπημένη τους τροφή στο χέρι σας. Αυτό κάνει εύκολη τη συγκέντρωση των ζώων σε ένα μέρος για να αναπαραχθούν.{*ICON*}296{*/ICON*} + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα Γκόλεμ.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα Γκόλεμ. + + + + Τα Γκόλεμ δημιουργούνται με την τοποθέτηση μιας κολοκύθας επάνω σε μια στοίβα κύβων. + + + Τα Γκόλεμ του Χιονιού δημιουργούνται με δύο Κύβους Χιονιού, ο ένας επάνω στον άλλο, με μια κολοκύθα στην κορυφή. Τα Γκόλεμ του Χιονιού πετάνε χιονόμπαλες στους εχθρούς σας. + + + + Μπορείτε να εξημερώσετε τους άγριους λύκους δίνοντάς τους κόκαλα. Μόλις εξημερωθούν, εμφανίζονται Καρδιές Αγάπης τριγύρω τους. Οι εξημερωμένοι λύκοι ακολουθούν τον παίκτη και τον υπερασπίζονται, εάν δεν τους έχει δοθεί εντολή να κάτσουν κάτω. + + + + Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τα ζώα και την αναπαραγωγή τους. + + + + Σε αυτήν την περιοχή, υπάρχουν ορισμένες κολοκύθες και κύβοι για να δημιουργήσετε ένα Γκόλεμ του Χιονιού και ένα Σιδερένιο Γκόλεμ. + + + + + Η θέση και η κατεύθυνση στην οποία τοποθετείτε μια πηγή τροφοδοσίας μπορεί να αλλάξει τον τρόπο που επηρεάζει τους γύρω κύβους. Για παράδειγμα, μπορεί να σβηστεί ένας πυρσός Κοκκινόπετρας δίπλα σε έναν κύβο, εάν ο κύβος τροφοδοτείται από κάποια άλλη πηγή. + - - {*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*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : HUD{*ETW*}{*B*}{*B*} -Το HUD εμφανίζει πληροφορίες σχετικά με την κατάστασή σας, την υγεία, το οξυγόνο που απομένει όταν βρίσκεστε κάτω από το νερό, το επίπεδο πείνας (πρέπει να φάτε για να το συμπληρώσετε) και την πανοπλία σας εάν φοράτε. -Αν χάσετε ζωή, αλλά έχετε μπάρα φαγητού με 9 ή περισσότερα{*ICON_SHANK_01*}, η ζωή σας θα αναπληρωθεί αυτόματα. Τρώγοντας φαγητό, θα συμπληρώσετε τη μπάρα φαγητού σας.{*B*} -Επίσης εδώ εμφανίζεται και η Μπάρα Εμπειρίας με μια αριθμητική τιμή που υποδεικνύει το Επίπεδο Εμπειρίας σας και τη μπάρα που δείχνει τους Πόντους Εμπειρίας που απαιτούνται για την αύξηση του Επιπέδου Εμπειρίας σας. -Οι Πόντοι Εμπειρίας αποκτούνται με τη συλλογή των Σφαιρών Εμπειρίας που πέφτουν από τα mob όταν πεθαίνουν, από την εξόρυξη συγκεκριμένων τύπων κύβων, την εκτροφή ζώων, το ψάρεμα και το λιώσιμο μεταλλευμάτων σε φούρνο.{*B*}{*B*} -Επίσης, εμφανίζει τα αντικείμενα που είναι διαθέσιμα για χρήση. Χρησιμοποιήστε το{*CONTROLLER_ACTION_LEFT_SCROLL*} και το{*CONTROLLER_ACTION_RIGHT_SCROLL*} για να αλλάξετε το αντικείμενο που κρατάτε. - + + + Χρησιμοποιήστε τη Βάση Παρασκευής για να δημιουργήσετε ένα Φίλτρο Πυραντίστασης. Θα χρειαστείτε ένα Μπουκάλι Νερού, Φυτό Nether και Κρέμα Μάγματος. + - - {*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*} για να τοποθετήσετε μόνο ένα.{*B*}{*B*} -Εάν το αντικείμενο πάνω από το οποίο βρίσκεστε είναι πανοπλία, θα εμφανιστεί μια επεξήγηση του εργαλείου που θα επιτρέψει τη γρήγορη μετακίνησή του στη σωστή υποδοχή πανοπλίας στο απόθεμα.{*B*}{*B*} -Μπορείτε να αλλάξετε το χρώμα της Δερμάτινης Πανοπλίας σας βάφοντάς τη. Για να το κάνετε αυτό, πηγαίνετε στο μενού του αποθέματος, κρατήστε τη βαφή στο δείκτη σας και στη συνέχεια πατήστε το{*CONTROLLER_VK_X*} ενώ ο δείκτης βρίσκεται πάνω από το αντικείμενο που θέλετε να βάψετε. - + + + Κρατώντας ένα φίλτρο στο χέρι σας, πατήστε παρατεταμένα{*CONTROLLER_ACTION_USE*} για να το χρησιμοποιήσετε. Για ένα κανονικό φίλτρο, θα το πιείτε και οι ιδιότητές του θα εφαρμοστούν σε εσάς, ενώ για ένα Φίλτρο Εκτόξευσης, θα το πετάξετε και οι ιδιότητές του θα εφαρμοστούν στα πλάσματα που βρίσκονται κοντά στο σημείο που θα πέσει. + Μπορείτε να δημιουργήσετε Φίλτρα Εκτόξευσης προσθέτοντας πυρίτιδα σε κανονικά φίλτρα. + - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΣΕΝΤΟΥΚΙ{*ETW*}{*B*}{*B*} -Αφού κατασκευάσετε ένα σεντούκι, μπορείτε να το τοποθετήσετε στον κόσμο και στη συνέχεια να το χρησιμοποιήσετε με{*CONTROLLER_ACTION_USE*} για να αποθηκεύσετε αντικείμενα από το απόθεμά σας.{*B*}{*B*} -Χρησιμοποιήστε το δείκτη για να μετακινήσετε αντικείμενα από το απόθεμα στο σεντούκι και αντίστροφα.{*B*}{*B*} -Τα αντικείμενα που βρίσκονται στο σεντούκι θα αποθηκευτούν εκεί για να τα μεταφέρετε ξανά πίσω στο απόθεμά σας αργότερα. - + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_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*} για να κατασκευάσετε το αντικείμενο και να το τοποθετήσετε στο απόθεμά σας. - + + + Μπορείτε να γεμίσετε ένα γυάλινο μπουκάλι από ένα Καζάνι που περιέχει νερό ή από έναν κύβο νερού. Γεμίστε το γυάλινο μπουκάλι τώρα τοποθετώντας το δείκτη σε μια πηγή νερού και πατώντας{*CONTROLLER_ACTION_USE*}. + - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΤΡΑΠΕΖΙ ΚΑΤΑΣΚΕΥΗΣ{*ETW*}{*B*}{*B*} -Μπορείτε να κατασκευάσετε μεγαλύτερα αντικείμενα, χρησιμοποιώντας ένα Τραπέζι Κατασκευής.{*B*}{*B*} -Τοποθετήστε το τραπέζι στον κόσμο σας και πατήστε{*CONTROLLER_ACTION_USE*} για να το χρησιμοποιήσετε.{*B*}{*B*} -Η κατασκευή σε τραπέζι λειτουργεί όπως και η βασική κατασκευή, αλλά έχετε μεγαλύτερη περιοχή κατασκευής και μεγαλύτερη ποικιλία αντικειμένων που μπορείτε να κατασκευάσετε. - + + + Χρησιμοποιήστε το Φίλτρο Πυραντίστασης στον εαυτό σας. + + + + + Για να μαγέψετε ένα αντικείμενο, πρώτα τοποθετήστε το στην υποδοχή μαγέματος. Μπορείτε να μαγέψετε όπλα, πανοπλίες και ορισμένα εργαλεία για να τους δώσετε ειδικές δυνάμεις, όπως βελτιωμένη αντίσταση στη ζημιά ή αύξηση του αριθμού των αντικειμένων που δημιουργούνται όταν γίνεται εξόρυξη σε κύβους. + + + + + Όταν ένα αντικείμενο τοποθετείται στην υποδοχή μαγέματος, τα κουμπιά στη δεξιά πλευρά αλλάζουν και παρέχουν μια ευρεία γκάμα διάφορων ειδών μαγέματος. + + + + + Ο αριθμός στο κουμπί αναπαριστά το κόστος σε επίπεδα εμπειρίας που θα εφαρμόσει το συγκεκριμένο είδος μαγέματος στο αντικείμενο. Εάν δεν έχετε αρκετά υψηλό επίπεδο, το κουμπί θα είναι απενεργοποιημένο. + + + + + Τώρα που είστε ανθεκτικοί στη φωτιά και τη λάβα, καλό θα ήταν να εξερευνήσετε εάν υπάρχουν μέρη τα οποία δεν μπορούσατε να επισκεφτείτε μέχρι τώρα. + + + + + Αυτό είναι το περιβάλλον χρήστη μαγέματος το οποίο μπορείτε να χρησιμοποιείτε για να προσθέτετε μαγικές ιδιότητες σε όπλα, πανοπλίες και ορισμένα εργαλεία. + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το περιβάλλον χρήστη μαγέματος.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με το περιβάλλον χρήστη μαγέματος. + + + + + Σε αυτήν την περιοχή, υπάρχει μια Βάση Παρασκευής Φίλτρων, ένα Καζάνι και ένα σεντούκι γεμάτο υλικά για την παρασκευή φίλτρων. + + + + + Το ξυλοκάρβουνο μπορεί να χρησιμοποιηθεί ως καύσιμο, αλλά μπορεί και να μετατραπεί σε πυρσό μαζί με ένα ραβδί. + + + + + Εάν βάλετε άμμο στην υποδοχή συστατικών, μπορείτε να φτιάξετε γυαλί. Δημιουργήστε κομμάτια γυαλιού για να τα χρησιμοποιήσετε ως παράθυρα στο καταφύγιό σας. + + + + + Αυτό είναι το περιβάλλον χρήστη παρασκευής φίλτρων. Μπορείτε να το χρησιμοποιείτε για να δημιουργείτε φίλτρα με πολλές και διαφορετικές ιδιότητες. + + + + + Μπορούν να χρησιμοποιηθούν ως καύσιμο πολλά ξύλινα αντικείμενα, αλλά δεν καίγονται όλα τα αντικείμενα στον ίδιο χρόνο. Μπορείτε επίσης να ανακαλύψετε άλλα αντικείμενα στον κόσμο που μπορούν να χρησιμοποιηθούν ως καύσιμο. + + + + + Όταν τα αντικείμενά σας φλογιστούν, μπορείτε να τα μετακινήσετε από την εξωτερική περιοχή στο απόθεμά σας. Θα πρέπει να πειραματιστείτε με διάφορα συστατικά για να δείτε τι μπορείτε να φτιάξετε. + + + + + Εάν χρησιμοποιήσετε ως συστατικό το ξύλο, τότε μπορείτε να φτιάξετε ξυλοκάρβουνο. Τοποθετήστε κάποιο καύσιμο στο φούρνο και το ξύλο στην υποδοχή συστατικών. Μπορεί να χρειαστεί μερική ώρα για να φτιάξει ο φούρνος το ξυλοκάρβουνο, οπότε μπορείτε να κάνετε κάποια άλλη εργασία και να επιστρέψετε αργότερα για να ελέγξετε την πρόοδο. + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε τη βάση παρασκευής φίλτρων. + + + + + Με την προσθήκη Ζυμωμένου Ματιού Αράχνης, χαλάει η σύσταση του φίλτρου, το οποίο μπορεί να γίνει φίλτρο με αντίθετες ιδιότητες, ενώ με την προσθήκη Πυρίτιδας, το φίλτρο γίνεται Φίλτρο Εκτόξευσης, το οποίο μπορεί να πεταχθεί για να εφαρμοστούν οι ιδιότητές του σε μια κοντινή περιοχή. + + + + + Δημιουργήστε ένα Φίλτρο Πυραντίστασης προσθέτοντας πρώτα το Φυτό Nether σε ένα Μπουκάλι Νερό και έπειτα προσθέτοντας την Κρέμα Μάγματος. + + + + + Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη παρασκευής φίλτρων. + + + + + Παρασκευάζετε φίλτρα τοποθετώντας ένα συστατικό στην επάνω υποδοχή και ένα μπουκαλάκι φίλτρου ή νερού στις κάτω υποδοχές (μπορούν να παρασκευαστούν έως 3 τη φορά). Μόλις τοποθετηθούν συστατικά που μπορούν να συνδυαστούν, ξεκινά η παρασκευαστική διαδικασία και, μετά από λίγη ώρα, δημιουργείται το φίλτρο. + + + + + Όλα τα φίλτρα ξεκινούμε με ένα Μπουκάλι Νερό. Τα περισσότερα φίλτρα δημιουργούνται χρησιμοποιώντας ως πρώτο υλικό ένα Φυτό Nether για τη δημιουργία ενός Δυσάρεστου Φίλτρου, ενώ απαιτείται τουλάχιστον ένα ακόμα συστατικό για τη δημιουργία του τελικού φίλτρου. + + + + + Όταν παρασκευάζετε ένα φίλτρο, μπορείτε να τροποποιήσετε τις ιδιότητές του. Με την προσθήκη Σκόνης Κοκκινόπετρας, αυξάνεται η διάρκεια των ιδιοτήτων του, ενώ με την προσθήκη Σκόνης Λαμψόπετρας, μπορούν να ενισχυθούν οι ιδιότητές του. + + + + + Επιλέξτε ένα είδος μαγέματος και πατήστε{*CONTROLLER_VK_A*} για να μαγέψετε το αντικείμενο. Αυτό θα έχει ως αποτέλεσμα τη μείωση του επιπέδου εμπειρίας σας βάσει του κόστους του μαγέματος. + + + + + Πατήστε{*CONTROLLER_ACTION_USE*} για να ρίξετε την πετονιά και να ξεκινήσετε να ψαρεύετε. Πατήστε{*CONTROLLER_ACTION_USE*} ξανά για να τραβήξετε πίσω την πετονιά. + {*FishingRodIcon*} + + + + + Εάν περιμένετε μέχρι να βυθιστεί ο φελλός κάτω από την επιφάνεια του νερού προτού τραβήξετε πίσω την πετονιά, μπορείτε να πιάσετε κάποιο ψάρι. Μπορείτε να φάτε τα ψάρια ωμά ή να τα μαγειρέψετε σε κάποιο φούρνο, για να αποκαταστήσετε την υγεία σας. + {*FishIcon*} + + + + + Όπως συμβαίνει και με άλλα εργαλεία, ένα καλάμι ψαρέματος έχει έναν καθορισμένο αριθμό χρήσεων. Αυτές οι χρήσεις, όμως, δεν περιορίζονται αποκλειστικά στο ψάρεμα. Θα πρέπει να πειραματιστείτε μαζί του για να δείτε τι άλλο μπορείτε να πιάσετε ή να ενεργοποιήσετε με αυτό... + {*FishingRodIcon*} + + + + + Με τις βάρκες, μπορείτε να μετακινήστε πιο γρήγορα στο νερό. Μπορείτε να την κατευθύνετε χρησιμοποιώντας το{*CONTROLLER_ACTION_MOVE*} και το{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + Τώρα χρησιμοποιείτε ένα καλάμι ψαρέματος. Πατήστε{*CONTROLLER_ACTION_USE*} για να το χρησιμοποιήσετε.{*FishingRodIcon*} + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το ψάρεμα.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με το ψάρεμα. + + + + + Αυτό είναι ένα κρεβάτι. Πατήστε{*CONTROLLER_ACTION_USE*} με το δείκτη επάνω του σε νυχτερινές ώρες, για να κοιμηθείτε το βράδυ και να ξυπνήσετε το πρωί.{*ICON*}355{*/ICON*} + + + + + Σε αυτήν την περιοχή, υπάρχουν ορισμένα απλά κυκλώματα Κοκκινόπετρας και Εμβόλων, καθώς και ένα σεντούκι με πολλά αντικείμενα για την επέκταση αυτών των κυκλωμάτων. + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα κυκλώματα Κοκκινόπετρας και των Εμβόλων.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα κυκλώματα Κοκκινόπετρας και των Εμβόλων. + + + + + Οι Μοχλοί, τα Κουμπιά, οι Πλάκες Πίεσης και οι Πυρσοί Κοκκινόπετρας μπορούν όλα να τροφοδοτούν με ρεύμα τα κυκλώματα, είτε προσαρτώντας τα απευθείας επάνω στο αντικείμενο που θέλετε να ενεργοποιήσετε είτε συνδέοντάς τα με σκόνη Κοκκινόπετρας. + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα κρεβάτια.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη χρήση των κρεβατιών. + + + + + Τα κρεβάτια θα πρέπει να τοποθετούνται σε ένα ασφαλές, καλοφωτισμένο μέρος, για να μη σας ξυπνάνε τα τέρατα κατά τη διάρκεια της νύχτας. Έχοντας χρησιμοποιήσει κάποιο κρεβάτι, εάν πεθάνετε, θα αναγεννηθείτε στο συγκεκριμένο κρεβάτι. + {*ICON*}355{*/ICON*} + + + + + Εάν υπάρχουν άλλοι παίκτες στο παιχνίδι σας, θα πρέπει όλοι να βρίσκονται στο κρεβάτι τους την ίδια ώρα για να μπορέσουν όλοι οι χαρακτήρες να κοιμηθούν. + {*ICON*}355{*/ICON*} + + + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις βάρκες.{*B*}
 Πατήστε{*CONTROLLER_VK_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*}Φυτό Nether{*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*} -Οι Πόντοι Εμπειρίας που συλλέγονται μετά το θάνατο ενός mob ή κατά την εξόρυξη ορισμένων κύβων ή το λιώσιμό τους σε φούρνο, μπορούν να χρησιμοποιηθούν για το μάγεμα ορισμένων εργαλείων, όπλων, πανοπλίας και βιβλίων.{*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 ή στα πρόβατα, Καρότα στο γουρούνι, Σπόρους Σιταριού ή Φυτά Nether στην κότα ή οποιοδήποτε είδος κρέατος στον λύκο και θα αρχίσουν να αναζητούν κάποιο άλλο ζώο ίδιου είδους που να βρίσκεται κοντά τους το οποίο βρίσκεται επίσης σε "Λειτουργία Αγάπης".{*B*} -Όταν συναντιούνται δύο ζώα ίδιου είδους και βρίσκονται και τα δύο σε "Λειτουργία Αγάπης", θα φιληθούν για λίγα δευτερόλεπτα και στη συνέχεια θα εμφανιστεί το μωρό τους. Το μωρό των ζώων θα ακολουθεί τους γονείς του για λίγο μέχρι να μεγαλώσει και να γίνει και το ίδιο μεγάλο ζώο.{*B*} -Αφού βρεθεί σε "Λειτουργία Αγάπης", το ζώο δεν θα μπορεί να εισέλθει ξανά σε αυτή την κατάσταση για περίπου πέντε λεπτά.{*B*} -Υπάρχει ένα όριο στον αριθμό των ζώων που μπορούν να υπάρχουν σε ένα κόσμο και έτσι ίσως διαπιστώσετε ότι τα ζώα δεν θα αναπαράγονται όταν υπάρχουν πολλά από αυτά. + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το μάγεμα.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη διαδικασία του μαγέματος. + - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΠΥΛΗ NETHER{*ETW*}{*B*}{*B*} -Η Πύλη Nether επιτρέπει στον παίκτη να ταξιδεύει ανάμεσα στον Overworld και στον κόσμο του Nether. Ο κόσμος του Nether μπορεί να χρησιμοποιηθεί για να ταξιδεύετε γρήγορα στον Overworld, εάν διανύσετε απόσταση ενός κύβου στο Nether, αυτό ισοδυναμεί με 3 κύβους στον Overworld, έτσι όταν δημιουργείτε μια πύλη -στον κόσμο του Nether και βγείτε από αυτήν, θα βρίσκεστε 3 φορές πιο μακριά από το σημείο εισόδου σας.{*B*}{*B*} -Χρειάζονται τουλάχιστον 10 κύβοι Οψιανού για να χτίσετε την πύλη και η πύλη πρέπει να έχει ύψος 5 κύβους, πλάτος 4 κύβους και βάθος 1 κύβους. Μόλις χτίσετε το πλαίσιο της πύλης, πρέπει να βάλετε φωτιά στο χώρο που βρίσκεται μέσα στο πλαίσιο για να την ενεργοποιήσετε. Αυτό μπορεί να γίνει χρησιμοποιώντας το αντικείμενο Πυρόλιθος και Χάλυβας ή το αντικείμενο Μπάλα Φωτιάς.{*B*}{*B*} -Για παραδείγματα κατασκευής πυλών, δείτε την εικόνα στα δεξιά. - + + + Μπορείτε επίσης να συγκεντρώνετε Επίπεδα Εμπειρίας χρησιμοποιώντας ένα Μπουκάλι Μαγέματος, το οποίο όταν το πετάτε, δημιουργούνται Σφαίρες Εμπειρίας στο σημείο όπου προσγειώνεται. Στη συνέχεια, μπορείτε να συλλέγετε αυτές τις σφαίρες. + - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΑΠΑΓΟΡΕΥΣΗ ΕΠΙΠΕΔΩΝ{*ETW*}{*B*}{*B*} -Εάν εντοπίσετε προσβλητικό περιεχόμενο σε ένα επίπεδο που παίζετε, μπορείτε να επιλέξετε να προσθέσετε το επίπεδο αυτό στη λίστα Απαγορευμένων Επιπέδων σας. -Εάν θέλετε να το κάνετε αυτό, ανοίξτε το μενού "Παύση" και στη συνέχεια πατήστε{*CONTROLLER_VK_RB*} για να επιλέξετε την επεξήγηση του Επιπέδου Απαγόρευσης. -Όταν προσπαθήσετε στο μέλλον να συμμετέχετε ξανά σε αυτό το επίπεδο, θα ειδοποιηθείτε ότι το επίπεδο βρίσκεται στη λίστα Αποκλεισμένων Επιπέδων και θα σας δοθεί η επιλογή να το αφαιρέσετε από τη λίστα και να συνεχίσετε στο επίπεδο ή να αποχωρήσετε. + + + Τα βαγόνια ορυχείου κινούνται επάνω σε ράγες. Μπορείτε επίσης να κατασκευάσετε ένα ηλεκτροκίνητο βαγόνι τοποθετώντας στο φούρνο ένα βαγόνι που περιέχει ένα σεντούκι. + {*RailIcon*} + - - {*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*} - Όταν ενεργοποιηθεί αυτή η επιλογή, θα δημιουργηθεί ένας εντελώς επίπεδος κόσμος στον Overworld και στο Nether.{*B*}{*B*} - - {*T2*}Έξτρα Σεντούκι{*ETW*}{*B*} - Όταν ενεργοποιηθεί αυτή η επιλογή, θα δημιουργηθεί ένα σεντούκι με χρήσιμα αντικείμενα κοντά στο σημείο επαναφοράς του παίκτη.{*B*}{*B*} - - {*T2*}Επαναφορά Nether{*ETW*}{*B*} - Όταν ενεργοποιηθεί αυτή η επιλογή, το Nether θα δημιουργηθεί ξανά. Αυτό είναι χρήσιμο εάν έχετε πραγματοποιήσει παλαιότερη αποθήκευση κατά την οποία δεν υπήρχαν τα Κάστρα του Nether.{*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*} -{*KICK_PLAYER_DESCRIPTION*}{*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*} - Αυτή η δυνατότητα επιτρέπει στον παίκτη να μετακινεί παίκτες ή τον εαυτό του με άλλους παίκτες στον κόσμο. - + + + Μπορείτε επίσης να κατασκευάσετε ηλεκτρικές ράγες, οι οποίες τροφοδοτούνται από πυρσούς και κυκλώματα από κοκκινόπετρα για την επιτάχυνση του βαγονιού. Αυτές μπορούν να συνδεθούν σε διακόπτες, μοχλούς και πλάκες πίεσης για τη δημιουργία πιο σύνθετων συστημάτων. + {*PoweredRailIcon*} + - - Επόμενη Σελίδα + + + Τώρα κουμαντάρετε μια βάρκα. Για να βγείτε από τη βάρκα, τοποθετήστε το δείκτη επάνω της και πατήστε{*CONTROLLER_ACTION_USE*} .{*BoatIcon*} + - - Προηγούμενη Σελίδα + + + Στα σεντούκια αυτής της περιοχής, μπορείτε να βρείτε ορισμένα μαγεμένα αντικείμενα, Μπουκάλια Μαγέματος και ορισμένα αντικείμενα που δεν έχουν ακόμα λάβει μαγικές ιδιότητες και μπορείτε να πειραματιστείτε μαζί τους στο Τραπέζι Μαγέματος. + - - Βασικές Πληροφορίες + + + Τώρα βρίσκεστε σε ένα βαγόνι ορυχείου. Για να βγείτε από το βαγόνι, τοποθετήστε το δείκτη επάνω του και πατήστε{*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} + - - HUD + + {*B*} + Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα βαγόνια ορυχείου.{*B*} + Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα βαγόνια ορυχείου. + - - Απόθεμα + + Εάν μετακινήσετε το δείκτη εκτός του περιβάλλοντος χρήστη ενώ μεταφέρετε ένα αντικείμενο, μπορείτε να ξεσκαρτάρετε το συγκεκριμένο αντικείμενο. - - Σεντούκια + + Ανάγνωση - - Κατασκευή + + Κρέμασμα - - Φούρνος + + Βολή - - Διανομέας + + Άνοιγμα - - Κτηνοτροφία + + Αλλαγή Τόνου - - Εκτροφή Ζώων + + Πυροκρότηση - - Παρασκευή Φίλτρου + + Φύτεμα - - Μάγεμα + + Ξεκλείδωμα Πλήρους Παιχνιδιού - - Πύλη Nether + + Διαγραφή Αποθήκευσης - - Για Πολλούς Παίκτες + + Διαγραφή - - Κοινοποίηση Στιγμιοτύπων Οθόνης + + Όργωμα - - Απαγόρευση Επιπέδων + + Συγκομιδή + + + Συνέχεια - - Λειτουργία Δημιουργίας + + Κολύμπι προς τα Επάνω - - Επιλογές Οικοδεσπότη και Παίκτη + + Χτύπημα - - Ανταλλαγή + + Γάλα - - Αμόνι + + Συλλογή - - Το End + + Άδειασμα - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΤΟ END{*ETW*}{*B*}{*B*} -Το End είναι μια άλλη διάσταση του παιχνιδιού, στην οποία μπορείτε να μεταβείτε μέσω μιας ενεργής Πύλης End. Την Πύλη End μπορείτε να την βρείτε σε ένα Φρούριο, το οποίο βρίσκεται βαθιά μέσα στη γη στον Overworld.{*B*} -Για να ενεργοποιήσετε την Πύλη End, θα χρειαστεί να βάλετε ένα Μάτι του Ender σε οποιαδήποτε Πύλη End δεν διαθέτει τέτοιο μάτι.{*B*} -Μόλις ενεργοποιηθεί η πύλη, πηδήξτε μέσα σε αυτή και θα μεταφερθείτε στο End.{*B*}{*B*} -Στο End θα συναντήσετε τον Δράκο του Ender, έναν άγριο και ισχυρό εχθρό, καθώς και πολλούς Enderman, γι' αυτό θα πρέπει να είστε καλά προετοιμασμένοι για τη μάχη προτού πάτε εκεί!{*B*}{*B*} -Θα δείτε ότι υπάρχουν Κρύσταλλοι του Ender πάνω από οκτώ καρφιά Οψιανού τα οποία χρησιμοποιεί ο Δράκος του Ender για να θεραπεύεται, -έτσι το πρώτο βήμα στη μάχη είναι να καταστρέψετε αυτούς τους κρυστάλλους.{*B*}< -Τους πρώτους μπορείτε να τους φτάσετε με βέλη, αλλά οι υπόλοιποι προστατεύονται από ένα Σιδερένιο Κλουβί και θα χρειαστεί να δημιουργήσετε μια κατασκευή για να τους φτάσετε.{*B*}{*B*} -Ενώ το κάνετε αυτό, ο Δράκος του Ender θα σας επιτίθεται πετώντας καταπάνω σας και ρίχνοντάς σας μπάλες με οξύ!{*B*} -Εάν πλησιάσετε την περιοχή όπου βρίσκονται τα αυγά στο κέντρο των καρφιών, ο Δράκος του Ender θα πετάξει προς τα κάτω και θα σας επιτεθεί και τότε είναι η κατάλληλη στιγμή για να του προκαλέσετε ζημιά!{*B*} -Αποφύγετε την όξινη ανάσα του και στοχεύστε στα μάτια του για καλύτερα αποτελέσματα. Εάν είναι δυνατόν, προσκαλέστε και μερικούς φίλους σας στο End για να σας βοηθήσουν με τη μάχη!{*B*}{*B*} -Όταν βρίσκεστε στο End, οι φίλοι σας θα μπορούν να δουν τη θέση της Πύλης End μέσα στο Φρούριο στους χάρτες τους -για να σας εντοπίσουν εύκολα. + + Σέλα - - Τρέξιμο + + Τοποθέτηση - - Τι Νέο Υπάρχει + + Τροφή - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Αλλαγές και Προσθήκες{*ETW*}{*B*}{*B*} -- Προστέθηκαν νέα αντικείμενα - Σμαράγδι, Κομμάτια Σμαραγδιού, Κύβοι Σμαραγδιού, Σεντούκι του Ender, Γάντζος Σύρματος, Μαγεμένο Χρυσό Μήλο, Αμόνι, Γλάστρα, Πέτρινα Τείχη, Πέτρινα Τείχη με Βρύα, Ζωγραφιά Wither, Πατάτα, Ψητή Πατάτα, Δηλητηριώδης Πατάτα, Καρότο, Χρυσό Καρότο, Καρότο σε ραβδί, -Κολοκυθόπιτα, Φίλτρο Νυχτερινής Όρασης, Φίλτρο Αορατότητας, Χαλαζίας Nether, Κομμάτια Χαλαζία Nether, Κύβοι Χαλαζία, Πλάκα Χαλαζία, Σκαλοπάτια Χαλαζία, Λαξευμένος Κύβος Χαλαζία, Κύβος Κολόνας Χαλαζία, Μαγεμένο Βιβλίο, Χαλί.{*B*} -- Προστέθηκαν νέες συνταγές για Λείο Αμμόλιθο και Λαξευμένο Αμμόλιθο.{*B*} -- Προστέθηκαν νέα Mob - Χωρικοί Ζόμπι.{*B*} -- Προστέθηκαν νέες δυνατότητες δημιουργίας εδάφους - Ναοί Ερήμου, Χωριά Ερήμου, Ναοί Ζούγκλας.{*B*} -- Προστέθηκε η δυνατότητα "Ανταλλαγή με χωρικούς".{*B*} -- Προστέθηκε το περιβάλλον χρήστη Αμόνι.{*B*} -- Δυνατότητα βαφής δερμάτινης πανοπλίας.{*B*} -- Δυνατότητα βαφής κολάρων σκύλου.{*B*} -- Δυνατότητα ελέγχου κατά την ίππευση ενός γουρουνιού με ένα Καρότο σε Ραβδί.{*B*} -- Ενημερωμένο περιεχόμενο Έξτρα Σεντουκιού με περισσότερα αντικείμενα.{*B*} -- Αλλαγή θέσης μισών κύβων και άλλων κύβων σε μισούς κύβους.{*B*} -- Αλλαγή θέσης ανάποδων σκαλοπατιών και πλακών.{*B*} -- Προστέθηκαν διαφορετικά επαγγέλματα χωρικών.{*B*} -- Οι χωρικοί που δημιουργήθηκαν από ένα αυγό επαναφοράς θα έχουν τυχαίο επάγγελμα.{*B*} -- Προστέθηκε η πλάγια θέση κορμών δέντρων.{*B*} -- Οι φούρνοι μπορούν να χρησιμοποιούν ξύλινα εργαλεία για καύσιμο.{*B*} -- Τα Τζάμια Πάγου και Γυαλιού μπορείτε να τα συλλέξετε με μαγεμένα εργαλεία μεταξωτής υφής.{*B*} -- Τα Ξύλινα Κουμπιά και οι Ξύλινες Πλάκες Πίεσης μπορούν να ενεργοποιηθούν με βέλη.{*B*} -- Τα mob του Nether μπορούν να εισέλθουν στον Overworld μέσα από Πύλες.{*B*} -- Οι Creeper και οι Αράχνες είναι επιθετικές προς τον τελευταίο παίκτη που τους χτύπησε.{*B*} -- Τα mob που βρίσκονται στη Λειτουργία Δημιουργίας γίνονται ξανά ουδέτερα μετά από σύντομο χρονικό διάστημα.{*B*} -- Αφαιρέστε τα εμπόδια όταν πνίγεστε.{*B*} -- Οι πόρτες που έσπασαν τα ζόμπι εμφανίζουν ζημιά.{*B*} -- Ο πάγος λιώνει στο Nether.{*B*} -- Τα Καζάνια γεμίζουν όταν βρίσκονται έξω στη βροχή.{*B*} -- Τα Έμβολα χρειάζονται το διπλάσιο χρόνο για να ενημερωθούν.{*B*} -- Όταν τα γουρούνια σκοτώνονται, πέφτει η Σέλα τους (εάν είχαν).{*B*} -- Το χρώμα του ουρανού Στο End άλλαξε.{*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, Γάντζος Σύρματος, Μαγεμένο Χρυσό Μήλο, Αμόνι, Γλάστρα, Πέτρινα Τείχη, Πέτρινα Τείχη με Βρύα, Ζωγραφιά Wither, Πατάτα, Ψητή Πατάτα, Δηλητηριώδης Πατάτα, Καρότο, Χρυσό Καρότο, Καρότο σε Ραβδί, -Κολοκυθόπιτα, Φίλτρο Νυχτερινής Όρασης, Φίλτρο Αορατότητας, Χαλαζίας Nether, Κομμάτια Χαλαζία Nether, Κύβος Χαλαζία, Πλάκα Χαλαζία, Σκαλοπάτια Χαλαζία, Λαξευμένος Κύβος Χαλαζία, Κύβος Κολόνας Χαλαζία, Μαγεμένο Βιβλίο, Χαλί.{*B*}{*B*} - {*T1*}Νέα mob{*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 όταν το φορά. + + Επιλογή Skin - - Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. + + Ανάφλεξη - - Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν τις φορά. + + Πρόσκληση Φίλων - - Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. + + Αποδοχή - - Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. + + Ψαλίδι - - Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. + + Περιήγηση - - Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν τις φορά. + + Επανεγκατάσταση - - Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. + + Επιλογές Αποθήκευσης - - Δίνει στο χρήστη Πανοπλία επιπέδου 8 όταν το φορά. + + Εκτέλεση Εντολής - - Δίνει στο χρήστη Πανοπλία επιπέδου 6 όταν το φορά. + + Εγκατάσταση Πλήρους Έκδοσης - - Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν τις φορά. + + Εγκατάσταση Δοκιμαστικής Έκδοσης - - Μια γυαλιστερή ράβδος που μπορεί να χρησιμοποιηθεί για την κατασκευή εργαλείων από αυτό το υλικό. Δημιουργείται λιώνοντας μεταλλεύματα σε φούρνο. + + Εγκατάσταση - - Επιτρέπει την κατασκευή ράβδων, πετραδιών ή βαφών σε μετακινούμενους κύβους. Μπορεί να χρησιμοποιηθεί ως ακριβός κύβος κατασκευής ή χώρος αποθήκευσης των μεταλλευμάτων. + + Εξαγωγή - - Χρησιμοποιείται για την μετάδοση ηλεκτρικού φορτίου όταν πατήσει πάνω της ένας παίκτης, ζώο ή τέρας. Οι Ξύλινες Πλάκες Πίεσης μπορούν επίσης να ενεργοποιηθούν εάν ρίξετε κάτι πάνω σε αυτές. + + Ανανέωση Λίστας Διαδικτυακών Παιχνιδιών - - Χρησιμοποιούνται για σκάλες. + + Ομαδικά Παιχνίδια - - Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + Όλα τα Παιχνίδια - - Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + Έξοδος - - Χρησιμοποιείται για τη δημιουργία φωτός. Οι πυρσοί λιώνουν επίσης το χιόνι και τον πάγο. + + Ακύρωση - - Χρησιμοποιούνται ως δομικό υλικό και μπορούν να κατασκευάσουν πολλά πράγματα. Μπορούν να δημιουργηθούν από οποιαδήποτε μορφή ξύλου. + + Ακύρωση Συμμετοχής - - Χρησιμοποιείται ως δομικό υλικό. Δεν επηρεάζεται από τη βαρύτητα όπως η κανονική Άμμος. + + Αλλαγή Ομάδας - - Χρησιμοποιείται ως δομικό υλικό. + + Κατασκευή - - Χρησιμοποιείται για την κατασκευή πυρσών, βέλων, σημάτων, σκαλών, φραχτών και ως λαβές για εργαλεία και όπλα. + + Δημιουργία - - Χρησιμοποιείται για να προχωρά το χρόνο προς τα εμπρός οποιαδήποτε στιγμή τη νύχτα προς το ξημέρωμα εάν όλοι οι παίκτες στον κόσμο βρίσκονται στο κρεβάτι και αλλάζει το σημείο επαναφοράς του παίκτη. -Τα χρώματα του κρεβατιού είναι πάντα τα ίδια, ανεξάρτητα από τα χρώματα του μαλλιού που χρησιμοποιήθηκε. + + Λήψη/Τοποθέτηση - - Σας επιτρέπει να δημιουργήσετε μεγαλύτερη ποικιλία αντικειμένων από την κανονική κατασκευή. + + Προβολή Αποθέματος - - Σας επιτρέπει να λιώσετε μέταλλα, να δημιουργήσετε ξυλοκάρβουνο και γυαλί και να μαγειρέψετε ψάρι και χοιρινές μπριζόλες. + + Προβολή Περιγραφής - - Χρησιμοποιείται για την αποθήκευση κύβων και αντικειμένων. Τοποθετήστε δύο σεντούκια το ένα δίπλα στο άλλο για να δημιουργήσετε ένα μεγαλύτερο σεντούκι με τη διπλή χωρητικότητα. + + Προβολή Συστατικών - - Χρησιμοποιείται ως φράγμα και δεν μπορείτε να τον υπερπηδήσετε. Υπολογίζεται με ύψος 1,5 κύβου για τους παίκτες, τα ζώα και τα τέρατα αλλά με ύψος 1 κύβου για άλλους κύβους. + + Πίσω - - Χρησιμοποιείται για κατακόρυφο σκαρφάλωμα. + + Υπενθύμιση: - - Ενεργοποιούνται εάν τις χρησιμοποιήσετε, τις χτυπήσετε ή χρησιμοποιήσετε κοκκινόπετρα. Λειτουργούν ως κανονικές πόρτες αλλά έχουν διάσταση 1x1 κύβους και είναι επίπεδες στο έδαφος. + + - - Εμφανίζει κείμενο που καταχωρήσατε εσείς ή άλλοι παίκτες. + + Έχουν προστεθεί νέες λειτουργίες στο παιχνίδι στην πιο πρόσφατη έκδοσή του, όπως ενδεικτικά νέες περιοχές στον κόσμο του εκπαιδευτικού οδηγού. - - Χρησιμοποιείται για φωτισμό υψηλότερης έντασης σε σύγκριση με τους πυρσούς. Λιώνει το χιόνι και τον πάγο και μπορεί να χρησιμοποιηθεί κάτω από το νερό. + + Δεν έχετε όλα τα συστατικά που απαιτούνται για να φτιάξετε αυτό το αντικείμενο. Το πλαίσιο κάτω αριστερά δείχνει τα συστατικά που απαιτούνται για να το φτιάξετε. - - Χρησιμοποιείται για την πρόκληση εκρήξεων. Ενεργοποιείται μετά την τοποθέτηση, αναφλέγοντάς το με το αντικείμενο Πυρόλιθος και Χάλυβας ή με ηλεκτρικό φορτίο. + + + Συγχαρητήρια! Ολοκληρώσατε τον εκπαιδευτικό οδηγό. Ο χρόνος στο παιχνίδι τώρα κυλάει κανονικά και δεν έχετε πολλή ώρα μέχρι να νυχτώσει και να βγουν έξω τα τέρατα! Ολοκληρώστε το καταφύγιό σας! + - - Χρησιμοποιείται για στιφάδο μανιταριών. Μπορείτε να κρατήσετε το μπολ αφού φάτε το στιφάδο. + + {*EXIT_PICTURE*} Όταν είστε έτοιμοι για περισσότερες εξερευνήσεις, υπάρχει μια σκάλα σε αυτήν την περιοχή κοντά στο καταφύγιο του Μεταλλωρύχου που οδηγεί σε ένα μικρό κάστρο. - - Χρησιμοποιείται για την αποθήκευση και τη μεταφορά νερού, λάβας και γάλακτος. + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να παίξετε κανονικά τον εκπαιδευτικού οδηγού.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} για να παραλείψετε τον κύριο εκπαιδευτικό οδηγό. - - Χρησιμοποιείται για την αποθήκευση και τη μεταφορά νερού. + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με την μπάρα φαγητού και την κατανάλωση τροφών.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με την μπάρα φαγητού και την κατανάλωση τροφών. + - - Χρησιμοποιείται για την αποθήκευση και τη μεταφορά λάβας. + + Επιλογή - - Χρησιμοποιείται για την αποθήκευση και τη μεταφορά γάλακτος. + + Χρήση - - Χρησιμοποιείται για τη δημιουργία φωτιάς, την ανάφλεξη 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*} και θεραπεύει την υγεία σας για 4 δευτερόλεπτα. Κατασκευάζεται από ένα μήλο και ψήγματα χρυσού. + + Λήψη Όλων - - Αναπληρώνει 2{*ICON_SHANK_01*}. Αν το φάτε μπορεί να δηλητηριαστείτε. + + Λήψη Μισών - - Χρησιμοποιείται στη συνταγή του κέικ και ως συστατικό για την παρασκευή φίλτρων. + + Τοποθέτηση - - Χρησιμοποιείται για τη δημιουργία ηλεκτρικού φορτίου κατά την ενεργοποίηση ή την απενεργοποίηση. Παραμένει σε κατάσταση ενεργοποίησης ή απενεργοποίησης μέχρι να πατηθεί ξανά. + + Ξεσκαρτάρισμα Όλων - - Μεταδίδει συνεχώς ηλεκτρικό φορτίο ή μπορεί να χρησιμοποιηθεί ως πομπός/δέκτης, αν συνδεθεί στο πλάι ενός κύβου. -Μπορεί επίσης να χρησιμοποιηθεί για φωτισμό χαμηλής έντασης. + + Απαλοιφή Επιλογής - - Χρησιμοποιείται σε κυκλώματα Κοκκινόπετρας ως αναμεταδότης, αντίσταση ή/και ως ημιαγωγός. + + Τι Είναι Αυτό; - - Χρησιμοποιείται για τη μετάδοση ηλεκτρικού φορτίου όταν πατιέται. Παραμένει ενεργό για περίπου ένα δευτερόλεπτο και μετά απενεργοποιείται. + + Κοινοποίηση στο Facebook - - Χρήση για την αποθήκευση και την εκτόξευση αντικειμένων με τυχαία σειρά όταν φορτίζεται μέσω Κοκκινόπετρας. + + Ξεσκαρτάρισμα Ενός Στοιχείου - - Παίζει μια νότα όταν ενεργοποιείται. Χτυπήστε το για να αλλάξετε τον τόνο της νότας. Το μουσικό όργανο αλλάζει ανάλογα με τον τύπο κύβου στον οποίο θα τοποθετηθεί. + + Εναλλαγή - - Χρησιμοποιείται για την οδήγηση βαγονιών ορυχείου. + + Γρήγορη Κίνηση - - Όταν τροφοδοτείται με ρεύμα, επιταχύνει τα βαγόνια που περνούν από επάνω του. Όταν δεν τροφοδοτείται με ρεύμα, φρενάρει τα βαγόνια που περνούν από επάνω του. + + Πακέτα Skin - - Λειτουργεί σαν Πλάκα Πίεσης (μεταδίδει σήμα Κοκκινόπετρας όταν τροφοδοτείται με ρεύμα), αλλά μπορεί να ενεργοποιηθεί μόνο από ένα βαγόνι ορυχείου. + + Κόκκινο Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται για τη μετακίνησή σας ή για τη μετακίνηση ενός ζώου ή τέρατος σε ράγες. + + Πράσινο Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται για τη μεταφορά αγαθών σε ράγες. + + Καφέ Βαμμένο Γυάλινο Τζάμι - - Κινείται σε ράγες και μπορεί να δώσει ώθηση σε άλλα βαγόνια, αν τροφοδοτηθεί με κάρβουνο. + + Λευκό Βαμμένο Γυαλί - - Χρησιμοποιείται για μετακίνηση στο νερό. Είναι πιο γρήγορο από το κολύμπι. + + Βαμμένο Γυάλινο Τζάμι - - Συλλέγεται από πρόβατα και μπορεί να χρωματιστεί με διάφορες βαφές. + + Μαύρο Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται ως δομικό υλικό και μπορεί να χρωματιστεί με διάφορες βαφές. Αυτή η συνταγή δεν συνιστάται, καθώς μπορείτε να αποκτήσετε Μαλλί εύκολα από Πρόβατα. + + Μπλε Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται ως βαφή για τη δημιουργία μαύρου μαλλιού. + + Γκρι Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται ως βαφή για τη δημιουργία πράσινου μαλλιού. + + Ροζ Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται ως βαφή για τη δημιουργία καφέ μαλλιού, ως συστατικό για μπισκότα ή για την καλλιέργεια Κακαόδεντρων. + + Ανοιχτό Πράσινο Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται ως βαφή για τη δημιουργία ασημί μαλλιού. + + Μωβ Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται ως βαφή για τη δημιουργία κίτρινου μαλλιού. + + Γαλανό Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται ως βαφή για τη δημιουργία κόκκινου μαλλιού. + + Ανοιχτό γκρι Βαμμένο Γυάλινο Τζάμι - - Χρησιμοποιείται για τη στιγμιαία ανάπτυξη σοδειών, δέντρων, ψηλού γρασιδιού, μεγάλων μανιταριών και λουλουδιών και μπορεί να χρησιμοποιηθεί και στις συνταγές βαφών. + + Πορτοκαλί Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία ροζ μαλλιού. + + Μπλε Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία πορτοκαλί μαλλιού. + + Μοβ Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού πράσινου μαλλιού. + + Γαλανό Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία γκρι μαλλιού. + + Κόκκινο Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού γκρι μαλλιού. -(Σημείωση: Μπορείτε επίσης να δημιουργήσετε ανοιχτή γκρι βαφή, αν συνδυάσετε την γκρι βαφή με πάστα οστών. Με αυτόν τον τρόπο, μπορείτε να δημιουργήσετε τέσσερις ανοιχτές γκρι βαφές από έναν ασκό μελάνης). + + Πράσινο Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού μπλε μαλλιού. + + Καφέ Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία γαλανού μαλλιού. + + Ανοιχτό Γκρι Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία μοβ μαλλιού. + + Κίτρινο Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία φούξια μαλλιού. + + Ανοιχτό Μπλε Βαμμένο Γυαλί - - Χρησιμοποιείται ως βαφή για τη δημιουργία μπλε μαλλιού. + + Φούξια Βαμμένο Γυαλί - - Παίζει Δίσκους Μουσικής. + + Γκρι Βαμμένο Γυαλί - - Χρησιμοποιήστε τα για να δημιουργήστε πολύ ισχυρά εργαλεία, όπλα ή πανοπλίες. + + Ροζ Βαμμένο Γυαλί - - Χρησιμοποιείται για φωτισμό υψηλότερης έντασης σε σύγκριση με τους πυρσούς. Λιώνει το χιόνι και τον πάγο και μπορεί να χρησιμοποιηθεί κάτω από το νερό. + + Ανοιχτό Πράσινο Βαμμένο Γυαλί - - Χρησιμοποιείται για τη δημιουργία βιβλίων και χαρτών. + + Κίτρινο Βαμμένο Γυάλινο Τζάμι - - Μπορεί να χρησιμοποιηθεί για τη δημιουργία ραφιών βιβλιοθήκης ή Μαγεμένων Βιβλίων, αν μαγευτεί. + + Ανοιχτό Γκρι - - Επιτρέπει τη δημιουργία πιο ισχυρών ξορκιών, αν τοποθετηθεί γύρω από το Τραπέζι Μαγέματος. + + Γκρι - - Χρησιμοποιείται ως διακοσμητικό. + + Ροζ - - Μπορεί να εξορυχτεί με αξίνα από σίδερο ή καλύτερο υλικό και στη συνέχεια μπορείτε να το λιώσετε σε φούρνο για να δημιουργήσετε ράβδους χρυσού. + + Μπλε - - Μπορεί να εξορυχτεί με αξίνα από πέτρα ή καλύτερο υλικό και στη συνέχεια μπορείτε να το λιώσετε σε φούρνο για να δημιουργήσετε ράβδους σιδήρου. + + Μωβ - - Μπορεί να εξορυχτεί με αξίνα και παράγει κάρβουνο. + + Γαλανό - - Μπορεί να εξορυχτεί με αξίνα και παράγει λάπις λάζουλι. + + Ανοιχτό Πράσινο - - Μπορεί να εξορυχτεί με αξίνα από σίδερο και παράγει διαμάντια. + + Πορτοκαλί - - Μπορεί να εξορυχτεί με αξίνα από σίδερο ή καλύτερο υλικό και παράγει σκόνη κοκκινόπετρας. + + Λευκό - - Μπορεί να εξορυχτεί με αξίνα και παράγει πέτρα επίστρωσης. + + Προσαρμοσμένο - - Συλλέγεται με φτυάρι. Μπορεί να χρησιμοποιηθεί για κατασκευές. + + Κίτρινο - - Μπορεί να φυτευτεί και σε βάθος χρόνου θα εξελιχθεί σε δέντρο. + + Ανοιχτό Μπλε - - Αυτό είναι άθραυστο. + + Φούξια - - Βάζει φωτιά σε οτιδήποτε έρχεται σε επαφή μαζί του. Μπορεί να συλλεχθεί σε κουβά. + + Καφέ - - Συλλέγεται με φτυάρι. Μπορεί να λιώσει σε φούρνο για να μετατραπεί σε γυαλί. Επηρεάζεται από τη βαρύτητα, αν δεν υπάρχει από κάτω του κάποιο άλλο πλακίδιο. + + Λευκό Βαμμένο Γυάλινο Τζάμι - - Συλλέγεται με φτυάρι. Μερικές φορές παράγει πυρόλιθο κατά την εξόρυξη. Επηρεάζεται από τη βαρύτητα, αν δεν υπάρχει από κάτω του κάποιο άλλο πλακίδιο. + + Μικρή Μπάλα - - Κόβεται με τσεκούρι και μπορεί να χρησιμοποιηθεί ως καύσιμο ή για την κατασκευή σανίδων. + + Μεγάλη Μπάλα - - Δημιουργείται σε φούρνο από λιωμένη άμμο. Μπορεί να χρησιμοποιηθεί για κατασκευή, αλλά θα σπάσει αν προσπαθήσετε να το εξορύξετε. + + Ανοιχτό Μπλε Βαμμένο Γυάλινο Τζάμι - - Εξορύσσεται από την πέτρα με χρήση αξίνας. Μπορεί να χρησιμοποιηθεί για την κατασκευή καμινιού ή πέτρινων εργαλείων. + + Φούξια Βαμμένο Γυάλινο Τζάμι - - Δημιουργείται με το ψήσιμο πηλού σε φούρνο. + + Πορτοκαλί Βαμμένο Γυάλινο Τζάμι - - Μπορεί να ψηθεί σε φούρνο για να μετατραπεί σε τούβλα. + + Σε σχήμα αστεριού - - Όταν σπάσει, πέφτουν μπάλες πηλού που μπορούν να ψηθούν σε φούρνο για να μετατραπούν σε τούβλα. + + Μαύρο - - Ένας πιο βολικός τρόπος για να αποθηκεύετε χιονόμπαλες. + + Κόκκινο - - Μπορεί να σκαφτεί με αξίνα και δημιουργεί χιονόμπαλες. + + Πράσινο - - Όταν σπάσει, μερικές φορές παράγει σπόρους σιταριού. + + Σε σχήμα Creeper - - Μπορεί να χρησιμοποιηθεί για τη δημιουργία βαφής. + + Έκρηξη - - Μπορεί να συνδυαστεί με ένα μπολ για τη δημιουργία σούπας. + + Άγνωστο σχήμα - - Μπορεί να εξορυχτεί μόνο με αδαμάντινη αξίνα. Παράγεται κατά την ανάμιξη νερού και ακίνητης λάβας και χρησιμοποιείται για την κατασκευή πύλης. + + Μαύρο Βαμμένο Γυαλί - - Δημιουργεί τέρατα στον κόσμο. + + Σιδερένια Πανοπλία Αλόγου - - Τοποθετείται στο έδαφος και μεταφέρει ηλεκτρικά φορτία. Όταν αναμιγνύεται με ένα φίλτρο, αυξάνει τη διάρκεια της επίδρασης. + + Χρυσή Πανοπλία Αλόγου - - Όταν αναπτυχθεί πλήρως, παράγει σοδειές με σιτάρι. + + Διαμαντένια Πανοπλία Αλόγου - - Έδαφος που έχει προετοιμαστεί για τη φύτευση σπόρων. + + Συσκευή σύγκρισης Κοκκινόπετρας - - Μπορεί να ψηθεί στο φούρνο για τη δημιουργία πράσινης βαφής. + + Βαγόνι ορυχείου με TNT - - Μπορεί να χρησιμοποιηθεί για τη δημιουργία ζάχαρης. + + Βαγόνι ορυχείου με Χοάνη - - Μπορεί να φορεθεί ως κράνος ή να συνδυαστεί με έναν πυρσό για τη δημιουργία ενός φαναριού από κολοκύθα. Είναι επίσης το βασικό συστατικό της Κολοκυθόπιτας. + + Χαλινάρι - - Όταν ανάψει, καίει για πάντα. + + Φάρος - - Επιβραδύνει την κίνηση οποιουδήποτε πλάσματος περάσει από επάνω του. + + Παγιδευμένο Σεντούκι - - Αν σταθείτε στην πύλη, μπορείτε να ταξιδεύετε από τον Overworld στο Nether. + + Σταθμισμένη Πλάκα Πίεσης (Ελαφριά) - - Χρησιμοποιείται ως καύσιμο για ένα φούρνο ή μπορεί να χρησιμοποιηθεί για τη δημιουργία πυρσού. + + Καρτελάκι ονόματος - - Συλλέγεται από σκοτωμένες αράχνες και μπορεί να χρησιμοποιηθεί για τη δημιουργία Τόξου ή Καλαμιού Ψαρέματος. Μπορεί να τοποθετηθεί στο έδαφος για τη δημιουργία Σύρματος Ενεργοποίησης. + + Ξύλινες Σανίδες (παντός τύπου) - - Συλλέγεται από σκοτωμένες κότες και μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός βέλους. + + Κύβος Εντολών - - Συλλέγεται από σκοτωμένα Creeper και μπορεί να χρησιμοποιηθεί για τη δημιουργία TNT ή ως συστατικό για την παρασκευή φίλτρων. + + Πυροτέχνημα Αστέρι - - Μπορεί να φυτευτεί σε ένα αγρόκτημα για την καλλιέργεια σοδειών. Βεβαιωθείτε ότι υπάρχει αρκετό φως για να αναπτυχθούν οι σπόροι! + + Αυτά τα ζώα μπορούν να δαμαστούν και, στη συνέχεια, να ιππευθούν. Μπορείτε να τους προσαρτήσετε σεντούκι. - - Συλλέγεται από σοδειές και μπορεί να χρησιμοποιηθεί για τη δημιουργία τροφίμων. + + Μουλάρι - - Συλλέγεται με το σκάψιμο χαλικιού και μπορεί να χρησιμοποιηθεί για τη δημιουργία πυρόλιθου και χάλυβα. + + Γεννιούνται από διασταύρωση Αλόγου και Γαϊδουριού. Αυτά τα ζώα μπορούν να δαμαστούν και, στη συνέχεια, να ιππευθούν. - - Αν το χρησιμοποιήσετε σε ένα γουρούνι, μπορείτε να το ιππεύσετε. Στη συνέχεια, μπορείτε να καθοδηγήσετε το γουρούνι με ένα Καρότο σε Ραβδί. + + Άλογο - - Συλλέγεται με το σκάψιμο χιονιού και μπορείτε να το πετάξετε. + + Αυτά τα ζώα μπορούν να δαμαστούν και, στη συνέχεια, να ιππευθούν. - - Συλλέγεται από σκοτωμένες αγελάδες και μπορεί να χρησιμοποιηθεί για η δημιουργία πανοπλιών ή Βιβλίων. + + Γαϊδούρι - - Συλλέγεται από σκοτωμένα Slime και μπορεί να χρησιμοποιηθεί για την παρασκευή φίλτρων ή για τη δημιουργία Εμβόλων με Κόλλα. + + Άλογο Ζόμπι - - Πέφτει τυχαία από κότες και μπορεί να χρησιμοποιηθεί για τη δημιουργία τροφίμων. + + Άδειος Χάρτης - - Συλλέγεται με την εξόρυξη Λαμψόπετρας και μπορεί να χρησιμοποιηθεί για τη δημιουργία κύβου Λαμψόπετρας ή να αναμιχθεί σε ένα φίλτρο για να ενισχύσει την επίδρασή του. + + Αστέρι του Nether - - Συλλέγεται από σκοτωμένους Σκελετούς. Μπορεί να χρησιμοποιηθεί για τη δημιουργία πάστας οστών. Μπορείτε να το ταΐσετε σε έναν λύκο για να τον δαμάσετε. + + Πυροτέχνημα-Πύραυλος - - Συλλέγεται από Creeper που σκοτώθηκε από Σκελετούς. Μπορείτε να το ακούσετε σε ένα jukebox. + + Άλογο Σκελετός - - Σβήνει τη φωτιά και ενισχύει την ανάπτυξη των σοδειών. Μπορεί να συλλεχθεί σε κουβά. + + Wither - - Όταν σπάει, βγάζει μερικές φορές ένα βλαστάρι που μπορεί να φυτευτεί και να γίνει δέντρο. + + Κατασκευάζονται από Μαύρα Κρανία και Άμμο των Ψυχών. Εκτοξεύουν εκρηκτικά κρανία εναντίον σας. - - Βρίσκεται στα μπουντρούμια. Μπορεί να χρησιμοποιηθεί για κατασκευή και διακόσμηση. + + Σταθμισμένη Πλάκα Πίεσης (Βαριά) - - Χρήση για την παραγωγή μαλλιού από πρόβατα και τη συγκομιδή κύβων φύλλων. + + Ανοιχτός Γκρι Βαμμένος Πηλός - - Όταν τροφοδοτείται με ρεύμα (με χρήση ενός κουμπιού, διακόπτη, πλάκας πίεσης, πυρσού από κοκκινόπετρα ή κοκκινόπετρα σε οποιονδήποτε συνδυασμό με τα παραπάνω), το έμβολο προεκτείνεται, αν έχει αρκετό χώρο, και σπρώχνει κύβους. + + Γκρι Βαμμένος Πηλός - - Όταν τροφοδοτείται με ρεύμα (με χρήση ενός κουμπιού, διακόπτη, πλάκας πίεσης, πυρσού από κοκκινόπετρα ή κοκκινόπετρα σε οποιονδήποτε συνδυασμό με τα παραπάνω), το έμβολο προεκτείνεται, αν έχει αρκετό χώρο, και σπρώχνει κύβους. Όταν μαζεύεται, τραβά μαζί του και τον κύβο που έρχεται σε επαφή με το εκτεταμένο μέρος του εμβόλου. + + Ροζ Βαμμένος Πηλός - - Κατασκευάζεται από κύβους πέτρας και βρίσκεται συνήθως σε Φρούρια. + + Μπλε Βαμμένος Πηλός - - Χρησιμοποιείται ως φράγμα και λειτουργεί όπως και οι φράκτες. + + Μοβ Βαμμένος Πηλός - - Λειτουργεί ως πόρτα, αλλά χρησιμοποιείται κυρίως σε φράκτες. + + Γαλανός Βαμμένος Πηλός - - Μπορεί να δημιουργηθεί από Φέτες Καρπουζιού. + + Ανοιχτός Πράσινος Βαμμένος Πηλός - - Διάφανοι κύβοι που μπορούν να χρησιμοποιηθούν αντί για Γυάλινους Κύβους. + + Πορτοκαλί Βαμμένος Πηλός - - Μπορεί να φυτευτεί για την καλλιέργεια κολοκύθας. + + Λευκός Βαμμένος Πηλός - - Μπορεί να φυτευτεί για την καλλιέργεια καρπουζιών. + + Βαμμένο Γυαλί - - Πέφτει από Enderman όταν πεθαίνουν. Όταν πεταχτεί, ο παίκτης τηλεμεταφέρεται στη θέση που πέφτει το Μαργαριτάρι του Ender και χάνει λίγη ζωή. + + Κίτρινος Βαμμένος Πηλός - - Ένας κύβος από χώμα με γρασίδι που φυτρώνει στην κορυφή. Συλλέγεται με φτυάρι. Μπορεί να χρησιμοποιηθεί για κατασκευές. + + Ανοιχτός Μπλε Βαμμένος Πηλός - - Μπορεί να χρησιμοποιηθεί για κατασκευές και διακόσμηση. + + Φούξια Βαμμένος Πηλός - - Επιβραδύνει την κίνηση όταν περνάτε από μέσα του. Μπορείτε να το καταστρέψετε με ψαλίδι για να συλλέξετε κλωστή. + + Καφέ Βαμμένος Πηλός - - Όταν καταστραφεί, παράγει ένα Ασημόψαρο. Μπορεί επίσης να δημιουργήσει Ασημόψαρα αν βρίσκεται κοντά σε ένα άλλο Ασημόψαρο που δέχεται επίθεση. + + Χοάνη - - Όταν τοποθετηθεί κάπου, μεγαλώνει με το πέρασμα του χρόνου. Μπορεί να συλλεχθεί με ψαλίδι. Μπορείτε να το σκαρφαλώσετε σαν να ήταν σκάλα. + + Ράγα ενεργοποίησης - - Γλιστράει όταν περπατάτε επάνω του. Αν βρίσκεται επάνω από άλλον κύβο, μετατρέπεται σε νερό όταν καταστρέφεται. Λιώνει αν έρθει πολύ κοντά σε μια πηγή φωτός ή όταν τοποθετείται στο Nether. + + Εκτοξευτής - - Μπορεί να χρησιμοποιηθεί ως διακοσμητικό. + + Συσκευή σύγκρισης Κοκκινόπετρας - - Χρησιμοποιείται στην παρασκευή φίλτρων και για τον εντοπισμό Φρουρίων. Πέφτει από τα Blaze που συνήθως βρίσκονται κοντά σε Φρούρια στο Nether. + + Αισθητήρας φωτός της ημέρας - - Χρησιμοποιείται στην παρασκευή φίλτρων. Πέφτει από Ghast όταν πεθαίνουν. + + Κύβος Κοκκινόπετρας - - Πέφτει από Γουρουνάνθρωπους Ζόμπι όταν πεθαίνουν. Οι Γουρουνάνθρωποι Ζόμπι κατοικούν στο Nether. Χρησιμοποιείται ως συστατικό για την παρασκευή φίλτρων. + + Βαμμένος Πηλός - - Χρησιμοποιείται στην παρασκευή φίλτρων. Φυτρώνει φυσικά σε Οχυρά του Nether. Μπορεί επίσης να φυτευτεί σε Άμμο των Ψυχών. + + Μαύρος Βαμμένος Πηλός - - Όταν χρησιμοποιείται, μπορεί να έχει διάφορα αποτελέσματα, ανάλογα με το πού χρησιμοποιείται. + + Κόκκινος Βαμμένος Πηλός - - Μπορεί να γεμίσει με νερό και να χρησιμοποιηθεί ως βασικό συστατικό για ένα φίλτρο στη Βάση Παρασκευής. + + Πράσινος Βαμμένος Πηλός - - Ένα δηλητηριώδες τρόφιμο και υλικό για φίλτρα. Πέφτει όταν ο παίκτης σκοτώνει Αράχνες ή Αράχνες των Σπηλαίων. + + Δέμα Σανό - - Χρησιμοποιείται στην παρασκευή φίλτρων, συνήθως για τη δημιουργία φίλτρων με αρνητικές επιδράσεις. + + Ενισχυμένος Πηλός - - Χρησιμοποιείται στην παρασκευή φίλτρων ή συνδυάζεται με άλλα αντικείμενα για τη δημιουργία Ματιών του Ender ή Κρέμα Μάγματος. + + Κύβος από Κάρβουνο - - Χρησιμοποιείται στην παρασκευή φίλτρων. + + Ξεθώριασμα - - Χρησιμοποιείται για τη δημιουργία Φίλτρων και Φίλτρων Εκτόξευσης. + + Όταν η επιλογή είναι απενεργοποιημένη, εμποδίζει τα τέρατα και τα ζώα να αλλάξουν κύβους (για παράδειγμα, οι εκρήξεις των Creeper δεν θα καταστρέφουν κύβους και τα Πρόβατα δεν θα αφαιρούν Γρασίδι) ή τη συλλογή αντικειμένων. - - Αν το γεμίσετε με νερό της βροχής ή από έναν κουβά, μπορείτε να το χρησιμοποιήσετε για να γεμίσετε Γυάλινα Μπουκάλια με νερό. + + Όταν η επιλογή είναι ενεργή, οι παίκτες θα διατηρήσουν το απόθεμά τους όταν πεθάνουν. - - Όταν πετάγεται, δείχνει την κατεύθυνση στην οποία βρίσκεται η Πύλη του End. Αν τοποθετήσετε δώδεκα τέτοια αντικείμενα σε Πλαίσια Πύλης End, θα ενεργοποιηθεί η Πύλη του End. + + Όταν είναι απενεργοποιημένη, τα mob δεν παράγονται φυσικά. - - Χρησιμοποιείται στην παρασκευή φίλτρων. + + Λειτουργία Παιχνιδιού: Adventure - - Μοιάζουν με τους Κύβοι Γρασιδιού, ιδανικοί για καλλιέργεια μανιταριών. + + Adventure - - Επιπλέει στο νερό και μπορεί να περπατήσει κανείς επάνω του. + + Τοποθετήστε έναν σπόρο για να δημιουργήσετε ξανά το ίδιο έδαφος. - - Χρησιμοποιείται για την κατασκευή Οχυρών του Nether. Άτρωτο στις πύρινες σφαίρες των Ghast. + + Όταν η επιλογή είναι απενεργοποιημένη, τα τέρατα και τα ζώα δεν θα ρίχνουν λάφυρα (για παράδειγμα τα Creeper δεν θα ρίχνουν μπαρούτι). - - Χρησιμοποιείται στα Οχυρά του Nether. + + Ο/Η {*PLAYER*} έπεσε από μια σκάλα - - Βρίσκεται στα Οχυρά του Nether και ρίχνει Φυτά Nether όταν σπάσει. + + Ο/Η {*PLAYER*} έπεσε από αναρριχητικά φυτά - - Επιτρέπει στους παίκτες να μαγεύουν Σπαθιά, Αξίνες, Τσεκούρια, Φτυάρια, Τόξα και Πανοπλίες με τους Πόντους Εμπειρίας που έχουν συλλέξει. + + Ο/Η {*PLAYER*} έπεσε έξω από το νερό - - Μπορεί να ενεργοποιηθεί με δώδεκα Μάτια του Ender και επιτρέπει στον παίκτη να ταξιδέψει στη διάσταση του End. + + Όταν η επιλογή είναι απενεργοποιημένη, οι κύβοι δεν θα ρίχνουν αντικείμενα όταν καταστρέφονται (για παράδειγμα, οι κύβοι πέτρας δεν θα ρίχνουν Πέτρα Επίστρωσης). - - Χρησιμοποιείται για το σχηματισμό μιας Πύλης End. + + Όταν είναι απενεργοποιημένη, οι παίκτες δεν θα αναγεννούν την υγεία φυσικά. - - Ένας τύπος κύβου που βρίσκεται στο End. Είναι πολύ ανθεκτικός στις εκρήξεις, επομένως είναι πολύ χρήσιμος για την κατασκευή κτιρίων. + + Όταν η επιλογή είναι απενεργοποιημένη, η ώρα της ημέρας δεν θα αλλάζει. - - Αυτός ο κύβος δημιουργείται όταν νικηθεί ο Δράκος στο End. + + Βαγόνι Ορυχείου - - Όταν πετάγεται, ρίχνει Σφαίρες Εμπειρίας που αυξάνουν τους πόντους εμπειρίας σας όταν συλλεχθούν. + + Χαλινάρι - - Χρήσιμο για την ανάφλεξη υλικών ή για εμπρηστικά πυρά όταν εκτοξεύεται από Διανομέα. + + Αποδέσμευση - - Μοιάζουν με προθήκες επίδειξης και παρουσιάζουν το αντικείμενο ή τον κύβο που περιέχουν. + + Προσάρτηση - - Όταν πετάγεται, μπορεί να δημιουργήσει ένα πλάσμα του τύπου που αναφέρεται. + + Ξεκαβαλίκεμα - - Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + Προσάρτηση Σεντουκιού - - Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. + + Εκτόξευση - - Δημιουργείται λιώνοντας Netherrack σε φούρνο. Μπορεί να χρησιμοποιηθεί για τη δημιουργία κύβων Τούβλου Nether. + + Όνομα - - Όταν τροφοδοτούνται με ρεύμα, εκπέμπουν φως. + + Φάρος - - Μπορούν να καλλιεργηθούν για την παραγωγή Καρπών Κακάο. + + Κύρια Δύναμη - - Τα Κεφάλια Mob μπορούν να χρησιμοποιηθούν ως διακοσμητικά ή να φορεθούν ως μάσκες στην υποδοχή κράνους. + + Δευτερεύουσα Δύναμη - - Καλαμάρι + + Άλογο - - Ρίχνει ασκούς μελάνης όταν σκοτωθεί. + + Εκτοξευτής - - Αγελάδα + + Χοάνη - - Ρίχνει δέρμα όταν σκοτωθεί. Μπορεί, επίσης, να αρμεχθεί με έναν κουβά. + + Ο/Η {*PLAYER*} έπεσε από ψηλά - - Πρόβατο + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Νυχτερίδων για έναν κόσμο. - - Ρίχνει μαλλί όταν κουρευτεί (αν δεν έχει κουρευτεί ήδη). Μπορείτε να το βάψετε για να αλλάξετε χρώμα στο μαλλί του. + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφομένων Αλόγων. - - Κότα + + Επιλογές Παιχνιδιού - - Ρίχνει φτερά όταν σκοτωθεί και γεννά αυγά με τυχαία συχνότητα. + + Ο/Η {*PLAYER*} δέχθηκε χτύπημα με φλεγόμενη σφαίρα από {*SOURCE*} με χρήση {*ITEM*} - - Γουρούνι + + Ο/Η {*PLAYER*} γρονθοκοπήθηκε από {*SOURCE*} με χρήση {*ITEM*} - - Ρίχνει χοιρινές μπριζόλες όταν σκοτωθεί. Μπορείτε να το ιππεύσετε, αν χρησιμοποιήσετε μια σέλα. + + Ο/Η {*PLAYER*} σκοτώθηκε από {*SOURCE*} με χρήση {*ITEM*} - - Λύκος + + Δολιοφθορά από Mob - - Δεν επιτίθεται, εκτός και αν του επιτεθείτε πρώτοι. Μπορεί να δαμαστεί αν του δώσετε κόκκαλα. Σε αυτήν την περίπτωση, σας ακολουθούν παντού και επιτίθενται σε ό,τι σας επιτίθεται. + + Ρίψεις πλακιδίων - - Creeper + + Φυσική Αναδημιουργία - - Εκρήγνυται αν το πλησιάσετε πολύ! + + Κύκλος φωτός ημέρας - - Σκελετός + + Διατήρηση αποθέματος - - Επιτίθεται με βέλη εναντίον σας. Ρίχνει βέλη όταν σκοτωθεί. + + Δημιουργία mob - - Αράχνη + + Λάφυρα mob - - Σας επιτίθεται όταν βρίσκεστε κοντά. Μπορεί να σκαρφαλώσει τοίχους. Ρίχνει σπάγκο όταν σκοτωθεί. + + Ο/Η {*PLAYER*} πυροβολήθηκε από {*SOURCE*} με χρήση {*ITEM*} - - Ζόμπι + + Ο/Η {*PLAYER*} έπεσε πολύ μακριά και εξοντώθηκε από {*SOURCE*} - - Σας επιτίθεται όταν βρίσκεστε κοντά. + + Ο/Η {*PLAYER*} έπεσε πολύ μακριά και εξοντώθηκε από {*SOURCE*} με χρήση {*ITEM*} - - Ζόμπι Γουρουνάνθρωπος + + Ο/Η {*PLAYER*} πέρασε μέσα από τη φωτιά, όσο πολεμούσε {*SOURCE*} - - Αρχικά ήρεμος, αλλά επιτίθεται μαζικά, αν επιτεθείτε σε κάποιον. + + Ο/Η {*PLAYER*} καταδικάστηκε σε πτώση από {*SOURCE*} - - Ghast + + Ο/Η {*PLAYER*} καταδικάστηκε σε πτώση από {*SOURCE*} - - Εκτοξεύει πύρινες σφαίρες εναντίον σας που εκρήγνυνται όταν σας ακουμπήσουν. + + Ο/Η {*PLAYER*} καταδικάστηκε σε πτώση από {*SOURCE*} με χρήση {*ITEM*} - - Slime + + Ο/Η {*PLAYER*} τσουρουφλίστηκε, όσο πολεμούσε {*SOURCE*} - - Όταν δέχεται ζημιά, χωρίζεται σε μικρότερα Slime. + + Ο/Η {*PLAYER*} ανατινάχθηκε από {*SOURCE*} - - Enderman + + Ο/Η {*PLAYER*} μαράζωσε - - Σας επιτίθενται αν τους κοιτάξετε. Μπορούν επίσης να μετακινούν κύβους. + + Ο/Η {*PLAYER*} σφαγιάστηκε από {*SOURCE*} με χρήση {*ITEM*} - - Ασημόψαρα + + Ο/Η {*PLAYER*} προσπάθησε να κολυμπήσει στη λάβα για να δραπετεύσει {*SOURCE*} - - Προσελκύουν τα Ασημόψαρα που κρύβονται στη γύρω περιοχή όταν τους επιτίθεστε. Κρύβονται σε κύβους πέτρας. + + Ο/Η {*PLAYER*} πνίγηκε, καθώς προσπαθούσε να αποδράσει {*SOURCE*} - - Αράχνη των Σπηλαίων + + Ο/Η {*PLAYER*} πάτησε σε κάκτο, καθώς προσπαθούσε να αποδράσει {*SOURCE*} - - Το δάγκωμά της είναι δηλητηριώδες. + + Καβαλίκεμα - - Mooshroom + + Για να καθοδηγήσει ένα άλογο, ο παίκτης πρέπει να εξοπλίσει το άλογο με Σέλα. Τις Σέλες μπορείτε να τις αγοράσετε από χωρικούς ή να τις βρείτε μέσα σε Σεντούκια κρυμμένα στον κόσμο. - - Μπορεί να συνδυαστεί με ένα μπολ για τη δημιουργία μανιταρόσουπας. Ρίχνει μανιτάρια και μετατρέπεται σε κανονική αγελάδα, αν την κουρέψετε. + + + Τα ήμερα Γαϊδούρια και Μουλάρια μπορούν να αποκτήσουν σακίδια σέλας, προσαρτώντας ένα Σεντούκι. Μπορείτε να έχετε πρόσβαση σε αυτά τα σακίδια σέλας ενώ ιππεύετε ή χρησιμοποιείτε αθόρυβη κίνηση. + - - Γκόλεμ του Χιονιού + + Μπορείτε να εκθρέψετε Άλογα και Γαϊδούρια (όχι όμως Μουλάρια) όπως τα υπόλοιπα ζώα, χρησιμοποιώντας Χρυσά Μήλα ή Χρυσά Καρότα. Με την πάροδο του χρόνου, τα Πουλάρια θα γίνουν ενήλικα άλογα, μολονότι αν τα ταΐζετε Σιτάρι ή Σανό η διαδικασία θα επισπευσθεί. - - Το Γκόλεμ του Χιονιού μπορεί να δημιουργηθεί από παίκτες συνδυάζοντας κύβους χιονιού και μια κολοκύθα. Πετάει χιονόμπαλες στους εχθρούς του δημιουργού του. + + Για να χρησιμοποιήσετε τα Άλογα, τα Γαϊδούρια και τα Μουλάρια, πρέπει πρώτα να τα δαμάσετε. Για να δαμάσετε ένα άλογο, πρέπει να προσπαθήσετε να το ιππεύσετε και να καταφέρετε να μείνετε πάνω του, όσο αυτό προσπαθεί να ρίξει τον αναβάτη. - - Δράκος του Ender + + Όταν γύρω από το άλογο εμφανιστούν Καρδιές Αγάπης, το άλογο είναι ήμερο και δεν θα αποπειραθεί ξανά να ρίξει κάτω τον παίκτη. - - Ένας πελώριος μαύρος δράκος που βρίσκεται στο End. + + Try to ride this horse now. Χρησιμοποιήστε {*CONTROLLER_ACTION_USE*} χωρίς αντικείμενα ή εργαλεία στο χέρι σας για να το καβαλικέψετε. - - Blaze + + + Μπορείτε να προσπαθήσετε να δαμάσετε τα Άλογα και τα Γαϊδούρια που βρίσκονται εδώ. Επίσης, υπάρχουν Σέλες, Πανοπλίες Αλόγων και άλλα χρήσιμα αντικείμενα για Άλογα σε σεντούκια εδώ γύρω. + - - Εχθροί που κατοικούν στο Nether, συνήθως στα Οχυρά Nether. Ρίχνουν Ράβδους Blaze όταν σκοτωθούν. + + Ένας φάρος σε μια πυραμίδα με τουλάχιστον 4 βαθμίδες προσφέρει μια επιπλέον επιλογή είτε της δευτερεύουσας δύναμης Αναδημιουργία είτε μιας πιο ισχυρής κύριας δύναμης. - - Κύβος Μάγματος + + Για να ορίσετε τις δυνάμεις του Φάρου σας, πρέπει να θυσιάσετε μια Ράβδο από Σμαράγδια, Χρυσό ή Σίδηρο στην υποδοχή πληρωμής. Αφού τις ορίσετε, οι δυνάμεις θα εκπέμπονται από το Φάρο επ' αόριστον. - - Κατοικούν στο Nether. Όπως και τα Slime, όταν σκοτωθούν σπάνε σε μικρότερες εκδόσεις του εαυτού τους. + + Στην κορυφή αυτής της πυραμίδας υπάρχει ένας ανενεργός Φάρος. - - Χωρικός + + Αυτό είναι το περιβάλλον χρήστη Φάρου, το οποίο μπορείτε να χρησιμοποιήσετε για να επιλέξετε τις δυνάμεις που θα παρέχει ο Φάρος σας. - - Αιλουροπάρδαλις + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε. + {*B*}Πατήστε{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη πώς να χρησιμοποιείτε το περιβάλλον χρήστη Φάρου. + - - Κατοικούν στις Ζούγκλες. Μπορείτε να τις δαμάσετε, αν τις ταΐσετε Ωμό Ψάρι. Θα πρέπει πρώτα να αφήσετε την Αιλουροπάρδαλις να σας πλησιάσει, καθώς οι απότομες κινήσεις τον τρομάζουν. + + Στο μενού Φάρου μπορείτε να επιλέξετε 1 κύρια δύναμη για το Φάρο σας. Όσο περισσότερες βαθμίδες έχει η πυραμίδα σας, τόσο περισσότερες θα είναι οι επιλογές δυνάμεων. - - Σιδερένιο Γκόλεμ + + Μπορείτε να ιππεύσετε όλα τα ενήλικα Άλογα, Γαϊδούρια και Μουλάρια. Ωστόσο, μόνο τα Άλογα μπορούν να φέρουν πανοπλία και μόνο τα Μουλάρια και τα Γαϊδούρια μπορούν να είναι εξοπλισμένα με σακίδια σέλας για τη μεταφορά αντικειμένων. - - Εμφανίζονται σε Χωριά για να τα προστατεύσουν και μπορούν να δημιουργηθούν συνδυάζοντας Σιδερένιους Κύβους και Κολοκύθες. + + Αυτό είναι το περιβάλλον χρήστη αποθέματος αλόγων. - - Κίνηση Εκρηκτικών + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε. + {*B*}Πατήστε{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη πώς να χρησιμοποιείτε το απόθεμα αλόγων. + - - Καλλιτεχνική Σχεδίαση + + Το απόθεμα αλόγων σάς επιτρέπει να μεταφέρετε αντικείμενα ή να εξοπλίσετε με αυτά το Άλογο, το Γαϊδούρι ή το Μουλάρι σας. - - Υπολογισμοί και Στατιστικά Στοιχεία + + Λάμψη - - Συντονιστής Εχθρών + + Ίχνος - - Αρχική Σχεδίαση και Προγραμματισμός + + Διάρκεια πτήσης: - - Υπεύθυνος Έργου/Παραγωγός + + +Σελώστε το Άλογό σας, τοποθετώντας μια Σέλα στη θυρίδα σέλας. Τα Άλογα μπορούν να λάβουν πανοπλία, τοποθετώντας μια Πανοπλία Αλόγου στη θυρίδα πανοπλίας. + - - Το Υπόλοιπο Εργατικό Δυναμικό της Mojang + + Βρήκατε ένα Μουλάρι. - - Επικεφαλής Προγραμματισμού Minecraft για PC + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα για τα Άλογα, τα Γαϊδούρια και τα Μουλάρια. + {*B*}Πατήστε{*CONTROLLER_VK_B*} αν είστε ήδη εξοικειωμένοι με τα Άλογα, τα Γαϊδούρια και τα Μουλάρια. + - - Προγραμματιστής-Νίντζα + + Τα Άλογα και τα Γαϊδούρια βρίσκονται κυρίως σε πεδιάδες ή τη σαβάνα. Τα Μουλάρια προκύπτουν από τη διασταύρωση Γαϊδουριών και Αλόγων, αλλά είναι στείρα. - - Διευθύνων Σύμβουλος + + Μπορείτε, επίσης, να μεταφέρετε αντικείμενα μεταξύ του δικού σας αποθέματος και των σακιδίων σέλας που είναι δεμένα στα Γαϊδούρια και τα Μουλάρια σε αυτό το μενού. - - Υπάλληλος Γραφείου + + Βρήκατε ένα Άλογο. - - Υποστήριξη Πελατών + + Βρήκατε ένα Γαϊδούρι. - - DJ Γραφείου + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα για τους Φάρους. + {*B*}Πατήστε{*CONTROLLER_VK_B*} αν είστε ήδη εξοικειωμένοι με τους Φάρους. + - - Σχεδιαστής/Προγραμματιστής Minecraft - Pocket Edition + + + Μπορείτε να φτιάξετε Πυροτεχνήματα Αστέρια τοποθετώντας Μπαρούτι και Βαφή στο πλαίσιο εργασίας. + - - Προγραμματιστής + + + Η Βαφή θα καθορίσει το χρώμα της έκρηξης του Πυροτεχνήματος Αστεριού. + - - Βασικός Αρχιτέκτονας + + + Το σχήμα του Πυροτεχνήματος Αστεριού καθορίζεται με την προσθήκη Μπάλας Φωτιάς, Ψήγματος Χρυσού, Φτερού ή Κεφαλιού. + - - Καλλιτεχνική Διεύθυνση + + Προαιρετικά, μπορείτε να τοποθετήσετε στο πλαίσιο κατασκευής διάφορα Πυροτεχνήματα Αστέρια και να τα προσθέσετε στο Πυροτέχνημα. - - Δημιουργός Παιχνιδιού + + + Όσο περισσότερες υποδοχές του πλαισίου κατασκευής γεμίσετε με Μπαρούτι, τόσο ψηλότερα θα σκάσουν όλα τα Πυροτεχνήματα Αστέρια. + - - Διευθυντής Διασκέδασης + + + Στη συνέχεια μπορείτε να πάρετε το έτοιμο Πυροτέχνημα από την υποδοχή εξόδου, όταν θελήσετε να το επεξεργαστείτε. + - - Μουσική και Ήχοι + + + Μπορείτε να προσθέσετε ίχνη και λάμψη χρησιμοποιώντας Διαμάντια ή Σκόνη λαμψόπετρας. + - - Προγραμματισμός + + Τα Πυροτεχνήματα είναι διακοσμητικά αντικείμενα που εκτοξεύονται με το χέρι ή με χρήση Διανομέων. Κατασκευάζονται από Χαρτί, Μπαρούτι και, προαιρετικά, μερικά Πυροτεχνήματα Αστέρια. + - - Γραφικά + + + Μπορείτε να προσαρμόσετε τα χρώματα, το σβήσιμο, το σχήμα, το μέγεθος και τα εφέ (όπως, για παράδειγμα, τα ίχνη και τη λάμψη) των Πυροτεχνημάτων Αστεριών, χρησιμοποιώντας πρόσθετα υλικά κατά τη διάρκεια της κατασκευής. + - - Ποιοτικός Έλεγχος + + + Δοκιμάστε να κατασκευάσετε ένα Πυροτέχνημα στον Πάγκο Εργασίας, χρησιμοποιώντας ποικίλα υλικά από τα σεντούκια. + - - Διευθυντής Παραγωγής + + + Μετά την κατασκευή ενός Πυροτεχνήματος Αστεριού, μπορείτε να καθορίσετε το χρώμα σβησίματός του χρησιμοποιώντας Βαφή. + - - Επικεφαλής Παραγωγής + + + Κλεισμένα σε αυτά εδώ τα σεντούκια βρίσκονται διάφορα υλικά που χρησιμοποιούνται στην κατασκευή ΠΥΡΟΤΕΧΝΗΜΑΤΩΝ! + - - Παραγωγός + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα για τα πυροτεχνήματα. + {*B*}Πατήστε{*CONTROLLER_VK_B*} αν είστε ήδη εξοικειωμένοι με τα Πυροτεχνήματα. + - - Επικεφαλής Δοκιμαστών + + + Για να φτιάξετε ένα Πυροτέχνημα, τοποθετήστε Μπαρούτι και Χαρτί στο πλαίσιο εργασίας διαστάσεων 3x3 που φαίνεται πάνω από το απόθεμά σας. + - - Βασικός Δοκιμαστής + + Αυτό το δωμάτιο περιέχει Χοάνες - - Ομάδα Σχεδίασης + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα για τις Χοάνες. + {*B*}Πατήστε{*CONTROLLER_VK_B*} αν είστε ήδη εξοικειωμένοι με τις Χοάνες. + - - Ομάδα Ανάπτυξης + + Οι χοάνες χρησιμοποιούνται για την εισαγωγή ή την αφαίρεση αντικειμένων από δοχεία και για την αυτόματη συλλογή αντικειμένων που έχουν ριχτεί σε αυτά. - - Διαχείριση Κυκλοφορίας + + Οι ενεργοί Φάροι εκπέμπουν μια έντονη δέσμη φωτός στον ουρανό και παρέχουν δυνάμεις σε κοντινούς παίκτες. Κατασκευάζονται με Γυαλί, Οψιανό και Αστέρια του Nether, τα οποία μπορείτε να αποκτήσετε νικώντας το Wither. - - Διευθυντής Έκδοσης XBLA + + Οι Φάροι πρέπει να τοποθετούνται με τρόπο που να είναι στο φως του ήλιου κατά τη διάρκεια της ημέρας. Οι Φάροι πρέπει να τοποθετούνται σε Πυραμίδες από Σίδηρο, Χρυσό, Σμαράγδια ή Διαμάντια. Ωστόσο, η επιλογή του υλικού δεν έχει καμία επίδραση στη δύναμη του φάρου. - - Επιχειρηματικός Σχεδιασμός + + Προσπαθήστε να χρησιμοποιήσετε το Φάρο, για να ορίσετε τις δυνάμεις που παρέχει. Μπορείτε να χρησιμοποιήσετε τις Ράβδους από Σίδηρο που παρέχονται για την απαιτούμενη πληρωμή. - - Διευθυντής Χαρτοφυλακίου + + Μπορούν να επηρεάσουν Βάσεις Παρασκευής, Σεντούκια, Διανομείς, Εκτοξευτές, Βαγόνια Ορυχείου με Σεντούκια, Βαγόνια Ορυχείου με Χοάνη, καθώς και άλλες Χοάνες. - - Υπεύθυνος Προϊόντος + + Σε αυτό το δωμάτιο υπάρχουν διάφορες χρήσιμες διατάξεις Χοάνης, για να τις δείτε και να πειραματιστείτε με αυτές. - - Μάρκετινγκ + + Αυτό είναι το περιβάλλον χρήστη Πυροτεχνήματος, το οποίο μπορείτε να χρησιμοποιήσετε για την κατασκευή Πυροτεχνημάτων και Πυροτεχνημάτων Αστεριών. - - Διαχειριστής Κοινότητας + + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε. + {*B*}Πατήστε{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη πώς να χρησιμοποιείτε το περιβάλλον χρήστη Πυροτεχνήματος. + - - Ομάδα Μετάφρασης - Ευρώπη + + Οι Χοάνες θα επιχειρούν συνεχώς να ρουφήξουν αντικείμενα από ένα κατάλληλο δοχείο που έχει τοποθετηθεί επάνω τους. Επίσης, θα επιχειρούν να εισαγάγουν αποθηκευμένα αντικείμενα σε ένα δοχείο εξόδου. - - Ομάδα Μετάφρασης - Redmond + + + Ωστόσο, αν μια Χοάνη τροφοδοτείται από Κοκκινόπετρα, θα καταστεί ανενεργή και θα σταματήσει τόσο να ρουφάει όσο και να εισαγάγει αντικείμενα. + - - Ομάδα Μετάφρασης – Ασία + + + Η Χοάνη δείχνει προς την κατεύθυνση που προσπαθεί να εξαγάγει αντικείμενα. Προκειμένου μια χοάνη να δείχνει προς έναν συγκεκριμένο κύβο, τοποθετείστε τη χοάνη απέναντι από αυτόν τον κύβο, ενώ κινείστε αθόρυβα. + + - - Ομάδα Έρευνας Χρηστών + + Αυτοί οι εχθροί βρίσκονται σε βάλτους και σας επιτίθενται πετώντας Φίλτρα. Όταν σκοτώνονται, πετάνε Φίλτρα. - - Κεντρικές Ομάδες MGS + + Έχετε φτάσει τον μέγιστο αριθμό Πινάκων/Πλαισίων Αντικειμένων για έναν κόσμο. - - Δοκιμαστής Αποδοχής Οροσήμων + + Δεν μπορείτε να κάνετε spawn σε εχθρούς στη λειτουργία Γαλήνιο. - - Ειδικές Ευχαριστίες + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Γουρουνιών, Προβάτων, Αγελάδων, Γατών και Αλόγων. - - Συντονιστής Δοκιμών + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Καλαμαριών για έναν κόσμο. - - Υπεύθυνος Δοκιμών + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό εχθρών για έναν κόσμο. - - SDET + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό χωρικών για έναν κόσμο. - - Αξιολόγηση Δοκιμής Συστήματος Έργου + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Λύκων. - - Επιπλέον Αξιολόγηση Δοκιμής Συστήματος + + Έχετε φτάσει τον μέγιστο αριθμό Κεφαλών Mob για έναν κόσμο. - - Συνεργάτες Δοκιμών + + Αντίστρ. Κάμερας - - Jon Kågström + + Αριστερό Κροσέ - - Tobias Möllstam + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Κοτόπουλων. - - Risë Lugo + + Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Mooshroom. - - Ξύλινο Σπαθί + + Έχετε φτάσει τον μέγιστο αριθμό Βαρκών για έναν κόσμο. - - Πέτρινο Σπαθί + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Κοτόπουλων για έναν κόσμο. - - Σιδερένιο Σπαθί + + +{*C2*}Πάρε μια ανάσα. Κι άλλη. Νιώσε τον αέρα στα πνευμόνια σου. Άσε τα άκρα σου να ξανασχηματιστούν. Ναι, κούνησε τα δάχτυλά σου. Απόκτησε πάλι σώμα, με βαρύτητα, στον αέρα. Επίστρεψε με σάρκα και οστά στο μακρύ όνειρο. Να 'σαι. Το σώμα σου αγγίζει και πάλι το σύμπαν σε κάθε σημείο, σαν να ήσαστε χωριστές οντότητες. Σαν να ήμαστε χωριστές οντότητες.{*EF*}{*B*}{*B*} +{*C3*}Ποιοι είμαστε; Κάποτε μας αποκαλούσαν το πνεύμα του βουνού. Πατέρα Ήλιο, Μητέρα Σελήνη. Αρχαία πνεύματα, πνεύματα ζώων. Τζίνι. Φαντάσματα. Πράσινο άνθρωπο. Στη συνέχεια, θεούς, δαίμονες. Αγγέλους. Πόλτεργκαϊστ. Εξωγήινους. Λεπτόνια, κουάρκ. Οι λέξεις αλλάζουν. Εμείς όχι.{*EF*}{*B*}{*B*} +{*C2*}Είμαστε το σύμπαν. Είμαστε όλα όσα νομίζεις ότι δεν είσαι εσύ. Τώρα μας βλέπεις, μέσ' από το δέρμα και τα μάτια σου. Και γιατί αγγίζει το σύμπαν το δέρμα σου και σου ρίχνει φως; Για να σε δει, ον. Για να σε γνωρίσει. Και για να το γνωρίσεις. θα σου πω μια ιστορία.{*EF*}{*B*}{*B*} +{*C2*}Μια φορά κι έναν καιρό, ήταν ένας ον.{*EF*}{*B*}{*B*} +{*C3*}Αυτό το παιχνιδιάρικο ήσουν εσύ, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Μερικές φορές αισθανόταν ότι η φύση του ήταν ανθρώπινη, καθώς στεκόταν στον λεπτό φλοιό μιας περιστρεφόμενης σφαίρας από λιωμένη πέτρα. Η σφαίρα από λιωμένη πέτρα περιστρεφόταν γύρω από μια σφαίρα φλεγόμενων αερίων που ήταν τριακόσιες τριάντα χιλιάδες φορές μεγαλύτερη. Ήταν τόσο μακριά η μία από την άλλη, που το φως χρειαζόταν οκτώ λεπτά για να διανύσει την απόσταση. Το φως ήταν πληροφορία από ένα άστρο και μπορούσε να κάψει το δέρμα σου ακόμα και από απόσταση εκατόν πενήντα εκατομμυρίων χιλιομέτρων.{*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*}Μερικές φορές πίστευε ότι βρισκόταν σε ένα σύμπαν φτιαγμένο από ενέργεια που αποτελούνταν από στιγμές εκτός και εντός λειτουργίας, από μηδενικά και μονάδες, από γραμμές κώδικα. Μερικές φορές πίστευε ότι παίζει ένα παιχνίδι. Μερικές φορές πίστευε ότι διαβάζει λέξεις σε μια οθόνη.{*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*} +{*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*} + - - Χρυσό Σπαθί + + Επαναφορά του Nether - - Ξύλινο Φτυάρι + + Ο/Η %s μπήκε στο End - - Πέτρινο Φτυάρι + + Ο/Η %s βγήκε από το End - - Σιδερένιο Φτυάρι + + +{*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*} + - - Αδαμάντινο Φτυάρι + + Είστε σίγουροι ότι θέλετε να επαναφέρετε το Nether στην προεπιλεγμένη του κατάσταση σε αυτό το αποθηκευμένο παιχνίδι; Θα χάσετε όλα όσα έχετε κατασκευάσει στο The Nether! - - Χρυσό Φτυάρι + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων, Γατών και Αλόγων. - - Ξύλινη Αξίνα + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Mooshroom. - - Πέτρινη Αξίνα + + Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Λύκων για έναν κόσμο. - - Σιδερένια Αξίνα + + Επαναφορά του Nether - - Αδαμάντινη Αξίνα + + Να μην γίνει επαναφορά του Nether - - Χρυσή Αξίνα + + Δεν είναι δυνατό το κούρεμα αυτού του Mooshroom αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων, Γατών και Αλόγων. - - Ξύλινο Τσεκούρι + + Πεθάνατε! - - Πέτρινο Τσεκούρι + + Επιλογές Κόσμου - - Σιδερένιο Τσεκούρι + + Δυνατότητα Κατασκευών και Εξόρυξης - - Αδαμάντινο Τσεκούρι + + Δυνατότητα Χρήσης Πορτών, Διακοπτών - - Χρυσό Τσεκούρι + + Δημιουργία Οικοδομημάτων - - Ξύλινο Σκαλιστήρι + + Εντελώς Επίπεδος Κόσμος - - Πέτρινο Σκαλιστήρι + + Σεντούκι Μπόνους - - Σιδερένιο Σκαλιστήρι + + Δυνατότητα Ανοίγματος Δοχείων - - Αδαμάντινο Σκαλιστήρι + + Αποβολή Παίκτη - - Χρυσό Σκαλιστήρι + + Δυνατότητα Πτήσης - - Ξύλινη Πόρτα + + Απενεργοποίηση Εξάντλησης - - Σιδερένια Πόρτα + + Δυνατότητα Επίθεσης σε Παίκτες - - Σιδερόπλεκτη Περικεφαλαία + + Δυνατότητα Επίθεσης σε Ζώα - - Σιδερόπλεκτος Θώρακας + + Επόπτης - - Σιδερόπλεκτη Περισκελίδα + + Προνόμια Οικοδεσπότη - - Σιδερόπλεκτες Μπότες + + Πώς να Παίξετε - - Δερμάτινος Σκούφος + + Πλήκτρα Ελέγχου - - Σιδερένια Περικεφαλαία + + Ρυθμίσεις - - Αδαμάντινη Περικεφαλαία + + Επαναγένεση - - Χρυσή Περικεφαλαία + + Προσφορές Περιεχομένου Λήψης - - Δερμάτινο Χιτώνιο + + Αλλαγή Skin - - Σιδερένιος Θώρακας + + Συντελεστές + - - Αδαμάντινος Θώρακας + + Ανατίναξη TNT - - Χρυσός Θώρακας + + Παίκτης εναντίον Παίκτη - - Δερμάτινο Παντελόνι + + Εμπιστοσύνη προς Παίκτες - - Σιδερένια Περισκελίδα + + Επανεγκατάσταση Περιεχομένου - - Αδαμάντινη Περισκελίδα + + Ρυθμίσεις Εντοπισμού Σφαλμάτων - - Χρυσή Περισκελίδα + + Εξάπλωση Φωτιάς - - Δερμάτινες Μπότες + + Δράκος του End - - Σιδερένιες Μπότες + + Ο/Η {*PLAYER*} σκοτώθηκε από ανάσα Δράκου του End - - Αδαμάντινες Μπότες + + Ο/Η {*PLAYER*} σφαγιάστηκε από {*SOURCE*} - - Χρυσές Μπότες + + Ο/Η {*PLAYER*} σφαγιάστηκε από τον/την {*SOURCE*} - - Ράβδος Σιδήρου + + Ο/Η {*PLAYER*} πέθανε - - Ράβδος Χρυσού + + Ο/Η {*PLAYER*} ανατινάχτηκε - - Κουβάς + + Ο/Η {*PLAYER*} σκοτώθηκε από μαγικά - - Κουβάς Νερού + + Ο/Η {*PLAYER*} πυροβολήθηκε από {*SOURCE*} - - Κουβάς Λάβας + + Ομίχλη Καθαρού Βράχου - - Πυρόλιθος και Χάλυβας + + Προβολή HUD - - Μήλο + + Προβολή Χεριού - - Τόξο + + Ο/Η {*PLAYER*} δέχθηκε χτύπημα με φλεγόμενη σφαίρα από {*SOURCE*} - - Βέλος + + Ο/Η {*PLAYER*} γρονθοκοπήθηκε από {*SOURCE*} - - Κάρβουνο + + Ο/Η {*PLAYER*} σκοτώθηκε από {*SOURCE*} με μαγεία - - Ξυλοκάρβουνο + + Ο/Η {*PLAYER*} έπεσε έξω από τον κόσμο - - Διαμάντι + + Πακέτα με Υφές - - Ραβδί + + Μικτά Πακέτα - - Μπολ + + Ο/Η {*PLAYER*} τυλίχτηκε στις φλόγες - - Μανιταρόσουπα + + Θέματα - - Σπάγκος + + Εικόνες Παικτών - - Φτερό + + Άβαταρ - - Μπαρούτι + + Ο/Η {*PLAYER*} κάηκε - - Σπόροι Σιταριού + + Ο/Η {*PLAYER*} πέθανε από πείνα - - Σιτάρι + + Ο/Η {*PLAYER*} πέθανε από τα πολλά τσιμπήματα - - Ψωμί + + Ο/Η {*PLAYER*} έπεσε στο έδαφος μεγαλοπρεπώς - - Πυρόλιθος + + Ο/Η {*PLAYER*} προσπάθησε να κολυμπήσει σε λάβα - - Ωμή Χοιρινή Μπριζόλα + + Ο/Η {*PLAYER*} πέθανε από ασφυξία μέσα σε τοίχο - - Ψημένη Χοιρινή Μπριζόλα + + Ο/Η {*PLAYER*} πνίγηκε - - Πίνακας + + Μηνύματα Θανάτου - - Χρυσό Μήλο + + Δεν είστε πλέον επόπτης - - Πινακίδα + + Μπορείτε πλέον να πετάξετε - - Βαγόνι Ορυχείου + + Δεν μπορείτε πλέον να πετάξετε - - Σέλα + + Δεν μπορείτε πλέον να επιτίθεστε σε ζώα - - Κοκκινόπετρα + + Μπορείτε πλέον να επιτίθεστε σε ζώα - - Χιονόμπαλα + + Είστε πλέον επόπτης - - Βάρκα + + Δεν θα εξαντλείστε πια - - Δέρμα + + Είστε πλέον άτρωτος - - Κουβάς Γάλατος + + Δεν είστε πλέον άτρωτος - - Τούβλο + + %d MSP - - Πηλός + + Στο εξής θα εξαντλείστε - - Ζαχαρωτά + + Είστε πλέον αόρατος - - Χαρτί + + Δεν είστε πλέον αόρατος - - Βιβλίο + + Μπορείτε πλέον να επιτίθεστε σε παίκτες - - Μπάλα Κόλλας + + Μπορείτε πλέον να κάνετε εξόρυξη και χρήση αντικειμένων - - Βαγόνι με Σεντούκι + + Δεν μπορείτε πλέον να τοποθετήσετε κύβους - - Βαγόνι με Φούρνο + + Μπορείτε πλέον να τοποθετήσετε κύβους - - Αυγό + + Κινούμενος Χαρακτήρας - - Πυξίδα + + Μετατροπή σε Κινούμενο Χαρακτήρα - - Καλάμι Ψαρέματος + + Δεν μπορείτε πλέον να κάνετε εξόρυξη ή χρήση αντικειμένων - - Ρολόι + + Μπορείτε πλέον να χρησιμοποιήσετε πόρτες και διακόπτες - - Σκόνη Λαμψόπετρας + + Δεν μπορείτε πλέον να επιτίθεστε σε mob - - Ωμό Ψάρι + + Μπορείτε πλέον να επιτίθεστε σε mob - - Ψημένο Ψάρι + + Δεν μπορείτε πλέον να επιτίθεστε σε παίκτες - - Σκόνη Βαφής + + Δεν μπορείτε πλέον να χρησιμοποιήσετε πόρτες και διακόπτες - - Ασκός Μελάνης + + Μπορείτε πλέον να χρησιμοποιήσετε δοχεία (π.χ. σεντούκια) - - Τριανταφυλλί + + Δεν μπορείτε πλέον να χρησιμοποιήσετε δοχεία (π.χ. σεντούκια) - - Πράσινο του Κάκτου + + Αόρατο - - Καρποί Κακάο + + Φάροι + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΦΑΡΟΙ{*ETW*}{*B*}{*B*} +Οι ενεργοί Φάροι εκπέμπουν μια έντονη δέσμη φωτός στον ουρανό και παρέχουν δυνάμεις σε κοντινούς παίκτες.{*B*} +Κατασκευάζονται με Γυαλί, Οψιανό και Αστέρια του Nether, τα οποία μπορείτε να αποκτήσετε νικώντας το Wither.{*B*}{*B*} +Οι Φάροι πρέπει να τοποθετούνται με τρόπο που να είναι στο φως του ήλιου κατά τη διάρκεια της ημέρας. Οι Φάροι πρέπει να τοποθετούνται σε Πυραμίδες από Σίδηρο, Χρυσό, Σμαράγδια ή Διαμάντια.{*B*} +Το υλικό πάνω στο οποίο τοποθετείται ο Φάρος δεν έχει καμία επίδραση στη δύναμη του Φάρου.{*B*}{*B*} +Στο μενού Φάρου μπορείτε να επιλέξετε μία κύρια δύναμη για το Φάρο σας. Όσο περισσότερες βαθμίδες έχει η πυραμίδα σας, τόσο περισσότερες θα είναι οι επιλογές δυνάμεων.{*B*} +Ένας φάρος σε μια πυραμίδα με τουλάχιστον τέσσερις βαθμίδες δίνει επίσης την επιλογή της δευτερεύουσας δύναμης Αναδημιουργία ή μιας πιο ισχυρής κύριας δύναμης.{*B*}{*B*} +Για να ορίσετε τις δυνάμεις του Φάρου σας, πρέπει να θυσιάσετε μια Ράβδο από Σμαράγδια, Χρυσό ή Σίδηρο στην υποδοχή πληρωμής.{*B*} +Αφού τις ορίσετε, οι δυνάμεις θα εκπέμπονται από το Φάρο επ' αόριστον.{*B*} + + + Πυροτεχνήματα + + + Γλώσσες + + + Άλογα + + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΑΛΟΓΑ{*ETW*}{*B*}{*B*} +Τα Άλογα και τα Γαϊδούρια βρίσκονται κυρίως σε ανοικτές πεδιάδες. Τα Μουλάρια προκύπτουν από τη διασταύρωση Γαϊδουριών και Αλόγων, αλλά είναι στείρα.{*B*} +Μπορείτε να ιππεύσετε όλα τα ενήλικα Άλογα, Γαϊδούρια και Μουλάρια. Ωστόσο, μόνο τα Άλογα μπορούν να έχουν πανοπλία και μόνο τα Μουλάρια και τα Γαϊδούρια μπορούν να εξοπλίζονται με σακίδια σέλας για τη μεταφορά αντικειμένων.{*B*}{*B*} +Για να χρησιμοποιήσετε τα Άλογα, τα Γαϊδούρια και τα Μουλάρια, πρέπει πρώτα να τα δαμάσετε. Για να δαμάσετε ένα άλογο, πρέπει να προσπαθήσετε να το ιππεύσετε και να καταφέρετε να μείνετε πάνω του, όσο αυτό προσπαθεί να ρίξει τον αναβάτη.{*B*} +Όταν γύρω από το άλογο εμφανιστούν Καρδιές Αγάπης, το άλογο είναι ήμερο και δεν θα προσπαθήσει ξανά να ρίξει κάτω τον παίκτη. Για να καθοδηγήσει ένα άλογο, ο παίκτης πρέπει να εξοπλίσει το άλογο με Σέλα.{*B*}{*B*} +Τις Σέλες μπορείτε να τις αγοράσετε από χωρικούς ή να τις βρείτε μέσα σε Σεντούκια κρυμμένα στον κόσμο.{*B*} +Τα ήμερα Γαϊδούρια και Μουλάρια μπορούν να αποκτήσουν σακίδια σέλας προσαρτώντας ένα Σεντούκι. Μπορείτε να έχετε πρόσβαση σε αυτά τα σακίδια σέλας ενώ ιππεύετε ή χρησιμοποιείτε αθόρυβη κίνηση.{*B*}{*B*} +Μπορείτε να εκθρέψετε Άλογα και Γαϊδούρια (όχι όμως Μουλάρια) όπως τα υπόλοιπα ζώα, χρησιμοποιώντας Χρυσά Μήλα ή Χρυσά Καρότα.{*B*} +ε την πάροδο του χρόνου, τα Πουλάρια θα γίνουν ενήλικα άλογα. Αν τα ταΐζετε Σιτάρι ή Σανό θα μεγαλώσουν γρηγορότερα.{*B*} + - - Λάπις Λάζουλι + + {*T3*}HOW TO PLAY : FIREWORKS{*ETW*}{*B*}{*B*} +Τα Πυροτεχνήματα είναι διακοσμητικά αντικείμενα που εκτοξεύονται με το χέρι ή με χρήση Διανομέων. Κατασκευάζονται από Χαρτί, Μπαρούτι και, προαιρετικά, μερικά Πυροτεχνήματα Αστέρια.{*B*} +Μπορείτε να προσαρμόσετε τα χρώματα, το σβήσιμο, το σχήμα, το μέγεθος και τα εφέ (όπως για παράδειγμα τα ίχνη και τη λάμψη) των Πυροτεχνημάτων Αστεριών, χρησιμοποιώντας πρόσθετα υλικά κατά τη διάρκεια της κατασκευής.{*B*}{*B*} +Για να φτιάξετε ένα Πυροτέχνημα, τοποθετήστε Μπαρούτι και Χαρτί στο πλαίσιο κατασκευής διαστάσεων 3x3 που φαίνεται πάνω από το απόθεμά σας.{*B*} +Προαιρετικά, μπορείτε να τοποθετήσετε στο πλαίσιο κατασκευής διάφορα Πυροτεχνήματα Αστέρια και να τα προσθέσετε στο Πυροτέχνημα.{*B*} +Όσο περισσότερες υποδοχές του πλαισίου κατασκευής γεμίσετε με Μπαρούτι, τόσο ψηλότερα θα σκάσουν όλα τα Πυροτεχνήματα Αστέρια.{*B*}{*B*} +Στη συνέχεια μπορείτε να πάρετε το έτοιμο Πυροτέχνημα από την υποδοχή εξόδου.{*B*}{*B*} +Μπορείτε να φτιάξετε Πυροτεχνήματα Αστέρια τοποθετώντας Μπαρούτι και Βαφή στο πλαίσιο εργασίας.{*B*} +- Η Βαφή θα καθορίσει το χρώμα της έκρηξης του Πυροτεχνήματος Αστεριού.{*B*} +- Το σχήμα του Πυροτεχνήματος Αστεριού καθορίζεται με την προσθήκη Μπάλας Φωτιάς, Ψήγματος Χρυσού, Φτερού ή Κεφαλιού.{*B*} +- Μπορείτε να προσθέσετε ίχνη και λάμψη χρησιμοποιώντας Διαμάντια ή Σκόνη λαμψόπετρας.{*B*}{*B*} +Μετά την κατασκευή ενός Πυροτεχνήματος Αστεριού, μπορείτε να καθορίσετε το χρώμα σβησίματός του χρησιμοποιώντας Βαφή. + - - Μοβ Βαφή + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΕΚΤΟΞΕΥΤΕΣ{*ETW*}{*B*}{*B*} +Όταν τροφοδοτούνται από Κοκκινόπετρα, οι Εκτοξευτές ρίχνουν στο έδαφος ένα μεμονωμένο τυχαίο αντικείμενο που περιέχουν. Ανοίξτε τον Εκτοξευτή με {*CONTROLLER_ACTION_USE*} και γεμίστε τον με αντικείμενα από το απόθεμά σας..{*B*} +Όταν ο Εκτοξευτής είναι στραμμένος προς ένα Σεντούκι ή άλλο είδος Δοχείου, το αντικείμενο δεν θα πέσει στο έδαφος αλλά θα μεταφερθεί εκεί. Μπορείτε να δημιουργήσετε μεγάλες διατάξεις Εκτοξευτών για τη μεταφορά αντικειμένων σε απόσταση. Για να λειτουργήσει αυτού του είδους η διάταξη, οι Εκτοξευτές πρέπει να ανάβουν και να σβήνουν εναλλάξ. + - - Γαλανή Βαφή + + Όταν χρησιμοποιείται, γίνεται χάρτης του μέρους του κόσμου όπου βρίσκεστε, και γεμίζει όσο εξερευνάτε. - - Ανοιχτή Γκρίζα Βαφή + + Έπεσε από τους Wither, χρησιμοποιείται στην κατασκευή Φάρων - - Γκρίζα Βαφή + + Χοάνες - - Ροζ Βαφή + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΧΟΑΝΕΣ{*ETW*}{*B*}{*B*} +Οι Χοάνες χρησιμοποιούνται για την εισαγωγή ή την αφαίρεση αντικειμένων από δοχεία και για την αυτόματη συλλογή αντικειμένων που έχουν ριχτεί σε αυτά.{*B*} +Μπορούν να επηρεάσουν Βάσεις Παρασκευής, Σεντούκια, Διανομείς, Εκτοξευτές, Βαγόνια Ορυχείου με Σεντούκια, Βαγόνια Ορυχείου με Χοάνη, καθώς και άλλες Χοάνες.{*B*}{*B*} +Οι Χοάνες θα επιχειρούν συνεχώς να ρουφήξουν αντικείμενα από ένα κατάλληλο δοχείο που έχει τοποθετηθεί επάνω τους. Επίσης, θα επιχειρούν να εισαγάγουν αποθηκευμένα αντικείμενα σε ένα δοχείο εξόδου.{*B*} +Εάν μια Χοάνη τροφοδοτείται από Κοκκινόπετρα, θα καταστεί ανενεργή και θα σταματήσει τόσο να ρουφάει όσο και να εισαγάγει αντικείμενα.{*B*}{*B*} +Η Χοάνη δείχνει προς την κατεύθυνση που προσπαθεί να εξαγάγει αντικείμενα. Προκειμένου μια Χοάνη να δείχνει προς έναν συγκεκριμένο κύβο, τοποθετείστε τη Χοάνη απέναντι από αυτόν τον κύβο, ενώ κινείστε αθόρυβα.{*B*} - - Ανοιχτή Πράσινη Βαφή + + Εκτοξευτές - - Κίτρινο Ηλίανθου + + NOT USED - - Ανοιχτή Μπλε Βαφή + + Άμεση Υγεία - - Φούξια Βαφή + + Άμεση Βλάβη - - Πορτοκαλί Βαφή + + Ώθηση Άλματος - - Πάστα Οστών + + Κούραση Λόγω Εξόρυξης - - Κόκκαλο + + Δύναμη - - Ζάχαρη + + Αδυναμία - - Κέικ + + Ναυτία - - Κρεβάτι + + NOT USED - - Αγωγός Κοκκινόπετρας + + NOT USED - - Μπισκότο + + NOT USED - - Χάρτης + + Αναδημιουργία - - Δίσκος Μουσικής - "13" + + Αντοχή - - Δίσκος Μουσικής - "Γάτα" + + Εύρεση Σπόρου για το Δημιουργό Κόσμων. - - Δίσκος Μουσικής - "Κύβοι" + + Όταν είναι ενεργοποιημένο, δημιουργεί πολύχρωμες εκρήξεις. Το χρώμα, το εφέ, το σχήμα και το σβήσιμο καθορίζονται από το Πυροτέχνημα-Αστέρι που χρησιμοποιείται κατά τη δημιουργία του Πυροτεχνήματος. - - Δίσκος Μουσικής - "Τιτίβισμα" + + Ένας τύπος ραγών που μπορεί να ενεργοποιήσει ή να απενεργοποιήσει Βαγόνια Ορυχείου με Χοάνη και να πυροδοτήσει Βαγόνια Ορυχείου με TNT. - - Δίσκος Μουσικής - "Μακριά" + + Χρησιμοποιείται για να κρατήσετε ή να ρίξετε αντικείμενα ή για να σπρώξετε αντικείμενα σε ένα άλλο δοχείο, όταν φορτίζεται μέσω Κοκκινόπετρας. - - Δίσκος Μουσικής - "Ψώνια" + + Χρωματιστοί κύβοι που κατασκευάζονται χρωματίζοντας Ενισχυμένο πηλό. - - Δίσκος Μουσικής - "Ήρεμη" + + Παρέχει φορτίο Κοκκινόπετρας. Το φορτίο θα είναι ισχυρότερο, εάν στην πλάκα υπάρχουν περισσότερα αντικείμενα. Απαιτεί περισσότερο βάρος από την ελαφριά πλάκα. - - Δίσκος Μουσικής - "Τζαζ" + + Χρησιμοποιείται ως πηγή δύναμης κοκκινόπετρας. Μπορεί να μετατραπεί πάλι σε Κοκκινόπετρα. - - Δίσκος Μουσικής - "Τροπικό" + + Χρησιμοποιείται για να πιάνετε αντικείμενα ή για να μεταφέρετε αντικείμενα μέσα σε ή έξω από δοχεία. - - Δίσκος Μουσικής - "Σκοτάδι" + + Μπορείτε να το δώσετε σε Άλογα, Γαϊδούρια ή Μουλάρια, για να θεραπευθούν έως 10 Καρδιές. Επιταχύνει την ανάπτυξη των πουλαριών. - - Δίσκος μουσικής - "11" + + Νυχτερίδα - - Δίσκος Μουσικής - "Πού Είμαστε Τώρα" + + Αυτά τα ιπτάμενα πλάσματα βρίσκονται σε σπηλιές ή άλλους μεγάλους κλειστούς χώρους. - - Ψαλίδια + + Μάγισσα - - Σπόροι Κολοκύθας + + Δημιουργείται λιώνοντας Πηλό σε φούρνο. - - Σπόροι Καρπουζιού + + Κατασκευάζεται από γυαλί και βαφή. - - Ωμό Κοτόπουλο + + Κατασκευάζεται από Βαμμένο Γυαλί - - Ψημένο Κοτόπουλο + + Παρέχει φορτίο Κοκκινόπετρας. Το φορτίο θα είναι ισχυρότερο, εάν στην πλάκα υπάρχουν περισσότερα αντικείμενα. - - Ωμό Μοσχάρι + + Είναι ένας κύβος που μεταδίδει ένα σήμα Κοκκινόπετρας με βάση το φως του ήλιου (ή την έλλειψη αυτού). - - Μπριζόλα + + Είναι ένας τύπος βαγονιού ορυχείου που λειτουργεί παρόμοια με Χοάνη. Θα συλλέγει αντικείμενα που βρίσκονται σε πλατφόρμες και από δοχεία που βρίσκονται από πάνω του. - - Σάπιο Κρέας + + Ένας ειδικός τύπος Πανοπλίας που μπορεί να τοποθετηθεί σε άλογο. Προσφέρει Πανοπλία επιπέδου 5. - - Μαργαριτάρι του Ender + + Χρησιμοποιούνται για τον καθορισμό του χρώματος, της επίδρασης και τους σχήματος των πυροτεχνημάτων. - - Φέτα Καρπουζιού + + Χρησιμοποιείται σε κυκλώματα Κοκκινόπετρας, για τη διατήρηση, τη σύγκριση ή την αφαίρεση ισχύος σήματος ή για τη μέτρηση της κατάστασης συγκεκριμένων κύβων. + + + Είναι ένας τύπος βαγονιού ορυχείου που λειτουργεί ως κινούμενος κύβος TNT. - - Ράβδος Blaze + + Ένας ειδικός τύπος Πανοπλίας που μπορεί να τοποθετηθεί σε άλογο. Προσφέρει Πανοπλία επιπέδου 7. - - Δάκρυ Ghast + + Χρησιμοποιούνται για την εκτέλεση εντολών. - - Ψήγμα Χρυσού + + Εκπέμπει μια δέσμη φωτός στον ουρανό και μπορεί να παράσχει Επιδράσεις Κατάστασης σε κοντινούς παίκτες. - - Φυτό Nether + + Αποθηκεύει μέσα του κύβους και αντικείμενα. Τοποθετήστε δύο σεντούκια το ένα δίπλα στο άλλο, για να δημιουργήσετε ένα μεγαλύτερο σεντούκι με διπλάσια χωρητικότητα. Το παγιδευμένο σεντούκι δημιουργεί επίσης ένα φορτίο Κοκκινόπετρας όταν ανοίγει. - - {*splash*}{*prefix*}Φίλτρο {*postfix*} + + Ένας ειδικός τύπος Πανοπλίας που μπορεί να τοποθετηθεί σε άλογο. Προσφέρει Πανοπλία επιπέδου 11. - - Γυάλινο Μπουκάλι + + Χρησιμοποιείται για δέσιμο mob στον παίκτη ή σε πασσάλους Φράχτη - - Μπουκάλι Νερού + + Χρησιμοποιείται για την ονομασία mob στον κόσμο. - - Μάτι Αράχνης + + Βιασύνη - - Ζυμωμένο Μάτι Αράχν. + + Ξεκλείδωμα Πλήρους Παιχνιδιού - - Σκόνη Blaze + + Συνέχιση Παιχνιδιού - - Κρέμα Μάγματος + + Αποθήκευση Παιχνιδιού - - Βάση Παρασκευής + + Παιχνίδι - - Καζάνι + + Πίνακες Κορυφαίων - - Μάτι του Ender + + Βοήθεια και Επιλογές - - Γυαλιστερό Καρπούζι + + Δυσκολία: - - Μπουκάλι Μαγέματος + + Π εναντίον Π: - - Μπάλα Φωτιάς + + Εμπιστοσύνη: - - Μπάλα Φωτιάς (Ξυλοκ.) + + TNT: - - Μπάλα Φωτιάς (Κάρβ.) + + Τύπος Παιχνιδιού: - - Πλαίσιο Αντικειμένου + + Οικοδομήματα: - - Δημιουργία {*CREATURE*} + + Τύπος Επιπέδου: - - Τούβλο Nether + + Δεν Βρέθηκαν Παιχνίδια - - Κρανίο + + Μόνο Πρόσκληση - - Κρανίο Σκελετού + + Περισσότερες Επιλογές - - Κρανίο Μαύρου Σκελετού + + Φόρτωση - - Κεφάλι Ζόμπι + + Επιλογές Οικοδεσπότη - - Κεφάλι + + Παίκτες/Πρόσκληση - - Κεφάλι από %s + + Διαδικτυακό Παιχνίδι - - Κεφάλι Creeper + + Νέος Κόσμος - - Πέτρα + + Παίκτες - - Κύβοι Γρασιδιού + + Συμμετοχή στο Παιχνίδι - - Χώμα + + Έναρξη Παιχνιδιού - - Πέτρα Επίστρωσης + + Όνομα Κόσμου - - Σανίδες από Βελανιδιά + + Seed για το Πρόγραμμα Δημιουργίας Κόσμου - - Σανίδες από Έλατο + + Αφήστε το κενό για έναν τυχαίο seed - - Σανίδες από Σημύδα + + Εξάπλωση Φωτιάς: - - Σανίδ. Ξύλου Ζούγκλας + + Επεξεργασία μηνύματος πινακίδας: - - Βλαστάρι + + Συμπληρώστε τα στοιχεία που θα συνοδεύουν το στιγμιότυπο οθόνης σας - - Βλαστάρι Βελανιδιάς + + Λεζάντα - - Βλαστάρι Ελάτου + + Συμβουλές Εργαλείων Εντός του Παιχνιδιού - - Βλαστάρι Σημύδας + + Κατακόρυφος Διαχωρισμός Οθόνης για 2 Παίκτες - - Βλαστάρι Ζούγκλας + + Ολοκληρώθηκε - - Καθαρός Βράχος + + Στιγμιότυπο οθόνης από το παιχνίδι - - Νερό + + Χωρίς Eπίδραση - - Λάβα + + Ταχύτητα - - Άμμος + + Βραδύτητα - - Αμμόλιθος + + Επεξεργασία μηνύματος πινακίδας: - - Χαλίκι + + Οι υφές, τα εικονίδια και το περιβάλλον χρήστη του κλασικού Minecraft! - - Ορυκτός Χρυσός + + Προβολή όλων των Μικτών Κόσμων - - Ορυκτός Σίδηρος + + Συμβουλές - - Ορυκτό Κάρβουνο + + Επανεγκατάσταση Άβαταρ 1 - - Ξύλο + + Επανεγκατάσταση Άβαταρ 2 - - Ξύλο Βελανιδιάς + + Επανεγκατάσταση Άβαταρ 3 - - Ξύλο Ελάτου + + Επανεγκατάσταση Θέματος - - Ξύλο Σημύδας + + Επανεγκατάσταση Εικόνας Παίκτη 1 - - Ξύλο Ζούγκλας + + Επανεγκατάσταση Εικόνας Παίκτη 2 - - Βελανιδιά + + Επιλογές - - Έλατο + + Περιβάλλον Χρήστη - - Σημύδα + + Επαναφορά Προεπιλογών - - Φύλλα + + Προβολή Κίνησης Κάμερας - - Φύλλα Βελανιδιάς + + Ήχος - - Φύλλα Ελάτου + + Έλεγχος - - Φύλλα Σημύδας + + Γραφικά - - Φύλλα Ζούγκλας + + Χρησιμοποιείται στην παρασκευή φίλτρων. Πέφτει από Ghast όταν πεθαίνουν. - - Σφουγγάρι + + Πέφτει από Γουρουνάνθρωπους Ζόμπι όταν πεθαίνουν. Οι Γουρουνάνθρωποι Ζόμπι κατοικούν στο Nether. Χρησιμοποιείται ως συστατικό για την παρασκευή φίλτρων. - - Γυαλί + + Χρησιμοποιείται στην παρασκευή φίλτρων. Φυτρώνει φυσικά σε Οχυρά του Nether. Μπορεί επίσης να φυτευτεί σε Άμμο των Ψυχών. - - Μαλλί + + Γλιστράει όταν περπατάτε επάνω του. Αν βρίσκεται επάνω από άλλον κύβο, μετατρέπεται σε νερό όταν καταστρέφεται. Λιώνει αν έρθει πολύ κοντά σε μια πηγή φωτός ή όταν τοποθετείται στο Nether. - - Μαύρο Μαλλί + + Μπορεί να χρησιμοποιηθεί ως διακοσμητικό. - - Κόκκινο Μαλλί + + Χρησιμοποιείται στην παρασκευή φίλτρων και για τον εντοπισμό Φρουρίων. Πέφτει από τα Blaze που συνήθως βρίσκονται κοντά σε Φρούρια στο Nether. - - Πράσινο Μαλλί + + Όταν χρησιμοποιείται, μπορεί να έχει διάφορα αποτελέσματα, ανάλογα με το πού χρησιμοποιείται. - - Καφέ Μαλλί + + Χρησιμοποιείται στην παρασκευή φίλτρων ή συνδυάζεται με άλλα αντικείμενα για τη δημιουργία Ματιών του Ender ή Κρέμα Μάγματος. - - Μπλε Μαλλί + + Χρησιμοποιείται στην παρασκευή φίλτρων. - - Μοβ Μαλλί + + Χρησιμοποιείται για τη δημιουργία Φίλτρων και Φίλτρων Εκτόξευσης. - - Γαλανό Μαλλί + + Μπορεί να γεμίσει με νερό και να χρησιμοποιηθεί ως βασικό συστατικό για ένα φίλτρο στη Βάση Παρασκευής. - - Ανοιχτό Γκρι Μαλλί + + Ένα δηλητηριώδες τρόφιμο και υλικό για φίλτρα. Πέφτει όταν ο παίκτης σκοτώνει Αράχνες ή Αράχνες των Σπηλαίων. - - Γκρι Μαλλί + + Χρησιμοποιείται στην παρασκευή φίλτρων, συνήθως για τη δημιουργία φίλτρων με αρνητικές επιδράσεις. - - Ροζ Μαλλί + + Όταν τοποθετηθεί κάπου, μεγαλώνει με το πέρασμα του χρόνου. Μπορεί να συλλεχθεί με ψαλίδι. Μπορείτε να το σκαρφαλώσετε σαν να ήταν σκάλα. - - Ανοιχτό Πράσινο Μαλλί + + Λειτουργεί ως πόρτα, αλλά χρησιμοποιείται κυρίως σε φράκτες. - - Κίτρινο Μαλλί + + Μπορεί να δημιουργηθεί από Φέτες Καρπουζιού. - - Ανοιχτό Μπλε Μαλλί + + Διάφανοι κύβοι που μπορούν να χρησιμοποιηθούν αντί για Γυάλινους Κύβους. - - Φούξια Μαλλί + + Όταν τροφοδοτείται με ρεύμα (με χρήση ενός κουμπιού, διακόπτη, πλάκας πίεσης, πυρσού από κοκκινόπετρα ή κοκκινόπετρα σε οποιονδήποτε συνδυασμό με τα παραπάνω), το έμβολο προεκτείνεται, αν έχει αρκετό χώρο, και σπρώχνει κύβους. Όταν μαζεύεται, τραβά μαζί του και τον κύβο που έρχεται σε επαφή με το εκτεταμένο μέρος του εμβόλου. - - Πορτοκαλί Μαλλί + + Κατασκευάζεται από κύβους πέτρας και βρίσκεται συνήθως σε Φρούρια. - - Λευκό Μαλλί + + Χρησιμοποιείται ως φράγμα και λειτουργεί όπως και οι φράκτες. - - Λουλούδι + + Μπορεί να φυτευτεί για την καλλιέργεια κολοκύθας. - - Τριαντάφυλλο + + Μπορεί να χρησιμοποιηθεί για κατασκευές και διακόσμηση. - - Μανιτάρι + + Επιβραδύνει την κίνηση όταν περνάτε από μέσα του. Μπορείτε να το καταστρέψετε με ψαλίδι για να συλλέξετε κλωστή. - - Κύβος Χρυσού + + Όταν καταστραφεί, παράγει ένα Ασημόψαρο. Μπορεί επίσης να δημιουργήσει Ασημόψαρα αν βρίσκεται κοντά σε ένα άλλο Ασημόψαρο που δέχεται επίθεση. - - Ένας συμπαγής τρόπος αποθήκευσης Χρυσού. + + Μπορεί να φυτευτεί για την καλλιέργεια καρπουζιών. - - Κύβος Σιδήρου + + Πέφτει από Enderman όταν πεθαίνουν. Όταν πεταχτεί, ο παίκτης τηλεμεταφέρεται στη θέση που πέφτει το Μαργαριτάρι του Ender και χάνει λίγη ζωή. - - Ένας συμπαγής τρόπος αποθήκευσης Σιδήρου. + + Ένας κύβος από χώμα με γρασίδι που φυτρώνει στην κορυφή. Συλλέγεται με φτυάρι. Μπορεί να χρησιμοποιηθεί για κατασκευές. - - Πέτρινη Πλάκα + + Αν το γεμίσετε με νερό της βροχής ή από έναν κουβά, μπορείτε να το χρησιμοποιήσετε για να γεμίσετε Γυάλινα Μπουκάλια με νερό. - - Πέτρινη Πλάκα + + Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. - - Πλάκα από Αμμόλιθο + + Δημιουργείται λιώνοντας Netherrack σε φούρνο. Μπορεί να χρησιμοποιηθεί για τη δημιουργία κύβων Τούβλου Nether. - - Πλάκα από Βελανιδιά + + Όταν τροφοδοτούνται με ρεύμα, εκπέμπουν φως. - - Πέτρινη Πλάκα + + Μοιάζουν με προθήκες επίδειξης και παρουσιάζουν το αντικείμενο ή τον κύβο που περιέχουν. - - Πλάκα από Τούβλα + + Όταν πετάγεται, μπορεί να δημιουργήσει ένα πλάσμα του τύπου που αναφέρεται. - - Πλάκα από Πέτρινα Τούβλα + + Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. - - Πλάκα από Βελανιδιά + + Μπορούν να καλλιεργηθούν για την παραγωγή Καρπών Κακάο. - - Πλάκα από Έλατο + + Αγελάδα - - Πλάκα από Σημύδα + + Ρίχνει δέρμα όταν σκοτωθεί. Μπορεί, επίσης, να αρμεχθεί με έναν κουβά. - - Πλάκα Ξύλου Ζούγκλας + + Πρόβατο - - Πλάκα από Τούβλα Nether + + Τα Κεφάλια Mob μπορούν να χρησιμοποιηθούν ως διακοσμητικά ή να φορεθούν ως μάσκες στην υποδοχή κράνους. - - Τούβλα + + Καλαμάρι - - TNT + + Ρίχνει ασκούς μελάνης όταν σκοτωθεί. - - Ράφι Βιβλιοθήκης + + Χρήσιμο για την ανάφλεξη υλικών ή για εμπρηστικά πυρά όταν εκτοξεύεται από Διανομέα. - - Πέτρα με Βρύα + + Επιπλέει στο νερό και μπορεί να περπατήσει κανείς επάνω του. - - Οψιανός + + Χρησιμοποιείται για την κατασκευή Οχυρών του Nether. Άτρωτο στις πύρινες σφαίρες των Ghast. - - Πυρσός + + Χρησιμοποιείται στα Οχυρά του Nether. - - Πυρσός (Κάρβουνο) + + Όταν πετάγεται, δείχνει την κατεύθυνση στην οποία βρίσκεται η Πύλη του End. Αν τοποθετήσετε δώδεκα τέτοια αντικείμενα σε Πλαίσια Πύλης End, θα ενεργοποιηθεί η Πύλη του End. - - Πυρσός (Ξυλοκάρβουνο) + + Χρησιμοποιείται στην παρασκευή φίλτρων. - - Φωτιά + + Μοιάζουν με τους Κύβοι Γρασιδιού, ιδανικοί για καλλιέργεια μανιταριών. - - Κλουβί Δημιουργίας Τεράτων + + Βρίσκεται στα Οχυρά του Nether και ρίχνει Φυτά Nether όταν σπάσει. - - Σκαλοπάτια από Βελανιδιά + + Ένας τύπος κύβου που βρίσκεται στο End. Είναι πολύ ανθεκτικός στις εκρήξεις, επομένως είναι πολύ χρήσιμος για την κατασκευή κτιρίων. - - Σεντούκι + + Αυτός ο κύβος δημιουργείται όταν νικηθεί ο Δράκος στο End. - - Σκόνη Κοκκινόπετρας + + Όταν πετάγεται, ρίχνει Σφαίρες Εμπειρίας που αυξάνουν τους πόντους εμπειρίας σας όταν συλλεχθούν. - - Ορυκτό Διαμάντι + + Επιτρέπει στους παίκτες να μαγεύουν Σπαθιά, Αξίνες, Τσεκούρια, Φτυάρια, Τόξα και Πανοπλίες με τους Πόντους Εμπειρίας που έχουν συλλέξει. - - Κύβος Διαμαντιού + + Μπορεί να ενεργοποιηθεί με δώδεκα Μάτια του Ender και επιτρέπει στον παίκτη να ταξιδέψει στη διάσταση του End. - - Ένας συμπαγής τρόπος αποθήκευσης Διαμαντιών. + + Χρησιμοποιείται για το σχηματισμό μιας Πύλης End. - - Τραπέζι Κατασκευής + + Όταν τροφοδοτείται με ρεύμα (με χρήση ενός κουμπιού, διακόπτη, πλάκας πίεσης, πυρσού από κοκκινόπετρα ή κοκκινόπετρα σε οποιονδήποτε συνδυασμό με τα παραπάνω), το έμβολο προεκτείνεται, αν έχει αρκετό χώρο, και σπρώχνει κύβους. - - Σοδειές + + Δημιουργείται με το ψήσιμο πηλού σε φούρνο. - - Αγρόκτημα + + Μπορεί να ψηθεί σε φούρνο για να μετατραπεί σε τούβλα. - - Φούρνος + + Όταν σπάσει, πέφτουν μπάλες πηλού που μπορούν να ψηθούν σε φούρνο για να μετατραπούν σε τούβλα. - - Πινακίδα + + Κόβεται με τσεκούρι και μπορεί να χρησιμοποιηθεί ως καύσιμο ή για την κατασκευή σανίδων. - - Ξύλινη Πόρτα + + Δημιουργείται σε φούρνο από λιωμένη άμμο. Μπορεί να χρησιμοποιηθεί για κατασκευή, αλλά θα σπάσει αν προσπαθήσετε να το εξορύξετε. - - Σκάλα + + Εξορύσσεται από την πέτρα με χρήση αξίνας. Μπορεί να χρησιμοποιηθεί για την κατασκευή καμινιού ή πέτρινων εργαλείων. - - Ράγα + + Ένας πιο βολικός τρόπος για να αποθηκεύετε χιονόμπαλες. - - Ηλεκτρική Ράγα + + Μπορεί να συνδυαστεί με ένα μπολ για τη δημιουργία σούπας. - - Ράγα Εντοπισμού + + Μπορεί να εξορυχτεί μόνο με αδαμάντινη αξίνα. Παράγεται κατά την ανάμιξη νερού και ακίνητης λάβας και χρησιμοποιείται για την κατασκευή πύλης. - - Πέτρινα Σκαλοπάτια + + Δημιουργεί τέρατα στον κόσμο. - - Μοχλός + + Μπορεί να σκαφτεί με αξίνα και δημιουργεί χιονόμπαλες. - - Πλάκα Πίεσης + + Όταν σπάσει, μερικές φορές παράγει σπόρους σιταριού. - - Σιδερένια Πόρτα + + Μπορεί να χρησιμοποιηθεί για τη δημιουργία βαφής. - - Ορυκτή Κοκκινόπετρα + + Συλλέγεται με φτυάρι. Μερικές φορές παράγει πυρόλιθο κατά την εξόρυξη. Επηρεάζεται από τη βαρύτητα, αν δεν υπάρχει από κάτω του κάποιο άλλο πλακίδιο. - - Πυρσός Κοκκινόπετρας + + Μπορεί να εξορυχτεί με αξίνα και παράγει κάρβουνο. - - Κουμπί + + Μπορεί να εξορυχτεί με αξίνα και παράγει λάπις λάζουλι. - - Χιόνι + + Μπορεί να εξορυχτεί με αξίνα από σίδερο και παράγει διαμάντια. - - Πάγος + + Χρησιμοποιείται ως διακοσμητικό. - - Κάκτος + + Μπορεί να εξορυχτεί με αξίνα από σίδερο ή καλύτερο υλικό και στη συνέχεια μπορείτε να το λιώσετε σε φούρνο για να δημιουργήσετε ράβδους χρυσού. - - Πηλός + + Μπορεί να εξορυχτεί με αξίνα από πέτρα ή καλύτερο υλικό και στη συνέχεια μπορείτε να το λιώσετε σε φούρνο για να δημιουργήσετε ράβδους σιδήρου. - - Ζαχαρωτό + + Μπορεί να εξορυχτεί με αξίνα από σίδερο ή καλύτερο υλικό και παράγει σκόνη κοκκινόπετρας. - - Jukebox + + Αυτό είναι άθραυστο. - - Φράκτης + + Βάζει φωτιά σε οτιδήποτε έρχεται σε επαφή μαζί του. Μπορεί να συλλεχθεί σε κουβά. - - Κολοκύθα + + Συλλέγεται με φτυάρι. Μπορεί να λιώσει σε φούρνο για να μετατραπεί σε γυαλί. Επηρεάζεται από τη βαρύτητα, αν δεν υπάρχει από κάτω του κάποιο άλλο πλακίδιο. - - Φανάρι από Κολοκύθα + + Μπορεί να εξορυχτεί με αξίνα και παράγει πέτρα επίστρωσης. - - Netherrack + + Συλλέγεται με φτυάρι. Μπορεί να χρησιμοποιηθεί για κατασκευές. - - Άμμος των Ψυχών + + Μπορεί να φυτευτεί και σε βάθος χρόνου θα εξελιχθεί σε δέντρο. - - Λαμψόπετρα + + Τοποθετείται στο έδαφος και μεταφέρει ηλεκτρικά φορτία. Όταν αναμιγνύεται με ένα φίλτρο, αυξάνει τη διάρκεια της επίδρασης. - - Πύλη + + Συλλέγεται από σκοτωμένες αγελάδες και μπορεί να χρησιμοποιηθεί για η δημιουργία πανοπλιών ή Βιβλίων. - - Ορυκτό Λάπις Λάζουλι + + Συλλέγεται από σκοτωμένα Slime και μπορεί να χρησιμοποιηθεί για την παρασκευή φίλτρων ή για τη δημιουργία Εμβόλων με Κόλλα. - - Κύβος Λάπις Λάζουλι + + Πέφτει τυχαία από κότες και μπορεί να χρησιμοποιηθεί για τη δημιουργία τροφίμων. - - Ένας συμπαγής τρόπος αποθήκευσης Λάπις Λάζουλι. + + Συλλέγεται με το σκάψιμο χαλικιού και μπορεί να χρησιμοποιηθεί για τη δημιουργία πυρόλιθου και χάλυβα. - - Διανομέας + + Αν το χρησιμοποιήσετε σε ένα γουρούνι, μπορείτε να το ιππεύσετε. Στη συνέχεια, μπορείτε να καθοδηγήσετε το γουρούνι με ένα Καρότο σε Ραβδί. - - Κύβος Νότας + + Συλλέγεται με το σκάψιμο χιονιού και μπορείτε να το πετάξετε. - - Κέικ + + Συλλέγεται με την εξόρυξη Λαμψόπετρας και μπορεί να χρησιμοποιηθεί για τη δημιουργία κύβου Λαμψόπετρας ή να αναμιχθεί σε ένα φίλτρο για να ενισχύσει την επίδρασή του. - - Κρεβάτι + + Όταν σπάει, βγάζει μερικές φορές ένα βλαστάρι που μπορεί να φυτευτεί και να γίνει δέντρο. - - Ιστός + + Βρίσκεται στα μπουντρούμια. Μπορεί να χρησιμοποιηθεί για κατασκευή και διακόσμηση. - - Ψηλό Γρασίδι + + Χρήση για την παραγωγή μαλλιού από πρόβατα και τη συγκομιδή κύβων φύλλων. - - Νεκρός Θάμνος + + Συλλέγεται από σκοτωμένους Σκελετούς. Μπορεί να χρησιμοποιηθεί για τη δημιουργία πάστας οστών. Μπορείτε να το ταΐσετε σε έναν λύκο για να τον δαμάσετε. - - Ημιαγωγός + + Συλλέγεται από Creeper που σκοτώθηκε από Σκελετούς. Μπορείτε να το ακούσετε σε ένα jukebox. - - Κλειδωμένο Σεντούκι + + Σβήνει τη φωτιά και ενισχύει την ανάπτυξη των σοδειών. Μπορεί να συλλεχθεί σε κουβά. - - Καταπακτή + + Συλλέγεται από σοδειές και μπορεί να χρησιμοποιηθεί για τη δημιουργία τροφίμων. - - Μαλλί (οποιοδήποτε χρώμα) + + Μπορεί να χρησιμοποιηθεί για τη δημιουργία ζάχαρης. - - Έμβολο + + Μπορεί να φορεθεί ως κράνος ή να συνδυαστεί με έναν πυρσό για τη δημιουργία ενός φαναριού από κολοκύθα. Είναι επίσης το βασικό συστατικό της Κολοκυθόπιτας. - - Έμβολο με Κόλλα + + Όταν ανάψει, καίει για πάντα. - - Κύβος Ασημόψαρου + + Όταν αναπτυχθεί πλήρως, παράγει σοδειές με σιτάρι. - - Πέτρινα Τούβλα + + Έδαφος που έχει προετοιμαστεί για τη φύτευση σπόρων. - - Τούβλα από Πέτρα με Βρύα + + Μπορεί να ψηθεί στο φούρνο για τη δημιουργία πράσινης βαφής. - - Ραγισμένα Πέτρινα Τούβλα + + Επιβραδύνει την κίνηση οποιουδήποτε πλάσματος περάσει από επάνω του. - - Τούβλα από Λαξευμένη Πέτρα + + Συλλέγεται από σκοτωμένες κότες και μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός βέλους. - - Μανιτάρι + + Συλλέγεται από σκοτωμένα Creeper και μπορεί να χρησιμοποιηθεί για τη δημιουργία TNT ή ως συστατικό για την παρασκευή φίλτρων. - - Μανιτάρι + + Μπορεί να φυτευτεί σε ένα αγρόκτημα για την καλλιέργεια σοδειών. Βεβαιωθείτε ότι υπάρχει αρκετό φως για να αναπτυχθούν οι σπόροι! - - Σιδερένια Κάγκελα + + Αν σταθείτε στην πύλη, μπορείτε να ταξιδεύετε από τον Overworld στο Nether. - - Γυάλινο Τζάμι + + Χρησιμοποιείται ως καύσιμο για ένα φούρνο ή μπορεί να χρησιμοποιηθεί για τη δημιουργία πυρσού. - - Καρπούζι + + Συλλέγεται από σκοτωμένες αράχνες και μπορεί να χρησιμοποιηθεί για τη δημιουργία Τόξου ή Καλαμιού Ψαρέματος. Μπορεί να τοποθετηθεί στο έδαφος για τη δημιουργία Σύρματος Ενεργοποίησης. - - Μίσχος Κολοκύθας + + Ρίχνει μαλλί όταν κουρευτεί (αν δεν έχει κουρευτεί ήδη). Μπορείτε να το βάψετε για να αλλάξετε χρώμα στο μαλλί του. - - Μίσχος Καρπουζιού + + Επιχειρηματικός Σχεδιασμός - - Κλήματα + + Διευθυντής Χαρτοφυλακίου - - Πύλη Φράκτη + + Υπεύθυνος Προϊόντος - - Σκαλοπάτια από Τούβλα + + Ομάδα Ανάπτυξης - - Σκαλοπ. Πέτρινων Τούβλων + + Διαχείριση Κυκλοφορίας - - Πέτρα Ασημόψαρου + + Διευθυντής Έκδοσης XBLA - - Πέτρα Επίστρωσης Ασημόψαρου + + Μάρκετινγκ - - Πέτρινο Τούβλο Ασημόψαρου + + Ομάδα Μετάφρασης – Ασία - - Μυκήλιο + + Ομάδα Έρευνας Χρηστών - - Νούφαρο + + Κεντρικές Ομάδες MGS - - Τούβλο Nether + + Διαχειριστής Κοινότητας - - Φράκτης από Τούβλα Nether + + Ομάδα Μετάφρασης - Ευρώπη - - Σκαλοπάτια Τούβλων Nether + + Ομάδα Μετάφρασης - Redmond - - Φυτό Nether + + Ομάδα Σχεδίασης - - Τραπέζι Μαγέματος + + Διευθυντής Διασκέδασης - - Βάση Παρασκευής + + Μουσική και Ήχοι - - Καζάνι + + Προγραμματισμός - - Πύλη End + + Βασικός Αρχιτέκτονας - - Πλαίσιο Πύλης End + + Καλλιτεχνική Διεύθυνση - - Πέτρα End + + Δημιουργός Παιχνιδιού - - Αυγό Δράκου + + Γραφικά - - Χαμόκλαδο + + Παραγωγός - - Φτέρη + + Επικεφαλής Δοκιμαστών - - Σκαλοπάτια από Αμμόλιθο + + Βασικός Δοκιμαστής - - Σκαλοπάτια από Έλατο + + Ποιοτικός Έλεγχος - - Σκαλοπάτια από Σημύδα + + Διευθυντής Παραγωγής - - Σκαλοπάτια Ξύλου Ζούγκλας + + Επικεφαλής Παραγωγής - - Φανάρι Κοκκινόπετρας + + Δοκιμαστής Αποδοχής Οροσήμων - - Κακάο + + Σιδερένιο Φτυάρι - - Κρανίο + + Αδαμάντινο Φτυάρι - - Τρέχουσες Ρυθμίσεις Ελέγχου + + Χρυσό Φτυάρι - - Διάταξη + + Χρυσό Σπαθί - - Κίνηση/Τρέξιμο + + Ξύλινο Φτυάρι - - Κάμερα + + Πέτρινο Φτυάρι - - Παύση + + Ξύλινη Αξίνα - - Άλμα + + Χρυσή Αξίνα - - Άλμα/Αύξηση Υψόμετρου + + Ξύλινο Τσεκούρι - - Απόθεμα + + Πέτρινο Τσεκούρι - - Εναλλαγή Αντικειμένων στο Χέρι + + Πέτρινη Αξίνα - - Ενέργεια + + Σιδερένια Αξίνα - - Χρήση + + Αδαμάντινη Αξίνα - - Κατασκευή + + Αδαμάντινο Σπαθί - - Ξεσκαρτάρισμα + + SDET - - Αθόρυβη Κίνηση + + Αξιολόγηση Δοκιμής Συστήματος Έργου - - Αθόρυβη Κίνηση/Μείωση Υψόμετρου + + Επιπλέον Αξιολόγηση Δοκιμής Συστήματος - - Αλλαγή Λειτουργίας Κάμερας + + Ειδικές Ευχαριστίες - - Παίκτες/Πρόσκληση + + Συντονιστής Δοκιμών - - Κίνηση (Κατά την Πτήση) + + Υπεύθυνος Δοκιμών - - Διάταξη 1 + + Συνεργάτες Δοκιμών - - Διάταξη 2 + + Ξύλινο Σπαθί - - Διάταξη 3 + + Πέτρινο Σπαθί - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Σιδερένιο Σπαθί - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Jon Kågström - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Tobias Möllstam - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Risë Lugo - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Προγραμματιστής - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Εκτοξεύει πύρινες σφαίρες εναντίον σας που εκρήγνυνται όταν σας ακουμπήσουν. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Slime - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Όταν δέχεται ζημιά, χωρίζεται σε μικρότερα Slime. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Ζόμπι Γουρουνάνθρωπος - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Αρχικά ήρεμος, αλλά επιτίθεται μαζικά, αν επιτεθείτε σε κάποιον. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Ghast - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Enderman - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Αράχνη των Σπηλαίων - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Το δάγκωμά της είναι δηλητηριώδες. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Mooshroom - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Σας επιτίθενται αν τους κοιτάξετε. Μπορούν επίσης να μετακινούν κύβους. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Ασημόψαρα - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Προσελκύουν τα Ασημόψαρα που κρύβονται στη γύρω περιοχή όταν τους επιτίθεστε. Κρύβονται σε κύβους πέτρας. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Σας επιτίθεται όταν βρίσκεστε κοντά. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Ρίχνει χοιρινές μπριζόλες όταν σκοτωθεί. Μπορείτε να το ιππεύσετε, αν χρησιμοποιήσετε μια σέλα. - - {*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*} προς τα εμπρός, ο χαρακτήρας θα συνεχίσει να τρέχει, εκτός και αν εξαντληθεί ο χρόνος σπριντ ή το φαγητό. + + Creeper - - Πατήστε{*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*} + + Το Υπόλοιπο Εργατικό Δυναμικό της Mojang - - Πολλές διαδικασίες δημιουργίας μπορεί να αποτελούνται από πολλά βήματα. Τώρα που έχετε μερικές σανίδες, μπορείτε να δημιουργήσετε περισσότερα αντικείμενα. Κατασκευάστε ένα τραπέζι δημιουργίας.{*CraftingTableIcon*} + + Καλλιτεχνική Σχεδίαση - - Για να συλλέξετε πιο γρήγορα τους κύβους που χρειάζεστε, μπορείτε να δημιουργήσετε τα κατάλληλα εργαλεία για κάθε εργασία. Ορισμένα εργαλεία απαιτούν λαβές από ραβδιά. Δημιουργήστε τώρα μερικά ραβδιά.{*SticksIcon*} + + Υπολογισμοί και Στατιστικά Στοιχεία - - Χρησιμοποιήστε το{*CONTROLLER_ACTION_LEFT_SCROLL*} και το{*CONTROLLER_ACTION_RIGHT_SCROLL*} για να αλλάξετε το αντικείμενο που κρατάτε. + + Συντονιστής Εχθρών - - Πατήστε το{*CONTROLLER_ACTION_USE*} για να χρησιμοποιήσετε και να τοποθετήσετε αντικείμενα. Μπορείτε να συλλέξετε και πάλι τα αντικείμενα που έχετε τοποθετήσει, αν τα εξορύξετε με το κατάλληλο εργαλείο. + + Επικεφαλής Προγραμματισμού Minecraft για PC - - Επιλέξτε το τραπέζι κατασκευής, σημαδέψτε με το σταυρόνημα το σημείο που θέλετε και πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε το τραπέζι κατασκευής. + + Υποστήριξη Πελατών - - Σημαδέψτε το τραπέζι κατασκευής με το σταυρόνημα και πατήστε{*CONTROLLER_ACTION_USE*} για να το ανοίξετε. + + DJ Γραφείου - - Με το φτυάρι, μπορείτε να σκάψετε πιο γρήγορα μαλακούς κύβους, όπως το χώμα και το χιόνι. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα και αντέχουν περισσότερο. Δημιουργήστε ένα ξύλινο φτυάρι.{*WoodenShovelIcon*} + + Σχεδιαστής/Προγραμματιστής Minecraft - Pocket Edition - - Με το τσεκούρι, μπορείτε να κόψετε πιο γρήγορα δέντρα και ξύλινα πλακίδια. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα και αντέχουν περισσότερο. Δημιουργήστε ένα ξύλινο τσεκούρι.{*WoodenHatchetIcon*} + + Προγραμματιστής-Νίντζα - - Με την αξίνα, μπορείτε να σκάψετε πιο γρήγορα σκληρούς κύβους, όπως πέτρα και μεταλλεύματα. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα, αντέχουν περισσότερο και σας επιτρέπουν να εξορύσσετε πιο σκληρά υλικά. Δημιουργήστε μια ξύλινη αξίνα.{*WoodenPickaxeIcon*} + + Διευθύνων Σύμβουλος - - Ανοίξτε το δοχείο + + Υπάλληλος Γραφείου - - - Η νύχτα μπορεί να φτάσει πριν το καταλάβατε, για αυτό δεν πρέπει να βρίσκεστε έξω αν δεν έχετε προετοιμαστεί κατάλληλα. Μπορείτε να δημιουργήσετε πανοπλία και όπλα, αλλά το πιο σημαντικό είναι να έχετε ένα ασφαλές καταφύγιο. - + + Κίνηση Εκρηκτικών - - - Εδώ κοντά βρίσκεται ένα εγκαταλελειμμένο καταφύγιο Μεταλλωρύχων που μπορείτε να επισκευάσετε για να προστατευτείτε τη νύχτα. - + + Ένας πελώριος μαύρος δράκος που βρίσκεται στο End. - - - Θα πρέπει να συλλέξετε τα υλικά που χρειάζονται για την επισκευή του καταφυγίου. Μπορείτε να κατασκευάσετε τοίχους και οροφή από οποιονδήποτε τύπο πλακιδίου, αλλά θα πρέπει επίσης να δημιουργήσετε μια πόρτα, μερικά παράθυρα και κάποια πηγή φωτισμού. - + + Blaze - - Χρησιμοποιήστε την αξίνα σας για να εξορύξετε μερικούς κύβους πέτρας. Όταν εξορύσετε κύβους πέτρας, αυτοί παράγουν πέτρα επίστρωσης. Αν συλλέξετε 8 κύβους πέτρας επίστρωσης, μπορείτε να κατασκευάσετε ένα φούρνο. Ενδεχομένως να πρέπει να σκάψετε λίγο στο χώμα για να βρείτε πέτρα, επομένως θα χρειαστείτε το φτυάρι σας.{*StoneIcon*} + + Εχθροί που κατοικούν στο Nether, συνήθως στα Οχυρά Nether. Ρίχνουν Ράβδους Blaze όταν σκοτωθούν. - - Έχετε συλλέξει αρκετή πέτρα επίστρωσης για να κατασκευάσετε ένα φούρνο. Δημιουργήστε τον με το τραπέζι κατασκευής. + + Γκόλεμ του Χιονιού - - Πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε το φούρνο στον κόσμο και ανοίξτε τον. + + Το Γκόλεμ του Χιονιού μπορεί να δημιουργηθεί από παίκτες συνδυάζοντας κύβους χιονιού και μια κολοκύθα. Πετάει χιονόμπαλες στους εχθρούς του δημιουργού του. - - Χρησιμοποιήστε το φούρνο για να δημιουργήσετε ξυλοκάρβουνο. Ενώ περιμένετε, γιατί δεν συγκεντρώνετε περισσότερα υλικά για να ολοκληρώσετε το καταφύγιο; + + Δράκος του Ender - - Χρησιμοποιήστε το φούρνο για να δημιουργήσετε γυαλί. Ενώ περιμένετε, γιατί δεν συγκεντρώνετε περισσότερα υλικά για να ολοκληρώσετε το καταφύγιο; + + Κύβος Μάγματος - - Τα σωστά καταφύγια διαθέτουν πόρτες που σας επιτρέπουν να μπαινοβγαίνετε, χωρίς να πρέπει να σκάβετε και να ξαναχτίζετε τους τοίχους. Δημιουργήστε μια ξύλινη πόρτα τώρα.{*WoodenDoorIcon*} + + Κατοικούν στις Ζούγκλες. Μπορείτε να τις δαμάσετε, αν τις ταΐσετε Ωμό Ψάρι. Θα πρέπει πρώτα να αφήσετε την Αιλουροπάρδαλις να σας πλησιάσει, καθώς οι απότομες κινήσεις τον τρομάζουν. - - Πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε την πόρτα. Μπορείτε να χρησιμοποιήσετε το {*CONTROLLER_ACTION_USE*} για να ανοίξετε και να κλείσετε τις ξύλινες πόρτες που βρίσκετε στον κόσμο. + + Σιδερένιο Γκόλεμ - - Τη νύχτα το σκοτάδι είναι πολύ πυκνό, επομένως θα χρειαστείτε κάποια πηγή φωτισμού στο καταφύγιο για να μπορείτε να βλέπετε. Δημιουργήστε έναν πυρσό από ραβδιά και ξυλοκάρβουνο στο περιβάλλον χρήστη κατασκευής.{*TorchIcon*} + + Εμφανίζονται σε Χωριά για να τα προστατεύσουν και μπορούν να δημιουργηθούν συνδυάζοντας Σιδερένιους Κύβους και Κολοκύθες. - - - Έχετε ολοκληρώσει το πρώτο μέρος του εκπαιδευτικού οδηγού. - + + Κατοικούν στο Nether. Όπως και τα Slime, όταν σκοτωθούν σπάνε σε μικρότερες εκδόσεις του εαυτού τους. - - - {*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*} για να συλλέξετε τα μισά. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΦΟΥΡΝΟΣ{*ETW*}{*B*}{*B*} +Ο φούρνος επιτρέπει την αλλαγή αντικειμένων φλογίζοντάς τα. Για παράδειγμα, μπορείτε να μετατρέψετε κομμάτια σιδήρου σε ράβδους σιδήρου στο φούρνο.{*B*}{*B*}< +Τοποθετήστε το φούρνο στον κόσμο σας και πατήστε{*CONTROLLER_ACTION_USE*} για να τον χρησιμοποιήσετε.{*B*}{*B*} +Πρέπει να βάλετε καύσιμο στο κάτω μέρος του φούρνου και στη συνέχεια, το αντικείμενο που θέλετε να φλογίσετε στο επάνω μέρος. Ο φούρνος τότε θα ανάψει και θα ξεκινήσει να λειτουργεί.{*B*}{*B*} +Όταν τα αντικείμενά σας φλογιστούν, μπορείτε να τα μετακινήσετε από την εξωτερική περιοχή στο απόθεμά σας.{*B*}{*B*} +Εάν το αντικείμενο πάνω από το οποίο βρίσκεστε είναι συστατικό ή καύσιμο για το φούρνο, θα εμφανιστούν επεξηγήσεις που θα επιτρέπουν τη γρήγορη μετακίνηση του στο φούρνο. + - - - Μετακινήστε αυτό το αντικείμενο με το δείκτη σε μια άλλη θέση στο απόθεμα και τοποθετήστε το με το {*CONTROLLER_VK_A*}. - Όταν έχετε πολλά αντικείμενα στο δείκτη, χρησιμοποιήστε το{*CONTROLLER_VK_A*} για να τα τοποθετήσετε όλα ή το{*CONTROLLER_VK_X*} για να τοποθετήσετε μόνο ένα. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΔΙΑΝΟΜΕΑΣ{*ETW*}{*B*}{*B*} +Ο Διανομέας χρησιμοποιείτε για την εξαγωγή αντικειμένων. Θα πρέπει να τοποθετήσετε ένα διακόπτη, για παράδειγμα ένα μοχλό, δίπλα στο διανομέα για να τον ενεργοποιήσετε.{*B*}{*B*} +Για να γεμίσετε το διανομέα με αντικείμενα πιέστε{*CONTROLLER_ACTION_USE*} και στη συνέχεια μετακινήστε τα αντικείμενα που θέλετε από το απόθεμά σας στο διανομέα.{*B*}{*B*} +Τώρα όταν θα χρησιμοποιήσετε το διακόπτη, ο διανομέας θα εξάγει ένα αντικείμενο. + - - - Εάν μετακινήσετε το δείκτη έξω από τα όρια του περιβάλλοντος χρήστη ενώ έχετε ένα αντικείμενο στο δείκτη, μπορείτε να ξεσκαρτάρετε το αντικείμενο. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΠΑΡΑΣΚΕΥΗ ΦΙΛΤΡΩΝ{*ETW*}{*B*}{*B*} +Η παρασκευή φίλτρων απαιτεί μια Βάση Παρασκευής, η οποία μπορεί να δημιουργηθεί σε ένα τραπέζι κατασκευής. Κάθε φίλτρο χρειάζεται ένα μπουκάλι νερό, το οποίο δημιουργείται γεμίζοντας ένα Γυάλινο Μπουκάλι με νερό από ένα Καζάνι ή μια πηγή με νερό.{*B*} +Η Βάση Παρασκευής φίλτρων έχει τρεις υποδοχές για μπουκάλια, έτσι μπορείτε να παρασκευάσετε τρία φίλτρα ταυτόχρονα. Ένα συστατικό μπορεί να χρησιμοποιηθεί και για τα τρία μπουκάλια, έτσι να παρασκευάζετε πάντα τρία φίλτρα ταυτόχρονα για να χρησιμοποιείται τους πόρους σας με τον καλύτερο τρόπο.{*B*} +Εάν βάλετε ένα συστατικό φίλτρου στην επάνω θέση της Βάσης Παρασκευής, θα δημιουργηθεί ένα βασικό φίλτρο μετά από σύντομο χρονικό διάστημα. Αυτό δεν έχει κάποια επίδραση από μόνο του, αλλά εάν παρασκευάσετε ένα άλλο συστατικό με αυτό το βασικό φίλτρο θα δημιουργηθεί ένα φίλτρο με επίδραση.{*B*} +Μόλις παρασκευάσετε αυτό το φίλτρο, μπορείτε να προσθέσετε ένα τρίτο συστατικό έτσι ώστε η επίδραση να διαρκεί περισσότερο (με χρήση Σκόνης Κοκκινόπετρας), να είναι πιο έντονη (με χρήση Σκόνης Λαμψόπετρας) ή να μετατραπεί σε βλαβερό φίλτρο (με χρήση Ζυμωμένου Ματιού Αράχνης).{*B*} +Μπορείτε επίσης να προσθέσετε πυρίτιδα σε οποιοδήποτε φίλτρο για να το μετατρέψετε σε Φίλτρο Εκτόξευσης, το οποίο μπορείτε να πετάξετε στη συνέχεια. Το Φίλτρο Εκτόξευσης που θα πετάξετε θα εφαρμόσει την επίδραση του φίλτρου πάνω στην περιοχή στην οποία θα προσγειωθεί.{*B*} + +Τα βασικά συστατικά για φίλτρα είναι τα εξής :-{*B*}{*B*} +* {*T2*}Φυτό Nether{*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*} + +Θα πρέπει να πειραματιστείτε με τους συνδυασμούς των συστατικών για να βρείτε όλα τα διαφορετικά φίλτρα που μπορείτε να παρασκευάσετε. - - Εάν θέλετε περισσότερες πληροφορίες σχετικά με ένα αντικείμενο, μετακινήστε το δείκτη επάνω από το αντικείμενο και πατήστε {*CONTROLLER_VK_BACK*}. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΜΕΓΑΛΟ ΣΕΝΤΟΥΚΙ{*ETW*}{*B*}{*B*} +Εάν τοποθετήσετε δύο σεντούκια το ένα δίπλα στο άλλο θα συνδυαστούν για να σχηματίσουν ένα Μεγάλο Σεντούκι. Αυτό μπορεί να αποθηκεύσει ακόμη περισσότερα αντικείμενα.{*B*}{*B*} +Χρησιμοποιείται όπως ένα κανονικό σεντούκι. + - - - Πατήστε{*CONTROLLER_VK_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*} +Η κατασκευή σε τραπέζι λειτουργεί όπως και η βασική κατασκευή, αλλά έχετε μεγαλύτερη περιοχή κατασκευής και μεγαλύτερη ποικιλία αντικειμένων που μπορείτε να κατασκευάσετε. + - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε το απόθεμα λειτουργίας δημιουργίας. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΜΑΓΕΜΑ{*ETW*}{*B*}{*B*} +Οι Πόντοι Εμπειρίας που συλλέγονται μετά το θάνατο ενός mob ή κατά την εξόρυξη ορισμένων κύβων ή το λιώσιμό τους σε φούρνο, μπορούν να χρησιμοποιηθούν για το μάγεμα ορισμένων εργαλείων, όπλων, πανοπλίας και βιβλίων.{*B*} +Όταν τοποθετήσετε ένα Ξίφος, Τόξο, Τσεκούρι, Αξίνα, Φτυάρι, Πανοπλία ή Βιβλίο στην υποδοχή κάτω από το βιβλίο στο Τραπέζι Μαγέματος, τα τρία κουμπιά στα δεξιά της υποδοχής θα εμφανίσουν ορισμένα μαγέματα και το κόστος τους σε Επίπεδο Εμπειρίας.{*B*} +Εάν το Επίπεδο Εμπειρίας σας δεν επαρκεί για να χρησιμοποιήσετε κάποια από αυτά, θα εμφανιστεί το κόστος με κόκκινο χρώμα, διαφορετικά θα εμφανιστεί με πράσινο.{*B*}{*B*} +Το πραγματικό μάγεμα που εφαρμόζεται επιλέγεται τυχαία βάσει του κόστους που εμφανίζεται.{*B*}{*B*} +Εάν το Τραπέζι Μαγέματος περιβάλλεται από Ράφια Βιβλιοθήκης (έως 15 Ράφια Βιβλιοθήκης), με κενό ενός κύβου ανάμεσα στη Βιβλιοθήκη και το Τραπέζι Μαγέματος, η δραστικότητα του μαγέματος θα αυξηθεί και θα εμφανιστούν απόκρυφα ιερογλυφικά μέσα από το βιβλίο που βρίσκεται πάνω στο Τραπέζι Μαγέματος.{*B*}{*B*} +Μπορείτε να βρείτε όλα τα συστατικά για ένα Τραπέζι Μαγέματος στα χωριά ενός κόσμου ή κάνοντας εξόρυξη και καλλιεργώντας τον κόσμο.{*B*}{*B*} +Τα Μαγεμένα Βιβλία χρησιμοποιούνται στο Αμόνι για να μαγέψουν αντικείμενα. Αυτό σας δίνει περισσότερο έλεγχο σχετικά με τα μαγέματα που θα θέλατε στα αντικείμενά σας.{*B*} + - - - Χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να μετακινήσετε το δείκτη. - Στη λίστα αντικειμένων, χρησιμοποιήστε το{*CONTROLLER_VK_A*} για να συλλέξετε ένα αντικείμενο κάτω από το δείκτη και χρησιμοποιήστε το{*CONTROLLER_VK_Y*} για να συλλέξετε μια στοίβα αυτού του αντικειμένου. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΑΠΑΓΟΡΕΥΣΗ ΕΠΙΠΕΔΩΝ{*ETW*}{*B*}{*B*} +Εάν εντοπίσετε προσβλητικό περιεχόμενο σε ένα επίπεδο που παίζετε, μπορείτε να επιλέξετε να προσθέσετε το επίπεδο αυτό στη λίστα Απαγορευμένων Επιπέδων σας. +Εάν θέλετε να το κάνετε αυτό, ανοίξτε το μενού "Παύση" και στη συνέχεια πατήστε{*CONTROLLER_VK_RB*} για να επιλέξετε την επεξήγηση του Επιπέδου Απαγόρευσης. +Όταν προσπαθήσετε στο μέλλον να συμμετέχετε ξανά σε αυτό το επίπεδο, θα ειδοποιηθείτε ότι το επίπεδο βρίσκεται στη λίστα Αποκλεισμένων Επιπέδων και θα σας δοθεί η επιλογή να το αφαιρέσετε από τη λίστα και να συνεχίσετε στο επίπεδο ή να αποχωρήσετε. - - - Ο δείκτης θα μετακινηθεί αυτόματα σε μια θέση στη γραμμή χρήσης. Μπορείτε να αφήσετε το αντικείμενο χρησιμοποιώντας το{*CONTROLLER_VK_A*}. Μόλις τοποθετήσετε το αντικείμενο, ο δείκτης θα επιστρέψει στη λίστα αντικειμένων για να επιλέξετε ένα άλλο αντικείμενο. - + + {*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*} + Όταν ενεργοποιηθεί αυτή η επιλογή, θα δημιουργηθεί ένας εντελώς επίπεδος κόσμος στον Overworld και στο Nether.{*B*}{*B*} + + {*T2*}Έξτρα Σεντούκι{*ETW*}{*B*} + Όταν ενεργοποιηθεί αυτή η επιλογή, θα δημιουργηθεί ένα σεντούκι με χρήσιμα αντικείμενα κοντά στο σημείο επαναφοράς του παίκτη.{*B*}{*B*} + + {*T2*}Επαναφορά Nether{*ETW*}{*B*} + Όταν ενεργοποιηθεί αυτή η επιλογή, το Nether θα δημιουργηθεί ξανά. Αυτό είναι χρήσιμο εάν έχετε πραγματοποιήσει παλαιότερη αποθήκευση κατά την οποία δεν υπήρχαν τα Κάστρα του Nether.{*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*} +{*KICK_PLAYER_DESCRIPTION*}{*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*} + Αυτή η δυνατότητα επιτρέπει στον παίκτη να μετακινεί παίκτες ή τον εαυτό του με άλλους παίκτες στον κόσμο. + - - - Εάν μετακινήσετε το δείκτη έξω από τα όρια του περιβάλλοντος χρήστη έχοντας ένα αντικείμενο στο δείκτη, μπορείτε να ξεσκαρτάρετε το αντικείμενο στον κόσμο. Για να εκκαθαρίσετε όλα τα αντικείμενα στην μπάρα γρήγορης επιλογής, πατήστε{*CONTROLLER_VK_X*}. - + + Επόμενη Σελίδα - - - Πραγματοποιήστε κύλιση στις καρτέλες Τύπου Ομάδας στην επάνω πλευρά χρησιμοποιώντας το{*CONTROLLER_VK_LB*} και το{*CONTROLLER_VK_RB*} για να επιλέξετε τον τύπο ομάδας του αντικειμένου που θέλετε να επιλέξετε. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΚΤΗΝΟΤΡΟΦΙΑ{*ETW*}{*B*}{*B*} +Εάν θέλετε όλα τα ζώα σας να βρίσκονται σε ένα μέρος, χτίστε ένα περιφραγμένο χώρο με λιγότερους από 20x20 κύβους και τοποθετήστε τα ζώα σας μέσα σε αυτόν. Αυτό σας εξασφαλίζει ότι θα βρίσκονται εκεί όταν επιστρέψετε για να τα δείτε. + - - - Εάν θέλετε περισσότερες πληροφορίες σχετικά με ένα αντικείμενο, μετακινήστε το δείκτη επάνω από το αντικείμενο και πατήστε{*CONTROLLER_VK_BACK*} . - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΕΚΤΡΟΦΗ ΖΩΩΝ{*ETW*}{*B*}{*B*} +Τα ζώα του Minecraft μπορούν να εκτραφούν και να γεννήσουν μωρά!{*B*} +Για να εκτραφούν τα ζώα, θα πρέπει να τα ταΐζετε με την κατάλληλη τροφή για να ενεργοποιηθεί η "Λειτουργία Αγάπης".{*B*} +Δώστε Σιτάρι στην αγελάδα, στο mooshroom ή στα πρόβατα, Καρότα στο γουρούνι, Σπόρους Σιταριού ή Φυτά Nether στην κότα ή οποιοδήποτε είδος κρέατος στον λύκο και θα αρχίσουν να αναζητούν κάποιο άλλο ζώο ίδιου είδους που να βρίσκεται κοντά τους το οποίο βρίσκεται επίσης σε "Λειτουργία Αγάπης".{*B*} +Όταν συναντιούνται δύο ζώα ίδιου είδους και βρίσκονται και τα δύο σε "Λειτουργία Αγάπης", θα φιληθούν για λίγα δευτερόλεπτα και στη συνέχεια θα εμφανιστεί το μωρό τους. Το μωρό των ζώων θα ακολουθεί τους γονείς του για λίγο μέχρι να μεγαλώσει και να γίνει και το ίδιο μεγάλο ζώο.{*B*} +Αφού βρεθεί σε "Λειτουργία Αγάπης", το ζώο δεν θα μπορεί να εισέλθει ξανά σε αυτή την κατάσταση για περίπου πέντε λεπτά.{*B*} +Υπάρχει ένα όριο στον αριθμό των ζώων που μπορούν να υπάρχουν σε ένα κόσμο και έτσι ίσως διαπιστώσετε ότι τα ζώα δεν θα αναπαράγονται όταν υπάρχουν πολλά από αυτά. - - - Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το απόθεμα της λειτουργίας δημιουργίας. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΠΥΛΗ NETHER{*ETW*}{*B*}{*B*} +Η Πύλη Nether επιτρέπει στον παίκτη να ταξιδεύει ανάμεσα στον Overworld και στον κόσμο του Nether. Ο κόσμος του Nether μπορεί να χρησιμοποιηθεί για να ταξιδεύετε γρήγορα στον Overworld, εάν διανύσετε απόσταση ενός κύβου στο Nether, αυτό ισοδυναμεί με 3 κύβους στον Overworld, έτσι όταν δημιουργείτε μια πύλη +στον κόσμο του Nether και βγείτε από αυτήν, θα βρίσκεστε 3 φορές πιο μακριά από το σημείο εισόδου σας.{*B*}{*B*} +Χρειάζονται τουλάχιστον 10 κύβοι Οψιανού για να χτίσετε την πύλη και η πύλη πρέπει να έχει ύψος 5 κύβους, πλάτος 4 κύβους και βάθος 1 κύβους. Μόλις χτίσετε το πλαίσιο της πύλης, πρέπει να βάλετε φωτιά στο χώρο που βρίσκεται μέσα στο πλαίσιο για να την ενεργοποιήσετε. Αυτό μπορεί να γίνει χρησιμοποιώντας το αντικείμενο Πυρόλιθος και Χάλυβας ή το αντικείμενο Μπάλα Φωτιάς.{*B*}{*B*} +Για παραδείγματα κατασκευής πυλών, δείτε την εικόνα στα δεξιά. + - - - Αυτό είναι το περιβάλλον χρήστη κατασκευής. Αυτή η οθόνη σάς επιτρέπει να συνδυάζετε τα αντικείμενα που έχετε συλλέξει για να κατασκευάσετε νέα αντικείμενα. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΣΕΝΤΟΥΚΙ{*ETW*}{*B*}{*B*} +Αφού κατασκευάσετε ένα σεντούκι, μπορείτε να το τοποθετήσετε στον κόσμο και στη συνέχεια να το χρησιμοποιήσετε με{*CONTROLLER_ACTION_USE*} για να αποθηκεύσετε αντικείμενα από το απόθεμά σας.{*B*}{*B*} +Χρησιμοποιήστε το δείκτη για να μετακινήσετε αντικείμενα από το απόθεμα στο σεντούκι και αντίστροφα.{*B*}{*B*} +Τα αντικείμενα που βρίσκονται στο σεντούκι θα αποθηκευτούν εκεί για να τα μεταφέρετε ξανά πίσω στο απόθεμά σας αργότερα. + - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να κατασκευάσετε αντικείμενα. - + + Είχες παρευρεθεί στη Minecon; - - {*B*}
 Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστεί η περιγραφή του αντικειμένου. - + + Κανείς στη Mojang δεν έχει δει ποτέ το πρόσωπο του junkboy. - - {*B*}
 Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστούν τα συστατικά που απαιτούνται για την κατασκευή του τρέχοντος αντικειμένου. - + + Γνωρίζατε ότι υπάρχει Minecraft Wiki; - - {*B*}
 Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστεί ξανά το απόθεμα. - + + Μην κοιτάτε απευθείας τα έντομα. - - - Πραγματοποιήστε κύλιση στις καρτέλες Τύπου Ομάδας στην επάνω πλευρά χρησιμοποιώντας το{*CONTROLLER_VK_LB*} και το{*CONTROLLER_VK_RB*} για να επιλέξετε τον τύπο ομάδας του αντικειμένου που θέλετε να κατασκευάσετε και έπειτα χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να επιλέξετε το αντικείμενο που θα κατασκευάσετε. - + + Οι Creeper γεννήθηκαν από ένα σφάλμα στον κώδικα. - - - Η περιοχή κατασκευής εμφανίζει τα αντικείμενα που χρειάζεστε για να κατασκευάσετε το νέο αντικείμενο. Πατήστε{*CONTROLLER_VK_A*} για να κατασκευάσετε το αντικείμενο και να το τοποθετήσετε στο απόθεμά σας. - + + Είναι κότα ή πάπια; - - - Μπορείτε να κατασκευάσετε μια μεγαλύτερη συλλογή αντικειμένων χρησιμοποιώντας ένα τραπέζι κατασκευής. Η κατασκευή σε τραπέζι λειτουργεί όπως και η βασική κατασκευή, αλλά έχετε μεγαλύτερη επιφάνεια κατασκευής που καθιστά δυνατή την πραγματοποίηση περισσότερων συνδυασμών συστατικών. - + + Το νέο γραφείο της Mojang είναι τέλειο! - - - Στο κάτω δεξιό μέρος του περιβάλλοντος χρήστη κατασκευής, εμφανίζεται το απόθεμά σας. Σε αυτήν την περιοχή, μπορεί επίσης να εμφανίζεται μια περιγραφή του τρέχοντος επιλεγμένου στοιχείου, καθώς και τα συστατικά που απαιτούνται για την κατασκευή του. - + + {*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*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : HUD{*ETW*}{*B*}{*B*} +Το HUD εμφανίζει πληροφορίες σχετικά με την κατάστασή σας, την υγεία, το οξυγόνο που απομένει όταν βρίσκεστε κάτω από το νερό, το επίπεδο πείνας (πρέπει να φάτε για να το συμπληρώσετε) και την πανοπλία σας εάν φοράτε. +Αν χάσετε ζωή, αλλά έχετε μπάρα φαγητού με 9 ή περισσότερα{*ICON_SHANK_01*}, η ζωή σας θα αναπληρωθεί αυτόματα. Τρώγοντας φαγητό, θα συμπληρώσετε τη μπάρα φαγητού σας.{*B*} +Επίσης εδώ εμφανίζεται και η Μπάρα Εμπειρίας με μια αριθμητική τιμή που υποδεικνύει το Επίπεδο Εμπειρίας σας και τη μπάρα που δείχνει τους Πόντους Εμπειρίας που απαιτούνται για την αύξηση του Επιπέδου Εμπειρίας σας. +Οι Πόντοι Εμπειρίας αποκτούνται με τη συλλογή των Σφαιρών Εμπειρίας που πέφτουν από τα mob όταν πεθαίνουν, από την εξόρυξη συγκεκριμένων τύπων κύβων, την εκτροφή ζώων, το ψάρεμα και το λιώσιμο μεταλλευμάτων σε φούρνο.{*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*} για να τοποθετήσετε μόνο ένα.{*B*}{*B*} +Εάν το αντικείμενο πάνω από το οποίο βρίσκεστε είναι πανοπλία, θα εμφανιστεί μια επεξήγηση του εργαλείου που θα επιτρέψει τη γρήγορη μετακίνησή του στη σωστή υποδοχή πανοπλίας στο απόθεμα.{*B*}{*B*} +Μπορείτε να αλλάξετε το χρώμα της Δερμάτινης Πανοπλίας σας βάφοντάς τη. Για να το κάνετε αυτό, πηγαίνετε στο μενού του αποθέματος, κρατήστε τη βαφή στο δείκτη σας και στη συνέχεια πατήστε το{*CONTROLLER_VK_X*} ενώ ο δείκτης βρίσκεται πάνω από το αντικείμενο που θέλετε να βάψετε. + - - Μπορείτε να μετατρέψετε το ξύλο που έχει συλλέξει σε σανίδες. Επιλέξτε το εικονίδιο με τις σανίδες και πατήστε{*CONTROLLER_VK_A*} για να τις δημιουργήσετε.{*PlanksIcon*} + + Η Minecon 2013 έγινε στο Ορλάντο, στη Φλόριντα των ΗΠΑ! - - - Τώρα κατασκευάσατε ένα τραπέζι κατασκευής που θα πρέπει να τοποθετήσετε στον κόσμο για να μπορείτε να κατασκευάσετε μια μεγαλύτερη συλλογή αντικειμένων.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. - + + To .party() ήταν τέλειο! - - - Πατήστε{*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*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. - + + Το End - - - Ορισμένα αντικείμενα δεν μπορούν να δημιουργηθούν χρησιμοποιώντας το τραπέζι κατασκευής και απαιτείται φούρνος. Κατασκευάστε έναν φούρνο τώρα.{*FurnaceIcon*} - + + Απαγόρευση Επιπέδων - - - Τοποθετήστε το φούρνο που κατασκευάσατε στον κόσμο. Καλό θα ήταν να τον βάλετε στο καταφύγιό σας.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. - + + Λειτουργία Δημιουργίας - - - Αυτό είναι το περιβάλλον χρήστη φούρνου. Ο φούρνος επιτρέπει την αλλαγή αντικειμένων φλογίζοντάς τα. Για παράδειγμα, μπορείτε να μετατρέψετε κομμάτια σιδήρου σε ράβδους σιδήρου στο φούρνο. - + + Επιλογές Οικοδεσπότη και Παίκτη - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε το φούρνο. - + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΤΟ END{*ETW*}{*B*}{*B*} +Το End είναι μια άλλη διάσταση του παιχνιδιού, στην οποία μπορείτε να μεταβείτε μέσω μιας ενεργής Πύλης End. Την Πύλη End μπορείτε να την βρείτε σε ένα Φρούριο, το οποίο βρίσκεται βαθιά μέσα στη γη στον Overworld.{*B*} +Για να ενεργοποιήσετε την Πύλη End, θα χρειαστεί να βάλετε ένα Μάτι του Ender σε οποιαδήποτε Πύλη End δεν διαθέτει τέτοιο μάτι.{*B*} +Μόλις ενεργοποιηθεί η πύλη, πηδήξτε μέσα σε αυτή και θα μεταφερθείτε στο End.{*B*}{*B*} +Στο End θα συναντήσετε τον Δράκο του Ender, έναν άγριο και ισχυρό εχθρό, καθώς και πολλούς Enderman, γι' αυτό θα πρέπει να είστε καλά προετοιμασμένοι για τη μάχη προτού πάτε εκεί!{*B*}{*B*} +Θα δείτε ότι υπάρχουν Κρύσταλλοι του Ender πάνω από οκτώ καρφιά Οψιανού τα οποία χρησιμοποιεί ο Δράκος του Ender για να θεραπεύεται, +έτσι το πρώτο βήμα στη μάχη είναι να καταστρέψετε αυτούς τους κρυστάλλους.{*B*}< +Τους πρώτους μπορείτε να τους φτάσετε με βέλη, αλλά οι υπόλοιποι προστατεύονται από ένα Σιδερένιο Κλουβί και θα χρειαστεί να δημιουργήσετε μια κατασκευή για να τους φτάσετε.{*B*}{*B*} +Ενώ το κάνετε αυτό, ο Δράκος του Ender θα σας επιτίθεται πετώντας καταπάνω σας και ρίχνοντάς σας μπάλες με οξύ!{*B*} +Εάν πλησιάσετε την περιοχή όπου βρίσκονται τα αυγά στο κέντρο των καρφιών, ο Δράκος του Ender θα πετάξει προς τα κάτω και θα σας επιτεθεί και τότε είναι η κατάλληλη στιγμή για να του προκαλέσετε ζημιά!{*B*} +Αποφύγετε την όξινη ανάσα του και στοχεύστε στα μάτια του για καλύτερα αποτελέσματα. Εάν είναι δυνατόν, προσκαλέστε και μερικούς φίλους σας στο End για να σας βοηθήσουν με τη μάχη!{*B*}{*B*} +Όταν βρίσκεστε στο End, οι φίλοι σας θα μπορούν να δουν τη θέση της Πύλης End μέσα στο Φρούριο στους χάρτες τους +για να σας εντοπίσουν εύκολα. - - - Πρέπει να βάλετε καύσιμο στο κάτω μέρος του φούρνου και στη συνέχεια, το αντικείμενο που θέλετε να αλλάξετε στο επάνω μέρος. Ο φούρνος τότε θα ανάψει και θα ξεκινήσει να δουλεύει. Το αποτέλεσμα βγαίνει στη δεξιά υποδοχή. - + + {*ETB*}Καλώς ορίσατε και πάλι! Μπορεί να μην το παρατηρήσατε αλλά το Minecraft σας μόλις ενημερώθηκε.{*B*}{*B*} +Υπάρχουν πολλά νέα στοιχεία που μπορείτε να χρησιμοποιήσετε στο παιχνίδι εσείς και οι φίλοι σας και παρακάτω θα σας επισημάνουμε μερικά από αυτά. Διαβάστε και μετά ώρα να διασκεδάσετε!{*B*}{*B*} +{*T1*}Νέα Αντικείμενα{*ETB*} - Ενισχυμένος Πηλός, Βαμμένος Πηλός, Κύβος από Κάρβουνο, Δέμα Σανό, Ράγα Ενεργοποίησης, Κύβος Κοκκινόπετρας, Αισθητήρας φωτός της ημέρας, Εκτοξευτής, Χοάνη, Βαγόνι Ορυχείου με Χοάνη, Βαγόνι Ορυχείου με TNT, Συσκευή σύγκρισης Κοκκινόπετρας, Σταθμισμένη Πλάκα Πίεσης, Φάρος, Παγιδευμένο Σεντούκι, Πυροτέχνημα-Πύραυλος, Πυροτέχνημα Αστέρι, Αστέρι του Nether, Χαλινάρι, Πανοπλία Αλόγου, Καρτελάκι Ονόματος, Αυγό Spawn Αλόγου{*B*} +{*T1*}Νέα Mob{*ETB*} - Wither, Σκελετοί Wither, Μάγισσες, Νυχτερίδες, Άλογα, Γαϊδούρια και Μουλάρια{*B*} +{*T1*}Νέες δυνατότητες{*ETB*} - Εξημερώστε και ιππεύστε ένα άλογο, κατασκευάστε πυροτεχνήματα και κάντε επιδείξεις, δώστε ονόματα σε ζώα και τέρατα με τα Καρτελάκια Ονόματος, δημιουργήστε πιο εξελιγμένα κυκλώματα Κοκκινόπετρας, καθώς και νέες Επιλογές Κατόχου για να ελέγχετε καλύτερα τι μπορούν να κάνουν οι επισκέπτες στον κόσμο σας!{*B*}{*B*} +{*T1*}Νέος Κόσμος Εκμάθησης{*ETB*} – Μάθετε πώς να χρησιμοποιείτε παλιές και νέες δυνατότητες στον Κόσμο Εκμάθησης. Θα μπορέσετε να βρείτε όλους τους μυστικούς Δίσκους Μουσικής που κρύβονται στον κόσμο;{*B*}{*B*} - - - Μπορούν να χρησιμοποιηθούν ως καύσιμο πολλά ξύλινα αντικείμενα, αλλά δεν καίγονται όλα τα αντικείμενα στον ίδιο χρόνο. Μπορείτε επίσης να ανακαλύψετε άλλα αντικείμενα στον κόσμο που μπορούν να χρησιμοποιηθούν ως καύσιμο. - + + Προκαλεί μεγαλύτερη ζημιά από ότι με το χέρι. - - - Όταν τα αντικείμενά σας φλογιστούν, μπορείτε να τα μετακινήσετε από την εξωτερική περιοχή στο απόθεμά σας. Θα πρέπει να πειραματιστείτε με διάφορα συστατικά για να δείτε τι μπορείτε να φτιάξετε. - + + Χρησιμοποιείται για ταχύτερο σκάψιμο σε χώμα, γρασίδι, άμμο, χαλίκι και χιόνι από ότι με το χέρι. Για να σκάψετε χιονόμπαλες απαιτούνται φτυάρια. - - - Εάν χρησιμοποιήσετε ως συστατικό το ξύλο, τότε μπορείτε να φτιάξετε ξυλοκάρβουνο. Τοποθετήστε κάποιο καύσιμο στο φούρνο και το ξύλο στην υποδοχή συστατικών. Μπορεί να χρειαστεί μερική ώρα για να φτιάξει ο φούρνος το ξυλοκάρβουνο, οπότε μπορείτε να κάνετε κάποια άλλη εργασία και να επιστρέψετε αργότερα για να ελέγξετε την πρόοδο. - + + Τρέξιμο - - - Το ξυλοκάρβουνο μπορεί να χρησιμοποιηθεί ως καύσιμο, αλλά μπορεί και να μετατραπεί σε πυρσό μαζί με ένα ραβδί. - + + Τι Νέο Υπάρχει - - - Εάν βάλετε άμμο στην υποδοχή συστατικών, μπορείτε να φτιάξετε γυαλί. Δημιουργήστε κομμάτια γυαλιού για να τα χρησιμοποιήσετε ως παράθυρα στο καταφύγιό σας. - + + {*T3*}Αλλαγές και Προσθήκες{*ETW*}{*B*}{*B*} +- Προστέθηκαν νέα αντικείμενα - Ενισχυμένος Πηλός, Βαμμένος Πηλός, Κύβος από Κάρβουνο, Δέμα Σανό, Ράγα Ενεργοποίησης, Κύβος Κοκκινόπετρας, Αισθητήρας φωτός της ημέρας, Εκτοξευτής, Χοάνη, Βαγόνι Ορυχείου με Χοάνη, Βαγόνι Ορυχείου με TNT, Συσκευή σύγκρισης Κοκκινόπετρας, Σταθμισμένη Πλάκα Πίεσης, Φάρος, Παγιδευμένο Σεντούκι, Πυροτέχνημα-Πύραυλος, Πυροτέχνημα Αστέρι, Αστέρι του Nether, Χαλινάρι, Πανοπλία Αλόγου, Καρτελάκι Ονόματος, Αυγό Spawn Αλόγου{*B*} +- Προστέθηκαν νέα Mob - Wither, Σκελετοί Wither, Μάγισσες, Νυχτερίδες, Άλογα, Γαϊδούρια και Μουλάρια{*B*} +- Προστέθηκαν νέες δυνατότητες δημιουργίας εδάφους - Καλύβες Μαγισσών.{*B*} +- Προστέθηκε το περιβάλλον χρήστη Φάρου.{*B*} +- Προστέθηκε το περιβάλλον χρήστη Αλόγου.{*B*} +- Προστέθηκε το περιβάλλον χρήστη Χοάνης.{*B*} +- Προστέθηκαν Πυροτεχνήματα - η πρόσβαση στο περιβάλλον Πυροτεχνήματα γίνεται μέσω του Πάγκου Εργασίας, όταν έχετε τα υλικά για να κατασκευάσετε ένα Πυροτέχνημα Αστέρι ή ένα Πυροτέχνημα-Πύραυλο.{*B*} +- Προστέθηκε η λειτουργία Adventure Mode, όπου μπορείτε να σπάτε κύβους μόνο με τα σωστά εργαλεία.{*B*} +- Προστέθηκαν πολλοί νέοι ήχοι.{*B*} +- Τώρα τα Mobs, τα αντικείμενα και τα βλήματα μπορούν να περνούν μέσα από πύλες.{*B*} +- Τώρα μπορείτε να κλειδώνετε τους Ενισχυτές τροφοδοτώντας τις πλευρές τους με άλλους Ενισχυτές.{*B*} +- Τα Ζόμπι και οι Σκελετοί μπορούν τώρα να αναπαράγονται με διαφορετικά όπλα και πανοπλία.{*B*} +- Νέα μηνύματα θανάτου.{*B*} +- Δώστε ονόματα στα mobs με τα καρτελάκια ονόματος και μετονομάστε τα δοχεία για να αλλάξετε τον τίτλο όταν το Μενού είναι ανοιχτό.{*B*} +- Το Κοκαλόγευμα δεν προσφέρει πια στιγμιαία ανάπτυξη σε πλήρες μέγεθος, αλλά τυχαία ανάπτυξη σε στάδια.{*B*} +- Μπορείτε να εντοπίζετε Σήματα Κοκκινόπετρας που περιγράφουν τα περιεχόμενα Σεντουκιών, Βάσεων Παραγωγής, Διανομέων και Τζουκμπόξ, απλώς τοποθετώντας επάνω τους μια Συσκευή Σύγκρισης Κοκκινόπετρας. +- Οι διανομείς μπορούν να είναι στραμμένοι προς οποιαδήποτε κατεύθυνση. +- Τρώγοντας ένα Χρυσό Μήλο, ο παίκτης αποκτά για λίγο περισσότερη υγεία απορρόφησης.{*B*} +- Όσο περισσότερο παραμένετε σε μια περιοχή, τα τέρατα που εμφανίζονται θα γίνονται όλο και δυσκολότερα στην αντιμετώπιση.{*B*} - - - Αυτό είναι το περιβάλλον χρήστη παρασκευής φίλτρων. Μπορείτε να το χρησιμοποιείτε για να δημιουργείτε φίλτρα με πολλές και διαφορετικές ιδιότητες. - + + Κοινοποίηση Στιγμιοτύπων Οθόνης - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε τη βάση παρασκευής φίλτρων. - + + Σεντούκια - - - Παρασκευάζετε φίλτρα τοποθετώντας ένα συστατικό στην επάνω υποδοχή και ένα μπουκαλάκι φίλτρου ή νερού στις κάτω υποδοχές (μπορούν να παρασκευαστούν έως 3 τη φορά). Μόλις τοποθετηθούν συστατικά που μπορούν να συνδυαστούν, ξεκινά η παρασκευαστική διαδικασία και, μετά από λίγη ώρα, δημιουργείται το φίλτρο. - + + Κατασκευή - - - Όλα τα φίλτρα ξεκινούμε με ένα Μπουκάλι Νερό. Τα περισσότερα φίλτρα δημιουργούνται χρησιμοποιώντας ως πρώτο υλικό ένα Φυτό Nether για τη δημιουργία ενός Δυσάρεστου Φίλτρου, ενώ απαιτείται τουλάχιστον ένα ακόμα συστατικό για τη δημιουργία του τελικού φίλτρου. - + + Φούρνος - - - Όταν παρασκευάζετε ένα φίλτρο, μπορείτε να τροποποιήσετε τις ιδιότητές του. Με την προσθήκη Σκόνης Κοκκινόπετρας, αυξάνεται η διάρκεια των ιδιοτήτων του, ενώ με την προσθήκη Σκόνης Λαμψόπετρας, μπορούν να ενισχυθούν οι ιδιότητές του. - + + Βασικές Πληροφορίες - - - Με την προσθήκη Ζυμωμένου Ματιού Αράχνης, χαλάει η σύσταση του φίλτρου, το οποίο μπορεί να γίνει φίλτρο με αντίθετες ιδιότητες, ενώ με την προσθήκη Πυρίτιδας, το φίλτρο γίνεται Φίλτρο Εκτόξευσης, το οποίο μπορεί να πεταχθεί για να εφαρμοστούν οι ιδιότητές του σε μια κοντινή περιοχή. - + + HUD - - - Δημιουργήστε ένα Φίλτρο Πυραντίστασης προσθέτοντας πρώτα το Φυτό Nether σε ένα Μπουκάλι Νερό και έπειτα προσθέτοντας την Κρέμα Μάγματος. - + + Απόθεμα - - - Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη παρασκευής φίλτρων. - + + Διανομέας - - - Σε αυτήν την περιοχή, υπάρχει μια Βάση Παρασκευής Φίλτρων, ένα Καζάνι και ένα σεντούκι γεμάτο υλικά για την παρασκευή φίλτρων. - + + Μάγεμα - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις παρασκευαστικές διαδικασίες και τα φίλτρα. - + + Πύλη Nether - - - Το πρώτο βήμα για την παρασκευή ενός φίλτρου είναι η δημιουργία ενός Μπουκαλιού Νερού. Πάρτε από το σεντούκι ένα Γυάλινο Μπουκάλι. - + + Για Πολλούς Παίκτες - - - Μπορείτε να γεμίσετε ένα γυάλινο μπουκάλι από ένα Καζάνι που περιέχει νερό ή από έναν κύβο νερού. Γεμίστε το γυάλινο μπουκάλι τώρα τοποθετώντας το δείκτη σε μια πηγή νερού και πατώντας{*CONTROLLER_ACTION_USE*}. - + + Κτηνοτροφία - - - Εάν αδειάσει ένα καζάνι, μπορείτε να το γεμίσετε ξανά με έναν Κουβά Νερό. - + + Εκτροφή Ζώων - - - Χρησιμοποιήστε τη Βάση Παρασκευής για να δημιουργήσετε ένα Φίλτρο Πυραντίστασης. Θα χρειαστείτε ένα Μπουκάλι Νερού, Φυτό Nether και Κρέμα Μάγματος. - + + Παρασκευή Φίλτρου - - - Κρατώντας ένα φίλτρο στο χέρι σας, πατήστε παρατεταμένα{*CONTROLLER_ACTION_USE*} για να το χρησιμοποιήσετε. Για ένα κανονικό φίλτρο, θα το πιείτε και οι ιδιότητές του θα εφαρμοστούν σε εσάς, ενώ για ένα Φίλτρο Εκτόξευσης, θα το πετάξετε και οι ιδιότητές του θα εφαρμοστούν στα πλάσματα που βρίσκονται κοντά στο σημείο που θα πέσει. - Μπορείτε να δημιουργήσετε Φίλτρα Εκτόξευσης προσθέτοντας πυρίτιδα σε κανονικά φίλτρα. - + + Στον deadmau5 αρέσει το Minecraft! - - - Χρησιμοποιήστε το Φίλτρο Πυραντίστασης στον εαυτό σας. - + + Οι Γουρουνάνθρωποι δεν θα σας επιτεθούν, εκτός εάν τους επιτεθείτε εσείς. - - - Τώρα που είστε ανθεκτικοί στη φωτιά και τη λάβα, καλό θα ήταν να εξερευνήσετε εάν υπάρχουν μέρη τα οποία δεν μπορούσατε να επισκεφτείτε μέχρι τώρα. - + + Μπορείτε να αλλάξετε το σημείο επαναφοράς του παιχνιδιού και να μετακινηθείτε γρήγορα στην αυγή εάν κοιμηθείτε σε κρεβάτι. - - - Αυτό είναι το περιβάλλον χρήστη μαγέματος το οποίο μπορείτε να χρησιμοποιείτε για να προσθέτετε μαγικές ιδιότητες σε όπλα, πανοπλίες και ορισμένα εργαλεία. - + + Στείλτε αυτές τις πύρινες σφαίρες πίσω στα Ghast! - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το περιβάλλον χρήστη μαγέματος.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με το περιβάλλον χρήστη μαγέματος. - + + Φτιάξτε πυρσούς για να φωτίζετε περιοχές τη νύχτα. Τα τέρατα θα αποφεύγουν τις περιοχές γύρω από αυτούς τους πυρσούς. - - - Για να μαγέψετε ένα αντικείμενο, πρώτα τοποθετήστε το στην υποδοχή μαγέματος. Μπορείτε να μαγέψετε όπλα, πανοπλίες και ορισμένα εργαλεία για να τους δώσετε ειδικές δυνάμεις, όπως βελτιωμένη αντίσταση στη ζημιά ή αύξηση του αριθμού των αντικειμένων που δημιουργούνται όταν γίνεται εξόρυξη σε κύβους. - + + Για να πάτε πιο γρήγορα στον προορισμό σας χρησιμοποιήστε βαγόνι ορυχείου και ράγες! - - - Όταν ένα αντικείμενο τοποθετείται στην υποδοχή μαγέματος, τα κουμπιά στη δεξιά πλευρά αλλάζουν και παρέχουν μια ευρεία γκάμα διάφορων ειδών μαγέματος. - + + Φυτέψτε μερικά βλαστάρια και θα μεγαλώσουν σε δέντρα. - - - Ο αριθμός στο κουμπί αναπαριστά το κόστος σε επίπεδα εμπειρίας που θα εφαρμόσει το συγκεκριμένο είδος μαγέματος στο αντικείμενο. Εάν δεν έχετε αρκετά υψηλό επίπεδο, το κουμπί θα είναι απενεργοποιημένο. - + + Εάν χτίσετε μια πύλη, θα μπορέσετε να ταξιδέψετε σε άλλη διάσταση, στο Nether. - - - Επιλέξτε ένα είδος μαγέματος και πατήστε{*CONTROLLER_VK_A*} για να μαγέψετε το αντικείμενο. Αυτό θα έχει ως αποτέλεσμα τη μείωση του επιπέδου εμπειρίας σας βάσει του κόστους του μαγέματος. - + + Δεν είναι καλή ιδέα να σκάβετε απευθείας προς τα κάτω ή προς τα πάνω. - - - Τα διάφορα μαγέματα είναι εντελώς τυχαία, ωστόσο, ορισμένα καλύτερα είδη μαγέματος είναι διαθέσιμα μόνο όταν έχετε υψηλό επίπεδο εμπειρίας και έχετε πολλές βιβλιοθήκες γύρω από το Τραπέζι Μαγέματος, για να αυξηθεί η δύναμή του. - + + Η πάστα οστών (που κατασκευάστηκε από κόκκαλο Σκελετού) μπορεί να χρησιμοποιηθεί ως λίπασμα και κάνει τα πράγματα να μεγαλώνουν κατευθείαν! - - - Σε αυτήν την περιοχή, υπάρχει ένα Τραπέζι Μαγέματος και ορισμένα άλλα αντικείμενα που θα σας βοηθήσουν να εξοικειωθείτε με τη διαδικασία του μαγέματος. - + + Οι Creeper θα εκραγούν όταν έρθουν κοντά σας! - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το μάγεμα.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη διαδικασία του μαγέματος. - + + Πατήστε{*CONTROLLER_VK_B*} για να ξεσκαρτάρετε το αντικείμενο που έχετε στο χέρι σας! - - - Με τη χρήση του Τραπεζιού Μαγέματος, μπορείτε να προσθέτετε ειδικές δυνάμεις, όπως αύξηση του αριθμού των αντικειμένων που δημιουργούνται όταν γίνεται εξόρυξη σε κύβους ή βελτιωμένη αντίσταση ζημιάς, σε όπλα, πανοπλίες και ορισμένα εργαλεία. - + + Χρησιμοποιήστε το κατάλληλο εργαλείο για τη δουλειά! - - - Η τοποθέτηση βιβλιοθηκών γύρω από το Τραπέζι Μαγέματος αυξάνει τη δύναμή του και καθιστά δυνατή την πρόσβαση σε μαγέματα υψηλότερου επιπέδου. - + + Εάν δεν μπορείτε να βρείτε κάρβουνο για τους πυρσούς σας, μπορείτε πάντα να φτιάξετε ξυλοκάρβουνο από δέντρα σε ένα φούρνο. - - - Η άσκηση μαγέματος αφαιρείται από τα Επίπεδα Εμπειρίας, τα οποία μπορείτε να συγκεντρώσετε συλλέγοντας Σφαίρες Εμπειρίας. Αυτές προκύπτουν με την εξολόθρευση τεράτων, την εξόρυξη μεταλλευμάτων, την εκτροφή ζώων, το ψάρεμα, το λιώσιμο/μαγείρεμα πραγμάτων στο φούρνο. - + + Οι μαγειρεμένες χοιρινές μπριζόλες σάς δίνουν περισσότερη ζωή από τις ωμές χοιρινές μπριζόλες. - - - Μπορείτε επίσης να συγκεντρώνετε Επίπεδα Εμπειρίας χρησιμοποιώντας ένα Μπουκάλι Μαγέματος, το οποίο όταν το πετάτε, δημιουργούνται Σφαίρες Εμπειρίας στο σημείο όπου προσγειώνεται. Στη συνέχεια, μπορείτε να συλλέγετε αυτές τις σφαίρες. - + + Εάν ορίσετε τη δυσκολία του παιχνιδιού σε Γαλήνιο, η ζωή σας θα αναπληρωθεί αυτόματα και δεν θα εμφανιστούν τέρατα τη νύχτα! - - - Στα σεντούκια αυτής της περιοχής, μπορείτε να βρείτε ορισμένα μαγεμένα αντικείμενα, Μπουκάλια Μαγέματος και ορισμένα αντικείμενα που δεν έχουν ακόμα λάβει μαγικές ιδιότητες και μπορείτε να πειραματιστείτε μαζί τους στο Τραπέζι Μαγέματος. - + + Ταΐστε το λύκο ένα κόκκαλο για να τον δαμάσετε. Τότε μπορείτε να τον κάνετε να κάτσει ή να σας ακολουθήσει. - - - Τώρα βρίσκεστε σε ένα βαγόνι ορυχείου. Για να βγείτε από το βαγόνι, τοποθετήστε το δείκτη επάνω του και πατήστε{*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} - + + Μπορείτε να ξεσκαρτάρετε αντικείμενα όταν βρίσκεστε στο μενού Απόθεμα μετακινώντας το δρομέα από το μενού και πατώντας{*CONTROLLER_VK_A*} - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα βαγόνια ορυχείου.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα βαγόνια ορυχείου. - + + Υπάρχει διαθέσιμο νέο περιεχόμενο για λήψη! Για να πραγματοποιήσετε τη λήψη πατήστε το κουμπί Minecraft Store στο Κύριο Μενού. - - - Τα βαγόνια ορυχείου κινούνται επάνω σε ράγες. Μπορείτε επίσης να κατασκευάσετε ένα ηλεκτροκίνητο βαγόνι τοποθετώντας στο φούρνο ένα βαγόνι που περιέχει ένα σεντούκι. - {*RailIcon*} - + + Μπορείτε να αλλάξετε την εμφάνιση του χαρακτήρα σας με ένα Πακέτο Skin από το Minecraft Store. Επιλέξτε το Minecraft Store στο Κύριο Μενού για να δείτε τι είναι διαθέσιμο. - - - Μπορείτε επίσης να κατασκευάσετε ηλεκτρικές ράγες, οι οποίες τροφοδοτούνται από πυρσούς και κυκλώματα από κοκκινόπετρα για την επιτάχυνση του βαγονιού. Αυτές μπορούν να συνδεθούν σε διακόπτες, μοχλούς και πλάκες πίεσης για τη δημιουργία πιο σύνθετων συστημάτων. - {*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*}, εάν είστε ήδη εξοικειωμένοι με τη χρήση των κρεβατιών. - + + Εάν ένα ζώο δεν μπορεί να κινηθεί για περισσότερους από 20 κύβους σε οποιαδήποτε κατεύθυνση, δεν θα εξαφανιστεί. - - - Τα κρεβάτια θα πρέπει να τοποθετούνται σε ένα ασφαλές, καλοφωτισμένο μέρος, για να μη σας ξυπνάνε τα τέρατα κατά τη διάρκεια της νύχτας. Έχοντας χρησιμοποιήσει κάποιο κρεβάτι, εάν πεθάνετε, θα αναγεννηθείτε στο συγκεκριμένο κρεβάτι. - {*ICON*}355{*/ICON*} - + + Οι ήμεροι λύκοι δείχνουν την υγεία τους με τη θέση της ουράς τους. Ταΐστε τους κρέας για να τους θεραπεύσετε. - - - Εάν υπάρχουν άλλοι παίκτες στο παιχνίδι σας, θα πρέπει όλοι να βρίσκονται στο κρεβάτι τους την ίδια ώρα για να μπορέσουν όλοι οι χαρακτήρες να κοιμηθούν. - {*ICON*}355{*/ICON*} - + + Μαγειρέψτε ένα κάκτο στο φούρνο για να πάρετε πράσινη βαφή. - - - Σε αυτήν την περιοχή, υπάρχουν ορισμένα απλά κυκλώματα Κοκκινόπετρας και Εμβόλων, καθώς και ένα σεντούκι με πολλά αντικείμενα για την επέκταση αυτών των κυκλωμάτων. - + + Διαβάστε την ενότητα "Τι Νέο Υπάρχει" στα μενού "Τρόπος Παιχνιδιού" για να δείτε τις τελευταίες πληροφορίες σχετικά με την ενημερωμένη έκδοση του παιχνιδιού. - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα κυκλώματα Κοκκινόπετρας και των Εμβόλων.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα κυκλώματα Κοκκινόπετρας και των Εμβόλων. - + + Μουσική από τους C418! - - - Οι Μοχλοί, τα Κουμπιά, οι Πλάκες Πίεσης και οι Πυρσοί Κοκκινόπετρας μπορούν όλα να τροφοδοτούν με ρεύμα τα κυκλώματα, είτε προσαρτώντας τα απευθείας επάνω στο αντικείμενο που θέλετε να ενεργοποιήσετε είτε συνδέοντάς τα με σκόνη Κοκκινόπετρας. - + + Ποιος είναι ο Notch; - - - Η θέση και η κατεύθυνση στην οποία τοποθετείτε μια πηγή τροφοδοσίας μπορεί να αλλάξει τον τρόπο που επηρεάζει τους γύρω κύβους. Για παράδειγμα, μπορεί να σβηστεί ένας πυρσός Κοκκινόπετρας δίπλα σε έναν κύβο, εάν ο κύβος τροφοδοτείται από κάποια άλλη πηγή. - + + Η Mojang έχει περισσότερα βραβεία από ότι προσωπικό! - - - Μπορείτε να συλλέγετε σκόνη Κοκκινόπετρας εξορύσσοντας κομμάτια κοκκινόπετρας με τη βοήθεια μιας Σιδερένιας, Αδαμάντινης ή Χρυσής αξίνας. Μπορείτε να τη χρησιμοποιείτε για την τροφοδοσία έως 15 κύβων και μπορεί να μετακινηθεί ένας κύβος προς τα επάνω ή προς τα κάτω σε ύψος. - {*ICON*}331{*/ICON*} - + + Υπάρχουν και ορισμένοι διάσημοι που παίζουν Minecraft! - - - Οι αναμεταδότες Κοκκινόπετρας μπορούν να χρησιμοποιηθούν για την επέκταση της απόστασης στην οποία μεταδίδεται το ρεύμα ή για τη δημιουργία καθυστέρησης σε ένα κύκλωμα. - {*ICON*}356{*/ICON*} - + + Ο Notch έχει πάνω από ένα εκατομμύριο ακόλουθους στο twitter! - - - Όταν τροφοδοτείται ένα Έμβολο, εκτείνεται σπρώχνοντας έως 12 κύβους. Όταν μαζεύονται, τα Έμβολα με Κόλλα μπορούν να τραβήξουν μαζί τους έναν κύβο από τα περισσότερα διαθέσιμα είδη. - {*ICON*}33{*/ICON*} - + + Δεν έχουν όλοι οι Σουηδοί ξανθά μαλλιά. Μερικοι, όπως ο Jens από τη Mojang, έχουν ακόμη και κόκκινα μαλλιά! - - - Στο σεντούκι αυτής της περιοχής, υπάρχουν ορισμένα εξαρτήματα για τη δημιουργία κυκλωμάτων με έμβολα. Δοκιμάστε να χρησιμοποιήσετε ή να ολοκληρώσετε τα κυκλώματα σε αυτήν την περιοχή ή να δημιουργήσετε τα δικά σας. Υπάρχουν περισσότερα παραδείγματα εκτός της περιοχής εκπαίδευσης. - + + Θα υπάρξει τελικά ενημέρωση σε αυτό το παιχνίδι! - - - Σε αυτήν την περιοχή, υπάρχει μια Πύλη για τον κόσμο του Nether! - + + Εάν τοποθετήσετε δύο σεντούκια το ένα δίπλα στο άλλο θα δημιουργηθεί ένα μεγάλο σεντούκι. - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις Πύλες και το Nether.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις Πύλες και το Nether. - + + Προσέχετε όταν δημιουργείτε κατασκευές από μαλλί σε ανοικτό χώρο, καθώς οι αστραπές από καταιγίδες μπορεί να βάλουν φωτιά στο μαλλί. - - - Οι Πύλες δημιουργούνται τοποθετώντας κύβους Οψιανού σε ένα πλαίσιο πλάτους τεσσάρων κύβων και ύψους πέντε κύβων. Οι γωνιακοί κύβοι δεν είναι υποχρεωτικοί. - + + Ένας μόνο κουβάς από λάβα μπορεί να χρησιμοποιηθεί σε έναν φούρνο για τη δημιουργία 100 κύβων. - - - Για να ενεργοποιήσετε μια Πύλη για το Nether, βάλτε φωτιά στους κύβους Οψιανού μέσα στο πλαίσιο χρησιμοποιώντας έναν Πυρόλιθο και Χάλυβα. Οι Πύλες μπορούν να απενεργοποιηθούν εάν χαλάσει το πλαίσιο, εάν προκύψει κάποια έκρηξη σε κοντινό μέρος ή περάσει κάποιο υγρό από μέσα τους. - + + Το όργανο που παίζει έναν κύβο νότας εξαρτάται από το υλικό που βρίσκεται κάτω από αυτό. - - - Για να χρησιμοποιήσετε μια Πύλη για το Nether, μπείτε μέσα της. Η οθόνη σας θα γίνει μωβ και θα ακουστεί ένας ήχος. Μετά από μερικά δευτερόλεπτα, θα μεταφερθείτε σε μια άλλη διάσταση. - + + Η λάβα μπορεί να χρειαστεί μερικά λεπτά για να εξαφανιστεί ΕΝΤΕΛΩΣ όταν αφαιρεθεί ο κύβος πηγής. - - - Το Nether είναι ένα μέρος γεμάτο κινδύνους και πολλή λάβα, αλλά μπορεί να σας φανεί χρήσιμο να συλλέξετε το Netherrack, το οποίο αν το ανάψετε μπορεί να καίει για πάντα, καθώς και για τη Λαμψόπετρας, που παράγει φως. - + + Η πέτρα επίστρωσης είναι ανθεκτική στις πύρινες σφαίρες των Ghast και έτσι είναι χρήσιμη για τη φύλαξη των πυλών. - - - Ο κόσμος του Nether μπορεί να χρησιμοποιηθεί για να ταξιδεύετε γρήγορα στον Overworld - εάν διανύσετε απόσταση ενός κύβου στο Nether, αυτό ισοδυναμεί με 3 κύβους στον Overworld. - + + Οι κύβοι που μπορούν να χρησιμοποιηθούν ως πηγή φωτός λιώνουν το χιόνι και τον πάγο. Αυτά περιλαμβάνουν τους πυρσούς, τις λαμψόπετρες και τα φανάρια από κολοκύθα. - - - Τώρα βρίσκεστε στη λειτουργία Δημιουργίας. - + + Τα Ζόμπι και οι Σκελετοί μπορούν να επιβιώσουν στο φως της ημέρας εάν βρίσκονται στο νερό. - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τη λειτουργία Δημιουργίας.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τη λειτουργία Δημιουργίας. - + + Οι κότες γεννούν ένα αυγό κάθε 5 με 10 λεπτά. - - Όταν βρίσκεστε σε λειτουργία Δημιουργίας, έχετε απεριόριστο αριθμό διαθέσιμων αντικειμένων και κύβους, μπορείτε να καταστρέφετε κύβους με ένα κλικ χωρίς εργαλεία, είστε άτρωτοι και μπορείτε να πετάτε. + + Ο οψιανός μπορεί να εξορυχτεί με αδαμάντινη αξίνα. - - Πατήστε{*CONTROLLER_ACTION_CRAFTING*} για να ανοίξετε το περιβάλλον χρήστη αποθέματος δημιουργίας. + + Οι Creeper αποτελούν την πιο εύκολη πηγή για να αποκτήσετε πυρίτιδα. - - Για να συνεχίσετε, πρέπει να φτάσετε στην αντίθετη πλευρά αυτής της τρύπας. + + Εάν επιτεθείτε σε ένα λύκο, τότε τυχόν λύκοι που βρίσκονται κοντά σας θα γίνουν εχθρικοί και θα σας επιτεθούν. Αυτό ισχύει και για τους Γουρουνάνθρωπους Ζόμπι. - - Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τη λειτουργία Δημιουργίας. + + Οι λύκοι δεν μπορούν να εισέλθουν στο Nether. - - - Σε αυτήν την περιοχή, έχει στηθεί μια φάρμα. Οι γεωργικές ασχολίες σάς δίνουν τη δυνατότητα να δημιουργείτε ανανεώσιμες πηγές τροφών και άλλα αντικείμενα. - + + Οι λύκοι δεν θα επιτεθούν στους Creeper. - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τις γεωργικές ασχολίες.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τις γεωργικές ασχολίες. - + + Απαιτείται για την εξόρυξη πέτρινων κύβων και μεταλλευμάτων. - - Το Σιτάρι, οι Κολοκύθες και τα Καρπούζια καλλιεργούνται φυτεύοντας σπόρους. Η συλλογή των σπόρων σιταριού γίνεται κόβοντας Ψηλό Γρασίδι ή θερίζοντας σιτάρι, ενώ οι Σπόροι Κολοκύθας και Καρπουζιού δημιουργούνται από Κολοκύθες και Καρπούζια αντίστοιχα. + + Χρησιμοποιείται στη συνταγή του κέικ και ως συστατικό για την παρασκευή φίλτρων. - - Πριν από τη φύτευση των σπόρων, θα πρέπει να μετατραπούν οι κύβοι χώματος σε Αγρόκτημα με τη βοήθεια ενός Σκαλιστηριού. Μια κοντινή πηγή νερού θα συμβάλλει στο καλό πότισμα του Αγροκτήματος και τη γρήγορη ανάπτυξη της σοδειάς, όπως επίσης και η διασφάλιση φωτός για την περιοχή. + + Χρησιμοποιείται για τη δημιουργία ηλεκτρικού φορτίου κατά την ενεργοποίηση ή την απενεργοποίηση. Παραμένει σε κατάσταση ενεργοποίησης ή απενεργοποίησης μέχρι να πατηθεί ξανά. - - Το Σιτάρι περνάει από αρκετά στάδια κατά την ανάπτυξή του και είναι έτοιμο για συγκομιδή όταν είναι πιο σκούρο.{*ICON*}59:7{*/ICON*} + + Μεταδίδει συνεχώς ηλεκτρικό φορτίο ή μπορεί να χρησιμοποιηθεί ως πομπός/δέκτης, αν συνδεθεί στο πλάι ενός κύβου. +Μπορεί επίσης να χρησιμοποιηθεί για φωτισμό χαμηλής έντασης. - - Για τις Κολοκύθες και τα Καρπούζια, θα πρέπει να υπάρχει ένας κύβος δίπλα από το σημείο που φυτέψατε το σπόρο για να μπορέσει να μεγαλώσει το φρούτο, όταν μεγαλώσει το κοτσάνι. + + Αναπληρώνει 2{*ICON_SHANK_01*} και μπορεί να χρησιμοποιηθεί για την κατασκευή ενός χρυσού μήλου. - - Τα Ζαχαροκάλαμα πρέπει να φυτεύονται σε κύβους Γρασιδιού, Χώματος ή Άμμου που βρίσκονται ακριβώς δίπλα σε κύβους νερού. Εάν κόψετε έναν κύβο Ζαχαροκάλαμου, θα πέσουν όλοι οι κύβοι που βρίσκονται από επάνω του.{*ICON*}83{*/ICON*} + + Αναπληρώνει 2{*ICON_SHANK_01*} και θεραπεύει την υγεία σας για 4 δευτερόλεπτα. Κατασκευάζεται από ένα μήλο και ψήγματα χρυσού. - - Οι Κάκτοι πρέπει να φυτεύονται στην Άμμο και μεγαλώνοντας το ύψος του μπορεί να φτάσει έως και τρεις κύβους. Όπως συμβαίνει με τα Ζαχαροκάλαμα, εάν καταστρέψετε τον χαμηλότερο κύβο, θα μπορείτε να συλλέξετε τους κύβους από επάνω του.{*ICON*}81{*/ICON*} + + Αναπληρώνει 2{*ICON_SHANK_01*}. Αν το φάτε μπορεί να δηλητηριαστείτε. - - Τα Μανιτάρια πρέπει να φυτεύονται σε περιοχή με λίγο φως. Εξαπλώνονται στις κοντινές, φτωχά φωτισμένες περιοχές.{*ICON*}39{*/ICON*} + + Χρησιμοποιείται σε κυκλώματα Κοκκινόπετρας ως αναμεταδότης, αντίσταση ή/και ως ημιαγωγός. - - Η Πάστα Οστών μπορεί να χρησιμοποιηθεί για την πλήρη ανάπτυξη των σοδειών ή για την καλλιέργεια Μανιταριών ώστε να γίνουν Τεράστια Μανιτάρια.{*ICON*}351:15{*/ICON*} + + Χρησιμοποιείται για την οδήγηση βαγονιών ορυχείου. - - Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τις γεωργικές ασχολίες. + + Όταν τροφοδοτείται με ρεύμα, επιταχύνει τα βαγόνια που περνούν από επάνω του. Όταν δεν τροφοδοτείται με ρεύμα, φρενάρει τα βαγόνια που περνούν από επάνω του. - - - Σε αυτήν την περιοχή, είναι συγκεντρωμένα ζώα. Μπορείτε να εκθρέψετε ζώα με σκοπό να αναπαραχθούν. - + + Λειτουργεί σαν Πλάκα Πίεσης (μεταδίδει σήμα Κοκκινόπετρας όταν τροφοδοτείται με ρεύμα), αλλά μπορεί να ενεργοποιηθεί μόνο από ένα βαγόνι ορυχείου. - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα ζώα και τη ζωική αναπαραγωγή.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα ζώα και τη ζωική αναπαραγωγή. - + + Χρησιμοποιείται για τη μετάδοση ηλεκτρικού φορτίου όταν πατιέται. Παραμένει ενεργό για περίπου ένα δευτερόλεπτο και μετά απενεργοποιείται. - - Για να αναπαραχθούν τα ζώα, θα πρέπει να τα ταΐζετε με την κατάλληλη τροφή για να ενεργοποιηθεί η "Λειτουργία Αγάπης". + + Χρήση για την αποθήκευση και την εκτόξευση αντικειμένων με τυχαία σειρά όταν φορτίζεται μέσω Κοκκινόπετρας. - - Δώστε Σιτάρι στις αγελάδες, τα mooshroom ή τα πρόβατα, Καρότα στα γουρούνια, Σπόρους Σιταριού ή Φυτά Nether στις κότες ή οποιοδήποτε είδος κρέατος στους λύκους και θα αρχίσουν να αναζητούν κάποιο άλλο ζώο ίδιου είδους που να υπάρχει κοντά τους το οποίο βρίσκεται επίσης σε Λειτουργία Αγάπης. + + Παίζει μια νότα όταν ενεργοποιείται. Χτυπήστε το για να αλλάξετε τον τόνο της νότας. Το μουσικό όργανο αλλάζει ανάλογα με τον τύπο κύβου στον οποίο θα τοποθετηθεί. - - Όταν συναντιούνται δύο ζώα ίδιου είδους και βρίσκονται και τα δύο σε "Λειτουργία Αγάπης", θα φιληθούν για λίγα δευτερόλεπτα και στη συνέχεια θα εμφανιστεί το μωρό τους. Το μικρό ζωάκι θα ακολουθεί τους γονείς του για λίγο μέχρι να μεγαλώσει και να γίνει και το ίδιο μεγάλο ζώο. + + Αναπληρώνει 2,5{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο ωμού ψαριού σε φούρνο. - - Αφού βρεθεί σε Λειτουργία Αγάπης, το ζώο δεν θα μπορεί να εισέλθει ξανά σε αυτή την κατάσταση για περίπου πέντε λεπτά. + + Αναπληρώνει 1{*ICON_SHANK_01*}. - - Ορισμένα ζώα θα σας ακολουθήσουν, εάν έχετε την αγαπημένη τους τροφή στο χέρι σας. Αυτό κάνει εύκολη τη συγκέντρωση των ζώων σε ένα μέρος για να αναπαραχθούν.{*ICON*}296{*/ICON*} + + Αναπληρώνει 1{*ICON_SHANK_01*}. - - - Μπορείτε να εξημερώσετε τους άγριους λύκους δίνοντάς τους κόκαλα. Μόλις εξημερωθούν, εμφανίζονται Καρδιές Αγάπης τριγύρω τους. Οι εξημερωμένοι λύκοι ακολουθούν τον παίκτη και τον υπερασπίζονται, εάν δεν τους έχει δοθεί εντολή να κάτσουν κάτω. - + + Αναπληρώνει 3{*ICON_SHANK_01*}. - - Έχετε ολοκληρώσει τον εκπαιδευτικό οδηγό για τα ζώα και την αναπαραγωγή τους. + + Χρησιμοποιείται ως πυρομαχικά για τόξα. - - - Σε αυτήν την περιοχή, υπάρχουν ορισμένες κολοκύθες και κύβοι για να δημιουργήσετε ένα Γκόλεμ του Χιονιού και ένα Σιδερένιο Γκόλεμ. - + + Αναπληρώνει 2,5{*ICON_SHANK_01*}. - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με τα Γκόλεμ.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με τα Γκόλεμ. - + + Αναπληρώνει 1{*ICON_SHANK_01*}. Μπορεί να χρησιμοποιηθεί 6 φορές. - - Τα Γκόλεμ δημιουργούνται με την τοποθέτηση μιας κολοκύθας επάνω σε μια στοίβα κύβων. + + Αναπληρώνει 1{*ICON_SHANK_01*} ή μπορείτε να το ψήσετε σε φούρνο. Αν το φάτε μπορεί να δηλητηριαστείτε. + + + Αναπληρώνει 1,5{*ICON_SHANK_01*} ή μπορείτε να το ψήσετε σε φούρνο. - - Τα Γκόλεμ του Χιονιού δημιουργούνται με δύο Κύβους Χιονιού, ο ένας επάνω στον άλλο, με μια κολοκύθα στην κορυφή. Τα Γκόλεμ του Χιονιού πετάνε χιονόμπαλες στους εχθρούς σας. + + Αναπληρώνει 4{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο χοιρινής μπριζόλας σε φούρνο. - - Τα Σιδερένια Γκόλεμ δημιουργούνται με τέσσερις Σιδερένιους Κύβους στο προβαλλόμενο μοτίβο, με μια κολοκύθα επάνω στον μεσαίο κύβο. Τα Σιδερένια Γκόλεμ επιτίθενται στους εχθρούς σας. + + Αναπληρώνει 1{*ICON_SHANK_01*} ή μπορείτε να το ψήσετε σε φούρνο. Μπορείτε να το δώσετε σε έναν Οσελότο για να τον δαμάσετε. - - Τα Σιδερένια Γκόλεμ επίσης εμφανίζονται φυσικά για να προστατεύουν χωριά και σε περίπτωση που επιτεθείτε στους χωρικούς, θα αντεπιτεθούν. + + Αναπληρώνει 3{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο ωμού κοτόπουλου σε φούρνο. - - Δεν μπορείτε να φύγετε από αυτήν την περιοχή μέχρι να ολοκληρώσετε τον εκπαιδευτικό οδηγό. + + Αναπληρώνει 1,5{*ICON_SHANK_01*} ή μπορείτε να το ψήσετε σε φούρνο. - - Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα φτυάρι για να εξορύσσετε μαλακά υλικά, όπως χώμα και άμμο. + + Αναπληρώνει 4{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο ωμού μοσχαρίσιου κρέατος σε φούρνο. - - Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε ένα τσεκούρι για να κόψετε κορμούς δέντρων. + + Χρησιμοποιείται για τη μετακίνησή σας ή για τη μετακίνηση ενός ζώου ή τέρατος σε ράγες. - - Κάποια εργαλεία είναι προτιμότερα για ορισμένα υλικά. Χρησιμοποιείτε μια αξίνα για να εξορύσσετε πέτρες και μεταλλεύματα. Μπορεί να χρειαστεί να φτιάξετε την αξίνα από καλύτερα υλικά για να εξάγετε πόρους από ορισμένους κύβους. + + Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού μπλε μαλλιού. - - Ορισμένα εργαλεία είναι καλύτερα για επίθεση κατά των εχθρών. Συνιστάται η χρήση σπαθιού για τις επιθέσεις σας. + + Χρησιμοποιείται ως βαφή για τη δημιουργία γαλανού μαλλιού. - - Συμβουλή: Πατήστε παρατεταμένα {*CONTROLLER_ACTION_ACTION*}για να εξορύξετε και να κόψετε χρησιμοποιώντας το χέρι σας ή οτιδήποτε κρατάτε. Μπορεί να χρειαστεί να κατασκευάσετε ένα εργαλείο για την εξόρυξη ορισμένων κύβων... + + Χρησιμοποιείται ως βαφή για τη δημιουργία μοβ μαλλιού. - - Το εργαλείο που χρησιμοποιείτε έχει καταστραφεί. Κάθε φορά που χρησιμοποιείτε ένα εργαλείο, αυτό καταστρέφεται σιγά σιγά και στο τέλος διαλύεται. Η χρωματιστή μπάρα κάτω από το αντικείμενο στο απόθεμά σας δείχνει την τρέχουσα κατάσταση ζημιάς. + + Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού πράσινου μαλλιού. - - Πατήστε παρατεταμένα{*CONTROLLER_ACTION_JUMP*} για να κολυμπήσετε προς τα επάνω. + + Χρησιμοποιείται ως βαφή για τη δημιουργία γκρι μαλλιού. - - Σε αυτήν την περιοχή, υπάρχει ένα βαγόνι ορυχείου σε μια πλατφόρμα. Για να μπείτε στο βαγόνι, τοποθετήστε το δείκτη επάνω του και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} στο κουμπί για να μετακινήσετε το βαγόνι. + + Χρησιμοποιείται ως βαφή για τη δημιουργία ανοιχτού γκρι μαλλιού. +(Σημείωση: Μπορείτε επίσης να δημιουργήσετε ανοιχτή γκρι βαφή, αν συνδυάσετε την γκρι βαφή με πάστα οστών. Με αυτόν τον τρόπο, μπορείτε να δημιουργήσετε τέσσερις ανοιχτές γκρι βαφές από έναν ασκό μελάνης). - - Στο σεντούκι δίπλα στο ποτάμι, υπάρχει μια βάρκα. Για να χρησιμοποιήσετε τη βάρκα, τοποθετήστε το δείκτη επάνω της και πατήστε{*CONTROLLER_ACTION_USE*}. Χρησιμοποιήστε{*CONTROLLER_ACTION_USE*} με το δείκτη επάνω στη βάρκα για να ανεβείτε επάνω. + + Χρησιμοποιείται ως βαφή για τη δημιουργία φούξια μαλλιού. - - Στο σεντούκι δίπλα στη λίμνη, υπάρχει ένα καλάμι ψαρέματος. Πάρτε το καλάμι από το σεντούκι και επιλέξτε το ως το τρέχον αντικείμενο στο χέρι σας για να το χρησιμοποιήσετε. + + Χρησιμοποιείται για φωτισμό υψηλότερης έντασης σε σύγκριση με τους πυρσούς. Λιώνει το χιόνι και τον πάγο και μπορεί να χρησιμοποιηθεί κάτω από το νερό. - - Αυτός ο πιο προηγμένος μηχανισμός εμβόλου δημιουργεί μια αυτοεπισκευαζόμενη γέφυρα! Πατήστε το κουμπί για να ενεργοποιηθεί και έπειτα παρακολουθήστε πώς αλληλεπιδρούν τα εξαρτήματα για να μάθετε περισσότερα. + + Χρησιμοποιείται για τη δημιουργία βιβλίων και χαρτών. - - Εάν μετακινήσετε το δείκτη εκτός του περιβάλλοντος χρήστη ενώ μεταφέρετε ένα αντικείμενο, μπορείτε να ξεσκαρτάρετε το συγκεκριμένο αντικείμενο. + + Μπορεί να χρησιμοποιηθεί για τη δημιουργία ραφιών βιβλιοθήκης ή Μαγεμένων Βιβλίων, αν μαγευτεί. - - Δεν έχετε όλα τα συστατικά που απαιτούνται για να φτιάξετε αυτό το αντικείμενο. Το πλαίσιο κάτω αριστερά δείχνει τα συστατικά που απαιτούνται για να το φτιάξετε. + + Χρησιμοποιείται ως βαφή για τη δημιουργία μπλε μαλλιού. - - - Συγχαρητήρια! Ολοκληρώσατε τον εκπαιδευτικό οδηγό. Ο χρόνος στο παιχνίδι τώρα κυλάει κανονικά και δεν έχετε πολλή ώρα μέχρι να νυχτώσει και να βγουν έξω τα τέρατα! Ολοκληρώστε το καταφύγιό σας! - + + Παίζει Δίσκους Μουσικής. - - {*EXIT_PICTURE*} Όταν είστε έτοιμοι για περισσότερες εξερευνήσεις, υπάρχει μια σκάλα σε αυτήν την περιοχή κοντά στο καταφύγιο του Μεταλλωρύχου που οδηγεί σε ένα μικρό κάστρο. + + Χρησιμοποιήστε τα για να δημιουργήστε πολύ ισχυρά εργαλεία, όπλα ή πανοπλίες. - - Υπενθύμιση: + + Χρησιμοποιείται ως βαφή για τη δημιουργία πορτοκαλί μαλλιού. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Συλλέγεται από πρόβατα και μπορεί να χρωματιστεί με διάφορες βαφές. - - Έχουν προστεθεί νέες λειτουργίες στο παιχνίδι στην πιο πρόσφατη έκδοσή του, όπως ενδεικτικά νέες περιοχές στον κόσμο του εκπαιδευτικού οδηγού. + + Χρησιμοποιείται ως δομικό υλικό και μπορεί να χρωματιστεί με διάφορες βαφές. Αυτή η συνταγή δεν συνιστάται, καθώς μπορείτε να αποκτήσετε Μαλλί εύκολα από Πρόβατα. - - {*B*}Πατήστε{*CONTROLLER_VK_A*} για να παίξετε κανονικά τον εκπαιδευτικού οδηγού.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} για να παραλείψετε τον κύριο εκπαιδευτικό οδηγό. + + Χρησιμοποιείται ως βαφή για τη δημιουργία μαύρου μαλλιού. - - Σε αυτήν την περιοχή, θα βρείτε περιοχές που έχουν διαμορφωθεί για να εξοικειωθείτε με το ψάρεμα, τις βάρκες, τα έμβολα και την κοκκινόπετρα. + + Χρησιμοποιείται για τη μεταφορά αγαθών σε ράγες. - - Έξω από αυτήν την περιοχή, θα βρείτε παραδείγματα κτισμάτων, γεωργικών ασχολιών, βαγονιών ορυχείου και πλατφορμών, ειδών μαγέματος, παρασκευής φίλτρων, ανταλλαγών, σιδηρουργικής και πολλών άλλων! + + Κινείται σε ράγες και μπορεί να δώσει ώθηση σε άλλα βαγόνια, αν τροφοδοτηθεί με κάρβουνο. - - - Η μπάρα φαγητού έχει εξαντληθεί σε σημείο που δεν θα μπορέσετε να αναρρώσετε. - + + Χρησιμοποιείται για μετακίνηση στο νερό. Είναι πιο γρήγορο από το κολύμπι. - - - {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με την μπάρα φαγητού και την κατανάλωση τροφών.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν είστε ήδη εξοικειωμένοι με την μπάρα φαγητού και την κατανάλωση τροφών. - + + Χρησιμοποιείται ως βαφή για τη δημιουργία πράσινου μαλλιού. - - Επιλογή + + Χρησιμοποιείται ως βαφή για τη δημιουργία κόκκινου μαλλιού. - - Χρήση + + Χρησιμοποιείται για τη στιγμιαία ανάπτυξη σοδειών, δέντρων, ψηλού γρασιδιού, μεγάλων μανιταριών και λουλουδιών και μπορεί να χρησιμοποιηθεί και στις συνταγές βαφών. - - Πίσω + + Χρησιμοποιείται ως βαφή για τη δημιουργία ροζ μαλλιού. - - Έξοδος + + Χρησιμοποιείται ως βαφή για τη δημιουργία καφέ μαλλιού, ως συστατικό για μπισκότα ή για την καλλιέργεια Κακαόδεντρων. - - Ακύρωση + + Χρησιμοποιείται ως βαφή για τη δημιουργία ασημί μαλλιού. - - Ακύρωση Συμμετοχής + + Χρησιμοποιείται ως βαφή για τη δημιουργία κίτρινου μαλλιού. - - Ανανέωση Λίστας Διαδικτυακών Παιχνιδιών + + Επιτρέπει τις επιθέσεις από απόσταση με τη χρήση βελών. - - Ομαδικά Παιχνίδια + + Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. - - Όλα τα Παιχνίδια + + Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. - - Αλλαγή Ομάδας + + Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν τις φορά. - - Προβολή Αποθέματος + + Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. - - Προβολή Περιγραφής + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν τις φορά. - - Προβολή Συστατικών + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. - - Κατασκευή + + Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. - - Δημιουργία + + Μια γυαλιστερή ράβδος που μπορεί να χρησιμοποιηθεί για την κατασκευή εργαλείων από αυτό το υλικό. Δημιουργείται λιώνοντας μεταλλεύματα σε φούρνο. - - Λήψη/Τοποθέτηση + + Επιτρέπει την κατασκευή ράβδων, πετραδιών ή βαφών σε μετακινούμενους κύβους. Μπορεί να χρησιμοποιηθεί ως ακριβός κύβος κατασκευής ή χώρος αποθήκευσης των μεταλλευμάτων. - - Λήψη + + Χρησιμοποιείται για την μετάδοση ηλεκτρικού φορτίου όταν πατήσει πάνω της ένας παίκτης, ζώο ή τέρας. Οι Ξύλινες Πλάκες Πίεσης μπορούν επίσης να ενεργοποιηθούν εάν ρίξετε κάτι πάνω σε αυτές. - - Λήψη Όλων + + Δίνει στο χρήστη Πανοπλία επιπέδου 8 όταν το φορά. - - Λήψη Μισής Ποσότητας + + Δίνει στο χρήστη Πανοπλία επιπέδου 6 όταν το φορά. - - Τοποθέτηση + + Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν τις φορά. - - Τοποθέτηση Όλων + + Δίνει στο χρήστη Πανοπλία επιπέδου 6 όταν το φορά. - - Τοποθέτηση Ενός Στοιχείου + + Οι σιδερένιες πόρτες μπορούν να ανοίξουν μόνο με Κοκκινόπετρα, κουμπιά ή διακόπτες. - - Ξεσκαρτάρισμα + + Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν το φορά. - - Ξεσκαρτάρισμα Όλων + + Δίνει στο χρήστη Πανοπλία επιπέδου 3 όταν το φορά. - - Ξεσκαρτάρισμα Ενός Στοιχείου + + Χρησιμοποιείται για το κόψιμο ξύλινων κύβων ταχύτερα από ότι με το χέρι. - - Εναλλαγή + + Χρησιμοποιείται για το όργωμα κύβων χώματος και γρασιδιού για την προετοιμασία καλλιέργειας. - - Γρήγορη Κίνηση + + Οι ξύλινες πόρτες ενεργοποιούνται εάν τις χρησιμοποιήσετε, τις χτυπήσετε ή χρησιμοποιήσετε Κοκκινόπετρα. - - Απαλοιφή Γρήγορης Επιλογής + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. - - Τι Είναι Αυτό; + + Δίνει στο χρήστη Πανοπλία επιπέδου 4 όταν το φορά. - - Κοινοποίηση στο Facebook + + Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν τις φορά. - - Αλλαγή Φίλτρου + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. - - Αποστολή Αιτήματος Φιλίας + + Δίνει στο χρήστη Πανοπλία επιπέδου 1 όταν τις φορά. - - Κύλιση Σελίδας προς τα Κάτω + + Δίνει στο χρήστη Πανοπλία επιπέδου 2 όταν το φορά. - - Κύλιση Σελίδας προς τα Επάνω + + Δίνει στο χρήστη Πανοπλία επιπέδου 5 όταν το φορά. - - Επόμενο + + Χρησιμοποιούνται για σκάλες. - - Προηγούμενο + + Χρησιμοποιείται για στιφάδο μανιταριών. Μπορείτε να κρατήσετε το μπολ αφού φάτε το στιφάδο. - - Αποβολή Παίκτη + + Χρησιμοποιείται για την αποθήκευση και τη μεταφορά νερού, λάβας και γάλακτος. - - Βαφή + + Χρησιμοποιείται για την αποθήκευση και τη μεταφορά νερού. - - Εξόρυξη + + Εμφανίζει κείμενο που καταχωρήσατε εσείς ή άλλοι παίκτες. - - Τάισμα + + Χρησιμοποιείται για φωτισμό υψηλότερης έντασης σε σύγκριση με τους πυρσούς. Λιώνει το χιόνι και τον πάγο και μπορεί να χρησιμοποιηθεί κάτω από το νερό. - - Εξημέρωση + + Χρησιμοποιείται για την πρόκληση εκρήξεων. Ενεργοποιείται μετά την τοποθέτηση, αναφλέγοντάς το με το αντικείμενο Πυρόλιθος και Χάλυβας ή με ηλεκτρικό φορτίο. - - Επούλωση + + Χρησιμοποιείται για την αποθήκευση και τη μεταφορά λάβας. - - Κάθισμα + + Εμφανίζει τις θέσεις του Ήλιου και της Σελήνης. - - Ακολούθησέ με + + Δείχνει την αφετηρία σας. - - Εξαγωγή + + Ενώ το κρατάτε, δημιουργεί ένα είδωλο της περιοχής που εξερευνάτε. Μπορεί να χρησιμοποιηθεί για το σχεδιασμό διαδρομής. - - Άδειασμα + + Χρησιμοποιείται για την αποθήκευση και τη μεταφορά γάλακτος. - - Σέλα + + Χρησιμοποιείται για τη δημιουργία φωτιάς, την ανάφλεξη TNT και το άνοιγμα πυλών, μόλις κατασκευαστούν. - - Τοποθέτηση + + Χρησιμοποιείται για ψάρεμα. - - Χτύπημα + + Ενεργοποιούνται εάν τις χρησιμοποιήσετε, τις χτυπήσετε ή χρησιμοποιήσετε κοκκινόπετρα. Λειτουργούν ως κανονικές πόρτες αλλά έχουν διάσταση 1x1 κύβους και είναι επίπεδες στο έδαφος. - - Γάλα + + Χρησιμοποιούνται ως δομικό υλικό και μπορούν να κατασκευάσουν πολλά πράγματα. Μπορούν να δημιουργηθούν από οποιαδήποτε μορφή ξύλου. - - Συλλογή + + Χρησιμοποιείται ως δομικό υλικό. Δεν επηρεάζεται από τη βαρύτητα όπως η κανονική Άμμος. - - Τροφή + + Χρησιμοποιείται ως δομικό υλικό. - - Ύπνος + + Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. - - Αφύπνιση + + Χρησιμοποιείται για την κατασκευή μεγάλων σκαλών. Εάν τοποθετήσετε δύο πλάκες τη μία πάνω στην άλλη, θα δημιουργήσετε έναν κύβο διπλής πλάκας κανονικού μεγέθους. - - Παιχνίδι + + Χρησιμοποιείται για τη δημιουργία φωτός. Οι πυρσοί λιώνουν επίσης το χιόνι και τον πάγο. - - Ίππευση + + Χρησιμοποιείται για την κατασκευή πυρσών, βέλων, σημάτων, σκαλών, φραχτών και ως λαβές για εργαλεία και όπλα. - - Πλεύση + + Χρησιμοποιείται για την αποθήκευση κύβων και αντικειμένων. Τοποθετήστε δύο σεντούκια το ένα δίπλα στο άλλο για να δημιουργήσετε ένα μεγαλύτερο σεντούκι με τη διπλή χωρητικότητα. - - Καλλιέργεια + + Χρησιμοποιείται ως φράγμα και δεν μπορείτε να τον υπερπηδήσετε. Υπολογίζεται με ύψος 1,5 κύβου για τους παίκτες, τα ζώα και τα τέρατα αλλά με ύψος 1 κύβου για άλλους κύβους. - - Κολύμπι προς τα Επάνω + + Χρησιμοποιείται για κατακόρυφο σκαρφάλωμα. - - Άνοιγμα + + Χρησιμοποιείται για να προχωρά το χρόνο προς τα εμπρός οποιαδήποτε στιγμή τη νύχτα προς το ξημέρωμα εάν όλοι οι παίκτες στον κόσμο βρίσκονται στο κρεβάτι και αλλάζει το σημείο επαναφοράς του παίκτη. +Τα χρώματα του κρεβατιού είναι πάντα τα ίδια, ανεξάρτητα από τα χρώματα του μαλλιού που χρησιμοποιήθηκε. - - Αλλαγή Τόνου + + Σας επιτρέπει να δημιουργήσετε μεγαλύτερη ποικιλία αντικειμένων από την κανονική κατασκευή. - - Πυροκρότηση + + Σας επιτρέπει να λιώσετε μέταλλα, να δημιουργήσετε ξυλοκάρβουνο και γυαλί και να μαγειρέψετε ψάρι και χοιρινές μπριζόλες. - - Ανάγνωση + + Σιδερένιο Τσεκούρι - - Κρέμασμα + + Φανάρι Κοκκινόπετρας - - Βολή + + Σκαλοπάτια Ξύλου Ζούγκλας - - Φύτεμα + + Σκαλοπάτια από Σημύδα - - Όργωμα + + Τρέχουσες Ρυθμίσεις Ελέγχου - - Συγκομιδή + + Κρανίο - - Συνέχεια + + Κακάο - - Ξεκλείδωμα Πλήρους Παιχνιδιού + + Σκαλοπάτια από Έλατο - - Διαγραφή Αποθήκευσης + + Αυγό Δράκου - - Διαγραφή + + Πέτρα End - - Επιλογές + + Πλαίσιο Πύλης End - - Πρόσκληση Φίλων + + Σκαλοπάτια από Αμμόλιθο - - Αποδοχή + + Φτέρη - - Ψαλίδι + + Χαμόκλαδο - - Επίπεδο Αποκλεισμού + + Διάταξη - - Επιλογή Skin + + Κατασκευή - - Ανάφλεξη + + Χρήση - - Περιήγηση + + Ενέργεια - - Εγκατάσταση Πλήρους Έκδοσης + + Αθόρυβη Κίνηση/Μείωση Υψόμετρου - - Εγκατάσταση Δοκιμαστικής Έκδοσης + + Αθόρυβη Κίνηση - - Εγκατάσταση + + Ξεσκαρτάρισμα - - Επανεγκατάσταση + + Αλλαγή Αντικειμένων Χεριού - - Επιλογές Αποθήκευσης + + Παύση - - Εκτέλεση Εντολής + + Κάμερα - - Δημιουργία + + Κίνηση/Τρέξιμο - - Μετακίνηση Συστατικού + + Απόθεμα - - Μετακίνηση Καυσίμου + + Άλμα/Αύξηση Υψόμετρου - - Μετακίνηση Εργαλείου + + Άλμα - - Μετακίνηση Πανοπλίας + + Πύλη End - - Μετακίνηση Όπλου + + Μίσχος Κολοκύθας - - Εξοπλισμός + + Καρπούζι - - Τράβηγμα + + Γυάλινο Τζάμι - - Αποδέσμευση + + Πύλη Φράκτη - - Προνόμια + + Κλήματα - - Αποκλεισμός + + Μίσχος Καρπουζιού - - Κύλιση Σελίδας προς τα Επάνω + + Σιδερένια Κάγκελα - - Κύλιση Σελίδας προς τα Κάτω + + Ραγισμένα Πέτρινα Τούβλα - - Λειτουργία Αγάπης + + Τούβλα από Πέτρα με Βρύα - - Ποτό + + Πέτρινα Τούβλα - - Περιστροφή + + Μανιτάρι - - Απόκρυψη + + Μανιτάρι - - Απαλοιφή Όλων των Υποδοχών + + Τούβλα από Λαξευμένη Πέτρα - - OK + + Σκαλοπάτια από Τούβλα - - Ακύρωση + + Φυτό Nether - - Minecraft Store + + Σκαλοπάτια Τούβλων Nether - - Είστε σίγουροι ότι θέλετε να εγκαταλείψετε το τρέχον παιχνίδι σας και να συμμετάσχετε στο νέο; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. + + Φράκτης από Τούβλα Nether - - Έξοδος από το Παιχνίδι + + Καζάνι - - Αποθήκευση Παιχνιδιού + + Βάση Παρασκευής - - Έξοδος Χωρίς Αποθήκευση + + Τραπέζι Μαγέματος - - Είστε σίγουροι ότι θέλετε να αντικαταστήσετε τυχόν προηγούμενα αποθηκευμένα δεδομένα αυτού του κόσμου με την τρέχουσα εκδοχή αυτού του κόσμου; + + Τούβλο Nether - - Είστε σίγουροι ότι θέλετε να βγείτε από το παιχνίδι χωρίς να το αποθηκεύσετε; Θα χάσετε όλη την πρόοδο που έχετε σημειώσει σε αυτόν τον κόσμο! + + Πέτρα Επίστρωσης Ασημόψαρου - - Έναρξη Παιχνιδιού + + Πέτρα Ασημόψαρου - - Βλάβη Δεδομένων Αποθήκευσης + + Σκαλοπ. Πέτρινων Τούβλων - - Αυτά τα δεδομένα αποθήκευσης είναι κατεστραμμένα ή έχουν υποστεί βλάβη. Θα θέλατε να τα διαγράψετε; + + Νούφαρο - - Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού και να αποσυνδέσετε όλους τους παίκτες από το παιχνίδι; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. + + Μυκήλιο - - Έξοδος και αποθήκευση + + Πέτρινο Τούβλο Ασημόψαρου - - Έξοδος χωρίς αποθήκευση + + Αλλαγή Λειτουργίας Κάμερας - - Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού; Τυχόν μη αποθηκευμένη πρόοδος θα χαθεί. + + Αν χάσετε ζωή, αλλά έχετε μπάρα φαγητού με 9 ή περισσότερα{*ICON_SHANK_01*}, η ζωή σας θα αναπληρωθεί αυτόματα. Όταν τρώτε κάτι, αναπληρώνεται η μπάρα φαγητού. - - Είστε σίγουροι ότι θέλετε να βγείτε στο βασικό μενού; Η πρόοδός σας θα χαθεί! + + Καθώς μετακινείστε, σκάβετε και επιτίθεστε, η μπάρα φαγητού μειώνεται{*ICON_SHANK_01*}. Το τρέξιμο και το άλμα με φόρα καταναλώνουν πολύ περισσότερο φαγητό σε σύγκριση με το απλό περπάτημα και άλμα. - - Δημιουργία Νέου Κόσμου + + Καθώς συλλέγετε και δημιουργείτε περισσότερα αντικείμενα, το απόθεμά σας θα γεμίζει.{*B*}
 Πατήστε{*CONTROLLER_ACTION_INVENTORY*} για να ανοίξετε το απόθεμα. - - Αρχή Εκπαιδευτικού Μαθήματος + + Μπορείτε να μετατρέψετε το ξύλο που έχει συλλέξει σε σανίδες. Ανοίξτε το περιβάλλον χρήστη κατασκευής για να τις κατασκευάσετε.{*PlanksIcon*} - - Εκπαιδευτικό Μάθημα + + Η μπάρα φαγητού έχει μειωθεί σε μεγάλο βαθμό και έχετε χάσει ζωή. Φάτε την μπριζόλα που έχετε στο απόθεμά σας για να αναπληρώσετε την μπάρα φαγητού και να θεραπευτείτε σταδιακά.{*ICON*}364{*/ICON*} - - Ονομασία του Κόσμου σας + + Όταν έχετε στο χέρι σας ένα τρόφιμο, πατήστε παρατεταμένα{*CONTROLLER_ACTION_USE*} για να το φάτε και να αναπληρώσετε την μπάρα φαγητού. Δεν μπορείτε να φάτε κάτι, αν η μπάρα φαγητού είναι γεμάτη. - - Εισαγάγετε ένα όνομα για τον κόσμο σας + + Πατήστε{*CONTROLLER_ACTION_CRAFTING*} για να ανοίξετε το περιβάλλον χρήστη κατασκευής. - - Βάλτε τον seed για τη γενιά του κόσμου σας + + Για να τρέξετε, σπρώξτε δύο φορές το{*CONTROLLER_ACTION_MOVE*} γρήγορα προς τα εμπρός. Όταν κρατάτε το{*CONTROLLER_ACTION_MOVE*} προς τα εμπρός, ο χαρακτήρας θα συνεχίσει να τρέχει, εκτός και αν εξαντληθεί ο χρόνος σπριντ ή το φαγητό. - - Φόρτωση Αποθηκευμένου Κόσμου + + Χρησιμοποιήστε το{*CONTROLLER_ACTION_MOVE*} για να κινηθείτε. - - START για να παίξετε + + Χρησιμοποιήστε το{*CONTROLLER_ACTION_LOOK*} για να κοιτάξετε επάνω, κάτω και γύρω σας. - - Έξοδος από το παιχνίδι + + Πατήστε παρατεταμένα{*CONTROLLER_ACTION_ACTION*} για να κόψετε 4 κύβους ξύλου (κορμούς δέντρων).{*B*}Όταν σπάσει ένας κύβος, μπορείτε να σταθείτε δίπλα στο αντικείμενο που αιωρείται για το συλλέξετε και αυτό θα εμφανιστεί στο απόθεμά σας. - - Προέκυψε σφάλμα. Μετάβαση στο βασικό μενού. + + Πατήστε παρατεταμένα{*CONTROLLER_ACTION_ACTION*} για να εξορύξετε και να κόψετε χρησιμοποιώντας το χέρι σας ή οτιδήποτε κρατάτε. Μπορεί να χρειαστεί να κατασκευάσετε ένα εργαλείο για την εξόρυξη ορισμένων κύβων... - - Η σύνδεση απέτυχε + + Πατήστε{*CONTROLLER_ACTION_JUMP*} για να κάνετε άλμα. - - Η σύνδεση χάθηκε + + Πολλές διαδικασίες δημιουργίας μπορεί να αποτελούνται από πολλά βήματα. Τώρα που έχετε μερικές σανίδες, μπορείτε να δημιουργήσετε περισσότερα αντικείμενα. Κατασκευάστε ένα τραπέζι δημιουργίας.{*CraftingTableIcon*} - - Η σύνδεση με τον διακομιστή χάθηκε. Μετάβαση στο βασικό μενού. + + + Η νύχτα μπορεί να φτάσει πριν το καταλάβατε, για αυτό δεν πρέπει να βρίσκεστε έξω αν δεν έχετε προετοιμαστεί κατάλληλα. Μπορείτε να δημιουργήσετε πανοπλία και όπλα, αλλά το πιο σημαντικό είναι να έχετε ένα ασφαλές καταφύγιο. + - - Αποσύνδεση από τον διακομιστή + + Ανοίξτε το δοχείο - - Αποβληθήκατε από το παιχνίδι + + Με την αξίνα, μπορείτε να σκάψετε πιο γρήγορα σκληρούς κύβους, όπως πέτρα και μεταλλεύματα. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα, αντέχουν περισσότερο και σας επιτρέπουν να εξορύσσετε πιο σκληρά υλικά. Δημιουργήστε μια ξύλινη αξίνα.{*WoodenPickaxeIcon*} - - Αποβληθήκατε από το παιχνίδι γιατί πετούσατε + + Χρησιμοποιήστε την αξίνα σας για να εξορύξετε μερικούς κύβους πέτρας. Όταν εξορύσετε κύβους πέτρας, αυτοί παράγουν πέτρα επίστρωσης. Αν συλλέξετε 8 κύβους πέτρας επίστρωσης, μπορείτε να κατασκευάσετε ένα φούρνο. Ενδεχομένως να πρέπει να σκάψετε λίγο στο χώμα για να βρείτε πέτρα, επομένως θα χρειαστείτε το φτυάρι σας.{*StoneIcon*} - - Η προσπάθεια σύνδεσης είχε υπερβολικά μεγάλη διάρκεια + + + Θα πρέπει να συλλέξετε τα υλικά που χρειάζονται για την επισκευή του καταφυγίου. Μπορείτε να κατασκευάσετε τοίχους και οροφή από οποιονδήποτε τύπο πλακιδίου, αλλά θα πρέπει επίσης να δημιουργήσετε μια πόρτα, μερικά παράθυρα και κάποια πηγή φωτισμού. + - - Ο διακομιστής είναι πλήρης + + + Εδώ κοντά βρίσκεται ένα εγκαταλελειμμένο καταφύγιο Μεταλλωρύχων που μπορείτε να επισκευάσετε για να προστατευτείτε τη νύχτα. + - - Ο οικοδεσπότης έχει βγει από το παιχνίδι. + + Με το τσεκούρι, μπορείτε να κόψετε πιο γρήγορα δέντρα και ξύλινα πλακίδια. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα και αντέχουν περισσότερο. Δημιουργήστε ένα ξύλινο τσεκούρι.{*WoodenHatchetIcon*} - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί δεν είστε φίλος με κανέναν από τους συμμετέχοντες. + + Πατήστε το{*CONTROLLER_ACTION_USE*} για να χρησιμοποιήσετε και να τοποθετήσετε αντικείμενα. Μπορείτε να συλλέξετε και πάλι τα αντικείμενα που έχετε τοποθετήσει, αν τα εξορύξετε με το κατάλληλο εργαλείο. - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο οικοδεσπότης σας έχει αποβάλει από το παιχνίδι στο παρελθόν. + + Χρησιμοποιήστε το{*CONTROLLER_ACTION_LEFT_SCROLL*} και το{*CONTROLLER_ACTION_RIGHT_SCROLL*} για να αλλάξετε το αντικείμενο που κρατάτε. - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει παλαιότερη έκδοση του παιχνιδιού. + + Για να συλλέξετε πιο γρήγορα τους κύβους που χρειάζεστε, μπορείτε να δημιουργήσετε τα κατάλληλα εργαλεία για κάθε εργασία. Ορισμένα εργαλεία απαιτούν λαβές από ραβδιά. Δημιουργήστε τώρα μερικά ραβδιά.{*SticksIcon*} - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί ο παίκτης στο παιχνίδι του οποίου προσπαθείτε να συμμετάσχετε παίζει νεότερη έκδοση του παιχνιδιού. + + Με το φτυάρι, μπορείτε να σκάψετε πιο γρήγορα μαλακούς κύβους, όπως το χώμα και το χιόνι. Καθώς συλλέγετε περισσότερα υλικά, θα μπορείτε να δημιουργείτε εργαλεία που λειτουργούν ταχύτερα και αντέχουν περισσότερο. Δημιουργήστε ένα ξύλινο φτυάρι.{*WoodenShovelIcon*} - - Νέος Κόσμος + + Σημαδέψτε το τραπέζι κατασκευής με το σταυρόνημα και πατήστε{*CONTROLLER_ACTION_USE*} για να το ανοίξετε. - - Το Βραβείο Ξεκλειδώθηκε! + + Επιλέξτε το τραπέζι κατασκευής, σημαδέψτε με το σταυρόνημα το σημείο που θέλετε και πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε το τραπέζι κατασκευής. - - Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" του Steve από το Minecraft! + + Το Minecraft είναι ένα παιχνίδι στο οποίο μπορείτε να δημιουργήσετε ό,τι θέλετε με τη σωστή τοποθέτηση κύβων. +Τη νύχτα βγαίνουν τέρατα, γι' αυτό φροντίστε να δημιουργήσετε ένα καταφύγιο προτού να συμβεί αυτό. - - Ζήτω – κερδίσατε μια εικόνα παίκτη "PSN" ενός Creeper! + + - - Ξεκλείδωμα Πλήρους Παιχνιδιού + + - - Παίζετε τη δοκιμαστική έκδοση του παιχνιδιού, αλλά θα χρειαστείτε το πλήρες παιχνίδι για να μπορέσετε να αποθηκεύσετε την πρόοδό σας. -Θέλετε να ξεκλειδώσετε τώρα το πλήρες παιχνίδι; + + - - Παρακαλώ περιμένετε + + - - Δεν βρέθηκαν αποτελέσματα + + - - Φίλτρο: + + - - Φίλοι + + - - Η Βαθμολογία μου + + Διάταξη 1 - - Συνολική + + Κίνηση (Κατά την Πτήση) - - Συμμετοχές: + + Παίκτες/Πρόσκληση - - Κατάταξη + + - - Προετοιμασία Αποθήκευσης Επιπέδου + + Διάταξη 3 - - Προετοιμασία Κομματιών... + + Διάταξη 2 - - Ολοκλήρωση... + + - - Κατασκευή Πεδίου + + - - Προσομοίωση κόσμου για λίγο + + - - Προετοιμασία διακομιστή + + - - Δημιουργία περιοχής spawn + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να ξεκινήσετε τον εκπαιδευτικό οδηγό.{*B*} + Πατήστε{*CONTROLLER_VK_B*}, αν πιστεύετε ότι μπορείτε να παίξετε μόνοι σας. - - Φόρτωση περιοχής spawn + + {*B*}Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε. - - Είσοδος στο Nether + + - - Έξοδος από το Nether + + - - Respawn + + - - Δημιουργία επιπέδου + + - - Φόρτωση επιπέδου + + - - Αποθήκευση παικτών + + - - Σύνδεση με τον οικοδεσπότη + + - - Λήψη πεδίου + + - - Μετάβαση στο παιχνίδι εκτός διαδικτύου + + Κύβος Ασημόψαρου - - Περιμένετε έως ότου ο οικοδεσπότης αποθηκεύσει το παιχνίδι + + Πέτρινη Πλάκα - - Είσοδος στο END + + Ένας συμπαγής τρόπος αποθήκευσης Σιδήρου. - - Έξοδος από το END + + Κύβος Σιδήρου - - Αυτό το κρεβάτι είναι κατειλημμένο + + Πλάκα από Βελανιδιά - - Μόνο τη νύχτα μπορείτε να κοιμηθείτε + + Πλάκα από Αμμόλιθο - - Ο/Η %s κοιμάται σε κρεβάτι. Για να μεταβείτε στο ξημέρωμα, όλοι οι παίκτες πρέπει να κοιμηθούν σε κρεβάτι την ίδια στιγμή. + + Πέτρινη Πλάκα - - Το κρεβάτι στο σπίτι σας έλειπε ή κάτι εμπόδιζε την πρόσβαση σε αυτό + + Ένας συμπαγής τρόπος αποθήκευσης Χρυσού. - - Δεν μπορείτε να ξεκουραστείτε αυτή τη στιγμή, τριγυρίζουν τέρατα + + Λουλούδι - - Κοιμάστε σε κρεβάτι. Για να μεταβείτε στο ξημέρωμα, όλοι οι παίκτες πρέπει να κοιμηθούν σε κρεβάτι την ίδια στιγμή. + + Λευκό Μαλλί - - Εργαλεία και Όπλα + + Πορτοκαλί Μαλλί - - Όπλα + + Κύβος Χρυσού - - Τροφή + + Μανιτάρι - - Οικοδομήματα + + Τριαντάφυλλο - - Πανοπλία + + Πέτρινη Πλάκα - - Μηχανισμοί + + Ράφι Βιβλιοθήκης - - Μεταφορά + + TNT - - Διακοσμητικά + + Τούβλα - - Κύβοι για Κατασκευές + + Πυρσός - - Κοκκινόπετρα και Μεταφορά + + Οψιανός - - Διάφορα + + Πέτρα με Βρύα - - Παρασκευή Φίλτρου + + Πλάκα από Τούβλα Nether - - Εργαλεία, Όπλα και Πανοπλία + + Πλάκα από Βελανιδιά - - Υλικά + + Πλάκα από Πέτρινα Τούβλα - - Αποσυνδέθηκε + + Πλάκα από Τούβλα - - Δυσκολία + + Πλάκα Ξύλου Ζούγκλας - - Μουσική + + Πλάκα από Σημύδα - - Ήχος + + Πλάκα από Έλατο - - Γάμμα + + Φούξια Μαλλί - - Ευαισθησία Παιχνιδιού + + Φύλλα Σημύδας - - Ευαισθησία Περιβάλλοντος Χρήστη + + Φύλλα Ελάτου - - Γαλήνιο + + Φύλλα Βελανιδιάς - - Εύκολο + + Γυαλί - - Κανονικό + + Σφουγγάρι - - Δύσκολο + + Φύλλα Ζούγκλας - - Σε αυτή τη λειτουργία, ο παίκτης ανακτά την υγεία του με την πάροδο του χρόνου και δεν υπάρχουν εχθροί στο περιβάλλον. + + Φύλλα - - Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον, αλλά προκαλούν μικρότερες βλάβες στον παίκτη σε σχέση με τη λειτουργία Κανονικό. + + Βελανιδιά - - Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν τυπικές βλάβες στον παίκτη. + + Έλατο - - Σε αυτή τη λειτουργία, εχθροί εμφανίζονται στο περιβάλλον και προκαλούν σοβαρές βλάβες στον παίκτη. Έχετε τον νου σας και στα Creepers, γιατί δύσκολα θα «ξεχάσουν» την εκρηκτική τους επίθεση, ακόμα και αφού απομακρυνθείτε! + + Σημύδα - - Χρονικό Όριο Δοκιμαστικής Έκδοσης + + Ξύλο Ελάτου - - Το παιχνίδι είναι πλήρες + + Ξύλο Σημύδας - - Δεν ολοκληρώθηκε η συμμετοχή στο παιχνίδι, καθώς δεν υπάρχουν άλλες διαθέσιμες θέσεις + + Ξύλο Ζούγκλας - - Εισαγωγή Κειμένου Πινακίδας + + Μαλλί - - Εισαγάγετε ένα κείμενο για την πινακίδα σας + + Ροζ Μαλλί - - Εισαγωγή Τίτλου + + Γκρι Μαλλί - - Εισαγάγετε έναν τίτλο για τη δημοσίευσή σας + + Ανοιχτό Γκρι Μαλλί - - Εισαγωγή Λεζάντας + + Ανοιχτό Μπλε Μαλλί - - Εισαγάγετε μια λεζάντα για τη δημοσίευσή σας + + Κίτρινο Μαλλί - - Εισαγωγή Περιγραφής + + Ανοιχτό Πράσινο Μαλλί - - Εισαγάγετε μια περιγραφή για τη δημοσίευσή σας + + Γαλανό Μαλλί - - Απόθεμα + + Πράσινο Μαλλί - - Συστατικά + + Κόκκινο Μαλλί - - Βάση Παρασκευής Φίλτρων + + Μαύρο Μαλλί - - Σεντούκι + + Μοβ Μαλλί - - Μαγεία + + Μπλε Μαλλί - - Φούρνος + + Καφέ Μαλλί - - Συστατικό + + Πυρσός (Κάρβουνο) - - Καύσιμο + + Λαμψόπετρα - - Διανομέας + + Άμμος των Ψυχών - - Δεν υπάρχουν προσφορές για περιεχόμενο με δυνατότητα λήψης αυτού του τύπου για τον συγκεκριμένο τίτλο αυτή τη στιγμή. + + Netherrack - - Ο/Η %s συμμετέχει στο παιχνίδι. + + Κύβος Λάπις Λάζουλι - - Ο/Η %s εγκατέλειψε το παιχνίδι. + + Ορυκτό Λάπις Λάζουλι - - Ο/Η %s αποβλήθηκε από το παιχνίδι. + + Πύλη - - Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αποθηκευμένο παιχνίδι; + + Φανάρι από Κολοκύθα - - Αναμονή έγκρισης + + Ζαχαρωτό - - Λογοκριμένο + + Πηλός - - Παίζει τώρα: - + + Κάκτος - - Επαναφορά Ρυθμίσεων + + Κολοκύθα - - Είστε σίγουροι ότι θέλετε να επαναφέρετε τις ρυθμίσεις σας στις προεπιλεγμένες τιμές; + + Φράκτης - - Σφάλμα Φόρτωσης + + Jukebox - - Παιχνίδι του/της %s + + Ένας συμπαγής τρόπος αποθήκευσης Λάπις Λάζουλι. - - Παιχνίδι άγνωστου οικοδεσπότη + + Καταπακτή - - Ο προσκεκλημένος παίκτης αποσυνδέθηκε + + Κλειδωμένο Σεντούκι - - Ένας προσκεκλημένος παίκτης αποσυνδέθηκε, προκαλώντας την απομάκρυνση όλων των προσκεκλημένων παικτών από το παιχνίδι. + + Ημιαγωγός - - Σύνδεση + + Έμβολο με Κόλλα - - Δεν έχετε συνδεθεί. Για να παίξετε αυτό το παιχνίδι, θα πρέπει να συνδεθείτε. Θέλετε να συνδεθείτε τώρα; + + Έμβολο - - Δεν επιτρέπεται το παιχνίδι για πολλούς παίκτες + + Μαλλί (οποιοδήποτε χρώμα) - - Αποτυχία δημιουργίας παιχνιδιού + + Νεκρός Θάμνος - - Αυτόματη Επιλογή + + Κέικ - - Χωρίς Πακέτο: Προεπιλεγμένα Skin + + Κύβος Νότας - - Αγαπημένα Skin + + Διανομέας - - Αποκλεισμένο Επίπεδο + + Ψηλό Γρασίδι - - Το παιχνίδι στο οποίο θα συμμετάσχετε βρίσκεται στη λίστα σας με αποκλεισμένα επίπεδα. -Εάν επιλέξετε να συμμετάσχετε στο παιχνίδι, το επίπεδο θα αφαιρεθεί από τη λίστα σας με αποκλεισμένα επίπεδα. + + Ιστός - - Αποκλεισμός Αυτού του Επιπέδου; + + Κρεβάτι - - Είστε σίγουροι ότι θέλετε να προσθέσετε αυτό το επίπεδο στη λίστα σας με αποκλεισμένα επίπεδα; -Εάν επιλέξετε OK θα βγείτε και από το παιχνίδι. + + Πάγος - - Αφαίρεση από τη Λίστα Αποκλεισμένων + + Τραπέζι Κατασκευής - - Διάστημα Αυτόματης Αποθήκευσης + + Ένας συμπαγής τρόπος αποθήκευσης Διαμαντιών. - - Διάστημα Αυτόματης Αποθήκευσης: ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ + + Κύβος Διαμαντιού - - Λεπτά + + Φούρνος - - Δεν Μπορείτε να την Τοποθετήσετε Εδώ! + + Αγρόκτημα - - Η τοποθέτηση λάβας κοντά στο σημείο spawn επιπέδου δεν επιτρέπεται, λόγω πιθανότητας άμεσου θανάτου των παικτών που κάνουν spawn. + + Σοδειές - - Αδιαφάνεια Περιβάλλοντος Χρήστη + + Ορυκτό Διαμάντι - - Προετοιμασία Αυτόματης Αποθήκευσης Επιπέδου + + Κλουβί Δημιουργίας Τεράτων - - Μέγεθος HUD + + Φωτιά - - Μέγεθος HUD (Διαχωρισμός Οθόνης) + + Πυρσός (Ξυλοκάρβουνο) - - Seed + + Σκόνη Κοκκινόπετρας - - Ξεκλείδωμα Πακέτου Skin + + Σεντούκι - - Για να χρησιμοποιήσετε την εμφάνιση που έχετε επιλέξει, πρέπει να ξεκλειδώσετε αυτό το πακέτο skin. -Θέλετε να ξεκλειδώσετε το πακέτο skin τώρα; + + Σκαλοπάτια από Βελανιδιά - - Ξεκλείδωμα Πακέτου με Υφές + + Πινακίδα - - Για να χρησιμοποιήσετε αυτό το πακέτο με υφές στον κόσμο σας, πρέπει να το ξεκλειδώσετε. -Θέλετε να το ξεκλειδώσετε τώρα; + + Ορυκτή Κοκκινόπετρα - - Δοκιμαστικό Πακέτο με Υφές + + Σιδερένια Πόρτα - - Χρησιμοποιείτε μια δοκιμαστική έκδοση του πακέτου με υφές. Δεν θα μπορέσετε να αποθηκεύσετε αυτόν τον κόσμο αν δεν ξεκλειδώσετε την πλήρη έκδοση. -Θέλετε να ξεκλειδώσετε την πλήρη έκδοση του πακέτου με υφές; + + Πλάκα Πίεσης - - Το Πακέτο με Υφές δεν Βρίσκεται Εδώ + + Χιόνι - - Ξεκλείδωμα Πλήρους Έκδοσης + + Κουμπί - - Λήψη Δοκιμαστικής Έκδοσης + + Πυρσός Κοκκινόπετρας - - Λήψη Πλήρους Έκδοσης + + Μοχλός - - Αυτός ο κόσμος χρησιμοποιεί ένα μικτό πακέτο ή ένα πακέτο με υφές που δεν διαθέτετε! -Θέλετε να εγκαταστήσετε το μικτό πακέτο ή το πακέτο με υφές τώρα; + + Ράγα - - Απόκτηση Δοκιμαστικής Έκδοσης + + Σκάλα - - Απόκτηση Πλήρους Έκδοσης + + Ξύλινη Πόρτα - - Αποβολή παίκτη + + Πέτρινα Σκαλοπάτια - - Είστε σίγουροι ότι θέλετε να αποβάλετε αυτόν τον παίκτη από το παιχνίδι; Δεν θα μπορέσει να συμμετάσχει ξανά έως ότου κάνετε επανεκκίνηση του κόσμου. + + Ράγα Εντοπισμού - - Πακέτα Εικόνων Παικτών + + Ηλεκτρική Ράγα - - Θέματα + + Έχετε συλλέξει αρκετή πέτρα επίστρωσης για να κατασκευάσετε ένα φούρνο. Δημιουργήστε τον με το τραπέζι κατασκευής. - - Πακέτα Skin + + Καλάμι Ψαρέματος - - Να επιτρέπονται οι φίλοι φίλων + + Ρολόι - - Δεν μπορείτε να συμμετάσχετε σε αυτό το παιχνίδι, γιατί η πρόσβαση σε αυτό επιτρέπεται σε παίκτες που είναι φίλοι του οικοδεσπότη. + + Σκόνη Λαμψόπετρας - - Δεν Μπορείτε να Συμμετάσχετε στο Παιχνίδι + + Βαγόνι με Φούρνο - - Επιλεγμένο + + Αυγό - - Επιλεγμένη skin: + + Πυξίδα - - Κατεστραμμένο Περιεχόμενο με Δυνατότητα Λήψης + + Ωμό Ψάρι + + + Τριανταφυλλί - - Αυτό το περιεχόμενο με δυνατότητα λήψης είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. + + Πράσινο του Κάκτου - - Μέρος του περιεχομένου με δυνατότητα λήψης που διαθέτετε είναι κατεστραμμένο και δεν είναι δυνατή η χρήση του. Πρέπει να το διαγράψετε και να το επανεγκαταστήσετε από το μενού του Minecraft Store. + + Καρποί Κακάο - - Η λειτουργία παιχνιδιού έχει αλλάξει + + Ψημένο Ψάρι - - Μετονομασία του Κόσμου σας + + Σκόνη Βαφής - - Εισαγάγετε το νέο όνομα για τον κόσμο σας + + Ασκός Μελάνης - - Λειτουργία Παιχνιδιού: Επιβίωση + + Βαγόνι με Σεντούκι - - Λειτουργία Παιχνιδιού: Δημιουργία + + Χιονόμπαλα - - Επιβίωση + + Βάρκα - - Δημιουργία + + Δέρμα - - Δημιουργήθηκε στην «Επιβίωση» + + Βαγόνι Ορυχείου - - Δημιουργήθηκε στη «Δημιουργία» + + Σέλα - - Αναπαράσταση Σύννεφων + + Κοκκινόπετρα - - Τι θέλετε να κάνετε με αυτό το αποθηκευμένο παιχνίδι; + + Κουβάς Γάλατος - - Μετονομασία Αποθήκευσης + + Χαρτί - - Αυτόματη Αποθήκευση σε %d... + + Βιβλίο - - Ενεργοποίηση + + Μπάλα Κόλλας - - Απενεργοποίηση + + Τούβλο - - Κανονικό + + Πηλός - - Εντελώς Επίπεδο + + Ζαχαρωτά - - Όταν είναι ενεργοποιημένο, το παιχνίδι θα είναι διαδικτυακό. + + Λάπις Λάζουλι - - Όταν είναι ενεργοποιημένο, μόνο παίκτες που έχουν προσκληθεί θα μπορούν να συμμετάσχουν. + + Χάρτης - - Όταν είναι ενεργοποιημένο, φίλοι όσων βρίσκονται στη Λίστα Φίλων σας θα μπορούν να συμμετάσχουν στο παιχνίδι. + + Δίσκος Μουσικής - "13" - - Όταν είναι ενεργοποιημένο, οι παίκτες θα μπορούν να προκαλέσουν βλάβες σε άλλους παίκτες. Επηρεάζει μόνο τη λειτουργία Επιβίωση. + + Δίσκος Μουσικής - "Γάτα" - - Όταν είναι απενεργοποιημένο, οι παίκτες που συμμετέχουν στο παιχνίδι δεν μπορούν να κάνουν κατασκευές ή εξόρυξη έως ότου λάβουν άδεια. + + Κρεβάτι - - Όταν είναι ενεργοποιημένο, η φωτιά μπορεί να επεκταθεί σε κοντινούς εύφλεκτους κύβους. + + Αγωγός Κοκκινόπετρας - - Όταν είναι ενεργοποιημένο, το ΤΝΤ θα ανατιναχθεί όταν πυροδοτηθεί. + + Μπισκότο - - Όταν είναι ενεργοποιημένο, ο κόσμος Nether θα αναδημιουργηθεί. Αυτό είναι χρήσιμο εάν έχετε αποθηκεύσει παλαιότερο παιχνίδι όταν δεν υπήρχαν Κάστρα Nether. + + Δίσκος Μουσικής - "Κύβοι" - - Όταν είναι ενεργοποιημένο, οικοδομήματα όπως Χωριά και Οχυρά θα δημιουργηθούν στον κόσμο. + + Δίσκος Μουσικής - "Ήρεμη" - - Όταν είναι ενεργοποιημένο, θα δημιουργηθεί ένας εντελώς επίπεδος κόσμος στο Overworld και στο Nether. + + Δίσκος Μουσικής - "Τζαζ" - - Όταν είναι ενεργοποιημένο, θα δημιουργηθεί ένα σεντούκι που θα περιέχει ορισμένα χρήσιμα αντικείμενα κοντά στο σημείο που θα κάνει spawn ο παίκτης. + + Δίσκος Μουσικής - "Τροπικό" - - Πακέτα Skin + + Δίσκος Μουσικής - "Τιτίβισμα" - - Θέματα + + Δίσκος Μουσικής - "Μακριά" - - Εικόνες Παικτών + + Δίσκος Μουσικής - "Ψώνια" - - Άβαταρ + + Κέικ - - Πακέτα με Υφές + + Γκρίζα Βαφή - - Μικτά Πακέτα + + Ροζ Βαφή - - Ο/Η {*PLAYER*} τυλίχτηκε στις φλόγες + + Ανοιχτή Πράσινη Βαφή - - Ο/Η {*PLAYER*} κάηκε + + Μοβ Βαφή - - Ο/Η {*PLAYER*} προσπάθησε να κολυμπήσει σε λάβα + + Γαλανή Βαφή - - Ο/Η {*PLAYER*} πέθανε από ασφυξία μέσα σε τοίχο + + Ανοιχτή Γκρίζα Βαφή - - Ο/Η {*PLAYER*} πνίγηκε + + Κίτρινο Ηλίανθου - - Ο/Η {*PLAYER*} πέθανε από πείνα + + Πάστα Οστών - - Ο/Η {*PLAYER*} πέθανε από τα πολλά τσιμπήματα + + Κόκκαλο - - Ο/Η {*PLAYER*} έπεσε στο έδαφος μεγαλοπρεπώς + + Ζάχαρη - - Ο/Η {*PLAYER*} έπεσε έξω από τον κόσμο + + Ανοιχτή Μπλε Βαφή - - Ο/Η {*PLAYER*} πέθανε + + Φούξια Βαφή - - Ο/Η {*PLAYER*} ανατινάχτηκε + + Πορτοκαλί Βαφή - - Ο/Η {*PLAYER*} σκοτώθηκε από μαγικά + + Πινακίδα - - Ο/Η {*PLAYER*} σκοτώθηκε από ανάσα Δράκου του End + + Δερμάτινο Χιτώνιο - - Ο/Η {*PLAYER*} σφαγιάστηκε από {*SOURCE*} + + Σιδερένιος Θώρακας - - Ο/Η {*PLAYER*} σφαγιάστηκε από {*SOURCE*} + + Αδαμάντινος Θώρακας - - Ο/Η {*PLAYER*} πυροβολήθηκε από {*SOURCE*} + + Σιδερένια Περικεφαλαία - - Ο/Η {*PLAYER*} δέχθηκε χτύπημα με φλεγόμενη σφαίρα από {*SOURCE*} + + Αδαμάντινη Περικεφαλαία - - Ο/Η {*PLAYER*} γρονθοκοπήθηκε από {*SOURCE*} + + Χρυσή Περικεφαλαία - - Ο/Η {*PLAYER*} σκοτώθηκε από {*SOURCE*} + + Χρυσός Θώρακας - - Ομίχλη Καθαρού Βράχου + + Χρυσή Περισκελίδα - - Προβολή HUD + + Δερμάτινες Μπότες - - Προβολή Χεριού + + Σιδερένιες Μπότες - - Μηνύματα Θανάτου + + Δερμάτινο Παντελόνι - - Κινούμενος Χαρακτήρας + + Σιδερένια Περισκελίδα - - Μετατροπή σε Κινούμενο Χαρακτήρα + + Αδαμάντινη Περισκελίδα - - Δεν μπορείτε πλέον να κάνετε εξόρυξη ή χρήση αντικειμένων + + Δερμάτινος Σκούφος - - Μπορείτε πλέον να κάνετε εξόρυξη και χρήση αντικειμένων + + Πέτρινο Σκαλιστήρι - - Δεν μπορείτε πλέον να τοποθετήσετε κύβους + + Σιδερένιο Σκαλιστήρι + + + Αδαμάντινο Σκαλιστήρι - - Μπορείτε πλέον να τοποθετήσετε κύβους + + Αδαμάντινο Τσεκούρι - - Μπορείτε πλέον να χρησιμοποιήσετε πόρτες και διακόπτες + + Χρυσό Τσεκούρι - - Δεν μπορείτε πλέον να χρησιμοποιήσετε πόρτες και διακόπτες + + Ξύλινο Σκαλιστήρι - - Μπορείτε πλέον να χρησιμοποιήσετε δοχεία (π.χ. σεντούκια) + + Χρυσό Σκαλιστήρι - - Δεν μπορείτε πλέον να χρησιμοποιήσετε δοχεία (π.χ. σεντούκια) + + Σιδερόπλεκτος Θώρακας - - Δεν μπορείτε πλέον να επιτίθεστε σε mob + + Σιδερόπλεκτη Περισκελίδα - - Μπορείτε πλέον να επιτίθεστε σε mob + + Σιδερόπλεκτες Μπότες - - Δεν μπορείτε πλέον να επιτίθεστε σε παίκτες + + Ξύλινη Πόρτα - - Μπορείτε πλέον να επιτίθεστε σε παίκτες + + Σιδερένια Πόρτα - - Δεν μπορείτε πλέον να επιτίθεστε σε ζώα + + Σιδερόπλεκτη Περικεφαλαία - - Μπορείτε πλέον να επιτίθεστε σε ζώα + + Αδαμάντινες Μπότες - - Είστε πλέον επόπτης + + Φτερό - - Δεν είστε πλέον επόπτης + + Μπαρούτι - - Μπορείτε πλέον να πετάξετε + + Σπόροι Σιταριού - - Δεν μπορείτε πλέον να πετάξετε + + Μπολ - - Δεν θα εξαντλείστε πια + + Μανιταρόσουπα - - Στο εξής θα εξαντλείστε + + Σπάγκος - - Είστε πλέον αόρατος + + Σιτάρι - - Δεν είστε πλέον αόρατος + + Ψημένη Χοιρινή Μπριζόλα - - Είστε πλέον άτρωτος + + Πίνακας - - Δεν είστε πλέον άτρωτος + + Χρυσό Μήλο - - %d MSP + + Ψωμί - - Δράκος του End + + Πυρόλιθος - - Ο/Η %s μπήκε στο End + + Ωμή Χοιρινή Μπριζόλα - - Ο/Η %s βγήκε από το End + + Ραβδί - - -{*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*}Μερικές φορές αισθανόταν ότι η φύση του ήταν ανθρώπινη, καθώς στεκόταν στον λεπτό φλοιό μιας περιστρεφόμενης σφαίρας από λιωμένη πέτρα. Η σφαίρα από λιωμένη πέτρα περιστρεφόταν γύρω από μια σφαίρα φλεγόμενων αερίων που ήταν τριακόσιες τριάντα χιλιάδες φορές μεγαλύτερη. Ήταν τόσο μακριά η μία από την άλλη, που το φως χρειαζόταν οκτώ λεπτά για να διανύσει την απόσταση. Το φως ήταν πληροφορία από ένα άστρο και μπορούσε να κάψει το δέρμα σου ακόμα και από απόσταση εκατόν πενήντα εκατομμυρίων χιλιομέτρων.{*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*}Μερικές φορές πίστευε ότι βρισκόταν σε ένα σύμπαν φτιαγμένο από ενέργεια που αποτελούνταν από στιγμές εκτός και εντός λειτουργίας, από μηδενικά και μονάδες, από γραμμές κώδικα. Μερικές φορές πίστευε ότι παίζει ένα παιχνίδι. Μερικές φορές πίστευε ότι διαβάζει λέξεις σε μια οθόνη.{*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*} -{*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*} - + + Κουβάς Λάβας - - Επαναφορά του Nether + + Χρυσές Μπότες - - Είστε σίγουροι ότι θέλετε να επαναφέρετε το Nether στην προεπιλεγμένη του κατάσταση σε αυτό το αποθηκευμένο παιχνίδι; Θα χάσετε όλα όσα έχετε κατασκευάσει στο The Nether! + + Ράβδος Σιδήρου - - Επαναφορά του Nether + + Ράβδος Χρυσού - - Να μην γίνει επαναφορά του Nether + + Πυρόλιθος και Χάλυβας - - Δεν είναι δυνατό το κούρεμα αυτού του Mooshroom αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων και Γατών. + + Κάρβουνο - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Γουρουνιών, Προβάτων, Αγελάδων και Γατών. + + Ξυλοκάρβουνο - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Mooshroom. + + Διαμάντι - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Λύκων για έναν κόσμο. + + Μήλο - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Κοτόπουλων για έναν κόσμο. + + Τόξο - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό Καλαμαριών για έναν κόσμο. + + Βέλος - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό εχθρών για έναν κόσμο. + + Δίσκος Μουσικής - "Σκοτάδι" - - Δεν είναι δυνατή η χρήση του Αβγού Spawn αυτή τη στιγμή. Έχετε φτάσει τον μέγιστο αριθμό χωρικών για έναν κόσμο. + + + Πατήστε{*CONTROLLER_VK_LB*} και{*CONTROLLER_VK_RB*} για να αλλάξετε τον τύπο ομάδας των αντικειμένων που θέλετε να κατασκευάσετε. Επιλέξτε την ομάδα κατασκευών.{*StructuresIcon*} + - - Έχετε φτάσει τον μέγιστο αριθμό Πινάκων/Πλαισίων Αντικειμένων για έναν κόσμο. + + + Πατήστε{*CONTROLLER_VK_LB*} και{*CONTROLLER_VK_RB*} για να αλλάξετε τον τύπο ομάδας των αντικειμένων που θέλετε να κατασκευάσετε. Επιλέξτε την ομάδα εργαλείων.{*ToolsIcon*} + - - Δεν μπορείτε να κάνετε spawn σε εχθρούς στη λειτουργία Γαλήνιο. + + + Τώρα κατασκευάσατε ένα τραπέζι κατασκευής που θα πρέπει να τοποθετήσετε στον κόσμο για να μπορείτε να κατασκευάσετε μια μεγαλύτερη συλλογή αντικειμένων.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. + + + + + Έχετε κάνει μια εξαιρετική αρχή με τα εργαλεία που έχετε κατασκευάσει και μπορείτε να συλλέγετε διάφορα υλικά με πιο αποτελεσματικό τρόπο.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. + - - Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Γουρουνιών, Προβάτων, Αγελάδων και Γατών. + + + Πολλές διαδικασίες κατασκευής μπορεί να αποτελούνται από πολλά βήματα. Τώρα που έχετε μερικές σανίδες, μπορείτε να κατασκευάσετε περισσότερα αντικείμενα. Χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να αλλάξετε το αντικείμενο που θέλετε να κατασκευάσετε. Επιλέξτε το τραπέζι κατασκευής.{*CraftingTableIcon*} + - - Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Λύκων. + + + Χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να αλλάξετε το αντικείμενο που θέλετε να κατασκευάσετε. Ορισμένα αντικείμενα έχουν περισσότερες από μία εκδοχές, ανάλογα με τα υλικά που χρησιμοποιούνται. Επιλέξτε το ξύλινο φτυάρι.{*WoodenShovelIcon*} + - - Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Κοτόπουλων. + + Μπορείτε να μετατρέψετε το ξύλο που έχει συλλέξει σε σανίδες. Επιλέξτε το εικονίδιο με τις σανίδες και πατήστε{*CONTROLLER_VK_A*} για να τις δημιουργήσετε.{*PlanksIcon*} - - Αυτό το ζώο δεν μπορεί να μπει στη Λειτουργία Αγάπης. Έχετε φτάσει τον μέγιστο αριθμό εκτρεφόμενων Mooshroom. + + + Μπορείτε να κατασκευάσετε μια μεγαλύτερη συλλογή αντικειμένων χρησιμοποιώντας ένα τραπέζι κατασκευής. Η κατασκευή σε τραπέζι λειτουργεί όπως και η βασική κατασκευή, αλλά έχετε μεγαλύτερη επιφάνεια κατασκευής που καθιστά δυνατή την πραγματοποίηση περισσότερων συνδυασμών συστατικών. + - - Έχετε φτάσει τον μέγιστο αριθμό Βαρκών για έναν κόσμο. + + + Η περιοχή κατασκευής εμφανίζει τα αντικείμενα που χρειάζεστε για να κατασκευάσετε το νέο αντικείμενο. Πατήστε{*CONTROLLER_VK_A*} για να κατασκευάσετε το αντικείμενο και να το τοποθετήσετε στο απόθεμά σας. + - - Έχετε φτάσει τον μέγιστο αριθμό Κεφαλών Mob για έναν κόσμο. + + + Πραγματοποιήστε κύλιση στις καρτέλες Τύπου Ομάδας στην επάνω πλευρά χρησιμοποιώντας το{*CONTROLLER_VK_LB*} και το{*CONTROLLER_VK_RB*} για να επιλέξετε τον τύπο ομάδας του αντικειμένου που θέλετε να κατασκευάσετε και έπειτα χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να επιλέξετε το αντικείμενο που θα κατασκευάσετε. + - - Αντίστρ. Κάμερας + + + Τώρα προβάλλεται η λίστα συστατικών που απαιτούνται για τη δημιουργία του επιλεγμένου αντικειμένου. + - - Αριστερό Κροσέ + + + Τώρα προβάλλεται η περιγραφή του τρέχοντος επιλεγμένου αντικειμένου. Η περιγραφή μπορεί να σας δώσει μια ιδέα σχετικά με τις πιθανές χρήσεις του αντικειμένου. + - - Πεθάνατε! + + + Στο κάτω δεξιό μέρος του περιβάλλοντος χρήστη κατασκευής, εμφανίζεται το απόθεμά σας. Σε αυτήν την περιοχή, μπορεί επίσης να εμφανίζεται μια περιγραφή του τρέχοντος επιλεγμένου στοιχείου, καθώς και τα συστατικά που απαιτούνται για την κατασκευή του. + - - Respawn + + + Ορισμένα αντικείμενα δεν μπορούν να δημιουργηθούν χρησιμοποιώντας το τραπέζι κατασκευής και απαιτείται φούρνος. Κατασκευάστε έναν φούρνο τώρα.{*FurnaceIcon*} + - - Προσφορές Περιεχομένου με Δυνατότητα Λήψης + + Χαλίκι - - Αλλαγή Skin + + Ορυκτός Χρυσός - - Πώς να Παίξετε + + Ορυκτός Σίδηρος - - Πλήκτρα Ελέγχου + + Λάβα - - Ρυθμίσεις + + Άμμος - - Συντελεστές - + + Αμμόλιθος - - Επανεγκατάσταση Περιεχομένου + + Ορυκτό Κάρβουνο - - Ρυθμίσεις Εντοπισμού Σφαλμάτων + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε το φούρνο. + - - Εξάπλωση Φωτιάς + + + Αυτό είναι το περιβάλλον χρήστη φούρνου. Ο φούρνος επιτρέπει την αλλαγή αντικειμένων φλογίζοντάς τα. Για παράδειγμα, μπορείτε να μετατρέψετε κομμάτια σιδήρου σε ράβδους σιδήρου στο φούρνο. + - - Ανατίναξη TNT + + + Τοποθετήστε το φούρνο που κατασκευάσατε στον κόσμο. Καλό θα ήταν να τον βάλετε στο καταφύγιό σας.{*B*}
 Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το περιβάλλον χρήστη κατασκευής. + - - Παίκτης εναντίον Παίκτη + + Ξύλο - - Εμπιστοσύνη προς Παίκτες + + Ξύλο Βελανιδιάς - - Προνόμια Οικοδεσπότη + + + Πρέπει να βάλετε καύσιμο στο κάτω μέρος του φούρνου και στη συνέχεια, το αντικείμενο που θέλετε να αλλάξετε στο επάνω μέρος. Ο φούρνος τότε θα ανάψει και θα ξεκινήσει να δουλεύει. Το αποτέλεσμα βγαίνει στη δεξιά υποδοχή. + - - Δημιουργία Οικοδομημάτων + + {*B*} + Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστεί ξανά το απόθεμα. + - - Εντελώς Επίπεδος Κόσμος + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε το απόθεμα. + - - Σεντούκι Μπόνους + + + Αυτό είναι το απόθεμά σας. Περιέχει τα αντικείμενα που είναι διαθέσιμα για χρήση με τα χέρια σας και όλα τα υπόλοιπα αντικείμενα που κουβαλάτε. Εδώ εμφανίζεται και η πανοπλία σας. + - - Επιλογές Κόσμου + + + {*B*}
 Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε με τον εκπαιδευτικό οδηγό.{*B*}
 Πατήστε{*CONTROLLER_VK_B*}, αν πιστεύετε ότι μπορείτε να παίξετε μόνοι σας. + - - Δυνατότητα Κατασκευών και Εξόρυξης + + + Εάν μετακινήσετε το δείκτη έξω από τα όρια του περιβάλλοντος χρήστη ενώ έχετε ένα αντικείμενο στο δείκτη, μπορείτε να ξεσκαρτάρετε το αντικείμενο. + - - Δυνατότητα Χρήσης Πορτών και Διακοπτών + + + Μετακινήστε αυτό το αντικείμενο με το δείκτη σε μια άλλη θέση στο απόθεμα και τοποθετήστε το με το {*CONTROLLER_VK_A*}. + Όταν έχετε πολλά αντικείμενα στο δείκτη, χρησιμοποιήστε το{*CONTROLLER_VK_A*} για να τα τοποθετήσετε όλα ή το{*CONTROLLER_VK_X*} για να τοποθετήσετε μόνο ένα. + - - Δυνατότητα Ανοίγματος Δοχείων + + + Χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να μετακινήσετε το δείκτη. Χρησιμοποιήστε το{*CONTROLLER_VK_A*} για να επιλέξετε ένα αντικείμενο κάτω από το δείκτη. + Αν υπάρχουν περισσότερα από ένα αντικείμενα στην ίδια θέση, θα τα συλλέξετε όλα ή μπορείτε να χρησιμοποιήσετε το{*CONTROLLER_VK_X*} για να συλλέξετε τα μισά. + - - Δυνατότητα Επίθεσης σε Παίκτες + + + Έχετε ολοκληρώσει το πρώτο μέρος του εκπαιδευτικού οδηγού. + - - Δυνατότητα Επίθεσης σε Ζώα + + Χρησιμοποιήστε το φούρνο για να δημιουργήσετε γυαλί. Ενώ περιμένετε, γιατί δεν συγκεντρώνετε περισσότερα υλικά για να ολοκληρώσετε το καταφύγιο; - - Επόπτης + + Χρησιμοποιήστε το φούρνο για να δημιουργήσετε ξυλοκάρβουνο. Ενώ περιμένετε, γιατί δεν συγκεντρώνετε περισσότερα υλικά για να ολοκληρώσετε το καταφύγιο; - - Αποβολή Παίκτη + + Πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε το φούρνο στον κόσμο και ανοίξτε τον. - - Δυνατότητα Πτήσης + + Τη νύχτα το σκοτάδι είναι πολύ πυκνό, επομένως θα χρειαστείτε κάποια πηγή φωτισμού στο καταφύγιο για να μπορείτε να βλέπετε. Δημιουργήστε έναν πυρσό από ραβδιά και ξυλοκάρβουνο στο περιβάλλον χρήστη κατασκευής.{*TorchIcon*} - - Απενεργοποίηση Εξάντλησης + + Πατήστε{*CONTROLLER_ACTION_USE*} για να τοποθετήσετε την πόρτα. Μπορείτε να χρησιμοποιήσετε το {*CONTROLLER_ACTION_USE*} για να ανοίξετε και να κλείσετε τις ξύλινες πόρτες που βρίσκετε στον κόσμο. - - Αόρατο + + Τα σωστά καταφύγια διαθέτουν πόρτες που σας επιτρέπουν να μπαινοβγαίνετε, χωρίς να πρέπει να σκάβετε και να ξαναχτίζετε τους τοίχους. Δημιουργήστε μια ξύλινη πόρτα τώρα.{*WoodenDoorIcon*} - - Επιλογές Οικοδεσπότη + + + Εάν θέλετε περισσότερες πληροφορίες σχετικά με ένα αντικείμενο, μετακινήστε το δείκτη επάνω από το αντικείμενο και πατήστε{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + - - Παίκτες/Πρόσκληση + + + Αυτό είναι το περιβάλλον χρήστη κατασκευής. Αυτή η οθόνη σάς επιτρέπει να συνδυάζετε τα αντικείμενα που έχετε συλλέξει για να κατασκευάσετε νέα αντικείμενα. + - - Διαδικτυακό Παιχνίδι + + + Πατήστε{*CONTROLLER_VK_B*} τώρα για να βγείτε από το απόθεμα της λειτουργίας δημιουργίας. + - - Μόνο Πρόσκληση + + + Εάν θέλετε περισσότερες πληροφορίες σχετικά με ένα αντικείμενο, μετακινήστε το δείκτη επάνω από το αντικείμενο και πατήστε{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + - - Περισσότερες Επιλογές + + {*B*} + Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστούν τα συστατικά που απαιτούνται για την κατασκευή του τρέχοντος αντικειμένου. + - - Φόρτωση + + {*B*} + Πατήστε{*CONTROLLER_VK_X*} για να εμφανιστεί η περιγραφή του αντικειμένου. + - - Νέος Κόσμος + + {*B*} + Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*} + Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να κατασκευάσετε αντικείμενα. + - - Όνομα Κόσμου + + + Πραγματοποιήστε κύλιση στις καρτέλες Τύπου Ομάδας στην επάνω πλευρά χρησιμοποιώντας το{*CONTROLLER_VK_LB*} και το{*CONTROLLER_VK_RB*} για να επιλέξετε τον τύπο ομάδας του αντικειμένου που θέλετε να επιλέξετε. + - - Seed για το Πρόγραμμα Δημιουργίας Κόσμου + + {*B*} + Πατήστε{*CONTROLLER_VK_A*} για να συνεχίσετε.{*B*} + Πατήστε{*CONTROLLER_VK_B*}, εάν γνωρίζετε ήδη πώς να χρησιμοποιείτε το απόθεμα λειτουργίας δημιουργίας. + - - Αφήστε το κενό για έναν τυχαίο seed + + + Αυτό είναι το απόθεμα της λειτουργίας δημιουργίας. Περιέχει τα αντικείμενα που είναι διαθέσιμα για χρήση με τα χέρια σας και όλα τα υπόλοιπα αντικείμενα που μπορείτε να επιλέξετε. + - - Παίκτες + + + Πατήστε{*CONTROLLER_VK_B*} για να βγείτε από το απόθεμα. + - - Συμμετοχή στο Παιχνίδι + + + Εάν μετακινήσετε το δείκτη έξω από τα όρια του περιβάλλοντος χρήστη έχοντας ένα αντικείμενο στο δείκτη, μπορείτε να ξεσκαρτάρετε το αντικείμενο στον κόσμο. Για να εκκαθαρίσετε όλα τα αντικείμενα στην μπάρα γρήγορης επιλογής, πατήστε{*CONTROLLER_VK_X*}. + - - Έναρξη Παιχνιδιού + + + Ο δείκτης θα μετακινηθεί αυτόματα σε μια θέση στη γραμμή χρήσης. Μπορείτε να αφήσετε το αντικείμενο χρησιμοποιώντας το{*CONTROLLER_VK_A*}. Μόλις τοποθετήσετε το αντικείμενο, ο δείκτης θα επιστρέψει στη λίστα αντικειμένων για να επιλέξετε ένα άλλο αντικείμενο. + - - Δεν Βρέθηκαν Παιχνίδια + + + Χρησιμοποιήστε το{*CONTROLLER_MENU_NAVIGATE*} για να μετακινήσετε το δείκτη. + Στη λίστα αντικειμένων, χρησιμοποιήστε το{*CONTROLLER_VK_A*} για να συλλέξετε ένα αντικείμενο κάτω από το δείκτη και χρησιμοποιήστε το{*CONTROLLER_VK_Y*} για να συλλέξετε μια στοίβα αυτού του αντικειμένου. + - - Παιχνίδι + + Νερό - - Πίνακες Κορυφαίων + + Γυάλινο Μπουκάλι - - Βοήθεια και Επιλογές + + Μπουκάλι Νερού - - Ξεκλείδωμα Πλήρους Παιχνιδιού + + Μάτι Αράχνης - - Συνέχιση Παιχνιδιού + + Ψήγμα Χρυσού - - Αποθήκευση Παιχνιδιού + + Φυτό Nether - - Δυσκολία: + + {*splash*}{*prefix*}Φίλτρο {*postfix*} - - Τύπος Παιχνιδιού: + + Ζυμωμένο Μάτι Αράχν. - - Οικοδομήματα: + + Καζάνι - - Τύπος Επιπέδου: + + Μάτι του Ender - - Παίκτης εναντίον Παίκτη (PvP): + + Γυαλιστερό Καρπούζι - - Εμπιστοσύνη προς Παίκτες: + + Σκόνη Blaze - - TNT: + + Κρέμα Μάγματος - - Εξάπλωση Φωτιάς: + + Βάση Παρασκευής - - Επανεγκατάσταση Θέματος + + Δάκρυ Ghast - - Επανεγκατάσταση Εικόνας Παίκτη 1 + + Σπόροι Κολοκύθας - - Επανεγκατάσταση Εικόνας Παίκτη 2 + + Σπόροι Καρπουζιού - - Επανεγκατάσταση Άβαταρ 1 + + Ωμό Κοτόπουλο - - Επανεγκατάσταση Άβαταρ 2 + + Δίσκος μουσικής - "11" - - Επανεγκατάσταση Άβαταρ 3 + + Δίσκος Μουσικής - "Πού Είμαστε Τώρα" - - Επιλογές + + Ψαλίδια - - Ήχος + + Ψημένο Κοτόπουλο - - Έλεγχος + + Μαργαριτάρι του Ender - - Γραφικά + + Φέτα Καρπουζιού - - Περιβάλλον Χρήστη + + Ράβδος Blaze - - Επαναφορά Προεπιλογών + + Ωμό Μοσχάρι - - Προβολή Κίνησης Κάμερας + + Μπριζόλα - - Συμβουλές + + Σάπιο Κρέας - - Συμβουλές Εργαλείων Εντός του Παιχνιδιού + + Μπουκάλι Μαγέματος - - Κατακόρυφος Διαχωρισμός Οθόνης για 2 Παίκτες + + Σανίδες από Βελανιδιά - - Ολοκληρώθηκε + + Σανίδες από Έλατο - - Επεξεργασία μηνύματος πινακίδας: + + Σανίδες από Σημύδα - - Συμπληρώστε τα στοιχεία που θα συνοδεύουν το στιγμιότυπο οθόνης σας + + Κύβοι Γρασιδιού - - Λεζάντα + + Χώμα - - Στιγμιότυπο οθόνης από το παιχνίδι + + Πέτρα Επίστρωσης - - Επεξεργασία μηνύματος πινακίδας: + + Σανίδ. Ξύλου Ζούγκλας - - Οι υφές, τα εικονίδια και το περιβάλλον χρήστη του κλασικού Minecraft! + + Βλαστάρι Σημύδας - - Προβολή όλων των Μικτών Κόσμων + + Βλαστάρι Ζούγκλας - - Χωρίς Eπίδραση + + Καθαρός Βράχος - - Ταχύτητα + + Βλαστάρι - - Βραδύτητα + + Βλαστάρι Βελανιδιάς - - Βιασύνη + + Βλαστάρι Ελάτου - - Κούραση Λόγω Εξόρυξης + + Πέτρα - - Δύναμη + + Πλαίσιο Αντικειμένου - - Αδυναμία + + Δημιουργία {*CREATURE*} - - Άμεση Υγεία + + Τούβλο Nether - - Άμεση Βλάβη + + Μπάλα Φωτιάς - - Ώθηση Άλματος + + Μπάλα Φωτιάς (Ξυλοκ.) - - Ναυτία + + Μπάλα Φωτιάς (Κάρβ.) - - Αναδημιουργία + + Κρανίο - - Αντοχή + + Κεφάλι - - Πυραντοχή + + Κεφάλι από %s - - Αναπνοή στο Νερό + + Κεφάλι Creeper - - Αορατότητα + + Κρανίο Σκελετού - - Τυφλότητα + + Κρανίο Μαύρου Σκελετού - - Νυχτερινή Όραση + + Κεφάλι Ζόμπι - - Πείνα + + Ένας τρόπος αποθήκευσης Κάρβουνου που δεν πιάνει χώρο. Μπορεί να χρησιμοποιηθεί ως καύσιμο σε έναν Κλίβανο. Δηλητήριο - - Γρηγοράδας + + Πείνα Βραδύτητας - - Βιασύνης + + Γρηγοράδας - - Ανίας + + Αορατότητα - - Δύναμης + + Αναπνοή στο Νερό - - Αδυναμίας + + Νυχτερινή Όραση - - Επούλωσης + + Τυφλότητα Πρόκλησης Βλάβης - - Άλματος + + Επούλωσης Ναυτίας @@ -5195,29 +6053,38 @@ Αναδημιουργίας - - Αντοχής + + Ανίας - - Πυραντοχής + + Βιασύνης - - Αναπνοής στο Νερό + + Αδυναμίας - - Αορατότητας + + Δύναμης - - Τυφλότητας + + Πυραντοχή - - Νυχτερινής Όρασης + + Κορεσμός - - Πείνας + + Αντοχής - - Δηλητηρίου + + Άλματος + + + Wither + + + Ώθηση Υγείας + + + Απορρόφηση @@ -5228,29 +6095,41 @@ III + + Αορατότητας + IV - - Πιτσιλιστό + + Αναπνοής στο Νερό - - Κοινότοπο + + Πυραντοχής - - Ανιαρό + + Νυχτερινής Όρασης - - Ήπιο + + Δηλητηρίου - - Διαφανές + + Πείνας - - Γαλακτερό + + της Απορρόφησης - - Διάχυτο + + του Κορεσμού + + + της Ώθησης Υγείας + + + Τυφλότητας + + + της Αποσύνθεσης Ακατέργαστο @@ -5258,17 +6137,17 @@ Αραιό - - Δυσάρεστο + + Διάχυτο - - Μονότονο + + Διαφανές - - Ογκώδες + + Γαλακτερό - - Κακοφτιαγμένο + + Δυσάρεστο Βουτυρένιο @@ -5276,164 +6155,188 @@ Κρεμώδες - - Γλυκόπιοτο + + Κακοφτιαγμένο - - Κομψό + + Μονότονο - - Παχύ + + Ογκώδες - - Εκλεπτυσμένο + + Ήπιο - - Φανταχτερό + + Πιτσιλιστό - - Γοητευτικό + + Κοινότοπο + + + Ανιαρό Τολμηρό - - Διυλισμένο - Τονωτικό + + Γοητευτικό + + + Εκλεπτυσμένο + + + Φανταχτερό + Λαμπερό + + Δύσοσμο + + + Τραχύ + + + Άοσμο + Ισχυρό Απαίσιο - - Άοσμο + + Γλυκόπιοτο - - Δύσοσμο + + Διυλισμένο - - Τραχύ + + Παχύ - - Στυφό + + Κομψό - - Αηδιαστικό + + Αποκαθιστά σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. - - Βρομερό + + Χειροτερεύει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. - - Χρησιμοποιείται ως βάση για όλα τα φίλτρα. Χρησιμοποιήστε το σε μια βάση παρασκευής φίλτρων. + + Οι παίκτες, τα ζώα και τα τέρατα στα οποία επιδρά, αποκτούν ανοσία στις βλάβες από φωτιά, λάβα και από τις επιθέσεις παραταγμένων Blaze. Δεν προκαλεί καμία επίδραση. Μπορείτε να το χρησιμοποιήσετε για να δημιουργήσετε φίλτρα σε μια βάση παρασκευής φίλτρων, προσθέτοντας περισσότερα συστατικά. - - Επιταχύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, αυξάνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. + + Στυφό Επιβραδύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, μειώνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. + + Επιταχύνει την κίνηση των παικτών, των ζώων και των τεράτων στα οποία επιδρά. Επίσης, αυξάνει την ταχύτητα σπριντ, το μήκος άλματος και το οπτικό πεδίο των παικτών. + Αυξάνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. - - Μειώνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. - Βελτιώνει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. - - Χειροτερεύει αμέσως την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + Μειώνει τις βλάβες από την επίθεση σε παίκτες και τέρατα στα οποία επιδρά. - - Αποκαθιστά σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + Χρησιμοποιείται ως βάση για όλα τα φίλτρα. Χρησιμοποιήστε το σε μια βάση παρασκευής φίλτρων. - - Οι παίκτες, τα ζώα και τα τέρατα στα οποία επιδρά, αποκτούν ανοσία στις βλάβες από φωτιά, λάβα και από τις επιθέσεις παραταγμένων Blaze. + + Αηδιαστικό - - Χειροτερεύει σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. + + Βρομερό + + + Πλήγμα Οξύτητα - - Πλήγμα + + Χειροτερεύει σταδιακά την υγεία των παικτών, των ζώων και των τεράτων στα οποία επιδρά. - - Εξολόθρευση των Αρθρόποδων + + Ζημιά Επίθεσης Χτύπημα προς τα Πίσω - - Πυρανάλωμα + + Εξολόθρευση των Αρθρόποδων - - Προστασία + + Ταχύτητα - - Προστασία από Φωτιά + + Ενισχύσεις Ζόμπι - - Ανάλαφρη Πτώση + + Δύναμη Άλματος Αλόγου - - Προστασία από Έκρηξη + + Όταν εφαρμόζεται: - - Προστασία από Βλήματα + + Αντοχή στο Χτύπημα προς τα Πίσω - - Αναπνοή + + Εύρος παρακολούθησης mob - - Ένα με το Νερό + + Μέγιστη Υγεία + + + Μεταξένιο Άγγιγμα Αποδοτικότητα - - Μεταξένιο Άγγιγμα + + Ένα με το Νερό - - Άθραυστο + + Τύχη Λεηλασία - - Τύχη + + Άθραυστο - - Ισχύς + + Προστασία από Φωτιά - - Φλόγα + + Προστασία - - Γροθιά + + Πυρανάλωμα - - Άπειρο + + Ανάλαφρη Πτώση - - I + + Αναπνοή - - II + + Προστασία από Βλήματα - - III + + Προστασία από Έκρηξη IV @@ -5444,23 +6347,29 @@ VI + + Γροθιά + VII - - VIII + + III - - IX + + Φλόγα - - X + + Ισχύς - - Λιώνοντάς το μπορεί να εξάγει Σμαράγδια. + + Άπειρο - - Μοιάζει με Σεντούκι, με τη διαφορά ότι τα αντικείμενα που τοποθετούνται σε ένα Σεντούκι του End είναι διαθέσιμα σε κάθε Σεντούκι του End που έχει ο παίκτης, ακόμη και σε διαφορετικές διαστάσεις. + + II + + + I Ενεργοποιείται όταν μια οντότητα περάσει μέσα από ένα συνδεδεμένο Σύρμα Παγίδευσης. @@ -5471,51 +6380,75 @@ Συμπαγής τρόπος για την αποθήκευση Σμαραγδιών. + + Μοιάζει με Σεντούκι, με τη διαφορά ότι τα αντικείμενα που τοποθετούνται σε ένα Σεντούκι του End είναι διαθέσιμα σε κάθε Σεντούκι του End που έχει ο παίκτης, ακόμη και σε διαφορετικές διαστάσεις. + + + IX + + + VIII + + + Μπορεί να εξορυχτεί με Σιδερένια ή και καλύτερη Αξίνα για τη συλλογή Σμαραγδιών. + + + X + + + Αποκαθιστά 2{*ICON_SHANK_01*} και μπορείτε να κατασκευάσετε με αυτό ένα χρυσό καρότο. Μπορεί να φυτευτεί σε αγρόκτημα. + + + Χρησιμοποιείται ως διακοσμητικό. Σε αυτό μπορείτε να φυτέψετε Λουλούδια, Βλαστάρια, Κάκτους και Μανιτάρια. + Τοίχος φτιαγμένος από Πέτρα Επίστρωσης. - - Μπορεί να χρησιμοποιηθεί για την επισκευή όπλων, εργαλείων και πανοπλίας. + + Αποκαθιστά 0,5{*ICON_SHANK_01*}. Μπορεί να ψηθεί σε φούρνο ή να φυτευτεί σε αγρόκτημα. Λιώνει σε φούρνο για να παράγει Χαλαζία του Nether. - - Χρησιμοποιείται ως διακοσμητικό. + + Μπορεί να χρησιμοποιηθεί για την επισκευή όπλων, εργαλείων και πανοπλίας. Μπορεί να χρησιμοποιηθεί σε συναλλαγές με χωρικούς. - - Χρησιμοποιείται ως διακοσμητικό. Σε αυτό μπορείτε να φυτέψετε Λουλούδια, Βλαστάρια, Κάκτους και Μανιτάρια. + + Χρησιμοποιείται ως διακοσμητικό. - - Αποκαθιστά 2{*ICON_SHANK_01*} και μπορείτε να κατασκευάσετε με αυτό ένα χρυσό καρότο. Μπορεί να φυτευτεί σε αγρόκτημα. + + Αποκαθιστά 4{*ICON_SHANK_01*}. - - Αποκαθιστά 0,5{*ICON_SHANK_01*}. Μπορεί να ψηθεί σε φούρνο ή να φυτευτεί σε αγρόκτημα. + + Αποκαθιστά 1{*ICON_SHANK_01*}. Αν το φάτε, υπάρχει πιθανότητα να σας δηλητηριάσει. + + + Χρησιμοποιείται για να ελέγχει ένα σελωμένο γουρούνι όταν το ιππεύετε. Αποκαθιστά 3{*ICON_SHANK_01*}. Δημιουργείται από το ψήσιμο μιας πατάτας σε φούρνο. - - Αποκαθιστά 1{*ICON_SHANK_01*} ή μπορείτε να το ψήσετε σε φούρνο. Μπορεί να φυτευτεί σε αγρόκτημα. Αν το φάτε, υπάρχει πιθανότητα να σας δηλητηριάσει. - Αποκαθιστά 3{*ICON_SHANK_01*}. Κατασκευάζεται από ένα καρότο και ψήγματα χρυσού. - - Χρησιμοποιείται για να ελέγχει ένα σελωμένο γουρούνι όταν το ιππεύετε. - - - Αποκαθιστά 4{*ICON_SHANK_01*}. - Χρησιμοποιείται με ένα Αμόνι για να μαγεύετε όπλα, εργαλεία ή πανοπλίες. Δημιουργείται από την εξόρυξη του Μεταλλεύματος Χαλαζία του Nether. Μπορεί να χρησιμοποιηθεί στην κατασκευή ενός Κύβου Χαλαζία. + + Πατάτα + + + Ψητή Πατάτα + + + Καρότο + Κατασκευάζεται από Μαλλί. Χρησιμοποιείται ως διακοσμητικό. @@ -5525,14 +6458,11 @@ Γλάστρα - - Καρότο - - - Πατάτα + + Κολοκυθόπιτα - - Ψητή Πατάτα + + Μαγεμένο Βιβλίο Δηλητηριώδης Πατάτα @@ -5543,11 +6473,11 @@ Καρότο σε Ραβδί - - Κολοκυθόπιτα + + Γάτζος Σύρματος - - Μαγεμένο Βιβλίο + + Σύρμα Παγίδευσης Χαλαζίας του Nether @@ -5558,11 +6488,8 @@ Σεντούκι του End - - Γάτζος Σύρματος - - - Σύρμα Παγίδευσης + + Πέτρινο Τοίχος με Βρυά Κύβος Σμαραγδιών @@ -5570,8 +6497,8 @@ Πέτρινο Τοίχος - - Πέτρινο Τοίχος με Βρυά + + Πατάτες Γλάστρα @@ -5579,8 +6506,8 @@ Καρότα - - Πατάτες + + Λίγο Χαλασμένο Αμόνι Αμόνι @@ -5588,8 +6515,8 @@ Αμόνι - - Λίγο Χαλασμένο Αμόνι + + Κύβος Χαλαζία Πολύ Χαλασμένο Αμόνι @@ -5597,8 +6524,8 @@ Μετάλλευμα Χαλαζία του Nether - - Κύβος Χαλαζία + + Σκάλα Χαλαζία Σμιλεμένος Χαλαζίας @@ -5606,8 +6533,8 @@ Στήλη Κύβου Χαλαζία - - Σκάλα Χαλαζία + + Κόκκινο Χαλί Χαλί @@ -5615,8 +6542,8 @@ Μαύρο Χαλί - - Κόκκινο Χαλί + + Μπλε Χαλί Πράσινο Χαλί @@ -5624,9 +6551,6 @@ Καφέ Χαλί - - Μπλε Χαλί - Μοβ Χαλί @@ -5639,18 +6563,18 @@ Γκρι Χαλί - - Ροζ Χαλί - Ανοιχτό Πράσινο Χαλί - - Κίτρινο Χαλί + + Ροζ Χαλί Γαλάζιο Χαλί + + Κίτρινο Χαλί + Φούξια Χαλί @@ -5663,89 +6587,84 @@ Σμιλεμένος Αμμόλιθος + + Ο/Η {*PLAYER*} σκοτώθηκε προσπαθώντας να χτυπήσει τον/την {*SOURCE*} + Στιλπνός Αμμόλιθος - - Ο/Η {*PLAYER*} σκοτώθηκε προσπαθώντας να χτυπήσει {*SOURCE*} - Ο/Η {*PLAYER*} συνθλίφτηκε κάτω από ένα Αμόνι. Ο/Η {*PLAYER*} συνθλίφθηκε κάτω από έναν κύβο. - - Ο/Η {*PLAYER*} τηλεμεταφέρθηκε στον/στην {*DESTINATION*} - Ο/Η {*PLAYER*} σας τηλεμετέφερε στη θέση του/της - - Ο/Η {*PLAYER*} τηλεμεταφέρθηκε σε εσάς + + Ο/Η {*PLAYER*} τηλεμεταφέρθηκε στον/στην {*DESTINATION*} Αγκάθια - - Πλάκα Χαλαζία + + Ο/Η {*PLAYER*} τηλεμεταφέρθηκε σε εσάς Φωτίζει τις σκοτεινές περιοχές σαν το φως της μέρας, ακόμη και κάτω από το νερό. + + Πλάκα Χαλαζία + Κάνει αόρατους τους παίκτες, τα ζώα και τα τέρατα στα οποία επιδρά. Επισκευή και Όνομα - - Κόστος Μαγικού: %d - Πολύ Ακριβό! - - Μετονομασία + + Κόστος Μαγικού: %d Έχετε: - - Απαιτούμενα Αντικείμενα + + Μετονομασία Ο/Η {*VILLAGER_TYPE*} προσφέρει %s - - Επισκευή + + Απαιτούμενα Αντικείμενα Ανταλλαγή - - Βαφή κολάρου + + Επισκευή Αυτό είναι το περιβάλλον χρήστη Αμόνι, το οποίο μπορείτε να χρησιμοποιείτε για να μετονομάζετε, να επισκευάζετε και να εφαρμόζετε μαγικά σε όπλα, πανοπλίες ή εργαλεία, πληρώνοντας σε Επίπεδα Εμπειρίας. - - - {*B*} - Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το περιβάλλον χρήστη Αμόνι.{*B*} - Πατήστε{*CONTROLLER_VK_B*} εάν ήδη γνωρίζετε το περιβάλλον χρήστη Αμόνι. - + + Βαφή κολάρου Για να αρχίσετε να εργάζεστε σε ένα αντικείμενο, τοποθετήστε το στην πρώτη υποδοχή εισερχομένων. - + - Όταν τοποθετήσετε τη σωστή πρώτη ύλη στη δεύτερη υποδοχή εισόδου (π.χ. Ράβδους Σιδήρου για ένα κατεστραμμένο Σιδερένιο Σπαθί), η προτεινόμενη επισκευή θα εμφανιστεί στην υποδοχή εξόδου. + {*B*} + Πατήστε{*CONTROLLER_VK_A*} για να μάθετε περισσότερα σχετικά με το περιβάλλον χρήστη Αμόνι.{*B*} + Πατήστε{*CONTROLLER_VK_B*} εάν ήδη γνωρίζετε το περιβάλλον χρήστη Αμόνι. @@ -5753,9 +6672,9 @@ Εναλλακτικά, μπορείτε να τοποθετήσετε ένα δεύτερο, πανομοιότυπο αντικείμενο στη δεύτερη υποδοχή, για να συνδυάσετε τα δυο αντικείμενα. - + - Για να μαγέψετε αντικείμενα στο Αμόνι, βάλτε ένα Μαγεμένο Βιβλίο στη δεύτερη υποδοχή εισόδου. + Όταν τοποθετήσετε τη σωστή πρώτη ύλη στη δεύτερη υποδοχή εισόδου (π.χ. Ράβδους Σιδήρου για ένα κατεστραμμένο Σιδερένιο Σπαθί), η προτεινόμενη επισκευή θα εμφανιστεί στην υποδοχή εξόδου. @@ -5763,9 +6682,9 @@ Το κόστος της εργασίας σε Επίπεδα Εμπειρίας εμφανίζεται κάτω από την έξοδο. Αν δεν έχετε αρκετά Επίπεδα Εμπειρίας, η επισκευή δεν μπορεί να ολοκληρωθεί. - + - Μπορείτε να μετονομάσετε το αντικείμενο, αλλάζοντας το όνομα που εμφανίζεται στο πλαίσιο κειμένου. + Για να μαγέψετε αντικείμενα στο Αμόνι, βάλτε ένα Μαγεμένο Βιβλίο στη δεύτερη υποδοχή εισόδου. @@ -5773,9 +6692,9 @@ Η συλλογή του επιδιορθωμένου αντικειμένου θα καταναλώσει και τα δυο αντικείμενα που χρησιμοποιήθηκαν στο Αμόνι και θα μειώσει τα Επίπεδα Εμπειρίας σας κατά το αναγραφόμενο ποσό. - + - Σε αυτήν την περιοχή υπάρχει ένα Αμόνι και ένα Σεντούκι που περιέχει εργαλεία και όπλα που μπορείτε να επεξεργαστείτε. + Μπορείτε να μετονομάσετε το αντικείμενο, αλλάζοντας το όνομα που εμφανίζεται στο πλαίσιο κειμένου. @@ -5785,9 +6704,9 @@ Πατήστε το{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη σχετικά με το Αμόνι. - + - Χρησιμοποιώντας ένα Αμόνι, μπορείτε να επισκευάσετε τα όπλα και τα εργαλεία, ώστε να αποκαταστήσετε την αντοχή τους, να τα μετονομάσετε ή να τα μαγέψετε με Μαγεμένα Βιβλία. + Σε αυτήν την περιοχή υπάρχει ένα Αμόνι και ένα Σεντούκι που περιέχει εργαλεία και όπλα που μπορείτε να επεξεργαστείτε. @@ -5795,9 +6714,9 @@ Τα Μαγεμένα Βιβλία μπορούν να βρεθούν σε Σεντούκια μέσα σε μπουντρούμια ή να μετατραπούν από κανονικά Βιβλία σε Μαγεμένα Βιβλία, στο Τραπέζι Μαγέματος. - + - Η χρήση του Αμονιού κοστίζει Επίπεδα Εμπειρίας και με κάθε χρήση υπάρχει πιθανότητα το Αμόνι να πάθει ζημιά. + Χρησιμοποιώντας ένα Αμόνι, μπορείτε να επισκευάσετε τα όπλα και τα εργαλεία, ώστε να αποκαταστήσετε την αντοχή τους, να τα μετονομάσετε ή να τα μαγέψετε με Μαγεμένα Βιβλία. @@ -5805,9 +6724,9 @@ Το κόστος της επισκευής θα εξαρτηθεί από τον τύπο της εργασίας, την αξία του αντικειμένου, από το πόσα μάγια έχει πάνω του το αντικείμενο, καθώς και από τις προηγούμενες επεξεργασίες. - + - Η μετονομασία ενός αντικειμένου αλλάζει το όνομα με το οποίο αυτό εμφανίζεται σε όλους τους παίκτες και μειώνει μόνιμα το κόστος της προηγούμενης επεξεργασίας. + Η χρήση του Αμονιού κοστίζει Επίπεδα Εμπειρίας και με κάθε χρήση υπάρχει πιθανότητα το Αμόνι να πάθει ζημιά. @@ -5815,9 +6734,9 @@ Στο Σεντούκι αυτής της περιοχής θα βρείτε κατεστραμμένες Αξίνες, πρώτες ύλες, Μποτίλιες Μαγείας και Μαγεμένα Βιβλία, για να πειραματιστείτε. - + - Αυτό είναι το περιβάλλον χρήστη ανταλλαγής, όπου εμφανίζονται οι ανταλλαγές που μπορούν να γίνουν με έναν χωρικό. + Η μετονομασία ενός αντικειμένου αλλάζει το όνομα με το οποίο αυτό εμφανίζεται σε όλους τους παίκτες και μειώνει μόνιμα το κόστος της προηγούμενης επεξεργασίας. @@ -5827,9 +6746,9 @@ Πατήστε το{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη σχετικά με το περιβάλλον χρήστη ανταλλαγής. - + - Όλες οι ανταλλαγές που θέλει προς το παρόν να κάνει ο χωρικός εμφανίζονται στην κορυφή. + Αυτό είναι το περιβάλλον χρήστη ανταλλαγής, όπου εμφανίζονται οι ανταλλαγές που μπορούν να γίνουν με έναν χωρικό. @@ -5837,9 +6756,9 @@ Αν δεν έχετε τα απαιτούμενα αντικείμενα, οι ανταλλαγές θα εμφανίζονται κόκκινες και θα είναι μη διαθέσιμες. - + - Η ποσότητα και ο τύπος των αντικειμένων που δίνετε στον χωρικό εμφανίζεται στα δυο πλαίσια στην αριστερή πλευρά. + Όλες οι ανταλλαγές που θέλει προς το παρόν να κάνει ο χωρικός εμφανίζονται στην κορυφή. @@ -5847,9 +6766,9 @@ Στα δυο κουτιά στην αριστερή πλευρά μπορείτε να δείτε το συνολικό αριθμό των αντικειμένων που απαιτούνται για την ανταλλαγή. - + - Πατήστε το{*CONTROLLER_VK_A*}, για να ανταλλάξετε τα αντικείμενα που ζητά ο χωρικός με το αντικείμενο που προσφέρει. + Η ποσότητα και ο τύπος των αντικειμένων που δίνετε στον χωρικό εμφανίζεται στα δυο πλαίσια στην αριστερή πλευρά. @@ -5857,11 +6776,9 @@ Σε αυτήν την περιοχή υπάρχει ένας χωρικός και ένα Σεντούκι που περιέχει Χαρτί, για να αγοράσετε αντικείμενα. - + - {*B*} - Πατήστε το{*CONTROLLER_VK_A*} , για να μάθετε περισσότερα σχετικά με την ανταλλαγή.{*B*} - Πατήστε το{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη σχετικά με την ανταλλαγή. + Πατήστε το{*CONTROLLER_VK_A*}, για να ανταλλάξετε τα αντικείμενα που ζητά ο χωρικός με το αντικείμενο που προσφέρει. @@ -5869,14 +6786,21 @@ Οι παίκτες μπορούν να ανταλλάξουν αντικείμενα από το απόθεμά τους με τους χωρικούς. - + - Οι ανταλλαγές που μπορεί να προσφέρει ένας χωρικός εξαρτώνται από το επάγγελμά του. + {*B*} + Πατήστε το{*CONTROLLER_VK_A*} , για να μάθετε περισσότερα σχετικά με την ανταλλαγή.{*B*} + Πατήστε το{*CONTROLLER_VK_B*} αν γνωρίζετε ήδη σχετικά με την ανταλλαγή. Τα αντικείμενα που διαθέτει για ανταλλαγή ένας χωρικός θα αυξάνονται ή θα ενημερώνονται τυχαία, με την πραγματοποίηση μιας ποικιλίας ανταλλαγών. + + + + + Οι ανταλλαγές που μπορεί να προσφέρει ένας χωρικός εξαρτώνται από το επάγγελμά του. @@ -5932,7 +6856,7 @@ Τηλεμεταφορά σε Εμένα - Δυνατότητα Απενεργοποίησης της Εξάντλησης + Δυνατότητα Απενεργ. της Εξάντλησης Δυνατότητα Αόρατου @@ -6039,7 +6963,4 @@ Θεραπεία - - Εύρεση Σπόρου για το Δημιουργό Κόσμων. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsPlatformSpecific.xml index 91a28ad9..0ed041b3 100644 --- a/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/el-EL/stringsPlatformSpecific.xml @@ -1,243 +1,246 @@  - - NOT USED + + Θέλετε να συνδεθείτε στο "PSN"; - - Μπορείτε να χρησιμοποιήσετε την οθόνη αφής στο σύστημα PlayStation®Vita για να πλοηγηθείτε στα μενού! + + Για τους παίκτες που δεν βρίσκονται στο ίδιο σύστημα PlayStation®Vita με τον οικοδεσπότη, εάν ορίσετε αυτή την επιλογή θα αποβάλλετε τον παίκτη από το παιχνίδι και τυχόν άλλους παίκτες στο σύστημα PlayStation®Vita του. Αυτός ο παίκτης δεν θα μπορεί να συμμετέχει μέχρι να ξεκινήσει ξανά το παιχνίδι. - - Το minecraftforum διαθέτει μια ενότητα ειδικά για το PlayStation®Vita Edition . + + SELECT - - Θα μαθαίνετε τις τελευταίες πληροφορίες για αυτό το παιχνίδι στο twitter @4JStudios και @Kappische! + + Αυτή η επιλογή απενεργοποιεί τα τρόπαια και τις ενημερώσεις πίνακα κατάταξης για αυτόν τον κόσμο κατά τη διάρκεια του παιχνιδιού, καθώς και σε περίπτωση επαναφόρτωσης του παιχνιδιού που έχει αποθηκευτεί με αυτήν τη λειτουργία ενεργοποιημένη. - - Μην κοιτάτε ποτέ ένα Enderman στα μάτια! + + σύστημα PlayStation®Vita - - Φαίνεται ότι τα 4J Studios κατάργησαν τον Herobrine από το παιχνίδι για το σύστημα PlayStation®Vita, αλλά δεν είμαστε και πολύ σίγουροι. + + Επιλέξτε μια σύνδεση Ad Hoc για να συνδεθείτε με άλλα κοντινά συστήματα PlayStation®Vita ή με το "PSN" για να συνδεθείτε με φίλους από όλο τον κόσμο. - - Το Minecraft: PlayStation®Vita Edition έσπασε πολλά ρεκόρ! + + Δίκτυο Ad Hoc - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΓΙΑ ΠΟΛΛΟΥΣ ΠΑΙΚΤΕΣ{*ETW*}{*B*}{*B*} -Από προεπιλογή, το Minecraft στο σύστημα PlayStation®Vita είναι ένα παιχνίδι για πολλούς παίκτες.{*B*}{*B*} -Όταν ξεκινάτε ή συμμετέχετε σε ένα διαδικτυακό παιχνίδι, αυτή η ενέργεια θα είναι ορατή στα άτομα που βρίσκονται στη λίστα φίλων σας (εκτός αν έχετε ορίσει την επιλογή «Μόνο με Πρόσκληση» κατά τη δημιουργία του παιχνιδιού) και αν οι φίλοι σας συμμετάσχουν στο παιχνίδι, αυτό θα είναι επίσης ορατό στα άτομα στις δικές τους λίστες φίλων (αν έχετε ορίσει την επιλογή «Να Επιτρέπονται οι Φίλοι Φίλων»).{*B*} -Όταν βρίσκεστε σε ένα παιχνίδι, μπορείτε να πατήσετε το κουμπί SELECT, για να δείτε μια λίστα με όλους τους υπόλοιπους παίκτες που συμμετέχουν στο παιχνίδι, καθώς και να αποβάλλετε παίκτες από το παιχνίδι. + + Αλλαγή Λειτουργίας δικτύου - - {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΚΟΙΝΟΠΟΙΗΣΗ ΣΤΙΓΜΙΟΤΥΠΩΝ ΟΘΟΝΗΣ{*ETW*}{*B*}{*B*} -Μπορείτε να καταγράψετε ένα στιγμιότυπο οθόνης από το παιχνίδι σας, εμφανίζοντας το Μενού Παύσης και πατώντας το{*CONTROLLER_VK_Y*}, για Κοινοποίηση στο Facebook. Θα δείτε μια μικρογραφία του στιγμιότυπου οθόνης και θα μπορείτε να επεξεργαστείτε το κείμενο που θα κοινοποιήσετε μαζί με το στιγμιότυπο στο Facebook.{*B*}{*B*} -Υπάρχει μια λειτουργία κάμερας ειδικά για τη λήψη αυτών των στιγμιοτύπων, έτσι ώστε στο στιγμιότυπο να φαίνεται η μπροστινή όψη του χαρακτήρα σας. Πατήστε το{*CONTROLLER_ACTION_CAMERA*} έως ότου δείτε την μπροστινή όψη του χαρακτήρα σας, προτού πατήσετε το{*CONTROLLER_VK_Y*} για Κοινοποίηση.{*B*}{*B*} -Το Διαδικτυακό ID δεν θα εμφανίζεται στο στιγμιότυπο οθόνης. + + Επιλογή Λειτουργίας δικτύου - - {*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*} για κίνηση προς τα δεξιά. + + Διαδικτυακά ID Διαχωρισμένης Οθόνης - - Για να μπορέσετε να πετάξετε, πατήστε το{*CONTROLLER_ACTION_JUMP*} δυο φορές γρήγορα. Για να εγκαταλείψετε την πτήση, επαναλάβετε την ενέργεια. Για να πετάξετε γρηγορότερα, πιέστε γρήγορα και διαδοχικά το{*CONTROLLER_ACTION_MOVE*} προς τα εμπρός δύο φορές ενώ πετάτε. -Όταν βρίσκεστε σε λειτουργία πτήσης, μπορείτε να κρατήσετε πατημένο το{*CONTROLLER_ACTION_JUMP*} για κίνηση προς τα πάνω και το{*CONTROLLER_ACTION_SNEAK*} για κίνηση προς τα κάτω ή να χρησιμοποιήσετε τα κατευθυντικά πλήκτρα για να κινηθείτε προς τα πάνω, κάτω, αριστερά ή δεξιά. + + Τρόπαια - - ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ + + Αυτό το παιχνίδι διαθέτει μια λειτουργία αυτόματης αποθήκευσης επιπέδων. Όταν εμφανίζεται το παραπάνω εικονίδιο, το παιχνίδι αποθηκεύει τα δεδομένα σας. +Μην απενεργοποιείτε το σύστημα PlayStation®Vita όσο αυτό το εικονίδιο εμφανίζεται στην οθόνη. - - ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ + + Όταν ενεργοποιηθεί, ο οικοδεσπότης μπορεί να εναλλάσσει το να πετά, να απενεργοποιεί την εξάντληση και να γίνετε αόρατος από το μενού. Απενεργοποιεί τα τρόπαια και τις ενημερώσεις κατάταξης. - - «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» + + Διαδικτυακά ID: - - «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» + + Χρησιμοποιείτε τη δοκιμαστική έκδοση ενός πακέτου υφών. Θα έχετε πρόσβαση στα πλήρη περιεχόμενα του πακέτου υφών, αλλά δεν θα είστε σε θέση να αποθηκεύσετε την πρόοδό σας. +Αν επιχειρήσετε να αποθηκεύσετε ενώ βρίσκεστε στη δοκιμαστική έκδοση, θα σας δοθεί η επιλογή να αγοράσετε την πλήρη έκδοση. + - - Πρόσκληση Φίλων + + Ενημερωμένη έκδοση 1.04 (Ενημέρωση τίτλου 14) - - Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο στη Λειτουργία Δημιουργίας, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί στη Λειτουργία Επιβίωσης. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; + + Διαδικτυακά ID Παιχνιδιού - - Αυτός ο κόσμος αποθηκεύτηκε προηγουμένως στη Λειτουργία Δημιουργίας και τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; + + Κοιτάξτε τι έφτιαξα στο Minecraft: PlayStation®Vita Edition! - - Αυτός ο κόσμος αποθηκεύτηκε προηγουμένως στη Λειτουργία Δημιουργίας και τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν. + + Η λήψη απέτυχε. Προσπαθήστε ξανά αργότερα. - - Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο με τα Προνόμια Οικοδεσπότη ενεργοποιημένα, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί με αυτές τις επιλογές απενεργοποιημένες. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; + + Αποτυχία συμμετοχής στο παιχνίδι λόγω περιοριστικού τύπου NAT. Ελέγξτε τις ρυθμίσεις δικτύου σας. - - Η σύνδεση με το "PSN" χάθηκε. Έξοδος στο κύριο μενού. + + Η μεταφόρτωση απέτυχε. Προσπαθήστε ξανά αργότερα. - - Η σύνδεση με το "PSN" χάθηκε. + + Η λήψη ολοκληρώθηκε! - - Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®Vita Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα τρόπαιο! -Ξεκλειδώστε το πλήρες παιχνίδι για να απολαύσετε τo Minecraft: PlayStation®Vita Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". -Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + +Δεν υπάρχει αποθηκευμένο παιχνίδι στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών αυτήν τη στιγμή. +Μπορείτε να μεταφορτώσετε έναν αποθηκευμένο κόσμο στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών χρησιμοποιώντας το Minecraft: PlayStation®3 Edition και, στη συνέχεια, να το κατεβάσετε με το Minecraft: PlayStation®Vita Edition. + - - Αυτό είναι το δοκιμαστικό παιχνίδι τοy Minecraft: PlayStation®Vita Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα θέμα! -Ξεκλειδώστε το πλήρες παιχνίδι για να απολαύσετε το Minecraft: PlayStation®Vita Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". -Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + Η αποθήκευση δεν έχει ολοκληρωθεί - - Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®Vita Edition. Για να μπορέσετε να αποδεχτείτε αυτήν την πρόσκληση, χρειάζεστε το πλήρες παιχνίδι. -Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + Έχει τελειώσει ο χώρος αποθήκευσης δεδομένων για την έκδοση PlayStation®Vita του Minecraft. Για να δημιουργήσεις χώρο, διάγραψε κάποιο άλλο αποθηκευμένο αρχείο της έκδοσης PlayStation®Vita του Minecraft. - - Οι παίκτες με ιδιότητα επισκέπτη δεν μπορούν να ξεκλειδώσουν το πλήρες παιχνίδι. Συνδεθείτε με έναν λογαριασμό στο Sony Entertainment Network. + + Η μεταφόρτωση ακυρώθηκε - - Διαδικτυακό ID + + Έχετε ακυρώσει τη μεταφόρτωση αυτού του αποθηκευμένου παιχνιδιού στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών. - - Παρασκευή Φίλτρου + + Μεταφόρτωση Αποθήκευσης για Συστήματα PS3™/PS4™ - - Επιστρέψατε στην οθόνη τίτλων, επειδή έχετε αποσυνδεθεί από το "PSN". - + + Μεταφόρτωση δεδομένων : %d%% - - Παίξατε το Δοκιμαστικό Παιχνίδι του Minecraft: PlayStation®Vita Edition για τον μέγιστο επιτρεπόμενο χρόνο! Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι, για να συνεχιστεί η διασκέδαση; + + "PSN" - - Η φόρτωση του «Minecraft: PlayStation®Vita Edition» απέτυχε. Δεν είναι δυνατή η συνέχεια. + + Λήψη Αποθήκευσης Συστήματος PS3™ - - Η συμμετοχή στο παιχνίδι απέτυχε, καθώς σε έναν ή περισσότερους παίκτες δεν επιτρέπεται το Διαδικτυακό παιχνίδι, λόγω περιορισμών συνομιλίας στο λογαριασμό τους στο Sony Entertainment Network. + + Λήψη δεδομένων : %d%% - - Η δημιουργία διαδικτυακού παιχνιδιού απέτυχε, καθώς σε έναν ή περισσότερους παίκτες δεν επιτρέπεται το Διαδικτυακό παιχνίδι, λόγω περιορισμών συνομιλίας στο λογαριασμό τους στο Sony Entertainment Network. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. + + Αποθήκευση - - Δεν επιτρέπεται η συμμετοχή σας σε αυτήν τη συνεδρία παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί στο λογαριασμό σας στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. + + Η μεταφόρτωση ολοκληρώθηκε! - - Δεν επιτρέπεται η συμμετοχή σας σε αυτήν τη συνεδρία παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί για έναν από τους τοπικούς παίκτες σας στο λογαριασμό του στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. + + Είστε βέβαιοι ότι θέλετε να μεταφορτώσετε αυτό το αποθηκευμένο παιχνίδι και να αντικαταστήσετε τυχόν τρέχοντα αποθηκευμένα παιχνίδια στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών; - - Δεν επιτρέπεται η δημιουργία αυτής της συνεδρίας παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί για έναν από τους τοπικούς παίκτες σας στο λογαριασμό του στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. + + Μετατροπή δεδομένων - - Αυτό το παιχνίδι διαθέτει μια λειτουργία αυτόματης αποθήκευσης επιπέδων. Όταν εμφανίζεται το παραπάνω εικονίδιο, το παιχνίδι αποθηκεύει τα δεδομένα σας. -Μην απενεργοποιείτε το σύστημα PlayStation®Vita όσο αυτό το εικονίδιο εμφανίζεται στην οθόνη. + + ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ - - Όταν έχει ενεργοποιηθεί, ο οικοδεσπότης μπορεί να πραγματοποιήσει εναλλαγή στην ικανότητά του να πετά, να απενεργοποιήσει την εξάντληση και να κάνει τον εαυτό του αόρατο από το μενού παιχνιδιού. Απενεργοποιεί τα τρόπαια και τις ενημερώσεις πίνακα κατάταξης. + + ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΙΤΑΙ - - Διαδικτυακά ID Διαχωρισμένης Οθόνης + + {*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*} για κίνηση προς τα δεξιά. - - Τρόπαια + + Για να μπορέσετε να πετάξετε, πατήστε το{*CONTROLLER_ACTION_JUMP*} δυο φορές γρήγορα. Για να εγκαταλείψετε την πτήση, επαναλάβετε την ενέργεια. Για να πετάξετε γρηγορότερα, πιέστε γρήγορα και διαδοχικά το{*CONTROLLER_ACTION_MOVE*} προς τα εμπρός δύο φορές ενώ πετάτε. +Όταν βρίσκεστε σε λειτουργία πτήσης, μπορείτε να κρατήσετε πατημένο το{*CONTROLLER_ACTION_JUMP*} για κίνηση προς τα πάνω και το{*CONTROLLER_ACTION_SNEAK*} για κίνηση προς τα κάτω ή να χρησιμοποιήσετε τα κατευθυντικά πλήκτρα για να κινηθείτε προς τα πάνω, κάτω, αριστερά ή δεξιά. - - Διαδικτυακά ID: + + «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» - - Διαδικτυακά ID Παιχνιδιού + + Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο στη Λειτουργία Δημιουργίας, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί στη Λειτουργία Επιβίωσης. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; - - Κοιτάξτε τι έφτιαξα στο Minecraft: PlayStation®Vita Edition! + + Αυτός ο κόσμος αποθηκεύτηκε προηγουμένως στη Λειτουργία Δημιουργίας και τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; - - Χρησιμοποιείτε τη δοκιμαστική έκδοση ενός πακέτου υφών. Θα έχετε πρόσβαση στα πλήρη περιεχόμενα του πακέτου υφών, αλλά δεν θα είστε σε θέση να αποθηκεύσετε την πρόοδό σας. -Αν επιχειρήσετε να αποθηκεύσετε ενώ βρίσκεστε στη δοκιμαστική έκδοση, θα σας δοθεί η επιλογή να αγοράσετε την πλήρη έκδοση. - + + «ΔΕΝ ΧΡΗΣΙΜΟΠΟΙΕΤΑΙ» - - Ενημερωμένη έκδοση 1.04 (Ενημέρωση τίτλου 14) + + Πρόσκληση Φίλων - - SELECT + + Το minecraftforum διαθέτει μια ενότητα ειδικά για το PlayStation®Vita Edition . - - Αυτή η επιλογή απενεργοποιεί τα τρόπαια και τις ενημερώσεις πίνακα κατάταξης για αυτόν τον κόσμο κατά τη διάρκεια του παιχνιδιού, καθώς και σε περίπτωση επαναφόρτωσης του παιχνιδιού που έχει αποθηκευτεί με αυτήν τη λειτουργία ενεργοποιημένη. + + Θα μαθαίνετε τις τελευταίες πληροφορίες για αυτό το παιχνίδι στο twitter @4JStudios και @Kappische! - - Θέλετε να συνδεθείτε στο "PSN"; + + NOT USED - - Για τους παίκτες που δεν βρίσκονται στο ίδιο σύστημα PlayStation®Vita με τον οικοδεσπότη, εάν ορίσετε αυτή την επιλογή θα αποβάλλετε τον παίκτη από το παιχνίδι και τυχόν άλλους παίκτες στο σύστημα PlayStation®Vita του. Αυτός ο παίκτης δεν θα μπορεί να συμμετέχει μέχρι να ξεκινήσει ξανά το παιχνίδι. + + Μπορείτε να χρησιμοποιήσετε την οθόνη αφής στο σύστημα PlayStation®Vita για να πλοηγηθείτε στα μενού! - - σύστημα PlayStation®Vita + + Μην κοιτάτε ποτέ ένα Enderman στα μάτια! - - Αλλαγή Λειτουργίας δικτύου + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΓΙΑ ΠΟΛΛΟΥΣ ΠΑΙΚΤΕΣ{*ETW*}{*B*}{*B*} +Από προεπιλογή, το Minecraft στο σύστημα PlayStation®Vita είναι ένα παιχνίδι για πολλούς παίκτες.{*B*}{*B*} +Όταν ξεκινάτε ή συμμετέχετε σε ένα διαδικτυακό παιχνίδι, αυτή η ενέργεια θα είναι ορατή στα άτομα που βρίσκονται στη λίστα φίλων σας (εκτός αν έχετε ορίσει την επιλογή «Μόνο με Πρόσκληση» κατά τη δημιουργία του παιχνιδιού) και αν οι φίλοι σας συμμετάσχουν στο παιχνίδι, αυτό θα είναι επίσης ορατό στα άτομα στις δικές τους λίστες φίλων (αν έχετε ορίσει την επιλογή «Να Επιτρέπονται οι Φίλοι Φίλων»).{*B*} +Όταν βρίσκεστε σε ένα παιχνίδι, μπορείτε να πατήσετε το κουμπί SELECT, για να δείτε μια λίστα με όλους τους υπόλοιπους παίκτες που συμμετέχουν στο παιχνίδι, καθώς και να αποβάλλετε παίκτες από το παιχνίδι. - - Επιλογή Λειτουργίας δικτύου + + {*T3*}ΤΡΟΠΟΣ ΠΑΙΧΝΙΔΙΟΥ : ΚΟΙΝΟΠΟΙΗΣΗ ΣΤΙΓΜΙΟΤΥΠΩΝ ΟΘΟΝΗΣ{*ETW*}{*B*}{*B*} +Μπορείτε να καταγράψετε ένα στιγμιότυπο οθόνης από το παιχνίδι σας, εμφανίζοντας το Μενού Παύσης και πατώντας το{*CONTROLLER_VK_Y*}, για Κοινοποίηση στο Facebook. Θα δείτε μια μικρογραφία του στιγμιότυπου οθόνης και θα μπορείτε να επεξεργαστείτε το κείμενο που θα κοινοποιήσετε μαζί με το στιγμιότυπο στο Facebook.{*B*}{*B*} +Υπάρχει μια λειτουργία κάμερας ειδικά για τη λήψη αυτών των στιγμιοτύπων, έτσι ώστε στο στιγμιότυπο να φαίνεται η μπροστινή όψη του χαρακτήρα σας. Πατήστε το{*CONTROLLER_ACTION_CAMERA*} έως ότου δείτε την μπροστινή όψη του χαρακτήρα σας, προτού πατήσετε το{*CONTROLLER_VK_Y*} για Κοινοποίηση.{*B*}{*B*} +Το Διαδικτυακό ID δεν θα εμφανίζεται στο στιγμιότυπο οθόνης. - - Επιλέξτε μια σύνδεση Ad Hoc για να συνδεθείτε με άλλα κοντινά συστήματα PlayStation®Vita ή με το "PSN" για να συνδεθείτε με φίλους από όλο τον κόσμο. + + Φαίνεται ότι τα 4J Studios κατάργησαν τον Herobrine από το παιχνίδι για το σύστημα PlayStation®Vita, αλλά δεν είμαστε και πολύ σίγουροι. - - Δίκτυο Ad Hoc + + Το Minecraft: PlayStation®Vita Edition έσπασε πολλά ρεκόρ! - - "PSN" + + Παίξατε το Δοκιμαστικό Παιχνίδι του Minecraft: PlayStation®Vita Edition για τον μέγιστο επιτρεπόμενο χρόνο! Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι, για να συνεχιστεί η διασκέδαση; - - Λήψη αποθηκευμένου παιχνιδιού Σύστημα PlayStation®3 + + Η φόρτωση του «Minecraft: PlayStation®Vita Edition» απέτυχε. Δεν είναι δυνατή η συνέχεια. - - Μεταφόρτωση αποθηκευμένου παιχνιδιού για Σύστημα PlayStation®3/PlayStation®4 + + Παρασκευή Φίλτρου - - Η μεταφόρτωση ακυρώθηκε + + Επιστρέψατε στην οθόνη τίτλων, επειδή έχετε αποσυνδεθεί από το "PSN". - - Έχετε ακυρώσει τη μεταφόρτωση αυτού του αποθηκευμένου παιχνιδιού στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών. + + Η συμμετοχή στο παιχνίδι απέτυχε, καθώς σε έναν ή περισσότερους παίκτες δεν επιτρέπεται το Διαδικτυακό παιχνίδι, λόγω περιορισμών συνομιλίας στο λογαριασμό τους στο Sony Entertainment Network. - - Μεταφόρτωση δεδομένων : %d%% + + Δεν επιτρέπεται η συμμετοχή σας σε αυτήν τη συνεδρία παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί για έναν από τους τοπικούς παίκτες σας στο λογαριασμό του στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. - - Λήψη δεδομένων : %d%% + + Δεν επιτρέπεται η δημιουργία αυτής της συνεδρίας παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί για έναν από τους τοπικούς παίκτες σας στο λογαριασμό του στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. - - Είστε βέβαιοι ότι θέλετε να μεταφορτώσετε αυτό το αποθηκευμένο παιχνίδι και να αντικαταστήσετε τυχόν τρέχοντα αποθηκευμένα παιχνίδια στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών; + + Η δημιουργία διαδικτυακού παιχνιδιού απέτυχε, καθώς σε έναν ή περισσότερους παίκτες δεν επιτρέπεται το Διαδικτυακό παιχνίδι, λόγω περιορισμών συνομιλίας στο λογαριασμό τους στο Sony Entertainment Network. Αποεπιλέξτε το πλαίσιο «Διαδικτυακό Παιχνίδι» στην ενότητα «Περισσότερες Επιλογές», για να ξεκινήσετε ένα παιχνίδι εκτός σύνδεσης. - - Μετατροπή δεδομένων + + Δεν επιτρέπεται η συμμετοχή σας σε αυτήν τη συνεδρία παιχνιδιού, επειδή το Διαδικτυακό παιχνίδι έχει απενεργοποιηθεί στο λογαριασμό σας στο Sony Entertainment Network λόγω περιορισμών συνομιλίας. - - Αποθήκευση + + Η σύνδεση με το "PSN" χάθηκε. Έξοδος στο κύριο μενού. - - Η μεταφόρτωση ολοκληρώθηκε! + + Η σύνδεση με το "PSN" χάθηκε. - - Η μεταφόρτωση απέτυχε. Προσπαθήστε ξανά αργότερα. + + Αυτός ο κόσμος αποθηκεύτηκε προηγουμένως στη Λειτουργία Δημιουργίας και τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν. - - Η λήψη ολοκληρώθηκε! + + Αν δημιουργήσετε, φορτώσετε ή αποθηκεύσετε έναν κόσμο με τα Προνόμια Οικοδεσπότη ενεργοποιημένα, τα τρόπαια και οι ενημερώσεις πίνακα κατάταξης θα είναι απενεργοποιημένα σε αυτόν τον κόσμο, ακόμα και αν έπειτα φορτωθεί με αυτές τις επιλογές απενεργοποιημένες. Είστε βέβαιοι ότι θέλετε να συνεχίσετε; - - Η λήψη απέτυχε. Προσπαθήστε ξανά αργότερα. + + Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®Vita Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα τρόπαιο! +Ξεκλειδώστε το πλήρες παιχνίδι για να απολαύσετε τo Minecraft: PlayStation®Vita Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". +Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; - - Αποτυχία συμμετοχής στο παιχνίδι λόγω περιοριστικού τύπου NAT. Ελέγξτε τις ρυθμίσεις δικτύου σας. + + Οι παίκτες με ιδιότητα επισκέπτη δεν μπορούν να ξεκλειδώσουν το πλήρες παιχνίδι. Συνδεθείτε με έναν λογαριασμό στο Sony Entertainment Network. - - - Δεν υπάρχει αποθηκευμένο παιχνίδι στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών αυτήν τη στιγμή. Μπορείτε να μεταφορτώσετε έναν αποθηκευμένο κόσμο στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών χρησιμοποιώντας το Minecraft: PlayStation®3 Edition και, στη συνέχεια, να το κατεβάσετε με το Minecraft: PlayStation®Vita Edition. - + + Διαδικτυακό ID - - Η αποθήκευση δεν έχει ολοκληρωθεί + + Αυτό είναι το δοκιμαστικό παιχνίδι τοy Minecraft: PlayStation®Vita Edition. Αν είχατε το πλήρες παιχνίδι, θα είχατε μόλις κερδίσει ένα θέμα! +Ξεκλειδώστε το πλήρες παιχνίδι για να απολαύσετε το Minecraft: PlayStation®Vita Edition και να παίξετε με τους φίλους σας σε όλο τον κόσμο μέσω του "PSN". +Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; - - Έχει τελειώσει ο χώρος αποθήκευσης δεδομένων για την έκδοση PlayStation®Vita του Minecraft. Για να δημιουργήσεις χώρο, διάγραψε κάποιο άλλο αποθηκευμένο αρχείο της έκδοσης PlayStation®Vita του Minecraft. + + Αυτό είναι το δοκιμαστικό παιχνίδι του Minecraft: PlayStation®Vita Edition. Για να μπορέσετε να αποδεχτείτε αυτήν την πρόσκληση, χρειάζεστε το πλήρες παιχνίδι. +Θέλετε να ξεκλειδώσετε το πλήρες παιχνίδι; + + + Το αποθηκευμένο αρχείο στην περιοχή μεταφοράς αποθηκευμένων παιχνιδιών διαθέτει αριθμό έκδοσης που δεν υποστηρίζεται ακόμα από το Minecraft: PlayStation®Vita Edition. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/4J_stringsPlatformSpecific.xml index 55a51c39..29e24102 100644 --- a/Minecraft.Client/PSVitaMedia/loc/es-ES/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/4J_stringsPlatformSpecific.xml @@ -1,50 +1,50 @@  - - El almacenamiento del sistema no tiene suficiente espacio libre para guardar una partida. - - - Has vuelto a la pantalla de título porque has cerrado sesión en "PSN". + + Se ha producido un error al guardar la configuración en la cuenta Sony Entertainment Network. - - La partida ha finalizado porque has cerrado sesión en "PSN". + + Problema con la cuenta Sony Entertainment Network - - No estás conectado. + + Se ha producido un problema al acceder a tu cuenta Sony Entertainment Network. No se puede conceder tu trofeo en este momento. - - Este juego ofrece funciones que requieren estar conectado a "PSN", pero en estos momentos estás desconectado. + + Esta es la versión de prueba de Minecraft: PlayStation®3 Edition. Si tuvieras el juego completo, ¡habrías conseguido un trofeo! +Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®3 Edition y jugar con amigos de todo el mundo a través de "PSN". +¿Te gustaría desbloquear el juego completo? - - Red Ad hoc sin conexión. + + Conectar a red Ad hoc Este juego contiene algunas características que necesitan una conexión de red Ad hoc, pero actualmente te encuentras sin conexión. - - Esta función requiere haber iniciado sesión en "PSN". - - - Conectarse a "PSN" - - - Conectar a red Ad hoc + + Red Ad hoc sin conexión. Problema con el trofeo - - Se ha producido un problema al acceder a tu cuenta Sony Entertainment Network. No se puede conceder tu trofeo en este momento. + + La partida ha finalizado porque has cerrado sesión en "PSN". - - Problema con la cuenta Sony Entertainment Network + + Has vuelto a la pantalla de título porque has cerrado sesión en "PSN". - - Se ha producido un error al guardar la configuración en la cuenta Sony Entertainment Network. + + El almacenamiento del sistema no tiene suficiente espacio libre para guardar una partida. - - Esta es la versión de prueba de Minecraft: PlayStation®3 Edition. Si tuvieras el juego completo, ¡habrías conseguido un trofeo! -Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®3 Edition y jugar con amigos de todo el mundo a través de "PSN". -¿Te gustaría desbloquear el juego completo? + + No estás conectado. + + + Conectarse a "PSN" + + + Esta función requiere haber iniciado sesión en "PSN". + + + Este juego ofrece funciones que requieren estar conectado a "PSN", pero en estos momentos estás desconectado. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/AdditionalStrings.xml index cb71aa72..e05b351f 100644 --- a/Minecraft.Client/PSVitaMedia/loc/es-ES/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/AdditionalStrings.xml @@ -48,6 +48,12 @@ Tu archivo Opciones está dañado y tiene que borrarse. + + Borrar archivo Opciones. + + + Volver a intentar cargar archivo Opciones. + Tu archivo Guardar caché está dañado y tiene que borrarse. @@ -75,6 +81,9 @@ Debido a la configuración del control paterno de uno de los jugadores locales, se ha desactivado la función online de tu cuenta Sony Entertainment Network. + + Las opciones online están desactivadas debido a que se está poniendo disponible una actualización del juego. + No hay ofertas disponibles de contenido descargable para este título en este momento. @@ -84,7 +93,4 @@ ¡Ven a jugar una partida de Minecraft: PlayStation®Vita Edition! - - Las opciones online están desactivadas debido a que se está poniendo disponible una actualización del juego. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsGeneric.xml index 9392bf7e..67c081f9 100644 --- a/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsGeneric.xml @@ -1,5008 +1,5853 @@  - - ¡Nuevo contenido descargable disponible! Utiliza el botón Tienda de Minecraft del menú principal para acceder a él. + + Cambiando a juego sin conexión - - Puedes cambiar el aspecto de tu personaje con el pack de aspecto de la tienda de Minecraft. Selecciona "Tienda de Minecraft" en el menú principal para ver qué hay disponible. + + Espera mientras el anfitrión guarda la partida. - - Varía la configuración de gamma para que la visualización del juego sea más clara o más oscura. + + Entrando en El Fin - - Si estableces la dificultad del juego en Pacífico, tu salud se regenerará automáticamente. ¡Además, no saldrán monstruos por la noche! + + Guardando jugadores - - Dale un hueso a un lobo para domarlo. Podrás hacer que se siente o que te siga. + + Conectando al anfitrión - - Para soltar objetos desde el menú Inventario, mueve el cursor fuera del menú y pulsa{*CONTROLLER_VK_A*}. + + Descargando terreno - - Si duermes en una cama de noche, el juego avanzará hasta el amanecer, pero en multijugador todos deben dormir a la vez. + + Saliendo de El Fin - - Extrae chuletas del cerdo y cocínalas para comerlas y recuperar salud. + + ¡La cama de tu casa ha desaparecido o está obstruida! - - Extrae cuero de las vacas y úsalo para fabricar armaduras. + + Ahora no puedes descansar, hay monstruos cerca. - - Si tienes un cubo vacío, puedes llenarlo con leche de vaca, agua ¡o lava! + + Estás durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. - - Usa una azada para preparar el terreno para la cosecha. + + Esta cama está ocupada. - - Las arañas no atacan por el día, a no ser que tú las ataques a ellas. + + Solo puedes dormir por la noche. - - ¡Es más fácil excavar arena o tierra con un azadón que a mano! + + %s está durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. - - Si comes las chuletas de cerdo cocinadas, recuperarás más salud que si las comes crudas. + + Cargando nivel - - Crea antorchas para iluminar áreas oscuras de noche. Los monstruos evitarán las áreas cercanas a las antorchas. + + Finalizando... - - ¡Con una vagoneta y un raíl llegarás a tu destino más rápido! + + Construyendo terreno - - Planta brotes y se convertirán en árboles. + + Simulando mundo durante un instante - - Los porqueros no te atacarán a no ser que tú los ataques a ellos. + + Rango - - Puedes echarte a dormir en una cama para cambiar el punto de generación del juego y avanzar hasta el amanecer. + + Preparando para guardar nivel - - ¡Golpea esas bolas de fuego de vuelta al espectro! + + Preparando fragmentos... - - Si construyes un portal podrás viajar a otra dimensión: el mundo inferior. + + Inicializando servidor - - ¡Pulsa {*CONTROLLER_VK_B*} para soltar el objeto que llevas en la mano! + + Saliendo del mundo inferior - - ¡Usa la herramienta correcta para el trabajo! + + Regenerando - - Si no encuentras hulla para las antorchas, siempre puedes convertir árboles en carbón en un horno. + + Generando nivel - - Excavar en línea recta hacia abajo o hacia arriba no es buena idea. + + Generando zona de generación - - Puedes usar polvo de hueso (se fabrica con hueso de esqueleto) como fertilizante. Las cosas crecerán al instante. + + Cargando zona de generación - - ¡Los creepers explotan cuando se acercan a ti! + + Entrando en el mundo inferior - - La obsidiana se crea cuando el agua alcanza un bloque de origen de lava. + + Herramientas y armas - - Al eliminar el bloque de origen, la lava puede tardar varios minutos en desaparecer por completo. + + Gamma - - Los guijarros son resistentes a las bolas de fuego del espectro, lo que los hace útiles para defender portales. + + Sensibilidad del juego - - 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 las calabazas iluminadas. + + Sensibilidad interfaz - - Ten cuidado cuando construyas estructuras de lana al aire libre, ya que los rayos de las tormentas pueden prenderles fuego. + + Dificultad - - Un solo cubo de lava se puede usar para fundir 100 bloques en un horno. + + Música - - El instrumento que toca un bloque de nota depende del material que tenga debajo. + + Sonido - - Los zombis y los esqueletos pueden sobrevivir a la luz del día si están en el agua. + + Pacífico - - Si atacas a un lobo, todos los de los alrededores se volveran hostiles. Característica que comparten con los porqueros zombis. + + En este modo, el jugador recupera la salud con el paso del tiempo y no hay enemigos en el entorno. - - Los lobos no pueden entrar en el mundo inferior. + + En este modo, el entorno genera enemigos, pero causarán menos daño al jugador que en el modo normal. - - Los lobos no atacan a los creepers. + + En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño estándar. - - Las gallinas ponen huevos cada 5 o 10 minutos. + + Fácil - - La obsidiana solo se puede extraer con un pico de diamante. + + Normal - - Los creepers son la fuente de pólvora más fácil de obtener. + + Difícil - - Si colocas dos cofres juntos crearás un cofre grande. + + Sesión cerrada - - Los lobos domados indican su salud con la posición de su cola. Dales de comer para curarlos. + + Armadura - - Cocina un cactus en un horno para obtener tinte verde. + + Mecanismos - - Lee la sección Novedades en el menú Cómo se juega para ver la información más reciente sobre el juego. + + Transporte - - ¡Ahora hay vallas apilables en el juego! + + Armas - - Algunos animales te seguirán si llevas trigo en la mano. + + Comida - - Si un animal no puede desplazarse más de 20 bloques en cualquier dirección, no se degenerará. + + Estructuras - - ¡Música de C418! + + Decoraciones - - ¡Notch tiene más de un millón de seguidores en Twitter! + + Pociones - - No todos los suecos son rubios. ¡Algunos, como Jens de Mojang, son pelirrojos! + + Herramientas, armas y armadura - - ¡Pronto habrá una actualización de este juego! + + Materiales - - ¿Quién es Notch? + + Bloques de construcción - - ¡Mojang tiene más premios que empleados! + + Piedra rojiza y transporte - - ¡Hay famosos que juegan a Minecraft! + + Varios - - ¡A deadmau5 le gusta Minecraft! + + Entradas: - - No mires directamente a los bichos. + + Salir sin guardar - - Los creepers surgieron de un fallo de código. + + ¿Seguro que quieres salir al menú principal? Se perderá todo el progreso no guardado. - - ¿Es una gallina o es un pato? + + ¿Seguro que quieres salir al menú principal? ¡Se perderá tu progreso! - - ¿Estuviste en la Minecon? + + El archivo guardado está dañado. ¿Quieres borrarlo? - - Nadie de Mojang ha visto jamás la cara a junkboy. + + ¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores de la partida? Se perderá todo el progreso no guardado. - - ¿Sabías que hay una wiki de Minecraft? + + Salir y guardar - - ¡El nuevo despacho de Mojang mola! + + Crear nuevo mundo - - ¡Minecon 2013 tuvo lugar en Orlando, Florida, EE.UU.! + + Escribe un nombre para tu mundo. - - .party() fue excelente. - - - Supón siempre que los rumores son falsos, ¡no te los creas! + + Introduce la semilla para la generación del mundo. - - {*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 extraer y cortar con la mano o con cualquier objeto que sostengas. Quizá necesites crear una herramienta para extraer 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. + + Cargar mundo guardado - - {*T3*}CÓMO SE JUEGA: PANEL DE DATOS{*ETW*}{*B*}{*B*} -El panel de datos 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 muestra 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. + + Jugar tutorial - - {*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 puntero. Usa{*CONTROLLER_VK_A*} para coger el objeto que se encuentra bajo el puntero. 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 puntero hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. Si hay varios objetos en el puntero, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno.{*B*}{*B*} -Si el 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*} -Es posible cambiar el color de tu Armadura de cuero tiñéndola, puedes hacerlo en el menú de inventario manteniendo pulsado el tinte de tu puntero y pulsando luego {*CONTROLLER_VK_X*} mientras el puntero pasa por el objeto que quieras teñir. + + Tutorial - - {*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 puntero 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 adelante. + + Dar nombre al mundo - - {*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. + + Archivo dañado - - {*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. + + Aceptar - - {*T3*}CÓMO SE JUEGA: MESA DE TRABAJO{*ETW*}{*B*}{*B*} -Con una mesa de trabajo 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. + + Cancelar - - {*T3*}CÓMO SE JUEGA: HORNO{*ETW*}{*B*}{*B*} -En el horno puedes transformar 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 el 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. + + Tienda de Minecraft - - {*T3*}CÓMO SE JUEGA: DISPENSADOR{*ETW*}{*B*}{*B*} -El dispensador se usa para arrojar objetos. Para ello tendrás que colocar un interruptor (una palanca, por ejemplo) 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. + + Rotar - - {*T3*}CÓMO SE JUEGA: ELABORACIÓN DE POCIONES{*ETW*}{*B*}{*B*} -Para elaborar pociones se necesita un soporte para pociones, que se puede construir en la mesa de trabajo. 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 soportes para pociones tienen tres espacios para botellas, de modo que puedes preparar tres pociones a la vez. Se puede usar un ingrediente en las tres botellas, así que procura elaborar siempre las pociones de tres en tres para aprovechar mejor tus recursos.{*B*} -Si colocas un ingrediente de poción en la posición superior del soporte para pociones, tras un breve periodo de tiempo obtendrás una poción básica. Esto no tiene ningún efecto por sí mismo, pero si añades otro ingrediente a 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 de piedra 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. + + Esconderse - - {*T3*}CÓMO SE JUEGA: ENCANTAMIENTOS{*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 encantar 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 encantamiento, los tres botones de la parte derecha del espacio mostrarán algunos encantamientos y sus niveles de experiencia correspondientes.{*B*} -Si no tienes suficientes niveles de experiencia para usarlos, el coste aparecerá en rojo; de lo contrario, aparecerá en verde.{*B*}{*B*} -El encantamiento que se aplica se selecciona aleatoriamente en función del coste que aparece.{*B*}{*B*} -Si la mesa de encantamiento 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 encantamiento, la intensidad de los encantamientos aumentará y aparecerán glifos arcanos en el libro de la mesa de encantamientos.{*B*}{*B*} -Todos los ingredientes para la mesa de encantamientos se pueden encontrar en las aldeas de un mundo o al extraer mineral y cultivar en él.{*B*}{*B*} -Los libros encantados se usan en el yunque para aplicar encantamientos a los objetos. Esto proporciona un control mayor sobre los encantamientos que quieras hacer a tus objetos.{*B*} + + Vaciar todos los espacios - - {*T3*}CÓMO SE JUEGA: CUIDAR ANIMALES{*ETW*}{*B*}{*B*} -Si quieres mantener a tus animales en un único lugar, construye una zona vallada de menos de 20x20 bloques y mete dentro a tus animales. Así te asegurarás de que estén allí cuando vuelvas. + + ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderán todo el progreso no guardado. - - {*T3*}CÓMO SE JUEGA: REPRODUCCIÓN DE 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 se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el modo Amor.{*B*} -Si alimentas con trigo a las vacas, con champiñacas a las ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del mundo inferior a las gallinas, 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 se encuentren dos animales en modo Amor de la misma especie, se besarán durante unos segundos y aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de crecer y convertirse en adulta.{*B*} -Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo.{*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 ya haya muchos. + + ¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo por su versión actual? - - {*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 tres bloques en el mundo superior. Así, cuando construyas un portal en el mundo inferior y salgas por él, estarás tres veces más lejos del punto de entrada.{*B*}{*B*} -Se necesita un mínimo de diez bloques de obsidiana para construir el portal, y el portal debe tener cinco bloques de alto, cuatro de ancho y uno de profundidad. Una vez construida la estructura del portal, tendrás que prender fuego al espacio interior para activarlo. Para ello, usa los objetos "chisquero de pedernal" o "descarga de fuego".{*B*}{*B*} -En la imagen de la derecha dispones de ejemplos de construcción de un portal. + + ¿Seguro que quieres salir sin guardar? ¡Perderás todo el progreso en este mundo! - - {*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 función 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 seguir con él o dejarlo bloqueado. + + Comenzar a jugar - - {*T3*}CÓMO SE JUEGA: OPCIONES DE ANFITRIÓN Y DE JUGADOR{*ETW*}{*B*}{*B*} - - {*T1*}Opciones de partida{*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 partida.{*B*}{*B*} - - {*T2*}Jugador contra jugador{*ETW*}{*B*} - Si está habilitado, 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á deshabilitado, los jugadores que se unen a la partida 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ú del juego.{*B*}{*B*} - - {*T2*}El fuego se propaga{*ETW*}{*B*} - Si está habilitado, 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á habilitado, la dinamita explota cuando se detona. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} - - {*T2*}Privilegios de anfitrión{*ETW*}{*B*} - Si está habilitado, el anfitrión puede activar su habilidad para volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego. {*DISABLES_ACHIEVEMENTS*}.{*B*}{*B*} - - {*T1*}Opciones de generación del mundo{*ETW*}{*B*} - Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} - - {*T2*}Generar estructuras{*ETW*}{*B*} - Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo.{*B*}{*B*} - - {*T2*}Mundo superplano{*ETW*}{*B*} - Si está habilitado, 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á habilitado, 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á habilitado, el mundo inferior se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior.{*B*}{*B*} - - {*T1*}Opciones de partida{*ETW*}{*B*} - Dentro del juego se pueden acceder a varias opciones pulsando {*BACK_BUTTON*} para mostrar el menú del juego.{*B*}{*B*} - - {*T2*}Opciones de anfitrión{*ETW*}{*B*} - El anfitrión y cualquier jugador designado como moderador pueden acceder al menú "Opciones de anfitrión". En este menú se puede habilitar y deshabilitar la propagación del fuego y la explosión de dinamita.{*B*}{*B*} - - {*T1*}Opciones de 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á deshabilitado. Cuando esta opción está habilitada, el jugador puede interactuar con el mundo de forma normal. Cuando está deshabilitada, el jugador no puede colocar ni destruir bloques, ni interactuar 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á deshabilitado. Cuando esta opción está deshabilitada, el jugador no puede usar puertas ni interruptores.{*B*}{*B*} - - {*T2*}Puede abrir contenedores{*ETW*}{*B*} - Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. 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á deshabilitado. 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á deshabilitado. 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 anfitrión) si "Confiar en jugadores" está deshabilitado, expulsar jugadores y activar y desactivar "El fuego se propaga" y "La dinamita explota".{*B*}{*B*} - - {*T2*}Expulsar jugador{*ETW*}{*B*} -{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - - {*T1*}Opciones de anfitrión{*ETW*}{*B*} - Si "Privilegios de anfitrión" está habilitado, el anfitrión 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. 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 agotamiento{*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 mover a otros jugadores, a sí mismo o hasta otros jugadores del mundo. + + Salir de la partida - - Página siguiente + + Guardar partida - - Página anterior + + Salir sin guardar - - Fundamentos + + Pulsa START para unirte. - - Panel de datos + + ¡Hurra! ¡Has obtenido una imagen de jugador de Steve, de Minecraft! - - Inventario + + ¡Hurra! ¡Has obtenido una imagen de jugador de un creeper! - - Cofres + + Desbloquear juego completo - - Creación + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más reciente del juego. - - Horno + + Nuevo mundo - - Dispensador + + ¡Premio desbloqueado! - - Cuidar animales + + Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu partida. +¿Quieres desbloquear el juego completo? - - Reproducción de animales + + Amigos - - Elaboración de pociones + + Mi puntuación - - Encantamientos + + Total - - Portal inferior + + Espera... - - Multijugador + + Sin resultados - - Compartir capturas de pantalla + + Filtro: - - Bloquear niveles + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. - - Modo Creativo + + Conexión perdida - - Opciones de anfitrión y de jugador + + Se ha perdido la conexión con el servidor. Saliendo al menú principal. - - Comercio + + Desconectado por el servidor - - Yunque + + Saliendo de la partida - - El Fin + + Se ha producido un error. Saliendo al menú principal. - - {*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. Encontrarás el portal final en una fortaleza, en lo más profundo del mundo superior.{*B*} -Para activar el portal final, debes colocar un ojo finalizador 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 finalizador, 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 finalizador usa para curarse, así que lo primero que deberás hacer será destruirlos todos.{*B*} -Podrás alcanzar los primeros con flechas, pero los últimos están en una jaula con barrotes de hierro. Tendrás que ascender para llegar a ellos.{*B*}{*B*} -Mientras lo haces, el dragón finalizador volará hacia ti y te atacará escupiendo bolas de ácido finalizador.{*B*} -Si te acercas al pedestal del huevo en el centro de los pilares, el dragón finalizador descenderá 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 finalizador 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 fácilmente. + + Error de conexión - - Correr + + Has sido expulsado de la partida. - - Novedades + + El anfitrión ha salido de la partida. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Cambios y añadidos {*ETW*}{*B*}{*B*} -- Se han añadido nuevos objetos: esmeralda, mineral de esmeralda, bloque de esmeralda, cofre finalizador, garfio de cuerda de trampa, manzana de oro encantada, yunque, maceta, pared de guijarros, pared de guijarros con musgo, pintura apagada, patata, patata asada, patata venenosa, zanahoria, zanahoria de oro, zanahoria con palo, pastel de calabaza, poción de visión nocturna, poción de invisibilidad, cuarzo del mundo inferior, mineral de cuarzo del mundo inferior, bloque de cuarzo, losa de cuarzo, escaleras de cuarzo, bloque de cuarzo tallado, bloque de cuarzo de pilar, libro encantado, alfombra.{*B*} -- Se han añadido nuevas recetas para arenisca suave y arenisca tallada.{*B*} -- Se han añadido nuevos enemigos: aldeanos zombis.{*B*} -- Se han añadido nuevas opciones de generación de terreno: templos desiertos, aldeas desiertas, templos de la jungla.{*B*} -- Se ha añadido comercio con aldeanos.{*B*} -- Se ha añadido interfaz de yunque.{*B*} -- Se pueden teñir las armaduras de cuero.{*B*} -- Se pueden teñir los collares de lobo.{*B*} -- Se puede usar una zanahoria con palo para controlar cuando montas en un cerdo.{*B*} -- Contenido de cofre de regalo actualizado con más objetos.{*B*} -- Se ha cambiado la situación de medios bloques y otros bloques sobre medios bloques.{*B*} -- Se ha cambiado la situación de escaleras y losas invertidas.{*B*} -- Se han añadido diferentes profesiones de aldeanos.{*B*} -- Los aldeanos generados a raíz de un huevo tendrán una profesión aleatoria.{*B*} -- Se ha añadido una colocación de tronco lateral.{*B*} -- Los hornos pueden usar herramientas de madera como combustible.{*B*} -- Se pueden recoger paneles de hielo y de cristal con herramientas encantadas con toque de seda.{*B*} -- Los botones de madera y las placas de presión de madera se pueden activar con flechas.{*B*} -- Los enemigos del mundo inferior pueden regenerarse en el mundo superior desde los portales.{*B*} -- Los creepers y las arañas son agresivos con el último jugador que los ataque.{*B*} -- En el modo Creativo los enemigos vuelven a ser neutrales tras un breve periodo.{*B*} -- Se elimina el bloqueo al ahogarse.{*B*} -- Las puertas rotas por los zombis muestran daños.{*B*} -- El hielo se derrite en el mundo inferior.{*B*} -- Los calderos se llenan cuando se exponen a la lluvia.{*B*} -- Los pistones tardan el doble en actualizarse.{*B*} -- Los cerdos sueltan las sillas cuando mueren (si tienen).{*B*} -- El color del cielo en El Fin ha cambiado.{*B*} -- Se puede colocar cuerda (para cuerda de trampa).{*B*} -- La lluvia cae por entre las hojas.{*B*} -- Se pueden colocar palancas debajo de los bloques.{*B*} -- La dinamita inflige un daño que varía dependiendo del nivel de dificultad.{*B*} -- Se ha cambiado receta del libro.{*B*} -- Las barcas rompen los nenúfares, no son estos los que rompen las barcas.{*B*} -- Los cerdos sueltan más chuletas de cerdo.{*B*} -- Los limos se regeneran menos en los mundos superplanos.{*B*} -- La variable daño de creeper basada en nivel de dificultad, más bloqueo.{*B*} -- Se ha arreglado el finalizador que no abría la boca.{*B*} -- Se ha añadido el teletransporte de los jugadores (con el menú {*BACK_BUTTON*} del juego).{*B*} -- Se han añadido nuevas opciones para el anfitrión para volar, invisibilidad e invulnerabilidad para los jugadores a distancia.{*B*} -- Se han añadido nuevos tutoriales al mundo Tutorial para nuevos objetos y opciones.{*B*} -- Se han actualizado las posiciones de los cofres de discos en el mundo tutorial.{*B*} - - + + No puedes unirte a esta partida porque no tienes ningún amigo en ella. - - {*ETB*}¡Hola de nuevo! 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, mineral de esmeralda, bloque de esmeralda, cofre finalizador, garfio de cuerda de trampa, manzana de oro encantada, yunque, maceta, paredes de guijarros, pared de guijarros con musgo, pintura apagada, patata, patata asada, patata venenosa, zanahoria, zanahoria de oro, zanahoria con palo, pastel de calabaza, poción de visión nocturna, poción de invisibilidad, cuarzo del mundo inferior, mineral de cuarzo del mundo inferior, bloque de cuarzo, losa de cuarzo, escaleras de cuarzo, bloque de cuarzo tallado, bloque de cuarzo de pilar, libro encantado, alfombra.{*B*}{*B*} -{*T1*}Nuevos enemigos{*ETB*}: zombis aldeanos.{*B*}{*B*} -{*T1*}Nuevas características{*ETB*}: comercia con los aldeanos, repara o encanta armas y herramientas con yunque, almacena objetos en un cofre finalizador ¡y controla un cerdo mientras lo montas usando una zanahoria con palo!{*B*}{*B*} -{*T1*}Nuevos mini-tutoriales{*ETB*}: ¡Aprende a usar las nuevas opciones en el mundo tutorial!{*B*}{*B*} -{*T1*}Nuevos huevos de Pascua{*ETB*}: hemos cambiado de lugar todos los discos de música del mundo tutorial, ¡a ver si puedes encontrarlos otra vez!{*B*}{*B*} - - + + No puedes unirte a esta partida porque el anfitrión te ha expulsado anteriormente. - - Causas más daño que con la mano. + + Has sido expulsado de la partida por volar. - - 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. + + El intento de conexión ha tardado demasiado. - - Necesario para extraer bloques de piedra y mineral. + + El servidor está lleno. - - Se usa para cortar bloques de madera más rápido que a mano. + + 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 probablemente no cancelarán su ataque explosivo cuando te alejes de ellos! - - Se usa para labrar tierra y hierba y prepararla para el cultivo. + + Temas - - Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. + + Packs de aspectos - - Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. + + Permitir amigos de amigos - - SIN USAR + + Expulsar jugador - - SIN USAR + + ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. - - SIN USAR + + Packs de imágenes de jugador - - SIN USAR + + No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. - - Cuando lo lleva puesto, el usuario recibe 1 de armadura. + + Contenido descargable dañado - - Cuando la lleva puesta, el usuario recibe 3 de armadura. + + El contenido descargable está dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. - - Cuando las lleva puestas, el usuario recibe 2 de armadura. + + Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + No te puedes unir a la partida - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Seleccionado - - Cuando la lleva puesta, el usuario recibe 5 de armadura. + + Aspecto seleccionado: - - Cuando las lleva puestas, el usuario recibe 4 de armadura. + + Conseguir versión completa - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + Desbloquear pack de textura - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Desbloquea este pack de textura para usarlo en tu mundo. +¿Te gustaría desbloquearlo ahora? - - Cuando la lleva puesta, el usuario recibe 6 de armadura. + + Pack de textura de prueba - - Cuando las lleva puestas, el usuario recibe 5 de armadura. + + Semilla - - Cuando las lleva puestas, el usuario recibe 2 de armadura. + + Desbloquear pack de aspecto - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Para usar el aspecto que has seleccionado tienes que desbloquear este pack de aspecto. +¿Quieres desbloquear este pack de aspecto ahora? - - Cuando la lleva puesta, el usuario recibe 5 de armadura. + + 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? - - Cuando las lleva puestas, el usuario recibe 3 de armadura. + + Descargar versión completa - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + ¡Este mundo usa un pack de textura o de popurrí que no tienes! +¿Quieres instalar el pack de textura o de popurrí ahora? - - Cuando lo lleva puesto, el usuario recibe 3 de armadura. + + Conseguir versión de prueba - - Cuando la lleva puesta, el usuario recibe 8 de armadura. + + Pack de textura no disponible - - Cuando las lleva puestas, el usuario recibe 6 de armadura. + + Desbloquear versión completa - - Cuando las lleva puestas, el usuario recibe 3 de armadura. + + Descargar versión de prueba - - Un lingote brillante que se usa para fabricar herramientas de este material. Se crea fundiendo mineral en un horno. + + Se ha cambiado el modo de juego. - - 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. + + Si está habilitado, solo los jugadores invitados pueden unirse. - - Se usa para aplicar una descarga eléctrica cuando un jugador, un animal o un monstruo la pisan. Las placas de presión de madera también se activan soltando algo sobre ellas. + + Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. - - Se usan en escaleras compactas. + + Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + Normal - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + Superplano - - Se usa para crear luz, pero también derrite la nieve y el hielo. + + Si está habilitado, la partida será online. - - Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. + + Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. - - Se usa como material de construcción. No le afecta la gravedad, como a la arena normal. + + Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. - - Se usa como material de construcción. + + Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el inferior. - - Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. + + Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador. - - Se usa para avanzar de la noche a la mañana si todos los jugadores están en cama; además cambia su punto de generación. -El color de la lana que se use no varía el color de la cama. + + Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. - - Te permite crear una selección más variada de objetos que la creación normal. + + Si está habilitado, la dinamita explota cuando se activa. - - Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. + + Si está habilitado, el mundo inferior se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior. - - 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. + + No - - 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. + + Modo de juego: Creativo - - Se usa para ascender en vertical. + + Supervivencia - - Se activa al usarla, golpearla o con piedra rojiza. Funciona como una puerta normal, pero tiene el tamaño de un bloque y se encuentra en el suelo. + + Creativo - - Muestra el texto introducido por ti o por otros jugadores. + + Cambiar nombre del mundo - - 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. + + Escribe un nuevo nombre para tu mundo. - - Se usa para provocar explosiones. Se activa después de su colocación golpeándola con el objeto chisquero de pedernal o con una descarga eléctrica. + + Modo de juego: Supervivencia - - Se usa para contener estofado de champiñón. Te quedas el cuenco después de comer el estofado. + + Creado en modo Supervivencia - - Se usa para contener y transportar agua, lava y leche. + + Renombrar partida guardada - - Se usa para contener y transportar agua. + + Autoguardando en %d... - - Se usa para contener y transportar lava. + + - - Se usa para contener y transportar leche. + + Creado en modo Creativo - - Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. + + Generar nubes - - Se usa para pescar peces. + + ¿Qué quieres hacer con esta partida guardada? - - Muestra la posición del sol y de la luna. + + Tamaño panel (pant. divid.) - - Indica tu punto de inicio. + + Ingrediente - - Mientras lo sostienes, crea una imagen del área explorada. Se puede usar para buscar rutas. + + Combustible - - Permite ataques a distancia con flechas. + + Dispensador - - Se usa como munición para arcos. + + Cofre - - Restablece 2,5{*ICON_SHANK_01*}. + + Encantar - - Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. + + Horno - - Restablece 1{*ICON_SHANK_01*}. + + No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. - - Restablece 1{*ICON_SHANK_01*}. + + ¿Seguro que quieres borrar esta partida guardada? - - Restablece 3{*ICON_SHANK_01*}. + + Esperando aprobación - - Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Puede envenenarte. + + Censurado - - Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en un horno. + + %s se ha unido a la partida. - - Restablece 1,5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + %s ha abandonado la partida. - - Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en un horno. + + Han expulsado a %s de la partida. - - Restablece 1,5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + Soporte para pociones - - Restablece 4{*ICON_SHANK_01*}. Se crea cocinando una chuleta de cerdo cruda en un horno. + + Introducir texto del cartel - - Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede dar de comer a un ocelote para domarlo. + + Introduce una línea de texto para tu cartel. - - Restablece 2,5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en un horno. + + Introducir título - - Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. + + Fin de la prueba - - Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Se puede crear a partir de una manzana y pepitas de oro. + + Partida llena - - Restablece 2{*ICON_SHANK_01*}. Puede envenenarte. + + No te has podido unir a la partida y no quedan más espacios. - - Se usa en la receta de pasteles y como ingrediente para elaborar pociones. + + Introduce un título para tu publicación. - - Se activa y desactiva para aplicar una descarga eléctrica. Se mantiene en estado activado o desactivado hasta que se vuelve a pulsar. + + Introduce una descripción para tu publicación. - - 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. + + Inventario - - Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. + + Ingredientes - - Se usa para enviar una descarga eléctrica cuando se pulsa. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. + + Introducir subtítulo - - Se usa para contener y arrojar objetos en orden aleatorio cuando recibe una descarga de piedra rojiza. + + Introduce un subtítulo para tu publicación. - - Reproduce una nota cuando se activa. Si lo golpeas cambiarás el tono de la nota. Colócalo en la parte superior de distintos bloques para cambiar el tipo de instrumento. + + Introducir descripción - - Se usa para llevar vagonetas. + + Sonando: - - Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. + + ¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? +Selecciona ACEPTAR para salir de la partida. - - Funciona como una placa de presión: envía una señal de piedra rojiza cuando se activa, pero solo puede hacerlo una vagoneta. + + Eliminar de la lista de bloqueados - - Se usa para transportarte a ti, a un animal o a un monstruo por raíles. + + Autoguardado cada - - Se usa para transportar mercancías por los raíles. + + Nivel bloqueado - - Se mueve por raíles y empujará a otras vagonetas si se le añade hulla. + + La partida a la que te estás uniendo está en la lista de niveles bloqueados. +Si decides unirte a esta partida, el nivel se eliminará de tu lista de niveles bloqueados. - - Te permite desplazarte por el agua más rápido que nadando. + + ¿Bloquear este nivel? - - Se obtiene de las ovejas y se puede colorear con tinte. + + Autoguardado: NO - - 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. + + Opacidad de interfaz - - Se usa como tinte para crear lana negra. + + Preparando autoguardado del nivel - - Se usa como tinte para crear lana verde. + + Tamaño del panel de datos - - Se usa como tinte para crear lana marrón, como ingrediente de galletas o para cultivar plantas de cacao. + + min. - - Se usa como tinte para crear lana plateada. + + ¡No se puede colocar aquí! - - Se usa como tinte para crear lana amarilla. + + No se puede colocar lava cerca del punto de generación del nivel porque puede matar al instante a los jugadores que se regeneran. - - Se usa como tinte para crear lana roja. + + Aspectos favoritos - - Se usa para que crezcan al instante cosechas, árboles, hierba alta, champiñones gigantes y flores, y se puede utilizar en recetas de tinte. + + Partida de %s - - Se usa como tinte para crear lana rosa. + + Partida de anfitrión desconocido - - Se usa como tinte para crear lana naranja. + + Un invitado ha cerrado la sesión - - Se usa como tinte para crear lana lima. + + Restablecer configuración - - Se usa como tinte para crear lana gris. + + ¿Seguro que quieres restablecer la configuración a los valores predeterminados? - - Se usa como tinte para crear lana gris clara. -(Nota: combinar tinte gris con polvo de hueso creará 4 tintes gris claro de cada bolsa de tinta en vez de 3). + + Error al cargar - - Se usa como tinte para crear lana azul clara. + + Un jugador invitado ha cerrado la sesión, lo que ha provocado que todos los invitados queden excluidos de la partida. - - Se usa como tinte para crear lana cian. + + Imposible crear la partida - - Se usa como tinte para crear lana púrpura. + + Selección automática - - Se usa como tinte para crear lana magenta. + + Sin pack: aspectos por defecto - - Se usa como tinte para crear lana azul. + + Iniciar sesión - - Reproduce discos. + + No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? - - Úsalos para crear herramientas, armas o armaduras sólidas. + + Multijugador no admitido - - 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. + + Beber - - Se usa para crear libros y mapas. + + En esta área se ha colocado una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. - - Se usa para crear estanterías de libros o encantarse para hacer libros encantados. + + {*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. - - Permite crear encantamientos más potentes si se coloca cerca de una mesa de encantamientos. + + 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. - - Se usa como elemento decorativo. + + Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. - - Se puede extraer con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. + + Para continuar, cruza al otro lado de este agujero. - - Se puede extraer con un pico de piedra o un objeto mejor y después fundir en un horno para producir lingotes de hierro. + + Has completado el tutorial del modo Creativo. - - Se puede extraer con un pico para obtener hulla. + + 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. - - Se puede extraer con un pico de piedra o un objeto mejor para obtener lapislázuli. + + 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*} - - Se puede extraer con un pico de hierro o un objeto mejor para obtener diamantes. + + Los champiñones deben plantarse en una zona con luz tenue y se propagarán a los bloques de luz tenue cercanos.{*ICON*}39{*/ICON*} - - Se puede extraer con un pico de hierro o un objeto mejor para obtener polvo de piedra rojiza. + + El polvo de hueso se puede usar para germinar cultivos hasta su estado de mayor crecimiento o cultivar champiñones hasta que se vuelvan gigantes.{*ICON*}351:15{*/ICON*} - - Se puede extraer con un pico para obtener guijarros. + + 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*} - - Se recoge con una pala. Se puede emplear en la construcción. + + 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. - - Se puede plantar y con el tiempo se convierte en un árbol. + + La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. Al cortar un bloque de caña de azúcar, todos los bloques que estén sobre él caerán.{*ICON*}83{*/ICON*} - - No se puede romper. + + En el modo Creativo posees un número infinito de todos los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. - - Prende fuego a cualquier cosa que toque. Se puede recoger en un cubo. + + 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. - - Se recoge con una pala. Se puede fundir y convertir en cristal en el horno. Le afecta la gravedad si no hay ningún otro bloque por debajo. + + ¡En esta área hay un portal al mundo inferior! - - Se recoge con una pala. A veces produce pedernal cuando se excava. Le afecta la gravedad si no hay ningún otro bloque por debajo. + + {*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 sabes cómo funcionan los portales y el mundo inferior. - - Se corta con un hacha y se puede convertir en tablones o usar como combustible. + + 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 suministrar 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*} - - Se crea en el horno al fundir arena. Se puede usar en la construcción, pero si intentas extraerlo, se romperá. + + 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*} - - Se extrae de la piedra con un pico. Se puede usar para construir un horno o herramientas de madera. + + 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*} - - Se cuece con arcilla en un horno. + + Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. - - Se cuece y se convierte en ladrillo en un horno. + + El mundo inferior sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el mundo inferior equivale a desplazarte tres bloques en el mundo superior. - - Cuando se rompe suelta bolas de arcilla que se pueden cocer y convertir en ladrillos en un horno. + + Ahora estás en el modo Creativo. - - Una forma compacta de almacenar bolas de nieve. + + {*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. - - Se puede excavar con una pala para crear bolas de nieve. + + Para activar el portal inferior, prende fuego a los bloques de obsidiana del interior de la estructura con un chisquero de pedernal. Los portales se pueden desactivar si se rompe la estructura, si se produce una explosión cerca o si fluye un líquido a través de ellos. - - A veces produce semillas de trigo cuando se rompe. + + 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. - - Se puede convertir en tinte. + + El mundo inferior es un lugar peligroso, repleto de lava, pero puede ser útil para recoger bloques inferiores, que arden para siempre una vez que se encienden, y piedra brillante, que genera luz. - - Junto con un cuenco se puede convertir en estofado. + + Has completado el tutorial de los cultivos. - - Solo se puede extraer con un pico de diamante. Se produce al combinar agua con lava inmóvil y se usa para construir portales. + + Cada herramienta funciona mejor con distintos materiales. Deberías usar un hacha para cortar troncos de árboles. - - Genera monstruos en el mundo. + + Cada herramienta funciona mejor con distintos materiales. Deberías usar un pico para extraer piedra y mineral. Quizá debas fabricar tu pico con mejores materiales para obtener recursos de algunos bloques. - - Se coloca en el suelo para transportar una descarga eléctrica. Si se elabora con una poción, aumentará la duración del efecto. + + Hay herramientas que son mejores para atacar a determinados enemigos. Plantéate usar una espada para atacar. - - Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. + + Los gólems de hierro aparecen en las aldeas para protegerlas, y te atacarán si atacas a los aldeanos. - - Terreno que se ha preparado para plantar semillas. + + No puedes salir de esta área hasta que completes el tutorial. - - Se pueden cocinar en un horno para crear tinte verde. + + Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para extraer materiales blandos, como tierra y arena. - - Se pueden usar para crear azúcar. + + Consejo: mantén pulsado {*CONTROLLER_ACTION_ACTION*}para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... - - Se puede llevar como casco o convertir en antorcha para crear una calabaza iluminada. También es el ingrediente principal del pastel de calabaza. + + En el cofre que está junto al río hay un barco. Para usarlo, apunta al agua con el cursor y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al barco para subir a él. - - Si se le prende fuego, arderá para siempre. + + En el cofre que está junto al estanque hay una caña de pescar. Coge la caña del cofre y selecciónala para llevarla en la mano y usarla. - - Ralentiza el movimiento de cualquier cosa que camina sobre ella. + + ¡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 te colocas en el portal podrás trasladarte del mundo superior al inferior y viceversa. + + La herramienta que usas está dañada. Cada vez que utilizas una herramienta, se desgasta y, con el tiempo, acabará rompiéndose. La barra de colores de debajo del objeto en el inventario muestra el estado de daños actual. - - Se usa como combustible en un horno o se puede convertir en una antorcha. + + Mantén pulsado{*CONTROLLER_ACTION_JUMP*} para nadar. - - Se consigue al matar una araña y se puede convertir en un arco o en una caña de pescar, o colocarlo en el suelo para crear cuerda de trampa. + + En esta área hay una vagoneta en una vía. Para subir a una vagoneta, apunta con el cursor hacia ella y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. - - Se consigue al matar una gallina y se puede convertir en una flecha. + + 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. - - Se consigue al matar un creeper y se puede convertir en dinamita o como ingrediente para elaborar pociones. + + 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 las gallinas, 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. - - Se puede plantar en una granja para que crezcan cultivos. ¡Asegúrate de que hay luz suficiente para que prosperen! + + 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. - - Se recoge de los cultivos y se puede usar para crear alimentos. + + Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo. - - Se obtiene al excavar gravilla y se puede usar para crear un chisquero de pedernal. + + En esta área se han guardado animales en corrales. Puedes hacer que los animales se reproduzcan para crear crías de sí mismos. - - Si se usa con un cerdo te permite montarlo. Luego puedes manejar al cerdo con una zanahoria con palo. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre reproducción de animales.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes sobre reproducción de animales. - - Se obtiene al excavar nieve y se puede arrojar. + + Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el "modo Amor". - - Se obtiene al matar una vaca y se puede convertir en armadura o para hacer libros. + + 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*} - - Se obtiene al matar un limo o como ingrediente para elaborar pociones o hacer pistones adhesivos. + + {*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. - - Las gallinas lo ponen al azar y se puede convertir en alimentos. + + Los gólems se crean colocando una calabaza encima de un montón de bloques. - - Se obtiene al extraer una piedra brillante y se puede convertir en bloques de piedra brillante otra vez o para elaborar una poción para aumentar la potencia del efecto. + + 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. - - Se obtiene al matar un esqueleto. Se puede convertir en polvo de hueso. Se puede dar de comer a un lobo para domarlo. + + + Los lobos salvajes pueden domesticarse dándoles huesos. Una vez domesticados, aparecerán corazones a su alrededor. Los lobos domesticados siguen al jugador y lo defienden si no se les ha ordenado sentarse. + - - Se obtiene al hacer que un esqueleto mate a un creeper. Se puede reproducir en un tocadiscos. + + Has completado el tutorial Reproducción de animales. - - Apaga el fuego y ayuda a que crezcan las cosechas. Se puede recoger en un cubo. + + En esta zona hay algunas calabazas y bloques para crear un gólem de nieve y otro de hierro. - - Si se rompen, a veces sueltan un brote que se puede plantar para que crezca un árbol. + + 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. - - Se encuentra en mazmorras y se puede emplear en la construcción y en la decoración. + + Si un caldero se vacía, puedes rellenarlo con un cubo de agua. - - Se usan para obtener lana de las ovejas y cosechar bloques de hoja. + + Usa el soporte para pociones para crear una poción de resistencia al fuego. Necesitarás una botella de agua, verruga del mundo inferior y crema de magma. - - Cuando se activa (por medio de un botón, una palanca, una placa de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. + + 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. - - Cuando se activa, 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. + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la elaboración y las pociones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo elaborar pociones. - - Se crea con bloques de piedra y se encuentra normalmente en fortalezas. + + El primer paso para elaborar una poción es crear una botella de agua. Toma una botella de agua del cofre. - - Se usa como barrera, igual que las vallas. + + 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*}. - - Es como una puerta, pero se usa principalmente con vallas. + + Usa una poción de resistencia al fuego contigo mismo. - - Se puede crear a partir de rodajas de melón. + + Para encantar un objeto, primero colócalo en el espacio de encantamiento. Las armas, las armaduras y algunas herramientas se pueden encantar para añadirles efectos especiales, como resistencia mejorada al daño o aumento del número de objetos que se generan al extraer un bloque. - - Bloques transparentes que se pueden usar como alternativa a los bloques de cristal. + + Cuando se coloca un objeto en el espacio de encantamiento, los botones de la parte derecha cambian y muestran una selección de encantamientos aleatorios. - - Se puede plantar para cultivar calabazas. + + El número del botón representa el coste en niveles de experiencia que cuesta aplicar ese encantamiento al objeto. Si tu nivel es insuficiente, el botón no estará activo. - - Se puede plantar para cultivar melones. + + Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. - - La 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. + + Esta es la interfaz de encantamiento, que puedes usar para aplicar encantamientos a armas, armaduras y a algunas herramientas. - - Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de encantamientos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de encantamientos. - - Se puede emplear en la construcción y en la decoración. + + En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. - - Ralentiza el movimiento cuando pasas sobre ella. Se puede destruir con unas cizallas para obtener cuerda. + + El carbón se puede usar como combustible y convertirse en una antorcha con un palo. - - Genera un pez plateado cuando se destruye o, a veces, cuando está cerca de otro pez plateado al que estén atacando. + + 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. - - Una vez colocada, va creciendo con el paso del tiempo. Se puede recoger con cizallas. Puede usarse como una escalera para trepar por ella. + + Esta es la interfaz de elaboración de pociones. Se puede usar para crear pociones con efectos diversos. - - Cuando pasas sobre él, te resbalas. Se convierte en agua cuando se destruye si está sobre otro bloque. Se derrite si está cerca de una fuente de luz o cuando se coloca en el mundo inferior. + + Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También descubrirás otros objetos en el mundo que funcionan como combustible. - - Se puede usar como elemento decorativo. + + 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. - - Se usa para elaborar pociones y para localizar fortalezas. La sueltan las llamas, que se suelen encontrar en las fortalezas del mundo inferior o cerca. + + 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. - - Se usa para elaborar pociones. La sueltan los espectros cuando mueren. + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el soporte para pociones. - - La sueltan los porqueros zombis cuando mueren. Estos se encuentran en el mundo inferior. Se usa como ingrediente para elaborar pociones. + + Si añades ojo de araña fermentado, la poción se corromperá y podría convertirse en otra con el efecto contrario, y si añades pólvora, la convertirás en una poción de salpicadura, que se puede lanzar para aplicar su efecto sobre un área cercana. - - Se usan para preparar pociones. Crecen de forma natural en las fortalezas del mundo inferior. También se pueden plantar en arena de alma. + + 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. - - Puede tener diversos efectos, dependiendo de con qué se use. + + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de elaboración de pociones. - - Se puede llenar con agua y se usa como ingrediente base para crear una poción en el soporte para pociones. + + Para elaborar pociones, coloca un ingrediente en la parte superior y una botella de agua o una poción en los espacios inferiores (se pueden elaborar hasta 3 a la vez). Cuando se introduce una combinación válida, comienza la elaboración y, al cabo de poco tiempo, se creará una poción. - - Es una comida venenosa y un ingrediente para pociones. Aparece cuando el jugador mata una araña o una araña de las cuevas. + + 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. - - Se usa para elaborar pociones, principalmente con efecto negativo. + + 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. - - Se usa para elaborar pociones o se combina con otros objetos para crear el ojo finalizador o la crema de magma. + + Selecciona un encantamiento y pulsa{*CONTROLLER_VK_A*} para encantar el objeto. Se reducirá el nivel de experiencia en función del coste del encantamiento. - - Se usa para elaborar pociones. + + Pulsa{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. Pulsa{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. + {*FishingRodIcon*} - - Se usa para crear pociones y pociones de salpicadura. + + 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 la salud. + {*FishIcon*} - - Se puede llenar de agua de lluvia o con un cubo y usar para llenar de agua las botellas de cristal. + + Al igual que muchas otras herramientas, la caña tiene distintos usos, los cuales no se limitan a pescar peces. Puedes experimentar con ella e investigar qué se puede pescar o activar... + {*FishingRodIcon*} - - 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. + + Los barcos te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para dirigirlo. + {*BoatIcon*} - - Se usa para elaborar pociones. + + Ahora usas una caña de pescar. Pulsa{*CONTROLLER_ACTION_USE*} para utilizarla.{*FishingRodIcon*} - - Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. + + {*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. - - Flota en el agua y se puede caminar sobre él. + + 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*} - - Se usa para construir fortalezas del mundo inferior. Es inmune a las bolas de fuego del espectro. + + En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. - - Se usa en las fortalezas del mundo inferior. + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y de pistones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los circuitos de piedra rojiza y de pistones. - - Se encuentra en las fortalezas del mundo inferior y suelta verrugas del mundo inferior cuando se rompe. + + Las palancas, los botones, las placas de presión y las antorchas de piedra rojiza suministran energía a los circuitos, bien acoplándolos directamente al objeto que quieres activar o bien conectándolos con polvo de piedra rojiza. - - Permite encantar espadas, picos, hachas, palas, arcos y armaduras utilizando puntos de experiencia. + + {*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. - - Se puede activar con doce ojos finalizadores y permite al jugador viajar a la dimensión El Fin. + + Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Si mueres después de haber usado una cama, te regenerarás en ella. + {*ICON*}355{*/ICON*} - - Se usa para crear un portal final. + + Si hay más jugadores en tu partida, todos deberán estar metidos en la cama al mismo tiempo para poder dormir. + {*ICON*}355{*/ICON*} - - Un tipo de bloque que se encuentra en El Fin. Tiene una resistencia contra explosiones elevada, así que es útil para utilizar en la construcción. + + {*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. - - Este bloque se crea al derrotar al dragón en El Fin. + + Con una mesa de encantamiento 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. - - Cuando se lanza, suelta orbes de experiencia que aumentan tus puntos de experiencia cuando se recogen. + + Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. - - Útil para prender fuego a las cosas o para provocar incendios indiscriminados cuando se dispara con el dispensador. + + Encantar objetos cuesta niveles de experiencia, que se aumentan acumulando 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. - - Es similar a una vitrina y muestra el objeto o el bloque que contiene. + + Aunque los encantamientos son aleatorios, algunos de los mejores solo están disponibles cuando tienes el nivel de experiencia adecuado y muchas estanterías alrededor de la mesa de encantamiento para aumentar su poder. - - Al lanzarse, puede generar una criatura del tipo indicado. + + En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. - - Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los encantamientos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar los encantamientos. - - Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + También puedes aumentar tus niveles de experiencia con una botella de encantamiento que, cuando se lanza, crea orbes de experiencia donde cae. Después podrás recoger esos orbes. - - Se crea al fundir un bloque inferior en un horno. Se puede convertir en bloques de ladrillo del mundo inferior. + + 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*} - - Al recibir energía, emite luz. + + 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 placas de presión para crear sistemas complejos. + {*PoweredRailIcon*} - - Puede cultivarse en la granja para cosechar granos de cacao. + + Ahora navegas en un barco. Para salir de él, apúntalo con el puntero y pulsa{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - Las cabezas de enemigos pueden colocarse como decoración o llevarse como una máscara en el espacio del casco. + + En los cofres de esta zona encontrarás objetos encantados, botellas de encantamientos y objetos que aún están sin encantar para que experimentes con ellos en la mesa de encantamiento. - - Calamar + + Ahora vas subido en una vagoneta. Para salir de ella, apunta a ella con el cursor y pulsa{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - Suelta bolsas de tinta cuando muere. + + {*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. - - Vaca + + Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltar ese objeto. - - Suelta cuero cuando muere. Se puede ordeñar con un cubo. + + Leer - - Oveja + + Colgar - - Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. + + Arrojar - - Gallina + + Abrir - - Suelta plumas cuando muere y pone huevos al azar. + + Cambiar tono - - Cerdo + + Detonar - - Suelta chuletas de cerdo cuando muere. Se puede montar con una silla. + + Plantar - - Lobo + + Desbloquear juego completo - - Es dócil hasta que lo atacan, ya que devolverá el ataque. Se puede domar con huesos para que te siga a todas partes y ataque a cualquier cosa que te ataque a ti. + + Borrar partida guardada - - Creeper + + Borrar - - ¡Explota si te acercas demasiado! + + Labrar - - Esqueleto + + Cosechar - - Te dispara flechas. Suelta flechas y huesos cuando muere. + + Continuar - - Araña + + Nadar hacia arriba - - Te ataca cuando está cerca. Puede trepar por muros. Suelta cuerda cuando muere. + + Golpear - - Zombi + + Ordeñar - - Te ataca cuando está cerca. + + Recoger - - Porquero zombi + + Vaciar - - En principio es manso, pero si atacas a uno, atacará en grupo. + + Silla de montar - - Espectro + + Colocar - - Te dispara bolas de fuego que explotan al entrar en contacto. + + Comer - - Limo + + Montar - - Escupe limos más pequeños cuando recibe daños. + + Navegar - - Finalizador + + Cultivar - - Te ataca si lo miras. También puede mover bloques de sitio. + + Dormir - - Pez plateado + + Despertar - - Atrae a los peces plateados ocultos cercanos al atacarlo. Se oculta en bloques de piedra. + + Rep. - - Araña de las cuevas + + Opciones - - Tiene una picadura venenosa. + + Mover armadura - - Champiñaca + + Mover arma - - Crea estofado de champiñón si se usa en un cuenco. Suelta champiñones y se convierte en una vaca normal cuando se esquila. + + Equipar - - Gólem de nieve + + Mover ingrediente - - Se crea con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. + + Mover combustible - - Dragón finalizador + + Mover herramienta - - Un dragón negro y grande que se encuentra en El Fin. + + Disparar - - Llama + + Retroceder página - - Son enemigos que se encuentran en el mundo inferior, principalmente dentro de sus fortalezas. Sueltan varas de llama cuando mueren. + + Avanzar página - - Cubo de magma + + Modo Amor - - Se encuentran en el mundo inferior. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. + + Soltar - - Aldeano + + Privilegios - - Ocelote + + Bloquear - - Se encuentra en junglas. Puede domarse dándole de comer pescado crudo. Tienes que dejar que se te acerque, aunque ten cuidado: un movimiento repentino lo espantará. + + Creativo - - Gólem de hierro + + Bloquear nivel - - Aparece en aldeas para protegerlas y puede crearse usando bloques de hierro y calabazas. + + Seleccionar aspecto - - Explosives Animator + + Prender fuego - - Concept Artist + + Invitar a amigos - - Number Crunching and Statistics + + Aceptar - - Bully Coordinator + + Esquilar - - Original Design and Code by + + Desplazar - - Project Manager/Producer + + Reinstalar - - Rest of Mojang Office + + Op. de guardado - - Lead Game Programmer Minecraft PC + + Ejecutar comando - - Ninja Coder + + Instalar versión completa - - CEO + + Instalar versión de prueba - - White Collar Worker + + Instalar - - Customer Support + + Expulsar - - Office DJ + + Actualizar partidas online - - Designer/Programmer Minecraft - Pocket Edition + + Partidas en grupo - - Developer + + Todas las partidas - - Chief Architect + + Salir - - Art Developer + + Cancelar - - Game Crafter + + No unirse - - Director of Fun + + Cambiar grupo - - Music and Sounds + + Creación - - Programming + + Crear - - Art + + Coger/Colocar - - QA + + Mostrar inventario - - Executive Producer + + Mostrar descripción - - Lead Producer + + Mostrar ingredientes - - Producer + + Atrás - - Test Lead + + Recordatorio: - - Lead Tester + + - - Design Team + + Se han añadido nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. - - Development Team + + No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. - - Release Management + + ¡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! - - Director, XBLA Publishing + + {*EXIT_PICTURE*} Cuando estés listo para seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. - - Business Development + + {*B*}Pulsa{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} + Pulsa{*CONTROLLER_VK_B*} para omitir el tutorial principal. - - Portfolio Director + + {*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 sabes cómo funciona la barra de comida y cómo comer. - - Product Manager + + Seleccionar - - Marketing + + Usar - - Community Manager + + En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los barcos y la piedra rojiza. - - Europe Localization Team + + Fuera de esta área encontrarás ejemplos de edificios, cultivos, vagonetas y vías, encantamientos, pociones, comercio, herrería y mucho más. - - Redmond Localization Team + + La barra de comida se ha agotado hasta un nivel a partir del cual ya no te puedes curar. - - Asia Localization Team + + Coger - - User Research Team + + Siguiente - - MGS Central Teams + + Anterior - - Milestone Acceptance Tester + + Expulsar jugador - - Special Thanks + + Enviar solicitud de amistad - - Test Manager + + Avanzar página - - Senior Test Lead + + Retroceder página - - SDET + + Teñir - - Project STE + + Curar - - Additional STE + + Sentarse - - Test Associates + + Sígueme - - Jon Kågström + + Extraer - - Tobias Möllstam + + Alimentar - - Risë Lugo + + Domar - - Espada de madera + + Cambiar filtro - - Espada de piedra + + Colocar todo - - Espada de hierro + + Colocar uno - - Espada de diamante + + Soltar - - Espada de oro + + Coger todo - - Pala de madera + + Coger la mitad - - Pala de piedra + + Colocar - - Pala de hierro + + Soltar todo - - Pala de diamante + + Borrar selección rápida - - Pala de oro + + ¿Qué es esto? - - Pico de madera + + Compartir en Facebook - - Pico de piedra + + Soltar uno - - Pico de hierro + + Cambiar - - Pico de diamante + + Movimiento rápido - - Pico de oro + + Packs de aspecto - - Hacha de madera + + Panel de cristal tintado rojo - - Hacha de piedra + + Panel de cristal tintado verde - - Hacha de hierro + + Panel de cristal tintado marrón - - Hacha de diamante + + Cristal tintado blanco - - Hacha de oro + + Panel de cristal tintado - - Azada de madera + + Panel de cristal tintado negro - - Azada de piedra + + Panel de cristal tintado azul - - Azada de hierro + + Panel de cristal tintado gris - - Azada de diamante + + Panel de cristal tintado rosa - - Azada de oro + + Panel de cristal tintado lima - - Puerta de madera + + Panel de cristal tintado morado - - Puerta de hierro + + Panel de cristal tintado cian - - Casco de malla + + Panel de cristal tintado gris claro - - Peto de malla + + Cristal tintado naranja - - Mallas de malla + + Cristal tintado azul - - Botas de malla + + Cristal tintado morado - - Gorro de cuero + + Cristal tintado cian - - Casco de hierro + + Cristal tintado rojo - - Casco de diamante + + Cristal tintado verde - - Casco de oro + + Cristal tintado marrón - - Túnica de cuero + + Cristal tintado gris claro - - Coraza de hierro + + Cristal tintado amarillo - - Coraza de diamante + + Cristal tintado azul claro - - Coraza de oro + + Cristal tintado magenta - - Calzas de cuero + + Cristal tintado gris - - Mallas de hierro + + Cristal tintado rosa - - Mallas de diamante + + Cristal tintado lima - - Mallas de oro + + Panel de cristal tintado amarillo - - Botas de cuero + + Gris claro - - Botas de hierro + + Gris - - Botas de diamante + + Rosa - - Botas de oro + + Azul - - Lingote de hierro + + Morado - - Lingote de oro + + Cian - - Cubo + + Lima - - Cubo de agua + + Naranja - - Cubo de lava + + Blanco - - Chisquero de pedernal + + Personalizado - - Manzana + + Amarillo - - Arco + + Azul claro - - Flecha + + Magenta - - Hulla + + Marrón - - Carbón + + Panel de cristal tintado blanco - - Diamante + + Bola pequeña - - Palo + + Bola grande - - Cuenco + + Panel de cristal tintado azul claro - - Estofado de champiñón + + Panel de cristal tintado magenta - - Cuerda + + Panel de cristal tintado naranja - - Pluma + + Forma de estrella - - Pólvora + + Negro - - Semillas de trigo + + Rojo - - Trigo + + Verde - - Pan + + Forma de creeper - - Pedernal + + Explosión - - Chuleta de cerdo cruda + + Forma desconocida - - Chuleta de cerdo cocinada + + Cristal tintado negro - - Cuadro + + Armadura de caballo de hierro - - Manzana de oro + + Armadura de caballo de oro - - Cartel + + Armadura de caballo de diamante - - Vagoneta + + Comparador de piedra rojiza - - Silla de montar + + Vagoneta con dinamita - - Piedra rojiza + + Vagoneta con tolva - - Bola de nieve + + Correa - - Barco + + Baliza - - Cuero + + Cofre con trampa - - Cubo de leche + + Placa de presión con peso (ligera) - - Ladrillo + + Placa identificativa - - Arcilla + + Tablones de madera (cualquier tipo) - - Cañas de azúcar + + Bloque de comandos - - Papel + + Estrella de fuegos artificiales - - Libro + + Estos animales pueden domesticarse y usarse como montura. Se les puede acoplar un cofre. - - Bola de limo + + Mula - - Vagoneta con cofre + + Nace cuando crían un caballo y un burro. Estos animales pueden domesticarse, usarse como montura y transportar cofres. - - Vagoneta con horno + + Caballo - - Huevo + + Estos animales pueden domesticarse y usarse como montura. - - Brújula + + Burro - - Caña de pescar + + Caballo zombi - - Reloj + + Mapa vacío - - Polvo de piedra brillante + + Estrella del mundo inferior - - Pescado crudo + + Cohete de fuegos artificiales - - Pescado cocinado + + Caballo esqueleto - - Polvo de tinte + + Wither - - Bolsa de tinta + + Se crean con cráneos de Wither y arena de alma. Disparan cráneos explosivos. - - Rojo rosa + + Placa de presión con peso (pesada) - - Verde cactus + + Arcilla teñida gris claro - - Granos de cacao + + Arcilla teñida gris - - Lapislázuli + + Arcilla teñida rosa - - Tinte púrpura + + Arcilla teñida azul - - Tinte cian + + Arcilla teñida morada - - Tinte gris claro + + Arcilla teñida cian - - Tinte gris + + Arcilla teñida lima - - Tinte rosa + + Arcilla teñida naranja - - Tinte lima + + Arcilla teñida blanca - - Amarillo amargo + + Cristal tintado - - Tinte azul claro + + Arcilla teñida amarilla - - Tinte magenta + + Arcilla teñida azul claro - - Tinte naranja + + Arcilla teñida magenta - - Polvo de hueso + + Arcilla teñida marrón - - Hueso + + Tolva - - Azúcar + + Raíl activador - - Pastel + + Soltador - - Cama + + Comparador de piedra rojiza - - Repetidor de piedra rojiza + + Sensor de luz diurna - - Galleta + + Bloque de piedra rojiza - - Mapa + + Arcilla teñida - - Disco: "13" + + Arcilla teñida negra - - Disco: "gato" + + Arcilla teñida roja - - Disco: "bloques" + + Arcilla teñida verde - - Disco: "gorjeo" + + Bala de heno - - Disco: "lejos" + + Arcilla endurecida - - Disco: "galería" + + Bloque de carbón - - Disco: "mellohi" + + Fundido a - - Disco: "stal" + + Cuando está desactivado, impide que monstruos y animales cambien los bloques (por ejemplo, las explosiones de los creepers no destruyen los bloques y las ovejas no eliminan la hierba) o recojan objetos. - - Disco: "strad" + + Cuando se activa, los jugadores conservarán su inventario al morir. - - Disco: "pabellón" + + Cuando se desactiva, las criaturas no se generarán de forma natural. - - Disco: "11" + + Modo de juego: Aventura - - Disco: "dónde estamos" + + Aventura - - Cizallas + + Introduce una semilla para volver a generar el mismo terreno. Déjalo vacío para generar un mundo aleatorio. - - Semillas de calabaza + + Cuando se desactiva, los monstruos y animales no sueltan botín (por ejemplo, los creepers no sueltan pólvora). - - Semillas de melón + + {*PLAYER*} se ha caído de una escalera - - Pollo crudo + + {*PLAYER*} se ha caído de unas enredaderas - - Pollo cocinado + + {*PLAYER*} se ha caído del agua - - Ternera cruda + + Cuando se desactiva, los bloques no sueltan objetos al ser destruidos (por ejemplo, los bloques de piedra no sueltan guijarros). - - Filete + + Cuando se desactiva, los jugadores no regeneran salud de forma natural. - - Carne podrida + + Cuando se desactiva, la hora del día no cambia. - - Perla finalizadora + + Vagoneta - - Rodaja de melón + + Atar - - Vara de llama + + Liberar - - Lágrima de espectro + + Acoplar - - Pepita de oro + + Desmontar - - Verruga del mundo inferior + + Acoplar cofre - - Poción{*splash*}{*prefix*}{*postfix*} + + Lanzar - - Botella de cristal + + Nombrar - - Botella de agua + + Baliza - - Ojo de araña + + Poder principal - - Ojo de araña ferment. + + Poder secundario - - Polvo de llama + + Caballo - - Crema de magma + + Soltador - - Soporte para pociones + + Tolva - - Caldero + + {*PLAYER*} se ha caído de un sitio alto - - Ojo finalizador + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de murciélagos en un mundo. - - Melón resplandeciente + + Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de crías de caballos. - - Botella de encanto + + Opciones de juego - - Descarga de fuego - - - Desc. fuego (carbón) + + {*PLAYER*} ha recibido una bola de fuego de {*SOURCE*} usando {*ITEM*} - - Desc. de fuego (hulla) + + {*PLAYER*} ha recibido un golpe de {*SOURCE*} usando {*ITEM*} - - Marco + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando {*ITEM*} - - Generar {*CREATURE*} + + Desventaja de criaturas - - Ladrillo del mundo inferior + + Objetos de bloques - - Calavera + + Regeneración natural - - Calavera de esqueleto + + Ciclo de luz - - Calavera de esqueleto atrofiado + + Conservar inventario - - Cabeza de zombi + + Generación de criaturas - - Cabeza + + Botín de criaturas - - Cabeza de %s + + {*PLAYER*} ha recibido un disparo de {*SOURCE*} usando {*ITEM*} - - Cabeza de creeper + + {*PLAYER*} ha caído demasiado lejos y ha sido destruido por {*SOURCE*} - - Piedra + + {*PLAYER*} ha caído demasiado lejos y ha sido destruido por {*SOURCE*} usando {*ITEM*} - - Bloque de hierba + + {*PLAYER*} se ha metido en el fuego mientras luchaba con {*SOURCE*} - - Tierra + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} - - Guijarro + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} - - Tablones de roble + + {*PLAYER*} se ha visto condenado a caer por {*SOURCE*} usando {*ITEM*} - - Tablones de abeto + + {*PLAYER*} se ha achicharrado mientras luchaba con {*SOURCE*} - - Tablones de abedul + + {*PLAYER*} ha volado por los aires a manos de {*SOURCE*} - - Tablones de la jungla + + {*PLAYER*} se ha marchitado - - Brote + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando {*ITEM*} - - Brote de roble + + {*PLAYER*} ha intentado nadar en la lava para escapar de {*SOURCE*} - - Brote de abeto + + {*PLAYER*} se ha ahogado mientras intentaba escapar de {*SOURCE*} - - Brote de abedul + + {*PLAYER*} ha pisado un cactus mientras intentaba escapar de {*SOURCE*} - - Brote de árbol de la jungla + + Montura - - Lecho de roca + + +Para guiar a un caballo, hay que equiparlo con una silla, que se puede comprar a los aldeanos o encontrarse en cofres ocultos por el mundo. + - - Agua + + + Los burros y mulas domesticados pueden equiparse con alforjas agachándose y acoplándoles un cofre. Luego, se puede acceder a estas alforjas mientras se monta o en sigilo. + - - Lava + + Los caballos y burros (pero no las mulas) pueden criarse como los demás animales, usando manzanas de oro o zanahorias de oro. Los potros se convierten en caballos adultos con el tiempo, aunque alimentarlos con trigo o heno acelera el proceso. - - Arena + + + Los caballos, burros y mulas deben domesticarse antes de poder utilizarlos. Un caballo se domestica intentando montar en él, mientras este intenta sacudirse al jinete. + - - Arenisca + + +Una vez domesticado, aparecerán corazones a su alrededor y dejará de intentar librarse del jugador. + - - Grava + + Intenta montar este caballo. Usa {*CONTROLLER_ACTION_USE*} sin objetos ni herramientas en la mano para montarlo. - - Mineral de oro + + + Aquí puedes intentar domesticar caballos y burros, y también hay sillas, armadura para caballos y otros objetos útiles para los caballos en los cofres cercanos. + - - Mineral de hierro + + Una baliza sobre una pirámide de al menos 4 niveles ofrece la opción del poder secundario de regeneración o de un poder principal más fuerte. - - Mineral de hulla + + Para determinar los poderes de tu baliza, debes sacrificar una esmeralda, un diamante o un lingote de oro o hierro en el espacio de pago. Una vez determinados, los poderes emanarán de la baliza indefinidamente. - - Madera + + Sobre esta pirámide hay una baliza inactiva. - - Madera de roble + + Esta es la interfaz de balizas, que puedes usar para elegir los poderes que concederá tu baliza. - - Madera de abeto + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con la interfaz de balizas. - - Madera de abedul + + En el menú de baliza puedes seleccionar un poder principal para tu baliza. Cuantos más niveles tenga la pirámide, más poderes habrá para elegir. - - Madera de la jungla + + Todos los caballos, burros y mulas adultos pueden montarse. Sin embargo, solo los caballos pueden llevar armadura, y solo las mulas y los burros pueden equiparse con alforjas para transportar objetos. - - Roble + + Esta es la interfaz del inventario del caballo. - - Abeto + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya sabes utilizar el inventario del caballo. - - Abedul + + +El inventario del caballo te permite transferir o equipar con objetos a tu caballo, burro o mula. + - - Hojas + + Parpadeo - - Hojas de roble + + Estela - - Hojas de abeto + + Duración del vuelo: - - Hojas de abedul + + + Ensilla tu caballo colocando una silla en el espacio para sillas. Puedes equipar con armadura a tu caballo colocando una armadura de caballo en el espacio para armaduras. + - - Hojas de la jungla + + Has encontrado una mula. - - Esponja + + {*B*}Pulsa{*CONTROLLER_VK_A*} para saber más sobre caballos, burros y mulas. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con caballos, burros y mulas. - - Cristal + + Los caballos y burros se encuentran sobre todo en las llanuras. Las mulas son el producto del cruce entre burro y caballo, pero son estériles. - - Lana + + +También puedes transferir objetos entre tu inventario y las alforjas acopladas a burros y mulas en este menú. + - - Lana negra + + Has encontrado un caballo. - - Lana roja + + Has encontrado un burro. - - Lana verde + + {*B*}Pulsa{*CONTROLLER_VK_A*} para saber más sobre las balizas. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con las balizas. - - Lana marrón + + Las estrellas de fuegos artificiales pueden crearse colocando pólvora y tinte en la cuadrícula. - - Lana azul + + El tinte determinará el color de la explosión de la estrella de fuegos artificiales. - - Lana púrpura + + + La forma de la estrella de fuegos artificiales se establece añadiendo una descarga de fuego, una pepita de oro, una pluma o una cabeza de enemigo. - - Lana cian + + También puedes colocar varias estrellas de fuegos artificiales en la cuadrícula para añadirlas a los fuegos artificiales. - - Lana gris claro + + Llenar más espacios en la cuadrícula con pólvora aumentará la altura a la que harán explosión las estrellas de fuegos artificiales. - - Lana gris + + Luego puedes coger los fuegos artificiales terminados en el espacio de salida. - - Lana rosa + + + Puede añadirse una estela o un parpadeo usando diamantes o polvo de piedra brillante. - - Lana lima + + Los fuegos artificiales son objetos decorativos que pueden lanzarse a mano o desde dispensadores. Se fabrican usando papel, pólvora y, de forma optativa, un número de estrellas de fuegos artificiales. - - Lana amarilla + + + Los colores, cambios de color, formas, tamaños y efectos (como estelas y parpadeos) de las estrellas de fuegos artificiales pueden personalizarse añadiendo ingredientes adicionales durante la creación. - - Lana azul claro + + Prueba a crear fuegos artificiales en la mesa de trabajo usando distintos objetos de los cofres. - - Lana magenta + + + Después de crear una estrella de fuegos artificiales, puedes determinar su cambio de color combinándola con tinte. - - Lana naranja + + Dentro de estos cofres hay diversos objetos utilizados en la creación de ¡FUEGOS ARTIFICIALES! - - Lana blanca + + {*B*}Pulsa{*CONTROLLER_VK_A*} para saber más sobre los fuegos artificiales. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con los fuegos artificiales. - - Flor + + Para crear fuegos artificiales, coloca pólvora y papel en la cuadrícula de creación de 3 x 3 que aparece sobre tu inventario. - - Rosa + + Esta sala contiene tolvas - - Champiñón + + {*B*}Pulsa{*CONTROLLER_VK_A*} para saber más sobre las tolvas. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya estás familiarizado con las tolvas. - - Bloque de oro + + Las tolvas se utilizan para introducir o sacar objetos de contenedores y para recoger automáticamente los objetos lanzados a su interior. - - Una forma compacta de almacenar oro. + + Las balizas activas proyectan un brillante rayo de luz hacia el cielo y otorgan poderes a los jugadores cercanos. Se crean con cristal, obsidiana y estrellas del mundo inferior, que pueden obtenerse derrotando al Wither. - - Bloque de hierro + + Las balizas deben situarse de forma que les dé el sol durante el día. Deben colocarse sobre pirámides de hierro, oro, esmeralda o diamante. No obstante, el tipo de material no afecta al poder de la baliza. - - Una forma compacta de almacenar hierro. + + +Intenta usar la baliza para determinar los poderes que otorga. Puedes usar los lingotes de hierro para el pago necesario. + - - Losa de piedra + + Pueden afectar a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas y también a otras tolvas. - - Losa de piedra + + En esta sala hay varias distribuciones de tolvas para que las veas y experimentes con ellas. - - Losa de arenisca + + Esta es la interfaz de fuegos artificiales, que puedes usar para crear fuegos artificiales y estrellas de fuegos artificiales. - - Losa de roble + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. +{*B*}Pulsa{*CONTROLLER_VK_B*} si ya sabes usar la interfaz de fuegos artificiales. - - Losa de guijarros + + Una tolva intentará de forma continua absorber los objetos de un contenedor adecuado situado sobre ella. También intentará introducir los objetos almacenados en un contenedor de salida. - - Losa de ladrillos + + + No obstante, si una tolva recibe energía de piedra rojiza, se vuelve inactiva y deja de absorber e introducir objetos. + - - Losa (ladrillos de piedra) + + + Una tolva apunta en la dirección en la que intenta dar salida a los objetos. Para hacer que una tolva apunte hacia un bloque concreto, coloca la tolva contra ese bloque estando en sigilo. + - - Losa de roble + + Estos enemigos pueden encontrarse en los pantanos y te atacan lanzando pociones. Sueltan pociones cuando mueren. - - Losa de abeto + + Se ha alcanzado el límite de cuadros y marcos en un mundo. - - Losa de abedul + + No puedes generar enemigos en el modo Pacífico. - - Losa de la jungla + + Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de cría de cerdos, ovejas, vacas, gatos y caballos. - - Losa del mundo inferior + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de calamares. - - Ladrillos + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de enemigos. - - Dinamita + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de aldeanos. - - Estantería + + Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de lobos. - - Piedra musgosa + + Se ha alcanzado el límite de cabezas de enemigos en un mundo. - - Obsidiana + + Invertir vista - - Antorcha + + Zurdo - - Antorcha (hulla) + + Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de gallinas. - - Antorcha (carbón) + + Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de champiñacas. - - Fuego + + Se ha alcanzado la cantidad máxima de barcos en un mundo. - - Generador de monstruos + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de gallinas. - - Escaleras de roble + + {*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 los espíritus 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 ensambló 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*} - - Cofre + + {*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*} - - Polvo de piedra rojiza + + Restablecer mundo inferior - - Mineral de diamante + + %s ha entrado en El Fin. - - Bloque de diamante + + %s ha salido de El Fin. - - Una forma compacta de almacenar diamantes. + + {*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 decírselo...{*EF*}{*B*}{*B*} +{*C3*}Demasiado fuerte para este sueño. Decirles cómo 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*} - - Mesa de trabajo + + ¿Seguro que quieres restablecer el mundo inferior de este archivo guardado a sus valores predeterminados? Perderás todo lo que has construido en el mundo inferior. - - Cultivos + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas, gatos y caballos. - - Granja + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de champiñacas. - - Horno + + El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de lobos. - - Cartel + + Restablecer mundo inferior - - Puerta de madera + + No restablecer mundo inferior - - Escalera + + No se puede trasquilar esta champiñaca en este momento. Límite de cerdos, ovejas, vacas, gatos y caballos alcanzado. - - Raíl + + ¡Has muerto! - - Raíl propulsado + + Opciones de mundo - - Raíl detector + + Puede construir y extraer - - Escaleras de piedra + + Puede usar puertas e interruptores - - Palanca + + Generar estructuras - - Placa de presión + + Mundo superplano - - Puerta de hierro + + Cofre de bonificación - - Mineral de piedra rojiza + + Puede abrir contenedores - - Antorcha piedra roja + + Expulsar jugador - - Botón + + Puede volar - - Nieve + + Desactivar agotamiento - - Hielo + + Puede atacar a jugadores - - Cactus + + Puede atacar a animales - - Arcilla + + Moderador - - Caña de azúcar + + Privilegios de anfitrión - - Tocadiscos + + Cómo se juega - - Valla + + Controles - - Calabaza + + Configuración - - Calabaza iluminada + + Regenerar - - Bloque inferior + + Ofertas de contenido descargable - - Arena de alma + + Cambiar aspecto - - Piedra brillante + + Créditos - - Portal + + La dinamita explota - - Mineral de lapislázuli + + Jugador contra jugador - - Bloque de lapislázuli + + Confiar en jugadores - - Una forma compacta de almacenar lapislázuli. + + Volver a instalar contenido - - Dispensador + + Ajustes de depuración - - Bloque de nota + + El fuego se propaga - - Pastel + + Dragón finalizador - - Cama + + {*PLAYER*} murió a causa del aliento del dragón finalizador. - - Telaraña + + {*SOURCE*} asesinó a {*PLAYER*}. - - Hierba alta + + {*SOURCE*} asesinó a {*PLAYER*}. - - Arbusto muerto + + {*PLAYER*} murió. - - Diodo + + {*PLAYER*} explotó. - - Cofre cerrado + + {*PLAYER*} murió a causa de la magia. - - Trampilla + + {*SOURCE*} disparó a {*PLAYER*}. - - Lana (cualquier color) + + Niebla de lecho de roca - - Pistón + + Mostrar panel de datos - - Pistón adhesivo + + Mostrar mano - - Bloque de pez plateado + + {*SOURCE*} quemó con bolas de fuego a {*PLAYER*}. - - Ladrillos de piedra + + {*SOURCE*} apaleó a {*PLAYER*}. - - Ladrillos de piedra musgosa + + {*PLAYER*} ha muerto a manos de {*SOURCE*} usando magia. - - Ladrillos de piedra agrietada + + {*PLAYER*} se cayó del mundo. - - Ladrillos de piedra cincelada + + Packs de textura - - Champiñón + + Packs de popurrí - - Champiñón + + {*PLAYER*} ardió. - - Barras de hierro + + Temas - - Panel de cristal + + Imágenes de jugador - - Melón + + Objetos de avatar - - Tallo de calabaza + + {*PLAYER*} se quemó hasta morir. - - Tallo de melón + + {*PLAYER*} se murió de hambre. - - Enredaderas + + {*PLAYER*} se pinchó hasta morir. - - Puerta de valla + + {*PLAYER*} se golpeó demasiado fuerte contra el suelo. - - Escaleras de ladrillo + + {*PLAYER*} intentó nadar en la lava. - - Escaleras ladrillo piedra + + {*PLAYER*} se asfixió en un muro. - - Piedra de pez plateado + + {*PLAYER*} se ahogó. - - Guijarro de pez plateado + + Mensajes de muerte - - Ladrillo de piedra de pez plateado + + Ya no eres moderador. - - Micelio + + Ahora puedes volar. - - Nenúfar + + Ya no puedes volar. - - Ladrillo del mundo inferior + + Ya no puedes atacar a animales. - - Valla del mundo inferior + + Ahora puedes atacar a animales. - - Escaleras mundo inferior + + Ahora eres moderador. - - Verruga del mundo inferior + + Ya no te cansarás. - - Mesa de encantamientos + + Ahora eres invulnerable. - - Soporte para pociones + + Ya no eres invulnerable. - - Caldero + + %d MSP - - Portal final + + Ahora te cansarás. - - Estructura de portal final + + Ahora eres invisible. - - Piedra final + + Ya no eres invisible. - - Huevo de dragón + + Ahora puedes atacar a jugadores. - - Arbusto + + Ahora puedes extraer y usar objetos. - - Helecho + + Ya no puedes colocar bloques. - - Escaleras de arenisca + + Ahora puedes colocar bloques. - - Escaleras de abeto + + Personaje animado - - Escaleras de abedul + + Animación de aspecto pers. - - Escaleras de la jungla + + Ya no puedes extraer ni usar objetos. - - Lámpara de piedra rojiza + + Ahora puedes usar puertas e interruptores. - - Cacao + + Ya no puedes atacar a enemigos. - - Calavera + + Ahora puedes atacar a enemigos. - - Controles actuales + + Ya no puedes atacar a jugadores. - - Configuración + + Ya no puedes usar puertas ni interruptores. - - Mover/Correr + + Ahora puedes usar contenedores (p. ej. cofres). - - Mirar + + Ya no puedes usar contenedores (p. ej. cofres). - - Pausar + + Invisible - - Saltar + + Balizas + + + {*T3*}CÓMO SE JUEGA: BALIZAS{*ETW*}{*B*}{*B*} +Las balizas activas proyectan un brillante rayo de luz hacia el cielo y otorgan poderes a los jugadores cercanos.{*B*} +Se crean con cristal, obsidiana y estrellas del mundo inferior, que pueden obtenerse derrotando al Wither.{*B*}{*B*} +Las balizas deben situarse de forma que les dé el sol durante el día. Deben colocarse sobre pirámides de hierro, oro, esmeralda o diamante.{*B*} +El material sobre el que se coloca la baliza no afecta a su poder.{*B*}{*B*} +En el menú de baliza puedes seleccionar un poder principal para tu baliza. Cuantos más niveles tenga la pirámide, más poderes habrá para elegir.{*B*} +Una baliza sobre una pirámide de al menos cuatro niveles también ofrece la opción del poder secundario de regeneración o de un poder principal más fuerte.{*B*}{*B*} +Para determinar los poderes de tu baliza, debes sacrificar una esmeralda, un diamante o un lingote de oro o hierro en el espacio de pago.{*B*} +Una vez determinados, los poderes emanarán de la baliza indefinidamente.{*B*} + + + Fuegos artificiales + + + Idiomas + + + Caballos + + + {*T3*}CÓMO SE JUEGA: CABALLOS{*ETW*}{*B*}{*B*} +Los caballos y burros se encuentran sobre todo en las llanuras. Las mulas son el producto del cruce entre burro y caballo, pero son estériles.{*B*} +Todos los caballos, burros y mulas adultos pueden montarse. Sin embargo, solo los caballos pueden llevar armadura, y solo las mulas y los burros pueden equiparse con alforjas para transportar objetos.{*B*}{*B*} +Los caballos, burros y mulas deben domesticarse antes de poder utilizarlos. Un caballo se domestica intentando montar en él, y manteniéndose a lomos del caballo mientras este intenta sacudirse al jinete.{*B*} +Cuando aparezcan corazones alrededor del caballo, ya estará domesticado y dejará de intentar quitarse de encima al jugador. Para guiar al caballo, el jugador debe equiparlo con una silla.{*B*}{*B*} +Las sillas pueden comprarse a los aldeanos o encontrarse en cofres ocultos por el mundo.{*B*} +Los burros y mulas domesticados pueden equiparse con alforjas agachándose y acoplándoles un cofre. Luego, se puede acceder a estas alforjas mientras se monta o agachándose.{*B*}{*B*} +Los caballos y burros (pero no las mulas) pueden criarse como otros animales, usando manzanas de oro o zanahorias de oro.{*B*} +Los potros se convierten en caballos adultos con el tiempo, aunque alimentarlos con trigo o heno acelera el proceso.{*B*} + - - Saltar/Volar hacia arriba + + {*T3*}CÓMO SE JUEGA: FUEGOS ARTIFICIALES{*ETW*}{*B*}{*B*} +Los fuegos artificiales son objetos decorativos que pueden lanzarse a mano o desde dispensadores. Se fabrican usando papel, pólvora y, de forma optativa, un número de estrellas de fuegos artificiales.{*B*} +Los colores, cambios de color, formas, tamaños y efectos (como estelas y parpadeos) de las estrellas de fuegos artificiales pueden personalizarse añadiendo ingredientes adicionales durante la creación.{*B*}{*B*} +Para crear fuegos artificiales, coloca pólvora y papel en la cuadrícula de creación de 3 x 3 que aparece sobre tu inventario.{*B*} +También puedes colocar varias estrellas de fuegos artificiales en la cuadrícula para añadirlas a los fuegos artificiales.{*B*} +Llenar más espacios en la cuadrícula con pólvora aumentará la altura a la que harán explosión las estrellas de fuegos artificiales.{*B*}{*B*} +Luego puedes coger los fuegos artificiales terminados en el espacio de salida.{*B*}{*B*} +Las estrellas de fuegos artificiales pueden crearse colocando pólvora y tinte en la cuadrícula.{*B*} +- El tinte determinará el color de la explosión de la estrella de fuegos artificiales.{*B*} +- La forma de la estrella de fuegos artificiales se establece añadiendo una descarga de fuego, una pepita de oro, una pluma o una cabeza de enemigo.{*B*} +- Puede añadirse una estela o un parpadeo usando diamantes o polvo de piedra brillante.{*B*}{*B*} +Después de crear una estrella de fuegos artificiales, puedes determinar su cambio de color combinándola con tinte. + + + {*T3*}CÓMO SE JUEGA: SOLTADORES{*ETW*}{*B*}{*B*} +Cuando reciben energía de piedra rojiza, los soltadores dejan caer al suelo un único objeto aleatorio de su interior. Usa {*CONTROLLER_ACTION_USE*} para abrir el soltador y poder cargarlo de objetos de tu inventario.{*B*} +Si el soltador mira hacia un cofre o un contenedor de otro tipo, el objeto se introducirá en él. Se pueden construir largas cadenas de soltadores para transportar objetos a larga distancia. Para que esto funcione, deben activarse y desactivarse alternativamente. + + + Cuando se utiliza, se convierte en un mapa de la parte del mundo en la que te encuentras, y se rellena según exploras. + + + Las suelta el Wither, y se utilizan para crear balizas. + + + Tolvas + + + {*T3*}CÓMO SE JUEGA: TOLVAS{*ETW*}{*B*}{*B*} +Las tolvas se utilizan para introducir o sacar objetos de contenedores, y para recoger automáticamente los objetos lanzados a su interior.{*B*} +Pueden afectar a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas, y también a otras tolvas.{*B*}{*B*} +Una tolva intentará de forma continua absorber los objetos de un contenedor adecuado situado sobre ella. También intentará introducir los objetos almacenados en un contenedor de salida.{*B*} +Si una tolva recibe energía de piedra rojiza, se vuelve inactiva y deja de absorber e introducir objetos.{*B*}{*B*} +Una tolva apunta en la dirección en la que intenta dar salida a los objetos. Para hacer que una tolva apunte hacia un bloque concreto, coloca la tolva contra ese bloque estando en sigilo.{*B*} + + + Soltadores - - Inventario + + SIN USAR - - Cambiar objeto + + Salud instantánea - - Acción + + Daño instantáneo - - Usar + + Impulso en salto - - Creación + + Cansancio de extracción - - Soltar + + Fuerza - - Sigilo + + Debilidad - - Sigilo/Volar hacia abajo + + Náuseas - - Cambiar modo de cámara + + SIN USAR - - Jugadores/Invitar + + SIN USAR - - Movimiento (al volar) + + SIN USAR - - Opción 1 + + Regeneración - - Opción 2 + + Resistencia - - Opción 3 + + Buscando semillas para el generador de mundos. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Cuando se activan, crean explosiones coloridas. El color, el efecto, la forma y el cambio de color están determinados por la estrella de fuegos artificiales utilizada al crear los fuegos artificiales. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Un tipo de raíl que puede activar o desactivar las vagonetas con tolvas y activar las vagonetas con dinamita. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Se utiliza para contener y soltar objetos, o para introducir objetos en otro contenedor, cuando recibe una carga de piedra rojiza. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Bloques de colores creados tiñendo arcilla endurecida. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Proporciona una carga de piedra rojiza. La carga será más fuerte si hay más objetos sobre la placa. Requiere más peso que la placa ligera. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Se utiliza como fuente de energía de piedra rojiza. Puede utilizarse para volver a crear piedra rojiza. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Se utiliza para recoger objetos o para transferir objetos hacia o desde contenedores. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Puede darse a caballos, burros o mulas para sanar hasta 10 corazones. Acelera el crecimiento de los potros. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Murciélago - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Estas criaturas voladoras se encuentran en cavernas y otros grandes espacios cerrados. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Bruja - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Se crea fundiendo arcilla en un horno. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Se crea con cristal y un tinte. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Se crea con cristal tintado - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Proporciona una carga de piedra rojiza. La carga será más fuerte si hay más objetos sobre la placa. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Es un bloque que lanza una señal de piedra rojiza según la luz del sol (o la falta de luz). - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Es un tipo especial de vagoneta que funciona de un modo parecido a una tolva. Recogerá los objetos que haya sobre las vías y de los contenedores que haya sobre ella. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 5 de armadura. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Se utiliza para determinar el color, efecto y forma de unos fuegos artificiales. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Se utiliza en los circuitos de piedra rojiza para mantener, comparar o restar fuerza de la señal, o para medir ciertos estados de bloques. - - {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + + Es un tipo de vagoneta que se comporta como un bloque de dinamita móvil. - - {*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. + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 7 de armadura. - - 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. + + Se utiliza para ejecutar comandos. - - Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. + + Proyecta un rayo de luz hacia el cielo y puede proporcionar efectos de estado a los jugadores cercanos. - - Usa{*CONTROLLER_ACTION_MOVE*} para moverte. + + Almacena bloques y objetos en su interior. Coloca dos cofres uno al lado del otro para crear un cofre más grande con doble capacidad. El cofre con trampa también crea una carga de piedra rojiza al abrirse. - - 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. + + Un tipo especial de armadura que pueden equipar los caballos. Proporciona 11 de armadura. - - Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar. + + Se utiliza para atar a criaturas al jugador o a postes. - - Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... + + Se utiliza para poner nombre a las criaturas del mundo. - - 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 aparezca en tu inventario. + + Rapidez - - Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. + + Juego completo - - A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} - Pulsa{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. + + Reanudar partida - - 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. + + Guardar partida - - 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, la barra de comida se recargará. + + Jugar partida - - 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. + + Marcadores - - 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*} + + Ayuda y opciones - - La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} + + Dificultad: - - Muchas creaciones conllevan realizar múltiples acciones. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de trabajo.{*CraftingTableIcon*} + + JcJ: - - Para que la recolección de bloques sea más rápida, puedes construir herramientas diseñadas a tal efecto. Algunas herramientas tienen un mango de palo. Crea algunos palos ahora.{*SticksIcon*} + + Confiar en jugadores: - - Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. + + Dinamita: - - Utiliza{*CONTROLLER_ACTION_USE*} para usar objetos, interactuar con ellos y colocarlos. Los objetos colocados se pueden volver a coger extrayéndolos con la herramienta adecuada. + + Tipo de partida: - - Para colocar una mesa de trabajo, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. + + Estructuras: - - Apunta hacia la mesa de trabajo y pulsa{*CONTROLLER_ACTION_USE*} para abrirla. + + Tipo de nivel: - - 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*} + + No se encontraron partidas - - Con un hacha puedes cortar madera y bloques 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*} + + Solo por invitación - - 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*} + + Más opciones - - Abre el contenedor. + + Cargar - - - 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. - + + Opciones de anfitrión - - Cerca de aquí hay un refugio de minero abandonado que puedes terminar para mantenerte a salvo por la noche. - + + Jugadores/Invitar - - Para terminar el refugio tendrás que recoger recursos. Los muros y los tejados se fabrican con cualquier tipo de bloque, pero tendrás que crear una puerta, ventanas e iluminación. - + + Partida online - - Usa tu pico para extraer algunos bloques de piedra. Al hacerlo, producirán guijarros. 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*} + + Nuevo mundo - - Ya has recogido suficientes guijarros para construir un horno. Usa la mesa de trabajo para hacerlo. + + Jugadores - - Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. + + Unirse a partida - - Usa el horno para crear carbón. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? + + Iniciar partida - - Usa el horno para crear cristal. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? + + Nombre del mundo - - 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*} + + Semilla para el generador de mundos - - Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el mundo. + + Dejar vacío para semilla aleatoria - - 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*} + + El fuego se propaga: - - Has completado la primera parte del tutorial. + + Editar mensaje de cartel: - - {*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. + + Rellena la información que irá junto a tu captura. - - Este es tu inventario. Muestra los objetos que llevas en la mano y los demás objetos que tengas. Aquí también aparece tu armadura. - + + Subtítulo - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. + + Ayuda sobre el juego - - Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el puntero. Usa{*CONTROLLER_VK_A*} para recoger un objeto señalado con el puntero. - 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. - + + Pantalla dividida vert. para 2 j. - - Mueve el objeto con el puntero hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. - Si hay varios objetos en el puntero, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno. + + Listo - - Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. - + + Captura de pantalla del juego - - Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y pulsa {*CONTROLLER_VK_BACK*}. + + Sin efectos - - Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario. + + Celeridad - - Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + + Lentitud - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. + + Editar mensaje de cartel: - - Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el puntero. - En una lista de objetos, usa{*CONTROLLER_VK_A*} para recoger un objeto que esté bajo el puntero y usa{*CONTROLLER_VK_Y*} para recoger un montón entero de ese objeto. - + + ¡Con la interfaz de usuario, los iconos y la textura clásica de Minecraft! - - - El puntero 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 puntero volverá a la lista de objetos y podrás seleccionar otro. - + + Mostrar todos los mundos mezclados - - Si desplazas el puntero 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*}. - + + Consejos - - 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. + + Volver a instalar objeto de avatar 1 - - Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y pulsa{*CONTROLLER_VK_BACK*} . + + Volver a instalar objeto de avatar 2 - - Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. - + + Volver a instalar objeto de avatar 3 - - - Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. - + + Volver a instalar tema - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo crear. + + Volver a instalar imagen de jugador 1 - - {*B*} - Pulsa{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. + + Volver a instalar imagen de jugador 2 - - {*B*} - Pulsa{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. + + Opciones - - {*B*} - Pulsa{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. + + Interfaz de usuario + + + Valores predeterminados + + + Oscilación de vista + + + Sonido + + + Control + + + Gráficos + + + Se usa para elaborar pociones. La sueltan los espectros cuando mueren. + + + La sueltan los porqueros zombis cuando mueren. Estos se encuentran en el mundo inferior. Se usa como ingrediente para elaborar pociones. + + + Se usan para preparar pociones. Crecen de forma natural en las fortalezas del mundo inferior. También se pueden plantar en arena de alma. + + + Cuando pasas sobre él, te resbalas. Se convierte en agua cuando se destruye si está sobre otro bloque. Se derrite si está cerca de una fuente de luz o cuando se coloca en el mundo inferior. + + + Se puede usar como elemento decorativo. + + + Se usa para elaborar pociones y para localizar fortalezas. La sueltan las llamas, que se suelen encontrar en las fortalezas del mundo inferior o cerca. + + + Puede tener diversos efectos, dependiendo de con qué se use. + + + Se usa para elaborar pociones o se combina con otros objetos para crear el ojo finalizador o la crema de magma. + + + Se usa para elaborar pociones. + + + Se usa para crear pociones y pociones de salpicadura. + + + Se puede llenar con agua y se usa como ingrediente base para crear una poción en el soporte para pociones. + + + Es una comida venenosa y un ingrediente para pociones. Aparece cuando el jugador mata una araña o una araña de las cuevas. + + + Se usa para elaborar pociones, principalmente con efecto negativo. + + + Una vez colocada, va creciendo con el paso del tiempo. Se puede recoger con cizallas. Puede usarse como una escalera para trepar por ella. + + + 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. + + + Cuando se activa, 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. + + + Se crea con bloques de piedra y se encuentra normalmente en fortalezas. + + + Se usa como barrera, igual que las vallas. + + + Se puede plantar para cultivar calabazas. + + + Se puede emplear en la construcción y en la decoración. + + + Ralentiza el movimiento cuando pasas sobre ella. Se puede destruir con unas cizallas para obtener cuerda. + + + Genera un pez plateado cuando se destruye o, a veces, cuando está cerca de otro pez plateado al que estén atacando. + + + Se puede plantar para cultivar melones. + + + La 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 llenar de agua de lluvia o con un cubo y usar para llenar de agua las botellas de cristal. + + + 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 crea al fundir un bloque inferior en un horno. Se puede convertir en bloques de ladrillo del mundo inferior. + + + Al recibir energía, emite luz. + + + Es similar a una vitrina y muestra el objeto o el bloque que contiene. + + + 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. + + + Puede cultivarse en la granja para cosechar granos de cacao. + + + Vaca + + + Suelta cuero cuando muere. Se puede ordeñar con un cubo. + + + Oveja + + + Las cabezas de enemigos pueden colocarse como decoración o llevarse como una máscara en el espacio del casco. + + + Calamar + + + Suelta bolsas de tinta cuando muere. + + + Útil para prender fuego a las cosas o para provocar incendios indiscriminados cuando se dispara con el dispensador. + + + Flota en el agua y se puede caminar sobre él. + + + Se usa para construir fortalezas del mundo inferior. Es inmune a las bolas de fuego del espectro. + + + Se usa en las fortalezas del mundo inferior. + + + 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 elaborar pociones. + + + Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. + + + Se encuentra en las fortalezas del mundo inferior y suelta verrugas del mundo inferior cuando se rompe. + + + Un tipo de bloque que se encuentra en El Fin. Tiene una resistencia contra explosiones elevada, 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 cuando se recogen. + + + Permite encantar espadas, picos, hachas, palas, arcos y armaduras utilizando puntos de experiencia. + + + Se puede activar con doce ojos finalizadores y permite al jugador viajar a la dimensión El Fin. + + + Se usa para crear un portal final. + + + Cuando se activa (por medio de un botón, una palanca, una placa de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. + + + Se cuece con arcilla en un horno. + + + Se cuece y se convierte en ladrillo en un horno. + + + Cuando se rompe suelta bolas de arcilla que se pueden cocer y convertir en ladrillos en un horno. + + + Se corta 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 extraerlo, se romperá. + + + Se extrae de la piedra con un pico. Se puede usar para construir un horno o herramientas de madera. + + + Una forma compacta de almacenar bolas de nieve. + + + Junto con un cuenco se puede convertir en estofado. + + + Solo se puede extraer 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 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 recoge con una pala. A veces produce pedernal cuando se excava. Le afecta la gravedad si no hay ningún otro bloque por debajo. + + + Se puede extraer con un pico para obtener hulla. + + + Se puede extraer con un pico de piedra o un objeto mejor para obtener lapislázuli. + + + Se puede extraer con un pico de hierro o un objeto mejor para obtener diamantes. + + + Se usa como elemento decorativo. + + + Se puede extraer con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. + + + Se puede extraer con un pico de piedra o un objeto mejor y después fundir en un horno para producir lingotes de hierro. + + + Se puede extraer con un pico de hierro o un objeto mejor para obtener polvo de piedra rojiza. + + + No se puede romper. + + + Prende fuego a 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. Le afecta la gravedad si no hay ningún otro bloque por debajo. + + + Se puede extraer con un pico para obtener 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. + + + Se coloca en el suelo para transportar una descarga eléctrica. Si se elabora con una poción, aumentará la duración del efecto. + + + Se obtiene al matar una vaca y se puede convertir en armadura o para hacer libros. + + + Se obtiene al matar un limo o como ingrediente para elaborar pociones o hacer pistones adhesivos. + + + Las gallinas lo ponen al azar y se puede convertir en alimentos. + + + Se obtiene al excavar gravilla y se puede usar para crear un chisquero de pedernal. + + + Si se usa con un cerdo te permite montarlo. Luego puedes manejar al cerdo con una zanahoria con palo. + + + Se obtiene al excavar nieve y se puede arrojar. + + + Se obtiene al extraer una piedra brillante y se puede convertir en bloques de piedra brillante otra vez o para elaborar una poción para aumentar la potencia del efecto. + + + Si se rompen, a veces sueltan un brote que se puede plantar para que crezca un árbol. + + + Se encuentra en mazmorras y se puede emplear en la construcción y en la decoración. + + + Se usan para obtener lana de las ovejas y cosechar bloques de hoja. + + + Se obtiene al matar un esqueleto. Se puede convertir en polvo de hueso. Se puede dar de comer a un lobo para domarlo. + + + Se obtiene al hacer que un esqueleto mate a un creeper. Se puede reproducir en un tocadiscos. + + + Apaga el fuego y ayuda a que crezcan las cosechas. Se puede recoger en un cubo. + + + Se recoge de los cultivos y se puede usar para crear alimentos. + + + Se pueden usar para crear azúcar. + + + Se puede llevar como casco o convertir en antorcha para crear una calabaza iluminada. También es el ingrediente principal del pastel de calabaza. + + + Si se le prende fuego, arderá para siempre. + + + 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. + + + Ralentiza el movimiento de cualquier cosa que camina sobre ella. + + + 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 como ingrediente para elaborar pociones. + + + Se puede plantar en una granja para que crezcan cultivos. ¡Asegúrate de que hay luz suficiente para que prosperen! + + + 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 puede convertir en una antorcha. + + + Se consigue al matar una araña y se puede convertir en un arco o en una caña de pescar, o colocarlo en el suelo para crear cuerda de trampa. + + + Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Pala de hierro + + + Pala de diamante + + + Pala de oro + + + Espada de oro + + + Pala de madera + + + Pala de piedra + + + Pico de madera + + + Pico de oro + + + Hacha de madera + + + Hacha de piedra + + + Pico de piedra + + + Pico de hierro + + + Pico de diamante + + + Espada de diamante + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Espada de madera + + + Espada de piedra + + + Espada de hierro + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Te dispara bolas de fuego que explotan al entrar en contacto. + + + Limo + + + Escupe limos más pequeños cuando recibe daños. + + + Porquero zombi + + + En principio es manso, pero si atacas a uno, atacará en grupo. + + + Espectro + + + Finalizador + + + Araña de las cuevas + + + Tiene una picadura venenosa. + + + Champiñaca + + + 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. + + + Te ataca cuando está cerca. + + + 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 para que te siga a todas partes y ataque a cualquier cosa que te ataque a ti. + + + Gallina + + + Suelta plumas cuando muere y pone huevos al azar. + + + Cerdo + + + Creeper + + + Araña + + + Te ataca cuando está cerca. Puede trepar por muros. Suelta cuerda cuando muere. + + + Zombi + + + ¡Explota si te acercas demasiado! + + + Esqueleto + + + Te dispara flechas. Suelta flechas y huesos cuando muere. + + + Crea estofado de champiñón si se usa en un cuenco. Suelta champiñones y se convierte en una vaca normal cuando se esquila. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker - - 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. - + + Explosives Animator - - 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. - + + 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 sus fortalezas. Sueltan varas de llama cuando mueren. + + + Gólem de nieve + + + Se crea con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. + + + Dragón finalizador + + + Cubo de magma + + + Se encuentra en junglas. Puede domarse dándole de comer pescado crudo. Tienes que dejar que se te acerque, aunque ten cuidado: un movimiento repentino lo espantará. + + + Gólem de hierro + + + Aparece en aldeas para protegerlas y puede crearse usando bloques de hierro y calabazas. + + + Se encuentran en el mundo inferior. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. + + + Aldeano + + + Ocelote + + + Permite crear encantamientos más potentes si se coloca cerca de una mesa de encantamientos. + + + {*T3*}CÓMO SE JUEGA: HORNO{*ETW*}{*B*}{*B*} +En el horno puedes transformar 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 el 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 (una palanca, por ejemplo) 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: ELABORACIÓN DE POCIONES{*ETW*}{*B*}{*B*} +Para elaborar pociones se necesita un soporte para pociones, que se puede construir en la mesa de trabajo. 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 soportes para pociones tienen tres espacios para botellas, de modo que puedes preparar tres pociones a la vez. Se puede usar un ingrediente en las tres botellas, así que procura elaborar siempre las pociones de tres en tres para aprovechar mejor tus recursos.{*B*} +Si colocas un ingrediente de poción en la posición superior del soporte para pociones, tras un breve periodo de tiempo obtendrás una poción básica. Esto no tiene ningún efecto por sí mismo, pero si añades otro ingrediente a 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 de piedra 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: 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 TRABAJO{*ETW*}{*B*}{*B*} +Con una mesa de trabajo 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: ENCANTAMIENTOS{*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 encantar 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 encantamiento, los tres botones de la parte derecha del espacio mostrarán algunos encantamientos y sus niveles de experiencia correspondientes.{*B*} +Si no tienes suficientes niveles de experiencia para usarlos, el coste aparecerá en rojo; de lo contrario, aparecerá en verde.{*B*}{*B*} +El encantamiento que se aplica se selecciona aleatoriamente en función del coste que aparece.{*B*}{*B*} +Si la mesa de encantamiento 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 encantamiento, la intensidad de los encantamientos aumentará y aparecerán glifos arcanos en el libro de la mesa de encantamientos.{*B*}{*B*} +Todos los ingredientes para la mesa de encantamientos se pueden encontrar en las aldeas de un mundo o al extraer mineral y cultivar en él.{*B*}{*B*} +Los libros encantados se usan en el yunque para aplicar encantamientos a los objetos. Esto proporciona un control mayor sobre los encantamientos que quieras hacer a tus objetos.{*B*} + + + {*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 función 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 seguir con él o dejarlo bloqueado. + + + {*T3*}CÓMO SE JUEGA: OPCIONES DE ANFITRIÓN Y DE JUGADOR{*ETW*}{*B*}{*B*} + + {*T1*}Opciones de partida{*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 partida.{*B*}{*B*} + + {*T2*}Jugador contra jugador{*ETW*}{*B*} + Si está habilitado, 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á deshabilitado, los jugadores que se unen a la partida 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ú del juego.{*B*}{*B*} + + {*T2*}El fuego se propaga{*ETW*}{*B*} + Si está habilitado, 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á habilitado, la dinamita explota cuando se detona. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + + {*T2*}Privilegios de anfitrión{*ETW*}{*B*} + Si está habilitado, el anfitrión puede activar su habilidad para volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego. {*DISABLES_ACHIEVEMENTS*}.{*B*}{*B*} + + {*T2*}Ciclo de luz{*ETW*}{*B*} +Cuando se desactiva, la hora del día no cambia.{*B*}{*B*} + +{*T2*}Conservar inventario{*ETW*}{*B*} +Cuando se activa, los jugadores conservarán su inventario al morir.{*B*}{*B*} + +{*T2*}Generación de criaturas{*ETW*}{*B*} +Cuando se desactiva, las criaturas no se generarán de forma natural.{*B*}{*B*} + +{*T2*}Desventaja de criaturas{*ETW*}{*B*} +Cuando está desactivado, impide que monstruos y animales cambien los bloques (por ejemplo, las explosiones de los creepers no destruyen los bloques y las ovejas no eliminan la hierba) o recojan objetos.{*B*}{*B*} + +{*T2*}Botín de criaturas{*ETW*}{*B*} +Cuando se desactiva, los monstruos y animales no sueltan botín (por ejemplo, los creepers no sueltan pólvora).{*B*}{*B*} + +{*T2*}Objetos de bloques{*ETW*}{*B*} +Cuando se desactiva, los bloques no sueltan objetos al ser destruidos (por ejemplo, los bloques de piedra no sueltan guijarros).{*B*}{*B*} + +{*T2*}Regeneración natural{*ETW*}{*B*} +Cuando se desactiva, los jugadores no regeneran salud de forma natural.{*B*}{*B*} + +{*T1*}Opciones de generación del mundo{*ETW*}{*B*} + Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} + + {*T2*}Generar estructuras{*ETW*}{*B*} + Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo.{*B*}{*B*} + + {*T2*}Mundo superplano{*ETW*}{*B*} + Si está habilitado, 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á habilitado, 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á habilitado, el mundo inferior se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior.{*B*}{*B*} + + {*T1*}Opciones de partida{*ETW*}{*B*} + Dentro del juego se pueden acceder a varias opciones pulsando {*BACK_BUTTON*} para mostrar el menú del juego.{*B*}{*B*} + + {*T2*}Opciones de anfitrión{*ETW*}{*B*} + El anfitrión y cualquier jugador designado como moderador pueden acceder al menú "Opciones de anfitrión". En este menú se puede habilitar y deshabilitar la propagación del fuego y la explosión de dinamita.{*B*}{*B*} + + {*T1*}Opciones de 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á deshabilitado. Cuando esta opción está habilitada, el jugador puede interactuar con el mundo de forma normal. Cuando está deshabilitada, el jugador no puede colocar ni destruir bloques, ni interactuar 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á deshabilitado. Cuando esta opción está deshabilitada, el jugador no puede usar puertas ni interruptores.{*B*}{*B*} + + {*T2*}Puede abrir contenedores{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. 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á deshabilitado. 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á deshabilitado. 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 anfitrión) si "Confiar en jugadores" está deshabilitado, expulsar jugadores y activar y desactivar "El fuego se propaga" y "La dinamita explota".{*B*}{*B*} + + {*T2*}Expulsar jugador{*ETW*}{*B*} +{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + + {*T1*}Opciones de anfitrión{*ETW*}{*B*} + Si "Privilegios de anfitrión" está habilitado, el anfitrión 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. 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 agotamiento{*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 mover a otros jugadores, a sí mismo o hasta otros jugadores del mundo. + + + Página siguiente + + + {*T3*}CÓMO SE JUEGA: CUIDAR ANIMALES{*ETW*}{*B*}{*B*} +Si quieres mantener a tus animales en un único lugar, construye una zona vallada de menos de 20x20 bloques y mete dentro a tus animales. Así te asegurarás de que estén allí cuando vuelvas. + + + {*T3*}CÓMO SE JUEGA: REPRODUCCIÓN DE 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 se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el modo Amor.{*B*} +Si alimentas con trigo a las vacas, con champiñacas a las ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del mundo inferior a las gallinas, 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 se encuentren dos animales en modo Amor de la misma especie, se besarán durante unos segundos y aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de crecer y convertirse en adulta.{*B*} +Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo.{*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 ya haya 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 tres bloques en el mundo superior. Así, cuando construyas un portal en el mundo inferior y salgas por él, estarás tres veces más lejos del punto de entrada.{*B*}{*B*} +Se necesita un mínimo de diez bloques de obsidiana para construir el portal, y el portal debe tener cinco bloques de alto, cuatro de ancho y uno de profundidad. Una vez construida la estructura del portal, tendrás que prender fuego al espacio interior para activarlo. Para ello, usa los objetos "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: 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 puntero 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 adelante. + + + ¿Estuviste en la Minecon? + + + Nadie de Mojang ha visto jamás la cara a junkboy. + + + ¿Sabías que hay una wiki de Minecraft? + + + No mires directamente a los bichos. + + + Los creepers surgieron de un fallo de código. + + + ¿Es una gallina o es un pato? + + + ¡El nuevo despacho de Mojang mola! + + + {*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 extraer y cortar con la mano o con cualquier objeto que sostengas. Quizá necesites crear una herramienta para extraer 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. - - Con una mesa de trabajo puedes crear una mayor selección de objetos. La creación en una mesa se realiza igual que la creación normal, pero dispones de un área más amplia que permite más combinaciones de ingredientes. + + {*T3*}CÓMO SE JUEGA: PANEL DE DATOS{*ETW*}{*B*}{*B*} +El panel de datos 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 muestra 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. - - 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. + + {*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 puntero. Usa{*CONTROLLER_VK_A*} para coger el objeto que se encuentra bajo el puntero. 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 puntero hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. Si hay varios objetos en el puntero, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno.{*B*}{*B*} +Si el 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*} +Es posible cambiar el color de tu Armadura de cuero tiñéndola, puedes hacerlo en el menú de inventario manteniendo pulsado el tinte de tu puntero y pulsando luego {*CONTROLLER_VK_X*} mientras el puntero pasa por el objeto que quieras teñir. - - Ahora aparece la descripción del objeto seleccionado, que puede darte una idea de la utilidad de ese objeto. + + ¡Minecon 2013 tuvo lugar en Orlando, Florida, EE.UU.! - - Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. + + .party() fue excelente. - - La leña que recojas se puede convertir en tablones. Selecciona el icono de tablones y pulsa{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} + + Supón siempre que los rumores son falsos, ¡no te los creas! - - Ahora que has construido una mesa de trabajo, deberías colocarla en el mundo para poder crear una mayor selección de objetos.{*B*} - Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + + Página anterior - - Pulsa{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar al tipo de grupo de los objetos que quieres crear. Selecciona el grupo de herramientas.{*ToolsIcon*} + + Comercio - - Pulsa{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar al tipo de grupo de los objetos que quieres crear. Selecciona el grupo de estructuras.{*StructuresIcon*} + + Yunque - - 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*} + + El Fin - - Muchas creaciones conllevan realizar múltiples acciones. 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 trabajo.{*CraftingTableIcon*} + + Bloquear niveles - - Con las herramientas que has creado, ya estás listo para empezar, y podrás reunir varios materiales de forma más eficaz.{*B*} -Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + + Modo Creativo - - Hay objetos que no se pueden crear con la mesa de trabajo, sino que requieren un horno. Crea un horno ahora.{*FurnaceIcon*} + + Opciones de anfitrión y de jugador - - 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. + + {*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. Encontrarás el portal final en una fortaleza, en lo más profundo del mundo superior.{*B*} +Para activar el portal final, debes colocar un ojo finalizador 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 finalizador, 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 finalizador usa para curarse, así que lo primero que deberás hacer será destruirlos todos.{*B*} +Podrás alcanzar los primeros con flechas, pero los últimos están en una jaula con barrotes de hierro. Tendrás que ascender para llegar a ellos.{*B*}{*B*} +Mientras lo haces, el dragón finalizador volará hacia ti y te atacará escupiendo bolas de ácido finalizador.{*B*} +Si te acercas al pedestal del huevo en el centro de los pilares, el dragón finalizador descenderá 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 finalizador 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 fácilmente. - - Esta es la interfaz del horno. En él puedes transformar objetos fundiéndolos o, por ejemplo, convertir mineral de hierro en lingotes de hierro. + + {*ETB*}¡Hola de nuevo! 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*}: arcilla endurecida, arcilla teñida, bloque de carbón, bala de heno, raíl activador, bloque de piedra rojiza, sensor de luz diurna, soltador, tolva, vagoneta con tolva, vagoneta con dinamita, comparador de piedra rojiza, placa de presión con peso, baliza, cofre con trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del mundo inferior, correa, armadura de caballo, placa identificativa, huevo generador de caballos.{*B*}{*B*} +{*T1*}Nuevas criaturas{*ETB*}: Wither, esqueletos de Wither, brujas, murciélagos, caballos, burros y mulas.{*B*}{*B*} +{*T1*}Nuevas características{*ETB*}: domestica y monta caballos, crea fuegos artificiales y monta un espectáculo, nombra a animales y monstruos con placas identificativas, crea circuitos de piedra rojiza más avanzados, ¡y hay nuevas opciones de anfitrión para controlar lo que pueden hacer los invitados en tu mundo!{*B*}{*B*} +{*T1*}Nuevo tutorial{*ETB*}: aprende a usar las opciones antiguas y nuevas en el tutorial. ¡Intenta encontrar todos los discos escondidos en el mundo!{*B*}{*B*} - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. + + Causas más daño que con la mano. - - 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. + + 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. - - Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También descubrirás otros objetos en el mundo que funcionan como combustible. + + Correr - - 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. + + Novedades - - 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. + + {*T3*}Cambios y añadidos {*ETW*}{*B*}{*B*} +- Se han añadido nuevos objetos: arcilla endurecida, arcilla teñida, bloque de carbón, bala de heno, raíl activador, bloque de piedra rojiza, sensor de luz diurna, soltador, tolva, vagoneta con tolva, vagoneta con dinamita, comparador de piedra rojiza, placa de presión con peso, baliza, cofre con trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del mundo inferior, correa, armadura de caballo, placa identificativa, huevo generador de caballos.{*B*} +- Se han añadido nuevas criaturas: Wither, esqueletos de Wither, brujas, murciélagos, caballos, burros y mulas.{*B*} +- Se han añadido nuevas opciones de generación de terreno: chozas de brujas.{*B*} +- Se ha añadido interfaz de baliza.{*B*} +- Se ha añadido interfaz de caballo.{*B*} +- Se ha añadido interfaz de tolva.{*B*} +- Se han añadido fuegos artificiales: se puede acceder a la interfaz de fuegos artificiales desde la mesa de trabajo cuando se tienen los ingredientes para fabricar una estrella de fuegos artificiales o un cohete de fuegos artificiales.{*B*} +- Se ha añadido el "modo Aventura": solo se pueden romper bloques con las herramientas adecuadas.{*B*} +- Se han añadido un montón de sonidos nuevos.{*B*} +- Las criaturas, los objetos y los proyectiles pueden atravesar los portales.{*B*} +- Los repetidores pueden bloquearse dándoles energía a sus lados con otro repetidor.{*B*} +- Los zombis y esqueletos pueden generarse con distintas armas y armaduras.{*B*} +- Nuevos mensajes de muerte.{*B*} +- Se puede nombrar a las criaturas con una placa identificativa, renombrar los contenedores para cambiar el título cuando el menú está abierto.{*B*} +- El polvo de hueso ya no hace que todo alcance su tamaño máximo al instante, sino que hace crecer las cosas de por etapas y de forma aleatoria.{*B*} +- Una señal de piedra rojiza que describe el contenido de cofres, soportes para pociones, dispensadores y tocadiscos puede detectarse colocando un comparador de piedra rojiza directamente contra ellos.{*B*} +- Los dispensadores pueden mirar en cualquier dirección.{*B*} +- Comer una manzana de oro da al jugador salud extra de "absorción" durante un breve periodo.{*B*} +- Cuanto más tiempo se permanece en un área, más difíciles son los monstruos que se generan en esa área.{*B*} - - El carbón se puede usar como combustible y convertirse en una antorcha con un palo. + + Compartir capturas de pantalla - - 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. + + Cofres - - Esta es la interfaz de elaboración de pociones. Se puede usar para crear pociones con efectos diversos. + + Creación - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el soporte para pociones. + + Horno - - Para elaborar pociones, coloca un ingrediente en la parte superior y una botella de agua o una poción en los espacios inferiores (se pueden elaborar hasta 3 a la vez). Cuando se introduce una combinación válida, comienza la elaboración y, al cabo de poco tiempo, se creará una poción. + + Fundamentos - - 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. + + Panel de datos - - 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. + + Inventario - - Si añades ojo de araña fermentado, la poción se corromperá y podría convertirse en otra con el efecto contrario, y si añades pólvora, la convertirás en una poción de salpicadura, que se puede lanzar para aplicar su efecto sobre un área cercana. + + Dispensador - - 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. + + Encantamientos - - Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de elaboración de pociones. + + Portal inferior - - En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. + + Multijugador - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la elaboración y las pociones.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo elaborar pociones. + + Cuidar animales - - El primer paso para elaborar una poción es crear una botella de agua. Toma una botella de agua del cofre. + + Reproducción de animales - - 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*}. + + Elaboración de pociones - - Si un caldero se vacía, puedes rellenarlo con un cubo de agua. + + ¡A deadmau5 le gusta Minecraft! - - Usa el soporte para pociones para crear una poción de resistencia al fuego. Necesitarás una botella de agua, verruga del mundo inferior y crema de magma. + + Los porqueros no te atacarán a no ser que tú los ataques a ellos. - - 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. + + Puedes echarte a dormir en una cama para cambiar el punto de generación del juego y avanzar hasta el amanecer. - - Usa una poción de resistencia al fuego contigo mismo. + + ¡Golpea esas bolas de fuego de vuelta al espectro! - - Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. + + Crea antorchas para iluminar áreas oscuras de noche. Los monstruos evitarán las áreas cercanas a las antorchas. - - Esta es la interfaz de encantamiento, que puedes usar para aplicar encantamientos a armas, armaduras y a algunas herramientas. + + ¡Con una vagoneta y un raíl llegarás a tu destino más rápido! - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de encantamientos.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de encantamientos. + + Planta brotes y se convertirán en árboles. - - Para encantar un objeto, primero colócalo en el espacio de encantamiento. Las armas, las armaduras y algunas herramientas se pueden encantar para añadirles efectos especiales, como resistencia mejorada al daño o aumento del número de objetos que se generan al extraer un bloque. + + Si construyes un portal podrás viajar a otra dimensión: el mundo inferior. - - Cuando se coloca un objeto en el espacio de encantamiento, los botones de la parte derecha cambian y muestran una selección de encantamientos aleatorios. + + Excavar en línea recta hacia abajo o hacia arriba no es buena idea. - - El número del botón representa el coste en niveles de experiencia que cuesta aplicar ese encantamiento al objeto. Si tu nivel es insuficiente, el botón no estará activo. + + Puedes usar polvo de hueso (se fabrica con hueso de esqueleto) como fertilizante. Las cosas crecerán al instante. - - Selecciona un encantamiento y pulsa{*CONTROLLER_VK_A*} para encantar el objeto. Se reducirá el nivel de experiencia en función del coste del encantamiento. + + ¡Los creepers explotan cuando se acercan a ti! - - Aunque los encantamientos son aleatorios, algunos de los mejores solo están disponibles cuando tienes el nivel de experiencia adecuado y muchas estanterías alrededor de la mesa de encantamiento para aumentar su poder. + + ¡Pulsa {*CONTROLLER_VK_B*} para soltar el objeto que llevas en la mano! - - En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. + + ¡Usa la herramienta correcta para el trabajo! - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los encantamientos.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar los encantamientos. + + Si no encuentras hulla para las antorchas, siempre puedes convertir árboles en carbón en un horno. - - Con una mesa de encantamiento 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. + + Si comes las chuletas de cerdo cocinadas, recuperarás más salud que si las comes crudas. - - Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. + + Si estableces la dificultad del juego en Pacífico, tu salud se regenerará automáticamente. ¡Además, no saldrán monstruos por la noche! - - Encantar objetos cuesta niveles de experiencia, que se aumentan acumulando 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. + + Dale un hueso a un lobo para domarlo. Podrás hacer que se siente o que te siga. - - También puedes aumentar tus niveles de experiencia con una botella de encantamiento que, cuando se lanza, crea orbes de experiencia donde cae. Después podrás recoger esos orbes. + + Para soltar objetos desde el menú Inventario, mueve el cursor fuera del menú y pulsa{*CONTROLLER_VK_A*}. - - En los cofres de esta zona encontrarás objetos encantados, botellas de encantamientos y objetos que aún están sin encantar para que experimentes con ellos en la mesa de encantamiento. + + ¡Nuevo contenido descargable disponible! Utiliza el botón Tienda de Minecraft del menú principal para acceder a él. - - Ahora vas subido en una vagoneta. Para salir de ella, apunta a ella con el cursor y pulsa{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + Puedes cambiar el aspecto de tu personaje con el pack de aspecto de la tienda de Minecraft. Selecciona "Tienda de Minecraft" en el menú principal para ver qué hay disponible. - - {*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. + + Varía la configuración de gamma para que la visualización del juego sea más clara o más oscura. - - 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*} + + Si duermes en una cama de noche, el juego avanzará hasta el amanecer, pero en multijugador todos deben dormir a la vez. - - 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 placas de presión para crear sistemas complejos. - {*PoweredRailIcon*} + + Usa una azada para preparar el terreno para la cosecha. - - Ahora navegas en un barco. Para salir de él, apúntalo con el puntero y pulsa{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + Las arañas no atacan por el día, a no ser que tú las ataques a ellas. - - {*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. + + ¡Es más fácil excavar arena o tierra con un azadón que a mano! - - Los barcos te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para dirigirlo. - {*BoatIcon*} + + Extrae chuletas del cerdo y cocínalas para comerlas y recuperar salud. - - Ahora usas una caña de pescar. Pulsa{*CONTROLLER_ACTION_USE*} para utilizarla.{*FishingRodIcon*} + + Extrae cuero de las vacas y úsalo para fabricar armaduras. - - {*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. + + Si tienes un cubo vacío, puedes llenarlo con leche de vaca, agua ¡o lava! - - Pulsa{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. Pulsa{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. - {*FishingRodIcon*} + + La obsidiana se crea cuando el agua alcanza un bloque de origen de lava. - - 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 la salud. - {*FishIcon*} + + ¡Ahora hay vallas apilables en el juego! - - Al igual que muchas otras herramientas, la caña tiene distintos usos, los cuales no se limitan a pescar peces. Puedes experimentar con ella e investigar qué se puede pescar o activar... - {*FishingRodIcon*} + + Algunos animales te seguirán si llevas trigo en la mano. - - 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*} + + Si un animal no puede desplazarse más de 20 bloques en cualquier dirección, no se degenerará. - - {*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. + + Los lobos domados indican su salud con la posición de su cola. Dales de comer para curarlos. - - Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Si mueres después de haber usado una cama, te regenerarás en ella. - {*ICON*}355{*/ICON*} + + Cocina un cactus en un horno para obtener tinte verde. - - Si hay más jugadores en tu partida, todos deberán estar metidos en la cama al mismo tiempo para poder dormir. - {*ICON*}355{*/ICON*} + + Lee la sección Novedades en el menú Cómo se juega para ver la información más reciente sobre el juego. - - En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. + + ¡Música de C418! - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y de pistones.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los circuitos de piedra rojiza y de pistones. + + ¿Quién es Notch? - - Las palancas, los botones, las placas de presión y las antorchas de piedra rojiza suministran energía a los circuitos, bien acoplándolos directamente al objeto que quieres activar o bien conectándolos con polvo de piedra rojiza. + + ¡Mojang tiene más premios que empleados! - - 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. + + ¡Hay famosos que juegan a Minecraft! - - 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 suministrar 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*} + + ¡Notch tiene más de un millón de seguidores en Twitter! - - 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*} + + No todos los suecos son rubios. ¡Algunos, como Jens de Mojang, son pelirrojos! - - 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*} + + ¡Pronto habrá una actualización de este juego! - - 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. + + Si colocas dos cofres juntos crearás un cofre grande. - - ¡En esta área hay un portal al mundo inferior! + + Ten cuidado cuando construyas estructuras de lana al aire libre, ya que los rayos de las tormentas pueden prenderles fuego. - - {*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 sabes cómo funcionan los portales y el mundo inferior. + + Un solo cubo de lava se puede usar para fundir 100 bloques en un horno. - - Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. + + El instrumento que toca un bloque de nota depende del material que tenga debajo. - - Para activar el portal inferior, prende fuego a los bloques de obsidiana del interior de la estructura con un chisquero de pedernal. Los portales se pueden desactivar si se rompe la estructura, si se produce una explosión cerca o si fluye un líquido a través de ellos. + + Al eliminar el bloque de origen, la lava puede tardar varios minutos en desaparecer por completo. - - 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. + + Los guijarros son resistentes a las bolas de fuego del espectro, lo que los hace útiles para defender portales. - - El mundo inferior es un lugar peligroso, repleto de lava, pero puede ser útil para recoger bloques inferiores, que arden para siempre una vez que se encienden, y piedra brillante, que genera luz. + + 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 las calabazas iluminadas. - - El mundo inferior sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el mundo inferior equivale a desplazarte tres bloques en el mundo superior. + + Los zombis y los esqueletos pueden sobrevivir a la luz del día si están en el agua. - - Ahora estás en el modo Creativo. + + Las gallinas ponen huevos cada 5 o 10 minutos. - - {*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. + + La obsidiana solo se puede extraer con un pico de diamante. - - En el modo Creativo posees un número infinito de todos los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. + + Los creepers son la fuente de pólvora más fácil de obtener. - - Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. + + Si atacas a un lobo, todos los de los alrededores se volveran hostiles. Característica que comparten con los porqueros zombis. - - Para continuar, cruza al otro lado de este agujero. + + Los lobos no pueden entrar en el mundo inferior. - - Has completado el tutorial del modo Creativo. + + Los lobos no atacan a los creepers. - - En esta área se ha colocado una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. + + Necesario para extraer bloques de piedra y mineral. - - {*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. + + Se usa en la receta de pasteles y como ingrediente para elaborar pociones. - - 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. + + Se activa y desactiva para aplicar una descarga eléctrica. Se mantiene en estado activado o desactivado hasta que se vuelve a pulsar. - - 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. + + 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. - - 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*} + + Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. - - 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. + + Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Se puede crear a partir de una manzana y pepitas de oro. - - La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. Al cortar un bloque de caña de azúcar, todos los bloques que estén sobre él caerán.{*ICON*}83{*/ICON*} + + Restablece 2{*ICON_SHANK_01*}. Puede envenenarte. - - 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*} + + Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. - - Los champiñones deben plantarse en una zona con luz tenue y se propagarán a los bloques de luz tenue cercanos.{*ICON*}39{*/ICON*} + + Se usa para llevar vagonetas. - - El polvo de hueso se puede usar para germinar cultivos hasta su estado de mayor crecimiento o cultivar champiñones hasta que se vuelvan gigantes.{*ICON*}351:15{*/ICON*} + + Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. - - Has completado el tutorial de los cultivos. + + Funciona como una placa de presión (envía una señal de piedra rojiza cuando se activa), pero solo puede activarse con una vagoneta. - - En esta área se han guardado animales en corrales. Puedes hacer que los animales se reproduzcan para crear crías de sí mismos. + + Se usa para enviar una descarga eléctrica cuando se pulsa. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. - - -{*B*} - Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre reproducción de animales.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya sabes sobre reproducción de animales. + + Se usa para contener y arrojar objetos en orden aleatorio cuando recibe una descarga de piedra rojiza. - - Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el "modo Amor". + + Reproduce una nota cuando se activa. Si lo golpeas cambiarás el tono de la nota. Colócalo en la parte superior de distintos bloques para cambiar el tipo de instrumento. - - 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 las gallinas, 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. + + Restablece 2,5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en un horno. - - 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. + + Restablece 1{*ICON_SHANK_01*}. - - Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo. + + Restablece 1{*ICON_SHANK_01*}. - - 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*} + + Restablece 3{*ICON_SHANK_01*}. - - - Los lobos salvajes pueden domesticarse dándoles huesos. Una vez domesticados, aparecerán corazones a su alrededor. Los lobos domesticados siguen al jugador y lo defienden si no se les ha ordenado sentarse. - + + Se usa como munición para arcos. - - Has completado el tutorial Reproducción de animales. + + Restablece 2,5{*ICON_SHANK_01*}. - - En esta zona hay algunas calabazas y bloques para crear un gólem de nieve y otro de hierro. + + Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. - - {*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. + + Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Puede envenenarte. - - Los gólems se crean colocando una calabaza encima de un montón de bloques. + + Restablece 1,5{*ICON_SHANK_01*} y se puede cocinar en un horno. - - 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. + + Restablece 4{*ICON_SHANK_01*}. Se crea cocinando una chuleta de cerdo cruda en un horno. - - 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. + + Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede dar de comer a un ocelote para domarlo. - - Los gólems de hierro aparecen en las aldeas para protegerlas, y te atacarán si atacas a los aldeanos. + + Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en un horno. - - No puedes salir de esta área hasta que completes el tutorial. + + Restablece 1,5{*ICON_SHANK_01*} y se puede cocinar en un horno. - - Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para extraer materiales blandos, como tierra y arena. + + Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en un horno. - - Cada herramienta funciona mejor con distintos materiales. Deberías usar un hacha para cortar troncos de árboles. + + Se usa para transportarte a ti, a un animal o a un monstruo por raíles. - - Cada herramienta funciona mejor con distintos materiales. Deberías usar un pico para extraer piedra y mineral. Quizá debas fabricar tu pico con mejores materiales para obtener recursos de algunos bloques. + + Se usa como tinte para crear lana azul clara. - - Hay herramientas que son mejores para atacar a determinados enemigos. Plantéate usar una espada para atacar. + + Se usa como tinte para crear lana cian. - - Consejo: mantén pulsado {*CONTROLLER_ACTION_ACTION*}para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... + + Se usa como tinte para crear lana púrpura. - - La herramienta que usas está dañada. Cada vez que utilizas una herramienta, se desgasta y, con el tiempo, acabará rompiéndose. La barra de colores de debajo del objeto en el inventario muestra el estado de daños actual. + + Se usa como tinte para crear lana lima. - - Mantén pulsado{*CONTROLLER_ACTION_JUMP*} para nadar. + + Se usa como tinte para crear lana gris. - - En esta área hay una vagoneta en una vía. Para subir a una vagoneta, apunta con el cursor hacia ella y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. + + Se usa como tinte para crear lana gris clara. +(Nota: combinar tinte gris con polvo de hueso creará 4 tintes gris claro de cada bolsa de tinta en vez de 3). - - En el cofre que está junto al río hay un barco. Para usarlo, apunta al agua con el cursor y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al barco para subir a él. + + Se usa como tinte para crear lana magenta. - - En el cofre que está junto al estanque hay una caña de pescar. Coge la caña del cofre y selecciónala para llevarla en la mano y usarla. + + 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. - - ¡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. + + Se usa para crear libros y mapas. - - Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltar ese objeto. + + Se usa para crear estanterías de libros o encantarse para hacer libros encantados. - - No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. + + Se usa como tinte para crear lana azul. - - ¡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! + + Reproduce discos. - - {*EXIT_PICTURE*} Cuando estés listo para seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. + + Úsalos para crear herramientas, armas o armaduras sólidas. - - Recordatorio: + + Se usa como tinte para crear lana naranja. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Se obtiene de las ovejas y se puede colorear con tinte. - - Se han añadido nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. + + 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. - - {*B*}Pulsa{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} - Pulsa{*CONTROLLER_VK_B*} para omitir el tutorial principal. + + Se usa como tinte para crear lana negra. - - En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los barcos y la piedra rojiza. + + Se usa para transportar mercancías por los raíles. - - Fuera de esta área encontrarás ejemplos de edificios, cultivos, vagonetas y vías, encantamientos, pociones, comercio, herrería y mucho más. + + Se mueve por raíles y empujará a otras vagonetas si se le añade hulla. - - La barra de comida se ha agotado hasta un nivel a partir del cual ya no te puedes curar. + + Te permite desplazarte por el agua más rápido que nadando. - - {*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 sabes cómo funciona la barra de comida y cómo comer. + + Se usa como tinte para crear lana verde. - - Seleccionar + + Se usa como tinte para crear lana roja. - - Usar + + Se usa para que crezcan al instante cosechas, árboles, hierba alta, champiñones gigantes y flores, y se puede utilizar en recetas de tinte. - - Atrás + + Se usa como tinte para crear lana rosa. - - Salir + + Se usa como tinte para crear lana marrón, como ingrediente de galletas o para cultivar plantas de cacao. - - Cancelar + + Se usa como tinte para crear lana plateada. - - No unirse + + Se usa como tinte para crear lana amarilla. - - Actualizar partidas online + + Permite ataques a distancia con flechas. - - Partidas en grupo + + Cuando la lleva puesta, el usuario recibe 5 de armadura. - - Todas las partidas + + Cuando las lleva puestas, el usuario recibe 3 de armadura. - - Cambiar grupo + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Mostrar inventario + + Cuando las lleva puestas, el usuario recibe 5 de armadura. - - Mostrar descripción + + Cuando las lleva puestas, el usuario recibe 2 de armadura. - - Mostrar ingredientes + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Creación + + Cuando lo lleva puesto, el usuario recibe 3 de armadura. - - Crear + + Un lingote brillante que se usa para fabricar herramientas de este material. Se crea fundiendo mineral en un horno. - - Coger/Colocar + + 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. - - Coger + + Se usa para aplicar una descarga eléctrica cuando un jugador, un animal o un monstruo la pisan. Las placas de presión de madera también se activan soltando algo sobre ellas. - - Coger todo + + Cuando la lleva puesta, el usuario recibe 8 de armadura. - - Coger la mitad + + Cuando las lleva puestas, el usuario recibe 6 de armadura. - - Colocar + + Cuando las lleva puestas, el usuario recibe 3 de armadura. - - Colocar todo + + Cuando la lleva puesta, el usuario recibe 6 de armadura. - - Colocar uno + + Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. - - Soltar + + Cuando lo lleva puesto, el usuario recibe 1 de armadura. - - Soltar todo + + Cuando la lleva puesta, el usuario recibe 3 de armadura. - - Soltar uno + + Se usa para cortar bloques de madera más rápido que a mano. - - Cambiar + + Se usa para labrar tierra y hierba y prepararla para el cultivo. - - Movimiento rápido + + Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. - - Borrar selección rápida + + Cuando las lleva puestas, el usuario recibe 2 de armadura. - - ¿Qué es esto? + + Cuando las lleva puestas, el usuario recibe 4 de armadura. - - Compartir en Facebook + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Cambiar filtro + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Enviar solicitud de amistad + + Cuando las lleva puestas, el usuario recibe 1 de armadura. + + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Avanzar página + + Cuando la lleva puesta, el usuario recibe 5 de armadura. - - Retroceder página + + Se usan en escaleras compactas. - - Siguiente + + Se usa para contener estofado de champiñón. Te quedas el cuenco después de comer el estofado. - - Anterior + + Se usa para contener y transportar agua, lava y leche. - - Expulsar jugador + + Se usa para contener y transportar agua. - - Teñir + + Muestra el texto introducido por ti o por otros jugadores. - - Extraer + + 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. - - Alimentar + + Se usa para provocar explosiones. Se activa después de su colocación golpeándola con el objeto chisquero de pedernal o con una descarga eléctrica. - - Domar + + Se usa para contener y transportar lava. - - Curar + + Muestra la posición del sol y de la luna. - - Sentarse + + Indica tu punto de inicio. - - Sígueme + + Mientras lo sostienes, crea una imagen del área explorada. Se puede usar para buscar rutas. - - Expulsar + + Se usa para contener y transportar leche. - - Vaciar + + Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. - - Silla de montar + + Se usa para pescar peces. - - Colocar + + Se activa al usarla, golpearla o con piedra rojiza. Funciona como una puerta normal, pero tiene el tamaño de un bloque y se encuentra en el suelo. - - Golpear + + Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. - - Ordeñar + + Se usa como material de construcción. No le afecta la gravedad, como a la arena normal. - - Recoger + + Se usa como material de construcción. - - Comer + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - Dormir + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - Despertar + + Se usa para crear luz, pero también derrite la nieve y el hielo. - - Rep. + + Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. - - Montar + + 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. - - Navegar + + 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. - - Cultivar + + Se usa para ascender en vertical. - - Nadar hacia arriba + + Se usa para avanzar de la noche a la mañana si todos los jugadores están en cama; además cambia su punto de generación. +El color de la lana que se use no varía el color de la cama. - - Abrir + + Te permite crear una selección más variada de objetos que la creación normal. - - Cambiar tono + + Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. - - Detonar + + Hacha de hierro - - Leer + + Lámpara de piedra rojiza - - Colgar + + Escaleras de la jungla - - Arrojar + + Escaleras de abedul - - Plantar + + Controles actuales - - Labrar + + Calavera - - Cosechar + + Cacao - - Continuar + + Escaleras de abeto - - Desbloquear juego completo + + Huevo de dragón - - Borrar partida guardada + + Piedra final - - Borrar + + Estructura de portal final - - Opciones + + Escaleras de arenisca - - Invitar a amigos + + Helecho - - Aceptar + + Arbusto - - Esquilar + + Configuración - - Bloquear nivel + + Creación - - Seleccionar aspecto + + Usar - - Prender fuego + + Acción - - Desplazar + + Sigilo/Volar hacia abajo - - Instalar versión completa + + Sigilo - - Instalar versión de prueba + + Soltar - - Instalar + + Cambiar objeto - - Reinstalar + + Pausar - - Op. de guardado + + Mirar - - Ejecutar comando + + Mover/Correr - - Creativo + + Inventario - - Mover ingrediente + + Saltar/Volar hacia arriba - - Mover combustible + + Saltar - - Mover herramienta + + Portal final - - Mover armadura + + Tallo de calabaza - - Mover arma + + Melón - - Equipar + + Panel de cristal - - Disparar + + Puerta de valla - - Soltar + + Enredaderas + + + Tallo de melón - - Privilegios + + Barras de hierro - - Bloquear + + Ladrillos de piedra agrietada - - Retroceder página + + Ladrillos de piedra musgosa - - Avanzar página + + Ladrillos de piedra - - Modo Amor + + Champiñón - - Beber + + Champiñón - - Rotar + + Ladrillos de piedra cincelada - - Esconderse + + Escaleras de ladrillo - - Vaciar todos los espacios + + Verruga del mundo inferior - - Aceptar + + Escaleras mundo inferior - - Cancelar + + Valla del mundo inferior - - Tienda de Minecraft + + Caldero - - ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderán todo el progreso no guardado. + + Soporte para pociones - - Salir de la partida + + Mesa de encantamientos - - Guardar partida + + Ladrillo del mundo inferior - - Salir sin guardar + + Guijarro de pez plateado - - ¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo por su versión actual? + + Piedra de pez plateado - - ¿Seguro que quieres salir sin guardar? ¡Perderás todo el progreso en este mundo! + + Escaleras ladrillo piedra - - Comenzar a jugar + + Nenúfar - - Archivo dañado + + Micelio - - El archivo guardado está dañado. ¿Quieres borrarlo? + + Ladrillo de piedra de pez plateado - - ¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores de la partida? Se perderá todo el progreso no guardado. + + Cambiar modo de cámara - - Salir y guardar + + 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, la barra de comida se recargará. - - Salir sin guardar + + 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. - - ¿Seguro que quieres salir al menú principal? Se perderá todo el progreso no guardado. + + A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} + Pulsa{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. - - ¿Seguro que quieres salir al menú principal? ¡Se perderá tu progreso! + + La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} - - Crear nuevo mundo + + 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*} - - Jugar tutorial + + 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. - - Tutorial + + Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. - - Dar nombre al mundo + + 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. - - Escribe un nombre para tu mundo. + + Usa{*CONTROLLER_ACTION_MOVE*} para moverte. - - Introduce la semilla para la generación del mundo. + + Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. - - Cargar mundo guardado + + 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 aparezca en tu inventario. - - Pulsa START para unirte. + + Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... - - Saliendo de la partida + + Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar. - - Se ha producido un error. Saliendo al menú principal. + + Muchas creaciones conllevan realizar múltiples acciones. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de trabajo.{*CraftingTableIcon*} - - Error de conexión + + + 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. + - - Conexión perdida + + Abre el contenedor. - - Se ha perdido la conexión con el servidor. Saliendo al menú principal. + + 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*} - - Desconectado por el servidor + + Usa tu pico para extraer algunos bloques de piedra. Al hacerlo, producirán guijarros. 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*} - - Has sido expulsado de la partida. + + Para terminar el refugio tendrás que recoger recursos. Los muros y los tejados se fabrican con cualquier tipo de bloque, pero tendrás que crear una puerta, ventanas e iluminación. + - - Has sido expulsado de la partida por volar. + + Cerca de aquí hay un refugio de minero abandonado que puedes terminar para mantenerte a salvo por la noche. + - - El intento de conexión ha tardado demasiado. + + Con un hacha puedes cortar madera y bloques 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*} - - El servidor está lleno. + + Utiliza{*CONTROLLER_ACTION_USE*} para usar objetos, interactuar con ellos y colocarlos. Los objetos colocados se pueden volver a coger extrayéndolos con la herramienta adecuada. - - El anfitrión ha salido de la partida. + + Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. - - No puedes unirte a esta partida porque no tienes ningún amigo en ella. + + Para que la recolección de bloques sea más rápida, puedes construir herramientas diseñadas a tal efecto. Algunas herramientas tienen un mango de palo. Crea algunos palos ahora.{*SticksIcon*} - - No puedes unirte a esta partida porque el anfitrión te ha expulsado anteriormente. + + 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*} - - No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. + + Apunta hacia la mesa de trabajo y pulsa{*CONTROLLER_ACTION_USE*} para abrirla. - - No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más reciente del juego. + + Para colocar una mesa de trabajo, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. - - Nuevo mundo + + 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. - - ¡Premio desbloqueado! + + - - ¡Hurra! ¡Has obtenido una imagen de jugador de Steve, de Minecraft! + + - - ¡Hurra! ¡Has obtenido una imagen de jugador de un creeper! + + - - Desbloquear juego completo + + - - Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu partida. -¿Quieres desbloquear el juego completo? + + - - Espera... + + - - Sin resultados + + - - Filtro: + + Opción 1 - - Amigos + + Movimiento (al volar) - - Mi puntuación + + Jugadores/Invitar - - Total + + - - Entradas: + + Opción 3 - - Rango + + Opción 2 - - Preparando para guardar nivel + + - - Preparando fragmentos... + + - - Finalizando... + + - - Construyendo terreno + + - - Simulando mundo durante un instante + + {*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. - - Inicializando servidor + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. - - 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 anfitrión + + Bloque de pez plateado - - Descargando terreno + + Losa de piedra - - Cambiando a juego sin conexión + + Una forma compacta de almacenar hierro. - - Espera mientras el anfitrión guarda la partida. + + Bloque de hierro - - Entrando en El Fin + + Losa de roble - - Saliendo de El Fin + + Losa de arenisca - - Esta cama está ocupada. + + Losa de piedra - - Solo puedes dormir por la noche. + + Una forma compacta de almacenar oro. - - %s está durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. + + Flor - - ¡La cama de tu casa ha desaparecido o está obstruida! + + Lana blanca - - Ahora no puedes descansar, hay monstruos cerca. + + Lana naranja - - Estás durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. + + Bloque de oro - - Herramientas y armas + + Champiñón - - Armas + + Rosa - - Comida + + Losa de guijarros - - Estructuras + + Estantería - - Armadura + + Dinamita - - Mecanismos + + Ladrillos - - Transporte + + Antorcha - - Decoraciones + + Obsidiana - - Bloques de construcción + + Piedra musgosa - - Piedra rojiza y transporte + + Losa del mundo inferior - - Varios + + Losa de roble - - Pociones + + Losa (ladrillos de piedra) - - Herramientas, armas y armadura + + Losa de ladrillos - - Materiales + + Losa de la jungla - - Sesión cerrada + + Losa de abedul - - Dificultad + + Losa de abeto - - Música + + Lana magenta - - Sonido + + Hojas de abedul - - Gamma + + Hojas de abeto - - Sensibilidad del juego + + Hojas de roble - - Sensibilidad interfaz + + Cristal - - Pacífico + + Esponja - - Fácil + + Hojas de la jungla - - Normal + + Hojas - - Difícil + + Roble - - En este modo, el jugador recupera la salud con el paso del tiempo y no hay enemigos en el entorno. + + Abeto - - En este modo, el entorno genera enemigos, pero causarán menos daño al jugador que en el modo normal. + + Abedul - - En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño estándar. + + Madera de abeto - - 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 probablemente no cancelarán su ataque explosivo cuando te alejes de ellos! + + Madera de abedul - - Fin de la prueba + + Madera de la jungla - - Partida llena + + Lana - - No te has podido unir a la partida y no quedan más espacios. + + Lana rosa - - Introducir texto del cartel + + Lana gris - - Introduce una línea de texto para tu cartel. + + Lana gris claro - - Introducir título + + Lana azul claro - - Introduce un título para tu publicación. + + Lana amarilla - - Introducir subtítulo + + Lana lima - - Introduce un subtítulo para tu publicación. + + Lana cian - - Introducir descripción + + Lana verde - - Introduce una descripción para tu publicación. + + Lana roja - - Inventario + + Lana negra - - Ingredientes + + Lana púrpura - - Soporte para pociones + + Lana azul - - Cofre + + Lana marrón - - Encantar + + Antorcha (hulla) - - Horno + + Piedra brillante - - Ingrediente + + Arena de alma - - Combustible + + Bloque inferior - - Dispensador + + Bloque de lapislázuli - - No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. + + Mineral de lapislázuli - - %s se ha unido a la partida. + + Portal - - %s ha abandonado la partida. + + Calabaza iluminada - - Han expulsado a %s de la partida. + + Caña de azúcar - - ¿Seguro que quieres borrar esta partida guardada? + + Arcilla - - Esperando aprobación + + Cactus - - Censurado + + Calabaza - - Sonando: + + Valla - - Restablecer configuración + + Tocadiscos - - ¿Seguro que quieres restablecer la configuración a los valores predeterminados? + + Una forma compacta de almacenar lapislázuli. - - Error al cargar + + Trampilla - - Partida de %s + + Cofre cerrado - - Partida de anfitrión desconocido + + Diodo - - Un invitado ha cerrado la sesión + + Pistón adhesivo - - Un jugador invitado ha cerrado la sesión, lo que ha provocado que todos los invitados queden excluidos de la partida. + + Pistón - - Iniciar sesión + + Lana (cualquier color) - - No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? + + Arbusto muerto - - Multijugador no admitido + + Pastel - - Imposible crear la partida + + Bloque de nota - - Selección automática + + Dispensador - - Sin pack: aspectos por defecto + + Hierba alta - - Aspectos favoritos + + Telaraña - - Nivel bloqueado + + Cama - - La partida a la que te estás uniendo está en la lista de niveles bloqueados. -Si decides unirte a esta partida, el nivel se eliminará de tu lista de niveles bloqueados. + + Hielo - - ¿Bloquear este nivel? + + Mesa de trabajo - - ¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? -Selecciona ACEPTAR para salir de la partida. + + Una forma compacta de almacenar diamantes. - - Eliminar de la lista de bloqueados + + Bloque de diamante - - Autoguardado cada + + Horno - - Autoguardado: NO + + Granja - - min. + + Cultivos - - ¡No se puede colocar aquí! + + Mineral de diamante - - No se puede colocar lava cerca del punto de generación del nivel porque puede matar al instante a los jugadores que se regeneran. + + Generador de monstruos - - Opacidad de interfaz + + Fuego - - Preparando autoguardado del nivel + + Antorcha (carbón) - - Tamaño del panel de datos + + Polvo de piedra rojiza - - Tamaño panel (pant. divid.) + + Cofre - - Semilla + + Escaleras de roble - - Desbloquear pack de aspecto + + Cartel - - Para usar el aspecto que has seleccionado tienes que desbloquear este pack de aspecto. -¿Quieres desbloquear este pack de aspecto ahora? + + Mineral de piedra rojiza - - Desbloquear pack de textura + + Puerta de hierro - - Desbloquea este pack de textura para usarlo en tu mundo. -¿Te gustaría desbloquearlo ahora? + + Placa de presión - - Pack de textura de prueba + + Nieve - - 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? + + Botón - - Pack de textura no disponible + + Antorcha piedra roja - - Desbloquear versión completa + + Palanca - - Descargar versión de prueba + + Raíl - - Descargar versión completa + + Escalera - - ¡Este mundo usa un pack de textura o de popurrí que no tienes! -¿Quieres instalar el pack de textura o de popurrí ahora? + + Puerta de madera - - Conseguir versión de prueba + + Escaleras de piedra - - Conseguir versión completa + + Raíl detector - - Expulsar jugador + + Raíl propulsado - - ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. + + Ya has recogido suficientes guijarros para construir un horno. Usa la mesa de trabajo para hacerlo. - - Packs de imágenes de jugador + + Caña de pescar - - Temas + + Reloj - - Packs de aspectos + + Polvo de piedra brillante - - Permitir amigos de amigos + + Vagoneta con horno - - No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. + + Huevo - - No te puedes unir a la partida + + Brújula - - Seleccionado + + Pescado crudo - - Aspecto seleccionado: + + Rojo rosa - - Contenido descargable dañado + + Verde cactus - - El contenido descargable está dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. + + Granos de cacao - - Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo en el menú Tienda de Minecraft. + + Pescado cocinado - - Se ha cambiado el modo de juego. + + Polvo de tinte - - Cambiar nombre del mundo + + Bolsa de tinta - - Escribe un nuevo nombre para tu mundo. + + Vagoneta con cofre - - Modo de juego: Supervivencia + + Bola de nieve - - Modo de juego: Creativo + + Barco - - Supervivencia + + Cuero - - Creativo + + Vagoneta - - Creado en modo Supervivencia + + Silla de montar - - Creado en modo Creativo + + Piedra rojiza - - Generar nubes + + Cubo de leche - - ¿Qué quieres hacer con esta partida guardada? + + Papel - - Renombrar partida guardada + + Libro - - Autoguardando en %d... + + Bola de limo - - + + Ladrillo - - No + + Arcilla - - Normal + + Cañas de azúcar - - Superplano + + Lapislázuli - - Si está habilitado, la partida será online. + + Mapa - - Si está habilitado, solo los jugadores invitados pueden unirse. + + Disco: "13" - - Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. + + Disco: "gato" - - Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. + + Cama - - Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. + + Repetidor de piedra rojiza - - Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. + + Galleta - - Si está habilitado, la dinamita explota cuando se activa. + + Disco: "bloques" - - Si está habilitado, el mundo inferior se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior. + + Disco: "mellohi" - - Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. + + Disco: "stal" - - Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el inferior. + + Disco: "strad" - - Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador. + + Disco: "gorjeo" - - Packs de aspecto + + Disco: "lejos" - - Temas + + Disco: "galería" - - Imágenes de jugador + + Pastel - - Objetos de avatar + + Tinte gris - - Packs de textura + + Tinte rosa - - Packs de popurrí + + Tinte lima - - {*PLAYER*} ardió. + + Tinte púrpura - - {*PLAYER*} se quemó hasta morir. + + Tinte cian - - {*PLAYER*} intentó nadar en la lava. + + Tinte gris claro - - {*PLAYER*} se asfixió en un muro. + + Amarillo amargo - - {*PLAYER*} se ahogó. + + Polvo de hueso - - {*PLAYER*} se murió de hambre. + + Hueso - - {*PLAYER*} se pinchó hasta morir. + + Azúcar - - {*PLAYER*} se golpeó demasiado fuerte contra el suelo. + + Tinte azul claro - - {*PLAYER*} se cayó del mundo. + + Tinte magenta - - {*PLAYER*} murió. + + Tinte naranja - - {*PLAYER*} explotó. + + Cartel - - {*PLAYER*} murió a causa de la magia. + + Túnica de cuero - - {*PLAYER*} murió a causa del aliento del dragón finalizador. + + Coraza de hierro - - {*SOURCE*} asesinó a {*PLAYER*}. + + Coraza de diamante - - {*SOURCE*} asesinó a {*PLAYER*}. + + Casco de hierro - - {*SOURCE*} disparó a {*PLAYER*}. + + Casco de diamante - - {*SOURCE*} quemó con bolas de fuego a {*PLAYER*}. + + Casco de oro - - {*SOURCE*} apaleó a {*PLAYER*}. + + Coraza de oro - - {*PLAYER*} ha muerto a manos de {*SOURCE*}. + + Mallas de oro - - Niebla de lecho de roca + + Botas de cuero - - Mostrar panel de datos + + Botas de hierro - - Mostrar mano + + Calzas de cuero - - Mensajes de muerte + + Mallas de hierro - - Personaje animado + + Mallas de diamante - - Animación de aspecto pers. + + Gorro de cuero - - Ya no puedes extraer ni usar objetos. + + Azada de piedra - - Ahora puedes extraer y usar objetos. + + Azada de hierro - - Ya no puedes colocar bloques. + + Azada de diamante - - Ahora puedes colocar bloques. + + Hacha de diamante - - Ahora puedes usar puertas e interruptores. + + Hacha de oro - - Ya no puedes usar puertas ni interruptores. + + Azada de madera - - Ahora puedes usar contenedores (p. ej. cofres). + + Azada de oro - - Ya no puedes usar contenedores (p. ej. cofres). + + Peto de malla - - Ya no puedes atacar a enemigos. + + Mallas de malla - - Ahora puedes atacar a enemigos. + + Botas de malla - - Ya no puedes atacar a jugadores. + + Puerta de madera - - Ahora puedes atacar a jugadores. + + Puerta de hierro - - Ya no puedes atacar a animales. + + Casco de malla - - Ahora puedes atacar a animales. + + Botas de diamante - - Ahora eres moderador. + + Pluma - - Ya no eres moderador. + + Pólvora - - Ahora puedes volar. + + Semillas de trigo - - Ya no puedes volar. + + Cuenco - - Ya no te cansarás. + + Estofado de champiñón - - Ahora te cansarás. + + Cuerda - - Ahora eres invisible. + + Trigo - - Ya no eres invisible. + + Chuleta de cerdo cocinada - - Ahora eres invulnerable. + + Cuadro - - Ya no eres invulnerable. + + Manzana de oro - - %d MSP + + Pan - - Dragón finalizador + + Pedernal - - %s ha entrado en El Fin. + + Chuleta de cerdo cruda - - %s ha salido de El Fin. + + Palo - - {*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 decírselo...{*EF*}{*B*}{*B*} -{*C3*}Demasiado fuerte para este sueño. Decirles cómo 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*} + + Cubo - - {*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 los espíritus 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 ensambló 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*} + + Cubo de agua - - {*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*} + + Cubo de lava - - Restablecer mundo inferior + + Botas de oro - - ¿Seguro que quieres restablecer el mundo inferior de este archivo guardado a sus valores predeterminados? Perderás todo lo que has construido en el mundo inferior. + + Lingote de hierro - - Restablecer mundo inferior + + Lingote de oro - - No restablecer mundo inferior + + Chisquero de pedernal - - No se puede trasquilar esta champiñaca en este momento. Límite de cerdos, ovejas, vacas y gatos alcanzado. + + Hulla - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas y gatos. + + Carbón - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de champiñacas. + + Diamante - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de lobos. + + Manzana - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de gallinas. + + Arco - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de calamares. + + Flecha - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de enemigos. + + Disco: "pabellón" - - El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de aldeanos. + + Pulsa{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar al tipo de grupo de los objetos que quieres crear. Selecciona el grupo de estructuras.{*StructuresIcon*} - - Se ha alcanzado el límite de cuadros y marcos en un mundo. + + Pulsa{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar al tipo de grupo de los objetos que quieres crear. Selecciona el grupo de herramientas.{*ToolsIcon*} - - No puedes generar enemigos en el modo Pacífico. + + Ahora que has construido una mesa de trabajo, deberías colocarla en el mundo para poder crear una mayor selección de objetos.{*B*} + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. - - Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de cría de cerdos, ovejas, vacas y gatos. + + Con las herramientas que has creado, ya estás listo para empezar, y podrás reunir varios materiales de forma más eficaz.{*B*} +Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. - - Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de lobos. + + Muchas creaciones conllevan realizar múltiples acciones. 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 trabajo.{*CraftingTableIcon*} - - Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de gallinas. + + 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*} - - Este animal no puede entrar en modo Amor. Se ha alcanzado el límite de cría de champiñacas. + + La leña que recojas se puede convertir en tablones. Selecciona el icono de tablones y pulsa{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} - - Se ha alcanzado la cantidad máxima de barcos en un mundo. + + Con una mesa de trabajo puedes crear una mayor selección de objetos. La creación en una mesa se realiza igual que la creación normal, pero dispones de un área más amplia que permite más combinaciones de ingredientes. - - Se ha alcanzado el límite de cabezas de enemigos en un mundo. + + 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. + - - Invertir vista + + 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. + - - Zurdo + + Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. - - ¡Has muerto! + + Ahora aparece la descripción del objeto seleccionado, que puede darte una idea de la utilidad de ese objeto. - - Regenerar + + 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. - - Ofertas de contenido descargable + + Hay objetos que no se pueden crear con la mesa de trabajo, sino que requieren un horno. Crea un horno ahora.{*FurnaceIcon*} - - Cambiar aspecto + + Grava - - Cómo se juega + + Mineral de oro - - Controles + + Mineral de hierro - - Configuración + + Lava - - Créditos + + Arena - - Volver a instalar contenido + + Arenisca - - Ajustes de depuración + + Mineral de hulla - - El fuego se propaga + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. - - La dinamita explota + + Esta es la interfaz del horno. En él puedes transformar objetos fundiéndolos o, por ejemplo, convertir mineral de hierro en lingotes de hierro. - - Jugador contra jugador + + 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. - - Confiar en jugadores + + Madera - - Privilegios de anfitrión + + Madera de roble - - Generar estructuras + + 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. - - Mundo superplano + + {*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. - - Cofre de bonificación + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. - - Opciones de mundo + + Este es tu inventario. Muestra los objetos que llevas en la mano y los demás objetos que tengas. Aquí también aparece tu armadura. + - - Puede construir y extraer + + {*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. - - Puede usar puertas e interruptores + + Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + - - Puede abrir contenedores + + Mueve el objeto con el puntero hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. + Si hay varios objetos en el puntero, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno. - - Puede atacar a jugadores + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el puntero. Usa{*CONTROLLER_VK_A*} para recoger un objeto señalado con el puntero. + 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. + - - Puede atacar a animales + + Has completado la primera parte del tutorial. - - Moderador + + Usa el horno para crear cristal. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? - - Expulsar jugador + + Usa el horno para crear carbón. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? - - Puede volar + + Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. - - Desactivar agotamiento + + 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*} - - Invisible + + Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el mundo. - - Opciones de anfitrión + + 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*} - - Jugadores/Invitar + + + Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Partida online + + + Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. + - - Solo por invitación + + Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. + - - Más opciones + + + Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Cargar + + {*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. - - Nuevo mundo + + {*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. - - Nombre del mundo + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo crear. - - Semilla para el generador de mundos + + 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. - - Dejar vacío para semilla aleatoria + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. - - Jugadores + + Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. - - Unirse a partida + + Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario. - - Iniciar partida + + Si desplazas el puntero 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*}. + - - No se encontraron partidas + + + El puntero 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 puntero volverá a la lista de objetos y podrás seleccionar otro. + - - Jugar partida + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el puntero. + En una lista de objetos, usa{*CONTROLLER_VK_A*} para recoger un objeto que esté bajo el puntero y usa{*CONTROLLER_VK_Y*} para recoger un montón entero de ese objeto. + - - Marcadores + + Agua - - Ayuda y opciones + + Botella de cristal - - Juego completo + + Botella de agua + + + Ojo de araña - - Reanudar partida + + Pepita de oro - - Guardar partida + + Verruga del mundo inferior - - Dificultad: + + Poción{*splash*}{*prefix*}{*postfix*} - - Tipo de partida: + + Ojo de araña ferment. - - Estructuras: + + Caldero - - Tipo de nivel: + + Ojo finalizador - - JcJ: + + Melón resplandeciente - - Confiar en jugadores: + + Polvo de llama - - Dinamita: + + Crema de magma - - El fuego se propaga: + + Soporte para pociones - - Volver a instalar tema + + Lágrima de espectro - - Volver a instalar imagen de jugador 1 + + Semillas de calabaza - - Volver a instalar imagen de jugador 2 + + Semillas de melón - - Volver a instalar objeto de avatar 1 + + Pollo crudo - - Volver a instalar objeto de avatar 2 + + Disco: "11" - - Volver a instalar objeto de avatar 3 + + Disco: "dónde estamos" - - Opciones + + Cizallas - - Sonido + + Pollo cocinado - - Control + + Perla finalizadora - - Gráficos + + Rodaja de melón - - Interfaz de usuario + + Vara de llama - - Valores predeterminados + + Ternera cruda - - Oscilación de vista + + Filete - - Consejos + + Carne podrida - - Ayuda sobre el juego + + Botella de encanto - - Pantalla dividida vert. para 2 j. + + Tablones de roble - - Listo + + Tablones de abeto - - Editar mensaje de cartel: + + Tablones de abedul - - Rellena la información que irá junto a tu captura. + + Bloque de hierba - - Subtítulo + + Tierra - - Captura de pantalla del juego + + Guijarro - - Editar mensaje de cartel: + + Tablones de la jungla - - ¡Con la interfaz de usuario, los iconos y la textura clásica de Minecraft! + + Brote de abedul - - Mostrar todos los mundos mezclados + + Brote de árbol de la jungla - - Sin efectos + + Lecho de roca - - Celeridad + + Brote - - Lentitud + + Brote de roble - - Rapidez + + Brote de abeto - - Cansancio de extracción + + Piedra - - Fuerza + + Marco - - Debilidad + + Generar {*CREATURE*} - - Salud instantánea + + Ladrillo del mundo inferior - - Daño instantáneo + + Descarga de fuego - - Impulso en salto + + Desc. fuego (carbón) - - Náuseas + + Desc. de fuego (hulla) - - Regeneración + + Calavera - - Resistencia + + Cabeza - - Resistente al fuego + + Cabeza de %s - - Respiración acuática + + Cabeza de creeper - - Invisibilidad + + Calavera de esqueleto - - Ceguera + + Calavera de esqueleto atrofiado - - Visión nocturna + + Cabeza de zombi - - Hambre + + Una forma compacta de almacenar carbón. Se puede usar como combustible en un horno. Veneno - - de celeridad + + Hambre de lentitud - - de rapidez + + de celeridad - - de torpeza + + Invisibilidad - - de fortaleza + + Respiración acuática - - de debilidad + + Visión nocturna - - de curación + + Ceguera de daño - - de salto + + de curación de náuseas @@ -5010,29 +5855,38 @@ Selecciona ACEPTAR para salir de la partida. de regeneración - - de resistencia + + de torpeza - - de resistencia al fuego + + de rapidez + + + de debilidad + + + de fortaleza + + + Resistente al fuego - - de respiración en agua + + Saturación - - de invisibilidad + + de resistencia - - de ceguera + + de salto - - de visión nocturna + + Wither - - de hambre + + Aumento de salud - - de veneno + + Absorción @@ -5043,29 +5897,41 @@ Selecciona ACEPTAR para salir de la partida. III + + de invisibilidad + IV - - de salpicadura + + de respiración en agua - - Mundana + + de resistencia al fuego - - Aburrida + + de visión nocturna - - Insulsa + + de veneno - - Nítida + + de hambre - - Lechosa + + de absorción - - Difusa + + de saturación + + + de aumento de salud + + + de ceguera + + + de la decadencia Natural @@ -5073,17 +5939,17 @@ Selecciona ACEPTAR para salir de la partida. Fina - - Rara + + Difusa - - Plana + + Nítida - - Voluminosa + + Lechosa - - Chapucera + + Rara Untada @@ -5091,246 +5957,300 @@ Selecciona ACEPTAR para salir de la partida. Lisa - - Suave + + Chapucera - - Cortés + + Plana - - Gruesa + + Voluminosa - - Elegante + + Insulsa - - Sofisticada + + de salpicadura - - Encantadora + + Mundana + + + Aburrida Enérgica - - Refinada - Cordial + + Encantadora + + + Elegante + + + Sofisticada + Resplandeciente + + Rancia + + + Áspera + + + Inodora + Potente Repugnante - - Inodora + + Suave - - Rancia + + Refinada - - Áspera + + Gruesa - - Acre + + Cortés - - Asquerosa + + Restablece la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. - - Hedionda + + Reduce al instante la salud de los jugadores, animales y monstruos afectados. - - Se utiliza como base para todas las pociones. Úsala en un soporte para pociones para crear pociones. + + Hace que los jugadores, animales y monstruos afectados sean inmunes al daño causado por fuego, lava y ataques de llama a distancia. No tiene efectos. Se puede usar en un soporte para pociones 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. + + Acre Reduce 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 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 cuando atacan. + + Aumenta al instante la salud de los jugadores, animales y monstruos afectados. + Reduce el daño causado por los jugadores y monstruos afectados cuando atacan. - - Aumenta al instante la salud de los jugadores, animales y monstruos afectados. + + Se utiliza como base para todas las pociones. Úsala en un soporte para pociones para crear pociones. - - Reduce al instante la salud de los jugadores, animales y monstruos afectados. + + Asquerosa - - Restablece la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. + + Hedionda - - Hace que los jugadores, animales y monstruos afectados sean inmunes al daño causado por fuego, lava y ataques de llama a distancia. + + Aporrear + + + Agudeza Reduce la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. - - Agudeza + + Daño de ataque - - Aporrear + + Derribar Maldición de los artrópodos - - Derribar + + Velocidad - - Aspecto ígneo + + Refuerzos zombi - - Protección + + Fuerza de salto del caballo + + + Cuando se aplica: + + + Resistencia a derribar + + + Alcance de seguimiento de criaturas + + + Salud máxima + + + Toque sedoso + + + Eficacia + + + Afinidad acuática + + + Fortuna + + + Saqueo + + + Irrompible Protección contra el fuego + + Protección + + + Aspecto ígneo + Caída de pluma - - Protección contra explosiones + + Respiración Protección contra proyectiles - - Respiración - - - Afinidad acuática + + Protección contra explosiones - - Eficacia + + IV - - Toque sedoso + + V - - Irrompible + + VI - - Saqueo + + Puñetazo - - Fortuna + + VII - - Poder + + III Llama - - Puñetazo + + Poder Infinidad - - I - - - II - - - III + + II - - IV + + I - - V + + Se activa cuando una entidad pasa por una cuerda de trampa activada. - - VI + + Activa un garfio de cuerda de trampa conectado cuando una entidad pasa por ella. - - VII + + Una forma compacta de almacenar esmeraldas. - - VIII + + Similar a un cofre, pero los objetos introducidos en un cofre finalizador están disponibles en todos los cofres finalizadores del jugador, incluso en distintas dimensiones. IX - - X + + VIII Se puede perforar con un pico de hierro o un objeto mejor para extraer esmeraldas. - - Similar a un cofre, pero los objetos introducidos en un cofre finalizador están disponibles en todos los cofres finalizadores del jugador, incluso en distintas dimensiones. - - - Se activa cuando una entidad pasa por una cuerda de trampa activada. + + X - - Activa un garfio de cuerda de trampa conectado cuando una entidad pasa por ella. + + Restablece 2{*ICON_SHANK_01*} y se puede convertir en una zanahoria dorada. Puede plantarse en tierra de cultivo. - - Una forma compacta de almacenar esmeraldas. + + Se utiliza como decoración. Puedes plantar en ella flores, retoños, cactus y champiñones. Una pared hecha de guijarros. - - Se puede utilizar para reparar armas, herramientas y armaduras. + + Restablece 0,5{*ICON_SHANK_01*} y puede cocinarse en un horno. Puede plantarse en tierra de cultivo. Se funde en un horno para producir cuarzo del mundo inferior. - - Se utiliza como decoración. + + Se puede utilizar para reparar armas, herramientas y armaduras. Se puede comerciar con él con los aldeanos. - - Se utiliza como decoración. Puedes plantar en ella flores, retoños, cactus y champiñones. + + Se utiliza como decoración. - - Restablece 2{*ICON_SHANK_01*} y se puede convertir en una zanahoria dorada. Puede plantarse en tierra de cultivo. + + Restablece 4{*ICON_SHANK_01*}. - - Restablece 0,5{*ICON_SHANK_01*} y puede cocinarse en un horno. Puede plantarse en tierra de cultivo. + + Restaura 1{*ICON_SHANK_01*}. Puede envenenarte si lo ingieres. + + + Se usa para controlar un cerdo ensillado al montarlo. Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una patata en un horno. - - Restablece 1{*ICON_SHANK_01*} y puede cocinarse en un horno. Puede plantarse en tierra de cultivo. Puede envenenarte. - Restablece 3{*ICON_SHANK_01*}. Se crea con una zanahoria y pepitas de oro. - - Se usa para controlar un cerdo ensillado al montarlo. - - - Restablece 4{*ICON_SHANK_01*}. - Se usa con un yunque para encantar armas, herramientas o armaduras. Se crea perforando mineral de cuarzo del mundo inferior. Puede transformarse en un bloque de cuarzo. + + Patata + + + Patata asada + + + Zanahoria + Creado con lana. Se utiliza como decoración. @@ -5340,14 +6260,11 @@ Selecciona ACEPTAR para salir de la partida. Maceta - - Zanahoria - - - Patata + + Pastel de calabaza - - Patata asada + + Libro encantado Patata venenosa @@ -5358,11 +6275,11 @@ Selecciona ACEPTAR para salir de la partida. Zanahoria con palo - - Pastel de calabaza + + Garfio de cuerda trampa - - Libro encantado + + Cuerda de trampa Cuarzo del mundo inferior @@ -5373,11 +6290,8 @@ Selecciona ACEPTAR para salir de la partida. Cofre finalizador - - Garfio de cuerda trampa - - - Cuerda de trampa + + Pared guijarros y musgo Bloque de esmeralda @@ -5385,8 +6299,8 @@ Selecciona ACEPTAR para salir de la partida. Pared de guijarros - - Pared guijarros y musgo + + Patatas Maceta @@ -5394,8 +6308,8 @@ Selecciona ACEPTAR para salir de la partida. Zanahorias - - Patatas + + Yunque ligeramente dañado Yunque @@ -5403,8 +6317,8 @@ Selecciona ACEPTAR para salir de la partida. Yunque - - Yunque ligeramente dañado + + Bloque de cuarzo Yunque muy dañado @@ -5412,8 +6326,8 @@ Selecciona ACEPTAR para salir de la partida. Mineral de cuarzo del mundo inferior - - Bloque de cuarzo + + Escaleras de cuarzo Bloque de cuarzo tallado @@ -5421,8 +6335,8 @@ Selecciona ACEPTAR para salir de la partida. Bloque de cuarzo de pilar - - Escaleras de cuarzo + + Alfombra roja Alfombra @@ -5430,8 +6344,8 @@ Selecciona ACEPTAR para salir de la partida. Alfombra negra - - Alfombra roja + + Alfombra azul Alfombra verde @@ -5439,9 +6353,6 @@ Selecciona ACEPTAR para salir de la partida. Alfombra marrón - - Alfombra azul - Alfombra morada @@ -5454,18 +6365,18 @@ Selecciona ACEPTAR para salir de la partida. Alfombra gris - - Alfombra rosa - Alfombra lima - - Alfombra amarilla + + Alfombra rosa Alfombra azul claro + + Alfombra amarilla + Alfombra magenta @@ -5478,89 +6389,84 @@ Selecciona ACEPTAR para salir de la partida. Arenisca tallada - - Arenisca suave - {*PLAYER*} ha muerto intentando dañar a {*SOURCE*} + + Arenisca suave + {*PLAYER*} ha sido aplastado por un yunque. {*PLAYER*} ha sido aplastado por un bloque. - - Se ha teletransportado a {*PLAYER*} hasta {*DESTINATION*} - {*PLAYER*} te ha teletransportado a su posición - - {*PLAYER*} se ha teletransportado hasta ti + + Se ha teletransportado a {*PLAYER*} hasta {*DESTINATION*} Espinas - - Losa de cuarzo + + {*PLAYER*} se ha teletransportado hasta ti Hace que las áreas oscuras aparezcan iluminadas, incluso bajo el agua. + + Losa de cuarzo + Hace invisibles a los jugadores, animales y monstruos afectados. Reparar y nombrar - - Coste del encantamiento: %d - ¡Demasiado caro! - - Renombrar + + Coste del encantamiento: %d Tienes: - - Necesitas para el comercio + + Renombrar {*VILLAGER_TYPE*} ofrece %s - - Reparar + + Necesitas para el comercio Comercio - - Teñir collar + + Reparar Esta es la interfaz del yunque, que puedes utilizar para renombrar, reparar y aplicar encantamientos a armas, armaduras o herramientas, a cambio de niveles de experiencia. - - - {*B*} - Pulsa{*CONTROLLER_VK_A*} para saber más sobre la interfaz del yunque.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya conoces la interfaz del yunque. - + + Teñir collar Para empezar a trabajar con un objeto, colócalo en el primer espacio de entrada. - + - Al colocar la materia prima correcta en el segundo espacio de entrada (por ejemplo, lingotes de hierro para una espada de hierro dañada), la reparación propuesta aparece en el espacio de salida. + {*B*} + Pulsa{*CONTROLLER_VK_A*} para saber más sobre la interfaz del yunque.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces la interfaz del yunque. @@ -5568,9 +6474,9 @@ Selecciona ACEPTAR para salir de la partida. También se puede colocar un segundo objeto idéntico en el segundo espacio para combinar los dos objetos. - + - Para encantar objetos en el yunque, coloca un libro encantado en el segundo espacio de entrada. + Al colocar la materia prima correcta en el segundo espacio de entrada (por ejemplo, lingotes de hierro para una espada de hierro dañada), la reparación propuesta aparece en el espacio de salida. @@ -5578,9 +6484,9 @@ Selecciona ACEPTAR para salir de la partida. El número de niveles de experiencia que cuesta el trabajo aparece debajo del resultado. Si no tienes suficientes niveles de experiencia, no podrás realizar la reparación. - + - Es posible renombrar un objeto modificando el nombre que aparece en la ventana de texto. + Para encantar objetos en el yunque, coloca un libro encantado en el segundo espacio de entrada. @@ -5588,9 +6494,9 @@ Selecciona ACEPTAR para salir de la partida. Coger el objeto reparado consumirá los dos objetos utilizados por el yunque y reducirá tu nivel de experiencia en la cantidad indicada. - + - En esta área hay un yunque y un cofre que contiene herramientas y armas con las que trabajar. + Es posible renombrar un objeto modificando el nombre que aparece en la ventana de texto. @@ -5600,9 +6506,9 @@ Selecciona ACEPTAR para salir de la partida. Pulsa{*CONTROLLER_VK_B*} si ya conoces el yunque. - + - Usando un yunque, puedes reparar armas y herramientas para restaurar su durabilidad, renombrarlas o encantarlas con libros encantados. + En esta área hay un yunque y un cofre que contiene herramientas y armas con las que trabajar. @@ -5610,9 +6516,9 @@ Selecciona ACEPTAR para salir de la partida. Puedes encontrar libros encantados en los cofres de las mazmorras, o encantar libros normales en la mesa de encantamiento. - + - Usar el yunque cuesta niveles de experiencia y cada uso puede dañar el yunque. + Usando un yunque, puedes reparar armas y herramientas para restaurar su durabilidad, renombrarlas o encantarlas con libros encantados. @@ -5620,9 +6526,9 @@ Selecciona ACEPTAR para salir de la partida. El tipo de trabajo a realizar, el valor del objeto, el número de encantamientos y la cantidad de trabajos anteriores afectan al coste de la reparación. - + - Renombrar un objeto cambia el nombre que aparece para todos los jugadores y reduce de forma permanente el coste de trabajo anterior. + Usar el yunque cuesta niveles de experiencia y cada uso puede dañar el yunque. @@ -5630,9 +6536,9 @@ Selecciona ACEPTAR para salir de la partida. En el cofre de esta área encontrarás picos dañados, materias primas, botellas de encantamiento y libros encantados para experimentar. - + - Esta es la interfaz de comercio, que muestra los intercambios que puedes realizar con un aldeano. + Renombrar un objeto cambia el nombre que aparece para todos los jugadores y reduce de forma permanente el coste de trabajo anterior. @@ -5642,9 +6548,9 @@ Selecciona ACEPTAR para salir de la partida. Pulsa{*CONTROLLER_VK_B*} si ya conoces la interfaz de comercio. - + - Todos los intercambios que el aldeano está dispuesto a hacer en este momento aparecen en la parte superior. + Esta es la interfaz de comercio, que muestra los intercambios que puedes realizar con un aldeano. @@ -5652,9 +6558,9 @@ Selecciona ACEPTAR para salir de la partida. Los intercambios aparecen en rojo y no están disponibles si no tienes los objetos necesarios. - + - La cantidad y el tipo de objetos que das al aldeano aparecen en dos ventanas a la izquierda. + Todos los intercambios que el aldeano está dispuesto a hacer en este momento aparecen en la parte superior. @@ -5662,9 +6568,9 @@ Selecciona ACEPTAR para salir de la partida. Puedes ver el número total de objetos necesarios para el intercambio en las dos ventanas de la izquierda. - + - Pulsa{*CONTROLLER_VK_A*} para intercambiar los objetos que el aldeano necesita por el objeto que ofrece. + La cantidad y el tipo de objetos que das al aldeano aparecen en dos ventanas a la izquierda. @@ -5672,11 +6578,9 @@ Selecciona ACEPTAR para salir de la partida. En esta área hay un aldeano y un cofre que contiene papel para comprar objetos. - + - {*B*} - Pulsa{*CONTROLLER_VK_A*} para saber más sobre el comercio.{*B*} - Pulsa{*CONTROLLER_VK_B*} si ya conoces el comercio. + Pulsa{*CONTROLLER_VK_A*} para intercambiar los objetos que el aldeano necesita por el objeto que ofrece. @@ -5684,14 +6588,21 @@ Selecciona ACEPTAR para salir de la partida. Los jugadores pueden intercambiar objetos de su inventario con los aldeanos. - + - Los intercambios que puede ofrecer un aldeano dependen de su profesión. + {*B*} + Pulsa{*CONTROLLER_VK_A*} para saber más sobre el comercio.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces el comercio. Realizar una mezcla de intercambios aumentará o actualizará aleatoriamente los intercambios disponibles del aldeano. + + + + + Los intercambios que puede ofrecer un aldeano dependen de su profesión. @@ -5851,7 +6762,4 @@ Todos los cofres finalizadores de un mundo están conectados. Los objetos que co Curar - - Buscando semillas para el generador de mundos. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsPlatformSpecific.xml index 07f7ff8b..b735d372 100644 --- a/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/es-ES/stringsPlatformSpecific.xml @@ -1,242 +1,245 @@  - - NOT USED + + ¿Quieres iniciar sesión en "PSN"? + - - ¡Puedes utilizar la pantalla táctil del sistema PlayStation®Vita para navegar por los menús! + + Para los jugadores que no estén en el mismo sistema PlayStation®Vita que el anfitrión, al seleccionar esta opción se expulsará al jugador de la partida y a los demás jugadores de su sistema PlayStation®Vita. Este jugador no podrá volver a unirse a la partida hasta que se reinicie. - - minecraftforum cuenta con una sección dedicada a la PlayStation®Vita Edition. + + SELECT - - ¡En Twitter obtendrás la información más reciente sobre @4J Studios y @Kappische! + + Esta opción desactiva las actualizaciones de trofeos y marcadores para este mundo mientras juegas, y si vuelves a cargarla después de guardar con esta opción activada. + - - ¡No mires al Finalizador a los ojos! + + Sistema PlayStation®Vita - - Creemos que 4J Studios ha eliminado a Herobrine del juego para el sistema PlayStation®Vita, pero no estamos seguros. + + Elige una red Ad hoc para conectar con otros sistemas PlayStation®Vita cercanos, o "PSN" para conectar con amigos de todo el mundo. - - ¡Minecraft: PlayStation®Vita Edition ha batido un montón de récords! + + Red Ad hoc - - {*T3*}CÓMO SE JUEGA: MULTIJUGADOR{*ETW*}{*B*}{*B*} -Minecraft para el sistema PlayStation®Vita es un juego multijugador por defecto.{*B*}{*B*} -Si inicias o te unes a una partida online, 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 (si seleccionas la opción Permitir amigos de amigos).{*B*} -Una vez en la partida, pulsa el botón SELECT para mostrar la lista de todos los jugadores y expulsar a jugadores de la partida. + + Cambiar modo de red - - {*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 ID online. + + Seleccionar modo de red - - {*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} -La interfaz del modo Creativo permite mover cualquier objeto del juego al inventario 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 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á los trofeos y las actualizaciones del marcador deshabilitados, 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 usar{*CONTROLLER_ACTION_DPAD_UP*} para subir y{*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. + + ID online en pantalla dividida - - 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 los botones de dirección para moverte hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha. + + Trofeos - - NOT USED + + Este juego utiliza la función de autoguardado. Si ves este icono, el juego estará guardando los datos. +No apagues el sistema PlayStation®Vita cuando aparezca este icono en pantalla. - - NOT USED + + Si está habilitado, el anfitrión puede volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego. Deshabilita los trofeos y las actualizaciones del marcador. - - "NOT USED" + + ID online: - - "NOT USED" + + Estás usando la versión de prueba de un pack de textura. Tendrás acceso al contenido completo del pack de textura, pero no podrás guardar tu progreso. +Si intentas guardar mientras usas esta versión de prueba, tendrás la opción de adquirir la versión completa. - - Invitar Amigos + + Parche 1.04 (actualización 14) - - Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá los trofeos y las actualizaciones del marcador deshabilitados, aunque después lo cargues en el modo Supervivencia. ¿Seguro que quieres continuar? + + ID online del juego - - Este mundo se ha guardado en el modo Creativo y tiene los trofeos y las actualizaciones del marcador deshabilitados. ¿Seguro que quieres continuar? + + ¡Mira lo que he hecho en Minecraft: PlayStation®Vita Edition! - - Este mundo se ha guardado en el modo Creativo y tiene los trofeos y las actualizaciones del marcador deshabilitados. + + Error en la descarga. Inténtalo más tarde. - - Si creas, cargas o guardas un mundo con los privilegios de anfitrión habilitados, ese mundo tendrá los trofeos y las actualizaciones del marcador deshabilitados, aunque después lo cargues con esas opciones deshabilitadas. ¿Seguro que quieres continuar? + + No ha sido posible unirse a la partida debido a un tipo de NAT estricta. Revisa tu configuración de red. - - Se ha perdido la conexión con "PSN". Saliendo al menú principal. + + Error en la carga. Inténtalo más tarde. - - Se ha perdido la conexión con "PSN". + + ¡Descarga completada! - - Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Si tuvieras el juego completo, ¡habrías conseguido un trofeo! -Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®Vita Edition y jugar con amigos de todo el mundo a través de "PSN". -¿Te gustaría desbloquear el juego completo? + + No hay partida guardada disponible en la zona de guardado en este momento. +Puedes cargar un mundo guardado en la zona de guardado usando Minecraft: PlayStation®3 Edition, y luego descargarlo con Minecraft: PlayStation®Vita Edition. - - Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Si tuvieras el juego completo, ¡habrías conseguido un tema! -Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®Vita Edition y jugar con amigos de todo el mundo a través de "PSN". -¿Te gustaría desbloquear el juego completo? + + Guardado incompleto - - Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Necesitas el juego completo para aceptar esta invitación. -¿Te gustaría desbloquear el juego completo? + + Minecraft: PlayStation®Vita Edition no tiene espacio para guardar datos. Para crear espacio, borra otras partidas guardadas de Minecraft: PlayStation®Vita Edition. - - Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con una cuenta Sony Entertainment Network. + + Carga cancelada - - ID online + + Has cancelado la carga de esta partida guardada en la zona de guardado. - - Pociones + + Cargar partida guardada de PS3™/PS4™ - - Has vuelto a la pantalla de título porque has cerrado sesión en "PSN". + + Cargando datos: %d%% - - Has jugado a la versión de prueba de Minecraft: PlayStation®Vita Edition durante la cantidad máxima de tiempo permitido. Para continuar divirtiéndote, ¿te gustaría desbloquear el juego completo? + + "PSN" - - Se ha producido un error al cargar Minecraft: PlayStation®Vita Edition y no es posible continuar. + + Descargar datos PS3™ - - No te has podido unir a la partida porque uno o más jugadores no tienen autorización para jugar online debido a las restricciones de chat en su cuenta Sony Entertainment Network. + + Descargando datos: %d%% - - No has podido crear una partida online porque uno o más jugadores no tienen autorización para jugar online debido a las restricciones de chat en su cuenta Sony Entertainment Network. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. + + Guardando - - No te puedes unir a esta sesión de juego porque la función Online está desactivada en tu cuenta Sony Entertainment Network debido a resticciones de chat. + + ¡Carga completada! - - No te puedes unir a esta sesión de juego porque uno de los jugadores locales tiene la función Online desactivada en su cuenta Sony Entertainment Network debido a resticciones de chat. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. + + ¿Estás seguro de que quieres cargar esta partida guardada y sobrescribir cualquier archivo de la zona de guardado? - - No puedes crear esta sesión de juego porque uno de los jugadores locales tiene la función Online desactivada en su cuenta Sony Entertainment Network debido a las resticciones de chat. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. + + Convirtiendo datos - - Este juego utiliza la función de autoguardado. Si ves este icono, el juego estará guardando los datos. -No apagues el sistema PlayStation®Vita cuando aparezca este icono en pantalla. + + NOT USED - - Si está habilitado, el anfitrión puede volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego. Deshabilita los trofeos y las actualizaciones del marcador. + + NOT USED - - ID online en pantalla dividida + + {*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} +La interfaz del modo Creativo permite mover cualquier objeto del juego al inventario 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 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á los trofeos y las actualizaciones del marcador deshabilitados, 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 usar{*CONTROLLER_ACTION_DPAD_UP*} para subir y{*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. - - Trofeos + + 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 los botones de dirección para moverte hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha. - - ID online: + + "NOT USED" - - ID online del juego + + Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá los trofeos y las actualizaciones del marcador deshabilitados, aunque después lo cargues en el modo Supervivencia. ¿Seguro que quieres continuar? - - ¡Mira lo que he hecho en Minecraft: PlayStation®Vita Edition! + + Este mundo se ha guardado en el modo Creativo y tiene los trofeos y las actualizaciones del marcador deshabilitados. ¿Seguro que quieres continuar? - - Estás usando la versión de prueba de un pack de textura. Tendrás acceso al contenido completo del pack de textura, pero no podrás guardar tu progreso. -Si intentas guardar mientras usas esta versión de prueba, tendrás la opción de adquirir la versión completa. + + "NOT USED" - - Parche 1.04 (actualización 14) + + Invitar Amigos - - SELECT + + minecraftforum cuenta con una sección dedicada a la PlayStation®Vita Edition. - - Esta opción desactiva las actualizaciones de trofeos y marcadores para este mundo mientras juegas, y si vuelves a cargarla después de guardar con esta opción activada. - + + ¡En Twitter obtendrás la información más reciente sobre @4J Studios y @Kappische! - - ¿Quieres iniciar sesión en "PSN"? - + + NOT USED - - Para los jugadores que no estén en el mismo sistema PlayStation®Vita que el anfitrión, al seleccionar esta opción se expulsará al jugador de la partida y a los demás jugadores de su sistema PlayStation®Vita. Este jugador no podrá volver a unirse a la partida hasta que se reinicie. + + ¡Puedes utilizar la pantalla táctil del sistema PlayStation®Vita para navegar por los menús! - - Sistema PlayStation®Vita + + ¡No mires al Finalizador a los ojos! - - Cambiar modo de red + + {*T3*}CÓMO SE JUEGA: MULTIJUGADOR{*ETW*}{*B*}{*B*} +Minecraft para el sistema PlayStation®Vita es un juego multijugador por defecto.{*B*}{*B*} +Si inicias o te unes a una partida online, 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 (si seleccionas la opción Permitir amigos de amigos).{*B*} +Una vez en la partida, pulsa el botón SELECT para mostrar la lista de todos los jugadores y expulsar a jugadores de la partida. - - Seleccionar modo de red + + {*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 ID online. - - Elige una red Ad hoc para conectar con otros sistemas PlayStation®Vita cercanos, o "PSN" para conectar con amigos de todo el mundo. + + Creemos que 4J Studios ha eliminado a Herobrine del juego para el sistema PlayStation®Vita, pero no estamos seguros. - - Red Ad hoc + + ¡Minecraft: PlayStation®Vita Edition ha batido un montón de récords! - - "PSN" + + Has jugado a la versión de prueba de Minecraft: PlayStation®Vita Edition durante la cantidad máxima de tiempo permitido. Para continuar divirtiéndote, ¿te gustaría desbloquear el juego completo? - - Descargar datos de sistema PlayStation®3 + + Se ha producido un error al cargar Minecraft: PlayStation®Vita Edition y no es posible continuar. - - Cargar partida guardada a sistema PlayStation®3/PlayStation®4 + + Pociones - - Carga cancelada + + Has vuelto a la pantalla de título porque has cerrado sesión en "PSN". - - Has cancelado la carga de esta partida guardada en la zona de guardado. + + No te has podido unir a la partida porque uno o más jugadores no tienen autorización para jugar online debido a las restricciones de chat en su cuenta Sony Entertainment Network. - - Cargando datos: %d%% + + No te puedes unir a esta sesión de juego porque uno de los jugadores locales tiene la función Online desactivada en su cuenta Sony Entertainment Network debido a resticciones de chat. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. - - Descargando datos: %d%% + + No puedes crear esta sesión de juego porque uno de los jugadores locales tiene la función Online desactivada en su cuenta Sony Entertainment Network debido a las resticciones de chat. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. - - ¿Estás seguro de que quieres cargar esta partida guardada y sobrescribir cualquier archivo de la zona de guardado? + + No has podido crear una partida online porque uno o más jugadores no tienen autorización para jugar online debido a las restricciones de chat en su cuenta Sony Entertainment Network. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. - - Convirtiendo datos + + No te puedes unir a esta sesión de juego porque la función Online está desactivada en tu cuenta Sony Entertainment Network debido a resticciones de chat. - - Guardando + + Se ha perdido la conexión con "PSN". Saliendo al menú principal. - - ¡Carga completada! + + Se ha perdido la conexión con "PSN". - - Error en la carga. Inténtalo más tarde. + + Este mundo se ha guardado en el modo Creativo y tiene los trofeos y las actualizaciones del marcador deshabilitados. - - ¡Descarga completada! + + Si creas, cargas o guardas un mundo con los privilegios de anfitrión habilitados, ese mundo tendrá los trofeos y las actualizaciones del marcador deshabilitados, aunque después lo cargues con esas opciones deshabilitadas. ¿Seguro que quieres continuar? - - Error en la descarga. Inténtalo más tarde. + + Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Si tuvieras el juego completo, ¡habrías conseguido un trofeo! +Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®Vita Edition y jugar con amigos de todo el mundo a través de "PSN". +¿Te gustaría desbloquear el juego completo? - - No ha sido posible unirse a la partida. Tipo de NAT estricta. Cambia la configuración de red. + + Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con una cuenta Sony Entertainment Network. - - No hay partida guardada disponible en la zona de guardado en este momento. -Puedes cargar un mundo guardado en la zona de guardado usando Minecraft: PlayStation®3 Edition, y luego descargarlo con Minecraft: PlayStation®Vita Edition. + + ID online - - Guardado incompleto + + Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Si tuvieras el juego completo, ¡habrías conseguido un tema! +Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®Vita Edition y jugar con amigos de todo el mundo a través de "PSN". +¿Te gustaría desbloquear el juego completo? - - Minecraft: PlayStation®Vita Edition no tiene espacio para guardar datos. Para crear espacio, borra otras partidas guardadas de Minecraft: PlayStation®Vita Edition. + + Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Necesitas el juego completo para aceptar esta invitación. +¿Te gustaría desbloquear el juego completo? + + + La partida guardada de la zona de guardado tiene un número de versión que Minecraft: PlayStation®Vita Edition no admite todavía. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fi-FI/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/4J_stringsPlatformSpecific.xml index 5b58a79f..8defd8bd 100644 --- a/Minecraft.Client/PSVitaMedia/loc/fi-FI/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/4J_stringsPlatformSpecific.xml @@ -1,50 +1,50 @@  - - Järjestelmän tallennustila ei ole tarpeeksi vapaata tilaa pelitallenteen luomiseksi. - - - Sinut on palautettu aloitusnäyttöön, koska olet kirjautunut ulos "PSN"-verkosta + + Asetusten tallentaminen Sony Entertainment Network -tilillesi epäonnistui. - - Ottelu on päättynyt, koska olet kirjautunut ulos "PSN"-verkosta + + Sony Entertainment Network -tilin ongelma - - Ei tällä hetkellä kirjautunut sisään. + + Pääsyssä Sony Entertainment Network -tilillesi oli ongelma. Trophyasi ei voitu myöntää tällä hetkellä. - - Tässä pelissä on ominaisuuksia, joita hyödyntääksesi sinun on oltava kirjautunut "PSN"-verkkoon, mutta et ole tällä hetkellä verkossa. + + Tämä on Minecraft: PlayStation®3 Edition -koepeli. Jos sinulla olisi koko peli, olisit juuri ansainnut trophyn! +Avaa koko peli kokeaksesi Minecraft: PlayStation®3 Edition -pelin riemun ja pelataksesi "PSN"-verkon kautta ympäri maailmaa asuvien kaveriesi kanssa. +Haluatko avata koko pelin? - - Ad Hoc -verkko offline-tilassa. + + Yhdistä Ad Hoc -verkkoon Tässä pelissä on joitakin toimintoja, jotka vaativat Ad Hoc -verkkoyhteyden, mutta olet tällä hetkellä offline-tilassa. - - Tämä ominaisuus vaatii, että olet kirjautunut "PSN"-verkkoon. - - - Yhdistä "PSN"-verkkoon - - - Yhdistä Ad Hoc -verkkoon + + Ad Hoc -verkko offline-tilassa. Trophy-ongelma - - Pääsyssä Sony Entertainment Network -tilillesi oli ongelma. Trophyasi ei voitu myöntää tällä hetkellä. + + Ottelu on päättynyt, koska olet kirjautunut ulos "PSN"-verkosta - - Sony Entertainment Network -tilin ongelma + + Sinut on palautettu aloitusnäyttöön, koska olet kirjautunut ulos "PSN"-verkosta - - Asetusten tallentaminen Sony Entertainment Network -tilillesi epäonnistui. + + Järjestelmän tallennustila ei ole tarpeeksi vapaata tilaa pelitallenteen luomiseksi. - - Tämä on Minecraft: PlayStation®3 Edition -koepeli. Jos sinulla olisi koko peli, olisit juuri ansainnut trophyn! -Avaa koko peli kokeaksesi Minecraft: PlayStation®3 Edition -pelin riemun ja pelataksesi "PSN"-verkon kautta ympäri maailmaa asuvien kaveriesi kanssa. -Haluatko avata koko pelin? + + Ei tällä hetkellä kirjautunut sisään. + + + Yhdistä "PSN"-verkkoon + + + Tämä ominaisuus vaatii, että olet kirjautunut "PSN"-verkkoon. + + + Tässä pelissä on ominaisuuksia, joita hyödyntääksesi sinun on oltava kirjautunut "PSN"-verkkoon, mutta et ole tällä hetkellä verkossa. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fi-FI/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/AdditionalStrings.xml index 63c828d1..5fd34e24 100644 --- a/Minecraft.Client/PSVitaMedia/loc/fi-FI/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/AdditionalStrings.xml @@ -48,6 +48,12 @@ Asetustiedostosi on vioittunut ja se pitää poistaa. + + Poista asetustiedosto. + + + Yritä ladata asetustiedosto uudelleen. + Tallennusvälimuistitiedostosi on vioittunut ja se pitää poistaa. @@ -75,6 +81,9 @@ Verkkopalvelu on poistettu käytöstä Sony Entertainment Network -tililläsi jonkun paikallisen pelaajasi lapsilukkoasetusten takia. + + Verkko-ominaisuudet ovat pois käytöstä, koska peliin on saatavilla päivitys. + Ladattavan sisällön tarjouksia ei ole juuri nyt saatavilla tälle pelille. @@ -84,7 +93,4 @@ Tule pelaamaan Minecraft: PlayStation®Vita Edition -peliä! - - Verkko-ominaisuudet ovat pois käytöstä, koska peliin on saatavilla päivitys. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsGeneric.xml index 92367b39..fb0f8f65 100644 --- a/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsGeneric.xml @@ -1,5094 +1,5957 @@  - - Uutta ladattavaa sisältöä on saatavilla! Löydät sen päävalikosta Minecraft-kaupan painikkeen takaa. + + Vaihdetaan paikalliseen peliin - - Voit vaihtaa hahmosi ulkonäköä Minecraft-kaupasta ostetulla Ulkoasupaketilla. Valitse päävalikosta "Minecraft-kauppa", niin näet, mitä on saatavilla. + + Odota kun istunnon järjestäjä tallentaa pelin - - Tee kuvasta kirkkaampi tai tummempi muuttamalla gamma-asetuksia. + + Siirrytään Ääreen - - Jos olet valinnut pelin vaikeustasoksi Rauhallinen, elinvoimasi paranee automaattisesti, eikä yöllä esiinny hirviöitä. + + Tallennetaan pelaajia - - Syötä sudelle luu, niin se kesyyntyy. Voit käskeä sen istumaan tai seuraamaan sinua. + + Yhdistetään istunnon järjestäjään - - Voit tiputtaa esineitä ollessasi tavaraluettelossa siirtämällä osoittimen pois luettelosta ja painamalla{*CONTROLLER_VK_A*}. + + Ladataan maastoa - - Kun nukkuu yönsä sängyssä, peli kelautuu aamuun, mutta moninpelissä kaikkien pelaajien on nukuttava sängyssä samaan aikaan. + + Poistutaan Äärestä - - Sioista saa kerättyä porsaankyljyksiä. Kun ne paistaa ja syö, saa takaisin elinvoimaa. + + Kotisi sänky puuttui tai oli esteen takana - - Lehmistä saa kerättyä nahkaa, josta voi valmistaa panssareita. + + Et voi levätä nyt, koska lähistöllä on hirviöitä - - Jos sinulla on tyhjä ämpäri, voit täyttää sen lehmästä lypsämälläsi maidolla, tai vedellä tai laavalla! + + Sinä nukut sängyssä. Jotta ajan voi kelata aamuun, kaikkien pelaajien on nukuttava sängyssä samaan aikaan. - - Kuokalla voi kääntää maata kasvien istuttamista varten. + + Tämä sänky on varattu - - Hämähäkit eivät hyökkää päivällä – ellet itse hyökkää niiden kimppuun. + + Vain öisin voi nukkua - - Maan tai hiekan kaivaminen on nopeampaa lapiolla kuin käsin. + + %s nukkuu sängyssä. Jotta ajan voisi kelata aamuun, kaikkien pelaajien on nukuttava sängyssä samaan aikaan. - - Paistettujen porsaankyljysten syömisestä saa enemmän elinvoimaa kuin raaoista kyljyksistä. + + Ladataan kenttää - - Tee soihtuja, niin voit valaista paikkoja öisin. Hirviöt välttelevät soihtujen valaisemia alueita. + + Viimeistellään... - - Pääset nopeammin paikaista toiseen raiteilla kulkevalla kaivoskärryllä. + + Rakennetaan maastoa - - Istuta taimia, niin niistä kasvaa puita. + + Simuloidaan hieman maailmaa - - Sikamiehet eivät hyökkää kimppuusi, ellet itse hyökkää ensin. + + Sija - - Voit vaihtaa kohtaa, johon synnyt uudelleen, ja kelata aikaa aamuun asti sängyssä nukkumalla. + + Valmistaudutaan tallentamaan kenttä - - Iske tulipallot takaisin hornanhenkiä päin! + + Valmistellaan osioita... - - Rakentamalla portaalin voit matkustaa toiseen ulottuvuuteen – Hornaan. + + Otetaan palvelin käyttöön - - Painamalla{*CONTROLLER_VK_B*} voit tiputtaa käsissäsi pitelemäsi esineen. + + Poistutaan Hornasta - - Käytä työhön oikeaa työkalua. + + Synnytään uudelleen - - Jos et löydä yhtään kivihiiltä soihtujasi varten, voit valmistaa uunissa puusta puuhiiltä. + + Luodaan kenttää - - Kaivaminen suoraan alas tai suoraan ylös ei ole hyvä ajatus. + + Luodaan syntyalue - - Luujauhoa (valmistetaan luurangon luusta) voidaan käyttää lannoitteena, joka saa kasvit kasvamaan välittömästi! + + Ladataan syntyalue - - Lurkit räjähtävät, kun ne pääsevät lähellesi! + + Siirrytään Hornaan - - Laavakiveä syntyy, kun vesi osuu laavalähdepalikkaan. + + Työkalut ja aseet - - Kun lähdepalikka poistetaan, voi kestää minuutteja ennen kuin laava katoaa KOKONAAN. + + Gamma - - Mukulakivi kestää hornanhenkien tulipalloja, minkä ansiosta sillä on hyvä suojata portaaleja. + + Pelin herkkyys - - Palikat, joita voi käyttää valonlähteinä, sulattavat lunta ja jäätä. Näihin kuuluvat soihdut, hehkukivi ja kurpitsalyhdyt. + + Käyttöliittymän herkkyys - - Pidä varasi rakentaessasi villasta rakennuksia avoimeen maastoon, sillä ukkosmyrskyjen salamat saattavat sytyttää villan tuleen. + + Vaikeustaso - - Yhdellä ämpärillisellä laavaa voi sulattaa 100 palikkaa uunissa. + + Musiikki - - Nuottipalikan soitin muuttuu sen alla olevan materiaalin mukaan. + + Ääni - - Zombit ja luurangot selviytyvät auringonvalossa, jos ne ovat vedessä. + + Rauhallinen - - Jos hyökkäät suden kimppuun, kaikki lähistön sudet suuttuvat ja hyökkäävät kimppuusi. Sama pätee Sikamieszombeihin. + + Tällä vaikeustasolla pelaajan elinvoima paranee ajan kuluessa, eikä ympäristössä esiinny vihollisia. - - Sudet eivät pääse Hornaan. + + Tällä vaikeustasolla ympäristöön syntyy hirviöitä, mutta ne tekevät pelaajalle vähemmän vahinkoa kuin Tavallisella vaikeustasolla. - - Sudet eivät hyökkää lurkkien kimppuun. + + Tällä vaikeustasolla ympäristöön syntyy hirviöitä ja ne tekevät normaalia vahinkoa pelaajaan. - - Kanat munivat 5-10 minuutin välein. + + Helppo - - Laavakiveä voi louhia ainoastaan timanttihakulla. + + Tavallinen - - Lurkit ovat helpoimmin saatavilla oleva ruudin lähde. + + Vaikea - - Asettamalla kaksi arkkua rinnakkain saa yhden suuren arkun. + + Kirjautunut ulos - - Kesyjen susien elinvoiman näkee niiden hännän asennosta. Paranna niitä syöttämällä niille lihaa. + + Panssari - - Paista kaktus uunissa, niin saat vihreää väriainetta. + + Mekanismit - - Peliohje-valikoiden Uutta-osiosta löytyy uusin päivitystieto pelistä. + + Kulkuneuvot - - Pelissä on nyt pinottavia aitoja. + + Aseet - - Jotkin eläimet seuraavat, jos pitää vehnää kädessään. + + Ruoka - - Jos eläin ei voi liikkua enempää kuin 20 palikkaa johonkin suuntaan, se ei katoa. + + Rakennukset - - Musiikista vastaa C418. + + Koristeet - - Notchilla on yli miljoona seuraajaa Twitterissä! + + Keittäminen - - Kaikki ruotsalaiset eivät ole vaaleatukkaisia. Joillakin, kuten Jensillä ja Mojangilla, on jopa punaiset hiukset! + + Työkalut, aseet ja panssarit - - Peliä päivitetään jossain vaiheessa! + + Materiaalit - - Kuka on Notch? + + Rakennuspalikat - - Mojangilla on enemmän palkintoja kuin työntekijöitä! + + Punakivi ja kulkuneuvot - - Jotkut julkkiksetkin pelaavat Minecraftia! + + Sekalaiset - - deadmau5 tykkää Minecraftista! + + Sijoitukset: - - Älä katso suoraan kohti bugeja. + + Poistu tallentamatta - - Lurkit syntyivät koodausvirheestä. + + Haluatko varmasti poistua päävalikkoon? Kaikki tallentamaton edistyminen menetetään. - - Onko se kana vai onko se ankka? + + Haluatko varmasti poistua päävalikkoon? Edistymisesi menetetään! - - Olitko sinä Mineconissa? + + Tämä tallenne on viallinen tai vahingoittunut. Haluatko poistaa sen? - - Kukaan Mojangissa ei ole koskaan nähnyt Junkboyn kasvoja. + + Haluatko varmasti poistua päävalikkoon ja erottaa kaikki pelaajat pelistä? Kaikki tallentamaton edistyminen menetetään. - - Tiesitkö, että on olemassa Minecraft Wiki? + + Tallenna ja poistu - - Mojangin uusi toimisto on siisti! + + Luo uusi maailma - - Minecon 2013 pidettiin Floridan Orlandossa, USA:ssa! + + Anna nimi maailmallesi - - .party() oli mahtava! + + Syötä siemen maailmasi luomiseksi - - Oleta aina ennemmin, että huhut ovat valetta kuin totta! + + Lataa tallennettu maailma - - {*T3*}PELIOHJE: PERUSTEET{*ETW*}{*B*}{*B*} -Minecraft on peli, missä palikoita asettamalla voi rakentaa mitä tahansa kuvitteleekin. Öisin hirviöt tulevat esiin, joten rakenna itsellesi suojapaikka ennen kuin niin tapahtuu.{*B*}{*B*} -Katso ympärillesi painamalla{*CONTROLLER_ACTION_LOOK*}.{*B*}{*B*} -Liiku painamalla{*CONTROLLER_ACTION_MOVE*}.{*B*}{*B*} -Hyppää painamalla{*CONTROLLER_ACTION_JUMP*}.{*B*}{*B*} -Juokse painamalla{*CONTROLLER_ACTION_MOVE*} eteenpäin nopeasti kaksi kertaa. Kun pidät{*CONTROLLER_ACTION_MOVE*} painettuna eteenpäin, pelihahmo jatkaa juoksuaan, kunnes juoksuaika loppuu tai ruokapalkissa on ruokaa alle{*ICON_SHANK_03*}.{*B*}{*B*} -Louhi ja hakkaa kädelläsi tai kädessäsi pitämälläsi esineellä painamalla {*CONTROLLER_ACTION_ACTION*}. Sinun täytyy ehkä valmistaa työkalu joidenkin palikoiden louhimiseksi.{*B*}{*B*} -Jos kädessäsi on esine, voit käyttää sitä painamalla{*CONTROLLER_ACTION_USE*}, tai tiputtaa sen painamalla{*CONTROLLER_ACTION_DROP*}. + + Suorita opetuspeli - - {*T3*}PELIOHJE: HUD-NÄYTTÖ{*ETW*}{*B*}{*B*} HUD näyttää tietoa tilastasi: elinvoimasi, jäljellä olevan happesi, jos olet veden alla, nälkätasosi (se paranee syömällä) ja panssarisi, jos sinulla on sellainen. Jos menetät elinvoimaa, mutta ruokapalkissasi on ruokaa 9{*ICON_SHANK_01*} tai enemmän, elinvoimasi paranee automaattisesti. Ruuan syöminen täyttää ruokapalkkiasi.{*B*} Kokemuspalkki näkyy myös täällä. Numero osoittaa kokemustasosi ja palkki kertoo, miten monta kokemuspistettä vaaditaan kokemustason nostamiseksi. Kokemuspisteitä saa keräämällä olentojen kuollessa tiputtamia kokemuskuulia, louhimalla tiettyjä palikoita, eläimiä kasvattamalla, kalastamalla ja sulattamalla malmia uunissa.{*B*}{*B*} Se myös näyttää esineet jotka ovat käytettävissä. Vaihda kädessäsi pitämää esinettä painamalla{*CONTROLLER_ACTION_LEFT_SCROLL*} tai{*CONTROLLER_ACTION_RIGHT_SCROLL*}. + + Opetuspeli - - {*T3*}PELIOHJE: TAVARALUETTELO{*ETW*}{*B*}{*B*} -Katso tavaraluetteloasi painamalla{*CONTROLLER_ACTION_INVENTORY*}.{*B*}{*B*} -Tästä näytöstä näet kädessäsi valmiina olevan esineen ja kaikki muut esineet, joita mukanasi kannat. Myös panssarisi näkyy täällä.{*B*}{*B*} -Liikuta osoitinta painamalla{*CONTROLLER_MENU_NAVIGATE*}. Valitse osoittimen alla oleva esine painamalla{*CONTROLLER_VK_A*}. Jos esineitä on enemmän kuin yksi, voit poimia näin ne kaikki, tai jos painat {*CONTROLLER_VK_X*}, saat poimittua puolet niistä.{*B*}{*B*} -Voit liikuttaa esineen osoittimella tavaraluettelon toiseen kohtaan ja asettaa sen paikoilleen painamalla{*CONTROLLER_VK_A*}. Jos osoittimella on poimittu useita esineitä, voit asettaa ne kaikki painamalla{*CONTROLLER_VK_A*} tai vain yhden niistä painamalla{*CONTROLLER_VK_X*}.{*B*}{*B*} -Jos osoitin on panssarin päällä, näet vinkin, jonka avulla panssarin voi siirtää nopeasti oikeaan panssaripaikkaan tavaraluettelossa. -Nahkapanssarin väriä pystyy muuttamaan värjäämällä sen. Se tapahtuu tavaravalikossa poimimalla väriaineen osoittimella ja painamalla sitten{*CONTROLLER_VK_X*}, kun osoitin on värjättävän esineen yllä. + + Nimeä maailmasi - - {*T3*}PELIOHJE: ARKKU{*ETW*}{*B*}{*B*} -Kun olet valmistanut arkun, voit asettaa sen maailmaan ja käyttää sitä painamalla{*CONTROLLER_ACTION_USE*}. Näin voit tallettaa siihen esineitä tavaraluettelostasi.{*B*}{*B*} -Liikuta osoittimella esineitä tavaraluettelosi ja arkun välillä.{*B*}{*B*} -Arkkuun talletetut esineet saa halutessaan noudettua takaisin tavaraluetteloon. + + Vahingoittunut tallenne - - {*T3*}PELIOHJE: SUURI ARKKU{*ETW*}{*B*}{*B*} -Kaksi vierekkäin asetettua arkkua muodostavat yhden suuren arkun. Siihen mahtuu vielä enemmän esineitä.{*B*}{*B*} -Sitä käytetään samalla tavoin kuin normaalia arkkua. + + OK - - {*T3*}PELIOHJE: VALMISTAMINEN{*ETW*}{*B*}{*B*} -Valmistuskäyttöliittymässä voit yhdistellä tavaraluettelosi esineitä uudenlaisiksi esineiksi. Avaa valmistuskäyttöliittymä painamalla{*CONTROLLER_ACTION_CRAFTING*}.{*B*}{*B*} -Valitse esinetyyppi, jonka haluat valmistaa, selaamalla yläreunan välilehtiä painamalla{*CONTROLLER_VK_LB*} tai{*CONTROLLER_VK_RB*} ja valitse sitten valmistettava esine painamalla{*CONTROLLER_MENU_NAVIGATE*}.{*B*}{*B*} -Valmistusalue näyttää esineet, jotka uuden esineen valmistaminen vaatii. Valmista esine painamalla{*CONTROLLER_VK_A*} ja aseta se tavaraluetteloosi. + + Peru - - {*T3*}PELIOHJE: TYÖPÖYTÄ{*ETW*}{*B*}{*B*} Voit valmistaa suurempia esineitä käyttämällä työpöytää.{*B*}{*B*} Aseta pöytä maailmaan ja käytä sitä painamalla{*CONTROLLER_ACTION_USE*}.{*B*}{*B*} Pöydällä valmistaminen tapahtuu samoin kuin tavallinenkin valmistaminen, mutta valmistusalue on suurempi ja valittavana on isompi valikoima valmistettavia esineitä. + + Minecraft-kauppa - - {*T3*}PELIOHJE: UUNI{*ETW*}{*B*}{*B*} -Uunin avulla saat muutettua esineitä kuumentamalla niitä. Uunilla voit esimerkiksi muuttaa rautamalmia rautaharkoiksi.{*B*}{*B*} -Aseta uuni maailmaan ja käytä sitä painamalla{*CONTROLLER_ACTION_USE*}.{*B*}{*B*} -Sinun täytyy asettaa polttoainetta uunin pohjalle ja kuumennettava esine sen päälle. Tällöin uuni kuumenee ja alkaa toimia.{*B*}{*B*} -Kun esineesi on kuumennettu, voit siirtää sen tuottoalueelta tavaraluetteloosi.{*B*}{*B*} -Jos olet raaka-aineen tai uunin polttoaineen yllä, näet vinkkejä, joiden avulla on nopeaa siirtää sen uuniin. + + Kierrä - - {*T3*}PELIOHJE: JAKELULAITE{*ETW*}{*B*}{*B*} -Jakelulaite heittää ulos esineitä. Sinun on asetettava kytkin, esimerkiksi vipu, jakelulaitteen viereen käyttääksesi sitä.{*B*}{*B*} -Kun haluat täyttää jakelulaitteen esineillä, paina{*CONTROLLER_ACTION_USE*} ja siirrä sitten tavaraluettelostasi jakelulaitteeseen esineet, joita haluat sen jakelevan.{*B*}{*B*} -Kun sitten käytät kytkintä, jakelulaite heittää ulos esineen. + + Piilota - - {*T3*}PELIOHJE: JUOMIEN KEITTÄMINEN{*ETW*}{*B*}{*B*} Juomien keittäminen vaatii keittotelineen, jonka voi valmistaa työpöydällä. Jokainen juoma vaatii ensinnäkin pullon vettä, jonka saa täyttämällä lasipullon vedellä padasta tai vesilähteestä.{*B*} Keittotelineessä on kolme paikkaa pulloille, joten voit tehdä kolme pullollista yhdellä kertaa. Yhdellä raaka-aineella voi valmistaa kaikki kolme pullollista, joten keitä aina kolme juomaa yhdellä kertaa, jotta saat hyödynnettyä resurssisi parhaiten.{*B*} Kun juoman raaka-aineen laittaa keittotelineen yläosaan, perusjuoma valmistuu hetken päästä. Pelkällä perusjuomalla ei ole mitään vaikutusta, mutta toisen raaka-aineen keittäminen tämän perusjuoman kanssa tuottaa juoman, jolla on vaikutus.{*B*} Kun olet valmistanut tämän juoman, voit lisätä kolmannen raaka-aineen, jotta vaikutus kestäisi pidempään (punakivipöly), se olisi vahvempi (hehkukivipöly) tai jotta siitä tulisi haitallinen (pilaantunut hämähäkinsilmä).{*B*} Lisäksi voit lisätä mihin tahansa juomaan ruutia tehdäksesi siitä räjähtävän juoman, jonka pystyy heittämään. Heitetty räjähtävä juoma levittää juoman vaikutuksen alueelle, jolle se laskeutuu.{*B*} Juomien lähderaaka-aineet ovat: {*B*}{*B*} * {*T2*}Hornapahka{*ETW*}{*B*} * {*T2*}Hämähäkinsilmä{*ETW*}{*B*} * {*T2*}Sokeri{*ETW*}{*B*} * {*T2*}Hornanhengen kyynel{*ETW*}{*B*} * {*T2*}Roihujauhe{*ETW*}{*B*} * {*T2*}Magmavoide{*ETW*}{*B*} * {*T2*}Kimalteleva meloni{*ETW*}{*B*} * {*T2*}Punakivipöly{*ETW*}{*B*} * {*T2*}Hehkukivipöly{*ETW*}{*B*} * {*T2*}Pilaantunut hämähäkinsilmä{*ETW*}{*B*}{*B*} Sinun pitää tehdä kokeita erilaisilla raaka-aineiden yhdistelmillä selvittääksesi, millaisia juomia voit valmistaa. + + Tyhjennä kaikki paikat - - {*T3*}PELIOHJE: LUMOAMINEN{*ETW*}{*B*}{*B*} -Kokemuspisteitä, joita voi kerätä olentojen kuoltua tai tiettyjä palikoita louhimalla tai uunissa sulattamalla, voi käyttää joidenkin työkalujen, aseiden, panssareiden ja kirjojen lumoamiseen.{*B*} -Kun miekka, jousi, kirves, hakku, lapio, panssari tai kirja asetetaan lumouspöydässä kirjan alla olevaan paikkaan, kolme painiketta paikan oikealla puolella kertovat joitain lumouksia sekä niiden kokemuspistehinnan.{*B*} -Jos kokemustasosi ei riitä niistä johonkin, sen hinta näkyy punaisena. Muutoin hinta on vihreä.{*B*}{*B*} -Käytettävä lumous määräytyy satunnaisesti näytetyn hinnan perusteella.{*B*}{*B*} -Jos lumouspöytä ympäröidään kirjahyllyillä (enintään 15 kirjahyllyä), ja jokaisen kirjahyllyn ja lumouspöydän välillä on yhden palikan kokoinen rako, lumousten vahvuus kasvaa ja maagiset kirjoitusmerkit leijuvat lumouspöydällä olevasta kirjasta.{*B*}{*B*} -Kaikki lumouspöydän valmistamiseen tarvittavat raaka-aineet löytyvät maailman kylistä, tai louhimalla tai viljelemällä.{*B*}{*B*} -Lumottuja kirjoja käytetään alasimella esineiden lumoamiseen. Näin pystyy vaikuttamaan paremmin siihen, mitä lumouksia esineisiin saa.{*B*} + + Haluatko varmasti poistua nykyisestä pelistäsi ja liittyä uuteen? Kaikki tallentamaton edistyminen menetetään. - - {*T3*}PELIOHJE: ELÄINTEN HOITAMINEN{*ETW*}{*B*}{*B*} -Jos haluat pitää eläimesi yhdessä paikassa, rakenna niitä varten alle 20x20 palikan kokoinen aidattu alue. Se varmistaa, että ne pysyvät tallella sillä välin, kun olet itse muualla. + + Haluatko varmasti korvata tämän maailman edellisen tallenteen tämän maailman nykyisellä versiolla? - - {*T3*}PELIOHJE: ELÄINTEN KASVATTAMINEN{*ETW*}{*B*}{*B*} -Minecraftin eläimet voivat lisääntyä ja tuottaa pikkuversioita itsestään!{*B*} -Jotta saisit eläimet lisääntymään, sinun pitää syöttää niille oikeaa ruokaa, jotta saisit ne "Rakkaustilaan".{*B*} -Syötä vehnää lehmälle, sienilehmälle tai lampaalle; porkkanoita sialle; vehnänjyviä tai hornasyyliä kanalle; tai mitä tahansa lihaa sudelle, niin ne alkavat etsiä läheltään muita saman lajin eläimiä, jotka ovat myös Rakkaustilassa.{*B*} -Kun kaksi saman lajin eläintä tapaa, ja molemmat ovat Rakkaustilassa, ne pussailevat pari sekuntia, minkä jälkeen eläimille syntyy poikanen. Poikanen seuraa jonkin aikaa vanhempiaan, kunnes kasvaa täysikokoiseksi eläimeksi.{*B*} -Eläin ei voi siirtyä uudestaan Rakkaustilaan ennen kuin noin 5 minuutin kuluttua.{*B*} -Maailmaan mahtuvien eläinten määrä on rajallinen, joten jos sinulla on paljon eläimiä, ne eivät ehkä enää lisäänny. + + Haluatko varmasti poistua tallentamatta? Menetät kaiken edistymisen tässä maailmassa! - - {*T3*}PELIOHJE: PORTAALI HORNAAN{*ETW*}{*B*}{*B*} -Portaalilla Hornaan pelaaja voi matkustaa Ylämaailman ja Hornan välillä. Hornan kautta pystyy matkustamaan nopeammin Ylämaailmassa. Yhden palikan matkustaminen Hornassa vastaa 3 palikkaa Ylämaailmassa, joten rakentamalla portaalin Hornaan ja astumalla sen läpi pääset 3 kertaa kauemmaksi lähtöpisteestäsi.{*B*}{*B*} -Portaalin rakentamiseen vaaditaan vähintään 10 laavakivipalikkaa, ja portaalin on oltava 5 palikan korkuinen, 4 palikan levyinen ja 1 palikan syvyinen. Kun portaalin kehys on rakennettu, kehyksen sisäinen tila on sytytettävä tuleen portaalin aktivoimiseksi. Sen voi tehdä tuluksilla tai tulilatauksella.{*B*}{*B*} -Oikealla näkyy esimerkkejä portaalin rakentamisesta. + + Aloita peli - - {*T3*}PELIOHJE: KENTTIEN KIELTÄMINEN{*ETW*}{*B*}{*B*} -Jos löydät loukkaavaa sisältöä pelaamastasi kentästä, voit asettaa sen Kiellettyjen kenttien listallesi. -Jos haluat tehdä niin, avaa taukovalikko ja paina sitten{*CONTROLLER_VK_RB*} valitaksesi Kiellä kenttä -vinkin. -Jos yrität myöhemmin pelata tätä kenttää, saat viestin, että kenttä on Kiellettyjen kenttien listallasi. Silloin voit joko poistaa sen listalta ja jatkaa pelaamista, tai poistua. + + Poistu pelistä - - {*T3*}PELIOHJE: ISTUNNON JÄRJESTÄJÄN JA PELAAJAN ASETUKSET{*ETW*}{*B*}{*B*} - -{*T1*}Peliasetukset{*ETW*}{*B*} -Kun lataat tai luot maailmaa, voit painaa "Lisäasetukset"-painiketta, niin voit hallita peliäsi tarkemmin.{*B*}{*B*} - -{*T2*}Pelaaja vastaan pelaaja{*ETW*}{*B*} -Kun tämä asetus on käytössä, pelaajat voivat aiheuttaa vahinkoa toisille pelaajille. Asetus vaikuttaa vain Selviytymistilassa.{*B*}{*B*} - -{*T2*}Luota pelaajiin{*ETW*}{*B*} -Kun tämä asetus on poissa käytöstä, peliin liittyvien pelaajien tekemisiä on rajoitettu. He eivät voi louhia tai käyttää esineitä, asettaa palikoita, käyttää ovia ja kytkimiä, käyttää säilytysastioita eivätkä hyökätä pelaajien tai eläinten kimppuun. Voit muuttaa näitä asetuksia yksittäiselle pelaajalle pelinsisäisen valikon kautta.{*B*}{*B*} - -{*T2*}Tuli leviää{*ETW*}{*B*} -Kun tämä asetus on käytössä, tuli saattaa levitä läheisiin tulenarkoihin palikoihin. Tätä asetusta voi muuttaa myös pelin aikana.{*B*}{*B*} - -{*T2*}Dynamiitti räjähtää{*ETW*}{*B*} -Kun tämä asetus on käytössä, dynamiitti räjähtää aktivoitaessa. Tätä asetusta voi muuttaa myös pelin aikana.{*B*}{*B*} - -{*T2*}Pelin järjestäjän oikeudet{*ETW*}{*B*} -Kun tämä asetus on käytössä, istunnon järjestäjä voi pelinsisäisestä valikosta ottaa käyttöön tai poistaa käytöstä lentokyvyn, hengästymisen ja näkymättömyyden. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} - -{*T1*}Maailman luomisen asetukset{*ETW*}{*B*} -Uutta maailmaa luodessa käytettävissä on muutamia lisäasetuksia.{*B*}{*B*} - -{*T2*}Luo rakennelmia{*ETW*}{*B*} -Kun tämä asetus on käytössä, maailmaan luodaan rakennelmia, kuten kyliä ja linnakkeita.{*B*}{*B*} - -{*T2*}Täysin tasainen maailma{*ETW*}{*B*} -Kun tämä asetus on käytössä, Ylämaailmaan ja Hornaan luodaan täysin tasainen maailma.{*B*}{*B*} - -{*T2*}Bonusarkku{*ETW*}{*B*} -Kun tämä asetus on käytössä, lähelle pelaajan syntypistettä luodaan arkku, joka sisältää muutamia hyödyllisiä esineitä.{*B*}{*B*} - -{*T2*}Nollaa Horna{*ETW*}{*B*} -Kun tämä on käytössä, Horna luodaan uudelleen. Tästä on hyötyä, jos pelaat vanhempaa tallennetta, missä Hornan linnoituksia ei ollut.{*B*}{*B*} - -{*T1*}Pelinsisäiset asetukset{*ETW*}{*B*} -Pelin aikana pystyy muuttamaan useita asetuksia painamalla {*BACK_BUTTON*}, joka avaa pelinsisäisen valikon.{*B*}{*B*} - -{*T1*}Istunnon järjestäjän asetukset{*ETW*}{*B*} -Istunnon järjestävä pelaaja sekä kaikki moderaattoreiksi nimetyt pelaajat saavat käyttää "Istunnon järjestäjän asetukset" -valikkoa. Tästä valikosta voi muuttaa tulen leviämisen ja dynamiitin räjähtämisen asetuksia.{*B*}{*B*} - -{*T1*}Pelaajan asetukset{*ETW*}{*B*} -Kun haluat muokata pelaajan oikeuksia, valitse hänen nimensä ja avaa pelaajan oikeusvalikko painamalla{*CONTROLLER_VK_A*}. Siitä voit muuttaa seuraavia asetuksia.{*B*}{*B*} - -{*T2*}Saa rakentaa ja louhia{*ETW*}{*B*} -Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus on käytössä, pelaaja voi toimia maailmassa normaalisti. Kun asetus ei ole käytössä, pelaaja ei voi asettaa tai tuhota palikoita eikä käyttää useita esineitä ja palikoita.{*B*}{*B*} - -{*T2*}Saa käyttää ovia ja kytkimiä{*ETW*}{*B*} -Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus ei ole käytössä, pelaaja ei voi käyttää ovia tai kytkimiä.{*B*}{*B*} - -{*T2*}Saa avata säilytysastioita{*ETW*}{*B*} -Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus ei ole käytössä, pelaaja ei voi avata säilytysastioita, kuten arkkuja.{*B*}{*B*} - -{*T2*}Saa hyökätä pelaajien kimppuun{*ETW*}{*B*} -Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus ei ole käytössä, pelaaja ei pysty vahingoittamaan muita pelaajia.{*B*}{*B*} - -{*T2*}Saa hyökätä eläinten kimppuun{*ETW*}{*B*} -Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus ei ole käytössä, pelaaja ei pysty vahingoittamaan eläimiä.{*B*}{*B*} - -{*T2*}Moderaattori{*ETW*}{*B*} -Kun tämä asetus on käytössä ja "Luota pelaajiin" ei ole käytössä, pelaaja voi muuttaa muiden pelaajien (paitsi istunnon järjestäjän) oikeuksia, potkaista pelaajia pois pelistä sekä muuttaa tulen leviämisen ja dynamiitin räjähtämisen asetuksia.{*B*}{*B*} - -{*T2*}Potkaise pelaaja{*ETW*}{*B*} -{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - -{*T1*}Istunnon järjestävän pelaajan asetukset{*ETW*}{*B*} -Jos "Istunnon järjestäjän oikeudet" ovat käytössä, istunnon järjestävä pelaaja voi muuttaa joitain oikeuksia itse. Kun haluat muokata pelaajan oikeuksia, valitse hänen nimensä ja avaa pelaajan oikeusvalikko painamalla{*CONTROLLER_VK_A*}. Siitä voit muuttaa seuraavia asetuksia.{*B*}{*B*} - -{*T2*}Saa lentää{*ETW*}{*B*} -Kun tämä asetus on käytössä, pelaaja voi lentää. Tämä asetus on oleellinen ainoastaan Selviytymistilassa, koska kaikki pelaajat saavat lentää Luovassa tilassa.{*B*}{*B*} - -{*T2*}Väsyminen pois päältä{*ETW*}{*B*} -Tämä asetus vaikuttaa vain Selviytymistilassa. Kun se on käytössä, fyysiset toiminnat (käveleminen/juokseminen/hyppääminen, jne.) eivät kuluta ruokapalkkia. Jos pelaaja kuitenkin vahingoittuu, ruokapalkki kuluu hiljalleen, kun pelaaja paranee.{*B*}{*B*} - -{*T2*}Näkymätön{*ETW*}{*B*} -Kun tämä asetus on käytössä, pelaaja on haavoittumaton sekä näkymätön toisille pelaajille.{*B*}{*B*} - -{*T2*}Saa teleportata{*ETW*}{*B*} -Tämän avulla pelaaja voi siirtää toisia pelaajia tai itsensä muiden maailmassa olevien pelaajien luo. - + + Tallenna peli - - Seuraava sivu + + Poistu tallentamatta - - Edellinen sivu + + Liity peliin painamalla START - - Perusteet + + Hurraa – olet saanut palkinnoksi pelaajakuvan Minecraftin Stevestä! - - HUD-näyttö + + Hurraa – olet saanut palkinnoksi pelaajakuvan lurkista! - - Tavaraluettelo + + Avaa koko peli - - Arkut + + Et voi liittyä tähän peliin, koska pelaaja, jonka peliin yrität liittyä, käyttää pelin uudempaa versiota. - - Valmistaminen + + Uusi maailma - - Uuni + + Palkinto avattu! - - Jakelulaite + + Pelaat pelin koeversiota, mutta tarvitset koko pelin, jos haluat tallentaa pelisi. +Haluatko nyt avata koko pelin? - - Eläinten hoitaminen + + Kaverit - - Eläinten kasvattaminen + + Pisteeni - - Juomien keittäminen + + Yhteensä - - Lumoaminen + + Ole hyvä ja odota - - Portaali Hornaan + + Ei tuloksia - - Moninpeli - - - Näyttökuvien jakaminen + + Suodin: - - Kenttien kieltäminen + + Et voi liittyä tähän peliin, koska pelaaja, jonka peliin yrität liittyä, käyttää pelin vanhempaa versiota. - - Luova tila + + Yhteys katkesi - - Järjestäjän ja pelaajan asetukset + + Yhteys palvelimelle katkesi. Poistutaan päävalikkoon. - - Kaupankäynti + + Palvelin katkaisi yhteyden - - Alasin + + Poistutaan pelistä - - Ääri + + On tapahtunut virhe. Poistutaan päävalikkoon. - - {*T3*}PELIOHJE: ÄÄRI{*ETW*}{*B*}{*B*} -Ääri on pelin toinen ulottuvuus, jonne pääsee aktiivisen ääriportaalin kautta. Ääriportaali löytyy linnakkeesta, joka on syvällä maan alla Ylämaailmassa.{*B*} -Ääriportaalin aktivoimiseksi sinun pitää asettaa ääreläisen silmä jokaiseen ääriportaalin kehyksen kohtaan, jossa sellaista ei vielä ole.{*B*} -Kun portaali on aktiivinen, hyppää sen läpi päästäksesi Ääreen.{*B*}{*B*} -Lopussa tapaat ääriliskon, hurjan ja voimakkaan vihollisen, sekä monia ääreläisiä, joten sinun on oltava varautunut taisteluun ennen kuin menet sinne!{*B*}{*B*} -Kahdeksan laavakivipiikin kärjessä on äärikristallit, joilla äärilisko parantaa itseään, joten taistelun ensimmäinen askel on tuhota niistä jokainen.{*B*} -Pari ensimmäistä voi ampua nuolilla, mutta muut ovat rautahäkin suojaamia, ja niiden luo on rakennettava reitti.{*B*}{*B*} -Sillä välin äärilisko hyökkäilee kimppuusi lentäen ja sylkien äärihappopalloja!{*B*} -Jos lähestyt munakoroketta piikkien keskellä, äärilisko lentää alas luoksesi, jolloin voit tehdä sille kunnolla vahinkoa!{*B*} -Väistele happohenkäyksiä ja tähtää ääriliskon silmiin tehdäksesi mahdollisimman pahaa tuhoa. Mikäli mahdollista, ota ystäviä mukaan Ääreen avuksesi taisteluun.{*B*}{*B*} -Kun olet Ääressä, ystäväsi voivat nähdä kartallaan Ääriportaalin sijainnin linnakkeessa, joten he löytävät luoksesi helposti. + + Yhteyden luominen epäonnistui - - Juokseminen + + Sinut potkaistiin pelistä - - Uutta + + Istunnon järjestäjä on poistunut pelistä. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Muutokset ja lisäykset{*ETW*}{*B*}{*B*} -- Lisätty uusia esineitä – Smaragdi, smaragdimalmi, smaragdipalikka, äärenarkku, ansakoukku, lumottu kultainen omena, alasin, kukkaruukku, mukulakiviseinät, sammaleiset mukulakiviseinät, näivettäjämaalaus, peruna, paistettu peruna, myrkyllinen peruna, porkkana, kultainen porkkana, porkkanakeppi, -kurpitsapiirakka, yönäköjuoma, näkymättömyysjuoma, hornakvartsi, hornakvartsimalmi, kvartsipalikka, kvartsilaatta, kvartsiportaat, veistetty kvartsipalikka, kvartsipalikkapylväs, lumottu kirja, matto.{*B*} -- Lisätty uusia reseptejä sileälle hiekkakivelle ja veistetylle hiekkakivelle.{*B*} -- Lisätty uusia olentoja – Zombikyläläiset.{*B*} -- Lisätty uusia maastonluontiominaisuuksia – Aavikkotemppelit, aavikkokylät, viidakkotemppelit.{*B*} -- Lisätty kaupankäynti kyläläisten kanssa.{*B*} -- Lisätty alasinvalikko.{*B*} -- Nahkapanssarin värjääminen on tehty mahdolliseksi.{*B*} -- Susien kaulapantojen värjääminen on tehty mahdolliseksi.{*B*} -- Sian ohjaaminen on tehty mahdolliseksi porkkanakepillä.{*B*} -- Päivitetty bonusarkun sisältöä uusilla esineillä.{*B*} -- Muutettu puolikkaiden palikoiden ja muiden palikoiden asettamista puolikkaiden palikoiden päälle.{*B*} -- Muutettu ylösalaisten portaiden ja laattojen asettamista.{*B*} -- Lisätty erilaisia ammatteja kyläläisille.{*B*} -- Luomismunasta syntyneillä kyläläisillä on sattumanvarainen ammatti.{*B*} -- Lisätty sivuttainen tukin asettaminen.{*B*} -- Uunissa voi käyttää puisia työkaluja polttoaineena.{*B*} -- Jää ja lasiruutuja voi kerätä työkaluilla, joissa on silkinpehmeä kosketus -lumous.{*B*} -- Puiset näppäimet ja puiset painelaatat voi aktivoida nuolilla.{*B*} -- Hornan olentoja voi syntyä Ylämaailmaan portaaleista.{*B*} -- Lurkit ja hämähäkit ovat aggressiivisia sitä pelaajaa kohtaan, joka viimeksi niitä löi.{*B*} -- Luovassa tilassa olennoista tulee uudestaan neutraaleja vähän ajan jälkeen.{*B*} -- Poistettu tönäisy hukkuessa.{*B*} -- Ovissa, joita zombit rikkovat, näkyy aiheutettu vahinko.{*B*} -- Jää sulaa Hornassa.{*B*} -- Padat täyttyvät ulkona sateella.{*B*} -- Mäntien päivittäminen vie kaksi kertaa kauemmin.{*B*} -- Siat tiputtavat satulan kuollessaan (jos sillä on sellainen).{*B*} -- Äären taivaan väriä on muutettu.{*B*} -- Siimaa voi asettaa (ansalankoihin).{*B*} -- Sade tihkuu lehtien läpi.{*B*} -- Vipuja voi asettaa palikoiden pohjaan.{*B*} -- Dynamiitti tekee eri määrän vahinkoa riippuen pelin vaikeustasosta.{*B*} -- Kirjan reseptiä on muutettu.{*B*} -- Veneet rikkovat lumpeenlehtiä sen sijaan että lumpeenlehdet rikkoisivat veneitä.{*B*} -- Siat tiputtavat enemmän kyljyksiä.{*B*} -- Limoja syntyy vähemmän supertasaisissa maailmoissa.{*B*} -- Lurkkien tekemä vahinko vaihtelee pelin vaikeustason mukaan, tönäisee enemmän.{*B*} -- Korjattu vika, missä ääreläiset eivät avanneet suutaan.{*B*} -- Lisätty pelaajien teleporttaaminen (käyttäen {*BACK_BUTTON*}-valikkoa pelin aikana).{*B*} -- Lisätty uusia järjestäjän asetuksia koskien etäpelaajien lentämistä, näkymättömyyttä ja haavoittumattomuutta.{*B*} -- Lisätty Opetusmaailmaan opetuspelejä uusia esineitä ja toimintoja varten.{*B*} -- Päivitetty musiikkilevyarkkujen sijainnit Opetusmaailmassa.{*B*} - + + Et voi liittyä tähän peliin, koska et ole kenenkään siinä pelaavan kaveri. - - {*ETB*}Tervetuloa takaisin! Et ehkä ole huomannut, mutta Minecraftisi on juuri päivitetty.{*B*}{*B*} -Sinun ja ystäviesi iloksi on paljon uusia ominaisuuksia ja tässä on niistä vain muutamia kohokohtia. Lukaisepa ne läpi ja mene pitämään hauskaa!{*B*}{*B*} -{*T1*}Uudet esineet{*ETB*} – Smaragdi, smaragdimalmi, smaragdipalikka, äärenarkku, ansakoukku, lumottu kultainen omena, alasin, kukkaruukku, mukulakiviseinät, sammaleiset mukulakiviseinät, näivettäjämaalaus, peruna, paistettu peruna, myrkyllinen peruna, porkkana, kultainen porkkana, porkkanakeppi, -kurpitsapiirakka, yönäköjuoma, näkymättömyysjuoma, hornakvartsi, hornakvartsimalmi, kvartsipalikka, kvartsilaatta, kvartsiportaat, veistetty kvartsipalikka, kvartsipalikkapylväs, lumottu kirja, matto.{*B*}{*B*} -{*T1*}Uudet olennot{*ETB*} – Zombikyläläiset.{*B*}{*B*} -{*T1*}Uusia toimintoja{*ETB*} – Käy kauppaa kyläläisten kanssa, korjaa tai lumia aseita ja työkaluja alasimella, talleta esineitä äärenarkkuun, ohjaa ratsastamaasi sikaa porkkanakepillä!{*B*}{*B*} -{*T1*}Uusia miniopetuspelejä{*ETB*} – Opettele käyttämään uusia ominaisuuksia Opetusmaailmassa!{*B*}{*B*} -{*T1*}Uusia "Piiloherkkuja"{*ETB*} – Olemme siirtäneet kaikki Opetusmaailman musiikkilevyt. Katso, pystytkö löytämään ne uudestaan!{*B*}{*B*} - + + Et voi liittyä tähän peliin, koska istunnon järjestäjä on aiemmin potkaissut sinut pois. - - Tekee enemmän vahinkoa kuin pelkkä käsi. + + Sinut potkaistiin pelistä lentämisen takia - - Käytetään kaivamaan maata, ruohoa, hiekkaa, soraa ja lunta nopeammin kuin paljain käsin. Lumipallojen kaivamiseen tarvitaan lapio. + + Yhteyden muodostaminen kesti liian pitkään - - Vaaditaan kivipalikoiden ja malmin louhimiseen. + + Palvelin on täynnä - - Käytetään puupalikoiden hakkaamiseen nopeammin kuin paljain käsin. + + Tällä vaikeustasolla ympäristöön syntyy hirviöitä ja ne tekevät paljon vahinkoa pelaajaan. Varo myös lurkkeja, koska ne eivät yleensä peru räjähdyshyökkäystään, vaikka siirtyisit kauemmas niistä! - - Käytetään kääntämään maa- ja ruohopalikoita maanviljelyä varten. + + Teemat - - Puiset ovet avataan käyttämällä niitä, lyömällä niitä tai punakivellä. + + Ulkoasupaketit - - Rautaovet voi avata vain punakivellä, näppäimillä tai kytkimillä. + + Salli kaverien kaverit - - EI KÄYTÖSSÄ + + Potkaise pelaaja - - EI KÄYTÖSSÄ + + Haluatko varmasti potkaista tämän pelaajan pelistä? Hän ei pääse liittymään takaisin ennen kuin aloitat maailman uudestaan. - - EI KÄYTÖSSÄ + + Pelaajakuvapaketit - - EI KÄYTÖSSÄ + + Et voi liittyä tähän peliin, koska se on rajoitettu istunnon järjestäjän kavereille. - - Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. + + Ladattava sisältö on vioittunut - - Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. + + Tämä ladattava sisältö on vioittunut eikä sitä voi käyttää. Sinun pitää poistaa se ja asentaa se sitten uudestaan Minecraft-kaupan valikosta. - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + Jotkin ladattavista sisällöistäsi ovat vioittuneet eikä niitä voi käyttää. Sinun pitää poistaa ne ja asentaa ne sitten uudestaan Minecraft-kaupan valikosta. - - Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. + + Et voi liittyä peliin - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + Valittu - - Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. + + Valittu ulkoasu: - - Antaa käyttäjälle 4 panssaria, kun sen pukee päälle. + + Hanki täysi versio - - Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. + + Avaa tekstuuripaketti - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + Jotta voisit käyttää tätä tekstuuripakettia, sinun pitää avata se. +Haluatko avata sen nyt? - - Antaa käyttäjälle 6 panssaria, kun sen pukee päälle. + + Tekstuurikoepaketti - - Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. + + Siemen - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + Avaa ulkoasupaketti - - Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. + + Jos haluat käyttää valitsemaasi ulkoasua, sinun pitää avata tämä paketti. +Haluaisitko avata tämän ulkoasupaketin nyt? - - Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. + + Käytät tekstuuripaketin koeversiota. Et pysty tallentamaan tätä maailmaa, ellet avaa täyttä versiota. +Haluatko avata tekstuuripaketin täyden version? - - Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. + + Lataa täysi versio - - Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. + + Tämä maailma käyttää yhdistelmäpakettia tai tekstuuripakettia, jota sinulla ei ole! +Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? - - Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. + + Hanki koeversio - - Antaa käyttäjälle 8 panssaria, kun sen pukee päälle. + + Tekstuuripakettia ei löytynyt - - Antaa käyttäjälle 6 panssaria, kun sen pukee päälle. + + Avaa täysi versio - - Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. + + Lataa koeversio - - Kiiltävä harkko, josta voi tehdä tästä materiaalista valmistettuja työkaluja. Valmistetaan sulattamalla malmia uunissa. + + Pelitilasi on muuttunut - - Mahdollistaa harkkojen, jalokivien tai väriaineiden valmistamisen asetettaviksi palikoiksi. Voidaan käyttää kalliina rakennuspalikkana tai kätevänä malmivarastona. + + Kun tämä on valittuna, vain kutsutut pelaajat saavat liittyä. - - Käytetään lähettämään sähkönpurkaus, kun sen päälle astuu pelaaja, eläin tai hirviö. Puiset painelaatat voi aktivoida myös pudottamalla niille jotain. - + + Kun tämä on valittuna, kaveriluettelossasi olevien henkilöiden kaverit saavat liittyä peliin. - - Käytetään kätevien portaiden tekemiseen. + + Kun tämä on käytössä, pelaajat voivat aiheuttaa vahinkoa toisille pelaajille. Toimii vain Selviytymistilassa. - - Käytetään pitkien portaiden rakentamiseen. Kaksi päällekkäin asetettua laattaa luo normaalikokoisen kahden laatan palikan. + + Tavallinen - - Käytetään pitkien portaiden tekemiseen. Kaksi päällekkäin asetettua laattaa muodostavat normaalikokoisen kahden laatan palikan. + + Täysin tasainen - - Käytetään luomaan valoa. Soihdut myös sulattavat lunta ja jäätä. + + Kun tämä on valittuna, peli pelataan verkossa. - - Käytetään rakennusmateriaalina ja niistä voi valmistaa monia asioita. Voidaan valmistaa minkälaisesta puusta tahansa. + + Kun tämä ei ole käytössä, peliin liittyvät pelaajat eivät voi rakentaa tai louhia ilman lupaa. - - Käytetään rakennusmateriaalina. Painovoima ei vaikuta siihen niin kuin normaaliin hiekkaan. + + Kun tämä on käytössä, maailmaan luodaan rakennelmia, kuten kyliä ja linnakkeita. - - Käytetään rakennusmateriaalina. + + Kun tämä on käytössä, Ylämaailmaan ja Hornaan luodaan täysin tasainen maailma. - - Käytetään soihtujen, nuolten, kylttien, tikapuiden, aitojen sekä työkalujen ja aseiden kädensijojen valmistamiseen. + + Kun tämä on käytössä, lähelle pelaajan syntypistettä luodaan arkku, joka sisältää muutamia hyödyllisiä esineitä. - - Käytetään edistämään aikaa mistä tahansa öisestä ajankohdasta aamuun, jos kaikki maailman pelaajat ovat sängyssä. Sillä myös muutetaan pelaajan syntypistettä. -Sängyn värit ovat aina samat käytetyn villan väristä riippumatta. + + Kun tämä on käytössä, tuli saattaa levitä läheisiin tulenarkoihin palikoihin. - - Sallii sinun valmistaa suuremman valikoiman esineitä kuin normaali valmistaminen. + + Kun tämä on käytössä, dynamiitti räjähtää aktivoitaessa. - - Sallii sinun sulattaa malmia, valmistaa puuhiiltä ja lasia, sekä paistaa kaloja ja porsaankyljyksiä. + + Kun tämä on käytössä, Horna luodaan uudelleen. Tästä on hyötyä, jos pelaat vanhempaa tallennetta, missä Hornan linnoituksia ei ollut. - - Sen sisään voi varastoida palikoita ja esineitä. Kahden arkun asettaminen rinnakkain luo suuremman arkun, joka kaksinkertaistaa varastotilan. + + Pois - - Käytetään esteenä, jonka yli ei voi hypätä. Lasketaan 1,5 palikan korkuiseksi pelaajia, eläimiä ja hirviöitä ajatellen, mutta 1 palikan korkuiseksi muita palikoita ajatellen. - + + Pelitila: Luova - - Käytetään pystysuoraan kiipeämiseen. + + Selviytyminen - - Avataan käyttämällä niitä, lyömällä niitä tai punakivellä. Ne toimivat kuten normaalit ovet, mutta ovat 1x1 palikan kokoisia ja asetetaan maata vasten. + + Luova - - Näyttää sinun tai muiden pelaajien kirjoittaman tekstin. + + Nimeä maailmasi uudelleen - - Käytetään luomaan soihtuja kirkkaampaa valoa. Sulattaa lunta/jäätä ja sitä voi käyttää veden alla. + + Kirjoita uusi nimi maailmallesi - - Käytetään aiheuttamaan räjähdyksiä. Aktivoidaan asettamisen jälkeen sytyttämällä se tuluksilla tai sähkönpurkauksella. + + Pelitila: Selviytyminen - - Käytetään astiana sienimuhennokselle. Voit pitää kulhon, kun muhennos on syöty. + + Luotu Selviytymistilassa - - Käytetään varastoimaan ja kuljettamaan vettä, laavaa ja maitoa. + + Nimeä tallenne uudelleen - - Käytetään varastoimaan ja kuljettamaan vettä. + + Automaattitallennus: %d... - - Käytetään varastoimaan ja kuljettamaan laavaa. + + Päällä - - Käytetään varastoimaan ja kuljettamaan maitoa. + + Luotu Luovassa tilassa - - Käytetään luomaan tulta, sytyttämään dynamiitin ja avaamaan portaalin, kun se on ensin luotu. + + Renderoi pilvet - - Käytetään kalastamiseen. + + Mitä haluat tehdä tälle pelitallenteelle? - - Näyttää auringon ja kuun aseman. + + HUD-näytön koko (jaettu näyttö) - - Osoittaa aloituspisteeseesi. + + Raaka-aine - - Luo kuvan tutkitusta alueesta, kun sitä pitää kädessä. Sitä voi hyödyntää reittiä etsiessä. + + Polttoaine - - Mahdollistaa hyökkäykset matkan päästä nuolilla. + + Jakelulaite - - Käytetään jousen ammuksina. + + Arkku - - Palauttaa 2,5{*ICON_SHANK_01*}. + + Lumoa - - Palauttaa 1{*ICON_SHANK_01*}. Voidaan käyttää 6 kertaa. + + Uuni - - Palauttaa 1{*ICON_SHANK_01*}. + + Tämän tyyppistä ladattavaa sisältöä ei ole juuri nyt saatavilla tälle pelille. - - Palauttaa 1{*ICON_SHANK_01*}. + + Haluatko varmasti poistaa tämän pelitallenteen? - - Palauttaa 3{*ICON_SHANK_01*}. + + Odottaa hyväksyntää - - Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Tämän syöminen saattaa myrkyttää sinut. + + Sensuroitu - - Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan paistamalla raaka kana uunissa. + + %s on liittynyt peliin. - - Palauttaa 1,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. + + %s on poistunut pelistä. - - Palauttaa 4{*ICON_SHANK_01*}. + + %s potkaistiin pelistä. - - Palauttaa 1,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. + + Keittoteline - - Palauttaa 4{*ICON_SHANK_01*}. Valmistetaan paistamalla porsaankyljys uunissa. + + Kirjoita kyltin teksti - - Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan syöttää oselotille, jotta se kesyyntyisi. + + Kirjoita teksti kylttiisi - - Palauttaa 2,5{*ICON_SHANK_01*}. Valmistetaan paistamalla raakaa kalaa uunissa. + + Kirjoita otsikko - - Palauttaa 2{*ICON_SHANK_01*}, ja siitä voi valmistaa kultaisen omenan. + + Koepeli on päättynyt - - Palauttaa 2{*ICON_SHANK_01*}, ja parantaa elinvoimaa 4 sekunnin ajan. Valmistetaan omenasta ja kultahipuista. + + Peli on täynnä - - Palauttaa 2{*ICON_SHANK_01*}. Sen syöminen saattaa myrkyttää sinut. + + Ei voitu liittyä peliin, koska tilaa ei ole - - Käytetään kakkureseptissä sekä taikajuomien raaka-aineena. + + Kirjoita viestisi otsikko - - Käytetään lähettämään sähkönpurkaus kääntämällä vipu päälle tai pois. Pysyy päällä tai pois päältä, kunnes sitä käännetään taas. + + Kirjoita viestisi kuvaus - - Lähettää jatkuvasti sähkönpurkausta, tai sitä voidaan käyttää lähetin/vastaanottimena, kun se on kytketty palikan kylkeen. -Voidaan myös käyttää matalan tason salaman luomiseen. + + Tavaraluettelo - - Käytetään punakivipiireissä toistimena, viivyttimenä ja/tai diodina. + + Raaka-aineet - - Käytetään lähettämään sähkönpurkaus painettaessa. Pysyy aktiivisena noin sekunnin ajan ennen kuin se sammuu taas. + + Kirjoita kuvateksti - - Käytetään varastoimaan ja heittämään ulos esineitä satunnaisessa järjestyksessä, kun se saa punakivilatauksen. + + Kirjoita viestisi kuvateksti - - Soittaa sävelen aktivoitaessa. Iske sitä muuttaaksesi sävelkorkeutta. Tämän asettaminen eri palikoiden päälle muuttaa soittimen tyyppiä. + + Kirjoita kuvaus - - Käytetään kaivoskärryjen ohjaamiseen. + + Tällä hetkellä soi: - - Kiihdyttää sen yli ajavia kaivoskärryjä saadessaan virtaa. Pysäyttää yli ajavat kaivoskärryt, kun ei saa virtaa. + + Haluatko varmasti lisätä tämän kentän kiellettyjen kenttien luetteloosi? +Jos valitset OK, poistut samalla tästä pelistä. - - Toimii kuin painelaatta (lähettää punakivisignaalin saadessaan virtaa), mutta sen voi aktivoida vain kaivoskärryllä. + + Poista Kiellettyjen luettelosta - - Käytetään kuljettamaan sinua, eläintä tai hirviötä raiteita pitkin. + + Automaattitallennuksen väli - - Käytetään kuljettamaan tavaroita raiteita pitkin. + + Kielletty kenttä - - Kulkee raiteita pitkin ja voi työntää muita kaivoskärryjä, jos siihen laitetaan kivihiiltä. + + Peli, johon olet liittymässä, on kiellettyjen kenttien luettelossasi. +Jos päätät liittyä tähän peliin, kenttä poistetaan kiellettyjen kenttien luettelostasi. - - Käytetään kun tahdotaan matkustaa vedessä nopeammin kuin uimalla. + + Kielletäänkö tämä kenttä? - - Kerätään lampaista ja voidaan värjätä väriaineilla. + + Automaattitallennuksen väli: POIS - - Käytetään rakennusmateriaalina ja voidaan värjätä väriaineilla. Tätä reseptiä ei suositella, koska villaa saa helposti lampaista. + + Käyttöliittymän läpinäkymättömyys - - Käytetään villan värjäämiseen mustaksi. + + Valmistaudutaan kentän automaattitallennukseen - - Käytetään villan värjäämiseen vihreäksi. + + HUD-näytön koko - - Käytetään väriaineena ruskean villan värjäämisessä, keksien raaka-aineena tai kaakaopalkojen kasvattamisessa. + + minuuttia - - Käytetään villan värjäämiseen hopeanväriseksi. + + Ei voida asettaa tähän! - - Käytetään villan värjäämiseen keltaiseksi. + + Laavan asettamista lähelle kentän syntypistettä ei sallita, koska muutoin pelaajat saattavat kuolla heti synnyttyään uudestaan. - - Käytetään villan värjäämiseen punaiseksi. + + Suosikkiulkoasut - - Käytetään kasvattamaan välittömästi viljelyskasveja, puita, korkeaa ruohoa, valtavia sieniä sekä kukkia, ja voidaan käyttää väriaineresepteissä. + + Pelaajan %s peli - - Käytetään villan värjäämiseen pinkiksi. + + Tuntemattoman istunnon järjestäjän peli - - Käytetään villan värjäämiseen oranssiksi. + + Vieras on kirjautunut ulos - - Käytetään villan värjäämiseen limenvihreäksi. + + Nollaa asetukset - - Käytetään villan värjäämiseen harmaaksi. + + Haluatko varmasti nollata asetuksesi niiden oletusarvoihin? - - Käytetään villan värjäämiseen vaaleanharmaaksi. -(Huomaa: vaaleanharmaata väriainetta voidaan valmistaa myös yhdistämällä harmaata väriainetta luujauhoon, jolloin saadaan aikaan kolmen sijasta neljä vaaleanharmaata väriainetta jokaista mustepussia kohden.) + + Latausvirhe - - Käytetään villan värjäämiseen vaaleansiniseksi. + + Vieraileva pelaaja on kirjautunut ulos, minkä johdosta kaikki vierailevat pelaajat poistettiin pelistä. - - Käytetään villan värjäämiseen sinivihreäksi. + + Pelin luominen ei onnistunut - - Käytetään villan värjäämiseen violetiksi. + + Automaattisesti valittu - - Käytetään villan värjäämiseen magentaksi. + + Ei pakettia: oletusulkoasut - - Käytetään villan värjäämiseen siniseksi. + + Kirjaudu - - Soittaa musiikkilevyjä. + + Et ole kirjautunut. Sinun pitää olla kirjautunut pelataksesi tätä peliä. Haluatko kirjautua nyt? - - Valmista näistä erittäin kestäviä työkaluja, aseita tai panssareita. + + Moninpeli ei ole sallittu - - Käytetään luomaan soihtuja kirkkaampaa valoa. Sulattaa lunta/jäätä ja sitä voi käyttää veden alla. + + Juo - - Käytetään kirjojen ja karttojen valmistamiseen. + + + Tälle alueelle on perustettu maatila. Viljelemällä maata saat luotua uudistuvan lähteen ruualle ja muille esineille. - - Voidaan käyttää kirjahyllyjen valmistamiseen. Lumoamalla siitä saa valmistettua lumottuja kirjoja. + + + {*B*} + Opettele lisää maanviljelystä{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi maanviljelystä, paina{*CONTROLLER_VK_B*}. - - Mahdollistaa voimakkaampien lumousten luomisen, kun niitä asettaa lumouspöydän ympärille. + + Siemenistä kasvatetaan vehnää, kurpitsoja ja meloneja. Vehnänsiemeniä kerätään rikkomalla korkeaa ruohoa tai keräämällä vehnää, ja kurpitsan- ja meloninsiemeniä valmistetaan kurpitsoista ja meloneista. - - Käytetään koristeena. + + Avaa luova valmistusvalikko painamalla{*CONTROLLER_ACTION_CRAFTING*}. - - Voidaan louhia rautaisella tai sitä paremmalla hakulla, ja sulattaa sitten uunissa kultaharkoiksi. + + Mene tämän aukon vastakkaiselle puolelle jatkaaksesi. - - Voidaan louhia kivisellä tai sitä paremmalla hakulla, ja sulattaa sitten uunissa rautaharkoiksi. + + Nyt olet suorittanut Luovan tilan opetuspelin. - - Voidaan louhia hakulla kivihiilen keräämiseksi. + + Ennen siementen istuttamista maapalikat on muutettava viljelysmaaksi kuokkaa käyttämällä. Läheinen vedenlähde auttaa pitämään viljelysmaan kosteana, mikä saa sadon kasvamaan nopeammin, samoin kuin riittävä valaistus. - - Voidaan louhia kivisellä tai sitä paremmalla hakulla lasuriitin keräämiseksi. + + Kaktukset on istutettava hiekalle, ja ne kasvavat kolmen palikan korkuisiksi. Kuten sokeriruo’on tapauksessa, keräämällä alimman palikan voi kerätä myös sen yläpuoliset palikat.{*ICON*}81{*/ICON*} - - Voidaan louhia kivisellä tai sitä paremmalla hakulla timanttien keräämiseksi. - + + Sienet pitäisi istuttaa hämärästi valaistulle alueelle, ja ne leviävät läheisille hämärästi valaistuille palikoille.{*ICON*}39{*/ICON*} - - Voidaan louhia rautaisella tai sitä paremmalla hakulla punakivipölyn keräämiseksi. + + Luujauholla voi kasvattaa viljelyskasvit täysikokoisiksi, tai sienet valtaviksi sieniksi.{*ICON*}351:15{*/ICON*} - - Voidaan louhia hakulla mukulakivien keräämiseksi. + + Vehnä käy läpi useita vaiheita kasvaessaan ja se on valmis korjattavaksi, kun sen väri tummenee.{*ICON*}59:7{*/ICON*} - - Kerätään lapiolla. Voidaan käyttää rakentamiseen. + + Kurpitsat ja melonit vaativat istutetun siemenen viereen lisäksi palikan, johon kasvis voi kasvaa, kun sen varsi on täysikokoinen. - - Voidaan istuttaa. Lopulta siitä kasvaa puu. + + Sokeriruoko pitää istuttaa ruoho-, maa- tai hiekkapalikalle, joka on aivan vesipalikan vieressä. Sokeriruokopalikan hakkaaminen tiputtaa lisäksi kaikki palikat, jotka ovat sen yläpuolella.{*ICON*}83{*/ICON*} - - Tätä ei voi rikkoa. + + Luovassa tilassa sinulla on loputon määrä kaikkia saatavilla olevia esineitä ja palikoita, voit tuhota palikoita yhdellä napautuksella ilman työkalua, olet haavoittumaton ja osaat lentää. - - Sytyttää tuleen kaiken, mihin osuu. Voidaan kerätä ämpäriin. + + + Tämän alueen arkussa on osia, joista voi rakentaa mäntiä sisältäviä piirejä. Kokeile käyttää tai koota tällä alueella olevia piirejä, tai rakentaa aivan oma piirisi. Esimerkkejä löytyy lisää opetusalueen ulkopuolelta. - - Kerätään lapiolla. Voidaan sulattaa lasiksi uunissa. Painovoima vaikuttaa siihen, jos sen alla ei ole toista palikkaa. + + + Tällä alueella on portaali Hornaan! - - Kerätään lapiolla. Tuottaa toisinaan piikiveä, kun sitä kaivetaan. Painovoima vaikuttaa siihen, jos sen alla ei ole toista palikkaa. + + + {*B*} + Opettele lisää portaaleista ja Hornasta painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi portaaleista ja Hornasta, paina{*CONTROLLER_VK_B*}. - - Hakataan kirveellä, ja siitä voi valmistaa lankkuja tai polttopuuta. + + Punakivipölyä kerätään louhimalla punakivimalmia hakulla, joka on valmistettu raudasta, timantista tai kullasta. Sillä voi siirtää virtaa enintään 15 palikalle, ja se voi kulkea yhden palikan verran ylös tai alaspäin. + {*ICON*}331{*/ICON*} - - Valmistetaan uunissa hiekkaa sulattamalla. Voidaan käyttää rakentamisessa, mutta hajoaa, jos sitä yrittää louhia. + + Punakivitoistimilla pystyy pidentämään matkaa, jonka virta kulkee, tai asettaa piiriin viiveen. + {*ICON*}356{*/ICON*} - - Louhitaan hakulla kivestä. Voidaan käyttää uunin tai kivityökalujen rakentamiseen. + + Kun mäntä saa virtaa, se työntyy esiin voimalla, joka voi siirtää enintään 12 palikkaa. Kun tarttumamäntä vetäytyy, se voi samalla vetää mukanaan yhden palikan useimpia materiaaleja. + {*ICON*}33{*/ICON*} - - Poltetaan savesta uunissa. + + + Portaaleja valmistetaan asettamalla laavakivipalikoita kehykseksi, joka on neljän palikan levyinen ja viiden palikan korkuinen. Kulmapalikoita ei tarvita. - - Voidaan polttaa tiiliksi uunissa. + + + Hornan kautta pystyy matkustamaan nopeasti Ylämaailmassa. Yhden palikan kulkeminen Hornassa vastaa 3 palikan kulkemista Ylämaailmassa. - - Tiputtaa rikottaessa savipaakkuja, jotka voi polttaa tiiliksi uunissa. + + + Nyt olet Luovassa tilassa. - - Kätevä tapa varastoida lumipalloja. + + + {*B*} + Opettele lisää Luovasta tilasta{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi Luovasta tilasta, paina{*CONTROLLER_VK_B*}. - - Voidaan kaivaa lapiolla lumipalloiksi. + + + Portaali Hornaan aktivoidaan sytyttämällä tuluksilla kehyksen sisällä olevat laavakivipalikat tuleen. Portaalit voivat sulkeutua, jos niiden kehys rikkoutuu, lähellä tapahtuu räjähdys tai niiden läpi valuu nestettä. + - - Tuottaa toisinaan vehnänjyviä rikottaessa. + + + Kun haluat käyttää portaalia Hornaan, seiso sen sisällä. Näyttö muuttuu violetiksi ja kuulet äänen. Muutaman sekunnin kuluttua siirryt toiseen ulottuvuuteen. - - Voidaan käyttää väriaineen valmistamiseen. + + + Horna voi olla vaarallinen paikka ja täynnä laavaa, mutta sieltä pystyy keräämään Hornan kiveä, joka palaa ikuisesti sytyttyään, sekä hehkukiveä, joka luo valoa. - - Voidaan valmistaa kulhon kanssa muhennokseksi. + + Nyt olet suorittanut maanviljelyn opetuspelin. - - Voidaan louhia ainoastaan timanttihakulla. Tuotetaan kastelemalla vedellä paikallaan olevaa laavaa, ja sitä käytetään portaalin rakentamiseen. + + Eri työkalut toimivat paremmin eri materiaaleihin. Käytä kirvestä puunrunkojen hakkaamiseen. - - Luo maailmaan hirviöitä. + + Eri työkalut toimivat paremmin eri materiaaleihin. Käytä hakkua kiven ja malmin louhimiseen. Sinun täytyy valmistaa hakkusi paremmista materiaaleista ennen kuin saat resursseja tietyistä palikoista. - - Asetetaan maahan välittämään sähkönpurkausta. Taikajuoman raaka-aineena se kasvattaa vaikutuksen kestoaikaa. + + Jotkin työkalut sopivat paremmin vihollisten kimppuun hyökkäämiseen. Miekkaa kannattaa käyttää hyökkäämiseen. - - Täysikasvuisesta viljasta voi korjata vehnää. + + Rautagolemeja ilmestyy myös luonnostaan suojelemaan kyläläisiä ja ne hyökkäävät kimppuusi, jos sinä hyökkäät jonkun kyläläisen kimppuun. - - Maata, joka on muokattu valmiiksi siemenien istuttamiseksi. + + Et voi poistua tältä alueelta ennen kuin olet suorittanut opetuspelin. - - Voidaan paistaa uunissa vihreän väriaineen luomiseksi. + + Eri työkalut toimivat paremmin eri materiaaleihin. Käytä lapiota pehmeiden materiaalien, kuten maan ja hiekan louhimiseen. - - Voidaan valmistaa sokeriksi. + + Vinkki: louhi tai hakkaa kädelläsi tai esineellä, jota pidät kädessäsi, pitämällä{*CONTROLLER_ACTION_ACTION*} painettuna. Joidenkin palikoiden louhimiseksi sinun pitää ehkä valmistaa työkalu... - - Voidaan pukea kypäräksi tai valmistaa kurpitsalyhdyksi soihdun kanssa. Se on lisäksi kurpitsapiirakan pääraaka-aine. + + Arkussa joen rannalla on vene. Jos haluat käyttää venettä, siirrä osoitin vettä päin ja paina{*CONTROLLER_ACTION_USE*}. Nouse veneeseen osoittamalla sitä ja painamalla{*CONTROLLER_ACTION_USE*}. - - Palaa sytytettynä ikuisesti. + + Arkussa lammen rannalla on onki. Ota onki arkusta ja laita se käteesi, niin voit käyttää sitä. - - Hidastaa kaiken yli kävelevän liikettä. + + Tämä kehittyneempi mäntämekanismi luo itsestään korjautuvan sillan! Aktivoi se näppäintä painamalla ja katso sitten, miten osat toimivat keskenään, niin opit lisää. - - Portaalissa seisomalla pääset siirtymään Ylämaailman ja Hornan välillä. + + Käyttämäsi työkalu on vahingoittunut. Aina kun käytät työkalua, se vahingoittuu ja lopulta hajoaa. Värillinen palkki tavaraluettelossa olevan esineen alla kertoo sen hetkisen vahingon määrän. - - Käytetään uunin polttoaineena, tai soihtujen valmistamiseen. + + Ui ylöspäin pitämällä{*CONTROLLER_ACTION_JUMP*} painettuna. - - Kerätään tappamalla hämähäkki. Voidaan käyttää jousen tai onkivavan valmistamiseen, tai asettaa maahan ansalangan luomiseksi. + + Tällä alueella on kaivoskärry raiteilla. Jos haluat nousta kaivoskärryyn, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}. Laita kaivoskärry liikkeelle painamalla näppäimen kohdalla{*CONTROLLER_ACTION_USE*}. - - Kerätään tappamalla kana. Voidaan käyttää nuolen valmistamiseen. + + Rautagolemit luodaan pinoamalla neljä rautapalikkaa kuvan osoittamalla tavalla, ja laittamalla kurpitsa keskimmäisen palikan päälle. Rautagolemit hyökkäävät vihollistesi kimppuun. - - Kerätään tappamalla lurkki. Voidaan käyttää dynamiitin valmistamiseen tai käyttää taikajuoman raaka-aineena. + + Syötä vehnää lehmälle, muutatille tai lampaalle; porkkanoita sialle; vehnänsiemeniä tai hornapahkoja kanalle; tai mitä tahansa lihaa sudelle, niin ne alkavat etsiä lähistöltä muita saman lajin eläimiä, jotka ovat myös Rakkaustilassa. - - Voidaan istuttaa viljelysmaahan viljan kasvattamiseksi. Varmista että siemenet saavat tarpeeksi valoa kasvaakseen! + + Kun kaksi saman lajin eläintä tapaa ja molemmat ovat Rakkaustilassa, ne pussailevat pari sekuntia, minkä jälkeen syntyy poikanen. Poikanen seuraa vanhempiaan hetken ennen kuin kasvaa itse täysikasvuiseksi. - - Kerätään viljasta, ja siitä voi valmistaa ruokaa. + + Eläin ei voi siirtyä uudestaan Rakkaustilaan ennen kuin noin 5 minuutin päästä. - - Kerätään kaivamalla soraa. Voidaan käyttää tuluksien valmistamiseen. + + + Tällä alueella eläimet ovat aitauksessa. Voit kasvattaa eläimiä ja saada ne tuottamaan poikasia. - - Kun tätä käyttää sikaan, sillä voi ratsastaa. Sikaa voi ohjata käyttämällä porkkanakeppiä. + + + {*B*} + Opettele lisää eläinten kasvattamisesta{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi eläinten kasvattamisesta, paina{*CONTROLLER_VK_B*}. - - Kerätään kaivamalla lunta, ja niitä voi heittää. + + Jotta saisit eläimet lisääntymään, sinun pitää syöttää niille oikeaa ruokaa, jolloin ne siirtyvät "Rakkaustilaan". - - Kerätään tappamalla lehmä. Voidaan käyttää panssarin tai kirjojen valmistamiseen. + + Jotkin eläimet seuraavat, jos pitää niiden suosimaa ruokaa kädessään. Näin on helpompaa tuoda eläimiä yhteen, jotta ne lisääntyisivät.{*ICON*}296{*/ICON*} - - Kerätään tappamalla lima. Voidaan käyttää taikajuoman raaka-aineena tai tarttumamäntien valmistamiseen. + + + {*B*} + Opettele lisää golemeista{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi golemeista, paina{*CONTROLLER_VK_B*}. - - Kanat tiputtavat näitä satunnaisesti ja niistä voi valmistaa ruokaa. - - - Kerätään hehkukiveä louhimalla. Siitä voidaan valmistaa taas hehkukivipalikoita tai käyttää taikajuoman raaka-aineena, jolloin se lisää juoman vaikutuksen tehoa. + + Golemeja luodaan asettamalla kurpitsa palikkapinon päälle. - - Kerätään tappamalla luuranko. Voidaan käyttää luujauhon valmistamiseen. Voidaan syöttää sudelle, jotta se kesyyntyisi. + + Lumigolemit luodaan laittamalla kaksi lumipalikkaa päällekkäin, ja niiden päälle kurpitsa. Lumigolemit viskovat vihollisiasi lumipalloilla. - - Kerätään saamalla luuranko tappamaan lurkki. Voidaan soittaa jukeboksissa. + + Villejä susia voi kesyttää antamalla niille luita. Kesytettyinä niiden ympärille ilmestyy rakkaussydämiä. Kesyt sudet seuraavat pelaajaa ja puolustavat häntä, ellei niiden ole käsketty istua. - - Sammuttaa tulen ja auttaa viljelyskasveja kasvamaan. Voidaan kerätä ämpäriin. + + Nyt olet suorittanut eläinten kasvattamisen opetuspelin. - - Rikottuna tiputtaa toisinaan taimen, jonka voi istuttaa. Kasvaa puuksi. + + + Tällä alueella on kurpitsoja ja palikoita, joista voi tehdä lumigolemin ja rautagolemin. - - Löydetään tyrmistä ja sitä voidaan käyttää rakentamiseen tai koristeeksi. + + + Voimanlähteen sijainti ja suunta muuttaa sitä, miten se vaikuttaa ympäröiviin palikoihin. Esimerkiksi palikan kyljessä olevan punakivisoihdun voi sammuttaa, jos palikka saa virtaa jostain toisesta lähteestä. - - Käytetään hankkimaan villaa lampaista ja lehtipalikoiden keräämiseen. + + + Jos pata tyhjenee, sen voi täyttää uudestaan vesiämpärillä. - - Saadessa virtaa (käyttämällä painiketta, vipua, painelaattaa, punakivisoihtua, tai punakiveä näistä jonkun kanssa), mäntä työntyy ulos, jos pystyy, ja työntää palikoita. + + + Valmista tulenkestojuoma keittotelinettä käyttäen. Tarvitset vesipullon, hornapahkan ja magmavoidetta. - - Saadessa virtaa (käyttämällä painiketta, vipua, painelaattaa, punakivisoihtua, tai punakiveä näistä jonkun kanssa), mäntä työntyy ulos, jos pystyy, ja työntää palikoita. Kun se vetäytyy, se vetää takaisin palikan, joka koskee männän ulos työntynyttä osaa. + + Voit käyttää juoman ottamalla sen käteesi ja pitämällä{*CONTROLLER_ACTION_USE*} painettuna. Normaali juoma juodaan, jolloin se vaikuttaa juovaan pelaajaan, ja räjähtävä juoma heitetään, jolloin se vaikuttaa olentoihin osumakohtansa lähellä. + Räjähtävät juomat valmistetaan lisäämällä tavallisiin juomiin ruutia. - - Valmistetaan kivipalikoista. Ovat tavanomaisia linnakkeissa. + + {*B*} + Opettele lisää keittämisestä ja juomista painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi keittämisestä ja juomista, paina{*CONTROLLER_VK_B*}. - - Käytetään esteenä aidan tapaan. + + + Ensimmäinen vaihe juoman keittämisessä on vesipullon valmistaminen. Ota arkusta lasipullo. - - Kuin ovi, mutta käytetään pääasiassa aitojen kanssa. + + + Voit täyttää lasipullon padasta, jossa on vettä, tai vesipalikasta. Täytä nyt lasipullo osoittamalla vesilähdettä ja painamalla{*CONTROLLER_ACTION_USE*}. - - Voidaan valmistaa meloniviipaleista. + + + Käytä tulenkestojuomaa itseesi. - - Läpinäkyviä palikoita, joita voi käyttää lasipalikoiden sijasta. + + + Jos haluat lumota esineen, aseta se ensin lumouspaikkaan. Aseita, panssareita ja joitain työkaluja voi lumota, jolloin ne saavat erikoisvaikutuksia, kuten parannettu vahingonkesto tai useamman esineen tuottaminen palikkaa louhiessa. - - Voidaan istuttaa kurpitsojen kasvattamiseksi. + + + Kun lumouspaikkaan asetetaan esine, oikealla olevissa painikkeissa näkyy valikoima satunnaisia lumouksia. - - Voidaan istuttaa melonien kasvattamiseksi. + + + Painikkeen numero kertoo, miten paljon kokemuspisteitä kyseisen lumouksen tekeminen vaatii. Jos kokemustasosi ei ole tarpeeksi korkea, painiketta ei voi painaa. - - Ääreläinen tiputtaa näitä kuollessaan. Heitettäessä pelaaja siirtyy sinne, mihin äärenhelmi laskeutuu ja menettää hieman elinvoimaa. + + + Nyt kun kestät tulta ja laavaa, huomaat että pääset paikkoihin, joihin et aiemmin pystynyt menemään. - - Palikka maata, jonka päällä kasvaa ruohoa. Kerätään lapiolla. Voidaan käyttää rakentamiseen. + + + Tämä on lumousvalikko, jolla voit lisätä lumouksia aseisiin, panssareihin ja joihinkin työkaluihin. - - Voidaan käyttää rakentamiseen tai koristeeksi. + + {*B*} + Opettele lisää lumousvalikon käyttämistä{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää lumousvalikkoa, paina{*CONTROLLER_VK_B*}. - - Hidastaa liikkumisnopeutta, kun sen läpi kävelee. Voidaan tuhota keritsimillä siiman keräämiseksi. + + + Tältä alueelta löytyvät keittoteline, pata sekä arkku täynnä keittämiseen tarvittavia esineitä. - - Luo tuhottaessa sokeritoukan. Voi myös luoda sokeritoukkia, jos lähistöllä hyökätään toisen sokeritoukan kimppuun. + + + Puuhiiltä voi käyttää polttoaineena, tai yhdessä kepin kanssa siitä pystyy valmistamaan soihdun. - - Kasvaa ajan mittaan, kun sen asettaa. Voidaan kerätä keritsimillä. Sitä voi kiivetä kuin tikapuita. + + + Kun raaka-ainepaikkaan asetetaan hiekkaa, siitä voi valmistaa lasia. Valmista pari lasipalikkaa, joista saat ikkunat suojapaikkaasi. - - Liukas kävellä. Muuttuu vedeksi, jos se on tuhoutuessaan toisen palikan päällä. Sulaa jos se on tarpeeksi lähellä valonlähdettä tai jos se asetetaan Hornaan. + + + Tämä on keittovalikko. Täällä voit luoda juomia, joilla on erilaisia vaikutuksia. - - Voidaan käyttää koristeena. + + + Monia puuesineitä voidaan käyttää polttoaineena, mutta kaikki eivät pala yhtä kauan. Saatat myös löytää maailmasta muita polttoaineita. - - Käytetään juomien keittämiseen ja linnakkeiden etsimiseen. Niitä tiputtavat roihut, joita yleensä löytyy Hornan linnoituksista tai niiden läheltä. + + + Kun esineesi on kuumennettu, voit siirtää ne tuottoalueelta tavaraluetteloosi. Kannattaa kokeilla, mitä pystyt valmistamaan eri raaka-aineista. - - Käytetään juomien keittämiseen. Hornanhenki tiputtaa näitä kuollessaan. + + + Jos käytät raaka-aineena puuta, pystyt valmistamaan puuhiiltä. Aseta uuniin polttoainetta ja raaka-ainepaikkaan puuta. Uunilla menee hetki puuhiilen valmistamisessa, joten tee vain jotain muuta ja tule myöhemmin tarkistamaan, onko puuhiili valmis. - - Sikamieszombi tiputtaa näitä kuollessaan. Sikamieszombeja löytyy Hornasta. Käytetään taikajuoman raaka-aineena. + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää keittotelinettä, paina{*CONTROLLER_VK_B*}. - - Käytetään juomien keittämisessä. Näitä kasvaa luonnonvaraisina Hornan linnoituksissa. Sen voi myös istuttaa sieluhiekkaan. + + + Pilaantunut hämähäkinsilmä pilaa juoman ja muuttaa sen vaikutuksen päinvastaiseksi. Ruutia lisäämällä saa aikaan räjähtävän juoman, jonka heittämällä juoma vaikuttaa alueella, jolle se laskeutuu. - - Voi olla monenlaisia vaikutuksia, riippuen siitä, mihin sitä käytetään. + + + Luo tulenkestojuoma lisäämällä ensin vesipulloon hornapahka ja sen jälkeen magmavoidetta. - - Sen voi täyttää vedellä ja käyttää juoman aloitusraaka-aineena keittotelineessä. + + + Poistu nyt keittovalikosta painamalla{*CONTROLLER_VK_B*}. - - Tämä on myrkyllinen ruoka- ja juomaesine. Tippuu, kun pelaaja tappaa hämähäkin tai luolahämähäkin. + + + Juomia keitetään asettamalla raaka-aine yläpaikkaan ja juoma tai vesipullo alapaikkaan (yhtä aikaa pystyy keittämään enintään 3 juomaa). Kun kelvollinen yhdistelmä on paikoillaan, keittäminen alkaa ja juoma valmistuu hetken päästä. - - Käytetään juomien keittämisessä, pääasiassa valmistettaessa juomia, joilla on haitallinen vaikutus. + + + Kaikki juomat tarvitsevat aluksi vesipullon. Useimmat juomat valmistetaan käyttämällä ensin hornapahkaa. Siitä syntyy kelvoton juoma, joka vaatii vähintään yhden lisäraaka-aineen ennen kuin siitä saa aikaan kelvollisen juoman. - - Käytetään juomien keittämisessä, tai voidaan valmistaa yhdessä muiden esineiden kanssa ääreläisensilmäksi tai magmavoiteeksi. + + + Kun sinulla on juoma, voit muokata sen vaikutuksia. Punakivipölyn lisääminen kasvattaa vaikutuksen kestoa ja hehkukivipölyä lisäämällä juomasta saa tehokkaamman. - - Käytetään juomien keittämisessä. + + + Lumoa esine valitsemalla lumous ja painamalla{*CONTROLLER_VK_A*}. Silloin kokemuspisteistäsi vähennetään lumouksen hinta. - - Käytetään juomien ja räjähtävien juomien valmistamiseen. + + + Heitä siima veteen ja ala kalastaa painamalla{*CONTROLLER_ACTION_USE*}. Kelaa siimaa painamalla{*CONTROLLER_ACTION_USE*} uudestaan. + {*FishingRodIcon*} - - Voidaan täyttää vedellä vesiämpärin tai sateen avulla, minkä jälkeen siitä voi täyttää lasipulloja vedellä. + + + Jos odotat, kunnes koho vajoaa veden alle ennen kuin kelaat siiman, voit saada kalan. Kalan voi syödä raakana tai sen voi paistaa uunissa. Syöty kala parantaa elinvoimaa. + {*FishIcon*} - - Näyttää heitettäessä suunnan ääriportaalille. Kun näitä asetetaan kaksitoista ääriportaalin kehykseen, ääriportaali aktivoituu. + + + Kuten monilla muillakin työkaluilla, onkivavalla on rajoitettu määrä käyttökertoja. Sitä voi tosin käyttää muuhunkin kuin onkimiseen. Kannattaa kokeilla, mitä muuta voit sillä saada kiinni tai aktivoida... + {*FishingRodIcon*} - - Käytetään juomien keittämisessä. + + + Veneellä pääset kulkemaan vedessä nopeammin. Voit ohjata sitä painamalla{*CONTROLLER_ACTION_MOVE*} ja{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + - - Ruohopalikoiden kaltaisia, mutta sienet kasvavat niiden päällä erinomaisesti. + + + Käytät nyt onkivapaa. Voit kalastaa sillä painamalla{*CONTROLLER_ACTION_USE*}.{*FishingRodIcon*} - - Kelluu vedessä ja sen päällä voi kävellä. + + + {*B*} + Opettele lisää kalastamisesta{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi kalastamisesta, paina{*CONTROLLER_VK_B*}. - - Käytetään Hornan linnoitusten rakentamiseen. Immuuni hornanhenkien tulipalloille. + + + Tämä on sänky. Osoita sitä yöllä ja paina{*CONTROLLER_ACTION_USE*}, niin voit nukkua yön yli ja herätä aamulla.{*ICON*}355{*/ICON*} - - Käytetään Hornan linnoituksissa. + + + Tällä alueella on muutamia yksinkertaisia punakivi- ja mäntäpiirejä, sekä arkku, josta löytyy piirien laajentamiseen tarvittavia esineitä. - - Löytyy Hornan linnoituksista, ja pudottaa rikottaessa hornapahkan. + + + {*B*} + Opettele lisää punakivipiireistä ja männistä painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi punakivipiireistä ja männistä, paina{*CONTROLLER_VK_B*}. - - Tämän avulla pelaaja voi lumota kokemuspisteitä käyttämällä miekkoja, hakkuja, kirveitä, jousia ja panssareita. + + + Vivut, näppäimet, painelaatat ja punakivisoihdut voivat antaa virtaa piireille, joko liittämällä ne suoraan aktivoitavaan esineeseen tai kytkemällä ne siihen punakivipölyllä. - - Tämän voi aktivoida kahdellatoista ääreläisensilmällä, jolloin pelaaja voi matkustaa Äären ulottuvuuteen. + + + {*B*} + Opettele lisää sängyistä painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi sängyistä, paina{*CONTROLLER_VK_B*}. - - Käytetään ääriportaalin valmistamiseen. + + + Sänky kannattaa asettaa turvalliseen ja hyvin valaistuun paikkaan niin, että hirviöt eivät herätä sinua keskellä yötä. Jos olet käyttänyt sänkyä, heräät siinä kuoltuasi. + {*ICON*}355{*/ICON*} - - Palikkatyyppi joka löytyy Äärestä. Se kestää hyvin räjähdyksiä, joten se on hyvä rakennusaine. + + + Jos pelissäsi on muita pelaajia ja haluatte nukkua, kaikkien on oltava sängyssä samaan aikaan. + {*ICON*}355{*/ICON*} - - Tämä palikka syntyy, kun äärilisko kukistuu Ääressä. + + + {*B*} + Opettele lisää veneistä{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi veneistä, paina{*CONTROLLER_VK_B*}. - - Heitettynä se tiputtaa kokemuskuulia, joita keräämällä saa kasvatettua kokemuspisteitä. + + + Lumouspöydän avulla pystyt lisäämään aseisiin, panssareihin ja joihinkin työkaluihin erikoisvaikutuksia, kuten useamman esineen tuottaminen palikkaa louhiessa tai parannettu vastustuskyky. - - Hyödyllinen sytytettäessä asioita tuleen, tai asioiden satunnaiseen sytyttämiseen ammuttuna jakelulaitteesta. + + + Kirjahyllyjen asettaminen lumouspöydän ympärille lisää sen tehoa ja pääset käsiksi korkeamman tason lumouksiin. - - Nämä ovat samantapaisia kuin näyttelyvitriinit ja niihin voi asettaa näytteille esineen tai palikan. + + + Esineen lumoaminen maksaa kokemuspisteitä, joita saa keräämällä kokemuskuulia. Kokemuskuulia saa tappamalla hirviöitä ja eläimiä, louhimalla malmia, kasvattamalla eläimiä, kalastamalla ja sulattamalla/paistamalla jotain uunissa. - - Voi luoda heitettynä ilmoitetun tyyppisiä olentoja. + + + Vaikka kaikki lumoukset ovat sattumanvaraisia, osa paremmista lumouksista tulee saataville vain, kun kokemustasosi on tarpeeksi korkea ja sinulla on paljon kirjahyllyjä lumouspöydän ympärillä kasvattamassa sen tehoa. - - Käytetään pitkien portaiden rakentamiseen. Kaksi päällekkäin asetettua laattaa luo normaalikokoisen kahden laatan palikan. + + + Tällä alueella on lumouspöytä ja muutamia muita esineitä, joiden avulla opit tekemään lumouksia. - - Käytetään pitkien portaiden rakentamiseen. Kaksi päällekkäin asetettua laattaa luo normaalikokoisen kahden laatan palikan. + + {*B*} + Opettele lisää lumouksista{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi lumouksista, paina{*CONTROLLER_VK_B*}. - - Valmistetaan sulattamalla hornakiveä uunissa. Niistä voi valmistaa hornatiilipalikoita. + + + Kokemuspisteitä saa myös lumouspullolla, joka luo kokemuskuulia laskeutumispaikkaansa, kun sen heittää. Luodut kuulat voi sitten kerätä talteen. - - Niistä lähtee valoa, kun ne saavat virtaa. + + + Kaivoskärry kulkee raiteilla. Uunilla voit myös valmistaa moottoroidun kaivoskärryn sekä kaivoskärryn, jossa on arkku. + {*RailIcon*} - - Voidaan kasvattaa kaakaopapujen keräämiseksi. + + + Lisäksi voit valmistaa sähköraiteita, jotka saavat virtansa punakivisoihduista ja piirejä, jotka kiihdyttävät kärryn nopeutta. Ne voi yhdistää kytkimiin, vipuihin ja painelaattoihin, ja muodostaa näin monimutkaisia järjestelmiä. + {*PoweredRailIcon*} - - Olentojen päitä voi asettaa koristeiksi tai pitää naamiona kypäräpaikassa. + + + Purjehdit nyt veneellä. Jos haluat poistua veneestä, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - Mustekala + + + Tällä alueella löydät arkuista joitain lumottuja esineitä, lumouspulloja ja muutamia esineitä, joita voit lumota opetellaksesi käyttämään lumouspöytää. - - Tiputtaa mustepussin tapettaessa. + + + Kuljet nyt kaivoskärryllä. Jos haluat poistua kaivoskärrystä, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - Lehmä + + {*B*} + Opettele lisää kaivoskärryistä{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi kaivoskärryistä, paina{*CONTROLLER_VK_B*}. - - Tiputtaa nahkaa tapettaessa. Voidaan myös lypsää ämpärin kanssa. + + Jos siirrät osoittimen valikon ulkopuolelle kantaessasi esinettä, voit tiputtaa sen. - - Lammas + + Lue - - Tiputtaa villaa kerittäessä (ellei sitä ole jo keritty). Voidaan värjätä, jolloin sen villasta tulee eriväristä. + + Ripusta - - Kana + + Heitä - - Tiputtaa höyheniä tapettaessa, sekä munii toisinaan munia. + + Avaa - - Sika + + Vaihda sävelkorkeutta - - Tiputtaa porsaankyljyksiä tapettaessa. Voidaan ratsastaa satuloituna. + + Räjäytä - - Susi + + Istuta - - Rauhallinen kunnes sen kimppuun käydään, jolloin se puolustautuu. Voidaan kesyttää luilla, jolloin susi seuraa sinua ja puolustaa sinua, jos kimppuusi hyökätään. + + Avaa koko peli - - Lurkki + + Poista tallenne - - Räjähtää, jos menet liian lähelle! + + Poista - - Luuranko + + Käännä maata - - Ampuu sinua nuolilla. Tiputtaa nuolia tapettaessa. + + Kerää - - Hämähäkki + + Jatka - - Hyökkää kimppuusi, jos menet sen lähelle. Osaa kiivetä seinillä. Tiputtaa siimaa tapettaessa. + + Ui ylös - - Zombi + + Lyö - - Hyökkää kimppuusi, jos menet sen lähelle. + + Lypsä - - Sikamieszombi + + Kerää - - Aluksi rauhallinen, mutta puolustautuu laumana jos hyökkäät yhden kimppuun. + + Tyhjennä - - Hornanhenki + + Satuloi - - Ampuu sinua liekehtivillä palloilla, jotka räjähtävät osuessaan. + + Aseta - - Lima + + Syö - - Jakautuu pienemmiksi limoiksi, kun sitä vahingoitetaan. + + Ratsasta - - Ääreläinen + + Purjehdi - - Hyökkää kimppuusi, jos katsot sitä. Voi myös siirrellä palikoita. + + Kasvata - - Sokeritoukka + + Nuku - - Houkuttelee paikalle lähistön muita sokeritoukkia, jos sen kimppuun hyökätään. Piileskelee kivipalikoissa. + + Herää - - Luolahämähäkki + + Soita - - Myrkyllinen purema. + + Asetukset - - Sienilehmä + + Siirrä panssari - - Tuottaa sienimuhennosta, jos sitä käytetään kulhon kanssa. Tiputtaa sieniä ja muuttuu normaaliksi lehmäksi, jos sen keritsee. + + Siirrä ase - - Lumigolemi + + Ota käyttöön - - Pelaaja voi luoda lumigolemin lumipalikoista ja kurpitsasta. Ne viskovat lumipalloilla luojansa vihollisia. + + Siirrä raaka-aine - - Äärilisko + + Siirrä polttoaine - - Suuri musta lohikäärme, joka löytyy Äärestä. + + Siirrä työkalu - - Roihu + + Vedä - - Vihollinen, joita löytää Hornasta, yleensä Hornan linnoitusten sisältä. Tiputtaa tapettaessa roihusauvoja. + + Selaa ylös - - Magmakuutio + + Selaa alas - - Löytyy Hornasta. Limojen tapaan sekin jakautuu pienemmiksi samanlaisiksi tapettaessa. + + Rakkaustila - - Kyläläinen + + Laukaise - - Oselotti + + Etuoikeudet - - Löytyy viidakosta. Sen voi kesyttää syöttämälle sille raakaa kalaa. Sinun on kuitenkin annettava oselotin lähestyä sinua itse, koska äkkinäiset liikkeet säikäyttävät sen tiehensä. + + Estä - - Rautagolemi + + Luova - - Ilmaantuu kyliin suojellakseen niitä, ja sen voi valmistaa rautapalikoista ja kurpitsasta. + + Kiellä kenttä - - Räjähdysanimaattori + + Valitse ulkoasu - - Luonnostaiteilijat + + Sytytä - - Numeroiden rouskutus ja statistiikka + + Kutsu kavereita - - Komenteleva koordinaattori - - - Alkuperäinen suunnittelu ja koodaus: + + Hyväksy - - Projektinjohtaja/tuottaja + + Keritse - - Muut Mojangin työntekijät + + Liiku - - Minecraft PC:n johtava peliohjelmoija + + Asenna uudestaan - - Koodarininja + + Asetukset - - Toimitusjohtaja + + Suorita komento - - Valkokaulustyöläinen + + Asenna täysi versio - - Asiakastuki + + Asenna koeversio - - Toimiston DJ + + Asenna - - Suunnittelija/ohjelmoija – Minecraftin taskuversio + + Lennätä ulos - - Kehittäjä + + Päivitä Verkkopeliluettelo - - Pääarkkitehti + + Ryhmäpelit - - Taidekehittäjä + + Kaikki pelit - - Pelin luoja + + Poistu - - Hauskuuden ohjaaja + + Peru - - Musiikki ja äänet + + Peru liittyminen - - Ohjelmointi + + Vaihda ryhmää - - Taide + + Valmistaminen - - Laadunvalvonta + + Luo - - Vastaava tuottaja + + Ota/aseta - - Päätuottaja + + Näytä tavarat - - Tuottaja + + Näytä kuvaus - - Testauksen johtaja + + Näytä raaka-aineet - - Päätestaaja + + Palaa - - Suunnitteluryhmä + + Muistutus: - - Kehitysryhmä + + - - Julkaisunhallinta + + Peliin on sen viimeisimmässä versiossa lisätty uusia ominaisuuksia, mukaan lukien uusia alueita opetuspelin maailmaan. - - Johtaja, XBLA-julkaisu + + Sinulla ei ole kaikkia tarvittavia raaka-aineita tämän esineen valmistamiseksi. Laatikossa vasemmassa alakulmassa näkyvät tämän esineen valmistamiseksi tarvitut raaka-aineet. - - Liiketoiminnan kehittäminen + + Onneksi olkoon, olet suorittanut opetuspelin. Pelissä aika kulkee nyt normaalisti, eikä mene pitkään ennen kuin tulee yö ja hirviöt saapuvat! Tee suojapaikkasi valmiiksi! - - Portfolion johtaja + + {*EXIT_PICTURE*} Kun olet valmis tutkimaan kauempana olevia paikkoja, tällä alueella kaivosmiehen mökin lähistöllä on ovi, joka johtaa pieneen linnaan. + - - Tuotantopäällikkö + + {*B*}Pelaa opetuspeli läpi normaalisti painamalla{*CONTROLLER_VK_A*}.{*B*} + Ohita pääopetuspeli painamalla{*CONTROLLER_VK_B*}. - - Markkinointi + + + {*B*} + Opettele lisää ruokapalkista ja ruuan syömisestä painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos tiedät jo tarpeeksi ruokapalkista ja ruuan syömisestä, paina{*CONTROLLER_VK_B*}. - - Yhteisöpäällikkö + + Valitse - - Euroopan lokalisointiryhmä + + Käytä - - Redmondin lokalisointiryhmä + + Tältä alueelta löydät valmiita paikkoja, joissa opit kalastamisesta, veneistä, männistä ja punakivestä. - - Aasian lokalisointiryhmä + + Tämän alueen ulkopuolelta löydät esimerkkejä mm. rakennuksista, maanviljelystä, kaivoskärryistä ja raiteista, lumoamisesta, juomien keittämisestä, kaupankäynnistä ja takomisesta! - - Käyttäjätutkimusryhmä + + + Ruokapalkkisi on laskenut niin alas, että et enää parane itsestään. - - MGS Central -ryhmät + + Ota - - Virstanpylväiden kelpoisuustestaaja + + Seuraava - - Erityiskiitokset + + Edellinen - - Testauspäällikkö + + Potkaise pelaaja - - Vanhempi johtava testaaja + + Lähetä kaveripyyntö - - Ohjelmiston laadunvalvonta + + Selaa alas - - Projektin järjestelmätestaus + + Selaa ylös - - Järjestelmän lisätestaus + + Värjää - - Avustavat testaajat + + Paranna - - Jon Kågström + + Istu - - Tobias Möllstam + + Seuraa minua - - Risë Lugo + + Louhi - - Puumiekka + + Syötä - - Kivimiekka + + Kesytä - - Rautamiekka + + Vaihda suodin - - Timanttimiekka + + Aseta kaikki - - Kultamiekka + + Aseta yksi - - Puulapio + + Tiputa - - Kivilapio + + Ota kaikki - - Rautalapio + + Ota puolet - - Timanttilapio + + Aseta - - Kultalapio + + Tiputa kaikki - - Puuhakku + + Tyhjennä pikavalinta - - Kivihakku + + Mikä tämä on? - - Rautahakku + + Jaa Facebookissa - - Timanttihakku + + Tiputa yksi - - Kultahakku + + Vaihda - - Puukirves + + Pikasiirrä - - Kivikirves + + Ulkoasupaketit - - Rautakirves + + Punaiseksi värjätty lasilevy - - Timanttikirves + + Vihreäksi värjätty lasilevy - - Kultakirves + + Ruskeaksi värjätty lasilevy - - Puukuokka + + Valkoiseksi värjätty lasi - - Kivikuokka + + Värjätty lasilevy - - Rautakuokka + + Mustaksi värjätty lasilevy - - Timanttikuokka + + Siniseksi värjätty lasilevy - - Kultakuokka + + Harmaaksi värjätty lasilevy - - Puuovi + + Pinkiksi värjätty lasilevy - - Rautaovi + + Limenvihreäksi värjätty lasilevy - - Rengaspanssarin kypärä + + Violetiksi värjätty lasilevy - - Rengasrintapanssari + + Sinivihreäksi värjätty lasilevy - - Rengaspanssarin housut + + Vaaleanharmaaksi värjätty lasilevy - - Rengaspanssarin saappaat + + Oranssiksi värjätty lasi - - Nahkalakki + + Siniseksi värjätty lasi - - Rautakypärä + + Violetiksi värjätty lasi - - Timanttikypärä + + Sinivihreäksi värjätty lasi - - Kultakypärä + + Punaiseksi värjätty lasi - - Nahkatunika + + Vihreäksi värjätty lasi - - Rautarintapanssari + + Ruskeaksi värjätty lasi - - Timanttirintapanssari + + Vaaleanharmaaksi värjätty lasi - - Kultarintapanssari + + Keltaiseksi värjätty lasi - - Nahkahousut + + Vaaleansiniseksi värjätty lasi - - Rautahousut + + Magentaksi värjätty lasi - - Timanttihousut + + Harmaaksi värjätty lasi - - Kultahousut + + Pinkiksi värjätty lasi - - Nahkasaappaat + + Limen vihreäksi värjätty lasi - - Rautasaappaat + + Keltaiseksi värjätty lasilevy - - Timanttisaappaat + + Vaaleanharmaa - - Kultasaappaat + + Harmaa - - Rautaharkko + + Pinkki - - Kultaharkko + + Sininen - - Ämpäri + + Violetti - - Vesiämpäri + + Sinivihreä - - Laavaämpäri + + Limenvihreä - - Tulukset + + Oranssi - - Omena + + Valkoinen - - Jousi + + Muokattu - - Nuoli + + Keltainen - - Kivihiili + + Vaaleansininen - - Puuhiili + + Magenta - - Timantti + + Ruskea - - Keppi + + Valkoiseksi värjätty lasilevy - - Kulho + + Pieni pallo - - Sienimuhennos + + Iso pallo - - Siima + + Vaaleansiniseksi värjätty lasilevy - - Höyhen + + Magentaksi värjätty lasilevy - - Ruuti + + Oranssiksi värjätty lasilevy - - Vehnänjyviä + + Tähdenmuotoinen - - Vehnä + + Musta - - Leipä + + Punainen - - Piikivi + + Vihreä - - Raaka porsaankyljys + + Lurkinmuotoinen - - Paistettu porsaankyljys + + Räjähdys - - Maalaus + + Tuntematon muoto - - Kultainen omena + + Mustaksi värjätty lasi - - Kyltti + + Hevosen rautapanssari - - Kaivoskärry + + Hevosen kultapanssari - - Satula + + Hevosen timanttipanssari - - Punakivi + + Punakivivertain - - Lumipallo + + Kaivoskärry ja dynamiittia - - Vene + + Kaivoskärry ja hyppijä - - Nahka + + Lieka - - Maitoämpäri + + Majakka - - Tiili + + Ansoitettu arkku - - Savi + + Painotettu painelaatta (kevyt) - - Sokeriruo'ot + + Nimilaatta - - Paperi + + Puulankut (kaikki tyypit) - - Kirja + + Komentopalikka - - Limapallo + + Ilotulitetähti - - Kaivoskärry ja arkku + + Näitä eläimiä voi kesyttää ja niillä voi ratsastaa. Niihin voi kiinnittää arkun. - - Kaivoskärry ja uuni + + Muuli - - Muna + + Syntyy kun hevonen ja aasi lisääntyvät. Näitä eläimiä voi kesyttää, minkä jälkeen niillä voi ratsastaa. Niille voi laittaa panssarin ja ne voivat kantaa arkkuja. - - Kompassi + + Hevonen - - Onkivapa + + Näitä eläimiä voi kesyttää ja niillä voi ratsastaa. - - Kello + + Aasi - - Hehkukivipöly + + Zombihevonen - - Raaka kala + + Tyhjä kartta - - Paistettu kala + + Hornatähti - - Värijauhe + + Ilotulitusraketti - - Mustepussi + + Luurankohevonen - - Punainen väriaine + + Näivettäjä - - Kaktuksenvihreä väriaine + + Nämä valmistetaan näivettäjän kalloista ja sieluhiekasta. Ne ampuvat sinua räjähtävillä kalloilla. - - Kaakaopavun ruskea väriaine + + Painotettu painelaatta (raskas) - - Sininen väriaine + + Vaaleanharmaaksi värjätty savi - - Violetti väriaine + + Harmaaksi värjätty savi - - Sinivihreä väriaine + + Pinkiksi värjätty savi - - Vaaleanharmaa väriaine + + Siniseksi värjätty savi - - Harmaa väriaine + + Violetiksi värjätty savi - - Pinkki väriaine + + Sinivihreäksi värjätty savi - - Limenvihreä väriaine + + Limenvihreäksi värjätty savi - - Keltainen väriaine + + Oranssiksi värjätty savi - - Vaaleansininen väriaine + + Valkoiseksi värjätty savi - - Magenta väriaine + + Värjätty lasi - - Oranssi väriaine + + Keltaiseksi värjätty savi - - Luunvalkoinen väriaine + + Vaaleansiniseksi värjätty savi - - Luu + + Magentaksi värjätty savi - - Sokeri + + Ruskeaksi värjätty savi - - Kakku + + Hyppijä - - Sänky + + Aktivointikisko - - Punakivitoistin + + Pudottaja - - Keksi + + Punakivivertain - - Kartta + + Päivänvalosensori - - Musiikkilevy - "13" + + Punakivipalikka - - Musiikkilevy - "cat" + + Värjätty savi - - Musiikkilevy - "blocks" + + Mustaksi värjätty savi - - Musiikkilevy - "chirp" + + Punaiseksi värjätty savi - - Musiikkilevy - "far" + + Vihreäksi värjätty savi - - Musiikkilevy - "mall" + + Heinäpaali - - Musiikkilevy - "mellohi" + + Kovetettu savi - - Musiikkilevy - "stal" + + Kivihiilipalikka - - Musiikkilevy - "strad" + + Häivytys - - Musiikkilevy - "ward" + + Kun tämä ei ole käytössä, hirviöt ja eläimet eivät voi muuttaa palikoita (esimerkiksi lurkin räjähdys ei tuhoa palikoita ja lammas ei poista ruohoa) tai poimia esineitä. - - Musiikkilevy - "11" + + Kun tämä on käytössä, pelaajat saavat pitää tavaransa kuollessaan. - - Musiikkilevy - "where are we now" + + Kun tämä ei ole käytössä, olennot eivät synny itsestään. - - Keritsimet + + Pelitila: Seikkailu - - Kurpitsansiemenet + + Seikkailu - - Meloninsiemenet + + Syötä siemen luodaksesi saman maaston uudestaan. Jätä tyhjäksi, niin maailmasta tulee sattumanvarainen - - Raaka kana + + Kun tämä ei ole käytössä, hirviöt ja eläimet eivät pudota saalista (esimerkiksi lurkit eivät pudota ruutia). - - Paistettu kana + + {*PLAYER*} putosi tikapuilta - - Raaka pihvi + + {*PLAYER*} putosi liaaneista - - Paistettu pihvi + + {*PLAYER*} lensi pois vedestä - - Mätä liha + + Kun tämä ei ole käytössä, palikat eivät pudota tavaroita tuhoutuessaan (esimerkiksi kivipalikoista ei putoa mukulakiviä). - - Äärenhelmi + + Kun tämä ei ole käytössä, pelaajat eivät parane luonnollisesti. - - Meloninviipale + + Kun tämä ei ole käytössä, vuorokaudenaika ei muutu. - - Roihutanko + + Kaivoskärry - - Hornanhengen kyynel + + Kiinnitä - - Kultahippu + + Vapauta - - Hornapahka + + Kiinnitä - - {*splash*}{*prefix*}juoma{*postfix*} + + Nouse ratsailta - - Lasipullo + + Kiinnitä arkku - - Vesipullo + + Laukaise - - Hämähäkin silmä + + Nimeä - - Pilaantunut silmä + + Majakka - - Roihujauhe + + Ensisijainen voima - - Magmavoide + + Toissijainen voima - - Keittoteline + + Hevonen - - Pata + + Pudottaja - - Ääreläisensilmä + + Hyppijä - - Kimalteleva meloni + + {*PLAYER*} tippui korkealta - - Lumouspullo + + Luomismunaa ei voi käyttää tällä hetkellä. Lepakoiden enimmäismäärä maailmassa on saavutettu. - - Tulilataus + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien hevosien enimmäismäärä on saavutettu. - - Tulilataus (puuhiili) + + Peliasetukset - - Tulilataus (kivihiili) + + {*SOURCE*} ampui pelaajan tulipalloksi {*PLAYER*} esineellä {*ITEM*} - - Kehys + + {*SOURCE*} nuiji pelaajan {*PLAYER*} esineellä {*ITEM*} - - Luo: {*CREATURE*} + + {*SOURCE*} tappoi pelaajan {*PLAYER*} esineellä {*ITEM*} - - Hornatiili + + Olentojen haitanteko - - Pääkallo + + Palikoiden pudotukset - - Luurangon pääkallo + + Luonnollinen paraneminen - - Näivettäjäluurangon pääkallo + + Päivänvalon kierto - - Zombin pää + + Pidä tavarat - - Pää + + Olentojen syntyminen - - Pää (%s) + + Olentojen saalis - - Lurkin pää + + {*SOURCE*} ampui pelaajan {*PLAYER*} esineellä {*ITEM*} - - Kivi + + {*PLAYER*} putosi liian kauas ja hänet lopetti {*SOURCE*} - - Ruohopalikka + + {*PLAYER*} putosi liian kauas ja hänet lopetti {*SOURCE*} esineellä {*ITEM*} - - Maa + + {*PLAYER*} käveli tuleen, kun {*SOURCE*} taisteli häntä vastaan - - Mukulakivi + + {*SOURCE*} pudotti pelaajan {*PLAYER*} - - Tammipuulankut + + {*SOURCE*} pudotti pelaajan {*PLAYER*} - - Kuusipuulankut + + {*SOURCE*} pudotti pelaajan {*PLAYER*} esineellä {*ITEM*} - - Koivupuulankut + + {*PLAYER*} paloi poroksi, kun {*SOURCE*} taisteli häntä vastaan - - Viidakkopuulankut + + {*SOURCE*} räjäytti pelaajan {*PLAYER*} - - Taimi + + {*PLAYER*} näivettyi pois - - Tammen taimi + + {*SOURCE*} surmasi pelaajan {*PLAYER*} esineellä {*ITEM*} - - Kuusen taimi + + {*PLAYER*} yritti uida laavassa, koska {*SOURCE*} jahtasi häntä - - Koivun taimi + + {*PLAYER*} hukkui, kun {*SOURCE*} jahtasi häntä - - Viidakkopuun taimi + + {*PLAYER*} käveli kaktukseen, kun {*SOURCE*} jahtasi häntä - - Peruskallio + + Nouse ratsaille - - Vesi + + +Jotta hevosta voisi ohjata, sille pitää laittaa satula, jonka voi ostaa kyläläisiltä tai löytää maailmaan kätketyistä arkuista. - - Laava + + Kesyille aaseille ja muuleille voi laittaa satulalaukut kiinnittämällä niihin arkun. Satulalaukkuja voi käyttää ratsastettaessa tai hiivittäessä. - - Hiekka + + +Hevoset ja aasit (mutta ei muuleja) saa lisääntymään muiden eläinten lailla käyttämällä kultaista omenaa tai kultaista porkkanaa. Varsoista kasvaa ajan mittaan täysikokoisia hevosia, joskin kasvamista voi nopeuttaa syöttämällä niille vehnää tai heinää. - - Hiekkakivi + + +Hevoset, aasit ja muulit pitää kesyttää ennen kuin niitä voi käyttää. Hevonen kesytetään yrittämällä ratsastaa sillä, vaikka se ensin pyrkii heittämään ratsastajan selästään. - - Sora + + +Kesytettyinä niiden ympärille ilmestyy rakkaussydämiä eivätkä ne enää yritä viskata pelaajaa selästään. - - Kultamalmi + + +Yritä nyt ratsastaa tällä hevosella. Nouse ratsaille painamalla {*CONTROLLER_ACTION_USE*}, kun kädessäsi ei ole tavaraa tai työkaluja. - - Rautamalmi + + +Täällä voit yrittää kesyttää hevosia ja aaseja, ja täällä olevista arkuista löydät myös satuloita, hevospanssareita ja muita hevosille hyödyllisiä tavaroita. - - Kivihiilimalmi + + +Jos majakan pyramidilla on vähintään 4 tasoa, voit lisäksi valita toissijaiseksi voimaksi paranemisen tai vahvemman ensisijaisen voiman. - - Puu + + +Jotta voisit asettaa majakkasi voimat, sinun on uhrattava yksi smaragdi, timantti, kultaharkko tai rautaharkko maksupaikkaan. Kun voimat on asetettu, ne säteilevät majakasta loputtomasti. - - Tammipuu + + Tämän pyramidin huipulla on sammunut majakka. - - Kuusipuu + + +Tämä on majakkavalikko, mistä voit valita voimat, jotka majakkasi antaa. - - Koivupuu + + +{*B*}Paina {*CONTROLLER_VK_A*} jatkaaksesi. +{*B*}Paina {*CONTROLLER_VK_B*}, jos osaat jo käyttää majakkavalikkoa. - - Viidakkopuu + + +Majakkavalikosta voit valita 1 ensisijaisen voiman majakallesi. Mitä enemmän tasoja pyramidissasi on, sitä suuremmasta voimavalikoimasta voit valita. - - Tammi + + +Kaikilla täysikasvuisilla hevosilla, aaseilla ja muuleilla voi ratsastaa. Kuitenkin vain hevosille voi pukea panssarin, ja vain muuleille ja aaseille voi laittaa satulalaukut tavaroiden kuljettamista varten. - - Kuusi + + Tämä on hevosen tavaraluettelo. - - Koivu + + +{*B*}Paina {*CONTROLLER_VK_A*} jatkaaksesi. +{*B*}Paina {*CONTROLLER_VK_B*}, jos osaat jo käyttää hevosen tavaraluetteloa. - - Lehdet + + +Hevosen tavaraluettelosta voit siirtää tai ottaa käyttöön tavaroita hevosellesi, aasillesi tai muulillesi. - - Tammenlehdet + + Tuikkiminen - - Kuusenhavut + + Vana - - Koivunlehdet + + Lentoaika: - - Viidakkopuunlehdet + + Satuloi hevosesi asettamalla satula satulapaikkaan. Hevosille voi antaa panssarin asettamalla hevospanssarin panssaripaikkaan. - - Pesusieni + + Olet löytänyt muulin. - - Lasi + + + {*B*}Paina {*CONTROLLER_VK_A*}, jos haluat oppia lisää hevosista, aaseista ja muuleista. +{*B*}Paina {*CONTROLLER_VK_B*}, jos tiedät jo tarpeeksi hevosisista, aaseista ja muuleista. - - Villa + + +Hevosia ja aaseja löytyy pääasiassa avoimelta tasangolta. Muuleja saa, kun aasi ja hevonen lisääntyvät, mutta ne eivät itse voi lisääntyä. - - Musta villa + + +Tästä valikosta voit lisäksi siirtää tavaroita oman tavaraluettelosi ja aasiin tai muuliin sidottujen satulalaukkujen välillä. - - Punainen villa + + Olet löytänyt hevosen. - - Vihreä villa + + Olet löytänyt aasin. - - Ruskea villa + + + {*B*}Paina {*CONTROLLER_VK_A*}, jos haluat oppia lisää majakoista. + {*B*}Paina {*CONTROLLER_VK_B*}, jos osaat jo käyttää majakoita. - - Sininen villa + + +Ilotulitetähtiä valmistetaan asettamalla ruutia ja väriainetta valmistusruudukkoon. - - Violetti villa + + Väriaine määrittää ilotulitetähden räjähdyksen värin. - - Sinivihreä villa + + Ilotulitetähden muoto määritetään lisäämällä joko tulilataus, kultahippu, höyhen tai olennonpää. - - Vaaleanharmaa villa + + +Vaihtoehtoisesti voit asettaa useita ilotulitetähtiä valmistusruudukkoon lisätäksesi ne ilotulitteeseen. - - Harmaa villa + + +Jos täytät useampia paikkoja valmistusruudukosta ruudilla, se kasvattaa korkeutta, missä kaikki ilotulitetähdet räjähtävät. - - Pinkki villa + + +Voit ottaa valmiin ilotulitetähden tuottopaikasta, kun haluat käyttää sitä valmistuksessa. - - Limenvihreä villa + + Vana tai tuikkiminen voidaan lisätä timanteilla tai hehkukivipölyllä. - - Keltainen villa + + +Ilotulitteet ovat koriste-esineitä, jotka voi laukaista kädestä tai jakelulaitteella. Ne valmistetaan paperista, ruudista ja valinnaisesti erilaisista ilotulitetähdistä. - - Vaaleansininen villa + + Ilotuliteähtien värejä, hiipumista, muotoa, kokoa ja vaikutuksia (kuten vana ja tuikkiminen) voi muokata käyttämällä valmistuksessa ylimääräisiä ainesosia. - - Magenta villa + + +Kokeile valmistaa työpöydällä ilotulitteita arkuista löytyvistä erilaisista esineistä. - - Oranssi villa + + Kun ilotulitetähti on valmis, voit asettaa sen hiipumisvärin käyttämällä väriainetta. - - Valkoinen villa + + +Täältä löytyvissä arkuista löytyy erilaisia esineitä, joita voi käyttää ILOTULITTEIDEN valmistuksessa! - - Kukka + + + {*B*}Paina {*CONTROLLER_VK_A*}, jos haluat oppia lisää ilotulitteista. + {*B*}Paina {*CONTROLLER_VK_B*}, jos tiedät jo miten ilotulitteita käytetään. - - Ruusu + + Kun tahdot valmistaa ilotulitteen, aseta ruuti ja paperi 3x3-kokoiseen valmistusruudukkoon, joka näkyy tavaraluettelosi yläpuolella. - - Sieni + + Tämä huone sisältää hyppijöitä. - - Kultapalikka + + + {*B*}Paina {*CONTROLLER_VK_A*}, jos haluat oppia lisää hyppijöistä. + {*B*}Paina {*CONTROLLER_VK_B*}, jos osaat jo käyttää hyppijöitä. - - Kätevä tapa säilyttää kultaa. + + +Hyppijöitä käytetään siirtämään tavaroita säilöihin tai niistä pois, sekä poimimaan automaattisesti niihin heitettyjä tavaroita. - - Rautapalikka + + +Aktiiviset majakat heijastavat kirkkaan valonsäteen taivaalle ja antavat voimia läheisille pelaajille. Ne valmistetaan lasista, laavakivestä ja hornatähdistä, joita saa kukistamalla näivettäjän. - - Kätevä tapa säilyttää rautaa. + + +Majakat on asetettava paikkaan, jossa ne ovat auringonvalossa päiväaikaan. Majakat on asetettava rautaisen, kultaisen, smaragdisen tai timanttisen pyramidin päälle. Materiaali, jolle majakka asetetaan, ei vaikuta majakan tehoon. - - Kivilaatta + + +Kokeile käyttää majakkaa asettaaksesi sen antamat voimat. Maksuna voit käyttää annettuja rautaharkkoja. - - Kivilaatta + + +Ne voivat vaikuttaa keittotelineisiin, arkkuihin, jakelulaitteisiin, pudottajiin, kaivoskärryihin joissa on arkku, kaivoskärryihin joissa on hyppijä sekä muihin hyppijöihin. - - Hiekkakivilaatta + + +Tässä huoneessa on näytillä erilaisia hyödyllisiä hyppijän käyttömahdollisuuksia, joilla voit tehdä kokeita. - - Tammipuulaatta + + +Tämä on ilotulitekäyttöliittymä, jolla voit valmistaa ilotulitteita ja ilotulitetähtiä. - - Mukulakivilaatta + + +{*B*}Paina {*CONTROLLER_VK_A*} jatkaaksesi. +{*B*}Paina {*CONTROLLER_VK_B*}, jos tiedät jo miten ilotulitekäyttöliittymää käytetään. - - Tiililaatta + + +Hyppijät yrittävät jatkuvasti imeä ulos tavaroita sopivista säilöistä, jotka on asetettu niiden ylle. Ne myös yrittävät asettaa sisältämiään tavaroita asetussäilöön. - - Kivitiililaatta + + Jos hyppijä saa virtaa punakivestä, se sammuu ja lakkaa imemästä ja asettamasta tavaroita. - - Tammipuulaatta + + Hyppijä osoittaa suuntaan, johon se yrittää asettaa tavaroita. Jos haluat suunnata hyppijän kohti tiettyä palikkaa, aseta se palikkaa vasten hiipiessäsi. - - Kuusipuulaatta + + Näitä vihollisia löytyy suolta. Ne hyökkäävät viskomalla taikajuomia. Ne pudottavat taikajuomia kuollessaan. - - Koivupuulaatta + + Maalausten/kehysten enimmäismäärä maailmassa on saavutettu. - - Viidakkopuulaatta + + Et voi luoda vihollisia Rauhallisella vaikeustasolla. - - Hornatiililaatta + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien sikojen, lampaiden, lehmien, kissojen ja hevosten enimmäismäärä on saavutettu. - - Tiili + + Luomismunaa ei voi käyttää tällä hetkellä. Mustekalojen enimmäismäärä maailmassa on saavutettu. - - Dynamiitti + + Luomismunaa ei voi käyttää tällä hetkellä. Vihollisten enimmäismäärä maailmassa on saavutettu. - - Kirjahylly + + Luomismunaa ei voi käyttää tällä hetkellä. Kyläläisten enimmäismäärä maailmassa on saavutettu. - - Sammalkivi + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien susien enimmäismäärä on saavutettu. - - Laavakivi + + Olentojen päiden enimmäismäärä maailmassa on saavutettu. - - Soihtu + + Katso peilistä - - Soihtu (kivihiili) + + Vasenkätisyys - - Soihtu (puuhiili) + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien kanojen enimmäismäärä on saavutettu. - - Tuli + + Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien sienilehmien enimmäismäärä on saavutettu. - - Hirviönluoja + + Veneiden enimmäismäärä maailmassa on saavutettu. - - Tammipuuportaat + + Luomismunaa ei voi käyttää tällä hetkellä. Kanojen enimmäismäärä maailmassa on saavutettu. - - Arkku + + +{*C2*}Vedäpä henkeä. Vielä uudestaan. Tunne ilma keuhkoissasi. Anna raajojesi palata. Niin, liikuta sormiasi. Omaksu taas keho, joka on painovoiman alainen, ilmassa. Synny uudelleen pitkään uneen. Siinähän sinä oletkin. Kehosi koskettaa taas universumia joka kohdasta, kuin olisitte erillisiä. Kuin mekin olisimme erillisiä.{*EF*}{*B*}{*B*} +{*C3*}Keitä me olemme? Joskus meitä kutsuttiin vuorenhengeksi. Isä auringoksi, äiti kuuksi. Muinaisiksi hengiksi, eläinhengiksi. Jinneiksi. Aaveiksi. Vihreäksi mieheksi. Sitten jumaliksi, demoneiksi. Enkeleiksi. Räyhähengiksi. Muukalaisiksi, maan ulkopuolisiksi. Leptoneiksi, kvarkeiksi. Sanat muuttuvat. Me emme muutu.{*EF*}{*B*}{*B*} +{*C2*}Me olemme universumi. Me olemme kaikkea, minkä luulet olevan jotain muuta kuin sinä itse. Katsot meitä nyt, ihollasi ja silmilläsi. Ja miksi universumi sitten koskettaa ihoasi ja loistaa valoa yllesi? Jotta se näkisi sinut, pelaaja. Oppiakseen tuntemaan sinut. Ja tullakseen tunnetuksi. Minä kerron sinulle tarinan.{*EF*}{*B*}{*B*} +{*C2*}Olipa kerran pelaaja.{*EF*}{*B*}{*B*} +{*C3*}Se palaaja olit sinä, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Joskus hän piti itseään ihmisenä, joka eli sulan kivipallon ohuella ulkokuorella. Tuo sulan kiven täyttämä pallo kiersi loistavana palavaa kaasupalloa, joka oli sitä kolmekymmentätuhatta kertaa suurempi. Ne olivat niin kaukana toisistaan, että valolta kesti kahdeksan minuuttia kulkea tuo matka. Valo oli tietoa tähdestä, ja se pystyi kärventämään ihosi 150 miljoonan kilometrin päästä.{*EF*}{*B*}{*B*} +{*C2*}Joskus pelaaja uneksi olevansa kaivostyöläinen maanpinnalla, joka oli tasainen ja loputon. Aurinko oli valkoinen neliö. Päivät olivat lyhyitä ja tekemistä oli paljon – ja kuolema oli vain väliaikainen pikku haitta.{*EF*}{*B*}{*B*} +{*C3*}Joskus pelaaja uneksi joutuneensa eksyksiin tarinaan.{*EF*}{*B*}{*B*} +{*C2*}Joskus pelaaja uneksi olevansa jotain muuta, jossain muualla. Joskus unet olivat häiritseviä. Joskus taas hyvin kauniita. Joskus pelaaja heräsi yhdestä unesta toiseen, ja siitä edelleen kolmanteen.{*EF*}{*B*}{*B*} +{*C3*}Joskus pelaaja uneksi katselevansa sanoja näytöllä.{*EF*}{*B*}{*B*} +{*C2*}Palataan takaisin.{*EF*}{*B*}{*B*} +{*C2*}Pelaajan atomit olivat hajallaan ruohikolla, joissa, ilmassa, maassa. Nainen keräsi atomit; hän joi ja söi ja hengitti; ja nainen kokosi pelaajan kehoonsa.{*EF*}{*B*}{*B*} +{*C2*}Niinpä pelaaja heräsi äitinsä kehon lämpimästä ja pimeästä maailmasta pitkään uneen.{*EF*}{*B*}{*B*} +{*C2*}Ja pelaaja oli uusi tarina, jota ei koskaan ennen ollut kerrottu, kirjoitettu DNA:n kirjaimin. Ja pelaaja oli uusi ohjelma, jota ei ollut koskaan käynnistetty, jonka pohjana oli miljardeja vuosia vanha lähdekoodi. Ja pelaaja oli uusi ihminen, joka ei ollut koskaan ennen ollut elossa, valmistettu pelkästä maidosta ja rakkaudesta.{*EF*}{*B*}{*B*} +{*C3*}Sinä olet pelaaja. Tarina. Ohjelma. Ihminen. Valmistettu pelkästä maidosta ja rakkaudesta.{*EF*}{*B*}{*B*} +{*C2*}Palataan vielä taaksepäin.{*EF*}{*B*}{*B*} +{*C2*}Seitsemän miljardia miljardia miljardia atomia pelaajan kehossa luotiin kauan ennen tätä peliä, tähden sydämessä. Joten myös pelaaja on tietoa tähdestä. Ja pelaaja liikkuu tarinassa, joka on Julian-nimisen miehen istuttama tietometsä, Markus-nimisen miehen luomassa loputtomassa ja tasaisessa maailmassa, joka sijaitsee pienessä yksityisessä maailmassa, jonka loi pelaaja, joka asuu universumissa, jonka loi...{*EF*}{*B*}{*B*} +{*C3*}Hys. Joskus pelaaja loi pienen yksityisen maailman, joka oli pehmeä, lämmin ja yksinkertainen. Joskus se taas oli kova, kylmä ja monimutkainen. Joskus hän rakensi universumin mallin päässään; energiahiukkasia, jotka liikkuivat valtavan tyhjyyden halki. Joskus hän kutsui noita hiukkasia "elektroneiksi" ja "protoneiksi".{*EF*}{*B*}{*B*} - - Punakivipöly + + +{*C2*}Joskus hän kutsui niitä "planeetoiksi" ja "tähdiksi".{*EF*}{*B*}{*B*} +{*C2*}Joskus hän uskoi olevansa universumissa joka koostui päälle/pois-energiasta; nollista ja ykkösistä; koodiriveistä. Joskus hän uskoi pelaavansa peliä. Joskus hän uskoi lukevansa sanoja näytöltä.{*EF*}{*B*}{*B*} +{*C3*}Sinä olet pelaaja, lukemassa sanoja...{*EF*}{*B*}{*B*} +{*C2*}Hys... Joskus pelaaja luki koodirivejä näytöltä. Muunsi ne sanoiksi; muunsi sanat tarkoitukseksi; muunsi tarkoituksen tunteiksi, teorioiksi, ideoiksi. Ja pelaaja alkoi hengittää nopeammin ja syvemmin ja tajusi olevansa elossa. Elossa – ne tuhannet kuolemat eivät olleet totta, pelaaja oli elossa.{*EF*}{*B*}{*B*} +{*C3*}Sinä. Sinä. Sinä olet elossa.{*EF*}{*B*}{*B*} +{*C2*}Ja joskus pelaaja kuvitteli universumin puhuneen hänelle auringonvalolla, joka paistoi kesäisten puiden havisevien lehtien lomasta.{*EF*}{*B*}{*B*} +{*C3*}Ja joskus pelaaja uskoi universumin puhuneen hänelle valolla, joka tuikki kirpeältä talviselta yötaivaalta. Silloin valonhäive pelaajan silmäkulmassa olisi saattanut olla miljoona kertaa aurinkoa suurempi tähti, joka oli kiehauttanut planeettansa plasmaksi ollakseen vain hetken näkyvissä pelaajalle. Pelaajalle joka oli kävelemässä kotiinsa universumin kaukaisella laidalla haistaen yllättäen ruuan, miltei jo tutulla ovella, pian taas uneksimassa.{*EF*}{*B*}{*B*} +{*C2*}Ja joskus pelaaja uskoi universumin puhuneen hänelle nollilla ja ykkösillä, maailman sähköisyydellä, näytöllä vierivillä sanoilla unen lopussa.{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Minä rakastan sinua."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Olet pelannut peliä hyvin."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Kaiken tarvitsemasi löydät sisältäsi."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Olet vahvempi kuin aavistat."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Sinä olet päivänvalo."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Sinä olet yö."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Pimeys, jota vastustat, on sisälläsi."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Valo, jota etsit, on sisälläsi."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Sinä et ole yksin."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Sinä et ole erossa kaikesta muusta."{*EF*}{*B*}{*B*} +{*C3*}Ja universumi sanoi: "Sinä olet universumi, joka maistaa itseään, puhuu itselleen, lukee omaa koodiaan."{*EF*}{*B*}{*B*} +{*C2*}Ja universumi sanoi: "Minä rakastan sinua, koska olet rakkaus."{*EF*}{*B*}{*B*} +{*C3*}Ja niin peli päättyi ja pelaaja heräsi unestaan. Ja pelaaja alkoi nähdä uutta unta. Ja pelaaja uneksi jälleen, uneksi paremmin. Ja pelaaja oli universumi. Ja pelaaja oli rakkaus.{*EF*}{*B*}{*B*} +{*C3*}Sinä olet pelaaja.{*EF*}{*B*}{*B*} +{*C2*}Herää.{*EF*} - - Timanttimalmi + + Nollaa Horna - - Timanttipalikka + + %s on saapunut Ääreen - - Kätevä tapa säilyttää timantteja. + + %s on poistunut Äärestä - - Työpöytä + + +{*C3*}Näen sen pelaajan, jota tarkoitit.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Niin. Ole varovainen. Hän on päässyt ylemmälle tasolle. Hän voi lukea ajatuksemme.{*EF*}{*B*}{*B*} +{*C2*}Se ei haittaa. Hän luulee, että olemme osa peliä.{*EF*}{*B*}{*B*} +{*C3*}Minä pidän tästä pelaajasta. Hän on pelannut hyvin. Ei luovuttanut.{*EF*}{*B*}{*B*} +{*C2*}Hän lukee ajatuksemme kuin ne olisivat vain sanoja näytöllä.{*EF*}{*B*}{*B*} +{*C3*}Sillä tavoin hän haluaa kuvitella monia asioita, kun hän on vaipunut syvälle pelin uneen.{*EF*}{*B*}{*B*} +{*C2*}Sanat ovat loistava käyttöliittymä. Erittäin mukautuva. Ja vähemmän pelottava kuin näytön takaisen todellisuuden tuijottaminen.{*EF*}{*B*}{*B*} +{*C3*}Ennen he kuulivat ääniä. Silloin kun pelaajat eivät osanneet lukea. Ennen vanhaan he, jotka eivät pelanneet, kutsuivat pelaajia noidiksi ja velhoiksi. Ja pelaajat uneksivat lentävänsä ilmassa kepeillä, jotka kulkivat demonien voimalla.{*EF*}{*B*}{*B*} +{*C2*}Mistä tämä pelaaja uneksi?{*EF*}{*B*}{*B*} +{*C3*}Hän uneksi auringonpaisteesta ja puista. Tulesta ja vedestä. Hän uneksi luovansa. Ja hän uneksi tuhoavansa. Hän uneksi olevansa metsästäjä ja hän uneksi olevansa saalis. Hän uneksi suojapaikasta.{*EF*}{*B*}{*B*} +{*C2*}Hah, alkuperäinen käyttöliittymä. Se on miljoona vuotta vanha, mutta toimii yhä. Mutta mitä oikeita rakennelmia tämä pelaaja loi näytön takaisessa todellisuudessa?{*EF*}{*B*}{*B*} +{*C3*}Hän työskenteli miljoonien muiden kanssa luodakseen todellisen maailman {*EF*}{*NOISE*}{*C3*} taitteeseen, ja loi {*EF*}{*NOISE*}{*C3*} varten {*EF*}{*NOISE*}{*C3*}, joka {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Hän ei pysty lukemaan äskeistä ajatusta.{*EF*}{*B*}{*B*} +{*C3*}Ei niin. Hän ei ole vielä saavuttanut korkeinta tasoa. Se hänen täytyy saavuttaa elämän pitkän unen aikana, ei pelin lyhyessä unessa.{*EF*}{*B*}{*B*} +{*C2*}Tietääkö hän, että rakastamme häntä? Että universumi on ystävällinen?{*EF*}{*B*}{*B*} +{*C3*}Kyllä, hän kuulee joskus universumin ajatustensa melun läpi.{*EF*}{*B*}{*B*} +{*C2*}Mutta toisinaan hän on surullinen pitkässä unessa. Hän luo maailmoja, joissa ei ole kesää. Hän värisee pimeän auringon alla ja vie surullisen luomuksensa todellisuuteen.{*EF*}{*B*}{*B*} +{*C3*}Jos hänet parantaisi surusta, se tuhoaisi hänet. Suru on osa hänen omaa tehtäväänsä. Emme saa sekaantua siihen.{*EF*}{*B*}{*B*} +{*C2*}Joskus, kun he ovat syvässä unessa, haluaisin kertoa heille, että he rakentavat oikeasti todellisia maailmoja. Joskus haluaisin kertoa heille heidän tärkeydestään universumille. Ja joskus, kun he eivät ole päässeet kunnon yhteyteen pitkään aikaan, haluaisin auttaa heitä lausumaan pelkäämänsä sanan.{*EF*}{*B*}{*B*} +{*C3*}Hän luki ajatuksemme.{*EF*}{*B*}{*B*} +{*C2*}Joskus en piittaa siitä. Joskus tahtoisin kertoa heille, että tämä heidän todellisena pitämänsä maailma on vain {*EF*}{*NOISE*}{*C2*} ja {*EF*}{*NOISE*}{*C2*}. Tahtoisin kertoa heille, että he ovat {*EF*}{*NOISE*}{*C2*} suuressa {*EF*}{*NOISE*}{*C2*}. He näkevät niin vähän todellisuutta pitkässä unessaan.{*EF*}{*B*}{*B*} +{*C3*}Mutta silti he pelaavat peliä.{*EF*}{*B*}{*B*} +{*C2*}Olisi niin helppoa kertoa heille...{*EF*}{*B*}{*B*} +{*C3*}Se olisi tälle unelle liian voimallista. Jos kertoisimme heille, miten elää, se estäisi heitä elämästä.{*EF*}{*B*}{*B*} +{*C2*}Minä en kerro pelaajalle, miten elää.{*EF*}{*B*}{*B*} +{*C3*}Pelaaja käy kärsimättömäksi.{*EF*}{*B*}{*B*} +{*C2*}Minä kerron pelaajalle tarinan.{*EF*}{*B*}{*B*} +{*C3*}Mutta älä totuutta.{*EF*}{*B*}{*B*} +{*C2*}En niin. Tarinan, joka sisältää totuuden turvallisessa muodossa, sanojen häkissä. En alastonta totuutta, joka polttaisi matkojenkin päästä.{*EF*}{*B*}{*B*} +{*C3*}Anna hänelle taas keho.{*EF*}{*B*}{*B*} +{*C2*}Annan kyllä. Pelaaja...{*EF*}{*B*}{*B*} +{*C3*}Käytä hänen nimeään.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Pelien pelaaja.{*EF*}{*B*}{*B*} +{*C3*}Hyvä.{*EF*}{*B*}{*B*} - - Viljelyskasvit + + Haluatko varmasti nollata Hornan sen oletustilaan tässä tallenteessa? Menetät kaiken, mitä olet Hornassa rakentanut! - - Viljelysmaa + + Luomismunaa ei voi käyttää tällä hetkellä. Sikojen, lampaiden, lehmien, kissojen ja hevosten enimmäismäärä on saavutettu. - - Uuni + + Luomismunaa ei voi käyttää tällä hetkellä. Sienilehmien enimmäismäärä on saavutettu. - - Kyltti + + Luomismunaa ei voi käyttää tällä hetkellä. Susien enimmäismäärä maailmassa on saavutettu. - - Puuovi + + Nollaa Horna - - Tikkaat + + Älä nollaa Hornaa - - Raide + + Tätä sienilehmää ei voi keritä tällä hetkellä. Sikojen, lampaiden, lehmien, kissojen ja hevosten enimmäismäärä on saavutettu. - - Sähköraide + + Kuolit! - - Paljastinraide + + Maailman asetukset - - Kiviportaat + + Saa rakentaa ja louhia - - Vipu + + Saa käyttää ovia ja kytkimiä - - Painelaatta + + Luo rakennelmia - - Rautaovi + + Täysin tasainen maailma - - Punakivimalmi + + Bonusarkku - - Punakivisoihtu + + Saa avata säilytysastioita - - Näppäin + + Potkaise pelaaja - - Lumi + + Saa lentää - - Jää + + Väsyminen pois päältä - - Kaktus + + Saa hyökätä pelaajien kimppuun - - Savi + + Saa hyökätä eläinten kimppuun - - Sokeriruoko + + Moderaattori - - Jukeboksi + + Istunnon järjestäjän oikeudet - - Aita + + Peliohje - - Kurpitsa + + Ohjaus - - Kurpitsalyhty + + Asetukset - - Hornakivi + + Synny uudelleen - - Sieluhiekka + + Ladattavan sisällön tarjoukset - - Hehkukivi + + Vaihda ulkoasua - - Portaali + + Tekijät - - Lasuriittimalmi + + Dynamiitti räjähtää - - Lasuriittipalikka + + Pelaaja vastaan pelaaja - - Kätevä tapa säilyttää lasuriittia. + + Luota pelaajiin - - Jakelulaite + + Asenna sisältö uudestaan - - Sävelpalikka + + Virheenkorjausasetukset - - Kakku + + Tuli leviää - - Sänky + + Äärilisko - - Verkko + + {*PLAYER*} kuoli Ääriliskon henkäykseen - - Korkea ruoho + + {*PLAYER*} kuoli, koska {*SOURCE*} tappoi hänet - - Kuollut pensas + + {*PLAYER*} kuoli, koska {*SOURCE*} tappoi hänet - - Diodi + + {*PLAYER*} kuoli - - Lukittu arkku + + {*PLAYER*} räjähti - - Lattialuukku + + {*PLAYER*} kuoli taikuuteen - - Villa (minkä värinen tahansa) + + {*SOURCE*} ampui pelaajaa {*PLAYER*} - - Mäntä + + Peruskallion peitto - - Tarttumamäntä + + Näytä HUD-näyttö - - Sokeritoukkapalikka + + Näytä käsi - - Kiviiilet + + {*SOURCE*} ampui pelaajaa {*PLAYER*} tulipallolla - - Sammaleiset kivitiilet + + {*SOURCE*} pommitti pelaajaa {*PLAYER*} - - Halkeilleet kivitiilet + + {*SOURCE*} tappoi pelaajan {*PLAYER*} taikuudella - - Veistetyt kivitiilet + + {*PLAYER*} tipahti ulos maailmasta - - Sieni + + Tekstuuripaketit - - Sieni + + Yhdistelmäpaketit - - Rautatangot + + {*PLAYER*} syttyi tuleen - - Lasilevy + + Teemat - - Meloni + + Pelaajakuvat - - Kurpitsan varsi + + Avatar-esineet - - Melonin varsi + + {*PLAYER*} paloi kuoliaaksi - - Köynnökset + + {*PLAYER*} kuoli nälkään - - Aidan portti + + {*PLAYER*} pisteltiin kuoliaaksi - - Tiiliportaat + + {*PLAYER*} tippui maahan liian kovaa - - Kivitiiliportaat + + {*PLAYER*} yritti uida laavassa - - Sokeritoukkakivi + + {*PLAYER*} tukehtui seinään - - Sokeritoukkamukulakivi + + {*PLAYER*} hukkui - - Sokeritoukkakivitiili + + Kuolinviestit - - Sienirihma + + Et ole enää moderaattori - - Lumpeenlehti + + Nyt voit lentää - - Hornatiili + + Et voi enää lentää - - Hornatiiliaita + + Et voi enää hyökätä eläinten kimppuun - - Hornatiiliportaat + + Nyt voit hyökätä eläinten kimppuun - - Hornapahka + + Olet nyt moderaattori - - Lumouspöytä + + Et enää väsy - - Keittoteline + + Nyt olet haavoittumaton - - Pata + + Et ole enää haavoittumaton - - Ääriportaali + + %d MSP - - Ääriportaalin kehys + + Nyt väsyt - - Äärikivi + + Nyt olet näkymätön - - Lohikäärmeen muna + + Et ole enää näkymätön - - Puska + + Nyt voit hyökätä pelaajien kimppuun - - Saniainen + + Nyt voit louhia ja käyttää esineitä - - Hiekkakiviportaat + + Et voi enää asettaa palikoita - - Kuusipuuportaat + + Nyt voit asettaa palikoita - - Koivupuuportaat + + Animoitu hahmo - - Viidakkopuuportaat + + Muokattu ulkoasun animaatio - - Punakivilamppu + + Et voi enää louhia tai käyttää esineitä - - Kaakao + + Nyt voit käyttää ovia ja kytkimiä - - Pääkallo + + Et voi enää hyökätä olentojen kimppuun - - Nykyinen ohjaus + + Nyt voit hyökätä olentojen kimppuun - - Malli + + Et voi enää hyökätä pelaajien kimppuun - - Liiku/juokse + + Et voi enää käyttää ovia tai kytkimiä - - Katso + + Nyt voit käyttää säilytysastioita (kuten arkkuja) - - Tauota + + Et voi enää käyttää säilytysastioita (kuten arkkuja) - - Hyppää + + Näkymätön - - Hyppää/lennä ylös + + Majakat + + + {*T3*}PELIOHJE: MAJAKAT{*ETW*}{*B*}{*B*} +Aktiiviset majakat heijastavat kirkkaan valonsäteen taivaalle ja antavat voimia läheisille pelaajille.{*B*} +Ne valmistetaan lasista, laavakivestä ja hornatähdistä, joita saa kukistamalla näivettäjän.{*B*}{*B*} +Majakat on asetettava paikkaan, missä ne ovat auringonvalossa päiväaikaan. Majakat on asetettava rautaisen, kultaisen, smaragdisen tai timanttisen pyramidin päälle.{*B*} +Materiaali, jolle majakka asetetaan, ei vaikuta majakan tehoon.{*B*}{*B*} +Majakkavalikosta voi valita majakalle yhden ensisijaisen voiman. Mitä enemmän pyramidilla on tasoja, sitä suurempi voimavalikoima on.{*B*} +Majakka pyramidilla, jolla on vähintään neljä tasoa, antaa lisäksi valita toissijaiseksi voimaksi paranemisen tai voimakkaamman ensisijaisen voiman.{*B*}{*B*} +Jotta voisit asettaa majakkasi voimat, sinun on uhrattava yksi smaragdi, timantti, kultaharkko tai rautaharkko maksupaikkaan.{*B*} +Kun voimat on asetettu, ne säteilevät majakasta loputtomasti.{*B*} + - - Tavaraluettelo + + Ilotulitteet + + + Kielet + + + Hevoset + + + {*T3*}PELIOHJE: HEVOSET{*ETW*}{*B*}{*B*} +Hevosia ja aaseja löytyy pääasiassa avoimilta tasangoilta. Muulit ovat aasien ja hevosten jälkeläisiä, jotka eivät itse voi lisääntyä.{*B*} +Kaikilla täysikasvuisilla hevosilla, aaseilla ja muuleilla voi ratsastaa. Vain hevosia voi kuitenkin panssaroida, ja vain muuleille ja aaseille voi laittaa satulalaukut tavaroiden kuljettamista varten.{*B*}{*B*} +Hevoset, aasit ja muulit täytyy kesyttää, ennen kuin niitä voi käyttää. Hevosen saa kesytettyä yrittämällä ratsastaa sillä ja pysymällä sen selässä, kun se yrittää pudottaa ratsastajan.{*B*} +Kun hevosen ympärille ilmestyy rakkaussydämiä, se on kesy eikä yritä enää heittää pelaajaa selästään. Jotta hevosta voi ohjata, pelaajan täytyy laittaa sille satula.{*B*}{*B*} +Satuloita voi ostaa kyläläisiltä tai löytää maailmaan kätketyistä arkuista.{*B*} +Kesyille aaseille ja muuleille voi antaa satulalaukut kiinnittämällä arkun. Näitä satulalaukkuja voi sitten käyttää ratsastettaessa tai hiipiessä.{*B*}{*B*} +Hevoset ja aasit (mutta ei muuleja) saa lisääntymään muiden eläinten tavoin käyttämällä kultaisia omenoita tai kultaisia porkkanoita.{*B*} +Varsoista kasvaa ajan mittaan täysikasvuisia hevosia, joskin kasvamista voi nopeuttaa syöttämällä niille vehnää tai heinää.{*B*} + - - Selaa käden esinettä + + {*T3*}PELIOHJE: ILOTULITTEET{*ETW*}{*B*}{*B*} +Ilotulitteet ovat koriste-esineitä, jotka voi laukaista kädestä tai jakelulaitteella. Ne valmistetaan paperista, ruudista ja valinnaisesti erilaisista ilotulitetähdistä.{*B*} +Ilotuliteähtien värejä, hiipumista, muotoa, kokoa ja vaikutuksia (kuten vana ja tuikkiminen) voi muokata käyttämällä valmistuksessa ylimääräisiä ainesosia.{*B*}{*B*} +Kun haluat valmistaa ilotulitteen, aseta ruuti ja paperi 3x3-kokoiseen valmistusruudukkoon, joka näkyy tavaraluettelosi yläpuolella.{*B*} +Vaihtoehtoisesti voit lisätä ilotulitteeseen useita ilotulitetähtiä asettamalla ne valmistusruudukkoon.{*B*} +Jos täytät useampia paikkoja valmistusruudukosta ruudilla, se kasvattaa korkeutta, jossa kaikki ilotulitetähdet räjähtävät.{*B*}{*B*} +Sitten voit ottaa valmiin ilotulitteen tuottopaikkaan.{*B*}{*B*} +Ilotulitetähtiä valmistetaan asettamalla ruutia ja väriainetta valmistusruudukkoon.{*B*} +- Väriaine määrittää ilotulitetähden räjähdyksen värin.{*B*} +- Ilotulitetähden muoto määritetään lisäämällä joko tulilataus, kultahippu, höyhen tai olennonpää.{*B*} +- Vana tai tuikkiminen voidaan lisätä timanteilla tai hehkukivipölyllä.{*B*}{*B*} +Kun ilotulitetähti on valmis, voit asettaa sen hiipumisvärin käyttämällä väriainetta. + + + {*T3*}PELIOHJE: PUDOTTAJAT{*ETW*}{*B*}{*B*} +Kun pudottajalle annetaan virtaa punakivellä, se pudottaa maahan satunnaisen sisältämänsä esineen. Avaa pudottaja painamalla {*CONTROLLER_ACTION_USE*}, niin voit ladata pudottajaan esineitä tavaraluettelostasi.{*B*} +Jos pudottaja on suunnattu arkkua tai toisentyyppistä säilöä päin, esine sijoitetaan sen sisään. On mahdollista rakentaa pudottajista pitkä ketju esineiden kuljettamiseksi matkan päähän. Jotta tämä onnistuu, niille pitää vuoroin antaa virtaa ja katkaista se. + + + Muuttuu käytettäessä kartaksi siitä osasta maailmaa, jolla sillä hetkellä olet, ja täydentyy tutkiessasi. + + + Putoaa näivettäjältä. Käytetään majakan valmistamiseen. + + + Hyppijät + + + {*T3*}PELIOHJE: HYPPIJÄT{*ETW*}{*B*}{*B*} +Hyppijöitä käytetään siirtämään tavaroita säilöihin tai niistä pois, sekä poimimaan automaattisesti niihin heitettyjä tavaroita.{*B*} +Ne voivat vaikuttaa keittotelineisiin, arkkuihin, jakelulaitteisiin, pudottajiin, kaivoskärryihin joissa on arkku, kaivoskärryihin joissa on hyppijä sekä muihin hyppijöihin.{*B*}{*B*} +Hyppijät yrittävät jatkuvasti imeä ulos tavaroita sopivista säilöistä, jotka on asetettu niiden ylle. Ne myös yrittävät asettaa sisältämiään tavaroita asetussäilöön.{*B*} +Jos hyppijä saa virtaa punakivestä, se sammuu ja lakkaa imemästä ja asettamasta tavaroita.{*B*}{*B*} +Hyppijä osoittaa suuntaan, johon se yrittää asettaa tavaroita. Jos haluat suunnata hyppijän kohti tiettyä palikkaa, aseta se palikkaa vasten hiipiessäsi.{*B*} + - - Toiminto + + Pudottajat - - Käytä + + EI KÄYTÖSSÄ - - Valmistaminen + + välitön elinvoima - - Tiputa + + välitön vahinko - - Hiivi + + tehostettu hyppy - - Hiivi/lennä alas + + louhintauupumus - - Vaihda kameratilaa + + voima - - Pelaajat/kutsu + + heikkous - - Liikkuminen (lentäessä) + + pahoinvointi - - Malli 1 + + EI KÄYTÖSSÄ - - Malli 2 + + EI KÄYTÖSSÄ - - Malli 3 + + EI KÄYTÖSSÄ - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + paraneminen - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + kesto - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Etsitään siementä maailmageneraattoria varten - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Luovat aktivoitaessa värikkäitä räjähdyksiä. Väri, vaikutus, muoto ja hiipuminen määritellään ilotulitetähdellä, jota käytetään ilotulitetta luotaessa. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Kiskot jotka voivat ottaa käyttöön ja poistaa käytöstä kaivoskärryjä, joissa on hyppijä, sekä aktivoida kaivoskärryjä, joissa on dynamiittia. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Käytetään varastoimaan ja tiputtamaan tavaroita, tai työntämään tavaroita toiseen säilöön, kun se saa punakivilatauksen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Värikkäitä palikoita, joita valmistetaan värjäämällä kovetettua savea. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Tuottaa punakivilatauksen. Lataus on vahvempi, jos laatalla on useampia esineitä. Vaatii enemmän painoa kuin kevyt laatta. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Käytetään punakivivoimanlähteenä. Voidaan muuttaa takaisin punakiveksi. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Käytetään keräämään tavaroita tai siirtämään tavaroita sisään ja ulos säilöistä. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Voidaan syöttää hevosille, aaseille tai muuleille, mikä parantaa 10 sydäntä. Nopeuttaa varsojen kasvua. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Lepakko - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Näitä lentäviä otuksia löytyy luolista tai muista suurista suljetuista tiloista. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Noita - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Valmistetaan sulattamalla savea ahjossa. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Valmistetaan lasista ja väriaineesta. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Valmistetaan värjätystä lasista. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Tuottaa punakivilatauksen. Lataus on vahvempi, jos laatalla on useampia esineitä. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Palikka, joka lähettää punakivisignaalia perustuen auringonvaloon (tai sen puutteeseen). - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Erikoiskaivoskärry, joka toimii hyppijän tavoin. Se kerää kiskoilla lojuvat ja sen yllä olevissa säilöissä olevat tavarat. - - {*B*}Paina{*CONTROLLER_VK_A*} jatkaaksesi. + + Erikoispanssari, jonka voi pukea hevoselle. Antaa panssariin +5. - - {*B*}Paina{*CONTROLLER_VK_A*} aloittaaksesi opetuspelin.{*B*} - Paina{*CONTROLLER_VK_B*}, jos arvelet olevasi valmis pelaamaan omillasi. + + Käytetään määrittämään ilotulitteen väri, vaikutus ja muoto. - - Minecraft on peli, missä palikoita asettamalla voi rakentaa mitä tahansa kuvitteleekin. -Öisin hirviöt tulevat esiin, joten rakenna itsellesi suoja ennen kuin niin tapahtuu. + + Käytetään punakivipiireissä ylläpitämään, vertaamaan tai pienentämään signaalin voimakkuutta, tai mittaamaan tiettyjä palikoiden tiloja. - - Katso ylös, alas ja ympärillesi painamalla{*CONTROLLER_ACTION_LOOK*}. + + Kaivoskärry, joka toimi liikkuvana dynamiittipalikkana. - - Liiku painamalla{*CONTROLLER_ACTION_MOVE*}. + + Erikoispanssari, jonka voi pukea hevoselle. Antaa panssariin +7. - - Jos haluat juosta, paina{*CONTROLLER_ACTION_MOVE*} eteenpäin kaksi kertaa nopeasti. Kun pidät{*CONTROLLER_ACTION_MOVE*} painettuna eteenpäin, hahmo jatkaa juoksua, kunnes juoksuaika tai ruoka loppuu. + + Käytetään komentojen suorittamiseen. - - Hyppää painamalla{*CONTROLLER_ACTION_JUMP*}. + + Heijastaa valonsäteen taivaalle ja voi aiheuttaa tilavaikutuksia läheisiin pelaajiin. - - Louhi tai hakkaa kädelläsi tai esineellä, jota pidät kädessäsi, pitämällä{*CONTROLLER_ACTION_ACTION*} painettuna. Joidenkin palikoiden louhimiseksi sinun pitää ehkä valmistaa työkalu... + + Sen sisään voi varastoida palikoita ja esineitä. Kahden arkun asettaminen rinnakkain luo suuremman arkun, joka kaksinkertaistaa varastotilan. Ansoitettu arkku luo lisäksi punakivilatauksen sitä avattaessa. - - Hakkaa 4 puupalikkaa (puunrunkoja) pitämällä{*CONTROLLER_ACTION_ACTION*} painettuna.{*B*}Kun palikka hajoaa, voit poimia sen ylös seisomalla ilmestyneen leijuvan esineen lähellä, jolloin se siirtyy tavaraluetteloosi. + + Erikoispanssari, jonka voi pukea hevoselle. Antaa panssariin +11. - - Avaa valmistusvalikko painamalla{*CONTROLLER_ACTION_CRAFTING*}. + + Käytetään sitomaan olentoja pelaajaan tai aidanpylväisiin. - - Kun keräät ja valmistat lisää esineitä, tavaraluettelosi täyttyy.{*B*} - Avaa tavaraluettelo painamalla{*CONTROLLER_ACTION_INVENTORY*}. + + Käytetään maailman olentojen nimeämiseen. - - Kun liikut ympäriinsä, louhit ja hyökkäät, ruokapalkkisi{*ICON_SHANK_01*} kuluu. Juokseminen ja hyppiminen juostessa kuluttavat paljon enemmän ruokaa kuin kävely ja normaali hyppiminen. + + kiire - - Jos menetät elinvoimaa, mutta ruokapalkissasi on 9{*ICON_SHANK_01*} tai enemmän, elinvoimasi paranee automaattisesti. Ruuan syöminen palauttaa ruokapalkkia. + + Avaa koko peli - - Kun kädessäsi on ruokaa, voit syödä sen pitämällä{*CONTROLLER_ACTION_USE*} painettuna, jolloin ruokapalkkisi palautuu. Et voi syödä, jos ruokapalkki on täynnä. + + Jatka peliä - - Ruokapalkkisi on alhainen, ja olet menettänyt elinvoimaa. Palauta ruokapalkkiasi ja ala parantua syömällä paistettu pihvi tavaraluettelostasi.{*ICON*}364{*/ICON*} + + Tallenna peli - - Keräämästäsi puusta voi valmistaa lankkuja. Avaa valmistusvalikko tehdäksesi niin.{*PlanksIcon*} + + Pelaa peliä - - Usein valmistaminen vaatii useita vaiheita. Nyt kun sinulla on lankkuja, voit tehdä enemmän esineitä. Valmista työpöytä.{*CraftingTableIcon*} + + Tulostilastot - - Jotta saisit nopeutettua palikoiden keräämistä, voit valmistaa tarkoitukseen sopivia työkaluja. Joissain työkaluissa on kepeistä valmistettu kädensija. Valmista nyt keppejä.{*SticksIcon*} + + Ohjeet ja asetukset - - Vaihda kädessäsi pitämää esinettä painamalla{*CONTROLLER_ACTION_LEFT_SCROLL*} tai{*CONTROLLER_ACTION_RIGHT_SCROLL*}. + + Vaikeustaso: - - Käytä esineitä, vuorovaikuta ja aseta joitain esineitä painamalla{*CONTROLLER_ACTION_USE*}. Asetetut esineet voi poimia uudestaan louhimalla ne oikealla työkalulla. + + PvP: - - Kun työpöytä on valittuna, vie osoitin haluamaasi kohtaan ja aseta työpöytä siihen painamalla{*CONTROLLER_ACTION_USE*}. + + Luota pelaajiin: - - Avaa työpöytä siirtämällä osoitin sen kohdalle ja painamalla{*CONTROLLER_ACTION_USE*}. + + Dynamiitti: - - Lapiolla saa kaivettua nopeammin pehmeitä palikoita, kuten maata ja lunta. Kun keräät enemmän materiaaleja, pystyt valmistamaan työkaluja, jotka kestävät pidempään ja joiden avulla työskentely on nopeampaa. Valmista puulapio.{*WoodenShovelIcon*} + + Pelityyppi: - - Kirveellä saa hakattua nopeammin puuta ja puutiiliä. Kun keräät enemmän materiaaleja, pystyt valmistamaan työkaluja, jotka kestävät pidempään ja joiden avulla työskentely on nopeampaa. Valmista puukirves.{*WoodenHatchetIcon*} + + Rakennelmat: - - Hakulla saa louhittua nopeammin kovia palikoita, kuten kiveä ja malmia. Kun keräät enemmän materiaaleja, pystyt valmistamaan työkaluja, jotka kestävät pidempään ja joiden avulla saa louhittua kovempia materiaaleja. Valmista puuhakku.{*WoodenPickaxeIcon*} + + Kenttätyyppi: - - Avaa säilytysastia + + Pelejä ei löytynyt - - Yö saattaa saapua nopeasti, ja silloin on vaarallista olla ulkona, jos ei ole valmistautunut. On mahdollista valmistaa panssareita ja aseita, mutta on järkevää tehdä myös turvallinen suojapaikka. + + Vain kutsu - - Lähistöllä on hylätty kaivosmiehen mökki, jonka saat korjattua turvalliseksi yöpaikaksi. + + Lisäasetukset - - Sinun on kerättävä resursseja mökin korjaamiseksi. Seinät ja katon voi valmistaa mistä tahansa palikoista, mutta haluat varmasti myös oven, pari ikkunaa ja valaisimia. + + Lataa - - Louhi kivipalikoita hakullasi. Kivipalikat tuottavat mukulakiveä louhittaessa. Jos keräät 8 mukulakivipalikkaa, voit rakentaa uunin. Sinun täytyy ehkä kaivaa ensin pois maata ennen kuin pääset käsiksi kiveen, joten käytä lapiota siihen tarkoitukseen.{*StoneIcon*} + + Istunnon järjestäjän asetukset - - Olet kerännyt tarpeeksi mukulakiviä uunin rakentamiseksi. Rakenna sellainen työpöydälläsi. + + Pelaajat/kutsu - - Aseta uuni maailmaan painamalla{*CONTROLLER_ACTION_USE*}, ja avaa se sitten. + + Verkkopeli - - Valmista uunin avulla puuhiiltä. Odotellessasi puuhiilen valmistumista voisit käyttää ajan hyväksesi keräämällä lisää materiaaleja suojapaikan korjaamista varten? + + Uusi maailma - - Valmista uunin avulla lasia. Odotellessasi lasin valmistumista voisit käyttää ajan hyväksesi keräämällä lisää materiaaleja suojapaikan korjaamista varten? + + Pelaajat - - Hyvässä suojapaikassa on ovi, jotta pääset helposti sisään ilman, että sinun tarvitsee louhia seinään aukko ja korjata se sitten. Valmista nyt puuovi.{*WoodenDoorIcon*} + + Liity peliin - - Aseta ovi painamalla{*CONTROLLER_ACTION_USE*}. Maailmassa olevan oven voi avata ja sulkea painamalla{*CONTROLLER_ACTION_USE*}. + + Aloita peli - - Öisin saattaa tulla erittäin pimeää, joten suojapaikkaasi kannattaa laittaa valaistusta, jotta näet ympärillesi. Valmista nyt soihtu kepeistä ja puuhiilestä valmistusvalikossa.{*TorchIcon*} + + Maailman nimi - - - Olet suorittanut opetuspelin ensimmäisen osan. - + + Siemen maailmageneraattorille - - - {*B*} - Paina{*CONTROLLER_VK_A*} jatkaaksesi opetuspeliä.{*B*} - Paina{*CONTROLLER_VK_B*}, jos arvelet olevasi valmis pelaamaan omillasi. - + + Jätä tyhjäksi, niin siemen on satunnainen - - Tämä on tavaraluettelosi. Sieltä näet kädessäsi käyttövalmiina pitämäsi esineet sekä kaikki muut mukanasi kantamat tavarat. Myös panssarisi näkyy täällä. + + Tuli leviää: - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää tavaraluetteloa, paina{*CONTROLLER_VK_B*}. + + Muokkaa kyltin viestiä: - - Liikuta osoitinta painamalla{*CONTROLLER_MENU_NAVIGATE*}. Valitse osoittimen alla oleva esine painamalla{*CONTROLLER_VK_A*}. - Jos esineitä on enemmän kuin yksi, voit poimia näin ne kaikki, tai jos painat {*CONTROLLER_VK_X*}, voit poimia puolet niistä. + + Täytä näyttökuvasi tiedot - - Siirrä tämä esine osoittimella tavaraluettelon toisen kohdan ylle ja aseta se paikoilleen painamalla{*CONTROLLER_VK_A*}. - Jos osoittimella on poimittu useita esineitä, voit asettaa ne kaikki painamalla{*CONTROLLER_VK_A*} tai yhden niistä painamalla{*CONTROLLER_VK_X*}. + + Kuvateksti - - Jos siirrät osoittimella esineen tavaraluettelon reunan ulkopuolelle, voit tiputtaa sen. + + Pelin sisäiset vinkit - - - Jos haluat tietää lisää esineestä, siirrä osoitin sen ylle ja paina{*CONTROLLER_VK_BACK*}. + + 2 pelaajan vertik. jaettu näyttö - - - Poistu nyt tavaraluettelosta painamalla{*CONTROLLER_VK_B*}. + + Valmis - - - Tämä on Luovan tilan tavaraluettelo. Sieltä näet kädessäsi käyttövalmiina pitämäsi esineet sekä kaikki muut valittavina olevat tavarat. + + Näyttökuva pelistä + + + Ei tehosteita + + + nopeus + + + hitaus + + + Muokkaa kyltin viestiä: + + + Klassiset Minecraft-tekstuurit, kuvakkeet ja käyttöliittymä! + + + Näytä kaikki yhdistelmämaailmat + + + Vinkit + + + Asenna avatar-esine 1 uudelleen + + + Asenna avatar-esine 2 uudelleen + + + Asenna avatar-esine 3 uudelleen + + + Asenna teema uudelleen + + + Asenna pelaajakuva 1 uudelleen + + + Asenna pelaajakuva 2 uudelleen + + + Asetukset + + + Käyttöliittymä + + + Nollaa oletusarvoihin + + + Kuvan keikkuminen + + + Äänet + + + Ohjaus + + + Grafiikka + + + Käytetään juomien keittämiseen. Hornanhenki tiputtaa näitä kuollessaan. + + + Sikamieszombi tiputtaa näitä kuollessaan. Sikamieszombeja löytyy Hornasta. Käytetään taikajuoman raaka-aineena. + + + Käytetään juomien keittämisessä. Näitä kasvaa luonnonvaraisina Hornan linnoituksissa. Sen voi myös istuttaa sieluhiekkaan. + + + Liukas kävellä. Muuttuu vedeksi, jos se on tuhoutuessaan toisen palikan päällä. Sulaa jos se on tarpeeksi lähellä valonlähdettä tai jos se asetetaan Hornaan. + + + Voidaan käyttää koristeena. + + + Käytetään juomien keittämiseen ja linnakkeiden etsimiseen. Niitä tiputtavat roihut, joita yleensä löytyy Hornan linnoituksista tai niiden läheltä. + + + Voi olla monenlaisia vaikutuksia, riippuen siitä, mihin sitä käytetään. + + + Käytetään juomien keittämisessä, tai voidaan valmistaa yhdessä muiden esineiden kanssa ääreläisensilmäksi tai magmavoiteeksi. + + + Käytetään juomien keittämisessä. + + + Käytetään juomien ja räjähtävien juomien valmistamiseen. + + + Sen voi täyttää vedellä ja käyttää juoman aloitusraaka-aineena keittotelineessä. + + + Tämä on myrkyllinen ruoka- ja juomaesine. Tippuu, kun pelaaja tappaa hämähäkin tai luolahämähäkin. + + + Käytetään juomien keittämisessä, pääasiassa valmistettaessa juomia, joilla on haitallinen vaikutus. + + + Kasvaa ajan mittaan, kun sen asettaa. Voidaan kerätä keritsimillä. Sitä voi kiivetä kuin tikapuita. + + + Kuin ovi, mutta käytetään pääasiassa aitojen kanssa. + + + Voidaan valmistaa meloniviipaleista. + + + Läpinäkyviä palikoita, joita voi käyttää lasipalikoiden sijasta. + + + Saadessa virtaa (käyttämällä painiketta, vipua, painelaattaa, punakivisoihtua, tai punakiveä näistä jonkun kanssa), mäntä työntyy ulos, jos pystyy, ja työntää palikoita. Kun se vetäytyy, se vetää takaisin palikan, joka koskee männän ulos työntynyttä osaa. + + + Valmistetaan kivipalikoista. Ovat tavanomaisia linnakkeissa. + + + Käytetään esteenä aidan tapaan. + + + Voidaan istuttaa kurpitsojen kasvattamiseksi. + + + Voidaan käyttää rakentamiseen tai koristeeksi. + + + Hidastaa liikkumisnopeutta, kun sen läpi kävelee. Voidaan tuhota keritsimillä siiman keräämiseksi. + + + Luo tuhottaessa sokeritoukan. Voi myös luoda sokeritoukkia, jos lähistöllä hyökätään toisen sokeritoukan kimppuun. + + + Voidaan istuttaa melonien kasvattamiseksi. + + + Ääreläinen tiputtaa näitä kuollessaan. Heitettäessä pelaaja siirtyy sinne, mihin äärenhelmi laskeutuu ja menettää hieman elinvoimaa. + + + Palikka maata, jonka päällä kasvaa ruohoa. Kerätään lapiolla. Voidaan käyttää rakentamiseen. + + + Voidaan täyttää vedellä vesiämpärin tai sateen avulla, minkä jälkeen siitä voi täyttää lasipulloja vedellä. + + + Käytetään pitkien portaiden rakentamiseen. Kaksi päällekkäin asetettua laattaa luo normaalikokoisen kahden laatan palikan. + + + Valmistetaan sulattamalla hornakiveä uunissa. Niistä voi valmistaa hornatiilipalikoita. + + + Niistä lähtee valoa, kun ne saavat virtaa. + + + Nämä ovat samantapaisia kuin näyttelyvitriinit ja niihin voi asettaa näytteille esineen tai palikan. + + + Voi luoda heitettynä ilmoitetun tyyppisiä olentoja. + + + Käytetään pitkien portaiden rakentamiseen. Kaksi päällekkäin asetettua laattaa luo normaalikokoisen kahden laatan palikan. + + + Voidaan kasvattaa kaakaopapujen keräämiseksi. + + + Lehmä + + + Tiputtaa nahkaa tapettaessa. Voidaan myös lypsää ämpärin kanssa. + + + Lammas + + + Olentojen päitä voi asettaa koristeiksi tai pitää naamiona kypäräpaikassa. + + + Mustekala + + + Tiputtaa mustepussin tapettaessa. + + + Hyödyllinen sytytettäessä asioita tuleen, tai asioiden satunnaiseen sytyttämiseen ammuttuna jakelulaitteesta. + + + Kelluu vedessä ja sen päällä voi kävellä. + + + Käytetään Hornan linnoitusten rakentamiseen. Immuuni hornanhenkien tulipalloille. + + + Käytetään Hornan linnoituksissa. + + + Näyttää heitettäessä suunnan ääriportaalille. Kun näitä asetetaan kaksitoista ääriportaalin kehykseen, ääriportaali aktivoituu. + + + Käytetään juomien keittämisessä. + + + Ruohopalikoiden kaltaisia, mutta sienet kasvavat niiden päällä erinomaisesti. + + + Löytyy Hornan linnoituksista, ja pudottaa rikottaessa hornapahkan. + + + Palikkatyyppi joka löytyy Äärestä. Se kestää hyvin räjähdyksiä, joten se on hyvä rakennusaine. + + + Tämä palikka syntyy, kun äärilisko kukistuu Ääressä. + + + Heitettynä se tiputtaa kokemuskuulia, joita keräämällä saa kasvatettua kokemuspisteitä. + + + Tämän avulla pelaaja voi lumota kokemuspisteitä käyttämällä miekkoja, hakkuja, kirveitä, jousia ja panssareita. + + + Tämän voi aktivoida kahdellatoista ääreläisensilmällä, jolloin pelaaja voi matkustaa Äären ulottuvuuteen. + + + Käytetään ääriportaalin valmistamiseen. + + + Saadessa virtaa (käyttämällä painiketta, vipua, painelaattaa, punakivisoihtua, tai punakiveä näistä jonkun kanssa), mäntä työntyy ulos, jos pystyy, ja työntää palikoita. + + + Poltetaan savesta uunissa. + + + Voidaan polttaa tiiliksi uunissa. + + + Tiputtaa rikottaessa savipaakkuja, jotka voi polttaa tiiliksi uunissa. + + + Hakataan kirveellä, ja siitä voi valmistaa lankkuja tai polttopuuta. + + + Valmistetaan uunissa hiekkaa sulattamalla. Voidaan käyttää rakentamisessa, mutta hajoaa, jos sitä yrittää louhia. + + + Louhitaan hakulla kivestä. Voidaan käyttää uunin tai kivityökalujen rakentamiseen. + + + Kätevä tapa varastoida lumipalloja. + + + Voidaan valmistaa kulhon kanssa muhennokseksi. + + + Voidaan louhia ainoastaan timanttihakulla. Tuotetaan kastelemalla vedellä paikallaan olevaa laavaa, ja sitä käytetään portaalin rakentamiseen. + + + Luo maailmaan hirviöitä. + + + Voidaan kaivaa lapiolla lumipalloiksi. + + + Tuottaa toisinaan vehnänjyviä rikottaessa. + + + Voidaan käyttää väriaineen valmistamiseen. + + + Kerätään lapiolla. Tuottaa toisinaan piikiveä, kun sitä kaivetaan. Painovoima vaikuttaa siihen, jos sen alla ei ole toista palikkaa. + + + Voidaan louhia hakulla kivihiilen keräämiseksi. + + + Voidaan louhia kivisellä tai sitä paremmalla hakulla lasuriitin keräämiseksi. + + + Voidaan louhia kivisellä tai sitä paremmalla hakulla timanttien keräämiseksi. + + + + Käytetään koristeena. + + + Voidaan louhia rautaisella tai sitä paremmalla hakulla, ja sulattaa sitten uunissa kultaharkoiksi. + + + Voidaan louhia kivisellä tai sitä paremmalla hakulla, ja sulattaa sitten uunissa rautaharkoiksi. + + + Voidaan louhia rautaisella tai sitä paremmalla hakulla punakivipölyn keräämiseksi. + + + Tätä ei voi rikkoa. + + + Sytyttää tuleen kaiken, mihin osuu. Voidaan kerätä ämpäriin. + + + Kerätään lapiolla. Voidaan sulattaa lasiksi uunissa. Painovoima vaikuttaa siihen, jos sen alla ei ole toista palikkaa. + + + Voidaan louhia hakulla mukulakivien keräämiseksi. + + + Kerätään lapiolla. Voidaan käyttää rakentamiseen. + + + Voidaan istuttaa. Lopulta siitä kasvaa puu. + + + Asetetaan maahan välittämään sähkönpurkausta. Taikajuoman raaka-aineena se kasvattaa vaikutuksen kestoaikaa. + + + Kerätään tappamalla lehmä. Voidaan käyttää panssarin tai kirjojen valmistamiseen. + + + Kerätään tappamalla lima. Voidaan käyttää taikajuoman raaka-aineena tai tarttumamäntien valmistamiseen. + + + Kanat tiputtavat näitä satunnaisesti ja niistä voi valmistaa ruokaa. + + + Kerätään kaivamalla soraa. Voidaan käyttää tuluksien valmistamiseen. + + + Kun tätä käyttää sikaan, sillä voi ratsastaa. Sikaa voi ohjata käyttämällä porkkanakeppiä. + + + Kerätään kaivamalla lunta, ja niitä voi heittää. + + + Kerätään hehkukiveä louhimalla. Siitä voidaan valmistaa taas hehkukivipalikoita tai käyttää taikajuoman raaka-aineena, jolloin se lisää juoman vaikutuksen tehoa. + + + Rikottuna tiputtaa toisinaan taimen, jonka voi istuttaa. Kasvaa puuksi. + + + Löydetään tyrmistä ja sitä voidaan käyttää rakentamiseen tai koristeeksi. + + + Käytetään hankkimaan villaa lampaista ja lehtipalikoiden keräämiseen. + + + Kerätään tappamalla luuranko. Voidaan käyttää luujauhon valmistamiseen. Voidaan syöttää sudelle, jotta se kesyyntyisi. + + + Kerätään saamalla luuranko tappamaan lurkki. Voidaan soittaa jukeboksissa. + + + Sammuttaa tulen ja auttaa viljelyskasveja kasvamaan. Voidaan kerätä ämpäriin. + + + Kerätään viljasta, ja siitä voi valmistaa ruokaa. + + + Voidaan valmistaa sokeriksi. + + + Voidaan pukea kypäräksi tai valmistaa kurpitsalyhdyksi soihdun kanssa. Se on lisäksi kurpitsapiirakan pääraaka-aine. + + + Palaa sytytettynä ikuisesti. + + + Täysikasvuisesta viljasta voi korjata vehnää. + + + Maata, joka on muokattu valmiiksi siemenien istuttamiseksi. + + + Voidaan paistaa uunissa vihreän väriaineen luomiseksi. + + + Hidastaa kaiken yli kävelevän liikettä. + + + Kerätään tappamalla kana. Voidaan käyttää nuolen valmistamiseen. + + + Kerätään tappamalla lurkki. Voidaan käyttää dynamiitin valmistamiseen tai käyttää taikajuoman raaka-aineena. + + + Voidaan istuttaa viljelysmaahan viljan kasvattamiseksi. Varmista että siemenet saavat tarpeeksi valoa kasvaakseen! + + + Portaalissa seisomalla pääset siirtymään Ylämaailman ja Hornan välillä. + + + Käytetään uunin polttoaineena, tai soihtujen valmistamiseen. + + + Kerätään tappamalla hämähäkki. Voidaan käyttää jousen tai onkivavan valmistamiseen, tai asettaa maahan ansalangan luomiseksi. + + + Tiputtaa villaa kerittäessä (ellei sitä ole jo keritty). Voidaan värjätä, jolloin sen villasta tulee eriväristä. + + + Liiketoiminnan kehittäminen + + + Portfolion johtaja + + + Tuotantopäällikkö + + + Kehitysryhmä + + + Julkaisunhallinta + + + Johtaja, XBLA-julkaisu + + + Markkinointi + + + Aasian lokalisointiryhmä + + + Käyttäjätutkimusryhmä + + + MGS Central -ryhmät + + + Yhteisöpäällikkö + + + Euroopan lokalisointiryhmä + + + Redmondin lokalisointiryhmä + + + Suunnitteluryhmä + + + Hauskuuden ohjaaja + + + Musiikki ja äänet + + + Ohjelmointi + + + Pääarkkitehti + + + Taidekehittäjä + + + Pelin luoja + + + Taide + + + Tuottaja + + + Testauksen johtaja + + + Päätestaaja + + + Laadunvalvonta + + + Vastaava tuottaja + + + Päätuottaja + + + Virstanpylväiden kelpoisuustestaaja + + + Rautalapio + + + Timanttilapio + + + Kultalapio + + + Kultamiekka + + + Puulapio + + + Kivilapio + + + Puuhakku + + + Kultahakku + + + Puukirves + + + Kivikirves + + + Kivihakku + + + Rautahakku + + + Timanttihakku + + + Timanttimiekka + + + Ohjelmiston laadunvalvonta + + + Projektin järjestelmätestaus + + + Järjestelmän lisätestaus + + + Erityiskiitokset + + + Testauspäällikkö + + + Vanhempi johtava testaaja + + + Avustavat testaajat + + + Puumiekka + + + Kivimiekka + + + Rautamiekka + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Kehittäjä + + + Ampuu sinua liekehtivillä palloilla, jotka räjähtävät osuessaan. + + + Lima + + + Jakautuu pienemmiksi limoiksi, kun sitä vahingoitetaan. + + + Sikamieszombi + + + Aluksi rauhallinen, mutta puolustautuu laumana jos hyökkäät yhden kimppuun. + + + Hornanhenki + + + Ääreläinen + + + Luolahämähäkki + + + Myrkyllinen purema. + + + Sienilehmä + + + Hyökkää kimppuusi, jos katsot sitä. Voi myös siirrellä palikoita. + + + Sokeritoukka + + + Houkuttelee paikalle lähistön muita sokeritoukkia, jos sen kimppuun hyökätään. Piileskelee kivipalikoissa. + + + Hyökkää kimppuusi, jos menet sen lähelle. + + + Tiputtaa porsaankyljyksiä tapettaessa. Voidaan ratsastaa satuloituna. + + + Susi + + + Rauhallinen kunnes sen kimppuun käydään, jolloin se puolustautuu. Voidaan kesyttää luilla, jolloin susi seuraa sinua ja puolustaa sinua, jos kimppuusi hyökätään. + + + Kana + + + Tiputtaa höyheniä tapettaessa, sekä munii toisinaan munia. + + + Sika + + + Lurkki + + + Hämähäkki + + + Hyökkää kimppuusi, jos menet sen lähelle. Osaa kiivetä seinillä. Tiputtaa siimaa tapettaessa. + + + Zombi + + + Räjähtää, jos menet liian lähelle! + + + Luuranko + + + Ampuu sinua nuolilla. Tiputtaa nuolia tapettaessa. + + + Tuottaa sienimuhennosta, jos sitä käytetään kulhon kanssa. Tiputtaa sieniä ja muuttuu normaaliksi lehmäksi, jos sen keritsee. + + + Alkuperäinen suunnittelu ja koodaus: + + + Projektinjohtaja/tuottaja + + + Muut Mojangin työntekijät + + + Luonnostaiteilijat + + + Numeroiden rouskutus ja statistiikka + + + Komenteleva koordinaattori + + + Minecraft PC:n johtava peliohjelmoija + + + Asiakastuki + + + Toimiston DJ + + + Suunnittelija/ohjelmoija – Minecraftin taskuversio + + + Koodarininja + + + Toimitusjohtaja + + + Valkokaulustyöläinen + + + Räjähdysanimaattori + + + Suuri musta lohikäärme, joka löytyy Äärestä. + + + Roihu + + + Vihollinen, joita löytää Hornasta, yleensä Hornan linnoitusten sisältä. Tiputtaa tapettaessa roihusauvoja. + + + Lumigolemi + + + Pelaaja voi luoda lumigolemin lumipalikoista ja kurpitsasta. Ne viskovat lumipalloilla luojansa vihollisia. + + + Äärilisko + + + Magmakuutio + + + Löytyy viidakosta. Sen voi kesyttää syöttämälle sille raakaa kalaa. Sinun on kuitenkin annettava oselotin lähestyä sinua itse, koska äkkinäiset liikkeet säikäyttävät sen tiehensä. + + + Rautagolemi + + + Ilmaantuu kyliin suojellakseen niitä, ja sen voi valmistaa rautapalikoista ja kurpitsasta. + + + Löytyy Hornasta. Limojen tapaan sekin jakautuu pienemmiksi samanlaisiksi tapettaessa. + + + Kyläläinen + + + Oselotti + + + Mahdollistaa voimakkaampien lumousten luomisen, kun niitä asettaa lumouspöydän ympärille. + + + {*T3*}PELIOHJE: UUNI{*ETW*}{*B*}{*B*} +Uunin avulla saat muutettua esineitä kuumentamalla niitä. Uunilla voit esimerkiksi muuttaa rautamalmia rautaharkoiksi.{*B*}{*B*} +Aseta uuni maailmaan ja käytä sitä painamalla{*CONTROLLER_ACTION_USE*}.{*B*}{*B*} +Sinun täytyy asettaa polttoainetta uunin pohjalle ja kuumennettava esine sen päälle. Tällöin uuni kuumenee ja alkaa toimia.{*B*}{*B*} +Kun esineesi on kuumennettu, voit siirtää sen tuottoalueelta tavaraluetteloosi.{*B*}{*B*} +Jos olet raaka-aineen tai uunin polttoaineen yllä, näet vinkkejä, joiden avulla on nopeaa siirtää sen uuniin. - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää Luovan tilan tavaraluetteloa, paina{*CONTROLLER_VK_B*}. + + {*T3*}PELIOHJE: JAKELULAITE{*ETW*}{*B*}{*B*} +Jakelulaite heittää ulos esineitä. Sinun on asetettava kytkin, esimerkiksi vipu, jakelulaitteen viereen käyttääksesi sitä.{*B*}{*B*} +Kun haluat täyttää jakelulaitteen esineillä, paina{*CONTROLLER_ACTION_USE*} ja siirrä sitten tavaraluettelostasi jakelulaitteeseen esineet, joita haluat sen jakelevan.{*B*}{*B*} +Kun sitten käytät kytkintä, jakelulaite heittää ulos esineen. - - Liikuta osoitinta painamalla{*CONTROLLER_MENU_NAVIGATE*}. - Kun olet tavaraluettelossa, poimi osoittimen alla oleva yksittäinen esine painamalla{*CONTROLLER_VK_A*}, ja poimi koko esinepino painamalla{*CONTROLLER_VK_Y*}. + + {*T3*}PELIOHJE: JUOMIEN KEITTÄMINEN{*ETW*}{*B*}{*B*} Juomien keittäminen vaatii keittotelineen, jonka voi valmistaa työpöydällä. Jokainen juoma vaatii ensinnäkin pullon vettä, jonka saa täyttämällä lasipullon vedellä padasta tai vesilähteestä.{*B*} Keittotelineessä on kolme paikkaa pulloille, joten voit tehdä kolme pullollista yhdellä kertaa. Yhdellä raaka-aineella voi valmistaa kaikki kolme pullollista, joten keitä aina kolme juomaa yhdellä kertaa, jotta saat hyödynnettyä resurssisi parhaiten.{*B*} Kun juoman raaka-aineen laittaa keittotelineen yläosaan, perusjuoma valmistuu hetken päästä. Pelkällä perusjuomalla ei ole mitään vaikutusta, mutta toisen raaka-aineen keittäminen tämän perusjuoman kanssa tuottaa juoman, jolla on vaikutus.{*B*} Kun olet valmistanut tämän juoman, voit lisätä kolmannen raaka-aineen, jotta vaikutus kestäisi pidempään (punakivipöly), se olisi vahvempi (hehkukivipöly) tai jotta siitä tulisi haitallinen (pilaantunut hämähäkinsilmä).{*B*} Lisäksi voit lisätä mihin tahansa juomaan ruutia tehdäksesi siitä räjähtävän juoman, jonka pystyy heittämään. Heitetty räjähtävä juoma levittää juoman vaikutuksen alueelle, jolle se laskeutuu.{*B*} Juomien lähderaaka-aineet ovat: {*B*}{*B*} * {*T2*}Hornapahka{*ETW*}{*B*} * {*T2*}Hämähäkinsilmä{*ETW*}{*B*} * {*T2*}Sokeri{*ETW*}{*B*} * {*T2*}Hornanhengen kyynel{*ETW*}{*B*} * {*T2*}Roihujauhe{*ETW*}{*B*} * {*T2*}Magmavoide{*ETW*}{*B*} * {*T2*}Kimalteleva meloni{*ETW*}{*B*} * {*T2*}Punakivipöly{*ETW*}{*B*} * {*T2*}Hehkukivipöly{*ETW*}{*B*} * {*T2*}Pilaantunut hämähäkinsilmä{*ETW*}{*B*}{*B*} Sinun pitää tehdä kokeita erilaisilla raaka-aineiden yhdistelmillä selvittääksesi, millaisia juomia voit valmistaa. - - -Osoitin siirtyy automaattisesti käyttörivillä olevaan tilaan. Voit asettaa esineen paikoilleen painamalla{*CONTROLLER_VK_A*}. Kun olet asettanut esineen, osoitin palaa tavaraluetteloon, mistä voit valita toisen esineen. + + {*T3*}PELIOHJE: SUURI ARKKU{*ETW*}{*B*}{*B*} +Kaksi vierekkäin asetettua arkkua muodostavat yhden suuren arkun. Siihen mahtuu vielä enemmän esineitä.{*B*}{*B*} +Sitä käytetään samalla tavoin kuin normaalia arkkua. - - Jos siirrät osoittimella esineen tavaraluettelon reunan ulkopuolelle, voit tiputtaa sen maailmaan. Jos haluat poistaa kaikki esineet pikavalintapalkista, paina{*CONTROLLER_VK_X*}. + + {*T3*}PELIOHJE: VALMISTAMINEN{*ETW*}{*B*}{*B*} +Valmistuskäyttöliittymässä voit yhdistellä tavaraluettelosi esineitä uudenlaisiksi esineiksi. Avaa valmistuskäyttöliittymä painamalla{*CONTROLLER_ACTION_CRAFTING*}.{*B*}{*B*} +Valitse esinetyyppi, jonka haluat valmistaa, selaamalla yläreunan välilehtiä painamalla{*CONTROLLER_VK_LB*} tai{*CONTROLLER_VK_RB*} ja valitse sitten valmistettava esine painamalla{*CONTROLLER_MENU_NAVIGATE*}.{*B*}{*B*} +Valmistusalue näyttää esineet, jotka uuden esineen valmistaminen vaatii. Valmista esine painamalla{*CONTROLLER_VK_A*} ja aseta se tavaraluetteloosi. - - Selaa yläreunan Ryhmätyyppivälilehtiä painamalla{*CONTROLLER_VK_LB*} tai{*CONTROLLER_VK_RB*}, niin voit valita, minkä esineryhmän esineitä haluat poimia. + + {*T3*}PELIOHJE: TYÖPÖYTÄ{*ETW*}{*B*}{*B*} Voit valmistaa suurempia esineitä käyttämällä työpöytää.{*B*}{*B*} Aseta pöytä maailmaan ja käytä sitä painamalla{*CONTROLLER_ACTION_USE*}.{*B*}{*B*} Pöydällä valmistaminen tapahtuu samoin kuin tavallinenkin valmistaminen, mutta valmistusalue on suurempi ja valittavana on isompi valikoima valmistettavia esineitä. - - - Jos haluat tietää lisää esineestä, siirrä osoitin sen ylle ja paina{*CONTROLLER_VK_BACK*}. + + {*T3*}PELIOHJE: LUMOAMINEN{*ETW*}{*B*}{*B*} +Kokemuspisteitä, joita voi kerätä olentojen kuoltua tai tiettyjä palikoita louhimalla tai uunissa sulattamalla, voi käyttää joidenkin työkalujen, aseiden, panssareiden ja kirjojen lumoamiseen.{*B*} +Kun miekka, jousi, kirves, hakku, lapio, panssari tai kirja asetetaan lumouspöydässä kirjan alla olevaan paikkaan, kolme painiketta paikan oikealla puolella kertovat joitain lumouksia sekä niiden kokemuspistehinnan.{*B*} +Jos kokemustasosi ei riitä niistä johonkin, sen hinta näkyy punaisena. Muutoin hinta on vihreä.{*B*}{*B*} +Käytettävä lumous määräytyy satunnaisesti näytetyn hinnan perusteella.{*B*}{*B*} +Jos lumouspöytä ympäröidään kirjahyllyillä (enintään 15 kirjahyllyä), ja jokaisen kirjahyllyn ja lumouspöydän välillä on yhden palikan kokoinen rako, lumousten vahvuus kasvaa ja maagiset kirjoitusmerkit leijuvat lumouspöydällä olevasta kirjasta.{*B*}{*B*} +Kaikki lumouspöydän valmistamiseen tarvittavat raaka-aineet löytyvät maailman kylistä, tai louhimalla tai viljelemällä.{*B*}{*B*} +Lumottuja kirjoja käytetään alasimella esineiden lumoamiseen. Näin pystyy vaikuttamaan paremmin siihen, mitä lumouksia esineisiin saa.{*B*} - - Poistu nyt Luovan tilan tavaraluettelosta painamalla{*CONTROLLER_VK_B*}. + + {*T3*}PELIOHJE: KENTTIEN KIELTÄMINEN{*ETW*}{*B*}{*B*} +Jos löydät loukkaavaa sisältöä pelaamastasi kentästä, voit asettaa sen Kiellettyjen kenttien listallesi. +Jos haluat tehdä niin, avaa taukovalikko ja paina sitten{*CONTROLLER_VK_RB*} valitaksesi Kiellä kenttä -vinkin. +Jos yrität myöhemmin pelata tätä kenttää, saat viestin, että kenttä on Kiellettyjen kenttien listallasi. Silloin voit joko poistaa sen listalta ja jatkaa pelaamista, tai poistua. - - -Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiäsi esineitä uusiksi esineiksi. + + {*T3*}PELIOHJE: ISTUNNON JÄRJESTÄJÄN JA PELAAJAN ASETUKSET{*ETW*}{*B*}{*B*} + +{*T1*}Peliasetukset{*ETW*}{*B*} +Kun lataat tai luot maailmaa, voit painaa "Lisäasetukset"-painiketta, niin voit hallita peliäsi tarkemmin.{*B*}{*B*} + +{*T2*}Pelaaja vastaan pelaaja{*ETW*}{*B*} + Kun tämä asetus on käytössä, pelaajat voivat aiheuttaa vahinkoa toisille pelaajille. Asetus vaikuttaa vain Selviytymistilassa.{*B*}{*B*} + +{*T2*}Luota pelaajiin{*ETW*}{*B*} +Kun tämä asetus on poissa käytöstä, peliin liittyvien pelaajien tekemisiä on rajoitettu. He eivät voi louhia tai käyttää esineitä, asettaa palikoita, käyttää ovia ja kytkimiä, käyttää säilytysastioita eivätkä hyökätä pelaajien tai eläinten kimppuun. Voit muuttaa näitä asetuksia yksittäiselle pelaajalle pelinsisäisen valikon kautta.{*B*}{*B*} + +{*T2*}Tuli leviää{*ETW*}{*B*} +Kun tämä asetus on käytössä, tuli saattaa levitä läheisiin tulenarkoihin palikoihin. Tätä asetusta voi muuttaa myös pelin aikana.{*B*}{*B*} + +{*T2*}Dynamiitti räjähtää{*ETW*}{*B*} +Kun tämä asetus on käytössä, dynamiitti räjähtää aktivoitaessa. Tätä asetusta voi muuttaa myös pelin aikana.{*B*}{*B*} + +{*T2*}Pelin järjestäjän oikeudet{*ETW*}{*B*} +Kun tämä asetus on käytössä, istunnon järjestäjä voi pelinsisäisestä valikosta ottaa käyttöön tai poistaa käytöstä lentokyvyn, hengästymisen ja näkymättömyyden. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Päivänvalon kierto{*ETW*}{*B*} + Kun tämä ei ole käytössä, vuorokaudenaika ei muutu.{*B*}{*B*} + + {*T2*}Pidä tavarat{*ETW*}{*B*} + Kun tämä on käytössä, pelaajat saavat pitää tavaransa kuollessaan.{*B*}{*B*} + + {*T2*}Olentojen syntyminen{*ETW*}{*B*} + Kun tämä ei ole käytössä, olennot eivät lisäänny luonnollisesti.{*B*}{*B*} + + {*T2*}Olentojen haitanteko{*ETW*}{*B*} + Kun tämä ei ole käytössä, hirviöt ja eläimet eivät voi muuttaa palikoita (esimerkiksi lurkin räjähdys ei tuhoa palikoita ja lammas ei poista ruohoa) tai poimia esineitä.{*B*}{*B*} + + {*T2*}Olentojen saalis{*ETW*}{*B*} + Kun tämä ei ole käytössä, hirviöt ja eläimet eivät pudota saalista (esimerkiksi lurkit eivät pudota ruutia).{*B*}{*B*} + + {*T2*}Palikoiden pudotukset{*ETW*}{*B*} + Kun tämä ei ole käytössä, palikat eivät pudota tavaroita tuhoutuessaan (esimerkiksi kivipalikoista ei putoa mukulakiviä).{*B*}{*B*} + + {*T2*}Luonnollinen paraneminen{*ETW*}{*B*} + Kun tämä ei ole käytössä, pelaajat eivät parane luonnollisesti.{*B*}{*B*} + +{*T1*}Maailman luomisen asetukset{*ETW*}{*B*} +Uutta maailmaa luodessa käytettävissä on muutamia lisäasetuksia.{*B*}{*B*} + +{*T2*}Luo rakennelmia{*ETW*}{*B*} +Kun tämä asetus on käytössä, maailmaan luodaan rakennelmia, kuten kyliä ja linnakkeita.{*B*}{*B*} + +{*T2*}Täysin tasainen maailma{*ETW*}{*B*} +Kun tämä asetus on käytössä, Ylämaailmaan ja Hornaan luodaan täysin tasainen maailma.{*B*}{*B*} + +{*T2*}Bonusarkku{*ETW*}{*B*} +Kun tämä asetus on käytössä, lähelle pelaajan syntypistettä luodaan arkku, joka sisältää muutamia hyödyllisiä esineitä.{*B*}{*B*} + +{*T2*}Nollaa Horna{*ETW*}{*B*} +Kun tämä on käytössä, Horna luodaan uudelleen. Tästä on hyötyä, jos pelaat vanhempaa tallennetta, missä Hornan linnoituksia ei ollut.{*B*}{*B*} + +{*T1*}Pelinsisäiset asetukset{*ETW*}{*B*} +Pelin aikana pystyy muuttamaan useita asetuksia painamalla {*BACK_BUTTON*}, joka avaa pelinsisäisen valikon.{*B*}{*B*} + +{*T1*}Istunnon järjestäjän asetukset{*ETW*}{*B*} +Istunnon järjestävä pelaaja sekä kaikki moderaattoreiksi nimetyt pelaajat saavat käyttää "Istunnon järjestäjän asetukset" -valikkoa. Tästä valikosta voi muuttaa tulen leviämisen ja dynamiitin räjähtämisen asetuksia.{*B*}{*B*} + +{*T1*}Pelaajan asetukset{*ETW*}{*B*} +Kun haluat muokata pelaajan oikeuksia, valitse hänen nimensä ja avaa pelaajan oikeusvalikko painamalla{*CONTROLLER_VK_A*}. Siitä voit muuttaa seuraavia asetuksia.{*B*}{*B*} + +{*T2*}Saa rakentaa ja louhia{*ETW*}{*B*} +Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus on käytössä, pelaaja voi toimia maailmassa normaalisti. Kun asetus ei ole käytössä, pelaaja ei voi asettaa tai tuhota palikoita eikä käyttää useita esineitä ja palikoita.{*B*}{*B*} + +{*T2*}Saa käyttää ovia ja kytkimiä{*ETW*}{*B*} +Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus ei ole käytössä, pelaaja ei voi käyttää ovia tai kytkimiä.{*B*}{*B*} + +{*T2*}Saa avata säilytysastioita{*ETW*}{*B*} +Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus ei ole käytössä, pelaaja ei voi avata säilytysastioita, kuten arkkuja.{*B*}{*B*} + +{*T2*}Saa hyökätä pelaajien kimppuun{*ETW*}{*B*} +Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus ei ole käytössä, pelaaja ei pysty vahingoittamaan muita pelaajia.{*B*}{*B*} + +{*T2*}Saa hyökätä eläinten kimppuun{*ETW*}{*B*} +Tämä asetus on saatavilla vain, kun "Luota pelaajiin" ei ole käytössä. Kun tämä asetus ei ole käytössä, pelaaja ei pysty vahingoittamaan eläimiä.{*B*}{*B*} + +{*T2*}Moderaattori{*ETW*}{*B*} +Kun tämä asetus on käytössä ja "Luota pelaajiin" ei ole käytössä, pelaaja voi muuttaa muiden pelaajien (paitsi istunnon järjestäjän) oikeuksia, potkaista pelaajia pois pelistä sekä muuttaa tulen leviämisen ja dynamiitin räjähtämisen asetuksia.{*B*}{*B*} + +{*T2*}Potkaise pelaaja{*ETW*}{*B*} +{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Istunnon järjestävän pelaajan asetukset{*ETW*}{*B*} +Jos "Istunnon järjestäjän oikeudet" ovat käytössä, istunnon järjestävä pelaaja voi muuttaa joitain oikeuksia itse. Kun haluat muokata pelaajan oikeuksia, valitse hänen nimensä ja avaa pelaajan oikeusvalikko painamalla{*CONTROLLER_VK_A*}. Siitä voit muuttaa seuraavia asetuksia.{*B*}{*B*} + +{*T2*}Saa lentää{*ETW*}{*B*} +Kun tämä asetus on käytössä, pelaaja voi lentää. Tämä asetus on oleellinen ainoastaan Selviytymistilassa, koska kaikki pelaajat saavat lentää Luovassa tilassa.{*B*}{*B*} + +{*T2*}Väsyminen pois päältä{*ETW*}{*B*} +Tämä asetus vaikuttaa vain Selviytymistilassa. Kun se on käytössä, fyysiset toiminnat (käveleminen/juokseminen/hyppääminen, jne.) eivät kuluta ruokapalkkia. Jos pelaaja kuitenkin vahingoittuu, ruokapalkki kuluu hiljalleen, kun pelaaja paranee.{*B*}{*B*} + +{*T2*}Näkymätön{*ETW*}{*B*} +Kun tämä asetus on käytössä, pelaaja on haavoittumaton sekä näkymätön toisille pelaajille.{*B*}{*B*} + +{*T2*}Saa teleportata{*ETW*}{*B*} +Tämän avulla pelaaja voi siirtää toisia pelaajia tai itsensä muiden maailmassa olevien pelaajien luo. - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo valmistaa esineitä, paina{*CONTROLLER_VK_B*}. + + Seuraava sivu - - {*B*} - Avaa esineen kuvaus painamalla{*CONTROLLER_VK_X*}. + + {*T3*}PELIOHJE: ELÄINTEN HOITAMINEN{*ETW*}{*B*}{*B*} +Jos haluat pitää eläimesi yhdessä paikassa, rakenna niitä varten alle 20x20 palikan kokoinen aidattu alue. Se varmistaa, että ne pysyvät tallella sillä välin, kun olet itse muualla. - - {*B*} - Näytä valitun esineen valmistamiseksi vaaditut raaka-aineet painamalla{*CONTROLLER_VK_X*}. + + {*T3*}PELIOHJE: ELÄINTEN KASVATTAMINEN{*ETW*}{*B*}{*B*} +Minecraftin eläimet voivat lisääntyä ja tuottaa pikkuversioita itsestään!{*B*} +Jotta saisit eläimet lisääntymään, sinun pitää syöttää niille oikeaa ruokaa, jotta saisit ne "Rakkaustilaan".{*B*} +Syötä vehnää lehmälle, sienilehmälle tai lampaalle; porkkanoita sialle; vehnänjyviä tai hornasyyliä kanalle; tai mitä tahansa lihaa sudelle, niin ne alkavat etsiä läheltään muita saman lajin eläimiä, jotka ovat myös Rakkaustilassa.{*B*} +Kun kaksi saman lajin eläintä tapaa, ja molemmat ovat Rakkaustilassa, ne pussailevat pari sekuntia, minkä jälkeen eläimille syntyy poikanen. Poikanen seuraa jonkin aikaa vanhempiaan, kunnes kasvaa täysikokoiseksi eläimeksi.{*B*} +Eläin ei voi siirtyä uudestaan Rakkaustilaan ennen kuin noin 5 minuutin kuluttua.{*B*} +Maailmaan mahtuvien eläinten määrä on rajallinen, joten jos sinulla on paljon eläimiä, ne eivät ehkä enää lisäänny. - - {*B*} - Näytä tavaraluettelo uudestaan painamalla{*CONTROLLER_VK_X*}. + + {*T3*}PELIOHJE: PORTAALI HORNAAN{*ETW*}{*B*}{*B*} +Portaalilla Hornaan pelaaja voi matkustaa Ylämaailman ja Hornan välillä. Hornan kautta pystyy matkustamaan nopeammin Ylämaailmassa. Yhden palikan matkustaminen Hornassa vastaa 3 palikkaa Ylämaailmassa, joten rakentamalla portaalin Hornaan ja astumalla sen läpi pääset 3 kertaa kauemmaksi lähtöpisteestäsi.{*B*}{*B*} +Portaalin rakentamiseen vaaditaan vähintään 10 laavakivipalikkaa, ja portaalin on oltava 5 palikan korkuinen, 4 palikan levyinen ja 1 palikan syvyinen. Kun portaalin kehys on rakennettu, kehyksen sisäinen tila on sytytettävä tuleen portaalin aktivoimiseksi. Sen voi tehdä tuluksilla tai tulilatauksella.{*B*}{*B*} +Oikealla näkyy esimerkkejä portaalin rakentamisesta. - - Selaa yläreunan Ryhmätyyppivälilehtiä painamalla{*CONTROLLER_VK_LB*} tai{*CONTROLLER_VK_RB*}, niin voit valita, minkä esineryhmän esineitä haluat valmistaa. Valitse sitten valmistettava esine painamalla{*CONTROLLER_MENU_NAVIGATE*}. + + {*T3*}PELIOHJE: ARKKU{*ETW*}{*B*}{*B*} +Kun olet valmistanut arkun, voit asettaa sen maailmaan ja käyttää sitä painamalla{*CONTROLLER_ACTION_USE*}. Näin voit tallettaa siihen esineitä tavaraluettelostasi.{*B*}{*B*} +Liikuta osoittimella esineitä tavaraluettelosi ja arkun välillä.{*B*}{*B*} +Arkkuun talletetut esineet saa halutessaan noudettua takaisin tavaraluetteloon. - - Valmistusalueella näkyvät esineet, joita tarvitaan uuden esineen valmistamiseksi. Valmista esine painamalla{*CONTROLLER_VK_A*} ja aseta se tavaraluetteloosi. + + Olitko sinä Mineconissa? - - - Työpöydän avulla voi valmistaa suuremman valikoiman esineitä. Pöydällä valmistaminen tapahtuu samoin kuin tavallinenkin valmistaminen, mutta valmistusalue on suurempi, jolloin valittavina on enemmän erilaisia raaka-aineyhdistelmiä. + + Kukaan Mojangissa ei ole koskaan nähnyt Junkboyn kasvoja. - - - Valmistusvalikon alaosassa oikealla näkyvät tavarasi. Tällä alueella näkyy myös kuvaus parhaillaan valittuna olevasta esineestä sekä sen valmistamiseksi vaaditut raaka-aineet. + + Tiesitkö, että on olemassa Minecraft Wiki? - - - Parhaillaan valittuna olevan esineen kuvaus näkyy tässä. Kuvauksesta pystyy päättelemään, mihin esinettä kenties voi käyttää. + + Älä katso suoraan kohti bugeja. - - - Valittuna olevan esineen valmistamiseksi vaaditut raaka-aineet näkyvät tässä. + + Lurkit syntyivät koodausvirheestä. - - Keräämästäsi puusta voi valmistaa lankkuja. Valitse lankkukuvake ja valmista niitä painamalla{*CONTROLLER_VK_A*}.{*PlanksIcon*} + + Onko se kana vai onko se ankka? - - - Nyt kun olet rakentanut työpöydän, sinun kannattaa asettaa se maailmaan. Sitten voit valmistaa suuremman valikoiman esineitä.{*B*} - Poistu nyt valmistusvalikosta painamalla{*CONTROLLER_VK_B*}. + + Mojangin uusi toimisto on siisti! - - - Valitse, minkä tyyppisiä esineitä tahdot valmistaa painamalla{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*}. Valitse työkalut.{*ToolsIcon*} + + {*T3*}PELIOHJE: PERUSTEET{*ETW*}{*B*}{*B*} +Minecraft on peli, missä palikoita asettamalla voi rakentaa mitä tahansa kuvitteleekin. Öisin hirviöt tulevat esiin, joten rakenna itsellesi suojapaikka ennen kuin niin tapahtuu.{*B*}{*B*} +Katso ympärillesi painamalla{*CONTROLLER_ACTION_LOOK*}.{*B*}{*B*} +Liiku painamalla{*CONTROLLER_ACTION_MOVE*}.{*B*}{*B*} +Hyppää painamalla{*CONTROLLER_ACTION_JUMP*}.{*B*}{*B*} +Juokse painamalla{*CONTROLLER_ACTION_MOVE*} eteenpäin nopeasti kaksi kertaa. Kun pidät{*CONTROLLER_ACTION_MOVE*} painettuna eteenpäin, pelihahmo jatkaa juoksuaan, kunnes juoksuaika loppuu tai ruokapalkissa on ruokaa alle{*ICON_SHANK_03*}.{*B*}{*B*} +Louhi ja hakkaa kädelläsi tai kädessäsi pitämälläsi esineellä painamalla {*CONTROLLER_ACTION_ACTION*}. Sinun täytyy ehkä valmistaa työkalu joidenkin palikoiden louhimiseksi.{*B*}{*B*} +Jos kädessäsi on esine, voit käyttää sitä painamalla{*CONTROLLER_ACTION_USE*}, tai tiputtaa sen painamalla{*CONTROLLER_ACTION_DROP*}. - - - Valitse, minkä tyyppisiä esineitä tahdot valmistaa painamalla{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*}. Valitse rakennukset.{*StructuresIcon*} + + {*T3*}PELIOHJE: HUD-NÄYTTÖ{*ETW*}{*B*}{*B*} HUD näyttää tietoa tilastasi: elinvoimasi, jäljellä olevan happesi, jos olet veden alla, nälkätasosi (se paranee syömällä) ja panssarisi, jos sinulla on sellainen. Jos menetät elinvoimaa, mutta ruokapalkissasi on ruokaa 9{*ICON_SHANK_01*} tai enemmän, elinvoimasi paranee automaattisesti. Ruuan syöminen täyttää ruokapalkkiasi.{*B*} Kokemuspalkki näkyy myös täällä. Numero osoittaa kokemustasosi ja palkki kertoo, miten monta kokemuspistettä vaaditaan kokemustason nostamiseksi. Kokemuspisteitä saa keräämällä olentojen kuollessa tiputtamia kokemuskuulia, louhimalla tiettyjä palikoita, eläimiä kasvattamalla, kalastamalla ja sulattamalla malmia uunissa.{*B*}{*B*} Se myös näyttää esineet jotka ovat käytettävissä. Vaihda kädessäsi pitämää esinettä painamalla{*CONTROLLER_ACTION_LEFT_SCROLL*} tai{*CONTROLLER_ACTION_RIGHT_SCROLL*}. - - - Vaihda esinettä, jonka tahdot valmistaa, painamalla{*CONTROLLER_MENU_NAVIGATE*}. Joistain esineistä voi tehdä eri versioita riippuen käytetyistä materiaaleista. Valitse puulapio.{*WoodenShovelIcon*} + + {*T3*}PELIOHJE: TAVARALUETTELO{*ETW*}{*B*}{*B*} +Katso tavaraluetteloasi painamalla{*CONTROLLER_ACTION_INVENTORY*}.{*B*}{*B*} +Tästä näytöstä näet kädessäsi valmiina olevan esineen ja kaikki muut esineet, joita mukanasi kannat. Myös panssarisi näkyy täällä.{*B*}{*B*} +Liikuta osoitinta painamalla{*CONTROLLER_MENU_NAVIGATE*}. Valitse osoittimen alla oleva esine painamalla{*CONTROLLER_VK_A*}. Jos esineitä on enemmän kuin yksi, voit poimia näin ne kaikki, tai jos painat {*CONTROLLER_VK_X*}, saat poimittua puolet niistä.{*B*}{*B*} +Voit liikuttaa esineen osoittimella tavaraluettelon toiseen kohtaan ja asettaa sen paikoilleen painamalla{*CONTROLLER_VK_A*}. Jos osoittimella on poimittu useita esineitä, voit asettaa ne kaikki painamalla{*CONTROLLER_VK_A*} tai vain yhden niistä painamalla{*CONTROLLER_VK_X*}.{*B*}{*B*} +Jos osoitin on panssarin päällä, näet vinkin, jonka avulla panssarin voi siirtää nopeasti oikeaan panssaripaikkaan tavaraluettelossa. +Nahkapanssarin väriä pystyy muuttamaan värjäämällä sen. Se tapahtuu tavaravalikossa poimimalla väriaineen osoittimella ja painamalla sitten{*CONTROLLER_VK_X*}, kun osoitin on värjättävän esineen yllä. - - - Usein valmistaminen vaatii useita vaiheita. Nyt kun sinulla on lankkuja, voit tehdä enemmän esineitä. Vaihda esinettä, jonka tahdot valmistaa, painamalla{*CONTROLLER_MENU_NAVIGATE*}. Valitse työpöytä.{*CraftingTableIcon*} + + Minecon 2013 pidettiin Floridan Orlandossa, USA:ssa! - - - Rakentamillasi työkaluilla olet päässyt hyvään alkuun, ja pystyt keräämään monia erilaisia materiaaleja tehokkaammin.{*B*} - Poistu nyt valmistusvalikosta painamalla{*CONTROLLER_VK_B*}. + + .party() oli mahtava! + + + Oleta aina ennemmin, että huhut ovat valetta kuin totta! + + + Edellinen sivu + + + Kaupankäynti + + + Alasin + + + Ääri + + + Kenttien kieltäminen + + + Luova tila - - - Joitain esineitä ei voi valmistaa työpöydällä, vaan niihin tarvitaan uuni. Valmista nyt uuni.{*FurnaceIcon*} + + Järjestäjän ja pelaajan asetukset - - - Aseta valmistamasi uuni maailmaan. Se kannattaa asettaa sisälle suojapaikkaasi.{*B*} - Poistu nyt valmistusvalikosta painamalla{*CONTROLLER_VK_B*}. + + {*T3*}PELIOHJE: ÄÄRI{*ETW*}{*B*}{*B*} +Ääri on pelin toinen ulottuvuus, jonne pääsee aktiivisen ääriportaalin kautta. Ääriportaali löytyy linnakkeesta, joka on syvällä maan alla Ylämaailmassa.{*B*} +Ääriportaalin aktivoimiseksi sinun pitää asettaa ääreläisen silmä jokaiseen ääriportaalin kehyksen kohtaan, jossa sellaista ei vielä ole.{*B*} +Kun portaali on aktiivinen, hyppää siihen päästäksesi Ääreen.{*B*}{*B*} +Lopussa tapaat ääriliskon, hurjan ja voimakkaan vihollisen, sekä monia ääreläisiä, joten sinun on oltava varautunut taisteluun ennen kuin menet sinne!{*B*}{*B*} +Kahdeksan laavakivipiikin kärjessä on äärikristallit, joilla äärilisko parantaa itseään, joten taistelun ensimmäinen askel on tuhota niistä jokainen.{*B*} +Pari ensimmäistä voi ampua nuolilla, mutta muut ovat rautahäkin suojaamia, ja niiden luo on rakennettava reitti.{*B*}{*B*} +Sillä välin äärilisko hyökkäilee kimppuusi lentäen ja sylkien äärihappopalloja!{*B*} +Jos lähestyt munakoroketta piikkien keskellä, äärilisko lentää alas luoksesi, jolloin voit tehdä sille kunnolla vahinkoa!{*B*} +Väistele happohenkäyksiä ja tähtää ääriliskon silmiin tehdäksesi mahdollisimman pahaa tuhoa. Mikäli mahdollista, ota ystäviä mukaan Ääreen avuksesi taisteluun.{*B*}{*B*} +Kun olet Ääressä, ystäväsi voivat nähdä kartallaan Ääriportaalin sijainnin linnakkeessa, joten he löytävät luoksesi helposti. - - - Tämä on uunivalikko. Uunin avulla saat muutettua esineitä kuumentamalla niitä. Uunilla pystyt esimerkiksi muuttamaan rautamalmia rautaharkoiksi. + + {*ETB*}Tervetuloa takaisin! Et ehkä ole huomannut, mutta Minecraftisi on juuri päivitetty.{*B*}{*B*} +Sinun ja ystäviesi iloksi on paljon uusia ominaisuuksia ja tässä on niistä vain muutamia kohokohtia. Lukaisepa ne läpi ja mene pitämään hauskaa!{*B*}{*B*} +{*T1*}Uusia esineitä{*ETB*} – kovetettu savi, värjätty savi, kivihiilipalikka, heinäpaali, aktivointikisko, punakivipalikka, päivänvalosensori, pudottaja, hyppijä, kaivoskärry ja hyppijä, kaivoskärry ja dynamiittia, punakivivertain, painotettu painelaatta, majakka, ansoitettu arkku, ilotulitusraketti, ilotulitetähti, hornatähti, lieka, hevosen panssari, nimilaatta, hevosen luomismuna{*B*}{*B*} +{*T1*}Lisätty uusia olentoja{*ETB*} – näivettäjä, näivettäjäluurangot, noidat, lepakot, hevoset, aasit ja muulit{*B*}{*B*} +{*T1*}Uusia ominaisuuksia{*ETB*} – kesytä hevonen ratsastetavaksi, valmista ilotulitteita ja järjestä näytös, nimeä eläimiä ja hirviöitä nimilaatalla, luo monimutkaisempia punakivipiirejä ja käytä uusia Istunnon järjestäjän asetuksia määrittääksesi, mitä vieraat voivat tehdä maailmassasi!{*B*}{*B*} +{*T1*}Uusi opetusmaailma{*ETB*} – opettele käyttämään vanhoja ja uusia ominaisuuksia opetusmaailmassa ja katso, löydätkö kaikki maailmaan kätketyt salaiset musiikkilevyt!{*B*}{*B*} - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää uunia, paina{*CONTROLLER_VK_B*}. + + Tekee enemmän vahinkoa kuin pelkkä käsi. - - - Sinun on laitettava polttoainetta uunin alapaikkaan ja muutettava esine sen yläpaikkaan. Tällöin uuni kuumenee ja alkaa toimia, minkä jälkeen tuotettava esine ilmestyy oikeanpuoleiseen paikkaan. + + Käytetään kaivamaan maata, ruohoa, hiekkaa, soraa ja lunta nopeammin kuin paljain käsin. Lumipallojen kaivamiseen tarvitaan lapio. - - - Monia puuesineitä voidaan käyttää polttoaineena, mutta kaikki eivät pala yhtä kauan. Saatat myös löytää maailmasta muita polttoaineita. + + Juokseminen - - - Kun esineesi on kuumennettu, voit siirtää ne tuottoalueelta tavaraluetteloosi. Kannattaa kokeilla, mitä pystyt valmistamaan eri raaka-aineista. + + Uutta - - - Jos käytät raaka-aineena puuta, pystyt valmistamaan puuhiiltä. Aseta uuniin polttoainetta ja raaka-ainepaikkaan puuta. Uunilla menee hetki puuhiilen valmistamisessa, joten tee vain jotain muuta ja tule myöhemmin tarkistamaan, onko puuhiili valmis. + + {*T3*}Muutokset ja lisäykset{*ETW*}{*B*}{*B*} +- Lisätty uusia esineitä – kovetettu savi, värjätty savi, kivihiilipalikka, heinäpaali, aktivointikisko, punakivipalikka, päivänvalosensori, pudottaja, hyppijä, kaivoskärry ja hyppijä, kaivoskärry ja dynamiittia, punakivivertain, painotettu painelaatta, majakka, ansoitettu arkku, ilotulitusraketti, ilotulitetähti, hornatähti, lieka, hevosen panssari, nimilaatta, hevosen luomismuna{*B*} +- Lisätty uusia olentoja – näivettäjä, näivettäjäluurangot, noidat, lepakot, hevoset, aasit ja muulit{*B*} +- Lisätty uusia maastonluomistoimintoja – noitien mökit{*B*} +- Lisätty majakkakäyttöliittymä{*B*} +- Lisätty hevoskäyttöliittymä{*B*} +- Lisätty hyppijäkäyttöliittymä{*B*} +- Lisätty ilotulitteet – ilotulituskäyttöliittymään pääsee työpöydältä, kun on ainesosat ilotulitetähteen tai ilotulitusrakettiin{*B*} +- Lisätty ”Seikkailutila” – voit rikkoa palikoita vain oikeilla työkaluilla{*B*} +- Lisätty paljon uusia ääniä{*B*} +- Olennot, esineet ja ammukset voivat nyt kulkea portaaleista{*B*} +- Toistimet voi nyt lukita antamalla niiden kylkiin virtaa toisella toistimella{*B*} +- Zombit ja luurangot voivat nyt syntyä erilaisten aseiden ja panssarien kanssa{*B*} +- Uusia kuolinviestejä{*B*} +- Nimeä olentoja nimilaatalla ja vaihda säilöjen nimeä muuttaaksesi otsikkoa, kun valikko on auki{*B*} +- Luujauho ei enää kasvata kaikkea välittömästi täyteen mittaansa, vaan kasvu tapahtuu satunnaisesti vaiheittain{*B*} +- Punakivisignaalin, joka määrittää arkkujen, keittotelineen, jakelulaitteen ja jukeboksien sisältöä, voi havaita asettamalla punakivivertain aivan niitä vasten{*B*} +- Jakelulaitteet voivat osoittaa mihin suuntaan tahansa{*B*} +- Kultaisen omenan syöminen antaa pelaajalle ylimääräistä elinvoimaa vähäksi aikaa{*B*} +- Mitä kauemmin pysyt alueella, sitä kovempia vastuksia sinne syntyvät hirviöt ovat{*B*} - - - Puuhiiltä voi käyttää polttoaineena, tai yhdessä kepin kanssa siitä pystyy valmistamaan soihdun. + + Näyttökuvien jakaminen - - - Kun raaka-ainepaikkaan asetetaan hiekkaa, siitä voi valmistaa lasia. Valmista pari lasipalikkaa, joista saat ikkunat suojapaikkaasi. + + Arkut - - - Tämä on keittovalikko. Täällä voit luoda juomia, joilla on erilaisia vaikutuksia. + + Valmistaminen - - {*B*} - Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää keittotelinettä, paina{*CONTROLLER_VK_B*}. + + Uuni - - - Juomia keitetään asettamalla raaka-aine yläpaikkaan ja juoma tai vesipullo alapaikkaan (yhtä aikaa pystyy keittämään enintään 3 juomaa). Kun kelvollinen yhdistelmä on paikoillaan, keittäminen alkaa ja juoma valmistuu hetken päästä. + + Perusteet - - - Kaikki juomat tarvitsevat aluksi vesipullon. Useimmat juomat valmistetaan käyttämällä ensin hornapahkaa. Siitä syntyy kelvoton juoma, joka vaatii vähintään yhden lisäraaka-aineen ennen kuin siitä saa aikaan kelvollisen juoman. + + HUD-näyttö - - - Kun sinulla on juoma, voit muokata sen vaikutuksia. Punakivipölyn lisääminen kasvattaa vaikutuksen kestoa ja hehkukivipölyä lisäämällä juomasta saa tehokkaamman. + + Tavaraluettelo - - - Pilaantunut hämähäkinsilmä pilaa juoman ja muuttaa sen vaikutuksen päinvastaiseksi. Ruutia lisäämällä saa aikaan räjähtävän juoman, jonka heittämällä juoma vaikuttaa alueella, jolle se laskeutuu. + + Jakelulaite - - - Luo tulenkestojuoma lisäämällä ensin vesipulloon hornapahka ja sen jälkeen magmavoidetta. + + Lumoaminen - - - Poistu nyt keittovalikosta painamalla{*CONTROLLER_VK_B*}. + + Portaali Hornaan - - - Tältä alueelta löytyvät keittoteline, pata sekä arkku täynnä keittämiseen tarvittavia esineitä. + + Moninpeli - - {*B*} - Opettele lisää keittämisestä ja juomista painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi keittämisestä ja juomista, paina{*CONTROLLER_VK_B*}. + + Eläinten hoitaminen - - - Ensimmäinen vaihe juoman keittämisessä on vesipullon valmistaminen. Ota arkusta lasipullo. + + Eläinten kasvattaminen - - - Voit täyttää lasipullon padasta, jossa on vettä, tai vesipalikasta. Täytä nyt lasipullo osoittamalla vesilähdettä ja painamalla{*CONTROLLER_ACTION_USE*}. + + Juomien keittäminen - - - Jos pata tyhjenee, sen voi täyttää uudestaan vesiämpärillä. + + deadmau5 tykkää Minecraftista! - - - Valmista tulenkestojuoma keittotelinettä käyttäen. Tarvitset vesipullon, hornapahkan ja magmavoidetta. + + Sikamiehet eivät hyökkää kimppuusi, ellet itse hyökkää ensin. - - Voit käyttää juoman ottamalla sen käteesi ja pitämällä{*CONTROLLER_ACTION_USE*} painettuna. Normaali juoma juodaan, jolloin se vaikuttaa juovaan pelaajaan, ja räjähtävä juoma heitetään, jolloin se vaikuttaa olentoihin osumakohtansa lähellä. - Räjähtävät juomat valmistetaan lisäämällä tavallisiin juomiin ruutia. + + Voit vaihtaa kohtaa, johon synnyt uudelleen, ja kelata aikaa aamuun asti sängyssä nukkumalla. - - - Käytä tulenkestojuomaa itseesi. + + Iske tulipallot takaisin hornanhenkiä päin! - - - Nyt kun kestät tulta ja laavaa, huomaat että pääset paikkoihin, joihin et aiemmin pystynyt menemään. + + Tee soihtuja, niin voit valaista paikkoja öisin. Hirviöt välttelevät soihtujen valaisemia alueita. - - - Tämä on lumousvalikko, jolla voit lisätä lumouksia aseisiin, panssareihin ja joihinkin työkaluihin. + + Pääset nopeammin paikaista toiseen raiteilla kulkevalla kaivoskärryllä. - - {*B*} - Opettele lisää lumousvalikon käyttämistä{*CONTROLLER_VK_A*}.{*B*} - Jos osaat jo käyttää lumousvalikkoa, paina{*CONTROLLER_VK_B*}. + + Istuta taimia, niin niistä kasvaa puita. - - - Jos haluat lumota esineen, aseta se ensin lumouspaikkaan. Aseita, panssareita ja joitain työkaluja voi lumota, jolloin ne saavat erikoisvaikutuksia, kuten parannettu vahingonkesto tai useamman esineen tuottaminen palikkaa louhiessa. + + Rakentamalla portaalin voit matkustaa toiseen ulottuvuuteen – Hornaan. - - - Kun lumouspaikkaan asetetaan esine, oikealla olevissa painikkeissa näkyy valikoima satunnaisia lumouksia. + + Kaivaminen suoraan alas tai suoraan ylös ei ole hyvä ajatus. - - - Painikkeen numero kertoo, miten paljon kokemuspisteitä kyseisen lumouksen tekeminen vaatii. Jos kokemustasosi ei ole tarpeeksi korkea, painiketta ei voi painaa. + + Luujauhoa (valmistetaan luurangon luusta) voidaan käyttää lannoitteena, joka saa kasvit kasvamaan välittömästi! - - - Lumoa esine valitsemalla lumous ja painamalla{*CONTROLLER_VK_A*}. Silloin kokemuspisteistäsi vähennetään lumouksen hinta. + + Lurkit räjähtävät, kun ne pääsevät lähellesi! - - - Vaikka kaikki lumoukset ovat sattumanvaraisia, osa paremmista lumouksista tulee saataville vain, kun kokemustasosi on tarpeeksi korkea ja sinulla on paljon kirjahyllyjä lumouspöydän ympärillä kasvattamassa sen tehoa. + + Painamalla{*CONTROLLER_VK_B*} voit tiputtaa käsissäsi pitelemäsi esineen. - - - Tällä alueella on lumouspöytä ja muutamia muita esineitä, joiden avulla opit tekemään lumouksia. + + Käytä työhön oikeaa työkalua. - - {*B*} - Opettele lisää lumouksista{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi lumouksista, paina{*CONTROLLER_VK_B*}. + + Jos et löydä yhtään kivihiiltä soihtujasi varten, voit valmistaa uunissa puusta puuhiiltä. - - - Lumouspöydän avulla pystyt lisäämään aseisiin, panssareihin ja joihinkin työkaluihin erikoisvaikutuksia, kuten useamman esineen tuottaminen palikkaa louhiessa tai parannettu vastustuskyky. + + Paistettujen porsaankyljysten syömisestä saa enemmän elinvoimaa kuin raaoista kyljyksistä. - - - Kirjahyllyjen asettaminen lumouspöydän ympärille lisää sen tehoa ja pääset käsiksi korkeamman tason lumouksiin. + + Jos olet valinnut pelin vaikeustasoksi Rauhallinen, elinvoimasi paranee automaattisesti, eikä yöllä esiinny hirviöitä. - - - Esineen lumoaminen maksaa kokemuspisteitä, joita saa keräämällä kokemuskuulia. Kokemuskuulia saa tappamalla hirviöitä ja eläimiä, louhimalla malmia, kasvattamalla eläimiä, kalastamalla ja sulattamalla/paistamalla jotain uunissa. + + Syötä sudelle luu, niin se kesyyntyy. Voit käskeä sen istumaan tai seuraamaan sinua. - - - Kokemuspisteitä saa myös lumouspullolla, joka luo kokemuskuulia laskeutumispaikkaansa, kun sen heittää. Luodut kuulat voi sitten kerätä talteen. + + Voit tiputtaa esineitä ollessasi tavaraluettelossa siirtämällä osoittimen pois luettelosta ja painamalla{*CONTROLLER_VK_A*}. - - - Tällä alueella löydät arkuista joitain lumottuja esineitä, lumouspulloja ja muutamia esineitä, joita voit lumota opetellaksesi käyttämään lumouspöytää. + + Uutta ladattavaa sisältöä on saatavilla! Löydät sen päävalikosta Minecraft-kaupan painikkeen takaa. - - - Kuljet nyt kaivoskärryllä. Jos haluat poistua kaivoskärrystä, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + Voit vaihtaa hahmosi ulkonäköä Minecraft-kaupasta ostetulla Ulkoasupaketilla. Valitse päävalikosta "Minecraft-kauppa", niin näet, mitä on saatavilla. - - {*B*} - Opettele lisää kaivoskärryistä{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi kaivoskärryistä, paina{*CONTROLLER_VK_B*}. + + Tee kuvasta kirkkaampi tai tummempi muuttamalla gamma-asetuksia. - - - Kaivoskärry kulkee raiteilla. Uunilla voit myös valmistaa moottoroidun kaivoskärryn sekä kaivoskärryn, jossa on arkku. - {*RailIcon*} + + Kun nukkuu yönsä sängyssä, peli kelautuu aamuun, mutta moninpelissä kaikkien pelaajien on nukuttava sängyssä samaan aikaan. - - - Lisäksi voit valmistaa sähköraiteita, jotka saavat virtansa punakivisoihduista ja piirejä, jotka kiihdyttävät kärryn nopeutta. Ne voi yhdistää kytkimiin, vipuihin ja painelaattoihin, ja muodostaa näin monimutkaisia järjestelmiä. - {*PoweredRailIcon*} + + Kuokalla voi kääntää maata kasvien istuttamista varten. - - - Purjehdit nyt veneellä. Jos haluat poistua veneestä, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + Hämähäkit eivät hyökkää päivällä – ellet itse hyökkää niiden kimppuun. - - - {*B*} - Opettele lisää veneistä{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi veneistä, paina{*CONTROLLER_VK_B*}. + + Maan tai hiekan kaivaminen on nopeampaa lapiolla kuin käsin. - - - Veneellä pääset kulkemaan vedessä nopeammin. Voit ohjata sitä painamalla{*CONTROLLER_ACTION_MOVE*} ja{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - + + Sioista saa kerättyä porsaankyljyksiä. Kun ne paistaa ja syö, saa takaisin elinvoimaa. - - - Käytät nyt onkivapaa. Voit kalastaa sillä painamalla{*CONTROLLER_ACTION_USE*}.{*FishingRodIcon*} + + Lehmistä saa kerättyä nahkaa, josta voi valmistaa panssareita. - - - {*B*} - Opettele lisää kalastamisesta{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi kalastamisesta, paina{*CONTROLLER_VK_B*}. + + Jos sinulla on tyhjä ämpäri, voit täyttää sen lehmästä lypsämälläsi maidolla, tai vedellä tai laavalla! - - - Heitä siima veteen ja ala kalastaa painamalla{*CONTROLLER_ACTION_USE*}. Kelaa siimaa painamalla{*CONTROLLER_ACTION_USE*} uudestaan. - {*FishingRodIcon*} + + Laavakiveä syntyy, kun vesi osuu laavalähdepalikkaan. - - - Jos odotat, kunnes koho vajoaa veden alle ennen kuin kelaat siiman, voit saada kalan. Kalan voi syödä raakana tai sen voi paistaa uunissa. Syöty kala parantaa elinvoimaa. - {*FishIcon*} + + Pelissä on nyt pinottavia aitoja. - - - Kuten monilla muillakin työkaluilla, onkivavalla on rajoitettu määrä käyttökertoja. Sitä voi tosin käyttää muuhunkin kuin onkimiseen. Kannattaa kokeilla, mitä muuta voit sillä saada kiinni tai aktivoida... - {*FishingRodIcon*} + + Jotkin eläimet seuraavat, jos pitää vehnää kädessään. - - - Tämä on sänky. Osoita sitä yöllä ja paina{*CONTROLLER_ACTION_USE*}, niin voit nukkua yön yli ja herätä aamulla.{*ICON*}355{*/ICON*} + + Jos eläin ei voi liikkua enempää kuin 20 palikkaa johonkin suuntaan, se ei katoa. - - - {*B*} - Opettele lisää sängyistä painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi sängyistä, paina{*CONTROLLER_VK_B*}. + + Kesyjen susien elinvoiman näkee niiden hännän asennosta. Paranna niitä syöttämällä niille lihaa. - - - Sänky kannattaa asettaa turvalliseen ja hyvin valaistuun paikkaan niin, että hirviöt eivät herätä sinua keskellä yötä. Jos olet käyttänyt sänkyä, heräät siinä kuoltuasi. - {*ICON*}355{*/ICON*} + + Paista kaktus uunissa, niin saat vihreää väriainetta. - - - Jos pelissäsi on muita pelaajia ja haluatte nukkua, kaikkien on oltava sängyssä samaan aikaan. - {*ICON*}355{*/ICON*} + + Peliohje-valikoiden Uutta-osiosta löytyy uusin päivitystieto pelistä. - - - Tällä alueella on muutamia yksinkertaisia punakivi- ja mäntäpiirejä, sekä arkku, josta löytyy piirien laajentamiseen tarvittavia esineitä. + + Musiikista vastaa C418. - - - {*B*} - Opettele lisää punakivipiireistä ja männistä painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi punakivipiireistä ja männistä, paina{*CONTROLLER_VK_B*}. + + Kuka on Notch? - - - Vivut, näppäimet, painelaatat ja punakivisoihdut voivat antaa virtaa piireille, joko liittämällä ne suoraan aktivoitavaan esineeseen tai kytkemällä ne siihen punakivipölyllä. + + Mojangilla on enemmän palkintoja kuin työntekijöitä! - - - Voimanlähteen sijainti ja suunta muuttaa sitä, miten se vaikuttaa ympäröiviin palikoihin. Esimerkiksi palikan kyljessä olevan punakivisoihdun voi sammuttaa, jos palikka saa virtaa jostain toisesta lähteestä. + + Jotkut julkkiksetkin pelaavat Minecraftia! - - Punakivipölyä kerätään louhimalla punakivimalmia hakulla, joka on valmistettu raudasta, timantista tai kullasta. Sillä voi siirtää virtaa enintään 15 palikalle, ja se voi kulkea yhden palikan verran ylös tai alaspäin. - {*ICON*}331{*/ICON*} + + Notchilla on yli miljoona seuraajaa Twitterissä! - - Punakivitoistimilla pystyy pidentämään matkaa, jonka virta kulkee, tai asettaa piiriin viiveen. - {*ICON*}356{*/ICON*} + + Kaikki ruotsalaiset eivät ole vaaleatukkaisia. Joillakin, kuten Jensillä ja Mojangilla, on jopa punaiset hiukset! - - Kun mäntä saa virtaa, se työntyy esiin voimalla, joka voi siirtää enintään 12 palikkaa. Kun tarttumamäntä vetäytyy, se voi samalla vetää mukanaan yhden palikan useimpia materiaaleja. - {*ICON*}33{*/ICON*} + + Peliä päivitetään jossain vaiheessa! - - - Tämän alueen arkussa on osia, joista voi rakentaa mäntiä sisältäviä piirejä. Kokeile käyttää tai koota tällä alueella olevia piirejä, tai rakentaa aivan oma piirisi. Esimerkkejä löytyy lisää opetusalueen ulkopuolelta. + + Asettamalla kaksi arkkua rinnakkain saa yhden suuren arkun. - - - Tällä alueella on portaali Hornaan! + + Pidä varasi rakentaessasi villasta rakennuksia avoimeen maastoon, sillä ukkosmyrskyjen salamat saattavat sytyttää villan tuleen. - - - {*B*} - Opettele lisää portaaleista ja Hornasta painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi portaaleista ja Hornasta, paina{*CONTROLLER_VK_B*}. + + Yhdellä ämpärillisellä laavaa voi sulattaa 100 palikkaa uunissa. - - - Portaaleja valmistetaan asettamalla laavakivipalikoita kehykseksi, joka on neljän palikan levyinen ja viiden palikan korkuinen. Kulmapalikoita ei tarvita. + + Nuottipalikan soitin muuttuu sen alla olevan materiaalin mukaan. - - - Portaali Hornaan aktivoidaan sytyttämällä tuluksilla kehyksen sisällä olevat laavakivipalikat tuleen. Portaalit voivat sulkeutua, jos niiden kehys rikkoutuu, lähellä tapahtuu räjähdys tai niiden läpi valuu nestettä. - + + Kun lähdepalikka poistetaan, voi kestää minuutteja ennen kuin laava katoaa KOKONAAN. - - - Kun haluat käyttää portaalia Hornaan, seiso sen sisällä. Näyttö muuttuu violetiksi ja kuulet äänen. Muutaman sekunnin kuluttua siirryt toiseen ulottuvuuteen. + + Mukulakivi kestää hornanhenkien tulipalloja, minkä ansiosta sillä on hyvä suojata portaaleja. - - - Horna voi olla vaarallinen paikka ja täynnä laavaa, mutta sieltä pystyy keräämään Hornan kiveä, joka palaa ikuisesti sytyttyään, sekä hehkukiveä, joka luo valoa. + + Palikat, joita voi käyttää valonlähteinä, sulattavat lunta ja jäätä. Näihin kuuluvat soihdut, hehkukivi ja kurpitsalyhdyt. - - - Hornan kautta pystyy matkustamaan nopeasti Ylämaailmassa. Yhden palikan kulkeminen Hornassa vastaa 3 palikan kulkemista Ylämaailmassa. + + Zombit ja luurangot selviytyvät auringonvalossa, jos ne ovat vedessä. - - - Nyt olet Luovassa tilassa. + + Kanat munivat 5-10 minuutin välein. - - - {*B*} - Opettele lisää Luovasta tilasta{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi Luovasta tilasta, paina{*CONTROLLER_VK_B*}. + + Laavakiveä voi louhia ainoastaan timanttihakulla. - - Luovassa tilassa sinulla on loputon määrä kaikkia saatavilla olevia esineitä ja palikoita, voit tuhota palikoita yhdellä napautuksella ilman työkalua, olet haavoittumaton ja osaat lentää. + + Lurkit ovat helpoimmin saatavilla oleva ruudin lähde. - - Avaa luova valmistusvalikko painamalla{*CONTROLLER_ACTION_CRAFTING*}. + + Jos hyökkäät suden kimppuun, kaikki lähistön sudet suuttuvat ja hyökkäävät kimppuusi. Sama pätee Sikamieszombeihin. - - Mene tämän aukon vastakkaiselle puolelle jatkaaksesi. + + Sudet eivät pääse Hornaan. - - Nyt olet suorittanut Luovan tilan opetuspelin. + + Sudet eivät hyökkää lurkkien kimppuun. - - - Tälle alueelle on perustettu maatila. Viljelemällä maata saat luotua uudistuvan lähteen ruualle ja muille esineille. + + Vaaditaan kivipalikoiden ja malmin louhimiseen. - - - {*B*} - Opettele lisää maanviljelystä{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi maanviljelystä, paina{*CONTROLLER_VK_B*}. + + Käytetään kakkureseptissä sekä taikajuomien raaka-aineena. - - Siemenistä kasvatetaan vehnää, kurpitsoja ja meloneja. Vehnänsiemeniä kerätään rikkomalla korkeaa ruohoa tai keräämällä vehnää, ja kurpitsan- ja meloninsiemeniä valmistetaan kurpitsoista ja meloneista. + + Käytetään lähettämään sähkönpurkaus kääntämällä vipu päälle tai pois. Pysyy päällä tai pois päältä, kunnes sitä käännetään taas. - - Ennen siementen istuttamista maapalikat on muutettava viljelysmaaksi kuokkaa käyttämällä. Läheinen vedenlähde auttaa pitämään viljelysmaan kosteana, mikä saa sadon kasvamaan nopeammin, samoin kuin riittävä valaistus. + + Lähettää jatkuvasti sähkönpurkausta, tai sitä voidaan käyttää lähetin/vastaanottimena, kun se on kytketty palikan kylkeen. +Voidaan myös käyttää matalan tason salaman luomiseen. - - Vehnä käy läpi useita vaiheita kasvaessaan ja se on valmis korjattavaksi, kun sen väri tummenee.{*ICON*}59:7{*/ICON*} + + Palauttaa 2{*ICON_SHANK_01*}, ja siitä voi valmistaa kultaisen omenan. - - Kurpitsat ja melonit vaativat istutetun siemenen viereen lisäksi palikan, johon kasvis voi kasvaa, kun sen varsi on täysikokoinen. + + Palauttaa 2{*ICON_SHANK_01*}, ja parantaa elinvoimaa 4 sekunnin ajan. Valmistetaan omenasta ja kultahipuista. - - Sokeriruoko pitää istuttaa ruoho-, maa- tai hiekkapalikalle, joka on aivan vesipalikan vieressä. Sokeriruokopalikan hakkaaminen tiputtaa lisäksi kaikki palikat, jotka ovat sen yläpuolella.{*ICON*}83{*/ICON*} + + Palauttaa 2{*ICON_SHANK_01*}. Sen syöminen saattaa myrkyttää sinut. - - Kaktukset on istutettava hiekalle, ja ne kasvavat kolmen palikan korkuisiksi. Kuten sokeriruo’on tapauksessa, keräämällä alimman palikan voi kerätä myös sen yläpuoliset palikat.{*ICON*}81{*/ICON*} + + Käytetään punakivipiireissä toistimena, viivyttimenä ja/tai diodina. - - Sienet pitäisi istuttaa hämärästi valaistulle alueelle, ja ne leviävät läheisille hämärästi valaistuille palikoille.{*ICON*}39{*/ICON*} + + Käytetään kaivoskärryjen ohjaamiseen. - - Luujauholla voi kasvattaa viljelyskasvit täysikokoisiksi, tai sienet valtaviksi sieniksi.{*ICON*}351:15{*/ICON*} + + Kiihdyttää sen yli ajavia kaivoskärryjä saadessaan virtaa. Pysäyttää yli ajavat kaivoskärryt, kun ei saa virtaa. - - Nyt olet suorittanut maanviljelyn opetuspelin. + + Toimii kuin painelaatta (lähettää punakivisignaalin saadessaan virtaa), mutta sen voi aktivoida vain kaivoskärryllä. - - - Tällä alueella eläimet ovat aitauksessa. Voit kasvattaa eläimiä ja saada ne tuottamaan poikasia. + + Käytetään lähettämään sähkönpurkaus painettaessa. Pysyy aktiivisena noin sekunnin ajan ennen kuin se sammuu taas. - - - {*B*} - Opettele lisää eläinten kasvattamisesta{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi eläinten kasvattamisesta, paina{*CONTROLLER_VK_B*}. + + Käytetään varastoimaan ja heittämään ulos esineitä satunnaisessa järjestyksessä, kun se saa punakivilatauksen. - - Jotta saisit eläimet lisääntymään, sinun pitää syöttää niille oikeaa ruokaa, jolloin ne siirtyvät "Rakkaustilaan". + + Soittaa sävelen aktivoitaessa. Iske sitä muuttaaksesi sävelkorkeutta. Tämän asettaminen eri palikoiden päälle muuttaa soittimen tyyppiä. - - Syötä vehnää lehmälle, muutatille tai lampaalle; porkkanoita sialle; vehnänsiemeniä tai hornapahkoja kanalle; tai mitä tahansa lihaa sudelle, niin ne alkavat etsiä lähistöltä muita saman lajin eläimiä, jotka ovat myös Rakkaustilassa. + + Palauttaa 2,5{*ICON_SHANK_01*}. Valmistetaan paistamalla raakaa kalaa uunissa. - - Kun kaksi saman lajin eläintä tapaa ja molemmat ovat Rakkaustilassa, ne pussailevat pari sekuntia, minkä jälkeen syntyy poikanen. Poikanen seuraa vanhempiaan hetken ennen kuin kasvaa itse täysikasvuiseksi. + + Palauttaa 1{*ICON_SHANK_01*}. - - Eläin ei voi siirtyä uudestaan Rakkaustilaan ennen kuin noin 5 minuutin päästä. + + Palauttaa 1{*ICON_SHANK_01*}. - - Jotkin eläimet seuraavat, jos pitää niiden suosimaa ruokaa kädessään. Näin on helpompaa tuoda eläimiä yhteen, jotta ne lisääntyisivät.{*ICON*}296{*/ICON*} + + Palauttaa 3{*ICON_SHANK_01*}. - - Villejä susia voi kesyttää antamalla niille luita. Kesytettyinä niiden ympärille ilmestyy rakkaussydämiä. Kesyt sudet seuraavat pelaajaa ja puolustavat häntä, ellei niiden ole käsketty istua. + + Käytetään jousen ammuksina. + + + Palauttaa 2,5{*ICON_SHANK_01*}. - - Nyt olet suorittanut eläinten kasvattamisen opetuspelin. + + Palauttaa 1{*ICON_SHANK_01*}. Voidaan käyttää 6 kertaa. - - - Tällä alueella on kurpitsoja ja palikoita, joista voi tehdä lumigolemin ja rautagolemin. + + Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Tämän syöminen saattaa myrkyttää sinut. - - - {*B*} - Opettele lisää golemeista{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi golemeista, paina{*CONTROLLER_VK_B*}. + + Palauttaa 1,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. - - Golemeja luodaan asettamalla kurpitsa palikkapinon päälle. + + Palauttaa 4{*ICON_SHANK_01*}. Valmistetaan paistamalla porsaankyljys uunissa. - - Lumigolemit luodaan laittamalla kaksi lumipalikkaa päällekkäin, ja niiden päälle kurpitsa. Lumigolemit viskovat vihollisiasi lumipalloilla. + + Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan syöttää oselotille, jotta se kesyyntyisi. - - Rautagolemit luodaan pinoamalla neljä rautapalikkaa kuvan osoittamalla tavalla, ja laittamalla kurpitsa keskimmäisen palikan päälle. Rautagolemit hyökkäävät vihollistesi kimppuun. + + Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan paistamalla raaka kana uunissa. - - Rautagolemeja ilmestyy myös luonnostaan suojelemaan kyläläisiä ja ne hyökkäävät kimppuusi, jos sinä hyökkäät jonkun kyläläisen kimppuun. + + Palauttaa 1,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. - - Et voi poistua tältä alueelta ennen kuin olet suorittanut opetuspelin. + + Palauttaa 4{*ICON_SHANK_01*}. - - Eri työkalut toimivat paremmin eri materiaaleihin. Käytä lapiota pehmeiden materiaalien, kuten maan ja hiekan louhimiseen. + + Käytetään kuljettamaan sinua, eläintä tai hirviötä raiteita pitkin. - - Eri työkalut toimivat paremmin eri materiaaleihin. Käytä kirvestä puunrunkojen hakkaamiseen. + + Käytetään villan värjäämiseen vaaleansiniseksi. - - Eri työkalut toimivat paremmin eri materiaaleihin. Käytä hakkua kiven ja malmin louhimiseen. Sinun täytyy valmistaa hakkusi paremmista materiaaleista ennen kuin saat resursseja tietyistä palikoista. + + Käytetään villan värjäämiseen sinivihreäksi. - - Jotkin työkalut sopivat paremmin vihollisten kimppuun hyökkäämiseen. Miekkaa kannattaa käyttää hyökkäämiseen. + + Käytetään villan värjäämiseen violetiksi. - - Vinkki: louhi tai hakkaa kädelläsi tai esineellä, jota pidät kädessäsi, pitämällä{*CONTROLLER_ACTION_ACTION*} painettuna. Joidenkin palikoiden louhimiseksi sinun pitää ehkä valmistaa työkalu... + + Käytetään villan värjäämiseen limenvihreäksi. - - Käyttämäsi työkalu on vahingoittunut. Aina kun käytät työkalua, se vahingoittuu ja lopulta hajoaa. Värillinen palkki tavaraluettelossa olevan esineen alla kertoo sen hetkisen vahingon määrän. + + Käytetään villan värjäämiseen harmaaksi. - - Ui ylöspäin pitämällä{*CONTROLLER_ACTION_JUMP*} painettuna. + + Käytetään villan värjäämiseen vaaleanharmaaksi. +(Huomaa: vaaleanharmaata väriainetta voidaan valmistaa myös yhdistämällä harmaata väriainetta luujauhoon, jolloin saadaan aikaan kolmen sijasta neljä vaaleanharmaata väriainetta jokaista mustepussia kohden.) - - Tällä alueella on kaivoskärry raiteilla. Jos haluat nousta kaivoskärryyn, siirrä osoitin sitä päin ja paina{*CONTROLLER_ACTION_USE*}. Laita kaivoskärry liikkeelle painamalla näppäimen kohdalla{*CONTROLLER_ACTION_USE*}. + + Käytetään villan värjäämiseen magentaksi. - - Arkussa joen rannalla on vene. Jos haluat käyttää venettä, siirrä osoitin vettä päin ja paina{*CONTROLLER_ACTION_USE*}. Nouse veneeseen osoittamalla sitä ja painamalla{*CONTROLLER_ACTION_USE*}. + + Käytetään luomaan soihtuja kirkkaampaa valoa. Sulattaa lunta/jäätä ja sitä voi käyttää veden alla. - - Arkussa lammen rannalla on onki. Ota onki arkusta ja laita se käteesi, niin voit käyttää sitä. + + Käytetään kirjojen ja karttojen valmistamiseen. - - Tämä kehittyneempi mäntämekanismi luo itsestään korjautuvan sillan! Aktivoi se näppäintä painamalla ja katso sitten, miten osat toimivat keskenään, niin opit lisää. + + Voidaan käyttää kirjahyllyjen valmistamiseen. Lumoamalla siitä saa valmistettua lumottuja kirjoja. - - Jos siirrät osoittimen valikon ulkopuolelle kantaessasi esinettä, voit tiputtaa sen. + + Käytetään villan värjäämiseen siniseksi. - - Sinulla ei ole kaikkia tarvittavia raaka-aineita tämän esineen valmistamiseksi. Laatikossa vasemmassa alakulmassa näkyvät tämän esineen valmistamiseksi tarvitut raaka-aineet. + + Soittaa musiikkilevyjä. - - Onneksi olkoon, olet suorittanut opetuspelin. Pelissä aika kulkee nyt normaalisti, eikä mene pitkään ennen kuin tulee yö ja hirviöt saapuvat! Tee suojapaikkasi valmiiksi! + + Valmista näistä erittäin kestäviä työkaluja, aseita tai panssareita. - - {*EXIT_PICTURE*} Kun olet valmis tutkimaan kauempana olevia paikkoja, tällä alueella kaivosmiehen mökin lähistöllä on ovi, joka johtaa pieneen linnaan. - + + Käytetään villan värjäämiseen oranssiksi. - - Muistutus: + + Kerätään lampaista ja voidaan värjätä väriaineilla. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Käytetään rakennusmateriaalina ja voidaan värjätä väriaineilla. Tätä reseptiä ei suositella, koska villaa saa helposti lampaista. - - Peliin on sen viimeisimmässä versiossa lisätty uusia ominaisuuksia, mukaan lukien uusia alueita opetuspelin maailmaan. + + Käytetään villan värjäämiseen mustaksi. - - {*B*}Pelaa opetuspeli läpi normaalisti painamalla{*CONTROLLER_VK_A*}.{*B*} - Ohita pääopetuspeli painamalla{*CONTROLLER_VK_B*}. + + Käytetään kuljettamaan tavaroita raiteita pitkin. - - Tältä alueelta löydät valmiita paikkoja, joissa opit kalastamisesta, veneistä, männistä ja punakivestä. + + Kulkee raiteita pitkin ja voi työntää muita kaivoskärryjä, jos siihen laitetaan kivihiiltä. - - Tämän alueen ulkopuolelta löydät esimerkkejä mm. rakennuksista, maanviljelystä, kaivoskärryistä ja raiteista, lumoamisesta, juomien keittämisestä, kaupankäynnistä ja takomisesta! + + Käytetään kun tahdotaan matkustaa vedessä nopeammin kuin uimalla. - - - Ruokapalkkisi on laskenut niin alas, että et enää parane itsestään. + + Käytetään villan värjäämiseen vihreäksi. - - - {*B*} - Opettele lisää ruokapalkista ja ruuan syömisestä painamalla{*CONTROLLER_VK_A*}.{*B*} - Jos tiedät jo tarpeeksi ruokapalkista ja ruuan syömisestä, paina{*CONTROLLER_VK_B*}. + + Käytetään villan värjäämiseen punaiseksi. - - Valitse + + Käytetään kasvattamaan välittömästi viljelyskasveja, puita, korkeaa ruohoa, valtavia sieniä sekä kukkia, ja voidaan käyttää väriaineresepteissä. - - Käytä + + Käytetään villan värjäämiseen pinkiksi. - - Palaa + + Käytetään väriaineena ruskean villan värjäämisessä, keksien raaka-aineena tai kaakaopalkojen kasvattamisessa. - - Poistu + + Käytetään villan värjäämiseen hopeanväriseksi. - - Peru + + Käytetään villan värjäämiseen keltaiseksi. - - Peru liittyminen + + Mahdollistaa hyökkäykset matkan päästä nuolilla. - - Päivitä Verkkopeliluettelo + + Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. - - Ryhmäpelit + + Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. - - Kaikki pelit + + Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. - - Vaihda ryhmää + + Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. - - Näytä tavarat + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - Näytä kuvaus + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - Näytä raaka-aineet + + Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. - - Valmistaminen + + Kiiltävä harkko, josta voi tehdä tästä materiaalista valmistettuja työkaluja. Valmistetaan sulattamalla malmia uunissa. - - Luo + + Mahdollistaa harkkojen, jalokivien tai väriaineiden valmistamisen asetettaviksi palikoiksi. Voidaan käyttää kalliina rakennuspalikkana tai kätevänä malmivarastona. - - Ota/aseta + + Käytetään lähettämään sähkönpurkaus, kun sen päälle astuu pelaaja, eläin tai hirviö. Puiset painelaatat voi aktivoida myös pudottamalla niille jotain. + - - Ota + + Antaa käyttäjälle 8 panssaria, kun sen pukee päälle. - - Ota kaikki + + Antaa käyttäjälle 6 panssaria, kun sen pukee päälle. - - Ota puolet + + Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. - - Aseta + + Antaa käyttäjälle 6 panssaria, kun sen pukee päälle. - - Aseta kaikki + + Rautaovet voi avata vain punakivellä, näppäimillä tai kytkimillä. - - Aseta yksi + + Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. - - Tiputa + + Antaa käyttäjälle 3 panssaria, kun sen pukee päälle. - - Tiputa kaikki + + Käytetään puupalikoiden hakkaamiseen nopeammin kuin paljain käsin. - - Tiputa yksi + + Käytetään kääntämään maa- ja ruohopalikoita maanviljelyä varten. - - Vaihda + + Puiset ovet avataan käyttämällä niitä, lyömällä niitä tai punakivellä. - - Pikasiirrä + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - Tyhjennä pikavalinta + + Antaa käyttäjälle 4 panssaria, kun sen pukee päälle. - - Mikä tämä on? + + Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. - - Jaa Facebookissa + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - Vaihda suodin + + Antaa käyttäjälle 1 panssarin, kun sen pukee päälle. - - Lähetä kaveripyyntö + + Antaa käyttäjälle 2 panssaria, kun sen pukee päälle. - - Selaa alas + + Antaa käyttäjälle 5 panssaria, kun sen pukee päälle. - - Selaa ylös + + Käytetään kätevien portaiden tekemiseen. - - Seuraava + + Käytetään astiana sienimuhennokselle. Voit pitää kulhon, kun muhennos on syöty. - - Edellinen + + Käytetään varastoimaan ja kuljettamaan vettä, laavaa ja maitoa. - - Potkaise pelaaja + + Käytetään varastoimaan ja kuljettamaan vettä. - - Värjää + + Näyttää sinun tai muiden pelaajien kirjoittaman tekstin. - - Louhi + + Käytetään luomaan soihtuja kirkkaampaa valoa. Sulattaa lunta/jäätä ja sitä voi käyttää veden alla. - - Syötä + + Käytetään aiheuttamaan räjähdyksiä. Aktivoidaan asettamisen jälkeen sytyttämällä se tuluksilla tai sähkönpurkauksella. - - Kesytä + + Käytetään varastoimaan ja kuljettamaan laavaa. - - Paranna + + Näyttää auringon ja kuun aseman. - - Istu + + Osoittaa aloituspisteeseesi. - - Seuraa minua + + Luo kuvan tutkitusta alueesta, kun sitä pitää kädessä. Sitä voi hyödyntää reittiä etsiessä. - - Lennätä ulos + + Käytetään varastoimaan ja kuljettamaan maitoa. - - Tyhjennä + + Käytetään luomaan tulta, sytyttämään dynamiitin ja avaamaan portaalin, kun se on ensin luotu. - - Satuloi + + Käytetään kalastamiseen. - - Aseta + + Avataan käyttämällä niitä, lyömällä niitä tai punakivellä. Ne toimivat kuten normaalit ovet, mutta ovat 1x1 palikan kokoisia ja asetetaan maata vasten. - - Lyö + + Käytetään rakennusmateriaalina ja niistä voi valmistaa monia asioita. Voidaan valmistaa minkälaisesta puusta tahansa. - - Lypsä + + Käytetään rakennusmateriaalina. Painovoima ei vaikuta siihen niin kuin normaaliin hiekkaan. - - Kerää + + Käytetään rakennusmateriaalina. - - Syö + + Käytetään pitkien portaiden rakentamiseen. Kaksi päällekkäin asetettua laattaa luo normaalikokoisen kahden laatan palikan. - - Nuku + + Käytetään pitkien portaiden tekemiseen. Kaksi päällekkäin asetettua laattaa muodostavat normaalikokoisen kahden laatan palikan. - - Herää + + Käytetään luomaan valoa. Soihdut myös sulattavat lunta ja jäätä. - - Soita + + Käytetään soihtujen, nuolten, kylttien, tikapuiden, aitojen sekä työkalujen ja aseiden kädensijojen valmistamiseen. - - Ratsasta + + Sen sisään voi varastoida palikoita ja esineitä. Kahden arkun asettaminen rinnakkain luo suuremman arkun, joka kaksinkertaistaa varastotilan. - - Purjehdi + + Käytetään esteenä, jonka yli ei voi hypätä. Lasketaan 1,5 palikan korkuiseksi pelaajia, eläimiä ja hirviöitä ajatellen, mutta 1 palikan korkuiseksi muita palikoita ajatellen. + - - Kasvata + + Käytetään pystysuoraan kiipeämiseen. - - Ui ylös + + Käytetään edistämään aikaa mistä tahansa öisestä ajankohdasta aamuun, jos kaikki maailman pelaajat ovat sängyssä. Sillä myös muutetaan pelaajan syntypistettä. +Sängyn värit ovat aina samat käytetyn villan väristä riippumatta. - - Avaa + + Sallii sinun valmistaa suuremman valikoiman esineitä kuin normaali valmistaminen. - - Vaihda sävelkorkeutta + + Sallii sinun sulattaa malmia, valmistaa puuhiiltä ja lasia, sekä paistaa kaloja ja porsaankyljyksiä. - - Räjäytä + + Rautakirves - - Lue + + Punakivilamppu - - Ripusta + + Viidakkopuuportaat - - Heitä + + Koivupuuportaat - - Istuta + + Nykyinen ohjaus - - Käännä maata + + Pääkallo - - Kerää + + Kaakao - - Jatka + + Kuusipuuportaat - - Avaa koko peli + + Lohikäärmeen muna - - Poista tallenne + + Äärikivi - - Poista + + Ääriportaalin kehys - - Asetukset + + Hiekkakiviportaat - - Kutsu kavereita + + Saniainen - - Hyväksy + + Puska - - Keritse + + Malli - - Kiellä kenttä + + Valmistaminen - - Valitse ulkoasu + + Käytä - - Sytytä + + Toiminto - - Liiku + + Hiivi/lennä alas - - Asenna täysi versio + + Hiivi - - Asenna koeversio + + Tiputa - - Asenna + + Selaa käden esinettä - - Asenna uudestaan + + Tauota - - Asetukset + + Katso - - Suorita komento + + Liiku/juokse - - Luova + + Tavaraluettelo - - Siirrä raaka-aine + + Hyppää/lennä ylös - - Siirrä polttoaine + + Hyppää - - Siirrä työkalu + + Ääriportaali - - Siirrä panssari + + Kurpitsan varsi - - Siirrä ase + + Meloni - - Ota käyttöön + + Lasilevy - - Vedä + + Aidan portti - - Laukaise + + Köynnökset - - Etuoikeudet + + Melonin varsi - - Estä + + Rautatangot - - Selaa ylös + + Halkeilleet kivitiilet - - Selaa alas + + Sammaleiset kivitiilet - - Rakkaustila + + Kiviiilet - - Juo + + Sieni - - Kierrä + + Sieni - - Piilota + + Veistetyt kivitiilet - - Tyhjennä kaikki paikat + + Tiiliportaat - - OK + + Hornapahka - - Peru + + Hornatiiliportaat - - Minecraft-kauppa + + Hornatiiliaita - - Haluatko varmasti poistua nykyisestä pelistäsi ja liittyä uuteen? Kaikki tallentamaton edistyminen menetetään. + + Pata - - Poistu pelistä + + Keittoteline - - Tallenna peli + + Lumouspöytä - - Poistu tallentamatta + + Hornatiili - - Haluatko varmasti korvata tämän maailman edellisen tallenteen tämän maailman nykyisellä versiolla? + + Sokeritoukkamukulakivi - - Haluatko varmasti poistua tallentamatta? Menetät kaiken edistymisen tässä maailmassa! + + Sokeritoukkakivi - - Aloita peli + + Kivitiiliportaat - - Vahingoittunut tallenne + + Lumpeenlehti - - Tämä tallenne on viallinen tai vahingoittunut. Haluatko poistaa sen? + + Sienirihma - - Haluatko varmasti poistua päävalikkoon ja erottaa kaikki pelaajat pelistä? Kaikki tallentamaton edistyminen menetetään. + + Sokeritoukkakivitiili - - Tallenna ja poistu + + Vaihda kameratilaa - - Poistu tallentamatta + + Jos menetät elinvoimaa, mutta ruokapalkissasi on 9{*ICON_SHANK_01*} tai enemmän, elinvoimasi paranee automaattisesti. Ruuan syöminen palauttaa ruokapalkkia. - - Haluatko varmasti poistua päävalikkoon? Kaikki tallentamaton edistyminen menetetään. + + Kun liikut ympäriinsä, louhit ja hyökkäät, ruokapalkkisi{*ICON_SHANK_01*} kuluu. Juokseminen ja hyppiminen juostessa kuluttavat paljon enemmän ruokaa kuin kävely ja normaali hyppiminen. - - Haluatko varmasti poistua päävalikkoon? Edistymisesi menetetään! + + Kun keräät ja valmistat lisää esineitä, tavaraluettelosi täyttyy.{*B*} + Avaa tavaraluettelo painamalla{*CONTROLLER_ACTION_INVENTORY*}. - - Luo uusi maailma + + Keräämästäsi puusta voi valmistaa lankkuja. Avaa valmistusvalikko tehdäksesi niin.{*PlanksIcon*} - - Suorita opetuspeli + + Ruokapalkkisi on alhainen, ja olet menettänyt elinvoimaa. Palauta ruokapalkkiasi ja ala parantua syömällä paistettu pihvi tavaraluettelostasi.{*ICON*}364{*/ICON*} - - Opetuspeli + + Kun kädessäsi on ruokaa, voit syödä sen pitämällä{*CONTROLLER_ACTION_USE*} painettuna, jolloin ruokapalkkisi palautuu. Et voi syödä, jos ruokapalkki on täynnä. - - Nimeä maailmasi + + Avaa valmistusvalikko painamalla{*CONTROLLER_ACTION_CRAFTING*}. - - Anna nimi maailmallesi + + Jos haluat juosta, paina{*CONTROLLER_ACTION_MOVE*} eteenpäin kaksi kertaa nopeasti. Kun pidät{*CONTROLLER_ACTION_MOVE*} painettuna eteenpäin, hahmo jatkaa juoksua, kunnes juoksuaika tai ruoka loppuu. - - Syötä siemen maailmasi luomiseksi + + Liiku painamalla{*CONTROLLER_ACTION_MOVE*}. - - Lataa tallennettu maailma + + Katso ylös, alas ja ympärillesi painamalla{*CONTROLLER_ACTION_LOOK*}. - - Liity peliin painamalla START + + Hakkaa 4 puupalikkaa (puunrunkoja) pitämällä{*CONTROLLER_ACTION_ACTION*} painettuna.{*B*}Kun palikka hajoaa, voit poimia sen ylös seisomalla ilmestyneen leijuvan esineen lähellä, jolloin se siirtyy tavaraluetteloosi. - - Poistutaan pelistä + + Louhi tai hakkaa kädelläsi tai esineellä, jota pidät kädessäsi, pitämällä{*CONTROLLER_ACTION_ACTION*} painettuna. Joidenkin palikoiden louhimiseksi sinun pitää ehkä valmistaa työkalu... - - On tapahtunut virhe. Poistutaan päävalikkoon. + + Hyppää painamalla{*CONTROLLER_ACTION_JUMP*}. - - Yhteyden luominen epäonnistui + + Usein valmistaminen vaatii useita vaiheita. Nyt kun sinulla on lankkuja, voit tehdä enemmän esineitä. Valmista työpöytä.{*CraftingTableIcon*} - - Yhteys katkesi + + Yö saattaa saapua nopeasti, ja silloin on vaarallista olla ulkona, jos ei ole valmistautunut. On mahdollista valmistaa panssareita ja aseita, mutta on järkevää tehdä myös turvallinen suojapaikka. - - Yhteys palvelimelle katkesi. Poistutaan päävalikkoon. + + Avaa säilytysastia - - Palvelin katkaisi yhteyden + + Hakulla saa louhittua nopeammin kovia palikoita, kuten kiveä ja malmia. Kun keräät enemmän materiaaleja, pystyt valmistamaan työkaluja, jotka kestävät pidempään ja joiden avulla saa louhittua kovempia materiaaleja. Valmista puuhakku.{*WoodenPickaxeIcon*} - - Sinut potkaistiin pelistä + + Louhi kivipalikoita hakullasi. Kivipalikat tuottavat mukulakiveä louhittaessa. Jos keräät 8 mukulakivipalikkaa, voit rakentaa uunin. Sinun täytyy ehkä kaivaa ensin pois maata ennen kuin pääset käsiksi kiveen, joten käytä lapiota siihen tarkoitukseen.{*StoneIcon*} - - Sinut potkaistiin pelistä lentämisen takia + + Sinun on kerättävä resursseja mökin korjaamiseksi. Seinät ja katon voi valmistaa mistä tahansa palikoista, mutta haluat varmasti myös oven, pari ikkunaa ja valaisimia. - - Yhteyden muodostaminen kesti liian pitkään + + Lähistöllä on hylätty kaivosmiehen mökki, jonka saat korjattua turvalliseksi yöpaikaksi. - - Palvelin on täynnä + + Kirveellä saa hakattua nopeammin puuta ja puutiiliä. Kun keräät enemmän materiaaleja, pystyt valmistamaan työkaluja, jotka kestävät pidempään ja joiden avulla työskentely on nopeampaa. Valmista puukirves.{*WoodenHatchetIcon*} - - Istunnon järjestäjä on poistunut pelistä. + + Käytä esineitä, vuorovaikuta ja aseta joitain esineitä painamalla{*CONTROLLER_ACTION_USE*}. Asetetut esineet voi poimia uudestaan louhimalla ne oikealla työkalulla. - - Et voi liittyä tähän peliin, koska et ole kenenkään siinä pelaavan kaveri. + + Vaihda kädessäsi pitämää esinettä painamalla{*CONTROLLER_ACTION_LEFT_SCROLL*} tai{*CONTROLLER_ACTION_RIGHT_SCROLL*}. - - Et voi liittyä tähän peliin, koska istunnon järjestäjä on aiemmin potkaissut sinut pois. + + Jotta saisit nopeutettua palikoiden keräämistä, voit valmistaa tarkoitukseen sopivia työkaluja. Joissain työkaluissa on kepeistä valmistettu kädensija. Valmista nyt keppejä.{*SticksIcon*} - - Et voi liittyä tähän peliin, koska pelaaja, jonka peliin yrität liittyä, käyttää pelin vanhempaa versiota. + + Lapiolla saa kaivettua nopeammin pehmeitä palikoita, kuten maata ja lunta. Kun keräät enemmän materiaaleja, pystyt valmistamaan työkaluja, jotka kestävät pidempään ja joiden avulla työskentely on nopeampaa. Valmista puulapio.{*WoodenShovelIcon*} - - Et voi liittyä tähän peliin, koska pelaaja, jonka peliin yrität liittyä, käyttää pelin uudempaa versiota. + + Avaa työpöytä siirtämällä osoitin sen kohdalle ja painamalla{*CONTROLLER_ACTION_USE*}. - - Uusi maailma + + Kun työpöytä on valittuna, vie osoitin haluamaasi kohtaan ja aseta työpöytä siihen painamalla{*CONTROLLER_ACTION_USE*}. - - Palkinto avattu! + + Minecraft on peli, missä palikoita asettamalla voi rakentaa mitä tahansa kuvitteleekin. +Öisin hirviöt tulevat esiin, joten rakenna itsellesi suoja ennen kuin niin tapahtuu. - - Hurraa – olet saanut palkinnoksi pelaajakuvan Minecraftin Stevestä! + + - - Hurraa – olet saanut palkinnoksi pelaajakuvan lurkista! + + - - Avaa koko peli + + - - Pelaat pelin koeversiota, mutta tarvitset koko pelin, jos haluat tallentaa pelisi. -Haluatko nyt avata koko pelin? + + - - Ole hyvä ja odota + + - - Ei tuloksia + + - - Suodin: + + - - Kaverit + + Malli 1 - - Pisteeni + + Liikkuminen (lentäessä) - - Yhteensä + + Pelaajat/kutsu - - Sijoitukset: + + - - Sija + + Malli 3 - - Valmistaudutaan tallentamaan kenttä + + Malli 2 - - Valmistellaan osioita... + + - - Viimeistellään... + + - - Rakennetaan maastoa + + - - Simuloidaan hieman maailmaa + + - - Otetaan palvelin käyttöön + + {*B*}Paina{*CONTROLLER_VK_A*} aloittaaksesi opetuspelin.{*B*} + Paina{*CONTROLLER_VK_B*}, jos arvelet olevasi valmis pelaamaan omillasi. - - Luodaan syntyalue + + {*B*}Paina{*CONTROLLER_VK_A*} jatkaaksesi. - - Ladataan syntyalue + + - - Siirrytään Hornaan + + - - Poistutaan Hornasta + + - - Synnytään uudelleen + + - - Luodaan kenttää + + - - Ladataan kenttää + + - - Tallennetaan pelaajia + + - - Yhdistetään istunnon järjestäjään + + - - Ladataan maastoa + + Sokeritoukkapalikka - - Vaihdetaan paikalliseen peliin + + Kivilaatta - - Odota kun istunnon järjestäjä tallentaa pelin + + Kätevä tapa säilyttää rautaa. - - Siirrytään Ääreen + + Rautapalikka - - Poistutaan Äärestä + + Tammipuulaatta - - Tämä sänky on varattu + + Hiekkakivilaatta - - Vain öisin voi nukkua + + Kivilaatta - - %s nukkuu sängyssä. Jotta ajan voisi kelata aamuun, kaikkien pelaajien on nukuttava sängyssä samaan aikaan. + + Kätevä tapa säilyttää kultaa. - - Kotisi sänky puuttui tai oli esteen takana + + Kukka - - Et voi levätä nyt, koska lähistöllä on hirviöitä + + Valkoinen villa - - Sinä nukut sängyssä. Jotta ajan voi kelata aamuun, kaikkien pelaajien on nukuttava sängyssä samaan aikaan. + + Oranssi villa - - Työkalut ja aseet + + Kultapalikka - - Aseet + + Sieni - - Ruoka + + Ruusu - - Rakennukset + + Mukulakivilaatta - - Panssari + + Kirjahylly - - Mekanismit + + Dynamiitti - - Kulkuneuvot + + Tiili - - Koristeet + + Soihtu - - Rakennuspalikat + + Laavakivi - - Punakivi ja kulkuneuvot + + Sammalkivi - - Sekalaiset + + Hornatiililaatta - - Keittäminen + + Tammipuulaatta - - Työkalut, aseet ja panssarit + + Kivitiililaatta - - Materiaalit + + Tiililaatta - - Kirjautunut ulos + + Viidakkopuulaatta - - Vaikeustaso + + Koivupuulaatta - - Musiikki + + Kuusipuulaatta - - Ääni + + Magenta villa - - Gamma + + Koivunlehdet - - Pelin herkkyys + + Kuusenhavut - - Käyttöliittymän herkkyys + + Tammenlehdet - - Rauhallinen + + Lasi - - Helppo + + Pesusieni - - Tavallinen + + Viidakkopuunlehdet - - Vaikea + + Lehdet - - Tällä vaikeustasolla pelaajan elinvoima paranee ajan kuluessa, eikä ympäristössä esiinny vihollisia. + + Tammi - - Tällä vaikeustasolla ympäristöön syntyy hirviöitä, mutta ne tekevät pelaajalle vähemmän vahinkoa kuin Tavallisella vaikeustasolla. + + Kuusi - - Tällä vaikeustasolla ympäristöön syntyy hirviöitä ja ne tekevät normaalia vahinkoa pelaajaan. + + Koivu - - Tällä vaikeustasolla ympäristöön syntyy hirviöitä ja ne tekevät paljon vahinkoa pelaajaan. Varo myös lurkkeja, koska ne eivät yleensä peru räjähdyshyökkäystään, vaikka siirtyisit kauemmas niistä! + + Kuusipuu - - Koepeli on päättynyt + + Koivupuu - - Peli on täynnä + + Viidakkopuu - - Ei voitu liittyä peliin, koska tilaa ei ole + + Villa - - Kirjoita kyltin teksti + + Pinkki villa - - Kirjoita teksti kylttiisi + + Harmaa villa - - Kirjoita otsikko + + Vaaleanharmaa villa - - Kirjoita viestisi otsikko + + Vaaleansininen villa - - Kirjoita kuvateksti + + Keltainen villa - - Kirjoita viestisi kuvateksti + + Limenvihreä villa - - Kirjoita kuvaus + + Sinivihreä villa - - Kirjoita viestisi kuvaus + + Vihreä villa - - Tavaraluettelo + + Punainen villa - - Raaka-aineet + + Musta villa - - Keittoteline + + Violetti villa - - Arkku + + Sininen villa - - Lumoa + + Ruskea villa - - Uuni + + Soihtu (kivihiili) - - Raaka-aine + + Hehkukivi - - Polttoaine + + Sieluhiekka - - Jakelulaite + + Hornakivi - - Tämän tyyppistä ladattavaa sisältöä ei ole juuri nyt saatavilla tälle pelille. + + Lasuriittipalikka - - %s on liittynyt peliin. + + Lasuriittimalmi - - %s on poistunut pelistä. + + Portaali - - %s potkaistiin pelistä. + + Kurpitsalyhty - - Haluatko varmasti poistaa tämän pelitallenteen? + + Sokeriruoko - - Odottaa hyväksyntää + + Savi - - Sensuroitu + + Kaktus - - Tällä hetkellä soi: + + Kurpitsa - - Nollaa asetukset + + Aita - - Haluatko varmasti nollata asetuksesi niiden oletusarvoihin? + + Jukeboksi - - Latausvirhe + + Kätevä tapa säilyttää lasuriittia. - - Pelaajan %s peli + + Lattialuukku - - Tuntemattoman istunnon järjestäjän peli + + Lukittu arkku - - Vieras on kirjautunut ulos + + Diodi - - Vieraileva pelaaja on kirjautunut ulos, minkä johdosta kaikki vierailevat pelaajat poistettiin pelistä. + + Tarttumamäntä - - Kirjaudu + + Mäntä - - Et ole kirjautunut. Sinun pitää olla kirjautunut pelataksesi tätä peliä. Haluatko kirjautua nyt? + + Villa (minkä värinen tahansa) - - Moninpeli ei ole sallittu + + Kuollut pensas - - Pelin luominen ei onnistunut + + Kakku - - Automaattisesti valittu + + Sävelpalikka - - Ei pakettia: oletusulkoasut + + Jakelulaite - - Suosikkiulkoasut + + Korkea ruoho - - Kielletty kenttä + + Verkko - - Peli, johon olet liittymässä, on kiellettyjen kenttien luettelossasi. -Jos päätät liittyä tähän peliin, kenttä poistetaan kiellettyjen kenttien luettelostasi. + + Sänky - - Kielletäänkö tämä kenttä? + + Jää - - Haluatko varmasti lisätä tämän kentän kiellettyjen kenttien luetteloosi? -Jos valitset OK, poistut samalla tästä pelistä. + + Työpöytä - - Poista Kiellettyjen luettelosta + + Kätevä tapa säilyttää timantteja. - - Automaattitallennuksen väli + + Timanttipalikka - - Automaattitallennuksen väli: POIS + + Uuni - - minuuttia + + Viljelysmaa - - Ei voida asettaa tähän! + + Viljelyskasvit - - Laavan asettamista lähelle kentän syntypistettä ei sallita, koska muutoin pelaajat saattavat kuolla heti synnyttyään uudestaan. + + Timanttimalmi - - Käyttöliittymän läpinäkymättömyys + + Hirviönluoja - - Valmistaudutaan kentän automaattitallennukseen + + Tuli - - HUD-näytön koko + + Soihtu (puuhiili) - - HUD-näytön koko (jaettu näyttö) + + Punakivipöly - - Siemen + + Arkku - - Avaa ulkoasupaketti + + Tammipuuportaat - - Jos haluat käyttää valitsemaasi ulkoasua, sinun pitää avata tämä paketti. -Haluaisitko avata tämän ulkoasupaketin nyt? + + Kyltti - - Avaa tekstuuripaketti + + Punakivimalmi - - Jotta voisit käyttää tätä tekstuuripakettia, sinun pitää avata se. -Haluatko avata sen nyt? + + Rautaovi - - Tekstuurikoepaketti + + Painelaatta - - Käytät tekstuuripaketin koeversiota. Et pysty tallentamaan tätä maailmaa, ellet avaa täyttä versiota. -Haluatko avata tekstuuripaketin täyden version? + + Lumi - - Tekstuuripakettia ei löytynyt + + Näppäin - - Avaa täysi versio + + Punakivisoihtu - - Lataa koeversio + + Vipu - - Lataa täysi versio + + Raide - - Tämä maailma käyttää yhdistelmäpakettia tai tekstuuripakettia, jota sinulla ei ole! -Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? + + Tikkaat - - Hanki koeversio + + Puuovi - - Hanki täysi versio + + Kiviportaat - - Potkaise pelaaja + + Paljastinraide - - Haluatko varmasti potkaista tämän pelaajan pelistä? Hän ei pääse liittymään takaisin ennen kuin aloitat maailman uudestaan. + + Sähköraide - - Pelaajakuvapaketit + + Olet kerännyt tarpeeksi mukulakiviä uunin rakentamiseksi. Rakenna sellainen työpöydälläsi. - - Teemat + + Onkivapa - - Ulkoasupaketit + + Kello - - Salli kaverien kaverit + + Hehkukivipöly - - Et voi liittyä tähän peliin, koska se on rajoitettu istunnon järjestäjän kavereille. + + Kaivoskärry ja uuni - - Et voi liittyä peliin + + Muna - - Valittu + + Kompassi - - Valittu ulkoasu: + + Raaka kala - - Ladattava sisältö on vioittunut + + Punainen väriaine - - Tämä ladattava sisältö on vioittunut eikä sitä voi käyttää. Sinun pitää poistaa se ja asentaa se sitten uudestaan Minecraft-kaupan valikosta. + + Kaktuksenvihreä väriaine - - Jotkin ladattavista sisällöistäsi ovat vioittuneet eikä niitä voi käyttää. Sinun pitää poistaa ne ja asentaa ne sitten uudestaan Minecraft-kaupan valikosta. + + Kaakaopavun ruskea väriaine - - Pelitilasi on muuttunut + + Paistettu kala - - Nimeä maailmasi uudelleen + + Värijauhe - - Kirjoita uusi nimi maailmallesi + + Mustepussi - - Pelitila: Selviytyminen + + Kaivoskärry ja arkku - - Pelitila: Luova + + Lumipallo - - Selviytyminen + + Vene - - Luova + + Nahka - - Luotu Selviytymistilassa + + Kaivoskärry - - Luotu Luovassa tilassa + + Satula - - Renderoi pilvet + + Punakivi - - Mitä haluat tehdä tälle pelitallenteelle? + + Maitoämpäri - - Nimeä tallenne uudelleen + + Paperi - - Automaattitallennus: %d... + + Kirja - - Päällä + + Limapallo - - Pois + + Tiili - - Tavallinen + + Savi - - Täysin tasainen + + Sokeriruo'ot - - Kun tämä on valittuna, peli pelataan verkossa. + + Sininen väriaine - - Kun tämä on valittuna, vain kutsutut pelaajat saavat liittyä. + + Kartta - - Kun tämä on valittuna, kaveriluettelossasi olevien henkilöiden kaverit saavat liittyä peliin. + + Musiikkilevy - "13" - - Kun tämä on käytössä, pelaajat voivat aiheuttaa vahinkoa toisille pelaajille. Toimii vain Selviytymistilassa. + + Musiikkilevy - "cat" - - Kun tämä ei ole käytössä, peliin liittyvät pelaajat eivät voi rakentaa tai louhia ilman lupaa. + + Sänky - - Kun tämä on käytössä, tuli saattaa levitä läheisiin tulenarkoihin palikoihin. + + Punakivitoistin - - Kun tämä on käytössä, dynamiitti räjähtää aktivoitaessa. + + Keksi - - Kun tämä on käytössä, Horna luodaan uudelleen. Tästä on hyötyä, jos pelaat vanhempaa tallennetta, missä Hornan linnoituksia ei ollut. + + Musiikkilevy - "blocks" - - Kun tämä on käytössä, maailmaan luodaan rakennelmia, kuten kyliä ja linnakkeita. + + Musiikkilevy - "mellohi" - - Kun tämä on käytössä, Ylämaailmaan ja Hornaan luodaan täysin tasainen maailma. + + Musiikkilevy - "stal" - - Kun tämä on käytössä, lähelle pelaajan syntypistettä luodaan arkku, joka sisältää muutamia hyödyllisiä esineitä. + + Musiikkilevy - "strad" - - Ulkoasupaketit + + Musiikkilevy - "chirp" - - Teemat + + Musiikkilevy - "far" - - Pelaajakuvat + + Musiikkilevy - "mall" - - Avatar-esineet + + Kakku - - Tekstuuripaketit + + Harmaa väriaine - - Yhdistelmäpaketit + + Pinkki väriaine - - {*PLAYER*} syttyi tuleen + + Limenvihreä väriaine - - {*PLAYER*} paloi kuoliaaksi + + Violetti väriaine - - {*PLAYER*} yritti uida laavassa + + Sinivihreä väriaine - - {*PLAYER*} tukehtui seinään + + Vaaleanharmaa väriaine - - {*PLAYER*} hukkui + + Keltainen väriaine - - {*PLAYER*} kuoli nälkään + + Luunvalkoinen väriaine - - {*PLAYER*} pisteltiin kuoliaaksi + + Luu - - {*PLAYER*} tippui maahan liian kovaa + + Sokeri - - {*PLAYER*} tipahti ulos maailmasta + + Vaaleansininen väriaine - - {*PLAYER*} kuoli + + Magenta väriaine - - {*PLAYER*} räjähti + + Oranssi väriaine - - {*PLAYER*} kuoli taikuuteen + + Kyltti - - {*PLAYER*} kuoli Ääriliskon henkäykseen + + Nahkatunika - - {*PLAYER*} kuoli, koska {*SOURCE*} tappoi hänet + + Rautarintapanssari - - {*PLAYER*} kuoli, koska {*SOURCE*} tappoi hänet + + Timanttirintapanssari - - {*SOURCE*} ampui pelaajaa {*PLAYER*} + + Rautakypärä - - {*SOURCE*} ampui pelaajaa {*PLAYER*} tulipallolla + + Timanttikypärä - - {*SOURCE*} pommitti pelaajaa {*PLAYER*} + + Kultakypärä - - {*SOURCE*} tappoi pelaajan {*PLAYER*} + + Kultarintapanssari - - Peruskallion peitto + + Kultahousut - - Näytä HUD-näyttö + + Nahkasaappaat - - Näytä käsi + + Rautasaappaat + + + Nahkahousut - - Kuolinviestit + + Rautahousut - - Animoitu hahmo + + Timanttihousut - - Muokattu ulkoasun animaatio + + Nahkalakki - - Et voi enää louhia tai käyttää esineitä + + Kivikuokka - - Nyt voit louhia ja käyttää esineitä + + Rautakuokka - - Et voi enää asettaa palikoita + + Timanttikuokka - - Nyt voit asettaa palikoita + + Timanttikirves - - Nyt voit käyttää ovia ja kytkimiä + + Kultakirves - - Et voi enää käyttää ovia tai kytkimiä + + Puukuokka - - Nyt voit käyttää säilytysastioita (kuten arkkuja) + + Kultakuokka - - Et voi enää käyttää säilytysastioita (kuten arkkuja) + + Rengasrintapanssari - - Et voi enää hyökätä olentojen kimppuun + + Rengaspanssarin housut - - Nyt voit hyökätä olentojen kimppuun + + Rengaspanssarin saappaat - - Et voi enää hyökätä pelaajien kimppuun + + Puuovi - - Nyt voit hyökätä pelaajien kimppuun + + Rautaovi - - Et voi enää hyökätä eläinten kimppuun + + Rengaspanssarin kypärä - - Nyt voit hyökätä eläinten kimppuun + + Timanttisaappaat - - Olet nyt moderaattori + + Höyhen - - Et ole enää moderaattori + + Ruuti - - Nyt voit lentää + + Vehnänjyviä - - Et voi enää lentää + + Kulho - - Et enää väsy + + Sienimuhennos - - Nyt väsyt + + Siima - - Nyt olet näkymätön + + Vehnä - - Et ole enää näkymätön + + Paistettu porsaankyljys - - Nyt olet haavoittumaton + + Maalaus - - Et ole enää haavoittumaton + + Kultainen omena - - %d MSP + + Leipä - - Äärilisko + + Piikivi - - %s on saapunut Ääreen + + Raaka porsaankyljys - - %s on poistunut Äärestä + + Keppi - - -{*C3*}Näen sen pelaajan, jota tarkoitit.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Niin. Ole varovainen. Hän on päässyt ylemmälle tasolle. Hän voi lukea ajatuksemme.{*EF*}{*B*}{*B*} -{*C2*}Se ei haittaa. Hän luulee, että olemme osa peliä.{*EF*}{*B*}{*B*} -{*C3*}Minä pidän tästä pelaajasta. Hän on pelannut hyvin. Ei luovuttanut.{*EF*}{*B*}{*B*} -{*C2*}Hän lukee ajatuksemme kuin ne olisivat vain sanoja näytöllä.{*EF*}{*B*}{*B*} -{*C3*}Sillä tavoin hän haluaa kuvitella monia asioita, kun hän on vaipunut syvälle pelin uneen.{*EF*}{*B*}{*B*} -{*C2*}Sanat ovat loistava käyttöliittymä. Erittäin mukautuva. Ja vähemmän pelottava kuin näytön takaisen todellisuuden tuijottaminen.{*EF*}{*B*}{*B*} -{*C3*}Ennen he kuulivat ääniä. Silloin kun pelaajat eivät osanneet lukea. Ennen vanhaan he, jotka eivät pelanneet, kutsuivat pelaajia noidiksi ja velhoiksi. Ja pelaajat uneksivat lentävänsä ilmassa kepeillä, jotka kulkivat demonien voimalla.{*EF*}{*B*}{*B*} -{*C2*}Mistä tämä pelaaja uneksi?{*EF*}{*B*}{*B*} -{*C3*}Hän uneksi auringonpaisteesta ja puista. Tulesta ja vedestä. Hän uneksi luovansa. Ja hän uneksi tuhoavansa. Hän uneksi olevansa metsästäjä ja hän uneksi olevansa saalis. Hän uneksi suojapaikasta.{*EF*}{*B*}{*B*} -{*C2*}Hah, alkuperäinen käyttöliittymä. Se on miljoona vuotta vanha, mutta toimii yhä. Mutta mitä oikeita rakennelmia tämä pelaaja loi näytön takaisessa todellisuudessa?{*EF*}{*B*}{*B*} -{*C3*}Hän työskenteli miljoonien muiden kanssa luodakseen todellisen maailman {*EF*}{*NOISE*}{*C3*} taitteeseen, ja loi {*EF*}{*NOISE*}{*C3*} varten {*EF*}{*NOISE*}{*C3*}, joka {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} -{*C2*}Hän ei pysty lukemaan äskeistä ajatusta.{*EF*}{*B*}{*B*} -{*C3*}Ei niin. Hän ei ole vielä saavuttanut korkeinta tasoa. Se hänen täytyy saavuttaa elämän pitkän unen aikana, ei pelin lyhyessä unessa.{*EF*}{*B*}{*B*} -{*C2*}Tietääkö hän, että rakastamme häntä? Että universumi on ystävällinen?{*EF*}{*B*}{*B*} -{*C3*}Kyllä, hän kuulee joskus universumin ajatustensa melun läpi.{*EF*}{*B*}{*B*} -{*C2*}Mutta toisinaan hän on surullinen pitkässä unessa. Hän luo maailmoja, joissa ei ole kesää. Hän värisee pimeän auringon alla ja vie surullisen luomuksensa todellisuuteen.{*EF*}{*B*}{*B*} -{*C3*}Jos hänet parantaisi surusta, se tuhoaisi hänet. Suru on osa hänen omaa tehtäväänsä. Emme saa sekaantua siihen.{*EF*}{*B*}{*B*} -{*C2*}Joskus, kun he ovat syvässä unessa, haluaisin kertoa heille, että he rakentavat oikeasti todellisia maailmoja. Joskus haluaisin kertoa heille heidän tärkeydestään universumille. Ja joskus, kun he eivät ole päässeet kunnon yhteyteen pitkään aikaan, haluaisin auttaa heitä lausumaan pelkäämänsä sanan.{*EF*}{*B*}{*B*} -{*C3*}Hän luki ajatuksemme.{*EF*}{*B*}{*B*} -{*C2*}Joskus en piittaa siitä. Joskus tahtoisin kertoa heille, että tämä heidän todellisena pitämänsä maailma on vain {*EF*}{*NOISE*}{*C2*} ja {*EF*}{*NOISE*}{*C2*}. Tahtoisin kertoa heille, että he ovat {*EF*}{*NOISE*}{*C2*} suuressa {*EF*}{*NOISE*}{*C2*}. He näkevät niin vähän todellisuutta pitkässä unessaan.{*EF*}{*B*}{*B*} -{*C3*}Mutta silti he pelaavat peliä.{*EF*}{*B*}{*B*} -{*C2*}Olisi niin helppoa kertoa heille...{*EF*}{*B*}{*B*} -{*C3*}Se olisi tälle unelle liian voimallista. Jos kertoisimme heille, miten elää, se estäisi heitä elämästä.{*EF*}{*B*}{*B*} -{*C2*}Minä en kerro pelaajalle, miten elää.{*EF*}{*B*}{*B*} -{*C3*}Pelaaja käy kärsimättömäksi.{*EF*}{*B*}{*B*} -{*C2*}Minä kerron pelaajalle tarinan.{*EF*}{*B*}{*B*} -{*C3*}Mutta älä totuutta.{*EF*}{*B*}{*B*} -{*C2*}En niin. Tarinan, joka sisältää totuuden turvallisessa muodossa, sanojen häkissä. En alastonta totuutta, joka polttaisi matkojenkin päästä.{*EF*}{*B*}{*B*} -{*C3*}Anna hänelle taas keho.{*EF*}{*B*}{*B*} -{*C2*}Annan kyllä. Pelaaja...{*EF*}{*B*}{*B*} -{*C3*}Käytä hänen nimeään.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Pelien pelaaja.{*EF*}{*B*}{*B*} -{*C3*}Hyvä.{*EF*}{*B*}{*B*} + + Ämpäri - - -{*C2*}Vedäpä henkeä. Vielä uudestaan. Tunne ilma keuhkoissasi. Anna raajojesi palata. Niin, liikuta sormiasi. Omaksu taas keho, joka on painovoiman alainen, ilmassa. Synny uudelleen pitkään uneen. Siinähän sinä oletkin. Kehosi koskettaa taas universumia joka kohdasta, kuin olisitte erillisiä. Kuin mekin olisimme erillisiä.{*EF*}{*B*}{*B*} -{*C3*}Keitä me olemme? Joskus meitä kutsuttiin vuorenhengeksi. Isä auringoksi, äiti kuuksi. Muinaisiksi hengiksi, eläinhengiksi. Jinneiksi. Aaveiksi. Vihreäksi mieheksi. Sitten jumaliksi, demoneiksi. Enkeleiksi. Räyhähengiksi. Muukalaisiksi, maan ulkopuolisiksi. Leptoneiksi, kvarkeiksi. Sanat muuttuvat. Me emme muutu.{*EF*}{*B*}{*B*} -{*C2*}Me olemme universumi. Me olemme kaikkea, minkä luulet olevan jotain muuta kuin sinä itse. Katsot meitä nyt, ihollasi ja silmilläsi. Ja miksi universumi sitten koskettaa ihoasi ja loistaa valoa yllesi? Jotta se näkisi sinut, pelaaja. Oppiakseen tuntemaan sinut. Ja tullakseen tunnetuksi. Minä kerron sinulle tarinan.{*EF*}{*B*}{*B*} -{*C2*}Olipa kerran pelaaja.{*EF*}{*B*}{*B*} -{*C3*}Se palaaja olit sinä, {*PLAYER*}.{*EF*}{*B*}{*B*} -{*C2*}Joskus hän piti itseään ihmisenä, joka eli sulan kivipallon ohuella ulkokuorella. Tuo sulan kiven täyttämä pallo kiersi loistavana palavaa kaasupalloa, joka oli sitä kolmekymmentätuhatta kertaa suurempi. Ne olivat niin kaukana toisistaan, että valolta kesti kahdeksan minuuttia kulkea tuo matka. Valo oli tietoa tähdestä, ja se pystyi kärventämään ihosi 150 miljoonan kilometrin päästä.{*EF*}{*B*}{*B*} -{*C2*}Joskus pelaaja uneksi olevansa kaivostyöläinen maanpinnalla, joka oli tasainen ja loputon. Aurinko oli valkoinen neliö. Päivät olivat lyhyitä ja tekemistä oli paljon – ja kuolema oli vain väliaikainen pikku haitta.{*EF*}{*B*}{*B*} -{*C3*}Joskus pelaaja uneksi joutuneensa eksyksiin tarinaan.{*EF*}{*B*}{*B*} -{*C2*}Joskus pelaaja uneksi olevansa jotain muuta, jossain muualla. Joskus unet olivat häiritseviä. Joskus taas hyvin kauniita. Joskus pelaaja heräsi yhdestä unesta toiseen, ja siitä edelleen kolmanteen.{*EF*}{*B*}{*B*} -{*C3*}Joskus pelaaja uneksi katselevansa sanoja näytöllä.{*EF*}{*B*}{*B*} -{*C2*}Palataan takaisin.{*EF*}{*B*}{*B*} -{*C2*}Pelaajan atomit olivat hajallaan ruohikolla, joissa, ilmassa, maassa. Nainen keräsi atomit; hän joi ja söi ja hengitti; ja nainen kokosi pelaajan kehoonsa.{*EF*}{*B*}{*B*} -{*C2*}Niinpä pelaaja heräsi äitinsä kehon lämpimästä ja pimeästä maailmasta pitkään uneen.{*EF*}{*B*}{*B*} -{*C2*}Ja pelaaja oli uusi tarina, jota ei koskaan ennen ollut kerrottu, kirjoitettu DNA:n kirjaimin. Ja pelaaja oli uusi ohjelma, jota ei ollut koskaan käynnistetty, jonka pohjana oli miljardeja vuosia vanha lähdekoodi. Ja pelaaja oli uusi ihminen, joka ei ollut koskaan ennen ollut elossa, valmistettu pelkästä maidosta ja rakkaudesta.{*EF*}{*B*}{*B*} -{*C3*}Sinä olet pelaaja. Tarina. Ohjelma. Ihminen. Valmistettu pelkästä maidosta ja rakkaudesta.{*EF*}{*B*}{*B*} -{*C2*}Palataan vielä taaksepäin.{*EF*}{*B*}{*B*} -{*C2*}Seitsemän miljardia miljardia miljardia atomia pelaajan kehossa luotiin kauan ennen tätä peliä, tähden sydämessä. Joten myös pelaaja on tietoa tähdestä. Ja pelaaja liikkuu tarinassa, joka on Julian-nimisen miehen istuttama tietometsä, Markus-nimisen miehen luomassa loputtomassa ja tasaisessa maailmassa, joka sijaitsee pienessä yksityisessä maailmassa, jonka loi pelaaja, joka asuu universumissa, jonka loi...{*EF*}{*B*}{*B*} -{*C3*}Hys. Joskus pelaaja loi pienen yksityisen maailman, joka oli pehmeä, lämmin ja yksinkertainen. Joskus se taas oli kova, kylmä ja monimutkainen. Joskus hän rakensi universumin mallin päässään; energiahiukkasia, jotka liikkuivat valtavan tyhjyyden halki. Joskus hän kutsui noita hiukkasia "elektroneiksi" ja "protoneiksi".{*EF*}{*B*}{*B*} + + Vesiämpäri - - -{*C2*}Joskus hän kutsui niitä "planeetoiksi" ja "tähdiksi".{*EF*}{*B*}{*B*} -{*C2*}Joskus hän uskoi olevansa universumissa joka koostui päälle/pois-energiasta; nollista ja ykkösistä; koodiriveistä. Joskus hän uskoi pelaavansa peliä. Joskus hän uskoi lukevansa sanoja näytöltä.{*EF*}{*B*}{*B*} -{*C3*}Sinä olet pelaaja, lukemassa sanoja...{*EF*}{*B*}{*B*} -{*C2*}Hys... Joskus pelaaja luki koodirivejä näytöltä. Muunsi ne sanoiksi; muunsi sanat tarkoitukseksi; muunsi tarkoituksen tunteiksi, teorioiksi, ideoiksi. Ja pelaaja alkoi hengittää nopeammin ja syvemmin ja tajusi olevansa elossa. Elossa – ne tuhannet kuolemat eivät olleet totta, pelaaja oli elossa.{*EF*}{*B*}{*B*} -{*C3*}Sinä. Sinä. Sinä olet elossa.{*EF*}{*B*}{*B*} -{*C2*}Ja joskus pelaaja kuvitteli universumin puhuneen hänelle auringonvalolla, joka paistoi kesäisten puiden havisevien lehtien lomasta.{*EF*}{*B*}{*B*} -{*C3*}Ja joskus pelaaja uskoi universumin puhuneen hänelle valolla, joka tuikki kirpeältä talviselta yötaivaalta. Silloin valonhäive pelaajan silmäkulmassa olisi saattanut olla miljoona kertaa aurinkoa suurempi tähti, joka oli kiehauttanut planeettansa plasmaksi ollakseen vain hetken näkyvissä pelaajalle. Pelaajalle joka oli kävelemässä kotiinsa universumin kaukaisella laidalla haistaen yllättäen ruuan, miltei jo tutulla ovella, pian taas uneksimassa.{*EF*}{*B*}{*B*} -{*C2*}Ja joskus pelaaja uskoi universumin puhuneen hänelle nollilla ja ykkösillä, maailman sähköisyydellä, näytöllä vierivillä sanoilla unen lopussa.{*EF*}{*B*}{*B*} -{*C3*}Ja universumi sanoi: "Minä rakastan sinua."{*EF*}{*B*}{*B*} -{*C2*}Ja universumi sanoi: "Olet pelannut peliä hyvin."{*EF*}{*B*}{*B*} -{*C3*}Ja universumi sanoi: "Kaiken tarvitsemasi löydät sisältäsi."{*EF*}{*B*}{*B*} -{*C2*}Ja universumi sanoi: "Olet vahvempi kuin aavistat."{*EF*}{*B*}{*B*} -{*C3*}Ja universumi sanoi: "Sinä olet päivänvalo."{*EF*}{*B*}{*B*} -{*C2*}Ja universumi sanoi: "Sinä olet yö."{*EF*}{*B*}{*B*} -{*C3*}Ja universumi sanoi: "Pimeys, jota vastustat, on sisälläsi."{*EF*}{*B*}{*B*} -{*C2*}Ja universumi sanoi: "Valo, jota etsit, on sisälläsi."{*EF*}{*B*}{*B*} -{*C3*}Ja universumi sanoi: "Sinä et ole yksin."{*EF*}{*B*}{*B*} -{*C2*}Ja universumi sanoi: "Sinä et ole erossa kaikesta muusta."{*EF*}{*B*}{*B*} -{*C3*}Ja universumi sanoi: "Sinä olet universumi, joka maistaa itseään, puhuu itselleen, lukee omaa koodiaan."{*EF*}{*B*}{*B*} -{*C2*}Ja universumi sanoi: "Minä rakastan sinua, koska olet rakkaus."{*EF*}{*B*}{*B*} -{*C3*}Ja niin peli päättyi ja pelaaja heräsi unestaan. Ja pelaaja alkoi nähdä uutta unta. Ja pelaaja uneksi jälleen, uneksi paremmin. Ja pelaaja oli universumi. Ja pelaaja oli rakkaus.{*EF*}{*B*}{*B*} -{*C3*}Sinä olet pelaaja.{*EF*}{*B*}{*B*} -{*C2*}Herää.{*EF*} + + Laavaämpäri - - Nollaa Horna + + Kultasaappaat - - Haluatko varmasti nollata Hornan sen oletustilaan tässä tallenteessa? Menetät kaiken, mitä olet Hornassa rakentanut! + + Rautaharkko - - Nollaa Horna + + Kultaharkko - - Älä nollaa Hornaa + + Tulukset - - Tätä sienilehmää ei voi keritä tällä hetkellä. Sikojen, lampaiden, lehmien ja kissojen enimmäismäärä on saavutettu. + + Kivihiili - - Luomismunaa ei voi käyttää tällä hetkellä. Sikojen, lampaiden, lehmien ja kissojen enimmäismäärä on saavutettu. + + Puuhiili - - Luomismunaa ei voi käyttää tällä hetkellä. Sienilehmien enimmäismäärä on saavutettu. + + Timantti - - Luomismunaa ei voi käyttää tällä hetkellä. Susien enimmäismäärä maailmassa on saavutettu. + + Omena - - Luomismunaa ei voi käyttää tällä hetkellä. Kanojen enimmäismäärä maailmassa on saavutettu. + + Jousi - - Luomismunaa ei voi käyttää tällä hetkellä. Mustekalojen enimmäismäärä maailmassa on saavutettu. + + Nuoli - - Luomismunaa ei voi käyttää tällä hetkellä. Vihollisten enimmäismäärä maailmassa on saavutettu. + + Musiikkilevy - "ward" - - Luomismunaa ei voi käyttää tällä hetkellä. Kyläläisten enimmäismäärä maailmassa on saavutettu. + + + Valitse, minkä tyyppisiä esineitä tahdot valmistaa painamalla{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*}. Valitse rakennukset.{*StructuresIcon*} - - Maalausten/kehysten enimmäismäärä maailmassa on saavutettu. + + + Valitse, minkä tyyppisiä esineitä tahdot valmistaa painamalla{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*}. Valitse työkalut.{*ToolsIcon*} - - Et voi luoda vihollisia Rauhallisella vaikeustasolla. + + + Nyt kun olet rakentanut työpöydän, sinun kannattaa asettaa se maailmaan. Sitten voit valmistaa suuremman valikoiman esineitä.{*B*} + Poistu nyt valmistusvalikosta painamalla{*CONTROLLER_VK_B*}. - - Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien sikojen, lampaiden, lehmien ja kissojen enimmäismäärä on saavutettu. + + + Rakentamillasi työkaluilla olet päässyt hyvään alkuun, ja pystyt keräämään monia erilaisia materiaaleja tehokkaammin.{*B*} + Poistu nyt valmistusvalikosta painamalla{*CONTROLLER_VK_B*}. - - Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien susien enimmäismäärä on saavutettu. + + + Usein valmistaminen vaatii useita vaiheita. Nyt kun sinulla on lankkuja, voit tehdä enemmän esineitä. Vaihda esinettä, jonka tahdot valmistaa, painamalla{*CONTROLLER_MENU_NAVIGATE*}. Valitse työpöytä.{*CraftingTableIcon*} - - Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien kanojen enimmäismäärä on saavutettu. + + + Vaihda esinettä, jonka tahdot valmistaa, painamalla{*CONTROLLER_MENU_NAVIGATE*}. Joistain esineistä voi tehdä eri versioita riippuen käytetyistä materiaaleista. Valitse puulapio.{*WoodenShovelIcon*} - - Tämä eläin ei voi siirtyä Rakkaustilaan. Lisääntyvien sienilehmien enimmäismäärä on saavutettu. + + Keräämästäsi puusta voi valmistaa lankkuja. Valitse lankkukuvake ja valmista niitä painamalla{*CONTROLLER_VK_A*}.{*PlanksIcon*} - - Veneiden enimmäismäärä maailmassa on saavutettu. + + + Työpöydän avulla voi valmistaa suuremman valikoiman esineitä. Pöydällä valmistaminen tapahtuu samoin kuin tavallinenkin valmistaminen, mutta valmistusalue on suurempi, jolloin valittavina on enemmän erilaisia raaka-aineyhdistelmiä. - - Olentojen päiden enimmäismäärä maailmassa on saavutettu. + + Valmistusalueella näkyvät esineet, joita tarvitaan uuden esineen valmistamiseksi. Valmista esine painamalla{*CONTROLLER_VK_A*} ja aseta se tavaraluetteloosi. - - Katso peilistä + + Selaa yläreunan Ryhmätyyppivälilehtiä painamalla{*CONTROLLER_VK_LB*} tai{*CONTROLLER_VK_RB*}, niin voit valita, minkä esineryhmän esineitä haluat valmistaa. Valitse sitten valmistettava esine painamalla{*CONTROLLER_MENU_NAVIGATE*}. - - Vasenkätisyys + + + Valittuna olevan esineen valmistamiseksi vaaditut raaka-aineet näkyvät tässä. - - Kuolit! + + + Parhaillaan valittuna olevan esineen kuvaus näkyy tässä. Kuvauksesta pystyy päättelemään, mihin esinettä kenties voi käyttää. - - Synny uudelleen + + + Valmistusvalikon alaosassa oikealla näkyvät tavarasi. Tällä alueella näkyy myös kuvaus parhaillaan valittuna olevasta esineestä sekä sen valmistamiseksi vaaditut raaka-aineet. - - Ladattavan sisällön tarjoukset + + + Joitain esineitä ei voi valmistaa työpöydällä, vaan niihin tarvitaan uuni. Valmista nyt uuni.{*FurnaceIcon*} - - Vaihda ulkoasua + + Sora - - Peliohje + + Kultamalmi - - Ohjaus + + Rautamalmi - - Asetukset + + Laava - - Tekijät + + Hiekka - - Asenna sisältö uudestaan + + Hiekkakivi - - Virheenkorjausasetukset + + Kivihiilimalmi - - Tuli leviää + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää uunia, paina{*CONTROLLER_VK_B*}. - - Dynamiitti räjähtää + + + Tämä on uunivalikko. Uunin avulla saat muutettua esineitä kuumentamalla niitä. Uunilla pystyt esimerkiksi muuttamaan rautamalmia rautaharkoiksi. - - Pelaaja vastaan pelaaja + + + Aseta valmistamasi uuni maailmaan. Se kannattaa asettaa sisälle suojapaikkaasi.{*B*} + Poistu nyt valmistusvalikosta painamalla{*CONTROLLER_VK_B*}. - - Luota pelaajiin + + Puu - - Istunnon järjestäjän oikeudet + + Tammipuu - - Luo rakennelmia + + + Sinun on laitettava polttoainetta uunin alapaikkaan ja muutettava esine sen yläpaikkaan. Tällöin uuni kuumenee ja alkaa toimia, minkä jälkeen tuotettava esine ilmestyy oikeanpuoleiseen paikkaan. - - Täysin tasainen maailma + + {*B*} + Näytä tavaraluettelo uudestaan painamalla{*CONTROLLER_VK_X*}. - - Bonusarkku + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää tavaraluetteloa, paina{*CONTROLLER_VK_B*}. - - Maailman asetukset + + Tämä on tavaraluettelosi. Sieltä näet kädessäsi käyttövalmiina pitämäsi esineet sekä kaikki muut mukanasi kantamat tavarat. Myös panssarisi näkyy täällä. - - Saa rakentaa ja louhia + + + {*B*} + Paina{*CONTROLLER_VK_A*} jatkaaksesi opetuspeliä.{*B*} + Paina{*CONTROLLER_VK_B*}, jos arvelet olevasi valmis pelaamaan omillasi. + - - Saa käyttää ovia ja kytkimiä + + Jos siirrät osoittimella esineen tavaraluettelon reunan ulkopuolelle, voit tiputtaa sen. - - Saa avata säilytysastioita + + Siirrä tämä esine osoittimella tavaraluettelon toisen kohdan ylle ja aseta se paikoilleen painamalla{*CONTROLLER_VK_A*}. + Jos osoittimella on poimittu useita esineitä, voit asettaa ne kaikki painamalla{*CONTROLLER_VK_A*} tai yhden niistä painamalla{*CONTROLLER_VK_X*}. - - Saa hyökätä pelaajien kimppuun + + Liikuta osoitinta painamalla{*CONTROLLER_MENU_NAVIGATE*}. Valitse osoittimen alla oleva esine painamalla{*CONTROLLER_VK_A*}. + Jos esineitä on enemmän kuin yksi, voit poimia näin ne kaikki, tai jos painat {*CONTROLLER_VK_X*}, voit poimia puolet niistä. - - Saa hyökätä eläinten kimppuun + + + Olet suorittanut opetuspelin ensimmäisen osan. + - - Moderaattori + + Valmista uunin avulla lasia. Odotellessasi lasin valmistumista voisit käyttää ajan hyväksesi keräämällä lisää materiaaleja suojapaikan korjaamista varten? - - Potkaise pelaaja + + Valmista uunin avulla puuhiiltä. Odotellessasi puuhiilen valmistumista voisit käyttää ajan hyväksesi keräämällä lisää materiaaleja suojapaikan korjaamista varten? - - Saa lentää + + Aseta uuni maailmaan painamalla{*CONTROLLER_ACTION_USE*}, ja avaa se sitten. - - Väsyminen pois päältä + + Öisin saattaa tulla erittäin pimeää, joten suojapaikkaasi kannattaa laittaa valaistusta, jotta näet ympärillesi. Valmista nyt soihtu kepeistä ja puuhiilestä valmistusvalikossa.{*TorchIcon*} - - Näkymätön + + Aseta ovi painamalla{*CONTROLLER_ACTION_USE*}. Maailmassa olevan oven voi avata ja sulkea painamalla{*CONTROLLER_ACTION_USE*}. - - Istunnon järjestäjän asetukset + + Hyvässä suojapaikassa on ovi, jotta pääset helposti sisään ilman, että sinun tarvitsee louhia seinään aukko ja korjata se sitten. Valmista nyt puuovi.{*WoodenDoorIcon*} - - Pelaajat/kutsu + + + Jos haluat tietää lisää esineestä, siirrä osoitin sen ylle ja paina{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. - - Verkkopeli + + +Tämä on valmistusvalikko. Tässä valikossa pystyt yhdistelemään keräämiäsi esineitä uusiksi esineiksi. - - Vain kutsu + + Poistu nyt Luovan tilan tavaraluettelosta painamalla{*CONTROLLER_VK_B*}. - - Lisäasetukset + + + Jos haluat tietää lisää esineestä, siirrä osoitin sen ylle ja paina{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. - - Lataa + + {*B*} + Näytä valitun esineen valmistamiseksi vaaditut raaka-aineet painamalla{*CONTROLLER_VK_X*}. - - Uusi maailma + + {*B*} + Avaa esineen kuvaus painamalla{*CONTROLLER_VK_X*}. - - Maailman nimi + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo valmistaa esineitä, paina{*CONTROLLER_VK_B*}. - - Siemen maailmageneraattorille + + Selaa yläreunan Ryhmätyyppivälilehtiä painamalla{*CONTROLLER_VK_LB*} tai{*CONTROLLER_VK_RB*}, niin voit valita, minkä esineryhmän esineitä haluat poimia. - - Jätä tyhjäksi, niin siemen on satunnainen + + {*B*} + Jatka painamalla{*CONTROLLER_VK_A*}.{*B*} + Jos osaat jo käyttää Luovan tilan tavaraluetteloa, paina{*CONTROLLER_VK_B*}. - - Pelaajat + + + Tämä on Luovan tilan tavaraluettelo. Sieltä näet kädessäsi käyttövalmiina pitämäsi esineet sekä kaikki muut valittavina olevat tavarat. - - Liity peliin + + + Poistu nyt tavaraluettelosta painamalla{*CONTROLLER_VK_B*}. - - Aloita peli + + Jos siirrät osoittimella esineen tavaraluettelon reunan ulkopuolelle, voit tiputtaa sen maailmaan. Jos haluat poistaa kaikki esineet pikavalintapalkista, paina{*CONTROLLER_VK_X*}. - - Pelejä ei löytynyt + + +Osoitin siirtyy automaattisesti käyttörivillä olevaan tilaan. Voit asettaa esineen paikoilleen painamalla{*CONTROLLER_VK_A*}. Kun olet asettanut esineen, osoitin palaa tavaraluetteloon, mistä voit valita toisen esineen. + + + Liikuta osoitinta painamalla{*CONTROLLER_MENU_NAVIGATE*}. + Kun olet tavaraluettelossa, poimi osoittimen alla oleva yksittäinen esine painamalla{*CONTROLLER_VK_A*}, ja poimi koko esinepino painamalla{*CONTROLLER_VK_Y*}. - - Pelaa peliä + + Vesi - - Tulostilastot + + Lasipullo - - Ohjeet ja asetukset + + Vesipullo - - Avaa koko peli + + Hämähäkin silmä - - Jatka peliä + + Kultahippu - - Tallenna peli + + Hornapahka - - Vaikeustaso: + + {*splash*}{*prefix*}juoma{*postfix*} - - Pelityyppi: + + Pilaantunut silmä - - Rakennelmat: + + Pata - - Kenttätyyppi: + + Ääreläisensilmä - - PvP: + + Kimalteleva meloni - - Luota pelaajiin: + + Roihujauhe - - Dynamiitti: + + Magmavoide - - Tuli leviää: + + Keittoteline - - Asenna teema uudelleen + + Hornanhengen kyynel - - Asenna pelaajakuva 1 uudelleen + + Kurpitsansiemenet - - Asenna pelaajakuva 2 uudelleen + + Meloninsiemenet - - Asenna avatar-esine 1 uudelleen + + Raaka kana - - Asenna avatar-esine 2 uudelleen + + Musiikkilevy - "11" - - Asenna avatar-esine 3 uudelleen + + Musiikkilevy - "where are we now" - - Asetukset + + Keritsimet - - Äänet + + Paistettu kana - - Ohjaus + + Äärenhelmi - - Grafiikka + + Meloninviipale - - Käyttöliittymä + + Roihutanko - - Nollaa oletusarvoihin + + Raaka pihvi - - Kuvan keikkuminen + + Paistettu pihvi - - Vinkit + + Mätä liha - - Pelin sisäiset vinkit + + Lumouspullo - - 2 pelaajan vertik. jaettu näyttö + + Tammipuulankut - - Valmis + + Kuusipuulankut - - Muokkaa kyltin viestiä: + + Koivupuulankut - - Täytä näyttökuvasi tiedot + + Ruohopalikka - - Kuvateksti + + Maa - - Näyttökuva pelistä + + Mukulakivi - - Muokkaa kyltin viestiä: + + Viidakkopuulankut - - Klassiset Minecraft-tekstuurit, kuvakkeet ja käyttöliittymä! + + Koivun taimi - - Näytä kaikki yhdistelmämaailmat + + Viidakkopuun taimi - - Ei tehosteita + + Peruskallio - - nopeus + + Taimi - - hitaus + + Tammen taimi - - kiire + + Kuusen taimi - - louhintauupumus + + Kivi - - voima + + Kehys - - heikkous + + Luo: {*CREATURE*} - - välitön elinvoima + + Hornatiili - - välitön vahinko + + Tulilataus - - tehostettu hyppy + + Tulilataus (puuhiili) - - pahoinvointi + + Tulilataus (kivihiili) - - paraneminen + + Pääkallo - - kesto + + Pää - - tulen kesto + + Pää (%s) - - vesihengitys + + Lurkin pää - - näkymättömyys + + Luurangon pääkallo - - sokeus + + Näivettäjäluurangon pääkallo - - yönäkö + + Zombin pää - - nälkä + + Kompakti tapa hiilen säilytykseen. Voidaan käyttää polttoaineena tai polttouunissa. myrkky - - : nopeus + + nälkä : hitaus - - : kiire + + : nopeus - - : Ikävyys + + näkymättömyys - - : voima + + vesihengitys - - : heikkous + + yönäkö - - : parantaminen + + sokeus : vahingonteko - - : hyppy - + + : parantaminen + : pahoinvointi : paraneminen - - : kesto + + : Ikävyys - - : tulen kesto + + : kiire - - : vesihengitys + + : heikkous - - : näkymättömyys + + : voima - - : sokeus + + tulen kesto - - : yönäkö + + Kylläisyys - - : nälkä + + : kesto - - : myrkky + + : hyppy + + + Näivettäjä + + + Elinvoimatehoste + + + Imukyky @@ -5099,29 +5962,41 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? III + + : näkymättömyys + IV - - räjähtävä + + : vesihengitys - - tavallinen + + : tulen kesto - - tylsä + + : yönäkö - - mauton + + : myrkky - - kirkas + + : nälkä - - samea + + imukyky - - laimea + + kylläisyys + + + elinvoimatehoste + + + : sokeus + + + mädätys koruton @@ -5129,17 +6004,17 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? valju - - kelvoton + + laimea - - lattea + + kirkas - - kömpelö + + samea - - tunaroitu + + kelvoton lipevä @@ -5147,164 +6022,188 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? pehmeä - - miellyttävä + + tunaroitu - - tyylikäs + + lattea - - paksu + + kömpelö - - elegantti + + mauton - - hieno + + räjähtävä - - lumoava + + tavallinen + + + tylsä upea - - hienostunut - harras + + lumoava + + + elegantti + + + hieno + helmeilevä + + löyhkäävä + + + kitkerä + + + hajuton + väkevä iljettävä - - hajuton + + miellyttävä - - löyhkäävä + + hienostunut - - kitkerä + + paksu - - karvas + + tyylikäs - - ällöttävä + + Palauttaa pelaajien, eläinten ja hirviöiden elinvoimaa ajan kuluessa. - - haiseva + + Vähentää välittömästi pelaajien, eläinten ja hirviöiden elinvoimaa. - - Käytetään kaikkien juomien perustana. Laita keittotelineeseen luodaksesi juomia. + + Tekee pelaajista, eläimistä ja hirviöistä immuuneja vahingolle tulesta, laavasta ja ammutuista roihuhyökkäyksistä. Ei vaikuta millään tavalla, voidaan käyttää keittotelineessä juomien valmistamiseen raaka-aineita lisäämällä. - - Lisää pelaajien, eläinten ja hirviöiden liikkumisnopeutta, sekä pelaajien juoksunopeutta, hypyn pituutta ja näkökenttää. + + karvas Vähentää pelaajien, eläinten ja hirviöiden liikkumisnopeutta, sekä pelaajien juoksunopeutta, hypyn pituutta ja näkökenttää. + + Lisää pelaajien, eläinten ja hirviöiden liikkumisnopeutta, sekä pelaajien juoksunopeutta, hypyn pituutta ja näkökenttää. + Lisää pelaajien ja hirviöiden hyökätessä tekemää vahinkoa. - - Vähentää pelaajien ja hirviöiden hyökätessä tekemää vahinkoa. - Lisää välittömästi pelaajien, eläinten ja hirviöiden elinvoimaa. - - Vähentää välittömästi pelaajien, eläinten ja hirviöiden elinvoimaa. + + Vähentää pelaajien ja hirviöiden hyökätessä tekemää vahinkoa. - - Palauttaa pelaajien, eläinten ja hirviöiden elinvoimaa ajan kuluessa. + + Käytetään kaikkien juomien perustana. Laita keittotelineeseen luodaksesi juomia. - - Tekee pelaajista, eläimistä ja hirviöistä immuuneja vahingolle tulesta, laavasta ja ammutuista roihuhyökkäyksistä. + + ällöttävä - - Vähentää pelaajien, eläinten ja hirviöiden elinvoimaa ajan kuluessa. + + haiseva + + + Isku Terävyys - - Isku + + Vähentää pelaajien, eläinten ja hirviöiden elinvoimaa ajan kuluessa. - - Niveljalkaisten surma + + Hyökkäysvahinko Tönäisy - - Liekehtivä + + Niveljalkaisten surma - - Suojaus + + Nopeus - - Tulisuojaus + + Zombivahvistukset - - Alas leijuminen + + Hevosen hyppyvoima - - Räjähdyssuoja + + Käytettäessä: - - Ammussuoja + + Tönäisyn vastustus - - Hengitys + + Olentojen seurauskantama - - Vesimieltymys + + Maksimielinvoima + + + Silkkikosketus Tehokkuus - - Silkkikosketus + + Vesimieltymys - - Särkymätön + + Onni Saaliin kerääminen - - Onni + + Särkymätön - - Voima + + Tulisuojaus - - Liekki + + Suojaus - - Lyönti + + Liekehtivä - - Loputtomuus + + Alas leijuminen - - I + + Hengitys - - II + + Ammussuoja - - III + + Räjähdyssuoja IV @@ -5315,23 +6214,29 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? VI + + Lyönti + VII - - VIII + + III - - IX + + Liekki - - X + + Voima - - Voidaan louhia rautaisella tai sitä paremmalla hakulla smaragdien keräämiseksi. + + Loputtomuus - - Samantapainen kuin arkku, paitsi että äärenarkkuun asetetut tavarat ovat saatavilla pelaajan jokaisessa muussakin äärenarkussa, jopa eri ulottuvuuksissa. + + II + + + I Aktivoituu, kun olento kulkee tähän yhdistetyn ansalangan päältä. @@ -5342,51 +6247,75 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Kätevä tapa varastoida smaragdeja. + + Samantapainen kuin arkku, paitsi että äärenarkkuun asetetut tavarat ovat saatavilla pelaajan jokaisessa muussakin äärenarkussa, jopa eri ulottuvuuksissa. + + + IX + + + VIII + + + Voidaan louhia rautaisella tai sitä paremmalla hakulla smaragdien keräämiseksi. + + + X + + + Palauttaa 2{*ICON_SHANK_01*}, ja siitä voi valmistaa kultaisen porkkanan. Voidaan istuttaa viljelysmaahan. + + + Käytetään koristeena. Siihen voi istuttaa kukkia, taimia, kaktuksia tai sieniä. + Mukulakivistä tehty seinä. - - Voidaan käyttää aseiden, työkalujen ja panssarien korjaamiseen. + + Palauttaa 0,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan istuttaa viljelysmaahan. Sulatetaan uunissa hornakvartsin tuottamiseksi. - - Käytetään koristeena. + + Voidaan käyttää aseiden, työkalujen ja panssarien korjaamiseen. Voidaan kaupata kyläläisille. - - Käytetään koristeena. Siihen voi istuttaa kukkia, taimia, kaktuksia tai sieniä. + + Käytetään koristeena. - - Palauttaa 2{*ICON_SHANK_01*}, ja siitä voi valmistaa kultaisen porkkanan. Voidaan istuttaa viljelysmaahan. + + Palauttaa 4{*ICON_SHANK_01*}. - - Palauttaa 0,5{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan istuttaa viljelysmaahan. + + Palauttaa 1{*ICON_SHANK_01*}. Tämän syöminen saattaa myrkyttää sinut. + + + Käytetään satuloidun sian ohjaamiseen ratsastettaessa. Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan paistamalla peruna uunissa. - - Palauttaa 1{*ICON_SHANK_01*}, tai sen voi paistaa uunissa. Voidaan istuttaa viljelysmaahan. Tämän syöminen saattaa myrkyttää sinut. - Palauttaa 3{*ICON_SHANK_01*}. Valmistetaan porkkanasta ja kultahipuista. - - Käytetään satuloidun sian ohjaamiseen ratsastettaessa. - - - Palauttaa 4{*ICON_SHANK_01*}. - Käytetään alasimen kanssa aseiden, työkalujen tai panssarin lumoamiseen. Valmistetaan louhimalla hornakvartsimalmia. Siitä voi valmistaa kvartsipalikan. + + Peruna + + + Paistettu peruna + + + Porkkana + Valmistetaan villasta. Käytetään koristeena. @@ -5396,14 +6325,11 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Kukkaruukku - - Porkkana - - - Peruna + + Kurpitsapiirakka - - Paistettu peruna + + Lumottu kirja Myrkyllinen peruna @@ -5414,11 +6340,11 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Porkkanakeppi - - Kurpitsapiirakka + + Ansakoukku - - Lumottu kirja + + Ansalanka Hornakvartsi @@ -5429,11 +6355,8 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Äärenarkku - - Ansakoukku - - - Ansalanka + + Sammaleinen mukulakiviseinä Smaragdipalikka @@ -5441,8 +6364,8 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Mukulakiviseinä - - Sammaleinen mukulakiviseinä + + Perunat Kukkaruukku @@ -5450,8 +6373,8 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Porkkanat - - Perunat + + Hieman vahingoittunut alasin Alasin @@ -5459,8 +6382,8 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Alasin - - Hieman vahingoittunut alasin + + Kvartsipalikka Pahasti vahingoittunut alasin @@ -5468,8 +6391,8 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Hornakvartsimalmi - - Kvartsipalikka + + Kvartsiportaat Veistetty kvartsipalikka @@ -5477,8 +6400,8 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Kvarsipalikkapylväs - - Kvartsiportaat + + Punainen matto Matto @@ -5486,8 +6409,8 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Musta matto - - Punainen matto + + Sininen matto Vihreä matto @@ -5495,9 +6418,6 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Ruskea matto - - Sininen matto - Lila matto @@ -5510,18 +6430,18 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Harmaa matto - - Vaaleanpunainen matto - Limenvihreä matto - - Keltainen matto + + Vaaleanpunainen matto Vaaleansininen matto + + Keltainen matto + Purppura matto @@ -5534,131 +6454,128 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Veistetty hiekkakivi - - Sileä hiekkakivi - {*PLAYER*} kuoli yrittäessään satuttaa kohdetta {*SOURCE*}. + + Sileä hiekkakivi + {*PLAYER*} liiskautui putoavan alasimen alle. {*PLAYER*} liiskautui putoavan palikan alle. - - Teleporttasi pelaajan {*PLAYER*} sijaintiin {*DESTINATION*}. - {*PLAYER*} teleporttasi sinut luokseen. - - {*PLAYER*} teleporttasi luoksesi. + + Teleporttasi pelaajan {*PLAYER*} sijaintiin {*DESTINATION*}. Okaat - - Kvartsilaatta + + {*PLAYER*} teleporttasi luoksesi. Saa pimeät alueet kirkkaiksi kuin päivänvalossa, jopa veden alla. + + Kvartsilaatta + Tekee näkymättömiksi pelaajat, eläimet ja hirviöt, joihin se vaikuttaa. Korjaus ja nimeäminen - - Lumoamisen hinta: %d - Liian kallis! - - Nimeä uudelleen + + Lumoamisen hinta: %d Sinulla on: - - Tarvitset kaupantekoon: + + Nimeä uudelleen {*VILLAGER_TYPE*} tarjoaa: %s - - Korjaa + + Tarvitset kaupantekoon: Myy - - Värjää panta + + Korjaa Tämä on alasinvalikko, jossa voit nimetä, korjata ja lumota aseita, panssareita ja työkaluja maksamalla kokemusta. + + Värjää panta + + + Kun haluat työstää esinettä, aseta se ensimmäiseen syöttöpaikkaan. + {*B*} Opettele lisää alasinvalikon käyttämistä{*CONTROLLER_VK_A*} .{*B*} Jos osaat jo käyttää alasinvalikkoa, paina{*CONTROLLER_VK_B*}. - - Kun haluat työstää esinettä, aseta se ensimmäiseen syöttöpaikkaan. + + Vaihtoehtoisesti toiseen paikkaan voi asettaa toisen samanlaisen esineen, jos haluaa yhdistää kyseiset esineet. Kun toiseen syöttöpaikkaan laitetaan oikea raaka-aine (esimerkiksi rautaharkkoja vahingoittuneen rautamiekan korjaamiseksi), ehdotettu korjaamisen tulos näkyy tuottopaikassa. - - Vaihtoehtoisesti toiseen paikkaan voi asettaa toisen samanlaisen esineen, jos haluaa yhdistää kyseiset esineet. + + Työn kokemushinta näkyy tuottoalueen alapuolella. Jos sinulle ei ole tarpeeksi kokemusta, korjausta ei voi suorittaa. Jos haluat lumota esineitä alasimella, aseta lumottu kirja toiseen syöttöpaikkaan. - - Työn kokemushinta näkyy tuottoalueen alapuolella. Jos sinulle ei ole tarpeeksi kokemusta, korjausta ei voi suorittaa. + + Korjatun esineen poimiminen käyttää molemmat alasimeen asetetut esineet ja vähentää kokemustasi ilmoitetun määrän. On mahdollista nimetä esine uudestaan muokkaamalla tekstilaatikossa näkyvää nimeä. - - Korjatun esineen poimiminen käyttää molemmat alasimeen asetetut esineet ja vähentää kokemustasi ilmoitetun määrän. - - - Tällä alueella on alasin ja arkku, joka sisältää työkaluja ja aseita, joita voi työstää. - {*B*} Opettele lisää alasimesta{*CONTROLLER_VK_A*} .{*B*} Jos osaat jo käyttää alasinta, paina{*CONTROLLER_VK_B*}. - - Alasimella voi korjata aseet ja työkalut kuntoon, nimetä ne uudestaan tai lumota niitä lumotuilla kirjoilla. + + Tällä alueella on alasin ja arkku, joka sisältää työkaluja ja aseita, joita voi työstää. Lumottuja kirjoja löytyy luolien arkuista, tai niitä voi valmistaa lumoamalla tavallisia kirjoja lumouspöydällä. - - Alasimen käyttäminen maksaa kokemusta, ja jokainen käyttökerta saattaa vahingoittaa alasinta. + + Alasimella voi korjata aseet ja työkalut kuntoon, nimetä ne uudestaan tai lumota niitä lumotuilla kirjoilla. Tehdyn työn tyyppi, esineen arvo, lumousten määrä ja aiemmin tehdyn työn määrä vaikuttavat korjaamisen hintaan. - - Esineen uudelleen nimeäminen muuttaa kaikille pelaajille näkyvää nimeä ja pienentää pysyvästi aiemmin tehdyn työn hintaa. + + Alasimen käyttäminen maksaa kokemusta, ja jokainen käyttökerta saattaa vahingoittaa alasinta. Tämän alueen arkussa on vahingoittuneita hakkuja, raaka-aineita, lumouspulloja ja lumottuja kirjoja, joilla voi harjoitella. - - Tämä on kaupankäyntivalikko, jossa näkyvät kaupat, joita kyläläisen kanssa voi tehdä. + + Esineen uudelleen nimeäminen muuttaa kaikille pelaajille näkyvää nimeä ja pienentää pysyvästi aiemmin tehdyn työn hintaa. @@ -5666,41 +6583,44 @@ Haluatko asentaa yhdistelmäpaketin tai tekstuuripaketin nyt? Opettele lisää kaupankäyntivalikon käyttämistä painamalla{*CONTROLLER_VK_A*} .{*B*} Jos osaat jo käyttää kaupankäyntivalikkoa, paina{*CONTROLLER_VK_B*}. - - Kaikki kaupat, joihin kyläläinen sillä hetkellä on suostuvainen, näkyvät ylhäällä. + + Tämä on kaupankäyntivalikko, jossa näkyvät kaupat, joita kyläläisen kanssa voi tehdä. Kaupat näkyvät punaisina, eivätkä ole mahdollisia, jos sinulla ei ole vaadittuja esineitä. - - Kyläläiselle tarjoamiesi esineiden tyyppi ja määrä näkyy kahdessa vasemmanpuoleisessa laatikossa. + + Kaikki kaupat, joihin kyläläinen sillä hetkellä on suostuvainen, näkyvät ylhäällä. Näet kauppaan vaadittujen esineiden kokonaismäärän kahdesta laatikosta vasemmalla. - - Myy kyläläisen haluamat esineet hänen tarjoamaansa esinettä vastaan painamalla{*CONTROLLER_VK_A*}. + + Kyläläiselle tarjoamiesi esineiden tyyppi ja määrä näkyy kahdessa vasemmanpuoleisessa laatikossa. Tällä alueella on kyläläinen ja arkku, joka sisältää paperia esineiden ostamista varten. + + Myy kyläläisen haluamat esineet hänen tarjoamaansa esinettä vastaan painamalla{*CONTROLLER_VK_A*}. + + + Pelaajat voivat kaupata tavaraluettelonsa esineitä kyläläisille. + {*B*} Opettele lisää kaupankäynnistä{*CONTROLLER_VK_A*}.{*B*} Jos tiedät jo tarpeeksi kaupankäynnistä, paina{*CONTROLLER_VK_B*}. - - Pelaajat voivat kaupata tavaraluettelonsa esineitä kyläläisille. + + Sekalaisten kauppojen tekeminen lisää tai päivittää sattumanvaraisesti kyläläisen ehdottamia vaihtokauppoja. Kyläläisen tarjoamat vaihtokaupat riippuvat hänen ammatistaan. - - Sekalaisten kauppojen tekeminen lisää tai päivittää sattumanvaraisesti kyläläisen ehdottamia vaihtokauppoja. - Usein tehdyt vaihtokaupat saattavat poistua valikoimasta väliaikaisesti, mutta kyläläinen tarjoaa aina vähintään yhtä vaihtokauppaa. @@ -5837,7 +6757,4 @@ Maailman kaikki äärenarkut ovat yhteydessä toisiinsa. Yhteen äärenarkkuun a Paranna - - Etsitään siementä maailmageneraattoria varten - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsPlatformSpecific.xml index 8b1c5f4d..b4ff1de5 100644 --- a/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/fi-FI/stringsPlatformSpecific.xml @@ -1,243 +1,244 @@  - - NOT USED + + Haluatko kirjautua "PSN"-verkkoon? - - Voit käyttää PlayStation®Vita-järjestelmän kosketusnäyttöä valikoiden selaamiseen. + + Jos pelaaja ei pelaa samalla PlayStation®Vita-järjestelmällä kuin istunnon järjestänyt pelaaja, tämän asetuksen valitseminen potkaisee ulos kyseisen pelaajan sekä kaikki muut pelaajat, jotka pelaavat hänen PlayStation®Vita-järjestelmällään. Pelaaja ei pysty enää liittymään peliin ennen kuin se aloitetaan uudelleen. - - Minecraft-foorumissa on osio, joka on omistettu PlayStation®Vita Edition -pelille. + + SELECT - - Uusimmat tiedot tästä pelistä löytää Twitteristä osoitteista @4JStudios ja @Kappische! + + Tämä asetus poistaa käytöstä trophyt ja pistetilastopäivitykset tässä maailmassa, ja kun maailma ladataan uudestaan, jos se on tallennettu tämän asetuksen ollessa käytössä. - - Älä katso ääreläistä silmiin! + + PlayStation®Vita-järjestelmä - - Uskomme, että 4J Studios on poistanut Herobrinen PlayStation®Vita-järjestelmän pelistä, mutta emme ole asiasta aivan varmoja. + + Valitse Ad Hoc -verkko, jos haluat yhdistää läheisiin PlayStation®Vita-järjestelmiin, tai "PSN", jos haluat yhdistää ystäviin kaikkialla maailmassa. - - Minecraft: PlayStation®Vita Edition rikkoi useita ennätyksiä! + + Ad Hoc -verkko - - {*T3*}PELIOHJE: MONINPELI{*ETW*}{*B*}{*B*} -PlayStation®Vita-järjestelmällä Minecraft on oletusarvoisesti moninpeli.{*B*}{*B*} -Kun aloitat verkkopelin tai liityt sellaiseen, kaveriluettelosi ihmiset näkevät sen (ellet ole peliä järjestäessäsi valinnut vaihtoehtoa "Vain kutsu"), ja jos he liittyvät peliin, se näkyy ihmisille heidän kaveriluettelossaan (jos olet valinnut "Salli kaverien kaverit" -vaihtoehdon).{*B*} -Kun olet pelissä, SELECT-näppäintä painamalla voit avata luettelon kaikista muista pelissä olevista pelaajista ja potkaista pelaajia ulos pelistä. + + Vaihda verkkotilaa - - {*T3*}PELIOHJE: NÄYTTÖKUVIEN JAKAMINEN{*ETW*}{*B*}{*B*} -Voit ottaa näyttökuvan pelistäsi avaamalla taukovalikon, ja jakaa sen Facebookissa painamalla{*CONTROLLER_VK_Y*}. Näet näyttökuvasta pikkuversion ja voit muokata Facebook-julkaisun ohessa näkyvää tekstiä.{*B*}{*B*} -Juuri näiden näyttökuvien ottamista varten on olemassa kameratila, jossa pystyt näkemään hahmosi edestäpäin, kun otat kuvan. Paina{*CONTROLLER_ACTION_CAMERA*} kunnes näet hahmosi edestäpäin ennen kuin painat{*CONTROLLER_VK_Y*} jakaaksesi kuvan.{*B*}{*B*} -Online-tunnuksesi ei näy näyttökuvassa. + + Valitse verkkotila - - {*T3*}PELIOHJE: LUOVA TILA{*ETW*}{*B*}{*B*} -Luovan tilan käyttöliittymässä pelaaja voi siirtää tavaraluetteloonsa pelin minkä tahansa esineen ilman että sitä täytyy louhia tai valmistaa. -Esineitä pelaajan tavaraluettelossa ei poisteta kun ne asetetaan tai käytetään maailmassa, jolloin pelaaja voi keskittyä rakentamiseen resurssien keräämisen sijasta.{*B*} -Jos luot, lataat tai tallennat maailman Luovassa tilassa, siinä maailmassa trophyt ja tulostilastopäivitykset on poistettu käytöstä, vaikka se ladattaisiin myöhemmin Selviytymistilassa.{*B*} -Kun haluat lentää Luovassa tilassa, paina{*CONTROLLER_ACTION_JUMP*} nopeasti kaksi kertaa. Kun haluat lopettaa lentämisen, tee sama uudestaan. Jos haluat lentää nopeammin, paina lentäessäsi{*CONTROLLER_ACTION_MOVE*} eteenpäin kaksi kertaa nopeasti. -Kun olet lentotilassa, voit pitää{*CONTROLLER_ACTION_JUMP*} painettuna noustaksesi ylemmäs ja{*CONTROLLER_ACTION_SNEAK*} painettuna laskeutuaksesi alemmas, tai liikkua ylös painamalla{*CONTROLLER_ACTION_DPAD_UP*}, laskeutua painamalla{*CONTROLLER_ACTION_DPAD_DOWN*}, -lentää vasemmalle painamalla{*CONTROLLER_ACTION_DPAD_LEFT*}, ja lentää oikealle painamalla{*CONTROLLER_ACTION_DPAD_RIGHT*}. + + Jaetun näytön online-tunnukset - - Jos painat{*CONTROLLER_ACTION_JUMP*} kaksi kertaa nopeasti, voit nousta lentoon. Kun haluat lopettaa lentämisen, tee sama uudestaan. Jos haluat lentää nopeammin, paina lentäessäsi{*CONTROLLER_ACTION_MOVE*} eteenpäin kaksi kertaa nopeasti. -Lentotilassa voit nousta ylemmäs pitämällä{*CONTROLLER_ACTION_JUMP*} painettuna, laskeutua alemmas pitämällä{*CONTROLLER_ACTION_SNEAK*} painettuna, tai liikkua suuntanäppäimillä ylös, alas, vasemmalle tai oikealle. + + Trophyt - - EI KÄYTÖSSÄ + + Tämän pelin kentät tallentuvat automaattisesti. Kun näet tämän kuvan, peli tallentaa tietojasi. +Älä sammuta PlayStation®Vita-järjestelmää, kun tämä kuva näkyy näytöllä. - - EI KÄYTÖSSÄ + + Kun tämä asetus on käytössä, istunnon järjestäjä voi pelinsisäisestä valikosta ottaa käyttöön tai poistaa käytöstä lentokyvyn, hengästymisen ja näkymättömyyden. Poistaa käytöstä trophyt ja tulostilaston päivitykset. - - "EI KÄYTÖSSÄ" + + Online-tunnukset: - - "EI KÄYTÖSSÄ" + + Käytät tekstuuripaketin koeversiota. Voit käyttää tekstuuripaketin koko sisältöä, mutta et pysty tallentamaan edistymistäsi. +Jos yrität tallentaa käyttäessäsi koeversiota, sinulle tarjotaan mahdollisuutta ostaa täysi versio. + - - Kutsu kavereita + + Paketti 1.04 (Pelipäivitys 14) - - Jos luot, lataat tai tallennat maailman Luovassa tilassa, kyseisen maailman trophyt ja tulostilaston päivitykset eivät ole käytössä, vaikka se myöhemmin ladattaisiinkin Selviytymistilassa. Haluatko varmasti jatkaa? + + Online-tunnukset pelissä - - Tämä maailma on aiemmin tallennettu Luovassa tilassa ja siksi sen trophyt ja tulostilaston päivitykset eivät ole käytössä. Haluatko varmasti jatkaa? + + Katso mitä minä tein Minecraft: PlayStation®Vita Edition -pelissä! - - Tämä maailma on aiemmin tallennettu Luovassa tilassa, ja siksi sen trophyt ja tulostilastojen päivitykset eivät ole käytössä. + + Lataus epäonnistui. Yritä myöhemmin uudelleen. - - Jos luot, lataat tai tallennat maailman kun "Pelin järjestäjän oikeudet" ovat käytössä, kyseisen maailman trophyt ja tulostilaston päivitykset eivät ole käytössä, vaikka se myöhemmin ladattaisiin ilman Pelin järjestäjän oikeuksia. Haluatko varmasti jatkaa? + + Peliin liittyminen epäonnistui rajoittavan NAT-tyypin takia. Tarkista verkkoasetuksesi. - - Yhteys "PSN"-verkkoon katkesi. Poistutaan päävalikkoon. + + Lähetys epäonnistui. Yritä myöhemmin uudelleen. - - Yhteys "PSN"-verkkoon katkesi. + + Lataus valmis! - - Tämä on Minecraft: PlayStation®Vita Edition -koepeli. Jos sinulla olisi koko peli, olisit juuri ansainnut trophyn! -Avaa koko peli kokeaksesi Minecraft: PlayStation®Vita Edition -pelin riemun ja pelataksesi "PSN"-verkon kautta ympäri maailmaa asuvien kaveriesi kanssa. -Haluatko avata koko pelin? + + Tallenteensiirtoalueella ei ole tällä hetkellä tallennetta saatavilla. +Voit lähettää maailmatallenteen tallenteensiirtoalueelle Minecraft: PlayStation®3 Edition -pelistä ja ladata sen sitten Minecraft: PlayStation®Vita Edition -peliin. - - Tämä on Minecraft: PlayStation®Vita Edition -koepeli. Jos sinulla olisi koko peli, olisit juuri ansainnut teeman! -Avaa koko peli kokeaksesi Minecraft: PlayStation®Vita Edition -pelin riemun ja pelataksesi "PSN"-verkon kautta ympäri maailmaa asuvien kaveriesi kanssa. -Haluatko avata koko pelin? + + Tallennus kesken - - Tämä on Minecraft: PlayStation®Vita Edition -koepeli. Tarvitset koko pelin, jotta voisit hyväksyä tämän kutsun. -Haluatko avata koko pelin? + + Minecraft: PlayStation®Vita Editionin tallennustiedoille ei ole riittävästi tilaa. Tee tilaa poistamalla muita Minecraft: PlayStation®Vita Editionin tallennuksia. - - Vierailevat pelaajat eivät voi avata koko peliä. Kirjaudu sisään Sony Entertainment Network -tilillä. + + Lähettäminen peruttu - - Online-tunnus + + Olet perunut tämän tallenteen lähettämisen tallenteensiirtoalueelle. - - Keittäminen + + Lähetä tallennus PS3™/PS4™-järjestelmälle - - Sinut palautettiin aloitusnäyttöön, koska kirjauduit ulos "PSN"-verkosta. + + Lähetetään tietoja: %d%% - - Olet pelannut Minecraft: PlayStation®Vita Edition -koepeliä pisimmän sallitun ajan! Haluatko avata koko pelin ja jatkaa hauskuutta? + + "PSN" - - Minecraft: PlayStation®Vita Edition -pelin lataaminen ei onnistunut, eikä sitä voi jatkaa. + + Lataa PS3™-tallenne - - Peliin liittyminen ei onnistunut, koska yksi tai useampi pelaaja ei saa pelata verkossa Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. + + Ladataan tietoja: %d%% - - Verkkopelin luominen ei onnistunut, koska yksi tai useampi pelaaja ei saa pelata verkossa Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. Poista ruksi "Lisäasetukset"-kohdan "Verkkopeli"-ruudusta aloittaaksesi paikallisen pelin. + + Tallennetaan - - Sinä et saa liittyä tähän peli-istuntoon, koska verkkopelaaminen on estetty Sony Entertainment Network -tililläsi keskustelurajoitusten vuoksi. + + Lähetys valmis! - - Sinä et saa liittyä tähän peli-istuntoon, koska yhden paikallisen pelaajasi verkkopelaaminen on estetty Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. Poista ruksi "Lisäasetukset"-kohdan "Verkkopeli"-ruudusta aloittaaksesi paikallisen pelin. + + Oletko varma, että haluat lähettää tämän tallenteen ja korvata mahdollisen aiemman tallennuksen tallennussiirtoalueelta? - - Sinä et saa luoda tätä peli-istuntoa, koska yhden paikallisen pelaajasi verkkopelaaminen on estetty Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. Poista ruksi "Lisäasetukset"-kohdan "Verkkopeli"-ruudusta aloittaaksesi paikallisen pelin. + + Muunnetaan dataa - - Tämän pelin kentät tallentuvat automaattisesti. Kun näet tämän kuvan, peli tallentaa tietojasi. -Älä sammuta PlayStation®Vita-järjestelmää, kun tämä kuva näkyy näytöllä. + + EI KÄYTÖSSÄ - - Kun tämä asetus on käytössä, istunnon järjestäjä voi pelinsisäisestä valikosta ottaa käyttöön tai poistaa käytöstä lentokyvyn, hengästymisen ja näkymättömyyden. Poistaa käytöstä trophyt ja tulostilaston päivitykset. + + EI KÄYTÖSSÄ - - Jaetun näytön online-tunnukset + + {*T3*}PELIOHJE: LUOVA TILA{*ETW*}{*B*}{*B*} +Luovan tilan käyttöliittymässä pelaaja voi siirtää tavaraluetteloonsa pelin minkä tahansa esineen ilman että sitä täytyy louhia tai valmistaa. +Esineitä pelaajan tavaraluettelossa ei poisteta kun ne asetetaan tai käytetään maailmassa, jolloin pelaaja voi keskittyä rakentamiseen resurssien keräämisen sijasta.{*B*} +Jos luot, lataat tai tallennat maailman Luovassa tilassa, siinä maailmassa trophyt ja tulostilastopäivitykset on poistettu käytöstä, vaikka se ladattaisiin myöhemmin Selviytymistilassa.{*B*} +Kun haluat lentää Luovassa tilassa, paina{*CONTROLLER_ACTION_JUMP*} nopeasti kaksi kertaa. Kun haluat lopettaa lentämisen, tee sama uudestaan. Jos haluat lentää nopeammin, paina lentäessäsi{*CONTROLLER_ACTION_MOVE*} eteenpäin kaksi kertaa nopeasti. +Kun olet lentotilassa, voit pitää{*CONTROLLER_ACTION_JUMP*} painettuna noustaksesi ylemmäs ja{*CONTROLLER_ACTION_SNEAK*} painettuna laskeutuaksesi alemmas, tai liikkua ylös painamalla{*CONTROLLER_ACTION_DPAD_UP*}, laskeutua painamalla{*CONTROLLER_ACTION_DPAD_DOWN*}, +lentää vasemmalle painamalla{*CONTROLLER_ACTION_DPAD_LEFT*}, ja lentää oikealle painamalla{*CONTROLLER_ACTION_DPAD_RIGHT*}. - - Trophyt + + Jos painat{*CONTROLLER_ACTION_JUMP*} kaksi kertaa nopeasti, voit nousta lentoon. Kun haluat lopettaa lentämisen, tee sama uudestaan. Jos haluat lentää nopeammin, paina lentäessäsi{*CONTROLLER_ACTION_MOVE*} eteenpäin kaksi kertaa nopeasti. +Lentotilassa voit nousta ylemmäs pitämällä{*CONTROLLER_ACTION_JUMP*} painettuna, laskeutua alemmas pitämällä{*CONTROLLER_ACTION_SNEAK*} painettuna, tai liikkua suuntanäppäimillä ylös, alas, vasemmalle tai oikealle. - - Online-tunnukset: + + "EI KÄYTÖSSÄ" - - Online-tunnukset pelissä + + Jos luot, lataat tai tallennat maailman Luovassa tilassa, kyseisen maailman trophyt ja tulostilaston päivitykset eivät ole käytössä, vaikka se myöhemmin ladattaisiinkin Selviytymistilassa. Haluatko varmasti jatkaa? - - Katso mitä minä tein Minecraft: PlayStation®Vita Edition -pelissä! + + Tämä maailma on aiemmin tallennettu Luovassa tilassa ja siksi sen trophyt ja tulostilaston päivitykset eivät ole käytössä. Haluatko varmasti jatkaa? - - Käytät tekstuuripaketin koeversiota. Voit käyttää tekstuuripaketin koko sisältöä, mutta et pysty tallentamaan edistymistäsi. -Jos yrität tallentaa käyttäessäsi koeversiota, sinulle tarjotaan mahdollisuutta ostaa täysi versio. - + + "EI KÄYTÖSSÄ" - - Paketti 1.04 (Pelipäivitys 14) + + Kutsu kavereita - - SELECT + + Minecraft-foorumissa on osio, joka on omistettu PlayStation®Vita Edition -pelille. - - Tämä asetus poistaa käytöstä trophyt ja pistetilastopäivitykset tässä maailmassa, ja kun maailma ladataan uudestaan, jos se on tallennettu tämän asetuksen ollessa käytössä. + + Uusimmat tiedot tästä pelistä löytää Twitteristä osoitteista @4JStudios ja @Kappische! - - Haluatko kirjautua "PSN"-verkkoon? + + NOT USED - - Jos pelaaja ei pelaa samalla PlayStation®Vita-järjestelmällä kuin istunnon järjestänyt pelaaja, tämän asetuksen valitseminen potkaisee ulos kyseisen pelaajan sekä kaikki muut pelaajat, jotka pelaavat hänen PlayStation®Vita-järjestelmällään. Pelaaja ei pysty enää liittymään peliin ennen kuin se aloitetaan uudelleen. + + Voit käyttää PlayStation®Vita-järjestelmän kosketusnäyttöä valikoiden selaamiseen. - - PlayStation®Vita-järjestelmä + + Älä katso ääreläistä silmiin! - - Vaihda verkkotilaa + + {*T3*}PELIOHJE: MONINPELI{*ETW*}{*B*}{*B*} +PlayStation®Vita-järjestelmällä Minecraft on oletusarvoisesti moninpeli.{*B*}{*B*} +Kun aloitat verkkopelin tai liityt sellaiseen, kaveriluettelosi ihmiset näkevät sen (ellet ole peliä järjestäessäsi valinnut vaihtoehtoa "Vain kutsu"), ja jos he liittyvät peliin, se näkyy ihmisille heidän kaveriluettelossaan (jos olet valinnut "Salli kaverien kaverit" -vaihtoehdon).{*B*} +Kun olet pelissä, SELECT-näppäintä painamalla voit avata luettelon kaikista muista pelissä olevista pelaajista ja potkaista pelaajia ulos pelistä. - - Valitse verkkotila + + {*T3*}PELIOHJE: NÄYTTÖKUVIEN JAKAMINEN{*ETW*}{*B*}{*B*} +Voit ottaa näyttökuvan pelistäsi avaamalla taukovalikon, ja jakaa sen Facebookissa painamalla{*CONTROLLER_VK_Y*}. Näet näyttökuvasta pikkuversion ja voit muokata Facebook-julkaisun ohessa näkyvää tekstiä.{*B*}{*B*} +Juuri näiden näyttökuvien ottamista varten on olemassa kameratila, jossa pystyt näkemään hahmosi edestäpäin, kun otat kuvan. Paina{*CONTROLLER_ACTION_CAMERA*} kunnes näet hahmosi edestäpäin ennen kuin painat{*CONTROLLER_VK_Y*} jakaaksesi kuvan.{*B*}{*B*} +Online-tunnuksesi ei näy näyttökuvassa. - - Valitse Ad Hoc -verkko, jos haluat yhdistää läheisiin PlayStation®Vita-järjestelmiin, tai "PSN", jos haluat yhdistää ystäviin kaikkialla maailmassa. + + Uskomme, että 4J Studios on poistanut Herobrinen PlayStation®Vita-järjestelmän pelistä, mutta emme ole asiasta aivan varmoja. - - Ad Hoc -verkko + + Minecraft: PlayStation®Vita Edition rikkoi useita ennätyksiä! - - "PSN" + + Olet pelannut Minecraft: PlayStation®Vita Edition -koepeliä pisimmän sallitun ajan! Haluatko avata koko pelin ja jatkaa hauskuutta? - - Lataa PlayStation®3-järjestelmä tallenne - + + Minecraft: PlayStation®Vita Edition -pelin lataaminen ei onnistunut, eikä sitä voi jatkaa. - - Lähetä tallenne PlayStation®3/PlayStation®4-järjestelmälle + + Keittäminen - - Lähettäminen peruttu + + Sinut palautettiin aloitusnäyttöön, koska kirjauduit ulos "PSN"-verkosta. - - Olet perunut tämän tallenteen lähettämisen tallenteensiirtoalueelle. + + Peliin liittyminen ei onnistunut, koska yksi tai useampi pelaaja ei saa pelata verkossa Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. - - Lähetetään tietoja: %d%% + + Sinä et saa liittyä tähän peli-istuntoon, koska yhden paikallisen pelaajasi verkkopelaaminen on estetty Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. Poista ruksi "Lisäasetukset"-kohdan "Verkkopeli"-ruudusta aloittaaksesi paikallisen pelin. - - Ladataan tietoja: %d%% + + Sinä et saa luoda tätä peli-istuntoa, koska yhden paikallisen pelaajasi verkkopelaaminen on estetty Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. Poista ruksi "Lisäasetukset"-kohdan "Verkkopeli"-ruudusta aloittaaksesi paikallisen pelin. - - Oletko varma, että haluat lähettää tämän tallenteen ja korvata mahdollisen aiemman tallennuksen tallennussiirtoalueelta? + + Verkkopelin luominen ei onnistunut, koska yksi tai useampi pelaaja ei saa pelata verkossa Sony Entertainment Network -tilinsä keskustelurajoitusten vuoksi. Poista ruksi "Lisäasetukset"-kohdan "Verkkopeli"-ruudusta aloittaaksesi paikallisen pelin. - - Muunnetaan dataa + + Sinä et saa liittyä tähän peli-istuntoon, koska verkkopelaaminen on estetty Sony Entertainment Network -tililläsi keskustelurajoitusten vuoksi. - - Tallennetaan + + Yhteys "PSN"-verkkoon katkesi. Poistutaan päävalikkoon. - - Lähetys valmis! + + Yhteys "PSN"-verkkoon katkesi. - - Lähetys epäonnistui. Yritä myöhemmin uudelleen. + + Tämä maailma on aiemmin tallennettu Luovassa tilassa, ja siksi sen trophyt ja tulostilastojen päivitykset eivät ole käytössä. - - Lataus valmis! + + Jos luot, lataat tai tallennat maailman kun "Pelin järjestäjän oikeudet" ovat käytössä, kyseisen maailman trophyt ja tulostilaston päivitykset eivät ole käytössä, vaikka se myöhemmin ladattaisiin ilman Pelin järjestäjän oikeuksia. Haluatko varmasti jatkaa? - - Lataus epäonnistui. Yritä myöhemmin uudelleen. + + Tämä on Minecraft: PlayStation®Vita Edition -koepeli. Jos sinulla olisi koko peli, olisit juuri ansainnut trophyn! +Avaa koko peli kokeaksesi Minecraft: PlayStation®Vita Edition -pelin riemun ja pelataksesi "PSN"-verkon kautta ympäri maailmaa asuvien kaveriesi kanssa. +Haluatko avata koko pelin? - - Peliin liittyminen epäonnistui rajoittavan NAT-tyypin takia. Tarkista verkkoasetuksesi. + + Vierailevat pelaajat eivät voi avata koko peliä. Kirjaudu sisään Sony Entertainment Network -tilillä. - - Tallenteensiirtoalueella ei ole tällä hetkellä tallennetta saatavilla. -Voit lähettää maailmatallenteen tallenteensiirtoalueelle Minecraft: PlayStation®3 Edition -pelistä ja ladata sen sitten Minecraft: PlayStation®Vita Edition -peliin. - + + Online-tunnus - - Tallennus kesken + + Tämä on Minecraft: PlayStation®Vita Edition -koepeli. Jos sinulla olisi koko peli, olisit juuri ansainnut teeman! +Avaa koko peli kokeaksesi Minecraft: PlayStation®Vita Edition -pelin riemun ja pelataksesi "PSN"-verkon kautta ympäri maailmaa asuvien kaveriesi kanssa. +Haluatko avata koko pelin? - - Minecraft: PlayStation®Vita Editionin tallennustiedoille ei ole riittävästi tilaa. Tee tilaa poistamalla muita Minecraft: PlayStation®Vita Editionin tallennuksia. + + Tämä on Minecraft: PlayStation®Vita Edition -koepeli. Tarvitset koko pelin, jotta voisit hyväksyä tämän kutsun. +Haluatko avata koko pelin? + + + Tallenteensiirtoalueella olevassa tallennustiedostossa on versionumero, jota Minecraft: PlayStation®Vita Edition ei vielä tue. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fr-FR/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/4J_stringsPlatformSpecific.xml index 7189a36f..201ad2bf 100644 --- a/Minecraft.Client/PSVitaMedia/loc/fr-FR/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/4J_stringsPlatformSpecific.xml @@ -1,50 +1,50 @@  - - Votre système de stockage ne dispose pas de suffisamment d'espace libre pour créer une sauvegarde. - - - Vous vous êtes déconnecté de "PSN" : retour à l'écran titre + + La sauvegarde des paramètres sur votre compte Sony Entertainment Network a échoué. - - Vous vous êtes déconnecté de "PSN" : partie interrompue. + + Problème de compte Sony Entertainment Network - - Vous n'êtes pas connecté. + + Un problème est survenu lors de l'accès à votre compte Sony Entertainment Network. Votre trophée n'a pas pu être attribué. - - Ce jeu intègre des fonctionnalités qui nécessitent une connexion à "PSN", mais vous êtes actuellement hors ligne. + + Vous jouez à la version d'évaluation de Minecraft: PlayStation®3 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un trophée ! +Déverrouillez le jeu complet pour profiter au mieux de Minecraft: PlayStation®3 Edition et jouer avec vos amis partout dans le monde via "PSN". +Voulez-vous déverrouiller le jeu complet ? - - Réseau Ad Hoc hors ligne. + + Se connecter au réseau Ad Hoc Ce jeu dispose de certaines fonctionnalités nécessitant une connexion à un réseau Ad Hoc, mais vous êtes actuellement hors ligne. - - Cette fonctionnalité nécessite une connexion à "PSN". - - - Connexion à "PSN" - - - Se connecter au réseau Ad Hoc + + Réseau Ad Hoc hors ligne. Problème de trophée - - Un problème est survenu lors de l'accès à votre compte Sony Entertainment Network. Votre trophée n'a pas pu être attribué. + + Vous vous êtes déconnecté de "PSN" : partie interrompue. - - Problème de compte Sony Entertainment Network + + Vous vous êtes déconnecté de "PSN" : retour à l'écran titre - - La sauvegarde des paramètres sur votre compte Sony Entertainment Network a échoué. + + Votre système de stockage ne dispose pas de suffisamment d'espace libre pour créer une sauvegarde. - - Vous jouez à la version d'évaluation de Minecraft: PlayStation®3 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un trophée ! -Déverrouillez le jeu complet pour profiter au mieux de Minecraft: PlayStation®3 Edition et jouer avec vos amis partout dans le monde via "PSN". -Voulez-vous déverrouiller le jeu complet ? + + Vous n'êtes pas connecté. + + + Connexion à "PSN" + + + Cette fonctionnalité nécessite une connexion à "PSN". + + + Ce jeu intègre des fonctionnalités qui nécessitent une connexion à "PSN", mais vous êtes actuellement hors ligne. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fr-FR/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/AdditionalStrings.xml index 9c6b780b..e1e1d572 100644 --- a/Minecraft.Client/PSVitaMedia/loc/fr-FR/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/AdditionalStrings.xml @@ -48,6 +48,12 @@ Votre fichier d'options est corrompu et doit être supprimé. + + Supprimer le fichier d'options. + + + Réessayer de charger le fichier d'options. + Le fichier cache de votre sauvegarde est corrompu et doit être supprimé. @@ -75,6 +81,9 @@ Service en ligne désactivé pour votre compte Sony Entertainment Network suite aux paramètres de contrôle parental de l'un des joueurs locaux. + + Les fonctionnalités en ligne sont désactivées : une mise à jour du jeu est disponible. + Aucune offre de contenu téléchargeable est disponible pour le moment. @@ -84,7 +93,4 @@ Venez jouer à Minecraft: PlayStation®Vita Edition ! - - Les fonctionnalités en ligne sont désactivées : une mise à jour du jeu est disponible. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsGeneric.xml index 685d8d8b..4eb28f8a 100644 --- a/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsGeneric.xml @@ -1,4968 +1,5827 @@  - - Un nouveau contenu téléchargeable est disponible ! Pour y accéder, utilisez le bouton Magasin Minecraft dans le menu principal. + + Passage en mode hors ligne - - Vous pouvez changer 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. + + Veuillez patienter pendant que l'hôte sauvegarde la partie - - Modifie les paramètres de gamma pour augmenter/réduire la luminosité de l'écran. + + Entrée dans l'ENDER - - 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 ! + + Sauvegarde des joueurs - - Donnez un os à un loup pour l'amadouer. Ensuite, donnez-lui l'ordre de s'asseoir ou de vous suivre. + + Connexion à l'hôte - - Depuis l'inventaire, déplacez le curseur à l'extérieur de la fenêtre et appuyez sur{*CONTROLLER_VK_A*} pour vous séparer d'un objet. + + Téléchargement du terrain - - À 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 en même temps. + + Sortie de l'ENDER - - Prélevez de la viande de porc sur les cochons puis cuisinez-la. Mangez-la pour récupérer de la santé. + + Le lit de votre abri est absent ou inaccessible - - Prélevez du cuir sur les vaches et utilisez-le pour confectionner des armures. + + Vous ne pouvez pas vous reposer : des monstres rôdent dans les parages - - Si vous avez un seau vide, remplissez-le de lait, d'eau ou de lave ! + + Vous dormez dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. - - Utilisez une houe pour préparer des terres arables à la culture. + + Ce lit est occupé - - Les araignées ne vous attaqueront pas de jour, sauf pour se défendre. + + Vous ne pouvez dormir que la nuit - - Creuser le sol ou le sable avec une pelle, c'est plus rapide qu'à mains nues ! + + %s dort dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. - - Manger de la viande de porc cuite régénère plus de santé que la viande de porc crue. + + Chargement du niveau - - Fabriquez des torches pour vous éclairer la nuit. Les monstres se tiendront à l'écart des zones éclairées. + + Finalisation... - - Rendez-vous plus rapidement à bon port dans un chariot de mine propulsé sur des rails ! + + Aménagement du terrain - - Plantez de jeunes pousses et elles produiront des arbres. + + Brève simulation du monde - - Les hommes-cochons ne s'en prendront pas à vous, sauf si vous les attaquez. + + Rang - - Dormez dans un lit pour changer votre point d'apparition dans le jeu et accélérer le temps jusqu'à l'aube. + + Sauvegarde du niveau en préparation - - Retournez ces boules de feu à l'envoyeur ! + + Préparation des tronçons... - - Construire un portail vous permettra de voyager jusqu'à une autre dimension : le Nether. + + Initialisation du serveur - - Appuyez sur{*CONTROLLER_VK_B*} pour lâcher l'objet que vous tenez en main ! + + Sortie du Nether - - Utilisez un outil adapté à la tâche ! + + Réapparition - - Si vous ne trouvez pas de charbon pour embraser vos torches, vous pouvez toujours placer du bois dans le four afin d'obtenir du charbon de bois. + + Génération du niveau - - Il est rarement judicieux de creuser juste sous vos pieds ou au-dessus de vous. + + Génération de la zone d'apparition - - La poudre d'os (obtenue depuis un os de squelette) peut servir d'engrais, et peut faire pousser les cultures instantanément ! + + Chargement de la zone d'apparition - - Les creepers explosent au contact ! + + Entrée dans le Nether - - Au contact de l'eau, une source de lave produit de l'obsidienne. + + Outils et armes - - La lave peut mettre plusieurs minutes à disparaître TOTALEMENT lorsque le bloc source est détruit. + + Gamma - - La pierre taillée résiste aux boules de feu des Ghasts et convient donc très bien à la protection des portails. + + Sensibilité jeu - - Les blocs susceptibles d'émettre de la lumière (torches, glowstone et citrouilles-lanternes, entre autres) peuvent faire fondre la neige et la glace. + + Sensibilité interface - - Si vous bâtissez des structures de laine à l'air libre, méfiez-vous : les éclairs peuvent y mettre le feu. + + Difficulté - - Un seul seau de lave suffit à fondre 100 blocs dans un four. + + Musique - - L'instrument joué par un bloc musical dépend du matériau sur lequel il est posé. + + Son - - Les zombies et squelettes peuvent survivre à la lumière du jour s'ils sont dans l'eau. + + Pacifique - - 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. + + 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. - - Les loups ne peuvent pas entrer dans le Nether. + + Dans ce mode, des ennemis apparaissent dans l'environnement mais infligent moins de dégâts qu'en mode Normal. - - Les loups n'attaquent pas les creepers. + + Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts normaux. - - Les poules pondent un oeuf toutes les 5 à 10 minutes. + + Facile - - L'obsidienne ne peut être extraite qu'à l'aide d'une pioche en diamant. + + Normal - - Les creepers sont la source de poudre à canon la plus facilement exploitable. + + Difficile - - Deux coffres placés côte à côte formeront un grand coffre. + + Déconnexion - - La santé des loups apprivoisés est illustrée par la position de leur queue. Donnez-leur de la viande pour les soigner. + + Armures - - Passez du cactus au four pour obtenir du colorant vert. + + Mécanismes - - Reportez-vous à la rubrique Nouveautés des menus Comment jouer pour consulter les dernières notes de mise à jour du jeu. + + Transports - - Les barrières superposables sont désormais disponibles dans le jeu ! + + Armes - - Certains animaux vous suivront si vous tenez du blé dans votre main. + + Nourriture - - Si un animal ne peut se déplacer de plus de 20 blocs dans chaque direction, il ne disparaîtra pas. + + Structures - - Musique par C418 ! + + Décorations - - Notch a plus d'un million d'abonnés sur Twitter ! + + Alchimie - - Les Suédois ne sont pas tous blonds. Certains sont même roux, comme Jens de Mojang ! + + Outils, armes et armures - - Une mise à jour du jeu sera disponible un jour ou l'autre ! + + Matériaux - - Qui c'est, Notch ? + + Construction de blocs - - Mojang a reçu plus de récompenses qu'il n'a d'employés ! + + Redstone et transport - - De vraies célébrités jouent à Minecraft ! + + Divers - - deadmau5 aime Minecraft ! + + Entrées : - - Ne regardez pas les bugs dans les yeux. + + Quitter sans sauvegarder - - Les creepers sont nés d'un bug d'encodage. + + Voulez-vous vraiment retourner au menu principal ? Toute progression non sauvegardée sera perdue. - - C'est une poule ou un canard ? + + Voulez-vous vraiment retourner au menu principal ? Votre progression sera perdue ! - - Vous étiez à la Minecon ? + + Cette sauvegarde semble corrompue ou endommagée. La supprimer ? - - Personne de chez Mojang n'a jamais vu le visage de junkboy. + + Voulez-vous vraiment retourner au menu principal et déconnecter tous les joueurs de la partie ? Toute progression non sauvegardée sera perdue. - - Vous saviez qu'il existait un Wiki Minecraft ? + + Quitter et sauvegarder - - Le nouveau bureau de Mojang, il déchire ! + + Créer un monde - - La Minecon 2013 s'est déroulée à Orlando, Floride, États-Unis ! + + Saisir le nom de votre monde - - La .party() était réussie ! + + Saisir une graine pour la génération de votre monde + + + Charger monde sauvegardé + + + Lancer le didacticiel + + + Didacticiel + + + Nommer votre monde + + + Sauv. endommagée + + + OK + + + Annuler + + + Magasin Minecraft + + + Faire pivoter + + + Masquer + + + Vider tous les emplacements + + + Voulez-vous vraiment quitter la partie en cours et rejoindre la nouvelle ? Toute progression non sauvegardée sera perdue. + + + 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 + + + Quitter le jeu + + + Sauvegarder la partie + + + Quitter sans sauvegarder + + + START pour rejoindre + + + 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 ! + + + Déverrouiller le jeu complet + + + 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 ! + + + Vous jouez à la version d'évaluation. Vous devrez vous procurer le jeu complet pour sauvegarder votre partie. +Déverrouiller le jeu complet ? + + + Amis + + + Mon score + + + Général + + + Veuillez patienter + + + Aucun résultat + + + Filtre : + + + Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version antérieure du jeu. + + + Connexion perdue + + + La connexion au serveur a été interrompue. Retour au menu principal. + + + Déconnexion par le serveur + + + Quitter la partie + + + Une erreur s'est produite. Retour au menu principal. + + + Échec de la connexion + + + Vous avez été exclu de la partie + + + 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 avez été exclu de la partie. Motif : vol. + + + Expiration du délai de connexion + + + Le serveur est au complet. + + + 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 ! + + + Thèmes + + + Packs de skins + + + Autoriser les amis d'amis + + + 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 + + + Vous ne pouvez pas rejoindre cette partie : elle est réservée aux seuls amis de l'hôte. + + + 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. + + + Impossible de rejoindre la partie + + + Sélectionnée + + + Skin sélectionnée : + + + Obtenir la version complète + + + 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 + + + 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 ? + + + 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 ? + + + 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 + + + Pack de textures introuvable + + + Déverrouiller la version complète + + + Télécharger la version d'essai + + + Votre mode de jeu a été modifié + + + Lorsque cette option est activée, seuls les joueurs invités peuvent participer. + + + Lorsque cette option est activée, 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. + + + Normal + + + Superplat + + + Lorsque cette option est activée, la partie est un jeu en ligne. + + + 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, 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. + + + 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é. + + + 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. + + + Non + + + Mode de jeu : Créatif + + + Survie + + + Créatif + + + Renommer votre monde + + + Saisir le nouveau nom de votre monde + + + Mode de jeu : Survie + + + Créé en mode Survie + + + Renommer sauvegarde + + + Sauvegarde auto. dans %d... + + + Oui + + + Créé en mode Créatif + + + Afficher les nuages + + + Que voulez-vous faire de cette sauvegarde ? + + + Taille interface (écran part.) + + + Ingrédient + + + Combustible + + + Distributeur + + + Coffre + + + Enchantement + + + Four + + + Aucun contenu téléchargeable de ce type n'est actuellement disponible pour ce jeu. + + + Voulez-vous vraiment supprimer cette sauvegarde ? + + + Attente d'accord + + + Censuré + + + %s a rejoint la partie. + + + %s a quitté la partie. + + + %s s'est fait exclure de la partie. + + + Alambic + + + Saisir un message sur le panneau + + + Saisir une ligne de texte à inscrire sur votre panneau + + + Saisir un titre + + + Expiration de la version d'évaluation + + + Partie au complet + + + Impossible de rejoindre la partie : aucune place vacante + + + Saisir le titre de votre message + + + Saisir la description de votre message + + + Inventaire + + + Ingrédients + + + Saisir un sous-titre + + + Saisir le sous-titre de votre message + + + Saisir une description + + + En cours de lecture : + + + Voulez-vous vraiment ajouter ce niveau à votre liste de niveaux exclus ? +Si vous sélectionnez OK, vous quitterez cette partie. + + + Retirer de la liste d'exclusion + + + Sauvegarde auto + + + 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 ? + + + Sauvegarde auto : NON + + + Opacité interface + + + Préparation de sauvegarde auto du niveau + + + Taille interface + + + 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. + + + Skins préférées + + + Jeu de %s + + + Partie d'un hôte inconnu + + + Invité déconnecté + + + Réinitialiser paramètres + + + Voulez-vous vraiment rétablir les paramètres par défaut ? + + + Échec du chargement + + + Un joueur invité s'est déconnecté : tous les joueurs invités ont été exclus de la partie. + + + Impossible de créer la partie + + + Sélection auto + + + Non pack : skins stand. + + + Se connecter + + + Vous n'êtes pas connecté. Pour jouer, vous devez d'abord vous connecter. Vous connecter ? + + + Multijoueur non autorisé + + + Boire + + + 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. + + + 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. + + + 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. + + + 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 blé passe par plusieurs stades de croissance. Il est prêt pour 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*} + + + 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. + + + 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 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 tire avec lui un bloc (tous types de blocs, ou presque). + {*ICON*}33{*/ICON*} - - N'oubliez pas : les rumeurs tiennent plus de l'invention que de la réalité ! + + Pour créer un portail, placez des blocs d'obsidienne pour former un cadre large de quatre blocs et haut de cinq. Les blocs d'angle n'ont qu'une fonction esthétique. - - {*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 courir. Tant que vous maintenez {*CONTROLLER_ACTION_MOVE*} vers l'avant, le personnage continuera à courir jusqu'à ce que sa durée de course soit écoulée ou que sa jauge de nourriture compte moins de{*ICON_SHANK_03*}.{*B*}{*B*} -Maintenez{*CONTROLLER_ACTION_ACTION*} pour miner et 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. + + 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. - - {*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 remplira 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. + + 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. + + + 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. + + + Le didacticiel consacré aux cultures est maintenant terminé. + + + 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. + + + 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. + + + 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. + + + 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. + + + L'outil que vous maniez est endommagé. Chaque fois que vous utilisez un outil, son état se dégrade jusqu'à ce qu'il se brise. 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. + + + 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. + + + 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 quête d'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, puis un bébé apparaît. Le jeune animal suivra ses parents quelque temps avant de devenir adulte. + + + Une fois qu'un animal n'est plus en mode Romance, il faut patienter cinq minutes environ pour qu'il soit apte à recommencer. + + + 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 vous savez déjà tout ce qu'il faut savoir sur les animaux et l'élevage. + + + Pour faire en sorte que les animaux se reproduisent, vous devez leur donner à manger la nourriture appropriée. Ils basculeront alors en mode "Romance". + + + Certains animaux vous suivront si vous tenez un peu de leur nourriture dans votre main. Il vous sera alors plus facile de réunir des animaux pour qu'ils se reproduisent.{*ICON*}296{*/ICON*} + + + {*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. + + + + Vous pouvez apprivoiser un loup sauvage en lui donnant des os. Une fois apprivoisé, des coeurs apparaissent autour du loup et ce dernier vous suit et vous protège tant que vous ne lui ordonnez pas 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. + + + 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. + + + 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. + + + {*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. + + + Utilisez votre potion de résistance au feu sur vous-même. + + + 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é. + + + 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. + + + Dans cette zone se trouvent un alambic, un chaudron et un coffre rempli d'articles d'alchimie. + + + 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 abri. + + + Vous êtes dans l'interface d'alchimie. Cette interface vous permet de créer des potions aux effets variés. + + + 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. + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'alambic. + + + Ajouter un oeil 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. + + + 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. + + + 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. + + + 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*} + + + 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. + + + 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*} + + + 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. - - {*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 la teignant. Pour ce faire, dans votre inventaire, maintenez le curseur sur la teinture, puis appuyez sur{*CONTROLLER_VK_X*} lorsque le curseur se trouve au-dessus de l'élément à teindre. + + 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 à l'aide de poudre de redstone. - - {*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 y 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. + + {*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. - - {*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. + + 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*} - - {*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. + + Si votre partie compte d'autres joueurs, tous devront être au lit au même moment avant de pouvoir dormir. + {*ICON*}355{*/ICON*} - - {*T3*}COMMENT JOUER : ÉTABLI{*ETW*}{*B*}{*B*} -Vous pouvez utiliser un établi pour confectionner des objets plus grands.{*B*}{*B*} -Placez l'établi dans votre environnement et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*B*}{*B*} -L'artisanat sur établi 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. + + {*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. - - {*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 en plaçant 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. + + 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. - - {*T3*}COMMENT JOUER : DISTRIBUTEUR{*ETW*}{*B*}{*B*} -Un distributeur sert à... distribuer des objets. Pour l'actionner, vous devrez placer un interrupteur ou un 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 associé. + + Placer des bibliothèques autour de la table d'enchantement augmente sa puissance et permet d'accéder aux niveaux d'enchantement supérieurs. - - {*T3*}COMMENT JOUER : ALCHIMIE{*ETW*}{*B*}{*B*} -La concoction de potions nécessite un alambic, à construire sur un établi. 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*} -En plaçant un ingrédient de potion dans l'emplacement du haut de l'alambic, vous obtiendrez 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 (poudre de redstone), renforcer son intensité (poudre de glowstone) ou bien en faire une potion offensive (oeil d'araignée fermenté).{*B*} -Vous pouvez aussi y incorporer de la poudre à canon pour en faire une potion volatile à 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*}Oeil 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*}Oeil d'araignée fermenté{*ETW*}{*B*}{*B*} - -Vous devrez essayer diverses combinaisons d'ingrédients pour découvrir toutes les recettes de potions à concocter. + + 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. - - {*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 des outils, des armes, des armures et des 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 affichent 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 en cultivant.{*B*}{*B*} -Les livres enchantés s'utilisent avec l'enclume pour appliquer des enchantements à des objets. Vous avez ainsi plus de contrôle sur les enchantements obtenus.{*B*} + + 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. - - {*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. + + Dans cette zone, vous trouverez une table d'enchantement ainsi que plusieurs objets qui vous aideront à vous familiariser avec l'enchantement. - - {*T3*}COMMENT JOUER : ÉLEVER DES ANIMAUX{*ETW*}{*B*}{*B*} -Les animaux de Minecraft peuvent se reproduire 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 quête 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, tous les deux étant 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 n'est plus en mode Romance, il faut patienter cinq minutes environ pour qu'il soit apte à recommencer.{*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. + + {*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. - - {*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. + + 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. - - {*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. + + Le chariot de mine circule sur des rails. Vous pouvez fabriquer des chariots motorisés et des chariots de transport. + {*RailIcon*} - - {*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. 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. Vous pouvez aussi modifier cette option dans le 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*} - 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.{*B*}{*B*} - - {*T1*}Options de jeu{*ETW*}{*B*} - Appuyez sur la {*BACK_BUTTON*} 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*}Construction et minage possibles{*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*}Utilisation de portes et leviers possible{*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*}Ouverture de conteneurs possible{*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*}Attaque des joueurs possible{*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*}Attaque des animaux possible{*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 de 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*} - {*KICK_PLAYER_DESCRIPTION*}{*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*}Vol possible{*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 téléporter{*ETW*}{*B*} - Cette option permet au joueur de se téléporter ou de téléporter d'autres joueurs partout dans le monde. + + 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 oeuvre des systèmes complexes. + {*PoweredRailIcon*} - - Page suivante + + Vous naviguez à bord d'un bateau. Pour descendre, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - Page précédente + + 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. - - Principes + + Vous êtes à bord d'un chariot de mine. Pour descendre, pointez le curseur sur le chariot et appuyez sur{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - Interface principale + + {*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. - - Inventaire + + Si vous déplacez le pointeur hors des limites de l'interface alors qu'un objet lui est annexé, vous pouvez jeter cet objet. - - Coffres + + Lire - - Artisanat + + Suspendre - - Four + + Lancer - - Distributeur + + Ouvrir - - Animaux de la ferme + + Changer tonalité - - Élever des animaux + + Exploser - - Alchimie + + Planter - - Enchantement + + Déverrouiller le jeu complet - - Portail du Nether + + Supp. sauvegarde - - Multijoueur + + Supprimer - - Partage des captures d'écran + + Faucher - - Exclusion de niveaux + + Récolter - - Mode Créatif + + Continuer - - Options de l'hôte et du joueur + + Nager (haut) - - Commerce + + Frapper - - Enclume + + Traire - - L'Ender + + Prélever - - {*T3*}COMMENT JOUER : l'Ender{*ETW*}{*B*}{*B*} -L'Ender est une autre dimension du jeu, accessible 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 oeil 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 : vous devrez monter jusqu'à eux à l'aide de blocs.{*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 de l'oeuf 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. + + Vider - - Sprint + + Selle - - Nouveautés + + Placer - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Modifications et ajouts{*ETW*}{*B*}{*B*} -- Nouveaux objets : émeraude, minerai d'émeraude, bloc d'émeraude, coffre de l'Ender, crochet, pomme en or enchantée, enclume, pot de fleurs, mur en pierre, mur en pierre moussue, tableau du Wither, patate, patate cuite, patate empoisonnée, carotte, carotte en or, carotte et 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 en quartz, livre enchanté, tapis.{*B*} -- Nouvelles recettes : grès lisse et grès taillé.{*B*} -- Nouvelles entités : zombies villageois.{*B*} -- Nouvelles fonctionnalités de génération de terrain : temples du désert, villages du désert, temples de la jungle.{*B*} -- Commerce avec les villageois.{*B*} -- Interface pour l'enclume.{*B*} -- Teinture des armures en cuir.{*B*} -- Teinture des colliers de loup.{*B*} -- La carotte et le bâton permettent de diriger un cochon qu'on chevauche.{*B*} -- Contenu du coffre bonus mis à jour avec plus d'objets.{*B*} -- Modification du placement de demi-blocs et d'autres blocs sur des demi-blocs.{*B*} -- Modification du placement des escaliers à l'envers et des dalles.{*B*} -- Ajout de professions pour les villageois.{*B*} -- Les villageois apparus avec un oeuf ont une profession aléatoire.{*B*} -- Ajout d'un placement latéral pour les bûches.{*B*} -- Les fours peuvent être alimentés avec des outils en bois.{*B*} -- La glace et les vitres peuvent être récupérées avec des outils possédant l'enchantement Délicatesse.{*B*} -- Les boutons en bois et les plaques de pression en bois peuvent être activés avec des flèches.{*B*} -- Les entités du Nether peuvent rejoindre la Surface via les portails.{*B*} -- Les creepers et les araignées s'en prennent au dernier joueur qui les a frappés.{*B*} -- En mode Créatif, les entités redeviennent neutres après un court laps de temps.{*B*} -- Le recul est annulé en cas de noyade.{*B*} -- Les portes sur lesquelles frappent les zombies s'abîment.{*B*} -- La glace fond dans le Nether.{*B*} -- Les chaudrons se remplissent en cas de pluie.{*B*} -- La mise à jour des pistons est deux fois plus longue.{*B*} -- Un cochon portant une selle la laisse derrière lui à sa mort.{*B*} -- Modification de la couleur du ciel dans l'Ender.{*B*} -- Il est possible de placer de la ficelle pour les crochets.{*B*} -- La pluie traverse les feuilles.{*B*} -- Il est possible de placer des leviers sous les blocs.{*B*} -- La TNT provoque des dégâts variables en fonction de la difficulté.{*B*} -- Modification de la recette du livre.{*B*} -- Les bateaux cassent les nénuphars, et non l'inverse.{*B*} -- Les cochons laissent derrière eux plus de viande à leur mort.{*B*} -- Moins de slimes dans les mondes superplats.{*B*} -- Les dégâts provoqués par les creepers varient selon la difficulté et le recul augmente.{*B*} -- Les Endermen ouvrent désormais correctement la bouche.{*B*} -- Ajout d'un système de téléportation des joueurs via le menu {*BACK_BUTTON*}.{*B*} -- Nouvelles options pour les hôtes : vol, invisibilité et invulnérabilité pour les joueurs à distance.{*B*} -- Ajout d'initiations pour les nouveaux objets et nouvelles fonctionnalités dans le monde didacticiel.{*B*} -- Mise à jour des coordonnées des coffres de disques dans le monde didacticiel.{*B*} - + + Manger - - {*ETB*}Bienvenue ! Comme vous l'avez peut-être déjà remarqué, votre Minecraft vient d'être gratifié d'une nouvelle mise à jour.{*B*}{*B*} -Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jetez un oeil à l'aperçu qui suit et allez jouer !{*B*}{*B*} -{*T1*}Nouveaux objets{*ETB*} - Émeraude, minerai d'émeraude, bloc d'émeraude, coffre de l'Ender, crochet, pomme en or enchantée, enclume, pot de fleurs, mur en pierre, mur en pierre moussue, tableau du Wither, patate, patate cuite, patate empoisonnée, carotte, carotte en or, carotte et 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 en quartz, livre enchanté, tapis.{*B*}{*B*} - {*T1*}Nouvelles entités{*ETB*} - Zombies villageois.{*B*}{*B*} -{*T1*}Nouvelles fonctionnalités{*ETB*} - Faites du commerce avec les villageois, réparez ou enchantez vos armes, outils et armures avec une enclume, stockez des objets dans un coffre de l'Ender, et dirigez un cochon à l'aide d'une carotte et d'un bâton en le chevauchant !{*B*}{*B*} -{*T1*}Nouvelles initiations{*ETB*} - Apprenez à utiliser ces nouvelles fonctionnalités dans le monde didacticiel !{*B*}{*B*} -{*T1*}De nouveaux "Oeufs de Pâques"{*ETB*} - Nous avons déplacé tous les disques secrets dans le monde didacticiel. Essayez de les retrouver !{*B*}{*B*} + + Monter - - Inflige plus de dégâts qu'à mains nues. + + Naviguer - - 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 extraire les boules de neige. + + Faire pousser - - Nécessaire pour miner les blocs de pierre et le minerai. + + Dormir - - Sert à travailler les blocs de bois plus vite qu'à mains nues. + + Se réveiller - - Sert à faucher les blocs de terre et d'herbe pour les préparer à la culture. + + Jouer - - Pour activer les portes en bois, vous devez les actionner, les frapper ou utiliser de la redstone. + + Options - - Les portes en fer ne peuvent s'ouvrir qu'au moyen de redstone, de boutons ou d'interrupteurs. + + Déplacer l'armure - - NOT USED + + Déplacer l'arme - - NOT USED + + Équiper - - NOT USED + + Déplacer ingrédient - - NOT USED + + Déplacer combustible - - Confère au porteur une armure de 1. + + Outil Déplacement - - Confère au porteur une armure de 3. + + Bander - - Confère au porteur une armure de 2. + + Page Haut - - Confère au porteur une armure de 1. + + Page Bas - - Confère au porteur une armure de 2. + + Mode Romance - - Confère au porteur une armure de 5. + + Lâcher - - Confère au porteur une armure de 4. + + Privilèges - - Confère au porteur une armure de 1. + + Parer - - Confère au porteur une armure de 2. + + Créatif - - Confère au porteur une armure de 6. + + Exclure le niveau - - Confère au porteur une armure de 5. + + Sélectionner skin - - Confère au porteur une armure de 2. + + Allumer - - Confère au porteur une armure de 2. + + Inviter des amis - - Confère au porteur une armure de 5. + + Accepter - - Confère au porteur une armure de 3. + + Tondre - - Confère au porteur une armure de 1. + + Naviguer - - Confère au porteur une armure de 3. + + Réinstaller - - Confère au porteur une armure de 8. + + Options - - Confère au porteur une armure de 6. + + Exécuter ordre - - Confère au porteur une armure de 3. + + Installer la version complète - - Un lingot étincelant qui sert à la confection d'outils. Créé en fondant du minerai dans le four. + + Installer la version d'évaluation - - 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. + + Installer - - 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. + + Éjecter - - Sert à la création d'escaliers compacts. + + Actualiser jeux - - Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + + Party Games - - Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre forment un bloc de taille normale. + + Tous les jeux - - Sert à produire de la lumière. Les torches permettent aussi de fondre la neige et la glace. + + Quitter - - Sert de matériau de construction, transformable en de nombreux objets. Se taille dans n'importe quel type de bois. + + Annuler - - Sert de matériau de construction. La gravité n'a pas d'effet sur lui, contrairement au sable normal. + + Annuler connexion - - Sert de matériau de construction. + + Changer catégorie - - Sert à la confection des torches, flèches, panneaux, échelles, barrières, ainsi que des poignées d'armes et manches d'outils. + + Artisanat - - Permet d'accélérer le temps jusqu'à l'aube si tous les joueurs sont couchés. Change aussi le point d'apparition du joueur. La couleur des lits est toujours la même. + + Créer - - Permet de créer un éventail d'objets plus riche que l'artisanat classique. + + Prendre/Placer - - Permet de fondre le minerai, de créer du charbon et du verre, de cuisiner le poisson et la viande de porc. + + Inventaire - - Permet d'entreposer des blocs et objets. Placez deux coffres côte à côte pour former un grand coffre à la capacité doublée. + + Description - - 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. + + Ingrédients - - Permet de grimper et de descendre. + + Retour - - À activer en l'actionnant, en la frappant ou en utilisant de la redstone. La trappe fonctionne comme une porte classique, à la différence qu'elle occupe un espace d'1x1 bloc et repose à même le sol. + + Rappel : - - 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. + + De nouvelles fonctionnalités ont été ajoutées à la dernière version du jeu, dont de nouvelles zones dans le monde didacticiel. - - Sert à déclencher des explosions. Une fois placé, appliquez une décharge électrique ou utilisez un briquet à silex pour l'activer. + + 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. - - Sert à contenir du ragoût de champignons. Vous conservez le bol une fois le ragoût avalé. + + 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 abri ! - - Sert à contenir et transporter eau, lave et lait. + + {*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. - - Sert à contenir et transporter de l'eau. + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour parcourir normalement le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour passer le didacticiel principal. - - Sert à contenir et transporter de la lave. + + {*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. - - Sert à contenir et transporter du lait. + + Sélectionner - - Sert à faire du feu et à allumer la mèche du TNT, ouvre un portail qui vient d'être fabriqué. + + Utiliser - - Sert à pêcher le poisson. + + 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. - - Affiche la position du soleil et de la lune. + + À l'extérieur de cette zone, vous trouverez des exemples de bâtiments, de terres labourées, de chariots de mine et de rails, des tables d'enchantement, des alambics, des exemples de commerce, des enclumes... et bien plus encore ! - - Indique la position de votre point de départ. + + Votre barre de nourriture est à un niveau où votre santé ne se régénère plus. - - Tenue en main, la carte crée l'image d'une zone explorée. Peut servir à la détermination d'un itinéraire. + + Prendre - - Permet d'attaquer à distance à l'aide de flèches. + + Suivant - - Sert de munitions pour les arcs. + + Précédent - - Restitue 2,5{*ICON_SHANK_01*}. + + Exclure joueur - - Restitue 1{*ICON_SHANK_01*}. Peut s'utiliser jusqu'à 6 fois. + + Envoyer requête d'ami - - Restitue 1{*ICON_SHANK_01*}. + + Page Bas - - Restitue 1{*ICON_SHANK_01*}. + + Page Haut - - Restitue 3{*ICON_SHANK_01*}. + + Teindre - - Restitue 1{*ICON_SHANK_01*} ou peut être cuit dans un four. En manger a une chance de vous empoisonner. + + Soigner - - Restitue 3{*ICON_SHANK_01*}. S'obtient en cuisant du poulet cru dans un four. + + Assis - - Restitue 1,5{*ICON_SHANK_01*} ou peut être cuit dans un four. + + Suis-moi - - Restitue 4{*ICON_SHANK_01*}. S'obtient en cuisant du bœuf cru dans un four. + + Miner - - Restitue 1,5{*ICON_SHANK_01*} ou peut être cuit dans un four. + + Nourrir - - Restitue 4{*ICON_SHANK_01*}. S'obtient en cuisant de la viande de porc crue dans un four. + + Apprivoiser - - Restitue 1{*ICON_SHANK_01*} ou peut être cuit dans un four. Sert également à nourrir un ocelot pour l'apprivoiser. + + Changer de filtre - - Restitue 2,5{*ICON_SHANK_01*}. S'obtient en cuisant un poisson cru dans un four. + + Placer tout - - Restitue 2{*ICON_SHANK_01*}. Permet de confectionner une pomme dorée. + + Placer un - - Restitue 2{*ICON_SHANK_01*} et régénère la santé pendant 4 secondes. Se fabrique avec une pomme et des pépites d'or. + + Lâcher - - Restitue 2{*ICON_SHANK_01*}. La manger a une chance de vous empoisonner. + + Prendre tout - - Sert d'ingrédient dans la recette du gâteau et pour les potions. + + Prendre la moitié - - Si activé, permet de produire une décharge électrique. Reste activé/désactivé jusqu'à nouvelle utilisation. + + Placer - - Produit une décharge électrique constante. Sert aussi de récepteur/transmetteur, connectée à la façade d'un bloc. Génère également une faible luminosité. + + Jeter tout - - Sert dans les circuits de redstone comme répéteur, retardateur et/ou diode. + + Vider la barre de sélection rapide - - Sert à produire une décharge électrique une fois actionné. Reste activé pendant environ une seconde avant de se désactiver. + + Plus d'info - - Sert à entreposer et à distribuer aléatoirement des objets lorsqu'on lui applique une charge de redstone. + + Partager sur Facebook - - 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. + + Jeter un - - Sert à diriger les chariots de mine. + + Permuter - - 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. + + Dépl. rapide - - 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. + + Packs de skins - - Sert à véhiculer sur les rails joueurs, animaux et monstres. + + Vitre teintée en rouge - - Sert à acheminer des marchandises sur les rails. + + Vitre teintée en vert - - Se déplace sur les rails et propulse les autres chariots de mine lorsqu'on l'alimente au charbon. + + Vitre teintée en marron - - Sert à circuler dans l'eau plus rapidement qu'à la nage. + + Verre teinté en blanc - - Prélevée sur les moutons. Se teint avec les colorants. + + Vitre teintée - - 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. + + Vitre teintée en noir - - Sert de colorant pour la confection de laine noire. + + Vitre teintée en bleu - - Sert de colorant pour la confection de laine verte. + + Vitre teintée en gris - - Sert de colorant pour la confection de laine marron ou d'ingrédients pour les cookies, et permet de faire pousser du cacao. + + Vitre teintée en rose - - Sert de colorant pour la confection de laine argentée. + + Vitre teintée en vert clair - - Sert de colorant pour la confection de laine jaune. + + Vitre teintée en violet - - Sert de colorant pour la confection de laine rouge. + + Vitre teintée en cyan - - Fait instantanément arriver à maturité les cultures, arbres, herbes hautes, champignons géants et fleurs. Peut aussi servir dans les recettes de colorant. + + Vitre teintée en gris clair - - Sert de colorant pour la confection de laine rose. + + Verre teinté en orange - - Sert de colorant pour la confection de laine orange. + + Verre teinté en bleu - - Sert de colorant pour la confection de laine vert clair. + + Verre teinté en violet - - Sert de colorant pour la confection de laine grise. + + Verre teinté en cyan - - Sert de colorant pour la confection de laine gris clair. Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produire. Vous en obtiendrez ainsi quatre par poche d'encre. + + Verre teinté en rouge - - Sert de colorant pour la confection de laine bleu ciel. + + Verre teinté en vert - - Sert de colorant pour la confection de laine bleu cyan. + + Verre teinté en marron - - Sert de colorant pour la confection de laine violette. + + Verre teinté en gris clair - - Sert de colorant pour la confection de laine magenta. + + Verre teinté en jaune - - Sert de colorant pour la confection de laine bleue. + + Verre teinté en bleu ciel - - Permet d'écouter des disques. + + Verre teinté en magenta - - Utiles pour confectionner des outils, armes et armures très robustes. + + Verre teinté en gris - - 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. + + Verre teinté en rose - - Sert à créer des livres et cartes. + + Verre teinté en vert clair - - Sert à créer une bibliothèque ou peut être enchanté. + + Vitre teintée en jaune - - Permet d'obtenir des enchantements plus puissants lorsqu'on en place autour de la table d'enchantement. + + Gris clair - - Sert de décoration. + + Gris - - Se mine à l'aide d'une pioche en fer (ou mieux). Transformé en lingots d'or dans le four. + + Rose - - Se mine à l'aide d'une pioche en pierre (ou mieux). Transformé en lingots de fer dans le four. + + Bleu - - Se mine avec une pioche pour prélever du charbon. + + Violet - - Se mine avec une pioche en pierre pour prélever du lapis-lazuli. + + Cyan - - Se mine avec une pioche en fer pour prélever des diamants. + + Vert clair - - Se mine avec une pioche en fer pour prélever de la poudre de redstone. + + Orange - - Se mine avec une pioche pour prélever de la pierre taillée. + + Blanc - - Prélevée à l'aide d'une pelle. Sert de matériau de construction. + + Personnalisé + + + Jaune - - Une fois plantée, peut prospérer et devenir un arbre. + + Bleu ciel - - Impossible à briser. + + Magenta - - Enflamme n'importe quoi à son contact. Peut être prélevée dans un seau. + + Marron - - 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. + + Vitre teintée en blanc - - 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. + + Petite boule - - Travaillé à la hache. Transformé en planches ou utilisé comme combustible. + + Grosse boule - - 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. + + Vitre teintée en bleu ciel - - Obtenue en travaillant la pierre à l'aide d'une pioche. Peut servir à la construction d'un four ou à la fabrication d'outils en pierre. + + Vitre teintée en magenta - - Obtenue par la cuisson d'argile dans un four. + + Vitre teintée en orange - - Peut être transformée en briques à la chaleur d'un four. + + En forme d'étoile - - Une fois brisée, produit des boules d'argile qui peuvent être transformées en briques dans le four. + + Noir - - Un moyen peu encombrant d'entreposer des boules de neige. + + Rouge - - Se creuse à l'aide d'une pelle pour créer des boules de neige. + + Vert - - Produit parfois des graines de blé si détruite. + + En forme de creeper - - Transformable en colorant. + + Explosé - - Combiné à un bol, sert à la préparation de ragoûts. + + Forme inconnue - - 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. + + Verre teinté en noir - - Libère des monstres dans l'environnement. + + Armure en fer pour cheval - - Se place au sol pour créer un câble conducteur d'électricité. Ajouté à une potion, permet d'en augmenter la durée. + + Armure en or pour cheval - - Une fois arrivées à maturité, les cultures peuvent être récoltées pour produire du blé. + + Armure en diamant pour cheval - - Un sol fertile préparé pour la culture des graines. + + Comparateur de redstone - - Passé au four, sert à la confection d'un colorant vert. + + Chariot de mine avec TNT - - Sert à la confection de sucre. + + Chariot de mine avec entonnoir - - 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. + + Laisse - - Brûle indéfiniment si embrasé. + + Balise - - Ralentit le mouvement de toute créature qui circule dessus. + + Coffre piégé - - Emprunter un portail permet de circuler entre la Surface et le Nether. + + Plaque de détection pondérée (légère) - - Alimente le four en combustible. Sert à la confection des torches. + + Étiquette - - Prélevé sur les cadavres d'araignées. Sert à la confection des arcs et des cannes à pêche, et peut-être placé au sol comme fil de détente pour actionner des crochets. + + Planches de bois (tout type) - - Prélevé sur les cadavres de poulets. Sert à la confection des flèches. + + Bloc de commande - - Prélevé sur les cadavres de creepers. Sert à la confection de TNT et de potions. + + Étoile de feu d'artifice - - Plantées dans une terre labourée, produisent des cultures. Assurez-vous que les graines soient assez exposées au soleil ! + + Ces animaux peuvent être apprivoisés, puis montés. Ils peuvent être équipés d'un coffre. - - Obtenu par la récolte des cultures. Sert à la préparation d'aliments. + + Mule - - Obtenu en creusant le gravier. Sert à la confection d'un briquet à silex. + + Issue du croisement entre un cheval et un âne. Ces animaux peuvent être apprivoisés puis montés, porter une armure et transporter des coffres. - - Utilisée sur un cochon, vous permet de le chevaucher. Vous pouvez ensuite diriger le cochon à l'aide d'une carotte et d'un bâton. + + Cheval - - Obtenue en creusant la neige. Peut servir de projectile. + + Ces animaux peuvent être apprivoisés, puis montés. - - Prélevé sur les cadavres de vaches. Sert à la confection d'armures ou de livres. + + Âne - - Prélevée sur les cadavres de slimes. Sert d'ingrédient pour les potions et permet de confectionner des pistons collants. + + Cheval zombie - - Produit aléatoirement par les poules. Sert à la préparation d'aliments. + + Carte vide - - Obtenue en minant un bloc de glowstone. Sert à la reconstitution de blocs de glowstone et combiné à une potion, permet d'en augmenter la puissance. + + Étoile du Nether - - Prélevé sur les cadavres de squelettes. Sert à la confection de poudre d'os. Donnez-en à manger à un loup pour le domestiquer. + + Fusée d'artifice - - Obtenu sur les creepers tués par un squelette. À lire dans un juke-box. + + Squelette de cheval - - Éteint les flammes et contribue à la prospérité des cultures. À prélever dans un seau. + + Wither - - Une fois détruit, produit une pousse d'arbre à replanter pour créer un nouvel arbre. + + Se fabrique avec des crânes de wither et du sable des âmes. Il lance des crânes explosifs. - - Sert à la construction et à la décoration. Se trouve dans les donjons. + + Plaque de détection pondérée (lourde) - - Sert à tondre la laine des moutons et à récolter les blocs de feuillage. + + Argile teinte en gris clair - - Une fois alimenté (moyennant un bouton, un levier, une plaque de détection, une torche de redstone ou de la redstone avec l'un ou l'autre de ces éléments), le piston s'allonge si possible pour pousser des blocs. + + Argile teinte en gris - - Si alimenté (torche de redstone et bouton, levier ou plaque de détection), le piston s'allonge pour pousser des blocs. Quand le piston se rétracte, le bloc en contact avec la tête du piston revient aussi en place. + + Argile teinte en rose - - Faite de blocs de pierre. On en trouve généralement dans les forts. + + Argile teinte en bleu - - Sert de clôture, comparable aux barrières. + + Argile teinte en violet - - Comparable à une porte, mais s'utilise principalement avec une barrière. + + Argile teinte en cyan - - Se fabrique avec des tranches de pastèque. + + Argile teinte en vert clair - - Des blocs transparents qui peuvent servir d'alternative aux blocs de verre. + + Argile teinte en orange - - À planter pour faire pousser des citrouilles. + + Argile teinte en blanc - - À planter pour faire pousser des pastèques. + + Verre teinté - - 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é. + + Argile teinte en jaune - - Un bloc de terre couronnée de gazon. Se prélève à l'aide d'une pelle. Sert de matériau de construction. + + Argile teinte en bleu ciel - - Sert à la construction et à la décoration. + + Argile teinte en magenta - - Ralentit vos mouvements lorsque vous passez à travers. Utilisez des cisailles pour la détruire et prélever du fil. + + Argile teinte en marron - - 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é. + + Entonnoir - - Lorsqu'il est placé, pousse sans interruption. Se prélève avec des cisailles. Peut-être utilisé comme une échelle. + + Rail déclencheur - - Glissante lorsque vous y marchez. 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 qu'on la place dans le Nether. + + Dropper - - Peut servir de décoration. + + Comparateur de redstone - - Sert en alchimie, mais aussi pour localiser les forts. Produit par les Blazes qu'on trouve à proximité ou à l'intérieur des forteresses du Nether. + + Capteur de lumière - - Sert en alchimie. Produite par les Ghasts à leur mort. + + Bloc de redstone - - Produite par les Cochons zombies à leur mort. Les Cochons zombies se rencontrent dans le Nether. Permet de confectionner des potions. + + Argile teinte - - Sert en alchimie. Pousse dans les forteresses du Nether. Peut aussi être plantée dans du sable des âmes. + + Argile teinte en noir - - Peut avoir divers effets selon ce sur quoi elle est utilisée. + + Argile teinte en rouge - - Peut être remplie d'eau et servir d'ingrédient de base d'une potion distillée dans l'alambic. + + Argile teinte en vert - - Aliment vénéneux et ingrédient alchimique. Se trouve sur les cadavres d'araignées ou d'araignées bleues. + + Botte de foin - - Sert en alchimie. Intervient principalement dans la création de potions néfastes. + + Argile cuite - - Sert en alchimie et intervient dans la fabrication d'objets comme l'oeil d'Ender ou la crème de magma. + + Bloc de charbon - - Sert en alchimie. + + Atténuation en - - Sert à la création de potions simples et volatiles. + + Lorsque cette option est désactivée, empêche les monstres et les animaux de modifier des blocs (les explosions de creepers ne détruisent pas les blocs et les moutons n'éliminent pas l'herbe, par exemple), ou de prendre des objets. - - Peut se remplir d'eau à l'aide d'un seau d'eau ou lorsqu'on le laisse sous la pluie. Sert aussi à remplir des fioles. + + Lorsque cette option est activée, les joueurs conservent leur inventaire quand ils meurent. - - 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'ouvre. + + Lorsque cette option est désactivée, les créatures n'apparaissent pas naturellement. - - Sert en alchimie. + + Mode de jeu : Aventure - - Comparable aux blocs d'herbe, mais très efficace pour faire pousser des champignons. + + Aventure - - Flotte sur l'eau et permet de marcher dessus. + + Saisissez une graine pour générer à nouveau le même terrain. Laissez le champ vide pour un monde aléatoire. - - Sert à construire des forteresses du Nether. Invulnérable aux boules de feu des Ghasts. + + Lorsque cette option est désactivée, les monstres et les animaux ne produisent pas de butin (les creepers ne produiront pas de poudre à canon, par exemple). - - Sert dans les forteresses du Nether. + + {*PLAYER*} a chuté d'une échelle - - Se trouve dans les forteresses du Nether et produit des verrues du Nether lorsqu'elle est brisée. + + {*PLAYER*} a chuté d'une plante grimpante - - Permet au joueur, moyennant ses points d'expérience, d'enchanter épées, pioches, haches, pelles, arcs et armures. + + {*PLAYER*} a chuté d'une étendue d'eau - - S'active à l'aide de l'oeil d'Ender et permet au joueur de voyager jusqu'à la dimension de l'Ender. + + Lorsque cette option est désactivée, les blocs ne produisent pas d'objets quand ils sont détruits (les blocs de pierre ne produiront pas de pierre taillée, par exemple). - - Sert à créer un portail de l'Ender. + + Lorsque cette option est désactivée, la santé des joueurs ne se régénère pas naturellement. - - 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. + + Lorsque cette option est désactivée, l'heure ne change pas. - - Ce bloc est créé lorsque le Dragon de l'Ender est terrassé. + + Chariot de mine - - Lancée, elle produit des orbes d'expérience qui augmentent vos points d'expérience une fois ramassés. + + Guider - - Utile pour enflammer des choses ou pour provoquer des incendies lorsqu'on en place dans un distributeur. + + Libérer - - Similaires à une vitrine, affichent les objets ou blocs qui y sont placés. + + Fixer - - Lancez-le pour faire apparaître une créature du type indiqué. + + Descendre - - Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + + Fixer coffre - - Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + + Lancer - - Créés en faisant fondre du Netherrack dans un four. Peuvent être transformés en blocs de briques du Nether. + + Nommer - - Émet de la lumière quand elle est activée. + + Balise - - Leur récolte permet d'obtenir des fèves de cacao. + + Pouvoir principal - - Les crânes peuvent servir de décoration ou être portés comme masques dans l'emplacement pour le casque. + + Pouvoir secondaire - - Pieuvre + + Cheval - - Produit une poche d'encre une fois tuée. + + Dropper - - Vache + + Entonnoir - - Produit du cuir une fois tuée. Utilisez un seau pour la traire. + + {*PLAYER*} a chuté de haut - - Mouton + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de chauves-souris. - - Produit de la laine quand il est tondu (s'il ne l'a pas déjà été). Utilisez un colorant pour changer la couleur de sa laine. + + Cet animal ne peut pas entrer en mode Romance. Vous avez atteint le nombre maximal de chevaux en cours d'élevage. - - Poulet + + Options de jeu - - Produit des plumes une fois tué. Pond aussi des oeufs, à l'occasion. + + {*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} avec {*ITEM*} - - Cochon + + {*PLAYER*} s'est fait rouer de coups par {*SOURCE*} avec {*ITEM*} - - Produit de la viande de porc une fois tué. Utilisez une selle pour le chevaucher. + + {*PLAYER*} s'est fait tuer par {*SOURCE*} avec {*ITEM*} - - Loup + + Destruction par créature - - Inoffensif à moins d'être attaqué : il ripostera alors sans hésiter. Utilisez des os pour le domestiquer : le loup vous suivra et s'en prendra à tous vos assaillants. + + Production de blocs - - Creeper + + Régénération naturelle - - Explose si vous l'approchez de trop près ! + + Cycle jour/nuit - - Squelette + + Conserver inventaire - - Vous décoche des flèches. Produit des flèches et des os une fois tué. + + Apparition de créature - - Araignée + + Butin de créature - - Attaque dès que vous approchez. Peut escalader les murs. Produit du fil une fois tuée. + + {*PLAYER*} s'est fait abattre par {*SOURCE*} avec {*ITEM*} - - Zombie + + {*PLAYER*} a chuté trop loin et s'est fait tuer par {*SOURCE*} - - Attaque dès que vous approchez. + + {*PLAYER*} a chuté trop loin et s'est fait tuer par {*SOURCE*} avec {*ITEM*} - - Cochon zombie + + {*PLAYER*} a marché dans un feu en combattant {*SOURCE*} - - Inoffensifs de nature, ils vous attaqueront en groupe si vous vous en prenez à l'un d'entre eux. + + {*PLAYER*} a été poussé à la chute par {*SOURCE*} - - Ghast + + {*PLAYER*} a été poussé à la chute par {*SOURCE*} - - Décoche des boules de feu qui explosent à l'impact. + + {*PLAYER*} a été poussé à la chute par {*SOURCE*} avec {*ITEM*} - - Slime + + {*PLAYER*} s'est fait carboniser en combattant {*SOURCE*} - - Se divise en plusieurs slimes plus petits dès qu'il est touché. + + {*PLAYER*} s'est fait exploser par {*SOURCE*} - - Enderman + + {*PLAYER*} a été tué par un wither - - Vous attaquera si vous le regardez. Peut aussi déplacer des blocs. + + {*PLAYER*} s'est fait tuer par {*SOURCE*} avec {*ITEM*} - - Poisson d'argent + + {*PLAYER*} a tenté de nager dans la lave pour échapper à {*SOURCE*} - - Attire les poissons d'argent tapis à proximité si vous l'attaquez. Se cache dans les blocs de pierre. + + {*PLAYER*} a péri par noyade en tentant d'échapper à {*SOURCE*} - - Araignée bleue + + {*PLAYER*} a percuté un cactus en tentant d'échapper à {*SOURCE*} - - Sa morsure est empoisonnée. + + En selle - - Champimeuh + + Pour diriger un cheval, vous devez l'équiper d'une selle. Elles peuvent être achetées auprès des villageois ou trouvées dans des coffres dissimulés dans le monde. + - - Combiné à un bol, sert à la préparation de ragoûts de champignons. Produit des champignons et devient une vache normale une fois tondue. + + Vous pouvez équiper l es ânes et les mules apprivoisés de sacoches de selle en fixant un coffre sur eux. Vous pouvez accéder aux sacoches quand vous êtes en selle ou en vous accroupissant. - - Golem de neige + + + Les chevaux et les ânes (et non les mules) peuvent être élevés comme les autres animaux, à l'aide de pommes dorées ou de carottes en or. Les poulains deviendront adultes avec le temps, mais vous pouvez accélérer le processus en leur donnant du blé ou du foin. + - - Le Golem de neige se crée en combinant des blocs de neige et une citrouille. Il lance des boules de neige sur les ennemis de son créateur. + + + Les chevaux, les ânes et les mules doivent être apprivoisés pour pouvoir être utilisés. Pour apprivoiser un cheval, essayez de le monter et de rester en selle alors qu'il tente de vous désarçonner. - - Dragon de l'Ender + + Une fois que l'animal est apprivoisé, des coeurs apparaissent autour de lui et il ne tentera plus de vous désarçonner. + - - Un colossal dragon noir qu'on rencontre dans l'Ender. + + + Essayez de monter ce cheval, maintenant. Utilisez {*CONTROLLER_ACTION_USE*} sans objet ni outil à la main pour grimper en selle. + - - Blaze + + + Vous pouvez essayer d'apprivoiser les chevaux et les ânes ici. Vous trouverez aussi des selles, des armures pour chevaux et d'autres objets utiles pour les chevaux dans les coffres. + - - 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. + + + Une balise posée sur une pyramide d'au moins quatre étages permet de choisir le pouvoir secondaire de régénération ou un pouvoir principal plus puissant. + - - Cube de magma + + + Pour définir les pouvoirs de votre balise, il vous faudra sacrifier un lingot d'émeraude, de diamant, d'or ou de fer dans l'emplacement de paiement. Une fois définis, ses pouvoirs émaneront indéfiniment de la balise. + - - 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. + + Au sommet de cette pyramide se trouve une balise inactive. - - Villageois + + + L'interface de balise, qui vous permet de choisir des pouvoirs à attribuer à votre balise. + - - Ocelot + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'interface de balise. + - - 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. + + + Dans le menu de la balise, vous pouvez sélectionner 1 pouvoir principal pour votre balise. Plus votre pyramide a d'étages, plus votre choix de pouvoirs sera large. + - - Golem de fer + + + Tous les chevaux, ânes et mules adultes peuvent être montés. Cependant, seuls les chevaux peuvent être équipés d'une armure et seuls les ânes et les mules peuvent être équipés de sacoches de selle afin de transporter des objets. + - - Apparaît dans les villages pour les protéger. Peut être créé à partir de blocs de fer et de citrouilles. + + + Interface de l'inventaire du cheval. + - - Explosives Animator + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire des chevaux. + - - Concept Artist + + + L'inventaire du cheval vous permet de transférer ou d'équiper des objets sur votre cheval, votre âne ou votre mule. + - - Number Crunching and Statistics + + Crépitement - - Bully Coordinator + + Traînée - - Original Design and Code by + + Durée de vol : - - Project Manager/Producer + + +Sellez votre cheval en plaçant une selle dans l'emplacement de selle. Les chevaux peuvent être équipés d'une armure en plaçant une armure pour cheval dans l'emplacement d'armure. + - - Rest of Mojang Office + + Vous avez trouvé une mule. - - Lead Game Programmer Minecraft PC + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les chevaux, les ânes et les mules. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout sur les chevaux, les ânes et les mules. + - - Ninja Coder + + + Les chevaux et les ânes se trouvent principalement dans les plaines. Les mules peuvent être obtenues en croisant un âne et un cheval, mais elles s'avèrent stériles. + - - CEO + + + Ce menu vous permet également de transférer des objets entre votre propre inventaire et les sacoches de selle fixées sur les ânes et les mules. + - - White Collar Worker + + Vous avez trouvé un cheval. - - Customer Support + + Vous avez trouvé un âne. - - Office DJ + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les balises. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout sur les balises. + - - Designer/Programmer Minecraft - Pocket Edition + + Pour fabriquer une étoile de feu d'artifice, combinez de la poudre à canon et de la teinture dans la grille d'artisanat. - - Developer + + La teinture permet de définir la couleur de l'explosion de l'étoile de feu d'artifice. - - Chief Architect + + Pour choisir la forme de l'étoile de feu d'artifice, ajoutez à la recette une boule de feu, une pépite d'or, une plume ou un crâne. - - Art Developer + + Vous pouvez placer plusieurs étoiles de feu d'artifice dans la grille d'artisanat pour les ajouter à votre feu d'artifice. - - Game Crafter + + Plus vous placez de poudre à canon dans votre grille d'artisanat, plus vos étoiles de feu d'artifice exploseront haut. - - Director of Fun + + Retirez le feu d'artifice de l'emplacement de production une fois prêt. - - Music and Sounds + + Utilisez des diamants ou de la poudre de glowstone pour ajouter des traînées ou des crépitements. - - Programming + + Les feux d'artifice sont des objets de décoration qui peuvent être lancés à la main ou depuis un distributeur. Vous pouvez les confectionner en combinant du papier, de la poudre à canon, et si vous le souhaitez, un certain nombre d'étoiles de feux d'artifice. - - Art + + Vous pouvez personnaliser les couleurs, la forme, la taille et les effets (traînées, crépitements, etc.) des étoiles de feu d'artifice en ajoutant différents ingrédients lors de leur création. - - QA + + Essayez de fabriquer un feu d'artifice sur la table d'artisanat en utilisant les éléments fournis dans les coffres. - - Executive Producer + + Une fois l'étoile de feu d'artifice confectionnée, vous pouvez choisir la couleur de ses traînées en lui ajoutant une teinture. - - Lead Producer + + Vous trouverez dans les coffres différents éléments à utiliser pour créer des FEUX D'ARTIFICE ! - - Producer + + + {*B*}Appuyez sur {*CONTROLLER_VK_A*} pour en savoir plus sur les feux d'artifice. + {*B*}Appuyez sur {*CONTROLLER_VK_B*} si vous savez déjà utiliser les feux d'artifice. + - - Test Lead + + Pour fabriquer un feu d'artifice, combinez de la poudre à canon et du papier dans la grille d'artisanat qui apparaît au-dessus de votre inventaire. - - Lead Tester + + Cette pièce contient des entonnoirs - - Design Team + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les entonnoirs. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout sur les entonnoirs. + - - Development Team + + + Les entonnoirs servent à insérer des objets dans les conteneurs ou à les en retirer, ainsi qu'à récupérer automatiquement les objets lancés à l'intérieur. + - - Release Management + + + Les balises actives projettent un rayon de lumière puissant dans le ciel et procurent des pouvoirs aux joueurs proches. Elles sont créées avec du verre, de l'obsidienne et des étoiles du Nether, obtenues en vainquant le wither. + - - Director, XBLA Publishing + + + Les balises doivent être placées de façon à se trouver au soleil pendant la journée. Elles doivent être posées sur des pyramides de fer, d'or, d'émeraude ou de diamant. Cependant, le matériau n'influe pas sur le pouvoir de la balise. + - - Business Development + + + Essayez d'utiliser la balise pour définir le pouvoir qu'elle procure (vous pouvez utiliser les lingots de fer fournis en guise de paiement). + - - Portfolio Director + + + Ils peuvent affecter les alambics, les coffres, les distributeurs, les droppers, les chariots de mine avec coffre, les chariots de mine avec entonnoir ainsi que les autres entonnoirs. + - - Product Manager + + + Vous trouverez dans cette pièce différents agencements d'entonnoirs utiles qui vous permettront d'observer et d'expérimenter. + - - Marketing + + Voici l'interface des feux d'artifice, qui vous permet de fabriquer des fusées et des étoiles de feu d'artifice. - - Community Manager + + {*B*}Appuyez sur {*CONTROLLER_VK_A*} pour continuer. +{*B*}Appuyez sur {*CONTROLLER_VK_B*} si vous savez déjà utiliser l'interface des feux d'artifice. - - Europe Localization Team + + +L es entonnoirs tentent en permanence d'aspirer les objets placés dans un conteneur adéquat les surplombant. Ils tentent également d'insérer les objets stockés dans un conteneur de destination. + - - Redmond Localization Team + + + Cependant, si un entonnoir est alimenté par une redstone, il devient inactif et cesse toute aspiration et tout stockage d'objets. + - - Asia Localization Team + + + Un entonnoir est tourné dans la direction vers laquelle il tente de stocker des objets. Pour qu'un entonnoir soit tourné vers un bloc particulier, placez l'entonnoir contre ce bloc en vous faufilant. + - - User Research Team + + Ces ennemies se trouvent dans les marais et attaquent en vous jetant des potions. Elles produisent des potions quand elles sont tuées. - - MGS Central Teams + + Le nombre maximal de tableaux/cadres dans un monde a été atteint. - - Milestone Acceptance Tester + + Vous ne pouvez pas faire apparaître d'ennemis en mode Pacifique. - - Special Thanks + + Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de cochons, moutons, vaches, chats et chevaux en cours d'élevage a été atteint. - - Test Manager + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de pieuvres dans un monde. - - Senior Test Lead + + Impossible d'utiliser un oeuf d'apparition pour le moment. Le nombre maximal d'ennemis dans un monde a été atteint. - - SDET + + Impossible d'utiliser un oeuf d'apparition pour le moment. Le nombre maximal de villageois dans un monde a été atteint. - - Project STE + + Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de loups en cours d'élevage a été atteint. - - Additional STE + + Le nombre maximal de crânes dans un monde a été atteint. - - Test Associates + + Inverser - - Jon Kågström + + Gaucher - - Tobias Möllstam + + Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de poulets en cours d'élevage a été atteint. - - Risë Lugo + + Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de champimeuh en cours d'élevage a été atteint. - - Épée en bois + + Le nombre maximal de bateaux dans un monde a été atteint. - - Épée en pierre + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de poulets dans un monde. - - Épée en fer + + {*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 toutes parts, 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-t-il 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 faite des 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 coeur d'une étoile. Le joueur est donc, lui aussi, fait des 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*} - - Épée en diamant + + {*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'oeil 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*} - - Épée en or + + Réinitialiser le Nether - - Pelle en bois + + %s est entré(e) dans l'Ender - - Pelle en pierre + + %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 abri.{*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é à nu 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*} - - Pelle en fer + + 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 ! - - Pelle en diamant + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de cochons, moutons, vaches, chats et chevaux. - - Pelle en or + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de champimeuh. - - Pioche en bois + + Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de loups dans un monde. - - Pioche en pierre + + Réinitialiser le Nether - - Pioche en fer + + Ne pas réinitialiser le Nether - - Pioche en diamant + + Pas de tonte de champimeuh pour le moment. Vous avez atteint le nombre maximal de cochons, moutons, vaches, chats et chevaux. - - Pioche en or + + Vous êtes mort ! - - Hache en bois + + Options du monde - - Hache en pierre + + Construction et minage possibles - - Hache en fer + + Utilisation portes et leviers possible - - Hache en diamant + + Génération de structures - - Hache en or + + Monde superplat - - Houe en bois + + Coffre bonus - - Houe en pierre + + Ouverture de conteneurs possible - - Houe en fer + + Exclure joueur - - Houe en diamant + + Vol possible - - Houe en or + + Fatigue désactivée - - Porte en bois + + Attaque des joueurs possible - - Porte en fer + + Attaque des animaux possible - - Casque en mailles + + Modérateur - - Plastron en mailles + + Privilèges d'hôte - - Jambières en mailles + + Comment jouer - - Bottes en mailles + + Commandes - - Coiffe en cuir + + Paramètres - - Casque en fer + + Réapparaître - - Casque en diamant + + Contenu téléchargeable - - Casque en or + + Changer de skin - - Tunique de cuir + + Générique - - Plastron en fer + + Explosion de TNT - - Plastron en diamant + + Joueur contre joueur - - Plastron en or + + Joueurs de confiance - - Pantalon en cuir + + Réinstaller le contenu - - Jambières en fer + + Debug Settings - - Jambières en diamant + + Propagation du feu - - Jambières en or + + Dragon de l'Ender - - Bottes en cuir + + {*PLAYER*} a été tué(e) par le souffle du Dragon de l'Ender. - - Bottes en fer + + {*PLAYER*} s'est fait tuer par {*SOURCE*} - - Bottes en diamant + + {*PLAYER*} s'est fait tuer par {*SOURCE*} - - Bottes en or + + {*PLAYER*} a péri - - Lingot de fer + + {*PLAYER*} a explosé - - Lingot d'or + + {*PLAYER*} a trépassé par magie - - Seau + + {*PLAYER*} s'est fait tirer dessus par {*SOURCE*} - - Seau d'eau + + Brouillard d'adminium - - Seau de lave + + Afficher interface - - Briquet à silex + + Afficher main - - Pomme + + {*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} - - Arc + + {*PLAYER*} s'est fait rouer de coups par {*SOURCE*} - - Flèche + + {*PLAYER*} s'est fait tuer par {*SOURCE*} avec la magie - - Charbon + + {*PLAYER*} a chuté du bout du monde - - Charbon de bois + + Packs de textures - - Diamant + + Packs mash-up - - Bâton + + {*PLAYER*} a brûlé - - Bol + + Thèmes - - Ragoût de champignons + + Images du joueur - - Fil + + Objets pour avatar - - Plume + + {*PLAYER*} a joué avec les allumettes - - Poudre à canon + + {*PLAYER*} a crevé de faim - - Graines de blé + + {*PLAYER*} a reçu une piqûre mortelle - - Blé + + {*PLAYER*} a percuté le sol - - Pain + + {*PLAYER*} a piqué une tête dans la lave - - Silex + + {*PLAYER*} a suffoqué dans un mur - - Viande de porc crue + + {*PLAYER*} a péri par noyade - - Viande de porc cuite + + Messages mortuaires - - Peinture + + Vous n'êtes plus modérateur - - Pomme dorée + + Vous pouvez maintenant voler - - Panneau + + Vous ne pouvez plus voler - - Chariot de mine + + Vous ne pouvez plus attaquer les animaux - - Selle + + Vous pouvez maintenant attaquer les animaux - - Redstone + + Vous êtes désormais modérateur - - Boule de neige + + Vous ne vous fatiguerez plus - - Bateau + + Vous êtes maintenant invulnérable - - Cuir + + Vous n'êtes plus invulnérable - - Seau de lait + + %d MSP - - Brique + + Vous pouvez maintenant vous fatiguer - - Argile + + Vous êtes maintenant invisible - - Canne à sucre + + Vous n'êtes plus invisible - - Papier + + Vous pouvez maintenant attaquer des joueurs - - Livre + + Vous pouvez maintenant miner et utiliser des objets - - Boule de slime + + Vous ne pouvez plus placer de blocs - - Chariot avec coffre + + Vous pouvez maintenant placer des blocs - - Chariot de mine avec four + + Personnage animé - - Oeuf + + Animation skin perso - - Boussole + + Vous ne pouvez plus miner ou utiliser d'objet - - Canne à pêche + + Vous pouvez maintenant utiliser portes et leviers - - Montre + + Vous ne pouvez plus attaquer des monstres - - Poudre glowstone + + Vous pouvez maintenant attaquer des monstres - - Poisson cru + + Vous ne pouvez plus attaquer des joueurs - - Poisson cuit + + Vous ne pouvez plus utiliser portes et leviers - - Poudre de colorant + + Vous pouvez maintenant utiliser des conteneurs (coffres, par exemple) - - Poche d'encre + + Vous ne pouvez plus utiliser de conteneurs (coffres, par exemple) - - Pétale de rose + + Invisible - - Vert de cactus + + Balises + + + {*T3*}COMMENT JOUER : BALISES{*ETW*}{*B*}{*B*} +Les balises actives projettent un rayon de lumière puissant dans le ciel et procurent des pouvoirs aux joueurs proches.{*B*} +Elles sont créées avec du verre, de l'obsidienne et des étoiles du Nether, obtenues en vainquant le wither.{*B*}{*B*} +Les balises doivent être placées de façon à se trouver au soleil pendant la journée. Elles doivent être posées sur une pyramide de fer, d'or, d'émeraude ou de diamant.{*B*} +Le matériau sur lequel la balise est posée n'influe pas sur le pouvoir de la balise.{*B*}{*B*} +Dans le menu de la balise, vous pouvez sélectionner un pouvoir principal. Plus votre pyramide a d'étages, plus votre choix de pouvoirs sera large.{*B*} +Une balise posée sur une pyramide d'au moins quatre étages permet de choisir le pouvoir secondaire de régénération ou bien un pouvoir principal plus puissant.{*B*}{*B*} +Pour définir les pouvoirs de votre balise, il vous faudra sacrifier un lingot d'émeraude, de diamant, d'or ou de fer dans l'emplacement de paiement.{*B*} +Une fois définis, ses pouvoirs émaneront indéfiniment de la balise.{*B*} + - - Fèves de cacao + + Feux d'artifice + + + Langues + + + Chevaux + + + {*T3*}COMMENT JOUER : CHEVAUX{*ETW*}{*B*}{*B*} +Les chevaux et les ânes se trouvent principalement dans les plaines. Les mules sont issues du croisement entre un âne et un cheval, mais s'avèrent stériles.{*B*} +Tous les chevaux, ânes et mules adultes peuvent être montés. Cependant, seuls les chevaux peuvent être équipés d'armures et seuls les ânes et les mules peuvent être équipés de sacoches de selle afin de transporter des objets.{*B*}{*B*} +Les chevaux, les ânes et les mules doivent être apprivoisés avant de pouvoir être utilisés. Pour apprivoiser un cheval, essayez de le monter et de rester en selle lorsqu'il tente de vous désarçonner.{*B*} +Quand des coeurs apparaissent autour du cheval, il est apprivoisé et ne tentera plus de vous désarçonner. Pour diriger un cheval, vous devez l'équiper d'une selle.{*B*}{*B*} +Les selles peuvent être achetées auprès des villageois ou trouvées dans des coffres dissimulés dans le monde.{*B*} +Vous pouvez équiper les ânes et les mules apprivoisés de sacoches de selle en fixant un coffre dessus. Vous pourrez accéder aux sacoches lorsque vous êtes en selle ou en vous accroupissant.{*B*}{*B*} +Les chevaux et les ânes (mais pas les mules) peuvent être élevés comme les autres animaux, à l'aide de pommes dorées ou de carottes en or.{*B*} +Les poulains deviendront adultes avec le temps, mais vous pouvez accélérer le processus en leur donnant du blé ou du foin.{*B*} + + + {*T3*}COMMENT JOUER : FEUX D'ARTIFICE{*ETW*}{*B*}{*B*} +Les feux d'artifice sont des objets de décoration pouvant être lancés à la main ou depuis un distributeur. Vous pouvez les confectionner en combinant du papier, de la poudre à canon, et si vous le souhaitez, un certain nombre d'étoiles de feux d'artifice.{*B*} +Vous pouvez personnaliser les couleurs, la forme, la taille et les effets (traînées, crépitements, etc.) des étoiles de feu d'artifice en ajoutant différents ingrédients lors de leur création.{*B*}{*B*} +Pour fabriquer un feu d'artifice, combinez de la poudre à canon et du papier dans la grille d'artisanat située au-dessus de votre inventaire.{*B*} +Vous pouvez également y placer plusieurs étoiles de feu d'artifice pour les ajouter à votre création.{*B*} +Plus vous ajoutez de poudre à canon dans la grille d'artisanat, plus vos étoiles de feu d'artifice iront haut.{*B*}{*B*} +Une fois que c'est fait, vous pouvez retirer le feu d'artifice ainsi confectionné de la case de production.{*B*}{*B*} +Pour fabriquer des étoiles de feu d'artifice, combinez de la poudre à canon et de la teinture dans la grille d'artisanat.{*B*} +- La teinture déterminera la couleur de l'explosion de l'étoile de feu d'artifice.{*B*} +- Pour choisir la forme de votre étoile de feu d'artifice, ajoutez une boule de feu, une pépite d'or, une plume ou un crâne.{*B*} +- Vous pouvez également y ajouter des traînées ou des crépitements avec des diamants ou de la poudre de glowstone.{*B*}{*B*} +Une fois l'étoile de feu d'artifice confectionnée, vous pouvez choisir la couleur de ses traînées en lui ajoutant une teinture. + + + {*T3*}COMMENT JOUER : DROPPERS{*ETW*}{*B*}{*B*} +Lorsqu'ils sont alimentés avec de la redstone, les Droppers lâchent aléatoirement sur le sol l'un des objets qu'ils contiennent. Ouvrez le Dropper avec {*CONTROLLER_ACTION_USE*} et remplissez-le avec des objets de votre inventaire.{*B*} +Si le Dropper fait face à un coffre ou tout autre type de conteneur, l'objet y sera transféré. Vous pouvez mettre en place de longues chaînes de Droppers afin de transporter des objets sur une longue distance, mais pour que celles-ci fonctionnent, vous devrez alimenter les Droppers de façon alternative. + + + Utilisez votre carte vide pour dévoiler une partie du monde qui vous entoure. Elle se remplira au fur et à mesure de vos explorations. + + + Produite par le wither, sert à la confection de balises. + + + Entonnoirs + + + {*T3*}COMMENT JOUER : ENTONNOIRS{*ETW*}{*B*}{*B*} +Les entonnoirs servent à insérer des objets dans les conteneurs ou à les en retirer, ainsi qu'à récupérer automatiquement les objets lancés à l'intérieur.{*B*} +Ils peuvent affecter les alambics, les coffres, les distributeurs, les droppers, les chariots de mine avec coffre, les chariots de mine avec entonnoir et les autres entonnoirs.{*B*}{*B*} +Les entonnoirs tentent en permanence d'aspirer les objets placés dans un conteneur adéquat les surplombant. Ils tentent également d'insérer les objets stockés dans un conteneur de destination.{*B*} +Si un entonnoir est alimenté par une redstone, il devient inactif et cesse toute aspiration et stockage d'objets.{*B*}{*B*} +Un entonnoir est tourné dans la direction vers laquelle il tente de stocker des objets. Pour qu'un entonnoir soit tourné vers un bloc particulier, placez l'entonnoir contre ce bloc en vous faufilant.{*B*} + - - Lapis-lazuli + + Droppers - - Colorant violet + + NOT USED - - Colorant bleu cyan + + Santé - - Colorant gris clair + + Dégâts - - Colorant gris + + Saut - - Colorant rose + + Fatigue de mineur - - Colorant vert clair + + Force - - Pétale de pissenlit + + Faiblesse - - Colorant bleu ciel + + Nausée - - Colorant magenta + + NOT USED - - Colorant orange + + NOT USED - - Poudre d'os + + NOT USED - - Os + + Régénération - - Sucre + + Résistance - - Gâteau + + Recherche d'une graine pour le générateur de monde - - Lit + + Une fois activés, ils créent des explosions multicolores. La couleur, l'effet, la forme et le passage d'une couleur à l'autre dépendent de l'étoile de feu d'artifice utilisée lors de la création du feu d'artifice. - - Répéteur de redstone + + Rails capables d'activer/désactiver les chariots de mine avec entonnoir et de déclencher les chariots de mine avec TNT. - - Cookie + + Sert à stocker/relâcher des objets ou à pousser des objets dans un autre conteneur sous l'effet d'une charge de redstone. - - Carte + + Blocs colorés fabriqués en teintant de l'argile durcie. - - Disque vinyle "13" + + Fournit une charge de redstone. La charge sera d'autant plus puissante que le nombre d'objets sur le plateau sera élevé. Nécessite plus de poids que la plaque légère. - - Disque vinyle "cat" + + Sert de source d'énergie de redstone. Peut être transformé à nouveau en redstone. - - Disque vinyle "blocks" + + Sert à attraper des objets, à les transférer dans des conteneurs ou à les en sortir. - - Disque vinyle "chirp" + + Peut être donné aux chevaux, aux ânes ou aux mules afin de restaurer jusqu'à 10 coeurs. Accélère la croissance des poulains. - - Disque vinyle "far" + + Chauve-souris - - Disque vinyle "mall" + + Ces créatures volantes vivent dans les grottes ou autres vastes espaces clos. - - Disque vinyle "mellohi" + + Sorcière - - Disque vinyle "stal" + + Créé en faisant cuire de l'argile dans un four. - - Disque vinyle "strad" + + Se fabrique avec du verre et un colorant. - - Disque vinyle "ward" + + Se fabrique avec du verre teinté - - Disque vinyle "11" + + Fournit une charge de redstone. La charge sera d'autant plus puissante que le nombre d'objets sur le plateau sera élevé. - - Disque vinyle "where are we now" + + Bloc émettant un signal de redstone en fonction de la lumière du soleil (ou de son absence). - - Cisailles + + Type de chariot de mine spécial fonctionnant comme un entonnoir. Il récupère les objets sur les rails et dans des conteneurs le surplombant. - - Graines de citrouille + + Armure spéciale pouvant être équipée sur un cheval. Fournit 5 armures. - - Graines de pastèque + + Sert à déterminer la couleur, l'effet et la forme d'un feu d'artifice. - - Poulet cru + + Sert dans les circuits de redstone pour entretenir, comparer ou soustraire la puissance du signal ou pour mesurer certains états de blocs. - - Poulet cuit + + Type de chariot de mine se comportant comme un bloc de TNT mouvant. - - Boeuf cru + + Armure spéciale pouvant être équipée sur un cheval. Fournit 7 armures. - - Steak + + Sert à exécuter des ordres. - - Chair putréfiée + + Projette un rayon de lumière dans le ciel et peut procurer des effets de statut aux joueurs proches. - - Ender Pearl + + Stockez des blocs et des objets à l'intérieur. Placez deux coffres côte à côte pour créer un coffre plus grand, de capacité double. Le coffre piégé crée une charge de redstone lorsqu'il est ouvert. - - Tranche de pastèque + + Armure spéciale pouvant être équipée sur un cheval. Fournit 11 points d'armure. - - Bâton de feu + + Sert à attacher des créatures au joueur ou à des poteaux de clôture - - Larme de Ghast + + Sert à nommer des créatures dans le monde. - - Pépite d'or + + Hâte - - Verrue du Nether + + Jeu complet - - Potion{*splash*}{*prefix*}{*postfix*} + + Reprendre le jeu - - Fiole + + Sauvegarder la partie - - Fiole d'eau + + Jouer - - Oeil d'araignée + + Classements - - Oeil d'araignée fermenté + + Aide et options - - Poudre de feu + + Difficulté : - - Crème de magma + + Joueur contre joueur : - - Alambic + + Joueurs de confiance : - - Chaudron + + TNT : - - Oeil d'Ender + + Type de partie : - - Pastèque scintillante + + Structures : - - Fiole d'expérience + + Type de niveau : - - Boule de feu + + Aucune partie trouvée - - Boule de feu (ch. bois) + + Sur invitation - - Boule de feu charbon + + Plus d'options - - Cadre + + Charger - - Fait apparaître {*CREATURE*} + + Options de l'hôte - - Brique du Nether + + Joueurs/Invitation - - Crâne + + Jeu en ligne - - Crâne de squelette + + Nouveau monde - - Crâne de wither squelette + + Joueurs - - Tête de zombie + + Rejoindre la partie - - Crâne + + Commencer la partie - - Crâne de %s + + Nom du monde - - Crâne de creeper + + Graine pour le générateur de monde - - Pierre + + Champ vide pour une graine aléatoire - - Bloc d'herbe + + Propagation du feu : - - Terre + + Modifier le message : - - Pierre taillée + + Renseigner la légende de votre capture d'écran - - Planches en chêne + + Sous-titre - - Planches en sapin + + Infobulles en jeu - - Planches en bouleau + + Écran partagé (2 joueurs) - - Planches (bois tropical) + + Terminé - - Pousse d'arbre + + Capture d'écran du jeu - - Pousse de chêne + + Pas d'effet - - Pousse d'épicéa + + Rapidité - - Pousse de bouleau + + Lenteur - - Pousse d'arbre tropical + + Modifier le message : - - Adminium + + Les textures, icônes et interface utilisateur classiques de Minecraft ! - - Eau + + Afficher tous les mondes mash-up - - Lave + + Conseils - - Sable + + Réinstaller l'article pour avatar 1 - - Grès + + Réinstaller l'article pour avatar 2 - - Gravier + + Réinstaller l'article pour avatar 3 - - Minerai d'or + + Réinstaller le thème - - Minerai de fer + + Réinstaller l'image du joueur 1 - - Minerai de charbon + + Réinstaller l'image du joueur 2 - - Bois + + Options - - Bois de chêne + + Interface utilisateur - - Bois d'épicéa + + Paramètres par défaut - - Bois de bouleau + + Tremblements caméra - - Bois tropical + + Audio - - Chêne + + Contrôle - - Sapin + + Vidéo - - Bouleau + + Sert en alchimie. Produite par les Ghasts à leur mort. - - Feuillage + + Produite par les Cochons zombies à leur mort. Les Cochons zombies se rencontrent dans le Nether. Permet de confectionner des potions. - - Feuilles de chêne + + Sert en alchimie. Pousse dans les forteresses du Nether. Peut aussi être plantée dans du sable des âmes. - - Feuilles d'épicéa + + Glissante lorsque vous y marchez. 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 qu'on la place dans le Nether. - - Feuilles de bouleau + + Peut servir de décoration. - - Feuilles tropicales + + Sert en alchimie, mais aussi pour localiser les forts. Produit par les Blazes qu'on trouve à proximité ou à l'intérieur des forteresses du Nether. - - Éponge + + Peut avoir divers effets selon ce sur quoi elle est utilisée. - - Verre + + Sert en alchimie et intervient dans la fabrication d'objets comme l'oeil d'Ender ou la crème de magma. - - Laine + + Sert en alchimie. - - Laine noire + + Sert à la création de potions simples et volatiles. - - Laine rouge + + Peut être remplie d'eau et servir d'ingrédient de base d'une potion distillée dans l'alambic. - - Laine verte + + Aliment vénéneux et ingrédient alchimique. Se trouve sur les cadavres d'araignées ou d'araignées bleues. - - Laine marron + + Sert en alchimie. Intervient principalement dans la création de potions néfastes. - - Laine bleue + + Lorsqu'il est placé, pousse sans interruption. Se prélève avec des cisailles. Peut-être utilisé comme une échelle. - - Laine violette + + Comparable à une porte, mais s'utilise principalement avec une barrière. - - Laine bleu cyan + + Se fabrique avec des tranches de pastèque. - - Laine gris clair + + Des blocs transparents qui peuvent servir d'alternative aux blocs de verre. - - Laine grise + + Si alimenté (torche de redstone et bouton, levier ou plaque de détection), le piston s'allonge pour pousser des blocs. Quand le piston se rétracte, le bloc en contact avec la tête du piston revient aussi en place. - - Laine rose + + Faite de blocs de pierre. On en trouve généralement dans les forts. - - Laine vert clair + + Sert de clôture, comparable aux barrières. - - Laine jaune + + À planter pour faire pousser des citrouilles. - - Laine bleu ciel + + Sert à la construction et à la décoration. - - Laine magenta + + Ralentit vos mouvements lorsque vous passez à travers. Utilisez des cisailles pour la détruire et prélever du fil. - - Laine orange + + 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é. - - Laine blanche + + À planter pour faire pousser des pastèques. - - Fleur + + 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é. - - Rose + + Un bloc de terre couronnée de gazon. Se prélève à l'aide d'une pelle. Sert de matériau de construction. - - Champignon + + Peut se remplir d'eau à l'aide d'un seau d'eau ou lorsqu'on le laisse sous la pluie. Sert aussi à remplir des fioles. - - Bloc d'or + + Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. - - Une façon plus compacte de stocker l'or. + + Créés en faisant fondre du Netherrack dans un four. Peuvent être transformés en blocs de briques du Nether. - - Bloc de fer + + Émet de la lumière quand elle est activée. - - Une façon plus compacte de stocker le fer. + + Similaires à une vitrine, affichent les objets ou blocs qui y sont placés. - - Dalle de pierre + + Lancez-le pour faire apparaître une créature du type indiqué. - - Dalle de pierre + + Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. - - Dalle de grès + + Leur récolte permet d'obtenir des fèves de cacao. - - Dalle de chêne + + Vache - - Dalle de pierre taillée + + Produit du cuir une fois tuée. Utilisez un seau pour la traire. - - Dalle en briques + + Mouton - - Dalle en briques de pierre + + Les crânes peuvent servir de décoration ou être portés comme masques dans l'emplacement pour le casque. - - Dalle de chêne + + Pieuvre - - Dalle de sapin + + Produit une poche d'encre une fois tuée. - - Dalle de bouleau + + Utile pour enflammer des choses ou pour provoquer des incendies lorsqu'on en place dans un distributeur. - - Dalle de bois tropical + + Flotte sur l'eau et permet de marcher dessus. - - Dalles du Nether + + Sert à construire des forteresses du Nether. Invulnérable aux boules de feu des Ghasts. - - Briques + + Sert dans les forteresses du Nether. - - TNT + + 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'ouvre. - - Bibliothèque + + Sert en alchimie. - - Pierre moussue + + Comparable aux blocs d'herbe, mais très efficace pour faire pousser des champignons. - - Obsidienne + + Se trouve dans les forteresses du Nether et produit des verrues du Nether lorsqu'elle est brisée. - - Torche + + 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. - - Torche (charbon) + + Ce bloc est créé lorsque le Dragon de l'Ender est terrassé. - - Torche (char. de bois) + + Lancée, elle produit des orbes d'expérience qui augmentent vos points d'expérience une fois ramassés. - - Feu + + Permet au joueur, moyennant ses points d'expérience, d'enchanter épées, pioches, haches, pelles, arcs et armures. - - Générateur de monstres + + S'active à l'aide de l'oeil d'Ender et permet au joueur de voyager jusqu'à la dimension de l'Ender. - - Escalier en chêne + + Sert à créer un portail de l'Ender. - - Coffre + + Une fois alimenté (moyennant un bouton, un levier, une plaque de détection, une torche de redstone ou de la redstone avec l'un ou l'autre de ces éléments), le piston s'allonge si possible pour pousser des blocs. - - Poudre de redstone + + Obtenue par la cuisson d'argile dans un four. - - Minerai de diamant + + Peut être transformée en briques à la chaleur d'un four. - - Bloc de diamant + + Une fois brisée, produit des boules d'argile qui peuvent être transformées en briques dans le four. - - Une façon plus compacte de stocker les diamants. + + Travaillé à la hache. Transformé en planches ou utilisé comme combustible. - - Établi + + 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. - - Cultures + + Obtenue en travaillant la pierre à l'aide d'une pioche. Peut servir à la construction d'un four ou à la fabrication d'outils en pierre. - - Terre labourée + + Un moyen peu encombrant d'entreposer des boules de neige. - - Four + + Combiné à un bol, sert à la préparation de ragoûts. - - Panneau + + 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. - - Porte en bois + + Libère des monstres dans l'environnement. - - Échelle + + Se creuse à l'aide d'une pelle pour créer des boules de neige. - - Rail + + Produit parfois des graines de blé si détruite. - - Rail de propulsion + + Transformable en colorant. - - Rail de détection + + 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. - - Escalier en pierre + + Se mine avec une pioche pour prélever du charbon. - - Levier + + Se mine avec une pioche en pierre pour prélever du lapis-lazuli. - - Plaque de détection + + Se mine avec une pioche en fer pour prélever des diamants. - - Porte en fer + + Sert de décoration. - - Minerai de redstone + + Se mine à l'aide d'une pioche en fer (ou mieux). Transformé en lingots d'or dans le four. - - Torche de redstone + + Se mine à l'aide d'une pioche en pierre (ou mieux). Transformé en lingots de fer dans le four. - - Touche + + Se mine avec une pioche en fer pour prélever de la poudre de redstone. - - Neige + + Impossible à briser. - - Glace + + Enflamme n'importe quoi à son contact. Peut être prélevée dans un seau. - - Cactus + + 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. - - Argile + + Se mine avec une pioche pour prélever de la pierre taillée. - - Canne à sucre + + Prélevée à l'aide d'une pelle. Sert de matériau de construction. - - Juke-box + + Une fois plantée, peut prospérer et devenir un arbre. - - Barrière + + Se place au sol pour créer un câble conducteur d'électricité. Ajouté à une potion, permet d'en augmenter la durée. - - Citrouille + + Prélevé sur les cadavres de vaches. Sert à la confection d'armures ou de livres. - - Citrouille-lanterne + + Prélevée sur les cadavres de slimes. Sert d'ingrédient pour les potions et permet de confectionner des pistons collants. - - Netherrack + + Produit aléatoirement par les poules. Sert à la préparation d'aliments. - - Sable des âmes + + Obtenu en creusant le gravier. Sert à la confection d'un briquet à silex. - - Glowstone + + Utilisée sur un cochon, vous permet de le chevaucher. Vous pouvez ensuite diriger le cochon à l'aide d'une carotte et d'un bâton. - - Portail + + Obtenue en creusant la neige. Peut servir de projectile. - - Minerai de lapis-lazuli + + Obtenue en minant un bloc de glowstone. Sert à la reconstitution de blocs de glowstone et combiné à une potion, permet d'en augmenter la puissance. - - Bloc de lapis-lazuli + + Une fois détruit, produit une pousse d'arbre à replanter pour créer un nouvel arbre. - - Une façon plus compacte de stocker le lapis lazuli. + + Sert à la construction et à la décoration. Se trouve dans les donjons. - - Distributeur + + Sert à tondre la laine des moutons et à récolter les blocs de feuillage. - - Bloc musical + + Prélevé sur les cadavres de squelettes. Sert à la confection de poudre d'os. Donnez-en à manger à un loup pour le domestiquer. - - Gâteau + + Obtenu sur les creepers tués par un squelette. À lire dans un juke-box. - - Lit + + Éteint les flammes et contribue à la prospérité des cultures. À prélever dans un seau. - - Toile + + Obtenu par la récolte des cultures. Sert à la préparation d'aliments. - - Herbes hautes + + Sert à la confection de sucre. - - Arbuste mort + + 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. - - Diode + + Brûle indéfiniment si embrasé. - - Coffre verrouillé + + Une fois arrivées à maturité, les cultures peuvent être récoltées pour produire du blé. - - Trappe + + Un sol fertile préparé pour la culture des graines. - - Laine (toutes couleurs) + + Passé au four, sert à la confection d'un colorant vert. - - Piston + + Ralentit le mouvement de toute créature qui circule dessus. - - Piston collant + + Prélevé sur les cadavres de poulets. Sert à la confection des flèches. - - Bloc de poisson d'argent + + Prélevé sur les cadavres de creepers. Sert à la confection de TNT et de potions. - - Briques de pierre + + Plantées dans une terre labourée, produisent des cultures. Assurez-vous que les graines soient assez exposées au soleil ! - - Pierres taillées moussues + + Emprunter un portail permet de circuler entre la Surface et le Nether. - - Pierres craquelées + + Alimente le four en combustible. Sert à la confection des torches. - - Blocs de pierre taillée + + Prélevé sur les cadavres d'araignées. Sert à la confection des arcs et des cannes à pêche, et peut-être placé au sol comme fil de détente pour actionner des crochets. - - Champignon + + Produit de la laine quand il est tondu (s'il ne l'a pas déjà été). Utilisez un colorant pour changer la couleur de sa laine. - - Champignon + + Business Development - - Barreaux de fer + + Portfolio Director - - Vitre + + Product Manager - - Pastèque + + Development Team - - Queue de citrouille + + Release Management - - Queue de pastèque + + Director, XBLA Publishing - - Lierre + + Marketing - - Portillon + + Asia Localization Team - - Escalier en briques + + User Research Team - - Escalier (brique pierre) + + MGS Central Teams - - Pierre de poisson d'argent + + Community Manager - - Pierre taillée de poisson d'argent + + Europe Localization Team - - Brique en pierre de poisson d'argent + + Redmond Localization Team - - Mycélium + + Design Team - - Nénuphar + + Director of Fun - - Brique du Nether + + Music and Sounds - - Barrière en Nether + + Programming - - Escalier en Nether + + Chief Architect - - Verrue du Nether + + Art Developer - - Table d'enchantement + + Game Crafter - - Alambic + + Art - - Chaudron + + Producer - - Portail de l'Ender + + Test Lead - - Cadre de portail de l'Ender + + Lead Tester - - Pierre blanche + + QA - - Oeuf de Dragon + + Executive Producer - - Arbuste + + Lead Producer - - Fougère + + Milestone Acceptance Tester - - Escalier en grès + + Pelle en fer - - Escalier en sapin + + Pelle en diamant - - Escalier en bouleau + + Pelle en or - - Escalier en bois tropical + + Épée en or - - Lampe de redstone + + Pelle en bois - - Cacao + + Pelle en pierre - - Crâne + + Pioche en bois - - Commandes actuelles + + Pioche en or - - Config. + + Hache en bois - - Se déplacer/Courir + + Hache en pierre - - Regarder + + Pioche en pierre - - Pause + + Pioche en fer - - Sauter + + Pioche en diamant - - Sauter/Voler Haut + + Épée en diamant - - Inventaire + + SDET - - Changer d'objet + + Project STE - - Action + + Additional STE - - Utiliser + + Special Thanks - - Artisanat + + Test Manager - - Lâcher + + Senior Test Lead - - Se faufiler + + Test Associates - - Se faufiler/Voler Bas + + Épée en bois - - Changer mode caméra + + Épée en pierre - - Joueurs/Invitation + + Épée en fer - - Déplacement (en vol) + + Jon Kågström - - Config. 1 + + Tobias Möllstam - - Config. 2 + + Risë Lugo - - Config. 3 + + Developer - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Décoche des boules de feu qui explosent à l'impact. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Slime - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Se divise en plusieurs slimes plus petits dès qu'il est touché. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Cochon zombie - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Inoffensifs de nature, ils vous attaqueront en groupe si vous vous en prenez à l'un d'entre eux. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Ghast - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Enderman - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Araignée bleue - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Sa morsure est empoisonnée. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Champimeuh - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Vous attaquera si vous le regardez. Peut aussi déplacer des blocs. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Poisson d'argent - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Attire les poissons d'argent tapis à proximité si vous l'attaquez. Se cache dans les blocs de pierre. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Attaque dès que vous approchez. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Produit de la viande de porc une fois tué. Utilisez une selle pour le chevaucher. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Loup - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Inoffensif à moins d'être attaqué : il ripostera alors sans hésiter. Utilisez des os pour le domestiquer : le loup vous suivra et s'en prendra à tous vos assaillants. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Poulet - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Produit des plumes une fois tué. Pond aussi des oeufs, à l'occasion. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Cochon - - {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + + Creeper - - {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour commencer le didacticiel.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + + Araignée - - 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. + + Attaque dès que vous approchez. Peut escalader les murs. Produit du fil une fois tuée. - - Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder vers le haut, vers le bas et autour de vous. + + Zombie - - Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer. + + Explose si vous l'approchez de trop près ! - - Pour courir, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant. Tant que vous maintenez{*CONTROLLER_ACTION_MOVE*} vers l'avant, le personnage continuera à courir jusqu'à ce que sa durée de course soit écoulée ou que sa jauge de nourriture se vide. + + Squelette - - Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter. + + Vous décoche des flèches. Produit des flèches et des os une fois tué. - - 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. + + Combiné à un bol, sert à la préparation de ragoûts de champignons. Produit des champignons et devient une vache normale une fois tondue. - - 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. + + Original Design and Code by - - Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'artisanat. + + Project Manager/Producer - - 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. + + Rest of Mojang Office - - À force de vous déplacer, de miner et d'attaquer, la barre de nourriture{*ICON_SHANK_01*} se vide progressivement. Courir et sauter après une course épuisent bien plus rapidement la barre de nourriture que la marche et les sauts classiques. + + Concept Artist - - 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. + + Number Crunching and Statistics - - 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. + + Bully Coordinator - - 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*} + + Lead Game Programmer Minecraft PC - - Le bois que vous avez recueilli peut être taillé en planches. Ouvrez l'interface d'artisanat pour en fabriquer.{*PlanksIcon*} + + Customer Support - - 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 établi.{*CraftingTableIcon*} + + Office DJ - - 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*} + + Designer/Programmer Minecraft - Pocket Edition - - Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à manier. + + Ninja Coder - - 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. + + CEO - - L'établi sélectionné, placez le réticule à l'emplacement voulu et utilisez{*CONTROLLER_ACTION_USE*} pour placer un établi. + + White Collar Worker - - Pointez le réticule sur l'établi et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'ouvrir. + + Explosives Animator - - 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*} + + Un colossal dragon noir qu'on rencontre dans l'Ender. - - 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*} + + Blaze - - 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*} + + 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. - - Ouvrir le conteneur + + Golem de neige - - É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. + + Le Golem de neige se crée en combinant des blocs de neige et une citrouille. Il lance des boules de neige sur les ennemis de son créateur. - - Un refuge de mineur se trouve à proximité : finissez de l'aménager pour passer la nuit à l'abri. + + Dragon de l'Ender - - 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 avoir une porte et des fenêtres, ainsi qu'un peu d'éclairage. + + Cube de magma - - 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*} + + 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. - - Vous avez désormais une quantité suffisante de pierres taillées pour fabriquer un four. Utilisez votre établi pour le créer. + + Golem de fer - - Utilisez{*CONTROLLER_ACTION_USE*} pour placer le four dans l'environnement, puis ouvrez-le. + + Apparaît dans les villages pour les protéger. Peut être créé à partir de blocs de fer et de citrouilles. - - 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 l'abri. + + 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. - - 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 l'abri. + + Villageois - - Un abri 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*} + + Ocelot - - Utilisez{*CONTROLLER_ACTION_USE*} pour placer la porte et{*CONTROLLER_ACTION_USE*} pour l'ouvrir et la fermer. + + Permet d'obtenir des enchantements plus puissants lorsqu'on en place autour de la table d'enchantement. - - La nuit, l'obscurité est quasi totale. Pour y voir clair dans votre abri, 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*} + + {*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 en plaçant 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. - - Vous avez terminé la première partie du didacticiel. + + {*T3*}COMMENT JOUER : DISTRIBUTEUR{*ETW*}{*B*}{*B*} +Un distributeur sert à... distribuer des objets. Pour l'actionner, vous devrez placer un interrupteur ou un 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 associé. - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour continuer le didacticiel.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + + {*T3*}COMMENT JOUER : ALCHIMIE{*ETW*}{*B*}{*B*} +La concoction de potions nécessite un alambic, à construire sur un établi. 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*} +En plaçant un ingrédient de potion dans l'emplacement du haut de l'alambic, vous obtiendrez 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 (poudre de redstone), renforcer son intensité (poudre de glowstone) ou bien en faire une potion offensive (oeil d'araignée fermenté).{*B*} +Vous pouvez aussi y incorporer de la poudre à canon pour en faire une potion volatile à 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*}Oeil 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*}Oeil d'araignée fermenté{*ETW*}{*B*}{*B*} + +Vous devrez essayer diverses combinaisons d'ingrédients pour découvrir toutes les recettes de potions à concocter. - - Voici votre inventaire. Il affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise. + + {*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. - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire. + + {*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. - - 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é. + + {*T3*}COMMENT JOUER : ÉTABLI{*ETW*}{*B*}{*B*} +Vous pouvez utiliser un établi pour confectionner des objets plus grands.{*B*}{*B*} +Placez l'établi dans votre environnement et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*B*}{*B*} +L'artisanat sur établi 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. - - 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. + + {*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 des outils, des armes, des armures et des 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 affichent 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 en cultivant.{*B*}{*B*} +Les livres enchantés s'utilisent avec l'enclume pour appliquer des enchantements à des objets. Vous avez ainsi plus de contrôle sur les enchantements obtenus.{*B*} - - Si vous déplacez le pointeur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. + + {*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. - - Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_BACK*}. + + {*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. 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. Vous pouvez aussi modifier cette option dans le 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*} + 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.{*B*}{*B*} + + {*T1*}Options de jeu{*ETW*}{*B*} + Appuyez sur la {*BACK_BUTTON*} 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*}Construction et minage possibles{*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*}Utilisation de portes et leviers possible{*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*}Ouverture de conteneurs possible{*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*}Attaque des joueurs possible{*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*}Attaque des animaux possible{*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 de 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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*}Vol possible{*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 téléporter{*ETW*}{*B*} + Cette option permet au joueur de se téléporter ou de téléporter d'autres joueurs partout dans le monde. - - Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire. + + Page suivante - - L'inventaire du mode Créatif, où figurent les objets utilisables, ainsi que tous les objets à sélectionner. + + {*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. - - {*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. + + {*T3*}COMMENT JOUER : ÉLEVER DES ANIMAUX{*ETW*}{*B*}{*B*} +Les animaux de Minecraft peuvent se reproduire 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 quête 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, tous les deux étant 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 n'est plus en mode Romance, il faut patienter cinq minutes environ pour qu'il soit apte à recommencer.{*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. - - 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. + + {*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. - - -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. + + {*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 y 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. - - 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*}. + + Vous étiez à la Minecon ? - - 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. + + Personne de chez Mojang n'a jamais vu le visage de junkboy. - - Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_BACK*}. + + Vous saviez qu'il existait un Wiki Minecraft ? - - Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire du mode Créatif. + + Ne regardez pas les bugs dans les yeux. - - -Vous êtes dans l'interface d'artisanat. Cette interface vous permet de combiner les ressources récoltées pour confectionner de nouveaux objets. + + Les creepers sont nés d'un bug d'encodage. - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} - Appuyez sur {*CONTROLLER_VK_B*}si vous savez déjà utiliser l'interface d'artisanat. + + C'est une poule ou un canard ? - - {*B*} - Appuyez sur{*CONTROLLER_VK_X*} pour afficher la description de l'objet. + + Le nouveau bureau de Mojang, il déchire ! - - {*B*} - Appuyez sur{*CONTROLLER_VK_X*} pour afficher les ingrédients nécessaires à la confection de l'objet sélectionné. + + {*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 courir. Tant que vous maintenez {*CONTROLLER_ACTION_MOVE*} vers l'avant, le personnage continuera à courir jusqu'à ce que sa durée de course soit écoulée ou que sa jauge de nourriture compte moins de{*ICON_SHANK_03*}.{*B*}{*B*} +Maintenez{*CONTROLLER_ACTION_ACTION*} pour miner et 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. - - {*B*} - Appuyez sur{*CONTROLLER_VK_X*} pour à nouveau afficher l'inventaire. + + {*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 remplira 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. - - 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. + + {*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 la teignant. Pour ce faire, dans votre inventaire, maintenez le curseur sur la teinture, puis appuyez sur{*CONTROLLER_VK_X*} lorsque le curseur se trouve au-dessus de l'élément à teindre. - - 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. + + La Minecon 2013 s'est déroulée à Orlando, Floride, États-Unis ! - - Vous pouvez utiliser un établi pour confectionner des objets plus grands. L'artisanat sur établi 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. + + La .party() était réussie ! - - 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. + + N'oubliez pas : les rumeurs tiennent plus de l'invention que de la réalité ! - - La description de l'objet sélectionné est maintenant affichée. Elle vous indique pour quels usages l'objet est conçu. + + Page précédente - - La liste des ingrédients nécessaires à la fabrication de l'objet sélectionné est maintenant affichée. + + Commerce - - 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*} + + Enclume - - Maintenant que votre établi 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. + + L'Ender - - 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*} + + Exclusion de niveaux - - 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*} + + Mode Créatif - - 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*} + + Options de l'hôte et du joueur - - 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'établi.{*CraftingTableIcon*} + + {*T3*}COMMENT JOUER : l'Ender{*ETW*}{*B*}{*B*} +L'Ender est une autre dimension du jeu, accessible 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 oeil 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 : vous devrez monter jusqu'à eux à l'aide de blocs.{*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 de l'oeuf 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. - - 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. + + {*ETB*}Bienvenue ! Comme vous l'avez peut-être déjà remarqué, votre Minecraft vient d'être gratifié d'une nouvelle mise à jour.{*B*}{*B*} +Vos amis et vous pouvez découvrir de nombreuses nouvelles fonctionnalités. Jetez un oeil à l'aperçu qui suit et allez jouer !{*B*}{*B*} +{*T1*}Nouveaux objets{*ETB*} - Argile cuite, argile teinte, bloc de charbon, botte de foin, rail déclencheur, bloc de redstone, capteur de lumière, Dropper, entonnoir, chariot de mine avec entonnoir, chariot de mine avec TNT, comparateur de redstone, plaque de pression pondérée, balise, coffre piégé, fusée de feu d'artifice, étoile de feu d'artifice, étoile du Nether, laisse, armure pour cheval, étiquette, oeuf d'apparition de cheval.{*B*}{*B*} + {*T1*}Nouvelles entités{*ETB*} - Withers, Withers squelettes, sorcières, chauve-souris, chevaux, ânes et mules.{*B*}{*B*} +{*T1*}Nouvelles fonctionnalités{*ETB*} - Apprivoisez un cheval et montez-le, fabriquez des feux d'artifice pour un spectacle unique, donnez un nom aux animaux et aux monstres avec une étiquette, créez des circuits en redstone plus complexes que jamais, et profitez de nouvelles options d'hôte pour mieux contrôler ce que peuvent faire les joueurs invités dans votre monde !{*B*}{*B*} +{*T1*}Nouveau monde didacticiel{*ETB*} - Apprenez à utiliser ces nouvelles fonctionnalités (et les anciennes !) dans le monde didacticiel. Essayez de retrouver tous les disques secrets qui y sont cachés !{*B*}{*B*} - - La fabrication de certains objets nécessite un four plutôt qu'un établi. Fabriquez un four.{*FurnaceIcon*} + + Inflige plus de dégâts qu'à mains nues. - - Placez le four que vous avez créé dans l'environnement, de préférence à l'intérieur de votre abri.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. + + 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 extraire les boules de neige. - - 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. + + Sprint - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser le four. + + Nouveautés - - 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. + + {*T3*}Modifications et ajouts{*ETW*}{*B*}{*B*} +- Nouveaux objets : argile cuite, argile teinte, bloc de charbon, botte de foin, rail déclencheur, bloc de redstone, capteur de lumière, Dropper, entonnoir, chariot de mine avec entonnoir, chariot de mine avec TNT, comparateur de redstone, plaque de pression pondérée, balise, coffre piégé, fusée de feu d'artifice, étoile de feu d'artifice, étoile du Nether, laisse, armure pour cheval, étiquette, oeuf d'apparition de cheval.{*B*} +- Nouvelles entités : Withers, Withers squelettes, sorcières, chauve-souris, chevaux et ânes.{*B*} +- Nouvelles fonctionnalités de génération de terrain : cabanes de sorcière.{*B*} +- Interface pour la balise.{*B*} +- Interface pour les chevaux.{*B*} +- Interface pour les entonnoirs.{*B*} +- Des feux d'artifice ont été ajoutés. Leur interface est accessible depuis la table d'artisanat lorsque vous disposez des ingrédients nécessaires pour fabriquer une étoile ou une fusée de feu d'artifice.{*B*} +- Un mode Aventure a été ajouté. Vous ne pouvez casser des blocs qu'avec les outils adéquats.{*B*} +- De nombreux nouveaux sons ont été ajoutés.{*B*} +- Les créatures, objets et projectiles peuvent désormais franchir les portails.{*B*} +- Vous pouvez désormais verrouiller les répéteurs en les alimentant par les côtés avec un autre répéteur.{*B*} +- Les zombies et les squelettes peuvent apparaître avec des armes et des armures.{*B*} +- Nouveaux messages en cas de mort.{*B*} +- Utilisez des étiquettes pour donner un nom aux créatures et modifier celui des conteneurs quand leur menu est ouvert.{*B*} +- La poudre d'os ne fait plus pousser instantanément les cultures. Le développement se fait désormais par étapes.{*B*} +- Il est possible de capter un signal de redstone décrivant le contenu des coffres, alambics, distributeurs et jukebox en plaçant un comparateur de redstone sur un bloc directement adjacent.{*B*} +- Les distributeurs peuvent être orientés dans toutes les directions.{*B*} +- Lorsque vous mangez une pomme dorée, vous profitez d'une santé "d'absorption" pendant quelques instants.{*B*} +- Plus vous passez de temps dans une zone, plus les monstres qui y apparaissent sont résistants.{*B*} - - 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. + + Partage des captures d'écran - - 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. + + Coffres - - 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. + + Artisanat - - Le charbon de bois peut servir de combustible et se combiner à un bâton pour créer une torche. + + Four - - 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 abri. + + Principes - - Vous êtes dans l'interface d'alchimie. Cette interface vous permet de créer des potions aux effets variés. + + Interface principale - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'alambic. + + Inventaire - - 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. + + Distributeur - - 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. + + Enchantement - - 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. + + Portail du Nether - - Ajouter un oeil 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. + + Multijoueur - - 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. + + Animaux de la ferme - - Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'alchimie. + + Élever des animaux - - Dans cette zone se trouvent un alambic, un chaudron et un coffre rempli d'articles d'alchimie. + + 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. + + deadmau5 aime Minecraft ! - - Pour distiller une potion, il faut d'abord créer une fiole d'eau. Prenez une fiole dans le coffre. + + Les hommes-cochons ne s'en prendront pas à vous, sauf si vous les attaquez. - - 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. + + Dormez dans un lit pour changer votre point d'apparition dans le jeu et accélérer le temps jusqu'à l'aube. - - Si un chaudron se vide, vous pouvez le remplir à l'aide d'un seau d'eau. + + Retournez ces boules de feu à l'envoyeur ! - - 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. + + Fabriquez des torches pour vous éclairer la nuit. Les monstres se tiendront à l'écart des zones éclairées. - - 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. + + Rendez-vous plus rapidement à bon port dans un chariot de mine propulsé sur des rails ! - - Utilisez votre potion de résistance au feu sur vous-même. + + Plantez de jeunes pousses et elles produiront des arbres. - - Maintenant que vous résistez au feu et à la lave, peut-être pourrez-vous rejoindre des lieux jusque-là inaccessibles. + + Construire un portail vous permettra de voyager jusqu'à une autre dimension : le Nether. - - Vous êtes dans l'interface d'enchantement qui vous permet d'appliquer des enchantements aux armes et armures, ainsi qu'à certains outils. + + Il est rarement judicieux de creuser juste sous vos pieds ou au-dessus de vous. - - {*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. + + La poudre d'os (obtenue depuis un os de squelette) peut servir d'engrais, et peut faire pousser les cultures instantanément ! - - 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. + + Les creepers explosent au contact ! - - Lorsqu'un objet est disposé dans l'emplacement d'enchantement, les boutons sur la droite afficheront un éventail d'enchantements aléatoires. + + Appuyez sur{*CONTROLLER_VK_B*} pour lâcher l'objet que vous tenez en main ! - - 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é. + + Utilisez un outil adapté à la tâche ! - - 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. + + Si vous ne trouvez pas de charbon pour embraser vos torches, vous pouvez toujours placer du bois dans le four afin d'obtenir du charbon de bois. - - 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. + + Manger de la viande de porc cuite régénère plus de santé que la viande de porc crue. - - Dans cette zone, vous trouverez une table d'enchantement ainsi que plusieurs objets qui vous aideront à vous familiariser avec l'enchantement. + + 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 ! - - {*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. + + Donnez un os à un loup pour l'amadouer. Ensuite, donnez-lui l'ordre de s'asseoir ou de vous suivre. - - 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. + + Depuis l'inventaire, déplacez le curseur à l'extérieur de la fenêtre et appuyez sur{*CONTROLLER_VK_A*} pour vous séparer d'un objet. - - Placer des bibliothèques autour de la table d'enchantement augmente sa puissance et permet d'accéder aux niveaux d'enchantement supérieurs. + + Un nouveau contenu téléchargeable est disponible ! Pour y accéder, utilisez le bouton Magasin Minecraft dans le menu principal. - - 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 changer 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. - - 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. + + Modifie les paramètres de gamma pour augmenter/réduire la luminosité de l'écran. - - 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. + + À 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 en même temps. - - Vous êtes à bord d'un chariot de mine. Pour descendre, pointez le curseur sur le chariot et appuyez sur{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + Utilisez une houe pour préparer des terres arables à la culture. - - {*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. + + Les araignées ne vous attaqueront pas de jour, sauf pour se défendre. - - Le chariot de mine circule sur des rails. Vous pouvez fabriquer des chariots motorisés et des chariots de transport. - {*RailIcon*} + + Creuser le sol ou le sable avec une pelle, c'est plus rapide qu'à mains nues ! - - 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 oeuvre des systèmes complexes. - {*PoweredRailIcon*} + + Prélevez de la viande de porc sur les cochons puis cuisinez-la. Mangez-la pour récupérer de la santé. - - Vous naviguez à bord d'un bateau. Pour descendre, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + Prélevez du cuir sur les vaches et utilisez-le pour confectionner des armures. - - {*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. + + Si vous avez un seau vide, remplissez-le de lait, d'eau ou de lave ! - - 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*} + + Au contact de l'eau, une source de lave produit de l'obsidienne. - - Vous maniez une canne à pêche. Appuyez{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*FishingRodIcon*} + + Les barrières superposables sont désormais disponibles dans le jeu ! - - {*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. + + Certains animaux vous suivront si vous tenez du blé dans votre main. - - 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 un animal ne peut se déplacer de plus de 20 blocs dans chaque direction, il ne disparaîtra pas. - - 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*} + + La santé des loups apprivoisés est illustrée par la position de leur queue. Donnez-leur de la viande pour les soigner. - - 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*} + + Passez du cactus au four pour obtenir du colorant vert. - - 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*} + + Reportez-vous à la rubrique Nouveautés des menus Comment jouer pour consulter les dernières notes de mise à jour du jeu. - - {*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. + + Musique par C418 ! - - 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*} + + Qui c'est, Notch ? - - Si votre partie compte d'autres joueurs, tous devront être au lit au même moment avant de pouvoir dormir. - {*ICON*}355{*/ICON*} + + Mojang a reçu plus de récompenses qu'il n'a d'employés ! - - 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. + + De vraies célébrités jouent à Minecraft ! - - {*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. + + Notch a plus d'un million d'abonnés sur Twitter ! - - 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 à l'aide de poudre de redstone. + + Les Suédois ne sont pas tous blonds. Certains sont même roux, comme Jens de Mojang ! - - 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. + + Une mise à jour du jeu sera disponible un jour ou l'autre ! - - 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*} + + Deux coffres placés côte à côte formeront un grand coffre. - - 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*} + + Si vous bâtissez des structures de laine à l'air libre, méfiez-vous : les éclairs peuvent y mettre le feu. - - Une fois alimenté, le piston s'allonge et pousse jusqu'à 12 blocs. Lorsqu'il se rétracte, le piston collant tire avec lui un bloc (tous types de blocs, ou presque). - {*ICON*}33{*/ICON*} + + Un seul seau de lave suffit à fondre 100 blocs dans un four. - - 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. + + L'instrument joué par un bloc musical dépend du matériau sur lequel il est posé. - - Un portail vers le Nether se trouve dans cette zone ! + + La lave peut mettre plusieurs minutes à disparaître TOTALEMENT lorsque le bloc source est détruit. - - {*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. + + La pierre taillée résiste aux boules de feu des Ghasts et convient donc très bien à la protection des portails. - - Pour créer un portail, placez des blocs d'obsidienne pour former un cadre large de quatre blocs et haut de cinq. Les blocs d'angle n'ont qu'une fonction esthétique. + + Les blocs susceptibles d'émettre de la lumière (torches, glowstone et citrouilles-lanternes, entre autres) peuvent faire fondre la neige et la glace. - - 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. + + Les zombies et squelettes peuvent survivre à la lumière du jour s'ils sont dans l'eau. - - 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. + + Les poules pondent un oeuf toutes les 5 à 10 minutes. - - 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. + + L'obsidienne ne peut être extraite qu'à l'aide d'une pioche en diamant. - - 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. + + Les creepers sont la source de poudre à canon la plus facilement exploitable. - - Vous êtes désormais en mode Créatif. + + 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. - - {*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. + + Les loups ne peuvent pas entrer dans le Nether. - - 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. + + Les loups n'attaquent pas les creepers. - - Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'inventaire du mode Créatif. + + Nécessaire pour miner les blocs de pierre et le minerai. - - Rejoignez l'autre extrémité de ce trou pour continuer. + + Sert d'ingrédient dans la recette du gâteau et pour les potions. - - Vous êtes arrivé à la fin du didacticiel du mode Créatif. + + Si activé, permet de produire une décharge électrique. Reste activé/désactivé jusqu'à nouvelle utilisation. - - 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. + + Produit une décharge électrique constante. Sert aussi de récepteur/transmetteur, connectée à la façade d'un bloc. Génère également une faible luminosité. - - {*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. + + Restitue 2{*ICON_SHANK_01*}. Permet de confectionner une pomme dorée. - - 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. + + Restitue 2{*ICON_SHANK_01*} et régénère la santé pendant 4 secondes. Se fabrique avec une pomme et des pépites d'or. - - 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. + + Restitue 2{*ICON_SHANK_01*}. La manger a une chance de vous empoisonner. - - Le blé passe par plusieurs stades de croissance. Il est prêt pour la moisson lorsque son aspect s'assombrit.{*ICON*}59:7{*/ICON*} + + Sert dans les circuits de redstone comme répéteur, retardateur et/ou diode. - - Les citrouilles et les pastèques nécessitent de laisser vacant un bloc adjacent pour accueillir le fruit une fois le plant arrivé à maturité. + + Sert à diriger les chariots de mine. - - 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*} + + 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. - - 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*} + + 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. - - 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*} + + Sert à produire une décharge électrique une fois actionné. Reste activé pendant environ une seconde avant de se désactiver. - - 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*} + + Sert à entreposer et à distribuer aléatoirement des objets lorsqu'on lui applique une charge de redstone. - - Le didacticiel consacré aux cultures est maintenant terminé. + + 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. - - Des animaux ont été placés en enclos dans cette zone. Vous pouvez élever des animaux pour en faire apparaître des versions miniatures. + + Restitue 2,5{*ICON_SHANK_01*}. S'obtient en cuisant un poisson cru dans un four. - - {*B*} - Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les animaux et l'élevage.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur les animaux et l'élevage. + + Restitue 1{*ICON_SHANK_01*}. - - Pour faire en sorte que les animaux se reproduisent, vous devez leur donner à manger la nourriture appropriée. Ils basculeront alors en mode "Romance". + + Restitue 1{*ICON_SHANK_01*}. - - 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 quête d'un autre animal de leur espèce, lui aussi disposé à se reproduire. + + Restitue 3{*ICON_SHANK_01*}. - - 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, puis un bébé apparaît. Le jeune animal suivra ses parents quelque temps avant de devenir adulte. + + Sert de munitions pour les arcs. - - Une fois qu'un animal n'est plus en mode Romance, il faut patienter cinq minutes environ pour qu'il soit apte à recommencer. + + Restitue 2,5{*ICON_SHANK_01*}. - - Certains animaux vous suivront si vous tenez un peu de leur nourriture dans votre main. Il vous sera alors plus facile de réunir des animaux pour qu'ils se reproduisent.{*ICON*}296{*/ICON*} + + Restitue 1{*ICON_SHANK_01*}. Peut s'utiliser jusqu'à 6 fois. - - - Vous pouvez apprivoiser un loup sauvage en lui donnant des os. Une fois apprivoisé, des coeurs apparaissent autour du loup et ce dernier vous suit et vous protège tant que vous ne lui ordonnez pas de s'asseoir. - + + Restitue 1{*ICON_SHANK_01*} ou peut être cuit dans un four. En manger a une chance de vous empoisonner. - - Le didacticiel consacré aux animaux et à l'élevage est maintenant terminé. + + Restitue 1,5{*ICON_SHANK_01*} ou peut être cuit dans un four. - - Cette zone comporte des citrouilles et des blocs pour créer un golem de neige et un golem de fer. + + Restitue 4{*ICON_SHANK_01*}. S'obtient en cuisant de la viande de porc crue dans un four. - - {*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. + + Restitue 1{*ICON_SHANK_01*} ou peut être cuit dans un four. Sert également à nourrir un ocelot pour l'apprivoiser. - - Les golems sont créés en plaçant une citrouille sur une pile de blocs. + + Restitue 3{*ICON_SHANK_01*}. S'obtient en cuisant du poulet cru dans un four. - - 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. + + Restitue 1,5{*ICON_SHANK_01*} ou peut être cuit dans un four. - - 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. + + Restitue 4{*ICON_SHANK_01*}. S'obtient en cuisant du bœuf cru dans un four. - - Les golems de fer apparaissent naturellement pour protéger les villages. Ils vous attaqueront si vous attaquez les villageois. + + Sert à véhiculer sur les rails joueurs, animaux et monstres. - - Vous devez poursuivre jusqu'à la fin de ce didacticiel avant de quitter cette zone. + + Sert de colorant pour la confection de laine bleu ciel. - - 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. + + Sert de colorant pour la confection de laine bleu cyan. - - Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Utilisez une hache pour couper les troncs d'arbre. + + Sert de colorant pour la confection de laine violette. - - 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. + + Sert de colorant pour la confection de laine vert clair. - - Certains outils sont plus efficaces que d'autres pour attaquer des ennemis. Pour attaquer, songez à vous équiper d'une épée. + + Sert de colorant pour la confection de laine grise. - - 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. + + Sert de colorant pour la confection de laine gris clair. Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produire. Vous en obtiendrez ainsi quatre par poche d'encre. - - L'outil que vous maniez est endommagé. Chaque fois que vous utilisez un outil, son état se dégrade jusqu'à ce qu'il se brise. Dans l'inventaire, la jauge colorée située sous l'objet illustre son niveau d'intégrité. + + Sert de colorant pour la confection de laine magenta. - - Maintenez{*CONTROLLER_ACTION_JUMP*} pour nager vers le haut. + + 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. - - 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. + + Sert à créer des livres et cartes. - - 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*}. + + Sert à créer une bibliothèque ou peut être enchanté. - - 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. + + Sert de colorant pour la confection de laine bleue. - - 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. + + Permet d'écouter des disques. - - Si vous déplacez le pointeur hors des limites de l'interface alors qu'un objet lui est annexé, vous pouvez jeter cet objet. + + Utiles pour confectionner des outils, armes et armures très robustes. - - 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. + + Sert de colorant pour la confection de laine orange. - - 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 abri ! + + Prélevée sur les moutons. Se teint avec les colorants. - - {*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. + + 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. - - Rappel : + + Sert de colorant pour la confection de laine noire. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Sert à acheminer des marchandises sur les rails. - - De nouvelles fonctionnalités ont été ajoutées à la dernière version du jeu, dont de nouvelles zones dans le monde didacticiel. + + Se déplace sur les rails et propulse les autres chariots de mine lorsqu'on l'alimente au charbon. - - {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour parcourir normalement le didacticiel.{*B*} - Appuyez sur{*CONTROLLER_VK_B*} pour passer le didacticiel principal. + + Sert à circuler dans l'eau plus rapidement qu'à la nage. - - 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. + + Sert de colorant pour la confection de laine verte. - - À l'extérieur de cette zone, vous trouverez des exemples de bâtiments, de terres labourées, de chariots de mine et de rails, des tables d'enchantement, des alambics, des exemples de commerce, des enclumes... et bien plus encore ! + + Sert de colorant pour la confection de laine rouge. - - Votre barre de nourriture est à un niveau où votre santé ne se régénère plus. + + Fait instantanément arriver à maturité les cultures, arbres, herbes hautes, champignons géants et fleurs. Peut aussi servir dans les recettes de colorant. - - {*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. + + Sert de colorant pour la confection de laine rose. - - Sélectionner + + Sert de colorant pour la confection de laine marron ou d'ingrédients pour les cookies, et permet de faire pousser du cacao. - - Utiliser + + Sert de colorant pour la confection de laine argentée. - - Retour + + Sert de colorant pour la confection de laine jaune. - - Quitter + + Permet d'attaquer à distance à l'aide de flèches. - - Annuler + + Confère au porteur une armure de 5. - - Annuler connexion + + Confère au porteur une armure de 3. - - Actualiser jeux + + Confère au porteur une armure de 1. - - Party Games + + Confère au porteur une armure de 5. - - Tous les jeux + + Confère au porteur une armure de 2. - - Changer catégorie + + Confère au porteur une armure de 2. - - Inventaire + + Confère au porteur une armure de 3. - - Description + + Un lingot étincelant qui sert à la confection d'outils. Créé en fondant du minerai dans le four. - - Ingrédients + + 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. - - Artisanat + + 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. - - Créer + + Confère au porteur une armure de 8. - - Prendre/Placer + + Confère au porteur une armure de 6. - - Prendre + + Confère au porteur une armure de 3. - - Prendre tout + + Confère au porteur une armure de 6. - - Prendre la moitié + + Les portes en fer ne peuvent s'ouvrir qu'au moyen de redstone, de boutons ou d'interrupteurs. - - Placer + + Confère au porteur une armure de 1. - - Placer tout + + Confère au porteur une armure de 3. - - Placer un + + Sert à travailler les blocs de bois plus vite qu'à mains nues. - - Lâcher + + Sert à faucher les blocs de terre et d'herbe pour les préparer à la culture. - - Jeter tout + + Pour activer les portes en bois, vous devez les actionner, les frapper ou utiliser de la redstone. - - Jeter un + + Confère au porteur une armure de 2. - - Permuter + + Confère au porteur une armure de 4. - - Dépl. rapide + + Confère au porteur une armure de 1. - - Vider la barre de sélection rapide + + Confère au porteur une armure de 2. - - Plus d'info + + Confère au porteur une armure de 1. - - Partager sur Facebook + + Confère au porteur une armure de 2. - - Changer de filtre + + Confère au porteur une armure de 5. - - Envoyer requête d'ami + + Sert à la création d'escaliers compacts. - - Page Bas + + Sert à contenir du ragoût de champignons. Vous conservez le bol une fois le ragoût avalé. - - Page Haut + + Sert à contenir et transporter eau, lave et lait. - - Suivant + + Sert à contenir et transporter de l'eau. - - Précédent + + Affiche les messages que les autres joueurs et vous saisissez. - - Exclure joueur + + 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. - - Teindre + + Sert à déclencher des explosions. Une fois placé, appliquez une décharge électrique ou utilisez un briquet à silex pour l'activer. - - Miner + + Sert à contenir et transporter de la lave. - - Nourrir + + Affiche la position du soleil et de la lune. - - Apprivoiser + + Indique la position de votre point de départ. - - Soigner + + Tenue en main, la carte crée l'image d'une zone explorée. Peut servir à la détermination d'un itinéraire. - - Assis + + Sert à contenir et transporter du lait. - - Suis-moi + + Sert à faire du feu et à allumer la mèche du TNT, ouvre un portail qui vient d'être fabriqué. - - Éjecter + + Sert à pêcher le poisson. - - Vider + + À activer en l'actionnant, en la frappant ou en utilisant de la redstone. La trappe fonctionne comme une porte classique, à la différence qu'elle occupe un espace d'1x1 bloc et repose à même le sol. - - Selle + + Sert de matériau de construction, transformable en de nombreux objets. Se taille dans n'importe quel type de bois. - - Placer + + Sert de matériau de construction. La gravité n'a pas d'effet sur lui, contrairement au sable normal. - - Frapper + + Sert de matériau de construction. - - Traire + + Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. - - Prélever + + Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre forment un bloc de taille normale. - - Manger + + Sert à produire de la lumière. Les torches permettent aussi de fondre la neige et la glace. - - Dormir + + Sert à la confection des torches, flèches, panneaux, échelles, barrières, ainsi que des poignées d'armes et manches d'outils. - - Se réveiller + + Permet d'entreposer des blocs et objets. Placez deux coffres côte à côte pour former un grand coffre à la capacité doublée. - - Jouer + + 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. - - Monter + + Permet de grimper et de descendre. - - Naviguer + + Permet d'accélérer le temps jusqu'à l'aube si tous les joueurs sont couchés. Change aussi le point d'apparition du joueur. La couleur des lits est toujours la même. - - Faire pousser + + Permet de créer un éventail d'objets plus riche que l'artisanat classique. - - Nager (haut) + + Permet de fondre le minerai, de créer du charbon et du verre, de cuisiner le poisson et la viande de porc. - - Ouvrir + + Hache en fer - - Changer tonalité + + Lampe de redstone - - Exploser + + Escalier en bois tropical - - Lire + + Escalier en bouleau - - Suspendre + + Commandes actuelles - - Lancer + + Crâne - - Planter + + Cacao - - Faucher + + Escalier en sapin - - Récolter + + Oeuf de Dragon - - Continuer + + Pierre blanche - - Déverrouiller le jeu complet + + Cadre de portail de l'Ender - - Supp. sauvegarde + + Escalier en grès - - Supprimer + + Fougère - - Options + + Arbuste - - Inviter des amis + + Config. - - Accepter + + Artisanat - - Tondre + + Utiliser - - Exclure le niveau + + Action - - Sélectionner skin + + Se faufiler/Voler Bas - - Allumer + + Se faufiler - - Naviguer + + Lâcher - - Installer la version complète + + Changer d'objet - - Installer la version d'évaluation + + Pause - - Installer + + Regarder - - Réinstaller + + Se déplacer/Courir - - Options + + Inventaire - - Exécuter ordre + + Sauter/Voler Haut - - Créatif + + Sauter - - Déplacer ingrédient + + Portail de l'Ender - - Déplacer combustible + + Queue de citrouille - - Outil Déplacement + + Pastèque - - Déplacer l'armure + + Vitre - - Déplacer l'arme + + Portillon - - Équiper + + Lierre - - Bander + + Queue de pastèque - - Lâcher + + Barreaux de fer - - Privilèges + + Pierres craquelées - - Parer + + Pierres taillées moussues - - Page Haut + + Briques de pierre - - Page Bas + + Champignon - - Mode Romance + + Champignon - - Boire + + Blocs de pierre taillée - - Faire pivoter + + Escalier en briques - - Masquer + + Verrue du Nether - - Vider tous les emplacements + + Escalier en Nether - - OK + + Barrière en Nether - - Annuler + + Chaudron - - Magasin Minecraft + + Alambic - - Voulez-vous vraiment quitter la partie en cours et rejoindre la nouvelle ? Toute progression non sauvegardée sera perdue. + + Table d'enchantement - - Quitter le jeu + + Brique du Nether - - Sauvegarder la partie + + Pierre taillée de poisson d'argent - - Quitter sans sauvegarder + + Pierre de poisson d'argent - - Voulez-vous vraiment supprimer toute sauvegarde préalable pour ce monde et la remplacer par la version actuelle de ce monde ? + + Escalier (brique pierre) - - Voulez-vous vraiment quitter sans sauvegarder ? Vous perdrez toute progression dans ce monde ! + + Nénuphar - - Commencer la partie + + Mycélium - - Sauv. endommagée + + Brique en pierre de poisson d'argent - - Cette sauvegarde semble corrompue ou endommagée. La supprimer ? + + Changer mode caméra - - Voulez-vous vraiment retourner au menu principal et déconnecter tous les joueurs de la partie ? Toute progression non sauvegardée sera perdue. + + 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. - - Quitter et sauvegarder + + À force de vous déplacer, de miner et d'attaquer, la barre de nourriture{*ICON_SHANK_01*} se vide progressivement. Courir et sauter après une course épuisent bien plus rapidement la barre de nourriture que la marche et les sauts classiques. - - Quitter sans sauvegarder + + 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. - - Voulez-vous vraiment retourner au menu principal ? Toute progression non sauvegardée sera perdue. + + Le bois que vous avez recueilli peut être taillé en planches. Ouvrez l'interface d'artisanat pour en fabriquer.{*PlanksIcon*} - - Voulez-vous vraiment retourner au menu principal ? Votre progression sera perdue ! + + 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*} - - Créer un monde + + 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. - - Lancer le didacticiel + + Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'artisanat. - - Didacticiel + + Pour courir, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant. Tant que vous maintenez{*CONTROLLER_ACTION_MOVE*} vers l'avant, le personnage continuera à courir jusqu'à ce que sa durée de course soit écoulée ou que sa jauge de nourriture se vide. - - Nommer votre monde + + Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer. - - Saisir le nom de votre monde + + Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder vers le haut, vers le bas et autour de vous. - - Saisir une graine pour la génération de votre monde + + 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. - - Charger monde sauvegardé + + 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. - - START pour rejoindre + + Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter. - - Quitter la partie + + 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 établi.{*CraftingTableIcon*} - - Une erreur s'est produite. Retour au menu principal. + + É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. - - Échec de la connexion + + Ouvrir le conteneur - - Connexion perdue + + 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*} - - La connexion au serveur a été interrompue. Retour au menu principal. + + 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*} - - Déconnexion par le serveur + + 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 avoir une porte et des fenêtres, ainsi qu'un peu d'éclairage. - - Vous avez été exclu de la partie + + Un refuge de mineur se trouve à proximité : finissez de l'aménager pour passer la nuit à l'abri. - - Vous avez été exclu de la partie. Motif : vol. + + 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*} - - Expiration du délai de connexion + + 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. - - Le serveur est au complet. + + Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à manier. - - L'hôte a quitté la partie. + + 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*} - - Vous ne pouvez pas rejoindre cette partie, car vous n'êtes l'ami d'aucun des joueurs présents. + + 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*} - - Vous ne pouvez pas rejoindre cette partie car l'hôte vous en a déjà exclu. + + Pointez le réticule sur l'établi et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'ouvrir. - - Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version antérieure du jeu. + + L'établi sélectionné, placez le réticule à l'emplacement voulu et utilisez{*CONTROLLER_ACTION_USE*} pour placer un établi. - - Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version supérieure du jeu. + + 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. - - 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 ! + + - - 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 ? + + - - Veuillez patienter + + - - Aucun résultat + + Config. 1 - - Filtre : + + Déplacement (en vol) - - Amis + + Joueurs/Invitation - - Mon score + + - - Général + + Config. 3 - - Entrées : + + Config. 2 - - Rang + + - - Sauvegarde du niveau en préparation + + - - Préparation des tronçons... + + - - Finalisation... + + - - Aménagement du terrain + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour commencer le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. - - Brève simulation du monde + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. - - 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 + + Bloc de poisson d'argent - - Connexion à l'hôte + + Dalle de pierre - - Téléchargement du terrain + + Une façon plus compacte de stocker le fer. - - Passage en mode hors ligne + + Bloc de fer - - Veuillez patienter pendant que l'hôte sauvegarde la partie + + Dalle de chêne - - Entrée dans l'ENDER + + Dalle de grès - - Sortie de l'ENDER + + Dalle de pierre - - Ce lit est occupé + + Une façon plus compacte de stocker l'or. - - Vous ne pouvez dormir que la nuit + + Fleur - - %s dort dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. + + Laine blanche - - Le lit de votre abri est absent ou inaccessible + + Laine orange - - Vous ne pouvez pas vous reposer : des monstres rôdent dans les parages + + Bloc d'or - - Vous dormez dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. + + Champignon - - Outils et armes + + Rose - - Armes + + Dalle de pierre taillée - - Nourriture + + Bibliothèque - - Structures + + TNT - - Armures + + Briques - - Mécanismes + + Torche - - Transports + + Obsidienne - - Décorations + + Pierre moussue - - Construction de blocs + + Dalles du Nether - - Redstone et transport + + Dalle de chêne - - Divers + + Dalle en briques de pierre - - Alchimie + + Dalle en briques - - Outils, armes et armures + + Dalle de bois tropical - - Matériaux + + Dalle de bouleau - - Déconnexion + + Dalle de sapin - - Difficulté + + Laine magenta - - Musique + + Feuilles de bouleau - - Son + + Feuilles d'épicéa - - Gamma + + Feuilles de chêne - - Sensibilité jeu + + Verre - - Sensibilité interface + + Éponge - - Pacifique + + Feuilles tropicales - - Facile + + Feuillage - - Normal + + Chêne - - Difficile + + Sapin - - 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. + + Bouleau - - Dans ce mode, des ennemis apparaissent dans l'environnement mais infligent moins de dégâts qu'en mode Normal. + + Bois d'épicéa - - Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts normaux. + + Bois de bouleau - - 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 ! + + Bois tropical - - Expiration de la version d'évaluation + + Laine - - Partie au complet + + Laine rose - - Impossible de rejoindre la partie : aucune place vacante + + Laine grise - - Saisir un message sur le panneau + + Laine gris clair - - Saisir une ligne de texte à inscrire sur votre panneau + + Laine bleu ciel - - Saisir un titre + + Laine jaune - - Saisir le titre de votre message + + Laine vert clair - - Saisir un sous-titre + + Laine bleu cyan - - Saisir le sous-titre de votre message + + Laine verte - - Saisir une description + + Laine rouge - - Saisir la description de votre message + + Laine noire - - Inventaire + + Laine violette - - Ingrédients + + Laine bleue - - Alambic + + Laine marron - - Coffre + + Torche (charbon) - - Enchantement + + Glowstone - - Four + + Sable des âmes - - Ingrédient + + Netherrack - - Combustible + + Bloc de lapis-lazuli - - Distributeur + + Minerai de lapis-lazuli - - Aucun contenu téléchargeable de ce type n'est actuellement disponible pour ce jeu. + + Portail - - %s a rejoint la partie. + + Citrouille-lanterne - - %s a quitté la partie. + + Canne à sucre - - %s s'est fait exclure de la partie. + + Argile - - Voulez-vous vraiment supprimer cette sauvegarde ? + + Cactus - - Attente d'accord + + Citrouille - - Censuré + + Barrière - - En cours de lecture : + + Juke-box - - Réinitialiser paramètres + + Une façon plus compacte de stocker le lapis lazuli. - - Voulez-vous vraiment rétablir les paramètres par défaut ? + + Trappe - - Échec du chargement + + Coffre verrouillé - - Jeu de %s + + Diode - - Partie d'un hôte inconnu + + Piston collant - - Invité déconnecté + + Piston - - Un joueur invité s'est déconnecté : tous les joueurs invités ont été exclus de la partie. + + Laine (toutes couleurs) - - Se connecter + + Arbuste mort - - Vous n'êtes pas connecté. Pour jouer, vous devez d'abord vous connecter. Vous connecter ? + + Gâteau - - Multijoueur non autorisé + + Bloc musical - - Impossible de créer la partie + + Distributeur - - Sélection auto + + Herbes hautes - - Non pack : skins stand. + + Toile - - Skins préférées + + Lit - - Niveau exclu + + Glace - - 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. + + Établi - - Exclure ce niveau ? + + Une façon plus compacte de stocker les diamants. - - Voulez-vous vraiment ajouter ce niveau à votre liste de niveaux exclus ? -Si vous sélectionnez OK, vous quitterez cette partie. + + Bloc de diamant - - Retirer de la liste d'exclusion + + Four - - Sauvegarde auto + + Terre labourée - - Sauvegarde auto : NON + + Cultures - - min + + Minerai de diamant - - Placement impossible à cet endroit ! + + Générateur de monstres - - 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. + + Feu - - Opacité interface + + Torche (char. de bois) - - Préparation de sauvegarde auto du niveau + + Poudre de redstone - - Taille interface + + Coffre - - Taille interface (écran part.) + + Escalier en chêne - - Graine + + Panneau - - Déverrouiller pack de skins + + Minerai de redstone - - 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 ? + + Porte en fer - - Débloquer le pack de textures + + Plaque de détection - - Pour utiliser ce pack de textures dans votre monde, vous devez le débloquer. -Le débloquer maintenant ? + + Neige - - Pack de textures d'essai + + Touche - - 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 ? + + Torche de redstone - - Pack de textures introuvable + + Levier - - Déverrouiller la version complète + + Rail - - Télécharger la version d'essai + + Échelle - - Télécharger la version complète + + Porte en bois - - 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 ? + + Escalier en pierre - - Obtenir la version d'essai + + Rail de détection - - Obtenir la version complète + + Rail de propulsion - - Exclure joueur + + Vous avez désormais une quantité suffisante de pierres taillées pour fabriquer un four. Utilisez votre établi pour le créer. - - Voulez-vous vraiment exclure ce joueur de la partie ? Il ne pourra plus rejoindre la partie jusqu'au redémarrage du monde. + + Canne à pêche - - Packs d'images de joueur + + Montre - - Thèmes + + Poudre glowstone - - Packs de skins + + Chariot de mine avec four - - Autoriser les amis d'amis + + Oeuf - - Vous ne pouvez pas rejoindre cette partie : elle est réservée aux seuls amis de l'hôte. + + Boussole - - Impossible de rejoindre la partie + + Poisson cru - - Sélectionnée + + Pétale de rose - - Skin sélectionnée : + + Vert de cactus - - Contenu téléchargeable corrompu + + Fèves de cacao - - Ce contenu téléchargeable est endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. + + Poisson cuit - - Votre contenu téléchargeable est partiellement endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. + + Poudre de colorant - - Votre mode de jeu a été modifié + + Poche d'encre - - Renommer votre monde + + Chariot avec coffre - - Saisir le nouveau nom de votre monde + + Boule de neige - - Mode de jeu : Survie + + Bateau - - Mode de jeu : Créatif + + Cuir - - Survie + + Chariot de mine - - Créatif + + Selle - - Créé en mode Survie + + Redstone - - Créé en mode Créatif + + Seau de lait - - Afficher les nuages + + Papier - - Que voulez-vous faire de cette sauvegarde ? + + Livre - - Renommer sauvegarde + + Boule de slime - - Sauvegarde auto. dans %d... + + Brique - - Oui + + Argile - - Non + + Canne à sucre - - Normal + + Lapis-lazuli - - Superplat + + Carte - - Lorsque cette option est activée, la partie est un jeu en ligne. + + Disque vinyle "13" - - Lorsque cette option est activée, seuls les joueurs invités peuvent participer. + + Disque vinyle "cat" - - Lorsque cette option est activée, les amis des personnes présentes sur votre liste d'amis peuvent rejoindre la partie. + + Lit - - Lorsque cette option est activée, les joueurs peuvent infliger des dégâts aux autres joueurs. Ne s'applique qu'au mode Survie. + + Répéteur de redstone - - Lorsque cette option est désactivée, les joueurs qui rejoignent la partie ne peuvent ni construire ni miner sans autorisation. + + Cookie - - Lorsque cette option est activée, le feu peut se propager aux blocs voisins inflammables. + + Disque vinyle "blocks" - - Lorsque cette option est activée, le TNT peut exploser lorsqu'il est activé. + + Disque vinyle "mellohi" - - 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. + + Disque vinyle "stal" - - Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde. + + Disque vinyle "strad" - - Lorsque cette option est activée, un monde complètement plat apparaîtra à la Surface et dans le Nether. + + Disque vinyle "chirp" - - Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur. + + Disque vinyle "far" - - Packs de skins + + Disque vinyle "mall" - - Thèmes + + Gâteau - - Images du joueur + + Colorant gris - - Objets pour avatar + + Colorant rose - - Packs de textures + + Colorant vert clair - - Packs mash-up + + Colorant violet - - {*PLAYER*} a brûlé + + Colorant bleu cyan - - {*PLAYER*} a joué avec les allumettes + + Colorant gris clair - - {*PLAYER*} a piqué une tête dans la lave + + Pétale de pissenlit - - {*PLAYER*} a suffoqué dans un mur + + Poudre d'os - - {*PLAYER*} a péri par noyade + + Os - - {*PLAYER*} a crevé de faim + + Sucre - - {*PLAYER*} a reçu une piqûre mortelle + + Colorant bleu ciel - - {*PLAYER*} a percuté le sol + + Colorant magenta - - {*PLAYER*} a chuté du bout du monde + + Colorant orange - - {*PLAYER*} a péri + + Panneau - - {*PLAYER*} a explosé + + Tunique de cuir - - {*PLAYER*} a trépassé par magie + + Plastron en fer - - {*PLAYER*} a été tué(e) par le souffle du Dragon de l'Ender. + + Plastron en diamant - - {*PLAYER*} s'est fait tuer par {*SOURCE*} + + Casque en fer - - {*PLAYER*} s'est fait tuer par {*SOURCE*} + + Casque en diamant - - {*PLAYER*} s'est fait tirer dessus par {*SOURCE*} + + Casque en or - - {*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} + + Plastron en or - - {*PLAYER*} s'est fait rouer de coups par {*SOURCE*} + + Jambières en or - - {*PLAYER*} s'est fait tuer par {*SOURCE*} + + Bottes en cuir - - Brouillard d'adminium + + Bottes en fer - - Afficher interface + + Pantalon en cuir - - Afficher main + + Jambières en fer - - Messages mortuaires + + Jambières en diamant - - Personnage animé + + Coiffe en cuir - - Animation skin perso + + Houe en pierre - - Vous ne pouvez plus miner ou utiliser d'objet + + Houe en fer - - Vous pouvez maintenant miner et utiliser des objets + + Houe en diamant - - Vous ne pouvez plus placer de blocs + + Hache en diamant - - Vous pouvez maintenant placer des blocs + + Hache en or - - Vous pouvez maintenant utiliser portes et leviers + + Houe en bois - - Vous ne pouvez plus utiliser portes et leviers + + Houe en or - - Vous pouvez maintenant utiliser des conteneurs (coffres, par exemple) + + Plastron en mailles - - Vous ne pouvez plus utiliser de conteneurs (coffres, par exemple) + + Jambières en mailles - - Vous ne pouvez plus attaquer des monstres + + Bottes en mailles - - Vous pouvez maintenant attaquer des monstres + + Porte en bois - - Vous ne pouvez plus attaquer des joueurs + + Porte en fer - - Vous pouvez maintenant attaquer des joueurs + + Casque en mailles - - Vous ne pouvez plus attaquer les animaux + + Bottes en diamant - - Vous pouvez maintenant attaquer les animaux + + Plume - - Vous êtes désormais modérateur + + Poudre à canon - - Vous n'êtes plus modérateur + + Graines de blé - - Vous pouvez maintenant voler + + Bol - - Vous ne pouvez plus voler + + Ragoût de champignons - - Vous ne vous fatiguerez plus + + Fil - - Vous pouvez maintenant vous fatiguer + + Blé - - Vous êtes maintenant invisible + + Viande de porc cuite - - Vous n'êtes plus invisible + + Peinture - - Vous êtes maintenant invulnérable + + Pomme dorée - - Vous n'êtes plus invulnérable + + Pain - - %d MSP + + Silex - - Dragon de l'Ender + + Viande de porc crue - - %s est entré(e) dans l'Ender + + Bâton - - %s a quitté l'Ender + + Seau - - {*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 abri.{*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é à nu 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*} + + Seau d'eau - - {*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 toutes parts, 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-t-il 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 faite des 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 coeur d'une étoile. Le joueur est donc, lui aussi, fait des 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*} + + Seau de lave - - {*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'oeil 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*} + + Bottes en or - - Réinitialiser le Nether + + Lingot de fer - - 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 ! + + Lingot d'or - - Réinitialiser le Nether + + Briquet à silex - - Ne pas réinitialiser le Nether + + Charbon - - Pas de tonte de champimeuh pour le moment. Vous avez atteint le nombre maximal de cochons, moutons, vaches et chats. + + Charbon de bois - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de cochons, moutons, vaches et chats. + + Diamant - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de champimeuh. + + Pomme - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de loups dans un monde. + + Arc - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de poulets dans un monde. + + Flèche - - Impossible d'utiliser l'oeuf d'apparition pour le moment. Vous avez atteint le nombre maximal de pieuvres dans un monde. + + Disque vinyle "ward" - - Impossible d'utiliser un oeuf d'apparition pour le moment. Le nombre maximal d'ennemis dans un monde a été atteint. + + 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*} - - Impossible d'utiliser un oeuf d'apparition pour le moment. Le nombre maximal de villageois dans un monde a été atteint. + + 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*} - - Le nombre maximal de tableaux/cadres dans un monde a été atteint. + + Maintenant que votre établi 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. - - Vous ne pouvez pas faire apparaître d'ennemis en mode Pacifique. + + 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. - - Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de cochons, moutons, vaches et chats en cours d'élevage a été atteint. + + 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'établi.{*CraftingTableIcon*} - - Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de loups en cours d'élevage a été atteint. + + 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*} - - Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de poulets en cours d'élevage a été atteint. + + 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*} - - Cet animal ne peut pas entrer en mode Romance. Le nombre maximal de champimeuh en cours d'élevage a été atteint. + + Vous pouvez utiliser un établi pour confectionner des objets plus grands. L'artisanat sur établi 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. - - Le nombre maximal de bateaux dans un monde a été atteint. + + 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. - - Le nombre maximal de crânes dans un monde a été atteint. + + 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. - - Inverser + + La liste des ingrédients nécessaires à la fabrication de l'objet sélectionné est maintenant affichée. - - Gaucher + + La description de l'objet sélectionné est maintenant affichée. Elle vous indique pour quels usages l'objet est conçu. - - Vous êtes mort ! + + 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. - - Réapparaître + + La fabrication de certains objets nécessite un four plutôt qu'un établi. Fabriquez un four.{*FurnaceIcon*} - - Contenu téléchargeable + + Gravier - - Changer de skin + + Minerai d'or - - Comment jouer + + Minerai de fer - - Commandes + + Lave - - Paramètres + + Sable - - Générique + + Grès - - Réinstaller le contenu + + Minerai de charbon - - Debug Settings + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser le four. - - Propagation du feu + + 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. - - Explosion de TNT + + Placez le four que vous avez créé dans l'environnement, de préférence à l'intérieur de votre abri.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. - - Joueur contre joueur + + Bois - - Joueurs de confiance + + Bois de chêne - - Privilèges d'hôte + + 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. - - Génération de structures + + {*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour à nouveau afficher l'inventaire. - - Monde superplat + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire. - - Coffre bonus + + Voici votre inventaire. Il affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise. - - Options du monde + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. - - Construction et minage possibles + + Si vous déplacez le pointeur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. - - Utilisation portes et leviers possible + + 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. - - Ouverture de conteneurs possible + + 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é. - - Attaque des joueurs possible + + Vous avez terminé la première partie du didacticiel. - - Attaque des animaux possible + + 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 l'abri. - - Modérateur + + 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 l'abri. - - Exclure joueur + + Utilisez{*CONTROLLER_ACTION_USE*} pour placer le four dans l'environnement, puis ouvrez-le. - - Vol possible + + La nuit, l'obscurité est quasi totale. Pour y voir clair dans votre abri, 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*} - - Fatigue désactivée + + Utilisez{*CONTROLLER_ACTION_USE*} pour placer la porte et{*CONTROLLER_ACTION_USE*} pour l'ouvrir et la fermer. - - Invisible + + Un abri 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*} - - Options de l'hôte + + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. - - Joueurs/Invitation + + +Vous êtes dans l'interface d'artisanat. Cette interface vous permet de combiner les ressources récoltées pour confectionner de nouveaux objets. - - Jeu en ligne + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire du mode Créatif. - - Sur invitation + + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. - - Plus d'options + + {*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour afficher les ingrédients nécessaires à la confection de l'objet sélectionné. - - Charger + + {*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour afficher la description de l'objet. - - Nouveau monde + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur {*CONTROLLER_VK_B*}si vous savez déjà utiliser l'interface d'artisanat. - - Nom du monde + + 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. - - Graine pour le générateur de monde + + {*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. - - Champ vide pour une graine aléatoire + + L'inventaire du mode Créatif, où figurent les objets utilisables, ainsi que tous les objets à sélectionner. - - Joueurs + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire. - - Rejoindre la partie + + 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*}. - - Commencer la partie + + +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. - - Aucune partie trouvée + + 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. - - Jouer + + Eau - - Classements + + Fiole - - Aide et options + + Fiole d'eau - - Jeu complet + + Oeil d'araignée - - Reprendre le jeu + + Pépite d'or - - Sauvegarder la partie + + Verrue du Nether - - Difficulté : + + Potion{*splash*}{*prefix*}{*postfix*} - - Type de partie : + + Oeil d'araignée fermenté - - Structures : + + Chaudron - - Type de niveau : + + Oeil d'Ender - - Joueur contre joueur : + + Pastèque scintillante - - Joueurs de confiance : + + Poudre de feu - - TNT : + + Crème de magma - - Propagation du feu : + + Alambic - - Réinstaller le thème + + Larme de Ghast - - Réinstaller l'image du joueur 1 + + Graines de citrouille - - Réinstaller l'image du joueur 2 + + Graines de pastèque - - Réinstaller l'article pour avatar 1 + + Poulet cru - - Réinstaller l'article pour avatar 2 + + Disque vinyle "11" - - Réinstaller l'article pour avatar 3 + + Disque vinyle "where are we now" - - Options + + Cisailles - - Audio + + Poulet cuit - - Contrôle + + Ender Pearl - - Vidéo + + Tranche de pastèque - - Interface utilisateur + + Bâton de feu - - Paramètres par défaut + + Boeuf cru - - Tremblements caméra + + Steak - - Conseils + + Chair putréfiée - - Infobulles en jeu + + Fiole d'expérience - - Écran partagé (2 joueurs) + + Planches en chêne - - Terminé + + Planches en sapin - - Modifier le message : + + Planches en bouleau - - Renseigner la légende de votre capture d'écran + + Bloc d'herbe - - Sous-titre + + Terre - - Capture d'écran du jeu + + Pierre taillée - - Modifier le message : + + Planches (bois tropical) - - Les textures, icônes et interface utilisateur classiques de Minecraft ! + + Pousse de bouleau - - Afficher tous les mondes mash-up + + Pousse d'arbre tropical - - Pas d'effet + + Adminium - - Rapidité + + Pousse d'arbre - - Lenteur + + Pousse de chêne - - Hâte + + Pousse d'épicéa - - Fatigue de mineur + + Pierre - - Force + + Cadre - - Faiblesse + + Fait apparaître {*CREATURE*} - - Santé + + Brique du Nether - - Dégâts + + Boule de feu - - Saut + + Boule de feu (ch. bois) - - Nausée + + Boule de feu charbon - - Régénération + + Crâne - - Résistance + + Crâne - - Résistance au feu + + Crâne de %s - - Respiration aquatique + + Crâne de creeper - - Invisibilité + + Crâne de squelette - - Cécité + + Crâne de wither squelette - - Vision nocturne + + Tête de zombie - - Faim + + Une façon plus compacte de stocker le charbon. Peut être utilisé comme combustible dans un four. Poison - - de rapidité + + Faim de lenteur - - de hâte + + de rapidité - - de lassitude + + Invisibilité - - de force + + Respiration aquatique - - de faiblesse + + Vision nocturne - - de santé + + Cécité de dégâts - - de saut + + de santé de nausée @@ -4970,29 +5829,38 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? de régénération - - de résistance + + de lassitude - - de résistance au feu + + de hâte - - de respiration aquatique + + de faiblesse - - d'invisibilité + + de force - - de cécité + + Résistance au feu - - de vision nocturne + + Saturation - - de faim + + de résistance - - de poison + + de saut + + + Wither + + + Santé + + + Absorption @@ -5003,29 +5871,41 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? III + + d'invisibilité + IV - - vol. + + de respiration aquatique - - banale + + de résistance au feu - - triviale + + de vision nocturne - - insipide + + de poison - - claire + + de faim - - laiteuse + + d'absorption - - diffuse + + de saturation + + + de santé + + + de cécité + + + de putréfaction naïve @@ -5033,17 +5913,17 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? mince - - étrange + + diffuse - - plate + + claire - - volumineuse + + laiteuse - - maladroite + + étrange beurrée @@ -5051,164 +5931,188 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? lisse - - suave + + maladroite - - débonnaire + + plate - - épaisse + + volumineuse - - élégante + + insipide - - fantasque + + vol. - - de charme + + banale + + + triviale fringante - - raffinée - cordiale + + de charme + + + élégante + + + fantasque + mousseuse + + rang + + + rude + + + inodore + puissante viciée - - inodore + + suave - - rang + + raffinée - - rude + + épaisse - - âcre + + débonnaire - - brute + + Rend progressivement de la santé aux joueurs, animaux et monstres affectés. - - puante + + Réduit instantanément la santé des joueurs, animaux et monstres affectés. - - Sert de base à toutes les potions. À utiliser dans un alambic pour distiller des potions. + + Rend les joueurs, animaux et monstres affectés résistants au feu, à la lave et aux attaques à distance des Blazes. 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 course, la longueur des sauts et le champ de vision des joueurs. + + âcre Réduit la vitesse de déplacement des joueurs, animaux et monstres affectés. Réduit la vitesse de course, la longueur des sauts et le champ de vision des joueurs. + + Augmente la vitesse de déplacement des joueurs, animaux et monstres affectés. Augmente la vitesse de course, 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. + + Réduit les dégâts infligés par les attaques des joueurs et des monstres affectés. - - Rend progressivement de la santé aux joueurs, animaux et monstres affectés. + + Sert de base à toutes les potions. À utiliser dans un alambic pour distiller des potions. - - Rend les joueurs, animaux et monstres affectés résistants au feu, à la lave et aux attaques à distance des Blazes. + + brute - - Réduit progressivement la santé des joueurs, animaux et monstres affectés. + + puante + + + Châtiment Tranchant - - Châtiment + + Réduit progressivement la santé des joueurs, animaux et monstres affectés. - - Fléau des arthropodes + + Dégâts d'attaque Recul - - Aura de Feu + + Fléau des arthropodes - - Protection + + Vitesse - - Protection contre le feu + + Renforts de zombies - - Chute amortie + + Puissance de saut cheval - - Protection contre les explosions + + Une fois utilisée : - - Protection contre les projectiles + + Résistance au recul - - Respiration + + Distance de suivi des créatures - - Aisance aquatique + + Santé max + + + Délicatesse Efficacité - - Délicatesse + + Aisance aquatique - - Solidité + + Fortune Butin - - Fortune + + Solidité - - Puissance + + Protection contre le feu - - Flamme + + Protection - - Repoussoir + + Aura de Feu - - Infinité + + Chute amortie - - I + + Respiration - - II + + Protection contre les projectiles - - III + + Protection contre les explosions IV @@ -5219,23 +6123,29 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? VI + + Repoussoir + VII - - VIII + + III - - IX + + Flamme - - X + + Puissance - - Peut être miné avec une pioche en fer ou supérieure pour obtenir des émeraudes. + + Infinité - - Le coffre de l'Ender fonctionne comme un coffre classique, mais les objets y étant placés sont accessibles depuis tous les coffres de l'Ender, quelle que soit la dimension. + + II + + + I S'active lorsqu'une entité passe sur un fil de détente lui étant relié. @@ -5246,51 +6156,75 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Une façon plus compacte de stocker les émeraudes. + + Le coffre de l'Ender fonctionne comme un coffre classique, mais les objets y étant placés sont accessibles depuis tous les coffres de l'Ender, quelle que soit la dimension. + + + IX + + + VIII + + + Peut être miné avec une pioche en fer ou supérieure pour obtenir des émeraudes. + + + X + + + Restitue 2{*ICON_SHANK_01*} et permet de confectionner une carotte en or. Peut être plantée dans une terre labourée. + + + Un objet de décoration. Vous pouvez y planter des fleurs, des pousses d'arbre, des cactus et des champignons. + Un mur fait en pierre. - - Permet de réparer les armes, les outils et les armures. + + Restitue 0,5{*ICON_SHANK_01*} ou peut être cuite dans un four. Peut être plantée dans une terre labourée. Produit du quartz du Nether lorsqu'on le fond dans un four. - - Un objet de décoration. + + Permet de réparer les armes, les outils et les armures. Permet de faire du commerce avec les villageois. - - Un objet de décoration. Vous pouvez y planter des fleurs, des pousses d'arbre, des cactus et des champignons. + + Un objet de décoration. - - Restitue 2{*ICON_SHANK_01*} et permet de confectionner une carotte en or. Peut être plantée dans une terre labourée. + + Restitue 4{*ICON_SHANK_01*}. - - Restitue 0,5{*ICON_SHANK_01*} ou peut être cuite dans un four. Peut être plantée dans une terre labourée. + + Restitue 1{*ICON_SHANK_01*}. La manger pourrait vous empoisonner. + + + Permet de diriger un cochon équipé d'une selle lorsque vous le chevauchez. Restitue 3{*ICON_SHANK_01*}. S'obtient en cuisant une patate dans un four. - - Restitue 1{*ICON_SHANK_01*} ou peut être cuite dans un four. Peut être plantée dans une terre labourée. La manger a une chance de vous empoisonner. - Restitue 3{*ICON_SHANK_01*}. Se fabrique avec une carotte et des pépites d'or. - - Permet de diriger un cochon équipé d'une selle lorsque vous le chevauchez. - - - Restitue 4{*ICON_SHANK_01*}. - S'utilise avec une enclume pour enchanter des armes, des outils et des armures. Se fabrique en minant du minerai de quartz du Nether. Permet de confectionner des blocs de quartz. + + Patate + + + Patate cuite + + + Carotte + Se fabrique avec de la laine. Utilisé pour la décoration. @@ -5300,14 +6234,11 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Pot de fleurs - - Carotte - - - Patate + + Tarte à la citrouille - - Patate cuite + + Livre enchanté Patate empoisonnée @@ -5318,11 +6249,11 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Carotte et bâton - - Tarte à la citrouille + + Crochet - - Livre enchanté + + Fil de détente Quartz du Nether @@ -5333,11 +6264,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Coffre de l'Ender - - Crochet - - - Fil de détente + + Mur en pierre moussue Bloc d'émeraude @@ -5345,8 +6273,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Mur en pierre - - Mur en pierre moussue + + Patates Pot de fleurs @@ -5354,8 +6282,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Carottes - - Patates + + Enclume légèrement usée Enclume @@ -5363,8 +6291,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Enclume - - Enclume légèrement usée + + Bloc de quartz Enclume très abîmée @@ -5372,8 +6300,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Minerai de quartz du Nether - - Bloc de quartz + + Escalier en quartz Bloc de quartz taillé @@ -5381,8 +6309,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Pilier en quartz - - Escalier en quartz + + Tapis rouge Tapis @@ -5390,8 +6318,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Tapis noir - - Tapis rouge + + Tapis bleu Tapis vert @@ -5399,9 +6327,6 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Tapis marron - - Tapis bleu - Tapis violet @@ -5414,18 +6339,18 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Tapis gris - - Tapis rose - Tapis vert clair - - Tapis jaune + + Tapis rose Tapis bleu ciel + + Tapis jaune + Tapis magenta @@ -5438,71 +6363,74 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Grès taillé - - Grès lisse - {*PLAYER*} est mort(e) en essayant de blesser {*SOURCE*} + + Grès lisse + {*PLAYER*} s'est fait(e) écraser par une enclume {*PLAYER*} s'est fait(e) écraser par un bloc - - Téléportation de {*PLAYER*} à {*DESTINATION*} - {*PLAYER*} vous a téléporté(e) à ses coordonnées - - {*PLAYER*} vous a téléporté(e) + + Téléportation de {*PLAYER*} à {*DESTINATION*} Épines - - Dalle de quartz + + {*PLAYER*} vous a téléporté(e) Les zones sombres apparaissent comme en plein jour, même sous l'eau. + + Dalle de quartz + Les joueurs, animaux et monstres affectés deviennent invisibles. Réparer et nommer + + Trop cher ! + Coût de l'enchantement : %d - - Trop cher ! + + Vous avez : Renommer - - Vous avez : + + {*VILLAGER_TYPE*} propose : %s Requis pour l'échange - - {*VILLAGER_TYPE*} propose : %s + + Échanger Réparer - - Échanger + + Voici l'interface de l'enclume, qui vous permettra de renommer, réparer et enchanter vos armes, armures et outils, en échange de vos niveaux d'expérience. Teindre collier - - Voici l'interface de l'enclume, qui vous permettra de renommer, réparer et enchanter vos armes, armures et outils, en échange de vos niveaux d'expérience. + + Pour travailler un objet, placez-le dans le premier emplacement sur la gauche. @@ -5511,29 +6439,23 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? - - Pour travailler un objet, placez-le dans le premier emplacement sur la gauche. - - - Lorsque le matériau requis est placé dans le deuxième emplacement (par exemple, des lingots de fer pour une épée en fer abîmée), la réparation proposée apparaît dans l'emplacement du résultat. - Vous pouvez également placer un autre objet du même type dans le deuxième emplacement pour le combiner au premier. - - Pour enchanter des objets à l'aide de l'enclume, placez un livre enchanté dans le deuxième emplacement. + + Lorsque le matériau requis est placé dans le deuxième emplacement (par exemple, des lingots de fer pour une épée en fer abîmée), la réparation proposée apparaît dans l'emplacement du résultat. Le nombre de niveaux d'expérience nécessaire s'affiche sous le résultat attendu. Si vous n'en possédez pas suffisamment, vous ne pourrez pas procéder à la réparation. - - Il est possible de renommer l'objet en modifiant son nom dans la barre de texte. + + Pour enchanter des objets à l'aide de l'enclume, placez un livre enchanté dans le deuxième emplacement. Prenez l'objet réparé pour faire disparaître les deux objets utilisés par l'enclume et consommer les niveaux d'expérience requis. - - Vous trouverez dans cette zone une enclume et un coffre avec des outils et des armes pour vous entraîner. + + Il est possible de renommer l'objet en modifiant son nom dans la barre de texte. @@ -5542,26 +6464,26 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? - - Vous pouvez utiliser une enclume pour réparer vos armes, armures et outils, les renommer ou les enchanter à l'aide de livres enchantés. + + Vous trouverez dans cette zone une enclume et un coffre avec des outils et des armes pour vous entraîner. Vous obtiendrez des livres enchantés dans les coffres des donjons ou en les enchantant vous-même à une table d'enchantement. - - L'enclume consomme vos niveaux d'expérience et s'abîme avec le temps et les utilisations. + + Vous pouvez utiliser une enclume pour réparer vos armes, armures et outils, les renommer ou les enchanter à l'aide de livres enchantés. Le type de travail à effectuer, la valeur de l'objet, le nombre d'enchantements et la quantité de travaux effectués précédemment influent sur le coût de la réparation. - - Lorsque vous renommez un objet, tous les joueurs pourront voir son nouveau nom et le coût de ses réparations diminue. + + L'enclume consomme vos niveaux d'expérience et s'abîme avec le temps et les utilisations. Dans le coffre de cette zone, vous trouverez des pioches abîmées, des matériaux, des bouteilles d'enchantement et des livres enchantés. Faites des expériences ! - - Voici l'interface de commerce, qui affiche les échanges proposés par un villageois. + + Lorsque vous renommez un objet, tous les joueurs pourront voir son nouveau nom et le coût de ses réparations diminue. @@ -5570,24 +6492,30 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? - - Tous les échanges actuellement proposés par le villageois s'affichent en haut. + + Voici l'interface de commerce, qui affiche les échanges proposés par un villageois. Les échanges s'affichent en rouge et sont indisponibles lorsque vous ne possédez pas le ou les objet(s) requis. - - La quantité et le type d'objet que vous donnez au villageois s'affichent dans les deux cases sur la gauche. + + Tous les échanges actuellement proposés par le villageois s'affichent en haut. Le nombre total d'objets requis pour l'échange s'affiche dans les deux cases sur la gauche. - - Appuyez sur{*CONTROLLER_VK_A*} pour valider l'échange avec le villageois. + + La quantité et le type d'objet que vous donnez au villageois s'affichent dans les deux cases sur la gauche. Vous trouverez dans cette zone un villageois et un coffre avec du papier qui vous permettra d'acheter des objets. + + Appuyez sur{*CONTROLLER_VK_A*} pour valider l'échange avec le villageois. + + + Vous pouvez échanger des objets de votre inventaire avec les villageois. + {*B*} @@ -5595,15 +6523,12 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? - - Vous pouvez échanger des objets de votre inventaire avec les villageois. + + Commercez plusieurs fois avec un villageois, et il proposera de nouveaux échanges ou modifiera ceux existant. Les échanges proposés par un villageois dépendent de sa profession. - - Commercez plusieurs fois avec un villageois, et il proposera de nouveaux échanges ou modifiera ceux existant. - Abusez trop d'un échange, et il sera temporairement désactivé, mais le villageois proposera toujours au moins une offre. @@ -5740,7 +6665,4 @@ Tous les coffres de l'Ender d'un même monde sont liés. Placez un objet dans un Soigner - - Recherche d'une graine pour le générateur de monde - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsPlatformSpecific.xml index c183c4a9..879c3442 100644 --- a/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/fr-FR/stringsPlatformSpecific.xml @@ -1,242 +1,243 @@  - - NOT USED + + Se connecter à "PSN" ? - - Vous pouvez utiliser l'écran tactile du système PlayStation®Vita pour naviguer dans les menus ! + + Pour les joueurs qui ne jouent pas sur le même système PlayStation®Vita que le joueur hôte, sélectionner cette option exclura le joueur de la partie, ainsi que tous les joueurs sur le même système PlayStation®Vita. Ce joueur ne pourra plus rejoindre la partie jusqu'à son redémarrage. + + - - minecraftforum consacre toute une section à PlayStation®Vita Edition. + + Touche SELECT - - Suivez @4J Studios et @Kappische sur Twitter pour rester au courant des dernières actus du jeu ! + + Cette option désactive les mises à jour des trophées 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. - - Ne regardez pas un Enderman dans les yeux ! + + Système PlayStation®Vita - - Il paraîtrait que 4J Studios aurait supprimé Herobrine de la version pour système PlayStation®Vita, mais nous ne sommes pas certains. + + Choisissez un réseau Ad Hoc pour vous connecter à d'autres systèmes PlayStation®Vita à proximité, ou "PSN" pour vous connecter avec vos amis partout dans le monde. - - Minecraft: PlayStation®Vita Edition a battu (presque) tous les records ! + + Réseau Ad Hoc - - {*T3*}COMMENT JOUER : MULTIJOUEUR{*ETW*}{*B*}{*B*} -Par défaut, Minecraft sur système PlayStation®Vita est un jeu multijoueur.{*B*}{*B*} -Lorsque vous démarrez ou rejoignez une partie en ligne, elle sera visible par 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 sera également visible par les membres de leur propre liste d'amis (si vous avez sélectionné l'option Autoriser les amis d'amis). En cours de partie, vous pouvez appuyer sur la touche SELECT pour afficher la liste des joueurs qui figurent dans la partie et vous aurez la possibilité de les exclure de la partie. + + Changer mode de réseau - - {*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 spécialement conçu pour saisir ces captures d'écran. Appuyez sur{*CONTROLLER_ACTION_CAMERA*} jusqu'à ce que s'affiche la vue de face du personnage. Ensuite, appuyez sur{*CONTROLLER_VK_Y*} pour partager.{*B*}{*B*} -Les ID en ligne ne seront pas affichés sur la capture d'écran. + + Choisir mode de réseau - - {*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 devoir l'extraire ou 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 trophées 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. 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,{*CONTROLLER_ACTION_DPAD_LEFT*} pour virer à gauche et{*CONTROLLER_ACTION_DPAD_RIGHT*} pour virer à droite. + + ID en ligne écran partagé - - 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 les touches directionnelles pour monter, descendre, virer à gauche et à droite. + + Trophées - - NOT USED + + Le jeu comporte une fonction de sauvegarde automatique. Quand l'icône ci-dessus apparaît, le jeu sauvegarde vos données. +Veuillez ne pas éteindre votre système PlayStation®Vita tant que l'icône est à l'écran. - - NOT USED + + Cette option permet à l'hôte d'activer sa capacité à voler, se rendre invisible et de désactiver la fatigue. Elle désactive la mise à jour des classements et les trophées. - - "NOT USED" + + ID en ligne : - - "NOT USED" + + Vous utilisez la version d'essai d'un pack de textures. Vous aurez accès à toutes les fonctionnalités de ce pack, mais vous ne pourrez pas sauvegarder votre progression. +Si vous tentez de sauvegarder en utilisant cette version d'essai, il vous sera proposé d'acheter la version complète. - - Inviter amis + + Patch 1.04 (mise à jour 14) - - Si vous créez, chargez ou sauvegardez un monde en mode Créatif, les mises à jour des trophées et des classements seront désactivées pour ce monde, même s'il est ensuite chargé en mode Survie. Voulez-vous vraiment continuer ? + + ID en ligne en jeu - - Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des trophées et des classements seront désactivées. Voulez-vous vraiment continuer ? + + Regardez ce que j'ai fait dans Minecraft: PlayStation®Vita Edition ! - - Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des trophées et des classements seront désactivées. + + Échec du téléchargement. Réessayez ultérieurement. - - Si vous créez, chargez ou sauvegardez un monde avec des privilèges d'hôte activés, les mises à jour des trophées 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 ? + + Impossible de se connecter au jeu à cause d'une restriction de type NAT. Veuillez vérifier vos paramètres de réseau. - - La connexion à "PSN" a été interrompue. Retour au menu principal. + + Échec de l'envoi. Réessayez ultérieurement. - - La connexion à "PSN" a été interrompue. + + Téléchargement terminé ! - - Vous jouez à la version d'évaluation de Minecraft: PlayStation®Vita Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un trophée ! -Déverrouillez le jeu complet pour profiter au mieux de Minecraft: PlayStation®Vita Edition et jouer avec vos amis partout dans le monde via "PSN". -Voulez-vous déverrouiller le jeu complet ? + + Aucune sauvegarde disponible actuellement dans la zone de transfert. +Vous pouvez envoyer une sauvegarde depuis Minecraft: PlayStation®3 Edition vers la zone de transfert, puis la télécharger sur Minecraft: PlayStation®Vita Edition. + - - Vous jouez à la version d'évaluation de Minecraft: PlayStation®Vita Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un thème ! -Déverrouillez le jeu complet pour profiter au mieux de Minecraft: PlayStation®Vita Edition et jouer avec vos amis partout dans le monde via "PSN". -Voulez-vous déverrouiller le jeu complet ? + + Sauvegarde incomplète - - Vous jouez à la version d'évaluation de Minecraft: PlayStation®Vita Edition. Vous devez disposer du jeu complet pour accepter cette invitation. -Voulez-vous déverrouiller le jeu complet ? + + Espace insuffisant pour que Minecraft: PlayStation®Vita Edition puisse sauvegarder les données. Pour libérer de l'espace, supprimez d'autres sauvegardes de Minecraft: PlayStation®Vita Edition. - - Les joueurs invités ne peuvent pas déverrouiller le jeu complet. Veuillez vous connecter à un compte Sony Entertainment Network. + + Envoi annulé - - ID en ligne + + Vous avez annulé l'envoi de la sauvegarde vers la zone de transfert. - - Alchimie + + Envoyer sauvegarde pour système PS3™/PS4™ - - Vous vous êtes déconnecté de "PSN" : retour à l'écran titre + + Envoi de données : %d - - La durée impartie de la version d'évaluation de Minecraft: PlayStation®Vita Edition est écoulée ! Pour continuer à en profiter, voulez-vous déverrouiller le jeu complet ? + + "PSN" - - Le chargement de Minecraft: PlayStation®Vita Edition a échoué : impossible de continuer. + + Sauvegarde système PS3™ - - Impossible de rejoindre la partie : l'un des joueurs au moins n'est pas autorisé à jouer en ligne à cause des restrictions de chat de leur compte Sony Entertainment Network. + + Téléchargement de données : %d - - Impossible de créer une partie en ligne : l'un des joueurs au moins n'est pas autorisé à jouer en ligne suite à des restrictions de chat sur leur compte Sony Entertainment Network. Décochez la case "Jeu en ligne" dans "Plus d'options" pour commencer une partie hors ligne. + + Sauvegarde - - Vous n'êtes pas autorisé à rejoindre cette session de jeu : les restrictions de chat ont désactivé le jeu en ligne pour votre compte Sony Entertainment Network. + + Envoi terminé ! - - Vous n'êtes pas autorisé à rejoindre cette session de jeu : les restrictions de chat ont désactivé le jeu en ligne pour le compte Sony Entertainment Network d'un des joueurs en local. Décochez la case "Jeu en ligne" dans "Plus d'options" pour commencer une partie hors ligne. + + Voulez-vous vraiment envoyer cette sauvegarde et écraser toute sauvegarde déjà présente dans la zone de transfert ? - - Vous n'êtes pas autorisé à créer cette session de jeu : les restrictions de chat ont désactivé le jeu en ligne pour le compte Sony Entertainment Network d'un des joueurs en local. Décochez la case "Jeu en ligne" dans "Plus d'options" pour commencer une partie hors ligne. + + Conversion des données - - Le jeu comporte une fonction de sauvegarde automatique. Quand l'icône ci-dessus apparaît, le jeu sauvegarde vos données. -Veuillez ne pas éteindre votre système PlayStation®Vita tant que l'icône est à l'écran. + + NOT USED - - Cette option permet à l'hôte d'activer sa capacité à voler, se rendre invisible et de désactiver la fatigue. Elle désactive la mise à jour des classements et les trophées. + + NOT USED - - ID en ligne écran partagé + + {*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 devoir l'extraire ou 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 trophées 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. 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,{*CONTROLLER_ACTION_DPAD_LEFT*} pour virer à gauche et{*CONTROLLER_ACTION_DPAD_RIGHT*} pour virer à droite. - - Trophées + + 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 les touches directionnelles pour monter, descendre, virer à gauche et à droite. - - ID en ligne : + + "NOT USED" - - ID en ligne en jeu + + Si vous créez, chargez ou sauvegardez un monde en mode Créatif, les mises à jour des trophées et des classements seront désactivées pour ce monde, même s'il est ensuite chargé en mode Survie. Voulez-vous vraiment continuer ? - - Regardez ce que j'ai fait dans Minecraft: PlayStation®Vita Edition ! + + Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des trophées et des classements seront désactivées. Voulez-vous vraiment continuer ? - - Vous utilisez la version d'essai d'un pack de textures. Vous aurez accès à toutes les fonctionnalités de ce pack, mais vous ne pourrez pas sauvegarder votre progression. -Si vous tentez de sauvegarder en utilisant cette version d'essai, il vous sera proposé d'acheter la version complète. + + "NOT USED" - - Patch 1.04 (mise à jour 14) + + Inviter amis - - Touche SELECT + + minecraftforum consacre toute une section à PlayStation®Vita Edition. - - Cette option désactive les mises à jour des trophées 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. + + Suivez @4J Studios et @Kappische sur Twitter pour rester au courant des dernières actus du jeu ! - - Se connecter à "PSN" ? + + NOT USED - - Pour les joueurs qui ne jouent pas sur le même système PlayStation®Vita que le joueur hôte, sélectionner cette option exclura le joueur de la partie, ainsi que tous les joueurs sur le même système PlayStation®Vita. Ce joueur ne pourra plus rejoindre la partie jusqu'à son redémarrage. - - + + Vous pouvez utiliser l'écran tactile du système PlayStation®Vita pour naviguer dans les menus ! - - Système PlayStation®Vita + + Ne regardez pas un Enderman dans les yeux ! - - Changer mode de réseau + + {*T3*}COMMENT JOUER : MULTIJOUEUR{*ETW*}{*B*}{*B*} +Par défaut, Minecraft sur système PlayStation®Vita est un jeu multijoueur.{*B*}{*B*} +Lorsque vous démarrez ou rejoignez une partie en ligne, elle sera visible par 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 sera également visible par les membres de leur propre liste d'amis (si vous avez sélectionné l'option Autoriser les amis d'amis). En cours de partie, vous pouvez appuyer sur la touche SELECT pour afficher la liste des joueurs qui figurent dans la partie et vous aurez la possibilité de les exclure de la partie. - - Choisir mode de réseau + + {*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 spécialement conçu pour saisir ces captures d'écran. Appuyez sur{*CONTROLLER_ACTION_CAMERA*} jusqu'à ce que s'affiche la vue de face du personnage. Ensuite, appuyez sur{*CONTROLLER_VK_Y*} pour partager.{*B*}{*B*} +Les ID en ligne ne seront pas affichés sur la capture d'écran. - - Choisissez un réseau Ad Hoc pour vous connecter à d'autres systèmes PlayStation®Vita à proximité, ou "PSN" pour vous connecter avec vos amis partout dans le monde. + + Il paraîtrait que 4J Studios aurait supprimé Herobrine de la version pour système PlayStation®Vita, mais nous ne sommes pas certains. - - Réseau Ad Hoc + + Minecraft: PlayStation®Vita Edition a battu (presque) tous les records ! - - "PSN" + + La durée impartie de la version d'évaluation de Minecraft: PlayStation®Vita Edition est écoulée ! Pour continuer à en profiter, voulez-vous déverrouiller le jeu complet ? - - Sauvegarde système PlayStation®3 - + + Le chargement de Minecraft: PlayStation®Vita Edition a échoué : impossible de continuer. - - Envoyer sauvegarde pour système PlayStation®3/PlayStation®4 + + Alchimie - - Envoi annulé + + Vous vous êtes déconnecté de "PSN" : retour à l'écran titre - - Vous avez annulé l'envoi de la sauvegarde vers la zone de transfert. + + Impossible de rejoindre la partie : l'un des joueurs au moins n'est pas autorisé à jouer en ligne à cause des restrictions de chat de leur compte Sony Entertainment Network. - - Envoi de données : %d + + Vous n'êtes pas autorisé à rejoindre cette session de jeu : les restrictions de chat ont désactivé le jeu en ligne pour le compte Sony Entertainment Network d'un des joueurs en local. Décochez la case "Jeu en ligne" dans "Plus d'options" pour commencer une partie hors ligne. - - Téléchargement de données : %d + + Vous n'êtes pas autorisé à créer cette session de jeu : les restrictions de chat ont désactivé le jeu en ligne pour le compte Sony Entertainment Network d'un des joueurs en local. Décochez la case "Jeu en ligne" dans "Plus d'options" pour commencer une partie hors ligne. - - Voulez-vous vraiment envoyer cette sauvegarde et écraser toute sauvegarde déjà présente dans la zone de transfert ? + + Impossible de créer une partie en ligne : l'un des joueurs au moins n'est pas autorisé à jouer en ligne suite à des restrictions de chat sur leur compte Sony Entertainment Network. Décochez la case "Jeu en ligne" dans "Plus d'options" pour commencer une partie hors ligne. - - Conversion des données + + Vous n'êtes pas autorisé à rejoindre cette session de jeu : les restrictions de chat ont désactivé le jeu en ligne pour votre compte Sony Entertainment Network. - - Sauvegarde + + La connexion à "PSN" a été interrompue. Retour au menu principal. - - Envoi terminé ! + + La connexion à "PSN" a été interrompue. - - Échec de l'envoi. Réessayez ultérieurement. + + Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des trophées et des classements seront désactivées. - - Téléchargement terminé ! + + Si vous créez, chargez ou sauvegardez un monde avec des privilèges d'hôte activés, les mises à jour des trophées 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 ? - - Échec du téléchargement. Réessayez ultérieurement. + + Vous jouez à la version d'évaluation de Minecraft: PlayStation®Vita Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un trophée ! +Déverrouillez le jeu complet pour profiter au mieux de Minecraft: PlayStation®Vita Edition et jouer avec vos amis partout dans le monde via "PSN". +Voulez-vous déverrouiller le jeu complet ? - - Impossible de se connecter au jeu à cause d'une restriction de type NAT. Veuillez vérifier vos paramètres de réseau. + + Les joueurs invités ne peuvent pas déverrouiller le jeu complet. Veuillez vous connecter à un compte Sony Entertainment Network. - - - Aucune sauvegarde disponible actuellement dans la zone de transfert. - Vous pouvez envoyer une sauvegarde depuis Minecraft: PlayStation®3 Edition vers la zone de transfert, puis la télécharger sur Minecraft: PlayStation®Vita Edition. - + + ID en ligne - - Sauvegarde incomplète + + Vous jouez à la version d'évaluation de Minecraft: PlayStation®Vita Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un thème ! +Déverrouillez le jeu complet pour profiter au mieux de Minecraft: PlayStation®Vita Edition et jouer avec vos amis partout dans le monde via "PSN". +Voulez-vous déverrouiller le jeu complet ? - - Espace insuffisant pour que Minecraft: PlayStation®Vita Edition puisse sauvegarder les données. Pour libérer de l'espace, supprimez d'autres sauvegardes de Minecraft: PlayStation®Vita Edition. + + Vous jouez à la version d'évaluation de Minecraft: PlayStation®Vita Edition. Vous devez disposer du jeu complet pour accepter cette invitation. +Voulez-vous déverrouiller le jeu complet ? + + + Le numéro de version du fichier de sauvegarde présent dans la zone de transfert n'est pas encore compatible avec Minecraft: PlayStation®3 Edition. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/it-IT/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/4J_stringsPlatformSpecific.xml index ce059e40..8ded317a 100644 --- a/Minecraft.Client/PSVitaMedia/loc/it-IT/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/4J_stringsPlatformSpecific.xml @@ -1,50 +1,50 @@  - - La memoria di sistema non dispone di spazio libero sufficiente per creare un salvataggio. - - - Sei tornato alla schermata iniziale perché sei uscito da "PSN" + + Salvataggio delle impostazioni sull'account Sony Entertainment Network non riuscito. - - La partita è terminata perché sei uscito da "PSN" + + Problema account Sony Entertainment Network - - Non hai effettuato l'accesso al momento. + + Si è verificato un problema durante l'accesso al tuo account Sony Entertainment Network. Per il momento non è stato possibile assegnarti il trofeo. - - Alcune funzionalità di questo gioco richiedono di aver effettuato l'accesso a "PSN", ma tu sei offline. + + Questa è la versione di prova di Minecraft: PlayStation®3 Edition. Se avessi avuto il gioco completo, avresti sbloccato un trofeo! +Sblocca il gioco completo per provare il divertimento di Minecraft: PlayStation®3 Edition e per giocare con amici di tutto il mondo su "PSN". +Vuoi sbloccare il gioco completo? - - Rete Ad Hoc fuori linea. + + Collegamento a rete Ad Hoc Il gioco ha delle funzioni che necessitano di una connessione a rete Ad Hoc, ma attualmente non sei in linea. - - Questa funzionalità richiede l'accesso a "PSN". - - - Connettiti a "PSN" - - - Collegamento a rete Ad Hoc + + Rete Ad Hoc fuori linea. Problema con trofeo - - Si è verificato un problema durante l'accesso al tuo account Sony Entertainment Network. Per il momento non è stato possibile assegnarti il trofeo. + + La partita è terminata perché sei uscito da "PSN" - - Problema account Sony Entertainment Network + + Sei tornato alla schermata iniziale perché sei uscito da "PSN" - - Salvataggio delle impostazioni sull'account Sony Entertainment Network non riuscito. + + La memoria di sistema non dispone di spazio libero sufficiente per creare un salvataggio. - - Questa è la versione di prova di Minecraft: PlayStation®3 Edition. Se avessi avuto il gioco completo, avresti sbloccato un trofeo! -Sblocca il gioco completo per provare il divertimento di Minecraft: PlayStation®3 Edition e per giocare con amici di tutto il mondo su "PSN". -Vuoi sbloccare il gioco completo? + + Non hai effettuato l'accesso al momento. + + + Connettiti a "PSN" + + + Questa funzionalità richiede l'accesso a "PSN". + + + Alcune funzionalità di questo gioco richiedono di aver effettuato l'accesso a "PSN", ma tu sei offline. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/it-IT/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/AdditionalStrings.xml index bfcfe67a..fef4874a 100644 --- a/Minecraft.Client/PSVitaMedia/loc/it-IT/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/AdditionalStrings.xml @@ -48,6 +48,12 @@ Il file delle opzioni è danneggiato e deve essere cancellato. + + Cancella file opzioni. + + + Riprova a caricare il file opzioni. + Il file di salvataggio è danneggiato e deve essere cancellato. @@ -75,6 +81,10 @@ I servizi online sono disattivati nel tuo account Sony Entertainment Network a causa delle limitazioni sui contenuti di uno dei giocatori locali. + + Le funzionalità online sono state disabilitate per la disponibilità di un aggiornamento al gioco. + + Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. @@ -84,8 +94,4 @@ Venite a giocare una partita a Minecraft: PlayStation®Vita Edition! - - Le funzionalità online sono state disabilitate per la disponibilità di un aggiornamento al gioco. - - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsGeneric.xml index ea440ffd..2983895d 100644 --- a/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsGeneric.xml @@ -1,5002 +1,5913 @@  - - Sono disponibili nuovi contenuti scaricabili! Per accedervi, seleziona il pulsante Negozio di Minecraft nel menu principale. + + Passaggio a gioco offline - - Puoi cambiare l'aspetto del tuo personaggio con il pacchetto Skin disponibile nel Negozio di Minecraft. Seleziona "Negozio di Minecraft" nel menu principale per sapere che cosa è disponibile. + + Attendi mentre l'host salva il gioco - - Modifica le impostazioni gamma per aumentare o diminuire la luminosità del gioco. + + Ingresso nel LIMITE - - Impostando la difficoltà del gioco su Relax, la salute verrà reintegrata automaticamente e di notte non usciranno mostri! + + Salvataggio giocatori - - Dai un osso a un lupo per ammansirlo. Potrai chiedergli di sedersi o di seguirti. + + Connessione all'host - - Per mettere degli oggetti nel menu Inventario, sposta il cursore dal menu e premi{*CONTROLLER_VK_A*} + + Download terreno - - Se di notte dormi in un letto, il gioco scorrerà fino all'alba, ma i giocatori in modalità multiplayer devono dormire in un letto contemporaneamente. + + Uscita dal LIMITE - - Ottieni costolette di maiale dai maiali, cucinale e mangiale per reintegrare la salute. + + Letto mancante o passaggio ostruito - - Ottieni della pelle dalle mucche e usala per costruire un'armatura. + + Non puoi riposare adesso: ci sono mostri nei paraggi - - Se hai un secchio vuoto, puoi riempirlo di latte di mucca, acqua o lava! + + Stai dormendo in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. - - Usa una zappa per preparare un appezzamento di terreno pronto per la coltura. + + Questo letto è occupato - - I ragni non attaccano durante il giorno, a meno che non vengano attaccati per primi. + + Puoi dormire solo di notte - - Se per scavare nella terra o nella sabbia usi una vanga invece delle mani farai più in fretta! + + %s dorme in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. - - Le costolette di maiale arrostite reintegrano più salute di quelle crude. + + Caricamento livello - - Costruisci delle torce per fare luce durante la notte. I mostri staranno alla larga dalle aree illuminate. + + Finalizzazione... - - Arriva prima a destinazione con un carrello da miniera e un binario! + + Creazione terreno - - Pianta degli arbusti e cresceranno fino a diventare alberi. + + Simulazione mondo - - Gli uomini-maiale non attaccano, a meno che non vengano attaccati per primi. + + Posiz. - - Puoi modificare il punto di generazione del gioco e saltare all'alba dormendo in un letto. + + Preparazione al salvataggio livello - - Rispondi all'attacco del ghast con queste palle di fuoco! + + Preparazione blocchi... - - Costruendo un portale potrai accedere a un'altra dimensione, il Sottomondo. + + Inizializzazione server - - Premi{*CONTROLLER_VK_B*} per far cadere l'oggetto che stai tenendo in mano! + + Uscita dal Sottomondo - - Usa l'attrezzo giusto per il lavoro giusto! + + Rigenerazione - - Se non trovi il carbone per le torce, puoi sempre crearne un po' utilizzando gli alberi e la fornace. + + Generazione livello - - Scavare in linea retta verso l'alto o verso il basso non è una grande idea. + + Creazione area di generazione - - La farina d'ossa (creata da un osso di scheletro) può essere utilizzata come fertilizzante e tutto crescerà in un istante! + + Caricamento area di generazione - - I creeper esplodono man mano che ti si avvicinano! + + Ingresso nel Sottomondo - - L'ossidiana si crea quando l'acqua entra in contatto con un blocco di lava. + + Attrezzi e armi - - Una volta rimosso il blocco di lava, servono alcuni minuti prima che quest'ultima scompaia COMPLETAMENTE. + + Gamma - - Il pietrisco non subisce danni dalle palle di fuoco dei ghast, quindi è utile per proteggere i portali. + + Sensibilità gioco - - I blocchi utilizzabili come fonti di luce sciolgono neve e ghiaccio. Tra questi vi sono torce, pietre brillanti e zucche di Halloween. + + Sensibilità interfaccia - - Fai attenzione quando costruisci strutture di lana all'aria aperta: i fulmini dei temporali possono incendiarle. + + Difficoltà - - Usa un secchio di lava in una fornace per fondere 100 blocchi. + + Musica - - Lo strumento suonato dal blocco nota dipende dal materiale sottostante. + + Effetti - - Zombie e scheletri possono sopravvivere alla luce del giorno, se si trovano nell'acqua. + + Relax - - Se attacchi un lupo, gli altri membri del branco si rivolteranno e ti assaliranno. Questo vale anche per gli uomini-maiali zombie. + + In questa modalità, il giocatore recupera salute col tempo e non ci sono nemici nell'ambiente. - - I lupi non possono accedere al Sottomondo. + + In questa modalità, vengono generati nemici nell'ambiente, ma infliggono danni minori rispetto alla modalità normale. - - I lupi non attaccano i creeper. + + In questa modalità, nell'ambiente vengono generati nemici che infliggono un danno standard al giocatore. - - Le galline depongono uova a intervalli di 5-10 minuti. + + Facile - - L'ossidiana si scava solo con una piccozza di diamante. + + Normale - - I creeper sono la fonte di polvere da sparo più facile da ottenere. + + Difficile - - Colloca due casse vicine per creare una cassa grande. + + Disconnesso - - Lo stato di salute dei lupi addomesticati è riconoscibile dalla posizione della coda. Dagli della carne per curarli. + + Armature - - Cuoci un cactus in una fornace per ottenere tintura verde. + + Meccanismi - - Per le ultime informazioni sugli aggiornamenti del gioco, leggi la sezione Novità nei menu Come giocare. + + Trasporto - - Il gioco ora contiene recinzioni impilabili! + + Armi - - Alcuni animali ti seguiranno se hai del grano in mano. + + Cibo - - Se un animale non può spostarsi per più di 20 blocchi in qualsiasi direzione non sparirà. + + Strutture - - Musica di C418! + + Decorazioni - - Oltre un milione di persone segue Notch su Twitter! + + Distillazione - - Non tutti gli svedesi sono biondi. Alcuni, come Jens della Mojang, hanno addirittura i capelli rossi! + + Attrezzi, armi e armature - - Presto sarà disponibile un aggiornamento per questo gioco! + + Materiali - - Chi è Notch? + + Blocchi da costruzione - - La Mojang ha più premi che dipendenti! + + Pietra rossa e trasporti - - Alcune celebrità giocano a Minecraft! + + Varie - - A deadmau5 piace Minecraft! + + Totale: - - Non guardare direttamente i bug. + + Esci senza salvare - - I creeper sono il risultato di un bug di codifica. + + Vuoi davvero tornare al menu principale? Tutti i progressi non salvati andranno persi. - - È una gallina o un'anatra? + + Vuoi davvero tornare al menu principale? I progressi andranno persi! - - Hai partecipato alla Minecon? + + Questo salvataggio è danneggiato. Vuoi eliminarlo? - - Nessuno alla Mojang ha mai visto la faccia di junkboy. + + Vuoi davvero tornare al menu principale e disconnettere tutti i giocatori? Tutti i progressi non salvati andranno persi. - - Sapevi che c'è anche una Wiki di Minecraft? + + Esci e salva - - Il nuovo ufficio di Mojang è fico! + + Crea nuovo mondo - - La Minecon 2013 si è svolta a Orlando, Florida, USA! + + Immetti un nome per il tuo mondo - - .party() è stato fantastico! + + Pianta il seme per la generazione del tuo mondo - - Invece di dare credito ai pettegolezzi, dai sempre per scontato che siano falsi! + + Carica mondo salvato - - {*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. + + Avvia tutorial - - {*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).{*B*} -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. + + Tutorial - - {*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, oppure premi{*CONTROLLER_VK_X*} per raccoglierne soltanto la metà.{*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 o{*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*} -È possibile cambiare il colore dell'armatura di pelle tingendola; puoi farlo nel menu inventario tenendo la tintura con il puntatore e premendo{*CONTROLLER_VK_X*} mentre il puntatore si trova sul pezzo che desideri tingere. + + Nomina il tuo mondo - - {*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. + + Salvataggio dannegg. - - {*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. + + OK - - {*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. + + Annulla - - {*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. + + Negozio di Minecraft - - {*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. + + Ruota - - {*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. + + Nascondi - - {*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*}Anguria 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. + + Libera tutti gli slot - - {*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*} -Posizionando 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 verranno visualizzati alcuni incantesimi e il livello di Esperienza che richiedono.{*B*} -Se hai abbastanza Esperienza per acquistare un incantesimo, la cifra apparirà in verde; in caso contrario, apparirà in rosso.{*B*}{*B*} -L'incantesimo verrà selezionato casualmente tra tutti gli incantesimi di costo uguale.{*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 per incantesimi scaturiranno dei simboli arcani.{*B*}{*B*} -Tutti gli ingredienti per un Tavolo per incantesimi possono essere trovati nei villaggi o ottenuti scavando e coltivando.{*B*}{*B*} -I Libri incantati vengono usati sull'incudine per applicare incantesimi agli oggetti. Ciò ti dà più controllo su quali incantesimi applicare ai tuoi oggetti.{*B*} + + Vuoi davvero uscire dalla partita attuale e accedere a quella nuova? Tutti i progressi non salvati andranno persi. - - {*T3*}COME GIOCARE: ALLEVARE GLI ANIMALI{*ETW*}{*B*}{*B*} -Se vuoi che gli animali rimangano nel solito posto, crea una zona recintata non più grande di 20x20 blocchi e sistema gli animali là dentro. In questo modo sarai sicuro di ritrovarli dove li hai lasciati. + + Vuoi davvero sovrascrivere qualsiasi salvataggio precedente di questo mondo con la versione del mondo corrente? - - {*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 a un maiale, 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. + + Vuoi davvero uscire senza salvare? Perderai tutti i progressi in questo mondo! - - {*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. + + Avvia gioco - - {*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. + + Esci dal gioco - - {*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 o 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, verrà 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*} - - {*T2*}Ripristina sottomondo{*ETW*}{*B*} - Se l'opzione è attivata, il Sottomondo viene rigenerato. Utile se hai un vecchio salvataggio nel quale le fortezze del Sottomondo non erano presenti.{*B*}{*B*} - -{*T1*}Opzioni di gioco{*ETW*}{*B*} -Durante la partita, premi {*BACK_BUTTON*} per aprire il menu di gioco, dove potrai accedere a diverse opzioni.{*B*}{*B*} - - {*T2*}Opzioni dell'host{*ETW*}{*B*} - L'host e tutti i giocatori identificati come moderatori possono accedere al menu "Opzioni host" e 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*} -Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Quando l'opzione è attivata, 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. {*B*}{*B*} - - {*T2*}Può usare porte e interruttori{*ETW*}{*B*} -Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di usare né le porte né gli interruttori. {*B*}{*B*} - - {*T2*}Può aprire contenitori{*ETW*}{*B*} -Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di aprire i contenitori, come le casse. {*B*}{*B*} - - {*T2*}Può attaccare i giocatori{*ETW*}{*B*} -Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, impedisce al giocatore di causare danni agli altri utenti. {*B*}{*B*} - - {*T2*}Può attaccare animali{*ETW*}{*B*} -Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di infliggere danni agli animali. {*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*} - {*KICK_PLAYER_DESCRIPTION*}{*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 scendere 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ò teletrasportarsi{*ETW*}{*B*} - Permette al giocatore di muovere se stesso o altri giocatori presso altri giocatori nel mondo. + + Salva gioco - - Pagina successiva + + Esci senza salvare - - Pagina precedente + + Premi START per accedere - - Basi + + Evviva, hai ottenuto un'immagine del giocatore con Steve di Minecraft! - - Interfaccia + + Evviva, hai ottenuto un'immagine del giocatore con un creeper! - - Inventario + + Sblocca gioco completo - - Casse + + Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti a una versione più nuova del gioco. - - Crafting + + Nuovo mondo - - Fornace + + Premio sbloccato! - - Dispenser + + Stai giocando con la versione di prova, ma serve la versione completa per salvare i progressi. +Vuoi sbloccare il gioco completo ora? - - Allevare gli animali + + Amici - - Riproduzione animali + + Punt. personale - - Distillazione + + Generale - - Incantesimi + + Attendi - - Sottoportale + + Nessun risultato - - Multiplayer + + Filtro: - - Condivisione di screenshot + + Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti ha una versione più vecchia del gioco. - - Esclusione di livelli + + Connessione persa - - Modalità Creativa + + Connessione al server persa. Tornerai al menu principale. - - Opzioni dell'host e del giocatore + + Disconnesso dal server - - Commercio + + Uscita dal gioco - - Incudine + + Si è verificato un errore. Tornerai al menu principale. - - Limite + + Connessione non riuscita - - {*T3*}COME GIOCARE: IL LIMITE{*ETW*}{*B*}{*B*} -Il Limite è un'altra dimensione del gioco che può essere raggiunta tramite il Portale del Limite. Puoi trovare il portale in una fortezza nelle profondità del Sopramondo.{*B*} -Per attivare il portale è necessario disporre l'Occhio di Ender in un qualunque Telaio di un portale del Limite vuoto.{*B*} -Una volta attivo, puoi attraversare il portale per raggiungere il Limite.{*B*}{*B*} -Nel Limite incontrerai il Drago di Ender, nemico forte e fiero, oltre agli Enderman, sarà quindi necessario prepararsi a dovere prima di intraprendere il viaggio!{*B*}{*B*} -Scoprirai che ci sono i Cristalli di Ender sulle punte di ossidiana che il Drago di Ender usa per rigenerarsi, il primo passo sarà quindi distruggerli uno per uno.{*B*} -Puoi colpire i primi con le frecce, gli altri invece sono protetti da una gabbia di metallo, dovrai quindi avvicinarti.{*B*}{*B*} -Nel frattempo il Drago di Ender ti attaccherà in volo e ti lancerà palle di acido!{*B*} -Se ti avvicini all'uovo al centro delle punte, il Drago di Ender scenderà in picchiata per affrontarti e sarà quello il momento giusto per la tua controffensiva!{*B*} -Evita l'acido, mira agli occhi del Drago. Porta degli amici con te, se possibile, per affrontare insieme la battaglia e vincerla!{*B*}{*B*} -Una volta giunti nel Limite, i tuoi amici potranno vedere l'ubicazione del Portale all’interno della fortezza sulla loro mappa, e raggiungerti facilmente. + + Sei stato espulso dalla partita - - Scatto + + L'host è uscito dal gioco. - - Novità + + Non puoi accedere a questa partita perché non hai amici tra i partecipanti. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Modifiche e aggiunte{*ETW*}{*B*}{*B*} -- Aggiungi nuovi oggetti - Smeraldo, minerale di smeraldo, blocco di smeraldo, cassa dell'Ender, gancio dell'allarme, mela d'oro incantata, incudine, vaso di fiori, muri di ciottoli, muri di ciottoli con muschio, dipinto avvizzito, patata, patata cotta, patata velenosa, carota, carota d'oro, carota su bastone, - torta di zucca, pozione di visione notturna, pozione di invisibilità, quarzo del Sottomondo, minerale di quarzo del Sottomondo, blocco di quarzo, lastra di quarzo, scala di quarzo, blocco di quarzo cesellato, blocco di quarzo a pilastro, libro incantato, moquette.{*B*} -- Aggiunte nuove ricette per arenaria liscia e arenaria cesellata.{*B*} -- Aggiunti nuovi Mob – Villici Zombie.{*B*} -- Nuove funzioni di generazione del terreno – Templi del deserto, villaggi del deserto, templi della giungla.{*B*} -- Aggiunto il commercio con i villici.{*B*} -- Aggiunta l’interfaccia incudine.{*B*} -- È possibile tingere le armature.{*B*} -- È possibile tingere i collari dei lupi.{*B*} -- Si può controllare un maiale cavalcato con una carota su un bastone.{*B*} -- Contenuto delle casse bonus migliorato con più oggetti.{*B*} -- Cambiato il posizionamento dei mezzi blocchi e di altri blocchi sui mezzi blocchi.{*B*} -- Cambiato il posizionamento delle scale invertite e delle lastre.{*B*} -- Aggiunte diverse professioni dei villici.{*B*} -- I villici generati da un uovo generazione adotteranno una professione a caso.{*B*} -- Aggiunto il posizionamento laterale dei tronchi.{*B*} -- Le fornaci possono usare attrezzi di legno come combustibile.{*B*} -- I pannelli di ghiaccio e di vetro possono essere raccolti con strumenti incantati da Tocco di Seta.{*B*} -- Pulsanti e piastre a pressione di legno possono essere attivati con le frecce.{*B*} -- I Mob del Sottomondo possono essere generati nel Sopramondo dai Portali.{*B*} -- Creeper e ragni sono aggressivi verso l’ultimo giocatore che li ha colpiti.{*B*} -- I Mob in modalità Creativa diventano neutrali dopo un breve lassi di tempo.{*B*} -- Eliminato l’Atterramento quando si affoga.{*B*} -- Le porte distrutte dagli zombie mostrano i danni.{*B*} -- Il ghiaccio si scioglie nel Sottomondo.{*B*} -- I calderoni si riempiono d’acqua sotto la pioggia.{*B*} -- I pistoni ci mettono il doppio a migliorarsi.{*B*} -- I maiali rilasciano selle quando vengono uccisi (se ne possiedono una).{*B*} -- Il colore del cielo nel Limite è cambiato.{*B*} -- Possono essere piazzate corde (per ganci allarmi).{*B*} -- La pioggia passa tra le foglie.{*B*} -- Le leve possono essere piazzate sotto i blocchi.{*B*} -- La TNT infligge un danno variabile a seconda del livello di difficoltà.{*B*} -- Ricetta dei libri cambiata.{*B*} -- Le barche distruggono le ninfee, anziché il contrario.{*B*} -- I maiali rilasciano più costolette.{*B*} -- Gli slime appaiono meno nei mondi superpiatti.{*B*} -- Il danno dei creeper varia a seconda del livello di difficoltà, più atterramenti.{*B*} -- Gli Endermen ora aprono le fauci.{*B*} -- Aggiunto il teletrasporto per i giocatori (mediante il menu {*BACK_BUTTON*} nel gioco).{*B*} -- Aggiunte nuove opzioni host per il volo, l’invisibilità e l’invulnerabilità dei giocatori remoti.{*B*} -- Aggiunti nuovi tutorial al mondo Tutorial per i nuovi oggetti e le nuove funzioni.{*B*} -- Modificate le posizioni delle casse dei dischi musicali nel mondo Tutorial.{*B*} - + + Non puoi accedere a questa partita perché sei stato espulso dall'host in precedenza. - - {*ETB*}Bentornato! Forse non lo sai, ma Minecraft è appena stato aggiornato.{*B*}{*B*} -Ci sono tante nuove funzionalità per te e i tuoi amici, ecco un assaggio. Dai un'occhiata e preparati a divertirti!{*B*}{*B*} -{*T1*}Nuovi oggetti{*ETB*} - Smeraldo, minerale di smeraldo, blocco di smeraldo, cassa dell'Ender, gancio dell'allarme, mela d'oro incantata, incudine, vaso di fiori, muri di ciottoli, muri di ciottoli con muschio, dipinto avvizzito, patata, patata cotta, patata velenosa, carota, carota d'oro, carota su bastone, - torta di zucca, pozione di visione notturna, pozione di invisibilità, quarzo del Sottomondo, minerale di quarzo del Sottomondo, blocco di quarzo, lastra di quarzo, scala di quarzo, blocco di quarzo cesellato, blocco di quarzo a pilastro, libro incantato, moquette .{*B*}{*B*} -{*T1*}Nuovi Mob{*ETB*} - Abitanti zombie.{*B*}{*B*} -{*T1*}Nuove funzioni{*ETB*} - Commercia con gli abitanti, ripara o incanta armi e strumenti con l'incudine, immagazzina oggetti in una cassa dell'Ender, controlla un maiale guidandolo con una carota su un bastone!{*B*}{*B*} -{*T1*}Nuovi mini-tutorial{*ETB*} – Impara a usare le nuove funzioni nel mondo Tutorial!{*B*}{*B*} -{*T1*}Nuove sorprese{*ETB*} – Abbiamo spostato tutti i cd musicali segreti nel mondo Tutorial. Vediamo se riesci a trovarli di nuovo!{*B*}{*B*} + + Sei stato espulso dalla partita per volo. - - Infligge un danno maggiore della mano. + + Timeout del tentativo di connessione - - Serve per scavare terra, erba, sabbia, ghiaia e neve più in fretta che a mano. Le pale servono per scavare palle di neve. + + Server pieno - - Serve per scavare blocchi di pietra e minerali. + + 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! - - Si usa per abbattere blocchi di legno più in fretta che a mano. + + Temi - - Si usa per arare blocchi di terra ed erba e prepararli per il raccolto. + + Pacchetti Skin - - Le porte di legno si attivano usandole, colpendole o con una pietra rossa. + + Accetta amici di amici - - Le porte di ferro si aprono solo con pietra rossa, pulsanti o interruttori. + + Espelli giocatore - - NON USATA + + Sei sicuro di voler espellere questo giocatore dalla partita? Non potrà accedere finché non riavvii il mondo. - - NON USATA + + Pacchetti Immagini del giocatore - - NON USATA + + Non puoi unirti a questa partita. L'host ha limitato l'accesso ai propri amici. - - NON USATA + + Contenuto scaricabile danneggiato - - Dà all'utilizzatore Armatura 1 se indossato. + + Questo contenuto scaricabile è danneggiato e non può essere usato. Cancellalo e installalo nuovamente dal menu del Negozio di Minecraft. - - Dà all'utilizzatore Armatura 3 se indossato. + + Parte del contenuto scaricabile è danneggiato e non può essere usato. Cancella il contenuto e installalo nuovamente dal menu del Negozio di Minecraft. - - Dà all'utilizzatore Armatura 2 se indossato. + + Impossibile accedere alla partita - - Dà all'utilizzatore Armatura 1 se indossato. + + Selezionato - - Dà all'utilizzatore Armatura 2 se indossato. + + Skin selezionata: - - Dà all'utilizzatore Armatura 5 se indossato. + + Ottieni la versione completa - - Dà all'utilizzatore Armatura 4 se indossato. + + Sblocca pacchetto texture - - Dà all'utilizzatore Armatura 1 se indossato. + + Per usare questo pacchetto texture nel tuo mondo, devi prima sbloccarlo. +Vuoi sbloccarlo ora? - - Dà all'utilizzatore Armatura 2 se indossato. + + Versione di prova pacchetto texture - - Dà all'utilizzatore Armatura 6 se indossato. + + Seme - - Dà all'utilizzatore Armatura 5 se indossato. + + Sblocca pacchetto Skin - - Dà all'utilizzatore Armatura 2 se indossato. + + Per usare la skin che hai selezionato, devi sbloccare questo pacchetto Skin. +Vuoi sbloccare il pacchetto Skin ora? - - Dà all'utilizzatore Armatura 2 se indossato. + + 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? - - Dà all'utilizzatore Armatura 5 se indossato. + + Scarica versione completa - - Dà all'utilizzatore Armatura 3 se indossato. + + Questo mondo usa un pacchetto texture o mash-up che non hai! +Vuoi installare uno dei due pacchetti ora? - - Dà all'utilizzatore Armatura 1 se indossato. + + Ottieni la versione di prova - - Dà all'utilizzatore Armatura 3 se indossato. + + Nessun pacchetto texture - - Dà all'utilizzatore Armatura 8 se indossato. + + Sblocca versione completa - - Dà all'utilizzatore Armatura 6 se indossato. + + Scarica versione di prova - - Dà all'utilizzatore Armatura 3 se indossato. + + La modalità di gioco è cambiata - - Lingotto lucente utilizzabile per creare oggetti di questo materiale. Si crea fondendo minerali nella fornace. + + Se attivato, i giocatori potranno unirsi solo su invito. - - Consente di trasformare lingotti, gemme o tinture in blocchi collocabili. Si può usare come blocco da costruzione costoso o come magazzino compatto per minerali. + + Se attivato, gli amici delle persone nell'elenco di amici potranno unirsi alla partita. - - 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. + + Se l'opzione è abilitata, è possibile infliggere danni agli altri giocatori. Efficace solo in modalità Sopravvivenza. - - Si usa per le scale compatte. + + Normale - - Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + + Superpiatto - - Usato per fare scale lunghe. Due lastre piazzate una sull'altra creano un normale blocco a doppia lastra. + + Se attivato, il gioco sarà un gioco online. - - La torcia si usa per fare luce, nonché per sciogliere neve e ghiaccio. + + Se l'opzione è disabilitata, i giocatori che si uniscono alla partita non possono costruire o scavare fino a quando non vengono autorizzati. - - Si usano come materiali da costruzione e per creare diversi oggetti. Si possono creare da qualsiasi forma di legno. + + Se l'opzione è abilitata, nel mondo si genereranno strutture come Villaggi e Fortezze. - - Si usa come materiale da costruzione. Non subisce la gravità come la sabbia normale. + + Se l'opzione è abilitata, verrà generato un mondo completamente piatto tanto nel Sopramondo che nel Sottomondo. - - Si usa come materiale da costruzione. + + Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. - - Si usa per creare torce, frecce, cartelli, scale a pioli, recinzioni e come maniglia per attrezzi e armi. + + Se l'opzione è abilitata, il fuoco può propagarsi ai blocchi infiammabili vicini. - - 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. + + Se l'opzione è abilitata, il TNT esplode quando viene attivato. - - Consente di creare una selezione di oggetti più vasta rispetto alla normale schermata crafting. + + Quando è attivato, il Sottomondo viene rigenerato. È molto utile nel caso tu abbia un vecchio salvataggio nel quale non sono presenti Fortezze del Sottomondo. - - Consente di fondere minerali, creare antracite e vetro e cuocere pesce e costolette di maiale. + + No - - Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. + + Modalità: Creativa - - 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. + + Sopravvivenza - - Si usa per salire in verticale. + + Creativa - - Si attiva usandola, colpendola o con una pietra rossa. Funziona come una porta normale, ma è un blocco di 1x1 appiattito sul terreno. + + Rinomina il mondo - - Mostra il testo scritto da te o da altri giocatori. + + Inserisci il nuovo nome del tuo mondo - - Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. + + Modalità: Sopravvivenza - - Si usa per provocare esplosioni. Una volta collocato, si attiva accendendolo con un oggetto acciarino e pietra focaia, o con una scarica elettrica. + + In modalità Sopravvivenza - - Serve per conservare la zuppa di funghi. Una volta mangiata, la ciotola rimane. + + Rinomina salvataggio - - Si usa per contenere e trasportare acqua, lava e latte. + + Autosalvataggio tra %d... - - Si usa per contenere e trasportare acqua. + + - - Si usa per contenere e trasportare lava. + + In modalità Creativa - - Si usa per contenere e trasportare latte. + + Renderizza nuvole - - Si usa per creare il fuoco, accendere TNT e aprire un portale dopo averlo costruito. + + Cosa vuoi fare con questo salvataggio? - - Si usa per pescare. + + Dimen. interfaccia (schermo div.) - - Mostra la posizione del sole e della luna. + + Ingrediente - - Indica il punto iniziale. + + Combustibile - - Mentre la tieni in mano, crea un'immagine di un'area esplorata. Può essere utile per orientarti. + + Dispenser - - Consente attacchi a distanza con le frecce. + + Cassa - - Si usa come munizione per l'arco. + + Incantesimo - - Reintegra 2.5{*ICON_SHANK_01*}. + + Fornace - - Reintegra 1{*ICON_SHANK_01*}. Utilizzabile 6 volte. + + Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. - - Reintegra 1{*ICON_SHANK_01*}. + + Vuoi davvero eliminare questo salvataggio? - - Reintegra 1{*ICON_SHANK_01*}. + + Da approvare - - Reintegra 3{*ICON_SHANK_01*}. + + Censurato - - Reintegra 1{*ICON_SHANK_01*}, ma può farti star male. Cucinare in una fornace. + + %s si unisce alla partita. - - Reintegra 3{*ICON_SHANK_01*}. Si ottiene cucinando pollo crudo in una fornace. + + %s ha abbandonato la partita. - - Reintegra 1.5{*ICON_SHANK_01*}. Cucinare in una fornace. + + %s è stato espulso dal gioco. - - Reintegra 4{*ICON_SHANK_01*}. Si ottiene cucinando carne cruda in una fornace. + + Banco di distillazione - - Reintegra 1.5{*ICON_SHANK_01*}. Cucinare in una fornace. + + Inserisci testo cartello - - Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando una costoletta di maiale in una fornace. + + Inserisci il testo per il cartello - - Reintegra 1{*ICON_SHANK_01*} o cuocere in una fornace. Può essere dato a un ocelot per ammansirlo. + + Inserisci titolo - - Reintegra 2.5{*ICON_SHANK_01*}. Si crea cucinando pesce crudo in una fornace. + + Timeout prova - - Reintegra 2{*ICON_SHANK_01*} e si può usare per creare una mela d'oro. + + Partita al completo - - Reintegra 2{*ICON_SHANK_01*} e rigenera la salute per 4 secondi. Si crea con una mela e pepite d'oro. + + Impossibile accedere: nessuno spazio rimasto - - Reintegra 2{*ICON_SHANK_01*}, ma può farti star male. + + Inserisci un titolo per il tuo messaggio - - Si usa nel ricettario di torte, come ingrediente per fare pozioni. + + Inserisci una descrizione per il tuo messaggio - - Accendila o spegnila per generare una scarica elettrica. Rimane accesa o spenta finché non la premi di nuovo. + + Inventario - - 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. + + Ingredienti - - Si usa nei circuiti a pietre rosse come ripetitore, ritardante e/o diodo. + + Inserisci didascalia - - Premilo per generare una scarica elettrica. Rimane attivo per circa un secondo prima di spegnersi di nuovo. + + Inserisci una didascalia per il tuo messaggio - - Si usa per conservare e distribuire oggetti in ordine casuale quando riceve una carica di pietra rossa. + + Inserisci descrizione - - Quando si attiva, suona una nota. Colpiscilo per cambiare tonalità. Mettilo sopra blocchi diversi per cambiare il tipo di strumento. + + In ascolto: - - Si usano per guidare i carrelli da miniera. + + Vuoi davvero aggiungere questo livello all'elenco dei livelli esclusi? +Selezionando OK, uscirai da questa partita. - - Accesi, fanno accelerare i carrelli da miniera che ci passano sopra. Spenti, fanno fermare i carrelli da miniera. + + Rimuovi da elenco esclusi - - Funzionano come la piastra a pressione (inviano un segnale pietra rossa mentre sono in funzione) ma sono attivabili solo dal carrello da miniera. + + Autosalvataggio - - Trasporta te, un animale o un mostro sui binari. + + Livello escluso - - Si usa per trasportare merci sui binari. + + 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. - - Si muove sui binari e spinge altri carrelli da miniera se ci metti del carbone. + + Escludere questo livello? - - Si usa per spostarsi sull'acqua più velocemente che a nuoto. + + Intervallo autosalvataggio: NO - - Si ottiene dalle pecore e si può colorare con le tinture. + + Opacità interfaccia - - Si usa come materiale da costruzione e si può colorare con le tinture. Ricetta sconsigliata, in quanto la lana è facilmente ottenibile dalle pecore. + + Preparazione salvataggio livello - - Si usa come tintura per creare lana nera. + + Dimensioni dell'interfaccia - - Si usa come tintura per creare lana verde. + + Min - - Si usano come tintura per creare lana marrone, come ingrediente nei biscotti, o per coltivare cacao. + + Impossibile collocare qui! - - Si usa come tintura per creare lana argento. + + Non è consentito collocare la lava accanto al punto di generazione del livello: i giocatori appena generati potrebbero morire immediatamente. - - Si usa come tintura per creare lana gialla. + + Skin preferite - - Si usa come tintura per creare lana rossa. + + Partita di %s - - Si usa per far crescere immediatamente colture, alberi, erba alta, funghi giganti e fiori e si impiega nelle ricette delle tinture. + + Partita con host sconosciuto - - Si usa come tintura per creare lana rosa. + + Ospite disconnesso - - Si usa come tintura per creare lana arancione. + + Resetta impostazioni - - Si usa come tintura per creare lana verde lime. + + Vuoi davvero ripristinare le impostazioni predefinite? - - Si usa come tintura per creare lana grigia. + + Errore caricamento - - 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.) + + Un giocatore ospite si è disconnesso, rimuovendo tutti i giocatori ospite dal gioco. - - Si usa come tintura per creare lana azzurra. + + Creazione di partita non riuscita - - Si usa come tintura per creare lana turchese. + + Selezionato automaticamente - - Si usa come tintura per creare lana viola. + + No pacchetto: skin predef. - - Si usa come tintura per creare lana magenta. + + Accedi - - Si usa come tintura per creare lana blu. + + Non hai effettuato l'accesso. Per partecipare a questo gioco, devi prima accedere. Vuoi accedere ora? - - Suona dischi. + + Multiplayer non consentito - - Utilizzabile per creare attrezzi, armi o armature molto robusti. + + Bevi - - Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. + + In quest'area è stata allestita una fattoria. Coltivare la terra ti permette di avere una fonte rinnovabile di cibo e altri oggetti. - - Si usa per creare libri e mappe. + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla coltivazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona. - - Si usa per creare una libreria o viene incantato per fare Libri incantati. + + Grano, Zucche e Angurie 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. - - Permette la creazione di incantesimi più potenti quando viene piazzato intorno al Tavolo per incantesimi. + + Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia dell'inventario in modalità Creativa. - - Si usa come decorazione. + + Raggiungi l'altra estremità di questo fosso per continuare. - - Si scava con una piccozza di ferro o migliore, poi si fonde nella fornace per produrre lingotti d'oro. + + Hai completato il tutorial della modalità Creativa. - - Si scava con una piccozza di pietra o migliore, poi si fonde nella fornace per produrre lingotti di ferro. + + Prima di poter procedere alla semina, devi lavorare i blocchi di terra con la Zappa per trasformarli in Zolle. Con una fonte d'aqua nei pressi (che tenga le zolle umide), e illuminando l'area, i raccolti cresceranno più rapidamente. - - Si scava con una piccozza per ottenere carbone. + + 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*} - - Si scava con una piccozza di pietra o migliore per ottenere lapislazzuli. + + 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*} - - Si scava con una piccozza di ferro o migliore per ottenere diamanti. + + 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*} - - Si scava con una piccozza di ferro o migliore per ottenere polvere di pietra rossa. + + 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*} - - Si scava con una piccozza per ottenere ciottoli. + + Zucche e Angurie 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. - - Si ottiene con la pala. Si può usare per la costruzione. + + 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*} - - Si può piantare per far crescere un albero. + + 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. - - Non si rompe. + + 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. - - Dà fuoco a qualsiasi cosa tocca. Si può raccogliere in un secchio. + + In quest'area c'è un Portale per il Sottomondo! - - Si ottiene con la pala. Si fonde in vetro usando la fornace. Subisce la gravità se sotto non ci sono altri blocchi. + + {*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. - - Si ottiene con la pala. A volte produce la selce. Subisce la gravità se sotto non ci sono altri blocchi. + + + La polvere di pietrarossa si ottiene estraendo il minerale di pietrarossa con una piccozza di ferro, diamante o oro. Puoi usarla per migliorare fino a 15 blocchi e può salire o scendere di un blocco in altezza. + {*ICON*}331{*/ICON*} + - - Si abbatte con l'ascia e si può tagliare in assi o usare come combustibile. + + + I ripetitori a pietrarossa si usano per alimentare a distanza o per inserire un ritardo in un circuito. + {*ICON*}356{*/ICON*} + - - Si crea nella fornace fondendo la sabbia. Si può usare per la costruzione, ma si rompe se cerchi di prenderlo. + + + 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*} + - - Si estrae dalla pietra usando la piccozza. Si può usare per costruire una fornace o attrezzi di pietra. + + I Portali si creano posizionando blocchi di ossidiana in una struttura larga quattro blocchi e alta cinque. I blocchi d'angolo non sono necessari. - - Risultato della cottura dell'argilla in una fornace. + + Si può usare il Sottomondo per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo. - - Si inserisce nella fornace per creare mattoni. + + Ora sei in modalità Creativa. - - Quando viene rotta, rilascia delle sfere di argilla che possono essere cotte in una fornace per creare dei mattoni. + + {*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. - - Per conservare le palle di neve in poco spazio. + + 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. - - Si può scavare con una pala per creare palle di neve. + + 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. - - Può produrre semi di grano quando viene tagliato/a. + + 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 usa per creare tinture. + + Hai completato il tutorial sulla coltivazione. - - Si usa con la ciotola per fare la zuppa. + + Attrezzi diversi sono indicati per materiali diversi. Usa l'ascia per abbattere gli alberi. - - Si scava solo con una piccozza di diamante. Nasce dall'incontro tra acqua e lava e si usa per creare portali. + + 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. - - Genera mostri nel mondo. + + Alcuni attrezzi sono perfetti per attaccare i nemici. La spada è uno di questi. - - Si posa a terra per condurre elettricità. Quando viene incluso in una pozione aumenta la durata dell'effetto. + + I golem di ferro compaiono per aiutare i villaggi e ti attaccheranno se proverai ad attaccare un abitante. - - Le colture si possono mietere per ottenere grano. + + Non puoi abbandonare l'area finché non avrai completato il tutorial. - - Terreno pronto per piantare semi. + + Attrezzi diversi sono indicati per materiali diversi. Usa la pala per scavare materiali cedevoli come terra e sabbia. - - Si può cuocere in fornace per produrre tintura verde. + + 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... - - Si può usare per produrre zucchero. + + 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. - - Si può indossare come elmo o unire a una torcia per creare una zucca di Halloween. Inoltre è l'ingrediente principale della torta di zucca. + + 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. - - Una volta accesa, brucia per sempre. + + 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ù. - - Rallenta il movimento di qualsiasi cosa ci passi sopra. + + 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. - - Entra nel portale per spostarti tra il Sopramondo e il Sottomondo. + + Tieni premuto{*CONTROLLER_ACTION_JUMP*} per nuotare verso l'alto. - - Si usa come combustibile per la fornace o per creare una torcia. + + 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. - - Si ottiene uccidendo un ragno e si usa per creare un arco o una canna da pesca, o messo a terra per creare un gancio allarme. + + 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. - - Si ottiene uccidendo una gallina e si usa per creare una freccia. + + Dai grano a una mucca, muccafungo o pecora, carote ai maiali, chicchi 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. - - Si ottiene uccidendo un creeper e si usa per creare del TNT o come ingrediente per le pozioni. + + 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. - - Si possono piantare e coltivare su una zolla. Assicurati che vi sia luce a sufficienza per far crescere i semi! + + Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore. - - Si ottiene dalle colture e si può usare per creare cibo. + + 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. - - Si ottiene scavando nella ghiaia e si può usare per creare acciarino e pietra focaia. + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla riproduzione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona. - - Si usa su un maiale per poterlo cavalcare. Il maiale può poi essere controllato usando una carota su un bastone. + + Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto. - - Si ottiene scavando nella neve e si può lanciare. + + 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*} - - Si ottiene uccidendo una mucca e si usa per creare un'armatura o per fare libri. + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui golem.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già tutto sui golem. - - Si ottiene uccidendo uno slime e si usa come ingrediente per pozioni o per fare pistoni appiccicosi. + + I golem si creano sistemando una zucca in cima a una pila di blocchi. - - Viene deposto casualmente dalle galline e si può usare per creare cibi. + + 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. - - Si ottiene estraendo la pietra luce e si può usare per creare blocchi di pietra luce o mettendolo nelle pozione per aumentare la potenza dell'effetto. + + + I lupi selvatici possono essere addomesticati dando loro delle ossa. Una volta addomesticati, appariranno dei cuori intorno ad essi. I lupi addomesticati seguiranno il giocatore e lo difenderanno, se non è stato loro ordinato di restare seduti. + - - Si ottiene uccidendo uno scheletro. Si usa per produrre farina d'ossa. Può essere dato in pasto a un lupo per ammansirlo. + + Hai completato il tutorial sulla riproduzione. - - Si ottiene facendo uccidere un creeper da uno scheletro. Si può suonare in un jukebox. + + In questa area ci sono zucche e blocchi per creare un golem di neve e uno di ferro. - - Spegne il fuoco e favorisce la crescita delle colture. Si può raccogliere in un secchio. + + 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. - - Quando si rompono, a volte fanno cadere un arbusto che può essere trapiantato per far crescere un albero. + + Se il Calderone si svuota, puoi riempirlo con un Secchio d'acqua. - - Si trova nei sotterranei. Si può usare per costruire e decorare. + + 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. - - Si usa per ottenere lana dalle pecore e ottenere blocchi foglia. + + + 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 pozioni bomba aggiungendo polvere da sparo a una pozione normale. - - 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. + + {*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. - - 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. + + Prima di poter distillare una pozione, devi creare una Bottiglia d'acqua. Prendi una Bottiglia di vetro dalla cassa. - - Creato utilizzando blocchi di pietra. Si trova comunemente nelle fortezze. + + 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*}. - - Si usa come barriera, analogamente alle recinzioni. + + Usa la Pozione di Resistenza al fuoco su te stesso. - - Simile a una porta, ma usato principalmente nelle recinzioni. + + 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. - - Può essere creata usando Fette di anguria. + + Quando un oggetto viene posizionato nello slot di incantamento, i pulsanti a destra mostreranno una selezione casuale di incantesimi. - - Blocchi trasparenti che possono essere usati come alternativa ai blocchi di vetro. + + 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. - - Si possono piantare per far crescere delle zucche. + + Ora che sei resistente al fuoco e alla lava, approfittane per raggiungere dei luoghi che prima ti risultavano inaccessibili. - - Si possono piantare per far crescere delle angurie. + + Questa è l'interfaccia degli incantesimi. Puoi usarla per incantare armi, armature e alcuni attrezzi. - - 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. + + {*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. - - Un blocco di terra coperto d'erba. Si ottiene con la pala. Si può usare per la costruzione. + + In quest'area troverai un Banco di distillazione, un Calderone e una cassa pieni di oggetti da utilizzare per la preparazione di pozioni. - - Si può usare per costruire e decorare. + + L'antracite può essere usata come combustibile o combinata con un bastone per creare una torcia. - - Attraversarla rallenta i movimenti. Può essere distrutta con le forbici per raccogliere corda. + + Inserisci la sabbia nello slot ingrediente per produrre del vetro. Crea dei blocchi di vetro da usare come finestre nel tuo rifugio. - - 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. + + Questa è l'interfaccia di distillazione. Puoi usarla per creare pozioni di vario tipo. - - Una volta posizionato, cresce nel corso del tempo. Si può raccogliere usando le forbici. Ci si può salire come su una scala. + + 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. - - Superficie scivolosa. Si trasforma in acqua se si trova sopra un altro blocco quando questo viene distrutto. Si scioglie se è vicino a una fonte di luce o se viene messo nel Sottomondo. + + Gli oggetti nell'area di produzione possono essere trasferiti nell'inventario. Sperimenta con diversi ingredienti e vedi cosa riesci a creare. - - Si può usare come decorazione. + + 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. - - 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. + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa il Banco di distillazione. - - Si usa come ingrediente di pozioni. Viene deposta dai Ghast quando muoiono. + + 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. - - Viene deposta dagli Uomini-maiale zombie quando muoiono. Gli Uomini-maiale zombie si trovano nel Sottomondo. Si usa come ingrediente per pozioni. + + 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. - - Si usa come ingrediente di pozioni. Cresce spontaneamente nelle Fortezze del Sottomondo. Si può piantare anche nelle Sabbie mobili. + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia di distillazione. - - Può avere effetti diversi a seconda dell'oggetto su cui viene usata. + + 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. - - Può essere riempita d'acqua e usata come ingrediente di base per preparare pozioni nel Banco di distillazione. + + 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. - - Cibo velenoso e ingrediente per pozioni tossiche. Viene deposto dai Ragni o Ragni delle grotte uccisi dal giocatore. + + È 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. - - Si usa come ingrediente di pozioni, soprattutto nelle pozioni con effetti negativi. + + Seleziona un incantesimo e premi{*CONTROLLER_VK_A*} per applicarlo all'oggetto. Il costo dell'incantesimo verrà detratto dai tuoi punti Esperienza. - - Si usa come ingrediente di pozioni o insieme ad altri oggetti per creare l'Occhio di Ender o la Crema di magma. + + Premi{*CONTROLLER_ACTION_USE*} per lanciare la lenza e iniziare a pescare. Premi di nuovo{*CONTROLLER_ACTION_USE*} per tirare la lenza. + {*FishingRodIcon*} - - Si usa come ingrediente di pozioni. + + 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*} - - Si usa per produrre pozioni e pozioni bomba. + + 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*} - - Può essere riempito d'acqua con la pioggia o usando un secchio e quindi utilizzato per riempire Bottiglie di vetro. + + La barca consente di viaggiare velocemente sull'acqua. Per virare, usa{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} - - 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. + + Ora stai utilizzando la canna da pesca. Premi{*CONTROLLER_ACTION_USE*} per usarla.{*FishingRodIcon*} - - Si usa come ingrediente di pozioni. + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla pesca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la pesca. - - Simili ai blocchi Erba, questi blocchi sono ideali come terreno di coltura per i funghi. + + Questo è un letto. Premi{*CONTROLLER_ACTION_USE*} mentre punti verso di esso di notte per dormire e risvegliarti il mattino successivo.{*ICON*}355{*/ICON*} - - Galleggia e può essere usata per guadare un corso d'acqua. + + In quest'area ci sono dei semplici circuiti con pietre rosse e pistoni, oltre a un forziere contenente altri oggetti per ampliare i circuiti. - - Si usa per costruire Fortezze del Sottomondo. È immune alle palle di fuoco lanciate dai Ghast. + + {*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. - - Si usa nelle Fortezze del Sottomondo. + + 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. - - Si trova nelle Fortezze del Sottomondo. Quando viene distrutto, rilascia una Verruca del Sottomondo. + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul letto.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il letto. - - Permette al giocatore di incantare spade, piccozze, asce, pale, archi e armature usando i punti Esperienza guadagnati. + + 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*} - - Si attiva usando dodici Occhi di Ender e permette di raggiungere la dimensione Limite. + + Se ci sono altri giocatori nel gioco, per dormire devono essere tutti a letto nello stesso momento. + {*ICON*}355{*/ICON*} - - Si usa per costruire un Portale del Limite. + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la barca. - - Un tipo di blocco che si trova nel Limite. Estremamente resistente alle esplosioni, è molto utile per costruire. + + 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. - - Questo blocco si crea dopo aver sconfitto il Drago nel Limite. + + Posizionare degli scaffali intorno al Tavolo per incantesimi ne aumenta la potenza e consente di accedere agli incantesimi di livello più alto. - - Quando viene lanciata, lascia cadere delle sfere Esperienza; raccogliendole, il giocatore può aumentare i propri punti Esperienza. + + 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. - - Utile per appiccare il fuoco alle cose, o per scatenare incendi quando viene lanciata da un dispenser. + + 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. - - Simile a un espositore, mostra l'oggetto o il blocco messo al suo interno. + + In quest'area troverai un Tavolo per incantesimi e alcuni altri oggetti che potrai utilizzare per familiarizzarti con questa nuova funzionalità. - - Quando è lanciato può generare una creatura del tipo indicato. + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. - - Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + + 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. - - Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + + Il carrello da miniera viaggia sui binari. Puoi creare un carrello potenziato usando una fornace e un carrello da miniera contenente una cassa. + {*RailIcon*} - - Creato dalla fusione della Sottogriglia nella fornace. Può generare blocchi di mattoni del Sottomondo. + + 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*} - - Se alimentate, emettono una luce. + + Ora navighi su una barca. Per scendere, punta il cursore verso la barca e premi{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - Può essere coltivato per raccogliere Semi di cacao. + + 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. - - Le teste di Mob si possono collocare come decorazioni o indossare come maschere nello slot per l'elmo. + + Ora viaggi in un carrello da miniera. Per smontare, punta il cursore verso il carrello e premi{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - Calamaro + + {*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. - - Rilascia sacche di inchiostro quando viene ucciso. + + Se sposti il puntatore fuori dall'interfaccia mentre trasporti un oggetto, puoi posarlo. - - Mucca + + Leggi - - Rilascia pelle quando viene uccisa. Si può anche mungere usando un secchio. + + Appendi - - Pecora + + Lancia - - Rilascia lana quando viene tosata (se non è già stata tosata). Si può creare lana di vari colori usando le tinture. + + Apri - - Gallina + + Cambia tonalità - - Rilascia piume quando viene uccisa, inoltre a volte depone le uova. + + Fai esplodere - - Maiale + + Pianta - - Rilascia costolette quando viene ucciso. Si può cavalcare usando una sella. + + Sblocca gioco completo - - Lupo + + Elimina salvataggio - - 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. + + Elimina - - Creeper + + Ara - - Esplode se ti avvicini troppo! + + Mieti - - Scheletro + + Continua - - Ti scocca contro delle frecce. Rilascia delle frecce quando viene ucciso. + + Nuota su - - Ragno + + Colpisci - - Ti attacca quando ti avvicini. Può arrampicarsi sui muri. Rilascia un pungiglione quando viene ucciso. + + Mungi - - Zombie + + Raccogli - - Ti attacca quando ti avvicini. + + Svuota - - Uomo-maiale zombie + + Sella - - Inizialmente docile, ma se ne colpisci uno verrai attaccato da un gruppo. + + Colloca - - Ghast + + Mangia - - Ti lancia sfere di fuoco che esplodono al contatto. + + Cavalca - - Slime + + Naviga - - Se danneggiato, si divide in slime più piccoli. + + Coltiva - - Enderman + + Dormi - - Ti attacca se lo guardi. Può anche spostare blocchi. + + Svegliati - - Pesciolino d'argento + + Suona - - Quando viene attaccato, attira tutti i Pesciolini d'argento nascosti nei dintorni. Si nasconde nei blocchi di pietra. + + Opzioni - - Ragno delle grotte + + Sposta armatura - - Il suo morso è velenoso. + + Sposta arma - - Muccafungo + + Equipaggia - - Si usa con una Ciotola per preparare la Zuppa di funghi. Deposita funghi e diventa una mucca normale quando viene tosata. + + Sposta ingrediente - - Golem di neve + + Sposta combustibile - - Il Golem di neve può essere creato assemblando blocchi di neve e una zucca. Lancia palle di neve contro i nemici del suo creatore. + + Sposta attrezzo - - Drago di Ender + + Tendi - - Grosso drago nero che si trova nel Limite. + + Pagina su - - Vampe + + Pagina giù - - Nemici che si trovano nel Sottomondo, soprattutto all'interno delle Fortezze. Quando vengono uccisi, depositano Bacchette di Vampe. + + Modalità Amore - - Cubo di magma + + Rilascia - - Si trovano nel Sottomondo. Simili a Slime, si dividono in esemplari più piccoli quando vengono uccisi. + + Privilegi - - Abitante del villaggio + + Parata - - Ocelot + + Creativa - - 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. + + Escludi livello - - Golem di ferro + + Seleziona skin - - Appare nei villaggi per proteggerli, può essere creato usando blocchi di ferro e zucche. + + Accendi - - Explosives Animator + + Invita amici - - Concept Artist + + Accetta - - Number Crunching and Statistics + + Tosa - - Bully Coordinator + + Naviga - - Original Design and Code by + + Reinstalla - - Project Manager/Producer + + Opzioni dati - - Rest of Mojang Office + + Esegui comando - - Capo programmatore Minecraft PC + + Installa versione completa - - Ninja Coder + + Installa versione di prova - - CEO + + Installa - - White Collar Worker + + Espelli - - Customer Support + + Aggiorna elenco partite - - Office DJ + + Giochi Party - - Designer/Programmer Minecraft - Pocket Edition + + Tutti i giochi - - Developer + + Esci - - Chief Architect + + Annulla - - Art Developer + + Annulla accesso - - Game Crafter + + Cambia gruppo - - Director of Fun + + Crafting - - Music and Sounds + + Crea - - Programming + + Prendi/Colloca - - Art + + Mostra inventario - - QA + + Mostra descrizione - - Executive Producer + + Mostra ingredienti - - Lead Producer + + Indietro - - Producer + + Promemoria: - - Test Lead + + - - Lead Tester + + Nell'ultima versione del gioco, sono state aggiunte nuove funzionalità, tra cui nuove aree nel mondo tutorial. - - Design Team + + Non hai tutti gli ingredienti necessari per creare questo oggetto. La casella in basso a sinistra mostra gli ingredienti necessari. - - Development Team + + 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! - - Release Management + + {*EXIT_PICTURE*} Quando sarai pronto a proseguire l'esplorazione, vicino al rifugio del minatore troverai una scala che conduce a un piccolo castello. - - Director, XBLA Publishing + + {*B*}Premi{*CONTROLLER_VK_A*} per giocare normalmente il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} per saltare il tutorial principale. - - Business Development + + {*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. - - Portfolio Director + + Seleziona - - Product Manager + + Usa - - Marketing + + In quest'area, troverai delle zone che ti aiuteranno a scoprire la pesca, le barche, i pistoni e le pietre rosse. - - Community Manager + + Fuori da quest'area, troverai esempi di edifici, coltivazioni, carrelli da miniera e binari, oltre a incantesimi e pozioni da distillare! - - Europe Localization Team + + La tua barra del cibo è scesa a un livello troppo basso e non potrai più recuperare energia. - - Redmond Localization Team + + Prendi - - Asia Localization Team + + Avanti - - User Research Team + + Indietro - - MGS Central Teams + + Espelli giocatore - - Milestone Acceptance Tester + + Invia richiesta amico - - Special Thanks + + Pagina giù - - Test Manager + + Pagina su - - Senior Test Lead + + Tingi - - SDET + + Cura - - Project STE + + Siediti - - Additional STE + + Seguimi - - Test Associates + + Scava - - Jon Kågström + + Nutri - - Tobias Möllstam + + Addomestica - - Risë Lugo + + Cambia filtro - - Spada di legno + + Colloca tutti - - Spada di pietra + + Colloca uno - - Spada di ferro + + Posa - - Spada di diamante + + Prendi tutto - - Spada d'oro + + Prendi metà - - Pala di legno + + Colloca - - Pala di pietra + + Posa tutti - - Pala di ferro + + Elimina scelta rapida - - Pala di diamante + + Cos'è? - - Pala d'oro + + Condividi su Facebook - - Piccozza di legno + + Posa uno - - Piccozza di pietra + + Scambia - - Piccozza di ferro + + Spost. veloce - - Piccozza di diamante + + Pacchetti di skin - - Piccozza d'oro + + Lastra di vetro dipinto rossa - - Ascia di legno + + Lastra di vetro dipinto verde - - Ascia di pietra + + Lastra di vetro dipinto marrone - - Ascia di ferro + + Vetro dipinto bianco - - Ascia di diamante + + Lastra di vetro dipinto - - Ascia d'oro + + Lastra di vetro dipinto nera - - Zappa di legno + + Lastra di vetro dipinto blu - - Zappa di pietra + + Lastra di vetro dipinto grigia - - Zappa di ferro + + Lastra di vetro dipinto rosa - - Zappa di diamante + + Lastra di vetro dipinto verde chiaro - - Zappa d'oro + + Lastra di vetro dipinto viola - - Porta di legno + + Lastra di vetro dipinto azzurra - - Porta di ferro + + Lastra di vetro dipinto grigia chiara - - Elmo di maglia metallica + + Vetro dipinto arancione - - Corazza di maglia + + Vetro dipinto blu - - Gambali di maglia metallica + + Vetro dipinto viola - - Stivali di maglia metallica + + Vetro dipinto azzurro - - Cappello di pelle + + Vetro dipinto rosso - - Elmo di ferro + + Vetro dipinto verde - - Elmo di diamante + + Vetro dipinto marrone - - Elmo d'oro + + Vetro dipinto grigio chiaro - - Tunica di pelle + + Vetro dipinto giallo - - Corsaletto di ferro + + Vetro dipinto blu chiaro - - Corsal. di diamante + + Vetro dipinto magenta - - Corsaletto d'oro + + Vetro dipinto grigio - - Pantaloni di pelle + + Vetro dipinto rosa - - Gambali di ferro + + Vetro dipinto verde chiaro - - Gambali di diamante + + Lastra di vetro dipinto gialla - - Gambali d'oro + + Grigio chiaro - - Stivali di cuoio + + Grigio - - Stivali di ferro + + Rosa - - Stivali di diamante + + Blu - - Stivali d'oro + + Viola - - Lingotto di ferro + + Azzurro - - Lingotto d'oro + + Verde chiaro - - Secchio + + Arancione - - Secchio d'acqua + + Bianco - - Secchio di lava + + Personalizzato - - Pietra foc. e acciarino + + Giallo - - Mela + + Blu chiaro - - Arco + + Magenta - - Freccia + + Marrone - - Carbone + + Lastra di vetro dipinto bianca - - Antracite + + Palla piccola - - Diamante + + Palla grande - - Bastone + + Lastra di vetro dipinto blu chiaro - - Ciotola + + Lastra di vetro dipinto magenta - - Zuppa di funghi + + Lastra di vetro dipinto arancione - - Corda + + Stella - - Piuma + + Nero - - Polvere da sparo + + Rosso - - Semi di grano + + Verde - - Grano + + Creeper - - Pane + + Fiammata - - Pietra focaia + + Forma sconosciuta - - Costoletta di maiale cruda + + Vetro dipinto nero - - Costoletta di maiale cotta + + Armatura di ferro da cavallo - - Dipinto + + Armatura d'oro da cavallo - - Mela d'oro + + Armatura di diamante da cavallo - - Cartello + + Comparatore di pietra rossa - - Carrello da miniera + + Carrello da miniera con TNT - - Sella + + Carrello da miniera con hopper - - Pietra rossa + + Piombo - - Palla di neve + + Raggio - - Barca + + Cassa intrappolata - - Pelle + + Piastra a pressione pesata (leggera) - - Secchio di latte + + Targhetta del nome - - Mattone + + Assi di legno (ogni tipo) - - Argilla + + Blocco di comando - - Canna da zucchero + + Stella per fuochi artificiali - - Carta + + Questi animali possono essere addomesticati e in seguito montati. Possono essere dotati di una cassa. - - Libro + + Mulo - - Palla di slime + + Nato dall'accoppiamento di un cavallo e un asino. Questi animali possono essere addomesticati e in seguito montati, indossare armature e trasportare casse. - - Carrello con cassa + + Cavallo - - Carrello con fornace + + Questi animali possono essere addomesticati e in seguito montati. - - Uovo + + Asino - - Bussola + + Cavallo zombie - - Canna da pesca + + Mappa vuota - - Orologio + + Stella del Sottomondo - - Polvere di pietra brillante + + Razzo per fuochi artificiali - - Pesce crudo + + Cavallo scheletro - - Pesce cotto + + Avvizzito - - Tintura in polvere + + Vengono creati usando teschi avvizziti e sabbie mobili. Quando esplodono lanciano teschi. - - Sacca d'inchiostro + + Piastra a pressione pesata (pesante) - - Rosso rosa + + Argilla dipinta grigia chiara - - Verde cactus + + Argilla dipinta grigia - - Semi di cacao + + Argilla dipinta rosa - - Lapislazzulo + + Argilla dipinta blu - - Tintura viola + + Argilla dipinta viola - - Tintura turchese + + Argilla dipinta azzurra - - Tintura grigiastra + + Argilla dipinta verde chiara - - Tintura grigia + + Argilla dipinta arancione - - Tintura rosa + + Argilla dipinta bianca - - Tintura verde lime + + Vetro dipinto - - Giallo mimosa + + Argilla dipinta gialla - - Tintura azzurra + + Argilla dipinta blu chiara - - Tintura magenta + + Argilla dipinta magenta - - Tintura arancione + + Argilla dipinta marrone - - Farina d'ossa + + Hopper - - Osso + + Binario attivatore - - Zucchero + + Dropper - - Torta + + Comparatore di pietra rossa - - Letto + + Sensore luce solare - - Ripetitore pietra rossa + + Blocco di pietra rossa - - Biscotto + + Argilla dipinta - - Mappa + + Argilla dipinta nera - - Disco - "13" + + Argilla dipinta rossa - - Disco - "gatto" + + Argilla dipinta verde - - Disco - "blocchi" + + Balla di fieno - - Disco - "cip" + + Argilla indurita - - Disco - "lontano" + + Blocco di carbone - - Disco - "centro commerciale" + + Dissolvenza - - Disco - "mellohi" + + Quando è disattivato, impedisce a mostri e animali di modificare i blocchi (ad esempio, le esplosioni dei creeper non distruggono blocchi e le pecore non rimuovono l'erba) e di raccogliere oggetti. - - Disco - "stal" + + Quando è attivato, i giocatori conservano il loro inventario quando muoiono. - - Disco - "strad" + + Quando è disattivato, i nemici non si rigenerano naturalmente. - - Disco - "reparto" + + Modalità: Avventura - - Disco - "11" + + Avventura - - Disco - "dove siamo adesso" + + Inserisci un seme per generare di nuovo lo stesso terreno. Lascia vuoto per generare un mondo casuale. - - Tosatrice + + Quando è attivato, mostri e animali non rilasciano oggetti (ad esempio, i creeper non rilasciano polvere da sparo). - - Semi di zucca + + {*PLAYER*} è caduto da una scala - - Semi di anguria + + {*PLAYER*} è caduto da un vitigno - - Pollo crudo + + {*PLAYER*} è caduto fuori dall'acqua - - Pollo cotto + + Quando è disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (ad esempio, i blocchi di pietra non rilasciano ciottoli). - - Manzo crudo + + Quando è disattivato, i giocatori non rigenerano naturalmente la salute. - - Bistecca + + Quando è disattivato, l'ora del giorno non cambia. - - Carne guasta + + Carrello da miniera - - Perla di Ender + + Guinzaglio - - Fetta di anguria + + Rilascia - - Bacchetta di Vampe + + Attacca - - Lacrima di Ghast + + Smonta - - Pepita d'oro + + Cassa attaccata - - Verruca del Sottomondo + + Lancia - - Pozione{*splash*}{*prefix*}{*postfix*} + + Nome - - Bottiglia di vetro + + Raggio - - Bottiglia d'acqua + + Potenza primaria - - Occhio di ragno + + Potenza secondaria - - Occhio ragno fermen. + + Cavallo - - Polvere di Vampe + + Dropper - - Crema di magma + + Hopper - - Banco di distillazione + + {*PLAYER*} è caduto da un luogo alto - - Calderone - - - Occhio di Ender + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di pipistrelli nel mondo. - - Anguria scintillante + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di cavalli. - - Bottiglia magica + + Opzioni di gioco - - Scarica di fuoco + + {*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} con {*ITEM*} - - Scaric. fuoco brace + + {*PLAYER*} è stato pestato a morte da {*SOURCE*} con {*ITEM*} - - Scaric. fuoco carbone + + {*PLAYER*} è stato ucciso da {*SOURCE*} con {*ITEM*} - - Cornice oggetto + + Scorrettezza nemici - - Genera {*CREATURE*} + + Posa tessere - - Mattone del Sottomondo + + Rigenerazione naturale - - Teschio + + Ciclo solare - - Teschio di scheletro + + Mantieni inventario - - Teschio di scheletro avvizzito + + Rigenerazione nemici - - Testa di zombie + + Bottino nemici - - Testa + + {*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} con {*ITEM*} - - Testa di %s + + {*PLAYER*} è caduto troppo lontano ed è stato finito da {*SOURCE*} - - Testa di Creeper + + {*PLAYER*} è caduto troppo lontano ed è stato finito da {*SOURCE*} con {*ITEM*} - - Pietra + + {*PLAYER*} è entrato nel fuoco combattendo {*SOURCE*} - - Blocco d'erba + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} - - Terra + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} - - Ciottolo + + {*PLAYER*} è stato fatto cadere da {*SOURCE*} usando {*ITEM*} - - Assi di legno di quercia + + {*PLAYER*} è stato cotto a puntino mentre combatteva {*SOURCE*} - - Assi di legno di abete + + {*PLAYER*} è stato fatto esplodere da {*SOURCE*} - - Assi di legno di betulla + + {*PLAYER*} si è avvizzito - - Assi di legno (giungla) + + {*PLAYER*} è stato ucciso da {*SOURCE*} con {*ITEM*} - - Arbusto + + {*PLAYER*} ha tentato di nuotare nella lava per sfuggire a{*SOURCE*} - - Arbusto di quercia + + {*PLAYER*} è affogato mentre tentava di sfuggire a {*SOURCE*} - - Arbusto di abete + + {*PLAYER*} si è scontrato con un cactus mentre tentava di sfuggire a {*SOURCE*} - - Arbusto di betulla + + Monta - - Arbusto della giungla + + + Per poter governare un cavallo, questo dev'essere munito di sella, che si può acquistare dagli abitanti o trovare nelle casse in giro per il mondo. + - - Substrato roccioso + + + Gli asini e i muli addomesticati possono essere dotati di sacche attaccando una cassa. Tali sacche possono essere usati mentre si cavalca o chinandosi. + - - Acqua + + + Cavalli e asini (ma non i muli) possono essere allevati come gli altri animali usando mela d'oro o carote d'oro. I puledri diventano col tempo cavalli adulti, me nutrendoli di grano o fieno la loro crescita accelera. + - - Lava + + + Cavalli, asini e muli devono essere addomesticati prima di essere usati. Un cavallo si addomestica tentando di cavalcarlo, e resistendo ai suoi tentativi di disarcionamento. + - - Sabbia + + + Una volta addomesticati, appariranno dei cuori intorno ad essi e non tenteranno più di disarcionare il cavaliere. + - - Arenaria + + + Prova a cavalcare un cavallo. Usa {*CONTROLLER_ACTION_USE*} senza oggetti né attrezzi in mano per montare. + - - Ghiaia + + + Qui puoi provare ad addomesticare cavalli e asini, e là ci sono selle, armature per cavalli e altri utili oggetti per cavalli nelle casse qui in giro. + - - Minerale d'oro + + + Un raggio con una piramide di almeno 4 livelli offre una opzione supplementare: potere secondario di Rigenerazione o potenziamento del potere primario. + - - Minerale di ferro + + + Per impostare i poteri del tuo Raggio devi sacrificare uno smeraldo, un diamante, un lingotto d'oro o di ferro nello slot del pagamento. Una volta impostati, i poteri continueranno a essere emanati indefinitamente. + - - Minerale di carbone + + In cima a questa piramide c'è un Raggio non attivo. - - Legno + + + Questa è l'interfaccia del Raggio, che puoi usare per scegliere i poteri forniti dal Raggio stesso. + - - Legno di quercia + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'interfaccia del Raggio. + - - Legno di abete + + + Nel menu del Raggio puoi scegliere un potere primario per il tuo Raggio. Più livelli ha la tua piramide, più poteri hai tra cui scegliere. + - - Legno di betulla + + + Tutti i cavalli, asini e muli possono essere cavalcati. Ma solo i cavalli possono essere dotati di armatura, e solo asini e muli possono essere dotati di sacche per trasportare oggetti. + - - Legno della giungla + + + Questa è l'interfaccia inventario del cavallo. + - - Quercia + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario del cavallo. + - - Abete + + + L'inventario del cavallo ti permette di trasferire o equipaggiare oggetti sul tuo cavallo, asino o mulo. + - - Betulla + + Scintillio - - Foglie + + Scia - - Foglie di quercia + + Durata in volo: - - Foglie d'abete + + + Sella il cavallo mettendo una sella nell'apposito slot. Ai cavalli puoi mettere un'armatura mettendola nello slot dell'armatura. + - - Foglie di betulla + + Hai trovato un mulo. - - Foglie della giungla + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più su cavalli, asini e muli. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto su cavalli, asini e muli. + - - Spugna + + + Cavalli e asini si trovano soprattutto nelle pianure. I muli possono essere allevati accoppiando cavalli e asini, ma sono sterili. + - - Vetro + + + Puoi anche trasferire oggetti tra il tuo inventario e le sacche degli asini e dei muli in questo menu. + - - Lana + + Hai trovato un cavallo. - - Lana nera + + Hai trovato un asino. - - Lana rossa + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui Raggi. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui Raggi. + - - Lana verde + + + Le Stelle di Fuochi artificiali si creano mettendo Polvere da sparo e Tintura nella griglia di creazione. + - - Lana marrone + + + La tintura determina il colore dell'esplosione della Stella per fuochi artificiali. + - - Lana blu + + + La forma della stella si imposta aggiungendo una Scarica di fuoco, una Pepita d'oro, una piuma o una testa. + - - Lana viola + + + Puoi anche mettere diverse Stelle per Fuochi artificiali nella griglia di creazione, per aggiungerli al nuovo Fuoco artificiale. + - - Lana turchese + + + Riempiendo più slot nella griglia di creazione con Polvere da sparo aumenterai l'altezza alla quale le Stelle esploderanno. + - - Lana grigio chiaro + + + Ora puoi prendere il Fuoco artificiale dallo slot di uscita, quando desideri crearlo. + - - Lana grigia + + + Si può aggiungere una scia di scintille usando Diamante e Polvere di pietre brillanti. + - - Lana rosa + + + I Fuochi artificiali sono oggetti decorativi che possono essere lanciati a mano o mediante un Dispense. Sono creati usando Pepe, Polvere da sparo e un numero a scelta di Stelle per Fuochi artificiali - - Lana verde lime + + + Il colore, la dissolvenza, la forma, la dimensione e gli effetti (come scie e scintille) delle Stelle per fuochi artificiali possono essere personalizzati aggiungendo ingredienti durante la creazione. + - - Lana gialla + + + Prova a creare un Fuoco artificiale al tavolo di creazione usando una serie di ingredienti nelle casse. + - - Lana azzurra + + + Dopo aver creato una Stella per fuochi artificiali, puoi impostare il colore della dissolvenza della Stella con la tintura. + - - Lana magenta + + + Nelle ceste ci sono diversi oggetti usati nella creazione di FUOCHI ARTIFICIALI! + - - Lana arancione + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui fuochi artificiali. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui fuochi artificiali. + - - Lana bianca + + + Per creare un Fuoco artificiale metti Polvere da sparo e Carta nella griglia di creazione 3x3 in alto nel tuo inventario. + - - Fiore + + Questa stanza contiene hopper - - Rosa + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sugli hopper. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sugli hopper. + - - Fungo + + + Gli hopper servono per mettere o togliere oggetti dai contenitori, e per raccogliere automaticamente oggetti lanciati dentro di essi. + - - Blocco d'oro + + + I Raggi attivi proiettano un raggio luminoso nel cielo e donano poteri ai giocatori vicini. Essi sono creati mediante vetro, ossidiana e stelle del Sottomondo, ottenibili sconfiggendo gli Avvizziti. + - - Un modo per immagazzinare oro in modo compatto. + + + I Raggi devono essere piazzati in modo da essere esposti al sole durante il giorno. Devono essere posizionati su piramidi di ferro, oro, smeraldo o diamante. Ma la scelta del materiale non ha effetto sulla potenza del raggio. + - - Blocco di ferro + + + Prova a usare il Raggio per impostare i poteri, puoi usare i lingotti di ferro forniti come pagamento. + - - Un modo per immagazzinare ferro in modo compatto. + + + Funzionano con banchi di distillazione, casse, dispenser, dropper, carrelli da miniera con casse, carrelli da miniera con hopper e con altri hopper. + - - Lastra di pietra + + + In questa stanza ci sono diverse soluzioni di hopper con cui sperimentare. + - - Lastra di pietra + + + Questa è l'interfaccia dei Fuochi artificiali, che puoi usare per creare Fuochi artificiali e Stelle di Fuochi artificiali. + - - Lastra di arenaria + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già come si usa l'interfaccia dei Fuochi artificiali. + - - Lastra di legno + + + Gli hopper tentano continuamente di estrarre oggetti dai contenitori compatibili posti sopra di essi. Inoltre tentano di inserire gli oggetti immagazzinati nei contenitori di uscita. + - - Lastra acciottolata + + + Ma se un hopper è alimentato da pietra rossa, diventerà inattivo e smetterà di risucchiare e inserire gemme. + - - Lastra di mattoni + + + Un hopper punta nella direzione in cui tenta di far uscire oggetti. Per farlo puntare a un blocco particolare, piazzalo contro questo blocco mentre sei in furtività. + - - Lastra di mattoni di pietra + + Questi nemici si trovano nelle paludi e ti attaccano lanciando pozioni. Quando muoiono rilasciano pozioni. - - Lastra di legno di quercia + + Hai raggiunto il limite per i Telai di dipinti/oggetti di un mondo. - - Lastra di legno di abete + + Non puoi generare nemici in modalità Relax. - - Lastra di legno di betulla + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. - - Lastra di legno (giungla) + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di calamari. - - Lastra mattoni Sottomondo + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di nemici nel mondo. - - Mattoni + + Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di villici nel mondo. - - TNT + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di lupi. - - Libreria + + Hai raggiunto il numero massimo di teste di Mob in un mondo. - - Pietra muschiosa + + Inverti - - Ossidiana + + Mancino - - Torcia + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di galline. - - Torcia (carbone) + + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di muccafunghi. - - Torcia (antracite) + + È stato raggiunto il numero massimo di navi per mondo. - - Fuoco + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di galline. - - Generatore di mostri + + {*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*} - - Scala di legno di quercia + + {*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*} - - Cassa + + Resetta Sottomondo - - Polvere di pietra rossa + + %s si trova ora nel Limite - - Minerale di diamante + + %s ha lasciato il Limite - - Blocco di diamante + + {*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*} - - Un modo per immagazzinare diamanti in modo compatto. + + Ripristinare le impostazioni iniziali del Sottomondo in questo salvataggio? Tutto ciò che hai creato nel Sottomondo andrà perso! - - Tavolo da lavoro + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. - - Coltura + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di muccafunghi. - - Zolla + + Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di lupi. - - Fornace + + Resetta il Sottomondo - - Cartello + + Non resettare il Sottomondo - - Porta di legno + + Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. - - Scala a pioli + + Sei morto! - - Binari + + Opzioni mondo - - Binari potenziati + + Può costruire e scavare - - Binari rilevatori + + Può usare porte e interruttori - - Scala di pietra + + Genera strutture - - Leva + + Mondo superpiatto - - Piastra a pressione + + Cassa bonus - - Porta di ferro + + Può aprire contenitori - - Minerale pietra rossa + + Espelli giocatore - - Torcia pietra rossa + + Può volare - - Tasti + + Disabilita stanchezza - - Neve + + Può attaccare i giocatori - - Ghiaccio + + Può attaccare gli animali - - Cactus + + Moderatore - - Argilla + + Privilegi dell'host - - Canna da zucchero + + Come giocare - - Jukebox + + Comandi - - Recinzione + + Impostazioni - - Zucca + + Rigenerati - - Zucca di Halloween + + Offerte contenuto scaricabile - - Sottogriglia + + Cambia skin - - Sabbie mobili + + Riconoscimenti - - Pietra brillante + + Esplosione TNT - - Portale + + Giocatore vs Giocatore - - Minerale di lapislazzulo + + Autorizza giocatori - - Blocco lapislazzulo + + Reinstalla contenuto - - Un modo per immagazzinare lapislazzuli in modo compatto. + + Impostazioni debug - - Dispenser + + Diffusione incendio - - Blocco nota + + Drago di Ender - - Torta + + Un Drago di Ender ha ucciso {*PLAYER*} con il suo alito - - Letto + + {*PLAYER*} è stato ucciso da {*SOURCE*} - - Ragnatela + + {*PLAYER*} è stato ucciso da {*SOURCE*} - - Erba alta + + {*PLAYER*} è morto - - Cespuglio secco + + {*PLAYER*} è saltato in aria - - Diodo + + {*PLAYER*} è stato ucciso dalla magia - - Cassa chiusa + + {*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} - - Botola + + Nebbia substrato roccioso - - Lana (qualsiasi colore) + + Mostra interfaccia - - Pistone + + Mostra mano - - Pistone appiccicoso + + {*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} - - Blocco Pesciolino d'argento + + {*PLAYER*} è stato pestato a morte da {*SOURCE*} - - Mattoni di pietra + + {*PLAYER*} è stato ucciso da {*SOURCE*} con la magia - - Mattoni di pietra muschiosi + + {*PLAYER*} è caduto fuori dal mondo - - Mattoni di pietra lesionati + + Pacchetti Texture - - Mattoni di pietra cesellati + + Pacchetti Mash-Up - - Fungo + + {*PLAYER*} ha preso fuoco - - Fungo + + Temi - - Barre di ferro + + Immagini del giocatore - - Lastra di vetro + + Oggetti avatar - - Anguria + + {*PLAYER*} è bruciato vivo - - Picciolo di zucca + + {*PLAYER*} è morto di fame - - Picciolo di melone + + {*PLAYER*} è morto in seguito a una puntura - - Rampicanti + + {*PLAYER*} si è schiantato al suolo - - Cancello per recinzioni + + {*PLAYER*} ha cercato di nuotare nella lava - - Scale di mattoni + + {*PLAYER*} è soffocato dentro un muro - - Scale di mattoni di pietra + + {*PLAYER*} è affogato - - Pietra Pesciolino d'argento + + Messaggi di morte - - Ciottolo Pesciolino d'argento + + Non sei più un moderatore - - Mattone di pietra Pesciolino d'argento + + Ora puoi volare - - Micelio + + Non puoi più volare - - Ninfea + + Non puoi più attaccare gli animali - - Mattone del Sottomondo + + Ora puoi attaccare gli animali - - Recinz. mattoni Sottomondo + + Ora sei un moderatore - - Scale di mattoni Sottomondo + + Non sentirai più la stanchezza - - Verruca del Sottomondo + + Ora sei invulnerabile - - Tavolo per incantesimi + + Non sei più invulnerabile - - Banco di distillazione + + %d MSP - - Calderone + + Ora sentirai la stanchezza - - Portale del Limite + + Ora sei invisibile - - Telaio per Portale del Limite + + Non sei più invisibile - - Pietra del Limite + + Ora puoi attaccare i giocatori - - Uovo di drago + + Ora puoi scavare e usare oggetti - - Arbusto + + Non puoi più posizionare blocchi - - Felce + + Ora puoi posizionare blocchi - - Scala di arenaria + + Personaggio animato - - Scale di legno di abete + + Animaz. skin personalizzata  - - Scale di legno di betulla + + Non puoi più scavare né usare oggetti - - Scala di legno (giungla) + + Ora puoi usare porte e interruttori - - Lampada di pietra rossa + + Non puoi più attaccare i nemici - - Cacao + + Ora puoi attaccare i nemici - - Teschio + + Non puoi più attaccare i giocatori - - Comandi attuali + + Non puoi più usare porte e interruttori - - Layout + + Ora puoi usare contenitori (es. casse) - - Muoviti/Scatta + + Non puoi più usare contenitori (es. casse) - - Guarda + + Invisibile - - Pausa + + Raggi + + + {*T3*}COME SI GIOCA: RAGGI{*ETW*}{*B*}{*B*} +I Raggi attivi proiettano un raggio luminoso nel cielo e donano poteri ai giocatori vicini.{*B*} +Essi sono creati mediante vetro, ossidiana e stelle del Sottomondo, ottenibili sconfiggendo gli Avvizziti.{*B*}{*B*} +I Raggi devono essere piazzati in modo da essere esposti al sole durante il giorno. Devono essere posizionati su piramidi di ferro, oro, smeraldo o diamante.{*B*} +La scelta del materiale non ha effetto sulla potenza del raggio.{*B*}{*B*} +Nel menu del Raggio puoi scegliere un potere primario per il tuo Raggio. Più livelli ha la tua piramide, più poteri hai tra cui scegliere.{*B*} +Un raggio con una piramide di almeno 4 livelli offre una opzione supplementare: potere secondario di Rigenerazione o potenziamento del potere primario.{*B*}{*B*} +Per impostare i poteri del tuo Raggio devi sacrificare uno smeraldo, un diamante, un lingotto d'oro o di ferro nello slot del pagamento.{*B*} +Una volta impostati, i poteri continueranno a essere emanati indefinitamente.{*B*} + + + + Fuochi artificiali + + + Lingue + + + Cavalli + + + {*T3*}COME SI GIOCA: CAVALLI{*ETW*}{*B*}{*B*} +Cavalli e asini si trovano soprattutto nelle pianure. I muli possono essere allevati accoppiando cavalli e asini, ma sono sterili.{*B*} +Tutti i cavalli, asini e muli possono essere cavalcati. Ma solo i cavalli possono essere dotati di armatura, e solo asini e muli possono essere dotati di sacche per trasportare oggetti.{*B*}{*B*} +Cavalli, asini e muli devono essere addomesticati prima di essere usati. Un cavallo si addomestica tentando di cavalcarlo, e resistendo ai suoi tentativi di disarcionamento.{*B*} +Una volta addomesticati, appariranno dei cuori intorno ad essi e non tenteranno più di disarcionare il cavaliere. Per poter governare un cavallo, questo dev'essere munito di sella.{*B*}{*B*} +Una sella che si può acquistare dagli abitanti o trovare nelle casse in giro per il mondo.{*B*} +Gli asini e i muli addomesticati possono essere dotati di sacche chinandosi e attaccando una cassa. Tali sacche possono essere usate mentre si cavalca o chinandosi.{*B*}{*B*} +Cavalli e asini (ma non i muli) possono essere allevati come gli altri animali usando mele d'oro o carote d'oro.{*B*} +I puledri diventano col tempo cavalli adulti, me nutrendoli di grano o fieno la loro crescita accelera.{*B*} + - - Salta + + {*T3*}COME SI GIOCA: FUOCHI ARTIFICIALI{*ETW*}{*B*}{*B*} +I Fuochi artificiali sono oggetti decorativi che possono essere lanciati a mano o mediante un Dispense. Sono creati usando Pepe, Polvere da sparo e un numero a scelta di Stelle per Fuochi artificiali{*B*} +Il colore, la dissolvenza, la forma, la dimensione e gli effetti (come scie e scintille) delle Stelle per fuochi artificiali possono essere personalizzati aggiungendo ingredienti durante la creazione.{*B*}{*B*} +Per creare un Fuoco artificiale metti Polvere da sparo e Carta nella griglia di creazione 3x3 in alto nel tuo inventario.{*B*} +Puoi anche mettere diverse Stelle per Fuochi artificiali nella griglia di creazione, per aggiungerli al nuovo Fuoco artificiale.{*B*} +Riempiendo più slot nella griglia di creazione con Polvere da sparo aumenterai l'altezza alla quale le Stelle esploderanno.{*B*}{*B*} +FNe Stelle di Fuochi artificiali si creano mettendo Polvere da sparo e Tintura nella griglia di creazione.{*B*} +- La tintura determina il colore dell'esplosione.{*B*} +- La forma della stella si imposta aggiungendo una Scarica di fuoco, una Pepita d'oro, una piuma o una testa.{*B*} +- Si può aggiungere una scia di scintille usando Diamante e Polvere di pietre brillanti.{*B*}{*B*} +Dopo aver creato una Stella per fuochi artificiali, puoi impostare il colore della dissolvenza della Stella con la tintura. + - - Salta/Vola su + + {*T3*}COME SI GIOCA: DROPPER{*ETW*}{*B*}{*B*} +Quando viene alimentato dalla pietra rossa, il Dropper fa scendere un oggetto a caso tra quelli che contiene. Usa {*CONTROLLER_ACTION_USE*} per aprire il Dropper così da poterlo caricare con oggetti del tuo inventario.{*B*} +Se il Dropper è direzionato verso una Cassa o un altro contenitore, l'oggetto verrà introdotto in esso. Si possono costruire lunghe catene di Dropper per trasportare oggetti a distanza. per fare ciò essi devono essere accesi e spenti alternativamente. + - - Inventario + + Quando viene usato, diventa una mappa della parte di mondo in cui ti trovi, che viene scoperta mano a mano che esplori. - - Scorri oggetti in mano + + Rilasciato da Avvizzito, usato per creare Raggi. - - Azione + + Hopper - - Usa + + {*T3*}COME SI GIOCA: HOPPER{*ETW*}{*B*}{*B*} +Gli hopper servono per mettere o togliere oggetti dai contenitori, e per raccogliere automaticamente oggetti lanciati dentro di essi.{*B*} +Funzionano con banchi di distillazione, casse, dispenser, dropper, carrelli da miniera con casse, carrelli da miniera con hopper e con altri hopper.{*B*}{*B*} +Gli hopper tentano continuamente di estrarre oggetti dai contenitori compatibili posti sopra di essi. Inoltre tentano di inserire gli oggetti immagazzinati nei contenitori di uscita.{*B*} +Se un hopper è alimentato da pietra rossa, diventerà inattivo e smetterà di risucchiare e inserire gemme.{*B*}{*B*} +Un hopper punta nella direzione in cui tenta di far uscire oggetti. Per farlo puntare a un blocco particolare, piazzalo contro questo blocco mentre sei in furtività.{*B*} + - - Crafting + + Dropper - - Posa + + NON USATA - - Furtività + + Guarigione istantanea - - Muoviti furtivamente/Vola giù + + Danno istantaneo - - Cambia modalità telecamera + + Salto potenziato - - Giocatori/Invito + + Fatica del minatore - - Movimento (durante il volo) + + Forza - - Layout 1 + + Debolezza - - Layout 2 + + Nausea - - Layout 3 + + NON USATA - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + NON USATA - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + NON USATA - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Rigenerazione - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Resistenza - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Ricerca di un Seme per il Generatore di mondi. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Quando è attivato, crea esplosioni colorate. Il colore, l'effetto, la forma e la dissolvenza sono determinati dalla Stella dei Fuochi Artificiali usata quando vengono creati i Fuochi Artificiali. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Un tipo di binario che può attivare o disattivare carrelli da miniera con hopper e innescare carrelli da miniera con TNT. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Si usa per conservare e distribuire oggetti, o mettere oggetti in un altro contenitore, quando riceve una carica di pietra rossa. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Blocchi colorati realizzati tingendo argilla indurita. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Fornisce una carica di pietra rossa. La carica sarà maggiore se ci sono più oggetti sul piatto. Richiede più peso di una piastra leggera. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Usato come fonte di energia per la pietra rossa. Può essere ritrasformato in pietra rossa. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Serve a catturare oggetti o a trasferirli da e verso i contenitori. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Cibo per cavalli, asini e muli che cura fino a 10 cuori. Accelera la crescita dei puledri. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Pipistrello - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Queste creature volanti si trovano nelle caverne e in altri grandi spazi chiusi. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Strega - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Risultato della cottura dell'argilla in una fornace. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Creata a partire da vetro e vernice. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Creata a partire da vetro dipinto - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Fornisce una carica di pietra rossa. La carica sarà maggiore se ci sono più oggetti sul piatto. - - {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + + È un blocco che emette un segnale di pietra rossa basato sulla luce del sole (o sulla mancanza della stessa). - - {*B*}Premi{*CONTROLLER_VK_A*} per avviare il tutorial.{*B*} - Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + + È un tipo speciale di carrello da miniera che funziona come un hopper. Raccoglie oggetti dai binari e dai contenitori soprastanti. - - In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. -Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 5 Armatura. - - Usa{*CONTROLLER_ACTION_LOOK*} per guardare su, giù e intorno. + + Usati per determinare il colore, l'effetto e la forma di un fuoco artificiale. - - Usa{*CONTROLLER_ACTION_MOVE*} per muoverti. + + Usato nei circuiti di pietra rossa per mantenere, comparare o sottrarre forza al segnale, o misurare gli stati di certi blocchi. - - 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. + + È un tipo di carrello da miniera che agisce come un blocco di TNT semovente. - - Premi{*CONTROLLER_ACTION_JUMP*} per saltare. + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 7 Armatura. - - 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... + + Serve per eseguire comandi. - - 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. + + Proietta un raggio di luce nel cielo e può causare effetti di stato ai giocatori vicini. - - Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting. + + Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. La cassa intrappolata inoltre crea una pietra rossa quando viene aperta. - - Man mano che raccogli e crei oggetti, l'inventario si riempie.{*B*} - Premi{*CONTROLLER_ACTION_INVENTORY*} per aprire l'inventario. + + Un tipo speciale di armatura che può essere indossata da un cavallo. Fornisce 11 Armatura. - - 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. + + Usato per legare nemici al giocatore o pali di recinzione. - - 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. + + Serve a dare nomi ai nemici. - - 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. + + Fretta - - 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*} + + Sblocca gioco completo - - Il legno ottenuto si può tagliare in assi. Apri l'interfaccia Crafting per crearle.{*PlanksIcon*} + + Riprendi gioco - - Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Crea un tavolo da lavoro.{*CraftingTableIcon*} + + Salva gioco - - Per velocizzare la raccolta di blocchi, puoi costruire attrezzi appositi. Alcuni attrezzi hanno un manico creato con dei bastoni. Crea dei bastoni.{*SticksIcon*} + + Gioca - - Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} per cambiare l'oggetto che tieni in mano. + + Classifiche - - Usa{*CONTROLLER_ACTION_USE*} per utilizzare gli oggetti, interagire e collocarli. Gli oggetti collocati possono essere raccolti scavando con l'attrezzo appropriato. + + Guida e opzioni - - Una volta selezionato il tavolo da lavoro, sposta il puntatore nel punto desiderato e usa{*CONTROLLER_ACTION_USE*} per collocarlo. + + Difficoltà: - - Sposta il puntatore sul tavolo da lavoro e premi{*CONTROLLER_ACTION_USE*} per aprirlo. + + PvP: - - 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*} + + Autorizza giocatori: - - L'ascia ti aiuta a tagliare più in fretta la legna e i blocchi di legno. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli. Crea un'ascia di legno.{*WoodenHatchetIcon*} + + TNT: - - 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*} + + Tipo di gioco: - - Apri il contenitore + + Strutture: - - La notte arriva in fretta ed è pericoloso restare all'aperto impreparati. Puoi creare armi e armature, ma conviene avere un riparo sicuro. + + Tipo di livello: - - Nelle vicinanze c'è un rifugio di minatori abbandonato che puoi completare entro sera. + + Nessuna partita trovata - - 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. + + Solo invito - - 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*} + + Altre opzioni - - Hai abbastanza ciottoli per costruire una fornace. Usa il tavolo da lavoro. + + Carica - - Usa{*CONTROLLER_ACTION_USE*} per collocare la fornace nel mondo, poi aprila. + + Opzioni host - - Usa la fornace per creare l'antracite. Mentre aspetti che sia pronta, che ne dici di raccogliere altri materiali per completare il rifugio? + + Giocatori/Invito - - Usa la fornace per creare del vetro. Mentre aspetti che sia pronto, che ne dici di raccogliere altri materiali per completare il rifugio? + + Partita online - - 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*} + + Nuovo mondo - - Usa{*CONTROLLER_ACTION_USE*} per collocare la porta. Puoi usare{*CONTROLLER_ACTION_USE*} per aprire e chiudere una porta di legno nel mondo. + + Giocatori - - Di notte è buio, quindi serve della luce per poterci vedere nel rifugio. Crea una torcia usando bastoni e antracite dall'interfaccia Crafting.{*TorchIcon*} + + Unisciti alla partita - - Hai completato la prima parte del tutorial. + + Avvia gioco - - {*B*} - Premi{*CONTROLLER_VK_A*} per continuare il tutorial.{*B*} - Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + + Nome mondo - - Questo è il tuo inventario. Mostra gli oggetti che puoi tenere in mano e quelli che trasporti, nonché la tua eventuale armatura. + + Seme per generatore mondo - - {*B*} - Premi{*CONTROLLER_VK_A*} per continuare.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario. + + Lascia vuoto per seme casuale - - 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à. + + Diffusione incendio: - - 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. + + Modifica messaggio cartello: - - Sposta il puntatore fuori dal bordo dell'interfaccia mentre è selezionato un oggetto per posarlo. + + Inserisci i dettagli del tuo screenshot - - Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_BACK*}. + + Didascalia - - Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario. + + Aiuti contestuali del gioco - - Questo è l'inventario della modalità Creativa. Mostra gli oggetti che hai in mano e tutti quelli a tua disposizione. + + 2 gioc. schermo diviso verticale - - {*B*} - Premi{*CONTROLLER_VK_A*} per continuare.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario della modalità Creativa. + + Fatto - - - 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. - + + Screenshot del gioco - - - 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. - + + Nessun effetto - - 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*}. + + Velocità - - Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto che vuoi prendere. + + Lentezza - - Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_BACK*}. + + Modifica messaggio cartello: - - Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario della modalità Creativa. + + Texture, icone e interfaccia classiche di Minecraft! - - Questa è l'interfaccia di Crafting (lavoro), che ti consente di combinare gli oggetti raccolti per crearne di nuovi. + + Mostra tutti i mondi Mash-up + + + Aiuti + + + Reinstalla oggetto avatar 1 + + + Reinstalla oggetto avatar 2 + + + Reinstalla oggetto avatar 3 + + + Reinstalla tema + + + Reinstalla immagine del giocatore 1 + + + Reinstalla immagine del giocatore 2 + + + Opzioni + + + Interfaccia utente + + + Ripristina predefinite + + + Vedi bobbing + + + Audio + + + Comando + + + Grafica + + + 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 usa come ingrediente per pozioni. + + + Si usa come ingrediente di pozioni. Cresce spontaneamente nelle Fortezze del Sottomondo. Si può piantare anche nelle Sabbie mobili. + + + Superficie scivolosa. Si trasforma in acqua se si trova sopra un altro blocco quando questo viene distrutto. Si scioglie se è vicino a una fonte di luce o se viene messo 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. + + + Può avere effetti diversi a seconda dell'oggetto su cui viene usata. + + + 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 pozioni bomba. + + + 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. + + + Una volta posizionato, cresce nel corso del tempo. Si può raccogliere usando le forbici. Ci si può salire come su una scala. + + + Simile a una porta, ma usato principalmente nelle recinzioni. + + + Può essere creata usando Fette di anguria. + + + Blocchi trasparenti che possono essere usati come alternativa ai blocchi di vetro. + + + 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. + + + Si possono piantare per far crescere delle zucche. + + + 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. + + + Si possono piantare per far crescere delle angurie. + + + 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. + + + Può essere riempito d'acqua con la pioggia o usando un secchio e quindi utilizzato per riempire Bottiglie di vetro. + + + 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. + + + 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. + + + Può essere coltivato per raccogliere Semi di cacao. + + + Mucca + + + Rilascia pelle quando viene uccisa. Si può anche mungere usando un secchio. + + + Pecora + + + 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. + + + Utile per appiccare il fuoco alle cose, o per scatenare incendi quando viene lanciata da un dispenser. + + + 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. + + + 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. + + + Si trova nelle Fortezze del Sottomondo. Quando viene distrutto, rilascia una Verruca del Sottomondo. + + + 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. + + + 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. + + + 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. + + + 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. + + + 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. + + + Per conservare le palle di neve in poco spazio. + + + 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 può scavare con una pala per creare palle di neve. + + + Può produrre semi di grano quando viene tagliato/a. + + + Si usa per creare tinture. + + + Si ottiene con la pala. A volte produce la selce. Subisce la gravità se sotto non ci sono altri blocchi. + + + 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 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 di ferro o migliore per ottenere polvere di pietra rossa. + + + 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 altri blocchi. + + + 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. + + + Si posa a terra per condurre elettricità. Quando viene incluso in una pozione aumenta la durata dell'effetto. + + + 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 pozioni o per fare pistoni appiccicosi. + + + Viene deposto casualmente dalle galline e si può usare per creare cibi. + + + Si ottiene scavando nella ghiaia e si può usare per creare acciarino e pietra focaia. + + + Si usa su un maiale per poterlo cavalcare. Il maiale può poi essere controllato usando una carota su un bastone. + + + Si ottiene scavando nella neve e si può lanciare. + + + Si ottiene estraendo la pietra luce e si può usare per creare blocchi di pietra luce o mettendolo nelle pozione per aumentare la potenza dell'effetto. + + + Quando si rompono, a volte fanno cadere un arbusto che può essere trapiantato per far crescere un albero. + + + Si trova nei sotterranei. Si può usare per costruire e decorare. + + + Si usa per ottenere lana dalle pecore e ottenere blocchi foglia. + + + 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. + + + Si ottiene dalle colture e si può usare per creare cibo. + + + Si può usare per produrre zucchero. + + + Si può indossare come elmo o unire a una torcia per creare una zucca di Halloween. Inoltre è l'ingrediente principale della torta di zucca. + + + Una volta accesa, brucia per sempre. + + + Le colture si possono mietere per ottenere grano. + + + Terreno pronto per piantare semi. + + + Si può cuocere in fornace per produrre tintura verde. + + + Rallenta il movimento di qualsiasi cosa ci passi sopra. + + + Si ottiene uccidendo una gallina e si usa per creare una freccia. + + + Si ottiene uccidendo un creeper e si usa per creare del TNT o come ingrediente per le pozioni. + + + Si possono piantare e coltivare su una zolla. Assicurati che vi sia luce a sufficienza per far crescere i semi! + + + 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 un arco o una canna da pesca, o messo a terra per creare un gancio allarme. + + + Rilascia lana quando viene tosata (se non è già stata tosata). Si può creare lana di vari colori usando le tinture. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Pala di ferro + + + Pala di diamante + + + Pala d'oro + + + Spada d'oro + + + Pala di legno + + + Pala di pietra + + + Piccozza di legno + + + Piccozza d'oro + + + Ascia di legno + + + Ascia di pietra + + + Piccozza di pietra + + + Piccozza di ferro + + + Piccozza di diamante + + + Spada di diamante + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Spada di legno + + + Spada di pietra + + + Spada di ferro + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Ti lancia sfere di fuoco che esplodono al contatto. + + + Slime + + + Se danneggiato, si divide in slime più piccoli. + + + Uomo-maiale zombie + + + Inizialmente docile, ma se ne colpisci uno verrai attaccato da un gruppo. + + + Ghast + + + Enderman + + + Ragno delle grotte + + + Il suo morso è velenoso. + + + Muccafungo + + + 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. + + + Ti attacca quando ti avvicini. + + + 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. + + + Gallina + + + Rilascia piume quando viene uccisa, inoltre a volte depone le uova. + + + Maiale + + + Creeper + + + Ragno + + + Ti attacca quando ti avvicini. Può arrampicarsi sui muri. Rilascia un pungiglione quando viene ucciso. + + + Zombie + + + Esplode se ti avvicini troppo! + + + Scheletro + + + Ti scocca contro delle frecce. Rilascia delle frecce quando viene ucciso. + + + Si usa con una Ciotola per preparare la Zuppa di funghi. Deposita funghi e diventa una mucca normale quando viene tosata. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Capo programmatore Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator - - {*B*} - Premi {*CONTROLLER_VK_A*}per continuare.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona il crafting. + + Grosso drago nero che si trova nel Limite. - - {*B*} - Premi{*CONTROLLER_VK_X*} per visualizzare la descrizione dell'oggetto. + + Vampe - - {*B*} - Premi{*CONTROLLER_VK_X*} per visualizzare gli ingredienti necessari per creare l'oggetto corrente. + + Nemici che si trovano nel Sottomondo, soprattutto all'interno delle Fortezze. Quando vengono uccisi, depositano Bacchette di Vampe. + + + 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 + + + Cubo di magma + + + 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. + + + Si trovano nel Sottomondo. Simili a Slime, si dividono in esemplari più piccoli quando vengono uccisi. + + + Abitante del villaggio + + + Ocelot + + + Permette la creazione di incantesimi più potenti quando viene piazzato intorno al Tavolo per incantesimi. + + + {*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*}Anguria 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: 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: 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*} +Posizionando 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 verranno visualizzati alcuni incantesimi e il livello di Esperienza che richiedono.{*B*} +Se hai abbastanza Esperienza per acquistare un incantesimo, la cifra apparirà in verde; in caso contrario, apparirà in rosso.{*B*}{*B*} +L'incantesimo verrà selezionato casualmente tra tutti gli incantesimi di costo uguale.{*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 per incantesimi scaturiranno dei simboli arcani.{*B*}{*B*} +Tutti gli ingredienti per un Tavolo per incantesimi possono essere trovati nei villaggi o ottenuti scavando e coltivando.{*B*}{*B*} +I Libri incantati vengono usati sull'incudine per applicare incantesimi agli oggetti. Ciò ti dà più controllo su quali incantesimi applicare ai tuoi oggetti.{*B*} + + + {*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: 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 o 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*} + +{*T2*}Ciclo solare{*ETW*}{*B*} + Se disattivato, l'ora del giorno non cambia.{*B*}{*B*} + + {*T2*}Mantieni inventario{*ETW*}{*B*} + Quando è attivato, i giocatori conservano il loro inventario quando muoiono.{*B*}{*B*} + + {*T2*}Rigenerazione nemici{*ETW*}{*B*} + Quando è disattivato, i nemici non si rigenerano naturalmente.{*B*}{*B*} + + {*T2*}Scorrettezza nemici{*ETW*}{*B*} + Quando è disattivato, impedisce a mostri e animali di modificare i blocchi (ad esempio, le esplosioni dei creeper non distruggono blocchi e le pecore non rimuovono l'erba) e di raccogliere oggetti.{*B*}{*B*} + + {*T2*}Bottino nemici{*ETW*}{*B*} + Quando è attivato, mostri e animali non rilasciano oggetti (ad esempio, i creeper non rilasciano polvere da sparo).{*B*}{*B*} + + {*T2*}Posa tessere{*ETW*}{*B*} + Quando è disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (ad esempio, i blocchi di pietra non rilasciano ciottoli).{*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, verrà 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*} + + {*T2*}Ripristina sottomondo{*ETW*}{*B*} + Se l'opzione è attivata, il Sottomondo viene rigenerato. Utile se hai un vecchio salvataggio nel quale le fortezze del Sottomondo non erano presenti.{*B*}{*B*} + +{*T1*}Opzioni di gioco{*ETW*}{*B*} +Durante la partita, premi {*BACK_BUTTON*} per aprire il menu di gioco, dove potrai accedere a diverse opzioni.{*B*}{*B*} + + {*T2*}Opzioni dell'host{*ETW*}{*B*} + L'host e tutti i giocatori identificati come moderatori possono accedere al menu "Opzioni host" e 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*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Quando l'opzione è attivata, 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. {*B*}{*B*} + + {*T2*}Può usare porte e interruttori{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di usare né le porte né gli interruttori. {*B*}{*B*} + + {*T2*}Può aprire contenitori{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di aprire i contenitori, come le casse. {*B*}{*B*} + + {*T2*}Può attaccare i giocatori{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, impedisce al giocatore di causare danni agli altri utenti. {*B*}{*B*} + + {*T2*}Può attaccare animali{*ETW*}{*B*} +Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di infliggere danni agli animali. {*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*} + {*KICK_PLAYER_DESCRIPTION*}{*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 scendere 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ò teletrasportarsi{*ETW*}{*B*} + Permette al giocatore di muovere se stesso o altri giocatori presso altri giocatori nel mondo. + + + Pagina successiva + + + {*T3*}COME GIOCARE: ALLEVARE GLI ANIMALI{*ETW*}{*B*}{*B*} +Se vuoi che gli animali rimangano nel solito posto, crea una zona recintata non più grande 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 a un maiale, 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: 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. + + + Hai partecipato alla Minecon? + + + Nessuno alla Mojang ha mai visto la faccia di junkboy. + + + Sapevi che c'è anche una Wiki di Minecraft? + + + Non guardare direttamente i bug. + + + I creeper sono il risultato di un bug di codifica. + + + È una gallina o un'anatra? + + + Il nuovo ufficio di Mojang è fico! - - {*B*} - Premi{*CONTROLLER_VK_X*} per visualizzare di nuovo l'inventario. + + {*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. - - 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. + + {*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).{*B*} +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. - - L'area crafting mostra gli elementi richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. + + {*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, oppure premi{*CONTROLLER_VK_X*} per raccoglierne soltanto la metà.{*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 o{*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*} +È possibile cambiare il colore dell'armatura di pelle tingendola; puoi farlo nel menu inventario tenendo la tintura con il puntatore e premendo{*CONTROLLER_VK_X*} mentre il puntatore si trova sul pezzo che desideri tingere. - - 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 Minecon 2013 si è svolta a Orlando, Florida, USA! - - 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. + + .party() è stato fantastico! - - Ora è visualizzata la descrizione dell'oggetto selezionato, che ti dà un'idea del suo possibile utilizzo. + + Invece di dare credito ai pettegolezzi, dai sempre per scontato che siano falsi! - - Ora è visualizzato l'elenco degli ingredienti necessari per creare l'oggetto selezionato. + + Pagina precedente - - Il legno ottenuto si può tagliare in assi. Seleziona l'icona delle assi e premi{*CONTROLLER_VK_A*} per crearle.{*PlanksIcon*} + + Commercio - - 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. + + Incudine - - Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo attrezzi.{*ToolsIcon*} + + Limite - - Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo strutture.{*StructuresIcon*} + + Esclusione di livelli - - 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*} + + Modalità Creativa - - 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*} + + Opzioni dell'host e del giocatore - - 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. + + {*T3*}COME GIOCARE: IL LIMITE{*ETW*}{*B*}{*B*} +Il Limite è un'altra dimensione del gioco che può essere raggiunta tramite il Portale del Limite. Puoi trovare il portale in una fortezza nelle profondità del Sopramondo.{*B*} +Per attivare il portale è necessario disporre l'Occhio di Ender in un qualunque Telaio di un portale del Limite vuoto.{*B*} +Una volta attivo, puoi attraversare il portale per raggiungere il Limite.{*B*}{*B*} +Nel Limite incontrerai il Drago di Ender, nemico forte e fiero, oltre agli Enderman, sarà quindi necessario prepararsi a dovere prima di intraprendere il viaggio!{*B*}{*B*} +Scoprirai che ci sono i Cristalli di Ender sulle punte di ossidiana che il Drago di Ender usa per rigenerarsi, il primo passo sarà quindi distruggerli uno per uno.{*B*} +Puoi colpire i primi con le frecce, gli altri invece sono protetti da una gabbia di metallo, dovrai quindi avvicinarti.{*B*}{*B*} +Nel frattempo il Drago di Ender ti attaccherà in volo e ti lancerà palle di acido!{*B*} +Se ti avvicini all'uovo al centro delle punte, il Drago di Ender scenderà in picchiata per affrontarti e sarà quello il momento giusto per la tua controffensiva!{*B*} +Evita l'acido, mira agli occhi del Drago. Porta degli amici con te, se possibile, per affrontare insieme la battaglia e vincerla!{*B*}{*B*} +Una volta giunti nel Limite, i tuoi amici potranno vedere l'ubicazione del Portale all’interno della fortezza sulla loro mappa, e raggiungerti facilmente. - - Alcuni oggetti non possono essere creati con il tavolo da lavoro, ma è necessaria una fornace. Ora crea una fornace.{*FurnaceIcon*} + + {*ETB*}Bentornato! Forse non lo sai, ma Minecraft è appena stato aggiornato.{*B*}{*B*} +Ci sono tante nuove funzionalità per te e i tuoi amici, ecco un assaggio. Dai un'occhiata e preparati a divertirti!{*B*}{*B*} +{*T1*}Nuovi oggetti{*ETB*} - Argilla indurita, Argilla dipinta, Blocco di carbone, Binario attivatore, Blocco di pietra rossa, Sensore luce solare, Dropper, Hopper, Carrello da miniera con hopper, Carrello da miniera con TNT, Comparatore di pietra rossa, Piastra a pressione pesata, Raggio, Cassa intrappolata, Razzo per fuochi artificiali, Stella per fuochi artificiali, Stella del Sottomondo, Guinzaglio, Armatura da cavallo, Targhetta del nome, Uovo di generazione cavalli.{*B*}{*B*} +{*T1*}Nuovi Mob{*ETB*} - Wither, Scheletri avvizziti, streghe, pipistrelli, cavalli, asini e muli.{*B*}{*B*} +{*T1*}Nuove funzioni{*ETB*} - Addomestica e cavalca un cavallo, crea fuochi artificiali, dai un nome ad animali e mostri con una Targhetta del nome, crea circuiti di pietra rossa più avanzati e nuove opzioni per permettere all'host di controllare cosa possono fare gli ospiti del suo mondo!{*B*}{*B*} +{*T1*}Nuovo mondo tutorial{*ETB*} – Impara a usare le funzioni vecchie e nuove nel mondo Tutorial. Vediamo se riesci a trovare tutti i cd musicali segreti nel mondo Tutorial!{*B*}{*B*} - - Colloca la fornace creata nel mondo. Ti conviene metterla nel tuo rifugio.{*B*} - Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. + + Infligge un danno maggiore della mano. - - Questa è l'interfaccia fornace, dove puoi modificare gli oggetti attraverso il fuoco. Per esempio, puoi trasformare il minerale di ferro in lingotti di ferro. + + Serve per scavare terra, erba, sabbia, ghiaia e neve più in fretta che a mano. Le pale servono per scavare palle di neve. - - {*B*} - Premi{*CONTROLLER_VK_A*} per continuare.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come si usa la fornace. + + Scatto - - 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. + + Novità - - 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. + + {*T3*}Modifiche e aggiunte{*ETW*}{*B*}{*B*} +- Aggiunti nuovi oggetti - Argilla indurita, Argilla dipinta, Blocco di carbone, Binario attivatore, Blocco di pietra rossa, Sensore luce solare, Dropper, Hopper, Carrello da miniera con hopper, Carrello da miniera con TNT, Comparatore di pietra rossa, Piastra a pressione pesata, Raggio, Cassa intrappolata, Razzo per fuochi artificiali, Stella per fuochi artificiali, Stella del Sottomondo, Guinzaglio, Armatura da cavallo, Targhetta del nome, Uovo di generazione cavalli{*B*} +- Aggiunti nuovi nemici - Wither, Scheletri avvizziti, streghe, pipistrelli, cavalli, asini e muli{*B*} +- Aggiunta l'interfaccia cavallo{*B*} +- Aggiunta l'interfaccia Hopper{*B*} +- Aggiunti i fuochi artificiali - L'interfaccia fuochi artificiali è accessibile dal tavolo da lavoro se possiedi gli ingredienti per creare una Stella per fuochi artificiali o un Razzo per fuochi artificiali{*B*} +- Aggiunta la 'modalità Avventura' - Puoi rompere i blocchi solo con gli attrezzi adatti{*B*} +- Aggiunti tanti nuovi suoni{*B*} +- Nemici, oggetti e proiettili ora possono passare attraverso i portali{*B*} +- Ora i Ripetitori possono essere bloccati alimentandone i lati con un altro Ripetitore{*B*} +- Ora zombie e scheletri possono apparire con diverse armi e armature{*B*} +- Nuovi messaggi di morte{*B*} +- Battezza i nemici con la Targhetta del nome, e rinomina i contenitori per cambiarne il titolo quando si apre il menu{*B*} +- La Farina d'ossa non cresce più istantaneamente, ma a scatti casuali.{*B*} +- Un segnale di pietra rossa che descrive il contenuto di casse, banchi di distillazione, dispenser e jukebox è rilevabile piazzando un rilevatore di pietra rossa a contatto con esso{*B*} +- I dispenser possono essere rivolti in ogni direzione{*B*} +- Mangiare una mela d'oro permette al giocatore di "assorbire" salute per un breve periodo.{*B*} +- Più a lungo rimani in un'area e più è difficile che i mostri si rigenerino in quell'area{*B*} + + - - Gli oggetti nell'area di produzione possono essere trasferiti nell'inventario. Sperimenta con diversi ingredienti e vedi cosa riesci a creare. + + Condivisione di screenshot - - 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. + + Casse - - L'antracite può essere usata come combustibile o combinata con un bastone per creare una torcia. + + Crafting - - Inserisci la sabbia nello slot ingrediente per produrre del vetro. Crea dei blocchi di vetro da usare come finestre nel tuo rifugio. + + Fornace - - Questa è l'interfaccia di distillazione. Puoi usarla per creare pozioni di vario tipo. + + Basi - - {*B*} - Premi{*CONTROLLER_VK_A*} per continuare.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come si usa il Banco di distillazione. + + Interfaccia - - 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. + + Inventario - - 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. + + Dispenser - - È 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. + + Incantesimi - - 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. + + Sottoportale - - 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. + + Multiplayer - - Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia di distillazione. + + Allevare gli animali - - In quest'area troverai un Banco di distillazione, un Calderone e una cassa pieni di oggetti da utilizzare per la preparazione di pozioni. + + Riproduzione animali - - {*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. + + Distillazione - - Prima di poter distillare una pozione, devi creare una Bottiglia d'acqua. Prendi una Bottiglia di vetro dalla cassa. + + A deadmau5 piace Minecraft! - - 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*}. + + Gli uomini-maiale non attaccano, a meno che non vengano attaccati per primi. - - Se il Calderone si svuota, puoi riempirlo con un Secchio d'acqua. + + Puoi modificare il punto di generazione del gioco e saltare all'alba dormendo in un letto. - - 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. + + Rispondi all'attacco del ghast con queste palle di fuoco! - - - 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 pozioni bomba aggiungendo polvere da sparo a una pozione normale. + + Costruisci delle torce per fare luce durante la notte. I mostri staranno alla larga dalle aree illuminate. - - Usa la Pozione di Resistenza al fuoco su te stesso. + + Arriva prima a destinazione con un carrello da miniera e un binario! - - Ora che sei resistente al fuoco e alla lava, approfittane per raggiungere dei luoghi che prima ti risultavano inaccessibili. + + Pianta degli arbusti e cresceranno fino a diventare alberi. - - Questa è l'interfaccia degli incantesimi. Puoi usarla per incantare armi, armature e alcuni attrezzi. + + Costruendo un portale potrai accedere a un'altra dimensione, il Sottomondo. - - {*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. + + Scavare in linea retta verso l'alto o verso il basso non è una grande idea. - - 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. + + La farina d'ossa (creata da un osso di scheletro) può essere utilizzata come fertilizzante e tutto crescerà in un istante! - - Quando un oggetto viene posizionato nello slot di incantamento, i pulsanti a destra mostreranno una selezione casuale di incantesimi. + + I creeper esplodono man mano che ti si avvicinano! - - 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. + + Premi{*CONTROLLER_VK_B*} per far cadere l'oggetto che stai tenendo in mano! - - Seleziona un incantesimo e premi{*CONTROLLER_VK_A*} per applicarlo all'oggetto. Il costo dell'incantesimo verrà detratto dai tuoi punti Esperienza. + + Usa l'attrezzo giusto per il lavoro giusto! - - 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. + + Se non trovi il carbone per le torce, puoi sempre crearne un po' utilizzando gli alberi e la fornace. - - In quest'area troverai un Tavolo per incantesimi e alcuni altri oggetti che potrai utilizzare per familiarizzarti con questa nuova funzionalità. + + Le costolette di maiale arrostite reintegrano più salute di quelle crude. - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sugli incantesimi.{*B*} - Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + Impostando la difficoltà del gioco su Relax, la salute verrà reintegrata automaticamente e di notte non usciranno mostri! - - 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. + + Dai un osso a un lupo per ammansirlo. Potrai chiedergli di sedersi o di seguirti. - - Posizionare degli scaffali intorno al Tavolo per incantesimi ne aumenta la potenza e consente di accedere agli incantesimi di livello più alto. + + Per mettere degli oggetti nel menu Inventario, sposta il cursore dal menu e premi{*CONTROLLER_VK_A*} - - 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. + + Sono disponibili nuovi contenuti scaricabili! Per accedervi, seleziona il pulsante Negozio di Minecraft nel menu principale. - - 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. + + Puoi cambiare l'aspetto del tuo personaggio con il pacchetto Skin disponibile nel Negozio di Minecraft. Seleziona "Negozio di Minecraft" nel menu principale per sapere che cosa è disponibile. - - 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. + + Modifica le impostazioni gamma per aumentare o diminuire la luminosità del gioco. - - Ora viaggi in un carrello da miniera. Per smontare, punta il cursore verso il carrello e premi{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + Se di notte dormi in un letto, il gioco scorrerà fino all'alba, ma i giocatori in modalità multiplayer devono dormire in un letto contemporaneamente. - - {*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. + + Usa una zappa per preparare un appezzamento di terreno pronto per la coltura. - - Il carrello da miniera viaggia sui binari. Puoi creare un carrello potenziato usando una fornace e un carrello da miniera contenente una cassa. - {*RailIcon*} + + I ragni non attaccano durante il giorno, a meno che non vengano attaccati per primi. - - 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*} + + Se per scavare nella terra o nella sabbia usi una vanga invece delle mani farai più in fretta! - - Ora navighi su una barca. Per scendere, punta il cursore verso la barca e premi{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + Ottieni costolette di maiale dai maiali, cucinale e mangiale per reintegrare la salute. - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla barca.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona la barca. + + Ottieni della pelle dalle mucche e usala per costruire un'armatura. - - La barca consente di viaggiare velocemente sull'acqua. Per virare, usa{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} + + Se hai un secchio vuoto, puoi riempirlo di latte di mucca, acqua o lava! - - Ora stai utilizzando la canna da pesca. Premi{*CONTROLLER_ACTION_USE*} per usarla.{*FishingRodIcon*} + + L'ossidiana si crea quando l'acqua entra in contatto con un blocco di lava. - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla pesca.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona la pesca. + + Il gioco ora contiene recinzioni impilabili! - - Premi{*CONTROLLER_ACTION_USE*} per lanciare la lenza e iniziare a pescare. Premi di nuovo{*CONTROLLER_ACTION_USE*} per tirare la lenza. - {*FishingRodIcon*} + + Alcuni animali ti seguiranno se hai del grano in mano. - - 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*} + + Se un animale non può spostarsi per più di 20 blocchi in qualsiasi direzione non sparirà. - - 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*} + + Lo stato di salute dei lupi addomesticati è riconoscibile dalla posizione della coda. Dagli della carne per curarli. - - Questo è un letto. Premi{*CONTROLLER_ACTION_USE*} mentre punti verso di esso di notte per dormire e risvegliarti il mattino successivo.{*ICON*}355{*/ICON*} + + Cuoci un cactus in una fornace per ottenere tintura verde. - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sul letto.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona il letto. + + Per le ultime informazioni sugli aggiornamenti del gioco, leggi la sezione Novità nei menu Come giocare. - - 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*} + + Musica di C418! - - Se ci sono altri giocatori nel gioco, per dormire devono essere tutti a letto nello stesso momento. - {*ICON*}355{*/ICON*} + + Chi è Notch? - - In quest'area ci sono dei semplici circuiti con pietre rosse e pistoni, oltre a un forziere contenente altri oggetti per ampliare i circuiti. + + La Mojang ha più premi che dipendenti! - - {*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. + + Alcune celebrità giocano a Minecraft! - - 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. + + Oltre un milione di persone segue Notch su Twitter! - - 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. + + Non tutti gli svedesi sono biondi. Alcuni, come Jens della Mojang, hanno addirittura i capelli rossi! - - - La polvere di pietrarossa si ottiene estraendo il minerale di pietrarossa con una piccozza di ferro, diamante o oro. Puoi usarla per migliorare fino a 15 blocchi e può salire o scendere di un blocco in altezza. - {*ICON*}331{*/ICON*} - + + Presto sarà disponibile un aggiornamento per questo gioco! - - - I ripetitori a pietrarossa si usano per alimentare a distanza o per inserire un ritardo in un circuito. - {*ICON*}356{*/ICON*} - + + Colloca due casse vicine per creare una cassa grande. - - - 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*} - + + Fai attenzione quando costruisci strutture di lana all'aria aperta: i fulmini dei temporali possono incendiarle. - - 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. + + Usa un secchio di lava in una fornace per fondere 100 blocchi. - - In quest'area c'è un Portale per il Sottomondo! + + Lo strumento suonato dal blocco nota dipende dal materiale sottostante. - - {*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. + + Una volta rimosso il blocco di lava, servono alcuni minuti prima che quest'ultima scompaia COMPLETAMENTE. - - I Portali si creano posizionando blocchi di ossidiana in una struttura larga quattro blocchi e alta cinque. I blocchi d'angolo non sono necessari. + + Il pietrisco non subisce danni dalle palle di fuoco dei ghast, quindi è utile per proteggere i portali. - - 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. + + I blocchi utilizzabili come fonti di luce sciolgono neve e ghiaccio. Tra questi vi sono torce, pietre brillanti e zucche di Halloween. - - 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. + + Zombie e scheletri possono sopravvivere alla luce del giorno, se si trovano nell'acqua. - - 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. + + Le galline depongono uova a intervalli di 5-10 minuti. - - Si può usare il Sottomondo per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo. + + L'ossidiana si scava solo con una piccozza di diamante. - - Ora sei in modalità Creativa. + + I creeper sono la fonte di polvere da sparo più facile da ottenere. - - {*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. + + Se attacchi un lupo, gli altri membri del branco si rivolteranno e ti assaliranno. Questo vale anche per gli uomini-maiali zombie. - - 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. + + I lupi non possono accedere al Sottomondo. - - Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia dell'inventario in modalità Creativa. + + I lupi non attaccano i creeper. - - Raggiungi l'altra estremità di questo fosso per continuare. + + Serve per scavare blocchi di pietra e minerali. - - Hai completato il tutorial della modalità Creativa. + + Si usa nel ricettario di torte, come ingrediente per fare pozioni. - - In quest'area è stata allestita una fattoria. Coltivare la terra ti permette di avere una fonte rinnovabile di cibo e altri oggetti. + + Accendila o spegnila per generare una scarica elettrica. Rimane accesa o spenta finché non la premi di nuovo. - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla coltivazione.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona. + + 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. - - Grano, Zucche e Angurie 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. + + Reintegra 2{*ICON_SHANK_01*} e si può usare per creare una mela d'oro. - - Prima di poter procedere alla semina, devi lavorare i blocchi di terra con la Zappa per trasformarli in Zolle. Con una fonte d'aqua nei pressi (che tenga le zolle umide), e illuminando l'area, i raccolti cresceranno più rapidamente. + + Reintegra 2{*ICON_SHANK_01*} e rigenera la salute per 4 secondi. Si crea con una mela e pepite d'oro. - - 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*} + + Reintegra 2{*ICON_SHANK_01*}, ma può farti star male. - - Zucche e Angurie 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. + + Si usa nei circuiti a pietre rosse come ripetitore, ritardante e/o diodo. - - 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*} + + Si usano per guidare i carrelli da miniera. - - 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*} + + Accesi, fanno accelerare i carrelli da miniera che ci passano sopra. Spenti, fanno fermare i carrelli da miniera. - - 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*} + + Funzionano come la piastra a pressione (inviano un segnale pietra rossa mentre sono in funzione) ma sono attivabili solo dal carrello da miniera. - - 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*} + + Premilo per generare una scarica elettrica. Rimane attivo per circa un secondo prima di spegnersi di nuovo. - - Hai completato il tutorial sulla coltivazione. + + Si usa per conservare e distribuire oggetti in ordine casuale quando riceve una carica di pietra rossa. - - 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. + + Quando si attiva, suona una nota. Colpiscilo per cambiare tonalità. Mettilo sopra blocchi diversi per cambiare il tipo di strumento. - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sulla riproduzione.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già come funziona. + + Reintegra 2.5{*ICON_SHANK_01*}. Si crea cucinando pesce crudo in una fornace. - - Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto. + + Reintegra 1{*ICON_SHANK_01*}. - - Dai grano a una mucca, muccafungo o pecora, carote ai maiali, chicchi 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. + + Reintegra 1{*ICON_SHANK_01*}. - - 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. + + Reintegra 3{*ICON_SHANK_01*}. - - Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore. + + Si usa come munizione per l'arco. - - 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*} + + Reintegra 2.5{*ICON_SHANK_01*}. - - - I lupi selvatici possono essere addomesticati dando loro delle ossa. Una volta addomesticati, appariranno dei cuori intorno ad essi. I lupi addomesticati seguiranno il giocatore e lo difenderanno, se non è stato loro ordinato di restare seduti. - + + Reintegra 1{*ICON_SHANK_01*}. Utilizzabile 6 volte. - - Hai completato il tutorial sulla riproduzione. + + Reintegra 1{*ICON_SHANK_01*}, ma può farti star male. Cucinare in una fornace. - - In questa area ci sono zucche e blocchi per creare un golem di neve e uno di ferro. + + Reintegra 1.5{*ICON_SHANK_01*}. Cucinare in una fornace. - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sui golem.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già tutto sui golem. + + Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando una costoletta di maiale in una fornace. - - I golem si creano sistemando una zucca in cima a una pila di blocchi. + + Reintegra 1{*ICON_SHANK_01*} o cuocere in una fornace. Può essere dato a un ocelot per ammansirlo. - - 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. + + Reintegra 3{*ICON_SHANK_01*}. Si ottiene cucinando pollo crudo in una fornace. - - 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. + + Reintegra 1.5{*ICON_SHANK_01*}. Cucinare in una fornace. - - I golem di ferro compaiono per aiutare i villaggi e ti attaccheranno se proverai ad attaccare un abitante. + + Reintegra 4{*ICON_SHANK_01*}. Si ottiene cucinando carne cruda in una fornace. - - Non puoi abbandonare l'area finché non avrai completato il tutorial. + + Trasporta te, un animale o un mostro sui binari. - - Attrezzi diversi sono indicati per materiali diversi. Usa la pala per scavare materiali cedevoli come terra e sabbia. + + Si usa come tintura per creare lana azzurra. - - Attrezzi diversi sono indicati per materiali diversi. Usa l'ascia per abbattere gli alberi. + + Si usa come tintura per creare lana turchese. - - 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. + + Si usa come tintura per creare lana viola. - - Alcuni attrezzi sono perfetti per attaccare i nemici. La spada è uno di questi. + + Si usa come tintura per creare lana verde lime. - - 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... + + Si usa come tintura per creare lana grigia. - - 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. + + 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.) - - Tieni premuto{*CONTROLLER_ACTION_JUMP*} per nuotare verso l'alto. + + Si usa come tintura per creare lana magenta. - - 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. + + Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. - - 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. + + Si usa per creare libri e mappe. - - 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. + + Si usa per creare una libreria o viene incantato per fare Libri incantati. - - 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ù. + + Si usa come tintura per creare lana blu. - - Se sposti il puntatore fuori dall'interfaccia mentre trasporti un oggetto, puoi posarlo. + + Suona dischi. - - Non hai tutti gli ingredienti necessari per creare questo oggetto. La casella in basso a sinistra mostra gli ingredienti necessari. + + Utilizzabile per creare attrezzi, armi o armature molto robusti. - - 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! + + Si usa come tintura per creare lana arancione. - - {*EXIT_PICTURE*} Quando sarai pronto a proseguire l'esplorazione, vicino al rifugio del minatore troverai una scala che conduce a un piccolo castello. + + Si ottiene dalle pecore e si può colorare con le tinture. - - Promemoria: + + Si usa come materiale da costruzione e si può colorare con le tinture. Ricetta sconsigliata, in quanto la lana è facilmente ottenibile dalle pecore. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Si usa come tintura per creare lana nera. - - Nell'ultima versione del gioco, sono state aggiunte nuove funzionalità, tra cui nuove aree nel mondo tutorial. + + Si usa per trasportare merci sui binari. - - {*B*}Premi{*CONTROLLER_VK_A*} per giocare normalmente il tutorial.{*B*} - Premi{*CONTROLLER_VK_B*} per saltare il tutorial principale. + + Si muove sui binari e spinge altri carrelli da miniera se ci metti del carbone. - - In quest'area, troverai delle zone che ti aiuteranno a scoprire la pesca, le barche, i pistoni e le pietre rosse. + + Si usa per spostarsi sull'acqua più velocemente che a nuoto. - - Fuori da quest'area, troverai esempi di edifici, coltivazioni, carrelli da miniera e binari, oltre a incantesimi e pozioni da distillare! + + Si usa come tintura per creare lana verde. - - La tua barra del cibo è scesa a un livello troppo basso e non potrai più recuperare energia. + + Si usa come tintura per creare lana rossa. - - {*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. + + Si usa per far crescere immediatamente colture, alberi, erba alta, funghi giganti e fiori e si impiega nelle ricette delle tinture. - - Seleziona + + Si usa come tintura per creare lana rosa. - - Usa + + Si usano come tintura per creare lana marrone, come ingrediente nei biscotti, o per coltivare cacao. - - Indietro + + Si usa come tintura per creare lana argento. - - Esci + + Si usa come tintura per creare lana gialla. - - Annulla + + Consente attacchi a distanza con le frecce. - - Annulla accesso + + Dà all'utilizzatore Armatura 5 se indossato. - - Aggiorna elenco partite + + Dà all'utilizzatore Armatura 3 se indossato. - - Giochi Party + + Dà all'utilizzatore Armatura 1 se indossato. - - Tutti i giochi + + Dà all'utilizzatore Armatura 5 se indossato. - - Cambia gruppo + + Dà all'utilizzatore Armatura 2 se indossato. - - Mostra inventario + + Dà all'utilizzatore Armatura 2 se indossato. - - Mostra descrizione + + Dà all'utilizzatore Armatura 3 se indossato. - - Mostra ingredienti + + Lingotto lucente utilizzabile per creare oggetti di questo materiale. Si crea fondendo minerali nella fornace. - - Crafting + + Consente di trasformare lingotti, gemme o tinture in blocchi collocabili. Si può usare come blocco da costruzione costoso o come magazzino compatto per minerali. - - Crea + + 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. - - Prendi/Colloca + + Dà all'utilizzatore Armatura 8 se indossato. - - Prendi + + Dà all'utilizzatore Armatura 6 se indossato. - - Prendi tutto + + Dà all'utilizzatore Armatura 3 se indossato. - - Prendi metà + + Dà all'utilizzatore Armatura 6 se indossato. - - Colloca + + Le porte di ferro si aprono solo con pietra rossa, pulsanti o interruttori. - - Colloca tutti + + Dà all'utilizzatore Armatura 1 se indossato. - - Colloca uno + + Dà all'utilizzatore Armatura 3 se indossato. - - Posa + + Si usa per abbattere blocchi di legno più in fretta che a mano. - - Posa tutti + + Si usa per arare blocchi di terra ed erba e prepararli per il raccolto. - - Posa uno + + Le porte di legno si attivano usandole, colpendole o con una pietra rossa. - - Scambia + + Dà all'utilizzatore Armatura 2 se indossato. - - Spost. veloce + + Dà all'utilizzatore Armatura 4 se indossato. - - Elimina scelta rapida + + Dà all'utilizzatore Armatura 1 se indossato. - - Cos'è? + + Dà all'utilizzatore Armatura 2 se indossato. - - Condividi su Facebook + + Dà all'utilizzatore Armatura 1 se indossato. - - Cambia filtro + + Dà all'utilizzatore Armatura 2 se indossato. - - Invia richiesta amico + + Dà all'utilizzatore Armatura 5 se indossato. - - Pagina giù + + Si usa per le scale compatte. - - Pagina su + + Serve per conservare la zuppa di funghi. Una volta mangiata, la ciotola rimane. - - Avanti + + Si usa per contenere e trasportare acqua, lava e latte. - - Indietro + + Si usa per contenere e trasportare acqua. - - Espelli giocatore + + Mostra il testo scritto da te o da altri giocatori. - - Tingi + + Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. - - Scava + + Si usa per provocare esplosioni. Una volta collocato, si attiva accendendolo con un oggetto acciarino e pietra focaia, o con una scarica elettrica. - - Nutri + + Si usa per contenere e trasportare lava. - - Addomestica + + Mostra la posizione del sole e della luna. - - Cura + + Indica il punto iniziale. - - Siediti + + Mentre la tieni in mano, crea un'immagine di un'area esplorata. Può essere utile per orientarti. - - Seguimi + + Si usa per contenere e trasportare latte. - - Espelli + + Si usa per creare il fuoco, accendere TNT e aprire un portale dopo averlo costruito. - - Svuota + + Si usa per pescare. - - Sella + + Si attiva usandola, colpendola o con una pietra rossa. Funziona come una porta normale, ma è un blocco di 1x1 appiattito sul terreno. - - Colloca + + Si usano come materiali da costruzione e per creare diversi oggetti. Si possono creare da qualsiasi forma di legno. - - Colpisci + + Si usa come materiale da costruzione. Non subisce la gravità come la sabbia normale. - - Mungi + + Si usa come materiale da costruzione. - - Raccogli + + Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. - - Mangia + + Usato per fare scale lunghe. Due lastre piazzate una sull'altra creano un normale blocco a doppia lastra. - - Dormi + + La torcia si usa per fare luce, nonché per sciogliere neve e ghiaccio. - - Svegliati + + Si usa per creare torce, frecce, cartelli, scale a pioli, recinzioni e come maniglia per attrezzi e armi. - - Suona + + Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. - - Cavalca + + 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. - - Naviga + + Si usa per salire in verticale. - - Coltiva + + 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. - - Nuota su + + Consente di creare una selezione di oggetti più vasta rispetto alla normale schermata crafting. - - Apri + + Consente di fondere minerali, creare antracite e vetro e cuocere pesce e costolette di maiale. - - Cambia tonalità + + Ascia di ferro - - Fai esplodere + + Lampada di pietra rossa - - Leggi + + Scala di legno (giungla) - - Appendi + + Scale di legno di betulla - - Lancia + + Comandi attuali - - Pianta + + Teschio - - Ara + + Cacao - - Mieti + + Scale di legno di abete - - Continua + + Uovo di drago - - Sblocca gioco completo + + Pietra del Limite - - Elimina salvataggio + + Telaio per Portale del Limite - - Elimina + + Scala di arenaria - - Opzioni + + Felce - - Invita amici + + Arbusto - - Accetta + + Layout - - Tosa + + Crafting - - Escludi livello + + Usa - - Seleziona skin + + Azione - - Accendi + + Muoviti furtivamente/Vola giù - - Naviga + + Furtività - - Installa versione completa + + Posa - - Installa versione di prova + + Scorri oggetti in mano - - Installa + + Pausa - - Reinstalla + + Guarda - - Opzioni dati + + Muoviti/Scatta - - Esegui comando + + Inventario - - Creativa + + Salta/Vola su - - Sposta ingrediente + + Salta - - Sposta combustibile + + Portale del Limite - - Sposta attrezzo + + Picciolo di zucca - - Sposta armatura + + Anguria - - Sposta arma + + Lastra di vetro - - Equipaggia + + Cancello per recinzioni - - Tendi + + Rampicanti - - Rilascia + + Picciolo di melone - - Privilegi + + Barre di ferro - - Parata + + Mattoni di pietra lesionati - - Pagina su + + Mattoni di pietra muschiosi - - Pagina giù + + Mattoni di pietra - - Modalità Amore + + Fungo - - Bevi + + Fungo - - Ruota + + Mattoni di pietra cesellati - - Nascondi + + Scale di mattoni - - Libera tutti gli slot + + Verruca del Sottomondo - - OK + + Scale di mattoni Sottomondo - - Annulla + + Recinz. mattoni Sottomondo - - Negozio di Minecraft + + Calderone - - Vuoi davvero uscire dalla partita attuale e accedere a quella nuova? Tutti i progressi non salvati andranno persi. + + Banco di distillazione - - Esci dal gioco + + Tavolo per incantesimi - - Salva gioco + + Mattone del Sottomondo - - Esci senza salvare + + Ciottolo Pesciolino d'argento - - Vuoi davvero sovrascrivere qualsiasi salvataggio precedente di questo mondo con la versione del mondo corrente? + + Pietra Pesciolino d'argento - - Vuoi davvero uscire senza salvare? Perderai tutti i progressi in questo mondo! + + Scale di mattoni di pietra - - Avvia gioco + + Ninfea - - Salvataggio dannegg. + + Micelio - - Questo salvataggio è danneggiato. Vuoi eliminarlo? + + Mattone di pietra Pesciolino d'argento - - Vuoi davvero tornare al menu principale e disconnettere tutti i giocatori? Tutti i progressi non salvati andranno persi. + + Cambia modalità telecamera - - Esci e salva + + 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. - - Esci senza salvare + + 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. - - Vuoi davvero tornare al menu principale? Tutti i progressi non salvati andranno persi. + + Man mano che raccogli e crei oggetti, l'inventario si riempie.{*B*} + Premi{*CONTROLLER_ACTION_INVENTORY*} per aprire l'inventario. - - Vuoi davvero tornare al menu principale? I progressi andranno persi! + + Il legno ottenuto si può tagliare in assi. Apri l'interfaccia Crafting per crearle.{*PlanksIcon*} - - Crea nuovo mondo + + 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*} - - Avvia tutorial + + 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. - - Tutorial + + Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting. - - Nomina il tuo mondo + + 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. - - Immetti un nome per il tuo mondo + + Usa{*CONTROLLER_ACTION_MOVE*} per muoverti. - - Pianta il seme per la generazione del tuo mondo + + Usa{*CONTROLLER_ACTION_LOOK*} per guardare su, giù e intorno. - - Carica mondo salvato + + 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 START per accedere + + 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... - - Uscita dal gioco + + Premi{*CONTROLLER_ACTION_JUMP*} per saltare. - - Si è verificato un errore. Tornerai al menu principale. + + Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Crea un tavolo da lavoro.{*CraftingTableIcon*} - - Connessione non riuscita + + La notte arriva in fretta ed è pericoloso restare all'aperto impreparati. Puoi creare armi e armature, ma conviene avere un riparo sicuro. - - Connessione persa + + Apri il contenitore - - Connessione al server persa. Tornerai al menu principale. + + 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*} - - Disconnesso dal server + + 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*} - - Sei stato espulso dalla partita + + 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. - - Sei stato espulso dalla partita per volo. + + Nelle vicinanze c'è un rifugio di minatori abbandonato che puoi completare entro sera. - - Timeout del tentativo di connessione + + L'ascia ti aiuta a tagliare più in fretta la legna e i blocchi di legno. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli. Crea un'ascia di legno.{*WoodenHatchetIcon*} - - Server pieno + + Usa{*CONTROLLER_ACTION_USE*} per utilizzare gli oggetti, interagire e collocarli. Gli oggetti collocati possono essere raccolti scavando con l'attrezzo appropriato. - - L'host è uscito dal gioco. + + Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} per cambiare l'oggetto che tieni in mano. - - Non puoi accedere a questa partita perché non hai amici tra i partecipanti. + + Per velocizzare la raccolta di blocchi, puoi costruire attrezzi appositi. Alcuni attrezzi hanno un manico creato con dei bastoni. Crea dei bastoni.{*SticksIcon*} - - Non puoi accedere a questa partita perché sei stato espulso dall'host in precedenza. + + 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*} - - Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti ha una versione più vecchia del gioco. + + Sposta il puntatore sul tavolo da lavoro e premi{*CONTROLLER_ACTION_USE*} per aprirlo. - - Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti a una versione più nuova del gioco. + + Una volta selezionato il tavolo da lavoro, sposta il puntatore nel punto desiderato e usa{*CONTROLLER_ACTION_USE*} per collocarlo. - - Nuovo mondo + + In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. +Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. - - Premio sbloccato! + + - - Evviva, hai ottenuto un'immagine del giocatore con Steve di Minecraft! + + - - Evviva, hai ottenuto un'immagine del giocatore con un creeper! + + - - 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? + + - - Attendi + + - - Nessun risultato + + - - Filtro: + + Layout 1 - - Amici + + Movimento (durante il volo) - - Punt. personale + + Giocatori/Invito - - Generale + + - - Totale: + + Layout 3 - - Posiz. + + Layout 2 - - Preparazione al salvataggio livello + + - - Preparazione blocchi... + + - - Finalizzazione... + + - - Creazione terreno + + - - Simulazione mondo + + {*B*}Premi{*CONTROLLER_VK_A*} per avviare il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. - - Inizializzazione server + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. - - Creazione area di generazione + + - - Caricamento area di generazione + + - - Ingresso nel Sottomondo + + - - Uscita dal Sottomondo + + - - Rigenerazione + + - - Generazione livello + + - - Caricamento livello + + - - Salvataggio giocatori + + - - Connessione all'host + + Blocco Pesciolino d'argento - - Download terreno + + Lastra di pietra - - Passaggio a gioco offline + + Un modo per immagazzinare ferro in modo compatto. - - Attendi mentre l'host salva il gioco + + Blocco di ferro - - Ingresso nel LIMITE + + Lastra di legno - - Uscita dal LIMITE + + Lastra di arenaria - - Questo letto è occupato + + Lastra di pietra - - Puoi dormire solo di notte + + Un modo per immagazzinare oro in modo compatto. - - %s dorme in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. + + Fiore - - Letto mancante o passaggio ostruito + + Lana bianca - - Non puoi riposare adesso: ci sono mostri nei paraggi + + Lana arancione - - Stai dormendo in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. + + Blocco d'oro - - Attrezzi e armi + + Fungo - - Armi + + Rosa - - Cibo + + Lastra acciottolata - - Strutture + + Libreria - - Armature + + TNT - - Meccanismi + + Mattoni - - Trasporto + + Torcia - - Decorazioni + + Ossidiana - - Blocchi da costruzione + + Pietra muschiosa - - Pietra rossa e trasporti + + Lastra mattoni Sottomondo - - Varie + + Lastra di legno di quercia - - Distillazione + + Lastra di mattoni di pietra - - Attrezzi, armi e armature + + Lastra di mattoni - - Materiali + + Lastra di legno (giungla) - - Disconnesso + + Lastra di legno di betulla - - Difficoltà + + Lastra di legno di abete - - Musica + + Lana magenta - - Effetti + + Foglie di betulla - - Gamma + + Foglie d'abete - - Sensibilità gioco + + Foglie di quercia - - Sensibilità interfaccia + + Vetro - - Relax + + Spugna - - Facile + + Foglie della giungla - - Normale + + Foglie - - Difficile + + Quercia - - In questa modalità, il giocatore recupera salute col tempo e non ci sono nemici nell'ambiente. + + Abete - - In questa modalità, vengono generati nemici nell'ambiente, ma infliggono danni minori rispetto alla modalità normale. + + Betulla - - In questa modalità, nell'ambiente vengono generati nemici che infliggono un danno standard al giocatore. + + Legno di abete - - 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! + + Legno di betulla - - Timeout prova + + Legno della giungla - - Partita al completo + + Lana - - Impossibile accedere: nessuno spazio rimasto + + Lana rosa - - Inserisci testo cartello + + Lana grigia - - Inserisci il testo per il cartello + + Lana grigio chiaro - - Inserisci titolo + + Lana azzurra - - Inserisci un titolo per il tuo messaggio + + Lana gialla - - Inserisci didascalia + + Lana verde lime - - Inserisci una didascalia per il tuo messaggio + + Lana turchese - - Inserisci descrizione + + Lana verde - - Inserisci una descrizione per il tuo messaggio + + Lana rossa - - Inventario + + Lana nera - - Ingredienti + + Lana viola - - Banco di distillazione + + Lana blu - - Cassa + + Lana marrone - - Incantesimo + + Torcia (carbone) - - Fornace + + Pietra brillante - - Ingrediente + + Sabbie mobili - - Combustibile + + Sottogriglia - - Dispenser + + Blocco lapislazzulo - - Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. + + Minerale di lapislazzulo - - %s si unisce alla partita. + + Portale - - %s ha abbandonato la partita. + + Zucca di Halloween - - %s è stato espulso dal gioco. + + Canna da zucchero - - Vuoi davvero eliminare questo salvataggio? + + Argilla - - Da approvare + + Cactus - - Censurato + + Zucca - - In ascolto: + + Recinzione - - Resetta impostazioni + + Jukebox - - Vuoi davvero ripristinare le impostazioni predefinite? + + Un modo per immagazzinare lapislazzuli in modo compatto. - - Errore caricamento + + Botola - - Partita di %s + + Cassa chiusa - - Partita con host sconosciuto + + Diodo - - Ospite disconnesso + + Pistone appiccicoso - - Un giocatore ospite si è disconnesso, rimuovendo tutti i giocatori ospite dal gioco. + + Pistone - - Accedi + + Lana (qualsiasi colore) - - Non hai effettuato l'accesso. Per partecipare a questo gioco, devi prima accedere. Vuoi accedere ora? + + Cespuglio secco - - Multiplayer non consentito + + Torta - - Creazione di partita non riuscita + + Blocco nota - - Selezionato automaticamente + + Dispenser - - No pacchetto: skin predef. + + Erba alta - - Skin preferite + + Ragnatela - - Livello escluso + + Letto - - 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. + + Ghiaccio - - Escludere questo livello? + + Tavolo da lavoro - - Vuoi davvero aggiungere questo livello all'elenco dei livelli esclusi? -Selezionando OK, uscirai da questa partita. + + Un modo per immagazzinare diamanti in modo compatto. - - Rimuovi da elenco esclusi + + Blocco di diamante - - Autosalvataggio + + Fornace - - Intervallo autosalvataggio: NO + + Zolla - - Min + + Coltura - - Impossibile collocare qui! + + Minerale di diamante - - Non è consentito collocare la lava accanto al punto di generazione del livello: i giocatori appena generati potrebbero morire immediatamente. + + Generatore di mostri - - Opacità interfaccia + + Fuoco - - Preparazione salvataggio livello + + Torcia (antracite) - - Dimensioni dell'interfaccia + + Polvere di pietra rossa - - Dimen. interfaccia (schermo div.) + + Cassa - - Seme + + Scala di legno di quercia - - Sblocca pacchetto Skin + + Cartello - - Per usare la skin che hai selezionato, devi sbloccare questo pacchetto Skin. -Vuoi sbloccare il pacchetto Skin ora? + + Minerale pietra rossa - - Sblocca pacchetto texture + + Porta di ferro - - Per usare questo pacchetto texture nel tuo mondo, devi prima sbloccarlo. -Vuoi sbloccarlo ora? + + Piastra a pressione - - Versione di prova pacchetto texture + + Neve - - 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? + + Tasti - - Nessun pacchetto texture + + Torcia pietra rossa - - Sblocca versione completa + + Leva - - Scarica versione di prova + + Binari - - Scarica versione completa + + Scala a pioli - - Questo mondo usa un pacchetto texture o mash-up che non hai! -Vuoi installare uno dei due pacchetti ora? + + Porta di legno - - Ottieni la versione di prova + + Scala di pietra - - Ottieni la versione completa + + Binari rilevatori - - Espelli giocatore + + Binari potenziati - - Sei sicuro di voler espellere questo giocatore dalla partita? Non potrà accedere finché non riavvii il mondo. + + Hai abbastanza ciottoli per costruire una fornace. Usa il tavolo da lavoro. - - Pacchetti Immagini del giocatore + + Canna da pesca - - Temi + + Orologio - - Pacchetti Skin + + Polvere di pietra brillante - - Accetta amici di amici + + Carrello con fornace - - Non puoi unirti a questa partita. L'host ha limitato l'accesso ai propri amici. + + Uovo - - Impossibile accedere alla partita + + Bussola - - Selezionato + + Pesce crudo - - Skin selezionata: + + Rosso rosa - - Contenuto scaricabile danneggiato + + Verde cactus - - Questo contenuto scaricabile è danneggiato e non può essere usato. Cancellalo e installalo nuovamente dal menu del Negozio di Minecraft. + + Semi di cacao - - Parte del contenuto scaricabile è danneggiato e non può essere usato. Cancella il contenuto e installalo nuovamente dal menu del Negozio di Minecraft. + + Pesce cotto - - La modalità di gioco è cambiata + + Tintura in polvere - - Rinomina il mondo + + Sacca d'inchiostro - - Inserisci il nuovo nome del tuo mondo + + Carrello con cassa - - Modalità: Sopravvivenza + + Palla di neve - - Modalità: Creativa + + Barca - - Sopravvivenza + + Pelle - - Creativa + + Carrello da miniera - - In modalità Sopravvivenza + + Sella - - In modalità Creativa + + Pietra rossa - - Renderizza nuvole + + Secchio di latte - - Cosa vuoi fare con questo salvataggio? + + Carta - - Rinomina salvataggio + + Libro - - Autosalvataggio tra %d... + + Palla di slime - - + + Mattone - - No + + Argilla - - Normale + + Canna da zucchero - - Superpiatto + + Lapislazzulo - - Se attivato, il gioco sarà un gioco online. + + Mappa - - Se attivato, i giocatori potranno unirsi solo su invito. + + Disco - "13" - - Se attivato, gli amici delle persone nell'elenco di amici potranno unirsi alla partita. + + Disco - "gatto" - - Se l'opzione è abilitata, è possibile infliggere danni agli altri giocatori. Efficace solo in modalità Sopravvivenza. + + Letto - - Se l'opzione è disabilitata, i giocatori che si uniscono alla partita non possono costruire o scavare fino a quando non vengono autorizzati. + + Ripetitore pietra rossa - - Se l'opzione è abilitata, il fuoco può propagarsi ai blocchi infiammabili vicini. + + Biscotto - - Se l'opzione è abilitata, il TNT esplode quando viene attivato. + + Disco - "blocchi" - - Quando è attivato, il Sottomondo viene rigenerato. È molto utile nel caso tu abbia un vecchio salvataggio nel quale non sono presenti Fortezze del Sottomondo. + + Disco - "mellohi" - - Se l'opzione è abilitata, nel mondo si genereranno strutture come Villaggi e Fortezze. + + Disco - "stal" - - Se l'opzione è abilitata, verrà generato un mondo completamente piatto tanto nel Sopramondo che nel Sottomondo. + + Disco - "strad" - - Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. + + Disco - "cip" - - Pacchetti di skin + + Disco - "lontano" - - Temi + + Disco - "centro commerciale" - - Immagini del giocatore + + Torta - - Oggetti avatar + + Tintura grigia - - Pacchetti Texture + + Tintura rosa - - Pacchetti Mash-Up + + Tintura verde lime - - {*PLAYER*} ha preso fuoco + + Tintura viola - - {*PLAYER*} è bruciato vivo + + Tintura turchese - - {*PLAYER*} ha cercato di nuotare nella lava + + Tintura grigiastra - - {*PLAYER*} è soffocato dentro un muro + + Giallo mimosa - - {*PLAYER*} è affogato + + Farina d'ossa - - {*PLAYER*} è morto di fame + + Osso - - {*PLAYER*} è morto in seguito a una puntura + + Zucchero - - {*PLAYER*} si è schiantato al suolo + + Tintura azzurra - - {*PLAYER*} è caduto fuori dal mondo + + Tintura magenta - - {*PLAYER*} è morto + + Tintura arancione - - {*PLAYER*} è saltato in aria + + Cartello - - {*PLAYER*} è stato ucciso dalla magia + + Tunica di pelle - - Un Drago di Ender ha ucciso {*PLAYER*} con il suo alito + + Corsaletto di ferro - - {*PLAYER*} è stato ucciso da {*SOURCE*} + + Corsal. di diamante - - {*PLAYER*} è stato ucciso da {*SOURCE*} + + Elmo di ferro - - {*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} + + Elmo di diamante - - {*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} + + Elmo d'oro - - {*PLAYER*} è stato pestato a morte da {*SOURCE*} + + Corsaletto d'oro - - {*PLAYER*} è stato ucciso da {*SOURCE*} + + Gambali d'oro - - Nebbia substrato roccioso + + Stivali di cuoio - - Mostra interfaccia + + Stivali di ferro - - Mostra mano + + Pantaloni di pelle - - Messaggi di morte + + Gambali di ferro - - Personaggio animato + + Gambali di diamante - - Animaz. skin personalizzata  + + Cappello di pelle - - Non puoi più scavare né usare oggetti + + Zappa di pietra - - Ora puoi scavare e usare oggetti + + Zappa di ferro - - Non puoi più posizionare blocchi + + Zappa di diamante - - Ora puoi posizionare blocchi + + Ascia di diamante - - Ora puoi usare porte e interruttori + + Ascia d'oro - - Non puoi più usare porte e interruttori + + Zappa di legno - - Ora puoi usare contenitori (es. casse) + + Zappa d'oro - - Non puoi più usare contenitori (es. casse) + + Corazza di maglia - - Non puoi più attaccare i nemici + + Gambali di maglia metallica - - Ora puoi attaccare i nemici + + Stivali di maglia metallica - - Non puoi più attaccare i giocatori + + Porta di legno - - Ora puoi attaccare i giocatori + + Porta di ferro - - Non puoi più attaccare gli animali + + Elmo di maglia metallica - - Ora puoi attaccare gli animali + + Stivali di diamante - - Ora sei un moderatore + + Piuma - - Non sei più un moderatore + + Polvere da sparo - - Ora puoi volare + + Semi di grano - - Non puoi più volare + + Ciotola - - Non sentirai più la stanchezza + + Zuppa di funghi - - Ora sentirai la stanchezza + + Corda - - Ora sei invisibile + + Grano - - Non sei più invisibile + + Costoletta di maiale cotta - - Ora sei invulnerabile + + Dipinto - - Non sei più invulnerabile + + Mela d'oro - - %d MSP + + Pane - - Drago di Ender + + Pietra focaia - - %s si trova ora nel Limite + + Costoletta di maiale cruda - - %s ha lasciato il Limite + + Bastone - - {*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*} + + Secchio - - {*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*} + + Secchio d'acqua - - {*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*} + + Secchio di lava - - Resetta Sottomondo + + Stivali d'oro - - Ripristinare le impostazioni iniziali del Sottomondo in questo salvataggio? Tutto ciò che hai creato nel Sottomondo andrà perso! + + Lingotto di ferro - - Resetta il Sottomondo + + Lingotto d'oro - - Non resettare il Sottomondo + + Pietra foc. e acciarino - - Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. + + Carbone - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. + + Antracite - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di muccafunghi. + + Diamante - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di lupi. + + Mela - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di galline. + + Arco - - Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di calamari. + + Freccia + + + Disco - "reparto" - - Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di nemici nel mondo. + + Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo strutture.{*StructuresIcon*} - - Impossibile usare l'uovo rigenerazione al momento. È stato raggiunto il numero massimo di villici nel mondo. + + Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo attrezzi.{*ToolsIcon*} - - Hai raggiunto il limite per i Telai di dipinti/oggetti di un mondo. + + 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. - - Non puoi generare nemici in modalità Relax. + + 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. - - Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. + + 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*} - - Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di lupi. + + 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*} - - Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di galline. + + Il legno ottenuto si può tagliare in assi. Seleziona l'icona delle assi e premi{*CONTROLLER_VK_A*} per crearle.{*PlanksIcon*} - - Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di muccafunghi. + + 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. - - È stato raggiunto il numero massimo di navi per mondo. + + L'area crafting mostra gli elementi richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. - - Hai raggiunto il numero massimo di teste di Mob in un mondo. + + 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. - - Inverti + + Ora è visualizzato l'elenco degli ingredienti necessari per creare l'oggetto selezionato. - - Mancino + + Ora è visualizzata la descrizione dell'oggetto selezionato, che ti dà un'idea del suo possibile utilizzo. - - Sei morto! + + 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. - - Rigenerati + + Alcuni oggetti non possono essere creati con il tavolo da lavoro, ma è necessaria una fornace. Ora crea una fornace.{*FurnaceIcon*} - - Offerte contenuto scaricabile + + Ghiaia - - Cambia skin + + Minerale d'oro - - Come giocare + + Minerale di ferro - - Comandi + + Lava - - Impostazioni + + Sabbia - - Riconoscimenti + + Arenaria - - Reinstalla contenuto + + Minerale di carbone - - Impostazioni debug + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa la fornace. - - Diffusione incendio + + Questa è l'interfaccia fornace, dove puoi modificare gli oggetti attraverso il fuoco. Per esempio, puoi trasformare il minerale di ferro in lingotti di ferro. - - Esplosione TNT + + Colloca la fornace creata nel mondo. Ti conviene metterla nel tuo rifugio.{*B*} + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. - - Giocatore vs Giocatore + + Legno - - Autorizza giocatori + + Legno di quercia - - Privilegi dell'host + + 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. - - Genera strutture + + {*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare di nuovo l'inventario. - - Mondo superpiatto + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario. - - Cassa bonus + + Questo è il tuo inventario. Mostra gli oggetti che puoi tenere in mano e quelli che trasporti, nonché la tua eventuale armatura. - - Opzioni mondo + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. - - Può costruire e scavare + + Sposta il puntatore fuori dal bordo dell'interfaccia mentre è selezionato un oggetto per posarlo. - - Può usare porte e interruttori + + 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. - - Può aprire contenitori + + 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à. - - Può attaccare i giocatori + + Hai completato la prima parte del tutorial. - - Può attaccare gli animali + + Usa la fornace per creare del vetro. Mentre aspetti che sia pronto, che ne dici di raccogliere altri materiali per completare il rifugio? - - Moderatore + + Usa la fornace per creare l'antracite. Mentre aspetti che sia pronta, che ne dici di raccogliere altri materiali per completare il rifugio? - - Espelli giocatore + + Usa{*CONTROLLER_ACTION_USE*} per collocare la fornace nel mondo, poi aprila. - - Può volare + + Di notte è buio, quindi serve della luce per poterci vedere nel rifugio. Crea una torcia usando bastoni e antracite dall'interfaccia Crafting.{*TorchIcon*} - - Disabilita stanchezza + + Usa{*CONTROLLER_ACTION_USE*} per collocare la porta. Puoi usare{*CONTROLLER_ACTION_USE*} per aprire e chiudere una porta di legno nel mondo. - - Invisibile + + 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*} - - Opzioni host + + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Giocatori/Invito + + Questa è l'interfaccia di Crafting (lavoro), che ti consente di combinare gli oggetti raccolti per crearne di nuovi. - - Partita online + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario della modalità Creativa. - - Solo invito + + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Altre opzioni + + {*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare gli ingredienti necessari per creare l'oggetto corrente. - - Carica + + {*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare la descrizione dell'oggetto. - - Nuovo mondo + + {*B*} + Premi {*CONTROLLER_VK_A*}per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il crafting. - - Nome mondo + + Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto che vuoi prendere. - - Seme per generatore mondo + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario della modalità Creativa. - - Lascia vuoto per seme casuale + + Questo è l'inventario della modalità Creativa. Mostra gli oggetti che hai in mano e tutti quelli a tua disposizione. - - Giocatori + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario. - - Unisciti alla partita + + 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*}. - - Avvia gioco + + + 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. + - - Nessuna partita trovata + + + 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. + - - Gioca + + Acqua - - Classifiche + + Bottiglia di vetro - - Guida e opzioni + + Bottiglia d'acqua - - Sblocca gioco completo + + Occhio di ragno - - Riprendi gioco + + Pepita d'oro - - Salva gioco + + Verruca del Sottomondo - - Difficoltà: + + Pozione{*splash*}{*prefix*}{*postfix*} - - Tipo di gioco: + + Occhio ragno fermen. - - Strutture: + + Calderone - - Tipo di livello: + + Occhio di Ender - - PvP: + + Anguria scintillante - - Autorizza giocatori: + + Polvere di Vampe - - TNT: + + Crema di magma - - Diffusione incendio: + + Banco di distillazione - - Reinstalla tema + + Lacrima di Ghast - - Reinstalla immagine del giocatore 1 + + Semi di zucca - - Reinstalla immagine del giocatore 2 + + Semi di anguria - - Reinstalla oggetto avatar 1 + + Pollo crudo - - Reinstalla oggetto avatar 2 + + Disco - "11" - - Reinstalla oggetto avatar 3 + + Disco - "dove siamo adesso" - - Opzioni + + Tosatrice - - Audio + + Pollo cotto - - Comando + + Perla di Ender - - Grafica + + Fetta di anguria - - Interfaccia utente + + Bacchetta di Vampe - - Ripristina predefinite + + Manzo crudo - - Vedi bobbing + + Bistecca - - Aiuti + + Carne guasta - - Aiuti contestuali del gioco + + Bottiglia magica - - 2 gioc. schermo diviso verticale + + Assi di legno di quercia - - Fatto + + Assi di legno di abete - - Modifica messaggio cartello: + + Assi di legno di betulla - - Inserisci i dettagli del tuo screenshot + + Blocco d'erba - - Didascalia + + Terra - - Screenshot del gioco + + Ciottolo - - Modifica messaggio cartello: + + Assi di legno (giungla) - - Texture, icone e interfaccia classiche di Minecraft! + + Arbusto di betulla - - Mostra tutti i mondi Mash-up + + Arbusto della giungla - - Nessun effetto + + Substrato roccioso - - Velocità + + Arbusto - - Lentezza + + Arbusto di quercia - - Fretta + + Arbusto di abete - - Fatica del minatore + + Pietra - - Forza + + Cornice oggetto - - Debolezza + + Genera {*CREATURE*} - - Guarigione istantanea + + Mattone del Sottomondo - - Danno istantaneo + + Scarica di fuoco - - Salto potenziato + + Scaric. fuoco brace - - Nausea + + Scaric. fuoco carbone - - Rigenerazione + + Teschio - - Resistenza + + Testa - - Resistenza al fuoco + + Testa di %s - - Apnea + + Testa di Creeper - - Invisibilità + + Teschio di scheletro - - Cecità + + Teschio di scheletro avvizzito - - Visione notturna + + Testa di zombie - - Fame + + Un modo efficiente per immagazzinare carbone. Può essere usato come combustibile in una fornace. Veleno - - della Velocità + + Fame della Lentezza - - della Fretta + + della Velocità - - dell'Opacità + + Invisibilità - - della Forza + + Apnea - - della Debolezza + + Visione notturna - - della Guarigione + + Cecità del Danno - - del Salto + + della Guarigione della Nausea @@ -5004,29 +5915,38 @@ Vuoi installare uno dei due pacchetti ora? della Rigenerazione - - della Resistenza + + dell'Opacità - - della Resistenza al fuoco + + della Fretta + + + della Debolezza + + + della Forza + + + Resistenza al fuoco - - dell'Apnea + + Saturazione - - dell'Invisibilità + + della Resistenza - - della Cecità + + del Salto - - della Visione notturna + + Avvizzito - - della Fame + + Potenziamento salute - - del Veleno + + Assorbimento @@ -5037,29 +5957,41 @@ Vuoi installare uno dei due pacchetti ora? III + + dell'Invisibilità + IV - - Bomba + + dell'Apnea - - Prosaica + + della Resistenza al fuoco - - Banale + + della Visione notturna - - Blanda + + del Veleno - - Chiara + + della Fame - - Opaca + + dell'assorbimento - - Diffusa + + di saturazione + + + del potenziamento salute + + + della Cecità + + + del Decadimento Rozza @@ -5067,17 +5999,17 @@ Vuoi installare uno dei due pacchetti ora? Sottile - - Maldestra + + Diffusa - - Insipida + + Chiara - - Voluminosa + + Opaca - - Pasticciata + + Maldestra Imburrata @@ -5085,246 +6017,300 @@ Vuoi installare uno dei due pacchetti ora? Amabile - - Affabile + + Pasticciata - - Distinta + + Insipida - - Densa + + Voluminosa - - Elegante + + Blanda - - Elaborata + + Bomba - - Affascinante + + Prosaica + + + Banale Prestante - - Raffinata - Cordiale + + Affascinante + + + Elegante + + + Elaborata + Frizzante + + Posizione + + + Aspra + + + Inodore + Potente Pessima - - Inodore + + Affabile - - Posizione + + Raffinata - - Aspra + + Densa - - Acida + + Distinta - - Disgustosa + + Restituisce progressivamente salute a giocatori, animali e mostri affetti. - - Puzzolente + + Riduce istantaneamente la salute di giocatori, animali e mostri affetti. - - Si usa in un Banco di distillazione come base per tutte le pozioni. + + Rende giocatori, animali e mostri affetti immuni ai danni causati da fuoco, lava e attacchi a distanza di Vampe. 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. + + Acida 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 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. + Aumenta i danni provocati con l'attacco da giocatori e mostri affetti. + + Aumenta istantaneamente la salute di giocatori, animali 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. + + Si usa in un Banco di distillazione come base per tutte le pozioni. - - Riduce istantaneamente la salute di giocatori, animali e mostri affetti. + + Disgustosa - - Restituisce progressivamente salute a giocatori, animali e mostri affetti. + + Puzzolente - - Rende giocatori, animali e mostri affetti immuni ai danni causati da fuoco, lava e attacchi a distanza di Vampe. + + Percossa + + + Acutezza Riduce progressivamente la salute di giocatori, animali e mostri affetti. - - Acutezza + + Danno da attacco - - Percossa + + Atterramento Flagello degli Artropodi - - Atterramento + + Velocità - - Aspetto di Fuoco + + Rinforzi zombie - - Protezione + + Potenza di salto del cavallo + + + Quando applicato: + + + Resistenza all'atterramento + + + Gittata di inseguimento dei nemici + + + Salute max + + + Tocco di Seta + + + Efficienza + + + Affinità con l'acqua + + + Fortuna + + + Saccheggio + + + Durezza Protezione dal Fuoco + + Protezione + + + Aspetto di Fuoco + Caduta della Piuma - - Protezione dalle esplosioni + + Respirazione Protezione dai proiettili - - Respirazione - - - Affinità con l'acqua + + Protezione dalle esplosioni - - Efficienza + + IV - - Tocco di Seta + + V - - Durezza + + VI - - Saccheggio + + Pugno - - Fortuna + + VII - - Potenza + + III Fiamma - - Pugno + + Potenza Infinito - - I - II - - III - - - IV + + I - - V + + Si attiva quando un'entità passa attraverso un allarme collegato. - - VI + + Attiva un gancio di allarme quando un'entità ci passa attraverso. - - VII + + Un modo per compattare smeraldi. - - VIII + + Simile a una cassa, eccetto per il fatto che un oggetto piazzato in una cassa dell'Ender è disponibile in tutte le casse dell'Ender del giocatore, anche in differenti dimensioni. IX - - X + + VIII Può essere scavato con una piccozza di ferro o migliore per produrre smeraldi. - - Simile a una cassa, eccetto per il fatto che un oggetto piazzato in una cassa dell'Ender è disponibile in tutte le casse dell'Ender del giocatore, anche in differenti dimensioni. - - - Si attiva quando un'entità passa attraverso un allarme collegato. + + X - - Attiva un gancio di allarme quando un'entità ci passa attraverso. + + Reintegra 2{*ICON_SHANK_01*} e può essere trasformato in una carota d'oro. Si può piantare in una fattoria. - - Un modo per compattare smeraldi. + + Si usa come decorazione. Ci si possono piantare fiori, arbusti, cactus e funghi. Un muro fatto di ciottoli. - - Si può usare per riparare armi, strumenti e armature. + + Reintegra 0.5{*ICON_SHANK_01*}. Si può cuocere in una fornace o piantare in una fattoria. Può essere fuso in una fornace per produrre quarzo del Sottomondo. - - Si usa come decorazione. + + Si può usare per riparare armi, strumenti e armature. Si può commerciare con gli abitanti. - - Si usa come decorazione. Ci si possono piantare fiori, arbusti, cactus e funghi. + + Si usa come decorazione. - - Reintegra 2{*ICON_SHANK_01*} e può essere trasformato in una carota d'oro. Si può piantare in una fattoria. + + Reintegra 4{*ICON_SHANK_01*}. - - Reintegra 0.5{*ICON_SHANK_01*}. Si può cuocere in una fornace o piantare in una fattoria. + + Reintegra 1{*ICON_SHANK_01*}, ma potrebbe avvelenarti. + + + Si usa per controllare un maiale sellato quando lo si cavalca. Reintegra 3{*ICON_SHANK_01*}. Si ottiene cucinando una patata in una fornace. - - Reintegra 1{*ICON_SHANK_01*}, ma potrebbe avvelenarti. Si può cuocere in una fornace o piantare in una fattoria. - Reintegra 3{*ICON_SHANK_01*}. Composto da una carota e pepite d'oro. - - Si usa per controllare un maiale sellato quando lo si cavalca. - - - Reintegra 4{*ICON_SHANK_01*}. - Si usa con un'incudine per incantare armi, strumenti e armature. Si crea fondendo minerale di quarzo del Sottomondo. Può essere lavorato in un blocco di quarzo. + + Patata + + + Patata cotta + + + Carota + Lavorata dalla lana. Si usa come decorazione. @@ -5334,14 +6320,11 @@ Vuoi installare uno dei due pacchetti ora? Vaso di fiori - - Carota - - - Patata + + Torta di zucca - - Patata cotta + + Libro incantato Patata velenosa @@ -5352,11 +6335,11 @@ Vuoi installare uno dei due pacchetti ora? Carota su bastone - - Torta di zucca + + Gancio dell'allarme - - Libro incantato + + Allarme Quarzo del Sottomondo @@ -5367,11 +6350,8 @@ Vuoi installare uno dei due pacchetti ora? Cassa dell'Ender - - Gancio dell'allarme - - - Allarme + + Muro di ciottoli e muschio Blocco di smeraldo @@ -5379,8 +6359,8 @@ Vuoi installare uno dei due pacchetti ora? Muro di ciottoli - - Muro di ciottoli e muschio + + Patate Vaso di fiori @@ -5388,8 +6368,8 @@ Vuoi installare uno dei due pacchetti ora? Carote - - Patate + + Incudine leggermente danneggiata Incudine @@ -5397,8 +6377,8 @@ Vuoi installare uno dei due pacchetti ora? Incudine - - Incudine leggermente danneggiata + + Blocco di quarzo Incudine gravemente danneggiata @@ -5406,8 +6386,8 @@ Vuoi installare uno dei due pacchetti ora? Minerale di quarzo del Sottomondo - - Blocco di quarzo + + Scale di quarzo Blocco di quarzo cesellato @@ -5415,8 +6395,8 @@ Vuoi installare uno dei due pacchetti ora? Blocco di quarzo a pilastro - - Scale di quarzo + + Moquette rossa Moquette @@ -5424,8 +6404,8 @@ Vuoi installare uno dei due pacchetti ora? Moquette nera - - Moquette rossa + + Moquette blu Moquette verde @@ -5433,9 +6413,6 @@ Vuoi installare uno dei due pacchetti ora? Moquette marrone - - Moquette blu - Moquette viola @@ -5448,18 +6425,18 @@ Vuoi installare uno dei due pacchetti ora? Moquette grigia - - Moquette rosa - Moquette verde lime - - Moquette gialla + + Moquette rosa Moquette blu chiara + + Moquette gialla + Moquette magenta @@ -5472,88 +6449,83 @@ Vuoi installare uno dei due pacchetti ora? Arenaria cesellata - - Arenaria liscia - {*PLAYER*} è morto tentando di colpire {*SOURCE*} + + Arenaria liscia + {*PLAYER*} è stato schiacciato da un'incudine in caduta. {*PLAYER*} è stato schiacciato da un blocco in caduta. - - {*PLAYER*} teletrasportato da {*DESTINATION*} - {*PLAYER*} ti ha teletrasportato alla sua posizione - - {*PLAYER*} si è teletrasportato da te + + {*PLAYER*} teletrasportato da {*DESTINATION*} Spine - - Lastra di quarzo + + {*PLAYER*} si è teletrasportato da te Fa apparire le aree buie come se fosse giorno, anche sott'acqua. + + Lastra di quarzo + Rende invisibili giocatori, animali e mostri affetti. Ripara e nomina - - Costo incantesimo: %d - Troppo costoso! - - Rinomina + + Costo incantesimo: %d Possiedi: - - Richiesti per lo scambio + + Rinomina {*VILLAGER_TYPE*} offre %s - - Ripara + + Richiesti per lo scambio Scambia - - Tingi collare + + Ripara Questa è l'interfaccia dell'incudine. Puoi usarla per rinominare, riparare e incantare armi, armature e attrezzi, al costo di livelli di esperienza. - - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia dell'incudine.{*B*} - Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. - + + Tingi collare Per iniziare a lavorare su un oggetto, piazzalo nel primo slot di ingresso. - + - Quando il materiale grezzo corretto viene piazzato nel secondo slot di ingresso (es. lingotti di ferro per una spada di ferro danneggiata), appare la riparazione suggerita nello slot di uscita. + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia dell'incudine.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. @@ -5561,9 +6533,9 @@ Vuoi installare uno dei due pacchetti ora? In alternativa, nel secondo slot di ingresso può essere posizionato un secondo oggetto identico, per combinarli tra loro. - + - Per incantare oggetti sull'incudine, piazza un Libro incantato nel secondo slot di ingresso. + Quando il materiale grezzo corretto viene piazzato nel secondo slot di ingresso (es. lingotti di ferro per una spada di ferro danneggiata), appare la riparazione suggerita nello slot di uscita. @@ -5571,9 +6543,9 @@ Vuoi installare uno dei due pacchetti ora? Il numero di livelli di esperienza che questa operazione costerà viene mostrato sotto l'uscita. Se non hai sufficienti livelli di esperienza, la riparazione non può essere effettuata. - + - È possibile rinominare l'oggetto modificandone il nome mostrato nella casella di testo. + Per incantare oggetti sull'incudine, piazza un Libro incantato nel secondo slot di ingresso. @@ -5581,9 +6553,9 @@ Vuoi installare uno dei due pacchetti ora? Raccogliendo l'oggetto riparato, i due oggetti utilizzati dall'incudine verranno consumati e il tuo livello di esperienza verrà ridotto della quantità indicata. - + - In quest'area c'è un'incudine e una cassa contenente strumenti e armi su cui lavorare. + È possibile rinominare l'oggetto modificandone il nome mostrato nella casella di testo. @@ -5593,9 +6565,9 @@ Vuoi installare uno dei due pacchetti ora? Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. - + -Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristinare la loro durata, rinominati o incantati mediante i libri incantati. + In quest'area c'è un'incudine e una cassa contenente strumenti e armi su cui lavorare. @@ -5603,9 +6575,9 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi I libri incantati si possono trovare all'interno di casse nei sotterranei, o possono essere incantati a partire da libri normali presso un Tavolo per incantesimi. - + - Usare l'incudine costa livelli di esperienza, e ogni uso ha una chance di danneggiare l'incudine. +Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristinare la loro durata, rinominati o incantati mediante i libri incantati. @@ -5613,9 +6585,9 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi Il tipo di lavoro da effettuare, il valore dell'oggetto, il numero di incantesimi e la quantità di lavoro precedente influenzano il costo della riparazione. - + - Rinominare un oggetto ne cambia il nome visualizzato per tutti i giocatori, e riduce permanentemente il costo del lavoro precedente. + Usare l'incudine costa livelli di esperienza, e ogni uso ha una chance di danneggiare l'incudine. @@ -5623,9 +6595,9 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi Nella cassa in quest'area troverai piccozze danneggiate, materiali grezzi, bottiglie magiche e libri incantati con cui fare esperimenti. - + - Questa è l'interfaccia di scambio, che mostra gli scambi che possono essere effettuati con gli abitanti. + Rinominare un oggetto ne cambia il nome visualizzato per tutti i giocatori, e riduce permanentemente il costo del lavoro precedente. @@ -5635,9 +6607,9 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. - + - Tutti gli scambi che l'abitante è interessato a effettuare al momento sono visualizzati in alto. + Questa è l'interfaccia di scambio, che mostra gli scambi che possono essere effettuati con gli abitanti. @@ -5645,9 +6617,9 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi Gli scambi appaiono in rosso e non sono disponibili se non possiedi gli oggetti necessari. - + - La quantità e il tipo di oggetti che devi dare all'abitante è mostrata nelle due caselle a sinistra. + Tutti gli scambi che l'abitante è interessato a effettuare al momento sono visualizzati in alto. @@ -5655,9 +6627,9 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi Nelle due caselle a sinistra puoi vedere il numero totale di oggetti necessari per lo scambio. - + - premi{*CONTROLLER_VK_A*} per scambiare gli oggetti che l'abitante richiede con l'oggetto offerto. + La quantità e il tipo di oggetti che devi dare all'abitante è mostrata nelle due caselle a sinistra. @@ -5665,10 +6637,9 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi In quest'area c'è un abitante e una cassa contenente carta per acquistare oggetti. - - {*B*} - Premi{*CONTROLLER_VK_A*} per saperne di più sugli scambi.{*B*} - Premi{*CONTROLLER_VK_B*} se sai già tutto sugli scambi. + + + premi{*CONTROLLER_VK_A*} per scambiare gli oggetti che l'abitante richiede con l'oggetto offerto. @@ -5676,14 +6647,20 @@ Usando un'incudine, le armi e gli strumenti possono essere riparati per ripristi I giocatori possono scambiare oggetti del loro inventario con gli abitanti del villaggio. - - - Gli scambi che un abitante desidera fare dipendono dalla sua professione. + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli scambi.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già tutto sugli scambi. Effettuando un mix di scambi, gli scambi offerti dall'abitante verranno aggiornati o aumentati in modo casuale. + + + + + Gli scambi che un abitante desidera fare dipendono dalla sua professione. @@ -5843,7 +6820,4 @@ Tutte le casse dell'Ender di un mondo sono collegate. Gli oggetti posti in una c Cura - - Ricerca di un Seme per il Generatore di mondi. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsPlatformSpecific.xml index f1927521..712cb312 100644 --- a/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/it-IT/stringsPlatformSpecific.xml @@ -1,243 +1,246 @@  - - NOT USED + + Vuoi accedere a "PSN"? - - Puoi usare il touchscreen per navigare nei menu del sistema PlayStation®Vita! + + I giocatori che non sono sullo stesso sistema PlayStation®Vita del giocatore ospitante, selezionando questa opzione, verranno espulsi dal gioco insieme a tutti i giocatori sul loro sistema PlayStation®Vita. Questi giocatori non potranno rientrare nel gioco finché questo non verrà riavviato. - - minecraftforum contiene una sezione dedicata alla PlayStation®Vita Edition. + + SELECT - - Segui @4JStudios e @Kappische su Twitter per le ultime notizie sul gioco! + + Questa opzione, disattiva gli aggiornamenti ai trofei e alle classifiche per questo mondo durante il gioco; le disattiva anche se il gioco viene ricaricato dopo aver salvato con questa opzione attiva. - - Non guardare un Enderman negli occhi! + + Sistema PlayStation®Vita - - Riteniamo che 4J Studios abbia rimosso Herobrine dal gioco per sistema PlayStation®Vita, ma non ne siamo sicuri. + + Scegli "Rete Ad Hoc" per connetterti con altri sistemi PlayStation®Vita nelle vicinanze, o "PSN" per connetterti con amici in tutto il mondo. - - Minecraft: PlayStation®Vita Edition ha battuto diversi record! + + Rete Ad Hoc - - {*T3*}COME GIOCARE: MULTIPLAYER{*ETW*}{*B*}{*B*} -Minecraft per il sistema PlayStation®Vita è un gioco multiplayer con impostazione predefinita.{*B*}{*B*} -Quando avvii o accedi a una partita online, essa sarà visibile alle persone incluse nel tuo elenco di 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 nel loro elenco di amici (se hai selezionato l'opzione "Accetta amici di amici").{*B*} -Durante una partita, premi il tasto SELECT per richiamare un elenco di tutti i giocatori o per espellere altri utenti. + + Cambia modalità di rete - - {*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*} -Gli ID online non vengono visualizzati nello screenshot. + + Scegli modalità di rete - - {*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 estrarre 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, i trofei 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. -Per andare a sinistra premi {*CONTROLLER_ACTION_DPAD_LEFT*} o per andare a destra {*CONTROLLER_ACTION_DPAD_RIGHT*}. + + ID online schermo condiviso - - 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 i tasti direzionali per salire, scendere e spostarti lateralmente. + + Trofei - - NOT USED + + Questo gioco utilizza una funzione di autosalvataggio del livello. Quando appare l'icona qui sopra, il gioco sta salvando i dati. +Non spegnere il sistema PlayStation®Vita mentre l'icona è visualizzata. - - NOT USED + + Se l'opzione è abilitata, l'host può attivare o disattivare la possibilità di volare, disabilitare la stanchezza e rendersi invisibile. Trofei e aggiornamenti della classifica verranno disabilitati. - - "NOT USED" + + ID online: - - "NOT USED" + + Stai usando la versione di prova di un pacchetto di testo. Avrai accesso all'intero contenuto del pacchetto, ma non potrai salvare i tuoi progressi. +Se cerchi di salvare mentre usi la versione di prova, avrai la possibilità di acquistare la versione completa. + - - Invita Amici + + Patch 1.04 (Aggiornamento titolo 14) - - Se crei, carichi o salvi un mondo in modalità Creativa, i trofei e gli aggiornamenti della classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato in modalità Sopravvivenza. Vuoi davvero continuare? + + ID online nel gioco - - Questo mondo è stato precedentemente salvato in modalità Creativa. I trofei e gli aggiornamenti della classifica sono disabilitati. Vuoi davvero continuare? + + Guarda cosa ho fatto in Minecraft: PlayStation®Vita Edition! - - Questo mondo è stato precedentemente salvato in modalità Creativa. I trofei e gli aggiornamenti della classifica sono disabilitati. + + Scaricamento fallito. Riprova più tardi. - - Se crei, carichi o salvi un mondo con l'opzione Privilegi dell'host abilitata, i trofei e gli aggiornamenti della classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato con l'opzione disattivata. Vuoi davvero continuare? + + Impossibile entrare nella partita a causa di un tipo di NAT restrittivo. Verificare le impostazioni di rete. - - Connessione a "PSN" persa. Tornerai al menu principale. + + Caricamento fallito. Riprova più tardi. - - Connessione a "PSN" persa. + + Scaricamento completato! - - Questa è la versione di prova di Minecraft: PlayStation®Vita Edition. Se avessi avuto il gioco completo, avresti sbloccato un obiettivo! -Sblocca il gioco completo per provare il divertimento di Minecraft per PlayStation®Vita Edition e per giocare con amici di tutto il mondo su "PSN". -Vuoi sbloccare il gioco completo? + + + Al momento non esiste un salvataggio disponibile nell'area di trasferimento salvataggi. + Puoi caricare un mondo salvato nell'area di trasferimento salvataggi con Minecraft: PlayStation®3 Edition, e poi scaricarlo con Minecraft: PlayStation®Vita Edition. + - - Questa è la versione di prova di Minecraft: PlayStation®Vita Edition. Se avessi il gioco completo, avresti ottenuto un tema! -Sblocca il gioco completo per provare il divertimento di Minecraft: PlayStation®Vita Edition e per giocare con amici di tutto il mondo su "PSN". -Vuoi sbloccare il gioco completo? + + Salvataggio incompleto - - Questa è la versione di prova di Minecraft: PlayStation®Vita Edition. Per accettare questo invito è necessario il gioco completo. -Vuoi sbloccare il gioco completo? + + Minecraft: PlayStation®Vita Edition ha esaurito lo spazio per i salvataggi. Per creare spazio, cancella altri salvataggi di Minecraft: PlayStation®Vita Edition. - - I giocatori ospiti non possono sbloccare il gioco completo. Connettiti ad un account Sony Entertainment Network. + + Caricamento annullato - - ID Online + + Hai annullato il caricamento di questo salvataggio nell'area di trasferimento salvataggi. - - Distillazione + + Carica salvataggio per PS3™/PS4™ - - Sei tornato alla schermata iniziale perché sei uscito da "PSN". + + Caricamento dati: %d%% - - Hai giocato alla versione di prova di Minecraft: PlayStation®Vita Edition per il tempo massimo consentito! Per continuare a divertirti, vuoi sbloccare il gioco completo? + + "PSN" - - Caricamento di "Minecraft: PlayStation®Vita Edition" non riuscito, impossibile continuare. + + Scarica salvataggio PS3™ - - Impossibile accedere alla partita poiché uno o più giocatori non hanno accesso al gioco online a causa di restrizioni in chat dell'account Sony Entertainment Network. + + Scaricamento dati: %d%% - - Impossibile creare una partita online: uno o più giocatori non possono disputare partite online a causa delle loro restrizioni sulla chat del loro account Sony Entertainment Network. Deseleziona la casella "Gioco online" in "Altre opzioni" per avviare una partita offline. + + Salvataggio - - Non ti è consentito accedere a questa sessione di gioco perché hai le funzionalità online del tuo account Sony Entertainment Network disattivate a causa delle restrizioni sulla chat. + + Caricamento completato! - - Non ti è consentito accedere a questa sessione di gioco perché uno dei giocatori locali ha le funzionalità online del suo account Sony Entertainment Network disattivate a causa delle restrizioni sulla chat. Deseleziona la casella "Gioco online" in "Altre opzioni" per avviare una partita offline. + + Vuoi davvero caricare questo salvataggio, sovrascrivendo il salvataggio esistente nell'area di trasferimento salvataggi? - - Non ti è consentito creare questa sessione di gioco perché uno dei giocatori locali ha le funzionalità online del suo account Sony Entertainment Network disattivate a causa delle restrizioni sulla chat. Deseleziona la casella "Gioco online" in "Altre opzioni" per avviare una partita offline. + + Conversione dati - - Questo gioco utilizza una funzione di autosalvataggio del livello. Quando appare l'icona qui sopra, il gioco sta salvando i dati. -Non spegnere il sistema PlayStation®Vita mentre l'icona è visualizzata. + + NOT USED - - Se l'opzione è abilitata, l'host può attivare o disattivare la possibilità di volare, disabilitare la stanchezza e rendersi invisibile. Trofei e aggiornamenti della classifica verranno disabilitati. + + NOT USED - - ID online schermo condiviso + + {*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 estrarre 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, i trofei 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. +Per andare a sinistra premi {*CONTROLLER_ACTION_DPAD_LEFT*} o per andare a destra {*CONTROLLER_ACTION_DPAD_RIGHT*}. - - Trofei + + 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 i tasti direzionali per salire, scendere e spostarti lateralmente. - - ID online: + + "NOT USED" - - ID online nel gioco + + Se crei, carichi o salvi un mondo in modalità Creativa, i trofei e gli aggiornamenti della classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato in modalità Sopravvivenza. Vuoi davvero continuare? - - Guarda cosa ho fatto in Minecraft: PlayStation®Vita Edition! + + Questo mondo è stato precedentemente salvato in modalità Creativa. I trofei e gli aggiornamenti della classifica sono disabilitati. Vuoi davvero continuare? - - Stai usando la versione di prova di un pacchetto di testo. Avrai accesso all'intero contenuto del pacchetto, ma non potrai salvare i tuoi progressi. -Se cerchi di salvare mentre usi la versione di prova, avrai la possibilità di acquistare la versione completa. - + + "NOT USED" - - Patch 1.04 (Aggiornamento titolo 14) + + Invita Amici - - SELECT + + minecraftforum contiene una sezione dedicata alla PlayStation®Vita Edition. - - Questa opzione, disattiva gli aggiornamenti ai trofei e alle classifiche per questo mondo durante il gioco; le disattiva anche se il gioco viene ricaricato dopo aver salvato con questa opzione attiva. + + Segui @4JStudios e @Kappische su Twitter per le ultime notizie sul gioco! - - Vuoi accedere a "PSN"? + + NOT USED - - I giocatori che non sono sullo stesso sistema PlayStation®Vita del giocatore ospitante, selezionando questa opzione, verranno espulsi dal gioco insieme a tutti i giocatori sul loro sistema PlayStation®Vita. Questi giocatori non potranno rientrare nel gioco finché questo non verrà riavviato. + + Puoi usare il touchscreen per navigare nei menu del sistema PlayStation®Vita! - - Sistema PlayStation®Vita + + Non guardare un Enderman negli occhi! - - Cambia modalità di rete + + {*T3*}COME GIOCARE: MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft per il sistema PlayStation®Vita è un gioco multiplayer con impostazione predefinita.{*B*}{*B*} +Quando avvii o accedi a una partita online, essa sarà visibile alle persone incluse nel tuo elenco di 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 nel loro elenco di amici (se hai selezionato l'opzione "Accetta amici di amici").{*B*} +Durante una partita, premi il tasto SELECT per richiamare un elenco di tutti i giocatori o per espellere altri utenti. - - Scegli modalità di rete + + {*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*} +Gli ID online non vengono visualizzati nello screenshot. - - Scegli "Rete Ad Hoc" per connetterti con altri sistemi PlayStation®Vita nelle vicinanze, o "PSN" per connetterti con amici in tutto il mondo. + + Riteniamo che 4J Studios abbia rimosso Herobrine dal gioco per sistema PlayStation®Vita, ma non ne siamo sicuri. - - Rete Ad Hoc + + Minecraft: PlayStation®Vita Edition ha battuto diversi record! - - "PSN" + + Hai giocato alla versione di prova di Minecraft: PlayStation®Vita Edition per il tempo massimo consentito! Per continuare a divertirti, vuoi sbloccare il gioco completo? - - Scarica salvataggio sistema PlayStation®3 + + Caricamento di "Minecraft: PlayStation®Vita Edition" non riuscito, impossibile continuare. - - Carica salvataggio per sistema PlayStation®3/PlayStation®4 + + Distillazione - - Caricamento annullato + + Sei tornato alla schermata iniziale perché sei uscito da "PSN". - - Hai annullato il caricamento di questo salvataggio nell'area di trasferimento salvataggi. + + Impossibile accedere alla partita poiché uno o più giocatori non hanno accesso al gioco online a causa di restrizioni in chat dell'account Sony Entertainment Network. - - Caricamento dati: %d%% + + Non ti è consentito accedere a questa sessione di gioco perché uno dei giocatori locali ha le funzionalità online del suo account Sony Entertainment Network disattivate a causa delle restrizioni sulla chat. Deseleziona la casella "Gioco online" in "Altre opzioni" per avviare una partita offline. - - Scaricamento dati: %d%% + + Non ti è consentito creare questa sessione di gioco perché uno dei giocatori locali ha le funzionalità online del suo account Sony Entertainment Network disattivate a causa delle restrizioni sulla chat. Deseleziona la casella "Gioco online" in "Altre opzioni" per avviare una partita offline. - - Vuoi davvero caricare questo salvataggio, sovrascrivendo il salvataggio esistente nell'area di trasferimento salvataggi? + + Impossibile creare una partita online: uno o più giocatori non possono disputare partite online a causa delle loro restrizioni sulla chat del loro account Sony Entertainment Network. Deseleziona la casella "Gioco online" in "Altre opzioni" per avviare una partita offline. - - Conversione dati + + Non ti è consentito accedere a questa sessione di gioco perché hai le funzionalità online del tuo account Sony Entertainment Network disattivate a causa delle restrizioni sulla chat. - - Salvataggio + + Connessione a "PSN" persa. Tornerai al menu principale. - - Caricamento completato! + + Connessione a "PSN" persa. - - Caricamento fallito. Riprova più tardi. + + Questo mondo è stato precedentemente salvato in modalità Creativa. I trofei e gli aggiornamenti della classifica sono disabilitati. - - Scaricamento completato! + + Se crei, carichi o salvi un mondo con l'opzione Privilegi dell'host abilitata, i trofei e gli aggiornamenti della classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato con l'opzione disattivata. Vuoi davvero continuare? - - Scaricamento fallito. Riprova più tardi. + + Questa è la versione di prova di Minecraft: PlayStation®Vita Edition. Se avessi avuto il gioco completo, avresti sbloccato un obiettivo! +Sblocca il gioco completo per provare il divertimento di Minecraft per PlayStation®Vita Edition e per giocare con amici di tutto il mondo su "PSN". +Vuoi sbloccare il gioco completo? - - Impossibile entrare nella partita a causa di un tipo di NAT restrittivo. Verificare le impostazioni di rete. + + I giocatori ospiti non possono sbloccare il gioco completo. Connettiti ad un account Sony Entertainment Network. - - - Al momento non esiste un salvataggio disponibile nell'area di trasferimento salvataggi. - Puoi caricare un mondo salvato nell'area di trasferimento salvataggi con Minecraft: PlayStation®3 Edition, e poi scaricarlo con Minecraft: PlayStation®Vita Edition. - + + ID Online - - Salvataggio incompleto + + Questa è la versione di prova di Minecraft: PlayStation®Vita Edition. Se avessi il gioco completo, avresti ottenuto un tema! +Sblocca il gioco completo per provare il divertimento di Minecraft: PlayStation®Vita Edition e per giocare con amici di tutto il mondo su "PSN". +Vuoi sbloccare il gioco completo? - - Minecraft: PlayStation®Vita Edition ha esaurito lo spazio per i salvataggi. Per creare spazio, cancella altri salvataggi di Minecraft: PlayStation®Vita Edition. + + Questa è la versione di prova di Minecraft: PlayStation®Vita Edition. Per accettare questo invito è necessario il gioco completo. +Vuoi sbloccare il gioco completo? + + + Il file salvato nell'area di trasferimento salvataggi ha un numero di versione che Minecraft: PlayStation®Vita Edition non supporta ancora. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/4J_stringsPlatformSpecific.xml index c9fb45c3..f0a1dc1d 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ja-JP/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/4J_stringsPlatformSpecific.xml @@ -1,51 +1,51 @@  - - 本体ストレージに新しいセーブデータを作成するための空き容量がありません - - - "PSN" からサインアウトしました。タイトル画面に戻ります + + Sony Entertainment Network アカウントの設定を保存できませんでした - - "PSN" からサインアウトしました。マッチを終了します + + Sony Entertainment Network アカウントのエラー - - 現在サインインしていません + + Sony Entertainment Network のアカウントに正常にアクセスできませんでした。現在はトロフィーを獲得できません - - このゲームの一部の機能は、"PSN" にサインインしていないと使用できません。現在は "PSN" にサインインしていません + + これは Minecraft: "PlayStation 3" Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! +完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: "PlayStation 3" Editionの楽しさを体験してください。 +完全版を購入しますか? + - - アドホックネットワークがオフラインです + + アドホックネットワークに接続 このゲームの一部の機能は、アドホックネットワークに接続していないと使用できません。現在はオフラインです - - この機能を使うには、"PSN" にサインインしている必要があります - - - "PSN" に接続 - - - アドホックネットワークに接続 + + アドホックネットワークがオフラインです トロフィー獲得のエラー - - Sony Entertainment Network のアカウントに正常にアクセスできませんでした。現在はトロフィーを獲得できません + + "PSN" からサインアウトしました。マッチを終了します - - Sony Entertainment Network アカウントのエラー + + "PSN" からサインアウトしました。タイトル画面に戻ります - - Sony Entertainment Network アカウントの設定を保存できませんでした + + 本体ストレージに新しいセーブデータを作成するための空き容量がありません - - これは Minecraft: PlayStation(R)3 Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! -完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: PlayStation(R)3 Editionの楽しさを体験してください。 -完全版を購入しますか? - + + 現在サインインしていません + + + "PSN" に接続 + + + この機能を使うには、"PSN" にサインインしている必要があります + + + このゲームの一部の機能は、"PSN" にサインインしていないと使用できません。現在は "PSN" にサインインしていません \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/AdditionalStrings.xml index d7c1fb1e..4722047e 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ja-JP/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/AdditionalStrings.xml @@ -7,7 +7,7 @@ 隠す - Minecraft: PlayStation(R)3 Edition + Minecraft: "PlayStation 3" Edition オプション @@ -48,6 +48,12 @@ オプションファイルが破損しているため、削除する必要があります + + オプションファイルを削除 + + + オプションファイルのロードを再試行 + 保存したキャッシュファイルが破損しているため、削除する必要があります @@ -75,6 +81,9 @@ サブアカウントの利用制限を受けているプレイヤーがいるため、Sony Entertainment Networkアカウントのオンラインサービスが無効になっています。 + + ゲームのアップデートが利用可能なため、オンライン機能が無効になっています。 + 現在、このタイトルでダウンロードできるコンテンツはありません @@ -82,9 +91,6 @@ 招待 - さあ、今すぐ Minecraft: PlayStation(R)Vita Edition に参加してみよう! - - - ゲームのアップデートが利用可能なため、オンライン機能が無効になっています。 + さあ、今すぐ Minecraft: "PlayStation Vita" Edition に参加してみよう! \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/EULA.xml index 2e94f6bb..a874ab89 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ja-JP/EULA.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/EULA.xml @@ -1,8 +1,8 @@  - Minecraft: PlayStation(R)Vita Edition - 利用規約 - 本規約は、Minecraft: PlayStation(R)Vita Edition (以下「Minecraft」といいます)における利用条件を定めるものです。Minecraftのダウンロードと利用のルールを定めた本規約は、Minecraftとその利用者を守るために必要なものです。 + Minecraft: "PlayStation Vita" Edition - 利用規約 + 本規約は、Minecraft: "PlayStation Vita" Edition (以下「Minecraft」といいます)における利用条件を定めるものです。Minecraftのダウンロードと利用のルールを定めた本規約は、Minecraftとその利用者を守るために必要なものです。 本題に入る前に、はっきりさせておきたいことがひとつあります。Minecraftは、プレイヤーがものを作ったり壊したりできるゲームです。他のユーザーと一緒にプレイする(マルチプレイ)場合には、仲間と一緒にものを作ったり、仲間が作ったものを壊したりでき、仲間にも同じことをされます。ですから、好ましくない行動をとる人とは一緒にプレイしないでください。時には、すべきでないことをする人たちもいます。好ましいことではありませんが、皆さんに適切な行動をとるようお願いする以外に、当社にできることは多くありません。当社では、違反行為の把握を利用者の皆さんの報告に頼っています。不当な行動をとる人物がいた場合、または誰かが規則や規約に違反していたりMinecraftを不当利用していると思われる場合には、ぜひ当社にお知らせください。当社ではそのための違反報告システムを用意しています。ご報告いただければ、必要な対応を講じます。 問題を報告するには、support@mojang.comに電子メールでそのユーザーの情報や経緯をできるだけ詳しくお知らせください。 では利用規約に戻ります。 @@ -15,10 +15,10 @@ ...また当社の制作物には、Minecraftのクライアントまたはサーバーソフトウェアが含まれますが、それに限定されません。ゲームの修正版や一部、当社の一切の制作物が含まれます。 当社では、上記の他にはユーザーの行動に厳しい制限を設けていません。実際、楽しい行為を推奨しています(下記参照)。ただし、上記の禁止事項だけは行わないでください。 MINECRAFTの利用 - • Minecraftを購入したユーザーは、ユーザー本人がユーザー本人のPlayStation(R)Vita本体でMinecraftを利用することができます。 + • Minecraftを購入したユーザーは、ユーザー本人がユーザー本人の"PlayStation Vita"本体でMinecraftを利用することができます。 • その他の行為についても以下のとおり限定的な権利を付与しますが、ユーザーの行きすぎた行為を防ぐために限度を設けています。当社ではユーザーが当社の制作物に関連したものを制作することを光栄に思いますが、公式なものと解釈されないよう留意し、本規約を順守してください。当社の一切の制作物を決して商用利用しないでください。 • ユーザーが本規約に違反した場合、当社が付与したMinecraftの利用許諾を取り消すことができます。 - • Minecraftを購入したユーザーは、本規約に準じてMinecraftを自身のPlayStation(R)Vita本体にインストールし、自身のPlayStation(R)Vita本体でプレイすることを許可されます。この許可は購入したユーザーにのみ適用され、ユーザーはMinecraft(またはその一部)を(当社に別段の許可を得ている場合を除き)第三者に配布することはできません。 + • Minecraftを購入したユーザーは、本規約に準じてMinecraftを自身の"PlayStation Vita"本体にインストールし、自身の"PlayStation Vita"本体でプレイすることを許可されます。この許可は購入したユーザーにのみ適用され、ユーザーはMinecraft(またはその一部)を(当社に別段の許可を得ている場合を除き)第三者に配布することはできません。 • Minecraftのスクリーンショットと動画は、良識の範囲内において自由に取り扱うことができます。「良識の範囲内」とは、いかなる商用利用もしないこと、不当な行為や当社の権利を侵害する行為をしないことを意味します。また、アート資源をただ流用して配り回るのはやめましょう。不愉快な行為です。 • 基本的にはルールはシンプルです。当社の「ブランドおよび資産の利用に関するガイドライン (Brand and Asset Usage Guidelines)」または本規約において当社の別段の同意がない限り、当社のいかなる作成物も商用利用しないでください。公正使用または公正取引の原理のもと法律で明示的に許されている行為は、問題ありません。ただし法律で許されている範囲に限ります。 MINECRAFTその他の所有 @@ -35,7 +35,7 @@ • ユーザーがMinecraft上で公開するすべてのコンテンツは、自身の創作物でなくてはなりません。第三者の権利を侵害するいかなるコンテンツも、Minecraftを使って公開してはなりません。ユーザーがMinecraft上で投稿したコンテンツについて、第三者の権利を侵害したことにより当社が第三者から意義を申し立てられたり、脅迫を受けたり、訴えられたりした場合には、そのユーザーの責任と見なします。つまり、ユーザーは当社より当社が被った損害の賠償を課される場合があります。したがって、ユーザーは自身で創作したものだけを公開し、他人が創作したコンテンツを公開しないことが非常に重要です。 • 一緒にプレイする相手についても注意してください。他のプレイヤーが真実を述べているのかどうかを、ユーザーや当社が把握することは困難です。プロフィールが真実であるのかさえ分かりません。Minecraftを通して自身の個人情報を教えることも避けてください。 ユーザーがMinecraftを使って作るコンテンツ(以下「自身のコンテンツ」といいます)は、以下のとおりでなくてはなりません。 - - PlayStation(R)Vita本体と"PSN"を利用するためには、"PSN"利用規約(ToSUA)を含む、Sony Entertainment Networkのすべてのガイドラインに同意しなければなりません。 + - "PlayStation Vita"本体と"PSN"を利用するためには、"PSN"利用規約(ToSUA)を含む、Sony Entertainment Networkのすべてのガイドラインに同意しなければなりません。 - 他者に不快を与えない - 違法または非合法ではない - 公正で、人を欺いたりだましたり不当に利用したりせず、他人になりすましていない @@ -66,7 +66,7 @@ • ユーザーによる本規約の違反 • 第三者による本規約の違反 停止 - • ユーザーが本規約に違反した場合、当社はユーザーに付与したMinecraftの使用権を停止することができます。ユーザーもPlayStation(R)Vita本体からMinecraftをアンインストールするだけで、いつでも停止することができます。いかなる場合も「Minecraftの所有」、「当社の責任」、「一般条項」に関する段落は、停止後も適用されます。 + • ユーザーが本規約に違反した場合、当社はユーザーに付与したMinecraftの使用権を停止することができます。ユーザーも"PlayStation Vita"本体からMinecraftをアンインストールするだけで、いつでも停止することができます。いかなる場合も「Minecraftの所有」、「当社の責任」、「一般条項」に関する段落は、停止後も適用されます。 一般条項 • これらの規約にはユーザーの法的権利が適応されます。本規約は、ユーザーの権利を制限するものではなく、当社の過失や不正表示による死亡事故や人身傷害の責任を除外したり制限するものでもありません。 • 当社はこれらの規約内容を変更することがありますが、その変更は法律が適用される範囲内のものです。たとえば、お客様がシングルプレイモードでMinecraftをご利用で、当社がご提供するアップデートを使わない場合、既存のエンドユーザーライセンス契約(EULA)が適応されます。しかしアップデートを使用したり、当社がご提供するオンラインサービスに依存するMinecraftのコンテンツを使用する場合、新しいエンドユーザーライセンス契約(EULA)が適応されます。このような場合、当社からお客様に変更をお伝えすることができない場合がありますし、当社にはこれらの変更をお客様にお伝えする義務もありません。ですから、時々このページに戻り規約内容の変更をご確認いただきますようお願いいたします。当社は不公平な提案は嫌いです。しかし時々法律が変わるのはしかたがないことです。さらにMinecraftのユーザーに影響を与えるような行動を取る人がいるのも事実であり、規則を定めるしかないのです。 @@ -84,7 +84,7 @@ - インゲームストア内のすべてのコンテンツは、Sony Network Entertainment Europe Limited ("SNEE")から購入することとなり、Sony Entertainment Networkの利用規約と条件の対象となります。利用規約と条件はPlayStation(R)Storeにてご提供しています。各アイテムによって内容が違う場合がありますので、ご購入前に使用権情報をご確認ください。特に記述がないかぎり、インゲームストア内のコンテンツの対象年齢は、ゲームと同じものとします。 + インゲームストア内のすべてのコンテンツは、Sony Network Entertainment Europe Limited ("SNEE")から購入することとなり、Sony Entertainment Networkの利用規約と条件の対象となります。利用規約と条件は"PlayStation Store"にてご提供しています。各アイテムによって内容が違う場合がありますので、ご購入前に使用権情報をご確認ください。特に記述がないかぎり、インゲームストア内のコンテンツの対象年齢は、ゲームと同じものとします。 アイテムの使用と購入は利用規約と条件の対象となります。ユーザーに対し、このオンラインサービスの使用を許諾しているのはSony Computer Entertainment Americaです。 diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsGeneric.xml index 61888981..87a07dd3 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsGeneric.xml @@ -1,4999 +1,5822 @@  - - 新しいダウンロード コンテンツが追加されました! メイン メニューの [Minecraft ストア] からアクセスできます + + オフライン ゲームに切り替える - - Minecraft ストアのスキン パックを使えば、あなたのキャラクターの外見を変えられます。メイン メニューの [Minecraft ストア] から品ぞろえを確認してくださいね + + ホストがゲームをセーブしています。しばらくお待ちください - - ガンマ設定を変更すると、ゲームの明るさを調整できます + + 果ての世界に入る - - 難易度を「ピース」に設定すると、HP が自動的に回復し、夜間にモンスターが出現しなくなります! + + プレイヤーをセーブ中 - - オオカミに骨を与えて、手なずけましょう。おすわりさせたり、あなたについてこさせたりできます + + ホストサーバーに接続中 - - 持ち物メニューで、カーソルをメニュー外に動かして、{*CONTROLLER_VK_A*} を押すと、アイテムを落とすことができます + + 地形をダウンロード中 - - 夜間にベッドで寝ると、朝まで時間をスキップすることができます。マルチプレイヤー ゲームでは、すべてのプレイヤーが寝ている必要があります + + 果ての世界を出る - - 豚から取れる豚肉を調理して食べると HP が回復します + + 最後に使用したベッドがなくなっているか、アクセスできません - - 牛から取った革を使用して防具を作りましょう + + モンスターが近くにいる時に休むのは危険です - - 空のバケツがあれば、牛のミルクを搾ったり、水を汲んだり、溶岩を入れたりできます + + あなたは寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります - - くわを使って、土地を耕しましょう + + このベッドは使用中です - - クモは日中は、こちらから攻撃しない限り攻撃してきません + + 夜の間しか眠ることはできません - - 手で地面や砂を掘るよりも、シャベルを使ったほうが速く掘れます + + %s は寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります - - 豚肉は生で食べるよりも、調理したほうが HP を多く回復します + + レベルを読み込み中 - - たいまつを作って、夜に明かりとして使いましょう。たいまつの回りにはモンスターが近寄ってこなくなります + + 最終処理中... - - トロッコとレールを使えば、早く目的地に着けます + + 地形を構築中 - - 苗木を植えれば、成長して木になります + + 世界のシミュレート中 - - ピッグマンは、こちらから攻撃しない限り、攻撃してきません + + ランク - - ベッドで寝ることで、復活地点の変更と、夜から朝へ時間を早回しすることができます + + セーブレベル - - ガストに火の玉を打ち返してやりましょう! + + 詳細を設定中... - - 闇のポータルを作れば、別の世界である暗黒界に行くことができます + + サーバーを初期化中 - - {*CONTROLLER_VK_B*} を押すと、手に持っているアイテムを落とします! + + 暗黒界を出る - - 目的にあった道具を使いましょう! + + 復活中 - - たいまつに使う石炭が見つからないときには、かまどを使って木から木炭を作ることができます + + レベルを生成中 - - 真下や真上に掘り進むのは、賢いとはいえません + + 復活地点を作成中 - - ガイコツの骨から作った骨粉は肥料として使えて、色々なものを一瞬で成長させることができます! + + 復活地点を読み込み中 - - クリーパーは近づくと爆発します! + + 暗黒界に入る - - 溶岩の源のブロックに水が触れると、黒曜石ができます + + 道具と武器 - - 溶岩の源のブロックを取り除くと、溶岩はしばらくして完全に消えてしまいます + + ガンマ - - 丸石はガストの火の玉を防いでくれます。ポータルを守るのに使えます + + ゲームでの感度 - - 光源に使用できるブロックは、雪や氷を溶かすことができます。たいまつ、光石、カボチャ ランタンなどのブロックです + + メニューでの感度 - - 屋外にウールで建物を建てる場合には、注意しましょう。雷が当たると燃えてしまいます + + 難易度 - - バケツ 1 杯の溶岩があれば、かまどで 100 個のブロックを精錬できます + + BGM - - 音ブロックで演奏される楽器は、ブロックの下の材質で変化します + + 効果音 - - ゾンビやガイコツは、水の中では太陽の光に当たっても大丈夫です + + ピース - - オオカミを攻撃すると、近くにいるすべてのオオカミが襲い掛かってきます。ゾンビ ピッグマンも同じ習性を持っています + + プレイヤーの HP は自動で回復し、敵もいません - - オオカミは暗黒界に入ることができません + + 敵は出現しますが、ノーマル モードほど攻撃力が高くありません - - オオカミはクリーパーを攻撃しません + + 敵が出現し、その攻撃力は普通です - - ニワトリは 5~10 分ごとにタマゴを生みます + + イージー - - 黒曜石を掘り出すには、ダイヤモンドのツルハシが必要です + + ノーマル - - クリーパーからは火薬がもっとも簡単に手に入ります + + ハード - - チェスト 2 つを並べて配置すれば、1 つの大きなチェストになります + + サインアウト - - 手なずけたオオカミの HP は尻尾の状態で分かります。回復するには、肉を与えましょう + + 防具 - - 緑色の染料を作るには、サボテンをかまどで調理します + + 機械 - - [遊び方] の [最新情報] に、最新のアップデートに関する情報があります + + 乗り物 - - 柵を積み重ね可能としました + + 武器 - - 動物の中には、小麦を持っているとついてくるものがいます + + 食べ物 - - いずれかの方向に 20 ブロック以上動けない動物は消滅しません + + 建物 - - BGM 制作: C418 + + 飾り - - Notch の Twitter には 100 万人以上のフォロワーがいます! + + 調合 - - スウェーデン人みんなが金髪というわけではありません。たとえば、Mojang の Jens は赤毛です + + 道具、武器、防具 - - アップデートも予定中です。お楽しみに! + + 材料 - - Notch って誰? + + 建設用ブロック - - Mojang はスタッフの数より受けた賞の数の方が多かったりします + + レッドストーンと乗り物 - - 有名人も Minecraft をプレイ中! + + その他 - - deadmau5 は Minecraft が大好き! + + 登録数: - - 虫と目を合わせてはいけません + + セーブせずに終了 - - クリーパーはプログラムのバグから発生します + + 本当にメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます - - ニワトリ? それともアヒル? + + 本当にメイン メニューに戻ってもよろしいですか? ここまでの途中経過は失われてしまいます - - MineCon には参加しましたか? + + このセーブ データは破損しています。削除しますか? - - Mojang のスタッフですらジャンクボーイの素顔は知りません + + 現在のゲームを終了し、すべてのプレイヤーとの接続を切断してメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます - - Minecraft Wiki があるのを知っていますか? + + セーブして終了 - - Mojang の新しい事務所はとっても最高! + + 新しい世界 - - MineCon 2013 はフロリダ州オーランド (アメリカ合衆国) で開催されました! + + 新しい世界の名前を入力してください - - .party() は最高でした! + + 世界生成のシードを入力してください + + + セーブした世界をロードする + + + チュートリアルをプレイ + + + チュートリアル + + + 新しい世界に名前をつける + + + セーブ データの破損 + + + OK + + + キャンセル + + + Minecraft ストア + + + 回転する + + + 隠す + + + すべての枠を空にする + + + 本当に現在プレイしているゲームを終了して、新しいゲームに参加してもよろしいですか? セーブしていない途中経過は失われてしまいます + + + 以前のこの世界のセーブ データを、現在のデータで上書きしてもよろしいですか? + + + 本当にセーブせずメイン メニューに戻ってもよろしいですか? この世界での途中経過は失われてしまいます + + + ゲームを始める + + + ゲームを終了 + + + ゲームをセーブ + + + セーブせずに終了 + + + START を押してゲームに参加 + + + おめでとうございます! Minecraft の Steve のゲーマー アイコンを獲得しました! + + + おめでとうございます! クリーパーのゲーマー アイコンを獲得しました! + + + 完全版を購入 + + + 相手のプレイヤーのゲームのバージョンが新しいため、ゲームに参加できません + + + 新しい世界 + + + アワードをアンロックしました! + + + 今はお試し版をプレイ中です。データをセーブするためには完全版を購入いただく必要があります +今すぐ完全版を購入しますか? + + + フレンド + + + マイスコア + + + 通算 + + + お待ちください + + + 結果なし + + + フィルター: + + + 相手のプレイヤーのゲームのバージョンが古いため、ゲームに参加できません + + + 接続が切断されました + + + サーバーとの接続が切断されました。メイン メニューに戻ります + + + サーバーにより切断されました + + + ゲームを終了 + + + エラーが起こりました。メイン メニューに戻ります + + + 接続に失敗しました + + + ゲームから追放されました + + + ホストがゲームを終了しました + + + この世界でプレイ中のフレンドがいないため、この世界には入れません + + + 以前にホストにより追放されているため、この世界には入れません + + + 空を飛んだため、ゲームから追放されました + + + 接続に時間がかかりすぎています + + + サーバーが満員です + + + 敵が出現し、その攻撃力がアップします。また、一瞬近づいただけでもクリーパーが爆発するようになるので注意しましょう + + + テーマ + + + スキン パック + + + フレンドのフレンドを許可 + + + プレイヤーを追放 + + + このプレイヤーをゲームから追放しますか? 追放されたプレイヤーは、この世界を再スタートするまで世界に入れなくなります + + + ゲーマー アイコン パック + + + この世界への参加は、ホスト プレイヤーのフレンドのみに制限されています + + + 破損したダウンロード コンテンツ + + + このダウンロード コンテンツは破損しているため使用できません。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください + + + 破損して使用できないダウンロード コンテンツがあります。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください + + + 世界に入れません + + + 選択中 + + + 選択したスキン: + + + 完全版を購入 + + + テクスチャ パックのロック解除 + + + このテクスチャ パックを世界で使用するには、これをロック解除してください。 +今すぐテクスチャ パックをロック解除しますか? + + + テクスチャ パック試用版 + + + シード + + + スキン パックのロック解除 + + + 選択したスキンを使用するには、スキン パックをロック解除してください。 +今すぐスキン パックをロック解除しますか? + + + 現在お使いのテクスチャ パックは試用版です。完全版を利用しない場合、この世界はセーブできません。 +テクスチャ パックの完全版を購入しますか? + + + 完全版をダウンロード + + + この世界は、持っていないテクスチャ パック、またはマッシュアップ パックが使用されています。 +今すぐこのテクスチャ パック、またはマッシュアップ パックをインストールしますか? + + + 試用版を購入 + + + テクスチャ パックを持っていません + + + 完全版を購入 + + + 試用版をダウンロード + + + ゲームモードを変更しました + + + 有効にすると、招待されたプレイヤーしか参加できません + + + 有効にすると、フレンド リストのフレンドのみゲームに参加できます + + + 有効にすると、プレイヤーが他のプレイヤーにダメージを与えられるようになります。(サバイバル モードのみ) + + + ノーマル + + + スーパーフラット + + + 有効にすると、オンラインのゲームになります + + + 無効にすると、このゲームに参加したプレイヤーは許可をもらわないかぎり建設や採掘ができません + + + 有効にすると、村や要塞などの建物が世界に生成されるようになります + + + 有効にすると、地上界および暗黒界に、まったく平らな世界を生成します + + + 有効にすると、プレイヤーの復活地点の近くに便利なアイテムの入ったチェストが出現します + + + 有効にすると、火は近くの可燃性ブロックに燃え広がります + + + 有効にすると、TNT 火薬を起爆すると爆発します + + + 有効にすると暗黒界を再生成します。暗黒砦が存在しないセーブ データがある場合に便利です + + + オフ + + + ゲームモード: クリエイティブ + + + サバイバル + + + クリエイティブ + + + 世界の名前を変更する + + + 世界の新しい名前を入力してください + + + ゲームモード: サバイバル + + + サバイバル モードで作成 + + + セーブデータの名前を変更する + + + %d 秒後にオートセーブを開始します... + + + オン + + + クリエイティブ モードで作成 + + + 雲を表示する + + + このセーブデータに対する操作を選んでください + + + 画面表示サイズ (画面分割) + + + 材料 + + + 燃料 + + + 分配装置 + + + チェスト + + + エンチャント + + + かまど + + + 現在、このタイプのダウンロードできるコンテンツはありません + + + 本当にこのセーブデータを削除してもよろしいですか? + + + 承認待ち + + + 検閲済み + + + %s が世界にやってきました + + + %s が世界を去りました + + + %s が追放されました + + + 調合台 + + + 看板の文字を入力 + + + 看板の文字を入力してください + + + タイトルを入力 + + + お試し版タイムアウト + + + 完全版 + + + 既に満員のため、ゲームに参加できませんでした + + + 投稿のタイトルを入力してください + + + 投稿の説明を入力してください + + + 持ち物 + + + 材料 + + + キャプションを入力 + + + 投稿のキャプションを入力してください + + + 説明を入力 + + + プレイ中: + + + この世界をアクセス禁止リストに登録しますか? +OK を選択すると、この世界でのプレイを終了します + + + アクセス禁止を解除 + + + オートセーブの間隔 + + + アクセスが禁止されています + + + アクセス禁止リストに登録されている世界に参加しようとしています。 +このまま参加すると、この世界はアクセス禁止リストから外されます + + + アクセス禁止にしますか? + + + オートセーブの間隔: オフ + + + インターフェースの不透明度 + + + オートセーブを実行します + + + 画面表示サイズ + + + + + + ここには置けません + + + 復活したプレイヤーにダメージを与える可能性があるため、復活地点の近くに溶岩を置くことはできません + + + お気に入りのスキン + + + %s のゲーム + + + ななしのホストのゲーム + + + ゲストがサインアウトしました + + + 設定を元に戻す + + + 本当に設定を最初の状態に戻してもよろしいですか? + + + ロード エラー + + + ゲスト プレイヤーの 1 人がサインアウトしたため、すべてのゲスト プレイヤーがゲームから取り除かれました + + + ゲームを作成できません + + + 自動選択されました + + + デフォルト スキン + + + サインイン + + + サインインしていません。このゲームをプレイするにはサインインが必要です。今すぐサインインしますか? + + + マルチプレイが制限されています + + + 飲む + + + このエリアには、畑があります。畑では、食べ物などの繰り返し生産できる資源を作り出すことができます + + + {*B*} + 農作業の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 農作業の説明を飛ばす: {*CONTROLLER_VK_B*} + + + 小麦、カボチャ、スイカは、種から育てます。小麦の種は、背の高い草を切ったり、小麦を栽培することで手に入れることができます。カボチャの種やスイカの種は、それぞれ、カボチャやスイカから入手します + + + クリエイティブ モードの持ち物を開くには {*CONTROLLER_ACTION_CRAFTING*} を押してください + + + 続けるには穴の反対側へ移動してください + + + クリエイティブ モードのチュートリアルを完了しました + + + 種をまく前に、くわをつかって土のブロックを耕地に変える必要があります。近くに水源や光源があり、十分な水と光が供給されていると作物が早く成長します + + + サボテンは砂に植える必要があり、成長すると 3 ブロックの高さになります。サトウキビと同様、下のブロックを収穫すると、上にあるブロックもすべて収穫できます。{*ICON*}81{*/ICON*} + + + きのこは薄暗いエリアに植えましょう。隣接する薄暗いブロックに広がっていきます。{*ICON*}39{*/ICON*} + + + 骨粉は作物を最大まで成長させたり、きのこを巨大なきのこに成長させることができます。{*ICON*}351:15{*/ICON*} + + + 小麦は何段階かに変化しながら成長していき、色が濃くなると収穫できるようになります。{*ICON*}59:7{*/ICON*} + + + カボチャとスイカの場合は、茎が太くなってきたら、種をまいた場所の隣に実ができるためのブロックが必要になります + + + サトウキビは、水ブロックと隣接する、草、土、砂のブロックに植える必要があります。また、サトウキビのブロックは中ほどを収穫すると、上にあるブロックもすべて収穫されます。{*ICON*}83{*/ICON*} + + + クリエイティブ モードではほとんどのアイテムやブロックが無限に使えます。また、道具がなくても 1 回クリックするだけでブロックが破壊できるほか、攻撃されてもダメージを受けなくなり、飛行も可能です + + + このエリアには、ピストン付きの回路を作るためのアイテムを入れたチェストがあります。すでにある回路を改造したり、1 から回路を作成したりしてみてください。チュートリアル エリアの外には、さらに多くの見本があります + + + このエリアには、暗黒界へのポータルが存在します! + + + {*B*} + ポータルと暗黒界の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ポータルと暗黒界の説明を飛ばす: {*CONTROLLER_VK_B*} + + + レッドストーンの粉は、鉄、ダイヤモンド、金のツルハシでレッドストーン鉱石を掘ると手に入ります。レッドストーンの粉を使って電気を伝えることができます。ただし、伝えられるのは距離にして 15 ブロック分、上下には 1 ブロック分までとなります + {*ICON*}331{*/ICON*} + + + レッドストーン反復装置で電気の届く距離を伸ばしたり、回路を遅延させたりすることができます + {*ICON*}356{*/ICON*} + + + ピストンは電気が送られると伸びて、最大 12 個のブロックを押します。吸着ピストンであれば、戻るときに大半の種類のブロックを 1 つ引き寄せることができます + {*ICON*}33{*/ICON*} + + + ポータルは、黒曜石のブロックで横 4 ブロック、縦 5 ブロックの枠を作成することで完成します。角のブロックは必要ありません。 + + + 暗黒界をうまく利用して地上界を高速移動することができます。暗黒界での 1 ブロックの距離は、地上界での 3 ブロックに相当します + + + クリエイティブ モードになりました + + + {*B*} + クリエイティブ モードの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + クリエイティブ モードの説明を飛ばす: {*CONTROLLER_VK_B*} + + + ポータルを起動するには、火打ち石と打ち金で、フレーム内の黒曜石に火をつけましょう。枠が壊れたり、近くで爆発が起きたり、液体を流したりすると、ポータルは停止します + + + ポータルを使用するには、ポータルの中に立ちましょう。画面が紫色に変わり、音がし始め、しばらくすると、別世界へテレポートできます + + + 暗黒界はあちこちで溶岩が噴き出す危険な場所ですが、暗黒石や光石を手に入れるには最適な場所です。暗黒石は火をつけると、消えることなく燃え続け、光石は、光を発生させます + + + 農作業のチュートリアルを完了しました + + + 材料ごとに適した道具があります。木の幹を切り出す場合は斧を使うのがよいでしょう + + + 材料ごとに適した道具があります。石や鉱石を掘り出す場合はツルハシを使うのがよいでしょう。特定の種類のブロックを掘るためには、さらに優れた材料を使ってツルハシを作る必要があるかもしれません + + + 特定の道具は敵を攻撃するのに向いています。剣を使うと良いでしょう + + + アイアン ゴーレムは村に自然に現れて村人を守ることもあります。村人を攻撃すると、このアイアン ゴーレムが反撃します + + + チュートリアルを終えるまで、このエリアから出ることはできません + + + 材料ごとに適した道具があります。土や砂などの柔らかいものを掘る場合はシャベルを使うのがよいでしょう + + + ヒント: 手や、手に持っているアイテムを使って、掘ったり切ったりするには、{*CONTROLLER_ACTION_ACTION*} を押し続けます。道具を作らないと、掘れないブロックもあります + + + 川のそばにあるチェストの中に、ボートが入っています。ボートを使うには、ポインターを水に合わせて {*CONTROLLER_ACTION_USE*} を押します。ボートに乗るにはポインターをボートに合わせて {*CONTROLLER_ACTION_USE*} を押しましょう + + + 池のそばにあるチェストの中に、釣り竿が入っています。使うには、チェストから釣り竿を出してから、手に持って使うアイテムに選んでください + + + このピストン装置は、自動建設される橋です。ボタンを押して、装置の動きを調べてみましょう + + + 道具は使っていると、少しずつ壊れていきます。使うたびに少しずつ損傷していき、最後は完全に壊れます。アイテムの下にあるゲージで、現在の状態が分かります + + + 上に向かって泳ぐには {*CONTROLLER_ACTION_JUMP*} を押し続けます + + + このエリアではレールの上をトロッコが走っています。トロッコに乗るには、ポインターをトロッコに合わせて {*CONTROLLER_ACTION_USE*} を押します。トロッコを動かすには、ボタンにポインターを合わせて {*CONTROLLER_ACTION_USE*} を押しましょう + + + アイアン ゴーレムは、鉄のブロック 4 つを T 字に並べ、中央にカボチャをのせて完成します。作った人の敵を攻撃します + + + 牛、ムーシュルーム、羊には小麦を、豚にはニンジンを、ニワトリには小麦の種または暗黒茸、オオカミには肉を与えましょう。すると、近くにいる求愛モードの仲間を探し始めます + + + ともに求愛モードの同種の動物が出会うと、少しの間キスをして、動物の赤ちゃんが誕生します。赤ちゃんは、成長するまでは、両親の後ろをついて回ります + + + 一度求愛モードになった動物は、5 分間は再び求愛モードになることはありません + + + このエリアでは動物が飼育されています。動物を飼育して子供を増やすことができます + + + {*B*} + 動物の繁殖の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 動物の繁殖の説明を飛ばす: {*CONTROLLER_VK_B*} + + + 動物を繁殖させるには、動物にあった餌を与えて、動物たちを「求愛モード」にしてやる必要があります + + + 手にえさを持っていると、あなたの後ろをついてくる動物もいます。この習性を利用すれば、簡単に動物を一か所に集めことができるでしょう。{*ICON*}296{*/ICON*} + + + {*B*} + ゴーレムの説明を続ける{*CONTROLLER_VK_A*}{*B*} + ゴーレムの説明を飛ばす{*CONTROLLER_VK_B*} + + + ゴーレムは、重ねたブロックの一番上にカボチャをおいて完成します + + + スノー ゴーレムは、雪ブロックを 2 つ重ね、その上にカボチャをのせて完成します。作った人の敵に、雪玉を投げます + + + 野生のオオカミは、骨を与えることで手なずけることができます。オオカミを手なずけると周りにハートマークが現れます。手なずけたオオカミは、座らせていないときはプレイヤーにつき従い守ってくれます + + + 動物の繁殖のチュートリアルを完了しました + + + このエリアには、スノー ゴーレムやアイアン ゴーレムを作るためのカボチャやブロックがあります + + + 電気の源を配置する位置や向きで、周囲のブロックへの効果が変わります。たとえば、ブロックに設置されたレッドストーンのたいまつは、そのブロックに電気が送られると消えます + + + 大釜が空になったら、水バケツを使って水を溜めてください + + + 調合台を使って耐火ポーションを作りましょう。水のビン、暗黒茸とマグマクリームを用意してください + + + ポーションを使うには、ポーション手に持って {*CONTROLLER_ACTION_USE*} を押します。普通のポーションは飲んだ本人に効果を発揮します。スプラッシュポーションの場合は、投げて落ちた所の周囲にいるクリーチャーに効果を発揮します + スプラッシュポーションは普通のポーションに火薬を混ぜ合わせると作れます + + + {*B*} + 調合とポーションの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 調合とポーションの説明を飛ばす: {*CONTROLLER_VK_B*} + + + 調合では、最初に水のビンを作ります。チェストからガラスビンを出しましょう + + + 水の入った大釜か水のブロックからガラスビンに水を移します。水源にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押してガラスビンに水を詰めてください + + + 耐火ポーションを自分に使ってみましょう + + + アイテムをエンチャントするには、まずアイテムをエンチャントの枠に入れてください。武器や防具、一部の道具にエンチャントすることで、ダメージ耐性を上げたり、採掘量を増やしたりなどの特別なボーナスを付加できます + + + エンチャントの枠にアイテムを入れると、右側のボタンにランダムなエンチャントが表示されます + + + ボタンに表示される数値はそのエンチャントを行うのに必要な経験値を表します。経験値が足りない場合、使えないボタンは無効になります + + + 火と溶岩に対する耐性が上がりました。これまで行けなかった場所にも行けるので試してみましょう + + + これがエンチャントの画面です。武器や防具、一部の道具にエンチャントすることで、特別なボーナスを付加できます + + + {*B*} + エンチャント画面の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + エンチャント画面の説明を飛ばす: {*CONTROLLER_VK_B*} + + + ここには調合台、大釜と調合に必要なアイテムが詰まったチェストがあります. + + + 木炭は燃料として使えます。棒と組み合わせると、たいまつになります + + + 材料を入れる所に砂を入れると、ガラスを作ることができます。小屋の窓用にガラスを作ってみましょう + + + これが調合の画面です。さまざまな効果を発揮するポーションを作ることができます + + + 木でできているアイテムの多くが燃料として使えますが、種類によって燃える時間が異なります。さらに木以外にも燃料として使えるアイテムがあります + + + アイテムの加工が終わると、その完成したアイテムを持ち物へ移動できます。様々な材料を使って、何が出来上がるのかいろいろ実験してみましょう + + + 木を材料に使うと、木炭が出来上がります。かまどに燃料を入れ、材料を入れる所に木を入れてください。木炭が出来上がるには少し時間がかるので、その間は他のことをしながら、時々進み具合を確かめに戻って来ましょう + + + {*B*} + 調合台の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 調合台の説明を飛ばす: {*CONTROLLER_VK_B*} + + + 発酵したクモの目を加えると、ポーションが腐敗して効果が反転します。また、火薬を加えるとポーションがスプラッシュポーションになり、投げると落ちた場所の周囲に効果を発揮するようになります + + + まず暗黒茸を水のビンに加え、それからマグマクリームを足すことで耐火のポーションを作りましょう + + + 調合画面を閉じるには {*CONTROLLER_VK_B*} を押します + + + 調合を行うには、上の枠に材料を入れ、下の枠にポーションまたは水のビンを入れます (一度に 3 つまで調合可能)。正しい組み合わせの材料が置かれると調合が始まり、少し待てばポーションの出来上がりです + + + ポーションの調合にはまず水のビンが必要です。また、ほとんどのポーションは暗黒茸から不完全なポーションを作るところから始め、完成させるには少なくともあと 1 種類の材料を必要とします + + + ポーションを作ったら、その効果を変えることができます。レッドストーンの粉を加えると効果の持続時間が延長され、光石の粉を加えると効果がより強くなります + + + エンチャントを行うには、エンチャントを選んで {*CONTROLLER_VK_A*} を押してください。エンチャントのコストに応じて経験値レベルが下がります + + + 釣りを始めるには {*CONTROLLER_ACTION_USE*} を押します。リールを巻き上げるときも {*CONTROLLER_ACTION_USE*} を押してください + {*FishingRodIcon*} - - ウワサは鵜呑みにしないこと。ほどほどに信じるのが一番! + + 水の表面にある浮きが沈むまで待ってから、釣り糸を巻き上げて魚を釣り上げます。魚は生でも食べられますし、かまどで調理することもできます。食べると HP が回復します + {*FishIcon*} - - {*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*} を押すと、そのアイテムを落とします + + 釣り竿は 様々な道具と組み合わせることができますが、その用途は比較的限られています。しかし魚を釣る以外のこともできます。釣り竿を使って他に何が釣れるのか、どんなことができるのか、いろいろ試してみましょう + {*FishingRodIcon*} - - {*T3*}遊び方: 画面の表示{*ETW*}{*B*}{*B*} -画面上にはプレイヤーのステータスが表示されています。HP、空気の残り (水中の場合)、空腹度 (何か食べると回復する)、装備している防具などです。 -空腹ゲージの {*ICON_SHANK_01*} が 9 個以上ある状態では、HP が自然に回復します。食べ物を食べると空腹ゲージは回復します。{*B*} -経験値ゲージには、現在の経験値レベルを示す数字と次のレベルまでに必要な値を示すゲージが表示されます。 -経験値は、生き物を倒した時、特定のブロックを採掘した時、動物を繁殖させた時、釣り、かまどで鉱石を製錬した時などに獲得できる経験値オーブを集めると貯まっていきます。{*B*}{*B*} -さらに使用できるアイテムも表示され、{*CONTROLLER_ACTION_LEFT_SCROLL*} と {*CONTROLLER_ACTION_RIGHT_SCROLL*} で手に持つアイテムを切り替えられます. + + ボートを使えば、水上を速く移動することができます。舵を取るには {*CONTROLLER_ACTION_MOVE*} と {*CONTROLLER_ACTION_LOOK*} を使います + {*BoatIcon*} - - {*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*} を押すと、染めることができます。 + + 釣り竿を手にしました。使うには {*CONTROLLER_ACTION_USE*} を押します{*FishingRodIcon*} - - {*T3*}使い方: チェスト{*ETW*}{*B*}{*B*} -チェストを作ったら、それをゲームの世界に置きましょう。{*CONTROLLER_ACTION_USE*} でチェストを使って、中にアイテムを保管できます。{*B*}{*B*} -ポインターを使って、アイテムを持ち物からチェストに、あるいはその逆に移せます。{*B*}{*B*} -チェストに入れたアイテムはそのまま保管され、後でまた自分の持ち物に戻すことができます + + {*B*} + 魚釣りの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 魚釣りの説明を飛ばす: {*CONTROLLER_VK_B*} - - {*T3*}使い方: チェスト (大){*ETW*}{*B*}{*B*} -2 つのチェストを横に並べて置くと、チェスト (大) になります。よりたくさんのアイテムを保管できます。{*B*}{*B*} -使い方は普通のチェストと同じです + + これがベッドです。夜になってからベッドにポインターを当てて {*CONTROLLER_ACTION_USE*} を押すと、朝まで眠ることができます{*ICON*}355{*/ICON*} - - {*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*} -作業台での作業も通常の工作と流れは同じですが、工作ウィンドウが大きくなり、より多くのアイテムを作れるようになります + + {*B*} + レッドストーン回路とピストンの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + レッドストーン回路とピストンの説明を飛ばす: {*CONTROLLER_VK_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*} -それから取り付けたスイッチを使うと、分配装置がアイテムを撃ち出します + + {*B*} + ベッドの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ベッドの説明を飛ばす: {*CONTROLLER_VK_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*}ガストの涙{*ETW*}{*B*} -* {*T2*}ブレイズの粉{*ETW*}{*B*} -* {*T2*}マグマクリーム{*ETW*}{*B*} -* {*T2*}輝くスイカ{*ETW*}{*B*} -* {*T2*}レッドストーンの粉{*ETW*}{*B*} -* {*T2*}光石の粉{*ETW*}{*B*} -* {*T2*}発酵したクモの目{*ETW*}{*B*}{*B*} - -調合できる材料の組み合わせはたくさんありますので、色々と実験してみてください! + + ベッドは安全で明るい場所に置かないといけません。さもないと、夜中にモンスターに襲われてしまいます。ベッドで眠ると、次の力尽きた時の復活地点が、そのベッドに変更されます + {*ICON*}355{*/ICON*} - - {*T3*}使い方: エンチャント{*ETW*}{*B*}{*B*} -モンスターや動物を倒したり、採掘したり、かまどを使った精錬や料理で獲得した経験値は、一部の道具、武器、防具、本のエンチャントに使えます。{*B*} -剣、弓、斧、ツルハシ、シャベル、防具、または本をエンチャントテーブルの本の下の枠に置くと、右側のボタンにエンチャントとエンチャントで消費される経験値が示されます。{*B*} -エンチャントに必要な経験値は、不足している場合は赤、足りている場合は緑で表示されます。{*B*}{*B*} -エンチャントは消費可能な経験値の範囲でランダムに選択されます。{*B*}{*B*} -エンチャントテーブルの周囲に、テーブルとブロック 1 つ分のすき間を空けて本棚 (最大 15 台) を並べることで、エンチャントのレベルが上がります。またエンチャントテーブル上の本から謎の文字が出るエフェクトが表示されます。{*B*}{*B*} -エンチャントテーブルに必要な材料は、すべてゲームの世界内の村や、採掘、農耕などで手に入ります。{*B*}{*B*} -エンチャントの本は、金床でアイテムをエンチャントする際に使います。これによって、アイテムに付与するエンチャントの内容をより制御できるようになります。{*B*} + + ゲーム内に他のプレイヤーがいる場合、眠るためには全員が同時にベッドに入っていなければなりません + {*ICON*}355{*/ICON*} - - {*T3*}遊び方: 動物の飼育{*ETW*}{*B*}{*B*} -動物を特定の場所で飼うには 20 x 20 ブロック未満のエリアに柵を立て、その中に動物を入れます。これで動物は柵の中にとどまり、いつでも様子を見ることができます + + {*B*} + ボートの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + ボートの説明を飛ばす: {*CONTROLLER_VK_B*} - - {*T3*}遊び方: 動物の繁殖{*ETW*}{*B*}{*B*} -Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ちゃんバージョン -を産み出します!{*B*} -動物を繁殖させるには、その動物に合った餌を与えて、動物たちを「求愛モー -ド」に導く必要があります。{*B*} -牛、ムーシュルーム、羊には小麦、豚にはニンジン、ニワトリには小麦の種か暗 -黒茸、オオカミには肉を与えましょ う。すると、近くにいる求愛モードの仲間 -を探し始めます。{*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*} -プレイ中の世界が不適切なコンテンツを含んでいる場合、その世界をアクセス禁止リストに登録できます。 -世界をアクセス禁止リストに登録するには、ポーズ メニューを開き、{*CONTROLLER_VK_RB*} を押して、[アクセスを禁止] を選択します。 -次にその世界でプレイしようとすると、アクセス禁止リストに登録されていることが通知され、リストから外してプレイするか、プレイをキャンセルして戻るか選択できます + + エンチャントは経験値を消費します。経験値は、モンスターや動物を倒したり、採掘したり、動物を繁殖させたり、釣りをしたり、かまどを使った精錬や料理などで生成される経験値オーブを集めることで、貯まっていきます - - {*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_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*} - {*KICK_PLAYER_DESCRIPTION*}{*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*} + エンチャントの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + エンチャントの説明を飛ばす: {*CONTROLLER_VK_B*} - - 基本 + + エンチャントのビンを使って経験値を貯めることもできます。投げると落ちた場所に経験値オーブが出現するので、集めて経験値を貯めましょう - - 画面の表示 + + トロッコはレールの上を走ります。かまどを乗せた動力つきのトロッコや、チェストがついたトロッコを作ることもできます + {*RailIcon*} - - 持ち物 + + トロッコのスピードを上げるために、レッドストーンのたいまつや回路から動力を得る加速レールを作ることができます。これはスイッチやレバー、重量感知板などを組み合わせた、複雑な装置になります + {*PoweredRailIcon*} - - チェスト + + 今ボートに乗っています。ボートから降りるには、ポインターをボートに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*BoatIcon*} - - 工作 + + ここにあるチェストにはエンチャントされたアイテムや、エンチャントのビンのほか、エンチャントを試してみることのできるアイテムがあります - - かまど + + 今トロッコに乗っています。トロッコから降りるには、ポインターをトロッコに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*MinecartIcon*} - - 分配装置 + + {*B*} + トロッコの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + トロッコの説明を飛ばす: {*CONTROLLER_VK_B*} - - 動物の飼育 + + アイテムを選択した状態で、持ち物画面の外へポインターを動かすと、アイテムを落とすことができます - - 動物の繁殖 + + 読む - - 調合 + + 掛ける + + + 投げる - - エンチャント + + 開く - - 闇のポータル + + 音程を変える - - マルチプレイヤー + + 起爆する - - スクリーンショットの公開 + + 植える - - 世界へのアクセス禁止 + + 完全版を購入 - - クリエイティブ モード + + セーブデータを削除 - - ホストとプレイヤーのオプション + + 削除 - - 取引 + + 耕す - - 金床 + + 収穫する - - 果ての世界 + + 続ける - - {*T3*}遊び方: 果ての世界{*ETW*}{*B*}{*B*} -果ての世界は別世界の 1 つで、果てのポータルを起動して行くことができます。果てのポータルは地上界の地下深くの要塞にあります{*B*} -果てのポータルを起動するには、エンダーアイを果てのポータルの枠内にはめ込む必要があります。{*B*} -ポータルが起動したら、飛び込んで果ての世界に行きましょう{*B*}{*B*} -果ての世界では大勢のエンダーマンが待ち構えているだけでなく、恐ろしく手ごわいエンダードラゴンが出現します。果ての世界に進む前にしっかり戦いの準備を整えましょう!{*B*}{*B*} -8 本の黒曜石の柱の上にはエンダークリスタルがあり、エンダードラゴンはこれを使って回復します。 -戦いが始まったら最初にエンダークリスタルをひとつずつ破壊しましょう{*B*} -手前の数個は矢が届く場所にありますが、残りは鉄の柵で囲まれています。届く高さまで足場を積み上げましょう{*B*}{*B*} -その間、エンダードラゴンが飛びかかってきたり、エンダーアシッドブレスを吐いて攻撃してきます!{*B*} -柱の中央にあるタマゴ台に近づくと、エンダードラゴンが攻撃しようと降下してきます。ダメージを与えるチャンスです!{*B*} -アシッドブレスをかわしながら、エンダードラゴンの弱点である目を狙うのが効果的です。助けてくれるフレンドがいる場合は、果ての世界に来てもらって一緒に戦いましょう!{*B*}{*B*} -あなたが果ての世界に入ると、フレンドの地図にも要塞内に果てのポータルの場所が表示されるようになり、簡単に参加してもらえます + + 泳ぐ - - ダッシュ + + 叩く - - 最新情報 + + 乳搾り - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*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*} -- クリーパーとクモは最後に攻撃されたプレイヤーに攻撃的{*B*} -- クリエイティブ モードのモブはしばらくすると再び中立に{*B*} -- 溺れていいるときのノックバックを削除{*B*} -- ゾンビが壊すドアにダメージを表示{*B*} -- 氷は暗黒界で溶ける.{*B*} -- 大釜を雨天の屋外に置くと満たされる{*B*} -- ピストンはアップデートに 2 倍の時間がかかる{*B*} -- 鞍をつけていた豚を倒すと、鞍を落とす{*B*} -- 果ての世界の空の色を変更{*B*} -- (トリップワイヤー用に)糸を設置可能に{*B*} -- 雨が葉からしたたる{*B*} -- ブロックの底にレバーを設置可能に{*B*} -- TNT 火薬のダメージは難易度の設定によって異なる{*B*} -- 本の製法を変更{*B*} -- スイレンの葉がボートを壊すのではなく、ボートがスイレンの葉を壊す{*B*} -- 豚の落とす豚肉が増加{*B*} -- スーパフラットな世界ではスライムの出現が減る{*B*} -- クリーパーのダメージは難易度の設定によって異なる。キックバック増加{*B*} -- 口を開けない不動のエンダーマン{*B*} -- プレイヤーのテレポートを追加(ゲーム内で {*BACK_BUTTON*} メニューを使用){*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 を起爆したり、建築済みのポータルを開くのに使う + + {*EXIT_PICTURE*} もっと冒険を続けたい場合は、鉱山の働き手が住んでいた小屋の近くに、小さな城に通じる階段があります - - 魚を獲るのに使う + + {*B*}基本のチュートリアルから始める{*CONTROLLER_VK_A*}{*B*} + 基本のチュートリアルを飛ばす{*CONTROLLER_VK_B*} - - 太陽と月の位置を表示する + + {*B*} + 空腹ゲージや食べ物について詳しく知りたい場合は {*CONTROLLER_VK_A*} を押してください。{*B*} + すでに十分知っている場合は {*CONTROLLER_VK_B*} を押してください。 - - 自分のスタート地点を示す + + 選択 - - 手に持っていると、探索済みのエリアの地図を表示する。道を確認するのに使う + + 使う - - 矢を射る攻撃ができる + + このエリアで、釣り竿、ボート、ピストン、レッドストーンなどの使い方を練習しましょう - - 弓と組み合わせて、武器として使う + + このエリアの外では、建物、畑、トロッコ、エンチャント、調合、取引、鍛冶などがあなたを待っています! - - 2.5{*ICON_SHANK_01*} 回復する + + 空腹ゲージが減りすぎて、HP が回復できません。 - - 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 つ置く - - ブロックの横に取り付けて、常に電気を送ったり、送受信機として使える。 -弱い明かりとしても使用可能 + + 落とす - - 反復装置、遅延装置、ダイオードとして単体で、または組み合わせて、レッドストーンの回路に使われる + + すべて取る - - 押すと電気を送れる。約 1 秒間起動した後、自動的にオフになる + + 半分取る - - レッドストーンを電源として使い、ランダムな順番でアイテムを撃ち出す + + 置く - - 音を奏でる。叩くと音程を変えられる。種類の違うブロックの上に置くことで、楽器の種類を変えることができる + + すべて落とす - - トロッコを走らせるのに使う + + クイック選択バーを空にする - - 電源が入っている時、上を走るトロッコを加速させる。電源が入っていない時は、上でトロッコが止まる + + これは何? - - トロッコ専用の重量感知板として機能する。電源が入っている時にレッドストーンの信号を送る + + Facebook に公開 - - プレイヤーや動物、モンスターを乗せて、レールの上を移動できる + + 1 つ落とす - - 物を載せて、レール上を移動できる + + 入れ替え - - レールの上を移動する。石炭を使うことで他のトロッコを押すことができる + + クイック移動 - - 泳ぐよりも速く水上を移動できる + + スキン パック - - 羊から採れる。染料を使って色を変えることができる + + 赤のステンドグラスの板 - - 建築用素材。染料で色を変えることができる。ウールは羊から簡単に入手できるので、この作り方はあまりお勧めできない + + 緑のステンドグラスの板 - - 黒のウールを作るのに使う染料 + + 茶色のステンドグラスの板 - - 緑のウールを作るのに使う染料 + + 白のステンドグラス - - 茶色のウールを作るのに使う染料。クッキーの材料や、カカオの実を育てるのにも使われる + + ステンドグラスの板 - - 銀のウールを作るのに使う染料 + + 黒のステンドグラスの板 - - 黄色のウールを作るのに使う染料 + + 青のステンドグラスの板 - - 赤のウールを作るのに使う染料 + + 灰色のステンドグラスの板 - - 即座に作物や木、背の高い草、巨大なきのこ、花などを育てるのに使う。染料の材料にもなる + + ピンクのステンドグラスの板 - - ピンクのウールを作るのに使う染料 + + 黄緑のステンドグラスの板 - - オレンジのウールを作るのに使う染料 + + 紫のステンドグラスの板 - - 黄緑のウールを作るのに使う染料 + + 水色のステンドグラスの板 - - 灰色のウールを作るのに使う染料 + + 薄灰色のステンドグラスの板 - - 薄灰色のウールを作るのに使う染料 -(注意: 薄灰色の染料は灰色の染料と骨粉を混ぜて作るれば、 1 つの墨袋から 3 つではなく 4 つの薄灰色の染料を作ることができる) + + オレンジのステンドグラス - - 空色のウールを作るのに使う染料 + + 青のステンドグラス - - 水色のウールを作るのに使う染料 + + 紫のステンドグラス - - 紫のウールを作るのに使う染料 + + 水色のステンドグラス - - 赤紫のウールを作るのに使う染料 + + 赤のステンドグラス - - 青のウールを作るのに使う染料 + + 緑のステンドグラス - - 音楽ディスクを聞ける + + 茶色のステンドグラス - - 強力な道具、武器や防具を作ることができる + + 薄灰色のステンドグラス - - たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える + + 黄色のステンドグラス - - 本や地図を作るのに使う + + 空色のステンドグラス - - 本棚を作るのに使う。エンチャントするとエンチャントの本になる。 + + 赤紫のステンドグラス - - エンチャントテーブルの周囲に並べることで、エンチャントの効果をより強力にできる + + 灰色のステンドグラス - - 飾り付けとして使う + + ピンクのステンドグラス - - 鉄のツルハシ以上で掘れる。かまどに入れて精錬すると、金の延べ棒になる + + 黄緑のステンドグラス - - 石のツルハシ以上で掘れる。かまどに入れて精錬すると、鉄の延べ棒になる + + 黄色のステンドグラスの板 - - ツルハシで掘れる。石炭が採れる + + 薄灰色 - - 石のツルハシ以上で掘れる。ラピスラズリが採れる + + 灰色 - - 鉄のツルハシ以上で掘れる。ダイヤモンドが採れる + + ピンク - - 鉄のツルハシ以上で掘れる。レッドストーンの粉が採れる + + - - ツルハシで掘れる。丸石が採れる + + - - シャベルを使って集める。建築用に使われる + + 水色 - - 植えると、最終的に木に成長する + + 黄緑 - - 破壊することができない + + オレンジ - - 触れる物すべてに火をつける。バケツを使って集める + + - - シャベルを使って集める。かまどに入れて精錬するとガラスになる。下に何もないと重力に引かれる + + カスタム - - シャベルを使って集める。掘っていると、時々火打ち石が出てくる。下に何もないと重力に引かれる + + 黄色 - - 斧を使って切る。木の板の材料になったり、燃料としても使われる + + 空色 - - かまどで砂を精錬するとできる。建築用素材として使えるが、掘ると壊れる + + 赤紫 - - ツルハシを使って石から掘り出す。かまどや石の道具を作るのに使う + + 茶色 - - かまどで粘土を焼いて作る + + 白のステンドグラスの板 - - かまどで焼くとレンガになる + + 球体 (小) - - 壊すと粘土の塊を落とす。粘土はかまどで焼くとレンガになる + + 球体 (大) - - 雪玉を保管するのに使える + + 空色のステンドグラスの板 - - シャベルで掘り出して雪玉を作る + + 赤紫のステンドグラスの板 - - 壊すと時々、小麦の種が出てくる + + オレンジのステンドグラスの板 - - 染料の材料になる + + 星形 - - おわんに入れてシチューを作れる + + - - ダイヤモンドのツルハシのみで掘れる。水と溶岩が混ざることで生まれる。ポータルの材料になる + + - - モンスターを出現させる + + - - 地面に置いて、電気を伝えられる。ポーションに加えて調合すると、効果の持続時間が延長される + + クリーパーの形 - - 十分に育つと作物が実り、小麦を収穫できる + + 破裂 - - 耕された地面。種を植えられる + + 未知の形 - - かまどで加熱することで、緑色の染料になる + + 黒のステンドグラス - - 砂糖を作るための材料になる + + 鉄の馬鎧 - - ヘルメットとしてかぶったり、たいまつと組み合わせてカボチャ ランタンにできる。カボチャのパイの主原料でもある + + 金の馬鎧 - - いったん火がつくと、燃え続ける + + ダイヤモンドの馬鎧 - - 上を歩くもののスピードを遅くする + + レッドストーン比較装置 - - ポータルを通過すると、地上界と暗黒界を行き来できる + + TNT 火薬つきトロッコ - - かまどの燃料として使用する。たいまつの材料にもなる + + ホッパーつきトロッコ - - クモを倒すと手に入る。弓や釣り竿の材料になる。地面に設置してトリップワイヤーを作ることもできる + + - - ニワトリを倒すと手に入る。矢の材料になる + + ビーコン - - クリーパーを倒すと手に入る。TNT 火薬の材料になる。ポーションを調合する際の原材料としても使われる + + トラップつきチェスト - - 農地にまくと作物ができる。日光が十分に当たるようにしよう! + + 荷重した重量感知板 (軽) - - 作物から収穫できる。食べ物アイテムを作るのに使われる + + 名札 - - 砂利を掘ると手に入る。火打ち石と打ち金の材料になる + + 木の板 (全タイプ) - - 豚に使うと、その豚に乗れる。豚は串刺しのニンジンで操ることができる + + コマンド ブロック - - 雪を掘ると手に入る。投げることができる + + 花火の星 - - 牛を倒すと手に入る。防具の材料となる。本を作る際にも使われる + + 手なずけて乗ることができる。チェストを取りつけられる - - スライムを倒すと手に入る。ポーションを調合する際の原材料として使われ、吸着ピストンの材料にもなる + + ラバ - - ニワトリがランダムで落とす。食べ物アイテムの材料になる + + 馬とロバをかけ合わせて繁殖させると生まれる。手なずけると乗ったり、チェストの運搬が可能になる - - 光石を掘ると手に入る。光石のブロックに戻すことができる。ポーションに加えて調合すると、効果のレベルが上がる + + - - ガイコツを倒すと手に入る。骨粉の材料となる。オオカミに与えると手なずけることができる + + 手なづけて乗ることができる - - ガイコツにクリーパーを倒させると手に入る。ジュークボックスで再生できる + + ロバ - - 火を消し、作物の成長を促進する。バケツで集めることができる + + ゾンビの馬 - - 壊すと時々、苗木を落とす。苗木は植えると木へと成長する + + 空白の地図 - - ダンジョン内にある。建設と飾り付けに使う + + 暗黒星 - - 羊からウールを刈り取ったり、葉っぱのブロックを収穫するのに使う + + 打ち上げ花火 - - (ボタン、レバー、重量感知板、レッドストーンのたいまつ、またはレッドストーンといずれかの組み合わせによって) 電気が送られると、ピストンが伸びてブロックを押すことができる + + ガイコツ馬 - - (ボタン、レバー、重量感知板、レッドストーンのたいまつ、またはレッドストーンといずれかの組み合わせによって) 電気が送られると、ピストンが伸びてブロックを押し、ピストンが戻る時には、触れているブロックを引き戻す + + ウィザー - - 石ブロックから作る。要塞で見かけることが多い + + ウィザー スカルとソウルサンド から作る。プレイヤーに爆発するスカルを放つ - - 柵と同様、障害物として使う + + 荷重した重量感知板 (重) - - ドアと似ているが、主に柵と組み合わせて使う + + 薄灰色の粘土 - - 切ったスイカから作れる + + 灰色の粘土 - - 透明なブロックで、ガラスブロックの代わりに使える + + ピンクの粘土 - - 植えるとカボチャが生える + + 青の粘土 - - 植えるとスイカが生える + + 紫の粘土 - - エンダーマンが倒されたときに落とす。投げると、落ちた場所にプレイヤーがテレポートされ、HP が少し減る + + 水色の粘土 - - 上面に草が生えた土ブロック。シャベルを使って集める。建築用に使われる + + 黄緑の粘土 - - 建設と飾り付けに使う + + オレンジの粘土 - - 歩くと移動が遅くなる。ハサミで破壊でき、糸が採れる + + 白の粘土 - - 破壊されるとシルバーフィッシュを出現させる。近くで別のシルバーフィッシュが攻撃を受けたときにも、シルバーフィッシュを出現させる場合がある + + ステンドグラス - - 置くと徐々に茂る。ハサミを使って集める。はしごのように登ることができる + + 黄色の粘土 - - 上面を歩くと滑る。他のブロックの上で壊れると水になる。光源に近づけたり、暗黒界に設置すると溶ける + + 空色の粘土 - - 飾り付けとして使う + + 赤紫の粘土 - - ポーションの調合や要塞を探すのに使う。暗黒砦の周囲にいるブレイズが落とす + + 茶色の粘土 - - ポーションの調合に使う。ガストが倒されたときに落とす + + ホッパー - - ゾンビ ピッグマンが倒されたときに落とす。ゾンビピッグマンは暗黒界にいる。ポーションを調合する際の原材料として使われる + + 起動レール - - ポーションの調合に使う。暗黒砦に生えている。また、ソウルサンドでも育つ + + ドロッパー - - 何に使うかにより、様々な効果が現れる + + レッドストーン比較装置 - - 水を入れるビン。調合台でポーションを作る時、最初に必要になる + + 日光センサー - - 食べ物や薬の材料となる有毒のアイテム。クモや洞窟グモが倒されたときに落とす + + レッドストーンのブロック - - 主にマイナス効果のポーションを調合するのに使う + + 色つきの粘土 - - ポーションの調合や、他のアイテムと合わせてエンダーアイまたはマグマクリームを作るのに使う + + 黒の粘土 - - ポーションの調合に使う + + 赤の粘土 - - ポーションやスプラッシュポーションの調合に使う + + 緑の粘土 - - 雨水またはバケツの水を入れて、水をガラスビンに詰めるのに使われる + + 干し草の俵 - - 投げると果てのポータルがある方角を示す。果てのポータルの枠内に 12 個置くと、果てのポータルが起動する + + 硬くなった粘土 - - ポーションの調合に使う + + 石炭のブロック - - 草ブロックに似ているが、きのこ栽培に最適 + + 色の変化 - - 水に浮く植物。上を歩くことができる + + 無効にすると、モンスターや動物がブロックを変化させなくなり (例えば、クリーパーが爆発してもブロックを壊さない。羊が草を取らない)、アイテムを拾い上げなくなる - - 暗黒砦を建てるのに使う。ガストの火の玉が効かない + + 有効にすると、プレイヤーが絶命した時に持ち物が残ります - - 暗黒砦で使う + + 無効にすると、モブは自然に出現しなくなります - - 暗黒砦で手に入る。壊すと暗黒茸を落とす + + ゲームモード: アドベンチャー - - プレイヤーの経験値を消費して剣やツルハシ、斧、シャベル、弓、防具にエンチャントを行う + + アドベンチャー - - エンダーアイを 12 個使って起動すると、果ての世界へ行くためのポータルができる + + シードを入力して同じ世界を生成してください。空白にするとランダムに生成されます - - 果てのポータルを作るのに使う + + 無効にすると、モンスターや動物がアイテムを落とさなくなります (例えば、クリーパーが火薬を落とさなくなる) - - 果ての世界に存在するブロックの一種。爆発に対する耐性が高いので建材として便利 + + {*PLAYER*} は、はしごから落ちた - - 果ての世界でエンダー ドラゴンを倒すと出現するブロック + + {*PLAYER*} は、つたから落ちた - - 投げると経験値オーブを落とす。経験値オーブを貯めると経験値が上がる + + {*PLAYER*} は水から落ちた - - 火をつけるのに便利。分配装置から撃ち出して、無差別に火を起こすのにも使われる + + 無効にすると、ブロックが壊れた時にアイテムを落とさなくなります (例えば、石のブロックは丸石を落とさなくなる) - - 陳列ケースのように、中に入れたアイテムまたはブロックを展示する + + 無効にすると、HP が自然に回復しなくなります - - 投げると特定の種類の生き物が出現する + + 無効 - - 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる + + トロッコ - - 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる + + 引き綱 - - かまどで暗黒石を精錬するとできる。暗黒レンガ ブロックの材料となる + + 放つ - - 動力を受けると点灯する + + 取りつける - - 栽培して、カカオ豆を収穫できる + + 下りる - - モブ ヘッドは飾り付けとして並べたり、ヘルメットのスロットからマスクとして着用もできる + + チェストを取りつける - - イカ + + 発射 - - 倒すと墨袋を落とす + + 名前 - - + + ビーコン - - 倒すと革を落とす。バケツがあればミルクも取れる + + 第 1 パワー - - + + 第 2 パワー - - 毛を刈るときウールを落とす (毛が残っている場合)。ウールはいろいろな色に染められる + + - - ニワトリ + + ドロッパー - - 倒すと羽根を落とす。タマゴを持っている場合もある + + ホッパー - - + + {*PLAYER*} は高い場所から落ちた - - 倒すと豚肉を落とす。鞍があれば乗ることもできる + + 現在、スポーン エッグを使用できません。 世界のコウモリの数が最大数に達しました - - オオカミ + + この動物は求愛モードにできません。コウモリの繁殖数が最大数に達しました - - 普段はおとなしいが、攻撃すると反撃してくる。骨を使うと手なずけることができ、プレイヤーについて回って、プレイヤーを攻撃してくる敵を攻撃してくれる + + ゲームのオプション - - クリーパー + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で火だるまにされた - - 近づきすぎると爆発する! + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で叩き潰された - - ガイコツ + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で倒された - - 矢を放ってくる。倒すと矢を落とす + + モブの嘆き - - クモ + + タイルの落下 - - 近づくと攻撃してくる。壁を登ることができる。倒すと糸を落とす + + 自然再生 - - ゾンビ + + 日光サイクル - - 近づくと攻撃してくる + + 持ち物を残す - - ゾンビ ピッグマン + + モブ出現 - - 最初はおとなしいが、1 匹を攻撃すると集団で反撃してくる + + モブ アイテム - - ガスト + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で撃たれた - - 当たると爆発する火の玉を放ってくる + + {*PLAYER*} は遠くに落ちすぎて {*SOURCE*} に仕留められた - - スライム + + {*PLAYER*} は遠くに落ちすぎて {*SOURCE*} に {*ITEM*} で仕留められた - - ダメージを与えると、小さなスライムに分裂する + + {*PLAYER*} は {*SOURCE*} と戦っていて火にのまれた - - エンダーマン + + {*PLAYER*} は {*SOURCE*} に落とされて力尽きた - - 照準を向けると攻撃してくる。ブロックを移動できる + + {*PLAYER*} は {*SOURCE*} に落とされて力尽きた - - シルバーフィッシュ + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で落とされて力尽きた - - 攻撃すると、近くに隠れているシルバーフィッシュも集まってくる。石ブロックの中に隠れている + + {*PLAYER*} は {*SOURCE*} と戦って黒こげに焼かれた - - 洞窟グモ + + {*PLAYER*} は {*SOURCE*} に吹き飛ばされた - - 牙に毒がある + + {*PLAYER*} は衰弱した - - ムーシュルーム + + {*PLAYER*} は {*SOURCE*} に {*ITEM*} で命を奪われた - - おわんを使うと、きのこシチューが採れる。ハサミで毛刈りをするときのこを落とすが、普通の牛になってしまう + + {*PLAYER*} は {*SOURCE*} から逃げようとして溶岩に飲み込まれた - - スノー ゴーレム + + {*PLAYER*} は {*SOURCE*} から逃げようとして溺れた - - 雪ブロックとカボチャで作れるゴーレム。作った人の敵に向かって雪玉を投げつける + + {*PLAYER*} は {*SOURCE*} から逃げようとしてサボテンを踏んだ - - エンダー ドラゴン + + 乗る - - 果ての世界に存在する大きな黒竜 + + 馬を操るには、鞍をつける必要があります。鞍は村で買うか、ゲームの世界に隠されたチェストの中にあります - - ブレイズ + + 手なずけたロバとラバは、チェストを取りつけることで鞍袋が与えられます。鞍袋には、乗っている間またはしのび足の時に触ることができます - - 暗黒界に出現する敵。主に暗黒砦内にいる。倒すとブレイズ ロッドを落とす + + 馬とロバ (ラバは除く) は、ほかの動物と同じように金のリンゴや金のニンジンで繁殖させることができます。子どもたちはいずれおとなの馬に成長しますが、小麦か干し草を与えると成長が速まります - - マグマ キューブ + + 馬、ロバ、ラバは、使う前に手なずける必要があります。馬に乗って、振り落とされずに乗り続けることができると手なずけられます - - 暗黒界に出現する。スライム同様、倒すと分裂する + + 手なずけると周りにハートマークが現れ、プレイヤーを振り落とさなくなります - - 村人 + + 馬に乗ってみましょう。手にアイテムや道具を持たずに {*CONTROLLER_ACTION_USE*} で乗ります - - ヤマネコ + + ここで馬やロバを手なずけてみましょう。近くのチェストに、鞍や馬鎧など馬に使うと便利なアイテムもあります - - ジャングルに生息。生魚を与えて飼い慣らせる。不意な動きに驚いてすぐに逃げるため、向こうから寄ってくるのを待たなければならない + + 4 段以上のピラミッドでは、第 2 パワーの再生能力か、より強力な第 1 パワーが選択肢に加わります - - アイアン ゴーレム + + ビーコンにパワーを設定するには、支払いの枠にエメラルド、ダイヤモンド、金の延べ棒、鉄の延べ棒のいずれかを 1 つ置く必要があります。ビーコンは、一度設定したら無限にパワーを発揮します - - 村に出現して村人を守ってくれる。鉄のブロックとカボチャで作ることもできる + + このピラミッドの頂上に、有効化されていないビーコンがあります - - Explosives Animator + + これがビーコンの画面です。ビーコンに与えるパワーを選ぶことができます - - Concept Artist + + {*B*}ビーコン画面の説明を続ける: {*CONTROLLER_VK_A*} +{*B*}ビーコン画面の説明を飛ばす: {*CONTROLLER_VK_B*} - - Number Crunching and Statistics + + ビーコン メニューでは、ビーコンの第 1 パワーを 1 つ選ぶことができます。ピラミッドの段が多いほど、パワーの選択肢が増えます - - Bully Coordinator + + おとなの馬、ロバ、ラバには、すべて乗ることができます。ただし、防具を装備できるのは馬のみ、鞍袋をつけてアイテムを運べるのはラバとロバのみです - - Original Design and Code by + + これが馬の持ち物画面です - - Project Manager/Producer + + {*B*}馬の持ち物の説明を続ける: {*CONTROLLER_VK_A*} +{*B*}馬の持ち物の説明を飛ばす: {*CONTROLLER_VK_B*} - - Rest of Mojang Office + + 馬の持ち物は運んだり、アイテムを馬、ロバ、ラバに装備したりできます - - リード ゲーム プログラマー Minecraft PC + + きらめき - - Ninja Coder + + - - CEO + + 滞空時間: - - White Collar Worker + + 鞍の枠に鞍を入れて、馬に鞍をつけましょう。防具の枠に馬鎧を入れると、馬に防具を装備できます - - Customer Support + + ラバを見つけました - - Office DJ + + {*B*}馬、ロバ、ラバの説明を続ける: {*CONTROLLER_VK_A*} +{*B*}馬、ロバ、ラバの説明を飛ばす: {*CONTROLLER_VK_B*} - - Designer/Programmer Minecraft - Pocket Edition + + 馬とロバは主に広い平原に生息します。ラバは、ロバと馬をかけ合わせて繁殖させると生まれますが、自身に繁殖能力はありません - - Developer + + このメニューで、自分の持ち物とロバやラバの鞍につけた鞍袋の間でアイテムの移動ができます - - Chief Architect + + 馬を見つけました - - Art Developer + + ロバを見つけました - - Game Crafter + + {*B*}ビーコンの説明を続ける: {*CONTROLLER_VK_A*} +{*B*}ビーコンの説明を飛ばす: {*CONTROLLER_VK_B*} - - Director of Fun + + 花火の星は、材料の枠に火薬と染料を入れて作ります - - Music and Sounds + + 花火の星が爆発する際の色は、染料で決まります - - Programming + + 花火の星の形は、発火剤、金の塊、羽根、モブ ヘッドのうちのどれかを加えることで決まります - - Art + + 材料の枠に複数の花火の星を入れて、花火に加えることができます (オプション) - - QA + + 火薬を多くの枠に入れるほど、花火の星が爆発する高さが上がります - - Executive Producer + + 出来上がった花火は、右の枠から取り出せます - - Lead Producer + + 尾やきらめきを加えるには、ダイヤモンドと光石の粉を使います - - Producer + + 花火は、手または分配装置から発射できる装飾用のアイテムです。紙、火薬、様々な花火の星 (オプション) で作られます - - Test Lead + + 花火の星の色、変化、形、大きさ、効果 (尾やきらめきなど) は、作る時に追加の材料を入れることでカスタマイズできます - - Lead Tester + + チェストに入っている材料を使って、作業台で花火を作ってみましょう - - Design Team + + 出来上がった花火の星に染料を加えると、色の変化をつけられます - - Development Team + + ここにあるチェストには、花火を作るのに使う様々なアイテムが入っています! - - Release Management + + {*B*}花火の説明を続ける: {*CONTROLLER_VK_A*} +{*B*}花火の説明を飛ばす: {*CONTROLLER_VK_B*} - - Director, XBLA Publishing + + 花火を作るには、持ち物の上に表示される 3x3 の材料の枠に火薬と紙を入れます - - Business Development + + この部屋にホッパーがあります - - Portfolio Director + + {*B*}ホッパーの説明を続ける: {*CONTROLLER_VK_A*} +{*B*}ホッパーの説明を飛ばす: {*CONTROLLER_VK_B*} - - Product Manager + + ホッパーは入れ物にアイテムを出し入れしたり、投げ入れられたアイテムを自動的に拾い上げるのに使います - - Marketing + + 有効化されたビーコンは明るい光を空に発し、近くのプレイヤーにパワーを与えます。材料はガラス、黒曜石、暗黒星。暗黒星はウィザーを倒すと手に入ります - - Community Manager + + ビーコンは、昼間日が当たる所に設置する必要があります。鉄、金、エメラルド、ダイヤモンドのピラミッドにはビーコンの設置が必要ですが、ビーコンのパワーは素材の影響を受けません - - Europe Localization Team + + パワーを設定してビーコンを使ってみましょう。提示された鉄の延べ棒を支払いに使うことができます - - Redmond Localization Team + + 調合台、チェスト、発射装置、ドロッパー、チェストつきトロッコ、ホッパーつきトロッコ、ほかのホッパーに作用します - - Asia Localization Team + + この部屋では、ホッパーの便利な配置法をたくさん見たり試したりできます - - User Research Team + + これが花火の画面です。花火と花火の星を作ることができます - - MGS Central Teams + + {*B*}花火画面の説明を続ける: {*CONTROLLER_VK_A*} +{*B*}花火画面の説明を飛ばす: {*CONTROLLER_VK_B*} - - Milestone Acceptance Tester + + ホッパーは上にある入れ物から、絶えずアイテムを吸い取ろうとします。また、保管しているアイテムを出力側の入れ物に転送しようとします - - Special Thanks + + ただし、レッドストーンから電気が送られると動作しなくなり、アイテムの吸い取りと転送を停止します - - Test Manager + + ホッパーは、アイテムを出す方向に向きます。特定のブロックに向かせるには、しのび足をしながらブロックをホッパーに接触させます - - Senior Test Lead + + 沼に出現する敵。ポーションを投げて攻撃する。倒すとポーションを落とす - - SDET + + 世界の絵/額縁の数が最大数に達しました。 - - Project STE + + 難易度「ピース」では敵を出現させることはできません。 - - Additional STE + + この動物は求愛モードにできません。豚、羊、牛、ネコ、馬の繁殖数が最大数に達しました - - Test Associates + + 現在、スポーン エッグを使用できません。 世界のイカの数が最大数に達しました - - Jon Kagstrom + + 現在、スポーン エッグを使用できません。 世界の敵の数が最大数に達しました - - Tobias Mollstam + + 現在、スポーン エッグを使用できません。 世界の村人の数が最大数に達しました - - Rise Lugo + + この動物は求愛モードにできません。オオカミの繁殖数が最大数に達しました - - 木の剣 + + 世界のモブ ヘッドの数が最大数に達しました - - 石の剣 + + 上下反転 - - 鉄の剣 + + 左利き - - ダイヤモンドの剣 + + この動物は求愛モードにできません。ニワトリの繁殖数が最大数に達しました - - 金の剣 + + この動物は求愛モードにできません。ムーシュルームの繁殖数が最大数に達しました - - 木のシャベル + + 世界のボートの数が最大数に達しました - - 石のシャベル + + 現在、スポーン エッグを使用できません。 世界のニワトリの数が最大数に達しました - - 鉄のシャベル + + {*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*} + - - 金のシャベル + + 暗黒界をリセットする - - 木のツルハシ + + %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*} - - 鉄のツルハシ + + 本当にこのセーブ データの暗黒界を最初の状態にリセットしてもよろしいですか? 暗黒界に建設したものはすべて失われます - - ダイヤモンドのツルハシ + + 現在、スポーン エッグを使用できません。 豚、羊、牛、ネコ、馬の数が最大数に達しました - - 金のツルハシ + + 現在、スポーン エッグを使用できません。 ムーシュルームの数が最大数に達しました - - 木の斧 + + 現在、スポーン エッグを使用できません。 世界のオオカミの数が最大数に達しました - - 石の斧 + + 暗黒界をリセットする - - 鉄の斧 + + 暗黒界をリセットしない - - ダイヤモンドの斧 + + 現在、ムーシュルームは毛刈りできません。豚、羊、牛、ネコ、馬の数が最大数に達しました。 - - 金の斧 + + ゲームオーバー! - - 木のくわ + + 世界のオプション - - 石のくわ + + 建設と採掘の許可 - - 鉄のくわ + + ドアとスイッチを使用可能 - - ダイヤモンドのくわ + + 建物を生成する - - 金のくわ + + スーパーフラット - - 木のドア + + ボーナス チェスト - - 鉄のドア + + 入れ物を使用可能 - - 鎖のヘルメット + + プレイヤーを追放 - - 鎖のチェストプレート + + 飛行可能 - - 鎖のレギンス + + 疲労無効 - - 鎖のブーツ + + プレイヤーを攻撃可能 - - 革の帽子 + + 動物を攻撃可能 - - 鉄のヘルメット + + ホストオプション変更可能 - - ダイヤモンドのヘルメット + + ホスト特権 - - 金のヘルメット + + 遊び方 - - 革の服 + + 操作方法 - - 鉄のチェストプレート + + 設定 - - ダイヤモンドの鎧 + + 復活 - - 金のチェストプレート + + 利用可能ダウンロード コンテンツ - - 革のパンツ + + スキンを変更 - - 鉄のレギンス + + クレジット - - ダイヤモンドのレギンス + + TNT の爆発 - - 金のレギンス + + PvP - - 革のブーツ + + 高度な操作を許可 - - 鉄のブーツ + + コンテンツを再インストール - - ダイヤモンドのブーツ + + デバッグ設定 - - 金のブーツ + + 火の延焼 - - 鉄の延べ棒 + + エンダードラゴン - - 金の延べ棒 + + {*PLAYER*}はエンダードラゴンのブレスで力尽きた - - バケツ + + {*PLAYER*} は {*SOURCE*} に倒された - - 水バケツ + + {*PLAYER*} は {*SOURCE*} に倒された - - 溶岩バケツ + + {*PLAYER*} は力尽きた - - 火打ち石と打ち金 + + {*PLAYER*} は爆発した - - リンゴ + + {*PLAYER*} は魔法により力尽きた - - + + {*PLAYER*} は {*SOURCE*} に撃たれて力尽きた - - + + 岩盤の霧 - - 石炭 + + HUD の表示 - - 木炭 + + プレイヤーの手の表示 - - ダイヤモンド + + {*PLAYER*} は {*SOURCE*} に火だるまにされた - - + + {*PLAYER*} は {*SOURCE*} に叩き潰された - - おわん + + {*PLAYER*} は魔法によって {*SOURCE*} に倒された - - きのこシチュー + + {*PLAYER*} は世界の外へ落ちた - - + + テクスチャ パック - - 羽根 + + マッシュアップ パック - - 火薬 + + {*PLAYER*} は火の中で力尽きた - - 小麦の種 + + テーマ - - 小麦 + + ゲーマーアイコン - - パン + + アバター アイテム - - 火打ち石 + + {*PLAYER*} は火によって力尽きた - - 生の豚肉 + + {*PLAYER*} は飢えて力尽きた - - 調理した豚肉 + + {*PLAYER*} は刺されて力尽きた - - + + {*PLAYER*} は落下の衝撃で力尽きた - - 金のリンゴ + + {*PLAYER*} は溶岩に飲み込まれた - - 看板 + + {*PLAYER*} は壁に飲み込まれた - - トロッコ + + {*PLAYER*} は溺れて力尽きた - - + + ゲームオーバー メッセージ - - レッドストーン + + ホストオプションを変更できなくなりました - - 雪玉 + + 飛行できるようになりました - - ボート + + 飛行できなくなりました - - + + 動物を攻撃できなくなりました - - ミルク バケツ + + 動物を攻撃できるようになりました - - レンガ + + ホストオプションを変更できるようになりました - - 粘土 + + 疲労無効になりました - - サトウキビ + + 攻撃されてもダメージを受けなくなりました - - + + 攻撃されるとダメージを受けます - - + + %d MSP - - スライムボール + + 疲労無効ではなくなりました - - チェストつきトロッコ + + 不可視になりました - - かまどつきトロッコ + + 不可視ではなくなりました - - タマゴ + + プレイヤーを攻撃できるようになりました - - コンパス + + 採掘やアイテムの使用ができるようになりました - - 釣り竿 + + ブロックを設置できなくなりました - - 時計 + + ブロックを設置できるようになりました - - 光石の粉 + + キャラクターを動かす - - 生魚 + + カスタム スキン アニメーション - - 調理した魚 + + 採掘やアイテムの使用ができなくなりました - - 染色粉 + + ドアとスイッチを使用できるようになりました - - 墨袋 + + 生き物を攻撃できなくなりました - - ローズ レッド + + 生き物を攻撃できるようになりました - - サボテン グリーン + + プレイヤーを攻撃できなくなりました - - ココア ビーンズ + + ドアとスイッチを使用できなくなりました - - ラピスラズリ + + チェストなどの入れ物を使用できるようになりました - - 紫の染料 + + チェストなどの入れ物を使用できなくなりました - - 水色の染料 + + 不可視 - - 薄灰色の染料 + + ビーコン + + + {*T3*}遊び方: ビーコン{*ETW*}{*B*}{*B*} +有効化されたビーコンは空に向かって明るい光を発し、近くのプレイヤーにパワーを与えます。{*B*} +材料はガラス、黒曜石、暗黒星。暗黒星はウィザーを倒すと手に入ります。{*B*}{*B*} +ビーコンは、昼間日が当たる所に設置する必要があります。鉄、金、エメラルド、ダイヤモンドのピラミッドにはビーコンの設置が必要です。{*B*} +ビーコンのパワーは、設置する素材の影響を受けません。{*B*}{*B*} +ビーコン メニューでは、ビーコンの第 1 パワーを 1 つ選ぶことができます。ピラミッドの段が多いほど、パワーの選択肢が増えます。{*B*} +4 段以上のピラミッドでは、第 2 パワーの再生能力か、より強力な第 1 パワーが選択肢に加わります。{*B*}{*B*} +ビーコンにパワーを設定するには、支払いの枠にエメラルド、ダイヤモンド、金の延べ棒、鉄の延べ棒のいずれかを 1 つ置く必要があります。{*B*} +ビーコンは、一度設定したら無限にパワーを発揮します{*B*} + + + 花火 + + + 言語 + + + + + + {*T3*}遊び方: 馬{*ETW*}{*B*}{*B*} +馬とロバは主に広い平原に生息します。ラバはロバと馬をかけ合わせて生まれますが、自身に繁殖能力はありません。{*B*} +おとなの馬、ロバ、ラバには、すべて乗ることができます。ただし、防具を装備できるのは馬のみ、鞍袋をつけてアイテムを運べるのはラバとロバのみです。{*B*}{*B*} +馬、ロバ、ラバは、使う前に手なずける必要があります。馬は、振り落とされずに乗り続けることで手なずけられます。{*B*} +手なずけると周りにハートマークが現れ、プレイヤーを振り落とさなくなります。馬を操るには、馬に鞍をつける必要があります。{*B*}{*B*} +鞍は村で買ったり、ゲームの世界に隠されたチェストで見つけたりできます。{*B*} +手なずけたロバとラバは、チェストを取りつけることで鞍袋が与えられます。鞍袋には、乗っている間やしのび足の時に触ることができます。{*B*}{*B*} +馬とロバ (ラバは除く) は、ほかの動物と同じように金のリンゴや金のニンジンで繁殖させることができます。{*B*} +子どもたちはいずれおとなの馬に成長しますが、小麦か干し草を与えると成長が速まります{*B*} + + + {*T3*}遊び方: 花火{*ETW*}{*B*}{*B*} +花火は、手または分配装置から発射できる装飾用のアイテムです。紙、火薬、様々な花火の星 (オプション) で作られます。{*B*} +花火の星の色、変化、形、大きさ、効果 (尾やきらめきなど) は、作る時に追加の材料を入れることでカスタマイズできます。{*B*}{*B*} +花火を作るには、持ち物の上に表示される 3x3 の材料の枠に火薬と紙を入れます。{*B*} +材料の枠に複数の花火の星を入れて、花火に加えることができます (オプション)。{*B*} +火薬を多くの枠に入れるほど、花火の星が爆発する高さが上がります。{*B*}{*B*} +出来上がった花火は、右の枠から取り出せます。{*B*}{*B*} +花火の星は、材料の枠に火薬と染料を入れて作ります。{*B*} + - 花火の星が爆発する際の色は、染料で決まります。{*B*} + - 花火の星の形は、発火剤、金の塊、羽根、モブ ヘッドのうちのどれかを加えることで決まります。{*B*} + - 尾やきらめきを加えるには、ダイヤモンドか光石の粉を使います。{*B*}{*B*} +出来上がった花火の星に染料を加えると、色の変化をつけられます + - - 灰色の染料 + + {*T3*}遊び方: ドロッパー{*ETW*}{*B*}{*B*} +ドロッパーはレッドストーンから動力を受けると、中に入っているアイテムを 1 つランダムに落とします。{*CONTROLLER_ACTION_USE*} でドロッパーを開けて、持ち物からアイテムを移せます。{*B*} +ドロッパーがチェストやその他の入れ物の隣にあると、落とすはずのアイテムをその中に移します。ドロッパーを何台も繋いで、アイテムを遠くに運ぶ輸送機関を作ることができます。ただし作動させるには、動力のオンとオフを繰り返す必要があります - - ピンクの染料 + + 使うと、現在地の地図になる。探検するにつれて空白が埋まっていく - - 黄緑の染料 + + ウィザーが落とす。ビーコンを作るのに使う - - たんぽぽイエロー + + ホッパー - - 空色の染料 + + {*T3*}遊び方: ホッパー{*ETW*}{*B*}{*B*} +ホッパーは入れ物にアイテムを出し入れしたり、投げ入れられたアイテムを自動的に拾い上げるのに使います。{*B*} +調合台、チェスト、発射装置、ドロッパー、チェストつきトロッコ、ホッパーつきトロッコ、ほかのホッパーに作用します。{*B*}{*B*} +ホッパーは上にある入れ物から、絶えずアイテムを吸い取ろうとします。また、保管しているアイテムを出力側の入れ物に転送しようとします。{*B*} +レッドストーンから電気が送られると動作しなくなり、アイテムの吸い取りと転送を停止します。{*B*}{*B*} +ホッパーは、アイテムを出す方向に向きます。特定のブロックに向かせるには、しのび足をしながらブロックをホッパーに接触させます{*B*} + - - 赤紫の染料 + + ドロッパー - - オレンジの染料 + + NOT USED - - 骨粉 + + 回復 - - + + ダメージ - - 砂糖 + + 跳躍 - - ケーキ + + 疲労 - - ベッド + + - - レッドストーン反復装置 + + 弱体化 - - クッキー + + 目まい - - 地図 + + NOT USED - - 音楽ディスク: 13 + + NOT USED - - 音楽ディスク: cat + + NOT USED - - 音楽ディスク: blocks + + 再生 - - 音楽ディスク: chirp + + 耐性 - - 音楽ディスク: far + + 世界生成のシードを見つける - - 音楽ディスク: mall + + 起動すると、色鮮やかな爆発を起こす。色、効果、形、変化は、花火を作る時に使う花火の星によって決まる - - 音楽ディスク: mellohi + + ホッパーつきトロッコを有効/無効にしたり、TNT 火薬つきトロッコを起爆させることができるレール - - 音楽ディスク: stal + + レッドストーンを電源として使い、アイテムをつかんで落としたり、ほかの入れ物に運び入れたりする - - 音楽ディスク: strad + + 硬くなった粘土を染めてできるカラフルなブロック - - 音楽ディスク: ward + + レッドストーンの電力を供給する。感知板の上に乗る物が多いほど動力は強くなる。軽量用より多くの重量を要する - - 音楽ディスク: 11 + + レッドストーンの動力源として使われる。レッドストーンへと復元することができる - - 音楽ディスク: where are we now + + アイテムをつかんだり、アイテムを入れ物に出し入れするのに使う - - ハサミ + + 馬、ロバ、ラバに与えて、ハートを最高 10 個まで回復させることができる。子どもの成長を速める - - カボチャの種 + + コウモリ - - スイカの種 + + 洞穴や閉ざされた広い空間に生息する空飛ぶ動物 - - 鶏肉 + + 魔女 - - 焼き鳥 + + かまどで粘土を精錬するとできる - - 牛肉 + + ガラスと染料から作られる - - ステーキ + + ステンドグラスから作られる - - 腐肉 + + レッドストーンの電力を供給する。感知板の上に乗る物が多いほど動力は強くなる - - エンダーパール + + 日光 (または日光の不足) に基づいてレッドストーンの信号を出力するブロック - - 切ったスイカ + + ホッパーに似た働きをする特殊なトロッコ。レールの上や上部にある入れ物からアイテムを集める - - ブレイズ ロッド + + 馬に装備できる特殊な防具。装備するとアーマーポイント +5 - - ガストの涙 + + 花火の色、効果、形を決めるのに使う - - 金の塊 + + 信号の強度を維持、比較、減少させるため、または特定のブロックの状態を測定するために、レッドストーンの回路に使われる - - 暗黒茸 + + トロッコの一種で、移動する TNT 火薬として機能する - - {*prefix*}{*postfix*}ポーション{*splash*} + + 馬に装備できる特殊な防具。装備するとアーマーポイント +7 + + + コマンドを実行するのに使う - - ガラスビン + + 空に向かって光を発し、近くにいるプレイヤーにパワーを与える - - 水のビン + + ブロックやアイテムを中に保管する。2 つのチェストを横に並べて置くと、容量が 2 倍の大きなチェストになる。トラップつきチェストは、開けるとレッドストーンに動力を生じさせる - - クモの目 + + 馬に装備できる特殊な防具。装備するとアーマーポイント +11 - - 発酵したクモの目 + + 生き物をプレイヤーや柵に繋ぐのに使う - - ブレイズの粉 + + ゲームの世界のモブに名前をつけるのに使う - - マグマクリーム + + 勤勉 - - 調合台 + + 完全版を購入 - - 大釜 + + ゲームに戻る - - エンダーアイ + + セーブ - - 輝くスイカ + + プレイする - - エンチャントのビン + + ランキング - - 発火剤 + + ヘルプとオプション - - 発火剤 (木炭) + + 難易度: - - 発火剤 (石炭) + + PvP: - - 額縁 + + 高度な操作を許可: - - {*CREATURE*}出現 + + TNT 火薬: - - 暗黒レンガ + + ゲームタイプ: - - スカル + + 建物: - - ガイコツ スカル + + レベルタイプ: - - ウィザー ガイコツ スカル + + ゲームが見つかりません - - ゾンビ ヘッド + + 招待者のみ - - ヘッド + + その他のオプション - - %sのヘッド + + ロード - - クリーパー ヘッド + + ホスト オプション - - + + プレイヤー/招待 - - 草ブロック + + オンライン ゲーム - - + + 新しい世界 - - 丸石 + + プレイヤー - - 樫の板 + + ゲームに参加 - - トウヒの板 + + ゲームを始める - - 樺の板 + + 世界の名前 - - ジャングルの木の板 + + 世界生成のシード - - 苗木 + + 空白にすると、ランダムにシードを決めます - - 樫の苗木 + + 火の延焼: - - トウヒの苗木 + + 看板のメッセージを編集: - - 樺の苗木 + + スクリーンショットの説明を入力してください - - ジャングルの木の苗木 + + キャプション - - 岩盤 + + プレイ中のボタンガイド - - + + 2 プレイヤー左右分割画面 - - 溶岩 + + 完了 - - + + ゲームのスクリーンショット - - 砂岩 + + 効果なし - - 砂利 + + スピード - - 金鉱石 + + 鈍化 - - 鉄鉱石 + + 看板のメッセージを編集: - - 石炭の原石 + + Minecraft 正統派のテクスチャ、アイコン、ユーザー インターフェイス! - - + + マッシュアップの世界をすべて表示 - - 樫の木 + + ヒント - - トウヒの木 + + アバター アイテム 1 を再インストール - - 樺の木 + + アバター アイテム 2 を再インストール - - ジャングルの木 + + アバター アイテム 3 を再インストール - - + + テーマを再インストール - - トウヒ + + ゲーマー アイコン 1 を再インストール - - + + ゲーマー アイコン 2 を再インストール - - 葉っぱ + + オプション - - 樫の葉 + + ユーザー インターフェイス - - トウヒの葉 + + デフォルトにリセット - - 樺の葉 + + 画面の揺れ - - ジャングルの木の葉 + + オーディオ - - スポンジ + + コントロール - - ガラス + + グラフィック - - ウール + + ポーションの調合に使う。ガストが倒されたときに落とす - - 黒のウール + + ゾンビ ピッグマンが倒されたときに落とす。ゾンビピッグマンは暗黒界にいる。ポーションを調合する際の原材料として使われる - - 赤のウール + + ポーションの調合に使う。暗黒砦に生えている。また、ソウルサンドでも育つ - - 緑のウール + + 上面を歩くと滑る。他のブロックの上で壊れると水になる。光源に近づけたり、暗黒界に設置すると溶ける - - 茶色のウール + + 飾り付けとして使う + + + ポーションの調合や要塞を探すのに使う。暗黒砦の周囲にいるブレイズが落とす - - 青のウール + + 何に使うかにより、様々な効果が現れる - - 紫のウール + + ポーションの調合や、他のアイテムと合わせてエンダーアイまたはマグマクリームを作るのに使う - - 水色のウール + + ポーションの調合に使う - - 薄灰色のウール + + ポーションやスプラッシュポーションの調合に使う - - 灰色のウール + + 水を入れるビン。調合台でポーションを作る時、最初に必要になる - - ピンクのウール + + 食べ物や薬の材料となる有毒のアイテム。クモや洞窟グモが倒されたときに落とす - - 黄緑のウール + + 主にマイナス効果のポーションを調合するのに使う - - 黄色のウール + + 置くと徐々に茂る。ハサミを使って集める。はしごのように登ることができる - - 空色のウール + + ドアと似ているが、主に柵と組み合わせて使う - - 赤紫のウール + + 切ったスイカから作れる - - オレンジのウール + + 透明なブロックで、ガラスブロックの代わりに使える - - 白のウール + + (ボタン、レバー、重量感知板、レッドストーンのたいまつ、またはレッドストーンといずれかの組み合わせによって) 電気が送られると、ピストンが伸びてブロックを押し、ピストンが戻る時には、触れているブロックを引き戻す - - + + 石ブロックから作る。要塞で見かけることが多い - - バラ + + 柵と同様、障害物として使う - - きのこ + + 植えるとカボチャが生える - - 金のブロック + + 建設と飾り付けに使う - - 金を省スペースに保管できる + + 歩くと移動が遅くなる。ハサミで破壊でき、糸が採れる - - 鉄のブロック + + 破壊されるとシルバーフィッシュを出現させる。近くで別のシルバーフィッシュが攻撃を受けたときにも、シルバーフィッシュを出現させる場合がある - - 鉄を省スペースに保管できる + + 植えるとスイカが生える - - 石の厚板 + + エンダーマンが倒されたときに落とす。投げると、落ちた場所にプレイヤーがテレポートされ、HP が少し減る - - 石の厚板 + + 上面に草が生えた土ブロック。シャベルを使って集める。建築用に使われる - - 砂岩の厚板 + + 雨水またはバケツの水を入れて、水をガラスビンに詰めるのに使われる - - 樫の厚板 + + 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる - - 丸石の厚板 + + かまどで暗黒石を精錬するとできる。暗黒レンガ ブロックの材料となる - - レンガの厚板 + + 動力を受けると点灯する - - 石レンガの厚板 + + 陳列ケースのように、中に入れたアイテムまたはブロックを展示する - - 樫の厚板 + + 投げると特定の種類の生き物が出現する - - トウヒの厚板 + + 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる - - 樺の厚板 + + 栽培して、カカオ豆を収穫できる - - ジャングルの木の厚板 + + - - 暗黒レンガの厚板 + + 倒すと革を落とす。バケツがあればミルクも取れる - - レンガ + + - - TNT 火薬 + + モブ ヘッドは飾り付けとして並べたり、ヘルメットのスロットからマスクとして着用もできる - - 本棚 + + イカ - - コケ石 + + 倒すと墨袋を落とす - - 黒曜石 + + 火をつけるのに便利。分配装置から撃ち出して、無差別に火を起こすのにも使われる - - たいまつ + + 水に浮く植物。上を歩くことができる - - たいまつ (石炭) + + 暗黒砦を建てるのに使う。ガストの火の玉が効かない - - たいまつ (木炭) + + 暗黒砦で使う - - + + 投げると果てのポータルがある方角を示す。果てのポータルの枠内に 12 個置くと、果てのポータルが起動する - - モンスター発生器 + + ポーションの調合に使う - - 樫の階段 + + 草ブロックに似ているが、きのこ栽培に最適 - - チェスト + + 暗黒砦で手に入る。壊すと暗黒茸を落とす - - レッドストーンの粉 + + 果ての世界に存在するブロックの一種。爆発に対する耐性が高いので建材として便利 - - ダイヤモンド鉱石 + + 果ての世界でエンダー ドラゴンを倒すと出現するブロック - - ダイヤモンドのブロック + + 投げると経験値オーブを落とす。経験値オーブを貯めると経験値が上がる - - ダイヤモンドを省スペースに保管できる + + プレイヤーの経験値を消費して剣やツルハシ、斧、シャベル、弓、防具にエンチャントを行う - - 作業台 + + エンダーアイを 12 個使って起動すると、果ての世界へ行くためのポータルができる - - 作物 + + 果てのポータルを作るのに使う - - 農地 + + (ボタン、レバー、重量感知板、レッドストーンのたいまつ、またはレッドストーンといずれかの組み合わせによって) 電気が送られると、ピストンが伸びてブロックを押すことができる - - かまど + + かまどで粘土を焼いて作る - - 看板 + + かまどで焼くとレンガになる - - 木のドア + + 壊すと粘土の塊を落とす。粘土はかまどで焼くとレンガになる - - はしご + + 斧を使って切る。木の板の材料になったり、燃料としても使われる - - レール + + かまどで砂を精錬するとできる。建築用素材として使えるが、掘ると壊れる - - 加速レール + + ツルハシを使って石から掘り出す。かまどや石の道具を作るのに使う - - 感知レール + + 雪玉を保管するのに使える - - 石の階段 + + おわんに入れてシチューを作れる - - レバー + + ダイヤモンドのツルハシのみで掘れる。水と溶岩が混ざることで生まれる。ポータルの材料になる - - 重量感知板 + + モンスターを出現させる - - 鉄のドア + + シャベルで掘り出して雪玉を作る - - レッドストーン鉱石 + + 壊すと時々、小麦の種が出てくる - - レッドストーンのたいまつ + + 染料の材料になる - - ボタン + + シャベルを使って集める。掘っていると、時々火打ち石が出てくる。下に何もないと重力に引かれる - - + + ツルハシで掘れる。石炭が採れる - - + + 石のツルハシ以上で掘れる。ラピスラズリが採れる - - サボテン + + 鉄のツルハシ以上で掘れる。ダイヤモンドが採れる - - 粘土 + + 飾り付けとして使う - - サトウキビ + + 鉄のツルハシ以上で掘れる。かまどに入れて精錬すると、金の延べ棒になる - - ジュークボックス + + 石のツルハシ以上で掘れる。かまどに入れて精錬すると、鉄の延べ棒になる - - + + 鉄のツルハシ以上で掘れる。レッドストーンの粉が採れる - - カボチャ + + 破壊することができない - - カボチャ ランタン + + 触れる物すべてに火をつける。バケツを使って集める - - 暗黒石 + + シャベルを使って集める。かまどに入れて精錬するとガラスになる。下に何もないと重力に引かれる - - ソウルサンド + + ツルハシで掘れる。丸石が採れる - - 光石 + + シャベルを使って集める。建築用に使われる - - ポータル + + 植えると、最終的に木に成長する - - ラピスラズリ鉱石 + + 地面に置いて、電気を伝えられる。ポーションに加えて調合すると、効果の持続時間が延長される - - ラピスラズリのブロック + + 牛を倒すと手に入る。防具の材料となる。本を作る際にも使われる - - ラピスラズリを省スペースに保管できる + + スライムを倒すと手に入る。ポーションを調合する際の原材料として使われ、吸着ピストンの材料にもなる - - 分配装置 + + ニワトリがランダムで落とす。食べ物アイテムの材料になる - - 音ブロック + + 砂利を掘ると手に入る。火打ち石と打ち金の材料になる - - ケーキ + + 豚に使うと、その豚に乗れる。豚は串刺しのニンジンで操ることができる - - ベッド + + 雪を掘ると手に入る。投げることができる - - クモの巣 + + 光石を掘ると手に入る。光石のブロックに戻すことができる。ポーションに加えて調合すると、効果のレベルが上がる - - 背の高い草 + + 壊すと時々、苗木を落とす。苗木は植えると木へと成長する - - 枯れた茂み + + ダンジョン内にある。建設と飾り付けに使う - - ダイオード + + 羊からウールを刈り取ったり、葉っぱのブロックを収穫するのに使う - - 鍵つきチェスト + + ガイコツを倒すと手に入る。骨粉の材料となる。オオカミに与えると手なずけることができる - - トラップドア + + ガイコツにクリーパーを倒させると手に入る。ジュークボックスで再生できる - - ウール (すべての色) + + 火を消し、作物の成長を促進する。バケツで集めることができる - - ピストン + + 作物から収穫できる。食べ物アイテムを作るのに使われる - - 吸着ピストン + + 砂糖を作るための材料になる - - シルバーフィッシュ ブロック + + ヘルメットとしてかぶったり、たいまつと組み合わせてカボチャ ランタンにできる。カボチャのパイの主原料でもある - - 石レンガ + + いったん火がつくと、燃え続ける - - 苔の生えた石レンガ + + 十分に育つと作物が実り、小麦を収穫できる - - ひび割れた石レンガ + + 耕された地面。種を植えられる - - 模様入り石レンガ + + かまどで加熱することで、緑色の染料になる - - きのこ + + 上を歩くもののスピードを遅くする - - きのこ + + ニワトリを倒すと手に入る。矢の材料になる - - 鉄格子 + + クリーパーを倒すと手に入る。TNT 火薬の材料になる。ポーションを調合する際の原材料としても使われる - - ガラス板 + + 農地にまくと作物ができる。日光が十分に当たるようにしよう! - - スイカ + + ポータルを通過すると、地上界と暗黒界を行き来できる - - カボチャの茎 + + かまどの燃料として使用する。たいまつの材料にもなる - - スイカの茎 + + クモを倒すと手に入る。弓や釣り竿の材料になる。地面に設置してトリップワイヤーを作ることもできる - - つた + + 毛を刈るときウールを落とす (毛が残っている場合)。ウールはいろいろな色に染められる - - フェンスゲート + + Business Development - - レンガ階段 + + Portfolio Director - - 石レンガ階段 + + Product Manager - - シルバーフィッシュの石 + + Development Team - - シルバーフィッシュの丸石 + + Release Management - - シルバーフィッシュの石レンガ + + Director, XBLA Publishing - - 菌糸 + + Marketing - - スイレンの葉 + + Asia Localization Team - - 暗黒レンガ + + User Research Team - - 暗黒レンガの柵 + + MGS Central Teams - - 暗黒レンガ階段 + + Community Manager - - 暗黒茸 + + Europe Localization Team - - エンチャントテーブル + + Redmond Localization Team - - 調合台 + + Design Team - - 大釜 + + Director of Fun - - 果てのポータル + + Music and Sounds - - 果てのポータルの枠 + + Programming - - 果ての石 + + Chief Architect - - ドラゴンの卵 + + Art Developer - - 低木 + + Game Crafter - - シダ + + Art - - 砂岩の階段 + + Producer - - トウヒの階段 + + Test Lead - - 樺の階段 + + Lead Tester - - ジャングルの木の階段 + + QA - - レッドストーン ランプ + + Executive Producer - - ココア + + Lead Producer - - スカル + + Milestone Acceptance Tester - - 現在の操作方法 + + 鉄のシャベル - - レイアウト + + ダイヤモンドのシャベル - - 動く/ダッシュ + + 金のシャベル - - 見る + + 金の剣 - - 止まる + + 木のシャベル - - ジャンプ + + 石のシャベル - - ジャンプ/上昇 (飛行時) + + 木のツルハシ - - 持ち物 + + 金のツルハシ - - 手持ちアイテムの切り替え + + 木の斧 - - アクション + + 石の斧 - - 使う + + 石のツルハシ - - 工作 + + 鉄のツルハシ - - 落とす + + ダイヤモンドのツルハシ - - しのび足 + + ダイヤモンドの剣 - - しのび足/下降 (飛行時) + + SDET - - カメラ モードの変更 + + Project STE - - プレイヤー/招待 + + Additional STE - - 移動 (飛行時) + + Special Thanks - - レイアウト 1 + + Test Manager - - レイアウト 2 + + Senior Test Lead - - レイアウト 3 + + Test Associates - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + 木の剣 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + 石の剣 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + 鉄の剣 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Jon Kagstrom - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Tobias Mollstam - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Rise Lugo - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Developer - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + 当たると爆発する火の玉を放ってくる - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + スライム - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + ダメージを与えると、小さなスライムに分裂する - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + ゾンビ ピッグマン - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + 最初はおとなしいが、1 匹を攻撃すると集団で反撃してくる - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + ガスト - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + エンダーマン - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + 洞窟グモ - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + 牙に毒がある - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + ムーシュルーム - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + 照準を向けると攻撃してくる。ブロックを移動できる - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + シルバーフィッシュ - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + 攻撃すると、近くに隠れているシルバーフィッシュも集まってくる。石ブロックの中に隠れている - - {*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*} + + Original Design and Code by - - 工作にはいくつもの工程があります。木の板が手に入ったので、これで、いろいろ作ることができます。まずは作業台を作ってみましょう{*CraftingTableIcon*} + + Project Manager/Producer - - 作業に合った道具を使うことで、ブロックをより効率よく集めることができます。道具には棒の持ち手が必要な物があるので、棒を作りましょう{*SticksIcon*} + + Rest of Mojang Office - - 手に持っているアイテムを変更するには {*CONTROLLER_ACTION_LEFT_SCROLL*} と {*CONTROLLER_ACTION_RIGHT_SCROLL*} を使います + + Concept Artist - - アイテムを使用したり、置いたり、オブジェクトにアクションを取ったりするには {*CONTROLLER_ACTION_USE*} を使います。置いたアイテムは、適切な道具を使用して拾うことができます + + Number Crunching and Statistics - - 作業台を置きましょう。作業台を選択して、置きたい場所にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押します + + Bully Coordinator - - 作業台にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押して、作業台を開きましょう + + リード ゲーム プログラマー Minecraft PC - - シャベルを使えば、土や雪のような柔らかいブロックを手早く掘れます。より多くの材料を手に入れることで、より丈夫で効率の良い道具を作ることができます。木のシャベルを作ってみましょう{*WoodenShovelIcon*} + + Customer Support - - 斧を使えば、木や木のブロックを手早く切り出せます。より多くの材料を手に入れることで、より丈夫で効率の良い道具を作ることができます。木の斧を作ってみましょう{*WoodenHatchetIcon*} + + Office DJ - - ツルハシを使えば、石や鉱石のような堅いブロックを早く掘り出せます。より多くの材料を手に入れることで、さらに堅い材料を掘ることのできる、より丈夫で効率の良い道具を作ることができます。木のツルハシを作ってみましょう{*WoodenPickaxeIcon*} + + Designer/Programmer Minecraft - Pocket Edition - - 入れ物を開く + + Ninja Coder - - 夜はすぐに訪れます。何の準備もなしに外にいるのは危険です。武器や防具を作ることもできますが、まずは安全な場所を作ることが賢明です + + CEO - - 近くに、昔は鉱山の働き手が住んでいた小屋があります。それを修復すれば夜でも安全です + + White Collar Worker - - 小屋を修復するための材料を集めましょう。壁や屋根はどのブロックでも作れますが、ドアや窓、明かりも作りたいところです + + Explosives Animator - - ツルハシを使って、石のブロックを掘り出してみましょう。石のブロックを掘り出していると、丸石も出てきます。丸石を 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 つだけ移動できます + + エンチャントテーブルの周囲に並べることで、エンチャントの効果をより強力にできる - - ポインターでアイテムを選択したまま、持ち物画面の外にポインターを動かすことで、アイテムを外に落とすことができます + + {*T3*}使い方: かまど{*ETW*}{*B*}{*B*} +かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます。{*B*}{*B*} +ゲームの世界にかまどを置いて {*CONTROLLER_ACTION_USE*} を押すと使うことができます。{*B*}{*B*} +かまどの下に燃料を入れ、上には加工したいアイテムを入れてください。するとかまどに火が入り、加工が始まります。{*B*}{*B*} +加工が終わると、そのアイテムをかまどの取り出し口から持ち物に移すことができます。{*B*}{*B*} +ポインターで選んだアイテムがかまどで使用する素材または燃料の場合、かまどへ移動するためのボタンガイドが表示されます - - アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_VK_BACK*} を押してください + + {*T3*}使い方: 分配装置{*ETW*}{*B*}{*B*} +分配装置を使うと、アイテムを撃ち出すことができます。そのためには分配装置の横にレバーなどのスイッチ部分を取り付ける必要があります。{*B*}{*B*} +分配装置にアイテムを入れるには、{*CONTROLLER_ACTION_USE*} を押してから、持ち物からアイテムを分配装置に移します。{*B*}{*B*} +それから取り付けたスイッチを使うと、分配装置がアイテムを撃ち出します - - 持ち物画面を閉じるには {*CONTROLLER_VK_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*}ガストの涙{*ETW*}{*B*} +* {*T2*}ブレイズの粉{*ETW*}{*B*} +* {*T2*}マグマクリーム{*ETW*}{*B*} +* {*T2*}輝くスイカ{*ETW*}{*B*} +* {*T2*}レッドストーンの粉{*ETW*}{*B*} +* {*T2*}光石の粉{*ETW*}{*B*} +* {*T2*}発酵したクモの目{*ETW*}{*B*}{*B*} + +調合できる材料の組み合わせはたくさんありますので、色々と実験してみてください! - - これがクリエイティブ モードの持ち物です。手で持って使用できるアイテムと、所有しているアイテムのリストを確認できます + + {*T3*}使い方: チェスト (大){*ETW*}{*B*}{*B*} +2 つのチェストを横に並べて置くと、チェスト (大) になります。よりたくさんのアイテムを保管できます。{*B*}{*B*} +使い方は普通のチェストと同じです - - {*B*} - 持ち物の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - クリエイティブ モードの持ち物の説明を飛ばす: {*CONTROLLER_VK_B*} + + {*T3*}遊び方: 工作{*ETW*}{*B*}{*B*} +工作画面では、持ち物のアイテムを組み合わせて新しいアイテムを作れます。 工作画面を開くには {*CONTROLLER_ACTION_CRAFTING*} を押します。{*B*}{*B*} +画面上部のタブを {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で切り替えて、作りたいアイテムのグループを選んでから {*CONTROLLER_MENU_NAVIGATE*} で作るアイテムを選びます。{*B*}{*B*} +工作ウィンドウに、そのアイテムを作るのに必要なアイテムが表示されます。{*CONTROLLER_VK_A*} を押すとアイテムが作られ、持ち物に追加されます - - ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かし、リストのアイテムに合わせてから {*CONTROLLER_VK_A*} を押すと、アイテムを選択できます。 -{*CONTROLLER_VK_Y*} を押すと、そのアイテムがすべて選択されます + + {*T3*}使い方: 作業台{*ETW*}{*B*}{*B*} +作業台を使うと、もっと大きなアイテムを作ることができます{*B*}{*B*} +ゲームの世界に作業台を置いて {*CONTROLLER_ACTION_USE*} を押すと、使うことができます{*B*}{*B*} +作業台での作業も通常の工作と流れは同じですが、工作ウィンドウが大きくなり、より多くのアイテムを作れるようになります - - -ポインターは自動的に使用欄へ移動します。{*CONTROLLER_VK_A*} でそこに選択アイテムを置きます。アイテムを置くとポインターはアイテム一覧に戻るので、そこから他のアイテムを選ぶこともできます + + {*T3*}使い方: エンチャント{*ETW*}{*B*}{*B*} +モンスターや動物を倒したり、採掘したり、かまどを使った精錬や料理で獲得した経験値は、一部の道具、武器、防具、本のエンチャントに使えます。{*B*} +剣、弓、斧、ツルハシ、シャベル、防具、または本をエンチャントテーブルの本の下の枠に置くと、右側のボタンにエンチャントとエンチャントで消費される経験値が示されます。{*B*} +エンチャントに必要な経験値は、不足している場合は赤、足りている場合は緑で表示されます。{*B*}{*B*} +エンチャントは消費可能な経験値の範囲でランダムに選択されます。{*B*}{*B*} +エンチャントテーブルの周囲に、テーブルとブロック 1 つ分のすき間を空けて本棚 (最大 15 台) を並べることで、エンチャントのレベルが上がります。またエンチャントテーブル上の本から謎の文字が出るエフェクトが表示されます。{*B*}{*B*} +エンチャントテーブルに必要な材料は、すべてゲームの世界内の村や、採掘、農耕などで手に入ります。{*B*}{*B*} +エンチャントの本は、金床でアイテムをエンチャントする際に使います。これによって、アイテムに付与するエンチャントの内容をより制御できるようになります。{*B*} - - ポインターでアイテムを選択したまま、持ち物画面の外へポインターを動かすと、そのアイテムをゲームの世界に落とすことができます。クイック選択バーを一度に空にするには{*CONTROLLER_VK_X*}を押してください。 + + {*T3*}遊び方: 世界へのアクセス禁止{*ETW*}{*B*}{*B*} +プレイ中の世界が不適切なコンテンツを含んでいる場合、その世界をアクセス禁止リストに登録できます。 +世界をアクセス禁止リストに登録するには、ポーズ メニューを開き、{*CONTROLLER_VK_RB*} を押して、[アクセスを禁止] を選択します。 +次にその世界でプレイしようとすると、アクセス禁止リストに登録されていることが通知され、リストから外してプレイするか、プレイをキャンセルして戻るか選択できます - - {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で、上にあるグループのタブを切り替えて、使うアイテムのグループを選択します + + {*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*} + +{*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*} +無効にすると、HP が自然に回復しなくなります。{*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*} +{*KICK_PLAYER_DESCRIPTION*}{*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*} +ほかのプレイヤーやプレイヤー自身を、ゲームの世界内の別のプレイヤーがいる場所へと移動させることができます。 - - アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_VK_BACK*} を押します + + 次へ - - クリエイティブ モード持ち物画面を閉じるには {*CONTROLLER_VK_B*} を押します + + {*T3*}遊び方: 動物の飼育{*ETW*}{*B*}{*B*} +動物を特定の場所で飼うには 20 x 20 ブロック未満のエリアに柵を立て、その中に動物を入れます。これで動物は柵の中にとどまり、いつでも様子を見ることができます - - -これが工作画面です。この画面では、これまでに集めたアイテムを組み合わせて、新しいアイテムを作ることができます + + {*T3*}遊び方: 動物の繁殖{*ETW*}{*B*}{*B*} +Minecraft に登場する動物 は繁殖能力を持ち、自分たちの赤ちゃんバージョン +を産み出します!{*B*} +動物を繁殖させるには、その動物に合った餌を与えて、動物たちを「求愛モー +ド」に導く必要があります。{*B*} +牛、ムーシュルーム、羊には小麦、豚にはニンジン、ニワトリには小麦の種か暗 +黒茸、オオカミには肉を与えましょ う。すると、近くにいる求愛モードの仲間 +を探し始めます。{*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*} +チェストを作ったら、それをゲームの世界に置きましょう。{*CONTROLLER_ACTION_USE*} でチェストを使って、中にアイテムを保管できます。{*B*}{*B*} +ポインターを使って、アイテムを持ち物からチェストに、あるいはその逆に移せます。{*B*}{*B*} +チェストに入れたアイテムはそのまま保管され、後でまた自分の持ち物に戻すことができます + + + MineCon には参加しましたか? - - {*B*} - 工作の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - 工作の説明を飛ばす: {*CONTROLLER_VK_B*} + + Mojang のスタッフですらジャンクボーイの素顔は知りません - - {*B*} - アイテムの説明を見るには {*CONTROLLER_VK_X*} を押します + + Minecraft Wiki があるのを知っていますか? - - {*B*} - このアイテムを作るのに必要なアイテムのリストを見るには {*CONTROLLER_VK_X*} を押します + + 虫と目を合わせてはいけません - - {*B*} - 持ち物に戻るには {*CONTROLLER_VK_X*} を押します + + クリーパーはプログラムのバグから発生します - - {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で、上にあるグループのタブを切り替えて、作りたいアイテムのグループを選択し、{*CONTROLLER_MENU_NAVIGATE*} で作るアイテムを選択します + + ニワトリ? それともアヒル? - - 工作ウィンドウには、新しいアイテムを作るのに必要なアイテムが表示されます。{*CONTROLLER_VK_A*} を押すとアイテムが作られ、持ち物に追加されます + + Mojang の新しい事務所はとっても最高! - - 作業台を使うと、より多くの種類のアイテムを作れるようになります。作業台での工作も普通の工作と変わりません。ですが作業スペースが広い分、より多くの材料を組み合わせてアイテムを作ることができます + + {*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*} を押すと、染めることができます。 - - 選択したアイテムを作るのに必要なアイテムのリストです + + MineCon 2013 はフロリダ州オーランド (アメリカ合衆国) で開催されました! - - 集めた木を使って、木の板を作ることができます。作るには、木の板のアイコンを選んでから {*CONTROLLER_VK_A*} を押してください{*PlanksIcon*} + + .party() は最高でした! - - これで 作業台が完成です! ゲームの世界に置いて、いろいろなアイテムを作れるようにしましょう。{*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*} を押してください + + ホストとプレイヤーのオプション - - これがかまどの画面です。かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます + + {*T3*}遊び方: 果ての世界{*ETW*}{*B*}{*B*} +果ての世界は別世界の 1 つで、果てのポータルを起動して行くことができます。果てのポータルは地上界の地下深くの要塞にあります{*B*} +果てのポータルを起動するには、エンダーアイを果てのポータルの枠内にはめ込む必要があります。{*B*} +ポータルが起動したら、飛び込んで果ての世界に行きましょう{*B*}{*B*} +果ての世界では大勢のエンダーマンが待ち構えているだけでなく、恐ろしく手ごわいエンダードラゴンが出現します。果ての世界に進む前にしっかり戦いの準備を整えましょう!{*B*}{*B*} +8 本の黒曜石の柱の上にはエンダークリスタルがあり、エンダードラゴンはこれを使って回復します。 +戦いが始まったら最初にエンダークリスタルをひとつずつ破壊しましょう{*B*} +手前の数個は矢が届く場所にありますが、残りは鉄の柵で囲まれています。届く高さまで足場を積み上げましょう{*B*}{*B*} +その間、エンダードラゴンが飛びかかってきたり、エンダーアシッドブレスを吐いて攻撃してきます!{*B*} +柱の中央にあるタマゴ台に近づくと、エンダードラゴンが攻撃しようと降下してきます。ダメージを与えるチャンスです!{*B*} +アシッドブレスをかわしながら、エンダードラゴンの弱点である目を狙うのが効果的です。助けてくれるフレンドがいる場合は、果ての世界に来てもらって一緒に戦いましょう!{*B*}{*B*} +あなたが果ての世界に入ると、フレンドの地図にも要塞内に果てのポータルの場所が表示されるようになり、簡単に参加してもらえます - - {*B*} - かまどの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - かまどの説明を飛ばす: {*CONTROLLER_VK_B*} + + {*ETB*}ようこそ! まだお気づきでないかもしれませんが、Minecraft がアップデートされました。{*B*}{*B*} +ここでご紹介するのは、あなたとあなたのフレンドが遊べる新要素のほんの一部です。よく読んで楽しく遊んでください!{*B*}{*B*} +{*T1*}新アイテム{*ETB*} - 硬くなった粘土、色つきの粘土、石炭のブロック、干し草の俵、起動レール、レッドストーンのブロック、日光センサー、トロッパー、ホッパー、ホッパーつきトロッコ、TNT 火薬つきトロッコ、レッドストーン比較装置、荷重した重量感知板、ビーコン、トラップつきチェスト、打ち上げ花火、花火の星、暗黒星、引き綱、馬鎧、名札、馬のスポーン エッグ{*B*}{*B*} +{*T1*}新しいモブ{*ETB*} - ウィザー、ウィザー ガイコツ、魔女、コウモリ、馬、ロバ、ラバ{*B*}{*B*} +{*T1*}新機能{*ETB*} - 馬を手なずけて乗る、花火を作って披露する、動物やモンスターに名札で名前をつける、さらに高度なレッドストーン回路を作る、ゲストが世界に対してできることを管理するための新しいホストのオプション{*B*}{*B*} +{*T1*}新しいチュートリアルの世界{*ETB*} – チュートリアルの世界で、既存の機能や新機能の使い方を覚えましょう。世界に隠された秘密の音楽ディスクをすべて見つけられるか挑戦してください!{*B*}{*B*} - - かまどの下に燃料を入れ、上には加工したいアイテムを入れてください。するとかまどに火が入り、加工が始まります。完成したアイテムは右のスロットに入ります + + 手よりも攻撃力が高い - - 木でできているアイテムの多くが燃料として使えますが、種類によって燃える時間が異なります。さらに木以外にも燃料として使えるアイテムがあります + + 土、草、砂、砂利や雪を掘るのに使う。手で掘るより速い。雪玉を掘るにはシャベルが必要 - - アイテムの加工が終わると、その完成したアイテムを持ち物へ移動できます。様々な材料を使って、何が出来上がるのかいろいろ実験してみましょう + + ダッシュ - - 木を材料に使うと、木炭が出来上がります。かまどに燃料を入れ、材料を入れる所に木を入れてください。木炭が出来上がるには少し時間がかるので、その間は他のことをしながら、時々進み具合を確かめに戻って来ましょう + + 最新情報 - - 木炭は燃料として使えます。棒と組み合わせると、たいまつになります + + {*T3*}変更と追加{*ETW*}{*B*}{*B*} +- 新しいアイテムを追加 - 硬くなった粘土、色つきの粘土、石炭のブロック、干し草の俵、起動レール、レッドストーンのブロック、日光センサー、トロッパー、ホッパー、ホッパーつきトロッコ、TNT 火薬つきトロッコ、レッドストーン比較装置、荷重感知板、ビーコン、トラップつきチェスト、打ち上げ花火、花火の星、暗黒星、引き綱、馬鎧、名札、馬のスポーン エッグ{*B*} +- 新しいモブを追加 - ウィザー、ウィザー ガイコツ、魔女、コウモリ、馬、ロバ、ラバ{*B*} +- 新しい地形生成機能を追加 - 魔女の小屋{*B*} +- ビーコンの画面を追加{*B*} +- 馬の画面を追加{*B*} +- ホッパーの画面を追加{*B*} +- 花火を追加 - 花火の画面へは、花火の星または打ち上げ花火を作る材料を持っている時に作業台からアクセス可能{*B*} +- アドベンチャー モードを追加 - 適切な道具がないとブロックを壊せない{*B*} +- 新しいサウンドを多数追加{*B*} +- 生き物、アイテム、間接攻撃用の武器がポータルを通過可能に{*B*} +- 横に設置された別の反復装置からの出力で、反復装置をロック可能に{*B*} +- ゾンビとガイコツが、異なる武器や防具で出現可能に{*B*} +- 新しいゲームオーバー メッセージ{*B*} +- 名札で生き物に名前をつけ、入れ物の名前を変更して、メニューが開いた時のタイトルを変更{*B*} +- 骨粉がすべてのものを一瞬で最大まで成長させず、段階的にランダムに成長させるように{*B*} +- チェスト、調合台、分配装置、ジュークボックスに触れるようにレッドストーン比較装置を置くと、内容物を説明する信号を出す{*B*} +- 分配装置はどの方向に向けてもよい{*B*} +- 金のリンゴを食べると、"吸収" HPが短期間アップする{*B*} +- 1 つのエリアに長くいるほど、そのエリアに出現するモンスターの難易度が上がる{*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*} を押してガラスビンに水を詰めてください + + 動物の繁殖 - - 大釜が空になったら、水バケツを使って水を溜めてください + + 調合 - - 調合台を使って耐火ポーションを作りましょう。水のビン、暗黒茸とマグマクリームを用意してください + + deadmau5 は Minecraft が大好き! - - ポーションを使うには、ポーション手に持って {*CONTROLLER_ACTION_USE*} を押します。普通のポーションは飲んだ本人に効果を発揮します。スプラッシュポーションの場合は、投げて落ちた所の周囲にいるクリーチャーに効果を発揮します - スプラッシュポーションは普通のポーションに火薬を混ぜ合わせると作れます + + ピッグマンは、こちらから攻撃しない限り、攻撃してきません - - 耐火ポーションを自分に使ってみましょう + + ベッドで寝ることで、復活地点の変更と、夜から朝へ時間を早回しすることができます - - 火と溶岩に対する耐性が上がりました。これまで行けなかった場所にも行けるので試してみましょう + + ガストに火の玉を打ち返してやりましょう! - - これがエンチャントの画面です。武器や防具、一部の道具にエンチャントすることで、特別なボーナスを付加できます + + たいまつを作って、夜に明かりとして使いましょう。たいまつの回りにはモンスターが近寄ってこなくなります - - {*B*} - エンチャント画面の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - エンチャント画面の説明を飛ばす: {*CONTROLLER_VK_B*} + + トロッコとレールを使えば、早く目的地に着けます - - アイテムをエンチャントするには、まずアイテムをエンチャントの枠に入れてください。武器や防具、一部の道具にエンチャントすることで、ダメージ耐性を上げたり、採掘量を増やしたりなどの特別なボーナスを付加できます + + 苗木を植えれば、成長して木になります - - エンチャントの枠にアイテムを入れると、右側のボタンにランダムなエンチャントが表示されます + + 闇のポータルを作れば、別の世界である暗黒界に行くことができます - - ボタンに表示される数値はそのエンチャントを行うのに必要な経験値を表します。経験値が足りない場合、使えないボタンは無効になります + + 真下や真上に掘り進むのは、賢いとはいえません - - エンチャントを行うには、エンチャントを選んで {*CONTROLLER_VK_A*} を押してください。エンチャントのコストに応じて経験値レベルが下がります + + ガイコツの骨から作った骨粉は肥料として使えて、色々なものを一瞬で成長させることができます! - - エンチャントは基本的にランダムですが、一部の強力なエンチャントは経験値レベルが高く、エンチャントテーブルの周囲にテーブルを強化する本棚がたくさん設置されていないと表示されません + + クリーパーは近づくと爆発します! - - ここにはエンチャントテーブルと、エンチャントについて学ぶためのいくつかのアイテムがあります + + {*CONTROLLER_VK_B*} を押すと、手に持っているアイテムを落とします! - - {*B*} - エンチャントの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - エンチャントの説明を飛ばす: {*CONTROLLER_VK_B*} + + 目的にあった道具を使いましょう! - - エンチャントテーブルを使うと、採掘量を増やしたり、武器や防具、一部の道具のダメージ耐性を上げたりなどの特別なボーナスを付加できます + + たいまつに使う石炭が見つからないときには、かまどを使って木から木炭を作ることができます - - エンチャントテーブルの周囲に本棚を置くと、テーブルが強化されてより高レベルのエンチャントができるようになります + + 豚肉は生で食べるよりも、調理したほうが HP を多く回復します - - エンチャントは経験値を消費します。経験値は、モンスターや動物を倒したり、採掘したり、動物を繁殖させたり、釣りをしたり、かまどを使った精錬や料理などで生成される経験値オーブを集めることで、貯まっていきます + + 難易度を「ピース」に設定すると、HP が自動的に回復し、夜間にモンスターが出現しなくなります! - - エンチャントのビンを使って経験値を貯めることもできます。投げると落ちた場所に経験値オーブが出現するので、集めて経験値を貯めましょう + + オオカミに骨を与えて、手なずけましょう。おすわりさせたり、あなたについてこさせたりできます - - ここにあるチェストにはエンチャントされたアイテムや、エンチャントのビンのほか、エンチャントを試してみることのできるアイテムがあります + + 持ち物メニューで、カーソルをメニュー外に動かして、{*CONTROLLER_VK_A*} を押すと、アイテムを落とすことができます - - 今トロッコに乗っています。トロッコから降りるには、ポインターをトロッコに合わせてから {*CONTROLLER_ACTION_USE*} を押してください{*MinecartIcon*} + + 新しいダウンロード コンテンツが追加されました! メイン メニューの [Minecraft ストア] からアクセスできます - - {*B*} - トロッコの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - トロッコの説明を飛ばす: {*CONTROLLER_VK_B*} + + Minecraft ストアのスキン パックを使えば、あなたのキャラクターの外見を変えられます。メイン メニューの [Minecraft ストア] から品ぞろえを確認してくださいね - - トロッコはレールの上を走ります。かまどを乗せた動力つきのトロッコや、チェストがついたトロッコを作ることもできます - {*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*} + + 豚から取れる豚肉を調理して食べると HP が回復します - - {*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*} + + いずれかの方向に 20 ブロック以上動けない動物は消滅しません - - ベッドは安全で明るい場所に置かないといけません。さもないと、夜中にモンスターに襲われてしまいます。ベッドで眠ると、次の力尽きた時の復活地点が、そのベッドに変更されます - {*ICON*}355{*/ICON*} + + 手なずけたオオカミの HP は尻尾の状態で分かります。回復するには、肉を与えましょう - - ゲーム内に他のプレイヤーがいる場合、眠るためには全員が同時にベッドに入っていなければなりません - {*ICON*}355{*/ICON*} + + 緑色の染料を作るには、サボテンをかまどで調理します - - このエリアには、レッドストーンとピストンの回路、回路に使うアイテムの入ったチェストがあります + + [遊び方] の [最新情報] に、最新のアップデートに関する情報があります - - {*B*} - レッドストーン回路とピストンの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - レッドストーン回路とピストンの説明を飛ばす: {*CONTROLLER_VK_B*} + + BGM 制作: C418 - - レバー、ボタン、重量感知版、レッドストーンのたいまつは、起動したいアイテムに直接とりつけたり、レッドストーンの粉でつなげることで、電気を送ることができます + + Notch って誰? - - 電気の源を配置する位置や向きで、周囲のブロックへの効果が変わります。たとえば、ブロックに設置されたレッドストーンのたいまつは、そのブロックに電気が送られると消えます + + Mojang はスタッフの数より受けた賞の数の方が多かったりします - - レッドストーンの粉は、鉄、ダイヤモンド、金のツルハシでレッドストーン鉱石を掘ると手に入ります。レッドストーンの粉を使って電気を伝えることができます。ただし、伝えられるのは距離にして 15 ブロック分、上下には 1 ブロック分までとなります - {*ICON*}331{*/ICON*} + + 有名人も Minecraft をプレイ中! - - レッドストーン反復装置で電気の届く距離を伸ばしたり、回路を遅延させたりすることができます - {*ICON*}356{*/ICON*} + + Notch の Twitter には 100 万人以上のフォロワーがいます! - - ピストンは電気が送られると伸びて、最大 12 個のブロックを押します。吸着ピストンであれば、戻るときに大半の種類のブロックを 1 つ引き寄せることができます - {*ICON*}33{*/ICON*} + + スウェーデン人みんなが金髪というわけではありません。たとえば、Mojang の Jens は赤毛です - - このエリアには、ピストン付きの回路を作るためのアイテムを入れたチェストがあります。すでにある回路を改造したり、1 から回路を作成したりしてみてください。チュートリアル エリアの外には、さらに多くの見本があります + + アップデートも予定中です。お楽しみに! - - このエリアには、暗黒界へのポータルが存在します! + + チェスト 2 つを並べて配置すれば、1 つの大きなチェストになります - - {*B*} - ポータルと暗黒界の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - ポータルと暗黒界の説明を飛ばす: {*CONTROLLER_VK_B*} + + 屋外にウールで建物を建てる場合には、注意しましょう。雷が当たると燃えてしまいます - - ポータルは、黒曜石のブロックで横 4 ブロック、縦 5 ブロックの枠を作成することで完成します。角のブロックは必要ありません。 + + バケツ 1 杯の溶岩があれば、かまどで 100 個のブロックを精錬できます - - ポータルを起動するには、火打ち石と打ち金で、フレーム内の黒曜石に火をつけましょう。枠が壊れたり、近くで爆発が起きたり、液体を流したりすると、ポータルは停止します + + 音ブロックで演奏される楽器は、ブロックの下の材質で変化します - - ポータルを使用するには、ポータルの中に立ちましょう。画面が紫色に変わり、音がし始め、しばらくすると、別世界へテレポートできます + + 溶岩の源のブロックを取り除くと、溶岩はしばらくして完全に消えてしまいます - - 暗黒界はあちこちで溶岩が噴き出す危険な場所ですが、暗黒石や光石を手に入れるには最適な場所です。暗黒石は火をつけると、消えることなく燃え続け、光石は、光を発生させます + + 丸石はガストの火の玉を防いでくれます。ポータルを守るのに使えます - - 暗黒界をうまく利用して地上界を高速移動することができます。暗黒界での 1 ブロックの距離は、地上界での 3 ブロックに相当します + + 光源に使用できるブロックは、雪や氷を溶かすことができます。たいまつ、光石、カボチャ ランタンなどのブロックです - - クリエイティブ モードになりました + + ゾンビやガイコツは、水の中では太陽の光に当たっても大丈夫です - - {*B*} - クリエイティブ モードの説明を続ける: {*CONTROLLER_VK_A*}{*B*} - クリエイティブ モードの説明を飛ばす: {*CONTROLLER_VK_B*} + + ニワトリは 5~10 分ごとにタマゴを生みます - - クリエイティブ モードではほとんどのアイテムやブロックが無限に使えます。また、道具がなくても 1 回クリックするだけでブロックが破壊できるほか、攻撃されてもダメージを受けなくなり、飛行も可能です + + 黒曜石を掘り出すには、ダイヤモンドのツルハシが必要です - - クリエイティブ モードの持ち物を開くには {*CONTROLLER_ACTION_CRAFTING*} を押してください + + クリーパーからは火薬がもっとも簡単に手に入ります - - 続けるには穴の反対側へ移動してください + + オオカミを攻撃すると、近くにいるすべてのオオカミが襲い掛かってきます。ゾンビ ピッグマンも同じ習性を持っています - - クリエイティブ モードのチュートリアルを完了しました + + オオカミは暗黒界に入ることができません - - このエリアには、畑があります。畑では、食べ物などの繰り返し生産できる資源を作り出すことができます + + オオカミはクリーパーを攻撃しません - - {*B*} - 農作業の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - 農作業の説明を飛ばす: {*CONTROLLER_VK_B*} + + 石でできているブロックと鉱石を掘るのに必要 - - 小麦、カボチャ、スイカは、種から育てます。小麦の種は、背の高い草を切ったり、小麦を栽培することで手に入れることができます。カボチャの種やスイカの種は、それぞれ、カボチャやスイカから入手します + + ケーキの材料の 1 つ。ポーションを調合する際の原材料としても使われる - - 種をまく前に、くわをつかって土のブロックを耕地に変える必要があります。近くに水源や光源があり、十分な水と光が供給されていると作物が早く成長します + + オン/オフを切り替えて、電気を送れる。もう一度押すまでオンまたはオフの状態が保たれる - - 小麦は何段階かに変化しながら成長していき、色が濃くなると収穫できるようになります。{*ICON*}59:7{*/ICON*} + + ブロックの横に取り付けて、常に電気を送ったり、送受信機として使える。 +弱い明かりとしても使用可能 - - カボチャとスイカの場合は、茎が太くなってきたら、種をまいた場所の隣に実ができるためのブロックが必要になります + + 2{*ICON_SHANK_01*} 回復する。金のリンゴの材料となる - - サトウキビは、水ブロックと隣接する、草、土、砂のブロックに植える必要があります。また、サトウキビのブロックは中ほどを収穫すると、上にあるブロックもすべて収穫されます。{*ICON*}83{*/ICON*} + + 2{*ICON_SHANK_01*} 回復し、さらに HP が 4 秒間、自動回復する。リンゴと金の塊から作られる - - サボテンは砂に植える必要があり、成長すると 3 ブロックの高さになります。サトウキビと同様、下のブロックを収穫すると、上にあるブロックもすべて収穫できます。{*ICON*}81{*/ICON*} + + 2{*ICON_SHANK_01*} 回復する。食べると毒にあたる可能性がある - - きのこは薄暗いエリアに植えましょう。隣接する薄暗いブロックに広がっていきます。{*ICON*}39{*/ICON*} + + 反復装置、遅延装置、ダイオードとして単体で、または組み合わせて、レッドストーンの回路に使われる - - 骨粉は作物を最大まで成長させたり、きのこを巨大なきのこに成長させることができます。{*ICON*}351:15{*/ICON*} + + トロッコを走らせるのに使う - - 農作業のチュートリアルを完了しました + + 電源が入っている時、上を走るトロッコを加速させる。電源が入っていない時は、上でトロッコが止まる - - このエリアでは動物が飼育されています。動物を飼育して子供を増やすことができます + + トロッコ専用の重量感知板として機能する。電源が入っている時にレッドストーンの信号を送る - - {*B*} - 動物の繁殖の説明を続ける: {*CONTROLLER_VK_A*}{*B*} - 動物の繁殖の説明を飛ばす: {*CONTROLLER_VK_B*} + + 押すと電気を送れる。約 1 秒間起動した後、自動的にオフになる - - 動物を繁殖させるには、動物にあった餌を与えて、動物たちを「求愛モード」にしてやる必要があります + + レッドストーンを電源として使い、ランダムな順番でアイテムを撃ち出す - - 牛、ムーシュルーム、羊には小麦を、豚にはニンジンを、ニワトリには小麦の種または暗黒茸、オオカミには肉を与えましょう。すると、近くにいる求愛モードの仲間を探し始めます + + 音を奏でる。叩くと音程を変えられる。種類の違うブロックの上に置くことで、楽器の種類を変えることができる - - ともに求愛モードの同種の動物が出会うと、少しの間キスをして、動物の赤ちゃんが誕生します。赤ちゃんは、成長するまでは、両親の後ろをついて回ります + + 2.5{*ICON_SHANK_01*} 回復する。かまどで生魚を調理するとできる - - 一度求愛モードになった動物は、5 分間は再び求愛モードになることはありません + + 1{*ICON_SHANK_01*} 回復する - - 手にえさを持っていると、あなたの後ろをついてくる動物もいます。この習性を利用すれば、簡単に動物を一か所に集めことができるでしょう。{*ICON*}296{*/ICON*} + + 1{*ICON_SHANK_01*} 回復する - - 野生のオオカミは、骨を与えることで手なずけることができます。オオカミを手なずけると周りにハートマークが現れます。手なずけたオオカミは、座らせていないときはプレイヤーにつき従い守ってくれます + + 3{*ICON_SHANK_01*} 回復する - - 動物の繁殖のチュートリアルを完了しました + + 弓と組み合わせて、武器として使う - - このエリアには、スノー ゴーレムやアイアン ゴーレムを作るためのカボチャやブロックがあります + + 2.5{*ICON_SHANK_01*} 回復する - - {*B*} - ゴーレムの説明を続ける{*CONTROLLER_VK_A*}{*B*} - ゴーレムの説明を飛ばす{*CONTROLLER_VK_B*} + + 1{*ICON_SHANK_01*} 回復する。6 回まで使用できる - - ゴーレムは、重ねたブロックの一番上にカボチャをおいて完成します + + 1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。食べると毒にあたる可能性がある - - スノー ゴーレムは、雪ブロックを 2 つ重ね、その上にカボチャをのせて完成します。作った人の敵に、雪玉を投げます + + 1.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能 - - アイアン ゴーレムは、鉄のブロック 4 つを T 字に並べ、中央にカボチャをのせて完成します。作った人の敵を攻撃します + + 4{*ICON_SHANK_01*} 回復する。かまどで生の豚肉を調理するとできる - - アイアン ゴーレムは村に自然に現れて村人を守ることもあります。村人を攻撃すると、このアイアン ゴーレムが反撃します + + 1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。ヤマネコに与えて手なずけることもできる - - チュートリアルを終えるまで、このエリアから出ることはできません + + 3{*ICON_SHANK_01*} 回復する。かまどで鶏肉を調理するとできる - - 材料ごとに適した道具があります。土や砂などの柔らかいものを掘る場合はシャベルを使うのがよいでしょう + + 1.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能 - - 材料ごとに適した道具があります。木の幹を切り出す場合は斧を使うのがよいでしょう + + 4{*ICON_SHANK_01*} 回復する。かまどで牛肉を調理するとできる - - 材料ごとに適した道具があります。石や鉱石を掘り出す場合はツルハシを使うのがよいでしょう。特定の種類のブロックを掘るためには、さらに優れた材料を使ってツルハシを作る必要があるかもしれません + + プレイヤーや動物、モンスターを乗せて、レールの上を移動できる - - 特定の道具は敵を攻撃するのに向いています。剣を使うと良いでしょう + + 空色のウールを作るのに使う染料 - - ヒント: 手や、手に持っているアイテムを使って、掘ったり切ったりするには、{*CONTROLLER_ACTION_ACTION*} を押し続けます。道具を作らないと、掘れないブロックもあります + + 水色のウールを作るのに使う染料 - - 道具は使っていると、少しずつ壊れていきます。使うたびに少しずつ損傷していき、最後は完全に壊れます。アイテムの下にあるゲージで、現在の状態が分かります + + 紫のウールを作るのに使う染料 - - 上に向かって泳ぐには {*CONTROLLER_ACTION_JUMP*} を押し続けます + + 黄緑のウールを作るのに使う染料 - - このエリアではレールの上をトロッコが走っています。トロッコに乗るには、ポインターをトロッコに合わせて {*CONTROLLER_ACTION_USE*} を押します。トロッコを動かすには、ボタンにポインターを合わせて {*CONTROLLER_ACTION_USE*} を押しましょう + + 灰色のウールを作るのに使う染料 - - 川のそばにあるチェストの中に、ボートが入っています。ボートを使うには、ポインターを水に合わせて {*CONTROLLER_ACTION_USE*} を押します。ボートに乗るにはポインターをボートに合わせて {*CONTROLLER_ACTION_USE*} を押しましょう + + 薄灰色のウールを作るのに使う染料 +(注意: 薄灰色の染料は灰色の染料と骨粉を混ぜて作るれば、 1 つの墨袋から 3 つではなく 4 つの薄灰色の染料を作ることができる) - - 池のそばにあるチェストの中に、釣り竿が入っています。使うには、チェストから釣り竿を出してから、手に持って使うアイテムに選んでください + + 赤紫のウールを作るのに使う染料 - - このピストン装置は、自動建設される橋です。ボタンを押して、装置の動きを調べてみましょう + + たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える - - アイテムを選択した状態で、持ち物画面の外へポインターを動かすと、アイテムを落とすことができます + + 本や地図を作るのに使う - - このアイテムを作るために必要な材料が揃っていません。左下にあるボックスの中に表示されているのが、必要な材料です + + 本棚を作るのに使う。エンチャントするとエンチャントの本になる。 - - おめでとうございます! チュートリアルはこれですべて完了です。ゲーム内の時間の流れはこれから普通に戻ります。夜が来てモンスターが現れるまで、あまり時間がありません。早く安全な場所を作りましょう! + + 青のウールを作るのに使う染料 - - {*EXIT_PICTURE*} もっと冒険を続けたい場合は、鉱山の働き手が住んでいた小屋の近くに、小さな城に通じる階段があります + + 音楽ディスクを聞ける - - お忘れなく: + + 強力な道具、武器や防具を作ることができる - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + オレンジのウールを作るのに使う染料 - - バージョン アップにより、チュートリアルの新エリアを始めとする新機能が追加されました + + 羊から採れる。染料を使って色を変えることができる - - {*B*}基本のチュートリアルから始める{*CONTROLLER_VK_A*}{*B*} - 基本のチュートリアルを飛ばす{*CONTROLLER_VK_B*} + + 建築用素材。染料で色を変えることができる。ウールは羊から簡単に入手できるので、この作り方はあまりお勧めできない - - このエリアで、釣り竿、ボート、ピストン、レッドストーンなどの使い方を練習しましょう + + 黒のウールを作るのに使う染料 - - このエリアの外では、建物、畑、トロッコ、エンチャント、調合、取引、鍛冶などがあなたを待っています! + + 物を載せて、レール上を移動できる - - 空腹ゲージが減りすぎて、HP が回復できません。 + + レールの上を移動する。石炭を使うことで他のトロッコを押すことができる - - {*B*} - 空腹ゲージや食べ物について詳しく知りたい場合は {*CONTROLLER_VK_A*} を押してください。{*B*} - すでに十分知っている場合は {*CONTROLLER_VK_B*} を押してください。 + + 泳ぐよりも速く水上を移動できる - - 選択 + + 緑のウールを作るのに使う染料 - - 使う + + 赤のウールを作るのに使う染料 - - 戻る + + 即座に作物や木、背の高い草、巨大なきのこ、花などを育てるのに使う。染料の材料にもなる - - 終了 + + ピンクのウールを作るのに使う染料 - - キャンセル + + 茶色のウールを作るのに使う染料。クッキーの材料や、カカオの実を育てるのにも使われる - - 参加をキャンセル + + 銀のウールを作るのに使う染料 - - オンライン ゲーム リストを更新 + + 黄色のウールを作るのに使う染料 - - パーティー ゲーム + + 矢を射る攻撃ができる - - すべてのゲーム + + 装備するとアーマーポイント +5 - - グループを切り替え + + 装備するとアーマーポイント +3 - - 持ち物を見る + + 装備するとアーマーポイント +1 - - 説明を見る + + 装備するとアーマーポイント +5 - - 材料を見る + + 装備するとアーマーポイント +2 - - 工作 + + 装備するとアーマーポイント +2 - - 作る + + 装備するとアーマーポイント +3 - - 取る/置く + + 光沢を放つ延べ棒。道具を作る材料として使う。かまどで鉱石を精錬して作る - - 取る + + 延べ棒、宝石、染料などを、世界に置くことができるブロックに変えられる。高級な建築用ブロックや、鉱石の保管用として使うことができる - - すべて取る + + プレイヤーや動物、モンスターなどが上を通ると電気を送り出す。木の重量感知板は、物を上に置くことでも作動する - - 半分取る + + 装備するとアーマーポイント +8 - - 置く + + 装備するとアーマーポイント +6 - - すべて置く + + 装備するとアーマーポイント +3 - - 1 つ置く + + 装備するとアーマーポイント +6 - - 落とす + + 鉄のドアを開くには、レッドストーンや、ボタン、スイッチを使う必要がある - - すべて落とす + + 装備するとアーマーポイント +1 - - 1 つ落とす + + 装備するとアーマーポイント +3 + + + 木でできているブロックを切り出すのに使う。手で切り出すより速い - - 入れ替え + + 土や草のブロックを耕して作物を育てられるようにする - - クイック移動 + + 木のドアは、使用したり、叩いたり、レッドストーンを使うことで開く - - クイック選択バーを空にする + + 装備するとアーマーポイント +2 - - これは何? + + 装備するとアーマーポイント +4 - - Facebook に公開 + + 装備するとアーマーポイント +1 - - フィルターを変更 + + 装備するとアーマーポイント +2 - - フレンド登録の依頼を送る + + 装備するとアーマーポイント +1 - - 次へ + + 装備するとアーマーポイント +2 - - 前へ + + 装備するとアーマーポイント +5 - - 次へ + + 小さな階段を作るのに使う - - 前へ + + きのこシチューを入れるのに使う。シチューを食べてしまっても、おわんは残る - - プレイヤーを追放 + + 水や溶岩、ミルクを貯めて移動するのに使う - - 染める + + 水を入れて運ぶのに使う - - 掘る + + 自分や他のプレイヤーの入力したテキストを表示できる - - えさを与える + + たいまつよりも明るい光で照らすことができる。雪や氷を溶かしたり、水中でも使える - - 手なずける + + 爆発を起こすのに使う。置いてから火打ち石と打ち金を使ったり、電気を通すことで起爆する - - 回復する + + 溶岩を入れて運ぶのに使う - - おすわり + + 太陽と月の位置を表示する - - ついてこい + + 自分のスタート地点を示す - - 取り出す + + 手に持っていると、探索済みのエリアの地図を表示する。道を確認するのに使う - - 空にする + + ミルクを入れて運ぶのに使う - - 鞍を置く + + 火を起こしたり、TNT を起爆したり、建築済みのポータルを開くのに使う - - 置く + + 魚を獲るのに使う - - 叩く + + 使用したり、叩いたり、レッドストーンで開く。普通のドアとして機能するが、ブロック 1 個分であり、平らな床面として置ける - - 乳搾り + + 建築用素材。様々な物の材料になる。どんな形の木からでも切り出せる - - 集める + + 建築用素材。通常の砂のように重力の影響を受けない - - 食べる + + 建築用素材 - - 眠る + + 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる - - 起きる + + 長い階段を作るのに使う。2 枚の厚板を積み重ねることで、通常ブロックと同じサイズの 2 枚厚板ブロックを作ることができる - - 聞く + + 明かりを照らすのに使う。たいまつは、雪や氷も溶かすことができる - - 乗る + + たいまつ、矢、看板、はしご、柵の材料や、道具や武器の握り部分として使う - - 船に乗る + + 中にブロックやアイテムを保管できる。2 つのチェストを横に並べることで、2 倍の容量のチェスト (大) ができる - - 育てる + + 「障害物」として機能し、ジャンプで飛び越えることができない。プレイヤーや動物、モンスターに対しては、高さ 1.5 ブロックとして機能し、他のブロックに対しては高さ 1 ブロックとして機能する - - 泳ぐ + + 垂直方向に登るのに使う - - 開く + + ゲーム内の全てのプレイヤーがベッドで寝ている時に使うと、夜から朝へ時間を早回しすることができる。そして、使用したプレイヤーの復活地点が変わる。 +ベッドの色は使われたウールの色に関係なく、常に同じ - - 音程を変える + + 通常の工作よりも、さらに多くの種類のアイテムを作ることができる - - 起爆する + + 鉱石を精錬して木炭やガラスを作ったり、魚や豚肉を調理することができる - - 読む + + 鉄の斧 - - 掛ける + + レッドストーン ランプ - - 投げる + + ジャングルの木の階段 - - 植える + + 樺の階段 - - 耕す + + 現在の操作方法 - - 収穫する + + スカル - - 続ける + + ココア - - 完全版を購入 + + トウヒの階段 - - セーブデータを削除 + + ドラゴンの卵 - - 削除 + + 果ての石 - - オプション + + 果てのポータルの枠 - - フレンドを招待 + + 砂岩の階段 - - 決定 + + シダ - - 毛を刈る + + 低木 - - アクセスを禁止 + + レイアウト - - スキンを決定 + + 工作 - - 火をつける + + 使う - - 選択 + + アクション - - 完全版をインストール + + しのび足/下降 (飛行時) - - お試し版をインストール + + しのび足 - - インストール + + 落とす - - 再インストール + + 手持ちアイテムの切り替え - - セーブのオプション + + 止まる - - コマンドを実行 + + 見る - - クリエイティブ + + 動く/ダッシュ - - 材料を移動 + + 持ち物 + + + ジャンプ/上昇 (飛行時) - - 燃料を移動 + + ジャンプ - - 道具を移動 + + 果てのポータル - - 防具を移動 + + カボチャの茎 - - 武器を移動 + + スイカ - - 装備 + + ガラス板 - - 引く + + フェンスゲート - - 放つ + + つた - - 特権 + + スイカの茎 - - ブロック + + 鉄格子 - - 上へ + + ひび割れた石レンガ - - 下へ + + 苔の生えた石レンガ - - 求愛モード + + 石レンガ - - 飲む + + きのこ - - 回転する + + きのこ - - 隠す + + 模様入り石レンガ - - すべての枠を空にする + + レンガ階段 - - OK + + 暗黒茸 - - キャンセル + + 暗黒レンガ階段 - - Minecraft ストア + + 暗黒レンガの柵 - - 本当に現在プレイしているゲームを終了して、新しいゲームに参加してもよろしいですか? セーブしていない途中経過は失われてしまいます + + 大釜 - - ゲームを終了 + + 調合台 - - ゲームをセーブ + + エンチャントテーブル - - セーブせずに終了 + + 暗黒レンガ - - 以前のこの世界のセーブ データを、現在のデータで上書きしてもよろしいですか? + + シルバーフィッシュの丸石 - - 本当にセーブせずメイン メニューに戻ってもよろしいですか? この世界での途中経過は失われてしまいます + + シルバーフィッシュの石 - - ゲームを始める + + 石レンガ階段 - - セーブ データの破損 + + スイレンの葉 - - このセーブ データは破損しています。削除しますか? + + 菌糸 - - 現在のゲームを終了し、すべてのプレイヤーとの接続を切断してメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます + + シルバーフィッシュの石レンガ - - セーブして終了 + + カメラ モードの変更 - - セーブせずに終了 + + HP が減っても空腹ゲージの {*ICON_SHANK_01*} が 9 個以上ある状態では、HP が自然に回復します。 食べ物を食べると空腹ゲージは回復します - - 本当にメイン メニューに戻ってもよろしいですか? セーブしていない途中経過は失われてしまいます + + 移動、採掘、攻撃などの行動で空腹ゲージ {*ICON_SHANK_01*} が減っていきます。ダッシュやダッシュ ジャンプは普通に歩いたりジャンプしたりするよりもゲージが減ります - - 本当にメイン メニューに戻ってもよろしいですか? ここまでの途中経過は失われてしまいます + + アイテムを集めたり、作ったりすることで持ち物は増えます。{*B*} + {*CONTROLLER_ACTION_INVENTORY*} で持ち物を開きましょう - - 新しい世界 + + 集めた木は、木の板の材料になります。工作画面を開いて、工作を始めましょう{*PlanksIcon*} - - チュートリアルをプレイ + + 空腹ゲージが低いため HP が減り始めました。持ち物に入っているステーキを食べて空腹ゲージを回復させれば、HP が回復し始めます。{*ICON*}364{*/ICON*} - - チュートリアル + + 食べ物アイテムを持っているときに {*CONTROLLER_ACTION_USE*} を押し続けると、アイテムを食べて空腹ゲージが回復します。ゲージが満タンのときは食べられません - - 新しい世界に名前をつける + + {*CONTROLLER_ACTION_CRAFTING*} で工作画面を開きましょう - - 新しい世界の名前を入力してください + + ダッシュするには {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回押します。{*CONTROLLER_ACTION_MOVE*} を前方向に押し続ける間ダッシュできます。ただし一定時間が過ぎるか食べ物が尽きるとそこでやめてしまいます。 - - 世界生成のシードを入力してください + + {*CONTROLLER_ACTION_MOVE*} で動き回れます - - セーブした世界をロードする + + {*CONTROLLER_ACTION_LOOK*} で周囲を見回せます - - START を押してゲームに参加 + + {*CONTROLLER_ACTION_ACTION*} を押し続けて木 (木の幹) を 4 ブロック切ってみましょう。{*B*}ブロックを壊すと、アイテムが浮かんだ状態で現れます。アイテムの近くに立つと、アイテムを集められます。集めたアイテムは、持ち物に追加されます - - ゲームを終了 + + 手や、手に持っているアイテムを使って、掘ったり切ったりするには、{*CONTROLLER_ACTION_ACTION*} を押し続けます。道具を作らないと、掘れないブロックもあります - - エラーが起こりました。メイン メニューに戻ります + + {*CONTROLLER_ACTION_JUMP*} でジャンプ - - 接続に失敗しました + + 工作にはいくつもの工程があります。木の板が手に入ったので、これで、いろいろ作ることができます。まずは作業台を作ってみましょう{*CraftingTableIcon*} - - 接続が切断されました + + 夜はすぐに訪れます。何の準備もなしに外にいるのは危険です。武器や防具を作ることもできますが、まずは安全な場所を作ることが賢明です - - サーバーとの接続が切断されました。メイン メニューに戻ります + + 入れ物を開く - - サーバーにより切断されました + + ツルハシを使えば、石や鉱石のような堅いブロックを早く掘り出せます。より多くの材料を手に入れることで、さらに堅い材料を掘ることのできる、より丈夫で効率の良い道具を作ることができます。木のツルハシを作ってみましょう{*WoodenPickaxeIcon*} - - ゲームから追放されました + + ツルハシを使って、石のブロックを掘り出してみましょう。石のブロックを掘り出していると、丸石も出てきます。丸石を 8 つ集めると、かまどを作ることができます。石のある場所にたどり着くには、土を掘っていく必要があるので、シャベルを使いましょう{*StoneIcon*} - - 空を飛んだため、ゲームから追放されました + + 小屋を修復するための材料を集めましょう。壁や屋根はどのブロックでも作れますが、ドアや窓、明かりも作りたいところです - - 接続に時間がかかりすぎています + + 近くに、昔は鉱山の働き手が住んでいた小屋があります。それを修復すれば夜でも安全です - - サーバーが満員です + + 斧を使えば、木や木のブロックを手早く切り出せます。より多くの材料を手に入れることで、より丈夫で効率の良い道具を作ることができます。木の斧を作ってみましょう{*WoodenHatchetIcon*} - - ホストがゲームを終了しました + + アイテムを使用したり、置いたり、オブジェクトにアクションを取ったりするには {*CONTROLLER_ACTION_USE*} を使います。置いたアイテムは、適切な道具を使用して拾うことができます - - この世界でプレイ中のフレンドがいないため、この世界には入れません + + 手に持っているアイテムを変更するには {*CONTROLLER_ACTION_LEFT_SCROLL*} と {*CONTROLLER_ACTION_RIGHT_SCROLL*} を使います - - 以前にホストにより追放されているため、この世界には入れません + + 作業に合った道具を使うことで、ブロックをより効率よく集めることができます。道具には棒の持ち手が必要な物があるので、棒を作りましょう{*SticksIcon*} - - 相手のプレイヤーのゲームのバージョンが古いため、ゲームに参加できません + + シャベルを使えば、土や雪のような柔らかいブロックを手早く掘れます。より多くの材料を手に入れることで、より丈夫で効率の良い道具を作ることができます。木のシャベルを作ってみましょう{*WoodenShovelIcon*} - - 相手のプレイヤーのゲームのバージョンが新しいため、ゲームに参加できません + + 作業台にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押して、作業台を開きましょう - - 新しい世界 + + 作業台を置きましょう。作業台を選択して、置きたい場所にポインターを合わせてから {*CONTROLLER_ACTION_USE*} を押します - - アワードをアンロックしました! + + Minecraft は自由な発想でブロックを積み上げて、いろいろな物を作るゲームです。 +夜になるとモンスターが現れるので、その前に必ず安全な場所を作っておかなければなりません - - おめでとうございます! Minecraft の Steve のゲーマー アイコンを獲得しました! + + - - おめでとうございます! クリーパーのゲーマー アイコンを獲得しました! + + - - 完全版を購入 + + - - 今はお試し版をプレイ中です。データをセーブするためには完全版を購入いただく必要があります -今すぐ完全版を購入しますか? + + - - お待ちください + + - - 結果なし + + - - フィルター: + + - - フレンド + + レイアウト 1 - - マイスコア + + 移動 (飛行時) - - 通算 + + プレイヤー/招待 - - 登録数: + + - - ランク + + レイアウト 3 - - セーブレベル + + レイアウト 2 - - 詳細を設定中... + + - - 最終処理中... + + - - 地形を構築中 + + - - 世界のシミュレート中 + + - - サーバーを初期化中 + + {*B*}チュートリアルを始める: {*CONTROLLER_VK_A*}{*B*} + チュートリアルを飛ばす: {*CONTROLLER_VK_B*} - - 復活地点を作成中 + + {*B*}続けるには {*CONTROLLER_VK_A*} を押してください - - 復活地点を読み込み中 + + - - 暗黒界に入る + + - - 暗黒界を出る + + - - 復活中 + + - - レベルを生成中 + + - - レベルを読み込み中 + + - - プレイヤーをセーブ中 + + - - ホストサーバーに接続中 + + - - 地形をダウンロード中 + + シルバーフィッシュ ブロック - - オフライン ゲームに切り替える + + 石の厚板 - - ホストがゲームをセーブしています。しばらくお待ちください + + 鉄を省スペースに保管できる - - 果ての世界に入る + + 鉄のブロック - - 果ての世界を出る + + 樫の厚板 - - このベッドは使用中です + + 砂岩の厚板 - - 夜の間しか眠ることはできません + + 石の厚板 - - %s は寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります + + 金を省スペースに保管できる - - 最後に使用したベッドがなくなっているか、アクセスできません + + - - モンスターが近くにいる時に休むのは危険です + + 白のウール - - あなたは寝ています。朝まで時間をスキップするには、すべてのプレイヤーが寝ている必要があります + + オレンジのウール - - 道具と武器 + + 金のブロック - - 武器 + + きのこ - - 食べ物 + + バラ - - 建物 + + 丸石の厚板 - - 防具 + + 本棚 - - 機械 + + TNT 火薬 - - 乗り物 + + レンガ - - 飾り + + たいまつ - - 建設用ブロック + + 黒曜石 - - レッドストーンと乗り物 + + コケ石 - - その他 + + 暗黒レンガの厚板 - - 調合 + + 樫の厚板 - - 道具、武器、防具 + + 石レンガの厚板 - - 材料 + + レンガの厚板 - - サインアウト + + ジャングルの木の厚板 - - 難易度 + + 樺の厚板 - - BGM + + トウヒの厚板 - - 効果音 + + 赤紫のウール - - ガンマ + + 樺の葉 - - ゲームでの感度 + + トウヒの葉 - - メニューでの感度 + + 樫の葉 - - ピース + + ガラス - - イージー + + スポンジ - - ノーマル + + ジャングルの木の葉 - - ハード + + 葉っぱ - - プレイヤーの HP は自動で回復し、敵もいません + + - - 敵は出現しますが、ノーマル モードほど攻撃力が高くありません + + トウヒ - - 敵が出現し、その攻撃力は普通です + + - - 敵が出現し、その攻撃力がアップします。また、一瞬近づいただけでもクリーパーが爆発するようになるので注意しましょう + + トウヒの木 - - お試し版タイムアウト + + 樺の木 - - 完全版 + + ジャングルの木 - - 既に満員のため、ゲームに参加できませんでした + + ウール - - 看板の文字を入力 + + ピンクのウール - - 看板の文字を入力してください + + 灰色のウール - - タイトルを入力 + + 薄灰色のウール - - 投稿のタイトルを入力してください + + 空色のウール - - キャプションを入力 + + 黄色のウール - - 投稿のキャプションを入力してください + + 黄緑のウール - - 説明を入力 + + 水色のウール - - 投稿の説明を入力してください + + 緑のウール - - 持ち物 + + 赤のウール - - 材料 + + 黒のウール - - 調合台 + + 紫のウール - - チェスト + + 青のウール - - エンチャント + + 茶色のウール - - かまど + + たいまつ (石炭) - - 材料 + + 光石 - - 燃料 + + ソウルサンド - - 分配装置 + + 暗黒石 - - 現在、このタイプのダウンロードできるコンテンツはありません + + ラピスラズリのブロック - - %s が世界にやってきました + + ラピスラズリ鉱石 - - %s が世界を去りました + + ポータル - - %s が追放されました + + カボチャ ランタン - - 本当にこのセーブデータを削除してもよろしいですか? + + サトウキビ - - 承認待ち + + 粘土 - - 検閲済み + + サボテン - - プレイ中: + + カボチャ - - 設定を元に戻す + + - - 本当に設定を最初の状態に戻してもよろしいですか? + + ジュークボックス - - ロード エラー + + ラピスラズリを省スペースに保管できる - - %s のゲーム + + トラップドア - - ななしのホストのゲーム + + 鍵つきチェスト - - ゲストがサインアウトしました + + ダイオード - - ゲスト プレイヤーの 1 人がサインアウトしたため、すべてのゲスト プレイヤーがゲームから取り除かれました + + 吸着ピストン - - サインイン + + ピストン - - サインインしていません。このゲームをプレイするにはサインインが必要です。今すぐサインインしますか? + + ウール (すべての色) - - マルチプレイが制限されています + + 枯れた茂み - - ゲームを作成できません + + ケーキ - - 自動選択されました + + 音ブロック - - デフォルト スキン + + 分配装置 - - お気に入りのスキン + + 背の高い草 - - アクセスが禁止されています + + クモの巣 - - アクセス禁止リストに登録されている世界に参加しようとしています。 -このまま参加すると、この世界はアクセス禁止リストから外されます + + ベッド - - アクセス禁止にしますか? + + - - この世界をアクセス禁止リストに登録しますか? -OK を選択すると、この世界でのプレイを終了します + + 作業台 - - アクセス禁止を解除 + + ダイヤモンドを省スペースに保管できる - - オートセーブの間隔 + + ダイヤモンドのブロック - - オートセーブの間隔: オフ + + かまど - - + + 農地 - - ここには置けません + + 作物 - - 復活したプレイヤーにダメージを与える可能性があるため、復活地点の近くに溶岩を置くことはできません + + ダイヤモンド鉱石 - - インターフェースの不透明度 + + モンスター発生器 - - オートセーブを実行します + + - - 画面表示サイズ + + たいまつ (木炭) - - 画面表示サイズ (画面分割) + + レッドストーンの粉 - - シード + + チェスト - - スキン パックのロック解除 + + 樫の階段 - - 選択したスキンを使用するには、スキン パックをロック解除してください。 -今すぐスキン パックをロック解除しますか? + + 看板 - - テクスチャ パックのロック解除 + + レッドストーン鉱石 - - このテクスチャ パックを世界で使用するには、これをロック解除してください。 -今すぐテクスチャ パックをロック解除しますか? + + 鉄のドア - - テクスチャ パック試用版 + + 重量感知板 - - 現在お使いのテクスチャ パックは試用版です。完全版を利用しない場合、この世界はセーブできません。 -テクスチャ パックの完全版を購入しますか? + + - - テクスチャ パックを持っていません + + ボタン - - 完全版を購入 + + レッドストーンのたいまつ - - 試用版をダウンロード + + レバー - - 完全版をダウンロード + + レール - - この世界は、持っていないテクスチャ パック、またはマッシュアップ パックが使用されています。 -今すぐこのテクスチャ パック、またはマッシュアップ パックをインストールしますか? + + はしご - - 試用版を購入 + + 木のドア + + + 石の階段 - - 完全版を購入 + + 感知レール - - プレイヤーを追放 + + 加速レール - - このプレイヤーをゲームから追放しますか? 追放されたプレイヤーは、この世界を再スタートするまで世界に入れなくなります + + かまどを作るのに必要な数の丸石が集まりました。作業台を使って、かまどを作りましょう - - ゲーマー アイコン パック + + 釣り竿 - - テーマ + + 時計 - - スキン パック + + 光石の粉 - - フレンドのフレンドを許可 + + かまどつきトロッコ - - この世界への参加は、ホスト プレイヤーのフレンドのみに制限されています + + タマゴ - - 世界に入れません + + コンパス - - 選択中 + + 生魚 - - 選択したスキン: + + ローズ レッド - - 破損したダウンロード コンテンツ + + サボテン グリーン - - このダウンロード コンテンツは破損しているため使用できません。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください + + ココア ビーンズ - - 破損して使用できないダウンロード コンテンツがあります。破損しているコンテンツを削除し、[Minecraft ストア] から再インストールしてください + + 調理した魚 - - ゲームモードを変更しました + + 染色粉 - - 世界の名前を変更する + + 墨袋 - - 世界の新しい名前を入力してください + + チェストつきトロッコ - - ゲームモード: サバイバル + + 雪玉 - - ゲームモード: クリエイティブ + + ボート - - サバイバル + + - - クリエイティブ + + トロッコ - - サバイバル モードで作成 + + - - クリエイティブ モードで作成 + + レッドストーン - - 雲を表示する + + ミルク バケツ - - このセーブデータに対する操作を選んでください + + - - セーブデータの名前を変更する + + - - %d 秒後にオートセーブを開始します... + + スライムボール - - オン + + レンガ - - オフ + + 粘土 - - ノーマル + + サトウキビ - - スーパーフラット + + ラピスラズリ - - 有効にすると、オンラインのゲームになります + + 地図 - - 有効にすると、招待されたプレイヤーしか参加できません + + 音楽ディスク: 13 - - 有効にすると、フレンド リストのフレンドのみゲームに参加できます + + 音楽ディスク: cat - - 有効にすると、プレイヤーが他のプレイヤーにダメージを与えられるようになります。(サバイバル モードのみ) + + ベッド - - 無効にすると、このゲームに参加したプレイヤーは許可をもらわないかぎり建設や採掘ができません + + レッドストーン反復装置 - - 有効にすると、火は近くの可燃性ブロックに燃え広がります + + クッキー - - 有効にすると、TNT 火薬を起爆すると爆発します + + 音楽ディスク: blocks - - 有効にすると暗黒界を再生成します。暗黒砦が存在しないセーブ データがある場合に便利です + + 音楽ディスク: mellohi - - 有効にすると、村や要塞などの建物が世界に生成されるようになります + + 音楽ディスク: stal - - 有効にすると、地上界および暗黒界に、まったく平らな世界を生成します + + 音楽ディスク: strad - - 有効にすると、プレイヤーの復活地点の近くに便利なアイテムの入ったチェストが出現します + + 音楽ディスク: chirp - - スキン パック + + 音楽ディスク: far - - テーマ + + 音楽ディスク: mall - - ゲーマーアイコン + + ケーキ - - アバター アイテム + + 灰色の染料 - - テクスチャ パック + + ピンクの染料 - - マッシュアップ パック + + 黄緑の染料 - - {*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*} - + + 溶岩バケツ - - 暗黒界をリセットする + + 金のブーツ - - 本当にこのセーブ データの暗黒界を最初の状態にリセットしてもよろしいですか? 暗黒界に建設したものはすべて失われます + + 鉄の延べ棒 - - 暗黒界をリセットする + + 金の延べ棒 - - 暗黒界をリセットしない + + 火打ち石と打ち金 - - 現在、ムーシュルームは毛刈りできません。豚、羊、牛、ネコの数が最大数に達しました。 + + 石炭 - - 現在、スポーン エッグを使用できません。 豚、羊、牛、ネコの数が最大数に達しました + + 木炭 - - 現在、スポーン エッグを使用できません。 ムーシュルームの数が最大数に達しました + + ダイヤモンド - - 現在、スポーン エッグを使用できません。 世界のオオカミの数が最大数に達しました + + リンゴ - - 現在、スポーン エッグを使用できません。 世界のニワトリの数が最大数に達しました + + - - 現在、スポーン エッグを使用できません。 世界のイカの数が最大数に達しました + + - - 現在、スポーン エッグを使用できません。 世界の敵の数が最大数に達しました + + 音楽ディスク: ward - - 現在、スポーン エッグを使用できません。 世界の村人の数が最大数に達しました + + 作るアイテムのグループを切り替えるには {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} を使います。建物のグループを選択しましょう{*StructuresIcon*} - - 世界の絵/額縁の数が最大数に達しました。 + + 作るアイテムのグループを切り替えるには {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} を使います。道具のグループを選択しましょう{*ToolsIcon*} - - 難易度「ピース」では敵を出現させることはできません。 + + これで 作業台が完成です! ゲームの世界に置いて、いろいろなアイテムを作れるようにしましょう。{*B*} + 工作画面から出るには {*CONTROLLER_VK_B*} を押します - - この動物は求愛モードにできません。豚、羊、牛、ネコの繁殖数が最大数に達しました + + 道具が完成しました。順調です。これで様々な材料をさらに効率よく集めることができます。{*B*} + 工作画面を閉じるには {*CONTROLLER_VK_B*} を押してください - - この動物は求愛モードにできません。オオカミの繁殖数が最大数に達しました + + 工作にはいくつもの工程があります。木の板が何枚か手元にあるので、さらにいろいろなアイテムを作れます。作るアイテムは {*CONTROLLER_MENU_NAVIGATE*} で変更できます。それでは作業台を選びましょう{*CraftingTableIcon*} - - この動物は求愛モードにできません。ニワトリの繁殖数が最大数に達しました + + 作るアイテムを変えるには {*CONTROLLER_MENU_NAVIGATE*} を使います。アイテムによっては、使う材料によって、できる物が変わります。それでは木のシャベルを選びましょう{*WoodenShovelIcon*} - - この動物は求愛モードにできません。ムーシュルームの繁殖数が最大数に達しました + + 集めた木を使って、木の板を作ることができます。作るには、木の板のアイコンを選んでから {*CONTROLLER_VK_A*} を押してください{*PlanksIcon*} - - 世界のボートの数が最大数に達しました + + 作業台を使うと、より多くの種類のアイテムを作れるようになります。作業台での工作も普通の工作と変わりません。ですが作業スペースが広い分、より多くの材料を組み合わせてアイテムを作ることができます - - 世界のモブ ヘッドの数が最大数に達しました + + 工作ウィンドウには、新しいアイテムを作るのに必要なアイテムが表示されます。{*CONTROLLER_VK_A*} を押すとアイテムが作られ、持ち物に追加されます - - 上下反転 + + {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で、上にあるグループのタブを切り替えて、作りたいアイテムのグループを選択し、{*CONTROLLER_MENU_NAVIGATE*} で作るアイテムを選択します - - 左利き + + 選択したアイテムを作るのに必要なアイテムのリストです - - ゲームオーバー! + + 選択しているアイテムの説明が表示されています。説明から、そのアイテムが何に使えるかが分かります - - 復活 + + 工作画面の右下には、持ち物が表示されます。さらに、選択しているアイテムの説明と、それを作るのに必要な材料も表示されます - - 利用可能ダウンロード コンテンツ + + 一部のアイテムは作業台ではなく、かまどで作ります。それではかまどを作りましょう{*FurnaceIcon*} - - スキンを変更 + + 砂利 - - 遊び方 + + 金鉱石 - - 操作方法 + + 鉄鉱石 - - 設定 + + 溶岩 - - クレジット + + - - コンテンツを再インストール + + 砂岩 - - デバッグ設定 + + 石炭の原石 - - 火の延焼 + + {*B*} + かまどの説明を続ける: {*CONTROLLER_VK_A*}{*B*} + かまどの説明を飛ばす: {*CONTROLLER_VK_B*} - - TNT の爆発 + + これがかまどの画面です。かまどを使ってアイテムに熱を加えることで、そのアイテムを加工できます。例えば、鉄鉱石を鉄の延べ棒に変えることができます - - PvP + + 完成したかまどをゲームの世界に置きましょう。小屋の中に置くとよいかもしれません。{*B*} + 工作画面を閉じるには {*CONTROLLER_VK_B*} を押してください - - 高度な操作を許可 + + - - ホスト特権 + + 樫の木 - - 建物を生成する + + かまどの下に燃料を入れ、上には加工したいアイテムを入れてください。するとかまどに火が入り、加工が始まります。完成したアイテムは右のスロットに入ります - - スーパーフラット + + {*B*} + 持ち物に戻るには {*CONTROLLER_VK_X*} を押します - - ボーナス チェスト + + {*B*} + 持ち物の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 持ち物の説明を飛ばす: {*CONTROLLER_VK_B*} - - 世界のオプション + + これがあなたの持ち物です。手で持って使用できるアイテムと、所有しているアイテムのリスト、現在装備している防具を確認できます - - 建設と採掘の許可 + + {*B*} + チュートリアルを続ける: {*CONTROLLER_VK_A*}{*B*} + チュートリアルを飛ばす: {*CONTROLLER_VK_B*} - - ドアとスイッチを使用可能 + + ポインターでアイテムを選択したまま、持ち物画面の外にポインターを動かすことで、アイテムを外に落とすことができます - - 入れ物を使用可能 + + ポインターで選んだアイテムを持ち物の別の場所に移動させるには、移動先で {*CONTROLLER_VK_A*} を押します。 + ポインターに複数のアイテムがある場合は、{*CONTROLLER_VK_A*} を押すと全部を移動、 {*CONTROLLER_VK_X*} を押すと 1 つだけ移動できます - - プレイヤーを攻撃可能 + + ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かして、アイテムに合わせてから {*CONTROLLER_VK_A*} を押すと、アイテムを選択できます。 + そのアイテムを複数所有している場合は、そのすべてが選択されます。半分だけ選択するには {*CONTROLLER_VK_X*} を使用します - - 動物を攻撃可能 + + チュートリアルの最初のパートが完了です! - - ホストオプション変更可能 + + かまどを使って、ガラスを作りましょう。出来上がりを待っている間に、小屋を修復するための材料をもっと集めてみましょう - - プレイヤーを追放 + + かまどを使って、木炭を作りましょう。出来上がりを待っている間に、小屋を修復するための材料をもっと集めてみましょう - - 飛行可能 + + {*CONTROLLER_ACTION_USE*} でかまどを置いて、開きましょう - - 疲労無効 + + 夜は外が真っ暗になります。小屋の中には明かりが欲しいところです。工作画面で、棒と木炭からたいまつを作りましょう{*TorchIcon*} - - 不可視 + + ドアを {*CONTROLLER_ACTION_USE*} で設置します。ドアは {*CONTROLLER_ACTION_USE*} で開け閉めできます - - ホスト オプション + + 小屋にドアをつけると、いちいち壁を掘ったり移動させたりせずに、簡単に出入りすることができます。木のドアを作ってみましょう{*WoodenDoorIcon*} - - プレイヤー/招待 + + アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_ACTION_MENU_PAGEDOWN*} を押してください - - オンライン ゲーム + + +これが工作画面です。この画面では、これまでに集めたアイテムを組み合わせて、新しいアイテムを作ることができます - - 招待者のみ + + クリエイティブ モード持ち物画面を閉じるには {*CONTROLLER_VK_B*} を押します - - その他のオプション + + アイテムの説明を見たい時は、ポインターをアイテムの上に動かしてから {*CONTROLLER_ACTION_MENU_PAGEDOWN*} を押します - - ロード + + {*B*} + このアイテムを作るのに必要なアイテムのリストを見るには {*CONTROLLER_VK_X*} を押します - - 新しい世界 + + {*B*} + アイテムの説明を見るには {*CONTROLLER_VK_X*} を押します - - 世界の名前 + + {*B*} + 工作の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + 工作の説明を飛ばす: {*CONTROLLER_VK_B*} - - 世界生成のシード + + {*CONTROLLER_VK_LB*} と {*CONTROLLER_VK_RB*} で、上にあるグループのタブを切り替えて、使うアイテムのグループを選択します + + - - 空白にすると、ランダムにシードを決めます + + {*B*} + 持ち物の説明を続ける: {*CONTROLLER_VK_A*}{*B*} + クリエイティブ モードの持ち物の説明を飛ばす: {*CONTROLLER_VK_B*} - - プレイヤー + + これがクリエイティブ モードの持ち物です。手で持って使用できるアイテムと、所有しているアイテムのリストを確認できます - - ゲームに参加 + + 持ち物画面を閉じるには {*CONTROLLER_VK_B*} を押します - - ゲームを始める + + ポインターでアイテムを選択したまま、持ち物画面の外へポインターを動かすと、そのアイテムをゲームの世界に落とすことができます。クイック選択バーを一度に空にするには{*CONTROLLER_VK_X*}を押してください。 - - ゲームが見つかりません + + +ポインターは自動的に使用欄へ移動します。{*CONTROLLER_VK_A*} でそこに選択アイテムを置きます。アイテムを置くとポインターはアイテム一覧に戻るので、そこから他のアイテムを選ぶこともできます - - プレイする + + ポインターを {*CONTROLLER_MENU_NAVIGATE*} で動かし、リストのアイテムに合わせてから {*CONTROLLER_VK_A*} を押すと、アイテムを選択できます。 +{*CONTROLLER_VK_Y*} を押すと、そのアイテムがすべて選択されます - - ランキング + + - - ヘルプとオプション + + ガラスビン - - 完全版を購入 + + 水のビン - - ゲームに戻る + + クモの目 - - セーブ + + 金の塊 - - 難易度: + + 暗黒茸 - - ゲームタイプ: + + {*prefix*}{*postfix*}ポーション{*splash*} - - 建物: + + 発酵したクモの目 - - レベルタイプ: + + 大釜 - - PvP: + + エンダーアイ - - 高度な操作を許可: + + 輝くスイカ - - TNT 火薬: + + ブレイズの粉 - - 火の延焼: + + マグマクリーム - - テーマを再インストール + + 調合台 - - ゲーマー アイコン 1 を再インストール + + ガストの涙 - - ゲーマー アイコン 2 を再インストール + + カボチャの種 - - アバター アイテム 1 を再インストール + + スイカの種 - - アバター アイテム 2 を再インストール + + 鶏肉 - - アバター アイテム 3 を再インストール + + 音楽ディスク: 11 - - オプション + + 音楽ディスク: where are we now - - オーディオ + + ハサミ - - コントロール + + 焼き鳥 - - グラフィック + + エンダーパール - - ユーザー インターフェイス + + 切ったスイカ - - デフォルトにリセット + + ブレイズ ロッド - - 画面の揺れ + + 牛肉 - - ヒント + + ステーキ - - プレイ中のボタンガイド + + 腐肉 - - 2 プレイヤー左右分割画面 + + エンチャントのビン - - 完了 + + 樫の板 - - 看板のメッセージを編集: + + トウヒの板 - - スクリーンショットの説明を入力してください + + 樺の板 - - キャプション + + 草ブロック - - ゲームのスクリーンショット + + - - 看板のメッセージを編集: + + 丸石 - - Minecraft 正統派のテクスチャ、アイコン、ユーザー インターフェイス! + + ジャングルの木の板 - - マッシュアップの世界をすべて表示 + + 樺の苗木 - - 効果なし + + ジャングルの木の苗木 - - スピード + + 岩盤 - - 鈍化 + + 苗木 - - 勤勉 + + 樫の苗木 - - 疲労 + + トウヒの苗木 - - + + - - 弱体化 + + 額縁 - - 回復 + + {*CREATURE*}出現 - - ダメージ + + 暗黒レンガ - - 跳躍 + + 発火剤 - - 目まい + + 発火剤 (木炭) - - 再生 + + 発火剤 (石炭) - - 耐性 + + スカル - - 耐火 + + ヘッド - - 水中呼吸 + + %sのヘッド - - 不可視 + + クリーパー ヘッド - - 盲目 + + ガイコツ スカル - - 暗視 + + ウィザー ガイコツ スカル - - 空腹 + + ゾンビ ヘッド + + + 石炭を省スペースに保管できる。かまどの燃料として使う - - スピードの + + 空腹 鈍化の - - 勤勉の + + スピードの - - 疲労の + + 不可視 - - 力の + + 水中呼吸 - - 弱体化の + + 暗視 - - 回復の + + 盲目 ダメージの - - 跳躍の + + 回復の 目まいの @@ -5001,29 +5824,38 @@ OK を選択すると、この世界でのプレイを終了します 再生の - - 耐性の + + 疲労の - - 耐火の + + 勤勉の - - 水中呼吸の + + 弱体化の - - 不可視の + + 力の - - 盲目の + + 耐火 - - 暗視の + + 飽和 - - 空腹の + + 耐性の - - 毒の + + 跳躍の + + + ウィザー + + + HP ブースト + + + 吸収 @@ -5034,29 +5866,41 @@ OK を選択すると、この世界でのプレイを終了します III + + 不可視の + IV - - (スプラッシュ) + + 水中呼吸の - - 陳腐な + + 耐火の - - 退屈な + + 暗視の - - 無個性な + + 毒の - - クリアな + + 空腹の - - ミルキーな + + 吸収の - - 拡散した + + 飽和の + + + HP ブーストの + + + 盲目の + + + 腐敗の 素朴な @@ -5064,17 +5908,17 @@ OK を選択すると、この世界でのプレイを終了します 薄い - - 不完全な + + 拡散した - - 気の抜けた + + クリアな - - かさばる + + ミルキーな - - 無様な + + 不完全な バター風味の @@ -5082,164 +5926,188 @@ OK を選択すると、この世界でのプレイを終了します なめらかな - - 上品な + + 無様な - - 小粋な + + 気の抜けた - - 濃厚な + + かさばる - - エレガントな + + 無個性な - - ファンシーな + + (スプラッシュ) - - チャーミングな + + 陳腐な + + + 退屈な 粋な - - 洗練された - 真心の + + チャーミングな + + + エレガントな + + + ファンシーな + きらめく + + 悪臭の + + + 刺激のある + + + 無臭の + 強力な よどんだ - - 無臭の + + 上品な - - 悪臭の + + 洗練された - - 刺激のある + + 濃厚な - - えぐい + + 小粋な - - キモい + + プレイヤー、動物、モンスターの HP を時間とともに回復させます - - 臭い + + プレイヤー、動物、モンスターの HP を瞬時に減少させます - - すべてのポーションの基礎に使用します。調合台で使用すると、ポーションができます。 + + プレイヤー、動物、モンスターが、火、溶岩、ブレイズの攻撃からダメージを受けなくなります 単体では効果がありませんが、調合台で使用することができ、材料を追加するとポーションができます。 - - プレイヤー、動物、モンスターの移動スピードを上昇させ、プレイヤーの走るスピード、ジャンプ距離、視界を向上させます + + えぐい プレイヤー、動物、モンスターの移動スピードを低下させ、プレイヤーの走るスピード、ジャンプ距離、視界を低下させます + + プレイヤー、動物、モンスターの移動スピードを上昇させ、プレイヤーの走るスピード、ジャンプ距離、視界を向上させます + プレイヤーやモンスターの攻撃ダメージを上昇させます - - プレイヤーやモンスターの攻撃ダメージを低下させます - プレイヤー、動物、モンスターの HP を瞬時に回復させます - - プレイヤー、動物、モンスターの HP を瞬時に減少させます + + プレイヤーやモンスターの攻撃ダメージを低下させます - - プレイヤー、動物、モンスターの HP を時間とともに回復させます + + すべてのポーションの基礎に使用します。調合台で使用すると、ポーションができます。 - - プレイヤー、動物、モンスターが、火、溶岩、ブレイズの攻撃からダメージを受けなくなります + + キモい - - プレイヤー、動物、モンスターの HP を時間とともに減少させます + + 臭い + + + 聖なる力 鋭さ - - 聖なる力 + + プレイヤー、動物、モンスターの HP を時間とともに減少させます - - 虫殺し + + 攻撃ダメージ ノックバック - - 火属性 + + 虫殺し - - 防護 + + スピード - - 防火 + + ゾンビ補強 - - 落下軽減 + + 馬の跳躍力 - - 爆発耐性 + + 効果: - - 間接攻撃耐性 + + ノックバック耐性 - - 水中呼吸 + + モブ追跡範囲 - - 水中作業 + + HP 最大 + + + 技能 効率 - - 技能 + + 水中作業 - - 耐久力 + + 幸運 アイテムボーナス - - 幸運 + + 耐久力 - - パワー + + 防火 - - 火炎 + + 防護 - - 衝撃 + + 火属性 - - 無限 + + 落下軽減 - - I + + 水中呼吸 - - II + + 間接攻撃耐性 - - III + + 爆発耐性 IV @@ -5250,23 +6118,29 @@ OK を選択すると、この世界でのプレイを終了します VI + + 衝撃 + VII - - VIII + + III - - IX + + 火炎 - - X + + パワー - - 鉄のツルハシ以上で掘れる。エメラルドが採れる + + 無限 - - チェストのようなもの。ただし中に入れたアイテムは、別の次元にあるものも含めて、そのプレイヤーのすべてのエンダーチェストで使うことができる + + II + + + I 何かがトリップワイヤーに引っかかると作動する @@ -5277,44 +6151,59 @@ OK を選択すると、この世界でのプレイを終了します エメラルドを省スペースに保管できる - - 丸石でできた壁 + + チェストのようなもの。ただし中に入れたアイテムは、別の次元にあるものも含めて、そのプレイヤーのすべてのエンダーチェストで使うことができる - - 武器、道具、防具を修理するのに使われる + + IX - - かまどで精錬すると暗黒石英になる + + VIII - - 装飾として使われる + + 鉄のツルハシ以上で掘れる。エメラルドが採れる - - 村人と取引できる + + X + + + 2{*ICON_SHANK_01*} 回復する。金のニンジンの材料になる。農地に植えられる 装飾として使われる。花、苗木、サボテン、きのこを植えられる - - 2{*ICON_SHANK_01*} 回復する。金のニンジンの材料になる。農地に植えられる + + 丸石でできた壁 0.5{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。農地に植えられる - - 3{*ICON_SHANK_01*} 回復する。かまどでじゃがいもを調理するとできる + + かまどで精錬すると暗黒石英になる + + + 武器、道具、防具を修理するのに使われる + + + 村人と取引できる + + + 装飾として使われる + + + 4{*ICON_SHANK_01*} 回復する 1{*ICON_SHANK_01*} 回復する。かまどで調理することも可能。農地に植えられる。食べると毒にあたる可能性がある - - 3{*ICON_SHANK_01*} 回復する。ニンジンと金の塊から作られる - 鞍をつけた豚に乗って、操縦するのに使われる - - 4{*ICON_SHANK_01*} 回復する + + 3{*ICON_SHANK_01*} 回復する。かまどでじゃがいもを調理するとできる + + + 3{*ICON_SHANK_01*} 回復する。ニンジンと金の塊から作られる 武器、道具、防具を金床でエンチャントするのに使われる @@ -5322,6 +6211,15 @@ OK を選択すると、この世界でのプレイを終了します 暗黒石英の鉱石を掘ると手に入る。石英ブロックの材料になる + + ジャガイモ + + + 焼いたジャガイモ + + + ニンジン + ウールから作る。装飾として使われる @@ -5331,14 +6229,11 @@ OK を選択すると、この世界でのプレイを終了します 植木鉢 - - ニンジン - - - ジャガイモ + + カボチャのパイ - - 焼いたジャガイモ + + エンチャントの本 毒ジャガイモ @@ -5349,11 +6244,11 @@ OK を選択すると、この世界でのプレイを終了します 串刺しのニンジン - - カボチャのパイ + + トリップワイヤーフック - - エンチャントの本 + + トリップワイヤー 暗黒石英 @@ -5364,11 +6259,8 @@ OK を選択すると、この世界でのプレイを終了します エンダーチェスト - - トリップワイヤーフック - - - トリップワイヤー + + 苔の生えた丸石の壁 エメラルドのブロック @@ -5376,8 +6268,8 @@ OK を選択すると、この世界でのプレイを終了します 丸石の壁 - - 苔の生えた丸石の壁 + + ジャガイモ 植木鉢 @@ -5385,8 +6277,8 @@ OK を選択すると、この世界でのプレイを終了します ニンジン - - ジャガイモ + + 少し損傷した金床 金床 @@ -5394,8 +6286,8 @@ OK を選択すると、この世界でのプレイを終了します 金床 - - 少し損傷した金床 + + 石英ブロック かなり損傷した金床 @@ -5403,8 +6295,8 @@ OK を選択すると、この世界でのプレイを終了します 暗黒石英の鉱石 - - 石英ブロック + + 石英の階段 模様入り石英ブロック @@ -5412,8 +6304,8 @@ OK を選択すると、この世界でのプレイを終了します 石英ブロックの柱 - - 石英の階段 + + 赤のじゅうたん じゅうたん @@ -5421,8 +6313,8 @@ OK を選択すると、この世界でのプレイを終了します 黒のじゅうたん - - 赤のじゅうたん + + 青のじゅうたん 緑のじゅうたん @@ -5430,9 +6322,6 @@ OK を選択すると、この世界でのプレイを終了します 茶色のじゅうたん - - 青のじゅうたん - 紫のじゅうたん @@ -5445,18 +6334,18 @@ OK を選択すると、この世界でのプレイを終了します 灰色のじゅうたん - - ピンクのじゅうたん - 黄緑のじゅうたん - - 黄色のじゅうたん + + ピンクのじゅうたん 空色のじゅうたん + + 黄色のじゅうたん + 赤紫のじゅうたん @@ -5469,164 +6358,164 @@ OK を選択すると、この世界でのプレイを終了します 模様入り砂岩 - - なめらかな砂岩 - {*PLAYER*} は {*SOURCE*} を襲おうとして倒された + + なめらかな砂岩 + {*PLAYER*} は落下した金床に押し潰された {*PLAYER*} は落下したブロックに押し潰された - - {*PLAYER*} を {*DESTINATION*} のところにテレポートした - {*PLAYER*} があなたを自分のところにテレポートした - - {*PLAYER*} があなたのところにテレポートした + + {*PLAYER*} を {*DESTINATION*} のところにテレポートした イバラ - - 石英の厚板 + + {*PLAYER*} があなたのところにテレポートした 暗い場所(水中を含む)を昼間のように明るくします + + 石英の厚板 + プレイヤー、動物、モンスターの姿を見えなくします 修理と命名 + + 高すぎます! + エンチャントの費用: %d - - 高すぎます! + + 手持ちのアイテム: 名前変更 - - 手持ちのアイテム: + + {*VILLAGER_TYPE*} が %s を提供 取引に必要なアイテム - - {*VILLAGER_TYPE*} が %s を提供 + + 取引する 修理する - - 取引する + + これが金床の画面です。経験値レベルと引き換えに、武器、防具、道具の名前変更、修理、エンチャントを実行できます 首輪を染める - - これが金床の画面です。経験値レベルと引き換えに、武器、防具、道具の名前変更、修理、エンチャントを実行できます + + 対象となるアイテムを一番左の枠に入れます {*B*} 金床画面の説明を続ける: {*CONTROLLER_VK_A*}{*B*} 金床画面の説明を飛ばす: {*CONTROLLER_VK_B*} - - 対象となるアイテムを一番左の枠に入れます - - - 2 番目の枠に適切な原料(例: 損傷した鉄の剣には鉄の延べ棒)を入れると、右の枠に結果が提示されます - また、2 番目の枠に同一のアイテムを入れて2 つを合体させることもできます - - 金床でアイテムをエンチャントするには、2 番目の枠にエンチャントの本を入れます + + 2 番目の枠に適切な原料(例: 損傷した鉄の剣には鉄の延べ棒)を入れると、右の枠に結果が提示されます 費用として消費される経験値レベルが、結果の下に表示されます。不足しているときは修理が完了しません - - テキストボックスに表示される名前を編集して、名前を変更できます + + 金床でアイテムをエンチャントするには、2 番目の枠にエンチャントの本を入れます 修理したアイテムを選択すると、金床で使用したアイテムが消費され、提示された分の経験値レベルが減ります - - このエリアには、金床と、修理に使う道具や武器の入ったチェストがあります + + テキストボックスに表示される名前を編集して、名前を変更できます {*B*} 金床の説明を続ける: {*CONTROLLER_VK_A*}{*B*} 金床の説明を飛ばす: {*CONTROLLER_VK_B*} - - 金床を使って、武器や道具の耐久性を回復させる修理をしたり、名前を変更したり、エンチャントの本でエンチャントすることができます + + このエリアには、金床と、修理に使う道具や武器の入ったチェストがあります エンチャントの本はダンジョンのチェストの中にあります。エンチャントテーブルで普通の本にエンチャントして作ることもできます - - 金床を使う際には、経験値レベルを支払います。金床は使うたびに損傷する可能性があります + + 金床を使って、武器や道具の耐久性を回復させる修理をしたり、名前を変更したり、エンチャントの本でエンチャントすることができます 修理の費用は、修理の種類、アイテムの価値、エンチャントの数、過去に修理した回数によって変わります - - アイテムの名前を変更すると、どのプレイヤーに対しても変更された名前が表示されるようになり、過去の修理によってかかる費用が取り除かれます + + 金床を使う際には、経験値レベルを支払います。金床は使うたびに損傷する可能性があります このエリアのチェストには、試しに利用できる損傷したツルハシ、原材料、エンチャントのビン、エンチャントの本が入っています - - これが取引の画面です。村人と行うことができる取引が表示されます + + アイテムの名前を変更すると、どのプレイヤーに対しても変更された名前が表示されるようになり、過去の修理によってかかる費用が取り除かれます {*B*} 取引画面の説明を続ける: {*CONTROLLER_VK_A*}{*B*} 取引画面の説明を飛ばす: {*CONTROLLER_VK_B*} - - その時点で村人が行う意志のある取引が、すべて上部に表示されます + + これが取引の画面です。村人と行うことができる取引が表示されます 必要なアイテムが不足している取引は、赤で表示され利用できません - - 村人に支払うアイテムの量と種類が、左側の 2 つの枠に表示されます + + その時点で村人が行う意志のある取引が、すべて上部に表示されます 取引に必要なアイテムの総量が、左側の 2 つの枠に表示されます - - {*CONTROLLER_VK_A*} を押して、村人が提示したアイテムと要求されたアイテムを交換します + + 村人に支払うアイテムの量と種類が、左側の 2 つの枠に表示されます このエリアには村人と、アイテムを購入するための紙が入ったチェストがあります + + {*CONTROLLER_VK_A*} を押して、村人が提示したアイテムと要求されたアイテムを交換します + + + プレイヤーは持ち物のアイテムを村人と取引できます + {*B*} 取引の説明を続ける: {*CONTROLLER_VK_A*}{*B*} 取引の説明を飛ばす: {*CONTROLLER_VK_B*} - - プレイヤーは持ち物のアイテムを村人と取引できます + + さまざまな取引を行うことで、村人の提示する取引がランダムに追加・変更されます 村人が提示する取引は、村人の職業によって異なります - - さまざまな取引を行うことで、村人の提示する取引がランダムに追加・変更されます - 頻繁に行った取引は一時的に停止されることがありますが、村人が提示する取引は常に 1 つ以上あります @@ -5760,7 +6649,4 @@ OK を選択すると、この世界でのプレイを終了します 治す - - 世界生成のシードを見つける - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsPlatformSpecific.xml index b0240eab..c8fc1d94 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ja-JP/stringsPlatformSpecific.xml @@ -1,243 +1,245 @@  - - NOT USED + + "PSN" にサインインしますか? - - PlayStation(R)Vita本体のタッチスクリーンでメニューを操作できます + + ホストプレイヤーと異なる"PlayStation Vita"本体を使用しているプレイヤーに対してこのオプションを選択すると、そのプレイヤーおよび対象プレイヤーと同じ"PlayStation Vita"本体を使用している他のプレイヤーがゲームから追放されます。追放されたプレイヤーは、ゲームが再起動されるまでは再び参加できません - - minecraftforum には、PlayStation(R)Vita Edition専用セクションがあります + + SELECT - - ゲームの最新情報は Twitter の @4JStudios と @Kappische でゲット! + + このオプションでは、プレイ中およびこのオプションを有効にしてセーブ後に再びロードした際に、この世界に対するトロフィーおよびランキング更新が無効になります。 - - エンダーマンの目を見てはいけません! + + "PlayStation Vita" - - 4J Studios の PlayStation(R)Vita 向け超ホラー大作「Herobrine」はまさかのキャンセル... というウワサ + + アドホックネットワークを選択して近くにある他の"PlayStation Vita"本体と通信するか、"PSN"を選択して世界中のフレンドとつながりましょう - - Minecraft: PlayStation(R)Vita Editionはさまざまな記録を更新しています! + + アドホックネットワーク - - {*T3*}遊び方: マルチプレイヤー{*ETW*}{*B*}{*B*} -PlayStation(R)Vita本体のMinecraftは、初期設定でマルチプレイヤー ゲームになっています。{*B*}{*B*} -あなたがオンラインゲームを開始または参加すると、フレンドリスト内のフレンドにそのことが通知されます (ホストとしてゲームを開始するときに [招待者のみ] を選択した場合を除きます)。フレンドが参加するとフレンドのフレンドリスト内のフレンドにも通知されます (オプションで [フレンドのフレンドを許可] を選択している場合)。{*B*} -ゲーム中にSELECTボタンを押すと、参加中のプレイヤーのリストを開いて、プレイヤーを追放できます + + ネットワークモードの変更 - - {*T3*}遊び方: スクリーンショットの公開{*ETW*}{*B*}{*B*} -ポーズ メニューで {*CONTROLLER_VK_Y*} を押してスクリーンショットを撮影し、Facebook で公開することができます。投稿の前に、撮影したスクリーンショットの縮小版が表示され、投稿に添えるメッセージを編集できます。{*B*}{*B*} -スクリーンショット撮影に適したカメラ モードも用意されています。キャラクターの正面からのショットを撮影して公開するには、{*CONTROLLER_ACTION_CAMERA*} を何度か押して正面からのカメラに切り替え、{*CONTROLLER_VK_Y*} を押します。{*B*}{*B*} -スクリーンショットにオンライン ID は表示されません + + ネットワークモードの選択 - - {*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*} で右に飛べます + + 分割画面でオンラインIDを表示 - - {*CONTROLLER_ACTION_JUMP*} をすばやく 2 回押すと飛行できます。飛行をやめるには、同じ操作をもう一度行います。より速く飛ぶには、飛行中に {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回倒します。 -飛行モードでは、{*CONTROLLER_ACTION_JUMP*} 長押しで上昇、{*CONTROLLER_ACTION_SNEAK*} 長押しで下降できます。または、方向キーで上下左右に飛びましょう + + トロフィー - - NOT USED + + このゲームではオートセーブ機能を利用できます。オートセーブの実行中は上のオートセーブ アイコンが表示されます。 +オートセーブ アイコンの表示中に"PlayStation Vita"本体の電源を切らないでください + - - NOT USED + + 有効にすると、ホストが飛行能力、疲労無効、不可視の設定をゲーム内メニューから切り替えられます。トロフィーおよびランキング更新は無効になります - - ゲーマー カードを見る + + オンラインID: - - ゲーマー プロフィールを見る + + 現在お使いのテクスチャ パックは試用版です。テクスチャ パックのコンテンツをすべて利用できますが、途中経過はセーブできません。 +試用版を使用中にセーブしようとすると、完全版を購入するか尋ねるメッセージが表示されます - - フレンドを招待 + + パッチ 1.04 (タイトル アップデート 14) - - クリエイティブ モードで作成、ロード、セーブした世界は、後でサバイバル モードでロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? + + ゲーム内でオンラインIDを表示 - - この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? + + Minecraft: "PlayStation Vita" Editionで作ったよ! - - この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。 + + ダウンロードできませんでした。後でもう一度お試しください - - ホスト特権を有効にして作成、ロード、セーブした世界は、後でオプションをオフにしてロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? + + NATタイプが制限されているためゲームに参加できませんでした。ネットワーク設定をご確認ください - - "PSN" との接続が切断されました。メイン メニューに戻ります + + アップロードできませんでした。後でもう一度お試しください - - "PSN" との接続が切断されました + + ダウンロード完了! - - これはMinecraft: PlayStation(R)Vita Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! -完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: PlayStation(R)Vita Editionの楽しさを体験してください。 -完全版を購入しますか? + + 現在、転送ストレージにセーブデータがありません。 +Minecraft: "PlayStation 3" Edition でセーブデータを転送ストレージにアップロードしたあと、Minecraft: "PlayStation Vita" Edition でダウンロードしてください。 - - これは Minecraft: PlayStation(R)Vita Editionのお試し版です。完全版であれば、今すぐ獲得できるテーマがあります! -完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: PlayStation(R)Vita Editionの楽しさを体験してください。 -完全版を購入しますか? + + セーブは完了していません - - これはMinecraft: PlayStation(R)Vita Editionのお試し版です。この招待を受けるには完全版が必要です。 -完全版を今すぐ購入しますか? + + Minecraft: "PlayStation Vita" Edition はデータを保存するための容量が足りません。容量を確保するには、ほかの Minecraft: "PlayStation Vita" Edition のセーブデータを削除してください。 + - - ゲスト プレイヤーでは完全版を購入することはできません。Sony Entertainment Network のアカウントでサインインしてください + + アップロードがキャンセルされました - - オンラインID + + 転送ストレージへのデータのアップロードをキャンセルしました - - 調合 + + PS3™/PS4™の本体のセーブデータをアップロード - - "PSN" からサインアウトしました。タイトル画面に戻ります + + データをアップロード中: %d%% - - Minecraft: PlayStation(R)Vita Edition のお試し版をプレイできる制限時間が過ぎてしまいました! 完全版を購入して、ゲームを続けますか? + + "PSN" - - Minecraft: PlayStation(R)Vita Editionのロードに失敗しました。続行できません + + PS3™セーブをダウンロード - - Sony Entertainment Network のチャット制限によりマルチプレイを制限されているプレイヤーがいます。ゲームに参加できません + + データをダウンロード中: %d%% - - Sony Entertainment Network のチャット制限により、オンラインプレイを制限されているプレイヤーがいます。オンライン ゲームは作成できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます + + 保存中 - - チャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているため、ゲームに参加できません + + アップロード完了! - - ローカル プレイヤーの中にチャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているプレイヤーがいるため、ゲームに参加できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます + + このセーブデータをアップロードして、セーブデータ転送先に保存されている現在のセーブデータを上書きしていいですか? + - - ローカル プレイヤーの中にチャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているプレイヤーがいるため、ゲームを作成できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます + + データを変換中 - - このゲームではオートセーブ機能を利用できます。オートセーブの実行中は上のオートセーブ アイコンが表示されます。 -オートセーブ アイコンの表示中にPlayStation(R)Vita本体の電源を切らないでください - + + NOT USED - - 有効にすると、ホストが飛行能力、疲労無効、不可視の設定をゲーム内メニューから切り替えられます。トロフィーおよびランキング更新は無効になります + + NOT USED - - 分割画面でオンラインIDを表示 + + {*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*} で右に飛べます - - トロフィー + + {*CONTROLLER_ACTION_JUMP*} をすばやく 2 回押すと飛行できます。飛行をやめるには、同じ操作をもう一度行います。より速く飛ぶには、飛行中に {*CONTROLLER_ACTION_MOVE*} を前方向にすばやく 2 回倒します。 +飛行モードでは、{*CONTROLLER_ACTION_JUMP*} 長押しで上昇、{*CONTROLLER_ACTION_SNEAK*} 長押しで下降できます。または、方向キーで上下左右に飛びましょう - - オンラインID: + + ゲーマー カードを見る - - ゲーム内でオンラインIDを表示 + + クリエイティブ モードで作成、ロード、セーブした世界は、後でサバイバル モードでロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? - - Minecraft: PlayStation(R)Vita Editionで作ったよ! + + この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? - - 現在お使いのテクスチャ パックは試用版です。テクスチャ パックのコンテンツをすべて利用できますが、途中経過はセーブできません。 -試用版を使用中にセーブしようとすると、完全版を購入するか尋ねるメッセージが表示されます + + ゲーマー プロフィールを見る - - パッチ 1.04 (タイトル アップデート 14) + + フレンドを招待 - - SELECT + + minecraftforum には、"PlayStation Vita" Edition専用セクションがあります - - このオプションでは、プレイ中およびこのオプションを有効にしてセーブ後に再びロードした際に、この世界に対するトロフィーおよびランキング更新が無効になります。 + + ゲームの最新情報は Twitter の @4JStudios と @Kappische でゲット! - - "PSN" にサインインしますか? + + NOT USED - - ホストプレイヤーと異なるPlayStation(R)Vita本体を使用しているプレイヤーに対してこのオプションを選択すると、そのプレイヤーおよび対象プレイヤーと同じPlayStation(R)Vita本体を使用している他のプレイヤーがゲームから追放されます。追放されたプレイヤーは、ゲームが再起動されるまでは再び参加できません + + "PlayStation Vita"本体のタッチスクリーンでメニューを操作できます - - PlayStation(R)Vita + + エンダーマンの目を見てはいけません! - - ネットワークモードの変更 + + {*T3*}遊び方: マルチプレイヤー{*ETW*}{*B*}{*B*} +"PlayStation Vita"本体のMinecraftは、初期設定でマルチプレイヤー ゲームになっています。{*B*}{*B*} +あなたがオンラインゲームを開始または参加すると、フレンドリスト内のフレンドにそのことが通知されます (ホストとしてゲームを開始するときに [招待者のみ] を選択した場合を除きます)。フレンドが参加するとフレンドのフレンドリスト内のフレンドにも通知されます (オプションで [フレンドのフレンドを許可] を選択している場合)。{*B*} +ゲーム中にSELECTボタンを押すと、参加中のプレイヤーのリストを開いて、プレイヤーを追放できます - - ネットワークモードの選択 + + {*T3*}遊び方: スクリーンショットの公開{*ETW*}{*B*}{*B*} +ポーズ メニューで {*CONTROLLER_VK_Y*} を押してスクリーンショットを撮影し、Facebook で公開することができます。投稿の前に、撮影したスクリーンショットの縮小版が表示され、投稿に添えるメッセージを編集できます。{*B*}{*B*} +スクリーンショット撮影に適したカメラ モードも用意されています。キャラクターの正面からのショットを撮影して公開するには、{*CONTROLLER_ACTION_CAMERA*} を何度か押して正面からのカメラに切り替え、{*CONTROLLER_VK_Y*} を押します。{*B*}{*B*} +スクリーンショットにオンライン ID は表示されません - - アドホックネットワークを選択して近くにある他のPlayStation(R)Vita本体と通信するか、"PSN"を選択して世界中のフレンドとつながりましょう + + 4J Studios の "PlayStation Vita" 向け超ホラー大作「Herobrine」はまさかのキャンセル... というウワサ - - アドホックネットワーク + + Minecraft: "PlayStation Vita" Editionはさまざまな記録を更新しています! - - "PSN" + + Minecraft: "PlayStation Vita" Edition のお試し版をプレイできる制限時間が過ぎてしまいました! 完全版を購入して、ゲームを続けますか? - - PlayStation(R)3 セーブをダウンロード + + Minecraft: "PlayStation Vita" Editionのロードに失敗しました。続行できません - - PlayStation(R)3/PlayStation(R)4 本体のセーブデータをアップロード + + 調合 - - アップロードがキャンセルされました + + "PSN" からサインアウトしました。タイトル画面に戻ります - - 転送ストレージへのデータのアップロードをキャンセルしました + + Sony Entertainment Network のチャット制限によりマルチプレイを制限されているプレイヤーがいます。ゲームに参加できません - - データをアップロード中: %d%% + + ローカル プレイヤーの中にチャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているプレイヤーがいるため、ゲームに参加できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます - - データをダウンロード中: %d%% + + ローカル プレイヤーの中にチャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているプレイヤーがいるため、ゲームを作成できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます - - このセーブデータをアップロードして、セーブデータ転送先に保存されている現在のセーブデータを上書きしていいですか? - + + Sony Entertainment Network のチャット制限により、オンラインプレイを制限されているプレイヤーがいます。オンライン ゲームは作成できません。[その他のオプション] にある[オンライン ゲーム] のチェックを外すとオフラインでゲームを開始できます - - データを変換中 + + チャット制限によりSony Entertainment Networkアカウントのオンラインが無効になっているため、ゲームに参加できません - - 保存中 + + "PSN" との接続が切断されました。メイン メニューに戻ります - - アップロード完了! + + "PSN" との接続が切断されました - - アップロードできませんでした。後でもう一度お試しください + + この世界はクリエイティブ モードでセーブされています。トロフィーやランキング更新の対象にはなりません。 - - ダウンロード完了! + + ホスト特権を有効にして作成、ロード、セーブした世界は、後でオプションをオフにしてロードしたとしても、トロフィーやランキング更新の対象にはなりません。実行してよろしいですか? - - ダウンロードできませんでした。後でもう一度お試しください + + これはMinecraft: "PlayStation Vita" Editionのお試し版です。完全版であれば、今すぐ獲得できるトロフィーがあります! +完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: "PlayStation Vita" Editionの楽しさを体験してください。 +完全版を購入しますか? - - NATタイプが制限されているためゲームに参加できませんでした。ネットワーク設定をご確認ください + + ゲスト プレイヤーでは完全版を購入することはできません。Sony Entertainment Network のアカウントでサインインしてください - - -現在、転送ストレージにセーブデータがありません。 -Minecraft: PlayStation(R)3 Edition でセーブデータを転送ストレージにアップロードしたあと、Minecraft: PlayStation(R)Vita Edition でダウンロードしてください。 + + オンラインID - - セーブは完了していません + + これは Minecraft: "PlayStation Vita" Editionのお試し版です。完全版であれば、今すぐ獲得できるテーマがあります! +完全版を購入して、"PSN" を通じて世界中のフレンドと一緒に遊べるMinecraft: "PlayStation Vita" Editionの楽しさを体験してください。 +完全版を購入しますか? - - Minecraft: PlayStation(R)Vita Edition はデータを保存するための容量が足りません。容量を確保するには、ほかの Minecraft: PlayStation(R)Vita Edition のセーブデータを削除してください。 - + + これはMinecraft: "PlayStation Vita" Editionのお試し版です。この招待を受けるには完全版が必要です。 +完全版を今すぐ購入しますか? + + + 転送ストレージのセーブデータは、Minecraft: PlayStation®Vita Edition をまだサポートしていないバージョン番号です \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/4J_stringsPlatformSpecific.xml index f0163975..701eff29 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ko-KR/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/4J_stringsPlatformSpecific.xml @@ -1,50 +1,50 @@  - - 본체 스토리지에 공간이 부족하여 게임 저장 데이터를 만들 수 없습니다. - - - "PSN"에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. + + Sony Entertainment Network 계정에 설정을 저장하지 못했습니다. - - "PSN"에서 로그아웃했으므로 매치가 종료됐습니다. + + Sony Entertainment Network 계정 문제 - - 현재 오프라인 상태입니다. + + 플레이어의 Sony Entertainment Network 계정에 접속하는 중에 문제가 발생했습니다. 트로피가 지급되지 않습니다. - - 이 게임 기능 중 일부는 "PSN"에 로그인해야 이용할 수 있습니다. 현재는 오프라인 상태입니다. + + 이 Minecraft: "PlayStation 3" Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. +정식 버전 게임을 구매하면 Minecraft: "PlayStation 3" Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? - - 애드혹 네트워크 오프라인 + + 애드혹 네트워크에 연결 이 게임에는 애드혹 네트워크 연결이 필요한 기능이 있지만 현재 오프라인 상태입니다. - - 이 기능을 이용하려면 "PSN"에 로그인해야 합니다. - - - "PSN" 연결 - - - 애드혹 네트워크에 연결 + + 애드혹 네트워크 오프라인 트로피 문제 - - 플레이어의 Sony Entertainment Network 계정에 접속하는 중에 문제가 발생했습니다. 트로피가 지급되지 않습니다. + + "PSN"에서 로그아웃했으므로 매치가 종료됐습니다. - - Sony Entertainment Network 계정 문제 + + "PSN"에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. - - Sony Entertainment Network 계정에 설정을 저장하지 못했습니다. + + 본체 스토리지에 공간이 부족하여 게임 저장 데이터를 만들 수 없습니다. - - 이 Minecraft: PlayStation(R)3 Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. -정식 버전 게임을 구매하면 Minecraft: PlayStation(R)3 Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. -정식 버전 게임을 구매하시겠습니까? + + 현재 오프라인 상태입니다. + + + "PSN" 연결 + + + 이 기능을 이용하려면 "PSN"에 로그인해야 합니다. + + + 이 게임 기능 중 일부는 "PSN"에 로그인해야 이용할 수 있습니다. 현재는 오프라인 상태입니다. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/AdditionalStrings.xml index fe5b605a..0af3254f 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ko-KR/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/AdditionalStrings.xml @@ -7,7 +7,7 @@ 숨기기 - Minecraft: PlayStation(R)3 Edition + Minecraft: "PlayStation 3" Edition 옵션 @@ -48,6 +48,12 @@ 옵션 파일이 손상되어서 삭제해야 합니다. + + 옵션 파일을 삭제하십시오. + + + 옵션 파일을 다시 불러오십시오. + 저장 캐시 파일이 손상되어서 삭제해야 합니다. @@ -75,6 +81,9 @@ 어느 한 로컬 플레이어의 자녀보호 기능 때문에 플레이어의 Sony Entertainment Network 계정의 온라인 서비스가 비활성화 되었습니다. + + 게임 업데이트가 있어서 온라인 기능을 사용할 수 없습니다. + 현재 이 게임에서 구매할 수 있는 다운로드 콘텐츠가 없습니다. @@ -82,9 +91,6 @@ 초대 - 지금 바로 Minecraft: PlayStation(R)Vita Edition을 플레이하세요! - - - 게임 업데이트가 있어서 온라인 기능을 사용할 수 없습니다. + 지금 바로 Minecraft: "PlayStation Vita" Edition을 플레이하세요! \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/EULA.xml index 2ff48bb3..2afbd75b 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ko-KR/EULA.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/EULA.xml @@ -1,8 +1,8 @@  - Minecraft: PlayStation(R)Vita Edition - 이용약관 - 본 약관에서는 Minecraft: PlayStation(R)Vita Edition ("Minecraft")을 사용하는 데 필요한 규정을 명시합니다. 본 약관은 Minecraft와 우리 커뮤니티 회원을 보호하기 위해 Minecraft 다운로드 및 사용에 대한 규정을 명시하는 데 필요합니다. 우리도 여러분과 같이 규정을 좋아하지 않으니 최대한 간략하게 하겠습니다만 Minecraft를 다운로드하거나 사용한다면 본 약관(“약관”)에 동의한다는 뜻임을 명심하시기 바랍니다. + Minecraft: "PlayStation Vita" Edition - 이용약관 + 본 약관에서는 Minecraft: "PlayStation Vita" Edition ("Minecraft")을 사용하는 데 필요한 규정을 명시합니다. 본 약관은 Minecraft와 우리 커뮤니티 회원을 보호하기 위해 Minecraft 다운로드 및 사용에 대한 규정을 명시하는 데 필요합니다. 우리도 여러분과 같이 규정을 좋아하지 않으니 최대한 간략하게 하겠습니다만 Minecraft를 다운로드하거나 사용한다면 본 약관(“약관”)에 동의한다는 뜻임을 명심하시기 바랍니다. 시작하기 전에 확실하게 할 사항이 있습니다. Minecraft는 플레이어가 물체를 만들거나 부수는 게임입니다. 다른 사람들과 함께 게임을 하는 경우(멀티 플레이) 함께 물체를 만들거나 다른 사람들이 만들고 있던 물체를 부술 수도 있습니다. 상대방도 여러분의 물체를 부술 수 있습니다. 그러니 여러분이 원하는 대로 행동하지 않는 사람들과는 함께 플레이하지 마십시오. 또한, 하면 안 되는 행동을 하는 사람들도 있습니다. 우리도 이런 행동을 좋아하지 않지만 모든 플레이어에게 적절하게 행동해달라고 요청하는 것 외에는 할 수 있는 일이 별로 없습니다. Minecraft를 사용하는 데 있어서 적절하게 행동하지 않거나 규정 또는 본 약관을 위반 또는 부적절하게 사용하는 사람이 있다면 커뮤니티의 여러분 같은 분들의 도움이 필요합니다. 문제 제기/보고 시스템이 있으니 필요한 경우 사용해 주시면 우리가 처리하도록 하겠습니다. 어떤 문제를 제기하거나 보고하려면 유저의 상세 정보와 무슨 일이 있었는지 등 최대한 자세한 내용을 support@mojang.com으로 이메일로 보내주시기 바랍니다. 이제 약관을 설명하겠습니다: @@ -15,10 +15,10 @@ ...우리가 만든 어떤 것에는 Minecraft의 고객 또는 서버 소프트웨어가 포함되지만 이에 한정되지는 않습니다. 또한, 게임의 수정된 버전, 게임의 일부 또는 우리가 만든 모든 것이 포함된다는 것을 확실히 명시하는 바입니다. 그밖에는 여러분이 뭘 하든지 괜찮습니다. 여러분이 여러 가지 멋진 시도를 많이 하셨으면 합니다(아래 내용 참조). 단, 하면 안 된다고 명시한 사항만 지켜주시면 됩니다. MINECRAFT 사용 - • 여러분은 Minecraft를 여러분의 PlayStation(R)Vita 본체에서 본인이 직접 사용하기 위해 구매하셨습니다. + • 여러분은 Minecraft를 여러분의 "PlayStation Vita" 본체에서 본인이 직접 사용하기 위해 구매하셨습니다. • 여러분이 기타 할 수 있는 사항에 대한 제한된 권리가 아래 명시되어 있습니다. 이는 제한된 권리가 없다면 도를 지나칠 수 있기 때문입니다. 우리가 만든 어떤 것으로든 여러분이 관련된 것을 만들고 싶다면 얼마든지 겸허하게 받아들이겠습니다. 하지만 이는 공식적으로 해석될 수 없으며 본 약관에 따르는 것이 아니라는 점을 확실히 하십시오. 무엇보다도 우리가 만든 어떤 것도 상업적 용도로 사용하지 마십시오. • 본 약관을 위반 시 Minecraft를 사용 및 플레이하는 데 대한 허가가 폐지될 수 있습니다. - • 여러분이 Minecraft를 구매할 때 Minecraft를 본인의 PlayStation(R)Vita 본체에 설치하고 본 약관에 명시되어 있는 대로 본인의 PlayStation(R)Vita 본체에서 사용하고 플레이할 수 있도록 허가합니다. 이 허가는 구매자 개인에게 부여되는 것으로 여러분은 Minecraft(또는 그 일부)를 다른 누구에게도 배포할 수 없습니다. 물론 우리가 명확하게 허가하는 경우는 예외입니다. + • 여러분이 Minecraft를 구매할 때 Minecraft를 본인의 "PlayStation Vita" 본체에 설치하고 본 약관에 명시되어 있는 대로 본인의 "PlayStation Vita" 본체에서 사용하고 플레이할 수 있도록 허가합니다. 이 허가는 구매자 개인에게 부여되는 것으로 여러분은 Minecraft(또는 그 일부)를 다른 누구에게도 배포할 수 없습니다. 물론 우리가 명확하게 허가하는 경우는 예외입니다. • 합리적인 범위 내에서 Minecraft의 스크린샷 및 비디오를 원하는 대로 사용하실 수 있습니다. “합리적인 범위”란 상업적 용도로 사용하거나 부당하거나 우리의 권리에 불리하게 영향을 미치는 행위를 하지 않는다는 뜻입니다. 또한, 예술 자원을 복사해서 돌리는 것도 즐거운 일이 아니니 하지 마십시오. • 기본적으로 간단한 규정은 브랜드 및 자산 이용 지침(Brand and Asset Usage Guidelines) 또는 본 약관에서 명확한 사전 동의가 없는 한 우리가 만든 어떤 것도 상업적 용도로 사용할 수 없다는 것입니다. “공정 사용” 또는 “공정 거래” 정책 등 법에서 명확히 허용하는 경우 법에서 허용하는 범위 내에서 사용할 수 있습니다. MINECRAFT 및 기타 사항의 소유권 @@ -35,7 +35,7 @@ • 여러분이 Minecraft에서 사용 가능하게 하는 콘텐츠는 모두 여러분의 창작물이어야 합니다. Minecraft를 사용해 다른 사람의 권리를 침해하는 콘텐츠를 사용 가능하게 하면 안 됩니다. 여러분이 Minecraft에서 콘텐츠를 게시했을 때 그 콘텐츠가 누군가의 권리를 침해했기 때문에 누가 우리에게 이의를 제기하거나 협박하거나 고소하는 경우, 우리는 여러분에게 이에 대한 책임을 지울 수 있으며 이는 이에 따른 손해에 대해 여러분이 보상을 해야 할 수도 있다는 뜻입니다. 그러므로 매우 중요한 건 여러분이 직접 만든 콘텐츠만 사용 가능하게 하고 다른 사람이 만든 콘텐츠는 절대 사용 가능하게 하면 안 된다는 점입니다. • 여러분이 함께 플레이하는 사람에 대해 주의하십시오. 사람들이 하는 말이나 자신의 신분에 대해 말하는 게 사실인지 확인하는 건 여러분이나 우리에게 모두 어려운 일입니다. 또한 Minecraft를 통해 여러분에 대한 정보를 주면 안 됩니다. 여러분이 Minecraft를 통해 콘텐츠(“본인의 콘텐츠”)를 사용 가능하게 하려면 다음 사항을 따라야 합니다: - - 여러분의 PlayStation(R)Vita 본체 및 "PSN"을 사용하기 위해 동의해야 하는 "PSN" 이용약관 및 기타 지침서인 ToSUA를 포함한 모든 Sony Computer Entertainment의 규칙 준수; + - 여러분의 "PlayStation Vita" 본체 및 "PSN"을 사용하기 위해 동의해야 하는 "PSN" 이용약관 및 기타 지침서인 ToSUA를 포함한 모든 Sony Computer Entertainment의 규칙 준수; - 사람들에게 불쾌한 내용이 포함되면 안 됩니다; - 불법적 내용 또는 합법적이지 않은 내용이 포함되면 안 됩니다; - 정직해야 하며 오해를 불러일으키거나 다른 사람을 속이거나 부당하게 이용하거나 다른 사람을 사칭하면 안 됩니다; @@ -66,7 +66,7 @@ • 본 약관을 여러분이 위반하는 경우; • 다른 사람이 약관을 위반하는 경우. 종료 - • 여러분이 약관을 위반하면 우리가 원하는 경우 여러분이 Minecraft를 사용할 수 있는 권한을 종료할 수 있습니다. 여러분도 언제든지 종료할 수 있습니다. 여러분의 PlayStation(R)Vita 본체에서 Minecraft를 삭제하기만 하면 됩니다. 이러한 경우 "Minecraft의 소유권", "우리의 책임" 및 "일반 사항"에 대한 단락은 종료 후에도 계속해서 적용됩니다. + • 여러분이 약관을 위반하면 우리가 원하는 경우 여러분이 Minecraft를 사용할 수 있는 권한을 종료할 수 있습니다. 여러분도 언제든지 종료할 수 있습니다. 여러분의 "PlayStation Vita" 본체에서 Minecraft를 삭제하기만 하면 됩니다. 이러한 경우 "Minecraft의 소유권", "우리의 책임" 및 "일반 사항"에 대한 단락은 종료 후에도 계속해서 적용됩니다. 일반 사항 • 본 약관은 여러분의 모든 법적 권리를 따릅니다. 본 약관의 어떠한 내용도 법률상 배제될 수 없는 여러분의 권리를 제한하지 않으며 우리의 과실 또는 어떠한 부정한 표현으로 인한 사망 또는 개인 상해에 대한 우리의 책임이 배제되거나 제한되지 않습니다. • 또한 우리는 때때로 본 약관을 변경할 수 있습니다. 하지만 변경 사항은 법적으로 적용될 수 있는 범위 내에서만 효력을 발휘합니다. 예를 들어 여러분이 Minecraft를 싱글 플레이 모드로만 사용하고 우리가 제공하는 업데이트를 사용하지 않는다면 예전의 EULA가 적용되지만 업데이트 또는 우리가 지속적으로 제공하는 온라인 서비스에 따른 Minecraft의 일부를 사용할 경우 새로운 EULA가 적용됩니다. 이러한 경우 우리는 변경 사항이 효력을 발휘하는 데 대해 여러분께 알려드릴 수 없거나 알려드릴 필요가 없을 수 있습니다. 그러니 때때로 본 약관의 변경 사항을 확인하시기 바랍니다. 공평하지 않은 처사는 원치 않지만 가끔 법률이 변경되거나 누군가가 Minecraft의 다른 유저에게 영향을 끼치는 행동을 할 수 있으므로 단속할 필요가 있습니다. @@ -85,7 +85,7 @@ - 게임 내 상점에서 구매하는 콘텐츠는 모두 Sony Network Entertainment Europe Limited("SNEE")를 통해 구매하게 되며 PlayStation(R)Store의 Sony Entertainment Network 이용약관에 따릅니다. 아이템마다 이용 권리가 다를 수 있으니 구매할 때마다 확인하십시오. 따로 표시되어 있지 않은 경우 게임 내 상점에서 구매할 수 있는 콘텐츠는 게임과 연령 제한이 같습니다. + 게임 내 상점에서 구매하는 콘텐츠는 모두 Sony Network Entertainment Europe Limited("SNEE")를 통해 구매하게 되며 "PlayStation Store"의 Sony Entertainment Network 이용약관에 따릅니다. 아이템마다 이용 권리가 다를 수 있으니 구매할 때마다 확인하십시오. 따로 표시되어 있지 않은 경우 게임 내 상점에서 구매할 수 있는 콘텐츠는 게임과 연령 제한이 같습니다. diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsGeneric.xml index ff2072f1..24a5dfd0 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsGeneric.xml @@ -1,5031 +1,5922 @@  - - 새 다운로드 콘텐츠가 준비되었습니다! 주 메뉴의 Minecraft 상점에서 이용할 수 있습니다. + + 오프라인 게임으로 전환하는 중 - - Minecraft 상점의 캐릭터 팩으로 캐릭터의 외형을 바꿀 수 있습니다. 주 메뉴의 'Minecraft 상점'을 선택해 확인해 보십시오. + + 호스트가 게임을 저장하는 동안 기다리십시오. - - 게임의 밝기를 높이거나 낮추려면 감마 설정을 변경하십시오. + + Ender에 들어가기 - - 낙원 난이도를 선택하면 체력이 자동으로 회복되고 밤에 괴물이 출몰하지 않습니다! + + 플레이어 저장 중 - - 늑대를 길들이려면 뼈를 먹이십시오. 길들인 늑대는 앉게 하거나 플레이어를 따르게 할 수 있습니다. + + 호스트에 연결 중 - - 소지품 메뉴 밖으로 포인터를 옮기고 {*CONTROLLER_VK_A*} 버튼을 눌러 아이템을 버릴 수 있습니다. + + 지형 다운로드 중 - - 밤에 침대에서 자면 시간을 새벽으로 건너뛸 수 있습니다. 멀티 플레이 게임에서는 동시에 모든 플레이어가 잠들어야 합니다. + + Ender에서 나가기 - - 돼지에서 돼지고기를 수확하고 요리하여 먹으면 체력이 회복됩니다. + + 침대가 사라졌거나 장애물이 막고 있습니다. - - 소에서 가죽을 수확하고 그 가죽을 사용해 방어구를 만드십시오. + + 휴식을 취할 때가 아닙니다. 근처에 괴물이 있습니다. - - 빈 양동이를 사용하면 소에서 짜낸 우유, 물, 또는 용암을 담을 수 있습니다! + + 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. - - 식물을 심을 땅을 준비하려면 괭이를 사용하십시오. + + 이 침대는 주인이 있습니다. - - 거미는 낮에 한해 먼저 공격하지 않는 한 이쪽을 공격하지 않습니다. + + 잠은 밤에만 잘 수 있습니다. - - 삽으로 흙이나 모래를 파는 것이 손으로 파는 것보다 빠릅니다! + + %s님이 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. - - 돼지고기를 날로 먹는 것보다 요리해서 먹을 때 체력이 더 많이 회복됩니다. + + 레벨 불러오는 중 - - 밤에 불을 밝히려면 횃불을 만드십시오. 괴물들은 횃불 근처 지역에는 접근하지 않습니다. + + 마무리 중… - - 광물 수레와 레일을 사용해서 목적지까지 더 빠르게 이동하십시오. + + 지형 구축 중 - - 묘목을 심으면 자라서 나무가 됩니다. + + 월드 시뮬레이션 중 - - Pigman은 먼저 공격하지 않는 한 이쪽을 공격하지 않습니다. + + 순위 - - 플레이어는 게임 시작 지점을 변경할 수 있으며 침대에서 취침하여 시간을 새벽으로 건너뛸 수 있습니다. + + 레벨 저장 준비 중 - - Ghast가 쏘는 불덩이를 되받아치십시오! + + 이것저것 준비 중… - - 차원문을 지으면 다른 차원의 세계인 지하로 여행을 떠날 수 있습니다. + + 서버 시동 중 - - {*CONTROLLER_VK_B*} 버튼을 누르면 지금 손에 들고 있는 아이템을 버립니다. + + 지상 진입 중 - - 상황에 맞는 도구를 사용하십시오! + + 재생성 중 - - 횃불에 쓸 석탄이 없을 때는 화로 안의 나무에서 숯을 만들 수 있습니다. + + 레벨 생성 중 - - 땅을 계속 위로 파거나 계속 아래로 파는 것은 그리 좋지 않습니다. + + 출현 지역 생성 중 - - 해골 뼈에서 얻을 수 있는 뼛가루는 작물을 즉시 자라게 하는 비료로 쓸 수 있습니다. + + 출현 지역 불러오는 중 - - Creeper는 접근하면 폭발합니다. + + 지하 진입 중 - - 흑요석은 물과 용암 재료 블록이 부딪쳐서 만들어진 것입니다. + + 도구 및 무기 - - 용암은 재료 블록이 제거되어도 완전히 사라지는 데 시간이 걸립니다. + + 감마 - - Ghast가 쏘는 불덩이에 내성을 가지는 조약돌은 경계 관문을 만드는 데 적합합니다. + + 게임 감도 - - 횃불, 발광석, 호박등과 같이 광원으로 사용 가능한 블록은 눈과 얼음을 녹입니다. + + 인터페이스 감도 - - 양털로 만든 건축 구조물이 야외에 있으면 번개 때문에 불이 붙을 수도 있으므로 조심해야 합니다. + + 난이도 - - 용암 한 양동이로 화로에서 블록 100개를 녹일 수 있습니다. + + 음악 - - 연주 음은 소리 블록 아래 재질에 따라 달라집니다. + + 사운드 - - 좀비와 해골은 물속에 있으면 대낮에도 살아 움직입니다. + + 낙원 - - 늑대를 공격하면 근처에 있는 늑대들이 적대적으로 변해 플레이어를 공격합니다. Pigman 좀비도 같은 특성을 가집니다. + + 이 모드에서는 플레이어의 체력이 시간에 따라 자동으로 회복되며 적이 등장하지 않습니다. - - 늑대는 지하로 내려갈 수 없습니다. + + 이 모드에서는 적이 나타나지만 보통 난이도보다 공격력이 약합니다. - - 늑대는 Creeper를 공격하지 않습니다. + + 이 모드에서는 적이 나타나며, 플레이어에게 일반 수준의 피해를 입힙니다. - - 닭은 5분에서 10분마다 달걀을 낳습니다. + + 쉬움 - - 흑요석은 다이아몬드 곡괭이로만 채굴할 수 있습니다. + + 보통 - - Creeper를 처치하면 손쉽게 화약을 얻을 수 있습니다. + + 어려움 - - 두 개의 상자를 나란히 놓으면 큰 상자 하나를 만들 수 있습니다. + + 로그아웃 - - 길들인 늑대는 꼬리를 보면 체력 상태를 알 수 있습니다. 기운을 회복시키려면 고기를 먹이십시오. + + 방어구 - - 화로를 이용하면 선인장을 초록 선인장 염료로 만들 수 있습니다. + + 기계장치 - - 플레이 방법 메뉴의 업데이트 정보 섹션에서 게임의 최신 업데이트 정보를 확인할 수 있습니다. + + 이동수단 - - 이제 울타리를 쌓을 수 있습니다! + + 무기 - - 플레이어가 손에 밀을 들고 있으면 일부 동물이 플레이어를 따라다닙니다. + + 식량 - - 동물이 어떤 방향이든 20블록 이상 움직일 수 없으면 사라지지 않습니다. + + 구조물 - - 음악은 C418이 만들었습니다! + + 장식물 - - Notch의 Twitter를 팔로우하는 사람은 100만 명이 넘습니다! + + 양조 - - 스웨덴 사람들이 모두 금발은 아닙니다. Mojang 소속의 Jens 같이 붉은 머리도 있습니다! + + 도구, 무기 및 방어구 - - 언젠가는 업데이트가 있을 예정입니다! + + 재료 - - Notch가 누구인지 아십니까? + + 블록 짓기 - - Mojang의 직원 수보다 Mojang이 받은 상의 수가 많습니다! + + 레드스톤 및 운송 - - 유명인들도 Minecraft를 즐깁니다! + + 기타 - - deadmau5는 Minecraft를 좋아합니다! + + 명단: - - 버그가 보이더라도 신경 쓰지 마세요. + + 저장하지 않고 나가기 - - Creeper는 코딩 버그에서 태어났습니다. + + 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. - - 닭입니까, 오리입니까? + + 주 메뉴로 나가시겠습니까? 게임 진행 내용을 잃게 됩니다! - - Minecon에 간 적 있나요? + + 저장 데이터가 손상되었습니다. 삭제하시겠습니까? - - Mojang 직원 중 junkboy의 얼굴을 본 사람은 없습니다. + + 게임에 참가한 모든 플레이어의 연결을 끊고, 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. - - Minecraft 위키가 있다는 걸 아십니까? + + 저장하고 나가기 - - Mojang의 새 사무실은 아주 멋집니다! + + 새 월드 만들기 - - 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*} 이하가 될 때까지 계속 질주합니다.{*B*}{*B*} -{*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*} -작업대에서 아이템을 만드는 방법은 기본 제작과 같지만, 제작 공간이 더 넓고 선택할 수 있는 아이템이 더 많아집니다. + + Minecraft 상점 - - {*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*} -효과가 부여된 책은 모루에서 아이템에 효과를 부여하는 데 사용됩니다. 아이템에 부여할 효과를 더욱 효과적으로 제어할 수 있습니다.{*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*} -플레이 중인 레벨에 부적절한 내용이 포함되어 있다고 생각되면 해당 레벨을 차단 레벨 목록에 추가할 수 있습니다. -레벨을 차단하려면 일시 중지 메뉴를 불러온 뒤 {*CONTROLLER_VK_RB*}를 눌러 레벨 차단 툴팁을 선택하십시오. -다음에 해당 레벨을 선택하여 게임에 참가하려고 하면 차단 레벨 목록에 있는 레벨이라는 주의사항이 표시됩니다. 해당 레벨을 리스트에서 제거한 다음 참가할지, 아니면 나갈지를 선택할 수 있습니다. + + 게임 나가기 - - {*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*} - {*KICK_PLAYER_DESCRIPTION*}{*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*} - 월드 안에서 플레이어가 다른 플레이어나 자기 자신을 다른 플레이어에게 순간 이동하게 할 수 있습니다. + + 게임 저장 - - 다음 페이지 + + 저장하지 않고 나가기 - - 이전 페이지 + + START를 눌러 게임에 참가하세요. - - 기본 + + 만세! Minecraft의 Steve가 그려진 게이머 사진을 획득했습니다! - - HUD + + 만세! Creeper가 그려진 게이머 사진을 획득했습니다! - - 소지품 + + 정식 버전 게임 구매 - - 상자 + + 참가하려는 플레이어가 이 게임의 다음 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. - - 제작 + + 새 월드 - - 화로 - - - 디스펜서 + + 상품을 획득했습니다! - - 동물 농장 + + 현재 게임은 평가판 버전입니다. 게임을 저장하려면 정식 버전이 필요합니다. +지금 정식 버전 게임을 구매하시겠습니까? - - 동물 교배 + + 친구 - - 양조 + + 내 점수 - - 효과부여 + + 전체 - - 지하 차원문 + + 잠시 기다려 주십시오. - - 멀티 플레이 + + 결과 없음 - - 스크린샷 공유 + + 필터: - - 레벨 차단 + + 참가하려는 플레이어가 이 게임의 이전 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. - - 창작 모드 + + 연결 끊어짐 - - 호스트 및 플레이어 옵션 + + 서버 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. - - 교환 + + 서버 연결 끊김 - - 모루 + + 게임에서 나가는 중 - - 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*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*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*} + + 예전에 호스트가 자신을 추방했기 때문에 게임에 참가할 수 없습니다. - - 맨손 공격보다 위력이 강합니다. + + 비행으로 인해 게임에서 추방되었습니다. - - 손을 사용하는 것보다 흙, 잡초, 모래, 자갈, 눈을 더 빨리 파냅니다. 눈덩이를 파내려면 삽이 필요합니다. + + 연결 시도 시간이 초과했습니다. - - 돌로 된 블록이나 광석을 채굴할 때 쓰입니다. + + 서버가 꽉 찼습니다. - - 나무로 된 블록을 손을 사용할 때보다 더 빨리 잘라냅니다. + + 이 모드에서는 적이 나타나며, 플레이어에게 큰 피해를 입힙니다. Creeper는 플레이어가 거리를 벌려도 폭발을 취소하지 않으므로 조심해야 합니다! - - 흙과 잡초 블록을 갈아엎어서 작물을 기를 수 있게 만듭니다. + + 테마 - - 나무문은 사용하거나 때려서 또는 레드스톤으로 열 수 있습니다. + + 캐릭터 팩 - - 철문은 레드스톤, 버튼 또는 스위치로만 열 수 있습니다. + + 친구의 친구도 참가 가능 - - NOT USED + + 플레이어 추방 - - NOT USED + + 이 플레이어를 게임에서 추방하시겠습니까? 추방당한 플레이어는 월드를 다시 시작하기 전까지 참가할 수 없습니다. - - NOT USED + + 게이머 사진 팩 - - NOT USED + + 이 게임은 호스트의 친구만 플레이할 수 있도록 제한되어서 참가할 수 없습니다. - - 착용 시 1의 방어력을 얻습니다. + + 손상된 다운로드 콘텐츠 - - 착용 시 3의 방어력을 얻습니다. + + 이 다운로드 콘텐츠는 손상되어서 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. - - 착용 시 2의 방어력을 얻습니다. + + 일부 다운로드 콘텐츠가 손상되어 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. - - 착용 시 1의 방어력을 얻습니다. + + 게임에 참가할 수 없음 - - 착용 시 2의 방어력을 얻습니다. + + 선택됨 - - 착용 시 5의 방어력을 얻습니다. + + 선택된 캐릭터: - - 착용 시 4의 방어력을 얻습니다. + + 정식 버전 받기 - - 착용 시 1의 방어력을 얻습니다. + + 텍스처 팩 잠금 해제 - - 착용 시 2의 방어력을 얻습니다. + + 이 텍스처 팩을 사용하려면 먼저 잠금을 해제해야 합니다. +지금 잠금 해제하시겠습니까? - - 착용 시 6의 방어력을 얻습니다. + + 텍스처 팩 평가판 - - 착용 시 5의 방어력을 얻습니다. + + 시드 - - 착용 시 2의 방어력을 얻습니다. + + 캐릭터 팩 획득 - - 착용 시 2의 방어력을 얻습니다. + + 선택한 캐릭터를 사용하려면 캐릭터 팩을 획득해야 합니다. +지금 캐릭터 팩을 획득하시겠습니까? - - 착용 시 5의 방어력을 얻습니다. + + 텍스처 팩의 평가판을 사용 중입니다. 정식 버전을 구입하기 전에는 이 월드를 저장할 수 없습니다. +텍스처 팩 정식 버전을 구입하시겠습니까? - - 착용 시 3의 방어력을 얻습니다. + + 정식 버전 다운로드 - - 착용 시 1의 방어력을 얻습니다. + + 여기에는 텍스처 팩 또는 매시업 팩이 필요하며 현재 가지고 있지 않습니다! +지금 텍스처 팩 또는 매시업 팩을 설치하시겠습니까? - - 착용 시 3의 방어력을 얻습니다. + + 평가판 받기 - - 착용 시 8의 방어력을 얻습니다. + + 텍스처 팩 없음 - - 착용 시 6의 방어력을 얻습니다. + + 정식 버전 구입 - - 착용 시 3의 방어력을 얻습니다. + + 평가판 다운로드 - - 빛나는 주괴입니다. 주괴로 도구를 만들면 주괴와 재질이 같은 도구가 제작됩니다. 화로에서 광석을 녹여 만듭니다. + + 게임 모드가 변경되었습니다. - - 주괴, 보석, 염료를 설치 가능한 블록으로 만들 수 있게 해줍니다. 값비싼 건설용 블록으로 쓰거나 광물을 간편하게 보관하는 데 사용됩니다. + + 이 옵션을 켜면 초대받은 플레이어만 게임에 참가할 수 있습니다. - - 플레이어나 동물 또는 괴물이 밟으면 전기를 보냅니다. 나무 압력판은 위쪽에 물체를 떨어뜨려도 작동합니다. + + 이 옵션을 켜면 친구 리스트에 있는 사람의 친구가 게임에 참가할 수 있습니다. - - 작은 계단을 만드는 데 사용됩니다. + + 이 옵션을 켜면 플레이어끼리 서로 피해를 입힐 수 있습니다. 생존 모드에만 적용됩니다. - - 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + + 일반 - - 긴 계단을 만드는 데 사용됩니다. 각 계단의 꼭대기에 있는 두 개의 발판은 보통 크기의 발판 블록을 만들어냅니다. + + 완전평면 - - 빛을 만드는 데 사용합니다. 눈과 얼음도 녹일 수 있습니다. + + 이 옵션을 켜면 온라인 게임으로 플레이합니다. - - 건설 재료로 쓰거나 다양한 물건의 재료로 사용됩니다. 어떤 형태의 나무로부터 만들어질 수 있습니다. + + 이 옵션을 끄면 게임에 참가한 플레이어는 인증을 받기 전까지 건물을 짓거나 채굴할 수 없습니다. - - 건설 재료로 사용됩니다. 일반 모래와 달리 중력의 영향을 받지 않습니다. + + 이 옵션을 켜면 마을이나 요새 등의 건물이 월드에 생성됩니다. - - 건설 재료로 사용됩니다. + + 이 옵션을 켜면 지상과 지하에 완전히 평평한 세계가 생성됩니다. - - 횃불, 화살, 표지판, 사다리, 울타리를 만들거나 무기 또는 도구의 손잡이로 사용됩니다. + + 이 옵션을 켜면 쓸모있는 아이템이 든 상자가 플레이어 생성 지점 근처에 나타납니다. - - 밤에 모든 플레이어가 침대에 들면 시간을 앞당겨서 아침으로 만들며, 플레이어 생성 지점을 바꿉니다. -침대 제작에 사용된 양털의 색과 상관없이, 침대의 색상은 모두 같습니다. + + 이 옵션을 켜면 불이 근처의 가연성 블록으로 번집니다. - - 일반적인 제작보다 더 다양한 아이템을 선택해 제작할 수 있게 해줍니다. + + 이 옵션을 켜면 TNT가 작동할 때 폭발합니다. - - 광석을 녹이고 숯과 유리를 만들며, 생선과 돼지고기를 요리하는 데 사용합니다. + + 이 옵션을 켜면 지하 월드가 재건됩니다. 사전에 지하 요새가 없는 곳에 미리 저장하면 유용합니다. - - 블록과 아이템을 넣어 보관합니다. 상자 2개를 나란히 놓으면 용량이 2배 큰 상자가 만들어집니다. + + 꺼짐 - - 뛰어넘을 수 없는 방어벽으로 사용됩니다. 플레이어나 동물, 괴물에 대해서는 1.5배 높이의 블록으로 간주되지만 다른 블록에 대해서는 높이가 같은 것으로 간주됩니다. + + 게임 모드: 창작 - - 수직 경사를 오를 때 사용합니다. + + 생존 - - 사용하거나 때리거나 레드스톤을 이용해 작동시킵니다. 작동 방식은 일반 문과 같지만 개별적 블록으로 간주되며, 땅과 수평인 형태로 열립니다. + + 창작 - - 자신이나 다른 플레이어가 입력한 텍스트를 표시합니다. + + 월드 이름 바꾸기 - - 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. + + 월드의 새 이름을 입력하십시오. - - 폭발을 일으킵니다. 설치한 다음, 부싯돌과 부시를 사용하거나 전기를 이용해 폭파할 수 있습니다. + + 게임 모드: 생존 - - 버섯죽을 담아두는 데 사용합니다. 죽을 먹어도 그릇은 남습니다. + + 생존 모드에서 생성 - - 물이나 용암, 우유를 담아두거나 운반하는 데 쓰입니다. + + 저장된 게임 이름 바꾸기 - - 물을 저장하고 옮기는 데 사용합니다. + + %d초 후에 자동 저장 실행… - - 용암을 저장하고 옮기는 데 사용합니다. + + 켜짐 - - 우유를 저장하고 옮기는 데 사용합니다. + + 창작 모드에서 생성 - - 불꽃을 일으키고, TNT를 폭파하고, 차원문을 여는 데 사용합니다. + + 구름 렌더링 - - 물고기를 잡을 수 있습니다. + + 이 저장된 게임을 어떻게 하시겠습니까? - - 태양과 달의 위치를 표시합니다. + + HUD 크기 (분할 화면) - - 시작 지점을 표시합니다. + + 재료 - - 지도를 들고 있을 동안 탐험한 지역의 이미지를 만들어냅니다. 길을 찾는 데 사용할 수 있습니다. + + 연료 - - 화살과 함께 사용하여 원거리 공격을 합니다. + + 디스펜서 - - 활에 장전하여 사용합니다. + + 상자 - - {*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만큼 회복합니다. 화로에서 닭 날고기를 조리해서 만듭니다. + + %s님이 게임에 참가했습니다. - - 그대로 먹어서 {*ICON_SHANK_01*}를 1.5만큼 회복하거나 화로에서 조리할 수 있습니다. + + %s님이 게임을 떠났습니다. - - {*ICON_SHANK_01*}를 4만큼 회복합니다. 화로에서 소 날고기를 조리해서 만듭니다. + + %s님을 게임에서 추방했습니다. - - 그대로 먹어서 {*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초 정도 작동하다가 닫힙니다. + + 설명문 입력 - - 레드스톤으로 전기를 공급하면 아이템을 넣어 무작위 순서로 발사할 수 있습니다. + + 게시물 설명문을 입력하십시오. - - 작동시키면 음을 연주합니다. 때리면 음의 높낮이가 바뀝니다. 다른 블록 위에 올려놓으면 연주 음의 종류가 변경됩니다. + + 내용 입력 - - 광물 수레가 가는 길에 사용됩니다. + + 플레이 중: - - 동력을 공급하면 그 위를 지나가는 광물 수레의 속도를 올려줍니다. 동력이 끊기면 광물 수레를 멈춰 세웁니다. + + 이 레벨을 차단 레벨 목록에 추가하시겠습니까? +확인을 선택하면 동시에 게임에서 나가게 됩니다. - - 압력 발판처럼 사용되지만 광물 수레로만 작동시킬 수 있습니다. 동력이 공급되면 레드스톤 신호를 보냅니다. + + 차단 목록에서 제거 - - 레일을 따라서 플레이어나 동물, 괴물을 이동시킵니다. + + 자동 저장 간격 - - 레일을 따라서 물건을 이동시킵니다. + + 차단 레벨 - - 석탄을 안에 넣으면 레일을 따라 움직이며 다른 광물 수레를 밀어줍니다. + + 참가하려는 게임은 차단 레벨 목록에 들어 있습니다. +게임 참가를 선택하면 해당 레벨이 차단 레벨 목록에서 제거됩니다. - - 헤엄치는 것보다 물에서 빨리 이동할 수 있습니다. + + 이 레벨을 차단하시겠습니까? - - 양에게서 얻어냅니다. 염료로 색을 바꿀 수 있습니다. + + 자동 저장 간격: 꺼짐 - - 건설 재료로 쓰입니다. 염료로 색을 바꿀 수 있지만, 양털은 양에게서 쉽게 얻을 수 있으므로 권장하지는 않습니다. + + 인터페이스 투명도 - - 양털을 검은색으로 염색합니다. + + 레벨 자동 저장 준비 중 - - 양털을 초록색으로 염색합니다. + + HUD 크기 - - 양털을 갈색으로 염색하는 데, 쿠키의 재료로도 사용되며 코코아 콩을 재배하는 데 사용됩니다. + + - - 양털을 은색으로 염색합니다. + + 여기에 놓을 수 없습니다! - - 양털을 노란색으로 염색합니다. + + 용암을 레벨 출현 지점 근처에 놓을 수 없습니다. 플레이어가 시작 지점에서 바로 죽을 수 있기 때문입니다. - - 양털을 빨간색으로 염색합니다. + + 즐겨찾는 캐릭터 - - 작물이나 나무, 긴 잡초, 거대 버섯, 꽃을 즉시 성장시킵니다. 염료 재료로도 사용합니다. + + %s님의 게임 - - 양털을 분홍색으로 염색합니다. + + 알 수 없는 호스트 게임 - - 양털을 주황색으로 염색합니다. + + 손님이 로그아웃됨 - - 양털을 라임색으로 염색합니다. + + 설정 초기화 - - 양털을 회색으로 염색합니다. + + 설정을 기본값으로 초기화하시겠습니까? - - 양털을 밝은 회색으로 염색합니다. -(참고: 밝은 회색 염료는 회색 염료와 뼛가루를 섞어도 만들 수 있습니다. 이 방법을 쓰면 먹물 주머니 하나로 회색 염료를 3개가 아니라 4개 만들 수 있습니다.) + + 불러오기 오류 - - 양털을 밝은 파란색으로 염색합니다. + + 모든 손님 플레이어가 게임에서 제거되었기 때문에 손님 플레이어가 로그아웃되었습니다. - - 양털을 청록색으로 염색합니다. + + 게임을 생성하지 못했습니다. - - 양털을 보라색으로 염색합니다. + + 자동 선택 - - 양털을 자주색으로 염색합니다. + + 팩 없음: 기본 캐릭터 - - 양털을 파란색으로 염색합니다. + + 로그인 - - 음악 디스크를 재생합니다. + + 로그인하지 않았습니다. 이 게임을 플레이하려면 로그인해야 합니다. 지금 로그인하시겠습니까? - - 매우 강력한 도구나 무기, 방어구를 만드는 데 사용합니다. + + 멀티 플레이 허용되지 않음 - - 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. + + 마시기 - - 책과 지도의 재료입니다. + + 이 지역에는 농장이 있습니다. 농장에서 작물을 재배하면 음식 및 기타 아이템의 재료를 얻을 수 있습니다. - - 책장을 만들거나 효과가 부여된 책에 효과를 부여하는 데 사용됩니다. + + {*B*} + 재배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 재배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 효과부여대 근처에 놓으면 더욱 강력한 효과를 만들어낼 수 있습니다. + + 밀, 호박, 수박은 씨앗을 심어서 재배합니다. 길게 자란 풀을 자르거나 밀을 수확하면 밀 씨앗을 얻을 수 있습니다. 호박 및 수박을 가공하면 호박씨 및 수박씨를 얻을 수 있습니다. - - 장식으로 사용됩니다. + + {*CONTROLLER_ACTION_CRAFTING*}를 눌러 창작 소지품 인터페이스를 엽니다. - - 철제 곡괭이 이상으로 채굴하면 얻을 수 있으며, 화로에서 녹여 황금 주괴로 만듭니다. + + 구멍 반대쪽으로 나가면 계속합니다. - - 돌곡괭이 이상으로 채굴하면 얻을 수 있으며, 화로에서 녹여 철 주괴로 만듭니다. + + 창작 모드 튜토리얼을 완료했습니다. - - 곡괭이로 채굴하여 석탄을 얻어냅니다. + + 씨를 심으려면 쟁기를 사용해서 흙 블록을 농지로 만들어야 합니다. 주변에 수원이 있으면 농지에 계속 수분을 공급하므로 작물이 빨리 자라며, 해당 지역에 불이 켜진 상태를 유지합니다. - - 돌곡괭이 이상으로 채굴하면 청금석이 나옵니다. + + 선인장은 모래에 심어야 하며 최대 세 블록 높이까지 자랍니다. 사탕수수와 마찬가지로 맨 아래 블록을 파괴하면 그 위의 블록이 떨어져 획득할 수 있습니다.{*ICON*}81{*/ICON*} - - 철제 곡괭이 이상으로 채굴하면 다이아몬드를 얻습니다. + + 버섯은 희미하게 불이 켜진 지역에 심어야 합니다. 버섯을 심으면 주변의 희미하게 불이 켜진 블록으로 퍼져 나갑니다.{*ICON*}39{*/ICON*} - - 철제 곡괭이 이상으로 채굴하면 레드스톤 가루를 얻습니다. + + 뼛가루를 사용하면 작물을 완전히 자란 상태로 만들거나 버섯을 거대 버섯으로 만들 수 있습니다.{*ICON*}351:15{*/ICON*} - - 곡괭이로 채굴하여 조약돌을 얻습니다. + + 밀은 자라는 동안 여러 단계를 거칩니다. 수확할 준비가 되었을 때는 어둡게 변합니다.{*ICON*}59:7{*/ICON*} - - 삽을 이용해서 얻습니다. 건물을 짓는 데 쓰입니다. + + 호박 및 수박은 씨를 심은 블록 옆에 또 다른 블록 하나가 필요합니다. 줄기가 다 자란 후 옆의 빈 블록에 열매를 맺게 됩니다. - - 땅에 심을 수 있으며 나무로 자라납니다. + + 사탕수수는 물 블록 옆에 있는 풀, 흙 또는 모래 블록에 심어야 합니다. 사탕수수 블록을 자르면 사탕수수 위에 놓인 블록이 모두 떨어지게 됩니다.{*ICON*}83{*/ICON*} - - 부술 수 없습니다. + + 창작 모드에서는 모든 아이템과 블록을 무한정 사용할 수 있습니다. 도구를 사용하지 않아도 클릭 한 번만으로 블록을 파괴할 수 있으며, 무적 상태인데다 날 수도 있습니다. - - 접촉하는 모든 것에 불을 붙입니다. 양동이에 담을 수 있습니다. + + 이곳의 상자에는 피스톤으로 회로를 만들 수 있는 부품이 들어 있습니다. 이곳에 있는 회로를 완성하거나 자신만의 회로를 만드십시오. 튜토리얼 지역 밖에는 더 많은 예시가 있습니다. - - 삽을 이용해서 얻을 수 있으며 화로에서 녹이면 유리가 나옵니다. 아래에 다른 블록이 없으면 중력의 영향을 받습니다. + + 이곳에는 지하로 통하는 차원문이 있습니다! - - 삽을 이용해서 얻을 수 있으며, 파낼 때 가끔 부싯돌이 나옵니다. 아래에 다른 블록이 없으면 중력의 영향을 받습니다. + + {*B*} + 지하 차원문에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 지하 차원문에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 도끼를 사용해서 벤 다음 판자 제작이나 땔감으로 쓰입니다. + + + 철제, 다이아몬드, 황금 곡괭이로 레드스톤을 채굴하면 레드스톤 가루를 얻을 수 있습니다. 레드스톤 가루를 사용하면 옆으로 15블록, 아래위로 1블록까지 동력을 운반할 수 있습니다. + {*ICON*}331{*/ICON*} + - - 화로에서 모래를 녹여 만듭니다. 건물을 짓는 데 사용할 수 있지만, 채굴하려고 하면 깨져버립니다. + + + 레드스톤 탐지기는 동력 운반 거리를 늘리거나 회로에 지연 기능을 부여할 수 있습니다. + {*ICON*}356{*/ICON*} + - - 곡괭이로 돌을 채굴하면 얻을 수 있습니다. 화로를 만들거나 돌로 된 도구의 재료로 쓰입니다. + + + 동력이 공급되면 피스톤이 늘어나 최대 12블록까지 밀어냅니다. 끈끈이 피스톤은 줄어들 때 거의 모든 종류의 블록 1개를 다시 끌어옵니다. + {*ICON*}33{*/ICON*} + - - 화로에서 찰흙을 구워 만듭니다. + + 차원문은 흑요석 블록을 4블록 길이에 5블록 높이로 쌓아서 만듭니다. 모서리 블록은 없어도 됩니다. - - 화로에 넣어 벽돌로 구워냅니다. + + 지하의 1블록 거리는 지상의 3블록 거리와 같으므로, 지하 월드에서는 지상에서보다 더 빨리 이동할 수 있습니다. - - 부수면 찰흙 덩이가 나옵니다. 찰흙을 화로에 넣어 구워내면 벽돌이 됩니다. + + 현재 창작 모드 상태입니다. - - 눈덩이를 보관하는 좋은 방법입니다. + + {*B*} + 창작 모드에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 창작 모드에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 삽으로 파서 눈덩이를 만들 수 있습니다. + + 지하 차원문을 작동하려면 부싯돌과 부시를 사용하여 외형 안쪽의 흑요석 블록에 불을 붙여야 합니다. 차원문 외형이 무너지거나, 근처에서 폭발이 일어나거나, 차원문 안에 액체가 들어가면 차원문 작동이 멈출 수 있습니다. - - 부수면 가끔 밀 씨앗이 나옵니다. + + 지하 차원문을 사용하려면 안으로 들어가십시오. 화면이 보라색으로 변하며 소리가 날 것입니다. 잠시 후 다른 차원으로 이동하게 됩니다. - - 염료의 재료입니다. + + 용암으로 가득찬 지하 세계는 위험한 곳입니다. 하지만 불을 붙이면 영원히 타는 지하 바위와 빛을 뿜는 발광석을 얻을 수 있습니다. - - 그릇을 사용하여 죽으로 만들 수 있습니다. + + 재배 튜토리얼을 완료했습니다. - - 다이아몬드 곡괭이로만 얻을 수 있습니다. 물과 용암을 섞어 만들어내며, 차원문의 재료가 됩니다. + + 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 나무 둥치를 베려면 도끼를 써야 합니다. - - 괴물을 소환합니다. + + 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 돌과 광물을 채굴할 때는 곡괭이를 써야 합니다. 특정 블록에서 자원을 채굴하려면 더 좋은 재질의 곡괭이가 필요할 수도 있습니다. - - 땅 위에 놓아 전기를 흐르게 합니다. 물약과 함께 양조하면 효과 시간을 증가시킬 수 있습니다. + + 특정 도구는 적을 공격하는 데 유용합니다. 검을 사용해서 공격해 보십시오. - - 다 자란 작물을 수확하면 밀을 얻습니다. + + 철 골렘은 기본적으로 마을을 보호합니다. 사용자가 마을 사람을 공격하면 철 골렘이 사용자를 공격합니다. - - 씨앗을 심을 수 있게 준비된 땅입니다. + + 튜토리얼을 완료하기 전에는 이 지역을 벗어날 수 없습니다. - - 화로를 사용하여 초록 선인장 염료를 만들 수 있습니다. + + 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 흙이나 모래 같이 부드러운 재질의 재료를 얻으려면 삽을 써야 합니다. - - 설탕을 만드는 데 사용합니다. + + 힌트: {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손 또는 손에 든 도구로 채굴하거나 벌목합니다. 일부 블록은 도구를 사용해야 채굴할 수 있습니다. - - 투구처럼 머리에 쓰거나 횃불과 조합하여 호박등으로 만들 수 있습니다. 호박 파이의 주재료이기도 합니다. + + 강 옆의 상자에는 배가 있습니다. 배를 사용하려면 포인터를 물에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르십시오. 포인터를 배에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 배에 탑니다. - - 불이 붙으면 영원히 타오릅니다. + + 연못 옆의 상자에는 낚싯대가 있습니다. 상자에서 낚싯대를 꺼내 손에 든 아이템으로 선택한 다음 사용하십시오. - - 위를 지나가는 것들의 속도를 늦춥니다. + + 이 고급 피스톤 기계장치는 자동 수리 기능을 지닌 다리를 만듭니다! 버튼을 눌러 작동시킨 다음 각 부품이 어떻게 사용되었는지 더 알아보십시오. - - 차원문을 통해서 지상과 지하를 오갈 수 있습니다. + + 사용하고 있는 도구가 손상됐습니다. 도구는 사용할 때마다 손상되며, 나중에는 망가집니다. 아이템 아래쪽의 색상 눈금을 보면 현재 손상된 정도를 알 수 있습니다. - - 화로의 연료, 혹은 횃불 제작의 재료로 사용됩니다. + + 수면으로 헤엄치려면 {*CONTROLLER_ACTION_JUMP*}를 길게 누르십시오. - - 거미를 잡으면 얻을 수 있으며 활 또는 낚싯대의 재료로 쓰입니다. 땅에 놓아 철사로 만들 수도 있습니다. + + 이곳에는 궤도가 있고 그 위에 광물 수레가 있습니다. 광물 수레에 타려면 포인터를 수레에 맞추고 {*CONTROLLER_ACTION_USE*}를 누릅니다. 단추에 포인터를 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 광물 수레가 움직입니다. - - 닭을 잡으면 얻을 수 있습니다. 화살의 재료입니다. + + 철 골렘은 보시는 바와 같이 4개의 철 블록을 놓고 가운데 블록 위에 호박을 놓아 만들 수 있습니다. 철 골렘은 적을 공격합니다. - - Creeper를 처치하여 얻습니다. TNT를 만들거나 물약을 양조하는 재료로 사용할 수 있습니다. + + 소, Mooshroom, 양에게는 밀을, 돼지에게는 당근을 먹이고 닭에게는 밀 씨앗이나 지하 사마귀를 먹이십시오. 늑대에겐 모든 종류의 고기를 먹일 수 있습니다. 동물은 근처에 사랑 모드 상태이며 종류가 같은 동물이 있는지 찾아다니게 됩니다. - - 농지에 심어 작물로 가꿔냅니다. 씨앗을 기르려면 충분한 빛이 있어야 합니다. + + 사랑 모드 상태이며 종류가 같은 동물이 두 마리 만나게 되면 서로 입을 맞추게 되고, 잠시 후 새끼 동물이 태어납니다. 새끼 동물은 다 자라기 전까지 잠시 부모 동물을 따라다닙니다. - - 작물을 수확하여 얻습니다. 식량으로 만들 수 있습니다. + + 사랑 모드가 끝난 동물은 5분간 다시 사랑 모드 상태가 될 수 없습니다. - - 자갈을 파내서 얻을 수 있습니다. 부싯돌과 부시를 만드는 재료입니다. + + 이곳에는 동물이 우리 안에 들어 있습니다. 동물을 교배하면 새끼 동물을 얻을 수 있습니다. - - 돼지에 사용하면 돼지를 타고 다닐 수 있습니다. 당근 꼬치를 이용해 돼지의 방향을 조정할 수 있습니다. + + + {*B*} + 교배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 교배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 눈을 파헤쳐서 획득하며, 집어던질 수 있습니다. - - - 소를 잡으면 얻을 수 있으며 방어구의 재료로 쓰거나 책을 만들 수 있습니다. - - - 슬라임을 처치하여 얻습니다. 물약을 양조하는 재료로 사용하거나 끈끈이 피스톤을 만드는 데 사용할 수 있습니다. + + 동물을 교배시키려면 각 동물에 적합한 먹이를 먹여 '사랑 모드'로 만들어야 합니다. - - 닭이 무작위로 낳습니다. 식량으로 만들 수 있습니다. + + 플레이어가 손에 먹이를 들고 있으면 일부 동물은 플레이어를 따라다닙니다. 동물을 한데 모아 교배할 때 편리합니다.{*ICON*}296{*/ICON*} - - 발광석을 채굴해서 얻습니다. 제작을 거쳐 다시 발광석 블록으로 만들거나 물약과 함께 양조해 효과를 증가시킬 수 있습니다. + + {*B*} + 골렘에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 골렘에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 해골을 처치하여 얻습니다. 뼛가루로 만들 수 있습니다. 늑대에게 먹이면 길들일 수 있습니다. + + 골렘은 여러 개 쌓인 블록 위에 호박을 놓아 만들 수 있습니다. - - 해골이 Creeper를 처치하도록 유도해서 얻습니다. 주크박스에서 재생이 가능합니다. + + 눈 골렘은 2개의 눈 블록을 위아래로 쌓고 그 위에 호박을 놓아 만들 수 있습니다. 눈 골렘은 적에게 눈덩이를 던집니다. - - 불을 꺼뜨리고 작물의 성장을 돕습니다. 양동이에 담을 수 있습니다. + + + 야생 늑대에게 뼈를 주면 길들일 수 있습니다. 길이 든 늑대 주위에는 사랑의 하트가 나타납니다. 길들인 늑대는 앉으라고 명령하지 않는 한 플레이어를 따라다니며 보호합니다. + - - 부수면 일정 확률로 묘목이 나옵니다. 묘목을 심어 나무로 가꿀 수 있습니다. + + 동물과 교배 튜토리얼을 완료했습니다. - - 던전에서 찾을 수 있으며 건설과 장식에 사용됩니다. + + 이 지역에서는 호박과 블록으로 눈 골렘과 철 골렘을 만들 수 있습니다. - - 양에게서 양털을 얻거나 나뭇잎 블록을 수확하는 데 사용합니다. + + 동력원을 설치한 위치와 방향에 따라 주변 블록에 주는 영향이 달라집니다. 예를 들면 블록 옆에 설치한 레드스톤 횃불은 해당 블록이 다른 동력원에서 동력을 공급받는다면 꺼질 수 있습니다. - - 동력을 공급(버튼, 레버, 압력판, 레드스톤 횃불을 이용하거나, 그것들을 레드스톤과 함께 사용)하면 피스톤이 늘어나 블록을 밀어냅니다. + + 가마솥의 물이 떨어지면 물 양동이로 다시 채울 수 있습니다. - - 동력을 공급(버튼, 레버, 압력판, 레드스톤 횃불을 이용하거나, 그것들을 레드스톤과 함께 사용)하면 피스톤이 늘어나 블록을 밀어냅니다. 피스톤이 줄어들면 다시 블록을 끌어옵니다. + + 양조대를 사용하여 '물약 - 화염 저항'을 만드십시오. 물병, 지하 사마귀와 마그마 크림이 필요합니다. - - 돌로 된 블록으로 만들며 주로 요새에서 볼 수 있습니다. + + + 물약을 손에 든 상태에서 {*CONTROLLER_ACTION_USE*}를 길게 누르면 물약을 사용합니다. 일반 물약을 사용할 경우 물약을 마시면 효과가 자신에게 나타납니다. 폭발 물약을 사용할 경우 물약을 던지면 효과가 물약이 떨어진 곳 근처의 생물에게 나타납니다. + 일반 물약에 화약을 넣으면 폭발 물약을 만들 수 있습니다. + - - 울타리처럼 방어벽으로 사용됩니다. + + {*B*} + 양조와 물약에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 양조와 물약에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 문과 비슷하지만 울타리와 함께 사용됩니다. + + 물약 양조의 첫 번째 단계는 물병을 만드는 것입니다. 상자에서 유리병을 꺼내십시오. - - 수박 조각의 재료입니다. + + 가마솥에 들어 있는 물이나 물 블록을 사용해 유리병에 물을 채우십시오. 수원을 가리킨 상태에서 {*CONTROLLER_ACTION_USE*}를 누르면 물을 채웁니다. - - 유리 대신 사용할 수 있는 투명 판자입니다. + + '물약 - 화염 저항'을 자신에게 사용하십시오. - - 땅에 심어 호박으로 가꿔냅니다. + + 아이템에 효과를 부여하려면 우선 아이템을 효과부여 슬롯에 넣으십시오. 무기, 방어구 및 일부 도구에 효과를 부여하면 특별한 효과를 얻을 수 있습니다. 예를 들어 방어력이 더 강해지거나, 블록을 채굴할 때 더 많은 아이템을 얻을 수 있게 됩니다. - - 땅에 심어 수박으로 가꿔냅니다. + + 효과부여 슬롯에 아이템을 넣으면 오른쪽 버튼에 무작위로 부여할 효과가 표시됩니다. - - Enderman이 죽을 때 떨어뜨립니다. Ender 진주를 던지면 진주가 떨어진 위치로 플레이어가 이동하며 체력을 잃습니다. + + 버튼에 쓰인 숫자는 아이템에 해당 효과를 부여할 때 필요한 경험치입니다. 경험치가 부족할 때는 단추를 선택할 수 없습니다. - - 흙 블록 위에 잡초가 자랐습니다. 삽을 이용해서 얻습니다. 건물을 짓는 데 쓰입니다. + + 이제 화염과 용암에 대한 저항력이 생겼습니다. 지금까지 통과할 수 없었던 장소도 통과할 수 있습니다. - - 건물을 짓거나 장식으로 사용됩니다. + + 이것은 효과부여 인터페이스입니다. 무기, 방어구 및 일부 도구에 효과를 부여할 수 있습니다. - - 통과할 때 움직임이 느려집니다. 가위로 잘라 실을 얻을 수 있습니다. + + {*B*} + 효과부여 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 효과부여 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼를 누르십시오. - - 파괴될 때 Silverfish를 소환합니다. 근처에 있는 Silverfish가 공격을 받아도 Silverfish를 소환합니다. + + 이곳에는 양조대와 가마솥, 그리고 양조용 아이템이 들어 있는 상자가 있습니다. - - 놓은 후 시간이 지나면 자라납니다. 가위를 사용하여 수확할 수 있습니다. 사다리처럼 타고 올라갈 수 있습니다. + + 숯은 막대와 결합하여 횃불을 만들 수 있으며, 숯 자체로도 연료로 사용됩니다. - - 얼음 위를 걸어가면 미끄러집니다. 파괴되었을 때 아래에 다른 블록이 있으면 물로 변합니다. 광원이나 지하 가까이 있으면 녹습니다. + + 재료 슬롯에 모래를 넣으면 유리가 만들어집니다. 피신처에 창문을 달려면 유리를 만드십시오. - - 장식으로 사용할 수 있습니다. + + 이것은 양조 인터페이스입니다. 여기서 다양한 효과를 지닌 물약을 만들 수 있습니다. - - 물약 양조와 요새 위치 탐색에 사용합니다. 지하 요새 근처나 내부에 주로 서식하는 Blaze가 떨어뜨립니다. + + 나무로 된 아이템은 종종 땔감으로 쓸 수 있지만, 타는 시간은 아이템마다 다릅니다. 또한 주변에서도 연료로 사용할 아이템들을 찾을 수 있습니다. - - 물약 양조에 사용합니다. Ghast가 죽을 때 떨어뜨립니다. + + 아이템 가열이 끝나면 결과물 슬롯에서 소지품으로 옮길 수 있습니다. 다양한 재료를 실험해서 어떤 아이템이 만들어지는지 파악하십시오. - - 좀비 Pigman이 죽을 때 떨어뜨립니다. 좀비 Pigman은 지하에서 찾아볼 수 있습니다. 물약을 양조하는 재료로 사용됩니다. + + 나무를 재료로 사용하면 숯이 만들어집니다. 화로에 연료를 넣은 다음 재료 슬롯에 나무를 넣으십시오. 화로에서 숯이 완성될 때까지는 다소 시간이 필요하므로, 자유롭게 다른 일을 하다가 나중에 돌아와서 진행 상태를 확인하십시오. - - 물약 양조에 사용합니다. 이것은 지하 요새에서 자연 상태로 자라는 것을 찾을 수 있습니다. 또한 영혼 모래에 심을 수 있습니다. + + {*B*} + 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 양조대 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 사용하면 재료에 따라 다양한 효과를 얻을 수 있습니다. + + 발효 거미 눈을 넣으면 물약이 부패하여 반대 효과를 지니게 됩니다. 화약을 넣으면 던져서 주변에 효과를 적용할 수 있는 폭발 물약이 됩니다. - - 물을 채울 수 있으며 양조대에서 물약을 만드는 기본 재료로 사용할 수 있습니다. + + 물병에 지하 사마귀를 넣고 그다음 마그마 크림을 넣어 '물약 - 화염 저항'을 만드십시오. - - 독이 든 음식이자 양조용 아이템입니다. 플레이어가 거미나 동굴 거미를 죽일 때 떨어뜨립니다. + + {*CONTROLLER_VK_B*} 버튼을 누르면 양조 인터페이스에서 나갑니다. - - 물약 양조에 사용합니다. 주로 해로운 효과의 물약을 만드는 데 사용합니다. + + 위 슬롯에 재료를 넣고 아래 슬롯에 물병을 넣어 물약을 양조합니다. 한 번에 3병을 동시에 양조할 수 있습니다. 조합 조건이 갖추어지면 양조가 시작되고 잠시 후 물약이 완성됩니다. - - 물약 양조에 사용합니다. 다른 아이템과 조합하여 Ender의 눈이나 마그마 크림으로 만들 수 있습니다. + + 물약을 만들기 위해서는 우선 물병이 있어야 만들 수 있습니다. 그 후 지하 사마귀를 추가해 '이상한 물약'을 만든 다음, 하나 이상의 다른 재료를 넣는 방식으로 물약 대부분을 만들 수 있습니다. - - 물약 양조에 사용합니다. + + 물약을 만든 다음에도 물약의 효과를 바꿀 수 있습니다. 레드스톤 가루를 넣으면 효과 지속 시간이 길어지고, 발광석 가루를 넣으면 효과가 더욱 강해집니다. - - 물약과 폭발 물약을 만드는 데 사용합니다. + + 부여할 효과를 선택하고 {*CONTROLLER_VK_A*} 버튼을 누르면 아이템에 효과를 부여합니다. 부여할 효과 비용만큼 경험치가 줄어듭니다. - - 물 양동이를 사용하거나 빗물로 채울 수 있습니다. 가마솥에 유리병을 사용하면 유리병에 물을 채울 수 있습니다. + + {*CONTROLLER_ACTION_USE*}를 누르면 찌를 던지고 낚시를 시작합니다. {*CONTROLLER_ACTION_USE*}를 한 번 더 누르면 낚싯줄을 감습니다. + {*FishingRodIcon*} - - 던지면 Ender 관문으로 가는 방향을 표시합니다. 열두 개를 Ender 관문 외형에 올려놓으면 Ender 관문이 열립니다. + + 물고기를 낚으려면 물에 던져놓은 찌가 수면 아래로 가라앉기를 기다려서 줄을 감아올립니다. 물고기는 날것으로 먹거나 화로에서 요리해 먹을 수 있으며, 먹으면 체력이 회복됩니다. + {*FishIcon*} - - 물약 양조에 사용합니다. + + 다른 도구들과 마찬가지로, 낚싯대도 정해진 횟수만큼만 사용할 수 있습니다. 하지만 물고기 이외의 물건을 낚아도 사용 횟수는 줄어듭니다. 낚싯대를 사용해서 어떤 물건을 낚을 수 있는지, 또는 어떤 일이 일어나는지 확인해 보십시오. + {*FishingRodIcon*} - - 잡초 블록과 비슷하나 버섯을 키우기에 좋습니다. + + 배를 이용하면 물에서 더 빨리 이동할 수 있습니다. {*CONTROLLER_ACTION_MOVE*}과 {*CONTROLLER_ACTION_LOOK*}로 방향을 조정하십시오. + {*BoatIcon*} - - 물에 뜹니다. 수련잎 위로 걸어 다닐 수도 있습니다. + + 낚싯대를 사용하고 있습니다. 사용하려면 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*FishingRodIcon*} - - 지하 요새 건설에 쓰입니다. Ghast의 불덩이에 피해를 받지 않습니다. + + {*B*} + 낚시에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 낚시에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 지하 요새에 쓰입니다. + + 이것은 침대입니다. 밤에 침대를 가리킨 상태에서 {*CONTROLLER_ACTION_USE*}를 누르면 침대에서 잠을 자고 아침에 일어납니다.{*ICON*}355{*/ICON*} - - 지하 요새에서 찾을 수 있습니다. 부서지면 지하 사마귀를 떨어뜨립니다. + + 이곳에는 레드스톤과 피스톤으로 이루어진 간단한 회로가 있고, 회로를 연장할 수 있는 아이템이 든 상자가 있습니다. - - 플레이어의 경험치를 사용해 검, 곡괭이, 도끼, 삽, 활 및 방어구에 효과를 부여할 수 있습니다. + + {*B*} + 레드스톤 회로와 피스톤에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 레드스톤 회로와 피스톤에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - Ender의 눈 열두 개를 사용하면 열립니다. 플레이어를 Ender 차원으로 보냅니다. + + 레버, 버튼, 압력판, 레드스톤 횃불로 회로에 동력을 공급할 수 있습니다. 작동할 아이템에 직접 붙이거나 레드스톤 가루로 연결하십시오. - - Ender 관문을 형성하는 데 쓰입니다. + + {*B*} + 침대에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 침대에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - Ender에서 찾을 수 있는 블록 유형입니다. 폭발에 견디는 능력이 매우 강해 건물을 짓는 데 적합합니다. + + 자는 도중에 괴물의 습격을 받지 않으려면 침대를 안전하고 조명이 충분한 곳에 두어야 합니다. 침대를 한 번 사용하면 게임 중에 사망했을 때 침대에서 부활합니다. + {*ICON*}355{*/ICON*} - - Ender 드래곤을 처치하면 생성되는 블록입니다. + + 게임 내에 다른 플레이어가 있을 때는 모든 플레이어가 동시에 침대에 들어야 잠을 잘 수 있습니다. + {*ICON*}355{*/ICON*} - - 이 아이템을 던지면, 플레이어에게 경험치를 주는 경험치 구체를 떨어뜨립니다. + + {*B*} + 배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 불을 붙이는 데 유용합니다. 장비를 사용하면 무차별적으로 불을 지를 수 있습니다. + + 효과부여대를 사용하면 무기, 방어구 및 일부 도구에 특별한 효과를 부여할 수 있습니다. 예를 들어 블록을 채굴할 때 더 많은 아이템을 얻을 수 있는 효과나 방어력이 더 강해지는 효과 등이 있습니다. - - 진열장과 비슷하며 진열장에 있는 아이템이나 블록을 보여줍니다. + + 효과부여대 주변에 책장을 놓으면 효과부여대가 강화되어 더 높은 수준의 효과를 부여할 수 있습니다. - - 던지면 지정된 생물 유형이 생성될 수 있습니다. + + 아이템에 효과를 부여하려면 경험치가 필요합니다. 괴물 및 동물을 처치하면 나오는 경험치 구체를 모으거나, 광석을 채굴하거나, 동물을 교배하거나, 낚시를 하거나, 화로에서 특정 아이템을 녹이거나 요리하면 경험치를 얻을 수 있습니다. - - 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + + 효과는 무작위로 부여되지만, 성능이 더 좋은 효과 몇 종류는 더 많은 경험치를 지불하는 것은 물론 효과부여대 주위를 책장으로 둘러싸 강화해야 얻을 수 있습니다. - - 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + + 여기에는 효과부여대와 효과부여에 사용할 수 있는 아이템이 있습니다. - - 화로에서 지하 바위를 녹여 만듭니다. 지하 벽돌의 재료입니다. + + {*B*} + 효과부여에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 효과부여에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 동력을 공급하면 빛을 냅니다. + + 경험치 병을 사용해서도 경험치를 얻을 수 있습니다. 경험치 병을 던지면 병이 떨어진 곳에 경험치 구체가 나타납니다. - - 재배하여 코코아 콩을 얻을 수 있습니다. + + 광물 수레는 레일을 따라 이동합니다. 화로를 동력으로 사용하여 움직이는 광물 수레나 상자가 담긴 광물 수레를 만들 수도 있습니다. + {*RailIcon*} - - 괴물 머리는 장식용으로 놓아둘 수도 있고, 투구 슬롯에 놓아 마스크로 쓸 수도 있습니다. + + 레드스톤 횃불과 회로로 동력을 공급받아 광물 수레의 속도를 높여주는 동력 레일도 만들 수 있습니다. 스위치와 레버, 압력판으로 이러한 장치를 연결해 장치를 만드십시오. + {*PoweredRailIcon*} - - 오징어 + + 배를 타고 이동 중입니다. 배에서 내리려면 포인터를 배에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*BoatIcon*} - - 잡으면 먹물 주머니를 얻을 수 있습니다. + + 이곳에 있는 상자에는 효과가 부여된 아이템과 경험치 병, 그리고 효과부여대를 시험해 볼 수 있는 아이템이 들어 있습니다. - - + + 광물 수레에 탑승했습니다. 수레에서 나가려면 포인터를 수레에 맞춘 다음 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*MinecartIcon*} - - 잡으면 가죽을 얻을 수 있습니다. 또한 우유를 짜서 양동이에 담을 수 있습니다. + + {*B*} + 광물 수레에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 광물 수레에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - + + 아이템을 옮기는 중에 포인터가 인터페이스를 벗어나면 아이템을 버릴 수 있습니다. - - 가위를 사용하면 양털을 얻을 수 있습니다. 이미 털을 깎았다면 양털이 나오지 않습니다. 털을 염색하여 색을 바꿀 수 있습니다. + + 읽기 - - + + 매달기 - - 잡으면 깃털이 나옵니다. 가끔 알을 낳습니다. + + 던지기 - - 돼지 + + 열기 - - 잡으면 돼지고기를 얻을 수 있습니다. 안장을 사용하면 타고 다닐 수 있습니다. + + 높낮이 변경 - - 늑대 + + 폭파 - - 공격받기 전까지는 위협적이지 않으며, 공격하면 뒤를 습격합니다. 뼈를 이용해서 길들이면 데리고 다닐 수 있으며, 플레이어를 공격하는 대상을 공격합니다. + + 심기 - - Creeper + + 정식 버전 게임 구매 - - 가까이 다가가면 폭발합니다! + + 저장 게임 삭제 - - 해골 + + 삭제 - - 플레이어에게 화살을 쏩니다. 처치하면 화살을 떨어뜨립니다. + + 경작 - - 거미 + + 수확 - - 가까이 다가가면 공격합니다. 벽을 타고 오를 수 있으며, 처치하면 실을 떨어뜨립니다. + + 계속 - - 좀비 + + 수면으로 헤엄치기 - - 가까이 다가가면 공격합니다. + + 때리기 - - Pigman 좀비 + + 젖 짜기 - - 먼저 공격하지 않지만, 공격을 받으면 무리를 지어 달려듭니다. + + 수집 - - Ghast + + 비우기 - - 닿으면 폭발하는 불덩어리를 던집니다. + + 안장 - - 슬라임 + + 놓기 - - 피해를 입으면 작은 슬라임으로 분리됩니다. + + 먹기 - - Enderman + + 타기 - - 플레이어가 바라보면 공격합니다. 블록을 들어 옮길 수도 있습니다. + + 배 타기 - - Silverfish + + 성장 - - 공격하면 근처의 Silverfish를 끌어들입니다. 돌 블록에 숨어 있습니다. + + 잠자기 - - 동굴 거미 + + 일어나기 - - 독이 있습니다. + + 재생 - - 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 + + 캐릭터 찾기 - - Lead Game Programmer 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 + + {*EXIT_PICTURE*} 먼 곳을 탐험할 때, 작은 성으로 연결된 계단을 이용하십시오. 계단은 광부의 피신처 근처에 있습니다. + - - Product Manager + + {*B*}튜토리얼을 플레이하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 튜토리얼을 건너뛰려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - Marketing + + {*B*} + 음식 막대와 음식 먹는 법에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 음식 막대와 음식 먹는 법에 대해 이미 알고 있다면{*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 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 + + 채굴 - - 목검 + + 먹이기 - - 돌 검 + + 길들이기 - - 철제 검 + + 필터 변경 - - 다이아몬드 검 + + 모두 놓기 - - 황금 검 + + 하나 놓기 - - 나무 삽 + + 버리기 - - 돌 삽 + + 모두 획득 - - 철제 삽 + + 절반 획득 - - 다이아몬드 삽 + + 놓기 - - 황금 삽 + + 모두 버리기 - - 나무 곡괭이 + + 빠른 선택 취소 - - 돌 곡괭이 + + 이것은 무엇입니까? - - 철제 곡괭이 + + Facebook에 공유 - - 다이아몬드 곡괭이 + + 하나 버리기 - - 황금 곡괭이 + + 교체 - - 나무 도끼 + + 빠른 이동 - - 돌 도끼 + + 캐릭터 팩 - - 철제 도끼 + + 빨간색 스테인드글라스 판유리 - - 다이아몬드 도끼 + + 초록색 스테인드글라스 판유리 - - 황금 도끼 + + 갈색 스테인드글라스 판유리 - - 나무 괭이 + + 흰색 스테인드글라스 - - 돌 괭이 + + 스테인드글라스 판유리 - - 철제 괭이 + + 검은색 스테인드글라스 판유리 - - 다이아몬드 괭이 + + 파란색 스테인드글라스 판유리 - - 황금 괭이 + + 회색 스테인드글라스 판유리 - - 나무문 + + 분홍색 스테인드글라스 판유리 - - 철문 + + 라임색 스테인드글라스 판유리 - - 사슬 투구 + + 보라색 스테인드글라스 판유리 - - 사슬 가슴보호구 + + 청록색 스테인드글라스 판유리 - - 사슬 다리보호구 + + 밝은 회색 스테인드글라스 판유리 - - 사슬 장화 + + 주황색 스테인드글라스 - - 가죽 모자 + + 파란색 스테인드글라스 - - 철제 투구 + + 보라색 스테인드글라스 - - 다이아몬드 투구 + + 청록색 스테인드글라스 - - 황금 투구 + + 빨간색 스테인드글라스 - - 가죽 조끼 + + 초록색 스테인드글라스 - - 철제 흉갑 + + 갈색 스테인드글라스 - - 다이아몬드 흉갑 + + 밝은 회색 스테인드글라스 - - 황금 흉갑 + + 노란색 스테인드글라스 - - 가죽 바지 + + 밝은 파란색 스테인드글라스 - - 철제 다리보호구 + + 자주색 스테인드글라스 - - 다이아몬드 다리보호구 + + 회색 스테인드글라스 - - 황금 다리보호구 + + 분홍색 스테인드글라스 - - 가죽 장화 + + 라임색 스테인드글라스 - - 철제 장화 + + 노란색 스테인드글라스 판유리 - - 다이아몬드 장화 + + 밝은 회색 - - 황금 장화 + + 회색 - - 철 주괴 + + 분홍색 - - 황금 주괴 + + 파란색 - - 양동이 + + 보라색 - - 물 양동이 + + 청록색 - - 용암 양동이 + + 라임색 - - 부싯돌과 부시 + + 주황색 - - 사과 + + 흰색 - - + + 사용자 지정 - - 화살 + + 노란색 - - 석탄 + + 밝은 파란색 - - + + 자주색 - - 다이아몬드 + + 갈색 - - 막대 + + 흰색 스테인드글라스 판유리 - - 그릇 + + 작은 공 - - 버섯죽 + + 큰 공 - - + + 밝은 파란색 스테인드글라스 판유리 - - 깃털 + + 자주색 스테인드글라스 판유리 - - 화약 + + 주황색 스테인드글라스 판유리 - - 밀 씨앗 + + 별 형태 - - + + 검은색 - - + + 빨간색 - - 부싯돌 + + 초록색 - - 돼지 날고기 + + Creeper 형태 - - 구운 돼지고기 + + 섬광 - - 그림 액자 + + 알 수 없는 형태 - - 황금 사과 + + 검은색 스테인드글라스 - - 표지판 + + 철제 말 방어구 - - 광물 수레 + + 황금 말 방어구 - - 안장 + + 다이아몬드 말 방어구 - - 레드스톤 + + 레드스톤 비교 측정기 - - 눈덩이 + + TNT가 담긴 광물 수레 - - + + 호퍼가 담긴 광물 수레 - - 가죽 + + - - 우유 양동이 + + 조명등 - - 벽돌 + + 첩첩 상자 - - 찰흙 + + 가중 압력판(경량) - - 사탕수수 + + 이름표 - - 종이 + + 목재 판자(모든 유형) - - + + 명령 블록 - - 슬라임 볼 + + 폭죽 스타 - - 상자가 담긴 광물 수레 + + 이 동물들은 길들일 수 있으며 길들인 후에 탈 수도 있습니다. 상자를 장착할 수 있습니다. - - 화로가 달린 광물 수레 + + 노새 - - 달걀 + + 말과 당나귀를 교배하면 태어납니다. 이 동물들은 길을 들인 후 탈 수 있으며 상자를 운반할 수 있습니다. - - 나침반 + + - - 낚싯대 + + 이 동물들은 길들일 수 있으며 길들인 후에 탈 수도 있습니다. - - 시계 + + 당나귀 - - 발광석 가루 + + 좀비 말 - - 날생선 + + 빈 지도 - - 요리한 생선 + + 지하의 별 - - 염료 가루 + + 폭죽 로켓 - - 먹물 주머니 + + 해골 말 - - 붉은 장미 염료 + + 위더 - - 초록 선인장 염료 + + 위더 두개골과 영혼 모래로 만듭니다. 플레이어에게 폭파하는 두개골을 발사합니다. - - 코코아 열매 + + 가중 압력판(중량) - - 청금석 + + 밝은 회색 찰흙 - - 보라색 염료 + + 회색 찰흙 - - 청록색 염료 + + 분홍색 찰흙 - - 밝은 회색 염료 + + 파란색 찰흙 - - 회색 염료 + + 보라색 찰흙 - - 분홍색 염료 + + 청록색 찰흙 - - 라임색 염료 + + 라임색 찰흙 - - 노란색 염료 + + 주황색 찰흙 - - 밝은 파란색 염료 + + 흰색 찰흙 - - 자주색 염료 + + 스테인드글라스 - - 주황색 염료 + + 노란색 찰흙 - - 뼛가루 + + 밝은 파란색 찰흙 - - + + 자주색 찰흙 - - 설탕 + + 갈색 찰흙 - - 케이크 + + 호퍼 - - 침대 + + 작동기 레일 - - 레드스톤 탐지기 + + 드로퍼 - - 쿠키 + + 레드스톤 비교 측정기 - - 지도 + + 일광 센서 - - 음악 디스크 - "13" + + 레드스톤 블록 - - 음악 디스크 - "cat" + + 색 찰흙 - - 음악 디스크 - "blocks" + + 검은색 찰흙 - - 음악 디스크 - "chirp" + + 빨간색 찰흙 - - 음악 디스크 - "far" + + 초록색 찰흙 - - 음악 디스크 - "mall" + + 건초 더미 - - 음악 디스크 - "mellohi" + + 단단한 찰흙 - - 음악 디스크 - "stal" + + 석탄 블록 - - 음악 디스크 - "strad" + + 페이드 - - 음악 디스크 - "ward" + + 이 옵션을 끄면 괴물과 동물이 블록을 바꾸거나 아이템을 집어 들 수 없게 됩니다. 예를 들어 Creeper의 폭발이 블록을 파괴하지 못하고 양이 잡초를 제거할 수 없습니다. - - 음악 디스크 - "11" + + 이 옵션을 켜면 플레이어가 죽을 때 소지품을 지킬 수 있습니다. - - 음악 디스크 - "where are we now" + + 이 옵션을 끄면 괴물 및 동물이 자연적으로 생성되지 않습니다. - - 가위 + + 게임 모드: 모험 - - 호박씨 + + 모험 - - 수박씨 + + 같은 지형을 다시 생성하려면 시드를 입력하십시오. 공백으로 남겨두면 무작위로 월드가 생성됩니다. - - 닭 날고기 + + 이 옵션을 끄면 괴물과 동물들이 전리품을 떨어뜨리지 않습니다. 예를 들어 Creeper는 화약을 떨어뜨리지 않습니다. - - 구운 닭고기 + + {*PLAYER*} 사다리에서 떨어짐 - - 소 날고기 + + {*PLAYER*} 덩굴에서 떨어짐 - - 스테이크 + + {*PLAYER*} 물 밖으로 떨어짐 - - 썩은 살점 + + 이 옵션을 끄면 블록이 파괴돼도 아이템을 떨어뜨리지 않습니다. 예를 들어 돌 블록이 조약돌을 떨어뜨리지 않습니다. - - Ender 진주 + + 이 옵션을 끄면 플레이어의 건강이 자연적으로 회복되지 않습니다. - - 수박 조각 + + 이 옵션을 끄면 시간이 바뀌지 않습니다. - - Blaze 막대 + + 광물 수레 - - Ghast의 눈물 + + 가죽끈 - - 금덩이 + + 놓기 - - 지하 사마귀 + + 붙이기 - - {*splash*}{*prefix*}물약 {*postfix*} + + 내리기 - - 유리병 + + 상자 장착 - - 물병 + + 발사 - - 거미 눈 + + 이름 - - 발효 거미 눈 + + 조명등 - - Blaze 가루 + + 1차 파워 - - 마그마 크림 + + 2차 파워 - - 양조대 + + - - 가마솥 + + 드로퍼 - - Ender의 눈 + + 호퍼 - - 빛나는 수박 + + {*PLAYER*} 높은 곳에서 떨어짐 - - 경험치 병 + + 생성 알을 사용할 수 없습니다. 박쥐의 수가 최대치에 도달했습니다. - - 불쏘시개 + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 말의 수가 최대치에 도달했습니다. - - 불쏘시개 (숯) + + 게임 옵션 - - 불쏘시개 (석탄) + + {*PLAYER*} {*SOURCE*}의 {*ITEM*} 화염구 공격에 의해 사망 - - 아이템 외형 + + {*PLAYER*} {*SOURCE*}의 {*ITEM*} 타격에 의해 사망 - - {*CREATURE*} 생성 + + {*PLAYER*} {*SOURCE*}의 {*ITEM*}에 의해 사망 - - 지하 벽돌 + + 괴물과 동물의 난동 - - 두개골 + + 블록 드롭 - - 해골 두개골 + + 자연 재생 - - 말라비틀어진 해골 두개골 + + 일광 주기 - - 좀비 머리 + + 소지품 지키기 - - 머리 + + 괴물 및 동물 생성 - - %s의 머리 + + 괴물 및 동물 전리품 - - Creeper 머리 + + {*PLAYER*} {*SOURCE*}의 {*ITEM*} 원거리 공격에 의해 사망 - - + + {*PLAYER*} 너무 멀리 떨어져 {*SOURCE*}에 의해 사망 - - 잡초 블록 + + {*PLAYER*} 너무 멀리 떨어져 {*SOURCE*}의 {*ITEM*}에 의해 사망 - - + + {*PLAYER*} {*SOURCE*}와 싸우는 동안 화염 속으로 걸어 들어감 - - 조약돌 + + {*PLAYER*} {*SOURCE*}에 의해 떨어짐 - - 참나무 목재 판자 + + {*PLAYER*} {*SOURCE*}에 의해 떨어짐 - - 전나무 목재 판자 + + {*PLAYER*} {*SOURCE*}의 {*ITEM*}에 의해 떨어짐 - - 자작나무 목재 판자 + + {*PLAYER*} {*SOURCE*}와 싸우는 동안 바삭하게 튀겨짐 - - 정글 나무 판자 + + {*PLAYER*} {*SOURCE*}에 의해 폭발 - - 묘목 + + {*PLAYER*} 말라비틀어짐 - - 참나무 묘목 + + {*PLAYER*} {*SOURCE*}의 {*ITEM*}에 의해 사망 - - 전나무 묘목 + + {*PLAYER*} {*SOURCE*} 피하기 위해 용암에서 수영 시도 - - 자작나무 묘목 + + {*PLAYER*} {*SOURCE*} 피하려다 익사 - - 정글 묘목 + + {*PLAYER*} {*SOURCE*} 피하려다 선인장으로 걸어 들어감 - - 기반암 + + 타기 - - + + + 말을 몰려면 안장을 얹어야 합니다. 안장은 마을 사람에게 구매하거나 월드 안에 숨겨져 있는 상자 속에서 찾을 수 있습니다. + - - 용암 + + 길들여진 당나귀와 노새에 상자를 장착해 안장주머니를 채울 수 있습니다. 이 주머니는 타고 갈 때나 살금살금 걸을 때 사용할 수 있습니다. + - - 모래 + + 노새를 제외한 말과 당나귀는 다른 동물과 마찬가지로 황금 사과나 황금 당근을 사용해 교배할 수 있습니다. 망아지는 시간이 지나면 커서 말이 되지만 밀이나 건초를 먹이면 성장 속도가 빨라집니다. - - 사암 + + 말, 당나귀, 노새는 타기 전에 길을 들여야 합니다. 말은 타려고 하고 말 위에서 버티려고 하면서 길을 들일 수 있지만 길이 들기 전까진 플레이어를 내동댕이칠 수 있습니다. + - - 자갈 + + +길이 들면 사랑의 하트가 나타나고 더 이상 플레이어를 내동댕이치지 않습니다. + - - 황금 광석 + + 지금 말을 타보세요. 아이템이나 도구를 들지 않은채 {*CONTROLLER_ACTION_USE*}를 누르면 말에 탈 수 있습니다. + - - 철광석 + + 이곳에서 말과 당나귀를 길들일 수 있습니다. 근처에는 안장과 말 방어구 및 말을 위한 유용한 아이템이 들어있는 상자도 있습니다. + - - 석탄 광석 + + +조명등이 최소 4단의 피라미드 위에 있으면 추가로 재생 2차 파워나 더욱 강력한 1차 파워를 선택할 수 있습니다. + - - 나무 + + +조명등의 파워를 설정하려면 에메랄드, 다이아몬드, 황금 또는 철 주괴를 지불 슬롯에 넣어야 합니다. 설정이 완료된 파워는 조명등에서 무한정 뿜어져 나옵니다. + - - 참나무 목재 + + 이 피라미드 꼭대기에는 비활성화되어 있는 조명등이 있습니다. - - 전나무 목재 + + 조명등 인터페이스입니다. 조명등이 받을 파워를 선택할 수 있습니다. + - - 자작나무 목재 + + + {*B*}계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + {*B*}조명등 인터페이스의 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 정글 나무 + + +조명등 메뉴에서 조명등에 대한 1차 파워를 하나 고를 수 있습니다. 피라미드 단의 수가 많아질수록 선택할 수 있는 파워가 많아집니다. + - - 참나무 + + +다 자란 말, 당나귀, 노새는 탈 수 있습니다. 하지만 방어구는 말만 착용할 수 있으며 아이템을 운반하기 위한 안장주머니는 노새와 당나귀만 착용할 수 있습니다. + - - 전나무 + + +말 소지품 인터페이스입니다. + - - 자작나무 + + + {*B*}계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + {*B*}말 소지품 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 나뭇잎 + + 플레이어는 말 소지품의 아이템을 말, 당나귀, 노새에게 옮기거나 장착할 수 있습니다. + - - 참나무 나뭇잎 + + 점멸 - - 전나무 나뭇잎 + + 자국 - - 자작나무 나뭇잎 + + 비행시간: - - 정글 잎사귀 + + 안장 슬롯에 안장을 놓아서 말에 안장을 얹으세요. 방어구 슬롯에 말 방어구를 놓으면 말이 방어구를 받을 수 있습니다. + - - 스펀지 + + 노새를 찾았습니다. - - 유리 + + + {*B*}말, 당나귀, 노새에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + {*B*}말, 당나귀, 노새에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 양털 + + 말과 당나귀는 주로 넓은 평원에서 발견됩니다. 노새는 당나귀와 말을 교배해서 얻을 수 있지만 노새 자체는 생식능력이 없습니다. + - - 검은색 양털 + + 이 메뉴에서는 소지품과 당나귀와 노새가 차고 있는 안장주머니 사이에서 아이템을 옮길 수도 있습니다. + - - 빨간색 양털 + + 말을 찾았습니다. - - 초록색 양털 + + 당나귀를 찾았습니다. - - 갈색 양털 + + + {*B*}조명등에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + {*B*}조명등에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 파란색 양털 + + 폭죽 스타는 제작 그리드에 화약과 염료를 놓으면 만들 수 있습니다. + - - 보라색 양털 + + 염료에 따라 폭죽 스타가 터질 때 색이 정해집니다. + - - 청록색 양털 + + 불쏘시개, 금덩이, 깃털 또는 괴물의 머리를 추가하는 데 따라 폭죽 스타의 형태가 정해집니다. + - - 밝은 회색 양털 + + 선택적으로 폭죽 스타 여러 개를 제작 그리드에 놓아 폭죽에 추가할 수 있습니다. + - - 회색 양털 + + 제작 그리드에서 화약으로 슬롯을 많이 채울수록 폭죽 스타가 터지는 위치가 높아집니다. + - - 분홍색 양털 + + 폭죽을 사용하려면 출력 슬롯에서 제작된 폭죽을 꺼냅니다. - - 라임색 양털 + + 다이아몬드와 발광석 가루를 사용해 자국이나 점멸을 추가할 수 있습니다. + - - 노란색 양털 + + 폭죽은 수동으로 또는 디스펜서로 발사할 수 있는 장식용 아이템입니다. 폭죽은 종이와 화약, 선택적으로 폭죽 스타를 사용해 만듭니다. + - - 밝은 파란색 양털 + + 색, 페이드, 형태, 크기와 자국, 장작불 등의 폭죽 스타 효과는 제작 시 추가 재료를 넣어 원하는 대로 만들 수 있습니다. + - - 자주색 양털 + + 상자 안의 재료를 조합해 작업대에서 폭죽을 만들어 보세요. + - - 주황색 양털 + + 폭죽 스타를 만든 후 염료와 같이 제작해 폭죽 스타의 페이드 색을 정할 수 있습니다. + - - 흰색 양털 + + 상자 안에 폭죽을 만드는 데 사용할 다양한 아이템이 담겨 있습니다! - - + + + {*B*}폭죽에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + {*B*}폭죽에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 장미 + + 폭죽을 만들려면 소지품 위에 보이는 3x3 제작 그리드에 화약과 종이를 놓으십시오. + - - 버섯 + + 이 방에는 호퍼가 있습니다 - - 황금 블록 + + + {*B*}호퍼에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + {*B*}호퍼에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 황금을 저장하는 간편한 방법입니다. + + +호퍼는 보관함에서 아이템을 삽입하거나 제거하고 보관함 안에 들어온 아이템을 자동으로 집어 들기 위해 사용됩니다. + - - 철 블록 + + +활성화되어있는 조명등은 하늘을 향해 밝은 광선을 비추며 근처에 있는 플레이어들에게 파워를 제공합니다. 조명등은 유리, 흑요석, 위더와 싸워 이기면 획득할 수 있는 지하의 별로 만들 수 있습니다. + - - 철을 저장하는 간편한 방법입니다. + + +조명등의 위치는 낮에 일광을 받을 수 있는 곳이어야 합니다. 조명등은 철, 황금, 에메랄드 또는 다이아몬드의 피라미드 위에 놓아야 합니다. 하지만 조명등이 놓이는 곳의 재질은 조명등의 파워에 영향을 끼치지 않습니다. + - - 돌 발판 + + +조명등의 파워를 설정하십시오. 지불금으로는 제공된 철 주괴를 내면 됩니다. + - - 돌 발판 + + +호퍼는 양조대, 상자, 디스펜서, 드로퍼, 상자가 담긴 광물 수레, 호퍼가 담긴 광물 수레와 다른 호퍼한테까지 영향을 끼칠 수 있습니다. + - - 사암 발판 + + 이 방에는 유용한 호퍼 배치가 많이 있으니 살펴보고 이것저것 실험해 보세요. + - - 참나무 발판 + + 폭죽과 폭죽 스타를 제작하는 데 사용할 수 있는 폭죽 인터페이스입니다. + - - 조약돌 발판 + + + {*B*}계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + {*B*}폭죽 인터페이스의 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 벽돌 발판 + + +호퍼는 위에 있는 보관함에서 계속 아이템을 빼내려고 합니다. 또 보관되어 있는 아이템을 출력 보관함에 삽입하려고 합니다. + - - 돌 벽돌 발판 + + +하지만 레드스톤으로 동력을 공급받는 경우 호퍼는 비활성화되어 아이템을 빼내지도 삽입하지도 않게 됩니다. + - - 참나무 발판 + + +호퍼는 아이템을 출력하려는 방향으로 향하고 있습니다. 호퍼를 특정 블록으로 향하게 하려면 호퍼를 원하는 블록 맞은편에 살금살금 걸어가 놓습니다. + - - 전나무 발판 + + 이 적은 늪에서 발견되며 물약을 던져 공격합니다. 죽을 때 물약을 떨어뜨립니다. - - 자작나무 발판 + + 그림 액자/아이템 외형의 수가 최대치에 도달했습니다. - - 정글 나무 발판 + + 낙원 모드에서는 적을 생성할 수 없습니다. - - 지하 벽돌 발판 + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. - - 벽돌 + + 생성 알을 사용할 수 없습니다. 오징어의 수가 최대치에 도달했습니다. - - TNT + + 생성 알을 사용할 수 없습니다. 적의 수가 최대치에 도달했습니다. - - 책장 + + 생성 알을 사용할 수 없습니다. 마을 사람의 수가 최대치에 도달했습니다. - - 이끼 낀 돌 + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 늑대의 수가 최대치에 도달했습니다. - - 흑요석 + + 괴물 머리의 수가 최대치에 도달했습니다. - - 횃불 + + 시야 반전 - - 횃불(석탄) + + 왼손잡이 - - 횃불(숯) + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 닭의 수가 최대치에 도달했습니다. - - + + 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 Mooshroom의 수가 최대치에 도달했습니다. - - 괴물 출입문 + + 배의 수가 최대치에 도달했습니다. - - 참나무 계단 + + 생성 알을 사용할 수 없습니다. 닭의 수가 최대치에 도달했습니다. - - 상자 + + {*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*} - - 다이아몬드 광석 + + 지하 초기화 - - 다이아몬드 블록 + + %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*} - - 작물 + + 지하의 저장 데이터를 초기화해 기본값으로 재설정하시겠습니까? 지하의 진행 상황이 사라집니다. - - 농지 + + 생성 알을 사용할 수 없습니다. 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. - - 화로 + + 생성 알을 사용할 수 없습니다. Mooshroom의 수가 최대치에 도달했습니다. - - 표지판 + + 생성 알을 사용할 수 없습니다. 늑대의 수가 최대치에 도달했습니다. - - 나무문 + + 지하 초기화 - - 사다리 + + 지하 초기화를 하지 않습니다. - - 레일 + + Mooshroom의 털을 자를 수 없습니다. 돼지, 양, 소, 고양이, 말의 수가 최대치에 도달했습니다. - - 동력 레일 + + 사망! - - 탐지 레일 + + 월드 옵션 - - 돌 계단 + + 건설 및 채광 가능 - - 손잡이 + + 문과 스위치 사용 가능 - - 압력판 + + 건물 생성 - - 철문 + + 완전평면 월드 - - 레드스톤 광석 + + 보너스 상자 - - 레드스톤 횃불 + + 보관함을 열 수 있음 - - 버튼 + + 플레이어 추방 - - + + 비행 가능 - - 얼음 + + 지치지 않음 - - 선인장 + + 플레이어 공격 가능 - - 찰흙 + + 동물 공격 가능 - - 사탕수수 + + 관리자 - - 주크박스 + + 호스트 특권 - - 울타리 + + 플레이 방법 - - 호박 + + 컨트롤 - - 호박등 + + 설정 - - 지하 바위 + + 재생성 - - 영혼 모래 + + 다운로드 콘텐츠 판매 - - 발광석 + + 캐릭터 변경 - - 차원문 + + 제작진 - - 청금석 광석 + + TNT 폭발 - - 청금석 블록 + + 플레이어 대 플레이어 - - 청금석을 저장하는 간편한 방법입니다. + + 플레이어 신뢰 - - 디스펜서 + + 콘텐츠 재설치 - - 소리 블록 + + 디버그 설정 - - 케이크 + + 불 확산 - - 침대 + + Ender 드래곤 - - 거미줄 + + {*PLAYER*} Ender 드래곤 브레스에 의해 사망 - - 긴 잡초 + + {*PLAYER*} {*SOURCE*}에 의해 사망 - - 마른 덤불 + + {*PLAYER*} {*SOURCE*}에 의해 사망 - - 다이오드 + + {*PLAYER*} 사망 - - 잠긴 상자 + + {*PLAYER*} 폭발 - - 들창 + + {*PLAYER*} 마법에 의해 사망 - - 양털(모든 색상) + + {*PLAYER*} {*SOURCE*}의 원거리 공격에 의해 사망 - - 피스톤 + + 기반암 안개 - - 끈끈이 피스톤 + + HUD 표시 - - Silverfish 블록 + + 손 표시 - - 돌 벽돌 + + {*PLAYER*} {*SOURCE*}의 화염구에 의해 사망 - - 이끼 낀 돌 벽돌 + + {*PLAYER*} {*SOURCE*}에 타격에 의해 사망 - - 금이 간 돌 벽돌 + + {*PLAYER*} {*SOURCE*}의 마법에 의해 사망 - - 깎아놓은 돌 벽돌 + + {*PLAYER*} 월드 밖으로 떨어짐 - - 버섯 + + 텍스처 팩 - - 버섯 + + 매시업 팩 - - 철 막대 + + {*PLAYER*} 불꽃에 휩싸여 타오름 - - 유리 판자 + + 테마 - - 수박 + + 게이머 사진 - - 호박 줄기 + + 아바타 아이템 - - 수박 줄기 + + {*PLAYER*} 불타서 사망 - - 덩굴 + + {*PLAYER*} 배고파서 사망 - - 울타리 문 + + {*PLAYER*} 찔려서 사망 - - 벽돌 계단 + + {*PLAYER*} 땅에 너무 세게 충돌 - - 돌 벽돌 계단 + + {*PLAYER*} 용암에서 수영 시도 - - Silverfish 돌 + + {*PLAYER*} 벽에 끼어 질식사 - - Silverfish 조약돌 + + {*PLAYER*} 익사 - - Silverfish 돌 벽돌 + + 사망 메시지 - - 균사체 + + 관리자에서 해임되었습니다. - - 수련잎 + + 날 수 있습니다. - - 지하 벽돌 + + 날 수 없습니다. - - 지하 벽돌 울타리 + + 동물을 공격할 수 없습니다. - - 지하 벽돌 계단 + + 동물을 공격할 수 있습니다. - - 지하 사마귀 + + 관리자가 되었습니다. - - 효과부여대 + + 지치지 않습니다. - - 양조대 + + 무적 상태가 되었습니다. - - 가마솥 + + 무적 상태가 해제되었습니다. - - Ender 차원문 + + %d MSP - - Ender 차원문 외형 + + 지치게 됩니다. - - Ender 돌 + + 투명 상태가 되었습니다. - - 용의 알 + + 투명 상태가 해제되었습니다. - - 관목 + + 플레이어를 공격할 수 있습니다. - - 양치식물 + + 채굴하거나 아이템을 사용할 수 있습니다. - - 사암 계단 + + 블록을 놓을 수 없습니다. - - 전나무 계단 + + 블록을 놓을 수 있습니다. - - 자작나무 계단 + + 캐릭터 애니메이션 - - 정글 나무 계단 + + 사용자 지정 캐릭터 애니메이션 - - 레드스톤 램프 + + 채굴하거나 아이템을 사용할 수 없습니다. - - 코코아 + + 문과 스위치를 사용할 수 있습니다. - - 두개골 + + 괴물 및 동물을 공격할 수 없습니다. - - 현재 컨트롤 + + 괴물 및 동물을 공격할 수 있습니다. - - 배치 + + 플레이어를 공격할 수 없습니다. - - 이동/질주 + + 문과 스위치를 사용할 수 없습니다. - - 보기 + + 보관함(예; 상자)을 사용할 수 있습니다. - - 일시 중지 + + 보관함(예; 상자)을 사용할 수 없습니다. - - 점프 + + 투명화 - - 점프/위로 비행 + + 조명등 + + + {*T3*}플레이 방법: 조명등{*ETW*}{*B*}{*B*} +활성화되어있는 조명등은 하늘을 향해 밝은 광선을 비추며 근처에 있는 플레이어들에게 파워를 제공합니다.{*B*} +조명등은 유리, 흑요석, 위더와 싸워 이기면 획득할 수 있는 지하의 별로 만들 수 있습니다.{*B*}{*B*} +조명등의 위치는 낮에 일광을 받을 수 있는 곳이어야 합니다. 조명등은 철, 황금, 에메랄드 또는 다이아몬드의 피라미드 위에 놓아야 합니다.{*B*} +조명등이 놓이는 곳의 재질은 조명등의 파워에 영향을 끼치지 않습니다.{*B*}{*B*} +조명등 메뉴에서 조명등에 대한 1차 파워를 하나 고를 수 있습니다. 피라미드 단의 수가 많아질수록 선택할 수 있는 파워가 많아집니다.{*B*} +조명등이 최소 4단의 피라미드 위에 있으면 재생 2차 파워나 더욱 강력한 1차 파워를 선택할 수 있습니다.{*B*}{*B*} +조명등의 파워를 설정하려면 에메랄드, 다이아몬드, 황금 또는 철 주괴를 지불 슬롯에 넣어야 합니다.{*B*} +설정이 완료된 파워는 조명등에서 무한정 뿜어져 나옵니다.{*B*} + - - 소지품 + + 폭죽 + + + 언어 + + + + + + {*T3*}플레이 방법: 말{*ETW*}{*B*}{*B*} +말과 당나귀는 주로 넓은 평원에서 발견됩니다. 노새는 당나귀와 말을 교배해서 생긴 새끼이지만 노새 자체는 생식능력이 없습니다.{*B*} +다 자란 말, 당나귀, 노새는 탈 수 있습니다. 하지만 방어구는 말만 착용할 수 있으며 아이템을 운반하기 위한 안장주머니는 노새와 당나귀만 착용할 수 있습니다.{*B*}{*B*} +말, 당나귀, 노새는 타기 전에 길을 들여야 합니다. 말은 타려고 하고 말 위에서 버티려고 하면서 길을 들일 수 있지만 길이 들기 전까진 플레이어를 내동댕이칠 수 있습니다.{*B*} +길이 든 말 주위에는 사랑의 하트가 나타나고 더 이상 플레이어를 내동댕이치지 않습니다. 말을 몰려면 안장을 얹어야 합니다.{*B*}{*B*} +안장은 마을 사람에게 구매하거나 월드 안에 숨겨져 있는 상자 속에서 찾을 수 있습니다.{*B*} +길들여진 당나귀와 노새에 상자를 장착해 안장주머니를 채울 수 있습니다. 이 안장주머니는 타고 갈 때나 살금살금 걸을 때 사용할 수 있습니다.{*B*}{*B*} +노새를 제외한 말과 당나귀는 다른 동물과 마찬가지로 황금 사과나 황금 당근을 사용해 교배할 수 있습니다.{*B*} +망아지는 시간이 지나면 커서 어른 말이 되지만 밀이나 건초를 먹이면 성장 속도가 빨라집니다.{*B*} + - - 아이템 교체 + + {*T3*}플레이 방법: 폭죽{*ETW*}{*B*}{*B*} +폭죽은 수동으로 또는 디스펜서로 발사할 수 있는 장식용 아이템입니다. 폭죽은 종이와 화약, 선택적으로 폭죽 스타를 사용해 만듭니다.{*B*} +색, 페이드, 형태, 크기와 자국, 점멸 등의 폭죽 스타 효과는 제작 시 추가 재료를 넣어 원하는 대로 만들 수 있습니다.{*B*}{*B*} +폭죽을 만들려면 소지품 위에 보이는 3x3 제작 그리드에 화약과 종이를 놓으십시오.{*B*} +선택적으로 폭죽 스타 여러 개를 제작 그리드에 놓아 폭죽에 추가할 수 있습니다.{*B*} +제작 그리드에서 화약으로 슬롯을 많이 채울수록 폭죽 스타가 터지는 위치가 높아집니다.{*B*}{*B*} +그런 후에 제작된 폭죽을 출력 슬롯으로 꺼낼 수 있습니다.{*B*}{*B*} +폭죽 스타는 제작 그리드에 화약과 염료를 놓으면 만들 수 있습니다.{*B*} +- 염료에 따라 폭죽 스타가 터질 때 색이 정해집니다.{*B*} +- 불쏘시개, 금덩이, 깃털 또는 괴물의 머리를 추가하는 데 따라 폭죽 스타의 형태가 정해집니다.{*B*} +- 다이아몬드나 발광석 가루를 사용해 자국이나 점멸을 추가할 수 있습니다.{*B*}{*B*} +폭죽 스타를 만든 후 염료와 같이 제작해 폭죽 스타의 페이드 색을 정할 수 있습니다. + - - 행동 + + {*T3*}플레이 방법: 드로퍼{*ETW*}{*B*}{*B*} +레드스톤으로 동력을 공급받으면 드로퍼는 담고 있던 아이템 하나를 무작위로 땅에 떨어뜨립니다. {*CONTROLLER_ACTION_USE*}를 사용해 드로퍼를 열고 소지품에 있는 아이템으로 드로퍼를 채울 수 있습니다.{*B*} +드로퍼가 상자나 다른 유형의 보관함 쪽으로 향해 있다면 아이템은 그 안에 놓이게 됩니다. 드로퍼를 길게 엮으면 아이템을 먼 곳으로 이동시킬 수 있으며 이렇게 작동시키려면 번갈아 가며 전원을 켜고 꺼야 합니다. + - - 사용 + + 사용하면 현재 있는 월드의 일부를 보여주는 지도가 되며 탐색할수록 채워집니다. - - 제작 + + 위더가 떨어뜨린 걸로, 조명등을 만드는 데 사용됩니다. - - 버리기 + + 호퍼 - - 살금살금 걷기 + + {*T3*}플레이 방법: 호퍼{*ETW*}{*B*}{*B*} +호퍼는 보관함에서 아이템을 삽입하거나 제거하고 보관함 안에 들어온 아이템을 자동으로 집어 들기 위해 사용됩니다.{*B*} +호퍼는 양조대, 상자, 디스펜서, 드로퍼, 상자가 담긴 광물 수레, 호퍼가 담긴 광물 수레와 다른 호퍼한테까지 영향을 끼칠 수 있습니다.{*B*}{*B*} +호퍼는 위에 있는 보관함에서 계속 아이템을 빼내려고 합니다. 또 보관되어 있는 아이템을 출력 보관함에 삽입하려고 합니다.{*B*} +레드스톤으로 동력을 공급받는 경우 호퍼는 비활성화되어 아이템을 빼내지도 삽입하지도 않게 됩니다.{*B*}{*B*} +호퍼는 아이템을 출력하려는 방향으로 향하고 있습니다. 호퍼를 특정 블록으로 향하게 하려면 호퍼를 원하는 블록 맞은편에 살금살금 걸어가 놓습니다.{*B*} + - - 살금살금 걷기/아래로 비행 + + 드로퍼 - - 카메라 모드 변경 + + NOT USED - - 플레이어/초대 + + 회복 - - 이동(비행 시) + + 피해 - - 배치 1 + + 점프 강화 - - 배치 2 + + 채굴 속도 저하 - - 배치 3 + + 피해 강화 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + 피해 약화 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + 혼란 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + 재생 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + 저항 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + 월드 생성을 위한 시드를 찾고 있습니다 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + 활성화하면 다채로운 폭발이 일어납니다. 색, 효과, 형태 및 페이드는 폭죽을 만들 때 폭죽 스타로 결정할 수 있습니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + 호퍼가 담긴 광물 수레를 움직이거나 움직이지 않게 하고 TNT가 담긴 광물 수레를 작동시킬 수 있는 레일입니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + 드로퍼는 레드스톤으로 동력을 공급받을 때 아이템을 잡거나 떨어뜨리고 다른 보관함으로 밀기 위해 사용됩니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + 단단한 찰흙을 염색해 만든 다양한 색의 블록입니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + 레드스톤 동력을 제공합니다. 판에 아이템이 많을수록 동력이 강해집니다. 경량 압력판보다 무게가 더 필요합니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + 레드스톤 동력원으로 사용됩니다. 다시 레드스톤으로 만들 수 있습니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + 아이템을 잡거나 보관함 안으로 또는 밖으로 아이템을 이동하기 위해 사용됩니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + 말, 당나귀, 노새에게 먹일 수 있으며 하트가 10개 회복됩니다. 망아지의 성장 속도가 빨라집니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + 박쥐 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + 이 하늘을 나는 생명체는 동굴이나 밀폐된 넓은 공간에서 찾아볼 수 있습니다. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + 마녀 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + 화로에서 찰흙으로 만듭니다. - - {*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*}을 계속 누르고 있으면 캐릭터의 질주 시간이나 음식이 다 떨어질 때까지 계속 질주합니다. + + 말이 착용할 수 있는 특별한 방어구입니다. 5의 방어력을 제공합니다. - - {*CONTROLLER_ACTION_JUMP*}를 눌러 점프합니다. + + 폭죽의 색, 효과 및 형태를 결정하는 데 사용됩니다. - - {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손이나 도구를 사용해 땅을 파거나 나무를 벱니다. 특정 블록은 도구를 만들어야 파낼 수 있습니다. + + 레드스톤 회로에서 신호 세기를 유지하거나 비교하거나 감산하는 데 사용하거나 특정 블록 상태를 측정하기 위해 사용합니다. - - {*CONTROLLER_ACTION_ACTION*}를 길게 눌러서 나무 블록 4개(나무둥치)를 베어보십시오. {*B*}블록이 파괴되고 공중에 뜬 형태로 아이템이 나타나면, 다가가서 집을 수 있습니다. 집은 아이템은 소지품에 표시됩니다. + + TNT 블록을 옮기는 데 사용되는 광물 수레입니다. - - {*CONTROLLER_ACTION_CRAFTING*}를 눌러 제작 인터페이스를 엽니다. + + 말이 착용할 수 있는 특별한 방어구입니다. 7의 방어력을 제공합니다. - - 아이템을 수집하고 제작하면 소지품이 찹니다.{*B*} - 소지품을 열려면 {*CONTROLLER_ACTION_INVENTORY*}을 누르십시오. + + 명령을 실행하는 데 사용됩니다. - - 이동, 채광 및 공격을 하면 음식 막대 {*ICON_SHANK_01*}를 소비합니다. 질주하거나 질주 점프를 하면 일반적으로 걷거나 달리는 것보다 더 많이 음식 막대를 소비합니다. + + 하늘을 향해 광선을 비추며 근처에 있는 플레이어에게 등급 효과를 제공할 수 있습니다. - - 음식 막대가 9칸 이상{*ICON_SHANK_01*}일 때는 체력을 잃어도 자동으로 다시 회복됩니다. 음식을 먹으면 음식 막대가 다시 차오릅니다. + + 안에 블록과 아이템을 보관할 수 있습니다. 상자 두 개를 나란히 놓으면 용량이 두 배가 되는 커다란 상자를 만들 수 있습니다. 첩첩 상자는 열었을 때 레드스톤 동력을 만들어내기도 합니다. - - 손에 음식 아이템을 들고 있을 때 {*CONTROLLER_ACTION_USE*}를 길게 누르면 음식을 먹어서 음식 막대를 채웁니다. 음식 막대가 가득 찬 상태에서는 음식을 먹을 수 없습니다. + + 말이 착용할 수 있는 특별한 방어구입니다. 11의 방어력을 제공합니다. - - 음식 막대가 낮고 체력을 잃은 상태입니다. 소지품에 있는 스테이크를 먹으면 음식 막대가 차오르고 체력이 회복되기 시작합니다.{*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*} + + 플레이어 대 플레이어: - - 보관함 열기 + + 플레이어 신뢰: - - - 밤은 순식간에 찾아오며, 준비하지 않은 상태로 밖에 나가면 위험합니다. 방어구와 무기를 만들어 사용할 수 있지만, 안전한 피신처를 찾는 것이 더 좋습니다. - + + TNT: - - - 근처에 버려진 광부의 피신처가 있습니다. 이곳이라면 밤을 안전하게 보낼 수 있습니다. - + + 게임 유형: - - - 피신처를 세울 자원을 모아야 합니다. 벽과 지붕은 아무 블록이나 사용해도 되지만 문과 창문, 조명을 설치하려면 특정 재료가 필요합니다. - + + 건물: - - 곡괭이를 사용해서 돌 블록을 채굴하십시오. 돌 블록을 채굴하면 조약돌이 나옵니다. 조약돌 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_BACK*}를 누르십시오. + + 불 확산: - - 소지품을 닫으려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 서명 메시지 편집: - - 이것은 창작 소지품입니다. 이 화면에는 손에 들고 쓸 수 있는 아이템 외에도 선택할 수 있는 모든 아이템이 함께 표시됩니다. + + 스크린샷과 함께 게시할 설명을 입력하십시오. - - {*B*} - 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 창작 모드 소지품 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 설명문 - - - {*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. - 아이템 목록에서 {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. {*CONTROLLER_VK_Y*} 버튼을 누르면 해당 아이템을 전부 집을 수 있습니다. - + + 게임 내 툴팁 - - - 포인터는 자동으로 사용 줄에서 칸 단위로 움직입니다. {*CONTROLLER_VK_A*} 버튼으로 아이템을 놓을 수 있습니다. 아이템을 놓으면 포인터가 아이템 목록으로 돌아가고 다른 아이템을 선택할 수 있습니다. - + + 2 플레이어 수직 분할 화면 - - - 아이템이 걸린 포인터를 인터페이스 밖으로 옮기면 아이템을 월드에 떨어뜨릴 수 있습니다. 빠른 선택 막대에 있는 아이템을 모두 선택 취소하려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. - + + 완료 - - - 상단의 그룹 유형 탭을 {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 스크롤하여 획득하고 싶은 아이템의 그룹 유형을 선택하십시오. - + + 게임 스크린샷 - - 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_VK_BACK*}를 누르십시오. + + 효과 없음 - - 창작 모드 소지품을 닫으려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + + 속도 + + + 속도 저하 + + + 서명 메시지 편집: + + + 고전적인 Minecraft 텍스처, 아이콘 및 사용자 인터페이스입니다! + + + 매시업 월드 모두 보이기 + + + 힌트 + + + 아바타 아이템 1 재설치 + + + 아바타 아이템 2 재설치 + + + 아바타 아이템 3 재설치 + + + 테마 재설치 + + + 게이머사진 1 재설치 + + + 게이머사진 2 재설치 + + + 옵션 + + + 사용자 인터페이스 + + + 기본값으로 재설정 + + + 시야 흔들림 + + + 오디오 + + + 컨트롤 + + + 그래픽 + + + 물약 양조에 사용합니다. Ghast가 죽을 때 떨어뜨립니다. + + + 좀비 Pigman이 죽을 때 떨어뜨립니다. 좀비 Pigman은 지하에서 찾아볼 수 있습니다. 물약을 양조하는 재료로 사용됩니다. + + + 물약 양조에 사용합니다. 이것은 지하 요새에서 자연 상태로 자라는 것을 찾을 수 있습니다. 또한 영혼 모래에 심을 수 있습니다. + + + 얼음 위를 걸어가면 미끄러집니다. 파괴되었을 때 아래에 다른 블록이 있으면 물로 변합니다. 광원이나 지하 가까이 있으면 녹습니다. + + + 장식으로 사용할 수 있습니다. + + + 물약 양조와 요새 위치 탐색에 사용합니다. 지하 요새 근처나 내부에 주로 서식하는 Blaze가 떨어뜨립니다. + + + 사용하면 재료에 따라 다양한 효과를 얻을 수 있습니다. + + + 물약 양조에 사용합니다. 다른 아이템과 조합하여 Ender의 눈이나 마그마 크림으로 만들 수 있습니다. + + + 물약 양조에 사용합니다. + + + 물약과 폭발 물약을 만드는 데 사용합니다. + + + 물을 채울 수 있으며 양조대에서 물약을 만드는 기본 재료로 사용할 수 있습니다. + + + 독이 든 음식이자 양조용 아이템입니다. 플레이어가 거미나 동굴 거미를 죽일 때 떨어뜨립니다. + + + 물약 양조에 사용합니다. 주로 해로운 효과의 물약을 만드는 데 사용합니다. + + + 놓은 후 시간이 지나면 자라납니다. 가위를 사용하여 수확할 수 있습니다. 사다리처럼 타고 올라갈 수 있습니다. + + + 문과 비슷하지만 울타리와 함께 사용됩니다. + + + 수박 조각의 재료입니다. + + + 유리 대신 사용할 수 있는 투명 판자입니다. + + + 동력을 공급(버튼, 레버, 압력판, 레드스톤 횃불을 이용하거나, 그것들을 레드스톤과 함께 사용)하면 피스톤이 늘어나 블록을 밀어냅니다. 피스톤이 줄어들면 다시 블록을 끌어옵니다. + + + 돌로 된 블록으로 만들며 주로 요새에서 볼 수 있습니다. + + + 울타리처럼 방어벽으로 사용됩니다. + + + 땅에 심어 호박으로 가꿔냅니다. + + + 건물을 짓거나 장식으로 사용됩니다. + + + 통과할 때 움직임이 느려집니다. 가위로 잘라 실을 얻을 수 있습니다. + + + 파괴될 때 Silverfish를 소환합니다. 근처에 있는 Silverfish가 공격을 받아도 Silverfish를 소환합니다. + + + 땅에 심어 수박으로 가꿔냅니다. + + + Enderman이 죽을 때 떨어뜨립니다. Ender 진주를 던지면 진주가 떨어진 위치로 플레이어가 이동하며 체력을 잃습니다. + + + 흙 블록 위에 잡초가 자랐습니다. 삽을 이용해서 얻습니다. 건물을 짓는 데 쓰입니다. + + + 물 양동이를 사용하거나 빗물로 채울 수 있습니다. 가마솥에 유리병을 사용하면 유리병에 물을 채울 수 있습니다. + + + 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + + + 화로에서 지하 바위를 녹여 만듭니다. 지하 벽돌의 재료입니다. + + + 동력을 공급하면 빛을 냅니다. + + + 진열장과 비슷하며 진열장에 있는 아이템이나 블록을 보여줍니다. + + + 던지면 지정된 생물 유형이 생성될 수 있습니다. + + + 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. + + + 재배하여 코코아 콩을 얻을 수 있습니다. + + + + + + 잡으면 가죽을 얻을 수 있습니다. 또한 우유를 짜서 양동이에 담을 수 있습니다. + + + + + + 괴물 머리는 장식용으로 놓아둘 수도 있고, 투구 슬롯에 놓아 마스크로 쓸 수도 있습니다. + + + 오징어 + + + 잡으면 먹물 주머니를 얻을 수 있습니다. + + + 불을 붙이는 데 유용합니다. 장비를 사용하면 무차별적으로 불을 지를 수 있습니다. + + + 물에 뜹니다. 수련잎 위로 걸어 다닐 수도 있습니다. + + + 지하 요새 건설에 쓰입니다. Ghast의 불덩이에 피해를 받지 않습니다. + + + 지하 요새에 쓰입니다. + + + 던지면 Ender 관문으로 가는 방향을 표시합니다. 열두 개를 Ender 관문 외형에 올려놓으면 Ender 관문이 열립니다. + + + 물약 양조에 사용합니다. + + + 잡초 블록과 비슷하나 버섯을 키우기에 좋습니다. + + + 지하 요새에서 찾을 수 있습니다. 부서지면 지하 사마귀를 떨어뜨립니다. + + + Ender에서 찾을 수 있는 블록 유형입니다. 폭발에 견디는 능력이 매우 강해 건물을 짓는 데 적합합니다. + + + Ender 드래곤을 처치하면 생성되는 블록입니다. + + + 이 아이템을 던지면, 플레이어에게 경험치를 주는 경험치 구체를 떨어뜨립니다. + + + 플레이어의 경험치를 사용해 검, 곡괭이, 도끼, 삽, 활 및 방어구에 효과를 부여할 수 있습니다. + + + Ender의 눈 열두 개를 사용하면 열립니다. 플레이어를 Ender 차원으로 보냅니다. + + + Ender 관문을 형성하는 데 쓰입니다. + + + 동력을 공급(버튼, 레버, 압력판, 레드스톤 횃불을 이용하거나, 그것들을 레드스톤과 함께 사용)하면 피스톤이 늘어나 블록을 밀어냅니다. + + + 화로에서 찰흙을 구워 만듭니다. + + + 화로에 넣어 벽돌로 구워냅니다. + + + 부수면 찰흙 덩이가 나옵니다. 찰흙을 화로에 넣어 구워내면 벽돌이 됩니다. + + + 도끼를 사용해서 벤 다음 판자 제작이나 땔감으로 쓰입니다. + + + 화로에서 모래를 녹여 만듭니다. 건물을 짓는 데 사용할 수 있지만, 채굴하려고 하면 깨져버립니다. + + + 곡괭이로 돌을 채굴하면 얻을 수 있습니다. 화로를 만들거나 돌로 된 도구의 재료로 쓰입니다. + + + 눈덩이를 보관하는 좋은 방법입니다. + + + 그릇을 사용하여 죽으로 만들 수 있습니다. + + + 다이아몬드 곡괭이로만 얻을 수 있습니다. 물과 용암을 섞어 만들어내며, 차원문의 재료가 됩니다. + + + 괴물을 소환합니다. + + + 삽으로 파서 눈덩이를 만들 수 있습니다. + + + 부수면 가끔 밀 씨앗이 나옵니다. + + + 염료의 재료입니다. + + + 삽을 이용해서 얻을 수 있으며, 파낼 때 가끔 부싯돌이 나옵니다. 아래에 다른 블록이 없으면 중력의 영향을 받습니다. + + + 곡괭이로 채굴하여 석탄을 얻어냅니다. + + + 돌곡괭이 이상으로 채굴하면 청금석이 나옵니다. + + + 철제 곡괭이 이상으로 채굴하면 다이아몬드를 얻습니다. + + + 장식으로 사용됩니다. + + + 철제 곡괭이 이상으로 채굴하면 얻을 수 있으며, 화로에서 녹여 황금 주괴로 만듭니다. + + + 돌곡괭이 이상으로 채굴하면 얻을 수 있으며, 화로에서 녹여 철 주괴로 만듭니다. + + + 철제 곡괭이 이상으로 채굴하면 레드스톤 가루를 얻습니다. + + + 부술 수 없습니다. + + + 접촉하는 모든 것에 불을 붙입니다. 양동이에 담을 수 있습니다. + + + 삽을 이용해서 얻을 수 있으며 화로에서 녹이면 유리가 나옵니다. 아래에 다른 블록이 없으면 중력의 영향을 받습니다. + + + 곡괭이로 채굴하여 조약돌을 얻습니다. + + + 삽을 이용해서 얻습니다. 건물을 짓는 데 쓰입니다. + + + 땅에 심을 수 있으며 나무로 자라납니다. + + + 땅 위에 놓아 전기를 흐르게 합니다. 물약과 함께 양조하면 효과 시간을 증가시킬 수 있습니다. + + + 소를 잡으면 얻을 수 있으며 방어구의 재료로 쓰거나 책을 만들 수 있습니다. + + + 슬라임을 처치하여 얻습니다. 물약을 양조하는 재료로 사용하거나 끈끈이 피스톤을 만드는 데 사용할 수 있습니다. + + + 닭이 무작위로 낳습니다. 식량으로 만들 수 있습니다. + + + 자갈을 파내서 얻을 수 있습니다. 부싯돌과 부시를 만드는 재료입니다. + + + 돼지에 사용하면 돼지를 타고 다닐 수 있습니다. 당근 꼬치를 이용해 돼지의 방향을 조정할 수 있습니다. + + + 눈을 파헤쳐서 획득하며, 집어던질 수 있습니다. + + + 발광석을 채굴해서 얻습니다. 제작을 거쳐 다시 발광석 블록으로 만들거나 물약과 함께 양조해 효과를 증가시킬 수 있습니다. + + + 부수면 일정 확률로 묘목이 나옵니다. 묘목을 심어 나무로 가꿀 수 있습니다. + + + 던전에서 찾을 수 있으며 건설과 장식에 사용됩니다. + + + 양에게서 양털을 얻거나 나뭇잎 블록을 수확하는 데 사용합니다. + + + 해골을 처치하여 얻습니다. 뼛가루로 만들 수 있습니다. 늑대에게 먹이면 길들일 수 있습니다. + + + 해골이 Creeper를 처치하도록 유도해서 얻습니다. 주크박스에서 재생이 가능합니다. + + + 불을 꺼뜨리고 작물의 성장을 돕습니다. 양동이에 담을 수 있습니다. + + + 작물을 수확하여 얻습니다. 식량으로 만들 수 있습니다. + + + 설탕을 만드는 데 사용합니다. + + + 투구처럼 머리에 쓰거나 횃불과 조합하여 호박등으로 만들 수 있습니다. 호박 파이의 주재료이기도 합니다. + + + 불이 붙으면 영원히 타오릅니다. + + + 다 자란 작물을 수확하면 밀을 얻습니다. + + + 씨앗을 심을 수 있게 준비된 땅입니다. + + + 화로를 사용하여 초록 선인장 염료를 만들 수 있습니다. + + + 위를 지나가는 것들의 속도를 늦춥니다. + + + 닭을 잡으면 얻을 수 있습니다. 화살의 재료입니다. + + + Creeper를 처치하여 얻습니다. TNT를 만들거나 물약을 양조하는 재료로 사용할 수 있습니다. + + + 농지에 심어 작물로 가꿔냅니다. 씨앗을 기르려면 충분한 빛이 있어야 합니다. + + + 차원문을 통해서 지상과 지하를 오갈 수 있습니다. + + + 화로의 연료, 혹은 횃불 제작의 재료로 사용됩니다. + + + 거미를 잡으면 얻을 수 있으며 활 또는 낚싯대의 재료로 쓰입니다. 땅에 놓아 철사로 만들 수도 있습니다. + + + 가위를 사용하면 양털을 얻을 수 있습니다. 이미 털을 깎았다면 양털이 나오지 않습니다. 털을 염색하여 색을 바꿀 수 있습니다. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + 철제 삽 + + + 다이아몬드 삽 + + + 황금 삽 + + + 황금 검 + + + 나무 삽 + + + 돌 삽 + + + 나무 곡괭이 + + + 황금 곡괭이 + + + 나무 도끼 + + + 돌 도끼 + + + 돌 곡괭이 + + + 철제 곡괭이 + + + 다이아몬드 곡괭이 + + + 다이아몬드 검 + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + 목검 + + + 돌 검 + + + 철제 검 + + + Jon Kagstrom + + + Tobias Mollstam + + + Rise Lugo + + + Developer + + + 닿으면 폭발하는 불덩어리를 던집니다. + + + 슬라임 + + + 피해를 입으면 작은 슬라임으로 분리됩니다. + + + Pigman 좀비 + + + 먼저 공격하지 않지만, 공격을 받으면 무리를 지어 달려듭니다. + + + Ghast + + + Enderman + + + 동굴 거미 + + + 독이 있습니다. + + + Mooshroom + + + 플레이어가 바라보면 공격합니다. 블록을 들어 옮길 수도 있습니다. + + + Silverfish + + + 공격하면 근처의 Silverfish를 끌어들입니다. 돌 블록에 숨어 있습니다. + + + 가까이 다가가면 공격합니다. + + + 잡으면 돼지고기를 얻을 수 있습니다. 안장을 사용하면 타고 다닐 수 있습니다. + + + 늑대 + + + 공격받기 전까지는 위협적이지 않으며, 공격하면 뒤를 습격합니다. 뼈를 이용해서 길들이면 데리고 다닐 수 있으며, 플레이어를 공격하는 대상을 공격합니다. + + + + + + 잡으면 깃털이 나옵니다. 가끔 알을 낳습니다. + + + 돼지 + + + Creeper + + + 거미 + + + 가까이 다가가면 공격합니다. 벽을 타고 오를 수 있으며, 처치하면 실을 떨어뜨립니다. + + + 좀비 + + + 가까이 다가가면 폭발합니다! + + + 해골 + + + 플레이어에게 화살을 쏩니다. 처치하면 화살을 떨어뜨립니다. + + + 그릇과 함께 사용하면 버섯죽을 만들 수 있습니다. 가위를 사용하면 버섯을 떨어뜨리고 보통 소가 됩니다. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Code Ninja + + + CEO + + + White Collar Worker + + + Explosives Animator + + + Ender에서 찾아볼 수 있는 거대한 검은색 드래곤입니다. + + + Blaze + + + 주로 지하 요새에서 찾아볼 수 있는 적입니다. 죽으면 Blaze 막대를 떨어뜨립니다. + + + 눈 골렘 + + + 플레이어는 눈 블록과 호박을 사용해 눈 골렘을 만들 수 있습니다. 눈 골렘은 플레이어의 적에게 눈덩이를 던집니다. + + + Ender 드래곤 + + + 마그마 큐브 + + + 정글에서 찾을 수 있으며 날생선을 먹여서 조련이 가능합니다. 이때 갑자기 움직이면 오셀롯이 겁을 먹고 도망치기 때문에, 오셀롯이 다가오게 만들어야 합니다. + + + 철 골렘 + + + 마을을 보호하기 위해 나타납니다. 철 블록과 호박으로 만들 수 있습니다. + + + 지하에서 찾아볼 수 있습니다. 슬라임처럼 죽으면 분열하여 여러 개의 조그만 큐브가 됩니다. + + + 마을 사람 - - - 이것은 제작 인터페이스입니다. 여기서 아이템을 조합하여 새 아이템을 만들 수 있습니다. - + + 오셀롯 - - {*B*} - 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 제작 방법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 효과부여대 근처에 놓으면 더욱 강력한 효과를 만들어낼 수 있습니다. - - {*B*} - 아이템 설명을 보려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + + {*T3*}플레이 방법: 화로{*ETW*}{*B*}{*B*} +화로에서는 아이템에 열을 가해서 다른 아이템으로 바꿀 수 있습니다. 예를 들어 철광석을 화로에서 가열하면 철 주괴가 만들어집니다.{*B*}{*B*} +화로를 설치하고 {*CONTROLLER_ACTION_USE*}를 눌러 사용하십시오.{*B*}{*B*} +화로 아래쪽에는 연료나 땔감을 넣고 위쪽에는 가열할 아이템을 넣어야 합니다. 그러면 화로에 불이 켜지고 작업이 시작됩니다.{*B*}{*B*} +아이템 가열이 끝나면 결과물 슬롯에서 소지품으로 옮길 수 있습니다.{*B*}{*B*} +화로에 넣을 수 있는 재료나 연료 아이템에 포인터를 올려놓으면 해당 아이템을 화로로 빨리 옮길 수 있는 툴팁이 표시됩니다. - - {*B*} - 현재 아이템을 만드는 데 필요한 재료를 보려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + + {*T3*}플레이 방법: 디스펜서{*ETW*}{*B*}{*B*} +디스펜서는 아이템을 쏘아 보내는 데 사용됩니다. 디스펜서를 작동하려면 레버와 같은 스위치를 장착해야 합니다.{*B*}{*B*} +디스펜서에 아이템을 넣으려면 {*CONTROLLER_ACTION_USE*}를 누른 다음, 쏘아 보낼 아이템을 소지품에서 꺼내 디스펜서에 넣으십시오.{*B*}{*B*} +이제 스위치를 조작하면 디스펜서가 아이템을 쏘아 보냅니다. - - {*B*} - {*CONTROLLER_VK_X*} 버튼을 눌러 소지품을 다시 여십시오. + + {*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*} + +재료의 조합에 따라 물약의 효과가 달라지니 여러 조합을 시험해 보십시오. - - - 화면 위쪽의 그룹 유형 탭에서 {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}를 사용하여 제작할 아이템 종류를 선택한 다음, {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 선택하십시오. - + + {*T3*}플레이 방법: 대형 상자{*ETW*}{*B*}{*B*} +상자 두 개를 나란히 붙이면 대형 상자가 만들어집니다. 이 상자에는 아이템을 더 많이 넣을 수 있습니다.{*B*}{*B*} +사용 방법은 일반 상자와 같습니다. - - - 작업 구역에는 새 아이템을 만드는 데 필요한 재료가 표시됩니다. {*CONTROLLER_VK_A*} 버튼을 눌러 아이템을 만든 다음 소지품에 넣으십시오. - + + {*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*} +효과부여에 필요한 경험치가 모자란 항목은 빨간색으로 나타나며, 그렇지 않다면 초록색으로 나타납니다.{*B*}{*B*} +실제 효과부여는 표시된 비용에 기반을 두고 무작위로 적용됩니다.{*B*}{*B*} +효과부여대가 한 블록 간격을 두고 책장에 둘러싸여 있으면(최대 책장 15개까지) 효과부여 레벨이 상승하며, 효과부여대에 놓인 책에 신비한 문양이 나타납니다.{*B*}{*B*} +효과부여대를 만들 때 쓰이는 모든 재료는 월드 안의 마을에서 찾거나 월드 안에서 채굴 및 경작을 통해 얻을 수 있습니다.{*B*}{*B*} +효과가 부여된 책은 모루에서 아이템에 효과를 부여하는 데 사용됩니다. 아이템에 부여할 효과를 더욱 효과적으로 제어할 수 있습니다.{*B*} + + + {*T3*}플레이 방법: 레벨 차단{*ETW*}{*B*}{*B*} +플레이 중인 레벨에 부적절한 내용이 포함되어 있다고 생각되면 해당 레벨을 차단 레벨 목록에 추가할 수 있습니다. +레벨을 차단하려면 일시 중지 메뉴를 불러온 뒤 {*CONTROLLER_VK_RB*}를 눌러 레벨 차단 툴팁을 선택하십시오. +다음에 해당 레벨을 선택하여 게임에 참가하려고 하면 차단 레벨 목록에 있는 레벨이라는 주의사항이 표시됩니다. 해당 레벨을 리스트에서 제거한 다음 참가할지, 아니면 나갈지를 선택할 수 있습니다. + + + {*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*} + + {*T2*}일광 주기{*ETW*}{*B*} + 이 옵션을 끄면 시간이 바뀌지 않습니다.{*B*}{*B*} + + {*T2*}소지품 지키기{*ETW*}{*B*} + 이 옵션을 켜면 플레이어가 죽을 때 소지품을 지킬 수 있습니다.{*B*}{*B*} + + {*T2*}괴물 및 동물 생성{*ETW*}{*B*} + 이 옵션을 끄면 괴물 및 동물이 자연적으로 생성되지 않습니다.{*B*}{*B*} + + {*T2*}괴물과 동물의 난동{*ETW*}{*B*} + 이 옵션을 끄면 괴물과 동물이 블록을 바꾸거나 아이템을 집어 들 수 없게 됩니다. 예를 들어 Creeper의 폭발이 블록을 파괴하지 못하고 양이 잡초를 제거할 수 없습니다.{*B*}{*B*} + + {*T2*}괴물 및 동물 전리품{*ETW*}{*B*} + 이 옵션을 끄면 괴물과 동물들이 전리품을 떨어뜨리지 않습니다. 예를 들어 Creeper는 화약을 떨어뜨리지 않습니다.{*B*}{*B*} + + {*T2*}블록 드롭{*ETW*}{*B*} + 이 옵션을 끄면 블록이 파괴돼도 아이템을 떨어뜨리지 않습니다. 예를 들어 돌 블록이 조약돌을 떨어뜨리지 않습니다.{*B*}{*B*} + + {*T2*}자연 재생{*ETW*}{*B*} + 이 옵션을 끄면 플레이어의 건강이 자연적으로 회복되지 않습니다.{*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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*} +동물을 한 장소에 두고 싶으면 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*} +상자를 만들고 나면 상자를 월드에 놓고 {*CONTROLLER_ACTION_USE*}를 눌러 소지품에 있는 아이템을 보관할 수 있습니다.{*B*}{*B*} +아이템을 소지품 또는 상자로 옮기려면 포인터를 사용하십시오.{*B*}{*B*} +상자 안에 넣어둔 아이템은 나중에 소지품에 다시 넣을 수 있습니다. + + + Minecon에 간 적 있나요? + + + Mojang 직원 중 junkboy의 얼굴을 본 사람은 없습니다. + + + Minecraft 위키가 있다는 걸 아십니까? + + + 버그가 보이더라도 신경 쓰지 마세요. + + + Creeper는 코딩 버그에서 태어났습니다. + + + 닭입니까, 오리입니까? + + + Mojang의 새 사무실은 아주 멋집니다! + + + {*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*}플레이 방법: 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*} 버튼을 누르십시오. - - 작업대를 사용하면 제작할 아이템을 더 다양하게 선택할 수 있습니다. 작업대에서도 제작 방법은 기본 제작과 같지만 작업 구역이 넓어지므로, 재료를 더 다양하게 조합할 수 있습니다. + + Minecon 2013이 미국 플로리다 주 올랜도 시에서 개최됩니다! - - 제작 인터페이스 오른쪽 아래에는 소지품이 표시됩니다. 여기에는 현재 선택한 아이템의 설명과, 해당 아이템을 만드는 데 필요한 재료가 표시됩니다. + + .party()는 최고였습니다! - - 현재 선택한 아이템의 설명이 표시되었습니다. 설명을 보면 아이템을 어디에 사용하는지 알 수 있습니다. + + 뜬소문은 모두 거짓이라고 생각하는 것이 진실이라고 생각하는 것보다 좋습니다! - - 선택한 아이템을 만드는 데 필요한 재료 목록이 표시되었습니다. + + 이전 페이지 - - 모아둔 나무를 이용해서 판자를 만들 수 있습니다. 판자 아이콘을 선택한 다음 {*CONTROLLER_VK_A*} 버튼을 눌러 판자를 만드십시오.{*PlanksIcon*} + + 교환 - - 작업대가 완성됐습니다. 작업대를 월드에 설치해야 더 다양한 아이템을 만들 수 있습니다.{*B*} - {*CONTROLLER_VK_B*} 버튼을 눌러 작업 인터페이스를 닫으십시오. + + 모루 - - {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 아이템 그룹 유형을 변경할 수 있습니다. 도구 그룹을 선택하십시오.{*ToolsIcon*} + + Ender - - {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 아이템 그룹 유형을 변경할 수 있습니다. 구조물 그룹을 선택하십시오.{*StructuresIcon*} + + 레벨 차단 - - {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 바꿀 수 있습니다. 일부 아이템은 제작 재료에 따라 완성품이 달라집니다. 나무 삽을 선택하십시오.{*WoodenShovelIcon*} + + 창작 모드 - - 많은 아이템들은 여러 단계를 거쳐 제작됩니다. 이제 판자를 가지고 있으므로 더 다양한 아이템을 만들 수 있습니다. {*CONTROLLER_MENU_NAVIGATE*}를 사용하면 제작할 아이템을 바꿀 수 있습니다. 작업대를 선택하십시오.{*CraftingTableIcon*} + + 호스트 및 플레이어 옵션 - - 지금까지 만든 도구가 있으면 순조로운 출발을 할 수 있으며, 여러 자원을 더 효과적으로 확보하게 됩니다.{*B*} - {*CONTROLLER_VK_B*} 버튼을 눌러 제작 인터페이스를 닫으십시오. + + {*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 차원문의 위치를 볼 수 있으니, 쉽게 참여할 수 있습니다. - - 일부 아이템은 작업대가 아니라 화로에서 만들어야 합니다. 이제 화로를 만들어 보십시오.{*FurnaceIcon*} + + {*ETB*}돌아오신 것을 환영합니다! 아직 눈치채지 못했을지도 모르지만, Minecraft가 업데이트되었습니다.{*B*}{*B*} +새로운 기능이 많이 추가됐습니다. 추가된 주요 기능 일부를 소개해 드리니 읽어보고 신 나는 게임의 세계로 여행을 떠나십시오!{*B*}{*B*} +{*T1*}새로운 아이템{*ETB*} - 단단한 찰흙, 색 찰흙, 석탄 블록, 건초 더미, 작동기 레일, 레드스톤 블록, 일광 센서, 드로퍼, 호퍼, 호퍼가 담긴 광물 수레, TNT가 담긴 광물 수레, 레드스톤 비교 측정기, 가중 압력판, 조명등, 첩첩 상자, 폭죽 로켓, 폭죽 스타, 지하의 별, 목끈, 말 방어구, 이름표, 말 생성 알{*B*}{*B*} +{*T1*}새로운 괴물 및 동물{*ETB*} - 위더, 위더 해골, 마녀, 박쥐, 말, 당나귀와 노새{*B*}{*B*} +{*T1*}새로운 기능{*ETB*} - 말 길들이고 타기, 폭죽을 만들어 쇼 펼치기, 동물과 괴물들에게 이름표로 이름 짓기, 좀 더 발달된 레드스톤 회로 만들기, 새 호스트 옵션으로 월드의 손님이 할 수 있는 일을 제어하기!{*B*}{*B*} +{*T1*}새로운 미니 튜토리얼{*ETB*} - 튜토리얼 월드에서 예전 기능과 새로운 기능을 사용하는 방법을 확인할 수 있습니다. 월드에 숨겨져 있는 비밀 음악 디스크를 모두 찾아보세요!{*B*}{*B*} - - 완성한 화로를 설치하십시오. 피신처 안에 설치하는 것이 좋습니다.{*B*} - {*CONTROLLER_VK_B*} 버튼을 눌러 제작 인터페이스를 닫으십시오. + + 맨손 공격보다 위력이 강합니다. - - 이 화면은 화로 인터페이스입니다. 화로에서는 아이템에 열을 가하여 다른 아이템으로 바꿀 수 있습니다. 예를 들어, 화로에서 철광석을 가열하면 철 주괴가 만들어집니다. + + 손을 사용하는 것보다 흙, 잡초, 모래, 자갈, 눈을 더 빨리 파냅니다. 눈덩이를 파내려면 삽이 필요합니다. - - {*B*} - 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} - 화로 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 질주 - - 화로 아래쪽에는 연료나 땔감을 넣고 위쪽에는 변경할 아이템을 넣어야 합니다. 그러면 화로에 불이 켜지고 작업이 시작되며, 결과물은 오른쪽 슬롯에 들어옵니다. + + 업데이트 정보 - - 나무로 된 아이템은 종종 땔감으로 쓸 수 있지만, 타는 시간은 아이템마다 다릅니다. 또한 주변에서도 연료로 사용할 아이템들을 찾을 수 있습니다. + + {*T3*}변경 및 추가 사항{*ETW*}{*B*}{*B*} +- 새 아이템이 추가되었습니다 - 단단한 찰흙, 색 찰흙, 석탄 블록, 건초 더미, 작동기 레일, 레드스톤 블록, 일광 센서, 드로퍼, 호퍼, 호퍼가 담긴 광물 수레, TNT가 담긴 광물 수레, 레드스톤 비교 측정기, 가중 압력판, 조명등, 첩첩 상자, 폭죽 로켓, 폭죽 스타, 지하의 별, 목끈, 말 방어구, 이름표, 말 생성 알{*B*} +- 괴물과 동물이 새로 추가되었습니다 - 위더, 위더 해골, 마녀, 박쥐, 말, 당나귀와 노새{*B*} +- 지역 생성 기능이 새로 추가되었습니다 - 마녀 오두막.{*B*} +- 조명등 인터페이스가 추가되었습니다.{*B*} +- 말 인터페이스가 추가되었습니다.{*B*} +- 호퍼 인터페이스가 추가되었습니다.{*B*} +- 폭죽이 추가되었습니다 - 폭죽 인터페이스는 폭죽 스타나 폭죽 로켓을 만들 재료가 있을 때 작업대에서 사용할 수 있습니다.{*B*} +- '모험 모드'가 추가되었습니다 - 적절한 도구가 있어야지만 블록을 깨트릴 수 있습니다.{*B*} +- 다양한 새 사운드가 추가되었습니다.{*B*} +- 괴물과 동물, 아이템, 발사체는 이제 차원문을 통과할 수 있습니다.{*B*} +- 중계장치는 이제 다른 중계장치와 같이 측면에 동력을 공급해 잠길 수 있습니다.{*B*} +- 좀비와 해골은 이제 다른 무기와 방어구와 같이 생성할 수 있습니다.{*B*} +- 새로운 사망 메시지가 있습니다.{*B*} +- 괴물과 동물에게 이름표로 이름을 지어주고 보관함의 이름을 바꿔 메뉴가 열렸을 때 제목을 바꿀 수 있습니다.{*B*} +- 뼛가루는 더 이상 작물을 즉시 자라게 하지 않고, 대신 무작위로 단계별 성장을 촉진합니다.{*B*} +- 상자, 양조대, 디스펜서, 주크박스의 내용물을 묘사하는 레드스톤 신호는 레드스톤 비교 측정기를 바로 맞은 편에 놓아 탐지할 수 있습니다.{*B*} +- 디스펜서는 어떤 방향으로 놓을 수 있습니다.{*B*} +- 플레이어가 황금 사과를 먹으면 잠시 동안 추가로 '흡수' 체력이 주어집니다.{*B*} +- 한 지역에 오래 머무를수록 그 지역에서 생성하는 괴물은 더 힘들어집니다.{*B*} - - 아이템 가열이 끝나면 결과물 슬롯에서 소지품으로 옮길 수 있습니다. 다양한 재료를 실험해서 어떤 아이템이 만들어지는지 파악하십시오. + + 스크린샷 공유 - - 나무를 재료로 사용하면 숯이 만들어집니다. 화로에 연료를 넣은 다음 재료 슬롯에 나무를 넣으십시오. 화로에서 숯이 완성될 때까지는 다소 시간이 필요하므로, 자유롭게 다른 일을 하다가 나중에 돌아와서 진행 상태를 확인하십시오. + + 상자 - - 숯은 막대와 결합하여 횃불을 만들 수 있으며, 숯 자체로도 연료로 사용됩니다. + + 제작 - - 재료 슬롯에 모래를 넣으면 유리가 만들어집니다. 피신처에 창문을 달려면 유리를 만드십시오. + + 화로 - - 이것은 양조 인터페이스입니다. 여기서 다양한 효과를 지닌 물약을 만들 수 있습니다. + + 기본 - - {*B*} - 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} - 양조대 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + HUD - - 위 슬롯에 재료를 넣고 아래 슬롯에 물병을 넣어 물약을 양조합니다. 한 번에 3병을 동시에 양조할 수 있습니다. 조합 조건이 갖추어지면 양조가 시작되고 잠시 후 물약이 완성됩니다. + + 소지품 - - 물약을 만들기 위해서는 우선 물병이 있어야 만들 수 있습니다. 그 후 지하 사마귀를 추가해 '이상한 물약'을 만든 다음, 하나 이상의 다른 재료를 넣는 방식으로 물약 대부분을 만들 수 있습니다. + + 디스펜서 - - 물약을 만든 다음에도 물약의 효과를 바꿀 수 있습니다. 레드스톤 가루를 넣으면 효과 지속 시간이 길어지고, 발광석 가루를 넣으면 효과가 더욱 강해집니다. + + 효과부여 - - 발효 거미 눈을 넣으면 물약이 부패하여 반대 효과를 지니게 됩니다. 화약을 넣으면 던져서 주변에 효과를 적용할 수 있는 폭발 물약이 됩니다. + + 지하 차원문 - - 물병에 지하 사마귀를 넣고 그다음 마그마 크림을 넣어 '물약 - 화염 저항'을 만드십시오. + + 멀티 플레이 - - {*CONTROLLER_VK_B*} 버튼을 누르면 양조 인터페이스에서 나갑니다. + + 동물 농장 - - 이곳에는 양조대와 가마솥, 그리고 양조용 아이템이 들어 있는 상자가 있습니다. + + 동물 교배 - - {*B*} - 양조와 물약에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 양조와 물약에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 양조 - - 물약 양조의 첫 번째 단계는 물병을 만드는 것입니다. 상자에서 유리병을 꺼내십시오. + + deadmau5는 Minecraft를 좋아합니다! - - 가마솥에 들어 있는 물이나 물 블록을 사용해 유리병에 물을 채우십시오. 수원을 가리킨 상태에서 {*CONTROLLER_ACTION_USE*}를 누르면 물을 채웁니다. + + Pigman은 먼저 공격하지 않는 한 이쪽을 공격하지 않습니다. - - 가마솥의 물이 떨어지면 물 양동이로 다시 채울 수 있습니다. + + 플레이어는 게임 시작 지점을 변경할 수 있으며 침대에서 취침하여 시간을 새벽으로 건너뛸 수 있습니다. - - 양조대를 사용하여 '물약 - 화염 저항'을 만드십시오. 물병, 지하 사마귀와 마그마 크림이 필요합니다. + + Ghast가 쏘는 불덩이를 되받아치십시오! - - - 물약을 손에 든 상태에서 {*CONTROLLER_ACTION_USE*}를 길게 누르면 물약을 사용합니다. 일반 물약을 사용할 경우 물약을 마시면 효과가 자신에게 나타납니다. 폭발 물약을 사용할 경우 물약을 던지면 효과가 물약이 떨어진 곳 근처의 생물에게 나타납니다. - 일반 물약에 화약을 넣으면 폭발 물약을 만들 수 있습니다. - + + 밤에 불을 밝히려면 횃불을 만드십시오. 괴물들은 횃불 근처 지역에는 접근하지 않습니다. - - '물약 - 화염 저항'을 자신에게 사용하십시오. + + 광물 수레와 레일을 사용해서 목적지까지 더 빠르게 이동하십시오. - - 이제 화염과 용암에 대한 저항력이 생겼습니다. 지금까지 통과할 수 없었던 장소도 통과할 수 있습니다. + + 묘목을 심으면 자라서 나무가 됩니다. - - 이것은 효과부여 인터페이스입니다. 무기, 방어구 및 일부 도구에 효과를 부여할 수 있습니다. + + 차원문을 지으면 다른 차원의 세계인 지하로 여행을 떠날 수 있습니다. - - {*B*} - 효과부여 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 효과부여 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼를 누르십시오. + + 땅을 계속 위로 파거나 계속 아래로 파는 것은 그리 좋지 않습니다. - - 아이템에 효과를 부여하려면 우선 아이템을 효과부여 슬롯에 넣으십시오. 무기, 방어구 및 일부 도구에 효과를 부여하면 특별한 효과를 얻을 수 있습니다. 예를 들어 방어력이 더 강해지거나, 블록을 채굴할 때 더 많은 아이템을 얻을 수 있게 됩니다. + + 해골 뼈에서 얻을 수 있는 뼛가루는 작물을 즉시 자라게 하는 비료로 쓸 수 있습니다. - - 효과부여 슬롯에 아이템을 넣으면 오른쪽 버튼에 무작위로 부여할 효과가 표시됩니다. + + Creeper는 접근하면 폭발합니다. - - 버튼에 쓰인 숫자는 아이템에 해당 효과를 부여할 때 필요한 경험치입니다. 경험치가 부족할 때는 단추를 선택할 수 없습니다. + + {*CONTROLLER_VK_B*} 버튼을 누르면 지금 손에 들고 있는 아이템을 버립니다. - - 부여할 효과를 선택하고 {*CONTROLLER_VK_A*} 버튼을 누르면 아이템에 효과를 부여합니다. 부여할 효과 비용만큼 경험치가 줄어듭니다. + + 상황에 맞는 도구를 사용하십시오! - - 효과는 무작위로 부여되지만, 성능이 더 좋은 효과 몇 종류는 더 많은 경험치를 지불하는 것은 물론 효과부여대 주위를 책장으로 둘러싸 강화해야 얻을 수 있습니다. + + 횃불에 쓸 석탄이 없을 때는 화로 안의 나무에서 숯을 만들 수 있습니다. - - 여기에는 효과부여대와 효과부여에 사용할 수 있는 아이템이 있습니다. + + 돼지고기를 날로 먹는 것보다 요리해서 먹을 때 체력이 더 많이 회복됩니다. - - {*B*} - 효과부여에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 효과부여에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + + 낙원 난이도를 선택하면 체력이 자동으로 회복되고 밤에 괴물이 출몰하지 않습니다! - - 효과부여대를 사용하면 무기, 방어구 및 일부 도구에 특별한 효과를 부여할 수 있습니다. 예를 들어 블록을 채굴할 때 더 많은 아이템을 얻을 수 있는 효과나 방어력이 더 강해지는 효과 등이 있습니다. + + 늑대를 길들이려면 뼈를 먹이십시오. 길들인 늑대는 앉게 하거나 플레이어를 따르게 할 수 있습니다. - - 효과부여대 주변에 책장을 놓으면 효과부여대가 강화되어 더 높은 수준의 효과를 부여할 수 있습니다. + + 소지품 메뉴 밖으로 포인터를 옮기고 {*CONTROLLER_VK_A*} 버튼을 눌러 아이템을 버릴 수 있습니다. - - 아이템에 효과를 부여하려면 경험치가 필요합니다. 괴물 및 동물을 처치하면 나오는 경험치 구체를 모으거나, 광석을 채굴하거나, 동물을 교배하거나, 낚시를 하거나, 화로에서 특정 아이템을 녹이거나 요리하면 경험치를 얻을 수 있습니다. + + 새 다운로드 콘텐츠가 준비되었습니다! 주 메뉴의 Minecraft 상점에서 이용할 수 있습니다. - - 경험치 병을 사용해서도 경험치를 얻을 수 있습니다. 경험치 병을 던지면 병이 떨어진 곳에 경험치 구체가 나타납니다. + + Minecraft 상점의 캐릭터 팩으로 캐릭터의 외형을 바꿀 수 있습니다. 주 메뉴의 'Minecraft 상점'을 선택해 확인해 보십시오. - - 이곳에 있는 상자에는 효과가 부여된 아이템과 경험치 병, 그리고 효과부여대를 시험해 볼 수 있는 아이템이 들어 있습니다. + + 게임의 밝기를 높이거나 낮추려면 감마 설정을 변경하십시오. - - 광물 수레에 탑승했습니다. 수레에서 나가려면 포인터를 수레에 맞춘 다음 {*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*} + + 동물이 어떤 방향이든 20블록 이상 움직일 수 없으면 사라지지 않습니다. - - 다른 도구들과 마찬가지로, 낚싯대도 정해진 횟수만큼만 사용할 수 있습니다. 하지만 물고기 이외의 물건을 낚아도 사용 횟수는 줄어듭니다. 낚싯대를 사용해서 어떤 물건을 낚을 수 있는지, 또는 어떤 일이 일어나는지 확인해 보십시오. - {*FishingRodIcon*} + + 길들인 늑대는 꼬리를 보면 체력 상태를 알 수 있습니다. 기운을 회복시키려면 고기를 먹이십시오. - - 이것은 침대입니다. 밤에 침대를 가리킨 상태에서 {*CONTROLLER_ACTION_USE*}를 누르면 침대에서 잠을 자고 아침에 일어납니다.{*ICON*}355{*/ICON*} + + 화로를 이용하면 선인장을 초록 선인장 염료로 만들 수 있습니다. - - {*B*} - 침대에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 침대에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 플레이 방법 메뉴의 업데이트 정보 섹션에서 게임의 최신 업데이트 정보를 확인할 수 있습니다. - - 자는 도중에 괴물의 습격을 받지 않으려면 침대를 안전하고 조명이 충분한 곳에 두어야 합니다. 침대를 한 번 사용하면 게임 중에 사망했을 때 침대에서 부활합니다. - {*ICON*}355{*/ICON*} + + 음악은 C418이 만들었습니다! - - 게임 내에 다른 플레이어가 있을 때는 모든 플레이어가 동시에 침대에 들어야 잠을 잘 수 있습니다. - {*ICON*}355{*/ICON*} + + Notch가 누구인지 아십니까? - - 이곳에는 레드스톤과 피스톤으로 이루어진 간단한 회로가 있고, 회로를 연장할 수 있는 아이템이 든 상자가 있습니다. + + Mojang의 직원 수보다 Mojang이 받은 상의 수가 많습니다! - - {*B*} - 레드스톤 회로와 피스톤에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 레드스톤 회로와 피스톤에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 유명인들도 Minecraft를 즐깁니다! - - 레버, 버튼, 압력판, 레드스톤 횃불로 회로에 동력을 공급할 수 있습니다. 작동할 아이템에 직접 붙이거나 레드스톤 가루로 연결하십시오. + + Notch의 Twitter를 팔로우하는 사람은 100만 명이 넘습니다! - - 동력원을 설치한 위치와 방향에 따라 주변 블록에 주는 영향이 달라집니다. 예를 들면 블록 옆에 설치한 레드스톤 횃불은 해당 블록이 다른 동력원에서 동력을 공급받는다면 꺼질 수 있습니다. + + 스웨덴 사람들이 모두 금발은 아닙니다. Mojang 소속의 Jens 같이 붉은 머리도 있습니다! - - - 철제, 다이아몬드, 황금 곡괭이로 레드스톤을 채굴하면 레드스톤 가루를 얻을 수 있습니다. 레드스톤 가루를 사용하면 옆으로 15블록, 아래위로 1블록까지 동력을 운반할 수 있습니다. - {*ICON*}331{*/ICON*} - + + 언젠가는 업데이트가 있을 예정입니다! - - - 레드스톤 탐지기는 동력 운반 거리를 늘리거나 회로에 지연 기능을 부여할 수 있습니다. - {*ICON*}356{*/ICON*} - + + 두 개의 상자를 나란히 놓으면 큰 상자 하나를 만들 수 있습니다. - - - 동력이 공급되면 피스톤이 늘어나 최대 12블록까지 밀어냅니다. 끈끈이 피스톤은 줄어들 때 거의 모든 종류의 블록 1개를 다시 끌어옵니다. - {*ICON*}33{*/ICON*} - + + 양털로 만든 건축 구조물이 야외에 있으면 번개 때문에 불이 붙을 수도 있으므로 조심해야 합니다. - - 이곳의 상자에는 피스톤으로 회로를 만들 수 있는 부품이 들어 있습니다. 이곳에 있는 회로를 완성하거나 자신만의 회로를 만드십시오. 튜토리얼 지역 밖에는 더 많은 예시가 있습니다. + + 용암 한 양동이로 화로에서 블록 100개를 녹일 수 있습니다. - - 이곳에는 지하로 통하는 차원문이 있습니다! + + 연주 음은 소리 블록 아래 재질에 따라 달라집니다. - - {*B*} - 지하 차원문에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 지하 차원문에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 용암은 재료 블록이 제거되어도 완전히 사라지는 데 시간이 걸립니다. - - 차원문은 흑요석 블록을 4블록 길이에 5블록 높이로 쌓아서 만듭니다. 모서리 블록은 없어도 됩니다. + + Ghast가 쏘는 불덩이에 내성을 가지는 조약돌은 경계 관문을 만드는 데 적합합니다. - - 지하 차원문을 작동하려면 부싯돌과 부시를 사용하여 외형 안쪽의 흑요석 블록에 불을 붙여야 합니다. 차원문 외형이 무너지거나, 근처에서 폭발이 일어나거나, 차원문 안에 액체가 들어가면 차원문 작동이 멈출 수 있습니다. + + 횃불, 발광석, 호박등과 같이 광원으로 사용 가능한 블록은 눈과 얼음을 녹입니다. - - 지하 차원문을 사용하려면 안으로 들어가십시오. 화면이 보라색으로 변하며 소리가 날 것입니다. 잠시 후 다른 차원으로 이동하게 됩니다. + + 좀비와 해골은 물속에 있으면 대낮에도 살아 움직입니다. - - 용암으로 가득찬 지하 세계는 위험한 곳입니다. 하지만 불을 붙이면 영원히 타는 지하 바위와 빛을 뿜는 발광석을 얻을 수 있습니다. + + 닭은 5분에서 10분마다 달걀을 낳습니다. - - 지하의 1블록 거리는 지상의 3블록 거리와 같으므로, 지하 월드에서는 지상에서보다 더 빨리 이동할 수 있습니다. + + 흑요석은 다이아몬드 곡괭이로만 채굴할 수 있습니다. - - 현재 창작 모드 상태입니다. + + Creeper를 처치하면 손쉽게 화약을 얻을 수 있습니다. - - {*B*} - 창작 모드에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 창작 모드에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 늑대를 공격하면 근처에 있는 늑대들이 적대적으로 변해 플레이어를 공격합니다. Pigman 좀비도 같은 특성을 가집니다. - - 창작 모드에서는 모든 아이템과 블록을 무한정 사용할 수 있습니다. 도구를 사용하지 않아도 클릭 한 번만으로 블록을 파괴할 수 있으며, 무적 상태인데다 날 수도 있습니다. + + 늑대는 지하로 내려갈 수 없습니다. - - {*CONTROLLER_ACTION_CRAFTING*}를 눌러 창작 소지품 인터페이스를 엽니다. + + 늑대는 Creeper를 공격하지 않습니다. - - 구멍 반대쪽으로 나가면 계속합니다. + + 돌로 된 블록이나 광석을 채굴할 때 쓰입니다. - - 창작 모드 튜토리얼을 완료했습니다. + + 케이크 제조법에 사용되며 물약을 양조하는 재료로 사용됩니다. - - 이 지역에는 농장이 있습니다. 농장에서 작물을 재배하면 음식 및 기타 아이템의 재료를 얻을 수 있습니다. + + 켜거나 끌 때 전기를 보냅니다. 다시 조작하기 전까지 켜지거나 꺼진 상태로 있습니다. - - {*B*} - 재배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 재배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 주기적으로 전기를 보내거나, 블록 옆에 연결하면 송/수신기 역할을 합니다. +약한 조명으로 사용할 수도 있습니다. - - 밀, 호박, 수박은 씨앗을 심어서 재배합니다. 길게 자란 풀을 자르거나 밀을 수확하면 밀 씨앗을 얻을 수 있습니다. 호박 및 수박을 가공하면 호박씨 및 수박씨를 얻을 수 있습니다. + + {*ICON_SHANK_01*}를 2만큼 회복하며 황금 사과를 만드는 데 사용합니다. - - 씨를 심으려면 쟁기를 사용해서 흙 블록을 농지로 만들어야 합니다. 주변에 수원이 있으면 농지에 계속 수분을 공급하므로 작물이 빨리 자라며, 해당 지역에 불이 켜진 상태를 유지합니다. + + {*ICON_SHANK_01*}를 2만큼 회복하며 4초 동안 체력이 회복됩니다. 사과와 금덩이로 만듭니다. - - 밀은 자라는 동안 여러 단계를 거칩니다. 수확할 준비가 되었을 때는 어둡게 변합니다.{*ICON*}59:7{*/ICON*} + + 그대로 먹으면 {*ICON_SHANK_01*}를 2만큼 회복하지만 병에 걸릴 수 있습니다. - - 호박 및 수박은 씨를 심은 블록 옆에 또 다른 블록 하나가 필요합니다. 줄기가 다 자란 후 옆의 빈 블록에 열매를 맺게 됩니다. + + 레드스톤 회로에서 중계장치, 지연장치 또는 다이오드 역할을 합니다. - - 사탕수수는 물 블록 옆에 있는 풀, 흙 또는 모래 블록에 심어야 합니다. 사탕수수 블록을 자르면 사탕수수 위에 놓인 블록이 모두 떨어지게 됩니다.{*ICON*}83{*/ICON*} + + 광물 수레가 가는 길에 사용됩니다. - - 선인장은 모래에 심어야 하며 최대 세 블록 높이까지 자랍니다. 사탕수수와 마찬가지로 맨 아래 블록을 파괴하면 그 위의 블록이 떨어져 획득할 수 있습니다.{*ICON*}81{*/ICON*} + + 동력을 공급하면 그 위를 지나가는 광물 수레의 속도를 올려줍니다. 동력이 끊기면 광물 수레를 멈춰 세웁니다. - - 버섯은 희미하게 불이 켜진 지역에 심어야 합니다. 버섯을 심으면 주변의 희미하게 불이 켜진 블록으로 퍼져 나갑니다.{*ICON*}39{*/ICON*} + + 압력판처럼 사용되지만 광물 수레로만 작동시킬 수 있습니다. 동력이 공급되면 레드스톤 신호를 보냅니다. - - 뼛가루를 사용하면 작물을 완전히 자란 상태로 만들거나 버섯을 거대 버섯으로 만들 수 있습니다.{*ICON*}351:15{*/ICON*} + + 누르면 전기를 보냅니다. 버튼을 떼면 1초 정도 작동하다가 닫힙니다. - - 재배 튜토리얼을 완료했습니다. + + 레드스톤으로 전기를 공급하면 아이템을 넣어 무작위 순서로 발사할 수 있습니다. - - 이곳에는 동물이 우리 안에 들어 있습니다. 동물을 교배하면 새끼 동물을 얻을 수 있습니다. + + 작동시키면 음을 연주합니다. 때리면 음의 높낮이가 바뀝니다. 다른 블록 위에 올려놓으면 연주 음의 종류가 변경됩니다. - - - {*B*} - 교배에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 교배에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + + {*ICON_SHANK_01*}를 2.5만큼 회복합니다. 화로에서 날생선을 조리해서 만듭니다. - - 동물을 교배시키려면 각 동물에 적합한 먹이를 먹여 '사랑 모드'로 만들어야 합니다. + + {*ICON_SHANK_01*}를 1만큼 회복합니다. - - 소, Mooshroom, 양에게는 밀을, 돼지에게는 당근을 먹이고 닭에게는 밀 씨앗이나 지하 사마귀를 먹이십시오. 늑대에겐 모든 종류의 고기를 먹일 수 있습니다. 동물은 근처에 사랑 모드 상태이며 종류가 같은 동물이 있는지 찾아다니게 됩니다. + + {*ICON_SHANK_01*}를 1만큼 회복합니다. - - 사랑 모드 상태이며 종류가 같은 동물이 두 마리 만나게 되면 서로 입을 맞추게 되고, 잠시 후 새끼 동물이 태어납니다. 새끼 동물은 다 자라기 전까지 잠시 부모 동물을 따라다닙니다. + + {*ICON_SHANK_01*}를 3만큼 회복합니다. - - 사랑 모드가 끝난 동물은 5분간 다시 사랑 모드 상태가 될 수 없습니다. + + 활에 장전하여 사용합니다. - - 플레이어가 손에 먹이를 들고 있으면 일부 동물은 플레이어를 따라다닙니다. 동물을 한데 모아 교배할 때 편리합니다.{*ICON*}296{*/ICON*} + + {*ICON_SHANK_01*}를 2.5만큼 회복합니다. - - - 야생 늑대에게 뼈를 주면 길들일 수 있습니다. 길이 든 늑대 주위에는 사랑의 하트가 나타납니다. 길들인 늑대는 앉으라고 명령하지 않는 한 플레이어를 따라다니며 보호합니다. - + + {*ICON_SHANK_01*}를 1만큼 회복합니다. 6번까지 사용할 수 있습니다. - - 동물과 교배 튜토리얼을 완료했습니다. + + 그대로 먹으면 {*ICON_SHANK_01*}를 1만큼 회복하지만 병에 걸릴 수 있습니다. 화로에서 조리할 수 있습니다. - - 이 지역에서는 호박과 블록으로 눈 골렘과 철 골렘을 만들 수 있습니다. + + 그대로 먹어서 {*ICON_SHANK_01*}를 1.5만큼 회복하거나 화로에서 조리할 수 있습니다. - - {*B*} - 골렘에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 골렘에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + {*ICON_SHANK_01*}를 4만큼 회복합니다. 화로에서 돼지 날고기를 조리해서 만듭니다. - - 골렘은 여러 개 쌓인 블록 위에 호박을 놓아 만들 수 있습니다. + + 그대로 먹어서 {*ICON_SHANK_01*}를 1만큼 회복하거나 화로에서 조리할 수 있습니다. 오셀롯을 길들이기 위한 먹이로 사용할 수도 있습니다. - - 눈 골렘은 2개의 눈 블록을 위아래로 쌓고 그 위에 호박을 놓아 만들 수 있습니다. 눈 골렘은 적에게 눈덩이를 던집니다. + + {*ICON_SHANK_01*}를 3만큼 회복합니다. 화로에서 닭 날고기를 조리해서 만듭니다. - - 철 골렘은 보시는 바와 같이 4개의 철 블록을 놓고 가운데 블록 위에 호박을 놓아 만들 수 있습니다. 철 골렘은 적을 공격합니다. + + 그대로 먹어서 {*ICON_SHANK_01*}를 1.5만큼 회복하거나 화로에서 조리할 수 있습니다. - - 철 골렘은 기본적으로 마을을 보호합니다. 사용자가 마을 사람을 공격하면 철 골렘이 사용자를 공격합니다. + + {*ICON_SHANK_01*}를 4만큼 회복합니다. 화로에서 소 날고기를 조리해서 만듭니다. - - 튜토리얼을 완료하기 전에는 이 지역을 벗어날 수 없습니다. + + 레일을 따라서 플레이어나 동물, 괴물을 이동시킵니다. - - 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 흙이나 모래 같이 부드러운 재질의 재료를 얻으려면 삽을 써야 합니다. + + 양털을 밝은 파란색으로 염색합니다. - - 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 나무 둥치를 베려면 도끼를 써야 합니다. + + 양털을 청록색으로 염색합니다. - - 재료를 확보할 때는 그에 맞는 도구를 사용하는 것이 좋습니다. 돌과 광물을 채굴할 때는 곡괭이를 써야 합니다. 특정 블록에서 자원을 채굴하려면 더 좋은 재질의 곡괭이가 필요할 수도 있습니다. + + 양털을 보라색으로 염색합니다. - - 특정 도구는 적을 공격하는 데 유용합니다. 검을 사용해서 공격해 보십시오. + + 양털을 라임색으로 염색합니다. - - 힌트: {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손 또는 손에 든 도구로 채굴하거나 벌목합니다. 일부 블록은 도구를 사용해야 채굴할 수 있습니다. + + 양털을 회색으로 염색합니다. - - 사용하고 있는 도구가 손상됐습니다. 도구는 사용할 때마다 손상되며, 나중에는 망가집니다. 아이템 아래쪽의 색상 눈금을 보면 현재 손상된 정도를 알 수 있습니다. + + 양털을 밝은 회색으로 염색합니다. +(참고: 밝은 회색 염료는 회색 염료와 뼛가루를 섞어도 만들 수 있습니다. 이 방법을 쓰면 먹물 주머니 하나로 회색 염료를 3개가 아니라 4개 만들 수 있습니다.) - - 수면으로 헤엄치려면 {*CONTROLLER_ACTION_JUMP*}를 길게 누르십시오. + + 양털을 자주색으로 염색합니다. - - 이곳에는 궤도가 있고 그 위에 광물 수레가 있습니다. 광물 수레에 타려면 포인터를 수레에 맞추고 {*CONTROLLER_ACTION_USE*}를 누릅니다. 단추에 포인터를 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 광물 수레가 움직입니다. + + 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. - - 강 옆의 상자에는 배가 있습니다. 배를 사용하려면 포인터를 물에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르십시오. 포인터를 배에 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 배에 탑니다. + + 책과 지도의 재료입니다. - - 연못 옆의 상자에는 낚싯대가 있습니다. 상자에서 낚싯대를 꺼내 손에 든 아이템으로 선택한 다음 사용하십시오. + + 책장을 만들거나 효과가 부여된 책에 효과를 부여하는 데 사용됩니다. - - 이 고급 피스톤 기계장치는 자동 수리 기능을 지닌 다리를 만듭니다! 버튼을 눌러 작동시킨 다음 각 부품이 어떻게 사용되었는지 더 알아보십시오. + + 양털을 파란색으로 염색합니다. - - 아이템을 옮기는 중에 포인터가 인터페이스를 벗어나면 아이템을 버릴 수 있습니다. + + 음악 디스크를 재생합니다. - - 이 아이템을 만들 재료가 부족합니다. 왼쪽 아래의 상자에는 이 아이템을 만드는 데 필요한 재료가 표시됩니다. + + 매우 강력한 도구나 무기, 방어구를 만드는 데 사용합니다. - - 축하합니다. 튜토리얼을 마쳤습니다. 이제 게임 시간이 정상적으로 흐르며, 괴물이 출몰하는 밤이 오기까지 시간이 얼마 남지 않았습니다! 피신처를 완성하십시오! + + 양털을 주황색으로 염색합니다. - - {*EXIT_PICTURE*} 먼 곳을 탐험할 때, 작은 성으로 연결된 계단을 이용하십시오. 계단은 광부의 피신처 근처에 있습니다. - + + 양에게서 얻어냅니다. 염료로 색을 바꿀 수 있습니다. - - 알림: + + 건설 재료로 쓰입니다. 염료로 색을 바꿀 수 있지만, 양털은 양에게서 쉽게 얻을 수 있으므로 권장하지는 않습니다. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + 양털을 검은색으로 염색합니다. - - 최신 버전에는 튜토리얼 월드에서 갈 수 있는 새로운 지역 등의 다양한 새 기능이 추가되었습니다. + + 레일을 따라서 물건을 이동시킵니다. - - {*B*}튜토리얼을 플레이하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 튜토리얼을 건너뛰려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 석탄을 안에 넣으면 레일을 따라 움직이며 다른 광물 수레를 밀어줍니다. - - 이곳에는 낚시, 배, 피스톤, 레드스톤에 대해 알려주는 지역이 있습니다. + + 헤엄치는 것보다 물에서 빨리 이동할 수 있습니다. - - 이 지역 바깥에는 건설, 재배, 광물 수레와 궤도, 효과부여, 양조, 교환, 단조 등의 예시가 있습니다! + + 양털을 초록색으로 염색합니다. - - 음식 막대가 다 떨어지면 체력이 회복하지 않습니다. + + 양털을 빨간색으로 염색합니다. - - {*B*} - 음식 막대와 음식 먹는 법에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 음식 막대와 음식 먹는 법에 대해 이미 알고 있다면{*CONTROLLER_VK_B*} 버튼을 누르십시오. + + 작물이나 나무, 긴 잡초, 거대 버섯, 꽃을 즉시 성장시킵니다. 염료 재료로도 사용합니다. - - 선택 + + 양털을 분홍색으로 염색합니다. - - 사용 + + 양털을 갈색으로 염색하는 데, 쿠키의 재료로도 사용되며 코코아 콩을 재배하는 데 사용됩니다. - - 뒤로 + + 양털을 은색으로 염색합니다. - - 나가기 + + 양털을 노란색으로 염색합니다. - - 취소 + + 화살과 함께 사용하여 원거리 공격을 합니다. - - 참가 취소 + + 착용 시 5의 방어력을 얻습니다. - - 온라인 게임 목록 새로 고침 + + 착용 시 3의 방어력을 얻습니다. - - 파티 게임 + + 착용 시 1의 방어력을 얻습니다. - - 모든 게임 + + 착용 시 5의 방어력을 얻습니다. - - 그룹 변경 + + 착용 시 2의 방어력을 얻습니다. - - 소지품 표시 + + 착용 시 2의 방어력을 얻습니다. - - 설명 표시 + + 착용 시 3의 방어력을 얻습니다. - - 재료 표시 + + 빛나는 주괴입니다. 주괴로 도구를 만들면 주괴와 재질이 같은 도구가 제작됩니다. 화로에서 광석을 녹여 만듭니다. - - 제작 + + 주괴, 보석, 염료를 설치 가능한 블록으로 만들 수 있게 해줍니다. 값비싼 건설용 블록으로 쓰거나 광물을 간편하게 보관하는 데 사용됩니다. - - 만들기 + + 플레이어나 동물 또는 괴물이 밟으면 전기를 보냅니다. 나무 압력판은 위쪽에 물체를 떨어뜨려도 작동합니다. - - 획득/놓기 + + 착용 시 8의 방어력을 얻습니다. - - 획득 + + 착용 시 6의 방어력을 얻습니다. - - 모두 획득 + + 착용 시 3의 방어력을 얻습니다. - - 절반 획득 + + 착용 시 6의 방어력을 얻습니다. - - 놓기 + + 철문은 레드스톤, 버튼 또는 스위치로만 열 수 있습니다. - - 모두 놓기 + + 착용 시 1의 방어력을 얻습니다. - - 하나 놓기 + + 착용 시 3의 방어력을 얻습니다. - - 버리기 + + 나무로 된 블록을 손을 사용할 때보다 더 빨리 잘라냅니다. - - 모두 버리기 + + 흙과 잡초 블록을 갈아엎어서 작물을 기를 수 있게 만듭니다. - - 하나 버리기 + + 나무문은 사용하거나 때려서 또는 레드스톤으로 열 수 있습니다. - - 교체 + + 착용 시 2의 방어력을 얻습니다. - - 빠른 이동 + + 착용 시 4의 방어력을 얻습니다. - - 빠른 선택 취소 + + 착용 시 1의 방어력을 얻습니다. - - 이것은 무엇입니까? + + 착용 시 2의 방어력을 얻습니다. - - Facebook에 공유 + + 착용 시 1의 방어력을 얻습니다. - - 필터 변경 + + 착용 시 2의 방어력을 얻습니다. - - 친구 요청 보내기 + + 착용 시 5의 방어력을 얻습니다. - - 페이지 내림 + + 작은 계단을 만드는 데 사용됩니다. - - 페이지 올림 + + 버섯죽을 담아두는 데 사용합니다. 죽을 먹어도 그릇은 남습니다. + + + 물이나 용암, 우유를 담아두거나 운반하는 데 쓰입니다. - - 다음 + + 물을 저장하고 옮기는 데 사용합니다. - - 이전 + + 자신이나 다른 플레이어가 입력한 텍스트를 표시합니다. - - 플레이어 추방 + + 횃불보다 더 밝은 빛을 만들어냅니다. 얼음이나 눈을 녹이며, 물속에서 사용이 가능합니다. - - 염색 + + 폭발을 일으킵니다. 설치한 다음, 부싯돌과 부시를 사용하거나 전기를 이용해 폭파할 수 있습니다. - - 채굴 + + 용암을 저장하고 옮기는 데 사용합니다. - - 먹이기 + + 태양과 달의 위치를 표시합니다. - - 길들이기 + + 시작 지점을 표시합니다. - - 치료하기 + + 지도를 들고 있을 동안 탐험한 지역의 이미지를 만들어냅니다. 길을 찾는 데 사용할 수 있습니다. - - 앉기 + + 우유를 저장하고 옮기는 데 사용합니다. - - 나를 따르라 + + 불꽃을 일으키고, TNT를 폭파하고, 차원문을 여는 데 사용합니다. - - 꺼내기 + + 물고기를 잡을 수 있습니다. - - 비우기 + + 사용하거나 때리거나 레드스톤을 이용해 작동시킵니다. 작동 방식은 일반 문과 같지만 개별적 블록으로 간주되며, 땅과 수평인 형태로 열립니다. - - 안장 + + 건설 재료로 쓰거나 다양한 물건의 재료로 사용됩니다. 어떤 형태의 나무로부터 만들어질 수 있습니다. - - 놓기 + + 건설 재료로 사용됩니다. 일반 모래와 달리 중력의 영향을 받지 않습니다. - - 때리기 + + 건설 재료로 사용됩니다. - - 젖 짜기 + + 긴 계단을 만드는 데 쓰입니다. 발판 2개를 쌓으면 보통 크기의 2단 계단 블록이 만들어집니다. - - 수집 + + 긴 계단을 만드는 데 사용됩니다. 각 계단의 꼭대기에 있는 두 개의 발판은 보통 크기의 발판 블록을 만들어냅니다. - - 먹기 + + 빛을 만드는 데 사용합니다. 눈과 얼음도 녹일 수 있습니다. - - 잠자기 + + 횃불, 화살, 표지판, 사다리, 울타리를 만들거나 무기 또는 도구의 손잡이로 사용됩니다. - - 일어나기 + + 블록과 아이템을 넣어 보관합니다. 상자 2개를 나란히 놓으면 용량이 2배 큰 상자가 만들어집니다. - - 재생 + + 뛰어넘을 수 없는 방어벽으로 사용됩니다. 플레이어나 동물, 괴물에 대해서는 1.5배 높이의 블록으로 간주되지만 다른 블록에 대해서는 높이가 같은 것으로 간주됩니다. - - 타기 + + 수직 경사를 오를 때 사용합니다. - - 배 타기 + + 밤에 모든 플레이어가 침대에 들면 시간을 앞당겨서 아침으로 만들며, 플레이어 생성 지점을 바꿉니다. +침대 제작에 사용된 양털의 색과 상관없이, 침대의 색상은 모두 같습니다. - - 성장 + + 일반적인 제작보다 더 다양한 아이템을 선택해 제작할 수 있게 해줍니다. - - 수면으로 헤엄치기 + + 광석을 녹이고 숯과 유리를 만들며, 생선과 돼지고기를 요리하는 데 사용합니다. - - 열기 + + 철제 도끼 - - 높낮이 변경 + + 레드스톤 램프 - - 폭파 + + 정글 나무 계단 - - 읽기 + + 자작나무 계단 - - 매달기 + + 현재 컨트롤 - - 던지기 + + 두개골 - - 심기 + + 코코아 - - 경작 + + 전나무 계단 - - 수확 + + 용의 알 - - 계속 + + Ender 돌 - - 정식 버전 게임 구매 + + Ender 차원문 외형 - - 저장 게임 삭제 + + 사암 계단 - - 삭제 + + 양치식물 - - 옵션 + + 관목 - - 친구 초대 + + 배치 - - 수락 + + 제작 - - 털 깎기 + + 사용 - - 레벨 차단 + + 행동 - - 캐릭터 선택 + + 살금살금 걷기/아래로 비행 - - 점화 + + 살금살금 걷기 - - 캐릭터 찾기 + + 버리기 - - 정식 버전 설치 + + 아이템 교체 - - 평가판 설치 + + 일시 중지 - - 설치 + + 보기 - - 재설치 + + 이동/질주 - - 저장 옵션 + + 소지품 - - 명령 실행 + + 점프/위로 비행 - - 창작 + + 점프 - - 재료 이동 + + Ender 차원문 - - 연료 이동 + + 호박 줄기 - - 도구 움직이기 + + 수박 - - 방어구 이동 + + 유리 판자 - - 무기 이동 + + 울타리 문 - - 장비하기 + + 덩굴 - - 당기기 + + 수박 줄기 - - 놓기 + + 철 막대 - - 특권 + + 금이 간 돌 벽돌 - - 막기 + + 이끼 낀 돌 벽돌 - - 페이지 위로 + + 돌 벽돌 - - 페이지 아래로 + + 버섯 - - 사랑 모드 + + 버섯 - - 마시기 + + 깎아놓은 돌 벽돌 - - 회전 + + 벽돌 계단 - - 숨기기 + + 지하 사마귀 - - 모든 슬롯 선택 취소 + + 지하 벽돌 계단 - - 확인 + + 지하 벽돌 울타리 - - 취소 + + 가마솥 - - Minecraft 상점 + + 양조대 - - 진행 중인 게임을 종료하고 새 게임에 참가하시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + + 효과부여대 - - 게임 나가기 + + 지하 벽돌 - - 게임 저장 + + Silverfish 조약돌 - - 저장하지 않고 나가기 + + Silverfish 돌 - - 현재 월드에서 이전에 저장한 내용을 현재 버전으로 덮어쓰시겠습니까? + + 돌 벽돌 계단 - - 저장하지 않고 나가시겠습니까? 이 월드의 진행 상황이 모두 사라집니다! + + 수련잎 - - 게임 시작 + + 균사체 - - 손상된 저장 데이터 + + Silverfish 돌 벽돌 - - 저장 데이터가 손상되었습니다. 삭제하시겠습니까? + + 카메라 모드 변경 - - 게임에 참가한 모든 플레이어의 연결을 끊고, 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + + 음식 막대에 {*ICON_SHANK_01*}가 9칸 이상일 때는 체력을 잃어도 자동으로 다시 회복됩니다. 음식을 먹으면 음식 막대가 다시 차오릅니다. - - 저장하고 나가기 + + 이동, 채광 및 공격을 하면 음식 막대 {*ICON_SHANK_01*}를 소비합니다. 질주하거나 질주 점프를 하면 일반적으로 걷거나 달리는 것보다 더 많이 음식 막대를 소비합니다. - - 저장하지 않고 나가기 + + 아이템을 수집하고 제작하면 소지품이 찹니다.{*B*} + 소지품을 열려면 {*CONTROLLER_ACTION_INVENTORY*}을 누르십시오. - - 주 메뉴로 나가시겠습니까? 저장하지 않은 진행 상황은 사라집니다. + + 게임에서 획득한 나무는 판자로 만들 수 있습니다. 판자를 만들려면 제작 인터페이스를 여십시오.{*PlanksIcon*} - - 주 메뉴로 나가시겠습니까? 게임 진행 내용을 잃게 됩니다! + + 음식 막대가 낮고 체력을 잃은 상태입니다. 소지품에 있는 스테이크를 먹으면 음식 막대가 차오르고 체력이 회복되기 시작합니다.{*ICON*}364{*/ICON*} - - 새 월드 만들기 + + 손에 음식 아이템을 들고 있을 때 {*CONTROLLER_ACTION_USE*}를 길게 누르면 음식을 먹어서 음식 막대를 채웁니다. 음식 막대가 가득 찬 상태에서는 음식을 먹을 수 없습니다. - - 튜토리얼 진행 + + {*CONTROLLER_ACTION_CRAFTING*}를 눌러 제작 인터페이스를 엽니다. - - 튜토리얼 + + 질주하려면 {*CONTROLLER_ACTION_MOVE*}을 앞으로 빨리 두 번 누르십시오. {*CONTROLLER_ACTION_MOVE*}을 계속 누르고 있으면 캐릭터의 질주 시간이나 음식이 다 떨어질 때까지 계속 질주합니다. - - 월드 이름 지정 + + {*CONTROLLER_ACTION_MOVE*}으로 이동합니다. - - 월드 이름을 입력하십시오. + + {*CONTROLLER_ACTION_LOOK*}로 위와 아래, 주변을 둘러봅니다. - - 월드 생성 시드를 입력하십시오. + + {*CONTROLLER_ACTION_ACTION*}를 길게 눌러서 나무 블록 4개(나무둥치)를 베어보십시오. {*B*}블록이 파괴되고 공중에 뜬 형태로 아이템이 나타나면, 다가가서 집을 수 있습니다. 집은 아이템은 소지품에 표시됩니다. - - 저장된 월드 불러오기 + + {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 손이나 도구를 사용해 땅을 파거나 나무를 벱니다. 특정 블록은 도구를 만들어야 파낼 수 있습니다. - - START를 눌러 게임에 참가하세요. + + {*CONTROLLER_ACTION_JUMP*}를 눌러 점프합니다. - - 게임에서 나가는 중 + + 많은 아이템들은 여러 단계를 거쳐 제작됩니다. 이제 판자를 가지고 있으므로 더 다양한 아이템을 만들 수 있습니다. 작업대를 만들어 보십시오.{*CraftingTableIcon*} - - 오류가 발생했습니다. 주 메뉴로 돌아갑니다. + + + 밤은 순식간에 찾아오며, 준비하지 않은 상태로 밖에 나가면 위험합니다. 방어구와 무기를 만들어 사용할 수 있지만, 안전한 피신처를 찾는 것이 더 좋습니다. + - - 연결 실패 + + 보관함 열기 - - 연결 끊어짐 + + 곡괭이는 돌이나 광물처럼 단단한 블록을 더 빨리 파게 해줍니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있으며, 더 단단한 재료도 파낼 수 있습니다. 나무 곡괭이를 만드십시오.{*WoodenPickaxeIcon*} - - 서버 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. + + 곡괭이를 사용해서 돌 블록을 채굴하십시오. 돌 블록을 채굴하면 조약돌이 나옵니다. 조약돌 8개를 모으면 화로를 만들 수 있습니다. 돌 블록에 도달하려면 흙을 파야 할 수도 있으며, 이때는 삽을 사용하십시오.{*StoneIcon*} - - 서버 연결 끊김 + + + 피신처를 세울 자원을 모아야 합니다. 벽과 지붕은 아무 블록이나 사용해도 되지만 문과 창문, 조명을 설치하려면 특정 재료가 필요합니다. + - - 게임에서 추방되었습니다. + + + 근처에 버려진 광부의 피신처가 있습니다. 이곳이라면 밤을 안전하게 보낼 수 있습니다. + - - 비행으로 인해 게임에서 추방되었습니다. + + 도끼를 사용하면 나무와 나무 블록을 더 빨리 벱니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있습니다. 나무 도끼를 만드십시오.{*WoodenHatchetIcon*} - - 연결 시도 시간이 초과했습니다. + + 아이템을 사용하거나, 조작하거나, 내려놓으려면 {*CONTROLLER_ACTION_USE*}를 누르십시오. 내려놓은 아이템에 올바른 도구를 사용하여 채굴 동작을 취하면 아이템을 다시 집을 수 있습니다. - - 서버가 꽉 찼습니다. + + {*CONTROLLER_ACTION_LEFT_SCROLL*} 과{*CONTROLLER_ACTION_RIGHT_SCROLL*}로 손에 들고 있는 아이템을 다른 아이템으로 바꿀 수 있습니다. - - 호스트가 게임에서 나갔습니다. + + 블록에서 아이템을 더 빨리 얻으려면 해당 작업에 맞는 도구를 만들어야 합니다. 일부 도구는 막대로 된 손잡이가 달려 있습니다. 막대를 몇 개 만들어 보십시오.{*SticksIcon*} - - 이 게임에 참가한 친구가 없으므로 게임에 참가할 수 없습니다. + + 삽을 사용하면 흙이나 눈처럼 부드러운 블록을 더 빨리 파냅니다. 재료를 많이 모을수록 작업 속도와 내구력이 더 뛰어난 도구를 만들 수 있습니다. 나무 삽을 만드십시오.{*WoodenShovelIcon*} - - 예전에 호스트가 자신을 추방했기 때문에 게임에 참가할 수 없습니다. + + 포인터를 작업대에 맞추고 {*CONTROLLER_ACTION_USE*}를 눌러 여십시오. - - 참가하려는 플레이어가 이 게임의 이전 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. + + 작업대를 선택했으면 포인터를 원하는 곳에 둔 다음 {*CONTROLLER_ACTION_USE*}를 눌러 작업대를 놓으십시오. - - 참가하려는 플레이어가 이 게임의 다음 버전을 플레이하고 있으므로 게임에 참가할 수 없습니다. + + Minecraft는 블록을 배치하여 무엇이든 상상한 대로 만들 수 있는 게임입니다. +밤에는 괴물이 출몰하므로, 그에 대비하여 피신처를 준비해둬야 합니다. - - 새 월드 + + - - 상품을 획득했습니다! + + - - 만세! Minecraft의 Steve가 그려진 게이머 사진을 획득했습니다! + + - - 만세! Creeper가 그려진 게이머 사진을 획득했습니다! + + - - 정식 버전 게임 구매 + + - - 현재 게임은 평가판 버전입니다. 게임을 저장하려면 정식 버전이 필요합니다. -지금 정식 버전 게임을 구매하시겠습니까? + + - - 잠시 기다려 주십시오. + + - - 결과 없음 + + 배치 1 - - 필터: + + 이동(비행 시) - - 친구 + + 플레이어/초대 - - 내 점수 + + - - 전체 + + 배치 3 - - 명단: + + 배치 2 - - 순위 + + - - 레벨 저장 준비 중 + + - - 이것저것 준비 중… + + - - 마무리 중… + + - - 지형 구축 중 + + {*B*}{*CONTROLLER_VK_A*} 버튼을 누르면 튜토리얼을 시작합니다.{*B*} + 게임을 시작할 준비가 되었으면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 월드 시뮬레이션 중 + + {*B*}{*CONTROLLER_VK_A*} 버튼을 누르면 계속합니다. - - 서버 시동 중 + + - - 출현 지역 생성 중 + + - - 출현 지역 불러오는 중 + + - - 지하 진입 중 + + - - 지상 진입 중 + + - - 재생성 중 + + - - 레벨 생성 중 + + - - 레벨 불러오는 중 + + - - 플레이어 저장 중 + + Silverfish 블록 - - 호스트에 연결 중 + + 돌 발판 - - 지형 다운로드 중 + + 철을 저장하는 간편한 방법입니다. - - 오프라인 게임으로 전환하는 중 + + 철 블록 - - 호스트가 게임을 저장하는 동안 기다리십시오. + + 참나무 발판 - - Ender에 들어가기 + + 사암 발판 - - Ender에서 나가기 + + 돌 발판 - - 이 침대는 주인이 있습니다. + + 황금을 저장하는 간편한 방법입니다. - - 잠은 밤에만 잘 수 있습니다. + + - - %s님이 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. + + 흰색 양털 - - 침대가 사라졌거나 장애물이 막고 있습니다. + + 주황색 양털 - - 휴식을 취할 때가 아닙니다. 근처에 괴물이 있습니다. + + 황금 블록 - - 침대에서 자고 있습니다. 시간을 새벽으로 건너뛰려면 모든 플레이어가 잠들어야 합니다. + + 버섯 - - 도구 및 무기 + + 장미 - - 무기 + + 조약돌 발판 - - 식량 + + 책장 - - 구조물 + + TNT - - 방어구 + + 벽돌 - - 기계장치 + + 횃불 - - 이동수단 + + 흑요석 - - 장식물 + + 이끼 낀 돌 - - 블록 짓기 + + 지하 벽돌 발판 - - 레드스톤 및 운송 + + 참나무 발판 - - 기타 + + 돌 벽돌 발판 - - 양조 + + 벽돌 발판 - - 도구, 무기 및 방어구 + + 정글 나무 발판 - - 재료 + + 자작나무 발판 - - 로그아웃 + + 전나무 발판 - - 난이도 + + 자주색 양털 - - 음악 + + 자작나무 나뭇잎 - - 사운드 + + 전나무 나뭇잎 - - 감마 + + 참나무 나뭇잎 - - 게임 감도 + + 유리 - - 인터페이스 감도 + + 스펀지 - - 낙원 + + 정글 잎사귀 - - 쉬움 + + 나뭇잎 - - 보통 + + 참나무 - - 어려움 + + 전나무 - - 이 모드에서는 플레이어의 체력이 시간에 따라 자동으로 회복되며 적이 등장하지 않습니다. + + 자작나무 - - 이 모드에서는 적이 나타나지만 보통 난이도보다 공격력이 약합니다. + + 전나무 목재 - - 이 모드에서는 적이 나타나며, 플레이어에게 일반 수준의 피해를 입힙니다. + + 자작나무 목재 - - 이 모드에서는 적이 나타나며, 플레이어에게 큰 피해를 입힙니다. Creeper는 플레이어가 거리를 벌려도 폭발을 취소하지 않으므로 조심해야 합니다! + + 정글 나무 - - 평가판 시간 만료 + + 양털 - - 인원 초과 + + 분홍색 양털 - - 빈자리가 없어서 게임에 참가하지 못했습니다. + + 회색 양털 - - 서명 입력 + + 밝은 회색 양털 - - 서명으로 사용할 텍스트를 입력하십시오. + + 밝은 파란색 양털 - - 제목 입력 + + 노란색 양털 - - 게시물 제목을 입력하십시오. + + 라임색 양털 - - 설명문 입력 + + 청록색 양털 - - 게시물 설명문을 입력하십시오. + + 초록색 양털 - - 내용 입력 + + 빨간색 양털 - - 게시물 내용을 입력하십시오. + + 검은색 양털 - - 소지품 + + 보라색 양털 - - 재료 + + 파란색 양털 - - 양조대 + + 갈색 양털 - - 상자 + + 횃불(석탄) - - 효과부여 + + 발광석 - - 화로 + + 영혼 모래 - - 재료 + + 지하 바위 - - 연료 + + 청금석 블록 - - 디스펜서 + + 청금석 광석 - - 현재 이 게임에서 구매할 수 있는 해당 유형의 다운로드 콘텐츠가 없습니다. + + 차원문 - - %s님이 게임에 참가했습니다. + + 호박등 - - %s님이 게임을 떠났습니다. + + 사탕수수 - - %s님을 게임에서 추방했습니다. + + 찰흙 - - 저장한 게임을 삭제하시겠습니까? + + 선인장 - - 승인을 기다리는 중 + + 호박 - - 확인됨 + + 울타리 - - 플레이 중: + + 주크박스 - - 설정 초기화 + + 청금석을 저장하는 간편한 방법입니다. - - 설정을 기본값으로 초기화하시겠습니까? + + 들창 - - 불러오기 오류 + + 잠긴 상자 - - %s님의 게임 + + 다이오드 - - 알 수 없는 호스트 게임 + + 끈끈이 피스톤 - - 손님이 로그아웃됨 + + 피스톤 - - 모든 손님 플레이어가 게임에서 제거되었기 때문에 손님 플레이어가 로그아웃되었습니다. + + 양털(모든 색상) - - 로그인 + + 마른 덤불 - - 로그인하지 않았습니다. 이 게임을 플레이하려면 로그인해야 합니다. 지금 로그인하시겠습니까? + + 케이크 - - 멀티 플레이 허용되지 않음 + + 소리 블록 - - 게임을 생성하지 못했습니다. + + 디스펜서 - - 자동 선택 + + 긴 잡초 - - 팩 없음: 기본 캐릭터 + + 거미줄 - - 즐겨찾는 캐릭터 + + 침대 - - 차단 레벨 + + 얼음 - - 참가하려는 게임은 차단 레벨 목록에 들어 있습니다. -게임 참가를 선택하면 해당 레벨이 차단 레벨 목록에서 제거됩니다. + + 작업대 - - 이 레벨을 차단하시겠습니까? + + 다이아몬드를 저장하는 간편한 방법입니다. - - 이 레벨을 차단 레벨 목록에 추가하시겠습니까? -확인을 선택하면 동시에 게임에서 나가게 됩니다. + + 다이아몬드 블록 - - 차단 목록에서 제거 + + 화로 - - 자동 저장 간격 + + 농지 - - 자동 저장 간격: 꺼짐 + + 작물 - - + + 다이아몬드 광석 - - 여기에 놓을 수 없습니다! + + 괴물 출입문 - - 용암을 레벨 출현 지점 근처에 놓을 수 없습니다. 플레이어가 시작 지점에서 바로 죽을 수 있기 때문입니다. + + - - 인터페이스 투명도 + + 횃불(숯) - - 레벨 자동 저장 준비 중 + + 레드스톤 가루 - - HUD 크기 + + 상자 - - HUD 크기 (분할 화면) + + 참나무 계단 - - 시드 + + 표지판 - - 캐릭터 팩 획득 + + 레드스톤 광석 - - 선택한 캐릭터를 사용하려면 캐릭터 팩을 획득해야 합니다. -지금 캐릭터 팩을 획득하시겠습니까? + + 철문 - - 텍스처 팩 잠금 해제 + + 압력판 - - 이 텍스처 팩을 사용하려면 먼저 잠금을 해제해야 합니다. -지금 잠금 해제하시겠습니까? + + - - 텍스처 팩 평가판 + + 버튼 - - 텍스처 팩의 평가판을 사용 중입니다. 정식 버전을 구입하기 전에는 이 월드를 저장할 수 없습니다. -텍스처 팩 정식 버전을 구입하시겠습니까? + + 레드스톤 횃불 - - 텍스처 팩 없음 + + 손잡이 - - 정식 버전 구입 + + 레일 - - 평가판 다운로드 + + 사다리 - - 정식 버전 다운로드 + + 나무문 - - 여기에는 텍스처 팩 또는 매시업 팩이 필요하며 현재 가지고 있지 않습니다! -지금 텍스처 팩 또는 매시업 팩을 설치하시겠습니까? + + 돌 계단 - - 평가판 받기 + + 탐지 레일 - - 정식 버전 받기 + + 동력 레일 - - 플레이어 추방 + + 화로를 만들 수 있을 만큼 조약돌을 모았습니다. 작업대에서 화로를 만드십시오. - - 이 플레이어를 게임에서 추방하시겠습니까? 추방당한 플레이어는 월드를 다시 시작하기 전까지 참가할 수 없습니다. + + 낚싯대 - - 게이머 사진 팩 + + 시계 - - 테마 + + 발광석 가루 - - 캐릭터 팩 + + 화로가 달린 광물 수레 - - 친구의 친구도 참가 가능 + + 달걀 - - 이 게임은 호스트의 친구만 플레이할 수 있도록 제한되어서 참가할 수 없습니다. + + 나침반 - - 게임에 참가할 수 없음 + + 날생선 - - 선택됨 + + 붉은 장미 염료 - - 선택된 캐릭터: + + 초록 선인장 염료 - - 손상된 다운로드 콘텐츠 + + 코코아 열매 - - 이 다운로드 콘텐츠는 손상되어서 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. + + 요리한 생선 - - 일부 다운로드 콘텐츠가 손상되어 사용될 수 없습니다. 해당 콘텐츠를 삭제한 다음 Minecraft 상점 메뉴에서 재설치하십시오. + + 염료 가루 - - 게임 모드가 변경되었습니다. + + 먹물 주머니 - - 월드 이름 바꾸기 + + 상자가 담긴 광물 수레 - - 월드의 새 이름을 입력하십시오. + + 눈덩이 - - 게임 모드: 생존 + + - - 게임 모드: 창작 + + 가죽 - - 생존 + + 광물 수레 - - 창작 + + 안장 - - 생존 모드에서 생성 + + 레드스톤 - - 창작 모드에서 생성 + + 우유 양동이 - - 구름 렌더링 + + 종이 - - 이 저장된 게임을 어떻게 하시겠습니까? + + - - 저장된 게임 이름 바꾸기 + + 슬라임 볼 - - %d초 후에 자동 저장 실행… + + 벽돌 - - 켜짐 + + 찰흙 - - 꺼짐 + + 사탕수수 - - 일반 + + 청금석 - - 완전평면 + + 지도 - - 이 옵션을 켜면 온라인 게임으로 플레이합니다. + + 음악 디스크 - "13" - - 이 옵션을 켜면 초대받은 플레이어만 게임에 참가할 수 있습니다. + + 음악 디스크 - "cat" - - 이 옵션을 켜면 친구 리스트에 있는 사람의 친구가 게임에 참가할 수 있습니다. + + 침대 - - 이 옵션을 켜면 플레이어끼리 서로 피해를 입힐 수 있습니다. 생존 모드에만 적용됩니다. + + 레드스톤 탐지기 - - 이 옵션을 끄면 게임에 참가한 플레이어는 인증을 받기 전까지 건물을 짓거나 채굴할 수 없습니다. + + 쿠키 - - 이 옵션을 켜면 불이 근처의 가연성 블록으로 번집니다. + + 음악 디스크 - "blocks" - - 이 옵션을 켜면 TNT가 작동할 때 폭발합니다. + + 음악 디스크 - "mellohi" - - 이 옵션을 켜면 지하 월드가 재건됩니다. 사전에 지하 요새가 없는 곳에 미리 저장하면 유용합니다. + + 음악 디스크 - "stal" - - 이 옵션을 켜면 마을이나 요새 등의 건물이 월드에 생성됩니다. + + 음악 디스크 - "strad" - - 이 옵션을 켜면 지상과 지하에 완전히 평평한 세계가 생성됩니다. + + 음악 디스크 - "chirp" - - 이 옵션을 켜면 쓸모있는 아이템이 든 상자가 플레이어 생성 지점 근처에 나타납니다. + + 음악 디스크 - "far" - - 캐릭터 팩 + + 음악 디스크 - "mall" - - 테마 + + 케이크 - - 게이머 사진 + + 회색 염료 - - 아바타 아이템 + + 분홍색 염료 - - 텍스처 팩 + + 라임색 염료 - - 매시업 팩 + + 보라색 염료 - - {*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의 수가 최대치에 도달했습니다. + + 사과 - - 생성 알을 사용할 수 없습니다. 늑대의 수가 최대치에 도달했습니다. + + - - 생성 알을 사용할 수 없습니다. 닭의 수가 최대치에 도달했습니다. + + 화살 - - 생성 알을 사용할 수 없습니다. 오징어의 수가 최대치에 도달했습니다. + + 음악 디스크 - "ward" - - 생성 알을 사용할 수 없습니다. 적의 수가 최대치에 도달했습니다. + + {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 아이템 그룹 유형을 변경할 수 있습니다. 구조물 그룹을 선택하십시오.{*StructuresIcon*} - - 생성 알을 사용할 수 없습니다. 마을 사람의 수가 최대치에 도달했습니다. + + {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 아이템 그룹 유형을 변경할 수 있습니다. 도구 그룹을 선택하십시오.{*ToolsIcon*} - - 그림 액자/아이템 외형의 수가 최대치에 도달했습니다. + + 작업대가 완성됐습니다. 작업대를 월드에 설치해야 더 다양한 아이템을 만들 수 있습니다.{*B*} + {*CONTROLLER_VK_B*} 버튼을 눌러 작업 인터페이스를 닫으십시오. - - 낙원 모드에서는 적을 생성할 수 없습니다. + + 지금까지 만든 도구가 있으면 순조로운 출발을 할 수 있으며, 여러 자원을 더 효과적으로 확보하게 됩니다.{*B*} + {*CONTROLLER_VK_B*} 버튼을 눌러 제작 인터페이스를 닫으십시오. - - 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 돼지, 양, 소, 고양이의 수가 최대치에 도달했습니다. + + 많은 아이템들은 여러 단계를 거쳐 제작됩니다. 이제 판자를 가지고 있으므로 더 다양한 아이템을 만들 수 있습니다. {*CONTROLLER_MENU_NAVIGATE*}를 사용하면 제작할 아이템을 바꿀 수 있습니다. 작업대를 선택하십시오.{*CraftingTableIcon*} - - 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 늑대의 수가 최대치에 도달했습니다. + + {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 바꿀 수 있습니다. 일부 아이템은 제작 재료에 따라 완성품이 달라집니다. 나무 삽을 선택하십시오.{*WoodenShovelIcon*} - - 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 닭의 수가 최대치에 도달했습니다. + + 모아둔 나무를 이용해서 판자를 만들 수 있습니다. 판자 아이콘을 선택한 다음 {*CONTROLLER_VK_A*} 버튼을 눌러 판자를 만드십시오.{*PlanksIcon*} - - 이 동물은 사랑 모드로 만들 수 없습니다. 교배할 수 있는 Mooshroom의 수가 최대치에 도달했습니다. + + 작업대를 사용하면 제작할 아이템을 더 다양하게 선택할 수 있습니다. 작업대에서도 제작 방법은 기본 제작과 같지만 작업 구역이 넓어지므로, 재료를 더 다양하게 조합할 수 있습니다. - - 배의 수가 최대치에 도달했습니다. + + + 작업 구역에는 새 아이템을 만드는 데 필요한 재료가 표시됩니다. {*CONTROLLER_VK_A*} 버튼을 눌러 아이템을 만든 다음 소지품에 넣으십시오. + - - 괴물 머리의 수가 최대치에 도달했습니다. + + + 화면 위쪽의 그룹 유형 탭에서 {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}를 사용하여 제작할 아이템 종류를 선택한 다음, {*CONTROLLER_MENU_NAVIGATE*}로 제작할 아이템을 선택하십시오. + - - 시야 반전 + + 선택한 아이템을 만드는 데 필요한 재료 목록이 표시되었습니다. - - 왼손잡이 + + 현재 선택한 아이템의 설명이 표시되었습니다. 설명을 보면 아이템을 어디에 사용하는지 알 수 있습니다. - - 사망! + + 제작 인터페이스 오른쪽 아래에는 소지품이 표시됩니다. 여기에는 현재 선택한 아이템의 설명과, 해당 아이템을 만드는 데 필요한 재료가 표시됩니다. - - 재생성 + + 일부 아이템은 작업대가 아니라 화로에서 만들어야 합니다. 이제 화로를 만들어 보십시오.{*FurnaceIcon*} - - 다운로드 콘텐츠 판매 + + 자갈 - - 캐릭터 변경 + + 황금 광석 - - 플레이 방법 + + 철광석 - - 컨트롤 + + 용암 - - 설정 + + 모래 - - 제작진 + + 사암 - - 콘텐츠 재설치 + + 석탄 광석 - - 디버그 설정 + + {*B*} + 계속하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 화로 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 불 확산 + + 이 화면은 화로 인터페이스입니다. 화로에서는 아이템에 열을 가하여 다른 아이템으로 바꿀 수 있습니다. 예를 들어, 화로에서 철광석을 가열하면 철 주괴가 만들어집니다. - - TNT 폭발 + + 완성한 화로를 설치하십시오. 피신처 안에 설치하는 것이 좋습니다.{*B*} + {*CONTROLLER_VK_B*} 버튼을 눌러 제작 인터페이스를 닫으십시오. - - 플레이어 대 플레이어 + + 나무 - - 플레이어 신뢰 + + 참나무 목재 - - 호스트 특권 + + 화로 아래쪽에는 연료나 땔감을 넣고 위쪽에는 변경할 아이템을 넣어야 합니다. 그러면 화로에 불이 켜지고 작업이 시작되며, 결과물은 오른쪽 슬롯에 들어옵니다. - - 건물 생성 + + {*B*} + {*CONTROLLER_VK_X*} 버튼을 눌러 소지품을 다시 여십시오. - - 완전평면 월드 + + {*B*} + 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 소지품 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 보너스 상자 + + + 이곳에서는 소지품을 확인할 수 있습니다. 이 화면에는 손에 들고 쓸 수 있는 아이템과 가지고 다닐 수 있는 아이템이 모두 표시됩니다. 방어구 또한 이곳에서 확인할 수 있습니다. + - - 월드 옵션 + + {*B*} + 튜토리얼을 계속 진행하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 게임을 시작할 준비가 됐다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 건설 및 채광 가능 + + + 아이템이 걸린 포인터를 인터페이스 밖으로 옮기면 아이템을 떨어뜨릴 수 있습니다. + - - 문과 스위치 사용 가능 + + + 포인터를 사용해서 아이템을 소지품의 다른 공간으로 옮긴 다음 {*CONTROLLER_VK_A*} 버튼을 누르면 해당 위치에 놓습니다. + 포인터로 집은 아이템이 여러 개일 때 {*CONTROLLER_VK_A*} 버튼을 누르면 모두 내려놓고 {*CONTROLLER_VK_X*} 버튼을 누르면 하나만 놓습니다. + - - 보관함을 열 수 있음 + + + {*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. + 수량이 2개 이상일 때는 아이템을 전부 집으며, {*CONTROLLER_VK_X*} 버튼을 누르면 반만 집을 수 있습니다. + - - 플레이어 공격 가능 + + 튜토리얼 1장을 마쳤습니다. - - 동물 공격 가능 + + 화로를 사용해서 유리를 만드십시오. 유리가 만들어지는 시간 동안, 피신처를 만들 재료를 더 구해보면 어떨까요? - - 관리자 + + 화로를 사용해서 숯을 만드십시오. 숯이 만들어지는 시간 동안, 피신처를 만들 재료를 더 구해보면 어떨까요? - - 플레이어 추방 + + {*CONTROLLER_ACTION_USE*}를 눌러 화로를 설치한 다음 화로를 여십시오. - - 비행 가능 + + 밤에는 매우 어두워지므로, 피신처 안에서 잘 볼 수 있도록 조명이 있어야 합니다. 제작 인터페이스에서 막대와 숯을 이용해 횃불을 만드십시오.{*TorchIcon*} - - 지치지 않음 + + {*CONTROLLER_ACTION_USE*}를 눌러 문을 설치하십시오. {*CONTROLLER_ACTION_USE*}로 나무문을 열거나 닫아 월드로 출입할 수 있습니다. - - 투명화 + + 좋은 피신처를 만들려면, 출입할 때마다 벽을 허물고 다시 쌓을 필요가 없도록 문을 달아야 합니다. 나무문을 만들어 보십시오.{*WoodenDoorIcon*} - - 호스트 옵션 + + 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_ACTION_MENU_PAGEDOWN*}를 누르십시오. + - - 플레이어/초대 + + + 이것은 제작 인터페이스입니다. 여기서 아이템을 조합하여 새 아이템을 만들 수 있습니다. + - - 온라인 게임 + + 창작 모드 소지품을 닫으려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + - - 초대한 사람만 참가 가능 + + 아이템 정보를 더 보려면 포인터로 아이템을 가리킨 다음 {*CONTROLLER_ACTION_MENU_PAGEDOWN*}를 누르십시오. + - - 추가 옵션 + + {*B*} + 현재 아이템을 만드는 데 필요한 재료를 보려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. - - 불러오기 + + {*B*} + 아이템 설명을 보려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. - - 새 월드 + + {*B*} + 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 제작 방법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 월드 이름 + + + 상단의 그룹 유형 탭을 {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 스크롤하여 획득하고 싶은 아이템의 그룹 유형을 선택하십시오. + - - 월드 생성 시드 + + {*B*} + 계속하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 창작 모드 소지품 사용법을 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 공백(무작위 시드) + + 이것은 창작 소지품입니다. 이 화면에는 손에 들고 쓸 수 있는 아이템 외에도 선택할 수 있는 모든 아이템이 함께 표시됩니다. - - 플레이어 + + 소지품을 닫으려면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - - 게임 참가 + + + 아이템이 걸린 포인터를 인터페이스 밖으로 옮기면 아이템을 월드에 떨어뜨릴 수 있습니다. 빠른 선택 막대에 있는 아이템을 모두 선택 취소하려면 {*CONTROLLER_VK_X*} 버튼을 누르십시오. + - - 게임 시작 + + + 포인터는 자동으로 사용 줄에서 칸 단위로 움직입니다. {*CONTROLLER_VK_A*} 버튼으로 아이템을 놓을 수 있습니다. 아이템을 놓으면 포인터가 아이템 목록으로 돌아가고 다른 아이템을 선택할 수 있습니다. + - - 게임 없음 + + + {*CONTROLLER_MENU_NAVIGATE*}로 포인터를 움직일 수 있습니다. + 아이템 목록에서 {*CONTROLLER_VK_A*} 버튼을 누르면 포인터로 가리킨 아이템을 집습니다. {*CONTROLLER_VK_Y*} 버튼을 누르면 해당 아이템을 전부 집을 수 있습니다. + - - 게임 플레이 + + - - 순위표 + + 유리병 - - 도움말 및 옵션 + + 물병 - - 정식 버전 게임 구매 + + 거미 눈 - - 게임 재개 + + 금덩이 - - 게임 저장 + + 지하 사마귀 - - 난이도: + + {*splash*}{*prefix*}물약 {*postfix*} - - 게임 유형: + + 발효 거미 눈 - - 건물: + + 가마솥 - - 레벨 유형: + + Ender의 눈 - - 플레이어 대 플레이어: + + 빛나는 수박 - - 플레이어 신뢰: + + Blaze 가루 - - TNT: + + 마그마 크림 - - 불 확산: + + 양조대 - - 테마 재설치 + + Ghast의 눈물 - - 게이머사진 1 재설치 + + 호박씨 - - 게이머사진 2 재설치 + + 수박씨 - - 아바타 아이템 1 재설치 + + 닭 날고기 - - 아바타 아이템 2 재설치 + + 음악 디스크 - "11" - - 아바타 아이템 3 재설치 + + 음악 디스크 - "where are we now" - - 옵션 + + 가위 - - 오디오 + + 구운 닭고기 - - 컨트롤 + + Ender 진주 - - 그래픽 + + 수박 조각 - - 사용자 인터페이스 + + Blaze 막대 - - 기본값으로 재설정 + + 소 날고기 - - 시야 흔들림 + + 스테이크 - - 힌트 + + 썩은 살점 - - 게임 내 툴팁 + + 경험치 병 - - 2 플레이어 수직 분할 화면 + + 참나무 목재 판자 - - 완료 + + 전나무 목재 판자 - - 서명 메시지 편집: + + 자작나무 목재 판자 - - 스크린샷과 함께 게시할 설명을 입력하십시오. + + 잡초 블록 - - 설명문 + + - - 게임 스크린샷 + + 조약돌 - - 서명 메시지 편집: + + 정글 나무 판자 - - 고전적인 Minecraft 텍스처, 아이콘 및 사용자 인터페이스입니다! + + 자작나무 묘목 - - 매시업 월드 모두 보이기 + + 정글 묘목 - - 효과 없음 + + 기반암 - - 속도 + + 묘목 - - 속도 저하 + + 참나무 묘목 - - 채굴 속도 향상 + + 전나무 묘목 - - 채굴 속도 저하 + + - - 피해 강화 + + 아이템 외형 - - 피해 약화 + + {*CREATURE*} 생성 - - 회복 + + 지하 벽돌 - - 피해 + + 불쏘시개 - - 점프 강화 + + 불쏘시개 (숯) - - 혼란 + + 불쏘시개 (석탄) - - 재생 + + 두개골 - - 저항 + + 머리 - - 화염 저항 + + %s의 머리 - - 수중 호흡 + + Creeper 머리 - - 투명화 + + 해골 두개골 - - 맹목 + + 말라비틀어진 해골 두개골 - - 야간 시야 + + 좀비 머리 - - 배고픔 + + 석탄을 저장하는 간편한 방법입니다. 화로에서 연료로 사용할 수 있습니다. - - - 신속 + + 배고픔 - 속도 저하 - - - 채굴 속도 향상 + + - 신속 - - - 둔함 + + 투명화 - - - 피해 강화 + + 수중 호흡 - - - 피해 약화 + + 야간 시야 - - - 회복 + + 맹목 - 피해 - - - 도약 + + - 회복 - 혼란 @@ -5033,29 +5924,38 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E - 재생 - - - 저항 + + - 둔함 - - - 화염 저항 + + - 채굴 속도 향상 - - - 수중 호흡 + + - 피해 약화 + + + - 피해 강화 + + + 화염 저항 - - - 투명화 + + 포화 - - - 맹목 + + - 저항 - - - 야간 시야 + + - 도약 - - - 배고픔 + + 위더 - - - 독 + + 체력 강화 + + + 흡수 @@ -5066,29 +5966,41 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E III + + - 투명화 + IV - - 폭발 + + - 수중 호흡 - - 일반적인 + + - 화염 저항 - - 시시한 + + - 야간 시야 - - 단조로운 + + - 독 - - 맑은 + + - 배고픔 - - 우유빛 + + - 흡수 - - 뿌연 + + - 포화 + + + - 체력 강화 + + + - 맹목 + + + - 쇠퇴 소박한 @@ -5096,17 +6008,17 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 묽은 - - 이상한 + + 뿌연 - - 김이 빠진 + + 맑은 - - 투박한 + + 우유빛 - - 엉터리 + + 이상한 느끼한 @@ -5114,246 +6026,300 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 부드러운 - - 미끈미끈한 + + 엉터리 - - 찰랑대는 + + 김이 빠진 - - 짙은 + + 투박한 - - 우아한 + + 단조로운 - - 고급스러운 + + 폭발 - - 화려한 + + 일반적인 + + + 시시한 근사한 - - 정제된 - 따스한 + + 화려한 + + + 우아한 + + + 고급스러운 + 거품이 이는 + + 고약한 + + + 거칠거칠한 + + + 냄새 없는 + 강력한 냄새나는 - - 냄새 없는 + + 미끈미끈한 - - 고약한 + + 정제된 - - 거칠거칠한 + + 짙은 - - 매캐한 + + 찰랑대는 - - 역겨운 + + 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 회복합니다. - - 지독한 + + 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 감소합니다. - - 모든 물약의 기본이 됩니다. 양조대에서 사용하여 물약을 만들 수 있습니다. + + 효과 대상 플레이어, 동물 및 괴물이 불, 용암 및 Blaze의 원거리 공격에 피해를 받지 않게 됩니다. 그 자체로는 효과가 없습니다. 양조대에서 다른 재료를 추가로 넣어 효과를 추가할 수 있습니다. - - 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 빨라집니다. 플레이어의 질주 속도가 빨라지며 점프 거리와 시야 거리가 늘어납니다. + + 매캐한 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 느려집니다. 플레이어의 질주 속도가 느려지며 점프 거리와 시야 거리가 줄어듭니다. + + 효과 대상 플레이어, 동물 및 괴물의 이동 속도가 빨라집니다. 플레이어의 질주 속도가 빨라지며 점프 거리와 시야 거리가 늘어납니다. + 효과 대상 플레이어 및 괴물의 공격력이 증가합니다. + + 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 증가합니다. + 효과 대상 플레이어 및 괴물의 공격력이 감소합니다. - - 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 증가합니다. + + 모든 물약의 기본이 됩니다. 양조대에서 사용하여 물약을 만들 수 있습니다. - - 효과 대상 플레이어, 동물 및 괴물의 체력이 즉시 감소합니다. + + 역겨운 - - 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 회복합니다. + + 지독한 - - 효과 대상 플레이어, 동물 및 괴물이 불, 용암 및 Blaze의 원거리 공격에 피해를 받지 않게 됩니다. + + 강타 + + + 예리 효과 대상 플레이어, 동물 및 괴물의 체력이 서서히 감소합니다. - - 예리 + + 공격 손상 - - 강타 + + 타격 반동 절지동물 격파 - - 타격 반동 + + 속도 - - 화염 + + 좀비 보강 - - 방어 + + 말 점프력 + + + 적용할 경우: + + + 타격 반동 방어력 + + + 괴물 및 동물 추적 범위 + + + 체력 최대치 + + + 채굴 정확성 + + + 효율성 + + + 수분 친화력 + + + 희귀품 채굴 + + + 전리품 획득 + + + 견고 화염 방어 + + 방어 + + + 화염 + 낙하 방어 - - 폭발 방어 + + 호흡 발사체 방어 - - 호흡 - - - 수분 친화력 + + 폭발 방어 - - 효율성 + + IV - - 채굴 정확성 + + V - - 견고 + + VI - - 전리품 획득 + + 강타 - - 희귀품 채굴 + + VII - - 강화 + + III 화염 - - 강타 + + 강화 무한 - - I - - - II - - - III + + II - - IV + + I - - V + + 어떤 개체가 연결된 철사 덫을 통과할 때 활성화됩니다. - - VI + + 어떤 개체가 통과할 때 연결된 철사 덫의 고리를 활성화합니다. - - VII + + 에메랄드를 저장하는 간편한 방법입니다. - - VIII + + 상자와 비슷하지만 다른 차원에서도 플레이어의 모든 Ender 상자에서 사용할 수 있습니다. IX - - X + + VIII 철제 곡괭이 이상으로 채굴하면 에메랄드를 얻습니다. - - 상자와 비슷하지만 다른 차원에서도 플레이어의 모든 Ender 상자에서 사용할 수 있습니다. - - - 어떤 개체가 연결된 철사 덫을 통과할 때 활성화됩니다. + + X - - 어떤 개체가 통과할 때 연결된 철사 덫의 고리를 활성화합니다. + + {*ICON_SHANK_01*}를 2만큼 회복하며 황금 당근을 만드는 데 사용합니다. 농지에 심을 수 있습니다. - - 에메랄드를 저장하는 간편한 방법입니다. + + 장식으로 사용할 수 있습니다. 이 안에 꽃, 묘목, 선인장과 버섯을 심을 수 있습니다. 조약돌로 만들어진 벽입니다. - - 무기, 도구, 방어구를 수리하기 위해 사용할 수 있습니다. + + 그대로 먹어서 {*ICON_SHANK_01*}를 0.5만큼 회복하거나 화로에서 조리할 수 있습니다. 농지에 심을 수 있습니다. 화로에서 녹여 지하 석영을 만들 수 있습니다. - - 장식으로 사용됩니다. + + 무기, 도구, 방어구를 수리하기 위해 사용할 수 있습니다. 마을 사람들과 교환할 수 있습니다. - - 장식으로 사용할 수 있습니다. 이 안에 꽃, 묘목, 선인장과 버섯을 심을 수 있습니다. + + 장식으로 사용됩니다. - - {*ICON_SHANK_01*}를 2만큼 회복하며 황금 당근을 만드는 데 사용합니다. 농지에 심을 수 있습니다. + + {*ICON_SHANK_01*}를 4만큼 회복합니다. - - 그대로 먹어서 {*ICON_SHANK_01*}를 0.5만큼 회복하거나 화로에서 조리할 수 있습니다. 농지에 심을 수 있습니다. + + 그대로 먹으면 {*ICON_SHANK_01*}를 1만큼 회복하지만 병에 걸릴 수 있습니다. + + + 안장 얹은 돼지를 탈 때 돼지를 제어하기 위해 사용합니다. {*ICON_SHANK_01*}를 3만큼 회복합니다. 화로에서 감자를 조리해서 만듭니다. - - 그대로 먹으면 {*ICON_SHANK_01*}를 1만큼 회복하지만 병에 걸릴 수 있습니다. 화로에서 조리할 수 있습니다. 농지에 심을 수 있습니다. - {*ICON_SHANK_01*}를 3만큼 회복합니다. 당근과 금덩이로 만듭니다. - - 안장 얹은 돼지를 탈 때 돼지를 제어하기 위해 사용합니다. - - - {*ICON_SHANK_01*}를 4만큼 회복합니다. - 모루로 무기, 도구, 방어구에 효과를 부여할 때 사용합니다. 지하 석영 광석을 녹여 만듭니다. 석영 블록을 만들 수 있습니다. + + 감자 + + + 구운 감자 + + + 당근 + 양털로 만듭니다. 장식으로 사용됩니다. @@ -5363,14 +6329,11 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 화분 - - 당근 - - - 감자 + + 호박 파이 - - 구운 감자 + + 효과가 부여된 책 독성이 있는 감자 @@ -5381,11 +6344,11 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 당근 꼬치 - - 호박 파이 + + 철사 덫 고리 - - 효과가 부여된 책 + + 철사 덫 지하 석영 @@ -5396,11 +6359,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E Ender 상자 - - 철사 덫 고리 - - - 철사 덫 + + 이끼 낀 조약돌 벽 에메랄드 블록 @@ -5408,8 +6368,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 조약돌 벽 - - 이끼 낀 조약돌 벽 + + 감자 화분 @@ -5417,8 +6377,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 당근 - - 감자 + + 약간 손상된 모루 모루 @@ -5426,8 +6386,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 모루 - - 약간 손상된 모루 + + 석영 블록 매우 손상된 모루 @@ -5435,8 +6395,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 지하 석영 광석 - - 석영 블록 + + 석영 계단 깎아놓은 석영 블록 @@ -5444,8 +6404,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 기둥 석영 블록 - - 석영 계단 + + 빨간색 카펫 카펫 @@ -5453,8 +6413,8 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 검은색 카펫 - - 빨간색 카펫 + + 파란색 카펫 초록색 카펫 @@ -5462,9 +6422,6 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 갈색 카펫 - - 파란색 카펫 - 보라색 카펫 @@ -5477,18 +6434,18 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 회색 카펫 - - 분홍색 카펫 - 라임색 카펫 - - 노란색 카펫 + + 분홍색 카펫 밝은 파란색 카펫 + + 노란색 카펫 + 자주색 카펫 @@ -5501,89 +6458,84 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 깎아놓은 사암 - - 부드러운 사암 - {*PLAYER*}이(가) {*SOURCE*}에게 상처를 주려다 죽었습니다. + + 부드러운 사암 + {*PLAYER*}이(가) 떨어지는 모루에 깔렸습니다. {*PLAYER*}이(가) 떨어지는 블록에 깔렸습니다. - - {*PLAYER*}을(를) {*DESTINATION*}에게로 순간 이동시켰습니다 - {*PLAYER*}이(가) 그들의 위치로 당신을 순간 이동시켰습니다 - - {*PLAYER*}이(가) 당신 위치로 순간 이동시켰습니다 + + {*PLAYER*}을(를) {*DESTINATION*}에게로 순간 이동시켰습니다 가시 - - 석영 발판 + + {*PLAYER*}이(가) 당신 위치로 순간 이동시켰습니다 물속 같이 어두운 지역을 밝게 해줍니다. + + 석영 발판 + 플레이어, 동물 및 괴물이 안 보이게 합니다. 수리 및 이름 붙이기 - - 효과부여 비용: %d - 너무 비쌉니다! - - 이름 바꾸기 + + 효과부여 비용: %d 현재 소유: - - 교환에 필요한 아이템 + + 이름 바꾸기 {*VILLAGER_TYPE*}이(가) %s을(를) 제안합니다 - - 수리 + + 교환에 필요한 아이템 교환 - - 목걸이 염색 + + 수리 이것은 모루 인터페이스입니다. 경험치를 지불하고 무기, 방어구 또는 도구의 이름을 바꾸고 수리하고 효과를 부여할 수 있습니다. - - - {*B*} - 모루 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 모루 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + + 목걸이 염색 작업할 아이템을 첫 번째 입력 슬롯에 넣으십시오. - + - 두 번째 입력 슬롯에 제대로 된 원자재를 넣으면(예: 손상된 철제 검을 위한 철 주괴), 수리된 제안 형태가 출력 슬롯에 나타납니다. + {*B*} + 모루 인터페이스에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 모루 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. @@ -5591,9 +6543,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 아니면 동일한 두 번째 아이템을 두 번째 슬롯에 넣어 두 아이템을 조합할 수 있습니다. - + - 모루에서 아이템에 효과를 부여하려면 두 번째 입력 슬롯에 효과가 부여된 책을 넣습니다. + 두 번째 입력 슬롯에 제대로 된 원자재를 넣으면(예: 손상된 철제 검을 위한 철 주괴), 수리된 제안 형태가 출력 슬롯에 나타납니다. @@ -5601,9 +6553,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 작업에 필요한 경험치의 숫자는 출력 아래에 표시됩니다. 경험치가 부족하면 수리를 완료할 수 없습니다. - + - 텍스트 상자에 표시되는 이름을 수정해 아이템의 이름을 바꿀 수 있습니다. + 모루에서 아이템에 효과를 부여하려면 두 번째 입력 슬롯에 효과가 부여된 책을 넣습니다. @@ -5611,9 +6563,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 수리된 아이템을 집어들면 모루에서 사용한 두 가지 아이템이 모두 소비되며 정해진 만큼의 경험치가 줄어듭니다. - + - 이 구역에는 모루와 작업할 도구 및 무기가 들어있는 상자가 있습니다. + 텍스트 상자에 표시되는 이름을 수정해 아이템의 이름을 바꿀 수 있습니다. @@ -5623,9 +6575,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 모루에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + - 모루를 사용해 무기와 도구를 수리하면 내구성을 회복할 수 있으며, 효과가 부여된 책으로 이름을 바꾸고 효과를 부여할 수도 있습니다. + 이 구역에는 모루와 작업할 도구 및 무기가 들어있는 상자가 있습니다. @@ -5633,9 +6585,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 던전 안에 있는 상자에서 효과가 부여된 책을 찾거나 효과부여대에서 일반 책에 효과를 부여할 수도 있습니다. - + - 모루를 사용하면 경험치가 줄어들며, 사용할 때마다 모루가 손상될 가능성이 있습니다. + 모루를 사용해 무기와 도구를 수리하면 내구성을 회복할 수 있으며, 효과가 부여된 책으로 이름을 바꾸고 효과를 부여할 수도 있습니다. @@ -5643,9 +6595,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 작업 유형, 아이템 가치, 효과부여 횟수, 이전 작업 횟수 등에 따라 수리 비용이 달라집니다. - + - 아이템의 이름을 바꾸면 모든 플레이어에게 표시되는 이름도 변경되며 이전 작업 비용이 영구적으로 감소됩니다. + 모루를 사용하면 경험치가 줄어들며, 사용할 때마다 모루가 손상될 가능성이 있습니다. @@ -5653,9 +6605,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 이 구역의 상자에는 손상된 곡괭이, 원자재, 경험치 병과 실험에 필요한 효과가 부여된 책이 있습니다. - + - 이것은 마을 사람과 교환한 내용이 표시되는 교환 인터페이스입니다. + 아이템의 이름을 바꾸면 모든 플레이어에게 표시되는 이름도 변경되며 이전 작업 비용이 영구적으로 감소됩니다. @@ -5665,9 +6617,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 교환 인터페이스에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. - + - 마을 사람이 교환하고자 하는 모든 내용이 상단에 표시됩니다. + 이것은 마을 사람과 교환한 내용이 표시되는 교환 인터페이스입니다. @@ -5675,9 +6627,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 필요한 아이템이 없는 경우 교환은 빨간색으로 표시되며 사용할 수 없습니다. - + - 마을 사람에게 주는 아이템의 양과 유형은 왼쪽의 두 상자에 표시됩니다. + 마을 사람이 교환하고자 하는 모든 내용이 상단에 표시됩니다. @@ -5685,9 +6637,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 왼쪽에 있는 두 상자에서 교환에 필요한 아이템의 총 숫자를 볼 수 있습니다. - + - 마을 사람이 제안하는 아이템을 교환하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. + 마을 사람에게 주는 아이템의 양과 유형은 왼쪽의 두 상자에 표시됩니다. @@ -5695,11 +6647,9 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 이 구역에는 마을 사람과 아이템을 구매할 수 있는 종이가 들어있는 상자가 있습니다. - + - {*B*} - 교환에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} - 교환에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. + 마을 사람이 제안하는 아이템을 교환하려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오. @@ -5707,14 +6657,21 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 플레이어는 소지품에서 아이템을 꺼내 마을 사람과 교환할 수 있습니다. - + - 마을 사람은 자신의 직업에 따라 교환을 제안하는 경우가 많습니다. + {*B*} + 교환에 대해 더 알아보려면 {*CONTROLLER_VK_A*} 버튼을 누르십시오.{*B*} + 교환에 대해 이미 알고 있다면 {*CONTROLLER_VK_B*} 버튼을 누르십시오. 조합된 교환을 하는 경우 마을 사람이 이용할 수 있는 교환이 무작위로 추가되거나 업데이트됩니다. + + + + + 마을 사람은 자신의 직업에 따라 교환을 제안하는 경우가 많습니다. @@ -5876,7 +6833,4 @@ Ender에 들어서면 친구가 그들의 지도에서 요새 내부에 있는 E 치유 - - 월드 생성을 위한 시드를 찾고 있습니다 - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsPlatformSpecific.xml index 29176b0e..ba778ac5 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ko-KR/stringsPlatformSpecific.xml @@ -1,244 +1,247 @@  - - NOT USED + + "PSN"에 로그인하시겠습니까? - - PlayStation(R)Vita 본체의 터치스크린을 사용해 메뉴를 찾을 수 있습니다! + + 호스트 플레이어와 같은 "PlayStation Vita" 본체로 플레이하는 플레이어를 제외하고, 이 옵션을 선택하면 다른 "PlayStation Vita" 본체로 접속하는 플레이어를 추방할 수 있습니다. 추방당한 플레이어는 게임이 새로 시작되기 전까지 다시 참가할 수 없습니다. - - minecraftforum에 PlayStation(R)Vita Edition 전용 섹션이 생겼습니다. + + SELECT - - 4J Studios와 Kappische의 Twitter에서 이 게임의 최신 정보를 얻을 수 있습니다. + + 이 옵션을 켜면 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 플레이 도중에 옵션을 켜거나 옵션을 켠 후 저장한 게임을 다시 불러와도 마찬가지입니다. - - Enderman의 눈을 똑바로 쳐다보지 마십시오! + + "PlayStation Vita" 본체 - - 4J Studios가 PlayStation(R)Vita 본체용 게임에서 Herobrine을 삭제한 것 같습니다. + + 애드혹 네트워크를 선택해 근처에 있는 다른 "PlayStation Vita" 본체와 연결하든가 "PSN"을 선택해 전 세계의 친구들과 연결할 수 있습니다. - - Minecraft: PlayStation(R)Vita Edition이 다양한 기록을 갱신했습니다! + + 애드혹 네트워크 - - {*T3*}플레이 방법: 멀티 플레이{*ETW*}{*B*}{*B*} -PlayStation(R)Vita 본체용 Minecraft는 멀티 플레이 게임이 기본값으로 되어 있습니다. {*B*}{*B*} -온라인 게임을 시작하거나 도중에 참가하면 친구 목록에 온라인 상태가 표시됩니다(게임 호스트일 때 초대한 사람만 참가 가능하게 설정했을 때는 제외). 친구가 게임에 참가하면 해당 친구의 친구 목록에 온라인 상태가 표시됩니다('친구' 옵션의 '친구 허용'을 선택했을 때).{*B*} -게임 중에 SELECT 버튼을 누르면 같은 게임 안에 있는 다른 플레이어의 목록이 나오며 플레이어를 게임에서 추방할 수 있습니다. + + 네트워크 모드 변경 - - {*T3*}플레이 방법: 스크린샷 공유{*ETW*}{*B*}{*B*} -일시 중지 메뉴를 불러와 스크린샷을 찍은 후, {*CONTROLLER_VK_Y*} 버튼을 눌러 Facebook에 공유할 수 있습니다. 조그맣게 스크린샷 미리 보기가 표시되며 Facebook 게시물에 추가할 텍스트를 입력할 수 있습니다.{*B*}{*B*} -스크린샷을 찍을 때 특히 유용하게 쓰이는 카메라 모드로 변경하면 캐릭터의 앞모습을 찍을 수 있습니다. {*CONTROLLER_VK_Y*} 버튼을 눌러 공유하기 전에, 게임 속에서 캐릭터의 앞모습이 나올때까지 {*CONTROLLER_ACTION_CAMERA*} 버튼을 누르십시오.{*B*}{*B*} -스크린샷에는 온라인 ID가 표시되지 않습니다. + + 네트워크 모드 선택 - - {*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*}를 누르면 오른쪽으로 이동합니다. + + 분할 화면 온라인 ID - - {*CONTROLLER_ACTION_JUMP*}를 앞으로 빨리 두 번 누르면 날 수 있습니다. 비행을 종료하려면 똑같은 동작을 반복하십시오. 더 빨리 날려면 {*CONTROLLER_ACTION_MOVE*}을 앞으로 빨리 두 번 누르십시오. -비행 모드에서 {*CONTROLLER_ACTION_JUMP*}를 길게 누르면 위로 올라가고{*CONTROLLER_ACTION_SNEAK*}을 길게 누르면 아래로 내려갑니다. 또는 방향키를 사용해서 상하좌우로 움직일 수도 있습니다. + + 트로피 - - NOT USED + + 이 게임은 레벨 자동 저장 기능을 지원합니다. 위에 보이는 아이콘은 게임을 저장하는 중임을 나타내는 것입니다. +이 아이콘이 화면에 있을 때 "PlayStation Vita" 본체를 끄지 마십시오. - - NOT USED + + 이 옵션을 켜면 호스트는 게임 메뉴에서 플레이어에게 비행 능력을 주거나, 지치지 않게 하거나, 투명하게 만들 수 있습니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. - - 게이머 카드 보기 - + + 온라인 ID: - - 게이머 프로필 확인 + + 텍스처 팩의 평가판을 사용 중입니다. 텍스처 팩의 전체 콘텐츠를 사용할 수 있지만 진행 상황은 저장할 수 없습니다. +평가판을 사용하는 동안 저장하려고 하면 정식 버전을 구매할 수 있는 옵션이 표시됩니다. + - - 친구 초대 + + 패치 1.04(제목 업데이트 14) - - 창작 모드에서 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 월드를 생존 모드에서 불러와도 마찬가지입니다. 계속하시겠습니까? + + 게임 내 온라인 ID - - 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 계속하시겠습니까? + + Minecraft: "PlayStation Vita" Edition에서 제가 만든 것들을 보세요! - - 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. + + 다운로드 실패. 나중에 다시 시도해 주십시오. - - 호스트 권한을 켜고 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 옵션을 꺼도 마찬가지입니다. 계속하시겠습니까? + + 제한적 NAT 유형 때문에 게임에 참여할 수 없습니다. 네트워크 설정을 확인해 주십시오. - - "PSN" 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. + + 업로드 실패. 나중에 다시 시도해 주십시오. - - "PSN"과의 연결이 끊어졌습니다. + + 다운로드 완료! - - 이 Minecraft: PlayStation(R)Vita Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. -정식 버전 게임을 구매하면 Minecraft: PlayStation(R)Vita Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. -정식 버전 게임을 구매하시겠습니까? + + +현재 저장 전송 영역에 저장 데이터가 없습니다. +Minecraft: "PlayStation 3" Edition으로 월드 저장 데이터를 저장 전송 영역에 업로드한 후 Minecraft: "PlayStation Vita" Edition으로 다운로드할 수 있습니다. + - - 이 PlayStation(R)Vita Edition은 평가판입니다. 정식 버전 게임에서는 테마를 받을 수 있습니다! -정식 버전 게임을 구매하면 Minecraft: PlayStation(R)Vita Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 즐길 수 있습니다. -정식 버전 게임을 구매하시겠습니까? + + 저장 완료 안 됨 - - 이 게임은 Minecraft: PlayStation(R)Vita Edition 평가판입니다. 초대를 수락하려면 정식 버전 게임이 필요합니다. -정식 버전 게임을 구매하시겠습니까? + + Minecraft: "PlayStation Vita" Edition에 데이터를 저장할 공간이 없습니다. 저장할 공간을 만들기 위해 다른 Minecraft: "PlayStation Vita" Edition 저장 데이터를 삭제하십시오. - - 손님 플레이어는 정식 버전을 구매할 수 없습니다. Sony Entertainment Network 계정으로 로그인하십시오. + + 업로드 취소됨 - - 온라인 ID + + 본 저장 데이터를 저장 전송 영역에 업로드하는 작업이 취소되었습니다. - - 양조 + + PS3™/PS4™ 저장 데이터 업로드 - - "PSN"에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. + + 데이터 업로드 중: %d%% - - Minecraft: PlayStation(R)Vita Edition 평가판을 플레이할 수 있는 시간이 만료되었습니다! 정식 버전 게임을 구매하여 계속해서 게임을 즐기시겠습니까? + + "PSN" - - "Minecraft: PlayStation(R)Vita Edition"을 불러오는 중에 오류가 발생하여 계속할 수 없습니다. + + "PS3™" 저장 데이터 다운로드 - - 한 명 이상의 플레이어 Sony Entertainment Network 계정의 대화 제한 때문에 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. + + 데이터 다운로드 중: %d%% - - 한 명 이상의 플레이어가 Sony Entertainment Network 계정의 대화 제한 때문에 온라인 게임을 플레이할 수 없어 온라인 게임을 만들 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. + + 저장 중 - - 대화 제한 때문에 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. + + 업로드 완료! - - 대화 제한 때문에 로컬 플레이어 중 한 명의 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. + + 이 저장 데이터를 업로드해서 전송 영역에 있는 기존 저장 데이터를 덮어쓰시겠습니까? - - 대화 제한 때문에 로컬 플레이어 중 한 명의 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션을 생성할 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. + + 데이터 변환 중 - - 이 게임은 레벨 자동 저장 기능을 지원합니다. 위에 보이는 아이콘은 게임을 저장하는 중임을 나타내는 것입니다. -이 아이콘이 화면에 있을 때 PlayStation(R)Vita 본체를 끄지 마십시오. + + NOT USED - - 이 옵션을 켜면 호스트는 게임 메뉴에서 플레이어에게 비행 능력을 주거나, 지치지 않게 하거나, 투명하게 만들 수 있습니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. + + NOT USED - - 분할 화면 온라인 ID + + {*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*}를 누르면 오른쪽으로 이동합니다. - - 트로피 + + {*CONTROLLER_ACTION_JUMP*}를 앞으로 빨리 두 번 누르면 날 수 있습니다. 비행을 종료하려면 똑같은 동작을 반복하십시오. 더 빨리 날려면 {*CONTROLLER_ACTION_MOVE*}을 앞으로 빨리 두 번 누르십시오. +비행 모드에서 {*CONTROLLER_ACTION_JUMP*}를 길게 누르면 위로 올라가고{*CONTROLLER_ACTION_SNEAK*}을 길게 누르면 아래로 내려갑니다. 또는 방향키를 사용해서 상하좌우로 움직일 수도 있습니다. - - 온라인 ID: + + 게이머 카드 보기 + - - 게임 내 온라인 ID + + 창작 모드에서 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 월드를 생존 모드에서 불러와도 마찬가지입니다. 계속하시겠습니까? - - Minecraft: PlayStation(R)Vita Edition에서 제가 만든 것들을 보세요! + + 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 계속하시겠습니까? - - 텍스처 팩의 평가판을 사용 중입니다. 텍스처 팩의 전체 콘텐츠를 사용할 수 있지만 진행 상황은 저장할 수 없습니다. -평가판을 사용하는 동안 저장하려고 하면 정식 버전을 구매할 수 있는 옵션이 표시됩니다. - + + 게이머 프로필 확인 - - 패치 1.04(제목 업데이트 14) + + 친구 초대 - - SELECT + + minecraftforum에 "PlayStation Vita" Edition 전용 섹션이 생겼습니다. - - 이 옵션을 켜면 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 플레이 도중에 옵션을 켜거나 옵션을 켠 후 저장한 게임을 다시 불러와도 마찬가지입니다. + + 4J Studios와 Kappische의 Twitter에서 이 게임의 최신 정보를 얻을 수 있습니다. - - "PSN"에 로그인하시겠습니까? + + NOT USED - - 호스트 플레이어와 같은 PlayStation(R)Vita 본체로 플레이하는 플레이어를 제외하고, 이 옵션을 선택하면 다른 PlayStation(R)Vita 본체로 접속하는 플레이어를 추방할 수 있습니다. 추방당한 플레이어는 게임이 새로 시작되기 전까지 다시 참가할 수 없습니다. + + "PlayStation Vita" 본체의 터치스크린을 사용해 메뉴를 찾을 수 있습니다! - - PlayStation(R)Vita 본체 + + Enderman의 눈을 똑바로 쳐다보지 마십시오! - - 네트워크 모드 변경 + + {*T3*}플레이 방법: 멀티 플레이{*ETW*}{*B*}{*B*} +"PlayStation Vita" 본체용 Minecraft는 멀티 플레이 게임이 기본값으로 되어 있습니다. {*B*}{*B*} +온라인 게임을 시작하거나 도중에 참가하면 친구 목록에 온라인 상태가 표시됩니다(게임 호스트일 때 초대한 사람만 참가 가능하게 설정했을 때는 제외). 친구가 게임에 참가하면 해당 친구의 친구 목록에 온라인 상태가 표시됩니다('친구' 옵션의 '친구 허용'을 선택했을 때).{*B*} +게임 중에 SELECT 버튼을 누르면 같은 게임 안에 있는 다른 플레이어의 목록이 나오며 플레이어를 게임에서 추방할 수 있습니다. - - 네트워크 모드 선택 + + {*T3*}플레이 방법: 스크린샷 공유{*ETW*}{*B*}{*B*} +일시 중지 메뉴를 불러와 스크린샷을 찍은 후, {*CONTROLLER_VK_Y*} 버튼을 눌러 Facebook에 공유할 수 있습니다. 조그맣게 스크린샷 미리 보기가 표시되며 Facebook 게시물에 추가할 텍스트를 입력할 수 있습니다.{*B*}{*B*} +스크린샷을 찍을 때 특히 유용하게 쓰이는 카메라 모드로 변경하면 캐릭터의 앞모습을 찍을 수 있습니다. {*CONTROLLER_VK_Y*} 버튼을 눌러 공유하기 전에, 게임 속에서 캐릭터의 앞모습이 나올때까지 {*CONTROLLER_ACTION_CAMERA*} 버튼을 누르십시오.{*B*}{*B*} +스크린샷에는 온라인 ID가 표시되지 않습니다. - - 애드혹 네트워크를 선택해 근처에 있는 다른 PlayStation(R)Vita 본체와 연결하든가 "PSN"을 선택해 전 세계의 친구들과 연결할 수 있습니다. + + 4J Studios가 "PlayStation Vita" 본체용 게임에서 Herobrine을 삭제한 것 같습니다. - - 애드혹 네트워크 + + Minecraft: "PlayStation Vita" Edition이 다양한 기록을 갱신했습니다! - - "PSN" + + Minecraft: "PlayStation Vita" Edition 평가판을 플레이할 수 있는 시간이 만료되었습니다! 정식 버전 게임을 구매하여 계속해서 게임을 즐기시겠습니까? - - PlayStation(R)3 저장 데이터 다운로드 + + "Minecraft: "PlayStation Vita" Edition"을 불러오는 중에 오류가 발생하여 계속할 수 없습니다. - - PlayStation(R)3/PlayStation(R)4 저장 데이터 업로드 + + 양조 - - 업로드 취소됨 + + "PSN"에서 로그아웃했으므로 타이틀 화면으로 돌아갑니다. - - 본 저장 데이터를 저장 전송 영역에 업로드하는 작업이 취소되었습니다. + + 한 명 이상의 플레이어 Sony Entertainment Network 계정의 대화 제한 때문에 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. - - 데이터 업로드 중: %d%% + + 대화 제한 때문에 로컬 플레이어 중 한 명의 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. - - 데이터 다운로드 중: %d%% + + 대화 제한 때문에 로컬 플레이어 중 한 명의 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션을 생성할 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. - - 이 저장 데이터를 업로드해서 전송 영역에 있는 기존 저장 데이터를 덮어쓰시겠습니까? + + 한 명 이상의 플레이어가 Sony Entertainment Network 계정의 대화 제한 때문에 온라인 게임을 플레이할 수 없어 온라인 게임을 만들 수 없습니다. 오프라인 게임을 시작하려면 "추가 옵션"에서 "온라인 게임"의 선택을 해제하십시오. - - 데이터 변환 중 + + 대화 제한 때문에 Sony Entertainment Network 계정의 온라인이 비활성화되어 게임 세션에 참가할 수 없습니다. - - 저장 중 + + "PSN" 연결이 끊어졌습니다. 주 메뉴로 돌아갑니다. - - 업로드 완료! + + "PSN"과의 연결이 끊어졌습니다. - - 업로드 실패. 나중에 다시 시도해 주십시오. + + 이전에 창작 모드에서 저장된 월드입니다. 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. - - 다운로드 완료! + + 호스트 권한을 켜고 월드를 생성, 저장하거나 불러오면 해당 월드에서는 트로피를 획득할 수 없으며 순위표에 기록되지 않습니다. 이후 해당 옵션을 꺼도 마찬가지입니다. 계속하시겠습니까? - - 다운로드 실패. 나중에 다시 시도해 주십시오. + + 이 Minecraft: "PlayStation Vita" Edition은 평가판입니다. 정식 버전 게임에서는 트로피를 획득할 수 있습니다. +정식 버전 게임을 구매하면 Minecraft: "PlayStation Vita" Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 게임을 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? - - 제한적 NAT 유형 때문에 게임에 참여할 수 없습니다. 네트워크 설정을 확인해 주십시오. + + 손님 플레이어는 정식 버전을 구매할 수 없습니다. Sony Entertainment Network 계정으로 로그인하십시오. - - - 현재 저장 전송 영역에 저장 데이터가 없습니다. - Minecraft: PlayStation(R)3 Edition으로 월드 저장 데이터를 저장 전송 영역에 업로드한 후 Minecraft: PlayStation(R)Vita Edition으로 다운로드할 수 있습니다. - + + 온라인 ID - - 저장 완료 안 됨 + + 이 "PlayStation Vita" Edition은 평가판입니다. 정식 버전 게임에서는 테마를 받을 수 있습니다! +정식 버전 게임을 구매하면 Minecraft: "PlayStation Vita" Edition의 모든 기능을 이용하고 "PSN"을 통해 전 세계의 친구들과 함께 즐길 수 있습니다. +정식 버전 게임을 구매하시겠습니까? - - Minecraft: PlayStation(R)Vita Edition에 데이터를 저장할 공간이 없습니다. 저장할 공간을 만들기 위해 다른 Minecraft: PlayStation(R)Vita Edition 저장 데이터를 삭제하십시오. + + 이 게임은 Minecraft: "PlayStation Vita" Edition 평가판입니다. 초대를 수락하려면 정식 버전 게임이 필요합니다. +정식 버전 게임을 구매하시겠습니까? + + + 저장 전송 영역에 있는 저장 데이터는 Minecraft: PlayStation(R)Vita Edition에서 아직 지원하지 않는 버전 번호를 가지고 있습니다. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/4J_stringsPlatformSpecific.xml index 20af52ef..6fae7d58 100644 --- a/Minecraft.Client/PSVitaMedia/loc/la-LAS/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/4J_stringsPlatformSpecific.xml @@ -1,53 +1,52 @@  - - El almacenamiento del sistema no tiene suficiente espacio libre para crear un juego guardado. + + Se produjo un error al guardar la configuración en la cuenta Sony Entertainment Network. - - Volviste a la pantalla de título porque cerraste sesión en "PSN". + + Problema con la cuenta Sony Entertainment Network - - La partida finalizó porque cerraste sesión en "PSN". - + + Se produjo un problema al acceder a tu cuenta Sony Entertainment Network. No se puede conceder tu trofeo en este momento. - - No has iniciado sesión. - + + Esta es la versión de prueba de Minecraft: PlayStation®3 Edition. Si tuvieras el juego completo, ¡hubieras conseguido un trofeo! +Desbloquea el juego completo para vivir toda la emoción de Minecraft y jugar con amigos de todo el mundo a través de "PSN". +¿Te gustaría desbloquear el juego completo? - - Este juego ofrece funciones que requieren estar conectado a "PSN", pero en estos momentos estás desconectado. + + Conectar a Red Ad hoc + + + Este juego ofrece funciones que requieren una conexión de red Ad hoc, pero en estos momentos estás desconectado. Red Ad hoc desconectada - - Este juego ofrece funciones que requieren una conexión de red Ad hoc, pero en estos momentos estás desconectado. + + Problema con el trofeo - - Esta función requiere haber iniciado sesión en "PSN". + + La partida finalizó porque cerraste sesión en "PSN". - - Conectarse a "PSN". - - - Conectar a Red Ad hoc + + Volviste a la pantalla de título porque cerraste sesión en "PSN". - - Problema con el trofeo + + El almacenamiento del sistema no tiene suficiente espacio libre para crear un juego guardado. - - Se produjo un problema al acceder a tu cuenta Sony Entertainment Network. No se puede conceder tu trofeo en este momento. + + No has iniciado sesión. - - Problema con la cuenta Sony Entertainment Network + + Conectarse a "PSN". - - Se produjo un error al guardar la configuración en la cuenta Sony Entertainment Network. + + Esta función requiere haber iniciado sesión en "PSN". + - - Esta es la versión de prueba de Minecraft: PlayStation®3 Edition. Si tuvieras el juego completo, ¡hubieras conseguido un trofeo! -Desbloquea el juego completo para vivir toda la emoción de Minecraft y jugar con amigos de todo el mundo a través de "PSN". -¿Te gustaría desbloquear el juego completo? + + Este juego ofrece funciones que requieren estar conectado a "PSN", pero en estos momentos estás desconectado. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/AdditionalStrings.xml index 0609cd3c..21f25de1 100644 --- a/Minecraft.Client/PSVitaMedia/loc/la-LAS/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/AdditionalStrings.xml @@ -48,6 +48,12 @@ Tu archivo Opciones está dañado y tiene que borrarse. + + Borrar archivo Opciones. + + + Volver a cargar archivo Opciones. + Tu archivo Guardar caché está dañado y tiene que borrarse. @@ -75,6 +81,9 @@ Debido a la configuración del control paterno de uno de los jugadores locales, se desactivó la función online de tu cuenta Sony Entertainment Network. + + Las funciones online están deshabilitadas debido a que hay una actualización del juego disponible. + En este momento no hay ofertas de contenido descargable disponibles para este título. @@ -84,7 +93,4 @@ ¡Ven a jugar una partida de Minecraft: PlayStation®Vita Edition! - - Las funciones online están deshabilitadas debido a que hay una actualización del juego disponible. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsGeneric.xml index 7b7509c3..d684468c 100644 --- a/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsGeneric.xml @@ -1,5234 +1,6155 @@  - - ¡Nuevo contenido descargable disponible! Utiliza el botón Tienda de Minecraft del menú principal para acceder a él. + + Cambiando a juego sin conexión - - Puedes cambiar la apariencia de tu personaje con un skin pack de la Tienda de Minecraft. Selecciona "Tienda de Minecraft" en el menú principal para ver qué hay disponible. + + Espera mientras el anfitrión guarda la partida. - - Ajusta la configuración de gamma para que la visualización del juego sea más clara o más oscura. + + Entrando en El Fin - - Si estableces la dificultad del juego en Pacífico, tu salud se regenerará automáticamente. ¡Además, no saldrán monstruos por la noche! + + Guardando jugadores - - Dale un hueso a un lobo para domarlo. Podrás hacer que se siente o que te siga. + + Conectando al anfitrión - - Para soltar objetos desde el menú Inventario, mueve el cursor fuera del menú y oprime{*CONTROLLER_VK_A*}. + + Descargando terreno - - Si duermes en una cama de noche, el juego avanzará hasta el amanecer, pero en las partidas multijugador todos los jugadores tienen que dormir en camas a la vez. + + Saliendo de El Fin - - Extrae chuletas de los cerdos y cocínalas para comerlas y recuperar tu salud. + + ¡La cama de tu casa desapareció o está obstruida! - - Extrae cuero de las vacas y úsalo para fabricar armaduras. + + Ahora no puedes descansar, hay monstruos cerca. - - Si tienes un cubo vacío, puedes llenarlo con leche de vaca, agua ¡o lava! + + Estás durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben estar en cama a la vez. - - Usa un azadón para preparar el terreno para la cosecha. + + Esta cama está ocupada. - - Las arañas no atacan durante el día, a no ser que tú las ataques a ellas. + + Solo puedes dormir por la noche. - - ¡Es más fácil excavar arena o tierra con una pala que a mano! + + %s está durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben estar en cama a la vez. - - Si comes las chuletas de cerdo cocinadas, recuperarás más salud que si las comes crudas. + + Cargando nivel - - Crea antorchas para iluminar áreas oscuras de noche. Los monstruos evitarán las áreas cercanas a las antorchas. + + Finalizando... - - ¡Con una vagoneta y rieles llegarás a tu destino más rápido! + + Construyendo terreno - - Planta brotes y se convertirán en árboles. + + Simulando mundo durante un instante - - Los hombres-cerdo no te atacarán a no ser que tú los ataques a ellos. + + Rango - - Al dormir en una cama, puedes cambiar el punto de reaparición del personaje y avanzar el juego hasta el amanecer. + + Preparando para guardar nivel - - ¡Golpea esas bolas de fuego de vuelta al espectro! + + Preparando fragmentos... - - Si construyes un portal podrás viajar a otra dimensión: el Inframundo. + + Inicializando servidor - - ¡Oprime{*CONTROLLER_VK_B*} para soltar el objeto que llevas en la mano! + + Saliendo del Inframundo - - ¡Usa la herramienta correcta para el trabajo! + + Regenerando - - Si no encuentras hulla para las antorchas, siempre puedes convertir árboles en carbón en un horno. + + Generando nivel - - Excavar en línea recta hacia abajo o hacia arriba no es buena idea. + + Preparando zona de generación - - El polvo de hueso (se fabrica con hueso de esqueleto) se puede usar como fertilizante, y hace que las cosas crezcan al instante. + + Cargando zona de generación - - ¡Los creepers explotan cuando se acercan a ti! + + Entrando en el Inframundo - - La obsidiana se crea cuando el agua alcanza un bloque de origen de lava. + + Herramientas y armas - - Al eliminar el bloque de origen, la lava puede tardar varios minutos en desaparecer por completo. + + Gamma - - Los guijarros son resistentes a las bolas de fuego del espectro, lo que los hace útiles para defender portales. + + Sensibilidad del juego - - 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 las calabazas iluminadas. + + Sensibilidad de la interfaz - - Ten cuidado cuando construyas estructuras de lana al aire libre, ya que los rayos de las tormentas pueden prenderles fuego. + + Dificultad - - Un solo cubo de lava se puede usar para fundir 100 bloques en un horno. + + Música - - El instrumento que toca un bloque de nota depende del material que tenga debajo. + + Sonido - - Los zombis y los esqueletos pueden sobrevivir a la luz del día si están en el agua. + + Pacífico - - 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 hombres-cerdo zombis. + + En este modo, el jugador recupera la salud con el paso del tiempo y no hay enemigos en el entorno. - - Los lobos no pueden entrar en el Inframundo. + + En este modo, el entorno genera enemigos, pero infligirán menos daño al jugador que en el modo normal. - - Los lobos no atacan a los creepers. + + En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño estándar. - - Las gallinas ponen huevos cada 5 a 10 minutos. + + Fácil - - La obsidiana solo se puede extraer con un pico de diamante. + + Normal - - Los creepers son la fuente de pólvora más fácil de obtener. + + Difícil - - Si colocas dos cofres juntos crearás un cofre grande. + + Sesión cerrada - - Los lobos domados indican su salud con la posición de su cola. Dales de comer para curarlos. + + Armadura - - Cocina un cactus en un horno para obtener tinte verde. + + Mecanismos - - Lee la sección de Novedades en los menús Cómo se juega para ver la información más actualizada del juego. + + Transporte - - ¡Ahora hay vallas apilables en el juego! + + Armas - - Algunos animales te seguirán si llevas trigo en la mano. + + Comida - - Si un animal no puede desplazarse más de 20 bloques en cualquier dirección, no se degenerará. + + Estructuras - - ¡Música de C418! + + Decoraciones - - ¡Notch tiene más de un millón de seguidores en Twitter! + + Elaboración de pociones - - No todos los suecos son rubios. ¡Algunos, como Jens de Mojang, son pelirrojos! + + Herramientas, armas y armadura - - ¡Pronto habrá una actualización de este juego! + + Materiales - - ¿Quién es Notch? + + Bloques de construcción - - ¡Mojang tiene más premios que empleados! + + Piedra rojiza y transporte - - ¡Hay famosos que juegan Minecraft! + + Varios - - ¡A deadmau5 le gusta Minecraft! + + Entradas: - - No mires directamente a los bichos. + + Salir sin guardar - - Los creepers surgieron de un fallo de código. + + ¿Seguro que quieres salir al menú principal? Se perderá todo el progreso no guardado. - - ¿Es una gallina o es un pato? + + ¿Seguro que quieres salir al menú principal? ¡Se perderá tu progreso! - - ¿Estuviste en la Minecon? + + El archivo guardado está dañado. ¿Quieres borrarlo? - - Nadie de Mojang le ha visto jamás la cara a Junkboy. + + ¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores de la partida? Se perderá todo el progreso no guardado. - - ¿Sabías que hay una wiki de Minecraft? + + Salir y guardar - - ¡El nuevo despacho de Mojang es genial! + + Crear nuevo mundo - - ¡Minecon 2013 tuvo lugar en Orlando, Florida, EE. UU.! + + Escribe un nombre para tu mundo. - - .party() fue excelente. + + Introduce la semilla para la generación del mundo. + + + Cargar mundo guardado + + + Jugar tutorial + + + Tutorial + + + Dar nombre al mundo + + + Archivo dañado + + + Aceptar + + + Cancelar + + + Tienda de Minecraft + + + Rotar + + + Ocultar + + + Vaciar todos los espacios + + + ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderá todo el progreso no guardado. + + + ¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo por su versión actual? + + + ¿Seguro que quieres salir sin guardar? ¡Perderás todo el progreso en este mundo! + + + Iniciar partida + + + Salir de la partida + + + Guardar partida + + + Salir sin guardar + + + Oprime START para unirte. + + + ¡Hurra! ¡Recibiste una imagen de jugador de Steve, de Minecraft! + + + ¡Hurra! ¡Recibiste una imagen de jugador de un creeper! + + + Desbloquear juego completo + + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más reciente del juego. + + + Nuevo mundo + + + ¡Premio desbloqueado! + + + Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu partida. +¿Quieres desbloquear el juego completo? + + + Amigos + + + Mi puntuación + + + Total + + + Espera... + + + Sin resultados + + + Filtro: + + + No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. + + + Conexión perdida + + + Se perdió la conexión con el servidor. Saliendo al menú principal. + + + Desconectado por el servidor + + + Saliendo de la partida + + + Se produjo un error. Saliendo al menú principal. + + + Error de conexión + + + Te expulsaron de la partida. + + + El anfitrión abandonó la partida. + + + No puedes unirte a esta partida porque no tienes ningún amigo en ella. + + + No puedes unirte a esta partida porque el anfitrión te ha expulsado anteriormente. + + + Te expulsaron de la partida por volar. + + + El intento de conexión tomó demasiado tiempo. + + + El servidor está lleno. + + + 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 probablemente no cancelarán su ataque explosivo cuando te alejes de ellos! + + + Temas + + + Skin Packs + + + Permitir amigos de amigos + + + Expulsar jugador + + + ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. + + + Packs de imágenes de jugador + + + No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. + + + Contenido descargable dañado + + + El contenido descargable está dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo desde el menú de la Tienda de Minecraft. + + + Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo desde el menú de la Tienda de Minecraft. + + + No puedes unirte a la partida + + + Seleccionado + + + Aspecto seleccionado: + + + Conseguir versión completa + + + Desbloquear pack de textura + + + Desbloquea este pack de textura para usarlo en tu mundo. +¿Te gustaría desbloquearlo ahora? + + + Versión de prueba del pack de textura + + + Semilla + + + Desbloquear skin pack + + + Para usar la apariencia que seleccionaste tienes que desbloquear este skin pack. +¿Quieres desbloquear este skin pack ahora? + + + 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? + + + 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 + + + Pack de textura no disponible + + + Desbloquear versión completa + + + Descargar versión de prueba + + + Se cambió el modo de juego. + + + 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. + + + Normal + + + Superplano + + + Si está habilitado, la partida será online. + + + Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. + + + 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 Inframundo. + + + Si está habilitado, se creará un cofre con objetos útiles cerca del punto de reaparición del jugador. + + + 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 Inframundo se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del Inframundo. + + + No + + + Modo de juego: Creativo + + + Supervivencia + + + Creativo + + + Cambiar nombre del mundo + + + Escribe un nuevo nombre para tu mundo. + + + Modo de juego: Supervivencia + + + Creado en modo Supervivencia + + + Renombrar partida guardada + + + Autoguardando en %d... + + + + + + Creado en modo Creativo + + + Generar nubes + + + ¿Qué quieres hacer con esta partida guardada? + + + Tamaño panel (pantalla dividida) + + + Ingrediente + + + Combustible + + + Dispensador + + + Cofre + + + Encantamiento + + + Horno + + + No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. + + + ¿Seguro que quieres borrar esta partida guardada? + + + Esperando aprobación + + + Censurado + + + %s se unió a la partida. + + + %s abandonó la partida. + + + Expulsaron a %s de la partida. + + + Soporte para pociones + + + Introducir texto del cartel + + + Introduce una línea de texto para tu cartel. + + + Introducir título + + + Fin de la versión de prueba + + + Partida llena + + + No pudiste unirte a la partida y ya no quedan más espacios. + + + Introduce un título para tu publicación. + + + Introduce una descripción para tu publicación. + + + Inventario + + + Ingredientes + + + Introducir descripción + + + Introduce una descripción para tu publicación. + + + Introducir descripción + + + En reproducción: + + + ¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? +Selecciona ACEPTAR para salir de la partida. + + + Eliminar de la lista de bloqueados + + + Autoguardado cada + + + Nivel bloqueado + + + La partida a la que te estás uniendo está en la lista de niveles bloqueados. +Si decides unirte a esta partida, el nivel se eliminará de tu lista de niveles bloqueados. + + + ¿Bloquear este nivel? + + + Autoguardado: NO + + + Opacidad de la interfaz + + + Preparando autoguardado del nivel + + + Tamaño del panel de datos + + + minutos + + + ¡No se puede colocar aquí! + + + No se puede colocar lava cerca del punto de reaparición del nivel porque puede matar al instante a los jugadores que se regeneran. + + + Apariencias favoritas + + + Partida de %s + + + Partida de anfitrión desconocido + + + Un invitado cerró la sesión + + + Restablecer ajustes + + + ¿Seguro que quieres restablecer los ajustes a los valores predeterminados? + + + Error al cargar + + + Un jugador invitado cerró la sesión, lo que provocó que todos los invitados fueran excluidos de la partida. + + + Imposible crear la partida + + + Selección automática + + + Sin pack: apariencias regulares + + + Iniciar sesión + + + No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? + + + Multijugador no admitido + + + Beber + + + + En esta área se colocó una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los cultivos.{*B*} + Oprime{*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. + + + Oprime{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. + + + Para continuar, cruza al otro lado de este agujero. + + + Completaste el tutorial del modo Creativo. + + + Antes de plantar semillas, debes convertir los bloques de tierra en tierra de cultivo por medio de un azadón. 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. + + + 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 propagarán a los bloques de luz tenue cercanos.{*ICON*}39{*/ICON*} + + + El polvo de hueso se puede usar para germinar cultivos hasta su estado de mayor crecimiento o cultivar champiñones hasta que se vuelvan gigantes.{*ICON*}351:15{*/ICON*} + + + El trigo pasa por distintas fases durante su crecimiento. Cuando parece 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. Al cortar un bloque de caña de azúcar, todos los bloques que estén sobre él caerán.{*ICON*}83{*/ICON*} + + + En el modo Creativo posees un número infinito de todos los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. + + + + 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 del Inframundo! + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los portales y el Inframundo.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los portales y el Inframundo. + + + + + 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 suministrar energía a un máximo de 15 bloques, y se puede desplazar hacia arriba o hacia abajo a 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*} + + + + + Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. + + + + + El Inframundo sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el Inframundo equivale a desplazarte tres bloques en el mundo superior. + + + + + Ahora estás en el modo Creativo. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre el modo Creativo.{*B*} + Oprime{*CONTROLLER_VK_B*}si ya sabes cómo funciona el modo Creativo. + + + + + Para activar el portal del Inframundo, prende fuego a los bloques de obsidiana del interior de la estructura con un encendedor de pedernal. Los portales se pueden desactivar si se rompe la estructura, si se produce una explosión cerca o si fluye un líquido a través de ellos. + + + + + Para usar un portal del Inframundo, 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 Inframundo es un lugar peligroso, repleto de lava, pero puede ser útil para recoger bloques del Inframundo, que arden para siempre una vez que se encienden, y piedra brillante, que genera luz. + + + + Completaste el tutorial de los cultivos. + + + 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 extraer piedra y mineral. Quizá debas fabricar tu pico con mejores materiales para obtener recursos de algunos bloques. + + + Hay herramientas que son mejores para atacar a determinados enemigos. Plantéate usar una espada para atacar. + + + Los golems 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 extraer materiales blandos, como tierra y arena. + + + Consejo: mantén oprimido {*CONTROLLER_ACTION_ACTION*}para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... + + + En el cofre que está junto al río hay un bote. Para usarlo, apunta al agua con el cursor y oprime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al bote para subir a él. + + + En el cofre que está junto al estanque hay una caña de pescar. Toma la caña del cofre y selecciónala para llevarla en la mano y usarla. + + + ¡Este mecanismo de pistones más avanzado crea un puente autorreparable! Oprime el botón para activarlo e investiga la forma en que los componentes interaccionan para averiguar su funcionamiento. + + + La herramienta que usas está dañada. Cada vez que utilizas una herramienta, se desgasta y, con el tiempo, acabará rompiéndose. La barra de colores ubicada debajo del objeto en el inventario muestra el estado de daños actual. + + + Mantén oprimido{*CONTROLLER_ACTION_JUMP*} para nadar. + + + En esta área hay una vagoneta en una vía. Para subir a una vagoneta, apunta con el cursor hacia ella y oprime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. + + + Los golems de hierro se crean con cuatro bloques de hierro colocados como muestra el modelo y con una calabaza encima del bloque central. Estos golems atacan a tus enemigos. + + + Si alimentas con trigo a las vacas, champivacas u ovejas; con zanahorias a los cerdos; con semillas de trigo o verrugas del Inframundo a las gallinas, 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. + + + + En esta área se guardaron animales en corrales. Puedes hacer que los animales se reproduzcan para obtener crías idénticas a ellos. + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre reproducción de animales y cría.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes acerca de reproducción de animales y cría. + + + + Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el modo Amor. + + + 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*} + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los golems.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los golems. + + + + Los golems se crean colocando una calabaza encima de un montón de bloques. + + + Los golems de nieve se crean con dos bloques de nieve, uno sobre el otro, y encima una calabaza. Estos golems lanzan bolas de nieve a tus enemigos. + + + + Puedes domesticar a los lobos salvajes con huesos. Una vez domesticados, aparecerán corazones sobre ellos. Los lobos domesticados seguirán al jugador y lo defenderán a menos les ordenen sentarse. + + + + Completaste el tutorial de reproducción de animales y cría. + + + + En esta zona hay algunas calabazas y bloques para crear un golem de nieve y otro de hierro. + + + + + 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. + + + + + Si un caldero se vacía, puedes rellenarlo con un cubo de agua. + + + + + Usa el soporte para pociones para crear una poción de resistencia al fuego. Necesitarás una botella de agua, una verruga del Inframundo y crema de magma. + - - Supón siempre que los rumores son falsos, ¡no te los creas! + + + Toma una poción en la mano y mantén oprimido{*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. + - - {*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*} -Oprime{*CONTROLLER_ACTION_JUMP*} para saltar.{*B*}{*B*} -Oprime{*CONTROLLER_ACTION_MOVE*} dos veces hacia delante en sucesión rápida para correr. Mientras mantienes oprimido {*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 oprimido{*CONTROLLER_ACTION_ACTION*} para extraer y cortar con la mano o con cualquier objeto que sostengas. Quizá necesites crear una herramienta para extraer algunos bloques.{*B*}{*B*} -Si tienes un objeto en la mano, usa{*CONTROLLER_ACTION_USE*} para utilizar ese objeto u oprime{*CONTROLLER_ACTION_DROP*} para soltarlo. + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la elaboración y las pociones.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo elaborar pociones. + - - {*T3*}CÓMO SE JUEGA: PANEL DE DATOS{*ETW*}{*B*}{*B*} -El panel de datos 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 muestra 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 minerales 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. + + + El primer paso para elaborar una poción es crear una botella de agua. Toma un frasco de cristal del cofre. + - - {*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 puntero. Usa{*CONTROLLER_VK_A*} para tomar el objeto que se encuentra bajo el puntero. Si hay más de un objeto, los tomará todos; también puedes usar{*CONTROLLER_VK_X*} para tomar solo la mitad de ellos.{*B*}{*B*} -Mueve el objeto con el puntero hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. Si hay varios objetos en el puntero, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno.{*B*}{*B*} -Si el 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*} -Se puede cambiar el color de tu armadura de cuero tiñéndola. Puedes hacerlo en el menú del inventario sosteniendo el tinte en tu puntero, luego oprime{*CONTROLLER_VK_X*} cuando el puntero esté sobre el artículo que quieres teñir. + + + Puedes llenar un frasco de cristal con un caldero que tenga agua o con un bloque de agua. Ahora, para llenar el frasco de cristal, apunta a una fuente de agua y oprime{*CONTROLLER_ACTION_USE*}. + - - {*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 puntero 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 adelante. + + + Usa una poción de resistencia al fuego contigo mismo. - - {*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. + + + Para encantar un objeto, primero colócalo en el espacio de encantamiento. Las armas, las armaduras y algunas herramientas se pueden encantar para añadirles efectos especiales, como resistencia mejorada al daño o aumento del número de objetos que se generan al extraer un bloque. - - {*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. Oprime{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. + + + Cuando se coloca un objeto en el espacio de encantamiento, los botones de la parte derecha cambian y muestran una selección de encantamientos aleatorios. - - {*T3*}CÓMO SE JUEGA: MESA DE TRABAJO{*ETW*}{*B*}{*B*} -Con una mesa de trabajo puedes crear objetos más grandes.{*B*}{*B*} -Coloca la mesa en el mundo y oprime{*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 más amplia de objetos para crear. + + + El número del botón representa el costo en niveles de experiencia que cuesta aplicar ese encantamiento al objeto. Si tu nivel es insuficiente, el botón no estará activo. - - {*T3*}CÓMO SE JUEGA: HORNO{*ETW*}{*B*}{*B*} -En el horno puedes transformar objetos con fuego. Por ejemplo, puedes convertir mineral de hierro en lingotes de hierro.{*B*}{*B*} -Coloca el horno en el mundo y oprime{*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 el 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. + + + Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. - - {*T3*}CÓMO SE JUEGA: DISPENSADOR{*ETW*}{*B*}{*B*} -El dispensador se usa para arrojar objetos. Para eso tendrás que colocar un interruptor (una palanca, por ejemplo) junto al dispensador para accionarlo.{*B*}{*B*} -Para llenar el dispensador con objetos, oprime{*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. + + + Esta es la interfaz de encantamiento, que puedes usar para aplicar encantamientos a armas, armaduras y a algunas herramientas. - - {*T3*}CÓMO SE JUEGA: ELABORACIÓN DE POCIONES{*ETW*}{*B*}{*B*} -Para elaborar pociones se necesita un soporte para pociones que se puede construir en la mesa de trabajo. Todas las pociones se empiezan con una botella de agua, que se obtiene al llenar un frasco de cristal con agua de un caldero o una fuente.{*B*} -Los soportes para pociones tienen tres espacios para botellas, de modo que puedes preparar tres pociones a la vez. Se puede usar un ingrediente en las tres botellas, así que procura elaborar siempre las pociones de tres en tres para aprovechar mejor tus recursos.{*B*} -Si colocas un ingrediente de poción en la posición superior del soporte para pociones, tras un breve periodo de tiempo obtendrás una poción básica. Esto no tiene ningún efecto por sí mismo, pero si añades otro ingrediente a 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 Inframundo{*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 de piedra 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. + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de encantamientos.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de encantamientos. - - {*T3*}CÓMO SE JUEGA: ENCANTAMIENTOS{*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 encantar 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 encantamiento, los tres botones de la parte derecha del espacio mostrarán algunos encantamientos y sus niveles de experiencia correspondientes.{*B*} -Si no tienes suficientes niveles de experiencia para usarlos, el costo aparecerá en rojo; de lo contrario, aparecerá en verde.{*B*}{*B*} -El encantamiento que se aplica se selecciona aleatoriamente en función del costo que aparece.{*B*}{*B*} -Si la mesa de encantamiento 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 encantamiento, la intensidad de los encantamientos aumentará y aparecerán glifos arcanos en el libro de la mesa de encantamientos.{*B*}{*B*} -Todos los ingredientes para la mesa de encantamientos se pueden encontrar en las aldeas de un mundo o al extraer minerales y cultivar en él.{*B*}{*B*} -Los libros encantados se usan en el yunque para aplicar encantamientos a los objetos. Esto te proporciona más control sobre qué encantamientos quieres en tus objetos.{*B*} + + + En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. + + + + + El carbón se puede usar como combustible y convertirse 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 elaboración de pociones. Se puede usar para crear pociones con efectos diversos. + + + + + Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También descubrirás otros objetos en el mundo que funcionan 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. + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el soporte para pociones. + + + + + Si añades ojo de araña fermentado, la poción se corromperá y podría convertirse en otra con el efecto contrario, y si añades pólvora, la convertirás 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 Inframundo a una botella de agua y luego añade crema de magma. + + + + + Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de elaboración de pociones. + + + + + Para elaborar pociones, coloca un ingrediente en la parte superior y una botella de agua o una poción en los espacios inferiores (se pueden elaborar hasta 3 a la vez). Cuando se introduce una combinación válida, comienza la elaboración 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 Inframundo 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. + + + + + Selecciona un encantamiento y oprime{*CONTROLLER_VK_A*} para encantar el objeto. Se reducirá el nivel de experiencia en función del costo del encantamiento. + + + + + Oprime{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. +Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el 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 la salud. + {*FishIcon*} + + + + + Al igual que muchas otras herramientas, la caña tiene distintos usos, los cuales no se limitan a pescar peces. Puedes experimentar con ella e investigar qué se puede pescar o activar... + {*FishingRodIcon*} + + + + + Los botes te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para dirigirlo. + {*BoatIcon*} + + + + + Ahora usas una caña de pescar. Oprime{*CONTROLLER_ACTION_USE*} para utilizarla.{*FishingRodIcon*} + + + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la pesca.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo pescar. + + + + + Esto es una cama. Oprime{*CONTROLLER_ACTION_USE*} y apunta hacia ella de noche para dormir y despertar por la mañana.{*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*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y de pistones.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los circuitos de piedra rojiza y de pistones. - - {*T3*}CÓMO SE JUEGA: CUIDAR ANIMALES{*ETW*}{*B*}{*B*} -Si quieres mantener a tus animales en un único lugar, construye una zona cercada de menos de 20x20 bloques y mete dentro a tus animales. Así te asegurarás de que estén ahí cuando vuelvas. + + + Las palancas, los botones, las placas de presión y las antorchas de piedra rojiza suministran energía a los circuitos, bien acoplándolos directamente al objeto que quieres activar o bien conectándolos con polvo de piedra rojiza. - - {*T3*}CÓMO SE JUEGA: REPRODUCCIÓN DE 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 se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el modo Amor.{*B*} -Si alimentas con trigo a las vacas, champivacas u ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del Inframundo a las gallinas, 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 se encuentren dos animales en modo Amor de la misma especie, se besarán durante unos segundos y aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de crecer y convertirse en adulta.{*B*} -Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo.{*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 DEL INFRAMUNDO{*ETW*}{*B*}{*B*} -El portal del Inframundo permite al jugador viajar entre el mundo superior y el Inframundo. El Inframundo sirve para viajar a toda velocidad por el mundo superior, ya que un bloque de distancia en el Inframundo equivale a tres bloques en el mundo superior. Así, cuando construyas un portal en el Inframundo y salgas por él, estarás tres veces más lejos del punto de entrada.{*B*}{*B*} -Se necesitan un mínimo de diez bloques de obsidiana para construir el portal, y el portal debe tener cinco bloques de alto, cuatro de ancho y uno de profundidad. Una vez construida la estructura del portal, tendrás que prender fuego al espacio interior para activarlo. Para eso, usa los objetos "encendedor de pedernal" o "descarga de fuego".{*B*}{*B*} -En la imagen de la derecha dispones de ejemplos de construcción de un portal. + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre las camas.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las camas. - - {*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 oprime{*CONTROLLER_VK_RB*} para seleccionar el mensaje de función 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 seguir con él o dejarlo bloqueado. - - - {*T3*}CÓMO SE JUEGA: OPCIONES DE ANFITRIÓN Y DE JUGADOR{*ETW*}{*B*}{*B*} - -{*T1*}Opciones de partida{*ETW*}{*B*} -Al cargar o crear un mundo, oprime el botón "Más opciones" para entrar en un menú donde podrás tener más control sobre tu partida.{*B*}{*B*} - - {*T2*}Jugador contra jugador{*ETW*}{*B*} - Si está habilitado, 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á deshabilitado, los jugadores que se unen a la partida 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ú del juego.{*B*}{*B*} - - {*T2*}El fuego se propaga{*ETW*}{*B*} - Si está habilitado, 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á habilitado, la dinamita explota cuando se detona. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} - - {*T2*}Privilegios de anfitrión{*ETW*}{*B*} - Si está habilitado, el anfitrión puede activar su habilidad para volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego.{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} - -{*T1*}Opciones de generación del mundo{*ETW*}{*B*} -Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} - - {*T2*}Generar estructuras{*ETW*}{*B*} - Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo.{*B*}{*B*} - - {*T2*}Mundo superplano{*ETW*}{*B*} - Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el Inframundo.{*B*}{*B*} - - {*T2*}Cofre de bonificación{*ETW*}{*B*} - Si está habilitado, se creará un cofre con objetos útiles cerca del punto de reaparición del jugador.{*B*}{*B*} - - {*T2*}Restablecer Inframundo{*ETW*}{*B*} - Si está habilitado, se volverá a generar el Inframundo. Es útil si tienes una partida guardada anterior en la que no había fortalezas del Inframundo.{*B*}{*B*} - -{*T1*}Opciones de partida{*ETW*}{*B*} - Dentro del juego se pueden acceder a varias opciones oprimiendo {*BACK_BUTTON*} para mostrar el menú del juego.{*B*}{*B*} - - {*T2*}Opciones de anfitrión{*ETW*}{*B*} - El anfitrión y cualquier jugador designado como moderador pueden acceder al menú "Opciones de anfitrión". En este menú se puede habilitar y deshabilitar la propagación del fuego y la explosión de dinamita.{*B*}{*B*} - -{*T1*}Opciones de jugador{*ETW*}{*B*} -Para modificar los privilegios de un jugador, selecciona su nombre y oprime{*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á deshabilitado. Cuando esta opción está habilitada, el jugador puede interactuar con el mundo de forma normal. Si está deshabilitada, el jugador no puede colocar ni destruir bloques, ni interactuar 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á deshabilitado. Si esta opción está deshabilitada, el jugador no puede usar puertas ni interruptores.{*B*}{*B*} - - {*T2*}Puede abrir contenedores{*ETW*}{*B*} - Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Si 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á deshabilitado. Si esta opción está deshabilitada, el jugador no puede hacer daño a otros jugadores.{*B*}{*B*} - - {*T2*}Puede atacar a animales{*ETW*}{*B*} - Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Si esta opción está deshabilitada, el jugador no puede hacer daño 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 anfitrión) si "Confiar en jugadores" está deshabilitado, expulsar jugadores y activar y desactivar la propagación del fuego y que la dinamita explote.{*B*}{*B*} - - {*T2*}Expulsar jugador{*ETW*}{*B*} - {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - -{*T1*}Opciones de anfitrión{*ETW*}{*B*} -Si "Privilegios de anfitrión" está habilitado, el anfitrión podrá modificar algunos privilegios para sí mismo. Para modificar los privilegios de un jugador, selecciona su nombre y oprime{*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. 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 agotamiento{*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 teletransportar{*ETW*}{*B*} - Permite al jugador mover a jugadores o a él mismo al lugar del mundo en el que estén otros jugadores. + + + Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Si mueres después de haber usado una cama, te regenerarás en ella. + {*ICON*}355{*/ICON*} - - Página siguiente + + + Si hay más jugadores en tu partida, todos deberán estar en cama al mismo tiempo para poder dormir. + {*ICON*}355{*/ICON*} + - - Página anterior + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los botes.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los botes. + - - Fundamentos + + + Con una mesa de encantamiento 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. + - - Panel de datos + + + Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. + - - Inventario + + + Encantar objetos cuesta niveles de experiencia, que se aumentan acumulando orbes de experiencia. Estos orbes se generan al matar monstruos y animales, extraer minerales, criar nuevos animales, pescar y fundir o cocinar algunos objetos en un horno. + - - Cofres + + + Aunque los encantamientos son aleatorios, algunos de los mejores solo están disponibles cuando tienes el nivel de experiencia adecuado y muchas estanterías alrededor de la mesa de encantamiento para aumentar su poder. + - - Creación + + + En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. + - - Horno + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre encantamientos.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar encantamientos. + - - Dispensador + + + También puedes aumentar tus niveles de experiencia con una botella de encantamiento que, cuando se lanza, crea orbes de experiencia donde cae. Después podrás recoger esos orbes. + - - Cuidar animales + + + Las vagonetas van sobre rieles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. + {*RailIcon*} + - - Reproducción de animales + + + También puedes crear rieles propulsados, que absorben energía de las antorchas y circuitos de piedra rojiza para acelerar las vagonetas. Se pueden conectar a interruptores, palancas y placas de presión para crear sistemas complejos. + {*PoweredRailIcon*} + - - Elaboración de pociones + + + Ahora navegas en un bote. Para salir de él, apúntalo con el puntero y oprime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + - - Encantamientos + + + En los cofres de esta zona encontrarás objetos encantados, botellas de encantamientos y objetos que aún están sin encantar para que experimentes con ellos en la mesa de encantamiento. + - - Portal del Inframundo + + + Ahora estás en una vagoneta. Para salir de ella, apunta a ella con el cursor y oprime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + - - Multijugador + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre las vagonetas.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las vagonetas. + - - Compartir capturas de pantalla + + Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltar ese objeto. - - Bloquear niveles + + Leer - - Modo Creativo + + Colgar - - Opciones de anfitrión y de jugador + + Arrojar - - Comercio + + Abrir - - Yunque + + Cambiar tono - - El Fin + + Detonar - - {*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 a El Fin activo. Encontrarás el portal a El Fin en una fortaleza, en lo más profundo del mundo superior.{*B*} -Para activar el portal a El Fin, debes colocar un ojo de Ender en la estructura de un portal a El Fin 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 Ender, un feroz y poderoso enemigo, además de muchos enderman, 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 de Ender que el dragón Ender usa para curarse, así que lo primero que deberás hacer será destruirlos todos.{*B*} -Podrás alcanzar los primeros con flechas, pero los últimos están en una jaula con barrotes de hierro. Tendrás que ascender para llegar a ellos.{*B*}{*B*} -Mientras lo haces, el dragón Ender volará hacia ti y te atacará escupiendo bolas de ácido de Ender.{*B*} -Si te acercas al pedestal del huevo en el centro de los pilares, el dragón Ender descenderá 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 Ender para hacerle el máximo daño posible. ¡Si puedes, trae 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 a El Fin dentro de la fortaleza en sus mapas, para que puedan unirse a ti fácilmente. + + Plantar - - Correr + + Desbloquear juego completo - - Novedades + + Borrar partida guardada - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Cambios y añadidos{*ETW*}{*B*}{*B*} -- Se añadieron objetos nuevos: esmeralda, mineral de esmeralda, bloque de esmeralda, cofre de Ender, gancho de cable trampa, manzana de oro encantada, yunque, maceta, muros de guijarros, muros de guijarros musgosos, lienzo de Wither, papa, papa cocida, papa venenosa, zanahoria, zanahoria de oro, palo con zanahoria, tarta de calabaza, poción de visión nocturna, poción de invisibilidad, cuarzo del Inframundo, mineral de cuarzo del Inframundo, bloque de cuarzo, losa de cuarzo, escalera de cuarzo, bloque de cuarzo cincelado, bloque de columna de cuarzo, libro encantado y alfombra.{*B*} -- Se añadieron recetas nuevas para arenisca suave y arenisca cincelada.{*B*} -- Se añadieron enemigos nuevos: aldeanos zombi.{*B*} -- Se añadieron funciones nuevas de generación de terreno: templos en el desierto, aldeas en el desierto y templos en la jungla.{*B*} -- Se añadió el comercio con aldeanos.{*B*} -- Se añadió la interfaz del yunque.{*B*} -- Se pueden teñir las armaduras de cuero.{*B*} -- Se pueden teñir los collares de lobo.{*B*} -- Se puede montar un cerdo y controlarlo con un palo con zanahoria.{*B*} -- Actualización de contenidos de cofre de bonificación con más objetos.{*B*} -- Se cambió la ubicación de los medios bloques y otros bloques en los medios bloques.{*B*} -- Se cambió la ubicación de las losas y las escaleras al revés.{*B*} -- Se añadieron varias profesiones de aldeanos.{*B*} -- Los aldeanos se generan a partir de un huevo generador con una profesión aleatoria.{*B*} -- Se añadió la colocación lateral de troncos.{*B*} -- Se pueden usar herramientas de madera en los hornos como combustible.{*B*} -- Se pueden recoger paneles de cristal y hielo con herramientas de toque sedoso.{*B*} -- Los botones de madera y las placas de presión de madera se pueden activar con flechas.{*B*} -- Se pueden generar enemigos del Inframundo en el mundo superior desde los portales.{*B*} -- Los creepers y arañas son agresivos con el último jugador que les golpeó.{*B*} -- Los enemigos vuelven a ser neutrales en el modo Creativo tras un breve periodo.{*B*} -- Se eliminó el derribo al ahogarse.{*B*} -- Las puertas que rompen los zombis muestran el daño.{*B*} -- El hielo se derrite en el Inframundo.{*B*} -- Los calderos se llenan bajo la lluvia.{*B*} -- Se tarda el doble en actualizar los pistones.{*B*} -- Los cerdos sueltan sillas de montar al morir (si las tienen).{*B*} -- Se cambió el color del cielo en El Fin.{*B*} -- Se puede colocar cuerda (para cables trampa).{*B*} -- La lluvia gotea entre las hojas.{*B*} -- Se pueden colocar palancas en la parte de abajo de los bloques.{*B*} -- La dinamita hace daño variable en función del ajuste de dificultad.{*B*} -- Cambio en las recetas de los libros.{*B*} -- Los botes rompen los nenúfares y no al revés.{*B*} -- Los cerdos sueltan más chuletas de cerdo.{*B*} -- Los limos generan menos mundos superplanos.{*B*} -- Daño variable de creeper en función del ajuste de dificultad, más derribo.{*B*} -- Se solucionó el problema por el que los enderman no abrían sus mandíbulas.{*B*} -- Se añadió el teletransporte de jugadores (con el menú {*BACK_BUTTON*} en el juego).{*B*} -- Se añadieron opciones nuevas del anfitrión de vuelo, invisibilidad e invulnerabilidad para jugadores remotos.{*B*} -- Se añadieron tutoriales nuevos al mundo Tutorial con nuevos objetos y funciones.{*B*} -- Se actualizaron las posiciones de los cofres con discos en el mundo Tutorial.{*B*} - + + Borrar - - {*ETB*}¡Hola de nuevo! Quizá no te hayas dado cuenta, pero actualizamos 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 algunas. ¡Lee y diviértete!{*B*}{*B*} -{*T1*}Nuevos objetos{*ETB*}: esmeralda, mineral de esmeralda, bloque de esmeralda, cofre de Ender, gancho de cable trampa, manzana de oro encantada, yunque, maceta, muros de guijarros, muros de guijarros musgosos, lienzo de Wither, papa, papa cocida, papa venenosa, zanahoria, zanahoria de oro, palo con zanahoria, tarta de calabaza, poción de visión nocturna, poción de invisibilidad, cuarzo del Inframundo, mineral de cuarzo del Inframundo, bloque de cuarzo, losa de cuarzo, escalera de cuarzo, bloque de cuarzo cincelado, bloque de columna de cuarzo, libro encantado y alfombra.{*B*}{*B*} - {*T1*}Nuevos enemigos{*ETB*}: aldeanos zombi.{*B*}{*B*} -{*T1*}Nuevas funciones{*ETB*}: ¡comercia con los aldeanos, repara o encanta armas y herramientas con un yunque, almacena objetos en un cofre de Ender, controla un cerdo mientras lo montas usando un palo con zanahoria!{*B*}{*B*} -{*T1*}Nuevos minitutoriales{*ETB*}: aprende a usar las nuevas funciones en el mundo tutorial.{*B*}{*B*} -{*T1*}Nuevos huevos de Pascua{*ETB*}: desplazamos todos los discos secretos en el mundo tutorial. ¡A ver si los encuentras de nuevo!{*B*}{*B*} - + + Labrar - - Causas más daño que con la mano. + + Cosechar - - 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. + + Continuar - - Necesario para extraer bloques de piedra y mineral. + + Nadar hacia arriba - - Se usa para cortar bloques de madera más rápido que a mano. + + Golpear - - Se usa para labrar tierra y hierba y prepararla para el cultivo. + + Ordeñar - - Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. + + Recoger - - Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. + + Vaciar - - NO SE USA + + Silla de montar - - NO SE USA + + Colocar - - NO SE USA + + Comer - - NO SE USA + + Montar - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + Navegar - - Cuando lo lleva puesto, el usuario recibe 3 de armadura. + + Cultivar - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Dormir - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + Despertar - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Reproducir - - Cuando la lleva puesta, el usuario recibe 5 de armadura. + + Opciones - - Cuando los lleva puestos, el usuario recibe 4 de armadura. + + Mover armadura - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + Mover arma - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Equipar - - Cuando las lleva puestas, el usuario recibe 6 de armadura. + + Mover ingrediente - - Cuando las lleva puestas, el usuario recibe 5 de armadura. + + Mover combustible - - Cuando las lleva puestas, el usuario recibe 2 de armadura. + + Mover herramienta - - Cuando lo lleva puesto, el usuario recibe 2 de armadura. + + Sacar - - Cuando la lleva puesta, el usuario recibe 5 de armadura. + + Retroceder página - - Cuando las lleva puestas, el usuario recibe 3 de armadura. + + Avanzar página - - Cuando las lleva puestas, el usuario recibe 1 de armadura. + + Modo Amor - - Cuando lo lleva puesto, el usuario recibe 3 de armadura. + + Soltar - - Cuando la lleva puesta, el usuario recibe 8 de armadura. + + Privilegios - - Cuando las lleva puestas, el usuario recibe 6 de armadura. + + Bloquear - - Cuando las lleva puestas, el usuario recibe 3 de armadura. + + Creativo - - Un lingote brillante que se usa para fabricar herramientas de este material. Se crea fundiendo mineral en un horno. + + Bloquear nivel - - 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. + + Seleccionar apariencia - - Se usa para aplicar una descarga eléctrica cuando un jugador, un animal o un monstruo la pisan. Las placas de presión de madera también se activan soltando algo sobre ellas. + + Prender fuego - - Se usan en escaleras compactas. + + Invitar a amigos - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + Aceptar - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + Esquilar - - Se usa para crear luz, pero también derrite la nieve y el hielo. + + Desplazar - - Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. + + Reinstalar - - Se usa como material de construcción. No le afecta la gravedad, como a la arena normal. + + Op. de guardado - - Se usa como material de construcción. + + Ejecutar comando - - Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. + + Instalar versión completa - - Se usa para avanzar el tiempo de la noche a la mañana si todos los jugadores están en cama; además cambia su punto de reaparición. El color de la lana que se use no varía el color de la cama. + + Instalar versión de prueba - - Te permite crear una selección más variada de objetos que la creación normal. + + Instalar - - Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. + + Expulsar - - 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. + + Actualizar partidas online - - 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 como 1 bloque de alto para otros bloques. + + Partidas en grupo - - Se usa para ascender en vertical. + + Todas las partidas - - Se activa al usarla, golpearla o con piedra rojiza. Funciona como una puerta normal, pero tiene el tamaño de un bloque y se encuentra en el suelo. + + Salir - - Muestra el texto introducido por ti o por otros jugadores. + + Cancelar - - 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. + + No unirse - - Se usa para provocar explosiones. Se activa después de su colocación golpeándola con el encendedor de pedernal o con una descarga eléctrica. + + Cambiar grupo - - Se usa para contener estofado de champiñón. Te quedas el tazón después de comer el estofado. + + Fabricar - - Se usa para contener y transportar agua, lava o leche. + + Crear - - Se usa para contener y transportar agua. + + Tomar/Colocar - - Se usa para contener y transportar lava. + + Mostrar inventario - - Se usa para contener y transportar leche. + + Mostrar descripción - - Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. + + Mostrar ingredientes - - Se usa para pescar peces. + + Atrás - - Muestra la posición del sol y de la luna. + + Recordatorio: - - Indica tu punto de inicio. + + - - Mientras lo sostienes, crea una imagen del área explorada. Se puede usar para buscar rutas. + + Se añadieron nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. - - Permite ataques a distancia con flechas. + + No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. - - Se usa como munición para arcos. + + + ¡Felicidades! Completaste 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! + - - Restablece 2.5{*ICON_SHANK_01*}. + + {*EXIT_PICTURE*} Cuando estés listo para seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. + - - Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. + + {*B*}Oprime{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} + Oprime{*CONTROLLER_VK_B*} para omitir el tutorial principal. - - Restablece 1{*ICON_SHANK_01*}. + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la barra de comida y cómo comer.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funciona la barra de comida y cómo comer. + - - Restablece 1{*ICON_SHANK_01*}. + + Seleccionar - - Recupera 3 de{*ICON_SHANK_01*}. + + Usar - - Restablece 2{*ICON_SHANK_01*} y se puede cocinar en un horno. Si lo comes crudo, puedes envenenarte. + + En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los botes y la piedra rojiza. - - Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en un horno. + + Fuera de esta zona encontrarás ejemplos de edificios, cultivos, vagonetas y vías, encantamientos, pociones, comercio, herrería y mucho más. + + + + La barra de comida se agotó hasta un nivel a partir del cual ya no te puedes curar. + - - Restablece 1.5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + Tomar - - Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en un horno. + + Siguiente - - Restablece 1.5{*ICON_SHANK_01*} y se puede cocinar en un horno. + + Anterior - - Restablece 4{*ICON_SHANK_01*}. Se crea cocinando chuleta de cerdo cruda en un horno. + + Expulsar jugador - - Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede dar de comer a un ocelote para domarlo. + + Enviar solicitud de amistad - - Restablece 2.5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en un horno. + + Avanzar página - - Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. + + Retroceder página - - Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Se fabrica con una manzana y pepitas de oro. + + Teñir - - Restablece 2{*ICON_SHANK_01*}. Si la comes, puedes envenenarte. + + Curar - - Se usa en la receta de pasteles y como ingrediente para elaborar pociones. + + Sentarse - - Se activa y desactiva para aplicar una descarga eléctrica. Se mantiene en estado activado o desactivado hasta que se vuelve a oprimir. + + Sígueme - - Da una descarga eléctrica constante o puede usarse de receptor/transmisor si se conecta al lateral de un bloque. -También puede usarse como iluminación de nivel bajo. + + Extraer - - Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. + + Alimentar - - Se usa para enviar una descarga eléctrica cuando se oprime. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. + + Domar - - Se usa para contener y arrojar objetos en orden aleatorio cuando recibe una descarga de piedra rojiza. + + Cambiar filtro - - Reproduce una nota cuando se activa. Si lo golpeas cambiarás el tono de la nota. Colócalo en la parte superior de distintos bloques para cambiar el tipo de instrumento. + + Colocar todo - - Se usa para llevar vagonetas. + + Colocar uno - - Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. + + Soltar - - Funciona como una placa de presión: envía una señal de piedra rojiza, pero solo cuando es activada por una vagoneta. + + Tomar todo - - Se usa para transportarte sobre los rieles a ti, a un animal o a un monstruo. + + Tomar la mitad - - Se usa para transportar mercancías sobre los rieles. + + Colocar - - Se mueve sobre los rieles y empujará a otras vagonetas si se le añade hulla. + + Soltar todo - - Te permite desplazarte por el agua más rápido que nadando. + + Borrar selección rápida - - Se obtiene de las ovejas y se puede colorear con tinte. + + ¿Qué es esto? - - 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. + + Compartir en Facebook - - Se usa como tinte para crear lana negra. + + Soltar uno - - Se usa como tinte para crear lana verde. + + Cambiar - - Se usan como tinte para crear lana marrón, como ingrediente de las galletas y para cultivar vainas de cacao. + + Movimiento rápido - - Se usa como tinte para crear lana plateada. + + Skin Packs - - Se usa como tinte para crear lana amarilla. + + Panel de vitral rojo - - Se usa como tinte para crear lana roja. + + Panel de vitral verde - - Se usa para que crezcan al instante cosechas, árboles, hierba alta, champiñones gigantes y flores, y se puede utilizar en recetas de tinte. + + Panel de vitral café - - Se usa como tinte para crear lana rosa. + + Vitral blanco - - Se usa como tinte para crear lana naranja. + + Panel de vitral - - Se usa como tinte para crear lana limón. + + Panel de vitral negro - - Se usa como tinte para crear lana gris. + + Panel de vitral azul - - Se usa como tinte para crear lana gris claro. (Nota: combinar tinte gris con polvo de hueso creará 4 tintes gris claro de cada bolsa de tinta en vez de 3). + + Panel de vitral gris - - Se usa como tinte para crear lana azul claro. + + Panel de vitral rosa - - Se usa como tinte para crear lana cian. + + Panel de vitral lima - - Se usa como tinte para crear lana púrpura. + + Panel de vitral púrpura - - Se usa como tinte para crear lana magenta. + + Panel de vitral cian - - Se usa como tinte para crear lana azul. + + Panel de vitral gris claro - - Reproduce discos. + + Vitral naranja - - Úsalos para crear herramientas, armas o armaduras sólidas. + + Vitral azul - - 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. + + Vitral púrpura - - Se usa para crear libros y mapas. + + Vitral cian - - Se usa para crear estanterías o encantamiento para hacer libros encantados. + + Vitral rojo - - Permite la creación de encantamientos más poderosos cuando se coloca en una mesa de encantamiento. + + Vitral verde - - Se usa como elemento decorativo. + + Vitral café - - Se puede extraer con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. + + Vitral gris claro - - Se puede extraer con un pico de piedra o un objeto mejor y después fundir en un horno para producir lingotes de hierro. + + Vitral amarillo - - Se puede extraer con un pico para obtener hulla. + + Vitral azul claro - - Se puede extraer con un pico de piedra o un objeto mejor para obtener lapislázuli. + + Vitral magenta - - Se puede extraer con un pico de hierro o un objeto mejor para obtener diamantes. + + Vitral gris - - Se puede extraer con un pico de hierro o un objeto mejor para obtener polvo de piedra rojiza. + + Vitral rosa - - Se puede extraer con un pico para obtener guijarros. + + Vitral lima - - Se recoge con una pala. Se puede emplear en la construcción. + + Panel de vitral amarillo - - Se puede plantar y con el tiempo se convierte en un árbol. + + Gris claro - - No se puede romper. + + Gris - - Prende fuego a cualquier cosa que toque. Se puede recoger en un cubo. + + Rosa - - Se recoge con una pala. Se puede fundir y convertir en cristal en el horno. Le afecta la gravedad si no hay ningún otro bloque por debajo. + + Azul - - Se recoge con una pala. A veces produce pedernal cuando se excava. Le afecta la gravedad si no hay ningún otro bloque por debajo. + + Púrpura - - Se corta con un hacha y se puede convertir en tablones o usar como combustible. + + Cian - - Se crea en el horno al fundir arena. Se puede usar en la construcción, pero si intentas extraerlo, se romperá. + + Lima - - Se extrae de la piedra con un pico. Se puede usar para construir un horno o herramientas de madera. + + Naranja - - Se cuece con arcilla en un horno. + + Blanco - - Se cuece y se convierte en ladrillo en un horno. + + Personalizado - - Cuando se rompe suelta bolas de arcilla que se pueden cocer y convertir en ladrillos en un horno. + + Amarillo - - Una forma compacta de almacenar bolas de nieve. + + Azul claro - - Se puede excavar con una pala para crear bolas de nieve. + + Magenta - - A veces produce semillas de trigo cuando se rompe. + + Café - - Se puede convertir en tinte. + + Panel de vitral blanco - - Junto con un tazón se puede convertir en estofado. + + Bola pequeña - - Solo se puede extraer con un pico de diamante. Se produce al combinar agua con lava inmóvil y se usa para construir portales. + + Bola grande - - Genera monstruos en el mundo. + + Panel de vitral azul claro - - Se coloca en el suelo para transportar una descarga eléctrica. Si se elabora con una poción, aumenta la duración del efecto. + + Panel de vitral magenta - - Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. + + Panel de vitral naranja - - Terreno preparado para plantar semillas. + + Forma de estrella - - Se pueden cocinar en un horno para crear tinte verde. + + Negro - - Se pueden usar para crear azúcar. + + Rojo - - Se puede usar como casco o convertir en antorcha para crear una calabaza iluminada. También es el ingrediente principal de la tarta de calabaza. + + Verde - - Si se le prende fuego, arderá para siempre. + + Forma de creeper - - Frena el movimiento de cualquier cosa que camina sobre ella. + + Explosión - - Si te colocas en el portal podrás trasladarte del mundo superior al Inframundo y viceversa. + + Forma desconocida - - Se usa como combustible en un horno o se puede convertir en una antorcha. + + Vitral negro - - Se consigue al matar a una araña y se puede convertir en un arco o caña de pescar, o colocar en el suelo para crear cables trampa. + + Barda de hierro - - Se consigue al matar a una gallina y se puede convertir en una flecha. + + Barda de oro - - Se consigue al matar a un creeper y se puede convertir en dinamita o usar como ingrediente para elaborar pociones. + + Barda de diamante - - Se pueden plantar en una granja para que crezcan cultivos. ¡Asegúrate de que hay luz suficiente para que prosperen! + + Comparador de piedra rojiza - - Se recoge de los cultivos y se puede usar para crear alimentos. + + Vagoneta con dinamita - - Se obtiene al excavar grava y se puede usar para crear un encendedor de pedernal. + + Vagoneta con tolva - - Si se usa con un cerdo te permite montarlo. Podrás dirigir al cerdo usando un palo con zanahoria. + + Correa - - Se obtiene al excavar nieve y se puede arrojar. + + Baliza - - Se obtiene al matar a una vaca y se puede convertir en armadura o usar para fabricar libros. + + Cofre con trampa - - Se obtiene al matar a un limo y se usa como ingrediente para elaborar pociones o se crea para hacer pistones adhesivos. + + Placa de presión con peso (ligera) - - Las gallinas lo ponen al azar y se puede convertir en alimentos. + + Marca de nombre - - Se obtiene al extraer una piedra brillante y se puede convertir en bloques de piedra brillante otra vez o elaborarse con una poción para aumentar la potencia del efecto. + + Tablones de madera (cualquier tipo) - - Se obtiene al matar a un esqueleto. Se puede convertir en polvo de hueso. Se puede dar de comer a un lobo para domarlo. + + Bloque de comandos - - Se obtiene al hacer que un esqueleto mate a un creeper. Se puede reproducir en un tocadiscos. + + Estrella de fuegos artificiales - - Apaga el fuego y ayuda a que crezcan las cosechas. Se puede recoger en un cubo. + + Se puede domar y luego montar a estos animales. Se les puede acoplar un cofre. - - Si se rompen, a veces sueltan un brote que se puede plantar para que crezca un árbol. + + Mula - - Se encuentra en subterráneos, se puede emplear en la construcción y en la decoración. + + Nacen de la cría de un caballo y un burro. Se puede domar y luego montar a estos animales, y pueden cargar cofres. - - Se usan para obtener lana de las ovejas y cosechar bloques de hojas. + + Caballo - - Cuando se activa (por medio de un botón, una palanca, una placa de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. + + Se puede domar y luego montar a estos animales. - - Cuando se activa (por medio de un botón, una palanca, una placa 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. + + Burro - - Se crea con bloques de piedra y se encuentra normalmente en fortalezas. + + Caballo zombi - - Se usa como barrera, igual que las vallas. + + Mapa vacío - - Es como una puerta, pero se usa principalmente con vallas. + + Estrella del Inframundo - - Se puede crear a partir de rodajas de melón. + + Cohete de fuegos artificiales - - Bloques transparentes que se pueden usar como alternativa a los bloques de cristal. + + Esqueleto de caballo - - Se pueden plantar para cultivar calabazas. + + Wither - - Se pueden plantar para cultivar melones. + + Se crean con cráneos atrofiados y arena de almas. Disparan cráneos que explotan contra ti. - - Las sueltan los Enderman cuando mueren. Cuando se lanzan, el jugador se teletransporta a la posición donde cae la perla de Ender y pierde parte de la salud. + + Placa de presión con peso (pesada) - - Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. + + Arcilla de color gris claro - - Se puede emplear en la construcción y en la decoración. + + Arcilla de color gris - - Frena el movimiento cuando pasas sobre ella. Se puede destruir con unas tijeras para obtener cuerda. + + Arcilla de color rosa - - Genera un pez plateado cuando se destruye o, a veces, cuando está cerca de otro pez plateado al que estén atacando. + + Arcilla de color azul - - Una vez colocada, va creciendo con el paso del tiempo. Se puede recolectar con tijeras. Puede usarse como una escalera para trepar por ella. + + Arcilla de color púrpura - - Cuando pasas sobre él, te resbalas. Se convierte en agua cuando se destruye si está sobre otro bloque. Se derrite si está cerca de una fuente de luz o se coloca en el Inframundo. + + Arcilla de color cian - - Se puede usar como elemento decorativo. + + Arcilla de color lima - - Se usa para elaborar pociones y para localizar fortalezas. La sueltan las llamas, que se suelen encontrar en las fortalezas del Inframundo o en sus alrededores. + + Arcilla de color naranja - - Se usa para elaborar pociones. La sueltan los espectros cuando mueren. + + Arcilla de color blanco - - La sueltan los hombres-cerdo zombis cuando mueren. Estos se encuentran en el Inframundo. Se usa como ingrediente para elaborar pociones. + + Vitral - - Se usan para preparar pociones. Crecen de forma natural en las fortalezas del Inframundo. También se pueden plantar en arena de almas. + + Arcilla de color amarillo - - Puede tener diversos efectos, dependiendo de con qué se use. + + Arcilla de color azul claro - - Se puede llenar con agua y se usa como ingrediente base para crear una poción en el soporte para pociones. + + Arcilla de color magenta - - Es una comida venenosa y un ingrediente para pociones. Aparece cuando el jugador mata a una araña o a una araña de las cuevas. + + Arcilla de color café - - Se usa para elaborar pociones, principalmente con efecto negativo. + + Tolva - - Se usa para elaborar pociones o se combina con otros objetos para crear el ojo de Ender o la crema de magma. + + Vía de activación - - Se usa para elaborar pociones. + + Soltador - - Se usa para crear pociones y pociones de salpicadura. + + Comparador de piedra rojiza - - Se puede llenar de lluvia o de agua con un cubo y usar para llenar de agua los frascos de cristal. + + Sensor de luz del día - - Cuando se lanza, indica la dirección a un portal a El Fin. Cuando se colocan doce de ellos en las estructuras del portal a El Fin, el portal será activado. + + Bloque de piedra rojiza - - Se usa para elaborar pociones. + + Arcilla de color - - Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. + + Arcilla de color negro - - Flota en el agua y se puede caminar sobre él. + + Arcilla de color rojo - - Se usa para construir fortalezas del Inframundo. Es inmune a las bolas de fuego del espectro. + + Arcilla de color verde - - Se usa en las fortalezas del Inframundo. + + Bloque de paja - - Se encuentra en las fortalezas del Inframundo y suelta verrugas del Inframundo cuando se rompe. + + Arcilla endurecida - - Permite encantar espadas, picos, hachas, palas, arcos y armaduras utilizando puntos de experiencia. + + Bloque de hulla - - Se puede activar con doce ojos de Ender y permite al jugador viajar a la dimensión El Fin. + + Fundido en - - Se usa para crear un portal a El Fin. + + Cuando se inhabilita, impide que los monstruos y animales cambien bloques (por ejemplo, las explosiones de creeper no destruirán bloques y las ovejas no quitarán hierba) o recojan objetos. - - Un tipo de bloque que se encuentra en El Fin. Tiene una resistencia contra explosiones elevada, así que es útil para utilizar en la construcción. + + Si está habilitado, los jugadores conservarán su inventario al morir. - - Este bloque se crea al derrotar al dragón en El Fin. + + Cuando se inhabilita, no se generarán enemigos de forma natural. - - Cuando se lanza, suelta orbes de experiencia que aumentan tus puntos de experiencia cuando se recogen. + + Modo de juego: Aventura - - Útil para prender fuego a las cosas o para provocar incendios indiscriminadamente disparándola desde un dispensador. + + Aventura - - Es similar a una vitrina y muestra el objeto o el bloque que contiene. + + Introduce una semilla para generar de nuevo el mismo terreno. Déjalo vacío para crear un mundo aleatorio. - - Al lanzarse, puede generar una criatura del tipo indicado. + + Si se inhabilita, los monstruos y los animales no soltarán tesoros para saquear (por ejemplo, los creepers no soltarán pólvora). - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + {*PLAYER*} se cayó de una escalera. - - Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + + {*PLAYER*} se cayó de unas enredaderas. - - Se crea al fundir piedra del Inframundo en un horno. Se puede convertir en bloques de ladrillo del Inframundo. + + {*PLAYER*} se cayó fuera del agua. - - Al recibir energía, emite luz. + + Si se habilita, los bloques que sean destruidos no soltarán objetos (por ejemplo, los bloques de piedra no soltarán guijarros). - - Puede cultivarse en la granja para cosechar granos de cacao. + + Si se habilita, los jugadores no recuperarán la salud de forma natural. - - Las cabezas de enemigos pueden colocarse como decoración o usarse como una máscara en el espacio del casco. + + Si se inhabilita, no cambiará el momento del día. - - Calamar + + Vagoneta - - Suelta bolsas de tinta cuando muere. + + Poner correa - - Vaca + + Soltar - - Suelta cuero cuando muere. Se puede ordeñar con un cubo. + + Acoplar - - Oveja + + Desmontar - - Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. + + Acoplar cofre - - Gallina + + Lanzar - - Suelta plumas cuando muere y pone huevos al azar. + + Nombrar - - Cerdo + + Baliza - - Suelta chuletas de cerdo cuando muere. Se puede montar con una silla. + + Poder principal - - Lobo + + Poder secundario - - Es dócil hasta que lo atacan, ya que devolverá el ataque. Se puede domar con huesos para que te siga a todas partes y ataque a cualquier cosa que te ataque a ti. + + Caballo - - Creeper + + Soltador - - ¡Explota si te acercas demasiado! + + Tolva - - Esqueleto + + {*PLAYER*} se cayó de un punto elevado - - Te dispara flechas. Suelta flechas y huesos cuando muere. + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de murciélagos. - - Araña + + Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de caballos. - - Te ataca cuando está cerca. Puede trepar por muros. Suelta cuerda cuando muere. + + Opciones de partida - - Zombi + + {*PLAYER*} recibió una bola de fuego de {*SOURCE*}, con {*ITEM*}. - - Te ataca cuando está cerca. + + {*PLAYER*} recibió una paliza de {*SOURCE*}, con {*ITEM*}. - - Hombre-cerdo zombi + + {*PLAYER*} murió a manos de {*SOURCE*}, con {*ITEM*}. - - En principio es manso, pero si atacas a uno, atacará en grupo. + + Enemigos irritantes - - Espectro + + Soltar bloques - - Te dispara bolas de fuego que explotan al entrar en contacto. + + Regeneración natural - - Limo + + Ciclo de luz diurna - - Escupe limos más pequeños cuando recibe daños. + + Mantener inventario - - Enderman + + Generación de enemigos - - Te ataca si lo miras. También puede mover bloques de lugar. + + Tesoros de enemigos - - Pez plateado + + {*PLAYER*} recibió un disparo de {*SOURCE*}, con {*ITEM*}. - - Atrae a los peces plateados ocultos cercanos al atacarlo. Se oculta en bloques de piedra. + + {*PLAYER*} cayó demasiado lejos y {*SOURCE*} le remató. - - Araña de las cuevas + + {*PLAYER*} cayó demasiado lejos y {*SOURCE*} le remató con {*ITEM*}. - - Tiene una picadura venenosa. + + {*PLAYER*} entró en el fuego cuando luchaba contra {*SOURCE*}. - - Champivaca + + {*SOURCE*} provocó la caída de {*PLAYER*}. - - Crea estofado de champiñón si se usa en un tazón. Suelta champiñones y se convierte en una vaca normal cuando se esquila. + + {*SOURCE*} provocó la caída de {*PLAYER*}. - - Golem de nieve + + {*SOURCE*} provocó la caída de {*PLAYER*}, con {*ITEM*}. - - Se crea con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. + + {*PLAYER*} se volvió cenizas mientras luchaba contra {*SOURCE*}. - - Dragón Ender + + {*PLAYER*} reventó por culpa de {*SOURCE*}. - - Un dragón negro y grande que se encuentra en El Fin. + + {*PLAYER*} eliminado por un Wither. - - Llama + + {*PLAYER*} murió por culpa de {*SOURCE*}, con {*ITEM*}. - - Son enemigos que se encuentran en el Inframundo, principalmente dentro de sus fortalezas. Sueltan varas de llama cuando mueren. + + {*PLAYER*} intentó nadar en la lava para huir de {*SOURCE*}. - - Cubo de magma + + {*PLAYER*} se ahogó mientras escapaba de {*SOURCE*}. - - Se encuentran en el Inframundo. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. + + {*PLAYER*} chocó con un cactus cuando huía de {*SOURCE*}. - - Aldeano + + Montar - - Ocelote + + + Para dirigir a un caballo, debes equiparlo con una silla de montar, que se pueden comprar a los aldeanos o encontrar en el interior de cofres ocultos por el mundo. + - - Se encuentra en junglas. Puede domarse dándole de comer pescado crudo. Tienes que dejar que se te acerque, aunque ten cuidado: un movimiento repentino lo espantará. + + + Se pueden dar alforjas a los burros y las mulas domados acoplando un cofre. Se puede acceder a estas alforjas mientras se monta al animal o con sigilo. + - - Golem de hierro + + + Se pueden criar caballos y burros (pero no mulas) igual que a los demás animales, con manzanas de oro o zanahorias de oro. Con el tiempo, los potros crecerán hasta convertirse en caballos adultos, pero el proceso se acelerará si se alimentan con trigo o paja. + - - Aparece en aldeas para protegerlas y puede crearse usando bloques de hierro y calabazas. + + + Se debe domar a los caballos, los burros y las mulas antes de usarlos. A los caballos se les doma intentando montarlos y permaneciendo sobre ellos mientras intentan tirar al jinete. + - - Animador de explosivos + + + Cuando aparezcan corazones sobre un caballo significará que está domado y ya no tirará al jinete. + - - Artista conceptual + + + Ahora intenta montar sobre este caballo. Usa {*CONTROLLER_ACTION_USE*} para montar cuando no tengas objetos ni herramientas en las manos. + - - Cálculos y estadísticas + + + Aquí puedes intentar domar a caballos y burros, y en los alrededores hay cofres con sillas de montar, bardas y otros objetos útiles. + - - Coordinador de bullies + + + Una baliza en una pirámide que tenga al menos cuatro niveles ofrece la opción del poder secundario Regeneración o de un poder principal más potente. + - - Diseño original y programación + + + Para elegir los poderes de tu baliza debes sacrificar un lingote de hierro u oro, una esmeralda o un diamante en el espacio de pago. Una vez elegidos, los poderes emanarán de la baliza indefinidamente. + - - Coordinador de proyecto/Productor + + En la cima de esta pirámide hay una baliza inactiva. - - Resto del despacho Mojang + + + Esta es la interfaz de la baliza y puedes usarla para elegir los poderes que concederá. + - - Jefe de programación de Minecraft PC + + + {*B*}Oprime {*CONTROLLER_VK_A*} para continuar. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes usar el interfaz de la baliza. + - - Programador ninja + + + Puedes seleccionar un poder principal para tu baliza en el menú de la baliza. Cuantos más niveles tenga tu pirámide, más poderes tendrás para elegir. + - - Director ejecutivo + + + Se pueden montar todos los caballos, burros y mulas adultos. Sin embargo, solo se puede poner armadura a los caballos y solo se puede equipar con alforjas para transportar objetos a las mulas y los burros. + - - Empleado de cuello blanco + + + Esta es la interfaz del inventario del caballo. + - - Atención al cliente + + + {*B*}Oprime {*CONTROLLER_VK_A*} para continuar. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del caballo. + - - DJ de la oficina + + + El inventario del caballo te permite transferir o equipar objetos en tu caballo, burro o mula. + - - Diseñador/Programador de Minecraft - Pocket Edition + + Parpadeo - - Desarrollador + + Ruta + + + Duración de vuelo: - - Arquitecto en jefe + + + Ensilla a tu caballo colocando una silla de montar en el espacio de la silla de montar. Se puede poner armadura a los caballos colocando una barda en el espacio de armadura. + - - Desarrollador artístico + + Encontraste una mula. - - Creador de juego + + + {*B*}Oprime {*CONTROLLER_VK_A*} para obtener más información sobre caballos, burros y mulas. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los caballos, burros y mulas. + - - Director de diversión + + + Los caballos y los burros suelen encontrarse en las llanuras despejadas. Las mulas son las crías de un burro y un caballo, pero no son fértiles. + - - Música y efectos + + + En este menú también puedes transferir objetos entre tu inventario y las alforjas acopladas a los burros y las mulas. + - - Programación + + Encontraste un caballo. - - Arte + + Encontraste un burro. - - Control de calidad + + + {*B*}Oprime {*CONTROLLER_VK_A*} para obtener más información sobre las balizas. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes cómo funcionan las balizas. + - - Productor ejecutivo + + + Las estrellas de fuegos artificiales pueden fabricarse colocando pólvora y tinte en la cuadrícula de fabricación. + - - Jefe de producción + + + El tinte establecerá el color de la explosión de la estrella de fuegos artificiales. + - - Productor + + + La forma de la estrella de fuegos artificiales se determina al añadir una descarga de fuego, pepita de oro, pluma o cabeza de enemigo. + - - Jefe de pruebas de control de calidad + + + Si lo deseas, puedes colocar varias estrellas de fuegos artificiales a la cuadrícula de fabricación para añadirlas a los fuegos artificiales. + - - Jefe de pruebas + + + Si rellenas más espacios en la cuadrícula de fabricación con pólvora, aumentará la altura desde la que estallarán las estrellas de fuegos artificiales. + - - Equipo de diseño + + + Finalmente, puedes sacar los fuegos artificiales fabricados en el espacio de producción. + - - Equipo de desarrollo + + + Puedes añadir un rastro o parpadeo con diamantes o polvo de piedra brillante. + - - Coordinador de lanzamiento + + + Los fuegos artificiales son objetos decorativos que puedes lanzar con la mano o mediante dispensadores. Se fabrican con papel, pólvora y, opcionalmente, unas cuantas estrellas de fuegos artificiales. + - - Director de XBLA Publishing + + + Añade ingredientes adicionales durante la fabricación para personalizar el color, fundido, forma, tamaño y efectos (como rastros y parpadeos) de las estrellas de fuegos artificiales. + - - Desarrollo mercantil + + + Intenta fabricar fuegos artificiales en la mesa de trabajo con los ingredientes de los cofres. + - - Director de inversiones + + + Una vez fabricada la estrella de fuegos artificiales, puedes establecer el color del fundido al fabricarla con tinte. + - - Coordinador de producto + + + ¡Estos cofres contienen algunos objetos que puedes usar para la creación de FUEGOS ARTIFICIALES! + - - Marketing + + + {*B*}Oprime {*CONTROLLER_VK_A*} para obtener más información sobre los fuegos artificiales. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los fuegos artificiales. + - - Coordinador de comunidad + + + Para fabricar fuegos artificiales, coloca la pólvora y el papel en la cuadrícula de creación 3x3 ubicada en la parte superior del inventario. + - - Equipo de localización de Europa + + Esta sala contiene tovas. - - Equipo de localización de Redmond + + + {*B*}Oprime {*CONTROLLER_VK_A*} para obtener más información sobre las tolvas. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes cómo funcionan las tolvas. + - - Equipo de localización de Asia + + + Las tolvas se utilizan para insertar o quitar objetos de contenedores y para recoger automáticamente los objetos que se arrojen dentro de ellas. + - - Equipo de investigación de usuario + + + Las balizas activas proyectan un rayo de luz hacia el cielo y conceden poderes a los jugadores cercanos. Se crean con cristal, obsidiana y estrellas del Inframundo, que se obtienen derrotando a los Wither. + - - Equipos principales de MGS + + + Se deben colocar las balizas de forma que reciban la luz del sol durante el día. Se deben colocar en pirámides de hierro, oro o diamante. Sin embargo, el material sobre el que se coloca la baliza no afecta a su poder. + - - Certificador de calidad de logros + + + Prueba a usar la baliza para elegir el poder que concede. Puedes pagar con los lingotes de hierro que se proporcionan. + - - Agradecimientos especiales + + + Afectan a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas, así como a otras tolvas. + - - Coordinador de pruebas de control de calidad + + + En esta sala hay varias configuraciones útiles de tolvas para que veas y experimentes. + - - Jefe sénior de pruebas de control de calidad + + + Esta es la interfaz de fuegos artificiales. Aquí podrás crear fuegos artificiales y estrellas de fuegos artificiales. + - - SDET + + + {*B*}Oprime {*CONTROLLER_VK_A*} para continuar. + {*B*}Oprime {*CONTROLLER_VK_B*} si ya sabes usar la interfaz de los fuegos artificiales. + - - STE de proyecto + + + Las tolvas intentarán absorber objetos continuamente del contenedor adecuado que se coloque sobre ellas. También intentarán insertar los objetos almacenados en un contenedor de salida. + - - STE adicionales + + + Sin embargo, si una tolva dispone de energía de piedra rojiza se volverá inactiva y dejará de absorber e insertar objetos. + - - Socios de control de calidad + + + Las tolvas apuntan en la dirección hacia la que querrán arrojar los objetos. Para que una tolva apunte a un bloque concreto, colócala mirando al bloque con sigilo. + - - Jon Kågström + + Estas criaturas se encuentran en pantanos y atacan arrojando pociones. Sueltan pociones al morir. - - Tobias Möllstam + + Se alcanzó el límite de cuadros y marcos en un mundo. - - Risë Lugo + + No puedes generar enemigos en el modo Pacífico. - - Espada de madera + + Este animal no puede entrar en el modo Amor. Se alcanzó la cantidad máxima de cría de cerdos, ovejas, vacas, gatos y caballos. - - Espada de piedra + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de calamares. - - Espada de hierro + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de enemigos. - - Espada de diamante + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de aldeanos. - - Espada de oro + + Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de lobos. - - Pala de madera + + Se alcanzó el límite de cabezas de enemigos en un mundo. - - Pala de piedra + + Invertir vista - - Pala de hierro + + Zurdo - - Pala de diamante + + Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de gallinas. - - Pala de oro + + Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de champivacas. - - Pico de madera + + Se alcanzó la cantidad máxima de botes en un mundo. - - Pico de piedra + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de gallinas. - - Pico de hierro + + +{*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 fueran cosas distintas. Como si fuéramos cosas distintas.{*EF*}{*B*}{*B*} +{*C3*}¿Quiénes somos? Nos llamaban los espíritus de la montaña. Padre Sol, madre Luna. Espíritus ancestrales, espíritus animales. Genios. Fantasmas. Los hombrecitos 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ó, comió y respiró; y la mujer ensambló 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 billones de billones de billones 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*}Shhh. 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*} + - - Pico de diamante + + +{*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*}Shhh... 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 podí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 su 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 "jugaste bien".{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía "lo que 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 y 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*} + - - Pico de oro + + Restablecer Inframundo - - Hacha de madera + + %s entró en El Fin. - - Hacha de piedra + + %s abandonó El Fin. - - Hacha de hierro + + +{*C3*}Veo a ese jugador al que te referías.{*EF*}{*B*}{*B*} +{*C2*}¿{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sí. Cuidado. Alcanzó 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. Jugó bien. No se rindió.{*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*}¿Con qué soñaba este jugador?{*EF*}{*B*}{*B*} +{*C3*}Soñaba con rayos de sol y árboles. Fuego y agua. Soñaba que creaba. Y soñaba que destruía. Soñaba con cazar y ser cazado. Soñaba con un refugio.{*EF*}{*B*}{*B*} +{*C2*}Ja, la interfaz original. Tiene un millón de años y sigue funcionando. ¿Pero qué estructura verdadera creó 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 alcanza el nivel superior. Debe conseguirlo en el largo sueño de la vida, no en 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írselos, 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 decírselos...{*EF*}{*B*}{*B*} +{*C3*}Demasiado fuerte para este sueño. Decirles cómo vivir es impedir que vivan.{*EF*}{*B*}{*B*} +{*C2*}Nunca le 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*} + - - Hacha de diamante + + ¿Seguro que quieres restablecer el Inframundo de este archivo guardado a sus valores predeterminados? Perderás todo lo que has construido en el Inframundo. - - Hacha de oro + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas, gatos y caballos. - - Azadón de madera + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de champivacas. - - Azadón de piedra + + El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de lobos. - - Azadón de hierro + + Restablecer Inframundo - - Azadón de diamante + + No restablecer Inframundo - - Azadón de oro + + No se puede esquilar esta champivaca en este momento. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas, gatos y caballos. - - Puerta de madera + + ¡Has muerto! - - Puerta de hierro + + Opciones de mundo - - Casco de malla + + Puede construir y extraer - - Pechera de malla + + Puede usar puertas e interruptores - - Mallas de malla + + Generar estructuras - - Botas de malla + + Mundo superplano - - Gorro de cuero + + Cofre de bonificación - - Casco de hierro + + Puede abrir contenedores - - Casco de diamante + + Expulsar jugador - - Casco de oro + + Puede volar - - Túnica de cuero + + Desactivar agotamiento - - Pechera de hierro + + Puede atacar a jugadores - - Pechera de diamante + + Puede atacar a animales - - Pechera de oro + + Moderador - - Pantalones de cuero + + Privilegios de anfitrión - - Mallas de hierro + + Cómo se juega - - Mallas de diamante + + Controles - - Mallas de oro + + Ajustes - - Botas de cuero + + Regenerar - - Botas de hierro + + Ofertas de contenido descargable - - Botas de diamante + + Cambiar aspecto - - Botas de oro + + Créditos - - Lingote de hierro + + La dinamita explota - - Lingote de oro + + Jugador contra jugador - - Cubo + + Confiar en jugadores - - Cubo de agua + + Reinstalar el contenido - - Cubo de lava + + Ajustes de depuración - - Encend. de pedernal + + El fuego se propaga - - Manzana + + Dragón Ender - - Arco + + {*PLAYER*} murió a causa del aliento del dragón Ender. - - Flecha + + {*PLAYER*} fue asesinado por {*SOURCE*}. - - Hulla + + {*PLAYER*} fue asesinado por {*SOURCE*}. - - Carbón + + {*PLAYER*} murió. - - Diamante + + {*PLAYER*} explotó. - - Palo + + {*PLAYER*} murió a causa de la magia. - - Tazón + + {*SOURCE*} le disparó a {*PLAYER*}. - - Estofado de champiñón + + Niebla de lecho de roca - - Cuerda + + Mostrar panel de datos - - Pluma + + Mostrar mano - - Pólvora + + {*PLAYER*} fue quemado con bolas de fuego por {*SOURCE*}. - - Semillas de trigo + + {*PLAYER*} recibió una paliza de {*SOURCE*}. - - Trigo + + {*PLAYER*} murió a manos de {*SOURCE*}, con magia. - - Pan + + {*PLAYER*} se cayó del mundo. - - Pedernal + + Packs de textura - - Chuleta de cerdo cruda + + Packs de popurrí - - Chuleta de cerdo cocinada + + {*PLAYER*} ardió en llamas. - - Cuadro + + Temas - - Manzana de oro + + Imágenes de jugador - - Cartel + + Objetos de avatar - - Vagoneta + + {*PLAYER*} se quemó hasta morir. - - Silla de montar + + {*PLAYER*} se murió de hambre. - - Piedra rojiza + + {*PLAYER*} fue picado hasta morir. - - Bola de nieve + + {*PLAYER*} se golpeó demasiado fuerte contra el suelo. - - Bote + + {*PLAYER*} intentó nadar en la lava. - - Cuero + + {*PLAYER*} se asfixió en un muro. - - Cubo de leche + + {*PLAYER*} se ahogó. - - Ladrillo + + Mensajes de muerte - - Arcilla + + Ya no eres moderador. - - Cañas de azúcar + + Ahora puedes volar. - - Papel + + Ya no puedes volar. - - Libro + + Ya no puedes atacar a animales. - - Bola de limo + + Ahora puedes atacar a animales. - - Vagoneta con cofre + + Ahora eres moderador. - - Vagoneta con horno + + Ya no te cansarás. - - Huevo + + Ahora eres invulnerable. - - Brújula + + Ya no eres invulnerable. - - Caña de pescar + + MSP %d - - Reloj + + Ahora te cansarás. - - Polvo de piedra brillante + + Ahora eres invisible. - - Pescado crudo + + Ya no eres invisible. - - Pescado cocido + + Ahora puedes atacar a jugadores. - - Polvo de tinte + + Ahora puedes extraer y usar objetos. - - Bolsa de tinta + + Ya no puedes colocar bloques. - - Rojo rosa + + Ahora puedes colocar bloques. - - Verde cactus + + Personaje animado - - Granos de cacao + + Animación de apariencia personalizada - - Lapislázuli + + Ya no puedes extraer ni usar objetos. - - Tinte púrpura + + Ahora puedes usar puertas e interruptores. - - Tinte cian + + Ya no puedes atacar a enemigos. - - Tinte gris claro + + Ahora puedes atacar a enemigos. - - Tinte gris + + Ya no puedes atacar a jugadores. - - Tinte rosa + + Ya no puedes usar puertas ni interruptores. - - Tinte limón + + Ahora puedes usar contenedores (p. ej. cofres). - - Amarillo diente de león + + Ya no puedes usar contenedores (p. ej. cofres). - - Tinte azul claro + + Invisible - - Tinte magenta + + Balizas + + + {*T3*}CÓMO SE JUEGA: BALIZAS{*ETW*}{*B*}{*B*} +Las balizas activas proyectan un rayo de luz hacia el cielo y conceden poderes a los jugadores cercanos.{*B*} +Se crean con cristal, obsidiana y estrellas del Inframundo, que se obtienen derrotando a los Wither.{*B*}{*B*} +Se deben colocar las balizas de forma que reciban la luz del sol durante el día. Se deben colocar en pirámides de hierro, oro o diamante.{*B*} +El material sobre el que se coloca la baliza no afecta a su poder.{*B*}{*B*} +Puedes seleccionar un poder principal para tu baliza en el menú de la baliza. Cuantos más niveles tenga tu pirámide, más poderes tendrás para elegir.{*B*} +Una baliza en una pirámide que tenga al menos cuatro niveles ofrece la opción del poder secundario Regeneración o de un poder principal más potente.{*B*}{*B*} +Para elegir los poderes de tu baliza debes sacrificar un lingote de hierro u oro, una esmeralda o un diamante en el espacio de pago.{*B*} +Una vez elegidos, los poderes emanarán de la baliza indefinidamente.{*B*} + + + + Fuegos artificiales + + + Idiomas + + + Caballos + + + {*T3*}CÓMO SE JUEGA: CABALLOS{*ETW*}{*B*}{*B*} +Los caballos y los burros suelen encontrarse en llanuras despejadas. Las mulas son las crías de un burro y un caballo, pero no son fértiles.{*B*} +Se pueden montar todos los caballos, burros y mulas adultos. Sin embargo, solo se puede poner armadura a los caballos y solo se puede equipar con alforjas para transportar objetos a las mulas y los burros.{*B*}{*B*} +Se debe domar a los caballos, los burros y las mulas antes de usarlos. Los caballos se doman intentando montarlos y logrando mantenerse sobre ellos cuando intenten tirar al jinete.{*B*} +Cuando aparezcan corazones sobre un caballo significará que está domado y ya no intentará tirar al jinete. Para dirigir a un caballo, el jugador debe equiparlo con una silla de montar.{*B*}{*B*} +Se pueden comprar sillas de montar a los aldeanos o encontrar en el interior de cofres ocultos por el mundo.{*B*} +Se pueden dar alforjas a los burros y las mulas domados acoplando un cofre. Se puede acceder a estas alforjas mientras se monta al animal o con sigilo.{*B*}{*B*} +Se pueden criar caballos y burros (pero no mulas) igual que a los demás animales, con manzanas de oro o zanahorias de oro.{*B*} +Con el tiempo, los potros crecerán hasta convertirse en caballos adultos, pero el proceso se acelerará si se alimentan con trigo o paja.{*B*} + + + + {*T3*}CÓMO SE JUEGA: FUEGOS ARTIFICIALES{*ETW*}{*B*}{*B*} +Los fuegos artificiales son objetos decorativos que puedes lanzar con la mano o mediante dispensadores. Se fabrican con papel, pólvora y, opcionalmente, unas cuantas estrellas de fuegos artificiales.{*B*} +Añade ingredientes adicionales durante la fabricación para personalizar el color, fundido, forma, tamaño y efectos (como parpadeos y rastros) de las estrellas de fuegos artificiales.{*B*}{*B*} +Para fabricar fuegos artificiales, coloca la pólvora y el papel en la cuadrícula de creación 3x3 ubicada en la parte superior del inventario.{*B*} +Si lo deseas, puedes colocar varias estrellas de fuegos artificiales a la cuadrícula de fabricación para añadirlas a los fuegos artificiales.{*B*} +Si rellenas más espacios en la cuadrícula de fabricación con pólvora, aumentará la altura desde la que estallarán las estrellas de fuegos artificiales.{*B*}{*B*} +Finalmente, puedes sacar los fuegos artificiales fabricados en el espacio de producción.{*B*}{*B*} +Las estrellas de fuegos artificiales pueden fabricarse colocando pólvora y tinte en la cuadrícula de fabricación.{*B*} +- El tinte establecerá el color de la explosión de la estrella de fuegos artificiales.{*B*} +- La forma de la estrella de fuegos artificiales se determina al añadir una descarga de fuego, pepita de oro, pluma o cabeza de enemigo.{*B*} +- Puedes añadir un rastro o parpadeo con diamantes o polvo de piedra brillante.{*B*}{*B*} +Una vez fabricada la estrella de fuegos artificiales, puedes establecer el color del fundido al fabricarla con tinte. + + + + {*T3*}CÓMO SE JUEGA: SOLTADORES{*ETW*}{*B*}{*B*} +Los soltadores, cuando se activan con una piedra rojiza, arrojarán al suelo un único objeto al azar que contengan. Usa {*CONTROLLER_ACTION_USE*} para abrir el soltador. Luego, podrás cargar el soltador con objetos de tu inventario.{*B*} +Si el soltador está colocado frente a un cofre u otro tipo de contenedor, el objeto aparecerá ahí en su lugar. Es posible construir largas cadenas de soltadores para transportar objetos a una distancia, pero para eso, deberán ser activados y desactivados alternativamente. + + + + Al usarse, se convierte en un mapa con la ubicación del mundo en la que te encuentras. Va rellenándose a medida que exploras. + + + Lo sueltan los Wither, se usan para crear balizas. + + + Tolvas + + + {*T3*}CÓMO SE JUEGA: TOLVAS{*ETW*}{*B*}{*B*} +Las tolvas se utilizan para insertar o quitar objetos de contenedores y para recoger automáticamente los objetos que se arrojen dentro de ellas.{*B*} +Afectan a soportes para pociones, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con tolvas, así como a otras tolvas.{*B*}{*B*} +Las tolvas intentarán absorber objetos continuamente del contenedor adecuado que se coloque sobre ellas. También intentarán insertar los objetos almacenados en un contenedor de salida.{*B*} +Sin embargo, si una tolva dispone de energía de piedra rojiza se volverá inactiva y dejará de absorber e insertar objetos.{*B*}{*B*} +Las tolvas apuntan en la dirección hacia la que querrán arrojar los objetos. Para que una tolva apunte a un bloque concreto, colócala mirando al bloque con sigilo.{*B*} + + + + Soltadores - - Tinte naranja + + NO SE USA - - Polvo de hueso + + Salud instantánea - - Hueso + + Daño instantáneo - - Azúcar + + Impulso en salto - - Pastel + + Cansancio de extracción - - Cama + + Fuerza - - Repetidor de piedra rojiza + + Debilidad - - Galleta + + Náuseas - - Mapa + + NO SE USA - - Disco: "13" + + NO SE USA - - Disco: "Gato" + + NO SE USA - - Disco: "Bloques" + + Regeneración - - Disco: "Gorjeo" + + Resistencia - - Disco: "Lejos" + + Buscar semillas para el generador de mundos - - Disco: "Galería" + + Al habilitarse, crean explosiones coloridas. El color, efecto, forma y fundido dependen de la estrella de fuegos artificiales que se use para crear los fuegos artificiales. - - Disco: "Mellohi" + + Un tipo de vía que puede habilitar o inhabilitar las vagonetas con tolvas y activar las vagonetas con dinamita. - - Disco: "Stal" + + Sirve para contener y soltar objetos o para meter objetos en otro contenedor cuando recibe una descarga de piedra rojiza. - - Disco: "Strad" + + Bloques coloridos que se crean tiñendo arcilla endurecida. - - Disco: "Pabellón" + + Proporciona una descarga de piedra rojiza. La descarga será más potente cuantos más objetos haya sobre la placa. Requiere más peso que la placa ligera. - - Disco: "11" + + Se usa como fuente de energía de piedra rojiza. Se puede volver a usar para crear piedra rojiza. - - Disco: "Dónde estamos" + + Se usa para recoger, meter o sacar objetos de contenedores. - - Tijeras + + Se puede usar para alimentar a caballos, burros o mulas y que recuperen hasta 10 corazones. Acelera el crecimiento de los potros. - - Semillas de calabaza + + Murciélago - - Semillas de melón + + Estas criaturas voladoras se encuentran en cavernas y otros espacios grandes cerrados. - - Pollo crudo + + Bruja - - Pollo cocido + + Se crea fundiendo arcilla en un horno. - - Res cruda + + Se crea con cristal y un tinte. - - Filete + + Se crea con vitrales. - - Carne podrida + + Proporciona una descarga de piedra rojiza. La descarga será más potente cuantos más objetos haya sobre la placa. - - Perla de Ender + + Es un bloque que crea una señal de piedra rojiza que depende de la luz solar (o de la carencia de luz solar). - - Rodaja de melón + + Es un tipo de vagoneta que funciona de forma parecida a una tolva. Recogerá objetos tirados en las vías y de los contendedores que haya sobre ella. - - Vara de llama + + Un tipo especial de armadura que se puede equipar a los caballos. Proporciona 5 de armadura. - - Lágrima de espectro + + Se usan para determinar el color, el efecto y la forma de los fuegos artificiales. - - Pepita de oro + + Se usa en los circuitos de piedra rojiza para mantener, comparar o reducir potencia de señal, o para medir determinados estados de bloque. - - Verruga del Inframundo + + Es un tipo de vagoneta que funciona como bloque de dinamita móvil. - - Poción{*splash*}{*prefix*}{*postfix*} + + Un tipo especial de armadura que se puede equipar a los caballos. Proporciona 7 de armadura. - - Frasco de cristal + + Se usa para ejecutar comandos. - - Botella de agua + + Proyecta un rayo de luz al cielo y puede proporcionar efectos de estado a los jugadores cercanos. - - Ojo de araña + + Almacena bloques y objetos dentro. Coloca dos cofres juntos para crear un cofre más grande con el doble de capacidad. El cofre con trampa también crea una descarga de piedra rojiza cuando es abierto. - - Ojo araña fermentado + + Un tipo especial de armadura que se puede equipar a los caballos. Proporciona 11 de armadura. - - Polvo de llama + + Se usa para atar a enemigos al jugador o a postes de vallas. - - Crema de magma + + Se usa para poner nombres a los enemigos en el mundo. - - Soporte para pociones + + Rapidez - - Caldero + + Desbloquear juego completo - - Ojo de Ender + + Reanudar partida - - Melón resplandeciente + + Guardar partida - - Botella de encantamiento + + Jugar partida - - Descarga de fuego + + Marcadores - - Desc. fuego (carbón) + + Ayuda y opciones - - Desc. fuego (hulla) + + Dificultad: - - Marco + + JcJ: - - Generar {*CREATURE*} + + Confiar en jugadores: - - Ladrillo del Inframundo + + Dinamita: - - Calavera + + Tipo de partida: - - Calavera de esqueleto + + Estructuras: - - Calavera de esqueleto atrofiado + + Tipo de nivel: - - Cabeza de zombi + + No se encontraron partidas - - Cabeza + + Solo por invitación - - Cabeza de %s + + Más opciones - - Cabeza de creeper + + Cargar - - Piedra + + Opciones de anfitrión - - Bloque de hierba + + Jugadores/Invitar - - Tierra + + Partida online - - Guijarro + + Nuevo mundo - - Tablones de roble + + Jugadores - - Tablones de abeto + + Unirse a partida - - Tablones de abedul + + Iniciar partida - - Tablones de la jungla + + Nombre del mundo - - Brote + + Semilla para el generador de mundos - - Brote de roble + + Dejar vacío para semilla aleatoria - - Brote de abeto + + El fuego se propaga: - - Brote de abedul + + Editar mensaje de cartel: - - Brote de árbol de la jungla + + Rellena la información que irá junto a tu captura. - - Lecho de roca + + Descripción - - Agua + + Ayuda sobre el juego - - Lava + + Pantalla dividida vert. para 2 j. - - Arena + + Listo - - Arenisca + + Captura de pantalla del juego - - Grava + + Sin efectos - - Mineral de oro + + Velocidad - - Mineral de hierro + + Lentitud - - Mineral de hulla + + Editar mensaje de cartel: - - Madera + + ¡Con la interfaz de usuario, los íconos y la textura clásica de Minecraft! - - Madera de roble + + Mostrar todos los mundos de popurrí - - Madera de abeto + + Consejos - - Madera de abedul + + Volver a instalar objeto de avatar 1 - - Madera de la jungla + + Volver a instalar objeto de avatar 2 - - Roble + + Volver a instalar objeto de avatar 3 - - Abeto + + Volver a instalar tema - - Abedul + + Volver a instalar imagen de jugador 1 - - Hojas + + Volver a instalar imagen de jugador 2 - - Hojas de roble + + Opciones - - Hojas de abeto + + Interfaz de usuario - - Hojas de abedul + + Valores predeterminados - - Hojas de la jungla + + Oscilación de vista - - Esponja + + Sonido - - Cristal + + Control - - Lana + + Gráficos - - Lana negra + + Se usa para elaborar pociones. La sueltan los espectros cuando mueren. - - Lana roja + + La sueltan los hombres-cerdo zombis cuando mueren. Estos se encuentran en el Inframundo. Se usa como ingrediente para elaborar pociones. - - Lana verde + + Se usan para preparar pociones. Crecen de forma natural en las fortalezas del Inframundo. También se pueden plantar en arena de almas. - - Lana marrón + + Cuando pasas sobre él, te resbalas. Se convierte en agua cuando se destruye si está sobre otro bloque. Se derrite si está cerca de una fuente de luz o se coloca en el Inframundo. - - Lana azul + + Se puede usar como elemento decorativo. - - Lana púrpura + + Se usa para elaborar pociones y para localizar fortalezas. La sueltan las llamas, que se suelen encontrar en las fortalezas del Inframundo o en sus alrededores. - - Lana cian + + Puede tener diversos efectos, dependiendo de con qué se use. - - Lana gris claro + + Se usa para elaborar pociones o se combina con otros objetos para crear el ojo de Ender o la crema de magma. - - Lana gris + + Se usa para elaborar pociones. - - Lana rosa + + Se usa para crear pociones y pociones de salpicadura. - - Lana limón + + Se puede llenar con agua y se usa como ingrediente base para crear una poción en el soporte para pociones. - - Lana amarilla + + Es una comida venenosa y un ingrediente para pociones. Aparece cuando el jugador mata a una araña o a una araña de las cuevas. - - Lana azul claro + + Se usa para elaborar pociones, principalmente con efecto negativo. - - Lana magenta + + Una vez colocada, va creciendo con el paso del tiempo. Se puede recolectar con tijeras. Puede usarse como una escalera para trepar por ella. - - Lana naranja + + Es como una puerta, pero se usa principalmente con vallas. - - Lana blanca + + Se puede crear a partir de rodajas de melón. - - Flor + + Bloques transparentes que se pueden usar como alternativa a los bloques de cristal. - - Rosa + + Cuando se activa (por medio de un botón, una palanca, una placa 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. - - Champiñón + + Se crea con bloques de piedra y se encuentra normalmente en fortalezas. - - Bloque de oro + + Se usa como barrera, igual que las vallas. - - Una forma compacta de almacenar oro. + + Se pueden plantar para cultivar calabazas. - - Bloque de hierro + + Se puede emplear en la construcción y en la decoración. - - Una forma compacta de almacenar hierro. + + Frena el movimiento cuando pasas sobre ella. Se puede destruir con unas tijeras para obtener cuerda. - - Losa simple + + Genera un pez plateado cuando se destruye o, a veces, cuando está cerca de otro pez plateado al que estén atacando. - - Losa de piedra + + Se pueden plantar para cultivar melones. - - Losa de arenisca + + Las sueltan los Enderman cuando mueren. Cuando se lanzan, el jugador se teletransporta a la posición donde cae la perla de Ender y pierde parte de la salud. - - Losa de roble + + Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. - - Losa de guijarros + + Se puede llenar de lluvia o de agua con un cubo y usar para llenar de agua los frascos de cristal. - - Losa de ladrillos + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - Losa (ladrillos de piedra) + + Se crea al fundir piedra del Inframundo en un horno. Se puede convertir en bloques de ladrillo del Inframundo. - - Losa de roble + + Al recibir energía, emite luz. - - Losa de abeto + + Es similar a una vitrina y muestra el objeto o el bloque que contiene. - - Losa de abedul + + Al lanzarse, puede generar una criatura del tipo indicado. - - Losa de la jungla + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - Losa del Inframundo - + + Puede cultivarse en la granja para cosechar granos de cacao. - - Ladrillo + + Vaca - - Dinamita + + Suelta cuero cuando muere. Se puede ordeñar con un cubo. - - Estantería + + Oveja - - Piedra musgosa + + Las cabezas de enemigos pueden colocarse como decoración o usarse como una máscara en el espacio del casco. - - Obsidiana + + Calamar - - Antorcha + + Suelta bolsas de tinta cuando muere. - - Antorcha (hulla) + + Útil para prender fuego a las cosas o para provocar incendios indiscriminadamente disparándola desde un dispensador. - - Antorcha (carbón) + + Flota en el agua y se puede caminar sobre él. - - Fuego + + Se usa para construir fortalezas del Inframundo. Es inmune a las bolas de fuego del espectro. - - Generador de monstruos + + Se usa en las fortalezas del Inframundo. - - Escaleras de roble + + Cuando se lanza, indica la dirección a un portal a El Fin. Cuando se colocan doce de ellos en las estructuras del portal a El Fin, el portal será activado. - - Cofre + + Se usa para elaborar pociones. - - Polvo de piedra rojiza + + Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. - - Mineral de diamante + + Se encuentra en las fortalezas del Inframundo y suelta verrugas del Inframundo cuando se rompe. - - Bloque de diamante + + Un tipo de bloque que se encuentra en El Fin. Tiene una resistencia contra explosiones elevada, así que es útil para utilizar en la construcción. - - Una forma compacta de almacenar diamantes. + + Este bloque se crea al derrotar al dragón en El Fin. - - Mesa de trabajo + + Cuando se lanza, suelta orbes de experiencia que aumentan tus puntos de experiencia cuando se recogen. - - Cultivos + + Permite encantar espadas, picos, hachas, palas, arcos y armaduras utilizando puntos de experiencia. - - Granja + + Se puede activar con doce ojos de Ender y permite al jugador viajar a la dimensión El Fin. - - Horno + + Se usa para crear un portal a El Fin. - - Cartel + + Cuando se activa (por medio de un botón, una palanca, una placa de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. - - Puerta de madera + + Se cuece con arcilla en un horno. - - Escalera + + Se cuece y se convierte en ladrillo en un horno. - - Rieles + + Cuando se rompe suelta bolas de arcilla que se pueden cocer y convertir en ladrillos en un horno. - - Rieles propulsores + + Se corta con un hacha y se puede convertir en tablones o usar como combustible. - - Rieles detectores + + Se crea en el horno al fundir arena. Se puede usar en la construcción, pero si intentas extraerlo, se romperá. - - Escaleras de piedra + + Se extrae de la piedra con un pico. Se puede usar para construir un horno o herramientas de madera. - - Palanca + + Una forma compacta de almacenar bolas de nieve. - - Placa de presión + + Junto con un tazón se puede convertir en estofado. - - Puerta de hierro + + Solo se puede extraer con un pico de diamante. Se produce al combinar agua con lava inmóvil y se usa para construir portales. - - Mineral de piedra rojiza + + Genera monstruos en el mundo. - - Antorcha piedra roja + + Se puede excavar con una pala para crear bolas de nieve. - - Botón + + A veces produce semillas de trigo cuando se rompe. - - Nieve + + Se puede convertir en tinte. - - Hielo + + Se recoge con una pala. A veces produce pedernal cuando se excava. Le afecta la gravedad si no hay ningún otro bloque por debajo. - - Cactus + + Se puede extraer con un pico para obtener hulla. - - Arcilla + + Se puede extraer con un pico de piedra o un objeto mejor para obtener lapislázuli. - - Caña de azúcar + + Se puede extraer con un pico de hierro o un objeto mejor para obtener diamantes. - - Tocadiscos + + Se usa como elemento decorativo. - - Valla + + Se puede extraer con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. - - Calabaza + + Se puede extraer con un pico de piedra o un objeto mejor y después fundir en un horno para producir lingotes de hierro. - - Calabaza iluminada + + Se puede extraer con un pico de hierro o un objeto mejor para obtener polvo de piedra rojiza. - - Bloque del Inframundo + + No se puede romper. + + + Prende fuego a cualquier cosa que toque. Se puede recoger en un cubo. - - Arena de almas + + Se recoge con una pala. Se puede fundir y convertir en cristal en el horno. Le afecta la gravedad si no hay ningún otro bloque por debajo. - - Piedra brillante + + Se puede extraer con un pico para obtener guijarros. - - Portal + + Se recoge con una pala. Se puede emplear en la construcción. - - Mineral de lapislázuli + + Se puede plantar y con el tiempo se convierte en un árbol. - - Bloque de lapislázuli + + Se coloca en el suelo para transportar una descarga eléctrica. Si se elabora con una poción, aumenta la duración del efecto. - - Una forma compacta de almacenar lapislázuli. + + Se obtiene al matar a una vaca y se puede convertir en armadura o usar para fabricar libros. - - Dispensador + + Se obtiene al matar a un limo y se usa como ingrediente para elaborar pociones o se crea para hacer pistones adhesivos. - - Bloque de nota + + Las gallinas lo ponen al azar y se puede convertir en alimentos. - - Pastel + + Se obtiene al excavar grava y se puede usar para crear un encendedor de pedernal. - - Cama + + Si se usa con un cerdo te permite montarlo. Podrás dirigir al cerdo usando un palo con zanahoria. - - Telaraña + + Se obtiene al excavar nieve y se puede arrojar. - - Hierba alta + + Se obtiene al extraer una piedra brillante y se puede convertir en bloques de piedra brillante otra vez o elaborarse con una poción para aumentar la potencia del efecto. - - Arbusto muerto + + Si se rompen, a veces sueltan un brote que se puede plantar para que crezca un árbol. - - Diodo + + Se encuentra en subterráneos, se puede emplear en la construcción y en la decoración. - - Cofre cerrado + + Se usan para obtener lana de las ovejas y cosechar bloques de hojas. - - Trampilla + + Se obtiene al matar a un esqueleto. Se puede convertir en polvo de hueso. Se puede dar de comer a un lobo para domarlo. - - Lana (cualquier color) + + Se obtiene al hacer que un esqueleto mate a un creeper. Se puede reproducir en un tocadiscos. - - Pistón + + Apaga el fuego y ayuda a que crezcan las cosechas. Se puede recoger en un cubo. - - Pistón adhesivo + + Se recoge de los cultivos y se puede usar para crear alimentos. - - Bloque de pez plateado + + Se pueden usar para crear azúcar. - - Ladrillo de piedra + + Se puede usar como casco o convertir en antorcha para crear una calabaza iluminada. También es el ingrediente principal de la tarta de calabaza. - - Ladrillo de piedra musgosa + + Si se le prende fuego, arderá para siempre. - - Ladrillo de piedra agrietada + + Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. - - Ladrillo de piedra cincelada + + Terreno preparado para plantar semillas. - - Champiñón + + Se pueden cocinar en un horno para crear tinte verde. - - Champiñón + + Frena el movimiento de cualquier cosa que camina sobre ella. - - Barras de hierro + + Se consigue al matar a una gallina y se puede convertir en una flecha. - - Panel de cristal + + Se consigue al matar a un creeper y se puede convertir en dinamita o usar como ingrediente para elaborar pociones. - - Melón + + Se pueden plantar en una granja para que crezcan cultivos. ¡Asegúrate de que hay luz suficiente para que prosperen! - - Tallo de calabaza + + Si te colocas en el portal podrás trasladarte del mundo superior al Inframundo y viceversa. - - Tallo de melón + + Se usa como combustible en un horno o se puede convertir en una antorcha. - - Enredaderas + + Se consigue al matar a una araña y se puede convertir en un arco o caña de pescar, o colocar en el suelo para crear cables trampa. - - Puerta de valla + + Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. - - Escaleras de ladrillo + + Desarrollo mercantil - - Esc. de ladrillos de piedra + + Director de inversiones - - Piedra de pez plateado + + Coordinador de producto - - Guijarro de piedra de pez plateado + + Equipo de desarrollo - - Ladrillo de piedra de pez plateado + + Coordinador de lanzamiento - - Micelio + + Director de XBLA Publishing - - Nenúfar + + Marketing - - Ladrillo del Inframundo + + Equipo de localización de Asia - - Valla del Inframundo + + Equipo de investigación de usuario - - Escaleras del Inframundo + + Equipos principales de MGS - - Verruga del Inframundo + + Coordinador de comunidad - - Mesa de encantamientos + + Equipo de localización de Europa - - Soporte para pociones + + Equipo de localización de Redmond - - Caldero + + Equipo de diseño - - Portal a El Fin + + Director de diversión - - Marco de portal a El Fin + + Música y efectos - - Piedra de El Fin + + Programación - - Huevo de dragón + + Arquitecto en jefe - - Arbusto + + Desarrollador artístico - - Helecho + + Creador de juego - - Esc. de losas de arenisca + + Arte - - Escaleras de abeto + + Productor - - Escaleras de abedul + + Jefe de pruebas de control de calidad - - Esc. madera de jungla + + Jefe de pruebas - - Lámpara de piedra rojiza + + Control de calidad - - Cacao + + Productor ejecutivo - - Calavera + + Jefe de producción - - Controles actuales + + Certificador de calidad de logros - - Configuración + + Pala de hierro - - Mover/Correr + + Pala de diamante - - Mirar + + Pala de oro - - Pausar + + Espada de oro - - Saltar + + Pala de madera - - Saltar/Volar hacia arriba + + Pala de piedra - - Inventario + + Pico de madera - - Cambiar objeto + + Pico de oro - - Acción + + Hacha de madera - - Usar + + Hacha de piedra - - Crear + + Pico de piedra - - Soltar + + Pico de hierro - - Sigilo + + Pico de diamante - - Sigilo/Volar hacia abajo + + Espada de diamante - - Cambiar modo cámara + + SDET - - Jugadores/Invitar + + STE de proyecto - - Movimiento (al volar) + + STE adicionales - - Opción 1 + + Agradecimientos especiales - - Opción 2 + + Coordinador de pruebas de control de calidad - - Opción 3 + + Jefe sénior de pruebas de control de calidad - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Socios de control de calidad - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Espada de madera - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Espada de piedra - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Espada de hierro - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Jon Kågström - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Tobias Möllstam - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Risë Lugo - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Desarrollador - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Te dispara bolas de fuego que explotan al entrar en contacto. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Limo - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Escupe limos más pequeños cuando recibe daños. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Hombre-cerdo zombi - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + En principio es manso, pero si atacas a uno, atacará en grupo. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Espectro - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Enderman - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Araña de las cuevas - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Tiene una picadura venenosa. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Champivaca - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Te ataca si lo miras. También puede mover bloques de lugar. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Pez plateado - - {*B*}Oprime{*CONTROLLER_VK_A*} para continuar. + + Atrae a los peces plateados ocultos cercanos al atacarlo. Se oculta en bloques de piedra. - - {*B*}Oprime{*CONTROLLER_VK_A*} para comenzar el tutorial.{*B*} - Oprime{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar tú solo. + + Te ataca cuando está cerca. - - 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. + + Suelta chuletas de cerdo cuando muere. Se puede montar con una silla. - - Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. + + Lobo - - Usa{*CONTROLLER_ACTION_MOVE*} para moverte. + + Es dócil hasta que lo atacan, ya que devolverá el ataque. Se puede domar con huesos para que te siga a todas partes y ataque a cualquier cosa que te ataque a ti. - - Para correr, oprime{*CONTROLLER_ACTION_MOVE*} hacia delante dos veces con rapidez. Mientras mantienes oprimido{*CONTROLLER_ACTION_MOVE*} hacia delante, el personaje seguirá corriendo a menos que te quedes sin tiempo de carrera o sin comida. + + Gallina - - Oprime{*CONTROLLER_ACTION_JUMP*} para saltar. + + Suelta plumas cuando muere y pone huevos al azar. - - Mantén oprimido{*CONTROLLER_ACTION_ACTION*} para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... + + Cerdo - - Mantén oprimido{*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 aparezca en tu inventario. + + Creeper - - Oprime{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. + + Araña - - A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} - Oprime{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. + + Te ataca cuando está cerca. Puede trepar por muros. Suelta cuerda cuando muere. - - Cuando te mueves, extraes o atacas, tu barra de comida se vacía{*ICON_SHANK_01*}. Si corres y saltas, consumes más comida que si caminas y saltas de forma normal. + + Zombi - - 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, la barra de comida se recargará. + + ¡Explota si te acercas demasiado! - - Si tienes comida en la mano, mantén oprimido{*CONTROLLER_ACTION_USE*} para comerla y recargar la barra de comida. No puedes comer si la barra de comida está llena. + + Esqueleto - - 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*} + + Te dispara flechas. Suelta flechas y huesos cuando muere. - - La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} + + Crea estofado de champiñón si se usa en un tazón. Suelta champiñones y se convierte en una vaca normal cuando se esquila. - - Muchas creaciones conllevan realizar múltiples acciones. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de trabajo.{*CraftingTableIcon*} + + Diseño original y programación - - Para que la recolección de bloques sea más rápida, puedes construir herramientas diseñadas para tal efecto. Algunas herramientas tienen un mango de palo. Crea algunos palos ahora.{*SticksIcon*} + + Coordinador de proyecto/Productor - - Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. + + Resto del despacho Mojang - - Utiliza{*CONTROLLER_ACTION_USE*} para usar objetos, interactuar con ellos y colocarlos. Los objetos colocados se pueden volver a recoger extrayéndolos con la herramienta adecuada. + + Artista conceptual - - Para colocar una mesa de trabajo, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. + + Cálculos y estadísticas - - Apunta hacia la mesa de trabajo y oprime{*CONTROLLER_ACTION_USE*} para abrirla. + + Coordinador de bullies - - Con una pala puedes excavar bloques blandos, como tierra y nieve, con mayor rapidez. 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*} + + Jefe de programación de Minecraft PC - - Con un hacha puedes cortar madera y bloques de madera con mayor rapidez. 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*} + + Atención al cliente - - Con un pico puedes excavar bloques duros, como piedra y mineral, con mayor rapidez. 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*} + + DJ de la oficina - - Abre el contenedor. + + Diseñador/Programador de Minecraft - Pocket Edition - - - La noche cae enseguida, y es un momento peligroso para salir sin estar preparado. Puedes crear armaduras y armas, pero lo más sensato es disponer de un refugio seguro. - + + Programador ninja - - - Cerca de aquí hay un refugio de minero abandonado que puedes terminar para mantenerte a salvo por la noche. - + + Director ejecutivo - - - Para terminar el refugio tendrás que recoger recursos. Los muros y los techos se fabrican con cualquier tipo de bloque, pero tendrás que crear una puerta, ventanas e iluminación. - + + Empleado de cuello blanco + + + Animador de explosivos - - Usa tu pico para extraer algunos bloques de piedra. Al hacerlo, producirán guijarros. 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*} + + Un dragón negro y grande que se encuentra en El Fin. - - Ya recogiste suficientes guijarros para construir un horno. Usa la mesa de trabajo para hacerlo. + + Llama - - Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. + + Son enemigos que se encuentran en el Inframundo, principalmente dentro de sus fortalezas. Sueltan varas de llama cuando mueren. - - Usa el horno para crear carbón. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? + + Golem de nieve - - Usa el horno para crear cristal. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? + + Se crea con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. - - 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*} + + Dragón Ender - - Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el mundo. + + Cubo de magma - - 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*} + + Se encuentra en junglas. Puede domarse dándole de comer pescado crudo. Tienes que dejar que se te acerque, aunque ten cuidado: un movimiento repentino lo espantará. - - - Completaste la primera parte del tutorial. - + + Golem de hierro - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} - Oprime{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar solo. - + + Aparece en aldeas para protegerlas y puede crearse usando bloques de hierro y calabazas. - - - Este es tu inventario. Muestra los objetos que llevas en la mano y los demás objetos que tengas. Aquí también aparece tu armadura. - + + Se encuentran en el Inframundo. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. - + + Aldeano - - - Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el puntero. Usa{*CONTROLLER_VK_A*} para recoger un objeto señalado con el puntero. - Si hay más de un objeto, los recogerás todos; también puedes usar{*CONTROLLER_VK_X*} para recoger solo la mitad de ellos. - + + Ocelote - - - Mueve el objeto con el puntero hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. - Si hay varios objetos en el puntero, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno. - + + Permite la creación de encantamientos más poderosos cuando se coloca en una mesa de encantamiento. - - - Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + + {*T3*}CÓMO SE JUEGA: HORNO{*ETW*}{*B*}{*B*} +En el horno puedes transformar objetos con fuego. Por ejemplo, puedes convertir mineral de hierro en lingotes de hierro.{*B*}{*B*} +Coloca el horno en el mundo y oprime{*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 el 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. - - - Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y oprime {*CONTROLLER_VK_BACK*}. + + {*T3*}CÓMO SE JUEGA: DISPENSADOR{*ETW*}{*B*}{*B*} +El dispensador se usa para arrojar objetos. Para eso tendrás que colocar un interruptor (una palanca, por ejemplo) junto al dispensador para accionarlo.{*B*}{*B*} +Para llenar el dispensador con objetos, oprime{*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. - - - Oprime{*CONTROLLER_VK_B*} ahora para salir del inventario. + + {*T3*}CÓMO SE JUEGA: ELABORACIÓN DE POCIONES{*ETW*}{*B*}{*B*} +Para elaborar pociones se necesita un soporte para pociones que se puede construir en la mesa de trabajo. Todas las pociones se empiezan con una botella de agua, que se obtiene al llenar un frasco de cristal con agua de un caldero o una fuente.{*B*} +Los soportes para pociones tienen tres espacios para botellas, de modo que puedes preparar tres pociones a la vez. Se puede usar un ingrediente en las tres botellas, así que procura elaborar siempre las pociones de tres en tres para aprovechar mejor tus recursos.{*B*} +Si colocas un ingrediente de poción en la posición superior del soporte para pociones, tras un breve periodo de tiempo obtendrás una poción básica. Esto no tiene ningún efecto por sí mismo, pero si añades otro ingrediente a 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 Inframundo{*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 de piedra 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. - - - Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + + {*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. - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. + + {*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. Oprime{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. - - - Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el puntero. - En una lista de objetos, usa{*CONTROLLER_VK_A*} para recoger un objeto que esté bajo el puntero y usa{*CONTROLLER_VK_Y*} para recoger un montón entero de ese objeto. + + {*T3*}CÓMO SE JUEGA: MESA DE TRABAJO{*ETW*}{*B*}{*B*} +Con una mesa de trabajo puedes crear objetos más grandes.{*B*}{*B*} +Coloca la mesa en el mundo y oprime{*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 más amplia de objetos para crear. - - - El puntero se desplazará automáticamente sobre un espacio de la fila en uso. Usa{*CONTROLLER_VK_A*} para colocarlo. Después de colocar el objeto, el puntero volverá a la lista de objetos y podrás seleccionar otro. + + {*T3*}CÓMO SE JUEGA: ENCANTAMIENTOS{*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 encantar 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 encantamiento, los tres botones de la parte derecha del espacio mostrarán algunos encantamientos y sus niveles de experiencia correspondientes.{*B*} +Si no tienes suficientes niveles de experiencia para usarlos, el costo aparecerá en rojo; de lo contrario, aparecerá en verde.{*B*}{*B*} +El encantamiento que se aplica se selecciona aleatoriamente en función del costo que aparece.{*B*}{*B*} +Si la mesa de encantamiento 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 encantamiento, la intensidad de los encantamientos aumentará y aparecerán glifos arcanos en el libro de la mesa de encantamientos.{*B*}{*B*} +Todos los ingredientes para la mesa de encantamientos se pueden encontrar en las aldeas de un mundo o al extraer minerales y cultivar en él.{*B*}{*B*} +Los libros encantados se usan en el yunque para aplicar encantamientos a los objetos. Esto te proporciona más control sobre qué encantamientos quieres en tus objetos.{*B*} - - - Si desplazas el puntero 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, oprime{*CONTROLLER_VK_X*}. - + + {*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 oprime{*CONTROLLER_VK_RB*} para seleccionar el mensaje de función 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 seguir con él o dejarlo bloqueado. - + - 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. - + {*T3*}CÓMO SE JUEGA: OPCIONES DE ANFITRIÓN Y DE JUGADOR{*ETW*}{*B*}{*B*} + + {*T1*}Opciones de partida{*ETW*}{*B*} + Al cargar o crear un mundo, oprime el botón "Más opciones" para entrar en un menú donde podrás tener más control sobre tu partida.{*B*}{*B*} + + {*T2*}Jugador contra jugador{*ETW*}{*B*} + Si está habilitado, 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 se inhabilita, los jugadores que se unen a la partida 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ú del juego.{*B*}{*B*} + + {*T2*}El fuego se propaga{*ETW*}{*B*} + Si está habilitado, 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á habilitado, la dinamita explota cuando se detona. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + + {*T2*}Privilegios de anfitrión{*ETW*}{*B*} + Si está habilitado, el anfitrión puede activar su habilidad para volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Ciclo de luz diurna{*ETW*}{*B*} + Si está habilitado, la hora del día no cambiará.{*B*}{*B*} + + {*T2*}Mantener inventario{*ETW*}{*B*} + Si está habilitado, los jugadores conservarán su inventario al morir.{*B*}{*B*} + + {*T2*}Generación de enemigos{*ETW*}{*B*} + Si se inhabilita, los enemigos no se generarán naturalmente.{*B*}{*B*} + + {*T2*}Enemigos irritantes{*ETW*}{*B*} + Si está habilitado, impide que los monstruos y animales cambien bloques (por ejemplo, las explosiones de creeper no destruirán bloques y las ovejas no quitarán hierba) o recojan objetos.{*B*}{*B*} + + {*T2*}Tesoros de enemigos{*ETW*}{*B*} + Si se inhabilita, los monstruos y los animales no soltarán tesoros para saquear (por ejemplo, los creepers no soltarán pólvora).{*B*}{*B*} + + {*T2*}Soltar bloques{*ETW*}{*B*} + Si se inhabilita, los bloques que sean destruidos no soltarán objetos (por ejemplo, los bloques de piedra no soltarán guijarros).{*B*}{*B*} + + {*T2*}Regeneración natural{*ETW*}{*B*} + Si se inhabilita, los jugadores no recuperarán la salud de forma natural.{*B*}{*B*} + + {*T1*}Opciones de generación del mundo{*ETW*}{*B*} + Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} + + {*T2*}Generar estructuras{*ETW*}{*B*} + Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo.{*B*}{*B*} + + {*T2*}Mundo superplano{*ETW*}{*B*} + Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el Inframundo.{*B*}{*B*} + + {*T2*}Cofre de bonificación{*ETW*}{*B*} + Si está habilitado, se creará un cofre con objetos útiles cerca del punto de reaparición del jugador.{*B*}{*B*} + + {*T2*}Restablecer Inframundo{*ETW*}{*B*} + Si está habilitado, se volverá a generar el Inframundo. Es útil si tienes una partida guardada anterior en la que no había fortalezas del Inframundo.{*B*}{*B*} + + {*T1*}Opciones de partida{*ETW*}{*B*} + Dentro del juego se pueden acceder a varias opciones oprimiendo {*BACK_BUTTON*} para mostrar el menú del juego.{*B*}{*B*} + + {*T2*}Opciones de anfitrión{*ETW*}{*B*} + El anfitrión y cualquier jugador designado como moderador pueden acceder al menú "Opciones de anfitrión". En este menú se puede habilitar y deshabilitar la propagación del fuego y la explosión de dinamita.{*B*}{*B*} + + {*T1*}Opciones de jugador{*ETW*}{*B*} + Para modificar los privilegios de un jugador, selecciona su nombre y oprime {*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á deshabilitado. Cuando esta opción está habilitada, el jugador puede interactuar con el mundo de forma normal. Si está deshabilitada, el jugador no puede colocar ni destruir bloques, ni interactuar 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á deshabilitado. Si esta opción está deshabilitada, el jugador no puede usar puertas ni interruptores.{*B*}{*B*} + + {*T2*}Puede abrir contenedores{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Si 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á deshabilitado. Si esta opción está deshabilitada, el jugador no puede hacer daño a otros jugadores.{*B*}{*B*} + + {*T2*}Puede atacar a animales{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está deshabilitado. Si esta opción está deshabilitada, el jugador no puede hacer daño 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 anfitrión) si "Confiar en jugadores" está deshabilitado, expulsar jugadores y activar y desactivar la propagación del fuego y que la dinamita explote.{*B*}{*B*} + + {*T2*}Expulsar jugador{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + + {*T1*}Opciones de anfitrión{*ETW*}{*B*} + Si "Privilegios de anfitrión" está habilitado, el anfitrión podrá modificar algunos privilegios para sí mismo. Para modificar los privilegios de un jugador, selecciona su nombre y oprime {*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. 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 agotamiento{*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 teletransportar{*ETW*}{*B*} + Permite al jugador mover a jugadores o a él mismo al lugar del mundo en el que estén otros jugadores. + - - - Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y oprime{*CONTROLLER_VK_BACK*} . - + + Página siguiente - - - Oprime{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. + + {*T3*}CÓMO SE JUEGA: CUIDAR ANIMALES{*ETW*}{*B*}{*B*} +Si quieres mantener a tus animales en un único lugar, construye una zona cercada de menos de 20x20 bloques y mete dentro a tus animales. Así te asegurarás de que estén ahí cuando vuelvas. - - - Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. - + + {*T3*}CÓMO SE JUEGA: REPRODUCCIÓN DE 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 se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el modo Amor.{*B*} +Si alimentas con trigo a las vacas, champivacas u ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del Inframundo a las gallinas, 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 se encuentren dos animales en modo Amor de la misma especie, se besarán durante unos segundos y aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de crecer y convertirse en adulta.{*B*} +Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo.{*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. - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo crear. + + {*T3*}CÓMO SE JUEGA: PORTAL DEL INFRAMUNDO{*ETW*}{*B*}{*B*} +El portal del Inframundo permite al jugador viajar entre el mundo superior y el Inframundo. El Inframundo sirve para viajar a toda velocidad por el mundo superior, ya que un bloque de distancia en el Inframundo equivale a tres bloques en el mundo superior. Así, cuando construyas un portal en el Inframundo y salgas por él, estarás tres veces más lejos del punto de entrada.{*B*}{*B*} +Se necesitan un mínimo de diez bloques de obsidiana para construir el portal, y el portal debe tener cinco bloques de alto, cuatro de ancho y uno de profundidad. Una vez construida la estructura del portal, tendrás que prender fuego al espacio interior para activarlo. Para eso, usa los objetos "encendedor de pedernal" o "descarga de fuego".{*B*}{*B*} +En la imagen de la derecha dispones de ejemplos de construcción de un portal. - - {*B*} - Oprime{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. + + {*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 puntero 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 adelante. - - {*B*} - Oprime{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. - + + ¿Estuviste en la Minecon? - - {*B*} - Oprime{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. - + + Nadie de Mojang le ha visto jamás la cara a Junkboy. - - - 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. - + + ¿Sabías que hay una wiki de Minecraft? + + + No mires directamente a los bichos. - - - La zona de creación indica los objetos que se necesitan para crear el nuevo objeto. Oprime{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. - + + Los creepers surgieron de un fallo de código. - - - Con una mesa de trabajo puedes crear una mayor selección de objetos. La creación en una mesa se realiza igual que la creación normal, pero dispones de un área más amplia que permite más combinaciones de ingredientes. - + + ¿Es una gallina o es un pato? - - - 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. - + + ¡El nuevo despacho de Mojang es genial! - - - Ahora aparece la descripción del objeto seleccionado, que puede darte una idea de la utilidad de ese objeto. - + + {*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*} +Oprime{*CONTROLLER_ACTION_JUMP*} para saltar.{*B*}{*B*} +Oprime{*CONTROLLER_ACTION_MOVE*} dos veces hacia delante en sucesión rápida para correr. Mientras mantienes oprimido {*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 oprimido{*CONTROLLER_ACTION_ACTION*} para extraer y cortar con la mano o con cualquier objeto que sostengas. Quizá necesites crear una herramienta para extraer algunos bloques.{*B*}{*B*} +Si tienes un objeto en la mano, usa{*CONTROLLER_ACTION_USE*} para utilizar ese objeto u oprime{*CONTROLLER_ACTION_DROP*} para soltarlo. - - - Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. - + + {*T3*}CÓMO SE JUEGA: PANEL DE DATOS{*ETW*}{*B*}{*B*} +El panel de datos 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 muestra 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 minerales 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. - - La leña que recojas se puede convertir en tablones. Selecciona el ícono de tablones y oprime{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} + + {*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 puntero. Usa{*CONTROLLER_VK_A*} para tomar el objeto que se encuentra bajo el puntero. Si hay más de un objeto, los tomará todos; también puedes usar{*CONTROLLER_VK_X*} para tomar solo la mitad de ellos.{*B*}{*B*} +Mueve el objeto con el puntero hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. Si hay varios objetos en el puntero, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno.{*B*}{*B*} +Si el 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*} +Se puede cambiar el color de tu armadura de cuero tiñéndola. Puedes hacerlo en el menú del inventario sosteniendo el tinte en tu puntero, luego oprime{*CONTROLLER_VK_X*} cuando el puntero esté sobre el artículo que quieres teñir. - - - Ahora que ya construiste una mesa de trabajo, deberías colocarla en el mundo para poder crear una mayor selección de objetos.{*B*} - Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. - + + ¡Minecon 2013 tuvo lugar en Orlando, Florida, EE. UU.! - - - Oprime{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar al tipo de grupo de los objetos que quieres crear. Selecciona el grupo de herramientas.{*ToolsIcon*} - + + .party() fue excelente. - - - Oprime{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar al tipo de grupo de los objetos que quieres crear. Selecciona el grupo de estructuras.{*StructuresIcon*} - + + Supón siempre que los rumores son falsos, ¡no te los creas! - - - 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*} - + + Página anterior - - - Muchas creaciones conllevan realizar múltiples acciones. 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 trabajo.{*CraftingTableIcon*} - + + Comercio - - - Con las herramientas que has creado, ya estás listo para empezar, y podrás reunir varios materiales de forma más eficaz.{*B*} - Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. - + + Yunque - - - Hay objetos que no se pueden crear con la mesa de trabajo y requieren un horno. Crea un horno ahora.{*FurnaceIcon*} - + + El Fin - - - Coloca el horno que creaste en el mundo. Te conviene colocarlo en el interior del refugio.{*B*} - Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. - + + Bloquear niveles - - - Esta es la interfaz del horno. En él puedes transformar objetos fundiéndolos o, por ejemplo, convertir mineral de hierro en lingotes de hierro. - + + Modo Creativo - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. - + + Opciones de anfitrión y de jugador - - - 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. - + + {*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 a El Fin activo. Encontrarás el portal a El Fin en una fortaleza, en lo más profundo del mundo superior.{*B*} +Para activar el portal a El Fin, debes colocar un ojo de Ender en la estructura de un portal a El Fin 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 Ender, un feroz y poderoso enemigo, además de muchos enderman, 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 de Ender que el dragón Ender usa para curarse, así que lo primero que deberás hacer será destruirlos todos.{*B*} +Podrás alcanzar los primeros con flechas, pero los últimos están en una jaula con barrotes de hierro. Tendrás que ascender para llegar a ellos.{*B*}{*B*} +Mientras lo haces, el dragón Ender volará hacia ti y te atacará escupiendo bolas de ácido de Ender.{*B*} +Si te acercas al pedestal del huevo en el centro de los pilares, el dragón Ender descenderá 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 Ender para hacerle el máximo daño posible. ¡Si puedes, trae 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 a El Fin dentro de la fortaleza en sus mapas, para que puedan unirse a ti fácilmente. + - - - Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También descubrirás otros objetos en el mundo que funcionan como combustible. - + + {*ETB*}¡Hola de nuevo! Quizás no te hayas dado cuenta, pero actualizamos Minecraft.{*B*}{*B*} +Hay un montón de novedades con las que te divertirás con tus amigos. A continuación te detallamos algunas. ¡Lee y diviértete!{*B*}{*B*} +{*T1*}Nuevos objetos{*ETB*}: arcilla endurecida, arcilla de color, bloque de hulla, bloque de paja, vía de activación, bloque de piedra rojiza, sensor de luz de día, soltador, tolva, vagoneta con tolva, vagoneta con dinamita, comparador de piedra rojiza, placa de presión con peso, baliza, cofre con trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del Inframundo, correa, barda, marca de nombre y huevo generador de caballo.{*B*}{*B*} +{*T1*}Nuevos enemigos{*ETB*}: Wither, esqueleto Wither, brujas, murciélagos, caballos, burros y mulas.{*B*}{*B*} +{*T1*}Nuevas funciones{*ETB*}: doma y monta a caballo, fabrica fuegos artificiales y da un espectáculo, nombra a los animales y a los monstruos con las marcas de nombre, crea circuitos de piedra rojiza más avanzados y nuevas opciones de anfitrión para controlar lo que tus invitados al mundo pueden hacer.{*B*}{*B*} +{*T1*}Nuevo mundo tutorial{*ETB*}: aprende a usar las funciones nuevas y antiguas en el mundo tutorial. ¡Intenta encontrar todos los discos secretos ocultos en el mundo tutorial!{*B*}{*B*} + - - - 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. - + + Causas más daño que con la mano. - - - 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. - + + 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. - - - El carbón se puede usar como combustible y convertirse en una antorcha con un palo. - + + Correr - - - 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. - + + Novedades - - - Esta es la interfaz de elaboración de pociones. Se puede usar para crear pociones con efectos diversos. - + + {*T3*}Cambios y añadidos{*ETW*}{*B*}{*B*} +- Se añadieron objetos nuevos: arcilla endurecida, arcilla de color, bloque de hulla, bloque de paja, vía de activación, bloque de piedra rojiza, sensor de luz de día, soltador, tolva, vagoneta con tolva, vagoneta con dinamita, comparador de piedra rojiza, placa de presión con peso, baliza, cofre con trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del Inframundo, correa, barda, marca de nombre y huevo generador de caballo.{*B*} +- Se añadieron enemigos nuevos: Wither, esqueleto Wither, brujas, murciélagos, caballos, burros y mulas.{*B*} +- Se añadieron funciones nuevas de generación de terreno: cabañas de brujas.{*B*} +- Se añadió la interfaz de la baliza.{*B*} +- Se añadió la interfaz del caballo.{*B*} +- Se añadió la interfaz de la tolva.{*B*} +- Se añadieron fuegos artificiales: puedes acceder a la interfaz de fuegos artificiales desde la mesa de trabajo cuando tengas los ingredientes necesarios para fabricar una estrella de fuegos artificiales o un cohete de fuegos artificiales.{*B*} +- Se añadió el modo Aventura: solo podrás destruir bloques usando las herramientas correctas.{*B*} +- Se añadieron muchos sonidos nuevos.{*B*} +- Los enemigos, objetos y proyectiles pueden atravesar portales ahora.{*B*} +- Los repetidores pueden bloquearse al activar sus lados con otro repetidor.{*B*} +- Los zombis y los esqueletos pueden generarse con arma y armaduras diferentes.{*B*} +- Nuevos mensajes de muerte.{*B*} +- Pon nombre a los enemigos con las marcas de nombre y renombra contenedores para cambiar el título cuando el menú esté abierto.{*B*} +- El polvo de hueso ya no hace crecer todo inmediatamente a tamaño completo, sino que va creciendo por etapas.{*B*} +- Es posible detectar una señal de piedra rojiza con la descripción de los contenidos de los cofres, soportes para pociones, dispensadores y tocadiscos al colocar un comparador de piedra rojiza en dirección opuesta.{*B*} +- Los dispensadores pueden colocarse en cualquier dirección.{*B*} +- El jugador obtendrá salud de absorción extra durante un breve periodo de tiempo al consumir una manzana de oro. +- Cuanto más tiempo pases en un área, más duros serán los monstruos que se generen.{*B*} + - - {*B*} - Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el soporte para pociones. - + + Compartir capturas de pantalla - - - Para elaborar pociones, coloca un ingrediente en la parte superior y una botella de agua o una poción en los espacios inferiores (se pueden elaborar hasta 3 a la vez). Cuando se introduce una combinación válida, comienza la elaboración y, al cabo de poco tiempo, se creará una poción. - + + Cofres - - - Todas las pociones se empiezan con una botella de agua. La mayoría de pociones se crean usando primero una verruga del Inframundo para crear una poción rara, y requieren como mínimo un ingrediente más para obtener la poción final. - + + Creación - - - 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. - + + Horno - - - Si añades ojo de araña fermentado, la poción se corromperá y podría convertirse en otra con el efecto contrario, y si añades pólvora, la convertirás en una poción de salpicadura, que se puede lanzar para aplicar su efecto sobre un área cercana. - + + Fundamentos - - - Para crear una poción de resistencia al fuego, primero añade una verruga del Inframundo a una botella de agua y luego añade crema de magma. - + + Panel de datos - - - Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de elaboración de pociones. - + + Inventario - - - En esta zona hay un soporte para pociones, un caldero y un cofre lleno de objetos para elaborar pociones. - + + Dispensador - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la elaboración y las pociones.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo elaborar pociones. - + + Encantamientos - - - El primer paso para elaborar una poción es crear una botella de agua. Toma un frasco de cristal del cofre. - + + Portal del Inframundo - - - Puedes llenar un frasco de cristal con un caldero que tenga agua o con un bloque de agua. Ahora, para llenar el frasco de cristal, apunta a una fuente de agua y oprime{*CONTROLLER_ACTION_USE*}. - + + Multijugador - - - Si un caldero se vacía, puedes rellenarlo con un cubo de agua. - + + Cuidar animales - - - Usa el soporte para pociones para crear una poción de resistencia al fuego. Necesitarás una botella de agua, una verruga del Inframundo y crema de magma. - + + Reproducción de animales - - - Toma una poción en la mano y mantén oprimido{*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. - + + Elaboración de pociones + + + ¡A deadmau5 le gusta Minecraft! - - - Usa una poción de resistencia al fuego contigo mismo. - + + Los hombres-cerdo no te atacarán a no ser que tú los ataques a ellos. - - - Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. - + + Al dormir en una cama, puedes cambiar el punto de reaparición del personaje y avanzar el juego hasta el amanecer. - - - Esta es la interfaz de encantamiento, que puedes usar para aplicar encantamientos a armas, armaduras y a algunas herramientas. - + + ¡Golpea esas bolas de fuego de vuelta al espectro! - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de encantamientos.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de encantamientos. - + + Crea antorchas para iluminar áreas oscuras de noche. Los monstruos evitarán las áreas cercanas a las antorchas. - - - Para encantar un objeto, primero colócalo en el espacio de encantamiento. Las armas, las armaduras y algunas herramientas se pueden encantar para añadirles efectos especiales, como resistencia mejorada al daño o aumento del número de objetos que se generan al extraer un bloque. - + + ¡Con una vagoneta y rieles llegarás a tu destino más rápido! - - - Cuando se coloca un objeto en el espacio de encantamiento, los botones de la parte derecha cambian y muestran una selección de encantamientos aleatorios. - + + Planta brotes y se convertirán en árboles. - - - El número del botón representa el costo en niveles de experiencia que cuesta aplicar ese encantamiento al objeto. Si tu nivel es insuficiente, el botón no estará activo. - + + Si construyes un portal podrás viajar a otra dimensión: el Inframundo. - - - Selecciona un encantamiento y oprime{*CONTROLLER_VK_A*} para encantar el objeto. Se reducirá el nivel de experiencia en función del costo del encantamiento. - + + Excavar en línea recta hacia abajo o hacia arriba no es buena idea. - - - Aunque los encantamientos son aleatorios, algunos de los mejores solo están disponibles cuando tienes el nivel de experiencia adecuado y muchas estanterías alrededor de la mesa de encantamiento para aumentar su poder. - + + El polvo de hueso (se fabrica con hueso de esqueleto) se puede usar como fertilizante, y hace que las cosas crezcan al instante. - - - En esta zona hay una mesa de encantamiento y otros objetos que te ayudarán a entenderlos y aprender sobre ellos. - + + ¡Los creepers explotan cuando se acercan a ti! - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre encantamientos.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar encantamientos. - + + ¡Oprime{*CONTROLLER_VK_B*} para soltar el objeto que llevas en la mano! - - - Con una mesa de encantamiento 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. - + + ¡Usa la herramienta correcta para el trabajo! - - - Coloca estanterías alrededor de la mesa de encantamiento para aumentar su poder y acceder a encantamientos de nivel superior. - + + Si no encuentras hulla para las antorchas, siempre puedes convertir árboles en carbón en un horno. - - - Encantar objetos cuesta niveles de experiencia, que se aumentan acumulando orbes de experiencia. Estos orbes se generan al matar monstruos y animales, extraer minerales, criar nuevos animales, pescar y fundir o cocinar algunos objetos en un horno. - + + Si comes las chuletas de cerdo cocinadas, recuperarás más salud que si las comes crudas. - - - También puedes aumentar tus niveles de experiencia con una botella de encantamiento que, cuando se lanza, crea orbes de experiencia donde cae. Después podrás recoger esos orbes. - + + Si estableces la dificultad del juego en Pacífico, tu salud se regenerará automáticamente. ¡Además, no saldrán monstruos por la noche! - - - En los cofres de esta zona encontrarás objetos encantados, botellas de encantamientos y objetos que aún están sin encantar para que experimentes con ellos en la mesa de encantamiento. - + + Dale un hueso a un lobo para domarlo. Podrás hacer que se siente o que te siga. - - - Ahora estás en una vagoneta. Para salir de ella, apunta a ella con el cursor y oprime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - + + Para soltar objetos desde el menú Inventario, mueve el cursor fuera del menú y oprime{*CONTROLLER_VK_A*}. - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre las vagonetas.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las vagonetas. - + + ¡Nuevo contenido descargable disponible! Utiliza el botón Tienda de Minecraft del menú principal para acceder a él. - - - Las vagonetas van sobre rieles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. - {*RailIcon*} - + + Puedes cambiar la apariencia de tu personaje con un skin pack de la Tienda de Minecraft. Selecciona "Tienda de Minecraft" en el menú principal para ver qué hay disponible. - - - También puedes crear rieles propulsados, que absorben energía de las antorchas y circuitos de piedra rojiza para acelerar las vagonetas. Se pueden conectar a interruptores, palancas y placas de presión para crear sistemas complejos. - {*PoweredRailIcon*} - + + Ajusta la configuración de gamma para que la visualización del juego sea más clara o más oscura. - - - Ahora navegas en un bote. Para salir de él, apúntalo con el puntero y oprime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - + + Si duermes en una cama de noche, el juego avanzará hasta el amanecer, pero en las partidas multijugador todos los jugadores tienen que dormir en camas a la vez. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los botes.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los botes. - + + Usa un azadón para preparar el terreno para la cosecha. - - - Los botes te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para dirigirlo. - {*BoatIcon*} - + + Las arañas no atacan durante el día, a no ser que tú las ataques a ellas. - - - Ahora usas una caña de pescar. Oprime{*CONTROLLER_ACTION_USE*} para utilizarla.{*FishingRodIcon*} - + + ¡Es más fácil excavar arena o tierra con una pala que a mano! - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la pesca.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo pescar. - + + Extrae chuletas de los cerdos y cocínalas para comerlas y recuperar tu salud. - - - Oprime{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. -Oprime{*CONTROLLER_ACTION_USE*} de nuevo para recoger el sedal. - {*FishingRodIcon*} - + + Extrae cuero de las vacas y úsalo para fabricar armaduras. - - - 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 la salud. - {*FishIcon*} - + + Si tienes un cubo vacío, puedes llenarlo con leche de vaca, agua ¡o lava! - - - Al igual que muchas otras herramientas, la caña tiene distintos usos, los cuales no se limitan a pescar peces. Puedes experimentar con ella e investigar qué se puede pescar o activar... - {*FishingRodIcon*} - + + La obsidiana se crea cuando el agua alcanza un bloque de origen de lava. - - - Esto es una cama. Oprime{*CONTROLLER_ACTION_USE*} y apunta hacia ella de noche para dormir y despertar por la mañana.{*ICON*}355{*/ICON*} - + + ¡Ahora hay vallas apilables en el juego! - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre las camas.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las camas. - + + Algunos animales te seguirán si llevas trigo en la mano. - - - Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Si mueres después de haber usado una cama, te regenerarás en ella. - {*ICON*}355{*/ICON*} - + + Si un animal no puede desplazarse más de 20 bloques en cualquier dirección, no se degenerará. - - - Si hay más jugadores en tu partida, todos deberán estar en cama al mismo tiempo para poder dormir. - {*ICON*}355{*/ICON*} - + + Los lobos domados indican su salud con la posición de su cola. Dales de comer para curarlos. - - - En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. - + + Cocina un cactus en un horno para obtener tinte verde. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y de pistones.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los circuitos de piedra rojiza y de pistones. - + + Lee la sección de Novedades en los menús Cómo se juega para ver la información más actualizada del juego. - - - Las palancas, los botones, las placas de presión y las antorchas de piedra rojiza suministran energía a los circuitos, bien acoplándolos directamente al objeto que quieres activar o bien conectándolos con polvo de piedra rojiza. - + + ¡Música de C418! - - - 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. - + + ¿Quién es Notch? - - - 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 suministrar energía a un máximo de 15 bloques, y se puede desplazar hacia arriba o hacia abajo a un bloque de altura. - {*ICON*}331{*/ICON*} - + + ¡Mojang tiene más premios que empleados! - - - 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*} - + + ¡Hay famosos que juegan Minecraft! + + + ¡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! - - - 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*} - + + ¡Pronto habrá una actualización de este juego! - - - 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. - + + Si colocas dos cofres juntos crearás un cofre grande. - - - ¡En esta área hay un portal del Inframundo! - + + Ten cuidado cuando construyas estructuras de lana al aire libre, ya que los rayos de las tormentas pueden prenderles fuego. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los portales y el Inframundo.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los portales y el Inframundo. - + + Un solo cubo de lava se puede usar para fundir 100 bloques en un horno. - - - Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. - + + El instrumento que toca un bloque de nota depende del material que tenga debajo. - - - Para activar el portal del Inframundo, prende fuego a los bloques de obsidiana del interior de la estructura con un encendedor de pedernal. Los portales se pueden desactivar si se rompe la estructura, si se produce una explosión cerca o si fluye un líquido a través de ellos. - + + Al eliminar el bloque de origen, la lava puede tardar varios minutos en desaparecer por completo. - - - Para usar un portal del Inframundo, 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. - + + Los guijarros son resistentes a las bolas de fuego del espectro, lo que los hace útiles para defender portales. - - - El Inframundo es un lugar peligroso, repleto de lava, pero puede ser útil para recoger bloques del Inframundo, que arden para siempre una vez que se encienden, y piedra brillante, que genera luz. - + + 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 las calabazas iluminadas. - - - El Inframundo sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el Inframundo equivale a desplazarte tres bloques en el mundo superior. - + + Los zombis y los esqueletos pueden sobrevivir a la luz del día si están en el agua. - - - Ahora estás en el modo Creativo. - + + Las gallinas ponen huevos cada 5 a 10 minutos. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre el modo Creativo.{*B*} - Oprime{*CONTROLLER_VK_B*}si ya sabes cómo funciona el modo Creativo. - + + La obsidiana solo se puede extraer con un pico de diamante. - - En el modo Creativo posees un número infinito de todos los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. + + Los creepers son la fuente de pólvora más fácil de obtener. - - Oprime{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. + + 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 hombres-cerdo zombis. - - Para continuar, cruza al otro lado de este agujero. + + Los lobos no pueden entrar en el Inframundo. - - Completaste el tutorial del modo Creativo. + + Los lobos no atacan a los creepers. - - - En esta área se colocó una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. - + + Necesario para extraer bloques de piedra y mineral. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los cultivos.{*B*} - Oprime{*CONTROLLER_VK_B*}si ya sabes cómo funcionan los cultivos. - + + Se usa en la receta de pasteles y como ingrediente para elaborar pociones. - - 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. + + Se activa y desactiva para aplicar una descarga eléctrica. Se mantiene en estado activado o desactivado hasta que se vuelve a oprimir. - - Antes de plantar semillas, debes convertir los bloques de tierra en tierra de cultivo por medio de un azadón. 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. + + Da una descarga eléctrica constante o puede usarse de receptor/transmisor si se conecta al lateral de un bloque. +También puede usarse como iluminación de nivel bajo. - - El trigo pasa por distintas fases durante su crecimiento. Cuando parece más oscuro es que está listo para la cosecha.{*ICON*}59:7{*/ICON*} + + Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. - - 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. + + Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Se fabrica con una manzana y pepitas de oro. - - La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. Al cortar un bloque de caña de azúcar, todos los bloques que estén sobre él caerán.{*ICON*}83{*/ICON*} + + Restablece 2{*ICON_SHANK_01*}. Si la comes, puedes envenenarte. - - 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*} + + Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. - - Los champiñones deben plantarse en una zona con luz tenue y se propagarán a los bloques de luz tenue cercanos.{*ICON*}39{*/ICON*} + + Se usa para llevar vagonetas. - - El polvo de hueso se puede usar para germinar cultivos hasta su estado de mayor crecimiento o cultivar champiñones hasta que se vuelvan gigantes.{*ICON*}351:15{*/ICON*} + + Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. - - Completaste el tutorial de los cultivos. + + Funciona como una placa de presión: envía una señal de piedra rojiza, pero solo cuando es activada por una vagoneta. - - - En esta área se guardaron animales en corrales. Puedes hacer que los animales se reproduzcan para obtener crías idénticas a ellos. - + + Se usa para enviar una descarga eléctrica cuando se oprime. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre reproducción de animales y cría.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes acerca de reproducción de animales y cría. - + + Se usa para contener y arrojar objetos en orden aleatorio cuando recibe una descarga de piedra rojiza. - - Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el modo Amor. + + Reproduce una nota cuando se activa. Si lo golpeas cambiarás el tono de la nota. Colócalo en la parte superior de distintos bloques para cambiar el tipo de instrumento. - - Si alimentas con trigo a las vacas, champivacas u ovejas; con zanahorias a los cerdos; con semillas de trigo o verrugas del Inframundo a las gallinas, 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. + + Restablece 2.5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en un horno. - - 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. + + Restablece 1{*ICON_SHANK_01*}. - - Después de estar en el modo Amor, los animales no podrán volver a él durante cinco minutos como mínimo. + + Restablece 1{*ICON_SHANK_01*}. - - 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*} + + Recupera 3 de{*ICON_SHANK_01*}. - - - Puedes domesticar a los lobos salvajes con huesos. Una vez domesticados, aparecerán corazones sobre ellos. Los lobos domesticados seguirán al jugador y lo defenderán a menos les ordenen sentarse. - + + Se usa como munición para arcos. - - Completaste el tutorial de reproducción de animales y cría. + + Restablece 2.5{*ICON_SHANK_01*}. - - - En esta zona hay algunas calabazas y bloques para crear un golem de nieve y otro de hierro. - + + Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre los golems.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los golems. - + + Restablece 2{*ICON_SHANK_01*} y se puede cocinar en un horno. Si lo comes crudo, puedes envenenarte. - - Los golems se crean colocando una calabaza encima de un montón de bloques. + + Restablece 1.5{*ICON_SHANK_01*} y se puede cocinar en un horno. - - Los golems de nieve se crean con dos bloques de nieve, uno sobre el otro, y encima una calabaza. Estos golems lanzan bolas de nieve a tus enemigos. + + Restablece 4{*ICON_SHANK_01*}. Se crea cocinando chuleta de cerdo cruda en un horno. - - Los golems de hierro se crean con cuatro bloques de hierro colocados como muestra el modelo y con una calabaza encima del bloque central. Estos golems atacan a tus enemigos. + + Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede dar de comer a un ocelote para domarlo. - - Los golems de hierro aparecen en las aldeas para protegerlas y te atacarán si atacas a los aldeanos. + + Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en un horno. - - No puedes salir de esta área hasta que completes el tutorial. + + Restablece 1.5{*ICON_SHANK_01*} y se puede cocinar en un horno. - - Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para extraer materiales blandos, como tierra y arena. + + Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en un horno. - - Cada herramienta funciona mejor con distintos materiales. Deberías usar un hacha para cortar troncos de árboles. + + Se usa para transportarte sobre los rieles a ti, a un animal o a un monstruo. - - Cada herramienta funciona mejor con distintos materiales. Deberías usar un pico para extraer piedra y mineral. Quizá debas fabricar tu pico con mejores materiales para obtener recursos de algunos bloques. + + Se usa como tinte para crear lana azul claro. - - Hay herramientas que son mejores para atacar a determinados enemigos. Plantéate usar una espada para atacar. + + Se usa como tinte para crear lana cian. - - Consejo: mantén oprimido {*CONTROLLER_ACTION_ACTION*}para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... + + Se usa como tinte para crear lana púrpura. - - La herramienta que usas está dañada. Cada vez que utilizas una herramienta, se desgasta y, con el tiempo, acabará rompiéndose. La barra de colores ubicada debajo del objeto en el inventario muestra el estado de daños actual. + + Se usa como tinte para crear lana limón. - - Mantén oprimido{*CONTROLLER_ACTION_JUMP*} para nadar. + + Se usa como tinte para crear lana gris. - - En esta área hay una vagoneta en una vía. Para subir a una vagoneta, apunta con el cursor hacia ella y oprime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. + + Se usa como tinte para crear lana gris claro. (Nota: combinar tinte gris con polvo de hueso creará 4 tintes gris claro de cada bolsa de tinta en vez de 3). - - En el cofre que está junto al río hay un bote. Para usarlo, apunta al agua con el cursor y oprime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al bote para subir a él. + + Se usa como tinte para crear lana magenta. - - En el cofre que está junto al estanque hay una caña de pescar. Toma la caña del cofre y selecciónala para llevarla en la mano y usarla. + + 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. - - ¡Este mecanismo de pistones más avanzado crea un puente autorreparable! Oprime el botón para activarlo e investiga la forma en que los componentes interaccionan para averiguar su funcionamiento. + + Se usa para crear libros y mapas. - - Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltar ese objeto. + + Se usa para crear estanterías o encantamiento para hacer libros encantados. - - No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. + + Se usa como tinte para crear lana azul. - - - ¡Felicidades! Completaste 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! - + + Reproduce discos. - - {*EXIT_PICTURE*} Cuando estés listo para seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. - + + Úsalos para crear herramientas, armas o armaduras sólidas. - - Recordatorio: + + Se usa como tinte para crear lana naranja. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Se obtiene de las ovejas y se puede colorear con tinte. - - Se añadieron nuevas funciones en la última versión del juego, como áreas nuevas en el tutorial. + + 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. - - {*B*}Oprime{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} - Oprime{*CONTROLLER_VK_B*} para omitir el tutorial principal. + + Se usa como tinte para crear lana negra. - - En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los botes y la piedra rojiza. + + Se usa para transportar mercancías sobre los rieles. - - Fuera de esta zona encontrarás ejemplos de edificios, cultivos, vagonetas y vías, encantamientos, pociones, comercio, herrería y mucho más. + + Se mueve sobre los rieles y empujará a otras vagonetas si se le añade hulla. - - - La barra de comida se agotó hasta un nivel a partir del cual ya no te puedes curar. - + + Te permite desplazarte por el agua más rápido que nadando. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la barra de comida y cómo comer.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funciona la barra de comida y cómo comer. - + + Se usa como tinte para crear lana verde. - - Seleccionar + + Se usa como tinte para crear lana roja. - - Usar + + Se usa para que crezcan al instante cosechas, árboles, hierba alta, champiñones gigantes y flores, y se puede utilizar en recetas de tinte. - - Atrás + + Se usa como tinte para crear lana rosa. - - Salir + + Se usan como tinte para crear lana marrón, como ingrediente de las galletas y para cultivar vainas de cacao. - - Cancelar + + Se usa como tinte para crear lana plateada. - - No unirse + + Se usa como tinte para crear lana amarilla. - - Actualizar partidas online + + Permite ataques a distancia con flechas. - - Partidas en grupo + + Cuando la lleva puesta, el usuario recibe 5 de armadura. - - Todas las partidas + + Cuando las lleva puestas, el usuario recibe 3 de armadura. - - Cambiar grupo + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Mostrar inventario + + Cuando las lleva puestas, el usuario recibe 5 de armadura. - - Mostrar descripción + + Cuando las lleva puestas, el usuario recibe 2 de armadura. - - Mostrar ingredientes + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Fabricar + + Cuando lo lleva puesto, el usuario recibe 3 de armadura. - - Crear + + Un lingote brillante que se usa para fabricar herramientas de este material. Se crea fundiendo mineral en un horno. - - Tomar/Colocar + + 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. - - Tomar + + Se usa para aplicar una descarga eléctrica cuando un jugador, un animal o un monstruo la pisan. Las placas de presión de madera también se activan soltando algo sobre ellas. - - Tomar todo + + Cuando la lleva puesta, el usuario recibe 8 de armadura. - - Tomar la mitad + + Cuando las lleva puestas, el usuario recibe 6 de armadura. - - Colocar + + Cuando las lleva puestas, el usuario recibe 3 de armadura. - - Colocar todo + + Cuando las lleva puestas, el usuario recibe 6 de armadura. - - Colocar uno + + Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. - - Soltar + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Soltar todo + + Cuando lo lleva puesto, el usuario recibe 3 de armadura. - - Soltar uno + + Se usa para cortar bloques de madera más rápido que a mano. - - Cambiar + + Se usa para labrar tierra y hierba y prepararla para el cultivo. - - Movimiento rápido + + Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. - - Borrar selección rápida + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - ¿Qué es esto? + + Cuando los lleva puestos, el usuario recibe 4 de armadura. - - Compartir en Facebook + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Cambiar filtro + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Enviar solicitud de amistad + + Cuando las lleva puestas, el usuario recibe 1 de armadura. - - Avanzar página + + Cuando lo lleva puesto, el usuario recibe 2 de armadura. - - Retroceder página + + Cuando la lleva puesta, el usuario recibe 5 de armadura. - - Siguiente + + Se usan en escaleras compactas. - - Anterior + + Se usa para contener estofado de champiñón. Te quedas el tazón después de comer el estofado. - - Expulsar jugador + + Se usa para contener y transportar agua, lava o leche. - - Teñir + + Se usa para contener y transportar agua. - - Extraer + + Muestra el texto introducido por ti o por otros jugadores. - - Alimentar + + 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. - - Domar + + Se usa para provocar explosiones. Se activa después de su colocación golpeándola con el encendedor de pedernal o con una descarga eléctrica. - - Curar + + Se usa para contener y transportar lava. - - Sentarse + + Muestra la posición del sol y de la luna. - - Sígueme + + Indica tu punto de inicio. - - Expulsar + + Mientras lo sostienes, crea una imagen del área explorada. Se puede usar para buscar rutas. - - Vaciar + + Se usa para contener y transportar leche. - - Silla de montar + + Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. - - Colocar + + Se usa para pescar peces. + + + Se activa al usarla, golpearla o con piedra rojiza. Funciona como una puerta normal, pero tiene el tamaño de un bloque y se encuentra en el suelo. - - Golpear + + Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. - - Ordeñar + + Se usa como material de construcción. No le afecta la gravedad, como a la arena normal. - - Recoger + + Se usa como material de construcción. - - Comer + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - Dormir + + Se usa para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. - - Despertar + + Se usa para crear luz, pero también derrite la nieve y el hielo. - - Reproducir + + Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. - - Montar + + 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. - - Navegar + + 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 como 1 bloque de alto para otros bloques. - - Cultivar + + Se usa para ascender en vertical. - - Nadar hacia arriba + + Se usa para avanzar el tiempo de la noche a la mañana si todos los jugadores están en cama; además cambia su punto de reaparición. El color de la lana que se use no varía el color de la cama. - - Abrir + + Te permite crear una selección más variada de objetos que la creación normal. - - Cambiar tono + + Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. - - Detonar + + Hacha de hierro - - Leer + + Lámpara de piedra rojiza - - Colgar + + Esc. madera de jungla - - Arrojar + + Escaleras de abedul - - Plantar + + Controles actuales - - Labrar + + Calavera - - Cosechar + + Cacao - - Continuar + + Escaleras de abeto - - Desbloquear juego completo + + Huevo de dragón - - Borrar partida guardada + + Piedra de El Fin - - Borrar + + Marco de portal a El Fin - - Opciones + + Esc. de losas de arenisca - - Invitar a amigos + + Helecho - - Aceptar + + Arbusto - - Esquilar + + Configuración - - Bloquear nivel + + Crear - - Seleccionar apariencia + + Usar - - Prender fuego + + Acción - - Desplazar + + Sigilo/Volar hacia abajo - - Instalar versión completa + + Sigilo - - Instalar versión de prueba + + Soltar - - Instalar + + Cambiar objeto - - Reinstalar + + Pausar - - Op. de guardado + + Mirar - - Ejecutar comando + + Mover/Correr - - Creativo + + Inventario - - Mover ingrediente + + Saltar/Volar hacia arriba - - Mover combustible + + Saltar - - Mover herramienta + + Portal a El Fin - - Mover armadura + + Tallo de calabaza - - Mover arma + + Melón - - Equipar + + Panel de cristal - - Sacar + + Puerta de valla - - Soltar + + Enredaderas - - Privilegios + + Tallo de melón - - Bloquear + + Barras de hierro - - Retroceder página + + Ladrillo de piedra agrietada - - Avanzar página + + Ladrillo de piedra musgosa - - Modo Amor + + Ladrillo de piedra - - Beber + + Champiñón - - Rotar + + Champiñón - - Ocultar + + Ladrillo de piedra cincelada - - Vaciar todos los espacios + + Escaleras de ladrillo - - Aceptar + + Verruga del Inframundo - - Cancelar + + Escaleras del Inframundo - - Tienda de Minecraft + + Valla del Inframundo - - ¿Seguro que quieres salir de la partida actual y unirte a la nueva? Se perderá todo el progreso no guardado. + + Caldero - - Salir de la partida + + Soporte para pociones - - Guardar partida + + Mesa de encantamientos - - Salir sin guardar + + Ladrillo del Inframundo - - ¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo por su versión actual? + + Guijarro de piedra de pez plateado - - ¿Seguro que quieres salir sin guardar? ¡Perderás todo el progreso en este mundo! + + Piedra de pez plateado - - Iniciar partida + + Esc. de ladrillos de piedra - - Archivo dañado + + Nenúfar - - El archivo guardado está dañado. ¿Quieres borrarlo? + + Micelio - - ¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores de la partida? Se perderá todo el progreso no guardado. + + Ladrillo de piedra de pez plateado - - Salir y guardar + + Cambiar modo cámara - - Salir sin guardar + + 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, la barra de comida se recargará. - - ¿Seguro que quieres salir al menú principal? Se perderá todo el progreso no guardado. + + Cuando te mueves, extraes o atacas, tu barra de comida se vacía{*ICON_SHANK_01*}. Si corres y saltas, consumes más comida que si caminas y saltas de forma normal. - - ¿Seguro que quieres salir al menú principal? ¡Se perderá tu progreso! + + A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} + Oprime{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. - - Crear nuevo mundo + + La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} - - Jugar tutorial + + 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*} - - Tutorial + + Si tienes comida en la mano, mantén oprimido{*CONTROLLER_ACTION_USE*} para comerla y recargar la barra de comida. No puedes comer si la barra de comida está llena. - - Dar nombre al mundo + + Oprime{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. - - Escribe un nombre para tu mundo. + + Para correr, oprime{*CONTROLLER_ACTION_MOVE*} hacia delante dos veces con rapidez. Mientras mantienes oprimido{*CONTROLLER_ACTION_MOVE*} hacia delante, el personaje seguirá corriendo a menos que te quedes sin tiempo de carrera o sin comida. - - Introduce la semilla para la generación del mundo. + + Usa{*CONTROLLER_ACTION_MOVE*} para moverte. - - Cargar mundo guardado + + Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. - - Oprime START para unirte. + + Mantén oprimido{*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 aparezca en tu inventario. - - Saliendo de la partida + + Mantén oprimido{*CONTROLLER_ACTION_ACTION*} para extraer y cortar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para extraer algunos bloques... - - Se produjo un error. Saliendo al menú principal. + + Oprime{*CONTROLLER_ACTION_JUMP*} para saltar. - - Error de conexión + + Muchas creaciones conllevan realizar múltiples acciones. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de trabajo.{*CraftingTableIcon*} - - Conexión perdida + + + La noche cae enseguida, y es un momento peligroso para salir sin estar preparado. Puedes crear armaduras y armas, pero lo más sensato es disponer de un refugio seguro. + - - Se perdió la conexión con el servidor. Saliendo al menú principal. + + Abre el contenedor. - - Desconectado por el servidor + + Con un pico puedes excavar bloques duros, como piedra y mineral, con mayor rapidez. 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*} - - Te expulsaron de la partida. + + Usa tu pico para extraer algunos bloques de piedra. Al hacerlo, producirán guijarros. 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*} - - Te expulsaron de la partida por volar. + + + Para terminar el refugio tendrás que recoger recursos. Los muros y los techos se fabrican con cualquier tipo de bloque, pero tendrás que crear una puerta, ventanas e iluminación. + - - El intento de conexión tomó demasiado tiempo. + + + Cerca de aquí hay un refugio de minero abandonado que puedes terminar para mantenerte a salvo por la noche. + - - El servidor está lleno. + + Con un hacha puedes cortar madera y bloques de madera con mayor rapidez. 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*} - - El anfitrión abandonó la partida. + + Utiliza{*CONTROLLER_ACTION_USE*} para usar objetos, interactuar con ellos y colocarlos. Los objetos colocados se pueden volver a recoger extrayéndolos con la herramienta adecuada. - - No puedes unirte a esta partida porque no tienes ningún amigo en ella. + + Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. - - No puedes unirte a esta partida porque el anfitrión te ha expulsado anteriormente. + + Para que la recolección de bloques sea más rápida, puedes construir herramientas diseñadas para tal efecto. Algunas herramientas tienen un mango de palo. Crea algunos palos ahora.{*SticksIcon*} - - No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más antigua del juego. + + Con una pala puedes excavar bloques blandos, como tierra y nieve, con mayor rapidez. 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*} - - No puedes unirte a esta partida porque el jugador al que quieres unirte usa una versión más reciente del juego. + + Apunta hacia la mesa de trabajo y oprime{*CONTROLLER_ACTION_USE*} para abrirla. - - Nuevo mundo + + Para colocar una mesa de trabajo, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. - - ¡Premio desbloqueado! + + 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. - - ¡Hurra! ¡Recibiste una imagen de jugador de Steve, de Minecraft! + + - - ¡Hurra! ¡Recibiste una imagen de jugador de un creeper! + + - - Desbloquear juego completo + + - - Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu partida. -¿Quieres desbloquear el juego completo? + + - - Espera... + + - - Sin resultados + + - - Filtro: + + - - Amigos + + Opción 1 - - Mi puntuación + + Movimiento (al volar) - - Total + + Jugadores/Invitar - - Entradas: + + - - Rango + + Opción 3 - - Preparando para guardar nivel + + Opción 2 - - Preparando fragmentos... + + - - Finalizando... + + - - Construyendo terreno + + - - Simulando mundo durante un instante + + - - Inicializando servidor + + {*B*}Oprime{*CONTROLLER_VK_A*} para comenzar el tutorial.{*B*} + Oprime{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar tú solo. - - Preparando zona de generación + + {*B*}Oprime{*CONTROLLER_VK_A*} para continuar. - - Cargando zona de generación + + - - Entrando en el Inframundo + + - - Saliendo del Inframundo + + - - Regenerando + + - - Generando nivel + + - - Cargando nivel + + - - Guardando jugadores + + - - Conectando al anfitrión + + - - Descargando terreno + + Bloque de pez plateado - - Cambiando a juego sin conexión + + Losa simple - - Espera mientras el anfitrión guarda la partida. + + Una forma compacta de almacenar hierro. - - Entrando en El Fin + + Bloque de hierro - - Saliendo de El Fin + + Losa de roble + + + Losa de arenisca - - Esta cama está ocupada. + + Losa de piedra - - Solo puedes dormir por la noche. + + Una forma compacta de almacenar oro. - - %s está durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben estar en cama a la vez. + + Flor - - ¡La cama de tu casa desapareció o está obstruida! + + Lana blanca - - Ahora no puedes descansar, hay monstruos cerca. + + Lana naranja - - Estás durmiendo en una cama. Para avanzar al amanecer, todos los jugadores deben estar en cama a la vez. + + Bloque de oro - - Herramientas y armas + + Champiñón - - Armas + + Rosa - - Comida + + Losa de guijarros - - Estructuras + + Estantería - - Armadura + + Dinamita - - Mecanismos + + Ladrillo - - Transporte + + Antorcha - - Decoraciones + + Obsidiana - - Bloques de construcción + + Piedra musgosa - - Piedra rojiza y transporte + + Losa del Inframundo + - - Varios + + Losa de roble - - Elaboración de pociones + + Losa (ladrillos de piedra) - - Herramientas, armas y armadura + + Losa de ladrillos - - Materiales + + Losa de la jungla - - Sesión cerrada + + Losa de abedul - - Dificultad + + Losa de abeto - - Música + + Lana magenta - - Sonido + + Hojas de abedul - - Gamma + + Hojas de abeto - - Sensibilidad del juego + + Hojas de roble - - Sensibilidad de la interfaz + + Cristal - - Pacífico + + Esponja - - Fácil + + Hojas de la jungla - - Normal + + Hojas - - Difícil + + Roble - - En este modo, el jugador recupera la salud con el paso del tiempo y no hay enemigos en el entorno. + + Abeto - - En este modo, el entorno genera enemigos, pero infligirán menos daño al jugador que en el modo normal. + + Abedul - - En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño estándar. + + Madera de abeto - - 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 probablemente no cancelarán su ataque explosivo cuando te alejes de ellos! + + Madera de abedul - - Fin de la versión de prueba + + Madera de la jungla - - Partida llena + + Lana - - No pudiste unirte a la partida y ya no quedan más espacios. + + Lana rosa - - Introducir texto del cartel + + Lana gris - - Introduce una línea de texto para tu cartel. + + Lana gris claro - - Introducir título + + Lana azul claro - - Introduce un título para tu publicación. + + Lana amarilla - - Introducir descripción + + Lana limón - - Introduce una descripción para tu publicación. + + Lana cian - - Introducir descripción + + Lana verde - - Introduce una descripción para tu publicación. + + Lana roja - - Inventario + + Lana negra - - Ingredientes + + Lana púrpura - - Soporte para pociones + + Lana azul - - Cofre + + Lana marrón - - Encantamiento + + Antorcha (hulla) - - Horno + + Piedra brillante - - Ingrediente + + Arena de almas - - Combustible + + Bloque del Inframundo - - Dispensador + + Bloque de lapislázuli - - No hay ofertas de contenido descargable de este tipo disponibles para este título en este momento. + + Mineral de lapislázuli - - %s se unió a la partida. + + Portal - - %s abandonó la partida. + + Calabaza iluminada - - Expulsaron a %s de la partida. + + Caña de azúcar - - ¿Seguro que quieres borrar esta partida guardada? + + Arcilla - - Esperando aprobación + + Cactus - - Censurado + + Calabaza - - En reproducción: + + Valla - - Restablecer ajustes + + Tocadiscos - - ¿Seguro que quieres restablecer los ajustes a los valores predeterminados? + + Una forma compacta de almacenar lapislázuli. - - Error al cargar + + Trampilla - - Partida de %s + + Cofre cerrado - - Partida de anfitrión desconocido + + Diodo - - Un invitado cerró la sesión + + Pistón adhesivo - - Un jugador invitado cerró la sesión, lo que provocó que todos los invitados fueran excluidos de la partida. + + Pistón - - Iniciar sesión + + Lana (cualquier color) - - No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? + + Arbusto muerto - - Multijugador no admitido + + Pastel - - Imposible crear la partida + + Bloque de nota - - Selección automática + + Dispensador - - Sin pack: apariencias regulares + + Hierba alta - - Apariencias favoritas + + Telaraña - - Nivel bloqueado + + Cama - - La partida a la que te estás uniendo está en la lista de niveles bloqueados. -Si decides unirte a esta partida, el nivel se eliminará de tu lista de niveles bloqueados. + + Hielo - - ¿Bloquear este nivel? + + Mesa de trabajo - - ¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? -Selecciona ACEPTAR para salir de la partida. + + Una forma compacta de almacenar diamantes. - - Eliminar de la lista de bloqueados + + Bloque de diamante - - Autoguardado cada + + Horno - - Autoguardado: NO + + Granja - - minutos + + Cultivos - - ¡No se puede colocar aquí! + + Mineral de diamante - - No se puede colocar lava cerca del punto de reaparición del nivel porque puede matar al instante a los jugadores que se regeneran. + + Generador de monstruos - - Opacidad de la interfaz + + Fuego - - Preparando autoguardado del nivel + + Antorcha (carbón) - - Tamaño del panel de datos + + Polvo de piedra rojiza - - Tamaño panel (pantalla dividida) + + Cofre - - Semilla + + Escaleras de roble - - Desbloquear skin pack + + Cartel - - Para usar la apariencia que seleccionaste tienes que desbloquear este skin pack. -¿Quieres desbloquear este skin pack ahora? + + Mineral de piedra rojiza - - Desbloquear pack de textura + + Puerta de hierro - - Desbloquea este pack de textura para usarlo en tu mundo. -¿Te gustaría desbloquearlo ahora? + + Placa de presión - - Versión de prueba del pack de textura + + Nieve - - 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? + + Botón - - Pack de textura no disponible + + Antorcha piedra roja - - Desbloquear versión completa + + Palanca - - Descargar versión de prueba + + Rieles - - Descargar versión completa + + Escalera - - ¡Este mundo usa un pack de textura o de popurrí que no tienes! -¿Quieres instalar el pack de textura o de popurrí ahora? + + Puerta de madera - - Conseguir versión de prueba + + Escaleras de piedra - - Conseguir versión completa + + Rieles detectores - - Expulsar jugador + + Rieles propulsores - - ¿Seguro que quieres expulsar a este jugador de la partida? No podrá volver a unirse hasta que reinicies el mundo. + + Ya recogiste suficientes guijarros para construir un horno. Usa la mesa de trabajo para hacerlo. - - Packs de imágenes de jugador + + Caña de pescar - - Temas + + Reloj - - Skin Packs + + Polvo de piedra brillante - - Permitir amigos de amigos + + Vagoneta con horno - - No puedes unirte a esta partida porque está limitada a jugadores que son amigos del anfitrión. + + Huevo - - No puedes unirte a la partida + + Brújula - - Seleccionado + + Pescado crudo - - Aspecto seleccionado: + + Rojo rosa - - Contenido descargable dañado + + Verde cactus - - El contenido descargable está dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo desde el menú de la Tienda de Minecraft. + + Granos de cacao - - Hay contenido descargable dañado y no se puede utilizar. Debes eliminarlo y volver a instalarlo desde el menú de la Tienda de Minecraft. + + Pescado cocido - - Se cambió el modo de juego. + + Polvo de tinte - - Cambiar nombre del mundo + + Bolsa de tinta - - Escribe un nuevo nombre para tu mundo. + + Vagoneta con cofre - - Modo de juego: Supervivencia + + Bola de nieve - - Modo de juego: Creativo + + Bote - - Supervivencia + + Cuero - - Creativo + + Vagoneta - - Creado en modo Supervivencia + + Silla de montar - - Creado en modo Creativo + + Piedra rojiza - - Generar nubes + + Cubo de leche - - ¿Qué quieres hacer con esta partida guardada? + + Papel - - Renombrar partida guardada + + Libro - - Autoguardando en %d... + + Bola de limo - - + + Ladrillo - - No + + Arcilla - - Normal + + Cañas de azúcar - - Superplano + + Lapislázuli - - Si está habilitado, la partida será online. + + Mapa - - Si está habilitado, solo los jugadores invitados pueden unirse. + + Disco: "13" - - Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. + + Disco: "Gato" - - Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. + + Cama - - Si está deshabilitado, los jugadores que se unan a la partida no podrán construir ni extraer sin autorización. + + Repetidor de piedra rojiza - - Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. + + Galleta - - Si está habilitado, la dinamita explota cuando se activa. + + Disco: "Bloques" - - Si está habilitado, el Inframundo se regenerará. Es útil si tienes una partida guardada antigua donde no está presente la fortaleza del Inframundo. + + Disco: "Mellohi" - - Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. + + Disco: "Stal" - - Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el Inframundo. + + Disco: "Strad" - - Si está habilitado, se creará un cofre con objetos útiles cerca del punto de reaparición del jugador. + + Disco: "Gorjeo" - - Skin Packs + + Disco: "Lejos" - - Temas + + Disco: "Galería" - - Imágenes de jugador + + Pastel - - Objetos de avatar + + Tinte gris - - Packs de textura + + Tinte rosa - - Packs de popurrí + + Tinte limón - - {*PLAYER*} ardió en llamas. + + Tinte púrpura - - {*PLAYER*} se quemó hasta morir. + + Tinte cian - - {*PLAYER*} intentó nadar en la lava. + + Tinte gris claro - - {*PLAYER*} se asfixió en un muro. + + Amarillo diente de león - - {*PLAYER*} se ahogó. + + Polvo de hueso - - {*PLAYER*} se murió de hambre. + + Hueso - - {*PLAYER*} fue picado hasta morir. + + Azúcar - - {*PLAYER*} se golpeó demasiado fuerte contra el suelo. + + Tinte azul claro - - {*PLAYER*} se cayó del mundo. + + Tinte magenta - - {*PLAYER*} murió. + + Tinte naranja - - {*PLAYER*} explotó. + + Cartel - - {*PLAYER*} murió a causa de la magia. + + Túnica de cuero - - {*PLAYER*} murió a causa del aliento del dragón Ender. + + Pechera de hierro - - {*PLAYER*} fue asesinado por {*SOURCE*}. + + Pechera de diamante - - {*PLAYER*} fue asesinado por {*SOURCE*}. + + Casco de hierro - - {*SOURCE*} le disparó a {*PLAYER*}. + + Casco de diamante - - {*PLAYER*} fue quemado con bolas de fuego por {*SOURCE*}. + + Casco de oro - - {*PLAYER*} recibió una paliza de {*SOURCE*}. + + Pechera de oro - - {*PLAYER*} murió a manos de {*SOURCE*}. + + Mallas de oro - - Niebla de lecho de roca + + Botas de cuero - - Mostrar panel de datos + + Botas de hierro - - Mostrar mano + + Pantalones de cuero - - Mensajes de muerte + + Mallas de hierro - - Personaje animado + + Mallas de diamante - - Animación de apariencia personalizada + + Gorro de cuero - - Ya no puedes extraer ni usar objetos. + + Azadón de piedra - - Ahora puedes extraer y usar objetos. + + Azadón de hierro - - Ya no puedes colocar bloques. + + Azadón de diamante - - Ahora puedes colocar bloques. + + Hacha de diamante - - Ahora puedes usar puertas e interruptores. + + Hacha de oro - - Ya no puedes usar puertas ni interruptores. + + Azadón de madera - - Ahora puedes usar contenedores (p. ej. cofres). + + Azadón de oro - - Ya no puedes usar contenedores (p. ej. cofres). + + Pechera de malla - - Ya no puedes atacar a enemigos. + + Mallas de malla - - Ahora puedes atacar a enemigos. + + Botas de malla - - Ya no puedes atacar a jugadores. + + Puerta de madera - - Ahora puedes atacar a jugadores. + + Puerta de hierro - - Ya no puedes atacar a animales. + + Casco de malla + + + Botas de diamante - - Ahora puedes atacar a animales. + + Pluma - - Ahora eres moderador. + + Pólvora - - Ya no eres moderador. + + Semillas de trigo - - Ahora puedes volar. + + Tazón - - Ya no puedes volar. + + Estofado de champiñón - - Ya no te cansarás. + + Cuerda - - Ahora te cansarás. + + Trigo - - Ahora eres invisible. + + Chuleta de cerdo cocinada - - Ya no eres invisible. + + Cuadro - - Ahora eres invulnerable. + + Manzana de oro - - Ya no eres invulnerable. + + Pan - - MSP %d + + Pedernal - - Dragón Ender + + Chuleta de cerdo cruda - - %s entró en El Fin. + + Palo - - %s abandonó El Fin. + + Cubo - - -{*C3*}Veo a ese jugador al que te referías.{*EF*}{*B*}{*B*} -{*C2*}¿{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Sí. Cuidado. Alcanzó 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. Jugó bien. No se rindió.{*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*}¿Con qué soñaba este jugador?{*EF*}{*B*}{*B*} -{*C3*}Soñaba con rayos de sol y árboles. Fuego y agua. Soñaba que creaba. Y soñaba que destruía. Soñaba con cazar y ser cazado. Soñaba con un refugio.{*EF*}{*B*}{*B*} -{*C2*}Ja, la interfaz original. Tiene un millón de años y sigue funcionando. ¿Pero qué estructura verdadera creó 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 alcanza el nivel superior. Debe conseguirlo en el largo sueño de la vida, no en 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írselos, 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 decírselos...{*EF*}{*B*}{*B*} -{*C3*}Demasiado fuerte para este sueño. Decirles cómo vivir es impedir que vivan.{*EF*}{*B*}{*B*} -{*C2*}Nunca le 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*} - + + Cubo de agua - - -{*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 fueran cosas distintas. Como si fuéramos cosas distintas.{*EF*}{*B*}{*B*} -{*C3*}¿Quiénes somos? Nos llamaban los espíritus de la montaña. Padre Sol, madre Luna. Espíritus ancestrales, espíritus animales. Genios. Fantasmas. Los hombrecitos 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ó, comió y respiró; y la mujer ensambló 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 billones de billones de billones 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*}Shhh. 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*} - + + Cubo de lava - - -{*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*}Shhh... 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 podí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 su 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 "jugaste bien".{*EF*}{*B*}{*B*} -{*C3*}Y el universo le decía "lo que 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 y 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*} - + + Botas de oro - - Restablecer Inframundo + + Lingote de hierro - - ¿Seguro que quieres restablecer el Inframundo de este archivo guardado a sus valores predeterminados? Perderás todo lo que has construido en el Inframundo. + + Lingote de oro - - Restablecer Inframundo + + Encend. de pedernal - - No restablecer Inframundo + + Hulla - - No se puede esquilar esta champivaca en este momento. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas y gatos. + + Carbón - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de cerdos, ovejas, vacas y gatos. + + Diamante - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de champivacas. + + Manzana - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de lobos. + + Arco - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de gallinas. + + Flecha - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de calamares. + + Disco: "Pabellón" - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de enemigos. + + + Oprime{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar al tipo de grupo de los objetos que quieres crear. Selecciona el grupo de estructuras.{*StructuresIcon*} + - - El huevo generador no está disponible en estos momentos. Se alcanzó la cantidad máxima de aldeanos. + + + Oprime{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar al tipo de grupo de los objetos que quieres crear. Selecciona el grupo de herramientas.{*ToolsIcon*} + - - Se alcanzó el límite de cuadros y marcos en un mundo. + + + Ahora que ya construiste una mesa de trabajo, deberías colocarla en el mundo para poder crear una mayor selección de objetos.{*B*} + Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + - - No puedes generar enemigos en el modo Pacífico. + + + Con las herramientas que has creado, ya estás listo para empezar, y podrás reunir varios materiales de forma más eficaz.{*B*} + Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + - - Este animal no puede entrar en el modo Amor. Se alcanzó la cantidad máxima de cría de cerdos, ovejas, vacas y gatos. + + + Muchas creaciones conllevan realizar múltiples acciones. 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 trabajo.{*CraftingTableIcon*} + - - Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de lobos. + + + 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*} + - - Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de gallinas. + + La leña que recojas se puede convertir en tablones. Selecciona el ícono de tablones y oprime{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} - - Este animal no puede entrar en modo Amor. Se alcanzó el límite de cría de champivacas. + + + Con una mesa de trabajo puedes crear una mayor selección de objetos. La creación en una mesa se realiza igual que la creación normal, pero dispones de un área más amplia que permite más combinaciones de ingredientes. + - - Se alcanzó la cantidad máxima de botes en un mundo. + + + La zona de creación indica los objetos que se necesitan para crear el nuevo objeto. Oprime{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. + - - Se alcanzó el límite de cabezas de enemigos en un mundo. + + + 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. + - - Invertir vista + + + Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. + - - Zurdo + + + Ahora aparece la descripción del objeto seleccionado, que puede darte una idea de la utilidad de ese objeto. + - - ¡Has muerto! + + + 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. + - - Regenerar + + + Hay objetos que no se pueden crear con la mesa de trabajo y requieren un horno. Crea un horno ahora.{*FurnaceIcon*} + - - Ofertas de contenido descargable + + Grava - - Cambiar aspecto + + Mineral de oro - - Cómo se juega + + Mineral de hierro - - Controles + + Lava - - Ajustes + + Arena - - Créditos + + Arenisca - - Reinstalar el contenido + + Mineral de hulla - - Ajustes de depuración + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. + - - El fuego se propaga + + + Esta es la interfaz del horno. En él puedes transformar objetos fundiéndolos o, por ejemplo, convertir mineral de hierro en lingotes de hierro. + - - La dinamita explota + + + Coloca el horno que creaste en el mundo. Te conviene colocarlo en el interior del refugio.{*B*} + Oprime{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + - - Jugador contra jugador + + Madera - - Confiar en jugadores + + Madera de roble - - Privilegios de anfitrión + + + 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. + - - Generar estructuras + + {*B*} + Oprime{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. + - - Mundo superplano + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. + - - Cofre de bonificación + + + Este es tu inventario. Muestra los objetos que llevas en la mano y los demás objetos que tengas. Aquí también aparece tu armadura. + - - Opciones de mundo + + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} + Oprime{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar solo. + - - Puede construir y extraer + + + Si desplazas el puntero por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + - - Puede usar puertas e interruptores + + + Mueve el objeto con el puntero hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. + Si hay varios objetos en el puntero, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno. + - - Puede abrir contenedores + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el puntero. Usa{*CONTROLLER_VK_A*} para recoger un objeto señalado con el puntero. + Si hay más de un objeto, los recogerás todos; también puedes usar{*CONTROLLER_VK_X*} para recoger solo la mitad de ellos. + - - Puede atacar a jugadores + + + Completaste la primera parte del tutorial. + - - Puede atacar a animales + + Usa el horno para crear cristal. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? - - Moderador + + Usa el horno para crear carbón. Si estás esperando a que termine, ¿por qué no aprovechas para recoger más materiales para finalizar el refugio? - - Expulsar jugador + + Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. - - Puede volar + + 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*} - - Desactivar agotamiento + + Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el mundo. - - Invisible + + 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*} - - Opciones de anfitrión + + + Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y oprime {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Jugadores/Invitar + + + Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. + - - Partida online + + + Oprime{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. + - - Solo por invitación + + + Si quieres obtener más información sobre un objeto, mueve el puntero sobre él y oprime {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Más opciones + + {*B*} + Oprime{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. + - - Cargar + + {*B*} + Oprime{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. + - - Nuevo mundo + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo crear. + - - Nombre del mundo + + + 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. + - - Semilla para el generador de mundos + + {*B*} + Oprime{*CONTROLLER_VK_A*} para continuar.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. + - - Dejar vacío para semilla aleatoria + + + Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + - - Jugadores + + + Oprime{*CONTROLLER_VK_B*} ahora para salir del inventario. + - - Unirse a partida + + + Si desplazas el puntero 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, oprime{*CONTROLLER_VK_X*}. + - - Iniciar partida + + + El puntero se desplazará automáticamente sobre un espacio de la fila en uso. Usa{*CONTROLLER_VK_A*} para colocarlo. Después de colocar el objeto, el puntero volverá a la lista de objetos y podrás seleccionar otro. + - - No se encontraron partidas + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el puntero. + En una lista de objetos, usa{*CONTROLLER_VK_A*} para recoger un objeto que esté bajo el puntero y usa{*CONTROLLER_VK_Y*} para recoger un montón entero de ese objeto. + - - Jugar partida + + Agua - - Marcadores + + Frasco de cristal - - Ayuda y opciones + + Botella de agua - - Desbloquear juego completo + + Ojo de araña - - Reanudar partida + + Pepita de oro - - Guardar partida + + Verruga del Inframundo - - Dificultad: + + Poción{*splash*}{*prefix*}{*postfix*} - - Tipo de partida: + + Ojo araña fermentado - - Estructuras: + + Caldero - - Tipo de nivel: + + Ojo de Ender - - JcJ: + + Melón resplandeciente - - Confiar en jugadores: + + Polvo de llama - - Dinamita: + + Crema de magma - - El fuego se propaga: + + Soporte para pociones - - Volver a instalar tema + + Lágrima de espectro - - Volver a instalar imagen de jugador 1 + + Semillas de calabaza - - Volver a instalar imagen de jugador 2 + + Semillas de melón - - Volver a instalar objeto de avatar 1 + + Pollo crudo - - Volver a instalar objeto de avatar 2 + + Disco: "11" - - Volver a instalar objeto de avatar 3 + + Disco: "Dónde estamos" - - Opciones + + Tijeras - - Sonido + + Pollo cocido - - Control + + Perla de Ender - - Gráficos + + Rodaja de melón - - Interfaz de usuario + + Vara de llama - - Valores predeterminados + + Res cruda - - Oscilación de vista + + Filete - - Consejos + + Carne podrida - - Ayuda sobre el juego + + Botella de encantamiento - - Pantalla dividida vert. para 2 j. + + Tablones de roble - - Listo + + Tablones de abeto - - Editar mensaje de cartel: + + Tablones de abedul - - Rellena la información que irá junto a tu captura. + + Bloque de hierba - - Descripción + + Tierra - - Captura de pantalla del juego + + Guijarro - - Editar mensaje de cartel: + + Tablones de la jungla - - ¡Con la interfaz de usuario, los íconos y la textura clásica de Minecraft! + + Brote de abedul - - Mostrar todos los mundos de popurrí + + Brote de árbol de la jungla - - Sin efectos + + Lecho de roca - - Velocidad + + Brote - - Lentitud + + Brote de roble - - Rapidez + + Brote de abeto - - Cansancio de extracción + + Piedra - - Fuerza + + Marco - - Debilidad + + Generar {*CREATURE*} - - Salud instantánea + + Ladrillo del Inframundo - - Daño instantáneo + + Descarga de fuego - - Impulso en salto + + Desc. fuego (carbón) - - Náuseas + + Desc. fuego (hulla) - - Regeneración + + Calavera - - Resistencia + + Cabeza - - Resistente al fuego + + Cabeza de %s - - Respiración acuática + + Cabeza de creeper - - Invisibilidad + + Calavera de esqueleto - - Ceguera + + Calavera de esqueleto atrofiado - - Visión nocturna + + Cabeza de zombi - - Hambre + + Una manera compacta de almacenar hulla. Se puede usar como combustible en un horno. Veneno - - de celeridad + + Hambre de lentitud - - de rapidez + + de celeridad - - de torpeza + + Invisibilidad - - de fortaleza + + Respiración acuática - - de debilidad + + Visión nocturna - - de curación + + Ceguera de daño - - de salto + + de curación de náuseas @@ -5236,29 +6157,38 @@ Selecciona ACEPTAR para salir de la partida. de regeneración - - de resistencia + + de torpeza - - de resistencia al fuego + + de rapidez - - de respiración en agua + + de debilidad + + + de fortaleza + + + Resistente al fuego - - de invisibilidad + + Saturación - - de ceguera + + de resistencia - - de visión nocturna + + de salto - - de hambre + + Poción - - de veneno + + Refuerzo de salud + + + Absorción @@ -5269,29 +6199,41 @@ Selecciona ACEPTAR para salir de la partida. III + + de invisibilidad + IV - - de salpicadura + + de respiración en agua - - mundana + + de resistencia al fuego - - aburrida + + de visión nocturna - - insulsa + + de veneno - - nítida + + de hambre - - lechosa + + de absorción - - difusa + + de saturación + + + de refuerzo de salud + + + de ceguera + + + de debilidad natural @@ -5299,17 +6241,17 @@ Selecciona ACEPTAR para salir de la partida. fina - - rara + + difusa - - plana + + nítida - - voluminosa + + lechosa - - torpe + + rara untada @@ -5317,246 +6259,300 @@ Selecciona ACEPTAR para salir de la partida. lisa - - suave + + torpe - - cortés + + plana - - gruesa + + voluminosa - - elegante + + insulsa - - sofisticada + + de salpicadura - - encantadora + + mundana + + + aburrida enérgica - - refinada - cordial + + encantadora + + + elegante + + + sofisticada + resplandeciente + + rancia + + + áspera + + + inodora + potente repugnante - - inodora + + suave - - rancia + + refinada - - áspera + + gruesa - - acre + + cortés - - asquerosa + + Restablece la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. - - hedionda + + Reduce al instante la salud de los jugadores, animales y monstruos afectados. - - Se utiliza como base para todas las pociones. Úsala en un soporte para pociones para crear pociones. + + Hace que los jugadores, animales y monstruos afectados sean inmunes al daño causado por fuego, lava y ataques de llama a distancia. No tiene efectos. Se puede usar en un soporte para pociones 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. + + acre Reduce 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 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 cuando atacan. + + Aumenta al instante la salud de los jugadores, animales y monstruos afectados. + Reduce el daño causado por los jugadores y monstruos afectados cuando atacan. - - Aumenta al instante la salud de los jugadores, animales y monstruos afectados. + + Se utiliza como base para todas las pociones. Úsala en un soporte para pociones para crear pociones. - - Reduce al instante la salud de los jugadores, animales y monstruos afectados. + + asquerosa - - Restablece la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. + + hedionda - - Hace que los jugadores, animales y monstruos afectados sean inmunes al daño causado por fuego, lava y ataques de llama a distancia. + + Aporrear + + + Agudeza Reduce la salud de los jugadores, animales y monstruos afectados con el paso del tiempo. - - Agudeza + + Daño del ataque - - Aporrear + + Derribar Maldición de los Artrópodos - - Derribar + + Velocidad - - Apariencia ígnea + + Refuerzos zombi - - Protección + + Potencia de salto de caballo + + + Al aplicarse: + + + Resistencia al derribo + + + Alcance de seguimiento de enemigos + + + Salud máxima + + + Toque sedoso + + + Eficacia + + + Afinidad acuática + + + Fortuna + + + Saqueo + + + Irrompible Protección contra el fuego + + Protección + + + Apariencia ígnea + Caída de pluma - - Protección contra explosiones + + Respiración Protección contra proyectiles - - Respiración - - - Afinidad acuática + + Protección contra explosiones - - Eficacia + + IV - - Toque sedoso + + V - - Irrompible + + VI - - Saqueo + + Puñetazo - - Fortuna + + VII - - Poder + + III Flama - - Puñetazo + + Poder Infinidad - - I - - - II - - - III + + II - - IV + + I - - V + + Se activa cuando una entidad pasa a través de un cable trampa conectado. - - VI + + Activa un gancho de cable trampa conectado si una entidad pasa a través de él. - - VII + + Una forma compacta de almacenar esmeraldas. - - VIII + + Parecido a un cofre, pero los objetos colocados dentro de un cofre de Ender están disponibles en todos los cofres de Ender del jugador, incluso en dimensiones diferentes. IX - - X + + VIII Se puede extraer con un pico de hierro o un objeto mejor para obtener esmeraldas. - - Parecido a un cofre, pero los objetos colocados dentro de un cofre de Ender están disponibles en todos los cofres de Ender del jugador, incluso en dimensiones diferentes. - - - Se activa cuando una entidad pasa a través de un cable trampa conectado. + + X - - Activa un gancho de cable trampa conectado si una entidad pasa a través de él. + + Restablece 2{*ICON_SHANK_01*} y se puede convertir en una zanahoria de oro. Se puede plantar en una granja. - - Una forma compacta de almacenar esmeraldas. + + Se usa como un elemento decorativo. En ella se pueden plantar flores, brotes, cactus y champiñones. Un muro hecho de guijarros. - - Se puede utilizar para reparar armas, herramientas y armaduras. + + Restablece 0.5{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede plantar en una granja. Se funde en un horno para fabricar cuarzo del Inframundo. - - Se usa como un elemento decorativo. + + Se puede utilizar para reparar armas, herramientas y armaduras. Se puede comercializar con los aldeanos. - - Se usa como un elemento decorativo. En ella se pueden plantar flores, brotes, cactus y champiñones. + + Se usa como un elemento decorativo. - - Restablece 2{*ICON_SHANK_01*} y se puede convertir en una zanahoria de oro. Se puede plantar en una granja. + + Recupera 4 de{*ICON_SHANK_01*}. - - Restablece 0.5{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede plantar en una granja. + + Restablece 1{*ICON_SHANK_01*}. Si la comes, puedes envenenarte. + + + Se usa para controlar a un cerdo ensillado cuando se cabalga sobre él. Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una papa en un horno. - - Restablece 1{*ICON_SHANK_01*} y se puede cocinar en un horno. Se puede plantar en una granja. Si la comes, puedes envenenarte. - Restablece 3{*ICON_SHANK_01*}. Se fabrica con una zanahoria y pepitas de oro. - - Se usa para controlar a un cerdo ensillado cuando se cabalga sobre él. - - - Recupera 4 de{*ICON_SHANK_01*}. - Se usa con un yunque para encantar armas, herramientas o armaduras. Se fabrica extrayendo mineral de cuarzo del Inframundo. Se puede convertir en un bloque de cuarzo. + + Papa + + + Papa cocida + + + Zanahoria + Se fabrica con lana. Se usa como un elemento decorativo. @@ -5566,14 +6562,11 @@ Selecciona ACEPTAR para salir de la partida. Maceta - - Zanahoria - - - Papa + + Tarta de calabaza - - Papa cocida + + Libro encantado Papa venenosa @@ -5584,11 +6577,11 @@ Selecciona ACEPTAR para salir de la partida. Palo con zanahoria - - Tarta de calabaza + + Gancho de cable trampa - - Libro encantado + + Cable trampa Cuarzo del Inframundo @@ -5599,11 +6592,8 @@ Selecciona ACEPTAR para salir de la partida. Cofre de Ender - - Gancho de cable trampa - - - Cable trampa + + Muro de guijarros musgoso Bloque de esmeralda @@ -5611,8 +6601,8 @@ Selecciona ACEPTAR para salir de la partida. Muro de guijarros - - Muro de guijarros musgoso + + Papas Maceta @@ -5620,8 +6610,8 @@ Selecciona ACEPTAR para salir de la partida. Zanahorias - - Papas + + Yunque algo dañado Yunque @@ -5629,8 +6619,8 @@ Selecciona ACEPTAR para salir de la partida. Yunque - - Yunque algo dañado + + Bloque de cuarzo Yunque muy dañado @@ -5638,8 +6628,8 @@ Selecciona ACEPTAR para salir de la partida. Mineral de cuarzo del Inframundo - - Bloque de cuarzo + + Escaleras de cuarzo B. de cuarzo cincelado @@ -5647,8 +6637,8 @@ Selecciona ACEPTAR para salir de la partida. B. de columna de cuarzo - - Escaleras de cuarzo + + Alfombra roja Alfombra @@ -5656,8 +6646,8 @@ Selecciona ACEPTAR para salir de la partida. Alfombra negra - - Alfombra roja + + Alfombra azul Alfombra verde @@ -5665,9 +6655,6 @@ Selecciona ACEPTAR para salir de la partida. Alfombra marrón - - Alfombra azul - Alfombra púrpura @@ -5680,18 +6667,18 @@ Selecciona ACEPTAR para salir de la partida. Alfombra gris - - Alfombra rosa - Alfombra limón - - Alfombra amarilla + + Alfombra rosa Alfombra azul claro + + Alfombra amarilla + Alfombra magenta @@ -5704,89 +6691,84 @@ Selecciona ACEPTAR para salir de la partida. Arenisca cincelada - - Arenisca suave - {*PLAYER*} murió intentando dañar a {*SOURCE*}. + + Arenisca suave + {*PLAYER*} fue aplastado por un yunque. {*PLAYER*} fue aplastado por un bloque. - - {*PLAYER*} teletransportado hasta {*DESTINATION*}. - {*PLAYER*} te teletransportó a su posición. - - {*PLAYER*} se teletransportó hacia ti. + + {*PLAYER*} teletransportado hasta {*DESTINATION*}. Espinas - - Losa de cuarzo + + {*PLAYER*} se teletransportó hacia ti. Hace que las zonas oscuras se vean iluminadas, incluso bajo el agua. + + Losa de cuarzo + Hace invisibles a los jugadores, animales y monstruos. Reparar y nombrar - - Costo del encantamiento: %d - ¡Demasiado caro! - - Renombrar + + Costo del encantamiento: %d Tienes: - - Necesarios para cambiar + + Renombrar {*VILLAGER_TYPE*} ofrece %s - - Reparar + + Necesarios para cambiar Cambiar - - Teñir collar + + Reparar Esta es la interfaz del yunque, que podrás usar para renombrar, reparar y aplicar encantamientos a armas, armaduras o herramientas a cambio de niveles de experiencia. - - - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz del yunque.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes utilizar la interfaz del yunque. - + + Teñir collar Para empezar a trabajar en un objeto, colócalo en el primer espacio de introducción. - + - Cuando la materia prima apropiada se coloque en el segundo espacio de introducción (por ejemplo, lingotes de hierro para una espada de hierro dañada), la reparación propuesta aparecerá en el espacio de producción. + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz del yunque.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes utilizar la interfaz del yunque. @@ -5794,9 +6776,9 @@ Selecciona ACEPTAR para salir de la partida. También puedes colocar un segundo objeto idéntico en el segundo espacio para combinarlos. - + - Para encantar objetos en el yunque, coloca un libro encantado en el segundo espacio de introducción. + Cuando la materia prima apropiada se coloque en el segundo espacio de introducción (por ejemplo, lingotes de hierro para una espada de hierro dañada), la reparación propuesta aparecerá en el espacio de producción. @@ -5804,9 +6786,9 @@ Selecciona ACEPTAR para salir de la partida. Bajo la producción se muestra el número de niveles de experiencia que costará la operación. Si no tienes suficientes niveles de experiencia, no se podrá completar la reparación. - + - Se puede renombrar el objeto modificando el nombre que se muestra en el recuadro de texto. + Para encantar objetos en el yunque, coloca un libro encantado en el segundo espacio de introducción. @@ -5814,9 +6796,9 @@ Selecciona ACEPTAR para salir de la partida. Al recoger el objeto reparado se gastarán los dos objetos usados en el yunque y se reducirá tu nivel de experiencia en la cantidad indicada. - + - En esta zona hay un yunque y un cofre que contiene herramientas y armas con las que puedes trabajar. + Se puede renombrar el objeto modificando el nombre que se muestra en el recuadro de texto. @@ -5826,9 +6808,9 @@ Selecciona ACEPTAR para salir de la partida. Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar el yunque. - + - Con un yunque se pueden reparar las armas y herramientas para aumentar su duración, renombrar o encantar con libros encantados. + En esta zona hay un yunque y un cofre que contiene herramientas y armas con las que puedes trabajar. @@ -5836,9 +6818,9 @@ Selecciona ACEPTAR para salir de la partida. Los libros encantados se encuentran en los cofres de los subterráneos, o se consiguen encantando libros normales en una mesa de encantamiento. - + - Usar un yunque cuesta niveles de experiencia y existe la posibilidad de dañar el yunque. + Con un yunque se pueden reparar las armas y herramientas para aumentar su duración, renombrar o encantar con libros encantados. @@ -5846,9 +6828,9 @@ Selecciona ACEPTAR para salir de la partida. El tipo de trabajo, el valor del objeto, el número de encantamientos y la cantidad de trabajo previo afectarán al costo de la reparación. - + - Al renombrar un objeto se cambia el nombre que se muestra a todos los jugadores y reduce permanentemente el costo del trabajo previo. + Usar un yunque cuesta niveles de experiencia y existe la posibilidad de dañar el yunque. @@ -5856,9 +6838,9 @@ Selecciona ACEPTAR para salir de la partida. En el cofre de esta zona encontrarás picos dañados, materias primas, botellas de encantamiento y libros encantados para experimentar. - + - Esta es la interfaz de comercio, que muestra los cambios que se pueden hacer con un aldeano. + Al renombrar un objeto se cambia el nombre que se muestra a todos los jugadores y reduce permanentemente el costo del trabajo previo. @@ -5868,9 +6850,9 @@ Selecciona ACEPTAR para salir de la partida. Oprime{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de comercio. - + - Arriba se muestran todos los cambios que este aldeano está dispuesto a hacer por el momento. + Esta es la interfaz de comercio, que muestra los cambios que se pueden hacer con un aldeano. @@ -5878,9 +6860,9 @@ Selecciona ACEPTAR para salir de la partida. Los cambios aparecerán en rojo y no estarán disponibles si no tienes los objetos necesarios. - + - La cantidad y el tipo de objetos que le das al aldeano se muestran en los dos recuadros de la izquierda. + Arriba se muestran todos los cambios que este aldeano está dispuesto a hacer por el momento. @@ -5888,9 +6870,9 @@ Selecciona ACEPTAR para salir de la partida. Puedes ver la cantidad total de objetos necesarios para el cambio en los dos recuadros de la izquierda. - + - Oprime{*CONTROLLER_VK_A*} para cambiar los objetos que exige el aldeano por el objeto que ofrece. + La cantidad y el tipo de objetos que le das al aldeano se muestran en los dos recuadros de la izquierda. @@ -5898,11 +6880,9 @@ Selecciona ACEPTAR para salir de la partida. En esta zona hay un aldeano y un cofre que contiene papel para comprar objetos. - + - {*B*} - Oprime{*CONTROLLER_VK_A*} para obtener más información sobre el comercio.{*B*} - Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funciona el comercio. + Oprime{*CONTROLLER_VK_A*} para cambiar los objetos que exige el aldeano por el objeto que ofrece. @@ -5910,14 +6890,21 @@ Selecciona ACEPTAR para salir de la partida. Los jugadores pueden cambiar objetos de su inventario con los aldeanos. - + - Los cambios que un aldeano puede ofrecer dependen de su profesión. + {*B*} + Oprime{*CONTROLLER_VK_A*} para obtener más información sobre el comercio.{*B*} + Oprime{*CONTROLLER_VK_B*} si ya sabes cómo funciona el comercio. Si realizas una serie de cambios, se añadirán cambios al azar o se actualizarán los cambios disponibles de un aldeano. + + + + + Los cambios que un aldeano puede ofrecer dependen de su profesión. @@ -6077,7 +7064,4 @@ Todos los cofres de Ender de un mundo están conectados. Los objetos colocados e Curar - - Buscar semillas para el generador de mundos - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsPlatformSpecific.xml index 36f24d9b..940a3819 100644 --- a/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/la-LAS/stringsPlatformSpecific.xml @@ -1,242 +1,245 @@  - - NOT USED + + ¿Quieres iniciar sesión en "PSN"? - - ¡Puedes usar la pantalla táctil del aparato PlayStation®Vita para desplazarte por los menús! + + Si hay jugadores que no están en el mismo aparato PlayStation®Vita que el anfitrión, al seleccionar esta opción se expulsará al jugador de la partida y a cualquier otro jugador que esté jugando en su aparato PlayStation®Vita. El jugador no podrá volver a unirse a la partida hasta que se reinicie. - - minecraftforum cuenta con una sección dedicada a la edición para PlayStation®Vita. + + SELECT - - ¡En Twitter obtendrás la información más reciente sobre @4J Studios y @Kappische! + + Esta opción deshabilita las actualizaciones de los trofeos y los marcadores en este mundo durante la partida, y si se carga de nuevo tras guardar con esta opción habilitada. - - ¡No mires a un Enderman a los ojos! + + Aparato PlayStation®Vita - - Creemos que 4J Studios eliminó a Herobrine del juego para el aparato PlayStation®Vita, pero no estamos seguros. + + Elige Red Ad hoc para conectarte con otros sistemas PlayStation®Vita cercanos o "PSN" para conectarte con amigos de todo el mundo. - - ¡Minecraft: PlayStation®Vita Edition ha batido un montón de récords! + + Red Ad hoc - - {*T3*}CÓMO SE JUEGA: MULTIJUGADOR{*ETW*}{*B*}{*B*} -Minecraft para el aparato PlayStation®Vita es un juego multijugador por defecto.{*B*}{*B*} -Si inicias o te unes a una partida online, 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 (si seleccionas la opción Permitir amigos de amigos).{*B*} -Una vez en la partida, oprime el botón SELECT para mostrar la lista de todos los jugadores y expulsar a jugadores de la partida. + + Cambiar modo de red - - {*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 oprime {*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. Oprime{*CONTROLLER_ACTION_CAMERA*} hasta que veas la parte frontal del personaje y después oprime{*CONTROLLER_VK_Y*} para compartir.{*B*}{*B*} -En la captura de pantalla no se mostrarán los ID online. + + Seleccionar modo de red - - {*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} -La interfaz del modo Creativo permite mover cualquier objeto del juego al inventario 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 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á los trofeos y las actualizaciones de los marcadores deshabilitados, aunque después lo cargues en el modo Supervivencia.{*B*} -Para volar en el modo Creativo, oprime{*CONTROLLER_ACTION_JUMP*} dos veces con rapidez. Para dejar de volar, repite la acción. Para volar más rápido, oprime{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. -En modo de vuelo, puedes mantener oprimido{*CONTROLLER_ACTION_JUMP*} para subir y{*CONTROLLER_ACTION_SNEAK*} para bajar, o usar{*CONTROLLER_ACTION_DPAD_UP*} para subir y {*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. + + ID online en pantalla dividida - - Oprime{*CONTROLLER_ACTION_JUMP*} dos veces con rapidez para volar. Para dejar de volar, repite la acción. Para volar más rápido, oprime{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. -En el modo de vuelo, mantén oprimido{*CONTROLLER_ACTION_JUMP*} para moverte hacia arriba y{*CONTROLLER_ACTION_SNEAK*} para moverte hacia abajo, o usa los botones de dirección para moverte hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha. + + Trofeos - - NO SE USA + + Este juego utiliza la función de autoguardado. Si ves este ícono, es que el juego está guardando los datos. +No apagues el aparato PlayStation®Vita cuando aparezca este ícono en pantalla. - - NO SE USA + + Si está habilitado, el anfitrión puede volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego. Deshabilita los trofeos y las actualizaciones de los marcadores. - - "NO SE USA" + + ID online: - - "NO SE USA" + + Estás usando una versión de prueba del pack de textura. Tendrás acceso a todos los contenidos del pack de textura, pero no podrás guardar tu progreso. +Si intentas guardar mientras usas la versión de prueba, se te dará la opción de comprar la versión completa. - - Invitar a amigos + + Parche 1.04 (Actualización de título 14) - - Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá los trofeos y las actualizaciones de los marcadores deshabilitados, aunque después lo cargues en el modo Supervivencia. ¿Seguro que quieres continuar? + + ID online del juego - - Este mundo se guardó en el modo Creativo y tiene los trofeos y las actualizaciones de los marcadores deshabilitados. ¿Seguro que quieres continuar? + + ¡Mira lo que hice en Minecraft: PlayStation®Vita Edition! - - Este mundo se guardó en el modo Creativo y tiene los trofeos y las actualizaciones de los marcadores deshabilitados. + + Error en la descarga. Vuelve a intentarlo más tarde. - - Si creas, cargas o guardas un mundo con los privilegios de anfitrión habilitados, ese mundo tendrá los trofeos y las actualizaciones de los marcadores deshabilitados, aunque después lo cargues con esas opciones deshabilitadas. ¿Seguro que quieres continuar? + + No pudiste unirte a la partida por culpa de un tipo de NAT restrictivo. Comprueba tu configuración de red. - - Se perdió la conexión con "PSN". Saliendo al menú principal. + + Error en la carga. Vuelve a intentarlo más tarde. - - Se perdió la conexión con "PSN". + + ¡Descarga completada! - - Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Si tuvieras el juego completo, ¡hubieras conseguido un trofeo! -Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®Vita Edition y jugar con amigos de todo el mundo a través de "PSN". -¿Te gustaría desbloquear el juego completo? + + +No hay ninguna partida guardada disponible en la zona de transferencia en este momento. +Puedes subir un mundo guardado a la zona de transferencia con Minecraft: PlayStation®3 Edition y después descargarlo en Minecraft: PlayStation®Vita Edition. + - - Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Si tuvieras el juego completo, ¡hubieras conseguido un tema! -Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®Vita Edition y jugar con amigos de todo el mundo a través de "PSN". -¿Te gustaría desbloquear el juego completo? + + Guardado incompleto - - Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Necesitas la versión completa para aceptar esta invitación. -¿Quieres desbloquear la versión completa del juego? + + Minecraft: PlayStation®Vita Edition no tiene espacio suficiente para guardar datos. Para crear espacio, borra otros datos guardados de Minecraft: PlayStation®Vita Edition. - - Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con una cuenta Sony Entertainment Network. + + Subida cancelada - - ID online + + Cancelaste la subida de estos datos a la zona de transferencia. - - Elaboración de pociones + + Cargar partida guardada para PS3™/PS4™ - - Volviste a la pantalla de título porque cerraste sesión en "PSN". - + + Cargando datos: %d%% - - Jugaste la versión de prueba de Minecraft: PlayStation®Vita Edition durante la cantidad máxima de tiempo permitido. Para continuar divirtiéndote, ¿quieres desbloquear el juego completo? + + "PSN" - - Se produjo un error al cargar Minecraft: PlayStation®Vita Edition y no es posible continuar. + + Descargar datos PS3™ - - No pudiste unirte a la partida porque uno o más jugadores no tienen autorización para jugar online debido a las restricciones de chat en su cuenta Sony Entertainment Network. + + Descargando datos: %d%% - - No pudiste crear una partida online porque uno o más jugadores no tienen autorización para jugar online debido a las restricciones de chat en su cuenta Sony Entertainment Network. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. + + Guardando - - No te puedes unir a esta sesión de juego porque la función online está desactivada en tu cuenta Sony Entertainment Network debido a restricciones de chat. + + ¡Carga completada! - - No te puedes unir a esta sesión de juego porque uno de los jugadores locales tiene la función online en su cuenta Sony Entertainment Network debido a restricciones de chat. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. + + ¿Seguro que quieres cargar esta partida guardada y sobrescribir cualquier otra que pueda haber en la zona de transferencia? - - No puedes crear esta sesión de juego porque uno de los jugadores locales tiene la función online desactivada en su cuenta Sony Entertainment Network debido a las restricciones de chat. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. + + Convirtiendo datos - - Este juego utiliza la función de autoguardado. Si ves este ícono, es que el juego está guardando los datos. -No apagues el aparato PlayStation®Vita cuando aparezca este ícono en pantalla. + + NO SE USA - - Si está habilitado, el anfitrión puede volar, deshabilitar el agotamiento y hacerse invisible desde el menú del juego. Deshabilita los trofeos y las actualizaciones de los marcadores. + + NO SE USA - - ID online en pantalla dividida + + {*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} +La interfaz del modo Creativo permite mover cualquier objeto del juego al inventario 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 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á los trofeos y las actualizaciones de los marcadores deshabilitados, aunque después lo cargues en el modo Supervivencia.{*B*} +Para volar en el modo Creativo, oprime{*CONTROLLER_ACTION_JUMP*} dos veces con rapidez. Para dejar de volar, repite la acción. Para volar más rápido, oprime{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. +En modo de vuelo, puedes mantener oprimido{*CONTROLLER_ACTION_JUMP*} para subir y{*CONTROLLER_ACTION_SNEAK*} para bajar, o usar{*CONTROLLER_ACTION_DPAD_UP*} para subir y {*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. - - Trofeos + + Oprime{*CONTROLLER_ACTION_JUMP*} dos veces con rapidez para volar. Para dejar de volar, repite la acción. Para volar más rápido, oprime{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. +En el modo de vuelo, mantén oprimido{*CONTROLLER_ACTION_JUMP*} para moverte hacia arriba y{*CONTROLLER_ACTION_SNEAK*} para moverte hacia abajo, o usa los botones de dirección para moverte hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha. - - ID online: + + "NO SE USA" - - ID online del juego + + Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá los trofeos y las actualizaciones de los marcadores deshabilitados, aunque después lo cargues en el modo Supervivencia. ¿Seguro que quieres continuar? - - ¡Mira lo que hice en Minecraft: PlayStation®Vita Edition! + + Este mundo se guardó en el modo Creativo y tiene los trofeos y las actualizaciones de los marcadores deshabilitados. ¿Seguro que quieres continuar? - - Estás usando una versión de prueba del pack de textura. Tendrás acceso a todos los contenidos del pack de textura, pero no podrás guardar tu progreso. -Si intentas guardar mientras usas la versión de prueba, se te dará la opción de comprar la versión completa. - + + "NO SE USA" - - Parche 1.04 (Actualización de título 14) + + Invitar a amigos - - SELECT + + minecraftforum cuenta con una sección dedicada a la edición para PlayStation®Vita. - - Esta opción deshabilita las actualizaciones de los trofeos y los marcadores en este mundo durante la partida, y si se carga de nuevo tras guardar con esta opción habilitada. + + ¡En Twitter obtendrás la información más reciente sobre @4J Studios y @Kappische! - - ¿Quieres iniciar sesión en "PSN"? + + NOT USED - - Si hay jugadores que no están en el mismo aparato PlayStation®Vita que el anfitrión, al seleccionar esta opción se expulsará al jugador de la partida y a cualquier otro jugador que esté jugando en su aparato PlayStation®Vita. El jugador no podrá volver a unirse a la partida hasta que se reinicie. + + ¡Puedes usar la pantalla táctil del aparato PlayStation®Vita para desplazarte por los menús! - - Aparato PlayStation®Vita + + ¡No mires a un Enderman a los ojos! - - Cambiar modo de red + + {*T3*}CÓMO SE JUEGA: MULTIJUGADOR{*ETW*}{*B*}{*B*} +Minecraft para el aparato PlayStation®Vita es un juego multijugador por defecto.{*B*}{*B*} +Si inicias o te unes a una partida online, 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 (si seleccionas la opción Permitir amigos de amigos).{*B*} +Una vez en la partida, oprime el botón SELECT para mostrar la lista de todos los jugadores y expulsar a jugadores de la partida. - - Seleccionar modo de red + + {*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 oprime {*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. Oprime{*CONTROLLER_ACTION_CAMERA*} hasta que veas la parte frontal del personaje y después oprime{*CONTROLLER_VK_Y*} para compartir.{*B*}{*B*} +En la captura de pantalla no se mostrarán los ID online. - - Elige Red Ad hoc para conectarte con otros sistemas PlayStation®Vita cercanos o "PSN" para conectarte con amigos de todo el mundo. + + Creemos que 4J Studios eliminó a Herobrine del juego para el aparato PlayStation®Vita, pero no estamos seguros. - - Red Ad hoc + + ¡Minecraft: PlayStation®Vita Edition ha batido un montón de récords! - - "PSN" + + Jugaste la versión de prueba de Minecraft: PlayStation®Vita Edition durante la cantidad máxima de tiempo permitido. Para continuar divirtiéndote, ¿quieres desbloquear el juego completo? - - Datos aparato PlayStation®3 + + Se produjo un error al cargar Minecraft: PlayStation®Vita Edition y no es posible continuar. - - Cargar partida guardada para aparato PlayStation®3/PlayStation®4 + + Elaboración de pociones - - Subida cancelada + + Volviste a la pantalla de título porque cerraste sesión en "PSN". - - Cancelaste la subida de estos datos a la zona de transferencia. + + No pudiste unirte a la partida porque uno o más jugadores no tienen autorización para jugar online debido a las restricciones de chat en su cuenta Sony Entertainment Network. - - Cargando datos : %d%% + + No te puedes unir a esta sesión de juego porque uno de los jugadores locales tiene la función online en su cuenta Sony Entertainment Network debido a restricciones de chat. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. - - Descargando datos : %d%% + + No puedes crear esta sesión de juego porque uno de los jugadores locales tiene la función online desactivada en su cuenta Sony Entertainment Network debido a las restricciones de chat. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. - - ¿Seguro que quieres cargar esta partida guardada y sobrescribir cualquier otra que pueda haber en la zona de transferencia? + + No pudiste crear una partida online porque uno o más jugadores no tienen autorización para jugar online debido a las restricciones de chat en su cuenta Sony Entertainment Network. Desmarca la casilla "Partida online" en "Más opciones" para jugar sin conexión. - - Convirtiendo datos + + No te puedes unir a esta sesión de juego porque la función online está desactivada en tu cuenta Sony Entertainment Network debido a restricciones de chat. - - Guardando + + Se perdió la conexión con "PSN". Saliendo al menú principal. - - ¡Carga completada! + + Se perdió la conexión con "PSN". - - Error en la carga. Vuelve a intentarlo más tarde. + + Este mundo se guardó en el modo Creativo y tiene los trofeos y las actualizaciones de los marcadores deshabilitados. - - ¡Descarga completada! + + Si creas, cargas o guardas un mundo con los privilegios de anfitrión habilitados, ese mundo tendrá los trofeos y las actualizaciones de los marcadores deshabilitados, aunque después lo cargues con esas opciones deshabilitadas. ¿Seguro que quieres continuar? - - Error en la descarga. Vuelve a intentarlo más tarde. + + Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Si tuvieras el juego completo, ¡hubieras conseguido un trofeo! +Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®Vita Edition y jugar con amigos de todo el mundo a través de "PSN". +¿Te gustaría desbloquear el juego completo? - - No pudiste unirte a la partida por culpa de un tipo de NAT restrictivo. Comprueba tu configuración de red. + + Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con una cuenta Sony Entertainment Network. - - No hay ninguna partida guardada disponible en la zona de transferencia en este momento. - Puedes subir un mundo guardado a la zona de transferencia usando Minecraft: PlayStation®3 Edition y después descargarlo en Minecraft: PlayStation®Vita Edition. + + ID online - - Guardado incompleto + + Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Si tuvieras el juego completo, ¡hubieras conseguido un tema! +Desbloquea el juego completo para vivir toda la emoción de Minecraft: PlayStation®Vita Edition y jugar con amigos de todo el mundo a través de "PSN". +¿Te gustaría desbloquear el juego completo? - - Minecraft: PlayStation®Vita Edition no tiene espacio suficiente para guardar datos. Para crear espacio, borra otros datos guardados de Minecraft: PlayStation®Vita Edition. + + Esta es la versión de prueba de Minecraft: PlayStation®Vita Edition. Necesitas la versión completa para aceptar esta invitación. +¿Quieres desbloquear la versión completa del juego? + + + El archivo de guardado de la zona de transferencia pertenece a una versión no compatible con Minecraft: PlayStation®Vita Edition. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/nl-NL/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/4J_stringsPlatformSpecific.xml index f33a1784..ed76f17a 100644 --- a/Minecraft.Client/PSVitaMedia/loc/nl-NL/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/4J_stringsPlatformSpecific.xml @@ -1,50 +1,50 @@  - - Je systeemopslag heeft te weinig vrije ruimte voor een opslagbestand. - - - Je bent terug in het titelscherm omdat je bent afgemeld bij "PSN". + + De instellingen kunnen niet worden opgeslagen naar je Sony Entertainment Network-account. - - De game is beëindigd omdat je bent afgemeld bij "PSN" + + Probleem met Sony Entertainment Network-account - - Momenteel niet aangemeld. + + Er is een probleem opgetreden tijdens de verbinding met je Sony Entertainment Network-account. Je kunt de trofee momenteel niet ontvangen. - - Voor bepaalde functies van deze game moet je met "PSN" zijn verbonden. Je bent momenteel offline. + + Dit is de testversie van Minecraft: PlayStation®3 Edition. Als je de volledige versie had, zou je nu een trofee krijgen! +Koop de volledige game om optimaal te genieten van Minecraft: PlayStation®3 Edition en samen te spelen met je vrienden uit de hele wereld via "PSN". +Wil je nu de volledige versie kopen? - - Ad hoc-netwerk niet beschikbaar. + + Verbinding maken met Ad hoc-netwerk Je bent momenteel offline. Voor bepaalde functies van deze game moet je over een Ad hoc-netwerkverbinding beschikken. - - Voor deze functie moet je zijn aangemeld bij "PSN". - - - Maak verbinding met "PSN" - - - Verbinding maken met Ad hoc-netwerk + + Ad hoc-netwerk niet beschikbaar. Probleem met trofee - - Er is een probleem opgetreden tijdens de verbinding met je Sony Entertainment Network-account. Je kunt de trofee momenteel niet ontvangen. + + De game is beëindigd omdat je bent afgemeld bij "PSN" - - Probleem met Sony Entertainment Network-account + + Je bent terug in het titelscherm omdat je bent afgemeld bij "PSN". - - De instellingen kunnen niet worden opgeslagen naar je Sony Entertainment Network-account. + + Je systeemopslag heeft te weinig vrije ruimte voor een opslagbestand. - - Dit is de testversie van Minecraft: PlayStation®3 Edition. Als je de volledige versie had, zou je nu een trofee krijgen! -Koop de volledige game om optimaal te genieten van Minecraft: PlayStation®3 Edition en samen te spelen met je vrienden uit de hele wereld via "PSN". -Wil je nu de volledige versie kopen? + + Momenteel niet aangemeld. + + + Maak verbinding met "PSN" + + + Voor deze functie moet je zijn aangemeld bij "PSN". + + + Voor bepaalde functies van deze game moet je met "PSN" zijn verbonden. Je bent momenteel offline. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/nl-NL/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/AdditionalStrings.xml index 2772a22c..46525504 100644 --- a/Minecraft.Client/PSVitaMedia/loc/nl-NL/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/AdditionalStrings.xml @@ -48,6 +48,12 @@ Je optiebestand is beschadigd en moet worden verwijderd. + + Optiesbestand verwijderen. + + + Optiesbestand opnieuw laden. + Je tijdelijke opslagbestand is beschadigd en moet worden verwijderd. @@ -75,6 +81,9 @@ Je mag niet online spelen met je Sony Entertainment Network-account door de instellingen voor ouderlijk toezicht van een van je lokale medespelers. + + Online functies zijn uitgeschakeld omdat er een game-update beschikbaar is. + Er is op dit moment geen downloadbare content beschikbaar voor deze titel. @@ -82,9 +91,6 @@ Uitnodiging - Kom je Minecraft: PlayStation®Vita Edition met me spelen? - - - Online functies zijn uitgeschakeld omdat er een game-update beschikbaar is. + Kom je Minecraft: PlayStation®Vita Edition met me spelen? \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsGeneric.xml index abd6777b..5074010f 100644 --- a/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsGeneric.xml @@ -1,5219 +1,6079 @@  - - Er is nieuwe downloadbare content beschikbaar! Ga via het hoofdmenu naar de Minecraft Store. + + Naar offline game - - Je kunt het uiterlijk van je personage aanpassen met een skinpakket uit de Minecraft Store. Selecteer 'Minecraft Store' in het hoofdmenu om te zien wat er beschikbaar is. + + Wacht tot de host de game heeft opgeslagen - - Pas de gamma-instellingen aan om de game lichter of donkerder te maken. + + Naar het Einde - - Als je de moeilijkheid instelt op Vredig, wordt je gezondheid automatisch hersteld en verschijnen er 's nachts geen monsters! + + Spelers opslaan - - Voer een bot aan een wolf om hem te temmen. Je kunt de wolf dan laten zitten of laten volgen. + + Verbinden met host - - Vanuit het inventarismenu kun je voorwerpen laten vallen door de aanwijzer naast het menu te plaatsen en op{*CONTROLLER_VK_A*} te drukken. + + Terrein downloaden - - Door 's nachts in een bed te slapen, wordt het meteen ochtend. In een multiplayergame moeten alle spelers tegelijk in hun bed liggen. + + Het Einde verlaten - - Maak vlees van varkens, kook het en eet het op om je gezondheid te herstellen. + + Het bed in je huis ontbreekt of is geblokkeerd - - Maak leer van koeien en gebruik het om pantser van te maken. + + Je kunt nu niet rusten. Er zijn monsters in de buurt - - Als je een lege emmer hebt, kun je deze vullen met melk van een koe, met water of met lava! + + Je slaapt in een bed. Om het meteen dag te laten worden, moeten alle spelers tegelijkertijd in hun bed slapen. - - Gebruik een schoffel om grond voor te bereiden op landbouw. + + Dit bed is bezet - - Spinnen vallen je overdag niet aan, tenzij je hen zelf aanvalt. + + Je kunt alleen 's nachts slapen - - In aarde of zand graven, gaat sneller met een schop dan met de hand! + + %s slaapt in een bed. Om het meteen dag te laten worden, moeten alle spelers tegelijkertijd in hun bed slapen. - - Gebraden varkensvlees geeft je meer gezondheid dan rauw varkensvlees. + + Wereld laden - - Maak wat fakkels om 's nachts de omgeving te verlichten. Monsters blijven uit de buurt van fakkels. + + Afwerken... - - Bereik je bestemming sneller met een mijnwagen en rails. + + Terrein aanleggen - - Als je jonge boompjes plant, groeien ze uit tot grote bomen. + + De wereld simuleren - - Bigmensen vallen je alleen aan als jij ze eerst aanvalt. + + Positie - - Je kunt de terugkeerlocatie van je game veranderen en het meteen ochtend laten worden door te gaan slapen in een bed. + + Opslaan wereld voorbereiden - - Sla die vuurballen terug naar de Ghast! + + Segmenten samenstellen... - - Door een portaal te bouwen, reis je naar een andere dimensie: de Onderwereld. + + Server activeren - - Druk op{*CONTROLLER_VK_B*} om het voorwerp dat je in je hand hebt te laten vallen. + + De Onderwereld verlaten - - Gebruik voor elke klus het juiste gereedschap. + + Terugkeren - - Als je geen kolen kunt vinden voor je fakkels, kun je in een oven altijd houtskool maken van bomen. + + Wereld genereren - - Recht naar beneden of naar boven graven is geen goed idee. + + Terugkeerlocatie genereren - - Bottenmeel wordt gemaakt van skelettenbotten en kan worden gebruikt als mest om gewassen meteen te laten groeien. + + Terugkeerlocatie laden - - Creepers exploderen als ze bij je in de buurt komen! + + Naar de Onderwereld - - Obsidiaan ontstaat als stromend water in contact komt met een lavablok. + + Gereedschap en wapens - - Het kan enkele minuten duren voordat de lava helemaal is verdwenen als het blok is verwijderd. + + Gamma - - Keien zijn bestand tegen Ghast-vuurballen, waardoor ze zeer geschikt zijn om portalen te beschermen. + + Gevoeligheid game - - Blokken die je als lichtbron kunt gebruiken, kunnen ook sneeuw en ijs smelten. Denk daarbij aan fakkels, gloeisteen en pompoenlampionnen. + + Gevoeligheid interface - - Pas goed op als je in de open lucht iets van wol maakt, omdat wol kan verbranden door een blikseminslag tijdens een onweersbui. + + Moeilijkheid - - Met één emmer lava kun je in een oven 100 blokken smelten. + + Muziek - - Het instrument dat wordt gespeeld door een nootblok is afhankelijk van het materiaal eronder. + + Geluid - - Zombies en Skeletten kunnen tegen daglicht als ze zich in het water bevinden. + + Vredig - - Als je een wolf aanvalt, worden andere wolven in de directe omgeving agressief en vallen ze je aan. Ook zombie-bigmensen doen dit. + + Je wordt vanzelf weer gezond en er zijn geen vijanden in de omgeving. - - Wolven kunnen niet naar de Onderwereld. + + Er verschijnen vijanden in de omgeving, maar ze richten minder schade aan dan op het niveau Normaal. - - Wolven vallen geen Creepers aan. + + Er verschijnen vijanden in de omgeving die een normale hoeveelheid schade aanrichten. - - Kippen leggen elke 5 tot 10 minuten een ei. + + Makkelijk - - Obsidiaan kan alleen worden uitgegraven met een diamanten houweel. + + Normaal - - Creepers zijn de gemakkelijkste manier om buskruit te verkrijgen. + + Moeilijk - - Als je twee kisten naast elkaar zet, krijg je één grote kist. + + Afgemeld - - De gezondheid van tamme wolven kun je aflezen aan de stand van hun staart. Voer ze vlees om ze te genezen. + + Pantser - - Kook een cactus in een oven om groene kleurstof te krijgen. + + Mechanismen - - Lees het gedeelte 'Nieuwe functies' in het menu Instructies voor het laatste nieuws over updates voor de game. + + Vervoer - - Er zijn nu stapelbare hekken in de game! + + Wapens - - Sommige dieren volgen je als je tarwe in je hand hebt. + + Voedsel - - Als dieren zich in elke richting niet meer dan 20 blokken kunnen verplaatsen, zullen ze nooit verdwijnen uit de wereld. + + Bouwmaterialen - - Muziek van C418! + + Decoraties - - Notch heeft meer dan een miljoen volgers op Twitter! + + Brouwen - - Niet alle Zweden zijn blond. Jens van Mojang heeft zelfs rood haar! + + Gereedschap, wapens en pantser - - Er komt nog wel een keer een update voor deze game. + + Materialen - - Wie is Notch? + + Bouwblokken - - Mojang heeft meer prijzen dan medewerkers. + + Roodsteen en transport - - Er zijn hele beroemde mensen die Minecraft spelen. + + Diversen - - deadmau5 houdt van Minecraft! + + Aantal: - - Kijk niet direct naar de bugs. + + Afsluiten zonder opslaan - - Creepers zijn het resultaat van een programmeerfout. + + Weet je zeker dat je naar het hoofdmenu wilt gaan? Niet opgeslagen voortgang gaat verloren. - - Is het een kip of een eend? + + Weet je zeker dat je naar het hoofdmenu wilt gaan? Je voortgang gaat dan verloren. - - Ben je ook naar Minecon geweest? + + Dit opslagbestand is beschadigd. Wil je het verwijderen? - - Niemand bij Mojang heeft junkboy ooit gezien. + + Weet je zeker dat je naar het hoofdmenu wilt gaan? De verbinding met alle spelers in de game wordt dan verbroken. Niet opgeslagen voortgang gaat dan verloren. - - Weet je dat er ook een Minecraft-wiki is? + + Afsluiten en opslaan - - Het nieuwe kantoor van Mojang is cool! + + Nieuwe wereld maken - - Minecon 2013 vond plaats in Orlando, Florida. + + Geef je wereld een naam - - .party() was geweldig! + + Voer de basis van je wereld in - - Ga er altijd vanuit dat geruchten niet kloppen en neem ze nooit zomaar voor waar aan. + + Opgeslagen wereld laden - - {*T3*}INSTRUCTIES: DE BASIS{*ETW*}{*B*}{*B*} -In Minecraft plaats je blokken, waarmee je alles kunt bouwen wat je wilt. 's Nachts verschijnen er monsters, dus zorg ervoor dat je dan een schuilplaats hebt gebouwd.{*B*}{*B*} -Gebruik{*CONTROLLER_ACTION_LOOK*} om rond te kijken.{*B*}{*B*} -Gebruik{*CONTROLLER_ACTION_MOVE*} om je te verplaatsen.{*B*}{*B*} -Druk op{*CONTROLLER_ACTION_JUMP*} om te springen.{*B*}{*B*} -Duw {*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren om te sprinten. Als je{*CONTROLLER_ACTION_MOVE*} naar voren houdt, blijven personages sprinten tot de sprinttijd om is of tot er minder dan {*ICON_SHANK_03*} in de voedselbalk over zijn.{*B*}{*B*} -Hou{*CONTROLLER_ACTION_ACTION*} ingedrukt om iets uit te graven en te hakken met je hand of met het voorwerp dat je vasthoudt. Mogelijk moet je eerst gereedschap maken om bepaalde blokken te kunnen uitgraven.{*B*}{*B*} -Druk op{*CONTROLLER_ACTION_USE*} om het voorwerp in je hand te gebruiken of op{*CONTROLLER_ACTION_DROP*} om het te laten vallen. + + Speluitleg spelen - - {*T3*}INSTRUCTIES: SCHERMINFO{*ETW*}{*B*}{*B*} -De scherminfo geeft je informatie over je status: je gezondheid, je resterende zuurstof als je onder water bent, je hongerniveau (je moet eten om de honger te verminderen) en je eventuele pantser. Je gezondheid wordt automatisch aangevuld als je ten minste 9{*ICON_SHANK_01*} in je voedselbalk hebt. Je vult je voedselbalk aan door te eten.{*B*} -Verder zie je hier je ervaringsbalk, met een getal dat je ervaringsniveau aangeeft. Ook is er een balk die aangeeft hoe veel ervaringspunten je nodig hebt om een hoger ervaringsniveau te bereiken. -Je verdient ervaringspunten door ervaringsbollen bij dode mobs op te pakken, bepaalde blokken uit te graven, dieren te fokken, te vissen en erts te smelten in een oven.{*B*}{*B*} -Je ziet hier ook de voorwerpen die je kunt gebruiken. Pak een ander voorwerp vast met{*CONTROLLER_ACTION_LEFT_SCROLL*} en{*CONTROLLER_ACTION_RIGHT_SCROLL*}. + + Speluitleg - - {*T3*}INSTRUCTIES: INVENTARIS{*ETW*}{*B*}{*B*} -Gebruik{*CONTROLLER_ACTION_INVENTORY*} om je inventaris te bekijken.{*B*}{*B*} -Hier zie je de voorwerpen die je kunt vasthouden en alle andere voorwerpen die je bij je hebt. Je ziet hier ook je pantser.{*B*}{*B*} -Gebruik{*CONTROLLER_MENU_NAVIGATE*} om de aanwijzer te verplaatsen. Gebruik{*CONTROLLER_VK_A*} om het voorwerp onder de aanwijzer te pakken. Je pakt alle voorwerpen tegelijk op als het vakje meerdere voorwerpen bevat. Je kunt ook de helft pakken met{*CONTROLLER_VK_X*}.{*B*}{*B*} -Verplaats het voorwerp met de aanwijzer naar een ander inventarisvakje en bevestig met {*CONTROLLER_VK_A*}. Als je meerdere voorwerpen hebt opgepakt, gebruik je{*CONTROLLER_VK_A*} om ze allemaal te plaatsen of{*CONTROLLER_VK_X*} om er maar één te plaatsen.{*B*}{*B*} -Als een voorwerp waar je met de aanwijzer langs komt een pantservoorwerp is, zie je een tooltip waarmee je het meteen in het juiste pantservakje van je inventaris plaatst.{*B*}{*B*} -Je kunt je leren pantser een andere kleur geven met kleurstof. Dit doe je door in het inventarismenu de kleurstof op te pakken met je aanwijzer en vervolgens op{*CONTROLLER_VK_X*} te drukken als de aanwijzer zich op het te verven oppervlak bevindt. + + Naam van je wereld - - {*T3*}INSTRUCTIES: KIST{*ETW*}{*B*}{*B*} -Zodra je een kist hebt geproduceerd, kun je deze in de wereld plaatsen en met{*CONTROLLER_ACTION_USE*} gebruiken om voorwerpen uit je inventaris te bewaren.{*B*}{*B*} -Gebruik de aanwijzer om voorwerpen van de inventaris naar je kist te verplaatsen en andersom.{*B*}{*B*} -De voorwerpen die je in de kist bewaart, kun je later weer in je inventaris plaatsen. - + + Beschadigd opslagbestand - - {*T3*}INSTRUCTIES: GROTE KIST{*ETW*}{*B*}{*B*} -Door twee kisten naast elkaar te plaatsen, maak je een grote kist. Daar kun je nog meer voorwerpen in bewaren.{*B*}{*B*} -Je gebruikt 'm op dezelfde manier als een normale kist. - + + OK - - {*T3*}INSTRUCTIES: PRODUCEREN{*ETW*}{*B*}{*B*} -In de productie-interface kun je voorwerpen uit je inventaris met elkaar combineren om nieuwe voorwerpen te maken. Druk op{*CONTROLLER_ACTION_CRAFTING*} om de productie-interface te openen.{*B*}{*B*} -Blader door de tabbladen bovenaan met{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*}, selecteer de groep met het voorwerp dat je wilt produceren en gebruik{*CONTROLLER_MENU_NAVIGATE*} om dat voorwerp te selecteren.{*B*}{*B*} -In het productieveld zie je wat je nodig hebt om het nieuwe voorwerp te maken. Druk op{*CONTROLLER_VK_A*} om het voorwerp te produceren en plaats het vervolgens in je inventaris. - + + Annuleren - - {*T3*}INSTRUCTIES: WERKBANK{*ETW*}{*B*}{*B*} -Met een werkbank kun je grotere voorwerpen maken.{*B*}{*B*} -Plaats de werkbank in de wereld en druk op{*CONTROLLER_ACTION_USE*} om 'm te gebruiken.{*B*}{*B*} -Produceren op een werkbank werkt hetzelfde als normaal produceren, maar je hebt een groter productieveld en kunt meer verschillende voorwerpen maken. - + + Minecraft Store - - {*T3*}INSTRUCTIES: OVEN{*ETW*}{*B*}{*B*} -Met een oven kun je voorwerpen veranderen door ze te verhitten. Zo kun je ijzererts in de oven omsmelten tot ijzerstaven.{*B*}{*B*} -Plaats de oven in de wereld en druk op{*CONTROLLER_ACTION_USE*} om 'm te gebruiken.{*B*}{*B*} -Plaats brandstof onderin de oven en het te verhitten voorwerp bovenin. Vervolgens wordt de oven ontstoken.{*B*}{*B*} -Als de nieuwe voorwerpen klaar zijn, kun je ze van het resultaatvakje verplaatsen naar je inventaris.{*B*}{*B*} -Als het voorwerp een ingrediënt of brandstof voor de oven is, zie je een tooltip waarmee je het meteen in de oven kunt plaatsen. - + + Draaien - - {*T3*}INSTRUCTIES: AUTOMAAT{*ETW*}{*B*}{*B*} -Een automaat werpt voorwerpen uit. Je moet een schakelaar (zoals een hendel) ernaast plaatsen om de automaat te kunnen activeren.{*B*}{*B*} -Om de automaat met voorwerpen te vullen, druk je op{*CONTROLLER_ACTION_USE*}. Je kunt dan voorwerpen van je inventaris naar de automaat verplaatsen.{*B*}{*B*} -Als je nu de schakelaar gebruikt, werpt de automaat een voorwerp uit. - + + Verbergen - - {*T3*}INSTRUCTIES: BROUWEN{*ETW*}{*B*}{*B*} -Voor het brouwen van drankjes heb je een brouwrek nodig. Dit moet je eerst bouwen op een werkbank. De basis van elk drankje is een fles water, die je maakt door een glazen fles te vullen met water uit een ketel of een waterbron.{*B*} -Een brouwrek bevat drie vakjes voor flessen, zodat je drie drankjes tegelijk kunt maken. Je kunt één ingrediënt gebruiken voor alle drie de flessen. Door drie drankjes tegelijk te brouwen, ga je dus efficiënt om met je grondstoffen.{*B*} -Plaats een ingrediënt in het bovenste vakje van het brouwrek om een basisdrankje te maken. Zo'n basisdrankje heeft pas effect als je er nog een ingrediënt aan toevoegt.{*B*} -Daarna kun je er nog een derde ingrediënt bij doen. Je kunt het effect verlengen met roodsteenstof, het drankje intenser maken met gloeisteenstof of er een schadelijk drankje van maken met een gefermenteerd spinnenoog.{*B*} -Je kunt aan elk drankje buskruit toevoegen om er een explosief drankje van te maken. Met een explosief drankje kun je gooien, waarna het middel effect heeft op de omgeving van de plek waar het neerkomt.{*B*} - -De basisingrediënten van drankjes zijn:{*B*}{*B*} -* {*T2*}Onderwereld-wrat{*ETW*}{*B*} -* {*T2*}spinnenoog{*ETW*}{*B*} -* {*T2*}suiker{*ETW*}{*B*} -* {*T2*}Ghast-traan{*ETW*}{*B*} -* {*T2*}Blaze-poeder{*ETW*}{*B*} -* {*T2*}magmacrème{*ETW*}{*B*} -* {*T2*}glinsterende meloen{*ETW*}{*B*} -* {*T2*}roodsteenstof{*ETW*}{*B*} -* {*T2*}gloeisteenstof{*ETW*}{*B*} -* {*T2*}gegist spinnenoog{*ETW*}{*B*}{*B*} -Experimenteer met combinaties van ingrediënten om te ontdekken welke drankjes je kunt maken. + + Alle vakjes leegmaken - - {*T3*}INSTRUCTIES: BETOVEREN{*ETW*}{*B*}{*B*} -Je vindt ervaringspunten bij dode mobs of krijgt ze door bepaalde blokken uit te graven of om te smelten in een oven. Je kunt deze ervaringspunten gebruiken om gereedschappen, wapens, pantser en boeken te betoveren.{*B*} -Plaats een zwaard, boog, bijl, houweel, schop, pantser of boek in het vakje onder het boek op de tovertafel. Aan de rechterkant zie je dan drie betoveringen en de kosten in ervaringsniveaus.{*B*} -Als je te weinig ervaringsniveaus hebt om een betovering te gebruiken, worden de kosten in rood weergegeven. Anders is dit getal groen.{*B*}{*B*} -De betovering zelf wordt willekeurig toegepast op basis van de weergegeven kosten.{*B*}{*B*} -Als de tovertafel is omgeven door boekenplanken, wordt het drankje krachtiger en zie je mysterieuze symbolen verschijnen bij het boek op de tovertafel. Je kunt maximaal 15 boekenplanken plaatsen met een tussenruimte van één blok tussen de boekenkast en de tovertafel.{*B*}{*B*} -De ingrediënten voor een tovertafel vind je in dorpen, door voorwerpen uit te graven of door het land te bewerken.{*B*}{*B*} -Je gebruikt betoverde boeken om voorwerpen te betoveren op het aambeeld. Dit geeft je meer controle over de betoveringen die je wilt gebruiken op je voorwerpen.{*B*} + + Weet je zeker dat je de huidige game wilt verlaten om mee te doen met de nieuwe game? Niet opgeslagen voortgang gaat dan verloren. - - {*T3*}INSTRUCTIES: DIEREN HOUDEN{*ETW*}{*B*}{*B*} -Als je je dieren bij elkaar wilt houden, kun je een gebied van minder dan 20x20 blokken omheinen. Zo weet je zeker dat je dieren er zijn als je ze nodig hebt. + + Weet je zeker dat je eventuele opslagbestanden voor deze wereld wilt overschrijven met de huidige versie van deze wereld? - - {*T3*}INSTRUCTIES: VEETEELT{*ETW*}{*B*}{*B*} -In Minecraft kun je dieren fokken om nieuwe jonge dieren te krijgen.{*B*} -Als je dieren wilt laten paren, moet je ze voedsel geven waarvan ze 'verliefd' worden.{*B*} -Voer tarwe aan een koe, zwamkoe of schaap, tarwezaden of Onderwereld-wrat aan een kip of elk soort vlees aan een wolf. De dieren gaan dan in de omgeving op zoek naar dieren van hun soort die ook verliefd zijn.{*B*} -Als twee verliefde dieren van dezelfde soort elkaar vinden, zoenen ze een paar seconden en verschijnt er een jong dier. Jonge dieren volgen hun ouders tot ze volwassen zijn.{*B*} -Nadat een dier verliefd is geweest, duurt het ongeveer vijf minuten voordat het opnieuw verliefd kan worden.{*B*} -Van elk dier mag je er maar een maximumaantal hebben in je wereld. Als je die limiet hebt bereikt, zullen dieren niet meer paren. + + Weet je zeker dat je wilt afsluiten zonder op te slaan? Je raakt al je voortgang kwijt in deze wereld! - - {*T3*}INSTRUCTIES: ONDERWERELD-PORTAAL{*ETW*}{*B*}{*B*} -Met een Onderwereld-portaal kun je reizen tussen de Bovenwereld en de Onderwereld. Je kunt de Onderwereld gebruiken om je snel te verplaatsen in de Bovenwereld. Als je in de Onderwereld een afstand van één blok aflegt, staat dat gelijk met een afstand van drie blokken in de Bovenwereld. Als je dus een portaal bouwt in de Onderwereld en er doorheen gaat, ben je drie keer zo ver weg van jouw beginpunt.{*B*}{*B*} -Je hebt minimaal 10 obsidiaanblokken nodig voor het portaal, dat 5 blokken hoog, 4 blokken breed en 1 blok diep moet zijn. Als de lijst van het portaal klaar is, moet je de ruimte binnen de lijst in brand steken om het portaal te activeren. Dit doe je met een aansteker of een vuurbal.{*B*}{*B*} -Rechts zie je enkele voorbeelden van portalen. - + + Game starten - - {*T3*}INSTRUCTIES: WERELDEN UITSLUITEN{*ETW*}{*B*}{*B*} -Als je in een wereld aanstootgevende content aantreft, kun je die wereld toevoegen aan je lijst met uitgesloten werelden. -Druk in het pauzemenu op{*CONTROLLER_VK_RB*} om de tooltip Wereld uitsluiten te selecteren. -Als je later naar die wereld probeert te gaan, krijg je een melding dat deze op je lijst met uitgesloten werelden staat. Je kunt dan annuleren of de wereld van de lijst verwijderen en er toch naartoe gaan. + + Game afsluiten - - {*T3*}INSTRUCTIES: OPTIES VOOR HOST EN SPELERS{*ETW*}{*B*}{*B*} - -{*T1*}Game-opties{*ETW*}{*B*} -Druk tijdens het laden of maken van een wereld op 'Meer opties' voor een menu waarin je van alles kunt instellen voor je game.{*B*}{*B*} - - {*T2*}Speler tegen speler (PvP){*ETW*}{*B*} - Als deze optie is ingeschakeld, kunnen spelers andere spelers verwonden. Deze optie is alleen van toepassing voor het speltype Survival.{*B*}{*B*} - - {*T2*}Spelers vertrouwen{*ETW*}{*B*} - Schakel deze optie uit om de mogelijkheden van spelers die met je meedoen te beperken. Ze kunnen dan geen voorwerpen uitgraven of gebruiken, geen blokken plaatsen, geen deuren en schakelaars gebruiken, geen houders gebruiken en geen spelers of dieren aanvallen. Je kunt deze opties voor specifieke spelers aanpassen via het game-menu.{*B*}{*B*} - - {*T2*}Overslaande branden{*ETW*}{*B*} - Als deze optie is ingeschakeld, kan vuur overslaan naar brandbare blokken in de buurt. Ook deze optie kun je in de game aanpassen.{*B*}{*B*} - - {*T2*}TNT-explosies{*ETW*}{*B*} - Als deze optie is ingeschakeld, ontploft TNT als het ontbrandt. Ook deze optie kun je in de game aanpassen.{*B*}{*B*} - - {*T2*}Privileges host{*ETW*}{*B*} - Als deze optie is ingeschakeld, kunnen hosts via het game-menu hun vermogen om te vliegen aan- en uitzetten, uitputting uitschakelen en zichzelf onzichtbaar maken. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} - -{*T1*}Opties voor het maken van een wereld{*ETW*}{*B*} -Als je een nieuwe wereld maakt, zijn er enkele extra opties.{*B*}{*B*} - - {*T2*}Bouwwerken genereren{*ETW*}{*B*} - Als deze optie is ingeschakeld, worden bouwwerken als dorpen en vestingen gegenereerd in de wereld.{*B*}{*B*} - - {*T2*}Supervlakke wereld{*ETW*}{*B*} - Als deze optie is ingeschakeld, wordt een volledig vlakke Bovenwereld en Onderwereld gegenereerd.{*B*}{*B*} - - {*T2*}Bonuskist{*ETW*}{*B*} - Als deze optie is ingeschakeld, staat er een kist met handige voorwerpen bij de terugkeerlocatie van de speler.{*B*}{*B*} - - {*T2*}Onderwereld resetten{*ETW*}{*B*} - Als deze optie is ingeschakeld, wordt de Onderwereld opnieuw gegenereerd. Dit is handig als je een ouder opslagbestand zonder Onderwereld-forten hebt.{*B*}{*B*} - -{*T1*}Opties in de game{*ETW*}{*B*} -Tijdens het spelen kun je een aantal opties aanpassen in het game-menu. Je opent dit menu door op {*BACK_BUTTON*} te drukken.{*B*}{*B*} - - {*T2*}Host-opties{*ETW*}{*B*} - De host en eventuele moderator hebben toegang tot het menu Host-opties. Hier kunnen ze overslaande branden en TNT-explosies in- en uitschakelen.{*B*}{*B*} - -{*T1*}Speleropties{*ETW*}{*B*} -Om de privileges van een speler te wijzigen, selecteer je zijn of haar naam en druk je op{*CONTROLLER_VK_A*} om het privileges-menu te openen. Hier kun je de volgende opties aanpassen.{*B*}{*B*} - - {*T2*}Kan bouwen en uitgraven{*ETW*}{*B*} - Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan bouwen en uitgraven' is ingeschakeld, kan de speler op een normale manier functioneren in de wereld. Als de optie is uitgeschakeld, mag de speler geen blokken plaatsen of vernietigen en mag hij veel andere voorwerpen en blokken niet gebruiken.{*B*}{*B*} - - {*T2*}Kan deuren en schakelaars gebruiken{*ETW*}{*B*} - Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan deuren en schakelaars gebruiken' is uitgeschakeld, mag de speler geen deuren en schakelaars gebruiken.{*B*}{*B*} - - {*T2*}Kan houders openen{*ETW*}{*B*} - Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan houders openen' is uitgeschakeld, mag de speler geen houders zoals kisten openen.{*B*}{*B*} - - {*T2*}Kan spelers aanvallen{*ETW*}{*B*} - Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan spelers aanvallen' is uitgeschakeld, kan de speler geen andere spelers verwonden.{*B*}{*B*} - - {*T2*}Kan dieren aanvallen{*ETW*}{*B*} - Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan dieren aanvallen' is uitgeschakeld, kan de speler geen dieren verwonden.{*B*}{*B*} - - {*T2*}Moderator{*ETW*}{*B*} - Als deze optie is ingeschakeld, kan de speler de privileges van andere spelers (behalve van de host) aanpassen. Daarvoor moet dan wel de optie 'Spelers vertrouwen' zijn uitgeschakeld. Verder kan de moderator spelers verwijderen en overslaande branden en TNT-explosies in- en uitschakelen.{*B*}{*B*} - - {*T2*}Speler verwijderen{*ETW*}{*B*} - {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - -{*T1*}Opties voor host{*ETW*}{*B*} -Als 'Privileges host' is ingeschakeld, kan de host de eigen privileges aanpassen. Om de privileges van een speler te wijzigen, selecteer je zijn of haar naam en druk je op{*CONTROLLER_VK_A*} om het privileges-menu te openen. Hier kun je de volgende opties aanpassen.{*B*}{*B*} - - {*T2*}Kan vliegen{*ETW*}{*B*} - Als deze optie is ingeschakeld, kan de speler vliegen. Deze optie is alleen van toepassing voor het speltype Survival, omdat iedereen al kan vliegen in het speltype Creatief.{*B*}{*B*} - - {*T2*}Uitputting uitschakelen{*ETW*}{*B*} - Deze optie is alleen van toepassing voor het speltype Survival. Als deze optie is ingeschakeld, hebben fysieke activiteiten (lopen/sprinten/springen, etc.) geen invloed op de voedselbalk. De voedselbalk loopt wel langzaam leeg om de speler te genezen als deze gewond is.{*B*}{*B*} - - {*T2*}Onzichtbaar{*ETW*}{*B*} - Als deze optie is ingeschakeld, is de speler onkwetsbaar en niet zichtbaar voor andere spelers.{*B*}{*B*} - -{*T2*}Kan teleporteren{*ETW*}{*B*} - Hiermee kan de speler andere spelers of zichzelf verplaatsen naar andere spelers in de wereld. + + Game opslaan - - Volgende pagina + + Afsluiten zonder opslaan - - Vorige pagina + + Druk START om mee te doen - - De basis + + Hoera! Je hebt een gamersafbeelding van Steve uit Minecraft verdiend! - - Scherminfo + + Hoera! Je hebt een gamerafbeelding van een Creeper verdiend! - - Inventaris + + Volledige game kopen - - Kisten + + Je kunt niet meedoen met deze game omdat de andere speler een nieuwere versie van de game heeft. - - Produceren + + Nieuwe wereld - - Oven + + Je hebt een prijs verdiend! - - Automaat + + Je speelt de testversie en je kunt de game alleen opslaan in de volledige game. +Wil je nu de volledige versie kopen? - - Dieren houden + + Vrienden - - Veeteelt + + Mijn score - - Brouwen + + Algemeen - - Betoveren + + Even geduld - - Onderwereld-portaal + + Geen resultaten - - Multiplayer + + Filter: - - Screenshots delen + + Je kunt niet meedoen met deze game omdat de andere speler een oudere versie van de game heeft. - - Werelden uitsluiten + + Verbinding verbroken - - Speltype Creatief + + Verbinding met de server is verbroken. Terug naar het hoofdmenu. - - Opties voor host en spelers + + Verbinding verbroken door de server - - Handelen + + De game wordt afgesloten - - Aambeeld + + Er is een fout opgetreden. Terug naar het hoofdmenu. - - Het Einde + + Verbinding mislukt - - {*T3*}INSTRUCTIES: HET EINDE{*ETW*}{*B*}{*B*} -Het Einde is een andere dimensie in de game, waar je naartoe kunt via een actief Einde-portaal. Je vind het Einde-portaal in een vesting, diep onder de grond in de Bovenwereld.{*B*} -Om een Einde-portaal te activeren, moet je een Einder-oog in elk leeg Einde-portaalblok plaatsen.{*B*} -Als het portaal actief is, spring je er doorheen om naar het Einde te gaan.{*B*}{*B*} -In het Einde neem je het op tegen de woeste en sterke Einder-draak en een groot aantal Einder-mannen. Zorg er dus voor dat je op de strijd bent voorbereid!{*B*}{*B*} -De Einder-draak geneest zichzelf met Einder-kristallen, die op acht pilaren van obsidiaan liggen. -Die kristallen moet je dus eerst vernietigen.{*B*} -Een aantal kristallen kun je uitschakelen met pijlen, maar er zijn er ook die worden beschermd door een ijzeren kooi. Je zult dus iets moeten bouwen om ze handmatig te kunnen vernietigen.{*B*}{*B*} -Ondertussen valt de Einder-draak je aan door op je af te vliegen en Einder-zuurballen naar je te spuwen.{*B*} -Als je in de buurt komt van het eiplatform in het midden van de ruimte, vliegt de Einder-draak op je af. Dat is het moment om de draak flink te verwonden!{*B*} -Ontwijk de zuuradem van de Einder-draak en richt op zijn ogen om zoveel mogelijk schade aan te richten. Neem zo mogelijk wat vrienden mee naar het Einde om je bij te staan in de strijd!{*B*}{*B*} -Als je eenmaal in het Einde bent, zien je vrienden de locatie van het Einde-portaal op hun kaart, -Zo kunnen ze je snel te hulp komen. - + + Je bent uit de game verwijderd - - Sprinten + + De host heeft de game verlaten. - - Nieuwe functies + + Je kunt niet meedoen met deze game omdat niemand in de game een vriend van je is. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Nieuw en aangepast{*ETW*}{*B*}{*B*} -- Nieuwe voorwerpen - Smaragd, smaragderts, smaragdblok, Einder-kist, struikeldraadschakelaar, betoverde gouden appel, aambeeld, bloempot, keienmuren, mossige keienmuren, Onderwereld-schilderij, aardappel, gebakken aardappel, giftige aardappel, wortel, gouden wortel, wortel aan een stok, -pompoentaart, nachtzichtdrankje, onzichtbaarheidsdrankje, Onderwereld-kwarts, Onderwereld-kwartserts, kwartsblok, kwartsplaat, trap van kwarts, gebeiteld kwartsblok, kwartspilaar, betoverd boek, tapijt.{*B*} -- Nieuwe recepten voor gladde zandsteen en gebeitelde zandsteen.{*B*} -- Nieuwe mobs - Zombie-dorpelingen.{*B*} -- Nieuwe functies voor het genereren van terrein - Woestijntempels, woestijndorpen, tropische tempels.{*B*} -- Nieuw: handelen met dorpelingen.{*B*} -- Nieuw: interface voor aambeeld.{*B*} -- Je kunt nu leren pantsers verven.{*B*} -- Je kunt nu halsbanden van wolven verven.{*B*} -- Je kunt nu op een varken rijden en besturen met een wortel aan een stok.{*B*} -- Verbeterde bonuskist met meer voorwerpen.{*B*} -- Plaatsing van halve blokken en andere blokken op halve blokken aangepast.{*B*} -- Plaatsing van omgekeerde trappen en platen aangepast.{*B*} -- Nieuwe beroepen voor dorpelingen.{*B*} -- Dorpelingen die uit een ei verschijnen, hebben een willekeurig beroep.{*B*} -- Je kunt nu boomstammen zijdelings plaatsen.{*B*} -- Ovens kunnen nu houten gereedschap als brandstof gebruiken.{*B*} -- IJs en ramen kunnen worden verzameld met gereedschap dat is betoverd met magische vingers.{*B*} -- Houten knoppen en houten drukplaten kunnen nu worden geactiveerd met pijlen.{*B*} -- Onderwereld-mobs kunnen via portalen naar de Bovenwereld.{*B*} -- Creepers en spinnen richten hun agressie nu op de laatste speler die hen heeft getroffen.{*B*} -- Mobs in het speltype Creatief worden na korte tijd weer neutraal.{*B*} -- Impact bij verdrinking verwijderd.{*B*} -- Deuren die door zombies worden vernield vertonen nu sporen van schade.{*B*} -- IJs smelt nu in de Onderwereld.{*B*} -- Ketels worden nu gevuld als ze in de regen staan.{*B*} -- Het verbeteren van zuigers duurt nu twee keer zo lang.{*B*} -- Een gedood varken laat nu zijn zadel achter (als hij dit had).{*B*} -- De hemel in het Einde heeft nu een andere kleur.{*B*} -- Je kunt nu draad plaatsen (als struikeldraad).{*B*} -- Regen druppelt nu tussen de bladeren.{*B*} -- Je kunt nu hendels plaatsen op de onderkant van blokken.{*B*} -- De schade door TNT is nu afhankelijk van de moeilijkheid.{*B*} -- Boekrecept aangepast.{*B*} -- Boten breken plompenbladen in plaats van andersom.{*B*} -- Varkens laten meer varkensvlees achter.{*B*} -- Slijmkubussen verschijnen minder vaak in supervlakke werelden.{*B*} -- De schade door Creepers is nu afhankelijk van de moeilijkheid, meer impact.{*B*} -- Einder-mannen openen nu hun kaken.{*B*} -- Nieuw: teleporteren van spelers (via het menu {*BACK_BUTTON*} in de game).{*B*} -- Nieuwe host-opties voor vliegen, onzichtbaarheid en onkwetsbaarheid voor spelers op andere systemen.{*B*} -- Nieuwe uitleg in de oefenwereld over nieuwe voorwerpen en functies.{*B*} -- Kisten met muziekplaatsen in de oefenwereld zijn verplaatst.{*B*} + + Je kunt niet meedoen met deze game omdat je al een keer bent verwijderd door de host. - - {*ETB*}Welkom terug! Je hebt het vast niet gemerkt, maar Minecraft is bijgewerkt.{*B*}{*B*} -Er zijn allerlei nieuwe functies voor jou en je vrienden. We zetten de belangrijkste op een rijtje. Lees het even door en ga dan weer snel spelen!{*B*}{*B*} -{*T1*}Nieuwe voorwerpen{*ETB*} - Smaragd, smaragderts, smaragdblok, Einder-kist, struikeldraadschakelaar, betoverde gouden appel, aambeeld, bloempot, keienmuren, mossige keienmuren, Onderwereld-schilderij, aardappel, gebakken aardappel, giftige appel, wortel, gouden wortel, wortel aan een stok, -pompoentaart, nachtzichtdrankje, onzichtbaarheidsdrankje, Onderwereld-kwarts, Onderwereld-kwartserts, kwartsblok, kwartsplaat, trap van kwarts, gebeiteld kwartsblok, kwartspilaar, betoverd boek, tapijt.{*B*}{*B*} - {*T1*}Nieuwe mobs{*ETB*} - Zombie dorpelingen.{*B*}{*B*} -{*T1*}Nieuwe functies{*ETB*} - Handelen met dorpelingen, wapens en gereedschap repareren en betoveren op een aambeeld, voorwerpen bewaren in een Einder-kist, op een varken rijden en besturen met een wortel aan een stok!{*B*}{*B*} -{*T1*}Nieuwe speluitleg{*ETB*} – Leer hoe je de nieuwe functies moet gebruiken in de oefenwereld!{*B*}{*B*} -{*T1*}Nieuwe 'Easter Eggs'{*ETB*} – We hebben alle muziekplaten in de oefenwereld verplaatst. Kun jij ze weer vinden?{*B*}{*B*} + + Je bent uit de game verwijderd omdat je vloog - - Richt meer schade aan dan je vuisten. + + Verbinding maken duurde te lang - - Hiermee kun je sneller dan met de hand graven in aarde, gras, zand, grind en sneeuw. Je hebt schoppen nodig om sneeuwballen op te graven. + + De server is vol - - Dit heb je nodig om verschillende stenen blokken en erts uit te graven. + + Er verschijnen vijanden in de omgeving die veel schade aanrichten. Kijk ook uit voor de Creepers, omdat ze hun verwoestende aanval meestal niet afbreken als je op de vlucht slaat! - - Hiermee kun je sneller dan met de hand houten blokken kappen. + + Thema's - - Hiermee kun je aarde en grasblokken voorbewerken voor gewassen. + + Skinpakketten - - Je activeert houten deuren door ze te gebruiken, door op ze te slaan of met roodsteen. + + Vrienden van vrienden toestaan - - IJzeren deuren kunnen alleen worden geopend met roodsteen, knoppen of schakelaars. + + Speler verwijderen - - NIET GEBRUIKT + + Weet je zeker dat je deze speler uit de game wilt verwijderen? De speler kan pas weer meedoen als je de wereld opnieuw start. - - NIET GEBRUIKT + + Gamerafbeelding-pakketten - - NIET GEBRUIKT + + Je kunt niet meedoen met deze game omdat alleen vrienden van de host mogen meedoen. - - NIET GEBRUIKT + + Downloadbare content beschadigd - - Versterkt het pantser van de drager met 1. + + Deze downloadbare content is beschadigd en kan niet worden gebruikt. Je moet de content verwijderen en opnieuw installeren via het menu in de Minecraft Store. - - Versterkt het pantser van de drager met 3. + + Bepaalde downloadbare content is beschadigd en kan niet worden gebruikt. Je moet deze content verwijderen en opnieuw installeren via het menu in de Minecraft Store. - - Versterkt het pantser van de drager met 2. + + Je kunt niet meedoen - - Versterken het pantser van de drager met 1. + + Geselecteerd - - Versterkt het pantser van de drager met 2. + + Geselecteerde skin: - - Versterkt het pantser van de drager met 5. + + Volledige versie downloaden - - Versterkt het pantser van de drager met 4. + + Texturepakket ontgrendelen - - Versterken het pantser van de drager met 1. + + Om dit texturepakket te kunnen gebruiken voor je wereld, moet je het ontgrendelen. +Wil je het nu ontgrendelen? - - Versterkt het pantser van de drager met 2. + + Testversie texturepakket - - Versterkt het pantser van de drager met 6. + + Basis - - Versterkt het pantser van de drager met 5. + + Skinpakket ontgrendelen - - Versterken het pantser van de drager met 2. + + Om de geselecteerde skin te kunnen gebruiken, moet je dit skinpakket ontgrendelen. +Wil je dit skinpakket nu ontgrendelen? - - Versterkt het pantser van de drager met 2. + + Je gebruikt een testversie van het texturepakket. Je kunt deze wereld pas opslaan als je de volledige versie hebt ontgrendeld. +Wil je de volledige versie van het texturepakket nu ontgrendelen? - - Versterkt het pantser van de drager met 5. + + Volledige versie downloaden - - Versterkt het pantser van de drager met 3. + + Deze wereld gebruikt een combinatiepakket of texturepakket dat je niet hebt! +Wil je het combinatiepakket of texturepakket nu installeren? - - Versterken het pantser van de drager met 1. + + Testversie downloaden - - Versterkt het pantser van de drager met 3. + + Texturepakket niet aanwezig - - Versterkt het pantser van de drager met 8. + + Volledige versie ontgrendelen - - Versterkt het pantser van de drager met 6. + + Testversie downloaden - - Versterken het pantser van de drager met 3. + + Je speltype is veranderd - - Een glanzende staaf die kan worden gebruikt om gereedschappen van dit materiaal te produceren. Ontstaat door erts te smelten in een oven. + + Als deze optie is ingeschakeld, mogen alleen uitgenodigde spelers meedoen. - - Hiermee kun je plaatsbare blokken produceren van staven, edelstenen of kleurstoffen. Je kunt het gebruiken als duur bouwblok of als compacte opslagplaats voor erts. + + Als deze optie is ingeschakeld, mogen vrienden van spelers op je Vriendenlijst meedoen. - - Als een speler, dier of monster hierop trapt, komt er een elektrische lading vrij. Houten drukplaten kun je ook activeren door er iets op te laten vallen. + + Als deze optie is ingeschakeld, kunnen spelers andere spelers verwonden. Alleen voor het speltype Survival. - - Wordt gebruikt voor korte trappen. + + Normaal - - Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok. + + Supervlak - - Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok van dubbele platen. + + Als deze optie is ingeschakeld zal het een online spel worden. - - Wordt gebruik om licht te maken. Met fakkels kun je ook sneeuw en ijs smelten. + + Als deze optie is uitgeschakeld, mogen andere spelers pas na toestemming bouwen of uitgraven. - - Worden gebruikt als bouwmateriaal waarmee je van alles kunt maken. Kan worden geproduceerd uit alle soorten hout. + + Als deze optie is ingeschakeld, worden bouwwerken als dorpen en vestingen gegenereerd in de wereld. - - Wordt gebruikt als bouwmateriaal. In tegenstelling tot gewoon zand is het niet gevoelig voor zwaartekracht. + + Als deze optie is ingeschakeld, wordt een volledig vlakke Bovenwereld en Onderwereld gegenereerd. - - Wordt gebruikt als bouwmateriaal. + + Als deze optie is ingeschakeld, staat er een kist met handige voorwerpen bij de terugkeerlocatie van de speler. - - Wordt gebruikt voor het produceren van fakkels, pijlen, borden, ladders en hekken, en als handgrepen van gereedschap en wapens. + + Als deze optie is ingeschakeld, kan vuur overslaan naar brandbare blokken in de buurt. - - Hiermee kun je op elk moment van de nacht meteen naar de ochtend gaan, zodra alle spelers in de wereld in hun bed liggen. Dit verandert ook de terugkeerlocatie van de speler. -De kleur van het bed is altijd hetzelfde, ongeacht de kleuren van de gebruikte wol. + + Als deze optie is ingeschakeld, ontploft TNT als het wordt geactiveerd. - - Hiermee kun je een grotere selectie voorwerpen produceren. + + Als deze optie is ingeschakeld, wordt de Onderwereld opnieuw gegenereerd. Dit is handig als je een ouder opslagbestand zonder Onderwereld-forten hebt. - - Hiermee kun je erts smelten, houtskool en glas maken en vis en varkensvlees bereiden. + + Uit - - Hierin kun je blokken en voorwerpen bewaren. Plaats twee kisten naast elkaar om een grotere kist met een twee keer zo grote capaciteit te maken. + + Speltype: Creatief - - Wordt gebruikt als een omheining waar je niet overheen kunt springen. Telt als een hoogte van 1,5 blok voor spelers, dieren en monsters, en een hoogte van 1 blok voor andere blokken. + + Survival - - Wordt gebruikt om verticaal te klimmen. + + Creatief - - Wordt geactiveerd door het luik te gebruiken, door erop te slaan of met roodsteen. Werkt als een normale deur, maar ligt als blok van 1x1 plat op de grond. + + Je wereld hernoemen - - Is voorzien van tekst die is ingevoerd door jou of een andere speler. + + Voer de nieuwe naam in voor je wereld - - Geeft meer licht dan fakkels. Smelt sneeuw/ijs en kan onder water worden gebruikt. + + Speltype: Survival - - Wordt gebruikt om explosies te veroorzaken. Na plaatsing te activeren door aan te steken met een aansteker of een elektrische lading. + + Gemaakt in het speltype Survival - - Wordt gebruikt om paddenstoelenstoofpot in te doen. Als de stoofpot op is, mag je de kom houden. + + Opslagbestand hernoemen - - Wordt gebruikt om water, lava en melk in te doen en te vervoeren. + + Automatisch opslaan over %d... - - Wordt gebruikt om water in te doen en te vervoeren. - - - Wordt gebruikt om lava in te doen en te vervoeren. + + Aan - - Wordt gebruikt om melk in te doen en te vervoeren. + + Gemaakt in het speltype Creatief - - Wordt gebruikt om vuur te maken, TNT te laten ontploffen en een portaal te openen. + + Wolken renderen - - Wordt gebruikt om vis te vangen. + + Wat wil je doen met dit opslagbestand? - - Laat de posities van de zon en de maan zien. + + Formaat Scherminfo (gedeeld scherm) - - Wijst je de weg naar je startpunt. + + Ingrediënt - - Als je de kaart vasthoudt, wordt de al ontdekte omgeving uitgetekend. Dit is erg handig om je weg te vinden. + + Brandstof - - Hiermee kun je van afstand aanvallen door pijlen af te schieten. + + Automaat - - Wordt gebruikt als munitie voor bogen. + + Kist - - Herstelt 2,5{*ICON_SHANK_01*}. + + Betoveren - - Herstelt 1{*ICON_SHANK_01*}. Kan 6 keer worden gebruikt. + + Oven - - Herstelt 1{*ICON_SHANK_01*}. + + Er is op dit moment geen downloadbare content van dit type beschikbaar voor deze titel. - - Herstelt 1{*ICON_SHANK_01*}. + + Weet je zeker dat je dit opslagbestand wilt verwijderen? - - Herstelt 3{*ICON_SHANK_01*}. + + Wachten op goedkeuring - - Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Het kan je wel vergiftigen. + + Gecensureerd - - Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt door rauwe kip te bereiden in een oven. + + %s doet mee met de game. - - Herstelt 1.5{*ICON_SHANK_01*} of kan worden bereid in een oven. + + %s heeft de game verlaten. - - Herstelt 4{*ICON_SHANK_01*}. Wordt gemaakt door rauw rundvlees te bereiden in een oven. + + %s is verwijderd uit de game. - - Herstelt 1.5{*ICON_SHANK_01*} of kan worden bereid in een oven. + + Brouwrek - - Herstelt 4{*ICON_SHANK_01*}. Wordt gemaakt door varkensvlees te bereiden in een oven. + + Tekst invoeren op bord - - Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Je kunt er een ocelot mee temmen. + + Voer een tekstregel in voor je bord - - Herstelt 2,5{*ICON_SHANK_01*}. Wordt gemaakt door rauwe vis te bereiden in een oven. + + Titel invoeren - - Herstelt 2{*ICON_SHANK_01*} en er kan een gouden appel van worden gemaakt. + + Testversie verlopen - - Herstelt 2{*ICON_SHANK_01*} en herstelt 4 seconden lang je gezondheid. Wordt gemaakt van een appel en goudklompen. + + Game vol - - Herstelt 2{*ICON_SHANK_01*}. Het kan je wel vergiftigen. + + Aansluiten bij de game is mislukt omdat er geen ruimte meer is - - Wordt gebruikt in het taartrecept en als ingrediënt bij het brouwen van drankjes. + + Voer een titel in voor je bericht - - Wordt gebruikt om een elektrische lading aan of uit te zetten. Blijft aan of uit staan tot je de hendel weer gebruikt. + + Voer een beschrijving in voor je bericht - - Geeft voortdurend elektrische ladingen af. Kan ook worden gebruikt als een ontvanger/zender bij bevestiging aan een blok. -Kan ook worden gebruikt voor matige verlichting. + + Inventaris - - Wordt in roodsteencircuits gebruikt als versterker, delayer en/of diode. + + Ingrediënten - - Druk hierop om een elektrische lading af te geven. Blijft ongeveer een seconde geactiveerd en gaat dan weer uit. + + Bijschrift toevoegen - - Bevat voorwerpen en werpt deze in willekeurige volgorde uit als de automaat een roodsteensignaal krijgt. + + Voer een bijschrift in voor je bericht - - Speelt een muzieknoot als het wordt geactiveerd. Sla erop om de toonhoogte te veranderen. Door het op andere blokken te plaatsen, kun je het type instrument veranderen. + + Beschrijving invoeren - - Worden gebruikt als spoorweg voor mijnwagens. + + Huidig nummer: - - Als deze rails stroom hebben, versnellen ze mijnwagens. Zonder stroom komen mijnwagens tot stilstand. + + Weet je zeker dat je deze wereld wilt toevoegen aan je lijst met uitgesloten werelden? +Als je dit bevestigt met OK, wordt deze game ook afgesloten. - - Werkt als een drukplaat (via een roodsteensignaal als het stroom heeft), maar kan alleen worden geactiveerd door een mijnwagen. + + Verwijderen van lijst met uitgesloten werelden - - Wordt gebruikt om jezelf, een dier of een monster over rails te vervoeren. + + Interval automatisch opslaan - - Wordt gebruikt om goederen over rails te vervoeren. + + Uitgesloten wereld - - Verplaatst zich over rails en duwt andere mijnwagens als er steenkool in zit. + + De game waaraan je wilt meedoen, staat op je lijst met uitgesloten werelden. +Als je toch meedoet, wordt het de wereld verwijderd van je lijst met uitgesloten werelden. - - Hiermee kun je je sneller over het water verplaatsen dan door te zwemmen. + + Deze wereld uitsluiten? - - Wordt verkregen door een schaap te scheren en kan worden gekleurd met kleurstoffen. + + Interval automatisch opslaan: UIT - - Wordt gebruikt als bouwmateriaal en kan worden gekleurd met kleurstoffen. Dit recept is wat overbodig, omdat wol eenvoudig kan worden verkregen van een schaap. + + Doorzichtigheid interface - - Wordt gebruikt als kleurstof voor zwarte wol. + + Automatisch opslaan wereld voorbereiden - - Wordt gebruikt als kleurstof voor groene wol. + + Formaat Scherminfo - - Wordt gebruikt als kleurstof voor bruine wol, als ingrediënt van koekjes of voor het kweken van cacaovruchten. + + min. - - Wordt gebruikt als kleurstof voor zilveren wol. + + Dit kan hier niet geplaatst worden! - - Wordt gebruikt als kleurstof voor gele wol. + + Je mag geen lava in de buurt van een terugkeerlocatie plaatsen, omdat verschijnende spelers anders direct doodgaan. - - Wordt gebruikt als kleurstof voor rode wol. + + Favoriete skins - - Wordt gebruikt om meteen gewassen, bomen, hoog gras, grote paddenstoelen en bloemen te laten ontstaan en kan worden gebruikt om kleurstoffen te maken. + + Game van %s - - Wordt gebruikt als kleurstof voor roze wol. + + Game van onbekende host - - Wordt gebruikt als kleurstof voor oranje wol. + + Gast afgemeld - - Wordt gebruikt als kleurstof voor lichtgroene wol. + + Standaardinstellingen herstellen - - Wordt gebruikt als kleurstof voor grijze wol. + + Weet je zeker dat je de standaardinstellingen wilt herstellen? - - Wordt gebruikt als kleurstof voor lichtgrijze wol. -(Opmerking: lichtgrijze kleurstof kan ook worden gemaakt door grijze kleurstof te combineren met bottenmeel, waardoor je 4 lichtgrijze kleurstoffen van elke inktzak kunt maken in plaats van 3.) + + Fout tijdens het laden - - Wordt gebruikt als kleurstof voor lichtblauwe wol. + + Een gastspeler heeft zich afgemeld, waardoor alle gastspelers uit de game zijn verwijderd. - - Wordt gebruikt als kleurstof voor cyaankleurige wol. + + Game maken mislukt - - Wordt gebruikt als kleurstof voor paarse wol. + + Automatisch geselecteerd - - Wordt gebruikt als kleurstof voor magenta wol. + + Geen pakket: Standaardskins - - Wordt gebruikt als kleurstof voor blauwe wol. + + Aanmelden - - Speelt muziekplaten af. + + Je bent niet aangemeld. Om deze game te kunnen spelen, moet je zijn aangemeld. Wil je je nu aanmelden? - - Wordt gebruikt om zeer sterke gereedschappen, wapens en pantser te maken. + + Multiplayer niet toegestaan - - Geeft meer licht dan fakkels. Smelt sneeuw/ijs en kan onder water worden gebruikt. + + Drinken - - Wordt gebruikt om boeken en kaarten te maken. + + + In dit gebied vind je landbouwgrond. Dit is een duurzame bron van voedsel en andere voorwerpen. + - - Kan worden gebruikt voor het maken van boekenplanken en worden betoverd voor het maken van betoverde boeken. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over landbouw.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over landbouw. + - - Door deze rond een tovertafel te plaatsen, kun je krachtigere betoveringen maken. + + Tarwe, pompoenen en meloenen kweek je met zaden. Je verzamelt tarwezaden door hoog gras af te breken of door tarwe te oogsten. Pompoen- en meloenzaden verkrijg je uit pompoenen en meloenen. - - Wordt gebruikt als decoratie. + + Druk op{*CONTROLLER_ACTION_CRAFTING*} om de inventaris van het speltype Creatief te openen. - - Kan worden uitgegraven met een ijzeren houweel of beter gereedschap. Het kan in een oven worden omgesmolten tot goudstaven. + + Ga door deze opening om verder te gaan. - - Kan worden uitgegraven met een stenen houweel of beter gereedschap. Het kan in een oven worden omgesmolten tot ijzerstaven. + + Je hebt de nu de uitleg van het speltype Creatief voltooid. - - Kan worden uitgegraven met een houweel om steenkool te verkrijgen. + + Voordat je zaden kunt planten, moet je eerst met een schoffel een akker maken op aardeblokken. Met de waterbron in de buurt kun je de akker irrigeren en de gewassen sneller laten groeien. Ook blijft het gebied dan verlicht. - - Kan worden uitgegraven met een stenen houweel of beter gereedschap om lapis lazuli te verkrijgen. + + Cactussen moeten worden geplant op zand en kunnen drie blokken hoog worden. Net als bij suikerriet kun je de bovenste blokken verzamelen door het onderste te vernietigen.{*ICON*}81{*/ICON*} - - Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om diamanten te verkrijgen. + + Paddenstoelen moeten worden geplant in een schemerige omgeving en verspreiden zich over schemerige blokken in de buurt.{*ICON*}39{*/ICON*} - - Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om roodsteenstof te verkrijgen. + + Bottenmeel kan worden gebruikt om gewassen volledig tot bloei te laten komen of om grote paddenstoelen te maken van gewone paddenstoelen.{*ICON*}351:15{*/ICON*} - - Kan worden uitgegraven met een houweel om keien te verkrijgen. + + Tarwe groeit in verschillende fasen en kan worden geoogst als de plant donkerder wordt.{*ICON*}59:7{*/ICON*} - - Wordt verkregen met een schop. Kan worden gebruikt voor constructie. + + Pompoenen en meloenen hebben naast zich een extra blok met zaad nodig zodat de vrucht zich kan ontwikkelen als de stam is volgroeid. - - Kan worden geplant en groeit uiteindelijk uit tot boom. + + Suikerriet moet direct naast een waterblok worden geplant op een gras-, aarde- of zandblok. Als je een suikerrietblok omhakt, vallen alle blokken erboven naar beneden.{*ICON*}83{*/ICON*} - - Dit is onbreekbaar materiaal. + + In het speltype Creatief heb je de beschikking over een onbeperkte hoeveelheid van alle voorwerpen en blokken. Ook kun je met één klap blokken vernietigen zonder gereedschap te gebruiken, ben je onkwetsbaar en kun je vliegen. - - Alles wat ermee in contact komt, gaat branden. Kan worden verzameld in een emmer. + + + In de kist in dit gebied vind je enkele onderdelen waarmee je circuits met zuigers kunt maken. Je kunt de circuits in dit gebied afmaken of zelf nieuwe circuits maken. Buiten de oefenwereld van deze speluitleg vind je er nog meer. + - - Wordt verkregen met een schop. Kan in een oven worden versmolten tot glas. Is gevoelig voor zwaartekracht als er geen object onder ligt. + + + In dit gebied vind je een portaal naar de Onderwereld! + - - Wordt verkregen met een schop. Bij het opgraven verschijnt soms vuursteen. Is gevoelig voor zwaartekracht als er geen object onder ligt. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over portalen en de Onderwereld.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over portalen en de Onderwereld. + - - Wordt gekapt met een bijl. Er kunnen planken van worden gemaakt en het kan als brandstof worden gebruikt. + + Je krijgt roodsteenstof door roodsteenerts uit te graven met een ijzeren, diamanten of gouden houweel. De stroom heeft een bereik van 15 blokken en de energie kan één blok omhoog of omlaag stromen. {*ICON*}331{*/ICON*} - - Wordt gemaakt door in een oven zand te smelten. Kan worden gebruikt voor constructie, maar breekt als je het probeert uit te graven. + + + Je kunt roodsteenversterkers gebruiken om meer blokken van stroom te voorzien of om een circuit te vertragen. + {*ICON*}356{*/ICON*} + - - Wordt verkregen door steen uit te graven met een houweel. Kan worden gebruikt voor het maken van een oven of stenen gereedschappen. + + + Een aangedreven zuiger kan maximaal 12 blokken wegduwen. Als plakzuigers weer worden ingeschoven, kunnen ze één exemplaar van de meeste blokken meetrekken. + {*ICON*}33{*/ICON*} + - - Ontstaan door klei te bakken in een oven. + + + Je maakt een portaal door een lijst te maken die vier obsidiaanblokken breed en vijf Portalenblokken hoog is. Je hoeft geen blokken op de hoeken te plaatsen. + - - Wordt gebruikt om bakstenen van te maken in een oven. + + + Je kunt de Onderwereld gebruiken om je snel te verplaatsen in de Bovenwereld. Als je je in de Onderwereld één blok verplaatst, staat dat gelijk met een afstand van drie blokken in de Bovenwereld. + - - Na het breken blijven er balletjes klei over, waarmee je bakstenen kunt maken in een oven. + + + Dit is het speltype Creatief. + - - Een compacte manier om sneeuwballen op te slaan. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over het speltype Creatief.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over het speltype Creatief. + - - Kan worden afgegraven met een schop om sneeuwballen te maken. + + + Om een Onderwereldportaal te activeren, steek je de obsidiaanblokken in de lijst aan met een aansteker. Portalen worden inactief als de lijst stukgaat, als er in de buurt iets ontploft of als er vloeistof doorheen stroomt. + - - Bij het afbreken verschijnen soms tarwezaden. + + + Ga in een Onderwereldportaal staan om het te gebruiken. Het scherm wordt paars en je hoort een geluid. Een paar seconden later ben je in een andere dimensie. + - - Hiervan kun je een kleurstof maken. + + + De Onderwereld kan gevaarlijk zijn door al die lava, maar je vindt er ook handige Onderwereld-blokken die eeuwig branden en gloeisteen dat licht produceert. + - - Te gebruiken met een kom om stoofpot te produceren. + + Je hebt de nu de uitleg over landbouw voltooid. - - Kan alleen worden uitgegraven met een diamanten houweel. Wordt geproduceerd door water te combineren met stilstaande lava en wordt gebruikt om een portaal te bouwen. + + Sommige gereedschappen zijn geschikter dan andere voor een bepaald materiaal. Zo kun je het beste een bijl gebruiken om bomen te kappen. - - Laat monsters in de wereld verschijnen. + + Sommige gereedschappen zijn geschikter dan andere voor een bepaald materiaal. Zo kun je het beste een houweel gebruiken om steen en erts uit te graven. Voor bepaalde blokken heb je een houweel nodig die van een beter materiaal is gemaakt. - - Wordt op de grond geplaatst om een elektrische lading te geleiden. Door het te verwerken in een drankje verleng je de duur van het effect. + + Sommige gereedschappen zijn beter geschikt om aan te vallen. Een zwaard is bijvoorbeeld erg effectief tegen vijanden. - - Rijpe gewassen kunnen worden geoogst om tarwe te verkrijgen. + + IJzergolems kunnen ook vanzelf verschijnen om dorpen te verdedigen en vallen je aan als jij dorpelingen aanvalt. - - Grond die is voorbewerkt voor het planten van zaden. + + Je mag dit gebied pas verlaten als je de speluitleg hebt voltooid. - - Kan in een oven worden gekookt om groene kleurstof te verkrijgen. + + Sommige gereedschappen zijn geschikter dan andere voor een bepaald materiaal. Zo kun je het beste een schop gebruiken om zachte materialen als aarde en zand uit te graven. - - Kan worden gebruikt om suiker te produceren. + + Tip: Hou{*CONTROLLER_ACTION_ACTION*}ingedrukt om iets uit te graven met je hand of met het voorwerp dat je vasthoudt. Mogelijk moet je eerst gereedschap maken om bepaalde blokken te kunnen uitgraven. - - Kan worden gedragen als helm of met een fakkel worden gebruikt om een pompoenlampion te maken. Het is ook het belangrijkste ingrediënt van pompoentaart. + + In de kist naast de rivier vind je een boot. Om de boot te gebruiken, richt je de aanwijzer op het water en druk je op{*CONTROLLER_ACTION_USE*}. Gebruik{*CONTROLLER_ACTION_USE*} terwijl je richt op de boot om erin te stappen. - - Brandt voor eeuwig nadat het is aangestoken. + + In de kist naast de vijver vind je een hengel. Neem de hengel uit de kist en hou deze in je hand. - - Vertraagt de beweging van alles wat eroverheen loopt. + + Met dit geavanceerde zuigermechanisme maak je een brug die zichzelf kan repareren! Druk op de knop om het te activeren en onderzoek zelf hoe de onderdelen met elkaar in verbinding staan. - - Via een portaal kun je heen en weer reizen tussen de Bovenwereld en de Onderwereld. + + Het gereedschap dat je gebruikt is nu beschadigd. Elke keer dat je een stuk gereedschap gebruikt, raakt het meer versleten. Uiteindelijk gaat het kapot. De gekleurde balk onder het voorwerp in je inventaris geeft het huidige slijtageniveau aan. - - Wordt gebruikt als brandstof in een oven of om een fakkel te produceren. + + Hou{*CONTROLLER_ACTION_JUMP*} om omhoog te zwemmen. - - Wordt verkregen door een spin te doden. Kan worden gebruikt om een boog of een vishengel te produceren of op de grond worden geplaatst om struikeldraad te maken. + + In dit gebied vind je een mijnwagen op rails. Om in een mijnwagen te stappen, richt je de aanwijzer erop en druk je op{*CONTROLLER_ACTION_USE*}. Gebruik{*CONTROLLER_ACTION_USE*} op de knop om de mijnwagen in gang te zetten. - - Wordt verkregen door een kip te doden en kan worden gebruikt om een pijl te produceren. + + IJzergolems maak je door vier ijzerblokken op de getoonde manier te plaatsen en een pompoen op het middelste blok te zetten. Deze golems vallen je vijanden aan. - - Wordt verkregen door een Creeper te doden. Kan worden gebruikt om TNT te produceren en als ingrediënt bij het brouwen van drankjes. + + Voer tarwe aan een koe, zwamkoe of schaap, wortels aan varkens, tarwezaden of Onderwereld-wrat aan een kip of elk soort vlees aan een wolf. De dieren gaan dan in de omgeving op zoek naar dieren van hun soort die ook verliefd zijn. - - Kunnen worden geplant op een akker om gewassen te kweken. Zorg ervoor dat de zaden genoeg licht krijgen! + + Als twee verliefde dieren van dezelfde soort elkaar vinden, zoenen ze een paar seconden en verschijnt er een jong dier. Jonge dieren volgen hun ouders tot ze volwassen zijn. - - Wordt verkregen door het oogsten van gewassen en kan worden gebruikt om voedsel te produceren. + + Nadat een dier verliefd is geweest, duurt het ongeveer vijf minuten voordat het opnieuw verliefd kan worden. - - Wordt verkregen door het opgraven van grind en kan worden gebruikt voor het produceren van een aansteker. + + + In dit gebied zitten dieren ingesloten. Je kunt dieren fokken om nieuwe jonge dieren te verkrijgen. + - - Als je hiermee een varken opzadelt, kun je erop rijden. Vervolgens kun je het varken besturen met een wortel aan een stok. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over dieren en fokken.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over dieren en fokken. + - - Wordt verkregen door het opscheppen van sneeuw, waarna je ermee kunt gooien. + + Om dieren te laten paren, moet je ze voedsel geven waarvan ze 'verliefd' worden. - - Wordt verkregen door een koe te doden. Kan worden gebruikt om pantser te produceren of boeken te maken. + + Sommige dieren volgen je als je hun voedsel in je hand houdt. Op deze manier kun je gemakkelijker dieren samenbrengen om ze te laten paren.{*ICON*}296{*/ICON*} - - Wordt verkregen door een slijmkubus te doden. Kan worden gebruikt als ingrediënt bij het brouwen van drankjes of om plakzuigers te produceren. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over golems.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over golems. + - - Wordt op willekeurige momenten achtergelaten door kippen en kan worden gebruikt om voedsel te produceren. + + Je maakt een golem door een pompoen op een stapel blokken te zetten. - - Wordt verkregen door het uitgraven van gloeisteen. Kan worden gebruikt om nieuwe blokken gloeisteen te maken of om het effect van een drankje krachtiger te maken. + + Sneeuwgolems maak je door twee sneeuwblokken op elkaar te zetten en daarop een pompoen te plaatsen. Ze gooien sneeuwballen naar je vijanden. - - Wordt verkregen door een Skelet te doden. Er kan bottenmeel van worden geproduceerd en je kunt er een wolf mee temmen. + + + Je kunt wolven temmen door ze botten te voeren. Als ze zijn getemd, verschijnen er hartjes om hen heen. Getemde wolven volgen en beschermen je, behalve als je ze hebt opgedragen te gaan zitten. + - - Wordt verkregen door een Skelet een Creeper te laten doden. Kan worden afgespeeld in een jukebox. + + Je hebt nu de uitleg over dieren en fokken voltooid. - - Blust vuur en zorgt ervoor dat gewassen kunnen groeien. Kan worden verzameld in een emmer. - - - Als je ze afbreekt, laten ze soms een jong boompje achter, dat je kunt planten en laten uitgroeien tot een boom. + + + In dit gebied vind je enkele pompoenen en blokken waarmee je een sneeuwgolem en een ijzergolem kunt maken. + - - Te vinden in kerkers en kan worden gebruikt voor constructie en decoratie. + + + De positie en de richting van de stroombron bepaalt het effect op de omliggende blokken. Zo wordt een roodsteen aan de zijkant van een blok gedoofd als dat blok stroom krijgt van een andere bron. + - - Wordt gebruikt om wol te verkrijgen van schaap en om bladeren te oogsten. + + + Als een ketel leeg raakt, kun je 'm bijvullen met een emmer water. + - - Moet worden aangedreven met een knop, hendel, drukplaat, roodsteenfakkel of roodsteen, waarna de zuiger wordt uitgeschoven en blokken kan wegduwen. + + + Gebruik het brouwrek om een drankje voor vuurbestendigheid te maken. Je hebt een fles water, Onderwereld-wrat en magmacrème nodig. + - - Moet worden aangedreven met een knop, hendel, drukplaat, roodsteenfakkel of roodsteen, waarna de zuiger wordt uitgeschoven (als dat mogelijk is) en blokken kan wegduwen. Als de zuiger weer wordt ingeschoven, trekt de zuiger het blok mee dat eraan vast zit. + + + Hou het drankje vast en hou{*CONTROLLER_ACTION_USE*} ingedrukt om het te gebruiken. Een normaal drankje drink je op, waarna je zelf het effect ondervindt. Een explosief drankje moet je gooien, waarna wezens in de buurt van de inslag de effecten ondervinden. + Je maakt explosieve drankjes door buskruit toe te voegen aan normale drankjes. + - - Gemaakt van stenen blokken, meestal te vinden in vestingen. + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over brouwen en drankjes.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over brouwen en drankjes. + - - Wordt gebruikt als omheining, vergelijkbaar met hekken. + + + Om een drankje te kunnen brouwen, heb je eerst een fles water nodig. Neem een glazen fles uit de kist. + - - Vergelijkbaar met een deur, maar vooral geschikt voor hekken. + + + Je kunt een glazen fles vullen in een ketel waar water in zit, of met een blok water. Vul nu je glazen fles door te richten op een waterbron en op{*CONTROLLER_ACTION_USE*} te drukken. + - - Kan worden gemaakt uit stukken meloen. + + + Gebruik het drankje voor vuurbestendigheid op jezelf. + - - Transparante blokken die kunnen worden gebruikt als een alternatief voor glasblokken. + + + Om een voorwerp te betoveren, plaats je het eerst in het betoveringsvakje. Je kunt wapens, pantser en bepaalde gereedschappen betoveren om er speciale effecten aan te geven. Zo kun je de weerstand verbeteren of ervoor zorgen dat je meer voorwerpen krijgt als je een blok uitgraaft. + - - Kunnen worden geplant om pompoenen te kweken. + + + Als er een voorwerp wordt geplaatst in het betoveringsvakje, tonen de knoppen rechts een selectie van willekeurige betoveringen. + - - Kunnen worden geplant om meloenen te kweken. + + + Het getal op de knop staat voor de kosten die in mindering worden gebracht op je ervaringsniveau. Als je ervaringsniveau te laag is voor de betovering, kun je de knop niet gebruiken. + - - Wordt achtergelaten door dode Einder-mannen. Als je ermee gooit, word je getransporteerd naar de plek waar de Einder-parel neerkomt en verlies je een beetje gezondheid. + + + Nu je bestand bent tegen vuur en lava, zou je eens moeten kijken of je naar plekken kunt waar je eerst niet kon komen. + - - Een blok aarde waar gras op groeit. Wordt verkregen met een schop. Kan worden gebruikt voor constructie. + + + Dit is de betover-interface, waar je betoveringen kunt toevoegen aan wapens, pantser en bepaalde gereedschappen. + - - Kan worden gebruikt voor constructie en decoratie. + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over de betover-interface.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de betover-interface. + - - Vertraagt je als je erdoorheen loopt. Je kunt het kapotmaken met een schaar om draad te verkrijgen. + + + In dit gebied staat een brouwrek, een ketel en een kist met brouwvoorwerpen. + - - Als je dit vernietigt, verschijnt er een zilvervis. Er kan ook een zilvervis verschijnen als er in de buurt een zilvervis wordt aangevallen. + + + Houtskool kan worden gebruikt als brandstof, maar in combinatie met een stok kun je er ook een fakkel van maken. + - - De plant begint te groeien nadat hij is geplaatst. Kan worden verzameld met een schaar. Je kunt erop klimmen zoals op een ladder. + + + Plaats zand in het ingrediëntvakje om glas te maken. Maak wat glasblokken, die je als ramen kunt gebruiken in je schuilplaats. + - - Kijk uit als je eroverheen loopt, want het is glad. Verandert in water als het boven een ander blok wordt vernietigd. Smelt als je er een lichtbron bij houdt of als je het plaatst in de Onderwereld. + + + Dit is de brouw-interface. Hier maak je allerlei drankjes met verschillende effecten. + - - Kan worden gebruikt voor decoratie. + + + Veel houten voorwerpen zijn geschikt als brandstof, maar niet alles brandt even lang. Misschien vind je ook nog andere voorwerpen die je kunt gebruiken als brandstof. + - - Wordt gebruikt als ingrediënt van drankjes en om vestingen te vinden. Wordt achtergelaten door Blazes die je vaak bij of in Onderwereld-forten vindt. + + + Als de nieuwe voorwerpen klaar zijn, kun je ze van het resultaatvakje verplaatsen naar je inventaris. Experimenteer met verschillende ingrediënten om te zien wat je allemaal kunt maken. + - - Wordt gebruikt als ingrediënt van drankjes. Wordt achtergelaten door dode Ghasts. + + + Als je hout als ingrediënt gebruikt, kun je houtskool maken. Plaats wat brandstof in de oven en hout in het ingrediëntvakje. Het kan even duren voordat de oven klaar is met het produceren van de houtskool, dus ga ondertussen gerust iets anders doen en kom later terug om te zien hoe het gaat. + - - Wordt achtergelaten door dode Zombie-bigmensen. Je vindt Zombie-bigmensen in de Onderwereld. Wordt gebruikt als ingrediënt bij het brouwen van drankjes. + + {*B*} + Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al weet hoe je het brouwrek moet gebruiken. + - - Wordt gebruikt als ingrediënt van drankjes. Ze groeien op een natuurlijke manier in Onderwereld-forten en kunnen ook worden geplant op drijfzand. + + + Door het toevoegen van een gegist spinnenoog krijgt het drankje een tegengesteld effect en met buskruit maak je er een explosief drankje van. Hiermee kun je gooien, waarna de omgeving het effect ervan ondervindt. - - Afhankelijk van hun toepassing kunnen drankjes uiteenlopende effecten hebben. + + + Maak een drankje voor vuurbestendigheid door eerst Onderwereld-wrat toe te voegen aan een fles water en er vervolgens magmacrème bij te doen. + - - Kan worden gevuld met water en in het brouwrek worden gebruikt als basisingrediënt voor een drankje. + + + Druk nu op{*CONTROLLER_VK_B*} om de brouw-interface te sluiten. + - - Dit is giftig voedsel en een ingrediënt voor drankjes. Wordt achtergelaten door een gedode spin of grotspin. + + + Je brouwt drankjes door een ingrediënt in het bovenste vakje en een drankje of fles water in de onderste vakjes te plaatsen. Je kunt er maximaal 3 tegelijk brouwen. Als je de juiste voorwerpen met elkaar hebt gecombineerd, begint het brouwproces en even later is je drankje klaar. + - - Wordt gebruikt als ingrediënt van drankjes, vooral van drankjes met een negatief effect. + + + Alle drankjes beginnen met een fles water. De meeste drankjes maak je door eerst een 'vreemd drankje' te maken met Onderwereld-wrat. Je hebt nog minstens één ander ingrediënt nodig om het drankje te maken. + - - Wordt gebruikt als ingrediënt van drankjes of samen met andere voorwerpen gebruikt voor het produceren van Einder-oog of magmacrème. + + + Als het drankje klaar is, kun je de effecten ervan aanpassen. Door het toevoegen van roodsteenstof verleng je de duur van de effecten en door het toevoegen van gloeisteenstof maak je ze krachtiger. + - - Wordt gebruikt als ingrediënt van drankjes. + + + Selecteer een betovering en druk op{*CONTROLLER_VK_A*} om het voorwerp te betoveren. De kosten van de betovering worden afgetrokken van je ervaringsniveau. + - - Wordt gebruikt voor het maken van drankjes en explosieve drankjes. + + + Druk op{*CONTROLLER_ACTION_USE*} om de hengel uit te werpen. Druk opnieuw op{*CONTROLLER_ACTION_USE*} om de lijn binnen te halen. + {*FishingRodIcon*} + - - Kan door regen of met een emmer water worden gevuld en vervolgens worden gebruikt om glazen flessen met water te vullen. + + + Als de dobber onder het wateroppervlak verdwijnt, kun je de lijn binnenhalen om een vis te vangen. Je kunt een vis rauw eten of bereiden in een oven om je gezondheid aan te vullen. + {*FishIcon*} + - - Als je ermee gooit, zie je in welke richting je een Einde-portaal kunt vinden. Als je er twaalf plaatst in de Einde-portaalblokken, activeer je het Einde-portaal. + + + Net zoals veel andere gereedschappen kun je een hengel maar een bepaald aantal keren gebruiken. Met hengels kun je trouwens nog meer doen dan alleen vissen. Experimenteer er maar eens mee om te zien wat je ermee kunt vangen en activeren... + {*FishingRodIcon*} + - - Wordt gebruikt als ingrediënt van drankjes. + + + Met een boot kun je sneller over water reizen. Je stuurt de boot met{*CONTROLLER_ACTION_MOVE*} en{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + - - Vergelijkbaar met grasblokken, maar zeer geschikt om paddenstoelen op te kweken. + + + Je gebruikt nu een hengel. Druk op{*CONTROLLER_ACTION_USE*} om de hengel te gebruiken.{*FishingRodIcon*} + - - Drijft op water en je kunt erop lopen. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over vissen.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over vissen. + - - Wordt gebruikt om Onderwereld-forten te bouwen. Ongevoelig voor de vuurballen van de Ghast. + + + Dit is een bed. 's Nachts kun je slapen tot het ochtend is door op het bed te richten en op{*CONTROLLER_ACTION_USE*} te drukken.{*ICON*}355{*/ICON*} + - - Wordt gebruikt in Onderwereld-forten. + + + In dit gebied staan enkele eenvoudige circuits met roodsteen en zuigers, en een kist met voorwerpen waarmee je deze circuits kunt uitbreiden. + - - Te vinden in Onderwereld-forten. Laten Onderwereld-wratten achter als je ze breekt. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over circuits met roodsteen en zuigers.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over circuits met roodsteen en zuigers. + - - Hier kun je je ervaringspunten gebruiken om zwaarden, houwelen, bijlen, schoppen, bogen en pantser te betoveren. + + + Je kunt hendels, knoppen, drukplaten en roodsteenfakkels gebruiken om je circuits van stroom te voorzien. Dat doe je door ze direct te bevestigen aan het voorwerp dat je wilt activeren of door ze te verbinden met roodsteenstof. + - - Kan worden geactiveerd met twaalf Einder-ogen, waarna je naar het Einde kunt reizen. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over bedden.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over bedden. + - - Wordt gebruikt om een Einde-portaal te maken. + + + Plaats een bed in een veilige en goed verlichte plek, zodat je niet midden in de nacht wordt gestoord door monsters. Als je eenmaal een bed hebt gebruikt, keer je terug vanuit dat bed als je doodgaat. + {*ICON*}355{*/ICON*} + - - Een bloksoort dat je aantreft in het Einde. Het is zeer goed bestand tegen ontploffingen en dus erg geschikt om mee te bouwen. + + + Als er andere spelers met je meedoen, kun je alleen gaan slapen als iedereen op hetzelfde moment in een bed gaat liggen. + {*ICON*}355{*/ICON*} + - - Dit blok ontstaat als je de Einder-draak verslaat. + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over boten.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over boten. + - - Als je ermee gooit, komen er ervaringsbollen vrij. Pak deze op om ervaringspunten te krijgen. + + + Met een tovertafel kun je allerlei speciale effecten creëren. Zo kun je ervoor zorgen dat je meer voorwerpen krijgt als je een blok uitgraaft of dat je wapens, pantser en bepaalde gereedschappen duurzamer worden. + - - Te gebruiken om dingen in brand te steken of om lukraak branden te stichten als ze uit een automaat worden geschoten. + + + Door boekenkasten rond de tovertafel te plaatsen, wordt deze krachtiger en kun je betoveringen van hogere niveaus uitvoeren. + - - Een soort vitrine. Het vertoont het voorwerp of blok dat erin is geplaatst. + + + Het betoveren van voorwerpen kost ervaringsniveaus, die je krijgt door het verzamelen van ervaringsbollen. Dat doe je door monsters en dieren te doden, erts te winnen, dieren te fokken, vissen te vangen en bepaalde dingen te verhitten of te bereiden in een oven. + - - Als je ermee gooit, kan er een wezen van het aangegeven type verschijnen. + + + Betoveringen zijn allemaal willekeurig, maar bepaalde zeer goede betoveringen zijn alleen beschikbaar als je een hoog ervaringsniveau hebt en er veel boekenkasten bij je tovertafel staan. + - - Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok. + + + In dit gebied vind je een tovertafel en enkele andere voorwerpen waarmee je kunt oefenen met betoveringen. + - - Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok. + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over betoveringen.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over betoveringen. + - - Ontstaat door een Onderwereld-blok te smelten in een oven. Er kunnen blokken Onderwereld-steen van worden geproduceerd. + + + Je verdient ook ervaringsniveaus door een priesterfles te gebruiken. Als je zo'n fles op de grond gooit, ontstaan er ervaringsbollen op de plek waar hij neerkomt. Deze bollen kun je vervolgens oppakken. + - - Geven licht als ze stroom krijgen. + + + Een mijnwagen verplaatst zich over rails. Je kunt ook een aangedreven mijnwagen produceren met een oven en een mijnwagen waar een kist in zit. + {*RailIcon*} + - - Kan worden geoogst om cacaobonen te verkrijgen. + + + Je kunt ook aangedreven rails produceren. Deze krijgen stroom van roodsteenfakkels en circuits, waardoor de mijnwagens gaan rijden. Door gebruik te maken van schakelaars, hendels en drukplaten, kun je complexe systemen maken. + {*PoweredRailIcon*} + - - Mobhoofden kunnen als decoratie worden gebruikt of worden gedragen als masker door ze in het helmvak te plaatsen. + + + Je vaart nu in een boot. Om uit de boot te stappen, richt je de aanwijzer erop en druk je op{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + - - Inktvis + + + In de kisten in dit gebied vind je enkele betoverde voorwerpen, priesterflessen en voorwerpen die je zelf kunt betoveren bij de tovertafel. + - - Inktvissen laten inktzakken achter als ze worden gedood. + + + Je rijdt nu in een mijnwagen. Om uit de mijnwagen te stappen, richt je de aanwijzer erop en druk je op{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + - - Koe + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over mijnwagens.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over mijnwagens. + - - Koeien laten leer achter als ze worden gedood. Ze kunnen ook worden gemolken met een emmer. + + Als je de aanwijzer buiten de interface plaatst terwijl je een voorwerp vasthoudt, laat je dat voorwerp vallen. - - Schaap + + Lezen - - Schapen laten wol achter als ze worden geschoren (als dit niet al eens is gedaan). Ze kunnen worden gekleurd om de wol een andere kleur te geven. + + Hangen - - Kip + + Gooien - - Kippen laten veren achter als ze worden gedood en leggen op willekeurige momenten eieren. + + Openen - - Varken + + Andere toonhoogte - - Varkens laten varkensvlees achter als ze worden gedood. Als je een zadel op een varken legt, kun je erop rijden. + + Laten ontploffen - - Wolf + + Planten - - Wolven zijn niet agressief tot je ze aanvalt, want dan vallen ze jou ook aan. Je kunt ze temmen met botten. Ze volgen je dan en verdedigen je als je wordt aangevallen. + + Volledige game ontgrendelen - - Creeper + + Opslagbestand verwijderen - - Creepers exploderen als je te dichtbij komt! + + Verwijderen - - Skelet + + Bewerken - - Skeletten schieten met pijlen op je. Ze laten pijlen achter als ze worden gedood. + + Oogsten - - Spin + + Doorgaan - - Spinnen vallen je aan als je te dichtbij komt. Ze kunnen op muren lopen en laten draden achter als ze worden gedood. + + Omhoog zwemmen - - Zombie + + Slaan - - Zombies vallen je aan als je te dichtbij komt. + + Melken - - Zombie-bigmens + + Oppakken - - Zombie-bigmensen zijn niet agressief tot je er een aanvalt. Dan vallen ze in groepen aan. + + Leeg - - Ghast + + Zadel - - Ghasts schieten vuurballen die exploderen als je erdoor wordt geraakt. + + Plaatsen - - Slijmkubus + + Eten - - Slijmkubussen splitsen zich op in kleinere slijmkubussen als ze worden geraakt. + + Rijden - - Einder-man + + Varen - - Einder-mannen vallen je aan als je naar hen kijkt. Ze kunnen ook blokken verplaatsen. + + Kweken - - Zilvervis + + Slapen - - Als je zilvervissen aanvalt, krijgen ze hulp van zilvervissen in de buurt. Ze houden zich verscholen in stenen blokken. + + Ontwaken - - Grotspin + + Spelen - - De beet van de grotspin is giftig. + + Opties - - Zwamkoe + + Pantser verplaatsen - - Zwamkoeien produceren paddenstoelenstoofpot als je ze 'melkt' met een lege kom. Als je ze scheert, laten ze paddenstoelen vallen en worden ze een gewone koe. + + Wapen verplaatsen - - Sneeuwgolem + + In uitrusting - - Je kunt sneeuwgolems maken van sneeuwblokken en pompoenen. Vervolgens gooien ze sneeuwballen naar je vijanden. + + Ingrediënt verplaatsen - - Einder-draak + + Brandstof verplaatsen - - Dit is een grote zwarte draak, die je aantreft in het Einde. + + Gereedschap verplaatsen - - Blaze + + Spannen - - Deze vijanden tref je aan in de Onderwereld, meestal in Onderwereld-forten. Ze laten Blaze-staven achter als ze worden gedood. + + Pagina omhoog - - Magmakubus + + Pagina omlaag - - Magmakubussen komen voor in de Onderwereld. Net als slijmkubussen splitsen ze zich op in kleinere kubussen als ze worden geraakt. + + Verliefd - - Dorpeling + + Loslaten - - Ocelot + + Privileges - - Deze katachtigen vind je in oerwouden. Je kunt ze temmen door ze rauwe vis te voeren. Laat ze wel zelf naar je toe komen, want ze zijn erg schrikachtig. + + Afweren - - IJzergolem + + Creatief - - IJzergolems verdedigen dorpen. Je kunt ze maken met ijzerblokken en pompoenen. + + Wereld uitsluiten - - Explosie-animaties + + Skin selecteren - - Concept-illustraties + + Aansteken - - Cijfertjes en statistieken + + Vrienden uitnodigen - - Pestcoördinatie + + Accepteren - - Oorspronkelijk ontwerp en code + + Knippen - - Projectmanager/producent + + Navigeren - - Rest van Mojang + + Opnieuw installeren - - Hoofdprogrammeur Minecraft PC + + Opties - - Ninja-code + + Opdracht uitvoeren - - CEO + + Volledige versie installeren - - Witteboordenwerker + + Testversie installeren - - Klantenservice + + Installeren - - Kantoor-dj + + Eruit - - Ontwerper/programmeur Minecraft - Pocket Edition + + Lijst online games verversen - - Ontwikkelaar + + Party-games - - Hoofd-architect + + Alle games - - Ontwikkeling grafisch ontwerp + + Afsluiten - - Game-crafter + + Annuleren - - Directeur lolfactor + + Meedoen annuleren - - Muziek en geluid + + Andere groep - - Programmering + + Produceren - - Grafisch ontwerp + + Maken - - Kwaliteitscontrole + + Pakken/plaatsen - - Uitvoerend producent + + Inventaris tonen - - Hoofdproducent + + Beschrijving tonen - - Producent + + Ingrediënten tonen - - Testleider + + Terug - - Hoofdtester + + Denk eraan: - - Ontwerpteam + + - - Ontwikkelteam + + In de laatste versie van de game zijn er nieuwe functies toegevoegd, waaronder nieuwe gebieden in de oefenwereld. - - Release-management + + Je hebt niet alle benodigde ingrediënten voor dit voorwerp. Het venster linksonder geeft aan welke ingrediënten je nodig hebt om dit voorwerp te produceren. - - Directeur XBLA Publishing + + + Gefeliciteerd, je hebt de speluitleg voltooid. De tijd in de game verloopt nu normaal. Het duurt niet lang meer totdat het nacht wordt en de monsters tevoorschijn komen! Maak dus snel je schuilplaats af! + - - Zakelijke ontwikkeling + + {*EXIT_PICTURE*} Als je klaar bent om meer te ontdekken, ga je de trap op bij de verlaten mijnwerkersschuilplaats. Deze leidt naar een klein kasteel. - - Directeur Portfolio + + {*B*}Druk op{*CONTROLLER_VK_A*} om de speluitleg te spelen.{*B*} + Druk op{*CONTROLLER_VK_B*} om de speluitleg over te slaan. - - Productmanager + + + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over de voedselbalk en eten.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de voedselbalk en eten. + - - Marketing + + Selecteren - - Community-manager + + Gebruiken - - Lokalisatieteam Europa + + In dit gebied vind je omgevingen waar je uitleg krijgt over vissen, boten, zuigers en roodsteen. - - Lokalisatieteam Redmond + + Buiten dit gebied vind je voorbeelden van gebouwen, landbouwgrond, mijnwagens en rails, betoveringen, drankjes, handelaren, smidsen en nog veel meer! - - Lokalisatieteam Azië + + + Je voedselbalk is nu zo leeg dat je gezondheid niet langer automatisch wordt hersteld. + - - Gebruikersresearchteam + + Pakken - - MGS Central Teams + + Volgende - - Tester milestone-goedkeuring + + Vorige - - Speciale dank + + Speler verwijderen - - Testmanager + + Vriendverzoek versturen - - Senior testleider + + Pagina omlaag - - SDET + + Pagina omhoog - - Project-STE + + Verven - - Extra STE + + Genezen - - Testpartners + + Zitten - - Jon Kågström + + Volg mij - - Tobias Möllstam + + Uitgraven - - Risë Lugo + + Voeden - - Houten zwaard + + Temmen - - Stenen zwaard + + Ander filter - - IJzeren zwaard + + Alles plaatsen - - Diamanten zwaard + + Eén plaatsen - - Gouden zwaard + + Laten vallen - - Houten schop + + Alles pakken - - Stenen schop + + De helft pakken - - IJzeren schop + + Plaatsen - - Diamanten schop + + Alles laten vallen - - Gouden schop + + Werkbalk leegmaken - - Houten houweel + + Wat is dit? - - Stenen houweel + + Delen op Facebook - - IJzeren houweel + + Eén laten vallen - - Diamanten houweel + + Verwisselen - - Gouden houweel + + Snel plaatsen - - Houten bijl + + Skinpakketten - - Stenen bijl + + Rood raam - - IJzeren bijl + + Groen raam - - Diamanten bijl + + Bruin raam - - Gouden bijl + + Wit glas - - Houten schoffel + + Gekleurd raam - - Stenen schoffel + + Zwart raam - - IJzeren schoffel + + Blauw raam - - Diamanten schoffel + + Grijs raam - - Gouden schoffel + + Roze raam - - Houten deur + + Lichtgroen raam - - IJzeren deur + + Paars raam - - Maliënhelm + + Cyaanblauw raam - - Maliënborstplaat + + Lichtgrijs raam - - Maliënbeenbeschermers + + Oranje glas - - Maliënlaarzen + + Blauw glas - - Leren kap + + Paars glas - - IJzeren helm + + Cyaanblauw glas - - Diamanten helm + + Rood glas - - Gouden helm + + Groen glas - - Leren tuniek + + Bruin glas - - IJzeren borstplaat + + Lichtgrijs glas - - Diamanten borstplaat + + Geel glas - - Gouden borstplaat + + Lichtblauw glas - - Leren broek + + Magenta glas - - IJzeren beenbeschermers + + Grijs glas - - Diamanten beenbeschermers + + Roze glas - - Gouden beenbeschermers + + Lichtgroen glas - - Leren laarzen + + Geel raam - - IJzeren laarzen + + Lichtgrijs - - Diamanten laarzen + + Grijs - - Gouden laarzen + + Roze - - IJzerstaaf + + Blauw - - Goudstaaf + + Paars - - Emmer + + Cyaankleurig - - Emmer water + + Lichtgroen - - Emmer lava + + Oranje - - Aansteker + + Wit - - Appel + + Aangepast - - Boog + + Geel - - Pijl + + Lichtblauw - - Steenkool + + Magenta - - Houtskool + + Bruin - - Diamant + + Wit raam - - Stok + + Kleine bal - - Kom + + Grote bal - - Paddenstoelenstoofpot + + Lichtblauw raam - - Draad + + Magenta raam - - Veer + + Oranje raam - - Buskruit + + Stervormig - - Tarwezaden + + Zwart - - Tarwe + + Rood - - Brood + + Groen - - Vuursteen + + Creeper-vormig - - Rauw varkensvlees + + Ontploffing - - Gebraden varkensvlees + + Onbekende vorm - - Schilderij + + Zwart glas - - Gouden appel + + IJzeren paardenharnas - - Bord + + Gouden paardenharnas - - Mijnwagen + + Diamanten paardenharnas - - Zadel + + Roodsteenvergelijker - - Roodsteen + + Mijnwagen met TNT - - Sneeuwbal + + Mijnwagen met hopper - - Boot + + Riem - - Leer + + Baken - - Emmer melk + + Opgeladen kist - - Baksteen + + Verzwaarde drukplaat (licht) - - Klei + + Naamplaatje - - Suikerriet + + Houten planken (elk type) - - Papier + + Opdrachtblok - - Boek + + Vuurwerk-ster - - Slijmbal + + Deze dieren kun je temmen en vervolgens berijden. Je kunt er een kist aan bevestigen. - - Mijnwagen met kist + + Muilezel - - Mijnwagen met oven + + Worden geboren als een paard en een ezel paren. Deze dieren kun je temmen en vervolgens berijden. Ook kunnen ze kisten dragen. - - Ei + + Paard - - Kompas + + Deze dieren kun je temmen en vervolgens berijden. - - Hengel + + Ezel - - Klok + + Zombiepaard - - Gloeisteenstof + + Lege kaart - - Rauwe vis + + Onderwereld-ster - - Gebakken vis + + Vuurpijl - - Kleurstof + + Skeletpaard - - Inktzak + + Wither - - Rozenrood + + Deze worden gemaakt van Wither-schedels en drijfzand. Ze schieten exploderende schedels op je af. - - Cactusgroen + + Verzwaarde drukplaat (zwaar) - - Cacaobonen + + Lichtgrijze klei - - Lapis lazuli + + Grijze klei - - Paarse kleurstof + + Roze klei - - Cyaan-kleurstof + + Blauwe klei - - Lichtgrijze kleurstof + + Paarse klei - - Grijze kleurstof + + Cyaanblauwe klei - - Roze kleurstof + + Lichtgroene klei - - Lichtgroene kleurstof + + Oranje klei - - Paardenbloemgeel + + Witte klei - - Lichtblauwe kleurstof + + Gekleurd glas - - Magenta kleurstof + + Gele klei - - Oranje kleurstof + + Lichtblauwe klei - - Bottenmeel + + Magenta klei - - Bot + + Bruine klei - - Suiker + + Hopper - - Taart + + Activeringsrails - - Bed + + Dropper - - Roodsteenversterker + + Roodsteenvergelijker - - Koekje + + Daglichtsensor - - Kaart + + Roodsteenblok - - Muziekplaat - '13' + + Gekleurde klei - - Muziekplaat - 'Cat' + + Zwarte klei - - Muziekplaat - 'Blocks' + + Rode klei - - Muziekplaat - 'Chirp' + + Groene klei - - Muziekplaat - 'Far' + + Hooibaal - - Muziekplaat - 'Mall' + + Geharde klei - - Muziekplaat - 'Mellohi' + + Steenkoolblok - - Muziekplaat - 'Stal' + + Vervagen tot - - Muziekplaat - 'Strad' + + Als deze optie is uitgeschakeld, hebben monsters en dieren geen invloed op blokken (zo worden blokken niet vernietigd door ontploffende Creepers en verwijderen schapen geen gras) en kunnen ze geen voorwerpen oppakken. - - Muziekplaat - 'Ward' + + Als deze optie is ingeschakeld, behouden spelers hun inventaris als ze doodgaan. - - Muziekplaat - '11' + + Als deze optie is uitgeschakeld, spawnen mobs niet automatisch. - - Muziekplaat - 'Where are we now' + + Speltype: Avontuur - - Schaar + + Avontuur - - Pompoenzaden + + Voer een basis in om hetzelfde terrein nogmaals te genereren. Laat leeg voor een willekeurige wereld. - - Meloenzaden + + Als deze optie is uitgeschakeld, laten monsters en dieren geen buit achter (Creepers laten bijvoorbeeld geen buskruit achter). - - Rauwe kip + + {*PLAYER*} viel van een ladder - - Gebraden kip + + {*PLAYER*} is van klimplanten gevallen - - Rauw rundvlees + + {*PLAYER*} viel uit het water - - Biefstuk + + Als deze optie is uitgeschakeld, laten blokken geen voorwerpen achter als ze worden vernietigd (stenen blokken laten bijvoorbeeld geen keien achter). - - Bedorven vlees + + Als deze optie is uitgeschakeld, wordt de gezondheid van spelers niet vanzelf hersteld. - - Einder-parel + + Als deze optie is uitgeschakeld, zijn er geen wisselende dagdelen. - - Stuk meloen + + Mijnwagen - - Blaze-staf + + Vastmaken - - Ghast-traan + + Loslaten - - Goudklomp + + Bevestigen - - Onderwereld-wrat + + Afstijgen - - {*splash*}{*prefix*}Drankje {*postfix*} + + Kist bevestigen - - Glazen fles + + Lanceren - - Fles water + + Naam - - Spinnenoog + + Baken - - Gegist spinnenoog + + Primaire kracht - - Blaze-poeder + + Secundaire kracht - - Magmacrème + + Paard - - Brouwrek + + Dropper - - Ketel + + Hopper - - Einder-oog + + {*PLAYER*} viel van grote hoogte - - Glinsterende meloen + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal vleermuizen in deze wereld. - - Priesterfles + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende paarden. - - Vuurbal + + Game-opties - - Vuurbal (houtskool) + + {*PLAYER*} werd gedood door een vuurbal van {*SOURCE*} met een {*ITEM*} - - Vuurbal (steenkool) + + {*PLAYER*} is doodgeslagen door {*SOURCE*} met een {*ITEM*} - - Voorwerplijst + + {*PLAYER*} is gedood door {*SOURCE*} met een {*ITEM*} - - {*CREATURE*} spawnen + + Omgevingsinvloed mobs - - Onderwereld-steen + + Voorwerpen van blokken - - Schedel + + Automatische regeneratie - - Schedel skelet + + Daglichtcyclus - - Schedel Onderwereld-skelet + + Inventaris behouden - - Zombiehoofd + + Spawnen van mobs - - Hoofd + + Buit van mobs - - Hoofd van %s + + {*PLAYER*} is doodgeschoten door {*SOURCE*} met een {*ITEM*} - - Creeper-hoofd + + {*PLAYER*} viel te diep en werd gedood door {*SOURCE*} - - Steen + + {*PLAYER*} viel te diep en werd gedood door {*SOURCE*} met een {*ITEM*} - - Grasblok + + {*PLAYER*} kwam in vuur terecht tijdens het gevecht tegen {*SOURCE*} - - Aarde + + {*SOURCE*} liet {*PLAYER*} vallen - - Kei + + {*SOURCE*} liet {*PLAYER*} vallen - - Eikenhouten planken + + {*SOURCE*} heeft {*PLAYER*} laten vallen door een {*ITEM*} - - Sparrenhouten planken + + {*PLAYER*} verbrandde tijdens het gevecht tegen {*SOURCE*} - - Berkenhouten planken + + {*PLAYER*} is opgeblazen door {*SOURCE*} - - Tropenhouten planken + + {*PLAYER*} is gedood door de Wither - - Jong boompje + + {*PLAYER*} is gedood door {*SOURCE*} met een {*ITEM*} - - Jonge eik + + {*PLAYER*} probeerde in lava te zwemmen om te ontsnappen aan {*SOURCE*} - - Jonge spar + + {*PLAYER*} verdronk in een poging om te ontsnappen aan {*SOURCE*} - - Jonge berk + + {*PLAYER*} liep tegen een cactus aan in een poging om te ontsnappen aan {*SOURCE*} - - Jonge tropische boom + + Bestijgen - - Grondsteen + + +Om een paard te besturen, moet je het uitrusten met een zadel. Dit kun je kopen van dorpelingen of vinden in verborgen kisten. - - Water + + +Je kunt tamme ezels en muilezels zadeltassen geven door er kisten aan te bevestigen. Je kunt deze zadeltassen openen tijdens het rijden of door te sluipen. - - Lava + + +Paarden en ezels (maar niet muilezels) kunnen net als andere dieren worden gefokt met gouden appels of gouden wortels. Veulens groeien na verloop van tijd op tot volwassen paarden. Dit gaat sneller als je ze tarwe of hooi voert. - - Zand + + +Paarden, ezels en muilezels moeten worden getemd voordat je ze kunt gebruiken. Je temt ze door op ze te klimmen, waarna ze proberen om je van hun rug te gooien. - - Zandsteen + + +Als ze zijn getemd, verschijnen er hartjes om hen heen en zullen ze niet langer proberen om je van hun rug te gooien. - - Grind + + +Probeer eens op dit paard te rijden. Zorg ervoor dat je geen voorwerpen of gereedschap in je hand hebt en gebruik dan {*CONTROLLER_ACTION_USE*}. - - Gouderts + + +Hier kun je proberen om paarden en ezels te temmen. Ook vind je er kisten met zadels, paardenharnassen en andere handige voorwerpen voor paarden. - - IJzererts + + +Als je een baken op een piramide met minimaal vier verdiepingen zet, kun je ook de secundaire kracht Regeneratie kiezen of een sterkere primaire kracht gebruiken. - - Steenkoolerts + + +Om de krachten van je baken in te stellen, moet je één smaragd, diamant, goud of ijzerstaaf in het betalingsvakje plaatsen. Daarna worden de krachten constant door het baken afgegeven. - - Hout + + Op de top van deze piramide vind je een inactief baken. - - Eikenhout + + +Dit is de baken-interface, waar je de krachten kiest die je baken afgeeft. - - Sparrenhout + + +{*B*}Druk op{*CONTROLLER_VK_A*} om door te gaan. +{*B*}Druk op {*CONTROLLER_VK_B*} als je al weet hoe je de baken-interface moet gebruiken. - - Berkenhout + + +In het menu van het baken kun je één primaire kracht kiezen voor je baken. Het aantal krachten waaruit je kunt kiezen, is afhankelijk van het aantal verdiepingen van je piramide. - - Tropisch hout + + +Je kunt rijden op alle volwassen paarden, ezels en muilezels. Alleen paarden kunnen worden bepantserd en alleen muilezels en ezels kunnen zadeltassen dragen voor het vervoeren van voorwerpen. - - Eik + + +Dit is de inventaris-interface van het paard. - - Spar + + +{*B*}Druk op{*CONTROLLER_VK_A*} om door te gaan. +{*B*}Druk op {*CONTROLLER_VK_B*} als je al weet hoe je de inventaris van het paard moet gebruiken. - - Berk + + +In de inventaris van het paard kun je voorwerpen geven aan je paard, ezel of muilezel, of ze hiermee uitrusten. - - Bladeren + + Fonkeling - - Eikenbladeren + + Spoor - - Sparrenbladeren + + Duur vlucht: - - Berkenbladeren + + +Zadel je paard op door een zadel in het zadelvakje te plaatsen. Je kunt paarden bepantseren door een paardenharnas te plaatsen in het pantservakje. - - Tropische bladeren + + Je hebt een muilezel gevonden. - - Spons + + + {*B*}Druk op {*CONTROLLER_VK_A*} voor meer informatie over paarden, ezels en muilezels. + {*B*}Druk op {*CONTROLLER_VK_B*} als je al genoeg weet over paarden, ezels en muilezels. - - Glas + + +Je vindt paarden en ezels vooral in open vlakten. Muilezels fok je door een ezel en een paard te laten paren, maar zelf zijn ze onvruchtbaar. - - Wol + + +Je kunt in dit menu ook voorwerpen uitwisselen tussen je eigen inventaris en de zadeltassen die zijn bevestigd aan ezels en muilezels. - - Zwarte wol + + Je hebt een paard gevonden. - - Rode wol + + Je hebt een ezel gevonden. - - Groene wol + + + {*B*}Druk op {*CONTROLLER_VK_A*} voor meer informatie over bakens. + {*B*}Druk op {*CONTROLLER_VK_B*} als je al genoeg weet over bakens. - - Bruine wol + + +Je produceert vuurwerk-sterren door buskruit en kleurstof in het productieraster te plaatsen. - - Blauwe wol + + +De kleurstof bepaalt de kleur van de exploderende vuurwerk-ster. - - Paarse wol + + Je bepaalt de vorm van de vuurwerk-ster door er een vuurbal, goudklomp, veer of mobhoofd aan toe te voegen. - - Cyaankleurige wol + + +Eventueel kun je meerdere vuurwerk-sterren in het productieraster toevoegen aan je vuurwerk. - - Lichtgrijze wol + + +Hoe meer vakjes je in het productieraster vult met buskruit, des te hoger zullen de vuurwerk-sterren exploderen. - - Grijze wol + + Haal het vuurwerk uit het resultaatvakje als je het wilt produceren. - - Roze wol + + +Je kunt een spoor of een fonkeling toevoegen door diamanten of gloeisteenstof te gebruiken. - - Lichtgroene wol + + +Vuurwerk is een decoratief voorwerp dat je vanuit de hand of een automaat kunt lanceren. Je produceert het met papier, buskruit en eventueel een aantal vuurwerk-sterren. - - Gele wol + + +Kleuren, uitdoving, vorm, grootte en effecten (zoals sporen en fonkelingen) van vuurwerk-sterren kun je tijdens de productie aanpassen door er extra ingrediënten aan toe te voegen. - - Lichtblauwe wol + + +Maak eens wat vuurwerk bij de werkbank met de ingrediënten die je vindt in de kisten. - - Magenta wol + + +Nadat je een vuurwerk-ster hebt geproduceerd, kun je de uitdovingskleur bepalen door er kleurstof aan toe te voegen. - - Oranje wol + + +In deze kisten vind je verschillende voorwerpen die je nodig hebt om VUURWERK te maken! - - Witte wol + + + {*B*}Druk op {*CONTROLLER_VK_A*} voor meer informatie over vuurwerk. + {*B*}Druk op {*CONTROLLER_VK_B*} als je al genoeg weet over vuurwerk. - - Bloem + + +Om vuurwerk te produceren, plaats je buskruit en papier in het productieraster van 3x3 boven je inventaris. - - Roos + + In deze ruimte vind je hoppers - - Paddenstoel + + + {*B*}Druk op {*CONTROLLER_VK_A*} voor meer informatie over hoppers. + {*B*}Druk op {*CONTROLLER_VK_B*} als je al genoeg weet over hoppers. - - Goudblok + + Hoppers worden gebruikt om voorwerpen in en uit containers te plaatsen en om voorwerpen die er naartoe worden gegooid automatisch op te vangen. - - Een compacte manier om goud op te slaan. + + +Actieve bakens projecteren een felle lichtstraal in de lucht en geven krachten aan spelers in de buurt. Je maakt ze van glas, obsidiaan en Onderwereld-sterren, die je krijgt door de Wither te verslaan. - - IJzerblok + + +Je moet de bakens zo plaatsen dat ze overdag in het zonlicht staan. Plaats de bakens op piramiden van ijzer, goud, smaragd of diamant. Het materiaal waarop het baken wordt geplaatst heeft echter geen effect op de kracht van het baken. - - Een compacte manier om ijzer op te slaan. + + +Stel het baken nu in met de krachten die hij moet afgeven. Je kunt betalen met de ijzerstaven. - - Steenplaat + + +Ze kunnen worden gebruikt met brouwrekken, kisten, automaten, droppers, mijnwagens met kisten, mijnwagens met hoppers en andere hoppers. - - Steenplaat + + +In deze ruimte vind je diverse handige hopper-configuraties waarmee je kunt experimenteren. - - Zandsteenplaat + + +Dit is de vuurwerk-interface, waarmee je vuurwerk en vuurwerk-sterren kunt produceren. - - Eikenhouten plaat + + +{*B*}Druk op{*CONTROLLER_VK_A*} om door te gaan. +{*B*}Druk op {*CONTROLLER_VK_B*} als je al weet hoe je de vuurwerk-interface moet gebruiken. - - Keiplaat + + Hoppers zuigen voortdurend voorwerpen uit een geschikte container die erboven is geplaatst. Ze proberen ook in de hopper opgeslagen voorwerpen in een andere container te plaatsen. - - Baksteenplaat + + +Als een hopper echter wordt aangedreven door roodsteen, wordt hij inactief en zal hij niet langer voorwerpen opzuigen of plaatsen. - - Bloksteenplaat + + +Een hopper wijst in de richting waarin het voorwerpen probeert te transporteren. Om een hopper op een bepaald blok te laten richten, plaats je de hopper al sluipend tegen het gewenste blok. - - Eikenhouten plaat + + Je komt deze vijanden tegen in moerassen en ze vallen je aan door drankjes naar je te gooien. Als ze worden gedood, laten ze de drankjes achter. - - Sparrenhouten plaat + + Je hebt al het maximale aantal schilderijen/voorwerplijsten in deze wereld. - - Berkenhouten plaat + + Je kunt geen vijanden spawnen als je speelt op het niveaus Vredig. - - Tropenhouten plaat + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende varkens, schapen, koeien, katten en paarden. - - Onderwereld-steenplaat + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal inktvissen in deze wereld. - - Bakstenen + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal vijanden in deze wereld. - - TNT + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal dorpelingen in deze wereld. - - Boekenplank + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende wolven. - - Mossige steen + + Je hebt al het maximale aantal mobhoofden in deze wereld. - - Obsidiaan + + Kijken omkeren - - Fakkel + + Linkshandig - - Fakkel (steenkool) + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende kippen. - - Fakkel (houtskool) + + Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende zwamkoeien. - - Vuur + + Je hebt al het maximale aantal boten in deze wereld. - - Monsterkooi + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal kippen in deze wereld. - - Eikenhouten trap + + +{*C2*}Haal even diep adem. En nog eens. Voel de zuurstof in je longen. Voel je ledematen weer. Ja, beweeg je vingers. Je hebt weer een lichaam, op vaste grond en in de lucht. Keer terug naar de lange droom. Goed zo. Je lichaam raakt het universum weer aan, alsof jullie losstaan van elkaar. Alsof wij losstaan van elkaar.{*EF*}{*B*}{*B*} +{*C3*}Wie wij zijn? Ooit noemde men ons de geest van de berg. Vader zon, moeder maan. Oeroude geesten, dierlijke geesten. Jinn. Geesten. De groene mens. Toen goden, demonen. Engelen. Klopgeesten. Aliens, buitenaardse wezens. Leptonen, quarks. De woorden veranderen. Maar wij niet.{*EF*}{*B*}{*B*} +{*C2*}Wij zijn het universum. Wij zijn alles waarvan je denkt dat buiten jou staat. Je kijkt nu naar ons, met je huid en je ogen. En waarom raakt het universum je huid aan en schijnt het je bij? Om jou te kunnen zien, speler. Om je te leren kennen. En om ons bekend te maken. Ik zal je een verhaal vertellen.{*EF*}{*B*}{*B*} +{*C2*}Er was eens een speler, een wezen.{*EF*}{*B*}{*B*} +{*C3*}Dat wezen was jij, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Soms dacht het wezen dat het een mens was, op de dunne korst van een ronddraaiende bol van gesmolten steen. De bol van gesmolten steen draaide rond een bol van brandend gas die 330.000 keer zo groot was. Ze lagen zo ver van elkaar af, dat licht er acht minuten over deed om van de ene bol de andere te bereiken. Het licht was informatie van een ster die je huid kon verbranden op 150 miljoen kilometer afstand.{*EF*}{*B*}{*B*} +{*C2*}Soms droomde het wezen dat het een mijnwerker was, op een vlakke en oneindige wereld. De zon was een wit vierkant. De dagen waren kort, want er was veel te doen. En doodgaan was niet meer dan een tijdelijk ongemak.{*EF*}{*B*}{*B*} +{*C3*}In zijn dromen verdwaalde het wezen soms in een verhaal.{*EF*}{*B*}{*B*} +{*C2*}In zijn dromen was het wezen soms iets anders, ergens anders. Soms waren deze dromen verontrustend. Soms waren ze ook heel mooi. Soms ging de droom van het wezen over in een andere droom, en daarna weer in een andere.{*EF*}{*B*}{*B*} +{*C3*}Soms droomde het wezen dat het naar woorden keek op een scherm.{*EF*}{*B*}{*B*} +{*C2*}Kom, we gaan terug.{*EF*}{*B*}{*B*} +{*C2*}De atomen van de speler lagen overal: op het gras, in de rivieren, in de lucht en op de grond. Een vrouw verzamelde de atomen. Ze dronk ervan, at ze en ademde ze in. En in het lichaam van de vrouw werd de speler, het wezen, gevormd.{*EF*}{*B*}{*B*} +{*C2*}En het wezen kwam vanuit het warme, donkere lichaam van zijn moeder terecht in een lange droom.{*EF*}{*B*}{*B*} +{*C2*}En het wezen was een nieuw verhaal dat nog nooit was verteld, geschreven in letters van dna. En het wezen was een nieuw programma dat nog nooit was gestart, gegenereerd door een broncode die een miljard jaar oud was. En het wezen was een nieuwe mens die nog nooit had geleefd, gemaakt van alleen wat melk en liefde.{*EF*}{*B*}{*B*} +{*C3*}Jij bent dat wezen. Jij bent die speler. Het verhaal. Het programma. De mens. Gemaakt van alleen wat melk en liefde.{*EF*}{*B*}{*B*} +{*C2*}We gaan nog verder terug.{*EF*}{*B*}{*B*} +{*C2*}De zeven miljard miljard miljard atomen in het lichaam van het wezen ontstonden in de kern van een ster, lang voordat dit spel bestond. Het wezen is dus ook informatie van een ster. En het wezen doorloopt het verhaal, in een bos vol informatie dat is aangeplant door ene Julian, op een vlakke en oneindige wereld die is gecreëerd door ene Markus in de eigen kleine wereld van het wezen, dat leeft in een universum dat is gemaakt door...{*EF*}{*B*}{*B*} +{*C3*}Ssst... Soms maakte het wezen een eigen kleine wereld die zacht en warm en eenvoudig was. En die soms hard en koud en complex was. Soms bouwde het wezen een model van het universum in zijn hoofd - energiedeeltjes die zich verplaatsten door uitgestrekte lege ruimten. Soms noemde het deze deeltjes 'elektronen' en 'protonen'.{*EF*}{*B*}{*B*} - - Kist + + +{*C2*}Soms noemde het wezen ze 'planeten' en 'sterren'.{*EF*}{*B*}{*B*} +{*C2*}Soms dacht het dat het in een universum leefde dat bestond uit energie die aan en uit kon. Nullen en enen. Regels code. Soms dacht het wezen dat het een spel speelde. Soms dacht het dat het woorden op een scherm las.{*EF*}{*B*}{*B*} +{*C3*}Jij bent het wezen, de speler, jij leest de woorden...{*EF*}{*B*}{*B*} +{*C2*}Ssst... Soms las het wezen regels code op een scherm. Daar maakte het woorden van, en aan die woorden gaf het een betekenis, en die betekenis vertaalde het naar gevoelens, emoties, theorieën en ideeën - en het wezen ging sneller en dieper ademen en realiseerde zich dat het leefde, dat die duizend doden niet echt waren - de speler leefde.{*EF*}{*B*}{*B*} +{*C3*}Jij. Jij. Jij leeft.{*EF*}{*B*}{*B*} +{*C2*}en soms dacht het wezen dat het universum met hem sprak via het zonlicht dat op hem viel door de ruisende bladeren van loofbomen{*EF*}{*B*}{*B*} +{*C3*}en soms dacht het wezen dat het universum met hem sprak via het licht dat uit de hemel viel tijdens heldere winternachten, waarbij een lichtvlekje in de hoek van het oog van het wezen misschien wel een ster was die een miljoen keer zo groot was als de zon en die zijn planeten omsmolt tot plasma zodat hij voor even zichtbaar was voor het wezen dat aan de andere kant van het universum naar huis wandelde en plotseling voedsel rook, dicht bij de vertrouwde deur, klaar om weer te gaan dromen{*EF*}{*B*}{*B*} +{*C2*}en soms dacht het wezen dat het universum met hem sprak via de nullen en enen, via de elektriciteit in de wereld, via de voorbij rollende woorden op een scherm aan het einde van een droom.{*EF*}{*B*}{*B*} +{*C3*}En het universum zei: 'Ik hou van je'{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat je het spel goed had gespeeld{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat alles wat je nodig hebt in jezelf zit{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat je sterker bent dan je weet{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat jij het daglicht bent{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat jij de nacht bent{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat de duisternis waartegen je vecht in jezelf zit{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat het licht dat je zoekt in jezelf zit{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat je niet alleen bent{*EF*}{*B*}{*B*} +{*C2*}en het universum zei dat je bent verbonden met alle andere dingen{*EF*}{*B*}{*B*} +{*C3*}en het universum zei dat je het universum bent dat van zichzelf proeft, met zichzelf praat en zijn eigen code leest{*EF*}{*B*}{*B*} +{*C2*}en het universum zei: 'Ik hou van je, omdat jij de liefde bent'{*EF*}{*B*}{*B*} +{*C3*}En het spel was voorbij en de speler ontwaakte uit de droom. En de speler ging opnieuw dromen. En de speler droomde opnieuw en droomde beter. En de speler was het universum. En de speler was de liefde.{*EF*}{*B*}{*B*} +{*C3*}Jij bent de speler.{*EF*}{*B*}{*B*} +{*C2*}Ontwaak.{*EF*} - - Roodsteenstof + + Onderwereld resetten - - Diamanterts + + %s is nu in het Einde - - Diamantblok + + %s heeft het Einde verlaten - - Een compacte manier om diamanten op te slaan. + + +{*C3*}Ik zie de speler die je bedoelde.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Ja. Pas op. Dit wezen heeft nu een hoger niveau. Het kan onze gedachten lezen.{*EF*}{*B*}{*B*} +{*C2*}Maakt niet uit. Het wezen denkt dat we bij het spel horen.{*EF*}{*B*}{*B*} +{*C3*}Dit wezen was leuk. Het was een goede speler. Het gaf niet op.{*EF*}{*B*}{*B*} +{*C2*}Het leest onze gedachten alsof het woorden zijn die op het scherm staan.{*EF*}{*B*}{*B*} +{*C3*}Het verkiest de droomwereld van het spel om zich over te geven aan zijn verbeelding.{*EF*}{*B*}{*B*} +{*C2*}Woorden vormen de ideale toegang tot die wereld. Ze zijn flexibel. En minder angstaanjagend dan de werkelijkheid achter het scherm.{*EF*}{*B*}{*B*} +{*C3*}Ooit hoorden ze stemmen. Voordat spelers konden lezen. Dat was vroeger, toen iedereen die niet meespeelde de spelers heksen of tovenaars noemde. En spelers droomden dat ze konden vliegen, op stokken die waren betoverd door demonen.{*EF*}{*B*}{*B*} +{*C2*}Wat droomde deze speler?{*EF*}{*B*}{*B*} +{*C3*}Dit wezen droomde over zonlicht en bomen. Over vuur en water. Het droomde dat het iets creëerde. En dat het iets vernietigde. Dat het jaagde en zelf werd opgejaagd. Het droomde over een schuilplaats.{*EF*}{*B*}{*B*} +{*C2*}Ah... de oorspronkelijke toegang. Een miljoen jaar oud en hij werkt nog steeds. Maar wat creëerde dit wezen nou echt, in die werkelijkheid achter het scherm?{*EF*}{*B*}{*B*} +{*C3*}Samen met miljoenen anderen bouwde het aan een waarachtige wereld in de plooien van de {*EF*}{*NOISE*}{*C3*} en maakte het een {*EF*}{*NOISE*}{*C3*} voor {*EF*}{*NOISE*}{*C3*} in de {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Het wezen kan nog niet alles lezen.{*EF*}{*B*}{*B*} +{*C3*}Nee. Het heeft het hoogste niveau nog niet bereikt. Dat kan alleen in de lange droom van het leven en niet in de korte droom van het spel.{*EF*}{*B*}{*B*} +{*C2*}Weet het wezen van onze liefde? Dat het universum het beste met hem voor heeft?{*EF*}{*B*}{*B*} +{*C3*}Soms hoort het wezen het universum, als gedachten afwezig zijn.{*EF*}{*B*}{*B*} +{*C2*}Maar soms is het verdrietig in de lange droom. Dan maakt het werelden zonder zomers, huivert het onder de duistere zon en denkt het dat zijn trieste creatie de werkelijkheid is.{*EF*}{*B*}{*B*} +{*C3*}Maar de wereld kan niet zonder verdriet. Het verdriet is verbonden met zijn eigen rol. Dat mogen we niet veranderen.{*EF*}{*B*}{*B*} +{*C2*}Soms, als ze in diepe slaap zijn, wil ik het hen vertellen. Ik wil hen vertellen dat ze waarachtige werelden bouwen in de werkelijkheid. Soms wil ik hen vertellen hoe belangrijk ze zijn voor het universum. Soms, als ze de verbondenheid al een tijdje niet meer hebben gevoeld, wil ik hen helpen met het uitspreken van het woord dat ze zo vrezen.{*EF*}{*B*}{*B*} +{*C3*}Het leest onze gedachten.{*EF*}{*B*}{*B*} +{*C2*}Soms laat het me koud. Soms wil ik hen vertellen dat de wereld die hun realiteit is niet meer is dan {*EF*}{*NOISE*}{*C2*} en {*EF*}{*NOISE*}{*C2*}. Dan wil ik hen vertellen dat ze {*EF*}{*NOISE*}{*C2*} in de {*EF*}{*NOISE*}{*C2*} zijn. Ze zien zo weinig van de realiteit in hun lange droom.{*EF*}{*B*}{*B*} +{*C3*}En toch spelen ze het spel.{*EF*}{*B*}{*B*} +{*C2*}Maar het zou zo gemakkelijk zijn om het hen te vertellen...{*EF*}{*B*}{*B*} +{*C3*}Te krachtig voor deze droom. Door hen te vertellen hoe ze moeten leven kunnen ze niet meer leven.{*EF*}{*B*}{*B*} +{*C2*}Ik vertel het wezen niet hoe het moet leven.{*EF*}{*B*}{*B*} +{*C3*}Het wezen wordt rusteloos.{*EF*}{*B*}{*B*} +{*C2*}Ik zal het een verhaal vertellen.{*EF*}{*B*}{*B*} +{*C3*}Maar niet de waarheid.{*EF*}{*B*}{*B*} +{*C2*}Nee. Een verhaal dat de waarheid veilig opsluit, in een kooi vol woorden. Niet de allesvernietigende waarheid.{*EF*}{*B*}{*B*} +{*C3*}Geef het weer een lichaam.{*EF*}{*B*}{*B*} +{*C2*}Ja. Wezen, speler...{*EF*}{*B*}{*B*} +{*C3*}Noem het wezen bij naam.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Speler van spellen.{*EF*}{*B*}{*B*} +{*C3*}Goed.{*EF*}{*B*}{*B*} - - Werkbank + + Weet je zeker dat je de Onderwereld in dit opslagbestand wilt terugzetten naar de standaardsituatie? Je verliest dan alles wat je hebt gebouwd in de Onderwereld! - - Gewassen + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal varkens, schapen, koeien, katten en paarden. - - Akker + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal zwamkoeien. - - Oven + + Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal wolven in deze wereld. - - Bord + + Onderwereld resetten - - Houten deur + + Onderwereld niet resetten - - Ladder + + Je kunt deze zwamkoe nu niet scheren. Je hebt al het maximale aantal varkens, schapen, koeien, katten en paarden. - - Rails + + Je bent dood! - - Aangedreven rails + + Wereldopties - - Detectierails + + Kan bouwen en uitgraven - - Stenen trap + + Kan deuren en schakelaars gebruiken - - Hendel + + Bouwwerken genereren - - Drukplaat + + Supervlakke wereld - - IJzeren deur + + Bonuskist - - Roodsteenerts + + Kan containers openen - - Roodsteenfakkel + + Speler verwijderen - - Toets + + Kan vliegen - - Sneeuw + + Uitputting uitschakelen - - IJs + + Kan spelers aanvallen - - Cactus + + Kan dieren aanvallen - - Klei + + Moderator - - Suikerriet + + Privileges host - - Jukebox + + Instructies - - Hek + + Besturing - - Pompoen + + Instellingen - - Pompoenlampion + + Terugkeren - - Onderwereld-blok + + Beschikbare downloadbare content - - Drijfzand + + Andere skin - - Gloeisteen + + Credits - - Portaal + + TNT-explosies - - Lapis lazuli-erts + + Speler tegen speler - - Lapis lazuli-blok + + Spelers vertrouwen - - Een compacte manier om lapis lazuli op te slaan. + + Content opnieuw installeren - - Automaat + + Debug-instellingen - - Nootblok + + Overslaande branden - - Taart + + Einder-draak - - Bed + + {*PLAYER*} werd gedood door de adem van de Einder-draak - - Web + + {*PLAYER*} werd gedood door {*SOURCE*} - - Hoog gras + + {*PLAYER*} werd gedood door {*SOURCE*} - - Verdorde struik + + {*PLAYER*} is dood - - Diode + + {*PLAYER*} werd opgeblazen - - Afgesloten kist + + {*PLAYER*} werd gedood door magische krachten - - Valluik + + {*PLAYER*} is doodgeschoten door {*SOURCE*} - - Wol (elke kleur) + + Grondsteenmist - - Zuiger + + Scherminfo weergeven - - Plakzuiger + + Hand weergeven - - Zilvervisblok + + {*PLAYER*} werd gedood door een vuurbal van {*SOURCE*} - - Blokstenen + + {*PLAYER*} is doodgeslagen door {*SOURCE*} - - Mossige blokstenen + + {*PLAYER*} is gedood door de magische krachten van {*SOURCE*} - - Gebarsten blokstenen + + {*PLAYER*} viel uit de wereld - - Gebeitelde blokstenen + + Texturepakketten - - Paddenstoel + + Combinatiepakketten - - Paddenstoel + + {*PLAYER*} is verteerd door het vuur - - IJzeren hek + + Thema's - - Raam + + Gamerafbeeldingen - - Meloen + + Avatarvoorwerpen - - Pompoenplant + + {*PLAYER*} brandde dood - - Meloenplant + + {*PLAYER*} verhongerde - - Klimplanten + + {*PLAYER*} is doodgeprikt - - Poortje + + {*PLAYER*} kwam te hard neer - - Bakstenen trap + + {*PLAYER*} wilde zwemmen in de lava - - Blokstenen trap + + {*PLAYER*} stikte in een muur - - Zilvervissteen + + {*PLAYER*} verdronk - - Zilverviskei + + Doodsmeldingen - - Zilvervisbloksteen + + Je bent geen moderator meer - - Zwamvlok + + Je kunt nu vliegen - - Plompenblad + + Je kunt niet meer vliegen - - Onderwereld-steen + + Je kunt geen dieren meer aanvallen - - Onderwereld-stenen hek + + Je kunt nu dieren aanvallen - - Onderwereld-stenen trap + + Je bent nu een moderator - - Onderwereld-wrat + + Je kunt niet langer uitgeput raken - - Tovertafel + + Je bent nu onkwetsbaar - - Brouwrek + + Je bent niet langer onkwetsbaar - - Ketel + + %d MSP - - Einde-portaal + + Je kunt nu uitgeput raken - - Einde-portaalblok + + Je bent nu onzichtbaar - - Einde-steen + + Je bent niet langer onzichtbaar - - Drakenei + + Je kunt nu spelers aanvallen - - Struik + + Je kunt nu voorwerpen uitgraven en gebruiken - - Varen + + Je kunt geen blokken meer plaatsen - - Zandstenen trap + + Je kunt nu blokken plaatsen - - Sparrenhouten trap + + Geanimeerd personage - - Berkenhouten trap + + Passende skinanimatie - - Tropenhouten trap + + Je kunt geen voorwerpen meer uitgraven of gebruiken - - Roodsteenlamp + + Je kunt nu deuren en schakelaars gebruiken - - Kokospalm + + Je kunt geen mobs meer aanvallen - - Schedel + + Je kunt nu mobs aanvallen - - Huidige besturing + + Je kunt geen spelers meer aanvallen - - Configuratie + + Je kunt geen deuren en schakelaars meer gebruiken - - Verplaatsen/rennen + + Je kunt nu containers (zoals kisten) gebruiken - - Rondkijken + + Je kunt geen containers (zoals kisten) meer gebruiken - - Pauze + + Onzichtbaar - - Springen + + Bakens + + + {*T3*}INSTRUCTIES: BAKENS{*ETW*}{*B*}{*B*} +Actieve bakens projecteren een felle lichtstraal in de lucht en geven krachten aan spelers in de buurt.{*B*} +Je maakt ze van glas, obsidiaan en Onderwereld-sterren, die je krijgt door de Wither te verslaan.{*B*}{*B*} +Je moet de bakens zo plaatsen dat ze overdag in het zonlicht staan. Plaats de bakens op piramiden van ijzer, goud, smaragd of diamant.{*B*} +Het materiaal waarop het baken wordt geplaatst, heeft geen effect op de kracht van het baken.{*B*}{*B*} +In het menu van het baken kun je een primaire kracht kiezen voor je baken. Het aantal krachten waaruit je kunt kiezen, is afhankelijk van het aantal verdiepingen van je piramide.{*B*} +Als je een baken op een piramide met minimaal vier verdiepingen zet, kun je ook de secundaire kracht Regeneratie kiezen of een sterkere primaire kracht gebruiken.{*B*}{*B*} +Om de krachten van je baken in te stellen, moet je één smaragd, diamant, goud of ijzerstaaf in het betalingsvakje plaatsen.{*B*} +Daarna worden de krachten constant door het baken afgegeven.{*B*} + + + Vuurwerk + + + Talen + + + Paarden + + + {*T3*}INSTRUCTIES: PAARDEN{*ETW*}{*B*}{*B*} +Je vindt paarden en ezels vooral in open vlakten en op savannen. Muilezels zijn een kruising tussen een ezel en een paard en zijn onvruchtbaar.{*B*} +Je kunt rijden op alle volwassen paarden, ezels en muilezels. Alleen paarden kunnen worden bepantserd en alleen muilezels en ezels kunnen zadeltassen dragen voor het vervoeren van voorwerpen.{*B*}{*B*} +Paarden, ezels en muilezels moeten worden getemd voordat je ze kunt gebruiken. Je temt ze door op ze te klimmen en te blijven zitten als ze proberen om je van hun rug te gooien.{*B*} +Als er hartjes om hen heen verschijnen, zijn ze getemd. Ze zullen dan niet langer proberen je van hun rug te gooien. Om de dieren te besturen, moet je ze uitrusten met een zadel.{*B*}{*B*} +Je kunt zadels kopen van dorpelingen of vinden in verborgen kisten.{*B*} +Je kunt tamme ezels en muilezels zadeltassen geven door er kisten aan te bevestigen. Je kunt deze zadeltassen openen tijdens het rijden of door te sluipen.{*B*}{*B*} +Paarden en ezels (maar niet muilezels) kunnen net als andere dieren worden gefokt met gouden appels of gouden wortels.{*B*} +Veulens groeien na verloop van tijd op tot volwassen paarden. Dit gaat sneller als je ze tarwe of hooi voert.{*B*} + + + {*T3*}INSTRUCTIES: VUURWERK{*ETW*}{*B*}{*B*} +Vuurwerk is een decoratief voorwerp dat je vanuit de hand of een automaat kunt lanceren. Je produceert het met papier, buskruit en eventueel een aantal vuurwerk-sterren.{*B*} +Kleuren, uitdoving, vorm, grootte en effecten (zoals sporen en fonkelingen) van vuurwerk-sterren kun je tijdens de productie aanpassen door er extra ingrediënten aan toe te voegen.{*B*}{*B*} +Om vuurwerk te produceren, plaats je buskruit en papier in het productieraster van 3x3 boven je inventaris.{*B*} +Eventueel kun je meerdere vuurwerk-sterren in het productieraster toevoegen aan je vuurwerk.{*B*} +Hoe meer vakjes je in het productieraster vult met buskruit, des te hoger zullen de vuurwerk-sterren exploderen.{*B*}{*B*} +Je kunt het geproduceerde vuurwerk uit het resultaatvakje halen.{*B*}{*B*} +Je produceert vuurwerk-sterren door buskruit en kleurstof in het productieraster te plaatsen.{*B*} + - De kleurstof bepaalt de kleur van de exploderende vuurwerk-ster.{*B*} + - Je bepaalt de vorm van de vuurwerk-ster door er een vuurbal, goudklomp, veer of mobhoofd aan toe te voegen.{*B*} + - Je kunt een spoor of een fonkeling toevoegen door diamanten of gloeisteenstof te gebruiken.{*B*}{*B*} +Nadat je een vuurwerk-ster hebt geproduceerd, kun je de uitdovingskleur bepalen door er kleurstof aan toe te voegen. + + + {*T3*}INSTRUCTIES: DROPPERS{*ETW*}{*B*}{*B*} +Als ze worden aangedreven door roodsteen laten droppers een willekeurig voorwerp op de grond vallen. Gebruik {*CONTROLLER_ACTION_USE*} om de dropper te openen, waarna je hem kunt vullen met voorwerpen uit je inventaris.{*B*} +Als de dropper op een kist of een andere container is gericht, wordt het voorwerp daarin geplaatst. Je kunt een groot aantal droppers aan elkaar bevestigen om voorwerpen over een afstand te transporteren. Hiervoor moeten ze afwisselend worden in- en uitgeschakeld. + + + Als je dit gebruikt, wordt het een kaart van het deel van de wereld waarin je je bevindt. Naarmate je meer van de omgeving ontdekt, wordt er meer van de kaart onthuld. + + + Wordt achtergelaten door de Wither, wordt gebruikt voor het produceren van bakens. + + + Hoppers + + + {*T3*}INSTRUCTIES: HOPPERS{*ETW*}{*B*}{*B*} +Hoppers worden gebruikt om voorwerpen in en uit containers te transporteren en om voorwerpen die er naartoe worden gegooid automatisch op te vangen.{*B*} +Ze kunnen worden gebruikt met brouwrekken, kisten, automaten, droppers, mijnwagens met kisten, mijnwagens met hoppers en andere hoppers.{*B*}{*B*} +Hoppers zuigen voortdurend voorwerpen uit een geschikte container die erboven is geplaatst. Ze proberen ook in de hopper opgeslagen voorwerpen in een andere container te plaatsen.{*B*} +Als een hopper wordt aangedreven door roodsteen, wordt hij inactief en zal hij niet langer voorwerpen opzuigen of plaatsen.{*B*}{*B*} +Een hopper wijst in de richting waarin het voorwerpen probeert te transporteren. Om een hopper op een bepaald blok te laten richten, plaats je de hopper al sluipend tegen het gewenste blok.{*B*} + + + Droppers - - Springen/Omhoog vliegen + + NIET GEBRUIKT - - Inventaris + + Directe genezing - - Voorwerp veranderen + + Directe verwonding - - Actie + + Sprongkracht - - Gebruiken + + Trager graven - - Produceren + + Kracht - - Laten vallen + + Verzwakking - - Sluipen + + Misselijkheid - - Sluipen/Omlaag vliegen + + NIET GEBRUIKT - - Andere camera + + NIET GEBRUIKT - - Spelers/uitnodigen + + NIET GEBRUIKT - - Verplaatsen (vliegend) + + Regeneratie - - Configuratie 1 + + Weerstand - - Configuratie 2 + + Basis voor nieuwe wereld zoeken - - Configuratie 3 + + Activeer dit voor kleurrijke explosies. Kleuren, effecten, vormen en uitdoving worden bepaald door de vuurwerk-ster die is gebruikt bij het produceren van het vuurwerk. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Een soort rails die mijnwagens met hoppers kunnen activeren en deactiveren, en mijnwagens met TNT kunnen detoneren. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Wordt gebruikt om voorwerpen te bewaren of te laten vallen, of om voorwerpen in een andere container te duwen als ze een roodsteenlading krijgen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Kleurrijke blokken die worden geproduceerd door geharde klei te kleuren. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Genereert een roodsteenlading. De lading is sterker als je meerdere voorwerpen op de plaat legt. Vereist meer gewicht dan de lichte plaat. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Wordt gebruikt als energiebron voor roodsteen. Kan weer worden omgezet in roodsteen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Wordt gebruikt om voorwerpen te vangen of om voorwerpen in en uit containers te transporteren. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Kan worden gevoerd aan paarden, ezels of muilezels voor het aanvullen van maximaal 10 hartjes. Versnelt de groei van veulens. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Vleermuis - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Deze vliegende wezens vind je in grotten en andere grote afgesloten ruimten. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Heks - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Wordt gemaakt door klei te smelten in een oven. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Wordt gemaakt van glas en een kleurstof. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Wordt gemaakt van gekleurd glas - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Genereert een roodsteenlading. De lading is sterker als je meerdere voorwerpen op de plaat legt. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Een blok dat een roodsteensignaal afgeeft dat wordt gegenereerd door zonlicht (of juist door een gebrek hieraan). - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Een speciaal soort mijnwagen die op dezelfde manier functioneert als de hopper. Hij verzamelt voorwerpen op de rails en uit containers erboven. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Een speciaal soort pantser waarmee een paard kan worden uitgerust. Geeft 5 pantser. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Wordt gebruikt om kleuren, effecten en vormen van vuurwerk te bepalen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Wordt gebruikt in roodsteencircuits voor het onderhouden, vergelijken of verminderen van de signaalsterkte, of voor het bepalen van de status van blokken. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Een soort mijnwagen die functioneert als een bewegend TNT-blok. - - {*B*}Druk op{*CONTROLLER_VK_A*} om door te gaan. + + Een speciaal soort pantser waarmee een paard kan worden uitgerust. Geeft 7 pantser. - - {*B*}Druk op{*CONTROLLER_VK_A*} om te beginnen met de speluitleg.{*B*} - Druk op{*CONTROLLER_VK_B*} als je klaar bent om zelf te spelen. + + Wordt gebruikt voor het uitvoeren van opdrachten. - - In Minecraft plaats je blokken, waarmee je alles kunt bouwen wat je wilt. -'s Nachts verschijnen er monsters, dus zorg ervoor dat je dan een schuilplaats bouwt. + + Projecteert een lichtstraal in de lucht en heeft statuseffecten op spelers in de buurt. - - Gebruik{*CONTROLLER_ACTION_LOOK*} om omhoog, omlaag en rond te kijken. + + Hierin kun je blokken en voorwerpen bewaren. Plaats twee kisten naast elkaar om een grotere kist met een twee keer zo grote capaciteit te maken. De opgeladen kist genereert ook een roodsteenlading als je 'm opent. - - Gebruik{*CONTROLLER_ACTION_MOVE*} om je te verplaatsen. + + Een speciaal soort pantser waarmee een paard kan worden uitgerust. Geeft 11 pantser. - - Duw{*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren om te sprinten. Als je{*CONTROLLER_ACTION_MOVE*} naar voren houdt, blijven personages sprinten tot ze geen sprinttijd of voedsel meer over hebben. + + Wordt gebruikt om mobs door de speler te laten leiden of aan hekken vast te binden. - - Druk op{*CONTROLLER_ACTION_JUMP*} om te springen. + + Wordt gebruikt om mobs in de wereld een naam te geven. - - Hou{*CONTROLLER_ACTION_ACTION*} ingedrukt om iets uit te graven met je hand of met het voorwerp dat je vasthoudt. Mogelijk moet je eerst gereedschap maken om bepaalde blokken te kunnen uitgraven. + + Sneller graven - - Hou{*CONTROLLER_ACTION_ACTION*} ingedrukt om 4 blokken hout (van boomstammen) te kappen.{*B*}Als een blok afbreekt, kunt je het oppakken door bij het zwevende blok te gaan staan. Het verschijnt dan in je inventaris. + + Volledige game kopen - - Druk op{*CONTROLLER_ACTION_CRAFTING*} om de productie-interface te openen. + + Game hervatten - - In de inventaris worden voorwerpen opgenomen die je verzamelt en produceert.{*B*} - Druk op{*CONTROLLER_ACTION_INVENTORY*} om de inventaris te openen. + + Game opslaan - - Je voedselbalk{*ICON_SHANK_01*} loopt leeg als je je verplaatst, graaft en aanvalt. Sprinten en sprintend springen kost veel meer voedsel dan lopen en normaal springen. + + Game spelen - - Je gezondheid wordt automatisch aangevuld als je ten minste 9{*ICON_SHANK_01*} in je voedselbalk hebt. Je vult je voedselbalk aan door te eten. + + Klassementen - - Neem voedsel in je hand en hou{*CONTROLLER_ACTION_USE*} ingedrukt om het op te eten en je voedselbalk aan te vullen. Je kunt niet eten als je voedselbalk vol is. + + Hulp en opties - - Je voedselbalk raakt leeg en je bent wat gezondheid verloren. Eet de biefstuk in je inventaris om je voedselbalk aan te vullen en te genezen.{*ICON*}364{*/ICON*} + + Moeilijkheid: - - Je kunt planken produceren van het hout dat je hebt verzameld. Open de productie-interface om ze te maken.{*PlanksIcon*} + + Speler tegen Speler: - - Om iets te produceren, zijn vaak meerdere stappen nodig. Nu je planken hebt, kun je meer voorwerpen produceren. Maak een werkbank.{*CraftingTableIcon*} + + Spelers vertrouwen: - - Je kunt speciaal gereedschap maken waarmee je sneller blokken kunt verzamelen. Sommige gereedschappen hebben handgrepen die zijn gemaakt van stokken. Produceer nu enkele stokken.{*SticksIcon*} + + TNT: - - Neem een ander voorwerp in je hand met{*CONTROLLER_ACTION_LEFT_SCROLL*} en{*CONTROLLER_ACTION_RIGHT_SCROLL*}. + + Speltype: - - Met{*CONTROLLER_ACTION_USE*} kun je voorwerpen gebruiken en plaatsen, en iets in de omgeving doen. Je kunt geplaatste voorwerpen weer oppakken door ze uit te graven met het juiste gereedschap. + + Bouwmaterialen: - - Selecteer de werkbank, beweeg het richtkruis naar de plek waar je de werkbank wilt plaatsen en druk op{*CONTROLLER_ACTION_USE*}. + + Type wereld: - - Beweeg het richtkruis naar de werkbank en druk op {*CONTROLLER_ACTION_USE*} om 'm te openen. + + Geen games gevonden - - Met een schop kun je sneller zachte blokken als aarde en sneeuw uitgraven. Als je meer materialen hebt verzameld, kun je gereedschappen maken die langer meegaan en waarmee je sneller kunt werken. Maak een houten schop.{*WoodenShovelIcon*} + + Alleen op uitnodiging - - Met een bijl kun je hout en houten blokken sneller kappen. Als je meer materialen hebt verzameld, kun je gereedschappen maken die langer meegaan en waarmee je sneller kunt werken. Maak een houten bijl.{*WoodenHatchetIcon*} + + Meer opties - - Met een houweel kun je harde blokken als steen en erts sneller uitgraven. Als je meer materialen hebt verzameld, kun je gereedschappen maken die langer meegaan en waarmee je sneller kunt werken. Je kunt dan ook hardere materialen uitgraven. Maak een houten houweel.{*WoodenPickaxeIcon*} + + Laden - - Open de houder. + + Host-opties - - De nacht kan plotseling vallen en daar kun je maar beter op zijn voorbereid. Je kunt pantsers en wapens produceren, maar het is verstandig om eerst voor een schuilplaats te zorgen. + + Spelers/uitnodigen - - - Er is een verlaten mijnwerkersschuilplaats in de buurt die je kunt afmaken, zodat je je kunt verschuilen voor de nacht. - + + Online game - - - Je hebt grondstoffen nodig om de schuilplaats af te maken. Muren en daken kun je van elk materiaal maken, maar je moet ook een deur, wat ramen en verlichting maken. - + + Nieuwe wereld - - Gebruik je houweel om wat stenen blokken uit te graven. Stenen blokken leveren keien op. Met 8 keiblokken kun je een oven bouwen. Om het steen te bereiken, moet je misschien wat aarde weggraven. Gebruik dus je schop.{*StoneIcon*} + + Spelers - - Je hebt genoeg keien verzameld om een oven te kunnen bouwen. Gebruik hiervoor je werkbank. + + Meedoen aan game - - Gebruik{*CONTROLLER_ACTION_USE*} om de oven in de wereld te plaatsen. Daarna open je de oven. + + Game starten - - Gebruik de oven om wat houtskool te maken. Terwijl je wacht tot de kool klaar is, kun je alvast wat meer materialen voor je schuilplaats verzamelen. + + Naam wereld - - Gebruik de oven om wat glas te maken. Terwijl je wacht tot het glas klaar is, kun je alvast wat meer materialen voor je schuilplaats verzamelen. + + Basis voor nieuwe wereld - - Een goede schuilplaats heeft een deur, zodat je naar binnen en buiten kunt zonder muren uit te graven. Maak nu een houten deur.{*WoodenDoorIcon*} + + Leeg laten voor een willekeurige basis - - Gebruik{*CONTROLLER_ACTION_USE*} om de deur te plaatsen. Met{*CONTROLLER_ACTION_USE*} kun je een houten deur in de wereld openen en dichtdoen. + + Overslaande branden: + + + Tekst bord wijzigen: + + + Voer de informatie over je screenshot in + + + Bijschrift + + + Tooltips in de game + + + 2 spelers op verticaal gedeeld scherm + + + Klaar + + + Screenshot uit het spel + + + Geen effect + + + Snelheid + + + Vertraging + + + Tekst bord wijzigen: + + + De klassieke textures, pictogrammen en gebruikersinterface van Minecraft! + + + Alle combinatiewerelden weergeven + + + Hints + + + Avatarvoorwerp 1 opnieuw installeren + + + Avatarvoorwerp 2 opnieuw installeren + + + Avatarvoorwerp 3 opnieuw installeren + + + Thema opnieuw installeren + + + Gamerafbeelding 1 opnieuw installeren + + + Gamerafbeelding 2 opnieuw installeren + + + Opties + + + Gebruikersinterface + + + Resetten + + + Camerabeweging + + + Geluid + + + Gevoeligheid + + + Graphics + + + Wordt gebruikt als ingrediënt van drankjes. Wordt achtergelaten door dode Ghasts. + + + Wordt achtergelaten door dode Zombie-bigmensen. Je vindt Zombie-bigmensen in de Onderwereld. Wordt gebruikt als ingrediënt bij het brouwen van drankjes. + + + Wordt gebruikt als ingrediënt van drankjes. Ze groeien op een natuurlijke manier in Onderwereld-forten en kunnen ook worden geplant op drijfzand. + + + Kijk uit als je eroverheen loopt, want het is glad. Verandert in water als het boven een ander blok wordt vernietigd. Smelt als je er een lichtbron bij houdt of als je het plaatst in de Onderwereld. + + + Kan worden gebruikt voor decoratie. + + + Wordt gebruikt als ingrediënt van drankjes en om vestingen te vinden. Wordt achtergelaten door Blazes die je vaak bij of in Onderwereld-forten vindt. + + + Afhankelijk van hun toepassing kunnen drankjes uiteenlopende effecten hebben. + + + Wordt gebruikt als ingrediënt van drankjes of samen met andere voorwerpen gebruikt voor het produceren van Einder-oog of magmacrème. + + + Wordt gebruikt als ingrediënt van drankjes. + + + Wordt gebruikt voor het maken van drankjes en explosieve drankjes. + + + Kan worden gevuld met water en in het brouwrek worden gebruikt als basisingrediënt voor een drankje. + + + Dit is giftig voedsel en een ingrediënt voor drankjes. Wordt achtergelaten door een gedode spin of grotspin. + + + Wordt gebruikt als ingrediënt van drankjes, vooral van drankjes met een negatief effect. + + + De plant begint te groeien nadat hij is geplaatst. Kan worden verzameld met een schaar. Je kunt erop klimmen zoals op een ladder. + + + Vergelijkbaar met een deur, maar vooral geschikt voor hekken. + + + Kan worden gemaakt uit stukken meloen. + + + Transparante blokken die kunnen worden gebruikt als een alternatief voor glasblokken. + + + Moet worden aangedreven met een knop, hendel, drukplaat, roodsteenfakkel of roodsteen, waarna de zuiger wordt uitgeschoven (als dat mogelijk is) en blokken kan wegduwen. Als de zuiger weer wordt ingeschoven, trekt de zuiger het blok mee dat eraan vast zit. + + + Gemaakt van stenen blokken, meestal te vinden in vestingen. + + + Wordt gebruikt als omheining, vergelijkbaar met hekken. + + + Kunnen worden geplant om pompoenen te kweken. + + + Kan worden gebruikt voor constructie en decoratie. + + + Vertraagt je als je erdoorheen loopt. Je kunt het kapotmaken met een schaar om draad te verkrijgen. + + + Als je dit vernietigt, verschijnt er een zilvervis. Er kan ook een zilvervis verschijnen als er in de buurt een zilvervis wordt aangevallen. + + + Kunnen worden geplant om meloenen te kweken. + + + Wordt achtergelaten door dode Einder-mannen. Als je ermee gooit, word je getransporteerd naar de plek waar de Einder-parel neerkomt en verlies je een beetje gezondheid. + + + Een blok aarde waar gras op groeit. Wordt verkregen met een schop. Kan worden gebruikt voor constructie. + + + Kan door regen of met een emmer water worden gevuld en vervolgens worden gebruikt om glazen flessen met water te vullen. + + + Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok. + + + Ontstaat door een Onderwereld-blok te smelten in een oven. Er kunnen blokken Onderwereld-steen van worden geproduceerd. + + + Geven licht als ze stroom krijgen. + + + Een soort vitrine. Het vertoont het voorwerp of blok dat erin is geplaatst. + + + Als je ermee gooit, kan er een wezen van het aangegeven type verschijnen. + + + Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok. + + + Kan worden geoogst om cacaobonen te verkrijgen. + + + Koe + + + Koeien laten leer achter als ze worden gedood. Ze kunnen ook worden gemolken met een emmer. + + + Schaap + + + Mobhoofden kunnen als decoratie worden gebruikt of worden gedragen als masker door ze in het helmvak te plaatsen. + + + Inktvis + + + Inktvissen laten inktzakken achter als ze worden gedood. + + + Te gebruiken om dingen in brand te steken of om lukraak branden te stichten als ze uit een automaat worden geschoten. + + + Drijft op water en je kunt erop lopen. + + + Wordt gebruikt om Onderwereld-forten te bouwen. Ongevoelig voor de vuurballen van de Ghast. + + + Wordt gebruikt in Onderwereld-forten. + + + Als je ermee gooit, zie je in welke richting je een Einde-portaal kunt vinden. Als je er twaalf plaatst in de Einde-portaalblokken, activeer je het Einde-portaal. + + + Wordt gebruikt als ingrediënt van drankjes. + + + Vergelijkbaar met grasblokken, maar zeer geschikt om paddenstoelen op te kweken. + + + Te vinden in Onderwereld-forten. Laten Onderwereld-wratten achter als je ze breekt. + + + Een bloksoort dat je aantreft in het Einde. Het is zeer goed bestand tegen ontploffingen en dus erg geschikt om mee te bouwen. + + + Dit blok ontstaat als je de Einder-draak verslaat. + + + Als je ermee gooit, komen er ervaringsbollen vrij. Pak deze op om ervaringspunten te krijgen. + + + Hier kun je je ervaringspunten gebruiken om zwaarden, houwelen, bijlen, schoppen, bogen en pantser te betoveren. + + + Kan worden geactiveerd met twaalf Einder-ogen, waarna je naar het Einde kunt reizen. + + + Wordt gebruikt om een Einde-portaal te maken. + + + Moet worden aangedreven met een knop, hendel, drukplaat, roodsteenfakkel of roodsteen, waarna de zuiger wordt uitgeschoven en blokken kan wegduwen. + + + Ontstaan door klei te bakken in een oven. + + + Wordt gebruikt om bakstenen van te maken in een oven. + + + Na het breken blijven er balletjes klei over, waarmee je bakstenen kunt maken in een oven. + + + Wordt gekapt met een bijl. Er kunnen planken van worden gemaakt en het kan als brandstof worden gebruikt. + + + Wordt gemaakt door in een oven zand te smelten. Kan worden gebruikt voor constructie, maar breekt als je het probeert uit te graven. + + + Wordt verkregen door steen uit te graven met een houweel. Kan worden gebruikt voor het maken van een oven of stenen gereedschappen. + + + Een compacte manier om sneeuwballen op te slaan. + + + Te gebruiken met een kom om stoofpot te produceren. + + + Kan alleen worden uitgegraven met een diamanten houweel. Wordt geproduceerd door water te combineren met stilstaande lava en wordt gebruikt om een portaal te bouwen. + + + Laat monsters in de wereld verschijnen. + + + Kan worden afgegraven met een schop om sneeuwballen te maken. + + + Bij het afbreken verschijnen soms tarwezaden. + + + Hiervan kun je een kleurstof maken. + + + Wordt verkregen met een schop. Bij het opgraven verschijnt soms vuursteen. Is gevoelig voor zwaartekracht als er geen object onder ligt. + + + Kan worden uitgegraven met een houweel om steenkool te verkrijgen. + + + Kan worden uitgegraven met een stenen houweel of beter gereedschap om lapis lazuli te verkrijgen. + + + Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om diamanten te verkrijgen. + + + Wordt gebruikt als decoratie. + + + Kan worden uitgegraven met een ijzeren houweel of beter gereedschap. Het kan in een oven worden omgesmolten tot goudstaven. + + + Kan worden uitgegraven met een stenen houweel of beter gereedschap. Het kan in een oven worden omgesmolten tot ijzerstaven. + + + Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om roodsteenstof te verkrijgen. + + + Dit is onbreekbaar materiaal. + + + Alles wat ermee in contact komt, gaat branden. Kan worden verzameld in een emmer. + + + Wordt verkregen met een schop. Kan in een oven worden versmolten tot glas. Is gevoelig voor zwaartekracht als er geen object onder ligt. + + + Kan worden uitgegraven met een houweel om keien te verkrijgen. + + + Wordt verkregen met een schop. Kan worden gebruikt voor constructie. + + + Kan worden geplant en groeit uiteindelijk uit tot boom. + + + Wordt op de grond geplaatst om een elektrische lading te geleiden. Door het te verwerken in een drankje verleng je de duur van het effect. + + + Wordt verkregen door een koe te doden. Kan worden gebruikt om pantser te produceren of boeken te maken. + + + Wordt verkregen door een slijmkubus te doden. Kan worden gebruikt als ingrediënt bij het brouwen van drankjes of om plakzuigers te produceren. + + + Wordt op willekeurige momenten achtergelaten door kippen en kan worden gebruikt om voedsel te produceren. + + + Wordt verkregen door het opgraven van grind en kan worden gebruikt voor het produceren van een aansteker. + + + Als je hiermee een varken opzadelt, kun je erop rijden. Vervolgens kun je het varken besturen met een wortel aan een stok. + + + Wordt verkregen door het opscheppen van sneeuw, waarna je ermee kunt gooien. + + + Wordt verkregen door het uitgraven van gloeisteen. Kan worden gebruikt om nieuwe blokken gloeisteen te maken of om het effect van een drankje krachtiger te maken. + + + Als je ze afbreekt, laten ze soms een jong boompje achter, dat je kunt planten en laten uitgroeien tot een boom. + + + Te vinden in kerkers en kan worden gebruikt voor constructie en decoratie. + + + Wordt gebruikt om wol te verkrijgen van schaap en om bladeren te oogsten. + + + Wordt verkregen door een Skelet te doden. Er kan bottenmeel van worden geproduceerd en je kunt er een wolf mee temmen. + + + Wordt verkregen door een Skelet een Creeper te laten doden. Kan worden afgespeeld in een jukebox. + + + Blust vuur en zorgt ervoor dat gewassen kunnen groeien. Kan worden verzameld in een emmer. + + + Wordt verkregen door het oogsten van gewassen en kan worden gebruikt om voedsel te produceren. + + + Kan worden gebruikt om suiker te produceren. + + + Kan worden gedragen als helm of met een fakkel worden gebruikt om een pompoenlampion te maken. Het is ook het belangrijkste ingrediënt van pompoentaart. + + + Brandt voor eeuwig nadat het is aangestoken. + + + Rijpe gewassen kunnen worden geoogst om tarwe te verkrijgen. + + + Grond die is voorbewerkt voor het planten van zaden. + + + Kan in een oven worden gekookt om groene kleurstof te verkrijgen. + + + Vertraagt de beweging van alles wat eroverheen loopt. + + + Wordt verkregen door een kip te doden en kan worden gebruikt om een pijl te produceren. + + + Wordt verkregen door een Creeper te doden. Kan worden gebruikt om TNT te produceren en als ingrediënt bij het brouwen van drankjes. + + + Kunnen worden geplant op een akker om gewassen te kweken. Zorg ervoor dat de zaden genoeg licht krijgen! + + + Via een portaal kun je heen en weer reizen tussen de Bovenwereld en de Onderwereld. + + + Wordt gebruikt als brandstof in een oven of om een fakkel te produceren. + + + Wordt verkregen door een spin te doden. Kan worden gebruikt om een boog of een vishengel te produceren of op de grond worden geplaatst om struikeldraad te maken. + + + Schapen laten wol achter als ze worden geschoren (als dit niet al eens is gedaan). Ze kunnen worden gekleurd om de wol een andere kleur te geven. + + + Zakelijke ontwikkeling + + + Directeur Portfolio + + + Productmanager + + + Ontwikkelteam + + + Release-management + + + Directeur XBLA Publishing + + + Marketing + + + Lokalisatieteam Azië + + + Gebruikersresearchteam + + + MGS Central Teams + + + Community-manager + + + Lokalisatieteam Europa + + + Lokalisatieteam Redmond + + + Ontwerpteam + + + Directeur lolfactor + + + Muziek en geluid + + + Programmering + + + Hoofd-architect + + + Ontwikkeling grafisch ontwerp + + + Game-crafter + + + Grafisch ontwerp + + + Producent + + + Testleider + + + Hoofdtester + + + Kwaliteitscontrole + + + Uitvoerend producent + + + Hoofdproducent + + + Tester milestone-goedkeuring + + + IJzeren schop + + + Diamanten schop + + + Gouden schop + + + Gouden zwaard + + + Houten schop + + + Stenen schop + + + Houten houweel + + + Gouden houweel + + + Houten bijl + + + Stenen bijl + + + Stenen houweel + + + IJzeren houweel + + + Diamanten houweel + + + Diamanten zwaard + + + SDET + + + Project-STE + + + Extra STE + + + Speciale dank + + + Testmanager + + + Senior testleider + + + Testpartners + + + Houten zwaard + + + Stenen zwaard + + + IJzeren zwaard + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Ontwikkelaar + + + Ghasts schieten vuurballen die exploderen als je erdoor wordt geraakt. + + + Slijmkubus + + + Slijmkubussen splitsen zich op in kleinere slijmkubussen als ze worden geraakt. + + + Zombie-bigmens + + + Zombie-bigmensen zijn niet agressief tot je er een aanvalt. Dan vallen ze in groepen aan. + + + Ghast + + + Einder-man + + + Grotspin + + + De beet van de grotspin is giftig. + + + Zwamkoe + + + Einder-mannen vallen je aan als je naar hen kijkt. Ze kunnen ook blokken verplaatsen. + + + Zilvervis + + + Als je zilvervissen aanvalt, krijgen ze hulp van zilvervissen in de buurt. Ze houden zich verscholen in stenen blokken. + + + Zombies vallen je aan als je te dichtbij komt. + + + Varkens laten varkensvlees achter als ze worden gedood. Als je een zadel op een varken legt, kun je erop rijden. + + + Wolf + + + Wolven zijn niet agressief tot je ze aanvalt, want dan vallen ze jou ook aan. Je kunt ze temmen met botten. Ze volgen je dan en verdedigen je als je wordt aangevallen. + + + Kip + + + Kippen laten veren achter als ze worden gedood en leggen op willekeurige momenten eieren. + + + Varken + + + Creeper + + + Spin + + + Spinnen vallen je aan als je te dichtbij komt. Ze kunnen op muren lopen en laten draden achter als ze worden gedood. + + + Zombie + + + Creepers exploderen als je te dichtbij komt! + + + Skelet + + + Skeletten schieten met pijlen op je. Ze laten pijlen achter als ze worden gedood. + + + Zwamkoeien produceren paddenstoelenstoofpot als je ze 'melkt' met een lege kom. Als je ze scheert, laten ze paddenstoelen vallen en worden ze een gewone koe. + + + Oorspronkelijk ontwerp en code + + + Projectmanager/producent + + + Rest van Mojang + + + Concept-illustraties + + + Cijfertjes en statistieken + + + Pestcoördinatie + + + Hoofdprogrammeur Minecraft PC + + + Klantenservice + + + Kantoor-dj + + + Ontwerper/programmeur Minecraft - Pocket Edition + + + Ninja-code + + + CEO + + + Witteboordenwerker + + + Explosie-animaties - - Het kan 's nachts erg donker worden, dus heb je wat verlichting nodig voor je schuilplaats. Gebruik nu de productie-interface om een fakkel te maken van stokken en houtskool.{*TorchIcon*} + + Dit is een grote zwarte draak, die je aantreft in het Einde. - - - Je hebt het eerste deel van de speluitleg voltooid. - + + Blaze - - - {*B*} - Druk op{*CONTROLLER_VK_A*} om verder te gaan met de speluitleg.{*B*} - Druk op{*CONTROLLER_VK_B*} als je klaar bent om zelf te spelen. - + + Deze vijanden tref je aan in de Onderwereld, meestal in Onderwereld-forten. Ze laten Blaze-staven achter als ze worden gedood. - - - Dit is je inventaris. Hier zie je de voorwerpen die je kunt vasthouden en alle andere voorwerpen die je bij je hebt. Je ziet hier ook je pantser. - + + Sneeuwgolem - - {*B*} - Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al weet hoe je de inventaris moet gebruiken. - + + Je kunt sneeuwgolems maken van sneeuwblokken en pompoenen. Vervolgens gooien ze sneeuwballen naar je vijanden. - - - Gebruik{*CONTROLLER_MENU_NAVIGATE*} om de aanwijzer te verplaatsen. Gebruik{*CONTROLLER_VK_A*} om het voorwerp onder de aanwijzer te pakken. - Je pakt alle voorwerpen tegelijk op als het vakje meerdere voorwerpen bevat. Je kunt ook de helft pakken met{*CONTROLLER_VK_X*}. - + + Einder-draak - - - Verplaats dit voorwerp naar een ander inventarisvakje en bevestig met{*CONTROLLER_VK_A*}. - Als je meerdere voorwerpen hebt opgepakt, gebruik je{*CONTROLLER_VK_A*} om ze allemaal te plaatsen of{*CONTROLLER_VK_X*} om er maar één te plaatsen. - + + Magmakubus - - - Als je de aanwijzer buiten de interface plaatst, laat je het voorwerp vallen. - + + Deze katachtigen vind je in oerwouden. Je kunt ze temmen door ze rauwe vis te voeren. Laat ze wel zelf naar je toe komen, want ze zijn erg schrikachtig. - - - Wil je meer informatie over een voorwerp? Plaats dan de aanwijzer op het voorwerp en druk op {*CONTROLLER_VK_BACK*}. - + + IJzergolem - - - Druk nu op{*CONTROLLER_VK_B*} om de inventaris te sluiten. - + + IJzergolems verdedigen dorpen. Je kunt ze maken met ijzerblokken en pompoenen. - - - Dit is de inventaris in het speltype Creatief. Je ziet de voorwerpen die je kunt vasthouden en alle andere voorwerpen die je kunt kiezen. - + + Magmakubussen komen voor in de Onderwereld. Net als slijmkubussen splitsen ze zich op in kleinere kubussen als ze worden geraakt. - - {*B*} - Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al weet hoe je de inventaris in het speltype Creatief moet gebruiken. - + + Dorpeling - - Gebruik{*CONTROLLER_MENU_NAVIGATE*} om de aanwijzer te verplaatsen. Gebruik{*CONTROLLER_VK_A*} om een voorwerp uit de lijst te kiezen en druk op{*CONTROLLER_VK_Y*} om de volledige stapel van dat voorwerp te pakken. + + Ocelot - - - De aanwijzer gaat automatisch naar een vakje in de werkbalk. Plaats het voorwerp met{*CONTROLLER_VK_A*}. Als je het voorwerp hebt geplaatst, gaat de aanwijzer terug naar de voorwerplijst. Hier kun je een ander voorwerp kiezen. - + + Door deze rond een tovertafel te plaatsen, kun je krachtigere betoveringen maken. - - - Als je de aanwijzer buiten de interface plaatst, laat je het voorwerp in de wereld vallen. Druk op{*CONTROLLER_VK_X*} om alle voorwerpen uit de werkbalk te verwijderen. - + + {*T3*}INSTRUCTIES: OVEN{*ETW*}{*B*}{*B*} +Met een oven kun je voorwerpen veranderen door ze te verhitten. Zo kun je ijzererts in de oven omsmelten tot ijzerstaven.{*B*}{*B*} +Plaats de oven in de wereld en druk op{*CONTROLLER_ACTION_USE*} om 'm te gebruiken.{*B*}{*B*} +Plaats brandstof onderin de oven en het te verhitten voorwerp bovenin. Vervolgens wordt de oven ontstoken.{*B*}{*B*} +Als de nieuwe voorwerpen klaar zijn, kun je ze van het resultaatvakje verplaatsen naar je inventaris.{*B*}{*B*} +Als het voorwerp een ingrediënt of brandstof voor de oven is, zie je een tooltip waarmee je het meteen in de oven kunt plaatsen. + - - - Blader door de voorwerpgroepen bovenaan met{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*}, en selecteer de groep met het voorwerp dat je wilt pakken. - + + {*T3*}INSTRUCTIES: AUTOMAAT{*ETW*}{*B*}{*B*} +Een automaat werpt voorwerpen uit. Je moet een schakelaar (zoals een hendel) ernaast plaatsen om de automaat te kunnen activeren.{*B*}{*B*} +Om de automaat met voorwerpen te vullen, druk je op{*CONTROLLER_ACTION_USE*}. Je kunt dan voorwerpen van je inventaris naar de automaat verplaatsen.{*B*}{*B*} +Als je nu de schakelaar gebruikt, werpt de automaat een voorwerp uit. + - - - Wil je meer informatie over een voorwerp? Plaats dan de aanwijzer op het voorwerp en druk op {*CONTROLLER_VK_BACK*}. - + + {*T3*}INSTRUCTIES: BROUWEN{*ETW*}{*B*}{*B*} +Voor het brouwen van drankjes heb je een brouwrek nodig. Dit moet je eerst bouwen op een werkbank. De basis van elk drankje is een fles water, die je maakt door een glazen fles te vullen met water uit een ketel of een waterbron.{*B*} +Een brouwrek bevat drie vakjes voor flessen, zodat je drie drankjes tegelijk kunt maken. Je kunt één ingrediënt gebruiken voor alle drie de flessen. Door drie drankjes tegelijk te brouwen, ga je dus efficiënt om met je grondstoffen.{*B*} +Plaats een ingrediënt in het bovenste vakje van het brouwrek om een basisdrankje te maken. Zo'n basisdrankje heeft pas effect als je er nog een ingrediënt aan toevoegt.{*B*} +Daarna kun je er nog een derde ingrediënt bij doen. Je kunt het effect verlengen met roodsteenstof, het drankje intenser maken met gloeisteenstof of er een schadelijk drankje van maken met een gefermenteerd spinnenoog.{*B*} +Je kunt aan elk drankje buskruit toevoegen om er een explosief drankje van te maken. Met een explosief drankje kun je gooien, waarna het middel effect heeft op de omgeving van de plek waar het neerkomt.{*B*} + +De basisingrediënten van drankjes zijn:{*B*}{*B*} +* {*T2*}Onderwereld-wrat{*ETW*}{*B*} +* {*T2*}spinnenoog{*ETW*}{*B*} +* {*T2*}suiker{*ETW*}{*B*} +* {*T2*}Ghast-traan{*ETW*}{*B*} +* {*T2*}Blaze-poeder{*ETW*}{*B*} +* {*T2*}magmacrème{*ETW*}{*B*} +* {*T2*}glinsterende meloen{*ETW*}{*B*} +* {*T2*}roodsteenstof{*ETW*}{*B*} +* {*T2*}gloeisteenstof{*ETW*}{*B*} +* {*T2*}gegist spinnenoog{*ETW*}{*B*}{*B*} +Experimenteer met combinaties van ingrediënten om te ontdekken welke drankjes je kunt maken. - - - Druk nu op{*CONTROLLER_VK_B*} om de inventaris in het speltype Creatief te sluiten. - + + {*T3*}INSTRUCTIES: GROTE KIST{*ETW*}{*B*}{*B*} +Door twee kisten naast elkaar te plaatsen, maak je een grote kist. Daar kun je nog meer voorwerpen in bewaren.{*B*}{*B*} +Je gebruikt 'm op dezelfde manier als een normale kist. + - - - Dit is de productie-interface. Met deze interface kun je verzamelde voorwerpen met elkaar combineren om nieuwe voorwerpen te maken. - + + {*T3*}INSTRUCTIES: PRODUCEREN{*ETW*}{*B*}{*B*} +In de productie-interface kun je voorwerpen uit je inventaris met elkaar combineren om nieuwe voorwerpen te maken. Druk op{*CONTROLLER_ACTION_CRAFTING*} om de productie-interface te openen.{*B*}{*B*} +Blader door de tabbladen bovenaan met{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*}, selecteer de groep met het voorwerp dat je wilt produceren en gebruik{*CONTROLLER_MENU_NAVIGATE*} om dat voorwerp te selecteren.{*B*}{*B*} +In het productieveld zie je wat je nodig hebt om het nieuwe voorwerp te maken. Druk op{*CONTROLLER_VK_A*} om het voorwerp te produceren en plaats het vervolgens in je inventaris. + - - {*B*} - Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al weet hoe je moet produceren. - + + {*T3*}INSTRUCTIES: WERKBANK{*ETW*}{*B*}{*B*} +Met een werkbank kun je grotere voorwerpen maken.{*B*}{*B*} +Plaats de werkbank in de wereld en druk op{*CONTROLLER_ACTION_USE*} om 'm te gebruiken.{*B*}{*B*} +Produceren op een werkbank werkt hetzelfde als normaal produceren, maar je hebt een groter productieveld en kunt meer verschillende voorwerpen maken. + + + + {*T3*}INSTRUCTIES: BETOVEREN{*ETW*}{*B*}{*B*} +Je vindt ervaringspunten bij dode mobs of krijgt ze door bepaalde blokken uit te graven of om te smelten in een oven. Je kunt deze ervaringspunten gebruiken om gereedschappen, wapens, pantser en boeken te betoveren.{*B*} +Plaats een zwaard, boog, bijl, houweel, schop, pantser of boek in het vakje onder het boek op de tovertafel. Aan de rechterkant zie je dan drie betoveringen en de kosten in ervaringsniveaus.{*B*} +Als je te weinig ervaringsniveaus hebt om een betovering te gebruiken, worden de kosten in rood weergegeven. Anders is dit getal groen.{*B*}{*B*} +De betovering zelf wordt willekeurig toegepast op basis van de weergegeven kosten.{*B*}{*B*} +Als de tovertafel is omgeven door boekenplanken, wordt het drankje krachtiger en zie je mysterieuze symbolen verschijnen bij het boek op de tovertafel. Je kunt maximaal 15 boekenplanken plaatsen met een tussenruimte van één blok tussen de boekenkast en de tovertafel.{*B*}{*B*} +De ingrediënten voor een tovertafel vind je in dorpen, door voorwerpen uit te graven of door het land te bewerken.{*B*}{*B*} +Je gebruikt betoverde boeken om voorwerpen te betoveren op het aambeeld. Dit geeft je meer controle over de betoveringen die je wilt gebruiken op je voorwerpen.{*B*} + + + {*T3*}INSTRUCTIES: WERELDEN UITSLUITEN{*ETW*}{*B*}{*B*} +Als je in een wereld aanstootgevende content aantreft, kun je die wereld toevoegen aan je lijst met uitgesloten werelden. +Druk in het pauzemenu op{*CONTROLLER_VK_RB*} om de tooltip Wereld uitsluiten te selecteren. +Als je later naar die wereld probeert te gaan, krijg je een melding dat deze op je lijst met uitgesloten werelden staat. Je kunt dan annuleren of de wereld van de lijst verwijderen en er toch naartoe gaan. + + + {*T3*}INSTRUCTIES: OPTIES VOOR HOST EN SPELERS{*ETW*}{*B*}{*B*} + +{*T1*}Game-opties{*ETW*}{*B*} +Druk tijdens het laden of maken van een wereld op 'Meer opties' voor een menu waarin je van alles kunt instellen voor je game.{*B*}{*B*} + +{*T2*}Speler tegen speler (PvP){*ETW*}{*B*} +Als deze optie is ingeschakeld, kunnen spelers andere spelers verwonden. Deze optie is alleen van toepassing voor het speltype Survival.{*B*}{*B*} + +{*T2*}Spelers vertrouwen{*ETW*}{*B*} +Schakel deze optie uit om de mogelijkheden van spelers die met je meedoen te beperken. Ze kunnen dan geen voorwerpen uitgraven of gebruiken, geen blokken plaatsen, geen deuren en schakelaars gebruiken, geen containers gebruiken en geen spelers of dieren aanvallen. Je kunt deze opties voor specifieke spelers aanpassen via het game-menu.{*B*}{*B*} + +{*T2*}Overslaande branden{*ETW*}{*B*} +Als deze optie is ingeschakeld, kan vuur overslaan naar brandbare blokken in de buurt. Ook deze optie kun je in de game aanpassen.{*B*}{*B*} + +{*T2*}TNT-explosies{*ETW*}{*B*} +Als deze optie is ingeschakeld, ontploft TNT als het ontbrandt. Ook deze optie kun je in de game aanpassen.{*B*}{*B*} + +{*T2*}Privileges host{*ETW*}{*B*} +Als deze optie is ingeschakeld, kunnen hosts via het game-menu hun vermogen om te vliegen aan- en uitzetten, uitputting uitschakelen en zichzelf onzichtbaar maken. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T2*}Daglichtcyclus{*ETW*}{*B*} +Als deze optie is uitgeschakeld, zijn er geen wisselende dagdelen.{*B*}{*B*} + +{*T2*}Inventaris behouden{*ETW*}{*B*} +Als deze optie is ingeschakeld, behouden spelers hun inventaris als ze doodgaan.{*B*}{*B*} + +{*T2*}Spawnen van mobs{*ETW*}{*B*} +Als deze optie is uitgeschakeld, spawnen mobs niet automatisch.{*B*}{*B*} + +{*T2*}Omgevingsinvloed mobs{*ETW*}{*B*} +Als deze optie is uitgeschakeld, hebben monsters en dieren geen invloed op blokken (zo worden blokken niet vernietigd door ontploffende Creepers en verwijderen schapen geen gras) en kunnen ze geen voorwerpen oppakken.{*B*}{*B*} + +{*T2*}Buit van mobs{*ETW*}{*B*} +Als deze optie is uitgeschakeld, laten monsters en dieren geen buit achter (Creepers laten bijvoorbeeld geen buskruit achter).{*B*}{*B*} + +{*T2*}Voorwerpen van blokken{*ETW*}{*B*} +Als deze optie is uitgeschakeld, laten blokken geen voorwerpen achter als ze worden vernietigd (stenen blokken laten bijvoorbeeld dan geen keien achter).{*B*}{*B*} + +{*T2*}Automatische regeneratie{*ETW*}{*B*} +Als deze optie is uitgeschakeld, wordt de gezondheid van spelers niet vanzelf hersteld.{*B*}{*B*} + +{*T1*}Opties voor het maken van een wereld{*ETW*}{*B*} +Als je een nieuwe wereld maakt, zijn er enkele extra opties.{*B*}{*B*} + +{*T2*}Bouwwerken genereren{*ETW*}{*B*} +Als deze optie is ingeschakeld, worden bouwwerken als dorpen en vestingen gegenereerd in de wereld.{*B*}{*B*} + +{*T2*}Supervlakke wereld{*ETW*}{*B*} +Als deze optie is ingeschakeld, wordt een volledig vlakke Bovenwereld en Onderwereld gegenereerd.{*B*}{*B*} + +{*T2*}Bonuskist{*ETW*}{*B*} +Als deze optie is ingeschakeld, staat er een kist met handige voorwerpen bij de terugkeerlocatie van de speler.{*B*}{*B*} + +{*T2*}Onderwereld resetten{*ETW*}{*B*} +Als deze optie is ingeschakeld, wordt de Onderwereld opnieuw gegenereerd. Dit is handig als je een ouder opslagbestand zonder Onderwereld-forten hebt.{*B*}{*B*} + +{*T1*}Opties in de game{*ETW*}{*B*} +Tijdens het spelen kun je een aantal opties aanpassen in het game-menu. Je opent dit menu door op {*BACK_BUTTON*} te drukken.{*B*}{*B*} + +{*T2*}Host-opties{*ETW*}{*B*} +De host en eventuele moderator hebben toegang tot het menu Host-opties. Hier kunnen ze overslaande branden en TNT-explosies in- en uitschakelen.{*B*}{*B*} + +{*T1*}Speleropties{*ETW*}{*B*} +Om de privileges van een speler te wijzigen, selecteer je zijn of haar naam en druk je op{*CONTROLLER_VK_A*} om het privileges-menu te openen. Hier kun je de volgende opties aanpassen.{*B*}{*B*} + +{*T2*}Kan bouwen en uitgraven{*ETW*}{*B*} +Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan bouwen en uitgraven' is ingeschakeld, kan de speler op een normale manier functioneren in de wereld. Als de optie is uitgeschakeld, mag de speler geen blokken plaatsen of vernietigen en mag hij veel andere voorwerpen en blokken niet gebruiken.{*B*}{*B*} + +{*T2*}Kan deuren en schakelaars gebruiken{*ETW*}{*B*} +Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan deuren en schakelaars gebruiken' is uitgeschakeld, mag de speler geen deuren en schakelaars gebruiken.{*B*}{*B*} + +{*T2*}Kan containers openen{*ETW*}{*B*} +Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan containers openen' is uitgeschakeld, mag de speler geen containers zoals kisten openen.{*B*}{*B*} + +{*T2*}Kan spelers aanvallen{*ETW*}{*B*} +Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan spelers aanvallen' is uitgeschakeld, kan de speler geen andere spelers verwonden.{*B*}{*B*} + +{*T2*}Kan dieren aanvallen{*ETW*}{*B*} +Deze optie is alleen beschikbaar als de optie 'Spelers vertrouwen' is uitgeschakeld. Als 'Kan dieren aanvallen' is uitgeschakeld, kan de speler geen dieren verwonden.{*B*}{*B*} + +{*T2*}Moderator{*ETW*}{*B*} +Als deze optie is ingeschakeld, kan de speler de privileges van andere spelers (behalve van de host) aanpassen. Daarvoor moet dan wel de optie 'Spelers vertrouwen' zijn uitgeschakeld. Verder kan de moderator spelers verwijderen en overslaande branden en TNT-explosies in- en uitschakelen.{*B*}{*B*} + +{*T2*}Speler verwijderen{*ETW*}{*B*} +{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Opties voor host{*ETW*}{*B*} +Als 'Privileges host' is ingeschakeld, kan de host de eigen privileges aanpassen. Om de privileges van een speler te wijzigen, selecteer je zijn of haar naam en druk je op{*CONTROLLER_VK_A*} om het privileges-menu te openen. Hier kun je de volgende opties aanpassen.{*B*}{*B*} + +{*T2*}Kan vliegen{*ETW*}{*B*} +Als deze optie is ingeschakeld, kan de speler vliegen. Deze optie is alleen van toepassing voor het speltype Survival, omdat iedereen al kan vliegen in het speltype Creatief.{*B*}{*B*} + +{*T2*}Uitputting uitschakelen{*ETW*}{*B*} +Deze optie is alleen van toepassing voor het speltype Survival. Als deze optie is ingeschakeld, hebben fysieke activiteiten (lopen, sprinten, springen etc.) geen invloed op de voedselbalk. De voedselbalk loopt wel langzaam leeg om de speler te genezen als deze gewond is.{*B*}{*B*} + +{*T2*}Onzichtbaar{*ETW*}{*B*} +Als deze optie is ingeschakeld, is de speler onkwetsbaar en niet zichtbaar voor andere spelers.{*B*}{*B*} + +{*T2*}Kan teleporteren{*ETW*}{*B*} +Hiermee kan de speler andere spelers of zichzelf verplaatsen naar andere spelers in de wereld. + + + Volgende pagina + + + {*T3*}INSTRUCTIES: DIEREN HOUDEN{*ETW*}{*B*}{*B*} +Als je je dieren bij elkaar wilt houden, kun je een gebied van minder dan 20x20 blokken omheinen. Zo weet je zeker dat je dieren er zijn als je ze nodig hebt. + + + {*T3*}INSTRUCTIES: VEETEELT{*ETW*}{*B*}{*B*} +In Minecraft kun je dieren fokken om nieuwe jonge dieren te krijgen.{*B*} +Als je dieren wilt laten paren, moet je ze voedsel geven waarvan ze 'verliefd' worden.{*B*} +Voer tarwe aan een koe, zwamkoe of schaap, tarwezaden of Onderwereld-wrat aan een kip of elk soort vlees aan een wolf. De dieren gaan dan in de omgeving op zoek naar dieren van hun soort die ook verliefd zijn.{*B*} +Als twee verliefde dieren van dezelfde soort elkaar vinden, zoenen ze een paar seconden en verschijnt er een jong dier. Jonge dieren volgen hun ouders tot ze volwassen zijn.{*B*} +Nadat een dier verliefd is geweest, duurt het ongeveer vijf minuten voordat het opnieuw verliefd kan worden.{*B*} +Van elk dier mag je er maar een maximumaantal hebben in je wereld. Als je die limiet hebt bereikt, zullen dieren niet meer paren. + + + {*T3*}INSTRUCTIES: ONDERWERELD-PORTAAL{*ETW*}{*B*}{*B*} +Met een Onderwereld-portaal kun je reizen tussen de Bovenwereld en de Onderwereld. Je kunt de Onderwereld gebruiken om je snel te verplaatsen in de Bovenwereld. Als je in de Onderwereld een afstand van één blok aflegt, staat dat gelijk met een afstand van drie blokken in de Bovenwereld. Als je dus een portaal bouwt in de Onderwereld en er doorheen gaat, ben je drie keer zo ver weg van jouw beginpunt.{*B*}{*B*} +Je hebt minimaal 10 obsidiaanblokken nodig voor het portaal, dat 5 blokken hoog, 4 blokken breed en 1 blok diep moet zijn. Als de lijst van het portaal klaar is, moet je de ruimte binnen de lijst in brand steken om het portaal te activeren. Dit doe je met een aansteker of een vuurbal.{*B*}{*B*} +Rechts zie je enkele voorbeelden van portalen. + + + + {*T3*}INSTRUCTIES: KIST{*ETW*}{*B*}{*B*} +Zodra je een kist hebt geproduceerd, kun je deze in de wereld plaatsen en met{*CONTROLLER_ACTION_USE*} gebruiken om voorwerpen uit je inventaris te bewaren.{*B*}{*B*} +Gebruik de aanwijzer om voorwerpen van de inventaris naar je kist te verplaatsen en andersom.{*B*}{*B*} +De voorwerpen die je in de kist bewaart, kun je later weer in je inventaris plaatsen. + + + + Ben je ook naar Minecon geweest? - - {*B*} - Druk op{*CONTROLLER_VK_X*} voor een beschrijving van het voorwerp. - + + Niemand bij Mojang heeft junkboy ooit gezien. - - {*B*} - Druk op{*CONTROLLER_VK_X*} om te zien welke ingrediënten je nodig hebt om het geselecteerde voorwerp te maken. - + + Weet je dat er ook een Minecraft-wiki is? - - {*B*} - Druk op{*CONTROLLER_VK_X*} om je inventaris weer te openen. - + + Kijk niet direct naar de bugs. - - - Blader door de voorwerpgroepen bovenaan met{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*}, selecteer de groep met het voorwerp dat je wilt produceren en gebruik{*CONTROLLER_MENU_NAVIGATE*} om dat voorwerp te selecteren. - + + Creepers zijn het resultaat van een programmeerfout. - - - In het productieveld zie je wat je nodig hebt om het nieuwe voorwerp te maken. Druk op{*CONTROLLER_VK_A*} om het voorwerp te produceren en plaats het vervolgens in je inventaris. - + + Is het een kip of een eend? - - - Met een werkbank kun je een grotere selectie voorwerpen maken. Produceren op een werkbank werkt hetzelfde als normaal produceren, maar je hebt een groter productieveld en kunt dus meer combinaties van ingrediënten maken. - + + Het nieuwe kantoor van Mojang is cool! - - - Rechtsonder in de productie-interface zie je je inventaris. In dit gedeelte zie je ook een beschrijving van het geselecteerde voorwerp en de ingrediënten die je daarvoor nodig hebt. - + + {*T3*}INSTRUCTIES: DE BASIS{*ETW*}{*B*}{*B*} +In Minecraft plaats je blokken, waarmee je alles kunt bouwen wat je wilt. 's Nachts verschijnen er monsters, dus zorg ervoor dat je dan een schuilplaats hebt gebouwd.{*B*}{*B*} +Gebruik{*CONTROLLER_ACTION_LOOK*} om rond te kijken.{*B*}{*B*} +Gebruik{*CONTROLLER_ACTION_MOVE*} om je te verplaatsen.{*B*}{*B*} +Druk op{*CONTROLLER_ACTION_JUMP*} om te springen.{*B*}{*B*} +Duw {*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren om te sprinten. Als je{*CONTROLLER_ACTION_MOVE*} naar voren houdt, blijven personages sprinten tot de sprinttijd om is of tot er minder dan {*ICON_SHANK_03*} in de voedselbalk over zijn.{*B*}{*B*} +Hou{*CONTROLLER_ACTION_ACTION*} ingedrukt om iets uit te graven en te hakken met je hand of met het voorwerp dat je vasthoudt. Mogelijk moet je eerst gereedschap maken om bepaalde blokken te kunnen uitgraven.{*B*}{*B*} +Druk op{*CONTROLLER_ACTION_USE*} om het voorwerp in je hand te gebruiken of op{*CONTROLLER_ACTION_DROP*} om het te laten vallen. - - - Je ziet nu de beschrijving van het geselecteerde voorwerp. Dit geeft je een idee van de mogelijke toepassingen. - + + {*T3*}INSTRUCTIES: SCHERMINFO{*ETW*}{*B*}{*B*} +De scherminfo geeft je informatie over je status: je gezondheid, je resterende zuurstof als je onder water bent, je hongerniveau (je moet eten om de honger te verminderen) en je eventuele pantser. Je gezondheid wordt automatisch aangevuld als je ten minste 9{*ICON_SHANK_01*} in je voedselbalk hebt. Je vult je voedselbalk aan door te eten.{*B*} +Verder zie je hier je ervaringsbalk, met een getal dat je ervaringsniveau aangeeft. Ook is er een balk die aangeeft hoe veel ervaringspunten je nodig hebt om een hoger ervaringsniveau te bereiken. +Je verdient ervaringspunten door ervaringsbollen bij dode mobs op te pakken, bepaalde blokken uit te graven, dieren te fokken, te vissen en erts te smelten in een oven.{*B*}{*B*} +Je ziet hier ook de voorwerpen die je kunt gebruiken. Pak een ander voorwerp vast met{*CONTROLLER_ACTION_LEFT_SCROLL*} en{*CONTROLLER_ACTION_RIGHT_SCROLL*}. - - - Je ziet nu een lijst met de ingrediënten die je nodig hebt om het geselecteerde voorwerp te produceren. - + + {*T3*}INSTRUCTIES: INVENTARIS{*ETW*}{*B*}{*B*} +Gebruik{*CONTROLLER_ACTION_INVENTORY*} om je inventaris te bekijken.{*B*}{*B*} +Hier zie je de voorwerpen die je kunt vasthouden en alle andere voorwerpen die je bij je hebt. Je ziet hier ook je pantser.{*B*}{*B*} +Gebruik{*CONTROLLER_MENU_NAVIGATE*} om de aanwijzer te verplaatsen. Gebruik{*CONTROLLER_VK_A*} om het voorwerp onder de aanwijzer te pakken. Je pakt alle voorwerpen tegelijk op als het vakje meerdere voorwerpen bevat. Je kunt ook de helft pakken met{*CONTROLLER_VK_X*}.{*B*}{*B*} +Verplaats het voorwerp met de aanwijzer naar een ander inventarisvakje en bevestig met {*CONTROLLER_VK_A*}. Als je meerdere voorwerpen hebt opgepakt, gebruik je{*CONTROLLER_VK_A*} om ze allemaal te plaatsen of{*CONTROLLER_VK_X*} om er maar één te plaatsen.{*B*}{*B*} +Als een voorwerp waar je met de aanwijzer langs komt een pantservoorwerp is, zie je een tooltip waarmee je het meteen in het juiste pantservakje van je inventaris plaatst.{*B*}{*B*} +Je kunt je leren pantser een andere kleur geven met kleurstof. Dit doe je door in het inventarismenu de kleurstof op te pakken met je aanwijzer en vervolgens op{*CONTROLLER_VK_X*} te drukken als de aanwijzer zich op het te verven oppervlak bevindt. - - Je kunt planken produceren van het hout dat je hebt verzameld. Selecteer het plank-pictogram en druk op{*CONTROLLER_VK_A*} om de planken te produceren.{*PlanksIcon*} + + Minecon 2013 vond plaats in Orlando, Florida. - - - Plaats de werkbank die je hebt gebouwd in de wereld, zodat je een grotere selectie voorwerpen kunt maken.{*B*} - Druk nu op{*CONTROLLER_VK_B*} om de productie-interface te sluiten. - + + .party() was geweldig! - - - Druk op{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*} om een andere voorwerpgroep te kiezen voor de voorwerpen die je wilt produceren. Selecteer de groep Gereedschappen.{*ToolsIcon*} - + + Ga er altijd vanuit dat geruchten niet kloppen en neem ze nooit zomaar voor waar aan. - - - Druk op{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*} om een andere voorwerpgroep te kiezen. Selecteer de groep Bouwmaterialen.{*StructuresIcon*} - + + Vorige pagina - - - Gebruik{*CONTROLLER_MENU_NAVIGATE*} om het te produceren voorwerp te kiezen. Van sommige voorwerpen zijn er verschillende versies, afhankelijk van de materialen die ervoor worden gebruikt. Selecteer de houten schop.{*WoodenShovelIcon*} - + + Handelen - - - Om iets te produceren, zijn vaak meerdere stappen nodig. Nu je planken hebt, kun je meer voorwerpen produceren. Gebruik{*CONTROLLER_MENU_NAVIGATE*} om het te produceren voorwerp te kiezen. Selecteer de werkbank.{*CraftingTableIcon*} - + + Aambeeld - - - Met de gereedschappen die je nu hebt, kun je al van alles doen. Bovendien is het nu gemakkelijker om allerlei andere materialen te verzamelen.{*B*} - Druk nu op{*CONTROLLER_VK_B*} om de productie-interface te sluiten. - + + Het Einde - - - Sommige voorwerpen maak je niet met de werkbank, maar met de oven. Maak nu een oven.{*FurnaceIcon*} - + + Werelden uitsluiten - - - Plaats de oven die je hebt gemaakt in de wereld. De beste plek voor de oven is je schuilplaats.{*B*} - Druk nu op{*CONTROLLER_VK_B*} om de productie-interface te sluiten. - + + Speltype Creatief - - - Dit is de oven-interface. Met een oven kun je voorwerpen veranderen door ze te verhitten. Zo kun je ijzererts in de oven omsmelten tot ijzerstaven. - + + Opties voor host en spelers - - {*B*} - Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al weet hoe je een oven moet gebruiken. - + + {*T3*}INSTRUCTIES: HET EINDE{*ETW*}{*B*}{*B*} +Het Einde is een andere dimensie in de game, waar je naartoe kunt via een actief Einde-portaal. Je vind het Einde-portaal in een vesting, diep onder de grond in de Bovenwereld.{*B*} +Om een Einde-portaal te activeren, moet je een Einder-oog in elk leeg Einde-portaalblok plaatsen.{*B*} +Als het portaal actief is, spring je er doorheen om naar het Einde te gaan.{*B*}{*B*} +In het Einde neem je het op tegen de woeste en sterke Einder-draak en een groot aantal Einder-mannen. Zorg er dus voor dat je op de strijd bent voorbereid!{*B*}{*B*} +De Einder-draak geneest zichzelf met Einder-kristallen, die op acht pilaren van obsidiaan liggen. Die kristallen moet je dus eerst vernietigen.{*B*} +Een aantal kristallen kun je uitschakelen met pijlen, maar er zijn er ook die worden beschermd door een ijzeren kooi. Je zult dus iets moeten bouwen om ze handmatig te kunnen vernietigen.{*B*}{*B*} +Ondertussen valt de Einder-draak je aan door op je af te vliegen en Einder-zuurballen naar je te spuwen.{*B*} +Als je in de buurt komt van het eiplatform in het midden van de ruimte, vliegt de Einder-draak op je af. Dat is het moment om de draak flink te verwonden!{*B*} +Ontwijk de zuuradem van de Einder-draak en richt op zijn ogen om zoveel mogelijk schade aan te richten. Neem zo mogelijk wat vrienden mee naar het Einde om je bij te staan in de strijd!{*B*}{*B*} +Als je eenmaal in het Einde bent, zien je vrienden de locatie van het Einde-portaal op hun kaart. Zo kunnen ze je snel te hulp komen. - - - Plaats brandstof in het onderste vakje van de oven en het te verhitten voorwerp in het bovenste vakje. Vervolgens wordt de oven ontstoken en verschijnt het resultaat in het vakje rechts. + + {*ETB*}Welkom terug! Je hebt het vast niet gemerkt, maar Minecraft is bijgewerkt.{*B*}{*B*} +Er zijn allerlei nieuwe functies voor jou en je vrienden. We zetten de belangrijkste op een rijtje. Lees het even door en ga dan weer snel spelen!{*B*}{*B*} +{*T1*}Nieuwe voorwerpen{*ETB*} - Geharde klei, gekleurde klei, steenkoolblok, hooibaal, activeringsrails, roodsteenblok, daglichtsensor, dropper, hopper, mijnwagen met hopper, mijnwagen met TNT, roodsteenvergelijker, verzwaarde drukplaat, baken, opgeladen kist, vuurpijl, vuurwerk-ster, Onderwereld-ster, riem, paardenharnas, naamplaatje, spawn-ei voor paard{*B*}{*B*} +{*T1*}Nieuwe mobs{*ETB*} - Wither, Wither-skeletten, heksen, vleermuizen, paarden, ezels en muilezels{*B*}{*B*} +{*T1*}Nieuwe functies{*ETB*} - Tem en rij op een paard, produceer vuurwerk en geef een vuurwerkshow, geef dieren en monsters een naam met een naamplaatje, maak nog geavanceerdere roodsteencircuits en gebruik nieuwe host-opties om te bepalen wat spelers die te gast zijn in jouw wereld mogen doen!{*B*}{*B*} +{*T1*}Nieuwe oefenwereld{*ETB*} – Leer hoe je de oude en nieuwe functies moet gebruiken in de oefenwereld! Probeer alle muziekplaten in de wereld te vinden!{*B*}{*B*} - - - Veel houten voorwerpen zijn geschikt als brandstof, maar niet alles brandt even lang. Misschien vind je ook nog andere voorwerpen die je kunt gebruiken als brandstof. - + + Richt meer schade aan dan je vuisten. - - - Als de nieuwe voorwerpen klaar zijn, kun je ze van het resultaatvakje verplaatsen naar je inventaris. Experimenteer met verschillende ingrediënten om te zien wat je allemaal kunt maken. - + + Hiermee kun je sneller dan met de hand graven in aarde, gras, zand, grind en sneeuw. Je hebt schoppen nodig om sneeuwballen op te graven. - - - Als je hout als ingrediënt gebruikt, kun je houtskool maken. Plaats wat brandstof in de oven en hout in het ingrediëntvakje. Het kan even duren voordat de oven klaar is met het produceren van de houtskool, dus ga ondertussen gerust iets anders doen en kom later terug om te zien hoe het gaat. - + + Sprinten - - - Houtskool kan worden gebruikt als brandstof, maar in combinatie met een stok kun je er ook een fakkel van maken. - + + Nieuwe functies - - - Plaats zand in het ingrediëntvakje om glas te maken. Maak wat glasblokken, die je als ramen kunt gebruiken in je schuilplaats. + + {*T3*}Nieuw en aangepast{*ETW*}{*B*}{*B*} +- Nieuwe voorwerpen - Geharde klei, gekleurde klei, steenkoolblok, hooibaal, activeringsrails, roodsteenblok, daglichtsensor, dropper, hopper, mijnwagen met hopper, mijnwagen met TNT, roodsteenvergelijker, verzwaarde drukplaat, baken, opgeladen kist, vuurpijl, vuurwerk-ster, Onderwereld-ster, riem, paardenharnas, naamplaatje, spawn-ei voor paard{*B*} +- Nieuwe mobs - Wither, Wither-skeletten, heksen, vleermuizen, paarden, ezels en muilezels{*B*} +- Nieuwe functies voor het genereren van terrein - Heksenhuisjes.{*B*} +- Nieuw: interface voor baken.{*B*} +- Nieuw: interface voor paard.{*B*} +- Nieuw: interface voor hopper.{*B*} +- Nieuw: vuurwerk - Voor de vuurwerk-interface ga ja naar de werkbank als je de ingrediënten hebt om een vuurwerk-ster of een vuurpijl te produceren.{*B*} +- Nieuw: speltype Avontuur - Je kunt alleen blokken breken met het juiste gereedschap.{*B*} +- Veel nieuwe geluiden.{*B*} +- Mobs, voorwerpen en projectielen kunnen nu worden getransporteerd via portalen.{*B*} +- Je kunt nu versterkers vastzetten door andere versterkers aan hun zijkanten te bevestigen.{*B*} +- Zombies en skeletten kunnen nu met verschillende wapens en pantser spawnen.{*B*} +- Nieuwe doodsmeldingen.{*B*} +- Geef mobs een naam met een naamplaatje en geef containers een andere naam om de titel in het geopende menu te wijzigen.{*B*} +- Bottenmeel laat niet langer alles direct helemaal uitgroeien, maar zorgt voor willekeurige groei in fasen.{*B*} +- Er verschijnt een roodsteensignaal dat de inhoud van kisten, brouwrekken, automaten en jukeboxen weergeeft als je er een roodsteenvergelijker direct naast plaatst.{*B*} +- Automaten kunnen in elke richting worden geplaatst.{*B*} +- Als je een gouden appel eet, krijg je gedurende een korte tijd extra absorptiegezondheid.{*B*} +- Hoe langer je in een gebied blijft, des te gevaarlijker zijn de monsters die in dat gebied spawnen.{*B*} - - - Dit is de brouw-interface. Hier maak je allerlei drankjes met verschillende effecten. - + + Screenshots delen - - {*B*} - Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al weet hoe je het brouwrek moet gebruiken. - + + Kisten - - - Je brouwt drankjes door een ingrediënt in het bovenste vakje en een drankje of fles water in de onderste vakjes te plaatsen. Je kunt er maximaal 3 tegelijk brouwen. Als je de juiste voorwerpen met elkaar hebt gecombineerd, begint het brouwproces en even later is je drankje klaar. - + + Produceren - - - Alle drankjes beginnen met een fles water. De meeste drankjes maak je door eerst een 'vreemd drankje' te maken met Onderwereld-wrat. Je hebt nog minstens één ander ingrediënt nodig om het drankje te maken. - + + Oven - - - Als het drankje klaar is, kun je de effecten ervan aanpassen. Door het toevoegen van roodsteenstof verleng je de duur van de effecten en door het toevoegen van gloeisteenstof maak je ze krachtiger. - + + De basis - - - Door het toevoegen van een gegist spinnenoog krijgt het drankje een tegengesteld effect en met buskruit maak je er een explosief drankje van. Hiermee kun je gooien, waarna de omgeving het effect ervan ondervindt. + + Scherminfo - - - Maak een drankje voor vuurbestendigheid door eerst Onderwereld-wrat toe te voegen aan een fles water en er vervolgens magmacrème bij te doen. - + + Inventaris - - - Druk nu op{*CONTROLLER_VK_B*} om de brouw-interface te sluiten. - + + Automaat - - - In dit gebied staat een brouwrek, een ketel en een kist met brouwvoorwerpen. - + + Betoveren - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over brouwen en drankjes.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over brouwen en drankjes. - + + Onderwereld-portaal - - - Om een drankje te kunnen brouwen, heb je eerst een fles water nodig. Neem een glazen fles uit de kist. - + + Multiplayer - - - Je kunt een glazen fles vullen in een ketel waar water in zit, of met een blok water. Vul nu je glazen fles door te richten op een waterbron en op{*CONTROLLER_ACTION_USE*} te drukken. - + + Dieren houden + + + Veeteelt - - - Als een ketel leeg raakt, kun je 'm bijvullen met een emmer water. - + + Brouwen - - - Gebruik het brouwrek om een drankje voor vuurbestendigheid te maken. Je hebt een fles water, Onderwereld-wrat en magmacrème nodig. - + + deadmau5 houdt van Minecraft! - - - Hou het drankje vast en hou{*CONTROLLER_ACTION_USE*} ingedrukt om het te gebruiken. Een normaal drankje drink je op, waarna je zelf het effect ondervindt. Een explosief drankje moet je gooien, waarna wezens in de buurt van de inslag de effecten ondervinden. - Je maakt explosieve drankjes door buskruit toe te voegen aan normale drankjes. - + + Bigmensen vallen je alleen aan als jij ze eerst aanvalt. - - - Gebruik het drankje voor vuurbestendigheid op jezelf. - + + Je kunt de terugkeerlocatie van je game veranderen en het meteen ochtend laten worden door te gaan slapen in een bed. - - - Nu je bestand bent tegen vuur en lava, zou je eens moeten kijken of je naar plekken kunt waar je eerst niet kon komen. - + + Sla die vuurballen terug naar de Ghast! - - - Dit is de betover-interface, waar je betoveringen kunt toevoegen aan wapens, pantser en bepaalde gereedschappen. - + + Maak wat fakkels om 's nachts de omgeving te verlichten. Monsters blijven uit de buurt van fakkels. - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over de betover-interface.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de betover-interface. - + + Bereik je bestemming sneller met een mijnwagen en rails. - - - Om een voorwerp te betoveren, plaats je het eerst in het betoveringsvakje. Je kunt wapens, pantser en bepaalde gereedschappen betoveren om er speciale effecten aan te geven. Zo kun je de weerstand verbeteren of ervoor zorgen dat je meer voorwerpen krijgt als je een blok uitgraaft. - + + Als je jonge boompjes plant, groeien ze uit tot grote bomen. - - - Als er een voorwerp wordt geplaatst in het betoveringsvakje, tonen de knoppen rechts een selectie van willekeurige betoveringen. - + + Door een portaal te bouwen, reis je naar een andere dimensie: de Onderwereld. - - - Het getal op de knop staat voor de kosten die in mindering worden gebracht op je ervaringsniveau. Als je ervaringsniveau te laag is voor de betovering, kun je de knop niet gebruiken. - + + Recht naar beneden of naar boven graven is geen goed idee. - - - Selecteer een betovering en druk op{*CONTROLLER_VK_A*} om het voorwerp te betoveren. De kosten van de betovering worden afgetrokken van je ervaringsniveau. - + + Bottenmeel wordt gemaakt van skelettenbotten en kan worden gebruikt als mest om gewassen meteen te laten groeien. - - - Betoveringen zijn allemaal willekeurig, maar bepaalde zeer goede betoveringen zijn alleen beschikbaar als je een hoog ervaringsniveau hebt en er veel boekenkasten bij je tovertafel staan. - + + Creepers exploderen als ze bij je in de buurt komen! - - - In dit gebied vind je een tovertafel en enkele andere voorwerpen waarmee je kunt oefenen met betoveringen. - + + Druk op{*CONTROLLER_VK_B*} om het voorwerp dat je in je hand hebt te laten vallen. - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over betoveringen.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over betoveringen. - + + Gebruik voor elke klus het juiste gereedschap. - - - Met een tovertafel kun je allerlei speciale effecten creëren. Zo kun je ervoor zorgen dat je meer voorwerpen krijgt als je een blok uitgraaft of dat je wapens, pantser en bepaalde gereedschappen duurzamer worden. - + + Als je geen kolen kunt vinden voor je fakkels, kun je in een oven altijd houtskool maken van bomen. - - - Door boekenkasten rond de tovertafel te plaatsen, wordt deze krachtiger en kun je betoveringen van hogere niveaus uitvoeren. - + + Gebraden varkensvlees geeft je meer gezondheid dan rauw varkensvlees. - - - Het betoveren van voorwerpen kost ervaringsniveaus, die je krijgt door het verzamelen van ervaringsbollen. Dat doe je door monsters en dieren te doden, erts te winnen, dieren te fokken, vissen te vangen en bepaalde dingen te verhitten of te bereiden in een oven. - + + Als je de moeilijkheid instelt op Vredig, wordt je gezondheid automatisch hersteld en verschijnen er 's nachts geen monsters! - - - Je verdient ook ervaringsniveaus door een priesterfles te gebruiken. Als je zo'n fles op de grond gooit, ontstaan er ervaringsbollen op de plek waar hij neerkomt. Deze bollen kun je vervolgens oppakken. - + + Voer een bot aan een wolf om hem te temmen. Je kunt de wolf dan laten zitten of laten volgen. - - - In de kisten in dit gebied vind je enkele betoverde voorwerpen, priesterflessen en voorwerpen die je zelf kunt betoveren bij de tovertafel. - + + Vanuit het inventarismenu kun je voorwerpen laten vallen door de aanwijzer naast het menu te plaatsen en op{*CONTROLLER_VK_A*} te drukken. - - - Je rijdt nu in een mijnwagen. Om uit de mijnwagen te stappen, richt je de aanwijzer erop en druk je op{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - + + Er is nieuwe downloadbare content beschikbaar! Ga via het hoofdmenu naar de Minecraft Store. - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over mijnwagens.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over mijnwagens. - + + Je kunt het uiterlijk van je personage aanpassen met een skinpakket uit de Minecraft Store. Selecteer 'Minecraft Store' in het hoofdmenu om te zien wat er beschikbaar is. - - - Een mijnwagen verplaatst zich over rails. Je kunt ook een aangedreven mijnwagen produceren met een oven en een mijnwagen waar een kist in zit. - {*RailIcon*} - + + Pas de gamma-instellingen aan om de game lichter of donkerder te maken. - - - Je kunt ook aangedreven rails produceren. Deze krijgen stroom van roodsteenfakkels en circuits, waardoor de mijnwagens gaan rijden. Door gebruik te maken van schakelaars, hendels en drukplaten, kun je complexe systemen maken. - {*PoweredRailIcon*} - + + Door 's nachts in een bed te slapen, wordt het meteen ochtend. In een multiplayergame moeten alle spelers tegelijk in hun bed liggen. - - - Je vaart nu in een boot. Om uit de boot te stappen, richt je de aanwijzer erop en druk je op{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - + + Gebruik een schoffel om grond voor te bereiden op landbouw. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over boten.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over boten. - + + Spinnen vallen je overdag niet aan, tenzij je hen zelf aanvalt. - - - Met een boot kun je sneller over water reizen. Je stuurt de boot met{*CONTROLLER_ACTION_MOVE*} en{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - + + In aarde of zand graven, gaat sneller met een schop dan met de hand! - - - Je gebruikt nu een hengel. Druk op{*CONTROLLER_ACTION_USE*} om de hengel te gebruiken.{*FishingRodIcon*} - + + Maak vlees van varkens, kook het en eet het op om je gezondheid te herstellen. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over vissen.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over vissen. - + + Maak leer van koeien en gebruik het om pantser van te maken. - - - Druk op{*CONTROLLER_ACTION_USE*} om de hengel uit te werpen. Druk opnieuw op{*CONTROLLER_ACTION_USE*} om de lijn binnen te halen. - {*FishingRodIcon*} - + + Als je een lege emmer hebt, kun je deze vullen met melk van een koe, met water of met lava! - - - Als de dobber onder het wateroppervlak verdwijnt, kun je de lijn binnenhalen om een vis te vangen. Je kunt een vis rauw eten of bereiden in een oven om je gezondheid aan te vullen. - {*FishIcon*} - + + Obsidiaan ontstaat als stromend water in contact komt met een lavablok. - - - Net zoals veel andere gereedschappen kun je een hengel maar een bepaald aantal keren gebruiken. Met hengels kun je trouwens nog meer doen dan alleen vissen. Experimenteer er maar eens mee om te zien wat je ermee kunt vangen en activeren... - {*FishingRodIcon*} - + + Er zijn nu stapelbare hekken in de game! - - - Dit is een bed. 's Nachts kun je slapen tot het ochtend is door op het bed te richten en op{*CONTROLLER_ACTION_USE*} te drukken.{*ICON*}355{*/ICON*} - + + Sommige dieren volgen je als je tarwe in je hand hebt. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over bedden.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over bedden. - + + Als dieren zich in elke richting niet meer dan 20 blokken kunnen verplaatsen, zullen ze nooit verdwijnen uit de wereld. - - - Plaats een bed in een veilige en goed verlichte plek, zodat je niet midden in de nacht wordt gestoord door monsters. Als je eenmaal een bed hebt gebruikt, keer je terug vanuit dat bed als je doodgaat. - {*ICON*}355{*/ICON*} - + + De gezondheid van tamme wolven kun je aflezen aan de stand van hun staart. Voer ze vlees om ze te genezen. - - - Als er andere spelers met je meedoen, kun je alleen gaan slapen als iedereen op hetzelfde moment in een bed gaat liggen. - {*ICON*}355{*/ICON*} - + + Kook een cactus in een oven om groene kleurstof te krijgen. - - - In dit gebied staan enkele eenvoudige circuits met roodsteen en zuigers, en een kist met voorwerpen waarmee je deze circuits kunt uitbreiden. - + + Lees het gedeelte 'Nieuwe functies' in het menu Instructies voor het laatste nieuws over updates voor de game. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over circuits met roodsteen en zuigers.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over circuits met roodsteen en zuigers. - + + Muziek van C418! - - - Je kunt hendels, knoppen, drukplaten en roodsteenfakkels gebruiken om je circuits van stroom te voorzien. Dat doe je door ze direct te bevestigen aan het voorwerp dat je wilt activeren of door ze te verbinden met roodsteenstof. - + + Wie is Notch? - - - De positie en de richting van de stroombron bepaalt het effect op de omliggende blokken. Zo wordt een roodsteen aan de zijkant van een blok gedoofd als dat blok stroom krijgt van een andere bron. - + + Mojang heeft meer prijzen dan medewerkers. + + + Er zijn hele beroemde mensen die Minecraft spelen. - - Je krijgt roodsteenstof door roodsteenerts uit te graven met een ijzeren, diamanten of gouden houweel. De stroom heeft een bereik van 15 blokken en de energie kan één blok omhoog of omlaag stromen. {*ICON*}331{*/ICON*} + + Notch heeft meer dan een miljoen volgers op Twitter! - - - Je kunt roodsteenversterkers gebruiken om meer blokken van stroom te voorzien of om een circuit te vertragen. - {*ICON*}356{*/ICON*} - + + Niet alle Zweden zijn blond. Jens van Mojang heeft zelfs rood haar! - - - Een aangedreven zuiger kan maximaal 12 blokken wegduwen. Als plakzuigers weer worden ingeschoven, kunnen ze één exemplaar van de meeste blokken meetrekken. - {*ICON*}33{*/ICON*} - + + Er komt nog wel een keer een update voor deze game. - - - In de kist in dit gebied vind je enkele onderdelen waarmee je circuits met zuigers kunt maken. Je kunt de circuits in dit gebied afmaken of zelf nieuwe circuits maken. Buiten de oefenwereld van deze speluitleg vind je er nog meer. - + + Als je twee kisten naast elkaar zet, krijg je één grote kist. - - - In dit gebied vind je een portaal naar de Onderwereld! - + + Pas goed op als je in de open lucht iets van wol maakt, omdat wol kan verbranden door een blikseminslag tijdens een onweersbui. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over portalen en de Onderwereld.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over portalen en de Onderwereld. - + + Met één emmer lava kun je in een oven 100 blokken smelten. - - - Je maakt een portaal door een lijst te maken die vier obsidiaanblokken breed en vijf Portalenblokken hoog is. Je hoeft geen blokken op de hoeken te plaatsen. - + + Het instrument dat wordt gespeeld door een nootblok is afhankelijk van het materiaal eronder. - - - Om een Onderwereldportaal te activeren, steek je de obsidiaanblokken in de lijst aan met een aansteker. Portalen worden inactief als de lijst stukgaat, als er in de buurt iets ontploft of als er vloeistof doorheen stroomt. - + + Het kan enkele minuten duren voordat de lava helemaal is verdwenen als het blok is verwijderd. - - - Ga in een Onderwereldportaal staan om het te gebruiken. Het scherm wordt paars en je hoort een geluid. Een paar seconden later ben je in een andere dimensie. - + + Keien zijn bestand tegen Ghast-vuurballen, waardoor ze zeer geschikt zijn om portalen te beschermen. - - - De Onderwereld kan gevaarlijk zijn door al die lava, maar je vindt er ook handige Onderwereld-blokken die eeuwig branden en gloeisteen dat licht produceert. - + + Blokken die je als lichtbron kunt gebruiken, kunnen ook sneeuw en ijs smelten. Denk daarbij aan fakkels, gloeisteen en pompoenlampionnen. - - - Je kunt de Onderwereld gebruiken om je snel te verplaatsen in de Bovenwereld. Als je je in de Onderwereld één blok verplaatst, staat dat gelijk met een afstand van drie blokken in de Bovenwereld. - + + Zombies en Skeletten kunnen tegen daglicht als ze zich in het water bevinden. - - - Dit is het speltype Creatief. - + + Kippen leggen elke 5 tot 10 minuten een ei. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over het speltype Creatief.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over het speltype Creatief. - + + Obsidiaan kan alleen worden uitgegraven met een diamanten houweel. - - In het speltype Creatief heb je de beschikking over een onbeperkte hoeveelheid van alle voorwerpen en blokken. Ook kun je met één klap blokken vernietigen zonder gereedschap te gebruiken, ben je onkwetsbaar en kun je vliegen. + + Creepers zijn de gemakkelijkste manier om buskruit te verkrijgen. - - Druk op{*CONTROLLER_ACTION_CRAFTING*} om de inventaris van het speltype Creatief te openen. + + Als je een wolf aanvalt, worden andere wolven in de directe omgeving agressief en vallen ze je aan. Ook zombie-bigmensen doen dit. - - Ga door deze opening om verder te gaan. + + Wolven kunnen niet naar de Onderwereld. - - Je hebt de nu de uitleg van het speltype Creatief voltooid. + + Wolven vallen geen Creepers aan. - - - In dit gebied vind je landbouwgrond. Dit is een duurzame bron van voedsel en andere voorwerpen. - + + Dit heb je nodig om verschillende stenen blokken en erts uit te graven. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over landbouw.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over landbouw. - + + Wordt gebruikt in het taartrecept en als ingrediënt bij het brouwen van drankjes. - - Tarwe, pompoenen en meloenen kweek je met zaden. Je verzamelt tarwezaden door hoog gras af te breken of door tarwe te oogsten. Pompoen- en meloenzaden verkrijg je uit pompoenen en meloenen. + + Wordt gebruikt om een elektrische lading aan of uit te zetten. Blijft aan of uit staan tot je de hendel weer gebruikt. - - Voordat je zaden kunt planten, moet je eerst met een schoffel een akker maken op aardeblokken. Met de waterbron in de buurt kun je de akker irrigeren en de gewassen sneller laten groeien. Ook blijft het gebied dan verlicht. + + Geeft voortdurend elektrische ladingen af. Kan ook worden gebruikt als een ontvanger/zender bij bevestiging aan een blok. +Kan ook worden gebruikt voor matige verlichting. - - Tarwe groeit in verschillende fasen en kan worden geoogst als de plant donkerder wordt.{*ICON*}59:7{*/ICON*} + + Herstelt 2{*ICON_SHANK_01*} en er kan een gouden appel van worden gemaakt. - - Pompoenen en meloenen hebben naast zich een extra blok met zaad nodig zodat de vrucht zich kan ontwikkelen als de stam is volgroeid. + + Herstelt 2{*ICON_SHANK_01*} en herstelt 4 seconden lang je gezondheid. Wordt gemaakt van een appel en goudklompen. - - Suikerriet moet direct naast een waterblok worden geplant op een gras-, aarde- of zandblok. Als je een suikerrietblok omhakt, vallen alle blokken erboven naar beneden.{*ICON*}83{*/ICON*} + + Herstelt 2{*ICON_SHANK_01*}. Het kan je wel vergiftigen. - - Cactussen moeten worden geplant op zand en kunnen drie blokken hoog worden. Net als bij suikerriet kun je de bovenste blokken verzamelen door het onderste te vernietigen.{*ICON*}81{*/ICON*} + + Wordt in roodsteencircuits gebruikt als versterker, delayer en/of diode. - - Paddenstoelen moeten worden geplant in een schemerige omgeving en verspreiden zich over schemerige blokken in de buurt.{*ICON*}39{*/ICON*} + + Worden gebruikt als spoorweg voor mijnwagens. - - Bottenmeel kan worden gebruikt om gewassen volledig tot bloei te laten komen of om grote paddenstoelen te maken van gewone paddenstoelen.{*ICON*}351:15{*/ICON*} + + Als deze rails stroom hebben, versnellen ze mijnwagens. Zonder stroom komen mijnwagens tot stilstand. - - Je hebt de nu de uitleg over landbouw voltooid. + + Werkt als een drukplaat (zendt een roodsteensignaal uit als het stroom heeft), maar kan alleen worden geactiveerd door een mijnwagen. - - - In dit gebied zitten dieren ingesloten. Je kunt dieren fokken om nieuwe jonge dieren te verkrijgen. - + + Druk hierop om een elektrische lading af te geven. Blijft ongeveer een seconde geactiveerd en gaat dan weer uit. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over dieren en fokken.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over dieren en fokken. - + + Bevat voorwerpen en werpt deze in willekeurige volgorde uit als de automaat een roodsteensignaal krijgt. - - Om dieren te laten paren, moet je ze voedsel geven waarvan ze 'verliefd' worden. + + Speelt een muzieknoot als het wordt geactiveerd. Sla erop om de toonhoogte te veranderen. Door het op andere blokken te plaatsen, kun je het type instrument veranderen. - - Voer tarwe aan een koe, zwamkoe of schaap, wortels aan varkens, tarwezaden of Onderwereld-wrat aan een kip of elk soort vlees aan een wolf. De dieren gaan dan in de omgeving op zoek naar dieren van hun soort die ook verliefd zijn. + + Herstelt 2,5{*ICON_SHANK_01*}. Wordt gemaakt door rauwe vis te bereiden in een oven. - - Als twee verliefde dieren van dezelfde soort elkaar vinden, zoenen ze een paar seconden en verschijnt er een jong dier. Jonge dieren volgen hun ouders tot ze volwassen zijn. + + Herstelt 1{*ICON_SHANK_01*}. - - Nadat een dier verliefd is geweest, duurt het ongeveer vijf minuten voordat het opnieuw verliefd kan worden. + + Herstelt 1{*ICON_SHANK_01*}. - - Sommige dieren volgen je als je hun voedsel in je hand houdt. Op deze manier kun je gemakkelijker dieren samenbrengen om ze te laten paren.{*ICON*}296{*/ICON*} + + Herstelt 3{*ICON_SHANK_01*}. - - - Je kunt wolven temmen door ze botten te voeren. Als ze zijn getemd, verschijnen er hartjes om hen heen. Getemde wolven volgen en beschermen je, behalve als je ze hebt opgedragen te gaan zitten. - + + Wordt gebruikt als munitie voor bogen. - - Je hebt nu de uitleg over dieren en fokken voltooid. + + Herstelt 2,5{*ICON_SHANK_01*}. - - - In dit gebied vind je enkele pompoenen en blokken waarmee je een sneeuwgolem en een ijzergolem kunt maken. - + + Herstelt 1{*ICON_SHANK_01*}. Kan 6 keer worden gebruikt. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over golems.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over golems. - + + Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Het kan je wel vergiftigen. - - Je maakt een golem door een pompoen op een stapel blokken te zetten. + + Herstelt 1.5{*ICON_SHANK_01*} of kan worden bereid in een oven. - - Sneeuwgolems maak je door twee sneeuwblokken op elkaar te zetten en daarop een pompoen te plaatsen. Ze gooien sneeuwballen naar je vijanden. + + Herstelt 4{*ICON_SHANK_01*}. Wordt gemaakt door varkensvlees te bereiden in een oven. - - IJzergolems maak je door vier ijzerblokken op de getoonde manier te plaatsen en een pompoen op het middelste blok te zetten. Deze golems vallen je vijanden aan. + + Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Je kunt er een ocelot mee temmen. - - IJzergolems kunnen ook vanzelf verschijnen om dorpen te verdedigen en vallen je aan als jij dorpelingen aanvalt. + + Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt door rauwe kip te bereiden in een oven. - - Je mag dit gebied pas verlaten als je de speluitleg hebt voltooid. + + Herstelt 1.5{*ICON_SHANK_01*} of kan worden bereid in een oven. - - Sommige gereedschappen zijn geschikter dan andere voor een bepaald materiaal. Zo kun je het beste een schop gebruiken om zachte materialen als aarde en zand uit te graven. + + Herstelt 4{*ICON_SHANK_01*}. Wordt gemaakt door rauw rundvlees te bereiden in een oven. - - Sommige gereedschappen zijn geschikter dan andere voor een bepaald materiaal. Zo kun je het beste een bijl gebruiken om bomen te kappen. + + Wordt gebruikt om jezelf, een dier of een monster over rails te vervoeren. - - Sommige gereedschappen zijn geschikter dan andere voor een bepaald materiaal. Zo kun je het beste een houweel gebruiken om steen en erts uit te graven. Voor bepaalde blokken heb je een houweel nodig die van een beter materiaal is gemaakt. + + Wordt gebruikt als kleurstof voor lichtblauwe wol. - - Sommige gereedschappen zijn beter geschikt om aan te vallen. Een zwaard is bijvoorbeeld erg effectief tegen vijanden. + + Wordt gebruikt als kleurstof voor cyaankleurige wol. - - Tip: Hou{*CONTROLLER_ACTION_ACTION*}ingedrukt om iets uit te graven met je hand of met het voorwerp dat je vasthoudt. Mogelijk moet je eerst gereedschap maken om bepaalde blokken te kunnen uitgraven. + + Wordt gebruikt als kleurstof voor paarse wol. - - Het gereedschap dat je gebruikt is nu beschadigd. Elke keer dat je een stuk gereedschap gebruikt, raakt het meer versleten. Uiteindelijk gaat het kapot. De gekleurde balk onder het voorwerp in je inventaris geeft het huidige slijtageniveau aan. + + Wordt gebruikt als kleurstof voor lichtgroene wol. - - Hou{*CONTROLLER_ACTION_JUMP*} om omhoog te zwemmen. + + Wordt gebruikt als kleurstof voor grijze wol. - - In dit gebied vind je een mijnwagen op rails. Om in een mijnwagen te stappen, richt je de aanwijzer erop en druk je op{*CONTROLLER_ACTION_USE*}. Gebruik{*CONTROLLER_ACTION_USE*} op de knop om de mijnwagen in gang te zetten. + + Wordt gebruikt als kleurstof voor lichtgrijze wol. +(Opmerking: lichtgrijze kleurstof kan ook worden gemaakt door grijze kleurstof te combineren met bottenmeel, waardoor je 4 lichtgrijze kleurstoffen van elke inktzak kunt maken in plaats van 3.) - - In de kist naast de rivier vind je een boot. Om de boot te gebruiken, richt je de aanwijzer op het water en druk je op{*CONTROLLER_ACTION_USE*}. Gebruik{*CONTROLLER_ACTION_USE*} terwijl je richt op de boot om erin te stappen. + + Wordt gebruikt als kleurstof voor magenta wol. - - In de kist naast de vijver vind je een hengel. Neem de hengel uit de kist en hou deze in je hand. + + Geeft meer licht dan fakkels. Smelt sneeuw/ijs en kan onder water worden gebruikt. - - Met dit geavanceerde zuigermechanisme maak je een brug die zichzelf kan repareren! Druk op de knop om het te activeren en onderzoek zelf hoe de onderdelen met elkaar in verbinding staan. + + Wordt gebruikt om boeken en kaarten te maken. - - Als je de aanwijzer buiten de interface plaatst terwijl je een voorwerp vasthoudt, laat je dat voorwerp vallen. + + Kan worden gebruikt voor het maken van boekenplanken en worden betoverd voor het maken van betoverde boeken. - - Je hebt niet alle benodigde ingrediënten voor dit voorwerp. Het venster linksonder geeft aan welke ingrediënten je nodig hebt om dit voorwerp te produceren. + + Wordt gebruikt als kleurstof voor blauwe wol. - - - Gefeliciteerd, je hebt de speluitleg voltooid. De tijd in de game verloopt nu normaal. Het duurt niet lang meer totdat het nacht wordt en de monsters tevoorschijn komen! Maak dus snel je schuilplaats af! - + + Speelt muziekplaten af. - - {*EXIT_PICTURE*} Als je klaar bent om meer te ontdekken, ga je de trap op bij de verlaten mijnwerkersschuilplaats. Deze leidt naar een klein kasteel. + + Wordt gebruikt om zeer sterke gereedschappen, wapens en pantser te maken. - - Denk eraan: + + Wordt gebruikt als kleurstof voor oranje wol. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Wordt verkregen door een schaap te scheren en kan worden gekleurd met kleurstoffen. - - In de laatste versie van de game zijn er nieuwe functies toegevoegd, waaronder nieuwe gebieden in de oefenwereld. + + Wordt gebruikt als bouwmateriaal en kan worden gekleurd met kleurstoffen. Dit recept is wat overbodig, omdat wol eenvoudig kan worden verkregen van een schaap. - - {*B*}Druk op{*CONTROLLER_VK_A*} om de speluitleg te spelen.{*B*} - Druk op{*CONTROLLER_VK_B*} om de speluitleg over te slaan. + + Wordt gebruikt als kleurstof voor zwarte wol. - - In dit gebied vind je omgevingen waar je uitleg krijgt over vissen, boten, zuigers en roodsteen. + + Wordt gebruikt om goederen over rails te vervoeren. - - Buiten dit gebied vind je voorbeelden van gebouwen, landbouwgrond, mijnwagens en rails, betoveringen, drankjes, handelaren, smidsen en nog veel meer! + + Verplaatst zich over rails en duwt andere mijnwagens als er steenkool in zit. - - - Je voedselbalk is nu zo leeg dat je gezondheid niet langer automatisch wordt hersteld. - + + Hiermee kun je je sneller over het water verplaatsen dan door te zwemmen. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over de voedselbalk en eten.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de voedselbalk en eten. - + + Wordt gebruikt als kleurstof voor groene wol. - - Selecteren + + Wordt gebruikt als kleurstof voor rode wol. - - Gebruiken + + Wordt gebruikt om meteen gewassen, bomen, hoog gras, grote paddenstoelen en bloemen te laten ontstaan en kan worden gebruikt om kleurstoffen te maken. - - Terug + + Wordt gebruikt als kleurstof voor roze wol. - - Afsluiten + + Wordt gebruikt als kleurstof voor bruine wol, als ingrediënt van koekjes of voor het kweken van cacaovruchten. - - Annuleren + + Wordt gebruikt als kleurstof voor zilveren wol. - - Meedoen annuleren + + Wordt gebruikt als kleurstof voor gele wol. - - Lijst online games verversen + + Hiermee kun je van afstand aanvallen door pijlen af te schieten. - - Party-games + + Versterkt het pantser van de drager met 5. - - Alle games + + Versterkt het pantser van de drager met 3. - - Andere groep + + Versterken het pantser van de drager met 1. - - Inventaris tonen + + Versterkt het pantser van de drager met 5. - - Beschrijving tonen + + Versterken het pantser van de drager met 2. - - Ingrediënten tonen + + Versterkt het pantser van de drager met 2. - - Produceren + + Versterkt het pantser van de drager met 3. - - Maken + + Een glanzende staaf die kan worden gebruikt om gereedschappen van dit materiaal te produceren. Ontstaat door erts te smelten in een oven. - - Pakken/plaatsen + + Hiermee kun je plaatsbare blokken produceren van staven, edelstenen of kleurstoffen. Je kunt het gebruiken als duur bouwblok of als compacte opslagplaats voor erts. - - Pakken + + Als een speler, dier of monster hierop trapt, komt er een elektrische lading vrij. Houten drukplaten kun je ook activeren door er iets op te laten vallen. - - Alles pakken + + Versterkt het pantser van de drager met 8. - - De helft pakken + + Versterkt het pantser van de drager met 6. - - Plaatsen + + Versterken het pantser van de drager met 3. - - Alles plaatsen + + Versterkt het pantser van de drager met 6. - - Eén plaatsen + + IJzeren deuren kunnen alleen worden geopend met roodsteen, knoppen of schakelaars. - - Laten vallen + + Versterkt het pantser van de drager met 1. - - Alles laten vallen + + Versterkt het pantser van de drager met 3. - - Eén laten vallen + + Hiermee kun je sneller dan met de hand houten blokken kappen. - - Verwisselen + + Hiermee kun je aarde en grasblokken voorbewerken voor gewassen. - - Snel plaatsen + + Je activeert houten deuren door ze te gebruiken, door op ze te slaan of met roodsteen. - - Werkbalk leegmaken + + Versterkt het pantser van de drager met 2. - - Wat is dit? + + Versterkt het pantser van de drager met 4. - - Delen op Facebook + + Versterken het pantser van de drager met 1. - - Ander filter + + Versterkt het pantser van de drager met 2. - - Vriendverzoek versturen + + Versterken het pantser van de drager met 1. - - Pagina omlaag + + Versterkt het pantser van de drager met 2. - - Pagina omhoog + + Versterkt het pantser van de drager met 5. - - Volgende + + Wordt gebruikt voor korte trappen. - - Vorige + + Wordt gebruikt om paddenstoelenstoofpot in te doen. Als de stoofpot op is, mag je de kom houden. - - Speler verwijderen + + Wordt gebruikt om water, lava en melk in te doen en te vervoeren. - - Verven + + Wordt gebruikt om water in te doen en te vervoeren. - - Uitgraven + + Is voorzien van tekst die is ingevoerd door jou of een andere speler. - - Voeden + + Geeft meer licht dan fakkels. Smelt sneeuw/ijs en kan onder water worden gebruikt. - - Temmen + + Wordt gebruikt om explosies te veroorzaken. Na plaatsing te activeren door aan te steken met een aansteker of een elektrische lading. - - Genezen + + Wordt gebruikt om lava in te doen en te vervoeren. - - Zitten + + Laat de posities van de zon en de maan zien. - - Volg mij + + Wijst je de weg naar je startpunt. - - Eruit + + Als je de kaart vasthoudt, wordt de al ontdekte omgeving uitgetekend. Dit is erg handig om je weg te vinden. + + + Wordt gebruikt om melk in te doen en te vervoeren. - - Leeg + + Wordt gebruikt om vuur te maken, TNT te laten ontploffen en een portaal te openen. - - Zadel + + Wordt gebruikt om vis te vangen. - - Plaatsen + + Wordt geactiveerd door het luik te gebruiken, door erop te slaan of met roodsteen. Werkt als een normale deur, maar ligt als blok van 1x1 plat op de grond. - - Slaan + + Worden gebruikt als bouwmateriaal waarmee je van alles kunt maken. Kan worden geproduceerd uit alle soorten hout. - - Melken + + Wordt gebruikt als bouwmateriaal. In tegenstelling tot gewoon zand is het niet gevoelig voor zwaartekracht. - - Oppakken + + Wordt gebruikt als bouwmateriaal. - - Eten + + Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok. - - Slapen + + Wordt gebruikt voor lange trappen. Als je twee platen op elkaar plaatst, ontstaat er een normaal blok van dubbele platen. - - Ontwaken + + Wordt gebruik om licht te maken. Met fakkels kun je ook sneeuw en ijs smelten. - - Spelen + + Wordt gebruikt voor het produceren van fakkels, pijlen, borden, ladders en hekken, en als handgrepen van gereedschap en wapens. - - Rijden + + Hierin kun je blokken en voorwerpen bewaren. Plaats twee kisten naast elkaar om een grotere kist met een twee keer zo grote capaciteit te maken. - - Varen + + Wordt gebruikt als een omheining waar je niet overheen kunt springen. Telt als een hoogte van 1,5 blok voor spelers, dieren en monsters, en een hoogte van 1 blok voor andere blokken. - - Kweken + + Wordt gebruikt om verticaal te klimmen. - - Omhoog zwemmen + + Hiermee kun je op elk moment van de nacht meteen naar de ochtend gaan, zodra alle spelers in de wereld in hun bed liggen. Dit verandert ook de terugkeerlocatie van de speler. +De kleur van het bed is altijd hetzelfde, ongeacht de kleuren van de gebruikte wol. - - Openen + + Hiermee kun je een grotere selectie voorwerpen produceren. - - Andere toonhoogte + + Hiermee kun je erts smelten, houtskool en glas maken en vis en varkensvlees bereiden. - - Laten ontploffen + + IJzeren bijl - - Lezen + + Roodsteenlamp - - Hangen + + Tropenhouten trap - - Gooien + + Berkenhouten trap - - Planten + + Huidige besturing - - Bewerken + + Schedel - - Oogsten + + Kokospalm - - Doorgaan + + Sparrenhouten trap - - Volledige game ontgrendelen + + Drakenei - - Opslagbestand verwijderen + + Einde-steen - - Verwijderen + + Einde-portaalblok - - Opties + + Zandstenen trap - - Vrienden uitnodigen + + Varen - - Accepteren + + Struik - - Knippen + + Configuratie - - Wereld uitsluiten + + Produceren - - Skin selecteren + + Gebruiken - - Aansteken + + Actie - - Navigeren + + Sluipen/Omlaag vliegen - - Volledige versie installeren + + Sluipen - - Testversie installeren + + Laten vallen - - Installeren + + Voorwerp veranderen - - Opnieuw installeren + + Pauze - - Opties + + Rondkijken - - Opdracht uitvoeren + + Verplaatsen/rennen - - Creatief + + Inventaris - - Ingrediënt verplaatsen + + Springen/Omhoog vliegen - - Brandstof verplaatsen + + Springen - - Gereedschap verplaatsen + + Einde-portaal - - Pantser verplaatsen + + Pompoenplant - - Wapen verplaatsen + + Meloen - - In uitrusting + + Raam - - Spannen + + Poortje - - Loslaten + + Klimplanten - - Privileges + + Meloenplant - - Afweren + + IJzeren hek - - Pagina omhoog + + Gebarsten blokstenen - - Pagina omlaag + + Mossige blokstenen - - Verliefd + + Blokstenen - - Drinken + + Paddenstoel - - Draaien + + Paddenstoel - - Verbergen + + Gebeitelde blokstenen - - Alle vakjes leegmaken + + Bakstenen trap - - OK + + Onderwereld-wrat - - Annuleren + + Onderwereld-stenen trap - - Minecraft Store + + Onderwereld-stenen hek - - Weet je zeker dat je de huidige game wilt verlaten om mee te doen met de nieuwe game? Niet opgeslagen voortgang gaat dan verloren. + + Ketel + + + Brouwrek - - Game afsluiten + + Tovertafel - - Game opslaan + + Onderwereld-steen - - Afsluiten zonder opslaan + + Zilverviskei - - Weet je zeker dat je eventuele opslagbestanden voor deze wereld wilt overschrijven met de huidige versie van deze wereld? + + Zilvervissteen - - Weet je zeker dat je wilt afsluiten zonder op te slaan? Je raakt al je voortgang kwijt in deze wereld! + + Blokstenen trap - - Game starten + + Plompenblad - - Beschadigd opslagbestand + + Zwamvlok - - Dit opslagbestand is beschadigd. Wil je het verwijderen? + + Zilvervisbloksteen - - Weet je zeker dat je naar het hoofdmenu wilt gaan? De verbinding met alle spelers in de game wordt dan verbroken. Niet opgeslagen voortgang gaat dan verloren. + + Andere camera - - Afsluiten en opslaan + + Je gezondheid wordt automatisch aangevuld als je ten minste 9{*ICON_SHANK_01*} in je voedselbalk hebt. Je vult je voedselbalk aan door te eten. - - Afsluiten zonder opslaan + + Je voedselbalk{*ICON_SHANK_01*} loopt leeg als je je verplaatst, graaft en aanvalt. Sprinten en sprintend springen kost veel meer voedsel dan lopen en normaal springen. - - Weet je zeker dat je naar het hoofdmenu wilt gaan? Niet opgeslagen voortgang gaat verloren. + + In de inventaris worden voorwerpen opgenomen die je verzamelt en produceert.{*B*} + Druk op{*CONTROLLER_ACTION_INVENTORY*} om de inventaris te openen. - - Weet je zeker dat je naar het hoofdmenu wilt gaan? Je voortgang gaat dan verloren. + + Je kunt planken produceren van het hout dat je hebt verzameld. Open de productie-interface om ze te maken.{*PlanksIcon*} - - Nieuwe wereld maken + + Je voedselbalk raakt leeg en je bent wat gezondheid verloren. Eet de biefstuk in je inventaris om je voedselbalk aan te vullen en te genezen.{*ICON*}364{*/ICON*} - - Speluitleg spelen + + Neem voedsel in je hand en hou{*CONTROLLER_ACTION_USE*} ingedrukt om het op te eten en je voedselbalk aan te vullen. Je kunt niet eten als je voedselbalk vol is. - - Speluitleg + + Druk op{*CONTROLLER_ACTION_CRAFTING*} om de productie-interface te openen. - - Naam van je wereld + + Duw{*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren om te sprinten. Als je{*CONTROLLER_ACTION_MOVE*} naar voren houdt, blijven personages sprinten tot ze geen sprinttijd of voedsel meer over hebben. - - Geef je wereld een naam + + Gebruik{*CONTROLLER_ACTION_MOVE*} om je te verplaatsen. - - Voer de basis van je wereld in + + Gebruik{*CONTROLLER_ACTION_LOOK*} om omhoog, omlaag en rond te kijken. - - Opgeslagen wereld laden + + Hou{*CONTROLLER_ACTION_ACTION*} ingedrukt om 4 blokken hout (van boomstammen) te kappen.{*B*}Als een blok afbreekt, kunt je het oppakken door bij het zwevende blok te gaan staan. Het verschijnt dan in je inventaris. - - Druk START om mee te doen + + Hou{*CONTROLLER_ACTION_ACTION*} ingedrukt om iets uit te graven met je hand of met het voorwerp dat je vasthoudt. Mogelijk moet je eerst gereedschap maken om bepaalde blokken te kunnen uitgraven. - - De game wordt afgesloten + + Druk op{*CONTROLLER_ACTION_JUMP*} om te springen. - - Er is een fout opgetreden. Terug naar het hoofdmenu. + + Om iets te produceren, zijn vaak meerdere stappen nodig. Nu je planken hebt, kun je meer voorwerpen produceren. Maak een werkbank.{*CraftingTableIcon*} - - Verbinding mislukt + + De nacht kan plotseling vallen en daar kun je maar beter op zijn voorbereid. Je kunt pantsers en wapens produceren, maar het is verstandig om eerst voor een schuilplaats te zorgen. - - Verbinding verbroken + + Open de container. - - Verbinding met de server is verbroken. Terug naar het hoofdmenu. + + Met een houweel kun je harde blokken als steen en erts sneller uitgraven. Als je meer materialen hebt verzameld, kun je gereedschappen maken die langer meegaan en waarmee je sneller kunt werken. Je kunt dan ook hardere materialen uitgraven. Maak een houten houweel.{*WoodenPickaxeIcon*} - - Verbinding verbroken door de server + + Gebruik je houweel om wat stenen blokken uit te graven. Stenen blokken leveren keien op. Met 8 keiblokken kun je een oven bouwen. Om het steen te bereiken, moet je misschien wat aarde weggraven. Gebruik dus je schop.{*StoneIcon*} - - Je bent uit de game verwijderd + + + Je hebt grondstoffen nodig om de schuilplaats af te maken. Muren en daken kun je van elk materiaal maken, maar je moet ook een deur, wat ramen en verlichting maken. + - - Je bent uit de game verwijderd omdat je vloog + + + Er is een verlaten mijnwerkersschuilplaats in de buurt die je kunt afmaken, zodat je je kunt verschuilen voor de nacht. + - - Verbinding maken duurde te lang + + Met een bijl kun je hout en houten blokken sneller kappen. Als je meer materialen hebt verzameld, kun je gereedschappen maken die langer meegaan en waarmee je sneller kunt werken. Maak een houten bijl.{*WoodenHatchetIcon*} - - De server is vol + + Met{*CONTROLLER_ACTION_USE*} kun je voorwerpen gebruiken en plaatsen, en iets in de omgeving doen. Je kunt geplaatste voorwerpen weer oppakken door ze uit te graven met het juiste gereedschap. - - De host heeft de game verlaten. + + Neem een ander voorwerp in je hand met{*CONTROLLER_ACTION_LEFT_SCROLL*} en{*CONTROLLER_ACTION_RIGHT_SCROLL*}. - - Je kunt niet meedoen met deze game omdat niemand in de game een vriend van je is. + + Je kunt speciaal gereedschap maken waarmee je sneller blokken kunt verzamelen. Sommige gereedschappen hebben handgrepen die zijn gemaakt van stokken. Produceer nu enkele stokken.{*SticksIcon*} - - Je kunt niet meedoen met deze game omdat je al een keer bent verwijderd door de host. + + Met een schop kun je sneller zachte blokken als aarde en sneeuw uitgraven. Als je meer materialen hebt verzameld, kun je gereedschappen maken die langer meegaan en waarmee je sneller kunt werken. Maak een houten schop.{*WoodenShovelIcon*} - - Je kunt niet meedoen met deze game omdat de andere speler een oudere versie van de game heeft. + + Beweeg het richtkruis naar de werkbank en druk op {*CONTROLLER_ACTION_USE*} om 'm te openen. - - Je kunt niet meedoen met deze game omdat de andere speler een nieuwere versie van de game heeft. + + Selecteer de werkbank, beweeg het richtkruis naar de plek waar je de werkbank wilt plaatsen en druk op{*CONTROLLER_ACTION_USE*}. - - Nieuwe wereld + + In Minecraft plaats je blokken, waarmee je alles kunt bouwen wat je wilt. +'s Nachts verschijnen er monsters, dus zorg ervoor dat je dan een schuilplaats bouwt. - - Je hebt een prijs verdiend! + + - - Hoera! Je hebt een gamersafbeelding van Steve uit Minecraft verdiend! + + - - Hoera! Je hebt een gamerafbeelding van een Creeper verdiend! + + - - Volledige game kopen + + - - Je speelt de testversie en je kunt de game alleen opslaan in de volledige game. -Wil je nu de volledige versie kopen? + + - - Even geduld + + - - Geen resultaten + + - - Filter: + + Configuratie 1 - - Vrienden + + Verplaatsen (vliegend) - - Mijn score + + Spelers/uitnodigen - - Algemeen + + - - Aantal: + + Configuratie 3 - - Positie + + Configuratie 2 - - Opslaan wereld voorbereiden + + - - Segmenten samenstellen... + + - - Afwerken... + + - - Terrein aanleggen + + - - De wereld simuleren + + {*B*}Druk op{*CONTROLLER_VK_A*} om te beginnen met de speluitleg.{*B*} + Druk op{*CONTROLLER_VK_B*} als je klaar bent om zelf te spelen. - - Server activeren + + {*B*}Druk op{*CONTROLLER_VK_A*} om door te gaan. - - Terugkeerlocatie genereren + + - - Terugkeerlocatie laden + + - - Naar de Onderwereld + + - - De Onderwereld verlaten + + - - Terugkeren + + - - Wereld genereren + + - - Wereld laden + + - - Spelers opslaan + + - - Verbinden met host + + Zilvervisblok - - Terrein downloaden + + Steenplaat - - Naar offline game + + Een compacte manier om ijzer op te slaan. + + + IJzerblok - - Wacht tot de host de game heeft opgeslagen + + Eikenhouten plaat - - Naar het Einde + + Zandsteenplaat - - Het Einde verlaten + + Steenplaat - - Dit bed is bezet + + Een compacte manier om goud op te slaan. - - Je kunt alleen 's nachts slapen + + Bloem - - %s slaapt in een bed. Om het meteen dag te laten worden, moeten alle spelers tegelijkertijd in hun bed slapen. + + Witte wol - - Het bed in je huis ontbreekt of is geblokkeerd + + Oranje wol - - Je kunt nu niet rusten. Er zijn monsters in de buurt + + Goudblok - - Je slaapt in een bed. Om het meteen dag te laten worden, moeten alle spelers tegelijkertijd in hun bed slapen. + + Paddenstoel - - Gereedschap en wapens + + Roos - - Wapens + + Keiplaat - - Voedsel + + Boekenplank - - Bouwmaterialen + + TNT - - Pantser + + Bakstenen - - Mechanismen + + Fakkel - - Vervoer + + Obsidiaan - - Decoraties + + Mossige steen - - Bouwblokken + + Onderwereld-steenplaat - - Roodsteen en transport + + Eikenhouten plaat - - Diversen + + Bloksteenplaat - - Brouwen + + Baksteenplaat - - Gereedschap, wapens en pantser + + Tropenhouten plaat - - Materialen + + Berkenhouten plaat - - Afgemeld + + Sparrenhouten plaat - - Moeilijkheid + + Magenta wol - - Muziek + + Berkenbladeren - - Geluid + + Sparrenbladeren - - Gamma + + Eikenbladeren - - Gevoeligheid game + + Glas - - Gevoeligheid interface + + Spons - - Vredig + + Tropische bladeren - - Makkelijk + + Bladeren - - Normaal + + Eik - - Moeilijk + + Spar - - Je wordt vanzelf weer gezond en er zijn geen vijanden in de omgeving. + + Berk - - Er verschijnen vijanden in de omgeving, maar ze richten minder schade aan dan op het niveau Normaal. + + Sparrenhout - - Er verschijnen vijanden in de omgeving die een normale hoeveelheid schade aanrichten. + + Berkenhout - - Er verschijnen vijanden in de omgeving die veel schade aanrichten. Kijk ook uit voor de Creepers, omdat ze hun verwoestende aanval meestal niet afbreken als je op de vlucht slaat! + + Tropisch hout - - Testversie verlopen + + Wol - - Game vol + + Roze wol - - Aansluiten bij de game is mislukt omdat er geen ruimte meer is + + Grijze wol - - Tekst invoeren op bord + + Lichtgrijze wol - - Voer een tekstregel in voor je bord + + Lichtblauwe wol - - Titel invoeren + + Gele wol - - Voer een titel in voor je bericht + + Lichtgroene wol - - Bijschrift toevoegen + + Cyaankleurige wol - - Voer een bijschrift in voor je bericht + + Groene wol - - Beschrijving invoeren + + Rode wol - - Voer een beschrijving in voor je bericht + + Zwarte wol - - Inventaris + + Paarse wol - - Ingrediënten + + Blauwe wol - - Brouwrek + + Bruine wol - - Kist + + Fakkel (steenkool) - - Betoveren + + Gloeisteen - - Oven + + Drijfzand - - Ingrediënt + + Onderwereld-blok - - Brandstof + + Lapis lazuli-blok - - Automaat + + Lapis lazuli-erts - - Er is op dit moment geen downloadbare content van dit type beschikbaar voor deze titel. + + Portaal - - %s doet mee met de game. + + Pompoenlampion - - %s heeft de game verlaten. + + Suikerriet - - %s is verwijderd uit de game. + + Klei - - Weet je zeker dat je dit opslagbestand wilt verwijderen? + + Cactus - - Wachten op goedkeuring + + Pompoen - - Gecensureerd + + Hek - - Huidig nummer: + + Jukebox - - Standaardinstellingen herstellen + + Een compacte manier om lapis lazuli op te slaan. - - Weet je zeker dat je de standaardinstellingen wilt herstellen? + + Valluik - - Fout tijdens het laden + + Afgesloten kist - - Game van %s + + Diode - - Game van onbekende host + + Plakzuiger - - Gast afgemeld + + Zuiger - - Een gastspeler heeft zich afgemeld, waardoor alle gastspelers uit de game zijn verwijderd. + + Wol (elke kleur) - - Aanmelden + + Verdorde struik - - Je bent niet aangemeld. Om deze game te kunnen spelen, moet je zijn aangemeld. Wil je je nu aanmelden? + + Taart - - Multiplayer niet toegestaan + + Nootblok - - Game maken mislukt + + Automaat - - Automatisch geselecteerd + + Hoog gras - - Geen pakket: Standaardskins + + Web - - Favoriete skins + + Bed - - Uitgesloten wereld + + IJs - - De game waaraan je wilt meedoen, staat op je lijst met uitgesloten werelden. -Als je toch meedoet, wordt het de wereld verwijderd van je lijst met uitgesloten werelden. + + Werkbank - - Deze wereld uitsluiten? + + Een compacte manier om diamanten op te slaan. - - Weet je zeker dat je deze wereld wilt toevoegen aan je lijst met uitgesloten werelden? -Als je dit bevestigt met OK, wordt deze game ook afgesloten. + + Diamantblok - - Verwijderen van lijst met uitgesloten werelden + + Oven - - Interval automatisch opslaan + + Akker - - Interval automatisch opslaan: UIT + + Gewassen - - min. + + Diamanterts - - Dit kan hier niet geplaatst worden! + + Monsterkooi - - Je mag geen lava in de buurt van een terugkeerlocatie plaatsen, omdat verschijnende spelers anders direct doodgaan. + + Vuur - - Doorzichtigheid interface + + Fakkel (houtskool) - - Automatisch opslaan wereld voorbereiden + + Roodsteenstof - - Formaat Scherminfo + + Kist - - Formaat Scherminfo (gedeeld scherm) + + Eikenhouten trap - - Basis + + Bord - - Skinpakket ontgrendelen + + Roodsteenerts - - Om de geselecteerde skin te kunnen gebruiken, moet je dit skinpakket ontgrendelen. -Wil je dit skinpakket nu ontgrendelen? + + IJzeren deur - - Texturepakket ontgrendelen + + Drukplaat - - Om dit texturepakket te kunnen gebruiken voor je wereld, moet je het ontgrendelen. -Wil je het nu ontgrendelen? + + Sneeuw - - Testversie texturepakket + + Toets - - Je gebruikt een testversie van het texturepakket. Je kunt deze wereld pas opslaan als je de volledige versie hebt ontgrendeld. -Wil je de volledige versie van het texturepakket nu ontgrendelen? + + Roodsteenfakkel - - Texturepakket niet aanwezig + + Hendel - - Volledige versie ontgrendelen + + Rails - - Testversie downloaden + + Ladder - - Volledige versie downloaden + + Houten deur - - Deze wereld gebruikt een combinatiepakket of texturepakket dat je niet hebt! -Wil je het combinatiepakket of texturepakket nu installeren? + + Stenen trap - - Testversie downloaden + + Detectierails - - Volledige versie downloaden + + Aangedreven rails - - Speler verwijderen + + Je hebt genoeg keien verzameld om een oven te kunnen bouwen. Gebruik hiervoor je werkbank. - - Weet je zeker dat je deze speler uit de game wilt verwijderen? De speler kan pas weer meedoen als je de wereld opnieuw start. + + Hengel - - Gamerafbeelding-pakketten + + Klok - - Thema's + + Gloeisteenstof - - Skinpakketten + + Mijnwagen met oven - - Vrienden van vrienden toestaan + + Ei - - Je kunt niet meedoen met deze game omdat alleen vrienden van de host mogen meedoen. + + Kompas - - Je kunt niet meedoen + + Rauwe vis - - Geselecteerd + + Rozenrood - - Geselecteerde skin: + + Cactusgroen - - Downloadbare content beschadigd + + Cacaobonen - - Deze downloadbare content is beschadigd en kan niet worden gebruikt. Je moet de content verwijderen en opnieuw installeren via het menu in de Minecraft Store. + + Gebakken vis - - Bepaalde downloadbare content is beschadigd en kan niet worden gebruikt. Je moet deze content verwijderen en opnieuw installeren via het menu in de Minecraft Store. + + Kleurstof - - Je speltype is veranderd + + Inktzak - - Je wereld hernoemen + + Mijnwagen met kist - - Voer de nieuwe naam in voor je wereld + + Sneeuwbal - - Speltype: Survival + + Boot - - Speltype: Creatief + + Leer - - Survival + + Mijnwagen - - Creatief + + Zadel - - Gemaakt in het speltype Survival + + Roodsteen - - Gemaakt in het speltype Creatief + + Emmer melk - - Wolken renderen + + Papier - - Wat wil je doen met dit opslagbestand? + + Boek - - Opslagbestand hernoemen + + Slijmbal - - Automatisch opslaan over %d... + + Baksteen - - Aan + + Klei - - Uit + + Suikerriet - - Normaal + + Lapis lazuli - - Supervlak + + Kaart - - Als deze optie is ingeschakeld zal het een online spel worden. + + Muziekplaat - '13' - - Als deze optie is ingeschakeld, mogen alleen uitgenodigde spelers meedoen. + + Muziekplaat - 'Cat' - - Als deze optie is ingeschakeld, mogen vrienden van spelers op je Vriendenlijst meedoen. + + Bed - - Als deze optie is ingeschakeld, kunnen spelers andere spelers verwonden. Alleen voor het speltype Survival. + + Roodsteenversterker - - Als deze optie is uitgeschakeld, mogen andere spelers pas na toestemming bouwen of uitgraven. + + Koekje - - Als deze optie is ingeschakeld, kan vuur overslaan naar brandbare blokken in de buurt. + + Muziekplaat - 'Blocks' - - Als deze optie is ingeschakeld, ontploft TNT als het wordt geactiveerd. + + Muziekplaat - 'Mellohi' - - Als deze optie is ingeschakeld, wordt de Onderwereld opnieuw gegenereerd. Dit is handig als je een ouder opslagbestand zonder Onderwereld-forten hebt. + + Muziekplaat - 'Stal' - - Als deze optie is ingeschakeld, worden bouwwerken als dorpen en vestingen gegenereerd in de wereld. + + Muziekplaat - 'Strad' - - Als deze optie is ingeschakeld, wordt een volledig vlakke Bovenwereld en Onderwereld gegenereerd. + + Muziekplaat - 'Chirp' - - Als deze optie is ingeschakeld, staat er een kist met handige voorwerpen bij de terugkeerlocatie van de speler. + + Muziekplaat - 'Far' - - Skinpakketten + + Muziekplaat - 'Mall' - - Thema's + + Taart - - Gamerafbeeldingen + + Grijze kleurstof - - Avatarvoorwerpen + + Roze kleurstof - - Texturepakketten + + Lichtgroene kleurstof - - Combinatiepakketten + + Paarse kleurstof - - {*PLAYER*} is verteerd door het vuur + + Cyaan-kleurstof - - {*PLAYER*} brandde dood + + Lichtgrijze kleurstof - - {*PLAYER*} wilde zwemmen in de lava + + Paardenbloemgeel - - {*PLAYER*} stikte in een muur + + Bottenmeel - - {*PLAYER*} verdronk + + Bot - - {*PLAYER*} verhongerde + + Suiker - - {*PLAYER*} is doodgeprikt + + Lichtblauwe kleurstof - - {*PLAYER*} kwam te hard neer + + Magenta kleurstof - - {*PLAYER*} viel uit de wereld + + Oranje kleurstof - - {*PLAYER*} is dood + + Bord - - {*PLAYER*} werd opgeblazen + + Leren tuniek - - {*PLAYER*} werd gedood door magische krachten + + IJzeren borstplaat - - {*PLAYER*} werd gedood door de adem van de Einder-draak + + Diamanten borstplaat - - {*PLAYER*} werd gedood door {*SOURCE*} + + IJzeren helm - - {*PLAYER*} werd gedood door {*SOURCE*} + + Diamanten helm - - {*PLAYER*} is doodgeschoten door {*SOURCE*} + + Gouden helm - - {*PLAYER*} werd gedood door een vuurbal van {*SOURCE*} + + Gouden borstplaat - - {*PLAYER*} is doodgeslagen door {*SOURCE*} + + Gouden beenbeschermers - - {*PLAYER*} is gedood door {*SOURCE*} + + Leren laarzen - - Grondsteenmist + + IJzeren laarzen - - Scherminfo weergeven + + Leren broek - - Hand weergeven + + IJzeren beenbeschermers - - Doodsmeldingen + + Diamanten beenbeschermers - - Geanimeerd personage + + Leren kap - - Passende skinanimatie + + Stenen schoffel - - Je kunt geen voorwerpen meer uitgraven of gebruiken + + IJzeren schoffel - - Je kunt nu voorwerpen uitgraven en gebruiken + + Diamanten schoffel - - Je kunt geen blokken meer plaatsen + + Diamanten bijl - - Je kunt nu blokken plaatsen + + Gouden bijl - - Je kunt nu deuren en schakelaars gebruiken + + Houten schoffel - - Je kunt geen deuren en schakelaars meer gebruiken + + Gouden schoffel - - Je kunt nu houders (zoals kisten) gebruiken + + Maliënborstplaat - - Je kunt geen houders (zoals kisten) meer gebruiken + + Maliënbeenbeschermers - - Je kunt geen mobs meer aanvallen + + Maliënlaarzen - - Je kunt nu mobs aanvallen + + Houten deur - - Je kunt geen spelers meer aanvallen + + IJzeren deur - - Je kunt nu spelers aanvallen + + Maliënhelm - - Je kunt geen dieren meer aanvallen + + Diamanten laarzen - - Je kunt nu dieren aanvallen + + Veer - - Je bent nu een moderator + + Buskruit - - Je bent geen moderator meer + + Tarwezaden - - Je kunt nu vliegen + + Kom - - Je kunt niet meer vliegen + + Paddenstoelenstoofpot - - Je kunt niet langer uitgeput raken + + Draad - - Je kunt nu uitgeput raken + + Tarwe - - Je bent nu onzichtbaar + + Gebraden varkensvlees - - Je bent niet langer onzichtbaar + + Schilderij - - Je bent nu onkwetsbaar + + Gouden appel - - Je bent niet langer onkwetsbaar + + Brood - - %d MSP + + Vuursteen - - Einder-draak + + Rauw varkensvlees - - %s is nu in het Einde + + Stok - - %s heeft het Einde verlaten + + Emmer - - -{*C3*}Ik zie de speler die je bedoelde.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Ja. Pas op. Dit wezen heeft nu een hoger niveau. Het kan onze gedachten lezen.{*EF*}{*B*}{*B*} -{*C2*}Maakt niet uit. Het wezen denkt dat we bij het spel horen.{*EF*}{*B*}{*B*} -{*C3*}Dit wezen was leuk. Het was een goede speler. Het gaf niet op.{*EF*}{*B*}{*B*} -{*C2*}Het leest onze gedachten alsof het woorden zijn die op het scherm staan.{*EF*}{*B*}{*B*} -{*C3*}Het verkiest de droomwereld van het spel om zich over te geven aan zijn verbeelding.{*EF*}{*B*}{*B*} -{*C2*}Woorden vormen de ideale toegang tot die wereld. Ze zijn flexibel. En minder angstaanjagend dan de werkelijkheid achter het scherm.{*EF*}{*B*}{*B*} -{*C3*}Ooit hoorden ze stemmen. Voordat spelers konden lezen. Dat was vroeger, toen iedereen die niet meespeelde de spelers heksen of tovenaars noemde. En spelers droomden dat ze konden vliegen, op stokken die waren betoverd door demonen.{*EF*}{*B*}{*B*} -{*C2*}Wat droomde deze speler?{*EF*}{*B*}{*B*} -{*C3*}Dit wezen droomde over zonlicht en bomen. Over vuur en water. Het droomde dat het iets creëerde. En dat het iets vernietigde. Dat het jaagde en zelf werd opgejaagd. Het droomde over een schuilplaats.{*EF*}{*B*}{*B*} -{*C2*}Ah... de oorspronkelijke toegang. Een miljoen jaar oud en hij werkt nog steeds. Maar wat creëerde dit wezen nou echt, in die werkelijkheid achter het scherm?{*EF*}{*B*}{*B*} -{*C3*}Samen met miljoenen anderen bouwde het aan een waarachtige wereld in de plooien van de {*EF*}{*NOISE*}{*C3*} en maakte het een {*EF*}{*NOISE*}{*C3*} voor {*EF*}{*NOISE*}{*C3*} in de {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} -{*C2*}Het wezen kan nog niet alles lezen.{*EF*}{*B*}{*B*} -{*C3*}Nee. Het heeft het hoogste niveau nog niet bereikt. Dat kan alleen in de lange droom van het leven en niet in de korte droom van het spel.{*EF*}{*B*}{*B*} -{*C2*}Weet het wezen van onze liefde? Dat het universum het beste met hem voor heeft?{*EF*}{*B*}{*B*} -{*C3*}Soms hoort het wezen het universum, als gedachten afwezig zijn.{*EF*}{*B*}{*B*} -{*C2*}Maar soms is het verdrietig in de lange droom. Dan maakt het werelden zonder zomers, huivert het onder de duistere zon en denkt het dat zijn trieste creatie de werkelijkheid is.{*EF*}{*B*}{*B*} -{*C3*}Maar de wereld kan niet zonder verdriet. Het verdriet is verbonden met zijn eigen rol. Dat mogen we niet veranderen.{*EF*}{*B*}{*B*} -{*C2*}Soms, als ze in diepe slaap zijn, wil ik het hen vertellen. Ik wil hen vertellen dat ze waarachtige werelden bouwen in de werkelijkheid. Soms wil ik hen vertellen hoe belangrijk ze zijn voor het universum. Soms, als ze de verbondenheid al een tijdje niet meer hebben gevoeld, wil ik hen helpen met het uitspreken van het woord dat ze zo vrezen.{*EF*}{*B*}{*B*} -{*C3*}Het leest onze gedachten.{*EF*}{*B*}{*B*} -{*C2*}Soms laat het me koud. Soms wil ik hen vertellen dat de wereld die hun realiteit is niet meer is dan {*EF*}{*NOISE*}{*C2*} en {*EF*}{*NOISE*}{*C2*}. Dan wil ik hen vertellen dat ze {*EF*}{*NOISE*}{*C2*} in de {*EF*}{*NOISE*}{*C2*} zijn. Ze zien zo weinig van de realiteit in hun lange droom.{*EF*}{*B*}{*B*} -{*C3*}En toch spelen ze het spel.{*EF*}{*B*}{*B*} -{*C2*}Maar het zou zo gemakkelijk zijn om het hen te vertellen...{*EF*}{*B*}{*B*} -{*C3*}Te krachtig voor deze droom. Door hen te vertellen hoe ze moeten leven kunnen ze niet meer leven.{*EF*}{*B*}{*B*} -{*C2*}Ik vertel het wezen niet hoe het moet leven.{*EF*}{*B*}{*B*} -{*C3*}Het wezen wordt rusteloos.{*EF*}{*B*}{*B*} -{*C2*}Ik zal het een verhaal vertellen.{*EF*}{*B*}{*B*} -{*C3*}Maar niet de waarheid.{*EF*}{*B*}{*B*} -{*C2*}Nee. Een verhaal dat de waarheid veilig opsluit, in een kooi vol woorden. Niet de allesvernietigende waarheid.{*EF*}{*B*}{*B*} -{*C3*}Geef het weer een lichaam.{*EF*}{*B*}{*B*} -{*C2*}Ja. Wezen, speler...{*EF*}{*B*}{*B*} -{*C3*}Noem het wezen bij naam.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Speler van spellen.{*EF*}{*B*}{*B*} -{*C3*}Goed.{*EF*}{*B*}{*B*} + + Emmer water - - -{*C2*}Haal even diep adem. En nog eens. Voel de zuurstof in je longen. Voel je ledematen weer. Ja, beweeg je vingers. Je hebt weer een lichaam, op vaste grond en in de lucht. Keer terug naar de lange droom. Goed zo. Je lichaam raakt het universum weer aan, alsof jullie losstaan van elkaar. Alsof wij losstaan van elkaar.{*EF*}{*B*}{*B*} -{*C3*}Wie wij zijn? Ooit noemde men ons de geest van de berg. Vader zon, moeder maan. Oeroude geesten, dierlijke geesten. Jinn. Geesten. De groene mens. Toen goden, demonen. Engelen. Klopgeesten. Aliens, buitenaardse wezens. Leptonen, quarks. De woorden veranderen. Maar wij niet.{*EF*}{*B*}{*B*} -{*C2*}Wij zijn het universum. Wij zijn alles waarvan je denkt dat buiten jou staat. Je kijkt nu naar ons, met je huid en je ogen. En waarom raakt het universum je huid aan en schijnt het je bij? Om jou te kunnen zien, speler. Om je te leren kennen. En om ons bekend te maken. Ik zal je een verhaal vertellen.{*EF*}{*B*}{*B*} -{*C2*}Er was eens een speler, een wezen.{*EF*}{*B*}{*B*} -{*C3*}Dat wezen was jij, {*PLAYER*}.{*EF*}{*B*}{*B*} -{*C2*}Soms dacht het wezen dat het een mens was, op de dunne korst van een ronddraaiende bol van gesmolten steen. De bol van gesmolten steen draaide rond een bol van brandend gas die 330.000 keer zo groot was. Ze lagen zo ver van elkaar af, dat licht er acht minuten over deed om van de ene bol de andere te bereiken. Het licht was informatie van een ster die je huid kon verbranden op 150 miljoen kilometer afstand.{*EF*}{*B*}{*B*} -{*C2*}Soms droomde het wezen dat het een mijnwerker was, op een vlakke en oneindige wereld. De zon was een wit vierkant. De dagen waren kort, want er was veel te doen. En doodgaan was niet meer dan een tijdelijk ongemak.{*EF*}{*B*}{*B*} -{*C3*}In zijn dromen verdwaalde het wezen soms in een verhaal.{*EF*}{*B*}{*B*} -{*C2*}In zijn dromen was het wezen soms iets anders, ergens anders. Soms waren deze dromen verontrustend. Soms waren ze ook heel mooi. Soms ging de droom van het wezen over in een andere droom, en daarna weer in een andere.{*EF*}{*B*}{*B*} -{*C3*}Soms droomde het wezen dat het naar woorden keek op een scherm.{*EF*}{*B*}{*B*} -{*C2*}Kom, we gaan terug.{*EF*}{*B*}{*B*} -{*C2*}De atomen van de speler lagen overal: op het gras, in de rivieren, in de lucht en op de grond. Een vrouw verzamelde de atomen. Ze dronk ervan, at ze en ademde ze in. En in het lichaam van de vrouw werd de speler, het wezen, gevormd.{*EF*}{*B*}{*B*} -{*C2*}En het wezen kwam vanuit het warme, donkere lichaam van zijn moeder terecht in een lange droom.{*EF*}{*B*}{*B*} -{*C2*}En het wezen was een nieuw verhaal dat nog nooit was verteld, geschreven in letters van dna. En het wezen was een nieuw programma dat nog nooit was gestart, gegenereerd door een broncode die een miljard jaar oud was. En het wezen was een nieuwe mens die nog nooit had geleefd, gemaakt van alleen wat melk en liefde.{*EF*}{*B*}{*B*} -{*C3*}Jij bent dat wezen. Jij bent die speler. Het verhaal. Het programma. De mens. Gemaakt van alleen wat melk en liefde.{*EF*}{*B*}{*B*} -{*C2*}We gaan nog verder terug.{*EF*}{*B*}{*B*} -{*C2*}De zeven miljard miljard miljard atomen in het lichaam van het wezen ontstonden in de kern van een ster, lang voordat dit spel bestond. Het wezen is dus ook informatie van een ster. En het wezen doorloopt het verhaal, in een bos vol informatie dat is aangeplant door ene Julian, op een vlakke en oneindige wereld die is gecreëerd door ene Markus in de eigen kleine wereld van het wezen, dat leeft in een universum dat is gemaakt door...{*EF*}{*B*}{*B*} -{*C3*}Ssst... Soms maakte het wezen een eigen kleine wereld die zacht en warm en eenvoudig was. En die soms hard en koud en complex was. Soms bouwde het wezen een model van het universum in zijn hoofd - energiedeeltjes die zich verplaatsten door uitgestrekte lege ruimten. Soms noemde het deze deeltjes 'elektronen' en 'protonen'.{*EF*}{*B*}{*B*} + + Emmer lava - - -{*C2*}Soms noemde het wezen ze 'planeten' en 'sterren'.{*EF*}{*B*}{*B*} -{*C2*}Soms dacht het dat het in een universum leefde dat bestond uit energie die aan en uit kon. Nullen en enen. Regels code. Soms dacht het wezen dat het een spel speelde. Soms dacht het dat het woorden op een scherm las.{*EF*}{*B*}{*B*} -{*C3*}Jij bent het wezen, de speler, jij leest de woorden...{*EF*}{*B*}{*B*} -{*C2*}Ssst... Soms las het wezen regels code op een scherm. Daar maakte het woorden van, en aan die woorden gaf het een betekenis, en die betekenis vertaalde het naar gevoelens, emoties, theorieën en ideeën - en het wezen ging sneller en dieper ademen en realiseerde zich dat het leefde, dat die duizend doden niet echt waren - de speler leefde.{*EF*}{*B*}{*B*} -{*C3*}Jij. Jij. Jij leeft.{*EF*}{*B*}{*B*} -{*C2*}en soms dacht het wezen dat het universum met hem sprak via het zonlicht dat op hem viel door de ruisende bladeren van loofbomen{*EF*}{*B*}{*B*} -{*C3*}en soms dacht het wezen dat het universum met hem sprak via het licht dat uit de hemel viel tijdens heldere winternachten, waarbij een lichtvlekje in de hoek van het oog van het wezen misschien wel een ster was die een miljoen keer zo groot was als de zon en die zijn planeten omsmolt tot plasma zodat hij voor even zichtbaar was voor het wezen dat aan de andere kant van het universum naar huis wandelde en plotseling voedsel rook, dicht bij de vertrouwde deur, klaar om weer te gaan dromen{*EF*}{*B*}{*B*} -{*C2*}en soms dacht het wezen dat het universum met hem sprak via de nullen en enen, via de elektriciteit in de wereld, via de voorbij rollende woorden op een scherm aan het einde van een droom.{*EF*}{*B*}{*B*} -{*C3*}En het universum zei: 'Ik hou van je'{*EF*}{*B*}{*B*} -{*C2*}en het universum zei dat je het spel goed had gespeeld{*EF*}{*B*}{*B*} -{*C3*}en het universum zei dat alles wat je nodig hebt in jezelf zit{*EF*}{*B*}{*B*} -{*C2*}en het universum zei dat je sterker bent dan je weet{*EF*}{*B*}{*B*} -{*C3*}en het universum zei dat jij het daglicht bent{*EF*}{*B*}{*B*} -{*C2*}en het universum zei dat jij de nacht bent{*EF*}{*B*}{*B*} -{*C3*}en het universum zei dat de duisternis waartegen je vecht in jezelf zit{*EF*}{*B*}{*B*} -{*C2*}en het universum zei dat het licht dat je zoekt in jezelf zit{*EF*}{*B*}{*B*} -{*C3*}en het universum zei dat je niet alleen bent{*EF*}{*B*}{*B*} -{*C2*}en het universum zei dat je bent verbonden met alle andere dingen{*EF*}{*B*}{*B*} -{*C3*}en het universum zei dat je het universum bent dat van zichzelf proeft, met zichzelf praat en zijn eigen code leest{*EF*}{*B*}{*B*} -{*C2*}en het universum zei: 'Ik hou van je, omdat jij de liefde bent'{*EF*}{*B*}{*B*} -{*C3*}En het spel was voorbij en de speler ontwaakte uit de droom. En de speler ging opnieuw dromen. En de speler droomde opnieuw en droomde beter. En de speler was het universum. En de speler was de liefde.{*EF*}{*B*}{*B*} -{*C3*}Jij bent de speler.{*EF*}{*B*}{*B*} -{*C2*}Ontwaak.{*EF*} + + Gouden laarzen - - Onderwereld resetten + + IJzerstaaf - - Weet je zeker dat je de Onderwereld in dit opslagbestand wilt terugzetten naar de standaardsituatie? Je verliest dan alles wat je hebt gebouwd in de Onderwereld! + + Goudstaaf - - Onderwereld resetten + + Aansteker - - Onderwereld niet resetten + + Steenkool - - Je kunt deze zwamkoe nu niet scheren. Je hebt al het maximale aantal varkens, schapen, koeien en katten. + + Houtskool - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal varkens, schapen, koeien en katten. + + Diamant - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal zwamkoeien. + + Appel - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal wolven in deze wereld. + + Boog - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal kippen in deze wereld. + + Pijl - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal inktvissen in deze wereld. + + Muziekplaat - 'Ward' - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal vijanden in deze wereld. + + + Druk op{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*} om een andere voorwerpgroep te kiezen. Selecteer de groep Bouwmaterialen.{*StructuresIcon*} + - - Je kunt nu geen spawn-ei gebruiken. Je hebt al het maximale aantal dorpelingen in deze wereld. + + + Druk op{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*} om een andere voorwerpgroep te kiezen voor de voorwerpen die je wilt produceren. Selecteer de groep Gereedschappen.{*ToolsIcon*} + - - Je hebt al het maximale aantal schilderijen/voorwerplijsten in deze wereld. + + + Plaats de werkbank die je hebt gebouwd in de wereld, zodat je een grotere selectie voorwerpen kunt maken.{*B*} + Druk nu op{*CONTROLLER_VK_B*} om de productie-interface te sluiten. + - - Je kunt geen vijanden spawnen als je speelt op het niveaus Vredig. + + + Met de gereedschappen die je nu hebt, kun je al van alles doen. Bovendien is het nu gemakkelijker om allerlei andere materialen te verzamelen.{*B*} + Druk nu op{*CONTROLLER_VK_B*} om de productie-interface te sluiten. + - - Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende varkens, schapen, koeien en katten. + + + Om iets te produceren, zijn vaak meerdere stappen nodig. Nu je planken hebt, kun je meer voorwerpen produceren. Gebruik{*CONTROLLER_MENU_NAVIGATE*} om het te produceren voorwerp te kiezen. Selecteer de werkbank.{*CraftingTableIcon*} + - - Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende wolven. + + + Gebruik{*CONTROLLER_MENU_NAVIGATE*} om het te produceren voorwerp te kiezen. Van sommige voorwerpen zijn er verschillende versies, afhankelijk van de materialen die ervoor worden gebruikt. Selecteer de houten schop.{*WoodenShovelIcon*} + - - Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende kippen. + + Je kunt planken produceren van het hout dat je hebt verzameld. Selecteer het plank-pictogram en druk op{*CONTROLLER_VK_A*} om de planken te produceren.{*PlanksIcon*} - - Dit dier kan niet verliefd worden. Je hebt al het maximale aantal parende zwamkoeien. + + + Met een werkbank kun je een grotere selectie voorwerpen maken. Produceren op een werkbank werkt hetzelfde als normaal produceren, maar je hebt een groter productieveld en kunt dus meer combinaties van ingrediënten maken. + - - Je hebt al het maximale aantal boten in deze wereld. + + + In het productieveld zie je wat je nodig hebt om het nieuwe voorwerp te maken. Druk op{*CONTROLLER_VK_A*} om het voorwerp te produceren en plaats het vervolgens in je inventaris. + - - Je hebt al het maximale aantal mobhoofden in deze wereld. + + + Blader door de voorwerpgroepen bovenaan met{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*}, selecteer de groep met het voorwerp dat je wilt produceren en gebruik{*CONTROLLER_MENU_NAVIGATE*} om dat voorwerp te selecteren. + - - Kijken omkeren + + + Je ziet nu een lijst met de ingrediënten die je nodig hebt om het geselecteerde voorwerp te produceren. + - - Linkshandig + + + Je ziet nu de beschrijving van het geselecteerde voorwerp. Dit geeft je een idee van de mogelijke toepassingen. + - - Je bent dood! + + + Rechtsonder in de productie-interface zie je je inventaris. In dit gedeelte zie je ook een beschrijving van het geselecteerde voorwerp en de ingrediënten die je daarvoor nodig hebt. + - - Terugkeren + + + Sommige voorwerpen maak je niet met de werkbank, maar met de oven. Maak nu een oven.{*FurnaceIcon*} + - - Beschikbare downloadbare content + + Grind - - Andere skin + + Gouderts - - Instructies + + IJzererts - - Besturing + + Lava - - Instellingen + + Zand - - Credits + + Zandsteen - - Content opnieuw installeren + + Steenkoolerts - - Debug-instellingen + + {*B*} + Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al weet hoe je een oven moet gebruiken. + - - Overslaande branden + + + Dit is de oven-interface. Met een oven kun je voorwerpen veranderen door ze te verhitten. Zo kun je ijzererts in de oven omsmelten tot ijzerstaven. + - - TNT-explosies + + + Plaats de oven die je hebt gemaakt in de wereld. De beste plek voor de oven is je schuilplaats.{*B*} + Druk nu op{*CONTROLLER_VK_B*} om de productie-interface te sluiten. + - - Speler tegen speler + + Hout - - Spelers vertrouwen + + Eikenhout - - Privileges host + + + Plaats brandstof in het onderste vakje van de oven en het te verhitten voorwerp in het bovenste vakje. Vervolgens wordt de oven ontstoken en verschijnt het resultaat in het vakje rechts. + - - Bouwwerken genereren + + {*B*} + Druk op{*CONTROLLER_VK_X*} om je inventaris weer te openen. + - - Supervlakke wereld + + {*B*} + Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al weet hoe je de inventaris moet gebruiken. + - - Bonuskist + + + Dit is je inventaris. Hier zie je de voorwerpen die je kunt vasthouden en alle andere voorwerpen die je bij je hebt. Je ziet hier ook je pantser. + - - Wereldopties + + + {*B*} + Druk op{*CONTROLLER_VK_A*} om verder te gaan met de speluitleg.{*B*} + Druk op{*CONTROLLER_VK_B*} als je klaar bent om zelf te spelen. + - - Kan bouwen en uitgraven + + + Als je de aanwijzer buiten de interface plaatst, laat je het voorwerp vallen. + - - Kan deuren en schakelaars gebruiken + + + Verplaats dit voorwerp naar een ander inventarisvakje en bevestig met{*CONTROLLER_VK_A*}. + Als je meerdere voorwerpen hebt opgepakt, gebruik je{*CONTROLLER_VK_A*} om ze allemaal te plaatsen of{*CONTROLLER_VK_X*} om er maar één te plaatsen. + - - Kan houders openen + + + Gebruik{*CONTROLLER_MENU_NAVIGATE*} om de aanwijzer te verplaatsen. Gebruik{*CONTROLLER_VK_A*} om het voorwerp onder de aanwijzer te pakken. + Je pakt alle voorwerpen tegelijk op als het vakje meerdere voorwerpen bevat. Je kunt ook de helft pakken met{*CONTROLLER_VK_X*}. + - - Kan spelers aanvallen + + + Je hebt het eerste deel van de speluitleg voltooid. + - - Kan dieren aanvallen + + Gebruik de oven om wat glas te maken. Terwijl je wacht tot het glas klaar is, kun je alvast wat meer materialen voor je schuilplaats verzamelen. - - Moderator + + Gebruik de oven om wat houtskool te maken. Terwijl je wacht tot de kool klaar is, kun je alvast wat meer materialen voor je schuilplaats verzamelen. - - Speler verwijderen + + Gebruik{*CONTROLLER_ACTION_USE*} om de oven in de wereld te plaatsen. Daarna open je de oven. - - Kan vliegen + + Het kan 's nachts erg donker worden, dus heb je wat verlichting nodig voor je schuilplaats. Gebruik nu de productie-interface om een fakkel te maken van stokken en houtskool.{*TorchIcon*} - - Uitputting uitschakelen + + Gebruik{*CONTROLLER_ACTION_USE*} om de deur te plaatsen. Met{*CONTROLLER_ACTION_USE*} kun je een houten deur in de wereld openen en dichtdoen. - - Onzichtbaar + + Een goede schuilplaats heeft een deur, zodat je naar binnen en buiten kunt zonder muren uit te graven. Maak nu een houten deur.{*WoodenDoorIcon*} - - Host-opties + + + Wil je meer informatie over een voorwerp? Plaats dan de aanwijzer op het voorwerp en druk op {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + - - Spelers/uitnodigen + + + Dit is de productie-interface. Met deze interface kun je verzamelde voorwerpen met elkaar combineren om nieuwe voorwerpen te maken. + - - Online game + + + Druk nu op{*CONTROLLER_VK_B*} om de inventaris in het speltype Creatief te sluiten. + - - Alleen op uitnodiging + + + Wil je meer informatie over een voorwerp? Plaats dan de aanwijzer op het voorwerp en druk op {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + - - Meer opties + + {*B*} + Druk op{*CONTROLLER_VK_X*} om te zien welke ingrediënten je nodig hebt om het geselecteerde voorwerp te maken. + - - Laden + + {*B*} + Druk op{*CONTROLLER_VK_X*} voor een beschrijving van het voorwerp. + - - Nieuwe wereld + + {*B*} + Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al weet hoe je moet produceren. + - - Naam wereld + + + Blader door de voorwerpgroepen bovenaan met{*CONTROLLER_VK_LB*} en{*CONTROLLER_VK_RB*}, en selecteer de groep met het voorwerp dat je wilt pakken. + - - Basis voor nieuwe wereld + + {*B*} + Druk op{*CONTROLLER_VK_A*} om door te gaan.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al weet hoe je de inventaris in het speltype Creatief moet gebruiken. + - - Leeg laten voor een willekeurige basis + + + Dit is de inventaris in het speltype Creatief. Je ziet de voorwerpen die je kunt vasthouden en alle andere voorwerpen die je kunt kiezen. + - - Spelers + + + Druk nu op{*CONTROLLER_VK_B*} om de inventaris te sluiten. + - - Meedoen aan game + + + Als je de aanwijzer buiten de interface plaatst, laat je het voorwerp in de wereld vallen. Druk op{*CONTROLLER_VK_X*} om alle voorwerpen uit de werkbalk te verwijderen. + - - Game starten + + + De aanwijzer gaat automatisch naar een vakje in de werkbalk. Plaats het voorwerp met{*CONTROLLER_VK_A*}. Als je het voorwerp hebt geplaatst, gaat de aanwijzer terug naar de voorwerplijst. Hier kun je een ander voorwerp kiezen. + - - Geen games gevonden + + Gebruik{*CONTROLLER_MENU_NAVIGATE*} om de aanwijzer te verplaatsen. Gebruik{*CONTROLLER_VK_A*} om een voorwerp uit de lijst te kiezen en druk op{*CONTROLLER_VK_Y*} om de volledige stapel van dat voorwerp te pakken. - - Game spelen + + Water - - Klassementen + + Glazen fles - - Hulp en opties + + Fles water - - Volledige game kopen + + Spinnenoog - - Game hervatten + + Goudklomp - - Game opslaan + + Onderwereld-wrat - - Moeilijkheid: + + {*splash*}{*prefix*}Drankje {*postfix*} - - Speltype: + + Gegist spinnenoog - - Bouwmaterialen: + + Ketel - - Type wereld: + + Einder-oog - - Speler tegen Speler: + + Glinsterende meloen - - Spelers vertrouwen: + + Blaze-poeder - - TNT: + + Magmacrème - - Overslaande branden: + + Brouwrek - - Thema opnieuw installeren + + Ghast-traan - - Gamerafbeelding 1 opnieuw installeren + + Pompoenzaden - - Gamerafbeelding 2 opnieuw installeren + + Meloenzaden - - Avatarvoorwerp 1 opnieuw installeren + + Rauwe kip - - Avatarvoorwerp 2 opnieuw installeren + + Muziekplaat - '11' - - Avatarvoorwerp 3 opnieuw installeren + + Muziekplaat - 'Where are we now' - - Opties + + Schaar - - Geluid + + Gebraden kip - - Gevoeligheid + + Einder-parel - - Graphics + + Stuk meloen - - Gebruikersinterface + + Blaze-staf - - Resetten + + Rauw rundvlees - - Camerabeweging + + Biefstuk - - Hints + + Bedorven vlees - - Tooltips in de game + + Priesterfles - - 2 spelers op verticaal gedeeld scherm + + Eikenhouten planken - - Klaar + + Sparrenhouten planken - - Tekst bord wijzigen: + + Berkenhouten planken - - Voer de informatie over je screenshot in + + Grasblok - - Bijschrift + + Aarde - - Screenshot uit het spel + + Kei - - Tekst bord wijzigen: + + Tropenhouten planken - - De klassieke textures, pictogrammen en gebruikersinterface van Minecraft! + + Jonge berk - - Alle combinatiewerelden weergeven + + Jonge tropische boom - - Geen effect + + Grondsteen - - Snelheid + + Jong boompje - - Vertraging + + Jonge eik - - Sneller graven + + Jonge spar - - Trager graven + + Steen - - Kracht + + Voorwerplijst - - Verzwakking + + {*CREATURE*} spawnen - - Directe genezing + + Onderwereld-steen - - Directe verwonding + + Vuurbal - - Sprongkracht + + Vuurbal (houtskool) - - Misselijkheid + + Vuurbal (steenkool) - - Regeneratie + + Schedel - - Weerstand + + Hoofd - - Vuurbestendigheid + + Hoofd van %s - - Onder water ademen + + Creeper-hoofd - - Onzichtbaarheid + + Schedel skelet - - Blindheid + + Schedel Onderwereld-skelet - - Nachtzicht + + Zombiehoofd - - Honger + + Een compacte manier om steenkool op te slaan. Kan worden gebruikt als brandstof in een oven. Vergif - - voor versnelling + + Honger voor vertraging - - voor sneller graven + + voor versnelling - - voor trager graven + + Onzichtbaarheid - - voor kracht + + Onder water ademen - - voor verzwakking + + Nachtzicht - - voor genezing + + Blindheid voor verwonding - - voor sprongkracht + + voor genezing voor misselijkheid @@ -5221,29 +6081,38 @@ Wil je het combinatiepakket of texturepakket nu installeren? voor regeneratie - - voor weerstand + + voor trager graven - - voor vuurbestendigheid + + voor sneller graven - - voor onder water ademen + + voor verzwakking + + + voor kracht + + + Vuurbestendigheid - - voor onzichtbaarheid + + Verzadiging - - voor blindheid + + voor weerstand - - voor nachtzicht + + voor sprongkracht - - voor honger + + Wither - - voor vergiftiging + + Gezondheidsboost + + + Absorptie @@ -5254,29 +6123,41 @@ Wil je het combinatiepakket of texturepakket nu installeren? III + + voor onzichtbaarheid + IV - - Explosief + + voor onder water ademen - - Gewoon + + voor vuurbestendigheid - - Oninteressant + + voor nachtzicht - - Mild + + voor vergiftiging - - Helder + + voor honger - - Melkachtig + + voor absorptie - - Diffuus + + voor verzadiging + + + voor gezondheidsboost + + + voor blindheid + + + voor verval Natuurlijk @@ -5284,17 +6165,17 @@ Wil je het combinatiepakket of texturepakket nu installeren? Dun - - Vreemd + + Diffuus - - Verschaald + + Helder - - Grof + + Melkachtig - - Verprutst + + Vreemd Boterzacht @@ -5302,246 +6183,300 @@ Wil je het combinatiepakket of texturepakket nu installeren? Glad - - Zacht + + Verprutst - - Opwekkend + + Verschaald - - Dik + + Grof - - Elegant + + Mild - - Luxe + + Explosief - - Betoverend + + Gewoon + + + Oninteressant Zwierig - - Verfijnd - Hartelijk + + Betoverend + + + Elegant + + + Luxe + Sprankelend + + Ranzig + + + Scherp + + + Reukloos + Krachtig Bedorven - - Reukloos + + Zacht - - Ranzig + + Verfijnd - - Scherp + + Dik - - Bitter + + Opwekkend - - Smerig + + Herstelt geleidelijk de gezondheid van spelers, dieren en monsters. - - Stinkend + + Verlaagt meteen de gezondheid van spelers, dieren en monsters. - - Wordt gebruikt als de basis voor alle drankjes. Gebruik dit in een brouwrek om drankjes te maken. + + Maakt de spelers, dieren en monsters immuun voor schade door vuur, lava en Blaze-aanvallen van afstand. Heeft geen effect, maar kan in een brouwrek worden gebruikt om drankjes te maken door ingrediënten toe te voegen. - - Maakt spelers, dieren en monsters sneller. Spelers krijgen bovendien een groter blikveld en kunnen sneller sprinten en verder springen. + + Bitter Maakt spelers, dieren en monsters langzamer. Spelers krijgen bovendien een kleiner blikveld en kunnen minder snel sprinten en minder ver springen. + + Maakt spelers, dieren en monsters sneller. Spelers krijgen bovendien een groter blikveld en kunnen sneller sprinten en verder springen. + Zorgt ervoor dat spelers en monsters meer schade veroorzaken wanneer ze aanvallen. + + Herstelt meteen de gezondheid van spelers, dieren en monsters. + Zorgt ervoor dat spelers en monsters minder schade veroorzaken wanneer ze aanvallen. - - Herstelt meteen de gezondheid van spelers, dieren en monsters. + + Wordt gebruikt als de basis voor alle drankjes. Gebruik dit in een brouwrek om drankjes te maken. - - Verlaagt meteen de gezondheid van spelers, dieren en monsters. + + Smerig - - Herstelt geleidelijk de gezondheid van spelers, dieren en monsters. + + Stinkend - - Maakt de spelers, dieren en monsters immuun voor schade door vuur, lava en Blaze-aanvallen van afstand. + + Dreun + + + Scherpte Verlaagt geleidelijk de gezondheid van spelers, dieren en monsters. - - Scherpte + + Aanvalsschade - - Dreun + + Impact Verdelging van geleedpotigen - - Impact + + Snelheid - - Vuurbron + + Zombie-versterkingen - - Bescherming + + Sprongkracht paard + + + Indien gebruikt: + + + Weerstand tegen impact + + + Volgbereik mobs + + + Max. gezondheid + + + Magische vingers + + + Efficiëntie + + + Waterrat + + + Geluk + + + Plundering + + + Duurzaamheid Vuurbestendigheid + + Bescherming + + + Vuurbron + Zachte val - - Explosiebescherming + + Ademhaling Bescherming tegen projectielen - - Ademhaling - - - Waterrat + + Explosiebescherming - - Efficiëntie + + IV - - Magische vingers + + V - - Duurzaamheid + + VI - - Plundering + + Impact - - Geluk + + VII - - Kracht + + III Brandende pijlen - - Impact + + Kracht Onuitputtelijke pijlen - - I - II - - III - - - IV + + I - - V + + Wordt geactiveerd als iets of iemand een verbonden struikeldraad passeert. - - VI + + Activeert een verbonden struikeldraadschakelaar als iets of iemand de draad raakt. - - VII + + Een compacte manier om smaragden op te slaan. - - VIII + + Vergelijkbaar met een kist. Voorwerpen die worden geplaatst in een Einder-kist zijn echter beschikbaar in al je Einder-kisten, zelfs in andere dimensies. IX - - X + + VIII Kan worden uitgegraven met een ijzeren houweel of beter gereedschap om smaragden te verkrijgen. - - Vergelijkbaar met een kist. Voorwerpen die worden geplaatst in een Einder-kist zijn echter beschikbaar in al je Einder-kisten, zelfs in andere dimensies. - - - Wordt geactiveerd als iets of iemand een verbonden struikeldraad passeert. + + X - - Activeert een verbonden struikeldraadschakelaar als iets of iemand de draad raakt. + + Herstelt 2{*ICON_SHANK_01*} en er kan een gouden wortel van worden gemaakt. Kan worden geplant op een akker. - - Een compacte manier om smaragden op te slaan. + + Wordt gebruikt als decoratie. Er kunnen bloemen, jonge boompjes, cactussen en paddenstoelen in worden geplant. Een muur die is gemaakt van keien. - - Kan worden gebruikt voor het repareren van wapens, gereedschap en pantsers. + + Herstelt 0.5{*ICON_SHANK_01*} of kan worden bereid in een oven. Kan worden geplant op een akker. Kan worden omgesmolten in een oven tot Onderwereld-kwarts. - - Wordt gebruikt als decoratie. + + Kan worden gebruikt voor het repareren van wapens, gereedschap en pantsers. Kan worden gebruikt om te handelen met dorpelingen. - - Wordt gebruikt als decoratie. Er kunnen bloemen, jonge boompjes, cactussen en paddenstoelen in worden geplant. + + Wordt gebruikt als decoratie. - - Herstelt 2{*ICON_SHANK_01*} en er kan een gouden wortel van worden gemaakt. Kan worden geplant op een akker. + + Herstelt 4{*ICON_SHANK_01*}. - - Herstelt 0.5{*ICON_SHANK_01*} of kan worden bereid in een oven. Kan worden geplant op een akker. + + Herstelt 1{*ICON_SHANK_01*}. Het kan je wel vergiftigen. + + + Dit gebruik je om een opgezadeld varken te besturen als je op zijn rug zit. Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt door een aardappel te bereiden in een oven. - - Herstelt 1{*ICON_SHANK_01*} of kan worden bereid in een oven. Kan worden geplant op een akker. Het kan je wel vergiftigen. - Herstelt 3{*ICON_SHANK_01*}. Wordt gemaakt van een wortel en goudklompen. - - Dit gebruik je om een opgezadeld varken te besturen als je op zijn rug zit. - - - Herstelt 4{*ICON_SHANK_01*}. - Te gebruiken op een aambeeld om wapens, gereedschap en pantsers te betoveren. Wordt gemaakt door het uitgraven van Onderwereld-kwartserts. Hiervan kun je een kwartsblok maken. + + Aardappel + + + Gebakken aardappel + + + Wortel + Wordt gemaakt van wol. Wordt gebruikt als decoratie. @@ -5551,14 +6486,11 @@ Wil je het combinatiepakket of texturepakket nu installeren? Bloempot - - Wortel - - - Aardappel + + Pompoentaart - - Gebakken aardappel + + Betoverd boek Giftige aardappel @@ -5569,11 +6501,11 @@ Wil je het combinatiepakket of texturepakket nu installeren? Wortel aan een stok - - Pompoentaart + + Struikeldraadschakelaar - - Betoverd boek + + Struikeldraad Onderwereld-kwarts @@ -5584,11 +6516,8 @@ Wil je het combinatiepakket of texturepakket nu installeren? Einder-kist - - Struikeldraadschakelaar - - - Struikeldraad + + Mossige keienmuur Smaragdblok @@ -5596,8 +6525,8 @@ Wil je het combinatiepakket of texturepakket nu installeren? Keienmuur - - Mossige keienmuur + + Aardappelen Bloempot @@ -5605,8 +6534,8 @@ Wil je het combinatiepakket of texturepakket nu installeren? Wortels - - Aardappelen + + Licht beschadigd aambeeld Aambeeld @@ -5614,8 +6543,8 @@ Wil je het combinatiepakket of texturepakket nu installeren? Aambeeld - - Licht beschadigd aambeeld + + Kwartsblok Zwaar beschadigd aambeeld @@ -5623,8 +6552,8 @@ Wil je het combinatiepakket of texturepakket nu installeren? Onderwereld-kwartserts - - Kwartsblok + + Trap van kwarts Gebeiteld kwartsblok @@ -5632,8 +6561,8 @@ Wil je het combinatiepakket of texturepakket nu installeren? Kwartspilaar - - Trap van kwarts + + Rood tapijt Tapijt @@ -5641,8 +6570,8 @@ Wil je het combinatiepakket of texturepakket nu installeren? Zwart tapijt - - Rood tapijt + + Blauw tapijt Groen tapijt @@ -5650,9 +6579,6 @@ Wil je het combinatiepakket of texturepakket nu installeren? Bruin tapijt - - Blauw tapijt - Paars tapijt @@ -5665,18 +6591,18 @@ Wil je het combinatiepakket of texturepakket nu installeren? Grijs tapijt - - Roze tapijt - Lichtgroen tapijt - - Geel tapijt + + Roze tapijt Lichtblauw tapijt + + Geel tapijt + Magenta tapijt @@ -5689,89 +6615,84 @@ Wil je het combinatiepakket of texturepakket nu installeren? Gebeitelde zandsteen - - Gladde zandsteen - {*PLAYER*} werd gedood tijdens het aanvallen van {*SOURCE*} + + Gladde zandsteen + {*PLAYER*} werd verpletterd door een vallend aambeeld. {*PLAYER*} werd verpletterd door een vallend blok. - - Teleporteerde {*PLAYER*} naar {*DESTINATION*} - {*PLAYER*} teleporteerde je naar dezelfde locatie - - {*PLAYER*} teleporteerde naar jou toe + + Teleporteerde {*PLAYER*} naar {*DESTINATION*} Doornen - - Kwartsplaat + + {*PLAYER*} teleporteerde naar jou toe Hiermee zie je donkere omgevingen alsof het dag is, zelfs onder water. + + Kwartsplaat + Maakt spelers, dieren en monsters onzichtbaar. Repareren en hernoemen - - Kosten betovering: %d - Te duur! - - Hernoemen + + Kosten betovering: %d Je hebt: - - Nodig voor handel + + Hernoemen {*VILLAGER_TYPE*} verkoopt %s - - Repareren + + Nodig voor handel Handelen - - Halsband verven + + Repareren Dit is de aambeeld-interface, waar je wapens, pantsers en gereedschap kunt hernoemen, repareren en betoveren. Je betaalt met ervaringsniveaus. - - - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over de aambeeld-interface.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de aambeeld-interface. - + + Halsband verven Plaats om te beginnen het voorwerp in het eerste invoervakje. - + - Nadat de vereiste grondstoffen zijn geplaatst in het tweede invoervakje (bijvoorbeeld ijzerstaven voor een beschadigd ijzeren zwaard), verschijnt het gerepareerde voorwerp in het resultaatvakje. + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over de aambeeld-interface.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de aambeeld-interface. @@ -5779,9 +6700,9 @@ Wil je het combinatiepakket of texturepakket nu installeren? Je kunt ook een identiek voorwerp in het tweede vakje plaatsen om de twee voorwerpen met elkaar te combineren. - + - Om voorwerpen te betoveren op het aambeeld, plaats je een betoverd boek in het tweede uitvoervakje. + Nadat de vereiste grondstoffen zijn geplaatst in het tweede invoervakje (bijvoorbeeld ijzerstaven voor een beschadigd ijzeren zwaard), verschijnt het gerepareerde voorwerp in het resultaatvakje. @@ -5789,9 +6710,9 @@ Wil je het combinatiepakket of texturepakket nu installeren? Je ziet de kosten in ervaringsniveaus onder het uitvoervakje. Als je onvoldoende ervaringsniveaus hebt, kan de reparatie niet worden uitgevoerd. - + - Je kunt het voorwerp hernoemen door de naam in het tekstvak te bewerken. + Om voorwerpen te betoveren op het aambeeld, plaats je een betoverd boek in het tweede uitvoervakje. @@ -5799,9 +6720,9 @@ Wil je het combinatiepakket of texturepakket nu installeren? Door het oppakken van het gerepareerde voorwerp verbruik je de beide basisvoorwerpen en wordt het aangegeven aantal ervaringsniveaus van je totaal afgetrokken. - + - In dit gebied vind je een aambeeld en een kist met gereedschappen en wapens om mee te werken. + Je kunt het voorwerp hernoemen door de naam in het tekstvak te bewerken. @@ -5811,27 +6732,27 @@ Wil je het combinatiepakket of texturepakket nu installeren? Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over het aambeeld. - - Op een aambeeld kun je wapens en gereedschap repareren, hernoemen of betoveren met betoverde boeken. + + + In dit gebied vind je een aambeeld en een kist met gereedschappen en wapens om mee te werken. + Je vindt betoverde boeken in kisten in kerkers, maar je kunt ook gewone boeken betoveren op de tovertafel. - - - Het gebruik van het aambeeld kost ervaringsniveaus en bij elk gebruik kan het aambeeld beschadigd raken. - + + Op een aambeeld kun je wapens en gereedschap repareren, hernoemen of betoveren met betoverde boeken. De kosten van de reparatie zijn afhankelijk van de uit te voeren bewerking, de waarde van het voorwerp, het aantal betoveringen en het aantal eerder uitgevoerde bewerkingen. - + - Door het hernoemen van voorwerpen verander je de weergegeven naam voor alle spelers en verlaag je de kosten voor eerdere bewerkingen permanent. + Het gebruik van het aambeeld kost ervaringsniveaus en bij elk gebruik kan het aambeeld beschadigd raken. @@ -5839,9 +6760,9 @@ Wil je het combinatiepakket of texturepakket nu installeren? Experimenteer met de beschadigde houwelen, grondstoffen, priesterflessen en betoverde boeken die je vindt in de kist in dit gebied. - + - Dit is de handel-interface met de voorwerpen die je kunt verhandelen met een dorpeling. + Door het hernoemen van voorwerpen verander je de weergegeven naam voor alle spelers en verlaag je de kosten voor eerdere bewerkingen permanent. @@ -5851,9 +6772,9 @@ Wil je het combinatiepakket of texturepakket nu installeren? Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over de handel-interface. - + - Boven in beeld zie je alle transacties die de dorpeling op dit moment accepteert. + Dit is de handel-interface met de voorwerpen die je kunt verhandelen met een dorpeling. @@ -5861,17 +6782,17 @@ Wil je het combinatiepakket of texturepakket nu installeren? Transacties zijn rood en niet beschikbaar als je niet de vereiste voorwerpen hebt. - + - In de twee vakjes links zie je de hoeveelheid en de typen van de voorwerpen die je aan de dorpeling geeft. + Boven in beeld zie je alle transacties die de dorpeling op dit moment accepteert. In de twee vakjes links zie je het totaal aantal voorwerpen dat nodig is voor de transactie. - + - Druk op{*CONTROLLER_VK_A*} om de voorwerpen met de dorpeling te ruilen. + In de twee vakjes links zie je de hoeveelheid en de typen van de voorwerpen die je aan de dorpeling geeft. @@ -5879,11 +6800,9 @@ Wil je het combinatiepakket of texturepakket nu installeren? In dit gebied vind je een dorpeling en een kist met papier waarmee je voorwerpen kunt kopen. - + - {*B*} - Druk op{*CONTROLLER_VK_A*} voor meer informatie over handel.{*B*} - Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over handel. + Druk op{*CONTROLLER_VK_A*} om de voorwerpen met de dorpeling te ruilen. @@ -5891,14 +6810,21 @@ Wil je het combinatiepakket of texturepakket nu installeren? Je kunt voorwerpen uit je inventaris verhandelen met dorpelingen. - + - De transacties die dorpelingen voorstellen, zijn meestal afhankelijk van hun beroep. + {*B*} + Druk op{*CONTROLLER_VK_A*} voor meer informatie over handel.{*B*} + Druk op{*CONTROLLER_VK_B*} als je al genoeg weet over handel. Door verschillende transacties uit te voeren, wordt het aanbod van de dorpeling willekeurig uitgebreid of bijgewerkt. + + + + + De transacties die dorpelingen voorstellen, zijn meestal afhankelijk van hun beroep. @@ -6053,7 +6979,4 @@ Alle Einder-kisten in een wereld zijn met elkaar verbonden. Voorwerpen die je in Genezen - - Basis voor nieuwe wereld zoeken - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsPlatformSpecific.xml index d81cb9ba..40a79366 100644 --- a/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/nl-NL/stringsPlatformSpecific.xml @@ -1,242 +1,245 @@  - - NOT USED + + Wil je je nu aanmelden bij "PSN"? - - Gebruik het touchscreen van het PlayStation®Vita-systeem om door de menu's te bladeren. + + Met deze optie verwijder je een speler op een ander PlayStation®Vita-systeem en eventuele andere spelers op dat PlayStation®Vita-systeem. Deze spelers kunnen pas weer meedoen als de game opnieuw wordt gestart. - - Op minecraftforum is er een speciaal gedeelte voor de PlayStation®Vita Edition. + + SELECT - - Volg @4JStudios en @Kappische op Twitter voor het laatste nieuws over deze game! + + Hiermee worden trofeeën en klassementen tijdens het spelen niet bijgewerkt. Deze instelling blijft ook van kracht als je deze wereld opslaat en afsluit, en later weer laadt. - - Kijk een Einder-man nooit aan! + + PlayStation®Vita-systeem - - We weten het niet zeker, maar we vermoeden dat 4J Studios Herobrine uit de PlayStation®Vita-versie heeft verwijderd. + + Kies Ad hoc-netwerk om verbinding te maken met andere PlayStation®Vita-systemen in de buurt. Kies "PSN" om verbinding te maken met spelers over de hele wereld. - - Minecraft: PlayStation®Vita Edition heeft veel records gebroken! + + Ad hoc-netwerk - - {*T3*}INSTRUCTIES: MULTIPLAYER{*ETW*}{*B*}{*B*} -Minecraft voor het PlayStation®Vita-systeem heeft geweldige multiplayer-mogelijkheden.{*B*}{*B*} -Mensen op je vriendenlijst zien wanneer je een online game start of je je bij een andere game aansluit (tenzij je als host de optie 'Alleen op uitnodiging' hebt ingeschakeld). Als je vrienden zich bij je game aansluiten, is dat ook te zien voor mensen op hun vriendenlijst (als je de optie 'Vrienden van vrienden toestaan' hebt ingeschakeld).{*B*} -Eenmaal in een game kun je op de SELECT-toets drukken voor een lijst van alle andere spelers in de game. Je kunt daar ook spelers verwijderen. + + Netwerkmodus wijzigen - - {*T3*}INSTRUCTIES: SCREENSHOTS DELEN{*ETW*}{*B*}{*B*} -Je kunt een screenshot maken en delen op Facebook door in het pauzemenu op{*CONTROLLER_VK_Y*} te drukken. Je ziet een kleine versie van je screenshot en kunt de tekst van het bijbehorende Facebook-bericht aanpassen.{*B*}{*B*} -Er is een speciaal cameraperspectief voor screenshots, waarbij je je personage van voren ziet. Kies dat perspectief door op{*CONTROLLER_ACTION_CAMERA*} te drukken totdat je je personage van voren ziet en druk vervolgens op{*CONTROLLER_VK_Y*} om je screenshot te delen.{*B*}{*B*} -Online-id's worden niet weergegeven op screenshots. + + Kies Netwerk - - {*T3*}INSTRUCTIES: SPELTYPE CREATIEF{*ETW*}{*B*}{*B*} -In het speltype Creatief kun je elk voorwerp in de game vanuit de interface naar je inventaris verplaatsen. Je hoeft de voorwerpen dus niet eerst uit te graven of te produceren. -Bovendien worden voorwerpen niet uit de inventaris verwijderd als je ze plaatst of gebruikt. Daardoor kun je je helemaal op het bouwen richten.{*B*} -In werelden die worden gemaakt, geladen of opgeslagen in het speltype Creatief zijn geen trofeeën en klassementen beschikbaar, zelfs niet als de wereld daarna als Survival-game wordt geladen.{*B*} -Druk twee keer kort op{*CONTROLLER_ACTION_JUMP*} om te vliegen in het speltype Creatief. Doe hetzelfde om te stoppen met vliegen. Om sneller te vliegen, duw je{*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren. -Terwijl je vliegt hou je{*CONTROLLER_ACTION_JUMP*} ingedrukt om te stijgen en{*CONTROLLER_ACTION_SNEAK*} om te dalen. Je kunt ook stijgen met{*CONTROLLER_ACTION_DPAD_UP*}, dalen met{*CONTROLLER_ACTION_DPAD_DOWN*}, -naar links gaan met{*CONTROLLER_ACTION_DPAD_LEFT*} en naar rechts gaan met{*CONTROLLER_ACTION_DPAD_RIGHT*}. + + Online-id's op gedeeld scherm - - Druk twee keer kort op{*CONTROLLER_ACTION_JUMP*} om te vliegen. Doe hetzelfde om te stoppen met vliegen. Om sneller te vliegen, duw je{*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren. -Terwijl je vliegt, hou je{*CONTROLLER_ACTION_JUMP*} ingedrukt om te stijgen en{*CONTROLLER_ACTION_SNEAK*} om te dalen. Je kunt ook de richtingstoetsen gebruiken om te stijgen, te dalen en naar links en rechts te gaan. + + Trofeeën - - NIET GEBRUIKT + + Deze game slaat werelden automatisch op. Als je bovenstaand pictogram ziet, worden je spelgegevens opgeslagen. +Schakel je PlayStation®Vita-systeem niet uit als dit pictogram wordt weergegeven. - - NIET GEBRUIKT + + Als deze optie is ingeschakeld, kunnen hosts via het game-menu hun vermogen om te vliegen aan- en uitzetten, uitputting uitschakelen en zichzelf onzichtbaar maken. Hiermee worden trofeeën en klassementen uitgeschakeld. - - "NIET GEBRUIKT" + + Online-id's: - - "NIET GEBRUIKT" + + Je gebruikt de testversie van een texturepakket. Je hebt toegang tot de volledige inhoud van het texturepakket, maar je kunt je voortgang niet opslaan. +Als je probeert op te slaan tijdens het gebruik van de testversie, krijg je de mogelijkheid om de volledige versie te kopen. + - - Vrienden uitnodigen + + Patch 1.04 (titel-update 14) - - In werelden die worden gemaakt, geladen of opgeslagen in het speltype Creatief zijn geen trofeeën en klassementen beschikbaar, zelfs niet als de wereld daarna als Survival-game wordt geladen. Weet je zeker dat je verder wilt gaan? + + Online-id's in de game - - Deze wereld is al eens opgeslagen in het speltype Creatief, waardoor trofeeën en klassementen zijn uitgeschakeld. Weet je zeker dat je verder wilt gaan? + + Kijk eens wat ik heb gemaakt in Minecraft: PlayStation®Vita Edition! - - Deze wereld is al eens opgeslagen in het speltype Creatief, waardoor trofeeën en klassementen zijn uitgeschakeld. + + Download mislukt. Probeer het later opnieuw. - - Als je een wereld maakt, laadt of opslaat met ingeschakelde privileges voor de host, zijn trofeeën en klassementen uitgeschakeld, ook al laad je de wereld daarna zonder privileges. Weet je zeker dat je verder wilt gaan? + + Aansluiten bij de game is mislukt wegens een beperkend NAT-type. Controleer je netwerkinstellingen. - - Verbinding met "PSN" is verbroken. Terug naar het hoofdmenu. + + Upload mislukt. Probeer het later opnieuw. - - Verbinding met "PSN" is verbroken. + + Download voltooid! - - Dit is de testversie van Minecraft: PlayStation®Vita Edition. Als je de volledige versie had, zou je nu een trofee krijgen! -Koop de volledige game om optimaal te genieten van Minecraft: PlayStation®Vita Edition en samen te spelen met je vrienden uit de hele wereld via "PSN". Wil je nu de volledige versie kopen? + + +Er zijn op dit moment geen opslagbestanden beschikbaar op de overdrachtslocatie. +Je kunt in Minecraft: PlayStation®3 Edition een opgeslagen wereld uploaden naar de overdrachtslocatie en deze vervolgens downloaden in Minecraft: PlayStation®Vita Edition. + - - Dit is de testversie van Minecraft: PlayStation®Vita Edition. Als je de volledige versie had, zou je nu een thema krijgen! -Koop de volledige game om optimaal te genieten van Minecraft: PlayStation®Vita Edition en samen te spelen met je vrienden uit de hele wereld via "PSN". -Wil je nu de volledige versie kopen? + + Opslaan niet voltooid - - Dit is de testversie van Minecraft: PlayStation®Vita Edition. Je kunt deze uitnodiging alleen accepteren als je de volledige versie hebt. -Wil je nu de volledige versie kopen? + + Minecraft: PlayStation®Vita Edition beschikt niet over genoeg ruimte voor opslaggegevens. Verwijder andere opslagbestanden van Minecraft: PlayStation®Vita Edition om ruimte te maken. - - Gastspelers kunnen de volledige game niet ontgrendelen. Meld je aan met een Sony Entertainment Network-account. + + Uploaden geannuleerd - - Online-id + + Je hebt het uploaden van dit opslagbestand naar de overdrachtslocatie geannuleerd. - - Brouwen + + Opslagbestand voor PS3™/PS4™ uploaden - - Je bent terug in het titelscherm omdat je bent afgemeld bij "PSN". + + Gegevens uploaden: %d%% - - De testversie van Minecraft: PlayStation®Vita Edition is verlopen! Wil je de volledige versie kopen, zodat je verder kunt spelen? + + "PSN" - - "Minecraft: PlayStation®Vita Edition" kan niet worden geladen en kan niet verdergaan. + + PS3™-data downloaden - - De game kan niet worden geladen omdat een of meer spelers niet online mogen spelen wegens chatbeperkingen van hun Sony Entertainment Network-account. + + Gegevens downloaden: %d%% - - De online game kan niet worden gemaakt omdat een of meer spelers niet online mogen spelen wegens chatbeperkingen van hun Sony Entertainment Network-account. Ga naar 'Meer opties' en schakel 'Online game' uit om te beginnen met een offline game. + + Opslaan... - - Je kunt je niet aansluiten bij deze game-sessie omdat je niet online mag spelen wegens chatbeperkingen van je Sony Entertainment Network-account. + + Upload voltooid! - - Je kunt je niet aansluiten bij deze game-sessie omdat een van je lokale medespelers niet online mag spelen wegens chatbeperkingen van zijn of haar Sony Entertainment Network-account. Ga naar 'Meer opties' en schakel 'Online game' uit om te beginnen met een offline game. + + Weet je zeker dat je dit opslagbestand wilt uploaden? Als de overdrachtslocatie al een opslagbestand bevat, wordt dit overschreven. - - Je kunt deze game-sessie niet maken omdat een van je lokale medespelers niet online mag spelen wegens chatbeperkingen van zijn of haar Sony Entertainment Network-account. Ga naar 'Meer opties' en schakel 'Online game' uit om te beginnen met een offline game. + + Gegevens converteren... - - Deze game slaat werelden automatisch op. Als je bovenstaand pictogram ziet, worden je spelgegevens opgeslagen. -Schakel je PlayStation®Vita-systeem niet uit als dit pictogram wordt weergegeven. + + NIET GEBRUIKT - - Als deze optie is ingeschakeld, kunnen hosts via het game-menu hun vermogen om te vliegen aan- en uitzetten, uitputting uitschakelen en zichzelf onzichtbaar maken. Hiermee worden trofeeën en klassementen uitgeschakeld. + + NIET GEBRUIKT - - Online-id's op gedeeld scherm + + {*T3*}INSTRUCTIES: SPELTYPE CREATIEF{*ETW*}{*B*}{*B*} +In het speltype Creatief kun je elk voorwerp in de game vanuit de interface naar je inventaris verplaatsen. Je hoeft de voorwerpen dus niet eerst uit te graven of te produceren. +Bovendien worden voorwerpen niet uit de inventaris verwijderd als je ze plaatst of gebruikt. Daardoor kun je je helemaal op het bouwen richten.{*B*} +In werelden die worden gemaakt, geladen of opgeslagen in het speltype Creatief zijn geen trofeeën en klassementen beschikbaar, zelfs niet als de wereld daarna als Survival-game wordt geladen.{*B*} +Druk twee keer kort op{*CONTROLLER_ACTION_JUMP*} om te vliegen in het speltype Creatief. Doe hetzelfde om te stoppen met vliegen. Om sneller te vliegen, duw je{*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren. +Terwijl je vliegt hou je{*CONTROLLER_ACTION_JUMP*} ingedrukt om te stijgen en{*CONTROLLER_ACTION_SNEAK*} om te dalen. Je kunt ook stijgen met{*CONTROLLER_ACTION_DPAD_UP*}, dalen met{*CONTROLLER_ACTION_DPAD_DOWN*}, +naar links gaan met{*CONTROLLER_ACTION_DPAD_LEFT*} en naar rechts gaan met{*CONTROLLER_ACTION_DPAD_RIGHT*}. - - Trofeeën + + Druk twee keer kort op{*CONTROLLER_ACTION_JUMP*} om te vliegen. Doe hetzelfde om te stoppen met vliegen. Om sneller te vliegen, duw je{*CONTROLLER_ACTION_MOVE*} twee keer kort naar voren. +Terwijl je vliegt, hou je{*CONTROLLER_ACTION_JUMP*} ingedrukt om te stijgen en{*CONTROLLER_ACTION_SNEAK*} om te dalen. Je kunt ook de richtingstoetsen gebruiken om te stijgen, te dalen en naar links en rechts te gaan. - - Online-id's: + + "NIET GEBRUIKT" - - Online-id's in de game + + In werelden die worden gemaakt, geladen of opgeslagen in het speltype Creatief zijn geen trofeeën en klassementen beschikbaar, zelfs niet als de wereld daarna als Survival-game wordt geladen. Weet je zeker dat je verder wilt gaan? - - Kijk eens wat ik heb gemaakt in Minecraft: PlayStation®Vita Edition! + + Deze wereld is al eens opgeslagen in het speltype Creatief, waardoor trofeeën en klassementen zijn uitgeschakeld. Weet je zeker dat je verder wilt gaan? - - Je gebruikt de testversie van een texturepakket. Je hebt toegang tot de volledige inhoud van het texturepakket, maar je kunt je voortgang niet opslaan. -Als je probeert op te slaan tijdens het gebruik van de testversie, krijg je de mogelijkheid om de volledige versie te kopen. - + + "NIET GEBRUIKT" - - Patch 1.04 (titel-update 14) + + Vrienden uitnodigen - - SELECT + + Op minecraftforum is er een speciaal gedeelte voor de PlayStation®Vita Edition. - - Hiermee worden trofeeën en klassementen tijdens het spelen niet bijgewerkt. Deze instelling blijft ook van kracht als je deze wereld opslaat en afsluit, en later weer laadt. + + Volg @4JStudios en @Kappische op Twitter voor het laatste nieuws over deze game! - - Wil je je nu aanmelden bij "PSN"? + + NOT USED - - Met deze optie verwijder je een speler op een ander PlayStation®Vita-systeem en eventuele andere spelers op dat PlayStation®Vita-systeem. Deze spelers kunnen pas weer meedoen als de game opnieuw wordt gestart. + + Gebruik het touchscreen van het PlayStation®Vita-systeem om door de menu's te bladeren. - - PlayStation®Vita-systeem + + Kijk een Einder-man nooit aan! - - Netwerkmodus wijzigen + + {*T3*}INSTRUCTIES: MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft voor het PlayStation®Vita-systeem heeft geweldige multiplayer-mogelijkheden.{*B*}{*B*} +Mensen op je vriendenlijst zien wanneer je een online game start of je je bij een andere game aansluit (tenzij je als host de optie 'Alleen op uitnodiging' hebt ingeschakeld). Als je vrienden zich bij je game aansluiten, is dat ook te zien voor mensen op hun vriendenlijst (als je de optie 'Vrienden van vrienden toestaan' hebt ingeschakeld).{*B*} +Eenmaal in een game kun je op de SELECT-toets drukken voor een lijst van alle andere spelers in de game. Je kunt daar ook spelers verwijderen. - - Kies Netwerk + + {*T3*}INSTRUCTIES: SCREENSHOTS DELEN{*ETW*}{*B*}{*B*} +Je kunt een screenshot maken en delen op Facebook door in het pauzemenu op{*CONTROLLER_VK_Y*} te drukken. Je ziet een kleine versie van je screenshot en kunt de tekst van het bijbehorende Facebook-bericht aanpassen.{*B*}{*B*} +Er is een speciaal cameraperspectief voor screenshots, waarbij je je personage van voren ziet. Kies dat perspectief door op{*CONTROLLER_ACTION_CAMERA*} te drukken totdat je je personage van voren ziet en druk vervolgens op{*CONTROLLER_VK_Y*} om je screenshot te delen.{*B*}{*B*} +Online-id's worden niet weergegeven op screenshots. - - Kies Ad hoc-netwerk om verbinding te maken met andere PlayStation®Vita-systemen in de buurt. Kies "PSN" om verbinding te maken met spelers over de hele wereld. + + We weten het niet zeker, maar we vermoeden dat 4J Studios Herobrine uit de PlayStation®Vita-versie heeft verwijderd. - - Ad hoc-netwerk + + Minecraft: PlayStation®Vita Edition heeft veel records gebroken! - - "PSN" + + De testversie van Minecraft: PlayStation®Vita Edition is verlopen! Wil je de volledige versie kopen, zodat je verder kunt spelen? - - PlayStation®3-systeem data downloaden + + "Minecraft: PlayStation®Vita Edition" kan niet worden geladen en kan niet verdergaan. - - Opslagbestand voor PlayStation®3/PlayStation®4-systeem uploaden + + Brouwen - - Uploaden geannuleerd + + Je bent terug in het titelscherm omdat je bent afgemeld bij "PSN". - - Je hebt het uploaden van dit opslagbestand naar de overdrachtslocatie geannuleerd. + + De game kan niet worden geladen omdat een of meer spelers niet online mogen spelen wegens chatbeperkingen van hun Sony Entertainment Network-account. - - Gegevens uploaden: %d%% + + Je kunt je niet aansluiten bij deze game-sessie omdat een van je lokale medespelers niet online mag spelen wegens chatbeperkingen van zijn of haar Sony Entertainment Network-account. Ga naar 'Meer opties' en schakel 'Online game' uit om te beginnen met een offline game. - - Gegevens downloaden: %d%% + + Je kunt deze game-sessie niet maken omdat een van je lokale medespelers niet online mag spelen wegens chatbeperkingen van zijn of haar Sony Entertainment Network-account. Ga naar 'Meer opties' en schakel 'Online game' uit om te beginnen met een offline game. - - Weet je zeker dat je dit opslagbestand wilt uploaden? Als de overdrachtslocatie al een opslagbestand bevat, wordt dit overschreven. + + De online game kan niet worden gemaakt omdat een of meer spelers niet online mogen spelen wegens chatbeperkingen van hun Sony Entertainment Network-account. Ga naar 'Meer opties' en schakel 'Online game' uit om te beginnen met een offline game. - - Gegevens converteren... + + Je kunt je niet aansluiten bij deze game-sessie omdat je niet online mag spelen wegens chatbeperkingen van je Sony Entertainment Network-account. - - Opslaan... + + Verbinding met "PSN" is verbroken. Terug naar het hoofdmenu. - - Upload voltooid! + + Verbinding met "PSN" is verbroken. - - Upload mislukt. Probeer het later opnieuw. + + Deze wereld is al eens opgeslagen in het speltype Creatief, waardoor trofeeën en klassementen zijn uitgeschakeld. - - Download voltooid! + + Als je een wereld maakt, laadt of opslaat met ingeschakelde privileges voor de host, zijn trofeeën en klassementen uitgeschakeld, ook al laad je de wereld daarna zonder privileges. Weet je zeker dat je verder wilt gaan? - - Download mislukt. Probeer het later opnieuw. + + Dit is de testversie van Minecraft: PlayStation®Vita Edition. Als je de volledige versie had, zou je nu een trofee krijgen! +Koop de volledige game om optimaal te genieten van Minecraft: PlayStation®Vita Edition en samen te spelen met je vrienden uit de hele wereld via "PSN". Wil je nu de volledige versie kopen? - - Aansluiten bij de game is mislukt wegens een beperkend NAT-type. Controleer je netwerkinstellingen. + + Gastspelers kunnen de volledige game niet ontgrendelen. Meld je aan met een Sony Entertainment Network-account. - - - Er zijn op dit moment geen opslagbestanden beschikbaar op de overdrachtslocatie. - Je kunt in Minecraft: PlayStation®3 Edition een opgeslagen wereld uploaden naar de overdrachtslocatie en deze vervolgens downloaden in Minecraft: PlayStation®Vita Edition. - + + Online-id - - Opslaan niet voltooid + + Dit is de testversie van Minecraft: PlayStation®Vita Edition. Als je de volledige versie had, zou je nu een thema krijgen! +Koop de volledige game om optimaal te genieten van Minecraft: PlayStation®Vita Edition en samen te spelen met je vrienden uit de hele wereld via "PSN". +Wil je nu de volledige versie kopen? - - Minecraft: PlayStation®Vita Edition beschikt niet over genoeg ruimte voor opslaggegevens. Verwijder andere opslagbestanden van Minecraft: PlayStation®Vita Edition om ruimte te maken. + + Dit is de testversie van Minecraft: PlayStation®Vita Edition. Je kunt deze uitnodiging alleen accepteren als je de volledige versie hebt. +Wil je nu de volledige versie kopen? + + + Het opslagbestand in de overdrachtslocatie heeft een versienummer die nog niet door Minecraft: PlayStation®Vita Edition wordt ondersteund. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/no-NO/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/4J_stringsPlatformSpecific.xml index 5244738f..bdcb9eee 100644 --- a/Minecraft.Client/PSVitaMedia/loc/no-NO/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/4J_stringsPlatformSpecific.xml @@ -1,50 +1,50 @@  - - Du har ikke nok ledig plass på systemminne til å lagre spillet. - - - Du ble sendt tilbake til startskjermen fordi du logget ut av "PSN". + + Det oppsto en feil under lagring av innstillingene på Sony Entertainment Network-kontoen din. - - Denne kampen ble avbrutt fordi du logget ut av "PSN". + + Problem med Sony Entertainment Network-konto - - Online-ID-en er ikke online for øyeblikket. + + Det oppsto et problem med tilgang til Sony Entertainment Network-kontoen, så du fikk dessverre ikke trofeet ditt. - - Dette spillet har noen funksjoner som krever at du er logget inn på "PSN". Du er for øyeblikket offline. + + Dette er prøveversjonen av Minecraft: PlayStation®3 Edition. Hvis du hadde hatt fullversjonen, ville du nettopp ha fått deg et trofé! +Lås opp fullversjonen av spillet for å få fullt utbytte av Minecraft: PlayStation®3 Edition og for å spille sammen med vennene dine rundt om i verden via "PSN". +Vil du låse opp fullversjonen? - - Ad Hoc-nettverket er offline + + Koble til Ad Hoc-nettverket Spillet har noen funksjoner som krever tilkobling til Ad Hoc-nettverket, men du er for øyeblikket offline. - - Denne funksjonen krever at du er logget inn på "PSN". - - - Koble til "PSN" - - - Koble til Ad Hoc-nettverket + + Ad Hoc-nettverket er offline Troféfeil - - Det oppsto et problem med tilgang til Sony Entertainment Network-kontoen, så du fikk dessverre ikke trofeet ditt. + + Denne kampen ble avbrutt fordi du logget ut av "PSN". - - Problem med Sony Entertainment Network-konto + + Du ble sendt tilbake til startskjermen fordi du logget ut av "PSN". - - Det oppsto en feil under lagring av innstillingene på Sony Entertainment Network-kontoen din. + + Du har ikke nok ledig plass på systemminne til å lagre spillet. - - Dette er prøveversjonen av Minecraft: PlayStation®3 Edition. Hvis du hadde hatt fullversjonen, ville du nettopp ha fått deg et trofé! -Lås opp fullversjonen av spillet for å få fullt utbytte av Minecraft: PlayStation®3 Edition og for å spille sammen med vennene dine rundt om i verden via "PSN". -Vil du låse opp fullversjonen? + + Online-ID-en er ikke online for øyeblikket. + + + Koble til "PSN" + + + Denne funksjonen krever at du er logget inn på "PSN". + + + Dette spillet har noen funksjoner som krever at du er logget inn på "PSN". Du er for øyeblikket offline. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/no-NO/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/AdditionalStrings.xml index 02f37ab8..208a348a 100644 --- a/Minecraft.Client/PSVitaMedia/loc/no-NO/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/AdditionalStrings.xml @@ -48,6 +48,12 @@ Alternativer-filen din er ødelagt og må slettes. + + Slett alternativer-fil. + + + Prøv å laste inn alternativer-fil igjen. + Hurtigbuffer-filen din er ødelagt og må slettes. @@ -75,6 +81,9 @@ Onlinetjenester er deaktivert på Sony Entertainment Network-kontoen din på grunn av foreldrekontrollbegrensninger for én av de lokale spillerne. + + Onlinefunksjoner er deaktivert på grunn av at en spilloppdatering er tilgjengelig. + Det er for øyeblikket ingen tilbud på nedlastbart innhold til dette spillet. @@ -84,7 +93,4 @@ Bli med å spille Minecraft: PlayStation®Vita Edition! - - Onlinefunksjoner er deaktivert på grunn av at en spilloppdatering er tilgjengelig. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsGeneric.xml index 495d59fa..58e63f05 100644 --- a/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsGeneric.xml @@ -1,5197 +1,6021 @@  - - Nytt nedlastbart innhold tilgjengelig! Du finner det via knappen Minecraft-butikken i hovedmenyen. + + Bytter til offlinespill - - Du kan endre utseendet til karakteren din med en skallpakke fra Minecraft-butikken. Velg Minecraft-butikken i hovedmenyen for å se hva som er tilgjengelig. + + Vent litt mens verten lagrer spillet - - Endre gammainnstillingene for å gjøre spillet lysere eller mørkere. + + Entrer Slutten - - Hvis vanskelighetsgraden er "Fredelig", vil helsen din regenereres automatisk, og det dukker ikke opp monstre om natten! + + Lagrer spillere - - Gi en ulv et bein for å temme den. Deretter kan du få den til å sitte eller følge deg. + + Kobler til vert - - Du kan slippe gjenstander i Inventar-menyen ved å trykke på{*CONTROLLER_VK_A*}utenfor menyen. + + Laster ned terreng - - Dersom du legger deg til å sove i en seng om natten, spoler du frem til neste dag. I flerspillermodus må alle spillerne i spillet sove i en seng til samme tid. + + Forlater Slutten - - Høst inn koteletter fra griser, så kan du tilberede og spise dem for å gjenvinne helse. + + Sengen din manglet eller var blokkert. - - Høst inn skinn fra storfe, så kan du bruke det til å lage rustning. + + Du kan ikke hvile nå – det er monstre i nærheten. - - Hvis du har en tom bøtte, kan du fylle den med vann, lava eller melk fra kuer! + + Du sover i en seng. For å kunne spole frem til neste morgen må alle spillerne sove i hver sin seng samtidig. - - Bruk en krafse for å gjøre jorda klar til planting. + + Denne sengen er opptatt. - - Edderkopper angriper ikke på dagen – med mindre du angriper dem først. + + Du kan bare sove om natten. - - Det går fortere å grave i jord eller sand med en spade enn med hendene! + + %s sover i en seng. For å kunne spole frem til neste morgen må alle spillerne sove i hver sin seng samtidig. - - Du får mer helse av å spise tilberedte koteletter enn rå. + + Laster inn nivå - - Lag noen fakler for belysning når det er mørkt. Monstrene holder seg unna området rundt faklene. + + Fullfører ... - - Du kommer deg raskere frem med en gruvevogn og skinner! + + Bygger terreng - - Plant noen trær og se dem vokse seg store. + + Simulerer verdenen litt - - Grisemenn angriper deg ikke – med mindre du angriper dem. + + Rang - - Du kan endre returneringspunktet og spole frem til neste dag ved å sove i en seng. + + Forbereder lagring av nivå - - Slå ildkulene tilbake på geisten! + + Forbereder segmenter ... - - Ved å bygge en portal kan du reise til en annen dimensjon – underverdenen. + + Initialiserer server - - Trykk på {*CONTROLLER_VK_B*} for å slippe det du holder i hånden! + + Forlater underverdenen - - Bruk det rette verktøyet til jobben! + + Gjenoppstår - - Hvis du ikke finner noe kull til faklene dine, kan du alltids lage trekull av trær i en smelteovn. + + Genererer nivå - - Å grave rett ned eller rett opp er ikke særlig lurt. + + Genererer startpunkt - - Beinmel (laget av skjelettbein) kan brukes som gjødsel og få ting til å vokse umiddelbart! + + Laster inn startpunkt - - Smygere eksploderer når de kommer i nærheten av deg! + + Går ned i underverdenen - - Obsidian skapes når vann treffer en lavablokk. + + Verktøy og våpen - - Det kan gå noen minutter før lavaen forsvinner HELT når kildeblokken fjernes. + + Gamma - - Brosteiner tåler ildkuler fra geister, noe som gjør at de er nyttige til å verne portaler. + + Spillfølsomhet - - Blokker som kan brukes som lyskilder, kan også smelte snø og is. Dette inkluderer fakler, glødesteiner og gresskarlykter. + + Grensesnittfølsomhet - - Vær forsiktig når du bygger ting av ull i åpent landskap, ettersom lynnedslag kan få det til å begynne å brenne. + + Vanskelighetsgrad - - Én bøtte med lava kan brukes til å smelte 100 blokker i en smelteovn. + + Musikk - - Hvilket instrument noteblokker spiller, avhenger av materialet under dem. + + Lyd - - Zombier og skjeletter kan overleve dagslyset dersom de befinner seg i vann. + + Fredelig - - Hvis du angriper en ulv, vil andre ulver i nærheten bli fiendtlige og angripe deg. Det samme gjelder for zombie-grisemenn. + + I denne modusen gjenvinner du helsen over tid, og det er ingen fiender i omgivelsene. - - Ulver kan ikke gå ned i underverdenen. + + I denne modusen lurker fiender i omgivelsene, men de påfører deg mindre skade enn i modusen Normal. - - Ulver angriper ikke smygere. + + I denne modusen lurker fiender i omgivelsene og påfører deg standard mengde skade. - - Høner legger egg hvert 5. til 10. minutt. + + Lett - - Obsidian kan kun utvinnes med en diamanthakke. + + Normal - - Smygere er den lettest tilgjengelige kilden til krutt. + + Vanskelig - - Ved å plassere to kister ved siden av hverandre lager du en stor kiste. + + Logget ut - - Tamme ulvers helsenivå ser du på halens stilling. Mat dem for å helbrede dem. + + Rustning - - Tilbered kaktus i en smelteovn for å lage grønt fargestoff. + + Mekanismer - - Du finner mye nyttig informasjon i "Slik spiller du"-menyene! + + Transport - - Nå finnes det stablebare gjerder i spillet! + + Våpen - - Noen dyr følger etter deg hvis du har hvete i hånden. + + Mat - - Dersom et dyr ikke kan bevege seg mer enn 20 blokker i en retning, vil det ikke forsvinne. + + Byggverk - - Musikk av C418! + + Dekorasjoner - - Notch har over en million følgere på twitter! + + Brygging - - Ikke alle svensker er blonde. Det finnes til og med noen rødhåringer, som for eksempel Jens fra Mojang! + + Verktøy, våpen og rustning - - Det kommer snart en oppdatering til dette spillet! + + Materialer - - Hvem er Notch? + + Byggeblokker - - Mojang har flere priser enn ansatte! + + Rødstein og transport - - Det finnes noen kjendiser som spiller Minecraft! + + Diverse - - deadmau5 liker Minecraft! + + Oppføringer: - - Ikke se rett på insektene. + + Avslutt uten å lagre - - Smygere ble til etter en kodefeil. + + Er du sikker på at du vil gå ut av hovedmenyen? All ulagret fremdrift vil gå tapt. - - Er det en høne eller en and? + + Er du sikker på at du vil gå ut av hovedmenyen? All fremdrift vil gå tapt. - - Var du på Minecon? + + Denne lagringen er ødelagt eller skadet. Vil du slette den? - - Ingen på Mojang har noensinne sett ansiktet til Junkboy. + + Er du sikker på at du vil avslutte til hovedmenyen? Alle spillere vil bli koblet fra spillet, og all ulagret fremdrift vil gå tapt. - - Visste du at det finnes en Minecraft Wiki? + + Avslutt og lagre - - Mojangs nye lokaler er kule! + + Opprett ny verden - - Minecon 2013 var i Orlando i Florida! + + Skriv inn et navn på verdenen din. - - .party() var glimrende! - - - Gå alltid ut fra at rykter er usanne snarere enn sanne! + + Angi seeden for verdensgenerering - - {*T3*}SLIK SPILLER DU: GRUNNLEGGENDE{*ETW*}{*B*}{*B*} -Minecraft er et spill som dreier seg om å plassere blokker for å bygge hva det måtte være. På natten kommer monstrene ut, så husk å bygge deg et tilfluktssted før det skjer.{*B*}{*B*} -Bruk {*CONTROLLER_ACTION_LOOK*} for å se deg om.{*B*}{*B*} -Bruk {*CONTROLLER_ACTION_MOVE*} for å bevege deg.{*B*}{*B*} -Trykk på {*CONTROLLER_ACTION_JUMP*} for å hoppe.{*B*}{*B*} -Trykk {*CONTROLLER_ACTION_MOVE*} forover to ganger på rad for å spurte. Så lenge du holder {*CONTROLLER_ACTION_MOVE*} forover, fortsetter karakteren å spurte frem til du går tom for spurtetid eller matlinjen har mindre enn {*ICON_SHANK_03*}.{*B*}{*B*} -Hold inne {*CONTROLLER_ACTION_ACTION*} for å grave og utvinne med hendene eller det verktøyet du måtte være utstyrt med. Noen blokker må du kanskje lage et eget verktøy for å utvinne fra.{*B*}{*B*} -Hvis du holder noe i hendene, kan du ta det i bruk med {*CONTROLLER_ACTION_USE*} eller slippe det med {*CONTROLLER_ACTION_DROP*}. + + Last inn lagret verden - - {*T3*}SLIK SPILLER DU: HUD{*ETW*}{*B*}{*B*} -HUD viser informasjon som statusen din, helsen din, gjenværende oksygen når du er under vann, sultnivå (du må spise for å få det til å øke) og eventuell rustning du har på deg. -Hvis du mister helse, men har minst 9 {*ICON_SHANK_01*} på matlinjen, vil helsen din fylles opp automatisk. Du kan spise mat for å fylle opp matlinjen.{*B*} -Erfaringslinjen vises også her, med ett tall som angir erfaringsnivået ditt, og et annet tall som viser hvor mange erfaringspoeng som kreves for å gå opp til neste nivå. -Erfaringspoeng får du ved å samle erfaringskuler som vesener slipper fra seg når de dør, utvinne fra visse typer blokker, avle frem dyr, fiske samt smelte malm i smelteovner.{*B*}{*B*} -Her ser du også hvilke gjenstander du har tilgjengelig. -Bruk {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for å bytte gjenstanden du har i hånden. + + Spill opplæring - - {*T3*}SLIK SPILLER DU: UTSTYRSLISTE{*ETW*}{*B*}{*B*} -Bruk {*CONTROLLER_ACTION_INVENTORY*} for å se inventaret ditt.{*B*}{*B*} -Her ser du alle gjenstander og verktøy du kan ta i hånden, samt andre ting du har med deg. Rustningen din ser du også her.{*B*}{*B*} -Bruk {*CONTROLLER_MENU_NAVIGATE*} for å flytte pekeren. Bruk {*CONTROLLER_VK_A*} for å plukke opp en gjenstand under pekeren. Dersom det er flere enn én gjenstand her, plukker du opp alle, eller du kan bruke {*CONTROLLER_VK_X*} for bare å plukke opp halvparten.{*B*}{*B*} -Flytt gjenstanden ved hjelp av pekeren til en annen plass i inventaret, og bruk {*CONTROLLER_VK_A*} for å plassere den der. Har du flere gjenstander på pekeren, kan du bruke {*CONTROLLER_VK_A*} for å plassere alle sammen eller {*CONTROLLER_VK_X*} for å plassere en av dem.{*B*}{*B*} -Dersom en av gjenstandene under pekeren er en rustning, vil du få opp et tips om hvordan du raskt kan flytte den over til høyre rustningsplass i inventaret.{*B*}{*B*} -Skinnpansring kan farges. Dette gjør du i Inventar-menyen ved å holde fargen i pekeren og deretter trykke på {*CONTROLLER_VK_X*} mens pekeren er over den delen du vil farge. + + Opplæring - - {*T3*}SLIK SPILLER DU: KISTE{*ETW*}{*B*}{*B*} -Når du har laget en kiste, kan du plassere den ute i verdenen og deretter bruke den med {*CONTROLLER_ACTION_USE*} til å lagre gjenstander fra inventaret ditt.{*B*}{*B*} -Bruk pekeren for å flytte gjenstander mellom inventaret og kisten.{*B*}{*B*} -Gjenstandene i kisten blir liggende der til du flytter dem over til inventaret igjen senere. + + Gi verdenen navn - - {*T3*}SLIK SPILLER DU: STOR KISTE{*ETW*}{*B*}{*B*} -Ved å plassere to kister ved siden av hverandre lages det én stor kiste. Dermed kan du lagre enda flere gjenstander.{*B*}{*B*} -En stor kiste brukes på samme måte som en vanlig kiste. + + Skadet lagring - - {*T3*}SLIK SPILLER DU: UTFORMING{*ETW*}{*B*}{*B*} -Under Utforming kan du sette sammen ting fra inventaret for å lage nye typer gjenstander. Bruk {*CONTROLLER_ACTION_CRAFTING*} for å åpne Utforming.{*B*}{*B*} -Bla gjennom fanene i toppen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å velge den typen gjenstand du vil lage, og bruk deretter {*CONTROLLER_MENU_NAVIGATE*} for å velge ønsket gjenstand.{*B*}{*B*} -I utformingsområdet ser du hva som kreves for å lage den nye gjenstanden. Trykk på {*CONTROLLER_VK_A*} for å lage den nye gjenstanden og plassere den i inventaret. + + OK - - {*T3*}SLIK SPILLER DU: UTFORMINGSBORD{*ETW*}{*B*}{*B*} -Du kan lage større ting ved hjelp av et utformingsbord.{*B*}{*B*} -Plasser bordet i verdenen og trykk på {*CONTROLLER_ACTION_USE*} for å bruke det.{*B*}{*B*} -Utforming ved hjelp av et utformingsbord fungerer i bunn og grunn likt som vanlig utforming, men du har et større utformingsområde og et bredere utvalg av gjenstander. + + Avbryt - - {*T3*}SLIK SPILLER DU: SMELTEOVN{*ETW*}{*B*}{*B*} -Med en smelteovn kan du omskape gjenstander ved hjelp av varme. Du kan for eksempel gjøre jernmalm om til jernbarrer.{*B*}{*B*} -Plasser smelteovnen ute i verdenen, og trykk på {*CONTROLLER_ACTION_USE*} for å bruke den.{*B*}{*B*} -Du må plassere litt brensel i bunnen av smelteovnen, og deretter legger du gjenstanden du skal behandle, i toppen. Smelteovnen vil så sette i gang.{*B*}{*B*} -Når gjenstandene dine er ferdige, kan du flytte dem over til inventaret ditt.{*B*}{*B*} -Dersom en gjenstand du holder pekeren over, er en ingrediens eller brensel til smelteovnen, vil du få opp tips og hvordan du raskt kan flytte dem over til smelteovnen. + + Minecraft-butikken - - {*T3*}SLIK SPILLER DU: DISPENSER{*ETW*}{*B*}{*B*} -En dispenser brukes til å mate ut gjenstander. Du må plassere en bryter, for eksempel en spak, ved siden av dispenseren for å utløse den.{*B*}{*B*} -For å fylle dispenseren med gjenstander trykker du på {*CONTROLLER_ACTION_USE*}, deretter flytter du de aktuelle gjenstandene fra inventaret og over i dispenseren.{*B*}{*B*} -Når du nå betjener bryteren, vil dispenseren mate ut en gjenstand. + + Roter - - {*T3*}SLIK SPILLER DU: BRYGGING{*ETW*}{*B*}{*B*} -For å brygge eliksirer trenger du et bryggeapparat, som du kan bygge på utformingsbordet. Basisen for enhver eliksir er en flaske vann, som du får ved å fylle en glassflaske med vann fra en gryte eller en vannkilde.{*B*} -Et bryggeapparat har tre plasser til flasker, så det lønner seg å brygge tre eliksirer av gangen for å utnytte ressursene best mulig.{*B*} -Plasser en ingrediens på toppen av bryggeapparatet for å lage en basis. Denne basisen har ingen virkning alene, men når du bruker basisen og legger til en annen ingrediens, får du en eliksir med en virkning.{*B*} -Når du har laget denne eliksiren, kan du legge til en tredje ingrediens for å få virkningen til å vare lenger (med rødsteinstøv), bli mer intens (med glødesteinstøv) eller skadelig (med et gjæret edderkoppøye).{*B*} -Du kan også legge til krutt i en eliksir for å gjøre den om til en spruteeliksir, som du deretter kan kaste. Når du kaster en slik, vil eliksiren virke på området den lander i.{*B*} - -Ingrediensene som du kan lage eliksirer av, er:{*B*}{*B*} -* {*T2*}Underverdenvorte{*ETW*}{*B*} -* {*T2*}Edderkoppøye{*ETW*}{*B*} -* {*T2*}Sukker{*ETW*}{*B*} -* {*T2*}Geisttåre{*ETW*}{*B*} -* {*T2*}Blusspulver{*ETW*}{*B*} -* {*T2*}Magmakrem{*ETW*}{*B*} -* {*T2*}Strålende melon{*ETW*}{*B*} -* {*T2*}Rødsteinstøv{*ETW*}{*B*} -* {*T2*}Glødesteinstøv{*ETW*}{*B*} -* {*T2*}Gjæret edderkoppøye{*ETW*}{*B*}{*B*} - -Eksperimenter med kombinasjoner av de ulike ingrediensene for å finne de ulike eliksirene du kan lage. + + Gjem deg - - {*T3*}SLIK SPILLER DU: FORTRYLLELSE{*ETW*}{*B*}{*B*} -Erfaringspoengene du kan samle når vesener dør eller gjennom utvinning fra eller smelting av visse typer blokker, kan brukes til å fortrylle noen typer verktøy, våpen, rustninger og bøker.{*B*} -Når du plasserer sverdet, buen, øksen, hakken, spaden, rustningen eller boken på plassen under boken på fortryllelsesbordet, ser du noen fortryllelser og hvor mange erfaringspoeng de koster, på de tre knappene til høyre.{*B*} -Dersom du ikke har høyt nok erfaringsnivå til å bruke noen av disse, vil kostnaden vises i rødt. Ellers vises den i grønt.{*B*}{*B*} -Hvilken fortryllelse som brukes, velges tilfeldig basert på den angitte kostnaden.{*B*}{*B*} -Dersom fortryllelsesbordet er omgitt av bokhyller (inntil 15 stykker), med én blokks åpning mellom bokhyllen og fortryllelsesbordet, vil fortryllelsens styrke øke og mystiske glyfer komme ut fra boken på fortryllelsesbordet.{*B*}{*B*} -Alle ingrediensene til fortryllelsesbordet kan du finne i landsbyene i en verden eller ved utvinning og dyrking.{*B*}{*B*} -Fortryllede bøker brukes sammen med ambolten for å fortrylle gjenstander. Dette gir deg mer kontroll over hvilke fortryllelser du vil bruke på gjenstandene dine.{*B*} + + Tøm alle felter - - {*T3*}SLIK SPILLER DU: DYREHOLD{*ETW*}{*B*}{*B*} -Hvis du vil holde dyrene dine på ett sted, bygger du et inngjerdet område på maks 20x20 blokker og plasserer dyrene dine der. Dette sikrer at de fremdeles er der neste gang du skal se til dem. + + Er du sikker på at du vil gå ut av det aktive spillet og bli med i det nye? All ulagret fremdrift vil gå tapt. - - {*T3*}SLIK SPILLER DU: DYREAVL{*ETW*}{*B*}{*B*} -Dyrene i Minecraft kan avles, slik at du kan lage babyversjoner av dem!{*B*} -For å avle frem dyr må du fôre dem riktig slik at de går inn i en "elskovsmodus".{*B*} -Fôr kuer, soppkuer eller sauer med hvete, griser med gulrøtter, høner med hvetefrø eller underverdenvorter og ulver med en eller annen type kjøtt, så begynner de snart å se seg om etter et dyr av samme art som også er i elskovsmodus.{*B*} -Når to dyr av samme art møtes som begge er i elskovsmodus, begynner de kysse litt, og så dukker det snart opp en dyreunge. Dyreungene følger foreldrene sine en stund før de selv blir voksne dyr.{*B*} -Etter at dyrene har vært i elskovsmodus, vil de ikke kunne gå tilbake til denne modusen før etter ca. 5 minutter.{*B*} -Det er en grense på hvor mange dyr det kan være i en verden, så det kan hende at dyrene dine ikke lager barn når det finnes veldig mange av dem. + + Er du sikker på at du vil overskrive en tidligere lagring av denne verdenen med den gjeldende versjonen? - - {*T3*}SLIK SPILLER DU: PORTALER{*ETW*}{*B*}{*B*} -Via portaler kan du reise mellom oververdenen og underverdenen. Underverdenen kan brukes til å hurtigreise i oververdenen – én blokk i underverdenen tilsvarer tre i oververdenen, så når du bygger en portal i underverdenen og går ut gjennom den, vil du dukke opp tre ganger så langt unna som der du gikk inn.{*B*}{*B*} -Du trenger minst 10 obsidianblokker for å bygge en portal, og portalen må være 5 blokker høy, 4 blokker bred og 1 blokk dyp. Når portalrammen er bygget, må du tenne en flamme på innsiden for å aktivere portalen. Dette kan du gjøre med tennstål eller med ildladning.{*B*}{*B*} -På bildet til høyre ser du eksempler på portalkonstruksjon. + + Er du sikker på at du vil avslutte uten å lagre? All ulagret fremdrift i denne verdenen vil gå tapt! - - {*T3*}SLIK SPILLER DU: SPERRE NIVÅER{*ETW*}{*B*}{*B*} -Dersom du finner støtende innhold i et nivå du spiller, kan du velge å legge dette nivået inn i listen over sperrede nivåer. -Dette gjør du ved å åpne pausemenyen og trykke på {*CONTROLLER_VK_RB*}. -Når du prøver å gå til dette nivået i fremtiden, vil du få opp et varsel om at du har lagt dette nivået i listen over sperrede nivåer, og du vil da få muligheten til enten å fjerne det fra denne listen og fortsette til nivået, eller å hoppe over det. + + Starte spill - - {*T3*}SLIK SPILLER DU: VERTS- OG SPILLERALTERNATIVER{*ETW*}{*B*}{*B*} - -{*T1*}Spillalternativer{*ETW*}{*B*} - Når du laster inn eller oppretter en verden, kan du trykke på "Flere alternativer" for å åpne en meny hvor du kan kontrollere spillet i større grad.{*B*}{*B*} - - {*T2*}Spiller mot spiller{*ETW*}{*B*} - Når dette er aktivert, kan spillerne skade hverandre. Gjelder bare for overlevelsesmodus.{*B*}{*B*} - - {*T2*}Stol på spillere{*ETW*}{*B*} - Når dette er deaktivert, har spillere som blir med i spillet, begrensninger på hva de kan gjøre. De kan ikke utvinne eller bruke gjenstander, utplassere blokker, bruke dører og brytere, bruke beholdere, angripe spillere eller dyr. Du kan endre disse innstillingene for hver enkelt spiller i menyen i spillet.{*B*}{*B*} - - {*T2*}Spredning av ild{*ETW*}{*B*} - Når dette er aktivert, kan ild spre seg til brennbare blokker i nærheten. Denne innstillingen kan også endres i spillet.{*B*}{*B*} - - {*T2*}TNT-eksplosjon{*ETW*}{*B*} - Når dette er aktivert, vil TNT eksplodere etter aktivering. Denne innstillingen kan også endres i spillet.{*B*}{*B*} - - {*T2*}Vertsrettigheter{*ETW*}{*B*} - Når dette er aktivert, kan verten slå av og på sin egen evne til å fly, deaktivere utmattelse og gjøre seg selv usynlig via menyen i spillet. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} - -{*T1*}Alternativer for verdensgenerering{*ETW*}{*B*} - Når du oppretter en ny verden, har du tilgang til noen ekstra alternativer.{*B*}{*B*} - - {*T2*}Generer byggverk{*ETW*}{*B*} - Når dette er aktivert, vil byggverk som landsbyer og festninger bli generert i verdenen.{*B*}{*B*} - - {*T2*}Superflat verden{*ETW*}{*B*} - Når dette er aktivert, genereres en helt flat verden i oververdenen og underverdenen.{*B*}{*B*} - - {*T2*}Bonuskiste{*ETW*}{*B*} - Når dette er aktivert, dukker det opp en kiste med noen nyttige gjenstander i nærheten av spillernes startpunkt.{*B*}{*B*} - -{*T2*}Tilbakestill underverdenen{*ETW*}{*B*} -Når dette er aktivert, blir underverdenen regenerert. Dette er kjekt hvis du har en eldre lagring uten fort i underverdenen.{*B*}{*B*} - -{*T1*}Alternativer i spillet{*ETW*}{*B*} - Underveis i spillet har du tilgang til en rekke alternativer ved å trykke på {*BACK_BUTTON*}.{*B*}{*B*} - - {*T2*}Vertsalternativer{*ETW*}{*B*} - Verten og andre moderatorer har tilgang til menyen Vertsalternativer. Her kan de aktivere og deaktivere spredning av ild og TNT-eksplosjon.{*B*}{*B*} - -{*T1*}Spilleralternativer{*ETW*}{*B*} - Hvis du vil endre rettighetene til en spiller, velger du navnet til vedkommende og trykker på {*CONTROLLER_VK_A*} for å åpne spillerrettighetsmenyen hvor du kan endre de følgende alternativene.{*B*}{*B*} - - {*T2*}Kan bygge og utvinne{*ETW*}{*B*} - Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er aktivert, kan spilleren samhandle med verdenen som normalt. Når det er deaktivert, vil ikke spilleren kunne plassere eller ødelegge blokker, eller samhandle med en rekke gjenstander og blokker.{*B*}{*B*} - - {*T2*}Kan bruke dører og brytere{*ETW*}{*B*} - Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er deaktivert, kan ikke spilleren bruke dører og brytere.{*B*}{*B*} - - {*T2*}Kan åpne beholdere{*ETW*}{*B*} - Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er deaktivert, kan ikke spilleren åpne beholdere, slik som kister.{*B*}{*B*} - - {*T2*}Kan angripe spillere{*ETW*}{*B*} - Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er deaktivert, kan ikke spilleren skade andre spillere.{*B*}{*B*} - - {*T2*}Kan angripe dyr{*ETW*}{*B*} - Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er deaktivert, kan ikke spilleren skade dyr.{*B*}{*B*} - - {*T2*}Moderator{*ETW*}{*B*} - Når dette alternativet er aktivert, kan spilleren endre rettighetene til andre spillere (unntatt verten) hvis "Stol på spillere" er slått av. I tillegg kan spilleren sparke andre spillere samt aktivere/deaktivere spredning av ild og TNT-eksplosjon.{*B*}{*B*} - - {*T2*}Spark ut spiller{*ETW*}{*B*} - {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - -{*T1*}Vertsalternativer{*ETW*}{*B*} -Dersom "Vertsrettigheter" er aktivert, kan verten endre visse rettigheter på egen hånd. Hvis du vil endre rettighetene til en spiller, velger du navnet til vedkommende og trykker på {*CONTROLLER_VK_A*} for å åpne spillerrettighetsmenyen hvor du kan endre de følgende alternativene.{*B*}{*B*} - - {*T2*}Kan fly{*ETW*}{*B*} - Når dette alternativet er aktivert, kan spilleren fly. Gjelder kun for overlevelsesmodus, ettersom flyvning er aktivert for alle i kreativ modus.{*B*}{*B*} - - {*T2*}Deaktiver utmattelse{*ETW*}{*B*} - Gjelder kun for overlevelsesmodus. Når dette er aktivert, påvirker ikke fysiske aktiviteter (gå, spurte, hoppe osv.) matlinjen. Men blir spilleren skadet, vil matlinjen sakte tømmes mens du helbredes.{*B*}{*B*} - - {*T2*}Usynlig{*ETW*}{*B*} - Når dette alternativet er aktivert, er du usynlig for andre spillere og i tillegg usårbar.{*B*}{*B*} - - {*T2*}Kan teleportere{*ETW*}{*B*} - Gjør det mulig å flytte andre eller deg selv til andre spillere i verdenen. + + Avslutt spill - - Neste side + + Lagre spill - - Forrige side + + Avslutte uten å lagre - - Grunnleggende + + Trykk på START for å bli med i spill - - HUD + + Hurra – du har fått et spillerbilde av Steve fra Minecraft! - - Inventar + + Hurra – du har fått et spillerbilde av en smyger! - - Kister + + Lås opp fullversjon - - Utforming + + Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en nyere versjon av spillet. - - Smelteovn + + Ny verden - - Dispenser - - - Dyrehold + + Belønning låst opp! - - Dyreavl + + Du spiller prøveversjonen, og du må ha fullversjonen for å kunne lagre spillet. +Vil du låse opp fullversjonen av spillet nå? - - Brygging + + Venner - - Fortryllelse + + Min poengsum - - Portaler + + Totalt - - Flerspiller + + Vent litt - - Dele skjermbilder + + Ingen resultater - - Sperre nivåer + + Filter: - - Kreativ modus + + Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en eldre versjon av spillet. - - Verts- og spilleralternativer + + Forbindelse brutt. - - Handel + + Forbindelsen til serveren er brutt. Går tilbake til hovedmenyen. - - Ambolt + + Koblet fra serveren. - - Slutten + + Avslutter spillet - - {*T3*}SLIK SPILLER DU: SLUTTEN{*ETW*}{*B*}{*B*} -Slutten er en annen dimensjon i spillet, som du kommer til gjennom en aktiv Sluttportal. Sluttportalen finner du i en festning, langt under bakken i oververdenen.{*B*} -For å aktivere sluttportalen må du sette et enderøye i en sluttportalramme hvor dette mangler.{*B*} -Når portalen er aktiv, hopper du inn i den for å komme til Slutten.{*B*}{*B*} -I Slutten vil du møte enderdragen, en fryktet og mektig fiende, samt en rekke endermenn, så du må være godt forberedt til kamp før du drar dit!{*B*}{*B*} -Der vil du finne enderkrystaller på toppen av åtte obsidianstaker som enderdragen bruker til å helbrede seg selv, -så første trinn i slaget er å ødelegge alle disse.{*B*} -De første kan nås med piler, men de siste beskyttes av et jerngjerde, så du må bygge deg frem til dem.{*B*}{*B*} -Mens du gjør dette, vil enderdragen angripe deg ved å fly mot deg og spytte endersyrekuler på deg!{*B*} -Hvis du går mot eggpodiet i midten av pålene, vil enterdragen fly ned og angripe deg, og det er da du virkelig kan skade den!{*B*} -Unngå syrepusten hans, og sikt på enderdragens øyne for best mulig resultat. Om mulig bør du ta med deg noen venner som kan hjelpe deg med slaget!{*B*}{*B*} -Når du har kommet til Slutten, vil vennene dine kunne se på kartet sitt hvor sluttportalen er i festningene sine, slik at de enkelt vil kunne komme seg til deg. + + Det har oppstått en feil. Går tilbake til hovedmenyen. - - Spurte + + Tilkobling mislyktes. - - Nyheter + + Du ble sparket ut av spillet. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Endringer og tillegg{*ETW*}{*B*}{*B*} -- Lagt til nye gjenstander - smaragd, smaragdmalm, smaragdblokk, enderkiste, snubletrådkrok, fortryllet gulleple, ambolt, blomsterpotte, brosteinsmurer, mosegrodde brosteinsmurer, vissenmaleri, potet, bakt potet, giftig potet, gulrot, gullrot, gulrot på pinne, -gresskarpai, nattsyneliksir, usynlighetseliksir, underverdenkvarts, underverdenkvartsmalm, kvartsblokk, kvartshelle, kvartstrapp, meislet kvartsblokk, kvartsblokk til søyle, fortryllet bok, teppe.{*B*} -- Lagt til nye oppskrifter på glatt sandstein og meislet sandstein.{*B*} -- Lagt til nye vesener: landsbyzombier.{*B*} -- Lagt til nye funksjoner for generering av terreng: ørkentempler, ørkenlandsbyer, jungeltempler.{*B*} -- Lagt til handel med landsbyboere.{*B*} -- Lagt til ambolt-grensesnitt.{*B*} -- Mulig å farge skinnpansring.{*B*} -- Mulig å farge ulvehalsbånd.{*B*} -- Mulig å styre griser du rir på, med en gulrot på pinne.{*B*} -- Oppdatert bonuskisteinnhold med flere gjenstander.{*B*} -- Endret utplassering av halvblokker og andre blokker på halvblokker.{*B*} -- Endret utplassering av opp-ned-trapper og heller.{*B*} -- Lagt til ulike yrker for landsbyboere.{*B*} -- Landsbyboere som yngles via yngleegg, vil ha et tilfeldig yrke.{*B*} -- Lagt til sideveis utplassering av tømmer.{*B*} -- Smelteovner kan nå bruke treverktøy som brensel.{*B*} -- Is- og glassruter kan samles med verktøy fortryllet med silkeberøring.{*B*} -- Knapper og trykkplater av tre kan aktiveres med piler.{*B*} -- Underverdenvesener kan yngle i oververdenen via portaler.{*B*} -- Smygere og edderkopper er aggressive mot den siste spilleren som traff dem.{*B*} -- Vesener i kreativ modus blir nøytrale igjen etter en kort periode.{*B*} -- Tilfeldig tilbakeslag ved drukning.{*B*} -- Dører som blir ødelagt av zombier, vises som skadet.{*B*} -- Is smelter i underverdenen.{*B*} -- Gryter fylles opp når de står ute i regnet.{*B*} -- Stempler tar dobbelt så lang tid å oppdatere.{*B*} -- Griser mister salen når de blir drept.{*B*} -- Fargen på himmelen i underverdenen er endret.{*B*} -- Hyssing kan utplasseres (for snubletråder).{*B*} -- Regn faller gjennom løvverk.{*B*} -- Spaker kan plasseres nederst på blokker.{*B*} -- TNT påfører variabel skade avhengig av vanskelighetsgraden.{*B*} -- Bokoppskrift endret.{*B*} -- Båter ødelegger liljeplattinger i stedet for motsatt.{*B*} -- Griser slipper flere svinekoteletter.{*B*} -- Slimer yngler sjeldnere i superflate verdener.{*B*} -- Skade fra smygere varierer avhengig av vanskelighetsgraden, mer tilbakeslag.{*B*} -- Fikset feil med at endermenn ikke åpnet kjevene.{*B*} -- Lagt til teleportering av spillere (med {*BACK_BUTTON*}-menyen i spillet).{*B*} -- Lagt til nye vertsalternativer for flyvning, usynlighet og usårbarhet for eksterne spillere.{*B*} -- Lagt til opplæringer for nye gjenstander og funksjoner i Opplæringsverdenen.{*B*} -- Oppdatert posisjonen til musikkplatekistene i Opplæringsverdenen.{*B*} - + + Verten har avsluttet spillet. - - {*ETB*}Velkommen tilbake! Du har kanskje ikke lagt merke til det, men Minecraft har nettopp blitt oppdatert.{*B*}{*B*} -Det er en rekke nye funksjoner som du og vennene dine kan kose dere med, og noen av høydepunktene presenteres her. Les gjennom dem, og prøv deg frem!{*B*}{*B*} -{*T1*}Nye gjenstander{*ETB*} – Smaragd, smaragdmalm, smaragdblokk, enderkiste, snubletrådkrok, fortryllet gulleple, ambolt, blomsterpotte, brosteinmurer, brosteinmurer med mose, vissent maleri, potet, bakt potet, giftig potet, gulrot, gullgulrot, gulrot på pinne, -gresskarpai, nattsyneliksir, usynlighetseliksir, underverdenkvarts, underverdenkvartsmalm, kvartsblokk, kvartshelle, kvartstrapp, meislet kvartsblokk, kvartsblokk til søyle, fortryllet bok, teppe.{*B*}{*B*} -{*T1*}Nye vesener{*ETB*} – Zombielandsbyboere.{*B*}{*B*} -{*T1*}Nye funksjoner{*ETB*} – Handle med landsbyboere, reparer eller forheks våpen og verktøy med en ambolt, lagre ting i en enderkiste, kontroller en gris mens du rir på den med en gulrot på pinne!{*B*}{*B*} -{*T1*}Nye miniopplæringer{*ETB*} – Lær deg hvordan du bruker de nye funksjonene i opplæringsverdenen!{*B*}{*B*} -{*T1*}Nye "påskeegg"{*ETB*} – Vi har flyttet alle de hemmelige musikkplatene i opplæringsverdenen. Se om du kan finne dem igjen!{*B*}{*B*} + + Du kan ikke bli med i dette spillet fordi du ikke er venn med noen i det. - - Påfører mer skade enn med hendene. + + Du kan ikke bli med i dette spillet fordi du har blitt sparket ut av verten tidligere. - - Brukes til å grave i jord, gress, sand, grus og snø raskere enn for hånd. Spader kreves for å grave opp snøballer. + + Du ble sparket ut av spillet for å ha flydd. - - Kreves for å hugge ut steinrelaterte blokker og malm. + + Tilkoblingen tok for lang tid. - - Brukes til å hugge ut trerelaterte blokker raskere enn for hånd. + + Serveren er full. - - Brukes til å gjøre jord- og gressblokker klare til dyrking. + + I denne modusen lurker fiender i omgivelsene og påfører deg stor mengde skade. Du må også passe deg for smygere, siden de neppe avbryter sine eksplosive angrep selv om du beveger deg bort fra dem! - - Tredører aktiveres ved å bruke dem, slå på dem eller ved hjelp av rødstein. + + Temaer - - Jerndører kan kun åpnes med rødstein, knapper eller brytere. + + Skallpakker - - + + Tillat venner av venner - - + + Spark ut spiller - - + + Er du sikker på at du vil sparke ut denne spilleren fra spillet? Vedkommende vil ikke kunne bli med igjen før du starter verdenen på nytt. - - + + Spillerbildepakker - - Gir brukeren 1 i rustning. + + Du kan ikke bli med i dette spillet fordi det er begrenset til spillere som er venn med verten. - - Gir brukeren 3 i rustning. + + Nedlastbart innhold ødelagt - - Gir brukeren 2 i rustning. + + Dette nedlastbare innholdet er ødelagt og kan ikke brukes. Slett det, og installer det deretter på nytt via Minecraft-butikkmenyen. - - Gir brukeren 1 i rustning. + + Deler av det nedlastbare innholdet er ødelagt og kan ikke brukes. Slett det, og installer det deretter på nytt via Minecraft-butikkmenyen. - - Gir brukeren 2 i rustning. + + Kan ikke bli med i spill - - Gir brukeren 5 i rustning. + + Valgt - - Gir brukeren 4 i rustning. + + Valgt skall: - - Gir brukeren 1 i rustning. + + Last ned fullversjon - - Gir brukeren 2 i rustning. + + Lås opp teksturpakke - - Gir brukeren 6 i rustning. + + Du må låse opp denne teksturpakken for å kunne bruke den. +Vil du låse den opp nå? - - Gir brukeren 5 i rustning. + + Prøveversjon av teksturpakke - - Gir brukeren 2 i rustning. + + Seed - - Gir brukeren 2 i rustning. + + Lås opp skallpakke - - Gir brukeren 5 i rustning. + + Du må låse opp denne skallpakken for å kunne bruke det valgte skallet. +Vil du låse den opp nå? - - Gir brukeren 3 i rustning. + + Du bruker en prøveversjon av teksturpakken. Du vil ikke kunne lagre denne verdenen med mindre du låser opp fullversjonen. +Vil du låse opp fullversjonen av teksturpakken? - - Gir brukeren 1 i rustning. + + Last ned fullversjon - - Gir brukeren 3 i rustning. + + Denne verdenen bruker en flettepakke eller teksturpakke som du ikke har! +Vil du installere flettepakken eller teksturpakken nå? - - Gir brukeren 8 i rustning. + + Last ned prøveversjon - - Gir brukeren 6 i rustning. + + Teksturpakke finnes ikke - - Gir brukeren 3 i rustning. + + Lås opp fullversjon - - En skinnende barre som kan brukes til å utforme verktøy laget av dette materialet. Lages ved å smelte malm i en smelteovn. + + Last ned prøveversjon - - Gjør at barrer, edelstener eller fargestoffer kan gjøres om til plasserbare blokker. Kan brukes som en dyr byggeblokk eller til kompakt oppbevaring av malm. + + Spillmodusen er endret. - - Sender ut en elektrisk ladning når spillere, dyr eller monstre tråkker på den. Trykkplater av tre kan også aktiveres ved at noe slippes ned på dem. + + Når dette er aktivert, kan kun inviterte spillere bli med. - - Brukes til kompakte trapper. + + Når dette er aktivert, kan venner av dine venner bli med i spillet. - - Brukes til å lage lange trapper. To heller plassert oppå hverandre vil utgjøre en blokk av vanlig størrelse. + + Når dette er aktivert, kan spillerne skade hverandre. Påvirker bare overlevelsesmodus. - - Brukes til å lage lange trapper. To heller plassert oppå hverandre skaper en helleblokk av vanlig størrelse. + + Normal - - Brukes til å lage lys. Fakler kan også smelte snø og is. + + Superflat - - Brukes som et bygningsmateriale og kan lages om til mange ting. Kan utformes av alle typer tre. + + Når dette er aktivert, blir spillet et onlinespill. - - Brukes som et bygningsmateriale. Påvirkes ikke av tyngdekraft slik som vanlig sand. + + Når dette er deaktivert, kan ikke spillere som blir med, bygge eller utvinne før de får godkjenning. - - Brukes som et bygningsmateriale. + + Når dette er aktivert, vil byggverk som landsbyer og festninger bli generert i verdenen. - - Brukes til å lage fakler, piler, skilt, stiger, gjerder samt skaft til verktøy og våpen. + + Når dette er aktivert, genereres en helt flat verden i oververdenen og underverdenen. - - Brukes til å spole frem til neste morgen hvis alle spillerne i verdenen er i en seng til samme tid. Endrer i tillegg spillerens returneringspunkt. -Fargen på sengen er alltid lik, uavhengig av fargen på ullen som brukes. + + Når dette er aktivert, dukker det opp en kiste med noen nyttige gjenstander i nærheten av spillernes returneringspunkt. - - Gjør det mulig å utforme et mer variert utvalg av gjenstander enn ved vanlig utforming. + + Når dette er aktivert, kan ild spre seg til brennbare blokker i nærheten. - - Gjør det mulig å smelte malm, lage trekull og glass, og tilberede fisk og koteletter. + + Når dette er aktivert, vil TNT eksplodere etter aktivering. - - Til oppbevaring av blokker og gjenstander. Plasser to kister ved siden av hverandre for å lage en større kiste med dobbel kapasitet. + + Når dette er aktivert, vil underverdenen bli gjenskapt. Dette er kjekt hvis du har en eldre lagring uten fort i underverdenen. - - Brukes som en barriere som ikke kan hoppes over. Teller som 1,5 blokk for spillere, dyr og monstre, men som 1 blokk for andre blokker. + + Av - - Brukes til å klatre sidelengs. + + Spillmodus: Kreativ - - Aktiveres ved å brukes, slå på eller ved hjelp av rødstein. Fungerer som vanlige dører, men er 1x1 blokk stor og ligger flatt på bakken. + + Overlevelse - - Viser tekst som du eller andre spillere har skrevet inn. + + Kreativ - - Brukes til å oppnå et skarpere lys enn fakler. Smelter snø/is og kan brukes under vann. + + Gi nytt navn til verden - - Brukes til å skape eksplosjoner. Aktiveres etter utplassering ved å tennes med tennstål eller med en elektrisk ladning. + + Skriv inn det nye navnet på verdenen din. - - Brukes til å ha soppstuing oppi. Du beholder bollen når stuingen er spist opp. + + Spillmodus: Overlevelse - - Brukes til å oppbevare og frakte vann, lava og melk. + + Laget i overlevelsesmodus - - Brukes til å oppbevare og frakte vann. + + Endre navn på lagring - - Brukes til å oppbevare og frakte lava. + + Automatisk lagring om %d ... - - Brukes til å oppbevare og frakte melk. + + - - Brukes til å lage ild, tenne TNT og åpne portaler etter at de er bygget. + + Laget i kreativ modus - - Brukes til å fange fisk. + + Vis skyer - - Viser solens og månens posisjon. + + Hva vil du gjøre med denne lagringen? - - Peker mot startpunktet ditt. + + HUD-størrelse (delt skjerm) - - Gir deg et bilde av et utforsket område. Kan brukes til å finne vei. + + Ingrediens - - Kan brukes med piler til angrep fra langt hold. + + Brensel - - Brukes som ammunisjon til buer. + + Dispenser - - Gir deg 2,5 {*ICON_SHANK_01*}. + + Kiste - - Gir deg 1 {*ICON_SHANK_01*}. Kan brukes 6 ganger. + + Fortrylle - - Gir deg 1 {*ICON_SHANK_01*}. + + Smelteovn - - Gir deg 1 {*ICON_SHANK_01*}. + + Det er for øyeblikket ingen tilbud på nedlastbart innhold av denne typen til dette spillet. - - Gir deg 3 {*ICON_SHANK_01*}. + + Er du sikker på at du vil slette denne lagringen? - - Gir deg 1 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. Kan gjøre deg syk. + + Venter på godkjenning - - Gir deg 3 {*ICON_SHANK_01*}. Lages ved å tilberede rå kylling i en smelteovn. + + Sensurert - - Gir deg 1,5 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. + + %s har blitt med i spillet. - - Gir deg 4 {*ICON_SHANK_01*}. Lages ved å tilberede rått oksekjøtt i en smelteovn. + + %s har forlatt spillet. - - Gir deg 1,3 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. + + %s ble sparket ut fra spillet. - - Gir deg 4 {*ICON_SHANK_01*}. Lages ved å tilberede en rå svinekotelett i en smelteovn. + + Bryggeapparat - - Gir deg 1 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. Kan også brukes til å mate og temme en ozelot. + + Skriv inn skilttekst - - Gir deg 2,5 {*ICON_SHANK_01*}. Lages ved å tilberede en rå fisk i en smelteovn. + + Skriv inn tekst som skal vises på skiltet ditt. - - Gir deg 2 {*ICON_SHANK_01*} og kan brukes til å lage et gulleple. + + Skriv inn tittel - - Gir deg 2 {*ICON_SHANK_01*} og regenererer helsen din i 4 sekunder. Lages av et eple og gullklumper. + + Prøveperioden er over - - Gir deg 2 {*ICON_SHANK_01*}. Kan føre til matforgiftning. + + Spillet er fullt - - Brukes i kakeoppskriften og som ingrediens for å brygge eliksirer. + + Kunne ikke bli med i spillet fordi det ikke var flere plasser igjen. - - Brukes til å sende en elektrisk ladning når den slås på eller av. Blir værende i på- eller av-stilling til neste gang den betjenes. + + Skriv inn en tittel på innlegget ditt. - - Sender kontinuerlig ut en elektrisk ladning eller kan brukes som sender/mottaker ved tilkobling på siden av en blokk. -Kan også brukes som svak belysning. + + Skriv inn en beskrivelse for innlegget ditt. - - Brukes i rødsteinkretser som repeater, forsinker og/eller diode. + + Inventar - - Brukes til å sende en elektrisk ladning når den trykkes på. Er på i ca. ett sekund før den slår seg av igjen. + + Ingredienser - - Brukes til å fylles med og mate ut gjenstander i tilfeldig rekkefølge etter at den gis en rødsteinladning. + + Skriv inn bildetekst - - Spiller en note ved utløsning. Slå den for å endre tonehøyde. Ved å plassere den på ulike blokker endrer du typen instrument som brukes. + + Skriv inn en bildetekst for innlegget ditt. - - Brukes til å kjøre gruvevogner på. + + Skriv inn beskrivelse - - Når den forsynes med kraft, akselererer gruvevogner på den. Når den ikke forsynes med kraft, stopper gruvevogner på den. + + Spiller nå: - - Fungerer som en trykkplate (sender et rødsteinsignal når den forsynes med kraft), men kan kun aktiveres av gruvevogner. + + Er du sikker på at du vil legge til dette nivået i din liste over sperrede nivåer? +Hvis du velger OK, forlater du også dette spillet. - - Brukes til å transportere deg, et dyr eller et monster på skinnene. + + Fjernet fra liste over sperrede nivåer - - Brukes til å transportere varer på skinnene. + + Intervall for automatisk lagring - - Går på skinner og kan drive andre gruvevogner når du skuffer kull inn i den. + + Sperret nivå - - Brukes til å komme deg fortere fram i vann enn ved å svømme. + + Spillet du er i ferd med å bli med i, er på din liste over sperrede nivåer. +Hvis du velger å bli med, fjernes dette nivået fra din liste over sperrede nivåer. - - Fås fra sauer og kan farges med fargestoffer. + + Sperre dette nivået? - - Brukes som et bygningsmateriale og kan farges med fargestoffer. Denne oppskriften anbefales ikke, ettersom ull enkelt kan fås fra sauer. + + Intervall for automatisk lagring: AV - - Brukes som fargestoff for å lage svart ull. + + Gjennomsiktighet for grensesnitt - - Brukes som fargestoff for å lage grønn ull. + + Gjør klart til automatisk lagring av nivå - - Brukes som fargestoff for å lage brun ull, som ingrediens i kjeks, eller til å dyrke kakaofrukter. + + HUD-størrelse - - Brukes som fargestoff for å lage sølvfarget ull. + + Minutter - - Brukes som fargestoff for å lage gul ull. + + Kan ikke plasseres her! - - Brukes som fargestoff for å lage rød ull. + + Det er ikke tillatt å plassere lava i nærheten av ynglepunktet på grunn av faren for at spillerne dør rett etter yngling. - - Brukes til å få avlinger, trær, høyt gress, digre sopper og blomster til å vokse umiddelbart, og kan i tillegg brukes til farging. + + Favorittskall - - Brukes som fargestoff for å lage rosa ull. + + %s sitt spill - - Brukes som fargestoff for å lage oransje ull. - - - Brukes som fargestoff for å lage limegrønn ull. + + Ukjent vertsspill - - Brukes som fargestoff for å lage grå ull. + + Gjest logget ut - - Brukes som fargestoff for å lage lysegrå ull. - (Merk: Lysegrått fargestoff kan også lages ved å blande grått fargestoff med beinmel – da kan du lage fire lysegrå fargestoffer fra hver blekkpose i stedet for tre.) + + Tilbakestill innstillinger - - Brukes som fargestoff for å lage lyseblå ull. + + Er du sikker på at du vil tilbakestille innstillingene til standardverdiene? - - Brukes som fargestoff for å lage turkis ull. + + Innlastingsfeil - - Brukes som fargestoff for å lage lilla ull. + + En gjestespiller har logget ut, slik at alle gjestespillere er fjernet fra spillet. - - Brukes som fargestoff for å lage magentarød ull. + + Kunne ikke opprette spill - - Brukes som fargestoff for å lage blå ull. + + Automatisk valgt - - Spiller musikkplater + + Ingen pakke: Standardskall - - Bruk disse til å lage ekstra sterke verktøy, våpen eller rustninger. + + Logg inn - - Brukes til å lage skarpere lys enn fakler. Smelter snø/is og kan brukes under vann. + + Du er ikke logget inn, noe du må være for å kunne spille. Vil du logge inn nå? - - Brukes til å lage bøker og kart. + + Flerspiller ikke tillatt - - Kan brukes til å lage bokhyller eller fortrylles om til fortryllede bøker. + + Drikk - - Gjør det mulig å lage sterkere fortryllelser hvis den plasseres ved fortryllelsesbordet. + + + I dette området er det bygget en gård. Gjennom å drive en gård kan du skaffe deg en fornybar kilde til mat og andre gjenstander. + - - Brukes som dekorasjon. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om gårdsdrift.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om gårdsdrift. + - - Kan utvinnes med med en jernhakke eller bedre, og deretter smeltes i en smelteovn for å lage gullbarrer. + + Hvete, gresskar og meloner dyrkes fra frø. Hvetefrø får du ved å knuse høyt gress eller høste inn hvete, mens gresskar- og melonfrø fås fra henholdsvis gresskar og meloner. - - Kan utvinnes med med en steinhakke eller bedre, og deretter smeltes i en smelteovn for å lage jernbarrer. + + Trykk på {*CONTROLLER_ACTION_CRAFTING*} for å åpne inventaret for kreativ modus. - - Kan utvinnes med en hakke for å få kull. + + Kom deg over på motsatt side av dette hullet for å fortsette. - - Kan utvinnes med en steinhakke eller bedre for å få lasurstein. + + Du har nå fullført opplæringen for kreativ modus. - - Kan utvinnes med en jernhakke eller bedre for å få diamanter. + + Før du planter frøene, må jordblokker gjøres om til dyrkbar jord ved hjelp av en krafse. Du trenger en vannkilde i nærheten for å vanne jorden slik at avlingene vokser fortere, og i tillegg må du sørge for nok lys. - - Kan utvinnes med en jernhakke eller bedre for å få rødsteinstøv. + + Kaktuser må plantes på sand, og kan vokse seg opptil tre blokker høye. På samme måte som med sukkerrør vil du ved å knuse den nederste blokken også kunne samle inn fra blokkene over.{*ICON*}81{*/ICON*} - - Kan utvinnes med en hakke for å få brostein. + + Sopp bør plantes på et svakt opplyst sted, og vil deretter spre seg til andre svakt opplyste blokker i nærheten.{*ICON*}39{*/ICON*} - - Samles ved hjelp av spade. Kan brukes til bygging. + + Beinmel kan brukes til å få avlinger helt utvokste eller til å få sopper til å vokse seg til digre sopper.{*ICON*}351:15{*/ICON*} - - Kan plantes og blir til slutt til et tre. + + Hvete går gjennom flere vekstfaser, og den er først klar til innhøsting når den er litt mørkere.{*ICON*}59:7{*/ICON*} - - Uknuselig. + + Gresskar og meloner trenger også en ekstra blokk ved siden av der frøet ble plantet, slik at frukten har plass til å vokse etter at stilken er utvokst. - - Setter fyr på alt som kommer i kontakt med det. Kan samles i bøtter. + + Sukkerrør må plantes på en gress-, jord- eller sandblokk som ligger like ved en vannblokk. Når du hugger ned en sukkerrørblokk, faller også alle blokker over den ned.{*ICON*}83{*/ICON*} - - Samles ved hjelp av spade. Kan smeltes om til glass ved hjelp av smelteovnen. Påvirkes av tyngdekraften hvis det ikke er et annet felt under den. + + I kreativ modus har du et uendelig antall gjenstander og blokker tilgjengelig, du kan knuse blokker med ett klikk uten verktøy, du er usårbar, og du kan fly. - - Samles ved hjelp av spade. Produserer i blant flint når den graves opp. Påvirkes av tyngdekraften hvis det ikke er et annet felt under den. + + + I kisten i dette området er det noen komponenter som du kan bruke til å lage kretser med stempler. Prøv å bruke eller fullføre kretsene i dette området, eller lag din egen krets. Det finnes flere eksempler utenfor opplæringsområdet. + - - Hugges med øks og kan utformes til planker eller brukes som brensel. + + + I dette området er det en portal til underverdenen! + - - Lages ved å smelte sand i en smelteovn. Kan brukes til bygging, men knuser hvis du prøver å utvinne fra det. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om portaler og underverdenen.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om portaler og underverdenen. + - - Utvinnes fra stein ved hjelp av en hakke. Kan brukes til å bygge smelteovner eller steinverktøy. + + + Rødsteinstøv samles ved å utvinne fra rødsteinmalm med en jern-, diamant- eller gullhakke. Støvet kan brukes til å transportere kraft i opptil 15 blokker, og det kan bevege seg én blokkhøyde opp eller ned. + {*ICON*}331{*/ICON*} + - - Bakes av leire i smelteovn. + + + Rødsteinrepeatere kan brukes til å øke avstanden kraften kan transporteres, eller til å legge inn en forsinkelse i en krets. + {*ICON*}356{*/ICON*} + - - Kan bakes til teglsteiner i smelteovn. + + + Når et stempel forsynes med kraft, strekker det seg ut og skyver opptil 12 blokker. Når stempelet så trekker seg inn igjen, og det er snakk om et klistrestempel, trekker det tilbake én blokk av de fleste typer som ligger inntil stempelet. + {*ICON*}33{*/ICON*} + - - Når den knuses, blir den til leirklumper som kan bakes til teglsteiner i en smelteovn. + + + Portaler lages ved å plassere obsidianblokker i en ramme som er fire blokker bred og fem blokker høy. Hjørneblokker trengs ikke. + - - En kompakt måte å oppbevare snøballer på. + + + Underverdenen kan også brukes til å hurtigreise i oververdenen – én blokk i underverdenen tilsvarer tre i oververdenen. + - - Kan graves i med en spade og gjøres om til snøballer. + + + Du er nå i kreativ modus. + - - Produserer i blant hvetefrø etter knusing. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om kreativ modus.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om kreativ modus. + - - Kan gjøres om til fargestoff. + + + For å aktivere en underverdenportal må du tenne på obsidianblokkene i rammen med tennstål. Portaler kan deaktiveres dersom rammen brytes, det skjer en eksplosjon i nærheten eller det flyter en væske gjennom dem. + - - Kan gjøres om til stuing ved hjelp av en bolle. + + + For å bruke en underverdenportal må du stille deg i den. Skjermen blir da lilla og du vil høre en lyd. Etter noen sekunder vil du bli transportert til en annen dimensjon. + - - Kan kun utvinnes med en diamanthakke. Produseres når vann og størknet lava møtes, og kan brukes til å bygge portaler. + + + Underverdenen kan være et farlig sted å være, ettersom det er fullt av lava der, men det kan være et lurt sted å være for å samle underverdenstein, som brenner for evig når den tennes, samt glødestein som gir lys. + - - Yngler monstre til verden. + + Du har nå fullført opplæringen for gårdsdrift. - - Plasseres på bakken for å føre elektrisk strøm. Ved brygging sammen med en eliksir økes effektens varighet. + + Ulike typer verktøy passer til ulike typer materialer. Det lønner seg å bruke en øks til å hugge trestammer. - - Når avlinger er utvokste, kan de høstes inn og gi deg hvete. + + Ulike typer verktøy passer til ulike typer materialer. Det lønner seg å bruke en hakke til å utvinne fra steiner og malm. Det kan hende du trenger en hakke av et bedre materiale for å kunne utvinne ressurser fra noen typer blokker. - - Jord som er klar til å plante frø i. + + Noen verktøy fungerer bedre enn andre til å angripe fiender. Det kan lønne seg å bruke et sverd når du skal angripe. - - Kan tilberedes i en smelteovn for å lage grønt fargestoff. + + Jerngolemer finnes også naturlig som beskyttelse av landsbyer, og disse angriper deg hvis du angriper noen av landsbyboerne. - - Kan lages om til sukker. + + Du kan ikke forlate dette området før du har fullført opplæringen. - - Kan brukes som hjelm eller lages om til en gresskarlykt ved hjelp av en fakkel, og er også hovedingrediensen i gresskarpai. + + Ulike typer verktøy passer til ulike typer materialer. Det lønner seg å bruke en spade til å utvinne fra myke materialer som jord og sand. - - Brenner evig hvis den tennes. + + Hint: Hold inne {*CONTROLLER_ACTION_ACTION*} for å utvinne og hugge med hendene eller det du måtte holde i dem. Noen blokker må du kanskje lage et eget verktøy for å utvinne fra. - - Forsinker alt og alle som går over den. + + I kisten ved siden av elven er det en båt. For å bruke båten peker du på vannet med markøren og trykker på {*CONTROLLER_ACTION_USE*}. Bruk {*CONTROLLER_ACTION_USE*} mens du peker på båten for å gå opp i den. - - Transporterer deg mellom oververdenen og underverdenen. + + I kisten ved siden av dammen er det en fiskestang. Ta den opp fra kisten og velg den som gjenstanden du holder i hånden, for å bruke den. - - Brukes som brensel i smelteovner eller kan utformes til en fakkel. + + Denne litt mer avanserte stempelmekanismen lager en selvreparerende bro! Trykk på knappen for å aktivere den, og undersøk deretter hvordan komponentene virker sammen for å finne ut mer. - - Fås ved å drepe en edderkopp og kan utformes til en bue eller fiskestang, eller den kan plasseres på bakken og brukes som snubletråd. + + Verktøyet du bruker, har blitt skadet. Hver gang du bruker et verktøy, vil det bli litt slitt, og til slutt vil det bli ødelagt. Fargelinjen under gjenstanden i inventaret viser skadestatusen dens. - - Fås ved å drepe en høne og kan utformes til en pil. + + Hold inne {*CONTROLLER_ACTION_JUMP*} for å svømme opp. - - Fås ved å drepe en smyger og kan utformes til TNT eller brukes som en ingrediens ved brygging av eliksirer. + + I dette området er det en gruvevogn på en skinne. For å gå opp i gruvevognen peker du på den med markøren og trykker på {*CONTROLLER_ACTION_USE*}. Bruk {*CONTROLLER_ACTION_USE*} på knappen for å få gruvevognen til å bevege seg. - - Kan plantes i dyrkbar jord og bli til avlinger. Sørg for at frøene får nok lys til å kunne vokse! - - - Høstes inn fra avlinger og kan brukes til å utforme matvarer. + + Jerngolemer lages ved å sette fire jernblokker i det viste mønsteret og deretter et gresskar på toppen av den midterste blokken. Jerngolemer angriper fiendene dine. - - Samles ved å grave i grus og kan brukes til å lage tennstål. + + Fôr kuer, soppkuer, griser eller sauer med hvete, høner med hvetefrø eller underverdenvorter og ulver med en eller annen type kjøtt, så begynner de snart å se seg om etter et dyr av samme art som også er i elskovsmodus. - - Hvis du setter den på en gris, kan du ri på den. Grisen kan styres med en gulrot på pinne. + + Når to dyr av samme art møtes som begge er i elskovsmodus, begynner de kysse litt, og så dukker det snart opp en dyreunge. Dyreungene følger foreldrene sine en stund før de selv blir voksne dyr. + - - Fås ved å grave i snøen, og kan deretter kastes. + + Etter at dyrene har vært i elskovsmodus, vil de ikke kunne gå tilbake til denne modusen før etter ca. 5 minutter. - - Fås ved å drepe en ku og kan utformes til rustning eller brukes til å lage bøker. + + + I dette områdene er dyrene inngjerdet. Du kan avle dyr slik at de lager babyversjoner av seg selv. + - - Fås ved å drepe en slim. Brukes som en ingrediens ved brygging av eliksirer eller til å lage klistrestempler. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få mer informasjon om dyreavl.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om dyreavl. + - - Slippes fra tid til annen av høner, og kan utformes til matvarer. + + For å avle frem dyr må du fôre dem riktig slik at de går inn i en "elskovsmodus". - - Fås ved å utvinne fra glødestein og kan utformes til nye glødesteinblokker eller brygges sammen med en eliksir for å øke effektens varighet. + + Noen dyr følger etter deg hvis du holder mat de liker, i hånden. Dette gjør det enklere å plassere de ulike artene sammen for å avle dem.{*ICON*}296{*/ICON*} - - Fås ved å drepe et skjelett. Kan utformes til beinmel, eller mates til ulver for å temme dem. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om golemer.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om golemer. + - - Fås ved å få et skjelett til å drepe en smyger. Kan spilles i en platespiller. + + Golemer lages ved å plassere et gresskar oppå en stabel med blokker. - - Slukker ild og får avlinger til å vokse. Kan samles i bøtter. + + Snøgolemer lages ved å sette to snøblokker oppå hverandre og deretter et gresskar på toppen av dem igjen. Snøgolemer kaster snøballer på fiendene dine. - - Når de knuses, avgir de i blant et ungtre, som deretter kan plantes og vokse seg til et stort tre. + + + Ville ulver kan temmes ved å gi dem bein. Når de er temmet, kommer det kjærlighetshjerter rundt dem. Ulver som er temmet, følger spillerne og forsvarer dem hvis ikke de har blitt kommandert til å sitte. + - - Kan brukes til bygging og dekorasjon. Finnes i fangehull. + + Du har nå fullført opplæringen for dyreavl. - - Brukes til å få ull fra sauer og høste inn løvblokker. + + + I dette området er det noen gresskar og blokker som kan brukes til å lage en snøgolem eller jerngolem. + - - Når den forsynes med kraft (via en knapp, en spak, en trykkplate, en rødsteinfakkel eller rødstein med en hvilken som helst av disse) kommer det ut et stempel som kan skyve blokker. + + + Hvor og i hvilken retning du plasserer en kraftkilde, kan bestemme hvordan den virker inn på blokkene rundt den. For eksempel kan en rødsteinfakkel ved siden av en blokk slås av hvis blokken får kraft fra en annen kilde. + - - Når den forsynes med kraft (via en knapp, en spak, en trykkplate, en rødsteinfakkel eller rødstein med en hvilken som helst av disse) kommer det ut et stempel som kan skyve blokker. Når stempelet trekker seg inn igjen, trekker det tilbake blokken som ligger inntil stempelet. + + + Dersom gryten blir tom, kan du fylle den igjen med en vannbøtte. + - - Lages av steinblokker og er å finne i festninger. + + + Bruk bryggeapparatet til å lage en eliksir med ildmotstand. Til det vil du trenge en vannflaske, en underverdenvorte og magmakrem. + - - Brukes som en barriere, ligner på gjerder. + + + Når du holder en eliksir i hånden, kan du ta den i bruk ved å holde inne {*CONTROLLER_ACTION_USE*}. Vanlige eliksirer kan du drikke og få virkningen av selv, mens spruteeliksirer kan kastes, slik at virkningen spres på vesener i nærheten av der de treffer. + Spruteeliksirer lager du ved å legge til krutt i vanlige eliksirer. + - - Som en dør, men brukes hovedsakelig sammen med gjerder. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om brygging og eliksirer.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om brygging og eliksirer. + - - Kan utformes fra melonskiver. + + + Første steg når du skal brygge en eliksir, er å lage en vannflaske. Ta en glassflaske fra kisten. + - - Gjennomsiktige blokker som kan brukes som et alternativ til glassblokker. + + + Du kan fylle en glassflaske ved hjelp av en gryte med vann eller en vannblokk. Fyll glassflasken nå ved å peke på vannkilden og trykke på {*CONTROLLER_ACTION_USE*}. + - - Kan plantes for å dyrke gresskar. + + + Bruk en eliksir med ildmotstand på deg selv. + - - Kan plantes for å dyrke meloner. + + + Hvis du vil fortrylle en gjenstand, må du først plassere den på fortryllelsesplassen. Våpen, rustning og noen typer verktøy kan fortrylles for å gi dem spesielle effekter som f.eks. bedre motstandsdyktighet mot skader eller økt utvinningsmengde. + - - Slippes av endermenn når de dør. Når du kaster disse, teleporteres du til det stedet enderperlen lander på, men samtidig mister du litt helse. + + + Når en gjenstand plasseres på fortryllelsesplassen, vil knappene til høyre endres til å vise et utvalg med tilfeldige fortryllelser. + - - En jordblokk det vokser gress på. Samles med en spade. Kan brukes til bygging. + + + Tallet på knappene viser hvor mye den aktuelle fortryllelsen koster i erfaringsnivå. Hvis du ikke har høyt nok nivå, vil den aktuelle knappen være deaktivert. + - - Kan brukes til bygging og dekorasjon. + + + Nå som du er motstandsdyktig mot ild og lava, kan du se om du finner noen steder du ikke kunne komme til før. + - - Sinker dem som går gjennom det. Kan ødelegges med sauesaks for å få hyssing. + + + Dette er fortryllelsesgrensesnittet. Her kan du legge fortryllelser på våpen, rustning og noen typer verktøy. + - - Yngler en sølvkre når de ødelegges. Kan også yngle en sølvkre hvis den er i nærheten av andre sølvkre som angripes. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om fortryllelsesgrensesnittet.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om fortryllelsesgrensesnittet. + - - Vokser i lang tid når den blir utplassert. Kan samles ved hjelp sauesaks. Kan klatres på som en stige. + + + Her er det et bryggeapparat, en gryte og en kiste full av bryggegjenstander. + - - Glatt å gå på. Blir til vann hvis den ødelegges over en annen blokk. Smelter hvis den er i nærheten av en lyskilde eller hvis den plasseres i underverdenen. + + + Trekull kan brukes som brensel eller utformes til fakler med pinner. + - - Kan brukes som dekorasjon. + + + Hvis du plasserer sand på ingrediensplassen, kan du lage glass. Lag noen glassblokker som du kan bruke som vindu i tilfluktsstedet ditt. + - - Brukes til å brygge eliksirer og finne festninger. Slippes av blusser som ofte er å finne i nærheten av fort i underverdenen. + + + Dette er bryggegrensesnittet. Her kan du lage eliksirer med en rekke ulike virkninger. + - - Brukes til å brygge eliksirer. Slippes av geister når de dør. + + + Mange tregjenstander kan brukes som brensel, men ikke alt brenner like lenge. Du vil kanskje også se at det er andre ting ute i verdenen som kan brukes som brensel. + - - Slippes av zombie-grisemenn når de dør. Zombie-grisemenn finnes i underverdenen. Brukes som en ingrediens ved brygging av eliksirer. + + Når du har behandlet gjenstandene dine i smelteovnen, kan du flytte dem over til inventaret ditt. Prøv deg frem med ulike ingredienser for å se hva du kan lage. + - - Brukes til å brygge eliksirer. Vokser naturlig i fort i underverdenen. Kan også plantes på sjelesand. + + + Hvis du bruker tre som ingrediens, kan du lage trekull. Legg litt brensel i smelteovnen og litt tre på ingrediensplassen. Det kan imidlertid ta litt tid å lage trekull, så du kan benytte tiden til å gjøre andre ting, og så komme tilbake se hvordan det går senere. + - - Kan ha ulike effekter avhengig av hva de brukes på. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker bryggeapparatet. + - - Kan fylles med vann og brukes som startingrediens for eliksirer i bryggeapparatet. + + + Dersom du legger til gjæret edderkoppøye, blir eliksiren fordervet og kan få motsatt virkning, og ved å legge til krutt gjør du eliksiren om til en spruteeliksir som kan kastes slik at virkningen påføres området den lander i. + - - Dette er en giftig ingrediens til eliksirer og matretter. Slippes når en edderkopp eller huleedderkopp drepes av en spiller. + + + Lag en eliksir med ildmotstand ved først å ta en vannflaske og legge til underverdenvorte, og deretter legge til magmakrem. + - - Brukes til å brygge eliksirer, og da hovedsakelig eliksirer med negativ virkning. + + + Trykk på {*CONTROLLER_VK_B*} for å gå ut av bryggegrensesnittet. + - - Brukes til å brygge eliksirer eller sammen med andre gjenstander for å lage enderøyer eller magmakrem. + + + Du brygger eliksirer ved å plassere en ingrediens i toppen, og så en eliksir eller en vannflaske i bunnen (opp til tre kan brygges samtidig). Når du har valgt en godkjent kombinasjon, begynner bryggeprosessen, og etter en kort stund har du en ferdig eliksir. + - - Brukes til å brygge eliksirer. + + + Alle eliksirer har en vannflaske som utgangspunkt. Og de fleste eliksirer lages ved først å bruke en underverdenvorte for å lage en rar eliksir, før du deretter legger til minst én ingrediens til for å lage den endelige eliksiren. + - - Brukes til å brygge eliksirer og spruteeliksirer. + + + Når du har laget en eliksir, kan du modifisere virkningen. Ved å legge til rødsteinstøv økes virkningstiden, og hvis du legger til glødesteinstøv blir virkningen kraftigere. + - - Fylles med vann ved hjelp av regn eller en bøtte, og kan deretter brukes til å fylle glassflasker med vann. + + + Velg en fortryllelse, og trykk på {*CONTROLLER_VK_A*} for å bruke den på gjenstanden. Dette vil redusere erfaringsnivået ditt med prisen på fortryllelsen. + - - Viser retningen til en sluttportal når det kastes. Når tolv av disse plasseres i sluttportalrammer, aktiveres sluttportalen. + + + Trykk på {*CONTROLLER_ACTION_USE*} for å kaste ut snøret og begynne å fiske. Trykk på {*CONTROLLER_ACTION_USE*} igjen for å snelle inn snøret. + {*FishingRodIcon*} + - - Brukes til å brygge eliksirer. - - - Ligner på gressblokker, men er veldig effektive å dyrke sopp på. + + + Hvis du venter til duppen synker ned før du sneller inn, kan du få fisk. Fisk kan spises rå eller tilberedes på en smelteovn, og den gir deg helse. + {*FishIcon*} + - - Flyter på vannet og kan gås på. + + + På samme måte som mange andre redskaper har også fiskestangen et bestemt antall bruksområder. Prøv deg frem med den for å se hva annet du kan fange eller aktivere ... + {*FishingRodIcon*} + - - Brukes til å bygge fort i underverdenen. Immun mot ildkuler fra geister. + + + Med en båt kan du reise raskere på vann. Den kan styres med {*CONTROLLER_ACTION_MOVE*} and {*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + - - Brukes i fort i underverdenen. + + + Du holder nå en fiskestang. Trykk på {*CONTROLLER_ACTION_USE*} for å bruke den.{*FishingRodIcon*} + - - Finnes i fort i underverdenen og avgir underverdenvorter når den ødelegges. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om fisking.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om fisking. + - - Gjør det mulig å fortrylle sverd, hakker, økser, spader, buer og rustning ved hjelp av erfaringspoeng. + + + Dette er en seng. Trykk på {*CONTROLLER_ACTION_USE*} mens du peker på den på nattetid for å sove deg gjennom natten og våkne om morgenen.{*ICON*}355{*/ICON*} + - - Kan aktiveres ved hjelp av tolv enderøyer, og gjør at du kan reise til sluttdimensjonen. + + + I dette området er det noen enkle rødsteinkretser og stempler, samt en kiste med flere gjenstander som kan brukes til å forlenge disse kretsene. + - - Brukes til å lage en sluttportal. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om rødsteinkretser og stempler.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om rødsteinkretser og stempler. + - - En blokktype man finner i Slutten. Har svært høy eksplosjonsmotstand, så den er effektiv å bygge med. + + + Spaker, knapper, trykkplater og rødsteinfakler kan brukes til å forsyne kretser med kraft, enten ved å koble dem direkte til gjenstanden du vil aktivere, eller ved å koble dem til rødsteinstøv. + - - Denne blokken blir til når du beseirer dragen i Slutten. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om senger.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om senger. + - - Slipper erfaringskuler når du kaster den. Disse kulene øker erfaringspoengene dine når de samles inn. + + + Du bør plassere sengen på et trygt og godt opplyst sted, slik at du ikke blir vekket av monstre midt på natten. Hvis du dør etter at du har brukt en seng, vil du gjenoppstå i denne sengen. + {*ICON*}355{*/ICON*} + - - Brukes til å tenne på ting eller starte tilfeldige branner ved utskyting fra en dispenser. + + + Hvis det er andre spillere med i spillet ditt, må alle ligge i en seng til samme tid for at man skal kunne sove. + {*ICON*}355{*/ICON*} + - - Ligner på utstillingsmontere, og viser frem gjenstanden eller blokken som plasseres i den. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om båter.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om båter. + - - Kan yngle et vesen av angitt type ved kasting. + + + Ved hjelp av et fortryllelsesbord kan du legge til spesialeffekter som å øke hvor mange gjenstander du får fra å utvinne blokker, eller gi våpen, rustning og noen typer verktøy økt motstandsdyktighet mot skader. + - - Brukes til å lage lange trapper. To heller plassert oppå hverandre vil utgjøre en blokk av vanlig størrelse. + + + Hvis du plasserer bokhyller rundt fortryllelsesbordet, får det økt kraft og du får tilgang til fortryllelser på høyere nivå. + - - Brukes til å lage lange trapper. To heller plassert oppå hverandre vil utgjøre en blokk av vanlig størrelse. + + + Å fortrylle gjenstander koster erfaringsnivå. Dette nivået kan du bygge opp ved å samle erfaringskuler, som du får tak i ved å drepe monstre og dyr, utvinne fra malm, avle opp dyr, fiske samt smelte/tilberede ting i smelteovner. + - - Lages ved å smelte en underverdenstein i en smelteovn. Kan utformes til underverdenmursteinsblokker. + + + Selv om fortryllelsene er tilfeldige, vil noen av de aller beste fortryllelsene kun være tilgjengelige når du har et høyt erfaringsnivå og har mange bokhyller rundt fortryllelsesbordet ditt. + - - Lyser når de forsynes med kraft. + + + Her er det et fortryllelsesbord og noen andre ting som kan bruke til å lære mer om fortryllelse. + - - Kan dyrkes for å gi kakaobønner. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få mer informasjon om fortryllelse.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om fortryllelse. + - - Vesenhoder kan utplasseres som dekorasjon eller brukes som en maske på hjelmplassen. + + + Du kan også bygge opp erfaringsnivå ved hjelp av en flaske med fortryllelse, som avgir erfaringskuler rundt seg når den kastes på bakken. Disse kulene kan du så samle. + - - Blekksprut + + + Gruvevogner går på skinner. Du kan også lage en kraftforsynt gruvevogn ved hjelp av en smelteovn og en gruvevogn med en kiste i. + {*RailIcon*} + - - Slipper blekkposer når de blir drept. + + + Du kan også lage kraftskinner, som drives av rødsteinfakler og kretser. Disse kan deretter kobles til brytere, spaker og trykkplater for å lage komplekse systemer. + {*PoweredRailIcon*} + - - Ku + + + Du seiler nå i en båt. For å gå ut av båten peker du på den med markøren og trykker på {*CONTROLLER_ACTION_USE*} .{*BoatIcon*} + - - Slipper skinn når de blir drept. Kan også melkes ved hjelp av en bøtte. + + + I kistene i dette området kan du finne noen fortryllede gjenstander, flasker med fortryllelse samt gjenstander som ikke ennå har blitt fortryllet, men som du kan eksperimentere med på erfaringsbordet. + - - Sau + + + Du kjører nå i en gruvevogn. For å gå ut av gruvevognen peker du på den med markøren og trykker på {*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} + - - Slipper ull når de blir klipt (hvis de ikke er klipt allerede). Kan farges for å gi ull av en annen farge. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om gruvevogner.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om gruvevogner. + - - Høne + + Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden. - - Slipper fjær når de blir drept, og legger også egg fra tid til annen. + + Les - - Gris + + Heng - - Slipper koteletter når de blir drept. Kan bli ridd på med en sal. + + Kast - - Ulv + + Åpne - - Føyelige til de blir angrepet, da angriper de tilbake. Kan temmes ved hjelp av bein, og ulven vil da følge deg rundt og angripe alle som angriper deg. + + Endre tonehøyde - - Smyger + + Detoner - - Eksploderer hvis du kommer for nær! + + Plant - - Skjelett + + Lås opp fullversjon - - Skyter piler på deg. Slipper piler når de blir drept. + + Slett lagring - - Edderkopp + + Slett - - Angriper deg når du kommer for nær. Kan klatre opp vegger. Slipper hyssing når de blir drept. + + Kultiver - - Zombie + + Høst inn - - Angriper deg når du kommer for nær. + + Fortsett - - Zombie-grisemann + + Svøm opp - - I utgangspunktet føyelige, men angriper i grupper hvis du angriper en av dem. + + Slå - - Geist + + Melk - - Skyter ildkuler på deg som eksploderer når de treffer. + + Samle inn - - Slim + + Tøm - - Deler seg i mindre slimer når de blir skadet. + + Sal - - Endermann + + Plasser - - Angriper deg hvis du ser på dem. Kan også flytte blokker. - - - Sølvkre + + Spis - - Tiltrekker seg skjulte sølvkre i nærheten når de angripes. Gjemmer seg i steinblokker. + + Ri - - Huleedderkopp + + Seil - - Har giftig bitt. + + Dyrk - - Soppku + + Sov - - Kan lages om til soppstuing med en bolle. Slipper sopp og blir til vanlige kuer når de klippes. + + Våkne - - Snøgolem + + Spill - - Snøgolemer kan du lage ved hjelp av snøblokker og et gresskar. De kaster snøballer på fiendene til sine skapere. + + Alternativer - - Enderdragen + + Flytt rustning - - Dette er en stor, svart drage som du finner i Slutten. + + Flytt våpen - - Blusser + + Bruk - - Dette er fiender som finnes i underverdenen, stort sett i fort. De slipper blusstaver når de blir drept. + + Flytt ingrediens - - Magmakube + + Flytt brensel - - Finnes i underverdenen. På samme måte som slimer deler de seg i mindre biter når de blir drept. + + Flytt verktøy - - Landsbyboer + + Spenn - - Ozelot + + En side opp - - Finnes i jungelen. De kan temmes ved å gi dem rå fisk. Men du må først få ozelotene til å komme til deg, for plutselige bevegelser skremmer dem bort. + + En side ned - - Jerngolem + + Elskovsmodus - - Finnes i landsbyer for beskyttelse. Kan lages ved hjelp av jernblokker og gresskar. + + Slipp - - Eksplosjonsanimatør + + Rettigheter - - Konsepttegner + + Blokk - - Tallknusing og statistikk + + Kreativ - - Bøllekoordinator + + Sperr nivå - - Original design og kode av + + Velg skall - - Prosjektleder/produsent + + Tenn på - - Resten av Mojang-kontoret + + Inviter venner - - Sjefsprogrammerer Minecraft PC + + Aksepter - - Ninjakoder + + Klipp - - CEO + + Naviger - - Hvitsnippsarbeider + + Installer på nytt - - Kundestøtte + + Lagringsalt. - - Kontor-DJ + + Utfør kommando - - Designer/programmerer Minecraft – Pocket Edition + + Installer fullversjon - - Utvikler + + Installer prøveversjon - - Sjefsarkitekt + + Installer - - Kunstnerisk utvikler + + Løs ut - - Spillutvikler + + Oppdater liste over onlinespill - - Sjef for moroa + + Partyspill - - Musikk og lyder + + Alle spill - - Programmering + + Avslutt - - Kunst + + Avbryt - - Kvalitetssikring + + Avbryt forespørsel - - Eksekutiv produsent + + Bytt gruppe - - Sjefsprodusent + + Utforming - - Produsent + + Lag - - Testleder + + Ta/plasser - - Sjefstester + + Vis inventar - - Designteam + + Vis beskrivelse - - Utviklingsteam + + Vis ingredienser - - Utgivelsesansvarlig + + Tilbake - - Direktør, XBLA-publisering + + Husk: - - Forretningsutvikling + + - - Porteføljedirektør + + Den siste versjonen av spillet har en rekke nye funksjoner, deriblant nye områder i opplæringsverdenen. - - Produktleder + + Du har ikke alle ingrediensene som kreves for å lage denne gjenstanden. I boksen nederst til venstre ser du hvilke de er. - - Markedsføring + + + Gratulerer, du har nå fullført opplæringen. Tiden i spillet går nå som normalt, og det er ikke lenge til det er natt og monstrene kommer ut! Gjør ferdig tilfluktsstedet ditt! + - - Nettsamfunnansvarlig + + {*EXIT_PICTURE*} Når du er klar for å utforske mer, er det en trappeoppgang i området ved gruveskuret som fører til et lite slott. - - Lokaliseringsteam i Europa + + {*B*}Trykk på {*CONTROLLER_VK_A*} for å spille gjennom opplæringen som vanlig.{*B*} + Trykk på {*CONTROLLER_VK_B*} for å hoppe over hovedopplæringen. - - Lokaliseringsteam i Redmond + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for mer informasjon om matlinjen og spising.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om matlinjen og spising. + - - Lokaliseringsteam i Asia + + Velg - - Brukerundersøkelsesteam + + Bruk - - MGS Central-team + + I dette området finner du områder hvor du kan lære om fisking, båter, stempler og rødstein. - - Godkjenningstester + + Utenfor dette området finner du eksempler på bygninger, gårdsdrift, gruvevogner og skinner, fortryllelse, brygging, handel, smiing og masse annet! - - Særlig takk + + + Matlinjen har falt ned til et nivå hvor du ikke lenger blir helbredet. + - - Testleder + + Ta - - Senior testleder + + Neste - - SDET + + Forrige - - Prosjekt-STE + + Spark ut spiller - - Ekstra STE + + Send venneforespørsel - - Testmedarbeidere + + En side ned - - Jon Kågström + + En side opp - - Tobias Möllstam + + Farg - - Risë Lugo + + Helbred - - Tresverd + + Sitt - - Steinsverd + + Følg meg - - Jernsverd + + Utvinn - - Diamantsverd + + Fôr - - Gullsverd + + Tem - - Trespade + + Endre filter - - Steinspade + + Plasser alle - - Jernspade + + Plasser én - - Diamantspade + + Slipp - - Gullspade + + Ta alle - - Trehakke + + Ta halvparten - - Steinhakke + + Plasser - - Jernhakke + + Slipp alle - - Diamanthakke + + Fjern hurtigvalg - - Gullhakke + + Hva er dette? - - Treøks + + Del på Facebook - - Steinøks + + Slipp én - - Jernøks + + Bytt - - Diamantøks + + Hurtigflytting - - Gulløks + + Skallpakker - - Trekrafse + + Rødfarget glassrute - - Steinkrafse + + Grønnfarget glassrute - - Jernkrafse + + Brunfarget glassrute - - Diamantkrafse + + Hvitfarget glass - - Gullkrafse + + Farget glassrute - - Tredør + + Sortfarget glassrute - - Jerndør + + Blåfarget glassrute - - Brynjehjelm + + Gråfarget glassrute - - Brynjebrystplate + + Rosafarget glassrute - - Brynjebukser + + Limefarget glassrute - - Brynjestøvler + + Lillafarget glassrute - - Skinnhatt + + Cyanfarget glassrute - - Jernhjelm + + Lysegråfarget glassrute - - Diamanthjelm + + Oransjefarget glass - - Gullhjelm + + Blåfarget glass - - Skinnkjortel + + Lillafarget glass - - Brystplate av jern + + Cyanfarget glass - - Diamantbrystplate + + Rødfarget glass - - Brystplate av gull + + Grønnfarget glass - - Skinnbukser + + Brunfarget glass - - Bukser av jern + + Lysegråfarget glass - - Bukser av diamant + + Gulfarget glass - - Bukser av gull + + Lysblåfarget glass - - Skinnstøvler + + Magentafarget glass - - Jernstøvler + + Gråfarget glass - - Diamantstøvler + + Rosafarget glass - - Gullstøvler + + Limefarget glass - - Jernbarre + + Gulfarget glassrute - - Gullbarre + + Lysegrå - - Bøtte + + Grå - - Vannbøtte + + Rosa - - Lavabøtte + + Blå - - Tennstål + + Lilla - - Eple + + Cyan - - Bue + + Lime - - Pil + + Oransje - - Kull + + Hvit - - Trekull + + Tilpasset - - Diamant + + Gul - - Pinne + + Lyseblå - - Bolle + + Magenta - - Soppstuing + + Brun - - Hyssing + + Hvitfarget glassrute - - Fjær + + Liten ball - - Krutt + + Stor ball - - Hvetefrø + + Lyseblåfarget glassrute - - Hvete + + Magentafarget glassrute - - Brød + + Oransjefarget glassrute - - Flint + + Stjerneformet - - Rå kotelett + + Sort - - Tilberedt kotelett + + Rød - - Maleri + + Grønn - - Gulleple + + Smygerformet - - Skilt + + Sprengning - - Gruvevogn + + Ukjent form - - Sal + + Sortfarget glass - - Rødstein + + Hesterustning av jern - - Snøball + + Hesterustning av gull - - Båt + + Hesterustning av diamant - - Skinn + + Rødsteinskomparator - - Melkespann + + Gruvevogn med TNT - - Murstein + + Gruvevogn med trakt - - Leire + + Reim - - Sukkerrør + + Lyssignal - - Papir + + Kiste med felle - - Bok + + Vektet trykkplate (lett) - - Slimball + + Navnemerke - - Gruvevogn med kiste + + Treplanker (alle typer) - - Gruvevogn med ovn + + Kommandoblokk - - Egg + + Fyrverkeristjerne - - Kompass + + Disse dyrene kan temmes og deretter ris på. De kan ha en kiste festet til seg. - - Fiskestang + + Muldyr - - Klokke + + Fødes når en hest og et esel formerer seg. Disse dyrene kan temmes og deretter ris på, og de kan bære kister. - - Glødesteinstøv + + Hest - - Rå fisk + + Disse dyrene kan temmes og deretter ris på. - - Tilberedt fisk + + Esel - - Fargestoff + + Zombiehest - - Blekkpose + + Tomt kart - - Rosenrød + + Underverdenstjerne - - Kaktusgrønn + + Fyrverkerirakett - - Kakaobønner + + Skjeletthest - - Lasurstein + + Wither - - Lilla fargestoff + + Disse utformes fra Wither-hodeskaller og sjelesand. De skyter eksploderende hodeskaller mot deg. - - Turkis fargestoff + + Vektet trykkplate (tung) - - Lysegrått fargestoff + + Lysegråfarget leire - - Grått fargestoff + + Gråfarget leire - - Rosa fargestoff + + Rosafarget leire - - Limegrønt fargestoff + + Blåfarget leire - - Løvetanngul + + Lillafarget leire - - Lyseblått fargestoff + + Cyanfarget leire - - Magenta fargestoff + + Limefarget leire - - Oransje fargestoff + + Oransjefarget leire - - Beinmel + + Hvitfarget leire - - Bein + + Farget glass - - Sukker + + Gulfarget leire - - Kake + + Lyseblåfarget leire - - Seng + + Magentafarget leire - - Rødsteinrepeater + + Brunfarget leire - - Kjeks + + Trakt - - Kart + + Aktivatorskinne - - Musikkplate – "13" + + Dropper - - Musikkplate – "cat" + + Rødsteinskomparator - - Musikkplate – "blocks" + + Dagslyssensor - - Musikkplate – "chirp" + + Rødsteinsblokk - - Musikkplate – "far" + + Farget leire - - Musikkplate – "mall" + + Sortfarget leire - - Musikkplate – "mellohi" + + Rødfarget leire - - Musikkplate – "stal" + + Grønnfarget leire - - Musikkplate – "strad" + + Høyballe - - Musikkplate – "ward" + + Herdet leire - - Musikkplate – "11" + + Kullblokk - - Musikkplate – "where are we now" + + Ton til - - Sauesaks + + Når dette er deaktivert, hindrer det monstre og dyr i å endre blokker (smyger-eksplosjoner vil for eksempel ikke ødelegge blokker, og sauer vil ikke fjerne gress) eller plukke opp gjenstander. - - Gresskarfrø + + Når dette er aktivert, beholder spillerne inventaret sitt selv om de dør. - - Melonfrø + + Når dette er deaktivet, vil ikke vesener yngle naturlig. - - Rå kylling + + Spillmodus: Eventyr - - Tilberedt kylling + + Eventyr - - Rått kjøtt + + Skriv inn en seed for å skape det samme terrenget igjen. Ikke skriv noe hvis du vil ha en tilfeldig verden. - - Biff + + Når dette er deaktivert, slipper ikke monstre og dyr loot (smygere slipper for eksempel ikke krutt). - - Råttent kjøtt + + {*PLAYER*} falt fra en stige - - Enderperle + + {*PLAYER*} falt av noen slyngplanter - - Melonskive + + {*PLAYER*} falt ut av vannet - - Blusstav + + Når dette er aktivert, slipper ikke blokker gjenstander når de ødelegges (steinblokker slipper for eksempel ikke brosteiner). - - Geisttåre + + Når dette er deaktivert, vil ikke spillere regenerere helse naturlig. - - Gullklump + + Når dette er deaktivert, endres ikke tiden på døgnet. - - Underverdenvorte + + Gruvevogn - - {*splash*}{*prefix*}eliksir {*postfix*} + + Binde fast - - Glassflaske + + Slipp - - Vannflaske + + Fest - - Edderkoppøye + + Stig av - - Gjæret edderkoppøye + + Fest kiste - - Blusspulver + + Avfyr - - Magmakrem + + Navngi - - Bryggeapparat + + Lyssignal - - Gryte + + Hovedkraft - - Enderøye + + Sekundærkraft - - Strålende melon + + Hest - - Flaske med fortryllelse + + Dropper - - Ildladning + + Trakt - - Ildladning (trekull) + + {*PLAYER*} falt fra et høyt sted - - Ildladning (kull) + + Kan ikke bruke yngleegg. Det maksimale antallet flaggermus er nådd. - - Gjenstandsramme + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende hester er nådd. - - Yngler {*CREATURE*} + + Spillalternativer - - Underverdenstein + + {*PLAYER*} ble skutt med ildkule av {*SOURCE*} med {*ITEM*} - - Hodeskalle + + {*PLAYER*} ble dengt av {*SOURCE*} med {*ITEM*} - - Skjelettskalle + + {*PLAYER*} ble drept av {*SOURCE*} med {*ITEM*} - - Vissenskjelettskalle + + Destruktive vesener - - Zombiehode + + Blokker slipper - - Hode + + Naturlig regenerasjon - - %s sitt hode + + Dagslyssyklus - - Smygerhode + + Behold inventar - - Stein + + Vesenyngling - - Gressblokk + + Vesenloot - - Jord + + {*PLAYER*} ble skutt av {*SOURCE*} med {*ITEM*} - - Brostein + + {*PLAYER*} falt for langt og fikk sitt endelikt av {*SOURCE*} - - Planker av eik + + {*PLAYER*} falt for langt og fikk sitt endelikt av {*SOURCE*} med {*ITEM*} - - Planker av gran + + {*PLAYER*} gikk inn i ilden under kamp med {*SOURCE*} - - Planker av bjørk + + {*PLAYER*} ble dømt til å falle av {*SOURCE*} - - Planker av jungeltre + + {*PLAYER*} ble dømt til å falle av {*SOURCE*} - - Ungtre + + {*PLAYER*} ble dømt til å falle av {*SOURCE*}, som brukte {*ITEM*} - - Ungeik + + {*PLAYER*} ble brent til døde i kamp med {*SOURCE*} - - Unggran + + {*PLAYER*} ble sprengt i filler av {*SOURCE*} - - Ungbjørk + + {*PLAYER*} visnet hen - - Ungt jungeltre + + {*PLAYER*} ble slaktet av {*SOURCE*} med {*ITEM*} - - Grunnfjell + + {*PLAYER*} prøvde å svømme i lava for å komme seg unna {*SOURCE*} - - Vann + + {*PLAYER*} druknet under forsøket på å flykte fra {*SOURCE*} - - Lava + + {*PLAYER*} gikk inn i en kaktus under forsøket på å flykte fra {*SOURCE*} - - Sand + + Stig på - - Sandstein + + For å styre en hest må hesten være utstyrt med en sal, som kan kjøpes fra landsbyboerne eller finnes i kister som er skjult i verdenen. - - Grus + + Fest en kiste for å gi tamme esler og muldyr saltasker. Du får tilgang til disse taskene mens du rir eller sniker. - - Gullmalm + + Hester og esler (men ikke muldyr) kan avles som andre dyr med gullepler eller gullrøtter. Føll vokser og blir med tiden voksne hester, og du kan øke hastigheten på dette ved å gi dem hvete eller høy. - - Jernmalm + + Hester, esler og muldyr må temmes før de kan brukes. For å temme en hest må spilleren forsøke å ri på den, og klare å holde seg på hesten mens den prøver å kaste ham av. - - Kullmalm + + Når de er temmet, vil kjærlighetshjerter dukke opp rundt dem, og de vil ikke lenger prøve å kaste spilleren av. - - Tre + + +Prøv å ri denne hesten nå. Bruk {*CONTROLLER_ACTION_USE*} uten gjenstander eller verktøy i hånden for å stige på den. + - - Eiketre + + Her kan du forsøke å temme hestene og eslene, og det finnes også kister her med saler, hesterustninger og andre nyttige gjenstander til hester. - - Grantre + + Et lyssignal på en pyramide med minst 4 nivåer gir deg også enten den sekundære kraften Regenerasjon eller en sterkere hovedkraft. - - Bjørketre + + For å angi kreftene til lyssignalet må du ofre en smaragd, diamant, gullbarre eller jernbarre i betalingsplassen. Når kreftene er angitt, vil de for alltid stråle ut av lyssignalet. - - Jungeltre + + På toppen av denne pyramiden er det et inaktivt lyssignal. - - Eik + + Dette er lyssignalgrensesnittet, som du kan bruke til å velge kreftene som lyssignalet skal skjenke. - - Gran + + + {*B*}Trykk på{*CONTROLLER_VK_A*} for å fortsette. + {*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker lyssignalgrensesnittet. + - - Bjørk + + I lyssignalmenyen kan du velge 1 hovedkraft for lyssignalet ditt. Desto flere nivåer pyramiden har, jo flere krefter får du å velge mellom. - - Løv + + Alle voksne hester, esler og muldyr kan ris, men bare hester kan pansres, og bare muldyr og esler kan utstyres med saltasker for frakt av gjenstander. - - Eikeløv + + Dette er grensesnittet for hesteinventaret. - - Granløv + + + {*B*}Trykk på{*CONTROLLER_VK_A*} for å fortsette. + {*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede vet hvordan du skal bruke hesteinventaret. + - - Bjørkeløv + + Med hesteinventaret kan du overføre eller utruste gjenstander på hesten, eselet eller muldyret ditt. - - Jungeltreløv + + Funkle - - Svamp + + Spor - - Glass + + Flygetid: - - Ull + + Sal opp hesten din ved å plassere en sal i salplassen. Du kan gi hester rustning ved å plassere hesterustning i rustningsplassen. - - Svart ull + + Du har funnet et muldyr. - - Rød ull + + +{*B*}Trykk på{*CONTROLLER_VK_A*} for å lære mer om hester, esler og muldyr. +{*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om hester, esler og muldyr. + - - Grønn ull + + Hester og esler finner du som oftest på åpne sletter. Muldyr kan avles fra et esel og en hest, men er ikke fruktbare selv. - - Brun ull + + I denne menyen kan du også overføre gjenstander mellom ditt eget inventar og saltaskene som er festet til esler og muldyr. - - Blå ull + + Du har funnet en hest. - - Lilla ull + + Du har funnet et esel. - - Turkis ull + + {*B*}Trykk på{*CONTROLLER_VK_A*} for å lære mer om lyssignaler. + {*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om lyssignaler. - - Lysegrå ull + + Fyrverkeristjerner utformes ved å plassere krutt og fargestoff i utformingsnettet. - - Grå ull + + Fargestoffet bestemmer fargen fyrverkeristjernen får når den eksploderer. - - Rosa ull + + Formen på fyrverkeristjernen angis ved å legge til enten en ildladning, gullklump, fjær eller vesenhode. - - Limegrønn ull + + Hvis du ønsker, kan du plassere flere fyrverkeristjerner i utformingsnettet for å legge dem til fyrverkeriet. - - Gul ull + + Fyller du flere plasser i utformingsnettet med krutt, øker høyden som alle fyrverkeristjernene eksploderer i. - - Lyseblå ull + + Du kan deretter ta det ferdige fyrverkeriet ut av utgangsfeltet når du ønsker å utforme det. - - Magentarød ull + + Spor eller funkling kan legges til ved å bruke diamanter eller glødesteinstøv. - - Oransje ull + + - - Hvit ull + + Fyrverkeristjernenes farger, uttoning, form, størrelse og effekter (slik som spor og funkling) kan tilpasses ved å bruke tilleggsingredienser under utformingen. - - Blomst + + - - Rose + + Når en fyrverkeristjerne er ferdig utformet, kan du angi fyrverkeristjernens uttoningsfarge ved å utforme den med fargestoff. - - Sopp + + I kistene her finnes det ulike gjenstander som brukes til å lage FYRVERKERI! - - Gullblokk + + {*B*}Trykk på{*CONTROLLER_VK_A*} for å lære mer om fyrverkeri. +{*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om fyrverkeri. - - En kompakt måte å lagre gull på. + + For å utforme fyrverkeri plasserer du krutt og papir i 3x3-utformingsnettet som vises over inventaret ditt. - - Jernblokk + + Dette rommet inneholder trakter - - En kompakt måte å lagre jern på. + + {*B*}Trykk på{*CONTROLLER_VK_A*} for å lære mer om trakter. + {*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om trakter. + - - Steinhelle + + Trakter brukes til å legge i eller fjerne gjenstander fra beholdere, og til å automatisk plukke opp gjenstander som kastes inn i dem. - - Steinhelle + + Aktive lyssignaler sender en sterk lysstråle mot himmelen og gir krefter til spillere i nærheten. De utformes med glass, obsidian og underverdenstjerner, som du kan skaffe deg ved å beseire Wither. - - Sandsteinhelle + + Lyssignaler må plasseres slik at de er i sollys om dagen. De må plasseres på pyramider av jern, gull, smaragd eller diamant. Men materialet som lyssignalet plasseres på, har ingen innvirkning på lyssignalets styrke. - - Eiketrehelle + + Prøv å bruke lyssignalet til å angi kreftene det gir. Du kan bruke jernbarrer til nødvendig betaling. - - Brosteinshelle + + De kan påvirke bryggeapparater, kister, dispensere, droppere, gruvevogner med kister, gruvevogner med trakter samt andre trakter. - - Teglsteinshelle + + I dette rommet finnes det ulike nyttige traktdesign du kan se på og eksperimentere med. - - Mursteinshelle + + Dette er fyrverkerigrensesnittet, som du kan bruke til å utforme fyrverkeri og fyrverkeristjerner. - - Eikehelle + + +{*B*}Trykk på{*CONTROLLER_VK_A*} for å fortsette. +{*B*}Trykk på{*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker fyrverkerigrensesnittet. + - - Granhelle + + Trakter vil kontinuerlig forsøke å suge gjenstander ut av en egnet beholder som er plassert over dem. De vil også forsøke å legge lagrede gjenstander inn i en utmatingsbeholder. - - Bjørkehelle + + Men hvis en trakt får kraft av rødstein, blir den inaktiv og slutter både å suge og legge inn gjenstander. - - Jungeltrehelle + + En trakt peker i den retningen den prøver å mate ut gjenstander. For å få en trakt til å peke mot en spesiell blokk, plasserer du den mot denne blokken mens du sniker. - - Underverdensteinshelle + + Disse fiendene finnes i sumper, og de angriper deg ved å kaste eliksirer. De slipper eliksirer når de blir drept. - - Teglsteiner + + Det maksimale antallet malerier/gjenstandsrammer i en verden er nådd. - - TNT + + Du kan ikke yngle fiender i Fredelig modus. - - Bokhylle + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende griser, sauer, kuer, katter og hester er nådd. - - Mosestein + + Kan ikke bruke yngleegg. Det maksimale antallet blekkspruter i en verden er nådd. - - Obsidian + + Kan ikke bruke yngleegg. Det maksimale antallet fiender i en verden er nådd. - - Fakkel + + Kan ikke bruke yngleegg. Det maksimale antallet landsbyboere i en verden er nådd. - - Fakkel (kull) + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende ulver er nådd. - - Fakkel (trekull) + + Det maksimale antallet vesenhoder i en verden er nådd. - - Ild + + Inverter visning - - Monsteryngler + + Keivhendt - - Eiketrapper + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende høner er nådd. - - Kiste + + Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende soppkuer er nådd. - - Rødsteinstøv + + Det maksimale antallet båter i en verden er nådd. - - Diamantmalm + + Kan ikke bruke yngleegg. Det maksimale antallet høner i en verden er nådd. - - Diamantblokk + + +{*C2*}Trekk pusten nå. Og en gang til. Kjenn luften i lungene, og la lemmene dine komme tilbake. Ja, rør på fingrene. Kjenn kroppen igjen, kjenn luften og tyngdekraften. Gjenoppstå i den lange drømmen. Sånn ja. Kroppen din berører universet igjen på hvert punkt, som om dere var separate enheter. Som om vi var separate enheter.{*EF*}{*B*}{*B*} +{*C3*}Hvem er vi? En gang i tiden ble vi kalt åndene fra fjellet. Fader sol og moder måne. Nedarvede ånder, dyreånder. Djinn. Gjenferd. Den grønne mannen. Så guder, demoner, engler, poltergeister. Utenomjordiske, kosmiske. Leptoner, kvarker. Ordene endrer seg, men det gjør ikke vi.{*EF*}{*B*}{*B*} +{*C2*}Vi er universet. Vi er alt du tror du ikke er. Du ser på oss nå, gjennom huden og gjennom øynene. Og hvorfor berører universet huden din og kaster lys på deg? For å se deg, spilleren. For å bli kjent med deg, og gjøre seg kjent. Jeg skal fortelle deg en historie.{*EF*}{*B*}{*B*} +{*C2*}Det var en gang en spiller.{*EF*}{*B*}{*B*} +{*C3*}Og den spilleren var deg, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Noen ganger så den på seg selv som et menneske, på den tynne skorpen av en snurrende klode av smeltet stein. Denne kloden av smeltet stein dreide rundt en kule av brennende gass som var 330 000 ganger mer massiv. De var så langt fra hverandre at det tok åtte minutter for lyset å nå frem. Lyset var informasjon fra en stjerne, og den kunne svi huden din fra 150 millioner kilometers avstand.{*EF*}{*B*}{*B*} +{*C2*}Noen ganger drømte spilleren at den var en gruvearbeider, i en verden som var flat og uendelig. Solen var en hvit firkant, og dagene var korte. Det var mye å gjøre, og døden var en midlertidig ubeleilighet.{*EF*}{*B*}{*B*} +{*C3*}Noen ganger drømte spilleren at den var fortapt i historien.{*EF*}{*B*}{*B*} +{*C2*}Noen ganger drømte spilleren at den var andre ting, på andre steder. Noen ganger var disse drømmene foruroligende, andre ganger vakre. Noen ganger våknet spilleren fra én drøm og forsvant inn i en annen, og deretter videre inn i en tredje.{*EF*}{*B*}{*B*} +{*C3*}Noen ganger drømte spilleren at den så på ord på en skjerm.{*EF*}{*B*}{*B*} +{*C2*}La oss gå litt tilbake i tid.{*EF*}{*B*}{*B*} +{*C2*}Spillerens atomer var spredt i gresset, i elvene, i luften og i jorden. En kvinne samlet disse atomene, hun drakk, åt og inhalerte dem, og så satte kvinnen spilleren sammen – i sin egen kropp.{*EF*}{*B*}{*B*} +{*C2*}Og spilleren våknet, fra den varme, mørke verdenen i sin mors kropp, og gikk inn i den lange drømmen.{*EF*}{*B*}{*B*} +{*C2*}Og spilleren var en ny historie, som aldri var blitt fortalt før, skrevet i DNA-ets bokstaver. Og spilleren var et nytt program, som aldri var blitt kjørt før, generert av en kildekode som var en milliard år gammel. Og spilleren var et nytt menneske, som aldri hadde levd før, laget utelukkende av melk og kjærlighet.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren, historien, programmet, og mennesket. Laget utelukkende av melk og kjærlighet.{*EF*}{*B*}{*B*} +{*C2*}La oss gå lenger tilbake i tid.{*EF*}{*B*}{*B*} +{*C2*}De syv milliarder milliarder milliarder atomene i spillerens kropp ble skapt i hjertet av en stjerne, lenge før dette spillet. Så også spilleren er informasjon fra en stjerne. Og spilleren beveger seg gjennom en historie, som er en skog av informasjon plantet av en mann kalt Julian, i en flat, uendelig verden skapt av en mann kalt Markus, som eksisterer i en liten, privat verden skapt av spilleren, som bor i et univers skapt av ...{*EF*}{*B*}{*B*} +{*C3*}Hysj nå. Noen ganger skapte spilleren en liten, privat verden som var myk og varm og enkel. Andre ganger var den hard og kald og komplisert. I blant bygget spilleren en modell av universet i hodet, flekker av energi som beveget seg frem gjennom store, tomme rom. I blant kalte den disse flekkene for "elektroner" og "protoner".{*EF*}{*B*}{*B*} + - - En kompakt måte å lagre diamanter på. + + +{*C2*}Noen ganger kalte den dem "planeter" og "stjerner".{*EF*}{*B*}{*B*} +{*C2*}Noen ganger trodde den at den var i et univers laget av positiv og negativ energi, laget av nuller og enere og kodelinjer. Noen ganger trodde den at den spilte et spill. Og noen ganger trodde den at den leste ord på en skjerm.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren – som leser ordene ...{*EF*}{*B*}{*B*} +{*C2*}Hysj nå ... Noen ganger leste spilleren kodelinjer på en skjerm. Dechiffrerte dem til ord, dechiffrerte ord til betydning, dechiffrerte betydning til følelser, teorier og ideer, og da begynte spilleren å puste fortere og dypere og innså at den levde. Spilleren levde, og de tusenvis av dødsfallene hadde ikke vært ekte. Spilleren levde.{*EF*}{*B*}{*B*} +{*C3*}Du. Du. Du lever.{*EF*}{*B*}{*B*} +{*C2*}Og noen ganger trodde spilleren at universet hadde snakket til den via sollyset som kom gjennom bladene på sommertrærne.{*EF*}{*B*}{*B*} +{*C3*}Og noen ganger trodde spilleren at universet hadde snakket til den via lyset fra en klar vinternatthimmel, der en lysflekk i øyekroken kan være en stjerne en million ganger mer massiv enn solen, som koker sine planeter til plasma for å kunne synes et øyeblikk for spilleren, som var på vei hjem på den andre siden av universet og plutselig kjente duften av mat, nesten fremme ved døren, slik at den kunne drømme igjen.{*EF*}{*B*}{*B*} +{*C2*}Og noen ganger trodde spilleren at universet hadde snakket til den via nuller og enere, via elektrisiteten i verden, via ordene som ruller over en skjerm på slutten av en drøm.{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "jeg elsker deg".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "du har spilt godt".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "alt du trenger, har du i deg".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "du er sterkere enn du tror".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "du er dagslyset".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "du er natten".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "mørket du kjemper mot, er i deg".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "lyset du søker, er i deg".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "du er ikke alene".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "du er ikke adskilt fra alle andre ting".{*EF*}{*B*}{*B*} +{*C3*}Og universet sa "du er universet som smaker på seg selv, snakker med seg selv og leser sin egen kode".{*EF*}{*B*}{*B*} +{*C2*}Og universet sa "jeg elsker deg fordi du er kjærligheten".{*EF*}{*B*}{*B*} +{*C3*}Så var spillet over, og spilleren våknet fra drømmen. Og spilleren begynte en ny drøm. Og spilleren drømte igjen, drømte bedre. Og spilleren var universet. Og spilleren var kjærligheten.{*EF*}{*B*}{*B*} +{*C3*}Du er spilleren.{*EF*}{*B*}{*B*} +{*C2*}Våkn opp.{*EF*} + - - Utformingsbord + + Tilbakestille underverdenen - - Avlinger + + %s har entret Slutten. - - Dyrkbar jord + + %s har forlatt Slutten. - - Smelteovn + + +{*C3*}Jeg ser spilleren du mener.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Ja. Vær forsiktig, for den har nådd et høyere nivå nå. Den kan lese tankene våre.{*EF*}{*B*}{*B*} +{*C2*}Det gjør ikke noe. Den tror vi er med på spillet.{*EF*}{*B*}{*B*} +{*C3*}Jeg liker denne spilleren. Spiller godt, og gir aldri opp.{*EF*}{*B*}{*B*} +{*C2*}Den leser tankene våre som om de var ord på en skjerm.{*EF*}{*B*}{*B*} +{*C3*}Det er sånn den forestiller seg ting, når den er dypt inne i drømme- og spillverdenen.{*EF*}{*B*}{*B*} +{*C2*}Ord utgjør et deilig grensesnitt. Meget fleksibelt. Og ikke så skremmende som å stirre rett på virkeligheten bak skjermen.{*EF*}{*B*}{*B*} +{*C3*}Før spillere kunne lese, hørte de stemmer. Det var på den tiden de som ikke spilte, kalte spillere for hekser og trollmenn. Og spillerne drømte at de fløy i luften, på kjepper drevet av demoner.{*EF*}{*B*}{*B*} +{*C2*}Hva er det denne spilleren drømte?{*EF*}{*B*}{*B*} +{*C3*}Denne spilleren drømte om sol og trær, ild og vann. Den drømte at den skapte – og deretter ødela igjen. Den drømte at den jaktet – og ble jaktet på. Den drømte om ly.{*EF*}{*B*}{*B*} +{*C2*}Ha, det originale grensesnittet. En million år gammelt, og det virker fremdeles. Men hva skapte denne spilleren egentlig, i virkeligheten bak skjermen?{*EF*}{*B*}{*B*} +{*C3*}Den samarbeidet med en million andre om å bygge en ekte verden i en fold av {*EF*}{*NOISE*}{*C3*}, og skapte en {*EF*}{*NOISE*}{*C3*} for {*EF*}{*NOISE*}{*C3*}, i {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Den kan ikke lese den tanken.{*EF*}{*B*}{*B*} +{*C3*}Nei, den har ikke nådd det høyeste nivået ennå. Det må den nå i den lange livsdrømmen, ikke i den korte spilldrømmen.{*EF*}{*B*}{*B*} +{*C2*}Vet den at vi er glad i den? At universet er snilt?{*EF*}{*B*}{*B*} +{*C3*}Noen ganger, gjennom sine støyende tanker, klarer den å høre universet, ja.{*EF*}{*B*}{*B*} +{*C2*}Men andre ganger er den trist, i sin lange drøm. Den skaper verdener uten somre, og den skjelver under en svart sol, og til slutt ser den på sin triste skapelse som virkeligheten.{*EF*}{*B*}{*B*} +{*C3*}Men å kurere den for sorgen ville ødelegge den. Sorgen er en del av drivkraften dens. Vi kan ikke blande oss inn i det.{*EF*}{*B*}{*B*} +{*C2*}Noen ganger når de er dypt inne i drømmeland, får jeg lyst til å fortelle dem at de bygger ekte og virkelige verdener. Noen ganger får jeg lyst til å fortelle dem om hvor viktige de er for universet. Og noen ganger, når de ikke har oppnådd en reell forbindelse på en stund, vil jeg hjelpe dem med å si det de frykter.{*EF*}{*B*}{*B*} +{*C3*}Den leser tankene våre.{*EF*}{*B*}{*B*} +{*C2*}Men noen ganger bryr jeg meg ikke. Noen ganger vil jeg fortelle dem at denne verdenen de ser på som sann, ikke er annet enn {*EF*}{*NOISE*}{*C2*} og {*EF*}{*NOISE*}{*C2*}. Jeg vil fortelle dem at de er {*EF*}{*NOISE*}{*C2*} i {*EF*}{*NOISE*}{*C2*}. De ser så lite av virkeligheten i sin lange drøm.{*EF*}{*B*}{*B*} +{*C3*}Likevel spiller de spillet.{*EF*}{*B*}{*B*} +{*C2*}Men det hadde vært så enkelt å fortelle dem ...{*EF*}{*B*}{*B*} +{*C3*}For sterkt for denne drømmen. Å fortelle dem hvordan de skal leve, er å nekte dem livet.{*EF*}{*B*}{*B*} +{*C2*}Jeg vil ikke fortelle spilleren hvordan den skal leve.{*EF*}{*B*}{*B*} +{*C3*}Spilleren er i ferd med å bli rastløs.{*EF*}{*B*}{*B*} +{*C2*}Jeg skal fortelle spilleren en historie.{*EF*}{*B*}{*B*} +{*C3*}Men ikke sannheten.{*EF*}{*B*}{*B*} +{*C2*}Nei. En historie med en trygg versjon av sannheten, i et bur av ord. Ikke den nakne sannheten som kan svi av store områder.{*EF*}{*B*}{*B*} +{*C3*}Gi den en kropp igjen.{*EF*}{*B*}{*B*} +{*C2*}Ja. Spiller ...{*EF*}{*B*}{*B*} +{*C3*}Bruk navnet dens.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Spilleren.{*EF*}{*B*}{*B*} +{*C3*}Bra.{*EF*}{*B*}{*B*} + - - Skilt + + Er du sikker på at du vil tilbakestille underverdenen i denne lagringen til standardinnstillinger? Du vil miste alt du har bygget i underverdenen! - - Tredør + + Kan ikke bruke yngleegg. Det maksimale antallet griser, sauer, kuer, katter og hester er nådd. - - Stige + + Kan ikke bruke yngleegg. Det maksimale antallet soppkuer er nådd. - - Skinne + + Kan ikke bruke yngleegg. Det maksimale antallet ulver i en verden er nådd. - - Kraftskinne + + Tilbakestill underverdenen - - Detektorskinne + + Ikke tilbakestill underverdenen - - Steintrapp + + Kan ikke klippe denne soppkua. Det maksimale antallet griser, sauer, kuer, katter og hester er nådd. - - Spak - - - Trykkplate + + Du døde! - - Jerndør + + Verdensinnstillinger - - Rødsteinmalm + + Kan bygge og utvinne - - Rødsteinfakkel + + Kan bruke dører og brytere - - Knapp + + Generer byggverk - - Snø + + Superflat verden - - Is + + Bonuskiste - - Kaktus + + Kan åpne beholdere - - Leire + + Spark ut spiller - - Sukkerrør + + Kan fly - - Platespiller + + Deaktiver utmattelse - - Gjerde + + Kan angripe spillere - - Gresskar + + Kan angripe dyr - - Gresskarlykt + + Moderator - - Underverdenstein + + Vertsrettigheter - - Sjelesand + + Slik spiller du - - Glødestein + + Kontroller - - Portal + + Innstillinger - - Lasursteinmalm + + Gjenoppstå - - Lasursteinblokk + + Tilbud på nedlastbart innhold - - En kompakt måte å lagre lasurstein på. + + Bytt skall - - Dispenser + + Medvirkende - - Noteblokk + + TNT-eksplosjon - - Kake + + Spiller mot spiller - - Seng + + Stol på spillere - - Spindelvev + + Installer innhold på nytt - - Høyt gress + + Innstillinger for feilretting - - Død busk + + Spredning av ild - - Diode + + Enderdragen - - Låst kiste + + {*PLAYER*} ble drept av enderdragens ånde. - - Fallem + + {*PLAYER*} ble drept av {*SOURCE*}. - - Ull (alle farger) + + {*PLAYER*} ble drept av {*SOURCE*}. - - Stempel + + {*PLAYER*} døde. - - Klistrestempel + + {*PLAYER*} ble sprengt i filler. - - Sølvkreblokk + + {*PLAYER*} ble drept av magi. - - Mursteiner + + {*PLAYER*} ble skutt av {*SOURCE*}. - - Mosegrodde mursteiner + + Grunnfjelltåke - - Sprukne mursteiner + + Vis HUD - - Meislede mursteiner + + Vis hånd - - Sopp + + {*PLAYER*} ble tatt av {*SOURCE*} sin ildkule. - - Sopp + + {*PLAYER*} ble dengt av {*SOURCE*}. - - Jernstenger + + {*PLAYER*} ble drept av {*SOURCE*} med magi - - Glassrute + + {*PLAYER*} falt ut av verdenen. - - Melon + + Teksturpakker - - Gresskarstilk + + Flettepakker - - Melonstilk + + {*PLAYER*} gikk opp i flammer. - - Slyngplante + + Temaer - - Grind + + Spillerbilder - - Teglsteinstrapp + + Avatarelementer - - Mursteinstrapp + + {*PLAYER*} brant i hjel. - - Sølvkrestein + + {*PLAYER*} sultet i hjel. - - Sølvkrebrostein + + {*PLAYER*} ble spiddet til døde. - - Sølvkremurstein + + {*PLAYER*} traff bakken med for mye kraft. - - Mycelium + + {*PLAYER*} prøvde å svømme i lava. - - Liljeplatting + + {*PLAYER*} ble kvalt i en vegg. - - Underverdenstein + + {*PLAYER*} druknet. - - Underverdensteinsgjerde + + Dødsmeldinger - - Underverdensteinstrapp + + Du er ikke moderator lenger. - - Underverdenvorte + + Du kan nå fly. - - Fortryllelsesbord + + Du kan ikke fly lenger. - - Bryggeapparat + + Du kan ikke angripe dyr lenger. - - Gryte + + Du kan nå angripe dyr. - - Sluttportal + + Du er nå moderator. - - Sluttportalramme + + Du kan ikke bli utmattet lenger. - - Sluttstein + + Du er nå usårbar. - - Drageegg + + Du er ikke usårbar lenger. - - Kratt + + %d MSP - - Bregne + + Du kan nå bli utmattet. - - Sandsteintrapp + + Du er nå usynlig. - - Grantrapp + + Du er ikke usynlig lenger. - - Bjørketrapp + + Du kan nå angripe spillere. - - Jungeltretrapp + + Du kan nå utvinne fra eller bruke gjenstander. - - Rødsteinlampe + + Du kan ikke lenger utplassere blokker. - - Kakao + + Du kan nå utplassere blokker. - - Hodeskalle + + Animert karakter - - Gjeldende kontroller + + Spesialanimasjon for skall - - Oppsett + + Du kan ikke lenger utvinne fra eller bruke gjenstander. - - Gå/spurt + + Du kan nå bruke dører og brytere. - - Se + + Du kan ikke angripe vesener lenger. - - Pause + + Du kan nå angripe vesener. - - Hopp + + Du kan ikke angripe spillere lenger. - - Hopp / fly opp + + Du kan ikke bruke dører og brytere lenger. - - Inventar + + Du kan nå bruke beholdere (f.eks. kister). - - Bytt gjenstand + + Du kan ikke bruke beholdere (f.eks. kister) lenger. - - Handling + + Usynlig - - Bruk + + Lyssignaler + + + {*T3*}SLIK SPILLER DU: LYSSIGNALER{*ETW*}{*B*}{*B*} +Aktive lyssignaler sender en sterk lysstråle mot himmelen og gir krefter til spillere i nærheten.{*B*} +De utformes med glass, obsidian og underverdenstjerner, som du kan skaffe deg ved å beseire Wither.{*B*}{*B*} +Lyssignaler må plasseres slik at de er i sollys om dagen. De må plasseres på pyramider av jern, gull, smaragd eller diamant.{*B*} +Men materialet som lyssignalet plasseres på, har ingen innvirkning på lyssignalets styrke.{*B*}{*B*} +I lyssignalmenyen kan du velge én hovedkraft for lyssignalet ditt. Desto flere nivå pyramiden din har, jo flere krefter får du å velge mellom.{*B*} +Et lyssignal på en pyramide med minst fire nivåer gir deg også enten den sekundære kraften Regenerasjon eller en sterkere hovedkraft.{*B*}{*B*} +For å angi kreftene til lyssignalet må du ofre en smaragd, diamant, gullbarre eller jernbarre i betalingsplassen.{*B*} +Når kreftene er angitt, vil de for alltid stråle ut av lyssignalet.{*B*} + + + Fyrverkeri + + + Språk + + + Hester + + + {*T3*}SLIK SPILLER DU: HESTER{*ETW*}{*B*}{*B*} +Hester og esler finner du hovedsakelig på åpne sletter. Et muldyr er avkommet til et esel og en hest, men er selv ikke fruktbar.{*B*} +Alle voksne hester, esler og muldyr kan ris, men bare hester kan pansres, og bare muldyr og esler kan utstyres med saltasker for frakt av gjenstander.{*B*}{*B*} +Hester, esler og muldyr må temmes før de kan brukes. For å temme en hest må spilleren forsøke å ri på den, og klare å holde seg på hesten mens den prøver å kaste ham av.{*B*} +Når det dukker opp kjærlighetshjerter rundt hesten, er den tam, og den vil ikke lenger forsøke å kaste spilleren av. For å styre en hest må spilleren utstyre den med sal.{*B*}{*B*} +Saler kan kjøpes fra landsbyboere eller finnes i kister som er skjult i verdenen.{*B*} +For å utstyre tamme esler og muldyr med saltasker kan du bøye deg ned og feste en kiste. Disse saltaskene får du så tilgang til mens du rir eller bøyer deg ned.{*B*}{*B*} +Hester og esler (men ikke muldyr) kan avles som andre dyr med gullepler eller gullrøtter.{*B*} +Føll vokser og blir med tiden voksne hester, og du kan øke hastigheten på dette ved å gi dem hvete eller høy.{*B*} + + + {*T3*}SLIK SPILLER DU: FYRVERKERI{*ETW*}{*B*}{*B*} +Fyrverkeri er dekorative gjenstander som skytes opp med hendene eller fra dispensere. Fyrverkeri utformes med papir, krutt og om ønskelig ulike fyrverkeristjerner.{*B*} +Fyrverkeristjernenes farger, uttoning, form, størrelse og effekter (slik som spor og funkling) kan tilpasses ved å bruke tilleggsingredienser under utformingen.{*B*}{*B*} +For å utforme fyrverkeri plasserer du krutt og papir i 3x3-utformingsnettet som vises over inventaret ditt.{*B*} +Hvis du ønsker, kan du plassere flere fyrverkeristjerner i utformingsnettet for å legge dem til fyrverkeriet.{*B*} +Fyller du flere plasser i utformingsnettet med krutt, øker høyden som alle fyrverkeristjernene eksploderer i.{*B*}{*B*} +Du kan deretter ta det ferdige fyrverkeriet ut av utgangsfeltet.{*B*}{*B*} +Fyrverkeristjerner utformes ved å plassere krutt og fargestoff i utformingsnettet.{*B*} +– Fargestoffet bestemmer fargen fyrverkeristjernen får når den eksploderer.{*B*} +– Formen på fyrverkeristjernen angis ved å legge til enten en ildladning, gullklump, fjær eller vesenhode.{*B*} +– Spor eller funkling kan legges til ved å bruke diamanter eller glødesteinstøv.{*B*}{*B*} +Når en fyrverkeristjerne er ferdig utformet, kan du angi fyrverkeristjernens uttoningsfarge ved å utforme den med fargestoff. + - - Utforming + + {*T3*}SLIK SPILLER DU: DROPPERE{*ETW*}{*B*}{*B*} +Når droppere får kraft av rødstein, slipper de ned på bakken én tilfeldig gjenstand som ble oppbevart inni dem. Bruk {*CONTROLLER_ACTION_USE*} til å åpne dropperen, og fyll den med gjenstander fra inventaret ditt.{*B*} +Hvis dropperen er vendt mot en kiste eller annen type beholder, plasseres gjenstanden i denne i stedet. Lange kjeder av droppere kan bygges for å transportere gjenstander over større distanser, men for at dette skal fungere, må de slås av og på vekselsvis. - - Slipp + + Når du bruker dette, blir det til et kart over den delen av verdenen du er i. Det fylles ut etter hvert som du utforsker. - - Snik + + Slippes av Wither, brukes til å utforme lyssignaler. - - Snik / fly ned + + Trakter - - Endre kameramodus + + {*T3*}SLIK SPILLER DU: TRAKTER{*ETW*}{*B*}{*B*} Trakter brukes til å legge i eller fjerne gjenstander fra beholdere, og til å automatisk plukke opp gjenstander som kastes inn i dem.{*B*} Trakter kan påvirke bryggeapparater, kister, dispensere, droppere, gruvevogner med kister, gruvevogner med trakter samt andre trakter.{*B*}{*B*} Trakter vil kontinuerlig forsøke å suge gjenstander ut av en egnet beholder som er plassert over dem. De vil også forsøke å legge lagrede gjenstander inn i en utmatingsbeholder.{*B*} Hvis en trakt får kraft av rødstein, blir den inaktiv og slutter både å suge og legge inn gjenstander.{*B*}{*B*} En trakt peker i den retningen den prøver å mate ut gjenstander. For å få en trakt til å peke mot en spesiell blokk, plasserer du den mot denne blokken mens du sniker.{*B*} - - Spillere/invitasjon + + Droppere - - Bevegelse (under flyvning) + + - - Oppsett 1 + + Øyeblikkelig helse - - Oppsett 2 + + Øyeblikkelig skade - - Oppsett 3 + + Hoppstyrke - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Utmattethet - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Styrke - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Svakhet - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Kvalme - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Regenerasjon - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Motstand - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Finner seed for verdensgenerator - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Når dette er aktivert, skapes det fargerike eksplosjoner. Fargen, effekten, formen og toningen avgjøres av fyrverkeristjernen som brukes når fyrverket skapes. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + En type skinne som kan aktivere eller deaktivere gruvevogner med trakt og utløse gruvevogner med TNT. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Brukes til å holde og slippe gjenstander, eller dytte gjenstander inn i en annen beholder når den gis en rødsteinladning. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Fargerike blokker som utformes ved å farge herdet leire - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Gir en rødsteinladning. Ladningen blir sterkere hvis det er flere gjenstander på platen. Trenger mer vekt enn den lette platen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Brukes som en rødsteinkraftkilde. Kan utformes tilbake til rødstein. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Brukes til å ta gjenstander eller overføre gjenstander inn og ut av beholdere. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Kan mates til hester, esler eller muldyr for å helbrede med inntil 10 hjerter. Gjør at føll vokser raskere. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Flaggermus - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Disse flygende skapningene finner du i huler eller andre store, innkapslede steder. - - {*B*}Trykk på {*CONTROLLER_VK_A*} for å fortsette. + + Heks - - {*B*}Trykk på {*CONTROLLER_VK_A*} for å starte opplæringen.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du føler du er klar til å spille på egen hånd. + + Lages ved å smelte leire i en smelteovn. - - Minecraft er et spill som dreier seg om å plassere blokker for å bygge hva det måtte være. På natten kommer monstrene ut, så husk å bygge deg et tilfluktssted før det skjer. + + Utformet fra glass og fargestoff. - - Bruk {*CONTROLLER_ACTION_LOOK*} for å se opp, ned og rundt deg. + + Utformet av farget glass - - Bruk {*CONTROLLER_ACTION_MOVE*} for å bevege deg. + + Gir en rødsteinladning. Ladningen blir sterkere hvis det er flere gjenstander på platen. - - Trykk {*CONTROLLER_ACTION_MOVE*} forover to ganger på rad for å spurte. Så lenge du holder {*CONTROLLER_ACTION_MOVE*} forover, fortsetter karakteren å spurte frem til du går tom for spurtetid eller mat. + + En blokk som sender ut et rødsteinsignal basert på sollys (eller mangel på sollys). - - Trykk på {*CONTROLLER_ACTION_JUMP*} for å hoppe. + + En spesiell type gruvevogn som fungerer på samme måte som en trakt. Den samler gjenstander som ligger på spor og i beholdere over seg. - - Hold inne {*CONTROLLER_ACTION_ACTION*} for å utvinne og hugge med hendene eller det du måtte holde i dem. Noen blokker må du kanskje lage et eget verktøy for å utvinne fra. + + En spesiell type rustning som hesten kan utrustes med. Gir 5 i rustning. - - Hold inne {*CONTROLLER_ACTION_ACTION*} for å hugge ned 4 treblokker (stammer).{*B*}Når en blokk går i stykker, kan du plukke den opp ved å stå ved den svevende gjenstanden som vises, og den vil da dukke opp i inventaret ditt. + + Brukes til å avgjøre fargen, effekten og formen til et fyrverkeri. - - Trykk på {*CONTROLLER_ACTION_CRAFTING*} for å åpne Utforming. + + Brukes i rødsteinkretser til å opprettholde, sammenligne eller trekke fra signalstyrke, eller til å måle visse blokktilstander. - - Etter hvert som du samler og lager flere ting, vil inventaret ditt fylles opp.{*B*} - Trykk på {*CONTROLLER_ACTION_INVENTORY*} for å åpne inventaret. + + En type gruvevogn som fungerer som en TNT-blokk i bevegelse. - - Når du beveger deg rundt og utvinner og angriper, vil matlinjen din {*ICON_SHANK_01*} tømmes. Spurting og spurtehopping krever mye mer mat enn vanlig gange og hopping. + + En spesiell type rustning som hesten kan utrustes med. Gir 7 i rustning. - - Hvis du mister helse, men har minst 9 {*ICON_SHANK_01*} på matlinjen, vil helsen din fylles opp automatisk. Du kan spise mat for å fylle opp matlinjen. + + Brukes til å utføre kommandoer. - - Når du holder en matvare i hånden, kan du holde inne {*CONTROLLER_ACTION_USE*} for å spise den og fylle opp matlinjen. Du kan ikke spise hvis matlinjen er full. + + Sender en lysstråle mot himmelen og kan gi statuseffekter til spillere i nærheten. - - Matlinjen er nesten tom, og du har mistet en del helse. Spis biffen i inventaret ditt for å fylle opp matlinjen og helbrede deg.{*ICON*}364{*/ICON*} + + Lagrer blokker og gjenstander på innsiden. Plasser to kister side om side for å lage en større kiste med dobbel kapasitet. Kisten med felle skaper en rødsteinladning når den åpnes. - - Trevirket du har samlet inn, kan utformes til planker. Åpne utformingsgrensesnittet for å gjøre dette.{*PlanksIcon*} + + En spesiell type rustning som hesten kan utrustes med. Gir 11 i rustning. - - Utforming kan gå over en rekke trinn. Nå som du har noen planker, er det flere ting du kan lage – blant annet et utformingsbord.{*CraftingTableIcon*} + + Brukes til å binde vesener til spilleren eller til gjerdestolper - - For å samle blokker raskere kan du lage deg verktøy beregnet på jobben. Noen verktøy har et skaft laget av pinner. Lag noen pinner nå.{*SticksIcon*} + + Brukes til å gi navn til vesener i verdenen. - - Bruk {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for å endre hva du holder i hånden. + + Hastverk - - Bruk {*CONTROLLER_ACTION_USE*} for å bruke gjenstander, samhandle med objekter og plassere ut visse gjenstander. Utplasserte gjenstander kan plukkes opp igjen og utvinnes med riktig verktøy. + + Lås opp fullversjon - - Når du har valgt utformingsbordet, peker du markøren på ønsket sted og velger {*CONTROLLER_ACTION_USE*} for å utplassere et utformingsbord. + + Fortsett spill - - Pek markøren på utformingsbordet, og trykk på {*CONTROLLER_ACTION_USE*} for å åpne det. + + Lagre spill - - Med en spade kan du grave raskere i myke blokker, som jord og snø. Etter hvert som du samler flere materialer, kan du lage verktøy som er raskere og mer holdbare. Lag en trespade.{*WoodenShovelIcon*} + + Spill - - Med en øks kan du hugge tre og trefelt raskere. Etter hvert som du samler flere materialer, kan du lage verktøy som er raskere og mer holdbare. Lag en treøks.{*WoodenHatchetIcon*} + + Poengtavler - - Med en hakke kan du grave raskere i harde blokker, som stein og malm. Etter hvert som du samler flere materialer, kan du lage verktøy som er raskere og mer holdbare. Lag en trehakke.{*WoodenPickaxeIcon*} + + Hjelp og alternativer - - Åpne beholderen + + Vanskelighetsgrad: - - Natten kan komme fort, og da er det farlig å oppholde seg utendørs uforberedt. Du kan lage rustning og våpen, men det lureste er å skaffe seg et tilfluktssted. - + + PvP: - - I nærheten er det et forlatt gruveskur som du kan bygge opp og bruke som tilfluktssted for natten. - + + Stol på spillere: - - Du må samle ressursene som kreves for å bygge opp skuret igjen. Vegger og tak kan lages av alle typer felt, men du trenger også en dør, noen vinduer og litt lys. - + + TNT: - - Bruk hakken til å utvinne fra noen steinblokker. Steinblokker gir deg brosteiner når de utvinnes. Hvis du samler 8 brosteinblokker, kan du bygge en smelteovn. Du må kanskje grave deg gjennom litt jord for å komme til steinen, det kan du bruke spaden til.{*StoneIcon*} + + Spilltype - - Du har samlet nok brosteiner til å bygge en smelteovn. Lag en på utformingsbordet. + + Byggverk: - - Bruk {*CONTROLLER_ACTION_USE*} for å plassere smelteovnen i verdenen, og så kan du åpne den. + + Nivåtype: - - Bruk smelteovnen til å lage litt trekull. Og mens du venter på at den skal bli ferdig, kan du bruke tiden til å samle flere materialer som du kan bruke til å fullføre skuret. + + Fant ingen spill - - Bruk smelteovnen til å lage litt glass. Og mens du venter på at det skal bli ferdig, kan du bruke tiden til å samle flere materialer som du kan bruke til å fullføre skuret. + + Kun inviterte + + + Flere alternativer + + + Last inn + + + Vertsalternativer + + + Spillere/invitasjon + + + Onlinespill + + + Ny verden + + + Spillere + + + Bli med i spill + + + Start spill + + + Navn på verden + + + Seed for verdensgenerator + + + La være blank for tilfeldig seed. + + + Spredning av ild: + + + Rediger skiltmelding: + + + Fyll inn detaljene som skal følge med skjermbildet ditt. + + + Bildetekst + + + Verktøytips i spillet + + + Vertikalt delt skjerm (for 2) + + + Ferdig + + + Skjermbilde fra spillet + + + Ingen effekter + + + Hurtighet + + + Treghet + + + Rediger skiltmelding: + + + De(t) klassiske Minecraft-teksturene, -ikonene og -brukergrensesnittet! + + + Vis alle fletteverdener + + + Hint + + + Installer avatarelement 1 på nytt + + + Installer avatarelement 2 på nytt + + + Installer avatarelement 3 på nytt + + + Installer tema på nytt + + + Installer spillerbilde 1 på nytt + + + Installer spillerbilde 2 på nytt + + + Alternativer + + + Brukergrensesnitt + + + Tilbakestill til standarder + + + Vis gå-animasjon + + + Lyd + + + Følsomhet + + + Grafikk + + + Brukes til å brygge eliksirer. Slippes av geister når de dør. + + + Slippes av zombie-grisemenn når de dør. Zombie-grisemenn finnes i underverdenen. Brukes som en ingrediens ved brygging av eliksirer. + + + Brukes til å brygge eliksirer. Vokser naturlig i fort i underverdenen. Kan også plantes på sjelesand. + + + Glatt å gå på. Blir til vann hvis den ødelegges over en annen blokk. Smelter hvis den er i nærheten av en lyskilde eller hvis den plasseres i underverdenen. + + + Kan brukes som dekorasjon. + + + Brukes til å brygge eliksirer og finne festninger. Slippes av blusser som ofte er å finne i nærheten av fort i underverdenen. + + + Kan ha ulike effekter avhengig av hva de brukes på. + + + Brukes til å brygge eliksirer eller sammen med andre gjenstander for å lage enderøyer eller magmakrem. + + + Brukes til å brygge eliksirer. + + + Brukes til å brygge eliksirer og spruteeliksirer. + + + Kan fylles med vann og brukes som startingrediens for eliksirer i bryggeapparatet. + + + Dette er en giftig ingrediens til eliksirer og matretter. Slippes når en edderkopp eller huleedderkopp drepes av en spiller. + + + Brukes til å brygge eliksirer, og da hovedsakelig eliksirer med negativ virkning. + + + Vokser i lang tid når den blir utplassert. Kan samles ved hjelp sauesaks. Kan klatres på som en stige. + + + Som en dør, men brukes hovedsakelig sammen med gjerder. + + + Kan utformes fra melonskiver. + + + Gjennomsiktige blokker som kan brukes som et alternativ til glassblokker. + + + Når den forsynes med kraft (via en knapp, en spak, en trykkplate, en rødsteinfakkel eller rødstein med en hvilken som helst av disse) kommer det ut et stempel som kan skyve blokker. Når stempelet trekker seg inn igjen, trekker det tilbake blokken som ligger inntil stempelet. + + + Lages av steinblokker og er å finne i festninger. + + + Brukes som en barriere, ligner på gjerder. + + + Kan plantes for å dyrke gresskar. + + + Kan brukes til bygging og dekorasjon. + + + Sinker dem som går gjennom det. Kan ødelegges med sauesaks for å få hyssing. + + + Yngler en sølvkre når de ødelegges. Kan også yngle en sølvkre hvis den er i nærheten av andre sølvkre som angripes. + + + Kan plantes for å dyrke meloner. + + + Slippes av endermenn når de dør. Når du kaster disse, teleporteres du til det stedet enderperlen lander på, men samtidig mister du litt helse. + + + En jordblokk det vokser gress på. Samles med en spade. Kan brukes til bygging. + + + Fylles med vann ved hjelp av regn eller en bøtte, og kan deretter brukes til å fylle glassflasker med vann. + + + Brukes til å lage lange trapper. To heller plassert oppå hverandre vil utgjøre en blokk av vanlig størrelse. + + + Lages ved å smelte en underverdenstein i en smelteovn. Kan utformes til underverdenmursteinsblokker. + + + Lyser når de forsynes med kraft. + + + Ligner på utstillingsmontere, og viser frem gjenstanden eller blokken som plasseres i den. + + + Kan yngle et vesen av angitt type ved kasting. + + + Brukes til å lage lange trapper. To heller plassert oppå hverandre vil utgjøre en blokk av vanlig størrelse. + + + Kan dyrkes for å gi kakaobønner. + + + Ku + + + Slipper skinn når de blir drept. Kan også melkes ved hjelp av en bøtte. + + + Sau + + + Vesenhoder kan utplasseres som dekorasjon eller brukes som en maske på hjelmplassen. + + + Blekksprut + + + Slipper blekkposer når de blir drept. + + + Brukes til å tenne på ting eller starte tilfeldige branner ved utskyting fra en dispenser. + + + Flyter på vannet og kan gås på. + + + Brukes til å bygge fort i underverdenen. Immun mot ildkuler fra geister. + + + Brukes i fort i underverdenen. + + + Viser retningen til en sluttportal når det kastes. Når tolv av disse plasseres i sluttportalrammer, aktiveres sluttportalen. + + + Brukes til å brygge eliksirer. + + + Ligner på gressblokker, men er veldig effektive å dyrke sopp på. + + + Finnes i fort i underverdenen og avgir underverdenvorter når den ødelegges. + + + En blokktype man finner i Slutten. Har svært høy eksplosjonsmotstand, så den er effektiv å bygge med. + + + Denne blokken blir til når du beseirer dragen i Slutten. + + + Slipper erfaringskuler når du kaster den. Disse kulene øker erfaringspoengene dine når de samles inn. + + + Gjør det mulig å fortrylle sverd, hakker, økser, spader, buer og rustning ved hjelp av erfaringspoeng. + + + Kan aktiveres ved hjelp av tolv enderøyer, og gjør at du kan reise til sluttdimensjonen. + + + Brukes til å lage en sluttportal. + + + Når den forsynes med kraft (via en knapp, en spak, en trykkplate, en rødsteinfakkel eller rødstein med en hvilken som helst av disse) kommer det ut et stempel som kan skyve blokker. + + + Bakes av leire i smelteovn. + + + Kan bakes til teglsteiner i smelteovn. + + + Når den knuses, blir den til leirklumper som kan bakes til teglsteiner i en smelteovn. + + + Hugges med øks og kan utformes til planker eller brukes som brensel. + + + Lages ved å smelte sand i en smelteovn. Kan brukes til bygging, men knuser hvis du prøver å utvinne fra det. + + + Utvinnes fra stein ved hjelp av en hakke. Kan brukes til å bygge smelteovner eller steinverktøy. + + + En kompakt måte å oppbevare snøballer på. + + + Kan gjøres om til stuing ved hjelp av en bolle. + + + Kan kun utvinnes med en diamanthakke. Produseres når vann og størknet lava møtes, og kan brukes til å bygge portaler. + + + Yngler monstre til verden. + + + Kan graves i med en spade og gjøres om til snøballer. + + + Produserer i blant hvetefrø etter knusing. + + + Kan gjøres om til fargestoff. + + + Samles ved hjelp av spade. Produserer i blant flint når den graves opp. Påvirkes av tyngdekraften hvis det ikke er et annet felt under den. + + + Kan utvinnes med en hakke for å få kull. + + + Kan utvinnes med en steinhakke eller bedre for å få lasurstein. + + + Kan utvinnes med en jernhakke eller bedre for å få diamanter. + + + Brukes som dekorasjon. + + + Kan utvinnes med med en jernhakke eller bedre, og deretter smeltes i en smelteovn for å lage gullbarrer. + + + Kan utvinnes med med en steinhakke eller bedre, og deretter smeltes i en smelteovn for å lage jernbarrer. + + + Kan utvinnes med en jernhakke eller bedre for å få rødsteinstøv. + + + Uknuselig. + + + Setter fyr på alt som kommer i kontakt med det. Kan samles i bøtter. + + + Samles ved hjelp av spade. Kan smeltes om til glass ved hjelp av smelteovnen. Påvirkes av tyngdekraften hvis det ikke er et annet felt under den. + + + Kan utvinnes med en hakke for å få brostein. + + + Samles ved hjelp av spade. Kan brukes til bygging. + + + Kan plantes og blir til slutt til et tre. + + + Plasseres på bakken for å føre elektrisk strøm. Ved brygging sammen med en eliksir økes effektens varighet. + + + Fås ved å drepe en ku og kan utformes til rustning eller brukes til å lage bøker. + + + Fås ved å drepe en slim. Brukes som en ingrediens ved brygging av eliksirer eller til å lage klistrestempler. + + + Slippes fra tid til annen av høner, og kan utformes til matvarer. + + + Samles ved å grave i grus og kan brukes til å lage tennstål. + + + Hvis du setter den på en gris, kan du ri på den. Grisen kan styres med en gulrot på pinne. + + + Fås ved å grave i snøen, og kan deretter kastes. + + + Fås ved å utvinne fra glødestein og kan utformes til nye glødesteinblokker eller brygges sammen med en eliksir for å øke effektens varighet. + + + Når de knuses, avgir de i blant et ungtre, som deretter kan plantes og vokse seg til et stort tre. + + + Kan brukes til bygging og dekorasjon. Finnes i fangehull. + + + Brukes til å få ull fra sauer og høste inn løvblokker. + + + Fås ved å drepe et skjelett. Kan utformes til beinmel, eller mates til ulver for å temme dem. + + + Fås ved å få et skjelett til å drepe en smyger. Kan spilles i en platespiller. + + + Slukker ild og får avlinger til å vokse. Kan samles i bøtter. + + + Høstes inn fra avlinger og kan brukes til å utforme matvarer. + + + Kan lages om til sukker. + + + Kan brukes som hjelm eller lages om til en gresskarlykt ved hjelp av en fakkel, og er også hovedingrediensen i gresskarpai. + + + Brenner evig hvis den tennes. + + + Når avlinger er utvokste, kan de høstes inn og gi deg hvete. + + + Jord som er klar til å plante frø i. + + + Kan tilberedes i en smelteovn for å lage grønt fargestoff. + + + Forsinker alt og alle som går over den. + + + Fås ved å drepe en høne og kan utformes til en pil. + + + Fås ved å drepe en smyger og kan utformes til TNT eller brukes som en ingrediens ved brygging av eliksirer. + + + Kan plantes i dyrkbar jord og bli til avlinger. Sørg for at frøene får nok lys til å kunne vokse! + + + Transporterer deg mellom oververdenen og underverdenen. + + + Brukes som brensel i smelteovner eller kan utformes til en fakkel. + + + Fås ved å drepe en edderkopp og kan utformes til en bue eller fiskestang, eller den kan plasseres på bakken og brukes som snubletråd. + + + Slipper ull når de blir klipt (hvis de ikke er klipt allerede). Kan farges for å gi ull av en annen farge. + + + Forretningsutvikling + + + Porteføljedirektør + + + Produktleder + + + Utviklingsteam + + + Utgivelsesansvarlig + + + Direktør, XBLA-publisering + + + Markedsføring + + + Lokaliseringsteam i Asia + + + Brukerundersøkelsesteam + + + MGS Central-team + + + Nettsamfunnansvarlig + + + Lokaliseringsteam i Europa + + + Lokaliseringsteam i Redmond + + + Designteam + + + Sjef for moroa + + + Musikk og lyder + + + Programmering + + + Sjefsarkitekt + + + Kunstnerisk utvikler + + + Spillutvikler + + + Kunst + + + Produsent + + + Testleder + + + Sjefstester + + + Kvalitetssikring + + + Eksekutiv produsent + + + Sjefsprodusent + + + Godkjenningstester + + + Jernspade + + + Diamantspade + + + Gullspade + + + Gullsverd + + + Trespade + + + Steinspade + + + Trehakke + + + Gullhakke + + + Treøks + + + Steinøks + + + Steinhakke + + + Jernhakke + + + Diamanthakke + + + Diamantsverd + + + SDET + + + Prosjekt-STE + + + Ekstra STE + + + Særlig takk + + + Testleder + + + Senior testleder + + + Testmedarbeidere + + + Tresverd + + + Steinsverd + + + Jernsverd + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Utvikler + + + Skyter ildkuler på deg som eksploderer når de treffer. + + + Slim + + + Deler seg i mindre slimer når de blir skadet. + + + Zombie-grisemann + + + I utgangspunktet føyelige, men angriper i grupper hvis du angriper en av dem. + + + Geist + + + Endermann + + + Huleedderkopp + + + Har giftig bitt. + + + Soppku + + + Angriper deg hvis du ser på dem. Kan også flytte blokker. + + + Sølvkre + + + Tiltrekker seg skjulte sølvkre i nærheten når de angripes. Gjemmer seg i steinblokker. + + + Angriper deg når du kommer for nær. + + + Slipper koteletter når de blir drept. Kan bli ridd på med en sal. + + + Ulv + + + Føyelige til de blir angrepet, da angriper de tilbake. Kan temmes ved hjelp av bein, og ulven vil da følge deg rundt og angripe alle som angriper deg. + + + Høne + + + Slipper fjær når de blir drept, og legger også egg fra tid til annen. + + + Gris + + + Smyger + + + Edderkopp + + + Angriper deg når du kommer for nær. Kan klatre opp vegger. Slipper hyssing når de blir drept. + + + Zombie + + + Eksploderer hvis du kommer for nær! + + + Skjelett + + + Skyter piler på deg. Slipper piler når de blir drept. + + + Kan lages om til soppstuing med en bolle. Slipper sopp og blir til vanlige kuer når de klippes. + + + Original design og kode av + + + Prosjektleder/produsent + + + Resten av Mojang-kontoret + + + Konsepttegner + + + Tallknusing og statistikk + + + Bøllekoordinator + + + Sjefsprogrammerer Minecraft PC + + + Kundestøtte + + + Kontor-DJ + + + Designer/programmerer Minecraft – Pocket Edition + + + Ninjakoder + + + CEO + + + Hvitsnippsarbeider + + + Eksplosjonsanimatør + + + Dette er en stor, svart drage som du finner i Slutten. + + + Blusser + + + Dette er fiender som finnes i underverdenen, stort sett i fort. De slipper blusstaver når de blir drept. + + + Snøgolem + + + Snøgolemer kan du lage ved hjelp av snøblokker og et gresskar. De kaster snøballer på fiendene til sine skapere. + + + Enderdragen + + + Magmakube - - Et godt tilfluktssted har en dør slik at du kan gå ut og inn uten å måtte grave deg ut og erstatte veggene. Lag en tredør nå.{*WoodenDoorIcon*} + + Finnes i jungelen. De kan temmes ved å gi dem rå fisk. Men du må først få ozelotene til å komme til deg, for plutselige bevegelser skremmer dem bort. - - Bruk {*CONTROLLER_ACTION_USE*} for å plassere døren. Du kan bruke {*CONTROLLER_ACTION_USE*} for å åpne og lukke tredører i verdenen. + + Jerngolem - - Det kan bli svært mørkt på natten, så det kan være kjekt med litt lys i tilfluktsstedet. Lag en fakkel via utformingsgrensesnittet ved hjelp av pinner og trekull.{*TorchIcon*} + + Finnes i landsbyer for beskyttelse. Kan lages ved hjelp av jernblokker og gresskar. - - - Du har fullført første del av opplæringen. - + + Finnes i underverdenen. På samme måte som slimer deler de seg i mindre biter når de blir drept. - - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette med opplæringen.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du føler du er klar til å spille på egen hånd. - + + Landsbyboer - - Dette er inventaret ditt. Her ser du alle gjenstander og verktøy du kan ta i hånden, samt andre ting du har med deg. Rustningen din ser du også her. - + + Ozelot - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker inventaret. - + + Gjør det mulig å lage sterkere fortryllelser hvis den plasseres ved fortryllelsesbordet. - - Bruk {*CONTROLLER_MENU_NAVIGATE*} for å flytte pekeren. Bruk {*CONTROLLER_VK_A*} for å plukke opp en gjenstand under pekeren. - Dersom det er flere enn én gjenstand her, plukker du opp alle, eller du kan bruke {*CONTROLLER_VK_X*} for bare å plukke opp halvparten. - + + {*T3*}SLIK SPILLER DU: SMELTEOVN{*ETW*}{*B*}{*B*} +Med en smelteovn kan du omskape gjenstander ved hjelp av varme. Du kan for eksempel gjøre jernmalm om til jernbarrer.{*B*}{*B*} +Plasser smelteovnen ute i verdenen, og trykk på {*CONTROLLER_ACTION_USE*} for å bruke den.{*B*}{*B*} +Du må plassere litt brensel i bunnen av smelteovnen, og deretter legger du gjenstanden du skal behandle, i toppen. Smelteovnen vil så sette i gang.{*B*}{*B*} +Når gjenstandene dine er ferdige, kan du flytte dem over til inventaret ditt.{*B*}{*B*} +Dersom en gjenstand du holder pekeren over, er en ingrediens eller brensel til smelteovnen, vil du få opp tips og hvordan du raskt kan flytte dem over til smelteovnen. - - Flytt gjenstanden ved hjelp av pekeren til en annen plass i inventaret, og bruk {*CONTROLLER_VK_A*} for å plassere den der. - Har du flere gjenstander på pekeren, kan du bruke {*CONTROLLER_VK_A*} for å plassere alle sammen eller {*CONTROLLER_VK_X*} for å plassere en av dem. + + {*T3*}SLIK SPILLER DU: DISPENSER{*ETW*}{*B*}{*B*} +En dispenser brukes til å mate ut gjenstander. Du må plassere en bryter, for eksempel en spak, ved siden av dispenseren for å utløse den.{*B*}{*B*} +For å fylle dispenseren med gjenstander trykker du på {*CONTROLLER_ACTION_USE*}, deretter flytter du de aktuelle gjenstandene fra inventaret og over i dispenseren.{*B*}{*B*} +Når du nå betjener bryteren, vil dispenseren mate ut en gjenstand. - - Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden. - + + {*T3*}SLIK SPILLER DU: BRYGGING{*ETW*}{*B*}{*B*} +For å brygge eliksirer trenger du et bryggeapparat, som du kan bygge på utformingsbordet. Basisen for enhver eliksir er en flaske vann, som du får ved å fylle en glassflaske med vann fra en gryte eller en vannkilde.{*B*} +Et bryggeapparat har tre plasser til flasker, så det lønner seg å brygge tre eliksirer av gangen for å utnytte ressursene best mulig.{*B*} +Plasser en ingrediens på toppen av bryggeapparatet for å lage en basis. Denne basisen har ingen virkning alene, men når du bruker basisen og legger til en annen ingrediens, får du en eliksir med en virkning.{*B*} +Når du har laget denne eliksiren, kan du legge til en tredje ingrediens for å få virkningen til å vare lenger (med rødsteinstøv), bli mer intens (med glødesteinstøv) eller skadelig (med et gjæret edderkoppøye).{*B*} +Du kan også legge til krutt i en eliksir for å gjøre den om til en spruteeliksir, som du deretter kan kaste. Når du kaster en slik, vil eliksiren virke på området den lander i.{*B*} + +Ingrediensene som du kan lage eliksirer av, er:{*B*}{*B*} +* {*T2*}Underverdenvorte{*ETW*}{*B*} +* {*T2*}Edderkoppøye{*ETW*}{*B*} +* {*T2*}Sukker{*ETW*}{*B*} +* {*T2*}Geisttåre{*ETW*}{*B*} +* {*T2*}Blusspulver{*ETW*}{*B*} +* {*T2*}Magmakrem{*ETW*}{*B*} +* {*T2*}Strålende melon{*ETW*}{*B*} +* {*T2*}Rødsteinstøv{*ETW*}{*B*} +* {*T2*}Glødesteinstøv{*ETW*}{*B*} +* {*T2*}Gjæret edderkoppøye{*ETW*}{*B*}{*B*} + +Eksperimenter med kombinasjoner av de ulike ingrediensene for å finne de ulike eliksirene du kan lage. - - - Hvis du vil ha mer informasjon om en gjenstand, beveger du pekeren over den og trykker på {*CONTROLLER_VK_BACK*}. - + + {*T3*}SLIK SPILLER DU: STOR KISTE{*ETW*}{*B*}{*B*} +Ved å plassere to kister ved siden av hverandre lages det én stor kiste. Dermed kan du lagre enda flere gjenstander.{*B*}{*B*} +En stor kiste brukes på samme måte som en vanlig kiste. - - - Trykk nå på {*CONTROLLER_VK_B*} for å gå ut av inventaret. - + + {*T3*}SLIK SPILLER DU: UTFORMING{*ETW*}{*B*}{*B*} +Under Utforming kan du sette sammen ting fra inventaret for å lage nye typer gjenstander. Bruk {*CONTROLLER_ACTION_CRAFTING*} for å åpne Utforming.{*B*}{*B*} +Bla gjennom fanene i toppen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å velge den typen gjenstand du vil lage, og bruk deretter {*CONTROLLER_MENU_NAVIGATE*} for å velge ønsket gjenstand.{*B*}{*B*} +I utformingsområdet ser du hva som kreves for å lage den nye gjenstanden. Trykk på {*CONTROLLER_VK_A*} for å lage den nye gjenstanden og plassere den i inventaret. - - - Dette er inventaret for kreativ modus. Her finner du gjenstander du kan ta i hånden, og andre ting du kan velge. - + + {*T3*}SLIK SPILLER DU: UTFORMINGSBORD{*ETW*}{*B*}{*B*} +Du kan lage større ting ved hjelp av et utformingsbord.{*B*}{*B*} +Plasser bordet i verdenen og trykk på {*CONTROLLER_ACTION_USE*} for å bruke det.{*B*}{*B*} +Utforming ved hjelp av et utformingsbord fungerer i bunn og grunn likt som vanlig utforming, men du har et større utformingsområde og et bredere utvalg av gjenstander. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker inventaret i kreativ modus. - + + {*T3*}SLIK SPILLER DU: FORTRYLLELSE{*ETW*}{*B*}{*B*} +Erfaringspoengene du kan samle når vesener dør eller gjennom utvinning fra eller smelting av visse typer blokker, kan brukes til å fortrylle noen typer verktøy, våpen, rustninger og bøker.{*B*} +Når du plasserer sverdet, buen, øksen, hakken, spaden, rustningen eller boken på plassen under boken på fortryllelsesbordet, ser du noen fortryllelser og hvor mange erfaringspoeng de koster, på de tre knappene til høyre.{*B*} +Dersom du ikke har høyt nok erfaringsnivå til å bruke noen av disse, vil kostnaden vises i rødt. Ellers vises den i grønt.{*B*}{*B*} +Hvilken fortryllelse som brukes, velges tilfeldig basert på den angitte kostnaden.{*B*}{*B*} +Dersom fortryllelsesbordet er omgitt av bokhyller (inntil 15 stykker), med én blokks åpning mellom bokhyllen og fortryllelsesbordet, vil fortryllelsens styrke øke og mystiske glyfer komme ut fra boken på fortryllelsesbordet.{*B*}{*B*} +Alle ingrediensene til fortryllelsesbordet kan du finne i landsbyene i en verden eller ved utvinning og dyrking.{*B*}{*B*} +Fortryllede bøker brukes sammen med ambolten for å fortrylle gjenstander. Dette gir deg mer kontroll over hvilke fortryllelser du vil bruke på gjenstandene dine.{*B*} - - Bruk {*CONTROLLER_MENU_NAVIGATE*} for å flytte pekeren. - Bruk {*CONTROLLER_VK_A*} for å plukke opp en gjenstand under pekeren i gjenstandslisten, og bruk deretter {*CONTROLLER_VK_Y*} for å plukke opp en hel stabel av denne gjenstanden. - + + {*T3*}SLIK SPILLER DU: SPERRE NIVÅER{*ETW*}{*B*}{*B*} +Dersom du finner støtende innhold i et nivå du spiller, kan du velge å legge dette nivået inn i listen over sperrede nivåer. +Dette gjør du ved å åpne pausemenyen og trykke på {*CONTROLLER_VK_RB*}. +Når du prøver å gå til dette nivået i fremtiden, vil du få opp et varsel om at du har lagt dette nivået i listen over sperrede nivåer, og du vil da få muligheten til enten å fjerne det fra denne listen og fortsette til nivået, eller å hoppe over det. - - -Pekeren vil automatisk flytte seg til en ledig plass i bruksraden. Du kan sette den ned med {*CONTROLLER_VK_A*}. Når du har plassert gjenstanden, går pekeren tilbake til gjenstandslisten hvor du kan velge en ny gjenstand. - + + {*T3*}SLIK SPILLER DU: VERTS- OG SPILLERALTERNATIVER{*ETW*}{*B*}{*B*} + +{*T1*}Spillalternativer{*ETW*}{*B*} + Når du laster inn eller oppretter en verden, kan du trykke på "Flere alternativer" for å åpne en meny hvor du kan kontrollere spillet i større grad.{*B*}{*B*} + + {*T2*}Spiller mot spiller{*ETW*}{*B*} + Når dette er aktivert, kan spillerne skade hverandre. Gjelder bare for overlevelsesmodus.{*B*}{*B*} + + {*T2*}Stol på spillere{*ETW*}{*B*} + Når dette er deaktivert, har spillere som blir med i spillet, begrensninger på hva de kan gjøre. De kan ikke utvinne eller bruke gjenstander, utplassere blokker, bruke dører og brytere, bruke beholdere, angripe spillere eller dyr. Du kan endre disse innstillingene for hver enkelt spiller i menyen i spillet.{*B*}{*B*} + + {*T2*}Spredning av ild{*ETW*}{*B*} + Når dette er aktivert, kan ild spre seg til brennbare blokker i nærheten. Denne innstillingen kan også endres i spillet.{*B*}{*B*} + + {*T2*}TNT-eksplosjon{*ETW*}{*B*} + Når dette er aktivert, vil TNT eksplodere etter aktivering. Denne innstillingen kan også endres i spillet.{*B*}{*B*} + + {*T2*}Vertsrettigheter{*ETW*}{*B*} + Når dette er aktivert, kan verten slå av og på sin egen evne til å fly, deaktivere utmattelse og gjøre seg selv usynlig via menyen i spillet. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T2*}Dagslyssyklus{*ETW*}{*B*} +Når dette er deaktivert, endres ikke tiden på døgnet.{*B*}{*B*} + +{*T2*}Behold inventar{*ETW*}{*B*} Når dette er aktivert, beholder spillerne inventaret sitt selv om de dør.{*B*}{*B*} + +{*T2*}Vesenyngling{*ETW*}{*B*} +Når dette er deaktivert, vil ikke vesener yngle naturlig.{*B*}{*B*} + +{*T2*}Destruktive vesener{*ETW*}{*B*} +Når dette er deaktivert, hindrer det monstre og dyr i å endre blokker (smyger-eksplosjoner vil for eksempel ikke ødelegge blokker, og sauer vil ikke fjerne gress) eller plukke opp gjenstander.{*B*}{*B*} + +{*T2*}Vesenloot{*ETW*}{*B*} +Når dette er deaktivert, slipper ikke monstre og dyr loot (smygere slipper for eksempel ikke krutt).{*B*}{*B*} + +{*T2*}Blokker slipper{*ETW*}{*B*} +Når dette er deaktivert, slipper ikke blokker gjenstander når de ødelegges (steinblokker slipper for eksempel ikke brosteiner).{*B*}{*B*} + +{*T2*}Natural regenerasjon{*ETW*}{*B*} +Når dette er deaktivert, vil ikke spillere regenerere helse naturlig.{*B*}{*B*} + +{*T1*}Alternativer for verdensgenerering{*ETW*}{*B*} + Når du oppretter en ny verden, har du tilgang til noen ekstra alternativer.{*B*}{*B*} + + {*T2*}Generer byggverk{*ETW*}{*B*} + Når dette er aktivert, vil byggverk som landsbyer og festninger bli generert i verdenen.{*B*}{*B*} + + {*T2*}Superflat verden{*ETW*}{*B*} + Når dette er aktivert, genereres en helt flat verden i oververdenen og underverdenen.{*B*}{*B*} + + {*T2*}Bonuskiste{*ETW*}{*B*} + Når dette er aktivert, dukker det opp en kiste med noen nyttige gjenstander i nærheten av spillernes startpunkt.{*B*}{*B*} + + {*T2*}Tilbakestill underverdenen{*ETW*}{*B*} +Når dette er aktivert, blir underverdenen regenerert. Dette er kjekt hvis du har en eldre lagring uten fort i underverdenen.{*B*}{*B*} + + {*T1*}Alternativer i spillet{*ETW*}{*B*} + Underveis i spillet har du tilgang til en rekke alternativer ved å trykke på {*BACK_BUTTON*}.{*B*}{*B*} + + {*T2*}Vertsalternativer{*ETW*}{*B*} + Verten og andre moderatorer har tilgang til menyen Vertsalternativer. Her kan de aktivere og deaktivere spredning av ild og TNT-eksplosjon.{*B*}{*B*} + +{*T1*}Spilleralternativer{*ETW*}{*B*} + Hvis du vil endre rettighetene til en spiller, velger du navnet til vedkommende og trykker på {*CONTROLLER_VK_A*} for å åpne spillerrettighetsmenyen hvor du kan endre de følgende alternativene.{*B*}{*B*} + + {*T2*}Kan bygge og utvinne{*ETW*}{*B*} + Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er aktivert, kan spilleren samhandle med verdenen som normalt. Når det er deaktivert, vil ikke spilleren kunne plassere eller ødelegge blokker, eller samhandle med en rekke gjenstander og blokker.{*B*}{*B*} + + {*T2*}Kan bruke dører og brytere{*ETW*}{*B*} + Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er deaktivert, kan ikke spilleren bruke dører og brytere.{*B*}{*B*} + + {*T2*}Kan åpne beholdere{*ETW*}{*B*} + Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er deaktivert, kan ikke spilleren åpne beholdere, slik som kister.{*B*}{*B*} + + {*T2*}Kan angripe spillere{*ETW*}{*B*} + Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er deaktivert, kan ikke spilleren skade andre spillere.{*B*}{*B*} + + {*T2*}Kan angripe dyr{*ETW*}{*B*} + Dette alternativet er kun tilgjengelig når "Stol på spillere" er slått av. Når dette alternativet er deaktivert, kan ikke spilleren skade dyr.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + Når dette alternativet er aktivert, kan spilleren endre rettighetene til andre spillere (unntatt verten) hvis "Stol på spillere" er slått av. I tillegg kan spilleren sparke andre spillere samt aktivere/deaktivere spredning av ild og TNT-eksplosjon.{*B*}{*B*} + + {*T2*}Spark ut spiller{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Vertsalternativer{*ETW*}{*B*} +Dersom "Vertsrettigheter" er aktivert, kan verten endre visse rettigheter på egen hånd. Hvis du vil endre rettighetene til en spiller, velger du navnet til vedkommende og trykker på {*CONTROLLER_VK_A*} for å åpne spillerrettighetsmenyen hvor du kan endre de følgende alternativene.{*B*}{*B*} + + {*T2*}Kan fly{*ETW*}{*B*} + Når dette alternativet er aktivert, kan spilleren fly. Gjelder kun for overlevelsesmodus, ettersom flyvning er aktivert for alle i kreativ modus.{*B*}{*B*} + + {*T2*}Deaktiver utmattelse{*ETW*}{*B*} + Gjelder kun for overlevelsesmodus. Når dette er aktivert, påvirker ikke fysiske aktiviteter (gå, spurte, hoppe osv.) matlinjen. Men blir spilleren skadet, vil matlinjen sakte tømmes mens du helbredes.{*B*}{*B*} + + {*T2*}Usynlig{*ETW*}{*B*} + Når dette alternativet er aktivert, er du usynlig for andre spillere og i tillegg usårbar.{*B*}{*B*} + + {*T2*}Kan teleportere{*ETW*}{*B*} + Gjør det mulig å flytte andre eller deg selv til andre spillere i verdenen. - - Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden i verdenen. For å fjerne alle gjenstander fra hurtiglinjen trykker du på {*CONTROLLER_VK_X*}. - + + Neste side - - Bla gjennom Gruppe-fanene på toppen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å velge gruppen som gjenstanden du vil plukke opp, hører til. + + {*T3*}SLIK SPILLER DU: DYREHOLD{*ETW*}{*B*}{*B*} +Hvis du vil holde dyrene dine på ett sted, bygger du et inngjerdet område på maks 20x20 blokker og plasserer dyrene dine der. Dette sikrer at de fremdeles er der neste gang du skal se til dem. - - - Hvis du vil ha mer informasjon om en gjenstand, beveger du pekeren over den og trykker på {*CONTROLLER_VK_BACK*} . - + + {*T3*}SLIK SPILLER DU: DYREAVL{*ETW*}{*B*}{*B*} +Dyrene i Minecraft kan avles, slik at du kan lage babyversjoner av dem!{*B*} +For å avle frem dyr må du fôre dem riktig slik at de går inn i en "elskovsmodus".{*B*} +Fôr kuer, soppkuer eller sauer med hvete, griser med gulrøtter, høner med hvetefrø eller underverdenvorter og ulver med en eller annen type kjøtt, så begynner de snart å se seg om etter et dyr av samme art som også er i elskovsmodus.{*B*} +Når to dyr av samme art møtes som begge er i elskovsmodus, begynner de kysse litt, og så dukker det snart opp en dyreunge. Dyreungene følger foreldrene sine en stund før de selv blir voksne dyr.{*B*} +Etter at dyrene har vært i elskovsmodus, vil de ikke kunne gå tilbake til denne modusen før etter ca. 5 minutter.{*B*} +Det er en grense på hvor mange dyr det kan være i en verden, så det kan hende at dyrene dine ikke lager barn når det finnes veldig mange av dem. - - Trykk på {*CONTROLLER_VK_B*} nå for å gå ut av inventaret for kreativ modus. - + + {*T3*}SLIK SPILLER DU: PORTALER{*ETW*}{*B*}{*B*} +Via portaler kan du reise mellom oververdenen og underverdenen. Underverdenen kan brukes til å hurtigreise i oververdenen – én blokk i underverdenen tilsvarer tre i oververdenen, så når du bygger en portal i underverdenen og går ut gjennom den, vil du dukke opp tre ganger så langt unna som der du gikk inn.{*B*}{*B*} +Du trenger minst 10 obsidianblokker for å bygge en portal, og portalen må være 5 blokker høy, 4 blokker bred og 1 blokk dyp. Når portalrammen er bygget, må du tenne en flamme på innsiden for å aktivere portalen. Dette kan du gjøre med tennstål eller med ildladning.{*B*}{*B*} +På bildet til høyre ser du eksempler på portalkonstruksjon. + + + {*T3*}SLIK SPILLER DU: KISTE{*ETW*}{*B*}{*B*} +Når du har laget en kiste, kan du plassere den ute i verdenen og deretter bruke den med {*CONTROLLER_ACTION_USE*} til å lagre gjenstander fra inventaret ditt.{*B*}{*B*} +Bruk pekeren for å flytte gjenstander mellom inventaret og kisten.{*B*}{*B*} +Gjenstandene i kisten blir liggende der til du flytter dem over til inventaret igjen senere. + + + Var du på Minecon? - - -Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har samlet, og lage nye gjenstander. - + + Ingen på Mojang har noensinne sett ansiktet til Junkboy. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du utformer ting. - + + Visste du at det finnes en Minecraft Wiki? - - {*B*} - Trykk på {*CONTROLLER_VK_X*} for å se en beskrivelse av gjenstanden. - + + Ikke se rett på insektene. - - {*B*} - Trykk på {*CONTROLLER_VK_X*} for å se hvilke ingredienser som kreves for å lage den aktuelle gjenstanden. - + + Smygere ble til etter en kodefeil. - - {*B*} - Trykk på {*CONTROLLER_VK_X*} for å vise inventaret igjen. - + + Er det en høne eller en and? - - Bla gjennom Gruppe-fanene på toppen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å velge gruppen gjenstanden du vil lage, hører til. Deretter bruker du {*CONTROLLER_MENU_NAVIGATE*} for å velge ønsket gjenstand. - + + Mojangs nye lokaler er kule! - - I utformingsområdet ser du hva som kreves for å lage den nye gjenstanden. Trykk på {*CONTROLLER_VK_A*} for å lage den nye gjenstanden og plassere den i inventaret. - + + {*T3*}SLIK SPILLER DU: GRUNNLEGGENDE{*ETW*}{*B*}{*B*} +Minecraft er et spill som dreier seg om å plassere blokker for å bygge hva det måtte være. På natten kommer monstrene ut, så husk å bygge deg et tilfluktssted før det skjer.{*B*}{*B*} +Bruk {*CONTROLLER_ACTION_LOOK*} for å se deg om.{*B*}{*B*} +Bruk {*CONTROLLER_ACTION_MOVE*} for å bevege deg.{*B*}{*B*} +Trykk på {*CONTROLLER_ACTION_JUMP*} for å hoppe.{*B*}{*B*} +Trykk {*CONTROLLER_ACTION_MOVE*} forover to ganger på rad for å spurte. Så lenge du holder {*CONTROLLER_ACTION_MOVE*} forover, fortsetter karakteren å spurte frem til du går tom for spurtetid eller matlinjen har mindre enn {*ICON_SHANK_03*}.{*B*}{*B*} +Hold inne {*CONTROLLER_ACTION_ACTION*} for å grave og utvinne med hendene eller det verktøyet du måtte være utstyrt med. Noen blokker må du kanskje lage et eget verktøy for å utvinne fra.{*B*}{*B*} +Hvis du holder noe i hendene, kan du ta det i bruk med {*CONTROLLER_ACTION_USE*} eller slippe det med {*CONTROLLER_ACTION_DROP*}. - - - Du kan utforme flere gjenstander hvis du har et utformingsbord. Utforming ved hjelp av et utformingsbord fungerer i bunn og grunn likt som vanlig utforming, men du har et større utformingsområde og et bredere utvalg av gjenstander. - + + {*T3*}SLIK SPILLER DU: HUD{*ETW*}{*B*}{*B*} +HUD viser informasjon som statusen din, helsen din, gjenværende oksygen når du er under vann, sultnivå (du må spise for å få det til å øke) og eventuell rustning du har på deg. +Hvis du mister helse, men har minst 9 {*ICON_SHANK_01*} på matlinjen, vil helsen din fylles opp automatisk. Du kan spise mat for å fylle opp matlinjen.{*B*} +Erfaringslinjen vises også her, med ett tall som angir erfaringsnivået ditt, og et annet tall som viser hvor mange erfaringspoeng som kreves for å gå opp til neste nivå. +Erfaringspoeng får du ved å samle erfaringskuler som vesener slipper fra seg når de dør, utvinne fra visse typer blokker, avle frem dyr, fiske samt smelte malm i smelteovner.{*B*}{*B*} +Her ser du også hvilke gjenstander du har tilgjengelig. +Bruk {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for å bytte gjenstanden du har i hånden. - - - Nederst til høyre i utformingsgrensesnittet ser du inventaret ditt. Her kan du også få beskrivelser av de ulike gjenstandene samt hvilke ingredienser som kreves for å lage dem. - + + {*T3*}SLIK SPILLER DU: UTSTYRSLISTE{*ETW*}{*B*}{*B*} +Bruk {*CONTROLLER_ACTION_INVENTORY*} for å se inventaret ditt.{*B*}{*B*} +Her ser du alle gjenstander og verktøy du kan ta i hånden, samt andre ting du har med deg. Rustningen din ser du også her.{*B*}{*B*} +Bruk {*CONTROLLER_MENU_NAVIGATE*} for å flytte pekeren. Bruk {*CONTROLLER_VK_A*} for å plukke opp en gjenstand under pekeren. Dersom det er flere enn én gjenstand her, plukker du opp alle, eller du kan bruke {*CONTROLLER_VK_X*} for bare å plukke opp halvparten.{*B*}{*B*} +Flytt gjenstanden ved hjelp av pekeren til en annen plass i inventaret, og bruk {*CONTROLLER_VK_A*} for å plassere den der. Har du flere gjenstander på pekeren, kan du bruke {*CONTROLLER_VK_A*} for å plassere alle sammen eller {*CONTROLLER_VK_X*} for å plassere en av dem.{*B*}{*B*} +Dersom en av gjenstandene under pekeren er en rustning, vil du få opp et tips om hvordan du raskt kan flytte den over til høyre rustningsplass i inventaret.{*B*}{*B*} +Skinnpansring kan farges. Dette gjør du i Inventar-menyen ved å holde fargen i pekeren og deretter trykke på {*CONTROLLER_VK_X*} mens pekeren er over den delen du vil farge. - - - Nå ser du en beskrivelse av den valgte gjenstanden. Beskrivelsen kan gi deg en pekepinn på hva gjenstanden kan brukes til. - + + Minecon 2013 var i Orlando i Florida! - - - Du får så se en liste over hvilke ingredienser som kreves for å lage den valgte gjenstanden. - + + .party() var glimrende! - - Trevirket du har samlet inn, kan utformes til planker. Velg plankeikonet og trykk på {*CONTROLLER_VK_A*} for å gjøre dette.{*PlanksIcon*} + + Gå alltid ut fra at rykter er usanne snarere enn sanne! - - - Nå har du bygget et uformingsbord, og du må deretter plassere det ut i verdenen slik at du kan utforme et bredere utvalg av gjenstander.{*B*} - Trykk på {*CONTROLLER_VK_B*} nå for å gå ut av utformingsgrensesnittet. - + + Forrige side - - - Trykk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å endre gruppen av gjenstander du vil utforme. Velg Verktøy-gruppen.{*ToolsIcon*} - + + Handel - - - Trykk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å endre gruppen av gjenstander du vil utforme. Velg Byggverk-gruppen.{*ToolsIcon*} - + + Ambolt - - - Bruk {*CONTROLLER_MENU_NAVIGATE*} for å endre hvilken gjenstand du vil utforme. Noen gjenstander har flere versjoner avhengig av hvilket materiale som brukes. Velg trespaden.{*WoodenShovelIcon*} - + + Slutten - - Utforming kan gå over en rekke trinn. Nå som du har noen planker, er det flere ting du kan lage. Bruk {*CONTROLLER_MENU_NAVIGATE*} for å endre hvilken gjenstand du vil utforme. Velg utformingsbordet.{*CraftingTableIcon*} + + Sperre nivåer - - - Med verktøyene du har laget, har du fått en god start – ved hjelp av dem kan du samle inn en rekke ulike materialer på en mer effektiv måte.{*B*} - Trykk på {*CONTROLLER_VK_B*} for å gå ut av utformingsgrensesnittet. - + + Kreativ modus - - - Visse gjenstander kan ikke lages med utformingsbordet, men krever en smelteovn. Lag en smelteovn nå.{*FurnaceIcon*} - + + Verts- og spilleralternativer - - - Plasser så smelteovnen ute i verdenen. Det er lurt å ha den i tilfluktsstedet ditt.{*B*} - Trykk på {*CONTROLLER_VK_B*} for å gå ut av utformingsgrensesnittet. - + + {*T3*}SLIK SPILLER DU: SLUTTEN{*ETW*}{*B*}{*B*} +Slutten er en annen dimensjon i spillet, som du kommer til gjennom en aktiv Sluttportal. Sluttportalen finner du i en festning, langt under bakken i oververdenen.{*B*} +For å aktivere sluttportalen må du sette et enderøye i en sluttportalramme hvor dette mangler.{*B*} +Når portalen er aktiv, hopper du inn i den for å komme til Slutten.{*B*}{*B*} +I Slutten vil du møte enderdragen, en fryktet og mektig fiende, samt en rekke endermenn, så du må være godt forberedt til kamp før du drar dit!{*B*}{*B*} +Der vil du finne enderkrystaller på toppen av åtte obsidianstaker som enderdragen bruker til å helbrede seg selv, +så første trinn i slaget er å ødelegge alle disse.{*B*} +De første kan nås med piler, men de siste beskyttes av et jerngjerde, så du må bygge deg frem til dem.{*B*}{*B*} +Mens du gjør dette, vil enderdragen angripe deg ved å fly mot deg og spytte endersyrekuler på deg!{*B*} +Hvis du går mot eggpodiet i midten av pålene, vil enterdragen fly ned og angripe deg, og det er da du virkelig kan skade den!{*B*} +Unngå syrepusten hans, og sikt på enderdragens øyne for best mulig resultat. Om mulig bør du ta med deg noen venner som kan hjelpe deg med slaget!{*B*}{*B*} +Når du har kommet til Slutten, vil vennene dine kunne se på kartet sitt hvor sluttportalen er i festningene sine, slik at de enkelt vil kunne komme seg til deg. - - - Dette er smelteovngrensesnittet. Med en smelteovn kan du omskape gjenstander. Du kan for eksempel gjøre jernmalm om til jernbarrer. - + + {*ETB*}Velkommen tilbake! Du har kanskje ikke lagt merke til det, men Minecraft har nettopp blitt oppdatert.{*B*}{*B*} +Det er en rekke nye funksjoner som du og vennene dine kan kose dere med, og noen av høydepunktene presenteres her. Les gjennom dem, og prøv deg frem!{*B*}{*B*} +{*T1*}Nye gjenstander{*ETB*} – Herdet leire, farget leire, kullblokk, høyball, aktivatorskinne, rødsteinsblokk, dagslyssensor, dropper, trakt, gruvevogn med trakt, gruvevogn med TNT, rødsteinskomparator, vektet trykkplate, lyssignal, kiste med felle, fyrverkerirakett, fyrverkeristjerne, underverdenstjerne, reim, hesterustning, navnemerke, hesteyngleegg.{*B*}{*B*} +{*T1*}Nye vesener{*ETB*} – Wither, Wither-skjeletter, hekser, flaggermus, hester, esler og muldyr.{*B*}{*B*} +{*T1*}Nye funksjoner{*ETB*} – Tem og ri en hest, utform fyrverkeri og stell i stand et show, gi navn til dyr og monstre med et navnemerke, skap mer avanserte rødsteinkretser, og dessuten nye vertsalternativer som hjelper deg å kontrollere hva gjestene i verdenen din kan gjøre.{*B*}{*B*} +{*T1*}Ny opplæringsverden{*ETB*} – Lær hvordan du bruker gamle og nye funksjoner i opplæringsverdenen!{*B*}{*B*} +{*T1*}Nye "påskeegg"{*ETB*} – Se om du kan finne alle de hemmelige musikkplatene som er gjemt i verdenen!{*B*}{*B*} - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker en smelteovn. - + + Påfører mer skade enn med hendene. - - Du må plassere litt brensel i bunnen av smelteovnen, og deretter legger du gjenstanden du skal behandle, i toppen. Smelteovnen vil så sette i gang, og det ferdige produktet vil dukke opp på plassen til høyre. - + + Brukes til å grave i jord, gress, sand, grus og snø raskere enn for hånd. Spader kreves for å grave opp snøballer. - - - Mange tregjenstander kan brukes som brensel, men ikke alt brenner like lenge. Du vil kanskje også se at det er andre ting ute i verdenen som kan brukes som brensel. - + + Spurte - - Når du har behandlet gjenstandene dine i smelteovnen, kan du flytte dem over til inventaret ditt. Prøv deg frem med ulike ingredienser for å se hva du kan lage. - + + Nyheter - - - Hvis du bruker tre som ingrediens, kan du lage trekull. Legg litt brensel i smelteovnen og litt tre på ingrediensplassen. Det kan imidlertid ta litt tid å lage trekull, så du kan benytte tiden til å gjøre andre ting, og så komme tilbake se hvordan det går senere. - + + {*T3*}Endringer og tillegg{*ETW*}{*B*}{*B*} +- Nye gjenstander lagt til: Herdet leire, farget leire, kullblokk, høyball, aktivatorskinne, rødsteinsblokk, dagslyssensor, dropper, trakt, gruvevogn med trakt, gruvevogn med TNT, rødsteinskomparator, vektet trykkplate, lyssignal, kiste med felle, fyrverkerirakett, fyrverkeristjerne, underverdenstjerne, reim, hesterustning, navnemerke, hesteyngleegg{*B*} +- Nye vesener lagt til: Wither, Wither-skjeletter, hekser, flaggermus, hester, esler og muldyr{*B*} +- Nye funksjoner for terrengfremstilling lagt til: Heksehytter.{*B*} +- Lyssignalgrensesnitt lagt til.{*B*} +- Hestegrensesnitt lagt til.{*B*} +- Traktgrensesnitt lagt til.{*B*} +- Fyrverkeri lagt til. Fyrverkerigrensesnittet er tilgjengelig fra utformingsbordet når du har ingrediensene til å utforme en fyrverkeristjerne eller fyrverkerirakett.{*B*} +- Eventyrmodus lagt til. Du kan bare dele blokker hvis du har riktige verktøy.{*B*} +- Mange nye lyder lagt til.{*B*} +- Vesener, gjenstander og prosjektiler kan nå passere gjennom portaler.{*B*} +- Repeatere kan nå låses ved å styrke sidene deres med en annen repeater.{*B*} +- Zombier og skjeletter kan nå yngle med ulike våpen og rustninger.{*B*} +- Nye dødsmeldinger.{*B*} +- Navngi vesener med et navnemerke og gi nye navn til beholdere for å endre tittelen når menyen er åpen.{*B*} +- Beinmel får ikke lenger umiddelbart ting til å vokse til full størrelse, men til å vokse tilfeldig i faser.{*B*} +- Et rødsteinsignal som beskriver innholdet i kister, bryggeapparater, dispensere og platespillere, kan oppdages ved å plassere en rødsteinskomparator direkte mot disse.{*B*} +- Dispensere kan vende i en hvilken som helst retning.{*B*} +- Å spise et gulleple gir spilleren ekstra absorberingshelse i en kort periode.{*B*} +- Desto lenger du forblir i et område, jo vanskeligere blir monstrene som yngler i det området.{*B*} - - - Trekull kan brukes som brensel eller utformes til fakler med pinner. - + + Dele skjermbilder - - - Hvis du plasserer sand på ingrediensplassen, kan du lage glass. Lag noen glassblokker som du kan bruke som vindu i tilfluktsstedet ditt. - + + Kister - - - Dette er bryggegrensesnittet. Her kan du lage eliksirer med en rekke ulike virkninger. - + + Utforming - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker bryggeapparatet. - + + Smelteovn - - - Du brygger eliksirer ved å plassere en ingrediens i toppen, og så en eliksir eller en vannflaske i bunnen (opp til tre kan brygges samtidig). Når du har valgt en godkjent kombinasjon, begynner bryggeprosessen, og etter en kort stund har du en ferdig eliksir. - + + Grunnleggende - - - Alle eliksirer har en vannflaske som utgangspunkt. Og de fleste eliksirer lages ved først å bruke en underverdenvorte for å lage en rar eliksir, før du deretter legger til minst én ingrediens til for å lage den endelige eliksiren. - + + HUD - - - Når du har laget en eliksir, kan du modifisere virkningen. Ved å legge til rødsteinstøv økes virkningstiden, og hvis du legger til glødesteinstøv blir virkningen kraftigere. - + + Inventar - - - Dersom du legger til gjæret edderkoppøye, blir eliksiren fordervet og kan få motsatt virkning, og ved å legge til krutt gjør du eliksiren om til en spruteeliksir som kan kastes slik at virkningen påføres området den lander i. - + + Dispenser - - - Lag en eliksir med ildmotstand ved først å ta en vannflaske og legge til underverdenvorte, og deretter legge til magmakrem. - + + Fortryllelse - - - Trykk på {*CONTROLLER_VK_B*} for å gå ut av bryggegrensesnittet. - + + Portaler - - - Her er det et bryggeapparat, en gryte og en kiste full av bryggegjenstander. - + + Flerspiller - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om brygging og eliksirer.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om brygging og eliksirer. - + + Dyrehold - - - Første steg når du skal brygge en eliksir, er å lage en vannflaske. Ta en glassflaske fra kisten. - + + Dyreavl - - - Du kan fylle en glassflaske ved hjelp av en gryte med vann eller en vannblokk. Fyll glassflasken nå ved å peke på vannkilden og trykke på {*CONTROLLER_ACTION_USE*}. - + + Brygging - - - Dersom gryten blir tom, kan du fylle den igjen med en vannbøtte. - + + deadmau5 liker Minecraft! - - - Bruk bryggeapparatet til å lage en eliksir med ildmotstand. Til det vil du trenge en vannflaske, en underverdenvorte og magmakrem. - + + Grisemenn angriper deg ikke – med mindre du angriper dem. - - - Når du holder en eliksir i hånden, kan du ta den i bruk ved å holde inne {*CONTROLLER_ACTION_USE*}. Vanlige eliksirer kan du drikke og få virkningen av selv, mens spruteeliksirer kan kastes, slik at virkningen spres på vesener i nærheten av der de treffer. - Spruteeliksirer lager du ved å legge til krutt i vanlige eliksirer. - + + Du kan endre returneringspunktet og spole frem til neste dag ved å sove i en seng. - - - Bruk en eliksir med ildmotstand på deg selv. - + + Slå ildkulene tilbake på geisten! - - - Nå som du er motstandsdyktig mot ild og lava, kan du se om du finner noen steder du ikke kunne komme til før. - + + Lag noen fakler for belysning når det er mørkt. Monstrene holder seg unna området rundt faklene. - - - Dette er fortryllelsesgrensesnittet. Her kan du legge fortryllelser på våpen, rustning og noen typer verktøy. - + + Du kommer deg raskere frem med en gruvevogn og skinner! - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om fortryllelsesgrensesnittet.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om fortryllelsesgrensesnittet. - + + Plant noen trær og se dem vokse seg store. - - - Hvis du vil fortrylle en gjenstand, må du først plassere den på fortryllelsesplassen. Våpen, rustning og noen typer verktøy kan fortrylles for å gi dem spesielle effekter som f.eks. bedre motstandsdyktighet mot skader eller økt utvinningsmengde. - + + Ved å bygge en portal kan du reise til en annen dimensjon – underverdenen. - - - Når en gjenstand plasseres på fortryllelsesplassen, vil knappene til høyre endres til å vise et utvalg med tilfeldige fortryllelser. - + + Å grave rett ned eller rett opp er ikke særlig lurt. - - - Tallet på knappene viser hvor mye den aktuelle fortryllelsen koster i erfaringsnivå. Hvis du ikke har høyt nok nivå, vil den aktuelle knappen være deaktivert. - + + Beinmel (laget av skjelettbein) kan brukes som gjødsel og få ting til å vokse umiddelbart! - - - Velg en fortryllelse, og trykk på {*CONTROLLER_VK_A*} for å bruke den på gjenstanden. Dette vil redusere erfaringsnivået ditt med prisen på fortryllelsen. - + + Smygere eksploderer når de kommer i nærheten av deg! - - - Selv om fortryllelsene er tilfeldige, vil noen av de aller beste fortryllelsene kun være tilgjengelige når du har et høyt erfaringsnivå og har mange bokhyller rundt fortryllelsesbordet ditt. - + + Trykk på {*CONTROLLER_VK_B*} for å slippe det du holder i hånden! - - - Her er det et fortryllelsesbord og noen andre ting som kan bruke til å lære mer om fortryllelse. - + + Bruk det rette verktøyet til jobben! - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å få mer informasjon om fortryllelse.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om fortryllelse. - + + Hvis du ikke finner noe kull til faklene dine, kan du alltids lage trekull av trær i en smelteovn. - - - Ved hjelp av et fortryllelsesbord kan du legge til spesialeffekter som å øke hvor mange gjenstander du får fra å utvinne blokker, eller gi våpen, rustning og noen typer verktøy økt motstandsdyktighet mot skader. - + + Du får mer helse av å spise tilberedte koteletter enn rå. - - - Hvis du plasserer bokhyller rundt fortryllelsesbordet, får det økt kraft og du får tilgang til fortryllelser på høyere nivå. - + + Hvis vanskelighetsgraden er "Fredelig", vil helsen din regenereres automatisk, og det dukker ikke opp monstre om natten! - - - Å fortrylle gjenstander koster erfaringsnivå. Dette nivået kan du bygge opp ved å samle erfaringskuler, som du får tak i ved å drepe monstre og dyr, utvinne fra malm, avle opp dyr, fiske samt smelte/tilberede ting i smelteovner. - + + Gi en ulv et bein for å temme den. Deretter kan du få den til å sitte eller følge deg. - - - Du kan også bygge opp erfaringsnivå ved hjelp av en flaske med fortryllelse, som avgir erfaringskuler rundt seg når den kastes på bakken. Disse kulene kan du så samle. - + + Du kan slippe gjenstander i Inventar-menyen ved å trykke på{*CONTROLLER_VK_A*}utenfor menyen. - - - I kistene i dette området kan du finne noen fortryllede gjenstander, flasker med fortryllelse samt gjenstander som ikke ennå har blitt fortryllet, men som du kan eksperimentere med på erfaringsbordet. - + + Nytt nedlastbart innhold tilgjengelig! Du finner det via knappen Minecraft-butikken i hovedmenyen. - - - Du kjører nå i en gruvevogn. For å gå ut av gruvevognen peker du på den med markøren og trykker på {*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} - + + Du kan endre utseendet til karakteren din med en skallpakke fra Minecraft-butikken. Velg Minecraft-butikken i hovedmenyen for å se hva som er tilgjengelig. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om gruvevogner.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om gruvevogner. - + + Endre gammainnstillingene for å gjøre spillet lysere eller mørkere. - - - Gruvevogner går på skinner. Du kan også lage en kraftforsynt gruvevogn ved hjelp av en smelteovn og en gruvevogn med en kiste i. - {*RailIcon*} - + + Dersom du legger deg til å sove i en seng om natten, spoler du frem til neste dag. I flerspillermodus må alle spillerne i spillet sove i en seng til samme tid. - - - Du kan også lage kraftskinner, som drives av rødsteinfakler og kretser. Disse kan deretter kobles til brytere, spaker og trykkplater for å lage komplekse systemer. - {*PoweredRailIcon*} - + + Bruk en krafse for å gjøre jorda klar til planting. - - - Du seiler nå i en båt. For å gå ut av båten peker du på den med markøren og trykker på {*CONTROLLER_ACTION_USE*} .{*BoatIcon*} - + + Edderkopper angriper ikke på dagen – med mindre du angriper dem først. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om båter.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om båter. - + + Det går fortere å grave i jord eller sand med en spade enn med hendene! - - - Med en båt kan du reise raskere på vann. Den kan styres med {*CONTROLLER_ACTION_MOVE*} and {*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - + + Høst inn koteletter fra griser, så kan du tilberede og spise dem for å gjenvinne helse. - - - Du holder nå en fiskestang. Trykk på {*CONTROLLER_ACTION_USE*} for å bruke den.{*FishingRodIcon*} - + + Høst inn skinn fra storfe, så kan du bruke det til å lage rustning. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om fisking.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om fisking. - + + Hvis du har en tom bøtte, kan du fylle den med vann, lava eller melk fra kuer! - - - Trykk på {*CONTROLLER_ACTION_USE*} for å kaste ut snøret og begynne å fiske. Trykk på {*CONTROLLER_ACTION_USE*} igjen for å snelle inn snøret. - {*FishingRodIcon*} - + + Obsidian skapes når vann treffer en lavablokk. - - - Hvis du venter til duppen synker ned før du sneller inn, kan du få fisk. Fisk kan spises rå eller tilberedes på en smelteovn, og den gir deg helse. - {*FishIcon*} - + + Nå finnes det stablebare gjerder i spillet! - - - På samme måte som mange andre redskaper har også fiskestangen et bestemt antall bruksområder. Prøv deg frem med den for å se hva annet du kan fange eller aktivere ... - {*FishingRodIcon*} - + + Noen dyr følger etter deg hvis du har hvete i hånden. - - - Dette er en seng. Trykk på {*CONTROLLER_ACTION_USE*} mens du peker på den på nattetid for å sove deg gjennom natten og våkne om morgenen.{*ICON*}355{*/ICON*} - + + Dersom et dyr ikke kan bevege seg mer enn 20 blokker i en retning, vil det ikke forsvinne. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om senger.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om senger. - + + Tamme ulvers helsenivå ser du på halens stilling. Mat dem for å helbrede dem. - - - Du bør plassere sengen på et trygt og godt opplyst sted, slik at du ikke blir vekket av monstre midt på natten. Hvis du dør etter at du har brukt en seng, vil du gjenoppstå i denne sengen. - {*ICON*}355{*/ICON*} - + + Tilbered kaktus i en smelteovn for å lage grønt fargestoff. - - - Hvis det er andre spillere med i spillet ditt, må alle ligge i en seng til samme tid for at man skal kunne sove. - {*ICON*}355{*/ICON*} - + + Du finner mye nyttig informasjon i "Slik spiller du"-menyene! - - - I dette området er det noen enkle rødsteinkretser og stempler, samt en kiste med flere gjenstander som kan brukes til å forlenge disse kretsene. - + + Musikk av C418! - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om rødsteinkretser og stempler.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om rødsteinkretser og stempler. - + + Hvem er Notch? - - - Spaker, knapper, trykkplater og rødsteinfakler kan brukes til å forsyne kretser med kraft, enten ved å koble dem direkte til gjenstanden du vil aktivere, eller ved å koble dem til rødsteinstøv. - + + Mojang har flere priser enn ansatte! - - - Hvor og i hvilken retning du plasserer en kraftkilde, kan bestemme hvordan den virker inn på blokkene rundt den. For eksempel kan en rødsteinfakkel ved siden av en blokk slås av hvis blokken får kraft fra en annen kilde. - + + Det finnes noen kjendiser som spiller Minecraft! - - - Rødsteinstøv samles ved å utvinne fra rødsteinmalm med en jern-, diamant- eller gullhakke. Støvet kan brukes til å transportere kraft i opptil 15 blokker, og det kan bevege seg én blokkhøyde opp eller ned. - {*ICON*}331{*/ICON*} - + + Notch har over en million følgere på twitter! - - - Rødsteinrepeatere kan brukes til å øke avstanden kraften kan transporteres, eller til å legge inn en forsinkelse i en krets. - {*ICON*}356{*/ICON*} - + + Ikke alle svensker er blonde. Det finnes til og med noen rødhåringer, som for eksempel Jens fra Mojang! - - - Når et stempel forsynes med kraft, strekker det seg ut og skyver opptil 12 blokker. Når stempelet så trekker seg inn igjen, og det er snakk om et klistrestempel, trekker det tilbake én blokk av de fleste typer som ligger inntil stempelet. - {*ICON*}33{*/ICON*} - + + Det kommer snart en oppdatering til dette spillet! - - - I kisten i dette området er det noen komponenter som du kan bruke til å lage kretser med stempler. Prøv å bruke eller fullføre kretsene i dette området, eller lag din egen krets. Det finnes flere eksempler utenfor opplæringsområdet. - + + Ved å plassere to kister ved siden av hverandre lager du en stor kiste. - - - I dette området er det en portal til underverdenen! - + + Vær forsiktig når du bygger ting av ull i åpent landskap, ettersom lynnedslag kan få det til å begynne å brenne. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om portaler og underverdenen.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om portaler og underverdenen. - + + Én bøtte med lava kan brukes til å smelte 100 blokker i en smelteovn. - - - Portaler lages ved å plassere obsidianblokker i en ramme som er fire blokker bred og fem blokker høy. Hjørneblokker trengs ikke. - + + Hvilket instrument noteblokker spiller, avhenger av materialet under dem. - - - For å aktivere en underverdenportal må du tenne på obsidianblokkene i rammen med tennstål. Portaler kan deaktiveres dersom rammen brytes, det skjer en eksplosjon i nærheten eller det flyter en væske gjennom dem. - + + Det kan gå noen minutter før lavaen forsvinner HELT når kildeblokken fjernes. - - - For å bruke en underverdenportal må du stille deg i den. Skjermen blir da lilla og du vil høre en lyd. Etter noen sekunder vil du bli transportert til en annen dimensjon. - + + Brosteiner tåler ildkuler fra geister, noe som gjør at de er nyttige til å verne portaler. - - - Underverdenen kan være et farlig sted å være, ettersom det er fullt av lava der, men det kan være et lurt sted å være for å samle underverdenstein, som brenner for evig når den tennes, samt glødestein som gir lys. - + + Blokker som kan brukes som lyskilder, kan også smelte snø og is. Dette inkluderer fakler, glødesteiner og gresskarlykter. - - - Underverdenen kan også brukes til å hurtigreise i oververdenen – én blokk i underverdenen tilsvarer tre i oververdenen. - + + Zombier og skjeletter kan overleve dagslyset dersom de befinner seg i vann. - - - Du er nå i kreativ modus. - + + Høner legger egg hvert 5. til 10. minutt. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om kreativ modus.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om kreativ modus. - + + Obsidian kan kun utvinnes med en diamanthakke. - - I kreativ modus har du et uendelig antall gjenstander og blokker tilgjengelig, du kan knuse blokker med ett klikk uten verktøy, du er usårbar, og du kan fly. + + Smygere er den lettest tilgjengelige kilden til krutt. - - Trykk på {*CONTROLLER_ACTION_CRAFTING*} for å åpne inventaret for kreativ modus. + + Hvis du angriper en ulv, vil andre ulver i nærheten bli fiendtlige og angripe deg. Det samme gjelder for zombie-grisemenn. - - Kom deg over på motsatt side av dette hullet for å fortsette. + + Ulver kan ikke gå ned i underverdenen. - - Du har nå fullført opplæringen for kreativ modus. + + Ulver angriper ikke smygere. - - - I dette området er det bygget en gård. Gjennom å drive en gård kan du skaffe deg en fornybar kilde til mat og andre gjenstander. - + + Kreves for å hugge ut steinrelaterte blokker og malm. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om gårdsdrift.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om gårdsdrift. - + + Brukes i kakeoppskriften og som ingrediens for å brygge eliksirer. - - Hvete, gresskar og meloner dyrkes fra frø. Hvetefrø får du ved å knuse høyt gress eller høste inn hvete, mens gresskar- og melonfrø fås fra henholdsvis gresskar og meloner. + + Brukes til å sende en elektrisk ladning når den slås på eller av. Blir værende i på- eller av-stilling til neste gang den betjenes. - - Før du planter frøene, må jordblokker gjøres om til dyrkbar jord ved hjelp av en krafse. Du trenger en vannkilde i nærheten for å vanne jorden slik at avlingene vokser fortere, og i tillegg må du sørge for nok lys. + + Sender kontinuerlig ut en elektrisk ladning eller kan brukes som sender/mottaker ved tilkobling på siden av en blokk. +Kan også brukes som svak belysning. - - Hvete går gjennom flere vekstfaser, og den er først klar til innhøsting når den er litt mørkere.{*ICON*}59:7{*/ICON*} + + Gir deg 2 {*ICON_SHANK_01*} og kan brukes til å lage et gulleple. - - Gresskar og meloner trenger også en ekstra blokk ved siden av der frøet ble plantet, slik at frukten har plass til å vokse etter at stilken er utvokst. + + Gir deg 2 {*ICON_SHANK_01*} og regenererer helsen din i 4 sekunder. Lages av et eple og gullklumper. - - Sukkerrør må plantes på en gress-, jord- eller sandblokk som ligger like ved en vannblokk. Når du hugger ned en sukkerrørblokk, faller også alle blokker over den ned.{*ICON*}83{*/ICON*} + + Gir deg 2 {*ICON_SHANK_01*}. Kan føre til matforgiftning. - - Kaktuser må plantes på sand, og kan vokse seg opptil tre blokker høye. På samme måte som med sukkerrør vil du ved å knuse den nederste blokken også kunne samle inn fra blokkene over.{*ICON*}81{*/ICON*} + + Brukes i rødsteinkretser som repeater, forsinker og/eller diode. - - Sopp bør plantes på et svakt opplyst sted, og vil deretter spre seg til andre svakt opplyste blokker i nærheten.{*ICON*}39{*/ICON*} + + Brukes til å kjøre gruvevogner på. - - Beinmel kan brukes til å få avlinger helt utvokste eller til å få sopper til å vokse seg til digre sopper.{*ICON*}351:15{*/ICON*} + + Når den forsynes med kraft, akselererer gruvevogner på den. Når den ikke forsynes med kraft, stopper gruvevogner på den. - - Du har nå fullført opplæringen for gårdsdrift. + + Fungerer som en trykkplate (sender et rødsteinsignal når den forsynes med kraft), men kan kun aktiveres av gruvevogner. - - - I dette områdene er dyrene inngjerdet. Du kan avle dyr slik at de lager babyversjoner av seg selv. - + + Brukes til å sende en elektrisk ladning når den trykkes på. Er på i ca. ett sekund før den slår seg av igjen. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å få mer informasjon om dyreavl.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om dyreavl. - + + Brukes til å fylles med og mate ut gjenstander i tilfeldig rekkefølge etter at den gis en rødsteinladning. - - For å avle frem dyr må du fôre dem riktig slik at de går inn i en "elskovsmodus". + + Spiller en note ved utløsning. Slå den for å endre tonehøyde. Ved å plassere den på ulike blokker endrer du typen instrument som brukes. - - Fôr kuer, soppkuer, griser eller sauer med hvete, høner med hvetefrø eller underverdenvorter og ulver med en eller annen type kjøtt, så begynner de snart å se seg om etter et dyr av samme art som også er i elskovsmodus. + + Gir deg 2,5 {*ICON_SHANK_01*}. Lages ved å tilberede en rå fisk i en smelteovn. - - Når to dyr av samme art møtes som begge er i elskovsmodus, begynner de kysse litt, og så dukker det snart opp en dyreunge. Dyreungene følger foreldrene sine en stund før de selv blir voksne dyr. - + + Gir deg 1 {*ICON_SHANK_01*}. - - Etter at dyrene har vært i elskovsmodus, vil de ikke kunne gå tilbake til denne modusen før etter ca. 5 minutter. + + Gir deg 1 {*ICON_SHANK_01*}. - - Noen dyr følger etter deg hvis du holder mat de liker, i hånden. Dette gjør det enklere å plassere de ulike artene sammen for å avle dem.{*ICON*}296{*/ICON*} + + Gir deg 3 {*ICON_SHANK_01*}. - - - Ville ulver kan temmes ved å gi dem bein. Når de er temmet, kommer det kjærlighetshjerter rundt dem. Ulver som er temmet, følger spillerne og forsvarer dem hvis ikke de har blitt kommandert til å sitte. - + + Brukes som ammunisjon til buer. - - Du har nå fullført opplæringen for dyreavl. + + Gir deg 2,5 {*ICON_SHANK_01*}. - - - I dette området er det noen gresskar og blokker som kan brukes til å lage en snøgolem eller jerngolem. - + + Gir deg 1 {*ICON_SHANK_01*}. Kan brukes 6 ganger. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om golemer.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om golemer. - + + Gir deg 1 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. Kan gjøre deg syk. - - Golemer lages ved å plassere et gresskar oppå en stabel med blokker. + + Gir deg 1,3 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. - - Snøgolemer lages ved å sette to snøblokker oppå hverandre og deretter et gresskar på toppen av dem igjen. Snøgolemer kaster snøballer på fiendene dine. + + Gir deg 4 {*ICON_SHANK_01*}. Lages ved å tilberede en rå svinekotelett i en smelteovn. - - Jerngolemer lages ved å sette fire jernblokker i det viste mønsteret og deretter et gresskar på toppen av den midterste blokken. Jerngolemer angriper fiendene dine. + + Gir deg 1 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. Kan også brukes til å mate og temme en ozelot. - - Jerngolemer finnes også naturlig som beskyttelse av landsbyer, og disse angriper deg hvis du angriper noen av landsbyboerne. + + Gir deg 3 {*ICON_SHANK_01*}. Lages ved å tilberede rå kylling i en smelteovn. - - Du kan ikke forlate dette området før du har fullført opplæringen. + + Gir deg 1,5 {*ICON_SHANK_01*}, eller kan tilberedes i en smelteovn. - - Ulike typer verktøy passer til ulike typer materialer. Det lønner seg å bruke en spade til å utvinne fra myke materialer som jord og sand. + + Gir deg 4 {*ICON_SHANK_01*}. Lages ved å tilberede rått oksekjøtt i en smelteovn. - - Ulike typer verktøy passer til ulike typer materialer. Det lønner seg å bruke en øks til å hugge trestammer. + + Brukes til å transportere deg, et dyr eller et monster på skinnene. - - Ulike typer verktøy passer til ulike typer materialer. Det lønner seg å bruke en hakke til å utvinne fra steiner og malm. Det kan hende du trenger en hakke av et bedre materiale for å kunne utvinne ressurser fra noen typer blokker. + + Brukes som fargestoff for å lage lyseblå ull. - - Noen verktøy fungerer bedre enn andre til å angripe fiender. Det kan lønne seg å bruke et sverd når du skal angripe. + + Brukes som fargestoff for å lage turkis ull. - - Hint: Hold inne {*CONTROLLER_ACTION_ACTION*} for å utvinne og hugge med hendene eller det du måtte holde i dem. Noen blokker må du kanskje lage et eget verktøy for å utvinne fra. + + Brukes som fargestoff for å lage lilla ull. + + + Brukes som fargestoff for å lage limegrønn ull. - - Verktøyet du bruker, har blitt skadet. Hver gang du bruker et verktøy, vil det bli litt slitt, og til slutt vil det bli ødelagt. Fargelinjen under gjenstanden i inventaret viser skadestatusen dens. + + Brukes som fargestoff for å lage grå ull. - - Hold inne {*CONTROLLER_ACTION_JUMP*} for å svømme opp. + + Brukes som fargestoff for å lage lysegrå ull. + (Merk: Lysegrått fargestoff kan også lages ved å blande grått fargestoff med beinmel – da kan du lage fire lysegrå fargestoffer fra hver blekkpose i stedet for tre.) - - I dette området er det en gruvevogn på en skinne. For å gå opp i gruvevognen peker du på den med markøren og trykker på {*CONTROLLER_ACTION_USE*}. Bruk {*CONTROLLER_ACTION_USE*} på knappen for å få gruvevognen til å bevege seg. + + Brukes som fargestoff for å lage magentarød ull. - - I kisten ved siden av elven er det en båt. For å bruke båten peker du på vannet med markøren og trykker på {*CONTROLLER_ACTION_USE*}. Bruk {*CONTROLLER_ACTION_USE*} mens du peker på båten for å gå opp i den. + + Brukes til å lage skarpere lys enn fakler. Smelter snø/is og kan brukes under vann. - - I kisten ved siden av dammen er det en fiskestang. Ta den opp fra kisten og velg den som gjenstanden du holder i hånden, for å bruke den. + + Brukes til å lage bøker og kart. - - Denne litt mer avanserte stempelmekanismen lager en selvreparerende bro! Trykk på knappen for å aktivere den, og undersøk deretter hvordan komponentene virker sammen for å finne ut mer. + + Kan brukes til å lage bokhyller eller fortrylles om til fortryllede bøker. - - Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden. + + Brukes som fargestoff for å lage blå ull. - - Du har ikke alle ingrediensene som kreves for å lage denne gjenstanden. I boksen nederst til venstre ser du hvilke de er. + + Spiller musikkplater - - - Gratulerer, du har nå fullført opplæringen. Tiden i spillet går nå som normalt, og det er ikke lenge til det er natt og monstrene kommer ut! Gjør ferdig tilfluktsstedet ditt! - + + Bruk disse til å lage ekstra sterke verktøy, våpen eller rustninger. - - {*EXIT_PICTURE*} Når du er klar for å utforske mer, er det en trappeoppgang i området ved gruveskuret som fører til et lite slott. + + Brukes som fargestoff for å lage oransje ull. - - Husk: + + Fås fra sauer og kan farges med fargestoffer. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Brukes som et bygningsmateriale og kan farges med fargestoffer. Denne oppskriften anbefales ikke, ettersom ull enkelt kan fås fra sauer. - - Den siste versjonen av spillet har en rekke nye funksjoner, deriblant nye områder i opplæringsverdenen. + + Brukes som fargestoff for å lage svart ull. - - {*B*}Trykk på {*CONTROLLER_VK_A*} for å spille gjennom opplæringen som vanlig.{*B*} - Trykk på {*CONTROLLER_VK_B*} for å hoppe over hovedopplæringen. + + Brukes til å transportere varer på skinnene. - - I dette området finner du områder hvor du kan lære om fisking, båter, stempler og rødstein. + + Går på skinner og kan drive andre gruvevogner når du skuffer kull inn i den. - - Utenfor dette området finner du eksempler på bygninger, gårdsdrift, gruvevogner og skinner, fortryllelse, brygging, handel, smiing og masse annet! + + Brukes til å komme deg fortere fram i vann enn ved å svømme. - - - Matlinjen har falt ned til et nivå hvor du ikke lenger blir helbredet. - + + Brukes som fargestoff for å lage grønn ull. - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for mer informasjon om matlinjen og spising.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det som er å kunne om matlinjen og spising. - + + Brukes som fargestoff for å lage rød ull. - - Velg + + Brukes til å få avlinger, trær, høyt gress, digre sopper og blomster til å vokse umiddelbart, og kan i tillegg brukes til farging. - - Bruk + + Brukes som fargestoff for å lage rosa ull. - - Tilbake + + Brukes som fargestoff for å lage brun ull, som ingrediens i kjeks, eller til å dyrke kakaofrukter. - - Avslutt + + Brukes som fargestoff for å lage sølvfarget ull. - - Avbryt + + Brukes som fargestoff for å lage gul ull. - - Avbryt forespørsel + + Kan brukes med piler til angrep fra langt hold. - - Oppdater liste over onlinespill + + Gir brukeren 5 i rustning. - - Partyspill + + Gir brukeren 3 i rustning. - - Alle spill + + Gir brukeren 1 i rustning. - - Bytt gruppe + + Gir brukeren 5 i rustning. - - Vis inventar + + Gir brukeren 2 i rustning. - - Vis beskrivelse + + Gir brukeren 2 i rustning. - - Vis ingredienser + + Gir brukeren 3 i rustning. - - Utforming + + En skinnende barre som kan brukes til å utforme verktøy laget av dette materialet. Lages ved å smelte malm i en smelteovn. - - Lag + + Gjør at barrer, edelstener eller fargestoffer kan gjøres om til plasserbare blokker. Kan brukes som en dyr byggeblokk eller til kompakt oppbevaring av malm. - - Ta/plasser + + Sender ut en elektrisk ladning når spillere, dyr eller monstre tråkker på den. Trykkplater av tre kan også aktiveres ved at noe slippes ned på dem. - - Ta + + Gir brukeren 8 i rustning. - - Ta alle + + Gir brukeren 6 i rustning. - - Ta halvparten + + Gir brukeren 3 i rustning. - - Plasser + + Gir brukeren 6 i rustning. - - Plasser alle + + Jerndører kan kun åpnes med rødstein, knapper eller brytere. - - Plasser én + + Gir brukeren 1 i rustning. - - Slipp + + Gir brukeren 3 i rustning. - - Slipp alle + + Brukes til å hugge ut trerelaterte blokker raskere enn for hånd. - - Slipp én + + Brukes til å gjøre jord- og gressblokker klare til dyrking. - - Bytt + + Tredører aktiveres ved å bruke dem, slå på dem eller ved hjelp av rødstein. - - Hurtigflytting + + Gir brukeren 2 i rustning. - - Fjern hurtigvalg + + Gir brukeren 4 i rustning. - - Hva er dette? + + Gir brukeren 1 i rustning. - - Del på Facebook + + Gir brukeren 2 i rustning. - - Endre filter + + Gir brukeren 1 i rustning. - - Send venneforespørsel + + Gir brukeren 2 i rustning. - - En side ned + + Gir brukeren 5 i rustning. - - En side opp + + Brukes til kompakte trapper. - - Neste + + Brukes til å ha soppstuing oppi. Du beholder bollen når stuingen er spist opp. - - Forrige + + Brukes til å oppbevare og frakte vann, lava og melk. - - Spark ut spiller + + Brukes til å oppbevare og frakte vann. - - Farg + + Viser tekst som du eller andre spillere har skrevet inn. - - Utvinn + + Brukes til å oppnå et skarpere lys enn fakler. Smelter snø/is og kan brukes under vann. - - Fôr + + Brukes til å skape eksplosjoner. Aktiveres etter utplassering ved å tennes med tennstål eller med en elektrisk ladning. - - Tem + + Brukes til å oppbevare og frakte lava. - - Helbred + + Viser solens og månens posisjon. - - Sitt + + Peker mot startpunktet ditt. - - Følg meg + + Gir deg et bilde av et utforsket område. Kan brukes til å finne vei. - - Løs ut + + Brukes til å oppbevare og frakte melk. - - Tøm + + Brukes til å lage ild, tenne TNT og åpne portaler etter at de er bygget. - - Sal + + Brukes til å fange fisk. - - Plasser + + Aktiveres ved å brukes, slå på eller ved hjelp av rødstein. Fungerer som vanlige dører, men er 1x1 blokk stor og ligger flatt på bakken. - - Slå + + Brukes som et bygningsmateriale og kan lages om til mange ting. Kan utformes av alle typer tre. - - Melk + + Brukes som et bygningsmateriale. Påvirkes ikke av tyngdekraft slik som vanlig sand. - - Samle inn + + Brukes som et bygningsmateriale. - - Spis + + Brukes til å lage lange trapper. To heller plassert oppå hverandre vil utgjøre en blokk av vanlig størrelse. - - Sov + + Brukes til å lage lange trapper. To heller plassert oppå hverandre skaper en helleblokk av vanlig størrelse. - - Våkne + + Brukes til å lage lys. Fakler kan også smelte snø og is. - - Spill + + Brukes til å lage fakler, piler, skilt, stiger, gjerder samt skaft til verktøy og våpen. - - Ri + + Til oppbevaring av blokker og gjenstander. Plasser to kister ved siden av hverandre for å lage en større kiste med dobbel kapasitet. - - Seil + + Brukes som en barriere som ikke kan hoppes over. Teller som 1,5 blokk for spillere, dyr og monstre, men som 1 blokk for andre blokker. - - Dyrk + + Brukes til å klatre sidelengs. - - Svøm opp + + Brukes til å spole frem til neste morgen hvis alle spillerne i verdenen er i en seng til samme tid. Endrer i tillegg spillerens returneringspunkt. +Fargen på sengen er alltid lik, uavhengig av fargen på ullen som brukes. - - Åpne + + Gjør det mulig å utforme et mer variert utvalg av gjenstander enn ved vanlig utforming. - - Endre tonehøyde + + Gjør det mulig å smelte malm, lage trekull og glass, og tilberede fisk og koteletter. - - Detoner + + Jernøks - - Les + + Rødsteinlampe - - Heng + + Jungeltretrapp - - Kast + + Bjørketrapp - - Plant + + Gjeldende kontroller - - Kultiver + + Hodeskalle - - Høst inn + + Kakao - - Fortsett + + Grantrapp - - Lås opp fullversjon + + Drageegg - - Slett lagring + + Sluttstein - - Slett + + Sluttportalramme - - Alternativer + + Sandsteintrapp - - Inviter venner + + Bregne - - Aksepter + + Kratt - - Klipp + + Oppsett - - Sperr nivå + + Utforming - - Velg skall + + Bruk - - Tenn på + + Handling - - Naviger + + Snik / fly ned - - Installer fullversjon + + Snik - - Installer prøveversjon + + Slipp - - Installer + + Bytt gjenstand - - Installer på nytt + + Pause - - Lagringsalt. + + Se - - Utfør kommando + + Gå/spurt - - Kreativ + + Inventar - - Flytt ingrediens + + Hopp / fly opp - - Flytt brensel + + Hopp - - Flytt verktøy + + Sluttportal - - Flytt rustning + + Gresskarstilk - - Flytt våpen + + Melon - - Bruk + + Glassrute - - Spenn + + Grind - - Slipp + + Slyngplante - - Rettigheter + + Melonstilk - - Blokk + + Jernstenger - - En side opp + + Sprukne mursteiner - - En side ned + + Mosegrodde mursteiner - - Elskovsmodus + + Mursteiner - - Drikk + + Sopp - - Roter + + Sopp - - Gjem deg + + Meislede mursteiner - - Tøm alle felter + + Teglsteinstrapp - - OK + + Underverdenvorte - - Avbryt + + Underverdensteinstrapp - - Minecraft-butikken + + Underverdensteinsgjerde - - Er du sikker på at du vil gå ut av det aktive spillet og bli med i det nye? All ulagret fremdrift vil gå tapt. + + Gryte - - Avslutt spill + + Bryggeapparat - - Lagre spill + + Fortryllelsesbord - - Avslutte uten å lagre + + Underverdenstein - - Er du sikker på at du vil overskrive en tidligere lagring av denne verdenen med den gjeldende versjonen? + + Sølvkrebrostein - - Er du sikker på at du vil avslutte uten å lagre? All ulagret fremdrift i denne verdenen vil gå tapt! + + Sølvkrestein - - Starte spill + + Mursteinstrapp - - Skadet lagring + + Liljeplatting - - Denne lagringen er ødelagt eller skadet. Vil du slette den? + + Mycelium - - Er du sikker på at du vil avslutte til hovedmenyen? Alle spillere vil bli koblet fra spillet, og all ulagret fremdrift vil gå tapt. + + Sølvkremurstein - - Avslutt og lagre + + Endre kameramodus - - Avslutt uten å lagre + + Hvis du mister helse, men har minst 9 {*ICON_SHANK_01*} på matlinjen, vil helsen din fylles opp automatisk. Du kan spise mat for å fylle opp matlinjen. - - Er du sikker på at du vil gå ut av hovedmenyen? All ulagret fremdrift vil gå tapt. + + Når du beveger deg rundt og utvinner og angriper, vil matlinjen din {*ICON_SHANK_01*} tømmes. Spurting og spurtehopping krever mye mer mat enn vanlig gange og hopping. - - Er du sikker på at du vil gå ut av hovedmenyen? All fremdrift vil gå tapt. + + Etter hvert som du samler og lager flere ting, vil inventaret ditt fylles opp.{*B*} + Trykk på {*CONTROLLER_ACTION_INVENTORY*} for å åpne inventaret. - - Opprett ny verden + + Trevirket du har samlet inn, kan utformes til planker. Åpne utformingsgrensesnittet for å gjøre dette.{*PlanksIcon*} - - Spill opplæring + + Matlinjen er nesten tom, og du har mistet en del helse. Spis biffen i inventaret ditt for å fylle opp matlinjen og helbrede deg.{*ICON*}364{*/ICON*} - - Opplæring + + Når du holder en matvare i hånden, kan du holde inne {*CONTROLLER_ACTION_USE*} for å spise den og fylle opp matlinjen. Du kan ikke spise hvis matlinjen er full. - - Gi verdenen navn + + Trykk på {*CONTROLLER_ACTION_CRAFTING*} for å åpne Utforming. - - Skriv inn et navn på verdenen din. + + Trykk {*CONTROLLER_ACTION_MOVE*} forover to ganger på rad for å spurte. Så lenge du holder {*CONTROLLER_ACTION_MOVE*} forover, fortsetter karakteren å spurte frem til du går tom for spurtetid eller mat. - - Angi seeden for verdensgenerering + + Bruk {*CONTROLLER_ACTION_MOVE*} for å bevege deg. - - Last inn lagret verden + + Bruk {*CONTROLLER_ACTION_LOOK*} for å se opp, ned og rundt deg. - - Trykk på START for å bli med i spill + + Hold inne {*CONTROLLER_ACTION_ACTION*} for å hugge ned 4 treblokker (stammer).{*B*}Når en blokk går i stykker, kan du plukke den opp ved å stå ved den svevende gjenstanden som vises, og den vil da dukke opp i inventaret ditt. - - Avslutter spillet + + Hold inne {*CONTROLLER_ACTION_ACTION*} for å utvinne og hugge med hendene eller det du måtte holde i dem. Noen blokker må du kanskje lage et eget verktøy for å utvinne fra. - - Det har oppstått en feil. Går tilbake til hovedmenyen. + + Trykk på {*CONTROLLER_ACTION_JUMP*} for å hoppe. - - Tilkobling mislyktes. + + Utforming kan gå over en rekke trinn. Nå som du har noen planker, er det flere ting du kan lage – blant annet et utformingsbord.{*CraftingTableIcon*} - - Forbindelse brutt. + + Natten kan komme fort, og da er det farlig å oppholde seg utendørs uforberedt. Du kan lage rustning og våpen, men det lureste er å skaffe seg et tilfluktssted. + - - Forbindelsen til serveren er brutt. Går tilbake til hovedmenyen. + + Åpne beholderen - - Koblet fra serveren. + + Med en hakke kan du grave raskere i harde blokker, som stein og malm. Etter hvert som du samler flere materialer, kan du lage verktøy som er raskere og mer holdbare. Lag en trehakke.{*WoodenPickaxeIcon*} - - Du ble sparket ut av spillet. + + Bruk hakken til å utvinne fra noen steinblokker. Steinblokker gir deg brosteiner når de utvinnes. Hvis du samler 8 brosteinblokker, kan du bygge en smelteovn. Du må kanskje grave deg gjennom litt jord for å komme til steinen, det kan du bruke spaden til.{*StoneIcon*} - - Du ble sparket ut av spillet for å ha flydd. + + Du må samle ressursene som kreves for å bygge opp skuret igjen. Vegger og tak kan lages av alle typer felt, men du trenger også en dør, noen vinduer og litt lys. + - - Tilkoblingen tok for lang tid. + + I nærheten er det et forlatt gruveskur som du kan bygge opp og bruke som tilfluktssted for natten. + - - Serveren er full. + + Med en øks kan du hugge tre og trefelt raskere. Etter hvert som du samler flere materialer, kan du lage verktøy som er raskere og mer holdbare. Lag en treøks.{*WoodenHatchetIcon*} - - Verten har avsluttet spillet. + + Bruk {*CONTROLLER_ACTION_USE*} for å bruke gjenstander, samhandle med objekter og plassere ut visse gjenstander. Utplasserte gjenstander kan plukkes opp igjen og utvinnes med riktig verktøy. - - Du kan ikke bli med i dette spillet fordi du ikke er venn med noen i det. + + Bruk {*CONTROLLER_ACTION_LEFT_SCROLL*} og {*CONTROLLER_ACTION_RIGHT_SCROLL*} for å endre hva du holder i hånden. - - Du kan ikke bli med i dette spillet fordi du har blitt sparket ut av verten tidligere. + + For å samle blokker raskere kan du lage deg verktøy beregnet på jobben. Noen verktøy har et skaft laget av pinner. Lag noen pinner nå.{*SticksIcon*} - - Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en eldre versjon av spillet. + + Med en spade kan du grave raskere i myke blokker, som jord og snø. Etter hvert som du samler flere materialer, kan du lage verktøy som er raskere og mer holdbare. Lag en trespade.{*WoodenShovelIcon*} - - Du kan ikke bli med i dette spillet fordi spilleren du prøver å slutte deg til, har en nyere versjon av spillet. + + Pek markøren på utformingsbordet, og trykk på {*CONTROLLER_ACTION_USE*} for å åpne det. - - Ny verden + + Når du har valgt utformingsbordet, peker du markøren på ønsket sted og velger {*CONTROLLER_ACTION_USE*} for å utplassere et utformingsbord. - - Belønning låst opp! + + Minecraft er et spill som dreier seg om å plassere blokker for å bygge hva det måtte være. På natten kommer monstrene ut, så husk å bygge deg et tilfluktssted før det skjer. - - Hurra – du har fått et spillerbilde av Steve fra Minecraft! + + - - Hurra – du har fått et spillerbilde av en smyger! + + - - Lås opp fullversjon + + - - Du spiller prøveversjonen, og du må ha fullversjonen for å kunne lagre spillet. -Vil du låse opp fullversjonen av spillet nå? + + - - Vent litt + + - - Ingen resultater + + - - Filter: + + - - Venner + + Oppsett 1 - - Min poengsum + + Bevegelse (under flyvning) - - Totalt + + Spillere/invitasjon - - Oppføringer: + + - - Rang + + Oppsett 3 - - Forbereder lagring av nivå + + Oppsett 2 - - Forbereder segmenter ... + + - - Fullfører ... + + - - Bygger terreng + + - - Simulerer verdenen litt + + - - Initialiserer server + + {*B*}Trykk på {*CONTROLLER_VK_A*} for å starte opplæringen.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du føler du er klar til å spille på egen hånd. - - Genererer startpunkt + + {*B*}Trykk på {*CONTROLLER_VK_A*} for å fortsette. - - Laster inn startpunkt + + - - Går ned i underverdenen + + - - Forlater underverdenen + + - - Gjenoppstår + + - - Genererer nivå + + - - Laster inn nivå + + - - Lagrer spillere + + - - Kobler til vert + + - - Laster ned terreng + + Sølvkreblokk - - Bytter til offlinespill + + Steinhelle - - Vent litt mens verten lagrer spillet + + En kompakt måte å lagre jern på. - - Entrer Slutten + + Jernblokk - - Forlater Slutten + + Eiketrehelle - - Denne sengen er opptatt. + + Sandsteinhelle - - Du kan bare sove om natten. + + Steinhelle - - %s sover i en seng. For å kunne spole frem til neste morgen må alle spillerne sove i hver sin seng samtidig. + + En kompakt måte å lagre gull på. - - Sengen din manglet eller var blokkert. + + Blomst - - Du kan ikke hvile nå – det er monstre i nærheten. + + Hvit ull - - Du sover i en seng. For å kunne spole frem til neste morgen må alle spillerne sove i hver sin seng samtidig. + + Oransje ull - - Verktøy og våpen + + Gullblokk - - Våpen + + Sopp - - Mat + + Rose - - Byggverk + + Brosteinshelle - - Rustning + + Bokhylle - - Mekanismer + + TNT - - Transport + + Teglsteiner - - Dekorasjoner + + Fakkel - - Byggeblokker + + Obsidian - - Rødstein og transport + + Mosestein - - Diverse + + Underverdensteinshelle - - Brygging + + Eikehelle - - Verktøy, våpen og rustning + + Mursteinshelle - - Materialer + + Teglsteinshelle - - Logget ut + + Jungeltrehelle - - Vanskelighetsgrad + + Bjørkehelle - - Musikk + + Granhelle - - Lyd + + Magentarød ull - - Gamma + + Bjørkeløv - - Spillfølsomhet + + Granløv - - Grensesnittfølsomhet + + Eikeløv - - Fredelig + + Glass - - Lett + + Svamp - - Normal + + Jungeltreløv - - Vanskelig + + Løv - - I denne modusen gjenvinner du helsen over tid, og det er ingen fiender i omgivelsene. + + Eik - - I denne modusen lurker fiender i omgivelsene, men de påfører deg mindre skade enn i modusen Normal. + + Gran - - I denne modusen lurker fiender i omgivelsene og påfører deg standard mengde skade. + + Bjørk - - I denne modusen lurker fiender i omgivelsene og påfører deg stor mengde skade. Du må også passe deg for smygere, siden de neppe avbryter sine eksplosive angrep selv om du beveger deg bort fra dem! + + Grantre - - Prøveperioden er over + + Bjørketre - - Spillet er fullt + + Jungeltre - - Kunne ikke bli med i spillet fordi det ikke var flere plasser igjen. + + Ull - - Skriv inn skilttekst + + Rosa ull - - Skriv inn tekst som skal vises på skiltet ditt. + + Grå ull - - Skriv inn tittel + + Lysegrå ull - - Skriv inn en tittel på innlegget ditt. + + Lyseblå ull - - Skriv inn bildetekst + + Gul ull - - Skriv inn en bildetekst for innlegget ditt. + + Limegrønn ull - - Skriv inn beskrivelse + + Turkis ull - - Skriv inn en beskrivelse for innlegget ditt. + + Grønn ull - - Inventar + + Rød ull - - Ingredienser + + Svart ull - - Bryggeapparat + + Lilla ull - - Kiste + + Blå ull - - Fortrylle + + Brun ull - - Smelteovn + + Fakkel (kull) - - Ingrediens + + Glødestein - - Brensel + + Sjelesand - - Dispenser + + Underverdenstein - - Det er for øyeblikket ingen tilbud på nedlastbart innhold av denne typen til dette spillet. + + Lasursteinblokk - - %s har blitt med i spillet. + + Lasursteinmalm - - %s har forlatt spillet. + + Portal - - %s ble sparket ut fra spillet. + + Gresskarlykt - - Er du sikker på at du vil slette denne lagringen? + + Sukkerrør - - Venter på godkjenning + + Leire - - Sensurert + + Kaktus - - Spiller nå: + + Gresskar - - Tilbakestill innstillinger + + Gjerde - - Er du sikker på at du vil tilbakestille innstillingene til standardverdiene? + + Platespiller - - Innlastingsfeil + + En kompakt måte å lagre lasurstein på. - - %s sitt spill + + Fallem - - Ukjent vertsspill + + Låst kiste - - Gjest logget ut + + Diode - - En gjestespiller har logget ut, slik at alle gjestespillere er fjernet fra spillet. + + Klistrestempel - - Logg inn + + Stempel - - Du er ikke logget inn, noe du må være for å kunne spille. Vil du logge inn nå? + + Ull (alle farger) - - Flerspiller ikke tillatt + + Død busk - - Kunne ikke opprette spill + + Kake - - Automatisk valgt + + Noteblokk - - Ingen pakke: Standardskall + + Dispenser - - Favorittskall + + Høyt gress - - Sperret nivå + + Spindelvev - - Spillet du er i ferd med å bli med i, er på din liste over sperrede nivåer. -Hvis du velger å bli med, fjernes dette nivået fra din liste over sperrede nivåer. + + Seng - - Sperre dette nivået? + + Is - - Er du sikker på at du vil legge til dette nivået i din liste over sperrede nivåer? -Hvis du velger OK, forlater du også dette spillet. + + Utformingsbord - - Fjernet fra liste over sperrede nivåer + + En kompakt måte å lagre diamanter på. - - Intervall for automatisk lagring + + Diamantblokk - - Intervall for automatisk lagring: AV + + Smelteovn - - Minutter + + Dyrkbar jord - - Kan ikke plasseres her! + + Avlinger - - Det er ikke tillatt å plassere lava i nærheten av ynglepunktet på grunn av faren for at spillerne dør rett etter yngling. + + Diamantmalm - - Gjennomsiktighet for grensesnitt + + Monsteryngler - - Gjør klart til automatisk lagring av nivå + + Ild - - HUD-størrelse + + Fakkel (trekull) - - HUD-størrelse (delt skjerm) + + Rødsteinstøv - - Seed + + Kiste - - Lås opp skallpakke + + Eiketrapper - - Du må låse opp denne skallpakken for å kunne bruke det valgte skallet. -Vil du låse den opp nå? + + Skilt - - Lås opp teksturpakke + + Rødsteinmalm - - Du må låse opp denne teksturpakken for å kunne bruke den. -Vil du låse den opp nå? + + Jerndør - - Prøveversjon av teksturpakke + + Trykkplate - - Du bruker en prøveversjon av teksturpakken. Du vil ikke kunne lagre denne verdenen med mindre du låser opp fullversjonen. -Vil du låse opp fullversjonen av teksturpakken? + + Snø - - Teksturpakke finnes ikke + + Knapp - - Lås opp fullversjon + + Rødsteinfakkel - - Last ned prøveversjon + + Spak - - Last ned fullversjon + + Skinne - - Denne verdenen bruker en flettepakke eller teksturpakke som du ikke har! -Vil du installere flettepakken eller teksturpakken nå? + + Stige - - Last ned prøveversjon + + Tredør - - Last ned fullversjon + + Steintrapp - - Spark ut spiller + + Detektorskinne - - Er du sikker på at du vil sparke ut denne spilleren fra spillet? Vedkommende vil ikke kunne bli med igjen før du starter verdenen på nytt. + + Kraftskinne - - Spillerbildepakker + + Du har samlet nok brosteiner til å bygge en smelteovn. Lag en på utformingsbordet. - - Temaer + + Fiskestang - - Skallpakker + + Klokke - - Tillat venner av venner + + Glødesteinstøv - - Du kan ikke bli med i dette spillet fordi det er begrenset til spillere som er venn med verten. + + Gruvevogn med ovn - - Kan ikke bli med i spill + + Egg - - Valgt + + Kompass - - Valgt skall: + + Rå fisk - - Nedlastbart innhold ødelagt + + Rosenrød - - Dette nedlastbare innholdet er ødelagt og kan ikke brukes. Slett det, og installer det deretter på nytt via Minecraft-butikkmenyen. + + Kaktusgrønn - - Deler av det nedlastbare innholdet er ødelagt og kan ikke brukes. Slett det, og installer det deretter på nytt via Minecraft-butikkmenyen. + + Kakaobønner - - Spillmodusen er endret. + + Tilberedt fisk - - Gi nytt navn til verden + + Fargestoff - - Skriv inn det nye navnet på verdenen din. + + Blekkpose - - Spillmodus: Overlevelse + + Gruvevogn med kiste - - Spillmodus: Kreativ + + Snøball + + + Båt - - Overlevelse + + Skinn - - Kreativ + + Gruvevogn - - Laget i overlevelsesmodus + + Sal - - Laget i kreativ modus + + Rødstein - - Vis skyer + + Melkespann - - Hva vil du gjøre med denne lagringen? + + Papir - - Endre navn på lagring + + Bok - - Automatisk lagring om %d ... + + Slimball - - + + Murstein - - Av + + Leire - - Normal + + Sukkerrør - - Superflat + + Lasurstein - - Når dette er aktivert, blir spillet et onlinespill. + + Kart - - Når dette er aktivert, kan kun inviterte spillere bli med. + + Musikkplate – "13" - - Når dette er aktivert, kan venner av dine venner bli med i spillet. + + Musikkplate – "cat" - - Når dette er aktivert, kan spillerne skade hverandre. Påvirker bare overlevelsesmodus. + + Seng - - Når dette er deaktivert, kan ikke spillere som blir med, bygge eller utvinne før de får godkjenning. + + Rødsteinrepeater - - Når dette er aktivert, kan ild spre seg til brennbare blokker i nærheten. + + Kjeks - - Når dette er aktivert, vil TNT eksplodere etter aktivering. + + Musikkplate – "blocks" - - Når dette er aktivert, vil underverdenen bli gjenskapt. Dette er kjekt hvis du har en eldre lagring uten fort i underverdenen. + + Musikkplate – "mellohi" - - Når dette er aktivert, vil byggverk som landsbyer og festninger bli generert i verdenen. + + Musikkplate – "stal" - - Når dette er aktivert, genereres en helt flat verden i oververdenen og underverdenen. + + Musikkplate – "strad" - - Når dette er aktivert, dukker det opp en kiste med noen nyttige gjenstander i nærheten av spillernes returneringspunkt. + + Musikkplate – "chirp" - - Skallpakker + + Musikkplate – "far" - - Temaer + + Musikkplate – "mall" - - Spillerbilder + + Kake - - Avatarelementer + + Grått fargestoff - - Teksturpakker + + Rosa fargestoff - - Flettepakker + + Limegrønt fargestoff - - {*PLAYER*} gikk opp i flammer. + + Lilla fargestoff - - {*PLAYER*} brant i hjel. + + Turkis fargestoff - - {*PLAYER*} prøvde å svømme i lava. + + Lysegrått fargestoff - - {*PLAYER*} ble kvalt i en vegg. + + Løvetanngul - - {*PLAYER*} druknet. + + Beinmel - - {*PLAYER*} sultet i hjel. + + Bein - - {*PLAYER*} ble spiddet til døde. + + Sukker - - {*PLAYER*} traff bakken med for mye kraft. + + Lyseblått fargestoff - - {*PLAYER*} falt ut av verdenen. + + Magenta fargestoff - - {*PLAYER*} døde. + + Oransje fargestoff - - {*PLAYER*} ble sprengt i filler. + + Skilt - - {*PLAYER*} ble drept av magi. + + Skinnkjortel - - {*PLAYER*} ble drept av enderdragens ånde. + + Brystplate av jern - - {*PLAYER*} ble drept av {*SOURCE*}. + + Diamantbrystplate - - {*PLAYER*} ble drept av {*SOURCE*}. + + Jernhjelm - - {*PLAYER*} ble skutt av {*SOURCE*}. + + Diamanthjelm - - {*PLAYER*} ble tatt av {*SOURCE*} sin ildkule. + + Gullhjelm - - {*PLAYER*} ble dengt av {*SOURCE*}. + + Brystplate av gull - - {*PLAYER*} ble drept av {*SOURCE*}. + + Bukser av gull - - Grunnfjelltåke + + Skinnstøvler - - Vis HUD + + Jernstøvler - - Vis hånd + + Skinnbukser - - Dødsmeldinger + + Bukser av jern - - Animert karakter + + Bukser av diamant - - Spesialanimasjon for skall + + Skinnhatt - - Du kan ikke lenger utvinne fra eller bruke gjenstander. + + Steinkrafse - - Du kan nå utvinne fra eller bruke gjenstander. + + Jernkrafse - - Du kan ikke lenger utplassere blokker. + + Diamantkrafse - - Du kan nå utplassere blokker. + + Diamantøks - - Du kan nå bruke dører og brytere. + + Gulløks - - Du kan ikke bruke dører og brytere lenger. + + Trekrafse - - Du kan nå bruke beholdere (f.eks. kister). + + Gullkrafse - - Du kan ikke bruke beholdere (f.eks. kister) lenger. + + Brynjebrystplate - - Du kan ikke angripe vesener lenger. + + Brynjebukser - - Du kan nå angripe vesener. + + Brynjestøvler - - Du kan ikke angripe spillere lenger. + + Tredør - - Du kan nå angripe spillere. + + Jerndør - - Du kan ikke angripe dyr lenger. + + Brynjehjelm - - Du kan nå angripe dyr. + + Diamantstøvler - - Du er nå moderator. + + Fjær - - Du er ikke moderator lenger. + + Krutt - - Du kan nå fly. + + Hvetefrø - - Du kan ikke fly lenger. + + Bolle - - Du kan ikke bli utmattet lenger. + + Soppstuing - - Du kan nå bli utmattet. + + Hyssing - - Du er nå usynlig. + + Hvete - - Du er ikke usynlig lenger. + + Tilberedt kotelett - - Du er nå usårbar. + + Maleri - - Du er ikke usårbar lenger. + + Gulleple - - %d MSP + + Brød - - Enderdragen + + Flint - - %s har entret Slutten. + + Rå kotelett - - %s har forlatt Slutten. + + Pinne - - -{*C3*}Jeg ser spilleren du mener.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Ja. Vær forsiktig, for den har nådd et høyere nivå nå. Den kan lese tankene våre.{*EF*}{*B*}{*B*} -{*C2*}Det gjør ikke noe. Den tror vi er med på spillet.{*EF*}{*B*}{*B*} -{*C3*}Jeg liker denne spilleren. Spiller godt, og gir aldri opp.{*EF*}{*B*}{*B*} -{*C2*}Den leser tankene våre som om de var ord på en skjerm.{*EF*}{*B*}{*B*} -{*C3*}Det er sånn den forestiller seg ting, når den er dypt inne i drømme- og spillverdenen.{*EF*}{*B*}{*B*} -{*C2*}Ord utgjør et deilig grensesnitt. Meget fleksibelt. Og ikke så skremmende som å stirre rett på virkeligheten bak skjermen.{*EF*}{*B*}{*B*} -{*C3*}Før spillere kunne lese, hørte de stemmer. Det var på den tiden de som ikke spilte, kalte spillere for hekser og trollmenn. Og spillerne drømte at de fløy i luften, på kjepper drevet av demoner.{*EF*}{*B*}{*B*} -{*C2*}Hva er det denne spilleren drømte?{*EF*}{*B*}{*B*} -{*C3*}Denne spilleren drømte om sol og trær, ild og vann. Den drømte at den skapte – og deretter ødela igjen. Den drømte at den jaktet – og ble jaktet på. Den drømte om ly.{*EF*}{*B*}{*B*} -{*C2*}Ha, det originale grensesnittet. En million år gammelt, og det virker fremdeles. Men hva skapte denne spilleren egentlig, i virkeligheten bak skjermen?{*EF*}{*B*}{*B*} -{*C3*}Den samarbeidet med en million andre om å bygge en ekte verden i en fold av {*EF*}{*NOISE*}{*C3*}, og skapte en {*EF*}{*NOISE*}{*C3*} for {*EF*}{*NOISE*}{*C3*}, i {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} -{*C2*}Den kan ikke lese den tanken.{*EF*}{*B*}{*B*} -{*C3*}Nei, den har ikke nådd det høyeste nivået ennå. Det må den nå i den lange livsdrømmen, ikke i den korte spilldrømmen.{*EF*}{*B*}{*B*} -{*C2*}Vet den at vi er glad i den? At universet er snilt?{*EF*}{*B*}{*B*} -{*C3*}Noen ganger, gjennom sine støyende tanker, klarer den å høre universet, ja.{*EF*}{*B*}{*B*} -{*C2*}Men andre ganger er den trist, i sin lange drøm. Den skaper verdener uten somre, og den skjelver under en svart sol, og til slutt ser den på sin triste skapelse som virkeligheten.{*EF*}{*B*}{*B*} -{*C3*}Men å kurere den for sorgen ville ødelegge den. Sorgen er en del av drivkraften dens. Vi kan ikke blande oss inn i det.{*EF*}{*B*}{*B*} -{*C2*}Noen ganger når de er dypt inne i drømmeland, får jeg lyst til å fortelle dem at de bygger ekte og virkelige verdener. Noen ganger får jeg lyst til å fortelle dem om hvor viktige de er for universet. Og noen ganger, når de ikke har oppnådd en reell forbindelse på en stund, vil jeg hjelpe dem med å si det de frykter.{*EF*}{*B*}{*B*} -{*C3*}Den leser tankene våre.{*EF*}{*B*}{*B*} -{*C2*}Men noen ganger bryr jeg meg ikke. Noen ganger vil jeg fortelle dem at denne verdenen de ser på som sann, ikke er annet enn {*EF*}{*NOISE*}{*C2*} og {*EF*}{*NOISE*}{*C2*}. Jeg vil fortelle dem at de er {*EF*}{*NOISE*}{*C2*} i {*EF*}{*NOISE*}{*C2*}. De ser så lite av virkeligheten i sin lange drøm.{*EF*}{*B*}{*B*} -{*C3*}Likevel spiller de spillet.{*EF*}{*B*}{*B*} -{*C2*}Men det hadde vært så enkelt å fortelle dem ...{*EF*}{*B*}{*B*} -{*C3*}For sterkt for denne drømmen. Å fortelle dem hvordan de skal leve, er å nekte dem livet.{*EF*}{*B*}{*B*} -{*C2*}Jeg vil ikke fortelle spilleren hvordan den skal leve.{*EF*}{*B*}{*B*} -{*C3*}Spilleren er i ferd med å bli rastløs.{*EF*}{*B*}{*B*} -{*C2*}Jeg skal fortelle spilleren en historie.{*EF*}{*B*}{*B*} -{*C3*}Men ikke sannheten.{*EF*}{*B*}{*B*} -{*C2*}Nei. En historie med en trygg versjon av sannheten, i et bur av ord. Ikke den nakne sannheten som kan svi av store områder.{*EF*}{*B*}{*B*} -{*C3*}Gi den en kropp igjen.{*EF*}{*B*}{*B*} -{*C2*}Ja. Spiller ...{*EF*}{*B*}{*B*} -{*C3*}Bruk navnet dens.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Spilleren.{*EF*}{*B*}{*B*} -{*C3*}Bra.{*EF*}{*B*}{*B*} - + + Bøtte - - -{*C2*}Trekk pusten nå. Og en gang til. Kjenn luften i lungene, og la lemmene dine komme tilbake. Ja, rør på fingrene. Kjenn kroppen igjen, kjenn luften og tyngdekraften. Gjenoppstå i den lange drømmen. Sånn ja. Kroppen din berører universet igjen på hvert punkt, som om dere var separate enheter. Som om vi var separate enheter.{*EF*}{*B*}{*B*} -{*C3*}Hvem er vi? En gang i tiden ble vi kalt åndene fra fjellet. Fader sol og moder måne. Nedarvede ånder, dyreånder. Djinn. Gjenferd. Den grønne mannen. Så guder, demoner, engler, poltergeister. Utenomjordiske, kosmiske. Leptoner, kvarker. Ordene endrer seg, men det gjør ikke vi.{*EF*}{*B*}{*B*} -{*C2*}Vi er universet. Vi er alt du tror du ikke er. Du ser på oss nå, gjennom huden og gjennom øynene. Og hvorfor berører universet huden din og kaster lys på deg? For å se deg, spilleren. For å bli kjent med deg, og gjøre seg kjent. Jeg skal fortelle deg en historie.{*EF*}{*B*}{*B*} -{*C2*}Det var en gang en spiller.{*EF*}{*B*}{*B*} -{*C3*}Og den spilleren var deg, {*PLAYER*}.{*EF*}{*B*}{*B*} -{*C2*}Noen ganger så den på seg selv som et menneske, på den tynne skorpen av en snurrende klode av smeltet stein. Denne kloden av smeltet stein dreide rundt en kule av brennende gass som var 330 000 ganger mer massiv. De var så langt fra hverandre at det tok åtte minutter for lyset å nå frem. Lyset var informasjon fra en stjerne, og den kunne svi huden din fra 150 millioner kilometers avstand.{*EF*}{*B*}{*B*} -{*C2*}Noen ganger drømte spilleren at den var en gruvearbeider, i en verden som var flat og uendelig. Solen var en hvit firkant, og dagene var korte. Det var mye å gjøre, og døden var en midlertidig ubeleilighet.{*EF*}{*B*}{*B*} -{*C3*}Noen ganger drømte spilleren at den var fortapt i historien.{*EF*}{*B*}{*B*} -{*C2*}Noen ganger drømte spilleren at den var andre ting, på andre steder. Noen ganger var disse drømmene foruroligende, andre ganger vakre. Noen ganger våknet spilleren fra én drøm og forsvant inn i en annen, og deretter videre inn i en tredje.{*EF*}{*B*}{*B*} -{*C3*}Noen ganger drømte spilleren at den så på ord på en skjerm.{*EF*}{*B*}{*B*} -{*C2*}La oss gå litt tilbake i tid.{*EF*}{*B*}{*B*} -{*C2*}Spillerens atomer var spredt i gresset, i elvene, i luften og i jorden. En kvinne samlet disse atomene, hun drakk, åt og inhalerte dem, og så satte kvinnen spilleren sammen – i sin egen kropp.{*EF*}{*B*}{*B*} -{*C2*}Og spilleren våknet, fra den varme, mørke verdenen i sin mors kropp, og gikk inn i den lange drømmen.{*EF*}{*B*}{*B*} -{*C2*}Og spilleren var en ny historie, som aldri var blitt fortalt før, skrevet i DNA-ets bokstaver. Og spilleren var et nytt program, som aldri var blitt kjørt før, generert av en kildekode som var en milliard år gammel. Og spilleren var et nytt menneske, som aldri hadde levd før, laget utelukkende av melk og kjærlighet.{*EF*}{*B*}{*B*} -{*C3*}Du er spilleren, historien, programmet, og mennesket. Laget utelukkende av melk og kjærlighet.{*EF*}{*B*}{*B*} -{*C2*}La oss gå lenger tilbake i tid.{*EF*}{*B*}{*B*} -{*C2*}De syv milliarder milliarder milliarder atomene i spillerens kropp ble skapt i hjertet av en stjerne, lenge før dette spillet. Så også spilleren er informasjon fra en stjerne. Og spilleren beveger seg gjennom en historie, som er en skog av informasjon plantet av en mann kalt Julian, i en flat, uendelig verden skapt av en mann kalt Markus, som eksisterer i en liten, privat verden skapt av spilleren, som bor i et univers skapt av ...{*EF*}{*B*}{*B*} -{*C3*}Hysj nå. Noen ganger skapte spilleren en liten, privat verden som var myk og varm og enkel. Andre ganger var den hard og kald og komplisert. I blant bygget spilleren en modell av universet i hodet, flekker av energi som beveget seg frem gjennom store, tomme rom. I blant kalte den disse flekkene for "elektroner" og "protoner".{*EF*}{*B*}{*B*} - + + Vannbøtte - - -{*C2*}Noen ganger kalte den dem "planeter" og "stjerner".{*EF*}{*B*}{*B*} -{*C2*}Noen ganger trodde den at den var i et univers laget av positiv og negativ energi, laget av nuller og enere og kodelinjer. Noen ganger trodde den at den spilte et spill. Og noen ganger trodde den at den leste ord på en skjerm.{*EF*}{*B*}{*B*} -{*C3*}Du er spilleren – som leser ordene ...{*EF*}{*B*}{*B*} -{*C2*}Hysj nå ... Noen ganger leste spilleren kodelinjer på en skjerm. Dechiffrerte dem til ord, dechiffrerte ord til betydning, dechiffrerte betydning til følelser, teorier og ideer, og da begynte spilleren å puste fortere og dypere og innså at den levde. Spilleren levde, og de tusenvis av dødsfallene hadde ikke vært ekte. Spilleren levde.{*EF*}{*B*}{*B*} -{*C3*}Du. Du. Du lever.{*EF*}{*B*}{*B*} -{*C2*}Og noen ganger trodde spilleren at universet hadde snakket til den via sollyset som kom gjennom bladene på sommertrærne.{*EF*}{*B*}{*B*} -{*C3*}Og noen ganger trodde spilleren at universet hadde snakket til den via lyset fra en klar vinternatthimmel, der en lysflekk i øyekroken kan være en stjerne en million ganger mer massiv enn solen, som koker sine planeter til plasma for å kunne synes et øyeblikk for spilleren, som var på vei hjem på den andre siden av universet og plutselig kjente duften av mat, nesten fremme ved døren, slik at den kunne drømme igjen.{*EF*}{*B*}{*B*} -{*C2*}Og noen ganger trodde spilleren at universet hadde snakket til den via nuller og enere, via elektrisiteten i verden, via ordene som ruller over en skjerm på slutten av en drøm.{*EF*}{*B*}{*B*} -{*C3*}Og universet sa "jeg elsker deg".{*EF*}{*B*}{*B*} -{*C2*}Og universet sa "du har spilt godt".{*EF*}{*B*}{*B*} -{*C3*}Og universet sa "alt du trenger, har du i deg".{*EF*}{*B*}{*B*} -{*C2*}Og universet sa "du er sterkere enn du tror".{*EF*}{*B*}{*B*} -{*C3*}Og universet sa "du er dagslyset".{*EF*}{*B*}{*B*} -{*C2*}Og universet sa "du er natten".{*EF*}{*B*}{*B*} -{*C3*}Og universet sa "mørket du kjemper mot, er i deg".{*EF*}{*B*}{*B*} -{*C2*}Og universet sa "lyset du søker, er i deg".{*EF*}{*B*}{*B*} -{*C3*}Og universet sa "du er ikke alene".{*EF*}{*B*}{*B*} -{*C2*}Og universet sa "du er ikke adskilt fra alle andre ting".{*EF*}{*B*}{*B*} -{*C3*}Og universet sa "du er universet som smaker på seg selv, snakker med seg selv og leser sin egen kode".{*EF*}{*B*}{*B*} -{*C2*}Og universet sa "jeg elsker deg fordi du er kjærligheten".{*EF*}{*B*}{*B*} -{*C3*}Så var spillet over, og spilleren våknet fra drømmen. Og spilleren begynte en ny drøm. Og spilleren drømte igjen, drømte bedre. Og spilleren var universet. Og spilleren var kjærligheten.{*EF*}{*B*}{*B*} -{*C3*}Du er spilleren.{*EF*}{*B*}{*B*} -{*C2*}Våkn opp.{*EF*} - + + Lavabøtte - - Tilbakestille underverdenen + + Gullstøvler - - Er du sikker på at du vil tilbakestille underverdenen i denne lagringen til standardinnstillinger? Du vil miste alt du har bygget i underverdenen! + + Jernbarre - - Tilbakestill underverdenen + + Gullbarre - - Ikke tilbakestill underverdenen + + Tennstål - - Kan ikke klippe denne soppkua. Det maksimale antallet griser, sauer, kuer og katter er nådd. + + Kull - - Kan ikke bruke yngleegg. Det maksimale antallet griser, sauer, kuer og katter er nådd. + + Trekull - - Kan ikke bruke yngleegg. Det maksimale antallet soppkuer er nådd. + + Diamant - - Kan ikke bruke yngleegg. Det maksimale antallet ulver i en verden er nådd. + + Eple - - Kan ikke bruke yngleegg. Det maksimale antallet høner i en verden er nådd. + + Bue - - Kan ikke bruke yngleegg. Det maksimale antallet blekkspruter i en verden er nådd. + + Pil - - Kan ikke bruke yngleegg. Det maksimale antallet fiender i en verden er nådd. + + Musikkplate – "ward" - - Kan ikke bruke yngleegg. Det maksimale antallet landsbyboere i en verden er nådd. + + + Trykk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å endre gruppen av gjenstander du vil utforme. Velg Byggverk-gruppen.{*ToolsIcon*} + - - Det maksimale antallet malerier/gjenstandsrammer i en verden er nådd. + + + Trykk på {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å endre gruppen av gjenstander du vil utforme. Velg Verktøy-gruppen.{*ToolsIcon*} + - - Du kan ikke yngle fiender i Fredelig modus. + + + Nå har du bygget et uformingsbord, og du må deretter plassere det ut i verdenen slik at du kan utforme et bredere utvalg av gjenstander.{*B*} + Trykk på {*CONTROLLER_VK_B*} nå for å gå ut av utformingsgrensesnittet. + - - Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende griser, sauer, kuer og katter er nådd. + + + Med verktøyene du har laget, har du fått en god start – ved hjelp av dem kan du samle inn en rekke ulike materialer på en mer effektiv måte.{*B*} + Trykk på {*CONTROLLER_VK_B*} for å gå ut av utformingsgrensesnittet. + - - Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende ulver er nådd. + + Utforming kan gå over en rekke trinn. Nå som du har noen planker, er det flere ting du kan lage. Bruk {*CONTROLLER_MENU_NAVIGATE*} for å endre hvilken gjenstand du vil utforme. Velg utformingsbordet.{*CraftingTableIcon*} - - Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende høner er nådd. + + + Bruk {*CONTROLLER_MENU_NAVIGATE*} for å endre hvilken gjenstand du vil utforme. Noen gjenstander har flere versjoner avhengig av hvilket materiale som brukes. Velg trespaden.{*WoodenShovelIcon*} + - - Dette dyret kan ikke gå inn i elskovsmodus. Det maksimale antallet avlende soppkuer er nådd. + + Trevirket du har samlet inn, kan utformes til planker. Velg plankeikonet og trykk på {*CONTROLLER_VK_A*} for å gjøre dette.{*PlanksIcon*} - - Det maksimale antallet båter i en verden er nådd. + + + Du kan utforme flere gjenstander hvis du har et utformingsbord. Utforming ved hjelp av et utformingsbord fungerer i bunn og grunn likt som vanlig utforming, men du har et større utformingsområde og et bredere utvalg av gjenstander. + - - Det maksimale antallet vesenhoder i en verden er nådd. + + I utformingsområdet ser du hva som kreves for å lage den nye gjenstanden. Trykk på {*CONTROLLER_VK_A*} for å lage den nye gjenstanden og plassere den i inventaret. + - - Inverter visning + + Bla gjennom Gruppe-fanene på toppen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å velge gruppen gjenstanden du vil lage, hører til. Deretter bruker du {*CONTROLLER_MENU_NAVIGATE*} for å velge ønsket gjenstand. + - - Keivhendt + + + Du får så se en liste over hvilke ingredienser som kreves for å lage den valgte gjenstanden. + - - Du døde! + + + Nå ser du en beskrivelse av den valgte gjenstanden. Beskrivelsen kan gi deg en pekepinn på hva gjenstanden kan brukes til. + - - Gjenoppstå + + + Nederst til høyre i utformingsgrensesnittet ser du inventaret ditt. Her kan du også få beskrivelser av de ulike gjenstandene samt hvilke ingredienser som kreves for å lage dem. + - - Tilbud på nedlastbart innhold + + + Visse gjenstander kan ikke lages med utformingsbordet, men krever en smelteovn. Lag en smelteovn nå.{*FurnaceIcon*} + - - Bytt skall + + Grus - - Slik spiller du + + Gullmalm - - Kontroller + + Jernmalm - - Innstillinger + + Lava - - Medvirkende + + Sand - - Installer innhold på nytt + + Sandstein - - Innstillinger for feilretting + + Kullmalm - - Spredning av ild + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker en smelteovn. + - - TNT-eksplosjon + + + Dette er smelteovngrensesnittet. Med en smelteovn kan du omskape gjenstander. Du kan for eksempel gjøre jernmalm om til jernbarrer. + - - Spiller mot spiller + + + Plasser så smelteovnen ute i verdenen. Det er lurt å ha den i tilfluktsstedet ditt.{*B*} + Trykk på {*CONTROLLER_VK_B*} for å gå ut av utformingsgrensesnittet. + - - Stol på spillere + + Tre - - Vertsrettigheter + + Eiketre - - Generer byggverk + + Du må plassere litt brensel i bunnen av smelteovnen, og deretter legger du gjenstanden du skal behandle, i toppen. Smelteovnen vil så sette i gang, og det ferdige produktet vil dukke opp på plassen til høyre. + - - Superflat verden + + {*B*} + Trykk på {*CONTROLLER_VK_X*} for å vise inventaret igjen. + - - Bonuskiste + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker inventaret. + - - Verdensinnstillinger + + Dette er inventaret ditt. Her ser du alle gjenstander og verktøy du kan ta i hånden, samt andre ting du har med deg. Rustningen din ser du også her. + - - Kan bygge og utvinne + + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette med opplæringen.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du føler du er klar til å spille på egen hånd. + - - Kan bruke dører og brytere + + Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden. + - - Kan åpne beholdere + + Flytt gjenstanden ved hjelp av pekeren til en annen plass i inventaret, og bruk {*CONTROLLER_VK_A*} for å plassere den der. + Har du flere gjenstander på pekeren, kan du bruke {*CONTROLLER_VK_A*} for å plassere alle sammen eller {*CONTROLLER_VK_X*} for å plassere en av dem. - - Kan angripe spillere + + Bruk {*CONTROLLER_MENU_NAVIGATE*} for å flytte pekeren. Bruk {*CONTROLLER_VK_A*} for å plukke opp en gjenstand under pekeren. + Dersom det er flere enn én gjenstand her, plukker du opp alle, eller du kan bruke {*CONTROLLER_VK_X*} for bare å plukke opp halvparten. + - - Kan angripe dyr + + + Du har fullført første del av opplæringen. + - - Moderator + + Bruk smelteovnen til å lage litt glass. Og mens du venter på at det skal bli ferdig, kan du bruke tiden til å samle flere materialer som du kan bruke til å fullføre skuret. - - Spark ut spiller + + Bruk smelteovnen til å lage litt trekull. Og mens du venter på at den skal bli ferdig, kan du bruke tiden til å samle flere materialer som du kan bruke til å fullføre skuret. - - Kan fly + + Bruk {*CONTROLLER_ACTION_USE*} for å plassere smelteovnen i verdenen, og så kan du åpne den. - - Deaktiver utmattelse + + Det kan bli svært mørkt på natten, så det kan være kjekt med litt lys i tilfluktsstedet. Lag en fakkel via utformingsgrensesnittet ved hjelp av pinner og trekull.{*TorchIcon*} - - Usynlig + + Bruk {*CONTROLLER_ACTION_USE*} for å plassere døren. Du kan bruke {*CONTROLLER_ACTION_USE*} for å åpne og lukke tredører i verdenen. - - Vertsalternativer + + Et godt tilfluktssted har en dør slik at du kan gå ut og inn uten å måtte grave deg ut og erstatte veggene. Lag en tredør nå.{*WoodenDoorIcon*} - - Spillere/invitasjon + + + Hvis du vil ha mer informasjon om en gjenstand, beveger du pekeren over den og trykker på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Onlinespill + + +Dette er utformingsgrensesnittet. Her kan du sette sammen gjenstandene du har samlet, og lage nye gjenstander. + - - Kun inviterte + + Trykk på {*CONTROLLER_VK_B*} nå for å gå ut av inventaret for kreativ modus. + - - Flere alternativer + + + Hvis du vil ha mer informasjon om en gjenstand, beveger du pekeren over den og trykker på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Last inn + + {*B*} + Trykk på {*CONTROLLER_VK_X*} for å se hvilke ingredienser som kreves for å lage den aktuelle gjenstanden. + - - Ny verden + + {*B*} + Trykk på {*CONTROLLER_VK_X*} for å se en beskrivelse av gjenstanden. + - - Navn på verden + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du utformer ting. + - - Seed for verdensgenerator + + Bla gjennom Gruppe-fanene på toppen med {*CONTROLLER_VK_LB*} og {*CONTROLLER_VK_RB*} for å velge gruppen som gjenstanden du vil plukke opp, hører til. - - La være blank for tilfeldig seed. + + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å fortsette.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker inventaret i kreativ modus. + - - Spillere + + + Dette er inventaret for kreativ modus. Her finner du gjenstander du kan ta i hånden, og andre ting du kan velge. + - - Bli med i spill + + + Trykk nå på {*CONTROLLER_VK_B*} for å gå ut av inventaret. + - - Start spill + + Hvis du beveger pekeren utenfor grensesnittet med en gjenstand festet til den, kan du slippe denne gjenstanden i verdenen. For å fjerne alle gjenstander fra hurtiglinjen trykker du på {*CONTROLLER_VK_X*}. + - - Fant ingen spill + + +Pekeren vil automatisk flytte seg til en ledig plass i bruksraden. Du kan sette den ned med {*CONTROLLER_VK_A*}. Når du har plassert gjenstanden, går pekeren tilbake til gjenstandslisten hvor du kan velge en ny gjenstand. + - - Spill + + Bruk {*CONTROLLER_MENU_NAVIGATE*} for å flytte pekeren. + Bruk {*CONTROLLER_VK_A*} for å plukke opp en gjenstand under pekeren i gjenstandslisten, og bruk deretter {*CONTROLLER_VK_Y*} for å plukke opp en hel stabel av denne gjenstanden. + - - Poengtavler + + Vann - - Hjelp og alternativer + + Glassflaske - - Lås opp fullversjon + + Vannflaske + + + Edderkoppøye - - Fortsett spill + + Gullklump - - Lagre spill + + Underverdenvorte - - Vanskelighetsgrad: + + {*splash*}{*prefix*}eliksir {*postfix*} - - Spilltype + + Gjæret edderkoppøye - - Byggverk: + + Gryte - - Nivåtype: + + Enderøye - - PvP: + + Strålende melon - - Stol på spillere: + + Blusspulver - - TNT: + + Magmakrem - - Spredning av ild: + + Bryggeapparat - - Installer tema på nytt + + Geisttåre - - Installer spillerbilde 1 på nytt + + Gresskarfrø - - Installer spillerbilde 2 på nytt + + Melonfrø - - Installer avatarelement 1 på nytt + + Rå kylling - - Installer avatarelement 2 på nytt + + Musikkplate – "11" - - Installer avatarelement 3 på nytt + + Musikkplate – "where are we now" - - Alternativer + + Sauesaks - - Lyd + + Tilberedt kylling - - Følsomhet + + Enderperle - - Grafikk + + Melonskive - - Brukergrensesnitt + + Blusstav - - Tilbakestill til standarder + + Rått kjøtt - - Vis gå-animasjon + + Biff - - Hint + + Råttent kjøtt - - Verktøytips i spillet + + Flaske med fortryllelse - - Vertikalt delt skjerm (for 2) + + Planker av eik - - Ferdig + + Planker av gran - - Rediger skiltmelding: + + Planker av bjørk - - Fyll inn detaljene som skal følge med skjermbildet ditt. + + Gressblokk - - Bildetekst + + Jord - - Skjermbilde fra spillet + + Brostein - - Rediger skiltmelding: + + Planker av jungeltre - - De(t) klassiske Minecraft-teksturene, -ikonene og -brukergrensesnittet! + + Ungbjørk - - Vis alle fletteverdener + + Ungt jungeltre - - Ingen effekter + + Grunnfjell - - Hurtighet + + Ungtre - - Treghet + + Ungeik - - Hastverk + + Unggran - - Utmattethet + + Stein - - Styrke + + Gjenstandsramme - - Svakhet + + Yngler {*CREATURE*} - - Øyeblikkelig helse + + Underverdenstein - - Øyeblikkelig skade + + Ildladning - - Hoppstyrke + + Ildladning (trekull) - - Kvalme + + Ildladning (kull) - - Regenerasjon + + Hodeskalle - - Motstand + + Hode - - Ildmotstand + + %s sitt hode - - Pusting i vann + + Smygerhode - - Usynlighet + + Skjelettskalle - - Blindhet + + Vissenskjelettskalle - - Nattsyn + + Zombiehode - - Sult + + En kompakt måte å lagre kull på. Kan brukes som brensel i smelteovner. Gift - - for hurtighet + + Sult for treghet - - for hastverk + + for hurtighet - - for utmattethet + + Usynlighet - - for styrke + + Pusting i vann - - for svakhet + + Nattsyn - - for helbredelse + + Blindhet for skade - - for hopping + + for helbredelse for kvalme @@ -5199,29 +6023,38 @@ Vil du installere flettepakken eller teksturpakken nå? for regenerasjon - - for motstand + + for utmattethet - - for ildmotstand + + for hastverk + + + for svakhet + + + for styrke + + + Ildmotstand - - for pusting i vann + + Metning - - for usynlighet + + for motstand - - for blindhet + + for hopping - - for nattsyn + + Wither - - for sult + + Helseboost - - for gift + + Absorbering @@ -5232,29 +6065,41 @@ Vil du installere flettepakken eller teksturpakken nå? III + + for usynlighet + IV - - Sprutende + + for pusting i vann - - Verdslig + + for ildmotstand - - Uinteressant + + for nattsyn - - Smakløs + + for gift - - Klar + + for sult - - Melkaktig + + for absorbering - - Uklar + + for metning + + + for helseboost + + + for blindhet + + + for forfall Naturlig @@ -5262,17 +6107,17 @@ Vil du installere flettepakken eller teksturpakken nå? Tynn - - Rar + + Uklar - - Flat + + Klar - - Klumpete + + Melkaktig - - Klønete + + Rar Smøraktig @@ -5280,246 +6125,300 @@ Vil du installere flettepakken eller teksturpakken nå? Jevn - - Glatt + + Klønete - - Sofistikert + + Flat - - Tykk + + Klumpete - - Elegant + + Smakløs - - Fornem + + Sprutende - - Sjarmerende + + Verdslig + + + Uinteressant Flott - - Raffinert - Saftig + + Sjarmerende + + + Elegant + + + Fornem + Sprudlende + + Stram + + + Frastøtende + + + Luktfri + Kraftig Motbydelig - - Luktfri + + Glatt - - Stram + + Raffinert - - Frastøtende + + Tykk - - Besk + + Sofistikert - - Ekkel + + Gjenoppretter helsen til berørte spillere, dyr og monstre over tid. - - Illeluktende + + Reduserer helsen til berørte spillere, dyr og monstre umiddelbart. - - Basisen for alle eliksirer. Brukes i et bryggeapparat for å lage eliksirer. + + Gjør berørte spillere, dyr og monstre immune mot ild, lava og blussangrep fra langt hold. Har ingen virkning. Kan brukes i et bryggeapparat for å lage eliksirer ved å legge til flere ingredienser. - - Øker bevegelseshastigheten til berørte spillere, dyr og monstre, samt spurtehastigheten, hoppelengden og visningsfeltet til berørte spillere. + + Besk Reduserer bevegelseshastigheten til berørte spillere, dyr og monstre, samt spurtehastigheten, hoppelengden og visningsfeltet til berørte spillere. + + Øker bevegelseshastigheten til berørte spillere, dyr og monstre, samt spurtehastigheten, hoppelengden og visningsfeltet til berørte spillere. + Øker skaden berørte spillere, dyr og monstre påfører når de angriper. + + Øker helsen til berørte spillere, dyr og monstre umiddelbart. + Reduserer skaden berørte spillere, dyr og monstre påfører når de angriper. - - Øker helsen til berørte spillere, dyr og monstre umiddelbart. + + Basisen for alle eliksirer. Brukes i et bryggeapparat for å lage eliksirer. - - Reduserer helsen til berørte spillere, dyr og monstre umiddelbart. + + Ekkel - - Gjenoppretter helsen til berørte spillere, dyr og monstre over tid. + + Illeluktende - - Gjør berørte spillere, dyr og monstre immune mot ild, lava og blussangrep fra langt hold. + + Utdrivelse + + + Skarphet Reduserer helsen til berørte spillere, dyr og monstre over tid. - - Skarphet + + Angrepsskade - - Utdrivelse + + Tilbakeslag Leddyrets skrekk - - Tilbakeslag + + Hastighet - - Ild + + Zombie-forsterkninger - - Beskyttelse + + Hestens hoppestyrke + + + Når dette brukes: + + + Tilbakeslagmotstand + + + Vesenrekkevidde + + + Maksimal helse + + + Silkeberøring + + + Effektivitet + + + Vannmann + + + Hell + + + Plyndring + + + Uknuselig Brannbeskyttelse + + Beskyttelse + + + Ild + Fjærfall - - Eksplosjonsbeskyttelse + + Respirasjon Prosjektilbeskyttelse - - Respirasjon - - - Vannmann + + Eksplosjonsbeskyttelse - - Effektivitet + + IV - - Silkeberøring + + V - - Uknuselig + + VI - - Plyndring + + Tilbakeslag - - Hell + + VII - - Kraft + + III Flamme - - Tilbakeslag + + Kraft Uendelig - - I - - - II - - - III + + II - - IV + + I - - V + + Aktiveres når noen går gjennom en tilkoblet snubletråd. - - VI + + Aktiverer en tilkoblet snubletrådkrok når noen passerer gjennom. - - VII + + En kompakt måte å lagre smaragder på. - - VIII + + Likner på en vanlig kiste, bortsett fra at ting som plasseres i en enderkiste er tilgjengelig i alle spillerens enderkister, selv i forskjellige dimensjoner. IX - - X + + VIII Kan utvinnes med en hakke eller bedre for å skaffe smaragder. - - Likner på en vanlig kiste, bortsett fra at ting som plasseres i en enderkiste er tilgjengelig i alle spillerens enderkister, selv i forskjellige dimensjoner. - - - Aktiveres når noen går gjennom en tilkoblet snubletråd. + + X - - Aktiverer en tilkoblet snubletrådkrok når noen passerer gjennom. + + Gir deg 2 {*ICON_SHANK_01*} og kan brukes til å lage en gullrot. Kan plantes i dyrkbar jord. - - En kompakt måte å lagre smaragder på. + + Brukes som dekorasjon. Blomster, små trær, kaktuser og sopp kan plantes i den. En mur laget av brostein. - - Kan brukes til å reparere våpen, verktøy og rustninger. + + Gir deg 0,5 {*ICON_SHANK_01*} eller kan tilberedes i en smelteovn. Kan plantes i dyrkbar jord. Smeltet i en smelteovn for å produsere underkvarts. - - Brukes som dekorasjon. + + Kan brukes til å reparere våpen, verktøy og rustninger. Kan byttes med landsbyboere. - - Brukes som dekorasjon. Blomster, små trær, kaktuser og sopp kan plantes i den. + + Brukes som dekorasjon. - - Gir deg 2 {*ICON_SHANK_01*} og kan brukes til å lage en gullrot. Kan plantes i dyrkbar jord. + + Gir deg 4 {*ICON_SHANK_01*}. - - Gir deg 0,5 {*ICON_SHANK_01*} eller kan tilberedes i en smelteovn. Kan plantes i dyrkbar jord. + + Gir deg 1 {*ICON_SHANK_01*}. Å spise dette kan gi deg matforgiftning. + + + Brukes til å kontrollere en gris med sal når du rir på den. Gir deg 3 {*ICON_SHANK_01*}. Lages ved å tilberede en potet i en smelteovn. - - Gir deg 1 {*ICON_SHANK_01*} eller kan tilberedes i en smelteovn. Kan plantes i dyrkbar jord. Kan føre til matforgiftning. - Gir deg 3 {*ICON_SHANK_01*}. Lages av en gulrot og gullklumper. - - Brukes til å kontrollere en gris med sal når du rir på den. - - - Gir deg 4 {*ICON_SHANK_01*}. - Brukes med en ambolt for å fortrylle våpen, verktøy eller rustninger. Laget ved å utvinne underkvartsmalm. Kan brukes til å lage en kvartsblokk. + + Potet + + + Bakt potet + + + Gulrot + Laget av ull. Brukes som dekorasjon. @@ -5529,14 +6428,11 @@ Vil du installere flettepakken eller teksturpakken nå? Blomsterpotte - - Gulrot - - - Potet + + Gresskarpai - - Bakt potet + + Fortryllet bok Giftig potet @@ -5547,11 +6443,11 @@ Vil du installere flettepakken eller teksturpakken nå? Gulrot på pinne - - Gresskarpai + + Snubletrådkrok - - Fortryllet bok + + Snubletråd Underkvarts @@ -5562,11 +6458,8 @@ Vil du installere flettepakken eller teksturpakken nå? Enderkiste - - Snubletrådkrok - - - Snubletråd + + Brosteinmur med mose Smaragdblokk @@ -5574,8 +6467,8 @@ Vil du installere flettepakken eller teksturpakken nå? Brosteinmur - - Brosteinmur med mose + + Poteter Blomsterpotte @@ -5583,8 +6476,8 @@ Vil du installere flettepakken eller teksturpakken nå? Gulrøtter - - Poteter + + Litt skadet ambolt Ambolt @@ -5592,8 +6485,8 @@ Vil du installere flettepakken eller teksturpakken nå? Ambolt - - Litt skadet ambolt + + Kvartsblokk Meget skadet ambolt @@ -5601,8 +6494,8 @@ Vil du installere flettepakken eller teksturpakken nå? Underkvartsmalm - - Kvartsblokk + + Kvartstrapp Meislet kvartsblokk @@ -5610,8 +6503,8 @@ Vil du installere flettepakken eller teksturpakken nå? Søyle av underkvarts - - Kvartstrapp + + Rødt teppe Teppe @@ -5619,8 +6512,8 @@ Vil du installere flettepakken eller teksturpakken nå? Svart teppe - - Rødt teppe + + Blått teppe Grønt teppe @@ -5628,9 +6521,6 @@ Vil du installere flettepakken eller teksturpakken nå? Brunt teppe - - Blått teppe - Lilla teppe @@ -5643,18 +6533,18 @@ Vil du installere flettepakken eller teksturpakken nå? Grått teppe - - Rosa teppe - Limefarget teppe - - Gult teppe + + Rosa teppe Lyseblått teppe + + Gult teppe + Magentafarget teppe @@ -5667,89 +6557,84 @@ Vil du installere flettepakken eller teksturpakken nå? Meislet sandstein - - Jevn sandstein - {*PLAYER*} ble drept under forsøket på å skade {*SOURCE*} + + Jevn sandstein + {*PLAYER*} ble most av en ambolt som falt. {*PLAYER*} ble most av en blokk som falt. - - Teleporterte {*PLAYER*} til {*DESTINATION*} - {*PLAYER*} teleporterte deg til sin posisjon - - {*PLAYER*} teleporterte seg til deg + + Teleporterte {*PLAYER*} til {*DESTINATION*} Torner - - Kvartshelle + + {*PLAYER*} teleporterte seg til deg Danner mørke områder som om de var i dagslys, selv under vann. + + Kvartshelle + Gjør spillere, dyr og monstre usynlige. Reparasjon og navn - - Fortryllingskostnad: %d - For dyrt! - - Gi nytt navn + + Fortryllingskostnad: %d Du har: - - Påkrevd for handel + + Gi nytt navn {*VILLAGER_TYPE*} tilbyr %s - - Reparer + + Påkrevd for handel Bytt - - Farge + + Reparer Dette er amboltgrensesnittet. Det kan brukes til å gi nytt navn, reparere og forbedre våpen, rustninger og verktøy ved å bruke erfaringsnivå. - - - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å få vite mer om amboltgrensesnittet.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker amboltgrensesnittet. - + + Farge Hvis du vil begynne å jobbe med noe, må du plassere det på det første inngangsfeltet. - + - Når de riktige råmaterialene plasseres på det andre inngangsfeltet (for eksempel jernbarrer for et skadd jernsverd), vises foreslått reparasjon i utgangsfeltet. + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få vite mer om amboltgrensesnittet.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker amboltgrensesnittet. @@ -5757,9 +6642,9 @@ Vil du installere flettepakken eller teksturpakken nå? Alternativt kan du plassere en identisk gjenstand i det andre feltet for å kombinere de to gjenstandene. - + - Hvis du vil fortrylle gjenstander på ambolten, plasserer du en fortryllet bok i det andre inngangsfeltet. + Når de riktige råmaterialene plasseres på det andre inngangsfeltet (for eksempel jernbarrer for et skadd jernsverd), vises foreslått reparasjon i utgangsfeltet. @@ -5767,9 +6652,9 @@ Vil du installere flettepakken eller teksturpakken nå? Antallet erfaringsnivåer jobben koster vises under utgangen. Hvis ikke du har tilstrekkelig antall erfaringsnivåer, kan ikke reparasjonen fullføres. - + - Det er mulig å gi nytt navn til en gjenstand ved å redigere navnet som vises i tekstboksen. + Hvis du vil fortrylle gjenstander på ambolten, plasserer du en fortryllet bok i det andre inngangsfeltet. @@ -5777,9 +6662,9 @@ Vil du installere flettepakken eller teksturpakken nå? Når du plukker opp den reparerte gjenstanden, bruker du opp begge gjenstandene som brukes av ambolten og reduserer erfaringsnivået med gitt antall. - + - I dette området er det en ambolt og en kiste som inneholder verktøy og våpen du kan jobbe med. + Det er mulig å gi nytt navn til en gjenstand ved å redigere navnet som vises i tekstboksen. @@ -5789,9 +6674,9 @@ Vil du installere flettepakken eller teksturpakken nå? Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker ambolten. - + - Ved å bruke en ambolt kan våpen og verktøy repareres for å gjenopprette holdbarheten, gi dem nytt navn eller fortrylle dem med fortryllede bøker. + I dette området er det en ambolt og en kiste som inneholder verktøy og våpen du kan jobbe med. @@ -5799,9 +6684,9 @@ Vil du installere flettepakken eller teksturpakken nå? Fortryllede bøker finner du i kister i huler. Det kan også være vanlige bøker som er fortryllet på fortryllelsesbordet. - + - Det koster erfaringsnivåer å bruke ambolten, og hver gang du bruker den, kan den bli skadet. + Ved å bruke en ambolt kan våpen og verktøy repareres for å gjenopprette holdbarheten, gi dem nytt navn eller fortrylle dem med fortryllede bøker. @@ -5809,9 +6694,9 @@ Vil du installere flettepakken eller teksturpakken nå? Typen jobb som gjøres, verdien på gjenstanden, antallet fortryllelser og hvor mye jobb som er gjort fra før påvirker kostnaden for reparasjonen. - + - Når du gir noe nytt navn, endrer du navnet for alle spillere og reduserer arbeidskostnaden på permanent basis. + Det koster erfaringsnivåer å bruke ambolten, og hver gang du bruker den, kan den bli skadet. @@ -5819,9 +6704,9 @@ Vil du installere flettepakken eller teksturpakken nå? I kisten i dette området finner du skadde hakker, råmaterialer, flasker med fortryllelse, og fortryllede bøker å eksperimentere med. - + - Dette er handelsgrensesnittet som viser handel du kan utføre med en landsbyboer. + Når du gir noe nytt navn, endrer du navnet for alle spillere og reduserer arbeidskostnaden på permanent basis. @@ -5831,9 +6716,9 @@ Vil du installere flettepakken eller teksturpakken nå? Trykk på {*CONTROLLER_VK_B*} hvis du allerede vet hvordan du bruker handelsgrensesnittet. - + - All handel landsbyboeren er villig til å gjøre for øyeblikket vises øverst. + Dette er handelsgrensesnittet som viser handel du kan utføre med en landsbyboer. @@ -5841,9 +6726,9 @@ Vil du installere flettepakken eller teksturpakken nå? Handelsalternativer vises i rødt og er utilgjengelige hvis ikke du har gjenstandene som kreves. - + - Mengden og typen gjenstander du gir til landsbyboeren vises i de to boksene til venstre. + All handel landsbyboeren er villig til å gjøre for øyeblikket vises øverst. @@ -5851,9 +6736,9 @@ Vil du installere flettepakken eller teksturpakken nå? Du kan se totalt antall som kreves for handelen i de to boksene til venstre. - + - Trykk på {*CONTROLLER_VK_A*} for å bytte gjenstandene landsbyboeren krever med gjenstanden som tilbys. + Mengden og typen gjenstander du gir til landsbyboeren vises i de to boksene til venstre. @@ -5861,11 +6746,9 @@ Vil du installere flettepakken eller teksturpakken nå? I dette området er det en landsbyboer og en kiste som inneholder papir til å kjøpe ting. - + - {*B*} - Trykk på {*CONTROLLER_VK_A*} for å få vite mer om handel.{*B*} - Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det du trenger om handel. + Trykk på {*CONTROLLER_VK_A*} for å bytte gjenstandene landsbyboeren krever med gjenstanden som tilbys. @@ -5873,14 +6756,21 @@ Vil du installere flettepakken eller teksturpakken nå? Spillere kan bytte ting de har i inventaret med landsbyboere. - + - Byttene en landsbyboer tilbyr avhenger av landsbyboerens yrke. + {*B*} + Trykk på {*CONTROLLER_VK_A*} for å få vite mer om handel.{*B*} + Trykk på {*CONTROLLER_VK_B*} hvis du allerede kan det du trenger om handel. Når du har en blanding av yrker, vil de tilgjengelige byttene med landsbyboeren oppdateres. + + + + + Byttene en landsbyboer tilbyr avhenger av landsbyboerens yrke. @@ -6042,7 +6932,4 @@ Alle enderkister i en verden henger sammen. Ting som plasseres i en enderkiste, Kurer - - Finner seed for verdensgenerator - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsPlatformSpecific.xml index fb436e8f..60f30f4a 100644 --- a/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/no-NO/stringsPlatformSpecific.xml @@ -1,246 +1,247 @@  - - NOT USED + + Vil du logge inn på "PSN"? - - Du kan bruke berøringsskjermen til PlayStation®Vita-systemet til å navigere i menyene! + + Med dette alternativet kan spillere som ikke er på samme PlayStation®Vita-system som verten, sparkes ut av spillet (sammen med eventuelt andre spillere på vedkommendes PlayStation®Vita-system). Denne spilleren vil da ikke kunne bli med i spillet igjen før det startes på nytt. - - minecraftforum har et eget forum for PlayStation®Vita Edition. + + SELECT - - Du får siste nytt om dette spillet fra @4JStudios og @Kappische på twitter! + + Dette deaktiverer oppdateringer for trophies og topplister i denne verdenen mens du spiller, og hvis du laster inn på nytt etter å ha lagret med dette alternativet på. - - Ikke se endermenn inn i øynene! + + PlayStation®Vita-system - - Vi tror kanskje 4J Studios har fjernet Herobrine fra PlayStation®Vita-system-spillet, men vi er ikke sikre. + + Velg Ad Hoc-nettverk for å koble til andre PlayStation®Vita-systemer i nærheten, eller "PSN" for å koble til venner over hele verden. - - Minecraft: PlayStation®Vita Edition har tatt en rekke rekorder! + + Ad Hoc-nettverk - - {*T3*}SLIK SPILLER DU: FLERSPILLER{*ETW*}{*B*}{*B*} -Minecraft på PlayStation®Vita-system er i utgangspunktet et flerspillerspill. -Når du starter eller blir med i et onlinespill, vil det vises for spillere på vennelisten din (med mindre du som vert har valgt "Kun inviterte"), og hvis vennene dine blir med i spillet, vil også dette vises for spillere på deres vennelister (hvis du har valgt "Tillat venner av venner").{*B*} -Når du er i et spill, kan du trykke på SELECT-knappen for å åpne en liste over andre spillere i spillet, og det er også mulig å sparke ut spillere. + + Endre nettverksmodus - - {*T3*}SLIK SPILLER DU: DELE SKJERMBILDER{*ETW*}{*B*}{*B*} -Du kan dele skjermbilder fra spillet ved å åpne pausemenyen og trykke på {*CONTROLLER_VK_Y*} for å legge ut på Facebook. Da vil du se en miniatyrversjon av skjermbildet, og du kan redigere teksten som skal knyttes til Facebook-innlegget.{*B*}{*B*} -Det finnes en egen kameramodus for å ta slike skjermbilder, slik at du kan se karakteren din forfra på bildet: Trykk på {*CONTROLLER_ACTION_CAMERA*} til du ser karakteren din forfra, og trykk deretter på {*CONTROLLER_VK_Y*} for å dele.{*B*}{*B*} -Online-ID-en vises ikke på skjermbildet. + + Velg nettverksmodus - - {*T3*}SLIK SPILLER DU: KREATIV MODUS{*ETW*}{*B*}{*B*} -I kreativ modus kan alle gjenstander i spillet flyttes over til inventaret ditt uten at du trenger å utvinne eller utforme dem. -Gjenstandene i inventaret ditt vil heller ikke forsvinne når de plasseres eller brukes i verdenen, og dette gjør at du kan fokusere på å bygge i stedet for å samle ressurser.{*B*} -Hvis du oppretter, laster inn eller lagrer en verden i kreativ modus, vil trofeer og poengtavleoppdateringer være deaktivert for denne verdenen, selv om den deretter lastes inn i overlevelsesmodus.{*B*} -Hvis du vil fly når du er i kreativ modus, trykker du raskt to ganger på {*CONTROLLER_ACTION_JUMP*}. Gjør det samme for å slutte å fly. Hvis du vil fly fortere, trykker du på {*CONTROLLER_ACTION_MOVE*} raskt to ganger fremover mens du flyr. -I flymodus kan du holde inne {*CONTROLLER_ACTION_JUMP*} for å bevege deg opp og -{*CONTROLLER_ACTION_SNEAK*} for å bevege deg ned, eller du kan bruke {*CONTROLLER_ACTION_DPAD_UP*} for å bevege deg opp, {*CONTROLLER_ACTION_DPAD_DOWN*} for å bevege deg ned, -{*CONTROLLER_ACTION_DPAD_LEFT*} for å bevege deg til venstre og {*CONTROLLER_ACTION_DPAD_RIGHT*} for å bevege deg til høyre. + + Vis Online-ID-er på delt skjerm - - Ved å trykke raskt to ganger på {*CONTROLLER_ACTION_JUMP*} kan du fly. Gjenta dette for å slutte å fly. Hvis du vil fly fortere, trykker du på {*CONTROLLER_ACTION_MOVE*} raskt to ganger fremover mens du flyr. -I flymodus kan du holde inne {*CONTROLLER_ACTION_JUMP*} for å bevege deg opp og {*CONTROLLER_ACTION_SNEAK*} for å bevege deg ned, eller du kan bruke retningsknappene for å bevege deg opp, ned, til venstre og til høyre. + + Trofeer - - IKKE I BRUK + + Dette spillet har en automatisk lagringsfunksjon. Når du ser ikonet over, betyr det at spillet blir lagret. +Ikke slå av PlayStation®Vita-systemet når dette ikonet vises på skjermen. - - IKKE I BRUK + + Når dette er aktivert, kan verten slå av og på sin egen evne til å fly, deaktivere utmattelse og gjøre seg selv usynlig via menyen i spillet. Deaktiverer trofeer og poengtavleoppdateringer. - - "IKKE I BRUK" + + Online-ID-er: - - "IKKE I BRUK" + + Du bruker prøveversjonen av teksturpakken. Det innebærer at du har tilgang til alt innhold i teksturpakken, men du vil ikke kunne lagre fremdriften. +Hvis du prøver å lagre mens du bruker prøveversjonen, vil du få spørsmål om å kjøpe fullversjonen. + - - Inviter venner + + Patch 1.04 (oppdatering 14) - - Hvis du lager, laster inn eller lagrer en verden i kreativ modus, vil trofeer og poengtavleoppdateringer være deaktivert for denne verdenen, selv om den deretter lastes inn i overlevelsesmodus. Er du sikker på at du vil fortsette? + + Online-ID-er i spillet - - Denne verdenen har tidligere blitt lagret i kreativ modus, så den vil ha trofeer og poengtavleoppdateringer deaktivert. Er du sikker på at du vil fortsette? + + Se hva jeg laget i Minecraft: PlayStation®Vita Edition! - - Denne verdenen har tidligere blitt lagret i kreativ modus, så den vil ha trofeer og poengtavleoppdateringer deaktivert. Er du sikker på at du vil fortsette? + + Nedlasting mislyktes. Prøv igjen senere. - - Hvis du lager, laster inn eller lagrer en verden med vertsrettigheter aktivert, vil trofeer og poengtavleoppdateringer være deaktivert for denne verdenen, selv om den deretter lastes inn med vertsrettigheter deaktivert. Er du sikker på at du vil fortsette? + + Kunne ikke bli med i spillet på grunn av en restriktiv NAT-type. Kontroller nettverksinnstillingene. - - Forbindelsen til "PSN" ble brutt. Går tilbake til hovedmenyen. + + Opplasting mislyktes. Prøv igjen senere. - - Forbindelsen til "PSN" ble brutt. + + Nedlasting fullført! - - Dette er prøveversjonen av Minecraft: PlayStation®Vita Edition. Hvis du hadde hatt fullversjonen, ville du nettopp ha fått deg et trofé! -Lås opp fullversjonen av spillet for å få fullt utbytte av Minecraft: PlayStation®Vita Edition og for å spille sammen med vennene dine rundt om i verden via "PSN". -Vil du låse opp fullversjonen? + + +Det er i øyeblikket ingen lagring tilgjengelig i området for lagringsoverføring. +Du kan laste opp en verdenslagring til området for lagringsoverføring med Minecraft: PlayStation®3 Edition, og deretter laste den ned med Minecraft: PlayStation®Vita Edition. + - - Dette er prøveversjonen av Minecraft: PlayStation®Vita Edition. Hvis du hadde hatt fullversjonen, ville du nettopp ha fått deg et tema! -Lås opp fullversjonen av spillet for å få fullt utbytte av Minecraft: PlayStation®Vita Edition og for å spille sammen med vennene dine rundt om i verden via "PSN". -Vil du låse opp fullversjonen? + + Lagring ikke fullført - - Dette er prøveversjonen av Minecraft: PlayStation®Vita Edition. Du trenger fullversjonen for å kunne akseptere denne invitasjonen. -Vil du låse opp fullversjonen? + + Minecraft: PlayStation®Vita Edition har ikke mer plass til lagringsdata. Du kan slette lagret data fra Minecraft: PlayStation®Vita Edition for å frigjøre mer plass. - - Gjestespillere kan ikke låse opp fullversjonen. Vennligst logg inn med en Sony Entertainment Network-konto. + + Opplasting avbrutt - - Online-ID + + Du har avbrutt opplastingen av denne lagringen til lagringsomføringsområdet. - - Brygging + + Last opp lagring for PS3™/PS4™ - - Du ble sendt tilbake til startskjermen fordi du ble logget ut av "PSN". + + Laster opp data: %d% % - - Du har spilt prøveversjonen av Minecraft: PlayStation®Vita Edition så lenge som det er tilltatt! Vil du låse opp fullversjonen? + + "PSN" - - Feil under innlasting av Minecraft: PlayStation®Vita Edition. Kan ikke fortsette. + + Last ned PS3™-lagring - - Kunne ikke bli med i spillet fordi én eller flere spillere ikke kan spille online på grunn av chatbegrensninger på sin Sony Entertainment Network-konto. + + Laster ned data: %d%% - - Kunne ikke opprette onlinespill fordi én eller flere spillere ikke kan spille online på grunn av chatbegrensninger på sin Sony Entertainment Network-konto. Fjern avmerkingen på "Onlinespill" under "Flere alternativer" for å starte et offlinespill. + + Lagrer - - Du kan ikke bli med i denne spilløkten fordi onlinespilling er deaktivert på Sony Entertainment Network-kontoen din på grunn av chatbegrensninger. + + Opplasting fullført! - - Du kan ikke bli med i denne spilløkten fordi en av dine lokale spillere har onlinespilling deaktivert på Sony Entertainment Network-kontoen sin på grunn av chatbegrensninger. Fjern avmerkingen på "Onlinespill" under "Flere alternativer" for å starte et offlinespill. + + Er du sikker på at du ønsker å laste opp denne lagringen og overskrive en eventuell lagring som for øyeblikket finnes i området for lagringsoverføring? - - Du kan ikke opprette denne spilløkten fordi en av dine lokale spillere har onlinespilling deaktivert på Sony Entertainment Network-kontoen sin på grunn av chatbegrensninger. Fjern avmerkingen på "Onlinespill" under "Flere alternativer" for å starte et offlinespill. + + Konverterer data - - Dette spillet har en automatisk lagringsfunksjon. Når du ser ikonet over, betyr det at spillet blir lagret. -Ikke slå av PlayStation®Vita-systemet når dette ikonet vises på skjermen. + + IKKE I BRUK - - Når dette er aktivert, kan verten slå av og på sin egen evne til å fly, deaktivere utmattelse og gjøre seg selv usynlig via menyen i spillet. Deaktiverer trofeer og poengtavleoppdateringer. + + IKKE I BRUK - - Vis Online-ID-er på delt skjerm + + {*T3*}SLIK SPILLER DU: KREATIV MODUS{*ETW*}{*B*}{*B*} +I kreativ modus kan alle gjenstander i spillet flyttes over til inventaret ditt uten at du trenger å utvinne eller utforme dem. +Gjenstandene i inventaret ditt vil heller ikke forsvinne når de plasseres eller brukes i verdenen, og dette gjør at du kan fokusere på å bygge i stedet for å samle ressurser.{*B*} +Hvis du oppretter, laster inn eller lagrer en verden i kreativ modus, vil trofeer og poengtavleoppdateringer være deaktivert for denne verdenen, selv om den deretter lastes inn i overlevelsesmodus.{*B*} +Hvis du vil fly når du er i kreativ modus, trykker du raskt to ganger på {*CONTROLLER_ACTION_JUMP*}. Gjør det samme for å slutte å fly. Hvis du vil fly fortere, trykker du på {*CONTROLLER_ACTION_MOVE*} raskt to ganger fremover mens du flyr. +I flymodus kan du holde inne {*CONTROLLER_ACTION_JUMP*} for å bevege deg opp og +{*CONTROLLER_ACTION_SNEAK*} for å bevege deg ned, eller du kan bruke {*CONTROLLER_ACTION_DPAD_UP*} for å bevege deg opp, {*CONTROLLER_ACTION_DPAD_DOWN*} for å bevege deg ned, +{*CONTROLLER_ACTION_DPAD_LEFT*} for å bevege deg til venstre og {*CONTROLLER_ACTION_DPAD_RIGHT*} for å bevege deg til høyre. - - Trofeer + + Ved å trykke raskt to ganger på {*CONTROLLER_ACTION_JUMP*} kan du fly. Gjenta dette for å slutte å fly. Hvis du vil fly fortere, trykker du på {*CONTROLLER_ACTION_MOVE*} raskt to ganger fremover mens du flyr. +I flymodus kan du holde inne {*CONTROLLER_ACTION_JUMP*} for å bevege deg opp og {*CONTROLLER_ACTION_SNEAK*} for å bevege deg ned, eller du kan bruke retningsknappene for å bevege deg opp, ned, til venstre og til høyre. - - Online-ID-er: + + "IKKE I BRUK" - - Online-ID-er i spillet + + Hvis du lager, laster inn eller lagrer en verden i kreativ modus, vil trofeer og poengtavleoppdateringer være deaktivert for denne verdenen, selv om den deretter lastes inn i overlevelsesmodus. Er du sikker på at du vil fortsette? - - Se hva jeg laget i Minecraft: PlayStation®Vita Edition! + + Denne verdenen har tidligere blitt lagret i kreativ modus, så den vil ha trofeer og poengtavleoppdateringer deaktivert. Er du sikker på at du vil fortsette? - - Du bruker prøveversjonen av teksturpakken. Det innebærer at du har tilgang til alt innhold i teksturpakken, men du vil ikke kunne lagre fremdriften. -Hvis du prøver å lagre mens du bruker prøveversjonen, vil du få spørsmål om å kjøpe fullversjonen. - + + "IKKE I BRUK" - - Patch 1.04 (oppdatering 14) + + Inviter venner - - SELECT + + minecraftforum har et eget forum for PlayStation®Vita Edition. - - Dette deaktiverer oppdateringer for trophies og topplister i denne verdenen mens du spiller, og hvis du laster inn på nytt etter å ha lagret med dette alternativet på. + + Du får siste nytt om dette spillet fra @4JStudios og @Kappische på twitter! - - Vil du logge inn på "PSN"? + + NOT USED - - Med dette alternativet kan spillere som ikke er på samme PlayStation®Vita-system som verten, sparkes ut av spillet (sammen med eventuelt andre spillere på vedkommendes PlayStation®Vita-system). Denne spilleren vil da ikke kunne bli med i spillet igjen før det startes på nytt. + + Du kan bruke berøringsskjermen til PlayStation®Vita-systemet til å navigere i menyene! - - PlayStation®Vita-system + + Ikke se endermenn inn i øynene! - - Endre nettverksmodus + + {*T3*}SLIK SPILLER DU: FLERSPILLER{*ETW*}{*B*}{*B*} +Minecraft på PlayStation®Vita-system er i utgangspunktet et flerspillerspill. +Når du starter eller blir med i et onlinespill, vil det vises for spillere på vennelisten din (med mindre du som vert har valgt "Kun inviterte"), og hvis vennene dine blir med i spillet, vil også dette vises for spillere på deres vennelister (hvis du har valgt "Tillat venner av venner").{*B*} +Når du er i et spill, kan du trykke på SELECT-knappen for å åpne en liste over andre spillere i spillet, og det er også mulig å sparke ut spillere. - - Velg nettverksmodus + + {*T3*}SLIK SPILLER DU: DELE SKJERMBILDER{*ETW*}{*B*}{*B*} +Du kan dele skjermbilder fra spillet ved å åpne pausemenyen og trykke på {*CONTROLLER_VK_Y*} for å legge ut på Facebook. Da vil du se en miniatyrversjon av skjermbildet, og du kan redigere teksten som skal knyttes til Facebook-innlegget.{*B*}{*B*} +Det finnes en egen kameramodus for å ta slike skjermbilder, slik at du kan se karakteren din forfra på bildet: Trykk på {*CONTROLLER_ACTION_CAMERA*} til du ser karakteren din forfra, og trykk deretter på {*CONTROLLER_VK_Y*} for å dele.{*B*}{*B*} +Online-ID-en vises ikke på skjermbildet. - - Velg Ad Hoc-nettverk for å koble til andre PlayStation®Vita-systemer i nærheten, eller "PSN" for å koble til venner over hele verden. + + Vi tror kanskje 4J Studios har fjernet Herobrine fra PlayStation®Vita-system-spillet, men vi er ikke sikre. - - Ad Hoc-nettverk + + Minecraft: PlayStation®Vita Edition har tatt en rekke rekorder! - - "PSN" + + Du har spilt prøveversjonen av Minecraft: PlayStation®Vita Edition så lenge som det er tilltatt! Vil du låse opp fullversjonen? - - Last ned PlayStation®3-system lagring - + + Feil under innlasting av Minecraft: PlayStation®Vita Edition. Kan ikke fortsette. - - Last opp lagring for PlayStation®3/PlayStation®4-system - + + Brygging - - Opplasting avbrutt + + Du ble sendt tilbake til startskjermen fordi du ble logget ut av "PSN". - - Du har avbrutt opplastingen av denne lagringen til lagringsomføringsområdet. + + Kunne ikke bli med i spillet fordi én eller flere spillere ikke kan spille online på grunn av chatbegrensninger på sin Sony Entertainment Network-konto. - - Laster opp data: %d + + Du kan ikke bli med i denne spilløkten fordi en av dine lokale spillere har onlinespilling deaktivert på Sony Entertainment Network-kontoen sin på grunn av chatbegrensninger. Fjern avmerkingen på "Onlinespill" under "Flere alternativer" for å starte et offlinespill. - - Laster ned data: %d%% + + Du kan ikke opprette denne spilløkten fordi en av dine lokale spillere har onlinespilling deaktivert på Sony Entertainment Network-kontoen sin på grunn av chatbegrensninger. Fjern avmerkingen på "Onlinespill" under "Flere alternativer" for å starte et offlinespill. - - Er du sikker på at du ønsker å laste opp denne lagringen og overskrive en eventuell lagring som for øyeblikket finnes i området for lagringsoverføring? + + Kunne ikke opprette onlinespill fordi én eller flere spillere ikke kan spille online på grunn av chatbegrensninger på sin Sony Entertainment Network-konto. Fjern avmerkingen på "Onlinespill" under "Flere alternativer" for å starte et offlinespill. - - Konverterer data + + Du kan ikke bli med i denne spilløkten fordi onlinespilling er deaktivert på Sony Entertainment Network-kontoen din på grunn av chatbegrensninger. - - Lagrer + + Forbindelsen til "PSN" ble brutt. Går tilbake til hovedmenyen. - - Opplasting fullført! + + Forbindelsen til "PSN" ble brutt. - - Opplasting mislyktes. Prøv igjen senere. + + Denne verdenen har tidligere blitt lagret i kreativ modus, så den vil ha trofeer og poengtavleoppdateringer deaktivert. Er du sikker på at du vil fortsette? - - Nedlasting fullført! + + Hvis du lager, laster inn eller lagrer en verden med vertsrettigheter aktivert, vil trofeer og poengtavleoppdateringer være deaktivert for denne verdenen, selv om den deretter lastes inn med vertsrettigheter deaktivert. Er du sikker på at du vil fortsette? - - Nedlasting mislyktes. Prøv igjen senere. + + Dette er prøveversjonen av Minecraft: PlayStation®Vita Edition. Hvis du hadde hatt fullversjonen, ville du nettopp ha fått deg et trofé! +Lås opp fullversjonen av spillet for å få fullt utbytte av Minecraft: PlayStation®Vita Edition og for å spille sammen med vennene dine rundt om i verden via "PSN". +Vil du låse opp fullversjonen? - - Kunne ikke bli med i spillet på grunn av en restriktiv NAT-type. Kontroller nettverksinnstillingene. + + Gjestespillere kan ikke låse opp fullversjonen. Vennligst logg inn med en Sony Entertainment Network-konto. - - - Det er i øyeblikket ingen lagring tilgjengelig i området for lagringsoverføring. - Du kan laste opp en verdenslagring til området for lagringsoverføring med Minecraft: PlayStation®3 Edition, og deretter laste den ned med Minecraft: PlayStation®Vita Edition. - + + Online-ID - - Lagring ikke fullført + + Dette er prøveversjonen av Minecraft: PlayStation®Vita Edition. Hvis du hadde hatt fullversjonen, ville du nettopp ha fått deg et tema! +Lås opp fullversjonen av spillet for å få fullt utbytte av Minecraft: PlayStation®Vita Edition og for å spille sammen med vennene dine rundt om i verden via "PSN". +Vil du låse opp fullversjonen? - - Minecraft: PlayStation®Vita Edition har ikke mer plass til lagringsdata. Du kan slette lagret data fra Minecraft: PlayStation®Vita Edition for å frigjøre mer plass. + + Dette er prøveversjonen av Minecraft: PlayStation®Vita Edition. Du trenger fullversjonen for å kunne akseptere denne invitasjonen. +Vil du låse opp fullversjonen? + + + Lagringsfilen i området for lagringsoverføring har et versjonnummer som Minecraft: PlayStation®Vita Edition ennå ikke støtter. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pl-PL/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/4J_stringsPlatformSpecific.xml index e3981f1b..c97b95db 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pl-PL/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/4J_stringsPlatformSpecific.xml @@ -1,51 +1,50 @@  - - Brak wystarczającej ilości miejsca napamięć masowa systemu do stworzenia zapisu. - - - Powróciłeś na ekran tytułowy, ponieważ wypisałeś się z sieci "PSN". + + Nie udało się zapisać ustawień na koncie Sony Entertainment Network. - - Gra została zakończona, ponieważ wypisałeś się z sieci "PSN". + + Problem z kontem Sony Entertainment Network - - Aktualnie nie jesteś wpisany. - + + Wystąpił problem z dostępem do twojego konta Sony Entertainment Network. Trofeum nie zostało przyznane. - - Gra posiada pewne funkcje, które wymagają wpisania się do sieci "PSN" – nie jesteś wpisany. + + To wersja próbna Minecraft: PlayStation®3 Edition. Gdyby była to pełna wersja gry, właśnie otrzymałbyś trofeum! +Odblokuj pełną wersję gry, aby poznać Minecraft: PlayStation®3 Edition i grać ze znajomymi z całego świata przez sieć "PSN". +Czy chcesz odblokować pełną wersję gry? - - Sieć Ad Hoc jest wyłączona. + + Połącz się z siecią Ad Hoc Gra posiada pewne funkcje, które wymagają połączenia z siecią Ad Hoc, a twoje połączenie jest obecnie wyłączone. - - Ta funkcja wymaga wpisania do sieci "PSN". - - - Połącz z siecią "PSN" - - - Połącz się z siecią Ad Hoc + + Sieć Ad Hoc jest wyłączona. Problem z trofeum - - Wystąpił problem z dostępem do twojego konta Sony Entertainment Network. Trofeum nie zostało przyznane. + + Gra została zakończona, ponieważ wypisałeś się z sieci "PSN". - - Problem z kontem Sony Entertainment Network + + Powróciłeś na ekran tytułowy, ponieważ wypisałeś się z sieci "PSN". - - Nie udało się zapisać ustawień na koncie Sony Entertainment Network. + + Brak wystarczającej ilości miejsca napamięć masowa systemu do stworzenia zapisu. - - To wersja próbna Minecraft: PlayStation®3 Edition. Gdyby była to pełna wersja gry, właśnie otrzymałbyś trofeum! -Odblokuj pełną wersję gry, aby poznać Minecraft: PlayStation®3 Edition i grać ze znajomymi z całego świata przez sieć "PSN". -Czy chcesz odblokować pełną wersję gry? + + Aktualnie nie jesteś wpisany. + + + Połącz z siecią "PSN" + + + Ta funkcja wymaga wpisania do sieci "PSN". + + + Gra posiada pewne funkcje, które wymagają wpisania się do sieci "PSN" – nie jesteś wpisany. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pl-PL/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/AdditionalStrings.xml index 6eecfe59..1e739a7c 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pl-PL/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/AdditionalStrings.xml @@ -48,6 +48,12 @@ Plik zapisu opcji został uszkodzony i musi zostać usunięty. + + Usuń plik z opcjami. + + + Spróbuj ponownie wczytać plik z opcjami. + Plik zapisu w pamięci podręcznej został uszkodzony i musi zostać usunięty. @@ -75,6 +81,9 @@ Ze względu na kontrolę rodzicielską na koncie jednego z lokalnych graczy usługa sieciowa została wyłączona na twoim koncie Sony Entertainment Network. + + Funkcje sieciowe są wyłączone gdyż dostępna jest aktualizacja. + Aktualnie nie ma dostępnej zawartości do pobrania dla tej gry. @@ -82,9 +91,6 @@ Zaproszenie - Dołącz do mnie w Minecraft: Edycja PlayStation®Vita! - - - Funkcje sieciowe są wyłączone gdyż dostępna jest aktualizacja. + Dołącz do mnie w Minecraft: edycja PlayStation®Vita! \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsGeneric.xml index 01ce3a90..4472cf4e 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsGeneric.xml @@ -1,5100 +1,6021 @@  - - Dostępna jest nowa zawartość do pobrania! Można ją znaleźć w sklepie Minecraft, w głównym menu. + + Przełączanie do gry offline - - Możesz zmienić wygląd swojej postaci dzięki pakietowi skórek ze sklepu Minecraft. Wybierz „Sklep Minecraft” w głównym menu i zobacz, co jest dostępne. + + Czekaj, aż host zapisze grę - - Zmień ustawienia gammy, aby rozjaśnić lub przyciemnić obraz w grze. + + Wkraczasz do Kresu - - Ustaw poziom trudności na „Spokojny”, by twoje zdrowie regenerowało się automatycznie, a w nocy nie atakowały cię żadne potwory! + + Zapisywanie graczy - - Nakarm wilka kością, aby go oswoić. Wtedy może za tobą podążać lub warować w miejscu. + + Łączenie z hostem - - Aby wyrzucić przedmiot z ekranu ekwipunku, przesuń kursor poza krawędź menu i wciśnij{*CONTROLLER_VK_A*}. + + Pobieranie terenu - - Zaśnięcie w łóżku w nocy przyspieszy nastanie świtu. W trybie wieloosobowym wszyscy gracze muszą położyć się jednocześnie. + + Opuszczasz Kres - - Zabijaj świnie, aby zdobywać steki wieprzowe. Następnie smaż je i jedz, aby odzyskać zdrowie. + + Twoje łóżko zniknęło lub było zablokowane - - Zbieraj skóry krów i wytwarzaj z nich elementy pancerza. + + Nie możesz teraz odpoczywać, w pobliżu są potwory - - Jeżeli masz puste wiadro, możesz napełnić je mlekiem krowy, wodą lub lawą! + + Śpisz w łóżku. Aby przyspieszyć nadejście poranka, wszyscy gracze muszą położyć się w łóżkach w tej samej chwili. - - Użyj motyki, aby przygotować ziemię pod uprawę. + + To łóżko jest zajęte - - Pająki nie zaatakują cię w dzień, chyba że ty zaatakujesz pierwszy. + + Możesz spać tylko w nocy - - Kopanie ziemi lub piasku łopatą jest szybsze niż kopanie rękami! + + %s śpi w łóżku. Aby przyspieszyć nadejście poranka, wszyscy gracze muszą położyć się w łóżkach w tej samej chwili. - - Jedzenie usmażonych steków wieprzowych odnawia więcej zdrowia niż jedzenie surowych. + + Wczytywanie poziomu - - Stwórz trochę pochodni, aby w nocy oświetlić teren. Potwory będą unikać obszarów w pobliżu pochodni. + + Finalizowanie... - - Dzięki torom i wagonikom możesz szybciej dotrzeć do odległych miejsc! + + Budowanie terenu - - Zasadź sadzonki, a wyrosną z nich drzewa. + + Symulacja świata - - Świnioludy nie zaatakują cię, chyba że ty zaatakujesz ich pierwszy. + + Poz. - - Możesz zmienić punkt odrodzenia i przeskoczyć w czasie do świtu, korzystając z łóżka. + + Przygotowywanie do zapisania poziomu - - Odbijaj kule ognia, którymi strzelają duchy! + + Przygotowywanie kawałków składowych... - - Wybudowanie portalu umożliwi ci przeniesienie się do innego wymiaru – Otchłani. + + Przygotowywanie serwera - - Wciśnij{*CONTROLLER_VK_B*}, aby upuścić trzymany w ręku przedmiot! + + Opuszczasz Otchłań - - Używaj odpowiednich do wykonywanego zadania narzędzi! + + Odradzanie - - Jeżeli nie możesz znaleźć węgla do stworzenia pochodni, zawsze możesz stworzyć trochę węgla drzewnego z drewna, korzystając z pieca. + + Generowanie poziomu - - Kopanie pionowo w dół lub w górę nie jest dobrym pomysłem. + + Tworzenie obszaru odrodzenia - - Mączka kostna (z kości kościotrupa) może być użyta jako nawóz i sprawić, że rośliny wyrosną natychmiast! + + Wczytywanie obszaru odrodzenia - - Czyhacze wybuchają, gdy podejdą blisko ciebie! + + Wkraczasz do Otchłani - - Obsydian powstaje, gdy woda zetknie się ze źródłem lawy. + + Narzędzia i broń - - Może upłynąć kilka minut, zanim lawa CAŁKOWICIE zniknie po usunięciu jej źródła. + + Gamma - - Kamień brukowy jest odporny na kule ognia duchów, przez co nadaje się do zabezpieczenia portali. + + Czułość gry - - Bloki, które mogą być używane jako źródło światła, będą roztapiać śnieg i lód. Zaliczają się do nich pochodnie, jasnogłazy i dyniowe lampiony. + + Czułość interfejsu - - Uważaj podczas wznoszenia konstrukcji z wełny na wolnym powietrzu - błyskawice mogą ją podpalić. + + Poziom trudności - - Jedno wiadro lawy może być wykorzystane w piecu do przetopienia 100 bloków. + + Muzyka - - Dźwięk wydany przez blok muzyczny zależy od tego, jaki materiał znajduje się pod spodem. + + Dźwięk - - Zombie i kościotrupy nie otrzymują obrażeń od światła słonecznego, jeżeli znajdują się w wodzie. + + Spokojny - - Zaatakowanie wilka sprawi, że wszystkie pobliskie wilki rzucą się na ciebie. Tę cechę mają także zombie świnioludy. + + W tym trybie gracz automatycznie regeneruje zdrowie i nie napotka żadnych przeciwników. - - Wilki nie mogą wejść do Otchłani. + + W tym trybie pojawiają się przeciwnicy, ale zadają graczowi mniejsze obrażenia niż na normalnym poziomie trudności. - - Wilki nie atakują czyhaczy. + + W tym trybie pojawiają się przeciwnicy i będą zadawać graczowi standardowe obrażenia. - - Kury składają jaja co 5–10 minut. + + Niski - - Obsydian można wydobywać tylko diamentowym kilofem. + + Normalny - - Czychacze są najlepszym źródłem prochu strzelniczego. + + Wysoki - - Umieść dwie skrzynie obok siebie, aby stworzyć wielką skrzynię. + + Wypisano się - - Pozycja ogona wskazuje stan zdrowia oswojonych wilków. Karm je mięsem, aby je uzdrawiać. + + Pancerz - - Ugotuj kaktus w piecu, aby stworzyć zielony barwnik. + + Mechanizmy - - Zajrzyj do sekcji „Co nowego” w menu „Instrukcja”, aby zapoznać się z najnowszymi zmianami w grze. + + Transport - - W grze można teraz ustawiać jedne ogrodzenia na drugich! + + Broń - - Niektóre zwierzęta pójdą za tobą, jeżeli trzymasz pszenicę w ręku. + + Jedzenie - - Jeżeli zwierzę nie może przejść 20 bloków w dowolnym kierunku, nie zniknie ze świata gry. + + Konstrukcje - - Muzyka autorstwa C418! + + Dekoracje - - Notcha obserwuje ponad milion osób na twitterze! + + Warzenie - - Nie wszyscy mieszkańcy Szwecji są blondynami. Niektórzy, jak Jens z Mojang, są nawet rudzi! + + Narzędzia, broń i pancerz - - Kiedyś w końcu pojawi się aktualizacja do tej gry! + + Materiały - - Kim jest Notch? + + Bloki do budowy - - Mojang zebrało więcej nagród niż ma pracowników! + + Czerwony kamień i transport - - Sławni ludzie grają w Minecrafta! + + Inne - - deadmau5 lubi Minecrafta! + + Wpisy: - - Nie zwracaj uwagi na błędy. + + Wyjdź bez zapisywania - - Czyhacze narodziły się z błędu w kodowaniu. + + Czy na pewno chcesz wyjść do głównego menu? Niezapisany postęp zostanie utracony. - - To kura czy kaczka? + + Czy na pewno chcesz wyjść do głównego menu? Twój postęp zostanie utracony! - - Byłeś na Mineconie? + + Ten zapis gry jest uszkodzony. Czy chcesz go usunąć? - - Nikt w Mojang nie widział twarzy Junkboya. + + Czy na pewno chcesz wyjść do głównego menu i rozłączyć wszystkich pozostałych graczy? Niezapisany postęp zostanie utracony. - - Czy wiesz, że istnieje Minecraft Wiki? + + Wyjdź i zapisz - - Nowe biuro Mojang jest czadowe! + + Stwórz nowy świat - - Minecon 2013 odbył się w Orlando, na Florydzie! + + Podaj nazwę swojego świata - - .party() było doskonałe! + + Podaj numer ziarna do generowania świata - - Zawsze zakładaj, że plotki są fałszywe, zamiast zakładać, że są prawdziwe! + + Wczytaj zapisany świat - - {*T3*}INSTRUKCJA : PODSTAWY{*ETW*}{*B*}{*B*} -Minecraft jest grą o ustawianiu bloków i budowaniu z nich wszystkiego, co tylko sobie wyobrazisz. W nocy przychodzą potwory, więc wybuduj schronienie, nim się pojawią.{*B*}{*B*} -Użyj{*CONTROLLER_ACTION_LOOK*}, aby się rozglądać.{*B*}{*B*} -Użyj{*CONTROLLER_ACTION_MOVE*}, aby się poruszać.{*B*}{*B*} -Wciśnij{*CONTROLLER_ACTION_JUMP*}, aby podskoczyć.{*B*}{*B*} -Wychyl {*CONTROLLER_ACTION_MOVE*} szybko dwukrotnie do przodu, aby pobiec. Trzymaj {*CONTROLLER_ACTION_MOVE*} do przodu, a twoja postać będzie biegła, dopóki się nie zmęczy lub pasek najedzenia spadnie poniżej{*ICON_SHANK_03*}.{*B*}{*B*} -Przytrzymaj{*CONTROLLER_ACTION_ACTION*}, aby wydobywać lub ścinać ręką albo przedmiotem trzymanym w ręku. Do wydobywania niektórych bloków potrzebne są narzędzia, które trzeba wytworzyć.{*B*}{*B*} -Jeżeli trzymasz w ręku przedmiot, wciśnij{*CONTROLLER_ACTION_USE*}, aby go użyć, lub{*CONTROLLER_ACTION_DROP*}, aby wyrzucić. + + Rozegraj samouczek - - {*T3*}INSTRUKCJA : INTERFEJS{*ETW*}{*B*}{*B*} -Interfejs pokazuje informacje o twoim stanie – twoje zdrowie, zapas powietrza, gdy jesteś pod wodą, stopień najedzenia (musisz jeść, aby go uzupełniać) oraz pancerz, jeżeli jakiś posiadasz. Jeżeli stracisz trochę zdrowia, ale twój wskaźnik najedzenia ma wypełnione 9 lub więcej{*ICON_SHANK_01*}, twoje zdrowie zacznie się regenerować automatycznie. Jedzenie napełni twój wskaźnik najedzenia.{*B*} -Znajduje się tu także wskaźnik doświadczenia, przy którym wyświetlony jest twój poziom doświadczenia pasek, który pokazuje ile punktów doświadczenia potrzebujesz do następnego poziomu. Punkty doświadczenia zdobywa się zbierając kule doświadczenia, które pojawiają się po zabiciu istot, wydobyciu niektórych rodzajów bloków, rozmnażaniu zwierząt, łowieniu ryb oraz wytapianiu sztabek w piecu.{*B*}{*B*} -Pokazuje także przedmioty, których można użyć. Użyj{*CONTROLLER_ACTION_LEFT_SCROLL*} i{*CONTROLLER_ACTION_RIGHT_SCROLL*}, aby zmienić przedmiot trzymany w dłoni. + + Samouczek - - {*T3*}INSTRUKCJA : EKWIPUNEK{*ETW*}{*B*}{*B*} -Wciśnij{*CONTROLLER_ACTION_INVENTORY*}, aby zajrzeć do ekwipunku.{*B*}{*B*} -Ten ekran wyświetla wszystkie niesione przez ciebie przedmioty oraz te, które możesz trzymać w ręku. Twój pancerz także tu jest.{*B*}{*B*} -Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby poruszać kursorem. Użyj{*CONTROLLER_VK_A*}, aby podnieść przedmiot znajdujący się pod kursorem. Jeżeli znajduje się tam więcej niż jedna sztuka przedmiotu, podniesione zostaną wszystkie. Możesz użyć{*CONTROLLER_VK_X*}, aby podnieść połowę.{*B*}{*B*} -Przesuń kursorem przedmiot w inne miejsce ekwipunku i umieść go tam, używając{*CONTROLLER_VK_A*}. Mając kilka przedmiotów przyczepionych do kursora, użyj{*CONTROLLER_VK_A*}, aby odłożyć wszystkie, lub{*CONTROLLER_VK_X*}, aby odłożyć tylko jeden.{*B*}{*B*} -Najedź kursorem na pancerz, a uzyskasz możliwość umieszczenia go w przeznaczonym dla niego miejscu.{*B*}{*B*} -Można zmienić kolor skórzanego pancerza, farbując go barwnikiem. Można tego dokonać z menu ekwipunku, podnosząc przedmiot za pomocą kursora, a następnie wciskając{*CONTROLLER_VK_X*} po umieszczeniu kursora nad elementem pancerza, który chcesz ufarbować. + + Nazwij swój świat - - {*T3*}INSTRUKCJA : SKRZYNIA{*ETW*}{*B*}{*B*} -Po stworzeniu skrzyni możesz umieścić ją w świecie i skorzystać z niej za pomocą{*CONTROLLER_ACTION_USE*}, aby przechowywać w niej przedmioty.{*B*}{*B*} -Użyj kursora, aby przenosić przedmioty między ekwipunkiem a skrzynią.{*B*}{*B*} -Przedmioty będą przechowywane w skrzyni, aby można było z nich skorzystać kiedy indziej. + + Uszkodzony zapis gry - - {*T3*}INSTRUKCJA : WIELKA SKRZYNIA{*ETW*}{*B*}{*B*} -Dwie skrzynie umieszczone obok siebie zostaną połączone i utworzą wielką skrzynię. Można w niej przechowywać więcej przedmiotów.{*B*}{*B*} -Używa się jej tak samo jak normalnej skrzyni. + + OK - - {*T3*}INSTRUKCJA : WYTWARZANIE{*ETW*}{*B*}{*B*} -Korzystając z interfejsu wytwarzania, możesz łączyć przedmioty z ekwipunku, aby tworzyć nowe. Użyj{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs wytwarzania.{*B*}{*B*} -Przełączaj się między zakładkami na górze za pomocą{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby wybrać rodzaj przedmiotu, który chcesz wytworzyć. Następnie skorzystaj z{*CONTROLLER_MENU_NAVIGATE*}, aby wybrać przedmiot do wytworzenia.{*B*}{*B*} -Obszar wytwarzania pokaże ci przedmioty, które są wymagane do stworzenia nowego przedmiotu. Wciśnij{*CONTROLLER_VK_A*}, aby wytworzyć przedmiot i umieścić go w ekwipunku. + + Anuluj - - {*T3*}INSTRUKCJA : WARSZTAT{*ETW*}{*B*}{*B*} -Dzięki warsztatowi możesz wytwarzać większe przedmioty.{*B*}{*B*} -Umieść warsztat w świecie i wciśnij{*CONTROLLER_ACTION_USE*}, aby z niego skorzystać.{*B*}{*B*} -Wytwarzanie za pomocą warsztatu działa tak samo jak normalne wytwarzanie, ale posiada większy obszar wytwarzania i umożliwia produkcję większej liczby przedmiotów. + + Sklep Minecraft - - {*T3*}INSTRUKCJA : PIEC{*ETW*}{*B*}{*B*} -Piec umożliwia przetwarzanie przedmiotów poprzez wypalanie ich. Przykładowo, możesz zmienić rudę żelaza w sztabki, wypalając ją w piecu.{*B*}{*B*} -Umieść piec w świecie i wciśnij{*CONTROLLER_ACTION_USE*}, aby z niego skorzystać.{*B*}{*B*} -W dolnym polu musisz umieścić opał, a przedmiot, który ma zostać wypalony, w górnym. Piec się rozpali i zacznie działać.{*B*}{*B*} -Gdy przedmioty zostaną wypalone, możesz je przenieść z pieca do ekwipunku.{*B*}{*B*} -Jeżeli wybierzesz przedmiot, który może być wypalony lub użyty jako opał, otrzymasz możliwość szybkiego przeniesienia go do pieca. + + Obróć - - {*T3*}INSTRUKCJA : DOZOWNIK{*ETW*}{*B*}{*B*} -Dozownik wystrzeliwuje przedmioty. Musisz umieścić jakiś przełącznik, na przykład dźwignię, obok dozownika, aby móc go aktywować.{*B*}{*B*} -Aby napełnić dozownik przedmiotami, wciśnij{*CONTROLLER_ACTION_USE*}, a następnie przenieś przedmioty z ekwipunku do dozownika.{*B*}{*B*} -Gdy użyjesz przełącznika, dozownik wystrzeli przedmiot. + + Ukryj - - {*T3*}INSTRUKCJA : WARZENIE{*ETW*}{*B*}{*B*} -Aby warzyć mikstury, niezbędna jest stacja alchemiczna , którą można zbudować w warsztacie. Tworzenie każdej mikstury zaczyna się od butelki z wodą, która powstaje po napełnieniu szklanej butelki wodą z kociołka lub ze źródła.{*B*} -Stacja alchemiczna pomieści trzy butelki, więc może robić trzy mikstury jednocześnie. Jeden składnik może być użyty na wszystkich trzech butelkach, więc zawsze warz trzy mikstury, aby jak najlepiej wykorzystać składnik.{*B*} -Umieszczenie składnika w górnym miejscu spowoduje stworzenie podstawowej mikstury. Nie ma ona żadnych właściwości, ale dodanie kolejnego składnika sprawi, że powstanie mikstura posiadająca jakiś efekt.{*B*} -Gdy stworzysz taką miksturę, możesz dodać trzeci składnik, aby działała ona dłużej (za pomocą czerwonego pyłu), była silniejsza (za pomocą jasnopyłu) lub miała negatywne efekty (za pomocą sfermentowanego oka pająka).{*B*} -Możesz także dodać proch strzelniczy, aby zamienić dowolną miksturę w miksturę rozpryskową, którą można rzucić. Rzucona mikstura rozpryskowa nałoży swój efekt na obszar w którym wyląduje.{*B*} - -Składniki do tworzenia mikstur, to:{*B*}{*B*} -* {*T2*}Narośl z Otchłani{*ETW*}{*B*} -* {*T2*}Oko pająka{*ETW*}{*B*} -* {*T2*}Cukier{*ETW*}{*B*} -* {*T2*}Łza ducha{*ETW*}{*B*} -* {*T2*}Płomienny proszek{*ETW*}{*B*} -* {*T2*}Magmowy krem{*ETW*}{*B*} -* {*T2*}Błyszczący arbuz{*ETW*}{*B*} -* {*T2*}Czerwony pył{*ETW*}{*B*} -* {*T2*}Jasnopył{*ETW*}{*B*} -* {*T2*}Sfermentowane oko pająka{*ETW*}{*B*}{*B*} - -Musisz poeksperymentować z kombinacjami składników, aby poznać wszystkie mikstury, które możesz stworzyć. - + + Wyczyść wszystkie miejsca - - {*T3*}INSTRUKCJA : ZAKLINANIE{*ETW*}{*B*}{*B*} -Punkty doświadczenia zdobyte po zabiciu istoty albo gdy konkretne bloki zostaną wydobyte lub przetopione w piecu, mogą być wykorzystane do zaklinania niektórych narzędzi, broni, części pancerza oraz książek.{*B*} -Gdy miecz, łuk, siekiera, kilof, łopata, element pancerza lub książka zostaną umieszczone pod księgą na magicznym stole, trzy przyciski po prawej stronie wyświetlą możliwe do wykonania zaklęcia oraz ich koszt w poziomach doświadczenia.{*B*} -Jeżeli nie masz wystarczającej liczby poziomów, aby z nich skorzystać, koszt będzie wyświetlony na czerwono. W przeciwnym wypadku – na zielono.{*B*}{*B*} -Samo zaklęcie zostanie wybrane losowo, zależnie od wyświetlonego kosztu.{*B*}{*B*} -Jeżeli magiczny stół jest otoczony biblioteczkami (maksymalnie 15 biblioteczek) z blokiem przerwy między nimi, siła zaklęć zostanie wzmocniona, a magiczne runy zaczną wydobywać się z książki na stole.{*B*}{*B*} -Wszystkie składniki niezbędne do stworzenia magicznego stołu można znaleźć w wioskach. Można też wydobyć je ze świata albo wytworzyć.{*B*}{*B*} -Zaklętych ksiąg używa się przy kowadle, aby nakładać zaklęcia na przedmioty. Dzięki temu masz większą kontrolę nad tym, jakie zaklęcia zostaną nałożone na przedmioty.{*B*} + + Czy na pewno chcesz opuścić tę grę i dołączyć do innej? Niezapisany postęp zostanie utracony. - - {*T3*}INSTRUKCJA : HODOWLA ZWIERZĄT{*ETW*}{*B*}{*B*} -Jeżeli chcesz utrzymać swoje zwierzęta w jednym miejscu, stwórz ogrodzony teren o wymiarach poniżej 20x20 bloków i wprowadź tam zwierzęta. Dzięki temu będą tam, gdy wrócisz. + + Czy na pewno chcesz nadpisać poprzedni zapis tego świata jego obecną wersją? - - {*T3*}INSTRUKCJA : ROZMNAŻANIE ZWIERZĄT{*ETW*}{*B*}{*B*} -Zwierzęta w Minecrafcie mogą się rozmnażać i rodzić małe zwierzęta!{*B*} -Aby zwierzęta się rozmnażały, musisz nakarmić je odpowiednim jedzeniem, które wprowadzi je w miłosny nastrój.{*B*} -Nakarm krowę, grzybową krowę, lub owcę pszenicą, świnię marchewką, kurę ziarnami pszenicy lub naroślą z Otchłani, a wilka dowolnym mięsem, a rozpoczną one poszukiwania innego zwierzęcia ze swojego gatunku, które także jest w miłosnym nastroju.{*B*} -Gdy zwierzęta tego samego gatunku się spotkają i oba są w miłosnym nastroju, pocałują się, a po chwili pojawi się małe zwierzę. Młode będzie podążało za rodzicami, dopóki nie dorośnie.{*B*} -Po przeminięciu miłosnego nastroju zwierzę nie będzie mogło go osiągnąć przez około 5 minut.{*B*} -Na świecie może przebywać określona liczba zwierząt, dlatego mogą przestać się rozmnażać, jeżeli masz ich dużo. + + Czy na pewno chcesz wyjść bez zapisywania? Utracisz cały postęp w tym świecie! - - {*T3*}INSTRUKCJA : PORTAL DO OTCHŁANI{*ETW*}{*B*}{*B*} -Portal do Otchłani umożliwia graczom przemieszczanie się pomiędzy światem zewnętrznym a Otchłanią. Otchłań może być używana do szybkiej podróży przez świat zewnętrzny – jeden blok w Otchłani to trzy bloki w świecie zewnętrznym, więc jeżeli wybudujesz portal w Otchłani i przez niego wyjdziesz, pojawisz się trzy razy dalej od miejsca wejścia.{*B*}{*B*}Potrzeba minimum 10 bloków obsydianu, aby wybudować portal – musi mieć 5 bloków wysokości, 4 bloki szerokości i 1 blok głębokości. Gdy wybudujesz szkielet, musisz go podpalić, aby aktywować portal. Można to zrobić krzesiwem lub ognistym ładunkiem.{*B*}{*B*} -Przykładowe portale znajdują się na zdjęciu po prawej. + + Rozpocznij grę - - {*T3*}INSTRUKCJA : BLOKOWANIE POZIOMÓW{*ETW*}{*B*}{*B*} -Jeżeli znajdziesz obraźliwą treść na poziomie, na którym grasz, możesz dodać go do listy zablokowanych poziomów. -Aby to zrobić, zatrzymaj grę, a następnie wciśnij{*CONTROLLER_VK_RB*}, żeby wybrać opcję blokowania poziomów. -Gdy w przyszłości spróbujesz zagrać na tym poziomie, otrzymasz powiadomienie, że znajduje się on na twojej liście zablokowanych poziomów. Będziesz móc wybrać, czy chcesz usunąć go z listy, czy zrezygnować. + + Wyjdź z gry - - {*T3*}INSTRUKCJA : OPCJE HOSTA I GRACZA{*ETW*}{*B*}{*B*} - -{*T1*}Opcje gry{*ETW*}{*B*} -Podczas wczytywania lub tworzenia świata możesz wcisnąć przycisk „Więcej opcji”, aby wejść do menu, które umożliwia modyfikowanie gry.{*B*}{*B*} - - {*T2*}Gracz kontra Gracz (PvP){*ETW*}{*B*} - Po włączeniu gracze mogą się nawzajem ranić. Ta opcja działa tylko w trybie przetrwania.{*B*}{*B*} - - {*T2*}Ufaj graczom{*ETW*}{*B*} - Po wyłączeniu gracze, którzy dołączą do gry, mają ograniczone możliwości działania. Nie mogą wydobywać ani używać przedmiotów, umieszczać bloków, korzystać z drzwi i przycisków, używać pojemników, atakować graczy oraz zwierząt. Możesz zmienić te opcje dla konkretnych graczy, używając menu w grze.{*B*}{*B*} - - {*T2*}Ogień się rozprzestrzenia{*ETW*}{*B*} - Po włączeniu ogień będzie się rozprzestrzeniał na pobliskie łatwopalne bloki. Ta opcja może być zmieniona podczas gry.{*B*}{*B*} - - {*T2*}Trotyl wybucha{*ETW*}{*B*} - Po włączeniu trotyl będzie wybuchał po detonacji. Ta opcja może być zmieniona podczas gry.{*B*}{*B*} - - {*T2*}Przywileje hosta{*ETW*}{*B*} - Po włączeniu host może umożliwić sobie latanie, wyłączyć zmęczenie i stać się niewidzialnym, korzystając z menu w grze. -{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} - -{*T1*}Opcje generowania świata{*ETW*}{*B*} -Podczas tworzenia nowego świata dostępne są dodatkowe opcje.{*B*}{*B*} - - {*T2*}Generowanie budynków{*ETW*}{*B*} - Po włączeniu miejsca takie jak wioski i twierdze będą pojawiać się w świecie.{*B*}{*B*} - - {*T2*}Superpłaski świat{*ETW*}{*B*} - Po włączeniu zostanie wygenerowany całkowicie płaski świat zewnętrzny i Otchłań.{*B*}{*B*} - - {*T2*}Dodatkowa skrzynia{*ETW*}{*B*} - Po włączeniu w pobliżu miejsca odrodzenia znajdzie się skrzynia z przydatnymi przedmiotami.{*B*}{*B*} - - {*T2*}Resetuj Otchłań{*ETW*}{*B*} -Po włączeniu Otchłań zostanie wygenerowana ponownie. Jest to przydatne przy starszych zapisach gry, gdy fortece Otchłani nie były obecne.{*B*}{*B*} - -{*T1*}Opcje w grze{*ETW*}{*B*}Podczas gry wciśnij przycisk {*BACK_BUTTON*}, aby otworzyć menu i uzyskać dostęp do opcji.{*B*}{*B*} - - {*T2*}Opcje hosta{*ETW*}{*B*}Host i wszyscy gracze, którzy są moderatorami, mają dostęp do menu „Opcje hosta”. W tym menu można włączyć lub wyłączyć rozprzestrzenianie się ognia i wybuchy trotylu.{*B*}{*B*} - -{*T1*}Opcje gracza{*ETW*}{*B*} -Aby zmienić przywileje gracza, wybierz go i wciśnij{*CONTROLLER_VK_A*}. Otwórz menu przywilejów gracza, gdzie dostępne są następujące opcje.{*B*}{*B*} - - {*T2*}Może budować i wydobywać{*ETW*}{*B*} - Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Gdy opcja zostanie włączona, gracz może normalnie oddziaływać na świat. Po jej wyłączeniu gracz nie może umieszczać ani niszczyć bloków, lub wchodzić w interakcję z wieloma przedmiotami i blokami.{*B*}{*B*} - - {*T2*}Może korzystać z drzwi i przełączników{*ETW*}{*B*} - Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Po jej wyłączeniu gracz nie może korzystać z drzwi i przełączników.{*B*}{*B*} - - {*T2*}Może otwierać pojemniki{*ETW*}{*B*} - Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Po jej wyłączeniu gracz nie może otwierać pojemników, takich jak skrzynie.{*B*}{*B*} - - {*T2*}Może atakować graczy{*ETW*}{*B*} - Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Po jej wyłączeniu gracz nie może zadawać obrażeń innym graczom.{*B*}{*B*} - - {*T2*}Może atakować zwierzęta{*ETW*}{*B*} - Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Po jej wyłączeniu gracz nie może zadawać obrażeń zwierzętom.{*B*}{*B*} - - {*T2*}Moderator{*ETW*}{*B*} - Gdy ta opcja zostanie włączona, gracz może zmieniać uprawnienia innych graczy (poza hostem), jeżeli opcja „Ufaj graczom” jest wyłączona, wyrzucać graczy oraz włączać i wyłączać rozprzestrzenianie się ognia i wybuchy trotylu.{*B*}{*B*} - - {*T2*}Wyrzuć gracza{*ETW*}{*B*} - {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - -{*T1*}Opcje hosta{*ETW*}{*B*} -Jeżeli opcja „Przywileje hosta” jest włączona, może on modyfikować przysługujące mu przywileje. Aby zmienić przywileje gracza, wybierz go i wciśnij{*CONTROLLER_VK_A*}. Otwórz menu przywilejów gracza, gdzie dostępne są następujące opcje.{*B*}{*B*} - - {*T2*}Możesz latać{*ETW*}{*B*} -Gdy ta opcja jest włączona, gracz może latać. Ta opcja odnosi się tylko do trybu przetrwania, ponieważ w trybie tworzenia wszyscy gracze mogą latać.{*B*}{*B*} - - {*T2*}Wyłącz zmęczenie{*ETW*}{*B*} - Ta opcja odnosi się tylko do trybu przetrwania. Po jej włączeniu aktywności fizyczne (chodzenie/bieganie/skakanie itp.) nie zmniejszają wskaźnika najedzenia. Jednak gdy gracz zostanie ranny, wskaźnik najedzenia zacznie powoli maleć podczas regeneracji zdrowia.{*B*}{*B*} - - {*T2*}Niewidzialność{*ETW*}{*B*} - Po włączeniu tej opcji gracz staje się niewidzialny dla innych graczy i nie może zostać zraniony.{*B*}{*B*} - - {*T2*}Teleportacja{*ETW*}{*B*} - Umożliwia graczowi teleportację innych graczy lub siebie samego do innych graczy. + + Zapisz grę - - Następna strona + + Wyjdź bez zapisywania - - Poprzednia strona + + Wciśnij START, aby grać - - Podstawy + + Hura – udało ci się odblokować obrazek Steve'a z Minecrafta! - - Interfejs + + Hura – udało ci się odblokować obrazek czyhacza! - - Ekwipunek + + Odblokuj pełną wersję gry - - Skrzynie + + Nie możesz dołączyć do tej gry, ponieważ host używa nowszej wersji gry. - - Wytwarzanie + + Nowy świat - - Piec + + Odblokowano nagrodę! - - Dozownik + + Grasz teraz w wersję próbną. Do zapisu stanu gry potrzebna jest pełna wersja. +Czy chcesz odblokować pełną wersję gry? - - Hodowla zwierząt + + Znajomi - - Rozmnażanie zwierząt + + Mój wynik - - Warzenie + + Ogólne - - Zaklinanie + + Czekaj - - Portal do Otchłani + + Brak wyników - - Tryb wieloosobowy + + Filtr: - - Udostępnianie zdjęć + + Nie możesz dołączyć do tej gry, ponieważ host używa starszej wersji gry. - - Blokowanie poziomów + + Utracono połączenie - - Tryb tworzenia + + Utracono połączenie z serwerem. Powrót do głównego menu. - - Opcje hosta i gracza + + Utracono połączenie z serwerem - - Handel + + Opuszczanie gry - - Kowadło - - - Kres + + Wystąpił błąd. Powrót do głównego menu. - - {*T3*}INSTRUKCJA : KRES{*ETW*}{*B*}{*B*} -Kres to inny wymiar, do którego można dotrzeć przez aktywny portalu Kresu. Portal Kresu można znaleźć w twierdzy, głęboko pod ziemią, w świecie zewnętrznym.{*B*} -Aby aktywować portal Kresu, musisz umieścić Oko Kresu w szkielecie portalu Kresu, który go nie posiada.{*B*} -Gdy portal zostanie aktywowany, przejdź przez niego, aby przenieść się do Kresu.{*B*}{*B*} -W Kresie spotkasz Kresosmoka, potężnego i agresywnego wroga, oraz wiele kresostworów, więc wcześniej musisz się dobrze przygotować do walki!{*B*}{*B*} -Znajdziesz tam także kryształy Kresu, które mieszczą się na szczycie 8 obsydianowych kolumn – Kresosmok wykorzystuje je do leczenia, więc musisz je zniszczyć w pierwszej kolejności.{*B*} -Niektórych z nich można dosięgnąć strzałami, ale pozostałe są osłonięte żelaznymi ogrodzeniami i musisz się do nich wspiąć.{*B*}{*B*} -Gdy to robisz, Kresosmok będzie cię atakował, podlatując i plując kulami kwasu!{*B*} -Jeżeli zbliżysz się do podium z jajkiem, które jest otoczone kolcami, Kresosmok nadleci, aby cię zaatakować – to doskonała okazja, żeby zadać mu poważne obrażenia!{*B*} -Unikaj kwasowych ataków i celuj w oczy. Jeżeli to możliwe, sprowadź znajomych, którzy pomogą ci w walce!{*B*}{*B*} -Gdy dotrzesz do Kresu, twoi znajomi zobaczą miejsce położenia portalu Kresu na swoich mapach, więc z łatwością do ciebie dołączą. + + Połączenie nieudane - - Bieg + + Wyrzucono cię z gry - - Co nowego + + Host wyszedł z gry - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Zmiany i dodatki{*ETW*}{*B*}{*B*} -– Dodano nowe przedmioty – szmaragd, ruda szmaragdu, blok szmaragdu, skrzynia Kresu, haczyk na linkę, magiczne złote jabłko, kowadło, doniczka, murek z kamienia brukowego, murek z kamienia brukowego z mchem, uschnięty obraz, ziemniak, pieczony ziemniak, trujący ziemniak, marchewka, złota marchewka, marchewka na kiju, -ciasto dyniowe, mikstura widzenia w ciemności, mikstura niewidzialności, kwarc z Otchłani, ruda kwarcu z Otchłani, blok kwarcu, płyta z kwarcu, schody z kwarcu, rzeźbiony blok kwarcu, filarowy blok kwarcu, zaklęta księga, dywan.{*B*} -– Dodano nowe przepisy dla gładkiego piaskowca i rzeźbionego piaskowca.{*B*} -– Dodano nowe istoty – zombie osadnicy.{*B*} -– Dodano nowe elementy do generowania terenu – pustynne świątynie, pustynne wioski, świątynie w dżungli.{*B*} -– Dodano możliwość handlu z osadnikami.{*B*} -– Dodano interfejs kowadła.{*B*} -– Dodano możliwość farbowania skórzanych zbroi.{*B*} -– Dodano możliwość farbowania obroży wilków.{*B*} -– Dodano możliwość kierowania ujeżdżaną świnią za pomocą marchewki na kiju.{*B*} -– Zaktualizowano zawartość dodatkowej skrzyni, dodając więcej przedmiotów.{*B*} -– Zmieniono sposób umieszczania półbloków oraz innych bloków na półblokach.{*B*} -– Zmieniono sposób umieszczania odwróconych schodów i płyt.{*B*} -– Dodano nowe profesje osadników.{*B*} -– Osadnicy stworzeni z jaja tworzącego, będą mieli losową profesję.{*B*} -– Dodano możliwość układania drewna bokiem.{*B*} -– W piecach można teraz palić drewnianymi narzędziami.{*B*} -– Lód i szkło można zbierać za pomocą narzędzi zaklętych delikatnym dotykiem.{*B*} -– Drewniane przyciski i płyty naciskowe można aktywować strzałami.{*B*} -– Istoty z Otchłani mogą pojawić się w świecie zewnętrznym przez portal.{*B*} -– Czyhacze i pająki atakują ostatniego gracza, który je uderzył.{*B*} -– Istoty w trybie tworzenia przestają atakować po chwili.{*B*} -– Usunięto efekt odrzucenia podczas tonięcia.{*B*} -– Drzwi niszczone przez zombie pokazują ślady zniszczenia.{*B*} -– Lód topi się w Otchłani.{*B*} -– Kociołki napełniają się, gdy stoją na deszczu.{*B*} -– Tłoki aktualizują się dwa razy wolniej.{*B*} -– Osiodłana świnia zostawia siodło po śmierci.{*B*} -– Zmieniono kolor nieba w Kresie.{*B*} -– Nić można rozkładać na ziemi (jako linki).{*B*} -– Deszcz przecieka przez liście.{*B*} -– Dźwignie można umieszczać na spodach bloków.{*B*} -– Obrażenia zadawane przez trotyl zależą od poziomu trudności.{*B*} -– Zmieniono przepis książki.{*B*} -– Łódki niszczą lilie, a nie na odwrót.{*B*} -– Świnie dają więcej steków wieprzowych.{*B*} -– Szlamy pojawiają się rzadziej w superpłaskich światach.{*B*} -– Obrażenia czyhaczy za zależą od poziomu trudności, zwiększono efekt odrzucenia.{*B*} -– Kresostwory otwierają teraz usta.{*B*} -– Dodano możliwość teleportowania graczy (za pomocą {*BACK_BUTTON*} menu w grze).{*B*} -– Dodano nowe opcje hosta, umożliwiające danie latania, niewidzialności i niewrażliwości innym graczom.{*B*} -– Dodano nowe samouczki w świecie samouczka dla nowych przedmiotów i funkcji.{*B*} -– Zaktualizowano położenie skrzyń z płytami muzycznymi w świecie samouczka.{*B*} - + + Nie możesz dołączyć do tej gry, ponieważ żaden z graczy nie znajduje się na twojej liście znajomych. - - {*ETB*}Witaj ponownie! Być może umknęło to twojej uwadze, ale Minecraft został zaktualizowany.{*B*}{*B*} -Wprowadzono wiele nowych funkcji, które urozmaicą zabawę tobie i twoim znajomym. Poniżej znajduje się ich przegląd. Miłego czytania i dobrej zabawy!{*B*}{*B*} -{*T1*}Nowe przedmioty{*ETB*} – szmaragd, ruda szmaragdu, blok szmaragdu, skrzynia Kresu, haczyk na linkę, magiczne złote jabłko, kowadło, doniczka, murek z kamienia brukowego, murek z kamienia brukowego z mchem, uschnięty obraz, ziemniak, pieczony ziemniak, trujący ziemniak, marchewka, złota marchewka, marchewka na kiju, -ciasto dyniowe, mikstura widzenia w ciemności, mikstura niewidzialności, kwarc z Otchłani, ruda kwarcu z Otchłani, blok kwarcu, płyta z kwarcu z Otchłani, schody z kwarcu z Otchłani, rzeźbiony blok kwarcu z Otchłani, filarowy blok kwarcu z Otchłani, zaklęta księga, dywan.{*B*}{*B*} - {*T1*}Nowe istoty{*ETB*} – zombie osadnicy.{*B*}{*B*} -{*T1*}Nowe funkcje{*ETB*} – handluj z osadnikami, naprawiaj lub zaklinaj broń i narzędzia dzięki kowadłu, przechowuj przedmioty w skrzyniach Kresu, kieruj świnią, gdy na niej jedziesz, używając marchewki na kiju!{*B*}{*B*} -{*T1*}Nowe minisamouczki{*ETB*} – dowiedz się, jak korzystać z nowych funkcji w świecie samouczka!{*B*}{*B*} -{*T1*}Nowe sekrety{*ETB*} – przemieściliśmy wszystkie płyty muzyczne w świecie samouczka. Zobacz, czy uda ci się je znowu znaleźć!{*B*}{*B*} - + + Nie możesz dołączyć do tej gry, ponieważ wcześniej host cię wyrzucił. - - Zadaje więcej obrażeń niż uderzenie pięścią. + + Wyrzucono cię z gry za latanie - - Używana do wykopywania ziemi, trawy, piasku, żwiru oraz śniegu szybciej niż ręką. Łopaty są niezbędne do tworzenia śnieżek. + + Próba połączenia trwała zbyt długo - - Wymagany do wydobycia wszelkiego rodzaju kamiennych bloków i rud. + + Serwer jest pełny - - Używana do ścinania drewna szybciej niż przy użyciu ręki. + + W tym trybie pojawiają się przeciwnicy i będą zadawać graczowi zwiększone obrażenia. Uważaj na czyhacze, ponieważ i tak wybuchną, nawet kiedy się od nich odsuniesz! - - Używana do uprawiania bloków ziemi oraz trawy i przygotowania ich pod plony. + + Motywy - - Drewniane drzwi można otworzyć używając ich, uderzając w nie lub za pomocą czerwonego kamienia. + + Pakiety skórek - - Żelazne drzwi można otworzyć tylko czerwonym kamieniem, przyciskami lub przełącznikami. + + Znajomi znajomych mogą dołączać - - NOT USED + + Wyrzuć gracza - - NOT USED + + Czy na pewno chcesz wyrzucić tego gracza z gry? Nie będzie mógł ponownie dołączyć, dopóki nie zrestartujesz świata. - - NOT USED + + Pakiety obrazków - - NOT USED + + Nie możesz dołączyć do tej gry, ponieważ została ona ograniczona tylko do znajomych hosta. - - Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + Uszkodzona zawartość do pobrania - - Daje użytkownikowi 3 jednostki pancerza po założeniu. + + Ta zawartość do pobrania jest uszkodzona i nie można z niej korzystać. Musisz ją usunąć, a następnie zainstalować ponownie z menu sklepu Minecraft. - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Część twojej zawartości do pobrania jest uszkodzona i nie można z niej korzystać. Musisz ją usunąć, a następnie zainstalować ponownie z menu sklepu Minecraft. - - Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + Nie można dołączyć do gry - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Wybrano - - Daje użytkownikowi 5 jednostek pancerza po założeniu. + + Wybrana skórka: - - Daje użytkownikowi 4 jednostki pancerza po założeniu. + + Pobierz pełną wersję - - Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + Odblokuj pakiet tekstur - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Aby korzystać z wybranego pakietu tekstur, musisz go odblokować. +Odblokować go teraz? - - Daje użytkownikowi 6 jednostek pancerza po założeniu. + + Próbny pakiet tekstur - - Daje użytkownikowi 5 jednostek pancerza po założeniu. + + Ziarno - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Odblokuj pakiet skórek - - Daje użytkownikowi 2 jednostki pancerza po założeniu. + + Aby korzystać z wybranej skórki, musisz odblokować pakiet skórek. +Odblokować go teraz? - - Daje użytkownikowi 5 jednostek pancerza po założeniu. + + Korzystasz z próbnego pakietu tekstur. Nie będzie można zapisać tego świata, dopóki nie odblokujesz pełnej wersji. +Czy chcesz odblokować pełną wersję pakietu tekstur? - - Daje użytkownikowi 3 jednostki pancerza po założeniu. + + Pobierz pełną wersję - - Daje użytkownikowi 1 jednostkę pancerza po założeniu. + + Ten świat wykorzystuje pakiet łączony lub pakiet tekstur, którego nie posiadasz! +Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? - - Daje użytkownikowi 3 jednostki pancerza po założeniu. + + Pobierz próbną wersję - - Daje użytkownikowi 8 jednostek pancerza po założeniu. + + Brak pakietu tekstur - - Daje użytkownikowi 6 jednostek pancerza po założeniu. + + Odblokuj pełną wersję - - Daje użytkownikowi 3 jednostki pancerza po założeniu. + + Pobierz próbną wersję - - Sztabka, która może być użyta do wytwarzania narzędzi z danego materiału. Powstaje po przetopieniu rudy w piecu. + + Tryb gry został zmieniony - - Umożliwia przerobienie sztabek, klejnotów lub barwników na gotowe do rozmieszczenia bloki. Można ich używać jako kosztownych bloków do budowania lub przechowywania rudy. + + Po włączeniu tylko zaproszeni gracze będą mogli dołączyć. - - Wysyła ładunek elektryczny, gdy stanie na niej gracz, zwierzę lub potwór. Drewniane płyty naciskowe mogą być dodatkowo aktywowane, gdy coś zostanie na nich umieszczone. + + Po włączeniu znajomi twoich znajomych będą mogli dołączać do gry. - - Używane do tworzenia zajmujących mało miejsca schodów. + + Po włączeniu gracze będą mogli ranić innych graczy. Działa tylko w trybie przetrwania. - - Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + Normalny - - Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + Superpłaski - - Używana do oświetlania terenu. Pochodnie roztapiają śnieg i lód. + + Po włączeniu gra będzie grą sieciową. - - Używane jako materiał budowlany. Można z nich wytworzyć wiele różnych rzeczy. Powstają z dowolnego rodzaju drewna. + + Po wyłączeniu gracze, którzy dołączą do gry, nie będą mogli budować lub wydobywać, dopóki nie dostaną pozwolenia. - - Używany jako materiał budowlany. Nie działa na niego grawitacja, jak na zwykły piasek. + + Po włączeniu miejsca takie jak wioski i twierdze będą pojawiać się w świecie. - - Używany jako materiał budowlany. + + Po włączeniu zostanie wygenerowany całkowicie płaski świat zewnętrzny i Otchłań. - - Używany do wytwarzania pochodni, strzał, znaków, drabin, ogrodzeń oraz rączek narzędzi i broni. + + Po włączeniu, w pobliżu miejsca odrodzenia znajdzie się skrzynia z przydatnymi przedmiotami. - - Przyspiesza czas od dowolnego momentu nocy do dnia, jeżeli wszyscy gracze z danego świata położą się w łóżkach. Dodatkowo zmienia punkt odrodzenia gracza. -Kolor łóżka jest zawsze taki sam, bez względu na kolor użytej wełny. + + Po włączeniu ogień będzie mógł się rozprzestrzeniać na pobliskie łatwopalne bloki. - - Umożliwia wytwarzanie bardziej rozmaitych przedmiotów. + + Po włączeniu trotyl będzie wybuchać po aktywacji. - - Umożliwia przetapianie rudy, wytwarzanie węgla drzewnego i szkła oraz smażenie ryb i steków wieprzowych. + + Po włączeniu wygląd Otchłani zostanie wygenerowany ponownie. Jest to przydatne przy starszych zapisach gry, gdy fortece Otchłani nie były obecne. - - Przechowuje bloki i przedmioty. Umieść dwie skrzynie obok siebie, aby utworzyć wielką skrzynię o podwójnej pojemności. + + Wył. - - Używane do tworzenia barier, przez które nie można przeskoczyć. Ma 1,5 bloku wysokości dla graczy, zwierząt i potworów, ale 1 blok wysokości dla innych bloków. + + Tryb gry: Tworzenie - - Służy do poruszania się w pionie. + + Przetrwanie - - Można go otworzyć używając go, uderzając w niego lub za pomocą czerwonego kamienia. Działa jak normalne drzwi, ale ma wymiar jeden na jeden i leży na ziemi. + + Tworzenie - - Wyświetla wpisany przez ciebie lub innych graczy tekst. + + Zmień nazwę świata - - Wytwarza więcej światła niż pochodnie. Roztapia śnieg/lód i może być używany pod wodą. + + Podaj nową nazwę swojego świata - - Materiał wybuchowy. Aktywowany przez podpalenie go krzesiwem lub ładunkiem elektrycznym. + + Tryb gry: Przetrwanie - - Nalewa się do niej zupę grzybową. Zatrzymujesz miskę, gdy zupa zostanie zjedzona. + + Stworzone w trybie przetrwania - - Służy do przenoszenia wody, lawy i mleka. + + Zmień nazwę zapisu gry - - Służy do przenoszenia wody. + + Autozapis za %d... - - Służy do przenoszenia lawy. - - - Służy do przenoszenia mleka. + + Wł. - - Służy do rozpalania ognia, podpalania trotylu i otwarcia portalu, gdy zostanie zbudowany. + + Stworzone w trybie tworzenia - - Służy do łowienia ryb. + + Renderuj chmury - - Pokazuje położenie Słońca i Księżyca. + + Co chcesz zrobić z tym zapisem gry? - - Wskazuje twoje miejsce startu. + + Rozmiar interfejsu (podzielony ekran) - - Tworzy obraz odkrywanego obszaru, gdy trzyma się ją w ręku. Służy do odnajdywania drogi. + + Składnik - - Umożliwia atakowanie strzałami z dystansu. + + Opał - - Pocisk do łuku. + + Dozownik - - Odnawia 2,5{*ICON_SHANK_01*}. + + Skrzynia - - Odnawia 1{*ICON_SHANK_01*}. Można zjeść 6 razy. + + Zaklinanie - - Odnawia 1{*ICON_SHANK_01*}. + + Piec - - Odnawia 1{*ICON_SHANK_01*}. + + Aktualnie nie ma dostępnej zawartości do pobrania tego typu dla tej gry. - - Odnawia 3{*ICON_SHANK_01*}. + + Czy na pewno chcesz usunąć ten zapis gry? - - Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Może ci zaszkodzić. + + Oczekiwanie na akceptację - - Odnawia 3{*ICON_SHANK_01*}. Powstaje po usmażeniu kurczaka w piecu. + + Ocenzurowano - - Odnawia 1,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. + + Gracz %s dołącza do gry. - - Odnawia 4{*ICON_SHANK_01*}. Powstaje po usmażeniu wieprzowiny w piecu. + + Gracz %s opuszcza grę. - - Odnawia 1,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. + + Gracz %s zostaje wyrzucony z gry. - - Odnawia 4{*ICON_SHANK_01*}. Powstaje po usmażeniu steku wieprzowego w piecu. + + Stacja alchemiczna - - Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Można nakarmić nią ocelota, aby go oswoić. + + Wpisz tekst na znaku - - Odnawia 2,5{*ICON_SHANK_01*}. Powstaje po usmażeniu ryby w piecu. + + Wpisz tekst na swoim znaku - - Odnawia 2{*ICON_SHANK_01*}. Może być wykorzystane do wytworzenia złotego jabłka. + + Wpisz nazwę - - Odnawia 2{*ICON_SHANK_01*} i regeneruje zdrowie przez 4 sekundy. Powstaje z połączenia jabłka i samorodków złota. + + Koniec wersji próbnej - - Odnawia 2{*ICON_SHANK_01*}. Może ci zaszkodzić. + + Wybrana gra jest pełna - - Używany do pieczenia ciasta oraz jako składnik mikstur. + + Nie udało się dołączyć do gry, brak wolnych miejsc - - Wysyła ładunek elektryczny, gdy zostanie przełączona. Pozostaje przełączona do momentu ponownego użycia. + + Wpisz nazwę swojego postu - - Stale wysyła ładunek elektryczny lub może być użyta jako odbiornik/przekaźnik, gdy zostanie umieszczona obok bloku. -Daje też wątłe światło. + + Wpisz opis swojego postu - - Używany w obwodach z czerwonego kamienia jako powtarzacz, opóźniacz i/lub dioda. + + Ekwipunek - - Wysyła ładunek elektryczny, gdy zostanie wciśnięty. Pozostaje wciśnięty przez około sekundę, potem wyłącza się. + + Składniki - - Przechowuje i wystrzeliwuje przedmioty w losowej kolejności, gdy otrzyma zasilanie z czerwonego kamienia. + + Wpisz nagłówek - - Odgrywa nutę, gdy zostanie aktywowany. Uderz go, aby zmienić wysokość dźwięku. Umieszczenie na innym bloku zmieni instrument. + + Wpisz nagłówek swojego postu - - Służy jako droga dla wagoników. + + Wpisz opis - - Po zasileniu przyspiesza wagonik, który po nim przejedzie. Gdy nie jest zasilany, wagoniki się zatrzymują. + + Teraz gra: - - Działa jak płyta naciskowa (przesyła sygnał z czerwonego kamienia po zasileniu), ale może być aktywowany tylko przez wagonik. + + Czy na pewno chcesz dodać ten poziom do listy zablokowanych poziomów? +Wybranie „OK” spowoduje wyjście z gry. - - Służy do przewożenia ciebie, zwierząt lub potworów po torach. + + Usuń z listy zablokowanych poziomów - - Służy do transportowania materiałów po torach. + + Odstęp czasowy automatycznego zapisu - - Będzie poruszać się po torach i przepychać inne wagoniki, gdy będzie w nim węgiel. + + Zablokowany poziom - - Służy do poruszania się po wodzie. Szybsza niż pływanie. + + Gra, do której próbujesz dołączyć, znajduje się na twojej liście zablokowanych poziomów. +Jeżeli postanowisz dołączyć do tej gry, zostanie ona usunięta z twojej listy zablokowanych poziomów. - - Zdobywana z owiec, może być barwiona na różne kolory. + + Zablokować ten poziom? - - Używana jako materiał budowniczy. Może być barwiona na różne kolory. Ten przepis nie jest polecany, ponieważ wełnę można łatwo zdobyć z owiec. + + Odstęp czasowy automatycznego zapisu: WYŁ. - - Służy do zabarwienia wełny na czarno. + + Przezroczystość interfejsu - - Służy do zabarwienia wełny na zielono. + + Przygotowywanie do automatycznego zapisania poziomu - - Służy do zabarwienia wełny na brązowo, używany jako składnik ciasteczek lub do uprawy kakao. + + Rozmiar interfejsu - - Służy do zabarwienia wełny na srebrno. + + min - - Służy do zabarwienia wełny na żółto. + + Nie można tu umieścić! - - Służy do zabarwienia wełny na czerwono. + + Nie można umieścić źródła lawy w pobliżu miejsca odrodzenia na poziomie, ze względu na możliwość natychmiastowej śmierci graczy. - - Sprawia, że zboża, drzewa, wysoka trawa, duże grzyby i kwiaty wyrastają natychmiast. Może być użyta do barwienia. + + Ulubione skórki - - Służy do zabarwienia wełny na różowo. + + Gra gracza %s - - Służy do zabarwienia wełny na pomarańczowo. + + Gra nieznanego hosta - - Służy do zabarwienia wełny na limonkowo. + + Gość się wypisał - - Służy do zabarwienia wełny na szaro. + + Resetuj ustawienia - - Służy do zabarwienia wełny na jasnoszaro. -(Uwaga: jasnoszary barwnik może być stworzony poprzez połączenie szarego barwnika z mączką kostną, dzięki czemu możesz stworzyć cztery jasnoszare barwniki z każdego gruczołu atramentowego, zamiast trzech). + + Czy na pewno chcesz zresetować ustawienia do wartości standardowych? - - Służy do zabarwienia wełny na jasnoniebiesko. + + Błąd wczytywania - - Służy do zabarwienia wełny na błękitno. + + Jeden z gości się wypisał, co oznacza, że pozostali goście zostaną usunięci z gry. - - Służy do zabarwienia wełny na fioletowo. + + Nie udało się stworzyć gry - - Służy do zabarwienia wełny na wrzosowo. + + Automatyczny wybór - - Służy do zabarwienia wełny na niebiesko. + + Brak pakietu: standard. skórki - - Odtwarza płyty muzyczne. + + Wpisz się - - Służy do wytwarzania potężnych narzędzi, broni i elementów pancerza. + + Nie jesteś wpisany. Aby zagrać, musisz się wpisać. Chcesz się wpisać teraz? - - Wytwarza więcej światła niż pochodnie. Roztapia śnieg/lód i może być używany pod wodą. + + Tryb wieloosobowy niedostępny - - Służy do wytwarzania książek i map. + + Wypij - - Służy do tworzenia biblioteczek. Może być zaklęta, aby zmienić się w zaklętą księgę. + + + Na tym terenie znajduje się farma. Rolnictwo umożliwia ci wytwarzanie żywności oraz innych przedmiotów. - - Umożliwia wzmacnianie zaklęć, gdy znajdzie się przy magicznym stole. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o rolnictwie.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Służy do dekoracji. + + Pszenica, dynie i arbuzy wyrastają z ziaren i nasion. Ziarna pszenicy można zdobyć poprzez niszczenie wysokiej trawy lub zbieranie pszenicy, a nasiona dyni i arbuza robi się z dyń i arbuzów. - - Może być wydobywana za pomocą żelaznego lub lepszego kilofa, a następnie przetapiana na sztabki złota. + + Wciśnij{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs trybu tworzenia. - - Może być wydobywana za pomocą kamiennego lub lepszego kilofa, a następnie przetapiana na sztabki żelaza. + + Dostań się na drugą stronę dziury, aby kontynuować. - - Może być wydobyta za pomocą kilofa, aby zdobyć węgiel. + + Udało ci się ukończyć samouczek trybu tworzenia. - - Może być wydobyta za pomocą kamiennego lub lepszego kilofa, aby zdobyć lazuryt. + + Przed zasadzeniem ich w ziemi należy zamienić bloki ziemi na pole uprawne, używając motyki. Pobliskie źródło wody będzie nawadniać pola uprawne i sprawi, że zbiory będą rosły szybciej. Podobny efekt da oświetlenie terenu. - - Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć diamenty. + + Kaktus musi być zasadzony na piasku i wyrośnie na wysokość trzech bloków. Tak jak w przypadku trzciny cukrowej, ścięcie najniższego bloku sprawi, że spadną wszystkie bloki, które znajdowały się nad nim.{*ICON*}81{*/ICON*} - - Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć czerwony pył. + + Grzyby powinny być sadzone w słabo oświetlonych miejscach i będą się rozprzestrzeniać na pobliskie słabo oświetlone bloki.{*ICON*}39{*/ICON*} - - Może być wydobyty za pomocą kilofa, aby zyskać kamień brukowy. + + Mączka kostna sprawia, że zbiory wyrastają natychmiast, a grzyby zamieniają się w duże grzyby.{*ICON*}351:15{*/ICON*} - - Wydobywana za pomocą łopaty. Może być użyta do budowy. + + Pszenica przechodzi przez kilka faz wzrostu i można ją zebrać, gdy będzie miała ciemniejszy kolor.{*ICON*}59:7{*/ICON*} - - Może być zasadzona w ziemi. Z czasem wyrośnie z niej drzewo. + + Dynie i arbuzy potrzebują wolnego bloku obok miejsca do zasadzenia nasion, aby owoc mógł urosnąć, gdy łodyga w pełni się rozwinie. - - Nie może zostać zniszczona. + + Trzcina cukrowa może być zasadzona na bloku trawy, ziemi lub piasku, który znajduje się tuż obok bloku wody. Ścięcie bloku trzciny cukrowej sprawi, że spadną wszystkie bloki, które znajdowały się nad nim.{*ICON*}83{*/ICON*} - - Podpala wszystko, czego dotknie. Można ją zebrać w wiadrze. + + W trybie tworzenia masz dostęp do nieskończonej liczby wszystkich przedmiotów i bloków w grze. Dodatkowo możesz niszczyć wszystkie bloki jednym uderzeniem bez narzędzia, nic nie może ci zrobić krzywdy i możesz latać. - - Wydobywany łopatą. Może być przetopiony na szkło w piecu. Oddziałuje na niego grawitacja, jeżeli pod spodem nie ma żadnego bloku. + + + W skrzyniach na tym obszarze znajdują się składniki do tworzenia obwodów z tłokami. Użyj ich, aby dokończyć obwody, lub stwórz własny. Poza obszarem samouczka znajdziesz inne przykłady. - - Wydobywany łopatą. Czasami podczas wykopywania możesz natrafić na krzemień. Oddziałuje na niego grawitacja, jeżeli pod spodem nie ma żadnego bloku. + + + Na tym terenie znajduje się portal do Otchłani! - - Ścinane siekierą. Może być przerobione na deski lub wykorzystane jako opał. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat portalów i Otchłani.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Powstaje w piecu po przetopieniu piasku. Może być wykorzystane do budowy, ale rozbije się, jeżeli spróbujesz je odzyskać. + + + Czerwony pył zdobywa się przez wydobywanie rudy czerwonego kamienia żelaznym, złotym lub diamentowym kilofem. Przenosi zasilanie na odległość 15 bloków. Może przenieść ładunek jeden blok w górę lub w dół. + {*ICON*}331{*/ICON*} - - Wydobywany z kamienia za pomocą kilofa. Może być użyty do budowy pieca i wytwarzania kamiennych narzędzi. + + + Powtarzacze z czerwonego kamienia mogą wydłużyć dystans, na jaki przeniesione jest zasilanie, lub opóźnić obwód. + {*ICON*}356{*/ICON*} - - Wypalane z gliny w piecu. + + + Po zasileniu tłok się wysunie, przepychając do 12 bloków. Cofające się lepkie tłoki mogą przeciągnąć ze sobą jeden blok. + {*ICON*}33{*/ICON*} - - Tworzy cegły po wypaleniu w piecu. + + + Portale buduje się, tworząc szeroki na 4 bloki i wysoki na 5 bloków szkielet z obsydianu. Narożne bloki nie są wymagane. - - Po rozbiciu daje kulki gliny, które po wypaleniu w piecu tworzą cegły. + + + Otchłań może być użyta do szybkiej podróży przez świat wewnętrzny – jeden przebyty blok w Otchłani, to trzy bloki w świecie zewnętrznym. - - Sprawny sposób przechowywania śnieżek. + + + Jesteś teraz w trybie tworzenia. - - Może być wydobyty łopatą, aby zyskać śnieżki. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o trybie tworzenia.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Czasami po wydobyciu daje ziarna pszenicy. + + + Aby aktywować portal do Otchłani, musisz podpalić bloki obsydianu za pomocą krzesiwa. Portale wyłączają się gdy ich szkielet zostanie zniszczony, w pobliżu nastąpi wybuch lub przepłynie przez nie ciecz. + - - Można przerobić na barwnik. + + + Aby użyć portalu do Otchłani, wejdź do niego. Ekran zrobi się fioletowy i rozlegnie się dźwięk. Po kilku sekundach znajdziesz się w innym wymiarze. - - Po połączeniu z miską daje gulasz. + + + Otchłań to niebezpieczne, wypełnione lawą miejsce. Można tam znaleźć skałę Otchłani, która płonie wiecznie, gdy się ją podpali, oraz jasnogłaz, który daje światło. - - Może być wydobywany wyłącznie diamentowym kilofem. Powstaje w wyniku połączenia wody z lawą, używa się go do budowy portalu. + + Udało ci się ukończyć samouczek rolnictwa. - - Tworzy w świecie potwory. + + Różne narzędzia nadają się do wydobywania różnych materiałów. Używaj siekiery, aby ścinać drzewa. - - Umieszcza się go na ziemi w celu przenoszenia ładunku elektrycznego. Po dodaniu jako składnik mikstury, przedłuży czas działania jej efektu. + + Różne narzędzia nadają się do wydobywania różnych materiałów. Używaj kilofa, aby wydobywać kamień i rudy. Aby zdobywać surowce z niektórych bloków, potrzebny jest kilof z lepszych materiałów. - - Po zebraniu daje pszenicę, gdy wyrośnie w pełni. + + Niektóre narzędzia są lepsze podczas atakowania przeciwników. Użyj miecza, aby atakować. - - Ziemia przygotowana do sadzenia ziaren. + + Żelazne golemy można także znaleźć w wioskach, które ochraniają. Zaatakują cię, jeżeli ty zaatakujesz osadników. - - Po ugotowaniu w piecu daje zielony barwnik. + + Nie możesz opuścić tego obszaru, dopóki nie ukończysz samouczka. - - Służy do wytwarzania cukru. + + Różne narzędzia nadają się do wydobywania różnych materiałów. Używaj łopaty, aby wydobywać miękkie materiały, jak ziemia lub piasek. - - Może być używana jako hełm albo połączona z pochodnią, co stworzy dyniowy lampion. Jest głównym składnikiem ciasta dyniowego. + + Podpowiedź: Przytrzymaj{*CONTROLLER_ACTION_ACTION*}, aby wydobywać albo ścinać ręką lub przedmiotem trzymanym w ręku. Do wydobycia niektórych bloków konieczne może być wytworzenie narzędzia... - - Po podpaleniu będzie płonąć wiecznie. + + W skrzyni w pobliżu rzeki znajdziesz łódkę. Aby skorzystać z łódki, wyceluj w wodę i wciśnij{*CONTROLLER_ACTION_USE*}. Użyj{*CONTROLLER_ACTION_USE*}, celując w łódkę, aby do niej wsiąść. - - Spowalnia wszystko, co się po nim porusza. + + W skrzyni w pobliżu stawu znajdziesz wędkę. Wyjmij ją ze skrzyni i wybierz jako aktualnie używany przedmiot, aby z niej skorzystać. - - Wejście do portalu umożliwia ci przenoszenie się między światem zewnętrznym a Otchłanią. + + Ten bardziej zaawansowany mechanizm tłokowy tworzy automatyczny most! Wciśnij przycisk, aby go aktywować, a następnie zobacz, jak działają wszystkie elementy, aby dowiedzieć się więcej. - - Używany do rozpalania pieca lub tworzenia pochodni. + + Narzędzie, którego używasz, zostało uszkodzone. Za każdym razem, gdy używasz narzędzia, uszkadza się ono coraz bardziej, a po pewnym czasie się psuje. Kolorowy pasek poniżej przedmiotu w twoim ekwipunku pokazuje jego aktualną wytrzymałość. - - Do zebrania po zabiciu pająka, można zrobić z niej łuk lub wędkę. Po umieszczeniu na ziemi może służyć za linkę. + + Przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby płynąć do góry. - - Do zebrania po zabiciu kury. Można zrobić z niego strzałę. + + Na tym obszarze znajdziesz wagonik na torze. Aby wsiąść do wagonika, wyceluj w niego i wciśnij{*CONTROLLER_ACTION_USE*}. Użyj{*CONTROLLER_ACTION_USE*} na przycisku, aby poruszyć wagonik. - - Do zebrania po zabiciu czyhacza. Można zrobić z niego trotyl lub użyć jako składnika do warzenia mikstur. + + Żelazne golemy powstają po ułożeniu czterech bloków żelaza we wskazanym kształcie i umieszczeniu dyni na szczycie środkowego bloku. Atakują one twoich wrogów. - - Po zasadzeniu w zaoranej ziemi wyrośnie z nich zboże. Upewnij się, że mają dostatecznie dużo światła. + + Nakarm krowę, grzybową krowę lub owcę pszenicą, świnię marchewką, kurę ziarnami pszenicy lub naroślą z Otchłani, a wilka dowolnym mięsem, a rozpoczną one poszukiwania innego zwierzęcia ze swojego gatunku, które także jest w miłosnym nastroju. - - Zdobywana ze zboża, może być użyta do produkcji jedzenia. + + Gdy zwierzęta tego samego gatunku się spotkają i oba są w miłosnym nastroju, pocałują się i po chwili pojawi się małe zwierzę. Małe zwierzę będzie podążało za rodzicami, dopóki nie dorośnie. - - Do zebrania po wykopaniu żwiru. Może być użyty do stworzenia krzesiwa. + + Po przeminięciu miłosnego nastroju zwierzę nie będzie mogło osiągnąć go ponownie przez około 5 minut. - - Umożliwia jeżdżenie na świni. Świnią można kierować dzięki marchewce na kiju. + + + Na tym obszarze zwierzęta zostały zamknięte. Możesz je rozmnażać, aby mieć małe zwierzątka. - - Do zebrania po wykopywaniu śniegu. Można nimi rzucać. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o zwierzętach i rozmnażaniu.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Do zebrania po zabiciu krowy. Można z niej zrobić książkę lub elementy pancerza. + + Aby zwierzęta się rozmnażały, musisz nakarmić je odpowiednim jedzeniem, co wprowadzi je w miłosny nastrój. - - Do zebrania po zabiciu szlamu. Służy jako składnik do warzenia mikstur lub element lepkiego tłoka. + + Niektóre zwierzęta pójdą za tobą, jeżeli trzymasz ich pożywienie w ręku. Dzięki temu łatwiej grupować zwierzęta, gdy chcesz je rozmnażać.{*ICON*}296{*/ICON*} - - Losowo zostawiane przez kury. Można z nich robić jedzenie. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o golemach.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Do zebrania po wydobyciu jasnogłazu. Może być użyty do stworzenia bloku jasnogłazu lub do wzmocnienia siły mikstury. + + Golemy powstają po umieszczeniu dyni na szczycie stosu bloków. - - Do zebrania po zabiciu kościotrupa. Może być przerobiona na mączkę kostną. Można dać ją wilkowi, aby go oswoić. + + Śnieżny golem powstaje po ustawieniu na sobie dwóch bloków śniegu i umieszczeniu na nich dyni. Będzie rzucać śnieżkami w twoich przeciwników. - - Do zebrania po zabiciu czyhacza przez kościotrupa. Można ją odtworzyć w szafie grającej. + + + Dzikie wilki można oswoić za pomocą kości. Po oswojeniu pojawią się przy nich serduszka. Oswojone wilki będą podążać za graczem i ochraniać go, jeżeli nie otrzymały polecenia pozostania. - - Gasi ogień i pomaga uprawom rosnąć. Można ją zebrać w wiadrze. + + Udało ci się ukończyć samouczek zwierząt i rozmnażania. - - Po zniszczeniu czasami upuszczają sadzonkę, z której wyrośnie drzewo, jeżeli się ją zasadzi. + + + Na tym terenie znajdziesz dynie oraz bloki, z których można zbudować śnieżnego i żelaznego golema. - - Do znalezienia w lochach. Służy do budowy i dekoracji. + + + Położenie i kierunek umieszczenia źródła zasilania może zmienić jego oddziaływanie na inne bloki. Przykładowo, pochodnia z czerwonego pyłu znajdująca się z boku danego bloku może zostać wyłączona, jeżeli blok zostanie zasilony z innego źródła. - - Służą do pozyskiwania wełny z owiec i bloków liści. - - - Po zasileniu (za pomocą przycisku, dźwigni, płyty naciskowej, pochodni z czerwonym pyłem lub czerwonego pyłu połączonego z każdą z tych rzeczy) tłok wysuwa się, jeżeli może, i przesuwa bloki. + + + Jeżeli kociołek zrobi się pusty, możesz go napełnić wodą z wiadra. - - Po zasileniu (za pomocą przycisku, dźwigni, płyty naciskowej, pochodni z czerwonym pyłem lub czerwonego pyłu połączonego z każdą z tych rzeczy) tłok wysuwa się, jeżeli może, i przesuwa bloki. Gdy się cofa, przeciąga blok przyczepiony do wysuniętego elementu. + + + Skorzystaj ze stacji alchemicznej, aby stworzyć miksturę odporności na ogień. Będzie ci potrzebna butelka z wodą, narośl z Otchłani oraz magmowy krem. - - Powstają z kamiennych bloków. Można je znaleźć w twierdzach. + + + Trzymając miksturę w ręku, przytrzymaj{*CONTROLLER_ACTION_USE*}, aby z niej skorzystać. W przypadku normalnej mikstury wypijesz ją i otrzymasz jej efekt. W przypadku mikstury rozpryskowej, rzucisz nią i nałożysz jej efekt na wszystkie istoty znajdujące się w pobliżu miejsca trafienia. + Mikstury rozpryskowe powstają po dodaniu prochu strzelniczego do zwykłej mikstury. - - Używane do ogradzania terenu. + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat warzenia i mikstur.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Podobna do drzwi, ale używana głównie przy ogrodzeniach. + + + Pierwszym etapem warzenia mikstur jest stworzenie butelki z wodą. Wyjmij szklaną butelkę ze skrzyni. - - Można go stworzyć z kawałków arbuza. + + + Możesz napełnić szklaną butelkę wodą z kociołka lub wykorzystując blok wody. Napełnij szklaną butelkę, celując w wodę i wciskając{*CONTROLLER_ACTION_USE*}. - - Przezroczysty blok, który może zastąpić bloki szkła. + + + Użyj na sobie mikstury odporności na ogień. - - Po zasadzeniu wyrastają z nich dynie. + + + Aby nałożyć zaklęcie na przedmiot, umieść go w miejscu zaklinania. Broń, elementy pancerza i niektóre narzędzia mogą być zaklęte, co da im dodatkowe właściwości, jak zwiększoną odporność na obrażenia czy większą liczbę przedmiotów powstałych po wydobyciu bloku. - - Po zasadzeniu wyrastają z nich arbuzy. + + + Gdy przedmiot zostanie umieszczony w miejscu zaklinania, przyciski po prawej pokażą szereg losowych zaklęć. - - Do zdobycia po zabiciu kresostworów. Po rzuceniu gracz zostanie przeniesiony w miejsce, w którym wylądowała perła Kresu, i straci trochę zdrowia. + + + Liczba wyświetlona na przycisku wskazuje koszt zaklęcia w poziomach doświadczenia. Jeżeli nie masz wystarczająco wysokiego poziomu, przycisk będzie nieaktywny. - - Blok ziemi z trawą rosnącą na górze. Wydobywany łopatą. Może być użyty do budowy. + + + Teraz, gdy ogień i lawa nie są dla ciebie groźne, możesz dostać się do wcześniej niedostępnych miejsc. - - Służy do budowy i dekoracji. + + + Oto interfejs zaklinania, który służy do dodawania zaklęć do broni, elementów pancerza i niektórych narzędzi. - - Spowalnia ruch podczas przechodzenia przez nią. Można ją zniszczyć nożycami, aby zdobyć nić. + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat interfejsu zaklinania.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Po zniszczeniu przywołuje rybika. Może także przywołać rybika, jeżeli w pobliżu jest atakowany inny rybik. + + + W tym miejscu znajduje się stacja alchemiczna, kociołek i skrzynia wypełniona składnikami do warzenia mikstur. - - Rosną po zasadzeniu. Można je zebrać nożycami. Można się po nich wspinać jak po drabinie. + + + Węgiel drzewny może być użyty do rozpalenia w piecu albo stworzenia pochodni, po połączeniu z kijem. - - Powoduje poślizg. Zmienia się w wodę, jeżeli zostanie zniszczony nad innym blokiem. Roztapia się, jeżeli znajduje się dostatecznie blisko źródła światła lub w Otchłani. + + + Użycie piasku jako składnika umożliwi stworzenie szkła. Stwórz trochę szkła i użyj go do zrobienia okien. - - Może być użyty jako dekoracja. + + + Oto interfejs warzenia. Dzięki niemu możesz stworzyć mikstury o różnorodnym działaniu. - - Używana jako składnik do warzenia mikstur i lokalizowania twierdz. Upuszczane przez płomienie, które przebywają w pobliżu lub wewnątrz fortec Otchłani. + + + Wiele drewnianych przedmiotów może posłużyć za opał, ale nie wszystko pali się tak samo długo. W czasie gry znajdziesz inne przedmioty, które mogą posłużyć za opał. - - Używana jako składnik do warzenia mikstur. Do zdobycia po zabiciu duchów. + + + Gdy przedmioty zostaną przetworzone, możesz je przenieść do ekwipunku. Poeksperymentuj z różnymi składnikami, aby zobaczyć, co uda ci się zrobić. - - Do zdobycia po zabiciu zombie świnioludów. Zombie świnioludy można znaleźć w Otchłani. Używana jako składnik do warzenia mikstur. + + + Jeżeli użyjesz drewna jako składnika, możesz zrobić węgiel drzewny. Umieść opał w piecu, a drewno jako składnik. Stworzenie węgla drzewnego potrwa chwilę, więc możesz zrobić coś innego i wrócić za jakiś czas. - - Używana jako składnik do warzenia mikstur. Ich naturalnym środowiskiem są fortece Otchłani. Mogą być zasadzone na piasku dusz. + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać ze stacji alchemicznej. - - Ma różne efekty po użyciu, w zależności od tego, na czym się jej użyje. + + + Dodanie sfermentowanego oka pająka czyni miksturę szkodliwą i może sprawić, że będzie miała odwrotny efekt. Dodanie prochu strzelniczego zmienia miksturę w miksturę rozpryskową, którą można rzucić, aby jej efekt zadziałał na docelowym obszarze. - - Można ją napełnić wodą – będzie podstawą do stworzenia mikstur w stacji alchemicznej. + + + Stwórz miksturę odporności na ogień, najpierw dodając do butelki z wodą narośl z Otchłani, a następnie magmowy krem. - - Trujące jedzenie i składnik alchemiczny. Do zdobycia po zabiciu pająka lub jaskiniowego pająka. + + + Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs warzenia. - - Używane jako składnik do warzenia mikstur, głównie ze szkodliwym skutkiem. + + + Mikstury warzy się poprzez umieszczenie składnika w górnym miejscu oraz mikstur lub butelek z wodą w dolnych miejscach (jednocześnie można warzyć do trzech mikstur). Gdy w stacji alchemicznej znajdzie się odpowiednia kombinacja, rozpocznie się proces warzenia, a po chwili powstanie mikstura. - - Używany jako składnik do warzenia mikstur. Może być połączony z innymi przedmiotami, aby wytworzyć Oko Kresu lub magmowy krem. + + + Podstawowym składnikiem wszystkich mikstur jest butelka z wodą. Większość mikstur powstaje przez wykorzystanie narośli z Otchłani, co da dziwną miksturę, z której po dodaniu kolejnego składnika powstanie właściwa mikstura. - - Używany jako składnik do warzenia mikstur. + + + Gdy będziesz już w posiadaniu mikstury, możliwe będzie modyfikowanie jej efektów. Dodanie czerwonego pyłu wydłuży czas działania, a jasnopyłu - wzmocni jej efekt. - - Używana do warzenia mikstur i mikstur rozpryskowych. + + + Wybierz zaklęcie i wciśnij{*CONTROLLER_VK_A*}, aby zakląć przedmiot. Obniży to twój poziom doświadczenia o koszt zaklęcia. - - Może być napełniony deszczem lub wodą z wiadra. Następnie można z niego napełniać wodą szklane butelki. + + + Wciśnij{*CONTROLLER_ACTION_USE*}, aby zacząć łowić. Wciśnij{*CONTROLLER_ACTION_USE*} ponownie, aby ściągnąć żyłkę. + {*FishingRodIcon*} - - Po rzuceniu wskaże kierunek do portalu Kresu. Po umieszczeniu dwunastu sztuk w szkielecie portalu Kresu, zostanie on aktywowany. + + + Jeżeli zaczekasz, aż spławik zanurzy się pod powierzchnię wody zanim ściągniesz żyłkę, może udać ci się złapać rybę. Rybę można zjeść na surowo lub usmażyć w piecu. Odnawia ona zdrowie. + {*FishIcon*} - - Używany jako składnik do warzenia mikstur. + + + Podobnie jak inne narzędzia, wędka ma ograniczoną liczbę użyć. Użycia te nie są ograniczone do schwytania ryb. Poeksperymentuj z nią, aby zobaczyć, co uda ci się złowić lub aktywować... + {*FishingRodIcon*} - - Podobna do trawy, ale świetnie nadaje się do sadzenia grzybów. + + + Łódki umożliwiają ci szybkie poruszanie się po wodzie. Możesz sterować za pomocą{*CONTROLLER_ACTION_MOVE*} oraz{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} - - Unosi się na wodzie. Można po niej chodzić. + + + Korzystasz z wędki. Wciśnij{*CONTROLLER_ACTION_USE*}, aby jej użyć.{*FishingRodIcon*} - - Z niej zbudowane są fortece Otchłani. Nie działają na nie ogniste kule duchów. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o łowieniu ryb.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Występują w fortecach Otchłani. + + + To łóżko. Wciśnij{*CONTROLLER_ACTION_USE*}, celując w nie w nocy, aby się położyć i obudzić rano.{*ICON*}355{*/ICON*} - - Występuje w fortecach Otchłani. Po zniszczeniu da narośl z Otchłani. + + + Na tym obszarze znajdziesz kilka prostych obwodów z czerwonego kamienia i tłoków, a także skrzynie z przedmiotami, które pomogą ci je przedłużyć. - - Umożliwia graczowi zaklinanie mieczy, kilofów, siekier, łopat, łuków oraz elementów pancerza. Wykorzystuje poziomy doświadczenia gracza. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat obwodów z czerwonego kamienia i tłoków.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Aktywowany za pomocą dwunastu Oczu Kresu. Umożliwia graczowi podróż do Kresu. + + + Dźwignie, przyciski, płyty naciskowe i pochodnie z czerwonym pyłem dostarczają zasilanie do obwodów, albo poprzez bezpośrednie podłączenie ich do obiektu, który chcesz aktywować, lub przez połączenie ich za pomocą czerwonego pyłu. - - Tworzy portal Kresu. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o łóżkach.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Blok występujący w Kresie. Jest bardzo odporny na wybuchy, więc nadaje się na budulec. + + + Łóżko powinno zostać umieszczone w bezpiecznym, dobrze oświetlonym miejscu, aby potwory nie obudziły cię w środku nocy. Jeżeli zginiesz po użyciu łóżka, odrodzisz się przy nim. + {*ICON*}355{*/ICON*} - - Ten blok powstaje po pokonaniu Kresosmoka. + + + Jeżeli w twojej grze znajdują się inni gracze, wszyscy muszą się położyć w tym samym czasie, aby zapaść w sen. + {*ICON*}355{*/ICON*} - - Po rzuceniu wypuszcza kule doświadczenia, które podnoszą twój poziom doświadczenia. + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o łódkach.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Przydatny do podpalania rzeczy lub wywoływania pożarów na odległość, po wystrzeleniu z dozownika. + + + Magiczny stół umożliwia ci dodawanie specjalnych efektów, takich jak zwiększona odporność na obrażenia czy większa liczba przedmiotów powstałych po wydobyciu bloku. Zaklinać można broń, elementy pancerza i niektóre narzędzia. - - Służy do przechowywania umieszczonego w niej przedmiotu lub bloku. + + + Umieszczenie biblioteczek wokół magicznego stołu zwiększa jego siłę i daje dostęp do potężniejszych zaklęć. - - Przywołuje potwory określonego rodzaju. + + + Zaklinanie przedmiotów kosztuje poziomy doświadczenia, które zwiększa się dzięki kulom doświadczenia. Zdobywa się je przez zabijanie potworów i zwierząt, wydobywanie rudy, rozmnażanie zwierząt, łowienie ryb i przetapianie/smażenie rzeczy w piecu. - - Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + + Mimo że zaklęcia są zawsze losowe, niektóre z potężniejszych są dostępne tylko, gdy masz dostatecznie wysoki poziom doświadczenia, a wokół magicznego stołu znajduje się odpowiednio dużo biblioteczek, które wzmacniają jego moc. - - Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + + Znajdziesz tu magiczny stół oraz inne przedmioty, które pomogą ci w nauce zaklinania. - - Powstaje po przetopieniu skały Otchłani w piecu. Można z niej zrobić blok cegły Otchłani. + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat zaklinania.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Po zasileniu emituje światło. + + + Możesz także zwiększyć swój poziom doświadczenia dzięki zaklętej butelce, która po rzuceniu tworzy kule doświadczenia w miejscu, w którym wyląduje. Kule te można zebrać. - - Można zbierać z nich ziarna kakao. + + + Wagoniki jeżdżą po torach. Możesz także stworzyć napędzany wagonik, umieszczając w nim piec, oraz wagonik ze skrzynią. + {*RailIcon*} - - Głowy istot mogą być użyte jako dekoracja lub noszone jako maska, po umieszczeniu w miejscu hełmu. + + + Można także stworzyć zasilane tory, które pobierają energię z pochodni z czerwonym pyłem, aby przyspieszyć wagonik. Można je podłączyć do przycisków, dźwigni i płyt naciskowych, aby tworzyć skomplikowane konstrukcje. + {*PoweredRailIcon*} - - Kałamarnica + + + Płyniesz łódką. Aby wysiąść z łódki, wyceluj w nią i wciśnij{*CONTROLLER_ACTION_USE*}. {*BoatIcon*} - - Po zabiciu zostawia gruczoły atramentowe. + + + W znajdujących się tu skrzyniach znajdziesz kilka zaklętych przedmiotów, zaklętych butelek oraz przedmiotów, które jeszcze nie zostały zaklęte, abyś mógł poeksperymentować z magicznym stołem. - - Krowa + + + Jedziesz wagonikiem. Aby z niego wysiąść, wyceluj w niego i wciśnij{*CONTROLLER_ACTION_USE*} . {*MinecartIcon*} - - Po zabiciu zostawia skórę. Można ją wydoić, używając wiadra. + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o wagonikach.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Owca + + Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, możesz wyrzucić ten przedmiot. - - Po strzyżeniu (jeżeli jeszcze nie została ostrzyżona) daje wełnę. Można ją ufarbować na inny kolor. + + Przeczytaj - - Kura + + Powieś - - Po zabiciu zostawia pióro. Co jakiś czas składa jajo. + + Rzuć - - Świnia + + Otwórz - - Po zabiciu zostawia steki wieprzowe. Można na niej jeździć w siodle. + + Zmień wysokość - - Wilk + + Wysadź - - Nieagresywny, ale zaatakuje cię, gdy ty zaatakujesz jego. Można go oswoić, używając kości. Będzie wtedy za tobą podążał i atakował wszystko, co atakuje ciebie. + + Zasadź - - Czyhacz + + Odblokuj pełną wersję gry - - Wybucha, jeżeli podejdziesz za blisko. + + Usuń zapis gry - - Kościotrup + + Usuń - - Strzela w ciebie strzałami. Upuszcza je po zabiciu. + + Uprawiaj ziemię - - Pająk + + Zbieraj - - Atakuje cię, gdy podejdziesz blisko. Może chodzić po ścianach. Po zabiciu upuszcza nić. + + Kontynuuj - - Zombie + + Płyń w górę - - Atakuje cię, gdy podejdziesz blisko. + + Uderz - - Zombie świniolud + + Wydój - - Nieagresywny, ale zaatakuje cię w grupie, gdy zaatakujesz jednego z nich. + + Zbierz - - Duch + + Opróżnij - - Strzela w ciebie ognistymi kulami, które wybuchają. + + Osiodłaj - - Szlam + + Odłóż - - Rozpada się na mniejsze kawałki, gdy zostanie uderzony. + + Zjedz - - Kresostwór + + Jedź - - Zaatakuje cię, gdy na niego spojrzysz. Potrafi także przenosić bloki. + + Płyń - - Rybik + + Przyspiesz wzrost - - Przywołuje pobliskie rybiki, gdy zostanie zaatakowany. Ukrywa się w kamiennych blokach. + + Śpij - - Jaskiniowy pająk + + Obudź się - - Jego ukąszenia są trujące. + + Graj - - Grzybowa krowa + + Opcje - - Daje zupę grzybową po użyciu miski. Po ostrzyżeniu zostawia grzyby i zmienia się w zwykłą krowę. + + Przenieś pancerz - - Śnieżny golem + + Przenieś broń - - Śnieżne golemy mogą być stworzone z bloków śniegu i dyń. Będą rzucać śnieżkami w przeciwników swojego stwórcy. + + Wyposaż - - Kresosmok + + Przenieś składnik - - Wielki czarny smok, który przebywa w Kresie. + + Przenieś opał - - Płomień + + Przenieś narzędzie - - Ci przeciwnicy występują w Otchłani, głównie w fortecach. Po zabiciu zostawiają płomienne różdżki. + + Naciągnij - - Kostka magmy + + Strona w górę - - Można je znaleźć w Otchłani. Podobnie jak szlamy, będą się rozpadać na mniejsze kawałki, gdy zostaną uderzone. + + Strona w dół - - Osadnik + + Miłosny nastrój - - Ocelot + + Zwolnij - - Żyją w dżungli. Można je oswoić, używając surowych ryb. Ocelot musi sam do ciebie podejść, ponieważ boi się gwałtownych ruchów. + + Przywileje - - Żelazny golem + + Blok - - Występują w wioskach i bronią ich. Można ich stworzyć z bloków żelaza i dyń. + + Tworzenie - - Animator wybuchów + + Zablokuj poziom - - Grafik koncepcyjny + + Wybierz skórkę - - Przeliczanie liczb i statystyki + + Podpal - - Koordynator gnębicieli + + Zaproś znajomych - - Pierwotny projekt i programowanie + + Akceptuj - - Menadżer projektu/producent + + Ostrzyż - - Reszta biura Mojang + + Nawiguj - - Główny programista Minecraft PC + + Zainstaluj ponownie - - Koder ninja + + Zap. opcje - - Prezes + + Wykonaj polecenie - - Biały kołnierzyk + + Zainstaluj pełną wersję - - Obsługa klienta + + Zainstaluj próbną wersję - - Biurowy DJ + + Instaluj - - Projektant/programista Minecraft – Pocket Edition + + Wyrzuć - - Producent + + Odśwież listę gier sieciowych - - Główny architekt + + Gry drużynowe - - Projektant graficzny + + Wszystkie gry - - Rzemieślnik gry + + Wyjdź - - Kierownik zabawy + + Anuluj - - Muzyka i dźwięki + + Anuluj dołączanie - - Programowanie + + Zmień grupę - - Grafika + + Wytwarzanie - - QA + + Stwórz - - Producent wykonawczy + + Podnieś/odłóż - - Główny producent + + Pokaż ekwipunek - - Producent + + Pokaż opis - - Kierownik testów + + Pokaż składniki - - Główny tester + + Cofn. - - Zespół projektancki + + Przypomnienie: - - Zespół deweloperski + + - - Zarządzanie projektem + + W najnowszej wersji dodano nowe elementy do gry, wliczając w to nowe obszary w świecie samouczka. - - Dyrektor publikacji XBLA + + Nie posiadasz wszystkich składników niezbędnych do stworzenia tego przedmiotu. Okno w lewym dolnym rogu pokazuje składniki niezbędne do jego wytworzenia. - - Rozwój biznesu + + + Gratulacje, udało ci się ukończyć samouczek. Czas w grze upływa teraz normalnie, ale nie zostało ci dużo czasu do zapadnięcia nocy – wtedy pojawiają się potwory! Wykończ swoje schronienie! - - Dyrektor ds. finansów + + {*EXIT_PICTURE*} Gdy będziesz gotów powędrować dalej, w pobliżu schronienia górnika znajdziesz schody, które zaprowadzą cię do niewielkiego zamku. - - Menadżer produktu + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby rozegrać samouczek normalnie.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, aby pominąć samouczek. - - Marketing + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat wskaźnika najedzenia i żywności.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - - Menadżer ds. społeczności + + Wyb. - - Europejski zespół ds. lokalizacji + + Użyj - - Zespół ds. lokalizacji z Redmond + + W tej okolicy znajdują się obszary przygotowane do tego, aby pomóc ci dowiedzieć się więcej na temat łowienia, łódek, tłoków i czerwonego kamienia. - - Azjatycki zespół ds. lokalizacji + + Dalej znajdują się przykłady dotyczące budowy, rolnictwa, wagoników i torów, zaklinania, warzenia, handlu, kowalstwa i innych rzeczy! - - Zespół ds. badania opinii użytkowników + + + Twój wskaźnik najedzenia spadł do tak niskiego poziomu, że automatyczne leczenie przestało działać. - - Główne zespoły MGS + + Weź - - Tester akceptacji punktów milowych projektu + + Dalej - - Specjalne podziękowania + + Wstecz - - Menadżer testów + + Wyrzuć gracza - - Starszy kierownik testów + + Wyślij zaproszenie do znajomych - - SDET + + Strona w dół - - STE projektu + + Strona w górę - - Dodatkowe STE + + Farbuj - - Dodatkowe testy + + Ulecz - - Jon Kågström + + Usiądź - - Tobias Möllstam + + Chodź za mną - - Risë Lugo + + Wydobywaj - - Drewniany miecz + + Nakarm - - Kamienny miecz + + Oswój - - Żelazny miecz + + Zmień filtr - - Diamentowy miecz + + Odłóż wszystko - - Złoty miecz + + Odłóż jedno - - Drewniana łopata + + Upuść - - Kamienna łopata + + Weź wszystko - - Żelazna łopata + + Weź połowę - - Diamentowa łopata + + Odłóż - - Złota łopata + + Upuść wszystko - - Drewniany kilof + + Wyczyść szybki wybór - - Kamienny kilof + + Co to jest? - - Żelazny kilof + + Udostępnij na Facebooku - - Diamentowy kilof + + Upuść jedno - - Złoty kilof + + Zamień - - Drewniana siekiera + + Szybkie przeniesienie - - Kamienna siekiera + + Pakiety skórek - - Żelazna siekiera + + Zabarwiona szyba – czerwona - - Diamentowa siekiera + + Zabarwiona szyba – zielona - - Złota siekiera + + Zabarwiona szyba – brązowa - - Drewniana motyka + + Zabarwione szkło – białe - - Kamienna motyka + + Zabarwiona szyba - - Żelazna motyka + + Zabarwiona szyba – czarna - - Diamentowa motyka + + Zabarwiona szyba – niebieska - - Złota motyka + + Zabarwiona szyba – szara - - Drewniane drzwi + + Zabarwiona szyba – różowa - - Żelazne drzwi + + Zabarwiona szyba – limonkowa - - Kolczy hełm + + Zabarwiona szyba – fioletowa - - Kolczuga + + Zabarwiona szyba – błękitna - - Kolcze nogawice + + Zabarwiona szyba – jasnoszara - - Kolcze buty + + Zabarwione szkło – pomarańczowe - - Skórzany hełm + + Zabarwione szkło – niebieskie - - Żelazny hełm + + Zabarwione szkło – fioletowe - - Diamentowy hełm + + Zabarwione szkło – błękitne - - Złoty hełm + + Zabarwione szkło – czerwone - - Skórzana zbroja + + Zabarwione szkło – zielone - - Żelazny napierśnik + + Zabarwione szkło – brązowe - - Diamentowy napierś. + + Zabarwione szkło – jasnoszare - - Złoty napierśnik + + Zabarwione szkło – żółte - - Skórzane nogawice + + Zabarwione szkło – jasnoniebieskie - - Żelazne nogawice + + Zabarwione szkło – wrzosowe - - Diamentowe nogawice + + Zabarwione szkło – szare - - Złote nogawice + + Zabarwione szkło – różowe - - Skórzane buty + + Zabarwione szkło – limonkowe - - Żelazne buty + + Zabarwiona szyba – żółta - - Diamentowe buty + + Jasnoszary - - Złote buty + + Szary - - Sztabka żelaza + + Różowy - - Sztabka złota + + Niebieski - - Wiadro + + Fioletowy - - Wiadro z wodą + + Błękitny - - Wiadro z lawą + + Limonkowy - - Krzesiwo + + Pomarańczowy - - Jabłko + + Biały - - Łuk + + Spersonalizowany - - Strzała + + Żółty - - Węgiel + + Jasnoniebieski - - Węgiel drzewny + + Wrzosowy - - Diament + + Brązowy - - Kij + + Zabarwiona szyba – biała - - Miska + + Mała kula - - Zupa grzybowa + + Duża kula - - Nić + + Zabarwiona szyba – jasnoniebieska - - Pióro + + Zabarwiona szyba – wrzosowa - - Proch strzelniczy + + Zabarwiona szyba – pomarańczowa - - Ziarna pszenicy + + Gwiazda - - Pszenica + + Czarny - - Chleb + + Czerwony - - Krzemień + + Zielony - - Surowy stek wieprzowy + + Czyhacz - - Smażony stek wieprzowy + + Rozproszenie - - Obraz + + Nieznany kształt - - Złote jabłko + + Zabarwione szkło – czarne - - Znak + + Żelazna zbroja dla konia - - Wagonik + + Złota zbroja dla konia - - Siodło + + Diamentowa zbroja dla konia - - Czerwony kamień + + Komparator - - Śnieżka + + Wagonik z trotylem - - Łódka + + Wagonik z lejem - - Skóra + + Smycz - - Wiadro z mlekiem + + Znacznik - - Cegła + + Skrzynia z pułapką - - Glina + + Obciążeniowa płyta naciskowa (lekka) - - Trzcina cukrowa + + Tabliczka z imieniem - - Papier + + Deski z drewna (dowolnego rodzaju) - - Książka + + Blok poleceń - - Kula szlamu + + Gwiazda pirotechniczna - - Wagonik ze skrzynią + + Te zwierzęta można oswoić i na nich jeździć. Można przymocować do nich skrzynię. - - Wagonik z piecem + + Muł - - Jajo + + Rodzi się, gdy rozmnoży się koń i osioł. Te zwierzęta można oswoić, jeździć na nich i przymocować im skrzynie. - - Kompas + + Koń - - Wędka + + Te zwierzęta można oswoić i na nich jeździć. - - Zegarek + + Osioł - - Jasnopył + + Koń zombie - - Surowa ryba + + Pusta mapa - - Smażona ryba + + Gwiazda z Otchłani - - Barwnik + + Fajerwerk - - Gruczoł atramentowy + + Szkieletowy koń - - Czerwony barwnik + + Uschnięty - - Zielony barwnik + + Powstaje z czaszek uschniętych kościotrupów oraz piasku dusz. Strzela w ciebie wybuchającymi czaszkami. - - Kakao + + Obciążeniowa płyta naciskowa (ciężka) - - Lazuryt + + Zabarwiona glina – jasnoszara - - Fioletowy barwnik + + Zabarwiona glina – szara - - Błękitny barwnik + + Zabarwiona glina – różowa - - Jasnoszary barwnik + + Zabarwiona glina – niebieska - - Szary barwnik + + Zabarwiona glina – fioletowa - - Różowy barwnik + + Zabarwiona glina – błękitna - - Limonkowy barwnik + + Zabarwiona glina – limonkowa - - Żółty barwnik + + Zabarwiona glina – pomarańczowa - - Jasnoniebieski barwnik + + Zabarwiona glina – biała - - Wrzosowy barwnik + + Zabarwione szkło - - Pomarańczowy barwnik + + Zabarwiona glina – żółta - - Mączka kostna + + Zabarwiona glina – jasnoniebieska - - Kość + + Zabarwiona glina – wrzosowa - - Cukier + + Zabarwiona glina – brązowa - - Ciasto + + Lej - - Łóżko + + Tor aktywujący - - Powtarzacz z czer. kamienia + + Podajnik - - Ciasteczko + + Komparator - - Mapa + + Czujnik światła słonecznego - - Płyta muzyczna – „13” + + Blok czerwonego kamienia - - Płyta muzyczna – „cat” + + Zabarwiona glina - - Płyta muzyczna – „blocks” + + Zabarwiona glina – czarna - - Płyta muzyczna – „chirp” + + Zabarwiona glina – czerwona - - Płyta muzyczna – „far” + + Zabarwiona glina – zielona - - Płyta muzyczna – „mall” + + Bela siana - - Płyta muzyczna – „mellohi” + + Utwardzona glina - - Płyta muzyczna – „stal” + + Blok węgla - - Płyta muzyczna – „strad” + + Zaniknięcie - - Płyta muzyczna – „ward” + + Po wyłączeniu uniemożliwia potworom i zwierzętom zmianę bloków (np. wybuchy czyhaczów nie będą niszczyły bloków, a owce nie będą usuwały trawy) lub podnoszenie przedmiotów. - - Płyta muzyczna – „11” + + Po włączeniu gracze zachowają swój ekwipunek po śmierci. - - Płyta muzyczna – „where are we now” + + Po wyłączeniu istoty nie będą pojawiały się naturalnie. - - Nożyce + + Tryb gry: Przygoda - - Nasiona dyni + + Przygoda - - Nasiona arbuza + + Wpisz ziarno, aby jeszcze raz wygenerować ten sam teren. Pozostaw puste, aby stworzyć losowy świat. - - Surowy kurczak + + Po wyłączeniu potwory i zwierzęta nie będą pozostawiały przedmiotów (np. czyhacze nie pozostawią prochu strzelniczego). - - Smażony kurczak + + Gracz {*PLAYER*} spadł z drabiny. - - Surowa wołowina + + Gracz {*PLAYER*} spadł z pnączy. - - Smażony stek + + Gracz {*PLAYER*} wypadł z wody. - - Zgniłe mięso. + + Po wyłączeniu bloki nie będą zostawiały przedmiotów po zniszczeniu (np. kamienne bloki nie pozostawią kamienia brukowego). - - Perła Kresu + + Po wyłączeniu gracze nie będą naturalnie regenerować zdrowia. - - Kawałek arbuza + + Po wyłączeniu pora dnia nie będzie się zmieniać. - - Płomienna różdżka + + Wagonik - - Łza ducha + + Smycz - - Samorodek złota + + Zwolnij - - Narośl z Otchłani + + Przymocuj - - {*splash*}{*prefix*}mikstura {*postfix*} + + Zsiądź - - Szklana butelka + + Przyczep skrzynię - - Butelka z wodą + + Wystrzel - - Oko pająka + + Nadaj imię - - Sfermentow. oko pająka + + Znacznik - - Płomienny proszek + + Główna moc - - Magmowy krem + + Drugorzędna moc - - Stacja alchemiczna + + Koń - - Kociołek + + Podajnik - - Oko Kresu + + Lej - - Błyszczący arbuz + + Gracz {*PLAYER*} spadł z dużej wysokości. - - Zaklęta butelka + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę nietoperzy. - - Ognisty ładunek + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych koni. - - Ognisty ład. (węg. drz.) + + Opcje gry - - Ognisty ładunek (węg.) + + Gracz {*PLAYER*} oberwał kulą ognia od: {*SOURCE*} za pomocą: {*ITEM*}. - - Ramka + + Gracz {*PLAYER*} oberwał od: {*SOURCE*} za pomocą: {*ITEM*}. - - Przywołaj: {*CREATURE*} + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*} za pomocą: {*ITEM*}. - - Cegła z Otchłani + + Szkodzenie przez istoty - - Czaszka + + Przedmioty z bloków - - Czaszka kościotrupa + + Naturalna regeneracja - - Czaszka uschniętego kościotrupa + + Cykl dnia - - Głowa zombie + + Zachowaj ekwipunek - - Głowa + + Pojawianie się istot - - Głowa gracza %s + + Przedmioty z istot - - Głowa czyhacza + + Gracz {*PLAYER*} został zastrzelony przez: {*SOURCE*} za pomocą: {*ITEM*}. - - Kamień + + Gracz {*PLAYER*} spadł zbyt daleko i został wykończony przez: {*SOURCE*}. - - Blok z trawą + + Gracz {*PLAYER*} spadł zbyt daleko i został wykończony przez: {*SOURCE*}. - - Ziemia + + Gracz {*PLAYER*} wszedł w ogień podczas walki z: {*SOURCE*}. - - Kamień brukowy + + Gracz {*PLAYER*} został zepchnięty przez: {*SOURCE*}. - - Deski dębowe + + Gracz {*PLAYER*} został zepchnięty przez: {*SOURCE*}. - - Deski świerkowe + + Gracz {*PLAYER*} został zepchnięty przez: {*SOURCE*} za pomocą przedmiotu {*ITEM*}. - - Deski brzozowe + + Gracz {*PLAYER*} został spalony na popiół podczas walki z: {*SOURCE*}. - - Deski z drew. z dżungli + + Gracz {*PLAYER*} został wysadzony przez: {*SOURCE*}. - - Sadzonka + + Gracz {*PLAYER*} uschnął. - - Sadzonka dębu + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*} za pomocą: {*ITEM*}. - - Sadzonka świerku + + Gracz {*PLAYER*} próbował pływać w lawie, aby uciec przed: {*SOURCE*}. - - Sadzonka brzozy + + Gracz {*PLAYER*} utonął, próbując uciec przed: {*SOURCE*}. - - Sadzonka drzewa z dżungli + + Gracz {*PLAYER*} wdepnął w kaktus, próbując uciec przed: {*SOURCE*}. - - Skała macierzysta + + Dosiądź - - Woda + + + Aby kierować koniem, musisz włożyć mu siodło, które można kupić od osadników lub znaleźć w ukrytych skrzyniach. + - - Lawa + + + Oswojonym osłom i mułom można założyć torby, przyczepiając do nich skrzynie. Dostęp do toreb można uzyskać podczas jazdy albo skradania się. + - - Piasek + + + Konie i osły (ale nie muły) mogą być rozmnażane jak inne zwierzęta, za pomocą złotych jabłek i złotych marchewek. Źrebaki wraz z upływem czasu wyrosną na dorosłe konie, ale karmienie ich pszenicą lub sianem przyspieszy ten proces. + - - Piaskowiec + + + Konie, osły i muły muszą być oswojone, aby można było z nich korzystać. Konia oswaja się, dosiadając go i próbując się utrzymać, gdy ten próbuje cię zrzucić. + - - Żwir + + + Gdy pojawią się przy nim serduszka, będzie oswojony i nie będzie już próbował cię zrzucić. + - - Ruda złota + + + Spróbuj teraz pojechać konno. Użyj {*CONTROLLER_ACTION_USE*} bez żadnych przedmiotów lub narzędzi w ręku, aby go dosiąść. + - - Ruda żelaza + + + Tutaj możesz próbować oswoić konie i osły. W pobliskiej skrzyni znajdziesz siodła, zbroje dla konia i inne przydatne przedmioty. + - - Ruda węgla + + + Znacznik na piramidzie z co najmniej czterema poziomami będzie miał dostępną drugorzędną moc regeneracji lub możliwość wzmocnienia mocy głównej. + - - Drewno + + + Aby wybrać moc dla znacznika, musisz poświęcić szmaragd, diament, sztabkę złota lub sztabkę żelaza. Po wybraniu, moc będzie emanować ze znacznika stale. + - - Drewno dębowe + + Na szczycie tej piramidy znajduje się nieaktywny znacznik. - - Drewno świerkowe + + + Oto interfejs znacznika, który służy do wyboru mocy dla znacznika. + - - Drewno brzozowe + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z interfejsu znaczników. + - - Drewno z dżungli + + + W menu znacznika możesz wybrać główną moc znacznika. Im więcej poziomów ma piramida, tym więcej mocy będziesz mieć do wyboru. + - - Dąb + + + Jeździć można na wszystkich dorosłych koniach, osłach i mułach. Jednakże tylko konie mogą być ubrane w zbroje, a tylko muły i osły mogą być wyposażone w torby do transportowania przedmiotów. + - - Świerk + + + Oto interfejs ekwipunku konia. + - - Brzoza + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z ekwipunku konia. + - - Liście + + + Ekwipunek konia umożliwia przekazywanie lub wyposażanie w przedmioty konia, osła lub muła. + - - Liście dębu + + Iskrzenie - - Liście świerku + + Smuga - - Liście brzozy + + Czas lotu: - - Liście z dżungli + + + Osiodłaj konia, umieszczając siodło w odpowiednim miejscu. Konie można wyposażyć w zbroję, umieszczając ją w odpowiednim miejscu. + - - Gąbka + + Udało ci się znaleźć muła. - - Szkło + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat koni, osłów i mułów. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + - - Wełna + + + Konie i osły można spotkać na równinach. Muły są potomstwem osłów i koni, ale same są bezpłodne. + - - Czarna wełna + + + Za pomocą tego menu możesz także przekazywać przedmioty między własnym ekwipunkiem a torbami u osłów i mułów. + - - Czerwona wełna + + Udało ci się znaleźć konia. - - Zielona wełna + + Udało ci się znaleźć osła. - - Brązowa wełna + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat znaczników. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + - - Niebieska wełna + + + Gwiazdy pirotechniczne można wytwarzać, umieszczając w siatce proch strzelniczy i barwnik. + - - Fioletowa wełna + + + Barwnik określi kolor gwiazdy w momencie eksplozji. + - - Błękitna wełna + + + Kształt gwiazdy można określić, dodając ognisty ładunek, samorodek złota, pióro lub głowę istoty. + - - Jasnoszara wełna + + + Możesz również wstawić do siatki kilka gwiazd pirotechnicznych, aby dodać je do fajerwerku. + - - Szara wełna + + + Wypełniając więcej pól siatki prochem strzelniczym, zwiększysz wysokość, na której wybuchną gwiazdy pirotechniczne. + - - Różowa wełna + + + Powstały fajerwerk możesz następnie zabrać z odpowiedniego pola. + - - Limonkowa wełna + + + Efekt smugi lub iskrzenia można dodać, używając diamentów lub jasnopyłu. + - - Żółta wełna + + + Fajerwerki to przedmioty dekoracyjne, które można wystrzelić ręcznie lub z dozowników. Wytwarza się je z papieru, prochu strzelniczego i ewentualnie kilku gwiazd pirotechnicznych. + - - Jasnoniebieska wełna + + + Kolory, zasięg lotu, kształt, rozmiar i efekty (takie jak smuga czy iskrzenie) gwiazd pirotechnicznych można spersonalizować, dodając inne składniki w trakcie tworzenia. + - - Wrzosowa wełna + + + Spróbuj wytworzyć fajerwerk w warsztacie, korzystając z różnych składników ukrytych w skrzyniach. + - - Pomarańczowa wełna + + + Po wytworzeniu gwiazdy pirotechnicznej możesz ustalić jej kolor w czasie zanikania, łącząc ją z barwnikiem. + - - Biała wełna + + + Skrzynie w tej okolicy zawierają różne przedmioty wykorzystywane do wytwarzania FAJERWERKÓW! + - - Kwiat + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat fajerwerków. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + - - Róża + + + Aby wytworzyć fajerwerk, umieść proch strzelniczy i papier w siatce wytwarzania o wymiarach 3x3, widocznej nad twoim ekwipunkiem. + - - Grzyb + + W tym pokoju są leje. - - Blok złota + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat lejów. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + - - Sprawny sposób przechowywania złota. + + + Leje służą do umieszczania lub usuwania przedmiotów z pojemników i automatycznego podnoszenia wrzucanych do nich przedmiotów. + - - Blok żelaza + + + Aktywne znaczniki wyświetlają promień światła w kierunku nieba i mogą dawać różne efekty graczom. Wytwarza się je ze szkła, obsydianu i gwiazd z Otchłani, które można zdobyć, pokonując Uschniętego. + - - Sprawny sposób przechowywania żelaza. + + + Znaczniki należy umieścić tak, aby w ciągu dnia świeciło na nie słońce. Muszą być umieszczona na szczycie piramid z żelaza, złota, szmaragdów lub diamentów. Materiał, na którym ustawiony jest znacznik, nie ma wpływu na jego siłę. + - - Kamienna płyta + + + Skorzystaj ze znacznika, aby wybrać jego moc. Możesz użyć znajdujących się tu sztabek żelaza jako zapłaty. + - - Kamienna płyta + + + Mogą wpływać na stacje alchemiczne, skrzynie, dozowniki, podajniki, wagoniki ze skrzyniami, wagoniki z lejami oraz inne leje. + - - Płyta z piaskowca + + + W tym pokoju znajduje się kilka przydatnych układów lejów, z którymi możesz eksperymentować. + - - Płyta z drewna dębowego + + + To interfejs fajerwerku, z którego możesz korzystać, by wytwarzać fajerwerki i gwiazdy pirotechniczne. + - - Płyta z kamienia brukowego + + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. + {*B*}Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z interfejsu fajerwerku. + - - Płyta z cegieł + + + Leje będą stale próbowały wyciągać przedmioty z odpowiednich pojemników nad nimi. Będą także próbowały umieścić przechowywane przedmioty w docelowym pojemniku. + - - Płyta z kamiennych cegieł + + + Jeżeli lej zostanie zasilony czerwonym kamieniem, wyłączy się i przestanie wciągać i umieszczać przedmioty. + - - Płyta z drewna dębowego + + + Lej jest skierowany w stronę, w którą próbuje przekazywać przedmioty. Aby lej był skierowany w kierunku konkretnego bloku, umieść go przy bloku podczas skradania. + - - Płyta świerkowa + + Można je spotkać na bagnach. Atakują cię, rzucając miksturami. Po zabiciu zostawiają mikstury. - - Płyta brzozowa + + Osiągnięto maksymalną liczbę obrazów/ramek. - - Płyta z drewna z dżungli + + Nie możesz tworzyć przeciwników na poziomie trudności „Spokojny”. - - Płyta z cegieł z Otchłani + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych świń, owiec, krów, kotów i koni. - - Cegły + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę kałamarnic. - - Trotyl + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę przeciwników. - - Biblioteczka + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę osadników. - - Kamień z mchem + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych wilków. - - Obsydian + + Osiągnięto maksymalną liczbę głów istot. - - Pochodnia + + Odwróć widok - - Pochodnia (węgiel) + + Dla leworęcznych - - Pochodnia (węgiel drz.) + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych kur. - - Ogień + + To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych grzybowych krów. - - Przywoływacz potworów + + Osiągnięto maksymalną liczbę łódek. - - Schody z drewna dębowego + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę kur. - - Skrzynia + + +{*C2*}Weź głęboki oddech. Teraz kolejny. Nabierz powietrza w płuca. Odzyskaj władzę w kończynach. Tak, poruszaj palcami. Ponownie otrzymaj ciało wystawione na działanie grawitacji i powietrza. Odrodź się w tym długim śnie. Oto jesteś. Twoje ciało znów styka się ze wszechświatem w każdym punkcie, jakbyście byli osobnymi bytami. Jakbyśmy my byli osobnymi bytami.{*EF*}{*B*}{*B*} +{*C3*}Kim jesteśmy? Niegdyś nazywano nas duchem góry. Ojciec-słońce, matka-księżyc. Duchy przodków, duchy zwierząt. Dżiny. Duchy. Zieloni ludzie. Potem bogowie, demony. Anioły. Złośliwe duchy. Obcy, istoty pozaziemskie. Leptony, kwarki. Światy się zmieniają. My nie.{*EF*}{*B*}{*B*} +{*C2*}Jesteśmy wszechświatem. Jesteśmy wszystkim, co uważasz, że nie jest tobą. Patrzysz na nas teraz swoim ciałem i oczami. A czemu wszechświat dotyka twojego ciała i oświetla cię? Żeby cię zobaczyć, graczu. Żeby cię poznać. I dać się poznać. Opowiem ci historię.{*EF*}{*B*}{*B*} +{*C2*}Dawno, dawno temu, żył pewien gracz.{*EF*}{*B*}{*B*} +{*C3*}Tym graczem byłeś ty, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Czasami gracz uważał się za człowieka, który żył na wirującej kuli z roztopionej skały. Kula wirowała wokół kuli płonącego gazu, która była 330 000 razy większa. Znajdowały się od siebie tak daleko, że światło potrzebowało 8 minut, aby pokonać ten dystans. Światło było informacją przesyłaną od gwiazdy i mogło poparzyć twoją skórę z odległości 150 milionów kilometrów.{*EF*}{*B*}{*B*} +{*C2*}Czasami gracz śnił, że był górnikiem, żyjącym na płaskim i nieskończonym świecie. Słońce było białym kwadratem. Dni były krótkie. Było tyle do zrobienia, a śmierć jawiła się tylko jako drobna niedogodność.{*EF*}{*B*}{*B*} +{*C3*}Czasami gracz śnił, że zagubił się w historii.{*EF*}{*B*}{*B*} +{*C2*}Czasami śnił, że był kimś innym, w zupełnie innym miejscu. Czasami sny były niepokojące, innym razem piękne. Bywało, że gracz budził się z jednego snu i zapadał w następny, a potem w kolejny.{*EF*}{*B*}{*B*} +{*C3*}Czasami śniło mu się, że ogląda słowa na ekranie.{*EF*}{*B*}{*B*} +{*C2*}Cofnijmy się trochę.{*EF*}{*B*}{*B*} +{*C2*}Atomy, z których składał się gracz, były rozrzucone wszędzie – w trawie, w wodzie, w powietrzu i ziemi. Kobieta zebrała te atomy – piła, jadła, wdychała – a następnie stworzyła gracza w swoim ciele.{*EF*}{*B*}{*B*} +{*C2*}Gracz przebudził się z ciepłego i mrocznego ciała swojej matki, wprost do długiego snu.{*EF*}{*B*}{*B*} +{*C2*}Stał się nową historią, nigdy wcześniej nieopowiedzianą, zapisaną literami DNA. Był nowym programem, nigdy wcześniej nieuruchamianym, napisanym za pomocą kodu źródłowego, mającego miliardy lat. Był nowym człowiekiem, który nie żył nigdy wcześniej, stworzonym wyłącznie z mleka i miłości.{*EF*}{*B*}{*B*} +{*C3*}Ty jesteś tym graczem. Historią. Programem. Człowiekiem. Stworzonym wyłącznie z mleka i miłości.{*EF*}{*B*}{*B*} +{*C2*}Cofnijmy się jeszcze dalej.{*EF*}{*B*}{*B*} +{*C2*}Siedem miliardów miliardów miliardów atomów, z których składa się ciało gracza, powstało w sercu gwiazdy na długo przed tą grą. Więc także gracz jest informacją od gwiazdy. Gracz przeżywa historię, która jest lasem informacji zasianym przez człowieka imieniem Julian, na płaskim, nieskończonym świecie, stworzonym przez człowieka imieniem Markus, który istnieje w małym, prywatnym świecie stworzonym przez gracza, który zamieszkuje wszechświat, stworzony przez...{*EF*}{*B*}{*B*} +{*C3*}Ciiii. Czasami gracz tworzył mały, prywatny świat, przytulny, ciepły i prosty. Czasami bywał twardy, zimny i skomplikowany. Czasami tworzył w myślach model wszechświata, przez który przemieszczały się drobinki energii. Czasami nazywał te drobinki elektronami i protonami.{*EF*}{*B*}{*B*} - - Czerwony pył + + +{*C2*}Czasami nazywał je planetami i gwiazdami.{*EF*}{*B*}{*B*} +{*C2*}Czasami wierzył, że znajdował się we wszechświecie stworzonym z energii, która powstała z zer i jedynek, linii kodu. Czasami wierzył, że grał w grę. Czasami, że czyta słowa na ekranie.{*EF*}{*B*}{*B*} +{*C3*}Jesteś graczem czytającym słowa...{*EF*}{*B*}{*B*} +{*C2*}Ciiii... Czasami gracz czytał linie kodu na ekranie. Deszyfrował z nich słowa. Deszyfrował słowa w znaczenia. Deszyfrował znaczenia w uczucia, emocje, teorie, pomysły. Zaczynał wtedy oddychać szybciej i głębiej, i zdał sobie sprawę, że żyje. Żyje, a te tysiące śmierci nie były prawdziwe. Gracz żył{*EF*}{*B*}{*B*} +{*C3*}Ty. Ty. Ty jesteś żywy.{*EF*}{*B*}{*B*} +{*C2*}i czasami wierzył, że wszechświat do niego przemawiał poprzez promienie słońca świecące przez liście{*EF*}{*B*}{*B*} +{*C3*}i czasami wierzył, że wszechświat do niego przemawia poprzez światło, które spadło z nocnego, zimowego nieba, gdzie błysk światła widziany kątem oka mógł być olbrzymią gwiazdą, która spalała pobliskie planety na plazmę, aby chociaż na chwilę pokazać się graczowi wracającemu do domu po drugiej stronie wszechświata, czującemu zapach jedzenia i wkrótce zapadającemu w kolejny sen{*EF*}{*B*}{*B*} +{*C2*}i czasami wierzył, że wszechświat do niego przemawia poprzez zera i jedynki, całą energię elektryczną świata, przez przesuwające się po ekranie słowa, które pokazują się na końcu snu{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że cię kocha{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że dobrze grałeś{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że wszystko niezbędne jest w tobie{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że jesteś silniejszy niż ci się wydaje{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że jesteś dniem{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że jesteś nocą{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że ciemność, z którą walczysz, jest w tobie{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że światłość, której szukasz, jest w tobie{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że nie jesteś sam{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że nie jesteś oddzielony od innych rzeczy{*EF*}{*B*}{*B*} +{*C3*}i wszechświat powiedział, że jesteś wszechświatem, który sam się sprawdza, rozmawia ze sobą i czyta własny kod{*EF*}{*B*}{*B*} +{*C2*}i wszechświat powiedział, że cię kocha, ponieważ jesteś miłością.{*EF*}{*B*}{*B*} +{*C3*}Gra dobiegła końca, a gracz przebudził się ze snu. I zaczął kolejny sen. I śnił ponownie, śnił lepiej. I gracz był wszechświatem. I był miłością.{*EF*}{*B*}{*B*} +{*C3*}Ty jesteś graczem.{*EF*}{*B*}{*B*} +{*C2*}Przebudź się.{*EF*} - - Ruda diamentu + + Resetuj Otchłań - - Blok diamentu + + Gracz %s wkracza do Kresu - - Sprawny sposób przechowywania diamentów. + + Gracz %s opuszcza Kres - - Warsztat + + +{*C3*}Widzę gracza, o którym mówisz.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Tak. Zachowaj ostrożność. Jest teraz czymś zupełnie innym. Może czytać w naszych myślach.{*EF*}{*B*}{*B*} +{*C2*}To nie ma znaczenia. Sądzi, że jesteśmy częścią gry.{*EF*}{*B*}{*B*} +{*C3*}Podoba mi się ten gracz. Dobrze mu szło. Nie poddał się.{*EF*}{*B*}{*B*} +{*C2*}Czyta w naszych myślach, jakby to były słowa na ekranie.{*EF*}{*B*}{*B*} +{*C3*}W taki sposób postanawia wyobrażać sobie wiele rzeczy, gdy zacznie śnić o grze.{*EF*}{*B*}{*B*} +{*C2*}Słowa to wspaniały sposób przekazu. Bardzo wygodny. I znacznie mniej przerażający niż rzeczywistość poza ekranem.{*EF*}{*B*}{*B*} +{*C3*}Kiedyś słyszeli głosy. Zanim gracze nauczyli się czytać. Było to w czasach, gdy ci, co nie grają, nazywali graczy wiedźmami i czarnoksiężnikami. A gracze śnili o lataniu w przestworzach na patykach napędzanych energią demonów.{*EF*}{*B*}{*B*} +{*C2*}O czym śnił ten gracz?{*EF*}{*B*}{*B*} +{*C3*}O blasku słońca i drzewach. O ogniu i wodzie. Śnił, że tworzył. I śnił, że niszczył. Śnił, że był myśliwym i zwierzyną. Śnił o schronieniu.{*EF*}{*B*}{*B*} +{*C2*}Ach, oryginalny interfejs. Ma miliony lat, a wciąż działa. Co udało się stworzyć temu graczowi w rzeczywistości poza ekranem?{*EF*}{*B*}{*B*} +{*C3*}Pracował z milionami innych, aby stworzyć prawdziwy świat na wzór {*EF*}{*NOISE*}{*C3*} i stworzył {*EF*}{*NOISE*}{*C3*} dla {*EF*}{*NOISE*}{*C3*} w {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Nie potrafi tego przeczytać.{*EF*}{*B*}{*B*} +{*C3*}Nie. Jeszcze nie jest dostatecznie rozwinięty. To osiągnie w tym długim śnie o życiu, a nie w krótkim o grze.{*EF*}{*B*}{*B*} +{*C2*}Czy wie, że go kochamy? Że wszechświat jest dobry?{*EF*}{*B*}{*B*} +{*C3*}Czasami, gdy przebije się przez hałas własnych myśli, słyszy, co wszechświat ma do powiedzenia.{*EF*}{*B*}{*B*} +{*C2*}Jednak są takie chwile, gdy ogarnia go smutek w tym długim śnie. Tworzy światy, w których nie ma lata, a następnie kuli się pod blaskiem czarnego słońca i uznaje ten świat za rzeczywistość.{*EF*}{*B*}{*B*} +{*C3*}Wyleczenie ze smutku byłoby dla niego zgubne. Smutek jest częścią jego istnienia. Nie możemy się wtrącać.{*EF*}{*B*}{*B*} +{*C2*}Czasami, gdy śni głęboko, chcę mu powiedzieć, że w rzeczywistości tworzy prawdziwe światy. Czasami chcę mu powiedzieć, jak ważny jest dla wszechświata. Czasami, gdy od dawna nie nawiązał żadnego kontaktu, chcę mu pomóc w wypowiedzeniu słowa, którego tak bardzo się boi.{*EF*}{*B*}{*B*} +{*C3*}Potrafi czytać w naszych myślach.{*EF*}{*B*}{*B*} +{*C2*}Czasami zupełnie mnie to nie interesuje. Czasami chcę mu powiedzieć, że świat, który uznaje za prawdziwy, to tylko {*EF*}{*NOISE*}{*C2*} o {*EF*}{*NOISE*}{*C2*}. Chcę mu powiedzieć, że jest {*EF*}{*NOISE*}{*C2*} w {*EF*}{*NOISE*}{*C2*}. W swoim długim śnie widzi tak mało z rzeczywistości.{*EF*}{*B*}{*B*} +{*C3*}A mimo to gra.{*EF*}{*B*}{*B*} +{*C2*}A wystarczyłoby mu tylko powiedzieć...{*EF*}{*B*}{*B*} +{*C3*}Nie w tym śnie. Powiedzenie mu, jak żyć, uniemożliwiłoby mu życie.{*EF*}{*B*}{*B*} +{*C2*}Nie powiem graczowi, jak żyć.{*EF*}{*B*}{*B*} +{*C3*}Gracz zaczyna się niecierpliwić.{*EF*}{*B*}{*B*} +{*C2*}Opowiem mu historię.{*EF*}{*B*}{*B*} +{*C3*}Ale nie prawdę.{*EF*}{*B*}{*B*} +{*C2*}Nie. Historię, która zawiera prawdę ukrytą za słowami. Nie czystą prawdę, która może wyrządzić niewyobrażalne szkody.{*EF*}{*B*}{*B*} +{*C3*}Przywróć mu ciało.{*EF*}{*B*}{*B*} +{*C2*}Tak. Graczu...{*EF*}{*B*}{*B*} +{*C3*}Zwróć się po imieniu.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Graczu nad graczami.{*EF*}{*B*}{*B*} +{*C3*}Dobrze.{*EF*}{*B*}{*B*} + - - Zboże + + Czy na pewno chcesz zresetować Otchłań w tym zapisie gry do pierwotnego stanu? Utracisz wszystko, co zostało przez ciebie wybudowane w Otchłani! - - Pole uprawne + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę świń, owiec, krów, kotów i koni. - - Piec + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę grzybowych krów. - - Znak + + Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę wilków. - - Drewniane drzwi + + Resetuj Otchłań - - Drabina + + Nie resetuj Otchłani - - Tor + + Nie możesz teraz ostrzyc tej grzybowej krowy. Osiągnięto maksymalną liczbę świń, owiec, krów, kotów i koni. - - Zasilany tor + + Nie żyjesz! - - Tor z czujnikiem + + Opcje świata - - Kamienne schody + + Może budować i wydobywać - - Dźwignia + + Może korzystać z drzwi i przełączników - - Płyta naciskowa + + Generowanie budynków - - Żelazne drzwi + + Superpłaski świat - - Ruda czerwonego kamienia + + Dodatkowa skrzynia - - Pochodnia (czer. pył) + + Może otwierać pojemniki - - Przycisk + + Wyrzuć gracza - - Śnieg + + Może latać - - Lód + + Wyłącz zmęczenie - - Kaktus + + Może atakować graczy - - Glina + + Może atakować zwierzęta - - Trzcina cukrowa + + Moderator - - Szafa grająca + + Przywileje hosta - - Ogrodzenie + + Instrukcja - - Dynia + + Sterowanie - - Lampion z dyni + + Ustawienia - - Skała Otchłani + + Odrodzenie - - Piasek dusz + + Oferta zawartości do pobrania - - Jasnogłaz + + Zmień skórkę - - Portal + + Napisy - - Ruda lazurytu + + Trotyl wybucha - - Blok lazurytu + + Gracz kontra gracz (PvP) - - Sprawny sposób przechowywania lazurytu. + + Ufaj graczom - - Dozownik + + Przeinstaluj zawartość - - Blok muzyczny + + Opcje programisty - - Ciasto + + Ogień się rozprzestrzenia - - Łóżko + + Kresosmok - - Pajęczyna + + Gracz {*PLAYER*} został zabity oddechem Kresosmoka. - - Wysoka trawa + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. - - Uschnięty krzak + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. - - Dioda + + Gracz {*PLAYER*} zginął. - - Zamknięta skrzynia + + Gracz {*PLAYER*} wybuchł. - - Właz + + Gracz {*PLAYER*} został zabity przez magię. - - Wełna (dowolnego koloru) + + Gracz {*PLAYER*} został zastrzelony przez: {*SOURCE*}. - - Tłok + + Mgła skały macierzystej - - Lepki tłok + + Wyświetl interfejs - - Blok rybika + + Wyświetl rękę - - Kamienne cegły + + Gracz {*PLAYER*} oberwał kulą ognia od: {*SOURCE*}. - - Kamienne cegły z mchem + + Gracz {*PLAYER*} został stłuczony przez: {*SOURCE*}. - - Popękane kamienne cegły + + Gracz {*PLAYER*} został zabity przez: {*SOURCE*} za pomocą magii. - - Rzeźbione kamienne cegły + + Gracz {*PLAYER*} wypadł poza świat. - - Grzyb + + Pakiety tekstur - - Grzyb + + Pakiety łączone - - Żelazne kraty + + Gracz {*PLAYER*} spłonął. - - Szyba + + Motywy - - Arbuz + + Obrazki - - Łodyga dyni + + Przedmioty dla awatara - - Łodyga arbuza + + Gracz {*PLAYER*} zamienił się w popiół. - - Pnącza + + Gracz {*PLAYER*} zmarł z głodu. - - Furtka + + Gracz {*PLAYER*} został zakłuty na śmierć. - - Ceglane schody + + Gracz {*PLAYER*} za mocno uderzył w ziemię. - - Schody z kamiennych cegieł + + Gracz {*PLAYER*} próbował pływać w lawie. - - Kamień rybika + + Gracz {*PLAYER*} udusił się w ścianie. - - Kamień brukowy rybika + + Gracz {*PLAYER*} utonął. - - Kamienna cegła rybika + + Komunikaty o śmierci - - Grzybnia + + Nie jesteś już moderatorem - - Lilia + + Możesz latać - - Cegła z Otchłani + + Nie możesz już latać - - Płot z cegły z Otchłani + + Nie możesz atakować zwierząt - - Schody z cegły z Otchłani + + Możesz atakować zwierzęta - - Narośl z Otchłani + + Jesteś teraz moderatorem - - Magiczny stół + + Nie będziesz się już męczyć - - Stacja alchemiczna + + Jesteś nieśmiertelny - - Kociołek + + Nie jesteś już nieśmiertelny - - Portal Kresu + + %d MSP - - Szkielet portalu Kresu + + Będziesz się męczyć - - Kamień Kresu + + Jesteś niewidzialny - - Smocze jajo + + Nie jesteś już niewidzialny - - Krzak + + Możesz atakować graczy - - Paproć + + Możesz wydobywać i używać przedmiotów - - Schody z piaskowca + + Nie możesz umieszczać bloków - - Schody świerkowe + + Możesz umieszczać bloki - - Schody brzozowe + + Animacja postaci - - Schody z drewna z dżungli + + Specjalna animacja skórek - - Lampa z czerwonym pyłem + + Nie możesz wydobywać i używać przedmiotów - - Kakao + + Możesz korzystać z drzwi i przełączników - - Czaszka + + Nie możesz atakować istot - - Sterowanie + + Możesz atakować istoty - - Układ + + Nie możesz atakować graczy - - Chodzenie/bieganie + + Nie możesz korzystać z drzwi i przełączników - - Rozglądanie się + + Możesz korzystać z pojemników (np. skrzyń) - - Pauza + + Nie możesz korzystać z pojemników (np. skrzyń) - - Skok + + Niewidzialność - - Skok/lot do góry + + Znaczniki + + + {*T3*}INSTRUKCJA: ZNACZNIKI{*ETW*}{*B*}{*B*} +Aktywne znaczniki wyświetlają promień światła w kierunku nieba i dają pobliskim graczom różne efekty.{*B*} +Wytwarza się je ze szkła, obsydianu i gwiazd z Otchłani, które można zdobyć, pokonując Uschniętego.{*B*}{*B*} +Znaczniki należy umieścić tak, aby w ciągu dnia świeciło na nie słońce. Muszą być umieszczona na szczycie piramid z żelaza, złota, szmaragdów lub diamentów.{*B*} +Materiał, na jakim ustawiony jest znacznik, nie ma wpływu na jego siłę.{*B*}{*B*} +W menu znaczników możesz wybrać jedną główną moc dla znacznika. Im więcej poziomów ma piramida, tym więcej mocy będziesz mieć do wyboru.{*B*} +Znacznik na piramidzie z co najmniej czterema poziomami będzie miał dostępną drugorzędną moc regeneracji lub możliwość wzmocnienia mocy głównej.{*B*}{*B*} +Aby wybrać moc dla znacznika, musisz poświęcić szmaragd, diament, sztabkę złota lub sztabkę żelaza.{*B*} +Po wybraniu, moc będzie emanować ze znacznika stale.{*B*} + + + + Fajerwerki + + + Języki + + + Konie + + + {*T3*}INSTRUKCJA: KONIE{*ETW*}{*B*}{*B*} +Konie i osły można spotkać na równinach. Muły są potomstwem osłów i koni, ale same są bezpłodne.{*B*} +Na wszystkich dorosłych koniach, osłach i mułach można jeździć. Tylko konie mogą być ubrane w zbroje, a tylko muły i osły mogą być wyposażone w torby przy siodle, służące do transportowania przedmiotów.{*B*}{*B*} +Konie, osły i muły muszą być oswojone, aby można było z nich korzystać. Konia oswaja się, dosiadając go i próbując się utrzymać, gdy ten próbuje cię zrzucić.{*B*} +Gdy pojawią się przy nim serduszka, będzie oswojony i już nie spróbuje cię zrzucić. Aby kierować koniem, trzeba założyć mu siodło.{*B*}{*B*} +Siodła można kupić od osadników lub znaleźć w ukrytych skrzyniach.{*B*} +Oswojonym osłom i mułom można założyć torby, przyczepiając do nich skrzynie. Dostęp do toreb można uzyskać podczas jazdy albo skradania się.{*B*}{*B*} +Konie i osły (ale nie muły) mogą być rozmnażane jak inne zwierzęta, za pomocą złotych jabłek i marchewek.{*B*} +Źrebaki z czasem wyrosną na dorosłe konie, ale karmienie ich pszenicą lub sianem przyspieszy ten proces.{*B*} + + + + {*T3*}INSTRUKCJA: FAJERWERKI{*ETW*}{*B*}{*B*} +Fajerwerki to przedmioty dekoracyjne, które można wystrzelić ręcznie lub z dozowników. Wytwarza się je z papieru, prochu strzelniczego i ewentualnie kilku gwiazd pirotechnicznych.{*B*} +Kolory, zasięg lotu, kształt, rozmiar i efekty (takie jak smuga czy iskrzenie) gwiazd pirotechnicznych można spersonalizować, dodając inne składniki.{*B*}{*B*} +Aby wytworzyć fajerwerk, umieść proch strzelniczy i papier w siatce wytwarzania o wymiarach 3x3, widocznej nad twoim ekwipunkiem.{*B*} +Możesz również wstawić do siatki kilka gwiazd pirotechnicznych, aby dodać je do fajerwerku.{*B*} +Wypełniając więcej pól siatki prochem strzelniczym, zwiększysz wysokość, na której wybuchną gwiazdy pirotechniczne.{*B*}{*B*} +Gotowy fajerwerk możesz następnie zabrać z odpowiedniego pola.{*B*}{*B*} +Gwiazdy pirotechniczne można wytwarzać, umieszczając w siatce proch strzelniczy i barwnik.{*B*} +– Barwnik określi kolor gwiazdy w momencie eksplozji.{*B*} +– Kształt gwiazdy można określić, dodając ognisty ładunek, samorodek złota, pióro lub głowę istoty.{*B*} +– Efekt smugi lub iskrzenia można dodać, używając diamentów lub jasnopyłu.{*B*}{*B*} +Po wytworzeniu gwiazdy pirotechnicznej możesz ustalić jej kolor w czasie zanikania, łącząc ją z barwnikiem. + + + + {*T3*}INSTRUKCJA: PODAJNIKI{*ETW*}{*B*}{*B*} +Podajniki zasilane przez czerwony kamień upuszczą na ziemię jeden losowy przedmiot. Użyj {*CONTROLLER_ACTION_USE*}, aby otworzyć podajnik, a następnie załadować do niego przedmioty z ekwipunku.{*B*} +Jeśli podajnik jest skierowany w stronę skrzyni lub innego pojemnika, przedmiot zostanie umieszczony w tym pojemniku. Można zbudować długie łańcuchy podajników, aby transportować przedmioty na duże odległości – wówczas muszą być zasilane na zmianę. + + + + Po użyciu zamienia się w mapę części świata, w której jesteś, i wypełnia się w miarę zwiedzania. + + + Do zdobycia po zabiciu Uschniętego, używana do tworzenia znaczników. + + + Leje + + + {*T3*}INSTRUKCJA: LEJE{*ETW*}{*B*}{*B*} +Leje służą do umieszczania lub usuwania przedmiotów z pojemników i automatycznego podnoszenia wrzucanych do nich przedmiotów.{*B*} +Mogą wpływać na stacje alchemiczne, skrzynie, dozowniki, podajniki, wagoniki ze skrzyniami, wagoniki z lejami oraz inne leje.{*B*}{*B*} +Leje będą stale próbowały wyciągać przedmioty z odpowiednich pojemników nad nimi. Będą także próbowały umieścić przechowywane przedmioty w docelowym pojemniku.{*B*} +Jeżeli lej zostanie zasilony czerwonym kamieniem, wyłączy się i przestanie wciągać i umieszczać przedmioty.{*B*}{*B*} +Lej jest skierowany w stronę, w którą próbuje przekazywać przedmioty. Aby lej był skierowany w kierunku konkretnego bloku, umieść go przy bloku podczas skradania.{*B*} + + + + Podajniki - - Ekwipunek + + NOT USED - - Zmień trzymany przedmiot + + Natychmiastowe zdrowie - - Akcja + + Natychmiastowe obrażenia - - Użyj + + Wzmocnienie skoku - - Wytwarzanie + + Powolne wydobywanie - - Upuść + + Siła - - Skradanie + + Osłabienie - - Skradanie/lot w dół + + Mdłości - - Zmiana trybu kamery + + NOT USED - - Gracze/zaproszenia + + NOT USED - - Poruszanie (podczas lotu) + + NOT USED - - Układ 1 + + Regeneracja - - Układ 2 + + Odporność - - Układ 3 + + Szukanie ziarna do generowania świata - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Po użyciu wywołuje kolorową eksplozję. Kolor, efekt, kształt i zasięg lotu zależą od gwiazdy pirotechnicznej użytej do wytworzenia fajerwerku. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Rodzaj toru, który może włączać i wyłączać wagoniki z lejami i aktywować wagoniki z trotylem. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Przechowuje i upuszcza przedmioty lub przekłada je do innego pojemnika, gdy otrzyma zasilanie z czerwonego kamienia. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Kolorowe bloki powstałe na skutek farbowania utwardzonej gliny. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Dostarcza zasilanie z czerwonego kamienia. Zasilanie będzie silniejsze, jeżeli na płycie znajdzie się więcej przedmiotów. Wymaga większego obciążenia niż lekka płyta. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Używany jako źródło zasilania z czerwonego kamienia. Może być przerobiony z powrotem na czerwony kamień. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Używany do łapania przedmiotów lub do przekazywania ich z lub do pojemników. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Można nim nakarmić konie, osły lub muły, aby przywrócić im do 10 serduszek zdrowia. Przyspiesza dorastanie źrebaków. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Nietoperz - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Te latające stworzenia można spotkać w jaskiniach i innych dużych, zamkniętych przestrzeniach. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Wiedźma - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Powstaje po przetopieniu gliny w piecu. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Powstaje ze szkła i barwnika. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Powstaje z zabarwionego szkła. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Dostarcza zasilanie z czerwonego kamienia. Zasilanie będzie silniejsze, jeżeli na płycie znajdzie się więcej przedmiotów. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Blok, który wysyła sygnał z czerwonego kamienia zależnie od światła słonecznego (albo jego braku). - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Specjalny rodzaj wagonika, który działa podobnie do leja. Będzie zbierał przedmioty leżące na torach i z pojemników zawieszonych nad nimi. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Specjalny rodzaj zbroi, którą można włożyć na konia. Daje 5 pkt. pancerza. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Służy do określenia koloru, efektu i kształtu fajerwerku. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Używany w obwodach z czerwonego kamienia, aby utrzymać, porównać, osłabiać siłę sygnału lub mierzyć stan niektórych bloków. - - {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. + + Wagonik, który zachowuje się jak ruchomy blok trotylu. - - {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby rozpocząć samouczek.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli uważasz, że możesz rozpocząć właściwą grę. + + Specjalny rodzaj zbroi, którą można włożyć na konia. Daje 7 pkt. pancerza. - - Minecraft jest grą o ustawianiu bloków i budowaniu z nich wszystkiego, co tylko sobie wyobrazisz. -W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią. + + Używany do wykonywania poleceń. - - Użyj{*CONTROLLER_ACTION_LOOK*}, aby patrzeć w górę, w dół i rozglądać się dookoła. + + Wyświetla promień światła w kierunku nieba i może dawać różne efekty graczom. - - Użyj{*CONTROLLER_ACTION_MOVE*}, aby się poruszać. + + Przechowuje bloki i przedmioty. Umieść dwie skrzynie obok siebie, aby utworzyć wielką skrzynię o podwójnej pojemności. Skrzynia z pułapką wytwarza ładunek czerwonego kamienia, gdy zostanie otworzona. - - Aby pobiec, wychyl{*CONTROLLER_ACTION_MOVE*} szybko dwukrotnie do przodu. Trzymaj {*CONTROLLER_ACTION_MOVE*} do przodu, a twoja postać będzie biegła, dopóki się nie zmęczy lub nie zrobi się głodna. + + Specjalny rodzaj zbroi, którą można włożyć na konia. Daje 11 pkt. pancerza. - - Wciśnij{*CONTROLLER_ACTION_JUMP*}, aby podskoczyć. + + Służy do przywiązywania istot do gracza lub słupków. - - Przytrzymaj{*CONTROLLER_ACTION_ACTION*}, aby wydobywać albo ścinać ręką lub przedmiotem trzymanym w ręku. Do wydobycia niektórych bloków konieczne może być wytworzenie narzędzia... + + Służy do nazywania istot. - - Przytrzymaj{*CONTROLLER_ACTION_ACTION*}, aby ściąć 4 bloki drewna (z pnia drzewa).{*B*}Gdy blok się rozpadnie, możesz go podnieść, podchodząc do unoszącego się w powietrzu przedmiotu. Pojawi się on w twoim ekwipunku. + + Przyspieszenie - - Wciśnij{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs wytwarzania. + + Pełna wersja - - Zbierając i wytwarzając przedmioty, zapełniasz swój ekwipunek.{*B*} - Wciśnij{*CONTROLLER_ACTION_INVENTORY*}, aby otworzyć ekran ekwipunku. + + Wznów grę - - Poruszanie się, wydobywanie i atakowanie będzie obniżać twój wskaźnik najedzenia{*ICON_SHANK_01*}. Bieg i skoki podczas biegu obniżają wskaźnik najedzenia szybciej niż normalny ruch i skoki. + + Zapisz grę - - Jeżeli stracisz trochę zdrowia, ale twój wskaźnik najedzenia ma wypełnione 9 lub więcej{*ICON_SHANK_01*}, twoje zdrowie zacznie się regenerować automatycznie. Jedzenie uzupełni wskaźnik. + + Graj - - Trzymając jedzenie w ręku, przytrzymaj{*CONTROLLER_ACTION_USE*}, aby je zjeść i napełnić wskaźnik. Nie możesz nic zjeść, jeżeli wskaźnik najedzenia jest pełny. + + Rankingi - - Twój wskaźnik najedzenia jest prawie pusty i straciłeś trochę zdrowia. Zjedz stek z ekwipunku, aby napełnić wskaźnik najedzenia i zacząć odzyskiwać zdrowie.{*ICON*}364{*/ICON*} + + Pomoc i opcje - - Zebrane drewno może być przerobione na deski. Otwórz interfejs wytwarzania i zrób deski.{*PlanksIcon*} + + Poziom trudności: - - Niektóre z przepisów wymagają wielu kroków. Teraz, gdy masz już deski, możesz wytworzyć więcej przedmiotów. Stwórz warsztat.{*CraftingTableIcon*} + + PvP: - - Aby szybciej zbierać bloki, możesz wytworzyć narzędzia o konkretnym przeznaczeniu. Niektóre narzędzia mają rączki z kijków. Wytwórz kilka kijów.{*SticksIcon*} + + Ufaj graczom: - - Użyj{*CONTROLLER_ACTION_LEFT_SCROLL*} i{*CONTROLLER_ACTION_RIGHT_SCROLL*}, aby zmienić trzymany przedmiot. + + Trotyl: - - Użyj{*CONTROLLER_ACTION_USE*}, aby używać przedmiotów, korzystać z obiektów i umieszczać przedmioty. Przedmioty, które zostały umieszczone, mogą być odzyskane za pomocą odpowiedniego narzędzia. + + Rodzaj gry: - - Wybierz warsztat, a następnie umieść celownik w miejscu, w którym chcesz go ustawić, i wciśnij{*CONTROLLER_ACTION_USE*}, aby go umieścić. + + Budynki: - - Umieść celownik na warsztacie i wciśnij{*CONTROLLER_ACTION_USE*}, aby z niego skorzystać. + + Rodzaj poziomu: - - Łopata pomaga szybciej wykopywać miękkie bloki, jak ziemię czy śnieg. Gdy zbierzesz więcej materiałów, możliwe będzie wytworzenie narzędzi, które będą działać szybciej i wytrzymają dłużej. Stwórz drewnianą łopatę.{*WoodenShovelIcon*} + + Nie znaleziono gier - - Siekiera pomaga w szybszym ścinaniu drzew i drewnianych bloków. Gdy zbierzesz więcej materiałów, możliwe będzie wytworzenie narzędzi, które będą działać szybciej i wytrzymają dłużej. Stwórz drewnianą siekierę.{*WoodenHatchetIcon*} + + Tylko za zaproszeniem - - Kilof pomaga szybciej wykopywać twarde bloki, jak kamień czy rudy. Gdy zbierzesz więcej materiałów, możliwe będzie wytworzenie narzędzi, które będą działać szybciej, wytrzymają dłużej i pomogą wydobywać twardsze materiały. Stwórz drewniany kilof.{*WoodenPickaxeIcon*} + + Więcej opcji - - Otwórz pojemnik + + Wczytaj - - - Noc nadchodzi szybko, a przebywanie na zewnątrz bywa niebezpieczne. Możesz stworzyć pancerz i broń, ale najlepsze jest bezpieczne schronienie. + + Opcje hosta - - - W pobliżu znajduje się opuszczone schronienie górnika, które możesz wykończyć. + + Gracze/zaproszenia - - - Musisz zebrać surowce, aby wykończyć schronienie. Ściany i dach mogą być zrobione z dowolnego materiału, ale potrzebne są jeszcze drzwi, okna oraz oświetlenie. + + Gra sieciowa - - Użyj kilofa, aby wydobyć trochę kamiennych bloków. Kamienne bloki po wydobyciu dadzą ci kamień brukowy. Zbierz 8 bloków kamienia brukowego, a będzie można zbudować piec. Aby dostać się do kamienia, konieczne może być przekopanie się przez ziemię. W tym celu użyj łopaty.{*StoneIcon*} + + Nowy świat - - Masz wystarczająco dużo kamienia brukowego, aby zbudować piec. Skorzystaj z warsztatu, aby go stworzyć. + + Gracze - - Użyj{*CONTROLLER_ACTION_USE*}, aby umieścić piec w świecie, a następnie z niego skorzystaj. + + Dołącz do gry - - Skorzystaj z pieca, aby stworzyć trochę węgla drzewnego. Czekając na jego stworzenie, możesz poszukać materiałów na wykończenie schronienia. + + Rozpocznij grę - - Skorzystaj z pieca, aby stworzyć trochę szkła. Czekając na jego stworzenie, możesz poszukać materiałów na wykończenie schronienia. + + Nazwa świata - - Dobre schronienie będzie miało drzwi, aby można było łatwo się do niego dostać, bez konieczności niszczenia ścian. Stwórz drewniane drzwi.{*WoodenDoorIcon*} + + Ziarno do generowania świata - - Użyj{*CONTROLLER_ACTION_USE*}, aby umieścić drzwi. Użyj{*CONTROLLER_ACTION_USE*}, aby otwierać i zamykać drzwi. + + Zostaw puste, aby stworzyć losowe ziarno - - W nocy robi się bardzo ciemno, więc w twojej siedzibie przyda się trochę światła. Stwórz pochodnię z kija i węgla drzewnego, używając interfejsu wytwarzania.{*TorchIcon*} + + Ogień się rozprzestrzenia: - - - Udało ci się ukończyć pierwszą część samouczka. + + Wpisz tekst znaku: - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować samouczek.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli uważasz, że możesz rozpocząć właściwą grę. + + Dodaj opis do zdjęcia z gry - - - Oto twój ekwipunek. Pokazuje wszystkie niesione przez ciebie przedmioty oraz te, które możesz trzymać w ręku. Wyświetlone są tu także elementy pancerza. + + Podpis - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z ekwipunku. + + Wskazówki w grze - - - Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby poruszać kursorem. Użyj{*CONTROLLER_VK_A*}, aby podnieść przedmiot znajdujący się pod kursorem. - Jeżeli znajduje się tam więcej niż jedna sztuka przedmiotu, podniesione zostaną wszystkie. Możesz użyć{*CONTROLLER_VK_X*}, aby podnieść połowę. + + Pionowy podział ekranu w trybie dla 2 graczy - - - Przenieś ten przedmiot kursorem w inne miejsce w ekwipunku i odłóż go, wciskając{*CONTROLLER_VK_A*}. - Mając kilka przedmiotów przy kursorze, wciśnij{*CONTROLLER_VK_A*}, aby odłożyć wszystkie, lub{*CONTROLLER_VK_X*}, aby odłożyć tylko jeden. + + Wyjdź - - - Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, możesz wyrzucić ten przedmiot. + + Zdjęcie z gry - - - Jeżeli chcesz uzyskać więcej informacji o przedmiocie, umieść na nim kursor i wciśnij{*CONTROLLER_VK_BACK*}. + + Bez efektów - - - Wciśnij{*CONTROLLER_VK_B*}, aby opuścić ekran ekwipunku. + + Szybkość - - - Oto ekwipunek w trybie tworzenia. Wyświetla wszystkie dostępne przedmioty oraz te, które możesz trzymać w ręku. + + Spowolnienie - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z ekwipunku w trybie tworzenia. + + Wpisz tekst znaku: + + + Klasyczne tekstury, ikony i interfejs Minecrafta! + + + Pokaż wszystkie światy tematyczne + + + Podpowiedzi + + + Przeinstaluj przedmiot dla awatara 1 + + + Przeinstaluj przedmiot dla awatara 2 + + + Przeinstaluj przedmiot dla awatara 3 + + + Przeinstaluj motyw + + + Przeinstaluj obrazek 1 + + + Przeinstaluj obrazek 2 + + + Opcje + + + Interfejs + + + Przywróć standardowe + + + Włącz kołysanie wzroku przy chodzeniu + + + Dźwięk + + + Sterowanie + + + Grafika + + + Używana jako składnik do warzenia mikstur. Do zdobycia po zabiciu duchów. + + + Do zdobycia po zabiciu zombie świnioludów. Zombie świnioludy można znaleźć w Otchłani. Używana jako składnik do warzenia mikstur. + + + Używana jako składnik do warzenia mikstur. Ich naturalnym środowiskiem są fortece Otchłani. Mogą być zasadzone na piasku dusz. + + + Powoduje poślizg. Zmienia się w wodę, jeżeli zostanie zniszczony nad innym blokiem. Roztapia się, jeżeli znajduje się dostatecznie blisko źródła światła lub w Otchłani. + + + Może być użyty jako dekoracja. + + + Używana jako składnik do warzenia mikstur i lokalizowania twierdz. Upuszczane przez płomienie, które przebywają w pobliżu lub wewnątrz fortec Otchłani. + + + Ma różne efekty po użyciu, w zależności od tego, na czym się jej użyje. + + + Używany jako składnik do warzenia mikstur. Może być połączony z innymi przedmiotami, aby wytworzyć Oko Kresu lub magmowy krem. + + + Używany jako składnik do warzenia mikstur. + + + Używana do warzenia mikstur i mikstur rozpryskowych. + + + Można ją napełnić wodą – będzie podstawą do stworzenia mikstur w stacji alchemicznej. + + + Trujące jedzenie i składnik alchemiczny. Do zdobycia po zabiciu pająka lub jaskiniowego pająka. + + + Używane jako składnik do warzenia mikstur, głównie ze szkodliwym skutkiem. + + + Rosną po zasadzeniu. Można je zebrać nożycami. Można się po nich wspinać jak po drabinie. + + + Podobna do drzwi, ale używana głównie przy ogrodzeniach. + + + Można go stworzyć z kawałków arbuza. + + + Przezroczysty blok, który może zastąpić bloki szkła. + + + Po zasileniu (za pomocą przycisku, dźwigni, płyty naciskowej, pochodni z czerwonym pyłem lub czerwonego pyłu połączonego z każdą z tych rzeczy) tłok wysuwa się, jeżeli może, i przesuwa bloki. Gdy się cofa, przeciąga blok przyczepiony do wysuniętego elementu. + + + Powstają z kamiennych bloków. Można je znaleźć w twierdzach. + + + Używane do ogradzania terenu. + + + Po zasadzeniu wyrastają z nich dynie. + + + Służy do budowy i dekoracji. + + + Spowalnia ruch podczas przechodzenia przez nią. Można ją zniszczyć nożycami, aby zdobyć nić. + + + Po zniszczeniu przywołuje rybika. Może także przywołać rybika, jeżeli w pobliżu jest atakowany inny rybik. + + + Po zasadzeniu wyrastają z nich arbuzy. + + + Do zdobycia po zabiciu kresostworów. Po rzuceniu gracz zostanie przeniesiony w miejsce, w którym wylądowała perła Kresu, i straci trochę zdrowia. + + + Blok ziemi z trawą rosnącą na górze. Wydobywany łopatą. Może być użyty do budowy. + + + Może być napełniony deszczem lub wodą z wiadra. Następnie można z niego napełniać wodą szklane butelki. + + + Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + + Powstaje po przetopieniu skały Otchłani w piecu. Można z niej zrobić blok cegły Otchłani. + + + Po zasileniu emituje światło. + + + Służy do przechowywania umieszczonego w niej przedmiotu lub bloku. + + + Przywołuje potwory określonego rodzaju. + + + Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. + + + Można zbierać z nich ziarna kakao. + + + Krowa + + + Po zabiciu zostawia skórę. Można ją wydoić, używając wiadra. + + + Owca + + + Głowy istot mogą być użyte jako dekoracja lub noszone jako maska, po umieszczeniu w miejscu hełmu. + + + Kałamarnica + + + Po zabiciu zostawia gruczoły atramentowe. + + + Przydatny do podpalania rzeczy lub wywoływania pożarów na odległość, po wystrzeleniu z dozownika. + + + Unosi się na wodzie. Można po niej chodzić. + + + Z niej zbudowane są fortece Otchłani. Nie działają na nie ogniste kule duchów. + + + Występują w fortecach Otchłani. + + + Po rzuceniu wskaże kierunek do portalu Kresu. Po umieszczeniu dwunastu sztuk w szkielecie portalu Kresu, zostanie on aktywowany. + + + Używany jako składnik do warzenia mikstur. + + + Podobna do trawy, ale świetnie nadaje się do sadzenia grzybów. + + + Występuje w fortecach Otchłani. Po zniszczeniu da narośl z Otchłani. + + + Blok występujący w Kresie. Jest bardzo odporny na wybuchy, więc nadaje się na budulec. + + + Ten blok powstaje po pokonaniu Kresosmoka. + + + Po rzuceniu wypuszcza kule doświadczenia, które podnoszą twój poziom doświadczenia. + + + Umożliwia graczowi zaklinanie mieczy, kilofów, siekier, łopat, łuków oraz elementów pancerza. Wykorzystuje poziomy doświadczenia gracza. + + + Aktywowany za pomocą dwunastu Oczu Kresu. Umożliwia graczowi podróż do Kresu. + + + Tworzy portal Kresu. + + + Po zasileniu (za pomocą przycisku, dźwigni, płyty naciskowej, pochodni z czerwonym pyłem lub czerwonego pyłu połączonego z każdą z tych rzeczy) tłok wysuwa się, jeżeli może, i przesuwa bloki. + + + Wypalane z gliny w piecu. + + + Tworzy cegły po wypaleniu w piecu. + + + Po rozbiciu daje kulki gliny, które po wypaleniu w piecu tworzą cegły. + + + Ścinane siekierą. Może być przerobione na deski lub wykorzystane jako opał. + + + Powstaje w piecu po przetopieniu piasku. Może być wykorzystane do budowy, ale rozbije się, jeżeli spróbujesz je odzyskać. + + + Wydobywany z kamienia za pomocą kilofa. Może być użyty do budowy pieca i wytwarzania kamiennych narzędzi. + + + Sprawny sposób przechowywania śnieżek. + + + Po połączeniu z miską daje gulasz. + + + Może być wydobywany wyłącznie diamentowym kilofem. Powstaje w wyniku połączenia wody z lawą, używa się go do budowy portalu. + + + Tworzy w świecie potwory. + + + Może być wydobyty łopatą, aby zyskać śnieżki. + + + Czasami po wydobyciu daje ziarna pszenicy. + + + Można przerobić na barwnik. + + + Wydobywany łopatą. Czasami podczas wykopywania możesz natrafić na krzemień. Oddziałuje na niego grawitacja, jeżeli pod spodem nie ma żadnego bloku. + + + Może być wydobyta za pomocą kilofa, aby zdobyć węgiel. + + + Może być wydobyta za pomocą kamiennego lub lepszego kilofa, aby zdobyć lazuryt. + + + Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć diamenty. + + + Służy do dekoracji. + + + Może być wydobywana za pomocą żelaznego lub lepszego kilofa, a następnie przetapiana na sztabki złota. + + + Może być wydobywana za pomocą kamiennego lub lepszego kilofa, a następnie przetapiana na sztabki żelaza. + + + Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć czerwony pył. + + + Nie może zostać zniszczona. + + + Podpala wszystko, czego dotknie. Można ją zebrać w wiadrze. + + + Wydobywany łopatą. Może być przetopiony na szkło w piecu. Oddziałuje na niego grawitacja, jeżeli pod spodem nie ma żadnego bloku. + + + Może być wydobyty za pomocą kilofa, aby zyskać kamień brukowy. + + + Wydobywana za pomocą łopaty. Może być użyta do budowy. + + + Może być zasadzona w ziemi. Z czasem wyrośnie z niej drzewo. + + + Umieszcza się go na ziemi w celu przenoszenia ładunku elektrycznego. Po dodaniu jako składnik mikstury, przedłuży czas działania jej efektu. + + + Do zebrania po zabiciu krowy. Można z niej zrobić książkę lub elementy pancerza. + + + Do zebrania po zabiciu szlamu. Służy jako składnik do warzenia mikstur lub element lepkiego tłoka. + + + Losowo zostawiane przez kury. Można z nich robić jedzenie. + + + Do zebrania po wykopaniu żwiru. Może być użyty do stworzenia krzesiwa. + + + Umożliwia jeżdżenie na świni. Świnią można kierować dzięki marchewce na kiju. + + + Do zebrania po wykopywaniu śniegu. Można nimi rzucać. + + + Do zebrania po wydobyciu jasnogłazu. Może być użyty do stworzenia bloku jasnogłazu lub do wzmocnienia siły mikstury. + + + Po zniszczeniu czasami upuszczają sadzonkę, z której wyrośnie drzewo, jeżeli się ją zasadzi. + + + Do znalezienia w lochach. Służy do budowy i dekoracji. + + + Służą do pozyskiwania wełny z owiec i bloków liści. + + + Do zebrania po zabiciu kościotrupa. Może być przerobiona na mączkę kostną. Można dać ją wilkowi, aby go oswoić. + + + Do zebrania po zabiciu czyhacza przez kościotrupa. Można ją odtworzyć w szafie grającej. + + + Gasi ogień i pomaga uprawom rosnąć. Można ją zebrać w wiadrze. + + + Zdobywana ze zboża, może być użyta do produkcji jedzenia. + + + Służy do wytwarzania cukru. + + + Może być używana jako hełm albo połączona z pochodnią, co stworzy dyniowy lampion. Jest głównym składnikiem ciasta dyniowego. + + + Po podpaleniu będzie płonąć wiecznie. + + + Po zebraniu daje pszenicę, gdy wyrośnie w pełni. + + + Ziemia przygotowana do sadzenia ziaren. + + + Po ugotowaniu w piecu daje zielony barwnik. + + + Spowalnia wszystko, co się po nim porusza. + + + Do zebrania po zabiciu kury. Można zrobić z niego strzałę. + + + Do zebrania po zabiciu czyhacza. Można zrobić z niego trotyl lub użyć jako składnika do warzenia mikstur. + + + Po zasadzeniu w zaoranej ziemi wyrośnie z nich zboże. Upewnij się, że mają dostatecznie dużo światła. + + + Wejście do portalu umożliwia ci przenoszenie się między światem zewnętrznym a Otchłanią. + + + Używany do rozpalania pieca lub tworzenia pochodni. + + + Do zebrania po zabiciu pająka, można zrobić z niej łuk lub wędkę. Po umieszczeniu na ziemi może służyć za linkę. + + + Po strzyżeniu (jeżeli jeszcze nie została ostrzyżona) daje wełnę. Można ją ufarbować na inny kolor. + + + Rozwój biznesu + + + Dyrektor ds. finansów + + + Menadżer produktu + + + Zespół deweloperski + + + Zarządzanie projektem + + + Dyrektor publikacji XBLA + + + Marketing + + + Azjatycki zespół ds. lokalizacji + + + Zespół ds. badania opinii użytkowników + + + Główne zespoły MGS + + + Menadżer ds. społeczności + + + Europejski zespół ds. lokalizacji + + + Zespół ds. lokalizacji z Redmond + + + Zespół projektancki + + + Kierownik zabawy + + + Muzyka i dźwięki + + + Programowanie + + + Główny architekt + + + Projektant graficzny + + + Rzemieślnik gry + + + Grafika + + + Producent + + + Kierownik testów + + + Główny tester + + + QA + + + Producent wykonawczy + + + Główny producent + + + Tester akceptacji punktów milowych projektu + + + Żelazna łopata + + + Diamentowa łopata + + + Złota łopata + + + Złoty miecz + + + Drewniana łopata + + + Kamienna łopata + + + Drewniany kilof + + + Złoty kilof + + + Drewniana siekiera + + + Kamienna siekiera + + + Kamienny kilof + + + Żelazny kilof + + + Diamentowy kilof + + + Diamentowy miecz + + + SDET + + + STE projektu + + + Dodatkowe STE + + + Specjalne podziękowania + + + Menadżer testów + + + Starszy kierownik testów + + + Dodatkowe testy + + + Drewniany miecz + + + Kamienny miecz + + + Żelazny miecz + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Producent + + + Strzela w ciebie ognistymi kulami, które wybuchają. + + + Szlam + + + Rozpada się na mniejsze kawałki, gdy zostanie uderzony. + + + Zombie świniolud + + + Nieagresywny, ale zaatakuje cię w grupie, gdy zaatakujesz jednego z nich. + + + Duch + + + Kresostwór + + + Jaskiniowy pająk + + + Jego ukąszenia są trujące. + + + Grzybowa krowa + + + Zaatakuje cię, gdy na niego spojrzysz. Potrafi także przenosić bloki. + + + Rybik + + + Przywołuje pobliskie rybiki, gdy zostanie zaatakowany. Ukrywa się w kamiennych blokach. + + + Atakuje cię, gdy podejdziesz blisko. + + + Po zabiciu zostawia steki wieprzowe. Można na niej jeździć w siodle. + + + Wilk + + + Nieagresywny, ale zaatakuje cię, gdy ty zaatakujesz jego. Można go oswoić, używając kości. Będzie wtedy za tobą podążał i atakował wszystko, co atakuje ciebie. + + + Kura + + + Po zabiciu zostawia pióro. Co jakiś czas składa jajo. + + + Świnia + + + Czyhacz + + + Pająk + + + Atakuje cię, gdy podejdziesz blisko. Może chodzić po ścianach. Po zabiciu upuszcza nić. + + + Zombie + + + Wybucha, jeżeli podejdziesz za blisko. + + + Kościotrup + + + Strzela w ciebie strzałami. Upuszcza je po zabiciu. + + + Daje zupę grzybową po użyciu miski. Po ostrzyżeniu zostawia grzyby i zmienia się w zwykłą krowę. + + + Pierwotny projekt i programowanie + + + Menadżer projektu/producent + + + Reszta biura Mojang + + + Grafik koncepcyjny + + + Przeliczanie liczb i statystyki + + + Koordynator gnębicieli + + + Główny programista Minecraft PC + + + Obsługa klienta + + + Biurowy DJ + + + Projektant/programista Minecraft – Pocket Edition + + + Koder ninja + + + Prezes + + + Biały kołnierzyk + + + Animator wybuchów + + + Wielki czarny smok, który przebywa w Kresie. + + + Płomień + + + Ci przeciwnicy występują w Otchłani, głównie w fortecach. Po zabiciu zostawiają płomienne różdżki. + + + Śnieżny golem + + + Śnieżne golemy mogą być stworzone z bloków śniegu i dyń. Będą rzucać śnieżkami w przeciwników swojego stwórcy. + + + Kresosmok + + + Kostka magmy + + + Żyją w dżungli. Można je oswoić, używając surowych ryb. Ocelot musi sam do ciebie podejść, ponieważ boi się gwałtownych ruchów. + + + Żelazny golem + + + Występują w wioskach i bronią ich. Można ich stworzyć z bloków żelaza i dyń. + + + Można je znaleźć w Otchłani. Podobnie jak szlamy, będą się rozpadać na mniejsze kawałki, gdy zostaną uderzone. + + + Osadnik + + + Ocelot + + + Umożliwia wzmacnianie zaklęć, gdy znajdzie się przy magicznym stole. + + + {*T3*}INSTRUKCJA : PIEC{*ETW*}{*B*}{*B*} +Piec umożliwia przetwarzanie przedmiotów poprzez wypalanie ich. Przykładowo, możesz zmienić rudę żelaza w sztabki, wypalając ją w piecu.{*B*}{*B*} +Umieść piec w świecie i wciśnij{*CONTROLLER_ACTION_USE*}, aby z niego skorzystać.{*B*}{*B*} +W dolnym polu musisz umieścić opał, a przedmiot, który ma zostać wypalony, w górnym. Piec się rozpali i zacznie działać.{*B*}{*B*} +Gdy przedmioty zostaną wypalone, możesz je przenieść z pieca do ekwipunku.{*B*}{*B*} +Jeżeli wybierzesz przedmiot, który może być wypalony lub użyty jako opał, otrzymasz możliwość szybkiego przeniesienia go do pieca. + + + {*T3*}INSTRUKCJA : DOZOWNIK{*ETW*}{*B*}{*B*} +Dozownik wystrzeliwuje przedmioty. Musisz umieścić jakiś przełącznik, na przykład dźwignię, obok dozownika, aby móc go aktywować.{*B*}{*B*} +Aby napełnić dozownik przedmiotami, wciśnij{*CONTROLLER_ACTION_USE*}, a następnie przenieś przedmioty z ekwipunku do dozownika.{*B*}{*B*} +Gdy użyjesz przełącznika, dozownik wystrzeli przedmiot. + + + {*T3*}INSTRUKCJA : WARZENIE{*ETW*}{*B*}{*B*} +Aby warzyć mikstury, niezbędna jest stacja alchemiczna , którą można zbudować w warsztacie. Tworzenie każdej mikstury zaczyna się od butelki z wodą, która powstaje po napełnieniu szklanej butelki wodą z kociołka lub ze źródła.{*B*} +Stacja alchemiczna pomieści trzy butelki, więc może robić trzy mikstury jednocześnie. Jeden składnik może być użyty na wszystkich trzech butelkach, więc zawsze warz trzy mikstury, aby jak najlepiej wykorzystać składnik.{*B*} +Umieszczenie składnika w górnym miejscu spowoduje stworzenie podstawowej mikstury. Nie ma ona żadnych właściwości, ale dodanie kolejnego składnika sprawi, że powstanie mikstura posiadająca jakiś efekt.{*B*} +Gdy stworzysz taką miksturę, możesz dodać trzeci składnik, aby działała ona dłużej (za pomocą czerwonego pyłu), była silniejsza (za pomocą jasnopyłu) lub miała negatywne efekty (za pomocą sfermentowanego oka pająka).{*B*} +Możesz także dodać proch strzelniczy, aby zamienić dowolną miksturę w miksturę rozpryskową, którą można rzucić. Rzucona mikstura rozpryskowa nałoży swój efekt na obszar w którym wyląduje.{*B*} + +Składniki do tworzenia mikstur, to:{*B*}{*B*} +* {*T2*}Narośl z Otchłani{*ETW*}{*B*} +* {*T2*}Oko pająka{*ETW*}{*B*} +* {*T2*}Cukier{*ETW*}{*B*} +* {*T2*}Łza ducha{*ETW*}{*B*} +* {*T2*}Płomienny proszek{*ETW*}{*B*} +* {*T2*}Magmowy krem{*ETW*}{*B*} +* {*T2*}Błyszczący arbuz{*ETW*}{*B*} +* {*T2*}Czerwony pył{*ETW*}{*B*} +* {*T2*}Jasnopył{*ETW*}{*B*} +* {*T2*}Sfermentowane oko pająka{*ETW*}{*B*}{*B*} + +Musisz poeksperymentować z kombinacjami składników, aby poznać wszystkie mikstury, które możesz stworzyć. + - - - Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby poruszać kursorem. - Mając otwartą listę przedmiotów, wciśnij{*CONTROLLER_VK_A*}, aby podnieść przedmiot znajdujący się pod kursorem, albo wciśnij{*CONTROLLER_VK_Y*}, aby podnieść maksymalną liczbę sztuk wybranego przedmiotu. + + {*T3*}INSTRUKCJA : WIELKA SKRZYNIA{*ETW*}{*B*}{*B*} +Dwie skrzynie umieszczone obok siebie zostaną połączone i utworzą wielką skrzynię. Można w niej przechowywać więcej przedmiotów.{*B*}{*B*} +Używa się jej tak samo jak normalnej skrzyni. - - - Kursor automatycznie przeniesie się nad wolne miejsce w pasku użycia. Możesz umieścić tam wybrany przedmiot, wciskając{*CONTROLLER_VK_A*}. Po umieszczeniu go, kursor powróci na listę przedmiotów, gdzie będzie można wybrać inny przedmiot. + + {*T3*}INSTRUKCJA : WYTWARZANIE{*ETW*}{*B*}{*B*} +Korzystając z interfejsu wytwarzania, możesz łączyć przedmioty z ekwipunku, aby tworzyć nowe. Użyj{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs wytwarzania.{*B*}{*B*} +Przełączaj się między zakładkami na górze za pomocą{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby wybrać rodzaj przedmiotu, który chcesz wytworzyć. Następnie skorzystaj z{*CONTROLLER_MENU_NAVIGATE*}, aby wybrać przedmiot do wytworzenia.{*B*}{*B*} +Obszar wytwarzania pokaże ci przedmioty, które są wymagane do stworzenia nowego przedmiotu. Wciśnij{*CONTROLLER_VK_A*}, aby wytworzyć przedmiot i umieścić go w ekwipunku. - - - Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, będziesz mógł go wyrzucić. Aby usunąć wszystkie przedmioty z paska szybkiego wyboru, wciśnij{*CONTROLLER_VK_X*}. + + {*T3*}INSTRUKCJA : WARSZTAT{*ETW*}{*B*}{*B*} +Dzięki warsztatowi możesz wytwarzać większe przedmioty.{*B*}{*B*} +Umieść warsztat w świecie i wciśnij{*CONTROLLER_ACTION_USE*}, aby z niego skorzystać.{*B*}{*B*} +Wytwarzanie za pomocą warsztatu działa tak samo jak normalne wytwarzanie, ale posiada większy obszar wytwarzania i umożliwia produkcję większej liczby przedmiotów. - - - Przełączaj się między zakładkami na górze ekranu za pomocą{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby wybrać zakładkę z interesującą cię grupą przedmiotów. + + {*T3*}INSTRUKCJA : ZAKLINANIE{*ETW*}{*B*}{*B*} +Punkty doświadczenia zdobyte po zabiciu istoty albo gdy konkretne bloki zostaną wydobyte lub przetopione w piecu, mogą być wykorzystane do zaklinania niektórych narzędzi, broni, części pancerza oraz książek.{*B*} +Gdy miecz, łuk, siekiera, kilof, łopata, element pancerza lub książka zostaną umieszczone pod księgą na magicznym stole, trzy przyciski po prawej stronie wyświetlą możliwe do wykonania zaklęcia oraz ich koszt w poziomach doświadczenia.{*B*} +Jeżeli nie masz wystarczającej liczby poziomów, aby z nich skorzystać, koszt będzie wyświetlony na czerwono. W przeciwnym wypadku – na zielono.{*B*}{*B*} +Samo zaklęcie zostanie wybrane losowo, zależnie od wyświetlonego kosztu.{*B*}{*B*} +Jeżeli magiczny stół jest otoczony biblioteczkami (maksymalnie 15 biblioteczek) z blokiem przerwy między nimi, siła zaklęć zostanie wzmocniona, a magiczne runy zaczną wydobywać się z książki na stole.{*B*}{*B*} +Wszystkie składniki niezbędne do stworzenia magicznego stołu można znaleźć w wioskach. Można też wydobyć je ze świata albo wytworzyć.{*B*}{*B*} +Zaklętych ksiąg używa się przy kowadle, aby nakładać zaklęcia na przedmioty. Dzięki temu masz większą kontrolę nad tym, jakie zaklęcia zostaną nałożone na przedmioty.{*B*} - - - Jeżeli chcesz uzyskać więcej informacji o przedmiocie, umieść na nim kursor i wciśnij{*CONTROLLER_VK_BACK*}. + + {*T3*}INSTRUKCJA : BLOKOWANIE POZIOMÓW{*ETW*}{*B*}{*B*} +Jeżeli znajdziesz obraźliwą treść na poziomie, na którym grasz, możesz dodać go do listy zablokowanych poziomów. +Aby to zrobić, zatrzymaj grę, a następnie wciśnij{*CONTROLLER_VK_RB*}, żeby wybrać opcję blokowania poziomów. +Gdy w przyszłości spróbujesz zagrać na tym poziomie, otrzymasz powiadomienie, że znajduje się on na twojej liście zablokowanych poziomów. Będziesz móc wybrać, czy chcesz usunąć go z listy, czy zrezygnować. - + - Wciśnij{*CONTROLLER_VK_B*}, aby opuścić ekran ekwipunku w trybie tworzenia. + {*T3*}INSTRUKCJA: OPCJE HOSTA I GRACZA{*ETW*}{*B*}{*B*} + + {*T1*}Opcje gry{*ETW*}{*B*} + Podczas wczytywania lub tworzenia świata możesz wcisnąć przycisk „Więcej opcji”, aby przejść do menu, które umożliwia modyfikowanie gry.{*B*}{*B*} + + {*T2*}Gracz kontra gracz{*ETW*}{*B*} + Po włączeniu gracze mogą sobie zadawać obrażenia. Ta opcja działa tylko w trybie przetrwania.{*B*}{*B*} + + {*T2*}Ufaj graczom{*ETW*}{*B*} + Po wyłączeniu gracze, którzy dołączą do gry, mają ograniczone możliwości działania. Nie mogą wydobywać ani używać przedmiotów, umieszczać bloków, korzystać z drzwi i przycisków, używać pojemników, atakować graczy i zwierząt. Możesz zmienić te opcje dla konkretnych graczy, korzystając z menu w grze.{*B*}{*B*} + + {*T2*}Ogień się rozprzestrzenia{*ETW*}{*B*} + Po włączeniu ogień będzie się rozprzestrzeniał na pobliskie łatwopalne bloki. Ta opcja może być zmieniona podczas gry.{*B*}{*B*} + + {*T2*}Trotyl wybucha{*ETW*}{*B*} + Po włączeniu trotyl będzie wybuchał po detonacji. Ta opcja może być zmieniona podczas gry.{*B*}{*B*} + + {*T2*}Uprawnienia hosta{*ETW*}{*B*} + Po włączeniu host może umożliwić sobie latanie, wyłączyć zmęczenie i stać się niewidzialnym, korzystając z menu w grze. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Cykl dnia{*ETW*}{*B*} + Po wyłączeniu pora dnia nie będzie się zmieniać.{*B*}{*B*} + + {*T2*}Zachowaj ekwipunek{*ETW*}{*B*} + Po włączeniu gracze zachowają swój ekwipunek po śmierci.{*B*}{*B*} + + {*T2*}Pojawianie się istot{*ETW*}{*B*} + Po wyłączeniu istoty nie będą pojawiały się naturalnie.{*B*}{*B*} + + {*T2*}Szkodzenie przez istoty{*ETW*}{*B*} + Po wyłączeniu uniemożliwia potworom i zwierzętom zmianę bloków (np. wybuchy czyhaczów nie będą niszczyły bloków, a owce nie będą usuwały trawy) lub podnoszenie przedmiotów.{*B*}{*B*} + + {*T2*}Przedmioty z istot{*ETW*}{*B*} + Po wyłączeniu potwory i zwierzęta nie będą pozostawiały przedmiotów (np. czyhacze nie pozostawią prochu strzelniczego).{*B*}{*B*} + + {*T2*}Przedmioty z bloków{*ETW*}{*B*} + Po wyłączeniu bloki nie będą zostawiały przedmiotów po zniszczeniu (np. kamienne bloki nie pozostawią kamienia brukowego).{*B*}{*B*} + + {*T2*}Naturalna regeneracja{*ETW*}{*B*} + Po wyłączeniu gracze nie będą naturalnie regenerować zdrowia.{*B*}{*B*} + +{*T1*}Opcje generowania świata{*ETW*}{*B*} +Podczas tworzenia nowego świata dostępne są dodatkowe opcje.{*B*}{*B*} + + {*T2*}Generowanie budynków{*ETW*}{*B*} + Po włączeniu miejsca takie jak wioski i twierdze będą pojawiać się w świecie.{*B*}{*B*} + + {*T2*}Superpłaski świat{*ETW*}{*B*} + Po włączeniu zostanie wygenerowany całkowicie płaski świat zewnętrzny i Otchłań.{*B*}{*B*} + + {*T2*}Dodatkowa skrzynia{*ETW*}{*B*} + Po włączeniu w pobliżu miejsca odrodzenia znajdzie się skrzynia zawierająca przydatne przedmioty.{*B*}{*B*} + + {*T2*}Resetuj Otchłań{*ETW*}{*B*} + Po włączeniu wygląd Otchłani zostanie wygenerowany ponownie. Jest to przydatne przy starszych zapisach gry, gdy fortece Otchłani nie były obecne.{*B*}{*B*} + + {*T1*}Opcje w grze{*ETW*}{*B*} Podczas gry wciśnij {*BACK_BUTTON*}, aby otworzyć menu i uzyskać dostęp do opcji.{*B*}{*B*} + + {*T2*}Opcje hosta{*ETW*}{*B*} Host i wszyscy gracze, którzy są moderatorami, mają dostęp do menu „Opcje hosta”. W tym menu można włączyć lub wyłączyć rozprzestrzenianie się ognia i wybuchy trotylu.{*B*}{*B*} + + {*T1*}Opcje gracza{*ETW*}{*B*} + W celu zmiany uprawnień gracza, wybierz go i wciśnij{*CONTROLLER_VK_A*}, aby otworzyć menu uprawnień, gdzie dostępne są następujące opcje.{*B*}{*B*} + + {*T2*}Może budować i wydobywać{*ETW*}{*B*} + Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Gdy opcja zostanie włączona, gracz może normalnie oddziaływać na świat. Po jej wyłączeniu gracz nie może umieszczać ani niszczyć bloków, lub wchodzić w interakcję z wieloma przedmiotami i blokami.{*B*}{*B*} + + {*T2*}Może korzystać z drzwi i przełączników{*ETW*}{*B*} + Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Po jej wyłączeniu gracz nie może korzystać z drzwi i przełączników.{*B*}{*B*} + + {*T2*}Może otwierać pojemniki{*ETW*}{*B*} + Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Po jej wyłączeniu gracz nie może otwierać pojemników, takich jak skrzynie.{*B*}{*B*} + + {*T2*}Może atakować graczy{*ETW*}{*B*} + Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Po jej wyłączeniu gracz nie może zadawać obrażeń innym graczom.{*B*}{*B*} + + {*T2*}Może atakować zwierzęta{*ETW*}{*B*} + Ta opcja jest dostępna wyłącznie, gdy opcja „Ufaj graczom” jest wyłączona. Po jej wyłączeniu gracz nie może zadawać obrażeń zwierzętom.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + Gdy ta opcja zostanie włączona, gracz może zmieniać uprawnienia innych graczy (poza hostem), jeżeli opcja „Ufaj graczom” jest wyłączona, wyrzucać graczy oraz włączać i wyłączać rozprzestrzenianie się ognia i wybuchy trotylu.{*B*}{*B*} + + {*T2*}Wyrzuć gracza{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + + {*T1*}Opcje hosta{*ETW*}{*B*} + Jeżeli opcja „Uprawnienia hosta” jest włączona, może on modyfikować przysługujące mu uprawnienia. Aby zmienić uprawnienia gracza, wybierz go i wciśnij{*CONTROLLER_VK_A*}, aby otworzyć menu uprawnień gracza, gdzie dostępne są następujące opcje.{*B*}{*B*} + + {*T2*}Możesz latać{*ETW*}{*B*} + Gdy ta opcja jest włączona, gracz może latać. Ta opcja odnosi się tylko do trybu przetrwania, ponieważ w trybie tworzenia wszyscy gracze mogą latać.{*B*}{*B*} + + {*T2*}Wyłącz zmęczenie{*ETW*}{*B*} + Ta opcja odnosi się tylko do trybu przetrwania. Po jej włączeniu aktywności fizyczne (chodzenie/bieganie/skakanie itp.) nie zmniejszają wskaźnika najedzenia. Jednak gdy gracz zostanie ranny, wskaźnik najedzenia zacznie powoli maleć podczas regeneracji zdrowia.{*B*}{*B*} + + {*T2*}Niewidzialność{*ETW*}{*B*} + Po włączeniu tej opcji gracz staje się niewidzialny dla innych graczy i nie może zostać zraniony.{*B*}{*B*} + + {*T2*}Teleportacja{*ETW*}{*B*} + Umożliwia graczowi teleportację innych graczy lub siebie samego do innych graczy. + - - - Oto interfejs wytwarzania. Umożliwia on łączenie zebranych przedmiotów w nowe. + + Następna strona - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak wytwarzać przedmioty. + + {*T3*}INSTRUKCJA : HODOWLA ZWIERZĄT{*ETW*}{*B*}{*B*} +Jeżeli chcesz utrzymać swoje zwierzęta w jednym miejscu, stwórz ogrodzony teren o wymiarach poniżej 20x20 bloków i wprowadź tam zwierzęta. Dzięki temu będą tam, gdy wrócisz. - - {*B*} - Wciśnij{*CONTROLLER_VK_X*}, aby wyświetlić opis przedmiotu. + + {*T3*}INSTRUKCJA : ROZMNAŻANIE ZWIERZĄT{*ETW*}{*B*}{*B*} +Zwierzęta w Minecrafcie mogą się rozmnażać i rodzić małe zwierzęta!{*B*} +Aby zwierzęta się rozmnażały, musisz nakarmić je odpowiednim jedzeniem, które wprowadzi je w miłosny nastrój.{*B*} +Nakarm krowę, grzybową krowę, lub owcę pszenicą, świnię marchewką, kurę ziarnami pszenicy lub naroślą z Otchłani, a wilka dowolnym mięsem, a rozpoczną one poszukiwania innego zwierzęcia ze swojego gatunku, które także jest w miłosnym nastroju.{*B*} +Gdy zwierzęta tego samego gatunku się spotkają i oba są w miłosnym nastroju, pocałują się, a po chwili pojawi się małe zwierzę. Młode będzie podążało za rodzicami, dopóki nie dorośnie.{*B*} +Po przeminięciu miłosnego nastroju zwierzę nie będzie mogło go osiągnąć przez około 5 minut.{*B*} +Na świecie może przebywać określona liczba zwierząt, dlatego mogą przestać się rozmnażać, jeżeli masz ich dużo. - - {*B*} - Wciśnij{*CONTROLLER_VK_X*}, aby wyświetlić składniki niezbędne do stworzenia wybranego przedmiotu. + + {*T3*}INSTRUKCJA : PORTAL DO OTCHŁANI{*ETW*}{*B*}{*B*} +Portal do Otchłani umożliwia graczom przemieszczanie się pomiędzy światem zewnętrznym a Otchłanią. Otchłań może być używana do szybkiej podróży przez świat zewnętrzny – jeden blok w Otchłani to trzy bloki w świecie zewnętrznym, więc jeżeli wybudujesz portal w Otchłani i przez niego wyjdziesz, pojawisz się trzy razy dalej od miejsca wejścia.{*B*}{*B*}Potrzeba minimum 10 bloków obsydianu, aby wybudować portal – musi mieć 5 bloków wysokości, 4 bloki szerokości i 1 blok głębokości. Gdy wybudujesz szkielet, musisz go podpalić, aby aktywować portal. Można to zrobić krzesiwem lub ognistym ładunkiem.{*B*}{*B*} +Przykładowe portale znajdują się na zdjęciu po prawej. - - {*B*} - Wciśnij{*CONTROLLER_VK_X*}, aby ponownie wyświetlić ekwipunek. + + {*T3*}INSTRUKCJA : SKRZYNIA{*ETW*}{*B*}{*B*} +Po stworzeniu skrzyni możesz umieścić ją w świecie i skorzystać z niej za pomocą{*CONTROLLER_ACTION_USE*}, aby przechowywać w niej przedmioty.{*B*}{*B*} +Użyj kursora, aby przenosić przedmioty między ekwipunkiem a skrzynią.{*B*}{*B*} +Przedmioty będą przechowywane w skrzyni, aby można było z nich skorzystać kiedy indziej. - - - Przełączaj się między zakładkami na górze ekranu za pomocą{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby wybrać zakładkę z interesującą cię grupą przedmiotów do wytworzenia, a następnie użyj{*CONTROLLER_MENU_NAVIGATE*}, aby wybrać przedmiot. + + Byłeś na Mineconie? - - - Obszar wytwarzania pokazuje składniki, które są niezbędne do stworzenia nowego przedmiotu. Wciśnij{*CONTROLLER_VK_A*}, aby stworzyć przedmiot i umieścić go w ekwipunku. + + Nikt w Mojang nie widział twarzy Junkboya. - - - Możesz tworzyć jeszcze więcej przedmiotów, korzystając z warsztatu. Wytwarzanie przedmiotów w warsztacie działa tak samo jak zwykłe wytwarzanie, ale dzięki większemu obszarowi możliwe jest połączenie większej liczby składników. + + Czy wiesz, że istnieje Minecraft Wiki? - - - Dolna prawa część interfejsu wytwarzania przedstawia twój ekwipunek. Wyświetla także opis wybranego przedmiotu oraz składniki niezbędne do jego stworzenia. + + Nie zwracaj uwagi na błędy. - - - Opis aktualnie wybranego przedmiotu. Może dać ci on podpowiedź co do zastosowania przedmiotu. + + Czyhacze narodziły się z błędu w kodowaniu. - - - Lista składników niezbędnych do wytworzenia wybranego przedmiotu. + + To kura czy kaczka? - - Zebrane drewno może być przerobione na deski. Wybierz ikonę desek i wciśnij{*CONTROLLER_VK_A*}, aby je stworzyć.{*PlanksIcon*} + + Nowe biuro Mojang jest czadowe! - - - Po wybudowaniu warsztatu umieść go w świecie, aby możliwe było tworzenie większej liczby przedmiotów.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. + + {*T3*}INSTRUKCJA : PODSTAWY{*ETW*}{*B*}{*B*} +Minecraft jest grą o ustawianiu bloków i budowaniu z nich wszystkiego, co tylko sobie wyobrazisz. W nocy przychodzą potwory, więc wybuduj schronienie, nim się pojawią.{*B*}{*B*} +Użyj{*CONTROLLER_ACTION_LOOK*}, aby się rozglądać.{*B*}{*B*} +Użyj{*CONTROLLER_ACTION_MOVE*}, aby się poruszać.{*B*}{*B*} +Wciśnij{*CONTROLLER_ACTION_JUMP*}, aby podskoczyć.{*B*}{*B*} +Wychyl {*CONTROLLER_ACTION_MOVE*} szybko dwukrotnie do przodu, aby pobiec. Trzymaj {*CONTROLLER_ACTION_MOVE*} do przodu, a twoja postać będzie biegła, dopóki się nie zmęczy lub pasek najedzenia spadnie poniżej{*ICON_SHANK_03*}.{*B*}{*B*} +Przytrzymaj{*CONTROLLER_ACTION_ACTION*}, aby wydobywać lub ścinać ręką albo przedmiotem trzymanym w ręku. Do wydobywania niektórych bloków potrzebne są narzędzia, które trzeba wytworzyć.{*B*}{*B*} +Jeżeli trzymasz w ręku przedmiot, wciśnij{*CONTROLLER_ACTION_USE*}, aby go użyć, lub{*CONTROLLER_ACTION_DROP*}, aby wyrzucić. - - - Wciśnij{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby zmienić kategorię przedmiotów, które chcesz wytwarzać. Wybierz narzędzia.{*ToolsIcon*} + + {*T3*}INSTRUKCJA : INTERFEJS{*ETW*}{*B*}{*B*} +Interfejs pokazuje informacje o twoim stanie – twoje zdrowie, zapas powietrza, gdy jesteś pod wodą, stopień najedzenia (musisz jeść, aby go uzupełniać) oraz pancerz, jeżeli jakiś posiadasz. Jeżeli stracisz trochę zdrowia, ale twój wskaźnik najedzenia ma wypełnione 9 lub więcej{*ICON_SHANK_01*}, twoje zdrowie zacznie się regenerować automatycznie. Jedzenie napełni twój wskaźnik najedzenia.{*B*} +Znajduje się tu także wskaźnik doświadczenia, przy którym wyświetlony jest twój poziom doświadczenia pasek, który pokazuje ile punktów doświadczenia potrzebujesz do następnego poziomu. Punkty doświadczenia zdobywa się zbierając kule doświadczenia, które pojawiają się po zabiciu istot, wydobyciu niektórych rodzajów bloków, rozmnażaniu zwierząt, łowieniu ryb oraz wytapianiu sztabek w piecu.{*B*}{*B*} +Pokazuje także przedmioty, których można użyć. Użyj{*CONTROLLER_ACTION_LEFT_SCROLL*} i{*CONTROLLER_ACTION_RIGHT_SCROLL*}, aby zmienić przedmiot trzymany w dłoni. - - - Wciśnij{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby zmienić kategorię przedmiotów, które chcesz wytwarzać. Wybierz obiekty.{*StructuresIcon*} + + {*T3*}INSTRUKCJA : EKWIPUNEK{*ETW*}{*B*}{*B*} +Wciśnij{*CONTROLLER_ACTION_INVENTORY*}, aby zajrzeć do ekwipunku.{*B*}{*B*} +Ten ekran wyświetla wszystkie niesione przez ciebie przedmioty oraz te, które możesz trzymać w ręku. Twój pancerz także tu jest.{*B*}{*B*} +Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby poruszać kursorem. Użyj{*CONTROLLER_VK_A*}, aby podnieść przedmiot znajdujący się pod kursorem. Jeżeli znajduje się tam więcej niż jedna sztuka przedmiotu, podniesione zostaną wszystkie. Możesz użyć{*CONTROLLER_VK_X*}, aby podnieść połowę.{*B*}{*B*} +Przesuń kursorem przedmiot w inne miejsce ekwipunku i umieść go tam, używając{*CONTROLLER_VK_A*}. Mając kilka przedmiotów przyczepionych do kursora, użyj{*CONTROLLER_VK_A*}, aby odłożyć wszystkie, lub{*CONTROLLER_VK_X*}, aby odłożyć tylko jeden.{*B*}{*B*} +Najedź kursorem na pancerz, a uzyskasz możliwość umieszczenia go w przeznaczonym dla niego miejscu.{*B*}{*B*} +Można zmienić kolor skórzanego pancerza, farbując go barwnikiem. Można tego dokonać z menu ekwipunku, podnosząc przedmiot za pomocą kursora, a następnie wciskając{*CONTROLLER_VK_X*} po umieszczeniu kursora nad elementem pancerza, który chcesz ufarbować. - - - Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby zmienić przedmiot, który chcesz stworzyć. Niektóre przedmioty występują w różnych wersjach, w zależności od wybranych składników. Wybierz drewnianą łopatę.{*WoodenShovelIcon*} + + Minecon 2013 odbył się w Orlando, na Florydzie! - - - Niektóre z przepisów wymagają wielu kroków. Teraz, gdy masz już deski, możesz wytworzyć więcej przedmiotów. Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby zmienić przedmiot, który chcesz stworzyć. Wybierz warsztat.{*CraftingTableIcon*} + + .party() było doskonałe! - - - Dzięki stworzonym narzędziom będziesz w stanie skuteczniej wydobywać materiały.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. + + Zawsze zakładaj, że plotki są fałszywe, zamiast zakładać, że są prawdziwe! - - - Niektóre przedmioty nie mogą być stworzone w warsztacie. Niezbędny jest piec. Stwórz piec.{*FurnaceIcon*} + + Poprzednia strona - - - Umieść stworzony piec w świecie. Dobrze jest umieścić go w siedzibie.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. + + Handel - - - Oto interfejs pieca. Piec umożliwia ci przetwarzanie przedmiotów poprzez ich wypalanie. Przykładowo, możesz przetopić rudę żelaza na sztabki żelaza. + + Kowadło - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z pieca. + + Kres + + + Blokowanie poziomów + + + Tryb tworzenia + + + Opcje hosta i gracza + + + {*T3*}INSTRUKCJA: KRES{*ETW*}{*B*}{*B*} +Kres to inny wymiar, do którego można dotrzeć przez aktywny portal Kresu. Portal Kresu można znaleźć w twierdzy, która znajduje się głęboko pod ziemią, w świecie zewnętrznym.{*B*} +Aby aktywować portal Kresu, musisz umieścić Oko Kresu w szkielecie portalu Kresu, który go nie posiada.{*B*} +Gdy portal zostanie aktywowany, przejdź przez niego, aby przenieść się do Kresu.{*B*}{*B*} +W Kresie spotkasz Kresosmoka, potężnego i agresywnego wroga, oraz wiele kresostworów, więc wcześniej musisz się dobrze przygotować do walki!{*B*}{*B*} +Znajdziesz tam także kryształy Kresu, które mieszczą się na szczycie 8 obsydianowych kolumn – Kresosmok wykorzystuje je do leczenia, więc musisz je zniszczyć w pierwszej kolejności.{*B*} +Niektórych z nich można dosięgnąć strzałami, ale pozostałe są osłonięte żelaznymi ogrodzeniami i trzeba się do nich wspiąć.{*B*}{*B*} +Gdy to robisz, Kresosmok będzie cię atakował, podlatując i plując kulami kwasu!{*B*} +Jeżeli zbliżysz się do podium z jajkiem, które jest otoczone kolcami, Kresosmok nadleci, aby cię zaatakować – to doskonała okazja, żeby zadać mu poważne obrażenia!{*B*} +Unikaj kwasowych ataków i celuj w oczy. Jeżeli to możliwe, sprowadź znajomych, którzy pomogą ci w walce!{*B*}{*B*} +Gdy dotrzesz do Kresu, twoi znajomi zobaczą miejsce położenia portalu Kresu na swoich mapach, więc z łatwością do ciebie dołączą. + + + + {*ETB*}Witaj ponownie! Być może umknęło to twojej uwadze, ale Minecraft został zaktualizowany.{*B*}{*B*} +Wprowadzono wiele nowych funkcji, które urozmaicą zabawę tobie i twoim znajomym. Poniżej znajduje się ich przegląd. Miłego czytania i dobrej zabawy!{*B*}{*B*} +{*T1*}Nowe przedmioty{*ETB*} – utwardzona glina, zabarwiona glina, blok węgla, bela siana, tor aktywujący, blok czerwonego kamienia, sensor światła słonecznego, podajnik, lej, wagonik z lejem, wagonik z trotylem, komparator, obciążeniowa płyta naciskowa, znacznik, skrzynia z pułapką, fajerwerk, gwiazda pirotechniczna, gwiazda z Otchłani, smycz, zbroja dla konia, tabliczka z imieniem, jajo tworzące konia{*B*}{*B*} +{*T1*}Nowe istoty{*ETB*} – Uschnięty, uschnięty kościotrup, wiedźmy, nietoperze, konie, osły i muły{*B*}{*B*} +{*T1*}Nowe funkcje{*ETB*} – Ujarzmij konia, by na nim jeździć, twórz fajerwerki i and zorganizuj pokaz, nazywaj zwierzęta i potwory, korzystając z tabliczek z imionami, twórz bardziej skomplikowane obwody z czerwonego kamienia i kontroluj działania gości w twoim świecie za sprawą nowych opcji hosta!{*B*}{*B*} +{*T1*}Nowy świat samouczka{*ETB*} – Naucz się wykorzystywać stare i nowe funkcje w świecie samouczka. Spróbuj odnaleźć wszystkie płyty muzyczne ukryte w świecie!{*B*}{*B*} + + + + Zadaje więcej obrażeń niż uderzenie pięścią. + + + Używana do wykopywania ziemi, trawy, piasku, żwiru oraz śniegu szybciej niż ręką. Łopaty są niezbędne do tworzenia śnieżek. - - - W dolnym polu musisz umieścić opał, a przedmiot, który ma zostać zmieniony, w górnym. Piec się rozpali i rozpocznie działanie. Zmieniony przedmiot znajdzie się po prawej stronie. + + Bieg - - - Wiele drewnianych przedmiotów może posłużyć za opał, ale nie wszystko pali się tak samo długo. W czasie gry znajdziesz inne przedmioty, które mogą posłużyć za opał. + + Co nowego - - - Gdy przedmioty zostaną przetworzone, możesz je przenieść do ekwipunku. Poeksperymentuj z różnymi składnikami, aby zobaczyć, co uda ci się zrobić. + + {*T3*}Zmiany i dodatki{*ETW*}{*B*}{*B*} +– Dodano nowe przedmioty – utwardzona glina, zabarwiona glina, blok węgla, bela siana, tor aktywujący, blok czerwonego kamienia, sensor światła słonecznego, podajnik, lej, wagonik z lejem, wagonik z trotylem, komparator, obciążeniowa płyta naciskowa, znacznik, skrzynia z pułapką, fajerwerk, gwiazda pirotechniczna, gwiazda z Otchłani, smycz, zbroja dla konia, tabliczka z imieniem, jajo tworzące konia{*B*} +– Dodano nowe istoty – Uschnięty, uschnięty kościotrup, wiedźmy, nietoperze, konie, osły i muły{*B*} +– Dodano nowe elementy do generowania terenu – chatki wiedźm.{*B*} +– Dodano interfejs znacznika.{*B*} +– Dodano interfejs konia.{*B*} +– Dodano interfejs leja.{*B*} +– Dodano fajerwerki – Interfejs fajerwerków jest dostępny w warsztacie, jeśli gracz posiada składniki do stworzenia gwiazdy pirotechnicznej lub fajerwerku.{*B*} +– Dodano tryb przygody – Można rozbijać bloki tylko właściwymi narzędziami.{*B*} +– Dodano mnóstwo nowych dźwięków.{*B*} +– Istoty, przedmioty i pociski mogą przechodzić przez portale.{*B*} +– Można blokować powtarzacze, dostarczając zasilenie z boku za pomocą innego powtarzacza.{*B*} +– Zombie i kościotrupy mogą się pojawiać z różną bronią i zbroją.{*B*} +– Nowe wiadomości o śmierci.{*B*} +– Nazywaj istoty, korzystając z tabliczek z imionami, i zmieniaj nazwy pojemników, które wyświetlą się, gdy menu jest otwarte.{*B*} +– Mączka kostna nie sprawia już, że coś osiąga swoje pełne rozmiary, ale rośnie losowymi etapami.{*B*} +– Można wykryć sygnał z czerwonego kamienia określający zawartość skrzyń, stacji alchemicznych, dozowników i szaf grających, ustawiając komparator bezpośrednio przy nich.{*B*} +– Dozowniki mogą być skierowane w dowolnym kierunku.{*B*} +– Po zjedzeniu złotego jabłka gracz zyskuje na krótki czas punkty absorpcji.{*B*} +– Im dłużej przebywasz na danym obszarze, tym silniejsze będą pojawiające się tam potwory.{*B*} + - - - Jeżeli użyjesz drewna jako składnika, możesz zrobić węgiel drzewny. Umieść opał w piecu, a drewno jako składnik. Stworzenie węgla drzewnego potrwa chwilę, więc możesz zrobić coś innego i wrócić za jakiś czas. + + Udostępnianie zdjęć - - - Węgiel drzewny może być użyty do rozpalenia w piecu albo stworzenia pochodni, po połączeniu z kijem. + + Skrzynie - - - Użycie piasku jako składnika umożliwi stworzenie szkła. Stwórz trochę szkła i użyj go do zrobienia okien. + + Wytwarzanie - - - Oto interfejs warzenia. Dzięki niemu możesz stworzyć mikstury o różnorodnym działaniu. + + Piec - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać ze stacji alchemicznej. + + Podstawy - - - Mikstury warzy się poprzez umieszczenie składnika w górnym miejscu oraz mikstur lub butelek z wodą w dolnych miejscach (jednocześnie można warzyć do trzech mikstur). Gdy w stacji alchemicznej znajdzie się odpowiednia kombinacja, rozpocznie się proces warzenia, a po chwili powstanie mikstura. + + Interfejs - - - Podstawowym składnikiem wszystkich mikstur jest butelka z wodą. Większość mikstur powstaje przez wykorzystanie narośli z Otchłani, co da dziwną miksturę, z której po dodaniu kolejnego składnika powstanie właściwa mikstura. + + Ekwipunek - - - Gdy będziesz już w posiadaniu mikstury, możliwe będzie modyfikowanie jej efektów. Dodanie czerwonego pyłu wydłuży czas działania, a jasnopyłu - wzmocni jej efekt. + + Dozownik - - - Dodanie sfermentowanego oka pająka czyni miksturę szkodliwą i może sprawić, że będzie miała odwrotny efekt. Dodanie prochu strzelniczego zmienia miksturę w miksturę rozpryskową, którą można rzucić, aby jej efekt zadziałał na docelowym obszarze. + + Zaklinanie - - - Stwórz miksturę odporności na ogień, najpierw dodając do butelki z wodą narośl z Otchłani, a następnie magmowy krem. + + Portal do Otchłani - - - Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs warzenia. + + Tryb wieloosobowy - - - W tym miejscu znajduje się stacja alchemiczna, kociołek i skrzynia wypełniona składnikami do warzenia mikstur. + + Hodowla zwierząt - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat warzenia i mikstur.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Rozmnażanie zwierząt - - - Pierwszym etapem warzenia mikstur jest stworzenie butelki z wodą. Wyjmij szklaną butelkę ze skrzyni. + + Warzenie - - - Możesz napełnić szklaną butelkę wodą z kociołka lub wykorzystując blok wody. Napełnij szklaną butelkę, celując w wodę i wciskając{*CONTROLLER_ACTION_USE*}. + + deadmau5 lubi Minecrafta! - - - Jeżeli kociołek zrobi się pusty, możesz go napełnić wodą z wiadra. + + Świnioludy nie zaatakują cię, chyba że ty zaatakujesz ich pierwszy. - - - Skorzystaj ze stacji alchemicznej, aby stworzyć miksturę odporności na ogień. Będzie ci potrzebna butelka z wodą, narośl z Otchłani oraz magmowy krem. + + Możesz zmienić punkt odrodzenia i przeskoczyć w czasie do świtu, korzystając z łóżka. - - - Trzymając miksturę w ręku, przytrzymaj{*CONTROLLER_ACTION_USE*}, aby z niej skorzystać. W przypadku normalnej mikstury wypijesz ją i otrzymasz jej efekt. W przypadku mikstury rozpryskowej, rzucisz nią i nałożysz jej efekt na wszystkie istoty znajdujące się w pobliżu miejsca trafienia. - Mikstury rozpryskowe powstają po dodaniu prochu strzelniczego do zwykłej mikstury. + + Odbijaj kule ognia, którymi strzelają duchy! - - - Użyj na sobie mikstury odporności na ogień. + + Stwórz trochę pochodni, aby w nocy oświetlić teren. Potwory będą unikać obszarów w pobliżu pochodni. - - - Teraz, gdy ogień i lawa nie są dla ciebie groźne, możesz dostać się do wcześniej niedostępnych miejsc. + + Dzięki torom i wagonikom możesz szybciej dotrzeć do odległych miejsc! - - - Oto interfejs zaklinania, który służy do dodawania zaklęć do broni, elementów pancerza i niektórych narzędzi. + + Zasadź sadzonki, a wyrosną z nich drzewa. - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat interfejsu zaklinania.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Wybudowanie portalu umożliwi ci przeniesienie się do innego wymiaru – Otchłani. - - - Aby nałożyć zaklęcie na przedmiot, umieść go w miejscu zaklinania. Broń, elementy pancerza i niektóre narzędzia mogą być zaklęte, co da im dodatkowe właściwości, jak zwiększoną odporność na obrażenia czy większą liczbę przedmiotów powstałych po wydobyciu bloku. + + Kopanie pionowo w dół lub w górę nie jest dobrym pomysłem. - - - Gdy przedmiot zostanie umieszczony w miejscu zaklinania, przyciski po prawej pokażą szereg losowych zaklęć. + + Mączka kostna (z kości kościotrupa) może być użyta jako nawóz i sprawić, że rośliny wyrosną natychmiast! - - - Liczba wyświetlona na przycisku wskazuje koszt zaklęcia w poziomach doświadczenia. Jeżeli nie masz wystarczająco wysokiego poziomu, przycisk będzie nieaktywny. + + Czyhacze wybuchają, gdy podejdą blisko ciebie! - - - Wybierz zaklęcie i wciśnij{*CONTROLLER_VK_A*}, aby zakląć przedmiot. Obniży to twój poziom doświadczenia o koszt zaklęcia. + + Wciśnij{*CONTROLLER_VK_B*}, aby upuścić trzymany w ręku przedmiot! - - - Mimo że zaklęcia są zawsze losowe, niektóre z potężniejszych są dostępne tylko, gdy masz dostatecznie wysoki poziom doświadczenia, a wokół magicznego stołu znajduje się odpowiednio dużo biblioteczek, które wzmacniają jego moc. + + Używaj odpowiednich do wykonywanego zadania narzędzi! - - - Znajdziesz tu magiczny stół oraz inne przedmioty, które pomogą ci w nauce zaklinania. + + Jeżeli nie możesz znaleźć węgla do stworzenia pochodni, zawsze możesz stworzyć trochę węgla drzewnego z drewna, korzystając z pieca. - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat zaklinania.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Jedzenie usmażonych steków wieprzowych odnawia więcej zdrowia niż jedzenie surowych. - - - Magiczny stół umożliwia ci dodawanie specjalnych efektów, takich jak zwiększona odporność na obrażenia czy większa liczba przedmiotów powstałych po wydobyciu bloku. Zaklinać można broń, elementy pancerza i niektóre narzędzia. + + Ustaw poziom trudności na „Spokojny”, by twoje zdrowie regenerowało się automatycznie, a w nocy nie atakowały cię żadne potwory! - - - Umieszczenie biblioteczek wokół magicznego stołu zwiększa jego siłę i daje dostęp do potężniejszych zaklęć. + + Nakarm wilka kością, aby go oswoić. Wtedy może za tobą podążać lub warować w miejscu. - - - Zaklinanie przedmiotów kosztuje poziomy doświadczenia, które zwiększa się dzięki kulom doświadczenia. Zdobywa się je przez zabijanie potworów i zwierząt, wydobywanie rudy, rozmnażanie zwierząt, łowienie ryb i przetapianie/smażenie rzeczy w piecu. + + Aby wyrzucić przedmiot z ekranu ekwipunku, przesuń kursor poza krawędź menu i wciśnij{*CONTROLLER_VK_A*}. - - - Możesz także zwiększyć swój poziom doświadczenia dzięki zaklętej butelce, która po rzuceniu tworzy kule doświadczenia w miejscu, w którym wyląduje. Kule te można zebrać. + + Dostępna jest nowa zawartość do pobrania! Można ją znaleźć w sklepie Minecraft, w głównym menu. - - - W znajdujących się tu skrzyniach znajdziesz kilka zaklętych przedmiotów, zaklętych butelek oraz przedmiotów, które jeszcze nie zostały zaklęte, abyś mógł poeksperymentować z magicznym stołem. + + Możesz zmienić wygląd swojej postaci dzięki pakietowi skórek ze sklepu Minecraft. Wybierz „Sklep Minecraft” w głównym menu i zobacz, co jest dostępne. - - - Jedziesz wagonikiem. Aby z niego wysiąść, wyceluj w niego i wciśnij{*CONTROLLER_ACTION_USE*} . {*MinecartIcon*} + + Zmień ustawienia gammy, aby rozjaśnić lub przyciemnić obraz w grze. - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o wagonikach.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Zaśnięcie w łóżku w nocy przyspieszy nastanie świtu. W trybie wieloosobowym wszyscy gracze muszą położyć się jednocześnie. - - - Wagoniki jeżdżą po torach. Możesz także stworzyć napędzany wagonik, umieszczając w nim piec, oraz wagonik ze skrzynią. - {*RailIcon*} + + Użyj motyki, aby przygotować ziemię pod uprawę. - - - Można także stworzyć zasilane tory, które pobierają energię z pochodni z czerwonym pyłem, aby przyspieszyć wagonik. Można je podłączyć do przycisków, dźwigni i płyt naciskowych, aby tworzyć skomplikowane konstrukcje. - {*PoweredRailIcon*} + + Pająki nie zaatakują cię w dzień, chyba że ty zaatakujesz pierwszy. - - - Płyniesz łódką. Aby wysiąść z łódki, wyceluj w nią i wciśnij{*CONTROLLER_ACTION_USE*}. {*BoatIcon*} + + Kopanie ziemi lub piasku łopatą jest szybsze niż kopanie rękami! - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o łódkach.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Zabijaj świnie, aby zdobywać steki wieprzowe. Następnie smaż je i jedz, aby odzyskać zdrowie. - - - Łódki umożliwiają ci szybkie poruszanie się po wodzie. Możesz sterować za pomocą{*CONTROLLER_ACTION_MOVE*} oraz{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} + + Zbieraj skóry krów i wytwarzaj z nich elementy pancerza. - - - Korzystasz z wędki. Wciśnij{*CONTROLLER_ACTION_USE*}, aby jej użyć.{*FishingRodIcon*} + + Jeżeli masz puste wiadro, możesz napełnić je mlekiem krowy, wodą lub lawą! - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o łowieniu ryb.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Obsydian powstaje, gdy woda zetknie się ze źródłem lawy. - - - Wciśnij{*CONTROLLER_ACTION_USE*}, aby zacząć łowić. Wciśnij{*CONTROLLER_ACTION_USE*} ponownie, aby ściągnąć żyłkę. - {*FishingRodIcon*} + + W grze można teraz ustawiać jedne ogrodzenia na drugich! - - - Jeżeli zaczekasz, aż spławik zanurzy się pod powierzchnię wody zanim ściągniesz żyłkę, może udać ci się złapać rybę. Rybę można zjeść na surowo lub usmażyć w piecu. Odnawia ona zdrowie. - {*FishIcon*} + + Niektóre zwierzęta pójdą za tobą, jeżeli trzymasz pszenicę w ręku. - - - Podobnie jak inne narzędzia, wędka ma ograniczoną liczbę użyć. Użycia te nie są ograniczone do schwytania ryb. Poeksperymentuj z nią, aby zobaczyć, co uda ci się złowić lub aktywować... - {*FishingRodIcon*} + + Jeżeli zwierzę nie może przejść 20 bloków w dowolnym kierunku, nie zniknie ze świata gry. - - - To łóżko. Wciśnij{*CONTROLLER_ACTION_USE*}, celując w nie w nocy, aby się położyć i obudzić rano.{*ICON*}355{*/ICON*} + + Pozycja ogona wskazuje stan zdrowia oswojonych wilków. Karm je mięsem, aby je uzdrawiać. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o łóżkach.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Ugotuj kaktus w piecu, aby stworzyć zielony barwnik. - - - Łóżko powinno zostać umieszczone w bezpiecznym, dobrze oświetlonym miejscu, aby potwory nie obudziły cię w środku nocy. Jeżeli zginiesz po użyciu łóżka, odrodzisz się przy nim. - {*ICON*}355{*/ICON*} + + Zajrzyj do sekcji „Co nowego” w menu „Instrukcja”, aby zapoznać się z najnowszymi zmianami w grze. - - - Jeżeli w twojej grze znajdują się inni gracze, wszyscy muszą się położyć w tym samym czasie, aby zapaść w sen. - {*ICON*}355{*/ICON*} + + Muzyka autorstwa C418! - - - Na tym obszarze znajdziesz kilka prostych obwodów z czerwonego kamienia i tłoków, a także skrzynie z przedmiotami, które pomogą ci je przedłużyć. + + Kim jest Notch? - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat obwodów z czerwonego kamienia i tłoków.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Mojang zebrało więcej nagród niż ma pracowników! - - - Dźwignie, przyciski, płyty naciskowe i pochodnie z czerwonym pyłem dostarczają zasilanie do obwodów, albo poprzez bezpośrednie podłączenie ich do obiektu, który chcesz aktywować, lub przez połączenie ich za pomocą czerwonego pyłu. + + Sławni ludzie grają w Minecrafta! - - - Położenie i kierunek umieszczenia źródła zasilania może zmienić jego oddziaływanie na inne bloki. Przykładowo, pochodnia z czerwonego pyłu znajdująca się z boku danego bloku może zostać wyłączona, jeżeli blok zostanie zasilony z innego źródła. + + Notcha obserwuje ponad milion osób na twitterze! - - - Czerwony pył zdobywa się przez wydobywanie rudy czerwonego kamienia żelaznym, złotym lub diamentowym kilofem. Przenosi zasilanie na odległość 15 bloków. Może przenieść ładunek jeden blok w górę lub w dół. - {*ICON*}331{*/ICON*} + + Nie wszyscy mieszkańcy Szwecji są blondynami. Niektórzy, jak Jens z Mojang, są nawet rudzi! - - - Powtarzacze z czerwonego kamienia mogą wydłużyć dystans, na jaki przeniesione jest zasilanie, lub opóźnić obwód. - {*ICON*}356{*/ICON*} + + Kiedyś w końcu pojawi się aktualizacja do tej gry! - - - Po zasileniu tłok się wysunie, przepychając do 12 bloków. Cofające się lepkie tłoki mogą przeciągnąć ze sobą jeden blok. - {*ICON*}33{*/ICON*} + + Umieść dwie skrzynie obok siebie, aby stworzyć wielką skrzynię. - - - W skrzyniach na tym obszarze znajdują się składniki do tworzenia obwodów z tłokami. Użyj ich, aby dokończyć obwody, lub stwórz własny. Poza obszarem samouczka znajdziesz inne przykłady. + + Uważaj podczas wznoszenia konstrukcji z wełny na wolnym powietrzu - błyskawice mogą ją podpalić. - - - Na tym terenie znajduje się portal do Otchłani! + + Jedno wiadro lawy może być wykorzystane w piecu do przetopienia 100 bloków. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat portalów i Otchłani.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Dźwięk wydany przez blok muzyczny zależy od tego, jaki materiał znajduje się pod spodem. - - - Portale buduje się, tworząc szeroki na 4 bloki i wysoki na 5 bloków szkielet z obsydianu. Narożne bloki nie są wymagane. + + Może upłynąć kilka minut, zanim lawa CAŁKOWICIE zniknie po usunięciu jej źródła. - - - Aby aktywować portal do Otchłani, musisz podpalić bloki obsydianu za pomocą krzesiwa. Portale wyłączają się gdy ich szkielet zostanie zniszczony, w pobliżu nastąpi wybuch lub przepłynie przez nie ciecz. - + + Kamień brukowy jest odporny na kule ognia duchów, przez co nadaje się do zabezpieczenia portali. - - - Aby użyć portalu do Otchłani, wejdź do niego. Ekran zrobi się fioletowy i rozlegnie się dźwięk. Po kilku sekundach znajdziesz się w innym wymiarze. + + Bloki, które mogą być używane jako źródło światła, będą roztapiać śnieg i lód. Zaliczają się do nich pochodnie, jasnogłazy i dyniowe lampiony. - - - Otchłań to niebezpieczne, wypełnione lawą miejsce. Można tam znaleźć skałę Otchłani, która płonie wiecznie, gdy się ją podpali, oraz jasnogłaz, który daje światło. + + Zombie i kościotrupy nie otrzymują obrażeń od światła słonecznego, jeżeli znajdują się w wodzie. - - - Otchłań może być użyta do szybkiej podróży przez świat wewnętrzny – jeden przebyty blok w Otchłani, to trzy bloki w świecie zewnętrznym. + + Kury składają jaja co 5–10 minut. - - - Jesteś teraz w trybie tworzenia. + + Obsydian można wydobywać tylko diamentowym kilofem. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o trybie tworzenia.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Czychacze są najlepszym źródłem prochu strzelniczego. - - W trybie tworzenia masz dostęp do nieskończonej liczby wszystkich przedmiotów i bloków w grze. Dodatkowo możesz niszczyć wszystkie bloki jednym uderzeniem bez narzędzia, nic nie może ci zrobić krzywdy i możesz latać. + + Zaatakowanie wilka sprawi, że wszystkie pobliskie wilki rzucą się na ciebie. Tę cechę mają także zombie świnioludy. - - Wciśnij{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs trybu tworzenia. + + Wilki nie mogą wejść do Otchłani. - - Dostań się na drugą stronę dziury, aby kontynuować. + + Wilki nie atakują czyhaczy. - - Udało ci się ukończyć samouczek trybu tworzenia. + + Wymagany do wydobycia wszelkiego rodzaju kamiennych bloków i rud. - - - Na tym terenie znajduje się farma. Rolnictwo umożliwia ci wytwarzanie żywności oraz innych przedmiotów. + + Używany do pieczenia ciasta oraz jako składnik mikstur. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o rolnictwie.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Wysyła ładunek elektryczny, gdy zostanie przełączona. Pozostaje przełączona do momentu ponownego użycia. - - Pszenica, dynie i arbuzy wyrastają z ziaren i nasion. Ziarna pszenicy można zdobyć poprzez niszczenie wysokiej trawy lub zbieranie pszenicy, a nasiona dyni i arbuza robi się z dyń i arbuzów. + + Stale wysyła ładunek elektryczny lub może być użyta jako odbiornik/przekaźnik, gdy zostanie umieszczona obok bloku. +Daje też wątłe światło. - - Przed zasadzeniem ich w ziemi należy zamienić bloki ziemi na pole uprawne, używając motyki. Pobliskie źródło wody będzie nawadniać pola uprawne i sprawi, że zbiory będą rosły szybciej. Podobny efekt da oświetlenie terenu. + + Odnawia 2{*ICON_SHANK_01*}. Może być wykorzystane do wytworzenia złotego jabłka. - - Pszenica przechodzi przez kilka faz wzrostu i można ją zebrać, gdy będzie miała ciemniejszy kolor.{*ICON*}59:7{*/ICON*} + + Odnawia 2{*ICON_SHANK_01*} i regeneruje zdrowie przez 4 sekundy. Powstaje z połączenia jabłka i samorodków złota. - - Dynie i arbuzy potrzebują wolnego bloku obok miejsca do zasadzenia nasion, aby owoc mógł urosnąć, gdy łodyga w pełni się rozwinie. + + Odnawia 2{*ICON_SHANK_01*}. Może ci zaszkodzić. - - Trzcina cukrowa może być zasadzona na bloku trawy, ziemi lub piasku, który znajduje się tuż obok bloku wody. Ścięcie bloku trzciny cukrowej sprawi, że spadną wszystkie bloki, które znajdowały się nad nim.{*ICON*}83{*/ICON*} + + Używany w obwodach z czerwonego kamienia jako powtarzacz, opóźniacz i/lub dioda. - - Kaktus musi być zasadzony na piasku i wyrośnie na wysokość trzech bloków. Tak jak w przypadku trzciny cukrowej, ścięcie najniższego bloku sprawi, że spadną wszystkie bloki, które znajdowały się nad nim.{*ICON*}81{*/ICON*} + + Służy jako droga dla wagoników. - - Grzyby powinny być sadzone w słabo oświetlonych miejscach i będą się rozprzestrzeniać na pobliskie słabo oświetlone bloki.{*ICON*}39{*/ICON*} + + Po zasileniu przyspiesza wagonik, który po nim przejedzie. Gdy nie jest zasilany, wagoniki się zatrzymują. - - Mączka kostna sprawia, że zbiory wyrastają natychmiast, a grzyby zamieniają się w duże grzyby.{*ICON*}351:15{*/ICON*} + + Działa jak płyta naciskowa (przesyła sygnał z czerwonego kamienia po zasileniu), ale może być aktywowany tylko przez wagonik. - - Udało ci się ukończyć samouczek rolnictwa. + + Wysyła ładunek elektryczny, gdy zostanie wciśnięty. Pozostaje wciśnięty przez około sekundę, potem wyłącza się. - - - Na tym obszarze zwierzęta zostały zamknięte. Możesz je rozmnażać, aby mieć małe zwierzątka. + + Przechowuje i wystrzeliwuje przedmioty w losowej kolejności, gdy otrzyma zasilanie z czerwonego kamienia. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o zwierzętach i rozmnażaniu.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Odgrywa nutę, gdy zostanie aktywowany. Uderz go, aby zmienić wysokość dźwięku. Umieszczenie na innym bloku zmieni instrument. - - Aby zwierzęta się rozmnażały, musisz nakarmić je odpowiednim jedzeniem, co wprowadzi je w miłosny nastrój. + + Odnawia 2,5{*ICON_SHANK_01*}. Powstaje po usmażeniu ryby w piecu. - - Nakarm krowę, grzybową krowę lub owcę pszenicą, świnię marchewką, kurę ziarnami pszenicy lub naroślą z Otchłani, a wilka dowolnym mięsem, a rozpoczną one poszukiwania innego zwierzęcia ze swojego gatunku, które także jest w miłosnym nastroju. + + Odnawia 1{*ICON_SHANK_01*}. - - Gdy zwierzęta tego samego gatunku się spotkają i oba są w miłosnym nastroju, pocałują się i po chwili pojawi się małe zwierzę. Małe zwierzę będzie podążało za rodzicami, dopóki nie dorośnie. + + Odnawia 1{*ICON_SHANK_01*}. - - Po przeminięciu miłosnego nastroju zwierzę nie będzie mogło osiągnąć go ponownie przez około 5 minut. + + Odnawia 3{*ICON_SHANK_01*}. - - Niektóre zwierzęta pójdą za tobą, jeżeli trzymasz ich pożywienie w ręku. Dzięki temu łatwiej grupować zwierzęta, gdy chcesz je rozmnażać.{*ICON*}296{*/ICON*} + + Pocisk do łuku. - - - Dzikie wilki można oswoić za pomocą kości. Po oswojeniu pojawią się przy nich serduszka. Oswojone wilki będą podążać za graczem i ochraniać go, jeżeli nie otrzymały polecenia pozostania. + + Odnawia 2,5{*ICON_SHANK_01*}. - - Udało ci się ukończyć samouczek zwierząt i rozmnażania. + + Odnawia 1{*ICON_SHANK_01*}. Można zjeść 6 razy. - - - Na tym terenie znajdziesz dynie oraz bloki, z których można zbudować śnieżnego i żelaznego golema. + + Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Może ci zaszkodzić. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o golemach.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Odnawia 1,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. - - Golemy powstają po umieszczeniu dyni na szczycie stosu bloków. + + Odnawia 4{*ICON_SHANK_01*}. Powstaje po usmażeniu steku wieprzowego w piecu. - - Śnieżny golem powstaje po ustawieniu na sobie dwóch bloków śniegu i umieszczeniu na nich dyni. Będzie rzucać śnieżkami w twoich przeciwników. + + Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Można nakarmić nią ocelota, aby go oswoić. - - Żelazne golemy powstają po ułożeniu czterech bloków żelaza we wskazanym kształcie i umieszczeniu dyni na szczycie środkowego bloku. Atakują one twoich wrogów. + + Odnawia 3{*ICON_SHANK_01*}. Powstaje po usmażeniu kurczaka w piecu. + + + Odnawia 1,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. - - Żelazne golemy można także znaleźć w wioskach, które ochraniają. Zaatakują cię, jeżeli ty zaatakujesz osadników. + + Odnawia 4{*ICON_SHANK_01*}. Powstaje po usmażeniu wieprzowiny w piecu. - - Nie możesz opuścić tego obszaru, dopóki nie ukończysz samouczka. + + Służy do przewożenia ciebie, zwierząt lub potworów po torach. - - Różne narzędzia nadają się do wydobywania różnych materiałów. Używaj łopaty, aby wydobywać miękkie materiały, jak ziemia lub piasek. + + Służy do zabarwienia wełny na jasnoniebiesko. - - Różne narzędzia nadają się do wydobywania różnych materiałów. Używaj siekiery, aby ścinać drzewa. + + Służy do zabarwienia wełny na błękitno. - - Różne narzędzia nadają się do wydobywania różnych materiałów. Używaj kilofa, aby wydobywać kamień i rudy. Aby zdobywać surowce z niektórych bloków, potrzebny jest kilof z lepszych materiałów. + + Służy do zabarwienia wełny na fioletowo. - - Niektóre narzędzia są lepsze podczas atakowania przeciwników. Użyj miecza, aby atakować. + + Służy do zabarwienia wełny na limonkowo. - - Podpowiedź: Przytrzymaj{*CONTROLLER_ACTION_ACTION*}, aby wydobywać albo ścinać ręką lub przedmiotem trzymanym w ręku. Do wydobycia niektórych bloków konieczne może być wytworzenie narzędzia... + + Służy do zabarwienia wełny na szaro. - - Narzędzie, którego używasz, zostało uszkodzone. Za każdym razem, gdy używasz narzędzia, uszkadza się ono coraz bardziej, a po pewnym czasie się psuje. Kolorowy pasek poniżej przedmiotu w twoim ekwipunku pokazuje jego aktualną wytrzymałość. + + Służy do zabarwienia wełny na jasnoszaro. +(Uwaga: jasnoszary barwnik może być stworzony poprzez połączenie szarego barwnika z mączką kostną, dzięki czemu możesz stworzyć cztery jasnoszare barwniki z każdego gruczołu atramentowego, zamiast trzech). - - Przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby płynąć do góry. + + Służy do zabarwienia wełny na wrzosowo. - - Na tym obszarze znajdziesz wagonik na torze. Aby wsiąść do wagonika, wyceluj w niego i wciśnij{*CONTROLLER_ACTION_USE*}. Użyj{*CONTROLLER_ACTION_USE*} na przycisku, aby poruszyć wagonik. + + Wytwarza więcej światła niż pochodnie. Roztapia śnieg/lód i może być używany pod wodą. - - W skrzyni w pobliżu rzeki znajdziesz łódkę. Aby skorzystać z łódki, wyceluj w wodę i wciśnij{*CONTROLLER_ACTION_USE*}. Użyj{*CONTROLLER_ACTION_USE*}, celując w łódkę, aby do niej wsiąść. + + Służy do wytwarzania książek i map. - - W skrzyni w pobliżu stawu znajdziesz wędkę. Wyjmij ją ze skrzyni i wybierz jako aktualnie używany przedmiot, aby z niej skorzystać. + + Służy do tworzenia biblioteczek. Może być zaklęta, aby zmienić się w zaklętą księgę. - - Ten bardziej zaawansowany mechanizm tłokowy tworzy automatyczny most! Wciśnij przycisk, aby go aktywować, a następnie zobacz, jak działają wszystkie elementy, aby dowiedzieć się więcej. + + Służy do zabarwienia wełny na niebiesko. - - Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, możesz wyrzucić ten przedmiot. + + Odtwarza płyty muzyczne. - - Nie posiadasz wszystkich składników niezbędnych do stworzenia tego przedmiotu. Okno w lewym dolnym rogu pokazuje składniki niezbędne do jego wytworzenia. + + Służy do wytwarzania potężnych narzędzi, broni i elementów pancerza. - - - Gratulacje, udało ci się ukończyć samouczek. Czas w grze upływa teraz normalnie, ale nie zostało ci dużo czasu do zapadnięcia nocy – wtedy pojawiają się potwory! Wykończ swoje schronienie! + + Służy do zabarwienia wełny na pomarańczowo. - - {*EXIT_PICTURE*} Gdy będziesz gotów powędrować dalej, w pobliżu schronienia górnika znajdziesz schody, które zaprowadzą cię do niewielkiego zamku. + + Zdobywana z owiec, może być barwiona na różne kolory. - - Przypomnienie: + + Używana jako materiał budowniczy. Może być barwiona na różne kolory. Ten przepis nie jest polecany, ponieważ wełnę można łatwo zdobyć z owiec. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Służy do zabarwienia wełny na czarno. - - W najnowszej wersji dodano nowe elementy do gry, wliczając w to nowe obszary w świecie samouczka. + + Służy do transportowania materiałów po torach. - - {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby rozegrać samouczek normalnie.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, aby pominąć samouczek. + + Będzie poruszać się po torach i przepychać inne wagoniki, gdy będzie w nim węgiel. - - W tej okolicy znajdują się obszary przygotowane do tego, aby pomóc ci dowiedzieć się więcej na temat łowienia, łódek, tłoków i czerwonego kamienia. + + Służy do poruszania się po wodzie. Szybsza niż pływanie. - - Dalej znajdują się przykłady dotyczące budowy, rolnictwa, wagoników i torów, zaklinania, warzenia, handlu, kowalstwa i innych rzeczy! + + Służy do zabarwienia wełny na zielono. - - - Twój wskaźnik najedzenia spadł do tak niskiego poziomu, że automatyczne leczenie przestało działać. + + Służy do zabarwienia wełny na czerwono. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat wskaźnika najedzenia i żywności.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Sprawia, że zboża, drzewa, wysoka trawa, duże grzyby i kwiaty wyrastają natychmiast. Może być użyta do barwienia. - - Wyb. + + Służy do zabarwienia wełny na różowo. - - Użyj + + Służy do zabarwienia wełny na brązowo, używany jako składnik ciasteczek lub do uprawy kakao. - - Cofn. + + Służy do zabarwienia wełny na srebrno. - - Wyjdź + + Służy do zabarwienia wełny na żółto. - - Anuluj + + Umożliwia atakowanie strzałami z dystansu. - - Anuluj dołączanie + + Daje użytkownikowi 5 jednostek pancerza po założeniu. - - Odśwież listę gier sieciowych + + Daje użytkownikowi 3 jednostki pancerza po założeniu. - - Gry drużynowe + + Daje użytkownikowi 1 jednostkę pancerza po założeniu. - - Wszystkie gry + + Daje użytkownikowi 5 jednostek pancerza po założeniu. - - Zmień grupę + + Daje użytkownikowi 2 jednostki pancerza po założeniu. - - Pokaż ekwipunek + + Daje użytkownikowi 2 jednostki pancerza po założeniu. - - Pokaż opis + + Daje użytkownikowi 3 jednostki pancerza po założeniu. - - Pokaż składniki + + Sztabka, która może być użyta do wytwarzania narzędzi z danego materiału. Powstaje po przetopieniu rudy w piecu. - - Wytwarzanie + + Umożliwia przerobienie sztabek, klejnotów lub barwników na gotowe do rozmieszczenia bloki. Można ich używać jako kosztownych bloków do budowania lub przechowywania rudy. - - Stwórz + + Wysyła ładunek elektryczny, gdy stanie na niej gracz, zwierzę lub potwór. Drewniane płyty naciskowe mogą być dodatkowo aktywowane, gdy coś zostanie na nich umieszczone. - - Podnieś/odłóż + + Daje użytkownikowi 8 jednostek pancerza po założeniu. - - Weź + + Daje użytkownikowi 6 jednostek pancerza po założeniu. - - Weź wszystko + + Daje użytkownikowi 3 jednostki pancerza po założeniu. - - Weź połowę + + Daje użytkownikowi 6 jednostek pancerza po założeniu. - - Odłóż + + Żelazne drzwi można otworzyć tylko czerwonym kamieniem, przyciskami lub przełącznikami. - - Odłóż wszystko + + Daje użytkownikowi 1 jednostkę pancerza po założeniu. - - Odłóż jedno + + Daje użytkownikowi 3 jednostki pancerza po założeniu. - - Upuść + + Używana do ścinania drewna szybciej niż przy użyciu ręki. - - Upuść wszystko + + Używana do uprawiania bloków ziemi oraz trawy i przygotowania ich pod plony. - - Upuść jedno + + Drewniane drzwi można otworzyć używając ich, uderzając w nie lub za pomocą czerwonego kamienia. - - Zamień + + Daje użytkownikowi 2 jednostki pancerza po założeniu. - - Szybkie przeniesienie + + Daje użytkownikowi 4 jednostki pancerza po założeniu. - - Wyczyść szybki wybór + + Daje użytkownikowi 1 jednostkę pancerza po założeniu. - - Co to jest? + + Daje użytkownikowi 2 jednostki pancerza po założeniu. - - Udostępnij na Facebooku + + Daje użytkownikowi 1 jednostkę pancerza po założeniu. - - Zmień filtr + + Daje użytkownikowi 2 jednostki pancerza po założeniu. - - Wyślij zaproszenie do znajomych + + Daje użytkownikowi 5 jednostek pancerza po założeniu. - - Strona w dół + + Używane do tworzenia zajmujących mało miejsca schodów. - - Strona w górę + + Nalewa się do niej zupę grzybową. Zatrzymujesz miskę, gdy zupa zostanie zjedzona. - - Dalej + + Służy do przenoszenia wody, lawy i mleka. - - Wstecz + + Służy do przenoszenia wody. - - Wyrzuć gracza + + Wyświetla wpisany przez ciebie lub innych graczy tekst. - - Farbuj + + Wytwarza więcej światła niż pochodnie. Roztapia śnieg/lód i może być używany pod wodą. - - Wydobywaj + + Materiał wybuchowy. Aktywowany przez podpalenie go krzesiwem lub ładunkiem elektrycznym. - - Nakarm + + Służy do przenoszenia lawy. - - Oswój + + Pokazuje położenie Słońca i Księżyca. - - Ulecz + + Wskazuje twoje miejsce startu. - - Usiądź + + Tworzy obraz odkrywanego obszaru, gdy trzyma się ją w ręku. Służy do odnajdywania drogi. - - Chodź za mną + + Służy do przenoszenia mleka. - - Wyrzuć + + Służy do rozpalania ognia, podpalania trotylu i otwarcia portalu, gdy zostanie zbudowany. - - Opróżnij + + Służy do łowienia ryb. - - Osiodłaj + + Można go otworzyć używając go, uderzając w niego lub za pomocą czerwonego kamienia. Działa jak normalne drzwi, ale ma wymiar jeden na jeden i leży na ziemi. - - Odłóż + + Używane jako materiał budowlany. Można z nich wytworzyć wiele różnych rzeczy. Powstają z dowolnego rodzaju drewna. - - Uderz + + Używany jako materiał budowlany. Nie działa na niego grawitacja, jak na zwykły piasek. - - Wydój + + Używany jako materiał budowlany. - - Zbierz + + Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. - - Zjedz + + Używana do tworzenia zajmujących dużo miejsca schodów. Dwie płyty umieszczone jedna na drugiej tworzą normalny blok. - - Śpij + + Używana do oświetlania terenu. Pochodnie roztapiają śnieg i lód. - - Obudź się + + Używany do wytwarzania pochodni, strzał, znaków, drabin, ogrodzeń oraz rączek narzędzi i broni. - - Graj + + Przechowuje bloki i przedmioty. Umieść dwie skrzynie obok siebie, aby utworzyć wielką skrzynię o podwójnej pojemności. - - Jedź + + Używane do tworzenia barier, przez które nie można przeskoczyć. Ma 1,5 bloku wysokości dla graczy, zwierząt i potworów, ale 1 blok wysokości dla innych bloków. - - Płyń + + Służy do poruszania się w pionie. - - Przyspiesz wzrost + + Przyspiesza czas od dowolnego momentu nocy do dnia, jeżeli wszyscy gracze z danego świata położą się w łóżkach. Dodatkowo zmienia punkt odrodzenia gracza. +Kolor łóżka jest zawsze taki sam, bez względu na kolor użytej wełny. - - Płyń w górę + + Umożliwia wytwarzanie bardziej rozmaitych przedmiotów. - - Otwórz + + Umożliwia przetapianie rudy, wytwarzanie węgla drzewnego i szkła oraz smażenie ryb i steków wieprzowych. - - Zmień wysokość + + Żelazna siekiera - - Wysadź + + Lampa z czerwonym pyłem - - Przeczytaj + + Schody z drewna z dżungli - - Powieś + + Schody brzozowe - - Rzuć + + Sterowanie - - Zasadź + + Czaszka - - Uprawiaj ziemię + + Kakao - - Zbieraj + + Schody świerkowe - - Kontynuuj + + Smocze jajo - - Odblokuj pełną wersję gry + + Kamień Kresu - - Usuń zapis gry + + Szkielet portalu Kresu - - Usuń + + Schody z piaskowca - - Opcje + + Paproć - - Zaproś znajomych + + Krzak - - Akceptuj + + Układ - - Ostrzyż + + Wytwarzanie - - Zablokuj poziom + + Użyj - - Wybierz skórkę + + Akcja - - Podpal + + Skradanie/lot w dół - - Nawiguj + + Skradanie - - Zainstaluj pełną wersję + + Upuść - - Zainstaluj próbną wersję + + Zmień trzymany przedmiot - - Instaluj + + Pauza - - Zainstaluj ponownie + + Rozglądanie się - - Zap. opcje + + Chodzenie/bieganie - - Wykonaj polecenie + + Ekwipunek - - Tworzenie + + Skok/lot do góry - - Przenieś składnik + + Skok - - Przenieś opał + + Portal Kresu - - Przenieś narzędzie + + Łodyga dyni - - Przenieś pancerz + + Arbuz - - Przenieś broń + + Szyba - - Wyposaż + + Furtka - - Naciągnij + + Pnącza - - Zwolnij + + Łodyga arbuza - - Przywileje + + Żelazne kraty - - Blok + + Popękane kamienne cegły - - Strona w górę + + Kamienne cegły z mchem - - Strona w dół + + Kamienne cegły - - Miłosny nastrój + + Grzyb - - Wypij + + Grzyb - - Obróć + + Rzeźbione kamienne cegły - - Ukryj + + Ceglane schody - - Wyczyść wszystkie miejsca + + Narośl z Otchłani - - OK + + Schody z cegły z Otchłani - - Anuluj + + Płot z cegły z Otchłani - - Sklep Minecraft + + Kociołek - - Czy na pewno chcesz opuścić tę grę i dołączyć do innej? Niezapisany postęp zostanie utracony. + + Stacja alchemiczna - - Wyjdź z gry + + Magiczny stół - - Zapisz grę + + Cegła z Otchłani - - Wyjdź bez zapisywania + + Kamień brukowy rybika - - Czy na pewno chcesz nadpisać poprzedni zapis tego świata jego obecną wersją? + + Kamień rybika - - Czy na pewno chcesz wyjść bez zapisywania? Utracisz cały postęp w tym świecie! + + Schody z kamiennych cegieł - - Rozpocznij grę + + Lilia - - Uszkodzony zapis gry + + Grzybnia - - Ten zapis gry jest uszkodzony. Czy chcesz go usunąć? + + Kamienna cegła rybika - - Czy na pewno chcesz wyjść do głównego menu i rozłączyć wszystkich pozostałych graczy? Niezapisany postęp zostanie utracony. + + Zmiana trybu kamery - - Wyjdź i zapisz + + Jeżeli stracisz trochę zdrowia, ale twój wskaźnik najedzenia ma wypełnione 9 lub więcej{*ICON_SHANK_01*}, twoje zdrowie zacznie się regenerować automatycznie. Jedzenie uzupełni wskaźnik. - - Wyjdź bez zapisywania + + Poruszanie się, wydobywanie i atakowanie będzie obniżać twój wskaźnik najedzenia{*ICON_SHANK_01*}. Bieg i skoki podczas biegu obniżają wskaźnik najedzenia szybciej niż normalny ruch i skoki. - - Czy na pewno chcesz wyjść do głównego menu? Niezapisany postęp zostanie utracony. + + Zbierając i wytwarzając przedmioty, zapełniasz swój ekwipunek.{*B*} + Wciśnij{*CONTROLLER_ACTION_INVENTORY*}, aby otworzyć ekran ekwipunku. - - Czy na pewno chcesz wyjść do głównego menu? Twój postęp zostanie utracony! + + Zebrane drewno może być przerobione na deski. Otwórz interfejs wytwarzania i zrób deski.{*PlanksIcon*} - - Stwórz nowy świat + + Twój wskaźnik najedzenia jest prawie pusty i straciłeś trochę zdrowia. Zjedz stek z ekwipunku, aby napełnić wskaźnik najedzenia i zacząć odzyskiwać zdrowie.{*ICON*}364{*/ICON*} - - Rozegraj samouczek + + Trzymając jedzenie w ręku, przytrzymaj{*CONTROLLER_ACTION_USE*}, aby je zjeść i napełnić wskaźnik. Nie możesz nic zjeść, jeżeli wskaźnik najedzenia jest pełny. - - Samouczek + + Wciśnij{*CONTROLLER_ACTION_CRAFTING*}, aby otworzyć interfejs wytwarzania. - - Nazwij swój świat + + Aby pobiec, wychyl{*CONTROLLER_ACTION_MOVE*} szybko dwukrotnie do przodu. Trzymaj {*CONTROLLER_ACTION_MOVE*} do przodu, a twoja postać będzie biegła, dopóki się nie zmęczy lub nie zrobi się głodna. - - Podaj nazwę swojego świata + + Użyj{*CONTROLLER_ACTION_MOVE*}, aby się poruszać. - - Podaj numer ziarna do generowania świata + + Użyj{*CONTROLLER_ACTION_LOOK*}, aby patrzeć w górę, w dół i rozglądać się dookoła. - - Wczytaj zapisany świat + + Przytrzymaj{*CONTROLLER_ACTION_ACTION*}, aby ściąć 4 bloki drewna (z pnia drzewa).{*B*}Gdy blok się rozpadnie, możesz go podnieść, podchodząc do unoszącego się w powietrzu przedmiotu. Pojawi się on w twoim ekwipunku. - - Wciśnij START, aby grać + + Przytrzymaj{*CONTROLLER_ACTION_ACTION*}, aby wydobywać albo ścinać ręką lub przedmiotem trzymanym w ręku. Do wydobycia niektórych bloków konieczne może być wytworzenie narzędzia... - - Opuszczanie gry + + Wciśnij{*CONTROLLER_ACTION_JUMP*}, aby podskoczyć. - - Wystąpił błąd. Powrót do głównego menu. + + Niektóre z przepisów wymagają wielu kroków. Teraz, gdy masz już deski, możesz wytworzyć więcej przedmiotów. Stwórz warsztat.{*CraftingTableIcon*} - - Połączenie nieudane + + + Noc nadchodzi szybko, a przebywanie na zewnątrz bywa niebezpieczne. Możesz stworzyć pancerz i broń, ale najlepsze jest bezpieczne schronienie. - - Utracono połączenie + + Otwórz pojemnik - - Utracono połączenie z serwerem. Powrót do głównego menu. + + Kilof pomaga szybciej wykopywać twarde bloki, jak kamień czy rudy. Gdy zbierzesz więcej materiałów, możliwe będzie wytworzenie narzędzi, które będą działać szybciej, wytrzymają dłużej i pomogą wydobywać twardsze materiały. Stwórz drewniany kilof.{*WoodenPickaxeIcon*} - - Utracono połączenie z serwerem + + Użyj kilofa, aby wydobyć trochę kamiennych bloków. Kamienne bloki po wydobyciu dadzą ci kamień brukowy. Zbierz 8 bloków kamienia brukowego, a będzie można zbudować piec. Aby dostać się do kamienia, konieczne może być przekopanie się przez ziemię. W tym celu użyj łopaty.{*StoneIcon*} - - Wyrzucono cię z gry + + + Musisz zebrać surowce, aby wykończyć schronienie. Ściany i dach mogą być zrobione z dowolnego materiału, ale potrzebne są jeszcze drzwi, okna oraz oświetlenie. - - Wyrzucono cię z gry za latanie + + + W pobliżu znajduje się opuszczone schronienie górnika, które możesz wykończyć. - - Próba połączenia trwała zbyt długo + + Siekiera pomaga w szybszym ścinaniu drzew i drewnianych bloków. Gdy zbierzesz więcej materiałów, możliwe będzie wytworzenie narzędzi, które będą działać szybciej i wytrzymają dłużej. Stwórz drewnianą siekierę.{*WoodenHatchetIcon*} - - Serwer jest pełny + + Użyj{*CONTROLLER_ACTION_USE*}, aby używać przedmiotów, korzystać z obiektów i umieszczać przedmioty. Przedmioty, które zostały umieszczone, mogą być odzyskane za pomocą odpowiedniego narzędzia. - - Host wyszedł z gry + + Użyj{*CONTROLLER_ACTION_LEFT_SCROLL*} i{*CONTROLLER_ACTION_RIGHT_SCROLL*}, aby zmienić trzymany przedmiot. - - Nie możesz dołączyć do tej gry, ponieważ żaden z graczy nie znajduje się na twojej liście znajomych. + + Aby szybciej zbierać bloki, możesz wytworzyć narzędzia o konkretnym przeznaczeniu. Niektóre narzędzia mają rączki z kijków. Wytwórz kilka kijów.{*SticksIcon*} - - Nie możesz dołączyć do tej gry, ponieważ wcześniej host cię wyrzucił. + + Łopata pomaga szybciej wykopywać miękkie bloki, jak ziemię czy śnieg. Gdy zbierzesz więcej materiałów, możliwe będzie wytworzenie narzędzi, które będą działać szybciej i wytrzymają dłużej. Stwórz drewnianą łopatę.{*WoodenShovelIcon*} - - Nie możesz dołączyć do tej gry, ponieważ host używa starszej wersji gry. + + Umieść celownik na warsztacie i wciśnij{*CONTROLLER_ACTION_USE*}, aby z niego skorzystać. - - Nie możesz dołączyć do tej gry, ponieważ host używa nowszej wersji gry. + + Wybierz warsztat, a następnie umieść celownik w miejscu, w którym chcesz go ustawić, i wciśnij{*CONTROLLER_ACTION_USE*}, aby go umieścić. - - Nowy świat + + Minecraft jest grą o ustawianiu bloków i budowaniu z nich wszystkiego, co tylko sobie wyobrazisz. +W nocy pojawiają się potwory, więc wybuduj schronienie, zanim się pojawią. - - Odblokowano nagrodę! + + - - Hura – udało ci się odblokować obrazek Steve'a z Minecrafta! + + - - Hura – udało ci się odblokować obrazek czyhacza! + + - - Odblokuj pełną wersję gry + + - - Grasz teraz w wersję próbną. Do zapisu stanu gry potrzebna jest pełna wersja. -Czy chcesz odblokować pełną wersję gry? + + - - Czekaj + + - - Brak wyników + + - - Filtr: + + Układ 1 - - Znajomi + + Poruszanie (podczas lotu) - - Mój wynik + + Gracze/zaproszenia - - Ogólne + + - - Wpisy: + + Układ 3 - - Poz. + + Układ 2 - - Przygotowywanie do zapisania poziomu + + - - Przygotowywanie kawałków składowych... + + - - Finalizowanie... + + - - Budowanie terenu + + - - Symulacja świata + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby rozpocząć samouczek.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli uważasz, że możesz rozpocząć właściwą grę. - - Przygotowywanie serwera + + {*B*}Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować. - - Tworzenie obszaru odrodzenia + + - - Wczytywanie obszaru odrodzenia + + - - Wkraczasz do Otchłani + + - - Opuszczasz Otchłań + + - - Odradzanie + + - - Generowanie poziomu + + - - Wczytywanie poziomu + + - - Zapisywanie graczy + + - - Łączenie z hostem + + Blok rybika - - Pobieranie terenu + + Kamienna płyta - - Przełączanie do gry offline + + Sprawny sposób przechowywania żelaza. - - Czekaj, aż host zapisze grę + + Blok żelaza - - Wkraczasz do Kresu + + Płyta z drewna dębowego - - Opuszczasz Kres + + Płyta z piaskowca - - To łóżko jest zajęte + + Kamienna płyta - - Możesz spać tylko w nocy + + Sprawny sposób przechowywania złota. - - %s śpi w łóżku. Aby przyspieszyć nadejście poranka, wszyscy gracze muszą położyć się w łóżkach w tej samej chwili. + + Kwiat - - Twoje łóżko zniknęło lub było zablokowane + + Biała wełna - - Nie możesz teraz odpoczywać, w pobliżu są potwory + + Pomarańczowa wełna - - Śpisz w łóżku. Aby przyspieszyć nadejście poranka, wszyscy gracze muszą położyć się w łóżkach w tej samej chwili. + + Blok złota - - Narzędzia i broń + + Grzyb - - Broń + + Róża - - Jedzenie + + Płyta z kamienia brukowego - - Konstrukcje + + Biblioteczka - - Pancerz + + Trotyl - - Mechanizmy + + Cegły - - Transport + + Pochodnia - - Dekoracje + + Obsydian - - Bloki do budowy + + Kamień z mchem - - Czerwony kamień i transport + + Płyta z cegieł z Otchłani - - Inne + + Płyta z drewna dębowego - - Warzenie + + Płyta z kamiennych cegieł - - Narzędzia, broń i pancerz + + Płyta z cegieł - - Materiały + + Płyta z drewna z dżungli - - Wypisano się + + Płyta brzozowa - - Poziom trudności + + Płyta świerkowa - - Muzyka + + Wrzosowa wełna - - Dźwięk + + Liście brzozy - - Gamma + + Liście świerku - - Czułość gry + + Liście dębu - - Czułość interfejsu + + Szkło - - Spokojny + + Gąbka - - Niski + + Liście z dżungli - - Normalny + + Liście - - Wysoki + + Dąb - - W tym trybie gracz automatycznie regeneruje zdrowie i nie napotka żadnych przeciwników. + + Świerk - - W tym trybie pojawiają się przeciwnicy, ale zadają graczowi mniejsze obrażenia niż na normalnym poziomie trudności. + + Brzoza - - W tym trybie pojawiają się przeciwnicy i będą zadawać graczowi standardowe obrażenia. + + Drewno świerkowe - - W tym trybie pojawiają się przeciwnicy i będą zadawać graczowi zwiększone obrażenia. Uważaj na czyhacze, ponieważ i tak wybuchną, nawet kiedy się od nich odsuniesz! + + Drewno brzozowe - - Koniec wersji próbnej + + Drewno z dżungli - - Wybrana gra jest pełna + + Wełna - - Nie udało się dołączyć do gry, brak wolnych miejsc + + Różowa wełna - - Wpisz tekst na znaku + + Szara wełna - - Wpisz tekst na swoim znaku + + Jasnoszara wełna - - Wpisz nazwę + + Jasnoniebieska wełna - - Wpisz nazwę swojego postu + + Żółta wełna - - Wpisz nagłówek + + Limonkowa wełna - - Wpisz nagłówek swojego postu + + Błękitna wełna - - Wpisz opis + + Zielona wełna - - Wpisz opis swojego postu + + Czerwona wełna - - Ekwipunek + + Czarna wełna - - Składniki + + Fioletowa wełna - - Stacja alchemiczna + + Niebieska wełna - - Skrzynia + + Brązowa wełna - - Zaklinanie + + Pochodnia (węgiel) - - Piec + + Jasnogłaz - - Składnik + + Piasek dusz - - Opał + + Skała Otchłani - - Dozownik + + Blok lazurytu - - Aktualnie nie ma dostępnej zawartości do pobrania tego typu dla tej gry. + + Ruda lazurytu - - Gracz %s dołącza do gry. + + Portal - - Gracz %s opuszcza grę. + + Lampion z dyni - - Gracz %s zostaje wyrzucony z gry. + + Trzcina cukrowa - - Czy na pewno chcesz usunąć ten zapis gry? + + Glina - - Oczekiwanie na akceptację + + Kaktus - - Ocenzurowano + + Dynia - - Teraz gra: + + Ogrodzenie - - Resetuj ustawienia + + Szafa grająca - - Czy na pewno chcesz zresetować ustawienia do wartości standardowych? + + Sprawny sposób przechowywania lazurytu. - - Błąd wczytywania + + Właz - - Gra gracza %s + + Zamknięta skrzynia - - Gra nieznanego hosta + + Dioda - - Gość się wypisał + + Lepki tłok - - Jeden z gości się wypisał, co oznacza, że pozostali goście zostaną usunięci z gry. + + Tłok - - Wpisz się + + Wełna (dowolnego koloru) - - Nie jesteś wpisany. Aby zagrać, musisz się wpisać. Chcesz się wpisać teraz? + + Uschnięty krzak - - Tryb wieloosobowy niedostępny + + Ciasto - - Nie udało się stworzyć gry + + Blok muzyczny - - Automatyczny wybór + + Dozownik - - Brak pakietu: standard. skórki + + Wysoka trawa - - Ulubione skórki + + Pajęczyna - - Zablokowany poziom + + Łóżko - - Gra, do której próbujesz dołączyć, znajduje się na twojej liście zablokowanych poziomów. -Jeżeli postanowisz dołączyć do tej gry, zostanie ona usunięta z twojej listy zablokowanych poziomów. + + Lód - - Zablokować ten poziom? + + Warsztat - - Czy na pewno chcesz dodać ten poziom do listy zablokowanych poziomów? -Wybranie „OK” spowoduje wyjście z gry. + + Sprawny sposób przechowywania diamentów. - - Usuń z listy zablokowanych poziomów + + Blok diamentu - - Odstęp czasowy automatycznego zapisu + + Piec - - Odstęp czasowy automatycznego zapisu: WYŁ. + + Pole uprawne - - min + + Zboże - - Nie można tu umieścić! + + Ruda diamentu - - Nie można umieścić źródła lawy w pobliżu miejsca odrodzenia na poziomie, ze względu na możliwość natychmiastowej śmierci graczy. + + Przywoływacz potworów - - Przezroczystość interfejsu + + Ogień - - Przygotowywanie do automatycznego zapisania poziomu + + Pochodnia (węgiel drz.) - - Rozmiar interfejsu + + Czerwony pył - - Rozmiar interfejsu (podzielony ekran) + + Skrzynia - - Ziarno + + Schody z drewna dębowego - - Odblokuj pakiet skórek + + Znak - - Aby korzystać z wybranej skórki, musisz odblokować pakiet skórek. -Odblokować go teraz? + + Ruda czerwonego kamienia - - Odblokuj pakiet tekstur + + Żelazne drzwi - - Aby korzystać z wybranego pakietu tekstur, musisz go odblokować. -Odblokować go teraz? + + Płyta naciskowa - - Próbny pakiet tekstur + + Śnieg - - Korzystasz z próbnego pakietu tekstur. Nie będzie można zapisać tego świata, dopóki nie odblokujesz pełnej wersji. -Czy chcesz odblokować pełną wersję pakietu tekstur? + + Przycisk - - Brak pakietu tekstur + + Pochodnia (czer. pył) - - Odblokuj pełną wersję + + Dźwignia - - Pobierz próbną wersję + + Tor - - Pobierz pełną wersję + + Drabina - - Ten świat wykorzystuje pakiet łączony lub pakiet tekstur, którego nie posiadasz! -Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? + + Drewniane drzwi - - Pobierz próbną wersję + + Kamienne schody - - Pobierz pełną wersję + + Tor z czujnikiem - - Wyrzuć gracza + + Zasilany tor - - Czy na pewno chcesz wyrzucić tego gracza z gry? Nie będzie mógł ponownie dołączyć, dopóki nie zrestartujesz świata. + + Masz wystarczająco dużo kamienia brukowego, aby zbudować piec. Skorzystaj z warsztatu, aby go stworzyć. - - Pakiety obrazków + + Wędka - - Motywy + + Zegarek - - Pakiety skórek + + Jasnopył - - Znajomi znajomych mogą dołączać + + Wagonik z piecem - - Nie możesz dołączyć do tej gry, ponieważ została ona ograniczona tylko do znajomych hosta. + + Jajo - - Nie można dołączyć do gry + + Kompas - - Wybrano + + Surowa ryba - - Wybrana skórka: + + Czerwony barwnik - - Uszkodzona zawartość do pobrania + + Zielony barwnik + + + Kakao - - Ta zawartość do pobrania jest uszkodzona i nie można z niej korzystać. Musisz ją usunąć, a następnie zainstalować ponownie z menu sklepu Minecraft. + + Smażona ryba - - Część twojej zawartości do pobrania jest uszkodzona i nie można z niej korzystać. Musisz ją usunąć, a następnie zainstalować ponownie z menu sklepu Minecraft. + + Barwnik - - Tryb gry został zmieniony + + Gruczoł atramentowy - - Zmień nazwę świata + + Wagonik ze skrzynią - - Podaj nową nazwę swojego świata + + Śnieżka - - Tryb gry: Przetrwanie + + Łódka - - Tryb gry: Tworzenie + + Skóra - - Przetrwanie + + Wagonik - - Tworzenie + + Siodło - - Stworzone w trybie przetrwania + + Czerwony kamień - - Stworzone w trybie tworzenia + + Wiadro z mlekiem - - Renderuj chmury + + Papier - - Co chcesz zrobić z tym zapisem gry? + + Książka - - Zmień nazwę zapisu gry + + Kula szlamu - - Autozapis za %d... + + Cegła - - Wł. + + Glina - - Wył. + + Trzcina cukrowa - - Normalny + + Lazuryt - - Superpłaski + + Mapa - - Po włączeniu gra będzie grą sieciową. + + Płyta muzyczna – „13” - - Po włączeniu tylko zaproszeni gracze będą mogli dołączyć. + + Płyta muzyczna – „cat” - - Po włączeniu znajomi twoich znajomych będą mogli dołączać do gry. + + Łóżko - - Po włączeniu gracze będą mogli ranić innych graczy. Działa tylko w trybie przetrwania. + + Powtarzacz z czer. kamienia - - Po wyłączeniu gracze, którzy dołączą do gry, nie będą mogli budować lub wydobywać, dopóki nie dostaną pozwolenia. + + Ciasteczko - - Po włączeniu ogień będzie mógł się rozprzestrzeniać na pobliskie łatwopalne bloki. + + Płyta muzyczna – „blocks” - - Po włączeniu trotyl będzie wybuchać po aktywacji. + + Płyta muzyczna – „mellohi” - - Po włączeniu wygląd Otchłani zostanie wygenerowany ponownie. Jest to przydatne przy starszych zapisach gry, gdy fortece Otchłani nie były obecne. + + Płyta muzyczna – „stal” - - Po włączeniu miejsca takie jak wioski i twierdze będą pojawiać się w świecie. + + Płyta muzyczna – „strad” - - Po włączeniu zostanie wygenerowany całkowicie płaski świat zewnętrzny i Otchłań. + + Płyta muzyczna – „chirp” - - Po włączeniu, w pobliżu miejsca odrodzenia znajdzie się skrzynia z przydatnymi przedmiotami. + + Płyta muzyczna – „far” - - Pakiety skórek + + Płyta muzyczna – „mall” - - Motywy + + Ciasto - - Obrazki + + Szary barwnik - - Przedmioty dla awatara + + Różowy barwnik - - Pakiety tekstur + + Limonkowy barwnik - - Pakiety łączone + + Fioletowy barwnik - - Gracz {*PLAYER*} spłonął. + + Błękitny barwnik - - Gracz {*PLAYER*} zamienił się w popiół. + + Jasnoszary barwnik - - Gracz {*PLAYER*} próbował pływać w lawie. + + Żółty barwnik - - Gracz {*PLAYER*} udusił się w ścianie. + + Mączka kostna - - Gracz {*PLAYER*} utonął. + + Kość - - Gracz {*PLAYER*} zmarł z głodu. + + Cukier - - Gracz {*PLAYER*} został zakłuty na śmierć. + + Jasnoniebieski barwnik - - Gracz {*PLAYER*} za mocno uderzył w ziemię. + + Wrzosowy barwnik - - Gracz {*PLAYER*} wypadł poza świat. + + Pomarańczowy barwnik - - Gracz {*PLAYER*} zginął. + + Znak - - Gracz {*PLAYER*} wybuchł. + + Skórzana zbroja - - Gracz {*PLAYER*} został zabity przez magię. + + Żelazny napierśnik - - Gracz {*PLAYER*} został zabity oddechem Kresosmoka. + + Diamentowy napierś. - - Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. + + Żelazny hełm - - Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. + + Diamentowy hełm - - Gracz {*PLAYER*} został zastrzelony przez: {*SOURCE*}. + + Złoty hełm - - Gracz {*PLAYER*} oberwał kulą ognia od: {*SOURCE*}. + + Złoty napierśnik - - Gracz {*PLAYER*} został stłuczony przez: {*SOURCE*}. + + Złote nogawice - - Gracz {*PLAYER*} został zabity przez: {*SOURCE*}. + + Skórzane buty - - Mgła skały macierzystej + + Żelazne buty - - Wyświetl interfejs + + Skórzane nogawice - - Wyświetl rękę + + Żelazne nogawice - - Komunikaty o śmierci + + Diamentowe nogawice - - Animacja postaci + + Skórzany hełm - - Specjalna animacja skórek + + Kamienna motyka - - Nie możesz wydobywać i używać przedmiotów + + Żelazna motyka - - Możesz wydobywać i używać przedmiotów + + Diamentowa motyka - - Nie możesz umieszczać bloków + + Diamentowa siekiera - - Możesz umieszczać bloki + + Złota siekiera - - Możesz korzystać z drzwi i przełączników + + Drewniana motyka - - Nie możesz korzystać z drzwi i przełączników + + Złota motyka - - Możesz korzystać z pojemników (np. skrzyń) + + Kolczuga - - Nie możesz korzystać z pojemników (np. skrzyń) + + Kolcze nogawice - - Nie możesz atakować istot + + Kolcze buty - - Możesz atakować istoty + + Drewniane drzwi - - Nie możesz atakować graczy + + Żelazne drzwi - - Możesz atakować graczy + + Kolczy hełm - - Nie możesz atakować zwierząt + + Diamentowe buty - - Możesz atakować zwierzęta + + Pióro - - Jesteś teraz moderatorem + + Proch strzelniczy - - Nie jesteś już moderatorem + + Ziarna pszenicy - - Możesz latać + + Miska - - Nie możesz już latać + + Zupa grzybowa - - Nie będziesz się już męczyć + + Nić - - Będziesz się męczyć + + Pszenica - - Jesteś niewidzialny + + Smażony stek wieprzowy - - Nie jesteś już niewidzialny + + Obraz - - Jesteś nieśmiertelny + + Złote jabłko - - Nie jesteś już nieśmiertelny + + Chleb - - %d MSP + + Krzemień - - Kresosmok + + Surowy stek wieprzowy - - Gracz %s wkracza do Kresu + + Kij - - Gracz %s opuszcza Kres + + Wiadro - - -{*C3*}Widzę gracza, o którym mówisz.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Tak. Zachowaj ostrożność. Jest teraz czymś zupełnie innym. Może czytać w naszych myślach.{*EF*}{*B*}{*B*} -{*C2*}To nie ma znaczenia. Sądzi, że jesteśmy częścią gry.{*EF*}{*B*}{*B*} -{*C3*}Podoba mi się ten gracz. Dobrze mu szło. Nie poddał się.{*EF*}{*B*}{*B*} -{*C2*}Czyta w naszych myślach, jakby to były słowa na ekranie.{*EF*}{*B*}{*B*} -{*C3*}W taki sposób postanawia wyobrażać sobie wiele rzeczy, gdy zacznie śnić o grze.{*EF*}{*B*}{*B*} -{*C2*}Słowa to wspaniały sposób przekazu. Bardzo wygodny. I znacznie mniej przerażający niż rzeczywistość poza ekranem.{*EF*}{*B*}{*B*} -{*C3*}Kiedyś słyszeli głosy. Zanim gracze nauczyli się czytać. Było to w czasach, gdy ci, co nie grają, nazywali graczy wiedźmami i czarnoksiężnikami. A gracze śnili o lataniu w przestworzach na patykach napędzanych energią demonów.{*EF*}{*B*}{*B*} -{*C2*}O czym śnił ten gracz?{*EF*}{*B*}{*B*} -{*C3*}O blasku słońca i drzewach. O ogniu i wodzie. Śnił, że tworzył. I śnił, że niszczył. Śnił, że był myśliwym i zwierzyną. Śnił o schronieniu.{*EF*}{*B*}{*B*} -{*C2*}Ach, oryginalny interfejs. Ma miliony lat, a wciąż działa. Co udało się stworzyć temu graczowi w rzeczywistości poza ekranem?{*EF*}{*B*}{*B*} -{*C3*}Pracował z milionami innych, aby stworzyć prawdziwy świat na wzór {*EF*}{*NOISE*}{*C3*} i stworzył {*EF*}{*NOISE*}{*C3*} dla {*EF*}{*NOISE*}{*C3*} w {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} -{*C2*}Nie potrafi tego przeczytać.{*EF*}{*B*}{*B*} -{*C3*}Nie. Jeszcze nie jest dostatecznie rozwinięty. To osiągnie w tym długim śnie o życiu, a nie w krótkim o grze.{*EF*}{*B*}{*B*} -{*C2*}Czy wie, że go kochamy? Że wszechświat jest dobry?{*EF*}{*B*}{*B*} -{*C3*}Czasami, gdy przebije się przez hałas własnych myśli, słyszy, co wszechświat ma do powiedzenia.{*EF*}{*B*}{*B*} -{*C2*}Jednak są takie chwile, gdy ogarnia go smutek w tym długim śnie. Tworzy światy, w których nie ma lata, a następnie kuli się pod blaskiem czarnego słońca i uznaje ten świat za rzeczywistość.{*EF*}{*B*}{*B*} -{*C3*}Wyleczenie ze smutku byłoby dla niego zgubne. Smutek jest częścią jego istnienia. Nie możemy się wtrącać.{*EF*}{*B*}{*B*} -{*C2*}Czasami, gdy śni głęboko, chcę mu powiedzieć, że w rzeczywistości tworzy prawdziwe światy. Czasami chcę mu powiedzieć, jak ważny jest dla wszechświata. Czasami, gdy od dawna nie nawiązał żadnego kontaktu, chcę mu pomóc w wypowiedzeniu słowa, którego tak bardzo się boi.{*EF*}{*B*}{*B*} -{*C3*}Potrafi czytać w naszych myślach.{*EF*}{*B*}{*B*} -{*C2*}Czasami zupełnie mnie to nie interesuje. Czasami chcę mu powiedzieć, że świat, który uznaje za prawdziwy, to tylko {*EF*}{*NOISE*}{*C2*} o {*EF*}{*NOISE*}{*C2*}. Chcę mu powiedzieć, że jest {*EF*}{*NOISE*}{*C2*} w {*EF*}{*NOISE*}{*C2*}. W swoim długim śnie widzi tak mało z rzeczywistości.{*EF*}{*B*}{*B*} -{*C3*}A mimo to gra.{*EF*}{*B*}{*B*} -{*C2*}A wystarczyłoby mu tylko powiedzieć...{*EF*}{*B*}{*B*} -{*C3*}Nie w tym śnie. Powiedzenie mu, jak żyć, uniemożliwiłoby mu życie.{*EF*}{*B*}{*B*} -{*C2*}Nie powiem graczowi, jak żyć.{*EF*}{*B*}{*B*} -{*C3*}Gracz zaczyna się niecierpliwić.{*EF*}{*B*}{*B*} -{*C2*}Opowiem mu historię.{*EF*}{*B*}{*B*} -{*C3*}Ale nie prawdę.{*EF*}{*B*}{*B*} -{*C2*}Nie. Historię, która zawiera prawdę ukrytą za słowami. Nie czystą prawdę, która może wyrządzić niewyobrażalne szkody.{*EF*}{*B*}{*B*} -{*C3*}Przywróć mu ciało.{*EF*}{*B*}{*B*} -{*C2*}Tak. Graczu...{*EF*}{*B*}{*B*} -{*C3*}Zwróć się po imieniu.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Graczu nad graczami.{*EF*}{*B*}{*B*} -{*C3*}Dobrze.{*EF*}{*B*}{*B*} - + + Wiadro z wodą - - -{*C2*}Weź głęboki oddech. Teraz kolejny. Nabierz powietrza w płuca. Odzyskaj władzę w kończynach. Tak, poruszaj palcami. Ponownie otrzymaj ciało wystawione na działanie grawitacji i powietrza. Odrodź się w tym długim śnie. Oto jesteś. Twoje ciało znów styka się ze wszechświatem w każdym punkcie, jakbyście byli osobnymi bytami. Jakbyśmy my byli osobnymi bytami.{*EF*}{*B*}{*B*} -{*C3*}Kim jesteśmy? Niegdyś nazywano nas duchem góry. Ojciec-słońce, matka-księżyc. Duchy przodków, duchy zwierząt. Dżiny. Duchy. Zieloni ludzie. Potem bogowie, demony. Anioły. Złośliwe duchy. Obcy, istoty pozaziemskie. Leptony, kwarki. Światy się zmieniają. My nie.{*EF*}{*B*}{*B*} -{*C2*}Jesteśmy wszechświatem. Jesteśmy wszystkim, co uważasz, że nie jest tobą. Patrzysz na nas teraz swoim ciałem i oczami. A czemu wszechświat dotyka twojego ciała i oświetla cię? Żeby cię zobaczyć, graczu. Żeby cię poznać. I dać się poznać. Opowiem ci historię.{*EF*}{*B*}{*B*} -{*C2*}Dawno, dawno temu, żył pewien gracz.{*EF*}{*B*}{*B*} -{*C3*}Tym graczem byłeś ty, {*PLAYER*}.{*EF*}{*B*}{*B*} -{*C2*}Czasami gracz uważał się za człowieka, który żył na wirującej kuli z roztopionej skały. Kula wirowała wokół kuli płonącego gazu, która była 330 000 razy większa. Znajdowały się od siebie tak daleko, że światło potrzebowało 8 minut, aby pokonać ten dystans. Światło było informacją przesyłaną od gwiazdy i mogło poparzyć twoją skórę z odległości 150 milionów kilometrów.{*EF*}{*B*}{*B*} -{*C2*}Czasami gracz śnił, że był górnikiem, żyjącym na płaskim i nieskończonym świecie. Słońce było białym kwadratem. Dni były krótkie. Było tyle do zrobienia, a śmierć jawiła się tylko jako drobna niedogodność.{*EF*}{*B*}{*B*} -{*C3*}Czasami gracz śnił, że zagubił się w historii.{*EF*}{*B*}{*B*} -{*C2*}Czasami śnił, że był kimś innym, w zupełnie innym miejscu. Czasami sny były niepokojące, innym razem piękne. Bywało, że gracz budził się z jednego snu i zapadał w następny, a potem w kolejny.{*EF*}{*B*}{*B*} -{*C3*}Czasami śniło mu się, że ogląda słowa na ekranie.{*EF*}{*B*}{*B*} -{*C2*}Cofnijmy się trochę.{*EF*}{*B*}{*B*} -{*C2*}Atomy, z których składał się gracz, były rozrzucone wszędzie – w trawie, w wodzie, w powietrzu i ziemi. Kobieta zebrała te atomy – piła, jadła, wdychała – a następnie stworzyła gracza w swoim ciele.{*EF*}{*B*}{*B*} -{*C2*}Gracz przebudził się z ciepłego i mrocznego ciała swojej matki, wprost do długiego snu.{*EF*}{*B*}{*B*} -{*C2*}Stał się nową historią, nigdy wcześniej nieopowiedzianą, zapisaną literami DNA. Był nowym programem, nigdy wcześniej nieuruchamianym, napisanym za pomocą kodu źródłowego, mającego miliardy lat. Był nowym człowiekiem, który nie żył nigdy wcześniej, stworzonym wyłącznie z mleka i miłości.{*EF*}{*B*}{*B*} -{*C3*}Ty jesteś tym graczem. Historią. Programem. Człowiekiem. Stworzonym wyłącznie z mleka i miłości.{*EF*}{*B*}{*B*} -{*C2*}Cofnijmy się jeszcze dalej.{*EF*}{*B*}{*B*} -{*C2*}Siedem miliardów miliardów miliardów atomów, z których składa się ciało gracza, powstało w sercu gwiazdy na długo przed tą grą. Więc także gracz jest informacją od gwiazdy. Gracz przeżywa historię, która jest lasem informacji zasianym przez człowieka imieniem Julian, na płaskim, nieskończonym świecie, stworzonym przez człowieka imieniem Markus, który istnieje w małym, prywatnym świecie stworzonym przez gracza, który zamieszkuje wszechświat, stworzony przez...{*EF*}{*B*}{*B*} -{*C3*}Ciiii. Czasami gracz tworzył mały, prywatny świat, przytulny, ciepły i prosty. Czasami bywał twardy, zimny i skomplikowany. Czasami tworzył w myślach model wszechświata, przez który przemieszczały się drobinki energii. Czasami nazywał te drobinki elektronami i protonami.{*EF*}{*B*}{*B*} + + Wiadro z lawą - - -{*C2*}Czasami nazywał je planetami i gwiazdami.{*EF*}{*B*}{*B*} -{*C2*}Czasami wierzył, że znajdował się we wszechświecie stworzonym z energii, która powstała z zer i jedynek, linii kodu. Czasami wierzył, że grał w grę. Czasami, że czyta słowa na ekranie.{*EF*}{*B*}{*B*} -{*C3*}Jesteś graczem czytającym słowa...{*EF*}{*B*}{*B*} -{*C2*}Ciiii... Czasami gracz czytał linie kodu na ekranie. Deszyfrował z nich słowa. Deszyfrował słowa w znaczenia. Deszyfrował znaczenia w uczucia, emocje, teorie, pomysły. Zaczynał wtedy oddychać szybciej i głębiej, i zdał sobie sprawę, że żyje. Żyje, a te tysiące śmierci nie były prawdziwe. Gracz żył{*EF*}{*B*}{*B*} -{*C3*}Ty. Ty. Ty jesteś żywy.{*EF*}{*B*}{*B*} -{*C2*}i czasami wierzył, że wszechświat do niego przemawiał poprzez promienie słońca świecące przez liście{*EF*}{*B*}{*B*} -{*C3*}i czasami wierzył, że wszechświat do niego przemawia poprzez światło, które spadło z nocnego, zimowego nieba, gdzie błysk światła widziany kątem oka mógł być olbrzymią gwiazdą, która spalała pobliskie planety na plazmę, aby chociaż na chwilę pokazać się graczowi wracającemu do domu po drugiej stronie wszechświata, czującemu zapach jedzenia i wkrótce zapadającemu w kolejny sen{*EF*}{*B*}{*B*} -{*C2*}i czasami wierzył, że wszechświat do niego przemawia poprzez zera i jedynki, całą energię elektryczną świata, przez przesuwające się po ekranie słowa, które pokazują się na końcu snu{*EF*}{*B*}{*B*} -{*C3*}i wszechświat powiedział, że cię kocha{*EF*}{*B*}{*B*} -{*C2*}i wszechświat powiedział, że dobrze grałeś{*EF*}{*B*}{*B*} -{*C3*}i wszechświat powiedział, że wszystko niezbędne jest w tobie{*EF*}{*B*}{*B*} -{*C2*}i wszechświat powiedział, że jesteś silniejszy niż ci się wydaje{*EF*}{*B*}{*B*} -{*C3*}i wszechświat powiedział, że jesteś dniem{*EF*}{*B*}{*B*} -{*C2*}i wszechświat powiedział, że jesteś nocą{*EF*}{*B*}{*B*} -{*C3*}i wszechświat powiedział, że ciemność, z którą walczysz, jest w tobie{*EF*}{*B*}{*B*} -{*C2*}i wszechświat powiedział, że światłość, której szukasz, jest w tobie{*EF*}{*B*}{*B*} -{*C3*}i wszechświat powiedział, że nie jesteś sam{*EF*}{*B*}{*B*} -{*C2*}i wszechświat powiedział, że nie jesteś oddzielony od innych rzeczy{*EF*}{*B*}{*B*} -{*C3*}i wszechświat powiedział, że jesteś wszechświatem, który sam się sprawdza, rozmawia ze sobą i czyta własny kod{*EF*}{*B*}{*B*} -{*C2*}i wszechświat powiedział, że cię kocha, ponieważ jesteś miłością.{*EF*}{*B*}{*B*} -{*C3*}Gra dobiegła końca, a gracz przebudził się ze snu. I zaczął kolejny sen. I śnił ponownie, śnił lepiej. I gracz był wszechświatem. I był miłością.{*EF*}{*B*}{*B*} -{*C3*}Ty jesteś graczem.{*EF*}{*B*}{*B*} -{*C2*}Przebudź się.{*EF*} + + Złote buty - - Resetuj Otchłań + + Sztabka żelaza - - Czy na pewno chcesz zresetować Otchłań w tym zapisie gry do pierwotnego stanu? Utracisz wszystko, co zostało przez ciebie wybudowane w Otchłani! + + Sztabka złota - - Resetuj Otchłań + + Krzesiwo - - Nie resetuj Otchłani + + Węgiel - - Nie możesz teraz ostrzyc tej grzybowej krowy. Osiągnięto maksymalną liczbę świń, owiec, krów i kotów. + + Węgiel drzewny - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę świń, owiec, krów i kotów. + + Diament - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę grzybowych krów. + + Jabłko - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę wilków. + + Łuk - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę kur. + + Strzała - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę kałamarnic. + + Płyta muzyczna – „ward” - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę przeciwników. + + + Wciśnij{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby zmienić kategorię przedmiotów, które chcesz wytwarzać. Wybierz obiekty.{*StructuresIcon*} - - Nie można skorzystać teraz z jaja tworzącego. Osiągnięto maksymalną liczbę osadników. + + + Wciśnij{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby zmienić kategorię przedmiotów, które chcesz wytwarzać. Wybierz narzędzia.{*ToolsIcon*} - - Osiągnięto maksymalną liczbę obrazów/ramek. + + + Po wybudowaniu warsztatu umieść go w świecie, aby możliwe było tworzenie większej liczby przedmiotów.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. - - Nie możesz tworzyć przeciwników na poziomie trudności „Spokojny”. + + + Dzięki stworzonym narzędziom będziesz w stanie skuteczniej wydobywać materiały.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. - - To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych świń, owiec, krów i kotów. + + + Niektóre z przepisów wymagają wielu kroków. Teraz, gdy masz już deski, możesz wytworzyć więcej przedmiotów. Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby zmienić przedmiot, który chcesz stworzyć. Wybierz warsztat.{*CraftingTableIcon*} - - To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych wilków. + + + Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby zmienić przedmiot, który chcesz stworzyć. Niektóre przedmioty występują w różnych wersjach, w zależności od wybranych składników. Wybierz drewnianą łopatę.{*WoodenShovelIcon*} - - To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych kur. + + Zebrane drewno może być przerobione na deski. Wybierz ikonę desek i wciśnij{*CONTROLLER_VK_A*}, aby je stworzyć.{*PlanksIcon*} - - To zwierzę nie może wejść w miłosny nastrój. Osiągnięto maksymalną liczbę rozmnażanych grzybowych krów. + + + Możesz tworzyć jeszcze więcej przedmiotów, korzystając z warsztatu. Wytwarzanie przedmiotów w warsztacie działa tak samo jak zwykłe wytwarzanie, ale dzięki większemu obszarowi możliwe jest połączenie większej liczby składników. - - Osiągnięto maksymalną liczbę łódek. + + + Obszar wytwarzania pokazuje składniki, które są niezbędne do stworzenia nowego przedmiotu. Wciśnij{*CONTROLLER_VK_A*}, aby stworzyć przedmiot i umieścić go w ekwipunku. - - Osiągnięto maksymalną liczbę głów istot. + + + Przełączaj się między zakładkami na górze ekranu za pomocą{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby wybrać zakładkę z interesującą cię grupą przedmiotów do wytworzenia, a następnie użyj{*CONTROLLER_MENU_NAVIGATE*}, aby wybrać przedmiot. - - Odwróć widok + + + Lista składników niezbędnych do wytworzenia wybranego przedmiotu. - - Dla leworęcznych + + + Opis aktualnie wybranego przedmiotu. Może dać ci on podpowiedź co do zastosowania przedmiotu. - - Nie żyjesz! + + + Dolna prawa część interfejsu wytwarzania przedstawia twój ekwipunek. Wyświetla także opis wybranego przedmiotu oraz składniki niezbędne do jego stworzenia. - - Odrodzenie + + + Niektóre przedmioty nie mogą być stworzone w warsztacie. Niezbędny jest piec. Stwórz piec.{*FurnaceIcon*} - - Oferta zawartości do pobrania + + Żwir - - Zmień skórkę + + Ruda złota - - Instrukcja + + Ruda żelaza - - Sterowanie + + Lawa - - Ustawienia + + Piasek - - Napisy + + Piaskowiec - - Przeinstaluj zawartość + + Ruda węgla - - Opcje programisty + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z pieca. - - Ogień się rozprzestrzenia + + + Oto interfejs pieca. Piec umożliwia ci przetwarzanie przedmiotów poprzez ich wypalanie. Przykładowo, możesz przetopić rudę żelaza na sztabki żelaza. - - Trotyl wybucha + + + Umieść stworzony piec w świecie. Dobrze jest umieścić go w siedzibie.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, aby zamknąć interfejs wytwarzania. - - Gracz kontra gracz (PvP) + + Drewno - - Ufaj graczom + + Drewno dębowe - - Przywileje hosta + + + W dolnym polu musisz umieścić opał, a przedmiot, który ma zostać zmieniony, w górnym. Piec się rozpali i rozpocznie działanie. Zmieniony przedmiot znajdzie się po prawej stronie. - - Generowanie budynków + + {*B*} + Wciśnij{*CONTROLLER_VK_X*}, aby ponownie wyświetlić ekwipunek. - - Superpłaski świat + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z ekwipunku. - - Dodatkowa skrzynia + + + Oto twój ekwipunek. Pokazuje wszystkie niesione przez ciebie przedmioty oraz te, które możesz trzymać w ręku. Wyświetlone są tu także elementy pancerza. - - Opcje świata + + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować samouczek.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli uważasz, że możesz rozpocząć właściwą grę. - - Może budować i wydobywać + + + Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, możesz wyrzucić ten przedmiot. - - Może korzystać z drzwi i przełączników + + + Przenieś ten przedmiot kursorem w inne miejsce w ekwipunku i odłóż go, wciskając{*CONTROLLER_VK_A*}. + Mając kilka przedmiotów przy kursorze, wciśnij{*CONTROLLER_VK_A*}, aby odłożyć wszystkie, lub{*CONTROLLER_VK_X*}, aby odłożyć tylko jeden. - - Może otwierać pojemniki + + + Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby poruszać kursorem. Użyj{*CONTROLLER_VK_A*}, aby podnieść przedmiot znajdujący się pod kursorem. + Jeżeli znajduje się tam więcej niż jedna sztuka przedmiotu, podniesione zostaną wszystkie. Możesz użyć{*CONTROLLER_VK_X*}, aby podnieść połowę. - - Może atakować graczy + + + Udało ci się ukończyć pierwszą część samouczka. - - Może atakować zwierzęta + + Skorzystaj z pieca, aby stworzyć trochę szkła. Czekając na jego stworzenie, możesz poszukać materiałów na wykończenie schronienia. - - Moderator + + Skorzystaj z pieca, aby stworzyć trochę węgla drzewnego. Czekając na jego stworzenie, możesz poszukać materiałów na wykończenie schronienia. - - Wyrzuć gracza + + Użyj{*CONTROLLER_ACTION_USE*}, aby umieścić piec w świecie, a następnie z niego skorzystaj. - - Może latać + + W nocy robi się bardzo ciemno, więc w twojej siedzibie przyda się trochę światła. Stwórz pochodnię z kija i węgla drzewnego, używając interfejsu wytwarzania.{*TorchIcon*} - - Wyłącz zmęczenie + + Użyj{*CONTROLLER_ACTION_USE*}, aby umieścić drzwi. Użyj{*CONTROLLER_ACTION_USE*}, aby otwierać i zamykać drzwi. - - Niewidzialność + + Dobre schronienie będzie miało drzwi, aby można było łatwo się do niego dostać, bez konieczności niszczenia ścian. Stwórz drewniane drzwi.{*WoodenDoorIcon*} - - Opcje hosta + + + Jeżeli chcesz uzyskać więcej informacji o przedmiocie, umieść na nim kursor i wciśnij{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Gracze/zaproszenia + + + Oto interfejs wytwarzania. Umożliwia on łączenie zebranych przedmiotów w nowe. - - Gra sieciowa + + + Wciśnij{*CONTROLLER_VK_B*}, aby opuścić ekran ekwipunku w trybie tworzenia. - - Tylko za zaproszeniem + + + Jeżeli chcesz uzyskać więcej informacji o przedmiocie, umieść na nim kursor i wciśnij{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Więcej opcji + + {*B*} + Wciśnij{*CONTROLLER_VK_X*}, aby wyświetlić składniki niezbędne do stworzenia wybranego przedmiotu. - - Wczytaj + + {*B*} + Wciśnij{*CONTROLLER_VK_X*}, aby wyświetlić opis przedmiotu. - - Nowy świat + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak wytwarzać przedmioty. - - Nazwa świata + + + Przełączaj się między zakładkami na górze ekranu za pomocą{*CONTROLLER_VK_LB*} i{*CONTROLLER_VK_RB*}, aby wybrać zakładkę z interesującą cię grupą przedmiotów. - - Ziarno do generowania świata + + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby kontynuować.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli już wiesz, jak korzystać z ekwipunku w trybie tworzenia. - - Zostaw puste, aby stworzyć losowe ziarno + + + Oto ekwipunek w trybie tworzenia. Wyświetla wszystkie dostępne przedmioty oraz te, które możesz trzymać w ręku. - - Gracze + + + Wciśnij{*CONTROLLER_VK_B*}, aby opuścić ekran ekwipunku. - - Dołącz do gry + + + Jeżeli przesuniesz kursor z przedmiotem poza okno ekwipunku, będziesz mógł go wyrzucić. Aby usunąć wszystkie przedmioty z paska szybkiego wyboru, wciśnij{*CONTROLLER_VK_X*}. - - Rozpocznij grę + + + Kursor automatycznie przeniesie się nad wolne miejsce w pasku użycia. Możesz umieścić tam wybrany przedmiot, wciskając{*CONTROLLER_VK_A*}. Po umieszczeniu go, kursor powróci na listę przedmiotów, gdzie będzie można wybrać inny przedmiot. - - Nie znaleziono gier + + + Użyj{*CONTROLLER_MENU_NAVIGATE*}, aby poruszać kursorem. + Mając otwartą listę przedmiotów, wciśnij{*CONTROLLER_VK_A*}, aby podnieść przedmiot znajdujący się pod kursorem, albo wciśnij{*CONTROLLER_VK_Y*}, aby podnieść maksymalną liczbę sztuk wybranego przedmiotu. - - Graj + + Woda - - Rankingi + + Szklana butelka - - Pomoc i opcje + + Butelka z wodą - - Pełna wersja + + Oko pająka - - Wznów grę + + Samorodek złota - - Zapisz grę + + Narośl z Otchłani - - Poziom trudności: + + {*splash*}{*prefix*}mikstura {*postfix*} - - Rodzaj gry: + + Sfermentow. oko pająka - - Budynki: + + Kociołek - - Rodzaj poziomu: + + Oko Kresu - - PvP: + + Błyszczący arbuz - - Ufaj graczom: + + Płomienny proszek - - Trotyl: + + Magmowy krem - - Ogień się rozprzestrzenia: + + Stacja alchemiczna - - Przeinstaluj motyw + + Łza ducha - - Przeinstaluj obrazek 1 + + Nasiona dyni - - Przeinstaluj obrazek 2 + + Nasiona arbuza - - Przeinstaluj przedmiot dla awatara 1 + + Surowy kurczak - - Przeinstaluj przedmiot dla awatara 2 + + Płyta muzyczna – „11” - - Przeinstaluj przedmiot dla awatara 3 + + Płyta muzyczna – „where are we now” - - Opcje + + Nożyce - - Dźwięk + + Smażony kurczak - - Sterowanie + + Perła Kresu - - Grafika + + Kawałek arbuza - - Interfejs + + Płomienna różdżka - - Przywróć standardowe + + Surowa wołowina - - Włącz kołysanie wzroku przy chodzeniu + + Smażony stek - - Podpowiedzi + + Zgniłe mięso. - - Wskazówki w grze + + Zaklęta butelka - - Pionowy podział ekranu w trybie dla 2 graczy + + Deski dębowe - - Wyjdź + + Deski świerkowe - - Wpisz tekst znaku: + + Deski brzozowe - - Dodaj opis do zdjęcia z gry + + Blok z trawą - - Podpis + + Ziemia - - Zdjęcie z gry + + Kamień brukowy - - Wpisz tekst znaku: + + Deski z drew. z dżungli - - Klasyczne tekstury, ikony i interfejs Minecrafta! + + Sadzonka brzozy - - Pokaż wszystkie światy tematyczne + + Sadzonka drzewa z dżungli - - Bez efektów + + Skała macierzysta - - Szybkość + + Sadzonka - - Spowolnienie + + Sadzonka dębu - - Przyspieszenie + + Sadzonka świerku - - Powolne wydobywanie + + Kamień - - Siła + + Ramka - - Osłabienie + + Przywołaj: {*CREATURE*} - - Natychmiastowe zdrowie + + Cegła z Otchłani - - Natychmiastowe obrażenia + + Ognisty ładunek - - Wzmocnienie skoku + + Ognisty ład. (węg. drz.) - - Mdłości + + Ognisty ładunek (węg.) - - Regeneracja + + Czaszka - - Odporność + + Głowa - - Odporność na ogień + + Głowa gracza %s - - Oddychanie pod wodą + + Głowa czyhacza - - Niewidzialność + + Czaszka kościotrupa - - Oślepienie + + Czaszka uschniętego kościotrupa - - Widzenie w ciemności + + Głowa zombie - - Głód + + Sprawny sposób przechowywania węgla. Może być używane jako paliwo w piecu. Trucizna - - szybkości + + Głód spowolnienia - - przyspieszenia + + szybkości - - znudzenia + + Niewidzialność - - siły + + Oddychanie pod wodą - - osłabienia + + Widzenie w ciemności - - leczenia + + Oślepienie ranienia - - skoku + + leczenia mdłości @@ -5102,29 +6023,38 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? regeneracji + + znudzenia + + + przyspieszenia + + + osłabienia + + + siły + + + Odporność na ogień + + + Nasycenie + odporności - - odporności na ogień - - - oddychania pod wodą - - - niewidzialności - - - oślepienia + + skoku - - widzenia w ciemności + + Uschnięty - - głodu + + Wzmocnienie zdrowia - - zatrucia + + Absorpcja @@ -5135,29 +6065,41 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? III + + niewidzialności + IV - - Rozpryskowa + + oddychania pod wodą - - Zwyczajna + + odporności na ogień - - Nudna + + widzenia w ciemności - - Mdła + + zatrucia - - Klarowna + + głodu - - Mleczna + + absorpcji - - Rozmyta + + nasycenia + + + wzmocnienia zdrowia + + + oślepienia + + + rozkładu Nieudolna @@ -5165,17 +6107,17 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Rozcieńczona - - Dziwna + + Rozmyta - - Niegazowana + + Klarowna - - Duża + + Mleczna - - Niezręczna + + Dziwna Maślana @@ -5183,246 +6125,300 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Gładka - - Łagodna + + Niezręczna - - Wytworna + + Niegazowana - - Gęsta + + Duża - - Elegancka + + Mdła - - Wymyślna + + Rozpryskowa - - Urocza + + Zwyczajna + + + Nudna Fantazyjna - - Czysta - Nasycona + + Urocza + + + Elegancka + + + Wymyślna + Gazowana + + Cuchnąca + + + Ostra + + + Bezzapachowa + Mocna Obrzydliwa - - Bezzapachowa + + Łagodna - - Cuchnąca + + Czysta - - Ostra + + Gęsta - - Gryząca + + Wytworna - - Wstrętna + + Stopniowo przywraca zdrowie graczy, zwierząt i potworów. - - Śmierdząca + + Natychmiast obniża zdrowie graczy, zwierząt i potworów. - - Używana jako podstawa do wszystkich mikstur. Wykorzystywana w stacji alchemicznej do warzenia mikstur. + + Sprawia, że gracze, zwierzęta i potwory są niewrażliwi na ogień, lawę i dystansowe ataki płomieni. Nie ma żadnego efektu, po dodaniu składników może być użyta w stacji alchemicznej do warzenia mikstur. - - Zwiększa prędkość poruszania się objętych jej działaniem graczy, zwierząt i potworów oraz prędkość biegu, długość skoku i pole widzenia graczy. + + Gryząca Zmniejsza prędkość poruszania się objętych jej działaniem graczy, zwierząt i potworów oraz prędkość biegu, długość skoku i pole widzenia graczy. + + Zwiększa prędkość poruszania się objętych jej działaniem graczy, zwierząt i potworów oraz prędkość biegu, długość skoku i pole widzenia graczy. + Zwiększa obrażenia zadawane atakami przez graczy i potwory. + + Natychmiast przywraca zdrowie graczy, zwierząt i potworów. + Zmniejsza obrażenia zadawane atakami przez graczy i potwory. - - Natychmiast przywraca zdrowie graczy, zwierząt i potworów. + + Używana jako podstawa do wszystkich mikstur. Wykorzystywana w stacji alchemicznej do warzenia mikstur. - - Natychmiast obniża zdrowie graczy, zwierząt i potworów. + + Wstrętna - - Stopniowo przywraca zdrowie graczy, zwierząt i potworów. + + Śmierdząca - - Sprawia, że gracze, zwierzęta i potwory są niewrażliwi na ogień, lawę i dystansowe ataki płomieni. + + Porażenie + + + Ostrość Stopniowo obniża zdrowie graczy, zwierząt i potworów. - - Ostrość + + Obrażenia od ataku - - Porażenie + + Odrzucenie Zguba stawonogów - - Odrzucenie + + Szybkość - - Aspekt ognia + + Wsparcie zombie - - Ochrona + + Siła skoku konia + + + Po użyciu: + + + Odporność na odrzucenie + + + Zasięg podążania istot + + + Maksymalne zdrowie + + + Delikatny dotyk + + + Wydajność + + + Podwodna wydajność + + + Szczęście + + + Grabież + + + Niezniszczalność Ochrona przed ogniem + + Ochrona + + + Aspekt ognia + Powolne opadanie - - Ochrona przed wybuchami + + Oddychanie Ochrona przed pociskami - - Oddychanie - - - Podwodna wydajność + + Ochrona przed wybuchami - - Wydajność + + IV - - Delikatny dotyk + + V - - Niezniszczalność + + VI - - Grabież + + Uderzenie - - Szczęście + + VII - - Moc + + III Płomień - - Uderzenie + + Moc - Nieskończoność - - - I + Nieskończoność II - - III - - - IV + + I - - V + + Aktywuje się, gdy istota przejdzie przez podłączoną linkę. - - VI + + Aktywuje podłączony haczyk na linkę, gdy istota przez nią przejdzie. - - VII + + Sprawny sposób przechowywania szmaragdów. - - VIII + + Działa jak zwykła skrzynia, ale umieszczone w skrzyni Kresu przedmioty są dostępne we wszystkich innych skrzyniach Kresu gracza, nawet w innych wymiarach. IX - - X + + VIII Może być wydobyta za pomocą żelaznego lub lepszego kilofa, aby zdobyć szmaragdy. - - Działa jak zwykła skrzynia, ale umieszczone w skrzyni Kresu przedmioty są dostępne we wszystkich innych skrzyniach Kresu gracza, nawet w innych wymiarach. - - - Aktywuje się, gdy istota przejdzie przez podłączoną linkę. + + X - - Aktywuje podłączony haczyk na linkę, gdy istota przez nią przejdzie. + + Odnawia 2{*ICON_SHANK_01*}. Może być wykorzystane do wytworzenia złotej marchewki. Można posadzić na polu uprawnym. - - Sprawny sposób przechowywania szmaragdów. + + Służy do dekoracji. Można w niej zasadzić kwiaty, sadzonki, kaktusy i grzyby. Murek z kamienia brukowego. - - Służy do naprawy broni, narzędzi i pancerza. + + Odnawia 0,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. Można posadzić na polu uprawnym. Po przetopieniu w piecu daje kwarc z Otchłani. - - Służy do dekoracji. + + Służy do naprawy broni, narzędzi i pancerza. Służy do handlu z osadnikami. - - Służy do dekoracji. Można w niej zasadzić kwiaty, sadzonki, kaktusy i grzyby. + + Służy do dekoracji. - - Odnawia 2{*ICON_SHANK_01*}. Może być wykorzystane do wytworzenia złotej marchewki. Można posadzić na polu uprawnym. + + Odnawia 4{*ICON_SHANK_01*}. - - Odnawia 0,5{*ICON_SHANK_01*}, ale może być usmażone w piecu. Można posadzić na polu uprawnym. + + Odnawia 1{*ICON_SHANK_01*}. Może ci zaszkodzić. + + + Służy do kierowania świnią podczas jazdy. Odnawia 3{*ICON_SHANK_01*}. Powstaje po usmażeniu ziemniaka w piecu. - - Odnawia 1{*ICON_SHANK_01*}, ale może być usmażone w piecu. Można posadzić na polu uprawnym. Może ci zaszkodzić. - Odnawia 3{*ICON_SHANK_01*}. Powstaje z połączenia marchewki i samorodków złota. - - Służy do kierowania świnią podczas jazdy. - - - Odnawia 4{*ICON_SHANK_01*}. - W połączeniu z kowadłem umożliwia zaklinanie broni, narzędzi lub pancerza. Powstaje przy wydobywaniu rudy kwarcu z Otchłani. Można z niego zrobić blok kwarcu z Otchłani. + + Ziemniak + + + Pieczony ziemniak + + + Marchewka + Powstaje z wełny. Służy do dekoracji. @@ -5432,14 +6428,11 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Doniczka - - Marchewka - - - Ziemniak + + Ciasto dyniowe - - Pieczony ziemniak + + Zaklęta księga Trujący ziemniak @@ -5450,11 +6443,11 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Marchewka na kiju - - Ciasto dyniowe + + Haczyk na linkę - - Zaklęta księga + + Linka Kwarc z Otchłani @@ -5465,11 +6458,8 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Skrzynia Kresu - - Haczyk na linkę - - - Linka + + Murek z kamienia brukowego z mchem Blok szmaragdu @@ -5477,8 +6467,8 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Murek z kamienia brukowego - - Murek z kamienia brukowego z mchem + + Ziemniaki Doniczka @@ -5486,8 +6476,8 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Marchewki - - Ziemniaki + + Lekko uszkodzone kowadło Kowadło @@ -5495,8 +6485,8 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Kowadło - - Lekko uszkodzone kowadło + + Blok kwarcu Mocno uszkodzone kowadło @@ -5504,8 +6494,8 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Ruda kwarcu z Otchłani - - Blok kwarcu + + Schody z kwarcu Rzeźbiony blok kwarcu @@ -5513,8 +6503,8 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Filarowy blok kwarcu - - Schody z kwarcu + + Czerwony dywan Dywan @@ -5522,8 +6512,8 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Czarny dywan - - Czerwony dywan + + Niebieski dywan Zielony dywan @@ -5531,9 +6521,6 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Brązowy dywan - - Niebieski dywan - Fioletowy dywan @@ -5546,18 +6533,18 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Szary dywan - - Różowy dywan - Limonkowy dywan - - Żółty dywan + + Różowy dywan Jasnoniebieski dywan + + Żółty dywan + Wrzosowy dywan @@ -5570,110 +6557,106 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Rzeźbiony piaskowiec - - Gładki piaskowiec - Gracz {*PLAYER*} zginął, próbując zranić: {*SOURCE*}. + + Gładki piaskowiec + Gracz {*PLAYER*} został zmiażdżony przez spadające kowadło. Gracz {*PLAYER*} został zmiażdżony przez spadający blok. - - Przeniesiono gracza {*PLAYER*} w miejsce: {*DESTINATION*}. - Gracz {*PLAYER*} przeniósł cię w miejsce swojego pobytu. - - Gracz {*PLAYER*} przeniósł się do ciebie. + + Przeniesiono gracza {*PLAYER*} w miejsce: {*DESTINATION*}. Ciernie - - Płyta z kwarcu + + Gracz {*PLAYER*} przeniósł się do ciebie. Sprawia, że ciemne miejsca stają się jaśniejsze, nawet pod wodą. + + Płyta z kwarcu + Sprawia, że gracze, zwierzęta i potwory stają się niewidzialne. Napraw i nazwij - - Koszt zaklęcia: %d - Za drogo! - - Zmień nazwę + + Koszt zaklęcia: %d Masz: - - Wymagane rzeczy do handlu: + + Zmień nazwę {*VILLAGER_TYPE*} oferuje: %s - - Napraw + + Wymagane rzeczy do handlu: Handel - - Zabarw obrożę + + Napraw Oto interfejs kowadła, dzięki któremu możesz zmieniać nazwy, naprawiać i zaklinać broń, pancerz lub narzędzia za poziomy doświadczenia. - - - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat interfejsu kowadła.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + + Zabarw obrożę Aby rozpocząć pracę nad przedmiotem, umieść go w pierwszym miejscu. - + - Gdy odpowiedni materiał zostanie umieszczony w drugim miejscu (np. sztabki żelaza, aby naprawić uszkodzony żelazny miecz), wynik naprawy pojawi się w ostatnim miejscu. + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat interfejsu kowadła.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. Można też umieścić identyczny przedmiot w drugim miejscu, aby połączyć przedmioty. - + - Aby zakląć przedmiot za pomocą kowadła, umieść zaklętą księgę w drugim miejscu. + Gdy odpowiedni materiał zostanie umieszczony w drugim miejscu (np. sztabki żelaza, aby naprawić uszkodzony żelazny miecz), wynik naprawy pojawi się w ostatnim miejscu. Liczba niezbędnych poziomów doświadczenia zostanie wyświetlona poniżej. Jeżeli nie masz wystarczającej liczby poziomów, naprawa nie będzie możliwa. - + - Można zmienić nazwę przedmiotu, wpisując ją w widocznym polu. + Aby zakląć przedmiot za pomocą kowadła, umieść zaklętą księgę w drugim miejscu. Podniesienie naprawionego przedmiotu zużyje oba przedmioty i obniży twój poziom doświadczenia o podaną liczbę. - + - Znajdziesz tu kowadło oraz skrzynię zawierającą narzędzia i broń, nad którymi możesz pracować. + Można zmienić nazwę przedmiotu, wpisując ją w widocznym polu. @@ -5681,33 +6664,33 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat kowadeł.{*B*} Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - + - Za pomocą kowadła można naprawiać, zmieniać nazwę i zaklinać (przy użyciu zaklętych ksiąg) broń i narzędzia. + Znajdziesz tu kowadło oraz skrzynię zawierającą narzędzia i broń, nad którymi możesz pracować. Zaklęte księgi można znaleźć w skrzyniach w lochach lub stworzyć ze zwykłych książek na magicznym stole. - + - Korzystanie z kowadła kosztuje poziomy doświadczenia, a każde użycie grozi jego uszkodzeniem. + Za pomocą kowadła można naprawiać, zmieniać nazwę i zaklinać (przy użyciu zaklętych ksiąg) broń i narzędzia. Rodzaj zadania, wartość, liczba zaklęć oraz ilość włożonej pracy wpływają na koszt naprawy przedmiotu. - + - Zmiana nazwy dotyczy wszystkich graczy i na stałe obniża koszt związany z wcześniejszymi pracami. + Korzystanie z kowadła kosztuje poziomy doświadczenia, a każde użycie grozi jego uszkodzeniem. W pobliskiej skrzyni znajdziesz uszkodzone kilofy, materiały, zaklęte butelki i księgi, dzięki którym możesz poeksperymentować. - + - Oto interfejs handlu, który wyświetla możliwe wymiany z osadnikiem. + Zmiana nazwy dotyczy wszystkich graczy i na stałe obniża koszt związany z wcześniejszymi pracami. @@ -5715,47 +6698,51 @@ Czy chcesz teraz zainstalować pakiet łączony lub pakiet tekstur? Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej na temat interfejsu handlu.{*B*} Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. - + - Wszystkie przedmioty w ofercie osadnika wyświetlone są u góry. + Oto interfejs handlu, który wyświetla możliwe wymiany z osadnikiem. Oferta będzie czerwona i niedostępna, jeżeli nie masz wymaganych przedmiotów. - + - Liczba i rodzaj oferowanych osadnikowi przedmiotów znajduje się w dwóch okienkach po lewej stronie. + Wszystkie przedmioty w ofercie osadnika wyświetlone są u góry. Całkowitą liczbę wymaganych do wymiany przedmiotów znajdziesz w dwóch okienkach po lewej stronie. - + - Wciśnij{*CONTROLLER_VK_A*}, aby wymienić wymagane przedmioty na oferowany przez osadnika. + Liczba i rodzaj oferowanych osadnikowi przedmiotów znajduje się w dwóch okienkach po lewej stronie. W pobliżu znajdziesz osadnika i skrzynię zawierającą papier niezbędny do wymiany. - + - {*B*} - Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o handlu.{*B*} - Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. + Wciśnij{*CONTROLLER_VK_A*}, aby wymienić wymagane przedmioty na oferowany przez osadnika. Gracze mogą wymieniać się z osadnikami przedmiotami z ekwipunku. - + - Przedmioty oferowane przez osadnika zależą od jego profesji. + {*B*} + Wciśnij{*CONTROLLER_VK_A*}, aby dowiedzieć się więcej o handlu.{*B*} + Wciśnij{*CONTROLLER_VK_B*}, jeżeli masz już wiedzę na ten temat. Dokonanie różnych wymian powiększy lub zaktualizuje listę oferowanych przez osadnika przedmiotów. + + + + Przedmioty oferowane przez osadnika zależą od jego profesji. @@ -5903,7 +6890,4 @@ Wszystkie skrzynie Kresu na świecie są połączone. Przedmioty umieszczone w s Ulecz - - Szukanie ziarna do generowania świata - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsPlatformSpecific.xml index 41700f76..3b00adc6 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pl-PL/stringsPlatformSpecific.xml @@ -1,243 +1,245 @@  - - NOT USED + + Czy chcesz wpisać się do sieci "PSN"? - - Możesz wykorzystać ekran dotykowy systemu PlayStation®Vita, aby poruszać się po menu! + + Dla graczy, którzy nie są na tym samym systemie PlayStation®Vita co host, wybranie tej opcji usunie z gry tego gracza i każdego innego gracza będącego na tym samym systemie PlayStation®Vita. Gracz nie będzie mógł ponownie dołączyć do gry bez jej ponownego uruchomienia. - - Minecraftforum ma dział poświęcony edycji PlayStation®Vita. + + SELECT - - Najnowsze informacje o grze można zdobyć na @4JStudios i @Kappische, na Twitterze! + + Ta opcja wyłącza trofea i aktualizacje rankingów w danym świecie. Pozostaną one wyłączone, jeżeli wczytasz świat, który został zapisany z włączoną opcją. - - Nie patrz w oczy kresostworów! + + System PlayStation®Vita - - Wydaje nam się, że 4J Studios usunęło Herobrine'a z edycji PlayStation®Vita, ale nie mamy pewności. + + Wybierz sieć Ad Hoc, aby połączyć się z pobliskimi systemami PlayStation®Vita, lub sieć "PSN", aby połączyć się z graczami z całego świata. - - Minecraft: Edycja PlayStation®Vita pobiła wiele rekordów! + + Sieć Ad Hoc - - {*T3*}INSTRUKCJA : GRA WIELOOSOBOWA{*ETW*}{*B*}{*B*} -Minecraft na systemie PlayStation®Vita to gra wieloosobowa od samego początku.{*B*}{*B*} -Gdy rozpoczniesz lub dołączysz do gry sieciowej, stanie się ona widoczna dla twoich znajomych (chyba, że przy zakładaniu zaznaczono opcję „Tylko za zaproszeniem”), i jeżeli do niej dołączą, stanie się widoczna także dla ich znajomych (tylko po zaznaczeniu opcji „Umożliw dołączanie znajomym znajomych”).{*B*} -Będąc w grze możesz nacisnąć przycisk SELECT, aby wyświetlić listę innych graczy znajdujących się w grze. Możesz za jej pomocą wyrzucać graczy z gry. + + Zmiana trybu sieci - - {*T3*}INSTRUKCJA : UDOSTĘPNIANIE ZDJĘĆ{*ETW*}{*B*}{*B*} -Możesz robić zdjęcia, zatrzymując grę i wciskając{*CONTROLLER_VK_Y*}, aby udostępnić je na Facebooku. Zobaczysz miniaturową wersję swojego zdjęcia, do którego będzie można dodać post, który pojawi się na Facebooku.{*B*}{*B*} -Dostępny jest specjalny tryb robienia zdjęć, w którym widoczna jest twarz twojej postaci – wciskaj{*CONTROLLER_ACTION_CAMERA*}, dopóki nie zobaczysz twarzy, a następnie wciśnij{*CONTROLLER_VK_Y*}, aby udostępnić.{*B*}{*B*} -Identyfikatory internetowe nie będą wyświetlone na zdjęciu. + + Wybór trybu sieci - - {*T3*}INSTRUKCJA : TRYB TWORZENIA{*ETW*}{*B*}{*B*} -Interfejs trybu tworzenia umożliwia stworzenie dowolnego przedmiotu w ekwipunku gracza, bez potrzeby wydobywania bądź tworzenia danego przedmiotu. -Przedmioty z ekwipunku gracza nie będą znikać, gdy zostaną użyte lub umieszczone w świecie. Dzięki temu gracz może się skupić na budowaniu, a nie na zbieraniu surowców.{*B*} -Jeżeli stworzysz, wczytasz lub zapiszesz świat w trybie tworzenia, trofea oraz aktualizacje rankingów zostaną w nim zablokowane, nawet jeżeli zostanie wczytany w trybie przetrwania.{*B*} -Aby latać w trybie tworzenia, szybko dwukrotnie wciśnij{*CONTROLLER_ACTION_JUMP*}. Aby przestać latać, powtórz czynność. Aby latać szybciej, szybko wychyl{*CONTROLLER_ACTION_MOVE*} dwa razy podczas lotu. -Gdy latasz, przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby poruszać się w górę, lub {*CONTROLLER_ACTION_SNEAK*}, aby poruszać się w dół. Można też użyć {*CONTROLLER_ACTION_DPAD_UP*}, aby poruszać się w górę, {*CONTROLLER_ACTION_DPAD_DOWN*}, aby poruszać sie w dół, -{*CONTROLLER_ACTION_DPAD_LEFT*}, aby poruszać się w lewo i {*CONTROLLER_ACTION_DPAD_RIGHT*}, aby poruszać się w prawo. + + Identyfikatory internetowe w tr. podziel. ekranu - - Szybko wciśnij dwukrotnie{*CONTROLLER_ACTION_JUMP*}, aby latać. Aby przestać latać, powtórz czynność. Aby latać szybciej, szybko wychyl{*CONTROLLER_ACTION_MOVE*} dwa razy podczas lotu. -Gdy latasz, przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby poruszać się w górę, lub{*CONTROLLER_ACTION_SNEAK*}, aby poruszać się w dół, lub skorzystaj z przycisków kierunkowych, aby poruszać się w górę, w dół, w lewo lub prawo. + + Trofea - - NOT USED + + Ta gra posiada funkcję autozapisu poziomów. Gdy zobaczysz powyższą ikonę, gra zapisuje dane. +Nie wyłączaj systemu PlayStation®Vita, gdy znajduje się ona na ekranie. - - NOT USED + + Po włączeniu host może umożliwić sobie latanie, wyłączyć zmęczenie i stać się niewidzialnym, korzystając z menu. Blokuje trofea i aktualizacje rankingów. - - "NOT USED" + + Identyfikatory internetowe: - - "NOT USED" + + Korzystasz z próbnej wersji pakietu tekstur. Masz dostęp do całej zawartości pakietu, ale nie możesz zapisać postępu. +Jeżeli spróbujesz zapisać postęp podczas korzystania z wersji próbnej, zostaniesz poproszony o zakup pełnej wersji. - - Zaproś znajomych + + Patch 1.04 (aktualizacja 14) - - Jeżeli stworzysz, wczytasz lub zapiszesz świat w trybie tworzenia, trofea oraz aktualizacje rankingów zostaną w nim zablokowane, nawet jeżeli zostanie wczytany w trybie przetrwania. Na pewno chcesz kontynuować? + + Identyfikatory internetowe w grze - - Ten świat został wcześniej zapisany w trybie tworzenia i zostały w nim zablokowane trofea oraz aktualizacje rankingów. Na pewno chcesz kontynuować? + + Zobacz, co zrobiłem w Minecraft: PlayStation®Vita Edition! - - Ten świat został wcześniej zapisany w trybie tworzenia i zostały w nim zablokowane trofea oraz aktualizacje rankingów. + + Podczas pobierania wystąpił błąd. Spróbuj ponownie później. - - Jeżeli stworzysz, wczytasz lub zapiszesz świat z włączonymi przywilejami hosta, trofea oraz aktualizacje rankingów zostaną w nim zablokowane, nawet jeżeli zostanie wczytany po wyłączeniu tych opcji. Na pewno chcesz kontynuować? + + Nie można dołączyć do gry ze względu na ustawienia NAT. Sprawdź swoje ustawienia sieciowe. - - Utracono połączenie z siecią "PSN". Powrót do głównego menu. + + Podczas wgrywania wystąpił błąd. Spróbuj ponownie później. - - Utracono połączenie z siecią "PSN". + + Pobieranie zakończone! - - To wersja próbna Minecraft: PlayStation®Vita Edition. Gdyby była to pełna wersja gry, właśnie otrzymałbyś trofeum! -Odblokuj pełną wersję gry, aby poznać Minecraft: PlayStation®Vita Edition i grać ze znajomymi z całego świata przez sieć "PSN". -Czy chcesz odblokować pełną wersję gry? + + +W tym momencie w chmurze nie ma zapisanego stanu gry. +Możesz wgrać zapisany świat do chmury w Minecraft: Edycja PlayStation®3, a potem pobrać go w Minecraft: Edycja PlayStation®Vita! + - - To wersja próbna Minecraft: PlayStation®Vita Edition. Gdyby była to pełna wersja gry, właśnie otrzymałbyś motyw! -Odblokuj pełną wersję gry, aby poznać Minecraft: PlayStation®Vita Edition i grać ze znajomymi z całego świata przez sieć "PSN". -Czy chcesz odblokować pełną wersję gry? + + Zapis nieukończony - - To wersja próbna Minecraft: PlayStation®Vita Edition. Musisz posiadać pełną wersję gry, aby móc przyjąć to zaproszenie. -Czy chcesz odblokować pełną wersję gry? + + Na dysku nie ma miejsca, by zapisać Minecraft: Edycję PlayStation®Vita. Aby zwolnić miejsce, usuń inne zapisy Minecraft: Edycji PlayStation®Vita. - - Goście nie mogą odblokować pełnej wersji gry. Wpisz się na konto Sony Entertainment Network. + + Wgrywanie anulowane - - Identyfikator internetowy + + Anulowałeś wgrywanie tego zapisanego stanu gry do miejsca przechowywania zapisanych stanów gry. - - Warzenie + + Wgraj zapis stanu gry z PS3™/PS4™ - - Powróciłeś na ekran tytułowy, ponieważ zostałeś wypisany z sieci "PSN". - + + Wgrywanie danych: %d%% - - Osiągnięto limit czasu próbnej wersji Minecraft: PlayStation®Vita Edition! Czy chcesz odblokować pełną wersję gry, aby kontynuować zabawę? + + "PSN" - - Nastąpił błąd podczas wczytywania Minecraft: PlayStation®Vita Edition. Dalsze działanie jest niemożliwe. + + Pob. zapisany stan gry z PS3™ - - Nie udało się dołączyć do gry, ponieważ jeden lub więcej graczy nie może grać w trybie wieloosobowym ze względu na ograniczenia czatu jego konta Sony Entertainment Network. + + Pobieranie danych: %d%% - - Nie udało się stworzyć gry sieciowej, ponieważ jeden lub więcej graczy nie może grać w trybie wieloosobowym ze względu na ograniczenia czatu jego konta Sony Entertainment Network. Odznacz pole „Gra sieciowa” w menu „Więcej opcji”, aby gra nie była grą sieciową. + + Zapisywanie - - Nie możesz dołączyć do tej gry, ponieważ funkcje sieciowe zostały wyłączone na twoim koncie Sony Entertainment Network ze względu na ograniczenia czatu. + + Wgrywanie zakończone! - - Nie możesz dołączyć do tej gry, ponieważ funkcje sieciowe jednego z lokalnych graczy zostały wyłączone na jego koncie Sony Entertainment Network, ze względu na ograniczenia czatu. Odznacz pole „Gra sieciowa” w menu „Więcej opcji”, aby gra nie była grą sieciową. + + Czy na pewno chcesz wgrać ten zapis stanu gry i nadpisać stan obecnie znajdujący się w chmurze? - - Nie możesz stworzyć tej gry, ponieważ funkcje sieciowe jednego z lokalnych graczy zostały wyłączone na jego koncie Sony Entertainment Network, ze względu na ograniczenia czatu. Odznacz pole „Gra sieciowa” w menu „Więcej opcji”, aby gra nie była grą sieciową. + + Konwertowanie danych - - Ta gra posiada funkcję autozapisu poziomów. Gdy zobaczysz powyższą ikonę, gra zapisuje dane. -Nie wyłączaj systemu PlayStation®Vita, gdy znajduje się ona na ekranie. + + NOT USED - - Po włączeniu host może umożliwić sobie latanie, wyłączyć zmęczenie i stać się niewidzialnym, korzystając z menu. Blokuje trofea i aktualizacje rankingów. + + NOT USED - - Identyfikatory internetowe w tr. podziel. ekranu + + {*T3*}INSTRUKCJA : TRYB TWORZENIA{*ETW*}{*B*}{*B*} +Interfejs trybu tworzenia umożliwia stworzenie dowolnego przedmiotu w ekwipunku gracza, bez potrzeby wydobywania bądź tworzenia danego przedmiotu. +Przedmioty z ekwipunku gracza nie będą znikać, gdy zostaną użyte lub umieszczone w świecie. Dzięki temu gracz może się skupić na budowaniu, a nie na zbieraniu surowców.{*B*} +Jeżeli stworzysz, wczytasz lub zapiszesz świat w trybie tworzenia, trofea oraz aktualizacje rankingów zostaną w nim zablokowane, nawet jeżeli zostanie wczytany w trybie przetrwania.{*B*} +Aby latać w trybie tworzenia, szybko dwukrotnie wciśnij{*CONTROLLER_ACTION_JUMP*}. Aby przestać latać, powtórz czynność. Aby latać szybciej, szybko wychyl{*CONTROLLER_ACTION_MOVE*} dwa razy podczas lotu. +Gdy latasz, przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby poruszać się w górę, lub {*CONTROLLER_ACTION_SNEAK*}, aby poruszać się w dół. Można też użyć {*CONTROLLER_ACTION_DPAD_UP*}, aby poruszać się w górę, {*CONTROLLER_ACTION_DPAD_DOWN*}, aby poruszać sie w dół, +{*CONTROLLER_ACTION_DPAD_LEFT*}, aby poruszać się w lewo i {*CONTROLLER_ACTION_DPAD_RIGHT*}, aby poruszać się w prawo. - - Trofea + + Szybko wciśnij dwukrotnie{*CONTROLLER_ACTION_JUMP*}, aby latać. Aby przestać latać, powtórz czynność. Aby latać szybciej, szybko wychyl{*CONTROLLER_ACTION_MOVE*} dwa razy podczas lotu. +Gdy latasz, przytrzymaj{*CONTROLLER_ACTION_JUMP*}, aby poruszać się w górę, lub{*CONTROLLER_ACTION_SNEAK*}, aby poruszać się w dół, lub skorzystaj z przycisków kierunkowych, aby poruszać się w górę, w dół, w lewo lub prawo. - - Identyfikatory internetowe: + + "NOT USED" - - Identyfikatory internetowe w grze + + Jeżeli stworzysz, wczytasz lub zapiszesz świat w trybie tworzenia, trofea oraz aktualizacje rankingów zostaną w nim zablokowane, nawet jeżeli zostanie wczytany w trybie przetrwania. Na pewno chcesz kontynuować? - - Zobacz, co zrobiłem w Minecraft: PlayStation®Vita Edition! + + Ten świat został wcześniej zapisany w trybie tworzenia i zostały w nim zablokowane trofea oraz aktualizacje rankingów. Na pewno chcesz kontynuować? - - Korzystasz z próbnej wersji pakietu tekstur. Masz dostęp do całej zawartości pakietu, ale nie możesz zapisać postępu. -Jeżeli spróbujesz zapisać postęp podczas korzystania z wersji próbnej, zostaniesz poproszony o zakup pełnej wersji. + + "NOT USED" - - Patch 1.04 (aktualizacja 14) + + Zaproś znajomych - - SELECT + + Minecraftforum ma dział poświęcony edycji PlayStation®Vita. - - Ta opcja wyłącza trofea i aktualizacje rankingów w danym świecie. Pozostaną one wyłączone, jeżeli wczytasz świat, który został zapisany z włączoną opcją. + + Najnowsze informacje o grze można zdobyć na @4JStudios i @Kappische, na Twitterze! - - Czy chcesz wpisać się do sieci "PSN"? + + NOT USED - - Dla graczy, którzy nie są na tym samym systemie PlayStation®Vita co host, wybranie tej opcji usunie z gry tego gracza i każdego innego gracza będącego na tym samym systemie PlayStation®Vita. Gracz nie będzie mógł ponownie dołączyć do gry bez jej ponownego uruchomienia. + + Możesz wykorzystać ekran dotykowy systemu PlayStation®Vita, aby poruszać się po menu! - - System PlayStation®Vita + + Nie patrz w oczy kresostworów! - - Zmiana trybu sieci + + {*T3*}INSTRUKCJA : GRA WIELOOSOBOWA{*ETW*}{*B*}{*B*} +Minecraft na systemie PlayStation®Vita to gra wieloosobowa od samego początku.{*B*}{*B*} +Gdy rozpoczniesz lub dołączysz do gry sieciowej, stanie się ona widoczna dla twoich znajomych (chyba, że przy zakładaniu zaznaczono opcję „Tylko za zaproszeniem”), i jeżeli do niej dołączą, stanie się widoczna także dla ich znajomych (tylko po zaznaczeniu opcji „Umożliw dołączanie znajomym znajomych”).{*B*} +Będąc w grze możesz nacisnąć przycisk SELECT, aby wyświetlić listę innych graczy znajdujących się w grze. Możesz za jej pomocą wyrzucać graczy z gry. - - Wybór trybu sieci + + {*T3*}INSTRUKCJA : UDOSTĘPNIANIE ZDJĘĆ{*ETW*}{*B*}{*B*} +Możesz robić zdjęcia, zatrzymując grę i wciskając{*CONTROLLER_VK_Y*}, aby udostępnić je na Facebooku. Zobaczysz miniaturową wersję swojego zdjęcia, do którego będzie można dodać post, który pojawi się na Facebooku.{*B*}{*B*} +Dostępny jest specjalny tryb robienia zdjęć, w którym widoczna jest twarz twojej postaci – wciskaj{*CONTROLLER_ACTION_CAMERA*}, dopóki nie zobaczysz twarzy, a następnie wciśnij{*CONTROLLER_VK_Y*}, aby udostępnić.{*B*}{*B*} +Identyfikatory internetowe nie będą wyświetlone na zdjęciu. - - Wybierz sieć Ad Hoc, aby połączyć się z pobliskimi systemami PlayStation®Vita, lub sieć "PSN", aby połączyć się z graczami z całego świata. + + Wydaje nam się, że 4J Studios usunęło Herobrine'a z edycji PlayStation®Vita, ale nie mamy pewności. - - Sieć Ad Hoc + + Minecraft: Edycja PlayStation®Vita pobiła wiele rekordów! - - "PSN" + + Osiągnięto limit czasu próbnej wersji Minecraft: PlayStation®Vita Edition! Czy chcesz odblokować pełną wersję gry, aby kontynuować zabawę? - - Pob. zapisany stan gry z systemu PlayStation®3 + + Nastąpił błąd podczas wczytywania Minecraft: PlayStation®Vita Edition. Dalsze działanie jest niemożliwe. - - Wgraj zapis stanu gry z system PlayStation®3/PlayStation®4 + + Warzenie - - Wgrywanie anulowane + + Powróciłeś na ekran tytułowy, ponieważ zostałeś wypisany z sieci "PSN". - - Anulowałeś wgrywanie tego zapisanego stanu gry do miejsca przechowywania zapisanych stanów gry. + + Nie udało się dołączyć do gry, ponieważ jeden lub więcej graczy nie może grać w trybie wieloosobowym ze względu na ograniczenia czatu jego konta Sony Entertainment Network. - - Wgrywanie danych: %d%% + + Nie możesz dołączyć do tej gry, ponieważ funkcje sieciowe jednego z lokalnych graczy zostały wyłączone na jego koncie Sony Entertainment Network, ze względu na ograniczenia czatu. Odznacz pole „Gra sieciowa” w menu „Więcej opcji”, aby gra nie była grą sieciową. - - Pobieranie danych: %d%% + + Nie możesz stworzyć tej gry, ponieważ funkcje sieciowe jednego z lokalnych graczy zostały wyłączone na jego koncie Sony Entertainment Network, ze względu na ograniczenia czatu. Odznacz pole „Gra sieciowa” w menu „Więcej opcji”, aby gra nie była grą sieciową. - - Czy na pewno chcesz wgrać ten zapis stanu gry i nadpisać stan obecnie znajdujący się w chmurze? + + Nie udało się stworzyć gry sieciowej, ponieważ jeden lub więcej graczy nie może grać w trybie wieloosobowym ze względu na ograniczenia czatu jego konta Sony Entertainment Network. Odznacz pole „Gra sieciowa” w menu „Więcej opcji”, aby gra nie była grą sieciową. - - Konwertowanie danych + + Nie możesz dołączyć do tej gry, ponieważ funkcje sieciowe zostały wyłączone na twoim koncie Sony Entertainment Network ze względu na ograniczenia czatu. - - Zapisywanie + + Utracono połączenie z siecią "PSN". Powrót do głównego menu. - - Wgrywanie zakończone! + + Utracono połączenie z siecią "PSN". - - Podczas wgrywania wystąpił błąd. Prosimy spróbować ponownie później. + + Ten świat został wcześniej zapisany w trybie tworzenia i zostały w nim zablokowane trofea oraz aktualizacje rankingów. - - Pobieranie zakończone! + + Jeżeli stworzysz, wczytasz lub zapiszesz świat z włączonymi przywilejami hosta, trofea oraz aktualizacje rankingów zostaną w nim zablokowane, nawet jeżeli zostanie wczytany po wyłączeniu tych opcji. Na pewno chcesz kontynuować? - - Podczas pobierania wystąpił błąd. Prosimy spróbować ponownie później. + + To wersja próbna Minecraft: PlayStation®Vita Edition. Gdyby była to pełna wersja gry, właśnie otrzymałbyś trofeum! +Odblokuj pełną wersję gry, aby poznać Minecraft: PlayStation®Vita Edition i grać ze znajomymi z całego świata przez sieć "PSN". +Czy chcesz odblokować pełną wersję gry? - - Nie można dołączyć do gry ze względu na ustawienia NAT. Prosimy sprawdzić swoje ustawienia sieciowe. + + Goście nie mogą odblokować pełnej wersji gry. Wpisz się na konto Sony Entertainment Network. - - - W tym momencie w miejscu przechowywania zapisanych stanów gry nie ma żadnego zapisu. - Możesz wgrać tam zapisany stan gry za pomocą Minecraft: PlayStation®3 Edition, a potem pobrać go w Minecraft: PlayStation®Vita Edition. - + + Identyfikator internetowy - - Zapis nieukończony + + To wersja próbna Minecraft: PlayStation®Vita Edition. Gdyby była to pełna wersja gry, właśnie otrzymałbyś motyw! +Odblokuj pełną wersję gry, aby poznać Minecraft: PlayStation®Vita Edition i grać ze znajomymi z całego świata przez sieć "PSN". +Czy chcesz odblokować pełną wersję gry? - - Na dysku nie ma miejsca, by zapisać Minecraft: Edycję PlayStation®Vita. Aby zwolnić miejsce, usuń inne zapisy Minecraft: Edycji PlayStation®Vita. + + To wersja próbna Minecraft: PlayStation®Vita Edition. Musisz posiadać pełną wersję gry, aby móc przyjąć to zaproszenie. +Czy chcesz odblokować pełną wersję gry? + + + Zapisany stan gry znajdujący się w chmurze, ma numer wersji, której Minecraft: Edycja PlayStation®Vita jeszcze nie obsługuje. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-BR/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/4J_stringsPlatformSpecific.xml index 4f53f3cf..f5a2037d 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pt-BR/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/4J_stringsPlatformSpecific.xml @@ -1,53 +1,52 @@  - - O armazenamento do sistema selecionado não tem espaço livre suficiente para salvar um jogo. + + Falha ao salvar configurações na conta da Sony Entertainment Network. - - Você retornou à tela de título porque sua sessão da "PSN" foi finalizada + + Problema na conta da Sony Entertainment Network - - A partida terminou porque sua sessão da "PSN" foi finalizada - + + Houve um problema ao acessar sua conta da Sony Entertainment Network. Não foi possível conceder seu troféu no momento. - - Você não está conectado. - + + Esta é a versão de avaliação do jogo Minecraft: PlayStation®3 Edition. Se você já tem a versão completa do jogo, acabou de ganhar um troféu! +Desbloqueie a versão completa do jogo para curtir a diversão de Minecraft: PlayStation®3 Edition e jogue com seus amigos ao redor do mundo na "PSN". +Deseja desbloquear a versão completa do jogo? - - Este jogo tem recursos que exigem conexão com a "PSN", mas você está offline no momento. + + Conexão à Rede Ad Hoc + + + Este jogo tem recursos que exigem uma conexão de rede Ad Hoc, mas você está offline no momento. Rede Ad Hoc offline. - - Este jogo tem recursos que exigem uma conexão de rede Ad Hoc, mas você está offline no momento. + + Problema com troféu - - Este recurso exige que a sessão da "PSN" seja iniciada. + + A partida terminou porque sua sessão da "PSN" foi finalizada - - Conectar-se à "PSN" - - - Conexão à Rede Ad Hoc + + Você retornou à tela de título porque sua sessão da "PSN" foi finalizada - - Problema com troféu + + O armazenamento do sistema selecionado não tem espaço livre suficiente para salvar um jogo. - - Houve um problema ao acessar sua conta da Sony Entertainment Network. Não foi possível conceder seu troféu no momento. + + Você não está conectado. - - Problema na conta da Sony Entertainment Network + + Conectar-se à "PSN" - - Falha ao salvar configurações na conta da Sony Entertainment Network. + + Este recurso exige que a sessão da "PSN" seja iniciada. + - - Esta é a versão de avaliação do jogo Minecraft: PlayStation®3 Edition. Se você já tem a versão completa do jogo, acabou de ganhar um troféu! -Desbloqueie a versão completa do jogo para curtir a diversão de Minecraft: PlayStation®3 Edition e jogue com seus amigos ao redor do mundo na "PSN". -Deseja desbloquear a versão completa do jogo? + + Este jogo tem recursos que exigem conexão com a "PSN", mas você está offline no momento. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-BR/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/AdditionalStrings.xml index cb69bb2b..5cac9090 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pt-BR/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/AdditionalStrings.xml @@ -48,6 +48,12 @@ Seu arquivo de Opções está corrompido e precisa ser excluído. + + Excluir o arquivo de opções. + + + Tentar carregar o arquivo de opções novamente. + Seu arquivo de Salvamento de Cache está corrompido e precisa ser excluído. @@ -75,6 +81,9 @@ O serviço online está desativado em sua conta da Sony Entertainment Network devido à configuração do controle parental de um dos jogadores locais. + + Os recursos online estão desabilitados devido a uma atualização de jogo disponível. + Não há ofertas de conteúdo oferecido para download disponíveis para este título no momento. @@ -84,7 +93,4 @@ Venha jogar uma partida de Minecraft: PlayStation®Vita Edition! - - Os recursos online estão desabilitados devido a uma atualização de jogo disponível. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsGeneric.xml index a1e9ad78..8af8fb69 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsGeneric.xml @@ -1,5223 +1,6142 @@  - - O novo conteúdo oferecido para download está disponível! Acesse o conteúdo pelo botão Loja Minecraft no Menu Principal. + + Alternando para jogo offline - - Você sabia que pode mudar a aparência do seu personagem com um Pacote de capas da Loja Minecraft? Selecione o botão Loja Minecraft no Menu Principal para ver o que está disponível. + + Aguarde enquanto o host salva o jogo - - Altere as configurações de gama para deixar o jogo mais claro ou mais escuro. + + Entrando no FINAL - - Se você definir a dificuldade do jogo para Pacífico, sua energia regenerará automaticamente e nenhum monstro sairá à noite! + + Salvando jogadores - - Dê um osso a um lobo para torná-lo amigável. Depois, poderá fazê-lo sentar ou seguir você. + + Conectando ao host - - Você pode soltar itens que estão no Inventário movendo o cursor para fora do menu e pressionando{*CONTROLLER_VK_A*} + + Baixando terreno - - 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. + + Saindo do FINAL - - Pegue as costeletas dos porcos, cozinhe as costeletas e as coma para recuperar energia. + + A cama de sua casa estava desaparecida ou obstruída - - Extraia couro das vacas e use-o para fazer armaduras. + + Você não pode descansar agora, há monstros por perto - - Se tiver um balde vazio, poderá enchê-lo com leite de uma vaca, com água ou lava! + + Você está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. - - Use uma enxada para preparar áreas do solo para plantar. + + Esta cama está ocupada - - As aranhas não o atacarão durante o dia, a menos que você as ataque. + + Você só pode dormir à noite - - Escavar solo ou areia com uma pá é mais rápido do que com a mão! + + %s está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. - - Comer costeletas de porco cozidas dá mais energia que comê-las cruas. + + Carregando nível - - Faça algumas tochas para iluminar áreas à noite. Os monstros evitam as áreas ao redor das tochas. + + Finalizando... - - Chegue mais rapidamente aos destinos com um carrinho de minas e trilhos! + + Construindo terreno - - Plante algumas mudas e elas crescerão e se tornarão árvores. + + Simulando o mundo um pouquinho - - Os homens-porco não o atacarão, a menos que você os ataque. + + Classif. - - Você pode alterar seu ponto de criação no jogo e avançar até o nascer do sol dormindo em uma cama. + + Preparando para salvar nível - - Devolva aquelas bolas de fogo para o Ghast! + + Preparando partes... - - Ao construir um portal, você poderá viajar para outra dimensão: o Submundo. + + Inicializando o servidor - - Pressione{*CONTROLLER_VK_B*} para soltar o item que está em sua mão! + + Saindo do Submundo - - Use a ferramenta certa para o trabalho! + + Renascendo - - Se não encontrar carvão para suas tochas, faça carvão vegetal com árvores em uma fornalha. + + Criando nível - - Cavar diretamente para baixo ou para cima não é uma boa ideia. + + Produzindo área de criação - - O farelo de osso (fabricado com ossos de Esqueleto) pode ser usado como fertilizante e faz as coisas crescerem imediatamente! + + Carregando área de criação - - Os creepers explodirão se chegarem perto de você! + + Entrando no Submundo - - A obsidiana é criada quando a água encontra um bloco de origem de lava. + + Ferramentas e Armas - - A lava poderá demorar alguns minutos para desaparecer COMPLETAMENTE quando o bloco de origem for removido. + + Gama - - O pedregulho é resistente às bolas de fogo do Ghast, o que o torna útil para proteger portais. + + Sensibilidade do Jogo - - Blocos que podem ser usados como fonte de luz derretem neve e gelo. Eles incluem tochas, glowstone e lanternas de abóbora. + + Sensib. Interface - - Tome cuidado ao construir estruturas feitas de lã ao ar livre, pois relâmpagos de tempestades podem incendiar a lã. + + Dificuldade - - Um único balde de lava pode ser usado em uma fornalha para fundir 100 blocos. + + Música - - O instrumento tocado por um bloco de nota depende do material abaixo dele. + + Som - - Zumbis e esqueletos poderão sobreviver à luz do dia se estiverem na água. + + Pacífico - - 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. + + Neste modo, o jogador ganha energia com o tempo e não há inimigos no ambiente. - - Os lobos não podem entrar no Submundo. + + Neste modo, inimigos são gerados no ambiente, mas causam menos danos ao jogador que no modo Normal. - - Os lobos não atacam os Creepers. + + Neste modo, inimigos são gerados no ambiente e causam uma quantidade padrão de danos ao jogador. - - As galinhas põem ovos a cada 5 ou 10 minutos. + + Fácil - - A obsidiana só pode ser extraída com uma picareta de diamante. + + Normal - - Os Creepers são a fonte de pólvora mais fácil de se obter. + + Difícil - - Se colocar dois baús lado a lado você terá um baú grande. + + Sessão finalizada - - Lobos mansos mostram a saúde pela posição da cauda. Dê carne a eles para curá-los. + + Armadura - - Cozinhe o cacto na fornalha para fazer o corante verde. + + Mecanismos - - Leia a seção Novidades nos menus Como jogar para ver as últimas atualizações no jogo. + + Transporte - - Agora há cercas empilháveis no jogo! + + Armas - - Alguns animais seguirão você se tiver trigo na mão. + + Alimentos - - Se um animal não puder se mover mais de 20 blocos em qualquer direção, ele não se desintegrará. + + Estruturas - - Música de C418! + + Decorações - - Notch tem mais de um milhão de seguidores no twitter! + + Poções - - Nem todas as pessoas na Suécia têm cabelos loiros. Alguns, como Jens de Mojang, são ruivos! + + Ferramentas, Armas e Armaduras - - No futuro haverá uma atualização deste jogo! + + Materiais - - Quem é Notch? + + Blocos de Construção - - Mojang tem mais prêmios que ajudantes! + + Redstone e Transporte - - Algumas celebridades jogam Minecraft! + + Diversos - - deadmau5 curte o Minecraft! + + Entradas: - - Não olhe diretamente para os bugs. + + Sair sem salvar - - Os Creepers nasceram de um bug de código. + + Tem certeza de que deseja sair para o menu principal? O progresso não salvo será perdido. - - Isso é uma galinha ou um pato? + + Tem certeza de que deseja sair para o menu principal? Seu progresso será perdido! - - Você estava na Minecon? + + Este jogo salvo está corrompido ou danificado. Gostaria de excluí-lo? - - Ninguém da Mojang já viu o rosto do Junkboy. + + Tem certeza de que deseja sair para o menu principal e desconectar todos os jogadores do jogo? O progresso não salvo será perdido. - - Você sabia que existe um Wiki do Minecraft? + + Sair e salvar - - O novo escritório da Mojang é maneiro! + + Criar novo mundo - - A Minecon 2013 foi em Orlando, na Flórida, EUA! + + Digite um nome para o mundo - - .party() estava excelente! + + Insira a semente para a criação do seu mundo - - Considere os rumores sempre falsos, em vez de considerá-los verdadeiros! + + Carregar mundo salvo - - {*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*} -Segure {*CONTROLLER_ACTION_ACTION*} 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. + + Jogar tutorial - - {*T3*}COMO JOGAR: HUD{*ETW*}{*B*}{*B*} -O HUD mostra informações sobre seu status; sua energia, o oxigênio restante quando está debaixo d'água, seu nível de fome (é preciso comer para reabastecer) e sua armadura, se estiver usando uma. Se você perder energia, mas tiver uma barra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será reabastecida automaticamente. Comer preenche 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. + + Tutorial - - {*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.{*B*}{*B*} -É possível mudar a cor da sua Armadura de Couro tingindo-a. Você pode fazer isso no inventário ao segurar o corante no seu ponteiro e, em seguida, pressionar{*CONTROLLER_VK_X*} enquanto o ponteiro estiver sobre a peça que você deseja tingir. + + Nomear mundo - - {*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. - + + Jogo danificado - - {*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. - + + OK - - {*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 fabricar o item e colocá-lo no inventário. - + + Cancelar - - {*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. - + + Loja Minecraft - - {*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. - + + Girar - - {*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. - + + Ocultar - - {*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 de Lançamento, que pode ser atirada. Ao ser atirada, a Poção de Lançamento 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. - + + Limpar Todos os Espaços - - {*T3*}COMO JOGAR: 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 são colocados Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no espaço por baixo do livro na Mesa de Feitiços, os três botões à direita do espaço apresentam alguns feitiços e os respectivos custos em Níveis de Experiência.{*B*} -Se você não tiver 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, ou ser extraídos das minas ou cultivados no mundo.{*B*}{*B*} -Livros Encantados são usados na Bigorna para aplicar feitiços nos itens. Isso lhe dá mais controle sobre quais feitiços você quer nos seus itens.{*B*} + + Tem certeza de que deseja sair do jogo atual e entrar no novo jogo? O progresso não salvo será perdido. - - {*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. - + + Tem certeza de que deseja substituir o salvamento anterior deste mundo pela versão atual dele? - - {*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. + + Tem certeza de que deseja sair sem salvar? Você perderá todo o progresso neste mundo! - - {*T3*}COMO JOGAR: PORTAL DO SUBMUNDO{*ETW*}{*B*}{*B*} -Um Portal do Submundo permite que o jogador viaje entre a Superfície e o Submundo. O Submundo pode ser usado para o deslocamento rápido na Superfície. Viajar a uma distância de um bloco no Submundo equivale a se deslocar por 3 blocos na Superfície. Portanto, ao construir um portal no Submundo e sair por ele, você estará 3 vezes mais longe de seu ponto de entrada.{*B*}{*B*} -São necessários no mínimo 10 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. - + + Iniciar o jogo - - {*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. + + Sair do Jogo - - {*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. Esta opção 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 alterar essas 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 de dentro do jogo.{*B*}{*B*} - - {*T2*}TNT Explode{*ETW*}{*B*} - Quando habilitado, a TNT explodirá quando detonada. Esta opção também pode ser mudada de dentro do jogo.{*B*}{*B*} - - {*T2*}Privilégios do Host{*ETW*}{*B*} - Quando ativado, o host pode alternar o voo, desativar a exaustão e ficar invisível pelo menu do jogo. {*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 e 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 o botão {*BACK_BUTTON*} 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 ativar e desativar 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á ativado. Quando esta opção estiver desabilitada, o jogador não poderá utilizar portas e interruptores.{*B*}{*B*} - - {*T2*}Pode abrir recipientes{*ETW*}{*B*} - Esta opção só está disponível quando "Confiar nos Jogadores" está ativado. Quando esta opção estiver desabilitada, o jogador não poderá abrir recipientes, tais como baús.{*B*}{*B*} - - {*T2*}Pode Atacar Jogadores{*ETW*}{*B*} - Esta opção só está disponível quando "Confiar nos Jogadores" está ativado. 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á ativado. Quando esta 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á ativada, o jogador pode alterar privilégios para outros jogadores (exceto o host) se a opção "Confiar nos Jogadores" estiver desativada, expulsar jogadores, além de poder ativar e desativar as opções Fogo Espalha e TNT Explode.{*B*}{*B*} - - {*T2*}Expulsar Jogador{*ETW*}{*B*} - {*KICK_PLAYER_DESCRIPTION*}{*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ê poderá 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*}Desativar 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*}Pode Teleportar{*ETW*}{*B*} - Isso permite ao jogador mover jogadores ou ele mesmo até o local de outros jogadores no mundo. - + + Salvar Jogo - - Próxima Página + + Sair sem salvar - - Página Anterior + + Pressione START p/ entrar - - Noções Básicas + + Oba! Você ganhou uma imagem do jogador com o Steve do Minecraft! - - HUD + + Oba! Você ganhou uma imagem do jogador com um Creeper! - - Inventário + + Desbloquear jogo completo - - Baús + + 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. - - Fabricação + + Novo mundo - - Fornalha + + Brinde desbloqueado! - - Distribuidor + + Você está jogando a versão de avaliação, mas precisa da versão completa para poder salvar seu jogo. +Deseja desbloquear a versão completa do jogo agora? - - Criação de Animais + + Amigos - - Reprodução de Animais + + Minha pontuação - - Poções + + Geral - - Feitiços + + Aguarde - - Portal do Submundo + + Sem resultados - - Multijogador + + Filtro: - - Compartilhando Capturas de Tela + + Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão anterior do jogo. - - Banindo Níveis + + Conexão perdida - - Modo Criativo + + A conexão com o servidor foi perdida. Saindo para o menu principal. - - Opções de Host e Jogador + + Desconectado pelo servidor - - Comércio + + Saindo do jogo - - Bigorna + + Erro. Saindo para o menu principal. - - Final + + Falha na conexão - - {*T3*}COMO JOGAR: 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 um 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 Endermen. 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 + + Você foi expulso do jogo - - Novidades + + O host saiu do jogo. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Mudanças e acréscimos{*ETW*}{*B*}{*B*} -- Novos itens - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú de Ender, Gancho de Detonação, Maçã Dourada Enfeitiçada, Bigorna, Vaso de Flor, Paredes de Pedregulho, Paredes de Pedregulho com Musgo, Pintura Murcha, Batata, Batata Assada, Batata Envenenada, Cenoura, Cenoura Dourada, Cenoura no Palito, -Torta de Abóbora, Poção de Visão Noturna, Poção da Invisibilidade, Quartzo do Submundo, Minério de Quartzo do Submundo, Bloco de Quartzo, Degrau de Quartzo, Escada de Quartzo, Bloco Esculpido de Quartzo, Bloco de Pilar de Quartzo, Livro Encantado, Carpete.{*B*} -- Novas receitas para Arenito Suave e Arenito Esculpido.{*B*} -- Novas multidões - Zumbis Aldeões.{*B*} -- Novos recursos para geração de terrenos - Templos do Deserto, Aldeias do Deserto, Templos da Selva.{*B*} -- Novo comércio com aldeões.{*B*} -- Nova interface da Bigorna.{*B*} -- É possível tingir armadura de couro.{*B*} -- É possível tingir coleiras de lobo.{*B*} -- É possível controlar um porco enquanto monta nele usando uma Cenoura no Palito.{*B*} -- Conteúdo do Baú de Bônus atualizado com mais itens.{*B*} -- Mudança na posição de semiblocos e outros blocos em semiblocos.{*B*} -- Mudança na posição de escadas invertidas e degraus.{*B*} -- Novas profissões de aldeões.{*B*} -- Aldeões gerados de um ovo de criação terão uma profissão aleatória.{*B*} -- Nova posição de lenha lateral.{*B*} -- Fornalhas podem usar ferramentas de madeira como combustível.{*B*} -- Painéis de Vidro e Gelo podem ser coletados com ferramentas de feitiço de toque de seda.{*B*} -- Botões de madeira e chapas de pressão de madeira podem ser ativados com Flechas.{*B*} -- Multidões do Submundo podem ser geradas na Superfície a partir de Portais.{*B*} -- Creepers e Aranhas ficam agressivos com o último jogador a atingi-los.{*B*} -- Multidões no modo Criativo tornam-se neutras após um curto período.{*B*} -- Remover coice ao afundar.{*B*} -- Portas atacadas por zumbis exibem danos.{*B*} -- Gelo derrete no Submundo.{*B*} -- Caldeirões são cheios quando estão na chuva.{*B*} -- Pistões levam o dobro de tempo para atualizar.{*B*} -- O porco derruba a sela quando é morto (se tiver uma).{*B*} -- Alterada a cor do céu no Final.{*B*} -- Os fios podem ser posicionados (para Detonadores).{*B*} -- A chuva cai por entre as folhas.{*B*} -- Alavancas podem ser posicionadas na base dos blocos.{*B*} -- TNT causa um dano variável dependendo do ajuste de dificuldade.{*B*} -- Receita de livro alterada.{*B*} -- Barcos quebram Vitórias-régias, em vez do contrário.{*B*} -- Porcos liberam mais Costeletas de Porco.{*B*} -- Slimes geram menos Mundos Superplanos.{*B*} -- Os danos do Creeper variam de acordo com o ajuste de dificuldade, mais coice.{*B*} -- Correção para que os Endermen abram suas mandíbulas.{*B*} -- Novo teleporte de jogadores (usando o menu de jogo {*BACK_BUTTON*}).{*B*} -- Novas Opções do Host para voo, invisibilidade e invulnerabilidade para jogadores remotos.{*B*} -- Novos tutoriais para o Tutorial do Mundo com novos itens e recursos.{*B*} -- Atualizadas as posições dos Baús de Disco de Música no Tutorial do Mundo.{*B*} - + + Você não pode entrar neste jogo, pois não é amigo de nenhuma pessoa no jogo. - - {*ETB*}Bem-vindo de volta! Talvez você não tenha percebido, mas 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 vá se divertir!{*B*}{*B*} -{*T1*}Novos itens{*ETB*} - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú de Ender, Gancho de Detonação, Maçã Dourada Enfeitiçada, Bigorna, Vaso de Flor, Paredes de Pedregulho, Paredes de Pedregulho com Musgo, Pintura Murcha, Batata, Batata Assada, Batata Envenenada, Cenoura, Cenoura Dourada, Cenoura no Palito, -Torta de Abóbora, Poção de Visão Noturna, Poção da Invisibilidade, Quartzo do Submundo, Minério de Quartzo do Submundo, Bloco de Quartzo, Degrau de Quartzo, Escada de Quartzo, Bloco Esculpido de Quartzo, Bloco de Pilar de Quartzo, Livro Encantado, Carpete.{*B*}{*B*} - {*T1*}Novas multidões{*ETB*} - Zumbis aldeões.{*B*}{*B*} -{*T1*}Novos recursos{*ETB*} - Faça comércio com aldeões, conserte ou enfeitice armas e ferramentas com uma Bigorna, armazene itens em um Baú de Ender, controle um porco enquanto anda nele usando uma Cenoura no Palito!{*B*}{*B*} -{*T1*}Novos minitutoriais{*ETB*} – Aprenda a usar os novos recursos no Tutorial do Mundo!{*B*}{*B*} -{*T1*}Novos Easter Eggs{*ETB*} – Movemos todos os Discos de Música secretos no Tutorial do Mundo. Veja se consegue encontrá-los de novo!{*B*}{*B*} - + + Você não pode entrar neste jogo, pois já foi expulso antes pelo host. - - Causa mais danos que à mão. + + Você foi expulso do jogo por voar - - 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. + + A tentativa de conexão demorou muito - - Necessária para extrair blocos relacionados a pedra e minério. + + O servidor está cheio - - Usado para cortar blocos relacionados à madeira mais rápido que à mão. + + 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! - - Usada para trabalhar blocos de terra e grama para preparar para plantação. + + Temas - - Portas de madeira são ativadas quando usadas, atingidas ou com Redstone. + + Pacotes de capas - - Portas de ferro só podem ser abertas com Redstone, botões ou acionadores. + + Permite os amigos dos amigos - - NÃO USADO + + Expulsar - - NÃO USADO + + Tem certeza de que deseja expulsar este jogador do jogo? Eles não poderão entrar de novo até que você reinicie o mundo. - - NÃO USADO + + Pacotes de imagens do jogador - - NÃO USADO + + Você não pode entrar neste jogo porque ele foi limitado aos jogadores que são amigos do host. - - Dá ao usuário 1 de Armadura quando usado. + + Conteúdo oferecido para download corrompido - - Dá ao usuário 3 de Armadura quando usado. + + Este conteúdo oferecido para download está corrompido e não pode ser usado. Você deve excluí-lo e reinstalá-lo a partir do menu da Loja Minecraft. - - Dá ao usuário 2 de Armadura quando usado. + + Alguns conteúdos oferecidos para download estão corrompidos e não podem ser usados. Você deve excluí-los e reinstalá-los a partir do menu da Loja Minecraft. - - Dá ao usuário 1 de Armadura quando usado. + + Não é possível entrar no jogo - - Dá ao usuário 2 de Armadura quando usado. + + Selecionado - - Dá ao usuário 5 de Armadura quando usado. + + Capa selecionada: - - Dá ao usuário 4 de Armadura quando usado. + + Obter versão completa - - Dá ao usuário 1 de Armadura quando usado. + + Desbloquear pacote de textura - - Dá ao usuário 2 de Armadura quando usado. + + Para usar este pacote de textura no seu mundo, você precisa desbloqueá-lo. +Você deseja desbloquear agora? - - Dá ao usuário 6 de Armadura quando usado. + + Pacote de texturas para avaliação - - Dá ao usuário 5 de Armadura quando usado. + + Semente - - Dá ao usuário 2 de Armadura quando usado. + + Desbloquear pacote de capas - - Dá ao usuário 2 de Armadura quando usado. + + Para usar a capa selecionada, você precisa desbloquear este pacote de capas. +Deseja desbloquear o pacote de capas agora? - - Dá ao usuário 5 de Armadura quando usado. + + 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? - - Dá ao usuário 3 de Armadura quando usado. + + Fazer download da versão completa - - Dá ao usuário 1 de Armadura quando usado. + + 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? - - Dá ao usuário 3 de Armadura quando usado. + + Obter versão de avaliação - - Dá ao usuário 8 de Armadura quando usado. + + Pacote de textura não disponível - - Dá ao usuário 6 de Armadura quando usado. + + Desbloquear a versão completa - - Dá ao usuário 3 de Armadura quando usado. + + Fazer download da versão de avaliação - - Uma barra brilhante que pode ser usada para fabricar ferramentas desse material. Criada ao fundir minério na fornalha. + + Seu modo de jogo foi alterado - - 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. + + Quando habilitado, apenas jogadores convidados poderão entrar. - - Usada para enviar carga elétrica quando pisada por um jogador, animal ou monstro. As chapas de pressão de madeira também podem ser ativadas deixando algo cair sobre elas. + + Quando habilitado, os amigos das pessoas em sua Lista de Amigos poderão entrar no jogo. - - Usada para obter escadas compactas. + + Quando habilitado, os jogadores podem causar danos a outros jogadores. Afeta somente o modo Sobrevivência. - - Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + Normal - - Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + Superplano - - Usada para iluminar. As tochas também derretem neve e gelo. + + Quando habilitado, o jogo será um jogo online. - - Usada como material de construção; pode ser usada para fabricar muitas coisas. Pode ser fabricada com qualquer tipo de madeira. + + Quando desabilitado, os jogadores que entrarem no jogo não poderão construir nem minerar sem autorização. - - Usado como material de construção. Não sofre ação da gravidade como a areia normal. + + Quando habilitado, estruturas como Vilas e Fortalezas serão geradas no mundo. - - Usado como material de construção. + + Quando habilitado, um mundo completamente plano será gerado na Superfície e no Submundo. - - Usada para fabricar tochas, flechas, placas, escadas de mão, cercas e como cabos de ferramentas e armas. + + Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador. - - Usada para adiantar o tempo de um ponto da noite até a manhã, estando todos os jogadores no mundo nela, e mudar o ponto de criação do jogador. Suas cores são sempre as mesmas, independentemente da cor da lã. + + Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. - - Permite fabricar maior variedade de itens que a fabricação normal. + + Quando habilitado, a TNT explodirá quando ativada. - - Permite fundir minério, fazer carvão e vidro e cozinhar peixe e costeletas de porco. + + Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes. - - Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. + + Desativado - - Usada 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. + + Modo de jogo: Criativo - - Usada para escalar verticalmente. + + Sobrevivência - - 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. + + Criativo - - Mostra o texto digitado por você ou por outros jogadores. + + Renomeie seu mundo - - Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. + + Digite o novo nome para seu mundo - - 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. + + Modo de jogo: Sobrevivência - - Usada para guardar sopa de cogumelo. Você fica com a vasilha depois de comer a sopa. + + Criado em Sobrevivência - - Usado para guardar e transportar água, lava e leite. + + Renomear salvamento - - Usado para armazenar e transportar água. + + Salvando automaticamente em %d... - - Usado para armazenar e transportar lava. + + Ativado - - Usado para armazenar e transportar leite. + + Criado em Criativo - - Usado para criar fogo, detonar TNT e abrir um portal depois de construído. + + Renderizar Nuvens - - Usada para pegar peixes. + + O que deseja fazer com este jogo salvo? - - Mostra as posições do sol e da lua. + + Tamanho do HUD (tela dividida) - - Aponta para seu ponto inicial. + + Ingrediente - - Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. + + Combustível - - Permite ataques à distância usando flechas. + + Distribuidor - - Usada como munição para arcos. + + Baú - - Restaura 2,5{*ICON_SHANK_01*}. + + Feitiço - - Restaura 1{*ICON_SHANK_01*}. Pode ser usado 6 vezes. + + Fornalha - - Restaura 1{*ICON_SHANK_01*}. + + Não há ofertas de conteúdo oferecido para download desse tipo disponíveis para este título no momento. - - Restaura 1{*ICON_SHANK_01*}. + + Tem certeza de que deseja excluir este jogo salvo? - - Restaura 3{*ICON_SHANK_01*}. + + A confirmar - - Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Comê-la pode envenenar você. + + Censurado - - Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar frango cru na fornalha. + + %s entrou no jogo. - - Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. + + %s saiu do jogo. - - Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar carne crua na fornalha. + + %s foi expulso do jogo. - - Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. + + Barraca de Poções - - Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar uma costeleta de porco crua na fornalha. + + Digitar texto da placa - - Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser dado para o Ocelote comer, para torná-lo amigável. + + Digite uma linha de texto para sua placa - - Restaura 2,5{*ICON_SHANK_01*}. Criado ao cozinhar peixe cru na fornalha. + + Digitar título - - Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma maçã dourada. + + Tempo limite de avaliação - - Restaura 2{*ICON_SHANK_01*} e regenera a energia por 4 segundos. Criada com uma Maçã e Pepitas de Ouro. + + Versão completa - - Restaura 2{*ICON_SHANK_01*}. Comê-la pode envenenar você. + + Falha ao entrar no jogo, pois não há espaços restantes - - Usado na receita de bolo, como ingrediente para fazer poções. + + Digite um título para sua postagem - - Usada para enviar uma carga elétrica ao ser ligada ou desligada. Fica na posição ligada ou desligada até ser apertada novamente. + + Digite uma descrição para sua postagem - - Envia constantemente uma carga elétrica ou pode ser usada como receptor/transmissor quando conectada à lateral de um bloco. Também pode ser usada para pouca iluminação. + + Inventário - - Usado em circuitos de Redstone como repetidor, retardador e/ou diodo. + + Ingredientes - - Usado para enviar uma carga elétrica ao ser pressionado. Continua ativado por cerca de um segundo antes de desligar novamente. + + Digitar legenda - - Usado para guardar e projetar itens em ordem aleatória quando recebe uma carga de Redstone. + + Digite uma legenda para sua postagem - - Reproduz uma nota quando acionado. Acerte-o para alterar o tom da nota. Se for colocado sobre blocos diferentes, alterará o tipo de instrumento. + + Digitar descrição - - Usado para guiar carrinhos de minas. + + Tocando agora: - - Quando ativado, acelera os carrinhos de minas que passam sobre ele. Quando desativado, faz os carrinhos pararem nele. + + Tem certeza de que deseja adicionar este nível à lista de níveis banidos? +Selecionar OK também fechará este jogo. - - Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um carrinho de minas. + + Remover da Lista de Banidos - - Usado para transportar você, um animal ou um monstro sobre trilhos. + + Intervalo Salv. Autom. - - Usado para transportar mercadorias sobre trilhos. + + Nível banido - - Andará sobre trilhos e poderá empurrar outros carrinhos de minas, se for colocado carvão nele. + + 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. - - Usado para viajar pela água mais rapidamente do que nadando. + + Banir este nível? - - Coletada das ovelhas, pode ser tingida com corantes. + + Intervalo Salv. Autom.: DESL. - - Usada como material de construção e pode ser tingida com corantes. Esta receita não é recomendada porque a lã pode ser obtida facilmente das ovelhas. + + Opacidade da interface - - Usado como corante para criar lã preta. + + Preparando salvamento automático do nível - - Usado como corante para criar lã verde. + + Tamanho do HUD - - Usado como corante para criar lã marrom, como ingrediente para biscoitos ou para criar cápsulas de cacau. + + Min. - - Usado como corante para criar lã prateada. + + Não é possível colocar aqui! - - Usado como corante para criar lã amarela. + + Não é permitido colocar lava perto do ponto de criação do nível devido à possibilidade de morte imediata dos jogadores criados. - - Usada como corante para criar lã vermelha. + + Capas favoritas - - Usado para fazer brotar instantaneamente colheitas, árvores, grama alta, cogumelos enormes e flores. Pode ser usado em receitas de corantes. + + Jogo de %s - - Usado como corante para criar lã rosa. + + Jogo com host desconhecido - - Usado como corante para criar lã laranja. + + Convidado saiu - - Usado como corante para criar lã verde-lima. + + Redefinir Configurações - - Usado como corante para criar lã cinza. + + Tem certeza de que deseja redefinir suas configurações para os valores padrão? - - Usado como corante para criar lã cinzenta. (Observação: este corante também pode ser criado combinando corante cinza com farelo de osso, permitindo criar 4 corantes cinzentos com cada saco de tinta, em vez de três.) + + Erro de carregamento - - Usado como corante para criar lã azul-clara. + + Um jogador convidado saiu, fazendo todos os jogadores convidados serem removidos do jogo. - - Usado como corante para criar lã ciano. + + Falha ao criar jogo - - Usado como corante para criar lã roxa. + + Seleção automática - - Usado como corante para criar lã magenta. + + Nenhum pacote: Capas padrão - - Usado como corante para criar lã azul. + + Entrar - - Toca discos de música. + + Você não está conectado. Para jogar este jogo, você deve estar conectado. Deseja conectar agora? - - Usado para criar ferramentas, armas ou armaduras muito fortes. + + Multijogador não é permitido - - Usada para iluminar mais que tochas. Derrete neve/gelo e pode ser usada embaixo d'água. + + Beber - - Usado para criar livros e mapas. + + + Nesta área foi estabelecida uma fazenda. Se você a cultivar, terá uma fonte renovável de comida e outros itens. + - - Pode ser usado para criar Estantes ou enfeitiçado para fazer Livros Encantados. + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre fazendas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar as fazendas. + - - Permite a criação de feitiços mais poderosos quando colocada perto da Mesa de Feitiços. - - - Usada como decoração. + + 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. - - Pode ser extraído com uma picareta de ferro ou de material melhor e depois fundido na fornalha para produzir barras de ouro. + + Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. - - Pode ser extraído com uma picareta de pedra ou de material melhor e depois fundido na fornalha para produzir barras de ferro. + + Vá até o lado oposto deste buraco para continuar. - - Pode ser extraído com uma picareta para coletar carvão. + + Você já concluiu o tutorial do modo Criativo. - - Pode ser extraído com uma picareta de pedra ou de material melhor para coletar lápis-azul. + + 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. - - Pode ser extraído com uma picareta de ferro ou de material melhor para coletar diamantes. + + 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*} - - Pode ser extraído com uma picareta de ferro ou de material melhor para coletar pó de redstone. + + 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*} - - Pode ser extraída com uma picareta para coletar pedregulhos. + + 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*} - - Coletada com uma pá. Pode ser usada para construção. + + O trigo passa por várias etapas enquanto está crescendo, e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} - - Pode ser plantada e quando crescer será uma árvore. + + 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. - - Não pode ser quebrada. + + 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*} - - Ateia fogo em qualquer coisa que a toca. Pode ser coletada em um balde. + + 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. - - 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. + + + 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. + - - Coletado com uma pá. Pode produzir sílex quando cavado. Sofrerá ação da gravidade se não houver outra peça sob ele. + + + Nesta área há um Portal para o Submundo! + - - Cortada com um machado. Pode ser usada para fabricar tábuas ou como combustível. + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Portais e o Submundo.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como funcionam os Portais e o Submundo. + - - Criado na fornalha ao fundir areia. Pode ser usado para construção, mas quebrará se tentar extraí-lo. + + + 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*} + - - Extraído de pedra usando uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. + + + Repetidores de redstone podem ser usados para ampliar a distância que a energia é transportada ou colocar um atraso no circuito. + {*ICON*}356{*/ICON*} + - - Argila cozida na fornalha. + + + 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*} + - - Pode ser cozida na fornalha para fazer tijolos. + + + 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. + - - Quando quebrada, derruba bolas de argila que podem ser cozidas para fazer tijolos na fornalha. + + + 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. + - - Um modo compacto de armazenar bolas de neve. + + + Agora você está no Modo Criativo. + - - Pode ser cavada com uma pá para criar bolas de neve. + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre o Modo Criativo.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o Modo Criativo. + - - Pode produzir sementes de trigo quando quebrada. + + + 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. + - - Pode ser usada para fabricar corante. + + + 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. + - - Pode ser combinado com uma vasilha para fabricar sopa. + + + 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. + - - Só pode ser extraída com uma picareta de diamante. É produzida pelo encontro de água e lava parada e é usada para construir um portal. + + Agora você completou o tutorial da fazenda. - - Gera monstros no mundo. + + Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar um machado para cortar troncos de árvores. - - É colocado no chão para transportar uma carga elétrica. Quando usado com uma poção, ele aumentará a duração de seu efeito. + + 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. - - Quando alcançarem a fase de pleno crescimento, as colheitas poderão ser coletadas para obter trigo. + + Algumas ferramentas são melhores para atacar inimigos. Pense em usar uma espada para atacar. - - Solo que foi preparado para o plantio de sementes. + + Os Golens de Ferro também aparecem naturalmente para proteger vilas e o atacarão se você atacar algum aldeão. - - Pode ser cozido em uma fornalha para fabricar corante verde. + + Você só poderá sair desta área quando concluir o tutorial. - - Pode ser usada para fabricar açúcar. + + Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma pá para extrair materiais macios como terra ou areia. - - 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. + + 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... - - Queima para sempre se for acesa. + + 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. - - Torna mais lento o movimento de quem anda sobre ela. + + 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. - - Pare no portal para atravessar entre a Superfície e o Submundo. + + 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. - - Usado como combustível na fornalha ou para fabricar uma tocha. + + 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. - - Coletado ao matar uma aranha, pode fabricar um Arco ou uma Vara de Pescar, ou pode ser colocado no chão para criar um Detonador. + + Mantenha{*CONTROLLER_ACTION_JUMP*} pressionado para nadar. - - Coletada ao matar uma galinha e pode ser usada para fabricar uma flecha. + + 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. - - Coletado ao matar um Creeper, pode fabricar TNT ou ser usado como ingrediente para fazer poções. + + Os Golens de Ferro são criados com quatro Blocos de Ferro no padrão mostrado, com uma abóbora sobre o bloco do meio. Os Golens de Ferro atacam seus inimigos. - - Pode ser plantada no campo para colheita. Verifique se há luz suficiente para as sementes crescerem! + + Dê Trigo para uma vaca, vacogumelo ou ovelha, dê Cenouras para porcos, 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. - - Coletado nas colheitas e pode ser usado para fabricar alimentos. + + 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. - - Coletado ao cavar cascalho e pode ser usado para fabricar sílex e aço. + + Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos. - - Quando usada em um porco, permite que você monte nele. O porco pode ser controlado usando uma Cenoura no Palito. + + + Nesta área os animais foram cercados. Você pode criar animais para produzir filhotes deles. + - - Coletada ao cavar neve e pode ser atirada. + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a criação de animais.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre a criação de animais. + - - É coletado ao matar uma vaca e pode ser usado para fabricar uma armadura ou para fazer Livros. + + Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor". - - Coletado ao matar um Slime e usado como ingrediente para fazer poções ou para fabricar Pistões Aderentes. + + Alguns animais lhe seguirão se você estiver com comida na mão. Desta forma é mais fácil agrupar os animais para reproduzi-los.{*ICON*}296{*/ICON*} - - As galinhas soltam aleatoriamente e pode ser usado para fabricar alimentos. + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Golens.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os Golens. + - - É coletado ao extrair Glowstone e pode ser usado para fabricar blocos de Glowstone novamente ou usado para fazer poções que aumentam a potência desse efeito. + + Os Golens são criados colocando uma abóbora sobre uma pilha de blocos. - - Coletado ao matar um esqueleto. Pode ser usado para fabricar farelo de osso. Você pode alimentar um lobo com isto para domá-lo. + + Os Golens de Neve são criados com dois Blocos de Neve, um sobre o outro, e uma abóbora sobre eles. Os Golens de Neve lançam bolas de neve em seus inimigos. - - Coletado ao fazer um esqueleto matar um creeper. Pode ser tocado em uma jukebox. + + + Lobos selvagens podem ser domados oferecendo ossos a eles. Depois de domados, aparecerão Corações de Amor em volta deles. Lobos domados seguem o jogador e o defendem se não receberem ordem para sentar. + - - Apaga o fogo e ajuda as plantações a crescerem. Pode ser coletada em um balde. + + Agora você completou o tutorial de criação de animais. - - Quando quebrada, às vezes derruba uma muda que pode ser replantada para se tornar uma árvore. - - - Encontrada em calabouços, pode ser usada para construção e decoração. + + + Nesta área há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. + - - Usada para obter lã da ovelha e colher blocos de folhas. + + + 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. + - - 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. + + + Se o caldeirão ficar vazio, você pode enchê-lo com um Balde de Água. + - - Quando acionado (com um botão, alavanca, placa de pressão, tocha de redstone ou redstone), um pistão estende-se, podendo empurrar blocos. Quando se retrai, puxa o bloco de volta. + + + 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. + - - Feitos com pedra, geralmente encontrados em Fortalezas. + + +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. + - - Usadas como barreiras semelhantes às cercas. + + {*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. + - - Semelhante a uma porta, mas usado principalmente com cercas. + + + A primeira etapa para fazer uma poção é criar uma Garrafa de Água. Pegue uma Garrafa de Vidro no baú. + - - Pode ser fabricado com Fatias de Melão. + + + 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*}. + - - Blocos transparentes que podem ser usados no lugar dos blocos de vidro. + + + Use sua Poção de Resistência ao fogo em si mesmo. + - - Podem ser plantadas para cultivar abóboras. + + + Para enfeitiçar um item, primeiro coloque-o no slot de feitiços. Armas, armadura e algumas ferramentas podem ser enfeitiçadas para adicionar efeitos especiais como maior resistência a danos ou aumento do número de itens produzidos ao minerar um bloco. + - - Podem ser plantadas para cultivar melões. + + + 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. + - - Derrubada pelo Enderman quando ele morre. Quando atirada, o jogador será teleportado até a posição em que a Pérola do Ender cair e perderá um pouco de energia. + + + 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. + - - Um bloco de terra com grama crescendo sobre ela. Coletado usando uma pá. Pode ser usado para construção. + + + Agora que você está resistente ao fogo e à lava, veja se há lugares em que você consegue chegar que não conseguia antes. + - - Pode ser usada para construção e decoração. + + + Esta é a interface de feitiços, que você pode usar para adicionar feitiços a armas, à armadura e a algumas ferramentas. + - - Deixa o movimento mais lento quando atravessada. Pode ser destruída usando tosquiadeiras para coletar fios. + + {*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. + - - Cria uma Traça quando destruída. Também pode criar Traças se estiver perto de outra Traça que esteja sendo atacada. + + + Nesta área há uma Barraca de Poções, um Caldeirão e um baú cheio de itens para fazer poções. + - - Cresce ao longo do tempo quando colocada. Pode ser coletada usando tosquiadeiras. Pode ser escalada como uma escada. + + + O carvão vegetal pode ser usado como combustível e também ser combinado com uma vareta para fabricar uma tocha. + - - É escorregadio. Transforma-se em água se estiver sobre outro bloco quando destruído. Derrete se estiver muito próximo de uma fonte de luz ou se colocado no Submundo. + + + Se colocar areia na abertura do ingrediente, você poderá fazer vidro. Crie alguns blocos de vidro para usar como janelas no seu abrigo. + - - Pode ser usado como decoração. + + + Esta é a interface de poções. Você pode usar isto para criar poções com diversos efeitos diferentes. + - - Usada para fazer poções e para localizar Fortalezas. É derrubada pelas Chamas que ficam dentro ou perto das Fortalezas do Submundo. + + + 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. + - - Usada para fazer poções. É derrubada pelos Ghasts, quando eles morrem. + + + 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. + - - É derrubada pelos Homens-Porco Zumbis quando eles morrem. Os Homens-Porco Zumbis podem ser encontrados no Submundo. Usada como ingrediente para fazer poções. + + + 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. + - - Usada para fazer poções. Pode ser encontrada naturalmente nas Fortalezas do Submundo. Também pode ser plantada na Areia Movediça. + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a barraca de poções. + - - Quando usada, pode ter vários efeitos, dependendo de onde for utilizada. + + + 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 de Lançamento, que pode ser atirada para aplicar seus efeitos a uma área próxima. + - - Pode ser enchida com água e usada como o ingrediente inicial de uma poção na Barraca de Poções. + + + 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. + - - Este é um alimento venenoso e item de poção. É derrubado quando uma Aranha ou Aranha de Caverna é morta por um jogador. + + + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de poções. + - - Usado para fazer poções, especialmente para criar poções com efeito negativo. + + + 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. + - - Usado para fazer poções ou fabricado com outros itens para fazer o Olho de Ender ou o Creme de Magma. + + + 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. + - - Usado para fazer poções. + + + 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. + - - Usada para fazer Poções e Poções de Lançamento. + + + 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. + - - Pode ser cheio com água da chuva ou usando um balde de água e pode ser usado para encher Garrafas de Vidro com água. + + + 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*} + - - 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. + + + 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*} + - - Usado para fazer poções. + + + 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*} + - - Similar aos Blocos de Grama, mas muito bom para cultivar cogumelos. + + + Com o barco é possível viajar mais rapidamente sobre a água. Você pode navegá-lo usando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + - - Flutua na água e permite andar em cima. + + + Agora você está usando uma vara de pescar. Pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*FishingRodIcon*} + - - Usado para construir Fortalezas do Submundo. É imune às bolas de fogo do Ghast. + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a pesca.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber pescar. + - - Usada em Fortalezas do Submundo. + + + Esta é uma cama. Pressione{*CONTROLLER_ACTION_USE*} ao apontar para ela à noite para dormir a noite toda e despertar de manhã.{*ICON*}355{*/ICON*} + - - Encontrado em Fortalezas do Submundo; derruba Verrugas do Submundo quando quebrado. + + + Nesta área, há alguns circuitos simples de redstone e pistão, além de um baú com mais itens para ampliar esses circuitos. + - - Desta forma os jogadores podem enfeitiçar Espadas, Picaretas, Machados, Pás, Arcos e Armadura, usando os Pontos de Experiência do jogador. + + + {*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. + - - Isto pode ser ativado usando doze Olhos de Ender, e o jogador poderá viajar até a dimensão Final. + + + 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. + - - Usado para formar um Portal Final. + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre as camas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar as camas. + - - Um tipo de bloco encontrado no Final. Ele tem resistência muito alta a explosões, portanto, é bem útil para construções. + + + 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*} + - - Este bloco é criado ao derrotar o Dragão no Final. + + + Se houver outros jogadores no jogo, todos deverão estar em uma cama ao mesmo tempo para poderem dormir. + {*ICON*}355{*/ICON*} + - - Quando atirada, derruba Esferas de Experiência que aumentam seus pontos de experiência quando coletadas. + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre os barcos.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os barcos. + - - Útil para pôr fogo nas coisas, ou para começar incêndios quando disparada de um Distribuidor. + + + 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 uma maior resistência a danos. + - - É semelhante a uma vitrine e exibirá o item ou bloco colocado nele. + + + 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. + - - Quando lançado pode gerar uma criatura do tipo indicado. + + + 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. + - - Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + 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. + - - Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + + + Nesta área há uma Bancada de Feitiços e alguns outros itens para você aprender mais sobre feitiços. + - - Criado pela fusão de Pedra Inflamável em uma fornalha. Pode ser transformado em Blocos do Submundo. + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre feitiços.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os feitiços. + - - Quando carregada, ela emite luz. + + + 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. + - - Pode ser cultivado para coletar grãos de cacau. + + + 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*} + - - As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. + + + 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*} + - - Lula + + + Agora você está andando de barco. Aponte o cursor para o barco e pressione{*CONTROLLER_ACTION_USE*} para sair.{*BoatIcon*} + - - Solta sacos de tinta quando morta. + + + 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. + - - Vaca + + + Agora você está andando no carrinho de minas. Para sair do carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + - - Solta couro quando morta. Pode ser ordenhada com um balde. + + {*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. + - - Ovelha + + Se você mover o ponteiro para fora da interface ao segurar um item, poderá derrubá-lo. - - Solta lã quando tosquiada (se já não tiver sido tosquiada). Pode ser tingida para produzir lã de cores diferentes. + + Ler - - Galinha + + Pendurar - - Solta penas quando morta e põe ovos aleatoriamente. + + Atirar - - Porco + + Abrir - - Solta costeletas quando morto. Pode ser montado usando uma sela. + + Alterar Tom - - Lobo + + Detonar - - 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ê. + + Plantar - - Creeper + + Desbloquear jogo completo - - Explode se você chegar muito perto! + + Excluir Salvamento - - Esqueleto + + Excluir - - Dispara flechas em você. Deixa cair flechas quando morto. + + Arar - - Aranha + + Colher - - Ataca quando você chega perto. Escala paredes. Solta fio quando morta. + + Continuar - - Zumbi + + Nadar - - Ataca quando você chega perto. + + Atingir - - Homem-porco zumbi + + Ordenhar - - Inicialmente dócil, mas ataca em grupos se você ataca um deles. + + Coletar - - Ghast + + Esvaziar - - Atira bolas de fogo em você, que explodem ao contato. + + Selar - - Slime + + Colocar - - Divide-se em slimes menores quando atingido. + + Comer - - Enderman + + Montar - - Atacará se você olhar para ele. Também pode mover blocos. + + Velejar - - Traça + + Cultivar - - Atrai as Traças próximas quando atacada. Esconde-se em blocos de pedra. + + Dormir - - Aranha de Caverna + + Acordar - - Tem uma mordida venenosa. + + Tocar - - Vacogumelo + + Opções - - Faz sopa de cogumelo quando usada com uma vasilha. Derruba cogumelos e torna-se uma vaca normal depois de tosquiada. + + Mover Armadura - - Golem de Neve + + Mover Arma - - 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. + + Equipar - - Dragão Ender + + Mover Ingrediente - - Este é um grande dragão negro encontrado no Final. + + Mover Combustível - - Chama + + Ferramenta Mover - - Estes são inimigos encontrados no Submundo, geralmente dentro das Fortalezas do Submundo. Derrubam Varas de Chamas quando são mortos. + + Puxar - - Cubo de Magma + + Página Acima - - Eles são encontrados no Submundo. Similares aos Slimes, dividem-se em versões menores quando são mortos. + + Página Abaixo - - Aldeão + + Modo do Amor - - Ocelote + + Lançar - - 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. + + Privilégios - - Golem de Ferro + + Bloquear - - Aparece em vilas para protegê-las e podem ser criados usando blocos de ferro e abóboras. + + Criativo - - Explosives Animator + + Banir Nível - - Concept Artist + + Selecionar Capa - - Number Crunching and Statistics + + Acender - - Bully Coordinator + + Convidar Amigos - - Original Design and Code by + + Aceitar - - Project Manager/Producer + + Tosquiar - - Rest of Mojang Office + + Navegar - - Lead Game Programmer Minecraft PC + + Reinstalar - - Ninja Coder + + Opções Salvamento - - CEO + + Executar Comando - - White Collar Worker + + Instalar Versão Completa - - Customer Support + + Instalar Versão de Avaliação - - Office DJ + + Instalar - - Designer/Programmer Minecraft - Pocket Edition + + Ejetar - - Developer + + Lista de Jogos Online - - Chief Architect + + Jogos de Grupo - - Art Developer + + Todos os Jogos - - Game Crafter + + Sair - - Director of Fun + + Cancelar - - Music and Sounds + + Cancelar Entrada - - Programming + + Alterar Grupo - - Art + + Fabricação - - QA + + Criar - - Executive Producer + + Pegar/Colocar - - Lead Producer + + Mostrar Inventário - - Producer + + Mostrar Descrição - - Test Lead + + Mostrar Ingredientes - - Lead Tester + + Voltar - - Design Team + + Lembrete: - - Development Team + + - - Release Management + + Novos recursos foram adicionados ao jogo na versão mais recente, incluindo novas áreas no mundo do tutorial. - - Director, XBLA Publishing + + 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. - - Business Development + + + 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! + - - Portfolio Director + + {*EXIT_PICTURE*} Quando estiver pronto para explorar mais, há uma escadaria nesta área perto do abrigo do mineiro que leva a um pequeno castelo. - - Product Manager + + {*B*}Pressione{*CONTROLLER_VK_A*} para jogar no tutorial normalmente.{*B*} + Pressione{*CONTROLLER_VK_B*} para pular o tutorial principal. - - Marketing + + + {*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. + - - Community Manager + + Selecionar - - Europe Localization Team + + Usar - - Redmond Localization Team + + Nesta área, você encontrará áreas configuradas para ajudá-lo a aprender sobre pesca, barcos, pistões e redstone. - - Asia Localization Team + + Fora desta área, você encontrará exemplos de construções, cultivo, carrinhos de mineração e trilhos, feitiços, poções, comércio, forjamento de metais e muito mais! - - User Research Team + + + Sua barra de alimentos chegou a um nível em que não há mais cura. + - - MGS Central Teams + + Pegar - - Milestone Acceptance Tester + + Próximo - - Special Thanks + + Anterior - - Test Manager + + Expulsar - - Senior Test Lead + + Enviar Pedido de Amizade - - SDET + + Página Abaixo - - Project STE + + Página Acima - - Additional STE + + Tingir - - Test Associates + + Curar - - Jon Kågström + + Sentar - - Tobias Möllstam + + Seguir-me - - Risë Lugo + + Extrair - - Espada de Madeira + + Alimentar - - Espada de Pedra + + Domar - - Espada de Ferro + + Alterar Filtro - - Espada de Diamante + + Colocar tudo - - Espada de Ouro + + Colocar um - - Pá de Madeira + + Soltar - - Pá de Pedra + + Pegar tudo - - Pá de Ferro + + Pegar metade - - Pá de Diamante + + Colocar - - Pá de Ouro + + Soltar tudo - - Picareta de Madeira + + Limpar Seleção Rápida - - Picareta de Pedra + + O que é isto? - - Picareta de Ferro + + Compartilhar no Facebook - - Picareta de Diamante + + Soltar um - - Picareta de Ouro + + Trocar - - Machado de Madeira + + Mover rápido - - Machado de Pedra + + Pacotes de capas - - Machado de Ferro + + Painel de Cristal Tingido de Vermelho - - Machado de Diamante + + Painel de Cristal Tingido de Verde - - Machado de Ouro + + Painel de Cristal Tingido de Marrom - - Enxada de Madeira + + Cristal Tingido de Branco - - Enxada de Pedra + + Painel de Cristal Tingido - - Enxada de Ferro + + Painel de Cristal Tingido de Preto - - Enxada de Diamante + + Painel de Cristal Tingido de Azul - - Enxada de Ouro + + Painel de Cristal Tingido de Cinza - - Porta de Madeira + + Painel de Cristal Tingido de Rosa - - Porta de Ferro + + Painel de Cristal Tingido de Verde-limão - - Capacete de Malha + + Painel de Cristal Tingido de Roxo - - Peitoral de Malha + + Painel de Cristal Tingido de Cíano - - Perneiras de Malha + + Painel de Cristal Tingido de Cinza-claro - - Botas de Malha + + Cristal Tingido de Laranja - - Chapéu de Couro + + Cristal Tingido de Azul - - Capacete de Ferro + + Cristal Tingido de Roxo - - Capacete de Diamante + + Cristal Tingido de Cíano - - Capacete de Ouro + + Cristal Tingido de Vermelho - - Túnica de Couro + + Cristal Tingido de Verde - - Peitoral de Ferro + + Cristal Tingido de Marrom - - Peitoral de Diamante + + Cristal Tingido de Cinza-claro - - Peitoral de Ouro + + Cristal Tingido de Amarelo - - Calças de Couro + + Cristal Tingido de Azul-claro - - Perneiras de Ferro + + Cristal Tingido de Magenta - - Perneiras de Diamante + + Cristal Tingido de Cinza - - Perneiras de Ouro + + Cristal Tingido de Rosa - - Botas de Couro + + Cristal Tingido de Verde-limão - - Botas de Ferro + + Painel de Cristal Tingido de Amarelo - - Botas de Diamante + + Cinza-claro - - Botas de Ouro + + Cinza - - Barra de Ferro + + Rosa - - Barra de Ouro + + Azul - - Balde + + Roxo - - Balde de Água + + Cíano - - Balde de Lava + + Verde-limão - - Sílex e Aço + + Laranja - - Maçã + + Branco - - Arco + + Personalizado - - Flecha + + Amarelo - - Carvão + + Azul-claro - - Carvão Vegetal + + Magenta - - Diamante + + Marrom - - Vareta + + Painel de Cristal Tingido de Branco - - Vasilha + + Bola pequena - - Sopa de Cogumelo + + Bola grande - - Fio + + Painel de Cristal Tingido de Azul-claro - - Pena + + Painel de Cristal Tingido de Magenta - - Pólvora + + Painel de Cristal Tingido de Laranja - - Sementes de Trigo + + Formato de estrela - - Trigo + + Preto - - Pão + + Vermelho - - Sílex + + Verde - - Costeleta de Porco Crua + + Formato de Creeper - - Costeleta de Porco Cozida + + Explosão - - Pintura + + Formato desconhecido - - Maçã de Ouro + + Cristal Tingido de Preto - - Placa + + Armadura de Ferro de Cavalo - - Carrinho de Minas + + Armadura de Ouro de Cavalo - - Sela + + Armadura de Diamante de Cavalo - - Redstone + + Comparador de Redstone - - Bola de Neve + + Carrinho de minas com TNT - - Barco + + Carrinho de Minas com Funil - - Couro + + Laço - - Balde de Leite + + Sinalizador - - Tijolo + + Baú Confinado - - Argila + + Chapa de Pressão Medida (leve) - - Cana-de-açúcar + + Crachá - - Papel + + Tábuas de madeira (qualquer tipo) - - Livro + + Bloco de Comandos - - Slimeball + + Estrela de Fogo de Artifício - - Carrinho com Baú + + Esses animais podem ser domados e depois cavalgados. Pode-se conectar um baú a eles. - - Carrinho com Fornalha + + Mula - - Ovo + + Nascida quando um Cavalo e um Burro cruzam. Esses animais podem ser domados, cavalgados e carregar baús. - - Bússola + + Cavalo - - Vara de Pescar + + Esses animais podem ser domados e depois cavalgados. - - Relógio + + Burro - - Pó de Glowstone + + Cavalo Zumbi - - Peixe Cru + + Mapa vazio - - Peixe Cozido + + Estrela do Submundo - - Corante em Pó + + Foguete de Fogo de Artifício - - Saco de Tinta + + Cavalo do esqueleto - - Rosa Vermelha + + Wither - - Verde Cacto + + São fabricados com Caveiras murchas e Areia Movediça. Disparam caveiras explosivas em você. - - Grãos de Cacau + + Chapa de Pressão Medida (pesado) - - Lápis-azul + + Argila Tingida de Cinza-claro - - Corante Roxo + + Argila Tingida de Cinza - - Corante Ciano + + Argila Tingida de Rosa - - Corante Cinzento + + Argila Tingida de Azul - - Corante Cinza + + Argila Tingida de Roxo - - Corante Rosa + + Argila Tingida de Cíano - - Corante Verde-lima + + Argila Tingida de Verde-limão - - Amarelo-narciso + + Argila Tingida de Laranja - - Corante Azul-claro + + Argila Tingida de Branco - - Corante Magenta + + Cristal Tingido - - Corante Laranja + + Argila Tingida de Amarelo - - Farelo de Osso + + Argila Tingida de Azul-claro - - Osso + + Argila Tingida de Magenta - - Açúcar + + Argila Tingida de Marrom - - Bolo + + Funil - - Cama + + Trilho Ativador - - Repetidor de Redstone + + Liberador - - Biscoito + + Comparador de Redstone - - Mapa + + Sensor de Luz do Dia - - Disco - "13" + + Bloco de Redstone - - Disco de Música - "cat" + + Argila Tingida - - Disco de Música - "blocks" + + Argila Tingida de Preto - - Disco de Música - "chirp" + + Argila Tingida de Vermelho - - Disco de Música - "far" + + Argila Tingida de Verde - - Disco de Música - "mall" + + Fardo de Feno - - Disco de Música - "mellohi" + + Argila Endurecida - - Disco de Música - "stal" + + Bloco de Carvão - - Disco de Música - "strad" + + Transição para - - Disco de Música - "ward" + + Ao ser desativado, impede que monstros e animais alterem blocos (por exemplo, explosões de Creeper não destroem blocos e Ovelhas não removem Grama) ou peguem itens. - - Disco - "11" + + Quando ativado, os jogadores mantêm seu inventário depois de morrer. - - Disco de Música - "where are we now" + + Ao ser desativado, as multidões não são criadas naturalmente. - - Tosquiadeira + + Modo de jogo: Aventura - - Sementes de Abóbora + + Aventura - - Sementes de Melão + + Coloque uma semente para gerar o mesmo terreno novamente. Deixar em branco para mundo aleatório. - - Frango Cru + + Ao ser desativado, monstros e animais não derrubam itens (por exemplo, Creepers não derrubam pólvora). - - Frango Cozido + + {*PLAYER*} caiu de uma escada - - Carne Crua + + {*PLAYER*} caiu de umas vinhas - - Bife + + {*PLAYER*} caiu fora d'água - - Carne Podre + + Ao ser desativado, os blocos não derrubam itens quando são destruídos (por exemplo, blocos de Pedra não derrubam Pedregulho). - - Pérola do Ender + + Ao ser desativado, os jogadores não regeneram a energia naturalmente. - - Fatia de Melão + + Ao ser desativado, a hora do dia não muda. - - Vara de Chamas + + Carrinho de Minas - - Lágrima de Ghast + + Laçar - - Pepita de Ouro + + Soltar - - Verruga do Submundo + + Conectar - - {*prefix*}Poção {*postfix*} {*splash*} + + Descer - - Garrafa de Vidro + + Conectar baú - - Garrafa de Água + + Lançar - - Olho de Aranha + + Dar nome - - Olho Aranha Ferm. + + Sinalizador - - Pó de Chamas + + Poder principal - - Creme de Magma + + Poder secundário - - Barraca de Poções + + Cavalo - - Caldeirão + + Liberador - - Olho de Ender + + Funil - - Melão Cintilante + + {*PLAYER*} caiu de um lugar alto - - Garrafa de Feitiços + + Não é possível usar o Ovo de Criação no momento. O número máximo de Morcegos em um mundo foi alcançado. - - Carga de Fogo + + Este animal não pode entrar em Modo do Amor. O número máximo de cavalos reprodutores foi alcançado. - - Carga Fogo: Carv. Veg. + + Opções de Jogo - - Carga Fogo: Carvão + + {*SOURCE*} lançou bolas de fogo em {*PLAYER*} usando {*ITEM*} - - Quadro de Item + + {*PLAYER*} levou um murro de {*SOURCE*} usando {*ITEM*} - - Criar {*CREATURE*} + + {*SOURCE*} matou {*PLAYER*} usando {*ITEM*} - - Bloco do Submundo + + Vandalismo de multidão - - Caveira + + Bloco derruba itens - - Caveira do esqueleto + + Regeneração Natural - - Caveira do esqueleto murcho + + Ciclo da Luz do Dia - - Cabeça de zumbi + + Manter inventário - - Cabeça + + Criação de multidão - - Cabeça de %s + + Pilhagem de multidão - - Cabeça de creeper + + {*PLAYER*} levou um tiro de {*SOURCE*} usando {*ITEM*} - - Pedra + + {*PLAYER*} caiu muito longe e sofreu finalização por {*SOURCE*} - - Bloco de Grama + + {*PLAYER*} caiu muito longe e foi finalizado por {*SOURCE*} usando {*ITEM*} - - Terra + + {*PLAYER*} caminhou até o fogo ao lutar com {*SOURCE*} - - Pedregulho + + {*PLAYER*} sofreu feitiço para cair por {*SOURCE*} - - Tábuas de Carvalho + + {*PLAYER*} sofreu feitiço para cair por {*SOURCE*} - - Tábuas de Abeto + + {*PLAYER*} sofreu feitiço para cair por {*SOURCE*} usando {*ITEM*} - - Tábuas de Bétula + + {*PLAYER*} ardeu em chamas durante a luta {*SOURCE*} - - Tábuas da Selva + + {*PLAYER*} sofreu uma explosão por {*SOURCE*} - - Muda + + {*PLAYER*} sofreu decomposição - - Muda de Carvalho + + {*SOURCE*} matou {*PLAYER*} usando {*ITEM*} - - Muda de Abeto + + {*PLAYER*} tentou nadar na lava para escapar de {*SOURCE*} - - Muda de Bétula + + {*PLAYER*} se afogou tentando escapar de {*SOURCE*} - - Broto de árvore da floresta + + {*PLAYER*} pisou em um cacto enquanto tentava fugir de {*SOURCE*} - - Pedra Indestrutível + + Montar - - Água + + + Para guiar um cavalo, você deve equipá-lo com uma sela, que pode ser comprada de aldeões ou encontrada em baús escondidos pelo mundo. + - - Lava + + + Burros e Mulas domados podem receber alforjes ao conectar um baú a eles. Esses alforjes podem ser acessados quando você estiver cavalgando ou se esgueirando. + - - Areia + + + Cavalos e Burros (mas não Mulas) podem dar cria como outros animais, usando Maçãs de Ouro ou Cenouras Douradas. Potros crescem e viram cavalos adultos com o tempo, e alimentá-los com trigo ou feno acelera esse processo. + - - Arenito + + + Cavalos, Burros e Mulas devem ser domados antes de serem usados. Um cavalo é domado quando você tenta cavalgá-lo e consegue ficar montado enquanto ele tenta derrubar você. + - - Cascalho + + + Depois de domados, aparecerão Corações de Amor em volta deles e eles não vão mais tentar derrubar ninguém. + - - Minério de Ouro + + + Tente cavalgar o cavalo agora. Use {*CONTROLLER_ACTION_USE*} sem itens ou ferramentas na mão para montar em cima dele. + - - Minério de Ferro + + + Você pode tentar domar os Cavalos e os Burros aqui, e há Selas, Armaduras de Cavalo e outros itens úteis para eles nos baús também. + - - Minério de Carvão + + + Um Sinalizador numa pirâmide com pelo menos 4 fileiras também oferece a opção de Regeneração como poder secundário ou um poder principal mais forte. + - - Madeira + + + Para configurar os poderes do seu Sinalizador você deve sacrificar uma Barra de Esmeralda, Diamante, Ouro ou Ferro no espaço de pagamento. Assim que estiverem configurados, os poderes vão emanar do Sinalizador indefinidamente. + - - Madeira de Carvalho + + No topo dessa pirâmide há um Sinalizador desativado. - - Madeira de Abeto + + + Essa é a interface do Sinalizador, que você pode usar para selecionar poderes que o Sinalizador concede. + - - Madeira de Bétula + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione {*CONTROLLER_VK_B*} se você já souber como usar a interface do Sinalizador. + - - Madeira de floresta + + + No menu do Sinalizador você pode selecionar 1 poder principal para ele. Quanto mais fileiras tiver sua pirâmide, mais poderes você terá para escolher. + - - Carvalho + + + Todos os Cavalos, Burros e Mulas adultos podem ser cavalgados. No entanto, apenas Cavalos podem receber armaduras e apenas as Mulas e os Burros podem ser equipados com alforjes para transportar itens. + - - Abeto + + + Esta é a interface do inventário do cavalo. + - - Bétula + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione {*CONTROLLER_VK_B*} se você já souber como usar o inventário do cavalo. + - - Folhas + + + O inventário do cavalo possibilita transferir ou equipar itens no seu Cavalo, Burro ou Mula. + - - Folhas de Carvalho + + Brilho - - Folhas de Abeto + + Trilho - - Folhas de Bétula + + Duração do voo: - - Folhas de floresta + + + Sele seu cavalo colocando uma Sela no espaço de sela. Cavalos podem receber armadura se você colocar uma Armadura de Cavalo no espaço de armadura. + - - Esponja + + Você encontrou uma Mula. - - Vidro + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais Cavalos, Burros e Mulas. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já souber sobre Cavalos, Burros e Mulas. + - - + + + Cavalos e Burros são em geral encontrados em planícies abertas. Mulas nascem do cruzamento de um Burro com um Cavalo, mas são inférteis. + - - Lã Preta + + + Também é possível transferir itens do seu inventário para os alforjes amarrados aos Burros e às Mulas nesse menu. + - - Lã Vermelha + + Você encontrou um Cavalo. - - Lã Verde + + Você encontrou um Burro. - - Lã Marrom + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre os Sinalizadores. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já souber sobre Sinalizadores. + - - Lã Azul + + + Estrelas de Fogo de Artifício podem ser fabricadas colocando-se Pólvora e Corante na grade de fabricação. + - - Lã Roxa + + + O Corante definirá a cor da explosão da Estrela de Fogo de Artifício. + - - Lã Ciano + + + A forma da Estrela de Fogo de Artifício é definida com a adição de Carga de Fogo, Pepita de Ouro, Pena ou Cabeça de Multidão. + - - Lã Cinzenta + + + Outra opção é colocar várias Estrelas de Fogo de Artifício na grade de fabricação e adicioná-las ao Fogo de Artifício. + - - Lã Cinza + + + O preenchimento de mais espaços da grade de fabricação com Pólvora aumentará a altura na qual as Estrelas de Fogo de Artifício explodirão. + - - Lã Rosa + + + Com isso, você pode remover o Fogo de Artifício do espaço de saída quando quiser fabricá-lo. + - - Lã Verde-lima + + + É possível adicionar um rastro ou um brilho usando Diamantes ou Pó de Glowstone. + - - Lã Amarela + + + Fogos de Artifício são itens decorativos que podem ser lançados manualmente ou por Distribuidores. Eles são fabricados usando Papel, Pólvora e uma variedade opcional de Estrelas de Fogo de Artifício. + - - Lã Azul-clara + + + As cores, o desaparecimento, a forma, o tamanho e os efeitos (como rastros e brilhos) das Estrelas de Fogo de Artifício podem ser personalizados com a adição de ingredientes adicionais durante a fabricação. + - - Lã Magenta + + + Tente fabricar um Fogo de Artifício na Bancada usando uma variedade de ingredientes dos baús. + - - Lã Laranja + + + Após fabricar uma Estrela de Fogo de Artifício, você pode definir a cor de desaparecimento da Estrela de Fogo de Artifício fabricando-a com Corante. + - - Lã Branca + + + Dentro dos baús aqui há vários itens usados na criação de FOGOS DE ARTIFÍCIO! + - - Flor + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre os Fogos de Artifício. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já souber sobre os Fogos de Artifício. + - - Rosa + + + Para fabricar um Fogo de Artifício, coloque Pólvora e Papel na grade de fabricação 3x3 que é exibida sobre seu inventário. + - - Cogumelo + + Essa sala contém Funis - - Bloco de Ouro + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre os Funis. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já souber sobre os Funis. + - - Um modo compacto de armazenar Ouro. + + + Funis são usados para inserir ou remover itens de recipientes e para pegar automaticamente os itens jogados neles. + - - Bloco de Ferro + + + Sinalizadores ativos projetam um raio brilhante de luz no céu e concedem poderes aos jogadores próximos. Eles são fabricados com Cristal, Obsidiana e Estrelas do Submundo, que podem ser obtidas ao derrotar o Wither. + - - Um modo compacto de armazenar Ferro. + + + Os Sinalizadores devem ser posicionados ao sol durante o dia. Sinalizadores devem ser posicionados em Pirâmides de Ferro, Ouro, Esmeralda ou Diamante. No entanto, a escolha do material não exerce efeito sobre o poder do Sinalizador. + - - Degrau de Pedra + + + Tente usar o Sinalizador para configurar o poder concedido, é possível usar as Barras de Ferro fornecidas como o pagamento necessário. + - - Degrau de Pedra + + + Eles podem afetar Barracas de Poções, Baús, Distribuidores, Liberadores, Carrinhos com Baús, Carrinhos com Funis, bem como outros Funis. + - - Degrau de Arenito + + + Há vários estilos de Funis para você ver e experimentar nessa sala. + - - Degrau de Carvalho + + + Esta é a interface de Fogo de Artifício, que você pode usar para fabricar Fogos de Artifício e Estrelas de Fogo de Artifício. + - - Degrau de Pedregulho + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione {*CONTROLLER_VK_B*} se você já souber como usar a interface do Fogo de Artifício. + - - Degrau de Tijolo + + + Os Funis tentam sugar itens continuamente de um recipiente apropriado posicionado acima deles. Eles também vão tentar inserir itens armazenados dentro um recipiente externo. + - - Degrau Bloc.Pedra + + + No entanto, se um Funil for acionado por Redstone ele vai ficar inativo e vai parar de sugar e inserir itens. + - - Degrau de Carvalho + + + Um Funil aponta para a direção que tentar emitir itens. Para apontar um Funil para um bloco em particular, posicione o Funil contra o bloco quando estiver se esgueirando. + - - Degrau de Abeto + + Esses inimigos podem ser encontrados em pântanos e atacam você lançando Poções. Eles derrubam Poções depois de morrer. - - Degrau de Bétula + + O número máximo de pinturas/quadros de itens foi alcançado. - - Chapa madeira florestal + + Você não pode gerar inimigos no Modo Pacífico. - - Degrau: Bloco Submundo + + Este animal não pode entrar em Modo do Amor. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos reprodutores foi alcançado. - - Tijolos + + Não é possível usar o Ovo de Criação no momento. O número máximo de lulas em um mundo foi alcançado. - - TNT + + 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. - - Estante de Livros + + 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. - - Pedra de Musgo + + Este animal não pode entrar em Modo Amor. O número máximo de lobos foi alcançado. - - Obsidiana + + O número máximo de Cabeças de multidão no mundo foi alcançado. - - Tocha + + Inverter - - Tocha (Carvão) + + Canhoto - - Tocha (Carvão Vegetal) + + Este animal não pode entrar em Modo Amor. O número máximo de frangos foi alcançado. - - Fogo + + Este animal não pode entrar em Modo Amor. O número máximo de vacogumelos foi alcançado. - - Criador de Monstros + + O número máximo de barcos em um mundo foi alcançado. - - Escada de Carvalho + + Não é possível usar o Ovo de Criação no momento. O número máximo de frangos em um mundo foi alcançado. - - Baú + + {*C2*}Respire fundo agora. Respire novamente. Sinta o ar em seus pulmões. Deixe seus braços voltarem. Isso, mova seus dedos. Sinta seu corpo novamente, sob a gravidade, no ar. Volte a existir no longo sonho. Aí está você. Seu corpo tocando o universo novamente em cada ponto, como se você fosse coisas separadas. Como se nós fôssemos 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 infinito 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*} - - Pó de Redstone + + {*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*} - - Minério de Diamante + + Reiniciar Submundo - - Bloco de Diamante + + %s entrou no Final - - Um modo compacto de armazenar Diamantes. + + %s saiu do Final - - Bancada + + {*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 que os jogadores pudessem 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á segura 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*} - - Colheitas + + Tem certeza de que quer redefinir o Submundo para o estado padrão neste jogo salvo? Você perderá tudo o que construiu no Submundo! - - Campo + + Não é possível usar o Ovo de Criação no momento. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos foi alcançado. - - Fornalha + + Não é possível usar o Ovo de Criação no momento. O número máximo de vacogumelos foi alcançado. - - Placa + + Não é possível usar o Ovo de Criação no momento. O número máximo de lobos em um mundo foi alcançado. - - Porta de Madeira + + Reiniciar Submundo - - Escada de Mão + + Não redefinir Submundo - - Trilho + + Não é possível cortar este Vacogumelo no momento. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos foi alcançado. - - Trilho com Propulsão + + Morreu! - - Trilho Detector + + Opções de Mundo - - Escadas de Pedra + + Pode Construir e Minerar - - Alavanca + + Pode Usar Portas e Acionadores - - Chapa de Pressão + + Gerar Estruturas - - Porta de Ferro + + Mundo Superplano - - Minério de Redstone + + Baú de Bônus - - Tocha de Redstone - - - Botão + + Pode Abrir Recipientes - - Neve + + Expulsar - - Gelo + + Pode Voar - - Cacto + + Desabilitar Exaustão - - Argila + + Pode Atacar Jogadores - - Cana-de-açúcar + + Pode Atacar Animais - - Jukebox + + Moderador - - Cerca + + Privilégios do Host - - Abóbora + + Como Jogar - - Lanterna de Abóbora + + Controles - - Pedra Inflamável + + Configurações - - Areia Movediça + + Renascer - - Glowstone + + Ofertas de conteúdo oferecido para download - - Portal + + Alterar Capa - - Minério de Lápis-azul + + Créditos - - Bloco Lápis-azul + + TNT Explode - - Um modo compacto de armazenar Lápis-azul. + + Jogador x Jogador - - Distribuidor + + Confiar nos Jogadores - - Bloco de Nota + + Reinstalar Conteúdo - - Bolo + + Configurações de Depuração - - Cama + + Fogo Espalha - - Teia + + Dragão Ender - - Grama Alta + + {*PLAYER*} foi morto pelo sopro do Dragão Ender - - Arbusto Seco + + {*PLAYER*} foi assassinado por {*SOURCE*} - - Diodo + + {*PLAYER*} foi assassinado por {*SOURCE*} - - Baú Trancado + + {*PLAYER*} morreu - - Alçapão + + {*PLAYER*} explodiu - - Lã (qualquer cor) + + {*PLAYER*} foi morto por magia - - Pistão + + {*PLAYER*} levou um tiro de {*SOURCE*} - - Pistão Aderente + + Neblina Base - - Bloco Traça + + Exibir HUD - - Blocos de Pedra + + Exibir Mão - - Blocos de Pedra com Musgo + + {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} - - Blocos de Pedra Rachada + + {*PLAYER*} foi esmurrado por {*SOURCE*} - - Tijolos de pedra cinzentos + + {*PLAYER*} foi morto por {*SOURCE*} usando magia - - Cogumelo + + {*PLAYER*} caiu para fora do mundo - - Cogumelo + + Pacotes de texturas - - Barras de Ferro + + Pacotes de combinações - - Painel de Vidro + + {*PLAYER*} incendiou-se - - Melão + + Temas - - Broto de Abóbora + + Imagens do jogador - - Broto de Melão + + Itens de avatar - - Vinhas + + {*PLAYER*} queimou até a morte - - Portão de Cerca + + {*PLAYER*} morreu de fome - - Escadas de Blocos + + {*PLAYER*} foi espetado até a morte - - Escadas: Blocos de Pedra + + {*PLAYER*} atingiu o chão com muita força - - Pedra Traça + + {*PLAYER*} tentou nadar na lava - - Pedregulho de Traça + + {*PLAYER*} asfixiou-se em uma parede - - Bloco de pedra de Traça + + {*PLAYER*} afogou-se - - Micélio + + Mensagens de Morte - - Vitória-Régia + + Você não é mais um moderador - - Bloco do Submundo + + Agora você pode voar - - Cerca: Blocos Submundo + + Você não pode mais voar - - Escadas: Blocos Submundo + + Você não pode mais atacar animais - - Verruga do Submundo + + Agora você pode atacar animais - - Bancada de Feitiços + + Agora você é um moderador - - Barraca de Poções + + Você não vai mais ficar cansado - - Caldeirão + + Agora você é invulnerável - - Portal Final + + Você não é mais invulnerável - - Estrutura do Portal Final + + %d MSP - - Pedra Final + + Agora você vai ficar cansado - - Ovo de Dragão + + Agora você é invisível - - Arbusto + + Você não é mais invisível - - Samambaia + + Agora você pode atacar jogadores - - Escada de Arenito + + Agora você pode minerar e usar itens - - Escada de Abeto + + Você não pode mais colocar blocos - - Escada de Bétula + + Agora você pode colocar blocos - - Escada: madeira de floresta + + Personagem Animado - - Lâmpada de Redstone + + Anim. capa personalizada - - Cacau + + Você não pode mais minerar nem usar itens - - Caveira + + Agora você pode usar portas e acionadores - - Controles Atuais + + Você não pode mais atacar multidões - - Estilo + + Agora você pode atacar multidões - - Mover/Correr + + Você não pode mais atacar jogadores - - Olhar + + Você não pode mais usar portas e acionadores - - Pausar + + Agora você pode usar recipientes (por exemplo, baús) - - Pular + + Você não pode mais usar recipientes (por exemplo, baús) - - Pular/Voar Acima + + Invisível - - Inventário + + Sinalizadores + + + {*T3*}COMO JOGAR: SINALIZADORES{*ETW*}{*B*}{*B*} +Sinalizadores ativos projetam um raio brilhante de luz no céu e concedem poderes aos jogadores próximos.{*B*} +Eles são fabricados com Cristal, Obsidiana e Estrelas do Submundo, que podem ser obtidas ao derrotar o Wither.{*B*}{*B*} +Os Sinalizadores devem ser posicionados ao sol durante o dia. Sinalizadores devem ser posicionados em Pirâmides de Ferro, Ouro, Esmeralda ou Diamante.{*B*} +O material no qual o Sinalizador é posicionado não exerce efeito sobre o poder do Sinalizador.{*B*}{*B*} +No menu do Sinalizador você pode selecionar um poder principal para ele. Quanto mais fileiras tiver sua pirâmide, mais poderes você terá para escolher.{*B*} +Um Sinalizador numa pirâmide com pelo menos quatro fileiras também oferece a opção de Regeneração como poder secundário ou um poder principal mais forte.{*B*}{*B*} +Para configurar os poderes do seu Sinalizador você deve sacrificar uma Barra de Esmeralda, Diamante, Ouro ou Ferro no espaço de pagamento.{*B*} +Assim que estiverem configurados, os poderes vão emanar do Sinalizador indefinidamente.{*B*} + + + + Fogos de Artifício + + + Idiomas + + + Cavalos + + + {*T3*}COMO JOGAR: CAVALOS{*ETW*}{*B*}{*B*} +Cavalos e Burros são em geral encontrados em planícies abertas. Mulas são a prole infértil de um Burro e um Cavalo.{*B*} +Todos os Cavalos, Burros e Mulas adultos podem ser cavalgados. No entanto, apenas Cavalos podem receber armaduras e apenas as Mulas e os Burros podem ser equipados com alforjes para transportar itens.{*B*}{*B*} +Cavalos, Burros e Mulas devem ser domados antes de serem usados. Um cavalo é domado quando você tenta cavalgá-lo e consegue ficar montado enquanto ele tenta derrubar você.{*B*} +Quando Corações de Amor aparecem ao redor do cavalo, significa que ele está domado e não vai mais tentar derrubar o jogador. Para guiar um cavalo, o jogador deve equipá-lo com uma Sela.{*B*}{*B*} +As Selas podem ser compradas de aldeões ou encontradas dentro de Baús escondidos pelo mundo.{*B*} +Burros e Mulas domados podem receber alforjes ao conectar um Baú a eles. Esses alforjes podem ser acessados durante a cavalgada ou se esgueirando.{*B*}{*B*} +Cavalos e Burros (mas não Mulas) podem dar cria como outros animais, usando Maçãs de Ouro ou Cenouras Douradas.{*B*} +Potros crescem e viram cavalos adultos com o tempo, e alimentá-los com Trigo ou Feno acelera esse processo.{*B*} + + + + {*T3*}COMO JOGAR: FOGOS DE ARTIFÍCIO{*ETW*}{*B*}{*B*} +Fogos de Artifício são itens decorativos que podem ser lançados manualmente ou por Distribuidores. Eles são fabricados usando Papel, Pólvora e uma variedade opcional de Estrelas de Fogo de Artifício.{*B*} +As cores, o desaparecimento, a forma, o tamanho e os efeitos (como rastros e brilho) das Estrelas de Fogo de Artifício podem ser personalizados com a adição de ingredientes adicionais durante a fabricação.{*B*}{*B*} +Para fabricar um Fogo de Artifício, coloque Pólvora e Papel na grade de fabricação 3x3 que é exibida sobre seu inventário.{*B*} +Outra opção é colocar várias Estrelas de Fogo de Artifício na grade de fabricação e adicioná-las ao Fogo de Artifício.{*B*} +O preenchimento de mais espaços da grade de fabricação com Pólvora aumentará a altura na qual as Estrelas de Fogo de Artifício explodirão.{*B*}{*B*} +Com isso, você pode remover o Fogo de Artifício do espaço de saída.{*B*}{*B*} +Estrelas de Fogo de Artifício podem ser fabricadas colocando-se Pólvora e Corante na grade de fabricação.{*B*} + - O Corante definirá a cor da explosão da Estrela de Fogo de Artifício.{*B*} + - A forma da Estrela de Fogo de Artifício é definida com a adição de Carga de Fogo, Pepita de Ouro, Pena ou Cabeça de Multidão.{*B*} + - É possível adicionar um rastro ou um brilho usando Diamantes ou Pó de Glowstone.{*B*}{*B*} +Após fabricar uma Estrela de Fogo de Artifício, você pode definir a cor de desaparecimento da Estrela de Fogo de Artifício fabricando-a com Corante. + + + + {*T3*}COMO JOGAR: LIBERADORES{*ETW*}{*B*}{*B*} +Quando acionados por Redstone, os Liberadores soltarão no chão um item aleatório que esteja dentro deles. Use {*CONTROLLER_ACTION_USE*} para abrir o Liberador e carregá-lo com itens de seu inventário.{*B*} +Se o Liberador estiver voltado para um Baú ou para outro tipo de recipiente, o item será colocado nesse recipiente. Longos encadeamentos de Liberadores podem ser construídos para transportar itens por grandes distâncias, mas, para que isso funcione, eles precisam estar alternadamente ligados e desligados. + + + + Ao ser usado, ele se torna um mapa da parte do mundo onde você está, sendo preenchido conforme você explora. + + + É derrubada pelo Wither e usado na fabricação de Faróis. + + + Funis + + + {*T3*}COMO JOGAR: FUNIS{*ETW*}{*B*}{*B*} +Funis são usados para inserir ou remover itens de recipientes e para pegar automaticamente os itens jogados neles.{*B*} +Eles podem afetar Barracas de Poções, Baús, Distribuidores, Liberadores, Carrinhos com Baús, Carrinhos com Funis, bem como outros Funis.{*B*}{*B*} +Os Funis tentam sugar itens continuamente de um recipiente apropriado posicionado acima deles. Eles também vão tentar inserir itens armazenados dentro um recipiente externo.{*B*} +Se um Funil for acionado por Redstone ele vai ficar inativo e vai parar de sugar e inserir itens.{*B*}{*B*} +Um Funil aponta para a direção que tentar emitir itens. Para apontar um Funil para um bloco em particular, posicione-o contra o bloco quando estiver se esgueirando.{*B*} + + + + Liberadores - - Rodízio de Itens + + NÃO USADO - - Ação + + Saúde Imediata - - Usar + + Dano Imediato - - Fabricação + + Salto Turbinado - - Soltar + + Fadiga do Minerador - - Esgueirar-se + + Força - - Esgueirar-se/Voar Abaixo + + Fraqueza - - Alterar Modo Câmera + + Náuseas - - Jogadores/Convidar + + NÃO USADO - - Movimento (Ao Voar) + + NÃO USADO - - Estilo 1 + + NÃO USADO - - Estilo 2 + + Regeneração - - Estilo 3 + + Resistência - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Procurando Semente para Criação de Mundo - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Ao ser ativado, cria explosões coloridas. A cor, efeito, formato e desaparecimento são determinados pela Estrela de Fogo de Artifício usada quando o Fogo de Artifício é criado. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Um tipo de trilho que pode ativar ou desativar os Carrinhos de Minas com Funil e ativar os Carrinhos de Minas com TNT. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Usado para pegar e soltar itens, ou inserir itens em outros recipientes, quando recebe uma carga de Redstone. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Blocos coloridos fabricados usando argila endurecida tingida. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Fornece uma carga de Redstone. A carga será mais forte se houver mais itens na chapa. Requer mais peso do que a chapa leve. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Usado como uma fonte de energia de Redstone. Pode voltar a se tornar Redstone. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Usado para pegar itens ou transferi-los para dentro e fora de recipientes. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Pode virar alimento de Cavalos, Burros ou Mulas para curá-los com até 10 Corações. Acelera o crescimento de potros. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Morcego - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Essas criaturas voadoras são encontradas em cavernas e outros espaços grandes e recônditos. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Bruxa - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Criada pela fusão de Argila em uma fornalha. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Fabricado com cristal e corante. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Fabricado com Cristal Tingido - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Fornece uma carga de Redstone. A carga será mais forte se houver mais itens na chapa. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + É um bloco que emite um sinal de Redstone baseado na luz solar (ou falta de luz solar). - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + É um tipo especial de Carrinho de minas que funciona quase igual ao Funil. Ele coleta itens deixados em trilhos e de recipientes. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 5 de Armadura. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Usada para determinar as cores, efeitos e formatos de um Fogo de Artifício. - - {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + + Usado em circuitos de Redstone para manter, comparar ou subtrair a intensidade do sinal, ou para medir certos estados de bloco. - - {*B*}Pressione{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} - Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + + É um tipo de carrinho de minas que atua como um bloco de TNT. - - 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. + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 7 de Armadura. - - Use{*CONTROLLER_ACTION_LOOK*} para olhar para cima, para baixo e ao redor. + + Usado para executar comandos. - - Use{*CONTROLLER_ACTION_MOVE*} para se mover. + + Projeta um raio de luz no céu e pode fornecer Efeitos de Status a jogadores próximos. - - Para correr, pressione {*CONTROLLER_ACTION_MOVE*}para frente rapidamente duas vezes. Enquanto segurar {*CONTROLLER_ACTION_MOVE*}, o personagem continuará correndo, a não ser que o tempo de corrida ou o alimento acabem. + + Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. O baú confinado cria uma carga de Redstone ao ser aberto. - - Pressione{*CONTROLLER_ACTION_JUMP*} para pular. + + Um tipo especial de Armadura que pode ser equipado em um cavalo. Oferece 11 de Armadura. - - Segure {*CONTROLLER_ACTION_ACTION*} para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos... + + Usado para laçar multidões ao jogador ou em postes de Cerca. - - Segure {*CONTROLLER_ACTION_ACTION*} 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. + + Usado para nomear as multidões no mundo. - - Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação. + + Pressa - - Conforme você coleta e fabrica itens, seu inventário vai enchendo.{*B*} - Pressione{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + + Desbloquear jogo completo - - 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. + + Continuar Jogo - - 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. + + Salvar Jogo - - 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 sua barra de alimentos estiver cheia. + + Jogar - - 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*} + + Placares de Líderes - - A madeira que você coletou pode ser usada para fabricar tábuas. Abra a interface de fabricação para fabricá-las.{*PlanksIcon*} + + Ajuda e Opções - - Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Crie uma bancada.{*CraftingTableIcon*} + + Dificuldade: - - 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*} + + JxJ: - - Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para alterar o item que está segurando. + + Confiar Jogadores: - - 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. + + TNT: - - Com a bancada selecionada, aponte o cursor para o local desejado e use{*CONTROLLER_ACTION_USE*} para colocar a bancada. + + Tipo de Jogo: - - Aponte o cursor para a bancada e pressione{*CONTROLLER_ACTION_USE*} para abri-la. + + Estruturas: - - 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*} + + Tipo de Nível: - - O machado ajuda a cortar madeira e blocos de madeira mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie um machado de madeira.{*WoodenHatchetIcon*} + + Nenhum Jogo Encontrado - - 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*} + + Só convidados - - Abrir o recipiente + + Mais Opções - - -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. - + + Carregar - - -Aqui perto há um abrigo abandonado de mineiro que você pode concluir para passar a noite em segurança. - + + Opções do Host - - -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. - + + Jogadores/Convidar - - 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*} + + Jogo online - - Você coletou pedregulho suficiente para construir uma fornalha. Use a bancada para criar uma. + + Novo mundo - - Use{*CONTROLLER_ACTION_USE*} para colocar a fornalha no mundo e abra-a. + + Jogadores - - Use a fornalha para criar carvão vegetal. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + + Entrar no Jogo - - Use a fornalha para criar vidro. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + + Iniciar jogo - - 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*} + + Nome do Mundo - - Use{*CONTROLLER_ACTION_USE*} para colocar a porta. Você pode usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + + Semente para Criação de 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*} + + Deixar em branco para semente aleatória - - - Você concluiu a primeira parte do tutorial. - + + Fogo Espalha: - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar o tutorial.{*B*} - Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. - + + Editar mensagem da placa: - - 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. - + + Preencha os detalhes que acompanharão sua captura de tela - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário. - + + Legenda - - -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. - + + Dicas: Ferramentas do Jogo - - -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. - + + Dividir Tela para 2 Jogadores - - -Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item. - + + Concluído - - - Para obter mais informações sobre um item, passe o ponteiro sobre ele e pressione{*CONTROLLER_VK_BACK*}. - + + Captura de tela do jogo - - - Pressione{*CONTROLLER_VK_B*} agora para sair do inventário. - + + Sem efeitos - - - 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. - + + Rapidez - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário do modo criativo. - + + Lentidão - - -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. - + + Editar mensagem da placa: - - -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. - + + Texturas, ícones e interface do usuário clássicos do Minecraft! - - -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*}. - + + Exibir todos os Mundos de Combinações - - -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. - + + Dicas - - - Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione{*CONTROLLER_VK_BACK*}. - + + Reinstalar Item de Avatar 1 - - -Pressione{*CONTROLLER_VK_B*} agora para sair do inventário do modo criativo. - + + Reinstalar Item de Avatar 2 - - -Esta é a interface de fabricação. Esta interface de fabricação lhe permite combinar os itens coletados para fazer novos itens. - + + Reinstalar Item de Avatar 3 - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber fabricar. - + + Reinstalar Tema - - {*B*} - Pressione{*CONTROLLER_VK_X*} para mostrar a descrição do item. - + + Reinstalar Imagem do Jogador 1 - - {*B*} - Pressione{*CONTROLLER_VK_X*} para mostrar os ingredientes necessários para fazer o item atual. - + + Reinstalar Imagem do Jogador 2 - - {*B*} - Pressione{*CONTROLLER_VK_X*} para mostrar novamente o inventário. - + + Opções - - -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. - + + Interface do Usuário - - -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. - + + Restaurar Padrões - - - 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. - + + Exibição de oscilação - - - 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. - + + Áudio - - - A descrição do item selecionado é exibida. Com a descrição você pode ter uma ideia de como o item pode ser usado. - + + Controle - - - A lista dos ingredientes necessários para fabricar o item é exibida. - + + Gráficos - - 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*} + + Usada para fazer poções. É derrubada pelos Ghasts, quando eles morrem. - - - 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. - + + É derrubada pelos Homens-Porco Zumbis quando eles morrem. Os Homens-Porco Zumbis podem ser encontrados no Submundo. Usada como ingrediente para fazer poções. - - - Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo de itens que deseja fabricar. Selecione o grupo de ferramentas.{*ToolsIcon*} - + + Usada para fazer poções. Pode ser encontrada naturalmente nas Fortalezas do Submundo. Também pode ser plantada na Areia Movediça. - - - 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*} - + + É escorregadio. Transforma-se em água se estiver sobre outro bloco quando destruído. Derrete se estiver muito próximo de uma fonte de luz ou se colocado no Submundo. - - - 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*} - + + Pode ser usado como decoração. - - - 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*} - + + Usada para fazer poções e para localizar Fortalezas. É derrubada pelas Chamas que ficam dentro ou perto das Fortalezas do Submundo. - - - 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. - + + Quando usada, pode ter vários efeitos, dependendo de onde for utilizada. - - - Alguns itens não podem ser criados usando a bancada, mas precisam da fornalha. Fabrique a fornalha agora.{*FurnaceIcon*} - + + Usado para fazer poções ou fabricado com outros itens para fazer o Olho de Ender ou o Creme de Magma. - - - 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. - + + Usado para fazer poções. - - - 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. - + + Usada para fazer Poções e Poções de Lançamento. - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar a fornalha. - + + Pode ser enchida com água e usada como o ingrediente inicial de uma poção na Barraca de Poções. - - - Você precisa colocar um pouco de combustível na abertura inferior da fornalha e o item a ser transformado na abertura superior. A fornalha acenderá e começará a funcionar, colocando o resultado na abertura à direita. - + + Este é um alimento venenoso e item de poção. É derrubado quando uma Aranha ou Aranha de Caverna é morta por um jogador. - - - 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. - + + Usado para fazer poções, especialmente para criar poções com efeito negativo. - - - 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. - + + Cresce ao longo do tempo quando colocada. Pode ser coletada usando tosquiadeiras. Pode ser escalada como uma escada. - - - 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. - + + Semelhante a uma porta, mas usado principalmente com cercas. - - - O carvão vegetal pode ser usado como combustível e também ser combinado com uma vareta para fabricar uma tocha. - + + Pode ser fabricado com Fatias de Melão. - - - Se colocar areia na abertura do ingrediente, você poderá fazer vidro. Crie alguns blocos de vidro para usar como janelas no seu abrigo. - + + Blocos transparentes que podem ser usados no lugar dos blocos de vidro. - - - Esta é a interface de poções. Você pode usar isto para criar poções com diversos efeitos diferentes. - + + Quando acionado (com um botão, alavanca, placa de pressão, tocha de redstone ou redstone), um pistão estende-se, podendo empurrar blocos. Quando se retrai, puxa o bloco de volta. - - {*B*} - Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar a barraca de poções. - + + Feitos com pedra, geralmente encontrados em Fortalezas. - - - 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. - + + Usadas como barreiras semelhantes às cercas. - - - 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. - + + Podem ser plantadas para cultivar abóboras. - - - 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. - + + Pode ser usada para construção e decoração. - - - 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 de Lançamento, que pode ser atirada para aplicar seus efeitos a uma área próxima. - + + Deixa o movimento mais lento quando atravessada. Pode ser destruída usando tosquiadeiras para coletar fios. - - - 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. - + + Cria uma Traça quando destruída. Também pode criar Traças se estiver perto de outra Traça que esteja sendo atacada. - - - Pressione{*CONTROLLER_VK_B*} agora para sair da interface de poções. - + + Podem ser plantadas para cultivar melões. - - - Nesta área há uma Barraca de Poções, um Caldeirão e um baú cheio de itens para fazer poções. - + + Derrubada pelo Enderman quando ele morre. Quando atirada, o jogador será teleportado até a posição em que a Pérola do Ender cair e perderá um pouco de energia. - - {*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. - + + Um bloco de terra com grama crescendo sobre ela. Coletado usando uma pá. Pode ser usado para construção. - - - A primeira etapa para fazer uma poção é criar uma Garrafa de Água. Pegue uma Garrafa de Vidro no baú. - + + Pode ser cheio com água da chuva ou usando um balde de água e pode ser usado para encher Garrafas de Vidro com água. - - - 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*}. - + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. - - - Se o caldeirão ficar vazio, você pode enchê-lo com um Balde de Água. - + + Criado pela fusão de Pedra Inflamável em uma fornalha. Pode ser transformado em Blocos do Submundo. - - - 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. - + + Quando carregada, ela emite luz. - - -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. - + + É semelhante a uma vitrine e exibirá o item ou bloco colocado nele. - - - Use sua Poção de Resistência ao fogo em si mesmo. - + + Quando lançado pode gerar uma criatura do tipo indicado. - - - Agora que você está resistente ao fogo e à lava, veja se há lugares em que você consegue chegar que não conseguia antes. - + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. - - - Esta é a interface de feitiços, que você pode usar para adicionar feitiços a armas, à armadura e a algumas ferramentas. - + + Pode ser cultivado para coletar grãos de cacau. - - {*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. - + + Vaca - - - Para enfeitiçar um item, primeiro coloque-o no slot de feitiços. Armas, armadura e algumas ferramentas podem ser enfeitiçadas para adicionar efeitos especiais como maior resistência a danos ou aumento do número de itens produzidos ao minerar um bloco. - + + Solta couro quando morta. Pode ser ordenhada com um balde. - - - 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. - + + Ovelha - - - 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. - + + As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. - - - 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. - + + Lula - - - 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. - + + Solta sacos de tinta quando morta. - - - Nesta área há uma Bancada de Feitiços e alguns outros itens para você aprender mais sobre feitiços. - + + Útil para pôr fogo nas coisas, ou para começar incêndios quando disparada de um Distribuidor. - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre feitiços.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar os feitiços. - + + Flutua na água e permite andar em cima. - - - 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 uma maior resistência a danos. - + + Usado para construir Fortalezas do Submundo. É imune às bolas de fogo do Ghast. - - - 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. - + + Usada em Fortalezas do Submundo. - - - 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. - + + 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. - - - 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. - + + Usado para fazer poções. - - - 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. - + + Similar aos Blocos de Grama, mas muito bom para cultivar cogumelos. - - - Agora você está andando no carrinho de minas. Para sair do carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - + + Encontrado em Fortalezas do Submundo; derruba Verrugas do Submundo quando quebrado. - - {*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. - + + Um tipo de bloco encontrado no Final. Ele tem resistência muito alta a explosões, portanto, é bem útil para construções. - - - 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*} - + + Este bloco é criado ao derrotar o Dragão no Final. - - - 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*} - + + Quando atirada, derruba Esferas de Experiência que aumentam seus pontos de experiência quando coletadas. - - - Agora você está andando de barco. Aponte o cursor para o barco e pressione{*CONTROLLER_ACTION_USE*} para sair.{*BoatIcon*} - + + 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. + + + 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. + + + Argila cozida na fornalha. + + + Pode ser cozida na fornalha para fazer tijolos. + + + Quando quebrada, derruba bolas de argila que podem ser cozidas para fazer tijolos na fornalha. + + + 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. + + + Um modo compacto de armazenar bolas de neve. + + + 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. + + + Pode ser cavada com uma pá para criar bolas de neve. + + + Pode produzir sementes de trigo quando quebrada. + + + Pode ser usada para fabricar corante. + + + Coletado com uma pá. Pode produzir sílex quando cavado. Sofrerá ação da gravidade se não houver outra peça sob ele. + + + 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. + + + 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 de ferro ou de material melhor para coletar pó de redstone. + + + 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. + + + 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. + + + É colocado no chão para transportar uma carga elétrica. Quando usado com uma poção, ele aumentará a duração de seu efeito. + + + É 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 para fazer poções ou para fabricar Pistões Aderentes. + + + As galinhas soltam aleatoriamente 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 que você monte nele. O porco pode ser controlado usando uma Cenoura no Palito. + + + Coletada ao cavar neve e pode ser atirada. + + + É coletado ao extrair Glowstone e pode ser usado para fabricar blocos de Glowstone novamente ou usado para fazer poções que aumentam a potência desse efeito. + + + Quando quebrada, às vezes derruba uma muda que pode ser replantada para se tornar uma árvore. + + + Encontrada em calabouços, pode ser usada para construção e decoração. + + + Usada para obter lã da ovelha e colher blocos de folhas. + + + 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. + + + Coletado nas colheitas e pode ser usado para fabricar alimentos. + + + 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. + + + 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. + + + Torna mais lento o movimento de quem anda sobre ela. + + + Coletada ao matar uma galinha e pode ser usada para fabricar uma flecha. + + + Coletado ao matar um Creeper, pode fabricar TNT ou ser usado como ingrediente para fazer poções. + + + Pode ser plantada no campo para colheita. Verifique se há luz suficiente para as sementes crescerem! + + + 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, pode fabricar um Arco ou uma Vara de Pescar, ou pode ser colocado no chão para criar um Detonador. + + + Solta lã quando tosquiada (se já não tiver sido tosquiada). Pode ser tingida para produzir lã de cores diferentes. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Pá de Ferro + + + Pá de Diamante + + + Pá de Ouro + + + Espada de Ouro + + + Pá de Madeira + + + Pá de Pedra + + + Picareta de Madeira + + + Picareta de Ouro + + + Machado de Madeira + + + Machado de Pedra + + + Picareta de Pedra + + + Picareta de Ferro + + + Picareta de Diamante + + + Espada de Diamante + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Espada de Madeira + + + Espada de Pedra + + + Espada de Ferro + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Atira bolas de fogo em você, que explodem ao contato. + + + Slime + + + Divide-se em slimes menores quando atingido. + + + Homem-porco zumbi + + + Inicialmente dócil, mas ataca em grupos se você ataca um deles. + + + Ghast + + + Enderman + + + Aranha de Caverna + + + Tem uma mordida venenosa. + + + Vacogumelo + + + 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. + + + Ataca quando você chega perto. + + + 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ê. + + + Galinha + + + Solta penas quando morta e põe ovos aleatoriamente. + + + Porco + + + Creeper + + + Aranha + + + Ataca quando você chega perto. Escala paredes. Solta fio quando morta. + + + Zumbi + + + Explode se você chegar muito perto! + + + Esqueleto + + + Dispara flechas em você. Deixa cair flechas quando morto. + + + Faz sopa de cogumelo quando usada com uma vasilha. Derruba cogumelos e torna-se uma vaca normal depois de tosquiada. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + 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. + + + 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 + + + Cubo de Magma + + + 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. + + + Eles são encontrados no Submundo. Similares aos Slimes, dividem-se em versões menores quando são mortos. + + + Aldeão + + + Ocelote + + + Permite a criação de feitiços mais poderosos quando colocada perto da Mesa de Feitiços. + + + {*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 de Lançamento, que pode ser atirada. Ao ser atirada, a Poção de Lançamento 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*}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 fabricar 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: 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 são colocados Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no espaço por baixo do livro na Mesa de Feitiços, os três botões à direita do espaço apresentam alguns feitiços e os respectivos custos em Níveis de Experiência.{*B*} +Se você não tiver 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, ou ser extraídos das minas ou cultivados no mundo.{*B*}{*B*} +Livros Encantados são usados na Bigorna para aplicar feitiços nos itens. Isso lhe dá mais controle sobre quais feitiços você quer nos seus itens.{*B*} + + + {*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: 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. Esta opção 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 alterar essas 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 de dentro do jogo.{*B*}{*B*} + + {*T2*}TNT Explode{*ETW*}{*B*} + Quando habilitado, a TNT explodirá quando detonada. Esta opção também pode ser mudada de dentro do jogo.{*B*}{*B*} + + {*T2*}Privilégios do Host{*ETW*}{*B*} + Quando ativado, o host pode alternar o voo, desativar a exaustão e ficar invisível pelo menu do jogo. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Ciclo da Luz do Dia{*ETW*}{*B*} + Ao ser desativado, a hora do dia não muda.{*B*}{*B*} + + {*T2*}Manter inventário{*ETW*}{*B*} + Quando ativado, os jogadores mantêm seu inventário depois de morrer.{*B*}{*B*} + + {*T2*}Criação de multidão{*ETW*}{*B*} + Ao ser desativado, as multidões não são criadas naturalmente.{*B*}{*B*} + + {*T2*}Vandalismo de multidão{*ETW*}{*B*} + Ao ser desativado, impede que monstros e animais alterem blocos (por exemplo, explosões de Creeper não destroem blocos e Ovelhas não removem Grama) ou peguem itens.{*B*}{*B*} + + {*T2*}Pilhagem de multidão{*ETW*}{*B*} + Ao ser desativado, monstros e animais não derrubam itens (por exemplo, Creepers não derrubam pólvora).{*B*}{*B*} + + {*T2*}Bloco derruba itens{*ETW*}{*B*} + Ao ser desativado, os blocos não derrubam itens quando são destruídos (por exemplo, blocos de Pedra não derrubam Pedregulho).{*B*}{*B*} + + {*T2*}Regeneração Natural{*ETW*}{*B*} + Ao ser desativado, os jogadores não regeneram a energia naturalmente.{*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 e 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 o botão {*BACK_BUTTON*} 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 ativar e desativar 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á desativada. 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 recipientes{*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 recipientes, tais como baús.{*B*}{*B*} + + {*T2*}Pode Atacar Jogadores{*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á 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 esta 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á ativada, o jogador pode alterar privilégios para outros jogadores (exceto o host) se a opção "Confiar nos Jogadores" estiver desativada, expulsar jogadores, além de poder ativar e desativar as opções Fogo Espalha e TNT Explode.{*B*}{*B*} + + {*T2*}Expulsar Jogador{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*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ê poderá 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*}Desativar 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*}Pode Teleportar{*ETW*}{*B*} + Isso permite ao jogador mover jogadores ou ele mesmo até o local de outros jogadores no mundo. + + + + Próxima Página + + + {*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*} +Um Portal do Submundo permite que o jogador viaje entre a Superfície e o Submundo. O Submundo pode ser usado para o deslocamento rápido na Superfície. Viajar a uma distância de um bloco no Submundo equivale a se deslocar por 3 blocos na Superfície. Portanto, ao construir um portal no Submundo e sair por ele, você estará 3 vezes mais longe de seu ponto de entrada.{*B*}{*B*} +São necessários no mínimo 10 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: 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. + + + + Você estava na Minecon? + + + Ninguém da Mojang já viu o rosto do Junkboy. + + + Você sabia que existe um Wiki do Minecraft? + + + Não olhe diretamente para os bugs. + + + Os Creepers nasceram de um bug de código. + + + Isso é uma galinha ou um pato? + + + O novo escritório da Mojang é maneiro! + + + {*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*} +Segure {*CONTROLLER_ACTION_ACTION*} 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 d'água, seu nível de fome (é preciso comer para reabastecer) e sua armadura, se estiver usando uma. Se você perder energia, mas tiver uma barra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será reabastecida automaticamente. Comer preenche 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.{*B*}{*B*} +É possível mudar a cor da sua Armadura de Couro tingindo-a. Você pode fazer isso no inventário ao segurar o corante no seu ponteiro e, em seguida, pressionar{*CONTROLLER_VK_X*} enquanto o ponteiro estiver sobre a peça que você deseja tingir. + + + A Minecon 2013 foi em Orlando, na Flórida, EUA! + + + .party() estava excelente! + + + Considere os rumores sempre falsos, em vez de considerá-los verdadeiros! + + + Página Anterior + + + Comércio + + + Bigorna + + + Final + + + Banindo Níveis - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre os barcos.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar os barcos. - + + Modo Criativo - - - Com o barco é possível viajar mais rapidamente sobre a água. Você pode navegá-lo usando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - + + Opções de Host e Jogador - - - Agora você está usando uma vara de pescar. Pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*FishingRodIcon*} - + + {*T3*}COMO JOGAR: 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 Endermen. 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*} +É possível alcançar as primeiras 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ê. + - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre a pesca.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber pescar. + + {*ETB*}Bem-vindo de volta! Talvez você não tenha percebido, mas 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 vá se divertir!{*B*}{*B*} +{*T1*}Novos itens{*ETB*} - Argila Endurecida, Argila Tingida, Bloco de Carvão, Fardo de Feno, Trilho Ativador, Bloco de Redstone, Sensor de Luz do Dia, Liberador, Funil, Carrinho de Minas com Funil, Carrinho de minas com TNT, Comparador de Redstone, Chapa de Pressão Medida, Sinalizador, Baú Confinado, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Laço, Armadura de Cavalo, Crachá, Ovo de Criação de Cavalo{*B*}{*B*} +{*T1*}Novas multidões{*ETB*} - Wither, Esqueletos Murchos, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*}{*B*} +{*T1*}Novos recursos{*ETB*} - Dome e monte em um cavalo, fabrique fogos de artifício e crie um show, dê nomes a animais e monstros com um Crachá, crie circuitos mais avançados de Redstone e novas Opções do Host para ajudar a controlar o que os convidados do seu mundo podem fazer!{*B*}{*B*} +{*T1*}Novo Tutorial do Mundo{*ETB*} – Aprenda a usar os antigos e os novos recursos no Tutorial do Mundo. Tente encontrar todos os Discos de Música escondidos no mundo!{*B*}{*B*} - - - 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*} - + + Causa mais danos que à mão. - - - 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*} - + + 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. - - - 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*} - + + Correr - - - Esta é uma cama. Pressione{*CONTROLLER_ACTION_USE*} ao apontar para ela à noite para dormir a noite toda e despertar de manhã.{*ICON*}355{*/ICON*} - + + Novidades - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre as camas.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar as camas. + + {*T3*}Mudanças e acréscimos{*ETW*}{*B*}{*B*} +- Novos itens - Argila Endurecida, Argila Tingida, Bloco de Carvão, Fardo de Feno, Trilho Ativador, Bloco de Redstone, Sensor de Luz do Dia, Liberador, Funil, Carrinho de Minas com Funil, Carrinho de minas com TNT, Comparador de Redstone, Chapa de Pressão Medida, Sinalizador, Baú Confinado, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Laço, Armadura de Cavalo, Crachá, Ovo de Criação de Cavalo{*B*} +- Novas multidões - Wither, Esqueletos Murchos, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*} +- Novos recursos para geração de terrenos - Cabanas de Bruxas.{*B*} +- Nova interface do Sinalizador.{*B*} +- Nova interface do Cavalo.{*B*} +- Nova interface do Funil.{*B*} +- Novos Fogos de Artifício - A interface de Fogos de Artifício pode ser acessada pela Bancada quando você possui ingredientes para fabricar uma Estrela de Fogo de Artifício ou um Foguete de Fogo de Artifício.{*B*} +- Novo "Modo Aventura" - Você só pode quebrar blocos com as ferramentas corretas.{*B*} +- Muitos sons novos.{*B*} +- Multidões, itens e projéteis agora podem passar por portais.{*B*} +- Repetidores agora podem ser travados acionando sua laterais com outro Repetidor.{*B*} +- Zumbis e esqueletos agora podem ser gerados com armas e armaduras diferentes.{*B*} +- Novas mensagens de morte.{*B*} +- Use crachás para dar nomes às multidões e renomeie recipientes para alterar o título quando o menu for aberto.{*B*} +- O farelo de osso não faz mais tudo crescer ao tamanho completo instantaneamente. Em vez disso, ele faz crescer aleatoriamente em estágios.{*B*} +- Um sinal de Redstone descrevendo o conteúdo de Baús, Barracas de Poções, Distribuidores e Jukeboxes pode ser detectado ao posicionar um Comparador de Redstone diretamente contra eles.{*B*} +- É possível virar Distribuidores para qualquer direção.{*B*} +- Comer uma Maçã de Ouro dá ao jogador "absorção" extra de energia por um curto período de tempo.{*B*} +- Quanto mais tempo você permanecer em uma área, mais difíceis serão os monstros que nascem naquela área.{*B*} - - - 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*} - + + Compartilhando Capturas de Tela - - - Se houver outros jogadores no jogo, todos deverão estar em uma cama ao mesmo tempo para poderem dormir. - {*ICON*}355{*/ICON*} - + + Baús - - - Nesta área, há alguns circuitos simples de redstone e pistão, além de um baú com mais itens para ampliar esses circuitos. - + + Fabricação - - - {*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. - + + Fornalha - - - 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. - + + Noções Básicas - - - 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. - + + HUD + + + Inventário + + + Distribuidor + + + Feitiços + + + Portal do Submundo + + + Multijogador + + + Criação de Animais + + + Reprodução de Animais + + + Poções + + + deadmau5 curte o Minecraft! + + + 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! + + + Faça algumas tochas para iluminar áreas à noite. Os monstros evitam as áreas ao redor das tochas. + + + Chegue mais rapidamente aos destinos com um carrinho de minas e trilhos! + + + Plante algumas mudas e elas crescerão e se tornarão árvores. + + + Ao construir um portal, você poderá viajar para outra dimensão: o Submundo. + + + 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ê! + + + 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. + + + Comer costeletas de porco cozidas dá mais energia que comê-las cruas. + + + 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*} + + + O novo conteúdo oferecido para download está disponível! Acesse o conteúdo pelo botão Loja Minecraft no Menu Principal. + + + Você sabia que pode mudar a aparência do seu personagem com um Pacote de capas da Loja Minecraft? Selecione o botão Loja Minecraft no Menu Principal para ver o que está disponível. + + + Altere as configurações de gama para deixar o jogo mais claro ou mais escuro. + + + 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. + + + 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 do que com a mão! + + + Pegue as costeletas dos porcos, cozinhe as costeletas e as coma 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! + + + A obsidiana é criada quando a água encontra um bloco de origem de lava. + + + Agora há cercas empilháveis no jogo! + + + 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á. + + + 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. + + + Leia a seção Novidades nos menus Como jogar para ver as últimas atualizações no jogo. + + + Música de C418! + + + Quem é Notch? + + + Mojang tem mais prêmios que ajudantes! + + + Algumas celebridades jogam Minecraft! + + + 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! - - - 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*} - + + No futuro haverá uma atualização deste jogo! - - - Repetidores de redstone podem ser usados para ampliar a distância que a energia é transportada ou colocar um atraso no circuito. - {*ICON*}356{*/ICON*} - + + Se colocar dois baús lado a lado você terá um baú grande. - - - 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*} - + + Tome cuidado ao construir estruturas feitas de lã ao ar livre, pois relâmpagos de tempestades podem incendiar a lã. - - - 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. - + + Um único balde de lava pode ser usado em uma fornalha para fundir 100 blocos. - - - Nesta área há um Portal para o Submundo! - + + O instrumento tocado por um bloco de nota depende do material abaixo dele. - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre Portais e o Submundo.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber como funcionam os Portais e o Submundo. - + + A lava poderá demorar alguns minutos para desaparecer COMPLETAMENTE quando o bloco de origem for removido. - - - 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. - + + O pedregulho é resistente às bolas de fogo do Ghast, o que o torna útil para proteger portais. - - - 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. - + + Blocos que podem ser usados como fonte de luz derretem neve e gelo. Eles incluem tochas, glowstone e lanternas de abóbora. - - - 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. - + + Zumbis e esqueletos poderão sobreviver à luz do dia se estiverem na água. - - - 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. - + + As galinhas põem ovos a cada 5 ou 10 minutos. - - - 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. - + + A obsidiana só pode ser extraída com uma picareta de diamante. - - - Agora você está no Modo Criativo. - + + Os Creepers são a fonte de pólvora mais fácil de se obter. - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre o Modo Criativo.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar o Modo Criativo. - + + 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. - - 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. + + Os lobos não podem entrar no Submundo. - - Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. + + Os lobos não atacam os Creepers. - - Vá até o lado oposto deste buraco para continuar. + + Necessária para extrair blocos relacionados a pedra e minério. - - Você já concluiu o tutorial do modo Criativo. + + Usado na receita de bolo, como ingrediente para fazer poções. - - - Nesta área foi estabelecida uma fazenda. Se você a cultivar, terá uma fonte renovável de comida e outros itens. - + + Usada para enviar uma carga elétrica ao ser ligada ou desligada. Fica na posição ligada ou desligada até ser apertada novamente. - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre fazendas.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar as fazendas. - + + Envia constantemente uma carga elétrica ou pode ser usada como receptor/transmissor quando conectada à lateral de um bloco. Também pode ser usada para pouca iluminação. - - 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. + + Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma maçã dourada. - - 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. + + Restaura 2{*ICON_SHANK_01*} e regenera a energia por 4 segundos. Criada com uma Maçã e Pepitas de Ouro. - - O trigo passa por várias etapas enquanto está crescendo, e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} + + Restaura 2{*ICON_SHANK_01*}. Comê-la pode envenenar você. - - 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. + + Usado em circuitos de Redstone como repetidor, retardador e/ou diodo. - - 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*} + + Usado para guiar carrinhos de minas. - - 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*} + + Quando ativado, acelera os carrinhos de minas que passam sobre ele. Quando desativado, faz os carrinhos pararem nele. - - 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*} + + Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um carrinho de minas. - - 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*} + + Usado para enviar uma carga elétrica ao ser pressionado. Continua ativado por cerca de um segundo antes de desligar novamente. - - Agora você completou o tutorial da fazenda. + + Usado para guardar e projetar itens em ordem aleatória quando recebe uma carga de Redstone. - - - Nesta área os animais foram cercados. Você pode criar animais para produzir filhotes deles. - + + Reproduz uma nota quando acionado. Acerte-o para alterar o tom da nota. Se for colocado sobre blocos diferentes, alterará o tipo de instrumento. - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre a criação de animais.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber sobre a criação de animais. - + + Restaura 2,5{*ICON_SHANK_01*}. Criado ao cozinhar peixe cru na fornalha. - - Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor". + + Restaura 1{*ICON_SHANK_01*}. - - Dê Trigo para uma vaca, vacogumelo ou ovelha, dê Cenouras para porcos, 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. + + Restaura 1{*ICON_SHANK_01*}. - - 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. + + Restaura 3{*ICON_SHANK_01*}. - - Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos. + + Usada como munição para arcos. - - Alguns animais lhe seguirão se você estiver com comida na mão. Desta forma é mais fácil agrupar os animais para reproduzi-los.{*ICON*}296{*/ICON*} + + Restaura 2,5{*ICON_SHANK_01*}. - - - Lobos selvagens podem ser domados oferecendo ossos a eles. Depois de domados, aparecerão Corações de Amor em volta deles. Lobos domados seguem o jogador e o defendem se não receberem ordem para sentar. - + + Restaura 1{*ICON_SHANK_01*}. Pode ser usado 6 vezes. - - Agora você completou o tutorial de criação de animais. + + Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Comê-la pode envenenar você. - - - Nesta área há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. - + + Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. - - - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre Golens.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber usar os Golens. - + + Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar uma costeleta de porco crua na fornalha. - - Os Golens são criados colocando uma abóbora sobre uma pilha de blocos. + + Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser dado para o Ocelote comer, para torná-lo amigável. - - Os Golens de Neve são criados com dois Blocos de Neve, um sobre o outro, e uma abóbora sobre eles. Os Golens de Neve lançam bolas de neve em seus inimigos. + + Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar frango cru na fornalha. - - Os Golens de Ferro são criados com quatro Blocos de Ferro no padrão mostrado, com uma abóbora sobre o bloco do meio. Os Golens de Ferro atacam seus inimigos. + + Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. - - Os Golens de Ferro também aparecem naturalmente para proteger vilas e o atacarão se você atacar algum aldeão. + + Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar carne crua na fornalha. - - Você só poderá sair desta área quando concluir o tutorial. + + Usado para transportar você, um animal ou um monstro sobre trilhos. - - Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma pá para extrair materiais macios como terra ou areia. + + Usado como corante para criar lã azul-clara. - - Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar um machado para cortar troncos de árvores. + + Usado como corante para criar lã ciano. - - 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. + + Usado como corante para criar lã roxa. - - Algumas ferramentas são melhores para atacar inimigos. Pense em usar uma espada para atacar. + + Usado como corante para criar lã verde-lima. - - 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... + + Usado como corante para criar lã cinza. - - 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. + + Usado como corante para criar lã cinzenta. (Observação: este corante também pode ser criado combinando corante cinza com farelo de osso, permitindo criar 4 corantes cinzentos com cada saco de tinta, em vez de três.) + + + Usado como corante para criar lã magenta. - - Mantenha{*CONTROLLER_ACTION_JUMP*} pressionado para nadar. + + Usada para iluminar mais que tochas. Derrete neve/gelo e pode ser usada embaixo d'água. - - 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. + + Usado para criar livros e mapas. - - 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. + + Pode ser usado para criar Estantes ou enfeitiçado para fazer Livros Encantados. - - 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. + + Usado como corante para criar lã azul. - - 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. + + Toca discos de música. - - Se você mover o ponteiro para fora da interface ao segurar um item, poderá derrubá-lo. + + Usado para criar ferramentas, armas ou armaduras muito fortes. - - 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. + + Usado como corante para criar lã laranja. - - - 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! - + + Coletada das ovelhas, pode ser tingida com corantes. - - {*EXIT_PICTURE*} Quando estiver pronto para explorar mais, há uma escadaria nesta área perto do abrigo do mineiro que leva a um pequeno castelo. + + Usada como material de construção e pode ser tingida com corantes. Esta receita não é recomendada porque a lã pode ser obtida facilmente das ovelhas. - - Lembrete: + + Usado como corante para criar lã preta. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Usado para transportar mercadorias sobre trilhos. - - Novos recursos foram adicionados ao jogo na versão mais recente, incluindo novas áreas no mundo do tutorial. + + Andará sobre trilhos e poderá empurrar outros carrinhos de minas, se for colocado carvão nele. - - {*B*}Pressione{*CONTROLLER_VK_A*} para jogar no tutorial normalmente.{*B*} - Pressione{*CONTROLLER_VK_B*} para pular o tutorial principal. + + Usado para viajar pela água mais rapidamente do que nadando. - - Nesta área, você encontrará áreas configuradas para ajudá-lo a aprender sobre pesca, barcos, pistões e redstone. + + Usado como corante para criar lã verde. - - Fora desta área, você encontrará exemplos de construções, cultivo, carrinhos de mineração e trilhos, feitiços, poções, comércio, forjamento de metais e muito mais! + + Usada como corante para criar lã vermelha. - - - Sua barra de alimentos chegou a um nível em que não há mais cura. - + + Usado para fazer brotar instantaneamente colheitas, árvores, grama alta, cogumelos enormes e flores. Pode ser usado em receitas de corantes. - - - {*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. - + + Usado como corante para criar lã rosa. - - Selecionar + + Usado como corante para criar lã marrom, como ingrediente para biscoitos ou para criar cápsulas de cacau. - - Usar + + Usado como corante para criar lã prateada. - - Voltar + + Usado como corante para criar lã amarela. - - Sair + + Permite ataques à distância usando flechas. - - Cancelar + + Dá ao usuário 5 de Armadura quando usado. - - Cancelar Entrada + + Dá ao usuário 3 de Armadura quando usado. - - Lista de Jogos Online + + Dá ao usuário 1 de Armadura quando usado. - - Jogos de Grupo + + Dá ao usuário 5 de Armadura quando usado. - - Todos os Jogos + + Dá ao usuário 2 de Armadura quando usado. - - Alterar Grupo + + Dá ao usuário 2 de Armadura quando usado. - - Mostrar Inventário + + Dá ao usuário 3 de Armadura quando usado. - - Mostrar Descrição + + Uma barra brilhante que pode ser usada para fabricar ferramentas desse material. Criada ao fundir minério na fornalha. - - Mostrar Ingredientes + + 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. - - Fabricação + + Usada para enviar carga elétrica quando pisada por um jogador, animal ou monstro. As chapas de pressão de madeira também podem ser ativadas deixando algo cair sobre elas. - - Criar + + Dá ao usuário 8 de Armadura quando usado. - - Pegar/Colocar + + Dá ao usuário 6 de Armadura quando usado. - - Pegar + + Dá ao usuário 3 de Armadura quando usado. - - Pegar tudo + + Dá ao usuário 6 de Armadura quando usado. - - Pegar metade + + Portas de ferro só podem ser abertas com Redstone, botões ou acionadores. - - Colocar + + Dá ao usuário 1 de Armadura quando usado. - - Colocar tudo + + Dá ao usuário 3 de Armadura quando usado. - - Colocar um + + Usado para cortar blocos relacionados à madeira mais rápido que à mão. - - Soltar + + Usada para trabalhar blocos de terra e grama para preparar para plantação. - - Soltar tudo + + Portas de madeira são ativadas quando usadas, atingidas ou com Redstone. - - Soltar um + + Dá ao usuário 2 de Armadura quando usado. - - Trocar + + Dá ao usuário 4 de Armadura quando usado. - - Mover rápido + + Dá ao usuário 1 de Armadura quando usado. - - Limpar Seleção Rápida + + Dá ao usuário 2 de Armadura quando usado. - - O que é isto? + + Dá ao usuário 1 de Armadura quando usado. - - Compartilhar no Facebook + + Dá ao usuário 2 de Armadura quando usado. - - Alterar Filtro + + Dá ao usuário 5 de Armadura quando usado. - - Enviar Pedido de Amizade + + Usada para obter escadas compactas. - - Página Abaixo + + Usada para guardar sopa de cogumelo. Você fica com a vasilha depois de comer a sopa. - - Página Acima + + Usado para guardar e transportar água, lava e leite. - - Próximo + + Usado para armazenar e transportar água. - - Anterior + + Mostra o texto digitado por você ou por outros jogadores. - - Expulsar + + Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. - - Tingir + + 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. - - Extrair + + Usado para armazenar e transportar lava. - - Alimentar + + Mostra as posições do sol e da lua. - - Domar + + Aponta para seu ponto inicial. - - Curar + + Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. - - Sentar + + Usado para armazenar e transportar leite. - - Seguir-me + + Usado para criar fogo, detonar TNT e abrir um portal depois de construído. - - Ejetar + + Usada para pegar peixes. - - Esvaziar + + 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. - - Selar + + Usada como material de construção; pode ser usada para fabricar muitas coisas. Pode ser fabricada com qualquer tipo de madeira. - - Colocar + + Usado como material de construção. Não sofre ação da gravidade como a areia normal. - - Atingir + + Usado como material de construção. - - Ordenhar + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. - - Coletar + + Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. - - Comer + + Usada para iluminar. As tochas também derretem neve e gelo. - - Dormir + + Usada para fabricar tochas, flechas, placas, escadas de mão, cercas e como cabos de ferramentas e armas. - - Acordar + + Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. - - Tocar + + Usada 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. - - Montar + + Usada para escalar verticalmente. - - Velejar + + Usada para adiantar o tempo de um ponto da noite até a manhã, estando todos os jogadores no mundo nela, e mudar o ponto de criação do jogador. Suas cores são sempre as mesmas, independentemente da cor da lã. - - Cultivar + + Permite fabricar maior variedade de itens que a fabricação normal. - - Nadar + + Permite fundir minério, fazer carvão e vidro e cozinhar peixe e costeletas de porco. - - Abrir + + Machado de Ferro - - Alterar Tom + + Lâmpada de Redstone - - Detonar + + Escada: madeira de floresta - - Ler + + Escada de Bétula - - Pendurar + + Controles Atuais - - Atirar + + Caveira - - Plantar + + Cacau - - Arar + + Escada de Abeto - - Colher + + Ovo de Dragão - - Continuar + + Pedra Final - - Desbloquear jogo completo + + Estrutura do Portal Final - - Excluir Salvamento + + Escada de Arenito - - Excluir + + Samambaia - - Opções + + Arbusto - - Convidar Amigos + + Estilo - - Aceitar + + Fabricação - - Tosquiar + + Usar - - Banir Nível + + Ação - - Selecionar Capa + + Esgueirar-se/Voar Abaixo - - Acender + + Esgueirar-se - - Navegar + + Soltar - - Instalar Versão Completa + + Rodízio de Itens - - Instalar Versão de Avaliação + + Pausar - - Instalar + + Olhar - - Reinstalar + + Mover/Correr - - Opções Salvamento + + Inventário - - Executar Comando + + Pular/Voar Acima - - Criativo + + Pular - - Mover Ingrediente + + Portal Final - - Mover Combustível + + Broto de Abóbora - - Ferramenta Mover + + Melão - - Mover Armadura + + Painel de Vidro - - Mover Arma + + Portão de Cerca - - Equipar + + Vinhas - - Puxar + + Broto de Melão - - Lançar + + Barras de Ferro - - Privilégios + + Blocos de Pedra Rachada - - Bloquear + + Blocos de Pedra com Musgo - - Página Acima + + Blocos de Pedra - - Página Abaixo + + Cogumelo - - Modo do Amor + + Cogumelo - - Beber + + Tijolos de pedra cinzentos - - Girar + + Escadas de Blocos - - Ocultar + + Verruga do Submundo - - Limpar Todos os Espaços + + Escadas: Blocos Submundo - - OK + + Cerca: Blocos Submundo - - Cancelar + + Caldeirão - - Loja Minecraft + + Barraca de Poções - - Tem certeza de que deseja sair do jogo atual e entrar no novo jogo? O progresso não salvo será perdido. + + Bancada de Feitiços - - Sair do Jogo + + Bloco do Submundo - - Salvar Jogo + + Pedregulho de Traça - - Sair sem salvar + + Pedra Traça - - Tem certeza de que deseja substituir o salvamento anterior deste mundo pela versão atual dele? + + Escadas: Blocos de Pedra - - Tem certeza de que deseja sair sem salvar? Você perderá todo o progresso neste mundo! + + Vitória-Régia - - Iniciar o jogo + + Micélio - - Jogo danificado + + Bloco de pedra de Traça - - Este jogo salvo está corrompido ou danificado. Gostaria de excluí-lo? + + Alterar Modo Câmera - - Tem certeza de que deseja sair para o menu principal e desconectar todos os jogadores do jogo? O progresso não salvo será perdido. + + 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. - - Sair e salvar + + 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. - - Sair sem salvar + + Conforme você coleta e fabrica itens, seu inventário vai enchendo.{*B*} + Pressione{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. - - Tem certeza de que deseja sair para o menu principal? O progresso não salvo será perdido. + + A madeira que você coletou pode ser usada para fabricar tábuas. Abra a interface de fabricação para fabricá-las.{*PlanksIcon*} - - Tem certeza de que deseja sair para o menu principal? Seu progresso será perdido! + + 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*} - - Criar novo mundo + + 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 sua barra de alimentos estiver cheia. - - Jogar tutorial + + Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação. - - Tutorial + + Para correr, pressione {*CONTROLLER_ACTION_MOVE*}para frente rapidamente duas vezes. Enquanto segurar {*CONTROLLER_ACTION_MOVE*}, o personagem continuará correndo, a não ser que o tempo de corrida ou o alimento acabem. - - Nomear mundo + + Use{*CONTROLLER_ACTION_MOVE*} para se mover. - - Digite um nome para o mundo + + Use{*CONTROLLER_ACTION_LOOK*} para olhar para cima, para baixo e ao redor. - - Insira a semente para a criação do seu mundo + + Segure {*CONTROLLER_ACTION_ACTION*} 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. - - Carregar mundo salvo + + Segure {*CONTROLLER_ACTION_ACTION*} para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos... - - Pressione START p/ entrar + + Pressione{*CONTROLLER_ACTION_JUMP*} para pular. - - Saindo do jogo + + Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Crie uma bancada.{*CraftingTableIcon*} - - Erro. Saindo para o menu principal. + + +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. + - - Falha na conexão + + Abrir o recipiente - - Conexão perdida + + 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*} - - A conexão com o servidor foi perdida. Saindo para o menu principal. + + 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*} - - Desconectado pelo servidor + + +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. + - - Você foi expulso do jogo + + +Aqui perto há um abrigo abandonado de mineiro que você pode concluir para passar a noite em segurança. + - - Você foi expulso do jogo por voar + + O machado ajuda a cortar madeira e blocos de madeira mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie um machado de madeira.{*WoodenHatchetIcon*} - - A tentativa de conexão demorou muito + + 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. - - O servidor está cheio + + Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para alterar o item que está segurando. - - O host saiu do jogo. + + 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*} - - Você não pode entrar neste jogo, pois não é amigo de nenhuma pessoa no jogo. + + 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*} - - Você não pode entrar neste jogo, pois já foi expulso antes pelo host. + + Aponte o cursor para a bancada e pressione{*CONTROLLER_ACTION_USE*} para abri-la. - - Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão anterior do jogo. + + Com a bancada selecionada, aponte o cursor para o local desejado e use{*CONTROLLER_ACTION_USE*} para colocar a bancada. - - 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. + + 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. - - 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! + + - - Desbloquear jogo completo + + - - Você está jogando a versão de avaliação, mas precisa da versão completa para poder salvar seu jogo. -Deseja desbloquear a versão completa do jogo agora? + + - - Aguarde + + - - Sem resultados + + Estilo 1 - - Filtro: + + Movimento (Ao Voar) - - Amigos + + Jogadores/Convidar - - Minha pontuação + + - - Geral + + Estilo 3 - - Entradas: + + Estilo 2 - - Classif. + + - - Preparando para salvar nível + + - - Preparando partes... + + - - Finalizando... + + - - Construindo terreno + + {*B*}Pressione{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. - - Simulando o mundo um pouquinho + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. - - Inicializando o servidor + + - - Produzindo área de criação + + - - Carregando área de criação + + - - Entrando no Submundo + + - - Saindo do Submundo + + - - Renascendo + + - - Criando nível + + - - Carregando nível + + - - Salvando jogadores + + Bloco Traça - - Conectando ao host + + Degrau de Pedra - - Baixando terreno + + Um modo compacto de armazenar Ferro. - - Alternando para jogo offline + + Bloco de Ferro - - Aguarde enquanto o host salva o jogo + + Degrau de Carvalho - - Entrando no FINAL + + Degrau de Arenito - - Saindo do FINAL + + Degrau de Pedra - - Esta cama está ocupada + + Um modo compacto de armazenar Ouro. - - Você só pode dormir à noite + + Flor - - %s está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. + + Lã Branca - - A cama de sua casa estava desaparecida ou obstruída + + Lã Laranja - - Você não pode descansar agora, há monstros por perto + + Bloco de Ouro - - Você está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. + + Cogumelo - - Ferramentas e Armas + + Rosa - - Armas + + Degrau de Pedregulho - - Alimentos + + Estante de Livros - - Estruturas + + TNT - - Armadura + + Tijolos - - Mecanismos + + Tocha - - Transporte + + Obsidiana - - Decorações + + Pedra de Musgo - - Blocos de Construção + + Degrau: Bloco Submundo - - Redstone e Transporte + + Degrau de Carvalho - - Diversos + + Degrau Bloc.Pedra - - Poções + + Degrau de Tijolo - - Ferramentas, Armas e Armaduras + + Chapa madeira florestal - - Materiais + + Degrau de Bétula - - Sessão finalizada + + Degrau de Abeto - - Dificuldade + + Lã Magenta - - Música + + Folhas de Bétula - - Som + + Folhas de Abeto - - Gama + + Folhas de Carvalho - - Sensibilidade do Jogo + + Vidro - - Sensib. Interface + + Esponja - - Pacífico + + Folhas de floresta - - Fácil + + Folhas - - Normal + + Carvalho - - Difícil + + Abeto - - Neste modo, o jogador ganha energia com o tempo e não há inimigos no ambiente. + + Bétula - - Neste modo, inimigos são gerados no ambiente, mas causam menos danos ao jogador que no modo Normal. + + Madeira de Abeto - - Neste modo, inimigos são gerados no ambiente e causam uma quantidade padrão de danos ao jogador. + + Madeira de Bétula - - 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! + + Madeira de floresta - - Tempo limite de avaliação + + - - Versão completa + + Lã Rosa - - Falha ao entrar no jogo, pois não há espaços restantes + + Lã Cinza - - Digitar texto da placa + + Lã Cinzenta - - Digite uma linha de texto para sua placa + + Lã Azul-clara - - Digitar título + + Lã Amarela - - Digite um título para sua postagem + + Lã Verde-lima - - Digitar legenda + + Lã Ciano - - Digite uma legenda para sua postagem + + Lã Verde - - Digitar descrição + + Lã Vermelha - - Digite uma descrição para sua postagem + + Lã Preta - - Inventário + + Lã Roxa - - Ingredientes + + Lã Azul - - Barraca de Poções + + Lã Marrom - - Baú + + Tocha (Carvão) - - Feitiço + + Glowstone - - Fornalha + + Areia Movediça - - Ingrediente + + Pedra Inflamável - - Combustível + + Bloco Lápis-azul - - Distribuidor + + Minério de Lápis-azul - - Não há ofertas de conteúdo oferecido para download desse tipo disponíveis para este título no momento. + + Portal - - %s entrou no jogo. + + Lanterna de Abóbora - - %s saiu do jogo. + + Cana-de-açúcar - - %s foi expulso do jogo. + + Argila - - Tem certeza de que deseja excluir este jogo salvo? + + Cacto - - A confirmar + + Abóbora - - Censurado + + Cerca - - Tocando agora: + + Jukebox - - Redefinir Configurações + + Um modo compacto de armazenar Lápis-azul. - - Tem certeza de que deseja redefinir suas configurações para os valores padrão? + + Alçapão - - Erro de carregamento + + Baú Trancado - - Jogo de %s + + Diodo - - Jogo com host desconhecido + + Pistão Aderente - - Convidado saiu + + Pistão - - Um jogador convidado saiu, fazendo todos os jogadores convidados serem removidos do jogo. + + Lã (qualquer cor) - - Entrar + + Arbusto Seco - - Você não está conectado. Para jogar este jogo, você deve estar conectado. Deseja conectar agora? + + Bolo - - Multijogador não é permitido + + Bloco de Nota - - Falha ao criar jogo + + Distribuidor - - Seleção automática + + Grama Alta - - Nenhum pacote: Capas padrão + + Teia - - Capas favoritas + + Cama - - Nível banido + + Gelo - - 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. + + Bancada - - Banir este nível? + + Um modo compacto de armazenar Diamantes. - - Tem certeza de que deseja adicionar este nível à lista de níveis banidos? -Selecionar OK também fechará este jogo. + + Bloco de Diamante - - Remover da Lista de Banidos + + Fornalha - - Intervalo Salv. Autom. + + Campo - - Intervalo Salv. Autom.: DESL. + + Colheitas - - Min. + + Minério de Diamante - - Não é possível colocar aqui! + + Criador de Monstros - - Não é permitido colocar lava perto do ponto de criação do nível devido à possibilidade de morte imediata dos jogadores criados. + + Fogo - - Opacidade da interface + + Tocha (Carvão Vegetal) - - Preparando salvamento automático do nível + + Pó de Redstone - - Tamanho do HUD + + Baú - - Tamanho do HUD (tela dividida) + + Escada de Carvalho - - Semente + + Placa - - Desbloquear pacote de capas + + Minério de Redstone - - Para usar a capa selecionada, você precisa desbloquear este pacote de capas. -Deseja desbloquear o pacote de capas agora? + + Porta de Ferro - - Desbloquear pacote de textura + + Chapa de Pressão - - Para usar este pacote de textura no seu mundo, você precisa desbloqueá-lo. -Você deseja desbloquear agora? + + Neve - - Pacote de texturas para avaliação + + Botã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? + + Tocha de Redstone - - Pacote de textura não disponível + + Alavanca - - Desbloquear a versão completa + + Trilho - - Fazer download da versão de avaliação + + Escada de Mão - - Fazer download da versão completa + + Porta de Madeira - - 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? + + Escadas de Pedra - - Obter versão de avaliação + + Trilho Detector - - Obter versão completa + + Trilho com Propulsão - - Expulsar + + Você coletou pedregulho suficiente para construir uma fornalha. Use a bancada para criar uma. - - Tem certeza de que deseja expulsar este jogador do jogo? Eles não poderão entrar de novo até que você reinicie o mundo. + + Vara de Pescar - - Pacotes de imagens do jogador + + Relógio - - Temas + + Pó de Glowstone - - Pacotes de capas + + Carrinho com Fornalha - - Permite os amigos dos amigos + + Ovo - - Você não pode entrar neste jogo porque ele foi limitado aos jogadores que são amigos do host. + + Bússola - - Não é possível entrar no jogo + + Peixe Cru - - Selecionado + + Rosa Vermelha - - Capa selecionada: + + Verde Cacto - - Conteúdo oferecido para download corrompido + + Grãos de Cacau - - Este conteúdo oferecido para download está corrompido e não pode ser usado. Você deve excluí-lo e reinstalá-lo a partir do menu da Loja Minecraft. + + Peixe Cozido - - Alguns conteúdos oferecidos para download estão corrompidos e não podem ser usados. Você deve excluí-los e reinstalá-los a partir do menu da Loja Minecraft. + + Corante em Pó - - Seu modo de jogo foi alterado + + Saco de Tinta - - Renomeie seu mundo + + Carrinho com Baú - - Digite o novo nome para seu mundo + + Bola de Neve - - Modo de jogo: Sobrevivência + + Barco - - Modo de jogo: Criativo + + Couro - - Sobrevivência + + Carrinho de Minas - - Criativo + + Sela - - Criado em Sobrevivência + + Redstone - - Criado em Criativo + + Balde de Leite - - Renderizar Nuvens + + Papel - - O que deseja fazer com este jogo salvo? + + Livro - - Renomear salvamento + + Slimeball - - Salvando automaticamente em %d... + + Tijolo - - Ativado + + Argila - - Desativado + + Cana-de-açúcar - - Normal + + Lápis-azul - - Superplano + + Mapa - - Quando habilitado, o jogo será um jogo online. + + Disco - "13" - - Quando habilitado, apenas jogadores convidados poderão entrar. + + Disco de Música - "cat" - - Quando habilitado, os amigos das pessoas em sua Lista de Amigos poderão entrar no jogo. + + Cama - - Quando habilitado, os jogadores podem causar danos a outros jogadores. Afeta somente o modo Sobrevivência. + + Repetidor de Redstone - - Quando desabilitado, os jogadores que entrarem no jogo não poderão construir nem minerar sem autorização. + + Biscoito - - Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. + + Disco de Música - "blocks" - - Quando habilitado, a TNT explodirá quando ativada. + + Disco de Música - "mellohi" - - Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes. + + Disco de Música - "stal" - - Quando habilitado, estruturas como Vilas e Fortalezas serão geradas no mundo. + + Disco de Música - "strad" - - Quando habilitado, um mundo completamente plano será gerado na Superfície e no Submundo. + + Disco de Música - "chirp" - - Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador. + + Disco de Música - "far" - - Pacotes de capas + + Disco de Música - "mall" - - Temas + + Bolo - - Imagens do jogador + + Corante Cinza - - Itens de avatar + + Corante Rosa - - Pacotes de texturas + + Corante Verde-lima - - Pacotes de combinações + + Corante Roxo - - {*PLAYER*} incendiou-se + + Corante Ciano - - {*PLAYER*} queimou até a morte + + Corante Cinzento - - {*PLAYER*} tentou nadar na lava + + Amarelo-narciso - - {*PLAYER*} asfixiou-se em uma parede + + Farelo de Osso - - {*PLAYER*} afogou-se + + Osso - - {*PLAYER*} morreu de fome + + Açúcar - - {*PLAYER*} foi espetado até a morte + + Corante Azul-claro - - {*PLAYER*} atingiu o chão com muita força + + Corante Magenta - - {*PLAYER*} caiu para fora do mundo + + Corante Laranja - - {*PLAYER*} morreu + + Placa - - {*PLAYER*} explodiu + + Túnica de Couro - - {*PLAYER*} foi morto por magia + + Peitoral de Ferro - - {*PLAYER*} foi morto pelo sopro do Dragão Ender + + Peitoral de Diamante - - {*PLAYER*} foi assassinado por {*SOURCE*} + + Capacete de Ferro - - {*PLAYER*} foi assassinado por {*SOURCE*} + + Capacete de Diamante - - {*PLAYER*} levou um tiro de {*SOURCE*} + + Capacete de Ouro - - {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + + Peitoral de Ouro - - {*PLAYER*} foi esmurrado por {*SOURCE*} + + Perneiras de Ouro - - {*PLAYER*} foi morto por {*SOURCE*} + + Botas de Couro - - Neblina Base + + Botas de Ferro - - Exibir HUD + + Calças de Couro - - Exibir Mão + + Perneiras de Ferro - - Mensagens de Morte + + Perneiras de Diamante - - Personagem Animado + + Chapéu de Couro - - Anim. capa personalizada + + Enxada de Pedra - - Você não pode mais minerar nem usar itens + + Enxada de Ferro - - Agora você pode minerar e usar itens + + Enxada de Diamante - - Você não pode mais colocar blocos + + Machado de Diamante - - Agora você pode colocar blocos + + Machado de Ouro - - Agora você pode usar portas e acionadores + + Enxada de Madeira - - Você não pode mais usar portas e acionadores + + Enxada de Ouro - - Agora você pode usar recipientes (por exemplo, baús) + + Peitoral de Malha - - Você não pode mais usar recipientes (por exemplo, baús) + + Perneiras de Malha - - Você não pode mais atacar multidões + + Botas de Malha - - Agora você pode atacar multidões + + Porta de Madeira - - Você não pode mais atacar jogadores + + Porta de Ferro - - Agora você pode atacar jogadores + + Capacete de Malha - - Você não pode mais atacar animais + + Botas de Diamante - - Agora você pode atacar animais + + Pena - - Agora você é um moderador + + Pólvora - - Você não é mais um moderador + + Sementes de Trigo - - Agora você pode voar + + Vasilha - - Você não pode mais voar + + Sopa de Cogumelo - - Você não vai mais ficar cansado + + Fio - - Agora você vai ficar cansado + + Trigo - - Agora você é invisível + + Costeleta de Porco Cozida - - Você não é mais invisível + + Pintura - - Agora você é invulnerável + + Maçã de Ouro - - Você não é mais invulnerável + + Pão - - %d MSP + + Sílex - - Dragão Ender + + Costeleta de Porco Crua - - %s entrou no Final + + Vareta - - %s saiu do Final + + Balde - - {*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 que os jogadores pudessem 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á segura 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*} + + Balde de Água - - {*C2*}Respire fundo agora. Respire novamente. Sinta o ar em seus pulmões. Deixe seus braços voltarem. Isso, mova seus dedos. Sinta seu corpo novamente, sob a gravidade, no ar. Volte a existir no longo sonho. Aí está você. Seu corpo tocando o universo novamente em cada ponto, como se você fosse coisas separadas. Como se nós fôssemos 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 infinito 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*} + + Balde de Lava - - {*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*} + + Botas de Ouro - - Reiniciar Submundo + + Barra de Ferro - - Tem certeza de que quer redefinir o Submundo para o estado padrão neste jogo salvo? Você perderá tudo o que construiu no Submundo! + + Barra de Ouro - - Reiniciar Submundo + + Sílex e Aço - - Não redefinir Submundo + + Carvão - - Não é possível cortar este Vacogumelo no momento. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. + + Carvão Vegetal - - Não é possível usar o Ovo de Criação no momento. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. + + Diamante - - Não é possível usar o Ovo de Criação no momento. O número máximo de vacogumelos foi alcançado. + + Maçã - - Não é possível usar o Ovo de Criação no momento. O número máximo de lobos em um mundo foi alcançado. + + Arco - - Não é possível usar o Ovo de Criação no momento. O número máximo de frangos em um mundo foi alcançado. + + Flecha - - Não é possível usar o Ovo de Criação no momento. O número máximo de lulas em um mundo foi alcançado. + + Disco de Música - "ward" - - 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. + + + 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*} + - - 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. + + + Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo de itens que deseja fabricar. Selecione o grupo de ferramentas.{*ToolsIcon*} + - - O número máximo de pinturas/quadros de itens foi alcançado. + + + 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. + - - Você não pode gerar inimigos no Modo Pacífico. + + + 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. + - - Este animal não pode entrar em Modo Amor. O número máximo de Porcos, Ovelhas, Vacas e Gatos de criação foi alcançado. + + + 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*} + - - Este animal não pode entrar em Modo Amor. O número máximo de lobos foi alcançado. + + + 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*} + - - Este animal não pode entrar em Modo Amor. O número máximo de frangos foi alcançado. + + 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*} - - Este animal não pode entrar em Modo Amor. O número máximo de vacogumelos foi alcançado. + + + 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. + - - O número máximo de barcos em um mundo foi alcançado. + + +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. + - - O número máximo de Cabeças de multidão no mundo foi alcançado. + + +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. + - - Inverter + + + A lista dos ingredientes necessários para fabricar o item é exibida. + - - Canhoto + + + A descrição do item selecionado é exibida. Com a descrição você pode ter uma ideia de como o item pode ser usado. + - - Morreu! + + + 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. + - - Renascer + + + Alguns itens não podem ser criados usando a bancada, mas precisam da fornalha. Fabrique a fornalha agora.{*FurnaceIcon*} + - - Ofertas de conteúdo oferecido para download + + Cascalho - - Alterar Capa + + Minério de Ouro - - Como Jogar + + Minério de Ferro - - Controles + + Lava - - Configurações + + Areia - - Créditos + + Arenito - - Reinstalar Conteúdo + + Minério de Carvão - - Configurações de Depuração + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a fornalha. + - - Fogo Espalha + + + 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. + - - TNT Explode + + + 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. + - - Jogador x Jogador + + Madeira - - Confiar nos Jogadores + + Madeira de Carvalho - - Privilégios do Host + + + Você precisa colocar um pouco de combustível na abertura inferior da fornalha e o item a ser transformado na abertura superior. A fornalha acenderá e começará a funcionar, colocando o resultado na abertura à direita. + - - Gerar Estruturas + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar novamente o inventário. + - - Mundo Superplano + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário. + - - Baú de Bônus + + 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. + - - Opções de Mundo + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + - - Pode Construir e Minerar + + +Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item. + - - Pode Usar Portas e Acionadores + + +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. + - - Pode Abrir Recipientes + + +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. + - - Pode Atacar Jogadores + + + Você concluiu a primeira parte do tutorial. + - - Pode Atacar Animais + + Use a fornalha para criar vidro. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? - - Moderador + + Use a fornalha para criar carvão vegetal. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? - - Expulsar + + Use{*CONTROLLER_ACTION_USE*} para colocar a fornalha no mundo e abra-a. - - Pode Voar + + À 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*} - - Desabilitar Exaustão + + Use{*CONTROLLER_ACTION_USE*} para colocar a porta. Você pode usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. - - Invisível + + 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*} - - Opções do Host + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + - - Jogadores/Convidar + + +Esta é a interface de fabricação. Esta interface de fabricação lhe permite combinar os itens coletados para fazer novos itens. + - - Jogo online + + +Pressione{*CONTROLLER_VK_B*} agora para sair do inventário do modo criativo. + - - Só convidados + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + - - Mais Opções + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar os ingredientes necessários para fazer o item atual. + - - Carregar + + {*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar a descrição do item. + - - Novo mundo + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber fabricar. + - - Nome do Mundo + + +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. + - - Semente para Criação de Mundo + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o inventário do modo criativo. + - - Deixar em branco para semente aleatória + + + 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. + - - Jogadores + + + Pressione{*CONTROLLER_VK_B*} agora para sair do inventário. + - - Entrar no Jogo + + +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*}. + - - Iniciar jogo + + +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. + - - Nenhum Jogo Encontrado + + +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. + - - Jogar + + Água - - Placares de Líderes + + Garrafa de Vidro - - Ajuda e Opções + + Garrafa de Água - - Desbloquear jogo completo + + Olho de Aranha - - Continuar Jogo + + Pepita de Ouro - - Salvar Jogo + + Verruga do Submundo - - Dificuldade: + + {*prefix*}Poção {*postfix*} {*splash*} - - Tipo de Jogo: + + Olho Aranha Ferm. - - Estruturas: + + Caldeirão - - Tipo de Nível: + + Olho de Ender - - JxJ: + + Melão Cintilante - - Confiar Jogadores: + + Pó de Chamas - - TNT: + + Creme de Magma - - Fogo Espalha: + + Barraca de Poções - - Reinstalar Tema + + Lágrima de Ghast - - Reinstalar Imagem do Jogador 1 + + Sementes de Abóbora - - Reinstalar Imagem do Jogador 2 + + Sementes de Melão - - Reinstalar Item de Avatar 1 + + Frango Cru - - Reinstalar Item de Avatar 2 + + Disco - "11" - - Reinstalar Item de Avatar 3 + + Disco de Música - "where are we now" - - Opções + + Tosquiadeira - - Áudio + + Frango Cozido - - Controle + + Pérola do Ender - - Gráficos + + Fatia de Melão - - Interface do Usuário + + Vara de Chamas - - Restaurar Padrões + + Carne Crua - - Exibição de oscilação + + Bife - - Dicas + + Carne Podre - - Dicas: Ferramentas do Jogo + + Garrafa de Feitiços - - Dividir Tela para 2 Jogadores + + Tábuas de Carvalho - - Concluído + + Tábuas de Abeto - - Editar mensagem da placa: + + Tábuas de Bétula - - Preencha os detalhes que acompanharão sua captura de tela + + Bloco de Grama - - Legenda + + Terra - - Captura de tela do jogo + + Pedregulho - - Editar mensagem da placa: + + Tábuas da Selva - - Texturas, ícones e interface do usuário clássicos do Minecraft! + + Muda de Bétula - - Exibir todos os Mundos de Combinações + + Broto de árvore da floresta - - Sem efeitos + + Pedra Indestrutível - - Rapidez + + Muda - - Lentidão + + Muda de Carvalho - - Pressa + + Muda de Abeto - - Fadiga do Minerador + + Pedra - - Força + + Quadro de Item - - Fraqueza + + Criar {*CREATURE*} - - Saúde Imediata + + Bloco do Submundo - - Dano Imediato + + Carga de Fogo - - Salto Turbinado + + Carga Fogo: Carv. Veg. - - Náuseas + + Carga Fogo: Carvão - - Regeneração + + Caveira - - Resistência + + Cabeça - - Resistência ao Fogo + + Cabeça de %s - - Respirar na Água + + Cabeça de creeper - - Invisibilidade + + Caveira do esqueleto - - Cegueira + + Caveira do esqueleto murcho - - Visão Noturna + + Cabeça de zumbi - - Fome + + Um modo compacto de armazenar Carvão. Pode ser usado como combustível na Fornalha. Veneno - - de Rapidez + + Fome de Lentidão - - de Pressa + + de Rapidez - - de Lentidão + + Invisibilidade - - de Força + + Respirar na Água - - de Fraqueza + + Visão Noturna - - de Cura + + Cegueira de Dano - - de Salto + + de Cura de Náuseas @@ -5225,29 +6144,38 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? de Regeneração - - de Resistência + + de Lentidão - - de Resistência ao Fogo + + de Pressa - - de Respirar na Água + + de Fraqueza + + + de Força + + + Resistência ao Fogo - - de Invisibilidade + + Saturação - - de Cegueira + + de Resistência - - de Visão Noturna + + de Salto - - de Fome + + Wither - - de Veneno + + Impulso de Energia + + + Absorção @@ -5258,29 +6186,41 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? III + + de Invisibilidade + IV - - De Lançamento + + de Respirar na Água - - Mundana + + de Resistência ao Fogo - - Desinteressante + + de Visão Noturna - - Tranquila + + de Veneno - - Limpa + + de Fome - - Leitosa + + da Absorção - - Difusa + + da Saturação + + + do Impulso de Energia + + + de Cegueira + + + da Decadência Sem Artifícios @@ -5288,17 +6228,17 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Fina - - Maligna + + Difusa - - Plana + + Limpa - - Grande + + Leitosa - - Desajeitada + + Maligna Amanteigada @@ -5306,246 +6246,300 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Suave - - Suave + + Desajeitada - - Sofisticada + + Plana - - Grossa + + Grande - - Elegante + + Tranquila - - Chique + + De Lançamento - - Charmosa + + Mundana + + + Desinteressante Ousada - - Refinada - Cordial + + Charmosa + + + Elegante + + + Chique + Cintilante + + Classificação + + + Severa + + + Inodora + Potente Desagradável - - Inodora + + Suave - - Classificação + + Refinada - - Severa + + Grossa - - Amarga + + Sofisticada - - Grosseira + + Restaura a saúde dos jogadores, animais e monstros afetados com o tempo. - - Fedida + + Reduz imediatamente a saúde dos jogadores, animais e monstros afetados. - - Usada como base de todas as poções. Use em uma barraca de poções para criar poções. + + Torna os jogadores, animais e monstros afetados imunes a danos do fogo, lava e ataques de Chamas à distância. 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. + + Amarga 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 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. + + Aumenta imediatamente a saúde dos jogadores, animais e monstros afetados. + Reduz os danos causados pelos jogadores e monstros afetados durante o ataque. - - Aumenta imediatamente a saúde dos jogadores, animais e monstros afetados. + + Usada como base de todas as poções. Use em uma barraca de poções para criar poções. - - Reduz imediatamente a saúde dos jogadores, animais e monstros afetados. + + Grosseira - - Restaura a saúde dos jogadores, animais e monstros afetados com o tempo. + + Fedida - - Torna os jogadores, animais e monstros afetados imunes a danos do fogo, lava e ataques de Chamas à distância. + + Atacar + + + Nitidez Reduz a saúde dos jogadores, animais e monstros afetados com o tempo. - - Nitidez + + Dano de Ataque - - Atacar + + Coice Veneno de Artrópodes - - Coice + + Rapidez - - Aspecto de Fogo + + Reforços zumbis - - Proteção + + Força do Salto do Cavalo + + + Ao ser aplicado: + + + Resistência a Coice + + + Alcance de perseguição da multidão + + + Energia máxima + + + Toque de Seda + + + Eficiência + + + Afinidade com a Água + + + Sorte + + + Pilhagem + + + Inquebrável Proteção contra Fogo + + Proteção + + + Aspecto de Fogo + Queda de Pena - - Proteção contra Explosão + + Respiração Proteção contra Projétil - - Respiração - - - Afinidade com a Água + + Proteção contra Explosão - - Eficiência + + IV - - Toque de Seda + + V - - Inquebrável + + VI - - Pilhagem + + Soco - - Sorte + + VII - - Poder + + III Chama - - Soco + + Poder Infinito - - I - - - II - - - III + + II - - IV + + I - - V + + É ativado quando uma entidade passa por um Detonador conectado. - - VI + + Ativa um Gancho de Detonação conectado quando uma entidade passa por ele. - - VII + + Um modo compacto de armazenar Esmeraldas. - - VIII + + Semelhante a um Baú, exceto que os itens colocados em um Baú de Ender estão disponíveis em todos os Baús de Ender do jogador, mesmo em dimensões diferentes. IX - - X + + VIII Pode ser extraído com uma picareta de Ferro ou de material melhor para coletar Esmeraldas. - - Semelhante a um Baú, exceto que os itens colocados em um Baú de Ender estão disponíveis em todos os Baús de Ender do jogador, mesmo em dimensões diferentes. - - - É ativado quando uma entidade passa por um Detonador conectado. + + X - - Ativa um Gancho de Detonação conectado quando uma entidade passa por ele. + + Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma cenoura dourada. Pode ser plantada no campo. - - Um modo compacto de armazenar Esmeraldas. + + Usado como decoração. Flores, Mudas, Cactos e Cogumelos podem ser plantados nele. Uma parede feita de Pedregulho. - - Pode ser usada para consertar armas, ferramentas e armadura. + + Restaura 0,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser plantada no campo. Fundido em uma fornalha para produzir Quartzo do Submundo. - - Usado como decoração. + + Pode ser usada para consertar armas, ferramentas e armadura. Pode ser comercializada com os aldeões. - - Usado como decoração. Flores, Mudas, Cactos e Cogumelos podem ser plantados nele. + + Usado como decoração. - - Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma cenoura dourada. Pode ser plantada no campo. + + Restaura 4{*ICON_SHANK_01*}. - - Restaura 0,5{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser plantada no campo. + + Restaura 1{*ICON_SHANK_01*}. Comê-la pode envenenar você. + + + Usada para controlar um porco selado ao andar nele. Restaura 3{*ICON_SHANK_01*}. Criada ao cozinhar uma batata na fornalha. - - Restaura 1{*ICON_SHANK_01*}, ou pode ser cozida na fornalha. Pode ser plantada no campo. Comê-la pode envenenar você. - Restaura 3{*ICON_SHANK_01*}. Fabricada com uma Cenoura e Pepitas de Ouro. - - Usada para controlar um porco selado ao andar nele. - - - Restaura 4{*ICON_SHANK_01*}. - Usado com uma Bigorna para enfeitiçar armas, ferramentas ou armaduras. Criado ao extrair Minério de Quartzo do Submundo. Pode ser fabricado em um Bloco de Quartzo. + + Batata + + + Batata Assada + + + Cenoura + Fabricado a partir de Lã. Usado como decoração. @@ -5555,14 +6549,11 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Vaso de Flor - - Cenoura - - - Batata + + Torta de Abóbora - - Batata Assada + + Livro Encantado Batata Envenenada @@ -5573,11 +6564,11 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Cenoura no Palito - - Torta de Abóbora + + Gancho de Detonação - - Livro Encantado + + Detonador Quartzo do Submundo @@ -5588,11 +6579,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Baú de Ender - - Gancho de Detonação - - - Detonador + + Parede com Musgo Bloco de Esmeralda @@ -5600,8 +6588,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Parede de Pedregulho - - Parede com Musgo + + Batatas Vaso de Flor @@ -5609,8 +6597,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Cenouras - - Batatas + + Bigorna um Pouco Danificada Bigorna @@ -5618,8 +6606,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Bigorna - - Bigorna um Pouco Danificada + + Bloco de Quartzo Bigorna Muito Danificada @@ -5627,8 +6615,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Minério de Quartzo do Submundo - - Bloco de Quartzo + + Escada de Quartzo Bloco Esculpido de Quartzo @@ -5636,8 +6624,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Bloco de Pilar de Quartzo - - Escada de Quartzo + + Carpete Vermelho Carpete @@ -5645,8 +6633,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Carpete Preto - - Carpete Vermelho + + Carpete Azul Carpete Verde @@ -5654,9 +6642,6 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Carpete Marrom - - Carpete Azul - Carpete Roxo @@ -5669,18 +6654,18 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Carpete Cinza - - Carpete Rosa - Carpete Verde-lima - - Carpete Amarelo + + Carpete Rosa Carpete Azul-claro + + Carpete Amarelo + Carpete Magenta @@ -5693,72 +6678,77 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Arenito Esculpido - - Arenito Suave - {*PLAYER*} foi morto tentando machucar {*SOURCE*} + + Arenito Suave + {*PLAYER*} foi esmagado por uma Bigorna. {*PLAYER*} foi esmagado por um bloco. - - {*PLAYER*} teleportado até {*DESTINATION*} - {*PLAYER*} teleportou você até a posição dele - - {*PLAYER*} se teleportou até você + + {*PLAYER*} teleportado até {*DESTINATION*} Espinhos - - Degrau de Quartzo + + {*PLAYER*} se teleportou até você Faz as áreas escuras aparecerem como se estivessem à luz do dia, mesmo embaixo d'água. + + Degrau de Quartzo + Torna jogadores, animais e monstros invisíveis. Consertar e Dar nome + + Caro Demais! + Custo do Feitiço: %d - - Caro Demais! + + Você tem: Renomear - - Você tem: + + {*VILLAGER_TYPE*} oferece %s Itens para o comércio - - {*VILLAGER_TYPE*} oferece %s + + Comércio Conserto - - Comércio + + + Esta é a interface da Bigorna, que você pode usar para renomear, consertar e aplicar feitiços a armas, armaduras ou ferramentas, mas custa Níveis de Experiência. + Coleira tingida - + - Esta é a interface da Bigorna, que você pode usar para renomear, consertar e aplicar feitiços a armas, armaduras ou ferramentas, mas custa Níveis de Experiência. + Para começar a trabalhar em um item, coloque-o no primeiro espaço de entrada. @@ -5768,9 +6758,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Pressione{*CONTROLLER_VK_B*} se já conhecer a interface da Bigorna. - + - Para começar a trabalhar em um item, coloque-o no primeiro espaço de entrada. + Outra opção é colocar um segundo item idêntico no segundo espaço para combinar os dois itens. @@ -5778,9 +6768,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Quando a matéria-prima correta for colocada no segundo espaço de entrada (por exemplo, Barras de Ferro para uma Espada de Ferro danificada), o conserto proposto aparece no espaço de saída. - + - Outra opção é colocar um segundo item idêntico no segundo espaço para combinar os dois itens. + 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 conserto não será realizado. @@ -5788,9 +6778,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Para enfeitiçar os itens na Bigorna, coloque um Livro Encantado no segundo espaço de entrada. - + - 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 conserto não será realizado. + Pegar o item consertado consumirá os dois itens usados pela Bigorna e diminuirá seu Nível de Experiência de acordo com o valor dado. @@ -5798,9 +6788,11 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? É possível renomear o item editando o nome mostrado na caixa de texto. - + - Pegar o item consertado consumirá os dois itens usados pela Bigorna e diminuirá seu Nível de Experiência de acordo com o valor dado. + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a Bigorna.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre a Bigorna. @@ -5808,11 +6800,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? 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 já souber sobre a Bigorna. + Livros Encantados podem ser encontrados dentro de Baús em calabouços ou enfeitiçados a partir de Livros normais na Mesa de Feitiços. @@ -5820,9 +6810,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Ao usar uma Bigorna, armas e ferramentas podem ser consertadas para restaurar sua durabilidade, renomeadas ou enfeitiçadas com Livros Encantados. - + - Livros Encantados podem ser encontrados dentro de Baús em calabouços ou enfeitiçados a partir de Livros normais na Mesa de Feitiços. + Tipo de trabalho a ser realizado, valor do item, número de feitiços e a quantidade de trabalho anterior afetarão o custo do conserto. @@ -5830,9 +6820,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? O uso da Bigorna custa Níveis de Experiência, e ela pode ser danificada sempre que for usada. - + - Tipo de trabalho a ser realizado, valor do item, número de feitiços e a quantidade de trabalho anterior afetarão o custo do conserto. + No Baú desta área, você encontrará Picaretas danificadas, matérias-primas, Garrafas de Feitiços e Livros Encantados para realizar experimentos. @@ -5840,9 +6830,11 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? A renomeação de um item muda o nome exibido para todos os jogadores e reduz de modo permanente o custo do trabalho anterior. - + - No Baú desta área, você encontrará Picaretas danificadas, matérias-primas, Garrafas de Feitiços e Livros Encantados para realizar experimentos. + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de comércio.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre a interface de comércio. @@ -5850,11 +6842,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Esta é a interface de comércio que mostra as trocas que podem ser feitas com um aldeão. - + - {*B*} - Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de comércio.{*B*} - Pressione{*CONTROLLER_VK_B*} se já souber sobre a interface de comércio. + As trocas comerciais aparecerão em vermelho e não estarão disponíveis se você não tiver os itens necessários. @@ -5862,9 +6852,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Todas as trocas comerciais que o aldeão estiver disposto a fazer no momento serão exibidas na parte superior. - + - As trocas comerciais aparecerão em vermelho e não estarão disponíveis se você não tiver os itens necessários. + Você pode ver o número total dos itens necessários para a troca nas duas caixas à esquerda. @@ -5872,9 +6862,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? A quantidade e o tipo de itens que você dará ao aldeão são mostrados nas duas caixas à esquerda. - + - Você pode ver o número total dos itens necessários para a troca nas duas caixas à esquerda. + Nesta área há um aldeão e um Baú contendo Papel para comprar itens. @@ -5882,9 +6872,9 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Pressione{*CONTROLLER_VK_A*} para trocar os itens que o aldeão exige pelo item em oferta. - + - Nesta área há um aldeão e um Baú contendo Papel para comprar itens. + Os jogadores podem comercializar itens de seu inventário com os aldeões. @@ -5894,19 +6884,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Pressione{*CONTROLLER_VK_B*} se já souber sobre o comércio. - + - Os jogadores podem comercializar itens de seu inventário com os aldeões. + Realizar uma série de trocas comerciais adicionará ou atualizará de modo aleatório as trocas disponíveis do aldeão. As trocas comerciais que um aldeão pode oferecer dependem da profissão dele. - - - - - Realizar uma série de trocas comerciais adicionará ou atualizará de modo aleatório as trocas disponíveis do aldeão. @@ -6068,7 +7053,4 @@ Todos os Baús de Ender em um mundo estão associados. Os itens colocados em um Curar - - Procurando Semente para Criação de Mundo - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsPlatformSpecific.xml index 19247c9a..eb38115c 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pt-BR/stringsPlatformSpecific.xml @@ -1,243 +1,245 @@  - - NOT USED + + Deseja iniciar sessão na "PSN"? - - Você pode usar a tela de toque no sistema PlayStation®Vita para navegar pelos menus! + + Para os jogadores que não estiverem no mesmo sistema PlayStation®Vita que o jogador host, selecionar esta opção faz o jogador e todos os jogadores que estiverem no sistema PlayStation®Vita dele serem expulsos do jogo. Este jogador não poderá voltar ao jogo até que ele seja reiniciado. - - O minecraftforum tem uma seção dedicada à PlayStation®Vita Edition. + + Botão SELECT - - Você receberá as últimas informações sobre este jogo de @4JStudios e @Kappische no twitter! + + Esta opção desativa as atualizações de troféus 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. - - Não olhe nos olhos de um Enderman! + + Sistema PlayStation®Vita - - Acreditamos que a 4J Studios removeu Herobrine do jogo no sistema PlayStation®Vita, mas não temos certeza. + + Escolha Rede Ad Hoc para se conectar com outros sistemas PlayStation®Vita nas proximidades, ou "PSN" para se conectar com amigos do mundo inteiro. - - Minecraft: PlayStation®Vita Edition bateu muitos recordes! + + Rede Ad Hoc - - {*T3*}COMO JOGAR: MULTIJOGADOR{*ETW*}{*B*}{*B*} -O Minecraft no sistema PlayStation®Vita é um jogo multijogador por padrão.{*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).{*B*} -Quando estiver em um jogo, você poderá pressionar o botão SELECT para ver a lista de todos os outros jogadores e expulsar jogadores do jogo. + + Alterar Modo de Rede - - {*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*} -IDs online não serão exibidas na captura de tela. + + Selecionar Modo de Rede - - {*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 troféus 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*} para a frente duas vezes rapidamente ao voar. -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. + + IDs online na tela dividida - - 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 os botões de direção para se mover para cima, para baixo, para a esquerda ou para a direita. + + Troféus - - NOT USED + + Este jogo tem o recurso de salvamento automático de nível. Quando o ícone acima é exibido, o jogo está salvando seus dados. +Não desligue seu sistema PlayStation®Vita enquanto o ícone estiver na tela. - - NOT USED + + Quando habilitado, o host pode alternar o voo, desabilitar exaustão e ficar invisível pelo menu do jogo. Desabilita atualizações de troféus e de placar de líderes. - - "NÃO USADO" + + IDs online: - - "NÃO USADO" + + Você está usando a versão de avaliação de um pacote de texturas. Você terá acesso ao conteúdo completo do pacote de texturas, mas não poderá salvar seu progresso. +Se tentar salvar enquanto estiver usando a versão de avaliação, a versão completa será oferecida para compra. + - - Convidar Amigos + + Patch 1.04 (Atualização do jogo 14) - - Se você criar, carregar ou salvar um mundo no Modo Criativo, esse mundo terá desabilitadas as atualizações de troféus e de placares de líderes, mesmo que seja carregado no Modo Sobrevivência. Tem certeza de que deseja continuar? + + IDs online no jogo - - Este mundo já foi salvo no Modo Criativo e as atualizações de troféus e de placares de líderes estarão desabilitadas nele. Tem certeza de que deseja continuar? + + Vejam o que eu fiz no Minecraft: PlayStation®Vita Edition! - - Este mundo já foi salvo no Modo Criativo e terá as atualizações de troféus e de placar de líderes desabilitadas. + + Falha no download. Tente novamente mais tarde. - - Se você criar, carregar ou salvar um mundo com os Privilégios do Host habilitados, esse mundo terá desabilitadas as atualizações de troféus e de placares de líderes, mesmo que ele seja posteriormente carregado com essas opções desativadas. Tem certeza de que deseja continuar? + + Falha ao entrar no jogo devido a um tipo NAT restritivo. Confira sua configuração de rede. - - A conexão com a "PSN" foi perdida. Saindo para o menu principal. + + Falha no upload. Tente novamente mais tarde. - - A conexão com a "PSN" foi perdida. + + Download concluído! - - Esta é a versão de avaliação do jogo Minecraft: PlayStation®Vita Edition. Se você já tem a versão completa do jogo, acabou de ganhar um troféu! -Desbloqueie a versão completa do jogo para curtir a diversão de Minecraft: PlayStation®Vita Edition e jogue com seus amigos ao redor do mundo na "PSN". -Deseja desbloquear a versão completa do jogo? + + +Não há nenhum salvamento disponível na área de transferência de salvamentos no momento. +Você pode fazer upload de um salvamento de mundo para a área de transferência de salvamentos do Minecraft: PlayStation®3 Edition e depois fazer download dele com o Minecraft: PlayStation®Vita Edition. + - - Esta é a versão de avaliação do jogo Minecraft: PlayStation®Vita Edition. Se você já tem a versão completa do jogo, acabou de ganhar um tema! -Desbloqueie a versão completa do jogo para curtir a diversão de Minecraft: PlayStation®Vita Edition e jogue com seus amigos ao redor do mundo na "PSN". -Deseja desbloquear a versão completa do jogo? + + Salvamento não concluído - - Esta é a versão de avaliação do jogo Minecraft: PlayStation®Vita Edition. Você precisa ter a versão completa do jogo para poder aceitar este convite. -Deseja desbloquear a versão completa do jogo? + + O Minecraft: PlayStation®Vita Edition está sem espaço para salvar os dados. Para criar mais espaço, remova outros salvamentos do Minecraft: PlayStation®Vita Edition. - - Os jogadores convidados não podem desbloquear a versão completa do jogo. Inicie a sessão com a conta da Sony Entertainment Network. + + Upload cancelado - - ID online + + Você cancelou o upload deste salvamento para a área de transferência de salvamentos. - - Poções + + Upload de salvamento para PS3™/PS4™ - - Você retornou à tela de título porque sua sessão da "PSN" foi finalizada. - + + Fazendo upload de dados : %d%% - - Você já jogou a versão de avaliação de Minecraft: PlayStation®Vita Edition pelo máximo de tempo permitido! Para continuar a diversão, gostaria de desbloquear a versão completa do jogo? + + "PSN" - - "Minecraft: PlayStation®Vita Edition" falhou ao carregar e não é possível continuar. + + Download dados PS3™ - - Falha ao entrar no jogo, pois um ou mais jogadores não têm permissão para jogos online devido a restrições de bate-papo da conta da Sony Entertainment Network. + + Fazendo download de dados : %d%% - - Falha ao criar um jogo online pois um ou mais jogadores não têm permissão para jogos online devido a restrições de bate-papo da conta da Sony Entertainment Network. Desmarque a caixa "Jogo Online" em "Mais Opções" para iniciar um jogo offline. + + Salvando - - Você não tem permissão para entrar nesta sessão de jogo, pois o status online está desativado em sua conta da Sony Entertainment Network devido a restrições de bate-papo. + + Upload concluído! - - Você não tem permissão para entrar nesta sessão de jogo, pois um dos jogadores locais está com o status online desativado em sua conta da Sony Entertainment Network devido a restrições de bate-papo. Desmarque a caixa "Jogo Online" em "Mais Opções" para iniciar um jogo offline. + + Tem certeza que deseja fazer upload deste salvamento e sobrescrever o salvamento atual que está na área de transferência de salvamento? - - Você não tem permissão para criar esta sessão de jogo, pois um dos jogadores locais está com o status online desativado em sua conta da Sony Entertainment Network devido a restrições de bate-papo. Desmarque a caixa "Jogo Online" em "Mais Opções" para iniciar um jogo offline. + + Convertendo dados - - Este jogo tem o recurso de salvamento automático de nível. Quando o ícone acima é exibido, o jogo está salvando seus dados. -Não desligue seu sistema PlayStation®Vita enquanto o ícone estiver na tela. + + NOT USED - - Quando habilitado, o host pode alternar o voo, desabilitar exaustão e ficar invisível pelo menu do jogo. Desabilita atualizações de troféus e de placar de líderes. + + NOT USED - - IDs online na tela dividida + + {*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 troféus 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*} para a frente duas vezes rapidamente ao voar. +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. - - Troféus + + 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 os botões de direção para se mover para cima, para baixo, para a esquerda ou para a direita. - - IDs online: + + "NÃO USADO" - - IDs online no jogo + + Se você criar, carregar ou salvar um mundo no Modo Criativo, esse mundo terá desabilitadas as atualizações de troféus e de placares de líderes, mesmo que seja carregado no Modo Sobrevivência. Tem certeza de que deseja continuar? - - Vejam o que eu fiz no Minecraft: PlayStation®Vita Edition! + + Este mundo já foi salvo no Modo Criativo e as atualizações de troféus e de placares de líderes estarão desabilitadas nele. Tem certeza de que deseja continuar? - - Você está usando a versão de avaliação de um pacote de texturas. Você terá acesso ao conteúdo completo do pacote de texturas, mas não poderá salvar seu progresso. -Se tentar salvar enquanto estiver usando a versão de avaliação, a versão completa será oferecida para compra. - + + "NÃO USADO" - - Patch 1.04 (Atualização do jogo 14) + + Convidar Amigos - - Botão SELECT + + O minecraftforum tem uma seção dedicada à PlayStation®Vita Edition. - - Esta opção desativa as atualizações de troféus 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. + + Você receberá as últimas informações sobre este jogo de @4JStudios e @Kappische no twitter! - - Deseja iniciar sessão na "PSN"? + + NOT USED - - Para os jogadores que não estiverem no mesmo sistema PlayStation®Vita que o jogador host, selecionar esta opção faz o jogador e todos os jogadores que estiverem no sistema PlayStation®Vita dele serem expulsos do jogo. Este jogador não poderá voltar ao jogo até que ele seja reiniciado. + + Você pode usar a tela de toque no sistema PlayStation®Vita para navegar pelos menus! - - Sistema PlayStation®Vita + + Não olhe nos olhos de um Enderman! - - Alterar Modo de Rede + + {*T3*}COMO JOGAR: MULTIJOGADOR{*ETW*}{*B*}{*B*} +O Minecraft no sistema PlayStation®Vita é um jogo multijogador por padrão.{*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).{*B*} +Quando estiver em um jogo, você poderá pressionar o botão SELECT para ver a lista de todos os outros jogadores e expulsar jogadores do jogo. - - Selecionar Modo de Rede + + {*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*} +IDs online não serão exibidas na captura de tela. - - Escolha Rede Ad Hoc para se conectar com outros sistemas PlayStation®Vita nas proximidades, ou "PSN" para se conectar com amigos do mundo inteiro. + + Acreditamos que a 4J Studios removeu Herobrine do jogo no sistema PlayStation®Vita, mas não temos certeza. - - Rede Ad Hoc + + Minecraft: PlayStation®Vita Edition bateu muitos recordes! - - "PSN" + + Você já jogou a versão de avaliação de Minecraft: PlayStation®Vita Edition pelo máximo de tempo permitido! Para continuar a diversão, gostaria de desbloquear a versão completa do jogo? - - Download dados sistema PlayStation®3 + + "Minecraft: PlayStation®Vita Edition" falhou ao carregar e não é possível continuar. - - Upload de salvamento para sistema PlayStation®3/PlayStation®4 + + Poções - - Upload cancelado + + Você retornou à tela de título porque sua sessão da "PSN" foi finalizada. - - Você cancelou o upload deste salvamento para a área de transferência de salvamentos. + + Falha ao entrar no jogo, pois um ou mais jogadores não têm permissão para jogos online devido a restrições de bate-papo da conta da Sony Entertainment Network. - - Fazendo upload dos dados : %d%% + + Você não tem permissão para entrar nesta sessão de jogo, pois um dos jogadores locais está com o status online desativado em sua conta da Sony Entertainment Network devido a restrições de bate-papo. Desmarque a caixa "Jogo Online" em "Mais Opções" para iniciar um jogo offline. - - Fazendo download dos dados : %d%% + + Você não tem permissão para criar esta sessão de jogo, pois um dos jogadores locais está com o status online desativado em sua conta da Sony Entertainment Network devido a restrições de bate-papo. Desmarque a caixa "Jogo Online" em "Mais Opções" para iniciar um jogo offline. - - Tem certeza que deseja fazer upload deste salvamento e sobrescrever o salvamento atual que está na área de transferência de salvamento? + + Falha ao criar um jogo online pois um ou mais jogadores não têm permissão para jogos online devido a restrições de bate-papo da conta da Sony Entertainment Network. Desmarque a caixa "Jogo Online" em "Mais Opções" para iniciar um jogo offline. - - Convertendo dados + + Você não tem permissão para entrar nesta sessão de jogo, pois o status online está desativado em sua conta da Sony Entertainment Network devido a restrições de bate-papo. - - Salvando + + A conexão com a "PSN" foi perdida. Saindo para o menu principal. - - Upload concluído! + + A conexão com a "PSN" foi perdida. - - Falha ao fazer upload. Tente novamente mais tarde. + + Este mundo já foi salvo no Modo Criativo e terá as atualizações de troféus e de placar de líderes desabilitadas. - - Download concluído! + + Se você criar, carregar ou salvar um mundo com os Privilégios do Host habilitados, esse mundo terá desabilitadas as atualizações de troféus e de placares de líderes, mesmo que ele seja posteriormente carregado com essas opções desativadas. Tem certeza de que deseja continuar? - - Falha ao fazer download. Tente novamente mais tarde. + + Esta é a versão de avaliação do jogo Minecraft: PlayStation®Vita Edition. Se você já tem a versão completa do jogo, acabou de ganhar um troféu! +Desbloqueie a versão completa do jogo para curtir a diversão de Minecraft: PlayStation®Vita Edition e jogue com seus amigos ao redor do mundo na "PSN". +Deseja desbloquear a versão completa do jogo? - - Falha ao entrar no jogo devido a um tipo NAT restritivo. Verifique suas configurações de rede. + + Os jogadores convidados não podem desbloquear a versão completa do jogo. Inicie a sessão com a conta da Sony Entertainment Network. - - - Não há nenhum salvamento disponível na área de transferência de salvamentos no momento. - Você pode fazer upload de um salvamento de mundo para a área de transferência de salvamentos do Minecraft: PlayStation®3 Edition e depois fazer download dele com o Minecraft: PlayStation®Vita Edition. - + + ID online - - Salvamento não concluído + + Esta é a versão de avaliação do jogo Minecraft: PlayStation®Vita Edition. Se você já tem a versão completa do jogo, acabou de ganhar um tema! +Desbloqueie a versão completa do jogo para curtir a diversão de Minecraft: PlayStation®Vita Edition e jogue com seus amigos ao redor do mundo na "PSN". +Deseja desbloquear a versão completa do jogo? - - O Minecraft: PlayStation®Vita Edition está sem espaço para salvar os dados. Para criar mais espaço, remova outros salvamentos do Minecraft: PlayStation®Vita Edition. + + Esta é a versão de avaliação do jogo Minecraft: PlayStation®Vita Edition. Você precisa ter a versão completa do jogo para poder aceitar este convite. +Deseja desbloquear a versão completa do jogo? + + + O arquivo salvo na área de transferência de salvamentos possui um número de versão para o qual o Minecraft: PlayStation®Vita Edition não tem suporte. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-PT/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/4J_stringsPlatformSpecific.xml index 32ada581..09aeda3c 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pt-PT/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/4J_stringsPlatformSpecific.xml @@ -1,52 +1,52 @@  - - O armazenamento do sistema não tem espaço livre suficiente para criar uma gravação de jogo. + + Falha ao guardar as definições para a tua conta Sony Entertainment Network. - - Foste reencaminhado para o ecrã principal porque terminaste a sessão na "PSN". + + Problema com a conta Sony Entertainment Network - - O jogo terminou porque terminaste a sessão na "PSN". - + + Ocorreu um problema ao aceder à tua conta Sony Entertainment Network. Não foi possível atribuir-te o troféu, neste momento. - - Sem sessão iniciada de momento. + + Esta é a versão de avaliação do Minecraft: PlayStation®3 Edition. Se tivesses o jogo completo, terias acabado de ganhar um troféu! +Desbloqueia o jogo completo para viveres a emoção do Minecraft: PlayStation®3 Edition e para jogares com amigos, de todo o mundo, através da "PSN". +Queres desbloquear o jogo completo? - - O jogo tem algumas funcionalidades que requerem uma sessão iniciada na "PSN", mas de momento estás offline. + + Ligar à Rede Ad Hoc + + + Este jogo tem algumas funcionalidades que requerem uma ligação de rede Ad Hoc, mas neste momento estás offline. Rede Ad Hoc offline. - - Este jogo tem algumas funcionalidades que requerem uma ligação de rede Ad Hoc, mas neste momento estás offline. + + Problema com Troféu - - Esta funcionalidade requer uma sessão iniciada na "PSN". + + O jogo terminou porque terminaste a sessão na "PSN". - - Ligar à "PSN". - - - Ligar à Rede Ad Hoc + + Foste reencaminhado para o ecrã principal porque terminaste a sessão na "PSN". - - Problema com Troféu + + O armazenamento do sistema não tem espaço livre suficiente para criar uma gravação de jogo. - - Ocorreu um problema ao aceder à tua conta Sony Entertainment Network. Não foi possível atribuir-te o troféu, neste momento. + + Sem sessão iniciada de momento. - - Problema com a conta Sony Entertainment Network + + Ligar à "PSN". - - Falha ao guardar as definições para a tua conta Sony Entertainment Network. + + Esta funcionalidade requer uma sessão iniciada na "PSN". + - - Esta é a versão de avaliação do Minecraft: PlayStation®3 Edition. Se tivesses o jogo completo, terias acabado de ganhar um troféu! -Desbloqueia o jogo completo para viveres a emoção do Minecraft: PlayStation®3 Edition e para jogares com amigos, de todo o mundo, através da "PSN". -Queres desbloquear o jogo completo? + + O jogo tem algumas funcionalidades que requerem uma sessão iniciada na "PSN", mas de momento estás offline. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-PT/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/AdditionalStrings.xml index 61ca5ac6..2e00b090 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pt-PT/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/AdditionalStrings.xml @@ -48,6 +48,12 @@ O teu ficheiro de Opções está corrompido e precisa de ser apagado. + + Apagar ficheiro de opções. + + + Tentar carregar o ficheiro de opções novamente. + O teu ficheiro Cache de Gravação está corrompido e precisa de ser apagado. @@ -75,6 +81,9 @@ O serviço online está desativado na tua conta Sony Entertainment Network devido às definições de controlo parental para um dos teus jogadores locais. + + As funcionalidades online estão desativadas devido à existência de uma atualização para o jogo. + Não existem ofertas de conteúdos transferíveis disponíveis de momento, para este título. @@ -84,7 +93,4 @@ Por favor, vem jogar um jogo de Minecraft: PlayStation®Vita Edition! - - As funcionalidades online estão desativadas devido à existência de uma atualização para o jogo. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsGeneric.xml index 928dd50e..19403637 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsGeneric.xml @@ -1,5027 +1,5943 @@  - - Novo Conteúdo Transferível disponível! Acede-lhe a partir do botão Loja Minecraft no Menu Principal. + + A mudar para jogo offline - - Podes mudar o aspeto da tua personagem com um Pack de Skins da Loja Minecraft. Seleciona "Loja Minecraft" no Menu Principal para veres o que está ao teu dispor. + + Aguarda enquanto o anfitrião grava o jogo - - Altera as definições de gama para veres o jogo com maior ou menor luminosidade. + + Entrar em O FIM - - Se a dificuldade do jogo for Calmo, a tua saúde irá regenerar automaticamente e não surgirão monstros à noite! + + A gravar jogadores - - Dá um osso a um lobo para o domares. Depois, poderás ordenar-lhe para se sentar ou seguir-te. + + A ligar ao anfitrião - - No Inventário podes largar objetos movendo o cursor para fora do menu e premindo{*CONTROLLER_VK_A*} + + A transferir terreno - - Se dormires numa cama à noite acelerarás o jogo até de madrugada, mas é preciso que todos no jogo multijogador durmam ao mesmo tempo. + + Sair de O FIM - - Para recuperares saúde, obtém costeletas a partir dos porcos, cozinha-as e come-as. + + A tua cama desapareceu ou está bloqueada - - Recolhe cabedal a partir das vacas e usa-o para construir armaduras. + + Não podes descansar agora, existem monstros nas redondezas - - Se tiveres um balde vazio, poderás enchê-lo com leite de vaca, água ou lava! + + Estás a dormir numa cama. Para acelerares até de madrugada, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. - - Utiliza uma enxada para preparar áreas de terreno para o cultivo. + + Esta cama está ocupada - - As aranhas não te atacam durante o dia, a não ser que as ataques. + + Só podes dormir à noite - - Utiliza uma pá para escavares terra ou areia mais rápido do que com as mãos! + + %s está a dormir numa cama. Para acelerares até de madrugada, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. - - Se comeres as costeletas cozinhadas, irás ganhar mais saúde do que se as comeres cruas. + + A carregar nível - - Faz algumas tochas para iluminares zonas durante a noite. Os monstros não se aproximarão das zonas próximas das tochas. + + A Finalizar... - - Chega aos destinos mais rapidamente com uma vagoneta sobre carris! + + A Construir Terreno - - Planta alguns rebentos para que cresçam até se tornarem árvores. + + A simular o mundo - - Os pastores não te irão atacar, se não os atacares. + + Lugar - - Se dormires numa cama, podes alterar o ponto de regeneração do jogo e avançar até à madrugada. + + A Preparar para Gravar Nível - - Atira essas bolas de fogo de volta para o Ghast! + + A Preparar Blocos... - - Constrói um portal para poderes viajar até outra dimensão - o Submundo. + + A iniciar o servidor - - Prime{*CONTROLLER_VK_B*} para largares o objeto que tens na mão! + + A Sair do Submundo - - Usa a ferramenta certa para a tarefa! + + A iniciar novamente - - Se não conseguires encontrar carvão para as tochas, podes produzir carvão vegetal a partir de árvores numa fornalha. + + A gerar nível - - Não é boa ideia escavares diretamente para cima ou para baixo. + + A gerar área de regeneração - - A Farinha de Ossos (obtida a partir de um osso de Esqueleto) pode ser usada como fertilizante e fazer as coisas crescerem instantaneamente! + + A carregar área de regeneração - - Os Creepers explodem quando se aproximam de ti! + + A Entrar no Submundo - - A obsidiana forma-se quando a água atinge um bloco de lava de origem. + + Ferramentas e Armas - - A lava pode demorar vários minutos a desaparecer COMPLETAMENTE, quando o bloco de origem é removido. + + Gama - - A pedra arredondada resiste às bolas de fogo do Ghast, sendo muito útil para proteger portais. + + Precisão do Jogo - - Os blocos utilizados como fontes de luz derretem a neve e o gelo. Isto inclui as tochas, glowstone e Jack-O-Lanterns. + + Precisão da Interface - - Tem cuidado ao construíres estruturas de lã a céu aberto, uma vez que os raios, durante as trovoadas, podem incendiar a lã. + + Dificuldade - - Um único balde de lava pode ser utilizado na fornalha para fundir 100 blocos. + + Música - - O instrumento tocado pelo bloco de notas depende do material sobre o qual se encontra. + + Som - - Os Mortos-vivos e Esqueletos conseguem sobreviver à luz do dia, se estiverem dentro de água. + + Calmo - - Se atacares um lobo, todos os lobos nas redondezas irão tornar-se hostis e atacar-te-ão. O mesmo acontece com os Pastores Mortos-vivos. + + Neste modo, o jogador recupera a saúde com o passar do tempo e não há inimigos no ambiente. - - Os lobos não conseguem entrar no Submundo. + + Neste modo, os inimigos surgem no ambiente, mas irão provocar menos danos ao jogador do que no modo Normal. - - Os lobos não atacam Creepers. + + Neste modo, os inimigos surgem no ambiente e provocam uma quantidade de danos normal ao jogador. - - As galinhas põem um ovo a cada 5 ou 10 minutos. + + Fácil - - A obsidiana só pode ser extraída com uma picareta de diamante. + + Normal - - Os Creepers são a fonte de pólvora mais fácil de obter. + + Difícil - - Cria um baú grande colocando dois baús lado a lado. + + Sessão terminada - - Podes ver o estado de saúde dos lobos domados pela posição da sua cauda. Dá-lhes carne para os curares. + + Armadura - - Cozinha catos numa fornalha para obteres tinta verde. + + Mecanismos - - Lê a secção Novidades, nos menus de Instruções de Jogo, para veres as últimas informações sobre atualizações do jogo. + + Transporte - - Cercas empilháveis já disponíveis no jogo! + + Armas - - Alguns animais seguir-te-ão se tiveres trigo na mão. + + Alimentos - - Se um animal não se puder mover mais de 20 blocos em qualquer direção, ele não se irá desmaterializar. + + Estruturas - - Música de C418! + + Decorações - - O Notch tem mais de um milhão de seguidores no Twitter! + + Preparação - - Nem todos os suecos são loiros. Alguns, como o Jens da Mojang, até são ruivos! + + Ferramentas, Armas e Armadura - - Este jogo será atualizado no futuro! + + Materiais - - Quem é o Notch? + + Blocos de Construção - - A Mojang tem mais prémios do que colaboradores! + + Redstone e Transporte - - Alguns famosos jogam Minecraft! + + Vários - - deadmau5 gosta de Minecraft! + + Entradas: - - Não olhes diretamente para os bugs. + + Sair sem gravar - - Os Creepers nasceram de um bug de codificação. + + Tens a certeza de que queres sair para o menu principal? O progresso não gravado será perdido. - - É uma galinha ou um pato? + + Tens a certeza de que queres sair para o menu principal? Perderás o teu progresso! - - Estiveste na Minecon? + + Esta gravação está corrompida ou danificada. Queres apagá-la? - - Nunca ninguém da Mojang viu a cara do Junkboy. + + Tens a certeza de que queres sair para o menu principal e desligar todos os jogadores do jogo? O progresso não gravado será perdido. - - Sabias que existe um Minecraft Wiki? + + Sair e gravar - - O novo escritório do Mojang é fixe! + + Criar Mundo Novo - - O Minecon 2013 decorreu em Orlando, na Florida, nos EUA! + + Introduz um nome para o teu mundo - - .party() foi fantástica! + + Deposita a semente para a criação do teu mundo - - Assume sempre que os rumores são falsos e não verdadeiros! + + Carregar Mundo Gravado - - {*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 saem; constrói um abrigo antes que isso aconteça.{*B*}{*B*} -Usa{*CONTROLLER_ACTION_LOOK*} para olhares em redor.{*B*}{*B*} -Usa{*CONTROLLER_ACTION_MOVE*} para te moveres.{*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 {*CONTROLLER_ACTION_MOVE*} para a frente, o personagem irá continuar a correr até que se esgote o tempo ou se a Barra de Comida tiver 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 escavares alguns blocos.{*B*}{*B*} -Se estiveres a segurar um objeto com a mão, usa{*CONTROLLER_ACTION_USE*} para o utilizares ou prime{*CONTROLLER_ACTION_DROP*} para o largares. + + Jogar Tutorial - - {*T3*}INSTRUÇÕES DE JOGO: HUD{*ETW*}{*B*}{*B*} -O HUD 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.{*B*} -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 são necessários para subires de nível.{*B*} -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 mostra os objetos que estão disponíveis para usares. Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para mudares o objeto que estás a segurar. + + Tutorial - - {*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 podes 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 com{*CONTROLLER_VK_A*}. Caso tenhas selecionado vários objetos com o ponteiro, usa{*CONTROLLER_VK_A*} para colocá-los todos ou{*CONTROLLER_VK_X*} para colocares apenas um.{*B*}{*B*} -Se o objeto sobre o qual se encontra o ponteiro for uma armadura, surgirá uma dica que te permite colocar o objeto no espaço correto do inventário, com um movimento rápido.{*B*}{*B*} -É possível mudar a cor da tua Armadura de Cabedal com tinta; para isso, vai ao menu do inventário e mantém a tinta no teu ponteiro, depois prime{*CONTROLLER_VK_X*} enquanto o ponteiro está em cima da peça que desejas pintar. + + Nomeia o Teu Mundo - - {*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 entre o inventário e o baú.{*B*}{*B*} -Os objetos armazenados no baú podem ser colocados no inventário mais tarde. + + Gravação Danificada - - {*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. + + OK - - {*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 colocá-lo no teu inventário. + + Cancelar - - {*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 uma área de criação maior e uma seleção de objetos mais variada. + + Loja Minecraft - - {*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, na fornalha.{*B*}{*B*} -Coloca a fornalha no mundo e prime{*CONTROLLER_ACTION_USE*} para usá-la.{*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 dicas que te permitem mover o objeto para a fornalha com um movimento rápido. + + Rodar - - {*T3*}INSTRUÇÕES DE JOGO: DISTRIBUIDOR{*ETW*}{*B*}{*B*} -O Distribuidor é utilizado para disparar objetos. Terás de colocar um interruptor, como por exemplo uma alavanca, junto ao distribuidor, para ativá-lo.{*B*}{*B*} -Para encheres o distribuidor com objetos 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. + + Esconder - - {*T3*}INSTRUÇÕES DE JOGO: PREPARAÇÃO DE POÇÕES{*ETW*}{*B*}{*B*} -Para prepares 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 espaços para garrafas, por isso, podes preparar três poções ao mesmo tempo. Um ingrediente pode ser usado nas três garrafas, por isso, prepara sempre três poções em simultâneo, para aproveitares melhor os teus recursos.{*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 nesta poção de base, irás obter uma poção com um efeito.{*B*} -Depois de teres esta poção, podes adicionar um terceiro ingrediente para que o efeito dure mais tempo (com Pó de Redstone), seja mais intenso (com Pó de Glowstone) ou se transforme numa poção negativa (com 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*}Melão 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. + + Limpar Todos os Espaços - - {*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 espaço por baixo do livro na Mesa de Feitiços, os três botões à direita do espaço 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 irás ver 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, ser extraídos nas minas ou cultivados no mundo. {*B*}{*B*} -Os Livros Enfeitiçados são usados na Bigorna para aplicar feitiços aos objetos. Assim tens mais controlo sobre os feitiços que pretendes aplicar aos teus objetos.{*B*} + + Tens a certeza de que queres sair do jogo atual e entrar num novo jogo? Os progressos não gravados serão perdidos. - - {*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. + + Tens a certeza de que queres substituir qualquer gravação anterior deste mundo pela versão atual deste mundo? - - {*T3*}INSTRUÇÕES DE JOGO: ANIMAIS DE CRIAÇÃO{*ETW*}{*B*}{*B*} -Em Minecraft, os animais podem reproduzir-se e dar origem a crias de animais!{*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 uma cria de animal. A cria de animal seguirá os pais durante algum 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. + + Tens a certeza de que queres sair sem gravar? Irás perder todo o progresso neste mundo! - - {*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 dele, 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. 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 a ferramenta 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. + + Iniciar Jogo - - {*T3*}INSTRUÇÕES DE JOGO: EXCLUIR NÍVEIS{*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 dica de Excluir Nível. -Se tentares juntar-te a 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 removê-lo da lista e prosseguir para o nível, ou retroceder. + + Sair do Jogo - - {*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á mais controlo sobre o teu jogo.{*B*}{*B*} - -{*T2*}Jogador vs. Jogador{*ETW*}{*B*} -Quando ativada, os jogadores podem causar danos aos outros jogadores. Esta opção afeta apenas o modo Sobrevivência.{*B*}{*B*} - -{*T2*}Confiar Jogadores{*ETW*}{*B*} -Quando desativada, os jogadores que se juntaram ao 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*}{*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 esta opção é ativada, o Submundo será regenerado. Esta opção é útil, quando tens uma gravação antiga onde não estava presente uma Fortaleza 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*}{*B*} - -{*T1*}Opções de Jogador{*ETW*}{*B*} -Para modificar os privilégios de um jogador, seleciona o seu 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 nos 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 nos 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 nos 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 nos 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 nos 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 nos 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*} -{*KICK_PLAYER_DESCRIPTION*}{*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*} -Esta opção permite ao jogador mover jogadores, ou mover-se a si próprio, para perto de outros jogadores, num mundo. + + Gravar Jogo - - Página Seguinte + + Sair sem gravar - - Página Anterior + + Prime START para jogar - - Princípios Básicos + + Parabéns - recebeste uma imagem de jogador com o Steve do Minecraft! - - HUD + + Parabéns - recebeste uma imagem de jogador com um Creeper! - - Inventário + + Desbloquear Jogo Completo - - Baús + + Não podes juntar-te a este jogo, pois o jogador a que estás a tentar juntar-te possui uma versão mais recente do jogo. - - Criar + + Novo Mundo - - Fornalha - - - Distribuidor + + Prémio Desbloqueado! - - Animais de Quinta + + Estás a jogar a versão de avaliação, mas precisas do jogo completo para poderes gravar o jogo. +Queres desbloquear o jogo completo agora? - - Animais de Criação + + Amigos - - Preparação de Poções + + A Minha Pontuação - - Feitiço + + Geral - - Portal do Submundo + + Por favor, aguarda - - Multijogador + + Sem resultados - - A Partilhar Capturas de Ecrã + + Filtro: - - Excluir Níveis + + Não podes juntar-te a este jogo, pois o jogador a que estás a tentar juntar-te possui uma versão mais antiga do jogo. - - Modo Criativo + + Ligação perdida - - Opções de Anfitrião e Jogador + + Perdeste a ligação ao servidor. A sair para o menu principal. - - Trocas + + Desligado pelo servidor - - Bigorna + + A sair do jogo - - O Fim + + Ocorreu um erro. A sair para o menu principal. - - {*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 de Fim que não a 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 Enderman, pelo que tens de estar bem preparado para combater, antes de lá entrares!{*B*}{*B*} -Descobrirás que existem 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 construir 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 ferir com gravidade!{*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, para se poderem juntar a ti com facilidade. + + Falha na ligação - - Sprint + + Foste expulso do jogo - - Novidades + + O anfitrião saiu do jogo. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Alterações e Adições{*ETW*}{*B*}{*B*} -- Objetos novos adicionados – Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú de Ender, Gancho para Armadilha de Fio, Maçã Dourada Enfeitiçada, Bigorna, Vaso, Paredes de Pedra Arredondada, Paredes de Pedra Arredondada com Musgo, Pintura de Esqueleto Atrofiado, Batata, Batata Assada, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura num Pau, Tarte de Abóbora, Poção de Visão Noturna, 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 Burilado, Pilar de Bloco de Quartzo, Livro Enfeitiçado, Tapete.{*B*} -- Adicionadas receitas novas para Arenito Macio e Arenito Burilado.{*B*} -- Novos Habitantes adicionados– Aldeões Mortos-vivos.{*B*} -- Adicionadas novas funcionalidades de geração de terreno – Templos do Deserto, Aldeias do Deserto, Templos da Selva.{*B*} -- Adionadas trocas com aldeãos.{*B*} -- Adicionado interface de Bigorna.{*B*} -- Armadura de Cabedal pode ser pintada.{*B*} -- Coleiras de lobo põem ser pintadas.{*B*} -- Porcos podem ser controlados, quando montados, com uma Cenoura num Pau.{*B*} -- Conteúdo de Baú de Bónus atualizado com mais objetos.{*B*} -- Alterada a colocação de meios blocos ou outros blocos em meios blocos.{*B*} -- Alterada a colocação de escadas invertidas e placas.{*B*} -- Adicionadas profissões diferentes para Aldeões.{*B*} -- Os Aldeões que surgem de um Ovo de Geração terão uma profissão aleatória.{*B*} -- Adicionada a colocação lateral de troncos.{*B*} -- As Fornalhas podem usar ferramentas de madeira como combustível.{*B*} -- Os painéis de Gelo e Vidro podem ser recolhidos com ferramentas enfeitiçadas com toque de seda.{*B*} -- Os Botões de Madeira e as Placas de Pressão de Madeira podem ser ativados com Setas.{*B*} -- Os Habitantes do Submundo podem surgir no Mundo Superior através de Portais.{*B*} -- Os Creepers e as Aranhas são agressivas para com o último jogador que lhes acertou.{*B*} -- Os Habitantes, no modo Criativo, tornam-se neutros novamente depois de um breve período.{*B*} -- Retirado o coice durante o afogamento.{*B*} -- As portas que são partidas por mortos-vivos exibem o danos.{*B*} -- O Gelo derrete-se no Submundo.{*B*} -- Os Caldeirões enchem-se quando deixados à chuva.{*B*} -- os Pistões demoram o dobro do tempo a atualizar-se.{*B*} -- Quando morto, um Porco larga a Sela (se a tiver).{*B*} -- Alterada a cor do Céu em O Fim.{*B*} -- Os Fios podem ser colocados (para Armadilhas com Fio).{*B*} -- A chuva escorre através dos níveis.{*B*} -- As Alavancas podem ser colocadas no fundo dos blocos.{*B*} -- O TNT provoca danos variáveis consoante o nível de dificuldade.{*B*} -- Livro de receitas alterado.{*B*} -- Os Barcos partem Nenúfares, em vez dos Nenúfares partirem Barcos.{*B*} -- Os Porcos largam mais Costoletas.{*B*} -- Os Slimes surgem menos em mundos Superplanos.{*B*} -- Os danos de Creepers variam com o nível de dificuldade, mais coice.{*B*} -- Reparado o erro dos Endermen não abrirem as mandíbulas.{*B*} -- Adicionado o teletransporte de jogadores (utilizando o menu no jogo {*BACK_BUTTON*}).{*B*} -- Adicionadas novas Opções de Anfitrião para voo, invisibilidade e invulnerabilidade de jogadores remotos.{*B*} -- Adicionados novos tutoriais ao Mundo do Tutorial, para novos objetos e funcionalidades.{*B*} -- Foram atualizadas as posições dos Baús de Discos de Música no Mundo do Tutorial.{*B*} + + Não podes juntar-te a este jogo porque não és amigo de nenhum dos participantes. - - {*ETB*}Bem-vindo de volta! Podes não ter reparado, mas o teu Minecraft acabou de ser atualizado.{*B*}{*B*} -Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam apenas alguns destaques. Lê e depois vai divertir-te!{*B*}{*B*} -{*T1*}Novos Itens{*ETB*} - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú de Ender, Gancho para Armadilha de Fio, Maçã Dourada Enfeitiçada, Bigorna, Vaso de Flores, Paredes de Pedra Arredondada, Paredes de Pedra Arredondada com Musgo, Pintura de Esqueleto Atrofiado, Batata, Batata Assada, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura num Pau, Tarte de Abóbora, Poção de Visão Noturna, 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 Burilado, Pilar de Bloco de Quartzo, Livro Enfeitiçado, Tapete.{*B*}{*B*} - {*T1*}Novos Habitantes{*ETB*} – Aldeão Morto-vivo.{*B*}{*B*} -{*T1*}Novas Funcionalidades{*ETB*} - Trocas com aldeãos, reparação e enfeitiçamento de armas e ferramentas com uma Bigorna, guardar itens num Baú de Ender, controlar um porco com uma Cenoura num Pau enquanto o montas!{*B*}{*B*} -{*T1*}Novos Mini-Tutoriais{*ETB*} – Aprende a usar as novas funcionalidades no Mundo do Tutorial!{*B*}{*B*} -{*T1*} Novos 'Ovos de Páscoa' {*ETB*} – Mudámos todos os Discos de Música secretos de sítio, dentro do Mundo do Tutorial. Vê se consegues encontrá-los outra vez!{*B*}{*B*} - + + Não podes juntar-te a este jogo porque foste expulso pelo anfitrião anteriormente. - - Provoca mais danos do que com a mão. + + Foste expulso do jogo por voares - - Utilizada 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. + + A tentativa de ligação excedeu o tempo - - Necessária para escavar blocos de pedra e minério. + + O servidor está cheio - - Utilizado para cortar blocos de madeira mais rápido do que com a mão. + + Neste modo, os inimigos surgem no ambiente e irão provocar graves danos ao jogador. Presta atenção aos Creepers, uma vez que é pouco provável que cancelem o seu ataque explosivo quando te afastas deles! - - Utilizada para lavrar blocos de terra e erva, para preparar colheitas. + + Temas - - As portas de madeira são ativadas através do uso, dando um golpe ou com Redstone. + + Pack de Skins - - As portas de ferro só podem ser abertas com Redstone, botões ou interruptores. + + Permitir amigos de amigos - - SEM USO + + Expulsar Jogador - - SEM USO + + Tens a certeza de que queres expulsar este jogador do jogo? Ele não poderá voltar a juntar-se até reiniciares o mundo. - - SEM USO + + Packs de Imagens de Jogador - - SEM USO + + Não podes juntar-te a este jogo porque está limitado a amigos do anfitrião. - - Dá ao utilizador 1 de Armadura quando em uso. + + Conteúdo Transferível Corrompido - - Dá ao utilizador 3 de Armadura quando em uso. + + Este conteúdo transferível está corrompido e não pode ser usado. Tens de eliminá-lo, depois reinstala-o a partir do menu Loja Minecraft. - - Dá ao utilizador 2 de Armadura quando em uso. + + Parte do teu conteúdo transferível está corrompido e não pode ser usado. Tens de eliminá-lo, depois reinstala-o a partir do menu Loja Minecraft. - - Dá ao utilizador 1 de Armadura quando em uso. + + Impossível Juntares-te ao Jogo - - Dá ao utilizador 2 de Armadura quando em uso. + + Selecionado - - Dá ao utilizador 5 de Armadura quando em uso. + + Skin selecionada: - - Dá ao utilizador 4 de Armadura quando em uso. + + Obtém a Versão Completa - - Dá ao utilizador 1 de Armadura quando em uso. + + Desbloquear Pack de Texturas - - Dá ao utilizador 2 de Armadura quando em uso. + + Para usares este pack de texturas no teu mundo, precisas de desbloqueá-lo. +Queres desbloqueá-lo agora? - - Dá ao utilizador 6 de Armadura quando em uso. + + Pack de Texturas de Avaliação - - Dá ao utilizador 5 de Armadura quando em uso. + + Semear - - Dá ao utilizador 2 de Armadura quando em uso. + + Desbloquear Pack de Skins - - Dá ao utilizador 2 de Armadura quando em uso. + + Para utilizares a skin selecionada, tens de desbloquear este pack de skins. +Queres desbloquear agora este pack de skins? - - Dá ao utilizador 5 de Armadura quando em uso. + + Estás a usar uma versão de avaliação do pack de texturas. Não poderás guardar este mundo sem desbloqueares a versão completa. +Gostarias de desbloquear a versão completa deste pack de texturas? - - Dá ao utilizador 3 de Armadura quando em uso. + + Transferir Versão Completa - - Dá ao utilizador 1 de Armadura quando em uso. + + Este mundo usa um pack de mistura ou pack de texturas que não tens! +Queres instalar o pack de mistura ou pack de texturas agora? - - Dá ao utilizador 3 de Armadura quando em uso. + + Obtém a Versão de Avaliação - - Dá ao utilizador 8 de Armadura quando em uso. + + Pack de Texturas Não Disponível - - Dá ao utilizador 6 de Armadura quando em uso. + + Desbloquear Versão Completa - - Dá ao utilizador 3 de Armadura quando em uso. + + Transferir Versão de Avaliação - - Um lingote brilhante que pode ser usado para criar ferramentas feitas com este material. É criado ao derreteres minério numa fornalha. + + O teu modo de jogo foi alterado - - 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. + + Quando ativada, só os jogadores convidados podem juntar-se. - - Utilizada para enviar uma descarga elétrica quando é pisada por um jogador, um animal ou um monstro. As Placas de Pressão de Madeira também podem ser ativadas quando os objetos caem em cima delas. + + Quando ativada, amigos de pessoas na tua Lista de Amigos podem juntar-se. - - Utilizado como escadas compactas. + + Quando ativada, os jogadores podem infligir danos aos outros jogadores. Afeta apenas o modo de Sobrevivência. - - Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + + Normal - - Utilizada para fazer escadas longas. Duas placas colocadas em cima uma da outra irão criar um bloco de tamanho normal com duas placas. + + Superplano - - Utilizadas para criar luz. As tochas também derretem a neve e o gelo. + + Quando ativada, o jogo ficará online. - - Utilizado como material de construção e pode servir para criar muitas coisas. Pode ser criado a partir de qualquer tipo de madeira. + + Quando desativada, os jogadores que se juntaram ao jogo não podem construir ou escavar, até receberem autorização. - - Utilizado como material de construção. Não é influenciado pela gravidade, como a Areia normal. + + Quando ativada, são geradas estruturas como Aldeias e Fortalezas no mundo. - - Utilizado como material de construção. + + Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo. - - Utilizado para criar tochas, setas, sinais, escadotes e cercas e também como pegas para ferramentas e armas. - - - Se todos os jogadores do mundo estiverem numa cama, o tempo durante a noite passa mais rápido. Alteram o ponto de regeneração do jogador. As cores das camas são sempre as mesmas apesar das lãs usadas. + + Quando ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador. - - Permite-te criar uma seleção de objetos mais ampla do que na criação normal. + + Quando ativada, o fogo pode propagar-se aos blocos inflamáveis mais próximos. - - Permite-te fundir minério, criar carvão vegetal e vidro e também cozinhar peixe e costeletas de porco. + + Quando ativada, o TNT explode ao ser acionado. - - Armazena blocos e objetos no interior. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. + + Quando ativada, o Submundo será regenerado. É útil se tiveres um ficheiro mais antigo em que não existissem Fortalezas do Submundo. - - Utilizada como barreira que não se pode saltar. Conta como 1,5 blocos de altura para jogadores, animais e monstros, mas 1 bloco de altura para outros blocos. + + Desligado - - Utilizado para subir na vertical. + + Modo Jogo: Criativo - - São ativados 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. + + Sobrevivência - - Apresenta o texto introduzido por ti ou por outros jogadores. + + Criativo - - Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. + + Muda o Nome do Teu Mundo - - 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. + + Introduz o novo nome para o teu mundo - - Utilizada para guardar guisado de cogumelos. Ficas com a tigela, depois de comeres o guisado. + + Modo Jogo: Sobrevivência - - Utilizado para guardar e transportar água, lava e leite. + + Criado no Modo Sobrevivência - - Utilizado para guardar e transportar água. + + Mudar o Nome - - Utilizado para guardar e transportar lava. + + A gravar automaticamente em %d... - - Utilizado para guardar e transportar leite. + + Ligado - - Utilizado para criar fogo, detonar TNT e abrir um portal, depois da sua construção. + + Criado no Modo Criativo - - Utilizada para apanhar peixe. + + Compor Nuvens - - Mostra as posições do Sol e da Lua. + + O que queres fazer com esta gravação de jogo? - - Aponta para o ponto inicial. + + Tamanho de HUD (Ecrã Dividido) - - Quando seguras no mapa, poderás ver a imagem de uma área explorada. Pode ser utilizado para descobrir caminhos. + + Ingrediente - - Utilizado para ataques à distância com setas. + + Combustível - - Utilizadas como munições para os arcos. + + Distribuidor - - Restitui 2,5{*ICON_SHANK_01*}. + + Baú - - Restitui 1{*ICON_SHANK_01*}. Podes usar até 6 vezes. + + Encantar - - Restitui 1{*ICON_SHANK_01*}. + + Fornalha - - Restitui 1{*ICON_SHANK_01*}. + + De momento, não existem ofertas de conteúdo transferível deste tipo disponíveis para este título. - - Restitui 3{*ICON_SHANK_01*}. + + Tens a certeza de que queres eliminar este jogo gravado? - - Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. Se comeres isto podes ficar envenenado. + + A aguardar aprovação - - Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando galinha crua numa fornalha. + + Censurado - - Restitui 1,5{*ICON_SHANK_01*}, ou pode ser cozinhado numa fornalha. + + %s juntou-se ao jogo. - - Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando bife cru numa fornalha. + + %s saiu do jogo. - - Restitui 1,5{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. + + %s foi expulso do jogo. - - Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando uma costeleta de porco crua numa fornalha. + + Posto de Poções - - Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhado numa fornalha. Pode ser dado a comer a um Ocelote para o domesticar + + Introduzir Texto de Sinal - - Restitui 2,5{*ICON_SHANK_01*}. Cria-se cozinhando peixe cru numa fornalha. + + Introduz uma linha de texto para o teu sinal - - Restitui 2{*ICON_SHANK_01*} e pode fazer uma maçã dourada. + + Introduzir Título - - Restitui 2{*ICON_SHANK_01*} e regenera a saúde durante 4 segundos. Faz-se de uma maçã e pepitas de ouro. + + Tempo Limite da Avaliação Excedido - - Restitui 2{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. + + Jogo cheio - - Utilizado na receita do bolo e como ingrediente para preparar poções. + + Falha ao entrar no jogo, não existem espaços livres - - Utilizada para enviar uma descarga elétrica ao ligar e desligar. Fica ligada ou desligada até ser premida novamente. + + Introduz um título para a tua publicação - - Envia constantemente uma descarga elétrica ou pode ser utilizada como recetor/transmissor quando ligada à lateral de um bloco. Pode também ser utilizada para iluminação reduzida. + + Introduz uma descrição da tua publicação - - Utilizado em circuitos de Redstone como repetidor, retardador e/ou díodo. + + Inventário - - Utilizado para enviar uma descarga elétrica ao ser pressionado. Permanece ativado durante cerca de um segundo, antes de se desligar. + + Ingredientes - - Utilizado para segurar e disparar objetos em ordem aleatória, quando recebe uma descarga de Redstone. + + Introduzir Legenda - - Reproduz uma nota quando ativado. Toca-lhe para alterar a altura da nota. Se o colocares sobre blocos diferentes, mudará o tipo de instrumento. + + Introduz uma legenda para a tua publicação - - Utilizado para conduzir vagonetas. + + Introduzir Descrição - - Quando ativado, acelera as vagonetas que lhe passam por cima. Quando não está ativado, as vagonetas param em cima dele. + + A tocar: - - Funciona como uma Placa de Pressão (envia um sinal de Redstone quando ativado), mas só pode ser ativado por uma vagoneta. + + Tens a certeza de que queres adicionar este nível à lista de níveis excluídos? +Se selecionares OK, irás sair do jogo. - - Utilizada para te transportar a ti, um animal ou um monstro pelos carris. + + Removido da Lista de Excluídos - - Utilizada para transportar bens pelos carris. + + Gravação Automática - - Desloca-se sobre carris e pode rebocar outras vagonetas, quando lhe colocas carvão. + + Nível Excluído - - Utilizado para viajar pela água mais rapidamente do que a nadar. + + O jogo ao qual queres juntar-te encontra-se na tua lista de níveis excluídos. +Se quiseres juntar-te a este jogo, o nível será removido da lista de níveis excluídos. - - Recolhida a partir de ovelhas, pode ser colorida com tintas. + + Excluir este Nível? - - Utilizada como material de construção, pode ser colorida com tintas. Esta receita não é recomendada, porque a Lã pode ser obtida facilmente das Ovelhas. + + Gravação Automática: DESLIGADO - - Utilizada como tinta para criar lã preta. + + Opacidade - - Utilizada como tinta para criar lã verde. + + A Preparar Gravação Automática do Nível - - Utilizada como tinta para criar lã castanha, como ingrediente para bolachas ou para fazer crescer Frutos de Cacau. + + Tamanho de HUD - - Utilizada como tinta para criar lã prateada. + + Mins - - Utilizada como tinta para criar lã amarela. + + Não Podes Colocar Aqui! - - Utilizada como tinta para criar lã vermelha. + + Não é possível colocar lava junto ao ponto de regeneração do nível, devido à possibilidade de morte instantânea dos jogadores regenerados. - - Utilizada para o crescimento instantâneo de plantações, árvores, ervas altas, cogumelos gigantes e flores e pode ser usada em receitas de tinta. + + Skins Favoritas - - Utilizada como tinta para criar lã cor-de-rosa. + + Jogo de %s - - Utilizada como tinta para criar lã cor-de-laranja. + + Jogo anfitrião desconhecido - - Utilizada como tinta para criar lã verde-lima. + + Um convidado terminou a sessão - - Utilizada como tinta para criar lã cinzenta. + + Repor Definições - - Tinta para criar lã cinzenta clara. (Nota: Esta tinta também pode ser feita combinando tinta cinzenta com farinha de ossos, permitindo criar quatro tintas cinzentas claras a partir de cada saco, em vez de três.) + + Tens a certeza de que queres repor as definições para os valores predefinidos? - - Utilizada como tinta para criar lã azul clara. + + Erro de Carregamento - - Utilizada como tinta para criar lã ciano. + + Um jogador convidado terminou sessão. Como tal, todos os jogadores convidados foram removidos do jogo. - - Utilizada como tinta para criar lã roxa. + + Falha ao criar jogo - - Utilizada como tinta para criar lã magenta. + + Auto Selecionado - - Utilizada como tinta para criar lã azul. + + Sem Pack: Skins Predefinidas - - Reproduz Discos de Música. + + Iniciar Sessão - - Utiliza-os para criar ferramentas, armas ou armaduras muito fortes. + + Não tens sessão iniciada. Para jogares este jogo, tens de iniciar uma sessão. Queres iniciar sessão agora? - - Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. + + Multijogador não é permitido - - Utilizado para criar livros e mapas. + + Beber - - Pode usar-se para criar estantes de livros ou, quando enfeitiçado, para fazer Livros Enfeitiçados. + + Nesta área, foi criada uma quinta. As quintas permitem-te criar uma fonte renovável de alimentos e outros objetos. - - Permite a criação de feitiços mais poderosos, quando colocada em redor da Mesa de Feitiços. + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre quintas.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre quintas. - - Utilizada como decoração. + + O Trigo, as Abóboras e os Melões 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 Melão são criadas a partir de Abóboras e Melões, respetivamente. - - Pode ser extraído com uma picareta de ferro ou superior, e depois derretido numa fornalha para criar lingotes de ouro. + + Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. - - Pode ser extraído com uma picareta de pedra ou superior, e depois derretido numa fornalha para criar lingotes de ferro. + + Atravessa este buraco para continuares. - - Pode ser extraído com uma picareta para recolher carvão. + + Concluíste o tutorial do modo Criativo. - - Pode ser extraído com uma picareta de pedra ou superior para recolher lápis-lazúli. + + 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. - - Pode ser extraído com uma picareta de ferro ou superior para recolher diamantes. + + Os Catos 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*} - - Pode ser extraído com uma picareta de ferro ou superior para recolher pó de Redstone. + + 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*} - - Pode ser extraído com uma picareta para recolher pedra arredondada. + + Podes usar Pó de Ossos para fazer crescer totalmente as plantações ou transformar Cogumelos em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} - - Recolhida com uma pá. Pode ser usada na construção. + + O Trigo passa por várias fases de crescimento e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} - - Pode ser plantada e irá transformar-se numa árvore. + + 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. - - Não pode ser partida. + + 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*} - - Incendeia tudo aquilo em que toca. Pode ser recolhida num balde. + + 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. - - Recolhe-se com uma pá. Pode ser derretida para criar vidro utilizando a fornalha. É afetada pela gravidade, se não tiver um bloco por baixo. + + 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. - - Recolhe-se com uma pá. Por vezes produz sílex quando é escavada. É afetada pela gravidade, se não tiver um bloco por baixo. + + Nesta área existe um Portal para o Submundo! - - Cortada com um machado, pode ser usada para criar tábuas ou como combustível. + + {*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. - - Criado numa fornalha derretendo areia. Pode ser usado na construção, mas irá partir, se tentares escavá-lo. + + + O pó de Redstone é recolhido através da extração de minério de Redstone com uma picareta em Ferro, Diamante ou Ouro. Podes utilizá-lo para transmitir energia até 15 blocos e pode subir ou descer um bloco em altura. + {*ICON*}331{*/ICON*} + - - Retirado da pedra com uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. + + + Os repetidores de Redstone podem ser usados para aumentar o alcance da energia ou colocar um retardador no circuito. + {*ICON*}356{*/ICON*} + - - Cozido a partir de barro numa fornalha. + + + 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*} + - - Pode ser cozido sob a forma de tijolos numa fornalha. + + 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. - - Quando partidos, produzem bolas de barro que podem ser cozidas para criar tijolos, numa fornalha. + + O Submundo pode ser usado para viajar rapidamente no Mundo Superior - um bloco no Submundo equivale a viajar 3 blocos no Mundo Superior. - - Uma forma compacta de armazenar bolas de neve. + + Agora estás em Modo Criativo. - - Pode ser escavada com uma pá para criar bolas de neve. + + {*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. - - Por vezes produz sementes de trigo, quando partido. + + 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. - - Pode ser usada para criar tinta. + + Para utilizar um Portal do Submundo, fica dentro dele. O ecrã fica roxo e ouves um som. Alguns segundos depois, serás transportado para outra dimensão. - - Produz guisado, com uma tigela. + + 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. - - 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. + + Concluíste o tutorial sobre quintas. - - Faz aparecer monstros no mundo. + + Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar um machado para cortar troncos de árvore. - - É colocado no chão para transportar uma carga elétrica. Quando utilizado como ingrediente duma poção, aumenta a duração do efeito. + + Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma picareta para extrair pedra e minério. Podes ter de construir uma picareta com materiais melhores, para obter recursos de certos blocos. - - Uma vez crescidas, as plantações são recolhidas e resultam em trigo. + + Algumas ferramentas são melhores para atacar inimigos. Experimenta usar uma espada para atacares. - - Terreno preparado para semear. + + Os Golems de Ferro também aparecem naturalmente para proteger as aldeias e, caso ataques quaisquer aldeões, eles atacam-te. - - Pode ser cozinhado na fornalha para criar tinta verde. + + Não podes sair desta área até teres completado o tutorial. - - Pode criar açúcar. + + Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma pá para escavar materiais moles como terra e areia. - - Pode ser usada como capacete ou criar um Jack-O-Lantern, em conjunto com uma tocha. Também é o ingrediente principal da Tarte de Abóbora. + + Sugestão: Mantém premido {*CONTROLLER_ACTION_ACTION*}para escavar e cortar usando a mão ou o objeto que estiveres a segurar. Pode ser necessário criar uma ferramenta para escavares alguns blocos... - - Queima eternamente, se for aceso. + + 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. - - Abranda o movimento de tudo aquilo que lhe passar por cima. + + 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. - - Ficar dentro do portal permite-te passar entre o Mundo Superior e o Submundo. + + 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. - - Utilizado como combustível na fornalha, ou para criar tochas. + + A ferramenta que estás a usar ficou danificada. Sempre que usas uma ferramenta ela danifica-se e acabará por partir. A barra colorida sob o objeto no teu inventário indica o estado atual dos danos. - - Recolhido ao matar uma aranha, pode ser usado para criar um Arco, uma Cana de Pesca ou colocado no chão para fazer uma Armadilha com Fio. + + Mantém premido{*CONTROLLER_ACTION_JUMP*} para nadares para cima. - - Recolhida ao matar uma galinha, pode criar uma seta. + + 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. - - Recolhida ao matar um Creeper, pode ser usada para criar TNT ou como ingrediente para fazer poções. + + 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. - - Podem ser plantadas em terrenos de cultivo para obter colheitas. Certifica-te de que as sementes têm luz suficiente para crescer! + + Dá Trigo às vacas, vacogumelos ou ovelhas, Cenouras aos porcos, Sementes de Trigo ou Verrugas de Submundo às galinhas ou qualquer tipo de carne aos lobos, e estes irão começar a procurar outro animal da sua espécie que também esteja em Modo Amor. - - Recolhido nas plantações, pode ser usado para criar alimentos. + + 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á uma cria. A cria irá seguir os pais durante algum tempo, antes de se transformar num animal adulto. - - Recolhido ao escavar gravilha, pode ser usado para criar uma ferramenta de sílex e aço. + + Os animais só podem voltar a entrar no Modo Amor ao fim de cerca de cinco minutos. - - Quando usada num porco, permite-te montá-lo. Podes depois conduzir o porco com uma Cenoura num Pau. + + Nesta área, os animais foram colocados dentro de uma cerca. Podes criar animais para produzir crias dos mesmos. - - Recolhida ao escavar neve, pode ser atirada. + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre a criação de animais.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a criação de animais. + - - Recolhido ao matar uma vaca, pode ser usado para criar uma armadura ou para fazer Livros. + + Para que os animais procriem, terás de lhes dar os alimentos certos para que entrem em "Modo Amor". - - Recolhida ao matar um Slime, pode ser usada como ingrediente para poções ou na criação de Pistões Pegajosos. + + Alguns animais irão seguir-te se tiveres a sua comida na mão. Isto facilita a tarefa de reunir os animais para que procriem.{*ICON*}296{*/ICON*} - - Postos de forma aleatória pelas galinhas, podem ser usados para criar alimentos. + + {*B*} + Prime{*CONTROLLER_VK_A*} para saber mais sobre Golems.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes o que precisas sobre Golems. - - Recolhido ao extrair Glowstone, pode ser usado para criar novos blocos de Glowstone ou como ingrediente de uma poção para aumentar a potência do efeito. + + Os Golems são criados colocando uma abóbora no topo de uma pilha de blocos. - - Recolhido ao matar um esqueleto. Pode ser usado para criar farinha de ossos e como alimento para domesticar lobos. + + 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. - - Recolhido quando um Esqueleto mata um Creeper. Pode ser reproduzido numa jukebox. + + + Podes domesticar os lobos selvagens se lhes deres ossos. Uma vez domesticados, vão surgir Corações de Amor à sua volta. Os lobos domesticados vão seguir o jogador e defendê-lo, se não receberem a ordem para sentar. + - - Extingue incêndios e ajuda as plantações a crescer. Pode ser recolhida num balde. + + Concluíste o tutorial sobre criação de animais. - - Quando partidas, por vezes soltam um rebento que pode ser plantado para que cresça uma árvore. + + Nesta zona há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. - - Encontrada em masmorras, pode ser usada na construção e decoração. + + 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. - - Usadas para obter lã das ovelhas e recolher blocos de folhas. + + Se esvaziares o caldeirão, podes voltar a enchê-lo com um Balde de Água. - - Quando é ativado (utilizando um botão, alavanca, placa de pressão, tocha de Redstone ou Redstone com qualquer um destes), o pistão estica-se, se puder, e empurra blocos. + + 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. - - Igual a um pistão comum mas quando recolhe, puxa o bloco que está a tocar na parte esticada do pistão. + + + Com uma poção na mão, mantém premido{*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 redor da zona onde aterrar. + Podes criar Poções Explosivas adicionando pólvora às poções normais. + - - É feito de blocos de Pedra e encontra-se habitualmente nas Fortalezas. + + {*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. - - Utilizadas como barreiras, semelhante às vedações. + + O primeiro passo para preparar uma poção é criar uma Garrafa de Água. Retira uma Garrafa de Vidro do baú. - - Semelhante a uma porta, mas utilizado principalmente com vedações. + + 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*}. - - Pode ser criado a partir de Fatias de Melão. + + Utiliza a Poção de Resistência ao Fogo em ti mesmo. - - Blocos transparentes que podem ser usados em vez dos Blocos de Vidro. + + Para enfeitiçares um objeto, primeiro coloca-o no espaço de feitiços. Podes enfeitiçar armas, armaduras e algumas ferramentas para adicionar-lhes efeitos especiais, tais como maior resistência aos danos ou aumentar o número de objetos produzidos ao escavar um bloco. - - Podem ser plantadas para produzir abóboras. + + Quando colocas um objeto no espaço de feitiços, os botões à direita irão mudar para apresentar uma seleção de feitiços aleatórios. - - Podem ser plantadas para produzir melões. + + O número no botão representa o custo em níveis 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. - - 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. + + Agora que és resistente ao fogo e à lava, poderás ir a sítios onde nunca foste. - - Um bloco de terra com erva por cima. Pode ser recolhido com uma pá e utilizado para construção. + + Esta é a interface dos feitiços que podes usar para enfeitiçar armas, armaduras e algumas ferramentas. - - Pode ser usada na construção e decoração. + + {*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. - - Torna os movimentos mais lentos quando passas por ela. Pode ser destruída com tesouras para recolheres fio. + + Nesta área existe um Posto de Poções, um Caldeirão e um baú cheio de ingredientes para criar poções. - - Faz surgir um Peixe Prateado quando destruído. Também pode fazer surgir um Peixe Prateado, se estiver perto de outro Peixe Prateado que está a ser atacado. + + O carvão vegetal pode ser usado como combustível ou para criar tochas, juntamente com um pau. - - Crescem ao longo do tempo depois de plantadas. Podem ser recolhidas com tesouras. Podem ser escaladas como escadas. + + Para fazeres vidro, coloca areia no espaço dos ingredientes. Cria blocos de vidro para usares como janelas para o teu abrigo. - - Escorregadio quando pisado. Transforma-se em água se estiver sobre outro bloco quando é destruído. Derrete-se se estiver perto de uma fonte de luz ou se for colocado no Submundo. + + Esta é a interface de preparação de poções. Podes utilizá-la para criar poções com diferentes efeitos. - - Pode ser usado como decoração. + + 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. - - Utilizada na preparação de poções e para localizar Fortalezas. É produzida pelos Blazes, que se encontram normalmente junto ou dentro de Fortalezas do Submundo. + + Depois de os objetos serem alterados pelo fogo, podes movê-los da área de saída para o inventário. Experimenta usar ingredientes diferentes para veres o que consegues criar. - - Utilizadas na preparação de poções. Produzidas pelos Ghasts quando morrem. + + Se usares madeira como ingrediente, podes criar carvão vegetal. Coloca algum combustível na fornalha e madeira no espaço dos ingredientes. Pode demorar algum tempo para criar carvão vegetal, portanto ocupa-te com o que quiseres e depois regressa para verificares o progresso. - - Produzidas pelos Pastores Mortos-vivos quando morrem. Os Pastores Mortos-vivos podem ser encontrados no Submundo. Usadas como ingrediente para poções. + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes como usar o posto de poções. - - Utilizadas na preparação de poções. Crescem de forma selvagem nas Fortalezas do Submundo. Também podem ser plantadas em Areias Movediças. + + Se adicionares Olho de Aranha Fermentado, corrompes a poção e podes criar 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. - - Podem ter vários efeitos, consoante o uso. + + Cria uma Poção de Resistência ao Fogo juntando uma Verruga de Submundo a uma Garrafa de Água e adicionando Creme de Magma. - - Pode ser enchida de água e usada como ingrediente inicial, no Posto de Poções. + + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de preparação de poções. - - Um alimento venenoso e ingrediente para poções. É produzido quando uma Aranha ou Aranha das Cavernas é morta por um jogador. + + Podes preparar poções colocando um ingrediente no espaço superior e uma poção ou garrafa de água nos espaços inferiores (podem ser preparadas até 3 poções ao mesmo tempo). Depois de introduzires uma combinação válida, inicia-se o processo de preparação e é criada uma poção, pouco tempo depois. - - Utilizado na preparação de poções, principalmente para criar poções com efeito negativo. + + 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. - - Utilizado na preparação de poções ou criado juntamente com outros objetos para criar Olho de Ender ou Creme de Magma. + + 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. - - Usado na preparação de poções. + + 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. - - Utilizado para fazer Poções e Poções Explosivas. + + 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*} - - Enche-se com água utilizando um balde ou com a chuva e pode ser usado para encher Garrafas de Vidro com água. + + Para apanhares peixe, espera até que o flutuador mergulhe na água e só depois deves enrolar a linha. O peixe pode ser comido cru ou cozinhado na fornalha, para restituir saúde. + {*FishIcon*} - - Quando atirado, mostra a direção para um Portal do Fim. Se forem colocados doze destes olhos nas Estruturas de Portal do Fim, o Portal do Fim é ativado. + + Tal como acontece com outras ferramentas, a cana de pesca tem um número limitado de utilizações. Mas as utilizações não se limitam à pesca. Faz experiências para veres que outras coisas podes apanhar ou ativar... + {*FishingRodIcon*} - - Usado na preparação de poções. + + O barco permite-te viajar mais rapidamente sobre a água. Podes conduzi-lo utilizando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} - - Semelhante aos Blocos de Erva, mas ótimo para cultivar cogumelos. + + Estás a usar uma cana de pesca. Prime{*CONTROLLER_ACTION_USE*} para a usares.{*FishingRodIcon*} - - Flutua na água e pode caminhar-se sobre ele. + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre pesca.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre pesca. - - Utilizado para construir Fortalezas do Submundo. Imune às bolas de fogo de Ghast. + + Isto é uma cama. De noite, prime{*CONTROLLER_ACTION_USE*} enquanto apontas para a cama, para dormires e acordares de manhã.{*ICON*}355{*/ICON*} - - Utilizada em Fortalezas do Submundo. + + Nesta área existem alguns circuitos simples de Redstone e Pistões, além de um baú com mais objetos para aumentar estes circuitos. - - Encontra-se nas Fortalezas do Submundo e produz Verrugas do Submundo quando se parte. + + {*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. - - Permite aos jogadores enfeitiçarem Espadas, Picaretas, Machados, Pás, Arcos e Armaduras, utilizando os Pontos de Experiência do jogador. + + As Alavancas, Botões, Placas de Pressão e Tochas de Redstone podem fornecer energia aos circuitos, acoplando-os diretamente ao objeto que queres ativar ou ligando-os com pó de Redstone. - - Pode ser ativado utilizando doze Olhos de Ender e permite ao jogador viajar até à dimensão de O Fim. + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre camas.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre camas. - - Usadas para formar um Portal de O Fim. + + 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 uma cama, se morreres serás ressuscitado nessa cama. + {*ICON*}355{*/ICON*} - - Um tipo de bloco encontrado em O Fim. É altamente resistente a explosões, por isso, é útil para construir. + + Se existirem outros jogadores no teu jogo, todos têm de estar na cama ao mesmo tempo, para poderem dormir. + {*ICON*}355{*/ICON*} - - Este bloco é criado quando o Dragão de O Fim é derrotado. + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre barcos.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre barcos. - - Quando atirada, produz Orbes de Experiência, que aumentam os teus pontos de experiência se forem recolhidos. + + 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. - - Útil para incendiar coisas, ou para iniciar incêndios indiscriminadamente quando disparadas de um Distribuidor. + + 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. - - São similares a uma vitrina e irão apresentar o item ou bloco lá colocado. + + Enfeitiçar objetos tem um custo em Níveis de Experiência, que podem ser obtidos recolhendo Orbes de Experiência, os quais são produzidos quando matas monstros e animais, escavas minério, crias animais, pescas e fundes/cozinhas algumas coisas numa fornalha. - - Quando lançados, podem gerar uma criatura do tipo indicado. + + Apesar dos 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. - - Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + + Nesta área existe uma Mesa de Feitiços e outros objetos que te ajudarão a aprender tudo sobre feitiços. - - Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre feitiços.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre feitiços. + - - Criado através da fundição de Rocha do Submundo numa fornalha. Pode ser transformado em blocos de Tijolo do Submundo. + + Também podes ganhar níveis de experiência utilizando uma Garrafa Mágica que, quando atirada, cria Orbes de Experiência em redor da zona onde aterra. Estes orbes podem ser recolhidos. - - Quando alimentados emitem luz. + + As vagonetas andam sobre carris. Podes criar uma vagoneta motorizada com uma fornalha e uma vagoneta com baú dentro dela. + {*RailIcon*} - - Pode ser colhido para recolher Grãos de Cacau. + + Também podes criar carris eletrificados, que recebem energia das tochas de Redstone e dos circuitos, para acelerar a vagoneta. Estes podem ser ligados a interruptores, alavancas e placas de pressão, para formar sistemas complexos. + {*PoweredRailIcon*} - - As Cabeças de Habitantes podem ser colocadas como decoração ou usadas como máscara, no campo do capacete. + + Estás a navegar num barco. Para saíres do barco, coloca o ponteiro sobre o mesmo e prime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - - Lula + + Dentro dos 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 experiências na Mesa de Feitiços. - - Solta sacos de tinta quando é morta. + + Estás a conduzir uma vagoneta. Para saíres da vagoneta, coloca o ponteiro sobre a vagoneta e prime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - - Vaca + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre vagonetas.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre vagonetas. - - Solta cabedal quando é morta. Pode também ser ordenhada com um balde. + + Se deslocares o ponteiro para fora dos limites da interface, quando estiveres a transportar um objeto, poderás largá-lo. - - Ovelha + + Ler - - Solta lã quando é tosquiada (se ainda não tiver sido tosquiada). Pode ser tingida para que a sua lã ganhe uma cor diferente. + + Pendurar - - Galinha + + Atirar - - Solta penas quando é morta e também põe ovos de forma aleatória. + + Abrir - - Porco + + Alterar Tom - - Solta costeletas quando é morto. Pode ser montado utilizando uma sela. + + Detonar - - Lobo + + Plantar - - É 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. + + Desbloquear Jogo Completo - - Creeper + + Apagar Gravação - - Explode se te aproximares demasiado! + + Apagar - - Esqueleto + + Lavrar - - Dispara setas contra ti. Solta setas quando é morto. + + Colher - - Aranha + + Continuar - - Ataca-te quando te aproximas. Pode subir paredes. Solta fios quando é morta. + + Nadar para Cima - - Morto-vivo + + Atingir - - Ataca-te quando te aproximas. + + Ordenhar - - Pastor Morto-vivo + + Recolher - - Inicialmente dócil, mas ataca em grupos, se atacares um deles. + + Esvaziar - - Ghast + + Selar - - Dispara bolas flamejantes que explodem por contacto. + + Colocar - - Slime + + Comer - - Divide-se em Slimes mais pequenos, quando sofre danos. + + Montar - - Enderman + + Velejar - - Ataca-te, se olhares para ele. Consegue movimentar blocos. + + Crescer - - Peixe Prateado + + Dormir - - Atrai os Peixes Prateados escondidos, quando atacado. Esconde-se nos blocos de pedra. + + Acordar - - Aranha da Caverna + + Tocar - - A sua mordidela é venenosa. + + Opções - - Vacogumelos + + Mover Armadura - - Faz guisado de cogumelos, quando usada com uma tigela. Produz cogumelos e torna-se uma vaca normal, quando tosquiada. + + Mover Arma - - Golem de Neve + + Equipar - - O Golem de Neve pode ser criado pelos jogadores com blocos de neve e uma abóbora. Atiram bolas de neve aos inimigos dos seus criadores. + + Mover Ingrediente - - Ender Dragon + + Mover Combustível - - Um grande dragão preto que se encontra em O Fim. + + Mover Ferramenta - - Blaze + + Puxar - - Inimigos que podem ser encontrados no Submundo, principalmente dentro das Fortalezas do Submundo. Produzem Varinhas de Blaze quando são mortos. + + Página Acima - - Cubo de Magma + + Página Abaixo - - Podem ser encontrados no Submundo. Semelhantes aos Slimes, dividem-se em versões mais pequenas, quando são mortos. + + Modo Amor - - Aldeão + + Soltar - - Ocelote + + Privilégios - - Podem ser encontrados em Selvas. Podem ser domesticados quando alimentados com Peixe Cru. Porém, tens de deixar que seja o Ocelote a aproximar-se de ti, pois qualquer movimento brusco vai assustá-lo. + + Bloquear - - Golem de Ferro + + Criativo - - Surge nas Aldeias para protegê-las e pode ser criado usando Blocos de Ferro e Abóboras. + + Excluir Nível - - Explosives Animator + + Selecionar Skin - - Concept Artist + + Acender - - Number Crunching and Statistics + + Convidar Amigos - - Bully Coordinator + + Aceitar - - Original Design and Code by + + Tosquiar - - Project Manager/Producer + + Navegar - - Rest of Mojang Office + + Reinstalar - - Lead Game Programmer Minecraft PC + + Op. Gravação - - Ninja Coder + + Executar Comando - - CEO + + Instalar Versão Completa - - White Collar Worker + + Instalar Versão de Avaliação - - Customer Support + + Instalar - - Office DJ + + Ejetar - - Designer/Programmer Minecraft - Pocket Edition + + Atualizar Lista de Jogos Online - - Developer + + Jogos Party - - Chief Architect + + Todos os Jogos - - Art Developer + + Sair - - Game Crafter + + Cancelar - - Diretor de Fun + + Cancelar Juntar - - Music and Sounds + + Alterar Grupo - - Programming + + Criação - - Art + + Criar - - QA + + Retirar/Colocar - - Executive Producer + + Mostrar Inventário - - Lead Producer + + Mostrar Descrição - - Producer + + Mostrar Ingredientes - - Test Lead + + Anterior - - Lead Tester + + Lembrete: - - Design Team + + - - Development Team + + Foram adicionadas novas funcionalidades na última versão do jogo, incluindo novas áreas no mundo do tutorial. - - Release Management + + Não tens todos os ingredientes necessários para criar este objeto. A caixa no canto inferior esquerdo mostra os ingredientes de que precisas. - - Diretor, XBLA Publishing + + 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! Termina o teu abrigo! - - Business Development + + {*EXIT_PICTURE*} Quando estiveres preparado para explorar mais, existe uma escadaria nesta área, junto ao abrigo dos Mineiros, que conduz a um pequeno castelo. + - - Diretor de Portfolio + + {*B*}Prime {*CONTROLLER_VK_A*} para jogares o tutorial normalmente.{*B*} + Prime {*CONTROLLER_VK_B*} para ignorar o tutorial principal. - - Product Manager + + {*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. - - Marketing + + Selecionar - - Community Manager + + Usar - - Europe Localization Team + + Nesta área, tens a possibilidade de aprender mais sobre pesca, barcos, pistões e Redstone. - - Redmond Localization Team + + Fora desta área, irás encontrar exemplos de edifícios, quintas, vagonetas e carris, feitiços, poções, trocas, ferreiros e muito mais! - - Asia Localization Team + + O nível da tua barra de comida está demasiado baixo para restaurar a tua saúde. - - User Research Team + + Retirar - - MGS Central Teams + + Seguinte - - Milestone Acceptance Tester + + Anterior - - Special Thanks + + Expulsar Jogador - - Test Manager + + Enviar Pedido de Amizade - - Senior Test Lead + + Página Abaixo - - SDET + + Página Acima - - Project STE + + Tingir - - Additional STE + + Curar - - Test Associates + + Senta - - Jon Kågström + + Segue-me - - Tobias Möllstam + + Escavar - - Risë Lugo + + Alimentar - - Espada de Madeira + + Domar - - Espada de Pedra + + Alterar Filtro - - Espada de Ferro + + Colocar tudo - - Espada de Diamante + + Colocar um - - Espada de Ouro + + Largar - - Pá de Madeira + + Retirar tudo - - Pá de Pedra + + Retirar metade - - Pá de Ferro + + Colocar - - Pá de Diamante + + Largar tudo - - Pá de Ouro + + Limpar Seleção Rápida - - Picareta de Madeira + + O que é isto? - - Picareta de Pedra + + Partilhar no Facebook - - Picareta de Ferro + + Largar um - - Picareta de Diamante + + Trocar - - Picareta de Ouro + + Mover rápido - - Machado de Madeira + + Packs de Skins - - Machado de Pedra + + Painel de Vidro Pintado Vermelho - - Machado de Ferro + + Painel de Vidro Pintado Verde - - Machado de Diamante + + Painel de Vidro Pintado Castanho - - Machado de Ouro + + Vidro Pintado Branco - - Enxada de Madeira + + Painel de Vidro Pintado - - Enxada de Pedra + + Painel de Vidro Pintado Preto - - Enxada de Ferro + + Painel de Vidro Pintado Azul - - Enxada de Diamante + + Painel de Vidro Pintado Cinzento - - Enxada de Ouro + + Painel de Vidro Pintado Cor-de-Rosa - - Porta de Madeira + + Painel de Vidro Pintado Verde-Lima - - Porta de Ferro + + Painel de Vidro Pintado Roxo - - Capacete de Corrente + + Painel de Vidro Pintado Ciano - - Colete de Corrente + + Painel de Vidro Pintado Cinzento Claro - - Calças de Corrente + + Vidro Pintado Cor-de-Laranja - - Botas de Corrente + + Vidro Pintado Azul - - Boné de Cabedal + + Vidro Pintado Roxo - - Capacete de Ferro + + Vidro Pintado Ciano - - Capacete de Diamante + + Vidro Pintado Vermelho - - Capacete de Ouro + + Vidro Pintado Verde - - Túnica de Cabedal + + Vidro Pintado Castanho - - Colete de Ferro + + Vidro Pintado Cinzento Claro - - Colete de Diamante + + Vidro Pintado Amarelo - - Colete de Ouro + + Vidro Pintado Azul Claro - - Calças de Cabedal + + Vidro Pintado Magenta - - Leggings de Ferro + + Vidro Pintado Cinzento - - Leggings de Diamante + + Vidro Pintado Cor-de-Rosa - - Leggings de Ouro + + Vidro Pintado Verde-Lima - - Botas de Cabedal + + Painel de Vidro Pintado Amarelo - - Botas de Ferro + + Cinzento Claro - - Botas de Diamante + + Cinzento - - Botas de Ouro + + Cor-de-Rosa - - Lingote de Ferro + + Azul - - Lingote de Ouro + + Roxo - - Balde + + Ciano - - Balde de Água + + Verde-Lima - - Balde de Lava + + Cor-de-Laranja - - Sílex e Aço + + Branco - - Maçã + + Personalizada - - Arco + + Amarelo - - Seta + + Azul Claro - - Carvão + + Magenta - - Carvão Vegetal + + Castanho - - Diamante + + Painel de Vidro Pintado Branco - - Pau + + Bola Pequena - - Tigela + + Bola Grande - - Guisado de Cogumelos + + Painel de Vidro Pintado Azul Claro - - Fio + + Painel de Vidro Pintado Magenta - - Pena + + Painel de Vidro Pintado Cor-de-Laranja - - Pólvora + + Forma de Estrela - - Sementes de Trigo + + Preto - - Trigo + + Vermelho - - Pão + + Verde - - Sílex + + Forma de Creeper - - Costeleta de Porco Crua + + Explosão - - Costeleta de Porco Cozinhada + + Forma Desconhecida - - Pintura + + Vidro Pintado Preto - - Maçã de Ouro + + Armadura de Cavalo de Ferro - - Sinal + + Armadura de Cavalo de Ouro - - Vagoneta + + Armadura de Cavalo de Diamante - - Sela + + Comparador de Redstone - - Redstone + + Vagoneta com TNT - - Bola de Neve + + Vagoneta com Funil - - Barco + + Trela - - Cabedal + + Sinalizador - - Balde de Leite + + Baú Armadilhado - - Tijolo + + Placa de Pressão de Pesagem (Leve) - - Barro + + Etiqueta com Nome - - Canas de Açúcar + + Tábuas de Madeira (qualquer tipo) - - Papel + + Bloco de Comando - - Livro + + Estrela de Fogo de Artifício - - Slimeball + + Estes animais pode ser domados e depois montados. Podem ter um baú acoplado. - - Vagoneta com Baú + + Mula - - Vagoneta com Fornalha + + Nascida da criação entre um Cavalo e um Burro. Estes animais podem ser domados, depois montados e carregar baús. - - Ovo + + Cavalo - - Bússola + + Estes animais podem ser domados e depois montados. - - Cana de Pesca + + Burro - - Relógio + + Cavalo Morto-vivo - - Pó de Glowstone + + Mapa Vazio - - Peixe Cru + + Estrela do Submundo - - Peixe Cozinhado + + Foguete de Fogo de Artifício - - Pó de Tinta + + Cavalo Esqueleto - - Saco de Tinta + + Wither - - Vermelho Rosa + + Estas criaturas são criadas a partir de Caveiras Atrofiadas e Areia Movediça. Disparam caveiras explosivas contra ti. - - Verde Cato + + Placa de Pressão de Pesagem (Pesada) - - Grãos de Cacau + + Barro Pintado Cinzento Claro - - Lápis-lazúli + + Barro Pintado Cinzento - - Tinta Roxa + + Barro Pintado Cor-de-Rosa - - Tinta Ciano + + Barro Pintado Azul - - Tinta Cinzenta Clara + + Barro Pintado Roxo - - Tinta Cinzenta + + Barro Pintado Ciano - - Tinta Cor-de-rosa + + Barro Pintado Verde-Lima - - Tinta Verde-lima + + Barro Pintado Cor-de-Laranja - - Amarelo Dente-de-leão + + Barro Pintado Branco - - Tinta Azul Clara + + Vidro Pintado - - Tinta Magenta + + Barro Pintado Amarelo - - Tinta Cor-de-Laranja + + Barro Pintado Azul Claro - - Farinha de Ossos + + Barro Pintado Magenta - - Osso + + Barro Pintado Castanho - - Açúcar + + Funil - - Bolo + + Carril Ativador - - Cama + + Largador - - Repetidor de Redstone + + Comparador de Redstone - - Bolacha + + Sensor de Luz do Dia - - Mapa + + Bloco de Redstone - - Disco de Música - "13" + + Barro Pintado - - Disco de Música - "cat" + + Barro Pintado Preto - - Disco de Música - "blocks" + + Barro Pintado Vermelho - - Disco de Música - "chirp" + + Barro Pintado Verde - - Disco de Música - "far" + + Fardo de Palha - - Disco de Música - "mall" + + Barro Endurecido - - Disco de Música - "mellohi" + + Bloco de Carvão - - Disco de Música - "stal" + + Desvanecer para - - Disco de Música - "strad" + + Quando ativada, evita que os monstros e animais alterem blocos (por exemplo, as explosões de Creepers não destroem blocos e as Ovelhas não retiram Erva) ou apanhem itens. - - Disco de Música - "ward" + + Quando ativada, os jogadores mantêm o seu inventário, depois de morrerem. - - Disco de Música - "11" + + Quando desativada, os habitantes deixam de ser regenerados naturalmente. - - Disco de Música - "where are we now" + + Modo de Jogo: Aventura - - Tesoura + + Aventura - - Sementes de Abóbora + + Introduz uma semente para criares o mesmo terreno novamente. Deixa em branco para um mundo aleatório. - - Sementes de Melão + + Quando desativada, os monstros e animais não largam o saque (por exemplo, os Creepers não largam pólvora). - - Galinha Crua + + {*PLAYER*} caiu de uma escada - - Galinha Cozinhada + + {*PLAYER*} caiu de umas trepadeiras - - Bife Cru + + {*PLAYER*} caiu fora da água - - Bife + + Quando desativada, os blocos não largam objetos quando são destruídos (por exemplo, os blocos de Pedra não largam Pedra Arredondada). - - Carne Podre + + Quando desativada, os jogadores não regeneram saúde naturalmente. - - Pérola de Ender + + Quando desativada, a hora do dia não muda. - - Fatia de Melão + + Vagoneta - - Varinha de Blaze + + Prende com Trela - - Lágrima de Ghast + + Solta - - Pepita de Ouro + + Acopla - - Verruga do Submundo + + Desmonta - - Poção{*splash*}{*prefix*}{*postfix*} + + Fixa o Baú - - Garrafa de Vidro + + Lança - - Garrafa de Água + + Nomear - - Olho de Aranha + + Sinalizador - - Olho Aranha Ferm. + + Poder Primário - - Pó de Blaze + + Poder Secundário - - Creme de Magma + + Cavalo - - Posto de Poções + + Largador - - Caldeirão + + Funil - - Olho de Ender + + {*PLAYER*} caiu de um local elevado - - Melão Brilhante + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Morcegos num mundo. - - Garrafa Mágica + + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de cavalos de criação. - - Carga de Fogo + + Opções de Jogo - - Carga Fogo Carv. Veg. + + {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} utilizando {*ITEM*} - - Carga Fogo (Carvão) + + {*PLAYER*} foi cilindrado por {*SOURCE*} utilizando {*ITEM*} - - Moldura de Item + + {*PLAYER*} foi morto por {*SOURCE*} utilizando {*ITEM*} - - Gerar {*CREATURE*} + + Habitantes Contidos - - Tijolo de Submundo + + Espólio de Blocos - - Caveira + + Regeneração Natural - - Caveira de Esqueleto + + Ciclo de Luz do Dia - - Caveira de Esqueleto Atrofiado + + Manter Inventário - - Cabeça de Morto-vivo + + Regeneração de Habitantes - - Cabeça + + Saque de Habitantes - - Cabeça de %s + + {*PLAYER*} foi alvejado por {*SOURCE*} utilizando {*ITEM*} - - Cabeça de Creeper + + {*PLAYER*} caiu longe demais e foi liquidado por {*SOURCE*} - - Pedra + + {*PLAYER*} caiu longe demais e foi liquidado por {*SOURCE*} utilizando {*ITEM*} - - Bloco de Erva + + {*PLAYER*} entrou no fogo enquanto lutava com {*SOURCE*} - - Terra + + {*PLAYER*} foi condenado a cair por {*SOURCE*} - - Pedra Arredondada + + {*PLAYER*} foi condenado a cair por {*SOURCE*} - - Tábuas de Carvalho + + {*PLAYER*} foi condenado a cair por {*SOURCE*} utilizando {*ITEM*} - - Tábuas de Abeto + + {*PLAYER*} foi completamente tostado enquanto lutava com {*SOURCE*} - - Tábuas de Bétula + + {*PLAYER*} foi rebentado por {*SOURCE*} - - Tábuas da Selva + + {*PLAYER*} foi demonizado - - Rebento + + {*PLAYER*} foi dilacerado por {*SOURCE*} utilizando {*ITEM*} - - Carvalho Jovem + + {*PLAYER*} tentou nadar pela lava para escapar a {*SOURCE*} - - Abeto Jovem + + {*PLAYER*} afogou-se enquanto tentava escapar a {*SOURCE*} - - Bétula Jovem + + {*PLAYER*} foi contra um cato enquanto tentava escapar a {*SOURCE*} - - Rebentos de Árvores da Selva + + Monta - - Rocha + + +Para conduzires um cavalo, tem de estar equipado com uma sela, que pode ser comprada a aldeões ou encontrada dentro de baús escondidos pelo mundo. + - - Água + + +Os Burros e Mulas domados podem receber alforges; para isso fixa um baú. Podes aceder a estes alforges enquanto o montas ou quando rastejas. + - - Lava + + +Os Cavalos e Burros (mas não as Mulas) podem ser animais de criação como os outros animais, utilizando Maçãs Douradas ou Cenouras Douradas. As crias vão desenvolver-se e ficar adultas com o tempo, embora a alimentação com trigo ou palha acelere o processo. + - - Areia + + +Os Cavalos, Burros e Mulas devem ser domados para serem usados. Um cavalo é domado quando tentas montá-lo e consegues ficar em cima dele, enquanto ele tenta derrubar o cavaleiro. + - - Arenito + + +Quando domado, vão surgir Corações de Amor à sua volta e deixará de tentar derrubar o jogador. + - - Gravilha + + +Tenta agora montar este cavalo. Usa {*CONTROLLER_ACTION_USE*} sem objetos ou ferramentas na mão, para montá-lo. + - - Minério de Ouro + + +Aqui podes tentar domar os Cavalos e Burros. Nas redondezas também encontras Selas, Armaduras de Cavalo e outros itens úteis para cavalos, dentro de baús. + - - Minério de Ferro + + +Um Sinalizador numa pirâmide com, pelo menos, 4 camadas, também dá a opção de um poder secundário de Regeneração ou de um poder primário mais forte. + - - Minério de Carvão + + +Para definires os poderes do teu Sinalizador, tens de sacrificar um lingote de Esmeralda, Diamante, Ouro ou Ferro, no campo do pagamento. Uma vez definidos, os poderes vão emanar indefinidamente do Sinalizador. + - - Madeira + + No topo desta pirâmide está um Sinalizador inativo. - - Madeira de Carvalho + + +Este é o interface do Sinalizador, que podes usar para escolher os poderes concedidos pelo teu Sinalizador. + - - Madeira de Abeto + + +{*B*}Prime{*CONTROLLER_VK_A*} para continuar. +{*B*}Prime{*CONTROLLER_VK_B*} se já sabes como usar o interface do Sinalizador. + - - Madeira de Bétula + + +No menu do Sinalizador, podes escolher 1 poder primário para o teu Sinalizador. Quantas mais camadas tiver a tua pirâmide, mais poderes terás à escolha. + - - Madeira da Selva + + +Todos os Cavalos, Burros e Mulas adultos podem ser montados. No entanto, apenas os Cavalos podem receber armaduras e apenas as Mulas e Burros podem ser equipados com alforges para transportar objetos. + - - Carvalho + + +Este é o interface de inventário do cavalo. + - - Abeto + + +{*B*}Prime{*CONTROLLER_VK_A*} para continuar. +{*B*}Prime{*CONTROLLER_VK_B*} se já sabes como usar o inventário do cavalo. + - - Bétula + + +O inventário do cavalo permite-te transferir ou equipar objetos para o teu cavalo, Burro ou Mula. + - - Folhas + + Cintilar - - Folhas de Carvalho + + Rasto - - Folhas de Abeto + + Duração do Voo: - - Folhas de Bétula + + Sela o teu cavalo colocando uma Sela no campo da sela. Os cavalos podem receber armadura, ao colocares Armadura para Cavalos no campo da armadura. - - Folhas da Selva + + Encontraste uma Mula. - - Esponja + + + {*B*}Prime{*CONTROLLER_VK_A*} para saberes mais sobre Cavalos, Burros e Mulas. + {*B*}Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre Cavalos, Burros e Mulas. + - - Vidro + + +Os Cavalos e Burros são encontrados, principalmente, em planícies abertas. As Mulas podem ser criadas a partir de um Burro e um Cavalo, mas são estéreis. + - - + + +Também podes transferir objetos entre o teu próprio inventário e os alforges agarrados ao Burros e às Mulas, com este menu. + - - Lã Preta + + Encontraste um Cavalo. - - Lã Vermelha + + Encontraste um Burro. - - Lã Verde + + + {*B*}Prime{*CONTROLLER_VK_A*} para saberes mais sobre Sinalizadores. + {*B*}Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre Sinalizadores. + - - Lã Castanha + + +As Estrelas de Fogo de Artifício podem ser criadas quando colocas Pólvora e Tinta na grelha de criação. + - - Lã Azul + + +A Tinta vai definir a cor da explosão da Estrela de Fogo de Artifício. + - - Lã Roxa + + +A forma da Estrela de Fogo de Artifício é definida quando adicionas uma Carga de Fogo, Pepita de Ouro, Pena ou Cabeça de Habitante. + - - Lã Ciano + + +Opcionalmente, podes colocar várias Estrelas de Fogo de Artifício na grelha de criação para as adicionares ao Fogo de Artifício. + - - Lã Cinzenta Clara + + +Ao encheres mais campos da grelha de criação com Pólvora, aumentas a altura a que todas as Estrelas de Fogo de Artifício vão explodir. + - - Lã Cinzenta + + +Depois podes pegar no Fogo de Artifício criado no campo de saída, quando quiseres criá-lo. + - - Lã Cor-de-rosa + + +Podes adicionar um rasto ou um efeito de cintilar com Diamantes ou Pó de Glowstone. + - - Lã Verde-lima + + +O Fogo de Artifício é um objeto decorativo que pode ser lançado à mão ou através de Distribuidores. São criados com Papel, Pólvora e opcionalmente, Estrelas de Fogo de Artifício. + - - Lã Amarela + + As cores, o desvanecimento, a forma, o tamanho e os efeitos (tais como rastos e efeitos de cintilar) das Estrelas de Fogo de Artifício, podem ser personalizados ao incluir ingredientes adicionais, durante a sua criação. - - Lã Azul Clara + + +Tenta criar um Fogo de Artifício na Mesa de Criação utilizando uma variedade de ingredientes dos baús. + - - Lã Magenta + + +Depois de teres criado uma Estrela de Fogo de Artifício, podes definir a cor do desvanecimento de uma Estrela de Fogo de Artifício, criando-a com Tinta. + - - Lã Cor-de-laranja + + +Contidos em vários baús, deste local, há vários objetos usados na criação de FOGO DE ARTIFÍCIO! + - - Lã Branca + + {*B*}Prime{*CONTROLLER_VK_A*} para saberes mais sobre Fogo de Artifício. + {*B*}Prime{*CONTROLLER_VK_B*} se já conheces o Fogo de Artifício. + - - Flor + + +Para criar um Fogo de Artifício, coloca Pólvora e Papel na grelha de criação de 3x3 que é mostrada em cima do teu inventário. + - - Rosa + + Esta sala contém Funis - - Cogumelo + + + {*B*}Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre Funis. + {*B*}Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre Funis. + - - Bloco de Ouro + + +Os Funis são usados para inserir ou remover objetos de contentores e para apanhar automaticamente objetos que são atirados para dentro deles. + - - Uma forma compacta de armazenar Ouro. + + +Os Sinalizadores ativos projetam um feixe de luz brilhante para o céu e concedem poderes aos jogadores nas proximidades. São criados com Vidro, Obsidiana e Estrelas do Submundo, que podem ser obtidas quando derrotas o Wither. + - - Bloco de Ferro + + +Os Sinalizadores devem ser colocados de modo a receberem luz do sol durante o dia. Os Sinalizadores devem ser colocados em Pirâmides de Ferro, Ouro, Esmeralda ou Diamante. No entanto, a escolha do material não tem qualquer efeito no poder do sinalizador. + - - Uma forma compacta de armazenar Ferro. + + +Tenta usar o Sinalizador para configurares os poderes que ele concede. Podes usar os Lingotes de Ferro disponibilizados para o pagamento necessário. + - - Placa de Pedra + + +Eles podem afetar Postos de Poções, Baús, Distribuidores, Largadores, Vagonetas com Baús, Vagonetas com Funis, além de outros Funis. + - - Placa de Pedra + + +Existem vários esquemas úteis de Funis nesta sala, que podes observar e experimentar. + - - Placa de Arenito + + +Este é o interface do Fogo de Artifício, que podes usar para criar Fogos de Artifício e Estrelas de Fogo de Artifício. + - - Placa de Madeira de Carvalho + + +{*B*}Prime{*CONTROLLER_VK_A*} para continuar. +{*B*}Prime{*CONTROLLER_VK_B*} se já sabes como utilizar o interface do Fogo de Artifício. + - - Placa (Pedra Arredondada) + + +Os Funis tentam, continuamente, sugar objetos para fora de um contentor colocado em cima deles. Também vão tentar inserir itens armazenados para dentro de um contentor de saída. + - - Placa de Tijolo + + +No entanto, se um Funil for operado por Redstone, ficará inativo e deixará de sugar e de inserir itens. + - - Placa de Tijolos Pedra + + +Um Funil aponta na direção em que tenta fazer sair itens. Para fazer com que um Funil aponte para um bloco em particular, coloca o Funil contra esse bloco, enquanto rastejas. + - - Placa de Carvalho + + Estes inimigos podem ser encontrados em pântanos e atacam-te com poções. Quando mortos, largam Poções. - - Placa de Madeira de Abeto + + O número máximo de Pinturas/Molduras de Objetos num mundo foi atingido. - - Placa de Madeira de Bétula + + Não podes produzir inimigos no modo Calmo. - - Placa de Madeira da Selva + + Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos de criação foi alcançado. - - Placa (Tijolo do Submundo) + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lulas num mundo. - - Tijolos + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de inimigos num mundo. - - TNT + + 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. - - Estante de Livros + + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Lobos de criação. - - Pedra com Musgo + + O número máximo de Cabeças de Habitantes num mundo foi alcançado. - - Obsidiana + + Inverter Olhar - - Tocha + + Esquerdino - - Tocha (Carvão) + + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Galinhas de criação. - - Tocha (Carvão Vegetal) + + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Vacogumelos de criação. - - Fogo + + Foi alcançado o número máximo de Barcos num mundo. - - Gerador de Monstros + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Galinhas num mundo. - - Escadas de Carvalho + + {*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, extraterrestres. 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 "eletrões" e "protões".{*EF*}{*B*}{*B*} - - Baú + + {*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 eletricidade 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*} - - Pó de Redstone + + Repor Submundo - - Minério de Diamante + + %s entrou em O Fim - - Bloco de Diamante + + %s abandonou O Fim - - Uma forma compacta de armazenar Diamantes. + + {*C3*}Sei a que jogador te referes.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sim. Tem cuidado. Agora o nível está mais elevado. 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. É menos aterrorizador 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 com as á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 a verdade protegida, 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 seu nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Jogador de jogos.{*EF*}{*B*}{*B*} +{*C3*}Boa.{*EF*}{*B*}{*B*} - - Mesa de Criação + + Queres mesmo repor o Submundo desta gravação no seu estado predefinido? Vais perder tudo o que construíste no Submundo! - - Plantações + + De momento, não é possível usar o Ovo de Geração. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos foi alcançado. - - Terreno de Cultivo + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Vacogumelos. - - Fornalha + + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lobos num mundo. - - Sinal + + Repor Submundo - - Porta de Madeira + + Não Repor Submundo - - Escadote + + De momento, não é possível tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos. - - Carril + + Morreste! - - Carril Eletrificado + + Opções de Mundo - - Carril Detetor + + Pode Construir e Escavar - - Escadas de Pedra + + Pode Usar Portas e Interruptores - - Alavanca + + Gerar Estruturas - - Placa de Pressão + + Mundo Superplano - - Porta de Ferro + + Baú de Bónus - - Minério de Redstone + + Pode Abrir Contentores - - Tocha Redstone + + Expulsar Jogador - - Botão + + Pode Voar - - Neve + + Desativar Exaustão - - Gelo + + Pode Atacar Jogadores - - Cato + + Pode Atacar Animais - - Barro + + Moderador - - Cana de Açúcar + + Privilégios de Anfitrião - - Jukebox + + Instruções de Jogo - - Cerca + + Controlos - - Abóbora + + Definições - - Jack-O-Lantern + + Regenerar - - Bloco do Submundo + + Ofertas de Conteúdo Transferível - - Areia Movediça + + Alterar Skin - - Glowstone + + Ficha técnica - - Portal + + Explosões de TNT - - Minério de Lápis-lazúli + + Jogador vs. Jogador - - Bloco de Lápis-lazúli + + Confiar nos Jogadores - - Uma forma compacta de armazenar Lápis-Lazúli. + + Reinstalar Conteúdo - - Distribuidor + + Definições de Depuração - - Bloco de Notas + + Fogos Propagados - - Bolo + + Ender Dragon - - Cama - - - Teia + + {*PLAYER*} foi morto pelo bafo do Ender Dragon - - Erva Alta + + {*PLAYER*} foi assassinado por {*SOURCE*} - - Arbusto Morto + + {*PLAYER*} foi assassinado por {*SOURCE*} - - Díodo + + {*PLAYER*} morreu - - Baú Fechado + + {*PLAYER*} explodiu - - Alçapão + + {*PLAYER*} foi morto por magia - - Lã (qualquer cor) + + {*PLAYER*} foi atingido por {*SOURCE*} - - Pistão + + Rochas Enevoadas - - Pistão Pegajoso + + Mostrar HUD - - Bloco de Peixe Prateado + + Mostrar Mão - - Tijolos de Pedra + + {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} - - Tijolos de Pedra com Musgo + + {*PLAYER*} foi agredido por {*SOURCE*} - - Tijolos de Pedra Rachada + + {*PLAYER*} foi morto por {*SOURCE*} utilizando magia - - Tijolos de Pedra Burilados + + {*PLAYER*} caiu do mundo - - Cogumelo + + Packs de Textura - - Cogumelo + + Packs de Mistura - - Barras de Ferro + + {*PLAYER*} foi consumido pelas chamas - - Painel de Vidro + + Temas - - Melão + + Imagens de Jogador - - Caule de Abóbora + + Itens de Avatar - - Caule de Melão + + {*PLAYER*} morreu carbonizado - - Trepadeiras + + {*PLAYER*} morreu à fome - - Portão de Vedação + + {*PLAYER*} foi picado até à morte - - Escadas de Tijolo + + {*PLAYER*} embateu no chão com muita força - - Escadas (Tijolo de Pedra) + + {*PLAYER*} tentou nadar na lava - - Pedra com Peixe Prateado + + {*PLAYER*} sufocou numa parede - - Pedra Arredondada com Peixe Prateado + + {*PLAYER*} afogou-se - - Tijolo de Pedra com Peixe Prateado + + Mensagens de Morte - - Micélio + + Já não és um moderador - - Folha de Nenúfar + + Já podes voar - - Tijolo de Submundo + + Já não podes voar - - Cerca (Tijolos Submundo) + + Já não podes atacar animais - - Escadas (Tijolo Submundo) + + Já podes atacar animais - - Verruga do Submundo + + Já és um moderador - - Mesa de Feitiços + + Já não vais ficar exausto - - Posto de Poções + + Já és invulnerável - - Caldeirão + + Já não és invulnerável - - Portal do Fim + + %d MSP - - Estrutura de Portal do Fim + + Agora vais ficar exausto - - Pedra do Fim + + Já estás invisível - - Ovo de Dragão + + Já não estás invisível - - Arbusto + + Já podes atacar jogadores - - Feto + + Já podes escavar e usar objetos - - Escadas de Grés + + Já não podes colocar blocos - - Escadas de Abeto + + Já podes colocar blocos - - Escadas de Bétula + + Personagem Animada - - Escadas da Selva + + Anim. Skin Personalizada - - Candeeiro de Redstone + + Já não podes escavar ou usar objetos - - Cacau + + Agora podes usar portas e interruptores - - Caveira + + Já não podes atacar habitantes - - Controlos Atuais + + Já podes atacar habitantes - - Esquema + + Já não podes atacar jogadores - - Mover/Sprint + + Já não podes usar portas e interruptores - - Olhar + + Agora podes usar contentores (tais como baús) - - Pausa + + Já não podes usar contentores (tais como baús) - - Saltar + + Invisível - - Saltar/Voar Para Cima + + Sinalizadores - - Inventário + + +{*T3*}INSTRUÇÕES DE JOGO: SINALIZADORES{*ETW*}{*B*}{*B*} +Os Sinalizadores ativos projetam um feixe de luz brilhante para o céu e concedem poderes aos jogadores nas proximidades.{*B*} +São criados com Vidro, Obsidiana e Estrelas do Submundo, que podem ser obtidas quando derrotas o Wither.{*B*}{*B*} +Os Sinalizadores devem ser colocados de modo a receberem luz do sol durante o dia. Os Sinalizadores devem ser colocados em Pirâmides de Ferro, Ouro, Esmeralda ou Diamante.{*B*} +O material onde é colocado o Sinalizador não tem qualquer efeito no poder do Sinalizador.{*B*}{*B*} +No menu do Sinalizador, podes escolher um poder primário para o teu Sinalizador. Quantas mais camadas tiver a tua pirâmide, mais poderes terás à escolha.{*B*} +Um Sinalizador numa pirâmide com, pelo menos, quatro camadas, também dá a opção de um poder secundário de Regeneração ou de um poder primário mais forte.{*B*}{*B*} +Para definires os poderes do teu Sinalizador, tens de sacrificar um lingote de Esmeralda, Diamante, Ouro ou Ferro, no campo do pagamento.{*B*} +Uma vez definidos, os poderes vão emanar indefinidamente do Sinalizador.{*B*} + - - Mudar o Objeto Agarrado + + Fogo de Artifício + + + Idiomas + + + Cavalos + + + {*T3*}INSTRUÇÕES DE JOGO: CAVALOS{*ETW*}{*B*}{*B*} +Os Cavalos e Burros são normalmente encontrados em planícies abertas. As Mulas são os descendentes de um Burro e um Cavalo, mas são estéreis.{*B*} +Todos os Cavalos, Burros e Mulas adultos podem ser montados. No entanto, apenas os cavalos podem receber armaduras e apenas as Mulas e Burros podem ser equipados com alforges para transportar itens.{*B*}{*B*} +Os Cavalos, Burros e Mulas precisam de ser domados para serem utilizados. Um cavalo é domado com tentativas de montá-lo, em que deves tentar ficar no cavalo enquanto ele tenta derrubar o cavaleiro.{*B*} +Quando surgirem Corações de Amor à volta do cavalo, está domado, e já não vai tentar derrubar o jogador. Para conduzir um cavalo, o jogador têm de equipar o cavalo com uma Sela.{*B*}{*B*} +As Selas podem ser compradas a aldeões ou encontradas dentro de Baús escondidos pelo mundo.{*B*} +Os Burros e Mulas domados podem receber alforges; para isso fixa um Baú. Estes alforges podem então ser acedidos enquanto montas ou rastejas.{*B*}{*B*} +Os Cavalos e Burros (mas não as Mulas) podem ser animais de criação como os outros animais, utilizando Maçãs Douradas ou Cenouras Douradas.{*B*} +As crias vão desenvolver-se e ficar adultas com o tempo, embora a alimentação com Trigo ou Palha acelere o processo.{*B*} + - - Ação + + {*T3*}INSTRUÇÕES DE JOGO: FOGO DE ARTIFÍCIO{*ETW*}{*B*}{*B*} +O Fogo de Artifício é um objeto decorativo que pode ser lançado à mão ou através de Distribuidores. São criados com Papel, Pólvora e opcionalmente, Estrelas de Fogo de Artifício.{*B*} +As cores, o desvanecimento, a forma, o tamanho e os efeitos (tais como rastos e faíscas) das Estrelas de Fogo de Artifício, podem ser personalizados ao incluir ingredientes adicionais, durante a sua criação.{*B*}{*B*} +Para criar um Fogo de Artifício, coloca Pólvora e Papel na grelha de criação de 3x3 que é mostrada em cima do teu inventário.{*B*} +Opcionalmente, podes colocar várias Estrelas de Fogo de Artifício na grelha de criação para as adicionares ao Fogo de Artifício.{*B*} +Ao encheres mais campos da grelha de criação com Pólvora, aumentas a altura a que todas as Estrelas de Fogo de Artifício vão explodir.{*B*}{*B*} +Depois podes pegar no Fogo de Artifício criado no campo de saída.{*B*}{*B*} +As Estrelas de Fogo de Artifício podem ser criadas quando colocas Pólvora e Tinta na grelha de criação.{*B*} +- A tinta vai definir a cor da explosão da Estrela de Fogo de Artifício.{*B*} +- A forma da Estrela de Fogo de Artifício é definida quando adicionas uma Carga de Fogo, Pepita de Ouro, Pena ou Cabeça de Habitante.{*B*} +- Podes adicionar um rasto ou um efeito de cintilar com Diamantes e Pó de Glowstone.{*B*}{*B*} +Depois de teres criado uma Estrela de Fogo de Artifício, podes definir a cor do desvanecimento de uma Estrela de Fogo de Artifício, criando-a com Tinta. + + + {*T3*}INSTRUÇÕES DE JOGO: LARGADORES{*ETW*}{*B*}{*B*} +Quando operados com Redstone, os Largadores vão largar um único objeto neles contido, aleatoriamente, para o chão. Usa {*CONTROLLER_ACTION_USE*} para abrir o Largador e depois podes carregar o Largador com objetos do teu inventário.{*B*} +Se o Largador estiver virado para um Baú ou outro tipo de Contentor, o objeto será então colocado nesse contentor. Podes construir longas cadeias de Largadores para transportares objetos ao longo de uma grande distância, mas para que isto funcione, eles terão de ser alternadamente ligados e desligados. + + + Quando usado, torna-se um mapa da parte do mundo em que estás e é preenchido à medida que exploras. + + + Largada pelo Wither, usada para criar Sinalizadores. + + + Funis + + + +{*T3*}INSTRUÇÕES DE JOGO: FUNIS{*ETW*}{*B*}{*B*} +Os Funis são usados para inserir ou remover objetos de contentores, ou para apanhar automaticamente objetos que são atirados para dentro eles.{*B*} +Eles podem afetar Postos de Poções, Baús, Distribuidores, Largadores, Vagonetas com Baús, Vagonetas com Funis, além de outros Funis.{*B*}{*B*} +Os Funis tentam, continuamente, sugar objetos para fora de um contentor colocado em cima deles. Também vão tentar inserir itens armazenados para dentro de um contentor de saída.{*B*} +Se um Funil for operado com Redstone, ficará inativo e deixará de sugar e de inserir itens.{*B*}{*B*} +Um Funil aponta na direção em que tenta fazer sair itens. Para fazer com que um Funil aponte para um bloco em particular, coloca o Funil contra esse bloco enquanto rastejas.{*B*} + - - Usar + + Largadores - - Criar + + SEM USO - - Largar + + Saúde Instantânea - - Rastejar + + Danos Instantâneos - - Rastejar/Voar Para Baixo + + Impulso de Salto - - Alterar Modo de Câmara + + Cansaço por Escavação - - Jogadores/Convidar + + Força - - Movimento (Em Voo) + + Fraqueza - - Esquema 1 + + Náusea - - Esquema 2 + + SEM USO - - Esquema 3 + + SEM USO - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + SEM USO - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Regeneração - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Resistência - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + A procurar Semente para o Gerador de Mundos - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Quando ativado, cria explosões coloridas. A cor, efeito, forma e o desvanecimento são determinados pela Estrela de Fogo de Artifício, quando é criado o Fogo de Artifício. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Um tipo de carril que pode ativar ou desativar Vagonetas com Funis e ativar Vagonetas com TNT. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Usado para segurar e largar objetos, ou empurrar objetos para outro contentor, quando recebe uma carga de Redstone. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Blocos coloridos criados ao tingir barro Endurecido. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Fornece uma carga de Redstone. A carga será mais forte se tiver mais objetos em cima da placa. Requer mais peso do que a placa leve. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Usado como uma fonte de energia de Redstone. Pode ser transformado novamente em Redstone. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Usado para apanhar objetos ou para transferir objetos para dentro e para fora de contentores. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Pode ser dado a comer a Cavalos, Burros ou Mulas para curar até 10 Corações. Acelera o crescimento das crias. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Morcego - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Estas criaturas voadoras são encontradas em cavernas ou outros espaços fechados de grande dimensão. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Bruxa - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Criado ao derreter Barro numa fornalha. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Criado a partir de vidro e uma tinta. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Criado a partir de Vidro Pintado - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Fornece uma carga de Redstone. A carga será mais forte se tiver mais objetos em cima da placa. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + É um bloco que envia um sinal de Redstone consoante a luz do sol (ou falta de luz do sol). - - {*B*}Prime{*CONTROLLER_VK_A*} para continuar. + + É um tipo de Vagoneta especial que funciona de modo semelhante a um Funil. Recolhe objetos em cima de carris e de contentores em cima deles. - - {*B*}Prime{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} - Prime{*CONTROLLER_VK_B*} se achas que estás preparado para jogar sozinho. + + Um tipo de Armadura especial que pode ser equipada num cavalo. Fornece 5 de Armadura. - - Em Minecraft, podes criar tudo aquilo que quiseres colocando blocos. -À noite, os monstros andam à solta; constrói um abrigo antes que isso aconteça. + + Usada para determinar a cor, efeito e forma de um fogo de artifício. - - Usa{*CONTROLLER_ACTION_LOOK*} para olhares para cima, para baixo e em redor. + + Usado em circuitos de Redstone para manter, comparar ou subtrair força do sinal, ou para medir o estado de determinados blocos. - - Usa{*CONTROLLER_ACTION_MOVE*} para te deslocares. + + É um tipo de Vagoneta que atua como um bloco de TNT móvel. - - 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é se esgotar o tempo ou a comida. + + Um tipo de Armadura especial que pode ser equipada num cavalo. Fornece 7 de Armadura. - - Prime{*CONTROLLER_ACTION_JUMP*} para saltar. + + Usado para executar comandos. - - 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 escavares alguns blocos... + + Projeta um feixe de luz para o céu e pode fornecer Efeitos de Estado aos jogadores nas proximidades. - - 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. + + Armazena blocos e objetos no interior. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. O baú armadilhado também cria uma carga de Redstone, quando aberto. - - Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação. + + Um tipo de Armadura especial que pode ser equipada num cavalo. Fornece 11 de Armadura. - - À medida que recolhes e crias mais objetos, o teu inventário fica mais cheio.{*B*} - Prime{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + + Usada para o jogador segurar habitantes ou para agarrar os habitantes a postes de Cercas - - À 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. + + Usado para dar nomes aos habitantes no mundo. - - 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. + + Rapidez - - 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. + + Jogo Completo - - 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*} + + Retomar Jogo - - A madeira que recolhes pode ser transformada em tábuas. Abre a interface de criação para as criares.{*PlanksIcon*} + + Gravar Jogo - - Muitas vezes, o processo de criação envolve vários passos. Agora que já tens algumas tábuas, podes criar mais objetos. Produz uma mesa de criação.{*CraftingTableIcon*} + + Jogar - - 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*} + + Tabelas de Liderança - - Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para alterares o objeto que estás a segurar. + + Ajuda e Opções - - Usa{*CONTROLLER_ACTION_USE*} para utilizar objetos, interagir com objetos e colocar alguns objetos. Os objetos colocados podem ser recolhidos novamente escavando-os com a ferramenta certa. + + Dificuldade: - - 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. + + JvJ: - - Aponta a mira para a mesa de criação e prime{*CONTROLLER_ACTION_USE*} para a abrires. + + Confiar Jogadores: - - 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 duram mais tempo. Cria uma pá de madeira.{*WoodenShovelIcon*} + + TNT: - - Com um machado poderás cortar a madeira e os blocos de madeira mais rapidamente. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente e duram mais tempo. Cria um machado de madeira.{*WoodenHatchetIcon*} + + Modo Jogo: - - 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, duram mais tempo e que te permitem escavar materiais mais duros. Cria uma picareta de madeira.{*WoodenPickaxeIcon*} + + Estruturas: - - Abre o contentor + + Tipo de Nível: - - - A noite pode cair rapidamente e é perigoso estar ao ar livre sem estar preparado. Podes criar armaduras e armas, mas é recomendável que possuas um abrigo seguro. - + + Não foram encontrados jogos - - - Nas redondezas, existe um abrigo de Mineiros abandonado, que podes completar para garantir a tua segurança durante a noite. - + + Apenas por Convite - - - Terás de recolher os recursos necessários para completar o abrigo. Podes construir as paredes e o teto com qualquer tipo de bloco, mas também terás de criar uma porta, algumas janelas e iluminação. - + + Mais Opções - - 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*} + + Carregar - - Recolheste pedras arredondadas suficientes para construir uma fornalha. Utiliza a tua mesa de criação para criares uma. + + Opções de Anfitrião - - Usa{*CONTROLLER_ACTION_USE*} para colocares a fornalha no mundo e, em seguida, abre-a. + + Jogadores/Convidar - - Usa a fornalha para criar carvão vegetal. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + + Jogo Online - - Usa a fornalha para criar vidro. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + + Novo Mundo - - 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*} + + Jogadores - - Usa{*CONTROLLER_ACTION_USE*} para colocar a porta. Podes usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + + Juntar ao Jogo - - À noite, pode ficar muito escuro, por isso é melhor teres alguma iluminação dentro do abrigo, para conseguires ver. Cria uma tocha a partir de paus e carvão vegetal, utilizando a interface de criação.{*TorchIcon*} + + Iniciar Jogo - - - Concluíste a primeira parte do tutorial. - + + Nome do Mundo - - {*B*} -Prime{*CONTROLLER_VK_A*} para continuares o tutorial.{*B*} -Prime{*CONTROLLER_VK_B*} se achas que estás pronto para jogar sozinho. + + Semente para o Gerador de Mundos - - - 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. - + + Deixar livre para uma semente aleatória - - {*B*} - Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário. + + Fogos Propagados: - - - Usa{*CONTROLLER_MENU_NAVIGATE*} para moveres o ponteiro. Usa{*CONTROLLER_VK_A*} para apanhares um objeto com o ponteiro. - Caso exista mais do que um objeto, irás apanhá-los todos, ou poderás usar{*CONTROLLER_VK_X*} para apanhares apenas metade. - + + Editar mensagem do sinal: - - - 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. - + + Preenche os detalhes da tua captura de ecrã - - - Se deslocares o ponteiro para fora dos limites do interface, com um objeto selecionado, podes largar o objeto. - + + Legenda - - Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_BACK*}. + + Dicas Durante o Jogo - - Prime{*CONTROLLER_VK_B*} agora para saíres do inventário. + + Ecrã Dividido Vertical 2 Jog. - - 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. + + Concluído - - {*B*} - Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário do modo criativo. + + Captura de ecrã do jogo - - 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. - + + Sem Efeitos - - - O ponteiro irá mover-se automaticamente para 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. - + + Velocidade + + + Lentidão + + + Editar mensagem do sinal: + + + As texturas, os ícones e a interface de utilizador clássicos do Minecraft! + + + Mostrar Todos os Mundos de Mistura + + + Sugestões + + + Reinstalar Item de Avatar 1 + + + Reinstalar Item de Avatar 2 + + + Reinstalar Item de Avatar 3 + + + Reinstalar Tema + + + Reinstalar Imagem de Jogador 1 + + + Reinstalar Imagem de Jogador 2 + + + Opções + + + Interface de Utilizador + + + Repor Predefinições + + + Ver Oscilações + + + Áudio + + + Controlo + + + Gráficos + + + 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 para poções. + + + Utilizadas na preparação de poções. Crescem de forma selvagem nas Fortalezas do Submundo. Também podem ser plantadas em Areias Movediças. + + + Escorregadio quando pisado. Transforma-se em água se estiver sobre outro bloco quando é destruído. Derrete-se se estiver perto de uma fonte de luz ou se for colocado no Submundo. + + + Pode ser usado como decoração. + + + Utilizada na preparação de poções e para localizar Fortalezas. É produzida pelos Blazes, que se encontram normalmente junto ou dentro de Fortalezas do Submundo. + + + Podem ter vários efeitos, consoante o uso. + + + 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. + + + 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. + + + Crescem ao longo do tempo depois de plantadas. Podem ser recolhidas com tesouras. Podem ser escaladas como escadas. + + + Semelhante a uma porta, mas utilizado principalmente com vedações. + + + Pode ser criado a partir de Fatias de Melão. + + + Blocos transparentes que podem ser usados em vez dos Blocos de Vidro. + + + Igual a um pistão comum mas quando recolhe, puxa o bloco que está a tocar na parte esticada do pistão. + + + É feito de blocos de Pedra e encontra-se habitualmente nas Fortalezas. + + + Utilizadas como barreiras, semelhante às vedações. + + + Podem ser plantadas para produzir abóboras. + + + 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. + + + Faz surgir um Peixe Prateado quando destruído. Também pode fazer surgir um Peixe Prateado, se estiver perto de outro Peixe Prateado que está a ser atacado. + + + Podem ser plantadas para produzir 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. + + + Enche-se com água utilizando um balde ou com a chuva e pode ser usado para encher Garrafas de Vidro com água. + + + 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. + + + São similares a uma vitrina e irão apresentar o item ou bloco lá colocado. + + + Quando lançados, 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. + + + Pode ser colhido para recolher Grãos de Cacau. + + + Vaca + + + Solta cabedal quando é morta. Pode também ser ordenhada com um balde. + + + Ovelha + + + As Cabeças de Habitantes podem ser colocadas como decoração ou usadas como máscara, no campo do capacete. + + + Lula + + + Solta sacos de tinta quando é morta. + + + Útil para incendiar coisas, ou para iniciar incêndios indiscriminadamente quando disparadas de um Distribuidor. + + + Flutua na água e pode caminhar-se sobre ele. + + + Utilizado para construir Fortalezas do Submundo. Imune às bolas de fogo de Ghast. + + + Utilizada em Fortalezas do Submundo. + + + Quando atirado, mostra a direção para um Portal do Fim. Se forem colocados doze destes olhos nas Estruturas de Portal do Fim, o Portal do Fim é ativado. + + + Usado na preparação de poções. + + + Semelhante aos Blocos de Erva, mas ótimo para cultivar cogumelos. + + + Encontra-se nas Fortalezas do Submundo e produz Verrugas do Submundo quando se parte. + + + Um tipo de bloco encontrado em O Fim. É altamente resistente a explosões, por isso, é útil para construir. + + + Este bloco é criado quando o Dragão de O Fim é derrotado. + + + Quando atirada, produz Orbes de Experiência, que aumentam os teus pontos de experiência se forem recolhidos. + + + 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 de O Fim. + + + Usadas para formar um Portal de O Fim. + + + Quando é ativado (utilizando um botão, alavanca, placa de pressão, tocha de Redstone ou Redstone com qualquer um destes), o pistão estica-se, se puder, e empurra blocos. + + + 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, numa fornalha. + + + 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 tentares escavá-lo. + + + Retirado da pedra com uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. + + + Uma forma compacta de armazenar bolas de neve. + + + 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. + + + Faz aparecer monstros no mundo. + + + Pode ser escavada com uma pá para criar bolas de neve. + + + Por vezes produz sementes de trigo, quando partido. + + + Pode ser usada para criar tinta. + + + Recolhe-se com uma pá. Por vezes produz sílex quando é escavada. É afetada pela gravidade, se não tiver um bloco por baixo. + + + 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. + + + Utilizada 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 de ferro ou superior para recolher pó de Redstone. + + + Não pode ser partida. + + + Incendeia tudo aquilo em que toca. Pode ser recolhida num balde. + + + Recolhe-se com uma pá. Pode ser derretida para criar vidro utilizando a fornalha. É afetada pela gravidade, se não tiver um bloco por baixo. + + + 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. + + + É colocado no chão para transportar uma carga elétrica. Quando utilizado como ingrediente duma poção, aumenta a duração do efeito. + + + Recolhido ao matar uma vaca, pode ser usado para criar uma armadura ou para fazer Livros. + + + Recolhida ao matar um Slime, pode ser usada como ingrediente para poções ou na criação de Pistões Pegajosos. + + + Postos de forma aleatória pelas galinhas, podem ser usados para criar alimentos. + + + Recolhido ao escavar gravilha, pode ser usado para criar uma ferramenta de sílex e aço. + + + Quando usada num porco, permite-te montá-lo. Podes depois conduzir o porco com uma Cenoura num Pau. + + + Recolhida ao escavar neve, pode ser atirada. + + + Recolhido ao extrair Glowstone, pode ser usado para criar novos blocos de Glowstone ou como ingrediente de uma poção para aumentar a potência do efeito. + + + Quando partidas, por vezes soltam um rebento que pode ser plantado para que cresça uma árvore. + + + Encontrada em masmorras, pode ser usada na construção e decoração. + + + Usadas para obter lã das ovelhas e recolher blocos de folhas. + + + Recolhido ao matar um esqueleto. Pode ser usado para criar farinha de ossos e como alimento 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. + + + Recolhido nas plantações, pode ser usado para criar alimentos. + + + Pode criar açúcar. + + + Pode ser usada como capacete ou criar um Jack-O-Lantern, em conjunto com uma tocha. Também é o ingrediente principal da Tarte de Abóbora. + + + Queima eternamente, se for aceso. + + + Uma vez crescidas, as plantações são recolhidas e resultam em trigo. + + + Terreno preparado para semear. + + + Pode ser cozinhado na fornalha para criar tinta verde. + + + Abranda o movimento de tudo aquilo que lhe passar por cima. + + + Recolhida ao matar uma galinha, pode criar uma seta. + + + Recolhida ao matar um Creeper, pode ser usada para criar TNT ou como ingrediente para fazer poções. + + + Podem ser plantadas em terrenos de cultivo para obter colheitas. Certifica-te de que as sementes têm luz suficiente para crescer! + + + Ficar dentro do portal permite-te passar entre o Mundo Superior e o Submundo. + + + Utilizado como combustível na fornalha, ou para criar tochas. + + + Recolhido ao matar uma aranha, pode ser usado para criar um Arco, uma Cana de Pesca ou colocado no chão para fazer uma Armadilha com Fio. + + + Solta lã quando é tosquiada (se ainda não tiver sido tosquiada). Pode ser tingida para que a sua lã ganhe uma cor diferente. + + + Business Development + + + Diretor de Portfolio + + + Product Manager + + + Development Team + + + Release Management + + + Diretor, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Diretor de Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Pá de Ferro + + + Pá de Diamante + + + Pá de Ouro + + + Espada de Ouro + + + Pá de Madeira + + + Pá de Pedra + + + Picareta de Madeira + + + Picareta de Ouro + + + Machado de Madeira + + + Machado de Pedra + + + Picareta de Pedra + + + Picareta de Ferro + + + Picareta de Diamante + + + Espada de Diamante + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Espada de Madeira + + + Espada de Pedra + + + Espada de Ferro + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Dispara bolas flamejantes que explodem por contacto. + + + Slime + + + Divide-se em Slimes mais pequenos, quando sofre danos. + + + Pastor Morto-vivo + + + Inicialmente dócil, mas ataca em grupos, se atacares um deles. + + + Ghast + + + Enderman + + + Aranha da Caverna + + + A sua mordidela é venenosa. + + + Vacogumelos + + + Ataca-te, se olhares para ele. Consegue movimentar blocos. + + + Peixe Prateado + + + Atrai os Peixes Prateados escondidos, quando atacado. Esconde-se nos blocos de pedra. + + + Ataca-te quando te aproximas. + + + 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. + + + Galinha + + + Solta penas quando é morta e também põe ovos de forma aleatória. + + + Porco + + + Creeper + + + Aranha + + + Ataca-te quando te aproximas. Pode subir paredes. Solta fios quando é morta. + + + Morto-vivo + + + Explode se te aproximares demasiado! + + + Esqueleto + + + Dispara setas contra ti. Solta setas quando é morto. + + + Faz guisado de cogumelos, quando usada com uma tigela. Produz cogumelos e torna-se uma vaca normal, quando tosquiada. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + Um grande dragão preto que se encontra em O Fim. + + + Blaze + + + Inimigos que podem ser encontrados no Submundo, principalmente dentro das Fortalezas do Submundo. Produzem Varinhas de Blaze quando são mortos. + + + Golem de Neve + + + O Golem de Neve pode ser criado pelos jogadores com blocos de neve e uma abóbora. Atiram bolas de neve aos inimigos dos seus criadores. + + + Ender Dragon + + + Cubo de Magma + + + Podem ser encontrados em Selvas. Podem ser domesticados quando alimentados com Peixe Cru. Porém, tens de deixar que seja o Ocelote a aproximar-se de ti, pois qualquer movimento brusco vai assustá-lo. + + + Golem de Ferro + + + Surge nas Aldeias para protegê-las e pode ser criado usando Blocos de Ferro e Abóboras. + + + Podem ser encontrados no Submundo. Semelhantes aos Slimes, dividem-se em versões mais pequenas, quando são mortos. + + + Aldeão + + + Ocelote + + + Permite a criação de feitiços mais poderosos, quando colocada em redor da Mesa de Feitiços. - - - Se deslocares o ponteiro para fora dos limites do interface, com um objeto selecionado, podes largar o objeto no mundo. Para limpar todos os objetos na barra de seleção rápida, prime{*CONTROLLER_VK_X*}. - + + {*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, na fornalha.{*B*}{*B*} +Coloca a fornalha no mundo e prime{*CONTROLLER_ACTION_USE*} para usá-la.{*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 dicas que te permitem mover o objeto para a fornalha com um movimento rápido. - - - Desloca-te nos separadores de Tipo de Grupo no topo utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do objeto que queres recolher. - + + {*T3*}INSTRUÇÕES DE JOGO: DISTRIBUIDOR{*ETW*}{*B*}{*B*} +O Distribuidor é utilizado para disparar objetos. Terás de colocar um interruptor, como por exemplo uma alavanca, junto ao distribuidor, para ativá-lo.{*B*}{*B*} +Para encheres o distribuidor com objetos 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. - - Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_BACK*}. + + {*T3*}INSTRUÇÕES DE JOGO: PREPARAÇÃO DE POÇÕES{*ETW*}{*B*}{*B*} +Para prepares 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 espaços para garrafas, por isso, podes preparar três poções ao mesmo tempo. Um ingrediente pode ser usado nas três garrafas, por isso, prepara sempre três poções em simultâneo, para aproveitares melhor os teus recursos.{*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 nesta poção de base, irás obter uma poção com um efeito.{*B*} +Depois de teres esta poção, podes adicionar um terceiro ingrediente para que o efeito dure mais tempo (com Pó de Redstone), seja mais intenso (com Pó de Glowstone) ou se transforme numa poção negativa (com 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*}Melão 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. - - - Prime{*CONTROLLER_VK_B*} agora para saíres do inventário do modo criativo. - + + {*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. - - - Este é o interface de criação. Permite-te combinar os objetos que recolheste para criares novos objetos. - + + {*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 colocá-lo no teu inventário. - - {*B*} - Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes criar. + + {*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 uma área de criação maior e uma seleção de objetos mais variada. - - {*B*} - Prime{*CONTROLLER_VK_X*} para apresentar a descrição do objeto. + + {*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 espaço por baixo do livro na Mesa de Feitiços, os três botões à direita do espaço 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 irás ver 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, ser extraídos nas minas ou cultivados no mundo. {*B*}{*B*} +Os Livros Enfeitiçados são usados na Bigorna para aplicar feitiços aos objetos. Assim tens mais controlo sobre os feitiços que pretendes aplicar aos teus objetos.{*B*} - - {*B*} -Prime{*CONTROLLER_VK_X*} para apresentar os ingredientes necessários para criar o objeto atual. + + {*T3*}INSTRUÇÕES DE JOGO: EXCLUIR NÍVEIS{*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 dica de Excluir Nível. +Se tentares juntar-te a 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 removê-lo da lista e prosseguir para o nível, ou retroceder. - - {*B*} - Prime{*CONTROLLER_VK_X*} para apresentar novamente o inventário. + + {*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á mais controlo sobre o teu jogo.{*B*}{*B*} + +{*T2*}Jogador vs. Jogador{*ETW*}{*B*} +Quando ativada, os jogadores podem causar danos aos outros jogadores. Esta opção afeta apenas o modo Sobrevivência.{*B*}{*B*} + +{*T2*}Confiar Jogadores{*ETW*}{*B*} +Quando desativada, os jogadores que se juntaram ao 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*}{*B*} + +{*T2*}Ciclo de Luz do Dia{*ETW*}{*B*} +Quando desativada, a hora do dia não muda.{*B*}{*B*} + +{*T2*} Manter Inventário{*ETW*}{*B*} +Quando ativada, os jogadores mantêm o seu inventário, depois de morrerem.{*B*}{*B*} + +{*T2*} Regeneração de Habitantes{*ETW*}{*B*} +Quando desativada, os habitantes deixam de ser regenerados naturalmente.{*B*}{*B*} + +{*T2*} Habitantes Contidos{*ETW*}{*B*} +Quando ativada, evita que os monstros e animais alterem blocos (por exemplo, as explosões de Creepers não destroem blocos e as Ovelhas não retiram Erva) ou apanhem itens.{*B*}{*B*} + +{*T2*} Saque de Habitantes{*ETW*}{*B*} +Quando desativada, os monstros e animais não largam o saque (por exemplo, os Creepers não largam pólvora).{*B*}{*B*} + +{*T2*} Espólio de Blocos{*ETW*}{*B*} +Quando desativada, os blocos não largam objetos quando são destruídos (por exemplo, os blocos de Pedra não largam Pedra Arredondada).{*B*}{*B*} + +{*T2*}Regeneração Natural{*ETW*}{*B*} +Quando desativada, os jogadores não regeneram saúde naturalmente.{*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 esta opção é ativada, o Submundo será regenerado. Esta opção é útil, quando tens uma gravação antiga onde não estava presente uma Fortaleza 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*}{*B*} + +{*T1*}Opções de Jogador{*ETW*}{*B*} +Para modificar os privilégios de um jogador, seleciona o seu 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 nos 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 nos 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 nos 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 nos 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 nos 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 nos 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*} +{*KICK_PLAYER_DESCRIPTION*}{*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*} +Esta opção permite ao jogador mover jogadores, ou mover-se a si próprio, para perto de outros jogadores, num mundo. - - - 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. - + + Página Seguinte - - - A área de criação mostra os objetos de que necessitas para criares o novo objeto. Prime{*CONTROLLER_VK_A*} para criar o objeto e colocá-lo no teu inventário. - + + {*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 crias de animais!{*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 uma cria de animal. A cria de animal seguirá os pais durante algum 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 dele, 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. 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 a ferramenta 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: 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 entre o inventário e o baú.{*B*}{*B*} +Os objetos armazenados no baú podem ser colocados no inventário mais tarde. + + + Estiveste na Minecon? + + + Nunca ninguém da Mojang viu a cara do Junkboy. + + + Sabias que existe um Minecraft Wiki? + + + Não olhes diretamente para os bugs. + + + Os Creepers nasceram de um bug de codificação. + + + É uma galinha ou um pato? + + + O novo escritório do Mojang é fixe! + + + {*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 saem; constrói um abrigo antes que isso aconteça.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} para olhares em redor.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} para te moveres.{*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 {*CONTROLLER_ACTION_MOVE*} para a frente, o personagem irá continuar a correr até que se esgote o tempo ou se a Barra de Comida tiver 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 escavares alguns blocos.{*B*}{*B*} +Se estiveres a segurar um objeto com a mão, usa{*CONTROLLER_ACTION_USE*} para o utilizares ou prime{*CONTROLLER_ACTION_DROP*} para o largares. + + + {*T3*}INSTRUÇÕES DE JOGO: HUD{*ETW*}{*B*}{*B*} +O HUD 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.{*B*} +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 são necessários para subires de nível.{*B*} +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 mostra os objetos que estão 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 podes 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 com{*CONTROLLER_VK_A*}. Caso tenhas selecionado vários objetos com o ponteiro, usa{*CONTROLLER_VK_A*} para colocá-los todos ou{*CONTROLLER_VK_X*} para colocares apenas um.{*B*}{*B*} +Se o objeto sobre o qual se encontra o ponteiro for uma armadura, surgirá uma dica que te permite colocar o objeto no espaço correto do inventário, com um movimento rápido.{*B*}{*B*} +É possível mudar a cor da tua Armadura de Cabedal com tinta; para isso, vai ao menu do inventário e mantém a tinta no teu ponteiro, depois prime{*CONTROLLER_VK_X*} enquanto o ponteiro está em cima da peça que desejas pintar. - - 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. + + O Minecon 2013 decorreu em Orlando, na Florida, nos EUA! - - A secção 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. + + .party() foi fantástica! - - Está agora em exibição a descrição do objeto atualmente selecionado. A descrição pode dar-te uma ideia das funções do objeto. + + Assume sempre que os rumores são falsos e não verdadeiros! - - Está agora em exibição a lista de ingredientes necessários para criar o objeto selecionado. + + Página Anterior - - A madeira que recolheste pode ser usada para criar tábuas. Seleciona o ícone das tábuas e prime{*CONTROLLER_VK_A*} para criá-las.{*PlanksIcon*} + + Trocas - - 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. + + Bigorna - - Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de objetos que pretendes criar. Seleciona o grupo de ferramentas.{*ToolsIcon*} + + O Fim - - Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de objetos que pretendes criar. Seleciona o grupo de estruturas.{*StructuresIcon*} + + Excluir Níveis - - 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*} + + Modo Criativo - - 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*} + + Opções de Anfitrião e Jogador - - Com as ferramentas 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. + + {*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 de 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 Enderman, pelo que tens de estar bem preparado para combater, antes de lá entrares!{*B*}{*B*} +Descobrirás que existem 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 construir 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 ferir com gravidade!{*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, para se poderem juntar a ti com facilidade. - - Alguns objetos não podem ser criados utilizando a mesa de criação, mas com uma fornalha. Cria agora uma fornalha.{*FurnaceIcon*} + + {*ETB*}Bem-vindo de volta! Podes não ter reparado, mas o teu Minecraft acabou de ser atualizado.{*B*}{*B*} +Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam apenas alguns destaques. Lê e depois vai divertir-te!{*B*}{*B*} +{*T1*}Novos Itens{*ETB*} - Barro Endurecido, Barro Pintado, Bloco de Carvão, Fardo de Palha, Carril Ativador, Bloco de Redstone, Sensor de Luz do Dia, Largador, Funil, Vagoneta com Funil, Vagoneta com TNT, Comparador de Redstone, Placa de Pressão de Pesagem, Sinalizador, Baú Armadilhado, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Trela, Armadura de Cavalo, Etiqueta com Nome, Ovo de Geração de Cavalo.{*B*}{*B*} + {*T1*}Novos Habitantes{*ETB*} – Wither, Esqueletos Atrofiados, Bruxas, Morcegos, Cavalos, Burros e Mulas.{*B*}{*B*} +{*T1*}Novas Funcionalidades{*ETB*} – Doma e monta um cavalo, cria fogos de artifício e monta um espetáculo, atribui nomes aos animais e monstros com uma Etiqueta com Nome, cria circuitos de Redstone mais avançados e novas Opções de Anfitrião para ajudar a controlar o que podem fazer os convidados no teu mundo!{*B*}{*B*} +{*T1*}Novo Mundo Tutorial{*ETB*} – Aprende a usar as funcionalidades novas e antigas no Mundo Tutorial. Vê se consegues encontrar todos os Discos de Música secretos dentro do mundo!{*B*}{*B*} + - - 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. + + Provoca mais danos do que com a mã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. + + Utilizada 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. - - {*B*} - Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes utilizar a fornalha. + + Sprint - - 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 para o espaço da direita. + + Novidades - - 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. + + {*T3*}Alterações e Adições{*ETW*}{*B*}{*B*} +- Objetos novos adicionados – Barro Endurecido, Barro Pintado, Bloco de Carvão, Fardo de Palha, Carril Ativador, Bloco de Redstone, Sensor de Luz do Dia, Largador, Funil, Vagoneta com Funil, Vagoneta com TNT, Comparador de Redstone, Placa de Pressão de Pesagem, Sinalizador, Baú Armadilhado, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Trela, Armadura de Cavalo, Etiqueta com Nome, Ovo de Geração de Cavalo{*B*} +- Novos Habitantes adicionados - Wither, Esqueletos Atrofiados, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*} +- Adicionadas novas funcionalidades de geração de terreno – Cabanas de Bruxas.{*B*} +- Adicionado interface de Sinalizador.{*B*} +- Adicionado interface de Cavalo.{*B*} +- Adicionado interface de Funil.{*B*} +- Fogo de Artifício adicionado – O interface do fogo de artifício pode ser acedido através da Mesa de Criação, quando tens os ingredientes para criar uma Estrela de Fogo de Artifício ou um Foguete de Fogo de Artifício.{*B*} +- “Modo de Aventura” adicionado – Só podes quebrar blocos com as ferramentas corretas.{*B*} +- Montes de sons novos adicionados.{*B*} +- Os habitantes, os objetos e os projéteis já podem passar através dos portais.{*B*} +- Os Repetidores já podem ser bloqueados, ao forneceres energia às suas laterais com outro Repetidor.{*B*} +- Os Mortos-vivos e os Esqueletos já podem ser gerados com diferentes armas e armaduras.{*B*} +- Novas mensagens de morte.{*B*} +- Nomeia os habitantes com uma Etiqueta com Nome, e altera o nome dos contentores, para mudares o título quando o menu é aberto.{*B*} +- A Farinha de Ossos já não faz crescer as coisas instantaneamente até o tamanho máximo, mas faz crescer as coisas aleatoriamente por fases.{*B*} +- Um sinal de Redstone, que descreve os conteúdos de Baús, Postos de Poções, Distribuidores e Jukeboxes, pode ser detetado se colocares um Comparador de Redstone diretamente contra eles.{*B*} +- Os Distribuidores podem estar virados para qualquer direção.{*B*} +- Ao comer uma Maçã Dourada, o jogador recebe saúde de "absorção" extra, por um curto período de tempo.{*B*} +- Quanto mais tempo permaneceres numa área, mais fortes serão os monstros que vão ser gerados nessa área.{*B*} - - Depois de os objetos serem alterados pelo fogo, podes movê-los da área de saída para o inventário. Experimenta usar ingredientes diferentes para veres o que consegues criar. + + A Partilhar Capturas de Ecrã - - Se usares madeira como ingrediente, podes criar carvão vegetal. Coloca algum combustível na fornalha e madeira no espaço dos ingredientes. Pode demorar algum tempo para criar carvão vegetal, portanto ocupa-te com o que quiseres e depois regressa para verificares o progresso. + + Baús - - O carvão vegetal pode ser usado como combustível ou para criar tochas, juntamente com um pau. + + Criar - - Para fazeres vidro, coloca areia no espaço dos ingredientes. Cria blocos de vidro para usares como janelas para o teu abrigo. + + Fornalha - - Esta é a interface de preparação de poções. Podes utilizá-la para criar poções com diferentes efeitos. + + Princípios Básicos - - {*B*} - Prime{*CONTROLLER_VK_A*} para continuar.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes como usar o posto de poções. + + HUD - - Podes preparar poções colocando um ingrediente no espaço superior e uma poção ou garrafa de água nos espaços inferiores (podem ser preparadas até 3 poções ao mesmo tempo). Depois de introduzires uma combinação válida, inicia-se o processo de preparação e é criada uma poção, pouco tempo depois. + + Inventário - - 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. + + Distribuidor - - 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. + + Feitiço - - Se adicionares Olho de Aranha Fermentado, corrompes a poção e podes criar 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. + + Portal do Submundo - - Cria uma Poção de Resistência ao Fogo juntando uma Verruga de Submundo a uma Garrafa de Água e adicionando Creme de Magma. + + Multijogador - - Prime{*CONTROLLER_VK_B*} agora para saíres da interface de preparação de poções. + + Animais de Quinta - - Nesta área existe um Posto de Poções, um Caldeirão e um baú cheio de ingredientes para criar poções. + + Animais de Criação - - {*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. + + Preparação de Poções - - O primeiro passo para preparar uma poção é criar uma Garrafa de Água. Retira uma Garrafa de Vidro do baú. + + deadmau5 gosta de Minecraft! - - 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*}. + + Os pastores não te irão atacar, se não os atacares. - - Se esvaziares o caldeirão, podes voltar a enchê-lo com um Balde de Água. + + Se dormires numa cama, podes alterar o ponto de regeneração do jogo e avançar até à madrugada. - - 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. + + Atira essas bolas de fogo de volta para o Ghast! - - - Com uma poção na mão, mantém premido{*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 redor da zona onde aterrar. - Podes criar Poções Explosivas adicionando pólvora às poções normais. - + + Faz algumas tochas para iluminares zonas durante a noite. Os monstros não se aproximarão das zonas próximas das tochas. - - Utiliza a Poção de Resistência ao Fogo em ti mesmo. + + Chega aos destinos mais rapidamente com uma vagoneta sobre carris! - - Agora que és resistente ao fogo e à lava, poderás ir a sítios onde nunca foste. + + Planta alguns rebentos para que cresçam até se tornarem árvores. - - Esta é a interface dos feitiços que podes usar para enfeitiçar armas, armaduras e algumas ferramentas. + + Constrói um portal para poderes viajar até outra dimensão - o Submundo. - - {*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. + + Não é boa ideia escavares diretamente para cima ou para baixo. - - Para enfeitiçares um objeto, primeiro coloca-o no espaço de feitiços. Podes enfeitiçar armas, armaduras e algumas ferramentas para adicionar-lhes efeitos especiais, tais como maior resistência aos danos ou aumentar o número de objetos produzidos ao escavar um bloco. + + A Farinha de Ossos (obtida a partir de um osso de Esqueleto) pode ser usada como fertilizante e fazer as coisas crescerem instantaneamente! - - Quando colocas um objeto no espaço de feitiços, os botões à direita irão mudar para apresentar uma seleção de feitiços aleatórios. + + Os Creepers explodem quando se aproximam de ti! - - O número no botão representa o custo em níveis 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. + + Prime{*CONTROLLER_VK_B*} para largares o objeto que tens na mão! - - 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. + + Usa a ferramenta certa para a tarefa! - - Apesar dos 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. + + Se não conseguires encontrar carvão para as tochas, podes produzir carvão vegetal a partir de árvores numa fornalha. - - Nesta área existe uma Mesa de Feitiços e outros objetos que te ajudarão a aprender tudo sobre feitiços. + + Se comeres as costeletas cozinhadas, irás ganhar mais saúde do que se as comeres cruas. - - {*B*} - Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre feitiços.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre feitiços. - + + Se a dificuldade do jogo for Calmo, a tua saúde irá regenerar automaticamente e não surgirão monstros à noite! - - 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. + + Dá um osso a um lobo para o domares. Depois, poderás ordenar-lhe para se sentar ou seguir-te. - - 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. + + No Inventário podes largar objetos movendo o cursor para fora do menu e premindo{*CONTROLLER_VK_A*} - - Enfeitiçar objetos tem um custo em Níveis de Experiência, que podem ser obtidos recolhendo Orbes de Experiência, os quais são produzidos quando matas monstros e animais, escavas minério, crias animais, pescas e fundes/cozinhas algumas coisas numa fornalha. + + Novo Conteúdo Transferível disponível! Acede-lhe a partir do botão Loja Minecraft no Menu Principal. - - Também podes ganhar níveis de experiência utilizando uma Garrafa Mágica que, quando atirada, cria Orbes de Experiência em redor da zona onde aterra. Estes orbes podem ser recolhidos. + + Podes mudar o aspeto da tua personagem com um Pack de Skins da Loja Minecraft. Seleciona "Loja Minecraft" no Menu Principal para veres o que está ao teu dispor. - - Dentro dos 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 experiências na Mesa de Feitiços. + + Altera as definições de gama para veres o jogo com maior ou menor luminosidade. - - Estás a conduzir uma vagoneta. Para saíres da vagoneta, coloca o ponteiro sobre a vagoneta e prime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + Se dormires numa cama à noite acelerarás o jogo até de madrugada, mas é preciso que todos no jogo multijogador durmam ao mesmo tempo. - - {*B*} - Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre vagonetas.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre vagonetas. + + Utiliza uma enxada para preparar áreas de terreno para o cultivo. - - As vagonetas andam sobre carris. Podes criar uma vagoneta motorizada com uma fornalha e uma vagoneta com baú dentro dela. - {*RailIcon*} + + As aranhas não te atacam durante o dia, a não ser que as ataques. - - Também podes criar carris eletrificados, que recebem energia das tochas de Redstone e dos circuitos, para acelerar a vagoneta. Estes podem ser ligados a interruptores, alavancas e placas de pressão, para formar sistemas complexos. - {*PoweredRailIcon*} + + Utiliza uma pá para escavares terra ou areia mais rápido do que com as mãos! - - Estás a navegar num barco. Para saíres do barco, coloca o ponteiro sobre o mesmo e prime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + Para recuperares saúde, obtém costeletas a partir dos porcos, cozinha-as e come-as. - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre barcos.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre barcos. + + Recolhe cabedal a partir das vacas e usa-o para construir armaduras. - - O barco permite-te viajar mais rapidamente sobre a água. Podes conduzi-lo utilizando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} + + Se tiveres um balde vazio, poderás enchê-lo com leite de vaca, água ou lava! - - Estás a usar uma cana de pesca. Prime{*CONTROLLER_ACTION_USE*} para a usares.{*FishingRodIcon*} + + A obsidiana forma-se quando a água atinge um bloco de lava de origem. - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre pesca.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre pesca. + + Cercas empilháveis já disponíveis no jogo! - - 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*} + + Alguns animais seguir-te-ão se tiveres trigo na mão. - - Para apanhares peixe, espera até que o flutuador mergulhe na água e só depois deves enrolar a linha. O peixe pode ser comido cru ou cozinhado na fornalha, para restituir saúde. - {*FishIcon*} + + Se um animal não se puder mover mais de 20 blocos em qualquer direção, ele não se irá desmaterializar. - - Tal como acontece com outras ferramentas, a cana de pesca tem um número limitado de utilizações. Mas as utilizações não se limitam à pesca. Faz experiências para veres que outras coisas podes apanhar ou ativar... - {*FishingRodIcon*} + + Podes ver o estado de saúde dos lobos domados pela posição da sua cauda. Dá-lhes carne para os curares. - - Isto é uma cama. De noite, prime{*CONTROLLER_ACTION_USE*} enquanto apontas para a cama, para dormires e acordares de manhã.{*ICON*}355{*/ICON*} + + Cozinha catos numa fornalha para obteres tinta verde. - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre camas.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre camas. + + Lê a secção Novidades, nos menus de Instruções de Jogo, para veres as últimas informações sobre atualizações do jogo. - - 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 uma cama, se morreres serás ressuscitado nessa cama. - {*ICON*}355{*/ICON*} + + Música de C418! - - Se existirem outros jogadores no teu jogo, todos têm de estar na cama ao mesmo tempo, para poderem dormir. - {*ICON*}355{*/ICON*} + + Quem é o Notch? - - Nesta área existem alguns circuitos simples de Redstone e Pistões, além de um baú com mais objetos para aumentar estes circuitos. + + A Mojang tem mais prémios do que colaboradores! - - {*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. + + Alguns famosos jogam Minecraft! - - As Alavancas, Botões, Placas de Pressão e Tochas de Redstone podem fornecer energia aos circuitos, acoplando-os diretamente ao objeto que queres ativar ou ligando-os com pó de Redstone. + + O Notch tem mais de um milhão de seguidores no Twitter! - - 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. + + Nem todos os suecos são loiros. Alguns, como o Jens da Mojang, até são ruivos! - - - O pó de Redstone é recolhido através da extração de minério de Redstone com uma picareta em Ferro, Diamante ou Ouro. Podes utilizá-lo para transmitir energia até 15 blocos e pode subir ou descer um bloco em altura. - {*ICON*}331{*/ICON*} - + + Este jogo será atualizado no futuro! - - - Os repetidores de Redstone podem ser usados para aumentar o alcance da energia ou colocar um retardador no circuito. - {*ICON*}356{*/ICON*} - + + Cria um baú grande colocando dois baús lado a lado. - - - 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*} - + + Tem cuidado ao construíres estruturas de lã a céu aberto, uma vez que os raios, durante as trovoadas, podem incendiar a lã. - - 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. + + Um único balde de lava pode ser utilizado na fornalha para fundir 100 blocos. - - Nesta área existe um Portal para o Submundo! + + O instrumento tocado pelo bloco de notas depende do material sobre o qual se encontra. - - {*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. + + A lava pode demorar vários minutos a desaparecer COMPLETAMENTE, quando o bloco de origem é removido. - - 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. + + A pedra arredondada resiste às bolas de fogo do Ghast, sendo muito útil para proteger portais. - - 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. + + Os blocos utilizados como fontes de luz derretem a neve e o gelo. Isto inclui as tochas, glowstone e Jack-O-Lanterns. - - Para utilizar um Portal do Submundo, fica dentro dele. O ecrã fica roxo e ouves um som. Alguns segundos depois, serás transportado para outra dimensão. + + Os Mortos-vivos e Esqueletos conseguem sobreviver à luz do dia, se estiverem dentro de água. - - 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. + + As galinhas põem um ovo a cada 5 ou 10 minutos. - - O Submundo pode ser usado para viajar rapidamente no Mundo Superior - um bloco no Submundo equivale a viajar 3 blocos no Mundo Superior. + + A obsidiana só pode ser extraída com uma picareta de diamante. - - Agora estás em Modo Criativo. + + Os Creepers são a fonte de pólvora mais fácil de obter. - - {*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. + + Se atacares um lobo, todos os lobos nas redondezas irão tornar-se hostis e atacar-te-ão. O mesmo acontece com os Pastores Mortos-vivos. - - 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. + + Os lobos não conseguem entrar no Submundo. - - Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. + + Os lobos não atacam Creepers. - - Atravessa este buraco para continuares. + + Necessária para escavar blocos de pedra e minério. - - Concluíste o tutorial do modo Criativo. + + Utilizado na receita do bolo e como ingrediente para preparar poções. - - Nesta área, foi criada uma quinta. As quintas permitem-te criar uma fonte renovável de alimentos e outros objetos. + + Utilizada para enviar uma descarga elétrica ao ligar e desligar. Fica ligada ou desligada até ser premida novamente. - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre quintas.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre quintas. + + Envia constantemente uma descarga elétrica ou pode ser utilizada como recetor/transmissor quando ligada à lateral de um bloco. Pode também ser utilizada para iluminação reduzida. - - O Trigo, as Abóboras e os Melões 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 Melão são criadas a partir de Abóboras e Melões, respetivamente. + + Restitui 2{*ICON_SHANK_01*} e pode fazer uma maçã dourada. - - 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. + + Restitui 2{*ICON_SHANK_01*} e regenera a saúde durante 4 segundos. Faz-se de uma maçã e pepitas de ouro. - - O Trigo passa por várias fases de crescimento e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} + + Restitui 2{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. - - 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. + + Utilizado em circuitos de Redstone como repetidor, retardador e/ou díodo. - - 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*} + + Utilizado para conduzir vagonetas. - - Os Catos 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*} + + Quando ativado, acelera as vagonetas que lhe passam por cima. Quando não está ativado, as vagonetas param em cima dele. - - 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*} + + Funciona como uma Placa de Pressão (envia um sinal de Redstone quando ativado), mas só pode ser ativado por uma Vagoneta. - - Podes usar Pó de Ossos para fazer crescer totalmente as plantações ou transformar Cogumelos em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} + + Utilizado para enviar uma descarga elétrica ao ser pressionado. Permanece ativado durante cerca de um segundo, antes de se desligar. - - Concluíste o tutorial sobre quintas. + + Utilizado para segurar e disparar objetos em ordem aleatória, quando recebe uma descarga de Redstone. - - Nesta área, os animais foram colocados dentro de uma cerca. Podes criar animais para produzir crias dos mesmos. + + Reproduz uma nota quando ativado. Toca-lhe para alterar a altura da nota. Se o colocares sobre blocos diferentes, mudará o tipo de instrumento. - - {*B*} - Prime{*CONTROLLER_VK_A*} para saberes mais sobre a criação de animais.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a criação de animais. - + + Restitui 2,5{*ICON_SHANK_01*}. Cria-se cozinhando peixe cru numa fornalha. - - Para que os animais procriem, terás de lhes dar os alimentos certos para que entrem em "Modo Amor". + + Restitui 1{*ICON_SHANK_01*}. - - Dá Trigo às vacas, vacogumelos ou ovelhas, Cenouras aos porcos, Sementes de Trigo ou Verrugas de Submundo às galinhas ou qualquer tipo de carne aos lobos, e estes irão começar a procurar outro animal da sua espécie que também esteja em Modo Amor. + + Restitui 1{*ICON_SHANK_01*}. - - 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á uma cria. A cria irá seguir os pais durante algum tempo, antes de se transformar num animal adulto. + + Restitui 3{*ICON_SHANK_01*}. - - Os animais só podem voltar a entrar no Modo Amor ao fim de cerca de cinco minutos. + + Utilizadas como munições para os arcos. - - Alguns animais irão seguir-te se tiveres a sua comida na mão. Isto facilita a tarefa de reunir os animais para que procriem.{*ICON*}296{*/ICON*} + + Restitui 2,5{*ICON_SHANK_01*}. - - - Podes domesticar os lobos selvagens se lhes deres ossos. Uma vez domesticados, vão surgir Corações de Amor à sua volta. Os lobos domesticados vão seguir o jogador e defendê-lo, se não receberem a ordem para sentar. - + + Restitui 1{*ICON_SHANK_01*}. Podes usar até 6 vezes. - - Concluíste o tutorial sobre criação de animais. + + Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. Se comeres isto podes ficar envenenado. - - Nesta zona há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. + + Restitui 1,5{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. - - {*B*} - Prime{*CONTROLLER_VK_A*} para saber mais sobre Golems.{*B*} - Prime{*CONTROLLER_VK_B*} se já sabes o que precisas sobre Golems. + + Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando uma costeleta de porco crua numa fornalha. - - Os Golems são criados colocando uma abóbora no topo de uma pilha de blocos. + + Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhado numa fornalha. Pode ser dado a comer a um Ocelote para o domesticar - - 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. + + Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando galinha crua numa fornalha. - - 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. + + Restitui 1,5{*ICON_SHANK_01*}, ou pode ser cozinhado numa fornalha. - - Os Golems de Ferro também aparecem naturalmente para proteger as aldeias e, caso ataques quaisquer aldeões, eles atacam-te. + + Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando bife cru numa fornalha. - - Não podes sair desta área até teres completado o tutorial. + + Utilizada para te transportar a ti, um animal ou um monstro pelos carris. - - Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma pá para escavar materiais moles como terra e areia. + + Utilizada como tinta para criar lã azul clara. - - Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar um machado para cortar troncos de árvore. + + Utilizada como tinta para criar lã ciano. - - Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma picareta para extrair pedra e minério. Podes ter de construir uma picareta com materiais melhores, para obter recursos de certos blocos. + + Utilizada como tinta para criar lã roxa. - - Algumas ferramentas são melhores para atacar inimigos. Experimenta usar uma espada para atacares. + + Utilizada como tinta para criar lã verde-lima. - - Sugestão: Mantém premido {*CONTROLLER_ACTION_ACTION*}para escavar e cortar usando a mão ou o objeto que estiveres a segurar. Pode ser necessário criar uma ferramenta para escavares alguns blocos... + + Utilizada como tinta para criar lã cinzenta. - - A ferramenta que estás a usar ficou danificada. Sempre que usas uma ferramenta ela danifica-se e acabará por partir. A barra colorida sob o objeto no teu inventário indica o estado atual dos danos. + + Tinta para criar lã cinzenta clara. (Nota: Esta tinta também pode ser feita combinando tinta cinzenta com farinha de ossos, permitindo criar quatro tintas cinzentas claras a partir de cada saco, em vez de três.) - - Mantém premido{*CONTROLLER_ACTION_JUMP*} para nadares para cima. + + Utilizada como tinta para criar lã magenta. - - 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. + + Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. - - 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. + + Utilizado para criar livros e mapas. - - 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. + + Pode usar-se para criar estantes de livros ou, quando enfeitiçado, para fazer Livros Enfeitiçados. - - 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. + + Utilizada como tinta para criar lã azul. - - Se deslocares o ponteiro para fora dos limites da interface, quando estiveres a transportar um objeto, poderás largá-lo. + + Reproduz Discos de Música. - - Não tens todos os ingredientes necessários para criar este objeto. A caixa no canto inferior esquerdo mostra os ingredientes de que precisas. + + Utiliza-os para criar ferramentas, armas ou armaduras muito fortes. - - 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! Termina o teu abrigo! + + Utilizada como tinta para criar lã cor-de-laranja. - - {*EXIT_PICTURE*} Quando estiveres preparado para explorar mais, existe uma escadaria nesta área, junto ao abrigo dos Mineiros, que conduz a um pequeno castelo. - + + Recolhida a partir de ovelhas, pode ser colorida com tintas. - - Lembrete: + + Utilizada como material de construção, pode ser colorida com tintas. Esta receita não é recomendada, porque a Lã pode ser obtida facilmente das Ovelhas. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Utilizada como tinta para criar lã preta. - - Foram adicionadas novas funcionalidades na última versão do jogo, incluindo novas áreas no mundo do tutorial. + + Utilizada para transportar bens pelos carris. - - {*B*}Prime {*CONTROLLER_VK_A*} para jogares o tutorial normalmente.{*B*} - Prime {*CONTROLLER_VK_B*} para ignorar o tutorial principal. + + Desloca-se sobre carris e pode rebocar outras vagonetas, quando lhe colocas carvão. - - Nesta área, tens a possibilidade de aprender mais sobre pesca, barcos, pistões e Redstone. + + Utilizado para viajar pela água mais rapidamente do que a nadar. - - Fora desta área, irás encontrar exemplos de edifícios, quintas, vagonetas e carris, feitiços, poções, trocas, ferreiros e muito mais! + + Utilizada como tinta para criar lã verde. - - O nível da tua barra de comida está demasiado baixo para restaurar a tua saúde. + + Utilizada como tinta para criar lã vermelha. - - {*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. + + Utilizada para o crescimento instantâneo de plantações, árvores, ervas altas, cogumelos gigantes e flores e pode ser usada em receitas de tinta. - - Selecionar + + Utilizada como tinta para criar lã cor-de-rosa. - - Usar + + Utilizada como tinta para criar lã castanha, como ingrediente para bolachas ou para fazer crescer Frutos de Cacau. - - Anterior + + Utilizada como tinta para criar lã prateada. - - Sair + + Utilizada como tinta para criar lã amarela. - - Cancelar + + Utilizado para ataques à distância com setas. - - Cancelar Juntar + + Dá ao utilizador 5 de Armadura quando em uso. - - Atualizar Lista de Jogos Online + + Dá ao utilizador 3 de Armadura quando em uso. - - Jogos Party + + Dá ao utilizador 1 de Armadura quando em uso. - - Todos os Jogos + + Dá ao utilizador 5 de Armadura quando em uso. - - Alterar Grupo + + Dá ao utilizador 2 de Armadura quando em uso. - - Mostrar Inventário + + Dá ao utilizador 2 de Armadura quando em uso. - - Mostrar Descrição + + Dá ao utilizador 3 de Armadura quando em uso. - - Mostrar Ingredientes + + Um lingote brilhante que pode ser usado para criar ferramentas feitas com este material. É criado ao derreteres minério numa fornalha. - - Criação + + 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. - - Criar + + Utilizada para enviar uma descarga elétrica quando é pisada por um jogador, um animal ou um monstro. As Placas de Pressão de Madeira também podem ser ativadas quando os objetos caem em cima delas. - - Retirar/Colocar + + Dá ao utilizador 8 de Armadura quando em uso. - - Retirar + + Dá ao utilizador 6 de Armadura quando em uso. - - Retirar tudo + + Dá ao utilizador 3 de Armadura quando em uso. - - Retirar metade + + Dá ao utilizador 6 de Armadura quando em uso. - - Colocar + + As portas de ferro só podem ser abertas com Redstone, botões ou interruptores. - - Colocar tudo + + Dá ao utilizador 1 de Armadura quando em uso. - - Colocar um + + Dá ao utilizador 3 de Armadura quando em uso. - - Largar + + Utilizado para cortar blocos de madeira mais rápido do que com a mão. - - Largar tudo + + Utilizada para lavrar blocos de terra e erva, para preparar colheitas. - - Largar um + + As portas de madeira são ativadas através do uso, dando um golpe ou com Redstone. - - Trocar + + Dá ao utilizador 2 de Armadura quando em uso. - - Mover rápido + + Dá ao utilizador 4 de Armadura quando em uso. - - Limpar Seleção Rápida + + Dá ao utilizador 1 de Armadura quando em uso. - - O que é isto? + + Dá ao utilizador 2 de Armadura quando em uso. - - Partilhar no Facebook + + Dá ao utilizador 1 de Armadura quando em uso. - - Alterar Filtro + + Dá ao utilizador 2 de Armadura quando em uso. - - Enviar Pedido de Amizade + + Dá ao utilizador 5 de Armadura quando em uso. - - Página Abaixo + + Utilizado como escadas compactas. - - Página Acima + + Utilizada para guardar guisado de cogumelos. Ficas com a tigela, depois de comeres o guisado. - - Seguinte + + Utilizado para guardar e transportar água, lava e leite. - - Anterior + + Utilizado para guardar e transportar água. - - Expulsar Jogador + + Apresenta o texto introduzido por ti ou por outros jogadores. - - Tingir + + Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. - - Escavar + + 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. - - Alimentar + + Utilizado para guardar e transportar lava. - - Domar + + Mostra as posições do Sol e da Lua. - - Curar + + Aponta para o ponto inicial. - - Senta + + Quando seguras no mapa, poderás ver a imagem de uma área explorada. Pode ser utilizado para descobrir caminhos. - - Segue-me + + Utilizado para guardar e transportar leite. - - Ejetar + + Utilizado para criar fogo, detonar TNT e abrir um portal, depois da sua construção. - - Esvaziar + + Utilizada para apanhar peixe. - - Selar + + São ativados 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. - - Colocar + + Utilizado como material de construção e pode servir para criar muitas coisas. Pode ser criado a partir de qualquer tipo de madeira. - - Atingir + + Utilizado como material de construção. Não é influenciado pela gravidade, como a Areia normal. - - Ordenhar + + Utilizado como material de construção. - - Recolher + + Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. - - Comer + + Utilizada para fazer escadas longas. Duas placas colocadas em cima uma da outra irão criar um bloco de tamanho normal com duas placas. - - Dormir + + Utilizadas para criar luz. As tochas também derretem a neve e o gelo. - - Acordar + + Utilizado para criar tochas, setas, sinais, escadotes e cercas e também como pegas para ferramentas e armas. - - Tocar + + Armazena blocos e objetos no interior. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. - - Montar + + Utilizada como barreira que não se pode saltar. Conta como 1,5 blocos de altura para jogadores, animais e monstros, mas 1 bloco de altura para outros blocos. - - Velejar + + Utilizado para subir na vertical. - - Crescer + + Se todos os jogadores do mundo estiverem numa cama, o tempo durante a noite passa mais rápido. Alteram o ponto de regeneração do jogador. As cores das camas são sempre as mesmas apesar das lãs usadas. - - Nadar para Cima + + Permite-te criar uma seleção de objetos mais ampla do que na criação normal. - - Abrir + + Permite-te fundir minério, criar carvão vegetal e vidro e também cozinhar peixe e costeletas de porco. - - Alterar Tom + + Machado de Ferro - - Detonar + + Candeeiro de Redstone - - Ler + + Escadas da Selva - - Pendurar + + Escadas de Bétula - - Atirar + + Controlos Atuais - - Plantar + + Caveira - - Lavrar + + Cacau - - Colher + + Escadas de Abeto - - Continuar + + Ovo de Dragão - - Desbloquear Jogo Completo + + Pedra do Fim - - Apagar Gravação + + Estrutura de Portal do Fim - - Apagar + + Escadas de Grés - - Opções + + Feto - - Convidar Amigos + + Arbusto - - Aceitar + + Esquema - - Tosquiar + + Criar - - Excluir Nível + + Usar - - Selecionar Skin + + Ação - - Acender + + Rastejar/Voar Para Baixo - - Navegar + + Rastejar - - Instalar Versão Completa + + Largar - - Instalar Versão de Avaliação + + Mudar o Objeto Agarrado - - Instalar + + Pausa - - Reinstalar + + Olhar - - Op. Gravação + + Mover/Sprint - - Executar Comando + + Inventário - - Criativo + + Saltar/Voar Para Cima - - Mover Ingrediente + + Saltar - - Mover Combustível + + Portal do Fim - - Mover Ferramenta + + Caule de Abóbora - - Mover Armadura + + Melão - - Mover Arma + + Painel de Vidro - - Equipar + + Portão de Vedação - - Puxar + + Trepadeiras - - Soltar + + Caule de Melão - - Privilégios + + Barras de Ferro - - Bloquear + + Tijolos de Pedra Rachada - - Página Acima + + Tijolos de Pedra com Musgo - - Página Abaixo + + Tijolos de Pedra - - Modo Amor + + Cogumelo - - Beber + + Cogumelo - - Rodar + + Tijolos de Pedra Burilados - - Esconder + + Escadas de Tijolo - - Limpar Todos os Espaços + + Verruga do Submundo - - OK + + Escadas (Tijolo Submundo) - - Cancelar + + Cerca (Tijolos Submundo) - - Loja Minecraft + + Caldeirão - - Tens a certeza de que queres sair do jogo atual e entrar num novo jogo? Os progressos não gravados serão perdidos. + + Posto de Poções - - Sair do Jogo + + Mesa de Feitiços - - Gravar Jogo + + Tijolo de Submundo - - Sair sem gravar + + Pedra Arredondada com Peixe Prateado - - Tens a certeza de que queres substituir qualquer gravação anterior deste mundo pela versão atual deste mundo? + + Pedra com Peixe Prateado - - Tens a certeza de que queres sair sem gravar? Irás perder todo o progresso neste mundo! + + Escadas (Tijolo de Pedra) - - Iniciar Jogo + + Folha de Nenúfar - - Gravação Danificada + + Micélio - - Esta gravação está corrompida ou danificada. Queres apagá-la? + + Tijolo de Pedra com Peixe Prateado - - Tens a certeza de que queres sair para o menu principal e desligar todos os jogadores do jogo? O progresso não gravado será perdido. + + Alterar Modo de Câmara - - Sair e gravar + + 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. - - Sair sem gravar + + À 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. - - Tens a certeza de que queres sair para o menu principal? O progresso não gravado será perdido. + + À medida que recolhes e crias mais objetos, o teu inventário fica mais cheio.{*B*} + Prime{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. - - Tens a certeza de que queres sair para o menu principal? Perderás o teu progresso! + + A madeira que recolhes pode ser transformada em tábuas. Abre a interface de criação para as criares.{*PlanksIcon*} - - Criar Mundo Novo + + 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*} - - Jogar Tutorial + + 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. - - Tutorial + + Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação. - - Nomeia o Teu Mundo + + 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é se esgotar o tempo ou a comida. - - Introduz um nome para o teu mundo + + Usa{*CONTROLLER_ACTION_MOVE*} para te deslocares. - - Deposita a semente para a criação do teu mundo + + Usa{*CONTROLLER_ACTION_LOOK*} para olhares para cima, para baixo e em redor. - - Carregar Mundo Gravado + + 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 START para jogar + + 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 escavares alguns blocos... - - A sair do jogo + + Prime{*CONTROLLER_ACTION_JUMP*} para saltar. - - Ocorreu um erro. A sair para o menu principal. + + Muitas vezes, o processo de criação envolve vários passos. Agora que já tens algumas tábuas, podes criar mais objetos. Produz uma mesa de criação.{*CraftingTableIcon*} - - Falha na ligação + + + A noite pode cair rapidamente e é perigoso estar ao ar livre sem estar preparado. Podes criar armaduras e armas, mas é recomendável que possuas um abrigo seguro. + - - Ligação perdida + + Abre o contentor - - Perdeste a ligação ao servidor. A sair para o menu principal. + + 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, duram mais tempo e que te permitem escavar materiais mais duros. Cria uma picareta de madeira.{*WoodenPickaxeIcon*} - - Desligado pelo servidor + + 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*} - - Foste expulso do jogo + + + Terás de recolher os recursos necessários para completar o abrigo. Podes construir as paredes e o teto com qualquer tipo de bloco, mas também terás de criar uma porta, algumas janelas e iluminação. + - - Foste expulso do jogo por voares + + + Nas redondezas, existe um abrigo de Mineiros abandonado, que podes completar para garantir a tua segurança durante a noite. + - - A tentativa de ligação excedeu o tempo + + Com um machado poderás cortar a madeira e os blocos de madeira mais rapidamente. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente e duram mais tempo. Cria um machado de madeira.{*WoodenHatchetIcon*} - - O servidor está cheio + + Usa{*CONTROLLER_ACTION_USE*} para utilizar objetos, interagir com objetos e colocar alguns objetos. Os objetos colocados podem ser recolhidos novamente escavando-os com a ferramenta certa. - - O anfitrião saiu do jogo. + + Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para alterares o objeto que estás a segurar. - - Não podes juntar-te a este jogo porque não és amigo de nenhum dos participantes. + + 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*} - - Não podes juntar-te a este jogo porque foste expulso pelo anfitrião anteriormente. + + 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 duram mais tempo. Cria uma pá de madeira.{*WoodenShovelIcon*} - - Não podes juntar-te a este jogo, pois o jogador a que estás a tentar juntar-te possui uma versão mais antiga do jogo. + + Aponta a mira para a mesa de criação e prime{*CONTROLLER_ACTION_USE*} para a abrires. - - Não podes juntar-te a este jogo, pois o jogador a que estás a tentar juntar-te possui uma versão mais recente do jogo. + + 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. - - Novo Mundo + + Em Minecraft, podes criar tudo aquilo que quiseres colocando blocos. +À noite, os monstros andam à solta; constrói um abrigo antes que isso aconteça. - - 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! + + - - Desbloquear Jogo Completo + + - - Estás a jogar a versão de avaliação, mas precisas do jogo completo para poderes gravar o jogo. -Queres desbloquear o jogo completo agora? + + - - Por favor, aguarda + + - - Sem resultados + + - - Filtro: + + Esquema 1 - - Amigos + + Movimento (Em Voo) - - A Minha Pontuação + + Jogadores/Convidar - - Geral + + - - Entradas: + + Esquema 3 - - Lugar + + Esquema 2 - - A Preparar para Gravar Nível + + - - A Preparar Blocos... + + - - A Finalizar... + + - - A Construir Terreno + + - - A simular o mundo + + {*B*}Prime{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Prime{*CONTROLLER_VK_B*} se achas que estás preparado para jogar sozinho. - - A iniciar o servidor + + {*B*}Prime{*CONTROLLER_VK_A*} para continuar. - - A gerar área de regeneração + + - - A carregar área de regeneração + + - - A Entrar no Submundo + + - - A Sair do Submundo + + - - A iniciar novamente + + - - A gerar nível + + - - A carregar nível + + - - A gravar jogadores + + - - A ligar ao anfitrião + + Bloco de Peixe Prateado - - A transferir terreno + + Placa de Pedra - - A mudar para jogo offline + + Uma forma compacta de armazenar Ferro. - - Aguarda enquanto o anfitrião grava o jogo + + Bloco de Ferro - - Entrar em O FIM + + Placa de Madeira de Carvalho - - Sair de O FIM + + Placa de Arenito - - Esta cama está ocupada + + Placa de Pedra - - Só podes dormir à noite + + Uma forma compacta de armazenar Ouro. - - %s está a dormir numa cama. Para acelerares até de madrugada, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. + + Flor - - A tua cama desapareceu ou está bloqueada + + Lã Branca - - Não podes descansar agora, existem monstros nas redondezas + + Lã Cor-de-laranja - - Estás a dormir numa cama. Para acelerares até de madrugada, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. + + Bloco de Ouro - - Ferramentas e Armas + + Cogumelo - - Armas + + Rosa - - Alimentos + + Placa (Pedra Arredondada) - - Estruturas + + Estante de Livros - - Armadura + + TNT - - Mecanismos + + Tijolos - - Transporte + + Tocha - - Decorações + + Obsidiana - - Blocos de Construção + + Pedra com Musgo - - Redstone e Transporte + + Placa (Tijolo do Submundo) - - Vários + + Placa de Carvalho - - Preparação + + Placa de Tijolos Pedra - - Ferramentas, Armas e Armadura + + Placa de Tijolo - - Materiais + + Placa de Madeira da Selva - - Sessão terminada + + Placa de Madeira de Bétula - - Dificuldade + + Placa de Madeira de Abeto - - Música + + Lã Magenta - - Som + + Folhas de Bétula - - Gama + + Folhas de Abeto - - Precisão do Jogo + + Folhas de Carvalho - - Precisão da Interface + + Vidro - - Calmo + + Esponja - - Fácil + + Folhas da Selva - - Normal + + Folhas - - Difícil + + Carvalho - - Neste modo, o jogador recupera a saúde com o passar do tempo e não há inimigos no ambiente. + + Abeto - - Neste modo, os inimigos surgem no ambiente, mas irão provocar menos danos ao jogador do que no modo Normal. + + Bétula - - Neste modo, os inimigos surgem no ambiente e provocam uma quantidade de danos normal ao jogador. + + Madeira de Abeto - - Neste modo, os inimigos surgem no ambiente e irão provocar graves danos ao jogador. Presta atenção aos Creepers, uma vez que é pouco provável que cancelem o seu ataque explosivo quando te afastas deles! + + Madeira de Bétula - - Tempo Limite da Avaliação Excedido + + Madeira da Selva - - Jogo cheio + + - - Falha ao entrar no jogo, não existem espaços livres + + Lã Cor-de-rosa - - Introduzir Texto de Sinal + + Lã Cinzenta - - Introduz uma linha de texto para o teu sinal + + Lã Cinzenta Clara - - Introduzir Título + + Lã Azul Clara - - Introduz um título para a tua publicação + + Lã Amarela - - Introduzir Legenda + + Lã Verde-lima - - Introduz uma legenda para a tua publicação + + Lã Ciano - - Introduzir Descrição + + Lã Verde - - Introduz uma descrição da tua publicação + + Lã Vermelha - - Inventário + + Lã Preta - - Ingredientes + + Lã Roxa - - Posto de Poções + + Lã Azul - - Baú + + Lã Castanha - - Encantar + + Tocha (Carvão) - - Fornalha + + Glowstone - - Ingrediente + + Areia Movediça - - Combustível + + Bloco do Submundo - - Distribuidor + + Bloco de Lápis-lazúli - - De momento, não existem ofertas de conteúdo transferível deste tipo disponíveis para este título. + + Minério de Lápis-lazúli - - %s juntou-se ao jogo. + + Portal - - %s saiu do jogo. + + Jack-O-Lantern - - %s foi expulso do jogo. + + Cana de Açúcar - - Tens a certeza de que queres eliminar este jogo gravado? + + Barro - - A aguardar aprovação + + Cato - - Censurado + + Abóbora - - A tocar: + + Cerca - - Repor Definições + + Jukebox - - Tens a certeza de que queres repor as definições para os valores predefinidos? + + Uma forma compacta de armazenar Lápis-Lazúli. - - Erro de Carregamento + + Alçapão - - Jogo de %s + + Baú Fechado - - Jogo anfitrião desconhecido + + Díodo - - Um convidado terminou a sessão + + Pistão Pegajoso - - Um jogador convidado terminou sessão. Como tal, todos os jogadores convidados foram removidos do jogo. + + Pistão - - Iniciar Sessão + + Lã (qualquer cor) - - Não tens sessão iniciada. Para jogares este jogo, tens de iniciar uma sessão. Queres iniciar sessão agora? + + Arbusto Morto - - Multijogador não é permitido + + Bolo - - Falha ao criar jogo + + Bloco de Notas - - Auto Selecionado + + Distribuidor - - Sem Pack: Skins Predefinidas + + Erva Alta - - Skins Favoritas + + Teia - - Nível Excluído + + Cama - - O jogo ao qual queres juntar-te encontra-se na tua lista de níveis excluídos. -Se quiseres juntar-te a este jogo, o nível será removido da lista de níveis excluídos. + + Gelo - - Excluir este Nível? + + Mesa de Criação - - Tens a certeza de que queres adicionar este nível à lista de níveis excluídos? -Se selecionares OK, irás sair do jogo. + + Uma forma compacta de armazenar Diamantes. - - Removido da Lista de Excluídos + + Bloco de Diamante - - Gravação Automática + + Fornalha - - Gravação Automática: DESLIGADO + + Terreno de Cultivo - - Mins + + Plantações - - Não Podes Colocar Aqui! + + Minério de Diamante - - Não é possível colocar lava junto ao ponto de regeneração do nível, devido à possibilidade de morte instantânea dos jogadores regenerados. + + Gerador de Monstros - - Opacidade + + Fogo - - A Preparar Gravação Automática do Nível + + Tocha (Carvão Vegetal) - - Tamanho de HUD + + Pó de Redstone - - Tamanho de HUD (Ecrã Dividido) + + Baú - - Semear + + Escadas de Carvalho - - Desbloquear Pack de Skins + + Sinal - - Para utilizares a skin selecionada, tens de desbloquear este pack de skins. -Queres desbloquear agora este pack de skins? + + Minério de Redstone - - Desbloquear Pack de Texturas + + Porta de Ferro - - Para usares este pack de texturas no teu mundo, precisas de desbloqueá-lo. -Queres desbloqueá-lo agora? + + Placa de Pressão - - Pack de Texturas de Avaliação + + Neve - - Estás a usar uma versão de avaliação do pack de texturas. Não poderás guardar este mundo sem desbloqueares a versão completa. -Gostarias de desbloquear a versão completa deste pack de texturas? + + Botão - - Pack de Texturas Não Disponível + + Tocha Redstone - - Desbloquear Versão Completa + + Alavanca - - Transferir Versão de Avaliação + + Carril - - Transferir Versão Completa + + Escadote - - Este mundo usa um pack de mistura ou pack de texturas que não tens! -Queres instalar o pack de mistura ou pack de texturas agora? + + Porta de Madeira - - Obtém a Versão de Avaliação + + Escadas de Pedra - - Obtém a Versão Completa + + Carril Detetor - - Expulsar Jogador + + Carril Eletrificado - - Tens a certeza de que queres expulsar este jogador do jogo? Ele não poderá voltar a juntar-se até reiniciares o mundo. + + Recolheste pedras arredondadas suficientes para construir uma fornalha. Utiliza a tua mesa de criação para criares uma. - - Packs de Imagens de Jogador + + Cana de Pesca - - Temas + + Relógio - - Pack de Skins + + Pó de Glowstone - - Permitir amigos de amigos + + Vagoneta com Fornalha - - Não podes juntar-te a este jogo porque está limitado a amigos do anfitrião. + + Ovo - - Impossível Juntares-te ao Jogo + + Bússola - - Selecionado + + Peixe Cru - - Skin selecionada: + + Vermelho Rosa - - Conteúdo Transferível Corrompido + + Verde Cato - - Este conteúdo transferível está corrompido e não pode ser usado. Tens de eliminá-lo, depois reinstala-o a partir do menu Loja Minecraft. + + Grãos de Cacau - - Parte do teu conteúdo transferível está corrompido e não pode ser usado. Tens de eliminá-lo, depois reinstala-o a partir do menu Loja Minecraft. + + Peixe Cozinhado - - O teu modo de jogo foi alterado + + Pó de Tinta - - Muda o Nome do Teu Mundo + + Saco de Tinta - - Introduz o novo nome para o teu mundo + + Vagoneta com Baú - - Modo Jogo: Sobrevivência + + Bola de Neve - - Modo Jogo: Criativo + + Barco - - Sobrevivência + + Cabedal - - Criativo + + Vagoneta - - Criado no Modo Sobrevivência + + Sela - - Criado no Modo Criativo + + Redstone - - Compor Nuvens + + Balde de Leite - - O que queres fazer com esta gravação de jogo? + + Papel - - Mudar o Nome + + Livro - - A gravar automaticamente em %d... + + Slimeball - - Ligado + + Tijolo - - Desligado + + Barro - - Normal + + Canas de Açúcar - - Superplano + + Lápis-lazúli - - Quando ativada, o jogo ficará online. + + Mapa - - Quando ativada, só os jogadores convidados podem juntar-se. + + Disco de Música - "13" - - Quando ativada, amigos de pessoas na tua Lista de Amigos podem juntar-se. + + Disco de Música - "cat" - - Quando ativada, os jogadores podem infligir danos aos outros jogadores. Afeta apenas o modo de Sobrevivência. + + Cama - - Quando desativada, os jogadores que se juntaram ao jogo não podem construir ou escavar, até receberem autorização. + + Repetidor de Redstone - - Quando ativada, o fogo pode propagar-se aos blocos inflamáveis mais próximos. + + Bolacha - - Quando ativada, o TNT explode ao ser acionado. + + Disco de Música - "blocks" - - Quando ativada, o Submundo será regenerado. É útil se tiveres um ficheiro mais antigo em que não existissem Fortalezas do Submundo. + + Disco de Música - "mellohi" - - Quando ativada, são geradas estruturas como Aldeias e Fortalezas no mundo. + + Disco de Música - "stal" - - Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo. + + Disco de Música - "strad" - - Quando ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador. + + Disco de Música - "chirp" - - Packs de Skins + + Disco de Música - "far" - - Temas + + Disco de Música - "mall" - - Imagens de Jogador + + Bolo - - Itens de Avatar + + Tinta Cinzenta - - Packs de Textura + + Tinta Cor-de-rosa - - Packs de Mistura + + Tinta Verde-lima - - {*PLAYER*} foi consumido pelas chamas + + Tinta Roxa - - {*PLAYER*} morreu carbonizado + + Tinta Ciano - - {*PLAYER*} tentou nadar na lava + + Tinta Cinzenta Clara - - {*PLAYER*} sufocou numa parede + + Amarelo Dente-de-leão - - {*PLAYER*} afogou-se + + Farinha de Ossos - - {*PLAYER*} morreu à fome + + Osso - - {*PLAYER*} foi picado até à morte + + Açúcar - - {*PLAYER*} embateu no chão com muita força + + Tinta Azul Clara - - {*PLAYER*} caiu do mundo + + Tinta Magenta - - {*PLAYER*} morreu + + Tinta Cor-de-Laranja - - {*PLAYER*} explodiu + + Sinal - - {*PLAYER*} foi morto por magia + + Túnica de Cabedal - - {*PLAYER*} foi morto pelo bafo do Ender Dragon + + Colete de Ferro - - {*PLAYER*} foi assassinado por {*SOURCE*} + + Colete de Diamante - - {*PLAYER*} foi assassinado por {*SOURCE*} + + Capacete de Ferro - - {*PLAYER*} foi atingido por {*SOURCE*} + + Capacete de Diamante - - {*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + + Capacete de Ouro - - {*PLAYER*} foi agredido por {*SOURCE*} + + Colete de Ouro - - {*PLAYER*} foi morto por {*SOURCE*} + + Leggings de Ouro - - Rochas Enevoadas + + Botas de Cabedal - - Mostrar HUD + + Botas de Ferro - - Mostrar Mão + + Calças de Cabedal - - Mensagens de Morte + + Leggings de Ferro - - Personagem Animada + + Leggings de Diamante - - Anim. Skin Personalizada + + Boné de Cabedal - - Já não podes escavar ou usar objetos + + Enxada de Pedra + + + Enxada de Ferro - - Já podes escavar e usar objetos + + Enxada de Diamante - - Já não podes colocar blocos + + Machado de Diamante - - Já podes colocar blocos + + Machado de Ouro - - Agora podes usar portas e interruptores + + Enxada de Madeira - - Já não podes usar portas e interruptores + + Enxada de Ouro - - Agora podes usar contentores (tais como baús) + + Colete de Corrente - - Já não podes usar contentores (tais como baús) + + Calças de Corrente - - Já não podes atacar habitantes + + Botas de Corrente - - Já podes atacar habitantes + + Porta de Madeira - - Já não podes atacar jogadores + + Porta de Ferro - - Já podes atacar jogadores + + Capacete de Corrente - - Já não podes atacar animais + + Botas de Diamante - - Já podes atacar animais + + Pena - - Já és um moderador + + Pólvora - - Já não és um moderador + + Sementes de Trigo - - Já podes voar + + Tigela - - Já não podes voar + + Guisado de Cogumelos - - Já não vais ficar exausto + + Fio - - Agora vais ficar exausto + + Trigo - - Já estás invisível + + Costeleta de Porco Cozinhada - - Já não estás invisível + + Pintura - - Já és invulnerável + + Maçã de Ouro - - Já não és invulnerável + + Pão - - %d MSP + + Sílex - - Ender Dragon + + Costeleta de Porco Crua - - %s entrou em O Fim + + Pau - - %s abandonou O Fim + + Balde - - {*C3*}Sei a que jogador te referes.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Sim. Tem cuidado. Agora o nível está mais elevado. 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. É menos aterrorizador 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 com as á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 a verdade protegida, 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 seu nome.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Jogador de jogos.{*EF*}{*B*}{*B*} -{*C3*}Boa.{*EF*}{*B*}{*B*} + + Balde de Água - - {*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, extraterrestres. 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 "eletrões" e "protões".{*EF*}{*B*}{*B*} + + Balde de Lava - - {*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 eletricidade 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*} + + Botas de Ouro - - Repor Submundo + + Lingote de Ferro - - Queres mesmo repor o Submundo desta gravação no seu estado predefinido? Vais perder tudo o que construíste no Submundo! + + Lingote de Ouro - - Repor Submundo + + Sílex e Aço - - Não Repor Submundo + + Carvão - - De momento, não é possível tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas e Gatos. + + Carvão Vegetal - - 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. + + Diamante - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Vacogumelos. + + Maçã - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lobos num mundo. + + Arco - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Galinhas num mundo. + + Seta - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lulas num mundo. + + Disco de Música - "ward" - - De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de inimigos num mundo. + + Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de objetos que pretendes criar. Seleciona o grupo de estruturas.{*StructuresIcon*} - - 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. + + Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de objetos que pretendes criar. Seleciona o grupo de ferramentas.{*ToolsIcon*} - - O número máximo de Pinturas/Molduras de Objetos num mundo foi atingido. + + 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. - - Não podes produzir inimigos no modo Calmo. + + Com as ferramentas 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. - - 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. + + 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*} - - Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Lobos de criação. + + 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*} - - Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Galinhas de criação. + + A madeira que recolheste pode ser usada para criar tábuas. Seleciona o ícone das tábuas e prime{*CONTROLLER_VK_A*} para criá-las.{*PlanksIcon*} - - Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Vacogumelos de criação. + + 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. - - Foi alcançado o número máximo de Barcos num mundo. + + + A área de criação mostra os objetos de que necessitas para criares o novo objeto. Prime{*CONTROLLER_VK_A*} para criar o objeto e colocá-lo no teu inventário. + - - O número máximo de Cabeças de Habitantes num mundo foi alcançado. + + + 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. + - - Inverter Olhar + + Está agora em exibição a lista de ingredientes necessários para criar o objeto selecionado. - - Esquerdino + + Está agora em exibição a descrição do objeto atualmente selecionado. A descrição pode dar-te uma ideia das funções do objeto. - - Morreste! + + A secção 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. - - Regenerar + + Alguns objetos não podem ser criados utilizando a mesa de criação, mas com uma fornalha. Cria agora uma fornalha.{*FurnaceIcon*} - - Ofertas de Conteúdo Transferível + + Gravilha - - Alterar Skin + + Minério de Ouro - - Instruções de Jogo + + Minério de Ferro - - Controlos + + Lava - - Definições + + Areia - - Ficha técnica + + Arenito - - Reinstalar Conteúdo + + Minério de Carvão - - Definições de Depuração + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar a fornalha. - - Fogos Propagados + + 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. - - Explosões de TNT + + 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. - - Jogador vs. Jogador + + Madeira - - Confiar nos Jogadores + + Madeira de Carvalho - - Privilégios de Anfitrião + + 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 para o espaço da direita. - - Gerar Estruturas + + {*B*} + Prime{*CONTROLLER_VK_X*} para apresentar novamente o inventário. - - Mundo Superplano + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário. - - Baú de Bónus + + + 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. + - - Opções de Mundo + + {*B*} +Prime{*CONTROLLER_VK_A*} para continuares o tutorial.{*B*} +Prime{*CONTROLLER_VK_B*} se achas que estás pronto para jogar sozinho. - - Pode Construir e Escavar + + + Se deslocares o ponteiro para fora dos limites do interface, com um objeto selecionado, podes largar o objeto. + - - Pode Usar Portas e Interruptores + + + 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. + - - Pode Abrir Contentores + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para moveres o ponteiro. Usa{*CONTROLLER_VK_A*} para apanhares um objeto com o ponteiro. + Caso exista mais do que um objeto, irás apanhá-los todos, ou poderás usar{*CONTROLLER_VK_X*} para apanhares apenas metade. + - - Pode Atacar Jogadores + + + Concluíste a primeira parte do tutorial. + - - Pode Atacar Animais + + Usa a fornalha para criar vidro. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? - - Moderador + + Usa a fornalha para criar carvão vegetal. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? - - Expulsar Jogador + + Usa{*CONTROLLER_ACTION_USE*} para colocares a fornalha no mundo e, em seguida, abre-a. - - Pode Voar + + À noite, pode ficar muito escuro, por isso é melhor teres alguma iluminação dentro do abrigo, para conseguires ver. Cria uma tocha a partir de paus e carvão vegetal, utilizando a interface de criação.{*TorchIcon*} - - Desativar Exaustão + + Usa{*CONTROLLER_ACTION_USE*} para colocar a porta. Podes usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. - - Invisível + + 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*} - - Opções de Anfitrião + + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Jogadores/Convidar + + + Este é o interface de criação. Permite-te combinar os objetos que recolheste para criares novos objetos. + - - Jogo Online + + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário do modo criativo. + - - Apenas por Convite + + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Mais Opções + + {*B*} +Prime{*CONTROLLER_VK_X*} para apresentar os ingredientes necessários para criar o objeto atual. - - Carregar + + {*B*} + Prime{*CONTROLLER_VK_X*} para apresentar a descrição do objeto. - - Novo Mundo + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes criar. - - Nome do Mundo + + + Desloca-te nos separadores de Tipo de Grupo no topo utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do objeto que queres recolher. + - - Semente para o Gerador de Mundos + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário do modo criativo. - - Deixar livre para uma semente aleatória + + 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. - - Jogadores + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário. - - Juntar ao Jogo + + + Se deslocares o ponteiro para fora dos limites do interface, com um objeto selecionado, podes largar o objeto no mundo. Para limpar todos os objetos na barra de seleção rápida, prime{*CONTROLLER_VK_X*}. + - - Iniciar Jogo + + + O ponteiro irá mover-se automaticamente para 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. + - - Não foram encontrados jogos + + 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. + - - Jogar + + Água - - Tabelas de Liderança + + Garrafa de Vidro - - Ajuda e Opções + + Garrafa de Água - - Jogo Completo + + Olho de Aranha - - Retomar Jogo + + Pepita de Ouro - - Gravar Jogo + + Verruga do Submundo - - Dificuldade: + + Poção{*splash*}{*prefix*}{*postfix*} - - Modo Jogo: + + Olho Aranha Ferm. - - Estruturas: + + Caldeirão - - Tipo de Nível: + + Olho de Ender - - JvJ: + + Melão Brilhante - - Confiar Jogadores: + + Pó de Blaze - - TNT: + + Creme de Magma - - Fogos Propagados: + + Posto de Poções - - Reinstalar Tema + + Lágrima de Ghast - - Reinstalar Imagem de Jogador 1 + + Sementes de Abóbora - - Reinstalar Imagem de Jogador 2 + + Sementes de Melão - - Reinstalar Item de Avatar 1 + + Galinha Crua - - Reinstalar Item de Avatar 2 + + Disco de Música - "11" - - Reinstalar Item de Avatar 3 + + Disco de Música - "where are we now" - - Opções + + Tesoura - - Áudio + + Galinha Cozinhada - - Controlo + + Pérola de Ender - - Gráficos + + Fatia de Melão - - Interface de Utilizador + + Varinha de Blaze - - Repor Predefinições + + Bife Cru - - Ver Oscilações + + Bife - - Sugestões + + Carne Podre - - Dicas Durante o Jogo + + Garrafa Mágica - - Ecrã Dividido Vertical 2 Jog. + + Tábuas de Carvalho - - Concluído + + Tábuas de Abeto - - Editar mensagem do sinal: + + Tábuas de Bétula - - Preenche os detalhes da tua captura de ecrã + + Bloco de Erva - - Legenda + + Terra - - Captura de ecrã do jogo + + Pedra Arredondada - - Editar mensagem do sinal: + + Tábuas da Selva - - As texturas, os ícones e a interface de utilizador clássicos do Minecraft! + + Bétula Jovem - - Mostrar Todos os Mundos de Mistura + + Rebentos de Árvores da Selva - - Sem Efeitos + + Rocha - - Velocidade + + Rebento - - Lentidão + + Carvalho Jovem - - Rapidez + + Abeto Jovem - - Cansaço por Escavação + + Pedra - - Força + + Moldura de Item - - Fraqueza + + Gerar {*CREATURE*} - - Saúde Instantânea + + Tijolo de Submundo - - Danos Instantâneos + + Carga de Fogo - - Impulso de Salto + + Carga Fogo Carv. Veg. - - Náusea + + Carga Fogo (Carvão) - - Regeneração + + Caveira - - Resistência + + Cabeça - - Resistência ao Fogo + + Cabeça de %s - - Inalação de Água + + Cabeça de Creeper - - Invisibilidade + + Caveira de Esqueleto - - Cegueira + + Caveira de Esqueleto Atrofiado - - Visão Noturna + + Cabeça de Morto-vivo - - Fome + + Uma forma compacta de armazenar Carvão. Pode ser usado como combustível numa Fornalha. Veneno - - de Velocidade + + Fome de Lentidão - - de Rapidez + + de Velocidade - - de Sonolência + + Invisibilidade - - de Força + + Inalação de Água - - de Fraqueza + + Visão Noturna - - de Saúde + + Cegueira de Danos - - de Salto + + de Saúde de Náusea @@ -5029,29 +5945,38 @@ Queres instalar o pack de mistura ou pack de texturas agora? de Regeneração - - de Resistência + + de Sonolência - - de Resistência ao Fogo + + de Rapidez - - de Inalação de Água + + de Fraqueza + + + de Força + + + Resistência ao Fogo - - de Invisibilidade + + Saturação - - de Cegueira + + de Resistência - - de Visão Noturna + + de Salto - - de Fome + + Wither - - de Veneno + + Impulso de Saúde + + + Absorção @@ -5062,29 +5987,41 @@ Queres instalar o pack de mistura ou pack de texturas agora? III + + de Invisibilidade + IV - - Explosiva + + de Inalação de Água - - Mundano + + de Resistência ao Fogo - - Desinteressante + + de Visão Noturna - - Suave + + de Veneno - - Clara + + de Fome - - Leitosa + + de Absorção - - Difusa + + de Saturação + + + de Impulso de Saúde + + + de Cegueira + + + da Decadência Simples @@ -5092,17 +6029,17 @@ Queres instalar o pack de mistura ou pack de texturas agora? Fina - - Estranha + + Difusa - - Plana + + Clara - - Pesada + + Leitosa - - Estragada + + Estranha Amanteigada @@ -5110,246 +6047,300 @@ Queres instalar o pack de mistura ou pack de texturas agora? Macia - - Suave + + Estragada - - Alegre + + Plana - - Espessa + + Pesada - - Elegante + + Suave - - Pomposa + + Explosiva - - Charmosa + + Mundano + + + Desinteressante Enérgica - - Sofisticada - Cordial + + Charmosa + + + Elegante + + + Pomposa + Brilhante + + Grosseira + + + Severa + + + Sem Cheiro + Potente Repugnante - - Sem Cheiro + + Suave - - Grosseira + + Sofisticada - - Severa + + Espessa - - Acre + + Alegre - - Nojenta + + Restitui a saúde dos jogadores, animais e monstros afetados, ao longo do tempo. - - Mal Cheirosa + + Reduz instantaneamente a saúde dos jogadores, animais e monstros afetados. - - Usada como base em todas as poções. Usa-a num posto de poções para criares poções. + + Faz com que os jogadores, animais e monstros afetados fiquem imunes ao fogo, lava e ataques de Blaze à distância. 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. + + Acre 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 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. + + Aumenta instantaneamente a saúde dos jogadores, animais e monstros afetados. + Reduz os danos causados pelos jogadores e monstros, quando atacam. - - Aumenta instantaneamente a saúde dos jogadores, animais e monstros afetados. + + Usada como base em todas as poções. Usa-a num posto de poções para criares poções. - - Reduz instantaneamente a saúde dos jogadores, animais e monstros afetados. + + Nojenta - - Restitui a saúde dos jogadores, animais e monstros afetados, ao longo do tempo. + + Mal Cheirosa - - Faz com que os jogadores, animais e monstros afetados fiquem imunes ao fogo, lava e ataques de Blaze à distância. + + Golpear + + + Precisão Reduz a saúde dos jogadores, animais e monstros afetados, ao longo do tempo. - - Precisão + + Danos de Ataque - - Golpear + + Coice Veneno de Artrópodes - - Coice + + Velocidade - - Aspeto do Fogo + + Reforços de Mortos-vivos - - Proteção + + Força de Salto do Cavalo + + + Quando Aplicável: + + + Resistência de Coice + + + Alcance de Habitante Seguidor + + + Máximo de Saúde + + + Toque de Seda + + + Eficiência + + + Afinidade Aquática + + + Sorte + + + Saque + + + Inquebrável Proteção contra Fogo + + Proteção + + + Aspeto do Fogo + Queda de Penas - - Proteção contra Explosões + + Respiração Proteção contra Projéteis - - Respiração - - - Afinidade Aquática + + Proteção contra Explosões - - Eficiência + + IV - - Toque de Seda + + V - - Inquebrável + + VI - - Saque + + Soco - - Sorte + + VII - - Poder + + III Chama - - Soco + + Poder Infinidade - - I - - - II - - - III + + II - - IV + + I - - V + + É ativado quando uma entidade passa através de uma Armadilha com Fio ligada. - - VI + + Ativa um Gancho para Armadilha de Fio quando uma entidade passa através dele. - - VII + + Uma forma compacta de armazenar Esmeraldas. - - VIII + + Semelhante a um Baú, mas com uma diferença: os objetos colocados num Baú de Ender estão disponíveis em todos os Baús de Ender do jogador, mesmo em dimensões diferentes. IX - - X + + VIII Pode ser escavado com uma picareta de ferro ou melhor para recolher Esmeraldas. - - Semelhante a um Baú, mas com uma diferença: os objetos colocados num Baú de Ender estão disponíveis em todos os Baús de Ender do jogador, mesmo em dimensões diferentes. - - - É ativado quando uma entidade passa através de uma Armadilha com Fio ligada. + + X - - Ativa um Gancho para Armadilha de Fio quando uma entidade passa através dele. + + Restitui 2{*ICON_SHANK_01*} e pode fazer uma cenoura dourada. Pode ser plantada em terrenos de cultivo. - - Uma forma compacta de armazenar Esmeraldas. + + Usado como decoração. Nele podes plantar Flores, Rebentos, Catos e Cogumelos. Uma parede feita de Pedra Arredondada. - - Pode ser usada para reparar armas, ferramentas e armaduras. + + Restitui 0,5{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. Pode ser plantada em terrenos de cultivo. Funde-se numa fornalha para produzir Quartzo do Submundo. - - Usado como decoração. + + Pode ser usada para reparar armas, ferramentas e armaduras. Pode ser trocada com os aldeãos. - - Usado como decoração. Nele podes plantar Flores, Rebentos, Catos e Cogumelos. + + Usado como decoração. - - Restitui 2{*ICON_SHANK_01*} e pode fazer uma cenoura dourada. Pode ser plantada em terrenos de cultivo. + + Restitui 4{*ICON_SHANK_01*}. - - Restitui 0,5{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. Pode ser plantada em terrenos de cultivo. + + Restitui 1{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. + + + Usada para controlar um porco com sela, quando o montas. Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando uma batata numa fornalha. - - Restitui 1{*ICON_SHANK_01*}, ou pode ser cozinhada numa fornalha. Pode ser plantada em terrenos de cultivo. Se comeres isto podes ficar envenenado. - Restitui 3{*ICON_SHANK_01*}. Faz-se de uma cenoura e pepitas de ouro. - - Usada para controlar um porco com sela, quando o montas. - - - Restitui 4{*ICON_SHANK_01*}. - Pode ser usado com uma Bigorna para enfeitiçar armas, ferramentas e armaduras. Criado escavando Minério de Quartzo do Submundo. Pode ser transformado num Bloco de Quartzo. + + Batata + + + Batata Assada + + + Cenoura + Criado a partir de Lã. Usado como decoração. @@ -5359,14 +6350,11 @@ Queres instalar o pack de mistura ou pack de texturas agora? Vaso de Flores - - Cenoura - - - Batata + + Tarte de Abóbora - - Batata Assada + + Livro Enfeitiçado Batata Venenosa @@ -5377,11 +6365,11 @@ Queres instalar o pack de mistura ou pack de texturas agora? Cenoura num Pau - - Tarte de Abóbora + + Gancho (Armadilha de Fio) - - Livro Enfeitiçado + + Armadilha de Fio Quartzo do Submundo @@ -5392,11 +6380,8 @@ Queres instalar o pack de mistura ou pack de texturas agora? Baú de Ender - - Gancho (Armadilha de Fio) - - - Armadilha de Fio + + Parede de Pedra com Musgo Bloco de Esmeralda @@ -5404,8 +6389,8 @@ Queres instalar o pack de mistura ou pack de texturas agora? Parede de Pedra - - Parede de Pedra com Musgo + + Batatas Vaso de Flores @@ -5413,8 +6398,8 @@ Queres instalar o pack de mistura ou pack de texturas agora? Cenouras - - Batatas + + Bigorna Ligeiramente Danificada Bigorna @@ -5422,8 +6407,8 @@ Queres instalar o pack de mistura ou pack de texturas agora? Bigorna - - Bigorna Ligeiramente Danificada + + Bloco de Quartzo Bigorna Muito Danificada @@ -5431,8 +6416,8 @@ Queres instalar o pack de mistura ou pack de texturas agora? Minério de Quartzo do Submundo - - Bloco de Quartzo + + Escadas de Quartzo Bloco de Quartzo Burilado @@ -5440,8 +6425,8 @@ Queres instalar o pack de mistura ou pack de texturas agora? Pilar de Bloco de Quartzo - - Escadas de Quartzo + + Tapete Vermelho Tapete @@ -5449,8 +6434,8 @@ Queres instalar o pack de mistura ou pack de texturas agora? Tapete Preto - - Tapete Vermelho + + Tapete Azul Tapete Verde @@ -5458,9 +6443,6 @@ Queres instalar o pack de mistura ou pack de texturas agora? Tapete Castanho - - Tapete Azul - Tapete Roxo @@ -5473,18 +6455,18 @@ Queres instalar o pack de mistura ou pack de texturas agora? Tapete Cinzento - - Tapete Cor-de-Rosa - Tapete Verde-Lima - - Tapete Amarelo + + Tapete Cor-de-Rosa Tapete Azul Claro + + Tapete Amarelo + Tapete Magenta @@ -5497,89 +6479,84 @@ Queres instalar o pack de mistura ou pack de texturas agora? Arenito Burilado - - Arenito Macio - {*PLAYER*} morreu ao tentar magoar {*SOURCE*} + + Arenito Macio + {*PLAYER*} foi esmagado por uma Bigorna em queda. {*PLAYER*} foi esmagado por um bloco em queda. - - Efetuado teletransporte de {*PLAYER*} para {*DESTINATION*} - {*PLAYER*} teletransportou-te para a sua posição - - {*PLAYER*} teletransportou-se até ti + + Efetuado teletransporte de {*PLAYER*} para {*DESTINATION*} Espinhos - - Placa de Quartzo + + {*PLAYER*} teletransportou-se até ti Faz com que as áreas escuras sejam vistas como de dia, mesmo debaixo de água. + + Placa de Quartzo + Torna invisíveis os jogadores, animais e monstros afetados. Reparar e Atribuir Nome - - Custo de Feitiço: %d - Demasiado Caro! - - Renomear + + Custo de Feitiço: %d Tens: - - Necessitas para a troca: + + Renomear {*VILLAGER_TYPE*} oferece %s - - Reparar + + Necessitas para a troca: Trocar - - Pintar coleira + + Reparar Este é o interface da Bigorna, o qual podes usar para renomear, reparar e aplicar feitiços a armas, armaduras ou ferramentas, pagando com Níveis de Experiência. - - - {*B*} - Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre o interface da Bigorna.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre o interface da Bigorna. - + + Pintar coleira Para começares a trabalhar num objeto, coloca-o no primeiro espaço de entrada. - + - Quando a matéria-prima correta é colocada no segundo espaço de entrada (exemplo: Lingotes de Ferro para uma Espada de Ferro danificada), a reparação proposta surge no espaço de saída. + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre o interface da Bigorna.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre o interface da Bigorna. @@ -5587,9 +6564,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? Em alternativa, podes colocar um segundo objeto idêntico no segundo espaço para combinar os dois objetos. - + - Para enfeitiçares os objetos na Bigorna, coloca um Livro Enfeitiçado no segundo espaço de entrada. + Quando a matéria-prima correta é colocada no segundo espaço de entrada (exemplo: Lingotes de Ferro para uma Espada de Ferro danificada), a reparação proposta surge no espaço de saída. @@ -5597,9 +6574,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? O número de Níveis de Experiência necessários para o trabalho é mostrado debaixo da saída. Se não tiveres Níveis de Experiência suficientes, a reparação não pode ser terminada. - + - É possível renomeares um objeto ao editares o nome que é mostrado na caixa de texto. + Para enfeitiçares os objetos na Bigorna, coloca um Livro Enfeitiçado no segundo espaço de entrada. @@ -5607,9 +6584,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? Se recolheres o objeto reparado, os dois objetos usados pela Bigorna serão consumidos e vão fazer decrescer o teu Nível de Experiência no valor demonstrado. - + - Nesta área existe uma Bigorna e um Baú, que contêm ferramentas e armas que podem ser trabalhadas. + É possível renomeares um objeto ao editares o nome que é mostrado na caixa de texto. @@ -5619,9 +6596,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a Bigorna. - + - Utilizando uma Bigorna, podes reparar armas e ferramentas para restaurar a sua durabilidade, alterar o nome ou enfeitiçá-las com Livros Enfeitiçados. + Nesta área existe uma Bigorna e um Baú, que contêm ferramentas e armas que podem ser trabalhadas. @@ -5629,9 +6606,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? Os Livros Enfeitiçados podem ser encontrados dentro de Baús nas masmorras, ou enfeitiçados a partir de Livros normais na Mesa de Feitiços. - + - Usar a Bigorna tem um custo de Níveis de Experiência e a cada utilização existe a possibilidade de danificar a Bigorna. + Utilizando uma Bigorna, podes reparar armas e ferramentas para restaurar a sua durabilidade, alterar o nome ou enfeitiçá-las com Livros Enfeitiçados. @@ -5639,9 +6616,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? O tipo de trabalho a ser feito, valor do objeto, número de feitiços e quantidade de trabalho prévio, tudo isto afeta o custo da reparação. - + - Renomear um objeto altera o nome exibido a todos os jogadores e reduz permanentemente o custo de trabalho prévio. + Usar a Bigorna tem um custo de Níveis de Experiência e a cada utilização existe a possibilidade de danificar a Bigorna. @@ -5649,9 +6626,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? No Baú que está nesta área, vais encontrar Picaretas danificadas, matérias-primas, Garrafas Mágicas e Livros de Feitiços para fazeres experiências. - + - Este é o interface de trocas, que exibe as trocas que podem ser feitas com um aldeão. + Renomear um objeto altera o nome exibido a todos os jogadores e reduz permanentemente o custo de trabalho prévio. @@ -5661,9 +6638,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre o interface de trocas. - + - Todas as trocas que o aldeão está disposto a fazer, neste momento, são exibidas ao longo do topo. + Este é o interface de trocas, que exibe as trocas que podem ser feitas com um aldeão. @@ -5671,9 +6648,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? As trocas vão surgir a vermelho e não ficarão disponíveis, se não tiveres os objetos necessários. - + - A quantidade e tipo de objetos que estás a dar ao aldeão são mostrados nas duas caixas à esquerda. + Todas as trocas que o aldeão está disposto a fazer, neste momento, são exibidas ao longo do topo. @@ -5681,9 +6658,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? Podes ver o número total de objetos necessários à troca nas duas caixas à esquerda. - + - Prime{*CONTROLLER_VK_A*} para trocar os objetos que o aldeão requer pelo objeto em oferta. + A quantidade e tipo de objetos que estás a dar ao aldeão são mostrados nas duas caixas à esquerda. @@ -5691,11 +6668,9 @@ Queres instalar o pack de mistura ou pack de texturas agora? Nesta área, existe um aldeão e um Baú que contém Papel, para comprar objetos. - + - {*B*} - Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre trocas.{*B*} - Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre trocas. + Prime{*CONTROLLER_VK_A*} para trocar os objetos que o aldeão requer pelo objeto em oferta. @@ -5703,14 +6678,21 @@ Queres instalar o pack de mistura ou pack de texturas agora? Os jogadores podem trocar objetos do seu inventário com os aldeões. - + - As trocas que um aldeão tem tendência a oferecer dependem da sua profissão. + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre trocas.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre trocas. Ao executares trocas variadas, as trocas disponíveis do aldeão vão alterar-se aleatoriamente ou serão atualizadas. + + + + + As trocas que um aldeão tem tendência a oferecer dependem da sua profissão. @@ -5872,7 +6854,4 @@ Todos os Baús de Ender num mundo estão ligados. Os objetos colocados num Baú Curar - - A procurar Semente para o Gerador de Mundos - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsPlatformSpecific.xml index 02fa7b35..8b5532c3 100644 --- a/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/pt-PT/stringsPlatformSpecific.xml @@ -1,241 +1,244 @@  - - NOT USED + + Queres iniciar uma sessão na "PSN"? + - - Podes usar o ecrã táctil do sistema PlayStation®Vita para navegar pelos menus! + + Para os jogadores que não estão no mesmo sistema PlayStation®Vita do anfitrião, selecionar esta opção irá expulsar o jogador do jogo e quaisquer outros jogadores que estejam nos seus sistemas PlayStation®Vita. Este jogador não poderá voltar a juntar-se ao jogo até que este seja reiniciado. - - minecraftforum tem uma secção dedicada à PlayStation®Vita Edition. + + SELECT - - Obtém as mais recentes novidades sobre este jogo do @4J Studios e do @Kappische no Twitter! + + Esta opção desativa os troféus e as atualizações da tabela de liderança, enquanto estás a jogar neste mundo, e também se voltares a carregá-lo depois de gravares com esta opção ligada. + - - Não olhes para um Enderman nos olhos! + + Sistema PlayStation®Vita - - Pensamos que a 4J Studios retirou o Herobrine do jogo do sistema PlayStation®Vita, mas não temos totalmente a certeza. + + Escolhe Rede Ad Hoc para te ligares a outros sistemas PlayStation®Vita próximos, ou "PSN" para te ligares a amigos de todo o mundo. - - Minecraft: PlayStation®Vita Edition bateu muitos recordes! + + Rede Ad Hoc - - {*T3*}INSTRUÇÕES DE JOGO: MULTIJOGADOR{*ETW*}{*B*}{*B*} -O Minecraft para o sistema PlayStation®Vita é, por definição, um jogo multijogador.{*B*}{*B*} -Quando inicias ou te juntas a um jogo online, essa informação ficará visível para a tua lista de amigos (exceto se tiveres selecionado "Apenas Por Convite" ao criar o jogo) e se eles se juntarem ao jogo, também ficará visível para as suas listas de amigos (se tiveres selecionado a opção "Permitir Amigos de Amigos").{*B*} -Durante um jogo, podes premir o botão SELECT para abrires uma lista de todos os outros jogadores do jogo e Expulsar jogadores do jogo. + + Mudar Modo de Rede - - {*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. Será apresentada uma versão em miniatura da tua captura de ecrã e poderás editar o texto associado à publicação no Facebook.{*B*}{*B*} -Existe um modo de câmara especial para estas capturas de ecrã, que te permite ver a tua personagem de frente na imagem - prime {*CONTROLLER_ACTION_CAMERA*} até teres uma vista frontal da tua personagem, antes de premires {*CONTROLLER_VK_Y*} para Partilhar.{*B*}{*B*} -As ID's Online não são mostradas na captura de ecrã. + + Selecionar Modo de Rede - - {*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 da recolha de recursos.{*B*} -Se criares, carregares ou gravares um mundo no Modo Criativo, as atualizações de troféus e tabelas de liderança serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência.{*B*}{*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.{*B*} -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. + + ID's Online de Ecrã Dividido - - 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 os botões de direções para te moveres para cima, para baixo, para a esquerda ou para a direita. + + Troféus - - NOT USED + + Este jogo tem uma funcionalidade de gravação automática. Quando vires o ícone acima, o jogo está a guardar os teus dados. +Não desligues o teu sistema PlayStation®Vita enquanto este ícone estiver visível. - - NOT USED + + Quando ativada, o anfitrião pode ligar ou desligar a capacidade de voar, desativar a exaustão e tornar-se invisível, a partir do menu do jogo. Desativa as atualizações dos troféus e tabelas de liderança. - - "NOT USED" + + ID's Online: - - "NOT USED" + + Estás a usar uma versão de avaliação de um pack de texturas. Terás acesso total ao pack de texturas, mas não poderás gravar os teus progressos. Se tentares gravar enquanto usas a versão de avaliação, ser-te-á dada a opção de comprar a versão completa. + - - Convidar Amigos + + Patch 1.04 (Atualização de Título 14) - - Se criares, carregares ou gravares um mundo no Modo Criativo, as atualizações de troféus e tabelas de liderança serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência. Tens a certeza de que queres continuar? + + ID's Online do Jogo - - Este mundo foi gravado anteriormente no Modo Criativo e as atualizações de troféus e tabelas de liderança serão desativadas. Tens a certeza de que queres continuar? + + Olha o que eu fiz no Minecraft: PlayStation®Vita Edition! - - Este mundo já foi gravado no Modo Criativo, pelo que as atualizações de troféus e tabelas de liderança estão desativadas. + + A transferência falhou. Tenta novamente mais tarde. - - Se criares, carregares ou gravares um mundo com os Privilégios de Anfitrião ativados, as atualizações de troféus e tabelas de liderança serão desativadas, mesmo que depois seja carregado com estas opções desligadas. Tens a certeza de que queres continuar? + + Não foi possível juntar ao jogo devido a um tipo de NAT restritivo. Por favor, verifica as tuas definições de rede. - - Perdeste a ligação à "PSN". A sair para o menu principal. + + O carregamento falhou. Tenta novamente mais tarde. - - Perdeste a ligação à "PSN". + + Transferência Completa! - - Esta é a versão de avaliação do Minecraft: PlayStation®Vita Edition. Se tivesses o jogo completo, terias acabado de ganhar um troféu! -Desbloqueia o jogo completo para viveres a emoção do Minecraft: PlayStation®Vita Edition e para jogares com amigos, de todo o mundo, através da "PSN". -Queres desbloquear o jogo completo? + + De momento, não existe nenhum ficheiro de gravação disponível na área de transferência de gravações. +Podes carregar um mundo gravado para a área de transferência de gravações através do Minecraft: PlayStation®3 Edition e depois transferi-lo com o Minecraft: PlayStation®Vita Edition. - - Esta é a versão de avaliação do Minecraft: PlayStation®Vita Edition. Se tivesses o jogo completo, terias acabado de ganhar um tema! -Desbloqueia o jogo completo para viveres a emoção do Minecraft: PlayStation®Vita Edition e para jogares com amigos, de todo o mundo, através da "PSN". -Queres desbloquear o jogo completo? + + Gravação incompleta - - Esta é a versão de avaliação do Minecraft: PlayStation®Vita Edition. Precisas do jogo completo para poderes aceitar este convite. -Queres desbloquear o jogo completo? + + O Minecraft: PlayStation®Vita Edition está sem espaço para gravar dados. Para criares espaço, apaga outras gravações do Minecraft: PlayStation®Vita Edition. - - Os jogadores convidados não podem desbloquear o jogo completo. Inicia sessão com uma conta Sony Entertainment Network. + + Carregamento cancelado - - ID Online + + Cancelaste o carregamento deste ficheiro de gravação para a área de transferência de ficheiros de gravação. - - Preparação + + Carregar Gravação para PS3™/PS4™ - - Foste reencaminhado para o ecrã principal porque terminaste a sessão na "PSN". + + A enviar dados: %d%% - - Jogaste a versão de avaliação do Minecraft: PlayStation®Vita Edition durante o tempo máximo permitido! Para continuares a divertir-te, queres desbloquear o jogo completo? + + "PSN" - - Não foi possível carregar "Minecraft: PlayStation®Vita Edition" e não é possível continuar. + + Transferir dados de PS3™ - - Falha ao juntar ao jogo, porque um ou mais jogadores não têm permissões para jogar Online devido a restrições de conversação na conta Sony Entertainment Network. + + A transferir dados: %d%% - - Falha ao criar um jogo online, porque um ou mais jogadores não têm permissões para jogar Online devido a restrições de conversação na conta Sony Entertainment Network. Desmarca a caixa "Jogo Online" em "Mais Opções" para iniciares um jogo offline. + + A Gravar - - Não tens autorização para te juntares a esta sessão de jogo porque a funcionalidade Online está desativada na tua conta Sony Entertainment Network, devido a restrições de conversação. + + Carregamento Completo! - - Não tens autorização para te juntares a esta sessão de jogo porque um dos jogadores locais tem a funcionalidade Online desativada na sua conta Sony Entertainment Network, devido a restrições de conversação. Desmarca a caixa "Jogo Online" em "Mais Opções", para iniciar um jogo offline. + + Tens a certeza que queres carregar esta gravação e substituir qualquer outra gravação que tenhas na área de transferência de gravações? - - Não tens autorização para criar esta sessão de jogo porque um dos jogadores locais tem a funcionalidade Online desativada na sua conta Sony Entertainment Network, devido a restrições de conversação. Desmarca a caixa "Jogo Online" em "Mais Opções", para iniciar um jogo offline. + + A Converter Dados - - Este jogo tem uma funcionalidade de gravação automática. Quando vires o ícone acima, o jogo está a guardar os teus dados. -Não desligues o teu sistema PlayStation®Vita enquanto este ícone estiver visível. + + NOT USED - - Quando ativada, o anfitrião pode ligar ou desligar a capacidade de voar, desativar a exaustão e tornar-se invisível, a partir do menu do jogo. Desativa as atualizações dos troféus e tabelas de liderança. + + NOT USED - - ID's Online de Ecrã Dividido + + {*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 da recolha de recursos.{*B*} +Se criares, carregares ou gravares um mundo no Modo Criativo, as atualizações de troféus e tabelas de liderança serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência.{*B*}{*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.{*B*} +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. - - Troféus + + 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 os botões de direções para te moveres para cima, para baixo, para a esquerda ou para a direita. - - ID's Online: + + "NOT USED" - - ID's Online do Jogo + + Se criares, carregares ou gravares um mundo no Modo Criativo, as atualizações de troféus e tabelas de liderança serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência. Tens a certeza de que queres continuar? - - Olha o que eu fiz no Minecraft: PlayStation®Vita Edition! + + Este mundo foi gravado anteriormente no Modo Criativo e as atualizações de troféus e tabelas de liderança serão desativadas. Tens a certeza de que queres continuar? - - Estás a usar uma versão de avaliação de um pack de texturas. Terás acesso total ao pack de texturas, mas não poderás gravar os teus progressos. Se tentares gravar enquanto usas a versão de avaliação, ser-te-á dada a opção de comprar a versão completa. - + + "NOT USED" - - Patch 1.04 (Atualização de Título 14) + + Convidar Amigos - - SELECT + + minecraftforum tem uma secção dedicada à PlayStation®Vita Edition. - - Esta opção desativa os troféus e as atualizações da tabela de liderança, enquanto estás a jogar neste mundo, e também se voltares a carregá-lo depois de gravares com esta opção ligada. - + + Obtém as mais recentes novidades sobre este jogo do @4J Studios e do @Kappische no Twitter! - - Queres iniciar uma sessão na "PSN"? - + + NOT USED - - Para os jogadores que não estão no mesmo sistema PlayStation®Vita do anfitrião, selecionar esta opção irá expulsar o jogador do jogo e quaisquer outros jogadores que estejam nos seus sistemas PlayStation®Vita. Este jogador não poderá voltar a juntar-se ao jogo até que este seja reiniciado. + + Podes usar o ecrã táctil do sistema PlayStation®Vita para navegar pelos menus! - - Sistema PlayStation®Vita + + Não olhes para um Enderman nos olhos! - - Mudar Modo de Rede + + {*T3*}INSTRUÇÕES DE JOGO: MULTIJOGADOR{*ETW*}{*B*}{*B*} +O Minecraft para o sistema PlayStation®Vita é, por definição, um jogo multijogador.{*B*}{*B*} +Quando inicias ou te juntas a um jogo online, essa informação ficará visível para a tua lista de amigos (exceto se tiveres selecionado "Apenas Por Convite" ao criar o jogo) e se eles se juntarem ao jogo, também ficará visível para as suas listas de amigos (se tiveres selecionado a opção "Permitir Amigos de Amigos").{*B*} +Durante um jogo, podes premir o botão SELECT para abrires uma lista de todos os outros jogadores do jogo e Expulsar jogadores do jogo. - - Selecionar Modo de Rede + + {*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. Será apresentada uma versão em miniatura da tua captura de ecrã e poderás editar o texto associado à publicação no Facebook.{*B*}{*B*} +Existe um modo de câmara especial para estas capturas de ecrã, que te permite ver a tua personagem de frente na imagem - prime {*CONTROLLER_ACTION_CAMERA*} até teres uma vista frontal da tua personagem, antes de premires {*CONTROLLER_VK_Y*} para Partilhar.{*B*}{*B*} +As ID's Online não são mostradas na captura de ecrã. - - Escolhe Rede Ad Hoc para te ligares a outros sistemas PlayStation®Vita próximos, ou "PSN" para te ligares a amigos de todo o mundo. + + Pensamos que a 4J Studios retirou o Herobrine do jogo do sistema PlayStation®Vita, mas não temos totalmente a certeza. - - Rede Ad Hoc + + Minecraft: PlayStation®Vita Edition bateu muitos recordes! - - "PSN" + + Jogaste a versão de avaliação do Minecraft: PlayStation®Vita Edition durante o tempo máximo permitido! Para continuares a divertir-te, queres desbloquear o jogo completo? - - Transferir dados sistema PlayStation®3 - + + Não foi possível carregar "Minecraft: PlayStation®Vita Edition" e não é possível continuar. - - Carregar Gravação para sistema PlayStation®3/PlayStation®4 + + Preparação - - Carregamento cancelado + + Foste reencaminhado para o ecrã principal porque terminaste a sessão na "PSN". - - Cancelaste o carregamento deste ficheiro de gravação para a área de transferência de ficheiros de gravação. + + Falha ao juntar ao jogo, porque um ou mais jogadores não têm permissões para jogar Online devido a restrições de conversação na conta Sony Entertainment Network. - - A enviar dados: %d%% + + Não tens autorização para te juntares a esta sessão de jogo porque um dos jogadores locais tem a funcionalidade Online desativada na sua conta Sony Entertainment Network, devido a restrições de conversação. Desmarca a caixa "Jogo Online" em "Mais Opções", para iniciar um jogo offline. - - A transferir dados: %d%% + + Não tens autorização para criar esta sessão de jogo porque um dos jogadores locais tem a funcionalidade Online desativada na sua conta Sony Entertainment Network, devido a restrições de conversação. Desmarca a caixa "Jogo Online" em "Mais Opções", para iniciar um jogo offline. - - Tens a certeza que queres carregar esta gravação e substituir qualquer outra gravação que tenhas na área de transferência de gravações? + + Falha ao criar um jogo online, porque um ou mais jogadores não têm permissões para jogar Online devido a restrições de conversação na conta Sony Entertainment Network. Desmarca a caixa "Jogo Online" em "Mais Opções" para iniciares um jogo offline. - - A Converter Dados + + Não tens autorização para te juntares a esta sessão de jogo porque a funcionalidade Online está desativada na tua conta Sony Entertainment Network, devido a restrições de conversação. - - A Gravar + + Perdeste a ligação à "PSN". A sair para o menu principal. - - Carregamento Completo! + + Perdeste a ligação à "PSN". - - O carregamento falhou. Tenta novamente mais tarde. + + Este mundo já foi gravado no Modo Criativo, pelo que as atualizações de troféus e tabelas de liderança estão desativadas. - - Transferência Completa! + + Se criares, carregares ou gravares um mundo com os Privilégios de Anfitrião ativados, as atualizações de troféus e tabelas de liderança serão desativadas, mesmo que depois seja carregado com estas opções desligadas. Tens a certeza de que queres continuar? - - A transferência falhou. Tenta novamente mais tarde. + + Esta é a versão de avaliação do Minecraft: PlayStation®Vita Edition. Se tivesses o jogo completo, terias acabado de ganhar um troféu! +Desbloqueia o jogo completo para viveres a emoção do Minecraft: PlayStation®Vita Edition e para jogares com amigos, de todo o mundo, através da "PSN". +Queres desbloquear o jogo completo? - - Não foi possível juntar ao jogo devido a um tipo de NAT restritivo. Por favor, verifica as tuas definições de rede. + + Os jogadores convidados não podem desbloquear o jogo completo. Inicia sessão com uma conta Sony Entertainment Network. - - De momento não existe nenhum ficheiro de gravação disponível na área de transferência. Podes carregar um mundo gravado para a área de transferência de gravações através do Minecraft: PlayStation®3 Edition e depois transferi-lo com o Minecraft: PlayStation®Vita Edition. + + ID Online - - Gravação incompleta + + Esta é a versão de avaliação do Minecraft: PlayStation®Vita Edition. Se tivesses o jogo completo, terias acabado de ganhar um tema! +Desbloqueia o jogo completo para viveres a emoção do Minecraft: PlayStation®Vita Edition e para jogares com amigos, de todo o mundo, através da "PSN". +Queres desbloquear o jogo completo? - - O Minecraft: PlayStation®Vita Edition está sem espaço para gravar dados. Para criares espaço, apaga outras gravações do Minecraft: PlayStation®Vita Edition. + + Esta é a versão de avaliação do Minecraft: PlayStation®Vita Edition. Precisas do jogo completo para poderes aceitar este convite. +Queres desbloquear o jogo completo? + + + O ficheiro de gravação na área de transferência de gravações tem um número de versão que o Minecraft: PlayStation®Vita Edition ainda não suporta. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/4J_stringsPlatformSpecific.xml index 60da6a34..38fe00e2 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ru-RU/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/4J_stringsPlatformSpecific.xml @@ -1,53 +1,52 @@  - - На системном накопителе недостаточно свободного места, чтобы создать сохранение. + + Не удалось сохранить настройки учетной записи Sony Entertainment Network. - - Вы вернулись на титульный экран, так как вышли из "PSN". + + Проблема с учетной записью Sony Entertainment Network - - Игра закончилась, так как вы вышли из "PSN". - + + Не удалось получить доступ к вашей учетной записи Sony Entertainment Network. Сейчас вы не сможете получить этот приз. - - В данный момент не в сети. - + + Это пробная версия игры Minecraft: PlayStation®3 Edition. Будь у вас полная версия, вы бы только что получили приз! +Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®3 Edition и играть с друзьями со всего мира посредством "PSN". +Получить доступ к полной версии игры? - - В игре есть возможности, которые требуют соединения с "PSN", однако вы сейчас не в сети. + + Подключиться к сети в специальном режиме + + + В игре есть возможности, которые требуют подключения к сети в специальном режиме, однако вы сейчас не в сети. Нет подключения к сети в специальном режиме. - - В игре есть возможности, которые требуют подключения к сети в специальном режиме, однако вы сейчас не в сети. + + Проблема с призами - - Для доступa к этой возможности нужно войти в "PSN". + + Игра закончилась, так как вы вышли из "PSN". - - Войти в "PSN" - - - Подключиться к сети в специальном режиме + + Вы вернулись на титульный экран, так как вышли из "PSN". - - Проблема с призами + + На системном накопителе недостаточно свободного места, чтобы создать сохранение. - - Не удалось получить доступ к вашей учетной записи Sony Entertainment Network. Сейчас вы не сможете получить этот приз. + + В данный момент не в сети. - - Проблема с учетной записью Sony Entertainment Network + + Войти в "PSN" - - Не удалось сохранить настройки учетной записи Sony Entertainment Network. + + Для доступa к этой возможности нужно войти в "PSN". + - - Это пробная версия игры Minecraft: PlayStation®3 Edition. Будь у вас полная версия, вы бы только что получили приз! -Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®3 Edition и играть с друзьями со всего мира посредством "PSN". -Получить доступ к полной версии игры? + + В игре есть возможности, которые требуют соединения с "PSN", однако вы сейчас не в сети. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/AdditionalStrings.xml index 89cd031a..bf0fd5db 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ru-RU/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/AdditionalStrings.xml @@ -48,6 +48,12 @@ Файл настроек поврежден, необходимо удалить его. + + Удалить файл настроек. + + + Повторить попытку загрузки файла настроек. + Кэш сохранений поврежден, необходимо удалить его. @@ -75,6 +81,9 @@ Сетевые возможности для вашей учетной записи Sony Entertainment Network отключены в соответствии с настройками родительского контроля одного из локальных игроков. + + Сетевые функции отключены, поскольку доступно обновление игры. + В данный момент для этой игры нет загружаемого контента. @@ -84,7 +93,4 @@ Пожалуйста, зайдите и поиграйте немного в Minecraft: PlayStation®Vita Edition! - - Сетевые функции отключены, поскольку доступно обновление игры. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsGeneric.xml index 4504f324..69dd11dd 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsGeneric.xml @@ -1,5226 +1,6136 @@  - - Появился новый загружаемый контент! Чтобы получить к нему доступ, нажмите кнопку "Магазин Minecraft" в главном меню. + + Переключение на игру вне сети - - Вы можете изменить облик своего персонажа, купив набор скинов в магазине Minecraft. Выберите "Магазин Minecraft" в главном меню, чтобы увидеть доступные наборы. + + Подождите, пока хост сохраняет игру - - Изменить настройки гаммы, чтобы игра стала светлее или темнее. + + Вход на Край - - В "Мирном" режиме игры здоровье персонажа будет восстанавливаться автоматически, а монстры не будут приходить по ночам! + + Сохранение игроков - - Дайте волку кость, чтобы приручить его. Затем вы можете приказать ему сидеть или следовать за вами. + + Подключение к хосту - - Чтобы выбросить предмет, находясь в инвентаре, переместите курсор за пределы инвентаря и нажмите{*CONTROLLER_VK_A*} + + Загрузка поверхности - - Если заснуть в кровати, ночь сменится утром. В сетевой игре для этого все игроки должны быть в кроватях одновременно. + + Выход с Края - - Добывайте свиные отбивные, убивая свиней. Чтобы восстановить здоровье, приготовьте и съешьте отбивную. + + В вашем доме не было кровати, или путь к ней был заблокирован - - Добывайте кожу, убивая коров, и делайте из нее доспехи. + + Вы не можете отдыхать, рядом монстры - - Пустое ведро можно наполнить коровьим молоком, водой или лавой! + + Вы спите на кровати. Чтобы пропустить время до утра, все игроки должны спать на кроватях одновременно. - - С помощью мотыги можно подготовить землю к посеву. + + Кровать занята - - Днем пауки не нападут на вас, если вы их не атакуете. + + Спать можно только ночью - - Копать землю или песок лопатой быстрее, чем голыми руками! + + %s спит на кровати. Чтобы пропустить время до утра, все игроки должны спать на кроватях одновременно. - - Приготовленная свиная отбивная сильнее повышает уровень здоровья, чем сырая. + + Загрузка уровня - - Чтобы осветить участок земли, используйте факелы. Монстры избегают подходить к ним. + + Завершение... - - Ездить на вагонетке по рельсам быстрее, чем ходить пешком! + + Создание поверхности - - Сажайте ростки, и они вырастут в деревья. + + Короткая симуляция мира - - Свинолюди не нападают первыми. + + Ранг - - Спите в кровати, чтобы изменить точку спауна и быстрее перейти от ночи к утру. + + Подготовка к сохранению уровня - - Бросайте огненные шары обратно в вурдалака! + + Подготовка фрагментов... - - Построив портал, вы сможете попасть в другое измерение - преисподнюю. + + Инициализация сервера - - Чтобы бросить предмет, который вы держите в руке, нажмите{*CONTROLLER_VK_B*}. + + Выход из преисподней - - Подбирайте правильные инструменты для каждой задачи! + + Возрождение - - Если не удается найти уголь для факелов, вы можете его сделать, сжигая деревья в печи. + + Создание уровня - - Копать вертикально вниз или вверх - не лучшая мысль. + + Создание зоны возрождения - - Костная мука (ее можно сделать из кости скелета) - это удобрение, которое заставляет растения вырасти мгновенно! + + Загрузка зоны возрождения - - Подойдя к вам поближе, криперы взрываются! + + Вход в преисподнюю - - Обсидиан возникает там, где вода сталкивается с блоком-источником лавы. + + Инструменты и оружие - - Если убрать блок-источник лавы, то ПОЛНОСТЬЮ лава исчезнет только через несколько минут. + + Гамма - - Булыжники устойчивы к огненным шарам вурдалаков, поэтому они пригодятся при строительстве сторожевых порталов. + + В игре - - Блоки, которые можно использовать в качестве источника света, растапливают снег и лед. К ним относятся факелы, сияющие камни и фонари из тыквы. + + В интерфейсе - - Будьте осторожны, возводя здания из шерсти на открытом месте: во время грозы их могут поджечь молнии. + + Уровень сложности - - С помощью одного ведра лавы в печи можно расплавить 100 блоков. + + Музыка - - Инструмент, звучание которого воспроизводит нотный блок, зависит от материала под ним. + + Звук - - Зомби и скелеты могут выжить при дневном свете, если находятся в воде. + + Мирный - - Если вы атакуете волка, на вас нападут все волки, находящиеся поблизости. Так же ведут себя и зомби-свинолюди. + + В этом режиме здоровье игрока постепенно восстанавливается, а врагов в мире нет. - - Волки не могут входить в преисподнюю. + + В этом режиме в мире появляются враги, но они наносят игроку меньше урона, чем на обычном уровне сложности. - - Волки не нападают на криперов. + + В этом режиме в мире появляются враги, наносящие игрокам стандартные повреждения. - - Куры откладывают яйца с интервалом 5-10 минут. + + Легкий - - Обсидиан можно добыть только с помощью алмазной кирки. + + Обычный - - Легче всего добывать порох из криперов. + + Высокий - - Поставив два сундука рядом, вы получите один большой. + + Пользователь вышел из игры - - Положение хвоста ручного волка символизирует уровень его здоровья. Чтобы вылечить волка, кормите его мясом. + + Доспехи - - Чтобы получить зеленую краску, приготовьте кактус в печи. + + Механизмы - - Прочтите раздел "Что нового" в обучающих меню, чтобы узнать о последних изменениях в игре. + + Транспорт - - В игре появились ограды, которые можно ставить друг на друга! + + Оружие - - Некоторые животные будут следовать за вами, если вы держите пшеницу. + + Пища - - Если животное не может пройти больше 20 блоков в одном направлении, оно не исчезнет. + + Здания - - Композитор - C418! + + Украшения - - У Notch более миллиона последователей в Твиттере! + + Создание зелья - - Не у всех шведов светлые волосы. Среди них есть и рыжие, например Йенс из Mojang! + + Инструменты, оружие и доспехи - - Когда-нибудь у этой игры появится обновление! + + Материалы - - Кто такой Notch? + + Строительные блоки - - У Mojang больше наград, чем сотрудников! + + Красный камень и транспорт - - В Minecraft играют знаменитости! + + Другое - - deadmau5 любит Minecraft! + + Записи: - - Не смотрите на жуков в упор. + + Выйти без сохранения - - Криперы появились из-за ошибки в коде. + + Выйти в главное меню? Все несохраненные данные будут потеряны. - - Это курица или утка? + + Выйти в главное меню? Несохраненные данные будут потеряны! - - А вы были на Minecon? + + Файл поврежден. Удалить? - - Никто в Mojang не видел лица junkboy. + + Выйти в главное меню и отключить от игры всех пользователей? Все несохраненные данные будут потеряны. - - А вы знаете, что у Minecraft есть вики? + + Выйти и сохранить - - Новый офис Mojang ужасно крутой! + + Создать новый мир - - Выставка 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*}. {*B*}{*B*} -Удерживайте{*CONTROLLER_ACTION_ACTION*}, чтобы добывать ресурсы и рубить их рукой или инструментом, который вы держите. Для добычи некоторых материалов придется сделать определенные инструменты.{*B*}{*B*} -Взяв в руки какой-либо предмет, используйте его с помощью{*CONTROLLER_ACTION_USE*} или нажмите{*CONTROLLER_ACTION_DROP*}, чтобы бросить его. + + Пройти обучение - - {*T3*}ОБУЧЕНИЕ: ИНТЕРФЕЙС{*ETW*}{*B*}{*B*} -На экране приведена информация о вашем состоянии - уровне здоровья, количестве кислорода, если вы под водой, голоде (чтобы с ним бороться, нужно есть), а также об уровне доспехов, если они на вас надеты.{*B*}Если ваше здоровье ухудшилось, но шкала пищи находится на отметке 9{*ICON_SHANK_01*} или больше, то здоровье улучшится автоматически. Ешьте, чтобы заполнить шкалу пищи.{*B*} -Здесь же находится шкала опыта. Число показывает ваш уровень опыта. Кроме того, на экране расположена шкала, показывающая, сколько очков осталось до получения нового уровня.{*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*}, чтобы положить только один.{*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*} -На верстаке предметы создаются как обычно, но у вас больше рабочего пространства и больше доступных предметов для изготовления. - + + Магазин Minecraft - - {*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*}Слеза вурдалака{*ETW*}{*B*} -* {*T2*}Огненный порошок{*ETW*}{*B*} -* {*T2*}Сливки магмы{*ETW*}{*B*} -* {*T2*}Искрящаяся дыня{*ETW*}{*B*} -* {*T2*}Красная пыль{*ETW*}{*B*} -* {*T2*}Сияющая пыль{*ETW*}{*B*} -* {*T2*}Ферментированный глаз паука{*ETW*}{*B*}{*B*} - -Экспериментируйте с комбинациями ингредиентов, чтобы узнать, какие зелья можно из них приготовить. - + + Очистить все ячейки - - {*T3*}ОБУЧЕНИЕ: ЧАРЫ{*ETW*}{*B*}{*B*} -Очки опыта, полученные за убийство мобов и добычу и переплавку в печи определенных блоков, можно потратить на зачаровывание инструментов, оружия, доспехов и книг.{*B*} -Если поместить меч, лук, топор, кирку, лопату, доспех или книгу в ячейку под книгой на колдовском столе, на трех кнопках справа будут показаны некоторые чары, а также их стоимость в уровнях опыта.{*B*} -Если у вас достаточно опыта, это число будет зеленым, в противнoм случае оно красное.{*B*}{*B*} -Чары, которые будут наложены на предмет, выбираются случайным образом в зависимости от указанной стоимости.{*B*}{*B*} -Если колдовской стол окружен книжными полками (максимум - 15), с промежутком в 1 блок между полками и столом, чары станут более мощными, а книга на столе будет излучать магические символы.{*B*}{*B*} -Все ингредиенты для зачаровывания можно найти в деревне, добыть или вырастить.{*B*}{*B*} -С помощью зачарованных книг можно накладывать чары на предметы (для этого вам понадобится наковальня). Таким образом вы можете сами контролировать свойства своих предметов.{*B*} + + Выйти из текущей игры и присоединиться к новой? Все несохраненные данные будут утеряны. - - {*T3*}ОБУЧЕНИЕ: СОДЕРЖАНИЕ ЖИВОТНЫХ{*ETW*}{*B*}{*B*} -Если хотите держать животных в одном месте, оградите пространство площадью менее 20х20 блоков и поместите туда животных. Тогда они точно никуда оттуда не денутся. - + + Переписать все прежние сохранения данной версией? - - {*T3*}ОБУЧЕНИЕ: РАЗВЕДЕНИЕ ЖИВОТНЫХ{*ETW*}{*B*}{*B*} -Животные в Minecraft могут спариваться и производить на свет крошечные копии самих себя!{*B*} -Чтобы животные размножались, их нужно кормить соответствующими продуктами, чтобы они перешли в "режим любви".{*B*} -Кормите пшеницей коров, гриборов и овец, свиней - морковкой, кур - семенами пшеницы или адскими бородавками, волков - любым видом мяса, и тогда они начнут искать другое животное того же вида, которое также находится в режиме любви.{*B*} -Если встретятся две особи одного вида, которые находятся в режиме любви, несколько секунд они будут целоваться, а потом появится детеныш. Некоторое время малыш будет следовать за родителями, а затем превратится во взрослую особь.{*B*} -Животное, побывавшее в режиме любви, не сможет войти в него повторно около 5 минут.{*B*} -Максимальное число животных в мире ограничено, поэтому, они не будут размножаться, если их слишком много. + + Выйти без сохранения? Все, чего вы добились в этом мире, будет утеряно! - - {*T3*}ОБУЧЕНИЕ: ПОРТАЛ В ПРЕИСПОДНЮЮ{*ETW*}{*B*}{*B*} -Этот портал позволяет игроку путешествовать из верхнего мира в преисподнюю и обратно. Путешествия по преисподней - способ быстро перебраться из одной точки верхнего мира в другую: один блок преисподней соответствует 3 блокам в верхнем мире. Так что, построив портал -в преисподней и выйдя через него, вы окажетесь в три раза дальше от входа в верхнем мире.{*B*}{*B*} -Для строительства портала необходимо не менее 10 обсидиановых блоков. Портал должен быть 5 блоков в высоту, 4 блока в ширину и 1 блок в глубину. Как только портал построен, его нужно поджечь, чтобы активировать. Это можно сделать с помощью кремня и огнива или огненного заряда.{*B*}{*B*} -Примеры строительства порталов показаны на рисунке справа. - + + Начать игру - - {*T3*}ОБУЧЕНИЕ: ЗАПРЕЩЕННЫЕ УРОВНИ{*ETW*}{*B*}{*B*} -Если вам кажется, что уровень содержит оскорбительные материалы, вы можете добавить его в список запрещенных уровней. -Для этого откройте меню паузы, затем нажмите {*CONTROLLER_VK_RB*}, чтобы выбрать соответствующую всплывающую подсказку. -Если затем вы попытаетесь попасть на этот уровень, на экране появится сообщение о том, что уровень находится в списке запрещенных. Затем у вас будет возможность удалить его из черного списка и продолжить игру или выйти. + + Выйти из игры - - {*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*}Тротил взрывается{*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*} - - {*T1*}Внутриигровые настройки{*ETW*}{*B*} - Некоторые настройки можно изменить по ходу игры. Для этого нажмите {*BACK_BUTTON*}, чтобы открыть меню.{*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*} - {*KICK_PLAYER_DESCRIPTION*}{*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*} - Эта функция позволяет игроку перемещать игроков или себя самого к другим игрокам в мире. + + Сохранить игру - - Следующая страница + + Выйти без сохранения - - Предыдущая страница + + START - присоединиться - - Основы управления + + Ура! Вы получили в награду картинку с изображением Стива из Minecraft! - - Интерфейс + + Ура! Вы получили в награду картинку с изображением крипера! - - Инвентарь + + Получить доступ к полной версии - - Сундуки + + Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более новую версию игры. - - Создание предметов + + Новый мир - - Печь + + Доступна награда! - - Раздатчик + + Вы играете в пробную версию, но сохранить игру можно только в полной версии. +Получить доступ к полной версии игры? - - Содержание животных + + Друзья - - Разведение животных + + Мой счет - - Создание зелий + + Всего - - Зачаровывание предметов + + Пожалуйста, подождите... - - Портал в преисподнюю + + Нет результатов - - Сетевая игра + + Фильтр: - - Поделиться скриншотом + + Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более старую версию игры. - - Запрещенные уровни + + Соединение разорвано - - Режим "Творчество" + + Утрачено соединение с сервером. Сейчас вы вернетесь в главное меню. - - Настройки хоста и игроков - - - Торговля + + Сервер разорвал соединение - - Наковальня + + Выход из игры - - Край + + Произошла ошибка. Сейчас вы вернетесь в главное меню. - - {*T3*}ОБУЧЕНИЕ: КРАЙ{*ETW*}{*B*}{*B*} -Край - еще одно измерение в игре, и попасть в него можно, активировав портал Края. Он находится в крепости, которая стоит глубоко под землей в верхнем мире.{*B*} -Чтобы активировать портал Края, поместите глаз Края в рамку любого портала Края, где еще нет такого глаза.{*B*} -После активации вы можете зайти в него и отправиться в мир Края.{*B*}{*B*} -Там вы встретите дракона Края - яростного и сильного врага, а также множество заокраинников. Подготовьтесь к битве как следует!{*B*}{*B*} -Вы узнаете, что дракон Края лечит себя с помощью восьми кристаллов, которые находятся на вершинах обсидиановых шипов, так что прежде всего нужно уничтожить именно их.{*B*} -Несколько кристаллов можно уничтожить, стреляя в них из лука, но последние защищены железными клетками, так что придется построить к ним дорогу.{*B*}{*B*} -Все это время дракон будет налетать на вас и плеваться шарами с кислотой!{*B*} -Если подойти к подиуму в центре шипов, дракон Края спустится, чтобы напасть на вас, и тогда вы сможете нанести ему огромный урон!{*B*} -Уклоняйтесь от его едкого дыхания и старайтесь бить по глазам. По возможности пригласите друзей, чтобы они помогли вам одержать победу в этой битве!{*B*}{*B*} -Как только вы окажетесь в мире Края, ваши друзья увидят портал Края на своих картах и смогут к вам присоединиться. + + Не удалось установить соединение - - Бег + + Вас исключили из игры - - Что нового + + Хост вышел из игры. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*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*} -- Теперь криперы и пауки нападают на игрока, который нанес им урон последним.{*B*} -- Теперь в режиме ""Творчество"" мобы опять становятся нейтральными через некоторое время.{*B*} -- Теперь игрока не отбрасывает, когда он тонет.{*B*} -- Теперь видны повреждения дверей, которые ломают зомби.{*B*} -- Теперь лед тает в аду.{*B*} -- Теперь котел, стоящий под дождем, наполняется водой.{*B*} -- Поршни теперь движутся в два раза медленнее.{*B*} -- Если на свинье есть седло, оно падает с нее после ее смерти.{*B*} -- Изменен цвет неба Края.{*B*} -- Теперь нити можно размещать для создания натяжных переключателей.{*B*} -- Теперь дождь капает сквозь листья.{*B*} -- Рычаги теперь можно крепить к нижним частям блоков.{*B*} -- Тротил теперь наносит урон, зависящий от уровня сложности игры.{*B*} -- Изменен рецепт книги.{*B*} -- Теперь лодка разбивает кувшинки, а не наоборот.{*B*} -- Из свиней теперь выпадает больше отбивных.{*B*} -- Теперь в суперплоских мирах появляется меньше слизней.{*B*} -- Урон криперов теперь зависит от уровня сложности игры. Кроме того, теперь они сильнее отбрасывают игрока.{*B*} -- Исправлена ошибка, из-за которой заокраинники не открывали челюсти.{*B*} -- Добавлена возможность телепортации (используется из меню {*BACK_BUTTON*} в игре).{*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. + + Этот загружаемый контент поврежден, использовать его невозможно. Удалите его и заново установите из меню магазина Minecraft. - - Увеличивает уровень доспехов на 2. + + Часть загружаемого контента повреждена и не может быть использована. Удалите этот загружаемый контент, а затем заново установите из меню магазина Minecraft. - - Увеличивает уровень доспехов на 1. + + Невозможно присоединиться к игре - - Увеличивает уровень доспехов на 2. + + Выбрано - - Увеличивает уровень доспехов на 5. + + Выбранный скин: - - Увеличивает уровень доспехов на 4. + + Получить полную версию - - Увеличивает уровень доспехов на 1. + + Получить доступ к набору текстур - - Увеличивает уровень доспехов на 2. + + Прежде чем использовать этот набор текстур, необходимо получить к нему доступ. +Получить к нему доступ сейчас? - - Увеличивает уровень доспехов на 6. + + Набор текстур пробной версии - - Увеличивает уровень доспехов на 5. + + Число-затравка - - Увеличивает уровень доспехов на 2. + + Получить доступ к набору скинов - - Увеличивает уровень доспехов на 2. + + Прежде чем использовать этот набор скинов, необходимо получить к нему доступ. +Получить к нему доступ сейчас? - - Увеличивает уровень доспехов на 5. + + Вы используете набор текстур пробной версии. Вы не сможете сохранить этот мир, пока не получите доступ к полной версии. +Получить доступ к полной версии набора текстур? - - Увеличивает уровень доспехов на 3. + + Загрузить полную версию - - Увеличивает уровень доспехов на 1. + + В этом мире использован смешанный набор или набор текстур, которого у вас нет! +Установить смешанный набор или набор текстур? - - Увеличивает уровень доспехов на 3. + + Получить пробную версию - - Увеличивает уровень доспехов на 8. + + Нет набора текстур - - Увеличивает уровень доспехов на 6. + + Получить доступ к полной версии - - Увеличивает уровень доспехов на 3. + + Загрузить пробную версию - - Блестящий слиток, из которого можно делать инструменты. Чтобы получить его, расплавьте в печи кусок руды. + + Режим игры изменен - - Позволяет делать из слитков, самоцветов и красок размещаемые блоки. Можно использовать как дорогостоящий строительный материал или компактный вариант хранения руды. + + Выберите, чтобы к игре могли присоединиться только приглашенные. - - Выпускает электрический разряд, оказавшись под ногами игрока, монстра или животного. Деревянные пластины можно также активировать, сбросив на них что-нибудь. + + Выберите, чтобы к игре могли присоединиться друзья ваших друзей. - - Используется для создания небольших лестниц. + + Выберите, чтобы игроки могли причинять урон друг другу. Действует только в режиме "Выживание". - - Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок нормального размера. + + Нормальный - - Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. + + Суперплоский - - Используется для освещения. С помощью факелов можно также топить снег и лед. + + Выберите, чтобы игра была сетевой. - - Используется как строительный материал и для создания предметов. Получается из любых видов деревьев. + + Отключите, и игроки не смогут строить или добывать руду без разрешения. - - Используется как строительный материал. Сила тяжести действует на него иначе, чем на обычный песок. + + Выберите, чтобы в мире появились такие структуры, как деревни и крепости. - - Используется как строительный материал. + + Выберите, чтобы и верхний мир, и преисподняя были совершенно плоскими. - - Материал для факелов, стрел, табличек, лестниц, заборов и рукоятей для инструментов и оружия. + + Выберите, чтобы рядом с точкой спауна игроков появился сундук с полезными предметами. - - Позволяет перейти от любого момента ночи к утру (если в кроватях лежат все игроки в мире) и меняет точку спауна игрока. Окраска кровати всегда одна и та же. + + Выберите, чтобы огонь распространялся на соседние горючие блоки. - - Позволяет создавать более разнообразные предметы, чем при обычном занятии ремеслом. + + Выберите, чтобы после активации тротил взрывался. - - Позволяет плавить руду, создавать древесный уголь и стекло, а также готовить рыбу и свиные отбивные. + + Выберите, чтобы создать преисподнюю заново. Это полезно, если у вас старое сохранение, в котором нет адских крепостей. - - В нем можно хранить блоки и предметы. Чтобы создать сундук вдвое большего объема, поставьте два сундука рядом. + + Выкл. - - Барьер, через который нельзя перепрыгнуть. Для игроков, животных и монстров его высота считается равной 1,5 блокам. Для блоков его высота равна 1. + + Режим игры: Творчество - - По ней можно лазить вертикально. + + Выживание - - Чтобы активировать люк, нужно использовать его, ударить по нему или применить к нему красный камень. Они выполняют ту же самую роль, что и двери, но лежат на земле и они размером в один блок. + + Творчество - - На этом предмете размещается текст, написанный вами или другим игроками. + + Изменить название мира - - Дает более яркий свет, чем факелы. Им можно плавить снег и лед, а также использовать его под водой. + + Введите новое название мира - - Позволяет устраивать взрывы. Для детонации подожгите его кремнем и огнивом или электрическим разрядом. + + Режим игры: Выживание - - Тут хранятся тушеные грибы. Когда они съедены, миска остается у вас. - - - Тут можно хранить и переносить воду, лаву и молоко. + + Создано в режиме "Выживание" - - Тут можно хранить и переносить воду. + + Переименовать файл - - Тут можно хранить и переносить лаву. + + Автосохранение через %d... - - Тут можно хранить и переносить молоко. + + Вкл. - - С помощью этих предметов можно разводить огонь, поджигать тротил и открывать построенный портал. + + Создано в режиме "Творчество" - - С ее помощью можно ловить рыбу. + + Отображать облака - - Показывает положение солнца и луны. + + Что вы хотите сделать с этим сохранением? - - Указывает направление к точке старта. + + Размер и-фейса (разд. экран) - - Если держать ее в руках, она показывает исследованные области. Помогает искать маршрут. + + Ингредиент - - Позволяет выпускать во врагов стрелы. + + Топливо - - Это боеприпасы для лука. + + Распределитель - - Восстанавливает 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*}, можно приготовить в печи. + + %s присоединяется к игре. - - Восстанавливает 4{*ICON_SHANK_01*}. Готовится из сырой говядины в печи. + + %s покидает игру. - - Восстанавливает 1,5{*ICON_SHANK_01*}, можно приготовить в печи. + + %s исключается из игры. - - Восстанавливает 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*}. Этой едой можно отравиться. + + Игра переполнена - - Используется для приготовления торта или в качестве ингредиента для зелий. + + Не удалось присоединиться к игре, так как в ней нет свободных мест - - При включении/выключении выпускает электрический разряд. Остается во включенном или выключенном положении, пока на него не нажать. + + Введите заголовок вашего сообщения - - Постоянно выпускает электрические разряды. Соединив с блоком, можно использовать в качестве приемника/передатчика. Также является слабым источником света. + + Введите описание вашего сообщение - - Используется в красных сетях в качестве ретранслятора, элемента задержки и/или диода. + + Инвентарь - - При нажатии выпускает электрический разряд. Выключается примерно через секунду после активации. + + Ингредиенты - - Хранит и случайным образом выдает предметы, если поместить в него заряд красного камня. + + Подпись - - При активации проигрывает ноту. Чтобы изменить ее высоту, ударьте по блоку. Ставьте его на разные другие блоки, чтобы изменять тип музыкального инструмента. + + Введите подпись вашего сообщения - - По ним ездят вагонетки. + + Описание - - Под напряжением ускоряют вагонетки, которые по ним едут. При отключении напряжения останавливают вагонетки. + + Играет: - - Работают как нажимная пластина (под напряжением посылают красный сигнал), но их могут активировать только вагонетки. + + Добавить этот уровень к списку запрещенных? +Выбрав "ОК", вы, кроме того, выйдете из игры. - - Может перевозить вас, животное или монстра по рельсам. + + Удалить из черного списка - - Может перевозить товары по рельсам. + + Сохранять каждые - - Движется по рельсам. Если в нее положить уголь, сможет толкать другие вагонетки. + + Запрещенный уровень - - Позволяет передвигаться по воде быстрее, чем вплавь. + + Игра, к которой вы присоединяетесь, находится в вашем списке запрещенных уровней. Если вы к ней присоединитесь, она будет удалена из списка запрещенных. - - Ее можно состричь с овец и покрасить. + + Запретить этот уровень? - - Используется в качестве строительного материала, можно покрасить. Этот рецепт не рекомендуется - шерсть легко состричь с овец. + + Автосохранение: выкл. - - Краска для производства черной шерсти. + + Прозрач. интерфейса - - Краска для производства зеленой шерсти. + + Подготовка к автосохранению уровня - - Используется для производства коричневой шерсти, в качестве ингредиента для печенья или для выращивания плодов какао. + + Размер интерфейса - - Краска для производства серебряной шерсти. + + мин. - - Краска для производства желтой шерсти. + + Здесь нельзя! - - Краска для производства красной шерсти. + + Размещать лаву рядом с точкой возрождения не разрешается, так как в этом случае высока вероятность мгновенной гибели возрождающихся игроков. - - Позволяет мгновенно вырастить урожай, деревья, высокую траву, огромные грибы и цветы. Может использоваться при создании красок. + + Любимые скины - - Краска для производства розовой шерсти. + + Игра пользователя %s - - Краска для производства оранжевой шерсти. + + Игра неизвестного хоста - - Краска для производства светло-зеленой шерсти. + + Гость вышел - - Краска для производства серой шерсти. + + Сбросить настройки - - Краска для производства светло-серой шерсти. (Примечание: светло-серую краску также можно сделать, перемешав серую краску с костной мукой.) + + Вернуть настройки к значениям по умолчанию? - - Краска для производства голубой шерсти. + + Ошибка при загрузке - - Краска для производства бирюзовой шерсти. + + Игрок-гость вышел из игры, в результате чего все игроки-гости удалены из игры. - - Краска для производства лиловой шерсти. + + Не удалось создать игру - - Краска для производства пурпурной шерсти. + + Автовыбор - - Краска для производства синей шерсти. + + Стандартные скины - - Воспроизводит музыкальные диски. + + Войти - - Позволяют создавать очень прочные инструменты, доспехи и оружие. + + В эту игру невозможно играть, не войдя в систему. Войти? - - Дает более яркий свет, чем факелы. Может плавить снег и лед и использоваться под водой. + + Сетевая игра не разрешена - - Из нее можно делать книги и карты. + + Выпить - - Из них можно делать книжные полки; на них также можно накладывать чары, чтобы получить зачарованные книги. + + + Здесь находится ферма. Фермы позволяют создавать возобновляемый источник пищи и других предметов. + - - Позволяет создавать более мощные чары, если находится рядом с колдовским столом. + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о фермах.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы все уже знаете о фермах. + - - Украшение. + + Пшеницу, тыквы и дыни выращивают из семян. Чтобы добыть семена пшеницы, разбивайте блоки высокой травы или собирайте урожай пшеницы. Семена тыквы и дыни делаются из тыкв и дынь соответственно. - - Можно добыть железной или более прочной киркой, а затем расплавить в печи, чтобы получить золотые слитки. + + Нажмите{*CONTROLLER_ACTION_CRAFTING*}, чтобы открыть инвентарь в режиме "Творчество". - - Можно добыть каменной или более прочной киркой, а затем расплавить в печи, чтобы получить железные слитки. + + Чтобы продолжить, доберитесь до противоположной стороны этой дыры. - - Можно добыть киркой, чтобы получить уголь. + + Вы прошли курс обучения, посвященный режиму "Творчество". - - Можно добыть каменной или более прочной киркой, чтобы получить ляпис-лазурь. + + Прежде чем сажать семена, превратите блок земли в грядку, обработав его с помощью мотыги. Если рядом находятся источники воды и/или света, посевы будут расти быстрее. - - Можно добыть железной или более прочной киркой, чтобы получить алмазы. + + Кактусы нужно сажать на песке, и они вырастают на 3 блока в высоту. Срубив блок кактуса, вы обрушите все блоки, которые находятся над ним.{*ICON*}81{*/ICON*} - - Можно добыть железной или более прочной киркой, чтобы получить красную пыль. + + Грибы нужно сажать в местах со слабым освещением. Грибница разрастется на другие плохо освещенные блоки.{*ICON*}39{*/ICON*} - - Можно добыть киркой, чтобы получить булыжники. + + Костная мука заставляет урожай сразу же созреть, а грибы превращает в огромные грибы.{*ICON*}351:15{*/ICON*} - - Можно добыть с помощью лопаты и использовать в строительстве. + + Пшеница по мере роста проходит через несколько этапов. Когда она потемнеет, урожай можно собирать.{*ICON*}59:7{*/ICON*} - - Его можно посадить, и постепенно он превратится в дерево. + + Рядом с тыквой или дыней должен быть еще один блок, чтобы стеблю было куда расти. - - Это невозможно сломать. + + Сахарный тростник нужно сажать на блок травы, земли или песка, находящийся рядом с блоком воды. Срубив блок сахарного песка, вы обрушите все блоки, которые находятся над ним.{*ICON*}83{*/ICON*} - - Поджигает все, к чему прикасается. Лаву можно набрать в ведро. + + В режиме "Творчество" у вас бесконечное число всех доступных предметов и блоков, вы можете уничтожать блоки одним щелчком без помощи инструментов. Кроме того, вы неуязвимы и можете летать. - - Можно добыть лопатой и превратить в стекло, расплавив в печи. Если под ним нет другой плитки, на песок действует сила тяжести. + + + Здесь в сундуке лежат компоненты для схем и поршней. Попробуйте воспользоваться схемами, которые находятся поблизости, расширить их или сделать собственные. За границами зоны обучения есть и другие схемы. + - - Можно добыть лопатой. Иногда из него выпадает кремень. Если под гравием нет другой плитки, на него действует сила тяжести. + + + Здесь находится портал в преисподнюю! + - - Можно нарубить с помощью топора и превратить в доски или использовать в качестве топлива. + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о порталах и преисподней.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о порталах и преисподней. + - - Можно создать, расплавив в печи песок. Используется в строительстве, но оно разобьется, если вы попытаетесь его копать. + + + Красную пыль можно получить, добывая красную руду с помощью железной, алмазной или золотой кирки. С помощью пыли можно передавать энергию на расстояние до 15 блоков, и она может сдвигаться на 1 блок вверх или вниз. + {*ICON*}331{*/ICON*} + - - Можно добыть из камня с помощью кирки и использовать для создания печи или каменных инструментов. + + + Красные ретрансляторы можно использовать для передачи энергии на большие расстояния или для того, чтобы задержать прохождение сигнала по схеме. + {*ICON*}356{*/ICON*} + - - Получается путем обжига глины в печи. + + + Поршень, соединенный с источником энергии, выдвигается, толкая до 12 блоков. Липкий поршень, втягиваясь, может тянуть за собой один блок почти любого вида. + {*ICON*}33{*/ICON*} + - - Ее можно превратить в кирпичи, обжигая в печи. + + + Чтобы создать портал, необходимо построить обсидиановую раму - 4 блока в ширину и 5 в высоту. Угловые блоки не требуются. + - - Из разрушенного блока выпадают комки глины, которые в печи можно превратить в кирпичи. + + + Путешествия по преисподней - хороший способ быстро преодолеть расстояние в наземном мире: 1 блок в преисподней равен 3 в наземном мире. + - - Компактный контейнер для снежков. + + + Вы в режиме "Творчество". + - - Из него можно добыть снежки с помощью лопаты. + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о режиме "Творчество".{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о режиме "Творчество". + - - Из сломанного растения могут выпасть семена пшеницы. + + + Чтобы активировать портал в преисподнюю, подожгите обсидиановые блоки, находясь внутри портала, с помощью кремня и огнива. Порталы деактивируются только в том случае, если одна из стен разрушена, если рядом произошел взрыв или если через них протекла жидкость. + - - Используется для изготовления краски. + + + Чтобы воспользоваться порталом в преисподнюю, зайдите в него. Экран окрасится в лиловый цвет, и прозвучит определенный звук. Через несколько мгновений вы окажетесь в другом измерении. + + - - Их можно потушить в миске. + + + Преисподняя - опасное место, здесь много лавы, зато здесь можно добыть адский камень, который горит вечно, если его поджечь, а также сияющий камень - источник света. + - - Этот материал можно добыть только с помощью алмазной кирки. Он возникает в точке, где встречаются вода и стоячая лава. Из обсидиана можно делать порталы. + + Вы прошли курс обучения, посвященный посадкам. - - Выпускает в мир монстров. + + Для каждой задачи есть свои инструменты. Рубить деревья следует топором. - - Его можно положить на землю, и он будет проводить электрический заряд. Если использовать его в качестве ингредиента для зелья, эффект этого зелья будет длиться дольше. + + Для каждой задачи есть свои инструменты. Добывать камень и руду следует киркой. Для некоторых материалов необходимы более прочные кирки. - - Когда он созреет, его можно собрать и получить пшеницу. + + Некоторые инструменты предназначены для борьбы с врагами. Советуем использовать в бою меч. - - Земля, подготовленная к посеву семян. + + Железные големы также появляются сами по себе, чтобы защищать деревни. Они нападут на вас, если вы будете нападать на крестьян. - - Можно запечь в печи, чтобы получить зеленую краску. + + Вы не сможете покинуть эту зону, пока не завершите курс обучения. - - Из него можно сделать сахар. + + Для каждой задачи есть свои инструменты. Копать мягкие материалы, например землю и песок, следует лопатой. - - Можно носить в качестве шлема или вставить в нее факел, чтобы создать тыкву-фонарь. Также является главным ингредиентом для тыквенного пирога. + + Подсказка: зажмите{*CONTROLLER_ACTION_ACTION*}, чтобы добывать руду или рубить - руками или предметом, который вы держите в руках. Некоторые блоки можно добыть только с помощью определенных инструментов... - - Если поджечь, горит вечно. + + В сундуке на берегу реки лежит лодка. Чтобы использовать ее, наведите курсор на воду и нажмите{*CONTROLLER_ACTION_USE*}. Чтобы сесть в нее, используйте{*CONTROLLER_ACTION_USE*}, наведя курсор на лодку. - - Замедляет всех, кто по нему идет. + + В сундуке на берегу пруда лежит удочка. Достаньте ее и возьмите в руки, чтобы использовать ее. - - Встав на портал, можно перейти из верхнего мира в преисподнюю и обратно. + + Этот более сложный поршневой механизм создает саморемонтирующийся мост! Нажмите кнопку, чтобы включить его, и посмотрите, как взаимодействуют его части. - - Уголь служит топливом для печи, а также, из него можно сделать факел. + + Ваш инструмент поврежден. При каждом использовании инструмент получает повреждения и в конце концов ломается. Когда предмет находится в инвентаре, цветная полоска внизу отражает его состояние. - - Ее можно получить, убив паука. Из нее можно сделать лук. + + Зажмите{*CONTROLLER_ACTION_JUMP*}, чтобы плыть вверх. - - Его можно получить, убив курицу. Из него можно сделать стрелу. + + В этой зоне находится вагонетка на рельсах. Чтобы сесть в нее, наведите курсор на вагонетку и нажмите{*CONTROLLER_ACTION_USE*}. Чтобы привести ее в движение, используйте{*CONTROLLER_ACTION_USE*}. - - Его можно получить, убив крипера. Из него можно сделать тротил или использовать в качестве ингредиента для зелий. + + Железные големы состоят из 4 железных блоков, составленных так, как показано на рисунке. Наверху среднего блока должна стоять тыква. Железные големы атакуют ваших врагов. - - Их можно посадить на грядке, чтобы получить урожай. Убедитесь, что семенам хватает света! + + Кормите пшеницей коров, гриборов и овец. Морковку давайте свиньям. Кур кормите семенами пшеницы или адскими бородавками. Волков - любым видом мяса. И тогда они начнут искать другое животное своего вида, которое также находится в режиме любви. - - Ее можно добыть, собрав урожай. Из пшеницы делают пищу. + + Когда встречаются две особи одного вида, которые находятся в режиме любви, несколько секунд они будут целоваться, а потом появится детеныш. Некоторое время малыш будет следовать за родителями, а затем превратится во взрослую особь. - - Его можно добыть, копая гравий. Из кремня можно сделать кремень и огниво. + + Побывав в режиме любви, животное не сможет войти в него повторно около 5 минут. - - Можно накинуть на свинью, чтобы ездить на ней верхом. После этого свиньей можно управлять с помощью морковки на палке. + + + Здесь находится загон с животными. Разводите животных, чтобы получить детенышей их вида. + - - Чтобы добыть снежки, копайте снег. Снежки можно бросать. + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о животных и их разведении.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о животных и их разведении. + - - Ее можно получить, убив корову. Из нее можно сделать доспехи и книги. + + Чтобы животные размножались, они должны перейти в "Режим любви". Для этого их нужно кормить подходящими продуктами. - - Комки слизи можно добыть, убивая слизней. Слизь используется в качестве ингредиента для зелий, а также для создания липких поршней. + + Некоторые животные будут следовать за вами, если вы держите в руке их пищу. Так вам будет проще собрать их вместе для разведения.{*ICON*}296{*/ICON*} - - Яйца случайным образом выпадают из куриц. Из яиц можно делать пищу. + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о големах.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о големах. + - - Этот материал можно получить, добывая сияющий камень. Его можно снова превращать в блоки сияющего камня или добавлять в зелья, чтобы усилить их эффекты. + + Чтобы создать голема, необходимо поставить тыкву на штабель блоков. - - Кость можно добыть, убив скелета, и превратить в костную муку. Скормите кость волку, если хотите приручить его. + + Снежный голем состоит из двух блоков снега, поставленных один на другой, наверху которых стоит тыква. Снежные големы бросают снежки в ваших врагов. - - Появляется, когда скелет убивает крипера. Диски можно проигрывать в музыкальном автомате. + + +Диких волков можно приручить, давая им кости. Над прирученным волком появляются сердечки. Такой волк будет следовать за игроком и защищать его, если только ему не была дана команда сидеть. + - - Тушит огонь и помогает урожаю расти. Воду можно набрать в ведро. + + Вы прошли курс обучения, посвященный животным и их разведению. - - Из сломанного листа иногда выпадает росток, который можно посадить и вырастить дерево. + + + Здесь находятся тыквы и блоки, из которых можно сделать снежного и железного голема. + - - Используется как строительный материал и украшение. Можно найти в подземельях. + + + Эффект, который источник энергии оказывает на окружающие блоки, зависит от его положения и ориентации. Например, факел рядом с блоком, может погаснуть, если блок получает энергию из другого источника. + - - Используются, чтобы стричь шерсть с овец и добывать блоки листьев. + + + Если котел опустеет, долейте в него воды из ведра. + - - Под напряжением (используйте кнопку, рычаг, нажимную пластину, красный фонарь или красный камень вместе с любым из перечисленных предметов) выдвигается поршень, который может толкать блоки. + + + Создайте зелье устойчивости к огню, используя варочную стойку. Вам понадобится бутылка с водой, адская бородавка и сливки магмы. + - - Под напряжением выдвигается поршень, который может толкать блоки. Когда поршень движется назад, он тянет за собой блок, который к нему прикасается. + + + Чтобы использовать зелье, возьмите его в руку и зажмите{*CONTROLLER_ACTION_USE*}. Обычное зелье вы выпьете, и его эффект подействует на вас, а разрывное - бросите, и оно подействует на существ, которые окажутся в зоне поражения. + Чтобы превратить обычное зелье в разрывное, добавьте в него порох. + - - Делаются из каменных блоков. Обычно встречаются в крепостях. + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зельях и том, как их варить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже достаточно знаете о зельеварении. + - - Можно использовать в качестве преграды - как забор. + + + Чтобы сварить зелье, для начала получите бутылку с водой. Для этого возьмите из сундука стеклянную бутылку. + - - То же, что и дверь, но обычно используются в заборах. + + + Наполнить бутылку можно из котла, в котором есть вода, или из блока воды. Наполните бутылку, указав на источник воды и нажав{*CONTROLLER_ACTION_USE*}. + - - Можно сделать из кусков дыни. + + + Выпейте зелье устойчивости к огню. + - - Прозрачные блоки, которые можно использовать вместо стеклянных блоков. + + + Чтобы зачаровать предмет, прежде всего положите его в ячейку для зачаровывания. Зачарованные предметы приобретают особые свойства: например, увеличивается их уровень защиты или число предметов, получаемых при разработке блока. + - - Можно посадить, чтобы вырастить тыквы. + + + Если поместить предмет в ячейку, на кнопке справа появятся различные случайно выбранные чары. + - - Можно посадить, чтобы вырастить дыни. + + + Число на кнопке соответствует уровням опыта, которые нужно потратить. Если вашего уровня недостаточно, кнопка будет неактивной. + - - Выпадают из погибших заокраинников. Если бросить жемчужину, игрок телепортируется туда, где она упала, потеряв часть здоровья. + + + Вы приобрели устойчивость к воздействию огня и лавы. Теперь попробуйте пройти там, куда не могли пробраться раньше. + - - Блок земли, на котором растет трава. Его можно добыть с помощью лопаты и использовать при строительстве. + + + В этом окне вы сможете накладывать чары на оружие, доспехи и инструменты. + - - Можно использовать как строительный материал и украшение. + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше об окне зачаровывания.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знакомы с окном зачаровывания. + - - Замедляет всех, кто идет через нее. Ее можно разрезать ножницами и добыть нить. + + + Здесь находятся варочная стойка, котел и сундук с ингредиентами. + - - При уничтожении создает чешуйницу. Кроме того, может создать чешуйницу, если рядом напали на другую чешуйницу. + + + Древесный уголь - один из видов топлива. Кроме того, если насадить уголь на палку, получится факел. + - - Посаженная лоза начинает расти. Ее можно собрать ножницами. По лозе можно лазить, как по лестнице. + + + Поместив песок в ячейку ингредиента, вы сделаете стекло. Создайте несколько стеклянных блоков, чтобы сделать из них окна в вашем убежище. + - - По нему скользко ходить. Если находится на другом блоке, разрушившись, лед превращается в воду. Тает, если находится в преисподней или располагается близко к источнику света. + + + Это интерфейс создания зелий. Здесь можно создать зелья, обладающие различными эффектами. + - - Можно использовать в качестве украшения. + + + Многие деревянные предметы можно использовать в качестве топлива, но не все они горят одинаково долго. Кроме того, есть и другие предметы, которые можно жечь. + - - Используются для создания зелий и при поиске крепостей. Выпадают из сполохов, которые находятся рядом или внутри адских крепостей. + + + После обжига вы можете переместить предметы в инвентарь. Экспериментируйте с разными ингредиентами, чтобы узнать, что еще можно сделать. + - - Используются для создания зелий. Выпадают из убитых вурдалаков. + + + Возьмите в качестве ингредиента древесину, чтобы приготовить древесный уголь. Положите в печь топливо, а древесину - в ячейку ингредиента. На приготовление уйдет некоторое время, так что можете заняться другими делами, а потом вернуться к печи. + - - Используются для создания зелий. Выпадают из убитых зомби-свинолюдей, которых можно встретить в преисподней. + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать варочную стойку. + - - Используется для создания зелий. Такие растения обычно растут в адских крепостях, но их также можно посадить на песке души. + + + Ферментированный глаз паука оскверняет зелье и может изменить его эффект на противоположный, а порох превращает зелье в разрывное, которое можно бросить, чтобы оно подействовало на все объекты, находящиеся в определенной области. + - - Эффект зависит от того, на каком объекте используется зелье. + + + Создайте зелье устойчивости к огню, сначала положив в бутылку с водой адскую бородавку, а затем добавив сливки магмы. + - - Бутылку можно наполнить водой и использовать в качестве первого ингредиента зелья на варочной стойке. + + + Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания зелий. + - - Это ядовитая пища и ингредиент зелий. Выпадает из убитых пауков и пещерных пауков. + + + Чтобы сварить зелье, поместите в верхнюю ячейку ингредиент, а в нижние - зелья или бутылки с водой (одновременно можно создавать до 3 зелий). Если получилась допустимая комбинация, начнется процесс зельеварения, и через некоторое время зелье будет готово. + - - Используется при изготовлении зелий - в основном с вредоносным эффектом. + + + Для каждого зелья нужна бутылка с водой. Приготовление большинства зелий можно начать с создания "Неудобоваримого зелья" из адской бородавки, а затем добавить к нему еще хотя бы один ингредиент. + - - Используется при изготовлении зелий или, вместе с другими предметами, для создания "Глаза Края" или "Сливок магмы". + + + Сварив зелье, вы можете изменить его эффект. Добавив красную пыль, вы увеличите время действия зелья, а сияющая пыль сделает его более мощным. + - - Используется при изготовлении зелий. + + + Выберите чары и нажмите{*CONTROLLER_VK_A*}, чтобы зачаровать предмет. Ваш уровень опыта уменьшится на сумму, необходимую для зачаровывания. + - - Используется при изготовлении зелий и разрывных зелий. + + + Нажмите{*CONTROLLER_ACTION_USE*}, чтобы закинуть удочку и начать удить рыбу. Нажмите{*CONTROLLER_ACTION_USE*}, чтобы выбрать леску. + {*FishingRodIcon*} + - - В котел можно налить воду из ведра (или поставить его под дождь, и вода наберется сама), а затем наполнять из него бутылки. + + + Вы поймаете рыбу, вытащив леску после того, как поплавок погрузится в воду. Рыбу - сырую или жареную в печи - можно съесть, чтобы восстановить уровень здоровья. + {*FishIcon*} + - - Если бросить, укажет направление к порталу Края. Портал Края активируется, когда двенадцать таких глаз размещены на его рамках. + + + Удочка, как и многие другие инструменты, ломается после определенного числа применений, однако ее можно использовать не только на рыбалке. Экспериментируйте, и вы узнаете, что еще можно поймать или активировать с ее помощью... + {*FishingRodIcon*} + - - Используется при изготовлении зелий. + + + Лодка позволяет быстрее плыть по воде. Чтобы управлять ею, используйте{*CONTROLLER_ACTION_MOVE*} и{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + - - Похож на блоки травы, но на нем очень хорошо выращивать грибы. + + + Вы удите рыбу удочкой. Чтобы использовать удочку, нажмите{*CONTROLLER_ACTION_USE*}.{*FishingRodIcon*} + - - Плавает по воде, и по ней можно пройти. + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать, как ловить рыбу.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете ловить рыбу. + - - Используется для строительства адских крепостей. На них не действуют огненные шары вурдалаков. + + + Это кровать. Нажмите{*CONTROLLER_ACTION_USE*}, наведя на нее курсор, чтобы заснуть ночью и проснуться утром.{*ICON*}355{*/ICON*} + - - Используется в адских крепостях. + + + Здесь есть несколько простых схем с красным камнем и поршнями, а также сундук с предметами, которые позволят усложнить эти схемы. + - - Этот объект можно найти в адских крепостях. Если его разломать, из него выпадают адские бородавки. + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о схемах с красным камнем и поршнями.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете про схемы с красным камнем и поршнями. + - - Позволяет накладывать чары на мечи, кирки, топоры, лопаты, луки и доспехи в обмен на очки опыта. + + + Рычаги, кнопки, нажимные пластины и факелы из красного камня могут питать схемы энергией. Для этого либо прикрепите их к предмету или соедините источник энергии и предмет с помощью красной пыли. + - - Можно активировать с помощью 12 глаз Края, и тогда он позволит игроку перейти в мир Края. + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о кроватях.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о кроватях. + - - Используется для строительства портала Края. + + + Кровать должна стоять в защищенном, светлом месте, чтобы монстры не разбудили вас посреди ночи. Если у вас есть кровать, то возрождаться вы будете на ней. + {*ICON*}355{*/ICON*} + - - Блоки такого типа можно найти в мире Края. Они очень устойчивы к взрывам и являются отличным строительными материалом. + + + Если в вашей игре есть другие пользователи, то все должны лежать в кроватях одновременно, чтобы заснуть. + {*ICON*}355{*/ICON*} + - - Этот блок создается после победы над драконом на Краю. + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о лодках.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете про лодки. + - - Если бросить, из него вылетают сферы опыта. Собранные сферы увеличивают ваш опыт. + + + Колдовской стол позволяет снабдить предметы особыми свойствами. Например, увеличить число предметов, получаемых при разработке блока, или повысить сопротивляемость урону для оружия, доспехов или некоторых инструментов. + - - Отлично подходит для поджигания различных объектов. Вы можете поджигать все без разбора, если воспользуетесь раздатчиком. + + + Окружив колдовской стол книжными шкафами, вы повысите его силу и получите доступ к чарам высоких уровней. + - - Этот предмет похож на витрину. Предмет или блок, положенный в него, будет виден. + + + На зачаровывание уходят уровни опыта. Чтобы приобрести опыт, собирайте сферы опыта, выпадающие из убитых монстров и животных, добывайте руду, разводите животных, ловите рыбу и обрабатывайте предметы в печи. + - - При броске породит существо указанного типа. + + + Чары выбираются случайным образом, однако лучшие из них доступны только тем игрокам, у которых высокий уровень опыта и которые окружили свой колдовской стол большим количеством книжных шкафов. + - - Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. + + + Здесь находится колдовской стол и другие предметы, которые помогут вам узнать больше о зачаровывании. + - - Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зачаровывании.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как зачаровывать предметы. + - - Данный предмет можно получить, расплавив адский камень в печи. Из него можно сделать блоки адских кирпичей. + + + Кроме того, вы можете использовать бутыли зачаровывания: если их бросить, то на месте падения появятся сферы опыта, которые можно собрать. + - - Под напряжением излучают свет. + + + Вагонетки ездят по рельсам. Можно сделать вагонетку с печкой или вагонетку с сундуком. + {*RailIcon*} + - - С этого растения можно собирать какао-бобы. + + + Кроме того, вы можете создать рельсы с источником энергии, которые ускоряют вагонетку, черпая энергию из факелов и схем из красного камня. Их можно подключать к переключателям, рычагам и нажимным пластинам, таким образом строя сложные системы. + {*PoweredRailIcon*} + - - Можно использовать в качестве украшения или носить как маску, поместив в ячейку шлема. + + + Вы плывете на лодке. Чтобы выйти из нее, наведите на нее курсор и нажмите{*CONTROLLER_ACTION_USE*}. {*BoatIcon*} + - - Кальмар + + + Здесь в сундуках хранятся зачарованные предметы, бутыли зачаровывания и предметы, которые еще не зачарованы. Вы сможете поэкспериментировать с ними на колдовском столе. + - - Из убитого животного выпадают чернильные мешки. + + + Вы едете на вагонетке. Чтобы слезть с нее, наведите на нее курсор и нажмите{*CONTROLLER_ACTION_USE*}. {*MinecartIcon*} + - - Корова + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о вагонетках.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете про вагонетки. + - - Из убитой коровы выпадает кожа. Кроме того, корову можно доить, собирая молоко в ведро. + + Чтобы выбросить предмет, который вы держите в руке, переместите курсор за пределы экрана. - - Овца + + Прочитать - - С овцы можно состричь шерсть с помощью ножниц (если ее уже не остригли). Шерсть можно покрасить в разные цвета. + + Повесить - - Курица + + Бросить - - Из убитой курицы выпадают перья. Кроме того, курицы иногда несут яйца. + + Открыть - - Свинья + + Изменить высоту - - Из убитой свиньи выпадают отбивные. Если надеть на свинью седло, на ней можно ездить верхом. + + Взорвать - - Волк + + Посадить - - Смирные животные, но если на них напасть, они оказывают сопротивление. Можно приручить волка, дав ему кость; в этом случае он будет следовать за вами повсюду и нападать на всех, кто нападает на вас. + + Получить доступ к полной версии - - Крипер + + Удалить сохранение - - Если подойти слишком близко, взрывается! + + Удалить - - Скелет + + Вспахать - - Выпускает в вас стрелы. Если его убить, из него выпадают стрелы. + + Собрать урожай - - Паук + + Продолжить - - Если подойти близко, нападает. Может лазить по стенам. Из убитых пауков выпадают нити. + + Всплыть - - Зомби + + Ударить - - Если подойти близко, нападает. + + Подоить - - Зомби-свиночеловек + + Собрать - - Обычно смирные, но начнут атаковать группами, если напасть на одного из них. + + Вылить - - Вурдалак + + Оседлать - - Стреляет огненными шарами, которые взрываются при соприкосновении с целью. + + Положить - - Слизняк + + Съесть - - Получив урон, распадается на маленьких слизней. + + Ехать - - Заокраинник + + Плыть на лодке - - Нападет, если посмотреть на него. Умеет передвигать блоки. + + Вырастить - - Чешуйница + + Поспать - - Если это существо атаковать, оно привлекает других чешуйниц, прячущихся неподалеку. Прячется в каменных блоках. + + Проснуться - - Пещерный паук + + Проиграть - - Укус этого паука ядовит. + + Настройки - - Гриборова + + Переместить доспех - - Если использовать на ней миску, дает тушеные грибы. Если ее остричь, сбрасывает грибы и превращается в обычную корову. + + Переместить оружие - - Снежный голем + + Взять/надеть - - Снежного голема можно сделать из снежных блоков и тыквы. Големы бросают снежки во врагов своего создателя. + + Переместить ингредиент - - Дракон Края + + Переместить топливо - - Большой черный дракон, которого можно встретить в мире Края. + + Переместить инструмент - - Сполох + + Натянуть тетиву - - Этих врагов можно встретить в преисподней, особенно в адских крепостях. Если их убить, из них выпадают огненные жезлы. + + Предыдущая страница - - Куб магмы + + Следующая страница - - Этих врагов можно встретить в преисподней. Как и слизни, убитые распадаются на несколько меньших существ. + + Режим любви - - Крестьянин + + Отпустить тетиву - - Оцелот + + Привилегии - - Оцелоты водятся в джунглях. Их можно приручить, накормив сырой рыбой. Однако оцелот сам должен подойти к вам, так как любые резкие движения его пугают. + + Заблокировать - - Железный голем + + Творчество - - Появляется в деревнях, чтобы их защищать. Его можно сделать из железных блоков и тыкв. + + Запретить уровень - - Аниматор взрывов + + Выбрать скин - - Художник по эскизам + + Поджечь - - Перемалывание чисел и статистика + + Пригласить друзей - - Координатор запугивания + + ОК - - Дизайн и программный код + + Подстричь - - Менеджер проекта/продюсер + + Навигация - - Остальной народ из офиса Mojang + + Переустановить - - Ведущий игровой программист Minecraft для ПК + + Опции - - Ниндзя-программист + + Выполнить команду - - Главный исполнительный директор + + Установить полную версию - - Белые воротнички + + Установить пробную версию - - Техподдержка + + Установить - - Офисный диджей + + Выбросить - - Дизайнер/программист Minecraft для КПК + + Обновить список сетевых игр - - Разработчик + + Игры-вечеринки - - Главный архитектор + + Все игры - - Разработчик графики + + Выход - - Разработчик игры + + Отмена - - Директор по веселью + + Не присоединяться - - Музыка и звуки + + Изменить группу - - Программирование + + Создание предметов - - Рисунки + + Создать - - Контроль качества + + Взять/положить - - Исполнительный продюсер + + Открыть инвентарь - - Ведущий продюсер + + Показать описание - - Продюсер + + Показать ингредиенты - - Руководство тестированием + + Назад - - Ведущий тестер + + Напоминание: - - Команда дизайнеров + + - - Команда разработчиков + + В последней версии игры появились новые возможности, в том числе новые зоны в мире обучения. - - Управление релизами + + Для создания этого предмета у вас не хватает ингредиентов. Все необходимые ингредиенты перечислены в окне слева. - - Директор, отдел издания XBLA + + + Поздравляем, вы прошли обучение. Теперь время в игре идет с обычной скоростью, так что скоро настанет ночь! Достройте убежище, пока не пришли монстры! + - - Развитие бизнеса + + {*EXIT_PICTURE*} Если вы готовы исследовать мир дальше, в этой зоне рядом с убежищем шахтера есть лестница, которая ведет к небольшому замку. + - - Директор по портфолио + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы пройти обучение, как обычно.{*B*} + Нажмите{*CONTROLLER_VK_B*}, чтобы пропустить основной курс обучения. - - Менеджер продукта + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о шкале пищи и употреблении продуктов.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете все о шкале пищи и употреблении продуктов. + - - Маркетинг + + Выбрать - - Менеджер по связям с сообществом + + Использовать - - Команда локализаторов (Европа) + + В этой зоне вы сможете узнать о том, как ловить рыбу, плавать на лодках, использовать поршни и красный камень. - - Команда локализаторов (Редмонд) + + За пределами этой зоны вы познакомитесь со зданиями, научитесь основам сельского хозяйства, узнаете, как ездить на вагонетках, зачаровывать предметы, варить зелья, торговать, ковать предметы и многое другое! - - Команда локализаторов (Азия) + + + Шкала пищи находится на таком уровне, что вы уже не сможете улучшить здоровье. + - - Исследовательская команда + + Взять - - Команды MGS Central + + Вперед - - Тестер ключевых версий + + Назад - - Особая благодарность + + Исключить игрока - - Менеджер тестирования + + Предложить дружбу - - Старший ведущий сотрудник по тестированию + + Следующая страница - - SDET + + Предыдущая страница - - STE проекта + + Покрасить - - Дополнительный STE проекта + + Вылечить - - Помощники тестеров + + Сидеть - - Jon Kågström + + Следуй за мной - - Tobias Möllstam + + Добыть - - Risë Lugo + + Кормить - - Деревянный меч + + Приручить - - Каменный меч + + Изменить фильтр - - Железный меч + + Положить все - - Алмазный меч + + Положить 1 - - Золотой меч + + Выбросить - - Деревянная лопата + + Взять все - - Каменная лопата + + Взять половину - - Железная лопата + + Положить - - Алмазная лопата + + Выбросить все - - Золотая лопата + + Очистить ячейку быстрого выбора - - Деревянная кирка + + Что это? - - Каменная кирка + + Поделиться в Facebook - - Железная кирка + + Выбросить 1 - - Алмазная кирка + + Поменять - - Золотая кирка + + Быстрое перемещение - - Деревянный топор + + Наборы скинов - - Каменный топор + + Красная окрашенная стеклянная панель - - Железный топор + + Зеленая окрашенная стеклянная панель - - Алмазный топор + + Коричневая окрашенная стеклянная панель - - Золотой топор + + Белое окрашенное стекло - - Деревянная мотыга + + Окрашенная стеклянная панель - - Каменная мотыга + + Черная окрашенная стеклянная панель - - Железная мотыга + + Синяя окрашенная стеклянная панель - - Алмазная мотыга + + Серая окрашенная стеклянная панель - - Золотая мотыга + + Розовая окрашенная стеклянная панель - - Деревянная дверь + + Светло-зеленая окрашенная стеклянная панель - - Железная дверь + + Фиолетовая окрашенная стеклянная панель - - Кольчужный шлем + + Бирюзовая окрашенная стеклянная панель - - Кольчужный нагрудник + + Светло-серая окрашенная стеклянная панель - - Кольчужные поножи + + Оранжевое окрашенное стекло - - Кольчужные сапоги + + Синее окрашенное стекло - - Кожаная шапка + + Фиолетовое окрашенное стекло - - Железный шлем + + Бирюзовое окрашенное стекло - - Алмазный шлем + + Красное окрашенное стекло - - Золотой шлем + + Зеленое окрашенное стекло - - Кожаная куртка + + Коричневое окрашенное стекло - - Железный нагрудник + + Светло-серое окрашенное стекло - - Алмазный нагрудник + + Желтое окрашенное стекло - - Золотой нагрудник + + Голубое окрашенное стекло - - Кожаные штаны + + Пурпурное окрашенное стекло - - Железные поножи + + Серое окрашенное стекло - - Алмазные поножи + + Розовое окрашенное стекло - - Золотые поножи + + Светло-зеленое окрашенное стекло - - Кожаные сапоги + + Желтая окрашенная стеклянная панель - - Железные сапоги + + Светло-серый - - Алмазные сапоги + + Серый - - Золотые сапоги + + Розовый - - Железный слиток + + Синий - - Золотой слиток + + Фиолетовый - - Ведро + + Бирюзовый - - Ведро с водой + + Светло-зеленый - - Ведро с лавой + + Оранжевый - - Кремень и огниво + + Белый - - Яблоко + + Свой - - Лук + + Желтый - - Стрела + + Светло-синий - - Уголь + + Пурпурный - - Древесный уголь + + Коричневый - - Алмаз + + Белая окрашенная стеклянная панель - - Палка + + Маленький шар - - Миска + + Большой шар - - Тушеные грибы + + Голубая окрашенная стеклянная панель - - Нить + + Пурпурная окрашенная стеклянная панель - - Перо + + Оранжевая окрашенная стеклянная панель - - Порох + + Звезда - - Зерна пшеницы + + Черный - - Пшеница + + Красный - - Хлеб + + Зеленый - - Кремень + + Крипер - - Сырая свиная отбивная + + Взрыв - - Готовая свиная отбивная + + Непонятная форма - - Картина + + Черное окрашенное стекло - - Золотое яблоко + + Железная броня для лошади - - Табличка + + Золотая броня для лошади - - Вагонетка + + Алмазная броня для лошади - - Седло + + Компаратор - - Красный камень + + Вагонетка с тротилом - - Снежок + + Вагонетка с воронкой - - Лодка + + Вести - - Кожа + + Маяк - - Ведро с молоком + + Сундук с ловушкой - - Кирпич + + Утяжеленная нажимная пластина (легкая) - - Глина + + Бирка - - Сахарный тростник + + Доски (любого типа) - - Бумага + + Командный блок - - Книга + + Звездочка - - Комок слизи + + Этих животных можно приручить. Кроме того, можно ездить на них верхом и прикрепить к ним сундук. - - Вагонетка с сундуком + + Мул - - Вагонетка с печкой + + Рождается при скрещивании лошади и осла. Можно приручить, ездить верхом и прикрепить сундук. - - Яйцо + + Лошадь - - Компас + + Этих животных можно приручить. На них также можно ездить верхом. - - Удочка + + Осел - - Часы + + Лошадь-зомби - - Сияющая пыль + + Пустая карта - - Сырая рыба + + Звезда Нижнего мира - - Готовая рыба + + Ракета - - Сухая краска + + Лошадь-скелет - - Чернильный мешок + + Иссушение - - Краска "Красная роза" + + Создается из черепа осушителя и песка души. Кидает в вас взрывающиеся черепа. - - Кактусовый зеленый + + Утяжеленная нажимная пластина (тяжелая) - - Какао-бобы + + Светло-серая окрашенная глина - - Ляпис-лазурь + + Серая окрашенная глина - - Лиловая краска + + Розовая окрашенная глина - - Бирюзовая краска + + Синяя окрашенная глина - - Светло-серая краска + + Лиловая окрашенная глина - - Серая краска + + Бирюзовая окрашенная глина - - Розовая краска + + Светло-зеленая окрашенная глина - - Светло-зеленая краска + + Оранжевая окрашенная глина - - Одуванчиковый желтый + + Белая окрашенная глина - - Голубая краска + + Окрашенное стекло - - Пурпурная краска + + Желтая окрашенная глина - - Оранжевая краска + + Светло-синяя окрашенная глина - - Костная мука + + Пурпурная окрашенная глина - - Кость + + Коричневая окрашенная глина - - Сахар + + Загрузочная воронка - - Торт + + Активирующие рельсы - - Кровать + + Выбрасыватель - - Красный ретранслятор + + Компаратор - - Печенье + + Датчик дневного света - - Карта + + Блок красного камня - - Музыкальный диск "13" + + Окрашенная глина - - Музыкальный диск "Кошка" + + Черная окрашенная глина - - Музыкальный диск "Блоки" + + Красная окрашенная глина - - Музыкальный диск "Щебет" + + Зеленая окрашенная глина - - Музыкальный диск "Даль" + + Сноп сена - - Музыкальный диск "Молл" + + Обожженная глина - - Музыкальный диск "Меллохи" + + Блок угля - - Музыкальный диск "Шталь" + + Угасание: - - Музыкальный диск "Штрад" + + При отключении не дает монстрам и животным изменять блоки (например, взрыв крипера не уничтожит блоки, а овцы не съедят траву) и поднимать предметы. - - Музыкальный диск "Вард" + + Если включено, игроки будут сохранять свои пожитки после смерти. - - Музыкальный диск "11" + + При отключении монстры не будут возрождаться естественным образом. - - Музыкальный диск "Где мы сейчас" + + Режим игры: Приключение - - Ножницы + + Приключение - - Семена тыквы + + Введите число-семя для воссоздания мира. Оставьте поле пустым, если хотите создать случайный мир. - - Семена дыни + + Если отключено, из монстров и животных не будет ничего выпадать после смерти (например, из криперов не будет выпадать порох). - - Сырая курятина + + {*PLAYER*} падает с лестницы - - Готовая курятина + + {*PLAYER*} падает с каких-то ветвей - - Сырая говядина + + {*PLAYER*} выпадает из воды - - Бифштекс + + Если отключено, из блоков не будут выпадать предметы (например, из каменных блоков не будет выпадать булыжник). - - Гнилое мясо + + Если отключено, у игрока не будет восстанавливаться здоровье естественным образом. - - Жемчужина Края + + Если отключено, время суток не будет меняться. - - Кусок дыни + + Вагонетка - - Огненный жезл + + Поводок - - Слеза вурдалака + + Отпустить - - Золотой самородок + + Прикрепить - - Адская бородавка + + Слезть - - {*splash*}{*prefix*}зелье {*postfix*} + + Прикрепить сундук - - Стеклянная бутылка + + Запустить - - Бутылка с водой + + Имя - - Глаз паука + + Маяк - - Ферментир. глаз паука + + Основной эффект - - Огненный порошок + + Побочный эффект - - Сливки магмы + + Лошадь - - Варочная стойка + + Выбрасыватель - - Котел + + Загрузочная воронка - - Глаз Края + + {*PLAYER*} падает откуда-то сверху - - Искрящаяся дыня + + Невозможно использовать яйцо возрождения, т.к. в мире уже находится максимальное количество летучих мышей. - - Бутыль колдовства + + Животные не могут перейти в режим любви. Достигнуто максимальное количество разводимых лошадей. - - Огненный заряд + + Настройки - - Огн. заряд (др. уголь) + + {*PLAYER*} попадает по огненный шар, который выпустил {*SOURCE*} с помощью {*ITEM*} - - Огн. заряд (уголь) + + {*PLAYER*} был избит {*SOURCE*}, который пользовался предметом {*ITEM*} - - Рамка + + {*PLAYER*} был убит {*SOURCE*}, который пользовался предметом {*ITEM*} - - Возродить существо: {*CREATURE*} + + Повреждение мира - - Адский кирпич + + Предметы из блоков - - Череп + + Естественное восстановление - - Череп скелета + + Цикл дня и ночи - - Череп иссушенного скелета + + Сохранять инвентарь - - Голова зомби + + Возрождение монстров - - Голова + + Добыча из монстров - - Голова игрока %s + + {*PLAYER*} был подстрелен {*SOURCE*} с помощью {*ITEM*} - - Голова крипера + + {*PLAYER*} падает слишком далеко, и его добивает {*SOURCE*} - - Камень + + {*PLAYER*} падает слишком далеко, и его добивает {*SOURCE*} предметом {*ITEM*} - - Трава + + {*PLAYER*} оказывается в огне, сражаясь с {*SOURCE*} - - Земля + + {*PLAYER*} был обречен на падение благодаря {*SOURCE*} - - Булыжник + + {*PLAYER*} был обречен на падение благодаря {*SOURCE*} - - Дубовые доски + + {*PLAYER*} был обречен на падение благодаря {*SOURCE*} и предмету {*ITEM*} - - Еловые доски + + {*PLAYER*} поджаривается до корочки, сражаясь с {*SOURCE*} - - Березовые доски + + {*PLAYER*} был взорван {*SOURCE*} - - Доски (дер. джунглей) + + {*PLAYER*} угасает - - Саженец + + {*PLAYER*} был сражен {*SOURCE*} с помощью предмета {*ITEM*} - - Саженец дуба + + {*PLAYER*} пытается поплавать в лаве, убегая от {*SOURCE*} - - Саженец ели + + {*PLAYER*} тонет, пытаясь сбежать от {*SOURCE*} - - Саженец березы + + {*PLAYER*} врезается в кактус, пытаясь сбежать от {*SOURCE*} - - Саженец дерева джунглей + + Оседлать - - Коренная порода + + +Чтобы управлять лошадью, на нее нужно сначала надеть седло. +Его можно купить у крестьян, выловить при рыбалке или найти в спрятанных сундуках. + - - Вода + + +На прирученных ослов и мулов можно повесить седельные сумки, прикрепив сундук. Чтобы открыть седельную сумку, оседлайте животное или подкрадитесь к нему. + - - Лава + + +Лошадей и ослов (но не мулов) можно разводить, используя золотые яблоки и золотые морковки. Жеребята со временем вырастают во взрослых лошадей. Этот процесс можно ускорить, подкармливая их пшеницей или сеном. + - - Песок + + +Лошадей, ослов и мулов нужно сначала приручить. Чтобы приручить лошадь, оседлайте ее и не дайте ей себя сбросить. + - - Песчаник + + +Когда лошадь будет приручена, вокруг нее появятся сердца. Она больше не будет пытаться сбросить седока. + - - Гравий + + +Попробуйте прокатиться на этой лошади. Используйте {*CONTROLLER_ACTION_USE*}, чтобы оседлать ее. Ваши руки при этом должны быть пусты. + - - Золотоносная руда + + +Можете попробовать приручить этих лошадей и ослов. В сундуках неподалеку лежат седла, броня для лошадей и другие полезные предметы. + - - Железная руда + + +Маяк на пирамиде минимум из 4 слоев дает либо побочный эффект восстановления, либо усиленный основной эффект. + - - Угольная руда + + +Чтобы активировать силу маяка, вы должны пожертвовать изумруд, алмаз, золотой или железный слиток. Положите его в соответствующую ячейку. После этого маяк будет действовать неограниченно долго. + - - Древесина - + + Наверху этой пирамиды стоит неактивный маяк. - - Дубовое полено + + +Это экран маяка. С его помощью вы можете управлять эффектами, которые накладывает маяк. + - - Еловое полено + + +{*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить. +{*B*}Нажмите{*CONTROLLER_VK_B*}, если уже знаете, как пользоваться экраном маяка. + - - Березовое полено + + +В меню маяка вы можете выбрать 1 основной эффект. Чем выше ваша пирамида, тем больше список доступных эффектов. + - - Полено из дерева джунглей + + Взрослых лошадей, ослов и мулов можно оседлать и ехать на них верхом. Однако, только лошади могут иметь броню, и только на мулов и ослов можно повесить седельные сумки для транспортировки предметов. - - Дуб + + Это экран инвентаря лошади. - - Ель + + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить. + {*B*}Нажмите{*CONTROLLER_VK_B*}, если уже знаете, как пользоваться инвентарем лошади. + - - Береза + + Инвентарь лошади позволяет вам переносить и надевать предметы на лошадь, осла или мула. - - Листья + + Мерцание - - Дубовые листья + + След - - Еловые иголки + + Длительность полета: - - Березовые листья + + +Наденьте на лошадь седло, разместив его в ячейке для седла. Кроме того, вы можете надеть на лошадь броню, воспользовавшись соответствующей ячейкой. + - - Листья дерева джунглей + + Вы нашли мула. - - Губка + + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы узнать все о лошадях, ослах и мулах. + {*B*}Нажмите{*CONTROLLER_VK_B*}, если уже знаете, как обращаться с лошадями, ослами и мулами. + - - Стекло + + Лошадей и ослов можно найти на равнинах. Мулы получаются путем скрещивания ослов и лошадей. Сами мулы не могут размножаться. - - Шерсть + + В этом меню вы можете перекладывать предметы из собственного инвентаря в седельные сумки ослов и мулов. - - Черная шерсть + + Вы нашли лошадь. - - Красная шерсть + + Вы нашли осла. - - Зеленая шерсть + + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы узнать подробности о маяках. + {*B*}Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете пользоваться маяками. + - - Коричневая шерсть + + +Чтобы создать звездочку, разложите в сетке порох и соответствующий краситель. + - - Синяя шерсть + + +Краситель определяет цвет взрыва звездочки. + - - Лиловая шерсть + + +Форма звездочки задается путем добавления огненного заряда, золотого самородка, пера или головы. + - - Бирюзовая шерсть + + +Вы также можете положить несколько звездочек, чтобы добавить их в фейерверк. + - - Светло-серая шерсть + + +Чем больше ячеек сетки заполнено порохом, тем выше взлетит фейерверк, прежде чем взорвутся звездочки. + - - Серая шерсть + + +После этого вы можете забрать готовый фейерверк. + - - Розовая шерсть + + +След или мерцание можно добавить при помощи алмаза или сияющей пыли. + - - Светло-зеленая шерсть + + +Фейерверки - это декоративные предметы. Их можно запускать, держа в руках или пользуясь раздатчиками. Они создаются из бумаги и пороха; можно также добавить одну или несколько звездочек. + - - Желтая шерсть + + +Цвет и изменение цветов, форма, размер и эффекты (такие как след и мерцание) звездочек можно настраивать, добавляя при создании дополнительные ингредиенты. + - - Голубая шерсть + + +Попробуйте создать фейерверк на верстаке, пользуясь разнообразными ингредиентами из сундуков. + - - Пурпурная шерсть + + +Создав звездочку, вы можете добавить ей второй цвет с помощью красителя. + - - Оранжевая шерсть + + +В этих сундуках лежат разные предметы, которые нужны для создания ФЕЙЕРВЕРКОВ! + - - Белая шерсть + + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы узнать подробности о фейерверках. + {*B*}Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете пользоваться фейерверками. + - - Цветок + + +Чтобы создать фейерверк, разложите порох и бумагу в сетке 3x3 над вашим инвентарем. + - - Роза + + В этой комнате есть воронки - - Гриб + + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы узнать подробности о воронках. + {*B*}Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете пользоваться воронками. + - - Золотой блок + + +Воронки нужны для того, чтобы класть предметы в контейнеры и доставать их оттуда. Кроме того, они могут автоматически ловить брошенные в них предметы. + - - Способ компактно хранить золото. + + +Активированные маяки испускают в небо луч света и накладывают полезные эффекты на ближайших игроков. Чтобы их создать, вам понадобится стекло, обсидиан и звезда Нижнего мира, которую можно получить за победу над Иссушителем. + - - Железный блок + + +Маяки нужно устанавливать таким образом, чтобы днем они оказывались на солнце. Кроме того, они должны стоять на пирамидах из железа, золота, изумруда или алмаза. Материал пирамиды не влияет на эффекты, накладываемые маяком. + - - Способ компактно хранить железо. + + +Попробуйте воспользоваться силой маяка. Вы можете пожертвовать для этого железные слитки. + - - Каменная плита + + +Они влияют на варочные стойки, сундуки, распределители, выбрасыватели, вагонетки с воронками и на другие воронки. + - - Каменная плита + + +В этой комнате приведены разные полезные схемы расстановки воронок. Поэкспериментируйте с ними. + - - Плита из песчаника + + +Это окно фейерверков. Тут вы можете создавать фейерверки и звездочки. + - - Дубовая плита + + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить. + {*B*}Нажмите{*CONTROLLER_VK_B*}, если уже знаете, как пользоваться экраном фейерверков. + - - Плита из булыжника + + +Воронки постоянно пытаются втащить в себя предметы из всех подходящих контейнеров, находящихся над ними. Они также пытаются разместить сохраненные предметы в выходной контейнер. + - - Плита из кирпича + + +Если воронка находится под напряжением, она деактивируется и перестает перемещать предметы. + - - Плита из каменных блоков + + +Воронка направлена в сторону перемещения предметов. Если вы хотите повернуть воронку в нужном вам направлении, ставьте ее напротив нужного блока в режиме подкрадывания. + - - Плита из дуба + + Эти враги живут на болотах. Они атакуют, кидаясь в вас зельями. После смерти из них выпадают зелья. - - Плита из ели + + Достигнуто максимальное число картин/рамок. - - Плита из березы + + Вы не можете создавать врагов в мирном режиме. - - Плита из дерева джунглей + + Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся свиней, овец, коров, кошек и лошадей. - - Плита из адского камня + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число кальмаров. - - Кирпичи + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число врагов. - - Тротил + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число крестьян. - - Книжная полка + + Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся волков. - - Замшелый камень + + Достигнуто максимальное число голов мобов. - - Обсидиан + + Инверт. обзор - - Факел + + Левша - - Факел (уголь) + + Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся кур. - - Факел (древ. уголь) + + Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся гриборов. - - Огонь + + Достигнуто максимальное число лодок. - - Источник монстров + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число кур. - - Дубовая лестница + + {*C2*}Сделай вдох. Еще один. Почувствуй воздух в легких. Ты снова можешь управлять своими конечностями. Да, подвигай пальцами. У тебя снова есть тело - оно в воздухе, на него действует сила тяжести. Возродись в долгом сне. Вот так. Твое тело снова касается вселенной, словно вы с ней разделены. Словно мы с тобой разделены.{*EF*}{*B*}{*B*} +{*C3*}Кто мы? Когда-то нас называли духами горы. Отец- Солнце, Мать-Луна. Духи предков, духи животных. Джинны. Призраки. Лесовики. Затем нас называли богами, демонами, ангелами. Полтергейстом. Чужими, инопланетянами, лептонами, кварками. Слова меняются. Мы неизменны.{*EF*}{*B*}{*B*} +{*C2*}Мы - вселенная. Мы все, что, по-твоему, находится вне тебя. Сейчас ты смотришь на нас - и кожей, и глазами. А зачем вселенная касается твоей кожи и светит на тебя? Чтобы увидеть тебя, игрок. Чтобы узнать тебя. И чтобы ты узнал ее. Я расскажу тебе историю.{*EF*}{*B*}{*B*} +{*C2*}Жил да был один игрок.{*EF*}{*B*}{*B*} +{*C3*}И этот игрок - ты, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Иногда ему казалось, что он человек, живущий на тонкой корочке вращающегося шарика из расплавленной лавы. Этот шар из расплавленной лавы летал вокруг шара из раскаленного газа, который был в триста пятьдесят тысяч раз тяжелее его. Они были так далеко друг от друга, что свету требовалось восемь минут на то, чтобы преодолеть это расстояние. Этот свет был информацией, которую посылала звезда, и она могла прожечь кожу с расстояния в сто пятьдесят миллионов километров.{*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*}И игрок стал новой историей, еще не рассказанной, которая была записана буквами ДНК. И игрок был новой программой, которую еще никогда не запускали - ее создал код, которому уже миллиард лет. И игрок стал новым человеком, который еще никогда не жил, он был сделан из молока и любви.{*EF*}{*B*}{*B*} +{*C3*}Этот игрок - ты. История. Программа. Человек. Сделанный из молока и любви.{*EF*}{*B*}{*B*} +{*C2*}Давай вернемся еще дальше назад.{*EF*}{*B*}{*B*} +{*C2*}Семь миллиардов миллиардов миллиардов атомов тела игрока были созданы задолго до этой игры в сердце звезды. Поэтому игрок - тоже информация звезды. И игрок движется по сюжету истории, которая представляет собой лес информации, который посадил человек по имени Джулиан на плоском, бесконечном мире, созданном человеком по имени Маркус, и этот мир находится внутри маленького, личного мира, созданного игроком, который живет во вселенной, созданной...{*EF*}{*B*}{*B*} +{*C3*}Тише. Иногда игрок создавал теплый, мягкий и простой мир. А иногда твердый, холодный и сложный. Иногда он создавал в своей голове модель вселенной - крупицы энергии, движущиеся в огромном пустом пространстве. Иногда он называл эти крупицы "электронами" и "протонами".{*EF*}{*B*}{*B*} + - - Сундук + + {*C2*}Иногда он называл их "планетами" и "звездами".{*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*} +{*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*} + - - Красная пыль + + Перегрузить преисподнюю - - Алмазная руда + + %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*} + - - Верстак + + Вернуть преисподнюю в этом сохранении к исходному состоянию? Вы потеряете все, что в ней построили! - - Урожай + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число свиней, овец, коров, кошек и лошадей. - - Грядка + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число гриборов. - - Печь + + Невозможно использовать яйцо возрождения. Достигнуто максимальное число волков. - - Табличка - - - Деревянная дверь + + Перегрузить преисподнюю - - Лестница + + Не перегружать преисподнюю - - Рельсы + + Сейчас нельзя подстричь эту гриборову. Достигнуто максимальное число свиней, овец, гриборов, кошек и лошадей. - - Рельсы под напряжением + + Вы умерли! - - Рельсы с детектором + + Настройки мира - - Каменная лестница + + Можно строить и добывать руду - - Рычаг + + Можно ис-ть двери и переключатели - - Нажимная плита + + Создавать структуры - - Железная дверь + + Суперплоский мир - - Красная руда + + Дополнительный сундук - - Красный факел + + Можно открывать контейнеры - - Кнопка + + Исключить игрока - - Снег + + Можно летать - - Лед + + Отключить утомление - - Кактус + + Можно атаковать игроков - - Глина + + Можно атаковать животных - - Сахарный тростник + + Модератор - - Музыкальный автомат + + Привилегии хоста - - Забор + + Обучение - - Тыква + + Управление - - Фонарь из тыквы + + Настройки - - Адский камень + + Возродиться! - - Песок души + + Загружаемый контент - предложения - - Сияющий камень + + Изменить скин - - Портал + + Авторы - - Лазуритовая руда + + Тротил взрывается - - Блок ляпис-лазури + + Дуэль - - Способ компактно хранить ляпис-лазурь. + + Доверять игрокам - - Раздатчик + + Переустановить контент - - Нотный блок + + Настройки поиска неисправностей - - Торт + + Огонь распространяется - - Кровать + + Дракон Края - - Паутина + + Игрок {*PLAYER*} убит дыханием дракона Края - - Высокая трава + + Игрока {*PLAYER*} убил {*SOURCE*} - - Засохший куст + + Игрока {*PLAYER*} убил {*SOURCE*} - - Диод + + Игрок {*PLAYER*} умер - - Запертый сундук + + Игрок {*PLAYER*} взорвался - - Люк + + Игрок {*PLAYER*} убит магией - - Шерсть (любого цвета) + + Игрока {*PLAYER*} застрелил {*SOURCE*} - - Поршень + + Скрыть коренную породу - - Липкий поршень + + Показать интерфейс - - Блок-чешуйница + + Показать руку - - Каменные кирпичи + + {*SOURCE*} убил {*PLAYER*} с помощью огненного шара - - Кирпичи из замшелых камней + + {*SOURCE*} убивает игрока {*PLAYER*} в рукопашной - - Кирпичи из растрескавшихся камней + + Игрока {*PLAYER*} убивает {*SOURCE*} с помощью магии - - Кирпичи из обработанных камней + + Игрок {*PLAYER*} выпал за пределы мира - - Гриб + + Наборы текстур - - Гриб + + Смешанные наборы - - Железная решетка + + Игрок {*PLAYER*} вспыхнул - - Стекло + + Темы - - Дыня + + Картинки игрока - - Стебель тыквы + + Предметы аватара - - Стебель дыни + + Игрок {*PLAYER*} сгорел - - Лоза + + Игрок {*PLAYER*} умер с голода - - Ворота забора + + Игрок {*PLAYER*} был заколот до смерти - - Кирпичная лестница + + Игрок {*PLAYER*} плохо приземлился - - Лестница (камен. кирпичи) + + Игрок {*PLAYER*} пытался плавать в лаве - - Камень-чешуйница + + Игрок {*PLAYER*} задохнулся в стене - - Булыжник-чешуйница + + Игрок {*PLAYER*} утонул - - Каменный кирпич-чешуйница + + Сообщения о гибели - - Мицелий + + Вы больше не модератор - - Кувшинка + + Теперь вы можете летать - - Адский кирпич + + Вы больше не можете летать - - Забор из адского кирпича + + Вы больше не можете нападать на животных - - Лестница (ад. кирпичи) + + Теперь вы можете нападать на животных - - Адская бородавка + + Теперь вы модератор - - Колдовской стол + + Вы больше не устаете - - Варочная стойка + + Вы неуязвимы - - Котел + + Вы утратили неуязвимость - - Портал Края + + %d MSP - - Рамка портала Края + + Теперь вы будете уставать - - Камень Края + + Вы невидимы - - Яйцо дракона + + Вы больше не невидимы - - Куст + + Теперь вы можете нападать на других игроков - - Папоротник + + Теперь вы можете добывать породу или использовать предметы - - Лестница из песчаника + + Вы больше не можете расставлять блоки - - Лестница из ели + + Теперь вы можете расставлять блоки - - Березовая лестница + + Анимация персонажа - - Лестница (дерево джунг.) + + Анимация скина - - Красная лампа + + Вы больше не можете добывать породу или использовать предметы - - Какао + + Теперь вы можете использовать двери и выключатели - - Череп + + Вы больше не можете нападать на мобов - - Выбранное управление + + Теперь вы можете нападать на монстров - - Раскладка + + Вы больше не можете нападать на других игроков - - Движение/ускорение + + Вы больше не можете использовать двери и выключатели - - Осмотр + + Теперь вы можете использовать контейнеры (например, сундуки) - - Пауза + + Вы больше не можете использовать контейнеры (например, сундуки) - - Прыжок + + Невидимость - - Прыжок/взлет + + Маяки + + + {*T3*}ОБУЧЕНИЕ: МАЯКИ{*ETW*}{*B*}{*B*} +Активированные маяки испускают в небо луч света и накладывают полезные эффекты на ближайших игроков.{*B*} +Чтобы их создать, вам понадобится стекло, обсидиан и звезда Нижнего мира, которую можно получить за победу над Иссушителем.{*B*}{*B*} +Маяки нужно устанавливать таким образом, чтобы днем они оказывались на солнце. Кроме того, они должны стоять на пирамидах из железа, золота, изумруда или алмаза.{*B*} +Материал пирамиды не влияет на эффекты, накладываемые маяком.{*B*}{*B*} +В меню маяка вы можете выбрать 1 основной эффект. Чем выше ваша пирамида, тем больше список доступных эффектов.{*B*} +Маяк на пирамиде минимум из 4 слоев дает либо побочный эффект восстановления, либо усиленный основной эффект.{*B*}{*B*} +Чтобы активировать силу маяка, вы должны пожертвовать изумруд, алмаз, золотой или железный слиток. Положите его в соответствующую ячейку.{*B*} +После этого маяк будет действовать неограниченно долго.{*B*} + - - Инвентарь + + Фейерверки + + + Языки + + + Лошади + + + {*T3*}ОБУЧЕНИЕ: ЛОШАДИ{*ETW*}{*B*}{*B*} +Лошадей и ослов можно найти в основном на равнинах. Мулы получаются путем скрещивания ослов и лошадей. Сами мулы не могут размножаться.{*B*} +Взрослых лошадей, ослов и мулов можно оседлать и ехать на них верхом. Однако только лошади могут иметь броню, и только на мулов и ослов можно повесить седельные сумки для транспортировки предметов.{*B*}{*B*} +Лошадей, ослов и мулов нужно сначала приручить. Чтобы приручить лошадь, оседлайте ее и не дайте ей себя сбросить.{*B*} +Как только вокруг лошади появятся сердечки, она станет ручной и больше не будет пытаться сбросить седока. Чтобы управлять лошадью, на нее нужно сначала надеть седло.{*B*}{*B*} +Седла можно купить у крестьян или найти в спрятанных сундуках.{*B*} +На прирученных ослов и мулов можно повесить седельные сумки, прикрепив сундук. Чтобы открыть седельную сумку, оседлайте животное или подкрадитесь к нему.{*B*}{*B*} +Лошадей и ослов (но не мулов) можно разводить, используя золотые яблоки и золотые морковки.{*B*} +Жеребята со временем вырастают во взрослых лошадей. Этот процесс можно ускорить, подкармливая их пшеницей или сеном.{*B*} + - - Выбор предмета + + {*T3*}ОБУЧЕНИЕ: ФЕЙЕРВЕРКИ{*ETW*}{*B*}{*B*} +Фейерверки - это декоративные предметы. Их можно запускать, держа в руках или пользуясь раздатчиками. Они создаются из бумаги и пороха; можно также добавить одну или несколько звездочек.{*B*} +Цвет и изменение цветов, форма, размер и эффекты (такие как след и мерцание) звездочек можно настраивать, добавляя при создании дополнительные ингредиенты.{*B*}{*B*} +Чтобы создать фейерверк, разложите порох и бумагу в сетке 3x3 над вашим инвентарем.{*B*} +Вы также можете положить несколько звездочек, чтобы добавить их в фейерверк.{*B*} +Чем больше ячеек сетки заполнено порохом, тем выше взлетит фейерверк, прежде чем взорвутся звездочки.{*B*}{*B*} +После этого вы можете забрать готовый фейерверк.{*B*}{*B*} +Чтобы создать звездочку, разложите в сетке порох и соответствующий краситель.{*B*} +- Краситель определяет цвет взрыва звездочки.{*B*} +- Форма звездочки задается путем добавления огненного заряда, золотого самородка, пера или головы.{*B*} +- След или мерцание можно добавить при помощи алмаза или сияющей пыли.{*B*}{*B*} +Создав звездочку, вы можете добавить ей второй цвет с помощью красителя. + + + {*T3*}ОБУЧЕНИЕ: ВЫБРАСЫВАТЕЛИ{*ETW*}{*B*}{*B*} +Находясь под напряжением, выбрасыватели выбрасывают на землю один из находящихся в них предметов. Выбор предмета производится случайным образом. Используйте {*CONTROLLER_ACTION_USE*}, чтобы открыть выбрасыватель и положить в него предметы из своего инвентаря.{*B*} +Если перед выбрасывателем стоит сундук или контейнер другого типа, выброшенный предмет попадет в него. Вы можете создавать длинные цепочки выбрасывателей, чтобы перемещать предметы на большие расстояния. Для этого вам нужно будет создать схему для попеременного включения и выключения выбрасывателей. + + + + При использовании становится картой той части мира, где вы находитесь. Заполняется по мере того, как вы исследуете мир. + + + Выпадает из иссушителей, используется для создания маяков. + + + Воронки + + + {*T3*}ОБУЧЕНИЕ: ВОРОНКИ{*ETW*}{*B*}{*B*} +Воронки нужны для того, чтобы класть предметы в контейнеры и доставать их оттуда. Кроме того, они могут автоматически ловить брошенные в них предметы.{*B*} +Они влияют на варочные стойки, сундуки, распределители, выбрасыватели, вагонетки с воронками и на другие воронки.{*B*}{*B*} +Воронки постоянно пытаются втащить в себя предметы из всех подходящих контейнеров, находящихся над ними. Они также пытаются разместить сохраненные предметы в выходной контейнер.{*B*} +Если воронка находится под напряжением, она деактивируется и перестает перемещать предметы.{*B*}{*B*} +Воронка направлена в сторону перемещения предметов. Если вы хотите повернуть воронку в нужном вам направлении, ставьте ее напротив нужного блока в режиме подкрадывания.{*B*} + - - Действие + + Выбрасыватели - - Применение + + НЕ ИСПОЛЬЗУЕТСЯ - - Создание предметов + + Мгновенное здоровье - - Выбросить + + Мгновенный урон - - Красться + + Мощные прыжки - - Красться/лететь вниз + + Усталость при добыче руды - - Изменить режим камеры + + Сила - - Игроки/пригласить + + Слабость - - Движение (в полете) + + Тошнота - - Раскладка 1 + + НЕ ИСПОЛЬЗУЕТСЯ - - Раскладка 2 + + НЕ ИСПОЛЬЗУЕТСЯ - - Раскладка 3 + + НЕ ИСПОЛЬЗУЕТСЯ - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Регенерация - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Сопротивление - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Поиск начального значения для генератора мира - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Создает цветные взрывы при активации. Цвет, эффект, форма и затухание определяются звездочкой, использованной для создания фейерверка. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Тип рельсов, которые могут включать или выключать вагонетки с воронками, а также активировать вагонетки с тротилом. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Может содержать и ронять предметы или выталкивать их в другие контейнеры при наличии красного заряда. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Разноцветные блоки. Получаются окрашиванием обожженной глины. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Производит красный заряд. Чем больше предметов лежит на плите, тем сильнее заряд. Ее необходимо нагружать сильнее, чем легкую пластину. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Используется как источник красной энергии. Из него можно обратно получить красный камень. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Используется для ловли предметов или переноса их в контейнер и наружу. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Можно скармливать лошадям, ослам и мулам. Восстанавливает до 10 сердец. Ускоряет рост жеребят. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Летучая мышь - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Эти летающие создания водятся в пещерах или других больших закрытых пространствах. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Ведьма - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Создается путем обжигания глины в печи. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Создается из стекла и краски. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Создается из окрашенного стекла - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Производит красный заряд. Чем больше предметов лежит на плите, тем сильнее заряд. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Этот блок испускает красный сигнал в зависимости от наличия или отсутствия освещения. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Специальный тип вагонетки, работающий подобно воронке. Собирает предметы, лежащие на рельсах или в контейнерах над ними. - - {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить. + + Специальная броня, которую можно надеть на лошадь. Увеличивает уровень доспехов на 5. - - {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы начать обучение.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы готовы играть самостоятельно. + + Задает цвет, эффект и форму фейерверка. - - Minecraft - игра, в которой можно построить из блоков все что угодно. -По ночам в мир выходят монстры, так что не забудьте заранее возвести убежище. + + Используется в красных сетях для поддержания, сравнения или вычитания силы сигнала. Также может измерять некоторые состояния блоков. - - Чтобы осмотреться, используйте{*CONTROLLER_ACTION_LOOK*}. + + Тип вагонетки, который действует как двигающийся блок тротила. - - Для перемещения используйте{*CONTROLLER_ACTION_MOVE*}. + + Специальная броня, которую можно надеть на лошадь. Увеличивает уровень доспехов на 7. - - Чтобы бежать, быстро дважды сместите вперед{*CONTROLLER_ACTION_MOVE*}. Пока вы удерживаете{*CONTROLLER_ACTION_MOVE*} смещенным вперед, персонаж будет бежать вперед, пока не закончится время бега или продовольствие. + + Используется для выполнения команд. - - Чтобы прыгнуть, нажмите{*CONTROLLER_ACTION_JUMP*}. + + Испускает в небо луч света, может накладывать эффекты статуса на ближайших игроков. - - Удерживайте{*CONTROLLER_ACTION_ACTION*}, чтобы добывать руду или рубить - руками или предметом, который вы держите в руках. Некоторые блоки можно добыть только с помощью определенных инструментов... + + В нем можно хранить блоки и предметы. Чтобы создать сундук вдвое большего объема, поставьте два сундука рядом. Сундук с ловушкой создает красный разряд при открытии. - - Удерживайте{*CONTROLLER_ACTION_ACTION*}, чтобы срубить 4 блока дерева (ствола).{*B*}Когда блок разломится на части, вы сможете подобрать висящий в воздухе предмет, встав рядом с ним. После этого предмет появится в инвентаре. + + Специальная броня, которую можно надеть на лошадь. Увеличивает уровень доспехов на 11. - - Нажмите{*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*} + + Название мира - - - Вы прошли первую часть обучения. - + + Число-затравка для создания мира - - - {*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*}, чтобы положить только один. - + + Подпись - - - Чтобы бросить предмет, выведите курсор с предметом за пределы экрана предметов. - + + Всплывающие описания - - - Если вам нужна дополнительная информация о предмете, наведите на него курсор и нажмите {*CONTROLLER_VK_BACK*}. - + + Вертикал. разделенный экран - - - Нажмите{*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*} и выберите нужную группу предметов. - + + Классические текстуры, значки и интерфейс Minecraft! - - - Если вам нужна дополнительная информация о предмете, наведите на него курсор и нажмите{*CONTROLLER_VK_BACK*} . - + + Показать все смешанные миры - - - Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть инвентарь в режиме "Творчество". - + + Подсказки - - - Это интерфейс создания предметов. Он позволяет объединять собранные предметы, создавая из них новые. - + + Переустановить предмет аватара 1 - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как изготавливать предметы. - + + Переустановить предмет аватара 2 - - {*B*} - Нажмите{*CONTROLLER_VK_X*}, чтобы открыть описание предмета. - + + Переустановить предмет аватара 3 - - {*B*} - Нажмите{*CONTROLLER_VK_X*}, чтобы показать ингредиенты, необходимые для изготовления данного предмета. - + + Переустановить тему + + + Переустановить картинку игрока 1 + + + Переустановить картинку игрока 2 + + + Настройки + + + Интерфейс + + + Вернуть исходные настройки + + + "Дрожащая" камера + + + Звук + + + Чувств. управления + + + Графика + + + Используются для создания зелий. Выпадают из убитых вурдалаков. + + + Используются для создания зелий. Выпадают из убитых зомби-свинолюдей, которых можно встретить в преисподней. + + + Используется для создания зелий. Такие растения обычно растут в адских крепостях, но их также можно посадить на песке души. + + + По нему скользко ходить. Если находится на другом блоке, разрушившись, лед превращается в воду. Тает, если находится в преисподней или располагается близко к источнику света. + + + Можно использовать в качестве украшения. + + + Используются для создания зелий и при поиске крепостей. Выпадают из сполохов, которые находятся рядом или внутри адских крепостей. + + + Эффект зависит от того, на каком объекте используется зелье. + + + Используется при изготовлении зелий или, вместе с другими предметами, для создания "Глаза Края" или "Сливок магмы". + + + Используется при изготовлении зелий. + + + Используется при изготовлении зелий и разрывных зелий. + + + Бутылку можно наполнить водой и использовать в качестве первого ингредиента зелья на варочной стойке. + + + Это ядовитая пища и ингредиент зелий. Выпадает из убитых пауков и пещерных пауков. + + + Используется при изготовлении зелий - в основном с вредоносным эффектом. + + + Посаженная лоза начинает расти. Ее можно собрать ножницами. По лозе можно лазить, как по лестнице. + + + То же, что и дверь, но обычно используются в заборах. + + + Можно сделать из кусков дыни. + + + Прозрачные блоки, которые можно использовать вместо стеклянных блоков. + + + Под напряжением выдвигается поршень, который может толкать блоки. Когда поршень движется назад, он тянет за собой блок, который к нему прикасается. + + + Делаются из каменных блоков. Обычно встречаются в крепостях. + + + Можно использовать в качестве преграды - как забор. + + + Можно посадить, чтобы вырастить тыквы. + + + Можно использовать как строительный материал и украшение. + + + Замедляет всех, кто идет через нее. Ее можно разрезать ножницами и добыть нить. + + + При уничтожении создает чешуйницу. Кроме того, может создать чешуйницу, если рядом напали на другую чешуйницу. + + + Можно посадить, чтобы вырастить дыни. + + + Выпадают из погибших заокраинников. Если бросить жемчужину, игрок телепортируется туда, где она упала, потеряв часть здоровья. + + + Блок земли, на котором растет трава. Его можно добыть с помощью лопаты и использовать при строительстве. + + + В котел можно налить воду из ведра (или поставить его под дождь, и вода наберется сама), а затем наполнять из него бутылки. + + + Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. + + + Данный предмет можно получить, расплавив адский камень в печи. Из него можно сделать блоки адских кирпичей. + + + Под напряжением излучают свет. + + + Этот предмет похож на витрину. Предмет или блок, положенный в него, будет виден. + + + При броске породит существо указанного типа. + + + Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. + + + С этого растения можно собирать какао-бобы. + + + Корова + + + Из убитой коровы выпадает кожа. Кроме того, корову можно доить, собирая молоко в ведро. + + + Овца + + + Можно использовать в качестве украшения или носить как маску, поместив в ячейку шлема. + + + Кальмар + + + Из убитого животного выпадают чернильные мешки. + + + Отлично подходит для поджигания различных объектов. Вы можете поджигать все без разбора, если воспользуетесь раздатчиком. + + + Плавает по воде, и по ней можно пройти. + + + Используется для строительства адских крепостей. На них не действуют огненные шары вурдалаков. + + + Используется в адских крепостях. + + + Если бросить, укажет направление к порталу Края. Портал Края активируется, когда двенадцать таких глаз размещены на его рамках. + + + Используется при изготовлении зелий. + + + Похож на блоки травы, но на нем очень хорошо выращивать грибы. + + + Этот объект можно найти в адских крепостях. Если его разломать, из него выпадают адские бородавки. + + + Блоки такого типа можно найти в мире Края. Они очень устойчивы к взрывам и являются отличным строительными материалом. + + + Этот блок создается после победы над драконом на Краю. + + + Если бросить, из него вылетают сферы опыта. Собранные сферы увеличивают ваш опыт. + + + Позволяет накладывать чары на мечи, кирки, топоры, лопаты, луки и доспехи в обмен на очки опыта. + + + Можно активировать с помощью 12 глаз Края, и тогда он позволит игроку перейти в мир Края. + + + Используется для строительства портала Края. + + + Под напряжением (используйте кнопку, рычаг, нажимную пластину, красный фонарь или красный камень вместе с любым из перечисленных предметов) выдвигается поршень, который может толкать блоки. + + + Получается путем обжига глины в печи. + + + Ее можно превратить в кирпичи, обжигая в печи. + + + Из разрушенного блока выпадают комки глины, которые в печи можно превратить в кирпичи. + + + Можно нарубить с помощью топора и превратить в доски или использовать в качестве топлива. + + + Можно создать, расплавив в печи песок. Используется в строительстве, но оно разобьется, если вы попытаетесь его копать. + + + Можно добыть из камня с помощью кирки и использовать для создания печи или каменных инструментов. + + + Компактный контейнер для снежков. + + + Их можно потушить в миске. + + + Этот материал можно добыть только с помощью алмазной кирки. Он возникает в точке, где встречаются вода и стоячая лава. Из обсидиана можно делать порталы. + + + Выпускает в мир монстров. + + + Из него можно добыть снежки с помощью лопаты. + + + Из сломанного растения могут выпасть семена пшеницы. + + + Используется для изготовления краски. + + + Можно добыть лопатой. Иногда из него выпадает кремень. Если под гравием нет другой плитки, на него действует сила тяжести. + + + Можно добыть киркой, чтобы получить уголь. + + + Можно добыть каменной или более прочной киркой, чтобы получить ляпис-лазурь. + + + Можно добыть железной или более прочной киркой, чтобы получить алмазы. + + + Украшение. + + + Можно добыть железной или более прочной киркой, а затем расплавить в печи, чтобы получить золотые слитки. + + + Можно добыть каменной или более прочной киркой, а затем расплавить в печи, чтобы получить железные слитки. + + + Можно добыть железной или более прочной киркой, чтобы получить красную пыль. + + + Это невозможно сломать. + + + Поджигает все, к чему прикасается. Лаву можно набрать в ведро. + + + Можно добыть лопатой и превратить в стекло, расплавив в печи. Если под ним нет другой плитки, на песок действует сила тяжести. + + + Можно добыть киркой, чтобы получить булыжники. + + + Можно добыть с помощью лопаты и использовать в строительстве. + + + Его можно посадить, и постепенно он превратится в дерево. + + + Его можно положить на землю, и он будет проводить электрический заряд. Если использовать его в качестве ингредиента для зелья, эффект этого зелья будет длиться дольше. + + + Ее можно получить, убив корову. Из нее можно сделать доспехи и книги. + + + Комки слизи можно добыть, убивая слизней. Слизь используется в качестве ингредиента для зелий, а также для создания липких поршней. + + + Яйца случайным образом выпадают из куриц. Из яиц можно делать пищу. + + + Его можно добыть, копая гравий. Из кремня можно сделать кремень и огниво. + + + Можно накинуть на свинью, чтобы ездить на ней верхом. После этого свиньей можно управлять с помощью морковки на палке. + + + Чтобы добыть снежки, копайте снег. Снежки можно бросать. + + + Этот материал можно получить, добывая сияющий камень. Его можно снова превращать в блоки сияющего камня или добавлять в зелья, чтобы усилить их эффекты. + + + Из сломанного листа иногда выпадает росток, который можно посадить и вырастить дерево. + + + Используется как строительный материал и украшение. Можно найти в подземельях. + + + Используются, чтобы стричь шерсть с овец и добывать блоки листьев. + + + Кость можно добыть, убив скелета, и превратить в костную муку. Скормите кость волку, если хотите приручить его. + + + Появляется, когда скелет убивает крипера. Диски можно проигрывать в музыкальном автомате. + + + Тушит огонь и помогает урожаю расти. Воду можно набрать в ведро. + + + Ее можно добыть, собрав урожай. Из пшеницы делают пищу. + + + Из него можно сделать сахар. + + + Можно носить в качестве шлема или вставить в нее факел, чтобы создать тыкву-фонарь. Также является главным ингредиентом для тыквенного пирога. + + + Если поджечь, горит вечно. + + + Когда он созреет, его можно собрать и получить пшеницу. + + + Земля, подготовленная к посеву семян. + + + Можно запечь в печи, чтобы получить зеленую краску. + + + Замедляет всех, кто по нему идет. + + + Его можно получить, убив курицу. Из него можно сделать стрелу. + + + Его можно получить, убив крипера. Из него можно сделать тротил или использовать в качестве ингредиента для зелий. + + + Их можно посадить на грядке, чтобы получить урожай. Убедитесь, что семенам хватает света! + + + Встав на портал, можно перейти из верхнего мира в преисподнюю и обратно. + + + Уголь служит топливом для печи, а также, из него можно сделать факел. + + + Ее можно получить, убив паука. Из нее можно сделать лук. + + + С овцы можно состричь шерсть с помощью ножниц (если ее уже не остригли). Шерсть можно покрасить в разные цвета. + + + Развитие бизнеса + + + Директор по портфолио + + + Менеджер продукта + + + Команда разработчиков + + + Управление релизами + + + Директор, отдел издания XBLA + + + Маркетинг + + + Команда локализаторов (Азия) + + + Исследовательская команда + + + Команды MGS Central + + + Менеджер по связям с сообществом + + + Команда локализаторов (Европа) + + + Команда локализаторов (Редмонд) + + + Команда дизайнеров + + + Директор по веселью + + + Музыка и звуки + + + Программирование + + + Главный архитектор + + + Разработчик графики + + + Разработчик игры + + + Рисунки + + + Продюсер + + + Руководство тестированием + + + Ведущий тестер + + + Контроль качества + + + Исполнительный продюсер + + + Ведущий продюсер + + + Тестер ключевых версий + + + Железная лопата + + + Алмазная лопата + + + Золотая лопата + + + Золотой меч + + + Деревянная лопата + + + Каменная лопата + + + Деревянная кирка + + + Золотая кирка + + + Деревянный топор + + + Каменный топор + + + Каменная кирка + + + Железная кирка + + + Алмазная кирка + + + Алмазный меч + + + SDET + + + STE проекта + + + Дополнительный STE проекта + + + Особая благодарность + + + Менеджер тестирования + + + Старший ведущий сотрудник по тестированию + + + Помощники тестеров + + + Деревянный меч + + + Каменный меч + + + Железный меч + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Разработчик + + + Стреляет огненными шарами, которые взрываются при соприкосновении с целью. + + + Слизняк + + + Получив урон, распадается на маленьких слизней. + + + Зомби-свиночеловек + + + Обычно смирные, но начнут атаковать группами, если напасть на одного из них. + + + Вурдалак + + + Заокраинник + + + Пещерный паук + + + Укус этого паука ядовит. + + + Гриборова + + + Нападет, если посмотреть на него. Умеет передвигать блоки. + + + Чешуйница + + + Если это существо атаковать, оно привлекает других чешуйниц, прячущихся неподалеку. Прячется в каменных блоках. + + + Если подойти близко, нападает. + + + Из убитой свиньи выпадают отбивные. Если надеть на свинью седло, на ней можно ездить верхом. + + + Волк + + + Смирные животные, но если на них напасть, они оказывают сопротивление. Можно приручить волка, дав ему кость; в этом случае он будет следовать за вами повсюду и нападать на всех, кто нападает на вас. + + + Курица + + + Из убитой курицы выпадают перья. Кроме того, курицы иногда несут яйца. + + + Свинья + + + Крипер + + + Паук + + + Если подойти близко, нападает. Может лазить по стенам. Из убитых пауков выпадают нити. + + + Зомби + + + Если подойти слишком близко, взрывается! + + + Скелет + + + Выпускает в вас стрелы. Если его убить, из него выпадают стрелы. + + + Если использовать на ней миску, дает тушеные грибы. Если ее остричь, сбрасывает грибы и превращается в обычную корову. + + + Дизайн и программный код + + + Менеджер проекта/продюсер + + + Остальной народ из офиса Mojang + + + Художник по эскизам + + + Перемалывание чисел и статистика + + + Координатор запугивания + + + Ведущий игровой программист Minecraft для ПК + + + Техподдержка + + + Офисный диджей + + + Дизайнер/программист Minecraft для КПК + + + Ниндзя-программист + + + Главный исполнительный директор + + + Белые воротнички + + + Аниматор взрывов + + + Большой черный дракон, которого можно встретить в мире Края. + + + Сполох + + + Этих врагов можно встретить в преисподней, особенно в адских крепостях. Если их убить, из них выпадают огненные жезлы. + + + Снежный голем + + + Снежного голема можно сделать из снежных блоков и тыквы. Големы бросают снежки во врагов своего создателя. + + + Дракон Края + + + Куб магмы + + + Оцелоты водятся в джунглях. Их можно приручить, накормив сырой рыбой. Однако оцелот сам должен подойти к вам, так как любые резкие движения его пугают. + + + Железный голем + + + Появляется в деревнях, чтобы их защищать. Его можно сделать из железных блоков и тыкв. + + + Этих врагов можно встретить в преисподней. Как и слизни, убитые распадаются на несколько меньших существ. + + + Крестьянин + + + Оцелот + + + Позволяет создавать более мощные чары, если находится рядом с колдовским столом. + + + {*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*}Слеза вурдалака{*ETW*}{*B*} +* {*T2*}Огненный порошок{*ETW*}{*B*} +* {*T2*}Сливки магмы{*ETW*}{*B*} +* {*T2*}Искрящаяся дыня{*ETW*}{*B*} +* {*T2*}Красная пыль{*ETW*}{*B*} +* {*T2*}Сияющая пыль{*ETW*}{*B*} +* {*T2*}Ферментированный глаз паука{*ETW*}{*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*} +Если у вас достаточно опыта, это число будет зеленым, в противнoм случае оно красное.{*B*}{*B*} +Чары, которые будут наложены на предмет, выбираются случайным образом в зависимости от указанной стоимости.{*B*}{*B*} +Если колдовской стол окружен книжными полками (максимум - 15), с промежутком в 1 блок между полками и столом, чары станут более мощными, а книга на столе будет излучать магические символы.{*B*}{*B*} +Все ингредиенты для зачаровывания можно найти в деревне, добыть или вырастить.{*B*}{*B*} +С помощью зачарованных книг можно накладывать чары на предметы (для этого вам понадобится наковальня). Таким образом вы можете сами контролировать свойства своих предметов.{*B*} + + + {*T3*}ОБУЧЕНИЕ: ЗАПРЕЩЕННЫЕ УРОВНИ{*ETW*}{*B*}{*B*} +Если вам кажется, что уровень содержит оскорбительные материалы, вы можете добавить его в список запрещенных уровней. +Для этого откройте меню паузы, затем нажмите {*CONTROLLER_VK_RB*}, чтобы выбрать соответствующую всплывающую подсказку. +Если затем вы попытаетесь попасть на этот уровень, на экране появится сообщение о том, что уровень находится в списке запрещенных. Затем у вас будет возможность удалить его из черного списка и продолжить игру или выйти. + + + {*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*}Тротил взрывается{*ETW*}{*B*} +Если выбрана данная функция, после детонации тротил будет взрываться. Этот параметр можно изменить по ходу игры.{*B*}{*B*} + +{*T2*}Привилегии хоста{*ETW*}{*B*} +Если эта функция включена, хост может включить или отключить в главном меню полеты, усталость и невидимость. {*DISABLES_ACHIEVEMENTS*}{*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*} +Если эта функция отключена, у игрока не будет восстанавливаться здоровье естественным образом.{*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*} +У хоста и у игроков, назначенных модераторами, есть доступ к меню "Настройки хоста". В нем можно включить или отключить распространение огня и детонацию тротила.{*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*} +{*KICK_PLAYER_DESCRIPTION*}{*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*} +Если хотите держать животных в одном месте, оградите пространство площадью менее 20х20 блоков и поместите туда животных. Тогда они точно никуда оттуда не денутся. + + + + {*T3*}ОБУЧЕНИЕ: РАЗВЕДЕНИЕ ЖИВОТНЫХ{*ETW*}{*B*}{*B*} +Животные в Minecraft могут спариваться и производить на свет крошечные копии самих себя!{*B*} +Чтобы животные размножались, их нужно кормить соответствующими продуктами, чтобы они перешли в "режим любви".{*B*} +Кормите пшеницей коров, гриборов и овец, свиней - морковкой, кур - семенами пшеницы или адскими бородавками, волков - любым видом мяса, и тогда они начнут искать другое животное того же вида, которое также находится в режиме любви.{*B*} +Если встретятся две особи одного вида, которые находятся в режиме любви, несколько секунд они будут целоваться, а потом появится детеныш. Некоторое время малыш будет следовать за родителями, а затем превратится во взрослую особь.{*B*} +Животное, побывавшее в режиме любви, не сможет войти в него повторно около 5 минут.{*B*} +Максимальное число животных в мире ограничено, поэтому, они не будут размножаться, если их слишком много. + + + {*T3*}ОБУЧЕНИЕ: ПОРТАЛ В ПРЕИСПОДНЮЮ{*ETW*}{*B*}{*B*} +Этот портал позволяет игроку путешествовать из верхнего мира в преисподнюю и обратно. Путешествия по преисподней - способ быстро перебраться из одной точки верхнего мира в другую: один блок преисподней соответствует 3 блокам в верхнем мире. Так что, построив портал +в преисподней и выйдя через него, вы окажетесь в три раза дальше от входа в верхнем мире.{*B*}{*B*} +Для строительства портала необходимо не менее 10 обсидиановых блоков. Портал должен быть 5 блоков в высоту, 4 блока в ширину и 1 блок в глубину. Как только портал построен, его нужно поджечь, чтобы активировать. Это можно сделать с помощью кремня и огнива или огненного заряда.{*B*}{*B*} +Примеры строительства порталов показаны на рисунке справа. + + + + {*T3*}ОБУЧЕНИЕ: СУНДУК{*ETW*}{*B*}{*B*} +Сделав сундук, вы сможете поставить его, а затем складывать в него предметы из инвентаря с помощью{*CONTROLLER_ACTION_USE*}.{*B*}{*B*} +Перемещайте предметы из инвентаря в сундук и обратно с помощью курсора.{*B*}{*B*} +Предметы останутся в сундуке, пока вы не поместите их обратно в инвентарь. + + + + А вы были на Minecon? + + + Никто в Mojang не видел лица junkboy. + + + А вы знаете, что у Minecraft есть вики? + + + Не смотрите на жуков в упор. + + + Криперы появились из-за ошибки в коде. + + + Это курица или утка? - - {*B*} - Нажмите{*CONTROLLER_VK_X*}, чтобы снова открыть инвентарь. - + + Новый офис Mojang ужасно крутой! - - - Пролистайте закладки с помощью{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*}, чтобы выбрать нужную группу предметов, а затем выберите в ней предмет, который хотите создать, с помощью{*CONTROLLER_MENU_NAVIGATE*}. - + + {*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*}, чтобы бросить его. - - - На экране создания предметов указаны все ингредиенты, необходимые для изготовления нового предмета. Нажмите{*CONTROLLER_VK_A*}, чтобы создать предмет и отправить его в инвентарь. - + + {*T3*}ОБУЧЕНИЕ: ИНТЕРФЕЙС{*ETW*}{*B*}{*B*} +На экране приведена информация о вашем состоянии - уровне здоровья, количестве кислорода, если вы под водой, голоде (чтобы с ним бороться, нужно есть), а также об уровне доспехов, если они на вас надеты.{*B*}Если ваше здоровье ухудшилось, но шкала пищи находится на отметке 9{*ICON_SHANK_01*} или больше, то здоровье улучшится автоматически. Ешьте, чтобы заполнить шкалу пищи.{*B*} +Здесь же находится шкала опыта. Число показывает ваш уровень опыта. Кроме того, на экране расположена шкала, показывающая, сколько очков осталось до получения нового уровня.{*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*}, чтобы положить только один.{*B*}{*B*} +Если вы навели курсор на доспех, то сможете быстро переместить его в нужную ячейку с помощью всплывающей подсказки.{*B*}{*B*} +Вы можете поменять цвет своего кожаного доспеха, покрасив его. Для этого удерживайте нужный краситель курсором, наведите его на ту часть доспеха, которую хотите покрасить, и нажмите{*CONTROLLER_VK_X*}. - - - В нижней части верстака показаны предметы в вашем инвентаре, а также дано описание выбранного предмета и перечислены ингредиенты, необходимые для его создания. - + + Выставка Minecon 2013 прошла в Орландо, штат Флорида, США! - - - Вы видите описание выбранного предмета. Оно даст некоторое представление о том, как можно использовать данный предмет. - + + .party() была отличной! - - - Вы видите список ингредиентов, необходимых для создания выбранного предмета. - + + Не стоит верить слухам - проще считать, что все они не соответствуют истине. - - Собранное вами дерево можно превратить в доски. Выберите значок досок и нажмите{*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*} - + + {*T3*}ОБУЧЕНИЕ: КРАЙ{*ETW*}{*B*}{*B*} +Край - еще одно измерение в игре, и попасть в него можно, активировав портал Края. Он находится в крепости, которая стоит глубоко под землей в верхнем мире.{*B*} +Чтобы активировать портал Края, поместите глаз Края в рамку любого портала Края, где еще нет такого глаза.{*B*} +После активации вы можете зайти в него и отправиться в мир Края.{*B*}{*B*} +Там вы встретите дракона Края - яростного и сильного врага, а также множество заокраинников. Подготовьтесь к битве как следует!{*B*}{*B*} +Вы узнаете, что дракон Края лечит себя с помощью восьми кристаллов, которые находятся на вершинах обсидиановых шипов, так что прежде всего нужно уничтожить именно их.{*B*} +Несколько кристаллов можно уничтожить, стреляя в них из лука, но последние защищены железными клетками, так что придется построить к ним дорогу.{*B*}{*B*} +Все это время дракон будет налетать на вас и плеваться шарами с кислотой!{*B*} +Если подойти к подиуму в центре шипов, дракон Края спустится, чтобы напасть на вас, и тогда вы сможете нанести ему огромный урон!{*B*} +Уклоняйтесь от его едкого дыхания и старайтесь бить по глазам. По возможности пригласите друзей, чтобы они помогли вам одержать победу в этой битве!{*B*}{*B*} +Как только вы окажетесь в мире Края, ваши друзья увидят портал Края на своих картах и смогут к вам присоединиться. - - - Поставьте созданную печь. Имеет смысл расположить ее внутри убежища.{*B*} - Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания предметов. - + + {*ETB*}С возвращением! Возможно, вы не заметили, но игра Minecraft только что обновилась.{*B*}{*B*} +В игре появилось множество новых возможностей, и сейчас мы упомянем лишь некоторые из них. Прочитайте этот текст, а затем - приступайте к игре!{*B*}{*B*} +{*T1*}Новые предметы{*ETB*}: обожженная глина, окрашенная глина, блок угля, сноп сена, активирующие рельсы, блок красного камня, датчик дневного света, выбрасыватель, воронка, вагонетка с воронкой, вагонетка с тротилом, компаратор, утяжеленная нажимная пластина, маяк, сундук с ловушкой, ракета, звездочка, звезда нижнего мира, поводок, броня для лошади, бирка, яйцо возрождения лошади.{*B*}{*B*} +{*T1*}Новые мобы{*ETB*}: иссушитель, скелеты-иссушители, ведьмы, летучие мыши, лошади, ослы и мулы.{*B*}{*B*} +{*T1*}Новые возможности{*ETB*}: приручайте и седлайте лошадей, создавайте и демонстрируйте фейерверки, давайте имена животным и монстрам с помощью бирок, создавайте продвинутые красные цепи и задавайте новые настройки хоста, чтобы управлять возможностями гостей вашего мира!{*B*}{*B*} +{*T1*}Новый обучающий мир{*ETB*}: научитесь использовать новые и старые возможности в обучающем мире. Сможете ли вы найти все спрятанные в нем музыкальные диски?{*B*}{*B*} + - - - Это экран печи. Печь позволяет изменять предметы, обжигая их. Например, с ее помощью вы сможете превратить железную руду в железные слитки. - + + Наносит больше урона, чем кулак. - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как работать с печью. - + + С ней копать землю, траву, песок, гравий и снег быстрее, чем рукой. Снежки можно откапывать только лопатой. - - - Поместите топливо в нижнюю ячейку печи, а предмет, который нужно изменить - в верхнюю. Затем в печи загорится огонь, и она начнет работать. Готовый предмет попадет в ячейку справа. - + + Бег - - - Многие деревянные предметы можно использовать в качестве топлива, но не все они горят одинаково долго. Кроме того, есть и другие предметы, которые можно жечь. - + + Что нового - - - После обжига вы можете переместить предметы в инвентарь. Экспериментируйте с разными ингредиентами, чтобы узнать, что еще можно сделать. - + + {*T3*}Список изменений{*ETW*}{*B*}{*B*} +- Добавлены новые предметы: обожженная глина, окрашенная глина, блок угля, сноп сена, активирующие рельсы, блок красного камня, датчик дневного света, выбрасыватель, воронка, вагонетка с воронкой, вагонетка с тротилом, компаратор, утяжеленная нажимная пластина, маяк, сундук с ловушкой, ракета, звездочка, звезда нижнего мира, поводок, броня для лошади, бирка, яйцо возрождения лошади.{*B*} +- Добавлены новые мобы: иссушитель, скелеты-иссушители, ведьмы, летучие мыши, лошади, ослы и мулы.{*B*} +- Добавлены новые варианты генерации поверхности: хижины ведьм.{*B*} +- Добавлен экран маяка.{*B*} +- Добавлен экран лошади.{*B*} +- Добавлен экран воронки.{*B*} +- Добавлены фейерверки. Их можно получить с помощью верстака, если у вас есть ингредиенты для создания звездочки и ракеты.{*B*} +- Добавлен ''Режим приключений'' - в нем вы можете ломать блоки, только если используете правильный инструмент.{*B*} +- Добавлено много новых звуков.{*B*} +- Мобы, предметы и снаряды теперь могут проходить через порталы.{*B*} +- Повторители теперь можно блокировать, размещая рядом с ними другие активированные повторители.{*B*} +- Зомби и скелеты теперь могут возрождаться с различным оружием и броней. {*B*} +- Новые сообщения о смерти.{*B*} +- Теперь вы можете давать мобам имена с помощью бирок и менять названия контейнеров, когда открыто их меню.{*B*} +- Теперь костная мука заставляет растения вырастать не полностью, а на случайное количество стадий.{*B*} +- Красный сигнал, описывающий содержимое сундуков, варочных стоек, раздатчиков и музыкальных автоматов, теперь можно засечь, размещая рядом с ними компараторы.{*B*} +- Теперь раздатчики можно направить в любую сторону.{*B*} +- Теперь, съев золотое яблоко, игрок ненадолго получает дополнительное здоровье от эффекта ''Поглощение''. {*B*} +- Чем дольше вы находитесь в какой-либо зоне, тем сильнее там будут становиться монстры.{*B*} - - - Возьмите в качестве ингредиента древесину, чтобы приготовить древесный уголь. Положите в печь топливо, а древесину - в ячейку ингредиента. На приготовление уйдет некоторое время, так что можете заняться другими делами, а потом вернуться к печи. - + + Поделиться скриншотом - - - Древесный уголь - один из видов топлива. Кроме того, если насадить уголь на палку, получится факел. - + + Сундуки - - - Поместив песок в ячейку ингредиента, вы сделаете стекло. Создайте несколько стеклянных блоков, чтобы сделать из них окна в вашем убежище. - + + Создание предметов - - - Это интерфейс создания зелий. Здесь можно создать зелья, обладающие различными эффектами. - + + Печь - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать варочную стойку. - + + Основы управления - - - Чтобы сварить зелье, поместите в верхнюю ячейку ингредиент, а в нижние - зелья или бутылки с водой (одновременно можно создавать до 3 зелий). Если получилась допустимая комбинация, начнется процесс зельеварения, и через некоторое время зелье будет готово. - + + Интерфейс - - - Для каждого зелья нужна бутылка с водой. Приготовление большинства зелий можно начать с создания "Неудобоваримого зелья" из адской бородавки, а затем добавить к нему еще хотя бы один ингредиент. - + + Инвентарь - - - Сварив зелье, вы можете изменить его эффект. Добавив красную пыль, вы увеличите время действия зелья, а сияющая пыль сделает его более мощным. - + + Раздатчик - - - Ферментированный глаз паука оскверняет зелье и может изменить его эффект на противоположный, а порох превращает зелье в разрывное, которое можно бросить, чтобы оно подействовало на все объекты, находящиеся в определенной области. - + + Зачаровывание предметов - - - Создайте зелье устойчивости к огню, сначала положив в бутылку с водой адскую бородавку, а затем добавив сливки магмы. - + + Портал в преисподнюю - - - Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания зелий. - + + Сетевая игра - - - Здесь находятся варочная стойка, котел и сундук с ингредиентами. - + + Содержание животных - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зельях и том, как их варить.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже достаточно знаете о зельеварении. - + + Разведение животных - - - Чтобы сварить зелье, для начала получите бутылку с водой. Для этого возьмите из сундука стеклянную бутылку. - + + Создание зелий - - - Наполнить бутылку можно из котла, в котором есть вода, или из блока воды. Наполните бутылку, указав на источник воды и нажав{*CONTROLLER_ACTION_USE*}. - + + deadmau5 любит Minecraft! - - - Если котел опустеет, долейте в него воды из ведра. - + + Свинолюди не нападают первыми. + + + Спите в кровати, чтобы изменить точку спауна и быстрее перейти от ночи к утру. - - - Создайте зелье устойчивости к огню, используя варочную стойку. Вам понадобится бутылка с водой, адская бородавка и сливки магмы. - + + Бросайте огненные шары обратно в вурдалака! - - - Чтобы использовать зелье, возьмите его в руку и зажмите{*CONTROLLER_ACTION_USE*}. Обычное зелье вы выпьете, и его эффект подействует на вас, а разрывное - бросите, и оно подействует на существ, которые окажутся в зоне поражения. - Чтобы превратить обычное зелье в разрывное, добавьте в него порох. - + + Чтобы осветить участок земли, используйте факелы. Монстры избегают подходить к ним. - - - Выпейте зелье устойчивости к огню. - + + Ездить на вагонетке по рельсам быстрее, чем ходить пешком! - - - Вы приобрели устойчивость к воздействию огня и лавы. Теперь попробуйте пройти там, куда не могли пробраться раньше. - + + Сажайте ростки, и они вырастут в деревья. - - - В этом окне вы сможете накладывать чары на оружие, доспехи и инструменты. - + + Построив портал, вы сможете попасть в другое измерение - преисподнюю. - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше об окне зачаровывания.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знакомы с окном зачаровывания. - + + Копать вертикально вниз или вверх - не лучшая мысль. - - - Чтобы зачаровать предмет, прежде всего положите его в ячейку для зачаровывания. Зачарованные предметы приобретают особые свойства: например, увеличивается их уровень защиты или число предметов, получаемых при разработке блока. - + + Костная мука (ее можно сделать из кости скелета) - это удобрение, которое заставляет растения вырасти мгновенно! - - - Если поместить предмет в ячейку, на кнопке справа появятся различные случайно выбранные чары. - + + Подойдя к вам поближе, криперы взрываются! - - - Число на кнопке соответствует уровням опыта, которые нужно потратить. Если вашего уровня недостаточно, кнопка будет неактивной. - + + Чтобы бросить предмет, который вы держите в руке, нажмите{*CONTROLLER_VK_B*}. - - - Выберите чары и нажмите{*CONTROLLER_VK_A*}, чтобы зачаровать предмет. Ваш уровень опыта уменьшится на сумму, необходимую для зачаровывания. - + + Подбирайте правильные инструменты для каждой задачи! - - - Чары выбираются случайным образом, однако лучшие из них доступны только тем игрокам, у которых высокий уровень опыта и которые окружили свой колдовской стол большим количеством книжных шкафов. - + + Если не удается найти уголь для факелов, вы можете его сделать, сжигая деревья в печи. - - - Здесь находится колдовской стол и другие предметы, которые помогут вам узнать больше о зачаровывании. - + + Приготовленная свиная отбивная сильнее повышает уровень здоровья, чем сырая. - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о зачаровывании.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как зачаровывать предметы. - + + В "Мирном" режиме игры здоровье персонажа будет восстанавливаться автоматически, а монстры не будут приходить по ночам! - - - Колдовской стол позволяет снабдить предметы особыми свойствами. Например, увеличить число предметов, получаемых при разработке блока, или повысить сопротивляемость урону для оружия, доспехов или некоторых инструментов. - + + Дайте волку кость, чтобы приручить его. Затем вы можете приказать ему сидеть или следовать за вами. - - - Окружив колдовской стол книжными шкафами, вы повысите его силу и получите доступ к чарам высоких уровней. - + + Чтобы выбросить предмет, находясь в инвентаре, переместите курсор за пределы инвентаря и нажмите{*CONTROLLER_VK_A*} - - - На зачаровывание уходят уровни опыта. Чтобы приобрести опыт, собирайте сферы опыта, выпадающие из убитых монстров и животных, добывайте руду, разводите животных, ловите рыбу и обрабатывайте предметы в печи. - + + Появился новый загружаемый контент! Чтобы получить к нему доступ, нажмите кнопку "Магазин Minecraft" в главном меню. - - - Кроме того, вы можете использовать бутыли зачаровывания: если их бросить, то на месте падения появятся сферы опыта, которые можно собрать. - + + Вы можете изменить облик своего персонажа, купив набор скинов в магазине Minecraft. Выберите "Магазин Minecraft" в главном меню, чтобы увидеть доступные наборы. - - - Здесь в сундуках хранятся зачарованные предметы, бутыли зачаровывания и предметы, которые еще не зачарованы. Вы сможете поэкспериментировать с ними на колдовском столе. - + + Изменить настройки гаммы, чтобы игра стала светлее или темнее. - - - Вы едете на вагонетке. Чтобы слезть с нее, наведите на нее курсор и нажмите{*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*} - + + Если животное не может пройти больше 20 блоков в одном направлении, оно не исчезнет. - - - Удочка, как и многие другие инструменты, ломается после определенного числа применений, однако ее можно использовать не только на рыбалке. Экспериментируйте, и вы узнаете, что еще можно поймать или активировать с ее помощью... - {*FishingRodIcon*} - + + Положение хвоста ручного волка символизирует уровень его здоровья. Чтобы вылечить волка, кормите его мясом. - - - Это кровать. Нажмите{*CONTROLLER_ACTION_USE*}, наведя на нее курсор, чтобы заснуть ночью и проснуться утром.{*ICON*}355{*/ICON*} - + + Чтобы получить зеленую краску, приготовьте кактус в печи. - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о кроватях.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о кроватях. - + + Прочтите раздел "Что нового" в обучающих меню, чтобы узнать о последних изменениях в игре. - - - Кровать должна стоять в защищенном, светлом месте, чтобы монстры не разбудили вас посреди ночи. Если у вас есть кровать, то возрождаться вы будете на ней. - {*ICON*}355{*/ICON*} - + + Композитор - C418! - - - Если в вашей игре есть другие пользователи, то все должны лежать в кроватях одновременно, чтобы заснуть. - {*ICON*}355{*/ICON*} - + + Кто такой Notch? - - - Здесь есть несколько простых схем с красным камнем и поршнями, а также сундук с предметами, которые позволят усложнить эти схемы. - + + У Mojang больше наград, чем сотрудников! - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о схемах с красным камнем и поршнями.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете про схемы с красным камнем и поршнями. - + + В Minecraft играют знаменитости! - - - Рычаги, кнопки, нажимные пластины и факелы из красного камня могут питать схемы энергией. Для этого либо прикрепите их к предмету или соедините источник энергии и предмет с помощью красной пыли. - + + У Notch более миллиона последователей в Твиттере! - - - Эффект, который источник энергии оказывает на окружающие блоки, зависит от его положения и ориентации. Например, факел рядом с блоком, может погаснуть, если блок получает энергию из другого источника. - + + Не у всех шведов светлые волосы. Среди них есть и рыжие, например Йенс из Mojang! - - - Красную пыль можно получить, добывая красную руду с помощью железной, алмазной или золотой кирки. С помощью пыли можно передавать энергию на расстояние до 15 блоков, и она может сдвигаться на 1 блок вверх или вниз. - {*ICON*}331{*/ICON*} - + + Когда-нибудь у этой игры появится обновление! + + + Поставив два сундука рядом, вы получите один большой. - - - Красные ретрансляторы можно использовать для передачи энергии на большие расстояния или для того, чтобы задержать прохождение сигнала по схеме. - {*ICON*}356{*/ICON*} - + + Будьте осторожны, возводя здания из шерсти на открытом месте: во время грозы их могут поджечь молнии. - - - Поршень, соединенный с источником энергии, выдвигается, толкая до 12 блоков. Липкий поршень, втягиваясь, может тянуть за собой один блок почти любого вида. - {*ICON*}33{*/ICON*} - + + С помощью одного ведра лавы в печи можно расплавить 100 блоков. - - - Здесь в сундуке лежат компоненты для схем и поршней. Попробуйте воспользоваться схемами, которые находятся поблизости, расширить их или сделать собственные. За границами зоны обучения есть и другие схемы. - + + Инструмент, звучание которого воспроизводит нотный блок, зависит от материала под ним. - - - Здесь находится портал в преисподнюю! - + + Если убрать блок-источник лавы, то ПОЛНОСТЬЮ лава исчезнет только через несколько минут. - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о порталах и преисподней.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о порталах и преисподней. - + + Булыжники устойчивы к огненным шарам вурдалаков, поэтому они пригодятся при строительстве сторожевых порталов. - - - Чтобы создать портал, необходимо построить обсидиановую раму - 4 блока в ширину и 5 в высоту. Угловые блоки не требуются. - + + Блоки, которые можно использовать в качестве источника света, растапливают снег и лед. К ним относятся факелы, сияющие камни и фонари из тыквы. - - - Чтобы активировать портал в преисподнюю, подожгите обсидиановые блоки, находясь внутри портала, с помощью кремня и огнива. Порталы деактивируются только в том случае, если одна из стен разрушена, если рядом произошел взрыв или если через них протекла жидкость. - + + Зомби и скелеты могут выжить при дневном свете, если находятся в воде. - - - Чтобы воспользоваться порталом в преисподнюю, зайдите в него. Экран окрасится в лиловый цвет, и прозвучит определенный звук. Через несколько мгновений вы окажетесь в другом измерении. - - + + Куры откладывают яйца с интервалом 5-10 минут. - - - Преисподняя - опасное место, здесь много лавы, зато здесь можно добыть адский камень, который горит вечно, если его поджечь, а также сияющий камень - источник света. - + + Обсидиан можно добыть только с помощью алмазной кирки. - - - Путешествия по преисподней - хороший способ быстро преодолеть расстояние в наземном мире: 1 блок в преисподней равен 3 в наземном мире. - + + Легче всего добывать порох из криперов. - - - Вы в режиме "Творчество". - + + Если вы атакуете волка, на вас нападут все волки, находящиеся поблизости. Так же ведут себя и зомби-свинолюди. - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о режиме "Творчество".{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о режиме "Творчество". - + + Волки не могут входить в преисподнюю. - - В режиме "Творчество" у вас бесконечное число всех доступных предметов и блоков, вы можете уничтожать блоки одним щелчком без помощи инструментов. Кроме того, вы неуязвимы и можете летать. + + Волки не нападают на криперов. - - Нажмите{*CONTROLLER_ACTION_CRAFTING*}, чтобы открыть инвентарь в режиме "Творчество". + + Необходима для добычи каменных блоков и руды. - - Чтобы продолжить, доберитесь до противоположной стороны этой дыры. + + Используется для приготовления торта или в качестве ингредиента для зелий. - - Вы прошли курс обучения, посвященный режиму "Творчество". + + При включении/выключении выпускает электрический разряд. Остается во включенном или выключенном положении, пока на него не нажать. - - - Здесь находится ферма. Фермы позволяют создавать возобновляемый источник пищи и других предметов. - + + Постоянно выпускает электрические разряды. Соединив с блоком, можно использовать в качестве приемника/передатчика. Также является слабым источником света. - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о фермах.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы все уже знаете о фермах. - + + Восстанавливает 2{*ICON_SHANK_01*}. Можно превратить в золотое яблоко. - - Пшеницу, тыквы и дыни выращивают из семян. Чтобы добыть семена пшеницы, разбивайте блоки высокой травы или собирайте урожай пшеницы. Семена тыквы и дыни делаются из тыкв и дынь соответственно. + + Восстанавливает 2{*ICON_SHANK_01*} и дает регенерацию здоровья на 4 секунды. Создается из яблока и золотых самородков. - - Прежде чем сажать семена, превратите блок земли в грядку, обработав его с помощью мотыги. Если рядом находятся источники воды и/или света, посевы будут расти быстрее. + + Восстанавливает 2{*ICON_SHANK_01*}. Этой едой можно отравиться. - - Пшеница по мере роста проходит через несколько этапов. Когда она потемнеет, урожай можно собирать.{*ICON*}59:7{*/ICON*} + + Используется в красных сетях в качестве ретранслятора, элемента задержки и/или диода. - - Рядом с тыквой или дыней должен быть еще один блок, чтобы стеблю было куда расти. + + По ним ездят вагонетки. - - Сахарный тростник нужно сажать на блок травы, земли или песка, находящийся рядом с блоком воды. Срубив блок сахарного песка, вы обрушите все блоки, которые находятся над ним.{*ICON*}83{*/ICON*} + + Под напряжением ускоряют вагонетки, которые по ним едут. При отключении напряжения останавливают вагонетки. - - Кактусы нужно сажать на песке, и они вырастают на 3 блока в высоту. Срубив блок кактуса, вы обрушите все блоки, которые находятся над ним.{*ICON*}81{*/ICON*} + + Работают как нажимная пластина (под напряжением посылают красный сигнал), но их могут активировать только вагонетки. - - Грибы нужно сажать в местах со слабым освещением. Грибница разрастется на другие плохо освещенные блоки.{*ICON*}39{*/ICON*} + + При нажатии выпускает электрический разряд. Выключается примерно через секунду после активации. - - Костная мука заставляет урожай сразу же созреть, а грибы превращает в огромные грибы.{*ICON*}351:15{*/ICON*} + + Хранит и случайным образом выдает предметы, если поместить в него заряд красного камня. - - Вы прошли курс обучения, посвященный посадкам. + + При активации проигрывает ноту. Чтобы изменить ее высоту, ударьте по блоку. Ставьте его на разные другие блоки, чтобы изменять тип музыкального инструмента. - - - Здесь находится загон с животными. Разводите животных, чтобы получить детенышей их вида. - + + Восстанавливает 2,5{*ICON_SHANK_01*}. Готовится из сырой рыбы в печи. - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о животных и их разведении.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о животных и их разведении. - + + Восстанавливает 1{*ICON_SHANK_01*}. - - Чтобы животные размножались, они должны перейти в "Режим любви". Для этого их нужно кормить подходящими продуктами. + + Восстанавливает 1{*ICON_SHANK_01*}. - - Кормите пшеницей коров, гриборов и овец. Морковку давайте свиньям. Кур кормите семенами пшеницы или адскими бородавками. Волков - любым видом мяса. И тогда они начнут искать другое животное своего вида, которое также находится в режиме любви. + + Восстанавливает 3{*ICON_SHANK_01*}. - - Когда встречаются две особи одного вида, которые находятся в режиме любви, несколько секунд они будут целоваться, а потом появится детеныш. Некоторое время малыш будет следовать за родителями, а затем превратится во взрослую особь. + + Это боеприпасы для лука. - - Побывав в режиме любви, животное не сможет войти в него повторно около 5 минут. + + Восстанавливает 2,5{*ICON_SHANK_01*}. - - Некоторые животные будут следовать за вами, если вы держите в руке их пищу. Так вам будет проще собрать их вместе для разведения.{*ICON*}296{*/ICON*} + + Восстанавливает 1{*ICON_SHANK_01*}. Можно использовать 6 раз. - - -Диких волков можно приручить, давая им кости. Над прирученным волком появляются сердечки. Такой волк будет следовать за игроком и защищать его, если только ему не была дана команда сидеть. - + + Восстанавливает 1{*ICON_SHANK_01*}, но этой едой можно отравиться. Можно приготовить в печи. - - Вы прошли курс обучения, посвященный животным и их разведению. + + Восстанавливает 1,5{*ICON_SHANK_01*}, можно приготовить в печи. - - - Здесь находятся тыквы и блоки, из которых можно сделать снежного и железного голема. - + + Восстанавливает 4{*ICON_SHANK_01*}. Готовится из сырой свиной отбивной в печи. - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать о големах.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о големах. - + + Восстанавливает 1{*ICON_SHANK_01*}, можно приготовить в печи. Можно скормить оцелоту, чтобы приручить его. - - Чтобы создать голема, необходимо поставить тыкву на штабель блоков. + + Восстанавливает 3{*ICON_SHANK_01*}. Готовится из сырой курятины в печи. - - Снежный голем состоит из двух блоков снега, поставленных один на другой, наверху которых стоит тыква. Снежные големы бросают снежки в ваших врагов. + + Восстанавливает 1,5{*ICON_SHANK_01*}, можно приготовить в печи. - - Железные големы состоят из 4 железных блоков, составленных так, как показано на рисунке. Наверху среднего блока должна стоять тыква. Железные големы атакуют ваших врагов. + + Восстанавливает 4{*ICON_SHANK_01*}. Готовится из сырой говядины в печи. - - Железные големы также появляются сами по себе, чтобы защищать деревни. Они нападут на вас, если вы будете нападать на крестьян. + + Может перевозить вас, животное или монстра по рельсам. - - Вы не сможете покинуть эту зону, пока не завершите курс обучения. + + Краска для производства голубой шерсти. - - Для каждой задачи есть свои инструменты. Копать мягкие материалы, например землю и песок, следует лопатой. + + Краска для производства бирюзовой шерсти. - - Для каждой задачи есть свои инструменты. Рубить деревья следует топором. + + Краска для производства лиловой шерсти. - - Для каждой задачи есть свои инструменты. Добывать камень и руду следует киркой. Для некоторых материалов необходимы более прочные кирки. + + Краска для производства светло-зеленой шерсти. - - Некоторые инструменты предназначены для борьбы с врагами. Советуем использовать в бою меч. + + Краска для производства серой шерсти. - - Подсказка: зажмите{*CONTROLLER_ACTION_ACTION*}, чтобы добывать руду или рубить - руками или предметом, который вы держите в руках. Некоторые блоки можно добыть только с помощью определенных инструментов... + + Краска для производства светло-серой шерсти. (Примечание: светло-серую краску также можно сделать, перемешав серую краску с костной мукой.) - - Ваш инструмент поврежден. При каждом использовании инструмент получает повреждения и в конце концов ломается. Когда предмет находится в инвентаре, цветная полоска внизу отражает его состояние. + + Краска для производства пурпурной шерсти. - - Зажмите{*CONTROLLER_ACTION_JUMP*}, чтобы плыть вверх. + + Дает более яркий свет, чем факелы. Может плавить снег и лед и использоваться под водой. - - В этой зоне находится вагонетка на рельсах. Чтобы сесть в нее, наведите курсор на вагонетку и нажмите{*CONTROLLER_ACTION_USE*}. Чтобы привести ее в движение, используйте{*CONTROLLER_ACTION_USE*}. + + Из нее можно делать книги и карты. - - В сундуке на берегу реки лежит лодка. Чтобы использовать ее, наведите курсор на воду и нажмите{*CONTROLLER_ACTION_USE*}. Чтобы сесть в нее, используйте{*CONTROLLER_ACTION_USE*}, наведя курсор на лодку. + + Из них можно делать книжные полки; на них также можно накладывать чары, чтобы получить зачарованные книги. - - В сундуке на берегу пруда лежит удочка. Достаньте ее и возьмите в руки, чтобы использовать ее. + + Краска для производства синей шерсти. - - Этот более сложный поршневой механизм создает саморемонтирующийся мост! Нажмите кнопку, чтобы включить его, и посмотрите, как взаимодействуют его части. + + Воспроизводит музыкальные диски. - - Чтобы выбросить предмет, который вы держите в руке, переместите курсор за пределы экрана. + + Позволяют создавать очень прочные инструменты, доспехи и оружие. - - Для создания этого предмета у вас не хватает ингредиентов. Все необходимые ингредиенты перечислены в окне слева. + + Краска для производства оранжевой шерсти. - - - Поздравляем, вы прошли обучение. Теперь время в игре идет с обычной скоростью, так что скоро настанет ночь! Достройте убежище, пока не пришли монстры! - + + Ее можно состричь с овец и покрасить. - - {*EXIT_PICTURE*} Если вы готовы исследовать мир дальше, в этой зоне рядом с убежищем шахтера есть лестница, которая ведет к небольшому замку. - + + Используется в качестве строительного материала, можно покрасить. Этот рецепт не рекомендуется - шерсть легко состричь с овец. - - Напоминание: + + Краска для производства черной шерсти. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Может перевозить товары по рельсам. - - В последней версии игры появились новые возможности, в том числе новые зоны в мире обучения. + + Движется по рельсам. Если в нее положить уголь, сможет толкать другие вагонетки. - - {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы пройти обучение, как обычно.{*B*} - Нажмите{*CONTROLLER_VK_B*}, чтобы пропустить основной курс обучения. + + Позволяет передвигаться по воде быстрее, чем вплавь. - - В этой зоне вы сможете узнать о том, как ловить рыбу, плавать на лодках, использовать поршни и красный камень. + + Краска для производства зеленой шерсти. - - За пределами этой зоны вы познакомитесь со зданиями, научитесь основам сельского хозяйства, узнаете, как ездить на вагонетках, зачаровывать предметы, варить зелья, торговать, ковать предметы и многое другое! + + Краска для производства красной шерсти. - - - Шкала пищи находится на таком уровне, что вы уже не сможете улучшить здоровье. - + + Позволяет мгновенно вырастить урожай, деревья, высокую траву, огромные грибы и цветы. Может использоваться при создании красок. - - - {*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о шкале пищи и употреблении продуктов.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете все о шкале пищи и употреблении продуктов. - + + Краска для производства розовой шерсти. - - Выбрать + + Используется для производства коричневой шерсти, в качестве ингредиента для печенья или для выращивания плодов какао. - - Использовать + + Краска для производства серебряной шерсти. - - Назад + + Краска для производства желтой шерсти. - - Выход + + Позволяет выпускать во врагов стрелы. - - Отмена + + Увеличивает уровень доспехов на 5. - - Не присоединяться + + Увеличивает уровень доспехов на 3. - - Обновить список сетевых игр + + Увеличивает уровень доспехов на 1. - - Игры-вечеринки + + Увеличивает уровень доспехов на 5. - - Все игры + + Увеличивает уровень доспехов на 2. - - Изменить группу + + Увеличивает уровень доспехов на 2. - - Открыть инвентарь + + Увеличивает уровень доспехов на 3. - - Показать описание + + Блестящий слиток, из которого можно делать инструменты. Чтобы получить его, расплавьте в печи кусок руды. - - Показать ингредиенты + + Позволяет делать из слитков, самоцветов и красок размещаемые блоки. Можно использовать как дорогостоящий строительный материал или компактный вариант хранения руды. - - Создание предметов + + Выпускает электрический разряд, оказавшись под ногами игрока, монстра или животного. Деревянные пластины можно также активировать, сбросив на них что-нибудь. - - Создать + + Увеличивает уровень доспехов на 8. - - Взять/положить + + Увеличивает уровень доспехов на 6. - - Взять + + Увеличивает уровень доспехов на 3. - - Взять все + + Увеличивает уровень доспехов на 6. - - Взять половину + + Железные двери можно открыть только с помощью красного камня, кнопок или переключателей. - - Положить + + Увеличивает уровень доспехов на 1. - - Положить все + + Увеличивает уровень доспехов на 3. - - Положить 1 + + Этот инструмент помогает быстрее добывать деревянные блоки. - - Выбросить + + С помощью этого инструмента можно вскапывать блоки земли и травы, чтобы подготовить их к посеву. - - Выбросить все + + Чтобы открыть деревянную дверь, нужно использовать ее, ударить по ней или применить к ней красный камень. - - Выбросить 1 + + Увеличивает уровень доспехов на 2. - - Поменять + + Увеличивает уровень доспехов на 4. - - Быстрое перемещение + + Увеличивает уровень доспехов на 1. - - Очистить ячейку быстрого выбора + + Увеличивает уровень доспехов на 2. - - Что это? + + Увеличивает уровень доспехов на 1. - - Поделиться в Facebook + + Увеличивает уровень доспехов на 2. - - Изменить фильтр + + Увеличивает уровень доспехов на 5. - - Предложить дружбу + + Используется для создания небольших лестниц. - - Следующая страница + + Тут хранятся тушеные грибы. Когда они съедены, миска остается у вас. - - Предыдущая страница + + Тут можно хранить и переносить воду, лаву и молоко. - - Вперед + + Тут можно хранить и переносить воду. - - Назад + + На этом предмете размещается текст, написанный вами или другим игроками. - - Исключить игрока + + Дает более яркий свет, чем факелы. Им можно плавить снег и лед, а также использовать его под водой. - - Покрасить + + Позволяет устраивать взрывы. Для детонации подожгите его кремнем и огнивом или электрическим разрядом. - - Добыть + + Тут можно хранить и переносить лаву. - - Кормить + + Показывает положение солнца и луны. - - Приручить + + Указывает направление к точке старта. - - Вылечить + + Если держать ее в руках, она показывает исследованные области. Помогает искать маршрут. - - Сидеть + + Тут можно хранить и переносить молоко. - - Следуй за мной + + С помощью этих предметов можно разводить огонь, поджигать тротил и открывать построенный портал. - - Выбросить + + С ее помощью можно ловить рыбу. - - Вылить + + Чтобы активировать люк, нужно использовать его, ударить по нему или применить к нему красный камень. Они выполняют ту же самую роль, что и двери, но лежат на земле и они размером в один блок. - - Оседлать + + Используется как строительный материал и для создания предметов. Получается из любых видов деревьев. - - Положить + + Используется как строительный материал. Сила тяжести действует на него иначе, чем на обычный песок. - - Ударить + + Используется как строительный материал. - - Подоить + + Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок нормального размера. - - Собрать + + Используется для создания длинных лестниц. Две плиты, положенные друг на друга, образуют двойной блок стандартного размера. - - Съесть + + Используется для освещения. С помощью факелов можно также топить снег и лед. - - Поспать + + Материал для факелов, стрел, табличек, лестниц, заборов и рукоятей для инструментов и оружия. - - Проснуться + + В нем можно хранить блоки и предметы. Чтобы создать сундук вдвое большего объема, поставьте два сундука рядом. - - Проиграть + + Барьер, через который нельзя перепрыгнуть. Для игроков, животных и монстров его высота считается равной 1,5 блокам. Для блоков его высота равна 1. - - Ехать + + По ней можно лазить вертикально. - - Плыть на лодке + + Позволяет перейти от любого момента ночи к утру (если в кроватях лежат все игроки в мире) и меняет точку спауна игрока. Окраска кровати всегда одна и та же. - - Вырастить + + Позволяет создавать более разнообразные предметы, чем при обычном занятии ремеслом. - - Всплыть + + Позволяет плавить руду, создавать древесный уголь и стекло, а также готовить рыбу и свиные отбивные. - - Открыть + + Железный топор - - Изменить высоту + + Красная лампа - - Взорвать + + Лестница (дерево джунг.) - - Прочитать + + Березовая лестница - - Повесить + + Выбранное управление - - Бросить + + Череп - - Посадить + + Какао - - Вспахать + + Лестница из ели - - Собрать урожай + + Яйцо дракона - - Продолжить + + Камень Края - - Получить доступ к полной версии + + Рамка портала Края - - Удалить сохранение + + Лестница из песчаника - - Удалить + + Папоротник - - Настройки + + Куст - - Пригласить друзей + + Раскладка - - ОК + + Создание предметов - - Подстричь + + Применение - - Запретить уровень + + Действие - - Выбрать скин + + Красться/лететь вниз - - Поджечь + + Красться - - Навигация + + Выбросить - - Установить полную версию + + Выбор предмета - - Установить пробную версию + + Пауза - - Установить + + Осмотр - - Переустановить + + Движение/ускорение - - Опции + + Инвентарь - - Выполнить команду + + Прыжок/взлет - - Творчество + + Прыжок - - Переместить ингредиент + + Портал Края - - Переместить топливо + + Стебель тыквы - - Переместить инструмент + + Дыня - - Переместить доспех + + Стекло - - Переместить оружие + + Ворота забора - - Взять/надеть + + Лоза - - Натянуть тетиву + + Стебель дыни - - Отпустить тетиву + + Железная решетка - - Привилегии + + Кирпичи из растрескавшихся камней - - Заблокировать + + Кирпичи из замшелых камней - - Предыдущая страница + + Каменные кирпичи - - Следующая страница + + Гриб - - Режим любви + + Гриб - - Выпить + + Кирпичи из обработанных камней - - Повернуть + + Кирпичная лестница - - Скрыть + + Адская бородавка - - Очистить все ячейки + + Лестница (ад. кирпичи) - - ОК + + Забор из адского кирпича - - Отмена + + Котел - - Магазин Minecraft + + Варочная стойка - - Выйти из текущей игры и присоединиться к новой? Все несохраненные данные будут утеряны. + + Колдовской стол - - Выйти из игры + + Адский кирпич - - Сохранить игру + + Булыжник-чешуйница - - Выйти без сохранения + + Камень-чешуйница - - Переписать все прежние сохранения данной версией? + + Лестница (камен. кирпичи) - - Выйти без сохранения? Все, чего вы добились в этом мире, будет утеряно! + + Кувшинка - - Начать игру + + Мицелий - - Поврежденное сохранение + + Каменный кирпич-чешуйница - - Файл поврежден. Удалить? + + Изменить режим камеры - - Выйти в главное меню и отключить от игры всех пользователей? Все несохраненные данные будут потеряны. + + Если ваше здоровье ухудшилось, но шкала пищи находится на отметке 9{*ICON_SHANK_01*} или больше, то здоровье улучшится автоматически. Ешьте, чтобы заполнить шкалу пищи. - - Выйти и сохранить + + Когда вы двигаетесь, добываете породу и нападаете на врагов, шкала пищи пустеет{*ICON_SHANK_01*}. Во время бега и прыжков с разбегу расходуется больше продовольствия, чем при ходьбе и обычных прыжках. - - Выйти без сохранения + + По мере того, как вы собираете и изготавливаете предметы, ваш инвентарь будет заполняться.{*B*} + Нажмите{*CONTROLLER_ACTION_INVENTORY*}, чтобы открыть инвентарь. - - Выйти в главное меню? Все несохраненные данные будут потеряны. + + Из древесины, которую вы собрали, можно сделать доски. Для этого откройте экран создания предметов.{*PlanksIcon*} - - Выйти в главное меню? Несохраненные данные будут потеряны! + + Шкала пищи почти на нуле, и вы ранены. Съешьте бифштекс, который находится в инвентаре, чтобы пополнить шкалу пищи и подлечиться.{*ICON*}364{*/ICON*} - - Создать новый мир + + Чтобы съесть съедобный предмет, который вы держите в руках, и восполнить уровень здоровья, удерживайте{*CONTROLLER_ACTION_USE*}. Вы не можете есть, если шкала пищи заполнена. - - Пройти обучение + + Нажмите{*CONTROLLER_ACTION_CRAFTING*}, чтобы открыть панель создания предметов. - - Обучение + + Чтобы бежать, быстро дважды сместите вперед{*CONTROLLER_ACTION_MOVE*}. Пока вы удерживаете{*CONTROLLER_ACTION_MOVE*} смещенным вперед, персонаж будет бежать вперед, пока не закончится время бега или продовольствие. - - Назвать новый мир + + Для перемещения используйте{*CONTROLLER_ACTION_MOVE*}. - - Введите имя мира + + Чтобы осмотреться, используйте{*CONTROLLER_ACTION_LOOK*}. - - Введите число-затравку для создания мира + + Удерживайте{*CONTROLLER_ACTION_ACTION*}, чтобы срубить 4 блока дерева (ствола).{*B*}Когда блок разломится на части, вы сможете подобрать висящий в воздухе предмет, встав рядом с ним. После этого предмет появится в инвентаре. - - Загрузить мир + + Удерживайте{*CONTROLLER_ACTION_ACTION*}, чтобы добывать руду или рубить - руками или предметом, который вы держите в руках. Некоторые блоки можно добыть только с помощью определенных инструментов... - - START - присоединиться + + Чтобы прыгнуть, нажмите{*CONTROLLER_ACTION_JUMP*}. - - Выход из игры + + Создание многих предметов состоит из нескольких этапов. Теперь, когда у вас есть доски, вы можете изготовить новые предметы. Сделайте верстак.{*CraftingTableIcon*} - - Произошла ошибка. Сейчас вы вернетесь в главное меню. + + + Ночь может наступить очень быстро, и находиться снаружи станет опасно. Вы можете изготовить оружие и доспехи, но лучше всего построить надежное убежище. + - - Не удалось установить соединение + + Открыть контейнер - - Соединение разорвано + + Кирка помогает добывать быстрее прочные блоки вроде камня и руды. Получая различные материалы, вы сможете изготавливать инструменты, которые будут работать быстрее и служить вам дольше. Создайте деревянную кирку.{*WoodenPickaxeIcon*} - - Утрачено соединение с сервером. Сейчас вы вернетесь в главное меню. + + Добудьте несколько каменных блоков с помощью кирки. Добывая каменные блоки, можно получить немного булыжника. Если вы наберете 8 булыжников, то сможете сложить печь. Возможно, вам придется раскопать землю, чтобы добраться до камня. Сделайте это с помощью лопаты.{*StoneIcon*} - - Сервер разорвал соединение + + + Для строительства убежища вам понадобятся ресурсы. Стены и крышу можно сделать из любых блоков, но вам также придется создать дверь, окна и освещение. + - - Вас исключили из игры + + + Неподалеку находится брошенное убежище шахтера, которое вы можете достроить, чтобы там переночевать. + - - Вас исключили из игры за полеты + + Топор помогает быстрее рубить древесину и квадраты с деревом. Получая различные материалы, вы сможете изготавливать инструменты, которые будут работать быстрее и служить вам дольше. Создайте деревянный топор.{*WoodenHatchetIcon*} - - Попытка подключения длилась слишком долго + + Используйте{*CONTROLLER_ACTION_USE*}, чтобы использовать предметы, размещать их и взаимодействовать с объектами. Размещенные предметы можно подобрать заново, добыв их с помощью соответствующего инструмента. - - Сервер переполнен + + Используйте{*CONTROLLER_ACTION_LEFT_SCROLL*} и{*CONTROLLER_ACTION_RIGHT_SCROLL*}, чтобы сменить предмет, который вы держите в руках. - - Хост вышел из игры. + + Вы можете делать инструменты, которые ускорят добычу блоков. Некоторым инструментам нужны ручки, сделанные из палок. Приготовьте несколько палок.{*SticksIcon*} - - Вы не можете присоединиться к этой игре, так как в ней не участвуют ваши друзья. + + Лопата помогает копать мягкие блоки, например, землю и снег. Получая различные материалы, вы сможете изготавливать инструменты, которые будут работать быстрее и служить вам дольше. Создайте деревянную лопату.{*WoodenShovelIcon*} - - Вы не можете присоединиться к этой игре, так как вас исключил хост. + + Чтобы открыть верстак, наведите на него курсор и нажмите{*CONTROLLER_ACTION_USE*}. - - Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более старую версию игры. + + Чтобы поставить верстак, выберите его, наведите курсор на нужное место и используйте{*CONTROLLER_ACTION_USE*}. - - Вы не можете присоединиться к этой игре, так как игрок, к которому вы хотите подключиться использует более новую версию игры. + + Minecraft - игра, в которой можно построить из блоков все что угодно. +По ночам в мир выходят монстры, так что не забудьте заранее возвести убежище. - - Новый мир + + - - Доступна награда! + + - - Ура! Вы получили в награду картинку с изображением Стива из Minecraft! + + - - Ура! Вы получили в награду картинку с изображением крипера! + + - - Получить доступ к полной версии + + - - Вы играете в пробную версию, но сохранить игру можно только в полной версии. -Получить доступ к полной версии игры? + + - - Пожалуйста, подождите... + + - - Нет результатов + + Раскладка 1 - - Фильтр: + + Движение (в полете) - - Друзья + + Игроки/пригласить - - Мой счет + + - - Всего + + Раскладка 3 - - Записи: + + Раскладка 2 - - Ранг + + - - Подготовка к сохранению уровня + + - - Подготовка фрагментов... + + - - Завершение... + + - - Создание поверхности + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы начать обучение.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы готовы играть самостоятельно. - - Короткая симуляция мира + + {*B*}Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить. - - Инициализация сервера + + - - Создание зоны возрождения + + - - Загрузка зоны возрождения + + - - Вход в преисподнюю + + - - Выход из преисподней + + - - Возрождение + + - - Создание уровня + + - - Загрузка уровня + + - - Сохранение игроков + + Блок-чешуйница - - Подключение к хосту + + Каменная плита - - Загрузка поверхности + + Способ компактно хранить железо. - - Переключение на игру вне сети + + Железный блок - - Подождите, пока хост сохраняет игру + + Дубовая плита - - Вход на Край + + Плита из песчаника - - Выход с Края + + Каменная плита - - Кровать занята + + Способ компактно хранить золото. - - Спать можно только ночью + + Цветок - - %s спит на кровати. Чтобы пропустить время до утра, все игроки должны спать на кроватях одновременно. + + Белая шерсть - - В вашем доме не было кровати, или путь к ней был заблокирован + + Оранжевая шерсть - - Вы не можете отдыхать, рядом монстры + + Золотой блок - - Вы спите на кровати. Чтобы пропустить время до утра, все игроки должны спать на кроватях одновременно. + + Гриб - - Инструменты и оружие + + Роза - - Оружие + + Плита из булыжника - - Пища + + Книжная полка - - Здания + + Тротил - - Доспехи + + Кирпичи - - Механизмы + + Факел - - Транспорт + + Обсидиан - - Украшения + + Замшелый камень - - Строительные блоки + + Плита из адского камня - - Красный камень и транспорт + + Плита из дуба - - Другое + + Плита из каменных блоков - - Создание зелья + + Плита из кирпича - - Инструменты, оружие и доспехи + + Плита из дерева джунглей - - Материалы + + Плита из березы - - Пользователь вышел из игры + + Плита из ели - - Уровень сложности + + Пурпурная шерсть - - Музыка + + Березовые листья - - Звук + + Еловые иголки - - Гамма + + Дубовые листья - - В игре + + Стекло - - В интерфейсе + + Губка - - Мирный + + Листья дерева джунглей - - Легкий + + Листья - - Обычный + + Дуб - - Высокий + + Ель - - В этом режиме здоровье игрока постепенно восстанавливается, а врагов в мире нет. + + Береза - - В этом режиме в мире появляются враги, но они наносят игроку меньше урона, чем на обычном уровне сложности. + + Еловое полено - - В этом режиме в мире появляются враги, наносящие игрокам стандартные повреждения. + + Березовое полено - - В этом режиме в мире появляются враги, наносящие игрокам серьезные повреждения. Остерегайтесь криперов: они могут начать атаку-взрыв, даже если вы отойдете от них! + + Полено из дерева джунглей - - Тайм-аут пробной версии + + Шерсть - - Игра переполнена + + Розовая шерсть - - Не удалось присоединиться к игре, так как в ней нет свободных мест + + Серая шерсть - - Текст на табличке + + Светло-серая шерсть - - Введите текст вашей таблички + + Голубая шерсть - - Заголовок + + Желтая шерсть - - Введите заголовок вашего сообщения + + Светло-зеленая шерсть - - Подпись + + Бирюзовая шерсть - - Введите подпись вашего сообщения + + Зеленая шерсть - - Описание + + Красная шерсть - - Введите описание вашего сообщение + + Черная шерсть - - Инвентарь + + Лиловая шерсть - - Ингредиенты + + Синяя шерсть - - Варочная стойка + + Коричневая шерсть - - Сундук + + Факел (уголь) - - Зачаровать + + Сияющий камень - - Печь + + Песок души - - Ингредиент + + Адский камень - - Топливо + + Блок ляпис-лазури - - Распределитель + + Лазуритовая руда - - Для этой игры сейчас нет загружаемого контента данного типа. + + Портал - - %s присоединяется к игре. + + Фонарь из тыквы - - %s покидает игру. + + Сахарный тростник - - %s исключается из игры. + + Глина - - Удалить эту сохраненную игру? + + Кактус - - Ожидает проверки + + Тыква - - Отклонено + + Забор - - Играет: + + Музыкальный автомат - - Сбросить настройки + + Способ компактно хранить ляпис-лазурь. - - Вернуть настройки к значениям по умолчанию? + + Люк - - Ошибка при загрузке + + Запертый сундук - - Игра пользователя %s + + Диод - - Игра неизвестного хоста + + Липкий поршень - - Гость вышел + + Поршень - - Игрок-гость вышел из игры, в результате чего все игроки-гости удалены из игры. + + Шерсть (любого цвета) - - Войти + + Засохший куст - - В эту игру невозможно играть, не войдя в систему. Войти? + + Торт - - Сетевая игра не разрешена + + Нотный блок - - Не удалось создать игру + + Раздатчик - - Автовыбор + + Высокая трава - - Стандартные скины + + Паутина - - Любимые скины + + Кровать - - Запрещенный уровень + + Лед - - Игра, к которой вы присоединяетесь, находится в вашем списке запрещенных уровней. Если вы к ней присоединитесь, она будет удалена из списка запрещенных. + + Верстак - - Запретить этот уровень? + + Способ компактно хранить алмазы. - - Добавить этот уровень к списку запрещенных? -Выбрав "ОК", вы, кроме того, выйдете из игры. + + Алмазный блок - - Удалить из черного списка + + Печь - - Сохранять каждые + + Грядка - - Автосохранение: выкл. + + Урожай - - мин. + + Алмазная руда - - Здесь нельзя! + + Источник монстров - - Размещать лаву рядом с точкой возрождения не разрешается, так как в этом случае высока вероятность мгновенной гибели возрождающихся игроков. + + Огонь - - Прозрач. интерфейса + + Факел (древ. уголь) - - Подготовка к автосохранению уровня + + Красная пыль - - Размер интерфейса + + Сундук - - Размер и-фейса (разд. экран) + + Дубовая лестница - - Число-затравка + + Табличка - - Получить доступ к набору скинов + + Красная руда - - Прежде чем использовать этот набор скинов, необходимо получить к нему доступ. -Получить к нему доступ сейчас? + + Железная дверь - - Получить доступ к набору текстур + + Нажимная плита - - Прежде чем использовать этот набор текстур, необходимо получить к нему доступ. -Получить к нему доступ сейчас? + + Снег - - Набор текстур пробной версии + + Кнопка - - Вы используете набор текстур пробной версии. Вы не сможете сохранить этот мир, пока не получите доступ к полной версии. -Получить доступ к полной версии набора текстур? + + Красный факел - - Нет набора текстур + + Рычаг - - Получить доступ к полной версии + + Рельсы - - Загрузить пробную версию + + Лестница - - Загрузить полную версию + + Деревянная дверь - - В этом мире использован смешанный набор или набор текстур, которого у вас нет! -Установить смешанный набор или набор текстур? + + Каменная лестница - - Получить пробную версию + + Рельсы с детектором - - Получить полную версию + + Рельсы под напряжением - - Исключить игрока + + У вас достаточно булыжников, чтобы сложить печь. Для этого воспользуйтесь верстаком. - - Исключить игрока из игры? Он не сможет присоединиться до тех пор, пока вы не перегрузите мир заново. + + Удочка - - Наборы картинок игрока + + Часы - - Темы + + Сияющая пыль - - Наборы скинов + + Вагонетка с печкой - - Пускать друзей друзей + + Яйцо - - Вы не можете присоединиться к игре, так как в ней могут участвовать только друзья хоста. + + Компас - - Невозможно присоединиться к игре + + Сырая рыба - - Выбрано + + Краска "Красная роза" - - Выбранный скин: + + Кактусовый зеленый - - Загружаемый контент поврежден + + Какао-бобы - - Этот загружаемый контент поврежден, использовать его невозможно. Удалите его и заново установите из меню магазина Minecraft. + + Готовая рыба - - Часть загружаемого контента повреждена и не может быть использована. Удалите этот загружаемый контент, а затем заново установите из меню магазина Minecraft. + + Сухая краска - - Режим игры изменен + + Чернильный мешок - - Изменить название мира + + Вагонетка с сундуком - - Введите новое название мира + + Снежок - - Режим игры: Выживание + + Лодка - - Режим игры: Творчество + + Кожа - - Выживание + + Вагонетка - - Творчество + + Седло - - Создано в режиме "Выживание" + + Красный камень - - Создано в режиме "Творчество" + + Ведро с молоком - - Отображать облака + + Бумага - - Что вы хотите сделать с этим сохранением? + + Книга - - Переименовать файл + + Комок слизи - - Автосохранение через %d... + + Кирпич - - Вкл. + + Глина - - Выкл. + + Сахарный тростник - - Нормальный + + Ляпис-лазурь - - Суперплоский + + Карта - - Выберите, чтобы игра была сетевой. + + Музыкальный диск "13" - - Выберите, чтобы к игре могли присоединиться только приглашенные. + + Музыкальный диск "Кошка" - - Выберите, чтобы к игре могли присоединиться друзья ваших друзей. + + Кровать - - Выберите, чтобы игроки могли причинять урон друг другу. Действует только в режиме "Выживание". + + Красный ретранслятор - - Отключите, и игроки не смогут строить или добывать руду без разрешения. + + Печенье - - Выберите, чтобы огонь распространялся на соседние горючие блоки. + + Музыкальный диск "Блоки" - - Выберите, чтобы после активации тротил взрывался. + + Музыкальный диск "Меллохи" - - Выберите, чтобы создать преисподнюю заново. Это полезно, если у вас старое сохранение, в котором нет адских крепостей. + + Музыкальный диск "Шталь" - - Выберите, чтобы в мире появились такие структуры, как деревни и крепости. + + Музыкальный диск "Штрад" - - Выберите, чтобы и верхний мир, и преисподняя были совершенно плоскими. + + Музыкальный диск "Щебет" - - Выберите, чтобы рядом с точкой спауна игроков появился сундук с полезными предметами. + + Музыкальный диск "Даль" - - Наборы скинов + + Музыкальный диск "Молл" - - Темы + + Торт - - Картинки игрока + + Серая краска - - Предметы аватара + + Розовая краска - - Наборы текстур + + Светло-зеленая краска - - Смешанные наборы + + Лиловая краска - - Игрок {*PLAYER*} вспыхнул + + Бирюзовая краска - - Игрок {*PLAYER*} сгорел + + Светло-серая краска - - Игрок {*PLAYER*} пытался плавать в лаве + + Одуванчиковый желтый - - Игрок {*PLAYER*} задохнулся в стене + + Костная мука - - Игрок {*PLAYER*} утонул + + Кость - - Игрок {*PLAYER*} умер с голода + + Сахар - - Игрок {*PLAYER*} был заколот до смерти + + Голубая краска - - Игрок {*PLAYER*} плохо приземлился + + Пурпурная краска - - Игрок {*PLAYER*} выпал за пределы мира + + Оранжевая краска - - Игрок {*PLAYER*} умер + + Табличка - - Игрок {*PLAYER*} взорвался + + Кожаная куртка - - Игрок {*PLAYER*} убит магией + + Железный нагрудник - - Игрок {*PLAYER*} убит дыханием дракона Края + + Алмазный нагрудник - - Игрока {*PLAYER*} убил {*SOURCE*} + + Железный шлем - - Игрока {*PLAYER*} убил {*SOURCE*} + + Алмазный шлем - - Игрока {*PLAYER*} застрелил {*SOURCE*} + + Золотой шлем - - {*SOURCE*} убил {*PLAYER*} с помощью огненного шара + + Золотой нагрудник - - {*SOURCE*} убивает игрока {*PLAYER*} в рукопашной + + Золотые поножи - - Игрока {*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*}Иногда ему казалось, что он человек, живущий на тонкой корочке вращающегося шарика из расплавленной лавы. Этот шар из расплавленной лавы летал вокруг шара из раскаленного газа, который был в триста пятьдесят тысяч раз тяжелее его. Они были так далеко друг от друга, что свету требовалось восемь минут на то, чтобы преодолеть это расстояние. Этот свет был информацией, которую посылала звезда, и она могла прожечь кожу с расстояния в сто пятьдесят миллионов километров.{*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*}И игрок стал новой историей, еще не рассказанной, которая была записана буквами ДНК. И игрок был новой программой, которую еще никогда не запускали - ее создал код, которому уже миллиард лет. И игрок стал новым человеком, который еще никогда не жил, он был сделан из молока и любви.{*EF*}{*B*}{*B*} -{*C3*}Этот игрок - ты. История. Программа. Человек. Сделанный из молока и любви.{*EF*}{*B*}{*B*} -{*C2*}Давай вернемся еще дальше назад.{*EF*}{*B*}{*B*} -{*C2*}Семь миллиардов миллиардов миллиардов атомов тела игрока были созданы задолго до этой игры в сердце звезды. Поэтому игрок - тоже информация звезды. И игрок движется по сюжету истории, которая представляет собой лес информации, который посадил человек по имени Джулиан на плоском, бесконечном мире, созданном человеком по имени Маркус, и этот мир находится внутри маленького, личного мира, созданного игроком, который живет во вселенной, созданной...{*EF*}{*B*}{*B*} -{*C3*}Тише. Иногда игрок создавал теплый, мягкий и простой мир. А иногда твердый, холодный и сложный. Иногда он создавал в своей голове модель вселенной - крупицы энергии, движущиеся в огромном пустом пространстве. Иногда он называл эти крупицы "электронами" и "протонами".{*EF*}{*B*}{*B*} - + + Ведро с лавой - - {*C2*}Иногда он называл их "планетами" и "звездами".{*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*} -{*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*} - + + Золотые сапоги - - Перегрузить преисподнюю + + Железный слиток - - Вернуть преисподнюю в этом сохранении к исходному состоянию? Вы потеряете все, что в ней построили! + + Золотой слиток - - Перегрузить преисподнюю + + Кремень и огниво - - Не перегружать преисподнюю + + Уголь - - Сейчас нельзя подстричь эту гриборову. Достигнуто максимальное число свиней, овец, гриборов и кошек. + + Древесный уголь - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число свиней, овец, коров и кошек. + + Алмаз - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число гриборов. + + Яблоко - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число волков. + + Лук - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число кур. + + Стрела - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число кальмаров. + + Музыкальный диск "Вард" - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число врагов. + + + Нажимайте{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*}, чтобы перейти к группе, к которой относится нужный предмет. Выберите группу зданий.{*StructuresIcon*} + - - Невозможно использовать яйцо возрождения. Достигнуто максимальное число крестьян. + + + Нажимайте{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*}, чтобы перейти к группе, к которой относится нужный предмет. Выберите группу инструментов.{*ToolsIcon*} + - - Достигнуто максимальное число картин/рамок. + + + Теперь у вас есть верстак; поставьте его, и у вас появится возможность создавать еще больше разных предметов.{*B*} + Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания предметов. + - - Вы не можете создавать врагов в мирном режиме. + + + Вы создали несколько отличных инструментов, и теперь сможете более эффективно добывать материалы.{*B*} + Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания предметов. + - - Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся свиней, овец, коров и кошек. + + + Создание многих предметов состоит из нескольких этапов. Теперь, когда у вас есть доски, вы можете изготовить новые предметы. +Чтобы перейти к предмету, который вы хотите создать, используйте{*CONTROLLER_MENU_NAVIGATE*}. Выберите верстак.{*CraftingTableIcon*} + - - Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся волков. + + + Выберите предмет, который хотите создать, с помощью{*CONTROLLER_MENU_NAVIGATE*}. У некоторых предметов есть разные варианты - в зависимости от использованных материалов. Выберите деревянную лопату.{*WoodenShovelIcon*} + - - Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся кур. + + Собранное вами дерево можно превратить в доски. Выберите значок досок и нажмите{*CONTROLLER_VK_A*}, чтобы их создать.{*PlanksIcon*} - - Это животное не может перейти в режим любви. Достигнуто максимальное число размножающихся гриборов. + + + Верстак увеличивает число предметов, которые можно создать. На верстаке работа идет, как обычно, но у вас больше рабочего пространства и больше доступных ингредиентов. + - - Достигнуто максимальное число лодок. + + + На экране создания предметов указаны все ингредиенты, необходимые для изготовления нового предмета. Нажмите{*CONTROLLER_VK_A*}, чтобы создать предмет и отправить его в инвентарь. + - - Достигнуто максимальное число голов мобов. + + + Пролистайте закладки с помощью{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*}, чтобы выбрать нужную группу предметов, а затем выберите в ней предмет, который хотите создать, с помощью{*CONTROLLER_MENU_NAVIGATE*}. + - - Инверт. обзор + + + Вы видите список ингредиентов, необходимых для создания выбранного предмета. + - - Левша + + + Вы видите описание выбранного предмета. Оно даст некоторое представление о том, как можно использовать данный предмет. + - - Вы умерли! + + + В нижней части верстака показаны предметы в вашем инвентаре, а также дано описание выбранного предмета и перечислены ингредиенты, необходимые для его создания. + - - Возродиться! + + + Некоторые предметы нельзя изготовить на верстаке - для их создания нужна печь. Сделайте ее.{*FurnaceIcon*} + - - Загружаемый контент - предложения + + Гравий - - Изменить скин + + Золотоносная руда - - Обучение + + Железная руда - - Управление + + Лава - - Настройки + + Песок - - Авторы + + Песчаник - - Переустановить контент + + Угольная руда - - Настройки поиска неисправностей + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как работать с печью. + - - Огонь распространяется + + + Это экран печи. Печь позволяет изменять предметы, обжигая их. Например, с ее помощью вы сможете превратить железную руду в железные слитки. + - - Тротил взрывается + + + Поставьте созданную печь. Имеет смысл расположить ее внутри убежища.{*B*} + Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть экран создания предметов. + - - Дуэль + + Древесина + - - Доверять игрокам + + Дубовое полено - - Привилегии хоста + + + Поместите топливо в нижнюю ячейку печи, а предмет, который нужно изменить - в верхнюю. Затем в печи загорится огонь, и она начнет работать. Готовый предмет попадет в ячейку справа. + - - Создавать структуры + + {*B*} + Нажмите{*CONTROLLER_VK_X*}, чтобы снова открыть инвентарь. + - - Суперплоский мир + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете пользоваться инвентарем. + - - Дополнительный сундук + + + Это ваш инвентарь. Здесь показаны предметы, которые можно взять в руку, а также все, что вы несете, включая доспехи. + - - Настройки мира + + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить обучение.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы готовы играть самостоятельно. + - - Можно строить и добывать руду + + + Чтобы бросить предмет, выведите курсор с предметом за пределы экрана предметов. + - - Можно ис-ть двери и переключатели + + + Чтобы поместить предметы в другую ячейку, наведите на нее курсор и нажмите{*CONTROLLER_VK_A*}. + Если на курсоре несколько предметов, используйте{*CONTROLLER_VK_A*}, чтобы положить все, или{*CONTROLLER_VK_X*}, чтобы положить только один. + - - Можно открывать контейнеры + + + Для передвижения курсора используйте{*CONTROLLER_MENU_NAVIGATE*}. Нажмите{*CONTROLLER_VK_A*}, чтобы взять предмет. + Если предметов несколько, вы возьмете их все. Если хотите взять только половину, используйте{*CONTROLLER_VK_X*}. + - - Можно атаковать игроков + + + Вы прошли первую часть обучения. + - - Можно атаковать животных + + Сделайте немного стекла с помощью печи. А пока оно готовится, может, наберете еще материалов и достроите убежище? - - Модератор + + Сделайте немного древесного угля с помощью печи. А пока он готовится, может, наберете еще материалов и достроите убежище? - - Исключить игрока + + Поставьте печь с помощью{*CONTROLLER_ACTION_USE*}, а затем откройте ее. - - Можно летать + + Ночью очень темно, так что в убежище нужно освещение. Создайте факел из палок и угля. Для этого используйте экран создания предметов.{*TorchIcon*} - - Отключить утомление + + Поставьте дверь с помощью{*CONTROLLER_ACTION_USE*}. Открывать и закрывать ее можно с помощью{*CONTROLLER_ACTION_USE*}. - - Невидимость + + У хорошего убежища есть дверь, чтобы можно было легко входить и выходить, не вырубая дыры в стенах. Сделайте деревянную дверь.{*WoodenDoorIcon*} - - Настройки хоста + + + Если вам нужна дополнительная информация о предмете, наведите на него курсор и нажмите{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + - - Игроки/пригласить + + + Это интерфейс создания предметов. Он позволяет объединять собранные предметы, создавая из них новые. + - - Сетевая игра + + + Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть инвентарь в режиме "Творчество". + - - Только по приглашениям + + + Если вам нужна дополнительная информация о предмете, наведите на него курсор и нажмите{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + - - Другие настройки + + {*B*} + Нажмите{*CONTROLLER_VK_X*}, чтобы показать ингредиенты, необходимые для изготовления данного предмета. + - - Загрузить + + {*B*} + Нажмите{*CONTROLLER_VK_X*}, чтобы открыть описание предмета. + - - Новый мир + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как изготавливать предметы. + - - Название мира + + + Пролистайте закладки с помощью{*CONTROLLER_VK_LB*} и{*CONTROLLER_VK_RB*} и выберите нужную группу предметов. + - - Число-затравка для создания мира + + {*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы продолжить.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже умеете пользоваться инвентарем в режиме "Творчество". + - - Пустое поле создаст случайное число + + + Это инвентарь режима "Творчество". В нем показаны предметы, которые можно взять в руки, а также все остальные. + - - Игроки + + + Нажмите{*CONTROLLER_VK_B*}, чтобы закрыть инвентарь. + - - Присоединиться к игре + + + Чтобы бросить предмет, выведите курсор с предметом за пределы экрана предметов. Чтобы выбросить все предметы из панели быстрого выбора, нажмите{*CONTROLLER_VK_X*}. + - - Начать игру + + + Курсор автоматически переместится на ячейку в ряду использования. Вы можете положить предмет с помощью{*CONTROLLER_VK_A*}. После этого курсор вернется в список, и вы сможете выбрать другой предмет. + - - Игры не найдены + + + Для передвижения курсора используйте{*CONTROLLER_MENU_NAVIGATE*}. + Находясь в списке предметов, используйте{*CONTROLLER_VK_A*}, чтобы взять предмет под курсором, и{*CONTROLLER_VK_Y*}, чтобы взять все предметы данного вида. + - - Играть + + Вода - - Списки лидеров + + Стеклянная бутылка - - Помощь и настройки + + Бутылка с водой - - Полная версия + + Глаз паука - - Продолжить игру + + Золотой самородок - - Сохранить игру + + Адская бородавка - - Уровень сложности: + + {*splash*}{*prefix*}зелье {*postfix*} - - Тип игры: + + Ферментир. глаз паука - - Структуры: + + Котел - - Тип уровня: + + Глаз Края - - Дуэль: + + Искрящаяся дыня - - Доверять игрокам: + + Огненный порошок - - Тротил: + + Сливки магмы - - Огонь распространяется: + + Варочная стойка - - Переустановить тему + + Слеза вурдалака - - Переустановить картинку игрока 1 + + Семена тыквы - - Переустановить картинку игрока 2 + + Семена дыни - - Переустановить предмет аватара 1 + + Сырая курятина - - Переустановить предмет аватара 2 + + Музыкальный диск "11" - - Переустановить предмет аватара 3 + + Музыкальный диск "Где мы сейчас" - - Настройки + + Ножницы - - Звук + + Готовая курятина - - Чувств. управления + + Жемчужина Края - - Графика + + Кусок дыни - - Интерфейс + + Огненный жезл - - Вернуть исходные настройки + + Сырая говядина - - "Дрожащая" камера + + Бифштекс - - Подсказки + + Гнилое мясо - - Всплывающие описания + + Бутыль колдовства - - Вертикал. разделенный экран + + Дубовые доски - - Готово + + Еловые доски - - Изменить текст таблички: + + Березовые доски - - Напишите текст, который будет сопровождать ваш скриншот + + Трава - - Подпись + + Земля - - Скриншот из игры + + Булыжник - - Изменить текст таблички: + + Доски (дер. джунглей) - - Классические текстуры, значки и интерфейс Minecraft! + + Саженец березы - - Показать все смешанные миры + + Саженец дерева джунглей - - Без эффектов + + Коренная порода - - Скорость + + Саженец - - Медлительность + + Саженец дуба - - Ускорение + + Саженец ели - - Усталость при добыче руды + + Камень - - Сила + + Рамка - - Слабость + + Возродить существо: {*CREATURE*} - - Мгновенное здоровье + + Адский кирпич - - Мгновенный урон + + Огненный заряд - - Мощные прыжки + + Огн. заряд (др. уголь) - - Тошнота + + Огн. заряд (уголь) - - Регенерация + + Череп - - Сопротивление + + Голова - - Устойчивость к огню + + Голова игрока %s - - Дыхание под водой + + Голова крипера - - Невидимость + + Череп скелета - - Слепота + + Череп иссушенного скелета - - Ночное зрение + + Голова зомби - - Голод + + Способ компактно хранить уголь. Можно использовать в качестве топлива в печи. Яд - - стремительности + + Голод медлительности - - ускорения + + стремительности - - тупости + + Невидимость - - силы + + Дыхание под водой - - слабости + + Ночное зрение - - исцеления + + Слепота урона - - прыгучести + + исцеления тошноты @@ -5228,29 +6138,38 @@ Minecraft - игра, в которой можно построить из бл регенерации - - сопротивления + + тупости - - устойчив. к огню + + ускорения - - дыхания под водой + + слабости + + + силы + + + Устойчивость к огню - - невидимости + + Насыщение - - слепоты + + сопротивления - - ночного зрения + + прыгучести - - голода + + Иссушение - - яда + + Пополнение здоровья + + + Поглощение @@ -5261,29 +6180,41 @@ Minecraft - игра, в которой можно построить из бл III + + невидимости + IV - - Разрывное + + дыхания под водой - - Обычное + + устойчив. к огню - - Неинтересное + + ночного зрения - - Слабое + + яда - - Прозрачное + + голода - - Мутное + + Поглощения - - Разведенное + + насыщения + + + пополнения здоровья + + + слепоты + + + гниения Простое @@ -5291,17 +6222,17 @@ Minecraft - игра, в которой можно построить из бл Разбавленное - - Неудобоваримое + + Разведенное - - Безвкусное + + Прозрачное - - Громоздкое + + Мутное - - Скверное + + Неудобоваримое Жирное @@ -5309,246 +6240,300 @@ Minecraft - игра, в которой можно построить из бл Однородное - - Бархатистое + + Скверное - - Веселящее + + Безвкусное - - Густое + + Громоздкое - - Элегантное + + Слабое - - Замысловатое + + Разрывное - - Очаровательное + + Обычное + + + Неинтересное Потрясающее - - Изысканное - Крепкое + + Очаровательное + + + Элегантное + + + Замысловатое + Игристое + + Противное + + + Грубое + + + Лишенное запаха + Мощное Мерзкое - - Лишенное запаха + + Бархатистое - - Противное + + Изысканное - - Грубое + + Густое - - Едкое + + Веселящее - - Отвратительное + + Постепенно восстанавливает здоровье игроков, животных и монстров. - - Вонючее + + Мгновенно уменьшает здоровье игроков, животных и монстров. - - Основной ингредиент всех зелий. Используйте его в варочной стойке, чтобы создать зелье. + + Делает игроков, животных и монстров неуязвимыми к огню, лаве и дистанционным атакам сполохов. Не обладает собственным эффектом. Используйте в варочной стойке, чтобы создать зелье из нескольких ингредиентов. - - Увеличивает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. + + Едкое Уменьшает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. + + Увеличивает скорость игроков, животных и монстров, а также ускорение, длину прыжка и поле зрения игроков. + Увеличивает урон, который наносят игроки и монстры. + + Мгновенно увеличивает здоровье игроков, животных и монстров. + Уменьшает урон, который наносят игроки и монстры. - - Мгновенно увеличивает здоровье игроков, животных и монстров. + + Основной ингредиент всех зелий. Используйте его в варочной стойке, чтобы создать зелье. - - Мгновенно уменьшает здоровье игроков, животных и монстров. + + Отвратительное - - Постепенно восстанавливает здоровье игроков, животных и монстров. + + Вонючее - - Делает игроков, животных и монстров неуязвимыми к огню, лаве и дистанционным атакам сполохов. + + Сокрушение + + + Острота Постепенно уменьшает здоровье игроков, животных и монстров. - - Острота + + Урон при атаке - - Сокрушение + + Ударная волна Гроза членистоногих - - Ударная волна + + Скорость - - Огонь + + Подкрепления зомби - - Защита + + Сила прыжка лошади + + + При применении: + + + Сопротивление отбрасыванию + + + Дистанция следования монстров + + + Максимум здоровья + + + Легкое прикосновение + + + Эффективность + + + Сродство с водой + + + Удача + + + Грабеж + + + Прочность Защита от огня + + Защита + + + Огонь + Падающее перо - - Защита от взрывов + + Дыхание Защита от стрел - - Дыхание - - - Сродство с водой + + Защита от взрывов - - Эффективность + + IV - - Легкое прикосновение + + V - - Прочность + + VI - - Грабеж + + Удар - - Удача + + VII - - Сила + + III Пламя - - Удар + + Сила Бесконечность - - I - - - II - - - III + + II - - IV + + I - - V + + Активируется, когда движущийся объект задевает присоединенную нить. - - VI + + Активирует присоединенный натяжной переключатель, когда ее задевает движущийся объект. - - VII + + Компактный вариант хранения изумрудов. - - VIII + + Похож на обычный сундук, но с одним исключением: все вещи, положенные в сундук Края, можно достать из любого другого сундука Края, принадлежащего игроку - даже если они находятся в разных измерениях. IX - - X + + VIII Можно добыть железной или более прочной киркой, чтобы получить изумруды. - - Похож на обычный сундук, но с одним исключением: все вещи, положенные в сундук Края, можно достать из любого другого сундука Края, принадлежащего игроку - даже если они находятся в разных измерениях. - - - Активируется, когда движущийся объект задевает присоединенную нить. + + X - - Активирует присоединенный натяжной переключатель, когда ее задевает движущийся объект. + + Восстанавливает 2{*ICON_SHANK_01*}, можно превратить в золотую морковку. Можно высаживать на грядки. - - Компактный вариант хранения изумрудов. + + Используется как украшение. В него можно сажать цветы, саженцы, кактусы и грибы. Стена из булыжника. - - С ее помощью можно чинить оружие, инструменты и доспехи. + + Восстанавливает 0,5{*ICON_SHANK_01*}. Можно запечь в печи или высадить на грядку. Можно расплавить в печи, чтобы получить адский кварц. - - Используется как украшение. + + С ее помощью можно чинить оружие, инструменты и доспехи. Можно использовать для торговли с крестьянами. - - Используется как украшение. В него можно сажать цветы, саженцы, кактусы и грибы. + + Используется как украшение. - - Восстанавливает 2{*ICON_SHANK_01*}, можно превратить в золотую морковку. Можно высаживать на грядки. + + Восстанавливает 4{*ICON_SHANK_01*}. - - Восстанавливает 0,5{*ICON_SHANK_01*}. Можно запечь в печи или высадить на грядку. + + Восстанавливает 1{*ICON_SHANK_01*}. Этой едой можно отравиться. + + + Используется для управления свиньей при езде верхом. Восстанавливает 3{*ICON_SHANK_01*}. Готовится из картошки в печи. - - Восстанавливает 1{*ICON_SHANK_01*}. Можно запечь в печи или высадить на грядку. Этой едой можно отравиться. - Восстанавливает 3{*ICON_SHANK_01*}. Создается из морковки и золотых самородков. - - Используется для управления свиньей при езде верхом. - - - Восстанавливает 4{*ICON_SHANK_01*}. - Используется при зачаровывании оружия, инструментов или доспехов на наковальне. Добывается из руды адского кварца. Может использоваться для создания кварцевого блока. + + Картошка + + + Печеная картошка + + + Морковка + Создается из шерсти, служит украшением. @@ -5558,14 +6543,11 @@ Minecraft - игра, в которой можно построить из бл Цветочный горшок - - Морковка - - - Картошка + + Тыквенный пирог - - Печеная картошка + + Зачарованная книга Ядовитая картошка @@ -5576,11 +6558,11 @@ Minecraft - игра, в которой можно построить из бл Морковка на палке - - Тыквенный пирог + + Натяжной переключатель - - Зачарованная книга + + Нить Адский кварц @@ -5591,11 +6573,8 @@ Minecraft - игра, в которой можно построить из бл Сундук Края - - Натяжной переключатель - - - Нить + + Стена из замш. булыжника Изумрудный блок @@ -5603,8 +6582,8 @@ Minecraft - игра, в которой можно построить из бл Стена из булыжника - - Стена из замш. булыжника + + Картошка Цветочный горшок @@ -5612,8 +6591,8 @@ Minecraft - игра, в которой можно построить из бл Морковки - - Картошка + + Слегка поврежденная наковальня Наковальня @@ -5621,8 +6600,8 @@ Minecraft - игра, в которой можно построить из бл Наковальня - - Слегка поврежденная наковальня + + Кварцевый блок Почти сломанная наковальня @@ -5630,8 +6609,8 @@ Minecraft - игра, в которой можно построить из бл Руда адского кварца - - Кварцевый блок + + Кварцевая лестница Резной кварц. блок @@ -5639,8 +6618,8 @@ Minecraft - игра, в которой можно построить из бл Кварцевый столб - - Кварцевая лестница + + Красный ковер Ковер @@ -5648,8 +6627,8 @@ Minecraft - игра, в которой можно построить из бл Черный ковер - - Красный ковер + + Синий ковер Зеленый ковер @@ -5657,9 +6636,6 @@ Minecraft - игра, в которой можно построить из бл Коричневый ковер - - Синий ковер - Фиолетовый ковер @@ -5672,18 +6648,18 @@ Minecraft - игра, в которой можно построить из бл Серый ковер - - Розовый ковер - Светло-зеленый ковер - - Желтый ковер + + Розовый ковер Голубой ковер + + Желтый ковер + Пурпурный ковер @@ -5696,89 +6672,84 @@ Minecraft - игра, в которой можно построить из бл Резной песчаник - - Гладкий песчаник - {*PLAYER*} погиб, пытаясь нанести урон игроку {*SOURCE*} + + Гладкий песчаник + {*PLAYER*} был раздавлен упавшей наковальней. {*PLAYER*} был раздавлен упавшим блоком. - - {*PLAYER*} был телепортирован к игроку {*DESTINATION*} - {*PLAYER*} телепортировал вас к себе - - {*PLAYER*} телепортировался к вам + + {*PLAYER*} был телепортирован к игроку {*DESTINATION*} Шипы - - Плита из кварца + + {*PLAYER*} телепортировался к вам Делает темные места светлыми, даже под водой. + + Плита из кварца + Делает игроков, животных и монстров невидимыми. Ремонт и переименов. - - Стоимость зачаровывания: %d - Слишком дорого! - - Переименовать + + Стоимость зачаровывания: %d У вас есть: - - Нуж. для торговли + + Переименовать {*VILLAGER_TYPE*} предлагает %s - - Ремонт + + Нуж. для торговли Торговля - - Окраска ошейника + + Ремонт Это окно наковальни. Здесь вы можете чинить и присваивать имена оружию, доспехам или инструментам, а также накладывать на них чары. Все это делается за счет уровней опыта. - - -{*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о том, как использовать наковальню.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать наковальню. - + + Окраска ошейника Чтобы начать работать с предметом, положите его в первую ячейку. - + - Если во вторую ячейку положить правильный материал (например, железные слитки для поврежденного железного меча), то в третьей появится отремонтированный предмет. +{*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о том, как использовать наковальню.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как использовать наковальню. @@ -5786,9 +6757,9 @@ Minecraft - игра, в которой можно построить из бл Кроме того, во вторую ячейку можно положить точно такой же предмет - это позволит скомбинировать два предмета. - + - Чтобы зачаровать предмет с помощью наковальни, положите зачарованную книгу во вторую ячейку. + Если во вторую ячейку положить правильный материал (например, железные слитки для поврежденного железного меча), то в третьей появится отремонтированный предмет. @@ -5796,9 +6767,9 @@ Minecraft - игра, в которой можно построить из бл Под третьей ячейкой вы увидите, сколько уровней опыта вам придется потратить. Если у вас нет достаточного количества уровней, вы не сможете произвести ремонт. - + - Чтобы переименовать предмет, измените текст в соответствующем поле. + Чтобы зачаровать предмет с помощью наковальни, положите зачарованную книгу во вторую ячейку. @@ -5806,9 +6777,9 @@ Minecraft - игра, в которой можно построить из бл Если вы заберете отремонтированный предмет из третьей ячейки, ваш уровень опыта уменьшится на соответствующее значение, а предметы из первой и второй ячеек пропадут из вашего инвентаря. - + - Здесь расположена наковальня и сундук, в котором лежат инструменты и оружие. Вы можете поработать над ними. + Чтобы переименовать предмет, измените текст в соответствующем поле. @@ -5818,9 +6789,9 @@ Minecraft - игра, в которой можно построить из бл Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о наковальне. - + - С помощью наковальни вы можете ремонтировать оружие и предметы, восстанавливая их прочность. Кроме того, вы можете переименовать их или наложить чары с помощью зачарованных книг. + Здесь расположена наковальня и сундук, в котором лежат инструменты и оружие. Вы можете поработать над ними. @@ -5828,9 +6799,9 @@ Minecraft - игра, в которой можно построить из бл Зачарованные книги можно найти в сундуках в подземельях. Кроме того, их можно создать из обычных книг с помощью колдовского стола. - + - Пользуясь наковальней, вы теряете уровни опыта, а также можете повредить ее. + С помощью наковальни вы можете ремонтировать оружие и предметы, восстанавливая их прочность. Кроме того, вы можете переименовать их или наложить чары с помощью зачарованных книг. @@ -5838,9 +6809,9 @@ Minecraft - игра, в которой можно построить из бл Тип необходимой работы, ценность предмета, количество наложенных чар, количество предыдущей работы - все это влияет на стоимость ремонта. - + - Переименование предмета меняет его название, которое видят все игроки, и также навсегда уменьшает затраты, связанные с предыдущей работой. + Пользуясь наковальней, вы теряете уровни опыта, а также можете повредить ее. @@ -5848,9 +6819,9 @@ Minecraft - игра, в которой можно построить из бл В сундуке неподалеку вы найдете поврежденные кирки, материалы, бутыли зачаровывания и зачарованные книги. Поэкспериментируйте с ними. - + - Это окно торговли. Здесь можно обмениваться товарами с крестьянином. + Переименование предмета меняет его название, которое видят все игроки, и также навсегда уменьшает затраты, связанные с предыдущей работой. @@ -5860,9 +6831,9 @@ Minecraft - игра, в которой можно построить из бл Нажмите{*CONTROLLER_VK_B*}, если вы уже знаете, как торговать. - + - Все варианты торговли, интересные крестьянину, показаны в верхней части окна. + Это окно торговли. Здесь можно обмениваться товарами с крестьянином. @@ -5870,9 +6841,9 @@ Minecraft - игра, в которой можно построить из бл Если у вас нет необходимых предметов, товары будут отображаться красными. - + - Количество и тип предметов, которые вы отдаете крестьянину, показаны в двух ячейках слева. + Все варианты торговли, интересные крестьянину, показаны в верхней части окна. @@ -5880,9 +6851,9 @@ Minecraft - игра, в которой можно построить из бл Вы можете увидеть, сколько предметов необходимо для совершения сделки, в двух ячейках слева. - + - Нажмите{*CONTROLLER_VK_A*}, чтобы обменять предметы, нужные крестьянину, на то, что он предлагает. + Количество и тип предметов, которые вы отдаете крестьянину, показаны в двух ячейках слева. @@ -5890,11 +6861,9 @@ Minecraft - игра, в которой можно построить из бл Здесь неподалеку живет крестьянин и стоит сундук. В сундуке вы найдете бумагу, которую сможете обменять на другие предметы. - + -{*B*} - Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о торговле.{*B*} - Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о торговле. + Нажмите{*CONTROLLER_VK_A*}, чтобы обменять предметы, нужные крестьянину, на то, что он предлагает. @@ -5902,14 +6871,21 @@ Minecraft - игра, в которой можно построить из бл Игроки могут продавать предметы из инвентаря крестьянам. - + - От профессии крестьянина зависит список товаров, которые он выставляет на продажу. +{*B*} + Нажмите{*CONTROLLER_VK_A*}, чтобы узнать больше о торговле.{*B*} + Нажмите{*CONTROLLER_VK_B*}, если вы уже все знаете о торговле. После нескольких сделок набор товаров у крестьянина случайным образом обновится. + + + + + От профессии крестьянина зависит список товаров, которые он выставляет на продажу. @@ -6071,7 +7047,4 @@ Minecraft - игра, в которой можно построить из бл Вылечить - - Поиск начального значения для генератора мира - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsPlatformSpecific.xml index ce459ce4..1eb76160 100644 --- a/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/ru-RU/stringsPlatformSpecific.xml @@ -1,244 +1,245 @@  - - NOT USED + + Вы хотите войти в "PSN"? - - Вы можете использовать сенсорный экран на системе PlayStation®Vita для навигации по меню! + + Данный пункт позволяет исключить игрока, система PlayStation®Vita которого отличается от системы хоста. Все остальные игроки, использующие его систему PlayStation®Vita, также будут отключены. Игрок не сможет присоединиться до тех пор, пока игра не будет запущена заново. + - - На форуме Minecraft есть раздел, посвященный версии PlayStation®Vita Edition. + + SELECT - - Самые свежие новости об игре можно узнать в твит-лентах @4JStudios и @Kappische! + + Эта функция отключает обновление призов и списков лидеров для данного мира на время игры. Если эта функция включена во время сохранения, призы и списки лидеров будут отключены и после загрузки данного мира. - - Не смотрите заокраиннику в глаза! + + система PlayStation®Vita - - Нам кажется, что студия 4J Studios удалила Геробрина из версии игры для системы PlayStation®Vita, но мы не уверены. + + Выберите подключение к сети в специальном режиме, чтобы установить соединение с другими системами PlayStation®Vita поблизости, или "PSN", чтобы играть с друзьями по всему миру. - - Minecraft: PlayStation®Vita Edition побила множество рекордов! + + Специальный режим - - {*T3*}ОБУЧЕНИЕ: СЕТЕВАЯ ИГРА{*ETW*}{*B*}{*B*} -Minecraft на системе PlayStation®Vita по умолчанию является сетевой игрой.{*B*}{*B*} -Если вы начинаете сетевую игру или присоединяетесь к ней, вас увидят люди из вашего списка друзей (если при создании игры вы не выбрали параметр "Только по приглашению"). А если ваши друзья присоединятся к игре, тогда ее смогут увидеть и их друзья (если выбран параметр "Пускать друзей друзей").{*B*}Когда вы в игре, нажмите кнопку SELECT, чтобы открыть список пользователей, которые находятся в игре, и исключить кого-то из них. + + Изменить сетевой режим - - {*T3*}ОБУЧЕНИЕ: ПУБЛИКАЦИЯ СКРИНШОТОВ{*ETW*}{*B*}{*B*} -Чтобы сделать скриншот, откройте меню паузы. Нажмите {*CONTROLLER_VK_Y*}, чтобы выложить скриншот в Facebook. На экране появится миниатюрная версия скриншота, и вы сможете изменить текст, который будет сопровождать это сообщение в Facebook.{*B*}{*B*} -В игре есть особый режим камеры, предназначенный для скриншотов. Чтобы поместить своего персонажа в кадр, нажимайте {*CONTROLLER_ACTION_CAMERA*} до тех пор, пока не увидите персонажа, а затем нажмите {*CONTROLLER_VK_Y*}, чтобы выложить скриншот.{*B*}{*B*} -Ваш сетевой идентификатор не будет отображен. + + Выбрать сетевой режим - - {*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*}, чтобы двигаться вправо. + + Сетевые идентификаторы на раздел. экране - - Чтобы летать, быстро дважды нажмите{*CONTROLLER_ACTION_JUMP*}. Если нужно выйти из режима полета, повторите это действие. Чтобы ускориться в полете, быстро дважды наклоните вперед {*CONTROLLER_ACTION_MOVE*}. -Во время полета наклоните вниз и удерживайте{*CONTROLLER_ACTION_JUMP*}, чтобы лететь вверх, {*CONTROLLER_ACTION_SNEAK*}, чтобы лететь вниз, или используйте кнопки направлений, чтобы лететь вверх, вниз, вправо или влево. + + Призы - - NOT USED + + В игре имеется функция автосохранения уровня. Если на экране появляется этот значок, идет сохранение игры. +Пока вы его видите, не выключайте вашу систему PlayStation®Vita. - - NOT USED + + Если эта функция включена, хост может включить или отключить в главном меню полеты, усталость и невидимость. Включение этой функции отключает призы и обновления списков лидеров. - - "NOT USED" + + Сетевые идентификаторы: - - "NOT USED" + + Вы используете пробную версию набора текстур. У вас будет доступ ко всему содержимому набора, но не будет возможности сохранить свою игру. +При попытке сохранения с использованием пробной версии вам будет предложено купить полную версию набора. + - - Пригласить друзей + + Версия 1.04 (обновление 14) - - Если создать, загрузить или сохранить мир в режиме "Творчество", призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить мир в режиме "Выживание". Продолжить? + + Сетевые идентификаторы - - Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. Продолжить? + + Взгляните на мое творение в Minecraft: PlayStation®Vita Edition! - - Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. + + Не удалось завершить загрузку. Повторите попытку позже. - - Если создать, загрузить или сохранить мир со включенными привилегиями хоста, призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить игру, отключив эти параметры. Продолжить? + + Не удалось присоединиться к игре из-за ограничений NAT. Пожалуйста, проверьте настройки сети. - - Соединение с "PSN" потеряно. Сейчас вы вернетесь в главное меню. + + Не удалось завершить передачу. Повторите попытку позже. - - Соединение с "PSN" потеряно. + + Загрузка завершена! - - Это пробная версия игры Minecraft: PlayStation®Vita Edition. Будь у вас полная версия, вы бы только что получили приз! -Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®Vita Edition и играть с друзьями со всего мира посредством "PSN". -Получить доступ к полной версии игры? + + +В настоящий момент в области переноса сохранений нет доступных сохранений. +Вы можете передать сохраненный мир в область переноса сохранений из игры Minecraft: PlayStation®3 Edition, а затем загрузить его в игру Minecraft: PlayStation®Vita Edition. + - - Это пробная версия игры Minecraft: PlayStation®Vita Edition. Будь у вас полная версия, вы бы только что получили тему! -Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®Vita Edition и играть с друзьями со всего мира посредством "PSN". -Получить доступ к полной версии игры? + + Сохранение не завершено - - Это пробная версия игры Minecraft: PlayStation®Vita Edition. Если вы хотите принять это приглашение, необходимо получить доступ к полной версии. -Получить доступ к полной версии игры? + + Игре Minecraft: PlayStation®Vita Edition не хватает места для записи сохранений. Чтобы освободить место, удалите существующие сохранения Minecraft: PlayStation®Vita Edition. - - Игроки-гости не могут получить доступ к полной версии игры. Пожалуйста, зайдите под своей учетной записью в Sony Entertainment Network. + + Передача отменена - - Сетевой идентификатор + + Вы отменили передачу сохраненного мира в область переноса сохранений. - - Создание зелья + + Передать сохранение для PS3™/PS4™ - - Вы вернулись на главный экран, так как вышли из "PSN". - + + Передача данных: %d%% - - Вы играли в пробную версию Minecraft: PlayStation®Vita Edition в течение максимально разрешенного времени. Хотите получить доступ к полной версии игры, чтобы продолжить веселье? + + "PSN" - - Не удалось загрузить игру "Minecraft: PlayStation®Vita Edition". Продолжить загрузку невозможно. + + Загрузить сохранение с PS3™ - - Не удалось присоединиться к игре, так как одному или нескольким игрокам не разрешено участвовать в сетевых играх из-за ограничений чата в учетной записи Sony Entertainment Network. + + Загрузка данных: %d%% - - Не удалось создать сетевую игру, так как одному или нескольким игрокам не разрешено участвовать в сетевых играх из-за ограничений чата в учетной записи Sony Entertainment Network. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. + + Сохранение - - Вам не разрешено присоединиться к этой игре, так сетевые возможности вашей учетной записи Sony Entertainment Network отключены в силу ограничений чата. + + Передача завершена! - - Вам не разрешено присоединиться к этой игре, так как у одного из локальных игроков отключены сетевые возможности учетной записи Sony Entertainment Network в силу ограничений чата. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. + + Вы уверены, что хотите передать это сохранение и заменить текущее сохранение, хранящееся в области переноса сохранений? - - Вам не разрешено создать эту игру, так как у одного из локальных игроков отключены сетевые возможности учетной записи Sony Entertainment Network в силу ограничений чата. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. + + Преобразование данных - - В игре имеется функция автосохранения уровня. Если на экране появляется этот значок, идет сохранение игры. -Пока вы его видите, не выключайте вашу систему PlayStation®Vita. + + NOT USED - - Если эта функция включена, хост может включить или отключить в главном меню полеты, усталость и невидимость. Включение этой функции отключает призы и обновления списков лидеров. + + NOT USED - - Сетевые идентификаторы на раздел. экране + + {*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*}, чтобы двигаться вправо. - - Призы + + Чтобы летать, быстро дважды нажмите{*CONTROLLER_ACTION_JUMP*}. Если нужно выйти из режима полета, повторите это действие. Чтобы ускориться в полете, быстро дважды наклоните вперед {*CONTROLLER_ACTION_MOVE*}. +Во время полета наклоните вниз и удерживайте{*CONTROLLER_ACTION_JUMP*}, чтобы лететь вверх, {*CONTROLLER_ACTION_SNEAK*}, чтобы лететь вниз, или используйте кнопки направлений, чтобы лететь вверх, вниз, вправо или влево. - - Сетевые идентификаторы: + + "NOT USED" - - Сетевые идентификаторы + + Если создать, загрузить или сохранить мир в режиме "Творчество", призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить мир в режиме "Выживание". Продолжить? - - Взгляните на мое творение в Minecraft: PlayStation®Vita Edition! + + Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. Продолжить? - - Вы используете пробную версию набора текстур. У вас будет доступ ко всему содержимому набора, но не будет возможности сохранить свою игру. -При попытке сохранения с использованием пробной версии вам будет предложено купить полную версию набора. - + + "NOT USED" - - Версия 1.04 (обновление 14) + + Пригласить друзей - - SELECT + + На форуме Minecraft есть раздел, посвященный версии PlayStation®Vita Edition. - - Эта функция отключает обновление призов и списков лидеров для данного мира на время игры. Если эта функция включена во время сохранения, призы и списки лидеров будут отключены и после загрузки данного мира. + + Самые свежие новости об игре можно узнать в твит-лентах @4JStudios и @Kappische! - - Вы хотите войти в "PSN"? + + NOT USED - - Данный пункт позволяет исключить игрока, система PlayStation®Vita которого отличается от системы хоста. Все остальные игроки, использующие его систему PlayStation®Vita, также будут отключены. Игрок не сможет присоединиться до тех пор, пока игра не будет запущена заново. - + + Вы можете использовать сенсорный экран на системе PlayStation®Vita для навигации по меню! - - система PlayStation®Vita + + Не смотрите заокраиннику в глаза! - - Изменить сетевой режим + + {*T3*}ОБУЧЕНИЕ: СЕТЕВАЯ ИГРА{*ETW*}{*B*}{*B*} +Minecraft на системе PlayStation®Vita по умолчанию является сетевой игрой.{*B*}{*B*} +Если вы начинаете сетевую игру или присоединяетесь к ней, вас увидят люди из вашего списка друзей (если при создании игры вы не выбрали параметр "Только по приглашению"). А если ваши друзья присоединятся к игре, тогда ее смогут увидеть и их друзья (если выбран параметр "Пускать друзей друзей").{*B*}Когда вы в игре, нажмите кнопку SELECT, чтобы открыть список пользователей, которые находятся в игре, и исключить кого-то из них. - - Выбрать сетевой режим + + {*T3*}ОБУЧЕНИЕ: ПУБЛИКАЦИЯ СКРИНШОТОВ{*ETW*}{*B*}{*B*} +Чтобы сделать скриншот, откройте меню паузы. Нажмите {*CONTROLLER_VK_Y*}, чтобы выложить скриншот в Facebook. На экране появится миниатюрная версия скриншота, и вы сможете изменить текст, который будет сопровождать это сообщение в Facebook.{*B*}{*B*} +В игре есть особый режим камеры, предназначенный для скриншотов. Чтобы поместить своего персонажа в кадр, нажимайте {*CONTROLLER_ACTION_CAMERA*} до тех пор, пока не увидите персонажа, а затем нажмите {*CONTROLLER_VK_Y*}, чтобы выложить скриншот.{*B*}{*B*} +Ваш сетевой идентификатор не будет отображен. - - Выберите подключение к сети в специальном режиме, чтобы установить соединение с другими системами PlayStation®Vita поблизости, или "PSN", чтобы играть с друзьями по всему миру. + + Нам кажется, что студия 4J Studios удалила Геробрина из версии игры для системы PlayStation®Vita, но мы не уверены. - - Специальный режим + + Minecraft: PlayStation®Vita Edition побила множество рекордов! - - "PSN" + + Вы играли в пробную версию Minecraft: PlayStation®Vita Edition в течение максимально разрешенного времени. Хотите получить доступ к полной версии игры, чтобы продолжить веселье? - - Загрузить сохранение с системы Playstation®3 - + + Не удалось загрузить игру "Minecraft: PlayStation®Vita Edition". Продолжить загрузку невозможно. - - Передать сохранение для система PlayStation®3/PlayStation®4 + + Создание зелья - - Передача отменена + + Вы вернулись на главный экран, так как вышли из "PSN". - - Вы отменили передачу сохраненного мира в область переноса сохранений. + + Не удалось присоединиться к игре, так как одному или нескольким игрокам не разрешено участвовать в сетевых играх из-за ограничений чата в учетной записи Sony Entertainment Network. - - Передача данных: %d%% + + Вам не разрешено присоединиться к этой игре, так как у одного из локальных игроков отключены сетевые возможности учетной записи Sony Entertainment Network в силу ограничений чата. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. - - Загрузка данных: %d%% + + Вам не разрешено создать эту игру, так как у одного из локальных игроков отключены сетевые возможности учетной записи Sony Entertainment Network в силу ограничений чата. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. - - Вы уверены, что хотите передать это сохранение и заменить текущее сохранение, хранящееся в области переноса сохранений? + + Не удалось создать сетевую игру, так как одному или нескольким игрокам не разрешено участвовать в сетевых играх из-за ограничений чата в учетной записи Sony Entertainment Network. Снимите метку в окошке "Сетевая игра" в разделе "Другие настройки", чтобы начать игру вне сети. - - Преобразование данных + + Вам не разрешено присоединиться к этой игре, так сетевые возможности вашей учетной записи Sony Entertainment Network отключены в силу ограничений чата. - - Сохранение + + Соединение с "PSN" потеряно. Сейчас вы вернетесь в главное меню. - - Передача завершена! + + Соединение с "PSN" потеряно. - - Не удалось завершить передачу. Повторите попытку позже. + + Этот мир был сохранен в режиме "Творчество", поэтому призы и обновления списка лидеров в нем будут отключены. - - Загрузка завершена! + + Если создать, загрузить или сохранить мир со включенными привилегиями хоста, призы и обновления списка лидеров в нем будут отключены, даже если затем загрузить игру, отключив эти параметры. Продолжить? - - Не удалось завершить загрузку. Повторите попытку позже. + + Это пробная версия игры Minecraft: PlayStation®Vita Edition. Будь у вас полная версия, вы бы только что получили приз! +Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®Vita Edition и играть с друзьями со всего мира посредством "PSN". +Получить доступ к полной версии игры? - - Не удалось присоединиться к игре из-за ограничений NAT. Пожалуйста, проверьте настройки сети. + + Игроки-гости не могут получить доступ к полной версии игры. Пожалуйста, зайдите под своей учетной записью в Sony Entertainment Network. - - - В настоящий момент в области переноса сохранений нет доступных сохранений. - Вы можете передать сохраненный мир в область переноса сохранений из игры Minecraft: PlayStation®3 Edition, а затем загрузить его в игру Minecraft: PlayStation®Vita Edition. - + + Сетевой идентификатор - - Сохранение не завершено + + Это пробная версия игры Minecraft: PlayStation®Vita Edition. Будь у вас полная версия, вы бы только что получили тему! +Получите доступ к полной версии, чтобы наслаждаться Minecraft: PlayStation®Vita Edition и играть с друзьями со всего мира посредством "PSN". +Получить доступ к полной версии игры? - - Игре Minecraft: PlayStation®Vita Edition не хватает места для записи сохранений. Чтобы освободить место, удалите существующие сохранения Minecraft: PlayStation®Vita Edition. + + Это пробная версия игры Minecraft: PlayStation®Vita Edition. Если вы хотите принять это приглашение, необходимо получить доступ к полной версии. +Получить доступ к полной версии игры? + + + Версия файла сохранения в области переноса сохранений пока не поддерживается Minecraft: PlayStation®Vita Edition. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/stringsGeneric.xml index 08baeefd..36b521dd 100644 --- a/Minecraft.Client/PSVitaMedia/loc/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/stringsGeneric.xml @@ -409,87 +409,107 @@ When you attempt to join this level in future, you will be notified that the lev - - {*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*} - {*KICK_PLAYER_DESCRIPTION*}{*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. - + {*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*} + + {*T2*}Daylight Cycle{*ETW*}{*B*} + When disabled, the time of day will not change.{*B*}{*B*} + + {*T2*}Keep Inventory{*ETW*}{*B*} + When enabled, players will keep their inventory when they die.{*B*}{*B*} + + {*T2*}Mob Spawning{*ETW*}{*B*} + When disabled, mobs will not spawn naturally.{*B*}{*B*} + + {*T2*}Mob Griefing{*ETW*}{*B*} + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items.{*B*}{*B*} + + {*T2*}Mob Loot{*ETW*}{*B*} + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder).{*B*}{*B*} + + {*T2*}Tile Drops{*ETW*}{*B*} + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone).{*B*}{*B*} + + {*T2*}Natural Regeneration{*ETW*}{*B*} + When disabled, players will not regenerate health naturally.{*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*} + {*KICK_PLAYER_DESCRIPTION*}{*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. + @@ -584,7 +604,7 @@ When you attempt to join this level in future, you will be notified that the lev {*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 into it to go to The End.{*B*}{*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*} @@ -606,65 +626,116 @@ so they can easily join you. - -{*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*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*} + {*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- Added new items - Hardened Clay, Stained Clay, Block of Coal, Hay Bale, Activator Rail, Block of Redstone, Daylight Sensor, Dropper, Hopper, Minecart with Hopper, Minecart with TNT, Redstone Comparator, Weighted Pressure Plate, Beacon, Trapped Chest, Firework Rocket, Firework Star, Nether Star, Lead, Horse Armor, Name Tag, Horse Spawn Egg{*B*} +- Added new Mobs - Wither, Wither Skeletons, Witches, Bats, Horses, Donkeys and Mules{*B*} +- Added new terrain generation features - Witch Huts.{*B*} +- Added Beacon interface.{*B*} +- Added Horse interface.{*B*} +- Added Hopper interface.{*B*} +- Added Fireworks - Fireworks interface is accessible from the Crafting Table when you have the ingredients to craft a Firework Star or Firework Rocket.{*B*} +- Added 'Adventure Mode' - You can only break blocks with the correct tools.{*B*} +- Added lots of new sounds.{*B*} +- Mobs, items and projectiles can now pass through portals.{*B*} +- Repeaters can now be locked by powering their sides with another Repeater.{*B*} +- Zombies and Skeletons can now spawn with different weapons and armor.{*B*} +- New death messages.{*B*} +- Name mobs with a Name Tag, and rename containers to change the title when the menu is open.{*B*} +- Bonemeal no longer instantly grows everything to full size, and instead randomly grows in stages.{*B*} +- A Redstone signal describing the contents of Chests, Brewing Stands, Dispensers and Jukeboxes can be detected by placing a Redstone Comparator directly against them.{*B*} +- Dispensers can face in any direction.{*B*} +- Eating a Golden Apple gives the player extra "absorption" health for a short period.{*B*} +- The longer you remain in an area the harder the monsters that spawn in that area will 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*} - 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*} - +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*} - Hardened Clay, Stained Clay, Block of Coal, Hay Bale, Activator Rail, Block of Redstone, Daylight Sensor, Dropper, Hopper, Minecart with Hopper, Minecart with TNT, Redstone Comparator, Weighted Pressure Plate, Beacon, Trapped Chest, Firework Rocket, Firework Star, Nether Star, Lead, Horse Armor, Name Tag, Horse Spawn Egg{*B*}{*B*} +{*T1*}New Mobs{*ETB*} - Wither, Wither Skeletons, Witches, Bats, Horses, Donkeys and Mules{*B*}{*B*} +{*T1*}New Features{*ETB*} - Tame and ride a horse, craft fireworks and put on a show, name animals and monsters with a Name Tag, create more advanced Redstone circuits, and new Host Options to help control what guests to your world can do!{*B*}{*B*} +{*T1*}New Tutorial World{*ETB*} – Learn how to use the old and new features in the Tutorial World. See if you can find all the secret Music Discs hidden in the world!{*B*}{*B*} + + + + + Horses + + + + {*T3*}HOW TO PLAY : HORSES{*ETW*}{*B*}{*B*} +Horses and Donkeys are found mainly in open plains. Mules are the offspring of a Donkey and a Horse, but are infertile themselves.{*B*} +All adult Horses, Donkeys and Mules can be ridden. However only Horses can be armored, and only Mules and Donkeys may be equipped with saddlebags for transporting items.{*B*}{*B*} +Horses, Donkeys and Mules must be tamed before they can be used. A horse is tamed by attempting to ride it, and managing to stay on the horse while it attempts to throw the rider off.{*B*} +When Love Hearts appear around the horse, it is tame, and will no longer attempt to throw the player off. To steer a horse, the player must equip the horse with a Saddle.{*B*}{*B*} +Saddles can be bought from villagers or found inside Chests hidden in the world.{*B*} +Tame Donkeys and Mules can be given saddlebags by attaching a Chest. These saddlebags can then be accessed whilst riding or sneaking.{*B*}{*B*} +Horses and Donkeys (but not Mules) can be bred like other animals using Golden Apples or Golden Carrots.{*B*} +Foals will grow into adult horses over time, although feeding them Wheat or Hay will speed this up.{*B*} + + + + + Beacons + + + + {*T3*}HOW TO PLAY : BEACONS{*ETW*}{*B*}{*B*} +Active Beacons project a bright beam of light into the sky and grant powers to nearby players.{*B*} +They are crafted with Glass, Obsidian and Nether Stars, which can be obtained by defeating the Wither.{*B*}{*B*} +Beacons must be placed so that they are in sunlight during the day. Beacons must be placed on Pyramids of Iron, Gold, Emerald or Diamond.{*B*} +The material the Beacon is placed on has no effect on the power of the Beacon.{*B*}{*B*} +In the Beacon menu you can select one primary power for your Beacon. The more tiers your pyramid has the more powers you will have to choose from.{*B*} +A Beacon on a pyramid with at least four tiers also gives the option of either the Regeneration secondary power or a stronger primary power.{*B*}{*B*} +To set the powers of your Beacon you must sacrifice an Emerald, Diamond, Gold or Iron Ingot in the payment slot.{*B*} +Once set, the powers will emanate from the Beacon indefinitely.{*B*} + + + + + Fireworks + + + + {*T3*}HOW TO PLAY : FIREWORKS{*ETW*}{*B*}{*B*} +Fireworks are decorative items that can be launched by hand or from Dispensers. They are crafted using Paper, Gunpowder and optionally a number of Firework Stars.{*B*} +The colors, fade, shape, size, and effects (such as trails and twinkle) of Firework Stars can be customized by including additional ingredients when crafting.{*B*}{*B*} +To craft a Firework place Gunpowder and Paper in the 3x3 crafting grid that is shown above your inventory.{*B*} +You can optionally place multiple Firework Stars in the crafting grid to add them to the Firework.{*B*} +Filling more slots in the crafting grid with Gunpowder will increase the height at which all the Firework Stars will explode.{*B*}{*B*} +You can then take the crafted Firework out of the output slot.{*B*}{*B*} +Firework Stars can be crafted by placing Gunpowder and Dye into the crafting grid.{*B*} + - The Dye will set the color of the explosion of the Firework Star.{*B*} + - The shape of the Firework Star is set by adding either a Fire Charge, Gold Nugget, Feather or Mob Head.{*B*} + - A trail or a twinkle can be added using Diamonds or Glowstone Dust.{*B*}{*B*} +After a Firework Star has been crafted, you can set the fade color of the Firework Star by crafting it with Dye. + + + + + Hoppers + + + + {*T3*}HOW TO PLAY : HOPPERS{*ETW*}{*B*}{*B*} +Hoppers are used to insert or remove items from containers, and to automatically pick up items thrown into them.{*B*} +They can affect Brewing Stands, Chests, Dispensers, Droppers, Minecarts with Chests, Minecarts with Hoppers, as well as other Hoppers.{*B*}{*B*} +Hoppers will continuously attempt to suck items out of a suitable container placed above them. They will also attempt to insert stored items into an output container.{*B*} +If a Hopper is powered by Redstone it will become inactive and stop both sucking and inserting items.{*B*}{*B*} +A Hopper points in the direction it tries to output items. To make a Hopper point to a particular block, place the Hopper against that block whilst sneaking.{*B*} + + + + + Droppers + + + + {*T3*}HOW TO PLAY : DROPPERS{*ETW*}{*B*}{*B*} +When powered by Redstone, Droppers will drop a single random item contained within them onto the ground. Use {*CONTROLLER_ACTION_USE*} to open the Dropper and then you can load the Dropper with items from your inventory.{*B*} +If the Dropper is facing a Chest or another type of Container, the item will be placed into that instead. Long chains of Droppers can be constructed to transport items over a distance, but for this to work they will have to be alternately powered on and off. + @@ -693,100 +764,104 @@ Pumpkin Pie, Night Vision Potion, Invisibility Potion, Nether Quartz, Nether Qua 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. - + + NOT USED + - - Gives the user 3 Armor when worn. - + + NOT USED + - - Gives the user 2 Armor when worn. - + + NOT USED + - - Gives the user 1 Armor when worn. - + + NOT USED + - - Gives the user 2 Armor when worn. - + + Gives the user 1 Armor when worn. + - - Gives the user 5 Armor when worn. - + + Gives the user 3 Armor when worn. + - - Gives the user 4 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 1 Armor when worn. - + + Gives the user 1 Armor when worn. + - - Gives the user 2 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 5 Armor when worn. - + + Gives the user 4 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 2 Armor when worn. + - - Gives the user 5 Armor when worn. - + + Gives the user 6 Armor when worn. + - - Gives the user 3 Armor when worn. - + + Gives the user 5 Armor when worn. + - - Gives the user 1 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 3 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 8 Armor when worn. - + + Gives the user 5 Armor when worn. + - - Gives the user 6 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. + - - 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. @@ -912,6 +987,10 @@ The colors of the bed are always the same, regardless of the colors of wool used Will create an image of an area explored while held. This can be used for path-finding. + + When used becomes a map of the part of the world that you are in, and gets filled in as you explore. + + Allows for ranged attacks by using arrows. @@ -920,6 +999,54 @@ The colors of the bed are always the same, regardless of the colors of wool used Used as ammunition for bows. + + Dropped by the Wither, used in crafting Beacons. + + + + When activated, create colorful explosions. The color, effect, shape and fade are determined by the Firework Star used when the Firework is created. + + + + Used to determine the color, effect and shape of a Firework. + + + + Used in Redstone circuits to maintain, compare, or subtract signal strength, or to measure certain block states. + + + + Is a type of Minecart that acts as a moving TNT block. + + + + Is a block that outputs a Redstone signal based on sunlight (or lack of sunlight). + + + + Is a special type of Minecart that functions similarly to a Hopper. It will collect items lying on tracks and from containers above it. + + + + A special type of Armor that can be equipped to a horse. Provides 5 Armor. + + + + A special type of Armor that can be equipped to a horse. Provides 7 Armor. + + + + A special type of Armor that can be equipped to a horse. Provides 11 Armor. + + + + Used to leash mobs to the player or Fence posts. + + + + Used to name mobs in the world. + + Restores 2.5{*ICON_SHANK_01*}. @@ -1022,7 +1149,7 @@ Can also be used for low-level lighting. - Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. + Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a Minecart. @@ -1566,6 +1693,66 @@ Can also be used for low-level lighting. Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + Used to execute commands. + + + + Projects a beam of light into the sky and can provide Status Effects to nearby players. + + + + Stores blocks and items inside. Place two chest side by side to create a larger chest with double capacity. The trapped chest also creates a Redstone charge when opened. + + + + Provides a Redstone charge. The charge will be stronger if more items are on the plate. + + + + Provides a Redstone charge. The charge will be stronger if more items are on the plate. Requires more weight than the light plate. + + + + Used as a redstone power source. Can be crafted back into Redstone. + + + + Used to catch items or to transfer items into and out of containers. + + + + A type of rail that can enable or disable Minecarts with Hoppers and trigger Minecarts with TNT. + + + + Used to hold and drop items, or push items into another container, when given a Redstone charge. + + + + Colorful blocks crafted by dyeing Hardened clay. + + + + Can be fed to Horses, Donkeys or Mules to heal up to 10 Hearts. Speeds up the growth of foals. + + + + Created by smelting Clay in a furnace. + + + + Crafted from glass and a dye. + + + + Crafted from Stained Glass + + + + A compact way of storing Coal. Can be used as fuel in a Furnace. + + Squid @@ -1754,6 +1941,62 @@ Can also be used for low-level lighting. Appear in Villages to protect them, and can be created using Iron Blocks and Pumpkins. + + Bat + + + + These flying creatures are found in caverns or other large enclosed spaces. + + + + Witch + + + + These enemies can be found in swamps and attack you by throwing Potions. They drop Potions when killed. + + + + Horse + + + + These animals can be tamed and can then be ridden. + + + + Donkey + + + + These animals can be tamed and can then be ridden. They can have a chest attached. + + + + Mule + + + + Born when a Horse and a Donkey breed. These animals can be tamed and can then be ridden and carry chests. + + + + Zombie Horse + + + + Skeleton Horse + + + + Wither + + + + These are crafted from Wither Skulls and Soul Sand. They fire exploding skulls at you. + + Explosives Animator @@ -2446,6 +2689,10 @@ Can also be used for low-level lighting. Map + + Empty Map + + Music Disc - "13" @@ -2650,6 +2897,50 @@ Can also be used for low-level lighting. Creeper Head + + Nether Star + + + + Firework Rocket + + + + Firework Star + + + + Redstone Comparator + + + + Minecart with TNT + + + + Minecart with Hopper + + + + Iron Horse Armor + + + + Gold Horse Armor + + + + Diamond Horse Armor + + + + Lead + + + + Name Tag + + Stone @@ -2682,6 +2973,10 @@ Can also be used for low-level lighting. Jungle Wood Planks + + Wood Planks (any type) + + Sapling @@ -2880,22 +3175,21 @@ Can also be used for low-level lighting. Block of Gold - - - - A compact way of storing Gold. - + - - Block of Iron - + + A compact way of storing Gold. + - - A compact way of storing Iron. - + + A compact way of storing Iron. + + + Block of Iron + - + Stone Slab @@ -3001,14 +3295,13 @@ Can also be used for low-level lighting. Block of Diamond - - - - A compact way of storing Diamonds. - + + + A compact way of storing Diamonds. + - + Crafting Table @@ -3134,14 +3427,13 @@ Can also be used for low-level lighting. Lapis Lazuli Block - - - - A compact way of storing Lapis Lazuli. - + + + A compact way of storing Lapis Lazuli. + - + Dispenser @@ -3357,40 +3649,408 @@ Can also be used for low-level lighting. Skull - - Current Controls + + Command Block - - Layout + + Beacon - - Move/Sprint + + Trapped Chest - - Look + + Weighted Pressure Plate (Light) - - Pause + + Weighted Pressure Plate (Heavy) - - Jump + + Redstone Comparator - - Jump/Fly Up + + Daylight Sensor - - Inventory + + Block of Redstone - - Cycle Held Item + + Hopper + + + + Activator Rail + + + + Dropper + + + + Stained Clay + + + + Hay Bale + + + + Hardened Clay + + + + Block of Coal + + + + Black Stained Clay + + + + Red Stained Clay + + + + Green Stained Clay + + + + Brown Stained Clay + + + + Blue Stained Clay + + + + Purple Stained Clay + + + + Cyan Stained Clay + + + + Light Gray Stained Clay + + + + Gray Stained Clay + + + + Pink Stained Clay + + + + Lime Stained Clay + + + + Yellow Stained Clay + + + + Light Blue Stained Clay + + + + Magenta Stained Clay + + + + Orange Stained Clay + + + + White Stained Clay + + + + Stained Glass + + + + Black Stained Glass + + + + Red Stained Glass + + + + Green Stained Glass + + + + Brown Stained Glass + + + + Blue Stained Glass + + + + Purple Stained Glass + + + + Cyan Stained Glass + + + + Light Gray Stained Glass + + + + Gray Stained Glass + + + + Pink Stained Glass + + + + Lime Stained Glass + + + + Yellow Stained Glass + + + + Light Blue Stained Glass + + + + Magenta Stained Glass + + + + Orange Stained Glass + + + + White Stained Glass + + + + Stained Glass Pane + + + + Black Stained Glass Pane + + + + Red Stained Glass Pane + + + + Green Stained Glass Pane + + + + Brown Stained Glass Pane + + + + Blue Stained Glass Pane + + + + Purple Stained Glass Pane + + + + Cyan Stained Glass Pane + + + + Light Gray Stained Glass Pane + + + + Gray Stained Glass Pane + + + + Pink Stained Glass Pane + + + + Lime Stained Glass Pane + + + + Yellow Stained Glass Pane + + + + Light Blue Stained Glass Pane + + + + Magenta Stained Glass Pane + + + + Orange Stained Glass Pane + + + + White Stained Glass Pane + + + + Small Ball + + + + Large Ball + + + + Star-shaped + + + + Creeper-shaped + + + + Burst + + + + Unknown Shape + + + + Black + + + + Red + + + + Green + + + + Brown + + + + Blue + + + + Purple + + + + Cyan + + + + Light Gray + + + + Gray + + + + Pink + + + + Lime + + + + Yellow + + + + Light Blue + + + + Magenta + + + + Orange + + + + White + + + + Custom + + + + Fade to + + + + Twinkle + + + + Trail + + + + Flight Duration: + + + + Current Controls + + + + Layout + + + + Move/Sprint + + + + Look + + + + Pause + + + + Jump + + + + Jump/Fly Up + + + + Inventory + + + + Cycle Held Item @@ -3527,7 +4187,7 @@ Can also be used for low-level lighting. {*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. +Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. @@ -3565,7 +4225,7 @@ At night monsters come out, make sure to build a shelter before that happens. As you collect and craft more items, your inventory will fill up.{*B*} - Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. +Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. @@ -3629,21 +4289,15 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. - + 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. - + 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. - + 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. @@ -3679,179 +4333,128 @@ At night monsters come out, make sure to build a shelter before that happens. - - You have completed the first part of the tutorial. - + 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. - + {*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. - + 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. - +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. - + 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. - + 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 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_BACK*} . - + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Press{*CONTROLLER_VK_B*} now to exit the inventory. - + 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. - + 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. - +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. - + 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. - + 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*}. - + 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. - + 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_BACK*} . - + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Press{*CONTROLLER_VK_B*} now to exit the creative mode inventory. - + 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. - + 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_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. - +Press{*CONTROLLER_VK_X*} to show the item description. {*B*} - Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. - +Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. {*B*} - Press{*CONTROLLER_VK_X*} to show the inventory again. - +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. - + 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. - + 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. - + 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 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 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 list of ingredients required to craft the selected item are now displayed. @@ -3859,516 +4462,356 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. - + 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 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*} - + 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*} - + 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*} - + 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. - + 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*} - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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*}. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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*} - + 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. - +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*} - + 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 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*} - + 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. - + {*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*} - + 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*} - + 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. - + {*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*} - + 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*} - + 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*} - + 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*} - + 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. - + {*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*} - + 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*} - + 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. - + 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. - + {*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. - + 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. - + 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 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*} - + 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*} - + 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 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! - + 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. - + {*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. - + 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 Obsidian 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 activate a Nether Portal, set fire to the Obsidian 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. - + 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 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. - + 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. - + 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. - + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Creative mode.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Creative mode. @@ -4388,17 +4831,13 @@ At night monsters come out, make sure to build a shelter before that happens. - - In this area a farm has been set up. Farming enables you to create a renewable source of food and other items. - + 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. - + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about farming.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about farming. @@ -4413,207 +4852,411 @@ At night monsters come out, make sure to build a shelter before that happens.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. + + 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. + + + + This is the horse inventory interface. + + + + {*B*}Press{*CONTROLLER_VK_A*} to continue. +{*B*}Press{*CONTROLLER_VK_B*} if you already know how to use the horse inventory. + + + + The horse inventory allows you to transfer, or equip items to your Horse, Donkey or Mule. + + + + Saddle your Horse by placing a Saddle in the saddle slot. Horses can be given armor by placing Horse Armor in the armor slot. + + + + You can also transfer items between your own inventory and the saddlebags strapped to Donkeys and Mules in this menu. + + + + You have found a Horse. + + + + You have found a Donkey. + + + + You have found a Mule. - - 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*} + + {*B*}Press{*CONTROLLER_VK_A*} to learn more about Horses, Donkeys and Mules. +{*B*}Press{*CONTROLLER_VK_B*} if you already know about Horses, Donkeys and Mules. - - 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*} + + Horses and Donkeys are found mainly in open plains. Mules can be bred from a Donkey and a Horse, but are infertile themselves. - - Mushrooms should be planted in a dimly lit area, and will spread to nearby dimly lit blocks.{*ICON*}39{*/ICON*} + + All adult Horses, Donkeys and Mules can be ridden. However only Horses can be armored, and only Mules and Donkeys may be equipped with saddlebags for transporting items. - - Bonemeal can be used to grow crops to their fully grown state, or grow Mushrooms into Huge Mushrooms.{*ICON*}351:15{*/ICON*} + + Horses, Donkeys and Mules must be tamed before they can be used. A horse is tamed by attempting to ride it, and managing to stay on the horse while it attempts to throw the rider off. - - You have now completed the farming tutorial. + + When tamed Love Hearts will appear around them and they will no longer buck the player off. - - - In this area animals have been penned in. You can breed animals to produce baby versions of themselves. - + + Try to ride this horse now. Use {*CONTROLLER_ACTION_USE*} with no items or tools in your hand to mount it. - - - {*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 steer a horse they must then be equipped with a saddle, which can be bought from villagers or found inside chests hidden in the world. - - To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'. + + Tame Donkeys and Mules can be given saddlebags by attaching a chest. These bags can be accessed whilst riding or when sneaking. - - 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. + + Horses and Donkeys (but not Mules) can be bred like other animals using Golden Apples or Golden Carrots. Foals will grow into adult horses over time, although feeding them wheat or hay will speed this up. - - 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. + + You can try to tame the Horses and Donkeys here, and there are Saddles, Horse Armor and other useful items for Horses in chests around here too. - - After being in Love Mode, an animal will not be able to enter it again for about five minutes. + + This is the Beacon interface, which you can use to choose powers for your Beacon to grant. - - 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*} + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the Beacon interface. - - - 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. - + + In the Beacon menu you can select 1 primary power for your Beacon. The more tiers your pyramid has the more powers you will have to choose from. - - You have now completed the animal and breeding tutorial. + + A Beacon on a pyramid with at least 4 tiers grants an additional option of either the Regeneration secondary power or a stronger primary power. - - - In this area are some pumpkins and blocks to make a Snow Golem and an Iron Golem. - + + To set the powers of your Beacon you must sacrifice an Emerald, Diamond, Gold or Iron Ingot in the payment slot. Once set, the powers will emanate from the Beacon indefinitely. - - - {*B*} - Press{*CONTROLLER_VK_A*} to learn more about Golems.{*B*} - Press{*CONTROLLER_VK_B*} if you already know about Golems. - + + At the top of this pyramid there is an inactivate Beacon. - - Golems are created by placing a pumpkin on top of a stack of blocks. + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Beacons.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Beacons. - - 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. + + Active Beacons project a bright beam of light into the sky and grant powers to nearby players. They are crafted with Glass, Obsidian and Nether Stars, which can be obtained by defeating the Wither. - - 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. + + Beacons must be placed so that they are in sunlight during the day. Beacons must be placed on Pyramids of Iron, Gold, Emerald or Diamond. However the choice of material has no effect on the power of the beacon. - - Iron Golems also appear naturally to protect villages, and will attack you if you attack any villagers. + + Try using the Beacon to set the powers it grants, you can use the Iron Ingots provided as the necessary payment. - - You cannot leave this area until you have completed the tutorial. + + This room contains Hoppers - - Different tools are better for different materials. You should use a shovel to mine soft materials like earth and sand. + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Hoppers.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Hoppers. - - Different tools are better for different materials. You should use an axe to chop tree trunks. + + Hoppers are used to insert or remove items from containers, and to automatically pick-up items thrown into them. - - 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. + + They can affect Brewing Stands, Chests, Dispensers, Droppers, Minecarts with Chests, Minecarts with Hoppers, as well as other Hoppers. - - Certain tools are better for attacking enemies. Consider using a sword to attack. + + Hoppers will continuously attempt to suck items out of suitable container placed above them. It will also attempt to insert stored items into an output container. - - 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... + + However if a Hopper is powered by Redstone it will become inactive and stop both sucking and inserting items. - - 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. + + A Hopper points in the direction it tries to output items. To make a Hopper point to a particular block, place the Hopper against that block whilst sneaking. - - Hold{*CONTROLLER_ACTION_JUMP*} to swim up. + + There are various useful Hopper layouts for you to see and experiment with in this room. - - 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. + + This is the Firework interface, which you can use to craft Fireworks and Firework Stars. - - 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. + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the Firework interface. - - 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. + + To craft a Firework, place Gunpowder and Paper in the 3x3 crafting grid that is shown above your inventory. - - This more advanced piston mechanism creates a self-repairing bridge! Push the button to activate, then investigate how the components interact to learn more. + + You can optionally place multiple Firework Stars in the crafting grid to add them to the Firework. - - If you move the pointer outside of the interface while carrying an item, you can drop that item. + + Filling more slots in the crafting grid with Gunpowder will increase the height at which all the Firework Stars will explode. - - 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. + + You can then take the crafted Firework out of the output slot when you wish to craft it. - - - 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! - + + Firework Stars can be crafted by placing Gunpowder and Dye into the crafting grid. - - {*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. + + The Dye will set the color of the explosion of the Firework Star. - - Reminder: + + The shape of the Firework Star is set by adding either a Fire Charge, Gold Nugget, Feather or Mob Head. - - + + A trail or a twinkle can be added using Diamonds or Glowstone Dust. - - New features have been added to the game in the latest version, including new areas in the tutorial world. + + After a Firework Star has been crafted, you can set the fade color of the Firework Star by crafting it with Dye. - - {*B*}Press{*CONTROLLER_VK_A*} to play through the tutorial as normal.{*B*} - Press{*CONTROLLER_VK_B*} to skip the main tutorial. + + Contained within the chests here there are various items used in the creation of FIREWORKS! - - In this area you will find areas setup to help you learn about fishing, boats, pistons and redstone. + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Fireworks. {*B*} +Press{*CONTROLLER_VK_B*} if you already know about Fireworks. - - Outside of this area you will find examples of buildings, farming, minecarts and tracks, enchanting, brewing, trading, smithing and more! + + Fireworks are decorative items that can be launched by hand or from Dispensers. They are crafted using Paper, Gunpowder and optionally a number of Firework Stars. - - - Your food bar has depleted to a level where you will no longer heal. - + + The colors, fade, shape, size, and effects (such as trails and twinkles) of Firework Stars can be customized by including additional ingredients when crafting. - - - {*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. - + + Try crafting a Firework at the Crafting Table using an assortment of ingredients from the chests. @@ -5032,6 +5675,38 @@ At night monsters come out, make sure to build a shelter before that happens.Clear All Slots + + Mount + + + + Dismount + + + + Attach Chest + + + + Launch + + + + Leash + + + + Release + + + + Attach + + + + Name + + OK @@ -5329,6 +6004,10 @@ Would you like to unlock the full game now? Leaving The END + + Finding Seed for the World Generator + + This bed is occupied @@ -5549,6 +6228,34 @@ Would you like to unlock the full game now? Dispenser + + Horse + + + + Dropper + + + + Hopper + + + + Beacon + + + + Primary Power + + + + Secondary Power + + + + Minecart + + There are no downloadable content offers of this type available for this title at the moment. @@ -5827,6 +6534,10 @@ Would you like to install the mash-up pack or texture pack now? Game Mode: Creative + + Game Mode: Adventure + + Survival @@ -5835,6 +6546,10 @@ Would you like to install the mash-up pack or texture pack now? Creative + + Adventure + + Created in Survival Mode @@ -5875,6 +6590,10 @@ Would you like to install the mash-up pack or texture pack now? Superflat + + Enter a seed to generate the same terrain again. Leave blank for a random world. + + When enabled, the game will be an online game. @@ -5919,6 +6638,34 @@ Would you like to install the mash-up pack or texture pack now? When enabled, a chest containing some useful items will be created near the player spawn point. + + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items. + + + + When enabled, players will keep their inventory when they die. + + + + When disabled, mobs will not spawn naturally. + + + + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder). + + + + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone). + + + + When disabled, players will not regenerate health naturally. + + + + When disabled, the time of day will not change. + + Skin Packs @@ -6016,7 +6763,91 @@ Would you like to install the mash-up pack or texture pack now? - {*PLAYER*} was killed by {*SOURCE*} + {*PLAYER*} was killed by {*SOURCE*} using magic + + + + {*PLAYER*} fell off a ladder + + + + {*PLAYER*} fell off some vines + + + + {*PLAYER*} fell out of the water + + + + {*PLAYER*} fell from a high place + + + + {*PLAYER*} was doomed to fall by {*SOURCE*} + + + + {*PLAYER*} was doomed to fall by {*SOURCE*} + + + + {*PLAYER*} was doomed to fall by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} fell too far and was finished by {*SOURCE*} + + + + {*PLAYER*} fell too far and was finished by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} walked into fire whilst fighting {*SOURCE*} + + + + {*PLAYER*} was burnt to a crisp whilst fighting {*SOURCE*} + + + + {*PLAYER*} tried to swim in lava to escape {*SOURCE*} + + + + {*PLAYER*} drowned whilst trying to escape {*SOURCE*} + + + + {*PLAYER*} walked into a cactus whilst trying to escape {*SOURCE*} + + + + {*PLAYER*} was blown up by {*SOURCE*} + + + + {*PLAYER*} withered away + + + + {*PLAYER*} was slain by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} was shot by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} was fireballed by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} was pummeled by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} was killed by {*SOURCE*} using {*ITEM*} @@ -6263,11 +7094,11 @@ Would you like to install the mash-up pack or texture pack now? - Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows and Cats has been reached. + Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows, Cats and Horses 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 Pigs, Sheep, Cows, Cats and Horses has been reached. @@ -6286,6 +7117,10 @@ Would you like to install the mash-up pack or texture pack now? 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 Bats 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. @@ -6303,7 +7138,7 @@ Would you like to install the mash-up pack or texture pack now? - 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 Pigs, Sheep, Cows, Cats and Horses has been reached. @@ -6314,6 +7149,10 @@ Would you like to install the mash-up pack or texture pack now? 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 horses has been reached. + + This animal can't enter Love Mode. The maximum number of breeding Mooshrooms has been reached. @@ -6362,6 +7201,10 @@ Would you like to install the mash-up pack or texture pack now? Settings + + Languages + + Credits @@ -6410,6 +7253,38 @@ Would you like to install the mash-up pack or texture pack now? World Options + + Game Options + + + + Mob Griefing + + + + Keep Inventory + + + + Mob Spawning + + + + Mob Loot + + + + Tile Drops + + + + Natural Regeneration + + + + Daylight Cycle + + Can Build and Mine @@ -6738,6 +7613,22 @@ Would you like to install the mash-up pack or texture pack now? Poison + + Wither + + + + Health Boost + + + + Absorption + + + + Saturation + + of Swiftness @@ -6814,6 +7705,22 @@ Would you like to install the mash-up pack or texture pack now? of Poison + + of Decay + + + + of Health Boost + + + + of Absorption + + + + of Saturation + + @@ -7007,6 +7914,38 @@ Would you like to install the mash-up pack or texture pack now? Reduces health of the affected players, animals and monsters over time. + + When Applied: + + + + Horse Jump Strength + + + + Zombie Reinforcements + + + + Max Health + + + + Mob Follow Range + + + + Knockback Resistance + + + + Speed + + + + Attack Damage + + Sharpness @@ -7188,7 +8127,7 @@ Would you like to install the mash-up pack or texture pack now? - 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 1{*ICON_SHANK_01*}. Eating this can cause you to become poisoned. @@ -7871,8 +8810,5 @@ All Ender Chests in a world are linked. Items placed into an Ender Chest are acc Cure - - - Finding Seed for the World Generator - + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/stringsLanguages.xml b/Minecraft.Client/PSVitaMedia/loc/stringsLanguages.xml new file mode 100644 index 00000000..1468a170 --- /dev/null +++ b/Minecraft.Client/PSVitaMedia/loc/stringsLanguages.xml @@ -0,0 +1,40 @@ + + + System Language + English + + German + + Spanish + Spanish (Spain) + Spanish (Latin America) + + French + + Italian + + Portuguese + Portuguese (Portugal) + Portuguese (Brazil) + + Japanese + + Korean + + Chinese (Traditional) + Chinese (Simplified) + + Danish + Finnish + + Dutch + + Polish + Russian + Swedish + Norwegian + + Greek + + Turkish + \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/stringsPlatformSpecific.xml index e0bd87a5..91ca95b5 100644 --- a/Minecraft.Client/PSVitaMedia/loc/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/stringsPlatformSpecific.xml @@ -278,11 +278,15 @@ If you try to save while using the trial version, you will be given the option t - There is no save available in the save transfer area at the moment. - You can upload a world save to the save transfer area using Minecraft: PlayStation®3 Edition, and then download it with Minecraft: PlayStation®Vita Edition. +There is no save available in the save transfer area at the moment. +You can upload a world save to the save transfer area using Minecraft: PlayStation®3 Edition, and then download it with Minecraft: PlayStation®Vita Edition. + + The save file in the save transfer area has a version number that Minecraft: PlayStation®Vita Edition doesn't support yet. + + Saving incomplete diff --git a/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsPlatformSpecific.xml index e265dcd4..4f861192 100644 --- a/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/4J_stringsPlatformSpecific.xml @@ -1,53 +1,52 @@  - - Ditt lagringsminne har inte tillräckligt med ledigt utrymme för att skapa en sparfil. - - - Du loggades ut från "PSN" och återvände därför till titelskärmen. - + + Det gick inte att spara inställningar till ditt Sony Entertainment Network-konto. - - Matchen avbröts för att du loggade ut från "PSN" - + + Problem med Sony Entertainment Network-kontot - - Inte inloggad för tillfället. - + + Ett problem uppstod vid åtkomsten av ditt Sony Entertainment Network-konto. Din trophy kunde inte låsas upp för tillfället. - - Det här spelet har vissa funktioner som kräver att du är inloggad på "PSN", men du är offline för tillfället. + + Det här är demoversionen av Minecraft: PlayStation®3 Edition. Om du hade haft fullversionen skulle du ha låst upp en trophy nu! +Lås upp fullversionen för att uppleva det riktiga Minecraft: PlayStation®3 Edition och för att spela med dina vänner runtom i världen via "PSN". +Vill du låsa upp fullversionen? - - Ad hoc-nätverk offline. + + Anslut till ad hoc-nätverk Det här spelet har funktioner som kräver en ad hoc-anslutning, men du är offline för tillfället. - - Den här funktionen kräver att du är inloggad på "PSN". - - - Anslut till "PSN" - - - Anslut till ad hoc-nätverk + + Ad hoc-nätverk offline. Trophy-problem - - Ett problem uppstod vid åtkomsten av ditt Sony Entertainment Network-konto. Din trophy kunde inte låsas upp för tillfället. + + Matchen avbröts för att du loggade ut från "PSN" + - - Problem med Sony Entertainment Network-kontot + + Du loggades ut från "PSN" och återvände därför till titelskärmen. + - - Det gick inte att spara inställningar till ditt Sony Entertainment Network-konto. + + Ditt lagringsminne har inte tillräckligt med ledigt utrymme för att skapa en sparfil. - - Det här är demoversionen av Minecraft: PlayStation®3 Edition. Om du hade haft fullversionen skulle du ha låst upp en trophy nu! -Lås upp fullversionen för att uppleva det riktiga Minecraft: PlayStation®3 Edition och för att spela med dina vänner runtom i världen via "PSN". -Vill du låsa upp fullversionen? + + Inte inloggad för tillfället. + + + Anslut till "PSN" + + + Den här funktionen kräver att du är inloggad på "PSN". + + + Det här spelet har vissa funktioner som kräver att du är inloggad på "PSN", men du är offline för tillfället. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/sv-SV/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/AdditionalStrings.xml index e87f3178..54660f0b 100644 --- a/Minecraft.Client/PSVitaMedia/loc/sv-SV/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/AdditionalStrings.xml @@ -48,6 +48,12 @@ Din alternativfil är korrupt och måste raderas. + + Radera alternativfil. + + + Försök att läsa in alternativfilen igen. + Ditt sparcache är korrupt och måste raderas. @@ -75,6 +81,9 @@ Onlinetjänsten är avstängd för ditt Sony Entertainment Network-konto på grund av föräldrakontrollsinställningar för en av dina lokala spelare. + + Onlinefunktioner har avaktiverats på grund av att det finns en uppdatering tillgänglig. + Det finns inga erbjudanden på nedladdningsbart innehåll till det här spelet för tillfället. @@ -84,7 +93,4 @@ Kom och spela Minecraft: PlayStation®Vita Edition! - - Onlinefunktioner har avaktiverats på grund av att det finns en uppdatering tillgänglig. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsGeneric.xml index 01b8eca2..a81cdf09 100644 --- a/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsGeneric.xml @@ -1,5200 +1,6116 @@  - - Det finns nytt nedladdningsbart innehåll! Du hittar det i Minecraftbutiken via huvudmenyn. + + Växlar till offlinespel - - Du kan ändra utseende på din figur med ett utseendepaket från Minecraftbutiken. Välj "Minecraftbutiken" i huvudmenyn för att se vad som finns tillgängligt. + + Vänta medan värden sparar spelet - - Ändra ljusinställningarna för att göra spelet ljusare eller mörkare. + + Färdas till världens ände - - Om du spelar på svårighetsgraden "Fridfullt" kommer du automatiskt att återfå hälsa, och inga monster kommer ut på nätterna! + + Sparar spelare - - Mata en varg med ett ben för att tämja den, sedan kan du ge den kommandon att sitta eller följa efter dig. + + Ansluter till värden - - Släpp föremål ur inventariet genom att flytta markören utanför menyn och trycka på{*CONTROLLER_VK_A*}. + + Laddar ned terräng - - Om du sover i en säng hoppar du fram i tiden till nästa gryning. Om du spelar med flera spelare måste alla spelare sova samtidigt. + + Lämnar världens ände - - Skaffa fläskkotletter från grisar, tillaga och ät dem sedan för att återfå hälsa. + + Din säng saknades eller blockerades - - Skaffa läder från kor och använd det för att tillverka rustningar. + + Du kan inte sova nu, det finns monster i närheten - - Om du har en tom hink kan du fylla den med mjölk från en ko, vatten eller lava! + + Du sover i en säng. För att hoppa till nästa morgon måste alla spelare sova i sängar samtidigt. - - Använd en skyffel för att förbereda marken för grödor. + + Den här sängen används redan - - Spindlar anfaller inte under dagen - så länge du inte anfaller dem. + + Du kan bara sova på natten - - Det går snabbare att gräva i jord eller sand med en spade än med händerna! + + %s sover i en säng. För att hoppa till nästa morgon måste alla spelare sova i sängar samtidigt. - - Du återfår mer hälsa av att äta tillagade fläskkotletter än av råa. + + Laddar värld - - Tillverka facklor för att lysa upp områden när det är mörkt. Monster undviker facklorna. + + Slutställer ... - - Ta dig till platser snabbare med en gruvvagn och räls! + + Genererar terräng - - Plantera skott så växer de till träd. + + Simulerar världen lite grand - - Grismän anfaller inte dig så länge du inte anfaller dem. + + Rang - - Du kan ändra din spawnplats i spelet och hoppa till nästa gryning genom att sova i en säng. + + Förbereder att spara världen - - Slå tillbaka eldbollarna på spöket! + + Förbereder segment ... - - Om du bygger en portal kan du resa till en annan dimension: Nedervärlden. + + Startar server - - Tryck på{*CONTROLLER_VK_B*} för att släppa vad du håller i! + + Lämnar Nedervärlden - - Använd rätt verktyg till jobbet! + + Spawnar på nytt - - Om du har svårt att hitta kol till dina facklor kan du tillverka träkol genom att elda träd i en ugn. + + Genererar värld - - Det är aldrig smart att gräva rakt upp eller rakt ned. + + Genererar spawnområde - - Benmjöl (som kan tillverkas av skelettben) kan användas som gödningsmedel för att få saker att växa omedelbart! + + Laddar spawnområde - - Smygare exploderar när de kommer nära dig! + + Färdas till Nedervärlden - - Obsidian skapas när vatten nuddar ett lavablock. + + Verktyg och vapen - - Det kan ta flera minuter innan lava försvinner helt och hållet efter att källblocket har tagits bort. + + Ljusstyrka - - Kullersten står emot spökens eldbollar, vilket gör det användbart som skydd nära portaler. + + Känslighet - spelet - - Block som fungerar som ljuskällor (bland annat facklor, glödsten och pumpalyktor) smälter snö och is. + + Känslighet - gränssnittet - - Var försiktig om du bygger strukturer av ull ute i det öppna - blixtar kan antända ull. + + Svårighetsgrad - - En hink med lava kan användas i en ugn för att smälta hundra block. + + Musik - - Vilket instrument ett musikblock spelar avgörs av materialet under blocket. + + Ljud - - Zombier och skelett överlever i dagsljus om de står i vatten. + + Fridfullt - - Om du anfaller en varg kommer alla vargar i närheten att gå till attack mot dig. Zombiefierade grismän beter sig likadant. + + I det här läget återfår spelaren hälsa med tiden, och det finns inga fiender i världen. - - Vargar kan inte färdas till Nedervärlden. + + I det här läget finns det monster i världen, men de gör mindre skada än på den normala svårighetsgraden. - - Vargar anfaller inte smygare. + + I det här läget finns det monster i världen, och de gör normal skada. - - Höns lägger ägg med 5-10 minuters mellanrum. + + Lätt - - Obsidian kan bara brytas med en diamanthacka. + + Normalt - - Smygare fungerar som den mest lättillgängliga krutkällan. + + Svårt - - Om du placerar två kistor bredvid varandra skapas en stor kista. + + Loggade ut - - Tamvargar visar hur mycket hälsa de har med svansen. Mata dem med kött för att läka dem. + + Rustningsdelar - - Tillaga kaktus i en ugn för att få grön färg. + + Mekanismer - - Läs sektionen "Nyheter" i instruktionsmenyn för att se den senaste informationen om spelet. + + Färdmedel - - Nu kan staket byggas ovanpå staket! + + Vapen - - Vissa djur följer efter dig om du håller vete i handen. + + Mat - - Om ett djur inte kan röra sig mer än 20 rutor i någon riktning kommer det inte att laddas ur minnet. + + Strukturer - - Musik av C418! + + Dekorationer - - Notch har över en miljon följare på Twitter! + + Bryggning - - Det finns faktiskt svenskar som inte är blonda. Vissa, som Jens på Mojang, har till och med rött hår! + + Verktyg, vapen och rustningsdelar - - Förr eller senare kommer spelet att uppdateras! + + Material - - Vem är Notch? + + Byggblock - - Mojang har fler utmärkelser än anställda! + + Rödsten och transport - - Vissa kändisar spelar Minecraft! + + Diverse - - deadmau5 gillar Minecraft! + + Poster: - - Försök att ignorera buggarna. + + Avsluta utan att spara - - Smygare är resultatet av en bugg i koden. + + Vill du avsluta till huvudmenyn? Alla osparade framsteg kommer att gå förlorade. - - Är det en höna eller en anka? + + Vill du avsluta till huvudmenyn? Dina framsteg kommer att gå förlorade! - - Besökte du Minecon? + + Den här sparfilen är korrupt eller skadad. Vill du radera den? - - Ingen på Mojang har sett junkboys ansikte. + + Vill du avsluta till huvudmenyn och koppla ifrån alla spelare från spelet? Alla osparade framsteg kommer att gå förlorade. - - Visste du att det finns en Minecraftwiki? + + Avsluta och spara - - Mojangs nya kontor är coolt! + + Skapa ny värld - - Minecon 2013 hölls i Orlando, Florida i USA! + + Ge din värld ett namn - - .party() var grymt! + + Ange ett frö som lägger grunden för din värld - - Utgå alltid ifrån att rykten är falska, inte att de är sanna! + + Ladda sparad värld - - {*T3*}INSTRUKTIONER: GRUNDERNA{*ETW*}{*B*}{*B*} -Minecraft är ett spel som går ut på att placera block och bygga allt du kan tänka dig. På natten kommer monster ut - se till att bygga skydd innan det händer.{*B*}{*B*} -Använd{*CONTROLLER_ACTION_LOOK*} för att se dig omkring.{*B*}{*B*} -Använd{*CONTROLLER_ACTION_MOVE*} för att röra dig.{*B*}{*B*} -Tryck på{*CONTROLLER_ACTION_JUMP*} för att hoppa.{*B*}{*B*} -Tryck{*CONTROLLER_ACTION_MOVE*} framåt två gånger snabbt för att springa. Spelfiguren kommer att springa så länge du håller {*CONTROLLER_ACTION_MOVE*} framåt, eller till dess att du får slut på språngtid eller om hungermätaren har mindre än{*ICON_SHANK_03*}.{*B*}{*B*} -Håll in{*CONTROLLER_ACTION_ACTION*} för att bryta, hugga, gräva eller skörda med handen eller det verktyg du håller i. Du måste tillverka verktyg för att kunna bryta vissa block.{*B*}{*B*} -Om du håller något i handen kan du trycka på{*CONTROLLER_ACTION_USE*} för att använda det, eller på{*CONTROLLER_ACTION_DROP*} för att släppa det. + + Spela övningen - - {*T3*}INSTRUKTIONER: SPELSKÄRMEN{*ETW*}{*B*}{*B*} -Du kan se din status på spelskärmen: din hälsa, hur mycket luft du har kvar när du befinner dig under vatten, hur hungrig du är (du måste äta för att mätta hungern) och din rustning om du bär sådan. Om du förlorar hälsa, men har en hungermätare med nio eller fler{*ICON_SHANK_01*}, kommer din hälsa att återställas automatiskt. Du fyller på din hungermätare genom att äta mat.{*B*} -Erfarenhetsmätaren visas också här. Den använder en siffra för att representera din erfarenhetsnivå. Själva mätaren visar hur många erfarenhetspoäng som behövs för att nå nästa erfarenhetsnivå. Erfarenhetspoäng fås genom att samla erfarenhetsklot som fiender tappar när de dör samt genom att bryta särskilda block, föda upp djur, fiska och smälta malm i en ugn.{*B*}{*B*} -Du kan även se vilka föremål som kan användas. Använd{*CONTROLLER_ACTION_LEFT_SCROLL*} och{*CONTROLLER_ACTION_RIGHT_SCROLL*} för att välja vilket föremål du vill ha till hands. + + Övning - - {*T3*}INSTRUKTIONER: INVENTARIET{*ETW*}{*B*}{*B*} -Använd{*CONTROLLER_ACTION_INVENTORY*} för att öppna ditt inventarie.{*B*}{*B*} -Den här skärmen visar vilka saker du kan använda med händerna och allt annat du bär på. Här visas även din rustning.{*B*}{*B*} -Använd{*CONTROLLER_MENU_NAVIGATE*} för att styra markören. Använd{*CONTROLLER_VK_A*} för att plocka upp ett föremål under markören. Om det rör sig om mer än ett föremål så plockas alla upp - använd{*CONTROLLER_VK_X*} för att bara plocka upp hälften.{*B*}{*B*} -Använd markören för att flytta föremålet till en annan plats i inventariet och placera det där med{*CONTROLLER_VK_A*}. När markören håller i flera föremål använder du{*CONTROLLER_VK_A*} för att placera alla, eller{*CONTROLLER_VK_X*} för att bara placera ett av dem.{*B*}{*B*} -När du håller markören över en rustningsdel visas en beskrivning som hjälper dig att flytta delen till rätt rustningsplats i inventariet.{*B*}{*B*} -Det går att färga om läderrustningar. Gör detta genom att plocka upp ett färgämne med markören, tryck sedan på{*CONTROLLER_VK_X*} med markören över den rustningsdel som du vill färga. + + Döp din värld - - {*T3*}INSTRUKTIONER: KISTOR{*ETW*}{*B*}{*B*} -När du har tillverkat en kista kan du placera ut den i världen och använda den med{*CONTROLLER_ACTION_USE*} för att lagra saker från ditt inventarie.{*B*}{*B*} -Använd markören för att flytta saker mellan ditt inventarie och kistan.{*B*}{*B*} -Saker i kistan lagras till dess att du behöver dem i ditt inventarie igen. + + Skadad sparfil - - {*T3*}INSTRUKTIONER: STORA KISTOR{*ETW*}{*B*}{*B*} -När man placerar två kistor bredvid varandra kombineras de till en stor kista. Den kan lagra ännu fler föremål.{*B*}{*B*} -Den används på precis samma sätt som en vanlig kista. + + OK - - {*T3*}INSTRUKTIONER: TILLVERKNING{*ETW*}{*B*}{*B*} -Tillverkningsgränssnittet låter dig kombinera föremål i ditt inventarie för att skapa nya slags föremål. Använd{*CONTROLLER_ACTION_CRAFTING*} för att öppna tillverkningsgränssnittet.{*B*}{*B*} -Bläddra mellan flikarna högst upp med{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*} för att välja vilket slags föremål du vill tillverka, använd sedan{*CONTROLLER_MENU_NAVIGATE*} för att välja vad du vill tillverka.{*B*}{*B*} -Tillverkningsområdet visar vilka föremål som krävs för att tillverka det nya föremålet. Tryck på{*CONTROLLER_VK_A*} för att tillverka föremålet och lägga det i ditt inventarie. + + Avbryt - - {*T3*}INSTRUKTIONER: ARBETSBÄNKAR{*ETW*}{*B*}{*B*} -Du kan tillverka större föremål med hjälp av en arbetsbänk.{*B*}{*B*} -Placera bänken i världen och tryck på{*CONTROLLER_ACTION_USE*} för att använda den.{*B*}{*B*} -Tillverkning på en arbetsbänk fungerar på samma sätt som vid vanlig tillverkning, men tillverkningsområdet och utbudet är större. + + Minecraftbutiken - - {*T3*}INSTRUKTIONER: UGNAR{*ETW*}{*B*}{*B*} -En ugn låter dig förändra föremål genom att bränna eller smälta dem. Exempelvis kan du använda ugnen för att göra järnmalm till järntackor.{*B*}{*B*} -Placera ugnen i världen och tryck på{*CONTROLLER_ACTION_USE*} för att använda den.{*B*}{*B*} -Stoppa bränsle i botten av ugnen och föremålet som ska behandlas högst upp. Ugnen aktiveras sedan och processen påbörjas.{*B*}{*B*} -När dina föremål har behandlats kan du flytta dem från resultatområdet till ditt inventarie.{*B*}{*B*} -Om du för markören över ett föremål som är en ingrediens eller bränsle till ugnen, öppnas ett verktygstips som låter dig flytta det till ugnen. + + Rotera - - {*T3*}INSTRUKTIONER: AUTOMATER{*ETW*}{*B*}{*B*} -En automat används för att skjuta ut föremål. Du måste placera en kopplare, exempelvis en spak, bredvid automaten för att aktivera den.{*B*}{*B*} -För att fylla automaten med föremål trycker du på{*CONTROLLER_ACTION_USE*}, sedan flyttar du föremålen som du vill ladda automaten med till automaten.{*B*}{*B*} -Efter det kommer automaten att skjuta ut ett föremål varje gång du använder kopplaren. + + Dölj - - {*T3*}INSTRUKTIONER: BRYGGNING{*ETW*}{*B*}{*B*} -För att brygga brygder krävs ett brygdställ, vilket kan tillverkas vid en arbetsbänk. Varje brygd börjar med en flaska vatten, som skapas genom att fylla en glasflaska med vatten från en kittel eller vattenkälla.{*B*} -Ett brygdställ har tre platser för flaskor, alltså kan tre brygder tillverkas åt gången. En ingrediens kan användas till alla tre flaskor, så se till att alltid brygga tre brygder åt gången för att utnyttja dina resurser på bästa sätt.{*B*} -Om du lägger en ingrediens i brygdställets översta plats kommer du att få en grundbrygd efter en kort tid. Grundbrygden är verkningslös, men om du tillsätter en till ingrediens i den får brygden särskilda egenskaper.{*B*} -När du väl har skapat den brygden kan du tillsätta en tredje ingrediens för att förlänga egenskapens effekt (med hjälp av rödstensstoft), ha en starkare effekt (med glödstensstoft) eller förvandlas till en skadlig brygd (med ett fermenterat spindelöga).{*B*} -Det går även att tillsätta krut i dina brygder för att göra dem explosiva. Explosiva brygder kan kastas, och när de exploderar appliceras brygdens egenskap på allt i området som träffas.{*B*} - -Basingredienserna är:{*B*}{*B*} -* {*T2*}Nedervårtor{*ETW*}{*B*} -* {*T2*}Spindelögon{*ETW*}{*B*} -* {*T2*}Socker{*ETW*}{*B*} -* {*T2*}Spöktårar{*ETW*}{*B*} -* {*T2*}Brännpulver{*ETW*}{*B*} -* {*T2*}Magmasalva{*ETW*}{*B*} -* {*T2*}Glimmande meloner{*ETW*}{*B*} -* {*T2*}Rödstensstoft{*ETW*}{*B*} -* {*T2*}Glödstensstoft{*ETW*}{*B*} -* {*T2*}Fermenterade spindelögon{*ETW*}{*B*}{*B*} - -Experimentera med olika kombinationer av ingredienser för att hitta alla brygder som kan bryggas. + + Töm alla platser - - {*T3*}INSTRUKTIONER: FÖRTROLLNING{*ETW*}{*B*}{*B*} -De erfarenhetspoäng du får när fiender dör, när du bryter vissa block eller smälter dem i en ugn, kan användas för att förtrolla vissa verktyg, vapen, rustningsdelar och böcker.{*B*} -När svärdet, pilbågen, yxan, hackan, spaden, rustningsdelen eller boken placeras i platsen under boken på förtrollningsbordet, kommer de tre knapparna till höger om platsen att visa några förtrollningar och deras erfarenhetskostnader.{*B*} -Om du inte har tillräckligt med erfarenhetsnivåer för att använda dem kommer priset att visas i rött, annars visas det i grönt.{*B*}{*B*} -Den faktiska förtrollningen som används väljs slumpmässigt baserat på kostnaden som visas.{*B*}{*B*} -Om förtrollningsbordet omges av bokhyllor (maximalt femton stycken), med bara ett blocks mellanrum mellan bokhyllorna och förtrollningsbordet, kommer förtrollningarna att stärkas och magiska symboler kan ses komma ur boken på förtrollningsbordet.{*B*}{*B*} -Alla ingredienser till ett förtrollningsbord kan hittas i världens byar, eller brytas eller odlas i världen.{*B*}{*B*} -Förtrollade böcker används med städet för att förtrolla föremål. Det här ger dig mer kontroll över vilka förtrollningar dina föremål har.{*B*} + + Vill du lämna det pågående spelet och ansluta till det nya? Osparade framsteg kommer att gå förlorade. - - {*T3*}INSTRUKTIONER: BOSKAP{*ETW*}{*B*}{*B*} -Om du vill behålla dina djur på en och samma plats måste du bygga ett inhägnat område som är mindre än 20 x 20 block och föra in dina djur där. Det garanterar att de är kvar när du återvänder till dem. + + Vill du skriva över den befintliga sparfilen för den här världen med den nuvarande versionen av den här världen? - - {*T3*}INSTRUKTIONER: AVLA DJUR{*ETW*}{*B*}{*B*} -Djuren i Minecraft kan föröka sig och föda bebisversioner av sig själva!{*B*} -För att avla djuren måste du mata dem med rätt mat för att göra dem brunstiga.{*B*} -Ge vete till en ko, svampko eller till ett får, morötter till en gris; veteax eller nedervårtor till en höna; eller valfritt kött till en varg, så börjar de leta efter ett annat djur av samma art som också är brunstigt.{*B*} -När två brunstiga djur av samma art träffas börjar de pussas i några sekunder, sedan dyker en unge upp. Ungen följer efter sina föräldrar till dess att den är fullvuxen.{*B*} -Efter att ha varit brunstigt kan ett djur inte bli brunstigt igen på ungefär fem minuter.{*B*} -Det finns en gräns på hur många djur som kan finnas i världen, så det kan hända att djuren inte parar sig om du har väldigt många. + + Vill du avsluta utan att spara? Du kommer att förlora alla framsteg i den här världen! - - {*T3*}INSTRUKTIONER: NEDERPORTALER{*ETW*}{*B*}{*B*} -En Nederportal låter spelaren resa mellan den vanliga världen och Nedervärlden. Nedervärlden kan användas för att korsa långa sträckor i den vanliga världen - att färdas ett block i Nedervärlden är som att färdas tre block i den vanliga, så när du bygger en portal i Nedervärlden och färdas genom den, kommer du att befinna dig tre gånger längre bort ifrån platsen där du klev in i den första portalen.{*B*}{*B*} -Det krävs minst tio obsidianblock för att bygga portalen, och portalen måste vara fem block hög, fyra block bred och ett block djup. När ramen till portalen har byggts måste öppningen antändas för att portalen ska aktiveras. Det kan göras med tändstålet eller med en eldladdning.{*B*}{*B*} -Exempel på hur man bygger en portal visas i bilden till höger. - + + Starta spelet - - {*T3*}INSTRUKTIONER: BLOCKERA VÄRLDAR{*ETW*}{*B*}{*B*} -Om du finner stötande innehåll i en värld kan du blockera den världen. -Om du vill göra det öppnar du pausmenyn, sedan trycker du på{*CONTROLLER_VK_RB*} för att välja "Blockera värld". -Om du försöker att ansluta till den världen i framtiden kommer du att meddelas att du har blockerat den, sedan får du välja om du vill häva blockeringen och fortsätta till världen, eller gå tillbaka. + + Avsluta - - {*T3*}INSTRUKTIONER: VÄRD- OCH SPELARALTERNATIV{*ETW*}{*B*}{*B*} - -{*T1*}Spelalternativ{*ETW*}{*B*} -När du laddar eller skapar en värld kan du trycka på knappen "Fler alternativ" för att öppna en meny som ger dig mer kontroll över ditt spel.{*B*}{*B*} - - {*T2*}Spelare mot spelare{*ETW*}{*B*} - När det här alternativet är valt kan spelare skada andra spelare. Detta påverkar bara överlevnadsläget.{*B*}{*B*} - - {*T2*}Lita på spelare{*ETW*}{*B*} - När det här alternativet är avstängt begränsas de handlingar som anslutande spelare kan utföra. De kan inte bryta block eller använda föremål, placera ut block, använda dörrar, kopplare eller behållare och de kan inte heller anfalla spelare eller djur. Du kan ändra dessa inställningar för specifika spelare med hjälp av menyn i spelet.{*B*}{*B*} - - {*T2*}Eld sprider sig{*ETW*}{*B*} - När det här alternativet är valt kan eld sprida sig till närliggande brännbara block. Det här alternativet kan även ändras med hjälp av menyn i spelet.{*B*}{*B*} - - {*T2*}Dynamit exploderar{*ETW*}{*B*} - När det här alternativet är aktiverat exploderar dynamit när den aktiveras. Det här alternativet kan även ändras med hjälp av menyn i spelet.{*B*}{*B*} - - {*T2*}Värdprivilegier{*ETW*}{*B*} - När det här alternativet är aktiverat kan värden använda spelets meny för att ge sig själv förmågan att flyga, stänga av sin utmattning och göra sig osynlig. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} - -{*T1*}Alternativ för generering av världar{*ETW*}{*B*} -Det finns några extraalternativ att välja mellan när nya världar skapas.{*B*}{*B*} - - {*T2*}Generera strukturer{*ETW*}{*B*} - När det här alternativet är valt kommer byar och fästningar att genereras i världen.{*B*}{*B*} - - {*T2*}Platt värld{*ETW*}{*B*} - När det här alternativet är valt kommer den vanliga världen och Nedervärlden att vara helt platta.{*B*}{*B*} - - {*T2*}Bonuskista{*ETW*}{*B*} - När det här alternativet är valt kommer en kista med användbara föremål att skapas nära spelarens spawnplats.{*B*}{*B*} - -{*T2*}Återställ Nedervärlden{*ETW*}{*B*} - När det här alternativet är valt byggs Nedervärlden upp på nytt. Det är användbart om du har en gammal sparfil utan fästningar i Nedervärlden.{*B*}{*B*} - -{*T1*}Alternativ i spelet{*ETW*}{*B*} -Tryck på {*BACK_BUTTON*} medan du spelar för att öppna en meny med ett antal olika alternativ.{*B*}{*B*} - - {*T2*}Värdalternativ{*ETW*}{*B*} - Värdspelaren, och alla spelare som har angetts som moderatorer, har tillgäng till menyn "Värdalternativ". Med hjälp av den här menyn kan de kontrollera om eld kan sprida sig eller om dynamit kan explodera.{*B*}{*B*} - -{*T1*}Spelaralternativ{*ETW*}{*B*} -Välj en spelares namn och tryck på{*CONTROLLER_VK_A*} för att öppna menyn för spelarprivilegier. Där kan du välja mellan följande alternativ:{*B*}{*B*} - - {*T2*}Kan bygga och bryta block{*ETW*}{*B*} - Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Det låter spelare interagera med världen som vanligt. Om det stängs av kan inte spelare placera eller förstöra block, de kan inte heller interagera med många av föremålen och blocken.{*B*}{*B*} - - {*T2*}Kan använda dörrar och kopplare{*ETW*}{*B*} - Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelare använda dörrar eller kopplare.{*B*}{*B*} - - {*T2*}Kan öppna behållare{*ETW*}{*B*} - Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelare öppna behållare, exempelvis kistor.{*B*}{*B*} - - {*T2*}Kan anfalla spelare{*ETW*}{*B*} - Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelaren skada andra spelare.{*B*}{*B*} - - {*T2*}Kan anfalla djur{*ETW*}{*B*} - Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelaren skada djur.{*B*}{*B*} - - {*T2*}Moderator{*ETW*}{*B*} - När det här alternativet är aktiverat kan spelaren ge privilegier till andra spelare (förutom till värden) om "Lita på spelare" är avstängt. De kan även sparka spelare och kontrollera om eld kan sprida sig eller om dynamit kan explodera.{*B*}{*B*} - - {*T2*}Sparka spelare{*ETW*}{*B*} - {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - -{*T1*}Alternativ för värdspelare{*ETW*}{*B*} -Om "Värdprivilegier" är aktiverat kan värdspelaren modifiera vissa privilegier. Välj en spelares namn och tryck på{*CONTROLLER_VK_A*} för att öppna menyn för spelarprivilegier. Där kan du välja mellan följande alternativ:{*B*}{*B*} - - {*T2*}Kan flyga{*ETW*}{*B*} - När det här alternativet är aktiverat kan spelaren flyga. Det fyller ingen funktion utanför överlevnadsläget, eftersom alla spelare kan flyga i det kreativa läget.{*B*}{*B*} - - {*T2*}Stäng av utmattning{*ETW*}{*B*} - Det här alternativet påverkar bara överlevnadsläget. När det är aktiverat har fysisk aktivitet (att gå, springa, hoppa o.s.v.) ingen effekt på hungermätaren. Om spelaren skadar sig kommer dock hungermätaren att långsamt tömmas medan spelaren återhämtar sin hälsa.{*B*}{*B*} - - {*T2*}Osynlig{*ETW*}{*B*} - När det här alternativet är aktiverat är spelaren osynlig för andra spelare och kan inte dö.{*B*}{*B*} - - {*T2*}Kan teleportera{*ETW*}{*B*} - Det här alternativet låter spelaren flytta andra spelare eller sig själva till andra spelare i världen. - + + Spara spelet - - Nästa sida + + Avsluta utan att spara - - Föregående sida + + Tryck START för att ansluta - - Grunderna + + Hurra! Du har belönats med en spelarbild med Steve från Minecraft! - - Gränssnittet + + Hurra! Du har belönats med en spelarbild med en smygare! - - Inventariet + + Lås upp fullständiga spelet - - Kistor + + Du kan inte ansluta till det här spelet. Spelaren som du försöker att ansluta till kör en nyare version av spelet. - - Tillverkning + + Ny värld - - Ugnar + + Belöning upplåst! - - Automater - - - Boskap + + Du spelar demoversionen av spelet, men du behöver den fullständiga versionen för att kunna spara. +Vill du låsa upp det fullständiga spelet nu? - - Avla djur + + Vänner - - Bryggning + + Min poäng - - Förtrollning + + Totalt - - Nederportaler + + Vänta - - Flera spelare + + Inga resultat - - Dela skärmbilder + + Filter: - - Blockera världar + + Du kan inte ansluta till det här spelet. Spelaren som du försöker att ansluta till kör en äldre version av spelet. - - Kreativa läget + + Anslutningen tappades - - Värd- och spelaralternativ + + Anslutningen till servern bröts. Avslutar till huvudmenyn. - - Byteshandel + + Kopplades ned av servern - - Städ + + Avslutar spelet - - Världens ände + + Ett fel uppstod. Avslutar till huvudmenyn. - - {*T3*}INSTRUKTIONER: VÄRLDENS ÄNDE{*ETW*}{*B*}{*B*} -Världens ände är en annan dimension i spelet som kan nås genom en aktiv portal. Portalen till världens ände finns i en fästning som ligger långt ned under jorden i den vanliga världen.{*B*} -För att aktivera portalen till världens ände måste du stoppa ett enderöga i den.{*B*} -När portalen har aktiverats är det bara att hoppa in i den för att nå världens ände.{*B*}{*B*} -I världens ände väntar enderdraken, en kraftfull fiende som vaktas av många endermän, så det gäller att du är väl förberedd innan du ger dig av dit!{*B*}{*B*} -Enderdraken läker sig med hjälp av enderkristaller som står utställda på åtta obsidianspiror. -Din första uppgift i striden är att förstöra dem.{*B*} -De första kan nås med pilar, men resten skyddas av burar. Du måste bygga dig upp till dem.{*B*}{*B*} -Medan du gör det kommer enderdraken att flyga mot dig och spotta klot med endersyra!{*B*} -Om du närmar dig äggpodiet mitt mellan spirorna kommer enderdraken att flyga ned och anfalla dig - då har du chansen att verkligen skada den!{*B*} -Undvik enderdrakens syra och sikta in dig på ögonen för bäst resultat. Om möjligt, ta med dig några vänner till världens ände som kan hjälpa dig i striden!{*B*}{*B*} -När du väl befinner dig i världens ände kan dina vänner se var fästningen med portalen dit ligger, -så det är lätt för dem att följa med dig. + + Anslutningen misslyckades - - Springa + + Du sparkades från spelet - - Nyheter + + Värden har lämnat spelet. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Ändringar och tillägg{*ETW*}{*B*}{*B*} -- Nya föremål - Smaragd, smaragdmalm, smaragdblock, enderkista, snubbeltrådskrok, förtrollat guldäpple, städ, blomkruka, kullerstensvägg, mossig kullerstensvägg, withertavla, potatis, bakad potatis, giftig potatis, morot, gyllene morot, morot på pinne, -pumpapaj, brygd för mörkerseende, brygd för osynlighet, nederkvarts, nederkvartsmalm, kvartsblock, kvartsplatta, kvartstrappa, mejslat kvartsblock, pelarkvartsblock, förtrollad bok, matta.{*B*} -- Nya recept för slät sandsten och mejslad sandsten.{*B*} -- Nya varelser - zombiebybor.{*B*} -- Nya möjligheter vid terränggenerering - ökentempel, ökenbyar, djungeltempel.{*B*} -- Det går att byteshandla med bybor.{*B*} -- Städ med tillhörande gränssnitt har lagts till.{*B*} -- Läderrustning kan nu färgas.{*B*} -- Vargars halsband kan nu färgas.{*B*} -- Grisar kan kontrolleras med hjälp av en morot på en pinne medan de rids.{*B*} -- Bonuskistan har uppdaterats med mer innehåll.{*B*} -- Ändrad placering av halvblock och andra block på halvblock.{*B*} -- Ändrad placering av uppochnedvända trappor och plattor.{*B*} -- Lade till nya yrken för bybor.{*B*} -- Bybor spawnade från spawnägg har nu slumpmässiga yrken.{*B*} -- Stockar kan placeras på sidan.{*B*} -- Ugnar kan använda träverktyg som bränsle.{*B*} -- Is- och glaspaneler kan nu brytas utan att de går sönder med verktyg som har silkesvantesförtrollning.{*B*} -- Träknappar och tryckplattor av trä kan aktiveras med pilar.{*B*} -- Nedervärldsvarelser kan komma in i den vanliga världen via portaler.{*B*} -- Smygare och spindlar är aggressiva mot den spelare som senast skadade dem.{*B*} -- Fientliga varelser i det kreativa läget blir neutrala igen efter en kort period.{*B*} -- Man blir inte längre knuffad bakåt medan man drunknar.{*B*} -- Dörrar som slås in av zombier visar tecken på skador.{*B*} -- Is smälter i Nedervärlden.{*B*} -- Kittlar som står utomhus fylls upp när det regnar.{*B*} -- Kolvar tar dubbelt så lång tid att uppdateras.{*B*} -- Grisar tappar sina sadlar när de dör (om de bär på en).{*B*} -- Färgen på himlen i världens ände har ändrats.{*B*} -- Tråd kan placeras (för snubbeltrådar).{*B*} -- Regn droppar genom löv.{*B*} -- Spakar kan placeras på undersidan av block.{*B*} -- Dynamit gör olika skada beroende på svårighetsgraden.{*B*} -- Bokreceptet har ändrats.{*B*} -- Båtar har sönder näckrosor i stället för tvärtom.{*B*} -- Grisar släpper fler fläskkotletter.{*B*} -- Färre slemkuber spawnar i platta världar.{*B*} -- Smygare gör olika skada beroende på svårighetsgraden, spelaren knuffas längre bakåt av deras explosioner.{*B*} -- Fixade att endermän inte öppnar munnen.{*B*} -- Lade till spelarteleportering (med {*BACK_BUTTON*}-menyn i spelet).{*B*} -- Lade till värdalternativ för fjärrspelares flygning, osynlighet och odödlighet.{*B*} -- Lade till övningar för nya föremål och funktioner i övningsvärlden.{*B*} -- Uppdaterade positionerna för kistorna med musikskivor i övningsvärlden.{*B*} - + + Du kan inte ansluta till det här spelet. Ingen av spelarna är dina vänner. - - {*ETB*}Välkommen tillbaka! Du kanske inte har märkt det, men ditt Minecraft har uppdaterats.{*B*}{*B*} -Det finns många nya funktioner för dig och dina vänner, så det här är bara ett axplock. Läs igenom listan och ge dig sedan ut i spelet!{*B*}{*B*} -{*T1*}Nya föremål{*ETB*} - Smaragd, smaragdmalm, smaragdblock, enderkista, snubbeltrådskrok, förtrollat guldäpple, städ, blomkruka, kullerstensvägg, mossig kullerstensvägg, withertavla, potatis, bakad potatis, giftig potatis, morot, gyllene morot, morot på pinne, -pumpapaj, brygd för mörkerseende, brygd för osynlighet, nederkvarts, nederkvartsmalm, kvartsblock, kvartsplatta, kvartstrappa, mejslat kvartsblock, pelarkvartsblock, förtrollad bok, matta.{*B*}{*B*} -{*T1*}Nya varelser{*ETB*} - Zombiebybor.{*B*}{*B*} -{*T1*}Nya funktioner{*ETB*} - Byteshandla med bybor, reparera eller förtrolla vapen och verktyg med ett städ, förvara saker i en enderkista, kontrollera en gris som du rider på med hjälp av en morot på en pinne!{*B*}{*B*} -{*T1*}Nya miniövningar{*ETB*} - Lär dig använda de nya funktionerna i den nya övningsvärlden!{*B*}{*B*} -{*T1*}Nya överraskningar{*ETB*} - Vi har flyttat på alla musikskivor i övningsvärlden. Se om du kan hitta dem igen!{*B*}{*B*} - + + Du kan inte ansluta till det här spelet. Värden har sparkat dig förut. - - Gör mer skada än nävarna. + + Du sparkades från spelet för att du flög - - Används för att gräva i jord, gräs, sand, grus och snö snabbare än för hand. Spadar krävs för att gräva snöbollar. + + Anslutningsförsöket tog för lång tid - - Krävs för att bryta stenrelaterade block och malmblock. + + Servern är full - - Används för att hugga trärelaterade block snabbare än för hand. + + I det här läget finns det monster i världen, och de gör stor skada. Se upp för smygare också, för de är mindre benägna att avbryta sina explosiva attacker om du springer ifrån dem! - - Används för att ploga jord- och gräsblock så att man kan plantera grödor i dem. + + Teman - - Trädörrar kan öppnas och stängas genom att slå dem, använda dem eller med hjälp av rödsten. + + Utseendepaket - - Järndörrar kan öppnas och stängas med hjälp av rödsten, knappar och kopplare. + + Tillåt vänners vänner - - NOT USED + + Sparka spelare - - NOT USED + + Vill du sparka den här spelaren från spelet? Spelaren kan inte ansluta på nytt förrän du startar om världen. - - NOT USED + + Spelarbildspaket - - NOT USED + + Du kan inte ansluta till det här spelet. Det har begränsats till spelare som är vänner till värden. - - Ger bäraren 1 i skydd när den bärs. + + Korrupt nedladdningsbart innehåll - - Ger bäraren 3 i skydd när den bärs. + + Det här nedladdningsbara innehållet är korrupt och kan inte användas. Du måste radera det och sedan installera det på nytt från Minecraftbutiken. - - Ger bäraren 2 i skydd när den bärs. + + Delar av ditt nedladdningsbara innehåll är korrupt och kan inte användas. Du måste radera det och sedan installera det på nytt från Minecraftbutiken. - - Ger bäraren 1 i skydd när den bärs. + + Kan inte ansluta till spelet - - Ger bäraren 2 i skydd när den bärs. + + Valt - - Ger bäraren 5 i skydd när den bärs. + + Valt utseende: - - Ger bäraren 4 i skydd när den bärs. + + Skaffa fullversion - - Ger bäraren 1 i skydd när den bärs. + + Lås upp texturpaket - - Ger bäraren 2 i skydd när den bärs. + + För att använda det här texturpaketet i din värld måste du låsa upp det. +Vill du låsa upp det nu? - - Ger bäraren 6 i skydd när den bärs. + + Demonstration av texturpaket - - Ger bäraren 5 i skydd när den bärs. + + Frö - - Ger bäraren 2 i skydd när den bärs. + + Lås upp utseendepaket - - Ger bäraren 2 i skydd när den bärs. + + För att använda det valda utseendet måste du låsa upp det här utseendepaketet. +Vill du låsa upp utseendepaketet nu? - - Ger bäraren 5 i skydd när den bärs. + + Du använder en demoversion av texturpaketet. Du kan inte spara världen om du inte låser upp fullversionen. +Vill du låsa upp fullversionen av texturpaketet? - - Ger bäraren 3 i skydd när den bärs. + + Ladda ned fullversion - - Ger bäraren 1 i skydd när den bärs. + + Den här världen använder ett kombinations- eller texturpaket som du inte har! +Vill du installera kombinations- eller texturpaketet nu? - - Ger bäraren 3 i skydd när den bärs. + + Skaffa demoversion - - Ger bäraren 8 i skydd när den bärs. + + Texturpaket saknas - - Ger bäraren 6 i skydd när den bärs. + + Lås upp fullversion - - Ger bäraren 3 i skydd när den bärs. + + Ladda ned demoversion - - En blank tacka som kan användas för att tillverka verktyg av det här materialet. Skapad genom att smälta malm i en ugn. + + Ditt spelläge har ändrats - - Gör det möjligt att skapa placerbara block av tackor, ädelstenar och färger. Kan användas som ett dyrt byggblock eller som en kompakt malmförvaring. + + När det här alternativet är valt kan bara inbjudna spelare ansluta. - - Används för att skicka en elektrisk laddning. Aktiveras när en spelare, ett djur eller monster kliver på den. Tryckplattor av trä kan även aktiveras genom att släppa något på dem. + + När det här alternativet är valt kan vänner till folk på din vänlista ansluta. - - Används för kompakta trappor. + + När det här alternativet är valt kan spelare skada andra spelare. Påverkar bara överlevnadsläget. - - Används för att göra långa trappor. Två plattor som placeras ovanpå varandra bildar en normalstor dubbelplatta. + + Normal - - Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. + + Platt - - Används för att skapa och sprida ljus. Facklor smälter även snö och is. + + När det här alternativet är valt spelas spelet i onlineläge. - - Används som byggmaterial och kan användas för att tillverka många olika saker. Kan tillverkas från alla sorters trä. + + När det här alternativet är avstängt måste spelare godkännas innan de kan bygga eller bryta block. - - Används som byggmaterial. Påverkas inte av gravitationen, till skillnad från vanlig sand. + + När det här alternativet är valt kommer byar och fästningar att genereras i världen. - - Används som byggmaterial. + + När det här alternativet är valt kommer den vanliga världen och Nedervärlden att vara helt platta. - - Används för att tillverka facklor, pilar, skyltar, stegar, staket och som handtag till verktyg och vapen. + + När det här alternativet är valt kommer en kista med användbara föremål att skapas nära spelarens spawnplats. - - Används för att hoppa framåt till nästa morgon om alla spelare i världen går och lägger sig. Anger även spelarens spawnplats. Färgen på sängen är alltid densamma, oavsett färgen på ullen som används. + + När det här alternativet är valt kan eld sprida sig till närliggande brännbara block. - - Möjliggör tillverkning av fler föremål än vid vanlig tillverkning. + + När det här alternativet är aktiverat exploderar dynamit när den aktiveras. - - Låter dig smälta malm, skapa träkol och glas, samt tillaga fisk och fläskkotletter. + + När det här alternativet är valt byggs Nedervärlden upp på nytt. Det är användbart om du har en gammal sparfil utan fästningar i Nedervärlden. - - Lagrar block och föremål. Placera två kistor bredvid varandra för att skapa en stor kista med dubbelt så mycket utrymme. + + Av - - Används som en barriär som inte går att hoppa över. Räknas som ett och ett halvt block i höjd för spelare, djur och monster, men som ett block i höjd för övriga block. + + Spelläge: Kreativt - - Används för att klättra upp eller ned. + + Överlevnad - - Aktivera genom att slå, använda eller med hjälp av rödsten. Fungerar som vanliga dörrar, men är 1 x 1 block stort och ligger platt mot marken. + + Kreativt - - Visar text som du eller andra spelare har skrivit. + + Döp om din värld - - Används för att skapa starkare ljus än vad facklor producerar. Smälter snö/is och kan användas under vattnet. + + Ange världens nya namn - - Används som sprängämne. Aktiveras efter att de har placerats ut genom att antända dem med tändstål eller med en elektrisk laddning. + + Spelläge: Överlevnad - - Används för att hålla en svampstuvning. Du får behålla skålen när du har ätit upp stuvningen. + + Skapad i överlevnadsläget - - Används för att hålla och transportera vatten, lava och mjölk. + + Byt namn på sparfilen - - Används för att hålla och transportera vatten. + + Sparar automatiskt om %d ... - - Används för att hålla och transportera lava. + + - - Används för att hålla och transportera mjölk. + + Skapad i det kreativa läget - - Används för att tända eldar och dynamit, och för att öppna färdigbyggda portaler. + + Visa moln - - Används för att fånga fisk. + + Vad vill du göra med den här sparfilen? - - Visar solens och månens position. + + Gränssnittets storlek (delad skärm) - - Pekar mot din startpunkt. + + Ingrediens - - Ritar upp en bild av området som utforskas medan du har den i handen. Bra att ha för den som inte vill gå vilse. + + Bränsle - - Låter dig skjuta pilar för att anfalla på avstånd. + + Automat - - Används som ammunition till pilbågar. + + Kista - - Återställer 2,5{*ICON_SHANK_01*}. + + Förtrolla - - Återställer 1{*ICON_SHANK_01*}. Kan användas sex gånger. + + Ugn - - Återställer 1{*ICON_SHANK_01*}. + + Det finns inga erbjudanden på nedladdningsbart innehåll av den här typen för tillfället. - - Återställer 1{*ICON_SHANK_01*}. + + Vill du radera den här sparfilen? - - Återställer 3{*ICON_SHANK_01*}. + + Väntar på godkännande - - Återställer 1{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. Du kan bli sjuk av att äta den. + + Censurerad - - Återställer 3{*ICON_SHANK_01*}. Skapad genom att tillaga en rå kyckling i en ugn. + + %s har anslutit till spelet. - - Återställer 1,5{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. + + %s har lämnat spelet. - - Återställer 4{*ICON_SHANK_01*}. Skapad genom att tillaga en rå biff i en ugn. + + %s har sparkats från spelet. - - Återställer 1,5{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. + + Brygdställ - - Återställer 4{*ICON_SHANK_01*}. Skapad genom att tillaga en fläskkotlett i en ugn. + + Ange skylttext - - Återställer 1{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. Kan ges till en ozelot för att tämja den. + + Skriv vad som ska stå på din skylt - - Återställer 2,5{*ICON_SHANK_01*}. Skapad genom att tillaga en rå fisk i en ugn. + + Ange namn - - Återställer 2{*ICON_SHANK_01*}, och kan även göras om till ett guldäpple. + + Demotiden slut - - Återställer 2{*ICON_SHANK_01*}, och regenererar hälsa i 4 sekunder. Tillverkad med ett äpple och guldtackor. + + Spelet är fullt - - Återställer 2{*ICON_SHANK_01*}. Du kan bli sjuk av att äta det. + + Kunde inte ansluta till spelet. Det finns inga lediga platser. - - Används för att baka tårta och som en ingrediens vid bryggning. + + Ge din post ett namn - - Används för att skicka en elektrisk laddning genom att slås av eller på. Förblir av- eller påslagen till dess att den används igen. + + Ge din post en beskrivning - - Skickar en konstant elektrisk laddning, och kan användas som en sändare eller mottagare när den ansluts till sidan av ett block. -Kan även användas för att ge ett svagt ljus. + + Inventarie - - Används i rödstenskretsar som en förstärkare, fördröjare och/eller som en diod. + + Ingredienser - - Används för att skicka en elektrisk laddning genom att tryckas in. Skickar signalen i ungefär en sekund innan den stängs av igen. + + Ange bildtext - - Används för att förvara och skjuta ut föremål i slumpmässig ordning när den matas med en rödstensladdning. + + Ge din post en bildtext - - Spelar en not när den aktiveras. Slå blocket för att ändra notens tonläge. Ställ blocket på olika underlag för att ändra vilket instrument som spelas. + + Ange beskrivning - - Används för att leda gruvvagnar. + + Spelar: - - När strömmen är på accelererar gruvvagnar som åker på rälsen. När strömmen är av stannar gruvvagnar på den. + + Vill du lägga till den här världen på listan med blockerade världar? +Om du väljer OK avslutas spelet. - - Fungerar som en tryckplatta (skickar en rödstenssignal när den aktiveras) men kan bara aktiveras av en gruvvagn. + + Häv blockering - - Används för att transportera dig, ett djur eller monster via rälsen. + + Automatisk sparfrekvens - - Används för att transportera saker via rälsen. + + Blockerad värld - - Åker på rälsen och kan knuffa andra gruvvagnar när den är laddad med kol. + + Spelet som du ansluter till är med på listan över blockerade världar. +Om du väljer att ansluta till spelet hävs blockeringen av världen. - - Används för att ta sig fram i vatten snabbare än genom att simma. + + Blockera den här världen? - - Skaffas från får och kan färgas med färgämnen. + + Automatisk sparfrekvens: AV - - Används som byggmaterial och kan färgas med färgämnen. Det här receptet rekommenderas inte, för ull är lätt att få tag på från får. + + Gränssnittets opacitet - - Används för att skapa svart ull. + + Förbereder automatisk sparning av världen - - Används för att skapa grön ull. + + Gränssnittets storlek - - Används för att skapa brun ull, som en ingrediens i kakor och för att odla kakaobönor. + + Minuter - - Används för att skapa silverfärgad ull. + + Kan inte placeras här! - - Används för att skapa gul ull. + + Det är inte tillåtet att placera lava för nära världens spawnplats. Det vore för lätt för spawnande spelare att dö. - - Används för att skapa röd ull. + + Favoritutseenden - - Används som gödningsmedel för grödor, träd, högt gräs, stora svampar och blommor, och kan användas i färgrecept. + + Spel skapat av %s - - Används för att skapa rosa ull. + + Okänd värds spel - - Används för att skapa orangefärgad ull. + + Gästen loggade ut - - Används för att skapa limegrön ull. + + Återställ inställningar - - Används för att skapa grå ull. + + Vill du återställa alla inställningar till deras standardvärden? - - Används för att skapa ljusgrå ull. (Ljusgrå färg kan även skapas genom att kombinera grå färg med benmjöl. Då får du fyra ljusgråa färger för varje bläcksäck i stället för tre.) + + Laddningsfel - - Används för att skapa ljusblå ull. + + En gästspelare har loggat ut, vilket har fått alla gäster att loggas ut från spelet. - - Används för att skapa cyanfärgad ull. + + Kunde inte skapa spel - - Används för att skapa lila ull. + + Valt automatiskt - - Används för att skapa magentafärgad ull. + + Inget paket: standardutseende - - Används för att skapa blå ull. + + Logga in - - Spelar musikskivor. + + Du är inte inloggad. För att spela det här spelet måste du vara inloggad. Vill du logga in nu? - - Används för att tillverka väldigt starka verktyg, vapen och rustningsdelar. + + Flera spelare tillåts inte - - Används för att skapa lyktor som lyser starkare än facklor. Smälter snö/is och kan användas under vatten. + + Drick - - Används för att skapa böcker och kartor. + + + Det här området har en gård. Att driva en gård ger dig förnybara källor för mat och andra saker. + - - Kan användas för att skapa bokhyllor, eller förtrollas för att skapa förtrollade böcker. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hur man skördar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man skördar. + - - Kan placeras runtomkring ett förtrollningsbord för att möjliggöra mer kraftfulla förtrollningar. + + Vete, pumpor och meloner odlas från ax och frön. Du hittar veteax genom att slå sönder högt gräs eller skörda vete, och pumpa- och melonfrön kan skaffas från pumpor och meloner. - - Används som dekoration. + + Tryck på{*CONTROLLER_ACTION_CRAFTING*} för att öppna det kreativa lägets inventariegränssnitt. - - Kan brytas med järnhackor eller bättre, och sedan smältas i en ugn för att skapa guldtackor. + + Ta dig till andra sidan av det här hålet för att fortsätta. - - Kan brytas med stenhackor eller bättre, sedan smältas i en ugn för att skapa järntackor. + + Nu har du klarat det kreativa lägets övning. - - Kan brytas med en hacka för att få kol. + + Innan du kan plantera något måste du göra marken till åkermark med hjälp av en skyffel. En nära vattenkälla hjälper till att hålla åkermarken bördig så att grödorna växer snabbare. Ordentligt med ljus hjälper också till med det. - - Kan brytas med en stenhacka eller bättre för att få lasursten. + + Kaktusar måste planteras på sand och kan växa sig tre block höga. Precis som sockerrör kollapsar hela kaktusen om det nedersta blocket förstörs.{*ICON*}81{*/ICON*} - - Kan brytas med en järnhacka eller bättre för att få diamanter. + + Svampar ska planteras i dunkla miljöer och sprider sig till närliggande block med dunkelt ljus.{*ICON*}39{*/ICON*} - - Kan brytas med en järnhacka eller bättre för att få rödstensstoft. + + Benmjöl kan användas för att få grödorna att bli fullvuxna, eller för att göra svampar till stora svampar.{*ICON*}351:15{*/ICON*} - - Kan brytas med en hacka för att få kullersten. + + Vete passerar flera olika stadier medan det växer. Det kan skördas när det får en mörk färg.{*ICON*}59:7{*/ICON*} - - Grävs med spade. Kan användas som byggmaterial. + + Pumpor och meloner behöver ett ledigt block bredvid blocket där fröet planterades, annars får inte frukten plats när stjälken har växt ut. - - Kan planteras och växer efter en tid till ett träd. + + Sockerrör måste planteras på gräs, jord eller sand som ligger bredvid ett vattenblock. Att hugga av botten av ett sockerrör får hela sockerröret att kollapsa.{*ICON*}83{*/ICON*} - - Kan inte brytas. + + I det kreativa läget har du obegränsat med alla föremål och block, du kan förstöra block med en enda knapptryckning utan verktyg, och du är odödlig och kan flyga. - - Antänder allt det vidrör. Kan plockas upp med en hink. + + + Kistan i det här området innehåller några komponenter för att skapa kretsar med kolvar. Försök att färdigställa kretsarna i området, eller skapa dina egna. Det finns fler exempel utanför övningsområdet. + - - Grävs med spade. Kan smältas till glas i en ugn. Påverkas av gravitation om det inte finns någonting under den. + + + I det här området finns en portal till Nedervärlden! + - - Grävs med spade. Kan ibland lämna efter sig flintsten när det grävs upp. Påverkas av gravitation om det inte finns någonting under det. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om portaler och Nedervärlden.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan känner till portaler och Nedervärlden. + - - Huggs med yxa och kan göras till plankor, eller användas som bränsle. + + + Du skaffar rödstensstoft genom att bryta rödstensmalm med en hacka gjord av järn, diamant eller guld. Längdmässigt kan det användas för att ge ström från ett avstånd på femton block, och höjdmässigt kan det kan färdas upp eller ned ett helt block. + {*ICON*}331{*/ICON*} + - - Tillverkas i en ugn genom att smälta sand. Kan användas som byggmaterial, men går sönder om du slår på det. + + + Rödstensförstärkare kan användas för att förlänga sträckan som strömmen bärs, eller för att lägga in en fördröjning i en krets. + {*ICON*}356{*/ICON*} + - - Bryts från sten med en hacka. Kan användas för att bygga en ugn eller stenverktyg. + + + När en kolv matas med ström fälls den ut och kan knuffa upp till tolv block. Klibbiga kolvar kan dra tillbaka ett block av nästan vilket slag som helst när de fälls in igen. + {*ICON*}33{*/ICON*} + - - Bakas med lera i en ugn. + + + Portaler skapas genom att bygga en ram som är fyra block bred och fem block hög av obsidianblock. Hörnblocken behövs inte. + - - Kan härdas till tegelsten i en ugn. + + + Nedervärlden kan användas för att ta dig fram stora sträckor i den vanliga världen. Att gå ett block i Nedervärlden är som att gå tre block i den vanliga. + - - Bryts ned till lerbollar som kan härdas till tegelsten i en ugn. + + + Nu befinner du dig i det kreativa läget. + - - Ett kompakt sätt att förvara snöbollar. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om det kreativa läget.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur det kreativa läget fungerar. + - - Kan grävas med spade för att skapa snöbollar. + + + För att aktivera portalen till Nedervärlden måste du tända eld på obsidianblocken på insidan av ramen med ett tändstål. Portaler stängs om ramen går sönder, om någonting exploderar i närheten eller om det passerar vätska genom dem. + - - Lämnar ibland efter sig veteax när det slås sönder. + + + Ställ dig i en portal till Nedervärlden för att använda den. Skärmen blir lila och ett ljud spelas upp. Efter några sekunder förflyttas du till en annan dimension. + - - Kan göras till ett färgämne. + + + Nedervärlden kan vara mycket farlig. Det kan dock vara värt att navigera dess glödheta lava, för där finns nedersten som aldrig slocknar när den antänds, och glödsten som producerar ljus. + - - Kan kombineras med en skål för att göra en stuvning. + + Nu har du klarat övningen om hur man skördar. - - Kan endast brytas med en diamanthacka. Uppstår när vatten kolliderar med lava, och används vid portalbyggen. + + Olika verktyg passar till olika material. Använd en yxa för att hugga trädstammar. - - Spawnar monster i världen. + + Olika verktyg passar till olika material. Använd en hacka för att bryta sten och malm. Du kan behöva en hacka av bättre material för att få resurser från vissa block. - - Läggs på backen för att skicka vidare en elektrisk laddning. När det används vid bryggning förlänger det brygdens effekt. + + Vissa verktyg är bättre lämpade att anfalla fiender med. Du bör använda ett svärd när du anfaller. - - Vete kan skördas från fullvuxna grödor. + + Vissa byar har en järngolem som skyddar byborna. Om du anfaller dem går den till angrepp. - - Mark som har förberetts för frön. + + Du kan inte lämna det här området innan du är klar med övningen. - - Kan tillagas i en ugn för att skapa ett grönt färgämne. + + Olika verktyg passar till olika material. Använd en spade för att gräva i mjuka material som jord och sand. - - Kan göras om till socker. + + Tips: Håll in {*CONTROLLER_ACTION_ACTION*} för att bryta eller hugga med handen eller vad du än håller i. Du måste tillverka verktyg för att kunna bryta vissa block. - - Kan bäras som en hjälm eller kombineras med en fackla för att skapa en pumpalykta. Används även som huvudingrediens i pumpapaj. + + I kistan bredvid floden finns en båt. Peka markören på vattnet och tryck på{*CONTROLLER_ACTION_USE*} för att använda båten. Använd{*CONTROLLER_ACTION_USE*} medan du pekar markören på båten för att gå ombord. - - Brinner i all evighet om den antänds. + + I kistan bredvid dammen finns ett fiskespö. Ta fiskespöet från kistan och sätt det i handen för att använda det. - - Gör den, eller det, som går på den långsammare. + + Den här avancerade kolvmekanismen skapar en självreparerande bro! Tryck på knappen för att aktivera den, undersök sedan hur de olika komponenterna interagerar för att lära dig mer. - - Att stå i portalen låter dig passera mellan den vanliga världen och Nedervärlden. + + Det verktyg du använder har skadats. Varje gång du använder ett verktyg skadas det, och till slut går det sönder. Den färgade mätaren under föremålet i inventariet visar verktygets tillstånd. - - Används som bränsle i ugnar och för att skapa facklor. + + Håll in{*CONTROLLER_ACTION_JUMP*} för att simma upp. - - Hittas genom att döda spindlar, och kan användas för att tillverka pilbågar och fiskespön. Kan placeras på backen för att användas som snubbeltråd. + + I det här området finns det en gruvvagn på räls. Sätt dig i gruvvagnen genom att peka markören på den och trycka på{*CONTROLLER_ACTION_USE*}. Använd{*CONTROLLER_ACTION_USE*} på knappen för att sätta gruvvagnen i rörelse. - - Hittas genom att döda höns, och kan användas för att tillverka pilar. + + En järngolem består av fyra järnblock i det mönster som visas och en pumpa på blocket i mitten. De anfaller dina fiender. - - Hittas genom att döda smygare, och kan användas för att tillverka dynamit. Fungerar även som ingrediens vid bryggning. + + Ge vete till en kor, svampkor eller får; morötter till grisar; veteax eller nedervårtor till höns; eller valfritt kött till vargar, så börjar de leta efter ett annat djur av samma art som också är brunstigt. - - Kan planteras på åkrar för att odla grödor. Se till att det finns tillräckligt med ljus! + + När två brunstiga djur av samma art träffas börjar de pussas i några sekunder, sedan dyker en unge upp. Ungen följer efter sina föräldrar till dess att den är fullvuxen. - - Skördas från grödor, och kan användas för att laga vissa maträtter. + + Efter att ha varit brunstigt kan ett djur inte bli brunstigt igen på ungefär fem minuter. - - Hittas genom att gräva i grus, och kan användas för att tillverka tändstål. + + + I det här området finns en inhägnad med djur. Du kan avla djur för att skaffa bebisversioner av djuren. + - - Använd den på en gris för att kunna rida på grisen. Grisen kan sedan styras med hjälp av en morot på en pinne. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om djur och avel.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan känner till djur och avel. + - - Skaffas genom att gräva i snö, och kan kastas. + + För att avla djuren måste du mata dem med rätt mat för att göra dem brunstiga. - - Hittas genom att döda kor, och kan bearbetas till rustningsdelar eller användas för att tillverka böcker. + + Vissa djur följer efter dig om du håller rätt mat i handen. Det gör det lättare att föra samman djur så att de parar sig.{*ICON*}296{*/ICON*} - - Hittas genom att döda slemkuber, och kan användas vid bryggning eller för att tillverka klibbiga kolvar. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hur man bygger en golem.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man bygger en golem. + - - Läggs slumpmässigt av höns, och kan användas för att laga vissa maträtter. + + Du bygger en golem genom att placera en pumpa på en hög med block. - - Skaffas genom att bryta glödsten, och kan användas för att tillverka nya glödstensblock. Kan även användas vid bryggning för att göra brygden starkare. + + En snögolem består av en stapel med två snöblock och en pumpa ovanpå. De kastar snöbollar på dina fiender. - - Hittas genom att döda skelett. Kan göras om till benmjöl. Kan ges till en varg för att tämja den. + + + Vilda vargar kan tämjas genom att ge ben till dem. När de har tämjts dyker det upp hjärtan runtomkring dem. Tämjda vargar följer efter spelare och försvarar dem så länge de inte har fått order att sitta. + - - Skaffas genom att få ett skelett att döda en smygare. Kan spelas i en jukebox. + + Nu har du klarat övningen om djur och avel. - - Släcker eldar och gör att grödor växer snabbare. Kan plockas upp i en hink. + + + I det här området finns några pumpor och block som låter dig bygga en snö- eller järngolem. + - - Släpper ibland skott när de går sönder. Skotten kan planteras om för att odla nya träd. + + + En strömkällas position och riktning avgör hur den påverkar blocken i direkt anslutning. Exempelvis kan en rödstensfackla på sidan av ett block stängas av om blocket får ström från en annan källa. + - - Hittas i grottor, och kan användas som byggmaterial eller dekoration. + + + Om kitteln blir tom kan du fylla den med en vattenhink. + - - Används för att klippa ull från får och för att skörda lövblock. + + + Använd brygdstället för att brygga en brygd för eldmotstånd. Du behöver en vattenflaska, en nedervårta och magmasalva. + - - Ge den ström (med hjälp av en knapp, spak, tryckplatta, rödstensfackla eller med en kombination av dessa och rödsten) så kommer, om möjligt, en kolv ut som knuffar block. + + + Håll in{*CONTROLLER_ACTION_USE*} när du håller en brygd i handen för att använda den. Normala brygder dricks och effekten påverkar bara dig. Explosiva brygder kastas och effekten drabbar alla varelser som träffas. + Explosiva brygder kan tillverkas genom att tillsätta krut till normala brygder. + - - Ge den ström (med hjälp av en knapp, spak, tryckplatta, rödstensfackla eller med en kombination av dessa och rödsten) så kommer, om möjligt, en kolv ut som knuffar block. När den fälls in drar den med sig det block som kolven nuddade. + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om bryggning och brygder.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan kan bryggning och känner till brygder. + - - Tillverkas med stenblock och återfinns ofta i fästningar. + + + Första steget när man brygger en brygd är att skapa en vattenflaska. Ta en glasflaska från kistan. + - - Används som en barriär, precis som staket. + + + Du kan fylla flaskan från en kittel med vatten i eller från ett vattenblock. Fyll flaskan nu genom att peka den mot en vattenkälla, tryck sedan på{*CONTROLLER_ACTION_USE*}. + - - Liknar en dörr, men används primärt tillsammans med staket. + + + Använd din brygd för eldmotstånd på dig själv. + - - Kan tillverkas med melonskivor. + + + För att förtrolla ett föremål ska du först placera det i förtrollningsrutan. Vapen, rustningsdelar och vissa verktyg kan förtrollas för att ge dem specialeffekter. Exempelvis kan de bli mer tåliga, eller så kan de producera fler resurser när du bryter block. + - - Genomskinliga block som kan användas som ett alternativ till glasblock. + + + När ett föremål har placerats i förtrollningsrutan kommer knapparna till höger att visa ett antal slumpmässiga förtrollningar. + - - Kan planteras för att odla pumpor. + + + Siffran på knappen visar hur många erfarenhetsnivåer det kostar att använda den förtrollningen på föremålet. Om din nivå inte är tillräckligt hög kommer knappen att vara avaktiverad. + - - Kan planteras för att odla meloner. + + + Nu när du kan stå emot eld och lava borde du se om du kan ta dig till platser som du inte kunde nå förut. + - - Släpps av endermän när de dör. Om du kastar en teleporteras du till platsen där pärlan landar och förlorar lite hälsa. + + + Det här är förtrollningsgränssnittet. Du kan använda det för att förtrolla vapen, rustningsdelar och vissa verktyg. + - - Ett jordblock med gräs som växer på ovansidan. Grävs upp med spade. Kan användas som byggmaterial. + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om förtrollningsgränssnittet.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder förtrollningsgränssnittet. + - - Kan användas som byggmaterial och som dekoration. + + + I det här området finns ett brygdställ, en kittel och en kista full med brygdingredienser. + - - Gör dig långsammare när du står på det. Kan klippas med sax för att få tråd. + + + Träkol kan användas som bränsle, eller användas i kombination med en stav för att tillverka en fackla. + - - Spawnar en silverfisk när den förstörs. Kan även spawna en silverfisk om den befinner sig nära en annan silverfisk under angrepp. + + + Om du använder sand som resurs kan du tillverka glas. Tillverka några glasblock att använda som fönster i ditt skydd. + - - Växer med tiden när de placeras ut. Kan klippas med sax. Kan klättras, precis som en stege. + + + Det här är bryggningsgränssnittet. Du kan använda det för att skapa brygder med många olika effekter. + - - Halt att gå på. Förvandlas till vatten om den ligger ovanpå ett annat block som förstörs. Smälter om den befinner sig nära en ljuskälla eller om den placeras i Nedervärlden. + + + Många saker av trä kan användas som bränsle, men inte alla brinner lika länge. Du kan även hitta andra saker i världen som kan användas som bränsle. + - - Kan användas som dekoration. + + + När dina saker har behandlats i ugnen kan du flytta dem från resultatrutan till ditt inventarie. Experimentera med olika saker för att se vad du kan tillverka. + - - Används vid bryggning och för att hitta fästningar. Tappas av brännare, som brukar befinna sig nära fästningar i Nedervärlden. + + + Om du bränner trä kan du tillverka träkol. Lägg bränsle i ugnen och använd trä som resurs att bränna. Det kan ta ett tag innan ugnen börjar producera träkol, så gör någonting annat under tiden och återvänd senare för att se hur det går. + - - Används vid bryggning. Tappas av spöken när de dör. + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder brygdstället. + - - Tappas av zombiefierade grismän när de dör. Zombiefierade grismän kan hittas i Nedervärlden. Kan användas som ingrediens vid bryggning. + + + Att tillsätta ett fermenterat spindelöga fördärvar brygden och gör att den får motsatt effekt. Krut gör att brygden blir explosiv, vilket gör att effekten påverkar allt som träffas när brygden kastas. + - - Används vid bryggning. Växer naturligt vid fästningar i Nedervärlden. Kan även planteras på själsand. + + + Skapa en brygd för eldmotstånd genom att först tillsätta en nedervårta i en vattenflaska, och sedan tillsätta magmasalva. + - - Har olika effekter beroende på vad den används på. + + + Tryck på{*CONTROLLER_VK_B*} nu för att lämna brygdgränssnittet. + - - Kan fyllas med vatten och användas som basingrediens i brygdstället. + + + Brygg brygder genom att placera en ingrediens i den översta rutan och en brygd eller vattenflaska i de nedre rutorna. Du kan brygga upp till tre stycken samtidigt. När du har hittat en giltig kombination inleds bryggandet och resultatet blir klart kort efter det. + - - En giftig ingrediens som kan användas vid matlagning och bryggning. Tappas av spindlar och grottspindlar när de dödas av spelaren. + + + Alla brygder börjar med en vattenflaska. De flesta brygderna skapas genom att först tillsätta en nedervårta - då får man en basal brygd. Sedan krävs minst en ingrediens till för att framställa den slutgiltiga brygden. + - - Används vid bryggning, främst för att koka brygder med negativa effekter. + + + När du väl har en brygd kan du modifiera dess effekter. Om du tillsätter rödstensstoft förlängs effekten, medan glödstenstoft gör effekten mer kraftfull. + - - Används vid bryggning eller kombineras med andra föremål för att skapa enderögon och magmasalva. + + + Välj en förtrollning och tryck på{*CONTROLLER_VK_A*} för att förtrolla föremålet. Det här sänker din erfarenhetsnivå med förtrollningens kostnad. + - - Används vid bryggning. + + + Tryck på{*CONTROLLER_ACTION_USE*} för att kasta ut linan och börja fiska. Tryck på{*CONTROLLER_ACTION_USE*} igen för att dra in fiskelinan. + {*FishingRodIcon*} + - - Används för att koka normala och explosiva brygder. + + + För att fånga fisk måste du vänta till dess att flötet dras ned under ytan innan du drar in linan. Fisk kan ätas rå eller tillagad (med hjälp av en ugn) för att återställa hälsa. + {*FishIcon*} + - - Kan fyllas med regnvatten eller med en hink, och kan sedan användas för att fylla glasflaskor med vatten. + + + Precis som många andra verktyg har fiskespöet ett begränsat antal användningar. Det finns dock inget som säger att du måste lägga de användningarna på att fånga fisk. Experimentera för att se vad du kan fånga eller aktivera ... + {*FishingRodIcon*} + - - När de kastas visar de i vilken riktning portalen till världens ände ligger. När tolv av dessa har placerats i portalen till världens ände kommer portalen att aktiveras. + + + En båt låter dig ta dig fram över vattnet snabbt. Du kan styra båten med{*CONTROLLER_ACTION_MOVE*} och{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + - - Används vid bryggning. + + + Nu använder du ett fiskespö. Tryck på{*CONTROLLER_ACTION_USE*} för att använda det.{*FishingRodIcon*} + - - Liknar gräsblock, men är väldigt bra att odla svamp på. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om fiske.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man fiskar. + - - Flyter på vatten och kan användas som klivsten. + + + Det här är en säng. Peka på den när det är natt och tryck på{*CONTROLLER_ACTION_USE*} för att sova hela natten och vakna nästa morgon.{*ICON*}355{*/ICON*} + - - Används för att bygga fästningar i Nedervärlden. Immuna mot spökens eldklot. + + + I det här området finns enkla rödstens- och kolvkretsar, samt en kista med saker som låter dig bygga ut de kretsarna. + - - Används i fästningar i Nedervärlden. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om rödstenskretsar och kolvar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur rödstenskretsar och kolvar fungerar. + - - Hittas i fästningar i Nedervärlden. Släpper nedervårtor när de går sönder. + + + Spakar, knappar, tryckplattor och rödstensfacklor kan alla ge ström till kretsar, antingen genom att ansluta dem direkt till saken som behöver ström, eller med hjälp av rödstensstoft. + - - Låter dig förtrolla svärd, hackor, yxor, spadar, pilbågar och rustningsdelar genom att betala erfarenhetspoäng. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om sängar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder sängar. + - - Kan aktiveras med hjälp av tolv enderögon. Låter dig resa till världens ände. + + + En säng bör stå på en säker och upplyst plats, annars kommer du att bli störd av monster mitt i natten. När du har använt en säng blir den till din spawnplats, och skulle du råka dö får du börja från den igen. + {*ICON*}355{*/ICON*} + - - Används för att bygga en portal till världens ände. + + + Om du spelar tillsammans med andra spelare måste alla gå och lägga sig samtidigt för att kunna sova. + {*ICON*}355{*/ICON*} + - - Ett block som finns i världens ände. Det är väldigt stryktåligt och fungerar därför utmärkt som byggmaterial. + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om båtar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder båtar. + - - Det här blocket skapas genom att besegra draken i världens ände. + + + Med hjälp av ett förtrollningsbord kan du lägga till specialeffekter, exempelvis att du får fler resurser när du bryter block eller att dina vapen, rustningsdelar och verktyg blir mer stryktåliga. + - - Släpper erfarenhetsklot när den kastas, som ger dig erfarenhetspoäng när du plockar upp dem. + + + Om du ställer bokhyllor runt förtrollningsbordet får det mer kraft, och då kan du använda bättre förtrollningar. + - - Användbar när du vill tända eld på saker. Kan även placeras i en automat för att starta bränder på måfå. + + + Det kostar erfarenhetsnivåer att förtrolla föremål. Du höjer din nivå genom att plocka upp erfarenhetsklot som bildas när du dödar monster och djur, när du bryter malm, avlar djur, fiskar eller behandlar vissa saker i ugnen. + - - Fungerar som ett vitrinskåp - det visar upp det föremål eller block du placerar i det. + + + Alla förtrollningar är slumpmässiga, men några av de bättre förtrollningarna är bara tillgängliga när du har en hög erfarenhetsnivå, och när det står många bokhyllor runt förtrollningsbordet för att ge det mer kraft. + - - Spawnar den varelse som indikeras när den kastas. + + + I det här området finns ett förtrollningsbord och några andra föremål som ska lära dig grunderna om förtrollning. + - - Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om förtrollning.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan kan förtrollning. + - - Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. + + + Du kan även höja din erfarenhetsnivå med hjälp av förtrollningsflaskor. När en sådan kastas sprider den erfarenhetsklot där den landar. Du kan sedan plocka upp kloten. + - - Skapas genom att smälta nedersten i en ugn. Kan användas för att tillverka nedermursten. + + + En gruvvagn åker på räls. Det går även att tillverka en värmedriven gruvvagn med ugn och en gruvvagn med en kista i. + {*RailIcon*} + - - Lyser när de får ström. + + + Det går även att tillverka en rödstensräls som drar kraft från rödstensfacklor och -kretsar för att driva gruvvagnen framåt. Dessa kan anslutas till kopplare, spakar och tryckplattor för att skapa avancerade system. + {*PoweredRailIcon*} + - - Kan odlas för att få kakaobönor. + + + Nu seglar du med en båt. För att lämna båten pekar du på den med markören och trycker på{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + - - Varelsehuvuden kan placeras som dekorationer eller bäras som masker genom att bära dem som hjälmar. + + + Kistan i det här området innehåller några förtrollade saker, förtrollningsflaskor och några saker som inte har förtrollats ännu som du kan experimentera med vid förtrollningsbordet. + - - Bläckfisk + + + Nu åker du i en gruvvagn. Om du vill kliva ur den pekar du på den med markören och trycker på{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + - - Släpper en bläcksäck när den dödas. + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om gruvvagnar.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur gruvvagnar fungerar. + - - Ko + + Om du flyttar markören utanför gränssnittet medan du bär på ett föremål, kan du släppa föremålet. - - Släpper läder när den dödas. Kan mjölkas med en hink. + + Läs - - Får + + Häng - - Släpper ull när den klipps (om den inte redan har klippts). Kan färgas för att producera ull med en annan färg. + + Kasta - - Höna + + Öppna - - Släpper fjädrar när den dödas, kan även lägga ägg slumpmässigt. + + Byt tonart - - Gris + + Detonera - - Släpper fläskkotletter när den dödas. Kan ridas med hjälp av en sadel. + + Plantera - - Varg + + Lås upp fullständiga spelet - - Anfaller bara om du anfaller den. Kan tämjas med hjälp av ben, vilket får vargen att följa efter dig och gå till angrepp mot allt som anfaller dig. + + Radera sparfil - - Smygare + + Radera - - Exploderar om du kommer för nära! + + Plöj - - Skelett + + Skörda - - Skjuter pilar på dig. Släpper pilar när det dödas. + + Fortsätt - - Spindel + + Simma upp - - Anfaller om du kommer nära. Kan klättra upp för väggar. Släpper tråd när den dödas. + + Slå - - Zombie + + Mjölka - - Anfaller om du kommer nära. + + Plocka upp - - Zombiefierad grisman + + Töm - - Vanligtvis fridfull, men anfaller i grupp om du anfaller en av dem. + + Rid - - Spöke + + Placera - - Skjuter eldklot som exploderar vid kontakt. + + Ät - - Slemkub + + Rid - - Delas upp i mindre slemkuber när den skadas. + + Segla - - Enderman + + Odla - - Anfaller om du tittar på honom. Kan även flytta på block. + + Sov - - Silverfisk + + Vakna - - Attraherar andra silverfiskar som gömmer sig när den blir anfallen. Gömmer sig i stenblock. + + Spela - - Grottspindel + + Alternativ - - Har ett giftigt bett. + + Flytta rustningsdel - - Svampko + + Flytta vapen - - Producerar en svampstuvning om du använder en skål på den. Släpper svampar och blir till en normal ko om den klipps. + + Välj - - Snögolem + + Flytta ingrediens - - Man kan skapa en snögolem med hjälp av snöblock och en pumpa. De kastar snöbollar på sina skapares fiender. + + Flytta bränsle - - Enderdrake + + Flytta verktyg - - Den här stora, svarta draken finns i världens ände. + + Dra - - Brännare + + Sida upp - - De här fienderna finns i Nedervärlden, mestadels inne i fästningar. De släpper brännstavar när de dödas. + + Sida ned - - Magmakub + + Brunstig - - Finns i Nedervärlden. De bryts ned till mindre versioner när de angrips, precis som slemkuber. + + Släpp - - Bybo + + Privilegier - - Ozelot + + Blockera - - Lever i djungeln. Du kan tämja dem med rå fisk. Tänk på att du måste låta ozeloten närma sig dig, för plötsliga rörelser skrämmer bort den. + + Kreativt - - Järngolem + + Blockera värld - - Finns i byar för att skydda dem. Kan byggas med hjälp av järnblock och pumpor. + + Välj utseende - - Explosives Animator + + Antänd - - Concept Artist + + Bjud in vänner - - Number Crunching and Statistics + + Acceptera - - Bully Coordinator + + Klipp - - Original Design and Code by + + Navigera - - Project Manager/Producer + + Ominstallera - - Rest of Mojang Office + + Sparalt. - - Lead Game Programmer Minecraft PC + + Verkställ kommando - - Ninja Coder + + Installera fullständiga versionen - - CEO + + Installera demo - - White Collar Worker + + Installera - - Customer Support + + Skjut ut - - Office DJ + + Uppdatera spellistan - - Designer/Programmer Minecraft - Pocket Edition + + Festspel - - Developer + + Alla spel - - Chief Architect + + Stäng - - Art Developer + + Avbryt - - Game Crafter + + Avbryt anslutningen - - Director of Fun + + Byt grupp - - Music and Sounds + + Tillverkning - - Programming + + Tillverka - - Art + + Plocka upp/placera - - QA + + Visa inventariet - - Executive Producer + + Visa beskrivning - - Lead Producer + + Visa ingredienser - - Producer + + Tillbaka - - Test Lead + + Påminnelse: - - Lead Tester + + - - Design Team + + Nya funktioner har lagts till i den senaste versionen, bland annat nya områden i övningsvärlden. - - Development Team + + Du har inte alla ingredienser som behövs för att tillverka den här saken. Rutan nere till vänster visar vilka ingredienser som behövs. - - Release Management + + + Grattis, du är klar med övningen. Nu passerar tiden i spelet i normal hastighet, och det dröjer inte länge innan det blir natt och monster kommer ut! Bygg färdigt skyddet! + - - Director, XBLA Publishing + + {*EXIT_PICTURE*} När du är redo att utforska mer kan du leta upp trappan som leder till ett litet slott. Den ligger nära gruvarbetarens skydd. - - Business Development + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att spela övningen som vanligt.{*B*} + Tryck på{*CONTROLLER_VK_B*} för att hoppa över den huvudsakliga övningen. - - Portfolio Director + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hungermätaren och mat.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur hungermätaren fungerar och hur man äter mat. + - - Product Manager + + Välj - - Marketing + + Använd - - Community Manager + + I det här området finns platser där du kan lära dig om fiske, båtar, kolvar och rödsten. - - Europe Localization Team + + Utanför det här området finns exempel på byggnader, gårdar, gruvvagnar med räls, förtrollning, bryggning, byteshandel, smide och mycket mer! - - Redmond Localization Team + + + Din hungermätare ligger på en nivå där du inte längre återfår hälsa. + - - Asia Localization Team + + Plocka upp - - User Research Team + + Nästa - - MGS Central Teams + + Föregående - - Milestone Acceptance Tester + + Sparka spelare - - Special Thanks + + Skicka vänförfrågan - - Test Manager + + Sida ned - - Senior Test Lead + + Sida upp - - SDET + + Färga - - Project STE + + Läk - - Additional STE + + Sitt - - Test Associates + + Följ mig - - Jon Kågström + + Bryt - - Tobias Möllstam + + Mata - - Risë Lugo + + Tämj - - Träsvärd + + Byt filter - - Stensvärd + + Placera alla - - Järnsvärd + + Placera en - - Diamantsvärd + + Släpp - - Guldsvärd + + Plocka upp alla - - Träspade + + Plocka upp hälften - - Stenspade + + Placera - - Järnspade + + Släpp alla - - Diamantspade + + Rensa snabbval - - Guldspade + + Vad är det här? - - Trähacka + + Dela på Facebook - - Stenhacka + + Släpp en - - Järnhacka + + Byt grupp - - Diamanthacka + + Snabbval - - Guldhacka + + Utseendepaket - - Träyxa + + Rödmålad glasruta - - Stenyxa + + Grönmålad glasruta - - Järnyxa + + Brunmålad glasruta - - Diamantyxa + + Vitmålat glas - - Guldyxa + + Målad glasruta - - Träskyffel + + Svartmålad glasruta - - Stenskyffel + + Blåmålad glasruta - - Järnskyffel + + Gråmålad glasruta - - Diamantskyffel + + Rosamålad glasruta - - Guldskyffel + + Limemålad glasruta - - Trädörr + + Lilamålad glasruta - - Järndörr + + Cyanmålad glasruta - - Ringbrynjehuva + + Ljusgråmålad glasruta - - Ringbrynja + + Orangemålat glas - - Ringbrynjebyxor + + Blåmålat glas - - Ringbrynjestövlar + + Lilamålat glas - - Läderhuva + + Cyanmålat glas - - Järnhjälm + + Rödmålat glas - - Diamanthjälm + + Grönmålat glas - - Guldhjälm + + Brunmålat glas - - Lädertunika + + Ljusgråmålat glas - - Järnharnesk + + Gulmålat glas - - Diamantharnesk + + Ljusblåmålat glas - - Guldharnesk + + Magentamålat glas - - Läderbyxor + + Gråmålat glas - - Järnskenor + + Rosamålat glas - - Diamantskenor + + Limemålat glas - - Guldskenor + + Gulmålad glasruta - - Läderstövlar + + Ljusgrått - - Järnstövlar + + Grått - - Diamantstövlar + + Rosa - - Guldstövlar + + Blått - - Järntacka + + Lila - - Guldtacka + + Cyanfärgat - - Hink + + Limefärgat - - Vattenhink + + Orange - - Lavahink + + Vitt - - Tändstål + + Anpassat - - Äpple + + Gult - - Pilbåge + + Ljusblått - - Pil + + Magentafärgat - - Kol + + Brunt - - Träkol + + Vitmålad glasruta - - Diamant + + Liten boll - - Stav + + Stor boll - - Skål + + Ljusblåmålad glasruta - - Svampstuvning + + Magentamålad glasruta - - Tråd + + Orangemålad glasruta - - Fjäder + + Stjärnformat - - Krut + + Svart - - Veteax + + Rött - - Vete + + Grönt - - Bröd + + Smygarformat - - Flintsten + + Explosion - - Rå fläskkotlett + + Okänd form - - Tillagad fläskkotlett + + Svartmålat glas - - Tavla + + Hästrustning i järn - - Guldäpple + + Hästrustning i guld - - Skylt + + Hästrustning i diamant - - Gruvvagn + + Rödstensjämförare - - Sadel + + Gruvvagn med dynamit - - Rödsten + + Gruvvagn med tratt - - Snöboll + + Koppel - - Båt + + Fyrljus - - Läder + + Kistfälla - - Mjölkhink + + Viktplatta (lätt) - - Tegelsten + + Namnskylt - - Lera + + Träplankor (alla sorter) - - Sockerrör + + Kommandoblock - - Papper + + Fyrverkeristjärna - - Bok + + De här djuren kan tämjas och sedan ridas. De kan utrustas med en kista. - - Slemklump + + Mula - - Gruvvagn med kista + + Föds när en häst parar sig med en åsna. De här djuren kan tämjas och sedan ridas, och kan bära kistor. - - Gruvvagn med ugn + + Häst - - Ägg + + De här djuren kan tämjas och sedan ridas. - - Kompass + + Åsna - - Fiskespö + + Zombiehäst - - Klocka + + Tom karta - - Glödstensstoft + + Nederstjärna - - Rå fisk + + Fyrverkeriraket - - Tillagad fisk + + Skeletthäst - - Färgämne + + Wither - - Bläcksäck + + De här tillverkas av witherskallar och själsand. De skjuter exploderande döskallar mot dig. - - Rosenröd + + Viktplatta (tung) - - Kaktusgrön + + Ljusgråfärgad lera - - Kakaobönor + + Gråfärgad lera - - Lasursten + + Rosafärgad lera - - Lila färg + + Blåfärgad lera - - Cyanfärg + + Lilafärgad lera - - Ljusgrå färg + + Cyanfärgad lera - - Grå färg + + Limefärgad lera - - Rosa färg + + Orangefärgad lera - - Limegrön färg + + Vitfärgad lera - - Maskrosgul färg + + Målat glas - - Ljusblå färg + + Gulfärgad lera - - Magentafärg + + Ljusblåfärgad lera - - Orange färg + + Magentafärgad lera - - Benmjöl + + Brunfärgad lera - - Ben + + Tratt - - Socker + + Aktiveringsräls - - Tårta + + Utmatare - - Säng + + Rödstensjämförare - - Rödstensförstärkare + + Dagsljussensor - - Kaka + + Rödstensblock - - Karta + + Färgad lera - - Musikskiva - "13" + + Svartfärgad lera - - Musikskiva - "cat" + + Rödfärgad lera - - Musikskiva - "blocks" + + Grönfärgad lera - - Musikskiva - "chirp" + + Höbal - - Musikskiva - "far" + + Härdad lera - - Musikskiva - "mall" + + Kolblock - - Musikskiva - "mellohi" + + Tona till - - Musikskiva - "stal" + + När det här alternativet är avstängt kan varken monster eller djur förändra block, eller plocka upp föremål. Exempelvis förstörs inga block av exploderande smygare, och får kan inte äta gräs. - - Musikskiva - "strad" + + När det här alternativet är aktiverat får spelare behålla allt i sin inventarie när de dör. - - Musikskiva - "ward" + + När det här alternativet är avstängt spawnar inga varelser naturligt. - - Musikskiva - "11" + + Spelläge: Äventyr - - Musikskiva - "where are we now" + + Äventyr - - Sax + + Skriv in ett frö för att skapa samma terräng på nytt. Lämna tomt för en slumpmässig värld. - - Pumpafrön + + När det här alternativet är avstängt kommer varken monster eller djur att släppa föremål (exempelvis tappar inte smygare något krut). - - Melonfrön + + {*PLAYER*} föll av en stege - - Rå kyckling + + {*PLAYER*} föll av några vinrankor - - Tillagad kyckling + + {*PLAYER*} föll ut ur vattnet - - Rått nötkött + + När det här alternativet är avstängt släpps inga föremål när block förstörs (exempelvis släpper inte stenblock någon kullersten). - - Biffstek + + När det här alternativet är avstängt kommer inte spelare att återställa hälsa automatiskt. - - Ruttet kött + + När det här alternativet är avstängt ändras inte tiden på dygnet. - - Enderpärla + + Gruvvagn - - Melonskiva + + Koppla - - Brännstav + + Släpp - - Spöktår + + Fäst - - Guldklimp + + Kliv av - - Nedervårta + + Fäst kista - - {*prefix*}Brygd{*postfix*}{*splash*} + + Avfyra - - Glasflaska + + Namnge - - Vattenflaska + + Fyrljus - - Spindelöga + + Primär kraft - - Fermenterat spindelöga + + Sekundär kraft - - Brännpulver + + Häst - - Magmasalva + + Utmatare - - Brygdställ + + Tratt - - Kittel + + {*PLAYER*} föll från en hög plats - - Enderöga + + Du kan inte använda ägget för tillfället. Det maximala antalet fladdermöss har uppnåtts. - - Glimmande melon + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga hästar har uppnåtts. - - Förtrollningsflaska + + Spelalternativ - - Eldladdning + + {*PLAYER*} sveddes av {*SOURCE*} som använde {*ITEM*} - - Eldladdning (träkol) + + {*PLAYER*} mörbultades av {*SOURCE*} som använde {*ITEM*} - - Eldladdning (kol) + + {*PLAYER*} dödades av {*SOURCE*} som använde {*ITEM*} - - Uppvisningsbox + + Destruktiva varelser - - Spawna {*CREATURE*} + + Föremål från block - - Nedermursten + + Naturlig återställning - - Dödskalle + + Dagsljuscykel - - Skelettskalle + + Behåll inventarie - - Witherskelettskalle + + Varelsespawn - - Zombiehuvud + + Föremål från varelser - - Huvud + + {*PLAYER*} sköts av {*SOURCE*} som använde {*ITEM*} - - Huvud från %s + + {*PLAYER*} föll för långt och dödades av {*SOURCE*} - - Smygarhuvud + + {*PLAYER*} föll till sin död på grund av att {*SOURCE*} använde {*ITEM*} - - Sten + + {*PLAYER*} gick in i eld i strid mot {*SOURCE*} - - Gräsblock + + {*PLAYER*} föll till sin död på grund av {*SOURCE*} - - Jord + + {*PLAYER*} föll till sin död på grund av {*SOURCE*} - - Kullersten + + {*PLAYER*} föll till sin död på grund av att {*SOURCE*} använde {*ITEM*} - - Ekträplankor + + {*PLAYER*} brändes till aska i strid mot {*SOURCE*} - - Granträplankor + + {*PLAYER*} sprängdes av {*SOURCE*} - - Björkträplankor + + {*PLAYER*} förmultnade - - Djungelträplankor + + {*PLAYER*} dödades av {*SOURCE*} som använde {*ITEM*} - - Skott + + {*PLAYER*} försökte att simma i lava för att fly från {*SOURCE*} - - Ekskott + + {*PLAYER*} drunknade i försöket att fly från {*SOURCE*} - - Granskott + + {*PLAYER*} gick in i en kaktus i försöket att fly från {*SOURCE*} - - Björkskott + + Kliv på - - Djungelträdskott + + +För att styra en häst måste den vara utrustad med en sadel. De kan köpas från bybor eller hittas i kistor som finns utspridda i världen. + - - Berggrund + + +Tama åsnor och mulor kan utrustas med sadelväskor genom att fästa en kista. Du kan titta i väskorna medan du rider eller när du smyger. + - - Vatten + + +Hästar och åsnor (men inte mulor) kan avlas med hjälp av gyllene äpplen eller gyllene morötter, precis som andra djur. Föl växer upp till vuxna hästar med tiden, men mognadsprocessen kan påskyndas genom att mata dem med vete eller hö. + - - Lava + + +Hästar, åsnor och mulor måste tämjas innan de kan användas. Tämj en häst genom att sätta dig på den och hålla dig kvar medan den försöker skaka av sig dig. + - - Sand + + +När den har tämjts dyker det upp hjärtan, och den försöker inte längre kasta av sig dig. + - - Sandsten + + +Pröva att rida på hästen nu. Använd {*CONTROLLER_ACTION_USE*} utan föremål eller verktyg i handen för att kliva på. + - - Grus + + +Du kan försöka dig på att tämja hästarna och åsnorna här, och det finns sadlar, hästrustningar och andra praktiska föremål i kistorna i närheten också. + - - Guldmalm + + +Ett fyrljus på en pyramid bestående av minst fyra lager låter dig välja mellan en sekundär kraft som återställer hälsa eller en starkare primär kraft. + - - Järnmalm + + +För att ställa in fyrljusets krafter måste du offra en smaragd, diamant, guld- eller järntacka i betalningsinkastet. När krafterna har ställts in utstrålas de från fyrljuset för alltid. + - - Kolmalm + + Högst upp på pyramiden finns ett inaktivt fyrljus. - - Trä + + +Det här är gränssnittet för fyrljus, vilket du kan använda för att välja fyrljusets krafter. + - - Ekträ + + +{*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. +{*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder fyrljusets gränssnitt. + - - Granträ + + +Fyrljusmenyn låter dig välja en primär kraft till ditt fyrljus. Ju fler lager din pyramid består av, desto fler krafter kan du välja mellan. + - - Björkträ + + +Alla vuxna hästar, åsnor och mulor kan ridas. Hästar kan ges rustning, medan mulor och åsnor kan ges sadelväskor för att underlätta vid transport av föremål. + - - Djungelträ + + +Det här är hästinventariets gränssnitt. + - - Ek - - - Gran - - - Björk - - - Löv - - - Eklöv - - - Granbarr + + +{*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. +{*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder hästars inventarie. + - - Björklöv + + +Hästinventariet låter dig ge föremål till din häst, åsna eller mula. Det låter dig även utrusta dem med föremål. + - - Djungellöv + + Tindra - - Svamp + + Svans - - Glas + + Flygtid: - - Ull + + +Sadla din häst genom att sätta en sadel i sadelrutan. Hästar kan ges rustning genom att placera hästrustning i rustningsrutan. + - - Svart ull + + Du har hittat en mula. - - Röd ull + + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hästar, åsnor och mulor. + {*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder hästar, åsnor och mulor. + - - Grön ull + + +Hästar och åsnor hittas mestadels på öppna fält. Mulor är en blandras mellan åsnor och hästar, men de är själva infertila. + - - Brun ull + + +Du kan även flytta föremål mellan dig själv och sadelväskor som sitter på åsnor och mulor i den här menyn. + - - Blå ull + + Du har hittat en häst. - - Lila ull + + Du har hittat en åsna. - - Cyanfärgad ull + + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om fyrljus. + {*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder fyrljus. + - - Ljusgrå ull + + +Fyrverkeristjärnor kan tillverkas genom att placera krut och färgämnen i tillverkningsrutorna. + - - Grå ull + + +Färgämnet bestämmer färgen på fyrverkeristjärnans explosion. + - - Rosa ull + + +Fyrverkeristjärnans form kan bestämmas genom att lägga till en eldladdning, guldklimp, fjäder eller ett fiendehuvud. + - - Limegrön ull + + +Om du vill kan du placera flera fyrverkeristjärnor i tillverkningsrutorna för att lägga till dem i fyrverkerierna. + - - Gul ull + + +Ju fler rutor du fyller med krut, desto högre upp exploderar fyrverkeristjärnorna. + - - Ljusblå ull + + +Du kan sedan ta de tillverkade fyrverkerierna ur resultatfacket. + - - Magentafärgad ull + + +Den kan tindra eller ges en svans genom att lägga till glödstensstoft eller diamanter. + - - Orange ull + + +Fyrverkerier är dekorativa föremål som kan avfyras manuellt eller från automater. De tillverkas av papper, krut och ett valfritt antal fyrverkeristjärnor. + - - Vit ull + + +Fyrverkeristjärnornas färg, toning, form, storlek och effekter (som att de har svans eller tindrar) kan anpassas genom att lägga till fler ingredienser vid tillverkningen. + - - Blomma + + +Pröva att tillverka fyrverkerier vid arbetsbänken med hjälp av ingredienserna i kistorna. + - - Ros + + +När en fyrverkeristjärna har tillverkats kan den ges en toningsfärg genom att tillverkas tillsammans med ett färgämne. + - - Svamp + + +I kistorna här finns diverse föremål som används vid tillverkningen av FYRVERKERIER! + - - Guldblock + + +{*B*}Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om fyrverkerier. +{*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder fyrverkerier. + - - Ett kompakt sätt att förvara guld. + + +För att tillverka fyrverkerier, placera krut och papper i 3x3-tillverkningsrutorna ovanför din inventarie. + - - Järnblock + + Det här rummet innehåller trattar - - Ett kompakt sätt att förvara järn. + + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om trattar. + {*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder trattar. + - - Stenplatta + + +Trattar används för att stoppa i eller ta ut föremål från behållare, och för att automatiskt plocka upp föremål som kastas i dem. + - - Stenplatta + + +Aktiva fyrljus skickar upp en ljusstråle i himlen och ger spelare i närheten krafter. De tillverkas av glas, obsidian och nederstjärnor, vilka kan fås genom att besegra Wither. + - - Sandstensplatta + + +Fyrljus måste placeras så att de står i solljus under dagtid. De måste även placeras på pyramider av järn, guld, smaragd eller diamant. Materialet som fyrljuset ställs på har ingen effekt på fyrljusets kraft. + - - Ekplatta + + +Pröva att använda fyrljuset för att ställa in vilka krafter det ger. Du kan använda järntackorna som betalning. + - - Kullerstensplatta + + +De kan användas med brygdställ, kistor, automater, gruvvagnar med kistor, gruvvagnar med trattar samt med andra trattar. + - - Tegelstensplatta + + +Det finns diverse praktiska trattlayouter i det här rummet som du kan experimentera med. + - - Murstensplatta + + +Det här är fyrverkerigränssnittet. Här kan du tillverka fyrverkerier och fyrverkeristjärnor. + - - Ekplatta + + +{*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. +{*B*}Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder fyrverkerigränssnittet. + - - Granplatta + + +Trattar flyttar kontinuerligt föremål från behållare placerade ovanför dem. De försöker även stoppa lagrade föremål i en annan behållare. + - - Björkplatta + + +Om en tratt drivs av rödsten blir den inaktiv och slutar med uppsamlingen och insättningen av föremål. + - - Djungelträplatta + + +Trattar pekar i den riktning de försöker mata ut föremål. För att peka en tratt mot ett visst block, placera tratten mot det blocket medan du smyger. + - - Nedermurstensplatta + + De här fienderna finns i träsk och attackerar genom att kasta brygder. De tappar brygder när de dödas. - - Tegelsten + + Det maximala antalet tavlor/uppvisningsboxar i en värld har uppnåtts. - - Dynamit + + Du kan inte spawna fiender i det fridfulla läget. - - Bokhylla + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga grisar, får, kor, katter och hästar har uppnåtts. - - Mossten + + Du kan inte använda ägget för tillfället. Det maximala antalet bläckfiskar i en värld har uppnåtts. - - Obsidian + + Du kan inte använda ägget för tillfället. Det maximala antalet fiender i en värld har uppnåtts. - - Fackla + + Du kan inte använda ägget för tillfället. Det maximala antalet bybor i en värld har uppnåtts. - - Fackla (kol) + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga vargar har uppnåtts. - - Fackla (träkol) + + Det maximala antalet varelsehuvuden i en värld har uppnåtts. - - Eld + + Omvänd Y-axel - - Monsterspawnare + + Vänsterhänt - - Ektrappor + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga höns har uppnåtts. - - Kista + + Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga svampkor har uppnåtts. - - Rödstensstoft + + Det maximala antalet båtar i en värld har uppnåtts. - - Diamantmalm + + Du kan inte använda ägget för tillfället. Det maximala antalet höns i en värld har uppnåtts. - - Diamantblock + + +{*C2*}Ta ett djupt andetag. Ta ett till. Känn luften i lungorna. Låt dina kroppsdelar vakna. Ja, rör på fingrarna. Ha en kropp igen, känn gravitationen, känn luften. Återgå till den långa drömmen. Där är du. Hela din kropp vidrör universum, som om ni var två skilda saker. Som om vi var skilda saker.{*EF*}{*B*}{*B*} +{*C3*}Vilka är vi? För länge sedan kallades vi för bergets ande. Fader sol, moder måne. Förfädernas andar, djurens andar. Djinn. Spöken. Den gröne mannen. Sedan gudar och demoner. Änglar. Poltergeister. Rymdvarelser, utomjordingar. Leptoner, kvarkar. Orden förändras. Vi förändras inte.{*EF*}{*B*}{*B*} +{*C2*}Vi är universum. Vi är allt du tror inte är du. Du ser på oss nu, genom huden och ögonen. Varför tror du att universum vidrör dig och kastar ljus på dig? För att se dig, spelare. För att lära känna dig. Och för att bli känt. Jag ska berätta en historia för dig.{*EF*}{*B*}{*B*} +{*C2*}Det var en gång en spelare.{*EF*}{*B*}{*B*} +{*C3*}Spelaren var du, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Ibland såg den sig som en människa på skorpan av ett klot som bestod av smält sten. Klotet av smält sten låg i omlopp runt ett klot av brinnande gas som var 330.000 gånger större än det. De var så långt ifrån varandra att det tog åtta minuter för ljuset att ta sig från det ena klotet till det andra. Ljuset var information från en stjärna, och det kunde bränna dig från ett avstånd på 150 miljoner kilometer.{*EF*}{*B*}{*B*} +{*C2*}Ibland drömde spelaren att den var en gruvarbetare på ytan av en planet som var platt och oändlig. Solen var en vit fyrkant. Dagarna var korta – det fanns mycket att göra och döden var bara en tillfällig obekvämlighet.{*EF*}{*B*}{*B*} +{*C3*}Ibland drömde spelaren att den tappade bort sig i en berättelse.{*EF*}{*B*}{*B*} +{*C2*}Ibland drömde spelaren att den var andra saker, på andra platser. Ibland var drömmarna skrämmande. Ibland var de vackra. Ibland kunde spelaren gå från en dröm till en annan, och sedan vakna från den in i en tredje.{*EF*}{*B*}{*B*} +{*C3*}Ibland drömde spelaren att den läste ord på en skärm.{*EF*}{*B*}{*B*} +{*C2*}Låt oss backa en bit.{*EF*}{*B*}{*B*} +{*C2*}Spelarens atomer låg utspridda i gräset, i floderna, i luften, i marken. En kvinna samlade atomerna – hon drack, åt och andades – och kvinnan satte ihop spelaren i sin kropp.{*EF*}{*B*}{*B*} +{*C2*}Till slut vaknade spelaren. Från den varma, mörka världen i modern och ut i den långa drömmen.{*EF*}{*B*}{*B*} +{*C2*}Spelaren var en ny historia, en som aldrig hade berättats förut, skriven med alfabetet vi kallar för DNA. Spelaren var ett nytt program som aldrig hade körts förut, genererad av en källkod som är över en miljard år gammal. Spelaren var en ny människa som aldrig hade levt förut. En spelare gjord på inget annat än mjölk och kärlek.{*EF*}{*B*}{*B*} +{*C3*}Du är spelaren. Historien. Programmet. Människan. Gjord på inget annat än mjölk och kärlek.{*EF*}{*B*}{*B*} +{*C2*}Låt oss backa ännu längre.{*EF*}{*B*}{*B*} +{*C2*}De sju miljarders miljarders miljarder atomer i spelarens kropp skapades, långt innan spelets skapelse, i hjärtat av en stjärna. Alltså är även spelaren information från en stjärna. Spelaren rör sig genom en berättelse, vilken är en informationsdjungel planterad av en man som heter Julian, på en platt och oändlig värld skapad av en man som heter Markus. Den existerar inuti en liten, privat värld som har skapats av spelaren, som lever i ett universum skapat av...{*EF*}{*B*}{*B*} +{*C3*}Shhhh. Ibland skapade spelaren en liten, privat värld som var mjuk, varm och enkel. Andra gånger var den hård, kall och komplicerad. Ibland byggde den upp en bild av universum i sitt huvud – små energipartiklar som rörde sig genom enorma, tomma ytor. Ibland kallade den partiklarna för "elektroner" och "protoner".{*EF*}{*B*}{*B*} + - - Ett kompakt sätt att förvara diamanter. + + {*C2*}Ibland kallade den dem för "planeter" och "stjärnor".{*EF*}{*B*}{*B*} {*C2*}Ibland trodde den att den befann sig i ett universum som bestod av "av" och "på", av ettor och nollor, av rader med kod. Ibland trodde den att den spelade ett spel. Ibland trodde den att den läste ord på en skärm.{*EF*}{*B*}{*B*} {*C3*}Du är spelaren som läser ord...{*EF*}{*B*}{*B*} {*C2*}Shhh. Ibland läste spelaren rader med kod på skärmen. Omvandlade dem till ord, omvandlade orden till mening, omvandlade mening till känslor, teorier och idéer. Spelaren började andas snabbare och djupare och insåg att den var vid liv, den var vid liv, de där tusentals dödsfallen var inte på riktigt, spelaren var vid liv.{*EF*}{*B*}{*B*} {*C3*}Du. Du. Du lever.{*EF*}{*B*}{*B*} {*C2*}Ibland trodde spelaren att universum hade talat till den genom solljuset som föll genom sommarträdens rasslande löv.{*EF*}{*B*}{*B*} {*C3*}Ibland trodde spelaren att universum hade talat till den genom ljuset som föll från den iskalla natthimlen, där en ljusprick i hörnet av spelarens synfält kan vara en stjärna som är miljoner gånger så stor som solen, och så varm att den kokar planeter till plasma bara för att vara synlig för spelaren för ett kort ögonblick – spelaren som är på väg hem på andra sidan universum och helt plötsligt känner doften av mat, som närmar sig den bekanta dörren och är på väg in i drömmen igen.{*EF*}{*B*}{*B*} {*C2*}Ibland trodde spelaren att universum hade talat till den genom ettor och nollor, genom världens elektricitet, genom ord som rullar fram över skärmen vid slutet av en dröm.{*EF*}{*B*}{*B*} {*C3*}Och universum sade "jag älskar dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du har spelat spelet väl".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "allt du behöver finns inom dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är starkare än vad du tror".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är dagsljuset".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är natten".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "mörkret du kämpar mot finns inom dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "ljuset du söker finns inom dig".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är inte ensam".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är inte separerad från allt annat".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är universum som smakar sig själv, pratar med sig själv och läser sin egen kod".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "jag älskar dig, för du är kärlek".{*EF*}{*B*}{*B*} {*C3*}Sedan var spelet över och spelaren vaknade från drömmen. Spelaren drömde sedan en annan dröm. Om och om igen, bättre och bättre. Spelaren var universum, och spelaren var kärlek.{*EF*}{*B*}{*B*} {*C3*}Du är spelaren.{*EF*}{*B*}{*B*} {*C2*}Vakna.{*EF*} - - Arbetsbänk + + Återställ Nedervärlden - - Grödor + + %s har nått världens ände - - Åkermark + + %s har lämnat världens ände - - Ugn + + +{*C3*}Jag ser spelaren du menar.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Ja. Var försiktig. Den har nått en högre nivå nu. Den kan läsa våra tankar.{*EF*}{*B*}{*B*} +{*C2*}Det spelar ingen roll. Den tror att vi är en del av spelet.{*EF*}{*B*}{*B*} +{*C3*}Jag gillar den här spelaren. Den spelade bra. Den gav inte upp.{*EF*}{*B*}{*B*} +{*C2*}Den läser våra tankar som om de vore ord på skärmen.{*EF*}{*B*}{*B*} +{*C3*}Det är så den manifesterar många saker när den befinner sig djupt ned i spelandets drömmar.{*EF*}{*B*}{*B*} +{*C2*}Ord fungerar som ett underbart gränssnitt. De är väldigt flexibla. Inte alls lika läskiga som att möta verkligheten bakom skärmen.{*EF*}{*B*}{*B*} +{*C3*}De brukade höra röster. Innan spelare kunde läsa. På den tiden då de som inte spelade kallade spelare för häxor och trollkarlar. När spelare drömde att de flög fram genom luften på stavar med hjälp av demoners kraft.{*EF*}{*B*}{*B*} +{*C2*}Vad drömde den här spelaren?{*EF*}{*B*}{*B*} +{*C3*}Den här spelaren drömde om solljus och träd. Om eld och vatten. Den drömde att den skapade, och den drömde att den förstörde. Den drömde att den jagade och jagades. Den drömde om skydd.{*EF*}{*B*}{*B*} +{*C2*}Hah, det ursprungliga gränssnittet. En miljon år gammalt, och det fungerar fortfarande. Men vilka riktiga strukturer skapade den här spelaren i verkligheten bortom skärmen?{*EF*}{*B*}{*B*} +{*C3*}Den slet, med miljontals som den, för att skapa en riktig värld i {*EF*}{*NOISE*}{*C3*}, och skapade en {*EF*}{*NOISE*}{*C3*} åt {*EF*}{*NOISE*}{*C3*}, i {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Den kan inte läsa den tanken.{*EF*}{*B*}{*B*} +{*C3*}Nej. Den har inte nått den högsta nivån. Det kan den bara göra i livets långa dröm, inte i spelets korta dröm.{*EF*}{*B*}{*B*} +{*C2*}Vet den att vi älskar den? Att universum är givmilt?{*EF*}{*B*}{*B*} +{*C3*}Ja. Ibland kan den, genom oväsendet i alla tankar, höra universum.{*EF*}{*B*}{*B*} +{*C2*}Men då och då är den ledsen, i den långa drömmen. Den skapar världar utan somrar, den huttrar under en svart sol och den tar sin dystra skapelse för verklighet.{*EF*}{*B*}{*B*} +{*C3*}Att bota dess sorg skulle förgöra den. Sorgen fyller en funktion. Vi får inte komma i vägen för den.{*EF*}{*B*}{*B*} +{*C2*}Ibland, när de är djupt inne i en dröm, vill jag berätta för dem att de bygger riktiga världar i verkligheten. Ibland vill jag berätta hur viktiga de är för universum. Ibland, när de inte har gjort en riktig koppling på länge, vill jag hjälpa dem att säga ordet de fruktar.{*EF*}{*B*}{*B*} +{*C3*}Den läser våra tankar{*EF*}{*B*}{*B*} +{*C2*}Ibland bryr jag mig inte. Ibland vill jag berätta för dem att världen de tar för given bara är {*EF*}{*NOISE*}{*C2*} och {*EF*}{*NOISE*}{*C2*}, jag vill berätta att de är {*EF*}{*NOISE*}{*C2*} i {*EF*}{*NOISE*}{*C2*}. De ser så lite av verkligheten i den långa drömmen.{*EF*}{*B*}{*B*} +{*C3*}Ändå spelar de spelet.{*EF*}{*B*}{*B*} +{*C2*}Men det skulle vara så lätt att berätta för dem ...{*EF*}{*B*}{*B*} +{*C3*}Det vore för mycket för den här drömmen. Att säga hur de ska leva skulle förhindra dem från att leva.{*EF*}{*B*}{*B*} +{*C2*}Jag ska inte säga åt den här spelaren hur den ska leva.{*EF*}{*B*}{*B*} +{*C3*}Spelaren börjar bli otålig.{*EF*}{*B*}{*B*} +{*C2*}Jag ska berätta en historia för spelaren.{*EF*}{*B*}{*B*} +{*C3*}Men inte sanningen.{*EF*}{*B*}{*B*} +{*C2*}Nej. En historia där sanningen är inlåst i en bur av ord. Inte den nakna sanningen som svider oavsett avstånd.{*EF*}{*B*}{*B*} +{*C3*}Ge den en kropp igen.{*EF*}{*B*}{*B*} +{*C2*}Ja. Spelare ...{*EF*}{*B*}{*B*} +{*C3*}Använd dess namn.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Spelare av spel.{*EF*}{*B*}{*B*} +{*C3*}Bra.{*EF*}{*B*}{*B*} - - Skylt + + Vill du återställa den här sparfilens Nedervärld till dess ursprungliga tillstånd? Du kommer att förlora allt som har byggts i Nedervärlden? - - Trädörr + + Du kan inte använda ägget för tillfället. Det maximala antalet grisar, får, kor, katter och hästar har uppnåtts. - - Stege + + Du kan inte använda ägget för tillfället. Det maximala antalet svampkor har uppnåtts. - - Räls + + Du kan inte använda ägget för tillfället. Det maximala antalet vargar i en värld har uppnåtts. - - Rödstensräls + + Återställ Nedervärlden - - Sensorräls + + Återställ inte Nedervärlden - - Stentrappor + + Du kan inte klippa den här svampkon för tillfället. Det maximala antalet grisar, får, kor, katter och hästar har uppnåtts. - - Spak + + Du dog! - - Tryckplatta + + Världsalternativ - - Järndörr + + Kan bygga och bryta block - - Rödstensmalm + + Kan använda dörrar och kopplare - - Rödstensfackla + + Generera strukturer - - Knapp + + Platt värld - - Snö + + Bonuskista - - Is + + Kan öppna behållare - - Kaktus + + Sparka spelare - - Lera + + Kan flyga - - Sockerrör + + Stäng av utmattning - - Jukebox + + Kan anfalla spelare - - Staket + + Kan anfalla djur - - Pumpa + + Moderator - - Pumpalykta + + Värdprivilegier - - Nedersten + + Instruktioner - - Själsand + + Kontrollinställningar - - Glödsten + + Inställningar - - Portal + + Spawna - - Lasurstensmalm + + Erbjudanden på nedladdningsbart innehåll - - Lasurstensblock + + Ändra utseende - - Ett kompakt sätt att förvara lasursten. + + Medverkande - - Automat + + Dynamit exploderar - - Musikblock + + Spelare mot spelare - - Tårta + + Lita på spelare - - Säng + + Installera om innehåll - - Nät + + Debuginställningar - - Högt gräs + + Eld sprider sig - - Död buske + + Enderdrake - - Diod + + {*PLAYER*} dödades av enderdrakens eld - - Låst kista + + {*PLAYER*} dödades av {*SOURCE*} - - Fallucka + + {*PLAYER*} dödades av {*SOURCE*} - - Ull (vilken färg som helst) + + {*PLAYER*} dog - - Kolv + + {*PLAYER*} sprängdes - - Klibbig kolv + + {*PLAYER*} dödades av magi - - Silverfiskblock + + {*PLAYER*} sköts av {*SOURCE*} - - Mursten + + Berggrundsdimma - - Mossig mursten + + Visa gränssnittet - - Sprucken mursten + + Visa handen - - Mejslad mursten + + {*PLAYER*} träffades av ett eldklot från {*SOURCE*} - - Svamp + + {*PLAYER*} mörbultades av {*SOURCE*} - - Svamp + + {*PLAYER*} dödades av {*SOURCE*} som använde magi - - Järnstänger + + {*PLAYER*} föll av världen - - Glasskiva + + Texturpaket - - Melon + + Kombinationspaket - - Pumpastjälk + + {*PLAYER*} brann upp - - Melonstjälk + + Teman - - Rankor + + Spelarbilder - - Grind + + Avatarföremål - - Tegeltrappor + + {*PLAYER*} brann ihjäl - - Murstenstrappor + + {*PLAYER*} svalt ihjäl - - Silverfisksten + + {*PLAYER*} stacks ihjäl - - Silverfiskkullersten + + {*PLAYER*} träffade backen för hårt - - Silverfiskmursten + + {*PLAYER*} försökte sig på att simma i lava - - Mycel + + {*PLAYER*} kvävdes i en vägg - - Näckros + + {*PLAYER*} drunknade - - Nedermursten + + Dödsmeddelanden - - Nederstängsel + + Du är inte längre moderator - - Nedertrappor + + Du kan flyga - - Nedervårta + + Du kan inte längre flyga - - Förtrollningsbord + + Du kan inte längre anfalla djur - - Brygdställ + + Nu kan du anfalla djur - - Kittel + + Du har blivit till moderator - - Portal till världens ände + + Du blir inte längre utmattad - - Ram för portal till världens ände + + Nu är du odödlig - - Endersten + + Du är inte längre odödlig - - Drakägg + + %d MSP - - Buske + + Nu kan du bli utmattad - - Ormbunke + + Nu är du osynlig - - Sandstenstrappor + + Du är inte längre osynlig - - Grantrappor + + Nu kan du anfalla spelare - - Björktrappor + + Nu kan du bryta block och använda föremål - - Djungelträtrappor + + Du kan inte längre placera block - - Rödstensbelysning + + Nu kan du placera block - - Kakao + + Animerad spelfigur - - Dödskalle + + Anpassad utseendeanimation - - Nuvarande kontrollinställningar + + Du kan inte längre bryta block eller använda föremål - - Layout + + Nu kan du använda dörrar och kopplare - - Gå/spring + + Du kan inte längre anfalla varelser - - Titta + + Nu kan du anfalla varelser - - Pausa + + Du kan inte längre anfalla spelare - - Hoppa + + Du kan inte längre använda dörrar eller kopplare - - Hoppa/flyg upp + + Nu kan du använda behållare (exempelvis kistor) - - Inventarie + + Du kan inte längre använda behållare (exempelvis kistor) - - Byt föremål i handen + + Osynlig - - Handling + + Fyrljus + + + {*T3*}INSTRUKTIONER: FYRLJUS{*ETW*}{*B*}{*B*} +Aktiva fyrljus skickar upp en ljusstråle i himlen och ger spelare i närheten krafter.{*B*} +De tillverkas av glas, obsidian och nederstjärnor, vilka kan fås genom att besegra Wither.{*B*}{*B*} +Fyrljus måste placeras så att de står i solljus under dagtid. De måste även placeras på pyramider av järn, guld, smaragd eller diamant.{*B*} +Materialet som fyrljuset ställs på har ingen effekt på fyrljusets kraft.{*B*}{*B*} +Fyrljusmenyn låter dig bestämma vilken primär kraft ditt fyrljus har. Ju fler lager pyramiden består av, desto fler krafter kan du välja mellan.{*B*} +Ett fyrljus på en pyramid med minst fyra lager låter dig även välja mellan att ha regenerering som sekundär kraft, eller att ha en starkare primär kraft.{*B*}{*B*} +För att ställa in fyrljusets krafter måste du offra en smaragd, diamant, guld- eller järntacka i betalningsinkastet.{*B*} +När krafterna har ställts in strålar de ut från fyrljuset för alltid.{*B*} + - - Använd + + Fyrverkerier + + + Språk + + + Hästar + + + {*T3*}INSTRUKTIONER: HÄSTAR{*ETW*}{*B*}{*B*} +Hästar och åsnor hittas på öppna fält. Mulor är en blandras mellan åsnor och hästar, men de är själva infertila.{*B*} +Alla vuxna hästar, åsnor och mulor kan ridas. Hästar kan utrustas med rustning, medan mulor och åsnor kan förses med sadelväskor för att underlätta vid transport av föremål.{*B*}{*B*} +Hästar, åsnor och mulor måste tämjas innan de kan användas. För att tämja en häst måste du sätta dig på den och hålla dig kvar medan den försöker skaka av sig dig.{*B*} +När hjärtan dyker upp runt hästen är den tam, och den kommer inte längre att försöka kasta av sig dig. För att styra hästen måste du sätta på den en sadel.{*B*}{*B*} +Sadlar kan köpas från bybor eller upptäckas i kistor som finns utspridda i världen.{*B*} +Tama åsnor och mulor kan utrustas med sadelväskor genom att sätta på dem en kista. De här sadelväskorna kan sedan öppnas medan du rider eller smyger.{*B*}{*B*} +Hästar och åsnor (men inte mulor) kan avlas genom att använda gyllene äpplen eller gyllene morötter, precis som andra djur.{*B*} +Föl växer upp till vuxna hästar med tiden. Mognadsprocessen kan påskyndas genom att mata dem med vete eller hö.{*B*} + - - Tillverkning + + {*T3*}INSTRUKTIONER: FYRVERKERIER{*ETW*}{*B*}{*B*} +Fyrverkerier är dekorativa föremål som kan avfyras manuellt eller från automater. De tillverkas av papper, krut och ett valfritt antal fyrverkeristjärnor.{*B*} +Fyrverkeristjärnornas färg, toning, form, storlek och effekter (som att de har svans eller tindrar) kan anpassas genom att lägga till fler ingredienser vid tillverkningen.{*B*}{*B*} +För att tillverka fyrverkerier, placera krut och papper i 3x3-tillverkningsrutorna ovanför din inventarie.{*B*} +Om du vill kan du placera flera fyrverkeristjärnor i tillverkningsrutorna för att lägga till dem i fyrverkerierna.{*B*} +Ju fler rutor du fyller med krut, desto högre upp exploderar fyrverkeristjärnorna.{*B*}{*B*} +Du kan sedan ta de tillverkade fyrverkerierna ur resultatfacket.{*B*}{*B*} +Fyrverkeristjärnor kan tillverkas genom att placera krut och färgämnen i tillverkningsrutorna.{*B*} +- Färgämnet bestämmer färgen på fyrverkeristjärnans explosion.{*B*} +- Fyrverkeristjärnans form kan bestämmas genom att lägga till en eldladdning, guldklimp, fjäder eller ett fiendehuvud.{*B*} +- Den kan tindra eller ges en svans genom att lägga till glödstensstoft eller diamanter.{*B*}{*B*} +När en fyrverkeristjärna har tillverkats kan den ges en toningsfärg genom att tillverkas tillsammans med ett färgämne. + - - Släpp + + {*T3*}INSTRUKTIONER: UTMATARE{*ETW*}{*B*}{*B*} +När en utmatare får en rödstenssignal matar den ut ett av sina föremål framför sig. Använd {*CONTROLLER_ACTION_USE*} för att öppna utmataren, sedan kan du ladda utmataren med föremål från din inventarie.{*B*} +Om utmataren är vänd mot en kista eller mot någon annan behållare kommer föremålet att placeras i kistan i stället. Långa kedjor med utmatare kan byggas för att transportera föremål långa sträckor. För att det ska fungera måste de slås av och på upprepade gånger. + - - Smyg + + När den används blir den till en karta över världen du befinner dig i, och fylls i när du utforskar. - - Smyg/flyg gned + + Tappas av Wither, används vid tillverkning av fyrljus. - - Byt kameraläge + + Trattar - - Spelare/bjud in + + {*T3*}INSTRUKTIONER: TRATTAR{*ETW*}{*B*}{*B*} +Trattar används för att stoppa i eller ta ut föremål från behållare, och för att automatiskt plocka upp föremål som kastas i dem.{*B*} +De kan användas med brygdställ, kistor, automater, gruvvagnar med kistor, gruvvagnar med trattar samt med andra trattar.{*B*}{*B*} +Trattar flyttar kontinuerligt föremål från behållare placerade ovanför dem. De försöker även stoppa lagrade föremål i en annan behållare.{*B*} +Om en tratt drivs av rödsten blir den inaktiv och slutar med uppsamlingen och utmatningen av föremål.{*B*}{*B*} +Trattar pekar i den riktning de försöker mata ut föremål. För att peka en tratt mot ett visst block, placera tratten mot det blocket medan du är hukad.{*B*} + - - Förflyttning (när du flyger) + + Utmatare - - Layout 1 + + NOT USED - - Layout 2 + + Hälsa direkt - - Layout 3 + + Skada direkt - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Högre hopp - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Lathet - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Styrka - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Svaghet - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Illamående - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Regenerering - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Motstånd - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Söker frö till världsgeneratorn - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Exploderar i ett fyrverkeri av färger när den aktiveras. Färg, effekt, form och toning bestäms av fyrverkeristjärnan som används när fyrverkeriet tillverkas. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + En sorts räls som kan aktivera eller inaktivera gruvvagnar med trattar och aktivera gruvvagnar med dynamit. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Används för att förvara och mata ut föremål, eller för att stoppa föremål i en annan behållare när den matas med en rödstenssignal. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Färggranna block som tillverkas genom att färga härdad lera. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Skickar en rödstenssignal. Signalen blir starkare ju fler föremål står på plattan. Kräver mer vikt än den lätta plattan. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Används som rödstenskraftkälla. Kan göras om till rödsten igen. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Används för att fånga upp föremål eller för att skicka föremål mellan behållare. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Kan ges till hästar, åsnor eller mulor för att läka upp till 10 hjärtan. Gör att föl växer snabbare. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Fladdermus - - {*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. + + De här flygande varelserna finns i grottor och i andra stora omslutna områden. - - {*B*}Tryck på{*CONTROLLER_VK_A*} för att påbörja övningen.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du tycker att du är redo att spela på egen hand. + + Häxa - - Minecraft är ett spel som går ut på att placera block och bygga allt du kan tänka dig. -På natten kommer monster ut - se till att bygga skydd innan det händer. + + Tillverkas genom att härda lera i en ugn. - - Använd{*CONTROLLER_ACTION_LOOK*} för att se dig omkring. + + Tillverkas av glas och färgämne. - - Använd{*CONTROLLER_ACTION_MOVE*} för att röra dig. + + Tillverkas av målat glas - - Tryck{*CONTROLLER_ACTION_MOVE*} framåt två gånger snabbt för att springa. Så länge du håller{*CONTROLLER_ACTION_MOVE*} framåt kommer spelfiguren att springa, bara du inte får slut på språngtid eller mat. + + Skickar en rödstenssignal. Signalen blir starkare ju fler föremål står på plattan. - - Tryck på{*CONTROLLER_ACTION_JUMP*} för att hoppa. + + Ett block som skickar en rödstenssignal baserad på solljus (eller bristen på solljus). - - Håll in{*CONTROLLER_ACTION_ACTION*} för att bryta och hugga block med händerna eller det föremål du håller i. Du kan behöva särskilda verktyg för att bryta vissa block. + + En speciell sorts gruvvagn som fungerar som en tratt. Den samlar upp föremål som ligger på spår och från behållare ovanför den. - - Håll in{*CONTROLLER_ACTION_ACTION*} för att hugga ned fyra träblock (trädstammar).{*B*}När ett block går sönder kan du plocka upp det genom att ställa dig nära det svävande föremål som dyker upp - då stoppas det i ditt inventarie. + + En särskild sorts rustning som kan ges till hästar. Ger 5 rustning. - - Tryck på{*CONTROLLER_ACTION_CRAFTING*} för att öppna tillverkningsgränssnittet. + + Använd för att bestämma färg, effekt och form på en fyrverkeripjäs. - - Förr eller senare kommer du att fylla ditt inventarie.{*B*} - Tryck på{*CONTROLLER_ACTION_INVENTORY*} för att öppna inventariet. + + Används i rödstenskretsar för att bibehålla, jämföra eller försvaga signalstyrka, eller för att läsa av vissa blocks status. - - När du rör dig, bryter block och anfaller töms din hungermätare{*ICON_SHANK_01*}. Att springa och språnghoppa tömmer mätaren snabbare än om du rör dig och hoppar normalt. + + En sorts gruvvagn som fungerar som ett rörligt dynamitblock. - - Om du förlorar hälsa men har nio eller fler{*ICON_SHANK_01*} på hungermätaren, kommer din hälsa att fyllas på automatiskt. Ät mat för att fylla din hungermätare. + + En särskild sorts rustning som kan ges till hästar. Ger 7 rustning. - - Håll in{*CONTROLLER_ACTION_USE*} när du håller i mat för att äta den och fylla din hungermätare. Du kan inte äta mat när hungermätaren är full. + + Används för att köra kommandon. - - Din hungermätare börjar bli tom och du har förlorat hälsa. Ät en biffstek från ditt inventarie för att fylla på hungermätaren och börja återfå hälsa.{*ICON*}364{*/ICON*} + + Skickar upp en stråle av ljus i himlen och kan ge spelare i närheten statuseffekter. - - Det trä som du har samlat in kan göras till plankor. Öppna tillverkningsgränssnittet för att tillverka dem.{*PlanksIcon*} + + Förvarar block och föremål. Ställ två kistor bredvid varandra för att skapa en större kista med dubbel kapacitet. Kistfällan skickar en rödstenssignal när den öppnas. - - Många saker kräver flera steg i tillverkningsprocessen. Nu när du har plankor finns det nya saker att tillverka. Tillverka en arbetsbänk.{*CraftingTableIcon*} + + En särskild sorts rustning som kan ges till hästar. Ger 11 rustning. - - För att snabba upp insamlingsprocessen kan du bygga verktyg för jobbet. Vissa verktyg har skaft gjorda av stavar. Tillverka några stavar nu.{*SticksIcon*} + + Används för att koppla varelser till spelare eller stolpar - - Använd{*CONTROLLER_ACTION_LEFT_SCROLL*} och{*CONTROLLER_ACTION_RIGHT_SCROLL*} för att byta vad du håller i. + + Används för att namnge varelser i världen. - - Använd{*CONTROLLER_ACTION_USE*} för att använda föremål och objekt, och för att placera ut vissa saker. Saker som har placerats ut kan plockas upp igen genom att bryta ned dem med rätt verktyg. + + Flitighet - - När du har valt arbetsbänken pekar du hårkorset på den plats där du vill ställa den, sedan trycker du på{*CONTROLLER_ACTION_USE*} för att placera arbetsbänken där. + + Lås upp fullversion - - Peka hårkorset på arbetsbänken och tryck på{*CONTROLLER_ACTION_USE*} för att använda den. + + Återgå till spelet - - En spade gör det lättare att gräva i mjuka block, som jord och snö, snabbare. Ju fler material du skaffar, desto tåligare och effektivare verktyg kan du tillverka. Bygg en träspade.{*WoodenShovelIcon*} + + Spara - - En yxa hjälper dig att hugga ned träd och träblock snabbare. Ju fler material du skaffar, desto tåligare och effektivare verktyg kan du tillverka. Bygg en träyxa.{*WoodenHatchetIcon*} + + Spela - - En hacka hjälper dig att bryta hårda block, som sten och malmblock, snabbare. Ju fler material du skaffar, desto tåligare och effektivare verktyg kan du tillverka. Bygg en trähacka.{*WoodenPickaxeIcon*} + + Rankningslistor - - Öppna behållaren. + + Hjälp och alternativ - - - Natten kommer snabbare än man kan ana, och det är farligt att befinna sig utomhus om man inte är ordentligt förberedd. Du kan tillverka vapen och rustningsdelar, men det är klokt att ha ett tryggt skydd. - + + Svårighetsgrad: - - - I närheten finns en gruvarbetares övergivna skydd. Du kan reparera det för att vara trygg hela natten. - + + Spelare mot spelare: - - - Du måste samla resurser för att reparera skyddet. Väggar och tak kan byggas med vilket material som helst, men du kommer att behöva en dörr, några fönster och något som ger ljus. - + + Lita på spelare: - - Använd hackan för att bryta några stenblock. De producerar kullersten när de bryts. Om du plockar upp åtta kullerstensblock kan du bygga en ugn. Du kan behöva gräva dig ned genom några lager jord innan du når sten, så använd spaden först.{*StoneIcon*} + + Dynamit: - - Du har samlat tillräckligt mycket kullersten för att bygga en ugn. Använd din arbetsbänk för att bygga en. + + Speltyp: - - Använd{*CONTROLLER_ACTION_USE*} för att placera ut ugnen i världen, öppna den sedan. + + Strukturer: - - Använd ugnen för att producera träkol. Medan du väntar på att den blir klar kan du samla fler resurser för att reparera skyddet. + + Nivåtyp: - - Använd ugnen för att producera glas. Medan du väntar på att den blir klar kan du samla fler resurser för att reparera skyddet. + + Inga spel hittades - - Ett bra skydd behöver en dörr så att du kan komma och gå utan att behöva ha sönder väggarna hela tiden. Tillverka en trädörr nu.{*WoodenDoorIcon*} + + Endast inbjudan - - Använd{*CONTROLLER_ACTION_USE*} för att placera ut dörren. Du kan använda{*CONTROLLER_ACTION_USE*} för att öppna och stänga trädörrar som står utplacerade i världen. + + Fler alternativ - - Det kan bli väldigt mörkt på natten, så du behöver ljus inne i skyddet för att kunna se något. Öppna tillverkningsgränssnittet och bygg en fackla av stavar och träkol.{*TorchIcon*} + + Ladda - - - Du har klarat av den första delen av övningen. - + + Värdalternativ - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att fortsätta med övningen.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du tycker att du är redo att fortsätta på egen hand. - + + Spelare/bjud in - - - Det här är ditt inventarie. Det visar vad du kan använda med händerna och allt annat du bär på. Här visas även din rustning. - + + Onlinespel - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder inventariet. - + + Ny värld - - - Använd{*CONTROLLER_MENU_NAVIGATE*} för att styra markören. Använd{*CONTROLLER_VK_A*} för att plocka upp ett föremål under markören. - Om det finns mer än ett föremål under markören kommer du att plocka upp alla, eller så kan du använda{*CONTROLLER_VK_X*} för att plocka upp hälften av dem. - + + Spelare - - - Använd markören för att flytta det här föremålet till en annan plats i inventariet. Tryck på{*CONTROLLER_VK_A*} för att lägga det där. - När markören bär på flera föremål trycker du på{*CONTROLLER_VK_A*} för att lägga undan alla, eller på{*CONTROLLER_VK_X*} för att bara lägga undan ett av dem. - + + Anslut till spel - - - Om du flyttar markören utanför gränssnittet när markören håller i ett föremål, kan du släppa föremålet. - + + Starta - - - Om du vill ha mer information om ett föremål, flyttar du markören över föremålet och trycker på {*CONTROLLER_VK_BACK*}. - + + Världens namn - - - Tryck på{*CONTROLLER_VK_B*} nu för att stänga inventariet. - + + Frö till världsskaparen - - - Det här är det kreativa lägets inventarie. Det visar vad du kan använda med händerna och allt annat du kan välja från. - + + Lämna blankt för ett slumpmässigt frö - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder det kreativa lägets inventarie. - + + Eld sprider sig: - - - Använd{*CONTROLLER_MENU_NAVIGATE*} för att styra markören. - I föremålslistan kan du använda{*CONTROLLER_VK_A*} för att plocka upp ett föremål under markören, eller{*CONTROLLER_VK_Y*} för att plocka upp hela högen med sådana föremål. - + + Redigera skylttext: - - - Markören flyttas automatiskt till en plats på användningsraden. Du kan lägga föremålet där med{*CONTROLLER_VK_A*}. När du har lagt dit föremålet återvänder markören till föremålslistan där du kan välja ett annat föremål. - + + Fyll i uppgifterna som följer med din skärmbild - - - Om du flyttar markören utanför gränssnittet när markören håller i ett föremål, kan du släppa föremålet i världen. Tryck på{*CONTROLLER_VK_X*} för att ta bort alla föremål ur snabbvalsraden. - + + Bildtext - - - Bläddra mellan de olika gruppflikarna genom att trycka på{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*}. På de flikarna kan du välja vilka slags föremål du vill plocka upp. - + + Verktygstips - - - För mer information om ett föremål, för markören över det och tryck på{*CONTROLLER_VK_BACK*}. - + + Lodrät skärmdelning för 2 spelare - - - Tryck på{*CONTROLLER_VK_B*} nu för att lämna det kreativa lägets inventarie. - + + Färdig - - - Det här är tillverkningsgränssnittet. Det låter dig kombinera dina resurser för att tillverka nya saker. - + + Skärmbild från spelet + + + Inga effekter + + + Snabbhet + + + Slöhet + + + Redigera skylttext: + + + Minecrafts klassiska texturer, ikoner och gränssnitt! + + + Visa alla kombinationsvärldar + + + Tips + + + Installera om avatarföremål 1 + + + Installera om avatarföremål 2 + + + Installera om avatarföremål 3 + + + Installera om tema + + + Installera om spelarbild 1 + + + Installera om spelarbild 2 + + + Alternativ + + + Gränssnitt + + + Återställ standardvärden + + + Guppande kamera + + + Ljud + + + Känslighet + + + Bild + + + Används vid bryggning. Tappas av spöken när de dör. + + + Tappas av zombiefierade grismän när de dör. Zombiefierade grismän kan hittas i Nedervärlden. Kan användas som ingrediens vid bryggning. + + + Används vid bryggning. Växer naturligt vid fästningar i Nedervärlden. Kan även planteras på själsand. + + + Halt att gå på. Förvandlas till vatten om den ligger ovanpå ett annat block som förstörs. Smälter om den befinner sig nära en ljuskälla eller om den placeras i Nedervärlden. + + + Kan användas som dekoration. + + + Används vid bryggning och för att hitta fästningar. Tappas av brännare, som brukar befinna sig nära fästningar i Nedervärlden. + + + Har olika effekter beroende på vad den används på. + + + Används vid bryggning eller kombineras med andra föremål för att skapa enderögon och magmasalva. + + + Används vid bryggning. + + + Används för att koka normala och explosiva brygder. + + + Kan fyllas med vatten och användas som basingrediens i brygdstället. + + + En giftig ingrediens som kan användas vid matlagning och bryggning. Tappas av spindlar och grottspindlar när de dödas av spelaren. + + + Används vid bryggning, främst för att koka brygder med negativa effekter. + + + Växer med tiden när de placeras ut. Kan klippas med sax. Kan klättras, precis som en stege. + + + Liknar en dörr, men används primärt tillsammans med staket. + + + Kan tillverkas med melonskivor. + + + Genomskinliga block som kan användas som ett alternativ till glasblock. + + + Ge den ström (med hjälp av en knapp, spak, tryckplatta, rödstensfackla eller med en kombination av dessa och rödsten) så kommer, om möjligt, en kolv ut som knuffar block. När den fälls in drar den med sig det block som kolven nuddade. + + + Tillverkas med stenblock och återfinns ofta i fästningar. + + + Används som en barriär, precis som staket. + + + Kan planteras för att odla pumpor. + + + Kan användas som byggmaterial och som dekoration. + + + Gör dig långsammare när du står på det. Kan klippas med sax för att få tråd. + + + Spawnar en silverfisk när den förstörs. Kan även spawna en silverfisk om den befinner sig nära en annan silverfisk under angrepp. + + + Kan planteras för att odla meloner. + + + Släpps av endermän när de dör. Om du kastar en teleporteras du till platsen där pärlan landar och förlorar lite hälsa. + + + Ett jordblock med gräs som växer på ovansidan. Grävs upp med spade. Kan användas som byggmaterial. + + + Kan fyllas med regnvatten eller med en hink, och kan sedan användas för att fylla glasflaskor med vatten. + + + Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. + + + Skapas genom att smälta nedersten i en ugn. Kan användas för att tillverka nedermursten. + + + Lyser när de får ström. + + + Fungerar som ett vitrinskåp - det visar upp det föremål eller block du placerar i det. + + + Spawnar den varelse som indikeras när den kastas. + + + Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. + + + Kan odlas för att få kakaobönor. + + + Ko + + + Släpper läder när den dödas. Kan mjölkas med en hink. + + + Får + + + Varelsehuvuden kan placeras som dekorationer eller bäras som masker genom att bära dem som hjälmar. + + + Bläckfisk + + + Släpper en bläcksäck när den dödas. + + + Användbar när du vill tända eld på saker. Kan även placeras i en automat för att starta bränder på måfå. + + + Flyter på vatten och kan användas som klivsten. + + + Används för att bygga fästningar i Nedervärlden. Immuna mot spökens eldklot. + + + Används i fästningar i Nedervärlden. + + + När de kastas visar de i vilken riktning portalen till världens ände ligger. När tolv av dessa har placerats i portalen till världens ände kommer portalen att aktiveras. + + + Används vid bryggning. + + + Liknar gräsblock, men är väldigt bra att odla svamp på. + + + Hittas i fästningar i Nedervärlden. Släpper nedervårtor när de går sönder. + + + Ett block som finns i världens ände. Det är väldigt stryktåligt och fungerar därför utmärkt som byggmaterial. + + + Det här blocket skapas genom att besegra draken i världens ände. + + + Släpper erfarenhetsklot när den kastas, som ger dig erfarenhetspoäng när du plockar upp dem. + + + Låter dig förtrolla svärd, hackor, yxor, spadar, pilbågar och rustningsdelar genom att betala erfarenhetspoäng. + + + Kan aktiveras med hjälp av tolv enderögon. Låter dig resa till världens ände. + + + Används för att bygga en portal till världens ände. + + + Ge den ström (med hjälp av en knapp, spak, tryckplatta, rödstensfackla eller med en kombination av dessa och rödsten) så kommer, om möjligt, en kolv ut som knuffar block. + + + Bakas med lera i en ugn. + + + Kan härdas till tegelsten i en ugn. + + + Bryts ned till lerbollar som kan härdas till tegelsten i en ugn. + + + Huggs med yxa och kan göras till plankor, eller användas som bränsle. + + + Tillverkas i en ugn genom att smälta sand. Kan användas som byggmaterial, men går sönder om du slår på det. + + + Bryts från sten med en hacka. Kan användas för att bygga en ugn eller stenverktyg. + + + Ett kompakt sätt att förvara snöbollar. + + + Kan kombineras med en skål för att göra en stuvning. + + + Kan endast brytas med en diamanthacka. Uppstår när vatten kolliderar med lava, och används vid portalbyggen. + + + Spawnar monster i världen. + + + Kan grävas med spade för att skapa snöbollar. + + + Lämnar ibland efter sig veteax när det slås sönder. + + + Kan göras till ett färgämne. + + + Grävs med spade. Kan ibland lämna efter sig flintsten när det grävs upp. Påverkas av gravitation om det inte finns någonting under det. + + + Kan brytas med en hacka för att få kol. + + + Kan brytas med en stenhacka eller bättre för att få lasursten. + + + Kan brytas med en järnhacka eller bättre för att få diamanter. + + + Används som dekoration. + + + Kan brytas med järnhackor eller bättre, och sedan smältas i en ugn för att skapa guldtackor. + + + Kan brytas med stenhackor eller bättre, sedan smältas i en ugn för att skapa järntackor. + + + Kan brytas med en järnhacka eller bättre för att få rödstensstoft. + + + Kan inte brytas. + + + Antänder allt det vidrör. Kan plockas upp med en hink. + + + Grävs med spade. Kan smältas till glas i en ugn. Påverkas av gravitation om det inte finns någonting under den. + + + Kan brytas med en hacka för att få kullersten. + + + Grävs med spade. Kan användas som byggmaterial. + + + Kan planteras och växer efter en tid till ett träd. + + + Läggs på backen för att skicka vidare en elektrisk laddning. När det används vid bryggning förlänger det brygdens effekt. + + + Hittas genom att döda kor, och kan bearbetas till rustningsdelar eller användas för att tillverka böcker. + + + Hittas genom att döda slemkuber, och kan användas vid bryggning eller för att tillverka klibbiga kolvar. + + + Läggs slumpmässigt av höns, och kan användas för att laga vissa maträtter. + + + Hittas genom att gräva i grus, och kan användas för att tillverka tändstål. + + + Använd den på en gris för att kunna rida på grisen. Grisen kan sedan styras med hjälp av en morot på en pinne. + + + Skaffas genom att gräva i snö, och kan kastas. + + + Skaffas genom att bryta glödsten, och kan användas för att tillverka nya glödstensblock. Kan även användas vid bryggning för att göra brygden starkare. + + + Släpper ibland skott när de går sönder. Skotten kan planteras om för att odla nya träd. + + + Hittas i grottor, och kan användas som byggmaterial eller dekoration. + + + Används för att klippa ull från får och för att skörda lövblock. + + + Hittas genom att döda skelett. Kan göras om till benmjöl. Kan ges till en varg för att tämja den. + + + Skaffas genom att få ett skelett att döda en smygare. Kan spelas i en jukebox. + + + Släcker eldar och gör att grödor växer snabbare. Kan plockas upp i en hink. + + + Skördas från grödor, och kan användas för att laga vissa maträtter. + + + Kan göras om till socker. + + + Kan bäras som en hjälm eller kombineras med en fackla för att skapa en pumpalykta. Används även som huvudingrediens i pumpapaj. + + + Brinner i all evighet om den antänds. + + + Vete kan skördas från fullvuxna grödor. + + + Mark som har förberetts för frön. + + + Kan tillagas i en ugn för att skapa ett grönt färgämne. + + + Gör den, eller det, som går på den långsammare. + + + Hittas genom att döda höns, och kan användas för att tillverka pilar. + + + Hittas genom att döda smygare, och kan användas för att tillverka dynamit. Fungerar även som ingrediens vid bryggning. + + + Kan planteras på åkrar för att odla grödor. Se till att det finns tillräckligt med ljus! + + + Att stå i portalen låter dig passera mellan den vanliga världen och Nedervärlden. + + + Används som bränsle i ugnar och för att skapa facklor. + + + Hittas genom att döda spindlar, och kan användas för att tillverka pilbågar och fiskespön. Kan placeras på backen för att användas som snubbeltråd. + + + Släpper ull när den klipps (om den inte redan har klippts). Kan färgas för att producera ull med en annan färg. + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + Järnspade + + + Diamantspade + + + Guldspade + + + Guldsvärd + + + Träspade + + + Stenspade + + + Trähacka + + + Guldhacka + + + Träyxa + + + Stenyxa + + + Stenhacka + + + Järnhacka + + + Diamanthacka + + + Diamantsvärd + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + Träsvärd + + + Stensvärd + + + Järnsvärd + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Developer + + + Skjuter eldklot som exploderar vid kontakt. + + + Slemkub + + + Delas upp i mindre slemkuber när den skadas. + + + Zombiefierad grisman + + + Vanligtvis fridfull, men anfaller i grupp om du anfaller en av dem. + + + Spöke + + + Enderman + + + Grottspindel + + + Har ett giftigt bett. + + + Svampko + + + Anfaller om du tittar på honom. Kan även flytta på block. + + + Silverfisk + + + Attraherar andra silverfiskar som gömmer sig när den blir anfallen. Gömmer sig i stenblock. + + + Anfaller om du kommer nära. + + + Släpper fläskkotletter när den dödas. Kan ridas med hjälp av en sadel. + + + Varg + + + Anfaller bara om du anfaller den. Kan tämjas med hjälp av ben, vilket får vargen att följa efter dig och gå till angrepp mot allt som anfaller dig. + + + Höna + + + Släpper fjädrar när den dödas, kan även lägga ägg slumpmässigt. + + + Gris + + + Smygare + + + Spindel + + + Anfaller om du kommer nära. Kan klättra upp för väggar. Släpper tråd när den dödas. + + + Zombie + + + Exploderar om du kommer för nära! + + + Skelett + + + Skjuter pilar på dig. Släpper pilar när det dödas. + + + Producerar en svampstuvning om du använder en skål på den. Släpper svampar och blir till en normal ko om den klipps. + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + Den här stora, svarta draken finns i världens ände. + + + Brännare + + + De här fienderna finns i Nedervärlden, mestadels inne i fästningar. De släpper brännstavar när de dödas. + + + Snögolem + + + Man kan skapa en snögolem med hjälp av snöblock och en pumpa. De kastar snöbollar på sina skapares fiender. + + + Enderdrake + + + Magmakub + + + Lever i djungeln. Du kan tämja dem med rå fisk. Tänk på att du måste låta ozeloten närma sig dig, för plötsliga rörelser skrämmer bort den. + + + Järngolem + + + Finns i byar för att skydda dem. Kan byggas med hjälp av järnblock och pumpor. + + + Finns i Nedervärlden. De bryts ned till mindre versioner när de angrips, precis som slemkuber. + + + Bybo + + + Ozelot + + + Kan placeras runtomkring ett förtrollningsbord för att möjliggöra mer kraftfulla förtrollningar. + + + {*T3*}INSTRUKTIONER: UGNAR{*ETW*}{*B*}{*B*} +En ugn låter dig förändra föremål genom att bränna eller smälta dem. Exempelvis kan du använda ugnen för att göra järnmalm till järntackor.{*B*}{*B*} +Placera ugnen i världen och tryck på{*CONTROLLER_ACTION_USE*} för att använda den.{*B*}{*B*} +Stoppa bränsle i botten av ugnen och föremålet som ska behandlas högst upp. Ugnen aktiveras sedan och processen påbörjas.{*B*}{*B*} +När dina föremål har behandlats kan du flytta dem från resultatområdet till ditt inventarie.{*B*}{*B*} +Om du för markören över ett föremål som är en ingrediens eller bränsle till ugnen, öppnas ett verktygstips som låter dig flytta det till ugnen. + + + {*T3*}INSTRUKTIONER: AUTOMATER{*ETW*}{*B*}{*B*} +En automat används för att skjuta ut föremål. Du måste placera en kopplare, exempelvis en spak, bredvid automaten för att aktivera den.{*B*}{*B*} +För att fylla automaten med föremål trycker du på{*CONTROLLER_ACTION_USE*}, sedan flyttar du föremålen som du vill ladda automaten med till automaten.{*B*}{*B*} +Efter det kommer automaten att skjuta ut ett föremål varje gång du använder kopplaren. + + + {*T3*}INSTRUKTIONER: BRYGGNING{*ETW*}{*B*}{*B*} +För att brygga brygder krävs ett brygdställ, vilket kan tillverkas vid en arbetsbänk. Varje brygd börjar med en flaska vatten, som skapas genom att fylla en glasflaska med vatten från en kittel eller vattenkälla.{*B*} +Ett brygdställ har tre platser för flaskor, alltså kan tre brygder tillverkas åt gången. En ingrediens kan användas till alla tre flaskor, så se till att alltid brygga tre brygder åt gången för att utnyttja dina resurser på bästa sätt.{*B*} +Om du lägger en ingrediens i brygdställets översta plats kommer du att få en grundbrygd efter en kort tid. Grundbrygden är verkningslös, men om du tillsätter en till ingrediens i den får brygden särskilda egenskaper.{*B*} +När du väl har skapat den brygden kan du tillsätta en tredje ingrediens för att förlänga egenskapens effekt (med hjälp av rödstensstoft), ha en starkare effekt (med glödstensstoft) eller förvandlas till en skadlig brygd (med ett fermenterat spindelöga).{*B*} +Det går även att tillsätta krut i dina brygder för att göra dem explosiva. Explosiva brygder kan kastas, och när de exploderar appliceras brygdens egenskap på allt i området som träffas.{*B*} + +Basingredienserna är:{*B*}{*B*} +* {*T2*}Nedervårtor{*ETW*}{*B*} +* {*T2*}Spindelögon{*ETW*}{*B*} +* {*T2*}Socker{*ETW*}{*B*} +* {*T2*}Spöktårar{*ETW*}{*B*} +* {*T2*}Brännpulver{*ETW*}{*B*} +* {*T2*}Magmasalva{*ETW*}{*B*} +* {*T2*}Glimmande meloner{*ETW*}{*B*} +* {*T2*}Rödstensstoft{*ETW*}{*B*} +* {*T2*}Glödstensstoft{*ETW*}{*B*} +* {*T2*}Fermenterade spindelögon{*ETW*}{*B*}{*B*} + +Experimentera med olika kombinationer av ingredienser för att hitta alla brygder som kan bryggas. + + + {*T3*}INSTRUKTIONER: STORA KISTOR{*ETW*}{*B*}{*B*} +När man placerar två kistor bredvid varandra kombineras de till en stor kista. Den kan lagra ännu fler föremål.{*B*}{*B*} +Den används på precis samma sätt som en vanlig kista. + + + {*T3*}INSTRUKTIONER: TILLVERKNING{*ETW*}{*B*}{*B*} +Tillverkningsgränssnittet låter dig kombinera föremål i ditt inventarie för att skapa nya slags föremål. Använd{*CONTROLLER_ACTION_CRAFTING*} för att öppna tillverkningsgränssnittet.{*B*}{*B*} +Bläddra mellan flikarna högst upp med{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*} för att välja vilket slags föremål du vill tillverka, använd sedan{*CONTROLLER_MENU_NAVIGATE*} för att välja vad du vill tillverka.{*B*}{*B*} +Tillverkningsområdet visar vilka föremål som krävs för att tillverka det nya föremålet. Tryck på{*CONTROLLER_VK_A*} för att tillverka föremålet och lägga det i ditt inventarie. + + + {*T3*}INSTRUKTIONER: ARBETSBÄNKAR{*ETW*}{*B*}{*B*} +Du kan tillverka större föremål med hjälp av en arbetsbänk.{*B*}{*B*} +Placera bänken i världen och tryck på{*CONTROLLER_ACTION_USE*} för att använda den.{*B*}{*B*} +Tillverkning på en arbetsbänk fungerar på samma sätt som vid vanlig tillverkning, men tillverkningsområdet och utbudet är större. + + + {*T3*}INSTRUKTIONER: FÖRTROLLNING{*ETW*}{*B*}{*B*} +De erfarenhetspoäng du får när fiender dör, när du bryter vissa block eller smälter dem i en ugn, kan användas för att förtrolla vissa verktyg, vapen, rustningsdelar och böcker.{*B*} +När svärdet, pilbågen, yxan, hackan, spaden, rustningsdelen eller boken placeras i platsen under boken på förtrollningsbordet, kommer de tre knapparna till höger om platsen att visa några förtrollningar och deras erfarenhetskostnader.{*B*} +Om du inte har tillräckligt med erfarenhetsnivåer för att använda dem kommer priset att visas i rött, annars visas det i grönt.{*B*}{*B*} +Den faktiska förtrollningen som används väljs slumpmässigt baserat på kostnaden som visas.{*B*}{*B*} +Om förtrollningsbordet omges av bokhyllor (maximalt femton stycken), med bara ett blocks mellanrum mellan bokhyllorna och förtrollningsbordet, kommer förtrollningarna att stärkas och magiska symboler kan ses komma ur boken på förtrollningsbordet.{*B*}{*B*} +Alla ingredienser till ett förtrollningsbord kan hittas i världens byar, eller brytas eller odlas i världen.{*B*}{*B*} +Förtrollade böcker används med städet för att förtrolla föremål. Det här ger dig mer kontroll över vilka förtrollningar dina föremål har.{*B*} + + + {*T3*}INSTRUKTIONER: BLOCKERA VÄRLDAR{*ETW*}{*B*}{*B*} +Om du finner stötande innehåll i en värld kan du blockera den världen. +Om du vill göra det öppnar du pausmenyn, sedan trycker du på{*CONTROLLER_VK_RB*} för att välja "Blockera värld". +Om du försöker att ansluta till den världen i framtiden kommer du att meddelas att du har blockerat den, sedan får du välja om du vill häva blockeringen och fortsätta till världen, eller gå tillbaka. + + + {*T3*}INSTRUKTIONER: VÄRD- OCH SPELARALTERNATIV{*ETW*}{*B*}{*B*} + +{*T1*}Spelalternativ{*ETW*}{*B*} + När du laddar eller skapar en värld kan du trycka på knappen "Fler alternativ" för att öppna en meny som ger dig mer kontroll över ditt spel.{*B*}{*B*} + + {*T2*}Spelare mot spelare{*ETW*}{*B*} + När det här alternativet är valt kan spelare skada andra spelare. Detta påverkar bara överlevnadsläget.{*B*}{*B*} + + {*T2*}Lita på spelare{*ETW*}{*B*} + När det här alternativet är avstängt begränsas de handlingar som anslutande spelare kan utföra. De kan inte bryta block eller använda föremål, placera ut block, använda dörrar, kopplare eller behållare och de kan inte heller anfalla spelare eller djur. Du kan ändra dessa inställningar för specifika spelare med hjälp av menyn i spelet.{*B*}{*B*} + + {*T2*}Eld sprider sig{*ETW*}{*B*} + När det här alternativet är valt kan eld sprida sig till närliggande brännbara block. Det här alternativet kan även ändras med hjälp av menyn i spelet.{*B*}{*B*} + + {*T2*}Dynamit exploderar{*ETW*}{*B*} + När det här alternativet är aktiverat exploderar dynamit när den aktiveras. Det här alternativet kan även ändras med hjälp av menyn i spelet.{*B*}{*B*} + + {*T2*}Värdprivilegier{*ETW*}{*B*} + När det här alternativet är aktiverat kan värden använda spelets meny för att ge sig själv förmågan att flyga, stänga av sin utmattning och göra sig osynlig. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T2*}Dagsljuscykel{*ETW*}{*B*} +När det här alternativet är avstängt ändras inte tiden på dygnet.{*B*}{*B*} + +{*T2*}Behåll inventarie{*ETW*}{*B*} +När det här alternativet är aktiverat får spelare behålla allt i sin inventarie när de dör.{*B*}{*B*} + +{*T2*}Varelsespawn{*ETW*}{*B*} +När det här alternativet är avstängt spawnar inga varelser naturligt.{*B*}{*B*} + +{*T2*}Destruktiva fiender{*ETW*}{*B*} +När det här alternativet är avstängt kan varken monster eller djur förändra block, eller plocka upp föremål. Exempelvis förstörs inga block av exploderande smygare, och får kan inte äta gräs.{*B*}{*B*} + +{*T2*}Föremål från varelser{*ETW*}{*B*} +När det här alternativet är avstängt kommer varken monster eller djur att släppa föremål (exempelvis tappar inte smygare något krut).{*B*}{*B*} + +{*T2*}Föremål från block{*ETW*}{*B*} +När det här alternativet är avstängt släpps inga föremål när block förstörs (exempelvis släpper inte stenblock någon kullersten).{*B*}{*B*} + +{*T2*}Naturlig återställning{*ETW*}{*B*} +När det här alternativet är avstängt kommer inte spelare att återställa hälsa automatiskt.{*B*}{*B*} + +{*T1*}Alternativ för generering av världar{*ETW*}{*B*} +Det finns några extraalternativ att välja mellan när nya världar skapas.{*B*}{*B*} + + {*T2*}Generera strukturer{*ETW*}{*B*} + När det här alternativet är valt kommer byar och fästningar att genereras i världen.{*B*}{*B*} + + {*T2*}Platt värld{*ETW*}{*B*} + När det här alternativet är valt kommer den vanliga världen och Nedervärlden att vara helt platta.{*B*}{*B*} + + {*T2*}Bonuskista{*ETW*}{*B*} + När det här alternativet är valt kommer en kista med användbara föremål att skapas nära spelarens spawnplats.{*B*}{*B*} + +{*T2*}Återställ Nedervärlden{*ETW*}{*B*} + När det här alternativet är valt byggs Nedervärlden upp på nytt. Det är användbart om du har en gammal sparfil utan fästningar i Nedervärlden.{*B*}{*B*} + + {*T1*}Alternativ i spelet{*ETW*}{*B*} +Tryck på {*BACK_BUTTON*} medan du spelar för att öppna en meny med ett antal olika alternativ.{*B*}{*B*} + + {*T2*}Värdalternativ{*ETW*}{*B*} + Värdspelaren, och alla spelare som har angetts som moderatorer, har tillgäng till menyn "Värdalternativ". Med hjälp av den här menyn kan de kontrollera om eld kan sprida sig eller om dynamit kan explodera.{*B*}{*B*} + +{*T1*}Spelaralternativ{*ETW*}{*B*} +Välj en spelares namn och tryck på{*CONTROLLER_VK_A*} för att öppna menyn för spelarprivilegier. Där kan du välja mellan följande alternativ:{*B*}{*B*} + + {*T2*}Kan bygga och bryta block{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Det låter spelare interagera med världen som vanligt. Om det stängs av kan inte spelare placera eller förstöra block, de kan inte heller interagera med många av föremålen och blocken.{*B*}{*B*} + + {*T2*}Kan använda dörrar och kopplare{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelare använda dörrar eller kopplare.{*B*}{*B*} + + {*T2*}Kan öppna behållare{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelare öppna behållare, exempelvis kistor.{*B*}{*B*} + + {*T2*}Kan anfalla spelare{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelaren skada andra spelare.{*B*}{*B*} + + {*T2*}Kan anfalla djur{*ETW*}{*B*} + Det här alternativet är bara tillgängligt när "Lita på spelare" är avstängt. Om det stängs av kan inte spelaren skada djur.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + När det här alternativet är aktiverat kan spelaren ge privilegier till andra spelare (förutom till värden) om "Lita på spelare" är avstängt. De kan även sparka spelare och kontrollera om eld kan sprida sig eller om dynamit kan explodera.{*B*}{*B*} + + {*T2*}Sparka spelare{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} + +{*T1*}Alternativ för värdspelare{*ETW*}{*B*} +Om "Värdprivilegier" är aktiverat kan värdspelaren modifiera vissa privilegier. Välj en spelares namn och tryck på{*CONTROLLER_VK_A*} för att öppna menyn för spelarprivilegier. Där kan du välja mellan följande alternativ:{*B*}{*B*} + + {*T2*}Kan flyga{*ETW*}{*B*} + När det här alternativet är aktiverat kan spelaren flyga. Det fyller ingen funktion utanför överlevnadsläget, eftersom alla spelare kan flyga i det kreativa läget.{*B*}{*B*} + + {*T2*}Stäng av utmattning{*ETW*}{*B*} + Det här alternativet påverkar bara överlevnadsläget. När det är aktiverat har fysisk aktivitet (att gå, springa, hoppa o.s.v.) ingen effekt på hungermätaren. Om spelaren skadar sig kommer dock hungermätaren att långsamt tömmas medan spelaren återhämtar sin hälsa.{*B*}{*B*} + + {*T2*}Osynlig{*ETW*}{*B*} + När det här alternativet är aktiverat är spelaren osynlig för andra spelare och kan inte dö.{*B*}{*B*} + + {*T2*}Kan teleportera{*ETW*}{*B*} + Det här alternativet låter spelaren flytta andra spelare eller sig själva till andra spelare i världen. + + + + Nästa sida + + + {*T3*}INSTRUKTIONER: BOSKAP{*ETW*}{*B*}{*B*} +Om du vill behålla dina djur på en och samma plats måste du bygga ett inhägnat område som är mindre än 20 x 20 block och föra in dina djur där. Det garanterar att de är kvar när du återvänder till dem. + + + {*T3*}INSTRUKTIONER: AVLA DJUR{*ETW*}{*B*}{*B*} +Djuren i Minecraft kan föröka sig och föda bebisversioner av sig själva!{*B*} +För att avla djuren måste du mata dem med rätt mat för att göra dem brunstiga.{*B*} +Ge vete till en ko, svampko eller till ett får, morötter till en gris; veteax eller nedervårtor till en höna; eller valfritt kött till en varg, så börjar de leta efter ett annat djur av samma art som också är brunstigt.{*B*} +När två brunstiga djur av samma art träffas börjar de pussas i några sekunder, sedan dyker en unge upp. Ungen följer efter sina föräldrar till dess att den är fullvuxen.{*B*} +Efter att ha varit brunstigt kan ett djur inte bli brunstigt igen på ungefär fem minuter.{*B*} +Det finns en gräns på hur många djur som kan finnas i världen, så det kan hända att djuren inte parar sig om du har väldigt många. + + + {*T3*}INSTRUKTIONER: NEDERPORTALER{*ETW*}{*B*}{*B*} +En Nederportal låter spelaren resa mellan den vanliga världen och Nedervärlden. Nedervärlden kan användas för att korsa långa sträckor i den vanliga världen - att färdas ett block i Nedervärlden är som att färdas tre block i den vanliga, så när du bygger en portal i Nedervärlden och färdas genom den, kommer du att befinna dig tre gånger längre bort ifrån platsen där du klev in i den första portalen.{*B*}{*B*} +Det krävs minst tio obsidianblock för att bygga portalen, och portalen måste vara fem block hög, fyra block bred och ett block djup. När ramen till portalen har byggts måste öppningen antändas för att portalen ska aktiveras. Det kan göras med tändstålet eller med en eldladdning.{*B*}{*B*} +Exempel på hur man bygger en portal visas i bilden till höger. + + + + {*T3*}INSTRUKTIONER: KISTOR{*ETW*}{*B*}{*B*} +När du har tillverkat en kista kan du placera ut den i världen och använda den med{*CONTROLLER_ACTION_USE*} för att lagra saker från ditt inventarie.{*B*}{*B*} +Använd markören för att flytta saker mellan ditt inventarie och kistan.{*B*}{*B*} +Saker i kistan lagras till dess att du behöver dem i ditt inventarie igen. + + + Besökte du Minecon? + + + Ingen på Mojang har sett junkboys ansikte. - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man tillverkar saker. - + + Visste du att det finns en Minecraftwiki? - - {*B*} - Tryck på{*CONTROLLER_VK_X*} för att visa en beskrivning. - + + Försök att ignorera buggarna. - - {*B*} - Tryck på{*CONTROLLER_VK_X*} för att visa vad som behövs för att tillverka det markerade föremålet. - + + Smygare är resultatet av en bugg i koden. - - {*B*} - Tryck på{*CONTROLLER_VK_X*} för att visa inventariet igen. - + + Är det en höna eller en anka? - - - Bläddra igenom de olika gruppflikarna högst upp med{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*}. Välj den grupp som föremålet du vill tillverka tillhör, tryck sedan på{*CONTROLLER_MENU_NAVIGATE*} för att välja föremålet. - + + Mojangs nya kontor är coolt! - - - Tillverkningsområdet visar vilka resurser som krävs för att tillverka det nya föremålet. Tryck på{*CONTROLLER_VK_A*} för att tillverka föremålet och lägga det i ditt inventarie. - + + {*T3*}INSTRUKTIONER: GRUNDERNA{*ETW*}{*B*}{*B*} +Minecraft är ett spel som går ut på att placera block och bygga allt du kan tänka dig. På natten kommer monster ut - se till att bygga skydd innan det händer.{*B*}{*B*} +Använd{*CONTROLLER_ACTION_LOOK*} för att se dig omkring.{*B*}{*B*} +Använd{*CONTROLLER_ACTION_MOVE*} för att röra dig.{*B*}{*B*} +Tryck på{*CONTROLLER_ACTION_JUMP*} för att hoppa.{*B*}{*B*} +Tryck{*CONTROLLER_ACTION_MOVE*} framåt två gånger snabbt för att springa. Spelfiguren kommer att springa så länge du håller {*CONTROLLER_ACTION_MOVE*} framåt, eller till dess att du får slut på språngtid eller om hungermätaren har mindre än{*ICON_SHANK_03*}.{*B*}{*B*} +Håll in{*CONTROLLER_ACTION_ACTION*} för att bryta, hugga, gräva eller skörda med handen eller det verktyg du håller i. Du måste tillverka verktyg för att kunna bryta vissa block.{*B*}{*B*} +Om du håller något i handen kan du trycka på{*CONTROLLER_ACTION_USE*} för att använda det, eller på{*CONTROLLER_ACTION_DROP*} för att släppa det. - - - Du kan tillverka fler föremål med en arbetsbänk. Tillverkning på en arbetsbänk fungerar precis som vanlig tillverkning, men du har en större tillverkningsyta, vilket möjliggör fler kombinationer av resurser. - + + {*T3*}INSTRUKTIONER: SPELSKÄRMEN{*ETW*}{*B*}{*B*} +Du kan se din status på spelskärmen: din hälsa, hur mycket luft du har kvar när du befinner dig under vatten, hur hungrig du är (du måste äta för att mätta hungern) och din rustning om du bär sådan. Om du förlorar hälsa, men har en hungermätare med nio eller fler{*ICON_SHANK_01*}, kommer din hälsa att återställas automatiskt. Du fyller på din hungermätare genom att äta mat.{*B*} +Erfarenhetsmätaren visas också här. Den använder en siffra för att representera din erfarenhetsnivå. Själva mätaren visar hur många erfarenhetspoäng som behövs för att nå nästa erfarenhetsnivå. Erfarenhetspoäng fås genom att samla erfarenhetsklot som fiender tappar när de dör samt genom att bryta särskilda block, föda upp djur, fiska och smälta malm i en ugn.{*B*}{*B*} +Du kan även se vilka föremål som kan användas. Använd{*CONTROLLER_ACTION_LEFT_SCROLL*} och{*CONTROLLER_ACTION_RIGHT_SCROLL*} för att välja vilket föremål du vill ha till hands. - - - Den nedre högra delen av tillverkningsgränssnittet visar ditt inventarie. Det här området visar även en beskrivning av det valda föremålet och vilka resurser som krävs för att tillverka det. - + + {*T3*}INSTRUKTIONER: INVENTARIET{*ETW*}{*B*}{*B*} +Använd{*CONTROLLER_ACTION_INVENTORY*} för att öppna ditt inventarie.{*B*}{*B*} +Den här skärmen visar vilka saker du kan använda med händerna och allt annat du bär på. Här visas även din rustning.{*B*}{*B*} +Använd{*CONTROLLER_MENU_NAVIGATE*} för att styra markören. Använd{*CONTROLLER_VK_A*} för att plocka upp ett föremål under markören. Om det rör sig om mer än ett föremål så plockas alla upp - använd{*CONTROLLER_VK_X*} för att bara plocka upp hälften.{*B*}{*B*} +Använd markören för att flytta föremålet till en annan plats i inventariet och placera det där med{*CONTROLLER_VK_A*}. När markören håller i flera föremål använder du{*CONTROLLER_VK_A*} för att placera alla, eller{*CONTROLLER_VK_X*} för att bara placera ett av dem.{*B*}{*B*} +När du håller markören över en rustningsdel visas en beskrivning som hjälper dig att flytta delen till rätt rustningsplats i inventariet.{*B*}{*B*} +Det går att färga om läderrustningar. Gör detta genom att plocka upp ett färgämne med markören, tryck sedan på{*CONTROLLER_VK_X*} med markören över den rustningsdel som du vill färga. - - - Beskrivningen av det valda föremålet visas nu. Beskrivningen kan ge dig tips om hur föremålet kan användas. - + + Minecon 2013 hölls i Orlando, Florida i USA! - - - Resurserna som krävs för att tillverka föremålet listas nu. - + + .party() var grymt! - - Träet som du har skaffat kan göras om till plankor. Välj ikonen för plankorna och tryck på{*CONTROLLER_VK_A*} för att tillverka dem.{*PlanksIcon*} + + Utgå alltid ifrån att rykten är falska, inte att de är sanna! - - - Nu när du har byggt en arbetsbänk kan du placera den i världen för att kunna bygga fler saker.{*B*} - Tryck på{*CONTROLLER_VK_B*} för att stänga tillverkningsgränssnittet. - + + Föregående sida - - - Tryck på{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*} för att välja vilken typ av grupp du vill tillverka föremål ur. Välj verktygsgruppen.{*ToolsIcon*} - + + Byteshandel - - - Tryck på{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*} för att välja vilken typ av grupp du vill tillverka föremål ur. Välj strukturgruppen.{*StructuresIcon*} - + + Städ - - - Använd{*CONTROLLER_MENU_NAVIGATE*} för att markera det föremål du vill tillverka. Vissa föremål har flera olika versioner, beroende på vilka material som används. Välj träspaden.{*WoodenShovelIcon*} - + + Världens ände - - - För att tillverka vissa saker krävs flera steg. Nu när du har några plankor finns det fler saker att tillverka. Använd{*CONTROLLER_MENU_NAVIGATE*} för att välja det föremål du vill tillverka. Välj arbetsbänken.{*CraftingTableIcon*} - + + Blockera världar - - - Dina nya verktyg hjälper dig att komma igång, och nu kan du samla in många olika resurser på ett mer effektivt sätt.{*B*} - Tryck på{*CONTROLLER_VK_B*} för att stänga tillverkningsgränssnittet. - + + Kreativa läget - - - Vissa saker kan inte tillverkas på en arbetsbänk, utan kräver en ugn. Tillverka en ugn nu.{*FurnaceIcon*} - + + Värd- och spelaralternativ - - - Placera ut din ugn i världen. Det vore klokt att ställa den i ditt skydd.{*B*} - Tryck på{*CONTROLLER_VK_B*} för att stänga tillverkningsgränssnittet. - + + {*T3*}INSTRUKTIONER: VÄRLDENS ÄNDE{*ETW*}{*B*}{*B*} +Världens ände är en annan dimension i spelet som kan nås genom en aktiv portal. Portalen till världens ände finns i en fästning som ligger långt ned under jorden i den vanliga världen.{*B*} +För att aktivera portalen till världens ände måste du stoppa ett enderöga i den.{*B*} +När portalen har aktiverats är det bara att hoppa in i den för att nå världens ände.{*B*}{*B*} +I världens ände väntar enderdraken, en kraftfull fiende som vaktas av många endermän, så det gäller att du är väl förberedd innan du ger dig av dit!{*B*}{*B*} +Enderdraken läker sig med hjälp av enderkristaller som står utställda på åtta obsidianspiror. +Din första uppgift i striden är att förstöra dem.{*B*} +De första kan nås med pilar, men resten skyddas av burar. Du måste bygga dig upp till dem.{*B*}{*B*} +Medan du gör det kommer enderdraken att flyga mot dig och spotta klot med endersyra!{*B*} +Om du närmar dig äggpodiet mitt mellan spirorna kommer enderdraken att flyga ned och anfalla dig - då har du chansen att verkligen skada den!{*B*} +Undvik enderdrakens syra och sikta in dig på ögonen för bäst resultat. Om möjligt, ta med dig några vänner till världens ände som kan hjälpa dig i striden!{*B*}{*B*} +När du väl befinner dig i världens ände kan dina vänner se var fästningen med portalen dit ligger, +så det är lätt för dem att följa med dig. + - - - Det här är ugnens gränssnitt. Med en ugn kan du förändra föremål genom att bränna eller smälta dem. Du kan exempelvis göra järntackor av järnmalm i den. - + + {*ETB*}Välkommen tillbaka! Du kanske inte har märkt det, men ditt Minecraft har uppdaterats.{*B*}{*B*} +Det finns många nya funktioner för dig och dina vänner, så det här är bara ett axplock. Läs igenom listan och ge dig sedan ut i spelet!{*B*}{*B*} +{*T1*}Nya föremål{*ETB*} - Härdad lera, färgad lera, kolblock, höbal, aktiveringsräls, rödstensblock, dagsljussensor, utmatare, tratt, gruvvagn med tratt, gruvvagn med dynamit, rödstensjämförare, viktplatta, fyrljus, kistfälla, fyrverkeriraket, fyrverkeristjärna, avgrundsstjärna, koppel, hästrustning, namnbricka, hästspawnägg{*B*}{*B*} +{*T1*}Nya varelser{*ETB*} - Wither, Witherskelett, häxor, fladdermöss, hästar, åsnor och mulor{*B*}{*B*} +{*T1*}Nya funktioner{*ETB*} - Tämj och rid hästar, tillverka fyrverkerier och bjud på en uppvisning, namnge djur och monster med namnbrickor, skapa mer avancerade rödstenskretsar, samt nya värdalternativ som låter dig kontrollera vad din världs gäster kan göra!{*B*}{*B*} +{*T1*}Ny handledningsvärld{*ETB*} – Lär dig att använda både gamla och nya funktioner i handledningsvärlden. Se om du kan hitta alla musikskivor som finns gömda i världen!{*B*}{*B*} - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder ugnen. - + + Gör mer skada än nävarna. - - - Du måste lägga bränsle på ugnens nedre plats, och föremålet som ska brännas eller smältas på den övre platsen. Ugnen kommer sedan att aktiveras och resultatet hamnar på den högra platsen. - + + Används för att gräva i jord, gräs, sand, grus och snö snabbare än för hand. Spadar krävs för att gräva snöbollar. - - - Många saker av trä kan användas som bränsle, men inte alla brinner lika länge. Du kan även hitta andra saker i världen som kan användas som bränsle. - + + Springa - - - När dina saker har behandlats i ugnen kan du flytta dem från resultatrutan till ditt inventarie. Experimentera med olika saker för att se vad du kan tillverka. - + + Nyheter - - - Om du bränner trä kan du tillverka träkol. Lägg bränsle i ugnen och använd trä som resurs att bränna. Det kan ta ett tag innan ugnen börjar producera träkol, så gör någonting annat under tiden och återvänd senare för att se hur det går. - + + {*T3*}Ändringar och tillägg{*ETW*}{*B*}{*B*} +- Nya föremål - Härdad lera, färgad lera, kolblock, höbal, aktiveringsräls, rödstensblock, dagsljussensor, utmatare, tratt, gruvvagn med tratt, gruvvagn med dynamit, rödstensjämförare, viktplatta, fyrljus, kistfälla, fyrverkeriraket, fyrverkeristjärna, avgrundsstjärna, koppel, hästrustning, namnbricka, hästspawnägg.{*B*} +- Nya varelser - Wither, Witherskelett, häxor, fladdermöss, hästar, åsnor och mulor.{*B*} +- Nya terränggenereringsfunktioner - Häxstugor.{*B*} +- Lade till fyrljusgränssnittet.{*B*} +- Lade till hästgränssnittet.{*B*} +- Lade till trattgränssnittet.{*B*} +- Lade till fyrverkerier - Fyrverkerigränssnittet är tillgängligt från arbetsbänken när du har ingredienser för att tillverka en fyrverkeristjärna eller fyrverkeriraket.{*B*} +- Lade till "Äventyrsläge" - Du kan bara ha sönder block med rätt verktyg.{*B*} +- Lade till många nya ljud.{*B*} +- Varelser, föremål och projektiler kan nu passera genom portaler.{*B*} +- Repeterare kan nu låsas genom att driva endera sidan med en annan repeterare.{*B*} +- Zombier och skelett kan nu spawna med olika vapen och rustningar.{*B*} +- Nya dödsmeddelanden.{*B*} +- Namnge varelser med namnbrickor, och byt namn på behållare när menyn är öppen.{*B*} +- Benmjöl får inte längre växter att bli fullvuxna direkt, utan gör att de växer slumpmässigt i stadier.{*B*} +- En rödstenssignal som beskriver innehållet i kistor, brygdställ, automater och jukeboxar kan skickas genom att placera en rödstensjämförare direkt bredvid dem.{*B*} +- Automater kan nu vara vända åt vilket håll som helst.{*B*} +- Att äta ett gyllene äpple ger nu spelaren extra "absorberingshälsa" under en kort tidsperiod.{*B*} +- Ju längre tid du befinner dig i ett område, desto starkare monster spawnar där.{*B*} - - - Träkol kan användas som bränsle, eller användas i kombination med en stav för att tillverka en fackla. - + + Dela skärmbilder - - - Om du använder sand som resurs kan du tillverka glas. Tillverka några glasblock att använda som fönster i ditt skydd. - + + Kistor - - - Det här är bryggningsgränssnittet. Du kan använda det för att skapa brygder med många olika effekter. - + + Tillverkning - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder brygdstället. - + + Ugnar - - - Brygg brygder genom att placera en ingrediens i den översta rutan och en brygd eller vattenflaska i de nedre rutorna. Du kan brygga upp till tre stycken samtidigt. När du har hittat en giltig kombination inleds bryggandet och resultatet blir klart kort efter det. - + + Grunderna - - - Alla brygder börjar med en vattenflaska. De flesta brygderna skapas genom att först tillsätta en nedervårta - då får man en basal brygd. Sedan krävs minst en ingrediens till för att framställa den slutgiltiga brygden. - + + Gränssnittet - - - När du väl har en brygd kan du modifiera dess effekter. Om du tillsätter rödstensstoft förlängs effekten, medan glödstenstoft gör effekten mer kraftfull. - + + Inventariet - - - Att tillsätta ett fermenterat spindelöga fördärvar brygden och gör att den får motsatt effekt. Krut gör att brygden blir explosiv, vilket gör att effekten påverkar allt som träffas när brygden kastas. - + + Automater - - - Skapa en brygd för eldmotstånd genom att först tillsätta en nedervårta i en vattenflaska, och sedan tillsätta magmasalva. - + + Förtrollning - - - Tryck på{*CONTROLLER_VK_B*} nu för att lämna brygdgränssnittet. - + + Nederportaler - - - I det här området finns ett brygdställ, en kittel och en kista full med brygdingredienser. - + + Flera spelare - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om bryggning och brygder.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan kan bryggning och känner till brygder. - + + Boskap - - - Första steget när man brygger en brygd är att skapa en vattenflaska. Ta en glasflaska från kistan. - + + Avla djur - - - Du kan fylla flaskan från en kittel med vatten i eller från ett vattenblock. Fyll flaskan nu genom att peka den mot en vattenkälla, tryck sedan på{*CONTROLLER_ACTION_USE*}. - + + Bryggning - - - Om kitteln blir tom kan du fylla den med en vattenhink. - + + deadmau5 gillar Minecraft! - - - Använd brygdstället för att brygga en brygd för eldmotstånd. Du behöver en vattenflaska, en nedervårta och magmasalva. - + + Grismän anfaller inte dig så länge du inte anfaller dem. - - - Håll in{*CONTROLLER_ACTION_USE*} när du håller en brygd i handen för att använda den. Normala brygder dricks och effekten påverkar bara dig. Explosiva brygder kastas och effekten drabbar alla varelser som träffas. - Explosiva brygder kan tillverkas genom att tillsätta krut till normala brygder. - + + Du kan ändra din spawnplats i spelet och hoppa till nästa gryning genom att sova i en säng. - - - Använd din brygd för eldmotstånd på dig själv. - + + Slå tillbaka eldbollarna på spöket! - - - Nu när du kan stå emot eld och lava borde du se om du kan ta dig till platser som du inte kunde nå förut. - + + Tillverka facklor för att lysa upp områden när det är mörkt. Monster undviker facklorna. - - - Det här är förtrollningsgränssnittet. Du kan använda det för att förtrolla vapen, rustningsdelar och vissa verktyg. - + + Ta dig till platser snabbare med en gruvvagn och räls! - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om förtrollningsgränssnittet.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder förtrollningsgränssnittet. - + + Plantera skott så växer de till träd. - - - För att förtrolla ett föremål ska du först placera det i förtrollningsrutan. Vapen, rustningsdelar och vissa verktyg kan förtrollas för att ge dem specialeffekter. Exempelvis kan de bli mer tåliga, eller så kan de producera fler resurser när du bryter block. - + + Om du bygger en portal kan du resa till en annan dimension: Nedervärlden. - - - När ett föremål har placerats i förtrollningsrutan kommer knapparna till höger att visa ett antal slumpmässiga förtrollningar. - + + Det är aldrig smart att gräva rakt upp eller rakt ned. - - - Siffran på knappen visar hur många erfarenhetsnivåer det kostar att använda den förtrollningen på föremålet. Om din nivå inte är tillräckligt hög kommer knappen att vara avaktiverad. - + + Benmjöl (som kan tillverkas av skelettben) kan användas som gödningsmedel för att få saker att växa omedelbart! - - - Välj en förtrollning och tryck på{*CONTROLLER_VK_A*} för att förtrolla föremålet. Det här sänker din erfarenhetsnivå med förtrollningens kostnad. - + + Smygare exploderar när de kommer nära dig! - - - Alla förtrollningar är slumpmässiga, men några av de bättre förtrollningarna är bara tillgängliga när du har en hög erfarenhetsnivå, och när det står många bokhyllor runt förtrollningsbordet för att ge det mer kraft. - + + Tryck på{*CONTROLLER_VK_B*} för att släppa vad du håller i! - - - I det här området finns ett förtrollningsbord och några andra föremål som ska lära dig grunderna om förtrollning. - + + Använd rätt verktyg till jobbet! - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om förtrollning.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan kan förtrollning. - + + Om du har svårt att hitta kol till dina facklor kan du tillverka träkol genom att elda träd i en ugn. - - - Med hjälp av ett förtrollningsbord kan du lägga till specialeffekter, exempelvis att du får fler resurser när du bryter block eller att dina vapen, rustningsdelar och verktyg blir mer stryktåliga. - + + Du återfår mer hälsa av att äta tillagade fläskkotletter än av råa. - - - Om du ställer bokhyllor runt förtrollningsbordet får det mer kraft, och då kan du använda bättre förtrollningar. - + + Om du spelar på svårighetsgraden "Fridfullt" kommer du automatiskt att återfå hälsa, och inga monster kommer ut på nätterna! - - - Det kostar erfarenhetsnivåer att förtrolla föremål. Du höjer din nivå genom att plocka upp erfarenhetsklot som bildas när du dödar monster och djur, när du bryter malm, avlar djur, fiskar eller behandlar vissa saker i ugnen. - + + Mata en varg med ett ben för att tämja den, sedan kan du ge den kommandon att sitta eller följa efter dig. - - - Du kan även höja din erfarenhetsnivå med hjälp av förtrollningsflaskor. När en sådan kastas sprider den erfarenhetsklot där den landar. Du kan sedan plocka upp kloten. - + + Släpp föremål ur inventariet genom att flytta markören utanför menyn och trycka på{*CONTROLLER_VK_A*}. - - - Kistan i det här området innehåller några förtrollade saker, förtrollningsflaskor och några saker som inte har förtrollats ännu som du kan experimentera med vid förtrollningsbordet. - + + Det finns nytt nedladdningsbart innehåll! Du hittar det i Minecraftbutiken via huvudmenyn. - - - Nu åker du i en gruvvagn. Om du vill kliva ur den pekar du på den med markören och trycker på{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} - + + Du kan ändra utseende på din figur med ett utseendepaket från Minecraftbutiken. Välj "Minecraftbutiken" i huvudmenyn för att se vad som finns tillgängligt. - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om gruvvagnar.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur gruvvagnar fungerar. - + + Ändra ljusinställningarna för att göra spelet ljusare eller mörkare. - - - En gruvvagn åker på räls. Det går även att tillverka en värmedriven gruvvagn med ugn och en gruvvagn med en kista i. - {*RailIcon*} - + + Om du sover i en säng hoppar du fram i tiden till nästa gryning. Om du spelar med flera spelare måste alla spelare sova samtidigt. - - - Det går även att tillverka en rödstensräls som drar kraft från rödstensfacklor och -kretsar för att driva gruvvagnen framåt. Dessa kan anslutas till kopplare, spakar och tryckplattor för att skapa avancerade system. - {*PoweredRailIcon*} - + + Använd en skyffel för att förbereda marken för grödor. - - - Nu seglar du med en båt. För att lämna båten pekar du på den med markören och trycker på{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} - + + Spindlar anfaller inte under dagen - så länge du inte anfaller dem. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om båtar.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder båtar. - + + Det går snabbare att gräva i jord eller sand med en spade än med händerna! - - - En båt låter dig ta dig fram över vattnet snabbt. Du kan styra båten med{*CONTROLLER_ACTION_MOVE*} och{*CONTROLLER_ACTION_LOOK*}. - {*BoatIcon*} - + + Skaffa fläskkotletter från grisar, tillaga och ät dem sedan för att återfå hälsa. - - - Nu använder du ett fiskespö. Tryck på{*CONTROLLER_ACTION_USE*} för att använda det.{*FishingRodIcon*} - + + Skaffa läder från kor och använd det för att tillverka rustningar. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om fiske.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man fiskar. - + + Om du har en tom hink kan du fylla den med mjölk från en ko, vatten eller lava! - - - Tryck på{*CONTROLLER_ACTION_USE*} för att kasta ut linan och börja fiska. Tryck på{*CONTROLLER_ACTION_USE*} igen för att dra in fiskelinan. - {*FishingRodIcon*} - + + Obsidian skapas när vatten nuddar ett lavablock. - - - För att fånga fisk måste du vänta till dess att flötet dras ned under ytan innan du drar in linan. Fisk kan ätas rå eller tillagad (med hjälp av en ugn) för att återställa hälsa. - {*FishIcon*} - + + Nu kan staket byggas ovanpå staket! - - - Precis som många andra verktyg har fiskespöet ett begränsat antal användningar. Det finns dock inget som säger att du måste lägga de användningarna på att fånga fisk. Experimentera för att se vad du kan fånga eller aktivera ... - {*FishingRodIcon*} - + + Vissa djur följer efter dig om du håller vete i handen. - - - Det här är en säng. Peka på den när det är natt och tryck på{*CONTROLLER_ACTION_USE*} för att sova hela natten och vakna nästa morgon.{*ICON*}355{*/ICON*} - + + Om ett djur inte kan röra sig mer än 20 rutor i någon riktning kommer det inte att laddas ur minnet. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om sängar.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder sängar. - + + Tamvargar visar hur mycket hälsa de har med svansen. Mata dem med kött för att läka dem. - - - En säng bör stå på en säker och upplyst plats, annars kommer du att bli störd av monster mitt i natten. När du har använt en säng blir den till din spawnplats, och skulle du råka dö får du börja från den igen. - {*ICON*}355{*/ICON*} - + + Tillaga kaktus i en ugn för att få grön färg. - - - Om du spelar tillsammans med andra spelare måste alla gå och lägga sig samtidigt för att kunna sova. - {*ICON*}355{*/ICON*} - + + Läs sektionen "Nyheter" i instruktionsmenyn för att se den senaste informationen om spelet. - - - I det här området finns enkla rödstens- och kolvkretsar, samt en kista med saker som låter dig bygga ut de kretsarna. - + + Musik av C418! - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om rödstenskretsar och kolvar.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur rödstenskretsar och kolvar fungerar. - + + Vem är Notch? + + + Mojang har fler utmärkelser än anställda! - - - Spakar, knappar, tryckplattor och rödstensfacklor kan alla ge ström till kretsar, antingen genom att ansluta dem direkt till saken som behöver ström, eller med hjälp av rödstensstoft. - + + Vissa kändisar spelar Minecraft! - - - En strömkällas position och riktning avgör hur den påverkar blocken i direkt anslutning. Exempelvis kan en rödstensfackla på sidan av ett block stängas av om blocket får ström från en annan källa. - + + Notch har över en miljon följare på Twitter! - - - Du skaffar rödstensstoft genom att bryta rödstensmalm med en hacka gjord av järn, diamant eller guld. Längdmässigt kan det användas för att ge ström från ett avstånd på femton block, och höjdmässigt kan det kan färdas upp eller ned ett helt block. - {*ICON*}331{*/ICON*} - + + Det finns faktiskt svenskar som inte är blonda. Vissa, som Jens på Mojang, har till och med rött hår! - - - Rödstensförstärkare kan användas för att förlänga sträckan som strömmen bärs, eller för att lägga in en fördröjning i en krets. - {*ICON*}356{*/ICON*} - + + Förr eller senare kommer spelet att uppdateras! - - - När en kolv matas med ström fälls den ut och kan knuffa upp till tolv block. Klibbiga kolvar kan dra tillbaka ett block av nästan vilket slag som helst när de fälls in igen. - {*ICON*}33{*/ICON*} - + + Om du placerar två kistor bredvid varandra skapas en stor kista. - - - Kistan i det här området innehåller några komponenter för att skapa kretsar med kolvar. Försök att färdigställa kretsarna i området, eller skapa dina egna. Det finns fler exempel utanför övningsområdet. - + + Var försiktig om du bygger strukturer av ull ute i det öppna - blixtar kan antända ull. - - - I det här området finns en portal till Nedervärlden! - + + En hink med lava kan användas i en ugn för att smälta hundra block. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om portaler och Nedervärlden.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan känner till portaler och Nedervärlden. - + + Vilket instrument ett musikblock spelar avgörs av materialet under blocket. - - - Portaler skapas genom att bygga en ram som är fyra block bred och fem block hög av obsidianblock. Hörnblocken behövs inte. - + + Det kan ta flera minuter innan lava försvinner helt och hållet efter att källblocket har tagits bort. - - - För att aktivera portalen till Nedervärlden måste du tända eld på obsidianblocken på insidan av ramen med ett tändstål. Portaler stängs om ramen går sönder, om någonting exploderar i närheten eller om det passerar vätska genom dem. - + + Kullersten står emot spökens eldbollar, vilket gör det användbart som skydd nära portaler. - - - Ställ dig i en portal till Nedervärlden för att använda den. Skärmen blir lila och ett ljud spelas upp. Efter några sekunder förflyttas du till en annan dimension. - + + Block som fungerar som ljuskällor (bland annat facklor, glödsten och pumpalyktor) smälter snö och is. - - - Nedervärlden kan vara mycket farlig. Det kan dock vara värt att navigera dess glödheta lava, för där finns nedersten som aldrig slocknar när den antänds, och glödsten som producerar ljus. - + + Zombier och skelett överlever i dagsljus om de står i vatten. - - - Nedervärlden kan användas för att ta dig fram stora sträckor i den vanliga världen. Att gå ett block i Nedervärlden är som att gå tre block i den vanliga. - + + Höns lägger ägg med 5-10 minuters mellanrum. - - - Nu befinner du dig i det kreativa läget. - + + Obsidian kan bara brytas med en diamanthacka. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om det kreativa läget.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur det kreativa läget fungerar. - + + Smygare fungerar som den mest lättillgängliga krutkällan. - - I det kreativa läget har du obegränsat med alla föremål och block, du kan förstöra block med en enda knapptryckning utan verktyg, och du är odödlig och kan flyga. + + Om du anfaller en varg kommer alla vargar i närheten att gå till attack mot dig. Zombiefierade grismän beter sig likadant. - - Tryck på{*CONTROLLER_ACTION_CRAFTING*} för att öppna det kreativa lägets inventariegränssnitt. + + Vargar kan inte färdas till Nedervärlden. - - Ta dig till andra sidan av det här hålet för att fortsätta. + + Vargar anfaller inte smygare. - - Nu har du klarat det kreativa lägets övning. + + Krävs för att bryta stenrelaterade block och malmblock. - - - Det här området har en gård. Att driva en gård ger dig förnybara källor för mat och andra saker. - + + Används för att baka tårta och som en ingrediens vid bryggning. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hur man skördar.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man skördar. - + + Används för att skicka en elektrisk laddning genom att slås av eller på. Förblir av- eller påslagen till dess att den används igen. - - Vete, pumpor och meloner odlas från ax och frön. Du hittar veteax genom att slå sönder högt gräs eller skörda vete, och pumpa- och melonfrön kan skaffas från pumpor och meloner. + + Skickar en konstant elektrisk laddning, och kan användas som en sändare eller mottagare när den ansluts till sidan av ett block. +Kan även användas för att ge ett svagt ljus. - - Innan du kan plantera något måste du göra marken till åkermark med hjälp av en skyffel. En nära vattenkälla hjälper till att hålla åkermarken bördig så att grödorna växer snabbare. Ordentligt med ljus hjälper också till med det. + + Återställer 2{*ICON_SHANK_01*}, och kan även göras om till ett guldäpple. - - Vete passerar flera olika stadier medan det växer. Det kan skördas när det får en mörk färg.{*ICON*}59:7{*/ICON*} + + Återställer 2{*ICON_SHANK_01*}, och regenererar hälsa i 4 sekunder. Tillverkad med ett äpple och guldtackor. - - Pumpor och meloner behöver ett ledigt block bredvid blocket där fröet planterades, annars får inte frukten plats när stjälken har växt ut. + + Återställer 2{*ICON_SHANK_01*}. Du kan bli sjuk av att äta det. - - Sockerrör måste planteras på gräs, jord eller sand som ligger bredvid ett vattenblock. Att hugga av botten av ett sockerrör får hela sockerröret att kollapsa.{*ICON*}83{*/ICON*} + + Används i rödstenskretsar som en förstärkare, fördröjare och/eller som en diod. - - Kaktusar måste planteras på sand och kan växa sig tre block höga. Precis som sockerrör kollapsar hela kaktusen om det nedersta blocket förstörs.{*ICON*}81{*/ICON*} + + Används för att leda gruvvagnar. - - Svampar ska planteras i dunkla miljöer och sprider sig till närliggande block med dunkelt ljus.{*ICON*}39{*/ICON*} + + När strömmen är på accelererar gruvvagnar som åker på rälsen. När strömmen är av stannar gruvvagnar på den. - - Benmjöl kan användas för att få grödorna att bli fullvuxna, eller för att göra svampar till stora svampar.{*ICON*}351:15{*/ICON*} + + Fungerar som en tryckplatta (skickar en rödstenssignal när den aktiveras) men kan bara aktiveras av en gruvvagn. - - Nu har du klarat övningen om hur man skördar. + + Används för att skicka en elektrisk laddning genom att tryckas in. Skickar signalen i ungefär en sekund innan den stängs av igen. - - - I det här området finns en inhägnad med djur. Du kan avla djur för att skaffa bebisversioner av djuren. - + + Används för att förvara och skjuta ut föremål i slumpmässig ordning när den matas med en rödstensladdning. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om djur och avel.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan känner till djur och avel. - + + Spelar en not när den aktiveras. Slå blocket för att ändra notens tonläge. Ställ blocket på olika underlag för att ändra vilket instrument som spelas. - - För att avla djuren måste du mata dem med rätt mat för att göra dem brunstiga. + + Återställer 2,5{*ICON_SHANK_01*}. Skapad genom att tillaga en rå fisk i en ugn. - - Ge vete till en kor, svampkor eller får; morötter till grisar; veteax eller nedervårtor till höns; eller valfritt kött till vargar, så börjar de leta efter ett annat djur av samma art som också är brunstigt. + + Återställer 1{*ICON_SHANK_01*}. - - När två brunstiga djur av samma art träffas börjar de pussas i några sekunder, sedan dyker en unge upp. Ungen följer efter sina föräldrar till dess att den är fullvuxen. + + Återställer 1{*ICON_SHANK_01*}. - - Efter att ha varit brunstigt kan ett djur inte bli brunstigt igen på ungefär fem minuter. + + Återställer 3{*ICON_SHANK_01*}. - - Vissa djur följer efter dig om du håller rätt mat i handen. Det gör det lättare att föra samman djur så att de parar sig.{*ICON*}296{*/ICON*} + + Används som ammunition till pilbågar. - - - Vilda vargar kan tämjas genom att ge ben till dem. När de har tämjts dyker det upp hjärtan runtomkring dem. Tämjda vargar följer efter spelare och försvarar dem så länge de inte har fått order att sitta. - + + Återställer 2,5{*ICON_SHANK_01*}. - - Nu har du klarat övningen om djur och avel. + + Återställer 1{*ICON_SHANK_01*}. Kan användas sex gånger. - - - I det här området finns några pumpor och block som låter dig bygga en snö- eller järngolem. - + + Återställer 1{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. Du kan bli sjuk av att äta den. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hur man bygger en golem.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man bygger en golem. - + + Återställer 1,5{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. - - Du bygger en golem genom att placera en pumpa på en hög med block. + + Återställer 4{*ICON_SHANK_01*}. Skapad genom att tillaga en fläskkotlett i en ugn. - - En snögolem består av en stapel med två snöblock och en pumpa ovanpå. De kastar snöbollar på dina fiender. + + Återställer 1{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. Kan ges till en ozelot för att tämja den. - - En järngolem består av fyra järnblock i det mönster som visas och en pumpa på blocket i mitten. De anfaller dina fiender. + + Återställer 3{*ICON_SHANK_01*}. Skapad genom att tillaga en rå kyckling i en ugn. - - Vissa byar har en järngolem som skyddar byborna. Om du anfaller dem går den till angrepp. + + Återställer 1,5{*ICON_SHANK_01*}, eller så kan den tillagas i en ugn. - - Du kan inte lämna det här området innan du är klar med övningen. + + Återställer 4{*ICON_SHANK_01*}. Skapad genom att tillaga en rå biff i en ugn. - - Olika verktyg passar till olika material. Använd en spade för att gräva i mjuka material som jord och sand. + + Används för att transportera dig, ett djur eller monster via rälsen. - - Olika verktyg passar till olika material. Använd en yxa för att hugga trädstammar. + + Används för att skapa ljusblå ull. - - Olika verktyg passar till olika material. Använd en hacka för att bryta sten och malm. Du kan behöva en hacka av bättre material för att få resurser från vissa block. + + Används för att skapa cyanfärgad ull. + + + Används för att skapa lila ull. - - Vissa verktyg är bättre lämpade att anfalla fiender med. Du bör använda ett svärd när du anfaller. + + Används för att skapa limegrön ull. - - Tips: Håll in {*CONTROLLER_ACTION_ACTION*} för att bryta eller hugga med handen eller vad du än håller i. Du måste tillverka verktyg för att kunna bryta vissa block. + + Används för att skapa grå ull. - - Det verktyg du använder har skadats. Varje gång du använder ett verktyg skadas det, och till slut går det sönder. Den färgade mätaren under föremålet i inventariet visar verktygets tillstånd. + + Används för att skapa ljusgrå ull. (Ljusgrå färg kan även skapas genom att kombinera grå färg med benmjöl. Då får du fyra ljusgråa färger för varje bläcksäck i stället för tre.) - - Håll in{*CONTROLLER_ACTION_JUMP*} för att simma upp. + + Används för att skapa magentafärgad ull. - - I det här området finns det en gruvvagn på räls. Sätt dig i gruvvagnen genom att peka markören på den och trycka på{*CONTROLLER_ACTION_USE*}. Använd{*CONTROLLER_ACTION_USE*} på knappen för att sätta gruvvagnen i rörelse. + + Används för att skapa lyktor som lyser starkare än facklor. Smälter snö/is och kan användas under vatten. - - I kistan bredvid floden finns en båt. Peka markören på vattnet och tryck på{*CONTROLLER_ACTION_USE*} för att använda båten. Använd{*CONTROLLER_ACTION_USE*} medan du pekar markören på båten för att gå ombord. + + Används för att skapa böcker och kartor. - - I kistan bredvid dammen finns ett fiskespö. Ta fiskespöet från kistan och sätt det i handen för att använda det. + + Kan användas för att skapa bokhyllor, eller förtrollas för att skapa förtrollade böcker. - - Den här avancerade kolvmekanismen skapar en självreparerande bro! Tryck på knappen för att aktivera den, undersök sedan hur de olika komponenterna interagerar för att lära dig mer. + + Används för att skapa blå ull. - - Om du flyttar markören utanför gränssnittet medan du bär på ett föremål, kan du släppa föremålet. + + Spelar musikskivor. - - Du har inte alla ingredienser som behövs för att tillverka den här saken. Rutan nere till vänster visar vilka ingredienser som behövs. + + Används för att tillverka väldigt starka verktyg, vapen och rustningsdelar. - - - Grattis, du är klar med övningen. Nu passerar tiden i spelet i normal hastighet, och det dröjer inte länge innan det blir natt och monster kommer ut! Bygg färdigt skyddet! - + + Används för att skapa orangefärgad ull. - - {*EXIT_PICTURE*} När du är redo att utforska mer kan du leta upp trappan som leder till ett litet slott. Den ligger nära gruvarbetarens skydd. + + Skaffas från får och kan färgas med färgämnen. - - Påminnelse: + + Används som byggmaterial och kan färgas med färgämnen. Det här receptet rekommenderas inte, för ull är lätt att få tag på från får. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Används för att skapa svart ull. - - Nya funktioner har lagts till i den senaste versionen, bland annat nya områden i övningsvärlden. + + Används för att transportera saker via rälsen. - - {*B*}Tryck på{*CONTROLLER_VK_A*} för att spela övningen som vanligt.{*B*} - Tryck på{*CONTROLLER_VK_B*} för att hoppa över den huvudsakliga övningen. + + Åker på rälsen och kan knuffa andra gruvvagnar när den är laddad med kol. - - I det här området finns platser där du kan lära dig om fiske, båtar, kolvar och rödsten. + + Används för att ta sig fram i vatten snabbare än genom att simma. - - Utanför det här området finns exempel på byggnader, gårdar, gruvvagnar med räls, förtrollning, bryggning, byteshandel, smide och mycket mer! + + Används för att skapa grön ull. - - - Din hungermätare ligger på en nivå där du inte längre återfår hälsa. - + + Används för att skapa röd ull. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om hungermätaren och mat.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur hungermätaren fungerar och hur man äter mat. - + + Används som gödningsmedel för grödor, träd, högt gräs, stora svampar och blommor, och kan användas i färgrecept. - - Välj + + Används för att skapa rosa ull. - - Använd + + Används för att skapa brun ull, som en ingrediens i kakor och för att odla kakaobönor. - - Tillbaka + + Används för att skapa silverfärgad ull. - - Stäng + + Används för att skapa gul ull. - - Avbryt + + Låter dig skjuta pilar för att anfalla på avstånd. - - Avbryt anslutningen + + Ger bäraren 5 i skydd när den bärs. - - Uppdatera spellistan + + Ger bäraren 3 i skydd när den bärs. - - Festspel + + Ger bäraren 1 i skydd när den bärs. - - Alla spel + + Ger bäraren 5 i skydd när den bärs. - - Byt grupp + + Ger bäraren 2 i skydd när den bärs. - - Visa inventariet + + Ger bäraren 2 i skydd när den bärs. - - Visa beskrivning + + Ger bäraren 3 i skydd när den bärs. - - Visa ingredienser + + En blank tacka som kan användas för att tillverka verktyg av det här materialet. Skapad genom att smälta malm i en ugn. - - Tillverkning + + Gör det möjligt att skapa placerbara block av tackor, ädelstenar och färger. Kan användas som ett dyrt byggblock eller som en kompakt malmförvaring. - - Tillverka + + Används för att skicka en elektrisk laddning. Aktiveras när en spelare, ett djur eller monster kliver på den. Tryckplattor av trä kan även aktiveras genom att släppa något på dem. - - Plocka upp/placera + + Ger bäraren 8 i skydd när den bärs. - - Plocka upp + + Ger bäraren 6 i skydd när den bärs. - - Plocka upp alla + + Ger bäraren 3 i skydd när den bärs. - - Plocka upp hälften + + Ger bäraren 6 i skydd när den bärs. - - Placera + + Järndörrar kan öppnas och stängas med hjälp av rödsten, knappar och kopplare. - - Placera alla + + Ger bäraren 1 i skydd när den bärs. - - Placera en + + Ger bäraren 3 i skydd när den bärs. - - Släpp + + Används för att hugga trärelaterade block snabbare än för hand. - - Släpp alla + + Används för att ploga jord- och gräsblock så att man kan plantera grödor i dem. - - Släpp en + + Trädörrar kan öppnas och stängas genom att slå dem, använda dem eller med hjälp av rödsten. - - Byt grupp + + Ger bäraren 2 i skydd när den bärs. - - Snabbval + + Ger bäraren 4 i skydd när den bärs. - - Rensa snabbval + + Ger bäraren 1 i skydd när den bärs. - - Vad är det här? + + Ger bäraren 2 i skydd när den bärs. - - Dela på Facebook + + Ger bäraren 1 i skydd när den bärs. - - Byt filter + + Ger bäraren 2 i skydd när den bärs. - - Skicka vänförfrågan + + Ger bäraren 5 i skydd när den bärs. - - Sida ned + + Används för kompakta trappor. - - Sida upp + + Används för att hålla en svampstuvning. Du får behålla skålen när du har ätit upp stuvningen. - - Nästa + + Används för att hålla och transportera vatten, lava och mjölk. - - Föregående + + Används för att hålla och transportera vatten. - - Sparka spelare + + Visar text som du eller andra spelare har skrivit. - - Färga + + Används för att skapa starkare ljus än vad facklor producerar. Smälter snö/is och kan användas under vattnet. - - Bryt + + Används som sprängämne. Aktiveras efter att de har placerats ut genom att antända dem med tändstål eller med en elektrisk laddning. - - Mata + + Används för att hålla och transportera lava. - - Tämj + + Visar solens och månens position. - - Läk + + Pekar mot din startpunkt. - - Sitt + + Ritar upp en bild av området som utforskas medan du har den i handen. Bra att ha för den som inte vill gå vilse. - - Följ mig + + Används för att hålla och transportera mjölk. - - Skjut ut + + Används för att tända eldar och dynamit, och för att öppna färdigbyggda portaler. - - Töm + + Används för att fånga fisk. - - Rid + + Aktivera genom att slå, använda eller med hjälp av rödsten. Fungerar som vanliga dörrar, men är 1 x 1 block stort och ligger platt mot marken. - - Placera + + Används som byggmaterial och kan användas för att tillverka många olika saker. Kan tillverkas från alla sorters trä. - - Slå + + Används som byggmaterial. Påverkas inte av gravitationen, till skillnad från vanlig sand. - - Mjölka + + Används som byggmaterial. - - Plocka upp + + Används för att göra långa trappor. Två plattor som placeras ovanpå varandra bildar en normalstor dubbelplatta. - - Ät + + Används för att bygga långa trappor. Två plattor ovanpå varandra skapar en normalstor dubbelplatta. - - Sov + + Används för att skapa och sprida ljus. Facklor smälter även snö och is. - - Vakna + + Används för att tillverka facklor, pilar, skyltar, stegar, staket och som handtag till verktyg och vapen. - - Spela + + Lagrar block och föremål. Placera två kistor bredvid varandra för att skapa en stor kista med dubbelt så mycket utrymme. - - Rid + + Används som en barriär som inte går att hoppa över. Räknas som ett och ett halvt block i höjd för spelare, djur och monster, men som ett block i höjd för övriga block. - - Segla + + Används för att klättra upp eller ned. - - Odla + + Används för att hoppa framåt till nästa morgon om alla spelare i världen går och lägger sig. Anger även spelarens spawnplats. Färgen på sängen är alltid densamma, oavsett färgen på ullen som används. - - Simma upp + + Möjliggör tillverkning av fler föremål än vid vanlig tillverkning. - - Öppna + + Låter dig smälta malm, skapa träkol och glas, samt tillaga fisk och fläskkotletter. - - Byt tonart + + Järnyxa - - Detonera + + Rödstensbelysning - - Läs + + Djungelträtrappor - - Häng + + Björktrappor - - Kasta + + Nuvarande kontrollinställningar - - Plantera + + Dödskalle - - Plöj + + Kakao - - Skörda + + Grantrappor - - Fortsätt + + Drakägg - - Lås upp fullständiga spelet + + Endersten - - Radera sparfil + + Ram för portal till världens ände - - Radera + + Sandstenstrappor - - Alternativ + + Ormbunke - - Bjud in vänner + + Buske - - Acceptera + + Layout - - Klipp + + Tillverkning - - Blockera värld + + Använd - - Välj utseende + + Handling - - Antänd + + Smyg/flyg gned - - Navigera + + Smyg - - Installera fullständiga versionen + + Släpp - - Installera demo + + Byt föremål i handen - - Installera + + Pausa - - Ominstallera + + Titta - - Sparalt. + + Gå/spring - - Verkställ kommando + + Inventarie - - Kreativt + + Hoppa/flyg upp - - Flytta ingrediens + + Hoppa - - Flytta bränsle + + Portal till världens ände - - Flytta verktyg + + Pumpastjälk - - Flytta rustningsdel + + Melon - - Flytta vapen + + Glasskiva - - Välj + + Grind - - Dra + + Rankor - - Släpp + + Melonstjälk - - Privilegier + + Järnstänger - - Blockera + + Sprucken mursten - - Sida upp + + Mossig mursten - - Sida ned + + Mursten - - Brunstig + + Svamp - - Drick + + Svamp - - Rotera + + Mejslad mursten - - Dölj + + Tegeltrappor - - Töm alla platser + + Nedervårta - - OK + + Nedertrappor - - Avbryt + + Nederstängsel - - Minecraftbutiken + + Kittel - - Vill du lämna det pågående spelet och ansluta till det nya? Osparade framsteg kommer att gå förlorade. + + Brygdställ - - Avsluta + + Förtrollningsbord - - Spara spelet + + Nedermursten - - Avsluta utan att spara + + Silverfiskkullersten - - Vill du skriva över den befintliga sparfilen för den här världen med den nuvarande versionen av den här världen? + + Silverfisksten - - Vill du avsluta utan att spara? Du kommer att förlora alla framsteg i den här världen! + + Murstenstrappor - - Starta spelet + + Näckros - - Skadad sparfil + + Mycel - - Den här sparfilen är korrupt eller skadad. Vill du radera den? + + Silverfiskmursten - - Vill du avsluta till huvudmenyn och koppla ifrån alla spelare från spelet? Alla osparade framsteg kommer att gå förlorade. + + Byt kameraläge - - Avsluta och spara + + Om du förlorar hälsa men har nio eller fler{*ICON_SHANK_01*} på hungermätaren, kommer din hälsa att fyllas på automatiskt. Ät mat för att fylla din hungermätare. - - Avsluta utan att spara + + När du rör dig, bryter block och anfaller töms din hungermätare{*ICON_SHANK_01*}. Att springa och språnghoppa tömmer mätaren snabbare än om du rör dig och hoppar normalt. - - Vill du avsluta till huvudmenyn? Alla osparade framsteg kommer att gå förlorade. + + Förr eller senare kommer du att fylla ditt inventarie.{*B*} + Tryck på{*CONTROLLER_ACTION_INVENTORY*} för att öppna inventariet. - - Vill du avsluta till huvudmenyn? Dina framsteg kommer att gå förlorade! + + Det trä som du har samlat in kan göras till plankor. Öppna tillverkningsgränssnittet för att tillverka dem.{*PlanksIcon*} - - Skapa ny värld + + Din hungermätare börjar bli tom och du har förlorat hälsa. Ät en biffstek från ditt inventarie för att fylla på hungermätaren och börja återfå hälsa.{*ICON*}364{*/ICON*} - - Spela övningen + + Håll in{*CONTROLLER_ACTION_USE*} när du håller i mat för att äta den och fylla din hungermätare. Du kan inte äta mat när hungermätaren är full. - - Övning + + Tryck på{*CONTROLLER_ACTION_CRAFTING*} för att öppna tillverkningsgränssnittet. - - Döp din värld + + Tryck{*CONTROLLER_ACTION_MOVE*} framåt två gånger snabbt för att springa. Så länge du håller{*CONTROLLER_ACTION_MOVE*} framåt kommer spelfiguren att springa, bara du inte får slut på språngtid eller mat. - - Ge din värld ett namn + + Använd{*CONTROLLER_ACTION_MOVE*} för att röra dig. - - Ange ett frö som lägger grunden för din värld + + Använd{*CONTROLLER_ACTION_LOOK*} för att se dig omkring. - - Ladda sparad värld + + Håll in{*CONTROLLER_ACTION_ACTION*} för att hugga ned fyra träblock (trädstammar).{*B*}När ett block går sönder kan du plocka upp det genom att ställa dig nära det svävande föremål som dyker upp - då stoppas det i ditt inventarie. - - Tryck START för att ansluta + + Håll in{*CONTROLLER_ACTION_ACTION*} för att bryta och hugga block med händerna eller det föremål du håller i. Du kan behöva särskilda verktyg för att bryta vissa block. - - Avslutar spelet + + Tryck på{*CONTROLLER_ACTION_JUMP*} för att hoppa. - - Ett fel uppstod. Avslutar till huvudmenyn. + + Många saker kräver flera steg i tillverkningsprocessen. Nu när du har plankor finns det nya saker att tillverka. Tillverka en arbetsbänk.{*CraftingTableIcon*} - - Anslutningen misslyckades + + + Natten kommer snabbare än man kan ana, och det är farligt att befinna sig utomhus om man inte är ordentligt förberedd. Du kan tillverka vapen och rustningsdelar, men det är klokt att ha ett tryggt skydd. + - - Anslutningen tappades + + Öppna behållaren. - - Anslutningen till servern bröts. Avslutar till huvudmenyn. + + En hacka hjälper dig att bryta hårda block, som sten och malmblock, snabbare. Ju fler material du skaffar, desto tåligare och effektivare verktyg kan du tillverka. Bygg en trähacka.{*WoodenPickaxeIcon*} - - Kopplades ned av servern + + Använd hackan för att bryta några stenblock. De producerar kullersten när de bryts. Om du plockar upp åtta kullerstensblock kan du bygga en ugn. Du kan behöva gräva dig ned genom några lager jord innan du når sten, så använd spaden först.{*StoneIcon*} - - Du sparkades från spelet + + + Du måste samla resurser för att reparera skyddet. Väggar och tak kan byggas med vilket material som helst, men du kommer att behöva en dörr, några fönster och något som ger ljus. + - - Du sparkades från spelet för att du flög + + + I närheten finns en gruvarbetares övergivna skydd. Du kan reparera det för att vara trygg hela natten. + - - Anslutningsförsöket tog för lång tid + + En yxa hjälper dig att hugga ned träd och träblock snabbare. Ju fler material du skaffar, desto tåligare och effektivare verktyg kan du tillverka. Bygg en träyxa.{*WoodenHatchetIcon*} - - Servern är full + + Använd{*CONTROLLER_ACTION_USE*} för att använda föremål och objekt, och för att placera ut vissa saker. Saker som har placerats ut kan plockas upp igen genom att bryta ned dem med rätt verktyg. - - Värden har lämnat spelet. + + Använd{*CONTROLLER_ACTION_LEFT_SCROLL*} och{*CONTROLLER_ACTION_RIGHT_SCROLL*} för att byta vad du håller i. - - Du kan inte ansluta till det här spelet. Ingen av spelarna är dina vänner. + + För att snabba upp insamlingsprocessen kan du bygga verktyg för jobbet. Vissa verktyg har skaft gjorda av stavar. Tillverka några stavar nu.{*SticksIcon*} - - Du kan inte ansluta till det här spelet. Värden har sparkat dig förut. + + En spade gör det lättare att gräva i mjuka block, som jord och snö, snabbare. Ju fler material du skaffar, desto tåligare och effektivare verktyg kan du tillverka. Bygg en träspade.{*WoodenShovelIcon*} - - Du kan inte ansluta till det här spelet. Spelaren som du försöker att ansluta till kör en äldre version av spelet. + + Peka hårkorset på arbetsbänken och tryck på{*CONTROLLER_ACTION_USE*} för att använda den. - - Du kan inte ansluta till det här spelet. Spelaren som du försöker att ansluta till kör en nyare version av spelet. + + När du har valt arbetsbänken pekar du hårkorset på den plats där du vill ställa den, sedan trycker du på{*CONTROLLER_ACTION_USE*} för att placera arbetsbänken där. - - Ny värld + + Minecraft är ett spel som går ut på att placera block och bygga allt du kan tänka dig. +På natten kommer monster ut - se till att bygga skydd innan det händer. - - Belöning upplåst! + + - - Hurra! Du har belönats med en spelarbild med Steve från Minecraft! + + - - Hurra! Du har belönats med en spelarbild med en smygare! + + - - Lås upp fullständiga spelet + + - - Du spelar demoversionen av spelet, men du behöver den fullständiga versionen för att kunna spara. -Vill du låsa upp det fullständiga spelet nu? + + - - Vänta + + - - Inga resultat + + - - Filter: + + Layout 1 - - Vänner + + Förflyttning (när du flyger) - - Min poäng + + Spelare/bjud in - - Totalt + + - - Poster: + + Layout 3 - - Rang + + Layout 2 - - Förbereder att spara världen + + - - Förbereder segment ... + + - - Slutställer ... + + - - Genererar terräng + + - - Simulerar världen lite grand + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att påbörja övningen.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du tycker att du är redo att spela på egen hand. - - Startar server + + {*B*}Tryck på{*CONTROLLER_VK_A*} för att fortsätta. - - Genererar spawnområde + + - - Laddar spawnområde + + - - Färdas till Nedervärlden + + - - Lämnar Nedervärlden + + - - Spawnar på nytt + + - - Genererar värld + + - - Laddar värld + + - - Sparar spelare + + - - Ansluter till värden + + Silverfiskblock - - Laddar ned terräng + + Stenplatta - - Växlar till offlinespel + + Ett kompakt sätt att förvara järn. - - Vänta medan värden sparar spelet + + Järnblock - - Färdas till världens ände + + Ekplatta - - Lämnar världens ände + + Sandstensplatta - - Den här sängen används redan + + Stenplatta - - Du kan bara sova på natten + + Ett kompakt sätt att förvara guld. - - %s sover i en säng. För att hoppa till nästa morgon måste alla spelare sova i sängar samtidigt. + + Blomma - - Din säng saknades eller blockerades + + Vit ull - - Du kan inte sova nu, det finns monster i närheten + + Orange ull - - Du sover i en säng. För att hoppa till nästa morgon måste alla spelare sova i sängar samtidigt. + + Guldblock - - Verktyg och vapen + + Svamp - - Vapen + + Ros - - Mat + + Kullerstensplatta - - Strukturer + + Bokhylla - - Rustningsdelar + + Dynamit - - Mekanismer + + Tegelsten - - Färdmedel + + Fackla - - Dekorationer + + Obsidian - - Byggblock + + Mossten - - Rödsten och transport + + Nedermurstensplatta - - Diverse + + Ekplatta - - Bryggning + + Murstensplatta - - Verktyg, vapen och rustningsdelar + + Tegelstensplatta - - Material + + Djungelträplatta - - Loggade ut + + Björkplatta - - Svårighetsgrad + + Granplatta - - Musik + + Magentafärgad ull - - Ljud + + Björklöv - - Ljusstyrka + + Granbarr - - Känslighet - spelet + + Eklöv - - Känslighet - gränssnittet + + Glas - - Fridfullt + + Svamp - - Lätt + + Djungellöv - - Normalt + + Löv - - Svårt + + Ek - - I det här läget återfår spelaren hälsa med tiden, och det finns inga fiender i världen. + + Gran - - I det här läget finns det monster i världen, men de gör mindre skada än på den normala svårighetsgraden. + + Björk - - I det här läget finns det monster i världen, och de gör normal skada. + + Granträ - - I det här läget finns det monster i världen, och de gör stor skada. Se upp för smygare också, för de är mindre benägna att avbryta sina explosiva attacker om du springer ifrån dem! + + Björkträ - - Demotiden slut + + Djungelträ - - Spelet är fullt + + Ull - - Kunde inte ansluta till spelet. Det finns inga lediga platser. + + Rosa ull - - Ange skylttext + + Grå ull - - Skriv vad som ska stå på din skylt + + Ljusgrå ull - - Ange namn + + Ljusblå ull - - Ge din post ett namn + + Gul ull - - Ange bildtext + + Limegrön ull - - Ge din post en bildtext + + Cyanfärgad ull - - Ange beskrivning + + Grön ull - - Ge din post en beskrivning + + Röd ull - - Inventarie + + Svart ull - - Ingredienser + + Lila ull - - Brygdställ + + Blå ull - - Kista + + Brun ull - - Förtrolla + + Fackla (kol) - - Ugn + + Glödsten - - Ingrediens + + Själsand - - Bränsle + + Nedersten - - Automat + + Lasurstensblock - - Det finns inga erbjudanden på nedladdningsbart innehåll av den här typen för tillfället. + + Lasurstensmalm - - %s har anslutit till spelet. + + Portal - - %s har lämnat spelet. + + Pumpalykta - - %s har sparkats från spelet. + + Sockerrör - - Vill du radera den här sparfilen? + + Lera - - Väntar på godkännande + + Kaktus - - Censurerad + + Pumpa - - Spelar: + + Staket - - Återställ inställningar + + Jukebox - - Vill du återställa alla inställningar till deras standardvärden? + + Ett kompakt sätt att förvara lasursten. - - Laddningsfel + + Fallucka - - Spel skapat av %s + + Låst kista - - Okänd värds spel + + Diod - - Gästen loggade ut + + Klibbig kolv - - En gästspelare har loggat ut, vilket har fått alla gäster att loggas ut från spelet. + + Kolv - - Logga in + + Ull (vilken färg som helst) - - Du är inte inloggad. För att spela det här spelet måste du vara inloggad. Vill du logga in nu? + + Död buske - - Flera spelare tillåts inte + + Tårta - - Kunde inte skapa spel + + Musikblock - - Valt automatiskt + + Automat - - Inget paket: standardutseende + + Högt gräs - - Favoritutseenden + + Nät - - Blockerad värld + + Säng - - Spelet som du ansluter till är med på listan över blockerade världar. -Om du väljer att ansluta till spelet hävs blockeringen av världen. + + Is - - Blockera den här världen? + + Arbetsbänk - - Vill du lägga till den här världen på listan med blockerade världar? -Om du väljer OK avslutas spelet. + + Ett kompakt sätt att förvara diamanter. - - Häv blockering + + Diamantblock - - Automatisk sparfrekvens + + Ugn - - Automatisk sparfrekvens: AV + + Åkermark - - Minuter + + Grödor - - Kan inte placeras här! + + Diamantmalm - - Det är inte tillåtet att placera lava för nära världens spawnplats. Det vore för lätt för spawnande spelare att dö. + + Monsterspawnare - - Gränssnittets opacitet + + Eld - - Förbereder automatisk sparning av världen + + Fackla (träkol) - - Gränssnittets storlek + + Rödstensstoft - - Gränssnittets storlek (delad skärm) + + Kista - - Frö + + Ektrappor - - Lås upp utseendepaket + + Skylt - - För att använda det valda utseendet måste du låsa upp det här utseendepaketet. -Vill du låsa upp utseendepaketet nu? + + Rödstensmalm - - Lås upp texturpaket + + Järndörr - - För att använda det här texturpaketet i din värld måste du låsa upp det. -Vill du låsa upp det nu? + + Tryckplatta - - Demonstration av texturpaket + + Snö - - Du använder en demoversion av texturpaketet. Du kan inte spara världen om du inte låser upp fullversionen. -Vill du låsa upp fullversionen av texturpaketet? + + Knapp - - Texturpaket saknas + + Rödstensfackla - - Lås upp fullversion + + Spak - - Ladda ned demoversion + + Räls - - Ladda ned fullversion + + Stege - - Den här världen använder ett kombinations- eller texturpaket som du inte har! -Vill du installera kombinations- eller texturpaketet nu? + + Trädörr - - Skaffa demoversion + + Stentrappor - - Skaffa fullversion + + Sensorräls - - Sparka spelare + + Rödstensräls - - Vill du sparka den här spelaren från spelet? Spelaren kan inte ansluta på nytt förrän du startar om världen. + + Du har samlat tillräckligt mycket kullersten för att bygga en ugn. Använd din arbetsbänk för att bygga en. - - Spelarbildspaket + + Fiskespö - - Teman + + Klocka - - Utseendepaket + + Glödstensstoft - - Tillåt vänners vänner + + Gruvvagn med ugn - - Du kan inte ansluta till det här spelet. Det har begränsats till spelare som är vänner till värden. + + Ägg - - Kan inte ansluta till spelet + + Kompass - - Valt + + Rå fisk - - Valt utseende: + + Rosenröd - - Korrupt nedladdningsbart innehåll + + Kaktusgrön - - Det här nedladdningsbara innehållet är korrupt och kan inte användas. Du måste radera det och sedan installera det på nytt från Minecraftbutiken. + + Kakaobönor - - Delar av ditt nedladdningsbara innehåll är korrupt och kan inte användas. Du måste radera det och sedan installera det på nytt från Minecraftbutiken. + + Tillagad fisk - - Ditt spelläge har ändrats + + Färgämne - - Döp om din värld + + Bläcksäck + + + Gruvvagn med kista - - Ange världens nya namn + + Snöboll - - Spelläge: Överlevnad + + Båt - - Spelläge: Kreativt + + Läder - - Överlevnad + + Gruvvagn - - Kreativt + + Sadel - - Skapad i överlevnadsläget + + Rödsten - - Skapad i det kreativa läget + + Mjölkhink - - Visa moln + + Papper - - Vad vill du göra med den här sparfilen? + + Bok - - Byt namn på sparfilen + + Slemklump - - Sparar automatiskt om %d ... + + Tegelsten - - + + Lera - - Av + + Sockerrör - - Normal + + Lasursten - - Platt + + Karta - - När det här alternativet är valt spelas spelet i onlineläge. + + Musikskiva - "13" - - När det här alternativet är valt kan bara inbjudna spelare ansluta. + + Musikskiva - "cat" - - När det här alternativet är valt kan vänner till folk på din vänlista ansluta. + + Säng - - När det här alternativet är valt kan spelare skada andra spelare. Påverkar bara överlevnadsläget. + + Rödstensförstärkare - - När det här alternativet är avstängt måste spelare godkännas innan de kan bygga eller bryta block. + + Kaka - - När det här alternativet är valt kan eld sprida sig till närliggande brännbara block. + + Musikskiva - "blocks" - - När det här alternativet är aktiverat exploderar dynamit när den aktiveras. + + Musikskiva - "mellohi" - - När det här alternativet är valt byggs Nedervärlden upp på nytt. Det är användbart om du har en gammal sparfil utan fästningar i Nedervärlden. + + Musikskiva - "stal" - - När det här alternativet är valt kommer byar och fästningar att genereras i världen. + + Musikskiva - "strad" - - När det här alternativet är valt kommer den vanliga världen och Nedervärlden att vara helt platta. + + Musikskiva - "chirp" - - När det här alternativet är valt kommer en kista med användbara föremål att skapas nära spelarens spawnplats. + + Musikskiva - "far" - - Utseendepaket + + Musikskiva - "mall" - - Teman + + Tårta - - Spelarbilder + + Grå färg - - Avatarföremål + + Rosa färg - - Texturpaket + + Limegrön färg - - Kombinationspaket + + Lila färg - - {*PLAYER*} brann upp + + Cyanfärg - - {*PLAYER*} brann ihjäl + + Ljusgrå färg - - {*PLAYER*} försökte sig på att simma i lava + + Maskrosgul färg - - {*PLAYER*} kvävdes i en vägg + + Benmjöl - - {*PLAYER*} drunknade + + Ben - - {*PLAYER*} svalt ihjäl + + Socker - - {*PLAYER*} stacks ihjäl + + Ljusblå färg - - {*PLAYER*} träffade backen för hårt + + Magentafärg - - {*PLAYER*} föll av världen + + Orange färg - - {*PLAYER*} dog + + Skylt - - {*PLAYER*} sprängdes + + Lädertunika - - {*PLAYER*} dödades av magi + + Järnharnesk - - {*PLAYER*} dödades av enderdrakens eld + + Diamantharnesk - - {*PLAYER*} dödades av {*SOURCE*} + + Järnhjälm - - {*PLAYER*} dödades av {*SOURCE*} + + Diamanthjälm - - {*PLAYER*} sköts av {*SOURCE*} + + Guldhjälm - - {*PLAYER*} träffades av ett eldklot från {*SOURCE*} + + Guldharnesk - - {*PLAYER*} mörbultades av {*SOURCE*} + + Guldskenor - - {*PLAYER*} dödades av {*SOURCE*} + + Läderstövlar - - Berggrundsdimma + + Järnstövlar - - Visa gränssnittet + + Läderbyxor - - Visa handen + + Järnskenor - - Dödsmeddelanden + + Diamantskenor - - Animerad spelfigur + + Läderhuva - - Anpassad utseendeanimation + + Stenskyffel - - Du kan inte längre bryta block eller använda föremål + + Järnskyffel - - Nu kan du bryta block och använda föremål + + Diamantskyffel - - Du kan inte längre placera block + + Diamantyxa - - Nu kan du placera block + + Guldyxa - - Nu kan du använda dörrar och kopplare + + Träskyffel - - Du kan inte längre använda dörrar eller kopplare + + Guldskyffel - - Nu kan du använda behållare (exempelvis kistor) + + Ringbrynja - - Du kan inte längre använda behållare (exempelvis kistor) + + Ringbrynjebyxor - - Du kan inte längre anfalla varelser + + Ringbrynjestövlar - - Nu kan du anfalla varelser + + Trädörr - - Du kan inte längre anfalla spelare + + Järndörr - - Nu kan du anfalla spelare + + Ringbrynjehuva - - Du kan inte längre anfalla djur + + Diamantstövlar - - Nu kan du anfalla djur + + Fjäder - - Du har blivit till moderator + + Krut - - Du är inte längre moderator + + Veteax - - Du kan flyga + + Skål - - Du kan inte längre flyga + + Svampstuvning - - Du blir inte längre utmattad + + Tråd - - Nu kan du bli utmattad + + Vete - - Nu är du osynlig + + Tillagad fläskkotlett - - Du är inte längre osynlig + + Tavla - - Nu är du odödlig + + Guldäpple - - Du är inte längre odödlig + + Bröd - - %d MSP + + Flintsten - - Enderdrake + + Rå fläskkotlett - - %s har nått världens ände + + Stav - - %s har lämnat världens ände + + Hink - - -{*C3*}Jag ser spelaren du menar.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Ja. Var försiktig. Den har nått en högre nivå nu. Den kan läsa våra tankar.{*EF*}{*B*}{*B*} -{*C2*}Det spelar ingen roll. Den tror att vi är en del av spelet.{*EF*}{*B*}{*B*} -{*C3*}Jag gillar den här spelaren. Den spelade bra. Den gav inte upp.{*EF*}{*B*}{*B*} -{*C2*}Den läser våra tankar som om de vore ord på skärmen.{*EF*}{*B*}{*B*} -{*C3*}Det är så den manifesterar många saker när den befinner sig djupt ned i spelandets drömmar.{*EF*}{*B*}{*B*} -{*C2*}Ord fungerar som ett underbart gränssnitt. De är väldigt flexibla. Inte alls lika läskiga som att möta verkligheten bakom skärmen.{*EF*}{*B*}{*B*} -{*C3*}De brukade höra röster. Innan spelare kunde läsa. På den tiden då de som inte spelade kallade spelare för häxor och trollkarlar. När spelare drömde att de flög fram genom luften på stavar med hjälp av demoners kraft.{*EF*}{*B*}{*B*} -{*C2*}Vad drömde den här spelaren?{*EF*}{*B*}{*B*} -{*C3*}Den här spelaren drömde om solljus och träd. Om eld och vatten. Den drömde att den skapade, och den drömde att den förstörde. Den drömde att den jagade och jagades. Den drömde om skydd.{*EF*}{*B*}{*B*} -{*C2*}Hah, det ursprungliga gränssnittet. En miljon år gammalt, och det fungerar fortfarande. Men vilka riktiga strukturer skapade den här spelaren i verkligheten bortom skärmen?{*EF*}{*B*}{*B*} -{*C3*}Den slet, med miljontals som den, för att skapa en riktig värld i {*EF*}{*NOISE*}{*C3*}, och skapade en {*EF*}{*NOISE*}{*C3*} åt {*EF*}{*NOISE*}{*C3*}, i {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} -{*C2*}Den kan inte läsa den tanken.{*EF*}{*B*}{*B*} -{*C3*}Nej. Den har inte nått den högsta nivån. Det kan den bara göra i livets långa dröm, inte i spelets korta dröm.{*EF*}{*B*}{*B*} -{*C2*}Vet den att vi älskar den? Att universum är givmilt?{*EF*}{*B*}{*B*} -{*C3*}Ja. Ibland kan den, genom oväsendet i alla tankar, höra universum.{*EF*}{*B*}{*B*} -{*C2*}Men då och då är den ledsen, i den långa drömmen. Den skapar världar utan somrar, den huttrar under en svart sol och den tar sin dystra skapelse för verklighet.{*EF*}{*B*}{*B*} -{*C3*}Att bota dess sorg skulle förgöra den. Sorgen fyller en funktion. Vi får inte komma i vägen för den.{*EF*}{*B*}{*B*} -{*C2*}Ibland, när de är djupt inne i en dröm, vill jag berätta för dem att de bygger riktiga världar i verkligheten. Ibland vill jag berätta hur viktiga de är för universum. Ibland, när de inte har gjort en riktig koppling på länge, vill jag hjälpa dem att säga ordet de fruktar.{*EF*}{*B*}{*B*} -{*C3*}Den läser våra tankar{*EF*}{*B*}{*B*} -{*C2*}Ibland bryr jag mig inte. Ibland vill jag berätta för dem att världen de tar för given bara är {*EF*}{*NOISE*}{*C2*} och {*EF*}{*NOISE*}{*C2*}, jag vill berätta att de är {*EF*}{*NOISE*}{*C2*} i {*EF*}{*NOISE*}{*C2*}. De ser så lite av verkligheten i den långa drömmen.{*EF*}{*B*}{*B*} -{*C3*}Ändå spelar de spelet.{*EF*}{*B*}{*B*} -{*C2*}Men det skulle vara så lätt att berätta för dem ...{*EF*}{*B*}{*B*} -{*C3*}Det vore för mycket för den här drömmen. Att säga hur de ska leva skulle förhindra dem från att leva.{*EF*}{*B*}{*B*} -{*C2*}Jag ska inte säga åt den här spelaren hur den ska leva.{*EF*}{*B*}{*B*} -{*C3*}Spelaren börjar bli otålig.{*EF*}{*B*}{*B*} -{*C2*}Jag ska berätta en historia för spelaren.{*EF*}{*B*}{*B*} -{*C3*}Men inte sanningen.{*EF*}{*B*}{*B*} -{*C2*}Nej. En historia där sanningen är inlåst i en bur av ord. Inte den nakna sanningen som svider oavsett avstånd.{*EF*}{*B*}{*B*} -{*C3*}Ge den en kropp igen.{*EF*}{*B*}{*B*} -{*C2*}Ja. Spelare ...{*EF*}{*B*}{*B*} -{*C3*}Använd dess namn.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Spelare av spel.{*EF*}{*B*}{*B*} -{*C3*}Bra.{*EF*}{*B*}{*B*} + + Vattenhink - - -{*C2*}Ta ett djupt andetag. Ta ett till. Känn luften i lungorna. Låt dina kroppsdelar vakna. Ja, rör på fingrarna. Ha en kropp igen, känn gravitationen, känn luften. Återgå till den långa drömmen. Där är du. Hela din kropp vidrör universum, som om ni var två skilda saker. Som om vi var skilda saker.{*EF*}{*B*}{*B*} -{*C3*}Vilka är vi? För länge sedan kallades vi för bergets ande. Fader sol, moder måne. Förfädernas andar, djurens andar. Djinn. Spöken. Den gröne mannen. Sedan gudar och demoner. Änglar. Poltergeister. Rymdvarelser, utomjordingar. Leptoner, kvarkar. Orden förändras. Vi förändras inte.{*EF*}{*B*}{*B*} -{*C2*}Vi är universum. Vi är allt du tror inte är du. Du ser på oss nu, genom huden och ögonen. Varför tror du att universum vidrör dig och kastar ljus på dig? För att se dig, spelare. För att lära känna dig. Och för att bli känt. Jag ska berätta en historia för dig.{*EF*}{*B*}{*B*} -{*C2*}Det var en gång en spelare.{*EF*}{*B*}{*B*} -{*C3*}Spelaren var du, {*PLAYER*}.{*EF*}{*B*}{*B*} -{*C2*}Ibland såg den sig som en människa på skorpan av ett klot som bestod av smält sten. Klotet av smält sten låg i omlopp runt ett klot av brinnande gas som var 330.000 gånger större än det. De var så långt ifrån varandra att det tog åtta minuter för ljuset att ta sig från det ena klotet till det andra. Ljuset var information från en stjärna, och det kunde bränna dig från ett avstånd på 150 miljoner kilometer.{*EF*}{*B*}{*B*} -{*C2*}Ibland drömde spelaren att den var en gruvarbetare på ytan av en planet som var platt och oändlig. Solen var en vit fyrkant. Dagarna var korta – det fanns mycket att göra och döden var bara en tillfällig obekvämlighet.{*EF*}{*B*}{*B*} -{*C3*}Ibland drömde spelaren att den tappade bort sig i en berättelse.{*EF*}{*B*}{*B*} -{*C2*}Ibland drömde spelaren att den var andra saker, på andra platser. Ibland var drömmarna skrämmande. Ibland var de vackra. Ibland kunde spelaren gå från en dröm till en annan, och sedan vakna från den in i en tredje.{*EF*}{*B*}{*B*} -{*C3*}Ibland drömde spelaren att den läste ord på en skärm.{*EF*}{*B*}{*B*} -{*C2*}Låt oss backa en bit.{*EF*}{*B*}{*B*} -{*C2*}Spelarens atomer låg utspridda i gräset, i floderna, i luften, i marken. En kvinna samlade atomerna – hon drack, åt och andades – och kvinnan satte ihop spelaren i sin kropp.{*EF*}{*B*}{*B*} -{*C2*}Till slut vaknade spelaren. Från den varma, mörka världen i modern och ut i den långa drömmen.{*EF*}{*B*}{*B*} -{*C2*}Spelaren var en ny historia, en som aldrig hade berättats förut, skriven med alfabetet vi kallar för DNA. Spelaren var ett nytt program som aldrig hade körts förut, genererad av en källkod som är över en miljard år gammal. Spelaren var en ny människa som aldrig hade levt förut. En spelare gjord på inget annat än mjölk och kärlek.{*EF*}{*B*}{*B*} -{*C3*}Du är spelaren. Historien. Programmet. Människan. Gjord på inget annat än mjölk och kärlek.{*EF*}{*B*}{*B*} -{*C2*}Låt oss backa ännu längre.{*EF*}{*B*}{*B*} -{*C2*}De sju miljarders miljarders miljarder atomer i spelarens kropp skapades, långt innan spelets skapelse, i hjärtat av en stjärna. Alltså är även spelaren information från en stjärna. Spelaren rör sig genom en berättelse, vilken är en informationsdjungel planterad av en man som heter Julian, på en platt och oändlig värld skapad av en man som heter Markus. Den existerar inuti en liten, privat värld som har skapats av spelaren, som lever i ett universum skapat av...{*EF*}{*B*}{*B*} -{*C3*}Shhhh. Ibland skapade spelaren en liten, privat värld som var mjuk, varm och enkel. Andra gånger var den hård, kall och komplicerad. Ibland byggde den upp en bild av universum i sitt huvud – små energipartiklar som rörde sig genom enorma, tomma ytor. Ibland kallade den partiklarna för "elektroner" och "protoner".{*EF*}{*B*}{*B*} - + + Lavahink - - {*C2*}Ibland kallade den dem för "planeter" och "stjärnor".{*EF*}{*B*}{*B*} {*C2*}Ibland trodde den att den befann sig i ett universum som bestod av "av" och "på", av ettor och nollor, av rader med kod. Ibland trodde den att den spelade ett spel. Ibland trodde den att den läste ord på en skärm.{*EF*}{*B*}{*B*} {*C3*}Du är spelaren som läser ord...{*EF*}{*B*}{*B*} {*C2*}Shhh. Ibland läste spelaren rader med kod på skärmen. Omvandlade dem till ord, omvandlade orden till mening, omvandlade mening till känslor, teorier och idéer. Spelaren började andas snabbare och djupare och insåg att den var vid liv, den var vid liv, de där tusentals dödsfallen var inte på riktigt, spelaren var vid liv.{*EF*}{*B*}{*B*} {*C3*}Du. Du. Du lever.{*EF*}{*B*}{*B*} {*C2*}Ibland trodde spelaren att universum hade talat till den genom solljuset som föll genom sommarträdens rasslande löv.{*EF*}{*B*}{*B*} {*C3*}Ibland trodde spelaren att universum hade talat till den genom ljuset som föll från den iskalla natthimlen, där en ljusprick i hörnet av spelarens synfält kan vara en stjärna som är miljoner gånger så stor som solen, och så varm att den kokar planeter till plasma bara för att vara synlig för spelaren för ett kort ögonblick – spelaren som är på väg hem på andra sidan universum och helt plötsligt känner doften av mat, som närmar sig den bekanta dörren och är på väg in i drömmen igen.{*EF*}{*B*}{*B*} {*C2*}Ibland trodde spelaren att universum hade talat till den genom ettor och nollor, genom världens elektricitet, genom ord som rullar fram över skärmen vid slutet av en dröm.{*EF*}{*B*}{*B*} {*C3*}Och universum sade "jag älskar dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du har spelat spelet väl".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "allt du behöver finns inom dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är starkare än vad du tror".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är dagsljuset".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är natten".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "mörkret du kämpar mot finns inom dig".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "ljuset du söker finns inom dig".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är inte ensam".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "du är inte separerad från allt annat".{*EF*}{*B*}{*B*} {*C3*}Och universum sade "du är universum som smakar sig själv, pratar med sig själv och läser sin egen kod".{*EF*}{*B*}{*B*} {*C2*}Och universum sade "jag älskar dig, för du är kärlek".{*EF*}{*B*}{*B*} {*C3*}Sedan var spelet över och spelaren vaknade från drömmen. Spelaren drömde sedan en annan dröm. Om och om igen, bättre och bättre. Spelaren var universum, och spelaren var kärlek.{*EF*}{*B*}{*B*} {*C3*}Du är spelaren.{*EF*}{*B*}{*B*} {*C2*}Vakna.{*EF*} + + Guldstövlar - - Återställ Nedervärlden + + Järntacka - - Vill du återställa den här sparfilens Nedervärld till dess ursprungliga tillstånd? Du kommer att förlora allt som har byggts i Nedervärlden? + + Guldtacka - - Återställ Nedervärlden + + Tändstål - - Återställ inte Nedervärlden + + Kol - - Du kan inte klippa den här svampkon för tillfället. Det maximala antalet grisar, får, kor och katter har uppnåtts. + + Träkol - - Du kan inte använda ägget för tillfället. Det maximala antalet grisar, får, kor och katter har uppnåtts. + + Diamant - - Du kan inte använda ägget för tillfället. Det maximala antalet svampkor har uppnåtts. + + Äpple - - Du kan inte använda ägget för tillfället. Det maximala antalet vargar i en värld har uppnåtts. + + Pilbåge - - Du kan inte använda ägget för tillfället. Det maximala antalet höns i en värld har uppnåtts. + + Pil - - Du kan inte använda ägget för tillfället. Det maximala antalet bläckfiskar i en värld har uppnåtts. + + Musikskiva - "ward" - - Du kan inte använda ägget för tillfället. Det maximala antalet fiender i en värld har uppnåtts. + + + Tryck på{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*} för att välja vilken typ av grupp du vill tillverka föremål ur. Välj strukturgruppen.{*StructuresIcon*} + - - Du kan inte använda ägget för tillfället. Det maximala antalet bybor i en värld har uppnåtts. + + + Tryck på{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*} för att välja vilken typ av grupp du vill tillverka föremål ur. Välj verktygsgruppen.{*ToolsIcon*} + - - Det maximala antalet tavlor/uppvisningsboxar i en värld har uppnåtts. + + + Nu när du har byggt en arbetsbänk kan du placera den i världen för att kunna bygga fler saker.{*B*} + Tryck på{*CONTROLLER_VK_B*} för att stänga tillverkningsgränssnittet. + - - Du kan inte spawna fiender i det fridfulla läget. + + + Dina nya verktyg hjälper dig att komma igång, och nu kan du samla in många olika resurser på ett mer effektivt sätt.{*B*} + Tryck på{*CONTROLLER_VK_B*} för att stänga tillverkningsgränssnittet. + - - Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga grisar, får, kor och katter har uppnåtts. + + + För att tillverka vissa saker krävs flera steg. Nu när du har några plankor finns det fler saker att tillverka. Använd{*CONTROLLER_MENU_NAVIGATE*} för att välja det föremål du vill tillverka. Välj arbetsbänken.{*CraftingTableIcon*} + - - Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga vargar har uppnåtts. + + + Använd{*CONTROLLER_MENU_NAVIGATE*} för att markera det föremål du vill tillverka. Vissa föremål har flera olika versioner, beroende på vilka material som används. Välj träspaden.{*WoodenShovelIcon*} + - - Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga höns har uppnåtts. + + Träet som du har skaffat kan göras om till plankor. Välj ikonen för plankorna och tryck på{*CONTROLLER_VK_A*} för att tillverka dem.{*PlanksIcon*} - - Det här djuret kan inte bli brunstigt. Det maximala antalet brunstiga svampkor har uppnåtts. + + + Du kan tillverka fler föremål med en arbetsbänk. Tillverkning på en arbetsbänk fungerar precis som vanlig tillverkning, men du har en större tillverkningsyta, vilket möjliggör fler kombinationer av resurser. + - - Det maximala antalet båtar i en värld har uppnåtts. + + + Tillverkningsområdet visar vilka resurser som krävs för att tillverka det nya föremålet. Tryck på{*CONTROLLER_VK_A*} för att tillverka föremålet och lägga det i ditt inventarie. + - - Det maximala antalet varelsehuvuden i en värld har uppnåtts. + + + Bläddra igenom de olika gruppflikarna högst upp med{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*}. Välj den grupp som föremålet du vill tillverka tillhör, tryck sedan på{*CONTROLLER_MENU_NAVIGATE*} för att välja föremålet. + - - Omvänd Y-axel + + + Resurserna som krävs för att tillverka föremålet listas nu. + - - Vänsterhänt + + + Beskrivningen av det valda föremålet visas nu. Beskrivningen kan ge dig tips om hur föremålet kan användas. + - - Du dog! + + + Den nedre högra delen av tillverkningsgränssnittet visar ditt inventarie. Det här området visar även en beskrivning av det valda föremålet och vilka resurser som krävs för att tillverka det. + - - Spawna + + + Vissa saker kan inte tillverkas på en arbetsbänk, utan kräver en ugn. Tillverka en ugn nu.{*FurnaceIcon*} + - - Erbjudanden på nedladdningsbart innehåll + + Grus - - Ändra utseende + + Guldmalm - - Instruktioner + + Järnmalm - - Kontrollinställningar + + Lava - - Inställningar + + Sand - - Medverkande + + Sandsten - - Installera om innehåll + + Kolmalm - - Debuginställningar + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder ugnen. + - - Eld sprider sig + + + Det här är ugnens gränssnitt. Med en ugn kan du förändra föremål genom att bränna eller smälta dem. Du kan exempelvis göra järntackor av järnmalm i den. + - - Dynamit exploderar + + + Placera ut din ugn i världen. Det vore klokt att ställa den i ditt skydd.{*B*} + Tryck på{*CONTROLLER_VK_B*} för att stänga tillverkningsgränssnittet. + - - Spelare mot spelare + + Trä - - Lita på spelare + + Ekträ - - Värdprivilegier + + + Du måste lägga bränsle på ugnens nedre plats, och föremålet som ska brännas eller smältas på den övre platsen. Ugnen kommer sedan att aktiveras och resultatet hamnar på den högra platsen. + - - Generera strukturer + + {*B*} + Tryck på{*CONTROLLER_VK_X*} för att visa inventariet igen. + - - Platt värld + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder inventariet. + - - Bonuskista + + + Det här är ditt inventarie. Det visar vad du kan använda med händerna och allt annat du bär på. Här visas även din rustning. + - - Världsalternativ + + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta med övningen.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du tycker att du är redo att fortsätta på egen hand. + - - Kan bygga och bryta block + + + Om du flyttar markören utanför gränssnittet när markören håller i ett föremål, kan du släppa föremålet. + - - Kan använda dörrar och kopplare + + + Använd markören för att flytta det här föremålet till en annan plats i inventariet. Tryck på{*CONTROLLER_VK_A*} för att lägga det där. + När markören bär på flera föremål trycker du på{*CONTROLLER_VK_A*} för att lägga undan alla, eller på{*CONTROLLER_VK_X*} för att bara lägga undan ett av dem. + - - Kan öppna behållare + + + Använd{*CONTROLLER_MENU_NAVIGATE*} för att styra markören. Använd{*CONTROLLER_VK_A*} för att plocka upp ett föremål under markören. + Om det finns mer än ett föremål under markören kommer du att plocka upp alla, eller så kan du använda{*CONTROLLER_VK_X*} för att plocka upp hälften av dem. + - - Kan anfalla spelare + + + Du har klarat av den första delen av övningen. + - - Kan anfalla djur + + Använd ugnen för att producera glas. Medan du väntar på att den blir klar kan du samla fler resurser för att reparera skyddet. - - Moderator + + Använd ugnen för att producera träkol. Medan du väntar på att den blir klar kan du samla fler resurser för att reparera skyddet. - - Sparka spelare + + Använd{*CONTROLLER_ACTION_USE*} för att placera ut ugnen i världen, öppna den sedan. - - Kan flyga + + Det kan bli väldigt mörkt på natten, så du behöver ljus inne i skyddet för att kunna se något. Öppna tillverkningsgränssnittet och bygg en fackla av stavar och träkol.{*TorchIcon*} - - Stäng av utmattning + + Använd{*CONTROLLER_ACTION_USE*} för att placera ut dörren. Du kan använda{*CONTROLLER_ACTION_USE*} för att öppna och stänga trädörrar som står utplacerade i världen. - - Osynlig + + Ett bra skydd behöver en dörr så att du kan komma och gå utan att behöva ha sönder väggarna hela tiden. Tillverka en trädörr nu.{*WoodenDoorIcon*} - - Värdalternativ + + + Om du vill ha mer information om ett föremål, flyttar du markören över föremålet och trycker på {*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Spelare/bjud in + + + Det här är tillverkningsgränssnittet. Det låter dig kombinera dina resurser för att tillverka nya saker. + - - Onlinespel + + + Tryck på{*CONTROLLER_VK_B*} nu för att lämna det kreativa lägets inventarie. + - - Endast inbjudan + + + För mer information om ett föremål, för markören över det och tryck på{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. + - - Fler alternativ + + {*B*} + Tryck på{*CONTROLLER_VK_X*} för att visa vad som behövs för att tillverka det markerade föremålet. + - - Ladda + + {*B*} + Tryck på{*CONTROLLER_VK_X*} för att visa en beskrivning. + - - Ny värld + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man tillverkar saker. + - - Världens namn + + + Bläddra mellan de olika gruppflikarna genom att trycka på{*CONTROLLER_VK_LB*} och{*CONTROLLER_VK_RB*}. På de flikarna kan du välja vilka slags föremål du vill plocka upp. + - - Frö till världsskaparen + + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att fortsätta.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder det kreativa lägets inventarie. + - - Lämna blankt för ett slumpmässigt frö + + + Det här är det kreativa lägets inventarie. Det visar vad du kan använda med händerna och allt annat du kan välja från. + - - Spelare + + + Tryck på{*CONTROLLER_VK_B*} nu för att stänga inventariet. + - - Anslut till spel + + + Om du flyttar markören utanför gränssnittet när markören håller i ett föremål, kan du släppa föremålet i världen. Tryck på{*CONTROLLER_VK_X*} för att ta bort alla föremål ur snabbvalsraden. + - - Starta + + + Markören flyttas automatiskt till en plats på användningsraden. Du kan lägga föremålet där med{*CONTROLLER_VK_A*}. När du har lagt dit föremålet återvänder markören till föremålslistan där du kan välja ett annat föremål. + - - Inga spel hittades + + + Använd{*CONTROLLER_MENU_NAVIGATE*} för att styra markören. + I föremålslistan kan du använda{*CONTROLLER_VK_A*} för att plocka upp ett föremål under markören, eller{*CONTROLLER_VK_Y*} för att plocka upp hela högen med sådana föremål. + - - Spela + + Vatten - - Rankningslistor + + Glasflaska - - Hjälp och alternativ + + Vattenflaska - - Lås upp fullversion + + Spindelöga - - Återgå till spelet + + Guldklimp - - Spara + + Nedervårta - - Svårighetsgrad: + + {*prefix*}Brygd{*postfix*}{*splash*} - - Speltyp: + + Fermenterat spindelöga - - Strukturer: + + Kittel - - Nivåtyp: + + Enderöga - - Spelare mot spelare: + + Glimmande melon - - Lita på spelare: + + Brännpulver - - Dynamit: + + Magmasalva - - Eld sprider sig: + + Brygdställ - - Installera om tema + + Spöktår - - Installera om spelarbild 1 + + Pumpafrön - - Installera om spelarbild 2 + + Melonfrön - - Installera om avatarföremål 1 + + Rå kyckling - - Installera om avatarföremål 2 + + Musikskiva - "11" - - Installera om avatarföremål 3 + + Musikskiva - "where are we now" - - Alternativ + + Sax - - Ljud + + Tillagad kyckling - - Känslighet + + Enderpärla - - Bild + + Melonskiva - - Gränssnitt + + Brännstav - - Återställ standardvärden + + Rått nötkött - - Guppande kamera + + Biffstek - - Tips + + Ruttet kött - - Verktygstips + + Förtrollningsflaska - - Lodrät skärmdelning för 2 spelare + + Ekträplankor - - Färdig + + Granträplankor - - Redigera skylttext: + + Björkträplankor - - Fyll i uppgifterna som följer med din skärmbild + + Gräsblock - - Bildtext + + Jord - - Skärmbild från spelet + + Kullersten - - Redigera skylttext: + + Djungelträplankor - - Minecrafts klassiska texturer, ikoner och gränssnitt! + + Björkskott - - Visa alla kombinationsvärldar + + Djungelträdskott - - Inga effekter + + Berggrund - - Snabbhet + + Skott - - Slöhet + + Ekskott - - Flitighet + + Granskott - - Lathet + + Sten - - Styrka + + Uppvisningsbox - - Svaghet + + Spawna {*CREATURE*} - - Hälsa direkt + + Nedermursten - - Skada direkt + + Eldladdning - - Högre hopp + + Eldladdning (träkol) - - Illamående + + Eldladdning (kol) - - Regenerering + + Dödskalle - - Motstånd + + Huvud - - Eldmotstånd + + Huvud från %s - - Vattenandning + + Smygarhuvud - - Osynlighet + + Skelettskalle - - Blindhet + + Witherskelettskalle - - Mörkersyn + + Zombiehuvud - - Hunger + + Ett kompakt sätt att förvara kol. Kan användas som bränsle i en ugn. Gift - - för snabbhet + + Hunger för slöhet - - för flitighet + + för snabbhet - - för lathet + + Osynlighet - - för styrka + + Vattenandning - - för svaghet + + Mörkersyn - - som läker + + Blindhet som skadar - - för högre hopp + + som läker för illamående @@ -5202,29 +6118,38 @@ Vill du installera kombinations- eller texturpaketet nu? för regenerering - - för motstånd + + för lathet - - för eldmotstånd + + för flitighet - - för vattenandning + + för svaghet + + + för styrka + + + Eldmotstånd - - för osynlighet + + Mättnad - - för blindhet + + för motstånd - - för mörkersyn + + för högre hopp - - för hunger + + Wither - - som förgiftar + + Hälsobonus + + + Absorbering @@ -5235,29 +6160,41 @@ Vill du installera kombinations- eller texturpaketet nu? III + + för osynlighet + IV - - (Explosiv) + + för vattenandning - - Banal + + för eldmotstånd - - Ointressant + + för mörkersyn - - Mild + + som förgiftar - - Klar + + för hunger - - Mjölkig + + för absorbering - - Grumlig + + för mättnad + + + för hälsobonus + + + för blindhet + + + som förmultnar Medioker @@ -5265,17 +6202,17 @@ Vill du installera kombinations- eller texturpaketet nu? Tunn - - Basal + + Grumlig - - Avslagen + + Klar - - Klumpig + + Mjölkig - - Inkompetent + + Basal Smörig @@ -5283,246 +6220,300 @@ Vill du installera kombinations- eller texturpaketet nu? Len - - Fin + + Inkompetent - - Lyxig + + Avslagen - - Tjock + + Klumpig - - Elegant + + Mild - - Utsökt + + (Explosiv) - - Charmig + + Banal + + + Ointressant Ståtlig - - Raffinerad - Hjärtlig + + Charmig + + + Elegant + + + Utsökt + Bubblig + + Stinkande + + + Sträv + + + Doftlös + Potent Äcklig - - Doftlös + + Fin - - Stinkande + + Raffinerad - - Sträv + + Tjock - - Bitter + + Lyxig - - Vidrig + + Återställer hälsa över tiden för påverkade spelare, djur och monster. - - Illaluktande + + Tar hälsa på en gång från påverkade spelare, djur och monster. - - Används som grund till alla brygder. Använd i ett brygdställ för att tillverka brygder. + + Gör påverkade spelare, djur och monster immuna mot skada från eld, lava och brännares avståndsattacker. Har ingen effekt. Tillsätt fler ingredienser i ett brygdställ för att tillverka brygder. - - Gör att påverkade spelare, djur och monster rör sig snabbare. Spelare springer även snabbare och kan både hoppa och se längre. + + Bitter Gör att påverkade spelare, djur och monster rör sig långsammare. Spelare springer även långsammare och både hoppar och ser kortare. + + Gör att påverkade spelare, djur och monster rör sig snabbare. Spelare springer även snabbare och kan både hoppa och se längre. + Gör att påverkade spelare och monster åsamkar mer skada när de anfaller. + + Ger hälsa på en gång till påverkade spelare, djur och monster. + Gör att påverkade spelare och monster åsamkar mindre skada när de anfaller. - - Ger hälsa på en gång till påverkade spelare, djur och monster. + + Används som grund till alla brygder. Använd i ett brygdställ för att tillverka brygder. - - Tar hälsa på en gång från påverkade spelare, djur och monster. + + Vidrig - - Återställer hälsa över tiden för påverkade spelare, djur och monster. + + Illaluktande - - Gör påverkade spelare, djur och monster immuna mot skada från eld, lava och brännares avståndsattacker. + + Heligt + + + Skärpa Åsamkar skada över tiden för påverkade spelare, djur och monster. - - Skärpa + + Attackskada - - Heligt + + Knuff Leddjurens bane - - Knuff + + Snabbhet - - Eldkraft + + Zombieförstärkningar - - Skydd + + Hästars hoppstyrka + + + Vid användning: + + + Knuffmotstånd + + + Varelserevir + + + Maximal hälsa + + + Silkesvante + + + Effektivitet + + + Vattuman + + + Rikedom + + + Plundring + + + Oförstörbar Eldskydd + + Skydd + + + Eldkraft + Fallskydd - - Explosionsskydd + + Andning Projektilskydd - - Andning - - - Vattuman + + Explosionsskydd - - Effektivitet + + IV - - Silkesvante + + V - - Oförstörbar + + VI - - Plundring + + Slag - - Rikedom + + VII - - Kraft + + III Flamma - - Slag + + Kraft Oändlig - - I - - - II - - - III + + II - - IV + + I - - V + + Aktiveras när en varelse vidrör den anslutna snubbeltråden. - - VI + + Aktiverar en ansluten snubbeltrådskrok när en varelse vidrör tråden. - - VII + + Ett kompakt sätt att förvara smaragder. - - VIII + + Fungerar som kistor, med skillnaden att saker som placeras i enderkistor blir tillgängliga i alla spelarens enderkistor, oavsett vilken dimension de står i. IX - - X + + VIII Kan brytas med en järnhacka eller bättre för att få smaragder. - - Fungerar som kistor, med skillnaden att saker som placeras i enderkistor blir tillgängliga i alla spelarens enderkistor, oavsett vilken dimension de står i. - - - Aktiveras när en varelse vidrör den anslutna snubbeltråden. + + X - - Aktiverar en ansluten snubbeltrådskrok när en varelse vidrör tråden. + + Återställer 2{*ICON_SHANK_01*} och kan göras om till en gyllene morot. Kan planteras på åkermark. - - Ett kompakt sätt att förvara smaragder. + + Används som dekoration. Blommor, skott, kaktusar och svampar kan planteras i den. En vägg gjord av kullersten. - - Kan användas för att reparera vapen, verktyg och rustningsdelar. + + Återställer 0,5{*ICON_SHANK_01*}, eller så kan den bakas i en ugn. Kan planteras i åkermark. Smälts i en ugn för att producera nederkvarts. - - Används som dekoration. + + Kan användas för att reparera vapen, verktyg och rustningsdelar. Kan användas vid byteshandel med bybor. - - Används som dekoration. Blommor, skott, kaktusar och svampar kan planteras i den. + + Används som dekoration. - - Återställer 2{*ICON_SHANK_01*} och kan göras om till en gyllene morot. Kan planteras på åkermark. + + Återställer 4{*ICON_SHANK_01*}. - - Återställer 0,5{*ICON_SHANK_01*}, eller så kan den bakas i en ugn. Kan planteras i åkermark. + + Återställer 1{*ICON_SHANK_01*}. Du riskerar att bli förgiftad om du äter den. + + + Används för att kontrollera en sadlad gris när du rider på den. Återställer 3{*ICON_SHANK_01*}. Skapad genom att baka en potatis i en ugn. - - Återställer 1{*ICON_SHANK_01*}, eller så kan den bakas i en ugn. Kan planteras i åkermark. Du riskerar att bli förgiftad om du äter den. - Återställer 3{*ICON_SHANK_01*}. Tillverkas med en morot och guldtackor. - - Används för att kontrollera en sadlad gris när du rider på den. - - - Återställer 4{*ICON_SHANK_01*}. - Används med städ för att förtrolla vapen, verktyg och rustningsdelar. Tillverkas genom att bryta nederkvartsmalm. Kan bearbetas till kvartsblock. + + Potatis + + + Bakad potatis + + + Morot + Tillverkas av ull. Används som dekoration. @@ -5532,14 +6523,11 @@ Vill du installera kombinations- eller texturpaketet nu? Blomkruka - - Morot - - - Potatis + + Pumpapaj - - Bakad potatis + + Förtrollad bok Giftig potatis @@ -5550,11 +6538,11 @@ Vill du installera kombinations- eller texturpaketet nu? Morot på en pinne - - Pumpapaj + + Snubbeltrådskrok - - Förtrollad bok + + Snubbeltråd Nederkvarts @@ -5565,11 +6553,8 @@ Vill du installera kombinations- eller texturpaketet nu? Enderkista - - Snubbeltrådskrok - - - Snubbeltråd + + Mossig kullerstensvägg Smaragdblock @@ -5577,8 +6562,8 @@ Vill du installera kombinations- eller texturpaketet nu? Kullerstensvägg - - Mossig kullerstensvägg + + Potatisar Blomkruka @@ -5586,8 +6571,8 @@ Vill du installera kombinations- eller texturpaketet nu? Morötter - - Potatisar + + Lite skadat städ Städ @@ -5595,8 +6580,8 @@ Vill du installera kombinations- eller texturpaketet nu? Städ - - Lite skadat städ + + Kvartsblock Väldigt skadat städ @@ -5604,8 +6589,8 @@ Vill du installera kombinations- eller texturpaketet nu? Nederkvartsmalm - - Kvartsblock + + Kvartstrappor Mejslat kvartsblock @@ -5613,8 +6598,8 @@ Vill du installera kombinations- eller texturpaketet nu? Pelarkvartsblock - - Kvartstrappor + + Röd matta Matta @@ -5622,8 +6607,8 @@ Vill du installera kombinations- eller texturpaketet nu? Svart matta - - Röd matta + + Blå matta Grön matta @@ -5631,9 +6616,6 @@ Vill du installera kombinations- eller texturpaketet nu? Brun matta - - Blå matta - Lila matta @@ -5646,18 +6628,18 @@ Vill du installera kombinations- eller texturpaketet nu? Grå matta - - Rosa matta - Limegrön matta - - Gul matta + + Rosa matta Ljusblå matta + + Gul matta + Magentafärgad matta @@ -5670,89 +6652,84 @@ Vill du installera kombinations- eller texturpaketet nu? Mejslad sandsten - - Slät sandsten - {*PLAYER*} dödades av att försöka skada {*SOURCE*} + + Slät sandsten + {*PLAYER*} mosades av ett fallande städ. {*PLAYER*} mosades av ett fallande block. - - Teleporterade {*PLAYER*} till {*DESTINATION*} - {*PLAYER*} teleporterade dig till sin position - - {*PLAYER*} teleporterade sig till dig + + Teleporterade {*PLAYER*} till {*DESTINATION*} Törn - - Kvartsplatta + + {*PLAYER*} teleporterade sig till dig Låter dig se tydligt i mörka områden, även under vattnet. + + Kvartsplatta + Gör påverkade spelare, djur och monster osynliga. Reparera och döp - - Förtrollningskostnad: %d - För dyr! - - Döp om + + Förtrollningskostnad: %d Du har: - - Krävs för byteshandel: + + Döp om {*VILLAGER_TYPE*} erbjuder %s - - Reparera + + Krävs för byteshandel: Byteshandla - - Färga halsband + + Reparera Det här är städets gränssnitt. Här kan du döpa om, reparera och förtrolla vapen och verktyg i utbyte mot erfarenhetsnivåer. - - - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om städets gränssnitt.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder städets gränssnitt. - + + Färga halsband Börja bearbeta ett föremål genom att placera det på den första platsen. - + - När rätt slags råmaterial placeras på den andra platsen (exempelvis järntackor för ett skadat järnsvärd) kommer den föreslagna reparationen att dyka upp på resultatplatsen. + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om städets gränssnitt.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder städets gränssnitt. @@ -5760,9 +6737,9 @@ Vill du installera kombinations- eller texturpaketet nu? Det går även att placera ett identiskt föremål på den andra platsen för att kombinera de två föremålen. - + - Du kan förtrolla föremål på städet genom att placera en förtrollad bok på den andra platsen. + När rätt slags råmaterial placeras på den andra platsen (exempelvis järntackor för ett skadat järnsvärd) kommer den föreslagna reparationen att dyka upp på resultatplatsen. @@ -5770,9 +6747,9 @@ Vill du installera kombinations- eller texturpaketet nu? Antalet erfarenhetsnivåer som arbetet kommer att kosta visas under resultatet. Om du inte har tillräckligt med erfarenhetsnivåer kan reparationen inte utföras. - + - Det går att döpa om föremålet genom att redigera namnet som visas i textrutan. + Du kan förtrolla föremål på städet genom att placera en förtrollad bok på den andra platsen. @@ -5780,9 +6757,9 @@ Vill du installera kombinations- eller texturpaketet nu? När du plockar upp det reparerade föremålet förbrukas båda föremålen på städet och din erfarenhetsnivå sänks med det indikerade antalet nivåer. - + - I det här området finns ett städ och en kista med verktyg och vapen att bearbeta. + Det går att döpa om föremålet genom att redigera namnet som visas i textrutan. @@ -5792,9 +6769,9 @@ Vill du installera kombinations- eller texturpaketet nu? Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder städet. - + - Med hjälp av ett städ kan vapen och verktyg repareras, döpas om eller förtrollas med förtrollade böcker. + I det här området finns ett städ och en kista med verktyg och vapen att bearbeta. @@ -5802,9 +6779,9 @@ Vill du installera kombinations- eller texturpaketet nu? Förtrollade böcker kan hittas i kistor i grottor. De kan även tillverkas genom att förtrolla vanliga böcker med ett förtrollningsbord. - + - Det kostar erfarenhetsnivåer att använda städet, och varje gång det används finns risken att det skadas. + Med hjälp av ett städ kan vapen och verktyg repareras, döpas om eller förtrollas med förtrollade böcker. @@ -5812,9 +6789,9 @@ Vill du installera kombinations- eller texturpaketet nu? Sorten av arbete, föremålets värde, antalet förtrollningar och mängden tidigare arbete påverkar reparationskostnaden. - + - Att döpa om ett föremål ändrar namnet som visas för alla spelare och sänker avgiften för tidigare arbete permanent. + Det kostar erfarenhetsnivåer att använda städet, och varje gång det används finns risken att det skadas. @@ -5822,9 +6799,9 @@ Vill du installera kombinations- eller texturpaketet nu? Kistan i det här området innehåller skadade hackor, råmaterial, förtrollningsflaskor och förtrollade böcker att experimentera med. - + - Det här är gränssnittet för byteshandel. Det använder du för att byteshandla med bybor. + Att döpa om ett föremål ändrar namnet som visas för alla spelare och sänker avgiften för tidigare arbete permanent. @@ -5834,9 +6811,9 @@ Vill du installera kombinations- eller texturpaketet nu? Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man använder gränssnittet för byteshandel. - + - Alla byten som en bybo är villig att göra visas högst upp. + Det här är gränssnittet för byteshandel. Det använder du för att byteshandla med bybor. @@ -5844,9 +6821,9 @@ Vill du installera kombinations- eller texturpaketet nu? Byten markeras i rött och är otillgängliga om du inte har sakerna som krävs. - + - De två rutorna på vänster sida visar hur många och vilka sorters saker du ger till bybon. + Alla byten som en bybo är villig att göra visas högst upp. @@ -5854,9 +6831,9 @@ Vill du installera kombinations- eller texturpaketet nu? De två rutorna på vänster sida visar hur många saker som krävs för att utföra bytet. - + - Tryck på{*CONTROLLER_VK_A*} för att byta de saker som bybon kräver mot det som erbjuds. + De två rutorna på vänster sida visar hur många och vilka sorters saker du ger till bybon. @@ -5864,11 +6841,9 @@ Vill du installera kombinations- eller texturpaketet nu? I det här området finns en bybo och en kista med papper att köpa saker för. - + - {*B*} - Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om byteshandel.{*B*} - Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man byteshandlar. + Tryck på{*CONTROLLER_VK_A*} för att byta de saker som bybon kräver mot det som erbjuds. @@ -5876,14 +6851,21 @@ Vill du installera kombinations- eller texturpaketet nu? Spelare kan byta saker ur inventariet med bybor. - + - Bybornas yrke avgör vilka saker de vill byteshandla. + {*B*} + Tryck på{*CONTROLLER_VK_A*} för att lära dig mer om byteshandel.{*B*} + Tryck på{*CONTROLLER_VK_B*} om du redan vet hur man byteshandlar. Genom att utföra diverse byten kommer bybons möjliga byten att uppdateras slumpmässigt. + + + + + Bybornas yrke avgör vilka saker de vill byteshandla. @@ -6045,7 +7027,4 @@ Alla enderkistor i en värld är kopplade till varandra. Saker som placeras i en Läk - - Söker frö till världsgeneratorn - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsPlatformSpecific.xml index 02314bca..2521dca2 100644 --- a/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/sv-SV/stringsPlatformSpecific.xml @@ -1,240 +1,245 @@  - - NOT USED + + Vill du logga in på "PSN"? - - Du kan använda PlayStation®Vita-systemets pekskärm för att navigera i menyer! + + Välj det här alternativet för att sparka en spelaren från spelet som inte spelar på samma PlayStation®Vita-system som värden. Alla andra spelare som spelar på det PlayStation®Vita-systemet kommer också att sparkas. De kan inte återansluta till spelet tills det har startats om. - - minecraftforum har en sektion som bara riktar in sig på PlayStation®Vita Edition. + + SELECT - - Du får den senaste informationen om det här spelet från @4JStudios och @Kappische på Twitter! + + Det här alternativet stänger av trophies och rankningslistor för den aktuella världen medan du spelar, och om du laddar världen igen efter att ha sparat med det här alternativet aktiverat. - - Titta aldrig en enderman i ögonen! + + PlayStation®Vita-system - - Vi tror att 4J Studios har tagit bort Herobrine från PlayStation®Vita-systemets version av spelet, men vi är inte säkra. + + Välj ad hoc-nätverk för att ansluta till andra PlayStation®Vita-system i närheten, eller "PSN" för att ansluta till vänner från hela världen. - - Minecraft: PlayStation®Vita Edition har slagit många rekord! + + Ad hoc-nätverk - - {*T3*}INSTRUKTIONER: FLERA SPELARE{*ETW*}{*B*}{*B*} -Minecraft till PlayStation®Vita-systemet är öppet för flera spelare när standardinställningarna används.{*B*}{*B*} -När du startar eller ansluter till ett onlinespel kan alla vänner på din vänlista se det (såvida du inte valde "Endast inbjudan" när du skapade spelet). Om de ansluter till spelet kan alla vänner på deras vänlista se spelet (om du har valt "Tillåt vänners vänner").{*B*} -När du befinner dig i spelet kan du trycka på SELECT-knappen för att öppna en lista med alla spelare som är anslutna till ditt spel. Därifrån kan du sparka dem från spelet. + + Byt nätverksläge - - {*T3*}INSTRUKTIONER: DELA SKÄRMBILDER{*ETW*}{*B*}{*B*} -Du kan spara skärmbilder från spelets pausmeny. Tryck på{*CONTROLLER_VK_Y*} för att dela dem på Facebook. Du visas en miniatyr av skärmbilden och kan redigera texten som hör till Facebookinlägget.{*B*}{*B*} -Det finns ett speciellt kameraläge för att ta skärmbilder som låter dig se din spelfigur framifrån när du tar bilden. Tryck på{*CONTROLLER_ACTION_CAMERA*} till dess att du ser spelfiguren framifrån innan du trycker på{*CONTROLLER_VK_Y*} för att dela bilden.{*B*}{*B*} -Online-ID:n visas inte på skärmbilder. + + Välj nätverksläge - - {*T3*}INSTRUKTIONER: KREATIVA LÄGET{*ETW*}{*B*}{*B*} -Det kreativa lägets gränssnitt låter dig lägga vad du vill i spelarens inventarie utan att först behöva bryta eller tillverka saken. -Sakerna i spelarens inventarie tar inte slut när de placeras eller används i världen. Det låter spelaren fokusera på att bygga i stället för att behöva samla resurser.{*B*} -Om du skapar, laddar eller sparar en värld i det kreativa läget kommer den världen inte att ha något stöd för trophies eller rankningslistor, inte ens om den senare laddas i överlevnadsläget.{*B*} -Tryck på{*CONTROLLER_ACTION_JUMP*} två gånger för att flyga i det kreativa läget. Gör om det för att sluta flyga. Flyg snabbare genom att snabbt trycka framåt två gånger med{*CONTROLLER_ACTION_MOVE*} medan du flyger. -När du flyger kan du hålla in {*CONTROLLER_ACTION_JUMP*} för att flyga uppåt och{*CONTROLLER_ACTION_SNEAK*} för att flyga nedåt. Det går även att använda{*CONTROLLER_ACTION_DPAD_UP*} för att förflytta dig uppåt, {*CONTROLLER_ACTION_DPAD_DOWN*} för att förflytta dig nedåt, -{*CONTROLLER_ACTION_DPAD_LEFT*} för att förflytta dig åt vänster och{*CONTROLLER_ACTION_DPAD_RIGHT*} för att förflytta dig åt höger. + + Online-ID:n vid delad skärm - - Tryck snabbt på{*CONTROLLER_ACTION_JUMP*} två gånger för att flyga. Gör om det för att sluta flyga. Flyg snabbare genom att snabbt trycka framåt två gånger med{*CONTROLLER_ACTION_MOVE*} medan du flyger. -När du flyger kan du hålla in {*CONTROLLER_ACTION_JUMP*} för att flyga uppåt och{*CONTROLLER_ACTION_SNEAK*} för att flyga nedåt. Det går även att använda riktningsknapparna för att förflytta dig uppåt, nedåt, åt vänster och åt höger. + + Trophies - - ANVÄNDS INTE + + Det här spelet sparar nivåer automatiskt. När ikonen ovanför visas så sparar spelet dina data. +Stäng inte av PlayStation®Vita-systemet när den här ikonen visas på skärmen. - - ANVÄNDS INTE + + När det här alternativet är aktiverat kan värden använda spelets meny för att ge sig själv förmågan att flyga, stänga av sin utmattning och göra sig osynlig. Avaktiverar trophies och rankningslistor. - - "ANVÄNDS INTE" + + Online-ID:n - - "ANVÄNDS INTE" + + Du använder demoversionen av ett texturpaket. Du kommer åt allt innehåll i paketet, men du kan inte spara dina framsteg. Om du försöker spara medan du använder demoversionen kommer du att bli tillfrågad om du vill köpa fullversionen. + - - Bjud in vänner + + Patch 1.04 (Titeluppdatering 14) - - Om du skapar, laddar eller sparar en värld i det kreativa läget, kommer trophies och rankningslistor att avaktiveras för den världen. Det gäller även om världen senare laddas i överlevnadsläget. Vill du fortsätta? + + Online-ID:n i spelet - - Den här världen har sparats i det kreativa läget. Trophies och rankningslistor är avaktiverade. Vill du fortsätta? + + Titta vad jag har gjort i Minecraft: PlayStation®Vita Edition! - - Den här världen har sparats i det kreativa läget. Trophies och rankningslistor är avaktiverade. + + Nedladdningen misslyckades. Försök igen senare. - - Om du skapar, laddar eller sparar en värld med "Värdprivilegier" aktiverade, kommer trophies och rankningslistor att avaktiveras för den världen. Det gäller även om världen senare laddas med det alternativet avstängt. Vill du fortsätta? + + Kunde inte gå med i spelet på grund av restriktiv NAT-typ. Kontrollera dina nätverksinställningar. - - Anslutningen till "PSN" tappades. Avslutar till huvudmenyn. + + Uppladdningen misslyckades. Försök igen senare. - - Anslutningen till "PSN" tappades. + + Nedladdningen slutfördes! - - Det här är demoversionen av Minecraft: PlayStation®Vita Edition. Om du hade haft fullversionen skulle du ha låst upp en trophy nu! -Lås upp fullversionen för att uppleva det riktiga Minecraft: PlayStation®Vita Edition och för att spela med dina vänner runtom i världen via "PSN". -Vill du låsa upp fullversionen? + + +Det finns ingen sparfil tillgänglig i överföringsutrymmet just nu. +Du kan ladda upp en sparad värld till överföringsutrymmet genom att använda Minecraft: PlayStation®3 Edition, och sedan ladda ned den med Minecraft: PlayStation®Vita Edition. + - - Det här är demoversionen av Minecraft: PlayStation®Vita Edition. Om du hade haft fullversionen skulle du ha låst upp ett tema nu! -Lås upp fullversionen för att uppleva det riktiga Minecraft: PlayStation®Vita Edition och för att spela med dina vänner runtom i världen via "PSN". -Vill du låsa upp fullversionen? + + Kunde inte spara - - Det här är demoversionen av Minecraft: PlayStation®Vita Edition. Du behöver fullversionen för att acceptera den här inbjudan. -Vill du låsa upp fullversionen? + + Minecraft: PlayStation®Vita Edition har slut på utrymme för sparfiler. Ta bort andra Minecraft: PlayStation®Vita Edition-sparfiler för att frigöra utrymme. - - Gästspelare kan inte låsa upp fullversionen. Logga in med ett Sony Entertainment Network-konto. + + Uppladdning avbruten - - Online-ID + + Du har avbrutit uppladdningen av den här sparfilen till överföringsutrymmet för sparfiler. - - Bryggning + + Ladda upp sparfil till PS3™/PS4™ - - Du loggades ut från "PSN" och återvände därför till titelskärmen. + + Laddar upp data: %d%% - - Du har spelat den maximalt tillåtna tiden av demoversionen av Minecraft: PlayStation®Vita Edition! Vill du låsa upp fullversionen och fortsätta spela? + + "PSN" - - Minecraft: PlayStation®Vita Edition kunde inte laddas och kan inte fortsätta. + + Ladda ned PS3™-sparfil - - Kunde inte ansluta till spelet. En eller flera spelare kan inte spela online på grund av deras Sony Entertainment Network-kontons chattrestriktioner. + + Laddar ned data: %d%% - - Kunde inte skapa ett onlinespel. En eller flera spelare kan inte spela online på grund av deras Sony Entertainment Network-kontons chattrestriktioner. Avmarkera "Onlinespel" under "Fler alternativ" för att starta ett offlinespel. + + Sparar - - Du kan inte ansluta till den här spelsessionen. Onlinespel är avstängt för ditt Sony Entertainment Network-konto på grund av chattrestriktioner. + + Uppladdningen slutfördes! - - Du kan inte ansluta till den här spelsessionen. En av dina lokala spelare kan inte spela online på grund av att dennes Sony Entertainment Network-konto har chattrestriktioner. Avmarkera "Onlinespel" under "Fler alternativ" för att starta ett offlinespel. + + Vill du ladda upp den här sparfilen och skriva över en eventuell befintlig sparfil som finns i överföringsutrymmet för sparfiler? - - Du kan inte skapa den här spelsessionen. En av dina lokala spelare kan inte spela online på grund av att dennes Sony Entertainment Network-konto har chattrestriktioner. Avmarkera "Onlinespel" under "Fler alternativ" för att starta ett offlinespel. + + Konverterar data - - Det här spelet sparar nivåer automatiskt. När ikonen ovanför visas så sparar spelet dina data. -Stäng inte av PlayStation®Vita-systemet när den här ikonen visas på skärmen. + + ANVÄNDS INTE - - När det här alternativet är aktiverat kan värden använda spelets meny för att ge sig själv förmågan att flyga, stänga av sin utmattning och göra sig osynlig. Avaktiverar trophies och rankningslistor. + + ANVÄNDS INTE - - Online-ID:n vid delad skärm + + {*T3*}INSTRUKTIONER: KREATIVA LÄGET{*ETW*}{*B*}{*B*} +Det kreativa lägets gränssnitt låter dig lägga vad du vill i spelarens inventarie utan att först behöva bryta eller tillverka saken. +Sakerna i spelarens inventarie tar inte slut när de placeras eller används i världen. Det låter spelaren fokusera på att bygga i stället för att behöva samla resurser.{*B*} +Om du skapar, laddar eller sparar en värld i det kreativa läget kommer den världen inte att ha något stöd för trophies eller rankningslistor, inte ens om den senare laddas i överlevnadsläget.{*B*} +Tryck på{*CONTROLLER_ACTION_JUMP*} två gånger för att flyga i det kreativa läget. Gör om det för att sluta flyga. Flyg snabbare genom att snabbt trycka framåt två gånger med{*CONTROLLER_ACTION_MOVE*} medan du flyger. +När du flyger kan du hålla in {*CONTROLLER_ACTION_JUMP*} för att flyga uppåt och{*CONTROLLER_ACTION_SNEAK*} för att flyga nedåt. Det går även att använda{*CONTROLLER_ACTION_DPAD_UP*} för att förflytta dig uppåt, {*CONTROLLER_ACTION_DPAD_DOWN*} för att förflytta dig nedåt, +{*CONTROLLER_ACTION_DPAD_LEFT*} för att förflytta dig åt vänster och{*CONTROLLER_ACTION_DPAD_RIGHT*} för att förflytta dig åt höger. - - Trophies + + Tryck snabbt på{*CONTROLLER_ACTION_JUMP*} två gånger för att flyga. Gör om det för att sluta flyga. Flyg snabbare genom att snabbt trycka framåt två gånger med{*CONTROLLER_ACTION_MOVE*} medan du flyger. +När du flyger kan du hålla in {*CONTROLLER_ACTION_JUMP*} för att flyga uppåt och{*CONTROLLER_ACTION_SNEAK*} för att flyga nedåt. Det går även att använda riktningsknapparna för att förflytta dig uppåt, nedåt, åt vänster och åt höger. - - Online-ID:n + + "ANVÄNDS INTE" - - Online-ID:n i spelet + + Om du skapar, laddar eller sparar en värld i det kreativa läget, kommer trophies och rankningslistor att avaktiveras för den världen. Det gäller även om världen senare laddas i överlevnadsläget. Vill du fortsätta? - - Titta vad jag har gjort i Minecraft: PlayStation®Vita Edition! + + Den här världen har sparats i det kreativa läget. Trophies och rankningslistor är avaktiverade. Vill du fortsätta? - - Du använder demoversionen av ett texturpaket. Du kommer åt allt innehåll i paketet, men du kan inte spara dina framsteg. Om du försöker spara medan du använder demoversionen kommer du att bli tillfrågad om du vill köpa fullversionen. - + + "ANVÄNDS INTE" - - Patch 1.04 (Titeluppdatering 14) + + Bjud in vänner - - SELECT + + minecraftforum har en sektion som bara riktar in sig på PlayStation®Vita Edition. - - Det här alternativet stänger av trophies och rankningslistor för den aktuella världen medan du spelar, och om du laddar världen igen efter att ha sparat med det här alternativet aktiverat. + + Du får den senaste informationen om det här spelet från @4JStudios och @Kappische på Twitter! - - Vill du logga in på "PSN"? + + NOT USED - - Välj det här alternativet för att sparka en spelaren från spelet som inte spelar på samma PlayStation®Vita-system som värden. Alla andra spelare som spelar på det PlayStation®Vita-systemet kommer också att sparkas. De kan inte återansluta till spelet tills det har startats om. + + Du kan använda PlayStation®Vita-systemets pekskärm för att navigera i menyer! - - PlayStation®Vita-system + + Titta aldrig en enderman i ögonen! - - Byt nätverksläge + + {*T3*}INSTRUKTIONER: FLERA SPELARE{*ETW*}{*B*}{*B*} +Minecraft till PlayStation®Vita-systemet är öppet för flera spelare när standardinställningarna används.{*B*}{*B*} +När du startar eller ansluter till ett onlinespel kan alla vänner på din vänlista se det (såvida du inte valde "Endast inbjudan" när du skapade spelet). Om de ansluter till spelet kan alla vänner på deras vänlista se spelet (om du har valt "Tillåt vänners vänner").{*B*} +När du befinner dig i spelet kan du trycka på SELECT-knappen för att öppna en lista med alla spelare som är anslutna till ditt spel. Därifrån kan du sparka dem från spelet. - - Välj nätverksläge + + {*T3*}INSTRUKTIONER: DELA SKÄRMBILDER{*ETW*}{*B*}{*B*} +Du kan spara skärmbilder från spelets pausmeny. Tryck på{*CONTROLLER_VK_Y*} för att dela dem på Facebook. Du visas en miniatyr av skärmbilden och kan redigera texten som hör till Facebookinlägget.{*B*}{*B*} +Det finns ett speciellt kameraläge för att ta skärmbilder som låter dig se din spelfigur framifrån när du tar bilden. Tryck på{*CONTROLLER_ACTION_CAMERA*} till dess att du ser spelfiguren framifrån innan du trycker på{*CONTROLLER_VK_Y*} för att dela bilden.{*B*}{*B*} +Online-ID:n visas inte på skärmbilder. - - Välj ad hoc-nätverk för att ansluta till andra PlayStation®Vita-system i närheten, eller "PSN" för att ansluta till vänner från hela världen. + + Vi tror att 4J Studios har tagit bort Herobrine från PlayStation®Vita-systemets version av spelet, men vi är inte säkra. - - Ad hoc-nätverk + + Minecraft: PlayStation®Vita Edition har slagit många rekord! - - "PSN" + + Du har spelat den maximalt tillåtna tiden av demoversionen av Minecraft: PlayStation®Vita Edition! Vill du låsa upp fullversionen och fortsätta spela? - - Ladda ned PlayStation®3-system sparfil + + Minecraft: PlayStation®Vita Edition kunde inte laddas och kan inte fortsätta. - - Ladda upp sparfil till PlayStation®3/PlayStation®4-system + + Bryggning - - Uppladdning avbruten + + Du loggades ut från "PSN" och återvände därför till titelskärmen. - - Du har avbrutit uppladdningen av den här sparfilen till överföringsutrymmet för sparfiler. + + Kunde inte ansluta till spelet. En eller flera spelare kan inte spela online på grund av deras Sony Entertainment Network-kontons chattrestriktioner. - - Laddar upp data: %d%% + + Du kan inte ansluta till den här spelsessionen. En av dina lokala spelare kan inte spela online på grund av att dennes Sony Entertainment Network-konto har chattrestriktioner. Avmarkera "Onlinespel" under "Fler alternativ" för att starta ett offlinespel. - - Laddar ned data: %d%% + + Du kan inte skapa den här spelsessionen. En av dina lokala spelare kan inte spela online på grund av att dennes Sony Entertainment Network-konto har chattrestriktioner. Avmarkera "Onlinespel" under "Fler alternativ" för att starta ett offlinespel. - - Vill du ladda upp den här sparfilen och skriva över en eventuell befintlig sparfil som finns i överföringsutrymmet för sparfiler? + + Kunde inte skapa ett onlinespel. En eller flera spelare kan inte spela online på grund av deras Sony Entertainment Network-kontons chattrestriktioner. Avmarkera "Onlinespel" under "Fler alternativ" för att starta ett offlinespel. - - Konverterar data + + Du kan inte ansluta till den här spelsessionen. Onlinespel är avstängt för ditt Sony Entertainment Network-konto på grund av chattrestriktioner. - - Sparar + + Anslutningen till "PSN" tappades. Avslutar till huvudmenyn. - - Uppladdningen slutfördes! + + Anslutningen till "PSN" tappades. - - Uppladdningen misslyckades. Försök igen senare. + + Den här världen har sparats i det kreativa läget. Trophies och rankningslistor är avaktiverade. - - Nedladdningen slutfördes! + + Om du skapar, laddar eller sparar en värld med "Värdprivilegier" aktiverade, kommer trophies och rankningslistor att avaktiveras för den världen. Det gäller även om världen senare laddas med det alternativet avstängt. Vill du fortsätta? - - Nedladdningen misslyckades. Försök igen senare. + + Det här är demoversionen av Minecraft: PlayStation®Vita Edition. Om du hade haft fullversionen skulle du ha låst upp en trophy nu! +Lås upp fullversionen för att uppleva det riktiga Minecraft: PlayStation®Vita Edition och för att spela med dina vänner runtom i världen via "PSN". +Vill du låsa upp fullversionen? - - Kunde inte gå med i spelet på grund av restriktiv NAT-typ. Kontrollera dina nätverksinställningar. + + Gästspelare kan inte låsa upp fullversionen. Logga in med ett Sony Entertainment Network-konto. - - Det finns ingen sparfil tillgänglig i överföringsutrymmet just nu. Du kan ladda upp en sparad värld till överföringsutrymmet genom att använda Minecraft: PlayStation®3 Edition, och sedan ladda ned den med Minecraft: PlayStation®Vita Edition. - + + Online-ID - - Kunde inte spara + + Det här är demoversionen av Minecraft: PlayStation®Vita Edition. Om du hade haft fullversionen skulle du ha låst upp ett tema nu! +Lås upp fullversionen för att uppleva det riktiga Minecraft: PlayStation®Vita Edition och för att spela med dina vänner runtom i världen via "PSN". +Vill du låsa upp fullversionen? - - Minecraft: PlayStation®Vita Edition har slut på utrymme för sparfiler. Ta bort andra Minecraft: PlayStation®Vita Edition-sparfiler för att frigöra utrymme. + + Det här är demoversionen av Minecraft: PlayStation®Vita Edition. Du behöver fullversionen för att acceptera den här inbjudan. +Vill du låsa upp fullversionen? + + + Sparfilen i överföringsutrymmet har ett versionsnummer som inte stöds av Minecraft: PlayStation®Vita Edition än. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/4J_stringsPlatformSpecific.xml index e076f82c..baec4439 100644 --- a/Minecraft.Client/PSVitaMedia/loc/tr-TR/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/4J_stringsPlatformSpecific.xml @@ -1,48 +1,48 @@  - - Sistem belleği depolama alanınızda oyunu kaydedecek kadar boş alanı yok. - - - Ana ekrana döndün çünkü "PSN" hesabından çıktın. + + Ayarları Sony Entertainment Network hesabına kaydetme başarısız oldu. - - "PSN" hesabından çıktığın için maç sona erdi + + Sony Entertainment Network hesabı sorunu - - Şu an giriş yapılmadı. + + Sony Entertainment Network hesabına giriş yapmakta sorun çıktı. Kupanı bu sefer alamayacaksın. - - Bu oyunda "PSN" hesabına bağlı olmanı gerektiren bazı özellikler var ancak şu anda çevrimdışısın. + + Bu oyun Minecraft: PlayStation®3 Edition deneme oyunudur. Eğer tam oyuna sahip olsaydınız, bir kupa kazanacaktınız! Minecraft: PlayStation®3 Edition keyfini sürmek için tam oyunun kilidini açın ve "PSN" sayesinde dünyanın dört bir yanındaki arkadaşlarınızla oynayın. Tam sürüm oyunu açmak ister misiniz? - - Ad Hoc Ağı çevrimdışı. + + Ad Hoc Ağına Bağlan Bu oyunun Ad Hoc ağ bağlantısı gerektiren bazı özellikleri var ancak siz şu an çevrimdışısınız. - - Bu özellik "PSN" hesabına giriş yapmayı gerektiriyor. - - - "PSN" hesabına bağlan - - - Ad Hoc Ağına Bağlan + + Ad Hoc Ağı çevrimdışı. Kupa Sorunu - - Sony Entertainment Network hesabına giriş yapmakta sorun çıktı. Kupanı bu sefer alamayacaksın. + + "PSN" hesabından çıktığın için maç sona erdi - - Sony Entertainment Network hesabı sorunu + + Ana ekrana döndün çünkü "PSN" hesabından çıktın. - - Ayarları Sony Entertainment Network hesabına kaydetme başarısız oldu. + + Sistem belleği depolama alanınızda oyunu kaydedecek kadar boş alanı yok. - - Bu oyun Minecraft: PlayStation®3 Edition deneme oyunudur. Eğer tam oyuna sahip olsaydınız, bir kupa kazanacaktınız! Minecraft: PlayStation®3 Edition keyfini sürmek için tam oyunun kilidini açın ve "PSN" sayesinde dünyanın dört bir yanındaki arkadaşlarınızla oynayın. Tam sürüm oyunu açmak ister misiniz? + + Şu an giriş yapılmadı. + + + "PSN" hesabına bağlan + + + Bu özellik "PSN" hesabına giriş yapmayı gerektiriyor. + + + Bu oyunda "PSN" hesabına bağlı olmanı gerektiren bazı özellikler var ancak şu anda çevrimdışısın. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/AdditionalStrings.xml index f01c7baa..97177bfe 100644 --- a/Minecraft.Client/PSVitaMedia/loc/tr-TR/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/AdditionalStrings.xml @@ -48,6 +48,12 @@ Seçenekler dosyanız bozulmuş ve silinmesi gerekiyor. + + Seçenekler dosyasını sil + + + Seçenekler dosyasını tekrar yüklemeyi dene. + Kayıt Önbellek dosyanız bozulmuş ve silinmesi gerekiyor. @@ -75,6 +81,9 @@ Yerel oyuncularınızdan birinin ebeveyn ayarlarından dolayı Sony Entertainment Network hesabınızda çevrimiçi hizmet devre dışı bırakıldı. + + Bir oyun güncellemesinin mevcut olması nedeniyle çevrimiçi özellikler devre dışı bırakılmıştır. + Bu ürün için şu anda indirilebilir içerik teklifi bulunmamaktadır. @@ -84,7 +93,4 @@ Lütfen buyurun ve biraz Minecraft: PlayStation®Vita Edition oynayın! - - Bir oyun güncellemesinin mevcut olması nedeniyle çevrimiçi özellikler devre dışı bırakılmıştır. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/EULA.xml index dcc54f14..de762a9f 100644 --- a/Minecraft.Client/PSVitaMedia/loc/tr-TR/EULA.xml +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/EULA.xml @@ -1,7 +1,7 @@  - Minecraft: PlayStation®VITA Edition - KULLANIM KOŞULLARI + Minecraft: PlayStation®Vita Edition - KULLANIM KOŞULLARI Bu koşullar, Minecraft: PlayStation®Vita Edition ("Minecraft") ürününün kullanılması hakkındaki kuralları göstermektedir. Minecraft'ı ve topluluğumuzun üyelerini korumak adına, Minecraft'ı indirmek ve kullanmak için bazı kuralların belirlenmesi gerekmektedir. Biz de en az sizin kadar kurallardan hoşlanmıyoruz, bu yüzden bu koşulları olabildiğince kısa tutmaya çalıştık fakat Minecraft'ı satın almak, indirmek, kullanmak veya oynamak üzereyseniz bu koşullara ("Koşullar") bağlı kalacağınızı kabul ediyorsunuz. Başlamadan önce bir şeyin altını kesinlikle çizmemiz gerekiyor. Minecraft, oyuncuların bir şeyler inşa edip yıkabilmesine imkan tanıyan bir oyundur. Eğer diğer insanlarla oynuyorsanız (çok oyunculu), onlarla birlikte bir şeyler inşa edebilir ya da onların inşa ettiklerini yıkabilirsiniz. Ancak aynısını onlar da size yapabilirler. Bu yüzden, sizin istediğiniz gibi davranmayan kişilerle oynamayın. Ayrıca bazen insanlar yapmamaları gereken şeyler yaparlar. Bundan hoşlanmıyoruz ama bunu durdurmak için herkesten kibar olmalarını istemek dışında elimizden bir şey gelmiyor. Eğer birileri düzgün davranışlar sergilemiyor ve/veya Minecraft kullanım koşullarına aykırı davranıyorsa onları bize bildirmeniz adına size ve topluluktaki diğer oyunculara güveniyoruz. Bu iş için bir işaretleme / rapor etme sistemimiz var ve lütfen gereken önlemleri alabilmemiz için bu sistemi kullanmaktan çekinmeyin. Herhangi bir sorunu rapor etmek için lütfen support@mojang.com adresinden bize ulaşın ve kullanıcıya ait detaylar ve neler olduğu hakkındaki bilgileri bize gönderin. diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsGeneric.xml index f3a9ddb3..92dc7c54 100644 --- a/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsGeneric.xml @@ -1,5231 +1,6021 @@  - - Yeni bir İndirilebilir İçerik var! Ana Menüdeki Minecraft Mağazası düğmesinden ulaşabilirsin. + + Çevrimdışı oyuna geçiliyor - - Karakterinin görünümünü, Minecraft Mağazasındaki Görünüm Paketleri ile değiştirebilirsin. Mevcut paketlere bakmak için Ana Menüden 'Minecraft Mağazasını' seç. + + Kurucu oyunu kaydederken beklemede kal - - Oyunu daha aydınlık ya da karanlık yapmak için gamma ayarını değiştir. + + SON'a giriliyor - - Eğer oyun zorluğunu Huzurlu olarak ayarlarsan, sağlığın otomatik olarak dolacak ve geceleri canavarlar gelmeyecek! + + Oyuncular kaydediliyor - - Bir kurdu evcilleştirmek için ona bir kemik ver. Böylece oturmasını veya seni takip etmesini sağlayabilirsin. + + Kurucuya bağlanılıyor - - Envanter menüsündeyken, imleci menüden dışarı kaydırıp {*CONTROLLER_VK_A*} düğmesine basarak eşyaları yere bırakabilirsin. + + Arazi indiriliyor - - Geceleri bir yatakta uyumak gün doğumunu hızlandırır. Fakat çok oyunculu bir oyunda, tüm oyuncuların yataklarında aynı anda uyumaları gerekiyor. + + SON terk ediliyor - - Domuzlardan domuz pirzolası elde et ve sağlığını kazanmak için pişirip ye. + + Ev yatağın kayıp ya da engellenmiş durumda - - İneklerden deri elde et ve zırh yapmak için kullan. + + Şu an dinlenemezsin, yakınlarda canavarlar var - - Eğer boş bir kovan varsa su, lav ya da inek sütü ile doldurabilirsin! + + Bir yatakta uyuyorsun. Şafak vaktine geçilmesi için tüm oyuncuların aynı anda yataklarında uyumaları gerek. - - Toprağı ekim yapmak üzere hazırlamak için çapa kullan. + + Bu yatak dolu - - Örümcekler, sen onlara saldırmadığın sürece gündüz vakti sana saldırmazlar. + + Sadece gece uyuyabilirsin - - Toprağı veya kumu bahçıvan küreği ile kazmak, elinle kazmaktan daha kolaydır! + + %s bir yatakta uyuyor. Şafak vaktine geçilmesi için tüm oyuncuların aynı anda yataklarında uyumaları gerek. - - Pişmiş domuz pirzolası, çiğ domuz pirzolasından daha fazla sağlık verir. + + Seviye yükleniyor - - Geceleri etrafı aydınlatmak için meşale yap. Canavarlar, meşale ile aydınlatılan yerlerden uzak duracaktır. + + Sonuçlandırılıyor… - - Maden arabası ve raylar ile istediğin yere hızlıca git! + + Arazi inşa ediliyor - - Ağaç olması için birkaç fidan dik. + + Dünya simüle ediliyor - - Domuzadamlar, sen onlara saldırmadığın sürece sana saldırmazlar. + + Sıra - - Yatakta uyuyarak oyun canlanma noktanı değiştirebilir ve gündüz olmasını sağlayabilirsin. + + Seviye kaydedilmeye hazırlanıyor - - Ateş toplarını Fersiz'e geri gönder! + + Parçalar hazırlanıyor… - - Portal inşa ederek başka bir boyuta, Dip Alem'e geçebilirsin. + + Sunucu başlatılıyor - - Elindeki eşyayı yere bırakmak için {*CONTROLLER_VK_B*} düğmesine bas! + + Dip Alem terk ediliyor - - İşe uygun araç gereçler kullan! + + Yeniden canlandırılıyor - - Meşale yapmak için hiç kömür bulamıyorsan, ocak kullanarak ağaçlardan odun kömürü yapabilirsin. + + Seviye oluşturuluyor - - Dümdüz aşağı veya yukarı kazmak iyi bir fikir değildir. + + Canlanma bölgesi oluşturuluyor - - Kemik Tozu (İskelet kemiğinden üretilen), gübre olarak kullanılabilir ve ürünlerin çok hızlı bir şekilde büyümesini sağlar! + + Canlanma bölgesi yükleniyor - - Ürpertenler, sana çok yaklaşırlarsa patlarlar! + + Dip Alem'e giriliyor - - Obsidiyen, lav ile suyun birbirine temas etmesiyle oluşur. + + Aletler ve Silahlar - - Kaynak blok yok edildiği zaman lavın ortadan TAMAMEN kaybolması dakikalar alabilir. + + Gama - - Parke taşı, Fersiz ateş toplarına karşı dayanıklıdır. Bu yüzden portal savunması için kullanışlıdır. + + Oyun Duyarlılığı - - Işık kaynağı olarak kullanılabilen bloklar karı ve buzu eritir. Buna meşaleler, parıltı taşı ve Cadılar Bayramı Kabağı dahildir. + + Arabirim Duyarlılığı - - Açık havada yün kullanarak yapı inşa ederken dikkatli ol. Fırtına sırasında yıldırımlar yünü tutuşturabilir. + + Zorluk - - Sadece bir kova lav, ocak içerisinde 100 bloğu eritmek için kullanılabilir. + + Müzik - - Nota bloğu tarafından çalınan enstrüman, altındaki malzemeye bağlı olarak değişebilir. + + Ses - - Zombiler ve İskeletler, eğer suyun altındalarsa gündüzleri de hayatta kalabilirler. + + Huzurlu - - Bir kurda saldırmak, yakın çevredeki tüm kurtların sana saldırmasına sebep olur. Bu durum Zombi Domuzadamlar için de geçerlidir. + + Bu modda, oyuncu zamanla sağlığını geri kazanır ve çevrede hiç düşman bulunmaz. - - Kurtlar Dip Alem'e geçemezler. + + Bu modda, düşmanlar çevrede canlanır ancak Normal moda göre oyuncuya daha az hasar verirler. - - Kurtlar Ürpertenlere saldırmazlar. + + Bu modda, düşmanlar çevrede canlanır ve oyuncuya standart miktarda hasar verirler. - - Tavuklar, her 5 veya 10 dakikada bir yumurtlarlar. + + Kolay - - Obsidiyen, sadece elmastan bir kazma ile çıkartılabilir. + + Normal - - Ürpertenler, en kolay erişilebilen barut kaynağıdır. + + Zor - - Yan yana iki sandık koyarak tek bir geniş sandık oluşturabilirsin. + + Çıkış yapıldı - - Evcil kurtlar, sağlığını kuyruklarının pozisyonu ile gösterir. Onları iyileştirmek için etle besle. + + Zırh - - Yeşil boya elde etmek için ocakta kaktüs pişir. + + Düzenekler - - Nasıl Oynanır menülerindeki Neler Yeni kısmını okuyarak oyun hakkındaki son güncellemeleri öğrenebilirsin. + + Nakliye - - İstiflenebilir çitler oyuna eklendi! + + Silahlar - - Eğer elinde buğday varsa bazı hayvanlar seni takip edecektir. + + Gıda - - Eğer bir hayvan, herhangi bir yönde 20 bloktan fazla uzaklaşamazsa, ortadan kaybolmayacaktır. + + Yapılar - - Müzik: C418 + + Dekorasyonlar - - Notch'un Twitter'da bir milyondan fazla takipçisi bulunuyor! + + Simya - - Tüm İsveçliler sarışın değildir. Hatta Mojang'tan Jens gibi bazıları kızıldır! + + Aletler, Silahlar ve Zırhlar - - Bir gün bu oyuna bir güncelleme gelecek! + + Malzemeler - - Notch kimdir? + + İnşa Blokları - - Mojang'ın, çalışanlarından daha fazla ödülü var! + + Kızıltaş ve Nakliyat - - Bazı ünlü insanlar Minecraft oynuyor! + + Çeşitli - - deadmau5, Minecraft'ı çok seviyor! + + Kayıtlar: - - Böceklere doğrudan bakma. + + Kaydetmeden çık - - Ürpertenler, bir kodlama hatası sonucu ortaya çıktı. + + Ana menüye dönmek istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. - - Bu bir tavuk mu yoksa bir ördek mi? + + Ana menüye dönmek istediğinden emin misin? İlerlemen kaybolacak! - - Minecon'a geldin mi? + + Bu kayıt bozulmuş ya da hasar görmüş. Silmek ister misin? - - Mojang'ta hiç kimse daha önce Junkboy'un yüzünü görmedi. + + Ana menüye dönüp bütün oyuncuların oyunla bağlantısını kesmek istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. - - Bir Minecraft Viki'sinin olduğunu biliyor muydun? + + Kaydet ve çık - - Mojang'ın yeni ofisi oldukça havalı! + + Yeni Dünya Oluştur - - Minecon 2013, Orlando, Florida, ABD'de gerçekleştirildi! + + Dünyan için bir ad gir - - .party() mükemmeldi! + + Dünya üretimin için bir oluşum girişi yap - - Söylentilere her zaman yalan oldukları gözüyle bakın, doğru oldukları değil! + + Kayıtlı Dünya Yükle - - {*T3*}NASIL OYNANIR : TEMEL ÖĞELER{*ETW*}{*B*}{*B*} -Minecraft, aklınıza gelen her şeyi bloklarla inşa edebileceğiniz bir oyundur. Geceleri canavarlar ortaya çıkarlar ve onlardan korunmak için barınak inşa etmeniz gerekmektedir.{*B*}{*B*} -Etrafa bakınmak için {*CONTROLLER_ACTION_LOOK*} düğmesini kullan.{*B*}{*B*} -Etrafta dolaşmak için {*CONTROLLER_ACTION_MOVE*} çubuğunu kullan.{*B*}{*B*} -Zıplamak için {*CONTROLLER_ACTION_JUMP*} düğmesini kullan.{*B*}{*B*} -Koşmak için hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki defa ileri it. {*CONTROLLER_ACTION_MOVE*} çubuğunu iterken karakter, koşma süresi sona erene veya Yiyecek Göstergesi {*ICON_SHANK_03*} değerinden az gösterene dek koşmaya devam edecektir.{*B*}{*B*} -Çıplak elinle veya elindeki aletle kazı yapmak için {*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut. Bazı blokları kazabilmek için belirli aletlere ihtiyacın olabilir.{*B*}{*B*} -Eğer elinde bir eşya tutuyorsan, o eşyayı kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine, yere bırakmak için {*CONTROLLER_ACTION_DROP*} düğmesine bas. + + Eğitim Bölümünü Oyna - - {*T3*}NASIL OYNANIR : GÖSTERGE{*ETW*}{*B*}{*B*} -Gösterge, durumun hakkında bilgileri gösterir: sağlığın, su altındayken kalan oksijen miktarın, açlık seviyen (bunu yenilemek için bir şeyler yemelisin) ve eğer giymişsen zırhın. Eğer sağlığından biraz kaybedersen ama yiyecek çubuğunda 9 veya daha fazla {*ICON_SHANK_01*} varsa, sağlığın otomatik olarak yenilenecektir. Yiyecek tüketmek ise yiyecek çubuğunu yeniler.{*B*} -Tecrübe çubuğu da burada yer alır, üzerinde Tecrübe Seviyeni gösteren numaralar vardır ve bir sonraki Tecrübe Seviyesi için ne kadar Tecrübe Puanına ihtiyaç duyduğun da burada gösterilir. Tecrübe Puanları, yaratıkların öldükleri zaman düşürdükleri Tecrübe Kürelerinin toplanmasıyla, belirli blokların kazılmasıyla, hayvanların yetiştirilmesiyle, balıkçılıkla ve ocakta cevherlerin eritilmesiyle kazanılır.{*B*}{*B*} -Gösterge ayrıca kullanılabilir eşyaları gösterir. Elindeki eşyayı değiştirmek için {*CONTROLLER_ACTION_LEFT_SCROLL*} ve {*CONTROLLER_ACTION_RIGHT_SCROLL*} tuşlarını kullan. + + Eğitim Bölümü - - {*T3*}NASIL OYNANIR : ENVANTER{*ETW*}{*B*}{*B*} -Envanterine bakmak için {*CONTROLLER_ACTION_INVENTORY*} düğmesini kullan.{*B*}{*B*} -Bu ekran, elindeki kullanılabilir eşyaları ve taşıdığın diğer tüm eşyaları göstermektedir. Ayrıca zırhın da burada gösterilir.{*B*}{*B*} -İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} çubuğunu kullan. İmlecin ucundaki eşyayı almak için {*CONTROLLER_VK_A*} düğmesine bas. Eğer birden fazla eşya bulunuyorsa, bu eylem hepsini birden almanı sağlar. Sadece yarısını almak istiyorsan {*CONTROLLER_VK_X*} düğmesini kullan.{*B*}{*B*} -Eşyayı imleçle envanterdeki başka bir boşluğa götürerek oraya yerleştirmek için {*CONTROLLER_VK_A*} düğmesini kullan. İmlecin ucunda birden fazla eşya varsa, hepsini yerleştirmek için {*CONTROLLER_VK_A*}, sadece bir tanesini yerleştirmek için {*CONTROLLER_VK_X*} düğmesine bas.{*B*}{*B*} -Eğer bu eşya bir zırh ise, onu hızlıca envanterdeki zırh yuvasına taşımanı sağlayan bir araç ipucu gösterilecektir.{*B*}{*B*} -Deri Zırhının rengini, onu boyayarak değiştirmen mümkündür. Envanter menüsünde, imlecin ucunda boyayı tutup, boyamak istediğin şeyin üzerine getirip {*CONTROLLER_VK_X*} düğmesine basarak bu işlemi gerçekleştirebilirsin. + + Dünyanın Adını Belirle - - {*T3*}NASIL OYNANIR : SANDIK{*ETW*}{*B*}{*B*} -Bir Sandık ürettiğin zaman, onu bu dünyaya yerleştirebilir ve envanterindeki eşyaları depolamak üzere {*CONTROLLER_ACTION_USE*} düğmesine basarak kullanabilirsin.{*B*}{*B*} -Envanterin ve sandık arasında eşyaları taşımak için imlecini kullan.{*B*}{*B*} -Sandıktaki eşyalar, sen onları tekrar envanterine geçirene kadar orada saklanır. + + Hasarlı Kayıt - - {*T3*}NASIL OYNANIR : GENİŞ SANDIK{*ETW*}{*B*}{*B*} -Yan yana yerleştirilen iki sandık, tek bir Geniş Sandık oluşturur. Bu sandık çok daha fazla eşya alabilir.{*B*}{*B*} -Normal sandıkla aynı şekilde kullanılır. - + + Tamam - - {*T3*}NASIL OYNANIR : ÜRETİM{*ETW*}{*B*}{*B*} -Üretim arabiriminde, yeni eşyalar üretmek için envanterindeki eşyaları birleştirebilirsin. Üretim arabirimini açmak için {*CONTROLLER_ACTION_CRAFTING*} düğmesini kullan.{*B*}{*B*} -{*CONTROLLER_VK_LB*} tuşuyla sekmeler arasında gezin ve {*CONTROLLER_VK_RB*} tuşuyla üretimde kullanmak istediğin eşya türünü, {*CONTROLLER_MENU_NAVIGATE*} çubuğuyla da eşyayı seç.{*B*}{*B*} -Üretim alanı, yeni eşyayı üretebilmek için gereken eşyaları gösterir. Eşyayı üretmek ve envanterine koymak için {*CONTROLLER_VK_A*} düğmesine bas. - + + İptal - - {*T3*}NASIL OYNANIR : ÜRETİM MASASI{*ETW*}{*B*}{*B*} -Üretim Masası kullanarak daha büyük eşyalar üretebilirsin.{*B*}{*B*} -Masayı yerleştir ve kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*B*}{*B*} -Masa üzerinde üretim, basit üretim ile aynı şekilde çalışır ama daha geniş bir üretim alanına ve eşya yelpazesine sahip olursun. + + Minecraft Mağazası - - {*T3*}NASIL OYNANIR : OCAK{*ETW*}{*B*}{*B*} -Ocak, eşyaları ısıtarak değiştirmeni sağlar. Örneğin, ocak kullanarak demir cevherini demir külçelere dönüştürebilirsin.{*B*}{*B*} -Ocağı yerleştirip kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*B*}{*B*} -Ocağın altına bir miktar yakacak, üstüne de ısıtılacak eşyayı koymalısın. Bunları yaptıktan sonra ocak alev alacak ve çalışmaya başlayacak.{*B*}{*B*} -Eşyalar son halini aldığında, onları çıktı bölümünden alarak envanterine yerleştirebilirsin.{*B*}{*B*} -İmlecin ucundaki eşya bir bileşen ya da yakacak ise, o eşyayı hızlıca ocağa taşımanı sağlayan bir araç ipucu gösterilecektir. - + + Döndür - - {*T3*}NASIL OYNANIR : FIRLATICI{*ETW*}{*B*}{*B*} -Fırlatıcı, eşyaları fırlatmak için kullanılır. Fırlatıcıyı tetiklemek için yanına bir devre anahtarı, örneğin bir şalter yerleştirilmesi gerekmektedir.{*B*}{*B*} -Fırlatıcıyı eşya ile doldurmak için {*CONTROLLER_ACTION_USE*} düğmesine bas, sonra fırlatmak istediğin eşyaları envanterinden alarak fırlatıcıya ekle.{*B*}{*B*} -Bundan sonra devre anahtarını kullandığında, fırlatıcı eşyayı fırlatacaktır. - + + Gizle - - {*T3*}NASIL OYNANIR : İKSİR YAPIMI{*ETW*}{*B*}{*B*} -İksir yapımı için, üretim masasından üretilebilen bir Simya Standı gerekmektedir. Her iksirin yapımına, Cam Şişenin bir Kazandan veya bir su kaynağından doldurulmasıyla elde edilen bir şişe su ile başlanır.{*B*} -Simya Standının şişeler için üç yuvası bulunmaktadır, böylece aynı anda üç iksir yapılabilir. Tek bir malzeme üç şişe için de kullanılabilir, yani kaynaklarını en iyi şekilde kullanmak için aynı anda üç iksir üretmeye bak.{*B*} -Simya Standının en üstüne bir iksir malzemesi koymak, kısa bir süre sonra iksirin temelinin oluşmasını sağlar. Bunun tek başına bir etkisi yoktur ancak iksir temeliyle başka bir malzemeyi karıştırmak, iksire bir etki kazandırır.{*B*} -İksiri hazırladıktan sonra, üçüncü bir malzeme ekleyerek iksirin daha uzun ömürlü (Kızıltaş Tozuyla), daha yoğun (Parıltı Taşı Tozuyla) ya da zararlı (Mayalanmış Örümcek Gözüyle) olmasını sağlayabilirsin.{*B*} -Ayrıca herhangi bir iksire barut ekleyerek onu Fırlatılabilir İksire dönüştürebilirsin. Fırlatılabilir İksir, fırlatıldığı zaman çarptığı noktada etkisini belirli bir alana yayar.{*B*} - -İksirler için gereken temel malzemeler şunlardır:{*B*}{*B*} -* {*T2*}Dip Alem Yumrusu{*ETW*}{*B*} -* {*T2*}Örümcek Gözü{*ETW*}{*B*} -* {*T2*}Şeker{*ETW*}{*B*} -* {*T2*}Fersiz Gözyaşı{*ETW*}{*B*} -* {*T2*}Alaz Tozu{*ETW*}{*B*} -* {*T2*}Magma Özü{*ETW*}{*B*} -* {*T2*}Parıldayan Kavun{*ETW*}{*B*} -* {*T2*}Kızıltaş Tozu{*ETW*}{*B*} -* {*T2*}Parıltı Taşı Tozu{*ETW*}{*B*} -* {*T2*}Mayalanmış Örümcek Gözü{*ETW*}{*B*}{*B*} - -Yapabileceğin bütün farklı iksirleri öğrenmek için bileşenlerle çeşitli kombinasyonlar denemelisin. - - + + Tüm Yuvaları Temizle - - {*T3*}NASIL OYNANIR : EFSUN{*ETW*}{*B*}{*B*} -Tecrübe Puanları, yaratıkların öldürülmesiyle, belirli blokların kazılmasıyla veya ocakta eritilmesiyle kazanılır ve bazı araçlar, silahlar, zırhlar ve kitaplar efsunlamak için kullanılabilir.{*B*} -Bir Kılıç, Yay, Balta, Kazma, Kürek, Zırh veya Kitap, Efsun Masasında kitabın altındaki yuvaya yerleştirildiğinde, yuvanın sağındaki üç düğme bir takım efsunlar ve gereken Tecrübe Seviyelerini gösterecektir.{*B*} -Eğer bu efsunları kullanmak için yeterli Tecrübe Seviyen yoksa düğmeler kırmızı, varsa yeşil yanacaktır.{*B*}{*B*} -Uygulanan asıl efsun, gösterilen bedele bağlı olarak rastgele seçilir.{*B*}{*B*} -Eğer Efsun Masasının etrafında Kitap Rafları bulunuyorsa (maksimum 15 Kitap Rafı) ve Kitaplık ile Efsun Masasının arasında bir blokluk boşluk varsa, efsunların etkisi artacaktır ve Efsun Masasındaki kitaptan büyülü gliflerin çıktığı görülecektir.{*B*}{*B*} -Efsun masası için gereken tüm malzemeler dünyadaki köylerde halihazırda veya kazı ya da keşif yaparak bulunabilir.{*B*}{*B*} -Efsunlu Kitaplar, eşyalara efsun uygulamak üzere örste kullanılır. Bu sayede eşyalarına uygulamak istediğin efsunlar üzerinde daha fazla kontrolün olur.{*B*} + + Şu anki oyunundan ayrılıp yeni bir oyuna katılmak istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. - - {*T3*}NASIL OYNANIR : ÇİFTLİK HAYVANLARI{*ETW*}{*B*}{*B*} -Eğer hayvanlarını tek bir yerde tutmak istiyorsan, 20x20 bloktan daha ufak bir alanı çitle kapat ve hayvanlarını içine sok. Böylece geri geldiğinde hayvanların hâlâ orada olacak. - + + Bu dünyanın geçerli versiyonunu bu dünyaya ait önceki kayıtların üzerine yazmak istediğinden emin misin? - - {*T3*}NASIL OYNANIR : DAMIZLIK HAYVANLAR{*ETW*}{*B*}{*B*} -Minecraft'taki hayvanlar çoğalabilir ve kendilerine benzeyen yavrular yapabilir!{*B*} -Hayvanların yavrulamasını sağlamak için, onları 'Aşk Moduna' sokacak doğru yiyecekle beslemen gerekiyor.{*B*} -İneğe, möntara veya koyuna buğday verirsen, domuza havuç verirsen; tavuğa Buğday Tohumu veya Dip Alem Yumrusu; kurda ise herhangi bir et verirsen, yakınlarda Aşk Modunda olan aynı türden başka bir hayvan aramaya başlayacaktır.{*B*} -Aynı türdeki iki hayvan bir araya gelince, eğer Aşk Modundalarsa, birkaç saniyeliğine öpüştükten sonra ortaya bir yavru çıkacaktır. Yavru hayvan, büyüyüp gerçek boyutlarda bir hayvan olana kadar anne babasını takip eder.{*B*} -Aşk Modundaki bir hayvanın, tekrar Aşk Moduna girebilmesi için en az beş dakika beklemesi gerekmektedir.{*B*} -Her dünya için belirli bir hayvan sınırı vardır, bu yüzden çok sayıda hayvana ulaşınca hayvanların artık yavrulamazlar. + + Kaydetmeden çıkmak istediğinden emin misin? Bu dünyadaki bütün ilerlemen kaybolacak! - - {*T3*}NASIL OYNANIR : DİP ALEM PORTALI{*ETW*}{*B*}{*B*} -Dip Alem Portalı, oyuncunun Üstdünya ve Dip Alem arasında gezinebilmesini sağlar. Dip Alem, Üstdünya'da daha hızlı hareket edebilmek için kullanılabilir. Dip Alem'de gidilen 1 blok, Üstdünya'da 3 bloğa eşittir, yani Dip Alem'de inşa ettiğin bir portaldan çıkarsan, kendini giriş noktana göre üç katı uzakta bulursun.{*B*}{*B*} -Portalı inşa edebilmek için en az 10 Obsidiyen bloğu gerekmektedir. Portal 5 blok yüksekliğinde, 4 blok genişliğinde ve 1 blok derinliğinde olmalıdır. Portal Çerçevesi yapıldıktan sonra, çerçevenin içerisindeki boşluk, aktifleşebilmesi için yakılmalıdır. Bu işlem, Çakmak Taşı ve Çelik eşyası ya da Kor ile gerçekleştirilebilir.{*B*}{*B*} -Portal inşasına ait örnek resimler sağ tarafta bulunabilir. + + Oyunu Başlat - - {*T3*}NASIL OYNANIR : BÖLÜM YASAKLAMAK{*ETW*}{*B*}{*B*} -Eğer oynadığın bölümde rahatsız edici bir içerikle karşılaşırsan, o bölümü Yasaklı Bölümler listene ekleyebilirsin. -Bunu yapmak için Duraklatma menüsünü açın ve {*CONTROLLER_VK_RB*} düğmesine basarak Bölüm Yasaklamayı seçin. -İleride bu bölüme tekrar girmek isterseniz, bölümün Yasaklı Bölümler listenizde olduğuna dair bir uyarı alacaksınız ve dilerseniz bölümü listeden kaldırıp devam edebilecek ya da bölüme girmekten vazgeçebileceksiniz. + + Oyundan Çık - - {*T3*}NASIL OYNANIR: KURUCU VE OYUNCU SEÇENEKLERİ{*ETW*}{*B*}{*B*} - -{*T1*}Oyun Seçenekleri{*ETW*}{*B*} -Bir dünyayı yüklerken veya oluştururken, oyun üzerindeki hakimiyetinizi artıracak bir menüye "Daha Fazla Seçenek" düğmesine basarak ulaşabilirsin.{*B*}{*B*} - -{*T2*}Oyuncuya Karşı Oyuncu{*ETW*}{*B*} -Bu seçenek etkinleştirildiğinde, oyuncular diğer oyunculara hasar verebilir. Bu seçenek sadece Sağ Kalma Modunda etkilidir.{*B*}{*B*} - -{*T2*}Oyunculara Güven{*ETW*}{*B*} -Bu seçenek kapatılınca, oyuna katılan oyuncuların yapabileceği şeyler kısıtlanır. Kazamaz veya eşya kullanamaz, blok yerleştiremez, kapı ve düğmeleri kullanamaz, konteynerleri kullanamaz, oyunculara veya hayvanlara saldıramazlar. Bu seçeneği belli bir oyuncu üstünde oyun içi menüsünü kullanarak değiştirebilirsin.{*B*}{*B*} - -{*T2*}Ateş Yayılır{*ETW*}{*B*} -Etkinleştirildiğinde, ateş yakındaki yanıcı bloklara sıçrayabilir. Bu seçenek oyun içindeyken de değiştirilebilir.{*B*}{*B*} - -{*T2*}TNT Patlar{*ETW*}{*B*} -Etkinleştirildiğinde, TNT patlatıldığında infilak eder. Bu seçenek oyun içindeyken de değiştirilebilir.{*B*}{*B*} - -{*T2*}Kurucu Ayrıcalıkları{*ETW*}{*B*} -Etkinleştirildiğinde, oyun kurucusu uçabilir, yorgunluğu kaldırabilir ve kendisini görünmez yapabilir. Bu seçenek kupaları ve sıralama tablosu güncellemelerini iptal eder, bu seçenek açıkken kaydedilirse tekrar yüklendiğinde de bu böyle devam eder. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} - -{*T1*}Dünya Üretme Seçenekleri{*ETW*}{*B*} -Yeni bir dünya oluştururken bazı ek seçenekler vardır.{*B*}{*B*} - -{*T2*}Yapı Üret{*ETW*}{*B*} -Etkinleştirildiğinde, dünyada Köyler ve Kaleler gibi yapılar üretilir.{*B*}{*B*} - -{*T2*}Aşırı Düz Dünya{*ETW*}{*B*} -Etkinleştirildiğinde, Üstdünya ve Dip Alem'de tamamen düz bir dünya üretilir.{*B*}{*B*} - -{*T2*}Bonus Sandık{*ETW*}{*B*} -Etkinleştirildiğinde, oyuncu canlanma noktalarının yakınında faydalı eşyalar içeren bir sandık meydana gelir.{*B*}{*B*} - -{*T2*}Dip Alemi Sıfırla{*ETW*}{*B*} -Etkinleştirildiğinde, Dip Alem yeniden yaratılacaktır. Dip Alem Kalelerinin yer almadığı eski kayıtlara sahipsen, bu seçenek faydalıdır.{*B*}{*B*} - -{*T1*}Oyun İçi Seçenekleri{*ETW*}{*B*} -Oyundayken bir dizi seçeneği içeren oyun içi menüsüne {*BACK_BUTTON*} düğmesine basarak erişebilirsin.{*B*}{*B*} - -{*T2*}Oyun Kurucusu Seçenekleri{*ETW*}{*B*} -Oyun kurucu oyuncu veya denetleyici olarak atanan oyuncular "Oyun Kurucusu Seçenekleri" menüsüne ulaşabilir. Bu menüden ateşin yayılması ve TNT paylaması açılıp kapatılabilir.{*B*}{*B*} - -{*T1*}Oyuncu Seçenekleri{*ETW*}{*B*} -Bir oyuncunun ayrıcalıklarını değiştirmek için, adını seçin ve oyuncu ayrıcalıkları menüsünü açmak için {*CONTROLLER_VK_A*} düğmesine basın. Buradan aşağıdaki seçenekler kullanılabilir.{*B*}{*B*} - -{*T2*}İnşa Edebilir ve Kazabilir{*ETW*}{*B*} -Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek açıkken, oyuncu dünyayla normal bir etkileşim halindedir. Devre dışı bırakıldığında, oyuncu blok yerleştiremez veya yok edemez veya birçok eşya ve blokla etkileşime geçemez.{*B*}{*B*} - -{*T2*}Kapıları ve Düğmeleri Kullanabilir{*ETW*}{*B*} -Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu kapıları ve düğmeleri kullanamaz.{*B*}{*B*} - -{*T2*}Konteynerleri Açabilir{*ETW*}{*B*} -Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu sandıklar gibi konteynerleri açamaz.{*B*}{*B*} - -{*T2*}Oyunculara Saldırabilir{*ETW*}{*B*} -Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu diğer oyunculara hasar veremez.{*B*}{*B*} - -{*T2*}Hayvanlara Saldırabilir{*ETW*}{*B*} -Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek devre dışı iken, oyuncu hayvanlara hasar veremez.{*B*}{*B*} - -{*T2*}Denetleyici{*ETW*}{*B*} -Bu seçenek etkinken, oyuncu diğer oyuncuların ayrıcalıklarını değiştirebilir (oyun kurucusu hariç) eğer "Oyunculara Güven" kapalıysa, oyuncuları atabilir veya ateşin yayılması ve TNT patlaması seçeneklerini açıp kapatabilir.{*B*}{*B*} - -{*T2*}Oyuncuyu At{*ETW*}{*B*} -{*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} - -{*T1*}Oyun Kurucusu Seçenekleri{*ETW*}{*B*} -Eğer "Oyun Kurucusu Ayrıcalıkları" açıksa oyuncu kendisi için bazı ayrıcalıkları değiştirebilir. Bir oyuncunun ayrıcalıklarını değiştirmek için, onun adını seç ve oyuncu ayrıcalıkları menüsünü açmak için {*CONTROLLER_VK_A*} düğmesine bas. Buradan aşağıdaki seçenekleri değiştirebilirsin.{*B*}{*B*} - -{*T2*}Uçabilir{*ETW*}{*B*} -Bu seçenek açıkken, oyuncu uçabilir. Bu seçenek sadece Sağ Kalma Modunda vardır, çünkü Yaratıcılık Modunda tüm oyuncular uçabilir.{*B*}{*B*} - -{*T2*}Yorulmayı Kaldır{*ETW*}{*B*} -Bu seçenek sadece Sağ Kalma Modunu etkiler. Açıkken, fiziksel etkinlikler (yürüme/koşma/zıplama vs.) yiyecek çubuğunu azaltmaz. Ancak, oyuncu yaralanınca, yiyecek çubuğu oyuncu iyileştiği sürece azalır.{*B*}{*B*} - -{*T2*}Görünmez{*ETW*}{*B*} -Bu seçenek açıkken oyuncu diğer oyunculara görünmez olur ve hasar almaz.{*B*}{*B*} - -{*T2*}Işınlanabilir{*ETW*}{*B*} -Bu seçenek oyuncuların diğerlerini ya da kendilerini dünyadaki diğer oyunculara taşımasını sağlar. + + Oyunu Kaydet - - Sonraki Sayfa + + Kaydetmeden Çık - - Önceki Sayfa + + Katılmak için START düğmesine bas - - Temel Öğeler + + İşte bu! Minecraft'tan Steve'in bulunduğu bir oyuncu resmiyle ödüllendirildin! - - Gösterge + + İşte bu! Ürpertenin bulundugu bir oyuncu resmiyle ödüllendirildin! + - - Envanter + + Tam Oyunun Kilidini Aç - - Sandıklar + + Yanına katılmaya çalıştığın oyuncu, oyunun yeni bir sürümünü kullandığından dolayı bu oyuna katılamazsın. - - Üretim + + Yeni Dünya - - Ocak + + Ödül Kilidi Açıldı! - - Fırlatıcı + + Deneme oyununu oynuyorsun ancak oyunu kaydedebilmen için tam oyuna sahip olmalısın. +Tam oyunun kilidini şimdi açmak ister misin? - - Çiftlik Hayvanları + + Arkadaşlar - - Damızlık Hayvanlar + + Skorum - - İksir Yapımı + + Genel - - Efsun + + Lütfen bekle - - Dip Alem Portalı + + Sonuç bulunamadı - - Çok Oyunculu + + Filtre: - - Ekran Görüntüsü Paylaşmak + + Yanına katılmaya çalıştığın oyuncu, oyunun eski bir sürümünü kullandığından dolayı bu oyuna katılamazsın. - - Bölüm Yasaklamak - - - Yaratıcılık Modu + + Bağlantı kesildi - - Kurucu ve Oyuncu Seçenekleri + + Sunucuyla olan bağlantı kesildi. Ana menüye dönülüyor. - - Ticaret + + Sunucu tarafından bağlantı kesildi - - Örs + + Oyundan çıkılıyor - - Son + + Bir hata meydana geldi. Ana menüye dönülüyor. - - {*T3*}NASIL OYNANIR : SON{*ETW*}{*B*}{*B*} -Son, oyundaki boyutlardan biridir ve aktif bir Son Portalı ile ulaşılabilir. Son Portalı, Üstdünya'nın derinliklerinde yer alan bir Kalenin içinde bulunabilir.{*B*} -Son Portalını aktifleştirmek için, herhangi bir Son Portalı Çerçevesinin içine Sonveren Gözü koyman gerekir.{*B*} -Portal aktifleştirildiği zaman içine girerek Son boyutuna geçebilirsin.{*B*}{*B*} -Son boyutunda, vahşi ve güçlü bir düşman olan Sonveren Ejderha ve bir sürü Sonveren Adam ile karşılaşacaksın, bu yüzden oraya gitmeden önce iyice hazırlansan iyi edersin!{*B*}{*B*} -Ayrıca, sekiz Obsidiyen dikeninin üzerinde, Sonveren Ejderhanın kendisini iyileştirmek için kullandığı Sonveren Kristallerinden bulacaksın -yani savaştaki öncelikli amacın, bunların her birini yok etmek olmalı.{*B*} -İlk birkaç tanesi ok ile vurulabilir, ancak diğerleri Demir Çit kafeslerle korunduğu için onlara ulaşana kadar bir şeyler inşa etmen gerekiyor.{*B*}{*B*} -Bunu yaparken Sonveren Ejderha sana doğru uçarak sana saldıracak ve Sonveren asit toplarını püskürtecek!{*B*} -Eğer dikenlerin merkezindeki Yumurta Platformuna yaklaşacak olursan, Sonveren Ejderha aşağı uçarak sana saldıracak. İşte tam bu noktada ona çok fazla hasar verebilirsin!{*B*} -Sonveren Ejderha'nın asitli nefesinden kaçın ve en iyi sonuç için gözlerini hedef al. Mümkünse, seninle birlikte savaşmaları için Son boyutuna birkaç arkadaşını getir!{*B*}{*B*} -Son boyutuna geçtiğin zaman, arkadaşların haritalarında Kalelerin içindeki Son Portalının yerini görebilecekler, -böylece kolayca yardımına koşabilirler. - + + Bağlantı kurulamadı - - Koşma + + Oyundan atıldın - - Yeni Ne Var + + Kurucu oyundan çıktı. - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Değişiklikler ve Eklemeler{*ETW*}{*B*}{*B*} -- Yeni eşyalar eklendi - Zümrüt, Zümrüt Cevheri, Zümrüt Bloğu, Sonveren Sandığı, Tetikleyicili Kanca, Efsunlu Altın Elma, Örs, Çiçek Saksısı, Parke Taşı Duvar, Yosunlu Parke Taşı Duvar, Soluk Tablo, Patates, Fırında Patates, Zehirli Patates, Havuç, Altın Havuç, Havuçlu Değnek, -Bal Kabağı Keki, Gece Görüş İksiri, Görünmezlik İksiri, Dip Alem Kuvarsı, Dip Alem Kuvarsı Cevheri, Kuvars Bloğu, Kuvars Levhası, Kuvars Basamağı, Yontulmuş Kuvars Bloğu, Düz Dip Alem Kuvarsı Bloğu, Efsunlu Kitap, Halı.{*B*} -- Pürüzsüz Kum Taşı ve Yontulmuş Kum Taşı için yeni tarifler eklendi.{*B*} -- Yeni yaratık eklendi - Zombi Köylüler.{*B*} -- Yeni arazi yaratma özellikleri eklendi - Çöl Tapınakları, Çöl Köyleri, Orman Tapınakları.{*B*} -- Köylülerle takas yapma özelliği eklendi.{*B*} -- Örs arabirimi eklendi.{*B*} -- Deri zırh artık boyanabilir.{*B*} -- Kurt yakaları artık boyanabilir.{*B*} -- Havuçlu Değnek ile artık domuzlar kontrol edilebilir.{*B*} -- Bonus Sandık içeriği daha fazla eşya ile zenginleştirildi.{*B*} -- Yarım blokların ve diğer blokların yarım blok üzerindeki yerleşimi değiştirildi.{*B*} -- Yukarı aşağı basamakların ve levhaların yerleşimi değiştirildi.{*B*} -- Farklı farklı köylü meslekleri eklendi.{*B*} -- Canlandırma yumurtasından canlandırılan köylüler rastgele mesleğe sahip olacaklar.{*B*} -- Yanlamasına kütük yerleşimi eklendi.{*B*} -- Ocaklarda ahşap araçlar artık yakıt olarak kullanılabilir.{*B*} -- Buz ve Cam tabakalar ipekle efsunlaşmış araçlarla toplanabilir.{*B*} -- Ahşap Düğmeler ve Ahşap Basınç Plakaları ok ile aktive edilebilir.{*B*} -- Dip Alem yaratıkları Portallar aracılığıyla Üstdünya'da ortaya çıkabilir.{*B*} -- Ürpertenler ve Örümcekler onlara vuran son oyuncuya karşı agresif olurlar.{*B*} -- Yaratıcılık modundaki yaratıklar kısa bir süre sonra tekrar tarafsız konuma geçerler.{*B*} -- Boğulurken geri tepme kaldırıldı.{*B*} -- Zombiler tarafından kırılan kapılara verilen hasar artık gösteriliyor.{*B*} -- Buz artık Dip Alem'de de eriyor.{*B*} -- Dışarıdaki kazanlar yağmur yağınca artık doluyor.{*B*} -- Pistonların güncellenme süresi iki katına çıkartıldı.{*B*} -- Domuzlar öldürüldüğü zaman artık Eyer düşürüyor (eğer üzerinde varsa).{*B*} -- Son'daki gökyüzü rengi değiştirildi.{*B*} -- İp artık Tetikleyici mekanizmalar için yerleştirilebilir.{*B*} -- Yağmur artık yaprakların arasından da damlıyor.{*B*} -- Şalterler artık blokların alt kısmına yerleştirilebilir.{*B*} -- TNT, zorluk seviyesine bağlı olarak farklı hasar verecek.{*B*} -- Kitap tarifi değiştirildi.{*B*} -- Artık nilüfer yaprakları kayıkları değil, kayıklar nilüfer yapraklarını bozuyor.{*B*} -- Domuzlar artık daha fazla Domuz Pirzolası düşürüyor.{*B*} -- Balçıklar, Aşırı Düz dünyalarda daha az sayıda yer alacak.{*B*} -- Ürperten hasarı zorluk seviyesine göre farklılaştırıldı ve daha fazla geri tepme eklendi.{*B*} -- Sonveren Adamların çenelerini açmamaları düzeltildi.{*B*} -- Oyuncuların ışınlanması eklendi (oyun içinde {*BACK_BUTTON*} menüsünü kullanarak).{*B*} -- Uzaktaki oyuncular için uçuş, görünmezlik ve yenilmezlik içeren yeni Kurucu Seçenekleri eklendi.{*B*} -- Eğitim Dünyasına, yeni eşyaları ve özellikleri içeren yeni eğitim bölümleri eklendi.{*B*} -- Eğitim Dünyasındaki Müzik CDsi Sandıklarının yerleri değiştirildi.{*B*} + + Oyunda bulunan kimseyle arkadaş olmadığından dolayı bu oyuna katılamazsın. - - {*ETB*}Tekrar hoş geldin! Belki fark etmemiş olabilirsin ama Minecraft'ın güncellendi.{*B*}{*B*} -Sen ve arkadaşların için birçok yeni özellik bulunuyor ama aşağıya bazı önemli olanları yazdık. Oku ve sonra bu yeniliklerin tadını çıkarmaya başla!{*B*}{*B*} -{*T1*}Yeni Eşyalar{*ETB*} - Zümrüt, Zümrüt Cevheri, Zümrüt Bloğu, Sonveren Sandığı, Tetikleyicili Kanca, Efsunlu Altın Elma, Örs, Çiçek Saksısı, Parketaşı Duvar, Yosunlu Parketaşı Duvar, Soluk Tablo, Patates, Pişmiş Patates, Zehirli Patates, Havuç, Altın Havuç, Havuçlu Değnek, -Balkabağı Turtası, Gece Görüşü İksiri, Görünmezlik İksiri, Dip Alem Kuvarsı, Dip Alem Kuvars Cevheri, Kuvars Bloğu, Kuvars Levhası, Kuvars Merdiveni, Yontma Kuvars Bloğu, Sütun Dip Alem Kuvars Bloğu, Efsunlu Kitap, Halı.{*B*}{*B*} -{*T1*}Yeni Yaratıklar{*ETB*} - Zombi Köylüler.{*B*}{*B*} -{*T1*}Yeni Özellikler{*ETB*} - Köylülerle takas yap, silah ve eşyaları örsle tamir ettir veya efsunlat, Sonveren Sandıklarında eşya sakla, bir Havuçlu Değnek kullanarak bir domuzu sürerken kontrol et!{*B*}{*B*} -{*T1*}Yeni Mini Eğitimler{*ETB*} - Yeni özellikleri nasıl kullanacağını Eğitim Dünyasında öğren!{*B*}{*B*} -{*T1*}Yeni 'Easter Egg'ler{*ETB*} - Bir önceki Eğitim Dünyasında yer alan tüm Müzik CD'lerinin yerini değiştirdik. Bakalım onları tekrar bulabilecek misin!{*B*}{*B*} - + + Önceden kurucu tarafından atıldığın için bu oyuna katılamazsın. - - Ele göre daha fazla hasar verir. + + Uçmaktan dolayı oyundan atıldın - - Toprağı, çimeni, kumu, çakılı ve karı, ele göre daha hızlı bir şekilde kazmak için kullanılır. Kartopu yapmak için kürek gerekmektedir. + + Bağlanma girişimi çok uzun sürdü - - Taş blokları ve cevherleri kazmak için gereklidir. + + Sunucu dolu - - Odun blokları, ele göre daha hızlı bir şekilde kesmek için kullanılır. + + Bu modda, düşmanlar çevrede canlanır ve oyuncuya büyük miktarda hasar verirler. Ürpertenlere de dikkat et çünkü yanlarından uzaklaştığında muhtemelen patlama saldırılarını iptal etmeyecekler. - - Ekinler için hazırlamak üzere toprak ve çim blokları sürmek için kullanılır. + + Temalar - - Ahşap kapılar, kullanarak, üzerlerine vurarak veya Kızıltaş ile açılır. + + Görünüm Paketleri - - Demir kapılar sadece Kızıltaş, düğmeler veya devre anahtarları ile açılabilir. + + Arkadaşımın arkadaşına izin ver - - KULLANILMADI + + Oyuncuyu at - - KULLANILMADI + + Bu oyuncuyu oyundan atmak istediğinden emin misin? Dünyayı yeniden başlatana kadar oyuna katılamayacak. - - KULLANILMADI + + Oyuncu Resmi Paketleri - - KULLANILMADI + + Kurucunun arkadaşı olan oyuncular için kısıtlandığından dolayı bu oyuna katılamazsın. - - Giyildiği zaman giyen kişiye 1 Zırh verir. + + Bozuk İndirilebilir İçerik - - Giyildiği zaman giyen kişiye 3 Zırh verir. + + Bu indirilebilir içerik bozulmuş ve kullanılamaz durumda. Bu içeriği silip ardından Minecraft Mağazası menüsünden yeniden yüklemelisin. - - Giyildiği zaman giyen kişiye 2 Zırh verir. + + İndirilebilir içeriklerinden bazıları bozulmuş ve kullanılamaz durumda. Bu içerikleri silip ardından Minecraft Mağazası menüsünden yeniden yüklemelisin. - - Giyildiği zaman giyen kişiye 1 Zırh verir. + + Oyuna Katılınamıyor - - Giyildiği zaman giyen kişiye 2 Zırh verir. + + Seçilen - - Giyildiği zaman giyen kişiye 5 Zırh verir. + + Seçilen görünüm: - - Giyildiği zaman giyen kişiye 4 Zırh verir. + + Tam Sürümü Edin - - Giyildiği zaman giyen kişiye 1 Zırh verir. + + Kaplama Paketinin Kildini Aç - - Giyildiği zaman giyen kişiye 2 Zırh verir. + + Dünyanda bu kaplama paketini kullanmak için kilidini açmalısın. +Kilidini şimdi açmak ister misin? - - Giyildiği zaman giyen kişiye 6 Zırh verir. + + Deneme Kaplama Paketi - - Giyildiği zaman giyen kişiye 5 Zırh verir. + + Oluşum - - Giyildiği zaman giyen kişiye 2 Zırh verir. + + Görünüm Paketinin Kilidini Aç - - Giyildiği zaman giyen kişiye 2 Zırh verir. + + Seçtiğin görünümü kullanmak için bu görünüm paketinin kilidini açmalısın. +Bu görünüm paketinin kilidini şimdi açmak ister misin? + - - Giyildiği zaman giyen kişiye 5 Zırh verir. + + Kaplama paketinin deneme sürümünü kullanıyorsun. Tam sürümünün kilidini açmazsan bu dünyayı kaydedemeyeceksin. +Kaplama paketinin tam sürümünün kilidini açmak ister misin? - - Giyildiği zaman giyen kişiye 3 Zırh verir. + + Tam Sürümü İndir - - Giyildiği zaman giyen kişiye 1 Zırh verir. + + Bu dünya sende bulunmayan bir uyarlama paketi ya da kaplama paketi kullanıyor! +Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? - - Giyildiği zaman giyen kişiye 3 Zırh verir. + + Denenme Sürümünü Edin - - Giyildiği zaman giyen kişiye 8 Zırh verir. + + Kaplama Paketi Mevcut Değil - - Giyildiği zaman giyen kişiye 6 Zırh verir. + + Tam Sürümün Kilidini Aç - - Giyildiği zaman giyen kişiye 3 Zırh verir. + + Denenme Sürümünü İndir - - Bu malzemeden yapılmış araçlar üretmek için kullanılabilen, parlak bir külçe. Ocakta cevherin eritilmesiyle üretilmiştir. + + Oyun modun değiştirildi - - Külçelerin, mücevherlerin veya boyaların, yerleştirilebilir bloklara dönüştürülmesini sağlar. Pahalı bir bina bloğu veya gelişmiş bir cevher deposu olarak kullanılabilir. + + Etkinleştirildiğinde, sadece davet edilen oyuncular katılabilir. - - Bir oyuncu, bir hayvan veya bir canavar üstüne bastığı zaman bir elektrik yükü göndermesi için kullanılır. Ahşap Basınç Plakaları, üstlerine bir şey konulduğu zaman da çalışırlar. + + Etkinleştirildiğinde, Arkadaş Listendeki kişilerin arkadaşları oyuna katılabilir. - - Kompakt merdivenler yapmak için kullanılır. + + Etkinleştirildiğinde, oyuncular diğer oyunculara hasar verebilir. Sadece Sağ Kalma modunda etki eder. - - Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + Normal - - Uzun merdivenler yapmak için kullanılır. Birbirinin üstüne yerleştirilen iki levha, normal boyutta ikili levha bloğu oluşturur. + + Aşırı Düz - - Işık çıkarmak için kullanılır. Meşaleler ayrıca karı ve buzu eritir. + + Etkinleştirildiğinde, oyun çevrimiçi hale gelir. - - İnşaat malzemesi olarak kullanılır ve birçok şeyin üretiminde de kullanılabilir. Herhangi bir tip odundan üretilebilir. + + Etkinsizleştirildiğinde, oyuna katılan oyuncular yetki verilene kadar inşa edemez ya da kazamaz. - - İnşaat malzemesi olarak kullanılır. Normal kum gibi yer çekiminden etkilenmez. + + Etkinleştirildiğinde, dünyada Köy ve Kale gibi yapılar oluşturulacaktır. - - İnşaat malzemesi olarak kullanılır. + + Etkinleştirildiğinde, Üstdünya'da ve Dip Alem'de tamamen düz bir dünya oluşturulur. - - Meşale, ok, tabela, merdiven, çit üretmek amacıyla ve araçlar ile silahlar için de sap olarak kullanılır. + + Etkinleştirildiğinde, oyuncunun canlanma noktasının yakınında bazı işe yarar eşyaların bulunduğu bir sandık oluşturulur. - - Haritadaki herkes yataktaysa, gecenin herhangi bir anından zamanı gündüze çevirmek için kullanılır ve oyuncunun canlanma noktasını değiştirir. -Kullanılan yünün rengi ne olursa olsun yatak her zaman aynı renktir. + + Etkinleştirildiğinde, ateş yakındaki alev alabilen bloklara yayılabilir. - - Normal üretime göre daha fazla eşya üretebilmene imkan tanır. + + Etkinleştirildiğinde, TNT harekete geçirildiğinde patlar. - - Cevher eritmeni, odun kömürü ve cam yapmanı, balık ve pirzola pişirmeni sağlar. + + Etkinleştirildiğinde, Dip Alem dünyası yeniden oluşturulur. Dip Alem Kalelerinin olmadığı eski bir kayda sahipsen bu seçenek yararlı olacaktır. - - İçerisine blok ve eşya konulabilir. İki katı kapasiteye sahip daha geniş bir sandık oluşturmak için iki sandığı yan yana yerleştir. + + Kapalı - - Üzerinden atlanamayan bir duvar olarak kullanılır. Oyuncular, hayvanlar ve canavarlar için 1.5, diğer bloklar için 1 blok uzundur. + + Oyun Modu: Yaratıcılık - - Dikine tırmanmak için kullanılır. + + Sağ Kalma - - Kullanarak, üzerine vurarak ya da kızıltaş ile başlatılır. Normal kapı gibi işlerler ama sıra sıra bloklardan oluşurlar ve yerde düz dururlar. + + Yaratıcılık - - Senin veya diğer oyuncular tarafından yazılan metni gösterir. + + Dünyanı Yeniden Adlandır - - Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. + + Dünyanın yeni adını gir - - Patlama yaratmak için kullanılır. Yerleştirildikten sonra Çakmak taşı ve Çelik ya da elektrik yükü ile tutuşturularak başlatılır. + + Oyun Modu: Sağ Kalma - - Mantar yahnisi koymak için kullanılır. Yahni yenildiği zaman kase kaybolmaz. + + Sağ Kalma Modunda Oluşturuldu - - Su, lav ve süt koymak ve taşımak için kullanılır. + + Kaydı Yeniden Adlandır - - Su koymak ve taşımak için kullanılır. + + %d sn. sonra otomatik kaydediliyor... - - Lav koymak ve taşımak için kullanılır. + + Açık - - Süt koymak ve taşımak için kullanılır. + + Sağ Kalma Modunda Oluşturuldu - - Ateş yakmak, TNT'yi tutuşturmak ve inşa edildiği zaman portalı açmak için kullanılır. + + Bulutları Göster - - Balık yakalamak için kullanılır. + + Bu kayıtlı oyunla ne yapmak istersin? - - Güneş'in ve Ay'ın konumlarını gösterir. + + Gösterge Boyutu (Bölünmüş Ekran) - - Başlangıç noktanı gösterir. + + Bileşen - - Elindeyken keşfedilen bölgenin resmini oluşturur. Bu, yol bulmak için kullanılabilir. + + Yakacak - - Ok ile mesafeli saldırılara imkan tanır. + + Fırlatıcı - - Yay için cephane olarak kullanılır. + + Sandık - - 2.5 {*ICON_SHANK_01*} yeniler. + + Büyüle - - 1 {*ICON_SHANK_01*} yeniler. 6 defa kullanılabilir. + + Ocak - - 1 {*ICON_SHANK_01*} yeniler. + + Şu an için bu başlıkta bu türe ait bir indirilebilir içerik sunumu bulunmuyor. - - 1 {*ICON_SHANK_01*} yeniler. + + Bu kayıtlı oyunu silmek istediğinden emin misin? - - 3 {*ICON_SHANK_01*} yeniler. + + Onay bekleniyor - - 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Bunu yemek zehirlenmene neden olabilir. + + Sansürlü - - 3 {*ICON_SHANK_01*} yeniler. Çiğ tavuğun ocakta pişirilmesiyle yapılır. + + %s oyuna katıldı. - - 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. + + %s oyundan ayrıldı. - - 4 {*ICON_SHANK_01*} yeniler. Çiğ etin ocakta pişirilmesiyle yapılır. + + %s oyundan atıldı. - - 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. + + Simya Standı - - 4 {*ICON_SHANK_01*} yeniler. Çiğ domuz pirzolasının ocakta pişirilmesiyle yapılır. + + Tabela Yazısı Gir - - 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Evcilleştirmek için bir Oseloya da verilebilir. + + Tabelana bir bilgi ya da metin gir - - 2.5 {*ICON_SHANK_01*} yeniler. Ocakta çiğ balığın pişirilmesiyle yapılır. + + Başlık Gir - - 2 {*ICON_SHANK_01*} yeniler ve altından bir elma yapılabilir. + + Deneme Süresi Doldu - - 2 {*ICON_SHANK_01*} yeniler ve 4 saniye boyunca sağlık verir. Bir elmadan veya altın külçelerinden üretilir. + + Oyun dolu - - 2 {*ICON_SHANK_01*} yeniler. Bunu yemek zehirlenmene neden olabilir. + + Yer olmadığından dolayı oyuna katılım başarısız - - Kek tarifinde ve iksir yapımında malzeme olarak kullanılır. + + Mesajına bir başlık gir - - Açılıp kapatılarak elektrik yükü göndermesi için kullanılır. Tekrar basılana dek açık veya kapalı durumda bekler. + + Mesajına bir açıklama gir - - Sabit bir şekilde elektrik yükü gönderir veya bir bloğun yanına bağlandığında alıcı/verici olarak kullanılabilir. -Alt seviyelerdeki ışıklandırma için de kullanılabilir. + + Envanter - - Kızıltaş devrelerinde yineleyici, geciktirici ve/veya diyot olarak kullanılır. + + Bileşenler - - Basıldığı zaman bir elektrik yükü göndermek için kullanılır. Kapanmadan önce yaklaşık olarak bir saniye açık kalır. + + Alt Başlık Gir - - Kızıltaş yükü verildiği zaman eşyaları rastgele fırlatmak için kullanılır. + + Mesajına bir alt başlık gir - - Tetiklendiği zaman bir nota çalar. Notanın perdesini değiştirmek için ona dokun. Bunu farklı blokların üzerine yerleştirmek enstrümanı değiştirir. + + Açıklama Gir - - Maden arabalarını yönlendirmek için kullanılır. + + Şu an oynanan: - - Enerji aldığında, üzerinden geçen maden arabalarını hızlandırır. Enerji kesildiğinde ise maden arabalarının tam üzerinde durmasını sağlar. + + Bu seviyeyi yasaklanan seviye listene eklemek istediğinden emin misin? +'Tamam'ı seçtiğinde bu oyundan ayrılacaksın. - - Basınç Plakası gibi işler (enerji aldığında bir Kızıltaş sinyali gönderir) ama sadece bir maden arabası ile çalıştırılabilir. + + Yasaklanan Listesinden Çıkart - - Raylar boyunca seni, bir hayvanı veya bir canavarı taşımak için kullanılır. + + Otomatik Kayıt Arası - - Raylar boyunca mal taşımak için kullanılır. + + Yasaklanan Seviye - - İçine kömür konulduğunda raylar boyunca hareket eder ve diğer maden arabalarını iter. + + Katıldığın oyun yasaklanan seviye listende yer alıyor. +Bu oyuna katılmayı seçersen, bu seviye yasaklanan seviye listenden çıkartılacak. - - Suda, yüzmekten daha hızlı hareket edebilmek için kullanılır. + + Bu Seviye Yasaklansın Mı? - - Koyunlardan toplanır ve boyalar ile renklendirilebilir. + + Otomatik Kayıt Arası: Kapalı - - İnşaat malzemesi olarak kullanılabilir ve boyanabilir. Bu tarif tavsiye edilmez çünkü Yün, Koyunlardan kolayca elde edilebilmektedir. + + Arabirim Saydamlığı - - Siyah yün yapmak için boya olarak kullanılır. + + Seviyeyi Otomatik Kaydetmeye Hazırlanılıyor - - Yeşil yün yapmak için boya olarak kullanılır. + + Gösterge Boyutu - - Kahverengi yün yapmak için boya olarak, kurabiyede malzeme olarak veya Kakao Tohumları yetiştirmek için kullanılır. + + Dk. - - Gümüş rengi yün yapmak için boya olarak kullanılır. + + Buraya Yerleştirilemez! - - Sarı yün yapmak için boya olarak kullanılır. + + Canlanan oyuncuların ani ölümüne yol açabileceğinden dolayı seviye canlanma noktasının yakınına lav yerleştirmeye izin verilmemektedir. - - Kırmızı yün yapmak için boya olarak kullanılır. + + Favori Görünümler - - Ekinleri, ağaçları, uzun çimenleri, dev mantarları ve çiçekleri anında büyütmek için kullanılır ve boya tariflerinde yer alır. + + %s Oyunu - - Pembe yün yapmak için boya olarak kullanılır. + + Bilinmeyen kurucu oyunu - - Turuncu yün yapmak için boya olarak kullanılır. + + Misafir çıkış yaptı - - Açık yeşil yün yapmak için boya olarak kullanılır. + + Ayarları Sıfırla - - Gri yün yapmak için boya olarak kullanılır. + + Ayarlarını sıfırlayarak başlangıç değerlerine döndürmek istediğinden emin misin? - - Açık gri yün yapmak için boya olarak kullanılır. -(Not: Açık gri boya, gri boya ile kemik tozunun karıştırılmasıyla da üretilebilir. Böylece her bir mürekkep kesesinden üç yerine dört adet açık gri boya üretilebilir.) + + Yükleme Hatası - - Açık mavi yün yapmak için boya olarak kullanılır. + + Misafir bir oyuncu oyundan çıktığından dolayı bütün misafir oyuncular oyundan çıkarıldı. - - Camgöbeği yün yapmak için boya olarak kullanılır. + + Oyun oluşturulamadı - - Mor yün yapmak için boya olarak kullanılır. + + Otomatik Seçilen - - Galibarda yün yapmak için boya olarak kullanılır. + + Paketsiz: Başlangıç Görünümleri - - Mavi yün yapmak için boya olarak kullanılır. - - - Müzik CDleri çalar. + + Giriş yap - - Dayanıklı araçlar, silahlar veya zırh yapmak için bunları kullan. + + Giriş yapmadın. Bu oyunu oynamak için giriş yapman gerekiyor. Şimdi giriş yapmak istiyor musun? - - Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. + + Çok oyunculu oyuna izin verilmedi - - Kitaplar ve haritalar yapmak için kullanılır. + + İç - - Kitap rafı oluşturmak veya efsunlanarak Efsunlu Kitap yapmak için kullanılabilir. + + + Bu bölgede bir çiftlik kurulmuş. Çiftçilik sayesinde yiyecek kaynakları ve başka eşyalar edinebilirsin. + - - Efsun Masasının etrafına yerleştirildiği zaman daha güçlü efsunların yaratılmasına imkan tanır. + + + {*B*} + Çiftçilik hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Çiftçilik hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - Dekorasyon olarak kullanılır. + + Buğday, Bal Kabakları ve Kavunlar tohum ve çekirdeklerinden üretilir. Buğday tohumları Uzun Çimenleri kırarak veya buğday toplayarak elde edilir, Bal Kabağı ve Kavun çekirdekleri ise Bal Kabakları ve Kavunlardan elde edilir. - - Demir kazma veya daha iyisi ile kazılabilir ve sonra ocakta eritilerek altın külçe yapılabilir. + + Yaratıcılık envanter arabirimini açmak için {*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. - - Taş kazma veya daha iyisi ile kazılabilir ve sonra ocakta eritilerek demir külçe yapılabilir. + + Devam etmek için bu deliğin öbür tarafına git. - - Kömür toplamak için bir kazma ile kazılabilir. + + Yaratıcılık modu eğitimini tamamladın. - - Laciverttaş toplamak için taş kazma veya daha iyisi ile kazılabilir. + + Tohum ekmeden önce toprak blokları bir Çapa ile Ekim Toprağına dönüştürülmelidir. Bölgeyi aydınlık tutmak ve yakınlarda bir su kaynağı bulunması Ekim Toprağını sulamayı ve ürünlerin daha hızlı büyümesini sağlayacaktır. - - Elmas toplamak için demir kazma veya daha iyisi ile kazılabilir. + + Kaktüsler Kuma ekilmelidir ve üç blok yüksekliğinde büyüyebilirler. Aynı Şeker Kamışları gibi, en alttaki bloğu yok ederek üstteki blokları da alabilirsin.{*ICON*}81{*/ICON*} - - Kızıltaş tozu toplamak için demir kazma veya daha iyisi ile kazılabilir. + + Mantarlar az ışığın olduğu bir alana dikilmelidir, böylece ışıklandırması az olan diğer alanlara da yayılırlar.{*ICON*}39{*/ICON*} - - Parke taşı toplamak için bir kazma ile kazılabilir. + + Kemik Tozu ekinleri tam olarak büyütmek veya Mantarları Dev Mantarlar haline getirmek için kullanılabilir.{*ICON*}351:15{*/ICON*} - - Bir kürek ile toplanır. İnşaat için kullanılabilir. + + Buğday büyürken birkaç aşamadan geçer ve kararmaya başladığında hasat edilebilir.{*ICON*}59:7{*/ICON*} - - Ekilebilir ve sonunda bir ağaca dönüşür. + + Bal Kabakları ve Kavunların ekildiği yerin yanında bitki tamamen büyüdükten sonra meyvenin yetişebilmesi için boş bir blok olmalıdır. - - Bu kırılamaz. + + Şeker Kamışları, su bloklarının hemen yanındaki bir Çimen, Toprak veya Kum bloklarına dikilmelidir. Bir Şeker Kamışı bloğunu kesmek onun üstündeki tüm blokları da düşürür.{*ICON*}83{*/ICON*} - - Dokunduğu her şeyi ateşe verir. Bir kova içerisinde toplanabilir. + + Yaratıcılık modundayken, tüm eşya ve bloklardan sonsuz sayıda elinde bulunur, bir alet olmadan blokları tek tıkla yok edebilirsin, ölümsüz olur ve uçabilirsin. - - Bir kürek ile toplanır. Ocakta eritilerek cam yapılabilir. Eğer altında başka bir blok yoksa yer çekiminden etkilenmektedir. + + + Bu bölgedeki sandıkta pistonlu devreler yapmak için gereken bazı bileşenler var. Bu bölgedeki devreleri kullanmayı veya tamamlamayı dene, ya da kendi devreni yap. Eğitim alanının dışında daha fazla örnek var. + - - Bir kürek ile toplanır. Kazıldığı zaman bazen çakmak taşı üretir. Eğer altında başka bir blok yoksa yer çekiminden etkilenmektedir. + + + Bu bölgede Dip Aleme açılan bir Portal var! + - - Balta kullanılarak kesilir ve kereste haline getirilebilir veya yakacak olarak kullanılabilir. + + + {*B*} + Portallar ve Dip Alem hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Portallar ve Dip Alem hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - Kumun ocakta eritilmesiyle elde edilir. İnşaat için kullanılabilir ancak kazmaya çalışırsan kırılacaktır. + + + Kızıltaş tozu, kızıltaş cevherini Demir, Elmas veya Altından yapılma bir kazma ile kazarak elde edilir. Onu kullanarak 15 bloğa kadar malzeme taşıyabilir ve yükseklik olarak bir blok yukarı veya aşağı hareket edebilirsin. + {*ICON*}331{*/ICON*} + - - Kazma ile taştan çıkartıldı. Taştan araçlar veya ocak yapmak için kullanılabilir. + + + Kızıltaş yineleyicileri enerjinin taşınacağı mesafeyi artırmak veya devreye bir geciktirici eklemek için kullanılabilir. + {*ICON*}356{*/ICON*} + - - Ocakta kilden yapıldı. + + + Güç verildiği zaman Piston uzar ve en fazla 12 tane bloğu itebilir. Geri çekildiğinde, Yapışkan Pistonlar çoğu tipte bloktan bir tanesini beraberinde çekebilir. + {*ICON*}33{*/ICON*} + - - Bir ocakta tuğla yapmak için kullanılabilir. + + + Portallar, Obsidiyen blokların dört blok genişlik ve beş blok yükseklikte olacak şekilde bir araya getirilmesiyle yapılır. Köşe bloklarına gerek yoktur. + - - Kırıldığı zaman, ocakta pişirilerek tuğlaya dönüşen kil topları çıkartır. + + + Dip Alem, Üstdünya'da hızla yolculuk etmek için kullanılabilir, Dip Alem'de bir blok ilerlemek, Üstdünya'da 3 blok ilerlemeye denk gelir. + - - Kartoplarını saklamanın kompakt yolu. + + + Şu an Yaratıcılık modundasın. + - - Kartopu yapmak için bir kürekle kazılabilir. + + + {*B*} + Yaratıcılık modu hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Yaratıcılık modu hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - Kırıldığı zaman bazen buğday tohumu üretir. + + + Bir Dip Alem Portalı aktifleştirmek için yapının içindeki Obsidiyen blokları Çakmak Taşı ve Çelikle tutuştur. Yapı bozulur, yakında bir patlama olursa veya içinden bir sıvı akarsa Portallar kapanır. + - - Bir boya üretiminde kullanılabilir. + + + Bir Dip Alem Portalını kullanmak için içinde durun. Ekranın morlaşacak ve bir ses çıkacak. Birkaç saniye sonra başka bir boyuta ışınlanacaksın. + - - Yahni yapmak için kase ile birleştirilebilir. + + + Dip Alem, lavlarla dolu ve tehlikeli bir yerdir ama yakıldıktan sonra sürekli yanan Dip Alem Kütlesi ve ışık üreten Parıltı Taşı Tozu gibi malzemelerin toplanması için faydalı olabilir. + - - Sadece elmastan bir kazma ile çıkartılabilir. Lav ve suyun birleşimiyle ortaya çıkar ve bir portal üretmek için kullanılabilir. + + Çiftçilik eğitimini tamamladın. - - Dünyaya canavarlar çıkartır. + + Bazı aletler bazı malzemeler için daha uygundur. Ağaç gövdelerini kesmek için bir balta kullanmalısın. - - Elektrik yükü taşıması için toprağa yerleştirilir. İksirle kaynatıldığı zaman etki süresini artırır. + + Bazı aletler bazı malzemeler için daha uygundur. Taş ve cevher toplamak için bir kazma kullanmalısın. Bazı bloklardan malzeme çıkarabilmek için kazmanı daha iyi materyallerden yapman gerekebilir. - - Ekinler, tam olarak büyüyünce buğday toplamak için hasat edilebilir. + + Bazı aletler düşmanlara saldırmak için daha uygundur. Saldırmak için bir kılıç kullanmayı dene. - - Tohum ekmek için hazırlanmış toprak. + + Demir Golemler kasabaları korumak için doğal olarak ortaya çıkar ve kasabalılara saldıracak olursan sana karşılık verirler. - - Yeşil boya üretmek için ocakta pişirilebilir. + + Eğitimi tamamlayana kadar bu bölgeden çıkamazsın. - - Şeker üretmek için kullanılabilir. + + Bazı aletler bazı malzemeler için daha uygundur. Toprak ve kum gibi yumuşak malzemeleri çıkarırken bir kürek kullanmalısın. - - Miğfer olarak giyilebilir veya Cadılar Bayramı Kabağı üretmek için bir meşale ile birleştirilebilir. Ayrıca Bal Kabağı Kekinin ana malzemesidir. + + İpucu: Elinle veya tuttuğun şeyle kazmak veya kesmek için {*CONTROLLER_ACTION_ACTION*} düğmesine basılı tut. Bazı blokları kazmak için bir alet yapman gerekebilir... - - Ateşe verilirse sonsuza dek yanar. + + Nehrin yanındaki sandıkta bir tekne var. Tekneyi kullanmak için, imleci suya doğru tut ve {*CONTROLLER_ACTION_USE*} düğmesine bas. Tekneye bakarken {*CONTROLLER_ACTION_USE*} kullanarak içine gir. - - Üzerinden geçen her şeyin hareketini yavaşlatır. + + Gölcüğün yanındaki sandıkta bir balıkçı oltası var. Oltayı sandıktan al ve kullanabilmek için elindeki geçerli eşya yap. - - Portala girmek, Üstdünya ile Dip Alem arasında geçiş yapmanı sağlar. + + Bu gelişmiş piston mekanizması kendini onaran bir köprüdür! Çalıştırmak için düğmeye bas, sonra da ayrıntıları öğrenebilmek için parçaların nasıl çalıştığını izle. - - Ocakta yakacak olarak ya da meşale yapımında kullanılır. + + Kullandığın alet hasar aldı. Bir aleti her kullandığında biraz hasar alır, sonunda da kırılır. Envanterinde eşyanın altındaki renkli çubuk şu anki hasar durumunu gösterir. - - Örümcek öldürerek toplanır ve Yay ya da Olta yapımında kullanılabilir veya Tetikleyici Mekanizma yapmak için yere yerleştirilebilir. + + Yukarı yüzmek için {*CONTROLLER_ACTION_JUMP*} düğmesine basılı tut. - - Tavuk öldürerek toplanır ve ok yapımında kullanılabilir. + + Bu bölgede raylarda bir maden arabası var. Maden arabasına girmek için, imleci ona doğru tut ve {*CONTROLLER_ACTION_USE*} düğmesine bas. Düğmede {*CONTROLLER_ACTION_USE*} düğmesine basarak maden arabasını ilerlet. - - Ürperten öldürerek toplanır ve TNT yapımında ya da iksir pişirmede malzeme olarak kullanılabilir. + + Demir Golem yapmak için dört tane Demir Bloğun gösterilen düzende yerleştirilmesi ve orta bloğun üstüne de bir bal kabağı konması gerekir. Demir Golemler düşmanlarına saldırır. - - Mahsul yetiştirmek için ekim toprağına ekilebilir. Tohumların büyümesine yetecek kadar ışık olduğundan emin ol. + + İnek, möntar, domuz veya koyunlara buğday, domuzlara havuç, tavuklara Buğday Tohumu veya Dip Alem Yumrusu, kurtlara ise herhangi tür bir etten yedirirsen, yakınlarındaki aynı türden yine Aşk Modunda olan başka bir hayvanı aramaya başlarlar. - - Mahsullerden hasat edilir ve gıda eşyaları yapımında kullanılabilir. + + Aynı türden iki hayvan karşılaştığında ikisi de Aşk Modundaysa birkaç saniye öpüşürler, sonra da yavru bir hayvan doğar. Yavru hayvan büyüyene kadar bir süre ebeveynlerini takip edecektir. - - Çakıl taşı kazarak toplanır ve çakmaktaşı ile çelik yapımında kullanılabilir. + + Aşk Moduna bir kere girdikten sonra hayvan 5 dakika kadar tekrar giremeyecektir. - - Bir domuz üstünde kullanıldığında domuza binmeni sağlar. Sonrasında da domuz Havuçlu Değnek kullanılarak yönlendirilebilir. + + + Bu bölgede hayvanlar ağıla kapatılmış. Hayvanları yavrulatarak kendilerinin yavru versiyonlarından üretebilirsin. + - - Kar kazarak toplanır ve fırlatılabilir. + + + {*B*} + Hayvan üretimi hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Hayvan üretimi hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - İnek öldürerek toplanır ve zırh ya da kitap yapımında kullanılabilir. + + Hayvanları yavrulatabilmek için onlara doğru yiyecekleri yedirip 'Aşk Moduna' sokmalısın. - - Balçık öldürerek toplanır ve iksir pişirmek ya da Yapışkan Piston üretmek için kullanılabilir. + + Bazı hayvanlar, elinde onların yiyeceğini tutarsan seni takip eder. Bu sayede hayvanları üremeleri için bir araya toplamak daha kolay olur.{*ICON*}296{*/ICON*} - - Tavuklardan rastgele olarak düşer ve gıda mamülleri yapımında kullanılabilir. + + + {*B*} + Golemler hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Golemler hakkında zaten bilgin varsa {*CONTROLLER_VK_B*} düğmesine bas. + - - Parıltı Taşı kazarak toplanır ve yine Parıltı Taşı blokları yapımında veya etkiyi artırmak üzere bir iksirle pişirmek için kullanılabilir. + + Golemler bir blok yığını üzerine bal kabağı koyarak yapılır. - - İskelet öldürerek toplanır. Kemik tozu yapımında kullanılabilir. Evcilleştirmek amacıyla bir kurdu beslemek için kullanılabilir. + + Kar Golemleri iki tane üst üste konmuş Kar Bloğundan ve onların üstüne konan bir bal kabağından yapılır. Kar Golemleri düşmanlarına kartopu atar. - - Bir İskeletin, Ürperten öldürmesini sağlayarak toplanır. Müzik kutusunda çalınabilir. + + + Vahşi kurtlara kemik vererek onları evcilleştirebilirsin. Evcilleştirildikleri zaman etraflarında Aşk Kalpleri belirir. Evcil kurtlar oyuncuyu takip eder ve oturmaları emredilmediyse onu korurlar. + - - Ateşi söndürür ve mahsullerin büyümesine yardım eder. Kova ile toplanabilir. + + Hayvanlar ve hayvan üretme eğitimini tamamladın. - - Kimi zaman kırıldığında, yeniden ekilerek ağaç yetiştirmeyi sağlayan bir fidan düşebilir. + + + Bu bölgede bir Kar Golemi ve bir Demir Golem yapmak için gereken bal kabağı ve bloklar var. + - - Zindanlarda bulunur, inşa ve dekorasyon için kullanılabilir. + + + Bir enerji kaynağını nereye ve hangi yöne doğru yerleştirdiğin etrafındaki blokları nasıl etkileyeceğini belirler. Örneğin bir bloğun yanındaki bir Kızıltaş meşalesi, blok başka bir güç kaynağından enerji alıyorsa kapatılabilir. + - - Koyunun yününü kırpmak ve yaprak blokları toplamak için kullanılabilir. + + + Kazan boşalacak olursa, bir Su Kovası ile tekrar doldurabilirsin. + - - (Düğme, şalter, basınç levhası, kızıltaş meşalesi ya da kızıltaşlı başka bir eşya aracılığıyla) Enerji verildiğinde, önündeki blokları itebilecek durumdaysa piston dışarıya çıkar. + + + Simya Standını kullanarak bir Ateş Direnci İksiri üret. Bir Su Şişesi, Dip Alem Yumrusu ve Magma Özüne ihtiyacın olacak. + - - (Düğme, şalter, basınç levhası, kızıltaş meşalesi ya da kızıltaşlı başka bir eşya aracılığıyla) Enerji verildiğinde, önündeki blokları itebilecek durumdaysa piston dışarıya çıkar. Pistonun uzanan parçası geri gittiğinde beraberinde temas ettiği bloğu da çeker. + + + Elinde bir iksir varken, onu kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine basılı tut. Normal bir iksirse onu içecek ve etkilerini kazanacaksın, Fırlatılabilen bir iksirse onu atacaksın ve etkileri düştüğü yerdeki yaratıklara etki edecek. + Fırlatılabilen iksirler normal iksirlere barut eklenerek yapılabilir. + - - Taş bloklarından yapılmıştır ve genellikle Kalelerde bulunur. + + {*B*} + Simyacılık ve iksir yapımı hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Simya ve iksirler hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - Çitlere benzer şekilde engel olarak kullanılır. + + + İksir üretmenin ilk adımı bir Su Şişesi yapmaktır. Sandıktan bir Cam Şişe al. + - - Kapıya benzer ancak esasen çitlerle kullanılır. + + + İçinde su olan bir Kazandan veya bir su bloğundan bir cam şişeyi doldurabilirsin. Bir su kaynağına bakıp {*CONTROLLER_ACTION_USE*} düğmesine basarak şimdi cam şişeni doldur. + - - Kavun Dilimlerinden elde edilebilir. + + + Ateş Direnci İksirini kendinde kullan. + - - Cam Bloklarına alternatif olarak kullanılabilecek saydam bloklar. + + + Bir eşyayı efsunlamak için önce onu efsun yuvasına yerleştir. Silahlar, zırhlar ve bazı eşyalar efsunlanarak onlara hasar direnci veya bir bloğu kazarken kazanılan eşya sayısını artırma gibi özel etkiler eklenebilir. + - - Bal kabağı yetiştirmek için ekilebilir. + + + Bir eşya efsun yuvasına yerleştirildiğinde, sağdaki düğmeler değişerek rastgele efsunlardan bir kısmını gösterecektir. + - - Kavun yetiştirmek için ekilebilir. + + + Düğmedeki sayı, o efsunu eşyaya uygulamak için gereken tecrübe seviyesi değerini gösterir. Eğer seviyen yetersizse, düğme kapalı olacaktır. + - - Öldüğünde Sonveren Adamdan düşer. Fırlatıldığında oyuncuyu Sonveren İncisinin düştüğü konuma ışınlar ve sağlığının bir kısmını kaybettirir. + + + Artık ateş ve lavlara karşı dirençli olduğuna göre, önceden gidemeyeceğin bazı yerlere gidebilirsin. + - - Üzerinde çimen yetişen bir toprak bloğu. Kürek kullanılarak toplanır. İnşa için kullanılabilir. + + + Burası silah, zırh ve bazı aletlere efsun eklemek için kullanabileceğin efsunlama arabirimidir. + - - İnşa ve dekorasyon için kullanılabilir. + + {*B*} + Efsun arabirimi hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Efsun arabirimini zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - İçinden geçerken hareketi yavaşlatır. İp toplamak için makas kullanarak yok edilebilir. + + + Bu bölgede bir Simya Standı, bir Kazan ve iksir üretmek için eşyalarla dolu olan bir sandık var. + - - Yok edildiğinde bir Gümüşçün canlandırır. Ayrıca saldırıya uğrayan başka bir Gümüşçünün yakınındaysa da Gümüşçün canlandırabilir. + + + Kömür yakacak olarak kullanılabilir veya bir sopa ile birleştirilerek meşale yapılabilir. + - - Yerleştirildiğinde zamanla büyür. Makas kullanarak toplanabilir. Merdiven gibi tırmanılabilir. + + + Bileşen yuvasına kum yerleştirerek cam üretebilirsin. Sığınağına pencere eklemek için biraz cam bloğu üret. + - - Üzerinde yürürken kaydırır. Yok edildiğinde başka bir bloğun üstündeyse suya dönüşür. Bir ışık kaynağına yeterince yakınsa ya da Dip Alem'e yerleştirilirse erir. + + + Burası simya arabirimi. Burayı kullanarak çeşitli etkileri olan farklı iksirler üretebilirsin. + - - Dekorasyon olarak kullanılabilir. + + + Ahşap eşyaların birçoğu yakacak olarak kullanılabilir ama hepsi de aynı süre yanmaz. Dünyada yakacak olarak kullanılabilen başka eşyalar da keşfedebilirsin. + - - İksir yapımında ve Kalelerin yerini belirlemek için kullanılır. Dip Alem Kalelerinde ya da yakınlarında bulunma eğiliminde olan Alazlardan düşer. + + + Eşyaların ateşten çıktıktan sonra onları sonuç alanından alıp envanterine yerleştirebilirsin. Farklı bileşenlerle denemeler yaparak neler üretebileceğine bir bak. + - - İksir yapımında kullanılır. Öldüklerinde Fersizlerden düşer. + + + Bileşen olarak odun kullanırsan kömür üretebilirsin. Ocağa biraz yakacak koy, bileşen yuvasına da odun yerleştir. Ocağın kömür üretmesi biraz vakit alabilir, o yüzden başka işler yapmaktan çekinme, durumu kontrol etmek için sonra gelebilirsin. + - - Öldüklerinde Zombi Domuzadamlardan düşer. Zombi Domuzadamlar, Dip Alem'de bulunabilir. İksir pişirmek için kullanılabilir. + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Simya standını nasıl kullanacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - İksir yapımında kullanılır. Bu, Dip Alem Kalelerinde doğal şekilde yetişirken bulunabilir. Ayrıca Ruh Kumunda da yetiştirilebilir. + + + İksire, Mayalanmış Örümcek Gözü eklemek iksiri bozar ve etkilerini tersine çevirebilir, Barut eklemek ise iksiri Fırlatılabilen İksire çevirir, bu sayede atıldığı bölgede etki gösterebilir. + - - Kullanıldığında, ne üzerinde kullanıldığına bağlı olarak, çeşitli etkiler gösterebilir. + + + Dip Alem Yumrusunu bir Su Şişesine ekleyerek, ardından da Magma Özü katarak bir Ateş Direnci İksiri üret. + - - Suyla doldurulabilir ve Simya Standında iksir için başlangıç bileşeni olarak kullanılır. + + + Simya arabiriminden çıkmak için {*CONTROLLER_VK_B*} düğmesine bas. + - - Bu zehirli bir gıda ve simya eşyasıdır. Örümcek ya da Mağara Örümceği bir oyuncu tarafından öldürüldüğünde düşer. + + + Üstteki yuvaya bir bileşen, alttaki yuvalara da bir iksir veya su şişesi yerleştirerek iksir yapabilirsin (tek seferde en fazla 3 tane üretilebilir). Geçerli bir kombinasyon girildiğinde iksir yapımı başlayacak ve kısa bir süre sonra iksir üretilecek. + - - Temel olarak olumsuz etkili iksirler yapmak için iksir yapımında kullanılır. + + + Her iksir bir Su Şişesi ile başlar. Çoğu iksirin yapımı, önce bir Dip Alem Yumrusu ile Tuhaf İksir üretilmesi ile başlar. İksirin son halini alabilmesi için en az bir tane daha bileşen gerekir. + - - İksir yapımında ya da Sonveren Gözü ve Magma Özü yapmak için diğer eşyalarla birlikte kullanılır. + + + İksirlerinin etkilerini değiştirebilirsin. Kızıltaş Tozu eklemek iksir etkisinin süresini artırır, Parıltı Taşı Tozu eklemek ise etkileri daha güçlü yapabilir. + - - İksir yapımında kullanılır. + + + Bir efsun seç ve {*CONTROLLER_VK_A*} düğmesine basarak eşyayı efsunla. Eşyayı efsunlayınca tecrübe seviyen azalacak. + - - İksirler ya da Atılabilen İksirler yapmak için kullanılır. + + + Oltanı atıp balık tutmaya başlamak için {*CONTROLLER_ACTION_USE*} düğmesine bas. Tekrar {*CONTROLLER_ACTION_USE*} düğmesine basarak oltayı çek. + {*FishingRodIcon*} + - - Su kovası kullanılarak ya da yağmur yağınca suyla doldurulabilir ve ardından Cam Şişeleri suyla doldurmak için kullanılabilir. + + + Olta mantarının suyun altına batmasını bekleyip ipi çekersen bir balık yakalayabilirsin. Balıklar ham veya ocakta pişirilip yenilebilir ve sağlığı yenilerler. + {*FishIcon*} + - - Fırlatıldığında Son Portalının yönünü gösterir. Bundan on iki tanesi Son Portalı Çerçevelerine yerleştirildiğinde Son Portalı etkinleşecektir. + + + Birçok alette olduğu gibi oltaların da belirli bir kullanım miktarı vardır. Sadece balık yakalamak için kullanılacakları anlamına gelmiyor tabii. Onunla başka nelerin yakalanabileceğini veya aktifleştirebileceğini öğrenmek için deneme yap... + {*FishingRodIcon*} + - - İksir yapımında kullanılır. + + + Tekneler su üzerinde daha hızlı hareket etmeni sağlar. {*CONTROLLER_ACTION_MOVE*} ve {*CONTROLLER_ACTION_LOOK*} kullanarak yön verebilirsin. + {*BoatIcon*} + - - Çimen Bloklarına benzer ancak üzerinde mantar yetiştirmeye çok uygundur. + + + Şu an bir olta kullanıyorsun. Kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*FishingRodIcon*} + - - Suda yüzer ve üzerinde yürünebilir. + + + {*B*} + Balıkçılık hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Balıkçılığı zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - Dip Alem Kaleleri inşa etmek için kullanılır. Fersizin ateş toplarından etkilenmez. + + + Bu bir yatak. Geceleyin ona bakarken {*CONTROLLER_ACTION_USE*} düğmesine basarak geceyi uyuyarak geçir ve sabah olunca uyan.{*ICON*}355{*/ICON*} + - - Dip Alem Kalelerinde kullanılır. + + + Bu bölgede birkaç basit Kızıltaş ve Piston devreleri ve o devreleri geliştirmek için gereken eşyalarla dolu bir sandık var. + - - Dip Alem Kalelerinde bulunur ve kırıldığında Dip Alem Yumrusu düşer. + + + {*B*} + Kızıltaş devreleri ve Pistonlar hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Kızıltaş devreleri ve Pistonlar hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - Oyuncuların Tecrübe Puanlarını kullanarak Kılıçları, Kazmaları, Baltaları, Kürekleri, Yayları ve Zırhları efsunlamalarını sağlar. + + + Şalterler, Düğmeler, Basınç Plakaları ve Kızıltaş Meşaleleri devrelere, direkt olarak aktifleştirmek istediğin eşyaya bağlanarak veya Kızıltaş tozu ile bağlanarak çalıştırılabilir. + - - On iki adet Sonveren Gözü kullanılarak etkinleştirilebilir ve oyuncunun Son boyutuna gitmesini sağlar. + + + {*B*} + Yataklar hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Yataklar hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - Son Portalını oluşturmak için kullanılır. + + + Yatak, güvenli ve iyi aydınlatılmış bir yere yerleştirilmelidir, böylece canavarlar seni gece yarısında uyandıramaz. Bir yatağı kullandıktan sonra ölürsen, tekrar yatakta doğacaksın. + {*ICON*}355{*/ICON*} + - - Son'da bulunan bir blok türü. Çok yüksek bir patlama direncine sahip olduğundan inşa için kullanışlıdır. + + + Oyununda başka oyuncular varsa, uyuyabilmek için herkesin aynı anda yataklarında olmaları gerekir. + {*ICON*}355{*/ICON*} + - - Bu blok, Son'daki Ejderhanın yenilmesiyle oluşur. + + + {*B*} + Tekneler hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Tekneler hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - Fırlatıldığında, toplanarak tecrübe puanı kazandıran Tecrübe Küreleri bırakır. + + + Efsun Masası kullanarak bir bloğu kazarken daha fazla eşya toplamak; silahlar, zırhlar ve bazı aletler için artırılmış hasar direnci eklemek gibi özel etkileri eşyalara ekleyebilirsin. + - - Nesneleri tutuşturmak veya Fırlatıcıdan atılarak rastgele ateş yakmak için kullanılabilir. + + + Efsun Masasının etrafına kitaplıklar eklemek efsun gücünü artırır ve daha yüksek seviyeli efsunlara erişim sağlar. + - - Vitrine benzer ve içine yerleştirilen bloğu veya eşyayı gösterir. + + + Eşyaları efsunlamak Tecrübe Seviyesine mal olur, bunlar ise yaratıklar ve hayvanları öldürünce, cevher kazınca, hayvan yetiştirince, balık tutunca, bir ocakta döküm yapınca veya yemek pişirince çıkan Tecrübe Küreleri toplanarak elde edilebilir. + - - Fırlatıldığında, adı geçen türdeki bir yaratığı canlandırabilir. + + + Efsunlar her ne kadar rastgele olsa da, iyi efsunlardan bazıları sadece yüksek tecrübe seviyesine ve Efsun Masası etrafında gücü artıran çok sayıda kitaplıklara sahip olanlar tarafından yapılabilir. + - - Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + + Bu bölgede bir Efsun Masası ve efsunlamayı öğrenmene yardımcı olacak bazı eşyalar var. + - - Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + {*B*} + Efsunlama hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Efsunlamayı zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - Dip Alem Kütlesinin ocakta eritilmesiyle elde edilir. Dip Alem Tuğlası blokları yapımında kullanılabilir. + + + Atıldığında düştüğü yerde Tecrübe Küreleri oluşturan Efsunlu Şişe kullanarak da tecrübe seviyesi kazanabilirsin. Bu küreler daha sonra toplanabilir. + - - Enerji verildiğinde ışığı emer. + + + Maden arabası raylar üzerinde hareket eder. Ocakla çalışan ve sandığı olan bir maden arabası da yapabilirsin. + {*RailIcon*} + - - Kakao Çekirdekleri toplamak için ekilebilir. + + + Kızıltaş meşalelerinden ve devrelerden enerji alarak hızlanan raylar da üretebilirsin. Bunlar, makas, şalter ve basınç plakalarına bağlanarak daha karmaşık sistemler oluşturulabilir. + {*PoweredRailIcon*} + - - Yaratık Kafaları dekorasyon amacıyla yerleştirilebilir ya da başlık yuvasında maske olarak kullanılabilir. + + + Şu an bir tekne kullanıyorsun. Tekneden çıkmak için imleci tekneye doğrult ve {*CONTROLLER_ACTION_USE*} düğmesine bas.{*BoatIcon*} + - - Kalamar + + + Bu bölgedeki sandıklarda bazı efsunlu eşyalar bulabilirsin; Efsunlu Şişeler ve Efsun Masasında deneme yanılmayla efsunlayabileceğin bazı eşyalar var. + - - Öldürüldüğünde mürekkep keseleri bırakır. + + + Şu an bir maden arabası sürüyorsun. Maden arabasından çıkmak için, imleci ona doğrult ve {*CONTROLLER_ACTION_USE*} düğmesine bas.{*MinecartIcon*} + - - İnek + + {*B*} + Maden arabaları hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Maden arabalarını zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - Öldürüldüğünde deri bırakır. Ayrıca kovayla süt sağılabilir. + + Bir eşyayı taşırken imleci arabirimin dışına götürürsen o eşyayı bırakabilirsin. - - Koyun + + Oku - - Kırpıldığında (şayet önceden kırpılmamışsa) yün bırakır. Yününün farklı bir renk olması için boyanabilir. + + Tutun - - Tavuk + + Fırlat - - Öldürüldüğünde tüy bırakır ve ayrıca rasgele olarak yumurtlar. + + - - Domuz + + Ses Perdesini Değiştir - - Öldürüldüğünde domuz pirzolası bırakır. Eyer kullanılarak binilebilir. + + Patlat - - Kurt + + Ek - - Uysaldır ancak saldırıya uğradığında karşılık verir. Kemik kullanılarak evcilleştirilebilir; böylelikle kurt gittiğin yerlere peşinden gelir ve saldırdığın her şeye o da saldırır. + + Tam Oyunun Kilidini Aç - - Ürperten + + Kaydı Sil - - Çok yaklaşırsan patlar! + + Sil - - İskelet + + Toprağı Sür - - Sana ok atar. Öldürüldüğünde oklar bırakır. + + Hasat Et - - Örümcek + + Devam Et - - Yakınında olduğunda saldırır. Duvarlara tırmanabilir. Öldürüldüğünde ip bırakır. + + Yukarı Yüz - - Zombi + + Vur - - Yakınında olduğunda saldırır. + + Süt Sağ - - Zombi Domuzadam + + Topla - - Başlangıçta uysaldır ancak birine saldırırsan grup olarak saldırırlar. + + Boşalt - - Fersiz + + Eyerle - - Çarptığında patlayan alevli toplar atarlar. + + Yerleştir - - Balçık + + Ye - - Hasar aldığında daha ufak Balçıklara bölünür. + + Bin - - Sonveren Adam + + Kayık Kullan - - Ona bakacak olursan sana saldırır. Ayrıca blokları başka yerlere taşır. + + Yetiştir - - Gümüşçün + + Uyu - - Saldırıya uğradığında yakında saklanan Gümüşçünleri çeker. Taş bloklarda saklanır. + + Uyan - - Mağara Örümceği + + Oynat - - Isırığı zehirlidir. + + Seçenekler - - Möntar + + Zırh Taşı - - Kaseyle kullanıldığında mantar yahnisi meydana getirir. Mantar bırakır ve kırpıldığında normal inek haline gelir. + + Silah Taşı - - Kar Golemi + + Kuşan - - Kar Golemi oyuncular tarafından kar blokları ile bal kabağı kullanılarak yapılır. Yaratıcısının düşmanlarına kartopu fırlatır. + + Bileşen Taşı - - Sonveren Ejderha + + Yakacak Taşı - - Son'da bulunan büyük siyah bir ejderhadır. + + Alet Taşı - - Alaz + + Çek - - Dip Alem'de bulunan bu düşmanlar çoğunlukla Dip Alem Kalelerinin içindedir. Öldürüldüklerinde Alaz Çubukları bırakırlar. + + Üst Sayfa - - Magma Küpü + + Alt Sayfa - - Dip Alem'de bulunur. Balçığa benzer şekilde öldürüldüğünde daha ufak türlerine ayrılır. + + Aşk Modu - - Köylü + + Bırak - - Oselo + + Ayrıcalıklar - - Ormanlarda bulunabilir. Çiğ Balıkla beslenerek evcilleştirilebilir ama yanına gitmek yerine Oselonun sana yaklaşmasına izin vermelisin. Yapacağın ani bir hareket onu korkutup kaçıracaktır. + + Engelle - - Demir Golem + + Yaratıcılık - - Koruma amacıyla Köyde ortaya çıkar ve Demir Bloklar ile Bal Kabakları kullanılarak oluşturulabilir. + + Seviyeyi Yasakla - - Patlayıcı Animatörü + + Görünüm Seç - - Konsept Sanatçısı + + Tutuştur - - Hesaplamalar ve İstatistikler + + Arkadaş Davet Et - - Zalim Koordinatör + + Kabul Et - - Orijinal Tasarım ve Kodlama + + Kırp - - Proje Müdürü/Yapımcısı + + Dolaş - - Mojang Ofisinin Kalanı + + Yeniden Yükle - - Baş Oyun Programcısı Minecraft PC + + Seçenekleri Kaydet - - Ninja Kodlayıcı + + Komut Çalıştır - - CEO + + Tam Sürümü Yükle - - Beyaz Yakalı İşçi + + Deneme Sürümünü Yükle - - Müşteri Desteği + + Yükle - - Ofis DJ'i + + Çıkar - - Tasarımcı/Programcı Minecraft - Cep Sürümü + + Çevrimiçi Oyunlar Listesini Yenile - - Geliştirici + + Parti Oyunları - - Baş Mimar + + Tüm Oyunlar - - Sanat Geliştiricisi + + Çıkış - - Oyun Zanaatkarı + + İptal - - Eğlence Yönetmeni + + Katılmayı İptal Et - - Müzik ve Sesler + + Grup Değiştir - - Programlama + + Üretim - - Sanat + + Oluştur - - Kalite Kontrol + + Al/Yerleştir - - Yönetici Yapımcı + + Envanteri Göster - - Baş Yapımcı + + Açıklamayı Göster - - Yapımcı + + Bileşenleri Göster - - Test Yöneticisi + + Geri - - Baş Test Sorumlusu + + Hatırlatma: - - Tasarım Ekibi + + - - Geliştirme Ekibi + + Son sürümde oyuna eğitim dünyasındaki yeni alanlar gibi yeni özellikler eklendi. - - Oyun Çıkışı Yönetimi + + Bu eşyayı yapmak için gereken tüm bileşenlere sahip değilsin. Sol alt köşedeki kutu bunu üretmek için gereken bileşenleri gösterir. - - Yönetmen, XBLA Yayıncılık + + + Tebrikler, eğitimi tamamladın. Oyunda zaman artık normal hızda akacak, gecenin çöküp canavarların çıkması için fazla beklemen gerekemeyecek! Sığınağını tamamla! + - - İş Geliştirme + + {*EXIT_PICTURE*} Daha fazla araştırmaya hazırsan, bu alanda Madenci sığınağının yakınında küçük bir kaleye açılan bir geçiş var. - - Portföy Yöneticisi + + {*B*}Eğitimi normal şekilde oynamak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Ana eğitimi atlamak için {*CONTROLLER_VK_B*} düğmesine bas. - - Ürün Müdürü + + + {*B*} + Yiyecek çubuğu ve yemek yeme hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Yiyecek çubuğu ve yemek yeme hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + - - Pazarlama + + Seç - - Topluluk Yöneticisi + + Kullan - - Avrupa Yerelleştirme Ekibi + + Bu bölgede balıkçılık, tekneler, pistonlar ve kızıltaşlar hakkında daha fazla şey öğrenmen için kurulmuş alanlar bulacaksın. - - Redmond Yerelleştirme Ekibi + + Bu bölgenin dışında yapılar, çiftçilik, maden arabaları ve rayları, efsunlama, simya, takas, demircilik ve daha fazlası ile ilgili örnekler bulacaksın! - - Asya Yerelleştirme Ekibi + + + Yiyeceğin tükendiği için artık sağlık kazanamayacaksın. + - - Kullanıcı Araştırma Ekibi + + Al - - MGS Central Ekipleri + + Sonraki - - Ara Hedef Kabulü Test Sorumlusu + + Önceki - - Özel Teşekkürler + + Oyuncu At - - Test Müdürü + + Arkadaşlık İsteği Gönder - - Yardımcı Test Yöneticisi + + Alt Sayfa - - SDET + + Üst Sayfa - - Proje STE + + Boya - - İlave STE + + İyileştir - - Test Ortakları + + Otur - - Jon Kågström + + Takip Et - - Tobias Möllstam + + Kaz - - Risë Lugo + + Besle - - Ahşap Kılıç + + Evcilleştir - - Taş Kılıç + + Filtreyi Değiştir - - Demir Kılıç + + Tümünü Yerleştir - - Elmas Kılıç + + Birini Yerleştir - - Altın Kılıç + + Bırak - - Ahşap Kürek + + Tümünü Al - - Taş Kürek + + Yarısını Al - - Demir Kürek + + Yerleştir - - Elmas Kürek + + Tümünü Bırak - - Altın Kürek + + Hızlı Seçimi Temizle - - Ahşap Kazma + + Bu Nedir? - - Taş Kazma + + Facebook'ta Paylaş - - Demir Kazma + + Birini Bırak - - Elmas Kazma + + Takas Et - - Altın Kazma + + Hızlı Taşı - - Ahşap Balta + + Görünüm Paketleri - - Taş Balta + + Kırmızı Lekeli İnce Cam - - Demir Balta + + Yeşil Lekeli İnce Cam - - Elmas Balta + + Kahverengi Lekeli İnce Cam - - Altın Balta + + Beyaz Lekeli İnce Cam - - Ahşap Çapa + + Lekeli İnce Cam - - Taş Çapa + + Siyah Lekeli İnce Cam - - Demir Çapa + + Mavi Lekeli İnce Cam - - Elmas Çapa + + Gri Lekeli İnce Cam - - Altın Çapa + + Pembe Lekeli İnce Cam - - Ahşap Kapı + + Açık Yeşil Lekeli İnce Cam - - Demir Kapı + + Mor Lekeli İnce Cam - - Zincir Miğfer + + Camgöbeği Lekeli İnce Cam - - Zincir Göğüs Zırhı + + Açık Gri Lekeli İnce Cam - - Zincir Pantolon + + Turuncu Lekeli İnce Cam - - Zincir Çizmeler + + Mavi Lekeli İnce Cam - - Deri Başlık + + Mor Lekeli İnce Cam - - Demir Miğfer + + Camgöbeği Lekeli İnce Cam - - Elmas Miğfer + + Kırmızı Lekeli Cam - - Altın Miğfer + + Yeşil Lekeli Cam - - Deri Tunik + + Kahverengi Lekeli Cam - - Demir Göğüs Zırhı + + Açık Gri Lekeli İnce Cam - - Elmas Göğüs Zırhı + + Sarı Lekeli İnce Cam - - Altın Göğüs Zırhı + + Açık Mavi Lekeli İnce Cam - - Deri Pantolon + + Galibarda Lekeli İnce Cam - - Demir Pantolon + + Gri Lekeli İnce Cam - - Elmas Pantolon + + Pembe Lekeli İnce Cam - - Altın Pantolon + + Açık Yeşil Lekeli İnce Cam - - Deri Çizmeler + + Sarı Lekeli İnce Cam - - Demir Çizmeler + + Açık Gri - - Elmas Çizmeler + + Gri - - Altın Çizmeler + + Pembe - - Demir Külçe + + Mavi - - Altın Külçe + + Mor - - Kova + + Camgöbeği - - Su Kovası + + Açık Yeşil - - Lav Kovası + + Turuncu - - Çakmak Taşı ve Çelik + + Beyaz - - Elma + + Özel - - Yay + + Sarı - - Ok + + Açık Mavi - - Kömür + + Galibarda - - Odun Kömürü + + Kahverengi - - Elmas + + Beyaz Lekeli İnce Cam - - Sopa + + Küçük Top - - Kase + + Büyük Top - - Mantar Yahnisi + + Açık Mavi Lekeli İnce Cam - - İp + + Galibarda Lekeli İnce Cam - - Tüy + + Turuncu Lekeli İnce Cam - - Barut + + Yıldız biçimli - - Buğday Tohumu + + Siyah - - Buğday + + Kırmızı - - Ekmek + + Yeşil - - Çakmak Taşı + + Ürperten biçimli - - Çiğ Domuz Pirzolası + + İnfilak - - Pişmiş Domuz Pirzolası + + Bilinmeyen Şekil - - Tablo + + Siyah Lekeli Cam - - Altın Elma + + Demir At Zırhı - - Tabela + + Altın At Zırhı - - Maden Arabası + + Elmas At Zırhı - - Eyer + + Kızıltaş Karşılaştırıcısı - - Kızıltaş + + TNT'li Maden Arabası - - Kartopu + + Hunili Maden Arabası - - Kayık + + Tasma - - Deri + + Fener - - Süt Kovası + + Kilitli Sandık - - Tuğla + + Tartılı Basınç Plakası (Hafif) - - Kil + + İsim Etiketi - - Şeker Kamışları + + Keresteler (bütün türleri) - - Kağıt + + Komut Bloğu - - Kitap + + Havai Fişek Yıldızı - - Balçık Topu + + Bu hayvanlar evcilleştirilebilir ve sürülebilir. Bunlara bir Sandık bağlanabilir. - - Sandıklı Maden Arabası + + Katır - - Ocaklı Maden Arabası + + Bir at ve eşeğin çiftleşmesinden meydana gelirler. Bu hayvanlar evcilleştirilebilir ve sürülebilir, zırh giyer ve sandık taşırlar. - - Yumurta + + At - - Pusula + + Bu hayvanlar evcilleştirilip, ardından sürülebilirler. - - Olta + + Eşek - - Saat + + Zombi At - - Parıltı Taşı Tozu + + Dip Yıldızı - - Çiğ Balık + + - - Pişmiş Balık + + Havai Fişek Roketleri - - Boya Tozu + + İskelet At - - Mürekkep Kesesi + + Solgun - - Gül Kırmızısı + + Bunlar Solgun Kafatasları ve Ruh Kumlarıyla yapıldı. Sana patlayan Kafatası fırlatırlar. - - Kaktüs Yeşili + + Tartılı Basınç Plakası (Ağır) - - Kakao Çekirdekleri + + Açık Gri Lekeli Kil - - Laciverttaş + + Gri Lekeli Kil - - Mor Boya + + Pembe Lekeli Kil - - Camgöbeği Boya + + Mavi Lekeli Kil - - Açık Gri Boya + + Mor Lekeli Kil - - Gri Boya + + Camgöbeği Lekeli Kil - - Pembe Boya + + Açık Yeşil Lekeli Kil - - Limon Yeşili Boya + + Turuncu Lekeli Kil - - Karahindiba Sarısı + + Beyaz Lekeli Kil - - Açık Mavi Boya + + Lekeli Cam - - Galibarda Boya + + Sarı Lekeli Kil - - Turuncu Boya + + Açık Mavi Lekeli Kil - - Kemik Tozu + + Galibarda Lekeli Kil - - Kemik + + Kahverengi Lekeli Kil - - Şeker + + Huni - - Pasta + + Etkinleştirici Ray - - Yatak + + Düşürücü - - Kızıltaş Yineleyici + + Kızıltaş Karşılaştırıcısı - - Kurabiye + + Günışığı Sensörü - - Harita + + Kızıltaş Bloğu - - Müzik Plağı - "13" + + Lekeli Kil - - Müzik Plağı - "kedi" + + Siyah Lekeli Kil - - Müzik Plağı - "bloklar" + + Kırmızı Lekeli Kil - - Müzik Plağı - "cıvıltı" + + Yeşil Lekeli Kil - - Müzik Plağı - "uzak" + + Saman Balyası - - Müzik Plağı - "AVM" + + Sertleştirilmiş Kil - - Müzik Plağı - "mellohi" + + Kömür Bloğu - - Müzik Plağı - "stal" + + Geç: - - Müzik Plağı - "strad" + + Kapatıldığında, canavarların ve hayvanların blokları değiştirmesini (örneğin Ürperten patlayınca bloklar zarar görmez ve Koyun çimenleri yok etmez) ya da eşyaları almasını engeller. - - Müzik Plağı - "koruma" + + Açıldığında oyuncular öldükleri zaman envanterlerini korurlar. - - Müzik Plağı - "11" + + Kapatıldığında, yaratıklar doğal şekilde canlanmazlar. - - Müzik Plağı - "neredeyiz şimdi" + + Oyun Modu: Macera - - Makas + + Macera - - Bal Kabağı Çekirdekleri + + Aynı araziyi tekrar oluşturmak için bir oluşum gir. Rastgele bir dünya için ise boş bırak. - - Kavun Çekirdekleri + + Kapatıldığında canavarlar ve hayvanlar ganimet düşürmezler (örneğin Ürpertenler barut düşürmezler). - - Çiğ Tavuk Eti + + {*PLAYER*} merdivenden düştü - - Pişmiş Tavuk Eti + + {*PLAYER*} asmaların üzerinden düştü - - Çiğ Sığır Eti + + {*PLAYER*} sudan aşağı düştü - - Biftek + + Kapatıldığında bloklar yok oldukları zaman eşya düşürmezler (örneğin Taş bloklar parke taşı düşürmezler). - - Çürümüş Et + + Kapatıldığında oyuncular sağlıklarını doğal olarak yenileyemezler. - - Sonveren İncisi + + Devre dışı bırakıldığında geçen zaman değişmeyecek. - - Kavun Dilimi + + Maden Arabası - - Alaz Çubuğu + + Yular - - Fersiz Gözyaşı + + Bırak - - Altın Keseği + + Bağla - - Dip Alem Yumrusu + + İn - - {*splash*}{*prefix*}{*postfix*}İksiri + + Sandık Tak - - Cam Şişe + + Fırlat - - Su Şişesi + + İsim - - Örümcek Gözü + + Fener - - Mayalı Örümcek Gözü + + Birincil Güç - - Alaz Tozu + + İkincil Güç - - Magma Özü + + At - - Simya Standı + + Düşürücü - - Kazan + + Huni - - Sonveren Gözü + + {*PLAYER*} yüksek bir yerden düştü - - Parıldayan Kavun + + Şu anda Canlandırma Yumurtasını kullanamazsın. Bir dünyada olabilecek maksimum Yarasa sayısına ulaşıldı. - - Efsunlu Şişe + + Bu hayvan Aşk Moduna giremez. Maksimum damızlık at sayısına ulaşıldı. - - Kor + + Oyun Seçenekleri - - Kor (Odun Kömürü) + + {*PLAYER*} {*ITEM*} kullanan {*SOURCE*} tarafından gelen ateş topuyla vuruldu - - Kor (Kömür) + + {*PLAYER*} oyuncusu {*ITEM*} kullanan {*SOURCE*} tarafından vurularak öldürüldü - - Eşya Çerçevesi + + {*PLAYER*}, {*ITEM*} kullanan {*SOURCE*} tarafından öldürüldü - - {*CREATURE*} Canlandır + + Yaratık Hasarı - - Dip Alem Tuğlası + + Döşeme Parçaları - - Kafatası + + Doğal Yenilenme - - İskelet Kafatası + + Günışığı Döngüsü - - Soluk İskelet Kafatası + + Envanteri Koru - - Zombi Kafası + + Yaratık Canlanması - - Kafa + + Yaratık Ganimetleri - - %s Kafası + + {*PLAYER*} {*ITEM*} kullanan {*SOURCE*} tarafından vuruldu - - Ürperten Kafası + + {*PLAYER*} çok yüksekten düştü ve {*SOURCE*} tarafından işi bitirildi. - - Taş + + {*PLAYER*} çok yüksekten düştü ve {*ITEM*} kullanan {*SOURCE*} tarafından işi bitirildi - - Çimen Bloğu + + {*PLAYER*}, {*SOURCE*} ile savaşırken ateşe girdi - - Toprak + + {*PLAYER*} {*SOURCE*} tarafından ölüme mahkum edildi - - Parke Taşı + + {*PLAYER*} {*SOURCE*} tarafından ölüme mahkum edildi - - Meşe Kerestesi + + {*PLAYER*}, {*ITEM*} kullanan {*SOURCE*} tarafından ölüme mahkum edildi. - - Ladin Kerestesi + + {*PLAYER*}, {*SOURCE*} ile savaşırken çıtır çıtır yandı - - Huş Kerestesi + + {*PLAYER*} {*SOURCE*} tarafından patlatıldı - - Orman Kerestesi + + {*PLAYER*} soldu gitti - - Fidan + + {*PLAYER*} {*ITEM*} kullanan {*SOURCE*} tarafından öldürüldü - - Meşe Fidanı + + {*PLAYER*}, {*SOURCE*} tarafından kovalanırken lavda yüzmeye çalıştı - - Ladin Fidanı + + {*PLAYER*}, {*SOURCE*} tarafından kovalanırken boğuldu - - Huş Fidanı + + {*PLAYER*}, {*SOURCE*} tarafından kovalanırken kaktüse çarptı. - - Orman Ağacı Fidanı + + Binek - - Taban Kayası + + Bir atı sürebilmek için, bunlara önce köylerden satın alınabilen ya da dünya üzerindeki gizlenmiş sandıklarda bulunabilen bir eyer giydirilmelidir. - - Su + + Evcilleşmiş Eşeklere ve Katırlara eğilip bir sandık bağlanarak heybe takılabilir. Bu torbalara sürerken veya eğilirken ulaşılabilir. - - Lav + + Atlar ve Eşekler (Katırlar değil) Altın Elma veya Altın Havuç kullanılarak diğer hayvanlar gibi yavrulayabilirler. Sıpalar zamanla yetişkin ata dönüşürler, bunları buğdayla veya samanla beslemek ise bu süreci hızlandırır. - - Kum + + Atlar, Eşekler ve Katırlar kullanılmadan önce evcilleştirilmelidir. Bir atı sürmeye çalışarak evcilleştirebilirsiniz ve bu süreçte biniciyi üstünden atmaya çalışan atın üzerinde kalmayı başarın. - - Kum Taşı + + Evcilleştirildiklerinde etraflarında kalpler belirir ve artık oyuncuyu sırtlarından atmaya çalışmazlar. - - Çakıl Taşı + + Şimdi bu atı sürmeyi dene. Üzerine binmek için elinde eşya veya alet yokken {*CONTROLLER_ACTION_USE*} düğmesini kullan. - - Altın Cevheri + + Burada Atları ve Eşekleri evcilleştirmeye çalışabilirsin ve ayrıca buradaki sandıkların içinde Eyer, At Zırhı ve atlar için diğer kullanışlı eşyaları da bulabilirsin. - - Demir Cevheri + + En az 4 katlı bir piramitteki bir Fener, ya ikincil Yenilenme gücünü ya da ana gücün daha güçlüsünü ek seçenek olarak sunar. - - Kömür Cevheri + + Fenerinin güçlerini belirlemek için ödeme boşluğunda bir Zümrüt, Elmas, Altın veya Demir Külçe feda etmelisin. Güçler belirlendiğinde Fener'den sonsuza kadar yayılacaklardır. - - Odun + + Bu piramitin tepesinde çalışmayan bir Fener var. - - Meşe Odunu + + Burası, Fenerine verebileceğin güçleri seçebildiğin Fener arabirimidir. - - Ladin Odunu + + Devam etmek için {*B*}{*CONTROLLER_VK_A*} düğmesine bas. + Fener arayüzünü kullanmayı zaten biliyorsan {*B*}{*CONTROLLER_VK_B*} düğmesine bas. - - Huş Odunu + + Fener menüsündeyken Fenerin için 1 ana güç seçebilirsin. Piramitinin katları arttıkça seçilecek güçler de artar. - - Orman Odunu + + +Tüm yetişkin Atlar, Eşekler ve Katırlar sürülebilir. Fakat yalnızca Atlar zırhlandırılabilir ve yalnızca katırlar ve eşekler eşya taşımak için heybe giyebilir. - - Meşe + + Bu, atın envanter arabirimidir. - - Ladin + + + {*B*}Devam etmek için{*CONTROLLER_VK_A*} düğmesine bas. + {*B*}At envanterinin nasıl kullanılacağını zaten biliyorsan{*CONTROLLER_VK_B*} düğmesine bas. - - Huş + + At envanteri, Atına, Eşeğine ya da Katırına eşya transfer etmeni ya da takmanı sağlar. - - Yapraklar + + Parıltı - - Meşe Yaprakları + + İz - - Ladin Yaprakları + + Uçuş Süresi: - - Huş Yaprakları + + Eyer yuvasına bir eyer yerleştirerek Atını eyerleyebilirsin. Zırh yuvasına At Zırhı yerleştirilerek Atlara zırh takılabilir. - - Orman Yaprakları + + Bir Katır buldun. - - Sünger + + {*B*}Atlar, Eşekler ve Katırlar hakkında daha fazla şey öğrenmek için{*CONTROLLER_VK_A*} düğmesine bas. + {*B*}Eğer Atlar, Eşekler ve Katırlar hakkındaki bilgileri biliyorsan{*CONTROLLER_VK_B*} düğmesine bas. - - Cam + + Atlar ve Eşekler genelde açık ovalarda bulunurlar. Katırlar bir at ve eşekten üreyebilirler fakat kendileri kısırdır. - - Yün + + Bu menüde ayrıca, kendi envanterin ile Eşeklere ve Katırlara bağlanmış heybeler arasında eşya transferi yapabilirsin. - - Siyah Yün + + Bir At buldun. - - Kırmızı Yün + + Bir Eşek buldun. - - Yeşil Yün + + + Fenerler hakkında daha fazla şey öğrenmek için {*B*}{*CONTROLLER_VK_A*} düğmesine bas. + Fenerler hakkında zaten bir şeyler biliyorsan {*B*}{*CONTROLLER_VK_B*} düğmesine bas. - - Kahverengi Yün + + Havai Fişek Yıldızları, üretim örgüsüne Barut ve Boya koyularak üretilebilir. - - Mavi Yün + + Boya, Havai Fişek Yıldızının patlama rengini belirleyecektir. - - Mor Yün + + Bir Kor, Altın Külçe, Tüy ya da Yaratık Kellesi eklenerek Havai Fişek Yıldızının şekli ayarlanabilir. - - Camgöbeği Yün + + İsteğe bağlı olarak, Havai Fişeğe eklemek için üretim örgüsüne birden fazla Havai Fişek Yıldızı yerleştirebilirsin. - - Açık Gri Yün + + Üretim örgüsündeki bölmelerden daha fazlasını Barut ile doldurmak, Havai Fişek Yıldızlarının patlayacağı yüksekliği artıracaktır. - - Gri Yün + + Ardından üretilen Havai Fişeği, üretimde kullanmak istersen çıkış bölmesinden al. - - Pembe Yün + + Elmaslar ve Parıltı Taşı Tozu kullanılarak izler ve patlamalar eklenebilir. - - Limon Yeşili Yün + + Havai Fişekler, el ile ya da Fırlatıcılardan fırlatılabilen dekoratif eşyalardır. Kağıt, Barut ve isteğe bağlı olarak bir miktar Havai Fişek Yıldızı kullanılarak üretilirler. - - Sarı Yün + + Üretim sırasında ek bileşenler de katılarak bir Havai Fişeğin renkleri, ortadan kaybolması, şekli, boyutu ve efektleri (izler ve patlamalar gibi) özelleştirilebilir. - - Açık Mavi Yün + + Sandıklardaki çeşitli bileşenleri kullanarak Üretim Masasında bir Havai Fişek üretmeyi dene. - - Galibarda Yün + + Bir Havai Fişek Yıldızı üretildikten sonra, Boya da katarak bir Havai Fişek Yıldızının ortadan kaybolma rengini belirleyebilirsin. - - Turuncu Yün + + Buraki sandıkların içinde, HAVAİ FİŞEK yapımında kullanılan çeşitli eşyalar mevcuttur. - - Beyaz Yün + + {*B*}Havai Fişekler hakkında daha fazla bilgi almak için{*CONTROLLER_VK_A*} düğmesine bas. +{*B*}Havai Fişekleri zaten biliyorsan{*CONTROLLER_VK_B*} düğmesine bas. - - Çiçek - - - Gül + + Bir Havai Fişek üretmek için envanterinin üzerinde bulunan 3x3'lük üretim örgüsüne Barut ve Kağıt yerleştir. - - Mantar + + Bu odada Huniler bulunuyor. - - Altın Bloğu + + Huniler hakkında daha fazla şey öğrenmek için {*B*}{*CONTROLLER_VK_A*} düğmesine bas. + Huniler hakkında zaten bir şeyler biliyorsan {*B*}{*CONTROLLER_VK_B*} düğmesine bas. - - Altın depolamanın kompakt bir yolu. + + Huniler, Konteynerlere eşya yerleştirmek veya eşyaları çıkarmak için kullanılırlar ve onlara atılan eşyaları otomatik olarak alırlar. - - Demir Bloğu + + Aktif Fenerler gökyüzüne doğru parlak bir ışın yansıtırlar ve yakınlarındaki oyunculara güçler sağlarlar. Fenerleri üretebilmek için Cam, Obsidiyen ve Solgun'u yendiğinde elde edebileceğin Dip Yıldızlarına ihtiyacın vardır. - - Demir depolamanın kompakt bir yolu. + + Fenerler, gün içerisinde gün ışığı alacak şekilde yerleştirilmelidirler. Fenerler, Demir, Altın, Zümrüt veya Elmas Piramitlerinin üzerine yerleştirilmelidirler. Fakat malzeme seçiminin fenerin gücü üzerinde hiçbir etkisi yoktur. - - Taş Levha + + Sağladığı güçleri belirlemek için Feneri kullan, gereken ödeme için sana sağlanan Demir Külçeleri kullanabilirsin. - - Taş Levha + + Diğer Huniler gibi, Simya Standlarını, Sandıkları, Fırlatıcıları, Düşürücüleri, Sandıklı Maden Arabalarını ve Hunili Maden Arabalarını etkileyebilirler. - - Kum Taşı Levha + + Bu odanın içerisinde görülmeyi ve kullanılmayı bekleyen birçok kullanışlı Huni dizilimi vardır. - - Meşe Odunu Levha + + Bu, Havai Fişek ve Havai Fişek Yıldızı üretmek için kullanabileceğin Havai Fişek arayüzüdür. - - Parke Taşı Levha + + {*B*}Devam etmek için{*CONTROLLER_VK_A*} düğmesine bas. +{*B*}Havai Fişek arayüzünün nasıl kullanıldığını zaten biliyorsan{*CONTROLLER_VK_B*} düğmesine bas. - - Tuğla Levha + + Huniler, üzerlerine yerleştirilen uygun konteynerlerden devamlı eşya emmeye çalışacaklardır. Depolanan eşyaları bir çıkış konteynerine yerleştirmeye de çalışırlar. - - Taş Tuğla Levha + + Fakat eğer bir Huni, gücünü Kızıltaş'tan alıyorsa, etkisiz hâle gelecek ve eşyaları emmeyi ve yerleştirmeyi bırakacaktır. - - Meşe Odunu Levha + + Bir Huni, eşyaları göndermeyi denediği yöne doğru bakar. Bir huninin belirli bir bloğa bakmasını istiyorsan, eğilirken huniyi o bloğa karşı yerleştir. - - Ladin Odunu Levha + + Bu düşmanlar bataklıklarda bulunurlar ve İksir atarak saldırırlar. Öldürüldüklerinde İksir düşürürler. - - Huş Odunu Levha + + Dünyadaki maksimum Tablo/Eşya çerçevesi sayısına ulaşıldı. - - Orman Odunu Levha + + Huzurlu Modda düşman canlandırılamaz. - - Dip Alem Tuğlası Levha + + Bu hayvan Aşk Moduna giremez. Maksimum damızlık Domuz, Koyun, İnek, Kedi ve At sayısına ulaşıldı. - - Tuğlalar + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Kalamar sayısına ulaşıldı. - - TNT + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum düşman sayısına ulaşıldı. - - Kitap Rafı + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum köylü sayısına ulaşıldı. - - Yosunlu Taş + + Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Kurt sayısına ulaşıldı. + - - Obsidiyen + + Dünyadaki maksimum Yaratık Kellesi sayısına ulaşıldı. - - Meşale + + Bakışı Ters Çevir - - Meşale (Kömür) + + Solak - - Meşale (Odun Kömürü) + + Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Tavuk sayısına ulaşıldı. + - - Ateş + + Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Möntar sayısına ulaşıldı. + - - Canavar Canlandırıcı + + Dünyadaki maksimum Tekne sayısına ulaşıldı. - - Meşe Odunu Basamak + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Tavuk sayısına ulaşıldı. - - Sandık + + {*C2*}Şimdi bir nefes. Bir nefes daha al. Havayı ciğerlerinde hisset. Bırak uzuvların geri gelsin. Evet parmaklarını oynat. Tekrar bir vücudun olsun, yer çekiminde, havada. Uzun hayalde tekrar doğ. İşte. Vücudun tekrar her zerrede kainata değsin, sanki sen ayrı bir şeymişsin gibi. Sanki biz ayrı bir şeymişiz gibi.{*EF*}{*B*}{*B*} +{*C3*}Biz kimiz? Önceleri bize dağın ruhu denirdi. Güneş baba, ay ana. Ataların ruhları, hayvanların ruhları. Cin. Hayalet. Yeşil adam. Tanrılar, iblisler. Melekler. Öcüler. Uzaylılar, dünya dışı canlılar. Leptonlar, kuraklar. Kelimeler değişiyor. Biz değişmiyoruz.{*EF*}{*B*}{*B*} +{*C2*}Biz kainatız. Biz sen olmadığını düşündüğün her şeyiz. Şu an bize bakıyorsun, derin ve gözlerinle. Neden kainat derine dokunuyor ve sana ışık gönderiyor? Seni görmek için, oyuncu. Seni tanımak için ve tanınmak için. Sana bir hikaye anlatacağım.{*EF*}{*B*}{*B*} +{*C2*}Bir zamanlar bir oyuncu varmış.{*EF*}{*B*}{*B*} +{*C3*}Bu oyuncu sendin, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Bazen kendisinin erimiş taştan oluşan dönen bir kürenin üstündeki ince bir kabukta yaşayan bir insan olduğunu sanıyor. Erimiş kaya küresi kendinden üç yüz otuz bin kez büyük yanan bir gaz topunun etrafında dönüyormuş. Birbirlerinden o kadar uzaklarmış ki ışığın arada gitmesi sekiz dakika sürüyormuş. Işık yıldızdan gelen bir malumatmış ve yüz elli milyon kilometre öteden cildini yakabilirmiş.{*EF*}{*B*}{*B*} +{*C2*}Bazen oyuncu bir madenci olduğunu hayal ediyor, düz ve sonsuz bir dünyanın yüzeyinde. Güneş beyaz bir kareden ibaret. Günler kısa; yapacak çok iş var ve ölüm sadece geçici bir rahatsızlık.{*EF*}{*B*}{*B*} +{*C3*}Bazen oyuncu bir hikayenin içinde kaybolduğunu hayal ediyor.{*EF*}{*B*}{*B*} +{*C2*}Bazen oyuncu başka yerlerdeki başka şeyler olduğunu hayal ediyor. Bazen bu hayaller rahatsız edici olur. Bazen de çok güzel olur. Bazen oyuncu bir rüyadan diğerine oradan da üçüncü bir rüyanın içine uyanır.{*EF*}{*B*}{*B*} +{*C3*}Bazen oyuncu bir ekran ile dünyaları izlediğini hayal eder.{*EF*}{*B*}{*B*} +{*C2*}Geriye dönelim.{*EF*}{*B*}{*B*} +{*C2*}Oyuncunun atomları çimenlere, nehirlere, havaya, yere saçılmıştı. Bir kadın atomları topladı; içti yedi ve ciğerlerine çekti ve kadın oyuncuyu kendi bedeninde birleştirdi.{*EF*}{*B*}{*B*} +{*C2*}Ve oyuncu uyandı, annesinin bedeninin sıcak ve karanlık dünyasından uzun bir rüyaya uyandı.{*EF*}{*B*}{*B*} +{*C2*}Ve oyuncu yeni bir hikaye oldu, daha önce anlatılmamış, DNA ile yazılmış. Oyuncu yeni bir programdı, daha önce hiç çalışmamış, bir milyar yıllık bir kaynak koddan üretilmiş. Ve oyuncu yeni bir insandı, daha önce yaşamamış, sadece süt ve sevgiden yapılmış.{*EF*}{*B*}{*B*} +{*C3*}Sen oyuncusun. Hikayesin. Programsın. İnsansın. Sadece süt ve sevgiden yapılmış.{*EF*}{*B*}{*B*} +{*C2*}Daha da geriye gidelim.{*EF*}{*B*}{*B*} +{*C2*}Oyuncunun bedeninin yedi milyar çarpı milyar çarpı milyar atomu bu oyundan çok önce, bir yıldızın kalbinde yaratıldı. Bu yüzden oyuncu da bir yıldızdan gelen bir malumattır. Ve oyuncu bir hikayenin içinde hareket eder, Julian diye birinin diktiği bilgi ormanında ve Markus diye birinin yarattığı düz sonsuz bir dünyada, bunlar oyuncunun yarattığı küçük ve özel bir dünyada bulunur, oyuncu da şu kişi tarafından yaratılan kainata yaşar...{*EF*}{*B*}{*B*} +{*C3*}Şşt. Bazen oyuncu yumuşak sıcak ve basit olan küçük, özel bir dünya yaratır. Bazen zor, soğuk ve karmaşık. Bazen kafasında kainatın bir modelini kurar; devasa boş bir alanda gezen enerji zerreleri. Bazen bu zerrelere "elektron" ve "proton" der.{*EF*}{*B*}{*B*} + - - Kızıltaş Tozu + + {*C2*}Bazen onlara "gezegenler" ve "yıldızlar" der.{*EF*}{*B*}{*B*} +{*C2*}Bazen enerjiden yapılmış, açık ve kapalıdan yapılmış; sıfır ve birden yapılmış; kod satırlarından yapılmış bir kainatta yaşadığına inanır. Bazen bir oyun oynadığına inanır. Bazen ekrandaki kelimeleri okuduğuna inanır.{*EF*}{*B*}{*B*} +{*C3*}Sen oyuncusun, kelimeleri okuyorsun...{*EF*}{*B*}{*B*} +{*C2*}Şşt... Bazen oyuncu ekranda kod satırlarını okur. Onları kelimelere çevirir; kelimeleri manaya çevirir; manayı hislere, duygulara, teorilere, fikirlere çevirir ve oyuncu derin ve hızlı nefes almaya başlar, yaşadığını fark eder, yaşadığını, o binlerce ölüm gerçek değildir, oyuncu yaşıyordur{*EF*}{*B*}{*B*} +{*C3*}Sen. Sen. Sen yaşıyorsun.{*EF*}{*B*}{*B*} +{*C2*}ve bazen oyuncu kainatın onunla yaz ağaçlarının titreyen yapraklarının arasından sızan gün ışığı vasıtasıyla konuştuğuna inanır{*EF*}{*B*}{*B*} +{*C3*}ve bazen oyuncu kainatın onunla kışın gevrek gece semasından sızan ışık vasıtasıyla konuştuğuna inanır, oyuncunun gözünün kenarındaki bir ışık zerresi güneşten milyar kat büyük bir yıldız olabilir, o an oyuncuya görünebilmek için gezegenlerini plazmaya çevirmiştir, kainatın uzak bir köşesindeki evine yürürken, birden yemek kokusu alır, tanıdık bir kapının önünde, tekrar rüyaya dalmak üzereyken{*EF*}{*B*}{*B*} +{*C2*}ve bazen oyuncu kainatın onunla sıfırlar ve birler, dünyanın elektriği, bir rüyanın sonundaki ekranda kayan yazılar vasıtasıyla konuştuğuna inanır{*EF*}{*B*}{*B*} +{*C3*}ve kainat seni seviyorum dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat oyunu iyi oynadın dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat ihtiyacın olan her şey içinde dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat düşündüğünden daha güçlüsün dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat sen gün ışığısın dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat sen gecesin dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat savaştığın karanlık senin içinde dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat aradığın ışık senin içinde dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat yalnız değilsin dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat sen diğer şeylerden ayrı değilsin dedi{*EF*}{*B*}{*B*} +{*C3*}ve kainat sen kainatsın, kendini tadıyorsun, kendinle konuşuyorsun, kendi kodunu okuyorsun dedi{*EF*}{*B*}{*B*} +{*C2*}ve kainat seni seviyorum dedi çünkü sevgi sensin.{*EF*}{*B*}{*B*} +{*C3*}Ve oyun bitti ve oyuncu rüyadan uyandı. Ve oyuncu yeni bir rüyaya daldı. Ve oyuncu tekrar hayal etti, daha iyi hayal etti. Ve oyuncu kainatın kendisiydi. Ve oyuncu sevgiydi.{*EF*}{*B*}{*B*} +{*C3*}Oyuncu sensin.{*EF*}{*B*}{*B*} +{*C2*}Uyan.{*EF*} + - - Elmas Cevheri + + Dip Alem'i Sıfırla - - Elmas Bloğu + + %s Son'a girdi - - Elmas depolamanın kompakt bir yolu. + + %s Son'dan çıktı - - Üretim Masası + + {*C3*}Bahsettiğin oyuncuyu görüyorum.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Evet. Dikkat et. Şimdi daha yüksek bir seviyeye ulaştı. Düşüncelerimizi okuyabilir.{*EF*}{*B*}{*B*} +{*C2*}Fark etmez. Bizim oyunun bir parçası olduğumuzu sanıyor.{*EF*}{*B*}{*B*} +{*C3*}Bu oyuncuyu seviyorum. İyi oynadı. Vazgeçmedi.{*EF*}{*B*}{*B*} +{*C2*}Bizim düşüncelerimizi ekrandaki yazılar olarak okuyor.{*EF*}{*B*}{*B*} +{*C3*}Oyunun hayalinin derinliklerine daldığında birçok şeyi bu şekilde hayal etmeyi tercih eder.{*EF*}{*B*}{*B*} +{*C2*}Kelimeler çok iyi bir arabirim oluşturuyor. Çok esnek. Ve ekranın ardındaki gerçekliğe bakmaktan daha az korkutucu.{*EF*}{*B*}{*B*} +{*C3*}Eskiden sesler duyarlardı. Oyuncular okumayı bilmezden önce. O zamanlar, oyunu oynamayanlar oyunculara cadı ve büyücü derdi. Ve oyuncular havada şeytanlar tarafından hareket ettirilen çubukların üstünde uçtuklarını hayal ederlerdi.{*EF*}{*B*}{*B*} +{*C2*}Bu oyuncu ne hayal etti?{*EF*}{*B*}{*B*} +{*C3*}Bu oyuncu gün ışığını ve ağaçları hayal etti. Ateşi ve suyu hayal etti. Hayal etti ve yarattı. Hayal etti ve yok etti. Hayal etti avladı ve avlandı. Sığınak hayal etti.{*EF*}{*B*}{*B*} +{*C2*}Hah, asıl arabirim. Bir milyon yıllık ama hala çalışıyor. Ama bu oyuncunun ekranın ardındaki gerçeklikte asıl yarattığı yapı nedir?{*EF*}{*B*}{*B*} +{*C3*}İşe yaradı, bir milyon diğerleriyle beraber, {*EF*}{*NOISE*}{*C3*} ile dolu gerçek dünyada bir {*EF*}{*NOISE*}{*C3*} yarattı, {*EF*}{*NOISE*}{*C3*} için, {*EF*}{*NOISE*}{*C3*} içinde.{*EF*}{*B*}{*B*} +{*C2*}Bu düşünceyi okuyamaz.{*EF*}{*B*}{*B*} +{*C3*}Hayır. Daha en yüksek seviyeye ulaşmadı. Bunun için uzun bir hayat hayal etmeli kısa bir oyun değil.{*EF*}{*B*}{*B*} +{*C2*}Sevdiğimizi biliyor mu? Kainatın merhametli olduğunu?{*EF*}{*B*}{*B*} +{*C3*}Bazen düşüncelerinin sesiyle, kainatı duyabilir, evet.{*EF*}{*B*}{*B*} +{*C2*}Ama üzüldüğü zamanlar olur, uzun hayallerde. Yazı olmayan dünyalar yaratır ve kara bir güneşin altında titrer ve bu üzgün yaratımını gerçek sanar.{*EF*}{*B*}{*B*} +{*C3*}Onu kederden kurtarmak yok eder. Keder onun özel vazifesinin bir parçası. Biz karışamayız.{*EF*}{*B*}{*B*} +{*C2*}Bazen derin hayallere daldıklarında, onlara gerçeklikte gerçek dünyalar inşa ettiklerini söylemek istiyorum. Bazen onlara kainattaki önemlerini anlatmak istiyorum. Bazen bir süre boyunca gerçek bir bağlantı kurmadıklarında, onlara korktukları şeyleri söylemekte yardım etmek istiyorum.{*EF*}{*B*}{*B*} +{*C3*}Düşüncelerimizi okuyor.{*EF*}{*B*}{*B*} +{*C2*}Bazen umursamıyorum. Bazen onlara söylemek istiyorum, gerçek sandıkları dünya sadece bir {*EF*}{*NOISE*}{*C2*} vr {*EF*}{*NOISE*}{*C2*}, onlara {*EF*}{*NOISE*}{*C2*} içinde bir olduklarını söylemek istiyorum {*EF*}{*NOISE*}{*C2*}. Uzun hayalleri boyunca gerçekliği çok az görüyorlar.{*EF*}{*B*}{*B*} +{*C3*}Ancak yine de oyunu oynuyorlar.{*EF*}{*B*}{*B*} +{*C2*}Ama onlara söylemek çok kolay olurdu...{*EF*}{*B*}{*B*} +{*C3*}Bu hayal için çok güçlü. Onlara nasıl yaşayacaklarını söylemek onları yaşamaktan alıkoyar.{*EF*}{*B*}{*B*} +{*C2*}Ben oyuncuya nasıl yaşayacağını söylemeyeceğim.{*EF*}{*B*}{*B*} +{*C3*}Oyuncu huzursuzlanıyor.{*EF*}{*B*}{*B*} +{*C2*}Oyuncuya bir hikaye anlatacağım.{*EF*}{*B*}{*B*} +{*C3*}Ama gerçeği değil.{*EF*}{*B*}{*B*} +{*C2*}Hayır. Gerçeği güvenli bir şekilde taşıyan bir hikaye, kelime kafeslerinde. Her mesafeden yakıcı olan çıplak gerçeği değil.{*EF*}{*B*}{*B*} +{*C3*}Ona bir vücut ver, tekrar.{*EF*}{*B*}{*B*} +{*C2*}Evet. Oyuncu...{*EF*}{*B*}{*B*} +{*C3*}Adını kullan.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Oyunların oyuncusu.{*EF*}{*B*}{*B*} +{*C3*}Güzel.{*EF*}{*B*}{*B*} - - Mahsul + + Bu oyun kaydındaki Dip Alem'i sıfırlayıp ilk haline getirmek istediğinden emin misin? Dip Alem'de inşa ettiğin her şey yok olacak! - - Ekim Toprağı + + Şu an Canlandırma Yumurtası kullanılamaz. Maksimum Domuz, Koyun, İnek, Kedi ve At sayısına ulaşıldı. - - Ocak + + Şu an Canlandırma Yumurtası kullanılamaz. Maksimum Möntar sayısına ulaşıldı. - - Tabela + + Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Kurt sayısına ulaşıldı. - - Ahşap Kapı + + Dip Alem'i Sıfırla - - Merdiven + + Dip Alem'i Sıfırlama - - Ray + + Şu an bu Möntar biçilemez. Maksimum Domuz, Koyun, İnek, Kedi ve At sayısına ulaşıldı. - - Enerjili Ray + + Öldün! - - Dedektörlü Ray + + Dünya Seçenekleri - - Taş Basamak + + İnşa Edebilir ve Kazabilir - - Şalter + + Kapıları ve Düğmeleri Kullanabilir - - Basınç Plakası + + Yapı Üret - - Demir Kapı + + Aşırı Düz Dünya - - Kızıltaş Cevheri + + Bonus Sandık - - Kızıltaş Meşalesi + + Konteynerleri Açabilir - - Düğme + + Oyuncuyu At - - Kar + + Uçabilir - - Buz + + Yorulmayı Kapat - - Kaktüs + + Oyunculara Saldırabilir - - Kil + + Hayvanlara Saldırabilir - - Şeker Kamışı + + Denetleyici - - Müzik Kutusu + + Kurucu Ayrıcalıkları - - Çit + + Nasıl Oynanır - - Bal Kabağı + + Kontroller - - Cadılar Bayramı Kabağı + + Ayarlar - - Dip Alem Kütlesi + + Tekrar Canlan - - Ruh Kumu + + İndirilebilir İçerik Teklifleri - - Parıltı Taşı + + Görünümü Değiştir - - Portal + + Emeği Geçenler - - Laciverttaş Cevheri + + TNT Patlar - - Laciverttaş Bloğu + + Oyuncu vs Oyuncu - - Laciverttaş depolamanın kompakt bir yolu. + + Oyunculara Güven - - Fırlatıcı + + İçeriği Tekrar Yükle - - Nota Bloğu + + Hata Düzeltme Ayarları - - Pasta + + Yangın Yayılır - - Yatak + + Sonveren Ejderha - - + + {*PLAYER*} Sonveren Ejderha nefesiyle öldü - - Uzun Çimen + + {*PLAYER*}, {*SOURCE*} tarafından katledildi - - Ölü Çalı + + {*PLAYER*}, {*SOURCE*} tarafından katledildi - - Diyot + + {*PLAYER*} öldü - - Kilitli Sandık + + {*PLAYER*} havaya uçtu - - Yatay Kapı + + {*PLAYER*} büyüyle öldü - - Yün (herhangi bir renk) + + {*PLAYER*}, {*SOURCE*} tarafından vuruldu - - Piston + + Taban Sisi - - Yapışkan Piston + + Göstergeleri Göster - - Gümüşçün Bloğu + + Eli Göster - - Taş Tuğlalar + + {*PLAYER*}, {*SOURCE*} tarafından ateş topuyla vuruldu - - Yosunlu Taş Tuğlalar + + {*PLAYER*}, {*SOURCE*} tarafından dövülerek öldürüldü - - Çatlak Taş Tuğlalar + + {*PLAYER*}, {*SOURCE*} tarafından büyü kullanılarak öldürüldü - - Yontma Taş Tuğlalar + + {*PLAYER*} dünyanın dışına düştü - - Mantar + + Kaplama Paketleri - - Mantar + + Uyarlama Paketleri - - Demir Parmaklık + + {*PLAYER*} alevlere gömüldü - - İnce Cam + + Temalar - - Kavun + + Oyuncu Resimleri - - Bal Kabağı Sapı + + Avatar Eşyaları - - Kavun Sapı + + {*PLAYER*} yanarak öldü - - Sarmaşık + + {*PLAYER*} açlıktan öldü - - Çit Kapısı + + {*PLAYER*} kaktüs iğnesiyle öldü - - Tuğla Basamak + + {*PLAYER*} yere çok sert çarptı - - Taş Tuğla Basamak + + {*PLAYER*} lavların içinde yüzmeye kalkıştı - - Gümüşçün Taşı + + {*PLAYER*} bir duvarın içinde havasızlıktan boğuldu - - Gümüşçün Parke Taşı + + {*PLAYER*} boğuldu - - Gümüşçün Taşı Tuğlası + + Ölüm Mesajları - - Miselyum + + Artık denetleyici değilsin - - Nilüfer Yaprağı + + Artık uçabilirsin - - Dip Alem Tuğlası + + Artık uçamazsın - - Dip Alem Tuğlası Çiti + + Artık hayvanlara saldıramazsın - - Dip Alem Tuğlası Basamağı + + Artık hayvanlara saldırabilirsin - - Dip Alem Yumrusu + + Artık denetleyicisin - - Efsun Masası + + Artık yorulmazsın - - Simya Standı + + Artık hasar almazsın - - Kazan + + Artık hasar alabilirsin - - Son Portalı + + %d MYP - - Son Portalı Çerçevesi + + Artık yorulabilirsin - - Son Taşı + + Artık görünmezsin - - Ejderha Yumurtası + + Artık görünmez değilsin - - Çalı + + Artık oyunculara saldırabilirsin - - Eğrelti Otu + + Artık eşya kazabilir veya kullanabilirsin - - Kum Taşı Basamak + + Artık blok yerleştiremezsin - - Ladin Odunu Basamak + + Artık blok yerleştirebilirsin - - Huş Odunu Basamak + + Hareketli Karakter - - Orman Odunu Basamak + + Özel Görünüm Animasyonu - - Kızıltaş Lambası + + Artık eşya kazamaz veya kullanamazsın - - Kakao + + Artık kapıları ve düğmeleri kullanabilirsin - - Kafatası + + Artık yaratıklara saldıramazsın - - Geçerli Kontroller + + Artık yaratıklara saldırabilirsin - - Dizilim + + Artık oyunculara saldıramazsın - - Hareket Et/Koş + + Artık kapıları ve düğmeleri kullanamazsın - - Bak + + Artık konteynerleri kullanabilirsin. (Ör. Sandıklar) - - Duraklat + + Artık konteynerleri kullanamazsın. (Ör. Sandıklar) - - Zıpla + + Görünmez - - Zıpla/Yüksel + + Fenerler + + + {*T3*}NASIL OYNANIR : FENERLER{*ETW*}{*B*}{*B*} +Etkin Fenerler, gökyüzüne parlak bir ışın yansıtır ve yakındaki oyunculara güç verir.{*B*} +Cam, Obsidiyen ve Solgunu yok ederek ele geçirilebilecek Dip Yıldızı ile yapılırlar.{*B*}{*B*} +Fenerlerin gün boyunca güneş ışığı alacak şekilde Demir Piramitlerin, Altınların, Zümrütlerin ya da Elmasların üzerine yerleştirilmeleri gerekir.{*B*} +Fenerin üzerine yerleştirildiği malzemenin Fenerin gücüne etkisi yoktur.{*B*}{*B*} +Fener menüsünden Fenerin için bir adet birincil güç seçebilirsin. Piramidinin ne kadar katı varsa, o kadar fazla güç seçmen gerekir.{*B*} +En az dört katlı bir piramidin üzerindeki bir fener ayrıca, ikincil gücün yenilenmesi ya da birincil gücün daha da güçlendirilmesi seçeneklerini sunar.{*B*}{*B*} +Fenerinin güçlerini belirlerken, ödeme yuvasına bir Zümrüt, Elmas, Altın ya da Demir Külçe yerleştirmen gerekir. {*B*} +Ayarlandıktan sonra güçler süresiz şekilde Fenerden çıkmaya başlayacaktır.{*B*} + - - Envanter + + Havai Fişekler + + + Diller + + + Atlar + + + {*T3*}NASIL OYNANIR : ATLAR {*ETW*}{*B*}{*B*} +Atlar ve Eşekler, açık düzlüklerde bulunurlar. Katırlar, bir Eşek ve bir Attan meydana gelirler ancak kısırdırlar.{*B*} +Bütün yetişkin Atlara, Eşeklere ve Katırlara binilebilir. Buna karşın yalnızca Atlara zırh takılabilir ve yalnızca Katırlara ve Eşeklere eşya taşımaları için heybe takılabilir. {*B*}{*B*} +Atların, Eşeklerin ve Katırların, kullanılmadan önce evcilleştirilmeleri gerekir. Bir at, onu sürmeye çalışarak ve o sürücüsünü üzerinden atmaya çalışırken üzerinde kalmayı başararak evcilleştirilebilir.{*B*} +Atın etrafında Kalpler belirdiğinde evcilleştirilmiş demektir ve artık oyuncuyu üzerinden atmaya çalışmaz. Oyuncunun, atı yönlendirmek için ona bir Eyer takması gerekir.{*B*}{*B*} +Eyerler köylülerden alınabilir ya da dünyada saklı Sandıklarda bulunabilir.{*B*} +Evcilleştirilmiş Eşeklere ve Katırlara, çömelip bir Sandık takılarak Heybe verilebilir. Bunun ardından Heybelere bineği sürerken ya da çömelirken ulaşılabilir.{*B*}{*B*} +Atlar ve Eşekler (Katırlar hariç), Altın Elmalar ya da Altın Havuçlar kullanılarak beslenebilirler.{*B*} +Taylar, bir süre sonra yetişkin Atlara dönüşürler ancak onları Buğday veya Saman ile beslemek, daha hızlı büyümelerini sağlar.{*B*} + - - Elindeki Eşyayı Değiştir + + {*T3*}NASIL OYNANIR : HAVAİ FİŞEKLER{*ETW*}{*B*}{*B*} +Havai Fişekler, el ile ya da Fırlatıcılardan fırlatılabilen dekoratif eşyalardır. Kağıt, Barut ve isteğe bağlı olarak bir miktar Havai Fişek Yıldızı kullanılarak üretilirler.{*B*} +Üretim sırasında ek bileşenler de katılarak bir Havai Fişeğin renkleri, ortadan kaybolması, şekli, boyutu ve efektleri (izler ve patlamalar gibi) özelleştirilebilir.{*B*}{*B*} +Bir Havai Fişek üretmek için envanterinin üzerinde bulunan 3x3'lük üretim örgüsüne Barut ve Kağıt yerleştir.{*B*} +İsteğe bağlı olarak, Havai Fişeğe eklemek için üretim örgüsüne birden fazla Havai Fişek Yıldızı yerleştirebilirsin.{*B*} +Üretim örgüsündeki bölmelerden daha fazlasını Barut ile doldurmak, Havai Fişek Yıldızlarının patlayacağı yüksekliği artıracaktır.{*B*}{*B*} +Ardından üretilen Havai Fişeği çıkış bölmesinden alabilirsin.{*B*}{*B*} +Havai Fişek Yıldızları, üretim örgüsüne Barut ve Boya koyularak üretilebilir.{*B*} +- Boya, Havai Fişek Yıldızının patlama rengini belirler.{*B*} +- Bir Kor, Altın Külçe, Tüy ya da Yaratık Kellesi eklenerek Havai Fişek Yıldızının şekli ayarlanabilir.{*B*} +- Elmaslar ve Parıltı Taşı Tozu kullanılarak parıltı izi eklenebilir.{*B*}{*B*} +Bir Havai Fişek Yıldızı üretildikten sonra, Boya da katarak bir Havai Fişek Yıldızının ortadan kaybolma rengini belirleyebilirsin. + + + {*T3*}NASIL OYNANIR : DÜŞÜRÜCÜLER{*ETW*}{*B*}{*B*} +Kızıltaş ile güçlendirildiğinde Düşürücüler, içlerinde bulundurdukları rastgele bir eşyayı yere düşürürler. Düşürücüyü açmak için {*CONTROLLER_ACTION_USE*} düğmesini kullan ve ardından envanterindeki eşyalarla Düşürücüyü doldurabilirsin.{*B*} +Düşürücünün yönü bir Sandığa ya da başka türlü bir Konteynere doğruysa, eşya yere değil bunların içine düşecektir. Eşyaları belirli bir mesafenin uzağına iletmek için uzun Düşürücü zincirleri kurulabilir. Bu durumda alternatif olarak güç verilmeli ya da kesilmelidir. + + + Kullanıldığı zaman içinde bulunduğun dünyanın parçasının bir haritası halini alır ve sen keşfettikçe dolar. + + + Solgundan düşerler ve Fenerlerin yapımında kullanılırlar. + + + Huniler + + + {*T3*}NASIL OYNANIR: HUNİLER{*ETW*}{*B*}{*B*} +Huniler konteynerlere eşya yerleştirmek veya konteynerlerden eşya çıkarmak için ve içlerine atılan eşyaları otomatik olarak almak için kullanılır.{*B*} +Simya Stantlarının, Sandıkların, Fırlatıcıların, Düşürücülerin, Sandıklı Maden Arabalarının, Hunili Maden Arabalarının ve diğer Hunilerin üzerinde etkili olabilirler.{*B*}{*B*} +Huniler devamlı olarak üzerlerine yerleştirilmiş olan uygun konteynerlerden eşya çekmeyi denerler. Ayrıca depolanmış eşyaları bir çıkış konteynerine yerleştirmeye çalışırlar.{*B*} +Eğer bir Huni, Kızıltaşla güçlendirilirse, etkisiz hale gelir ve hem eşyaları çekmeyi hem de yerleştirmeyi durdurur.{*B*}{*B*} +Bir Huni eşyaları çıkarmaya çalıştığı yönü işaret eder. Bir Huniyi belli bir bloğa yönlendirmek istersen, gizlice ilerlerken Huniyi o bloğa karşı yerleştir.{*B*} + + + Düşürücüler - - Eylem + + KULLANILMADI - - Kullan + + Anında Sağlık - - Üretim + + Anında Hasar - - Bırak + + Zıplama Güçlendirici - - Sessizce İlerle + + Kazı Yorgunluğu - - Sessizce İlerle/Alçal + + Kuvvet - - Kamera Modunu Değiştir + + Zayıflık - - Oyuncular/Davet Et + + Bulantı - - Hareket (Uçarken) + + KULLANILMADI - - 1. Dizilim + + KULLANILMADI - - 2. Dizilim + + KULLANILMADI - - 3. Dizilim + + Yenilenme - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + Direnç - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + Dünya Üretimi için Oluşum bulunuyor. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + Etkinleştirildiğinde renkli patlamalar açığa çıkarır. Renk, etki, şekil ve parlaklık, Havai Fişek oluşturulduğu zaman Havai Fişek Yıldızı kullanılarak ayarlanır. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + Hunili Maden Arabalarına olanak sağlayan veya devre dışı bırakan ce Maden Arabalarını TNT ile patlatabilen özel bir ray türü. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + Kızıltaş yükü verildiğinde, eşyaları tutup bırakmayı veya başka bir konteynere aktarmak için kullanılır. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + Sertleştirilmiş Kil kullanılarak yapılan renkli bloklar. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Bir Kızıltaş gücü sağlar. Bu güç, plakada daha fazla eşya varsa daha da güçlenir. Hafif plakadan daha fazla ağırlık gerektirir. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + Bir kızıltaş güç kaynağı olarak kullanılır. Tekrar Kızıltaş haline getirilebilir. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Eşyaları yakalamak ve konteynerlere ya da konteynerlerden eşya aktarması yapmak için kullanılır. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + Atlara, Eşeklere ve Katırlara yedirilerek 10 kalp sağlık kazanmalarını sağlar. Sıpaların büyümesini hızlandırır. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + Yarasa - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + Uçan yaratıklar mağaralarda veya diğer geniş ve kapalı alanlarda bulunurlar. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + Cadı - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + Ocakta Kil eritilerek yapıldı. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + Cam ve boyadan yapıldı. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + Lekeli Camdan yapıldı - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + Bir Kızıltaş gücü sağlar. Bu güç, plakada daha fazla eşya varsa daha da güçlenir. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + Güneş ışığına (ya da güneş ışığının eksikliğine) bağlı olarak bir Kızıltaş sinyali çıkışı veren bir blok. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Bir Huni ile benzer işlevlere sahip özel bir Maden Arabası türü. Raylardaki ve üzerinde bulunan Konteynerlerden eşya alır. - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + Bir ata kuşatılabilen özel bir zırh türü. 5 Zırh sağlar. - - {*B*}Devam etmek için{*CONTROLLER_VK_A*} düğmesine bas. + + Bir havai fişeğin rengini, etkisini ve şeklini belirlemede kullanılır. - - {*B*}Eğitim bölümünü başlatmak için{*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Kendi başına oynamaya hazır olduğunu düşünüyorsan{*CONTROLLER_VK_B*} düğmesine bas. + + Sinyal kuvvetini sürdürmek, kıyaslamak ya da eksiltmek için, veya belirli blokları ölçmek için Kızıltaş devrelerinde kullanılır. - - Minecraft, hayal edebileceğin her şeyi inşa etmek amacıyla bloklar yerleştirmeye dayalı bir oyundur. Geceleri canavarlar ortaya çıkar, bu olmadan önce bir barınak inşa ettiğinden emin ol. + + Hareket eden bir TNT bloğu gibi işlev gören bir Maden Arabası türüdür. - - Yukarıya, aşağıya ve etrafa bakmak için{*CONTROLLER_ACTION_LOOK*} çubuğu kullan. + + Bir ata kuşatılabilen özel bir Zırh türü. 7 Zırh Sağlar. - - Hareket etmek için{*CONTROLLER_ACTION_MOVE*} çubuğu kullan. + + Komutların çalıştırılmasında kullanılırlar. - - Koşmak için, {*CONTROLLER_ACTION_MOVE*} çubuğu hızlıca iki kez ileriye ittir. {*CONTROLLER_ACTION_MOVE*} çubuğu ileride tutarken, karakter koşma süresi ya da gıdası tükenene dek koşmaya devam edecektir. + + Gökyüzüne bir ışın yansıtır ve yakındaki oyunculara Durum Etkilerini gösterir. - - Zıplamak için{*CONTROLLER_ACTION_JUMP*} düğmesine bas. + + İçinde blok ve eşya depolar. İki katı kapasiteye sahip daha büyük bir sandık oluşturmak için iki sandığı yan yana yerleştir. Ayrıca kilitli sandıklar açıldıklarında bir Kızıltaş gücü oluştururlar. - - Elini ya da elinde tuttuğun şeyi kullanarak kazmak ve kırmak için{*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut. Bazı blokları kazmak için alet üretmen gerekebilir... + + Bir ata kuşatılabilen özel bir Zırh türü. 11 Zırh Sağlar. - - 4 odun bloğu (ağaç gövdeleri) kırmak için{*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut.{*B*}Bir blok kırıldığında ortaya çıkan süzülen eşyanın yakınında durarak alırsan, envanterinde görünecektir. + + Yaratıkları oyuncuya veya çitli noktalara bağlamak için kullanılır - - Üretim arabirimini açmak için{*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. + + Dünyadaki yaratıkları isimlendirmek için kullanılır. - - Daha çok eşya toplayıp ürettikçe envanterin dolacaktır.{*B*} - Envanterini açmak için{*CONTROLLER_ACTION_INVENTORY*} düğmesine bas. + + Çabukluk - - Etrafta dolaştıkça, kazdıkça ve saldırdıkça gıda çubuğunu{*ICON_SHANK_01*} tüketirsin. Koşmak ve koşarken zıplamak normal şekilde yürümekten ve zıplamaktan çok daha fazla gıda harcar. + + Tüm Oyunun Kilidini Aç - - Sağlığının bir kısmını kaybedersen fakat gıda çubuğunda 9 ya da daha fazla{*ICON_SHANK_01*} varsa, sağlığın otomatik olarak dolacaktır. Gıda tüketmek gıda çubuğunu doldurur. + + Oyuna Devam Et - - Elinde gıda eşyası varken, onu yiyip gıda çubuğunu doldurmak için{*CONTROLLER_ACTION_USE*} düğmesini basılı tut. Gıda çubuğun doluysa yiyemezsin. + + Oyunu Kaydet - - Gıda seviyen düşük ve sağlık kaybettin. Gıda çubuğunu doldurup iyileşmeye başlamak için envanterindeki bifteği ye.{*ICON*}364{*/ICON*} + + Oyun Oyna - - Topladığın odundan keresteler üretilebilir. Bunun için üretim arabirimini aç.{*PlanksIcon*} + + Sıralama Tablosu - - Pek çok üretim birkaç aşamadan meydana gelebilir. Artık elinde kereste olduğuna göre bununla daha çok eşya üretebilirsin. Üretim masası yap.{*CraftingTableIcon*} + + Yardım & Seçenekler - - Blokları daha hızlı toplamak için işe uygun aletler yapabilirsin. Bazı aletlerin sopadan yapılma tutacakları vardır. Şimdi birkaç sopa üret.{*SticksIcon*} + + Zorluk: - - Elinde tuttuğun eşyayı değiştirmek için{*CONTROLLER_ACTION_LEFT_SCROLL*} ile{*CONTROLLER_ACTION_RIGHT_SCROLL*} düğmelerini kullan. + + PvP: - - Eşyaları kullanmak, nesnelerle etkileşime geçmek ve eşyaları yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullan. Yerleştirilen eşyalar doğru aletle kazılarak yeniden alınabilir. + + Oyunculara Güven: - - Üretim masası seçiliyken, artı imlecini istediğin yere doğrult ve{*CONTROLLER_ACTION_USE*} düğmesini kullanarak üretim masasını yerleştir. + + TNT: - - Artı imlecini üretim masasına doğrultup{*CONTROLLER_ACTION_USE*} düğmesine basarak aç. + + Oyun Türü: - - Kürek, toprak ile kar gibi yumuşak blokları daha hızlı kazmana yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir kürek yap.{*WoodenShovelIcon*} + + Yapılar: - - Balta, odun ile ahşap nesneleri daha hızlı kesmene yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir balta yap.{*WoodenHatchetIcon*} + + Seviye Türü: - - Kazma, taş ve cevher gibi sert blokları daha hızlı kazmana yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir kazma yap.{*WoodenPickaxeIcon*} + + Oyun Bulunamadı - - Konteyneri aç + + Sadece Davetle - - - Çabucak gece olabilir ve hazırlıksız şekilde dışarıda olmak tehlikeli olacaktır. Zırh ve silahlar üretebilirsin ancak güvenli bir barınağa sahip olmak daha mantıklıdır. - + + Daha Fazla Seçenek - - - Yakınlarda geceyi güvenli şekilde geçirmen için tamamlayabileceğin terk edilmiş bir Madenci barınağı var. - + + Yükle - - - Barınağı tamamlamak için kaynaklar toplamalısın. Duvarlar ve çatı her döşeme türü bloktan yapılabilir ancak kapı, birkaç pencere ve ışıklandırma da yerleştirmek isteyebilirsin. - + + Kurucu Seçenekleri - - Taş blok kazmak için kazmanı kullan. Taş bloklar kazıldığında parke taşı meydana getirir. 8 parke taşı toplarsan bir ocak yapabilirsin. Taşa ulaşmak için bir miktar toprak kazman gerekebilir, bunun için de küreğini kullan.{*StoneIcon*} + + Oyuncular/Davet - - Ocak yapmaya yetecek kadar parke taşı topladın. Şimdi üretim masanı kullanarak bir ocak üret. + + Çevrimiçi Oyun - - Dünya üzerinde bir yere ocağı yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullanıp ardından da ocağı aç. + + Yeni Dünya - - Bir miktar odun kömürü yapmak için ocağı kullan. Onu beklerken barınağı tamamlamak için daha çok malzeme toplayarak zamandan tasarruf etmeye ne dersin? + + Oyuncular - - Cam yapmak için ocağı kullan. Onu beklerken barınağı tamamlamak için daha çok malzeme toplayarak zamandan tasarruf etmeye ne dersin? + + Oyuna Katıl - - İyi bir barınağın bir de kapısı olur, bu sayede duvarları kazıp geri yerleştirmeden kolayca girip çıkabilirsin. Şimdi ahşap bir kapı üret.{*WoodenDoorIcon*} + + Oyuna Başla - - Kapıyı yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullan. Dünyadaki ahşap bir kapıyı açıp kapatmak için{*CONTROLLER_ACTION_USE*} düğmesini kullanabilirsin. + + Dünya Adı - - Geceleri çok karanlık olabileceğinden dolayı etrafını görebilmen için barınağının içine birkaç ışıklandırma yapman gerekecek. Şimdi sopalarla odun kömürünü kullanarak üretim arabiriminde bir meşale üret.{*TorchIcon*} + + Dünya Üreteci Tohumu + + + Rastgele bir tohum için boş bırak + + + Yangın Yayılır: + + + İmza mesajını düzenle: + + + Ekran görüntüsüne eklenecek detayları gir + + + Yazı + + + Oyun İçi Araç İpucu + + + 2 Oyunculu Yatay Kesilmiş Ekran + + + Tamam + + + Oyun için ekran görüntüsü + + + Etki Yok + + + Hız + + + Yavaşlık + + + İmza mesajını düzenle: + + + Klasik Minecraft kaplamaları, simgeleri ve kullanıcı arabirimi! + + + Tüm Birleşik Dünyaları Göster + + + İpuçları + + + Avatar Eşyası 1'i Yeniden Yükle + + + Avatar Eşyası 2'yi Yeniden Yükle + + + Avatar Eşyası 3'ü Yeniden Yükle + + + Temayı Baştan Yükle + + + Oyuncu Resmi 1'i Yeniden Yükle + + + Oyuncu Resmi 2'yi Yeniden Yükle + + + Seçenekler + + + Kullanıcı Arabirimi + + + Başlangıç Ayarlarına Dön + + + Sallantıyı Görüntüle + + + Ses + + + Kontrol + + + Görsel + + + İksir yapımında kullanılır. Öldüklerinde Fersizlerden düşer. + + + Öldüklerinde Zombi Domuzadamlardan düşer. Zombi Domuzadamlar, Dip Alem'de bulunabilir. İksir pişirmek için kullanılabilir. + + + İksir yapımında kullanılır. Bu, Dip Alem Kalelerinde doğal şekilde yetişirken bulunabilir. Ayrıca Ruh Kumunda da yetiştirilebilir. + + + Üzerinde yürürken kaydırır. Yok edildiğinde başka bir bloğun üstündeyse suya dönüşür. Bir ışık kaynağına yeterince yakınsa ya da Dip Alem'e yerleştirilirse erir. + + + Dekorasyon olarak kullanılabilir. + + + İksir yapımında ve Kalelerin yerini belirlemek için kullanılır. Dip Alem Kalelerinde ya da yakınlarında bulunma eğiliminde olan Alazlardan düşer. + + + Kullanıldığında, ne üzerinde kullanıldığına bağlı olarak, çeşitli etkiler gösterebilir. + + + İksir yapımında ya da Sonveren Gözü ve Magma Özü yapmak için diğer eşyalarla birlikte kullanılır. + + + İksir yapımında kullanılır. + + + İksirler ya da Atılabilen İksirler yapmak için kullanılır. + + + Suyla doldurulabilir ve Simya Standında iksir için başlangıç bileşeni olarak kullanılır. + + + Bu zehirli bir gıda ve simya eşyasıdır. Örümcek ya da Mağara Örümceği bir oyuncu tarafından öldürüldüğünde düşer. + + + Temel olarak olumsuz etkili iksirler yapmak için iksir yapımında kullanılır. + + + Yerleştirildiğinde zamanla büyür. Makas kullanarak toplanabilir. Merdiven gibi tırmanılabilir. + + + Kapıya benzer ancak esasen çitlerle kullanılır. + + + Kavun Dilimlerinden elde edilebilir. + + + Cam Bloklarına alternatif olarak kullanılabilecek saydam bloklar. + + + (Düğme, şalter, basınç levhası, kızıltaş meşalesi ya da kızıltaşlı başka bir eşya aracılığıyla) Enerji verildiğinde, önündeki blokları itebilecek durumdaysa piston dışarıya çıkar. Pistonun uzanan parçası geri gittiğinde beraberinde temas ettiği bloğu da çeker. + + + Taş bloklarından yapılmıştır ve genellikle Kalelerde bulunur. + + + Çitlere benzer şekilde engel olarak kullanılır. + + + Bal kabağı yetiştirmek için ekilebilir. + + + İnşa ve dekorasyon için kullanılabilir. + + + İçinden geçerken hareketi yavaşlatır. İp toplamak için makas kullanarak yok edilebilir. + + + Yok edildiğinde bir Gümüşçün canlandırır. Ayrıca saldırıya uğrayan başka bir Gümüşçünün yakınındaysa da Gümüşçün canlandırabilir. + + + Kavun yetiştirmek için ekilebilir. + + + Öldüğünde Sonveren Adamdan düşer. Fırlatıldığında oyuncuyu Sonveren İncisinin düştüğü konuma ışınlar ve sağlığının bir kısmını kaybettirir. + + + Üzerinde çimen yetişen bir toprak bloğu. Kürek kullanılarak toplanır. İnşa için kullanılabilir. + + + Su kovası kullanılarak ya da yağmur yağınca suyla doldurulabilir ve ardından Cam Şişeleri suyla doldurmak için kullanılabilir. + + + Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + + Dip Alem Kütlesinin ocakta eritilmesiyle elde edilir. Dip Alem Tuğlası blokları yapımında kullanılabilir. + + + Enerji verildiğinde ışığı emer. + + + Vitrine benzer ve içine yerleştirilen bloğu veya eşyayı gösterir. + + + Fırlatıldığında, adı geçen türdeki bir yaratığı canlandırabilir. + + + Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. + + + Kakao Çekirdekleri toplamak için ekilebilir. + + + İnek + + + Öldürüldüğünde deri bırakır. Ayrıca kovayla süt sağılabilir. + + + Koyun + + + Yaratık Kafaları dekorasyon amacıyla yerleştirilebilir ya da başlık yuvasında maske olarak kullanılabilir. + + + Kalamar + + + Öldürüldüğünde mürekkep keseleri bırakır. + + + Nesneleri tutuşturmak veya Fırlatıcıdan atılarak rastgele ateş yakmak için kullanılabilir. + + + Suda yüzer ve üzerinde yürünebilir. + + + Dip Alem Kaleleri inşa etmek için kullanılır. Fersizin ateş toplarından etkilenmez. + + + Dip Alem Kalelerinde kullanılır. + + + Fırlatıldığında Son Portalının yönünü gösterir. Bundan on iki tanesi Son Portalı Çerçevelerine yerleştirildiğinde Son Portalı etkinleşecektir. + + + İksir yapımında kullanılır. + + + Çimen Bloklarına benzer ancak üzerinde mantar yetiştirmeye çok uygundur. + + + Dip Alem Kalelerinde bulunur ve kırıldığında Dip Alem Yumrusu düşer. + + + Son'da bulunan bir blok türü. Çok yüksek bir patlama direncine sahip olduğundan inşa için kullanışlıdır. + + + Bu blok, Son'daki Ejderhanın yenilmesiyle oluşur. + + + Fırlatıldığında, toplanarak tecrübe puanı kazandıran Tecrübe Küreleri bırakır. + + + Oyuncuların Tecrübe Puanlarını kullanarak Kılıçları, Kazmaları, Baltaları, Kürekleri, Yayları ve Zırhları efsunlamalarını sağlar. + + + On iki adet Sonveren Gözü kullanılarak etkinleştirilebilir ve oyuncunun Son boyutuna gitmesini sağlar. + + + Son Portalını oluşturmak için kullanılır. + + + (Düğme, şalter, basınç levhası, kızıltaş meşalesi ya da kızıltaşlı başka bir eşya aracılığıyla) Enerji verildiğinde, önündeki blokları itebilecek durumdaysa piston dışarıya çıkar. + + + Ocakta kilden yapıldı. + + + Bir ocakta tuğla yapmak için kullanılabilir. + + + Kırıldığı zaman, ocakta pişirilerek tuğlaya dönüşen kil topları çıkartır. + + + Balta kullanılarak kesilir ve kereste haline getirilebilir veya yakacak olarak kullanılabilir. + + + Kumun ocakta eritilmesiyle elde edilir. İnşaat için kullanılabilir ancak kazmaya çalışırsan kırılacaktır. + + + Kazma ile taştan çıkartıldı. Taştan araçlar veya ocak yapmak için kullanılabilir. + + + Kartoplarını saklamanın kompakt yolu. + + + Yahni yapmak için kase ile birleştirilebilir. + + + Sadece elmastan bir kazma ile çıkartılabilir. Lav ve suyun birleşimiyle ortaya çıkar ve bir portal üretmek için kullanılabilir. + + + Dünyaya canavarlar çıkartır. + + + Kartopu yapmak için bir kürekle kazılabilir. + + + Kırıldığı zaman bazen buğday tohumu üretir. + + + Bir boya üretiminde kullanılabilir. + + + Bir kürek ile toplanır. Kazıldığı zaman bazen çakmak taşı üretir. Eğer altında başka bir blok yoksa yer çekiminden etkilenmektedir. + + + Kömür toplamak için bir kazma ile kazılabilir. + + + Laciverttaş toplamak için taş kazma veya daha iyisi ile kazılabilir. + + + Elmas toplamak için demir kazma veya daha iyisi ile kazılabilir. + + + Dekorasyon olarak kullanılır. + + + Demir kazma veya daha iyisi ile kazılabilir ve sonra ocakta eritilerek altın külçe yapılabilir. + + + Taş kazma veya daha iyisi ile kazılabilir ve sonra ocakta eritilerek demir külçe yapılabilir. + + + Kızıltaş tozu toplamak için demir kazma veya daha iyisi ile kazılabilir. + + + Bu kırılamaz. + + + Dokunduğu her şeyi ateşe verir. Bir kova içerisinde toplanabilir. + + + Bir kürek ile toplanır. Ocakta eritilerek cam yapılabilir. Eğer altında başka bir blok yoksa yer çekiminden etkilenmektedir. + + + Parke taşı toplamak için bir kazma ile kazılabilir. + + + Bir kürek ile toplanır. İnşaat için kullanılabilir. + + + Ekilebilir ve sonunda bir ağaca dönüşür. + + + Elektrik yükü taşıması için toprağa yerleştirilir. İksirle kaynatıldığı zaman etki süresini artırır. + + + İnek öldürerek toplanır ve zırh ya da kitap yapımında kullanılabilir. + + + Balçık öldürerek toplanır ve iksir pişirmek ya da Yapışkan Piston üretmek için kullanılabilir. + + + Tavuklardan rastgele olarak düşer ve gıda mamülleri yapımında kullanılabilir. + + + Çakıl taşı kazarak toplanır ve çakmaktaşı ile çelik yapımında kullanılabilir. + + + Bir domuz üstünde kullanıldığında domuza binmeni sağlar. Sonrasında da domuz Havuçlu Değnek kullanılarak yönlendirilebilir. + + + Kar kazarak toplanır ve fırlatılabilir. + + + Parıltı Taşı kazarak toplanır ve yine Parıltı Taşı blokları yapımında veya etkiyi artırmak üzere bir iksirle pişirmek için kullanılabilir. + + + Kimi zaman kırıldığında, yeniden ekilerek ağaç yetiştirmeyi sağlayan bir fidan düşebilir. + + + Zindanlarda bulunur, inşa ve dekorasyon için kullanılabilir. + + + Koyunun yününü kırpmak ve yaprak blokları toplamak için kullanılabilir. + + + İskelet öldürerek toplanır. Kemik tozu yapımında kullanılabilir. Evcilleştirmek amacıyla bir kurdu beslemek için kullanılabilir. + + + Bir İskeletin, Ürperten öldürmesini sağlayarak toplanır. Müzik kutusunda çalınabilir. + + + Ateşi söndürür ve mahsullerin büyümesine yardım eder. Kova ile toplanabilir. + + + Mahsullerden hasat edilir ve gıda eşyaları yapımında kullanılabilir. + + + Şeker üretmek için kullanılabilir. + + + Miğfer olarak giyilebilir veya Cadılar Bayramı Kabağı üretmek için bir meşale ile birleştirilebilir. Ayrıca Bal Kabağı Kekinin ana malzemesidir. + + + Ateşe verilirse sonsuza dek yanar. + + + Ekinler, tam olarak büyüyünce buğday toplamak için hasat edilebilir. + + + Tohum ekmek için hazırlanmış toprak. + + + Yeşil boya üretmek için ocakta pişirilebilir. + + + Üzerinden geçen her şeyin hareketini yavaşlatır. + + + Tavuk öldürerek toplanır ve ok yapımında kullanılabilir. + + + Ürperten öldürerek toplanır ve TNT yapımında ya da iksir pişirmede malzeme olarak kullanılabilir. + + + Mahsul yetiştirmek için ekim toprağına ekilebilir. Tohumların büyümesine yetecek kadar ışık olduğundan emin ol. + + + Portala girmek, Üstdünya ile Dip Alem arasında geçiş yapmanı sağlar. + + + Ocakta yakacak olarak ya da meşale yapımında kullanılır. + + + Örümcek öldürerek toplanır ve Yay ya da Olta yapımında kullanılabilir veya Tetikleyici Mekanizma yapmak için yere yerleştirilebilir. + + + Kırpıldığında (şayet önceden kırpılmamışsa) yün bırakır. Yününün farklı bir renk olması için boyanabilir. + + + İş Geliştirme + + + Portföy Yöneticisi + + + Ürün Müdürü + + + Geliştirme Ekibi + + + Oyun Çıkışı Yönetimi + + + Yönetmen, XBLA Yayıncılık + + + Pazarlama + + + Asya Yerelleştirme Ekibi + + + Kullanıcı Araştırma Ekibi + + + MGS Central Ekipleri + + + Topluluk Yöneticisi + + + Avrupa Yerelleştirme Ekibi + + + Redmond Yerelleştirme Ekibi + + + Tasarım Ekibi + + + Eğlence Yönetmeni + + + Müzik ve Sesler + + + Programlama + + + Baş Mimar + + + Sanat Geliştiricisi + + + Oyun Zanaatkarı + + + Sanat + + + Yapımcı + + + Test Yöneticisi + + + Baş Test Sorumlusu + + + Kalite Kontrol + + + Yönetici Yapımcı + + + Baş Yapımcı + + + Ara Hedef Kabulü Test Sorumlusu + + + Demir Kürek + + + Elmas Kürek + + + Altın Kürek + + + Altın Kılıç + + + Ahşap Kürek + + + Taş Kürek + + + Ahşap Kazma + + + Altın Kazma + + + Ahşap Balta + + + Taş Balta + + + Taş Kazma + + + Demir Kazma + + + Elmas Kazma + + + Elmas Kılıç + + + SDET + + + Proje STE + + + İlave STE + + + Özel Teşekkürler + + + Test Müdürü + + + Yardımcı Test Yöneticisi + + + Test Ortakları + + + Ahşap Kılıç + + + Taş Kılıç + + + Demir Kılıç + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + Geliştirici + + + Çarptığında patlayan alevli toplar atarlar. + + + Balçık + + + Hasar aldığında daha ufak Balçıklara bölünür. + + + Zombi Domuzadam + + + Başlangıçta uysaldır ancak birine saldırırsan grup olarak saldırırlar. + + + Fersiz + + + Sonveren Adam + + + Mağara Örümceği + + + Isırığı zehirlidir. + + + Möntar + + + Ona bakacak olursan sana saldırır. Ayrıca blokları başka yerlere taşır. + + + Gümüşçün + + + Saldırıya uğradığında yakında saklanan Gümüşçünleri çeker. Taş bloklarda saklanır. + + + Yakınında olduğunda saldırır. + + + Öldürüldüğünde domuz pirzolası bırakır. Eyer kullanılarak binilebilir. + + + Kurt + + + Uysaldır ancak saldırıya uğradığında karşılık verir. Kemik kullanılarak evcilleştirilebilir; böylelikle kurt gittiğin yerlere peşinden gelir ve saldırdığın her şeye o da saldırır. + + + Tavuk + + + Öldürüldüğünde tüy bırakır ve ayrıca rasgele olarak yumurtlar. + + + Domuz + + + Ürperten + + + Örümcek + + + Yakınında olduğunda saldırır. Duvarlara tırmanabilir. Öldürüldüğünde ip bırakır. + + + Zombi + + + Çok yaklaşırsan patlar! + + + İskelet + + + Sana ok atar. Öldürüldüğünde oklar bırakır. + + + Kaseyle kullanıldığında mantar yahnisi meydana getirir. Mantar bırakır ve kırpıldığında normal inek haline gelir. + + + Orijinal Tasarım ve Kodlama + + + Proje Müdürü/Yapımcısı + + + Mojang Ofisinin Kalanı + + + Konsept Sanatçısı + + + Hesaplamalar ve İstatistikler + + + Zalim Koordinatör + + + Baş Oyun Programcısı Minecraft PC + + + Müşteri Desteği + + + Ofis DJ'i + + + Tasarımcı/Programcı Minecraft - Cep Sürümü + + + Ninja Kodlayıcı - - Eğitimin ilk aşamasını tamamladın. - + + CEO - - - {*B*} - Eğitime devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Tek başına oynamak için hazır olduğunu düşünüyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Beyaz Yakalı İşçi - - - Bu senin envanterin. Elinde kullanılabilen eşyaları ve taşıdığın diğer her şeyi gösterir. Zırhın da burada gösterilir. - + + Patlayıcı Animatörü - - {*B*} - Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Envanteri nasıl kullanacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Son'da bulunan büyük siyah bir ejderhadır. - - - İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. İmlecin altındaki bir eşyayı almak için {*CONTROLLER_VK_A*} kullan. - Orada birden çok eşya varsa bu işlem hepsini alacaktır, {*CONTROLLER_VK_X*} ile sadece yarısını da alabilirsin. - + + Alaz - - - Bu eşyayı imleç ile envanterdeki başka bir boşluğa taşı ve {*CONTROLLER_VK_A*} ile yerleştir. - İmleçte birden fazla eşya varsa, {*CONTROLLER_VK_A*} ile hepsini yerleştir veya {*CONTROLLER_VK_X*} ile sadece birini yerleştir. - + + Dip Alem'de bulunan bu düşmanlar çoğunlukla Dip Alem Kalelerinin içindedir. Öldürüldüklerinde Alaz Çubukları bırakırlar. - - - İmleçte bir eşya varken imleci arabirimin dışına çıkarırsan, eşyayı bırakabilirsin. - + + Kar Golemi - - - Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_VK_BACK*} düğmesine bas. - + + Kar Golemi oyuncular tarafından kar blokları ile bal kabağı kullanılarak yapılır. Yaratıcısının düşmanlarına kartopu fırlatır. - - - Envanterden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. - + + Sonveren Ejderha - - - Burası yaratıcılık modu envanteridir. Elinde kullanılabilir olan eşyaları ve seçebileceğin diğer tüm eşyaları gösterir. - + + Magma Küpü - - {*B*} - Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Yaratıcılık modu envanterini nasıl kullanacağını zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Ormanlarda bulunabilir. Çiğ Balıkla beslenerek evcilleştirilebilir ama yanına gitmek yerine Oselonun sana yaklaşmasına izin vermelisin. Yapacağın ani bir hareket onu korkutup kaçıracaktır. - - - İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. - Eşya listesindeyken, imlecin altındaki bir eşyayı almak için {*CONTROLLER_VK_A*} düğmesine bas, istif halinde almak için ise {*CONTROLLER_VK_Y*} kullan. - + + Demir Golem - - - İmleç, otomatik olarak kullanım sırasındaki bir boşluğa geçecek. {*CONTROLLER_VK_A*} kullanarak eşyayı yerleştirebilirsin. Eşyayı yerleştirdikten sonra, imleç başka bir tane seçebilmen için eşya listesine dönecek. - + + Koruma amacıyla Köyde ortaya çıkar ve Demir Bloklar ile Bal Kabakları kullanılarak oluşturulabilir. - - - İmlecin üzerinde bir eşya varken imleci arabirimin dışına götürürsen, eşyayı dünyaya bırakabilirsin. Hızlı seçim çubuğundaki tüm eşyaları temizlemek için {*CONTROLLER_VK_X*} düğmesine bas. - + + Dip Alem'de bulunur. Balçığa benzer şekilde öldürüldüğünde daha ufak türlerine ayrılır. - - - {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} ile Grup Tipi sekmeleri arasından almak istediğin eşyanın grup tipini seç. - + + Köylü - - - Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_VK_BACK*} düğmesine bas. - + + Oselo - - - Yaratıcılık modu envanterinden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. - + + Efsun Masasının etrafına yerleştirildiği zaman daha güçlü efsunların yaratılmasına imkan tanır. - - - Burası üretim arabirimidir. Bu arabirim topladığın eşyaları birleştirip yeni eşyalar üretebilmeni sağlar. - + + {*T3*}NASIL OYNANIR : OCAK{*ETW*}{*B*}{*B*} +Ocak, eşyaları ısıtarak değiştirmeni sağlar. Örneğin, ocak kullanarak demir cevherini demir külçelere dönüştürebilirsin.{*B*}{*B*} +Ocağı yerleştirip kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*B*}{*B*} +Ocağın altına bir miktar yakacak, üstüne de ısıtılacak eşyayı koymalısın. Bunları yaptıktan sonra ocak alev alacak ve çalışmaya başlayacak.{*B*}{*B*} +Eşyalar son halini aldığında, onları çıktı bölümünden alarak envanterine yerleştirebilirsin.{*B*}{*B*} +İmlecin ucundaki eşya bir bileşen ya da yakacak ise, o eşyayı hızlıca ocağa taşımanı sağlayan bir araç ipucu gösterilecektir. + - - {*B*} - Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Üretimi nasıl yapacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + {*T3*}NASIL OYNANIR : FIRLATICI{*ETW*}{*B*}{*B*} +Fırlatıcı, eşyaları fırlatmak için kullanılır. Fırlatıcıyı tetiklemek için yanına bir devre anahtarı, örneğin bir şalter yerleştirilmesi gerekmektedir.{*B*}{*B*} +Fırlatıcıyı eşya ile doldurmak için {*CONTROLLER_ACTION_USE*} düğmesine bas, sonra fırlatmak istediğin eşyaları envanterinden alarak fırlatıcıya ekle.{*B*}{*B*} +Bundan sonra devre anahtarını kullandığında, fırlatıcı eşyayı fırlatacaktır. + - - {*B*} - Eşya açıklamasını göstermek için {*CONTROLLER_VK_X*} düğmesine bas. - + + {*T3*}NASIL OYNANIR : İKSİR YAPIMI{*ETW*}{*B*}{*B*} +İksir yapımı için, üretim masasından üretilebilen bir Simya Standı gerekmektedir. Her iksirin yapımına, Cam Şişenin bir Kazandan veya bir su kaynağından doldurulmasıyla elde edilen bir şişe su ile başlanır.{*B*} +Simya Standının şişeler için üç yuvası bulunmaktadır, böylece aynı anda üç iksir yapılabilir. Tek bir malzeme üç şişe için de kullanılabilir, yani kaynaklarını en iyi şekilde kullanmak için aynı anda üç iksir üretmeye bak.{*B*} +Simya Standının en üstüne bir iksir malzemesi koymak, kısa bir süre sonra iksirin temelinin oluşmasını sağlar. Bunun tek başına bir etkisi yoktur ancak iksir temeliyle başka bir malzemeyi karıştırmak, iksire bir etki kazandırır.{*B*} +İksiri hazırladıktan sonra, üçüncü bir malzeme ekleyerek iksirin daha uzun ömürlü (Kızıltaş Tozuyla), daha yoğun (Parıltı Taşı Tozuyla) ya da zararlı (Mayalanmış Örümcek Gözüyle) olmasını sağlayabilirsin.{*B*} +Ayrıca herhangi bir iksire barut ekleyerek onu Fırlatılabilir İksire dönüştürebilirsin. Fırlatılabilir İksir, fırlatıldığı zaman çarptığı noktada etkisini belirli bir alana yayar.{*B*} + +İksirler için gereken temel malzemeler şunlardır:{*B*}{*B*} +* {*T2*}Dip Alem Yumrusu{*ETW*}{*B*} +* {*T2*}Örümcek Gözü{*ETW*}{*B*} +* {*T2*}Şeker{*ETW*}{*B*} +* {*T2*}Fersiz Gözyaşı{*ETW*}{*B*} +* {*T2*}Alaz Tozu{*ETW*}{*B*} +* {*T2*}Magma Özü{*ETW*}{*B*} +* {*T2*}Parıldayan Kavun{*ETW*}{*B*} +* {*T2*}Kızıltaş Tozu{*ETW*}{*B*} +* {*T2*}Parıltı Taşı Tozu{*ETW*}{*B*} +* {*T2*}Mayalanmış Örümcek Gözü{*ETW*}{*B*}{*B*} + +Yapabileceğin bütün farklı iksirleri öğrenmek için bileşenlerle çeşitli kombinasyonlar denemelisin. + + - - {*B*} - Geçerli eşyayı yapmak için gereken bileşenleri görmek için {*CONTROLLER_VK_X*} düğmesine bas. - + + {*T3*}NASIL OYNANIR : GENİŞ SANDIK{*ETW*}{*B*}{*B*} +Yan yana yerleştirilen iki sandık, tek bir Geniş Sandık oluşturur. Bu sandık çok daha fazla eşya alabilir.{*B*}{*B*} +Normal sandıkla aynı şekilde kullanılır. + - - {*B*} - Envanteri tekrar görmek için {*CONTROLLER_VK_X*} düğmesine bas. - + + {*T3*}NASIL OYNANIR : ÜRETİM{*ETW*}{*B*}{*B*} +Üretim arabiriminde, yeni eşyalar üretmek için envanterindeki eşyaları birleştirebilirsin. Üretim arabirimini açmak için {*CONTROLLER_ACTION_CRAFTING*} düğmesini kullan.{*B*}{*B*} +{*CONTROLLER_VK_LB*} tuşuyla sekmeler arasında gezin ve {*CONTROLLER_VK_RB*} tuşuyla üretimde kullanmak istediğin eşya türünü, {*CONTROLLER_MENU_NAVIGATE*} çubuğuyla da eşyayı seç.{*B*}{*B*} +Üretim alanı, yeni eşyayı üretebilmek için gereken eşyaları gösterir. Eşyayı üretmek ve envanterine koymak için {*CONTROLLER_VK_A*} düğmesine bas. + - - - {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} kullanarak yukarıdaki Grup Tipleri sekmelerine bak ve üretmek istediğin eşyanın grup tipini seç, sonra da üretmek istediğin eşyayı {*CONTROLLER_MENU_NAVIGATE*} ile seç. - + + {*T3*}NASIL OYNANIR : ÜRETİM MASASI{*ETW*}{*B*}{*B*} +Üretim Masası kullanarak daha büyük eşyalar üretebilirsin.{*B*}{*B*} +Masayı yerleştir ve kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*B*}{*B*} +Masa üzerinde üretim, basit üretim ile aynı şekilde çalışır ama daha geniş bir üretim alanına ve eşya yelpazesine sahip olursun. + + + {*T3*}NASIL OYNANIR : EFSUN{*ETW*}{*B*}{*B*} +Tecrübe Puanları, yaratıkların öldürülmesiyle, belirli blokların kazılmasıyla veya ocakta eritilmesiyle kazanılır ve bazı araçlar, silahlar, zırhlar ve kitaplar efsunlamak için kullanılabilir.{*B*} +Bir Kılıç, Yay, Balta, Kazma, Kürek, Zırh veya Kitap, Efsun Masasında kitabın altındaki yuvaya yerleştirildiğinde, yuvanın sağındaki üç düğme bir takım efsunlar ve gereken Tecrübe Seviyelerini gösterecektir.{*B*} +Eğer bu efsunları kullanmak için yeterli Tecrübe Seviyen yoksa düğmeler kırmızı, varsa yeşil yanacaktır.{*B*}{*B*} +Uygulanan asıl efsun, gösterilen bedele bağlı olarak rastgele seçilir.{*B*}{*B*} +Eğer Efsun Masasının etrafında Kitap Rafları bulunuyorsa (maksimum 15 Kitap Rafı) ve Kitaplık ile Efsun Masasının arasında bir blokluk boşluk varsa, efsunların etkisi artacaktır ve Efsun Masasındaki kitaptan büyülü gliflerin çıktığı görülecektir.{*B*}{*B*} +Efsun masası için gereken tüm malzemeler dünyadaki köylerde halihazırda veya kazı ya da keşif yaparak bulunabilir.{*B*}{*B*} +Efsunlu Kitaplar, eşyalara efsun uygulamak üzere örste kullanılır. Bu sayede eşyalarına uygulamak istediğin efsunlar üzerinde daha fazla kontrolün olur.{*B*} + + + {*T3*}NASIL OYNANIR : BÖLÜM YASAKLAMAK{*ETW*}{*B*}{*B*} +Eğer oynadığın bölümde rahatsız edici bir içerikle karşılaşırsan, o bölümü Yasaklı Bölümler listene ekleyebilirsin. +Bunu yapmak için Duraklatma menüsünü açın ve {*CONTROLLER_VK_RB*} düğmesine basarak Bölüm Yasaklamayı seçin. +İleride bu bölüme tekrar girmek isterseniz, bölümün Yasaklı Bölümler listenizde olduğuna dair bir uyarı alacaksınız ve dilerseniz bölümü listeden kaldırıp devam edebilecek ya da bölüme girmekten vazgeçebileceksiniz. + + + {*T3*}NASIL OYNANIR : KURUCU VE OYUNCU SEÇENEKLERİ{*ETW*}{*B*}{*B*} +{*T1*}Oyun Seçenekleri{*ETW*}{*B*} +Bir dünyayı yüklerken veya oluştururken, oyun üzerindeki hakimiyetinizi artıracak bir menüye "Daha Fazla Seçenek" düğmesine basarak ulaşabilirsin.{*B*}{*B*} + {*T2*}Oyuncuya Karşı Oyuncu{*ETW*}{*B*} + Bu seçenek etkinleştirildiğinde, oyuncular diğer oyunculara hasar verebilir. Bu seçenek sadece Sağ Kalma Modunda etkilidir.{*B*}{*B*} + {*T2*}Oyunculara Güven{*ETW*}{*B*} + Bu seçenek kapatılınca, oyuna katılan oyuncuların yapabileceği şeyler kısıtlanır. Kazamaz veya eşya kullanamaz, blok yerleştiremez, kapı ve düğmeleri kullanamaz, konteynerleri kullanamaz, oyunculara veya hayvanlara saldıramazlar. Bu seçeneği belli bir oyuncu üstünde oyun içi menüsünü kullanarak değiştirebilirsin.{*B*}{*B*} + {*T2*}Ateş Yayılması{*ETW*}{*B*} + Etkinleştirildiğinde, ateş yakındaki yanıcı bloklara sıçrayabilir. Bu seçenek oyun içindeyken de değiştirilebilir.{*B*}{*B*} + + {*T2*}TNT Patlaması{*ETW*}{*B*} + Etkinleştirildiğinde, TNT patlatıldığında infilak eder. Bu seçenek oyun içindeyken de değiştirilebilir.{*B*}{*B*} + {*T2*}Kurucu Ayrıcalıkları{*ETW*}{*B*} + Etkinleştirildiğinde, oyun kurucusu uçabilir, yorgunluğu kaldırabilir ve kendisini görünmez yapabilir. Bu seçenek kupaları ve sıralama tablosu güncellemelerini iptal eder, bu seçenek açıkken kaydedilirse tekrar yüklendiğinde de bu böyle devam eder. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}Gün Işığı Döngüsü{*ETW*}{*B*} + Kapatıldığında günün vakti değişmez.{*B*}{*B*} + {*T2*}Envanteri Koru{*ETW*}{*B*} + Açıldığında oyuncular öldükleri zaman envanterlerini korurlar.{*B*}{*B*} + {*T2*}Yaratık Canlanması{*ETW*}{*B*} + Kapatıldığında, yaratıklar doğal şekilde canlanmazlar.{*B*}{*B*} + {*T2*}Yaratık Hasarı{*ETW*}{*B*} + Kapatıldığında, canavarların ve hayvanların blokları değiştirmesini (örneğin Ürperten patlayınca bloklar zarar görmez ve Koyun çimenleri yok etmez) ya da eşyaları almasını engeller.{*B*}{*B*} + {*T2*}Yaratık Ganimetleri{*ETW*}{*B*} + Kapatıldığında canavarlar ve hayvanlar ganimet düşürmezler (örneğin Ürpertenler barut düşürmezler).{*B*}{*B*} + {*T2*}Döşeme Parçaları{*ETW*}{*B*} + Kapatıldığında bloklar yok oldukları zaman eşya düşürmezler (örneğin Taş bloklar parke taşı düşürmezler).{*B*}{*B*} + {*T2*}Doğal Yenilenme{*ETW*}{*B*} + Kapatıldığında oyuncular sağlıklarını doğal olarak yenileyemezler.{*B*}{*B*} +{*T1*}Dünya Üretme Seçenekleri{*ETW*}{*B*} +Yeni bir dünya oluştururken bazı ek seçenekler vardır.{*B*}{*B*} + {*T2*}Yapı Üret{*ETW*}{*B*} + Etkinleştirildiğinde, dünyada Köyler ve Kaleler gibi yapılar üretilir.{*B*}{*B*} + {*T2*}Aşırı Düz Dünya{*ETW*}{*B*} + Etkinleştirildiğinde, Üstdünya ve Dip Alem'de tamamen düz bir dünya üretilir.{*B*}{*B*} + {*T2*}Bonus Sandık{*ETW*}{*B*} + Etkinleştirildiğinde, oyuncu canlanma noktalarının yakınında faydalı eşyalar içeren bir sandık meydana gelir.{*B*}{*B*} + {*T2*}Dip Alemi Sıfırla{*ETW*}{*B*} + Etkinleştirildiğinde, Dip Alem yeniden yaratılacaktır. Dip Alem Kalelerinin yer almadığı eski kayıtlara sahipsen, bu seçenek faydalıdır.{*B*}{*B*} +{*T1*}Oyun İçi Seçenekleri{*ETW*}{*B*} +Oyundayken bir dizi seçeneği içeren oyun içi menüsüne {*BACK_BUTTON*} düğmesine basarak erişebilirsin.{*B*}{*B*} + {*T2*}Oyun Kurucusu Seçenekleri{*ETW*}{*B*} + Oyun kurucu oyuncu veya denetleyici olarak atanan oyuncular "Oyun Kurucusu Seçenekleri" menüsüne ulaşabilir. Bu menüden ateşin yayılması ve TNT paylaması açılıp kapatılabilir.{*B*}{*B*} +{*T1*}Oyuncu Seçenekleri{*ETW*}{*B*} +Bir oyuncunun ayrıcalıklarını değiştirmek için, adını seçin ve oyuncu ayrıcalıkları menüsünü açmak için {*CONTROLLER_VK_A*} düğmesine basın. Buradan aşağıdaki seçenekler kullanılabilir.{*B*}{*B*} + {*T2*}İnşa Edebilir ve Kazabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek açıkken, oyuncu dünyayla normal bir etkileşim halindedir. Devre dışı bırakıldığında, oyuncu blok yerleştiremez veya yok edemez veya birçok eşya ve blokla etkileşime geçemez.{*B*}{*B*} + {*T2*}Kapıları ve Düğmeleri Kullanabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu kapıları ve düğmeleri kullanamaz.{*B*}{*B*} + {*T2*}Konteynerleri Açabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu sandıklar gibi konteynerleri açamaz.{*B*}{*B*} + {*T2*}Oyunculara Saldırabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek kapalıyken, oyuncu diğer oyunculara hasar veremez.{*B*}{*B*} + {*T2*}Hayvanlara Saldırabilir{*ETW*}{*B*} + Bu seçenek sadece "Oyunculara Güven" kapalıyken mevcuttur. Bu seçenek devre dışı iken, oyuncu hayvanlara hasar veremez.{*B*}{*B*} + {*T2*}Denetleyici{*ETW*}{*B*} + Bu seçenek etkinken, oyuncu diğer oyuncuların ayrıcalıklarını değiştirebilir (oyun kurucusu hariç) eğer "Oyunculara Güven" kapalıysa, oyuncuları atabilir veya ateşin yayılması ve TNT patlaması seçeneklerini açıp kapatabilir.{*B*}{*B*} + {*T2*}Oyuncuyu At{*ETW*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} +{*T1*}Oyun Kurucusu Seçenekleri{*ETW*}{*B*} +Eğer "Oyun Kurucusu Ayrıcalıkları" açıksa oyuncu kendisi için bazı ayrıcalıkları değiştirebilir. Bir oyuncunun ayrıcalıklarını değiştirmek için, onun adını seç ve oyuncu ayrıcalıkları menüsünü açmak için {*CONTROLLER_VK_A*} düğmesine bas. Buradan aşağıdaki seçenekleri değiştirebilirsin.{*B*}{*B*} + {*T2*}Uçabilir{*ETW*}{*B*} + Bu seçenek açıkken, oyuncu uçabilir. Bu seçenek sadece Sağ Kalma Modunda vardır, çünkü Yaratıcılık Modunda tüm oyuncular uçabilir.{*B*}{*B*} + {*T2*}Yorulmayı Kaldır{*ETW*}{*B*} + Bu seçenek sadece Sağ Kalma Modunu etkiler. Açıkken, fiziksel etkinlikler (yürüme/koşma/zıplama vs.) yiyecek çubuğunu azaltmaz. Ancak, oyuncu yaralanınca, yiyecek çubuğu oyuncu iyileştiği sürece azalır.{*B*}{*B*} + {*T2*}Görünmez{*ETW*}{*B*} + Bu seçenek açıkken oyuncu diğer oyunculara görünmez olur ve hasar almaz.{*B*}{*B*} + {*T2*}Işınlanabilir{*ETW*}{*B*} + Bu seçenek oyuncuların diğerlerini ya da kendilerini dünyadaki diğer oyunculara taşımasını sağlar. + + + Sonraki Sayfa + + + {*T3*}NASIL OYNANIR : ÇİFTLİK HAYVANLARI{*ETW*}{*B*}{*B*} +Eğer hayvanlarını tek bir yerde tutmak istiyorsan, 20x20 bloktan daha ufak bir alanı çitle kapat ve hayvanlarını içine sok. Böylece geri geldiğinde hayvanların hâlâ orada olacak. + + + + {*T3*}NASIL OYNANIR : DAMIZLIK HAYVANLAR{*ETW*}{*B*}{*B*} +Minecraft'taki hayvanlar çoğalabilir ve kendilerine benzeyen yavrular yapabilir!{*B*} +Hayvanların yavrulamasını sağlamak için, onları 'Aşk Moduna' sokacak doğru yiyecekle beslemen gerekiyor.{*B*} +İneğe, möntara veya koyuna buğday verirsen, domuza havuç verirsen; tavuğa Buğday Tohumu veya Dip Alem Yumrusu; kurda ise herhangi bir et verirsen, yakınlarda Aşk Modunda olan aynı türden başka bir hayvan aramaya başlayacaktır.{*B*} +Aynı türdeki iki hayvan bir araya gelince, eğer Aşk Modundalarsa, birkaç saniyeliğine öpüştükten sonra ortaya bir yavru çıkacaktır. Yavru hayvan, büyüyüp gerçek boyutlarda bir hayvan olana kadar anne babasını takip eder.{*B*} +Aşk Modundaki bir hayvanın, tekrar Aşk Moduna girebilmesi için en az beş dakika beklemesi gerekmektedir.{*B*} +Her dünya için belirli bir hayvan sınırı vardır, bu yüzden çok sayıda hayvana ulaşınca hayvanların artık yavrulamazlar. + + + {*T3*}NASIL OYNANIR : DİP ALEM PORTALI{*ETW*}{*B*}{*B*} +Dip Alem Portalı, oyuncunun Üstdünya ve Dip Alem arasında gezinebilmesini sağlar. Dip Alem, Üstdünya'da daha hızlı hareket edebilmek için kullanılabilir. Dip Alem'de gidilen 1 blok, Üstdünya'da 3 bloğa eşittir, yani Dip Alem'de inşa ettiğin bir portaldan çıkarsan, kendini giriş noktana göre üç katı uzakta bulursun.{*B*}{*B*} +Portalı inşa edebilmek için en az 10 Obsidiyen bloğu gerekmektedir. Portal 5 blok yüksekliğinde, 4 blok genişliğinde ve 1 blok derinliğinde olmalıdır. Portal Çerçevesi yapıldıktan sonra, çerçevenin içerisindeki boşluk, aktifleşebilmesi için yakılmalıdır. Bu işlem, Çakmak Taşı ve Çelik eşyası ya da Kor ile gerçekleştirilebilir.{*B*}{*B*} +Portal inşasına ait örnek resimler sağ tarafta bulunabilir. + + + {*T3*}NASIL OYNANIR : SANDIK{*ETW*}{*B*}{*B*} +Bir Sandık ürettiğin zaman, onu bu dünyaya yerleştirebilir ve envanterindeki eşyaları depolamak üzere {*CONTROLLER_ACTION_USE*} düğmesine basarak kullanabilirsin.{*B*}{*B*} +Envanterin ve sandık arasında eşyaları taşımak için imlecini kullan.{*B*}{*B*} +Sandıktaki eşyalar, sen onları tekrar envanterine geçirene kadar orada saklanır. + + + Minecon'a geldin mi? + + + Mojang'ta hiç kimse daha önce Junkboy'un yüzünü görmedi. + + + Bir Minecraft Viki'sinin olduğunu biliyor muydun? + + + Böceklere doğrudan bakma. + + + Ürpertenler, bir kodlama hatası sonucu ortaya çıktı. - - - Üretim alanı, yeni eşyalar üretmek için gereken bileşenleri gösterir. Eşyayı üretip envanterine yerleştirmek için {*CONTROLLER_VK_A*} düğmesine bas. - + + Bu bir tavuk mu yoksa bir ördek mi? - - - Bir üretim masası kullanarak daha çok eşya üretebilirsin. Masada üretim yapmak normal üretim ile benzerdir ama daha geniş bir üretim alanın olduğu için daha çok bileşen kombinasyonu deneyebilirsin. - + + Mojang'ın yeni ofisi oldukça havalı! - - - Üretim arabiriminin sağ alt kısmı envanterini gösterir. Bu alan aynı zamanda şu an seçili olan eşyanın açıklamasını ve onu üretmek için gereken bileşenleri belirtir. - + + {*T3*}NASIL OYNANIR : TEMEL ÖĞELER{*ETW*}{*B*}{*B*} +Minecraft, aklınıza gelen her şeyi bloklarla inşa edebileceğiniz bir oyundur. Geceleri canavarlar ortaya çıkarlar ve onlardan korunmak için barınak inşa etmeniz gerekmektedir.{*B*}{*B*} +Etrafa bakınmak için {*CONTROLLER_ACTION_LOOK*} düğmesini kullan.{*B*}{*B*} +Etrafta dolaşmak için {*CONTROLLER_ACTION_MOVE*} çubuğunu kullan.{*B*}{*B*} +Zıplamak için {*CONTROLLER_ACTION_JUMP*} düğmesini kullan.{*B*}{*B*} +Koşmak için hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki defa ileri it. {*CONTROLLER_ACTION_MOVE*} çubuğunu iterken karakter, koşma süresi sona erene veya Yiyecek Göstergesi {*ICON_SHANK_03*} değerinden az gösterene dek koşmaya devam edecektir.{*B*}{*B*} +Çıplak elinle veya elindeki aletle kazı yapmak için {*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut. Bazı blokları kazabilmek için belirli aletlere ihtiyacın olabilir.{*B*}{*B*} +Eğer elinde bir eşya tutuyorsan, o eşyayı kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine, yere bırakmak için {*CONTROLLER_ACTION_DROP*} düğmesine bas. - - - Seçili olan eşyanın açıklaması gösteriliyor. Açıklama eşyanın ne amaçla kullanılabileceğine dair bir fikir verebilir. - + + {*T3*}NASIL OYNANIR : GÖSTERGE{*ETW*}{*B*}{*B*} +Gösterge, durumun hakkında bilgileri gösterir: sağlığın, su altındayken kalan oksijen miktarın, açlık seviyen (bunu yenilemek için bir şeyler yemelisin) ve eğer giymişsen zırhın. Eğer sağlığından biraz kaybedersen ama yiyecek çubuğunda 9 veya daha fazla {*ICON_SHANK_01*} varsa, sağlığın otomatik olarak yenilenecektir. Yiyecek tüketmek ise yiyecek çubuğunu yeniler.{*B*} +Tecrübe çubuğu da burada yer alır, üzerinde Tecrübe Seviyeni gösteren numaralar vardır ve bir sonraki Tecrübe Seviyesi için ne kadar Tecrübe Puanına ihtiyaç duyduğun da burada gösterilir. Tecrübe Puanları, yaratıkların öldükleri zaman düşürdükleri Tecrübe Kürelerinin toplanmasıyla, belirli blokların kazılmasıyla, hayvanların yetiştirilmesiyle, balıkçılıkla ve ocakta cevherlerin eritilmesiyle kazanılır.{*B*}{*B*} +Gösterge ayrıca kullanılabilir eşyaları gösterir. Elindeki eşyayı değiştirmek için {*CONTROLLER_ACTION_LEFT_SCROLL*} ve {*CONTROLLER_ACTION_RIGHT_SCROLL*} tuşlarını kullan. - - - Seçili eşyayı üretmek için gerekli bileşenler gösteriliyor. - + + {*T3*}NASIL OYNANIR : ENVANTER{*ETW*}{*B*}{*B*} +Envanterine bakmak için {*CONTROLLER_ACTION_INVENTORY*} düğmesini kullan.{*B*}{*B*} +Bu ekran, elindeki kullanılabilir eşyaları ve taşıdığın diğer tüm eşyaları göstermektedir. Ayrıca zırhın da burada gösterilir.{*B*}{*B*} +İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} çubuğunu kullan. İmlecin ucundaki eşyayı almak için {*CONTROLLER_VK_A*} düğmesine bas. Eğer birden fazla eşya bulunuyorsa, bu eylem hepsini birden almanı sağlar. Sadece yarısını almak istiyorsan {*CONTROLLER_VK_X*} düğmesini kullan.{*B*}{*B*} +Eşyayı imleçle envanterdeki başka bir boşluğa götürerek oraya yerleştirmek için {*CONTROLLER_VK_A*} düğmesini kullan. İmlecin ucunda birden fazla eşya varsa, hepsini yerleştirmek için {*CONTROLLER_VK_A*}, sadece bir tanesini yerleştirmek için {*CONTROLLER_VK_X*} düğmesine bas.{*B*}{*B*} +Eğer bu eşya bir zırh ise, onu hızlıca envanterdeki zırh yuvasına taşımanı sağlayan bir araç ipucu gösterilecektir.{*B*}{*B*} +Deri Zırhının rengini, onu boyayarak değiştirmen mümkündür. Envanter menüsünde, imlecin ucunda boyayı tutup, boyamak istediğin şeyin üzerine getirip {*CONTROLLER_VK_X*} düğmesine basarak bu işlemi gerçekleştirebilirsin. - - Topladığın odunlardan kalas üretilebilir. Kalas simgesini seç ve {*CONTROLLER_VK_A*} düğmesine basarak üret.{*PlanksIcon*} + + Minecon 2013, Orlando, Florida, ABD'de gerçekleştirildi! - - - Artık bir üretim masan olduğuna göre onu dünyaya yerleştirip daha fazla eşya üretmeye başlayabilirsin.{*B*} - Üretim arabiriminden çıkmak için {*CONTROLLER_VK_B*} düğmesine bas. - + + .party() mükemmeldi! - - - Üretmek istediğin eşyaların grup tiplerini değiştirmek için {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} düğmesine bas. Araçlar grubunu seç.{*ToolsIcon*} - + + Söylentilere her zaman yalan oldukları gözüyle bakın, doğru oldukları değil! - - - Üretmek istediğin eşyaların grup tipini değiştirmek için {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} düğmesine bas. Yapının grubunu seç.{*StructuresIcon*} - + + Önceki Sayfa - - - Üretmek istediğin eşyayı değiştirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. Bazı eşyaların kullanılan malzemeye göre değişen farklı türleri vardır. Ahşap küreği seç.{*WoodenShovelIcon*} - + + Ticaret - - - Birçok üretim için birçok adım gerekir. Artık biraz keresten olduğuna göre üretebileceğin daha çok eşya var. Üretmek istediğin eşyayı değiştirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. Üretim masasını seç.{*CraftingTableIcon*} - + + Örs - - - Yaptığın aletler sayesinde iyi bir başlangıç yaptın ve çeşitli birçok malzemeyi daha etkili bir şekilde toplayabileceksin.{*B*} - Üretim arabiriminden çıkmak için şimdi {*CONTROLLER_VK_B*} bas. - + + Son - - - Bazı eşyalar üretim masası kullanılarak üretilemez, bunlar için ocak gerekir. Şimdi bir ocak yapın.{*FurnaceIcon*} - + + Bölüm Yasaklamak - - - Ürettiğin ocağı dünyaya yerleştir. Bunu sığınağının içine koysan iyi olur.{*B*} - Üretim arabiriminden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. - + + Yaratıcılık Modu - - - Burası ocak arabirimi. Ocak sayesinde eşyaları eriterek değiştirebilirsin. Örneğin, ocakta demir cevheri eritip onları demir külçelerine çevirebilirsin. - + + Kurucu ve Oyuncu Seçenekleri - - {*B*} - Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Ocağı nasıl kullanacağını zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + {*T3*}NASIL OYNANIR : SON{*ETW*}{*B*}{*B*} +Son, oyundaki boyutlardan biridir ve aktif bir Son Portalı ile ulaşılabilir. Son Portalı, Üstdünya'nın derinliklerinde yer alan bir Kalenin içinde bulunabilir.{*B*} +Son Portalını aktifleştirmek için, herhangi bir Son Portalı Çerçevesinin içine Sonveren Gözü koyman gerekir.{*B*} +Portal aktifleştirildiği zaman içine girerek Son boyutuna geçebilirsin.{*B*}{*B*} +Son boyutunda, vahşi ve güçlü bir düşman olan Sonveren Ejderha ve bir sürü Sonveren Adam ile karşılaşacaksın, bu yüzden oraya gitmeden önce iyice hazırlansan iyi edersin!{*B*}{*B*} +Ayrıca, sekiz Obsidiyen dikeninin üzerinde, Sonveren Ejderhanın kendisini iyileştirmek için kullandığı Sonveren Kristallerinden bulacaksın +yani savaştaki öncelikli amacın, bunların her birini yok etmek olmalı.{*B*} +İlk birkaç tanesi ok ile vurulabilir, ancak diğerleri Demir Çit kafeslerle korunduğu için onlara ulaşana kadar bir şeyler inşa etmen gerekiyor.{*B*}{*B*} +Bunu yaparken Sonveren Ejderha sana doğru uçarak sana saldıracak ve Sonveren asit toplarını püskürtecek!{*B*} +Eğer dikenlerin merkezindeki Yumurta Platformuna yaklaşacak olursan, Sonveren Ejderha aşağı uçarak sana saldıracak. İşte tam bu noktada ona çok fazla hasar verebilirsin!{*B*} +Sonveren Ejderha'nın asitli nefesinden kaçın ve en iyi sonuç için gözlerini hedef al. Mümkünse, seninle birlikte savaşmaları için Son boyutuna birkaç arkadaşını getir!{*B*}{*B*} +Son boyutuna geçtiğin zaman, arkadaşların haritalarında Kalelerin içindeki Son Portalının yerini görebilecekler, +böylece kolayca yardımına koşabilirler. + - - - Ocağın alttaki yuvasına biraz yakacak, üstteki yuvaya da değiştirilecek eşyayı koymalısın. Ocak o zaman yanmaya ve çalışmaya başlayacak, yeni eşyalar ise sağdaki yuvaya yerleştirilecek. - + + {*ETB*}Tekrar hoş geldin! Belki fark etmemiş olabilirsin ama Minecraft'ın güncellendi.{*B*}{*B*} +Sen ve arkadaşların için birçok yeni özellik bulunuyor ama aşağıya bazı önemli olanları yazdık. Oku ve sonra bu yeniliklerin tadını çıkarmaya başla!{*B*}{*B*} +{*T1*}Yeni Eşyalar{*ETB*} - Sertleştirilmiş Kil, Lekeli Kil, Kömür Bloğu, Saman Balyası, Etkinleştirici Ray, Kızıltaş Bloğu, Günışığı Sensörü, Düşürücü, Huni, Hunili Maden Arabası, TNT'li Maden Arabası, Kızıltaş Karşılaştırıcısı, Tartılı Basınç Plakası, Fener, Kilitli Sandık, Havai Fişek Roketi, Havai Fişek Yıldızı, Dip Yıldızı, Tasma, At Zırhı, İsim Etiketi, At Canlandırma Yumurtası{*B*}{*B*} +{*T1*}Yeni Yaratıklar{*ETB*} - Solgun, Solgun İskeletleri, Cadılar, Yarasalar, Atlar, Eşekler ve Katırlar{*B*}{*B*} +{*T1*}Yeni Özellikler{*ETB*} – Bir atı evcilleştir ve sür, havai fişekler üretip kullan, İsim Etiketi ile hayvanlara ve canavarlara isim ver, daha gelişmiş Kızıltaş devreleri oluşturve dünyandaki misafirlerin neler yapabileceğini kontrol etmene yardımcı olacak Ev Sahibi Seçeneklerine göz at!{*B*}{*B*} +{*T1*}Yeni Eğitim Dünyası{*ETB*} – Yeni ve eski özellikleri nasıl kullanacağını Eğitim Dünyasında öğren. Dünyada saklı olan Müzik CD’lerini bulabilecek misin bir bak!{*B*}{*B*} - - - Ahşap eşyaların birçoğu yakacak olarak kullanılabilir ama hepsi de aynı süre yanmaz. Dünyada yakacak olarak kullanılabilen başka eşyalar da keşfedebilirsin. - + + Ele göre daha fazla hasar verir. - - - Eşyaların ateşten çıktıktan sonra onları sonuç alanından alıp envanterine yerleştirebilirsin. Farklı bileşenlerle denemeler yaparak neler üretebileceğine bir bak. - + + Toprağı, çimeni, kumu, çakılı ve karı, ele göre daha hızlı bir şekilde kazmak için kullanılır. Kartopu yapmak için kürek gerekmektedir. - - - Bileşen olarak odun kullanırsan kömür üretebilirsin. Ocağa biraz yakacak koy, bileşen yuvasına da odun yerleştir. Ocağın kömür üretmesi biraz vakit alabilir, o yüzden başka işler yapmaktan çekinme, durumu kontrol etmek için sonra gelebilirsin. - + + Koşma - - - Kömür yakacak olarak kullanılabilir veya bir sopa ile birleştirilerek meşale yapılabilir. - + + Yeni Ne Var - - - Bileşen yuvasına kum yerleştirerek cam üretebilirsin. Sığınağına pencere eklemek için biraz cam bloğu üret. - + + {*T3*}Değişiklikler ve Eklemeler{*ETW*}{*B*}{*B*} +- Yeni eşyalar eklendi - Sertleştirilmiş Kil, Lekeli Kil, Kömür Bloğu, Saman Balyası, Etkinleştirici Ray, Kızıltaş Bloğu, Günışığı Sensörü, Düşürücü, Huni, Hunili Maden Arabası, TNT'li Maden Arabası, Kızıltaş Karşılaştırıcısı, Tartılı Basınç Plakası, Fener, Kilitli Sandık, Havai Fişek Roketi, Havai Fişek Yıldızı, Dip Yıldızı, Tasma, At Zırhı, İsim Etiketi, At Canlandırma Yumurtası.{*B*} +- Yeni yaratıklar eklendi - Solgun, Solgun İskeletleri, Cadılar, Yarasalar, Atlar, Eşekler ve Katırlar.{*B*} +- Yeni arazi yaratma özellikleri eklendi – Cadı Barakaları.{*B*} +- Fener arayüzü eklendi.{*B*} +- At arayüzü eklendi.{*B*} +- Huni arayüzü eklendi.{*B*} +- Havai Fişekler eklendi – Elinde bir Havai Fişek Yıldızı ya da Havai Fişek Roketi yapacak bileşenler varsa Havai Fişeklerin arayüzüne, Üretim Masasından erişebilirsin.{*B*} +- ‘Macera Modu’ eklendi – Blokları yalnızca doğru aletlerle kırabilirsin.{*B*} +- Birçok yeni ses eklendi.{*B*} +- Yaratıklar, eşyalar ve mermiler artık portalların içinden geçebiliyor.{*B*} +- Yineleyiciler artık başka bir Yineleyici ile güçlendirilerek kilitlenebilirler.{*B*} +- Zombiler ve İskeletler artık farklı silah ve zırhlar ile canlanabilirler.{*B*} +- Yeni ölüm mesajları.{*B*} +- İsim Etiketi ile yaratıkları isimlendir ve menü açılınca çıkan başlığı değiştirmek için konteynerleri yeniden adlandır.{*B*} +- Kemik Tozu artık her şeyi anında tam boyutuna getirmiyor, bunun yerine rastgele olarak kademeli şekilde büyütüyor.{*B*} +- Sandıkların, Pişirme Standlarının,Fırlatıcıların ve Müzik Kutularının içeriklerini tanımlayan bir Kızıltaş sinyali, artık doğrudan onlara karşı bir Kızıltaş Karşılaştırıcısı yerleştirilerek tespit edilebilir.{*B*} +- Fırlatıcılar her yöne çevrilebilir.{*B*} +- Bir Altın Elma yemek, oyuncuya kısa süreliğine ekstra ‘soğurum’ kazandırıyor.{*B*} +- Bir bölgede ne kadar uzun kalırsan, canavarların o bölgede canlanması o kadar zor hale geliyor.{*B*} - - - Burası simya arabirimi. Burayı kullanarak çeşitli etkileri olan farklı iksirler üretebilirsin. - + + Ekran Görüntüsü Paylaşmak - - {*B*} - Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Simya standını nasıl kullanacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Sandıklar - - - Üstteki yuvaya bir bileşen, alttaki yuvalara da bir iksir veya su şişesi yerleştirerek iksir yapabilirsin (tek seferde en fazla 3 tane üretilebilir). Geçerli bir kombinasyon girildiğinde iksir yapımı başlayacak ve kısa bir süre sonra iksir üretilecek. - + + Üretim - - - Her iksir bir Su Şişesi ile başlar. Çoğu iksirin yapımı, önce bir Dip Alem Yumrusu ile Tuhaf İksir üretilmesi ile başlar. İksirin son halini alabilmesi için en az bir tane daha bileşen gerekir. - + + Ocak - - - İksirlerinin etkilerini değiştirebilirsin. Kızıltaş Tozu eklemek iksir etkisinin süresini artırır, Parıltı Taşı Tozu eklemek ise etkileri daha güçlü yapabilir. - + + Temel Öğeler - - - İksire, Mayalanmış Örümcek Gözü eklemek iksiri bozar ve etkilerini tersine çevirebilir, Barut eklemek ise iksiri Fırlatılabilen İksire çevirir, bu sayede atıldığı bölgede etki gösterebilir. - + + Gösterge - - - Dip Alem Yumrusunu bir Su Şişesine ekleyerek, ardından da Magma Özü katarak bir Ateş Direnci İksiri üret. - + + Envanter - - - Simya arabiriminden çıkmak için {*CONTROLLER_VK_B*} düğmesine bas. - + + Fırlatıcı - - - Bu bölgede bir Simya Standı, bir Kazan ve iksir üretmek için eşyalarla dolu olan bir sandık var. - + + Efsun - - {*B*} - Simyacılık ve iksir yapımı hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Simya ve iksirler hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Dip Alem Portalı - - - İksir üretmenin ilk adımı bir Su Şişesi yapmaktır. Sandıktan bir Cam Şişe al. - + + Çok Oyunculu - - - İçinde su olan bir Kazandan veya bir su bloğundan bir cam şişeyi doldurabilirsin. Bir su kaynağına bakıp {*CONTROLLER_ACTION_USE*} düğmesine basarak şimdi cam şişeni doldur. - + + Çiftlik Hayvanları - - - Kazan boşalacak olursa, bir Su Kovası ile tekrar doldurabilirsin. - + + Damızlık Hayvanlar - - - Simya Standını kullanarak bir Ateş Direnci İksiri üret. Bir Su Şişesi, Dip Alem Yumrusu ve Magma Özüne ihtiyacın olacak. - + + İksir Yapımı - - - Elinde bir iksir varken, onu kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine basılı tut. Normal bir iksirse onu içecek ve etkilerini kazanacaksın, Fırlatılabilen bir iksirse onu atacaksın ve etkileri düştüğü yerdeki yaratıklara etki edecek. - Fırlatılabilen iksirler normal iksirlere barut eklenerek yapılabilir. - + + deadmau5, Minecraft'ı çok seviyor! - - - Ateş Direnci İksirini kendinde kullan. - + + Domuzadamlar, sen onlara saldırmadığın sürece sana saldırmazlar. - - - Artık ateş ve lavlara karşı dirençli olduğuna göre, önceden gidemeyeceğin bazı yerlere gidebilirsin. - + + Yatakta uyuyarak oyun canlanma noktanı değiştirebilir ve gündüz olmasını sağlayabilirsin. - - - Burası silah, zırh ve bazı aletlere efsun eklemek için kullanabileceğin efsunlama arabirimidir. - + + Ateş toplarını Fersiz'e geri gönder! - - {*B*} - Efsun arabirimi hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Efsun arabirimini zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Geceleri etrafı aydınlatmak için meşale yap. Canavarlar, meşale ile aydınlatılan yerlerden uzak duracaktır. - - - Bir eşyayı efsunlamak için önce onu efsun yuvasına yerleştir. Silahlar, zırhlar ve bazı eşyalar efsunlanarak onlara hasar direnci veya bir bloğu kazarken kazanılan eşya sayısını artırma gibi özel etkiler eklenebilir. - + + Maden arabası ve raylar ile istediğin yere hızlıca git! - - - Bir eşya efsun yuvasına yerleştirildiğinde, sağdaki düğmeler değişerek rastgele efsunlardan bir kısmını gösterecektir. - + + Ağaç olması için birkaç fidan dik. - - - Düğmedeki sayı, o efsunu eşyaya uygulamak için gereken tecrübe seviyesi değerini gösterir. Eğer seviyen yetersizse, düğme kapalı olacaktır. - + + Portal inşa ederek başka bir boyuta, Dip Alem'e geçebilirsin. - - - Bir efsun seç ve {*CONTROLLER_VK_A*} düğmesine basarak eşyayı efsunla. Eşyayı efsunlayınca tecrübe seviyen azalacak. - + + Dümdüz aşağı veya yukarı kazmak iyi bir fikir değildir. - - - Efsunlar her ne kadar rastgele olsa da, iyi efsunlardan bazıları sadece yüksek tecrübe seviyesine ve Efsun Masası etrafında gücü artıran çok sayıda kitaplıklara sahip olanlar tarafından yapılabilir. - + + Kemik Tozu (İskelet kemiğinden üretilen), gübre olarak kullanılabilir ve ürünlerin çok hızlı bir şekilde büyümesini sağlar! - - - Bu bölgede bir Efsun Masası ve efsunlamayı öğrenmene yardımcı olacak bazı eşyalar var. - + + Ürpertenler, sana çok yaklaşırlarsa patlarlar! - - {*B*} - Efsunlama hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Efsunlamayı zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Elindeki eşyayı yere bırakmak için {*CONTROLLER_VK_B*} düğmesine bas! - - - Efsun Masası kullanarak bir bloğu kazarken daha fazla eşya toplamak; silahlar, zırhlar ve bazı aletler için artırılmış hasar direnci eklemek gibi özel etkileri eşyalara ekleyebilirsin. - + + İşe uygun araç gereçler kullan! - - - Efsun Masasının etrafına kitaplıklar eklemek efsun gücünü artırır ve daha yüksek seviyeli efsunlara erişim sağlar. - + + Meşale yapmak için hiç kömür bulamıyorsan, ocak kullanarak ağaçlardan odun kömürü yapabilirsin. - - - Eşyaları efsunlamak Tecrübe Seviyesine mal olur, bunlar ise yaratıklar ve hayvanları öldürünce, cevher kazınca, hayvan yetiştirince, balık tutunca, bir ocakta döküm yapınca veya yemek pişirince çıkan Tecrübe Küreleri toplanarak elde edilebilir. - + + Pişmiş domuz pirzolası, çiğ domuz pirzolasından daha fazla sağlık verir. - - - Atıldığında düştüğü yerde Tecrübe Küreleri oluşturan Efsunlu Şişe kullanarak da tecrübe seviyesi kazanabilirsin. Bu küreler daha sonra toplanabilir. - + + Eğer oyun zorluğunu Huzurlu olarak ayarlarsan, sağlığın otomatik olarak dolacak ve geceleri canavarlar gelmeyecek! - - - Bu bölgedeki sandıklarda bazı efsunlu eşyalar bulabilirsin; Efsunlu Şişeler ve Efsun Masasında deneme yanılmayla efsunlayabileceğin bazı eşyalar var. - + + Bir kurdu evcilleştirmek için ona bir kemik ver. Böylece oturmasını veya seni takip etmesini sağlayabilirsin. - - - Şu an bir maden arabası sürüyorsun. Maden arabasından çıkmak için, imleci ona doğrult ve {*CONTROLLER_ACTION_USE*} düğmesine bas.{*MinecartIcon*} - + + Envanter menüsündeyken, imleci menüden dışarı kaydırıp {*CONTROLLER_VK_A*} düğmesine basarak eşyaları yere bırakabilirsin. - - {*B*} - Maden arabaları hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Maden arabalarını zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Yeni bir İndirilebilir İçerik var! Ana Menüdeki Minecraft Mağazası düğmesinden ulaşabilirsin. - - - Maden arabası raylar üzerinde hareket eder. Ocakla çalışan ve sandığı olan bir maden arabası da yapabilirsin. - {*RailIcon*} - + + Karakterinin görünümünü, Minecraft Mağazasındaki Görünüm Paketleri ile değiştirebilirsin. Mevcut paketlere bakmak için Ana Menüden 'Minecraft Mağazasını' seç. - - - Kızıltaş meşalelerinden ve devrelerden enerji alarak hızlanan raylar da üretebilirsin. Bunlar, makas, şalter ve basınç plakalarına bağlanarak daha karmaşık sistemler oluşturulabilir. - {*PoweredRailIcon*} - + + Oyunu daha aydınlık ya da karanlık yapmak için gamma ayarını değiştir. - - - Şu an bir tekne kullanıyorsun. Tekneden çıkmak için imleci tekneye doğrult ve {*CONTROLLER_ACTION_USE*} düğmesine bas.{*BoatIcon*} - + + Geceleri bir yatakta uyumak gün doğumunu hızlandırır. Fakat çok oyunculu bir oyunda, tüm oyuncuların yataklarında aynı anda uyumaları gerekiyor. - - - {*B*} - Tekneler hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Tekneler hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Toprağı ekim yapmak üzere hazırlamak için çapa kullan. - - - Tekneler su üzerinde daha hızlı hareket etmeni sağlar. {*CONTROLLER_ACTION_MOVE*} ve {*CONTROLLER_ACTION_LOOK*} kullanarak yön verebilirsin. - {*BoatIcon*} - + + Örümcekler, sen onlara saldırmadığın sürece gündüz vakti sana saldırmazlar. - - - Şu an bir olta kullanıyorsun. Kullanmak için {*CONTROLLER_ACTION_USE*} düğmesine bas.{*FishingRodIcon*} - + + Toprağı veya kumu bahçıvan küreği ile kazmak, elinle kazmaktan daha kolaydır! - - - {*B*} - Balıkçılık hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Balıkçılığı zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Domuzlardan domuz pirzolası elde et ve sağlığını kazanmak için pişirip ye. - - - Oltanı atıp balık tutmaya başlamak için {*CONTROLLER_ACTION_USE*} düğmesine bas. Tekrar {*CONTROLLER_ACTION_USE*} düğmesine basarak oltayı çek. - {*FishingRodIcon*} - + + İneklerden deri elde et ve zırh yapmak için kullan. - - - Olta mantarının suyun altına batmasını bekleyip ipi çekersen bir balık yakalayabilirsin. Balıklar ham veya ocakta pişirilip yenilebilir ve sağlığı yenilerler. - {*FishIcon*} - + + Eğer boş bir kovan varsa su, lav ya da inek sütü ile doldurabilirsin! - - - Birçok alette olduğu gibi oltaların da belirli bir kullanım miktarı vardır. Sadece balık yakalamak için kullanılacakları anlamına gelmiyor tabii. Onunla başka nelerin yakalanabileceğini veya aktifleştirebileceğini öğrenmek için deneme yap... - {*FishingRodIcon*} - + + Obsidiyen, lav ile suyun birbirine temas etmesiyle oluşur. - - - Bu bir yatak. Geceleyin ona bakarken {*CONTROLLER_ACTION_USE*} düğmesine basarak geceyi uyuyarak geçir ve sabah olunca uyan.{*ICON*}355{*/ICON*} - + + İstiflenebilir çitler oyuna eklendi! - - - {*B*} - Yataklar hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Yataklar hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Eğer elinde buğday varsa bazı hayvanlar seni takip edecektir. - - - Yatak, güvenli ve iyi aydınlatılmış bir yere yerleştirilmelidir, böylece canavarlar seni gece yarısında uyandıramaz. Bir yatağı kullandıktan sonra ölürsen, tekrar yatakta doğacaksın. - {*ICON*}355{*/ICON*} - + + Eğer bir hayvan, herhangi bir yönde 20 bloktan fazla uzaklaşamazsa, ortadan kaybolmayacaktır. - - - Oyununda başka oyuncular varsa, uyuyabilmek için herkesin aynı anda yataklarında olmaları gerekir. - {*ICON*}355{*/ICON*} - + + Evcil kurtlar, sağlığını kuyruklarının pozisyonu ile gösterir. Onları iyileştirmek için etle besle. - - - Bu bölgede birkaç basit Kızıltaş ve Piston devreleri ve o devreleri geliştirmek için gereken eşyalarla dolu bir sandık var. - + + Yeşil boya elde etmek için ocakta kaktüs pişir. - - - {*B*} - Kızıltaş devreleri ve Pistonlar hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Kızıltaş devreleri ve Pistonlar hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Nasıl Oynanır menülerindeki Neler Yeni kısmını okuyarak oyun hakkındaki son güncellemeleri öğrenebilirsin. - - - Şalterler, Düğmeler, Basınç Plakaları ve Kızıltaş Meşaleleri devrelere, direkt olarak aktifleştirmek istediğin eşyaya bağlanarak veya Kızıltaş tozu ile bağlanarak çalıştırılabilir. - + + Müzik: C418 - - - Bir enerji kaynağını nereye ve hangi yöne doğru yerleştirdiğin etrafındaki blokları nasıl etkileyeceğini belirler. Örneğin bir bloğun yanındaki bir Kızıltaş meşalesi, blok başka bir güç kaynağından enerji alıyorsa kapatılabilir. - + + Notch kimdir? - - - Kızıltaş tozu, kızıltaş cevherini Demir, Elmas veya Altından yapılma bir kazma ile kazarak elde edilir. Onu kullanarak 15 bloğa kadar malzeme taşıyabilir ve yükseklik olarak bir blok yukarı veya aşağı hareket edebilirsin. - {*ICON*}331{*/ICON*} - + + Mojang'ın, çalışanlarından daha fazla ödülü var! - - - Kızıltaş yineleyicileri enerjinin taşınacağı mesafeyi artırmak veya devreye bir geciktirici eklemek için kullanılabilir. - {*ICON*}356{*/ICON*} - + + Bazı ünlü insanlar Minecraft oynuyor! - - - Güç verildiği zaman Piston uzar ve en fazla 12 tane bloğu itebilir. Geri çekildiğinde, Yapışkan Pistonlar çoğu tipte bloktan bir tanesini beraberinde çekebilir. - {*ICON*}33{*/ICON*} - + + Notch'un Twitter'da bir milyondan fazla takipçisi bulunuyor! - - - Bu bölgedeki sandıkta pistonlu devreler yapmak için gereken bazı bileşenler var. Bu bölgedeki devreleri kullanmayı veya tamamlamayı dene, ya da kendi devreni yap. Eğitim alanının dışında daha fazla örnek var. - + + Tüm İsveçliler sarışın değildir. Hatta Mojang'tan Jens gibi bazıları kızıldır! - - - Bu bölgede Dip Aleme açılan bir Portal var! - + + Bir gün bu oyuna bir güncelleme gelecek! - - - {*B*} - Portallar ve Dip Alem hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Portallar ve Dip Alem hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Yan yana iki sandık koyarak tek bir geniş sandık oluşturabilirsin. - - - Portallar, Obsidiyen blokların dört blok genişlik ve beş blok yükseklikte olacak şekilde bir araya getirilmesiyle yapılır. Köşe bloklarına gerek yoktur. - + + Açık havada yün kullanarak yapı inşa ederken dikkatli ol. Fırtına sırasında yıldırımlar yünü tutuşturabilir. - - - Bir Dip Alem Portalı aktifleştirmek için yapının içindeki Obsidiyen blokları Çakmak Taşı ve Çelikle tutuştur. Yapı bozulur, yakında bir patlama olursa veya içinden bir sıvı akarsa Portallar kapanır. - + + Sadece bir kova lav, ocak içerisinde 100 bloğu eritmek için kullanılabilir. - - - Bir Dip Alem Portalını kullanmak için içinde durun. Ekranın morlaşacak ve bir ses çıkacak. Birkaç saniye sonra başka bir boyuta ışınlanacaksın. - + + Nota bloğu tarafından çalınan enstrüman, altındaki malzemeye bağlı olarak değişebilir. - - - Dip Alem, lavlarla dolu ve tehlikeli bir yerdir ama yakıldıktan sonra sürekli yanan Dip Alem Kütlesi ve ışık üreten Parıltı Taşı Tozu gibi malzemelerin toplanması için faydalı olabilir. - + + Kaynak blok yok edildiği zaman lavın ortadan TAMAMEN kaybolması dakikalar alabilir. - - - Dip Alem, Üstdünya'da hızla yolculuk etmek için kullanılabilir, Dip Alem'de bir blok ilerlemek, Üstdünya'da 3 blok ilerlemeye denk gelir. - + + Parke taşı, Fersiz ateş toplarına karşı dayanıklıdır. Bu yüzden portal savunması için kullanışlıdır. - - - Şu an Yaratıcılık modundasın. - + + Işık kaynağı olarak kullanılabilen bloklar karı ve buzu eritir. Buna meşaleler, parıltı taşı ve Cadılar Bayramı Kabağı dahildir. - - - {*B*} - Yaratıcılık modu hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Yaratıcılık modu hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Zombiler ve İskeletler, eğer suyun altındalarsa gündüzleri de hayatta kalabilirler. - - Yaratıcılık modundayken, tüm eşya ve bloklardan sonsuz sayıda elinde bulunur, bir alet olmadan blokları tek tıkla yok edebilirsin, ölümsüz olur ve uçabilirsin. + + Tavuklar, her 5 veya 10 dakikada bir yumurtlarlar. - - Yaratıcılık envanter arabirimini açmak için {*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. + + Obsidiyen, sadece elmastan bir kazma ile çıkartılabilir. - - Devam etmek için bu deliğin öbür tarafına git. + + Ürpertenler, en kolay erişilebilen barut kaynağıdır. - - Yaratıcılık modu eğitimini tamamladın. + + Bir kurda saldırmak, yakın çevredeki tüm kurtların sana saldırmasına sebep olur. Bu durum Zombi Domuzadamlar için de geçerlidir. - - - Bu bölgede bir çiftlik kurulmuş. Çiftçilik sayesinde yiyecek kaynakları ve başka eşyalar edinebilirsin. - + + Kurtlar Dip Alem'e geçemezler. - - - {*B*} - Çiftçilik hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Çiftçilik hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Kurtlar Ürpertenlere saldırmazlar. - - Buğday, Bal Kabakları ve Kavunlar tohum ve çekirdeklerinden üretilir. Buğday tohumları Uzun Çimenleri kırarak veya buğday toplayarak elde edilir, Bal Kabağı ve Kavun çekirdekleri ise Bal Kabakları ve Kavunlardan elde edilir. + + Taş blokları ve cevherleri kazmak için gereklidir. - - Tohum ekmeden önce toprak blokları bir Çapa ile Ekim Toprağına dönüştürülmelidir. Bölgeyi aydınlık tutmak ve yakınlarda bir su kaynağı bulunması Ekim Toprağını sulamayı ve ürünlerin daha hızlı büyümesini sağlayacaktır. + + Kek tarifinde ve iksir yapımında malzeme olarak kullanılır. - - Buğday büyürken birkaç aşamadan geçer ve kararmaya başladığında hasat edilebilir.{*ICON*}59:7{*/ICON*} + + Açılıp kapatılarak elektrik yükü göndermesi için kullanılır. Tekrar basılana dek açık veya kapalı durumda bekler. - - Bal Kabakları ve Kavunların ekildiği yerin yanında bitki tamamen büyüdükten sonra meyvenin yetişebilmesi için boş bir blok olmalıdır. + + Sabit bir şekilde elektrik yükü gönderir veya bir bloğun yanına bağlandığında alıcı/verici olarak kullanılabilir. +Alt seviyelerdeki ışıklandırma için de kullanılabilir. - - Şeker Kamışları, su bloklarının hemen yanındaki bir Çimen, Toprak veya Kum bloklarına dikilmelidir. Bir Şeker Kamışı bloğunu kesmek onun üstündeki tüm blokları da düşürür.{*ICON*}83{*/ICON*} + + 2 {*ICON_SHANK_01*} yeniler ve altından bir elma yapılabilir. - - Kaktüsler Kuma ekilmelidir ve üç blok yüksekliğinde büyüyebilirler. Aynı Şeker Kamışları gibi, en alttaki bloğu yok ederek üstteki blokları da alabilirsin.{*ICON*}81{*/ICON*} + + 2 {*ICON_SHANK_01*} yeniler ve 4 saniye boyunca sağlık verir. Bir elmadan veya altın külçelerinden üretilir. - - Mantarlar az ışığın olduğu bir alana dikilmelidir, böylece ışıklandırması az olan diğer alanlara da yayılırlar.{*ICON*}39{*/ICON*} + + 2 {*ICON_SHANK_01*} yeniler. Bunu yemek zehirlenmene neden olabilir. - - Kemik Tozu ekinleri tam olarak büyütmek veya Mantarları Dev Mantarlar haline getirmek için kullanılabilir.{*ICON*}351:15{*/ICON*} + + Kızıltaş devrelerinde yineleyici, geciktirici ve/veya diyot olarak kullanılır. - - Çiftçilik eğitimini tamamladın. + + Maden arabalarını yönlendirmek için kullanılır. - - - Bu bölgede hayvanlar ağıla kapatılmış. Hayvanları yavrulatarak kendilerinin yavru versiyonlarından üretebilirsin. - + + Enerji aldığında, üzerinden geçen maden arabalarını hızlandırır. Enerji kesildiğinde ise maden arabalarının tam üzerinde durmasını sağlar. - - - {*B*} - Hayvan üretimi hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Hayvan üretimi hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Basınç Plakası gibi işler (enerji aldığında bir Kızıltaş sinyali gönderir) ama sadece bir maden arabası ile çalıştırılabilir. - - Hayvanları yavrulatabilmek için onlara doğru yiyecekleri yedirip 'Aşk Moduna' sokmalısın. + + Basıldığı zaman bir elektrik yükü göndermek için kullanılır. Kapanmadan önce yaklaşık olarak bir saniye açık kalır. - - İnek, möntar, domuz veya koyunlara buğday, domuzlara havuç, tavuklara Buğday Tohumu veya Dip Alem Yumrusu, kurtlara ise herhangi tür bir etten yedirirsen, yakınlarındaki aynı türden yine Aşk Modunda olan başka bir hayvanı aramaya başlarlar. + + Kızıltaş yükü verildiği zaman eşyaları rastgele fırlatmak için kullanılır. - - Aynı türden iki hayvan karşılaştığında ikisi de Aşk Modundaysa birkaç saniye öpüşürler, sonra da yavru bir hayvan doğar. Yavru hayvan büyüyene kadar bir süre ebeveynlerini takip edecektir. + + Tetiklendiği zaman bir nota çalar. Notanın perdesini değiştirmek için ona dokun. Bunu farklı blokların üzerine yerleştirmek enstrümanı değiştirir. - - Aşk Moduna bir kere girdikten sonra hayvan 5 dakika kadar tekrar giremeyecektir. + + 2.5 {*ICON_SHANK_01*} yeniler. Ocakta çiğ balığın pişirilmesiyle yapılır. - - Bazı hayvanlar, elinde onların yiyeceğini tutarsan seni takip eder. Bu sayede hayvanları üremeleri için bir araya toplamak daha kolay olur.{*ICON*}296{*/ICON*} + + 1 {*ICON_SHANK_01*} yeniler. - - - Vahşi kurtlara kemik vererek onları evcilleştirebilirsin. Evcilleştirildikleri zaman etraflarında Aşk Kalpleri belirir. Evcil kurtlar oyuncuyu takip eder ve oturmaları emredilmediyse onu korurlar. - + + 1 {*ICON_SHANK_01*} yeniler. - - Hayvanlar ve hayvan üretme eğitimini tamamladın. + + 3 {*ICON_SHANK_01*} yeniler. - - - Bu bölgede bir Kar Golemi ve bir Demir Golem yapmak için gereken bal kabağı ve bloklar var. - + + Yay için cephane olarak kullanılır. - - - {*B*} - Golemler hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Golemler hakkında zaten bilgin varsa {*CONTROLLER_VK_B*} düğmesine bas. - + + 2.5 {*ICON_SHANK_01*} yeniler. - - Golemler bir blok yığını üzerine bal kabağı koyarak yapılır. + + 1 {*ICON_SHANK_01*} yeniler. 6 defa kullanılabilir. - - Kar Golemleri iki tane üst üste konmuş Kar Bloğundan ve onların üstüne konan bir bal kabağından yapılır. Kar Golemleri düşmanlarına kartopu atar. + + 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Bunu yemek zehirlenmene neden olabilir. - - Demir Golem yapmak için dört tane Demir Bloğun gösterilen düzende yerleştirilmesi ve orta bloğun üstüne de bir bal kabağı konması gerekir. Demir Golemler düşmanlarına saldırır. + + 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. - - Demir Golemler kasabaları korumak için doğal olarak ortaya çıkar ve kasabalılara saldıracak olursan sana karşılık verirler. + + 4 {*ICON_SHANK_01*} yeniler. Çiğ domuz pirzolasının ocakta pişirilmesiyle yapılır. - - Eğitimi tamamlayana kadar bu bölgeden çıkamazsın. + + 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Evcilleştirmek için bir Oseloya da verilebilir. - - Bazı aletler bazı malzemeler için daha uygundur. Toprak ve kum gibi yumuşak malzemeleri çıkarırken bir kürek kullanmalısın. + + 3 {*ICON_SHANK_01*} yeniler. Çiğ tavuğun ocakta pişirilmesiyle yapılır. - - Bazı aletler bazı malzemeler için daha uygundur. Ağaç gövdelerini kesmek için bir balta kullanmalısın. + + 1.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. - - Bazı aletler bazı malzemeler için daha uygundur. Taş ve cevher toplamak için bir kazma kullanmalısın. Bazı bloklardan malzeme çıkarabilmek için kazmanı daha iyi materyallerden yapman gerekebilir. + + 4 {*ICON_SHANK_01*} yeniler. Çiğ etin ocakta pişirilmesiyle yapılır. - - Bazı aletler düşmanlara saldırmak için daha uygundur. Saldırmak için bir kılıç kullanmayı dene. + + Raylar boyunca seni, bir hayvanı veya bir canavarı taşımak için kullanılır. - - İpucu: Elinle veya tuttuğun şeyle kazmak veya kesmek için {*CONTROLLER_ACTION_ACTION*} düğmesine basılı tut. Bazı blokları kazmak için bir alet yapman gerekebilir... + + Açık mavi yün yapmak için boya olarak kullanılır. - - Kullandığın alet hasar aldı. Bir aleti her kullandığında biraz hasar alır, sonunda da kırılır. Envanterinde eşyanın altındaki renkli çubuk şu anki hasar durumunu gösterir. + + Camgöbeği yün yapmak için boya olarak kullanılır. - - Yukarı yüzmek için {*CONTROLLER_ACTION_JUMP*} düğmesine basılı tut. + + Mor yün yapmak için boya olarak kullanılır. - - Bu bölgede raylarda bir maden arabası var. Maden arabasına girmek için, imleci ona doğru tut ve {*CONTROLLER_ACTION_USE*} düğmesine bas. Düğmede {*CONTROLLER_ACTION_USE*} düğmesine basarak maden arabasını ilerlet. + + Açık yeşil yün yapmak için boya olarak kullanılır. - - Nehrin yanındaki sandıkta bir tekne var. Tekneyi kullanmak için, imleci suya doğru tut ve {*CONTROLLER_ACTION_USE*} düğmesine bas. Tekneye bakarken {*CONTROLLER_ACTION_USE*} kullanarak içine gir. + + Gri yün yapmak için boya olarak kullanılır. - - Gölcüğün yanındaki sandıkta bir balıkçı oltası var. Oltayı sandıktan al ve kullanabilmek için elindeki geçerli eşya yap. + + Açık gri yün yapmak için boya olarak kullanılır. +(Not: Açık gri boya, gri boya ile kemik tozunun karıştırılmasıyla da üretilebilir. Böylece her bir mürekkep kesesinden üç yerine dört adet açık gri boya üretilebilir.) + + + Galibarda yün yapmak için boya olarak kullanılır. + + + Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. - - Bu gelişmiş piston mekanizması kendini onaran bir köprüdür! Çalıştırmak için düğmeye bas, sonra da ayrıntıları öğrenebilmek için parçaların nasıl çalıştığını izle. + + Kitaplar ve haritalar yapmak için kullanılır. - - Bir eşyayı taşırken imleci arabirimin dışına götürürsen o eşyayı bırakabilirsin. + + Kitap rafı oluşturmak veya efsunlanarak Efsunlu Kitap yapmak için kullanılabilir. - - Bu eşyayı yapmak için gereken tüm bileşenlere sahip değilsin. Sol alt köşedeki kutu bunu üretmek için gereken bileşenleri gösterir. + + Mavi yün yapmak için boya olarak kullanılır. - - - Tebrikler, eğitimi tamamladın. Oyunda zaman artık normal hızda akacak, gecenin çöküp canavarların çıkması için fazla beklemen gerekemeyecek! Sığınağını tamamla! - + + Müzik CDleri çalar. - - {*EXIT_PICTURE*} Daha fazla araştırmaya hazırsan, bu alanda Madenci sığınağının yakınında küçük bir kaleye açılan bir geçiş var. + + Dayanıklı araçlar, silahlar veya zırh yapmak için bunları kullan. - - Hatırlatma: + + Turuncu yün yapmak için boya olarak kullanılır. - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + Koyunlardan toplanır ve boyalar ile renklendirilebilir. - - Son sürümde oyuna eğitim dünyasındaki yeni alanlar gibi yeni özellikler eklendi. + + İnşaat malzemesi olarak kullanılabilir ve boyanabilir. Bu tarif tavsiye edilmez çünkü Yün, Koyunlardan kolayca elde edilebilmektedir. - - {*B*}Eğitimi normal şekilde oynamak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Ana eğitimi atlamak için {*CONTROLLER_VK_B*} düğmesine bas. + + Siyah yün yapmak için boya olarak kullanılır. - - Bu bölgede balıkçılık, tekneler, pistonlar ve kızıltaşlar hakkında daha fazla şey öğrenmen için kurulmuş alanlar bulacaksın. + + Raylar boyunca mal taşımak için kullanılır. - - Bu bölgenin dışında yapılar, çiftçilik, maden arabaları ve rayları, efsunlama, simya, takas, demircilik ve daha fazlası ile ilgili örnekler bulacaksın! + + İçine kömür konulduğunda raylar boyunca hareket eder ve diğer maden arabalarını iter. - - - Yiyeceğin tükendiği için artık sağlık kazanamayacaksın. - + + Suda, yüzmekten daha hızlı hareket edebilmek için kullanılır. - - - {*B*} - Yiyecek çubuğu ve yemek yeme hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Yiyecek çubuğu ve yemek yeme hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + + Yeşil yün yapmak için boya olarak kullanılır. - - Seç + + Kırmızı yün yapmak için boya olarak kullanılır. - - Kullan + + Ekinleri, ağaçları, uzun çimenleri, dev mantarları ve çiçekleri anında büyütmek için kullanılır ve boya tariflerinde yer alır. - - Geri + + Pembe yün yapmak için boya olarak kullanılır. - - Çıkış + + Kahverengi yün yapmak için boya olarak, kurabiyede malzeme olarak veya Kakao Tohumları yetiştirmek için kullanılır. - - İptal + + Gümüş rengi yün yapmak için boya olarak kullanılır. - - Katılmayı İptal Et + + Sarı yün yapmak için boya olarak kullanılır. - - Çevrimiçi Oyunlar Listesini Yenile + + Ok ile mesafeli saldırılara imkan tanır. - - Parti Oyunları + + Giyildiği zaman giyen kişiye 5 Zırh verir. - - Tüm Oyunlar + + Giyildiği zaman giyen kişiye 3 Zırh verir. - - Grup Değiştir + + Giyildiği zaman giyen kişiye 1 Zırh verir. - - Envanteri Göster + + Giyildiği zaman giyen kişiye 5 Zırh verir. - - Açıklamayı Göster + + Giyildiği zaman giyen kişiye 2 Zırh verir. - - Bileşenleri Göster + + Giyildiği zaman giyen kişiye 2 Zırh verir. - - Üretim + + Giyildiği zaman giyen kişiye 3 Zırh verir. - - Oluştur + + Bu malzemeden yapılmış araçlar üretmek için kullanılabilen, parlak bir külçe. Ocakta cevherin eritilmesiyle üretilmiştir. - - Al/Yerleştir + + Külçelerin, mücevherlerin veya boyaların, yerleştirilebilir bloklara dönüştürülmesini sağlar. Pahalı bir bina bloğu veya gelişmiş bir cevher deposu olarak kullanılabilir. - - Al + + Bir oyuncu, bir hayvan veya bir canavar üstüne bastığı zaman bir elektrik yükü göndermesi için kullanılır. Ahşap Basınç Plakaları, üstlerine bir şey konulduğu zaman da çalışırlar. - - Tümünü Al + + Giyildiği zaman giyen kişiye 8 Zırh verir. - - Yarısını Al + + Giyildiği zaman giyen kişiye 6 Zırh verir. - - Yerleştir + + Giyildiği zaman giyen kişiye 3 Zırh verir. - - Tümünü Yerleştir + + Giyildiği zaman giyen kişiye 6 Zırh verir. - - Birini Yerleştir + + Demir kapılar sadece Kızıltaş, düğmeler veya devre anahtarları ile açılabilir. - - Bırak + + Giyildiği zaman giyen kişiye 1 Zırh verir. - - Tümünü Bırak + + Giyildiği zaman giyen kişiye 3 Zırh verir. - - Birini Bırak + + Odun blokları, ele göre daha hızlı bir şekilde kesmek için kullanılır. - - Takas Et + + Ekinler için hazırlamak üzere toprak ve çim blokları sürmek için kullanılır. - - Hızlı Taşı + + Ahşap kapılar, kullanarak, üzerlerine vurarak veya Kızıltaş ile açılır. - - Hızlı Seçimi Temizle + + Giyildiği zaman giyen kişiye 2 Zırh verir. - - Bu Nedir? + + Giyildiği zaman giyen kişiye 4 Zırh verir. - - Facebook'ta Paylaş + + Giyildiği zaman giyen kişiye 1 Zırh verir. - - Filtreyi Değiştir + + Giyildiği zaman giyen kişiye 2 Zırh verir. - - Arkadaşlık İsteği Gönder + + Giyildiği zaman giyen kişiye 1 Zırh verir. - - Alt Sayfa + + Giyildiği zaman giyen kişiye 2 Zırh verir. - - Üst Sayfa + + Giyildiği zaman giyen kişiye 5 Zırh verir. - - Sonraki + + Kompakt merdivenler yapmak için kullanılır. - - Önceki + + Mantar yahnisi koymak için kullanılır. Yahni yenildiği zaman kase kaybolmaz. - - Oyuncu At + + Su, lav ve süt koymak ve taşımak için kullanılır. - - Boya + + Su koymak ve taşımak için kullanılır. - - Kaz + + Senin veya diğer oyuncular tarafından yazılan metni gösterir. - - Besle + + Meşalelerden daha parlak ışık üretmek için kullanılır. Karı ve buzu eritir ve su altında kullanılabilir. - - Evcilleştir + + Patlama yaratmak için kullanılır. Yerleştirildikten sonra Çakmak taşı ve Çelik ya da elektrik yükü ile tutuşturularak başlatılır. - - İyileştir + + Lav koymak ve taşımak için kullanılır. - - Otur + + Güneş'in ve Ay'ın konumlarını gösterir. - - Takip Et + + Başlangıç noktanı gösterir. - - Çıkar + + Elindeyken keşfedilen bölgenin resmini oluşturur. Bu, yol bulmak için kullanılabilir. - - Boşalt + + Süt koymak ve taşımak için kullanılır. - - Eyerle + + Ateş yakmak, TNT'yi tutuşturmak ve inşa edildiği zaman portalı açmak için kullanılır. - - Yerleştir + + Balık yakalamak için kullanılır. - - Vur + + Kullanarak, üzerine vurarak ya da kızıltaş ile başlatılır. Normal kapı gibi işlerler ama sıra sıra bloklardan oluşurlar ve yerde düz dururlar. - - Süt Sağ + + İnşaat malzemesi olarak kullanılır ve birçok şeyin üretiminde de kullanılabilir. Herhangi bir tip odundan üretilebilir. - - Topla + + İnşaat malzemesi olarak kullanılır. Normal kum gibi yer çekiminden etkilenmez. - - Ye + + İnşaat malzemesi olarak kullanılır. - - Uyu + + Uzun merdivenler yapmak için kullanılır. İki levha üst üste yerleştirildiğinde, normal boyutta iki levhalı blok meydana getirir. - - Uyan + + Uzun merdivenler yapmak için kullanılır. Birbirinin üstüne yerleştirilen iki levha, normal boyutta ikili levha bloğu oluşturur. - - Oynat + + Işık çıkarmak için kullanılır. Meşaleler ayrıca karı ve buzu eritir. - - Bin + + Meşale, ok, tabela, merdiven, çit üretmek amacıyla ve araçlar ile silahlar için de sap olarak kullanılır. - - Kayık Kullan + + İçerisine blok ve eşya konulabilir. İki katı kapasiteye sahip daha geniş bir sandık oluşturmak için iki sandığı yan yana yerleştir. - - Yetiştir + + Üzerinden atlanamayan bir duvar olarak kullanılır. Oyuncular, hayvanlar ve canavarlar için 1.5, diğer bloklar için 1 blok uzundur. - - Yukarı Yüz + + Dikine tırmanmak için kullanılır. - - + + Haritadaki herkes yataktaysa, gecenin herhangi bir anından zamanı gündüze çevirmek için kullanılır ve oyuncunun canlanma noktasını değiştirir. +Kullanılan yünün rengi ne olursa olsun yatak her zaman aynı renktir. - - Ses Perdesini Değiştir + + Normal üretime göre daha fazla eşya üretebilmene imkan tanır. - - Patlat + + Cevher eritmeni, odun kömürü ve cam yapmanı, balık ve pirzola pişirmeni sağlar. - - Oku + + Demir Balta - - Tutun + + Kızıltaş Lambası - - Fırlat + + Orman Odunu Basamak - - Ek + + Huş Odunu Basamak - - Toprağı Sür + + Geçerli Kontroller - - Hasat Et + + Kafatası - - Devam Et + + Kakao - - Tam Oyunun Kilidini Aç + + Ladin Odunu Basamak - - Kaydı Sil + + Ejderha Yumurtası - - Sil + + Son Taşı - - Seçenekler + + Son Portalı Çerçevesi - - Arkadaş Davet Et + + Kum Taşı Basamak - - Kabul Et + + Eğrelti Otu - - Kırp + + Çalı - - Seviyeyi Yasakla + + Dizilim - - Görünüm Seç + + Üretim - - Tutuştur + + Kullan - - Dolaş + + Eylem - - Tam Sürümü Yükle + + Sessizce İlerle/Alçal - - Deneme Sürümünü Yükle + + Sessizce İlerle - - Yükle + + Bırak - - Yeniden Yükle + + Elindeki Eşyayı Değiştir - - Seçenekleri Kaydet + + Duraklat - - Komut Çalıştır + + Bak - - Yaratıcılık + + Hareket Et/Koş - - Bileşen Taşı + + Envanter - - Yakacak Taşı + + Zıpla/Yüksel - - Alet Taşı + + Zıpla - - Zırh Taşı + + Son Portalı - - Silah Taşı + + Bal Kabağı Sapı - - Kuşan + + Kavun - - Çek + + İnce Cam - - Bırak + + Çit Kapısı - - Ayrıcalıklar + + Sarmaşık - - Engelle + + Kavun Sapı - - Üst Sayfa + + Demir Parmaklık - - Alt Sayfa + + Çatlak Taş Tuğlalar - - Aşk Modu + + Yosunlu Taş Tuğlalar - - İç + + Taş Tuğlalar - - Döndür + + Mantar - - Gizle + + Mantar - - Tüm Yuvaları Temizle + + Yontma Taş Tuğlalar - - Tamam + + Tuğla Basamak - - İptal + + Dip Alem Yumrusu - - Minecraft Mağazası + + Dip Alem Tuğlası Basamağı - - Şu anki oyunundan ayrılıp yeni bir oyuna katılmak istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. + + Dip Alem Tuğlası Çiti - - Oyundan Çık + + Kazan - - Oyunu Kaydet + + Simya Standı - - Kaydetmeden Çık + + Efsun Masası - - Bu dünyanın geçerli versiyonunu bu dünyaya ait önceki kayıtların üzerine yazmak istediğinden emin misin? + + Dip Alem Tuğlası + + + Gümüşçün Parke Taşı - - Kaydetmeden çıkmak istediğinden emin misin? Bu dünyadaki bütün ilerlemen kaybolacak! + + Gümüşçün Taşı - - Oyunu Başlat + + Taş Tuğla Basamak - - Hasarlı Kayıt + + Nilüfer Yaprağı - - Bu kayıt bozulmuş ya da hasar görmüş. Silmek ister misin? + + Miselyum - - Ana menüye dönüp bütün oyuncuların oyunla bağlantısını kesmek istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. + + Gümüşçün Taşı Tuğlası - - Kaydet ve çık + + Kamera Modunu Değiştir - - Kaydetmeden çık + + Sağlığının bir kısmını kaybedersen fakat gıda çubuğunda 9 ya da daha fazla{*ICON_SHANK_01*} varsa, sağlığın otomatik olarak dolacaktır. Gıda tüketmek gıda çubuğunu doldurur. - - Ana menüye dönmek istediğinden emin misin? Kaydedilmeyen gelişmeler kaybolacak. + + Etrafta dolaştıkça, kazdıkça ve saldırdıkça gıda çubuğunu{*ICON_SHANK_01*} tüketirsin. Koşmak ve koşarken zıplamak normal şekilde yürümekten ve zıplamaktan çok daha fazla gıda harcar. - - Ana menüye dönmek istediğinden emin misin? İlerlemen kaybolacak! + + Daha çok eşya toplayıp ürettikçe envanterin dolacaktır.{*B*} + Envanterini açmak için{*CONTROLLER_ACTION_INVENTORY*} düğmesine bas. - - Yeni Dünya Oluştur + + Topladığın odundan keresteler üretilebilir. Bunun için üretim arabirimini aç.{*PlanksIcon*} - - Eğitim Bölümünü Oyna + + Gıda seviyen düşük ve sağlık kaybettin. Gıda çubuğunu doldurup iyileşmeye başlamak için envanterindeki bifteği ye.{*ICON*}364{*/ICON*} - - Eğitim Bölümü + + Elinde gıda eşyası varken, onu yiyip gıda çubuğunu doldurmak için{*CONTROLLER_ACTION_USE*} düğmesini basılı tut. Gıda çubuğun doluysa yiyemezsin. - - Dünyanın Adını Belirle + + Üretim arabirimini açmak için{*CONTROLLER_ACTION_CRAFTING*} düğmesine bas. - - Dünyan için bir ad gir + + Koşmak için, {*CONTROLLER_ACTION_MOVE*} çubuğu hızlıca iki kez ileriye ittir. {*CONTROLLER_ACTION_MOVE*} çubuğu ileride tutarken, karakter koşma süresi ya da gıdası tükenene dek koşmaya devam edecektir. - - Dünya üretimin için bir oluşum girişi yap + + Hareket etmek için{*CONTROLLER_ACTION_MOVE*} çubuğu kullan. - - Kayıtlı Dünya Yükle + + Yukarıya, aşağıya ve etrafa bakmak için{*CONTROLLER_ACTION_LOOK*} çubuğu kullan. - - Katılmak için START düğmesine bas + + 4 odun bloğu (ağaç gövdeleri) kırmak için{*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut.{*B*}Bir blok kırıldığında ortaya çıkan süzülen eşyanın yakınında durarak alırsan, envanterinde görünecektir. - - Oyundan çıkılıyor + + Elini ya da elinde tuttuğun şeyi kullanarak kazmak ve kırmak için{*CONTROLLER_ACTION_ACTION*} düğmesini basılı tut. Bazı blokları kazmak için alet üretmen gerekebilir... - - Bir hata meydana geldi. Ana menüye dönülüyor. + + Zıplamak için{*CONTROLLER_ACTION_JUMP*} düğmesine bas. - - Bağlantı kurulamadı + + Pek çok üretim birkaç aşamadan meydana gelebilir. Artık elinde kereste olduğuna göre bununla daha çok eşya üretebilirsin. Üretim masası yap.{*CraftingTableIcon*} - - Bağlantı kesildi + + + Çabucak gece olabilir ve hazırlıksız şekilde dışarıda olmak tehlikeli olacaktır. Zırh ve silahlar üretebilirsin ancak güvenli bir barınağa sahip olmak daha mantıklıdır. + - - Sunucuyla olan bağlantı kesildi. Ana menüye dönülüyor. + + Konteyneri aç - - Sunucu tarafından bağlantı kesildi + + Kazma, taş ve cevher gibi sert blokları daha hızlı kazmana yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir kazma yap.{*WoodenPickaxeIcon*} - - Oyundan atıldın + + Taş blok kazmak için kazmanı kullan. Taş bloklar kazıldığında parke taşı meydana getirir. 8 parke taşı toplarsan bir ocak yapabilirsin. Taşa ulaşmak için bir miktar toprak kazman gerekebilir, bunun için de küreğini kullan.{*StoneIcon*} - - Uçmaktan dolayı oyundan atıldın + + + Barınağı tamamlamak için kaynaklar toplamalısın. Duvarlar ve çatı her döşeme türü bloktan yapılabilir ancak kapı, birkaç pencere ve ışıklandırma da yerleştirmek isteyebilirsin. + - - Bağlanma girişimi çok uzun sürdü + + + Yakınlarda geceyi güvenli şekilde geçirmen için tamamlayabileceğin terk edilmiş bir Madenci barınağı var. + - - Sunucu dolu + + Balta, odun ile ahşap nesneleri daha hızlı kesmene yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir balta yap.{*WoodenHatchetIcon*} - - Kurucu oyundan çıktı. + + Eşyaları kullanmak, nesnelerle etkileşime geçmek ve eşyaları yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullan. Yerleştirilen eşyalar doğru aletle kazılarak yeniden alınabilir. - - Oyunda bulunan kimseyle arkadaş olmadığından dolayı bu oyuna katılamazsın. + + Elinde tuttuğun eşyayı değiştirmek için{*CONTROLLER_ACTION_LEFT_SCROLL*} ile{*CONTROLLER_ACTION_RIGHT_SCROLL*} düğmelerini kullan. - - Önceden kurucu tarafından atıldığın için bu oyuna katılamazsın. + + Blokları daha hızlı toplamak için işe uygun aletler yapabilirsin. Bazı aletlerin sopadan yapılma tutacakları vardır. Şimdi birkaç sopa üret.{*SticksIcon*} - - Yanına katılmaya çalıştığın oyuncu, oyunun eski bir sürümünü kullandığından dolayı bu oyuna katılamazsın. + + Kürek, toprak ile kar gibi yumuşak blokları daha hızlı kazmana yardım eder. Daha çok malzeme topladıkça, hızlı çalışan ve uzun dayanan aletler üretebilirsin. Ahşap bir kürek yap.{*WoodenShovelIcon*} - - Yanına katılmaya çalıştığın oyuncu, oyunun yeni bir sürümünü kullandığından dolayı bu oyuna katılamazsın. + + Artı imlecini üretim masasına doğrultup{*CONTROLLER_ACTION_USE*} düğmesine basarak aç. - - Yeni Dünya + + Üretim masası seçiliyken, artı imlecini istediğin yere doğrult ve{*CONTROLLER_ACTION_USE*} düğmesini kullanarak üretim masasını yerleştir. - - Ödül Kilidi Açıldı! + + Minecraft, hayal edebileceğin her şeyi inşa etmek amacıyla bloklar yerleştirmeye dayalı bir oyundur. Geceleri canavarlar ortaya çıkar, bu olmadan önce bir barınak inşa ettiğinden emin ol. - - İşte bu! Minecraft'tan Steve'in bulunduğu bir oyuncu resmiyle ödüllendirildin! + + - - İşte bu! Ürpertenin bulundugu bir oyuncu resmiyle ödüllendirildin! - + + - - Tam Oyunun Kilidini Aç + + - - Deneme oyununu oynuyorsun ancak oyunu kaydedebilmen için tam oyuna sahip olmalısın. -Tam oyunun kilidini şimdi açmak ister misin? + + - - Lütfen bekle + + - - Sonuç bulunamadı + + - - Filtre: + + - - Arkadaşlar + + 1. Dizilim - - Skorum + + Hareket (Uçarken) - - Genel + + Oyuncular/Davet Et - - Kayıtlar: + + - - Sıra + + 3. Dizilim - - Seviye kaydedilmeye hazırlanıyor + + 2. Dizilim - - Parçalar hazırlanıyor… + + - - Sonuçlandırılıyor… + + - - Arazi inşa ediliyor + + - - Dünya simüle ediliyor + + - - Sunucu başlatılıyor + + {*B*}Eğitim bölümünü başlatmak için{*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Kendi başına oynamaya hazır olduğunu düşünüyorsan{*CONTROLLER_VK_B*} düğmesine bas. - - Canlanma bölgesi oluşturuluyor + + {*B*}Devam etmek için{*CONTROLLER_VK_A*} düğmesine bas. - - Canlanma bölgesi yükleniyor + + - - Dip Alem'e giriliyor + + - - Dip Alem terk ediliyor + + - - Yeniden canlandırılıyor + + - - Seviye oluşturuluyor + + - - Seviye yükleniyor + + - - Oyuncular kaydediliyor + + - - Kurucuya bağlanılıyor + + - - Arazi indiriliyor + + Gümüşçün Bloğu - - Çevrimdışı oyuna geçiliyor + + Taş Levha - - Kurucu oyunu kaydederken beklemede kal + + Demir depolamanın kompakt bir yolu. - - SON'a giriliyor + + Demir Bloğu - - SON terk ediliyor + + Meşe Odunu Levha - - Bu yatak dolu + + Kum Taşı Levha - - Sadece gece uyuyabilirsin + + Taş Levha - - %s bir yatakta uyuyor. Şafak vaktine geçilmesi için tüm oyuncuların aynı anda yataklarında uyumaları gerek. + + Altın depolamanın kompakt bir yolu. - - Ev yatağın kayıp ya da engellenmiş durumda + + Çiçek - - Şu an dinlenemezsin, yakınlarda canavarlar var + + Beyaz Yün - - Bir yatakta uyuyorsun. Şafak vaktine geçilmesi için tüm oyuncuların aynı anda yataklarında uyumaları gerek. + + Turuncu Yün - - Aletler ve Silahlar + + Altın Bloğu - - Silahlar + + Mantar - - Gıda + + Gül - - Yapılar + + Parke Taşı Levha - - Zırh + + Kitap Rafı - - Düzenekler + + TNT - - Nakliye + + Tuğlalar - - Dekorasyonlar + + Meşale - - İnşa Blokları + + Obsidiyen - - Kızıltaş ve Nakliyat + + Yosunlu Taş - - Çeşitli + + Dip Alem Tuğlası Levha - - Simya + + Meşe Odunu Levha - - Aletler, Silahlar ve Zırhlar + + Taş Tuğla Levha - - Malzemeler + + Tuğla Levha - - Çıkış yapıldı + + Orman Odunu Levha - - Zorluk + + Huş Odunu Levha - - Müzik + + Ladin Odunu Levha - - Ses + + Galibarda Yün - - Gama + + Huş Yaprakları - - Oyun Duyarlılığı + + Ladin Yaprakları - - Arabirim Duyarlılığı + + Meşe Yaprakları - - Huzurlu + + Cam - - Kolay + + Sünger - - Normal + + Orman Yaprakları - - Zor + + Yapraklar - - Bu modda, oyuncu zamanla sağlığını geri kazanır ve çevrede hiç düşman bulunmaz. + + Meşe - - Bu modda, düşmanlar çevrede canlanır ancak Normal moda göre oyuncuya daha az hasar verirler. + + Ladin - - Bu modda, düşmanlar çevrede canlanır ve oyuncuya standart miktarda hasar verirler. + + Huş - - Bu modda, düşmanlar çevrede canlanır ve oyuncuya büyük miktarda hasar verirler. Ürpertenlere de dikkat et çünkü yanlarından uzaklaştığında muhtemelen patlama saldırılarını iptal etmeyecekler. + + Ladin Odunu - - Deneme Süresi Doldu + + Huş Odunu - - Oyun dolu + + Orman Odunu - - Yer olmadığından dolayı oyuna katılım başarısız + + Yün - - Tabela Yazısı Gir + + Pembe Yün - - Tabelana bir bilgi ya da metin gir + + Gri Yün - - Başlık Gir + + Açık Gri Yün - - Mesajına bir başlık gir + + Açık Mavi Yün - - Alt Başlık Gir + + Sarı Yün - - Mesajına bir alt başlık gir + + Limon Yeşili Yün - - Açıklama Gir + + Camgöbeği Yün - - Mesajına bir açıklama gir + + Yeşil Yün - - Envanter + + Kırmızı Yün - - Bileşenler + + Siyah Yün - - Simya Standı + + Mor Yün - - Sandık + + Mavi Yün - - Büyüle + + Kahverengi Yün - - Ocak + + Meşale (Kömür) - - Bileşen + + Parıltı Taşı - - Yakacak + + Ruh Kumu - - Fırlatıcı + + Dip Alem Kütlesi - - Şu an için bu başlıkta bu türe ait bir indirilebilir içerik sunumu bulunmuyor. + + Laciverttaş Bloğu - - %s oyuna katıldı. + + Laciverttaş Cevheri - - %s oyundan ayrıldı. + + Portal - - %s oyundan atıldı. + + Cadılar Bayramı Kabağı - - Bu kayıtlı oyunu silmek istediğinden emin misin? + + Şeker Kamışı - - Onay bekleniyor + + Kil - - Sansürlü + + Kaktüs - - Şu an oynanan: + + Bal Kabağı - - Ayarları Sıfırla + + Çit - - Ayarlarını sıfırlayarak başlangıç değerlerine döndürmek istediğinden emin misin? + + Müzik Kutusu - - Yükleme Hatası + + Laciverttaş depolamanın kompakt bir yolu. - - %s Oyunu + + Yatay Kapı - - Bilinmeyen kurucu oyunu + + Kilitli Sandık - - Misafir çıkış yaptı + + Diyot - - Misafir bir oyuncu oyundan çıktığından dolayı bütün misafir oyuncular oyundan çıkarıldı. + + Yapışkan Piston - - Giriş yap + + Piston - - Giriş yapmadın. Bu oyunu oynamak için giriş yapman gerekiyor. Şimdi giriş yapmak istiyor musun? + + Yün (herhangi bir renk) - - Çok oyunculu oyuna izin verilmedi + + Ölü Çalı - - Oyun oluşturulamadı + + Pasta - - Otomatik Seçilen + + Nota Bloğu - - Paketsiz: Başlangıç Görünümleri + + Fırlatıcı - - Favori Görünümler + + Uzun Çimen - - Yasaklanan Seviye + + - - Katıldığın oyun yasaklanan seviye listende yer alıyor. -Bu oyuna katılmayı seçersen, bu seviye yasaklanan seviye listenden çıkartılacak. + + Yatak - - Bu Seviye Yasaklansın Mı? + + Buz - - Bu seviyeyi yasaklanan seviye listene eklemek istediğinden emin misin? -'Tamam'ı seçtiğinde bu oyundan ayrılacaksın. + + Üretim Masası - - Yasaklanan Listesinden Çıkart + + Elmas depolamanın kompakt bir yolu. - - Otomatik Kayıt Arası + + Elmas Bloğu - - Otomatik Kayıt Arası: Kapalı + + Ocak - - Dk. + + Ekim Toprağı - - Buraya Yerleştirilemez! + + Mahsul - - Canlanan oyuncuların ani ölümüne yol açabileceğinden dolayı seviye canlanma noktasının yakınına lav yerleştirmeye izin verilmemektedir. + + Elmas Cevheri - - Arabirim Saydamlığı + + Canavar Canlandırıcı - - Seviyeyi Otomatik Kaydetmeye Hazırlanılıyor + + Ateş - - Gösterge Boyutu + + Meşale (Odun Kömürü) - - Gösterge Boyutu (Bölünmüş Ekran) + + Kızıltaş Tozu - - Oluşum + + Sandık - - Görünüm Paketinin Kilidini Aç + + Meşe Odunu Basamak - - Seçtiğin görünümü kullanmak için bu görünüm paketinin kilidini açmalısın. -Bu görünüm paketinin kilidini şimdi açmak ister misin? - + + Tabela - - Kaplama Paketinin Kildini Aç + + Kızıltaş Cevheri - - Dünyanda bu kaplama paketini kullanmak için kilidini açmalısın. -Kilidini şimdi açmak ister misin? + + Demir Kapı - - Deneme Kaplama Paketi + + Basınç Plakası - - Kaplama paketinin deneme sürümünü kullanıyorsun. Tam sürümünün kilidini açmazsan bu dünyayı kaydedemeyeceksin. -Kaplama paketinin tam sürümünün kilidini açmak ister misin? + + Kar - - Kaplama Paketi Mevcut Değil + + Düğme - - Tam Sürümün Kilidini Aç + + Kızıltaş Meşalesi - - Denenme Sürümünü İndir + + Şalter - - Tam Sürümü İndir + + Ray - - Bu dünya sende bulunmayan bir uyarlama paketi ya da kaplama paketi kullanıyor! -Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? + + Merdiven - - Denenme Sürümünü Edin + + Ahşap Kapı - - Tam Sürümü Edin + + Taş Basamak - - Oyuncuyu at + + Dedektörlü Ray - - Bu oyuncuyu oyundan atmak istediğinden emin misin? Dünyayı yeniden başlatana kadar oyuna katılamayacak. + + Enerjili Ray - - Oyuncu Resmi Paketleri + + Ocak yapmaya yetecek kadar parke taşı topladın. Şimdi üretim masanı kullanarak bir ocak üret. - - Temalar + + Olta - - Görünüm Paketleri + + Saat - - Arkadaşımın arkadaşına izin ver + + Parıltı Taşı Tozu - - Kurucunun arkadaşı olan oyuncular için kısıtlandığından dolayı bu oyuna katılamazsın. + + Ocaklı Maden Arabası - - Oyuna Katılınamıyor + + Yumurta - - Seçilen + + Pusula - - Seçilen görünüm: + + Çiğ Balık - - Bozuk İndirilebilir İçerik + + Gül Kırmızısı - - Bu indirilebilir içerik bozulmuş ve kullanılamaz durumda. Bu içeriği silip ardından Minecraft Mağazası menüsünden yeniden yüklemelisin. + + Kaktüs Yeşili - - İndirilebilir içeriklerinden bazıları bozulmuş ve kullanılamaz durumda. Bu içerikleri silip ardından Minecraft Mağazası menüsünden yeniden yüklemelisin. + + Kakao Çekirdekleri - - Oyun modun değiştirildi + + Pişmiş Balık - - Dünyanı Yeniden Adlandır + + Boya Tozu - - Dünyanın yeni adını gir + + Mürekkep Kesesi - - Oyun Modu: Sağ Kalma + + Sandıklı Maden Arabası - - Oyun Modu: Yaratıcılık + + Kartopu - - Sağ Kalma + + Kayık - - Yaratıcılık + + Deri - - Sağ Kalma Modunda Oluşturuldu + + Maden Arabası - - Sağ Kalma Modunda Oluşturuldu + + Eyer - - Bulutları Göster + + Kızıltaş - - Bu kayıtlı oyunla ne yapmak istersin? + + Süt Kovası - - Kaydı Yeniden Adlandır + + Kağıt - - %d sn. sonra otomatik kaydediliyor... + + Kitap - - Açık + + Balçık Topu - - Kapalı + + Tuğla - - Normal + + Kil - - Aşırı Düz + + Şeker Kamışları - - Etkinleştirildiğinde, oyun çevrimiçi hale gelir. + + Laciverttaş - - Etkinleştirildiğinde, sadece davet edilen oyuncular katılabilir. + + Harita - - Etkinleştirildiğinde, Arkadaş Listendeki kişilerin arkadaşları oyuna katılabilir. + + Müzik Plağı - "13" - - Etkinleştirildiğinde, oyuncular diğer oyunculara hasar verebilir. Sadece Sağ Kalma modunda etki eder. + + Müzik Plağı - "kedi" - - Etkinsizleştirildiğinde, oyuna katılan oyuncular yetki verilene kadar inşa edemez ya da kazamaz. + + Yatak - - Etkinleştirildiğinde, ateş yakındaki alev alabilen bloklara yayılabilir. + + Kızıltaş Yineleyici - - Etkinleştirildiğinde, TNT harekete geçirildiğinde patlar. + + Kurabiye - - Etkinleştirildiğinde, Dip Alem dünyası yeniden oluşturulur. Dip Alem Kalelerinin olmadığı eski bir kayda sahipsen bu seçenek yararlı olacaktır. + + Müzik Plağı - "bloklar" - - Etkinleştirildiğinde, dünyada Köy ve Kale gibi yapılar oluşturulacaktır. + + Müzik Plağı - "mellohi" - - Etkinleştirildiğinde, Üstdünya'da ve Dip Alem'de tamamen düz bir dünya oluşturulur. + + Müzik Plağı - "stal" - - Etkinleştirildiğinde, oyuncunun canlanma noktasının yakınında bazı işe yarar eşyaların bulunduğu bir sandık oluşturulur. + + Müzik Plağı - "strad" - - Görünüm Paketleri + + Müzik Plağı - "cıvıltı" - - Temalar + + Müzik Plağı - "uzak" - - Oyuncu Resimleri + + Müzik Plağı - "AVM" - - Avatar Eşyaları + + Pasta - - Kaplama Paketleri + + Gri Boya - - Uyarlama Paketleri + + Pembe Boya - - {*PLAYER*} alevlere gömüldü + + Limon Yeşili Boya - - {*PLAYER*} yanarak öldü + + Mor Boya - - {*PLAYER*} lavların içinde yüzmeye kalkıştı + + Camgöbeği Boya - - {*PLAYER*} bir duvarın içinde havasızlıktan boğuldu + + Açık Gri Boya - - {*PLAYER*} boğuldu + + Karahindiba Sarısı - - {*PLAYER*} açlıktan öldü + + Kemik Tozu - - {*PLAYER*} kaktüs iğnesiyle öldü + + Kemik - - {*PLAYER*} yere çok sert çarptı + + Şeker - - {*PLAYER*} dünyanın dışına düştü + + Açık Mavi Boya - - {*PLAYER*} öldü + + Galibarda Boya - - {*PLAYER*} havaya uçtu + + Turuncu Boya - - {*PLAYER*} büyüyle öldü + + Tabela - - {*PLAYER*} Sonveren Ejderha nefesiyle öldü + + Deri Tunik - - {*PLAYER*}, {*SOURCE*} tarafından katledildi + + Demir Göğüs Zırhı - - {*PLAYER*}, {*SOURCE*} tarafından katledildi + + Elmas Göğüs Zırhı - - {*PLAYER*}, {*SOURCE*} tarafından vuruldu + + Demir Miğfer - - {*PLAYER*}, {*SOURCE*} tarafından ateş topuyla vuruldu + + Elmas Miğfer - - {*PLAYER*}, {*SOURCE*} tarafından dövülerek öldürüldü + + Altın Miğfer - - {*PLAYER*}, {*SOURCE*} tarafından öldürüldü + + Altın Göğüs Zırhı - - Taban Sisi + + Altın Pantolon - - Göstergeleri Göster + + Deri Çizmeler - - Eli Göster + + Demir Çizmeler - - Ölüm Mesajları + + Deri Pantolon - - Hareketli Karakter + + Demir Pantolon - - Özel Görünüm Animasyonu + + Elmas Pantolon - - Artık eşya kazamaz veya kullanamazsın + + Deri Başlık - - Artık eşya kazabilir veya kullanabilirsin + + Taş Çapa - - Artık blok yerleştiremezsin + + Demir Çapa - - Artık blok yerleştirebilirsin + + Elmas Çapa - - Artık kapıları ve düğmeleri kullanabilirsin + + Elmas Balta - - Artık kapıları ve düğmeleri kullanamazsın + + Altın Balta - - Artık konteynerleri kullanabilirsin. (Ör. Sandıklar) + + Ahşap Çapa - - Artık konteynerleri kullanamazsın. (Ör. Sandıklar) + + Altın Çapa - - Artık yaratıklara saldıramazsın + + Zincir Göğüs Zırhı - - Artık yaratıklara saldırabilirsin + + Zincir Pantolon - - Artık oyunculara saldıramazsın + + Zincir Çizmeler - - Artık oyunculara saldırabilirsin + + Ahşap Kapı - - Artık hayvanlara saldıramazsın + + Demir Kapı - - Artık hayvanlara saldırabilirsin + + Zincir Miğfer - - Artık denetleyicisin + + Elmas Çizmeler - - Artık denetleyici değilsin + + Tüy - - Artık uçabilirsin + + Barut - - Artık uçamazsın + + Buğday Tohumu - - Artık yorulmazsın + + Kase - - Artık yorulabilirsin + + Mantar Yahnisi - - Artık görünmezsin + + İp - - Artık görünmez değilsin + + Buğday - - Artık hasar almazsın + + Pişmiş Domuz Pirzolası - - Artık hasar alabilirsin + + Tablo - - %d MYP + + Altın Elma - - Sonveren Ejderha + + Ekmek - - %s Son'a girdi + + Çakmak Taşı - - %s Son'dan çıktı + + Çiğ Domuz Pirzolası - - {*C3*}Bahsettiğin oyuncuyu görüyorum.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} -{*C3*}Evet. Dikkat et. Şimdi daha yüksek bir seviyeye ulaştı. Düşüncelerimizi okuyabilir.{*EF*}{*B*}{*B*} -{*C2*}Fark etmez. Bizim oyunun bir parçası olduğumuzu sanıyor.{*EF*}{*B*}{*B*} -{*C3*}Bu oyuncuyu seviyorum. İyi oynadı. Vazgeçmedi.{*EF*}{*B*}{*B*} -{*C2*}Bizim düşüncelerimizi ekrandaki yazılar olarak okuyor.{*EF*}{*B*}{*B*} -{*C3*}Oyunun hayalinin derinliklerine daldığında birçok şeyi bu şekilde hayal etmeyi tercih eder.{*EF*}{*B*}{*B*} -{*C2*}Kelimeler çok iyi bir arabirim oluşturuyor. Çok esnek. Ve ekranın ardındaki gerçekliğe bakmaktan daha az korkutucu.{*EF*}{*B*}{*B*} -{*C3*}Eskiden sesler duyarlardı. Oyuncular okumayı bilmezden önce. O zamanlar, oyunu oynamayanlar oyunculara cadı ve büyücü derdi. Ve oyuncular havada şeytanlar tarafından hareket ettirilen çubukların üstünde uçtuklarını hayal ederlerdi.{*EF*}{*B*}{*B*} -{*C2*}Bu oyuncu ne hayal etti?{*EF*}{*B*}{*B*} -{*C3*}Bu oyuncu gün ışığını ve ağaçları hayal etti. Ateşi ve suyu hayal etti. Hayal etti ve yarattı. Hayal etti ve yok etti. Hayal etti avladı ve avlandı. Sığınak hayal etti.{*EF*}{*B*}{*B*} -{*C2*}Hah, asıl arabirim. Bir milyon yıllık ama hala çalışıyor. Ama bu oyuncunun ekranın ardındaki gerçeklikte asıl yarattığı yapı nedir?{*EF*}{*B*}{*B*} -{*C3*}İşe yaradı, bir milyon diğerleriyle beraber, {*EF*}{*NOISE*}{*C3*} ile dolu gerçek dünyada bir {*EF*}{*NOISE*}{*C3*} yarattı, {*EF*}{*NOISE*}{*C3*} için, {*EF*}{*NOISE*}{*C3*} içinde.{*EF*}{*B*}{*B*} -{*C2*}Bu düşünceyi okuyamaz.{*EF*}{*B*}{*B*} -{*C3*}Hayır. Daha en yüksek seviyeye ulaşmadı. Bunun için uzun bir hayat hayal etmeli kısa bir oyun değil.{*EF*}{*B*}{*B*} -{*C2*}Sevdiğimizi biliyor mu? Kainatın merhametli olduğunu?{*EF*}{*B*}{*B*} -{*C3*}Bazen düşüncelerinin sesiyle, kainatı duyabilir, evet.{*EF*}{*B*}{*B*} -{*C2*}Ama üzüldüğü zamanlar olur, uzun hayallerde. Yazı olmayan dünyalar yaratır ve kara bir güneşin altında titrer ve bu üzgün yaratımını gerçek sanar.{*EF*}{*B*}{*B*} -{*C3*}Onu kederden kurtarmak yok eder. Keder onun özel vazifesinin bir parçası. Biz karışamayız.{*EF*}{*B*}{*B*} -{*C2*}Bazen derin hayallere daldıklarında, onlara gerçeklikte gerçek dünyalar inşa ettiklerini söylemek istiyorum. Bazen onlara kainattaki önemlerini anlatmak istiyorum. Bazen bir süre boyunca gerçek bir bağlantı kurmadıklarında, onlara korktukları şeyleri söylemekte yardım etmek istiyorum.{*EF*}{*B*}{*B*} -{*C3*}Düşüncelerimizi okuyor.{*EF*}{*B*}{*B*} -{*C2*}Bazen umursamıyorum. Bazen onlara söylemek istiyorum, gerçek sandıkları dünya sadece bir {*EF*}{*NOISE*}{*C2*} vr {*EF*}{*NOISE*}{*C2*}, onlara {*EF*}{*NOISE*}{*C2*} içinde bir olduklarını söylemek istiyorum {*EF*}{*NOISE*}{*C2*}. Uzun hayalleri boyunca gerçekliği çok az görüyorlar.{*EF*}{*B*}{*B*} -{*C3*}Ancak yine de oyunu oynuyorlar.{*EF*}{*B*}{*B*} -{*C2*}Ama onlara söylemek çok kolay olurdu...{*EF*}{*B*}{*B*} -{*C3*}Bu hayal için çok güçlü. Onlara nasıl yaşayacaklarını söylemek onları yaşamaktan alıkoyar.{*EF*}{*B*}{*B*} -{*C2*}Ben oyuncuya nasıl yaşayacağını söylemeyeceğim.{*EF*}{*B*}{*B*} -{*C3*}Oyuncu huzursuzlanıyor.{*EF*}{*B*}{*B*} -{*C2*}Oyuncuya bir hikaye anlatacağım.{*EF*}{*B*}{*B*} -{*C3*}Ama gerçeği değil.{*EF*}{*B*}{*B*} -{*C2*}Hayır. Gerçeği güvenli bir şekilde taşıyan bir hikaye, kelime kafeslerinde. Her mesafeden yakıcı olan çıplak gerçeği değil.{*EF*}{*B*}{*B*} -{*C3*}Ona bir vücut ver, tekrar.{*EF*}{*B*}{*B*} -{*C2*}Evet. Oyuncu...{*EF*}{*B*}{*B*} -{*C3*}Adını kullan.{*EF*}{*B*}{*B*} -{*C2*}{*PLAYER*}. Oyunların oyuncusu.{*EF*}{*B*}{*B*} -{*C3*}Güzel.{*EF*}{*B*}{*B*} + + Sopa - - {*C2*}Şimdi bir nefes. Bir nefes daha al. Havayı ciğerlerinde hisset. Bırak uzuvların geri gelsin. Evet parmaklarını oynat. Tekrar bir vücudun olsun, yer çekiminde, havada. Uzun hayalde tekrar doğ. İşte. Vücudun tekrar her zerrede kainata değsin, sanki sen ayrı bir şeymişsin gibi. Sanki biz ayrı bir şeymişiz gibi.{*EF*}{*B*}{*B*} -{*C3*}Biz kimiz? Önceleri bize dağın ruhu denirdi. Güneş baba, ay ana. Ataların ruhları, hayvanların ruhları. Cin. Hayalet. Yeşil adam. Tanrılar, iblisler. Melekler. Öcüler. Uzaylılar, dünya dışı canlılar. Leptonlar, kuraklar. Kelimeler değişiyor. Biz değişmiyoruz.{*EF*}{*B*}{*B*} -{*C2*}Biz kainatız. Biz sen olmadığını düşündüğün her şeyiz. Şu an bize bakıyorsun, derin ve gözlerinle. Neden kainat derine dokunuyor ve sana ışık gönderiyor? Seni görmek için, oyuncu. Seni tanımak için ve tanınmak için. Sana bir hikaye anlatacağım.{*EF*}{*B*}{*B*} -{*C2*}Bir zamanlar bir oyuncu varmış.{*EF*}{*B*}{*B*} -{*C3*}Bu oyuncu sendin, {*PLAYER*}.{*EF*}{*B*}{*B*} -{*C2*}Bazen kendisinin erimiş taştan oluşan dönen bir kürenin üstündeki ince bir kabukta yaşayan bir insan olduğunu sanıyor. Erimiş kaya küresi kendinden üç yüz otuz bin kez büyük yanan bir gaz topunun etrafında dönüyormuş. Birbirlerinden o kadar uzaklarmış ki ışığın arada gitmesi sekiz dakika sürüyormuş. Işık yıldızdan gelen bir malumatmış ve yüz elli milyon kilometre öteden cildini yakabilirmiş.{*EF*}{*B*}{*B*} -{*C2*}Bazen oyuncu bir madenci olduğunu hayal ediyor, düz ve sonsuz bir dünyanın yüzeyinde. Güneş beyaz bir kareden ibaret. Günler kısa; yapacak çok iş var ve ölüm sadece geçici bir rahatsızlık.{*EF*}{*B*}{*B*} -{*C3*}Bazen oyuncu bir hikayenin içinde kaybolduğunu hayal ediyor.{*EF*}{*B*}{*B*} -{*C2*}Bazen oyuncu başka yerlerdeki başka şeyler olduğunu hayal ediyor. Bazen bu hayaller rahatsız edici olur. Bazen de çok güzel olur. Bazen oyuncu bir rüyadan diğerine oradan da üçüncü bir rüyanın içine uyanır.{*EF*}{*B*}{*B*} -{*C3*}Bazen oyuncu bir ekran ile dünyaları izlediğini hayal eder.{*EF*}{*B*}{*B*} -{*C2*}Geriye dönelim.{*EF*}{*B*}{*B*} -{*C2*}Oyuncunun atomları çimenlere, nehirlere, havaya, yere saçılmıştı. Bir kadın atomları topladı; içti yedi ve ciğerlerine çekti ve kadın oyuncuyu kendi bedeninde birleştirdi.{*EF*}{*B*}{*B*} -{*C2*}Ve oyuncu uyandı, annesinin bedeninin sıcak ve karanlık dünyasından uzun bir rüyaya uyandı.{*EF*}{*B*}{*B*} -{*C2*}Ve oyuncu yeni bir hikaye oldu, daha önce anlatılmamış, DNA ile yazılmış. Oyuncu yeni bir programdı, daha önce hiç çalışmamış, bir milyar yıllık bir kaynak koddan üretilmiş. Ve oyuncu yeni bir insandı, daha önce yaşamamış, sadece süt ve sevgiden yapılmış.{*EF*}{*B*}{*B*} -{*C3*}Sen oyuncusun. Hikayesin. Programsın. İnsansın. Sadece süt ve sevgiden yapılmış.{*EF*}{*B*}{*B*} -{*C2*}Daha da geriye gidelim.{*EF*}{*B*}{*B*} -{*C2*}Oyuncunun bedeninin yedi milyar çarpı milyar çarpı milyar atomu bu oyundan çok önce, bir yıldızın kalbinde yaratıldı. Bu yüzden oyuncu da bir yıldızdan gelen bir malumattır. Ve oyuncu bir hikayenin içinde hareket eder, Julian diye birinin diktiği bilgi ormanında ve Markus diye birinin yarattığı düz sonsuz bir dünyada, bunlar oyuncunun yarattığı küçük ve özel bir dünyada bulunur, oyuncu da şu kişi tarafından yaratılan kainata yaşar...{*EF*}{*B*}{*B*} -{*C3*}Şşt. Bazen oyuncu yumuşak sıcak ve basit olan küçük, özel bir dünya yaratır. Bazen zor, soğuk ve karmaşık. Bazen kafasında kainatın bir modelini kurar; devasa boş bir alanda gezen enerji zerreleri. Bazen bu zerrelere "elektron" ve "proton" der.{*EF*}{*B*}{*B*} - + + Kova - - {*C2*}Bazen onlara "gezegenler" ve "yıldızlar" der.{*EF*}{*B*}{*B*} -{*C2*}Bazen enerjiden yapılmış, açık ve kapalıdan yapılmış; sıfır ve birden yapılmış; kod satırlarından yapılmış bir kainatta yaşadığına inanır. Bazen bir oyun oynadığına inanır. Bazen ekrandaki kelimeleri okuduğuna inanır.{*EF*}{*B*}{*B*} -{*C3*}Sen oyuncusun, kelimeleri okuyorsun...{*EF*}{*B*}{*B*} -{*C2*}Şşt... Bazen oyuncu ekranda kod satırlarını okur. Onları kelimelere çevirir; kelimeleri manaya çevirir; manayı hislere, duygulara, teorilere, fikirlere çevirir ve oyuncu derin ve hızlı nefes almaya başlar, yaşadığını fark eder, yaşadığını, o binlerce ölüm gerçek değildir, oyuncu yaşıyordur{*EF*}{*B*}{*B*} -{*C3*}Sen. Sen. Sen yaşıyorsun.{*EF*}{*B*}{*B*} -{*C2*}ve bazen oyuncu kainatın onunla yaz ağaçlarının titreyen yapraklarının arasından sızan gün ışığı vasıtasıyla konuştuğuna inanır{*EF*}{*B*}{*B*} -{*C3*}ve bazen oyuncu kainatın onunla kışın gevrek gece semasından sızan ışık vasıtasıyla konuştuğuna inanır, oyuncunun gözünün kenarındaki bir ışık zerresi güneşten milyar kat büyük bir yıldız olabilir, o an oyuncuya görünebilmek için gezegenlerini plazmaya çevirmiştir, kainatın uzak bir köşesindeki evine yürürken, birden yemek kokusu alır, tanıdık bir kapının önünde, tekrar rüyaya dalmak üzereyken{*EF*}{*B*}{*B*} -{*C2*}ve bazen oyuncu kainatın onunla sıfırlar ve birler, dünyanın elektriği, bir rüyanın sonundaki ekranda kayan yazılar vasıtasıyla konuştuğuna inanır{*EF*}{*B*}{*B*} -{*C3*}ve kainat seni seviyorum dedi{*EF*}{*B*}{*B*} -{*C2*}ve kainat oyunu iyi oynadın dedi{*EF*}{*B*}{*B*} -{*C3*}ve kainat ihtiyacın olan her şey içinde dedi{*EF*}{*B*}{*B*} -{*C2*}ve kainat düşündüğünden daha güçlüsün dedi{*EF*}{*B*}{*B*} -{*C3*}ve kainat sen gün ışığısın dedi{*EF*}{*B*}{*B*} -{*C2*}ve kainat sen gecesin dedi{*EF*}{*B*}{*B*} -{*C3*}ve kainat savaştığın karanlık senin içinde dedi{*EF*}{*B*}{*B*} -{*C2*}ve kainat aradığın ışık senin içinde dedi{*EF*}{*B*}{*B*} -{*C3*}ve kainat yalnız değilsin dedi{*EF*}{*B*}{*B*} -{*C2*}ve kainat sen diğer şeylerden ayrı değilsin dedi{*EF*}{*B*}{*B*} -{*C3*}ve kainat sen kainatsın, kendini tadıyorsun, kendinle konuşuyorsun, kendi kodunu okuyorsun dedi{*EF*}{*B*}{*B*} -{*C2*}ve kainat seni seviyorum dedi çünkü sevgi sensin.{*EF*}{*B*}{*B*} -{*C3*}Ve oyun bitti ve oyuncu rüyadan uyandı. Ve oyuncu yeni bir rüyaya daldı. Ve oyuncu tekrar hayal etti, daha iyi hayal etti. Ve oyuncu kainatın kendisiydi. Ve oyuncu sevgiydi.{*EF*}{*B*}{*B*} -{*C3*}Oyuncu sensin.{*EF*}{*B*}{*B*} -{*C2*}Uyan.{*EF*} - + + Su Kovası - - Dip Alem'i Sıfırla + + Lav Kovası - - Bu oyun kaydındaki Dip Alem'i sıfırlayıp ilk haline getirmek istediğinden emin misin? Dip Alem'de inşa ettiğin her şey yok olacak! + + Altın Çizmeler - - Dip Alem'i Sıfırla + + Demir Külçe - - Dip Alem'i Sıfırlama + + Altın Külçe - - Şu an bu Möntar biçilemez. Maksimum Domuz, Koyun, İnek ve Kedi sayısına ulaşıldı. + + Çakmak Taşı ve Çelik - - Şu an Canlandırma Yumurtası kullanılamaz. Maksimum Domuz, Koyun, İnek ve Kedi sayısına ulaşıldı. + + Kömür - - Şu an Canlandırma Yumurtası kullanılamaz. Maksimum Möntar sayısına ulaşıldı. + + Odun Kömürü - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Kurt sayısına ulaşıldı. + + Elmas - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Tavuk sayısına ulaşıldı. + + Elma - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum Kalamar sayısına ulaşıldı. + + Yay - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum düşman sayısına ulaşıldı. + + Ok - - Şu an Canlandırma Yumurtası kullanılamaz. Dünyadaki maksimum köylü sayısına ulaşıldı. + + Müzik Plağı - "koruma" - - Dünyadaki maksimum Tablo/Eşya çerçevesi sayısına ulaşıldı. + + + Üretmek istediğin eşyaların grup tipini değiştirmek için {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} düğmesine bas. Yapının grubunu seç.{*StructuresIcon*} + - - Huzurlu Modda düşman canlandırılamaz. + + + Üretmek istediğin eşyaların grup tiplerini değiştirmek için {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} düğmesine bas. Araçlar grubunu seç.{*ToolsIcon*} + - - Bu hayvan Aşk Moduna giremez. Maksimum damızlık Domuz, Koyun, İnek ve Kedi sayısına ulaşıldı. + + + Artık bir üretim masan olduğuna göre onu dünyaya yerleştirip daha fazla eşya üretmeye başlayabilirsin.{*B*} + Üretim arabiriminden çıkmak için {*CONTROLLER_VK_B*} düğmesine bas. + - - Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Kurt sayısına ulaşıldı. - + + + Yaptığın aletler sayesinde iyi bir başlangıç yaptın ve çeşitli birçok malzemeyi daha etkili bir şekilde toplayabileceksin.{*B*} + Üretim arabiriminden çıkmak için şimdi {*CONTROLLER_VK_B*} bas. + - - Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Tavuk sayısına ulaşıldı. - + + + Birçok üretim için birçok adım gerekir. Artık biraz keresten olduğuna göre üretebileceğin daha çok eşya var. Üretmek istediğin eşyayı değiştirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. Üretim masasını seç.{*CraftingTableIcon*} + - - Bu hayvan Aşk Moduna giremez. Dünyadaki maksimum damızlık Möntar sayısına ulaşıldı. - + + + Üretmek istediğin eşyayı değiştirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. Bazı eşyaların kullanılan malzemeye göre değişen farklı türleri vardır. Ahşap küreği seç.{*WoodenShovelIcon*} + - - Dünyadaki maksimum Tekne sayısına ulaşıldı. + + Topladığın odunlardan kalas üretilebilir. Kalas simgesini seç ve {*CONTROLLER_VK_A*} düğmesine basarak üret.{*PlanksIcon*} - - Dünyadaki maksimum Yaratık Kellesi sayısına ulaşıldı. + + + Bir üretim masası kullanarak daha çok eşya üretebilirsin. Masada üretim yapmak normal üretim ile benzerdir ama daha geniş bir üretim alanın olduğu için daha çok bileşen kombinasyonu deneyebilirsin. + - - Bakışı Ters Çevir + + + Üretim alanı, yeni eşyalar üretmek için gereken bileşenleri gösterir. Eşyayı üretip envanterine yerleştirmek için {*CONTROLLER_VK_A*} düğmesine bas. + - - Solak + + + {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} kullanarak yukarıdaki Grup Tipleri sekmelerine bak ve üretmek istediğin eşyanın grup tipini seç, sonra da üretmek istediğin eşyayı {*CONTROLLER_MENU_NAVIGATE*} ile seç. + + + + + Seçili eşyayı üretmek için gerekli bileşenler gösteriliyor. + - - Öldün! + + + Seçili olan eşyanın açıklaması gösteriliyor. Açıklama eşyanın ne amaçla kullanılabileceğine dair bir fikir verebilir. + - - Tekrar Canlan + + + Üretim arabiriminin sağ alt kısmı envanterini gösterir. Bu alan aynı zamanda şu an seçili olan eşyanın açıklamasını ve onu üretmek için gereken bileşenleri belirtir. + - - İndirilebilir İçerik Teklifleri + + + Bazı eşyalar üretim masası kullanılarak üretilemez, bunlar için ocak gerekir. Şimdi bir ocak yapın.{*FurnaceIcon*} + - - Görünümü Değiştir + + Çakıl Taşı - - Nasıl Oynanır + + Altın Cevheri - - Kontroller + + Demir Cevheri - - Ayarlar + + Lav - - Emeği Geçenler + + Kum - - İçeriği Tekrar Yükle + + Kum Taşı - - Hata Düzeltme Ayarları + + Kömür Cevheri - - Yangın Yayılır + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Ocağı nasıl kullanacağını zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - TNT Patlar + + + Burası ocak arabirimi. Ocak sayesinde eşyaları eriterek değiştirebilirsin. Örneğin, ocakta demir cevheri eritip onları demir külçelerine çevirebilirsin. + - - Oyuncu vs Oyuncu + + + Ürettiğin ocağı dünyaya yerleştir. Bunu sığınağının içine koysan iyi olur.{*B*} + Üretim arabiriminden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + - - Oyunculara Güven + + Odun - - Kurucu Ayrıcalıkları + + Meşe Odunu - - Yapı Üret + + + Ocağın alttaki yuvasına biraz yakacak, üstteki yuvaya da değiştirilecek eşyayı koymalısın. Ocak o zaman yanmaya ve çalışmaya başlayacak, yeni eşyalar ise sağdaki yuvaya yerleştirilecek. + - - Aşırı Düz Dünya + + {*B*} + Envanteri tekrar görmek için {*CONTROLLER_VK_X*} düğmesine bas. + - - Bonus Sandık + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Envanteri nasıl kullanacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - Dünya Seçenekleri + + + Bu senin envanterin. Elinde kullanılabilen eşyaları ve taşıdığın diğer her şeyi gösterir. Zırhın da burada gösterilir. + - - İnşa Edebilir ve Kazabilir + + + {*B*} + Eğitime devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Tek başına oynamak için hazır olduğunu düşünüyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - Kapıları ve Düğmeleri Kullanabilir + + + İmleçte bir eşya varken imleci arabirimin dışına çıkarırsan, eşyayı bırakabilirsin. + - - Konteynerleri Açabilir + + + Bu eşyayı imleç ile envanterdeki başka bir boşluğa taşı ve {*CONTROLLER_VK_A*} ile yerleştir. + İmleçte birden fazla eşya varsa, {*CONTROLLER_VK_A*} ile hepsini yerleştir veya {*CONTROLLER_VK_X*} ile sadece birini yerleştir. + - - Oyunculara Saldırabilir + + + İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. İmlecin altındaki bir eşyayı almak için {*CONTROLLER_VK_A*} kullan. + Orada birden çok eşya varsa bu işlem hepsini alacaktır, {*CONTROLLER_VK_X*} ile sadece yarısını da alabilirsin. + - - Hayvanlara Saldırabilir + + Eğitimin ilk aşamasını tamamladın. + - - Denetleyici + + Cam yapmak için ocağı kullan. Onu beklerken barınağı tamamlamak için daha çok malzeme toplayarak zamandan tasarruf etmeye ne dersin? - - Oyuncuyu At + + Bir miktar odun kömürü yapmak için ocağı kullan. Onu beklerken barınağı tamamlamak için daha çok malzeme toplayarak zamandan tasarruf etmeye ne dersin? - - Uçabilir + + Dünya üzerinde bir yere ocağı yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullanıp ardından da ocağı aç. - - Yorulmayı Kapat + + Geceleri çok karanlık olabileceğinden dolayı etrafını görebilmen için barınağının içine birkaç ışıklandırma yapman gerekecek. Şimdi sopalarla odun kömürünü kullanarak üretim arabiriminde bir meşale üret.{*TorchIcon*} - - Görünmez + + Kapıyı yerleştirmek için{*CONTROLLER_ACTION_USE*} düğmesini kullan. Dünyadaki ahşap bir kapıyı açıp kapatmak için{*CONTROLLER_ACTION_USE*} düğmesini kullanabilirsin. - - Kurucu Seçenekleri + + İyi bir barınağın bir de kapısı olur, bu sayede duvarları kazıp geri yerleştirmeden kolayca girip çıkabilirsin. Şimdi ahşap bir kapı üret.{*WoodenDoorIcon*} - - Oyuncular/Davet + + + Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_ACTION_MENU_PAGEDOWN*} düğmesine bas. + - - Çevrimiçi Oyun + + + Burası üretim arabirimidir. Bu arabirim topladığın eşyaları birleştirip yeni eşyalar üretebilmeni sağlar. + - - Sadece Davetle + + + Yaratıcılık modu envanterinden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + - - Daha Fazla Seçenek + + + Bir eşya hakkında daha fazla bilgi istiyorsan, imleci eşyanın üzerine getir ve {*CONTROLLER_ACTION_MENU_PAGEDOWN*} düğmesine bas. + - - Yükle + + {*B*} + Geçerli eşyayı yapmak için gereken bileşenleri görmek için {*CONTROLLER_VK_X*} düğmesine bas. + - - Yeni Dünya + + {*B*} + Eşya açıklamasını göstermek için {*CONTROLLER_VK_X*} düğmesine bas. + - - Dünya Adı + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Üretimi nasıl yapacağını biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - Dünya Üreteci Tohumu + + + {*CONTROLLER_VK_LB*} ve {*CONTROLLER_VK_RB*} ile Grup Tipi sekmeleri arasından almak istediğin eşyanın grup tipini seç. + - - Rastgele bir tohum için boş bırak + + {*B*} + Devam etmek için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Yaratıcılık modu envanterini nasıl kullanacağını zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. + - - Oyuncular + + + Burası yaratıcılık modu envanteridir. Elinde kullanılabilir olan eşyaları ve seçebileceğin diğer tüm eşyaları gösterir. + - - Oyuna Katıl + + + Envanterden çıkmak için şimdi {*CONTROLLER_VK_B*} düğmesine bas. + - - Oyuna Başla + + + İmlecin üzerinde bir eşya varken imleci arabirimin dışına götürürsen, eşyayı dünyaya bırakabilirsin. Hızlı seçim çubuğundaki tüm eşyaları temizlemek için {*CONTROLLER_VK_X*} düğmesine bas. + - - Oyun Bulunamadı + + + İmleç, otomatik olarak kullanım sırasındaki bir boşluğa geçecek. {*CONTROLLER_VK_A*} kullanarak eşyayı yerleştirebilirsin. Eşyayı yerleştirdikten sonra, imleç başka bir tane seçebilmen için eşya listesine dönecek. + - - Oyun Oyna + + + İmleci hareket ettirmek için {*CONTROLLER_MENU_NAVIGATE*} kullan. + Eşya listesindeyken, imlecin altındaki bir eşyayı almak için {*CONTROLLER_VK_A*} düğmesine bas, istif halinde almak için ise {*CONTROLLER_VK_Y*} kullan. + - - Sıralama Tablosu + + Su - - Yardım & Seçenekler + + Cam Şişe - - Tüm Oyunun Kilidini Aç + + Su Şişesi + + + Örümcek Gözü - - Oyuna Devam Et + + Altın Keseği - - Oyunu Kaydet + + Dip Alem Yumrusu - - Zorluk: + + {*splash*}{*prefix*}{*postfix*}İksiri - - Oyun Türü: + + Mayalı Örümcek Gözü - - Yapılar: + + Kazan - - Seviye Türü: + + Sonveren Gözü - - PvP: + + Parıldayan Kavun - - Oyunculara Güven: + + Alaz Tozu - - TNT: + + Magma Özü - - Yangın Yayılır: + + Simya Standı - - Temayı Baştan Yükle + + Fersiz Gözyaşı - - Oyuncu Resmi 1'i Yeniden Yükle + + Bal Kabağı Çekirdekleri - - Oyuncu Resmi 2'yi Yeniden Yükle + + Kavun Çekirdekleri - - Avatar Eşyası 1'i Yeniden Yükle + + Çiğ Tavuk Eti - - Avatar Eşyası 2'yi Yeniden Yükle + + Müzik Plağı - "11" - - Avatar Eşyası 3'ü Yeniden Yükle + + Müzik Plağı - "neredeyiz şimdi" - - Seçenekler + + Makas - - Ses + + Pişmiş Tavuk Eti - - Kontrol + + Sonveren İncisi - - Görsel + + Kavun Dilimi - - Kullanıcı Arabirimi + + Alaz Çubuğu - - Başlangıç Ayarlarına Dön + + Çiğ Sığır Eti - - Sallantıyı Görüntüle + + Biftek - - İpuçları + + Çürümüş Et - - Oyun İçi Araç İpucu + + Efsunlu Şişe - - 2 Oyunculu Yatay Kesilmiş Ekran + + Meşe Kerestesi - - Tamam + + Ladin Kerestesi - - İmza mesajını düzenle: + + Huş Kerestesi - - Ekran görüntüsüne eklenecek detayları gir + + Çimen Bloğu - - Yazı + + Toprak - - Oyun için ekran görüntüsü + + Parke Taşı - - İmza mesajını düzenle: + + Orman Kerestesi - - Klasik Minecraft kaplamaları, simgeleri ve kullanıcı arabirimi! + + Huş Fidanı - - Tüm Birleşik Dünyaları Göster + + Orman Ağacı Fidanı - - Etki Yok + + Taban Kayası - - Hız + + Fidan - - Yavaşlık + + Meşe Fidanı - - Çabukluk + + Ladin Fidanı - - Kazı Yorgunluğu + + Taş - - Kuvvet + + Eşya Çerçevesi - - Zayıflık + + {*CREATURE*} Canlandır - - Anında Sağlık + + Dip Alem Tuğlası - - Anında Hasar + + Kor - - Zıplama Güçlendirici + + Kor (Odun Kömürü) - - Bulantı + + Kor (Kömür) - - Yenilenme + + Kafatası - - Direnç + + Kafa - - Ateş Direnci + + %s Kafası - - Suda Soluma + + Ürperten Kafası - - Görünmezlik + + İskelet Kafatası - - Körlük + + Soluk İskelet Kafatası - - Gece Görüşü + + Zombi Kafası - - Açlık + + Kömür depolamak için kompakt bir yöntem. Bir Ocakta yakıt olarak kullanılabilir. Zehir - - Sürat + + Açlık Yavaşlık - - Çabukluk + + Sürat - - Kazı Yorgunluğu + + Görünmezlik - - Kuvvet + + Suda Soluma - - Zayıflık + + Gece Görüşü - - Anında Sağlık + + Körlük Anında Hasar - - Zıplama Güçlendirici + + Anında Sağlık Bulantı @@ -5233,29 +6023,38 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Yenilenme - - Direnç + + Kazı Yorgunluğu - - Ateş Direnci + + Çabukluk - - Suda Soluma + + Zayıflık + + + Kuvvet + + + Ateş Direnci - - Görünmezlik + + Doygunluk - - Körlük + + Direnç - - Gece Görüşü + + Zıplama Güçlendirici - - Açlık + + Solgun - - Zehir + + Sağlık Güçlendirici + + + Soğurum @@ -5266,29 +6065,41 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? III + + Görünmezlik + IV - - Fırlatılabilen + + Suda Soluma - - Sıradan + + Ateş Direnci - - Yavan + + Gece Görüşü - - Yumuşak + + Zehir - - Berrak + + Açlık - - Sütlü + + : Soğurum - - Yayık + + : Doygunluk + + + : Sağlık Güçlendirici + + + Körlük + + + : Solgun Sade @@ -5296,17 +6107,17 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? İnceltilmiş - - Tuhaf + + Yayık - - Tatsız + + Berrak - - Hacimli + + Sütlü - - Bozan + + Tuhaf Yağlı @@ -5314,246 +6125,300 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Hafif - - Tatlı + + Bozan - - Latif + + Tatsız - - Koyu + + Hacimli - - Zarif + + Yumuşak - - Havalı + + Fırlatılabilen - - Alımlı + + Sıradan + + + Yavan Gösterişli - - Arıtılmış - Ferahlatıcı + + Alımlı + + + Zarif + + + Havalı + Işıltılı + + Acı + + + Sert + + + Kokusuz + Tesirli Fena - - Kokusuz + + Tatlı - - Acı + + Arıtılmış - - Sert + + Koyu - - Ekşi + + Latif - - İğrenç + + İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını zamanla onarır. - - Kokulu + + İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını anında azaltır. - - Bütün iksirlerin temeli olarak kullanılır. İksir oluşturmak için simya standında kullan. + + İksirden etkilenen oyuncuları, hayvanları ve yaratıkları; ateşe, lava ve menzilli Alaz saldırılarına karşı bağışık hale getirir . Etkisi yoktur, simya standında daha fazla içerik ekleyerek iksir yapımında kullanılabilir. - - İksirin etkisindeki oyuncuların, hayvanların ve canavarların hareket hızını ve oyuncunun koşma hızını, zıplama yüksekliğini ve görüş açısını artırır. + + Ekşi İksirin etkisindeki oyuncuların, hayvanların ve canavarların hareket hızını ve oyuncunun koşma hızını, zıplama yüksekliğini ve görüş açısını azaltır. + + İksirin etkisindeki oyuncuların, hayvanların ve canavarların hareket hızını ve oyuncunun koşma hızını, zıplama yüksekliğini ve görüş açısını artırır. + İksirden etkilenen oyuncuların ve yaratıkların saldırı sırasında verdikleri hasarı artırır. + + İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını anında artırır. + İksirden etkilenen oyuncuların ve yaratıkların saldırı sırasında verdikleri hasarı azaltır. - - İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını anında artırır. + + Bütün iksirlerin temeli olarak kullanılır. İksir oluşturmak için simya standında kullan. - - İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını anında azaltır. + + İğrenç - - İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını zamanla onarır. + + Kokulu - - İksirden etkilenen oyuncuları, hayvanları ve yaratıkları; ateşe, lava ve menzilli Alaz saldırılarına karşı bağışık hale getirir . + + Vuruş + + + Keskinlik İksirden etkilenen oyuncuların, hayvanların ve canavarların sağlığını zamanla azaltır. - - Keskinlik + + Saldırı Hasarı - - Vuruş + + Geri Fırlatma Eklembacaklı Felaketi - - Geri Fırlatma + + Hız - - Ateş Nazarı + + Zombi Takviyeleri - - Koruma + + Atın Zıplama Kuvveti + + + Uygulandığında: + + + Geri Fırlatma Direnci + + + Yaratık Takip Menzili + + + Maksimum Sağlık + + + İpeksi Dokunuş + + + Etkinlik + + + Suya Yakınlık + + + Talih + + + Yağma + + + Kırılmaz Ateşten Koruma + + Koruma + + + Ateş Nazarı + Hafif Düşüş - - Patlamadan Koruma + + Solunum Mermiden Koruma - - Solunum - - - Suya Yakınlık + + Patlamadan Koruma - - Etkinlik + + IV - - İpeksi Dokunuş + + V - - Kırılmaz + + VI - - Yağma + + Yumruk - - Talih + + VII - - Güç + + III Alev - - Yumruk + + Güç Sonsuzluk - - I - - - II - - - III + + II - - IV + + I - - V + + Bağlı tetikleyiciden bir canlı geçtiği zaman etkinleşir. - - VI + + İçinden bir canlı geçtiğinde bağlı bir Tetikleyici Kancayı etkinleştirir. - - VII + + Zümrütleri derli toplu depolama yolu. - - VIII + + Sandığa benzer ancak Sonveren Sandığına koyulan eşyalar oyuncunun tüm Sonveren Sandıklarında belirecektir, oyuncu farklı boyutlarda bile olsa. IX - - X + + VIII Zümrüt toplamak için Demir Kazma veya daha iyisi ile kazılabilir. - - Sandığa benzer ancak Sonveren Sandığına koyulan eşyalar oyuncunun tüm Sonveren Sandıklarında belirecektir, oyuncu farklı boyutlarda bile olsa. - - - Bağlı tetikleyiciden bir canlı geçtiği zaman etkinleşir. + + X - - İçinden bir canlı geçtiğinde bağlı bir Tetikleyici Kancayı etkinleştirir. + + 2 {*ICON_SHANK_01*} yeniler ve altın bir havuca dönüştürülebilir. Ekim toprağına ekilebilir. - - Zümrütleri derli toplu depolama yolu. + + Dekorasyon olarak kullanılır. Çiçekler, Fidanlar, Kaktüsler ve Mantarlar ekilebilir. Parketaşından yapılma bir duvar. - - Silahlar, aletler ve zırhları tamir etmek için kullanılabilir. + + 0.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Ekim toprağına ekilebilir. Dip Alem Kuvarsı üretmek için bir ocakta eritilebilir. - - Dekorasyon olarak kullanılır. + + Silahlar, aletler ve zırhları tamir etmek için kullanılabilir. Köylülerle takas edilebilir. - - Dekorasyon olarak kullanılır. Çiçekler, Fidanlar, Kaktüsler ve Mantarlar ekilebilir. + + Dekorasyon olarak kullanılır. - - 2 {*ICON_SHANK_01*} yeniler ve altın bir havuca dönüştürülebilir. Ekim toprağına ekilebilir. + + 4 {*ICON_SHANK_01*} yeniler. - - 0.5 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Ekim toprağına ekilebilir. + + 1 {*ICON_SHANK_01*} yeniler. Bunu yemek zehirlenmene neden olabilir. + + + Eyerlenmiş bir domuzu sürerken onu kontrol etmeyi sağlar. 3 {*ICON_SHANK_01*} yeniler. Ocakta patates pişirilerek üretilir. - - 1 {*ICON_SHANK_01*} yeniler veya ocakta pişirilebilir. Ekim toprağına ekilebilir. Bunu yemek zehirlenmene neden olabilir. - 3 {*ICON_SHANK_01*} yeniler. Havuç ve altın külçelerinden yapılır. - - Eyerlenmiş bir domuzu sürerken onu kontrol etmeyi sağlar. - - - 4 {*ICON_SHANK_01*} yeniler. - Örs ile birlikte kullanılarak silah, aletler ve zırhları efsunlamak için kullanılır. Dip Alem Kuvars Cevherini eriterek üretilir. Bir Kuvars Bloğuna dönüştürülebilir. + + Patates + + + Pişmiş Patates + + + Havuç + Yünden üretilir. Dekorasyon olarak kullanılır. @@ -5563,14 +6428,11 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Çiçek Saksısı - - Havuç - - - Patates + + Balkabağı Turtası - - Pişmiş Patates + + Efsunlu Kitap Zehirli Patates @@ -5581,11 +6443,11 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Havuçlu Değnek - - Balkabağı Turtası + + Tetikleyicili Kanca - - Efsunlu Kitap + + Tetikleyici Dip Alem Kuvarsı @@ -5596,11 +6458,8 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Sonveren Sandığı - - Tetikleyicili Kanca - - - Tetikleyici + + Yosunlu Parketaşı Duvar Zümrüt Bloğu @@ -5608,8 +6467,8 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Parketaşı Duvar - - Yosunlu Parketaşı Duvar + + Patatesler Çiçek Saksısı @@ -5617,8 +6476,8 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Havuçlar - - Patatesler + + Az Hasarlı Örs Örs @@ -5626,8 +6485,8 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Örs - - Az Hasarlı Örs + + Kuvars Bloğu Çok Hasarlı Örs @@ -5635,8 +6494,8 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Dip Alem Kuvars Cevheri - - Kuvars Bloğu + + Kuvars Merdivenler Yontma Kuvars Bloğu @@ -5644,8 +6503,8 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Sütun Kuvars Bloğu - - Kuvars Merdivenler + + Kırmızı Halı Halı @@ -5653,8 +6512,8 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Siyah Halı - - Kırmızı Halı + + Mavi Halı Yeşil Halı @@ -5662,9 +6521,6 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Kahverengi Halı - - Mavi Halı - Mor Halı @@ -5677,18 +6533,18 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Gri Halı - - Pembe Halı - Limon Yeşili Halı - - Sarı Halı + + Pembe Halı Açık Mavi Halı + + Sarı Halı + Galibarda Halı @@ -5701,88 +6557,83 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Yontma Kum Taşı - - Pürüzsüz Kum Taşı - {*PLAYER*} şuna zarar verirken öldü: {*SOURCE*} + + Pürüzsüz Kum Taşı + {*PLAYER*} düşen bir Örs tarafından ezildi. {*PLAYER*} düşen bir blok tarafından ezildi. - - {*PLAYER*} şuraya ışınlandı: {*DESTINATION*} - {*PLAYER*} seni kendi yanına ışınladı - - {*PLAYER*} seni ışınladı + + {*PLAYER*} şuraya ışınlandı: {*DESTINATION*} Dikenler - - Kuvars Levhası + + {*PLAYER*} seni ışınladı Karanlık bölgeleri su altında bile olsa gün ışığı altındaymış gibi aydınlatır. + + Kuvars Levhası + Etkilenen oyuncu, hayvan ve canavarları görünmez yapar. Onar ve İsimlendir - - Efsunlama Bedeli: %d - Çok Pahalı! - - Yeniden İsimlendir + + Efsunlama Bedeli: %d Sendekiler: - - Takas için Gereken Eşyalar + + Yeniden İsimlendir {*VILLAGER_TYPE*} teklifi %s - - Onar + + Takas için Gereken Eşyalar Takas Et - - Tasmayı boya + + Onar Burası, Tecrübe Seviyesi karşılığında silah, zırh veya aletlerin isimlerini değiştirebileceğin, onları onarıp efsunlayabileceğin Örs Arabirimidir. - - - {*B*} - Örs arabirimi hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Örs arabirimini zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. - + + Tasmayı boya Bir eşya üzerinde çalışmaya başlamak için, onu ilk girdi yuvasına yerleştir. - + - İkinci girdi yuvasına doğru hammadde yerleştirilince, (örneğin hasarlı bir Demir Kılıç için Demir Külçeler gibi), önerilen onarım çıktı yuvasında belirecektir. + {*B*} + Örs arabirimi hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Örs arabirimini zaten biliyorsan {*CONTROLLER_VK_B*} düğmesine bas. @@ -5790,18 +6641,18 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Ayrıca, ikinci yuvaya aynı eşyadan bir tane daha yerleştirilirse, ikisi birleştirilebilir. - + - Örste eşya efsunlamak için, ikinci girdi yuvasına bir Efsunlu Kitap yerleştir. + İkinci girdi yuvasına doğru hammadde yerleştirilince, (örneğin hasarlı bir Demir Kılıç için Demir Külçeler gibi), önerilen onarım çıktı yuvasında belirecektir. İşin ne kadar Tecrübe Seviyesine mal olacağı çıktının altında gösterilir. Yeterli Tecrübe Seviyen yoksa, tamir tamamlanamaz. - + - Metin kutusunda gösterilen ismi değiştirerek eşyanın adını değiştirmek mümkündür. + Örste eşya efsunlamak için, ikinci girdi yuvasına bir Efsunlu Kitap yerleştir. @@ -5809,9 +6660,9 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Onarılmış eşyayı almak Örs tarafından kullanılan iki eşyayı da tüketir ve Tecrübe Seviyeni de belirtilen miktarda azaltır. - + - Bu alanda bir Örs ve onu kullanabileceğin alet ve silahları içeren bir Sandık var. + Metin kutusunda gösterilen ismi değiştirerek eşyanın adını değiştirmek mümkündür. @@ -5821,9 +6672,9 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Örs hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + - Örs kullanılarak silah ve aletlerin dayanıklılığı yenilenebilir, isimleri değiştirilebilir veya Efsunlu Kitaplarla efsunlanabilirler. + Bu alanda bir Örs ve onu kullanabileceğin alet ve silahları içeren bir Sandık var. @@ -5831,9 +6682,9 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Efsunlu Kitaplar, zindanlardaki Sandıklarda bulunabilir veya Efsun Masasında normal kitapların efsunlanması ile üretilebilir. - + - Örsü kullanmak Tecrübe Seviyesine mal olur ve her kullanım sırasında Örs hasar alabilir. + Örs kullanılarak silah ve aletlerin dayanıklılığı yenilenebilir, isimleri değiştirilebilir veya Efsunlu Kitaplarla efsunlanabilirler. @@ -5841,9 +6692,9 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Yapılan işin türü, eşyanın değeri, efsun sayısı ve önceden yapılan işlerin sayısı tamir maliyetini etkiler. - + - Bir eşyanın adını değiştirmek, eşyanın adını tüm oyuncular için değiştirir ve önceki iş bedellerini kalıcı olarak düşürür. + Örsü kullanmak Tecrübe Seviyesine mal olur ve her kullanım sırasında Örs hasar alabilir. @@ -5851,9 +6702,9 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Bu bölgedeki Sandıkta, deneme yapman için hasarlı Kazmalar, hammaddeler, Efsunlu Şişeler ve Efsunlu Kitaplar bulacaksın. - + - Burası bir köylü ile yapabileceğin takasları gösteren takas arabirimidir. + Bir eşyanın adını değiştirmek, eşyanın adını tüm oyuncular için değiştirir ve önceki iş bedellerini kalıcı olarak düşürür. @@ -5863,18 +6714,18 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Takas arabirimini hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. - + - Köylünün şu anda yapabileceği tüm takas seçenekleri yukarıda gösterilir. + Burası bir köylü ile yapabileceğin takasları gösteren takas arabirimidir. Sende gerekli eşyalar yoksa takaslar kırmızı görünür ve takas yapılamaz. - + - Köylüye verdiğin eşya sayısı ve tipleri, soldaki iki kutuda gösterilir. + Köylünün şu anda yapabileceği tüm takas seçenekleri yukarıda gösterilir. @@ -5882,9 +6733,9 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Gereken toplam eşya sayısını soldaki iki kutuda görebilirsin. - + - Teklife açık olan eşyayı almak için köylüye ihtiyacı olan eşyaları {*CONTROLLER_VK_A*} düğmesine basarak ver. + Köylüye verdiğin eşya sayısı ve tipleri, soldaki iki kutuda gösterilir. @@ -5892,11 +6743,9 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Bu bölgede bir köylü ve içinde eşya satın almak için gereken Kağıt bulunan bir Sandık var. - + - {*B*} - Takas hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} - Takas hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. + Teklife açık olan eşyayı almak için köylüye ihtiyacı olan eşyaları {*CONTROLLER_VK_A*} düğmesine basarak ver. @@ -5904,14 +6753,21 @@ Uyarlama paketini ya da kaplama paketini şimdi yüklemek ister misin? Oyuncular envanterindeki eşyaları köylülerle takas edebilir. - + - Bir köylünün yapacağı teklifler, onun mesleğine bağlıdır. + {*B*} + Takas hakkında daha fazla bilgi almak için {*CONTROLLER_VK_A*} düğmesine bas.{*B*} + Takas hakkında zaten bilgi sahibiysen {*CONTROLLER_VK_B*} düğmesine bas. Çeşitli takas işlemleri yapmak köylünün mevcut takas seçeneklerine rastgele eklemeler yapar veya teklif listesini yeniler. + + + + + Bir köylünün yapacağı teklifler, onun mesleğine bağlıdır. @@ -6074,7 +6930,4 @@ Dünyadaki tüm Sonveren Sandıkları birbirine bağlıdır. Bir Sonveren Sandı Tedavi - - Dünya Üretimi için Oluşum bulunuyor. - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsPlatformSpecific.xml index 3e73beeb..b31be443 100644 --- a/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/tr-TR/stringsPlatformSpecific.xml @@ -1,239 +1,243 @@  - - NOT USED + + "PSN" e giriş yapmak ister misin? + - - PlayStation®Vita sisteminde menüler arasında geçiş yapmak için dokunmatik ekranı kullanabilirsiniz! + + Kurucu ile aynı PlayStation®Vita sisteminde bulunmayan oyuncular için, bu seçeneği seçmek oyuncuyu ve aynı PlayStation®Vita sistemindeki diğer oyuncuları oyundan atar. Bu oyuncu oyun baştan başlayana kadar oyuna tekrar giremez. - - minecraftforum'da PlayStation®Vita Edition için bir bölüm bulunmaktadır. + + SELECT - - Bu oyun hakkındaki en son haberlere @4JStudios ve @Kappische ile Twitter'dan ulaşabilirsin! + + Bu seçenek, oyunu oynarken ya da bu seçenek açıkken kaydedilip yeniden yüklendiğinde, bu dünya için kupaları ve sıralama tablosunu devre dışı bırakır. - - Bir Sonveren Adam'ın gözlerinin içine bakma! + + PlayStation®Vita sistemi - - 4J Studios'un Herobrine'ı PlayStation®4 sistemi oyunundan çıkardığını düşünüyoruz ama emin değiliz. + + Yakındaki PlayStation®Vita sistemleri ile bağlantı kurmak için Ad Hoc Ağını seçin veya "PSN" yolu ile dünyanın dört bir yanındaki arkadaşlarınızla oynayın. - - Minecraft: PlayStation®Vita Edition birçok rekor kırdı! + + Ad Hoc Ağı - - {*T3*}NASIL OYNANIR : ÇOK OYUNCULU{*ETW*}{*B*}{*B*} -Minecraft, PlayStation®Vita sisteminde varsayılan olarak çok oyunculu bir oyundur.{*B*}{*B*} -Çevrimiçi bir oyun başlatır veya bir oyuna katılırsanız, oyun arkadaş listenizdeki kişilere görünür olur (oyunu kurarken Sadece Davetliler seçeneğini seçmediğiniz sürece) ve onlar bir oyuna katılırsa, onların arkadaş listelerindeki insanlar da bunu görebilecektir (Arkadaşların Arkadaşlarına İzin ver seçeneğini seçerseniz).{*B*} -Bir oyundayken, oyundaki tüm oyuncuların listesini görmek için SELECT düğmesine basabilir ve oyuncuları oyundan atabilirsiniz. + + Ağ Modunu Değiştir - - {*T3*}NASIL OYNANIR : EKRAN GÖRÜNTÜSÜ PAYLAŞMAK{*ETW*}{*B*}{*B*} -Duraklatma Menüsünü açarak oyundan bir ekran görüntüsü alabilir,{*CONTROLLER_VK_Y*} düğmesine basarak Facebook'ta paylaşabilirsiniz. Ekran Görüntünüzün küçük bir halini göreceksiniz ve Facebook gönderisinin metnini değiştirebileceksiniz.{*B*}{*B*} -Ekran görüntüsü almak için özel bir kamera modu vardır, bu şekilde karakterinizin önünü görürsünüz - karakterinizin ön görüntüsünü görene kadar {*CONTROLLER_ACTION_CAMERA*} düğmesine basılı tutun sonra da Paylaşmak için {*CONTROLLER_VK_Y*} düğmesine basın.{*B*}{*B*} - -Çevrimiçi Kimlikler ekran görüntüsünde çıkmaz. + + Ağ Modu Seç - - {*T3*}NASIL OYNANIR : YARATICILIK MODU{*ETW*}{*B*}{*B*} -Yaratıcılık modu arabirimi oyundaki her eşyanın kazma veya üretime gerek kalmadan oyuncunun envanterine eklenmesini sağlar. -Oyuncunun envanterindeki eşyalar, dünyaya yerleştirildiklerinde veya kullanıldığında yok olmaz ve bu da oyuncunun kaynak toplamaktan çok inşa etmeye odaklanmasını sağlar.{*B*} -Eğer Yaratıcılık Modunda bir dünyayı oluşturur, kaydeder veya yüklerseniz, o dünyanın kupaları ve sıralama tablosu güncellemeleri devre dışı kalır, Sağ Kalma Modunda tekrar yüklenseler bile.{*B*} -Yaratıcılık Modunda uçmak için, {*CONTROLLER_ACTION_JUMP*} düğmesine iki kere hızlıca basın. Uçuştan çıkmak için aynı şeyi tekrarlayın. Daha hızlı uçmak için, uçarken hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki kere ileri itin. -Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini basılı tutabilir ve aşağı inmek için {*CONTROLLER_ACTION_SNEAK*} düğmesini basılı tutabilir veya yukarı hareket etmek için {*CONTROLLER_ACTION_DPAD_UP*} düğmesini, aşağı hareket etmek için {*CONTROLLER_ACTION_DPAD_DOWN*} düğmesini, sola hareket etmek için {*CONTROLLER_ACTION_DPAD_LEFT*} düğmesini, sağa hareket etmek için {*CONTROLLER_ACTION_DPAD_RIGHT*} düğmesini kullanabilirsiniz. - + + Bölünmüş Ekran Çevrimiçi Kimlikleri - - {*CONTROLLER_ACTION_JUMP*} düğmesine iki kere hızlıca basarak uçabilirsiniz. Uçuştan çıkmak için aynı şeyi tekrarlayın. Daha hızlı uçmak için, uçarken hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki kere ileri itin. - -Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini basılı tutabilir ve aşağı inmek için {*CONTROLLER_ACTION_SNEAK*} düğmesini basılı tutabilir veya yukarı, aşağı, sola veya sağa hareket etmek için yön düğmeleri kullanabilirsiniz. + + Kupalar - - KULLANILMIYOR + + Bu oyunun seviyeyi otomatik kayıt etme özelliği vardır. Üstteki simgeyi gördüğünüzde oyun verilerinizi kaydeder. +Lütfen bu simge ekrandayken PlayStation®Vita sisteminizi kapatmayın. - - KULLANILMIYOR + + Etkinleştirildiğinde, kurucu; uçmak, yorgunluğu devre dışı bırakmak ve kendini görünmez yapmak gibi seçenekleri oyun içi menüsünden seçebilir. Kupaları ve sıralama tablosu güncellemesini devre dışı bırakır. - - "KULLANILMIYOR" + + Çevirimiçi Kimlikler: - - "KULLANILMIYOR" + + Bir doku paketinin deneme sürümünü kullanıyorsun. Doku paketinin tüm içeriğine erişimin olacak ancak ilerlemeni kaydedemeyececeksin. Deneme sürümünü kullanırken oyunu kaydetmeye çalışırsan, tam sürümü satın alma seçeneği sunulacak. + - - Arkadaş Davet Et + + Yama 1.04 (Oyun Güncellemesi 14) - - Yaratıcılık Modunda bir dünyayı yaratır, yükler veya kaydedersen, Sağ Kalma Modunda tekrar yüklesen bile kupalar ve sıralama tablosu güncellemesi devre dışı kalır. Devam etmek istediğinden emin misin? + + Oyun İçi Çevrimiçi Kimlikler - - Bu dünya daha önce Yaratıcılık Modunda kaydedilmiş ve kupalar ile sıralama tablosu güncellemesi devre dışı. Devam etmek istediğinden emin misin? + + Minecraft: PlayStation®Vita Edition oyununda neler yaptığıma bakın! - - Bu dünya daha önce Yaratıcılık Modunda kaydedilmiş ve kupalar ile sıralama tablosu güncellemesi devre dışı. + + İndirme başarısız oldu. Lütfen daha sonra tekrar deneyin. - - Bir dünyayı Kurucu Ayrıcalıkları etkinken yükler veya kaydedersen, bu özellikli kapattığında tekrar yüklesen bile kupalar ve sıralama tablosu güncellemesi devre dışı kalır. Devam etmek istediğinden emin misin? + + Kısıtlı NAT türü sebebiyle oyuna katılım başarısız oldu. Lütfen ağ ayarlarınızı kontrol edin. - - "PSN" bağlantısı koptu. Ana menüye dönülüyor. + + Yükleme başarısız oldu. Lütfen daha sonra tekrar deneyin. - - "PSN" bağlantısı koptu. + + İndirme Tamamlandı! - - Bu oyun Minecraft: PlayStation®Vita Edition deneme oyunudur. Eğer tam oyuna sahip olsaydınız, bir kupa kazanacaktınız! PlayStation®Vita Edition keyfini sürmek için tam oyunun kilidini açın ve "PSN" sayesinde dünyanın dört bir yanındaki arkadaşlarınızla oynayın. Tam sürüm oyunu açmak ister misiniz? + + Şu an bu kayıt aktarım alanı içinde mevcut kayıt bulunmamaktadır. +Minecraft: PlayStation®3 Edition kullanarak kayıt aktarım alanına bir dünya kaydını yükleyebilir ve ardından Minecraft: PlayStation®Vita Edition ile bunu indirebilirsiniz. + - - Bu oyun Minecraft: PlayStation®Vita Edition deneme oyunudur. Eğer tam oyuna sahip olsaydınız, bir tema kazanacaktınız! PlayStation®Vita Edition keyfini sürmek için tam oyunun kilidini açın ve "PSN" sayesinde dünyanın dört bir yanındaki arkadaşlarınızla oynayın. Tam sürüm oyunu açmak ister misiniz? + + Kayıt tamamlanmadı - - Bu oyun Minecraft: PlayStation®Vita Edition deneme oyunudur. Bu daveti kabul edebilmek için tam sürüm oyun gerekmektedir. Tam sürüm oyunu açmak ister misiniz? + + Minecraft: PlayStation®Vita Edition, kayıt verisi için yeterli alana sahip değil. Alan açmak için diğer Minecraft: PlayStation®Vita Edition kayıtlarını silin. - - Misafir oyuncular tam sürüm oyunu açamaz. Lütfen Sony Entertainment Network hesabınız ile giriş yapın. + + Yükleme İptal Edildi - - Çevrimiçi Kimlik + + Kayıt taşıma bölgesine bu kaydı yüklemeyi iptal ettiniz. - - Simya + + PS3™/PS4™ için kayıt yükle - - "PSN" hesabınızdan çıkış yaptığınızdan dolayı ana ekrana döndürüldünüz. + + Veri yükleniyor: %d%% - - Minecraft oynuyorsunuz: PlayStation®Vita Edition Deneme Oyununu izin verilen en fazla süre boyunca oynadınız! Eğlenceye devam etmek için tam sürüm oyunu açmak ister misiniz? + + "PSN" - - "Minecraft: PlayStation®Vita" Edition yüklenemedi ve devam edemiyor. + + PS3™ kaydı indir - - Oyuna katılınamıyor çünkü bir veya daha fazla oyuncu Sony Entertainment Network hesabı sohbet kısıtlamaları yüzünden Çevrimiçi oyun oynayamıyor. + + Veri indiriliyor: %d%% - - Çevrimiçi oyun kurulamıyor çünkü bir veya daha fazla oyuncu Sony Entertainment Network hesabı sohbet kısıtlamaları yüzünden Çevrimiçi oyun oynayamıyor. "Daha Fazla Seçenek" bölümündeki "Çevrimiçi Oyun" seçimini kaldırarak çevrimdışı bir oyun başlatın. + + Kaydediliyor - - Bu oyuna katılamazsınız çünkü sohbet kısıtlamalarından dolayı Sony Entertainment Network hesabınız Çevrimiçi oyunlara giremiyor. + + Yükleme Tamamlandı! - - Bu oyuna katılamazsınız çünkü sohbet kısıtlamalarından dolayı bir yerel oyuncunuzun Sony Entertainment Network hesabı Çevrimiçi oyunlara giremiyor. "Daha Fazla Seçenek" bölümündeki "Çevrimiçi Oyun" seçimini kaldırarak çevrimdışı bir oyun başlatın. - + + Bu kaydı yüklemek ve mevcut kayıt alanındaki kaydın üzerine yazmak istediğinizden emin misiniz? - - Bu oyunu kuramazsınız çünkü sohbet kısıtlamalarından dolayı bir yerel oyuncunuzun Sony Entertainment Network hesabı Çevrimiçi oyunlara giremiyor. "Daha Fazla Seçenek" bölümündeki "Çevrimiçi Oyun" seçimini kaldırarak çevrimdışı bir oyun başlatın. + + Veri Dönüştürülüyor - - Bu oyunun seviyeyi otomatik kayıt etme özelliği vardır. Üstteki simgeyi gördüğünüzde oyun verilerinizi kaydeder. -Lütfen bu simge ekrandayken PlayStation®Vita sisteminizi kapatmayın. + + KULLANILMIYOR - - Etkinleştirildiğinde, kurucu; uçmak, yorgunluğu devre dışı bırakmak ve kendini görünmez yapmak gibi seçenekleri oyun içi menüsünden seçebilir. Kupaları ve sıralama tablosu güncellemesini devre dışı bırakır. + + KULLANILMIYOR - - Bölünmüş Ekran Çevrimiçi Kimlikleri + + {*T3*}NASIL OYNANIR : YARATICILIK MODU{*ETW*}{*B*}{*B*} +Yaratıcılık modu arabirimi oyundaki her eşyanın kazma veya üretime gerek kalmadan oyuncunun envanterine eklenmesini sağlar. +Oyuncunun envanterindeki eşyalar, dünyaya yerleştirildiklerinde veya kullanıldığında yok olmaz ve bu da oyuncunun kaynak toplamaktan çok inşa etmeye odaklanmasını sağlar.{*B*} +Eğer Yaratıcılık Modunda bir dünyayı oluşturur, kaydeder veya yüklerseniz, o dünyanın kupaları ve sıralama tablosu güncellemeleri devre dışı kalır, Sağ Kalma Modunda tekrar yüklenseler bile.{*B*} +Yaratıcılık Modunda uçmak için, {*CONTROLLER_ACTION_JUMP*} düğmesine iki kere hızlıca basın. Uçuştan çıkmak için aynı şeyi tekrarlayın. Daha hızlı uçmak için, uçarken hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki kere ileri itin. +Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini basılı tutabilir ve aşağı inmek için {*CONTROLLER_ACTION_SNEAK*} düğmesini basılı tutabilir veya yukarı hareket etmek için {*CONTROLLER_ACTION_DPAD_UP*} düğmesini, aşağı hareket etmek için {*CONTROLLER_ACTION_DPAD_DOWN*} düğmesini, sola hareket etmek için {*CONTROLLER_ACTION_DPAD_LEFT*} düğmesini, sağa hareket etmek için {*CONTROLLER_ACTION_DPAD_RIGHT*} düğmesini kullanabilirsiniz. + - - Kupalar + + {*CONTROLLER_ACTION_JUMP*} düğmesine iki kere hızlıca basarak uçabilirsiniz. Uçuştan çıkmak için aynı şeyi tekrarlayın. Daha hızlı uçmak için, uçarken hızlıca {*CONTROLLER_ACTION_MOVE*} çubuğunu iki kere ileri itin. + +Uçuş modunda, yukarı çıkmak için {*CONTROLLER_ACTION_JUMP*} düğmesini basılı tutabilir ve aşağı inmek için {*CONTROLLER_ACTION_SNEAK*} düğmesini basılı tutabilir veya yukarı, aşağı, sola veya sağa hareket etmek için yön düğmeleri kullanabilirsiniz. - - Çevirimiçi Kimlikler: + + "KULLANILMIYOR" - - Oyun İçi Çevrimiçi Kimlikler + + Yaratıcılık Modunda bir dünyayı yaratır, yükler veya kaydedersen, Sağ Kalma Modunda tekrar yüklesen bile kupalar ve sıralama tablosu güncellemesi devre dışı kalır. Devam etmek istediğinden emin misin? - - Minecraft: PlayStation®Vita Edition oyununda neler yaptığıma bakın! + + Bu dünya daha önce Yaratıcılık Modunda kaydedilmiş ve kupalar ile sıralama tablosu güncellemesi devre dışı. Devam etmek istediğinden emin misin? - - Bir doku paketinin deneme sürümünü kullanıyorsun. Doku paketinin tüm içeriğine erişimin olacak ancak ilerlemeni kaydedemeyececeksin. Deneme sürümünü kullanırken oyunu kaydetmeye çalışırsan, tam sürümü satın alma seçeneği sunulacak. - + + "KULLANILMIYOR" - - Yama 1.04 (Oyun Güncellemesi 14) + + Arkadaş Davet Et - - SELECT + + minecraftforum'da PlayStation®Vita Edition için bir bölüm bulunmaktadır. - - Bu seçenek, oyunu oynarken ya da bu seçenek açıkken kaydedilip yeniden yüklendiğinde, bu dünya için kupaları ve sıralama tablosunu devre dışı bırakır. + + Bu oyun hakkındaki en son haberlere @4JStudios ve @Kappische ile Twitter'dan ulaşabilirsin! - - "PSN" e giriş yapmak ister misin? - + + NOT USED - - Kurucu ile aynı PlayStation®Vita sisteminde bulunmayan oyuncular için, bu seçeneği seçmek oyuncuyu ve aynı PlayStation®Vita sistemindeki diğer oyuncuları oyundan atar. Bu oyuncu oyun baştan başlayana kadar oyuna tekrar giremez. + + PlayStation®Vita sisteminde menüler arasında geçiş yapmak için dokunmatik ekranı kullanabilirsiniz! - - PlayStation®Vita sistemi + + Bir Sonveren Adam'ın gözlerinin içine bakma! - - Ağ Modunu Değiştir + + {*T3*}NASIL OYNANIR : ÇOK OYUNCULU{*ETW*}{*B*}{*B*} +Minecraft, PlayStation®Vita sisteminde varsayılan olarak çok oyunculu bir oyundur.{*B*}{*B*} +Çevrimiçi bir oyun başlatır veya bir oyuna katılırsanız, oyun arkadaş listenizdeki kişilere görünür olur (oyunu kurarken Sadece Davetliler seçeneğini seçmediğiniz sürece) ve onlar bir oyuna katılırsa, onların arkadaş listelerindeki insanlar da bunu görebilecektir (Arkadaşların Arkadaşlarına İzin ver seçeneğini seçerseniz).{*B*} +Bir oyundayken, oyundaki tüm oyuncuların listesini görmek için SELECT düğmesine basabilir ve oyuncuları oyundan atabilirsiniz. - - Ağ Modu Seç + + {*T3*}NASIL OYNANIR : EKRAN GÖRÜNTÜSÜ PAYLAŞMAK{*ETW*}{*B*}{*B*} +Duraklatma Menüsünü açarak oyundan bir ekran görüntüsü alabilir,{*CONTROLLER_VK_Y*} düğmesine basarak Facebook'ta paylaşabilirsiniz. Ekran Görüntünüzün küçük bir halini göreceksiniz ve Facebook gönderisinin metnini değiştirebileceksiniz.{*B*}{*B*} +Ekran görüntüsü almak için özel bir kamera modu vardır, bu şekilde karakterinizin önünü görürsünüz - karakterinizin ön görüntüsünü görene kadar {*CONTROLLER_ACTION_CAMERA*} düğmesine basılı tutun sonra da Paylaşmak için {*CONTROLLER_VK_Y*} düğmesine basın.{*B*}{*B*} + +Çevrimiçi Kimlikler ekran görüntüsünde çıkmaz. - - Yakındaki PlayStation®Vita sistemleri ile bağlantı kurmak için Ad Hoc Ağını seçin veya "PSN" yolu ile dünyanın dört bir yanındaki arkadaşlarınızla oynayın. + + 4J Studios'un Herobrine'ı PlayStation®4 sistemi oyunundan çıkardığını düşünüyoruz ama emin değiliz. - - Ad Hoc Ağı + + Minecraft: PlayStation®Vita Edition birçok rekor kırdı! - - "PSN" + + Minecraft oynuyorsunuz: PlayStation®Vita Edition Deneme Oyununu izin verilen en fazla süre boyunca oynadınız! Eğlenceye devam etmek için tam sürüm oyunu açmak ister misiniz? - - PlayStation®3 sistemi Kaydını İndir + + "Minecraft: PlayStation®Vita" Edition yüklenemedi ve devam edemiyor. - - PlayStation®3/PlayStation®4 sistemi için Kayıt Yükle + + Simya - - Yükleme İptal Edildi + + "PSN" hesabınızdan çıkış yaptığınızdan dolayı ana ekrana döndürüldünüz. - - Kayıt taşıma bölgesine bu kaydı yüklemeyi iptal ettiniz. + + Oyuna katılınamıyor çünkü bir veya daha fazla oyuncu Sony Entertainment Network hesabı sohbet kısıtlamaları yüzünden Çevrimiçi oyun oynayamıyor. - - Veri yükleniyor: %d%% + + Bu oyuna katılamazsınız çünkü sohbet kısıtlamalarından dolayı bir yerel oyuncunuzun Sony Entertainment Network hesabı Çevrimiçi oyunlara giremiyor. "Daha Fazla Seçenek" bölümündeki "Çevrimiçi Oyun" seçimini kaldırarak çevrimdışı bir oyun başlatın. + - - Veri indiriliyor: %d%% + + Bu oyunu kuramazsınız çünkü sohbet kısıtlamalarından dolayı bir yerel oyuncunuzun Sony Entertainment Network hesabı Çevrimiçi oyunlara giremiyor. "Daha Fazla Seçenek" bölümündeki "Çevrimiçi Oyun" seçimini kaldırarak çevrimdışı bir oyun başlatın. - - Bu kaydı yüklemek ve mevcut kayıt alanındaki kaydın üzerine yazmak istediğinizden emin misiniz? + + Çevrimiçi oyun kurulamıyor çünkü bir veya daha fazla oyuncu Sony Entertainment Network hesabı sohbet kısıtlamaları yüzünden Çevrimiçi oyun oynayamıyor. "Daha Fazla Seçenek" bölümündeki "Çevrimiçi Oyun" seçimini kaldırarak çevrimdışı bir oyun başlatın. - - Veri Dönüştürülüyor + + Bu oyuna katılamazsınız çünkü sohbet kısıtlamalarından dolayı Sony Entertainment Network hesabınız Çevrimiçi oyunlara giremiyor. - - Kaydediliyor + + "PSN" bağlantısı koptu. Ana menüye dönülüyor. - - Yükleme Tamamlandı! + + "PSN" bağlantısı koptu. - - Yükleme başarısız oldu. Lütfen daha sonra tekrar deneyin. + + Bu dünya daha önce Yaratıcılık Modunda kaydedilmiş ve kupalar ile sıralama tablosu güncellemesi devre dışı. - - İndirme Tamamlandı! + + Bir dünyayı Kurucu Ayrıcalıkları etkinken yükler veya kaydedersen, bu özellikli kapattığında tekrar yüklesen bile kupalar ve sıralama tablosu güncellemesi devre dışı kalır. Devam etmek istediğinden emin misin? - - İndirme başarısız oldu. Lütfen daha sonra tekrar deneyin. + + Bu oyun Minecraft: PlayStation®Vita Edition deneme oyunudur. Eğer tam oyuna sahip olsaydınız, bir kupa kazanacaktınız! PlayStation®Vita Edition keyfini sürmek için tam oyunun kilidini açın ve "PSN" sayesinde dünyanın dört bir yanındaki arkadaşlarınızla oynayın. Tam sürüm oyunu açmak ister misiniz? - - Kısıtlı NAT türü sebebiyle oyuna katılım başarısız oldu. Lütfen ağ ayarlarınızı kontrol edin. + + Misafir oyuncular tam sürüm oyunu açamaz. Lütfen Sony Entertainment Network hesabınız ile giriş yapın. - - Şu an bu kayıt aktarım alanı içinde mevcut kayıt bulunmamaktadır. Minecraft: PlayStation®3 Edition kullanarak kayıt aktarım alanına bir dünya kaydını yükleyebilir ve ardından Minecraft: PlayStation®Vita Edition ile bunu indirebilirsiniz. - + + Çevrimiçi Kimlik - - Kayıt tamamlanmadı + + Bu oyun Minecraft: PlayStation®Vita Edition deneme oyunudur. Eğer tam oyuna sahip olsaydınız, bir tema kazanacaktınız! PlayStation®Vita Edition keyfini sürmek için tam oyunun kilidini açın ve "PSN" sayesinde dünyanın dört bir yanındaki arkadaşlarınızla oynayın. Tam sürüm oyunu açmak ister misiniz? - - Minecraft: PlayStation®Vita Edition, kayıt verisi için yeterli alana sahip değil. Alan açmak için diğer Minecraft: PlayStation®Vita Edition kayıtlarını silin. + + Bu oyun Minecraft: PlayStation®Vita Edition deneme oyunudur. Bu daveti kabul edebilmek için tam sürüm oyun gerekmektedir. Tam sürüm oyunu açmak ister misiniz? + + + Kayıt aktarım alanındaki kayıt dosyası, Minecraft: PlayStation®Vita Edition'ın henüz desteklemediği bir versiyon numarasına sahip. \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/4J_stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/4J_stringsPlatformSpecific.xml index 5d648692..074621aa 100644 --- a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/4J_stringsPlatformSpecific.xml @@ -1,52 +1,51 @@  - - 主機儲存空間沒有足夠的可用空間來建立遊戲存檔。 - - - 您已經登出 "PSN",因此返回標題畫面 + + 無法將設定儲存至 Sony Entertainment Network 帳戶。 - - 您已經登出 "PSN",因此配對遊戲已結束" - + + Sony Entertainment Network 帳戶疑難 - - 目前未登入。 - + + 系統在存取您的 Sony Entertainment Network 帳戶時發生問題,因此您目前無法獲得獎盃。 - - 這個遊戲有某些功能需要連線至 "PSN" 才能使用,但您目前處於離線狀態。 + + 這是 Minecraft: "PlayStation 3" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation 3" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 +您想要解除完整版遊戲鎖定嗎? - - 無線隨意網路現處於離線狀態。 + + 連線至無線隨意網路 這個遊戲有某些功能需要無線隨意網路連線,但您目前處於離線狀態。 - - 這個功能需要登入 "PSN" 才能使用。 - - - 連線至 "PSN" - - - 連線至無線隨意網路 + + 無線隨意網路現處於離線狀態。 獎盃疑難 - - 系統在存取您的 Sony Entertainment Network 帳戶時發生問題,因此您目前無法獲得獎盃。 + + 您已經登出 "PSN",因此配對遊戲已結束" + - - Sony Entertainment Network 帳戶疑難 + + 您已經登出 "PSN",因此返回標題畫面 - - 無法將設定儲存至 Sony Entertainment Network 帳戶。 + + 主機儲存空間沒有足夠的可用空間來建立遊戲存檔。 - - 這是 Minecraft: PlayStation(R)3 Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! -解除完整版遊戲鎖定即可享受 Minecraft: PlayStation(R)3 Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 -您想要解除完整版遊戲鎖定嗎? + + 目前未登入。 + + + 連線至 "PSN" + + + 這個功能需要登入 "PSN" 才能使用。 + + + 這個遊戲有某些功能需要連線至 "PSN" 才能使用,但您目前處於離線狀態。 \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/AdditionalStrings.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/AdditionalStrings.xml index 8eff90c9..e8cf3447 100644 --- a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/AdditionalStrings.xml +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/AdditionalStrings.xml @@ -7,7 +7,7 @@ 隱藏 - Minecraft: PlayStation(R)3 Edition + Minecraft: "PlayStation 3" Edition 選項 @@ -54,6 +54,12 @@ 您的選項檔已損毀,必須刪除。 + + 刪除選項檔。 + + + 重試載入選項檔。 + 您的緩存檔已損毀,必須刪除。 @@ -82,6 +88,9 @@ 您的 Sony Entertainment Network 帳戶因受到一個本地用戶的副帳戶的使用限制而無法使用線上功能。 + + 因為遊戲更新的推出,線上功能已停用。 + 這款遊戲目前沒有可下載內容。 @@ -89,9 +98,6 @@ 邀請 - 快來玩 Minecraft: PlayStation(R)Vita Edition 遊戲! - - - 因為遊戲更新的推出,線上功能已停用。 + 快來玩 Minecraft: "PlayStation Vita" Edition 遊戲! \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/EULA.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/EULA.xml index e03dc022..88de8d96 100644 --- a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/EULA.xml +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/EULA.xml @@ -1,8 +1,8 @@  - Minecraft: PlayStation(R)Vita Edition - 使用條款 - 這些條款列出使用 Minecraft: PlayStation(R)Vita Edition (以下稱「Minecraft」) 時需遵守的規則。為了保護 Minecraft 及我們社群的成員,我們需利用這些條款列出下載及使用 Minecraft 時需遵守的規則。我們也跟您一樣不喜歡繁瑣的規則,所以會盡量簡短描述,但如果您要購買、下載、使用或遊玩 Minecraft,就必須同意並遵守這些條款 (以下稱「條款」)。 + Minecraft: "PlayStation Vita" Edition - 使用條款 + 這些條款列出使用 Minecraft: "PlayStation Vita" Edition (以下稱「Minecraft」) 時需遵守的規則。為了保護 Minecraft 及我們社群的成員,我們需利用這些條款列出下載及使用 Minecraft 時需遵守的規則。我們也跟您一樣不喜歡繁瑣的規則,所以會盡量簡短描述,但如果您要購買、下載、使用或遊玩 Minecraft,就必須同意並遵守這些條款 (以下稱「條款」)。 在我們正式進入條款部分前,需要先澄清一個概念,Minecraft 是一個允許玩家建造及破壞物品的遊戲,如果您與其他人 (多人遊戲) 一起進行遊戲,可以與這些玩家一起建造物品,或破壞其他人所建造的物品,而他們也一樣可以這麼做。因此,若其他玩家的行為不符合您的期望,請不要與他們一起進行遊戲。此外,有時候玩家也可能做出不當的行為,我們當然不希望發生這種情況,但我們除了要求所有玩家自律,其他能做的並不多,並無法確實地阻止這些行為出現。若有人行為失當,我們仰賴您及您社群中的同伴通知我們;而若發生這種情況且/或您認為某人違反規則或這些條款,或是有不當使用 Minecraft 的情形,也請通報我們。我們的標記 / 回報系統可讓您完成上述動作,請充分利用。我們將會針對任何不當行為採取必要行動。 若要標記或回報任何問題,請寄送電子郵件至 support@mojang.com,內容請提供盡可能詳細的資訊 (例如使用者的詳細資料以及發生的事件)。 現在正式進入條款部分: @@ -15,10 +15,10 @@ ...故我們的規則完全透明,我們所製作的內容包含但不限於 Minecraft 的用戶端或伺服器軟體,也包含遊戲的修正版本、其中的部分內容或我們所製作的任何其他內容。 除此之外,我們對於您其他方面的行為並無嚴格限制,事實上,只要不違反我們所列出的禁止事項,我們相當鼓勵您做些很酷的事 (請見以下內容)。 使用 Minecraft - • 如果您購買了 Minecraft,就可以在您的 PlayStation(R)Vita 主機上自行使用這款遊戲。 + • 如果您購買了 Minecraft,就可以在您的 "PlayStation Vita" 主機上自行使用這款遊戲。 • 我們也在下方列出您從事其他事項時的有限權利,但我們必須界定出合理範圍,以免有人做出過分行為。如果您希望製作任何與我們所製作內容相關的東西,我們備感榮幸,但請確認您所製作的內容不能冠上官方名義,且必須遵守這些條款,最重要的是不得將我們所製作的任何內容用於商業用途。 • 如果您違反這些條款,我們可能會撤銷您使用及玩 Minecraft 遊戲的權限。 - • 當您購買了 Minecraft,我們即授予您的 PlayStation(R)Vita 主機上安裝 Minecraft 的權限,並可如這些條款所述在該 PlayStation(R)Vita 主機上進行遊戲。這個權限僅適用於您個人,所以您不可以散佈 Minecraft (或其任何部分) 給任何人 (除非經我們明確允許)。 + • 當您購買了 Minecraft,我們即授予您的 "PlayStation Vita" 主機上安裝 Minecraft 的權限,並可如這些條款所述在該 "PlayStation Vita" 主機上進行遊戲。這個權限僅適用於您個人,所以您不可以散佈 Minecraft (或其任何部分) 給任何人 (除非經我們明確允許)。 • 您可以在合理範圍內盡情使用 Minecraft 的螢幕擷取畫面和視訊。「合理範圍內」指的是不得將其用於商業用途,或是做出任何不公平或對我們的權利造成不利影響的行為。此外,請勿任意擷取美術圖檔資源並加以散發,這樣做並不有趣。 • 簡單規則的本質就是不得將我們所製作的任何內容用於商業用途,除非我們在「品牌與資產使用準則 (Brand and Asset Usage Guidelines)」中或根據這些條款明確表示同意 。此外,在法律明確允許 (例如在「公平使用」或「公平交易」原則之下) 的情況下也適用,但僅限於該法律提及的範圍之內。 Minecraft 的所有權及其他事項 @@ -35,7 +35,7 @@ • 在 Minecraft 上發表的所有內容皆必須是您自己的創作。不得使用 Minecraft 發表會侵犯他人權利之任何內容。如果您在 Minecraft 上發佈的內容侵犯了他人權利,使我們遭受他人挑戰、威脅或控告,我們可能會要求您負起責任,這表示您可能需要賠償我們因該事件所受到的損失。因此,您只能發表自己創作的內容,而不能對他人創作的內容進行同樣動作,這點非常重要。 • 請謹慎挑選玩家夥伴。不論是您還是我們,都很難確定他人所說的話是真是假,甚至沒辦法判斷他們自稱的身分是否屬實。您也不應透過 Minecraft 透漏自己的相關資訊。 如果您要使用 Minecraft 發表內容 (以下稱「您的內容」),必須: - - 遵守 Sony Computer Entertainment 的所有規則,包含 ToSUA,即為 "PSN" 使用條款及用戶合約,以及您必須同意才能使用您的 PlayStation(R)Vita 主機和 "PSN" 的所有其他準則; + - 遵守 Sony Computer Entertainment 的所有規則,包含 ToSUA,即為 "PSN" 使用條款及用戶合約,以及您必須同意才能使用您的 "PlayStation Vita" 主機和 "PSN" 的所有其他準則; - 不可冒犯他人; - 不可違規或違法; - 內容正當且不誤導、欺騙或利用他人,也不可冒充他人身分; @@ -66,7 +66,7 @@ • 您對於這些條款的任何違反情形; • 他人對任何條款的任何違反情形。 終止 - • 如果您違反這些條款,我們可以視情況終止您的 Minecraft 使用權利。您也可以隨時自行終止此權利,只需要將 Minecraft 從您的 PlayStation(R)Vita 主機上解除安裝即可。無論發生任何情況,「MINECRAFT 的所有權」、「我們的責任」和「一般事項」在終止後仍持續適用。 + • 如果您違反這些條款,我們可以視情況終止您的 Minecraft 使用權利。您也可以隨時自行終止此權利,只需要將 Minecraft 從您的 "PlayStation Vita" 主機上解除安裝即可。無論發生任何情況,「MINECRAFT 的所有權」、「我們的責任」和「一般事項」在終止後仍持續適用。 一般事項 • 這些條款會依您可能擁有的法律權利而變動。這些條款不會限制您根據法律可能未排除的任何權利,也不會排除或限制我們因我們的疏忽所導致的死亡或個人傷害情形、以及欺騙性陳述所需擔負的責任。 • 我們可能會偶爾變更這些條款,但任何變更僅會在法律適用範圍內生效。例如,如果您僅於單人遊戲模式中使用 Minecraft,且未使用我們開放取用的更新,則適用舊版 EULA;但如果您確實使用更新或藉由我們持續提供的線上服務使用 Minecraft 的部分內容,則適用新 EULA。在這種情況下,我們可能無法 / 無需通知您變更來使其生效,所以您應該偶爾回來這裡確認,瞭解這些條款是否有任何變更。雖然我們不會以不公平的方法處理這種情況,但有時法律會有所變更,或有人會做出影響其他 Minecraft 使用者的行為,所以我們必須採取行動來防止情況惡化。 @@ -85,7 +85,7 @@ - 在商店以及遊戲內商店購買的任何內容都將從 Sony Network Entertainment Europe Limited (簡稱「SNEE」) 購得,且需遵守 Sony Entertainment Network 使用條款及用戶合約 (可於 PlayStation(R)Store 取得)。請確認每個購買項目的使用權利,因為不同項目的權利可能有所差異。除非有特別說明,否則在任何遊戲內商店中可取用之內容的年齡分級與遊戲相同。 + 在商店以及遊戲內商店購買的任何內容都將從 Sony Network Entertainment Europe Limited (簡稱「SNEE」) 購得,且需遵守 Sony Entertainment Network 使用條款及用戶合約 (可於 "PlayStation Store" 取得)。請確認每個購買項目的使用權利,因為不同項目的權利可能有所差異。除非有特別說明,否則在任何遊戲內商店中可取用之內容的年齡分級與遊戲相同。 diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsGeneric.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsGeneric.xml index a8622d27..bf215fe1 100644 --- a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsGeneric.xml +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsGeneric.xml @@ -1,5042 +1,5963 @@  - - 新的下載內容現已推出!請選取主畫面的 [Minecraft 商店] 按鈕來取得下載內容。 + + 正在切換至離線遊戲 - - 您可以用 Minecraft 商店裡的角色外觀套件來變更角色的外觀。請在主畫面選取 [Minecraft 商店],去看看有哪些好東西吧! + + 伺服器正在儲存遊戲資料,請稍候 - - 調整色差補正設定就能讓遊戲畫面變亮或變暗。 + + 正在進入終界 - - 如果您將遊戲困難度設定為 [和平],您的生命值就會自動回復,而且夜晚不會出現怪物! + + 正在儲存玩家資料 - - 用骨頭餵狼來馴服牠,就能讓牠坐下或是跟著您走。 + + 正在與主持人連線 - - 當您開啟物品欄選單時,只要把游標移動到選單外面,再按下 {*CONTROLLER_VK_A*} 即可丟棄物品。 + + 正在下載地形 - - 夜晚時,在床舖上睡覺就能讓遊戲時間快轉到日出;但在多人遊戲中,所有玩家必須同時睡在床舖上,才會有這種效果。 + + 正在離開終界 - - 您可以把豬殺死來獲得生豬肉,然後在烹煮後吃掉熟豬肉來回復生命值。 + + 您家中的床舖已消失,或是被擋住了 - - 您可以把乳牛殺死來獲得皮革,然後用來製作護甲。 + + 附近有怪物,您不能休息 - - 如果您有空的桶子,可以用來裝從乳牛身上擠出來的牛奶,或是拿來裝水或熔岩! + + 您正在床舖上睡覺。如要讓遊戲時間快轉至日出,所有玩家都必須同時睡在床舖上。 - - 您可以用鋤頭墾地,來準備栽種作物用的地面。 + + 這張床已經有人佔據了 - - 蜘蛛不會在白天攻擊您,除非您先展開攻擊。 + + 您只能在夜晚睡覺 - - 用鏟子來挖泥土或沙子,會比用手挖快上許多! + + %s 正在床舖上睡覺。如要讓遊戲時間快轉至日出,所有玩家都必須同時睡在床舖上。 - - 吃下熟豬肉所回復的生命值,會比吃下生豬肉所回復的多。 + + 正在載入關卡 - - 別忘了製造一些火把,以便在夜晚時照亮四周的區域。怪物會避開火把附近的區域。 + + 正在完成... - - 您可以利用礦車與軌道來快速抵達目的地! + + 正在建造地形 - - 只要栽種樹苗,樹苗就會長成樹木。 + + 正在模擬世界 - - 殭屍 Pigmen 不會攻擊您,除非您先展開攻擊。 + + 排名 - - 只要在床舖上睡覺,就能變更遊戲再生點,並讓遊戲時間快轉到日出。 + + 正在準備儲存關卡資料 - - 把 Ghast 發射的火球打回去! + + 正在準備區塊... - - 建造傳送門就能讓您前往另一個次元的空間:地獄。 + + 正在啟動伺服器 - - 按下 {*CONTROLLER_VK_B*} 即可丟棄您手上握著的物品! + + 正在離開地獄 - - 別忘了要使用正確的工具來做事! + + 再生中 - - 如果您找不到煤塊來製造火把,可以用熔爐裡的火燒木頭來製造木炭。 + + 正在產生關卡 - - 我們不建議您直直往下挖,或是直直往上挖。 + + 正在產生再生區域 - - 從骷髏的骨頭精製出來的骨粉可以當做肥料,讓植物立刻長大喔! + + 正在載入再生區域 - - Creeper 一旦靠近您就會自爆! + + 正在進入地獄 - - 當水碰到熔岩源方塊時,就會產生黑曜石。 + + 工具與武器 - - 當您移除熔岩源方塊後,熔岩需要好幾分鐘的時間才能完全消失。 + + 色差補正 - - Ghast 的火球無法破壞鵝卵石,因此鵝卵石很適合用來保護傳送門。 + + 遊戲靈敏度 - - 可作為光源使用的方塊能夠融化白雪和冰塊,這些方塊包括火把、閃石及南瓜燈籠。 + + 介面靈敏度 - - 在野外以羊毛作為建築材料來蓋東西時,千萬要小心,因為雷雨的閃電會讓羊毛著火。 + + 困難度 - - 使用熔爐時,1 桶熔岩可讓您熔煉 100 個方塊。 + + 音樂 - - 音符方塊所演奏的樂器種類,是根據底下方塊的材質而定。 + + 音效 - - 白天的時候,殭屍和骷髏必須待在水裡才能活下去。 + + 和平 - - 如果您攻擊某隻狼,四周所有的狼就會對您產生敵意並開始攻擊您。而殭屍 Pigmen 也有這種特性。 + + 在這個模式中,玩家的生命值會隨時間自動回復,且遊戲環境中不會出現敵人。 - - 狼無法進入地獄。 + + 在這個模式中,遊戲世界會出現敵人,但敵人只會對玩家造成少量的傷害。 - - 狼不會攻擊 Creeper。 + + 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成普通的傷害。 - - 雞每 5 到 10 分鐘就會下一顆蛋。 + + 容易 - - 黑曜石只能用鑽石鎬來開採。 + + 普通 - - 最容易取得火藥的來源就是 Creeper。 + + 困難 - - 把 2 個箱子並排放置,就能製造出 1 個大箱子。 + + 已經登出 - - 馴服後的狼會用尾巴的高低位置來表示目前的生命值狀態。只要餵狼吃肉就能治療牠們。 + + 護甲 - - 在熔爐烹煮仙人掌,即可獲得綠色染料。 + + 機械 - - 閱讀 [遊戲方式] 選單中的 [最新資訊] 部分,即可獲得 Minecraft 的最新更新資訊。 + + 運送 - - 現在遊戲有可堆疊的柵欄囉! + + 武器 - - 如果您的手中有小麥,有些動物會跟著您。 + + 食物 - - 只要動物無法朝任一方向移動超過 20 個方塊的距離,牠就不會消失。 + + 建築 - - 遊戲中的音樂是由 C418 所製作! + + 裝飾 - - Notch 在 Twitter 上已經有超過 100 萬名的跟隨者了! + + 釀製 - - 並非所有瑞典人都有金髮,有些瑞典人 (像是 Mojang 裡的 Jens) 就擁有紅髮! + + 工具、武器與護甲 - - 我們一定會為這個遊戲推出更新內容! + + 材料 - - Notch 是誰? + + 建築材料 - - Mojang 獲得的獎項比員工的數目還多! + + 紅石與運送方式 - - 有些名人很喜歡玩 Minecraft 喔! + + 雜項 - - deadmau5 喜歡玩 Minecraft! + + 項目: - - 別一直注意遊戲中的程式錯誤。 + + 不存檔即離開 - - Creeper 就是從程式碼的錯誤中誕生的。 + + 確定要離開並返回主畫面嗎?您將因此失去尚未儲存的遊戲進度。 - - 這是雞?還是鴨子? + + 確定要離開並返回主畫面嗎?您將因此失去遊戲進度! - - 您有去 Minecon 嗎? + + 這個存檔已損毀。想要刪除這個存檔嗎? - - 在 Mojang 裡,沒人看過 Junkboy 的臉。 + + 確定要離開並返回主畫面,同時中斷遊戲中所有玩家的連線嗎?您將因此失去尚未儲存的遊戲進度。 - - 您知道 Minecraft Wiki 嗎? + + 離開並存檔 - - Mojang 的新辦公室很酷喔! + + 建立新世界 - - 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*} -精製台的運作方法跟基本的精製介面是一樣的,但您會擁有較大的精製空間,能精製出的物品種類也較多。 + + Minecraft 商店 - - {*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*} -如果您在進行某個關卡時看到有冒犯意味的內容,可以選擇把這個關卡加入您的禁用關卡清單。 -若要這麼做,請先叫出暫停選單,然後按下 {*CONTROLLER_VK_RB*} 來選取 [禁用關卡] 工具提示。 -之後當您要加入這個關卡時,系統會提示您該關卡已在您的禁用關卡清單中,然後讓您選擇是否要將該關卡從清單中移除並進入關卡,或是要退出。 + + 離開遊戲 - - {*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*}炸藥會爆炸{*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_BUTTON*} 按鈕可以叫出遊戲選單來存取某些選項。{*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*} - {*KICK_PLAYER_DESCRIPTION*}{*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*} - 這讓玩家可以將其他玩家或自己傳送到世界中的其他玩家身邊。 - + + 儲存遊戲 - - 下一頁 + + 不儲存即離開 - - 上一頁 + + 按下 START 按鈕來加入遊戲 - - 基本介紹 + + 太棒了!您獲得 1 個玩家圖示,主角就是 Minecraft 裡的 Steve! - - 平行顯示器 + + 太棒了!您獲得 1 個玩家圖示,主角就是 Creeper! - - 物品欄 + + 解除完整版遊戲鎖定 - - 箱子 + + 由於您嘗試加入的玩家執行的遊戲版本較新,所以您無法加入此遊戲。 - - 精製 + + 新世界 - - 熔爐 + + 已解除獎項鎖定! - - 分發器 + + 您正在玩試玩版遊戲,但您必須擁有完整版遊戲才能儲存遊戲進度。 +想要立刻解除完整版遊戲鎖定嗎? - - 豢養動物 + + 好友 - - 繁殖動物 + + 我的分數 - - 釀製 + + 整體 - - 附加能力 + + 請稍候 - - 地獄傳送門 + + 沒有搜尋結果 - - 多人遊戲 + + 篩選條件: - - 分享螢幕擷取畫面 + + 由於您嘗試加入的玩家執行的遊戲版本較舊,所以您無法加入此遊戲。 - - 禁用關卡 + + 連線中斷 - - 創造模式 + + 與伺服器的連線中斷。即將離開遊戲並返回主畫面。 - - 主持人與玩家選項 + + 伺服器中斷連線 - - 交易 + + 正在離開遊戲 - - 鐵砧 + + 發生錯誤,即將離開遊戲並返回主畫面。 - - 終界 + + 連線失敗 - - {*T3*}遊戲方式:終界{*ETW*}{*B*}{*B*} -終界是遊戲中的另一個世界,只要進入已啟動的終界入口就能到達。終界入口位於地上世界地底深處的地下要塞。{*B*} -把終界之眼放入沒有終界之眼的終界入口框架中就能啟動終界入口。{*B*} -跳進已啟動的入口即可前往終界。{*B*}{*B*} -您將在終界中對抗許多的 Enderman 以及凶狠強大的終界龍,所以請在進入終界之前做好戰鬥的準備!{*B*}{*B*} -您會發現 8 根黑曜石柱,其頂端都有終界水晶,終界龍會用水晶來治療自己, -因此戰鬥的第一步就是要摧毀這些水晶。{*B*} -只要用箭就能摧毀前面幾顆水晶,不過後面幾顆水晶受到鐵柵欄籠子的保護,需要建造方塊抵達石柱頂端才有辦法摧毀。{*B*}{*B*} -終界龍會在您建造的時候飛過來進行攻擊並朝著您吐終界酸液球!{*B*} -只要一接近被石柱包圍的龍蛋台,終界龍就會飛下來攻擊您,這會是對終界龍使出強力攻擊的好機會!{*B*} -在閃避酸液氣攻擊的同時攻擊終界龍的眼睛會有最佳的攻擊效果。如果可以的話,帶好友一起進入終界幫助您作戰!{*B*}{*B*} -您進入終界之後,您的好友會在他們的地圖上看到位於地下要塞中的終界入口, -這樣他們就能輕鬆地加入行列。 - - - 奔跑 + + 您被踢出遊戲 - - 最新資訊 + + 主持人已經離開遊戲。 - - {*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*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*} -- 修復 Enderman 嘴巴未張開的問題。{*B*} -- 新增玩家傳送功能 (在遊戲中使用 {*BACK_BUTTON*} 選單)。{*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*} - + + 您無法加入這個遊戲,因為您之前已經被主持人踢出遊戲。 - - 能造成比用手劈砍更大的傷害。 + + 您因為飛翔而被踢出遊戲 - - 用來挖泥土、青草、沙子、礫石及白雪時的速度,會比用手挖還要快。您需要用鏟子才能挖雪球。 + + 嘗試連線的時間太久 - - 您需要用十字鎬才能開採石頭相關方塊和礦石。 + + 伺服器人數已滿 - - 用來劈砍木頭相關方塊的速度,會比用手劈砍還要快。 + + 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成嚴重的傷害。千萬要留意 Creeper,因為當您嘗試遠離時,Creeper 可不會取消爆炸攻擊! - - 用來在泥土和青草方塊上整地,以準備進行耕種。 + + 主題 - - 木門只要透過使用或敲擊,或是使用紅石就能啟動。 + + 角色外觀套件 - - 鐵門只能透過紅石、按鈕或開關來開啟。 + + 允許好友的好友加入 - - NOT USED + + 踢除玩家 - - NOT USED + + 確定要將該玩家踢出這個遊戲嗎?除非您讓這個世界重新開始,該玩家才能重新加入遊戲。 - - NOT USED + + 玩家圖示套件 - - NOT USED + + 您無法加入這個遊戲,因為只有主持人的好友才能加入。 - - 穿戴時會讓使用者擁有 1 點護甲值。 + + 損毀的下載內容 - - 穿戴時會讓使用者擁有 3 點護甲值。 + + 這個下載內容已經損毀,因此無法使用。您必須刪除該下載內容,然後從 [Minecraft 商店] 選單重新安裝。 - - 穿戴時會讓使用者擁有 2 點護甲值。 + + 您有部分的下載內容已經損毀,因此無法使用。您必須刪除這些下載內容,然後從 [Minecraft 商店] 選單重新安裝。 - - 穿戴時會讓使用者擁有 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 的方塊,而且放置後會平躺在地面上。 + + 創造 - - 可顯示您或其他玩家輸入的文字。 + + 重新為您的世界命名 - - 可用來產生比火把更亮的光源。能夠融化白雪和冰塊,還能在水面下使用。 + + 請為您的世界輸入新的名稱 - - 可用來產生爆炸。炸藥放置後,只要用打火鐮點燃,或利用電流即可啟動。 + + 遊戲模式:生存 - - 可用來裝燉蘑菇。當您吃掉燉蘑菇時,碗會保留下來。 + + 在生存模式中建立 - - 可用來裝水、熔岩及牛奶,讓您能夠把這些物品運送到其他地方。 + + 重新為存檔命名 - - 可用來裝水,讓您能夠把水運送到其他地方。 + + 自動存檔倒數 %d... - - 可用來裝熔岩,讓您能夠把熔岩運送到其他地方。 + + 開啟 - - 可用來裝牛奶,讓您能夠把牛奶運送到其他地方。 + + 在創造模式中建立 - - 可用來生火、點燃炸藥,以及啟動蓋好的傳送門。 + + 產生雲朵 - - 可用來釣魚。 + + 您要如何處理這個遊戲存檔? - - 會顯示太陽與月亮目前的位置。 + + 平行顯示器大小 (分割畫面) - - 會持續指向您的起點。 + + 材料 - - 用手握住時,會顯示某個地區中已探索區域的影像。可讓您用來尋找能前往某個地點的路。 + + 燃料 - - 可射出箭來進行遠距攻擊。 + + 分發器 - - 可與弓組成武器。 + + 箱子 - - 可回復 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*}。在熔爐烹煮生雞肉即可獲得。 + + %s 已經加入遊戲。 - - 可回復 1.5 個 {*ICON_SHANK_01*},或可用熔爐烹煮。 + + %s 已經離開遊戲。 - - 可回復 4 個 {*ICON_SHANK_01*}。在熔爐烹煮生牛肉即可獲得。 + + %s 已被踢出遊戲。 - - 可回復 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 個音符的聲音,受到敲擊後就會變更音符的音調。把音符方塊放在不同的方塊上面,就會改變樂器的種類。 + + 輸入描述 - - 可用來引導礦車的行進路線。 + + 現在正在播放: - - 有動力時,會讓行經的礦車加速。沒有動力時,會讓碰到的礦車停在上面。 + + 確定要把這個關卡加入禁用關卡清單嗎? +如果您選取 [確定],將會離開這個遊戲。 - - 功能跟壓板一樣 (會在啟動時送出紅石信號),但只能靠礦車來啟動。 + + 從禁用清單中移除 - - 可用來沿著軌道把您、動物或怪物載到其他地方。 + + 自動存檔時間間隔 - - 可用來沿著軌道運送物品。 + + 已禁用的關卡 - - 當裡面有煤塊時,可自動在軌道上移動,或是推動其他礦車。 + + 您要加入的遊戲已經列在您的禁用關卡清單中。 +如果您要加入這個遊戲,系統會把這個關卡從禁用關卡清單中移除。 - - 可讓您在水面上移動,而且速度會比游泳快。 + + 要禁用這個關卡嗎? - - 可從綿羊身上收集,還能用染料染色。 + + 自動存檔時間間隔:關閉 - - 可當做建築材料,還能用染料染色。但我們不建議您使用這個製作方法,因為您可以輕易地從綿羊身上取得羊毛。 + + 介面透明度 - - 可當做染料來製造黑色羊毛。 + + 正在準備自動儲存關卡資料 - - 可當做染料來製造綠色羊毛。 + + 平行顯示器大小 - - 可當做染料來製造棕色羊毛、製作餅乾的材料,或者可用來種植可可豆。 + + 分鐘 - - 可當做染料來製造銀色羊毛。 + + 不能放置在這裡! - - 可當做染料來製造黃色羊毛。 + + 您無法在關卡再生點附近放置熔岩,以避免讓再生的玩家立刻死亡。 - - 可當做染料來製造紅色羊毛。 + + 最愛的角色外觀 - - 可用來讓作物、樹木、茂密青草、巨型蘑菇及花朵立刻長大,還能與某些染料組合成新的染料。 + + %s 的遊戲 - - 可當做染料來製造粉紅色羊毛。 + + 不明主持人的遊戲 - - 可當做染料來製造橘色羊毛。 + + 訪客已經登出 - - 可當做染料來製造亮綠色羊毛。 + + 重設設定 - - 可當做染料來製造灰色羊毛。 + + 確定要將所有設定重設為預設值嗎? - - 可當做染料來製造淺灰色羊毛。 -(注意:您也可以把灰色染料與骨粉組合成淺灰色染料,讓您可以用 1 個墨囊製造出 4 個淺灰色染料,而不是 3 個。) + + 正在載入錯誤 - - 可當做染料來製造淺藍色羊毛。 + + 某位訪客玩家已經登出,導致系統移除遊戲中的所有訪客玩家。 - - 可當做染料來製造水藍色羊毛。 + + 無法建立遊戲 - - 可當做染料來製造紫色羊毛。 + + 已自動選取 - - 可當做染料來製造紫紅色羊毛。 + + 無套件:預設角色外觀 - - 可當做染料來製造藍色羊毛。 + + 登入 - - 可用來播放唱片。 + + 您尚未登入。您必須登入,才能進行這個遊戲。想要立刻登入嗎? - - 可用來製造非常強韌且堅硬的工具、武器或護甲。 + + 不允許進行多人遊戲 - - 可用來產生比火把更亮的光源。能夠融化白雪和冰塊,還能在水面下使用。 + + - - 可用來製造書本和地圖。 + + 這個地區已經準備好一塊農田。耕種能夠讓您建立一個可以重複提供食物與其他物品的再生來源。 - - 可用來製造書架,或經過附加能力來製成「已附加能力的書本」。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解耕種的相關知識。{*B*} + 如果您已經了解耕種的相關知識,請按下 {*CONTROLLER_VK_B*} 。 - - 放置在附加能力台附近時可以創造更具威力的附加能力。 + + 小麥、南瓜和西瓜皆必須從種子開始栽種。小麥種子可以藉由破壞茂密青草或收成小麥來獲得。相對地,收成南瓜和西瓜,同樣也能收集到南瓜和西瓜種子。 - - 可當做裝飾品。 + + 按下 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟創造模式物品欄介面。 - - 可用鐵鎬或材質更堅硬的十字鎬開採,然後在熔爐中熔煉成黃金錠塊。 + + 您必須設法移到這個洞的另一邊,才能繼續進行遊戲。 - - 可用石鎬或材質更堅硬的十字鎬開採,然後在熔爐中熔煉成鐵錠塊。 + + 您已完成創造模式的教學課程。 - - 可用十字鎬開採來收集煤塊。 + + 在栽種種子前,需要先使用鋤頭將泥土方塊變成農田。在附近放置水源和光源,不但能使農田保持水分,還能讓作物生長得較快。 - - 可用石鎬或材質更堅硬的十字鎬開採來收集青金石。 + + 仙人掌必須栽種在沙子上,最高可以長到三個方塊的高度。和甘蔗一樣,破壞最底層的方塊,就能夠連帶一起收集上方所有的方塊。{*ICON*}81{*/ICON*} - - 可用鐵鎬或材質更堅硬的十字鎬開採來收集鑽石。 + + 蘑菇必須栽種在光線昏暗的區域,並且會蔓延至附近光線昏暗的其他方塊上。{*ICON*}39{*/ICON*} - - 可用鐵鎬或材質更堅硬的十字鎬開採來收集紅石塵。 + + 骨粉可以用來讓作物立刻達到完全成熟的階段,或是讓蘑菇長成巨型蘑菇。{*ICON*}351:15{*/ICON*} - - 可用十字鎬開採來收集鵝卵石。 + + 小麥的生長過程包含數個階段,當顏色轉深後,就表示可以收成了。{*ICON*}59:7{*/ICON*} - - 可用鏟子來收集,能當做建築材料。 + + 南瓜和西瓜還需要在播種的方塊旁邊空出一格的空間,讓完全長成的莖葉能夠長出果實。 - - 可讓您栽種,最後會長成樹木。 + + 甘蔗必須栽種在青草、泥土,或沙子方塊上,並且需要和水體方塊相鄰。劈砍甘蔗方塊將會連帶使上方所有方塊一起掉落。{*ICON*}83{*/ICON*} - - 這不會破裂。 + + 在創造模式中,您擁有無限多的物品和方塊,且不需使用任何特殊工具,只要按一下即可摧毀方塊。您是無敵的,並且可以飛翔。 - - 會讓接觸到的任何東西著火。可以用桶子來收集。 + + 這個地區的箱子中有些零件,可用來組成有活塞的電路。請使用或完成這個區域裡的電路,或是組成您自己的電路。在教學課程地區外,還有更多的範例可讓您參考。 - - 可用鏟子來收集,能在熔爐中熔煉成玻璃。當下方沒有其他方塊時,會受重力的影響而往下掉。 + + 這個地區有個通往地獄的傳送門! - - 可用鏟子來收集,挖掘時偶爾會挖出打火石。當下方沒有其他方塊時,會受重力的影響而往下掉。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解傳送門和地獄的相關知識。 {*B*} + 如果您已經了解傳送門和地獄的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 可用斧頭劈砍來收集,能精製成木板,或是當做燃料使用。 + + + 只要用鐵、鑽石或是黃金材質的十字鎬開採紅石礦石,就能獲得紅石塵。紅石塵可用來傳送動力,最多可達 15 個方塊的距離,還可像斜坡般往上或往下移動 1 個方塊的高度。 + {*ICON*}331{*/ICON*} + - - 在熔爐中熔煉沙子即可獲得。可當做建築材料,但當您開採玻璃時,玻璃會破碎。 + + + 紅石中繼器可用來延長動力的傳送距離,或是延遲電路。 + {*ICON*}356{*/ICON*} + - - 用十字鎬開採石頭即可獲得,可用來建造熔爐或石製工具。 + + + 活塞獲得動力時會延伸出去,並推動最多 12 個方塊。當黏性活塞縮回時,會拉回 1 個方塊,而且幾乎所有材質的方塊都可拉回。 + {*ICON*}33{*/ICON*} + - - 將黏土放在熔爐中經過火燒之後即可獲得。 + + 只要利用黑曜石方塊組合成有 4 個方塊寬、5 個方塊高的框架,就能製造傳送門。框架的 4 個邊角不需要放置方塊。 - - 可在熔爐中燒成磚塊。 + + 您可以利用地獄世界在地上世界中快速移動,因為在地獄世界移動 1 個方塊的距離,就等於在地上世界移動 3 個方塊的距離。 - - 破裂之後會掉落黏土球,可在熔爐中將黏土球燒成磚塊。 + + 您正以創造模式進行遊戲。 - - 壓縮的雪球存放方式。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解創造模式的相關知識。{*B*} + 如果您已經了解創造模式的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 可用鏟子挖掘來製造雪球。 + + + 如要啟動地獄傳送門,只要用打火鐮點燃框架內側的黑曜石方塊即可。當傳送門的框架損壞、附近發生爆炸,或是有液體流過傳送門時,傳送門就會失效。 + - - 破裂時偶爾會出現小麥種子。 + + 如要使用地獄傳送門,請站在傳送門裡面。此時您會看到畫面變成紫色,還會聽到某種聲音。幾秒鐘後,您就會被傳送到地獄。 - - 可精製成染料。 + + 地獄是個危險的地方,到處都是熔岩,但也是收集地獄血石和閃石的好地方。地獄血石只要一點燃就會永遠燃燒,而閃石則可作為光源。 - - 可與碗一起精製成燉蘑菇。 + + 您已完成耕種的教學課程。 - - 可用鑽石鎬來開採。當靜止的熔岩碰到水時,就會產生黑曜石。黑曜石可用來建造傳送門。 + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用斧頭來劈砍樹幹。 - - 可產生遊戲世界中的怪物。 + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用十字鎬來開採石頭及礦石,但您可能需要用更好的材料來製造十字鎬,才能開採某些較硬的方塊。 - - 可放置在地上來傳送電流。若搭配藥水一起釀製,將可延長效果持續時間。 + + 某些工具比較適合用來攻擊敵人。請考慮使用劍來攻擊。 - - 完全成熟後,即可收成來收集小麥。 + + 鐵傀儡還會自然出現來保護村落,如果您攻擊村民,就會遭到鐵傀儡的攻擊。 - - 已經準備好能栽種種子的地面。 + + 您必須完成教學課程,才能離開這個地區。 - - 可用熔爐烹煮來取得綠色染料。 + + 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用鏟子來開採材質較軟的方塊,例如泥土和沙子。 - - 可精製成砂糖。 + + 提示:按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手或是手中握住的東西來開採及劈砍資源。但您可能需要精製出工具來開採某些方塊… - - 可當做頭盔使用,或是與火把一起精製成南瓜燈籠。同時也是製作南瓜派的主要材料。 + + 河邊的箱子中有艘小船。如要放置小船,請把游標指向水面,然後按下 {*CONTROLLER_ACTION_USE*} 即可。當您把游標指向小船時,使用 {*CONTROLLER_ACTION_USE*} 即可上船。 - - 點燃後會永遠燃燒。 + + 池塘邊的箱子中有根釣魚竿。請把釣魚竿拿出箱子,然後選取它作為您手中握住的物品來使用。 - - 會讓行經其上的所有東西減速。 + + 這個更進階的活塞機械系統可產生會自行修復的橋樑喔!請按下按鈕啟動,然後觀察各個零件的互動方式,了解更多資訊。 - - 站在傳送門中,即可讓您在地上世界與地獄世界之間往返。 + + 您正在使用的工具受損了。工具每次使用時都會受損,到最後就會完全損壞。在物品欄中,物品下方的色彩列即為目前的損害狀態。 - - 可當做熔爐的燃料,或是精製成火把。 + + 按住 {*CONTROLLER_ACTION_JUMP*} 即可往上游。 - - 殺死蜘蛛即可獲得,可用來精製成弓或釣魚竿,或放置在地面上形成絆索。 + + 這個地區的軌道上有台礦車。如要坐上礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*} 即可。對按鈕使用 {*CONTROLLER_ACTION_USE*} 即可讓礦車移動。 - - 殺死雞即可獲得,可用來精製成箭。 + + 製作鐵傀儡需要 4 個帶有指定圖案的鐵方塊,在中間的方塊上方放 1 個南瓜。鐵傀儡會攻擊您的敵人。 - - 殺死 Creeper 即可獲得,可用來精製成炸藥,或當做釀製藥水的材料。 + + 餵乳牛、Mooshroom 或綿羊吃小麥,餵豬吃胡蘿蔔,餵雞吃小麥種子或地獄結節,餵狼吃肉,然後這些動物就會開始尋找周遭也處於戀愛模式中的同種類動物。 - - 在農田栽種即可長成作物。切記:種子需要足夠的光線才能成長! + + 當同在戀愛模式中的兩隻同種類動物相遇,牠們會先親吻數秒,然後就會出現剛出生的小動物。小動物一開始會跟在父母身旁,之後就會長成一般成年動物的大小。 - - 收成作物即可獲得,可用來精製成食物。 + + 剛結束戀愛模式的動物必須等待大約五分鐘後,才能再次進入戀愛模式。 - - 挖掘礫石即可獲得,可用來精製成打火鐮。 + + 這個地區已經豢養數隻動物。您可以開始讓動物繁殖,培育小動物。 - - 對豬使用時,可讓您騎在豬身上,然後利用木棍上的胡蘿蔔操控豬的行進方向。 + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解動物與繁殖的相關知識。{*B*} + 如果您已經了解動物與繁殖的相關知識,請按下 {*CONTROLLER_VK_B*}。 + - - 挖掘白雪即可獲得,可讓您投擲。 + + 您必須餵動物吃特定的食物,讓動物進入「戀愛模式」,動物才能繁殖。 - - 殺死乳牛即可獲得,可用來精製成護甲或用來製作書本。 + + 當您手中握著動物的食物時,有些動物會跟著您,這可以協助您將一群動物聚集起來繁殖。{*ICON*}296{*/ICON*} - - 殺死史萊姆即可獲得,可當做釀製藥水的材料,或精製成黏性活塞。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解雪人和鐵傀儡的相關知識。{*B*} + 如果您已經了解雪人和鐵傀儡的相關知識,請按下{*CONTROLLER_VK_B*}。 - - 雞會隨機下蛋,而蛋可用來精製成食物。 + + 放 1 個南瓜在方塊堆頂端就可以製作出傀儡。 - - 開採閃石即可獲得,可透過精製變回閃石方塊,或搭配藥水一起釀製來提高效果的威力。 - + + 製作雪人需要將 2 個白雪方塊疊在一起,最頂端放 1 個南瓜。雪人會向您的敵人丟雪球。 - - 殺死骷髏後即可獲得,可用來精製成骨粉,餵狼吃還可馴服狼。 + + + 您可以給野狼提供骨頭來馴服牠們。馴服成功後,狼的周圍會出現一些愛心。經過馴服的狼若沒有收到坐下的指示,會一直跟在玩家身邊並保護玩家。 + - - 設法讓骷髏殺死 Creeper 後即可獲得,可利用點唱機來播放。 + + 您已完成動物與繁殖的教學課程。 - - 可用來滅火,或協助作物生長。您可用桶子來裝水。 + + 這個地區有一些南瓜和方塊可以用來製作雪人和鐵傀儡。 - - 破碎時偶爾會掉落樹苗,讓您能重新栽種並長成樹木。 + + 動力來源的放置位置和方向,會改變它對周遭方塊的影響方式。舉例來說,如果您把紅石火把連接到方塊側邊,當這個方塊從其他來源獲得動力時,紅石火把就會熄滅。 - - 能夠在地城裡找到,可當做建築材料和裝飾品。 + + 如果水槽空了,您可以用水桶幫水槽加水。 - - 可用來取得綿羊身上的羊毛,以及獲得樹葉方塊。 + + 在釀製台上使用水瓶、地獄結節和熔岩球,即可製造防火藥水。 - - 當活塞有動力時 (使用按鈕、拉桿、壓板、紅石火把,或是以上任何的紅石物品來啟動活塞),會在情況允許時延伸出去推動方塊。 + + + 手中持有藥水時,只要按住 {*CONTROLLER_ACTION_USE*} 即可使用藥水。若是一般藥水,您只要喝下藥水,即可在自己身上發揮藥水的效果。噴濺藥水則必須投擲出去,讓藥水的效果發揮在位於擊中處附近的生物上。 + 在一般藥水內加入火藥,即可製造噴濺藥水。 + - - 當活塞有動力時 (使用按鈕、拉桿、壓板、紅石火把,或是以上任何的紅石物品來啟動活塞),會在情況允許時延伸出去推動方塊。黏性活塞縮回時,會把接觸到活塞延伸部分的方塊一起拉回。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解釀製和藥水的相關知識。{*B*} + 如果您已經了解釀製和藥水的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 由石頭方塊製造而成,通常能在地下要塞中找到。 - - - 可當做屏障,類似柵欄。 + + 釀製藥水的第一步就是製造水瓶。請從箱子中拿出玻璃瓶。 - - 和門類似,但主要與柵欄搭配使用。 + + 您可以從裝了水的水槽或水方塊中取水裝入玻璃瓶。請將游標指向水源,再按下 {*CONTROLLER_ACTION_USE*},即可將水裝入玻璃瓶中。 - - 精製西瓜片即可獲得。 + + 將防火藥水用在自己身上。 - - 可用來取代玻璃方塊的透明方塊。 + + 請先將物品放到附加能力空格中,才能對物品附加能力。武器、護甲和特定工具在附加能力後即可擁有特殊效果,比如更能抵抗傷害,或開採方塊時可收集到更多物品等。 - - 栽種即可長成南瓜。 + + 當您將物品放到附加能力空格後,畫面右邊的按鈕會顯示多種隨機挑選的附加能力。 - - 栽種即可長成西瓜。 + + 按鈕上的號碼代表附加該特殊能力到物品上所需的經驗等級。如果您的經驗等級不夠高,您就無法使用該按鈕。 - - 會在終界人死亡時掉落,投擲後玩家即會在失去些許生命值的同時,被傳送到終界珍珠所在之處。 + + 既然您現在的身體已可抵抗火和熔岩,不妨前往之前因火或熔岩的阻礙而無法到達的區域。 - - 上面長草的泥土方塊。可用鏟子來收集,能當做建築材料。 + + 這是附加能力介面,可讓您將特殊能力附加到武器、護甲及特定的工具上。 - - 可當做建築材料和裝飾品。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解附加能力介面的相關知識。{*B*} + 如果您已經了解附加能力介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 行經時會減緩您的速度。可使用大剪刀摧毀,並收集絲線。 + + 您在這個地區可以找到釀製藥水所需的釀製台、水槽和裝滿物品的箱子。 - - 摧毀時會產生 Silverfish。如果附近有隻 Silverfish 遭到攻擊,也可能會產生另一隻 Silverfish。 + + 木炭可當做燃料使用,還能與木棍一起精製成火把。 - - 放置後會隨著時間生長。使用大剪刀即可收集。可用來當梯子一樣攀爬。 + + 把沙子放在材料格裡,就能製造出玻璃。請製造一些玻璃方塊來當做棲身處的窗戶。 - - 在上面行走時會感覺滑溜。如果冰塊下面有其他方塊,當您摧毀冰塊時,冰塊就會變成水。如果冰塊太靠近光源或放在地獄裡,就會融化。 + + 這是釀製介面,您可以在此製作具備各種不同效果的藥水。 - - 可當做裝飾品。 + + 許多木質物品可以用來當做燃料,但並非每樣東西的燃燒時間都是相同的。還有其他物品也能拿來當做燃料,您可以多多嘗試。 - - 可用來釀製藥水或尋找地下要塞。由 Blaze 掉落,而 Blaze 多半出沒於地獄要塞的裡面或附近。 + + 當物品火燒完畢後,您就能把物品從成品區移動到物品欄中。您可以嘗試火燒不同的物品,看看會得到什麼成品。 - - 可用來釀製藥水,會在 Ghast 死亡時掉落。 + + 如果您把木頭當做材料,就會製造出木炭。請在熔爐裡放些燃料,然後把木頭放在材料格裡。熔爐需要花些時間才能製造木炭,您可以趁這段時間去做其他的事,稍後再回來查看進度。 - - 會在殭屍 Pigmen 死亡時掉落。在地獄可找到殭屍 Pigmen。用來做為釀製藥水的材料。 + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} + 如果您已經了解如何使用釀製台,請按下 {*CONTROLLER_VK_B*}。 - - 可用來釀製藥水。生長在地獄要塞中,也可以種植在魂沙上。 + + 加入發酵蜘蛛眼會破壞藥水,讓藥水出現反效果;加入火藥則可將藥水變成噴濺藥水,投擲噴濺藥水即可使藥水效力影響附近區域。 - - 會依據使用對象的不同而有各種不同的效果。 + + 先將地獄結節加入水瓶,再加入熔岩球,即可製造防火藥水。 - - 可用來裝水,並可在釀製台當成製作藥水一開始時就必須用到的材料。 + + 現在請按下 {*CONTROLLER_VK_B*} 來離開釀製介面。 - - 這是有毒的食物和釀製物品,會在蜘蛛或穴蜘蛛被玩家殺死時掉落。 + + 請將材料放在上方空格,再將藥水或水瓶置於下方空格,即可釀製藥水,一次最多只能釀製 3 瓶藥水。當您完成適當的組合後,便會展開釀製過程,不久即可製造出藥水。 - - 可用來釀製藥水,且絕大部分用來製造具備負面效果的藥水。 + + 釀製藥水必須先準備水瓶。大部分的藥水都是先用地獄結節做出粗劣藥水,再至少加入另一種材料,便能釀製出最後的成品。 - - 可用來釀製藥水,或與其他物品一起精製成終界之眼或熔岩球。 + + 您可以調整藥水的效果:加入紅石塵可增加效果的持久度,加入閃石塵則可讓效果更具威力。 - - 可用來釀製藥水。 + + 請選取您想要的附加能力,然後按一下 {*CONTROLLER_VK_A*},即可將能力附加到物品上。附加能力會消耗您的經驗等級。 - - 可用來釀製藥水和噴濺藥水。 + + 按下 {*CONTROLLER_ACTION_USE*} 即可拋線來開始釣魚。再次按下 {*CONTROLLER_ACTION_USE*} 即可收線。 + {*FishingRodIcon*} - - 可以裝滿雨水或以一水桶的水承滿,然後即可用來幫玻璃瓶裝水。 + + 如果您等到浮標沈到水面下時再收線,就能釣到魚。您可以吃生魚,也可以先用熔爐把魚煮熟後再吃。不論是生魚還是熟魚,吃下後都能回復您的生命值。 + {*FishIcon*} - - 投擲後即會顯示前往終界入口的方向。將十二個終界之眼放置於終界入口框架上後,即可啟動終界入口。 + + 釣魚竿就跟許多其他工具一樣,有使用次數的限制,但用途可不限於釣魚喔!您可以多多實驗,看看釣魚竿還能釣上或啟動什麼東西... + {*FishingRodIcon*} - - 可用來釀製藥水。 + + 小船可讓您在水面上快速移動。您可以使用 {*CONTROLLER_ACTION_MOVE*} 和 {*CONTROLLER_ACTION_LOOK*} 來控制行進方向。 + {*BoatIcon*} - - 和青草方塊類似,但非常適合在上面栽種蘑菇。 + + 您現在手中握著釣魚竿。請按下 {*CONTROLLER_ACTION_USE*} 來使用釣魚竿。{*FishingRodIcon*} - - 會浮在水面,且可在上面行走。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解釣魚的相關知識。{*B*} + 如果您已經了解釣魚的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 可用來建造地獄要塞,且不受 Ghast 的火球傷害。 + + 這是床舖。當夜晚來臨時,把游標指向床舖並按下 {*CONTROLLER_ACTION_USE*} 即可睡覺,並在早晨醒來。{*ICON*}355{*/ICON*} - - 用在地獄要塞。 + + 這個地區有些簡單的紅石和活塞電路,還有個箱子,裡面裝了其他可用來擴大電路系統的物品。 - - 出現於地獄要塞,會在地獄結節破裂後掉落。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解紅石電路和活塞的相關知識。{*B*} + 如果您已經了解紅石電路和活塞的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 您可在附加能力台使用您的經驗值,將特殊能力附加到劍、鎬、斧、鏟、弓和護甲上。 + + 拉桿、按鈕、壓板和紅石火把都可為電路提供動力。您可直接把這些東西連接到您想要啟動的物品上,或是利用紅石塵將它們連接起來。 - - 終界入口可由十二個終界之眼啟動,玩家可經由終界入口進入終界。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解床舖的相關知識。{*B*} + 如果您已經了解床舖的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 可用來組成終界入口。 + + 床舖應該要放置在安全、具有足夠光線的地方,以免怪物在半夜吵醒您。當您使用過床舖後,您下次死亡時就會在那張床舖再生。 + {*ICON*}355{*/ICON*} - - 這是一種只會在終界出現的方塊,防爆性很高,很適合當做建造材料。 + + 如果您的遊戲中有其他玩家,每位玩家都必須同時躺在床上才能睡覺。 + {*ICON*}355{*/ICON*} - - 擊敗終界的龍就會產生這個方塊。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解小船的相關知識。{*B*} + 如果您已經了解小船的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 投擲後會掉落經驗光球,收集光球即可增加您的經驗值。 + + 您可使用附加能力台把特殊效果附加到武器、護甲和特定工具上,比如開採方塊時可收集到更多物品,或是更能抵抗傷害等。 - - 很適合用來讓東西著火,或是從發射器發射可任意開火。 - + + 把附加能力台的周圍用書架圍住,即可強化附加能力台的威力,您也因此可使用更高等級的附加能力。 - - 類似展示櫃,可將物品或方塊放置在裡面展示。 + + 對物品附加能力會消耗您的經驗等級。收集怪物和動物被殺死時掉落的光球、開採礦石、繁殖動物、釣魚和使用熔爐熔煉/烹煮物品,都可讓您累積經驗值。 - - 投擲出去後可再生出其所顯示類型的生物。 + + 雖然可供您使用的附加能力皆為隨機出現,但某些效果較好的附加能力,只會在您經驗等級較高,且附加能力台的周圍被許多書架圍住來強化其威力時,才會出現。 - - 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + + 您在這個地區可以找到附加能力台,以及一些能幫助您了解如何附加能力的其他物品。 - - 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解附加能力的相關知識。{*B*} + 如果您已經了解附加能力的相關知識,請按下 {*CONTROLLER_VK_B*}。 + - - 在熔爐中熔煉地獄血石即可獲得。能精製成地獄磚塊方塊。 + + 您也可使用經驗藥水瓶增加經驗等級。只要投擲經驗藥水瓶,掉落處就會產生可以收集的經驗值光球。 - - 有動力時會發出光線。 + + 礦車會在軌道上前進。您也可以製作內有熔爐的動力礦車,以及內有箱子的礦車。 + {*RailIcon*} - - 用來耕種即可收集可可豆。 + + 您也可以精製出動力軌道,這會使用紅石火把及電路傳來的動力,使礦車速度加快。動力軌道還能與開關、拉桿及壓板連接,製造出更複雜的軌道系統。 + {*PoweredRailIcon*} - - 生物頭顱可當做裝飾品擺放,或置於頭盔空格中當做面具戴。 + + 您現在坐在小船上。如要離開小船,請把游標指向小船,然後按下 {*CONTROLLER_ACTION_USE*}。{*BoatIcon*} - - 烏賊 + + 您在這個地區的箱子中可以找到一些已附加能力的物品、經驗藥水瓶,以及待您使用附加能力台來嘗試附加能力的物品。 - - 被殺死時會掉落墨囊。 + + 您現在坐在礦車中。如要離開礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*}。{*MinecartIcon*} - - 乳牛 + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解礦車的相關知識。{*B*} + 如果您已經了解礦車的相關知識,請按下 {*CONTROLLER_VK_B*}。 - - 被殺死時會掉落皮革。您也可以用桶子來擠牛奶。 + + 當您拿著物品時,將游標移動到介面外,即可丟棄該物品。 - - 綿羊 + + 閱讀 - - 被剪羊毛時會掉落羊毛 (前提是牠的羊毛還沒被剪掉)。可將綿羊染色來擁有不同色彩的羊毛。 + + 懸吊 - - + + 投擲 - - 被殺死時會掉落羽毛,還會隨機下蛋。 + + 開啟 - - + + 變更音調 - - 被殺死時會掉落豬肉。您還可以使用鞍座來騎在豬上。 + + 觸發 - - + + 栽種 - - 狼是溫馴的動物,但當您攻擊牠時,牠就會攻擊您。您可以使用骨頭來馴服狼,這會讓牠跟著您走,並攻擊任何正在攻擊您的東西。 + + 解除完整版遊戲鎖定 - - Creeper + + 刪除存檔 - - 如果您靠太近就會爆炸! + + 刪除 - - 骷髏 + + 整地 - - 會對您射箭,被殺死時會掉落箭。 + + 收成 - - 蜘蛛 + + 繼續 - - 如果您靠近蜘蛛,牠就會攻擊您。蜘蛛會爬牆,被殺死時會掉落絲線。 + + 往上游 - - 殭屍 + + 敲擊 - - 如果您靠近殭屍,殭屍就會攻擊您。 + + 擠牛奶 - - 殭屍 Pigman + + 收集 - - Pigman 殭屍是溫馴的怪物,但如果您攻擊任何一個 Pigman 殭屍,整群 Pigman 殭屍就會開始攻擊您。 + + 清空 - - Ghast + + 鞍座 - - 會對您發射火球,而且火球碰到東西時會爆炸。 + + 放置 - - 史萊姆 + + - - 受到傷害時會分裂成數個小史萊姆。 + + 騎/搭乘 - - 終界人 + + 乘船 - - 如果您直視終界人,他就會攻擊您。另外還會到處移動方塊。 + + 栽培 - - 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 + + {*EXIT_PICTURE*} 當您準備好進一步探索世界時,這個地區的礦工棲身處附近有個階梯,會通往某個小城堡。 + - - Portfolio Director + + {*B*}按下 {*CONTROLLER_VK_A*} 即可以一般的遊戲方式來進行教學課程。{*B*} + 按下 {*CONTROLLER_VK_B*} 即可略過主要的教學課程。 - - Product Manager + + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解食物列和吃東西的相關知識。{*B*} + 如果您已經了解食物列和吃東西的相關知識,請按下 {*CONTROLLER_VK_B*} 。 - - 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 + + 餵食 - - 木劍 + + 馴服 - - 石劍 + + 變更篩選條件 - - 鐵劍 + + 全部放置 - - 鑽石劍 + + 放置 1 個 - - 黃金劍 + + 丟棄 - - 木鏟 + + 全部撿起 - - 石鏟 + + 撿起一半 - - 鐵鏟 + + 放置 - - 鑽石鏟 + + 全部丟棄 - - 黃金鏟 + + 清除快速選取 - - 木鎬 + + 這是什麼? - - 石鎬 + + 分享至 Facebook - - 鐵鎬 + + 丟棄 1 個 - - 鑽石鎬 + + 交換 - - 黃金鎬 + + 快速移動 - - 木斧 + + 角色外觀套件 - - 石斧 + + 紅色玻璃片 - - 鐵斧 + + 綠色玻璃片 - - 鑽石斧 + + 棕色玻璃片 - - 黃金斧 + + 白色玻璃 - - 木鋤 + + 染色玻璃片 - - 石鋤 + + 黑色玻璃片 - - 鐵鋤 + + 藍色玻璃片 - - 鑽石鋤 + + 灰色玻璃片 - - 黃金鋤 + + 粉紅玻璃片 - - 木門 + + 淺綠色玻璃片 - - 鐵門 + + 紫色玻璃片 - - 鎖鏈盔 + + 青色玻璃片 - - 鎖鏈護甲 + + 淡灰色玻璃片 - - 鎖鏈護脛 + + 橘色玻璃 - - 鎖鏈靴 + + 藍色玻璃 - - 皮帽 + + 紫色玻璃 - - 鐵盔 + + 青色玻璃 - - 鑽石盔 + + 紅色玻璃 - - 黃金盔 + + 綠色玻璃 - - 皮衣 + + 棕色玻璃 - - 鐵護甲 + + 淺灰色玻璃 - - 鑽石護甲 + + 黃色玻璃 - - 黃金護甲 + + 淺藍色玻璃 - - 皮褲 + + 桃紅色玻璃 - - 鐵護脛 + + 灰色玻璃 - - 鑽石護脛 + + 粉紅色玻璃 - - 黃金護脛 + + 淺綠色玻璃 - - 皮靴 + + 黃色玻璃片 - - 鐵靴 + + 淺灰色 - - 鑽石靴 + + 灰色 - - 黃金靴 + + 粉紅色 - - 鐵錠塊 + + 藍色 - - 黃金錠塊 + + 紫色 - - 桶子 + + 青色 - - 水桶 + + 淺綠色 - - 熔岩桶 + + 橘色 - - 打火鐮 + + 白色 - - 蘋果 + + 自訂 - - + + 黃色 - - + + 淺藍色 - - 煤塊 + + 洋紅色 - - 木炭 + + 棕色 - - 鑽石 + + 白色玻璃片 - - 木棍 + + 小型球狀 - - + + 大型球狀 - - 燉蘑菇 + + 淺藍色玻璃片 - - 絲線 + + 洋紅玻璃片 - - 羽毛 + + 橘色玻璃片 - - 火藥 + + 星狀 - - 小麥種子 + + 黑色 - - 小麥 + + 紅色 - - 麵包 + + 綠色 - - 打火石 + + Creeper 形 - - 生豬肉 + + 爆裂 - - 熟豬肉 + + 未知形狀 - - 圖畫 + + 黑色玻璃 - - 金蘋果 + + 鐵製馬鎧 - - 牌子 + + 黃金製馬鎧 - - 礦車 + + 鑽石製馬鎧 - - 鞍座 + + 紅石比較器 - - 紅石 + + TNT 礦車 - - 雪球 + + 漏斗礦車 - - 小船 + + 栓繩 - - 皮革 + + 烽火台 - - 牛奶桶 + + 陷阱儲物箱 - - 磚塊 + + 感重壓力板 (輕) - - 黏土 + + 命名牌 - - 甘蔗 + + 木材 (任何類型) - - 紙張 + + 指令方塊 - - 書本 + + 火藥球 - - 史萊姆球 + + 這些動物可被馴服後可騎乘。 它們可以附加一個儲物箱。 - - 箱子礦車 + + - - 熔爐礦車 + + 馬和驢雜交而生。這些動物可被馴服,隨後還可騎乘和背負儲物箱。 - - + + - - 指南針 + + 這些動物可被馴服後可騎乘。 - - 釣魚竿 + + - - 時鐘 + + 僵屍馬 - - 閃石塵 + + 空白地圖 - - 生魚 + + 地獄之星 - - 熟魚 + + 煙火 - - 染粉 + + 骷髏馬 - - 墨囊 + + 凋零怪 - - 玫瑰紅 + + 它們是用凋零骷髏頭顱和靈魂砂製成的。 它們會向你發射會爆炸的骷髏頭顱。 - - 仙人掌綠 + + 感重壓力板 (重) - - 可可豆 + + 淺灰粘土塊 - - 青金石 + + 灰色粘土塊 - - 紫色染料 + + 粉紅粘土塊 - - 水藍色染料 + + 藍色粘土塊 - - 淺灰色染料 + + 紫色粘土塊 - - 灰色染料 + + 青色粘土塊 - - 粉紅色染料 + + 淺綠色粘土塊 - - 亮綠色染料 + + 橘色粘土塊 - - 蒲公英黃 + + 白色粘土塊 - - 淺藍色染料 + + 染色玻璃 - - 紫紅色染料 + + 黃色粘土塊 - - 橘色染料 + + 淺藍粘土塊 - - 骨粉 + + 洋紅粘土塊 - - 骨頭 + + 棕色粘土塊 - - 砂糖 + + 漏斗 - - 蛋糕 + + 觸發鐵軌 - - 床舖 + + 投擲器 - - 紅石中繼器 + + 紅石比較器 - - 餅乾 + + 陽光感測器 - - 地圖 + + 紅石磚 - - 唱片:13 + + 染色粘土 - - 唱片:Cat + + 黑色粘土塊 - - 唱片:Blocks + + 紅色粘土塊 - - 唱片:Chirp + + 綠色粘土塊 - - 唱片:Far + + 乾草捆 - - 唱片:Mall + + 硬化粘土 - - 唱片:Mellohi + + 煤炭磚 - - 唱片:Stal + + 淡化 - - 唱片:Strad + + 停用後,怪物和動物無法更改方塊 (例如,Creeper 的爆炸無法摧毀方塊,羊也不會吃掉草) 或拾取物品。 - - 唱片:Ward + + 啟用後,玩者死亡時將保留物品欄中的物品。 - - 唱片:11 + + 停用後,生物不會自然生成。 - - 唱片:Where are we now + + 遊戲模式:冒險 - - 大剪刀 + + 冒險 - - 南瓜子 + + 輸入一個種子,再度生成同樣的地形。留空可隨機生成世界。 - - 西瓜子 + + 停用後,怪物和動物不會掉落物品 (例如,Creeper 不會掉落火藥)。 - - 生雞肉 + + {*PLAYER*} 從梯子上摔了下來 - - 熟雞肉 + + {*PLAYER*} 從藤蔓上摔了下來 - - 生牛肉 + + {*PLAYER*} 掉到了水池外面 - - 牛排 + + 在停用後,方塊被破壞後不會掉落物品 (例如,石頭方塊不會掉落鵝卵石)。 - - 腐肉 + + 停用後,玩者不會自然回復生命。 - - 終界珍珠 + + 停用後,時間將不會變化。 - - 西瓜片 + + 礦車 - - Blaze 棒 + + 栓繩 - - Ghast 淚水 + + 解繩 - - 碎金塊 + + 附著 - - 地獄結節 + + 下馬 - - {*splash*}{*prefix*}{*postfix*}藥水 + + 附加儲物箱 - - 玻璃瓶 + + 發射 - - 水瓶 + + 名稱 - - 蜘蛛眼 + + 烽火台 - - 發酵蜘蛛眼 + + 主效果 - - Blaze 粉 + + 輔助效果 - - 熔岩球 + + - - 釀製台 + + 投擲器 - - 水槽 + + 漏斗 - - 終界之眼 + + {*PLAYER*} 從高處掉了下來 - - 發光西瓜 + + 現在無法使用角色蛋。 世界中的蝙蝠已達最大數量。 - - 經驗藥水瓶 + + 這種動物無法進入「戀愛模式」。 世界中的種馬已達最大數量。 - - 火彈 + + 遊戲選項 - - 火彈 (木炭) + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 的火球燒死了。 - - 火彈 (煤塊) + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 揍死了。 - - 物品框架 + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 殺死了。 - - 再生 {*CREATURE*} + + 怪物破壞 - - 地獄磚塊 + + 方塊掉落 - - 骷髏 + + 自然回復 - - 骷髏頭 + + 日夜週期 - - 凋零骷髏 + + 保留物品欄 - - 殭屍頭顱 + + 怪物生成 - - 頭顱 + + 怪物掉寶 - - %s 頭顱 + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 射死了 - - Creeper 頭顱 + + {*PLAYER*} 掉的太遠,被 {*SOURCE*} 殺掉了 - - 石頭 + + {*PLAYER*} 掉的太遠,被 {*SOURCE*} 用 {*ITEM*} 殺掉了 - - 青草方塊 + + {*PLAYER*} 在與 {*SOURCE*} 戰鬥時步入了火焰 - - 泥土 + + {*PLAYER*} 被 {*SOURCE*} 從高處推了下來 - - 鵝卵石 + + {*PLAYER*} 被 {*SOURCE*} 從高處推了下來 - - 橡樹厚木板 + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 從高處推了下來 - - 杉樹厚木板 + + {*PLAYER*} 在與 {*SOURCE*} 的戰鬥中被燒成了灰燼。 - - 樺樹厚木板 + + {*PLAYER*} 被 {*SOURCE*} 炸飛了 - - 熱帶叢林厚木板 + + {*PLAYER*} 被凋零怪殺死了 - - 樹苗 + + {*PLAYER*} 被 {*SOURCE*} 用 {*ITEM*} 殺死了。 - - 橡樹樹苗 + + {*PLAYER*} 在逃離 {*SOURCE*} 的過程中想在岩漿中游泳 - - 杉樹樹苗 + + {*PLAYER*} 在逃離 {*SOURCE*} 的過程中溺死了。 - - 樺樹樹苗 + + {*PLAYER*} 在逃離 {*SOURCE*} 的過程中被仙人掌刺死了 - - 熱帶叢林樹苗 + + 騎乘 - - 基岩 - - - 水體 - - - 熔岩 - - - 沙子 - - - 沙岩 - - - 礫石 - - - 黃金礦石 - - - 鐵礦石 + + + 要控制一匹馬,必須為它裝備上一個鞍。鞍可以從村民處購得、或在隱藏於世界各處的儲物箱中獲取。 + - - 煤礦石 + + + 透過附上儲物箱,馴化的驢和騾可以佩上鞍袋。這些袋子可在騎乘或潛行時打開。 + - - 木頭 + + + 與其他動物一樣,馬和驢可以用金蘋果或金胡蘿蔔來繁殖 (騾不可)。隨時間流逝,小馬會長成成年馬;用小麥或乾草餵食小馬可加速它們的成長。 + - - 橡樹木頭 + + + 在使用馬、驢和騾之前,必須先馴化它們。要馴服馬,可以透過騎乘,在馬試著將騎士摔下來時一直騎在它背上的方式,將馬馴服。 + - - 杉樹木頭 + + + 馴服之後,在它們周圍會出現愛心,而且它們不再會將玩者摔下來。 + - - 樺樹木頭 + + + 現在就試試騎上這匹馬吧。 兩手空空,使用 {*CONTROLLER_ACTION_USE*} 來騎上它。 + - - 熱帶叢林木頭 + + + 你可以在這裡嘗試馴化馬和驢,周圍的儲物箱中有馬鞍、馬鎧和其他有用的物品。 + - - 橡樹 + + + 位於至少 4 層的金字塔上的烽火台能提供額外選項,可以在「回復」的輔助效果和更強的主效果之間選擇。 + - - 杉樹 + + + 要設置烽火台的效果,你必須在費用槽獻上一塊綠寶石、鑽石、金錠或鐵錠。 設定完畢後,效果會從烽火台無限期的發出。 + - - 樺樹 + + 在這座金字塔的頂部有一個沒有觸發的烽火台。 - - 樹葉 + + + 這是烽火台界面,你可以在這裡選擇烽火台賦予的效果。 + - - 橡樹樹葉 + + + {*B*}按 {*CONTROLLER_VK_A*} 繼續。 + {*B*}如果你已經知道如何使用烽火台界面,請按 {*CONTROLLER_VK_B*}。 + - - 杉樹樹葉 + + + 在烽火台的選單中,你可以為烽火台選取 1 種主效果。 金字塔的層數越高,可以選擇的效果就越多。 + - - 樺樹樹葉 + + + 所有成年的馬、驢和騾都可以騎乘。但是,只有馬可以裝備鎧甲,而只有騾和驢可以裝備鞍袋以物品運送。 + - - 熱帶叢林樹葉 + + + 這是馬的物品欄界面。 + - - 海綿 + + + {*B*}按 {*CONTROLLER_VK_A*} 繼續。 + {*B*}如果你已經知道如何使用馬的物品欄,請按 {*CONTROLLER_VK_B*}。 + - - 玻璃 + + + 你可以利用馬的物品欄進行運輸,或者為你的馬、驢或騾裝備物品。 + - - 羊毛 + + 閃爍 - - 黑色羊毛 + + 蹤跡 - - 紅色羊毛 + + 飛行時間: - - 綠色羊毛 + + + 在鞍槽中放置一個鞍,給你的馬上鞍。在鎧甲槽中放置馬鎧可以給馬穿上鎧甲。 + - - 棕色羊毛 + + 你發現了一頭騾。 - - 藍色羊毛 + + + {*B*}按 {*CONTROLLER_VK_A*} 了解有關馬、驢和騾的詳細資訊。 + {*B*}如果你已經了解馬、驢和騾,請按 {*CONTROLLER_VK_B*}。 + - - 紫色羊毛 + + + 馬和驢主要會在平原上。 騾可透過驢和馬雜交生出,但騾不能生育。 + - - 水藍色羊毛 + + + 你也可以在這個選單中將物品在你自己的物品欄和捆在驢和騾身上的鞍袋之間進行交換。 + - - 淺灰色羊毛 + + 你發現了一匹馬。 - - 灰色羊毛 + + 你發現了一頭驢。 - - 粉紅色羊毛 + + + {*B*}按 {*CONTROLLER_VK_A*} 了解有關烽火台的詳細資訊。 + {*B*}如果你已經了解烽火台,請按 {*CONTROLLER_VK_B*}。 + - - 亮綠色羊毛 + + + 火藥球可以透過將火藥和染料置於精製方格中製得。 + - - 黃色羊毛 + + + 染料會設定火藥球的爆炸顏色。 + - - 淺藍色羊毛 + + + 火藥球的形狀透過加入火彈、碎金塊、羽毛或怪物頭顱來設定。 + - - 紫紅色羊毛 + + + 你可以選擇性地在精製方格放置多個火藥球,將它們增加到煙火中。 + - - 橘色羊毛 + + + 在精製方格中放上更多的火藥會提升火藥球的爆炸高度。 + - - 白色羊毛 + + + 然後,在你想要製作煙火時,你就可以將精製完成的煙火從輸出格中取出。 + - - 花朵 + + + 蹤跡或閃爍可使用鑽石或閃石塵來加入。 + - - 玫瑰 + + + 煙火是裝飾性的物品,可以手持燃放或從發射器發射。它們是用紙張、火藥和一定數量的可選火藥球精製而成的。 + - - 蘑菇 + + + 火藥球的顏色、淡化、形狀、大小和效果 (例如蹤跡和閃爍) 可以透過在精製時加入額外材料來自訂。 + - - 黃金方塊 + + + 試試使用儲物箱中的各式材料在精製台精製一個煙火吧。 + - - 黃金的壓縮存放方式。 + + + 精製好火藥球後,可以將它與染料一同精製來設定它的淡化顏色。 + - - 鐵方塊 + + + 在儲物箱中存放著多種用於製作煙火的物品! + - - 鐵的壓縮存放方式。 + + + {*B*}按 {*CONTROLLER_VK_A*} 了解有關煙火的詳細資訊。 + {*B*}如果你已經了解煙火,請按 {*CONTROLLER_VK_B*}。 + - - 石板 + + + 要精製煙花,請在顯示在物品欄上方的 3x3 精製方格中放置火藥和紙張。 + - - 石板 + + 這個房間裡放著漏斗 - - 沙岩板 + + + {*B*}按 {*CONTROLLER_VK_A*} 了解有關漏斗的詳細資訊。 + {*B*}如果你已經了解漏斗,請按 {*CONTROLLER_VK_B*}。 + - - 橡樹木板 + + + 漏斗用於向容器放入物品或從容器中拿出物品,並且可以自動地拾取丟到自己上方的物品。 + - - 鵝卵石板 + + + 啟動的烽火台會向天空投射出一道明亮的光柱,並且為附近的玩者賦予力量。 它們是用玻璃、黑曜石和地獄之星製作而成,地獄之星可以透過擊敗凋零怪獲得。 + - - 磚塊板 + + + 烽火台必須放置下來,讓它們在白天能受到陽光照射。 它們必須置於由鐵、金、綠寶石或鑽石所製成的金字塔之上。 但是,選用的材料對烽火台的效果沒有影響。 + - - 石磚塊板 + + + 試著使用烽火台,設定它賦予的效果;你可以使用提供的鐵錠作為必要的費用。 + - - 橡樹木板 + + + 它們可以影響釀造台、儲物箱、發射器、投擲器、運輸礦車、漏斗礦車,以及其他漏斗。 + - - 杉樹木板 + + + 這個房間裡有數種有用的漏斗形式,供你查看和試驗。 + - - 樺樹木板 + + + 這是煙火界面,你可以用它來精製煙火和火藥球。 + - - 熱帶叢林木板 + + + {*B*}按 {*CONTROLLER_VK_A*} 繼續。 + {*B*}如果你已經知道如何使用煙火界面,請按 {*CONTROLLER_VK_B*}。 + - - 地獄磚塊板 + + + 漏斗會一直嘗試從置於本身上方的合適容器中吸取物品, 也會嘗試將所存放的物品插入輸出容器。 + - - 磚塊 + + + 然而,如果紅石給漏斗充能,漏斗就會變為閒置狀態,停止吸取和插入物品。 + - - 炸藥 + + + 漏斗會指向其嘗試輸出物品的方向。要讓漏斗指向特定方塊,請在潛行時對著方塊放置漏斗。 + - - 書架 + + 你可以在沼澤中發現這類敵人;它們會用投擲藥劑的方式對你發動攻擊。 殺死它們會掉落藥劑。 - - 苔蘚石 + + 遊戲世界中的圖畫/物品框架已達到數量上限。 - - 黑曜石 + + 您無法在和平模式中產生敵人。 - - 火把 + + 這種動物無法進入「戀愛模式」。豬、 綿羊、乳牛、貓和馬已達到繁殖數量上限。 - - 火把 (煤塊) + + 遊戲世界裡的烏賊已達到數量上限,目前無法使用角色蛋。 - - 火把 (木炭) + + 遊戲世界裡的敵人已達到數量上限,目前無法使用角色蛋。 - - + + 遊戲世界裡的村民已達到數量上限,目前無法使用角色蛋。 - - 怪物產生器 + + 狼已達到繁殖數量上限,該動物無法進入戀愛模式。 - - 橡樹木梯 + + 遊戲世界裡的生物總數已達到上限。 - - 箱子 + + 上下反轉 - - 紅石塵 + + 慣用左手 - - 鑽石礦石 + + 雞已達到繁殖數量上限,該動物無法進入戀愛模式。 - - 鑽石方塊 + + Mooshroom 已達到繁殖數量上限,該動物無法進入戀愛模式。 - - 鑽石的壓縮存放方式。 + + 遊戲世界裡的小船已達到數量上限。 - - 精製台 + + 遊戲世界裡的雞已達到數量上限,目前無法使用角色蛋。 - - 作物 + + {*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*} - - 熔爐 + + 重設地獄 - - 牌子 + + %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*} - - 軌道 + + 確定要將此遊戲存檔中的地獄重設成預設狀態嗎?這將會失去地獄內的所有建設進度! - - 動力軌道 + + 現在無法使用角色蛋。豬、 綿羊、乳牛、貓和馬已達到數量上限。 - - 偵測器軌道 + + Mooshroom 已達到數量上限,目前無法使用角色蛋。 - - 石梯 + + 遊戲世界裡的狼已達到數量上限,目前無法使用角色蛋。 - - 拉桿 + + 重設地獄 - - 壓板 + + 不要重設地獄 - - 鐵門 + + 目前無法為這頭 Mooshroom 剪毛。豬、 綿羊、乳牛、貓和馬已達到數量上限。 - - 紅石礦石 + + 您死亡了! - - 紅石火把 + + 世界選項 - - 按鈕 + + 可以建造和開採 - - 白雪 + + 可以使用門與開關 - - 冰塊 + + 產生建築 - - 仙人掌 + + 非常平坦的世界 - - 黏土 + + 贈品箱 - - 甘蔗 + + 可以開啟容器 - - 點唱機 + + 踢除玩家 - - 柵欄 + + 可以飛翔 - - 南瓜 + + 不會疲勞 - - 南瓜燈籠 + + 可以攻擊玩家 - - 地獄血石 + + 可以攻擊動物 - - 魂沙 + + 管理員 - - 閃石 + + 主持人特權 - - 傳送門 + + 遊戲方式 - - 青金石礦石 + + 控制設定 - - 青金石方塊 + + 設定 - - 青金石的壓縮存放方式。 + + 再生 - - 分發器 + + 下載內容 - - 音符方塊 + + 變更角色外觀 - - 蛋糕 + + 製作群 - - 床舖 + + 炸藥會爆炸 - - 蜘蛛網 + + 玩家對戰 - - 茂密青草 + + 信任玩家 - - 枯灌木 + + 重新安裝內容 - - 真空管 + + 偵錯設定 - - 上鎖的箱子 + + 火會蔓延 - - 活板門 + + 終界龍 - - 羊毛 (不限色彩) + + {*PLAYER*} 被終界龍噴出的氣息殺死了 + - - 活塞 + + {*PLAYER*} 被 {*SOURCE*} 殺死了 - - 黏性活塞 + + {*PLAYER*} 被 {*SOURCE*} 殺死了 - - Silverfish 方塊 + + {*PLAYER*} 死了 - - 石磚塊 + + {*PLAYER*} 被炸死了 - - 長滿青苔的石磚塊 + + {*PLAYER*} 被魔法殺死了 - - 裂開的石磚塊 + + {*PLAYER*} 被 {*SOURCE*} 的箭射死了 - - 刻紋石磚塊 + + 基岩迷霧 - - 蘑菇 + + 顯示平行顯示器 - - 蘑菇 + + 顯示手 - - 鐵條 + + {*PLAYER*} 被 {*SOURCE*} 的火球殺死了 - - 玻璃片 + + {*PLAYER*} 被 {*SOURCE*} 的拳頭打死了 - - 西瓜 + + {*PLAYER*} 被 {*SOURCE*} 用魔法殺死了 - - 南瓜莖 + + {*PLAYER*} 掉出世界而死亡了 - - 西瓜莖 + + 材質套件 - - 藤蔓 + + 混搭套件 - - 柵欄門 + + {*PLAYER*} 著火死亡了 - - 磚塊梯 + + 主題 - - 石磚塊梯 + + 玩家圖示 - - Silverfish 石 + + 個人造型項目 - - Silverfish 鵝卵石 + + {*PLAYER*} 被燒死了 - - Silverfish 石磚塊 + + {*PLAYER*} 餓死了 - - 菌絲體 + + {*PLAYER*} 被戳死了 - - 睡蓮 + + {*PLAYER*} 重重摔在地面上而死亡了 - - 地獄磚塊 + + {*PLAYER*} 嘗試在熔岩中游泳而死亡了 - - 地獄磚塊柵欄 + + {*PLAYER*} 在牆中窒息死亡了 - - 地獄磚塊梯 + + {*PLAYER*} 溺死了 - - 地獄結節 + + 死亡訊息 - - 附加能力台 + + 您已不是管理員 - - 釀製台 + + 您現在可以飛翔 - - 水槽 + + 您已無法飛翔 - - 終界入口 + + 您已無法攻擊動物 - - 終界入口框架 + + 您現在可以攻擊動物 - - 終界石 + + 您現在是管理員 - - 龍蛋 + + 您將不再感到疲勞 - - 矮樹 + + 您現在是無敵狀態 - - + + 您已不是無敵狀態 - - 沙岩梯 + + %d MSP - - 杉樹木梯 + + 您現在開始會感到疲勞 - - 樺樹木梯 + + 您現在是隱形狀態 - - 熱帶叢林木梯 + + 您已不是隱形狀態 - - 紅石燈 + + 您現在可以攻擊玩家 - - 可可 + + 您現在可以開採及使用物品 - - 骷髏 + + 您已無法放置方塊 - - 目前的控制方式 + + 您現在可以放置方塊 - - 配置 + + 動畫人物 - - 移動/奔跑 + + 自訂角色外觀動畫 - - 觀看 + + 您已無法開採或使用物品 - - 暫停 + + 您現在可以使用門與開關 - - 跳躍 + + 您已無法攻擊生物 - - 跳躍/往上飛 + + 您現在可以攻擊生物 - - 物品欄 + + 您已無法攻擊玩家 - - 依序更換手中的物品 + + 您已無法使用門與開關 - - 動作 + + 您現在可以使用容器 (例如箱子等) - - 使用 + + 您已無法使用容器 (例如箱子等) - - 精製 + + 隱形 - - 丟棄 + + 烽火台 + + + {*T3*}遊戲方式: 烽火台{*ETW*}{*B*}{*B*} +啟動的烽火台會向天空投射出一道明亮的光柱,並且為附近的玩者賦予力量。{*B*} +它們是用玻璃、黑曜石和地獄之星製作而成,地獄之星可以透過擊敗凋零怪獲得。{*B*}{*B*} +烽火台必須放置下來,讓它們在白天能受到陽光照射。 它們必須置於由鐵、金、綠寶石或鑽石所製成的金字塔之上。{*B*} +烽火台下方的材料對烽火台的效果沒有影響。{*B*}{*B*} +在烽火台的選單中,你可以為它選取一種主效果。 金字塔的層數越高,可以選擇的效果就越多。{*B*} +位於至少四層的金字塔上的烽火台能提供選項,可以在「回復」的輔助效果和更強的主效果之間選擇。{*B*}{*B*} +要設置烽火台的效果,你必須在費用槽獻上一塊綠寶石、鑽石、金錠或鐵錠。{*B*} +設定完畢後,效果會從烽火台無限期的發出。{*B*} + - - 潛行 + + 煙火 + + + 語言 + + + + + + {*T3*}遊戲方式:馬{*ETW*}{*B*}{*B*} +馬和驢主要在平原上出現。騾是驢和馬的後代,但騾不能生育。{*B*} +所有成年的馬、驢和騾都可以騎乘。但是,只有馬可以裝備護甲,而只有騾和驢可以裝備鞍袋以運送物品。{*B*}{*B*} +在使用馬、驢和騾之前,必須先馴化它們。要馴服馬,可以透過騎乘,在馬試著將騎士摔下來時一直騎在它背上的方式,將馬馴服。{*B*} +在馬的周圍出現愛心時,它就馴化完畢了,不再會將玩家摔下馬背。要控制馬,玩家必須為馬裝備一個鞍。{*B*}{*B*} +鞍可以從村民處購得或在隱藏於世界各處的儲物箱中獲取。{*B*} +透過附上儲物箱,馴化的驢和騾可以佩上鞍袋。這些鞍袋可在騎乘或潛行時打開。{*B*}{*B*} +與其他動物一樣,馬和驢可以用金蘋果或金胡蘿蔔來繁殖 (騾不可)。{*B*} +隨時間流逝,小馬會長成成年馬;用小麥或乾草餵食小馬可加速它們的成長。{*B*} + + + + {*T3*}遊戲方式:煙火{*ETW*}{*B*}{*B*} +煙火是裝飾性的物品,可以手持燃放或從發射器發射。它們是用紙張、火藥和一定數量的可選火藥球精製而成的。{*B*} +火藥球的顏色、淡化、形狀、大小和效果 (例如蹤跡和閃爍) 可以透過在精製時加入額外材料來自訂。{*B*}{*B*} +要精製煙花,請在顯示在物品欄上方的 3x3 精製方格中放置火藥和紙張。{*B*} +你可以選擇在精製方格放置多個火藥球,將它們增加到煙火中。{*B*} +在精製方格中放上更多的火藥會提升火藥球的爆炸高度。{*B*}{*B*} +然後,你就可以將精製完成的煙火從輸出格中取出。{*B*}{*B*} +火藥球可以透過將火藥和染料置於精製方格中製得。{*B*} + - 染料會設定火藥球的爆炸顏色。{*B*} + - 火藥球的形狀透過加入火彈、碎金塊、羽毛或怪物頭顱來設定。{*B*} + - 蹤跡或閃爍可使用鑽石或閃石塵來加入。{*B*}{*B*} +精製好火藥球後,可以將它與染料一同精製來設定它的淡化顏色。 + + + + {*T3*}遊戲方式:投擲器{*ETW*}{*B*}{*B*} +收到紅石訊號時,投擲器會將內部存放的隨機一件道具擲於地上。使用 {*CONTROLLER_ACTION_USE*} 鍵可打開投擲器,隨後你可從你的物品欄向投擲器裝載物品。{*B*} +如果投擲器朝向儲物箱或另一類型的容器,則物品會轉而置於這個容器之中。構築連環連接的長串投擲器可以用來遠距離傳送物品,要達成這個目的,需要讓它們交替開啟和關閉。 + + + + 在使用時變為目前你所在部分世界的地圖,並會隨著你的探索而填滿。 + + + 由凋零怪掉落,用於製作烽火台。 + + + 漏斗 + + + {*T3*}遊戲方式: 漏斗{*ETW*}{*B*}{*B*} +漏斗用於向容器放入物品或從容器中拿出物品,並且可以自動地拾取丟到自己上方的物品。{*B*} +它們可以影響釀造台、儲物箱、發射器、投擲器、運輸礦車、漏斗礦車,以及其他漏斗。{*B*}{*B*} +漏斗會一直嘗試從置於本身上方的合適容器中吸取物品。 也會嘗試將所存放的物品插入輸出容器。{*B*} +如果紅石給漏斗充能,漏斗就會變為閒置狀態,停止吸取和插入物品。{*B*}{*B*} +漏斗會指向其嘗試輸出物品的方向。 要讓漏斗指向特定方塊,請在潛行時對著方塊放置漏斗。{*B*} + - - 潛行/往下飛 + + 投擲器 - - 變更視角模式 + + NOT USED - - 玩家/邀請 + + 立即回復生命值 - - 移動 (飛翔時) + + 立即造成傷害 - - 配置 1 + + 增強跳躍 - - 配置 2 + + 開採造成的疲勞 - - 配置 3 + + 力量 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonA.png" align="middle" height="30" width="30"/&gt;]]> + + 虛弱 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonB.png" align="middle" height="30" width="30"/&gt;]]> + + 噁心 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonX.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonY.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftStick.png" align="middle" height="30" width="30"/&gt;]]> + + NOT USED - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightStick.png" align="middle" height="30" width="30"/&gt;]]> + + 復原 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + 抗性 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightTrigger.png" align="middle" height="30" width="30"/&gt;]]> + + 尋找用於產生世界的種子 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLeftBumper.png" align="middle" height="30" width="30"/&gt;]]> + + 點燃後會製造多彩的爆炸。 製作煙火時所用的火藥球決定了煙火的顏色、效果、形狀和消失效果。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRightBumper.png" align="middle" height="30" width="30"/&gt;]]> + + 可以啟用或停用漏斗礦車,以及觸發 TNT 礦車的一種鐵軌。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonBack.png" align="middle" height="30" width="30"/&gt;]]> + + 用於容納和投擲物品,或者在被給予紅石信號時將物品塞進另一容器中。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonStart.png" align="middle" height="30" width="30"/&gt;]]> + + 用染色硬化粘土製成的彩色方塊。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonRS.png" align="middle" height="30" width="30"/&gt;]]> + + 提供一個紅石信號。 壓力板上的物品較多時,信號會較強。 需要的重量比輕壓力板要重。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonLS.png" align="middle" height="30" width="30"/&gt;]]> + + 用作紅石信號源。 可還原成紅石。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadR.png" align="middle" height="30" width="30"/&gt;]]> + + 用於拾取物品和將物品運輸到容器或從容器中運出。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadL.png" align="middle" height="30" width="30"/&gt;]]> + + 可以餵給馬、驢或騾,治療最多 10 顆心。 加速小馬的成長。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadU.png" align="middle" height="30" width="30"/&gt;]]> + + 蝙蝠 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\X360ControllerIcons\ButtonDpadD.png" align="middle" height="30" width="30"/&gt;]]> + + 你可以在洞穴或其他大型封閉空間中發現這些飛行的生物。 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + 女巫 - - <![CDATA[&amp;nbsp;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;&lt;img src="{*IMAGEROOT*}Graphics\Icon_Shank.png" align="middle" height="22" width="22"/&gt;]]> + + 在熔爐中燒煉粘土塊製成。 - - {*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*} 時,角色將會繼續奔跑,直到奔跑時間耗盡或是食物消耗完畢為止。 + + 可用來裝備馬匹的特殊護甲。 提供 5 點護甲值。 - - 按下 {*CONTROLLER_ACTION_JUMP*} 即可跳躍。 + + 用於決定煙火的顏色、效果和形狀。 - - 按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手或是手中握住的東西來開採及劈砍資源,但您可能需要精製出工具來開採某些方塊… + + 在紅石電路中,用於保持、比較或減去信號強度,或者也可用於測量特定方塊的狀態。 - - 請按住 {*CONTROLLER_ACTION_ACTION*} 來砍下 4 個木頭方塊 (樹幹)。{*B*}當方塊被劈砍下來後,只要站在隨後出現的浮空物品旁邊,該物品就會進入您的物品欄。 + + 是一種礦車,功能上就像一塊移動的 TNT。 - - 按下 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟精製介面。 + + 可用來裝備馬匹的特殊護甲。 提供 7 點護甲值。 - - 在您不斷收集和精製物品的同時,物品欄也會逐漸填滿。{*B*} - 請按下 {*CONTROLLER_ACTION_INVENTORY*} 來開啟物品欄。 + + 用於執行指令。 - - 當您四處移動、開採和攻擊時,就會消耗食物列 {*ICON_SHANK_01*}。奔跑和快速跳躍時所消耗的食物量,會比行走和正常跳躍時所消耗的多。 + + 向天空投射一束光柱,並且可以為周遭玩者提供狀態效果。 - - 如果您失去部分生命值,但是食物列有 9 個以上的 {*ICON_SHANK_01*},您的生命值將會自動回復。只要吃下食物,就能補充食物列。 + + 在內部存放方塊和物品。 並排放置兩個儲物箱可製作出一個具有雙倍儲物空間的較大儲物箱。 陷阱儲物箱在開啟時也會發出一個紅石信號。 - - 只要把食物握在手中,然後按住 {*CONTROLLER_ACTION_USE*} 即可吃下該食物來補充您的食物列。當食物列全滿時,您無法繼續吃東西。 + + 可用來裝備馬匹的特殊護甲。 提供 11 點護甲值。 - - 您的食物列即將耗盡,而且您失去了部分生命值。請吃下物品欄中的牛排來補充食物列,並開始回復生命值。{*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_BACK*} 即可。 + + 火會蔓延: - - 現在請按下 {*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_BACK*} 即可。 + + 沒有特殊效果 - - - 現在請按下 {*CONTROLLER_VK_B*} 來離開創造模式下的物品欄。 - + + 速度 - - - 這是精製介面,可讓您把收集到的物品組合成各種新物品。 - + + 緩慢 - - {*B*} - 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} - 如果您已經了解精製物品的方式,請按下 {*CONTROLLER_VK_B*}。 + + 編輯牌子上的訊息: - - {*B*} - 按下 {*CONTROLLER_VK_X*} 即可顯示物品說明。 + + 經典 Minecraft 材質、圖示及使用者介面! - - {*B*} - 按下 {*CONTROLLER_VK_X*} 即可顯示要精製出目前物品所需的材料。 + + 顯示所有混搭的遊戲世界 - - {*B*} - 請按下 {*CONTROLLER_VK_X*} 來再次顯示物品欄。 + + 提示 - - - 請使用 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 來切換頂端的群組類型索引標籤,以便選取您想要精製的物品所屬的群組類型,然後使用 {*CONTROLLER_MENU_NAVIGATE*} 來選取您要精製的物品。 - + + 重新安裝個人造型項目 1 - - - 精製區域會顯示精製新物品所需的材料。按下 {*CONTROLLER_VK_A*} 即可精製物品,並將該物品放置在物品欄中。 - + + 重新安裝個人造型項目 2 - - 精製台可讓您精製出種類較多的物品。精製台的運作方法跟基本的精製介面是一樣的,但您會擁有較大的精製空間,讓您能夠使用更多樣化的材料組合。 + + 重新安裝個人造型項目 3 + + + 重新安裝主題 + + + 重新安裝玩家圖示 1 + + + 重新安裝玩家圖示 2 + + + 選項 + + + 使用者介面 + + + 重設為預設值 + + + 影像晃動 + + + 音訊 + + + 控制 + + + 圖形 + + + 可用來釀製藥水,會在 Ghast 死亡時掉落。 + + + 會在殭屍 Pigmen 死亡時掉落。在地獄可找到殭屍 Pigmen。用來做為釀製藥水的材料。 + + + 可用來釀製藥水。生長在地獄要塞中,也可以種植在魂沙上。 + + + 在上面行走時會感覺滑溜。如果冰塊下面有其他方塊,當您摧毀冰塊時,冰塊就會變成水。如果冰塊太靠近光源或放在地獄裡,就會融化。 + + + 可當做裝飾品。 + + + 可用來釀製藥水或尋找地下要塞。由 Blaze 掉落,而 Blaze 多半出沒於地獄要塞的裡面或附近。 + + + 會依據使用對象的不同而有各種不同的效果。 + + + 可用來釀製藥水,或與其他物品一起精製成終界之眼或熔岩球。 + + + 可用來釀製藥水。 + + + 可用來釀製藥水和噴濺藥水。 + + + 可用來裝水,並可在釀製台當成製作藥水一開始時就必須用到的材料。 + + + 這是有毒的食物和釀製物品,會在蜘蛛或穴蜘蛛被玩家殺死時掉落。 + + + 可用來釀製藥水,且絕大部分用來製造具備負面效果的藥水。 + + + 放置後會隨著時間生長。使用大剪刀即可收集。可用來當梯子一樣攀爬。 + + + 和門類似,但主要與柵欄搭配使用。 + + + 精製西瓜片即可獲得。 + + + 可用來取代玻璃方塊的透明方塊。 + + + 當活塞有動力時 (使用按鈕、拉桿、壓板、紅石火把,或是以上任何的紅石物品來啟動活塞),會在情況允許時延伸出去推動方塊。黏性活塞縮回時,會把接觸到活塞延伸部分的方塊一起拉回。 + + + 由石頭方塊製造而成,通常能在地下要塞中找到。 + + + 可當做屏障,類似柵欄。 + + + 栽種即可長成南瓜。 + + + 可當做建築材料和裝飾品。 + + + 行經時會減緩您的速度。可使用大剪刀摧毀,並收集絲線。 + + + 摧毀時會產生 Silverfish。如果附近有隻 Silverfish 遭到攻擊,也可能會產生另一隻 Silverfish。 + + + 栽種即可長成西瓜。 + + + 會在終界人死亡時掉落,投擲後玩家即會在失去些許生命值的同時,被傳送到終界珍珠所在之處。 + + + 上面長草的泥土方塊。可用鏟子來收集,能當做建築材料。 + + + 可以裝滿雨水或以一水桶的水承滿,然後即可用來幫玻璃瓶裝水。 + + + 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + + + 在熔爐中熔煉地獄血石即可獲得。能精製成地獄磚塊方塊。 + + + 有動力時會發出光線。 + + + 類似展示櫃,可將物品或方塊放置在裡面展示。 + + + 投擲出去後可再生出其所顯示類型的生物。 + + + 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 + + + 用來耕種即可收集可可豆。 + + + 乳牛 + + + 被殺死時會掉落皮革。您也可以用桶子來擠牛奶。 + + + 綿羊 + + + 生物頭顱可當做裝飾品擺放,或置於頭盔空格中當做面具戴。 + + + 烏賊 + + + 被殺死時會掉落墨囊。 + + + 很適合用來讓東西著火,或是從發射器發射可任意開火。 + + + + 會浮在水面,且可在上面行走。 + + + 可用來建造地獄要塞,且不受 Ghast 的火球傷害。 + + + 用在地獄要塞。 + + + 投擲後即會顯示前往終界入口的方向。將十二個終界之眼放置於終界入口框架上後,即可啟動終界入口。 + + + 可用來釀製藥水。 + + + 和青草方塊類似,但非常適合在上面栽種蘑菇。 + + + 出現於地獄要塞,會在地獄結節破裂後掉落。 + + + 這是一種只會在終界出現的方塊,防爆性很高,很適合當做建造材料。 + + + 擊敗終界的龍就會產生這個方塊。 + + + 投擲後會掉落經驗光球,收集光球即可增加您的經驗值。 + + + 您可在附加能力台使用您的經驗值,將特殊能力附加到劍、鎬、斧、鏟、弓和護甲上。 + + + 終界入口可由十二個終界之眼啟動,玩家可經由終界入口進入終界。 + + + 可用來組成終界入口。 + + + 當活塞有動力時 (使用按鈕、拉桿、壓板、紅石火把,或是以上任何的紅石物品來啟動活塞),會在情況允許時延伸出去推動方塊。 + + + 將黏土放在熔爐中經過火燒之後即可獲得。 + + + 可在熔爐中燒成磚塊。 + + + 破裂之後會掉落黏土球,可在熔爐中將黏土球燒成磚塊。 + + + 可用斧頭劈砍來收集,能精製成木板,或是當做燃料使用。 + + + 在熔爐中熔煉沙子即可獲得。可當做建築材料,但當您開採玻璃時,玻璃會破碎。 + + + 用十字鎬開採石頭即可獲得,可用來建造熔爐或石製工具。 + + + 壓縮的雪球存放方式。 + + + 可與碗一起精製成燉蘑菇。 + + + 可用鑽石鎬來開採。當靜止的熔岩碰到水時,就會產生黑曜石。黑曜石可用來建造傳送門。 + + + 可產生遊戲世界中的怪物。 + + + 可用鏟子挖掘來製造雪球。 + + + 破裂時偶爾會出現小麥種子。 + + + 可精製成染料。 + + + 可用鏟子來收集,挖掘時偶爾會挖出打火石。當下方沒有其他方塊時,會受重力的影響而往下掉。 + + + 可用十字鎬開採來收集煤塊。 + + + 可用石鎬或材質更堅硬的十字鎬開採來收集青金石。 + + + 可用鐵鎬或材質更堅硬的十字鎬開採來收集鑽石。 + + + 可當做裝飾品。 + + + 可用鐵鎬或材質更堅硬的十字鎬開採,然後在熔爐中熔煉成黃金錠塊。 + + + 可用石鎬或材質更堅硬的十字鎬開採,然後在熔爐中熔煉成鐵錠塊。 + + + 可用鐵鎬或材質更堅硬的十字鎬開採來收集紅石塵。 + + + 這不會破裂。 + + + 會讓接觸到的任何東西著火。可以用桶子來收集。 + + + 可用鏟子來收集,能在熔爐中熔煉成玻璃。當下方沒有其他方塊時,會受重力的影響而往下掉。 + + + 可用十字鎬開採來收集鵝卵石。 + + + 可用鏟子來收集,能當做建築材料。 + + + 可讓您栽種,最後會長成樹木。 + + + 可放置在地上來傳送電流。若搭配藥水一起釀製,將可延長效果持續時間。 + + + 殺死乳牛即可獲得,可用來精製成護甲或用來製作書本。 + + + 殺死史萊姆即可獲得,可當做釀製藥水的材料,或精製成黏性活塞。 + + + 雞會隨機下蛋,而蛋可用來精製成食物。 + + + 挖掘礫石即可獲得,可用來精製成打火鐮。 + + + 對豬使用時,可讓您騎在豬身上,然後利用木棍上的胡蘿蔔操控豬的行進方向。 + + + 挖掘白雪即可獲得,可讓您投擲。 + + + 開採閃石即可獲得,可透過精製變回閃石方塊,或搭配藥水一起釀製來提高效果的威力。 + + + + 破碎時偶爾會掉落樹苗,讓您能重新栽種並長成樹木。 + + + 能夠在地城裡找到,可當做建築材料和裝飾品。 + + + 可用來取得綿羊身上的羊毛,以及獲得樹葉方塊。 + + + 殺死骷髏後即可獲得,可用來精製成骨粉,餵狼吃還可馴服狼。 + + + 設法讓骷髏殺死 Creeper 後即可獲得,可利用點唱機來播放。 + + + 可用來滅火,或協助作物生長。您可用桶子來裝水。 + + + 收成作物即可獲得,可用來精製成食物。 + + + 可精製成砂糖。 + + + 可當做頭盔使用,或是與火把一起精製成南瓜燈籠。同時也是製作南瓜派的主要材料。 + + + 點燃後會永遠燃燒。 + + + 完全成熟後,即可收成來收集小麥。 + + + 已經準備好能栽種種子的地面。 + + + 可用熔爐烹煮來取得綠色染料。 + + + 會讓行經其上的所有東西減速。 + + + 殺死雞即可獲得,可用來精製成箭。 + + + 殺死 Creeper 即可獲得,可用來精製成炸藥,或當做釀製藥水的材料。 + + + 在農田栽種即可長成作物。切記:種子需要足夠的光線才能成長! + + + 站在傳送門中,即可讓您在地上世界與地獄世界之間往返。 + + + 可當做熔爐的燃料,或是精製成火把。 + + + 殺死蜘蛛即可獲得,可用來精製成弓或釣魚竿,或放置在地面上形成絆索。 + + + 被剪羊毛時會掉落羊毛 (前提是牠的羊毛還沒被剪掉)。可將綿羊染色來擁有不同色彩的羊毛。 + + + Business Development + + + Portfolio Director + + + Product Manager + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Marketing + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Design Team + + + Director of Fun + + + Music and Sounds + + + Programming + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Art + + + Producer + + + Test Lead + + + Lead Tester + + + QA + + + Executive Producer + + + Lead Producer + + + Milestone Acceptance Tester + + + 鐵鏟 + + + 鑽石鏟 + + + 黃金鏟 + + + 黃金劍 + + + 木鏟 + + + 石鏟 + + + 木鎬 + + + 黃金鎬 + + + 木斧 + + + 石斧 + + + 石鎬 + + + 鐵鎬 + + + 鑽石鎬 + + + 鑽石劍 + + + SDET + + + Project STE + + + Additional STE + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + Test Associates + + + 木劍 + + + 石劍 + + + 鐵劍 + + + Jon Kagstrom + + + Tobias Mollstam + + + Rise Lugo + + + Developer + + + 會對您發射火球,而且火球碰到東西時會爆炸。 + + + 史萊姆 + + + 受到傷害時會分裂成數個小史萊姆。 + + + 殭屍 Pigman + + + Pigman 殭屍是溫馴的怪物,但如果您攻擊任何一個 Pigman 殭屍,整群 Pigman 殭屍就會開始攻擊您。 + + + Ghast + + + 終界人 + + + 穴蜘蛛 + + + 擁有毒牙。 + + + Mooshroom + + + 如果您直視終界人,他就會攻擊您。另外還會到處移動方塊。 + + + Silverfish + + + 當 Silverfish 受到攻擊時,會引來躲在附近的 Silverfish。牠們會躲在石頭方塊中。 + + + 如果您靠近殭屍,殭屍就會攻擊您。 + + + 被殺死時會掉落豬肉。您還可以使用鞍座來騎在豬上。 + + + + + + 狼是溫馴的動物,但當您攻擊牠時,牠就會攻擊您。您可以使用骨頭來馴服狼,這會讓牠跟著您走,並攻擊任何正在攻擊您的東西。 + + + + + + 被殺死時會掉落羽毛,還會隨機下蛋。 + + + + + + Creeper + + + 蜘蛛 + + + 如果您靠近蜘蛛,牠就會攻擊您。蜘蛛會爬牆,被殺死時會掉落絲線。 + + + 殭屍 + + + 如果您靠太近就會爆炸! + + + 骷髏 + + + 會對您射箭,被殺死時會掉落箭。 + + + 與碗一起使用可用來燉蘑菇,剪毛後會掉落蘑菇,而且會變成普通的乳牛。 + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Concept Artist + + + Number Crunching and Statistics + + + Bully Coordinator + + + Lead Game Programmer Minecraft PC + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Explosives Animator + + + 這是出現在終界的巨大黑龍。 + + + Blaze + + + Blaze 是地獄裡的敵人,絕大部分皆分布在地獄要塞中。當 Blaze 被殺死時會掉落 Blaze 棒。 + + + 雪人 + + + 玩家可用白雪方塊和南瓜製造雪人。雪人會對製作者的敵人投擲雪球。 + + + 終界龍 + + + 熔岩怪 + + + 分佈在熱帶叢林中。餵生魚就能馴服牠們,但前提是必須先讓豹貓靠近您,畢竟任何一個突然的動作都會嚇跑牠們。 + + + 鐵傀儡 + + + 會自然出現來保護村落,可以用鐵方塊跟南瓜製作。 + + + 熔岩怪出現於地獄,被殺死時會分裂成很多小熔岩怪,這點跟史萊姆很像。 + + + 村民 + + + 豹貓 + + + 放置在附加能力台附近時可以創造更具威力的附加能力。 + + + {*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*} +把 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*} +當您的經驗等級不足時,所需的經驗等級會以紅色呈現,足夠時則以綠色呈現。{*B*}{*B*} +實際附加的能力是根據所顯示經驗等級多寡所隨機挑選出來的。{*B*}{*B*} +當附加能力台的周圍被書架圍住 (最多可有 15 個書架),且書架和附加能力台之間有一個方塊的空間時,附加能力的效果會增強,同時附加能力台的書上會顯示神祕的圖案。{*B*}{*B*} +附加能力台所需使用的材料都可在該世界的村落中找到,或經由開採或栽種來得到。{*B*}{*B*} +已附加能力的書本可在鐵砧上使用,讓物品獲得書本的附加能力。這麼一來,您可以更自由地選擇要讓物品獲得哪一種附加能力。{*B*} + + + {*T3*}遊戲方式:禁用關卡{*ETW*}{*B*}{*B*} +如果您在進行某個關卡時看到有冒犯意味的內容,可以選擇把這個關卡加入您的禁用關卡清單。 +若要這麼做,請先叫出暫停選單,然後按下 {*CONTROLLER_VK_RB*} 來選取 [禁用關卡] 工具提示。 +之後當您要加入這個關卡時,系統會提示您該關卡已在您的禁用關卡清單中,然後讓您選擇是否要將該關卡從清單中移除並進入關卡,或是要退出。 + + + + {*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*}炸藥會爆炸{*ETW*}{*B*} + 啟用此選項時,炸藥會在點燃後爆炸。你也可以從遊戲中變更此選項。{*B*}{*B*} + + {*T2*}主持人特權{*ETW*}{*B*} + 啟用此選項時,主持人可以從遊戲選單切換自己的飛翔能力、不會疲勞,或是讓自己隱形。{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}日夜週期{*ETW*}{*B*} + 停用此選項時,時間將不會變化。{*B*}{*B*} + + {*T2*}保留物品欄{*ETW*}{*B*} + 啟用此選項時,玩家在死亡後會保留物品欄中的物品。{*B*}{*B*} + + {*T2*}生物生成{*ETW*}{*B*} + 停用此選項時,生物不會自然生成。{*B*}{*B*} + + {*T2*}生物破壞{*ETW*}{*B*} + 停用此選項時,怪物和動物無法更改方塊 (例如,Creeper 的爆炸無法摧毀方塊,羊也不會吃掉草) 或拾取物品。{*B*}{*B*} + + {*T2*}怪物掉寶{*ETW*}{*B*} + 停用此選項時,怪物和動物不會掉落物品 (例如,Creeper 不會掉落火藥)。{*B*}{*B*} + + {*T2*}方塊掉落{*ETW*}{*B*} + 停用此選項時,方塊被破壞後不會掉落物品 (例如,石頭方塊不會掉落鵝卵石)。{*B*}{*B*} + + {*T2*}自然回復{*ETW*}{*B*} + 停用此選項時,玩家不會自然回復生命。{*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*} + 玩家主持人或設定為管理員的玩家可以存取 [主持人選項] 選單。他們可以在選單中啟用或停用 [火會蔓延] 及 [炸藥會爆炸] 選項。{*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*} + {*KICK_PLAYER_DESCRIPTION*}{*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*} +當您想要將動物聚集在同一個地方豢養時,可以建造一個大小小於 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*} +當您精製出箱子時,就能將箱子放置在遊戲世界中,然後用 {*CONTROLLER_ACTION_USE*} 來使用箱子,以便存放您物品欄中的物品。{*B*}{*B*} +您可以使用游標在物品欄與箱子之間移動物品。{*B*}{*B*} +箱子會保存您的物品,等您之後有需要時再將物品移動到物品欄中。 + + + 您有去 Minecon 嗎? + + + 在 Mojang 裡,沒人看過 Junkboy 的臉。 + + + 您知道 Minecraft Wiki 嗎? + + + 別一直注意遊戲中的程式錯誤。 + + + Creeper 就是從程式碼的錯誤中誕生的。 + + + 這是雞?還是鴨子? + + + Mojang 的新辦公室很酷喔! + + + {*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*} 即可。 + + + 2013 年的 Minecon 是在美國佛羅里達州的奧蘭多舉辦! - - 精製介面的右下區域會顯示您的物品欄。這裡也會顯示目前所選取物品的說明,以及精製該物品所需的材料。 + + .party() 棒極了! - - 精製介面現在會顯示目前所選取物品的說明,告訴您該物品的用途。 + + 要永遠假設謠言是錯誤的,不要當真! - - 精製介面現在會列出精製所選取物品的所需材料。 + + 上一頁 - - 您之前收集的木頭可用來精製成木板。請選取木板圖示,然後按下 {*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*} 來離開精製介面。 + + {*T3*}遊戲方式:終界{*ETW*}{*B*}{*B*} +終界是遊戲中的另一個世界,只要進入已啟動的終界入口就能到達。終界入口位於地上世界地底深處的地下要塞。{*B*} +把終界之眼放入沒有終界之眼的終界入口框架中就能啟動終界入口。{*B*} +跳進已啟動的入口即可前往終界。{*B*}{*B*} +您將在終界中對抗許多的終界人以及凶狠強大的終界龍,所以請在進入終界之前做好戰鬥的準備!{*B*}{*B*} +您會發現 8 根黑曜石柱,其頂端都有終界水晶,終界龍會用水晶來治療自己, +因此戰鬥的第一步就是要摧毀這些水晶。{*B*} +只要用箭就能摧毀前面幾顆水晶,不過後面幾顆水晶受到鐵柵欄籠子的保護,需要建造方塊抵達石柱頂端才有辦法摧毀。{*B*}{*B*} +終界龍會在您建造的時候飛過來進行攻擊並朝著您吐終界酸液球!{*B*} +只要一接近被石柱包圍的龍蛋台,終界龍就會飛下來攻擊您,這會是對終界龍使出強力攻擊的好機會!{*B*} +在閃避酸液氣攻擊的同時攻擊終界龍的眼睛會有最佳的攻擊效果。如果可以的話,帶好友一起進入終界幫助您作戰!{*B*}{*B*} +您進入終界之後,您的好友會在他們的地圖上看到位於地下要塞中的終界入口, +這樣他們就能輕鬆地加入行列。 - - 某些物品無法用精製台來製造,必須靠熔爐來產生。現在請製造 1 座熔爐。{*FurnaceIcon*} + + {*ETB*}歡迎回來!或許你還沒有注意到,你的 Minecraft 遊戲已經更新了。{*B*}{*B*} +我們為你和你的好友新增了許多功能,在此將重點敘述幾項變動。瀏覽過後就進入遊戲親自探索吧!{*B*}{*B*} +{*T1*}新物品{*ETB*} - 硬化粘土、染色粘土、煤炭磚、乾草捆、觸發鐵軌、紅石磚、陽光感測器、投擲器、漏斗、漏斗礦城、TNT 礦車、紅石比較器、感重壓力板、烽火台、陷阱儲物箱、煙火、火藥球、地獄之星、栓繩、馬鎧、命名牌、馬角色蛋{*B*}{*B*} +{*T1*}新生物{*ETB*} - 凋零怪、凋零骷髏、女巫、蝙蝠、馬、驢和騾{*B*}{*B*} +{*T1*}新功能{*ETB*} - 馴服和騎乘馬匹、精製煙火和燃放、用命名牌對動物和怪物命名、建造更為進階的紅石電路以及協助你對來你世界中的客人們的行為進行控制的新 [主持人選項]!{*B*}{*B*} +{*T1*}新的教程世界{*ETB*} – 在教程世界中學習如何使用新舊功能。看看你能不能把藏在世界各處的秘密唱片通通找出來!{*B*}{*B*} + - - 請將您精製出的熔爐放置在遊戲世界中,最好是放置在您的棲身處裡面。{*B*} - 現在請按下 {*CONTROLLER_VK_B*} 來離開精製介面。 + + 能造成比用手劈砍更大的傷害。 - - 這是熔爐介面。熔爐可讓您透過火燒來改變物品。舉例來說,您可以使用熔爐把鐵礦石轉變成鐵錠塊。 + + 用來挖泥土、青草、沙子、礫石及白雪時的速度,會比用手挖還要快。您需要用鏟子才能挖雪球。 - - {*B*} - 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} - 如果您已經了解如何使用熔爐,請按下 {*CONTROLLER_VK_B*}。 + + 奔跑 - - 您必須把一些燃料放在熔爐底部的空格中,熔爐頂端空格裡的物品才會受熱,然後熔爐就會起火,開始火燒上面的物品,並把成品放在右邊的空格中。 + + 最新資訊 - - 許多木質物品可以用來當做燃料,但並非每樣東西的燃燒時間都是相同的。還有其他物品也能拿來當做燃料,您可以多多嘗試。 + + {*T3*}變更與新增內容{*ETW*}{*B*}{*B*} +- 新增物品 - 硬化粘土、染色粘土、煤炭磚、乾草捆、觸發鐵軌、紅石磚、陽光感測器、投擲器、漏斗、漏斗礦車、TNT 礦車、紅石比較器、感重壓力板、烽火台、陷阱儲物箱、煙火、火藥球、地獄之星、栓繩、馬鎧、命名牌、馬角色蛋{*B*} +- 新增生物 - 凋零怪、凋零骷髏、女巫、蝙蝠、馬、驢和騾{*B*} +- 新增地形產生功能 - 女巫小屋。{*B*} +- 新增烽火台界面。{*B*} +- 新增馬匹界面。{*B*} +- 新增漏斗界面。{*B*} +- 新增煙火 - 當你擁有精製火藥球或煙火的原料時,你可以透過 [工作台] 使用煙火界面。{*B*} +- 新增「冒險模式」- 你只能使用正確的工具來破壞方塊。{*B*} +- 新增數種新的聲音。{*B*} +- 怪物、物品和投射物現在可以穿過傳送門。{*B*} +- 中繼器現在可以透過在側面用另一中繼器提供訊號的方式鎖定。{*B*} +- 僵尸和骷髏在生成時會帶有不同種類武器和鎧甲。{*B*} +- 新增數條死亡訊息。{*B*} +- 可用命名牌為動物命名,可在容器選單開啟時更改容器的標題。{*B*} +- 骨粉不再會讓植物長到完全體,現在它會讓植物隨機按階段生長。{*B*} +- 敘述儲物箱、釀造台、發射器和唱片機內容的紅石訊號現在可透過直接緊鄰放置的紅石比較器偵測。{*B*} +- 發射器可以面向任意方向。{*B*} +- 食用金蘋果可在短時間內給予玩家額外的生命值「吸收」效果。{*B*} +- 在區域中逗留的時間越長,在這個區域中生成的怪物會越強。{*B*} - - 當物品火燒完畢後,您就能把物品從成品區移動到物品欄中。您可以嘗試火燒不同的物品,看看會得到什麼成品。 + + 分享螢幕擷取畫面 - - 如果您把木頭當做材料,就會製造出木炭。請在熔爐裡放些燃料,然後把木頭放在材料格裡。熔爐需要花些時間才能製造木炭,您可以趁這段時間去做其他的事,稍後再回來查看進度。 + + 箱子 - - 木炭可當做燃料使用,還能與木棍一起精製成火把。 + + 精製 - - 把沙子放在材料格裡,就能製造出玻璃。請製造一些玻璃方塊來當做棲身處的窗戶。 + + 熔爐 - - 這是釀製介面,您可以在此製作具備各種不同效果的藥水。 + + 基本介紹 - - {*B*} - 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} - 如果您已經了解如何使用釀製台,請按下 {*CONTROLLER_VK_B*}。 + + 平行顯示器 - - 請將材料放在上方空格,再將藥水或水瓶置於下方空格,即可釀製藥水,一次最多只能釀製 3 瓶藥水。當您完成適當的組合後,便會展開釀製過程,不久即可製造出藥水。 + + 物品欄 - - 釀製藥水必須先準備水瓶。大部分的藥水都是先用地獄結節做出粗劣藥水,再至少加入另一種材料,便能釀製出最後的成品。 + + 分發器 - - 您可以調整藥水的效果:加入紅石塵可增加效果的持久度,加入閃石塵則可讓效果更具威力。 + + 附加能力 - - 加入發酵蜘蛛眼會破壞藥水,讓藥水出現反效果;加入火藥則可將藥水變成噴濺藥水,投擲噴濺藥水即可使藥水效力影響附近區域。 + + 地獄傳送門 - - 先將地獄結節加入水瓶,再加入熔岩球,即可製造防火藥水。 + + 多人遊戲 - - 現在請按下 {*CONTROLLER_VK_B*} 來離開釀製介面。 + + 豢養動物 - - 您在這個地區可以找到釀製藥水所需的釀製台、水槽和裝滿物品的箱子。 + + 繁殖動物 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解釀製和藥水的相關知識。{*B*} - 如果您已經了解釀製和藥水的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + 釀製 - - 釀製藥水的第一步就是製造水瓶。請從箱子中拿出玻璃瓶。 + + deadmau5 喜歡玩 Minecraft! - - 您可以從裝了水的水槽或水方塊中取水裝入玻璃瓶。請將游標指向水源,再按下 {*CONTROLLER_ACTION_USE*},即可將水裝入玻璃瓶中。 + + 殭屍 Pigmen 不會攻擊您,除非您先展開攻擊。 - - 如果水槽空了,您可以用水桶幫水槽加水。 + + 只要在床舖上睡覺,就能變更遊戲再生點,並讓遊戲時間快轉到日出。 - - 在釀製台上使用水瓶、地獄結節和熔岩球,即可製造防火藥水。 + + 把 Ghast 發射的火球打回去! - - - 手中持有藥水時,只要按住 {*CONTROLLER_ACTION_USE*} 即可使用藥水。若是一般藥水,您只要喝下藥水,即可在自己身上發揮藥水的效果。噴濺藥水則必須投擲出去,讓藥水的效果發揮在位於擊中處附近的生物上。 - 在一般藥水內加入火藥,即可製造噴濺藥水。 - + + 別忘了製造一些火把,以便在夜晚時照亮四周的區域。怪物會避開火把附近的區域。 - - 將防火藥水用在自己身上。 + + 您可以利用礦車與軌道來快速抵達目的地! - - 既然您現在的身體已可抵抗火和熔岩,不妨前往之前因火或熔岩的阻礙而無法到達的區域。 + + 只要栽種樹苗,樹苗就會長成樹木。 - - 這是附加能力介面,可讓您將特殊能力附加到武器、護甲及特定的工具上。 + + 建造傳送門就能讓您前往另一個次元的空間:地獄。 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解附加能力介面的相關知識。{*B*} - 如果您已經了解附加能力介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + 我們不建議您直直往下挖,或是直直往上挖。 - - 請先將物品放到附加能力空格中,才能對物品附加能力。武器、護甲和特定工具在附加能力後即可擁有特殊效果,比如更能抵抗傷害,或開採方塊時可收集到更多物品等。 + + 從骷髏的骨頭精製出來的骨粉可以當做肥料,讓植物立刻長大喔! - - 當您將物品放到附加能力空格後,畫面右邊的按鈕會顯示多種隨機挑選的附加能力。 + + Creeper 一旦靠近您就會自爆! - - 按鈕上的號碼代表附加該特殊能力到物品上所需的經驗等級。如果您的經驗等級不夠高,您就無法使用該按鈕。 + + 按下 {*CONTROLLER_VK_B*} 即可丟棄您手上握著的物品! - - 請選取您想要的附加能力,然後按一下 {*CONTROLLER_VK_A*},即可將能力附加到物品上。附加能力會消耗您的經驗等級。 + + 別忘了要使用正確的工具來做事! - - 雖然可供您使用的附加能力皆為隨機出現,但某些效果較好的附加能力,只會在您經驗等級較高,且附加能力台的周圍被許多書架圍住來強化其威力時,才會出現。 + + 如果您找不到煤塊來製造火把,可以用熔爐裡的火燒木頭來製造木炭。 - - 您在這個地區可以找到附加能力台,以及一些能幫助您了解如何附加能力的其他物品。 + + 吃下熟豬肉所回復的生命值,會比吃下生豬肉所回復的多。 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解附加能力的相關知識。{*B*} - 如果您已經了解附加能力的相關知識,請按下 {*CONTROLLER_VK_B*}。 - + + 如果您將遊戲困難度設定為 [和平],您的生命值就會自動回復,而且夜晚不會出現怪物! - - 您可使用附加能力台把特殊效果附加到武器、護甲和特定工具上,比如開採方塊時可收集到更多物品,或是更能抵抗傷害等。 + + 用骨頭餵狼來馴服牠,就能讓牠坐下或是跟著您走。 - - 把附加能力台的周圍用書架圍住,即可強化附加能力台的威力,您也因此可使用更高等級的附加能力。 + + 當您開啟物品欄選單時,只要把游標移動到選單外面,再按下 {*CONTROLLER_VK_A*} 即可丟棄物品。 - - 對物品附加能力會消耗您的經驗等級。收集怪物和動物被殺死時掉落的光球、開採礦石、繁殖動物、釣魚和使用熔爐熔煉/烹煮物品,都可讓您累積經驗值。 + + 新的下載內容現已推出!請選取主畫面的 [Minecraft 商店] 按鈕來取得下載內容。 - - 您也可使用經驗藥水瓶增加經驗等級。只要投擲經驗藥水瓶,掉落處就會產生可以收集的經驗值光球。 + + 您可以用 Minecraft 商店裡的角色外觀套件來變更角色的外觀。請在主畫面選取 [Minecraft 商店],去看看有哪些好東西吧! - - 您在這個地區的箱子中可以找到一些已附加能力的物品、經驗藥水瓶,以及待您使用附加能力台來嘗試附加能力的物品。 + + 調整色差補正設定就能讓遊戲畫面變亮或變暗。 - - 您現在坐在礦車中。如要離開礦車,請把游標指向礦車,然後按下 {*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*} + + 只要動物無法朝任一方向移動超過 20 個方塊的距離,牠就不會消失。 - - 釣魚竿就跟許多其他工具一樣,有使用次數的限制,但用途可不限於釣魚喔!您可以多多實驗,看看釣魚竿還能釣上或啟動什麼東西... - {*FishingRodIcon*} + + 馴服後的狼會用尾巴的高低位置來表示目前的生命值狀態。只要餵狼吃肉就能治療牠們。 - - 這是床舖。當夜晚來臨時,把游標指向床舖並按下 {*CONTROLLER_ACTION_USE*} 即可睡覺,並在早晨醒來。{*ICON*}355{*/ICON*} + + 在熔爐烹煮仙人掌,即可獲得綠色染料。 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解床舖的相關知識。{*B*} - 如果您已經了解床舖的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + 閱讀 [遊戲方式] 選單中的 [最新資訊] 部分,即可獲得 Minecraft 的最新更新資訊。 - - 床舖應該要放置在安全、具有足夠光線的地方,以免怪物在半夜吵醒您。當您使用過床舖後,您下次死亡時就會在那張床舖再生。 - {*ICON*}355{*/ICON*} + + 遊戲中的音樂是由 C418 所製作! - - 如果您的遊戲中有其他玩家,每位玩家都必須同時躺在床上才能睡覺。 - {*ICON*}355{*/ICON*} + + Notch 是誰? - - 這個地區有些簡單的紅石和活塞電路,還有個箱子,裡面裝了其他可用來擴大電路系統的物品。 + + Mojang 獲得的獎項比員工的數目還多! - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解紅石電路和活塞的相關知識。{*B*} - 如果您已經了解紅石電路和活塞的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + 有些名人很喜歡玩 Minecraft 喔! - - 拉桿、按鈕、壓板和紅石火把都可為電路提供動力。您可直接把這些東西連接到您想要啟動的物品上,或是利用紅石塵將它們連接起來。 + + Notch 在 Twitter 上已經有超過 100 萬名的跟隨者了! - - 動力來源的放置位置和方向,會改變它對周遭方塊的影響方式。舉例來說,如果您把紅石火把連接到方塊側邊,當這個方塊從其他來源獲得動力時,紅石火把就會熄滅。 + + 並非所有瑞典人都有金髮,有些瑞典人 (像是 Mojang 裡的 Jens) 就擁有紅髮! - - - 只要用鐵、鑽石或是黃金材質的十字鎬開採紅石礦石,就能獲得紅石塵。紅石塵可用來傳送動力,最多可達 15 個方塊的距離,還可像斜坡般往上或往下移動 1 個方塊的高度。 - {*ICON*}331{*/ICON*} - + + 我們一定會為這個遊戲推出更新內容! - - - 紅石中繼器可用來延長動力的傳送距離,或是延遲電路。 - {*ICON*}356{*/ICON*} - + + 把 2 個箱子並排放置,就能製造出 1 個大箱子。 - - - 活塞獲得動力時會延伸出去,並推動最多 12 個方塊。當黏性活塞縮回時,會拉回 1 個方塊,而且幾乎所有材質的方塊都可拉回。 - {*ICON*}33{*/ICON*} - + + 在野外以羊毛作為建築材料來蓋東西時,千萬要小心,因為雷雨的閃電會讓羊毛著火。 - - 這個地區的箱子中有些零件,可用來組成有活塞的電路。請使用或完成這個區域裡的電路,或是組成您自己的電路。在教學課程地區外,還有更多的範例可讓您參考。 + + 使用熔爐時,1 桶熔岩可讓您熔煉 100 個方塊。 - - 這個地區有個通往地獄的傳送門! + + 音符方塊所演奏的樂器種類,是根據底下方塊的材質而定。 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解傳送門和地獄的相關知識。 {*B*} - 如果您已經了解傳送門和地獄的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + 當您移除熔岩源方塊後,熔岩需要好幾分鐘的時間才能完全消失。 - - 只要利用黑曜石方塊組合成有 4 個方塊寬、5 個方塊高的框架,就能製造傳送門。框架的 4 個邊角不需要放置方塊。 + + Ghast 的火球無法破壞鵝卵石,因此鵝卵石很適合用來保護傳送門。 - - - 如要啟動地獄傳送門,只要用打火鐮點燃框架內側的黑曜石方塊即可。當傳送門的框架損壞、附近發生爆炸,或是有液體流過傳送門時,傳送門就會失效。 - + + 可作為光源使用的方塊能夠融化白雪和冰塊,這些方塊包括火把、閃石及南瓜燈籠。 - - 如要使用地獄傳送門,請站在傳送門裡面。此時您會看到畫面變成紫色,還會聽到某種聲音。幾秒鐘後,您就會被傳送到地獄。 + + 白天的時候,殭屍和骷髏必須待在水裡才能活下去。 - - 地獄是個危險的地方,到處都是熔岩,但也是收集地獄血石和閃石的好地方。地獄血石只要一點燃就會永遠燃燒,而閃石則可作為光源。 + + 雞每 5 到 10 分鐘就會下一顆蛋。 - - 您可以利用地獄世界在地上世界中快速移動,因為在地獄世界移動 1 個方塊的距離,就等於在地上世界移動 3 個方塊的距離。 + + 黑曜石只能用鑽石鎬來開採。 - - 您正以創造模式進行遊戲。 + + 最容易取得火藥的來源就是 Creeper。 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解創造模式的相關知識。{*B*} - 如果您已經了解創造模式的相關知識,請按下 {*CONTROLLER_VK_B*}。 + + 如果您攻擊某隻狼,四周所有的狼就會對您產生敵意並開始攻擊您。而殭屍 Pigmen 也有這種特性。 - - 在創造模式中,您擁有無限多的物品和方塊,且不需使用任何特殊工具,只要按一下即可摧毀方塊。您是無敵的,並且可以飛翔。 + + 狼無法進入地獄。 - - 按下 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟創造模式物品欄介面。 + + 狼不會攻擊 Creeper。 - - 您必須設法移到這個洞的另一邊,才能繼續進行遊戲。 + + 您需要用十字鎬才能開採石頭相關方塊和礦石。 - - 您已完成創造模式的教學課程。 + + 可用來製作蛋糕,以及做為釀製藥水的材料。 - - 這個地區已經準備好一塊農田。耕種能夠讓您建立一個可以重複提供食物與其他物品的再生來源。 + + 開啟時會送出電流。當拉桿開啟或關閉後,就會保持在這個狀態,直到下次開啟或關閉為止。 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解耕種的相關知識。{*B*} - 如果您已經了解耕種的相關知識,請按下 {*CONTROLLER_VK_B*} 。 + + 會持續送出電流,也可以在連接到方塊側邊時作為接收器或傳送器。 +紅石火把還可以當做亮度較低的光源。 - - 小麥、南瓜和西瓜皆必須從種子開始栽種。小麥種子可以藉由破壞茂密青草或收成小麥來獲得。相對地,收成南瓜和西瓜,同樣也能收集到南瓜和西瓜種子。 + + 可回復 2 個 {*ICON_SHANK_01*},還能精製成金蘋果。 - - 在栽種種子前,需要先使用鋤頭將泥土方塊變成農田。在附近放置水源和光源,不但能使農田保持水分,還能讓作物生長得較快。 + + 可回復 2 個 {*ICON_SHANK_01*},並自動回復生命值 4 秒鐘。由蘋果和碎金塊製作而成。 - - 小麥的生長過程包含數個階段,當顏色轉深後,就表示可以收成了。{*ICON*}59:7{*/ICON*} + + 可回復 2 個 {*ICON_SHANK_01*}。吃下這個會讓您中毒。 - - 南瓜和西瓜還需要在播種的方塊旁邊空出一格的空間,讓完全長成的莖葉能夠長出果實。 + + 可在紅石電路中當做中繼器、延遲器,及/或真空管。 - - 甘蔗必須栽種在青草、泥土,或沙子方塊上,並且需要和水體方塊相鄰。劈砍甘蔗方塊將會連帶使上方所有方塊一起掉落。{*ICON*}83{*/ICON*} + + 可用來引導礦車的行進路線。 - - 仙人掌必須栽種在沙子上,最高可以長到三個方塊的高度。和甘蔗一樣,破壞最底層的方塊,就能夠連帶一起收集上方所有的方塊。{*ICON*}81{*/ICON*} + + 有動力時,會讓行經的礦車加速。沒有動力時,會讓碰到的礦車停在上面。 - - 蘑菇必須栽種在光線昏暗的區域,並且會蔓延至附近光線昏暗的其他方塊上。{*ICON*}39{*/ICON*} + + 功能跟壓板一樣 (會在啟動時送出紅石信號),但只能靠礦車來啟動。 - - 骨粉可以用來讓作物立刻達到完全成熟的階段,或是讓蘑菇長成巨型蘑菇。{*ICON*}351:15{*/ICON*} + + 按下後即會啟動並送出電流,持續時間大約 1 秒鐘,然後就會再次關閉。 - - 您已完成耕種的教學課程。 + + 可用來裝填物品,並在收到紅石送出的電流時隨機射出其中的物品。 - - 這個地區已經豢養數隻動物。您可以開始讓動物繁殖,培育小動物。 + + 啟動後會播放 1 個音符的聲音,受到敲擊後就會變更音符的音調。把音符方塊放在不同的方塊上面,就會改變樂器的種類。 - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解動物與繁殖的相關知識。{*B*} - 如果您已經了解動物與繁殖的相關知識,請按下 {*CONTROLLER_VK_B*}。 - + + 可回復 2.5 個 {*ICON_SHANK_01*}。在熔爐烹煮生魚即可獲得。 - - 您必須餵動物吃特定的食物,讓動物進入「戀愛模式」,動物才能繁殖。 + + 可回復 1 個 {*ICON_SHANK_01*}。 - - 餵乳牛、Mooshroom 或綿羊吃小麥,餵豬吃胡蘿蔔,餵雞吃小麥種子或地獄結節,餵狼吃肉,然後這些動物就會開始尋找周遭也處於戀愛模式中的同種類動物。 + + 可回復 1 個 {*ICON_SHANK_01*}。 - - 當同在戀愛模式中的兩隻同種類動物相遇,牠們會先親吻數秒,然後就會出現剛出生的小動物。小動物一開始會跟在父母身旁,之後就會長成一般成年動物的大小。 + + 可回復 3 個 {*ICON_SHANK_01*}。 - - 剛結束戀愛模式的動物必須等待大約五分鐘後,才能再次進入戀愛模式。 + + 可與弓組成武器。 - - 當您手中握著動物的食物時,有些動物會跟著您,這可以協助您將一群動物聚集起來繁殖。{*ICON*}296{*/ICON*} + + 可回復 2.5 個 {*ICON_SHANK_01*}。 - - - 您可以給野狼提供骨頭來馴服牠們。馴服成功後,狼的周圍會出現一些愛心。經過馴服的狼若沒有收到坐下的指示,會一直跟在玩家身邊並保護玩家。 - + + 可回復 1 個 {*ICON_SHANK_01*}。總共能使用 6 次。 - - 您已完成動物與繁殖的教學課程。 + + 可回復 1 個 {*ICON_SHANK_01*},或可用熔爐烹煮。吃下這個會讓您中毒。 - - 這個地區有一些南瓜和方塊可以用來製作雪人和鐵傀儡。 + + 可回復 1.5 個 {*ICON_SHANK_01*},或可用熔爐烹煮。 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解雪人和鐵傀儡的相關知識。{*B*} - 如果您已經了解雪人和鐵傀儡的相關知識,請按下{*CONTROLLER_VK_B*}。 + + 可回復 4 個 {*ICON_SHANK_01*}。在熔爐烹煮生豬肉即可獲得。 - - 放 1 個南瓜在方塊堆頂端就可以製作出傀儡。 + + 可回復 1 個 {*ICON_SHANK_01*},或可用熔爐烹煮。可以餵豹貓來馴服牠們。 - - 製作雪人需要將 2 個白雪方塊疊在一起,最頂端放 1 個南瓜。雪人會向您的敵人丟雪球。 + + 可回復 3 個 {*ICON_SHANK_01*}。在熔爐烹煮生雞肉即可獲得。 - - 製作鐵傀儡需要 4 個帶有指定圖案的鐵方塊,在中間的方塊上方放 1 個南瓜。鐵傀儡會攻擊您的敵人。 + + 可回復 1.5 個 {*ICON_SHANK_01*},或可用熔爐烹煮。 - - 鐵傀儡還會自然出現來保護村落,如果您攻擊村民,就會遭到鐵傀儡的攻擊。 + + 可回復 4 個 {*ICON_SHANK_01*}。在熔爐烹煮生牛肉即可獲得。 - - 您必須完成教學課程,才能離開這個地區。 + + 可用來沿著軌道把您、動物或怪物載到其他地方。 - - 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用鏟子來開採材質較軟的方塊,例如泥土和沙子。 + + 可當做染料來製造淺藍色羊毛。 - - 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用斧頭來劈砍樹幹。 + + 可當做染料來製造水藍色羊毛。 - - 不同材質的方塊,就應該要用適合的工具進行開採。建議您使用十字鎬來開採石頭及礦石,但您可能需要用更好的材料來製造十字鎬,才能開採某些較硬的方塊。 + + 可當做染料來製造紫色羊毛。 - - 某些工具比較適合用來攻擊敵人。請考慮使用劍來攻擊。 + + 可當做染料來製造亮綠色羊毛。 - - 提示:按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手或是手中握住的東西來開採及劈砍資源。但您可能需要精製出工具來開採某些方塊… + + 可當做染料來製造灰色羊毛。 - - 您正在使用的工具受損了。工具每次使用時都會受損,到最後就會完全損壞。在物品欄中,物品下方的色彩列即為目前的損害狀態。 + + 可當做染料來製造淺灰色羊毛。 +(注意:您也可以把灰色染料與骨粉組合成淺灰色染料,讓您可以用 1 個墨囊製造出 4 個淺灰色染料,而不是 3 個。) - - 按住 {*CONTROLLER_ACTION_JUMP*} 即可往上游。 + + 可當做染料來製造紫紅色羊毛。 - - 這個地區的軌道上有台礦車。如要坐上礦車,請把游標指向礦車,然後按下 {*CONTROLLER_ACTION_USE*} 即可。對按鈕使用 {*CONTROLLER_ACTION_USE*} 即可讓礦車移動。 + + 可用來產生比火把更亮的光源。能夠融化白雪和冰塊,還能在水面下使用。 - - 河邊的箱子中有艘小船。如要放置小船,請把游標指向水面,然後按下 {*CONTROLLER_ACTION_USE*} 即可。當您把游標指向小船時,使用 {*CONTROLLER_ACTION_USE*} 即可上船。 + + 可用來製造書本和地圖。 - - 池塘邊的箱子中有根釣魚竿。請把釣魚竿拿出箱子,然後選取它作為您手中握住的物品來使用。 + + 可用來製造書架,或經過附加能力來製成「已附加能力的書本」。 - - 這個更進階的活塞機械系統可產生會自行修復的橋樑喔!請按下按鈕啟動,然後觀察各個零件的互動方式,了解更多資訊。 + + 可當做染料來製造藍色羊毛。 - - 當您拿著物品時,將游標移動到介面外,即可丟棄該物品。 + + 可用來播放唱片。 - - 您沒有製造該物品所需的所有材料。左下角的方塊會顯示要精製該物品所需的材料。 + + 可用來製造非常強韌且堅硬的工具、武器或護甲。 - - 恭喜,您已經完成教學課程。遊戲中的時間流逝速度已經恢復正常,夜晚很快就會來臨,怪物隨後就會出現!請快點蓋好您的棲身處! + + 可當做染料來製造橘色羊毛。 - - {*EXIT_PICTURE*} 當您準備好進一步探索世界時,這個地區的礦工棲身處附近有個階梯,會通往某個小城堡。 - + + 可從綿羊身上收集,還能用染料染色。 - - 提醒事項: + + 可當做建築材料,還能用染料染色。但我們不建議您使用這個製作方法,因為您可以輕易地從綿羊身上取得羊毛。 - - <![CDATA[&lt;div align="center"&gt;&lt;img src="Graphics\TutorialExitScreenshot.png"/&gt;&lt;/div&gt;]]> + + 可當做染料來製造黑色羊毛。 - - 我們已經在最新版遊戲中加入新功能,包括教學課程世界裡的幾個全新地區。 + + 可用來沿著軌道運送物品。 - - {*B*}按下 {*CONTROLLER_VK_A*} 即可以一般的遊戲方式來進行教學課程。{*B*} - 按下 {*CONTROLLER_VK_B*} 即可略過主要的教學課程。 + + 當裡面有煤塊時,可自動在軌道上移動,或是推動其他礦車。 - - 在這個地區裡,有幾個可協助您了解釣魚、小船、活塞和紅石等相關知識的區域。 + + 可讓您在水面上移動,而且速度會比游泳快。 - - 在這個地區外,您會發現有關建築物、耕種、礦車和軌道、附加能力、釀製、交易、鍛造等知識的範例! + + 可當做染料來製造綠色羊毛。 - - 您的食物列已消耗到無法讓生命值自動回復的程度。 + + 可當做染料來製造紅色羊毛。 - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解食物列和吃東西的相關知識。{*B*} - 如果您已經了解食物列和吃東西的相關知識,請按下 {*CONTROLLER_VK_B*} 。 + + 可用來讓作物、樹木、茂密青草、巨型蘑菇及花朵立刻長大,還能與某些染料組合成新的染料。 - - 選取 + + 可當做染料來製造粉紅色羊毛。 - - 使用 + + 可當做染料來製造棕色羊毛、製作餅乾的材料,或者可用來種植可可豆。 - - 返回 + + 可當做染料來製造銀色羊毛。 - - 離開 + + 可當做染料來製造黃色羊毛。 - - 取消 + + 可射出箭來進行遠距攻擊。 - - 取消加入 + + 穿戴時會讓使用者擁有 5 點護甲值。 - - 重新整理線上遊戲清單 + + 穿戴時會讓使用者擁有 3 點護甲值。 - - 派對遊戲 + + 穿戴時會讓使用者擁有 1 點護甲值。 - - 所有遊戲 + + 穿戴時會讓使用者擁有 5 點護甲值。 - - 變更群組 + + 穿戴時會讓使用者擁有 2 點護甲值。 - - 顯示物品欄 + + 穿戴時會讓使用者擁有 2 點護甲值。 - - 顯示說明 + + 穿戴時會讓使用者擁有 3 點護甲值。 - - 顯示材料 + + 只要在熔爐中熔煉礦石,就能取得閃亮的錠塊。錠塊可用來精製成相同材質的工具。 - - 精製 + + 您可以將錠塊、寶石或染料精製成可放置的方塊,然後拿來當做昂貴的建築材料,或是壓縮的礦石存放方式。 - - 製造 + + 當玩家、動物或怪物踏上壓板時,壓板就會送出電流。如果您讓東西掉落在木壓板上,也能啟動送出電流。 - - 撿起/放置 + + 穿戴時會讓使用者擁有 8 點護甲值。 - - 撿起 + + 穿戴時會讓使用者擁有 6 點護甲值。 - - 全部撿起 + + 穿戴時會讓使用者擁有 3 點護甲值。 - - 撿起一半 + + 穿戴時會讓使用者擁有 6 點護甲值。 - - 放置 + + 鐵門只能透過紅石、按鈕或開關來開啟。 - - 全部放置 + + 穿戴時會讓使用者擁有 1 點護甲值。 - - 放置 1 個 + + 穿戴時會讓使用者擁有 3 點護甲值。 - - 丟棄 + + 用來劈砍木頭相關方塊的速度,會比用手劈砍還要快。 - - 全部丟棄 + + 用來在泥土和青草方塊上整地,以準備進行耕種。 - - 丟棄 1 個 + + 木門只要透過使用或敲擊,或是使用紅石就能啟動。 - - 交換 + + 穿戴時會讓使用者擁有 2 點護甲值。 - - 快速移動 + + 穿戴時會讓使用者擁有 4 點護甲值。 - - 清除快速選取 + + 穿戴時會讓使用者擁有 1 點護甲值。 - - 這是什麼? + + 穿戴時會讓使用者擁有 2 點護甲值。 - - 分享至 Facebook + + 穿戴時會讓使用者擁有 1 點護甲值。 - - 變更篩選條件 + + 穿戴時會讓使用者擁有 2 點護甲值。 - - 傳送好友請求 + + 穿戴時會讓使用者擁有 5 點護甲值。 - - 下一頁 + + 可用來組成樓梯。 - - 上一頁 + + 可用來裝燉蘑菇。當您吃掉燉蘑菇時,碗會保留下來。 - - 下一個 + + 可用來裝水、熔岩及牛奶,讓您能夠把這些物品運送到其他地方。 - - 上一個 + + 可用來裝水,讓您能夠把水運送到其他地方。 - - 踢除玩家 + + 可顯示您或其他玩家輸入的文字。 - - 染色 + + 可用來產生比火把更亮的光源。能夠融化白雪和冰塊,還能在水面下使用。 - - 開採 + + 可用來產生爆炸。炸藥放置後,只要用打火鐮點燃,或利用電流即可啟動。 - - 餵食 + + 可用來裝熔岩,讓您能夠把熔岩運送到其他地方。 - - 馴服 + + 會顯示太陽與月亮目前的位置。 - - 治療 + + 會持續指向您的起點。 - - 坐下 + + 用手握住時,會顯示某個地區中已探索區域的影像。可讓您用來尋找能前往某個地點的路。 - - 跟著我 + + 可用來裝牛奶,讓您能夠把牛奶運送到其他地方。 - - 退出 + + 可用來生火、點燃炸藥,以及啟動蓋好的傳送門。 - - 清空 + + 可用來釣魚。 - - 鞍座 + + 只要透過使用或敲擊,或是使用紅石就能啟動。活板門的功用與一般的門相同,但大小是 1 x 1 的方塊,而且放置後會平躺在地面上。 - - 放置 + + 所有形式的木頭都可以精製成木板。木板可當做建築材料,還能用來精製出許多種物品。 - - 敲擊 + + 可當做建築材料。沙岩不會受到重力的影響,不像普通的沙子會因為重力而往下掉。 - - 擠牛奶 + + 可當做建築材料。 - - 收集 + + 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 - - + + 可用來組成長長的樓梯。把 2 個板子上下重疊,就會產生普通大小的雙層板方塊。 - - 睡覺 + + 可用來產生光線,還能融化白雪和冰塊。 - - 起床 + + 可用來精製出火把、箭、牌子、梯子、柵欄,還能當做工具與武器的把手。 - - 播放 + + 可讓您在裡面存放方塊和物品。把 2 個箱子並排放置,就能製造出有 2 倍容量的大箱子。 - - 騎/搭乘 + + 可當做無法躍過的屏障。對玩家、動物及怪物而言,柵欄有 1.5 個方塊高;但對於其他方塊來說,柵欄只有 1 個方塊高。 - - 乘船 + + 可讓您上下攀爬。 - - 栽培 + + 當遊戲世界進入夜晚時,只要世界中的所有玩家都上床睡覺,就能讓時間立刻從夜晚跳到早晨,而且上床也會改變玩家的再生點。 +無論您用哪種色彩的羊毛來精製床舖,床舖的顏色都會是一樣的。 - - 往上游 + + 與一般的精製介面相較之下,精製台可讓您精製出更多種類的物品。 - - 開啟 + + 可讓您熔煉礦石、製造木炭與玻璃,還能烹煮生魚和生豬肉。 - - 變更音調 + + 鐵斧 - - 觸發 + + 紅石燈 - - 閱讀 + + 熱帶叢林木梯 - - 懸吊 + + 樺樹木梯 - - 投擲 + + 目前的控制方式 - - 栽種 + + 骷髏 - - 整地 + + 可可 - - 收成 + + 杉樹木梯 - - 繼續 + + 龍蛋 - - 解除完整版遊戲鎖定 + + 終界石 - - 刪除存檔 + + 終界入口框架 - - 刪除 + + 沙岩梯 - - 選項 + + - - 邀請好友 + + 矮樹 - - 接受 + + 配置 - - 剪毛 + + 精製 - - 禁用關卡 + + 使用 - - 選取角色外觀 + + 動作 - - 點燃 + + 潛行/往下飛 - - 瀏覽 + + 潛行 - - 安裝完整版 + + 丟棄 - - 安裝試用版 + + 依序更換手中的物品 - - 安裝 + + 暫停 - - 重新安裝 + + 觀看 - - 儲存選項 + + 移動/奔跑 - - 執行命令 + + 物品欄 - - 創造 + + 跳躍/往上飛 - - 移動材料 + + 跳躍 - - 移動燃料 + + 終界入口 - - 移動工具 + + 南瓜莖 - - 移動護甲 + + 西瓜 - - 移動武器 + + 玻璃片 - - 配備 + + 柵欄門 - - 拉弓 + + 藤蔓 - - 射箭 + + 西瓜莖 - - 特權 + + 鐵條 - - 格擋 + + 裂開的石磚塊 - - 上一頁 + + 長滿青苔的石磚塊 + + + 石磚塊 - - 下一頁 + + 蘑菇 - - 戀愛模式 + + 蘑菇 - - + + 刻紋石磚塊 - - 旋轉 + + 磚塊梯 - - 隱藏 + + 地獄結節 - - 清除所有空格 + + 地獄磚塊梯 - - 確定 + + 地獄磚塊柵欄 - - 取消 + + 水槽 - - Minecraft 商店 + + 釀製台 - - 確定要離開目前的遊戲,並加入新的遊戲嗎?您將因此失去尚未儲存的遊戲進度。 + + 附加能力台 - - 離開遊戲 + + 地獄磚塊 - - 儲存遊戲 + + Silverfish 鵝卵石 - - 不儲存即離開 + + Silverfish 石 - - 確定要用這個世界目前的存檔,來覆寫同一世界之前的存檔嗎? + + 石磚塊梯 - - 確定要不儲存即離開嗎?您將因此失去在這個世界的所有遊戲進度! + + 睡蓮 - - 開始遊戲 + + 菌絲體 - - 損毀的存檔 + + Silverfish 石磚塊 - - 這個存檔已損毀。想要刪除這個存檔嗎? + + 變更視角模式 - - 確定要離開並返回主畫面,同時中斷遊戲中所有玩家的連線嗎?您將因此失去尚未儲存的遊戲進度。 + + 如果您失去部分生命值,但是食物列有 9 個以上的 {*ICON_SHANK_01*},您的生命值將會自動回復。只要吃下食物,就能補充食物列。 - - 離開並存檔 + + 當您四處移動、開採和攻擊時,就會消耗食物列 {*ICON_SHANK_01*}。奔跑和快速跳躍時所消耗的食物量,會比行走和正常跳躍時所消耗的多。 - - 不存檔即離開 + + 在您不斷收集和精製物品的同時,物品欄也會逐漸填滿。{*B*} + 請按下 {*CONTROLLER_ACTION_INVENTORY*} 來開啟物品欄。 - - 確定要離開並返回主畫面嗎?您將因此失去尚未儲存的遊戲進度。 + + 您收集來的木頭可以精製成木板。請開啟精製介面來精製木板。{*PlanksIcon*} - - 確定要離開並返回主畫面嗎?您將因此失去遊戲進度! + + 您的食物列即將耗盡,而且您失去了部分生命值。請吃下物品欄中的牛排來補充食物列,並開始回復生命值。{*ICON*}364{*/ICON*} - - 建立新世界 + + 只要把食物握在手中,然後按住 {*CONTROLLER_ACTION_USE*} 即可吃下該食物來補充您的食物列。當食物列全滿時,您無法繼續吃東西。 - - 進行教學課程 + + 按下 {*CONTROLLER_ACTION_CRAFTING*} 即可開啟精製介面。 - - 教學課程 + + 如要奔跑,只要往前快速按兩下 {*CONTROLLER_ACTION_MOVE*} 即可。當您往前按住 {*CONTROLLER_ACTION_MOVE*} 時,角色將會繼續奔跑,直到奔跑時間耗盡或是食物消耗完畢為止。 - - 為您的世界命名 + + 使用 {*CONTROLLER_ACTION_MOVE*} 即可四處移動。 - - 請為您的世界輸入一個名稱 + + 使用 {*CONTROLLER_ACTION_LOOK*} 即可往上、下及四周觀看。 - - 輸入用來產生新世界的種子 + + 請按住 {*CONTROLLER_ACTION_ACTION*} 來砍下 4 個木頭方塊 (樹幹)。{*B*}當方塊被劈砍下來後,只要站在隨後出現的浮空物品旁邊,該物品就會進入您的物品欄。 - - 載入已存檔的世界 + + 按住 {*CONTROLLER_ACTION_ACTION*} 即可用您的手或是手中握住的東西來開採及劈砍資源,但您可能需要精製出工具來開採某些方塊… - - 按下 START 按鈕來加入遊戲 + + 按下 {*CONTROLLER_ACTION_JUMP*} 即可跳躍。 - - 正在離開遊戲 + + 許多精製過程包含好幾個步驟。現在您已經有幾片木板,就能夠精製出更多物品了。請建造 1 個精製台。{*CraftingTableIcon*} - - 發生錯誤,即將離開遊戲並返回主畫面。 + + + 夜晚很快就會來臨,沒有做好準備就在夜晚外出是很危險的事。您可以精製出護甲及武器來保護自己,但最實用的方法就是建造安全的棲身處。 + - - 連線失敗 + + 請開啟容器 - - 連線中斷 + + 十字鎬可加快您挖掘較硬方塊 (例如石頭及礦石) 的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度且較不容易損壞的工具,讓您能夠開採材質較硬的資源。請製造 1 把木鎬。{*WoodenPickaxeIcon*} - - 與伺服器的連線中斷。即將離開遊戲並返回主畫面。 + + 請使用十字鎬來開採石頭方塊。石頭方塊在開採後會挖出鵝卵石。只要收集 8 個鵝卵石方塊,就能建造 1 座熔爐。您可能需要挖開一些泥土才能找到石頭,所以請記得使用鏟子來挖泥土。{*StoneIcon*} - - 伺服器中斷連線 + + + 您還需要收集資源才能蓋好這個棲身處。您可以用任何材質的方塊來蓋牆壁和屋頂,但您還必須製作 1 個門、幾扇窗戶,還有光源。 + - - 您被踢出遊戲 + + + 附近有個廢棄的礦工棲身處,您可以完成該建築來當做您夜晚時的安全棲身處。 + - - 您因為飛翔而被踢出遊戲 + + 斧頭可加快劈砍木頭及木質方塊的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度且較不容易損壞的工具。請製造 1 把木斧。{*WoodenHatchetIcon*} - - 嘗試連線的時間太久 + + 使用 {*CONTROLLER_ACTION_USE*} 即可使用物品、與物體互動,以及放置某些物品。如果您想要重新撿起已經放置好的物品,只要使用正確的工具敲擊該物品即可撿起。 - - 伺服器人數已滿 + + 使用 {*CONTROLLER_ACTION_LEFT_SCROLL*} 和 {*CONTROLLER_ACTION_RIGHT_SCROLL*} 即可變更手中握住的物品。 - - 主持人已經離開遊戲。 + + 如果您想要加快收集方塊的速度,可以製造專為該工作所設計的工具。某些工具上有使用木棍做成的把手。現在請精製出幾根木棍。{*SticksIcon*} - - 您無法加入這個遊戲,因為該遊戲中沒有任何玩家是您的好友。 + + 鏟子可加快您挖掘較軟方塊 (例如泥土及白雪) 的速度。當您收集了更多不同材質的方塊後,就能精製出可加快工作速度且較不容易損壞的工具。請製造 1 把木鏟。{*WoodenShovelIcon*} - - 您無法加入這個遊戲,因為您之前已經被主持人踢出遊戲。 + + 請將游標對準精製台,然後按下 {*CONTROLLER_ACTION_USE*} 來開啟。 - - 由於您嘗試加入的玩家執行的遊戲版本較舊,所以您無法加入此遊戲。 + + 當您選取精製台時,請將游標對準您要放置精製台的地方,然後使用 {*CONTROLLER_ACTION_USE*} 來放置。 - - 由於您嘗試加入的玩家執行的遊戲版本較新,所以您無法加入此遊戲。 + + Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。 +不過,怪物會在夜裡出沒,千萬記得先蓋好一個棲身處喔。 - - 新世界 + + - - 已解除獎項鎖定! + + - - 太棒了!您獲得 1 個玩家圖示,主角就是 Minecraft 裡的 Steve! + + - - 太棒了!您獲得 1 個玩家圖示,主角就是 Creeper! + + - - 解除完整版遊戲鎖定 + + - - 您正在玩試玩版遊戲,但您必須擁有完整版遊戲才能儲存遊戲進度。 -想要立刻解除完整版遊戲鎖定嗎? + + - - 請稍候 + + - - 沒有搜尋結果 + + 配置 1 - - 篩選條件: + + 移動 (飛翔時) - - 好友 + + 玩家/邀請 - - 我的分數 + + - - 整體 + + 配置 3 - - 項目: + + 配置 2 - - 排名 + + - - 正在準備儲存關卡資料 + + - - 正在準備區塊... + + - - 正在完成... + + - - 正在建造地形 + + {*B*}請按下 {*CONTROLLER_VK_A*} 開始教學課程。{*B*} + 如果您覺得自己已經準備好,可以獨自玩遊戲了,請按下 {*CONTROLLER_VK_B*}。 - - 正在模擬世界 + + {*B*}請按下 {*CONTROLLER_VK_A*} 繼續。 - - 正在啟動伺服器 + + - - 正在產生再生區域 + + - - 正在載入再生區域 + + - - 正在進入地獄 + + - - 正在離開地獄 + + - - 再生中 + + - - 正在產生關卡 + + - - 正在載入關卡 + + - - 正在儲存玩家資料 + + Silverfish 方塊 - - 正在與主持人連線 + + 石板 - - 正在下載地形 + + 鐵的壓縮存放方式。 - - 正在切換至離線遊戲 + + 鐵方塊 - - 伺服器正在儲存遊戲資料,請稍候 + + 橡樹木板 - - 正在進入終界 + + 沙岩板 - - 正在離開終界 + + 石板 - - 這張床已經有人佔據了 + + 黃金的壓縮存放方式。 - - 您只能在夜晚睡覺 + + 花朵 - - %s 正在床舖上睡覺。如要讓遊戲時間快轉至日出,所有玩家都必須同時睡在床舖上。 + + 白色羊毛 - - 您家中的床舖已消失,或是被擋住了 + + 橘色羊毛 - - 附近有怪物,您不能休息 + + 黃金方塊 - - 您正在床舖上睡覺。如要讓遊戲時間快轉至日出,所有玩家都必須同時睡在床舖上。 + + 蘑菇 - - 工具與武器 + + 玫瑰 - - 武器 + + 鵝卵石板 - - 食物 + + 書架 - - 建築 + + 炸藥 - - 護甲 + + 磚塊 - - 機械 + + 火把 - - 運送 + + 黑曜石 - - 裝飾 + + 苔蘚石 - - 建築材料 + + 地獄磚塊板 - - 紅石與運送方式 + + 橡樹木板 - - 雜項 + + 石磚塊板 - - 釀製 + + 磚塊板 - - 工具、武器與護甲 + + 熱帶叢林木板 - - 材料 + + 樺樹木板 - - 已經登出 + + 杉樹木板 - - 困難度 + + 紫紅色羊毛 - - 音樂 + + 樺樹樹葉 - - 音效 + + 杉樹樹葉 - - 色差補正 + + 橡樹樹葉 - - 遊戲靈敏度 + + 玻璃 - - 介面靈敏度 + + 海綿 - - 和平 + + 熱帶叢林樹葉 - - 容易 + + 樹葉 - - 普通 + + 橡樹 - - 困難 + + 杉樹 - - 在這個模式中,玩家的生命值會隨時間自動回復,且遊戲環境中不會出現敵人。 + + 樺樹 - - 在這個模式中,遊戲世界會出現敵人,但敵人只會對玩家造成少量的傷害。 + + 杉樹木頭 - - 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成普通的傷害。 + + 樺樹木頭 - - 在這個模式中,遊戲世界會出現敵人,且敵人會對玩家造成嚴重的傷害。千萬要留意 Creeper,因為當您嘗試遠離時,Creeper 可不會取消爆炸攻擊! + + 熱帶叢林木頭 - - 試玩版遊戲時間結束 + + 羊毛 - - 遊戲人數已滿 + + 粉紅色羊毛 - - 已無空位,因此無法加入遊戲 + + 灰色羊毛 - - 輸入牌子的文字 + + 淺灰色羊毛 - - 請輸入牌子上的文字 + + 淺藍色羊毛 - - 輸入標題 + + 黃色羊毛 - - 請輸入文章的標題 + + 亮綠色羊毛 - - 輸入說明 + + 水藍色羊毛 - - 請輸入文章的說明 + + 綠色羊毛 - - 輸入描述 + + 紅色羊毛 - - 請輸入文章的描述 + + 黑色羊毛 - - 物品欄 + + 紫色羊毛 - - 材料 + + 藍色羊毛 - - 釀製台 + + 棕色羊毛 - - 箱子 + + 火把 (煤塊) - - 附加能力 + + 閃石 - - 熔爐 + + 魂沙 - - 材料 + + 地獄血石 - - 燃料 + + 青金石方塊 - - 分發器 + + 青金石礦石 - - 這款遊戲目前沒有此類型的下載內容。 + + 傳送門 - - %s 已經加入遊戲。 + + 南瓜燈籠 - - %s 已經離開遊戲。 + + 甘蔗 - - %s 已被踢出遊戲。 + + 黏土 - - 確定要刪除這個遊戲存檔嗎? + + 仙人掌 - - 正在等待核准 + + 南瓜 - - 已審查 + + 柵欄 - - 現在正在播放: + + 點唱機 - - 重設設定 + + 青金石的壓縮存放方式。 - - 確定要將所有設定重設為預設值嗎? + + 活板門 - - 正在載入錯誤 + + 上鎖的箱子 - - %s 的遊戲 + + 真空管 - - 不明主持人的遊戲 + + 黏性活塞 - - 訪客已經登出 + + 活塞 - - 某位訪客玩家已經登出,導致系統移除遊戲中的所有訪客玩家。 + + 羊毛 (不限色彩) - - 登入 + + 枯灌木 - - 您尚未登入。您必須登入,才能進行這個遊戲。想要立刻登入嗎? + + 蛋糕 - - 不允許進行多人遊戲 + + 音符方塊 - - 無法建立遊戲 + + 分發器 - - 已自動選取 + + 茂密青草 - - 無套件:預設角色外觀 + + 蜘蛛網 - - 最愛的角色外觀 + + 床舖 - - 已禁用的關卡 + + 冰塊 - - 您要加入的遊戲已經列在您的禁用關卡清單中。 -如果您要加入這個遊戲,系統會把這個關卡從禁用關卡清單中移除。 + + 精製台 - - 要禁用這個關卡嗎? + + 鑽石的壓縮存放方式。 - - 確定要把這個關卡加入禁用關卡清單嗎? -如果您選取 [確定],將會離開這個遊戲。 + + 鑽石方塊 - - 從禁用清單中移除 + + 熔爐 - - 自動存檔時間間隔 + + 農地 - - 自動存檔時間間隔:關閉 + + 作物 - - 分鐘 + + 鑽石礦石 - - 不能放置在這裡! + + 怪物產生器 - - 您無法在關卡再生點附近放置熔岩,以避免讓再生的玩家立刻死亡。 + + - - 介面透明度 + + 火把 (木炭) - - 正在準備自動儲存關卡資料 + + 紅石塵 - - 平行顯示器大小 + + 箱子 - - 平行顯示器大小 (分割畫面) + + 橡樹木梯 - - 種子 + + 牌子 - - 解除角色外觀套件鎖定 + + 紅石礦石 - - 如要使用您選取的角色外觀,您必須先解除這個角色外觀套件的鎖定。 -您想要立刻解除這個角色外觀套件的鎖定嗎? + + 鐵門 - - 解除材質套件鎖定 + + 壓板 - - 您必須先解除這個材質套件的鎖定才能在您的世界中使用。 -您想要立刻解除這個材質套件的鎖定嗎? + + 白雪 - - 試用版材質套件 + + 按鈕 - - 您目前所使用的是試用版的材質套件。只有解除完整版鎖定才能將這個世界存檔。 -您想要解除完整版材質套件的鎖定嗎? + + 紅石火把 - - 沒有材質套件 + + 拉桿 - - 解除完整版鎖定 + + 軌道 - - 下載試用版 + + 梯子 - - 下載完整版 + + 木門 - - 您沒有這個世界所使用的混搭套件或材質套件! -您想要立刻安裝混搭套件或材質套件嗎? + + 石梯 - - 取得試用版 + + 偵測器軌道 - - 取得完整版 + + 動力軌道 - - 踢除玩家 + + 您已經收集到足夠的鵝卵石來建造熔爐了。請使用精製台來建造熔爐。 - - 確定要將該玩家踢出這個遊戲嗎?除非您讓這個世界重新開始,該玩家才能重新加入遊戲。 + + 釣魚竿 - - 玩家圖示套件 + + 時鐘 - - 主題 + + 閃石塵 - - 角色外觀套件 + + 熔爐礦車 - - 允許好友的好友加入 + + - - 您無法加入這個遊戲,因為只有主持人的好友才能加入。 + + 指南針 - - 無法加入遊戲 + + 生魚 - - 已選取 + + 玫瑰紅 - - 已選取的角色外觀: + + 仙人掌綠 - - 損毀的下載內容 + + 可可豆 - - 這個下載內容已經損毀,因此無法使用。您必須刪除該下載內容,然後從 [Minecraft 商店] 選單重新安裝。 + + 熟魚 - - 您有部分的下載內容已經損毀,因此無法使用。您必須刪除這些下載內容,然後從 [Minecraft 商店] 選單重新安裝。 + + 染粉 - - 遊戲模式已經變更 + + 墨囊 - - 重新為您的世界命名 + + 箱子礦車 - - 請為您的世界輸入新的名稱 + + 雪球 - - 遊戲模式:生存 + + 小船 - - 遊戲模式:創造 + + 皮革 - - 生存 + + 礦車 - - 創造 + + 鞍座 - - 在生存模式中建立 + + 紅石 - - 在創造模式中建立 + + 牛奶桶 - - 產生雲朵 + + 紙張 - - 您要如何處理這個遊戲存檔? + + 書本 - - 重新為存檔命名 + + 史萊姆球 - - 自動存檔倒數 %d... + + 磚塊 - - 開啟 + + 黏土 - - 關閉 + + 甘蔗 - - 普通 + + 青金石 - - 非常平坦 + + 地圖 - - 啟用此選項時,本遊戲將成為線上遊戲。 + + 唱片:13 - - 啟用此選項時,只限被邀請的玩家才能加入。 + + 唱片:Cat - - 啟用此選項時,您好友的朋友便可以加入遊戲。 + + 床舖 - - 啟用此選項時,玩家可以對其他玩家造成傷害。只有在生存模式才會生效。 + + 紅石中繼器 - - 停用此選項時,加入遊戲的玩家需要取得同意才能建造或開採。 + + 餅乾 - - 啟用此選項時,火可能會蔓延到鄰近的易燃方塊。 + + 唱片:Blocks - - 啟用此選項時,炸藥會在點燃後爆炸。 + + 唱片:Mellohi - - 啟用此選項時,會重新產生地獄世界。如果您的舊存檔中沒有地獄要塞,這將會很有用。 + + 唱片:Stal - - 啟用此選項時,會在遊戲世界中產生村落和地下要塞等建築。 + + 唱片:Strad - - 啟用此選項時,會在地上世界與地獄世界中產生地形完全平坦的世界。 + + 唱片:Chirp - - 啟用此選項時,玩家的再生點附近會產生一個裝著有用物品的箱子。 + + 唱片:Far - - 角色外觀套件 + + 唱片:Mall - - 主題 + + 蛋糕 - - 玩家圖示 + + 灰色染料 - - 個人造型項目 + + 粉紅色染料 - - 材質套件 + + 亮綠色染料 - - 混搭套件 + + 紫色染料 - - {*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 已達到數量上限,目前無法使用角色蛋。 + + 蘋果 - - 遊戲世界裡的狼已達到數量上限,目前無法使用角色蛋。 + + - - 遊戲世界裡的雞已達到數量上限,目前無法使用角色蛋。 + + - - 遊戲世界裡的烏賊已達到數量上限,目前無法使用角色蛋。 + + 唱片:Ward - - 遊戲世界裡的敵人已達到數量上限,目前無法使用角色蛋。 + + 按下 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 即可切換至您想要精製的物品所屬的群組類型。請選取建築群組。{*StructuresIcon*} - - 遊戲世界裡的村民已達到數量上限,目前無法使用角色蛋。 + + 按下 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 即可切換至您想要精製的物品所屬的群組類型。請選取工具群組。{*ToolsIcon*} - - 遊戲世界中的圖畫/物品框架已達到數量上限。 + + 既然您已經建造好精製台,就應該將其放置在遊戲世界中,以便讓您能夠精製出更多種類的物品。{*B*} + 現在請按下 {*CONTROLLER_VK_B*} 來離開精製介面。 - - 您無法在和平模式中產生敵人。 + + 有了您製造的這些工具,您就能更有效率地收集各種不同的資源。{*B*} + 現在請按下 {*CONTROLLER_VK_B*} 來離開精製介面。 - - 豬、綿羊、乳牛和貓已達到繁殖數量上限,該動物無法進入戀愛模式。 + + 許多精製過程包含好幾個步驟。現在您已經有幾片木板,就能夠精製出更多物品了。使用 {*CONTROLLER_MENU_NAVIGATE*} 即可切換至您想要精製的物品。請選取精製台。{*CraftingTableIcon*} - - 狼已達到繁殖數量上限,該動物無法進入戀愛模式。 + + 使用 {*CONTROLLER_MENU_NAVIGATE*} 即可切換至您想要精製的物品。某些物品會因為所用材料的不同而有不一樣的版本。請選取木鏟。{*WoodenShovelIcon*} - - 雞已達到繁殖數量上限,該動物無法進入戀愛模式。 + + 您之前收集的木頭可用來精製成木板。請選取木板圖示,然後按下 {*CONTROLLER_VK_A*} 來製造木板。{*PlanksIcon*} - - Mooshroom 已達到繁殖數量上限,該動物無法進入戀愛模式。 + + 精製台可讓您精製出種類較多的物品。精製台的運作方法跟基本的精製介面是一樣的,但您會擁有較大的精製空間,讓您能夠使用更多樣化的材料組合。 - - 遊戲世界裡的小船已達到數量上限。 + + + 精製區域會顯示精製新物品所需的材料。按下 {*CONTROLLER_VK_A*} 即可精製物品,並將該物品放置在物品欄中。 + - - 遊戲世界裡的生物總數已達到上限。 + + + 請使用 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 來切換頂端的群組類型索引標籤,以便選取您想要精製的物品所屬的群組類型,然後使用 {*CONTROLLER_MENU_NAVIGATE*} 來選取您要精製的物品。 + - - 上下反轉 + + 精製介面現在會列出精製所選取物品的所需材料。 - - 慣用左手 + + 精製介面現在會顯示目前所選取物品的說明,告訴您該物品的用途。 - - 您死亡了! + + 精製介面的右下區域會顯示您的物品欄。這裡也會顯示目前所選取物品的說明,以及精製該物品所需的材料。 - - 再生 + + 某些物品無法用精製台來製造,必須靠熔爐來產生。現在請製造 1 座熔爐。{*FurnaceIcon*} - - 下載內容 + + 礫石 - - 變更角色外觀 + + 黃金礦石 - - 遊戲方式 + + 鐵礦石 - - 控制設定 + + 熔岩 - - 設定 + + 沙子 - - 製作群 + + 沙岩 - - 重新安裝內容 + + 煤礦石 - - 偵錯設定 + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} + 如果您已經了解如何使用熔爐,請按下 {*CONTROLLER_VK_B*}。 - - 火會蔓延 + + 這是熔爐介面。熔爐可讓您透過火燒來改變物品。舉例來說,您可以使用熔爐把鐵礦石轉變成鐵錠塊。 - - 炸藥會爆炸 + + 請將您精製出的熔爐放置在遊戲世界中,最好是放置在您的棲身處裡面。{*B*} + 現在請按下 {*CONTROLLER_VK_B*} 來離開精製介面。 - - 玩家對戰 + + 木頭 - - 信任玩家 + + 橡樹木頭 - - 主持人特權 + + 您必須把一些燃料放在熔爐底部的空格中,熔爐頂端空格裡的物品才會受熱,然後熔爐就會起火,開始火燒上面的物品,並把成品放在右邊的空格中。 - - 產生建築 + + {*B*} + 請按下 {*CONTROLLER_VK_X*} 來再次顯示物品欄。 - - 非常平坦的世界 + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} + 如果您已經了解如何使用物品欄,請按下 {*CONTROLLER_VK_B*}。 - - 贈品箱 + + + 這是您的物品欄。這裡會顯示可在您手中使用的物品,以及您身上攜帶的所有其他物品。您穿戴的護甲也會顯示在這裡。 + - - 世界選項 + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 繼續教學課程。{*B*} + 如果您覺得自己已經準備好,可以獨自玩遊戲了,請按下 {*CONTROLLER_VK_B*}。 - - 可以建造和開採 + + + 當游標上有物品時,如果您把游標移動到物品欄的外面,就能丟棄游標上的物品。 + - - 可以使用門與開關 + + + 請用游標把這個物品移動到物品欄的另一個空格,然後使用 {*CONTROLLER_VK_A*} 把物品放置在那個空格。 + 如果游標上有數個物品,使用 {*CONTROLLER_VK_A*} 即可放置所有物品,但您也可以使用 {*CONTROLLER_VK_X*} 僅放置 1 個物品。 + - - 可以開啟容器 + + + 請使用 {*CONTROLLER_MENU_NAVIGATE*} 來移動游標,然後用 {*CONTROLLER_VK_A*} 來撿起游標下的物品。 + 如果游標下有數個物品,您將會撿起所有物品,但您也可以使用 {*CONTROLLER_VK_X*} 只撿起其中的一半。 + - - 可以攻擊玩家 + + 您已經完成教學課程的第一部分。 - - 可以攻擊動物 + + 請使用熔爐來製作一些玻璃。如果您正在等待玻璃製作完成,我們建議您利用這段等待時間收集更多建築材料來蓋好棲身處。 - - 管理員 + + 請使用熔爐來製作一些木炭。如果您正在等待木炭製作完成,我們建議您利用這段等待時間收集更多建築材料來蓋好棲身處。 - - 踢除玩家 + + 請使用 {*CONTROLLER_ACTION_USE*} 把熔爐放置在遊戲世界中,然後開啟熔爐。 - - 可以飛翔 + + 當夜晚來臨時,棲身處裡面可能會很暗,因此您必須放置光源,好讓您能看見周遭的環境。現在請使用精製台,把木棍跟木炭精製成火把。{*TorchIcon*} - - 不會疲勞 + + 請使用 {*CONTROLLER_ACTION_USE*} 來放置門。您可以使用 {*CONTROLLER_ACTION_USE*} 來開、關遊戲世界中的木門。 - - 隱形 + + 良好的棲身處是有門的,讓您能夠輕易地進出棲身處,而不必費力把牆壁挖開再補好牆壁來進出。現在請精製 1 個木門。{*WoodenDoorIcon*} - - 主持人選項 + + + 如果你想知道某個物品的詳細資訊,只要把游標移動到該物品上面,然後按下 {*CONTROLLER_ACTION_MENU_PAGEDOWN*} 即可。 + - - 玩家/邀請 + + + 這是精製介面,可讓您把收集到的物品組合成各種新物品。 + - - 線上遊戲 + + + 現在請按下 {*CONTROLLER_VK_B*} 來離開創造模式下的物品欄。 + - - 僅限邀請 + + + 如果你想知道某個物品的詳細資訊,只要把游標移動到該物品上面,然後按下 {*CONTROLLER_ACTION_MENU_PAGEDOWN*} 即可。 + - - 更多選項 + + {*B*} + 按下 {*CONTROLLER_VK_X*} 即可顯示要精製出目前物品所需的材料。 - - 載入 + + {*B*} + 按下 {*CONTROLLER_VK_X*} 即可顯示物品說明。 - - 新世界 + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} + 如果您已經了解精製物品的方式,請按下 {*CONTROLLER_VK_B*}。 - - 世界名稱 + + + 請使用 {*CONTROLLER_VK_LB*} 和 {*CONTROLLER_VK_RB*} 來切換頂端的群組類型索引標籤,以便選取您想要撿起的物品所屬的群組類型。 + - - 用於產生世界的種子 + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 繼續。{*B*} + 如果您已經了解如何使用創造模式下的物品欄,請按下 {*CONTROLLER_VK_B*}。 - - 留白即可使用隨機種子 + + 這是您在創造模式下的物品欄,它會顯示可在您手中使用的物品,以及可供您選擇的所有其他物品。 - - 玩家 + + 現在請按下 {*CONTROLLER_VK_B*} 來離開物品欄。 - - 加入遊戲 + + + 當游標上有物品時,如果您把游標移動到物品欄的外面,就能把游標上的物品丟棄到遊戲世界中。若要清除快速選取列中的所有物品,請按下 {*CONTROLLER_VK_X*}。 + - - 開始遊戲 + + + 游標會自動移動到使用列,您只要使用 {*CONTROLLER_VK_A*} 即可放置物品。當您放置好物品後,游標會返回物品清單,讓您能夠選取另一個物品。 + - - 找不到任何遊戲 + + + 請使用 {*CONTROLLER_MENU_NAVIGATE*} 來移動游標。 + 當您在物品清單時,使用 {*CONTROLLER_VK_A*} 即可撿起一個游標下的物品,使用 {*CONTROLLER_VK_Y*} 即可撿起該物品的完整數量。 + - - 進行遊戲 + + 水體 - - 排行榜 + + 玻璃瓶 - - 說明與選項 + + 水瓶 - - 解除完整版遊戲鎖定 + + 蜘蛛眼 - - 繼續遊戲 + + 碎金塊 - - 儲存遊戲資料 + + 地獄結節 - - 困難度: + + {*splash*}{*prefix*}{*postfix*}藥水 - - 遊戲類型: + + 發酵蜘蛛眼 - - 建築: + + 水槽 - - 關卡類型: + + 終界之眼 - - 玩家對戰: + + 發光西瓜 - - 信任玩家: + + Blaze 粉 - - 炸藥: + + 熔岩球 - - 火會蔓延: + + 釀製台 - - 重新安裝主題 + + Ghast 淚水 - - 重新安裝玩家圖示 1 + + 南瓜子 - - 重新安裝玩家圖示 2 + + 西瓜子 - - 重新安裝個人造型項目 1 + + 生雞肉 - - 重新安裝個人造型項目 2 + + 唱片:11 - - 重新安裝個人造型項目 3 + + 唱片:Where are we now - - 選項 + + 大剪刀 - - 音訊 + + 熟雞肉 - - 控制 + + 終界珍珠 - - 圖形 + + 西瓜片 - - 使用者介面 + + Blaze 棒 - - 重設為預設值 + + 生牛肉 - - 影像晃動 + + 牛排 - - 提示 + + 腐肉 - - 遊戲中的工具提示 + + 經驗藥水瓶 - - 雙人遊戲垂直分割畫面 + + 橡樹厚木板 - - 完成 + + 杉樹厚木板 - - 編輯牌子上的訊息: + + 樺樹厚木板 - - 請填寫螢幕擷取畫面的說明 + + 青草方塊 - - 說明 + + 泥土 - - 遊戲中的螢幕擷取畫面 + + 鵝卵石 - - 編輯牌子上的訊息: + + 熱帶叢林厚木板 - - 經典 Minecraft 材質、圖示及使用者介面! + + 樺樹樹苗 - - 顯示所有混搭的遊戲世界 + + 熱帶叢林樹苗 - - 沒有特殊效果 + + 基岩 - - 速度 + + 樹苗 - - 緩慢 + + 橡樹樹苗 - - 快速 + + 杉樹樹苗 - - 開採造成的疲勞 + + 石頭 - - 力量 + + 物品框架 - - 虛弱 + + 再生 {*CREATURE*} - - 立即回復生命值 + + 地獄磚塊 - - 立即造成傷害 + + 火彈 - - 增強跳躍 + + 火彈 (木炭) - - 噁心 + + 火彈 (煤塊) - - 復原 + + 骷髏 - - 抗性 + + 頭顱 - - 防火 + + %s 頭顱 - - 水中呼吸 + + Creeper 頭顱 - - 隱形 + + 骷髏頭 - - 眼盲 + + 凋零骷髏 - - 夜視 + + 殭屍頭顱 - - 飢餓 + + 煤炭的緊湊存放方式。可以在熔爐中用作燃料。 巨毒 - - 敏捷 + + 飢餓 緩慢 - - 快速 + + 敏捷 - - 遲鈍 + + 隱形 - - 力量 + + 水中呼吸 - - 虛弱 + + 夜視 - - 治療 + + 眼盲 傷害 - - 跳躍 + + 治療 噁心 @@ -5044,29 +5965,38 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 復原 - - 抗性 + + 遲鈍 - + + 快速 + + + 虛弱 + + + 力量 + + 防火 - - 水中呼吸 + + 飽和 - - 隱形 + + 抗性 - - 眼盲 + + 跳躍 - - 夜視 + + 凋零怪 - - 飢餓 + + 提升生命 - - 巨毒 + + 吸收 @@ -5077,29 +6007,41 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 3 + + 隱形 + 4 - - 噴濺 + + 水中呼吸 - - 平庸 + + 防火 - - 無趣 + + 夜視 - - 平淡 + + 巨毒 - - 清澈 + + 飢餓 - - 乳狀 + + 吸收 - - 擴散 + + 飽和 + + + 生命提升 + + + 眼盲 + + + 腐朽 拙劣 @@ -5107,17 +6049,17 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 稀薄 - - 粗劣 + + 擴散 - - 走味 + + 清澈 - - 巨大 + + 乳狀 - - 粗製 + + 粗劣 奶油 @@ -5125,246 +6067,300 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 滑順 - - 柔順 + + 粗製 - - 精緻 + + 走味 - - 濃郁 + + 巨大 - - 高雅 + + 平淡 - - 高貴 + + 噴濺 - - 魅力 + + 平庸 + + + 無趣 華麗 - - 極緻 - 強烈 + + 魅力 + + + 高雅 + + + 高貴 + 閃光 + + 惡臭 + + + 刺鼻 + + + 無臭 + 強效 混濁 - - 無臭 + + 柔順 - - 惡臭 + + 極緻 - - 刺鼻 + + 濃郁 - - 刺激 + + 精緻 - - 濃稠 + + 隨著時間自動回復受影響玩家、動物和怪物的生命值。 - - 黏性 + + 立即減少受影響玩家、動物和怪物的生命值。 - - 所有藥水的基本配方,用來在釀製台中製造藥水。 + + 讓受影響玩家、動物和怪物不受火、熔岩和 Blaze 遠距攻擊的傷害。 本身不具備任何效果,藉由在釀製台中添加其他材料來製造藥水。 - - 增加受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 + + 刺激 減少受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 + + 增加受影響玩家、動物和怪物的移動速度,以及玩家的奔跑速度、跳躍距離和視野。 + 增加受影響玩家和怪物攻擊時所造成的傷害。 + + 立即增加受影響玩家、動物和怪物的生命值。 + 減少受影響玩家和怪物攻擊時所造成的傷害。 - - 立即增加受影響玩家、動物和怪物的生命值。 + + 所有藥水的基本配方,用來在釀製台中製造藥水。 - - 立即減少受影響玩家、動物和怪物的生命值。 + + 濃稠 - - 隨著時間自動回復受影響玩家、動物和怪物的生命值。 + + 臭的 - - 讓受影響玩家、動物和怪物不受火、熔岩和 Blaze 遠距攻擊的傷害。 + + 重擊 + + + 鋒利 隨著時間自動減少受影響玩家、動物和怪物的生命值。 - - 鋒利 + + 攻擊傷害 - - 重擊 + + 擊退 節足剋星 - - 擊退 + + 速度 - - 烈火 + + 僵屍強化 - - 防護 + + 馬匹跳躍強度 + + + 應用後: + + + 擊退抵抗 + + + 怪物跟隨範圍 + + + 最大生命 + + + 聚寶 + + + 效率 + + + 水中挖掘 + + + 財富 + + + 奪寶 + + + 耐力 防火 + + 防護 + + + 烈火 + 輕盈 - - 防爆 + + 水中呼吸 防彈 - - 水中呼吸 - - - 水中挖掘 + + 防爆 - - 效率 + + 4 - - 聚寶 + + 5 - - 耐力 + + 6 - - 奪寶 + + 猛擊 - - 財富 + + 7 - - 力量 + + 3 火焰 - - 猛擊 + + 力量 無限 - - 1 - - - 2 - - - 3 + + 2 - - 4 + + 1 - - 5 + + 任何實體走過連接好的絆索後就會將其啟動。 - - 6 + + 走過連接好的絆索鉤即可將其啟動。 - - 7 + + 壓縮存放翡翠的方式。 - - 8 + + 與箱子類似,不過玩家從任何一個終界箱都可以拿取存放在其他終界箱裡的物品,即使處在不同的世界也沒有問題。 9 - - 10 + + 8 可用鐵鎬或材質更堅硬的十字鎬開採來收集翡翠。 - - 與箱子類似,不過玩家從任何一個終界箱都可以拿取存放在其他終界箱裡的物品,即使處在不同的世界也沒有問題。 - - - 任何實體走過連接好的絆索後就會將其啟動。 + + 10 - - 走過連接好的絆索鉤即可將其啟動。 + + 可回復 2 個 {*ICON_SHANK_01*},還能精製成黃金胡蘿蔔。可以種在農地上。 - - 壓縮存放翡翠的方式。 + + 可當做裝飾品。裡面可以種花朵、樹苗、仙人掌和蘑菇。 由鵝卵石建造而成的牆。 - - 可用來維修武器、工具和護甲。 + + 可回復 0.5 個 {*ICON_SHANK_01*},或可用熔爐烹煮。可以種在農地上。 在熔爐中熔煉成地獄石英。 - - 可當做裝飾品。 + + 可用來維修武器、工具和護甲。 可和村民進行交易。 - - 可當做裝飾品。裡面可以種花朵、樹苗、仙人掌和蘑菇。 + + 可當做裝飾品。 - - 可回復 2 個 {*ICON_SHANK_01*},還能精製成黃金胡蘿蔔。可以種在農地上。 + + 可回復 4 個 {*ICON_SHANK_01*}。 - - 可回復 0.5 個 {*ICON_SHANK_01*},或可用熔爐烹煮。可以種在農地上。 + + 可回復 1 個 {*ICON_SHANK_01*},食用這個物品可能會讓你中毒。 + + + 騎在裝有豬鞍的豬身上時,可用來控制方向。 可回復 3 個 {*ICON_SHANK_01*}。在熔爐烹煮馬鈴薯即可獲得。 - - 可回復 1 個 {*ICON_SHANK_01*},或可用熔爐烹煮。可以種在農地上。吃下這個會讓您中毒。 - 可回復 3 個 {*ICON_SHANK_01*}。由胡蘿蔔和碎金塊製作而成。 - - 騎在裝有豬鞍的豬身上時,可用來控制方向。 - - - 可回復 4 個 {*ICON_SHANK_01*}。 - 搭配鐵砧使用可為武器、工具或護甲附加能力。 透過開凱地獄石英礦石所製作而成。可精製成石英方塊。 + + 馬鈴薯 + + + 烤馬鈴薯 + + + 胡蘿蔔 + 由羊毛製作而成。可當做裝飾品。 @@ -5374,14 +6370,11 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 花盆 - - 胡蘿蔔 - - - 馬鈴薯 + + 南瓜派 - - 烤馬鈴薯 + + 已附加能力的書本 有毒的馬鈴薯 @@ -5392,11 +6385,11 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 木棍上的胡蘿蔔 - - 南瓜派 + + 絆索鉤 - - 已附加能力的書本 + + 絆索 地獄石英 @@ -5407,11 +6400,8 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 終界箱 - - 絆索鉤 - - - 絆索 + + 長滿青苔的鵝卵石牆 翡翠方塊 @@ -5419,8 +6409,8 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 鵝卵石牆 - - 長滿青苔的鵝卵石牆 + + 馬鈴薯 花盆 @@ -5428,8 +6418,8 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 胡蘿蔔 - - 馬鈴薯 + + 輕微損壞的鐵砧 鐵砧 @@ -5437,8 +6427,8 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 鐵砧 - - 輕微損壞的鐵砧 + + 石英方塊 嚴重損壞的鐵砧 @@ -5446,8 +6436,8 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 地獄石英礦石 - - 石英方塊 + + 石英梯 鑿刻石英方塊 @@ -5455,8 +6445,8 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 石英柱方塊 - - 石英梯 + + 紅色地毯 地毯 @@ -5464,8 +6454,8 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 黑色地毯 - - 紅色地毯 + + 藍色地毯 綠色地毯 @@ -5473,9 +6463,6 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 棕色地毯 - - 藍色地毯 - 紫色地毯 @@ -5488,18 +6475,18 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 灰色地毯 - - 粉紅色地毯 - 亮綠色地毯 - - 黃色地毯 + + 粉紅色地毯 淺藍色地毯 + + 黃色地毯 + 紫紅色地毯 @@ -5512,89 +6499,84 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 鑿刻沙岩 - - 滑順沙岩 - {*PLAYER*} 在嘗試傷害 {*SOURCE*} 的時候被殺死了 + + 滑順沙岩 + {*PLAYER*} 被掉落的鐵砧壓扁了。 {*PLAYER*} 被掉落的方塊壓扁了。 - - 將 {*PLAYER*} 傳送到 {*DESTINATION*} 了 - {*PLAYER*} 將您傳送到他們的所在位置了 - - {*PLAYER*} 被傳送到您的所在位置了 + + 將 {*PLAYER*} 傳送到 {*DESTINATION*} 了 荊棘 - - 石英板 + + {*PLAYER*} 被傳送到您的所在位置了 讓黑暗的地區看起來像在白天一樣,即使在水面下也可以作用。 + + 石英板 + 讓作用範圍內的玩家、動物和怪物隱形。 維修並命名 - - 附加能力費用:%d - 太貴了! - - 重新命名 + + 附加能力費用:%d 您有: - - 交易的所需物品 + + 重新命名 {*VILLAGER_TYPE*} 提供 %s - - 維修 + + 交易的所需物品 交易 - - 幫項圈染色 + + 維修 這是鐵砧介面,可讓您花費經驗等級點數來幫武器、護甲或工具重新命名、維修並附加特殊能力。 - - - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解鐵砧介面的相關知識。{*B*} - 如果您已經了解鐵砧介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 - + + 幫項圈染色 若要開始處理物品,請將物品放在第一個輸入格。 - + - 將正確的原料放在第二個輸入格 (例如,損壞的鐵劍需要鐵錠塊) 後,輸出格中就會顯示建議的維修結果。 + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解鐵砧介面的相關知識。{*B*} + 如果您已經了解鐵砧介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 @@ -5602,9 +6584,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 此外,您也可以將第二個相同的物品放在第二個空格中來結合這兩樣物品。 - + - 若要在鐵砧上為物品附加能力,請將已附加能力的書本放在第二個輸入格中。 + 將正確的原料放在第二個輸入格 (例如,損壞的鐵劍需要鐵錠塊) 後,輸出格中就會顯示建議的維修結果。 @@ -5612,9 +6594,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 完成工作所需的經驗等級點數會顯示在輸出結果的下方。如果您的經驗等級不足,便無法完成維修工作。 - + - 您可編輯文字方塊中顯示的物品名稱來幫物品重新命名。 + 若要在鐵砧上為物品附加能力,請將已附加能力的書本放在第二個輸入格中。 @@ -5622,9 +6604,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 撿起維修完成的物品將消耗鐵砧所用掉的兩個物品,同時扣除指定的經驗等級點數。 - + - 在這個地區有一面鐵砧和一個箱子,箱子裡有工具和武器可供您使用。 + 您可編輯文字方塊中顯示的物品名稱來幫物品重新命名。 @@ -5634,9 +6616,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 如果您已經了解鐵砧的相關知識,請按下 {*CONTROLLER_VK_B*}。 - + - 鐵砧可讓您維修武器和工具來回復它們的耐用度、幫它們重新命名,或是使用已附加能力的書本來幫它們附加能力。 + 在這個地區有一面鐵砧和一個箱子,箱子裡有工具和武器可供您使用。 @@ -5644,9 +6626,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 您可以從地城裡的箱子找到已附加能力的書本,或是在附加能力台上幫普通書本附加能力來取得。 - + - 使用鐵砧需花費經驗等級點數,而每次使用鐵砧時都有一定的損壞機率。 + 鐵砧可讓您維修武器和工具來回復它們的耐用度、幫它們重新命名,或是使用已附加能力的書本來幫它們附加能力。 @@ -5654,9 +6636,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 待完成的工作類型、物品價值、附加能力數量以及前期工作量等都是影響維修費用的要素。 - + - 幫物品重新命名將會修改對所有玩家顯示的名稱,並將永久減少前期工作費用。 + 使用鐵砧需花費經驗等級點數,而每次使用鐵砧時都有一定的損壞機率。 @@ -5664,9 +6646,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 您可以在這個地區的寶箱中找到損壞的鎬、原料、附加能力藥水瓶及已附加能力的書本來實地操作。 - + - 這是交易介面,其中會顯示可與村民進行的交易項目。 + 幫物品重新命名將會修改對所有玩家顯示的名稱,並將永久減少前期工作費用。 @@ -5676,9 +6658,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 如果您已經了解交易介面的相關知識,請按下 {*CONTROLLER_VK_B*}。 - + - 村民目前願意提供的所有交易都會顯示在上方。 + 這是交易介面,其中會顯示可與村民進行的交易項目。 @@ -5686,9 +6668,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 如果您沒有所需的物品,那麼這些交易項目會以紅色顯示且無法利用。 - + - 您提供給村民的物品數量和類型會顯示在畫面左側的兩個方塊中。 + 村民目前願意提供的所有交易都會顯示在上方。 @@ -5696,9 +6678,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 您可以在畫面左側的兩個方塊中查看交易所需的物品總數。 - + - 按下 {*CONTROLLER_VK_A*} 即可與村民交換此次交易所指定的物品。 + 您提供給村民的物品數量和類型會顯示在畫面左側的兩個方塊中。 @@ -5706,11 +6688,9 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 在這個地區有一位村民和一個箱子,箱子裡有紙張讓您購買物品。 - + - {*B*} - 按下 {*CONTROLLER_VK_A*} 即可進一步了解交易的相關知識。{*B*} - 如果您已經了解交易的相關知識,請按下{*CONTROLLER_VK_B*}。 + 按下 {*CONTROLLER_VK_A*} 即可與村民交換此次交易所指定的物品。 @@ -5718,14 +6698,21 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 玩家也可以拿物品欄中的物品與村民交易。 - + - 村民願意拿出來交換的物品視他們的職業而定。 + {*B*} + 按下 {*CONTROLLER_VK_A*} 即可進一步了解交易的相關知識。{*B*} + 如果您已經了解交易的相關知識,請按下{*CONTROLLER_VK_B*}。 同時交易多種物品時將隨機新增或更新村民提供的交易內容。 + + + + + 村民願意拿出來交換的物品視他們的職業而定。 @@ -5887,7 +6874,4 @@ Minecraft 是一款可讓您放置方塊來建造夢想世界的遊戲。不過 治癒 - - 尋找用於產生世界的種子 - \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsPlatformSpecific.xml b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsPlatformSpecific.xml index 792ad9e3..bbce63d5 100644 --- a/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsPlatformSpecific.xml +++ b/Minecraft.Client/PSVitaMedia/loc/zh-CHT/stringsPlatformSpecific.xml @@ -1,245 +1,247 @@  - - NOT USED + + 想要登入 "PSN" 嗎? - - 你可以使用 PlayStation(R)Vita 主機上的觸控螢幕來瀏覽選單! + + 若玩家使用與主持人玩家不同的 "PlayStation Vita" 主機,則對該玩家選取此選項會將該玩家及其 "PlayStation Vita" 主機上的所有其他玩家踢出遊戲。在遊戲重新開始前,此玩家無法重新加入遊戲。 - - Minecraft 的論壇上有個特別保留給 PlayStation(R)Vita Edition 的地方喔! + + SELECT - - 只要在 Twitter 上追蹤 @4JStudios 和 @Kappische 的動態,就能獲得 Minecraft 的最新消息! + + 當遊戲中或載入遊戲的存檔有啟用此選項時,將會停用獎盃及排行榜的更新功能。 - - 千萬別直接和 Enderman 對看! + + "PlayStation Vita" 主机 - - 我們認為 4J Studios 已經把 PlayStation(R)Vita 版本中的 Herobrine 拿掉了,不過我們不確定這個消息是真是假。 + + 選擇 [無線隨意網路] 來與附近的其他 "PlayStation Vita" 主機連線,或選擇 ["PSN"] 來與世界各地的好友連線。 - - Minecraft: PlayStation(R)Vita Edition 打破了許多紀錄! + + 無線隨意網路 - - {*T3*}遊戲方式:多人遊戲{*ETW*}{*B*}{*B*} -PlayStation(R)Vita 主機上的 Minecraft 預設為多人遊戲。{*B*}{*B*} -當您開始或加入線上遊戲時,您已登錄的好友就能看到您正在玩 Minecraft (除非您在主持遊戲時選取 [僅限邀請]);而當好友加入您的遊戲後,好友的好友也會看到他們正在玩 Minecraft (如果您選取了 [允許好友的好友加入] 選項)。{*B*} -當您進行遊戲時,按下 SELECT 按鈕即可讓您看到遊戲中所有其他玩家的名單,並可將玩家從遊戲中踢除。 + + 變更網路模式 - - {*T3*}遊戲方式:分享螢幕擷取畫面{*ETW*}{*B*}{*B*} -只要在暫停選單按下 {*CONTROLLER_VK_Y*} 即可拍攝螢幕擷取畫面並分享到 Facebook。您會看到螢幕擷取畫面的縮圖,還能編輯與該篇 Facebook 文章相關的文字。{*B*}{*B*} -遊戲有專為拍攝螢幕擷取畫面而設計的視角模式,可讓您看到自己角色的正面。先按下 {*CONTROLLER_ACTION_CAMERA*} 直到您看到自己角色的正面,然後按下 {*CONTROLLER_VK_Y*} 即可分享螢幕擷取畫面。{*B*}{*B*} -線上 ID 不會顯示在螢幕擷取畫面中。 + + 選取網路模式 - - {*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*} 來往右飛。 + + 分割畫面線上 ID - - 快速按兩下 {*CONTROLLER_ACTION_JUMP*} 即可飛翔,重複這個動作則可結束飛翔。飛翔時,往前快速按兩下 {*CONTROLLER_ACTION_MOVE*} 即可加快飛行的速度。 -在飛翔模式下,只要按住 {*CONTROLLER_ACTION_JUMP*} 即可往上飛,按住 {*CONTROLLER_ACTION_SNEAK*} 則可往下飛。您也可用方向鍵操控方向,往上、下、左或右飛。 + + 獎盃 - - NOT USED + + 這個遊戲有自動儲存進度的功能。當畫面出現這個圖示時,代表系統正在儲存您的遊戲資料。 +請勿在畫面出現這個圖示時關閉 "PlayStation Vita" 主機。 - - NOT USED + + 啟用此選項時,主持人可以從遊戲選單切換自己的飛翔能力、不會疲勞,或是讓自己隱形,但將會無法使用獎盃及排行榜更新功能。 - - 檢視玩家卡 - + + 線上 ID: - - 檢視玩家個人資料 - + + 您目前所使用的是試用版的材質套件。您可以使用材質套件中的完整內容,但是無法儲存遊戲進度。 +如果您嘗試在使用試用版時存檔,系統會提供選項讓您購買完整版。 - - 邀請好友 + + 修補程式 1.04 (遊戲更新 14) - - 如果您在創造模式中建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後以生存模式載入該世界,也無法改變這個情況。確定要繼續嗎? + + 遊戲中的線上 ID - - 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。確定要繼續嗎? + + 來看看我在 Minecraft: "PlayStation Vita" Edition 遊戲世界中的製作成果! - - 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。 + + 下載失敗。請稍後重試。 - - 如果您在啟用主持人特權的情況下建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後關閉那些選項並再次載入該世界,也無法改變這個情況。確定要繼續嗎? + + 由於 NAT 類型有所限制,因此無法加入遊戲。請檢查您的網路設定。 - - 與 "PSN" 的連線中斷。即將離開遊戲並返回主畫面。 + + 上傳失敗。請稍後重試。 - - 與 "PSN" 的連線中斷。 + + 下載完成! - - 這是 Minecraft: PlayStation(R)Vita Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! -解除完整版遊戲鎖定即可享受 Minecraft: PlayStation(R)Vita Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 -您想要解除完整版遊戲鎖定嗎? + + +存檔傳輸區域目前沒有可用的遊戲存檔。 +你可以使用 Minecraft:"PlayStation 3" Edition 上傳世界存檔到存檔傳輸區域,然後使用 Minecraft:"PlayStation Vita" Edition 下載該存檔。 + - - 這是 Minecraft: PlayStation(R)Vita Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個主題! -解除完整版遊戲鎖定即可享受 Minecraft: PlayStation(R)Vita Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 -您想要解除完整版遊戲鎖定嗎? + + 存檔不完整 - - 這是 Minecraft: PlayStation(R)Vita Edition 試玩版遊戲。您必須擁有完整版遊戲才能接受這個邀請。 -您想要解除完整版遊戲鎖定嗎? + + Minecraft: "PlayStation Vita" Edition 已沒有空間可用來保存資料。若要清出空間,請刪除其他的 Minecraft: "PlayStation Vita" Edition 存檔。 - - 訪客玩家無法解除完整版遊戲鎖定,請使用 Sony Entertainment Network 帳戶登入。 + + 已取消上傳 - - 線上 ID + + 您已取消將此遊戲存檔上傳至存檔傳輸區域。 - - 釀製 + + 上傳 PS3™/PS4™ 的遊戲存檔 - - 您已經被登出 "PSN",因此系統將您返回標題畫面。 + + 正在上傳資料:%d%% - - Minecraft: PlayStation(R)Vita Edition 試玩版的遊戲時間已經結束!您想要解除完整版遊戲鎖定來繼續玩這個好玩的遊戲嗎? + + "PSN" - - 無法載入「Minecraft: PlayStation(R)Vita Edition」,因此無法繼續。 + + 下載 PS3™ 存檔 - - 無法加入遊戲,因為至少有 1 位玩家受 Sony Entertainment Network 帳戶交談功能限制而無法在進行線上遊戲。 + + 正在下載資料:%d%% - - 無法建立線上遊戲,因為至少有 1 位玩家因受到 Sony Entertainment Network 帳戶交談限制而無法進行線上遊戲。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 + + 正在存檔 - - 您無法加入此遊戲階段,因為您的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。 + + 上傳完成! - - 您無法加入此遊戲階段,因為您其中一名本機玩家的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 + + 是否確定要上傳此遊戲存檔,並且覆寫存檔傳輸區域中保留的任何現有存檔? - - 您無法建立此遊戲階段,因為您其中一名本機玩家的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 + + 正在轉換資料 - - 這個遊戲有自動儲存進度的功能。當畫面出現這個圖示時,代表系統正在儲存您的遊戲資料。 -請勿在畫面出現這個圖示時關閉 PlayStation(R)Vita 主機。 + + NOT USED - - 啟用此選項時,主持人可以從遊戲選單切換自己的飛翔能力、不會疲勞,或是讓自己隱形,但將會無法使用獎盃及排行榜更新功能。 + + NOT USED - - 分割畫面線上 ID + + {*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*} 來往右飛。 - - 獎盃 + + 快速按兩下 {*CONTROLLER_ACTION_JUMP*} 即可飛翔,重複這個動作則可結束飛翔。飛翔時,往前快速按兩下 {*CONTROLLER_ACTION_MOVE*} 即可加快飛行的速度。 +在飛翔模式下,只要按住 {*CONTROLLER_ACTION_JUMP*} 即可往上飛,按住 {*CONTROLLER_ACTION_SNEAK*} 則可往下飛。您也可用方向鍵操控方向,往上、下、左或右飛。 - - 線上 ID: + + 檢視玩家卡 + - - 遊戲中的線上 ID + + 如果您在創造模式中建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後以生存模式載入該世界,也無法改變這個情況。確定要繼續嗎? - - 來看看我在 Minecraft: PlayStation(R)Vita Edition 遊戲世界中的製作成果! + + 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。確定要繼續嗎? - - 您目前所使用的是試用版的材質套件。您可以使用材質套件中的完整內容,但是無法儲存遊戲進度。 -如果您嘗試在使用試用版時存檔,系統會提供選項讓您購買完整版。 + + 檢視玩家個人資料 - - 修補程式 1.04 (遊戲更新 14) + + 邀請好友 - - SELECT + + Minecraft 的論壇上有個特別保留給 "PlayStation Vita" Edition 的地方喔! - - 當遊戲中或載入遊戲的存檔有啟用此選項時,將會停用獎盃及排行榜的更新功能。 + + 只要在 Twitter 上追蹤 @4JStudios 和 @Kappische 的動態,就能獲得 Minecraft 的最新消息! - - 想要登入 "PSN" 嗎? + + NOT USED - - 若玩家使用與主持人玩家不同的 PlayStation(R)Vita 主機,則對該玩家選取此選項會將該玩家及其 PlayStation(R)Vita 主機上的所有其他玩家踢出遊戲。在遊戲重新開始前,此玩家無法重新加入遊戲。 + + 你可以使用 "PlayStation Vita" 主機上的觸控螢幕來瀏覽選單! - - PlayStation(R)Vita 主机 + + 千萬別直接和 Enderman 對看! - - 變更網路模式 + + {*T3*}遊戲方式:多人遊戲{*ETW*}{*B*}{*B*} +"PlayStation Vita" 主機上的 Minecraft 預設為多人遊戲。{*B*}{*B*} +當您開始或加入線上遊戲時,您已登錄的好友就能看到您正在玩 Minecraft (除非您在主持遊戲時選取 [僅限邀請]);而當好友加入您的遊戲後,好友的好友也會看到他們正在玩 Minecraft (如果您選取了 [允許好友的好友加入] 選項)。{*B*} +當您進行遊戲時,按下 SELECT 按鈕即可讓您看到遊戲中所有其他玩家的名單,並可將玩家從遊戲中踢除。 - - 選取網路模式 + + {*T3*}遊戲方式:分享螢幕擷取畫面{*ETW*}{*B*}{*B*} +只要在暫停選單按下 {*CONTROLLER_VK_Y*} 即可拍攝螢幕擷取畫面並分享到 Facebook。您會看到螢幕擷取畫面的縮圖,還能編輯與該篇 Facebook 文章相關的文字。{*B*}{*B*} +遊戲有專為拍攝螢幕擷取畫面而設計的視角模式,可讓您看到自己角色的正面。先按下 {*CONTROLLER_ACTION_CAMERA*} 直到您看到自己角色的正面,然後按下 {*CONTROLLER_VK_Y*} 即可分享螢幕擷取畫面。{*B*}{*B*} +線上 ID 不會顯示在螢幕擷取畫面中。 - - 選擇 [無線隨意網路] 來與附近的其他 PlayStation(R)Vita 主機連線,或選擇 ["PSN"] 來與世界各地的好友連線。 + + 我們認為 4J Studios 已經把 "PlayStation Vita" 版本中的 Herobrine 拿掉了,不過我們不確定這個消息是真是假。 - - 無線隨意網路 + + Minecraft: "PlayStation Vita" Edition 打破了許多紀錄! - - "PSN" + + Minecraft: "PlayStation Vita" Edition 試玩版的遊戲時間已經結束!您想要解除完整版遊戲鎖定來繼續玩這個好玩的遊戲嗎? - - 下載 PlayStation(R)3 存檔 + + 無法載入「Minecraft: PlayStation(R)Vita Edition」,因此無法繼續。 - - 上傳 PlayStation(R)3/PlayStation(R)4 的遊戲存檔 + + 釀製 - - 已取消上傳 + + 您已經被登出 "PSN",因此系統將您返回標題畫面。 - - 您已取消將此遊戲存檔上傳至存檔傳輸區域。 + + 無法加入遊戲,因為至少有 1 位玩家受 Sony Entertainment Network 帳戶交談功能限制而無法在進行線上遊戲。 - - 正在上傳資料:%d%% + + 您無法加入此遊戲階段,因為您其中一名本機玩家的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 - - 正在下載資料:%d%% + + 您無法建立此遊戲階段,因為您其中一名本機玩家的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 - - 是否確定要上傳此遊戲存檔,並且覆寫存檔傳輸區域中保留的任何現有存檔? + + 無法建立線上遊戲,因為至少有 1 位玩家因受到 Sony Entertainment Network 帳戶交談限制而無法進行線上遊戲。請取消核取 [更多選項] 中的 [線上遊戲] 方塊來開始進行離線遊戲。 - - 正在轉換資料 + + 您無法加入此遊戲階段,因為您的 Sony Entertainment Network 帳戶受到交談限制而停用線上功能。 - - 正在存檔 + + 與 "PSN" 的連線中斷。即將離開遊戲並返回主畫面。 - - 上傳完成! + + 與 "PSN" 的連線中斷。 - - 上傳失敗。請稍後重試。 + + 您已經在創造模式中將這個世界存檔,因此其獎盃及排行榜更新功能將無法使用。 - - 下載完成! + + 如果您在啟用主持人特權的情況下建立、載入或儲存世界資料,該世界的獎盃及排行榜更新功能將無法使用,即使您之後關閉那些選項並再次載入該世界,也無法改變這個情況。確定要繼續嗎? - - 下載失敗。請稍後重試。 + + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個獎盃! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation Vita" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 +您想要解除完整版遊戲鎖定嗎? - - 由於 NAT 類型有所限制,因此無法加入遊戲。請檢查您的網路設定。 + + 訪客玩家無法解除完整版遊戲鎖定,請使用 Sony Entertainment Network 帳戶登入。 - - - 存檔傳輸區域目前沒有可用的遊戲存檔。 - 您可以使用 Minecraft: PlayStation(R)3 Edition 上傳世界存檔到存檔傳輸區域,然後使用 Minecraft: PlayStation(R)Vita Edition 下載該存檔。 - + + 線上 ID - - 存檔不完整 + + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。如果您擁有完整版遊戲,那您剛剛會獲得 1 個主題! +解除完整版遊戲鎖定即可享受 Minecraft: "PlayStation Vita" Edition 的完整樂趣,而且還能透過 "PSN" 與世界各地的好友一起玩遊戲。 +您想要解除完整版遊戲鎖定嗎? - - Minecraft: PlayStation(R)Vita Edition 已沒有空間可用來保存資料。若要清出空間,請刪除其他的 Minecraft: PlayStation(R)Vita Edition 存檔。 + + 這是 Minecraft: "PlayStation Vita" Edition 試玩版遊戲。您必須擁有完整版遊戲才能接受這個邀請。 +您想要解除完整版遊戲鎖定嗎? + + + Minecraft: PlayStation(R)Vita Edition 不支援位於存檔傳輸區域中的存檔文件的版本號。 \ No newline at end of file diff --git a/Minecraft.Client/PSVitaMedia/strings.h b/Minecraft.Client/PSVitaMedia/strings.h index c8360ba5..cae249bf 100644 --- a/Minecraft.Client/PSVitaMedia/strings.h +++ b/Minecraft.Client/PSVitaMedia/strings.h @@ -3,1971 +3,2280 @@ #define IDS_ACHIEVEMENTS 1 #define IDS_ACTION_BAN_LEVEL_DESCRIPTION 2 #define IDS_ACTION_BAN_LEVEL_TITLE 3 -#define IDS_ALLOWFRIENDSOFFRIENDS 4 -#define IDS_ANY_WOOL 5 -#define IDS_AUDIO 6 -#define IDS_AUTOSAVE_COUNTDOWN 7 -#define IDS_AWARD_GAMERPIC1 8 -#define IDS_AWARD_GAMERPIC2 9 -#define IDS_AWARD_TITLE 10 -#define IDS_BACK 11 -#define IDS_BACK_BUTTON 12 -#define IDS_BANNED_LEVEL_TITLE 13 -#define IDS_BLAZE 14 -#define IDS_BONUS_CHEST 15 -#define IDS_BOSS_ENDERDRAGON_HEALTH 16 -#define IDS_BREWING_STAND 17 -#define IDS_BUTTON_REMOVE_FROM_BAN_LIST 18 -#define IDS_CAN_ATTACK_ANIMALS 19 -#define IDS_CAN_ATTACK_PLAYERS 20 -#define IDS_CAN_BUILD_AND_MINE 21 -#define IDS_CAN_DISABLE_EXHAUSTION 22 -#define IDS_CAN_FLY 23 -#define IDS_CAN_INVISIBLE 24 -#define IDS_CAN_OPEN_CONTAINERS 25 -#define IDS_CAN_USE_DOORS_AND_SWITCHES 26 -#define IDS_CANCEL 27 -#define IDS_CANCEL_UPLOAD_TEXT 28 -#define IDS_CANCEL_UPLOAD_TITLE 29 -#define IDS_CANT_PLACE_NEAR_SPAWN_TEXT 30 -#define IDS_CANT_PLACE_NEAR_SPAWN_TITLE 31 -#define IDS_CANT_SHEAR_MOOSHROOM 32 -#define IDS_CANT_SPAWN_IN_PEACEFUL 33 -#define IDS_CANTJOIN_TITLE 34 -#define IDS_CARROTS 35 -#define IDS_CAVE_SPIDER 36 -#define IDS_CHANGE_SKIN 37 -#define IDS_CHAT_RESTRICTION_UGC 38 -#define IDS_CHECKBOX_ANIMATED_CHARACTER 39 -#define IDS_CHECKBOX_CUSTOM_SKIN_ANIM 40 -#define IDS_CHECKBOX_DEATH_MESSAGES 41 -#define IDS_CHECKBOX_DISPLAY_HAND 42 -#define IDS_CHECKBOX_DISPLAY_HUD 43 -#define IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS 44 -#define IDS_CHECKBOX_RENDER_BEDROCKFOG 45 -#define IDS_CHECKBOX_RENDER_CLOUDS 46 -#define IDS_CHECKBOX_VERTICAL_SPLIT_SCREEN 47 -#define IDS_CHEST 48 -#define IDS_CHEST_LARGE 49 -#define IDS_CHICKEN 50 -#define IDS_COMMAND_TELEPORT_ME 51 -#define IDS_COMMAND_TELEPORT_SUCCESS 52 -#define IDS_COMMAND_TELEPORT_TO_ME 53 -#define IDS_CONFIRM_CANCEL 54 -#define IDS_CONFIRM_DECLINE_SAVE_GAME 55 -#define IDS_CONFIRM_EXIT_GAME 56 -#define IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE 57 -#define IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST 58 -#define IDS_CONFIRM_LEAVE_VIA_INVITE 59 -#define IDS_CONFIRM_OK 60 -#define IDS_CONFIRM_SAVE_GAME 61 -#define IDS_CONFIRM_START_CREATIVE 62 -#define IDS_CONFIRM_START_HOST_PRIVILEGES 63 -#define IDS_CONFIRM_START_SAVEDINCREATIVE 64 -#define IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE 65 -#define IDS_CONNECTION_FAILED 66 -#define IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN 67 -#define IDS_CONNECTION_LOST 68 -#define IDS_CONNECTION_LOST_LIVE 69 -#define IDS_CONNECTION_LOST_LIVE_NO_EXIT 70 -#define IDS_CONNECTION_LOST_SERVER 71 -#define IDS_CONTENT_RESTRICTION 72 -#define IDS_CONTENT_RESTRICTION_MULTIPLAYER 73 -#define IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE 74 -#define IDS_CONTROL 75 -#define IDS_CONTROLER_DISCONNECT_TEXT 76 -#define IDS_CONTROLER_DISCONNECT_TITLE 77 -#define IDS_CONTROLLER_A 78 -#define IDS_CONTROLLER_B 79 -#define IDS_CONTROLLER_BACK 80 -#define IDS_CONTROLLER_DPAD_D 81 -#define IDS_CONTROLLER_DPAD_L 82 -#define IDS_CONTROLLER_DPAD_R 83 -#define IDS_CONTROLLER_DPAD_U 84 -#define IDS_CONTROLLER_LEFT_BUMPER 85 -#define IDS_CONTROLLER_LEFT_STICK 86 -#define IDS_CONTROLLER_LEFT_THUMBSTICK 87 -#define IDS_CONTROLLER_LEFT_TRIGGER 88 -#define IDS_CONTROLLER_RIGHT_BUMPER 89 -#define IDS_CONTROLLER_RIGHT_STICK 90 -#define IDS_CONTROLLER_RIGHT_THUMBSTICK 91 -#define IDS_CONTROLLER_RIGHT_TRIGGER 92 -#define IDS_CONTROLLER_START 93 -#define IDS_CONTROLLER_X 94 -#define IDS_CONTROLLER_Y 95 -#define IDS_CONTROLS 96 -#define IDS_CONTROLS_ACTION 97 -#define IDS_CONTROLS_CRAFTING 98 -#define IDS_CONTROLS_DPAD 99 -#define IDS_CONTROLS_DROP 100 -#define IDS_CONTROLS_HELDITEM 101 -#define IDS_CONTROLS_INVENTORY 102 -#define IDS_CONTROLS_JUMP 103 -#define IDS_CONTROLS_JUMPFLY 104 -#define IDS_CONTROLS_LAYOUT 105 -#define IDS_CONTROLS_LOOK 106 -#define IDS_CONTROLS_MOVE 107 -#define IDS_CONTROLS_PAUSE 108 -#define IDS_CONTROLS_PLAYERS 109 -#define IDS_CONTROLS_SCHEME0 110 -#define IDS_CONTROLS_SCHEME1 111 -#define IDS_CONTROLS_SCHEME2 112 -#define IDS_CONTROLS_SNEAK 113 -#define IDS_CONTROLS_SNEAKFLY 114 -#define IDS_CONTROLS_THIRDPERSON 115 -#define IDS_CONTROLS_USE 116 -#define IDS_CORRUPT_DLC 117 -#define IDS_CORRUPT_DLC_MULTIPLE 118 -#define IDS_CORRUPT_DLC_TITLE 119 -#define IDS_CORRUPT_FILE 120 -#define IDS_CORRUPT_OPTIONS 121 -#define IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT 122 -#define IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE 123 -#define IDS_CORRUPT_SAVECACHE 124 -#define IDS_CORRUPTSAVE_TEXT 125 -#define IDS_CORRUPTSAVE_TITLE 126 -#define IDS_COW 127 -#define IDS_CREATE_NEW_WORLD 128 -#define IDS_CREATE_NEW_WORLD_RANDOM_SEED 129 -#define IDS_CREATE_NEW_WORLD_SEED 130 -#define IDS_CREATE_NEW_WORLD_SEEDTEXT 131 -#define IDS_CREATEANEWSAVE 132 -#define IDS_CREATED_IN_CREATIVE 133 -#define IDS_CREATED_IN_SURVIVAL 134 -#define IDS_CREATIVE 135 -#define IDS_CREDITS 136 -#define IDS_CREDITS_ADDITIONALSTE 137 -#define IDS_CREDITS_ART 138 -#define IDS_CREDITS_ARTDEVELOPER 139 -#define IDS_CREDITS_ASIALOC 140 -#define IDS_CREDITS_BIZDEV 141 -#define IDS_CREDITS_BULLYCOORD 142 -#define IDS_CREDITS_CEO 143 -#define IDS_CREDITS_CHIEFARCHITECT 144 -#define IDS_CREDITS_CODENINJA 145 -#define IDS_CREDITS_COMMUNITYMANAGER 146 -#define IDS_CREDITS_CONCEPTART 147 -#define IDS_CREDITS_CRUNCHER 148 -#define IDS_CREDITS_CUSTOMERSUPPORT 149 -#define IDS_CREDITS_DESIGNTEAM 150 -#define IDS_CREDITS_DESPROG 151 -#define IDS_CREDITS_DEVELOPER 152 -#define IDS_CREDITS_DEVELOPMENTTEAM 153 -#define IDS_CREDITS_DOF 154 -#define IDS_CREDITS_EUROPELOC 155 -#define IDS_CREDITS_EXECPRODUCER 156 -#define IDS_CREDITS_EXPLODANIM 157 -#define IDS_CREDITS_GAMECRAFTER 158 -#define IDS_CREDITS_JON_KAGSTROM 159 -#define IDS_CREDITS_LEADPC 160 -#define IDS_CREDITS_LEADPRODUCER 161 -#define IDS_CREDITS_LEADTESTER 162 -#define IDS_CREDITS_MARKETING 163 -#define IDS_CREDITS_MGSCENTRAL 164 -#define IDS_CREDITS_MILESTONEACCEPT 165 -#define IDS_CREDITS_MUSICANDSOUNDS 166 -#define IDS_CREDITS_OFFICEDJ 167 -#define IDS_CREDITS_ORIGINALDESIGN 168 -#define IDS_CREDITS_PMPROD 169 -#define IDS_CREDITS_PORTFOLIODIRECTOR 170 -#define IDS_CREDITS_PRODUCER 171 -#define IDS_CREDITS_PRODUCTMANAGER 172 -#define IDS_CREDITS_PROGRAMMING 173 -#define IDS_CREDITS_PROJECT 174 -#define IDS_CREDITS_QA 175 -#define IDS_CREDITS_REDMONDLOC 176 -#define IDS_CREDITS_RELEASEMANAGEMENT 177 -#define IDS_CREDITS_RESTOFMOJANG 178 -#define IDS_CREDITS_RISE_LUGO 179 -#define IDS_CREDITS_SDET 180 -#define IDS_CREDITS_SPECIALTHANKS 181 -#define IDS_CREDITS_SRTESTLEAD 182 -#define IDS_CREDITS_TESTASSOCIATES 183 -#define IDS_CREDITS_TESTLEAD 184 -#define IDS_CREDITS_TESTMANAGER 185 -#define IDS_CREDITS_TOBIAS_MOLLSTAM 186 -#define IDS_CREDITS_USERRESEARCH 187 -#define IDS_CREDITS_WCW 188 -#define IDS_CREDITS_XBLADIRECTOR 189 -#define IDS_CREEPER 190 -#define IDS_CURRENT_LAYOUT 191 -#define IDS_DEATH_ARROW 192 -#define IDS_DEATH_CACTUS 193 -#define IDS_DEATH_DRAGON_BREATH 194 -#define IDS_DEATH_DROWN 195 -#define IDS_DEATH_EXPLOSION 196 -#define IDS_DEATH_FALL 197 -#define IDS_DEATH_FALLING_ANVIL 198 -#define IDS_DEATH_FALLING_TILE 199 -#define IDS_DEATH_FIREBALL 200 -#define IDS_DEATH_GENERIC 201 -#define IDS_DEATH_INDIRECT_MAGIC 202 -#define IDS_DEATH_INFIRE 203 -#define IDS_DEATH_INWALL 204 -#define IDS_DEATH_LAVA 205 -#define IDS_DEATH_MAGIC 206 -#define IDS_DEATH_MOB 207 -#define IDS_DEATH_ONFIRE 208 -#define IDS_DEATH_OUTOFWORLD 209 -#define IDS_DEATH_PLAYER 210 -#define IDS_DEATH_STARVE 211 -#define IDS_DEATH_THORNS 212 -#define IDS_DEATH_THROWN 213 -#define IDS_DEBUG_SETTINGS 214 -#define IDS_DEFAULT_SAVENAME 215 -#define IDS_DEFAULT_SKINS 216 -#define IDS_DEFAULT_TEXTUREPACK 217 -#define IDS_DEFAULT_WORLD_NAME 218 -#define IDS_DEFAULTS_TEXT 219 -#define IDS_DEFAULTS_TITLE 220 -#define IDS_DESC_ANVIL 221 -#define IDS_DESC_APPLE 222 -#define IDS_DESC_ARROW 223 -#define IDS_DESC_BED 224 -#define IDS_DESC_BEDROCK 225 -#define IDS_DESC_BEEF_COOKED 226 -#define IDS_DESC_BEEF_RAW 227 -#define IDS_DESC_BLAZE 228 -#define IDS_DESC_BLAZE_POWDER 229 -#define IDS_DESC_BLAZE_ROD 230 -#define IDS_DESC_BLOCK 231 -#define IDS_DESC_BLOCK_DIAMOND 232 -#define IDS_DESC_BLOCK_GOLD 233 -#define IDS_DESC_BLOCK_IRON 234 -#define IDS_DESC_BLOCK_LAPIS 235 -#define IDS_DESC_BOAT 236 -#define IDS_DESC_BONE 237 -#define IDS_DESC_BOOK 238 -#define IDS_DESC_BOOKSHELF 239 -#define IDS_DESC_BOOTS 240 -#define IDS_DESC_BOOTS_CHAIN 241 -#define IDS_DESC_BOOTS_DIAMOND 242 -#define IDS_DESC_BOOTS_GOLD 243 -#define IDS_DESC_BOOTS_IRON 244 -#define IDS_DESC_BOOTS_LEATHER 245 -#define IDS_DESC_BOW 246 -#define IDS_DESC_BOWL 247 -#define IDS_DESC_BREAD 248 -#define IDS_DESC_BREWING_STAND 249 -#define IDS_DESC_BRICK 250 -#define IDS_DESC_BUCKET 251 -#define IDS_DESC_BUCKET_LAVA 252 -#define IDS_DESC_BUCKET_MILK 253 -#define IDS_DESC_BUCKET_WATER 254 -#define IDS_DESC_BUTTON 255 -#define IDS_DESC_CACTUS 256 -#define IDS_DESC_CAKE 257 -#define IDS_DESC_CARPET 258 -#define IDS_DESC_CARROT_GOLDEN 259 -#define IDS_DESC_CARROT_ON_A_STICK 260 -#define IDS_DESC_CARROTS 261 -#define IDS_DESC_CAULDRON 262 -#define IDS_DESC_CAVE_SPIDER 263 -#define IDS_DESC_CHEST 264 -#define IDS_DESC_CHESTPLATE 265 -#define IDS_DESC_CHESTPLATE_CHAIN 266 -#define IDS_DESC_CHESTPLATE_DIAMOND 267 -#define IDS_DESC_CHESTPLATE_GOLD 268 -#define IDS_DESC_CHESTPLATE_IRON 269 -#define IDS_DESC_CHESTPLATE_LEATHER 270 -#define IDS_DESC_CHICKEN 271 -#define IDS_DESC_CHICKEN_COOKED 272 -#define IDS_DESC_CHICKEN_RAW 273 -#define IDS_DESC_CLAY 274 -#define IDS_DESC_CLAY_TILE 275 -#define IDS_DESC_CLOCK 276 -#define IDS_DESC_COAL 277 -#define IDS_DESC_COBBLESTONE_WALL 278 -#define IDS_DESC_COCOA 279 -#define IDS_DESC_COMPASS 280 -#define IDS_DESC_COOKIE 281 -#define IDS_DESC_COW 282 -#define IDS_DESC_CRAFTINGTABLE 283 -#define IDS_DESC_CREEPER 284 -#define IDS_DESC_CROPS 285 -#define IDS_DESC_DEAD_BUSH 286 -#define IDS_DESC_DETECTORRAIL 287 -#define IDS_DESC_DIAMONDS 288 -#define IDS_DESC_DIRT 289 -#define IDS_DESC_DISPENSER 290 -#define IDS_DESC_DOOR_IRON 291 -#define IDS_DESC_DOOR_WOOD 292 -#define IDS_DESC_DRAGONEGG 293 -#define IDS_DESC_DYE_BLACK 294 -#define IDS_DESC_DYE_BLUE 295 -#define IDS_DESC_DYE_BROWN 296 -#define IDS_DESC_DYE_CYAN 297 -#define IDS_DESC_DYE_GRAY 298 -#define IDS_DESC_DYE_GREEN 299 -#define IDS_DESC_DYE_LIGHTBLUE 300 -#define IDS_DESC_DYE_LIGHTGRAY 301 -#define IDS_DESC_DYE_LIME 302 -#define IDS_DESC_DYE_MAGENTA 303 -#define IDS_DESC_DYE_ORANGE 304 -#define IDS_DESC_DYE_PINK 305 -#define IDS_DESC_DYE_PURPLE 306 -#define IDS_DESC_DYE_RED 307 -#define IDS_DESC_DYE_SILVER 308 -#define IDS_DESC_DYE_WHITE 309 -#define IDS_DESC_DYE_YELLOW 310 -#define IDS_DESC_EGG 311 -#define IDS_DESC_EMERALD 312 -#define IDS_DESC_EMERALDBLOCK 313 -#define IDS_DESC_EMERALDORE 314 -#define IDS_DESC_ENCHANTED_BOOK 315 -#define IDS_DESC_ENCHANTED_GOLDENAPPLE 316 -#define IDS_DESC_ENCHANTMENTTABLE 317 -#define IDS_DESC_END_PORTAL 318 -#define IDS_DESC_ENDER_PEARL 319 -#define IDS_DESC_ENDERCHEST 320 -#define IDS_DESC_ENDERDRAGON 321 -#define IDS_DESC_ENDERMAN 322 -#define IDS_DESC_ENDPORTALFRAME 323 -#define IDS_DESC_EXP_BOTTLE 324 -#define IDS_DESC_EYE_OF_ENDER 325 -#define IDS_DESC_FARMLAND 326 -#define IDS_DESC_FEATHER 327 -#define IDS_DESC_FENCE 328 -#define IDS_DESC_FENCE_GATE 329 -#define IDS_DESC_FERMENTED_SPIDER_EYE 330 -#define IDS_DESC_FIREBALL 331 -#define IDS_DESC_FISH_COOKED 332 -#define IDS_DESC_FISH_RAW 333 -#define IDS_DESC_FISHINGROD 334 -#define IDS_DESC_FLINT 335 -#define IDS_DESC_FLINTANDSTEEL 336 -#define IDS_DESC_FLOWER 337 -#define IDS_DESC_FLOWERPOT 338 -#define IDS_DESC_FURNACE 339 -#define IDS_DESC_GHAST 340 -#define IDS_DESC_GHAST_TEAR 341 -#define IDS_DESC_GLASS 342 -#define IDS_DESC_GLASS_BOTTLE 343 -#define IDS_DESC_GLOWSTONE 344 -#define IDS_DESC_GOLD_NUGGET 345 -#define IDS_DESC_GOLDENAPPLE 346 -#define IDS_DESC_GRASS 347 -#define IDS_DESC_GRAVEL 348 -#define IDS_DESC_HALFSLAB 349 -#define IDS_DESC_HATCHET 350 -#define IDS_DESC_HELL_ROCK 351 -#define IDS_DESC_HELL_SAND 352 -#define IDS_DESC_HELMET 353 -#define IDS_DESC_HELMET_CHAIN 354 -#define IDS_DESC_HELMET_DIAMOND 355 -#define IDS_DESC_HELMET_GOLD 356 -#define IDS_DESC_HELMET_IRON 357 -#define IDS_DESC_HELMET_LEATHER 358 -#define IDS_DESC_HOE 359 -#define IDS_DESC_ICE 360 -#define IDS_DESC_INGOT 361 -#define IDS_DESC_IRON_FENCE 362 -#define IDS_DESC_IRONGOLEM 363 -#define IDS_DESC_ITEM_NETHERBRICK 364 -#define IDS_DESC_ITEMFRAME 365 -#define IDS_DESC_JACKOLANTERN 366 -#define IDS_DESC_JUKEBOX 367 -#define IDS_DESC_LADDER 368 -#define IDS_DESC_LAVA 369 -#define IDS_DESC_LAVA_SLIME 370 -#define IDS_DESC_LEATHER 371 -#define IDS_DESC_LEAVES 372 -#define IDS_DESC_LEGGINGS 373 -#define IDS_DESC_LEGGINGS_CHAIN 374 -#define IDS_DESC_LEGGINGS_DIAMOND 375 -#define IDS_DESC_LEGGINGS_GOLD 376 -#define IDS_DESC_LEGGINGS_IRON 377 -#define IDS_DESC_LEGGINGS_LEATHER 378 -#define IDS_DESC_LEVER 379 -#define IDS_DESC_LOG 380 -#define IDS_DESC_MAGMA_CREAM 381 -#define IDS_DESC_MAP 382 -#define IDS_DESC_MELON_BLOCK 383 -#define IDS_DESC_MELON_SEEDS 384 -#define IDS_DESC_MELON_SLICE 385 -#define IDS_DESC_MINECART 386 -#define IDS_DESC_MINECARTWITHCHEST 387 -#define IDS_DESC_MINECARTWITHFURNACE 388 -#define IDS_DESC_MOB_SPAWNER 389 -#define IDS_DESC_MONSTER_SPAWNER 390 -#define IDS_DESC_MOSS_STONE 391 -#define IDS_DESC_MUSHROOM 392 -#define IDS_DESC_MUSHROOM_COW 393 -#define IDS_DESC_MUSHROOMSTEW 394 -#define IDS_DESC_MYCEL 395 -#define IDS_DESC_NETHER_QUARTZ 396 -#define IDS_DESC_NETHER_QUARTZ_ORE 397 -#define IDS_DESC_NETHER_STALK_SEEDS 398 -#define IDS_DESC_NETHERBRICK 399 -#define IDS_DESC_NETHERFENCE 400 -#define IDS_DESC_NETHERSTALK 401 -#define IDS_DESC_NOTEBLOCK 402 -#define IDS_DESC_OBSIDIAN 403 -#define IDS_DESC_ORE_COAL 404 -#define IDS_DESC_ORE_DIAMOND 405 -#define IDS_DESC_ORE_GOLD 406 -#define IDS_DESC_ORE_IRON 407 -#define IDS_DESC_ORE_LAPIS 408 -#define IDS_DESC_ORE_REDSTONE 409 -#define IDS_DESC_OZELOT 410 -#define IDS_DESC_PAPER 411 -#define IDS_DESC_PICKAXE 412 -#define IDS_DESC_PICTURE 413 -#define IDS_DESC_PIG 414 -#define IDS_DESC_PIGZOMBIE 415 -#define IDS_DESC_PISTON 416 -#define IDS_DESC_PORKCHOP_COOKED 417 -#define IDS_DESC_PORKCHOP_RAW 418 -#define IDS_DESC_PORTAL 419 -#define IDS_DESC_POTATO 420 -#define IDS_DESC_POTATO_BAKED 421 -#define IDS_DESC_POTATO_POISONOUS 422 -#define IDS_DESC_POTION 423 -#define IDS_DESC_POWEREDRAIL 424 -#define IDS_DESC_PRESSUREPLATE 425 -#define IDS_DESC_PUMPKIN 426 -#define IDS_DESC_PUMPKIN_PIE 427 -#define IDS_DESC_PUMPKIN_SEEDS 428 -#define IDS_DESC_QUARTZ_BLOCK 429 -#define IDS_DESC_RAIL 430 -#define IDS_DESC_RECORD 431 -#define IDS_DESC_REDSTONE_DUST 432 -#define IDS_DESC_REDSTONE_LIGHT 433 -#define IDS_DESC_REDSTONEREPEATER 434 -#define IDS_DESC_REDSTONETORCH 435 -#define IDS_DESC_REEDS 436 -#define IDS_DESC_ROTTEN_FLESH 437 -#define IDS_DESC_SADDLE 438 -#define IDS_DESC_SAND 439 -#define IDS_DESC_SANDSTONE 440 -#define IDS_DESC_SAPLING 441 -#define IDS_DESC_SHEARS 442 -#define IDS_DESC_SHEEP 443 -#define IDS_DESC_SHOVEL 444 -#define IDS_DESC_SIGN 445 -#define IDS_DESC_SILVERFISH 446 -#define IDS_DESC_SKELETON 447 -#define IDS_DESC_SKULL 448 -#define IDS_DESC_SLAB 449 -#define IDS_DESC_SLIME 450 -#define IDS_DESC_SLIMEBALL 451 -#define IDS_DESC_SNOW 452 -#define IDS_DESC_SNOWBALL 453 -#define IDS_DESC_SNOWMAN 454 -#define IDS_DESC_SPECKLED_MELON 455 -#define IDS_DESC_SPIDER 456 -#define IDS_DESC_SPIDER_EYE 457 -#define IDS_DESC_SPONGE 458 -#define IDS_DESC_SQUID 459 -#define IDS_DESC_STAIRS 460 -#define IDS_DESC_STICK 461 -#define IDS_DESC_STICKY_PISTON 462 -#define IDS_DESC_STONE 463 -#define IDS_DESC_STONE_BRICK 464 -#define IDS_DESC_STONE_BRICK_SMOOTH 465 -#define IDS_DESC_STONE_SILVERFISH 466 -#define IDS_DESC_STONESLAB 467 -#define IDS_DESC_STRING 468 -#define IDS_DESC_STRUCTBLOCK 469 -#define IDS_DESC_SUGAR 470 -#define IDS_DESC_SULPHUR 471 -#define IDS_DESC_SWORD 472 -#define IDS_DESC_TALL_GRASS 473 -#define IDS_DESC_THIN_GLASS 474 -#define IDS_DESC_TNT 475 -#define IDS_DESC_TOP_SNOW 476 -#define IDS_DESC_TORCH 477 -#define IDS_DESC_TRAPDOOR 478 -#define IDS_DESC_TRIPWIRE 479 -#define IDS_DESC_TRIPWIRE_SOURCE 480 -#define IDS_DESC_VILLAGER 481 -#define IDS_DESC_VINE 482 -#define IDS_DESC_WATER 483 -#define IDS_DESC_WATERLILY 484 -#define IDS_DESC_WEB 485 -#define IDS_DESC_WHEAT 486 -#define IDS_DESC_WHEAT_SEEDS 487 -#define IDS_DESC_WHITESTONE 488 -#define IDS_DESC_WOLF 489 -#define IDS_DESC_WOODENPLANKS 490 -#define IDS_DESC_WOODSLAB 491 -#define IDS_DESC_WOOL 492 -#define IDS_DESC_WOOLSTRING 493 -#define IDS_DESC_YELLOW_DUST 494 -#define IDS_DESC_ZOMBIE 495 -#define IDS_DEVICEGONE_TITLE 496 -#define IDS_DIFFICULTY_EASY 497 -#define IDS_DIFFICULTY_HARD 498 -#define IDS_DIFFICULTY_NORMAL 499 -#define IDS_DIFFICULTY_PEACEFUL 500 -#define IDS_DIFFICULTY_TITLE_EASY 501 -#define IDS_DIFFICULTY_TITLE_HARD 502 -#define IDS_DIFFICULTY_TITLE_NORMAL 503 -#define IDS_DIFFICULTY_TITLE_PEACEFUL 504 -#define IDS_DISABLE_EXHAUSTION 505 -#define IDS_DISCONNECTED 506 -#define IDS_DISCONNECTED_BANNED 507 -#define IDS_DISCONNECTED_CLIENT_OLD 508 -#define IDS_DISCONNECTED_FLYING 509 -#define IDS_DISCONNECTED_KICKED 510 -#define IDS_DISCONNECTED_LOGIN_TOO_LONG 511 -#define IDS_DISCONNECTED_NAT_TYPE_MISMATCH 512 -#define IDS_DISCONNECTED_NO_FRIENDS_IN_GAME 513 -#define IDS_DISCONNECTED_SERVER_FULL 514 -#define IDS_DISCONNECTED_SERVER_OLD 515 -#define IDS_DISCONNECTED_SERVER_QUIT 516 -#define IDS_DISPENSER 517 -#define IDS_DLC_COST 518 -#define IDS_DLC_MENU_AVATARITEMS 519 -#define IDS_DLC_MENU_GAMERPICS 520 -#define IDS_DLC_MENU_MASHUPPACKS 521 -#define IDS_DLC_MENU_SKINPACKS 522 -#define IDS_DLC_MENU_TEXTUREPACKS 523 -#define IDS_DLC_MENU_THEMES 524 -#define IDS_DLC_PRICE_FREE 525 -#define IDS_DLC_TEXTUREPACK_GET_FULL_TITLE 526 -#define IDS_DLC_TEXTUREPACK_GET_TRIAL_TITLE 527 -#define IDS_DLC_TEXTUREPACK_NOT_PRESENT 528 -#define IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE 529 -#define IDS_DLC_TEXTUREPACK_UNLOCK_TITLE 530 -#define IDS_DONE 531 -#define IDS_DONT_RESET_NETHER 532 -#define IDS_DOWNLOADABLE_CONTENT_OFFERS 533 -#define IDS_DOWNLOADABLECONTENT 534 -#define IDS_DYNAFONT 535 -#define IDS_EDIT_SIGN_MESSAGE 536 -#define IDS_ENABLE_TELEPORT 537 -#define IDS_ENCHANT 538 -#define IDS_ENCHANTMENT_ARROW_DAMAGE 539 -#define IDS_ENCHANTMENT_ARROW_FIRE 540 -#define IDS_ENCHANTMENT_ARROW_INFINITE 541 -#define IDS_ENCHANTMENT_ARROW_KNOCKBACK 542 -#define IDS_ENCHANTMENT_DAMAGE_ALL 543 -#define IDS_ENCHANTMENT_DAMAGE_ARTHROPODS 544 -#define IDS_ENCHANTMENT_DAMAGE_UNDEAD 545 -#define IDS_ENCHANTMENT_DIGGING 546 -#define IDS_ENCHANTMENT_DURABILITY 547 -#define IDS_ENCHANTMENT_FIRE 548 -#define IDS_ENCHANTMENT_KNOCKBACK 549 -#define IDS_ENCHANTMENT_LEVEL_1 550 -#define IDS_ENCHANTMENT_LEVEL_10 551 -#define IDS_ENCHANTMENT_LEVEL_2 552 -#define IDS_ENCHANTMENT_LEVEL_3 553 -#define IDS_ENCHANTMENT_LEVEL_4 554 -#define IDS_ENCHANTMENT_LEVEL_5 555 -#define IDS_ENCHANTMENT_LEVEL_6 556 -#define IDS_ENCHANTMENT_LEVEL_7 557 -#define IDS_ENCHANTMENT_LEVEL_8 558 -#define IDS_ENCHANTMENT_LEVEL_9 559 -#define IDS_ENCHANTMENT_LOOT_BONUS 560 -#define IDS_ENCHANTMENT_LOOT_BONUS_DIGGER 561 -#define IDS_ENCHANTMENT_OXYGEN 562 -#define IDS_ENCHANTMENT_PROTECT_ALL 563 -#define IDS_ENCHANTMENT_PROTECT_EXPLOSION 564 -#define IDS_ENCHANTMENT_PROTECT_FALL 565 -#define IDS_ENCHANTMENT_PROTECT_FIRE 566 -#define IDS_ENCHANTMENT_PROTECT_PROJECTILE 567 -#define IDS_ENCHANTMENT_THORNS 568 -#define IDS_ENCHANTMENT_UNTOUCHING 569 -#define IDS_ENCHANTMENT_WATER_WORKER 570 -#define IDS_ENDERDRAGON 571 -#define IDS_ENDERMAN 572 -#define IDS_ERROR_NETWORK 573 -#define IDS_ERROR_NETWORK_EXIT 574 -#define IDS_ERROR_NETWORK_TITLE 575 -#define IDS_ERROR_PSN_SIGN_OUT 576 -#define IDS_ERROR_PSN_SIGN_OUT_EXIT 577 -#define IDS_EULA 578 -#define IDS_EULA_SCEA 579 -#define IDS_EULA_SCEE 580 -#define IDS_EULA_SCEE_BD 581 -#define IDS_EXIT_GAME 582 -#define IDS_EXIT_GAME_NO_SAVE 583 -#define IDS_EXIT_GAME_SAVE 584 -#define IDS_EXITING_GAME 585 -#define IDS_FAILED_TO_CREATE_GAME_TITLE 586 -#define IDS_FAILED_TO_SAVE_TITLE 587 -#define IDS_FATAL_ERROR_TEXT 588 -#define IDS_FATAL_ERROR_TITLE 589 -#define IDS_FATAL_TROPHY_ERROR 590 -#define IDS_FAVORITES_SKIN_PACK 591 -#define IDS_FIRE_SPREADS 592 -#define IDS_FLOWERPOT 593 -#define IDS_FUEL 594 -#define IDS_FURNACE 595 -#define IDS_GAME_HOST_NAME 596 -#define IDS_GAME_HOST_NAME_UNKNOWN 597 -#define IDS_GAME_MODE_CHANGED 598 -#define IDS_GAMEMODE_CREATIVE 599 -#define IDS_GAMEMODE_SURVIVAL 600 -#define IDS_GAMENAME 601 -#define IDS_GAMEOPTION_ALLOWFOF 602 -#define IDS_GAMEOPTION_BONUS_CHEST 603 -#define IDS_GAMEOPTION_FIRE_SPREADS 604 -#define IDS_GAMEOPTION_HOST_PRIVILEGES 605 -#define IDS_GAMEOPTION_INVITEONLY 606 -#define IDS_GAMEOPTION_ONLINE 607 -#define IDS_GAMEOPTION_PVP 608 -#define IDS_GAMEOPTION_RESET_NETHER 609 -#define IDS_GAMEOPTION_STRUCTURES 610 -#define IDS_GAMEOPTION_SUPERFLAT 611 -#define IDS_GAMEOPTION_TNT_EXPLODES 612 -#define IDS_GAMEOPTION_TRUST 613 -#define IDS_GAMERPICS 614 -#define IDS_GENERATE_STRUCTURES 615 -#define IDS_GENERIC_ERROR 616 -#define IDS_GHAST 617 -#define IDS_GRAPHICS 618 -#define IDS_GROUPNAME_ARMOUR 619 -#define IDS_GROUPNAME_BUILDING_BLOCKS 620 -#define IDS_GROUPNAME_DECORATIONS 621 -#define IDS_GROUPNAME_FOOD 622 -#define IDS_GROUPNAME_MATERIALS 623 -#define IDS_GROUPNAME_MECHANISMS 624 -#define IDS_GROUPNAME_MISCELLANEOUS 625 -#define IDS_GROUPNAME_POTIONS 626 -#define IDS_GROUPNAME_POTIONS_480 627 -#define IDS_GROUPNAME_REDSTONE_AND_TRANSPORT 628 -#define IDS_GROUPNAME_STRUCTURES 629 -#define IDS_GROUPNAME_TOOLS 630 -#define IDS_GROUPNAME_TOOLS_WEAPONS_ARMOR 631 -#define IDS_GROUPNAME_TRANSPORT 632 -#define IDS_GROUPNAME_WEAPONS 633 -#define IDS_GUEST_ORDER_CHANGED_TEXT 634 -#define IDS_GUEST_ORDER_CHANGED_TITLE 635 -#define IDS_HELP_AND_OPTIONS 636 -#define IDS_HINTS 637 -#define IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS 638 -#define IDS_HOST_OPTIONS 639 -#define IDS_HOST_PRIVILEGES 640 -#define IDS_HOW_TO_PLAY 641 -#define IDS_HOW_TO_PLAY_ANVIL 642 -#define IDS_HOW_TO_PLAY_BANLIST 643 -#define IDS_HOW_TO_PLAY_BASICS 644 -#define IDS_HOW_TO_PLAY_BREEDANIMALS 645 -#define IDS_HOW_TO_PLAY_BREWING 646 -#define IDS_HOW_TO_PLAY_CHEST 647 -#define IDS_HOW_TO_PLAY_CRAFT_TABLE 648 -#define IDS_HOW_TO_PLAY_CRAFTING 649 -#define IDS_HOW_TO_PLAY_CREATIVE 650 -#define IDS_HOW_TO_PLAY_DISPENSER 651 -#define IDS_HOW_TO_PLAY_ENCHANTMENT 652 -#define IDS_HOW_TO_PLAY_ENDERCHEST 653 -#define IDS_HOW_TO_PLAY_FARMANIMALS 654 -#define IDS_HOW_TO_PLAY_FURNACE 655 -#define IDS_HOW_TO_PLAY_HOSTOPTIONS 656 -#define IDS_HOW_TO_PLAY_HUD 657 -#define IDS_HOW_TO_PLAY_INVENTORY 658 -#define IDS_HOW_TO_PLAY_LARGECHEST 659 -#define IDS_HOW_TO_PLAY_MENU_ANVIL 660 -#define IDS_HOW_TO_PLAY_MENU_BANLIST 661 -#define IDS_HOW_TO_PLAY_MENU_BASICS 662 -#define IDS_HOW_TO_PLAY_MENU_BREEDANIMALS 663 -#define IDS_HOW_TO_PLAY_MENU_BREWING 664 -#define IDS_HOW_TO_PLAY_MENU_CHESTS 665 -#define IDS_HOW_TO_PLAY_MENU_CRAFTING 666 -#define IDS_HOW_TO_PLAY_MENU_CREATIVE 667 -#define IDS_HOW_TO_PLAY_MENU_DISPENSER 668 -#define IDS_HOW_TO_PLAY_MENU_ENCHANTMENT 669 -#define IDS_HOW_TO_PLAY_MENU_FARMANIMALS 670 -#define IDS_HOW_TO_PLAY_MENU_FURNACE 671 -#define IDS_HOW_TO_PLAY_MENU_HOSTOPTIONS 672 -#define IDS_HOW_TO_PLAY_MENU_HUD 673 -#define IDS_HOW_TO_PLAY_MENU_INVENTORY 674 -#define IDS_HOW_TO_PLAY_MENU_MULTIPLAYER 675 -#define IDS_HOW_TO_PLAY_MENU_NETHERPORTAL 676 -#define IDS_HOW_TO_PLAY_MENU_SOCIALMEDIA 677 -#define IDS_HOW_TO_PLAY_MENU_SPRINT 678 -#define IDS_HOW_TO_PLAY_MENU_THEEND 679 -#define IDS_HOW_TO_PLAY_MENU_TRADING 680 -#define IDS_HOW_TO_PLAY_MENU_WHATSNEW 681 -#define IDS_HOW_TO_PLAY_MULTIPLAYER 682 -#define IDS_HOW_TO_PLAY_NETHERPORTAL 683 -#define IDS_HOW_TO_PLAY_NEXT 684 -#define IDS_HOW_TO_PLAY_PREV 685 -#define IDS_HOW_TO_PLAY_SOCIALMEDIA 686 -#define IDS_HOW_TO_PLAY_THEEND 687 -#define IDS_HOW_TO_PLAY_TRADING 688 -#define IDS_HOW_TO_PLAY_WHATSNEW 689 -#define IDS_ICON_SHANK_01 690 -#define IDS_ICON_SHANK_03 691 -#define IDS_IN_GAME_GAMERTAGS 692 -#define IDS_IN_GAME_TOOLTIPS 693 -#define IDS_INGREDIENT 694 -#define IDS_INGREDIENTS 695 -#define IDS_INVENTORY 696 -#define IDS_INVERT_LOOK 697 -#define IDS_INVISIBLE 698 -#define IDS_INVITATION_BODY 699 -#define IDS_INVITATION_SUBJECT_MAX_18_CHARS 700 -#define IDS_INVITE_ONLY 701 -#define IDS_IRONGOLEM 702 -#define IDS_ITEM_APPLE 703 -#define IDS_ITEM_APPLE_GOLD 704 -#define IDS_ITEM_ARROW 705 -#define IDS_ITEM_BED 706 -#define IDS_ITEM_BEEF_COOKED 707 -#define IDS_ITEM_BEEF_RAW 708 -#define IDS_ITEM_BLAZE_POWDER 709 -#define IDS_ITEM_BLAZE_ROD 710 -#define IDS_ITEM_BOAT 711 -#define IDS_ITEM_BONE 712 -#define IDS_ITEM_BOOK 713 -#define IDS_ITEM_BOOTS_CHAIN 714 -#define IDS_ITEM_BOOTS_CLOTH 715 -#define IDS_ITEM_BOOTS_DIAMOND 716 -#define IDS_ITEM_BOOTS_GOLD 717 -#define IDS_ITEM_BOOTS_IRON 718 -#define IDS_ITEM_BOW 719 -#define IDS_ITEM_BOWL 720 -#define IDS_ITEM_BREAD 721 -#define IDS_ITEM_BREWING_STAND 722 -#define IDS_ITEM_BRICK 723 -#define IDS_ITEM_BUCKET 724 -#define IDS_ITEM_BUCKET_LAVA 725 -#define IDS_ITEM_BUCKET_MILK 726 -#define IDS_ITEM_BUCKET_WATER 727 -#define IDS_ITEM_CAKE 728 -#define IDS_ITEM_CARROT_GOLDEN 729 -#define IDS_ITEM_CARROT_ON_A_STICK 730 -#define IDS_ITEM_CAULDRON 731 -#define IDS_ITEM_CHARCOAL 732 -#define IDS_ITEM_CHESTPLATE_CHAIN 733 -#define IDS_ITEM_CHESTPLATE_CLOTH 734 -#define IDS_ITEM_CHESTPLATE_DIAMOND 735 -#define IDS_ITEM_CHESTPLATE_GOLD 736 -#define IDS_ITEM_CHESTPLATE_IRON 737 -#define IDS_ITEM_CHICKEN_COOKED 738 -#define IDS_ITEM_CHICKEN_RAW 739 -#define IDS_ITEM_CLAY 740 -#define IDS_ITEM_CLOCK 741 -#define IDS_ITEM_COAL 742 -#define IDS_ITEM_COMPASS 743 -#define IDS_ITEM_COOKIE 744 -#define IDS_ITEM_DIAMOND 745 -#define IDS_ITEM_DIODE 746 -#define IDS_ITEM_DOOR_IRON 747 -#define IDS_ITEM_DOOR_WOOD 748 -#define IDS_ITEM_DYE_POWDER 749 -#define IDS_ITEM_DYE_POWDER_BLACK 750 -#define IDS_ITEM_DYE_POWDER_BLUE 751 -#define IDS_ITEM_DYE_POWDER_BROWN 752 -#define IDS_ITEM_DYE_POWDER_CYAN 753 -#define IDS_ITEM_DYE_POWDER_GRAY 754 -#define IDS_ITEM_DYE_POWDER_GREEN 755 -#define IDS_ITEM_DYE_POWDER_LIGHT_BLUE 756 -#define IDS_ITEM_DYE_POWDER_LIME 757 -#define IDS_ITEM_DYE_POWDER_MAGENTA 758 -#define IDS_ITEM_DYE_POWDER_ORANGE 759 -#define IDS_ITEM_DYE_POWDER_PINK 760 -#define IDS_ITEM_DYE_POWDER_PURPLE 761 -#define IDS_ITEM_DYE_POWDER_RED 762 -#define IDS_ITEM_DYE_POWDER_SILVER 763 -#define IDS_ITEM_DYE_POWDER_WHITE 764 -#define IDS_ITEM_DYE_POWDER_YELLOW 765 -#define IDS_ITEM_EGG 766 -#define IDS_ITEM_EMERALD 767 -#define IDS_ITEM_ENCHANTED_BOOK 768 -#define IDS_ITEM_ENDER_PEARL 769 -#define IDS_ITEM_EXP_BOTTLE 770 -#define IDS_ITEM_EYE_OF_ENDER 771 -#define IDS_ITEM_FEATHER 772 -#define IDS_ITEM_FERMENTED_SPIDER_EYE 773 -#define IDS_ITEM_FIREBALL 774 -#define IDS_ITEM_FIREBALLCHARCOAL 775 -#define IDS_ITEM_FIREBALLCOAL 776 -#define IDS_ITEM_FISH_COOKED 777 -#define IDS_ITEM_FISH_RAW 778 -#define IDS_ITEM_FISHING_ROD 779 -#define IDS_ITEM_FLINT 780 -#define IDS_ITEM_FLINT_AND_STEEL 781 -#define IDS_ITEM_GHAST_TEAR 782 -#define IDS_ITEM_GLASS_BOTTLE 783 -#define IDS_ITEM_GOLD_NUGGET 784 -#define IDS_ITEM_HATCHET_DIAMOND 785 -#define IDS_ITEM_HATCHET_GOLD 786 -#define IDS_ITEM_HATCHET_IRON 787 -#define IDS_ITEM_HATCHET_STONE 788 -#define IDS_ITEM_HATCHET_WOOD 789 -#define IDS_ITEM_HELMET_CHAIN 790 -#define IDS_ITEM_HELMET_CLOTH 791 -#define IDS_ITEM_HELMET_DIAMOND 792 -#define IDS_ITEM_HELMET_GOLD 793 -#define IDS_ITEM_HELMET_IRON 794 -#define IDS_ITEM_HOE_DIAMOND 795 -#define IDS_ITEM_HOE_GOLD 796 -#define IDS_ITEM_HOE_IRON 797 -#define IDS_ITEM_HOE_STONE 798 -#define IDS_ITEM_HOE_WOOD 799 -#define IDS_ITEM_INGOT_GOLD 800 -#define IDS_ITEM_INGOT_IRON 801 -#define IDS_ITEM_ITEMFRAME 802 -#define IDS_ITEM_LEATHER 803 -#define IDS_ITEM_LEGGINGS_CHAIN 804 -#define IDS_ITEM_LEGGINGS_CLOTH 805 -#define IDS_ITEM_LEGGINGS_DIAMOND 806 -#define IDS_ITEM_LEGGINGS_GOLD 807 -#define IDS_ITEM_LEGGINGS_IRON 808 -#define IDS_ITEM_MAGMA_CREAM 809 -#define IDS_ITEM_MAP 810 -#define IDS_ITEM_MELON_SEEDS 811 -#define IDS_ITEM_MELON_SLICE 812 -#define IDS_ITEM_MINECART 813 -#define IDS_ITEM_MINECART_CHEST 814 -#define IDS_ITEM_MINECART_FURNACE 815 -#define IDS_ITEM_MONSTER_SPAWNER 816 -#define IDS_ITEM_MUSHROOM_STEW 817 -#define IDS_ITEM_NETHER_QUARTZ 818 -#define IDS_ITEM_NETHER_STALK_SEEDS 819 -#define IDS_ITEM_NETHERBRICK 820 -#define IDS_ITEM_PAINTING 821 -#define IDS_ITEM_PAPER 822 -#define IDS_ITEM_PICKAXE_DIAMOND 823 -#define IDS_ITEM_PICKAXE_GOLD 824 -#define IDS_ITEM_PICKAXE_IRON 825 -#define IDS_ITEM_PICKAXE_STONE 826 -#define IDS_ITEM_PICKAXE_WOOD 827 -#define IDS_ITEM_PORKCHOP_COOKED 828 -#define IDS_ITEM_PORKCHOP_RAW 829 -#define IDS_ITEM_POTATO_BAKED 830 -#define IDS_ITEM_POTATO_POISONOUS 831 -#define IDS_ITEM_POTION 832 -#define IDS_ITEM_PUMPKIN_PIE 833 -#define IDS_ITEM_PUMPKIN_SEEDS 834 -#define IDS_ITEM_RECORD_01 835 -#define IDS_ITEM_RECORD_02 836 -#define IDS_ITEM_RECORD_03 837 -#define IDS_ITEM_RECORD_04 838 -#define IDS_ITEM_RECORD_05 839 -#define IDS_ITEM_RECORD_06 840 -#define IDS_ITEM_RECORD_07 841 -#define IDS_ITEM_RECORD_08 842 -#define IDS_ITEM_RECORD_09 843 -#define IDS_ITEM_RECORD_10 844 -#define IDS_ITEM_RECORD_11 845 -#define IDS_ITEM_RECORD_12 846 -#define IDS_ITEM_REDSTONE 847 -#define IDS_ITEM_REEDS 848 -#define IDS_ITEM_ROTTEN_FLESH 849 -#define IDS_ITEM_SADDLE 850 -#define IDS_ITEM_SHEARS 851 -#define IDS_ITEM_SHOVEL_DIAMOND 852 -#define IDS_ITEM_SHOVEL_GOLD 853 -#define IDS_ITEM_SHOVEL_IRON 854 -#define IDS_ITEM_SHOVEL_STONE 855 -#define IDS_ITEM_SHOVEL_WOOD 856 -#define IDS_ITEM_SIGN 857 -#define IDS_ITEM_SKULL 858 -#define IDS_ITEM_SKULL_CHARACTER 859 -#define IDS_ITEM_SKULL_CREEPER 860 -#define IDS_ITEM_SKULL_PLAYER 861 -#define IDS_ITEM_SKULL_SKELETON 862 -#define IDS_ITEM_SKULL_WITHER 863 -#define IDS_ITEM_SKULL_ZOMBIE 864 -#define IDS_ITEM_SLIMEBALL 865 -#define IDS_ITEM_SNOWBALL 866 -#define IDS_ITEM_SPECKLED_MELON 867 -#define IDS_ITEM_SPIDER_EYE 868 -#define IDS_ITEM_STICK 869 -#define IDS_ITEM_STRING 870 -#define IDS_ITEM_SUGAR 871 -#define IDS_ITEM_SULPHUR 872 -#define IDS_ITEM_SWORD_DIAMOND 873 -#define IDS_ITEM_SWORD_GOLD 874 -#define IDS_ITEM_SWORD_IRON 875 -#define IDS_ITEM_SWORD_STONE 876 -#define IDS_ITEM_SWORD_WOOD 877 -#define IDS_ITEM_WATER_BOTTLE 878 -#define IDS_ITEM_WHEAT 879 -#define IDS_ITEM_WHEAT_SEEDS 880 -#define IDS_ITEM_YELLOW_DUST 881 -#define IDS_JOIN_GAME 882 -#define IDS_KEYBOARDUI_SAVEGAME_TEXT 883 -#define IDS_KEYBOARDUI_SAVEGAME_TITLE 884 -#define IDS_KICK_PLAYER 885 -#define IDS_KICK_PLAYER_DESCRIPTION 886 -#define IDS_LABEL_DIFFICULTY 887 -#define IDS_LABEL_FIRE_SPREADS 888 -#define IDS_LABEL_GAME_TYPE 889 -#define IDS_LABEL_GAMERTAGS 890 -#define IDS_LABEL_LEVEL_TYPE 891 -#define IDS_LABEL_PvP 892 -#define IDS_LABEL_STRUCTURES 893 -#define IDS_LABEL_TNT 894 -#define IDS_LABEL_TRUST 895 -#define IDS_LAVA_SLIME 896 -#define IDS_LEADERBOARD_ENTRIES 897 -#define IDS_LEADERBOARD_FARMING_EASY 898 -#define IDS_LEADERBOARD_FARMING_HARD 899 -#define IDS_LEADERBOARD_FARMING_NORMAL 900 -#define IDS_LEADERBOARD_FARMING_PEACEFUL 901 -#define IDS_LEADERBOARD_FILTER 902 -#define IDS_LEADERBOARD_FILTER_FRIENDS 903 -#define IDS_LEADERBOARD_FILTER_MYSCORE 904 -#define IDS_LEADERBOARD_FILTER_OVERALL 905 -#define IDS_LEADERBOARD_GAMERTAG 906 -#define IDS_LEADERBOARD_KILLS_EASY 907 -#define IDS_LEADERBOARD_KILLS_HARD 908 -#define IDS_LEADERBOARD_KILLS_NORMAL 909 -#define IDS_LEADERBOARD_LOADING 910 -#define IDS_LEADERBOARD_MINING_BLOCKS_EASY 911 -#define IDS_LEADERBOARD_MINING_BLOCKS_HARD 912 -#define IDS_LEADERBOARD_MINING_BLOCKS_NORMAL 913 -#define IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL 914 -#define IDS_LEADERBOARD_NORESULTS 915 -#define IDS_LEADERBOARD_RANK 916 -#define IDS_LEADERBOARD_TRAVELLING_EASY 917 -#define IDS_LEADERBOARD_TRAVELLING_HARD 918 -#define IDS_LEADERBOARD_TRAVELLING_NORMAL 919 -#define IDS_LEADERBOARD_TRAVELLING_PEACEFUL 920 -#define IDS_LEADERBOARDS 921 -#define IDS_LEVELTYPE_NORMAL 922 -#define IDS_LEVELTYPE_SUPERFLAT 923 -#define IDS_LOAD 924 -#define IDS_LOAD_SAVED_WORLD 925 -#define IDS_MAX_BOATS 926 -#define IDS_MAX_CHICKENS_BRED 927 -#define IDS_MAX_CHICKENS_SPAWNED 928 -#define IDS_MAX_ENEMIES_SPAWNED 929 -#define IDS_MAX_HANGINGENTITIES 930 -#define IDS_MAX_MOOSHROOMS_SPAWNED 931 -#define IDS_MAX_MUSHROOMCOWS_BRED 932 -#define IDS_MAX_PIGS_SHEEP_COWS_CATS_BRED 933 -#define IDS_MAX_PIGS_SHEEP_COWS_CATS_SPAWNED 934 -#define IDS_MAX_SKULL_TILES 935 -#define IDS_MAX_SQUID_SPAWNED 936 -#define IDS_MAX_VILLAGERS_SPAWNED 937 -#define IDS_MAX_WOLVES_BRED 938 -#define IDS_MAX_WOLVES_SPAWNED 939 -#define IDS_MINUTES 940 -#define IDS_MODERATOR 941 -#define IDS_MORE_OPTIONS 942 -#define IDS_MULTIPLAYER_FULL_TEXT 943 -#define IDS_MULTIPLAYER_FULL_TITLE 944 -#define IDS_MUSHROOM_COW 945 -#define IDS_MUST_SIGN_IN_TEXT 946 -#define IDS_MUST_SIGN_IN_TITLE 947 -#define IDS_NAME_CAPTION 948 -#define IDS_NAME_CAPTION_TEXT 949 -#define IDS_NAME_DESC 950 -#define IDS_NAME_DESC_TEXT 951 -#define IDS_NAME_TITLE 952 -#define IDS_NAME_TITLE_TEXT 953 -#define IDS_NAME_WORLD 954 -#define IDS_NAME_WORLD_TEXT 955 -#define IDS_NETWORK_ADHOC 956 -#define IDS_NO 957 -#define IDS_NO_DLCCATEGORIES 958 -#define IDS_NO_DLCOFFERS 959 -#define IDS_NO_GAMES_FOUND 960 -#define IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT 961 -#define IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT 962 -#define IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE 963 -#define IDS_NO_SKIN_PACK 964 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL 965 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE 966 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL 967 -#define IDS_NODEVICE_DECLINE 968 -#define IDS_NOFREESPACE_TEXT 969 -#define IDS_NOFREESPACE_TITLE 970 -#define IDS_NOTALLOWED_FRIENDSOFFRIENDS 971 -#define IDS_NOWPLAYING 972 -#define IDS_OFF 973 -#define IDS_OK 974 -#define IDS_ON 975 -#define IDS_ONLINE_GAME 976 -#define IDS_ONLINE_SERVICE_TITLE 977 -#define IDS_OPTIONS 978 -#define IDS_OPTIONSFILE 979 -#define IDS_OVERWRITESAVE_NO 980 -#define IDS_OVERWRITESAVE_TITLE 981 -#define IDS_OVERWRITESAVE_YES 982 -#define IDS_OZELOT 983 -#define IDS_PIG 984 -#define IDS_PIGZOMBIE 985 -#define IDS_PLATFORM_NAME 986 -#define IDS_PLAY_GAME 987 -#define IDS_PLAY_TUTORIAL 988 -#define IDS_PLAYER_BANNED_LEVEL 989 -#define IDS_PLAYER_ENTERED_END 990 -#define IDS_PLAYER_JOINED 991 -#define IDS_PLAYER_KICKED 992 -#define IDS_PLAYER_LEFT 993 -#define IDS_PLAYER_LEFT_END 994 -#define IDS_PLAYER_LIST_TITLE 995 -#define IDS_PLAYER_VS_PLAYER 996 -#define IDS_PLAYERS 997 -#define IDS_PLAYERS_INVITE 998 -#define IDS_PLAYWITHOUTSAVING 999 -#define IDS_POTATO 1000 -#define IDS_POTION_BLINDNESS 1001 -#define IDS_POTION_BLINDNESS_POSTFIX 1002 -#define IDS_POTION_CONFUSION 1003 -#define IDS_POTION_CONFUSION_POSTFIX 1004 -#define IDS_POTION_DAMAGEBOOST 1005 -#define IDS_POTION_DAMAGEBOOST_POSTFIX 1006 -#define IDS_POTION_DESC_DAMAGEBOOST 1007 -#define IDS_POTION_DESC_EMPTY 1008 -#define IDS_POTION_DESC_FIRERESISTANCE 1009 -#define IDS_POTION_DESC_HARM 1010 -#define IDS_POTION_DESC_HEAL 1011 -#define IDS_POTION_DESC_INVISIBILITY 1012 -#define IDS_POTION_DESC_MOVESLOWDOWN 1013 -#define IDS_POTION_DESC_MOVESPEED 1014 -#define IDS_POTION_DESC_NIGHTVISION 1015 -#define IDS_POTION_DESC_POISON 1016 -#define IDS_POTION_DESC_REGENERATION 1017 -#define IDS_POTION_DESC_WATER_BOTTLE 1018 -#define IDS_POTION_DESC_WEAKNESS 1019 -#define IDS_POTION_DIGSLOWDOWN 1020 -#define IDS_POTION_DIGSLOWDOWN_POSTFIX 1021 -#define IDS_POTION_DIGSPEED 1022 -#define IDS_POTION_DIGSPEED_POSTFIX 1023 -#define IDS_POTION_EMPTY 1024 -#define IDS_POTION_FIRERESISTANCE 1025 -#define IDS_POTION_FIRERESISTANCE_POSTFIX 1026 -#define IDS_POTION_HARM 1027 -#define IDS_POTION_HARM_POSTFIX 1028 -#define IDS_POTION_HEAL 1029 -#define IDS_POTION_HEAL_POSTFIX 1030 -#define IDS_POTION_HUNGER 1031 -#define IDS_POTION_HUNGER_POSTFIX 1032 -#define IDS_POTION_INVISIBILITY 1033 -#define IDS_POTION_INVISIBILITY_POSTFIX 1034 -#define IDS_POTION_JUMP 1035 -#define IDS_POTION_JUMP_POSTFIX 1036 -#define IDS_POTION_MOVESLOWDOWN 1037 -#define IDS_POTION_MOVESLOWDOWN_POSTFIX 1038 -#define IDS_POTION_MOVESPEED 1039 -#define IDS_POTION_MOVESPEED_POSTFIX 1040 -#define IDS_POTION_NIGHTVISION 1041 -#define IDS_POTION_NIGHTVISION_POSTFIX 1042 -#define IDS_POTION_POISON 1043 -#define IDS_POTION_POISON_POSTFIX 1044 -#define IDS_POTION_POTENCY_0 1045 -#define IDS_POTION_POTENCY_1 1046 -#define IDS_POTION_POTENCY_2 1047 -#define IDS_POTION_POTENCY_3 1048 -#define IDS_POTION_PREFIX_ACRID 1049 -#define IDS_POTION_PREFIX_ARTLESS 1050 -#define IDS_POTION_PREFIX_AWKWARD 1051 -#define IDS_POTION_PREFIX_BLAND 1052 -#define IDS_POTION_PREFIX_BULKY 1053 -#define IDS_POTION_PREFIX_BUNGLING 1054 -#define IDS_POTION_PREFIX_BUTTERED 1055 -#define IDS_POTION_PREFIX_CHARMING 1056 -#define IDS_POTION_PREFIX_CLEAR 1057 -#define IDS_POTION_PREFIX_CORDIAL 1058 -#define IDS_POTION_PREFIX_DASHING 1059 -#define IDS_POTION_PREFIX_DEBONAIR 1060 -#define IDS_POTION_PREFIX_DIFFUSE 1061 -#define IDS_POTION_PREFIX_ELEGANT 1062 -#define IDS_POTION_PREFIX_FANCY 1063 -#define IDS_POTION_PREFIX_FLAT 1064 -#define IDS_POTION_PREFIX_FOUL 1065 -#define IDS_POTION_PREFIX_GRENADE 1066 -#define IDS_POTION_PREFIX_GROSS 1067 -#define IDS_POTION_PREFIX_HARSH 1068 -#define IDS_POTION_PREFIX_MILKY 1069 -#define IDS_POTION_PREFIX_MUNDANE 1070 -#define IDS_POTION_PREFIX_ODORLESS 1071 -#define IDS_POTION_PREFIX_POTENT 1072 -#define IDS_POTION_PREFIX_RANK 1073 -#define IDS_POTION_PREFIX_REFINED 1074 -#define IDS_POTION_PREFIX_SMOOTH 1075 -#define IDS_POTION_PREFIX_SPARKLING 1076 -#define IDS_POTION_PREFIX_STINKY 1077 -#define IDS_POTION_PREFIX_SUAVE 1078 -#define IDS_POTION_PREFIX_THICK 1079 -#define IDS_POTION_PREFIX_THIN 1080 -#define IDS_POTION_PREFIX_UNINTERESTING 1081 -#define IDS_POTION_REGENERATION 1082 -#define IDS_POTION_REGENERATION_POSTFIX 1083 -#define IDS_POTION_RESISTANCE 1084 -#define IDS_POTION_RESISTANCE_POSTFIX 1085 -#define IDS_POTION_WATERBREATHING 1086 -#define IDS_POTION_WATERBREATHING_POSTFIX 1087 -#define IDS_POTION_WEAKNESS 1088 -#define IDS_POTION_WEAKNESS_POSTFIX 1089 -#define IDS_PRESS_START_TO_JOIN 1090 -#define IDS_PRIV_ATTACK_ANIMAL_TOGGLE_OFF 1091 -#define IDS_PRIV_ATTACK_ANIMAL_TOGGLE_ON 1092 -#define IDS_PRIV_ATTACK_MOB_TOGGLE_OFF 1093 -#define IDS_PRIV_ATTACK_MOB_TOGGLE_ON 1094 -#define IDS_PRIV_ATTACK_PLAYER_TOGGLE_OFF 1095 -#define IDS_PRIV_ATTACK_PLAYER_TOGGLE_ON 1096 -#define IDS_PRIV_BUILD_TOGGLE_OFF 1097 -#define IDS_PRIV_BUILD_TOGGLE_ON 1098 -#define IDS_PRIV_CAN_EXHAUSTION_TOGGLE_OFF 1099 -#define IDS_PRIV_CAN_EXHAUSTION_TOGGLE_ON 1100 -#define IDS_PRIV_CAN_FLY_TOGGLE_OFF 1101 -#define IDS_PRIV_CAN_FLY_TOGGLE_ON 1102 -#define IDS_PRIV_CAN_INVISIBLE_TOGGLE_OFF 1103 -#define IDS_PRIV_CAN_INVISIBLE_TOGGLE_ON 1104 -#define IDS_PRIV_CAN_TELEPORT_TOGGLE_OFF 1105 -#define IDS_PRIV_CAN_TELEPORT_TOGGLE_ON 1106 -#define IDS_PRIV_EXHAUSTION_TOGGLE_OFF 1107 -#define IDS_PRIV_EXHAUSTION_TOGGLE_ON 1108 -#define IDS_PRIV_FLY_TOGGLE_OFF 1109 -#define IDS_PRIV_FLY_TOGGLE_ON 1110 -#define IDS_PRIV_INVISIBLE_TOGGLE_OFF 1111 -#define IDS_PRIV_INVISIBLE_TOGGLE_ON 1112 -#define IDS_PRIV_INVULNERABLE_TOGGLE_OFF 1113 -#define IDS_PRIV_INVULNERABLE_TOGGLE_ON 1114 -#define IDS_PRIV_MINE_TOGGLE_OFF 1115 -#define IDS_PRIV_MINE_TOGGLE_ON 1116 -#define IDS_PRIV_MODERATOR_TOGGLE_OFF 1117 -#define IDS_PRIV_MODERATOR_TOGGLE_ON 1118 -#define IDS_PRIV_USE_CONTAINERS_TOGGLE_OFF 1119 -#define IDS_PRIV_USE_CONTAINERS_TOGGLE_ON 1120 -#define IDS_PRIV_USE_DOORS_TOGGLE_OFF 1121 -#define IDS_PRIV_USE_DOORS_TOGGLE_ON 1122 -#define IDS_PRO_ACHIEVEMENTPROBLEM_TEXT 1123 -#define IDS_PRO_ACHIEVEMENTPROBLEM_TITLE 1124 -#define IDS_PRO_GUESTPROFILE_TEXT 1125 -#define IDS_PRO_GUESTPROFILE_TITLE 1126 -#define IDS_PRO_NOPROFILE_TITLE 1127 -#define IDS_PRO_NOPROFILEOPTIONS_TEXT 1128 -#define IDS_PRO_NOTADHOCONLINE_ACCEPT 1129 -#define IDS_PRO_NOTADHOCONLINE_TEXT 1130 -#define IDS_PRO_NOTADHOCONLINE_TITLE 1131 -#define IDS_PRO_NOTONLINE_ACCEPT 1132 -#define IDS_PRO_NOTONLINE_DECLINE 1133 -#define IDS_PRO_NOTONLINE_TEXT 1134 -#define IDS_PRO_NOTONLINE_TITLE 1135 -#define IDS_PRO_RETURNEDTOMENU_ACCEPT 1136 -#define IDS_PRO_RETURNEDTOMENU_TEXT 1137 -#define IDS_PRO_RETURNEDTOMENU_TITLE 1138 -#define IDS_PRO_RETURNEDTOTITLESCREEN_TEXT 1139 -#define IDS_PRO_UNLOCKGAME_TEXT 1140 -#define IDS_PRO_UNLOCKGAME_TITLE 1141 -#define IDS_PRO_XBOXLIVE_NOTIFICATION 1142 -#define IDS_PROGRESS_AUTOSAVING_LEVEL 1143 -#define IDS_PROGRESS_BUILDING_TERRAIN 1144 -#define IDS_PROGRESS_CONNECTING 1145 -#define IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME 1146 -#define IDS_PROGRESS_DOWNLOADING_TERRAIN 1147 -#define IDS_PROGRESS_ENTERING_END 1148 -#define IDS_PROGRESS_ENTERING_NETHER 1149 -#define IDS_PROGRESS_GENERATING_LEVEL 1150 -#define IDS_PROGRESS_GENERATING_SPAWN_AREA 1151 -#define IDS_PROGRESS_HOST_SAVING 1152 -#define IDS_PROGRESS_INITIALISING_SERVER 1153 -#define IDS_PROGRESS_LEAVING_END 1154 -#define IDS_PROGRESS_LEAVING_NETHER 1155 -#define IDS_PROGRESS_LOADING_LEVEL 1156 -#define IDS_PROGRESS_LOADING_SPAWN_AREA 1157 -#define IDS_PROGRESS_NEW_WORLD_SEED 1158 -#define IDS_PROGRESS_RESPAWNING 1159 -#define IDS_PROGRESS_SAVING_CHUNKS 1160 -#define IDS_PROGRESS_SAVING_LEVEL 1161 -#define IDS_PROGRESS_SAVING_PLAYERS 1162 -#define IDS_PROGRESS_SAVING_TO_DISC 1163 -#define IDS_PROGRESS_SIMULATING_WORLD 1164 -#define IDS_REINSTALL_AVATAR_ITEM_1 1165 -#define IDS_REINSTALL_AVATAR_ITEM_2 1166 -#define IDS_REINSTALL_AVATAR_ITEM_3 1167 -#define IDS_REINSTALL_CONTENT 1168 -#define IDS_REINSTALL_GAMERPIC_1 1169 -#define IDS_REINSTALL_GAMERPIC_2 1170 -#define IDS_REINSTALL_THEME 1171 -#define IDS_RENAME_WORLD_TEXT 1172 -#define IDS_RENAME_WORLD_TITLE 1173 -#define IDS_REPAIR_AND_NAME 1174 -#define IDS_REPAIR_COST 1175 -#define IDS_REPAIR_EXPENSIVE 1176 -#define IDS_REQUIRED_ITEMS_FOR_TRADE 1177 -#define IDS_RESET_NETHER 1178 -#define IDS_RESET_TO_DEFAULTS 1179 -#define IDS_RESETNETHER_TEXT 1180 -#define IDS_RESETNETHER_TITLE 1181 -#define IDS_RESPAWN 1182 -#define IDS_RESUME_GAME 1183 -#define IDS_RETURNEDTOMENU_TITLE 1184 -#define IDS_RETURNEDTOTITLESCREEN_TEXT 1185 -#define IDS_RICHPRESENCE_GAMESTATE 1186 -#define IDS_RICHPRESENCE_IDLE 1187 -#define IDS_RICHPRESENCE_MENUS 1188 -#define IDS_RICHPRESENCE_MULTIPLAYER 1189 -#define IDS_RICHPRESENCE_MULTIPLAYER_1P 1190 -#define IDS_RICHPRESENCE_MULTIPLAYER_1POFFLINE 1191 -#define IDS_RICHPRESENCE_MULTIPLAYEROFFLINE 1192 -#define IDS_RICHPRESENCESTATE_ANVIL 1193 -#define IDS_RICHPRESENCESTATE_BLANK 1194 -#define IDS_RICHPRESENCESTATE_BOATING 1195 -#define IDS_RICHPRESENCESTATE_BREWING 1196 -#define IDS_RICHPRESENCESTATE_CD 1197 -#define IDS_RICHPRESENCESTATE_CRAFTING 1198 -#define IDS_RICHPRESENCESTATE_ENCHANTING 1199 -#define IDS_RICHPRESENCESTATE_FISHING 1200 -#define IDS_RICHPRESENCESTATE_FORGING 1201 -#define IDS_RICHPRESENCESTATE_MAP 1202 -#define IDS_RICHPRESENCESTATE_NETHER 1203 -#define IDS_RICHPRESENCESTATE_RIDING_MINECART 1204 -#define IDS_RICHPRESENCESTATE_RIDING_PIG 1205 -#define IDS_RICHPRESENCESTATE_TRADING 1206 -#define IDS_SAVE_GAME 1207 -#define IDS_SAVE_ICON_MESSAGE 1208 -#define IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA 1209 -#define IDS_SAVE_INCOMPLETE_TITLE 1210 -#define IDS_SAVE_TRANSFER_DOWNLOADCOMPLETE 1211 -#define IDS_SAVE_TRANSFER_DOWNLOADFAILED 1212 -#define IDS_SAVE_TRANSFER_NOT_AVAILABLE_TEXT 1213 -#define IDS_SAVE_TRANSFER_TEXT 1214 -#define IDS_SAVE_TRANSFER_UPLOADCOMPLETE 1215 -#define IDS_SAVE_TRANSFER_UPLOADFAILED 1216 -#define IDS_SAVECACHEFILE 1217 -#define IDS_SAVEDATA_COPIED_TEXT 1218 -#define IDS_SAVEDATA_COPIED_TITLE 1219 -#define IDS_SAVETRANSFER_STAGE_CONVERTING 1220 -#define IDS_SAVETRANSFER_STAGE_GET_DATA 1221 -#define IDS_SAVETRANSFER_STAGE_PUT_DATA 1222 -#define IDS_SAVETRANSFER_STAGE_SAVING 1223 -#define IDS_SEED 1224 -#define IDS_SELECT_NETWORK_MODE_TEXT 1225 -#define IDS_SELECT_NETWORK_MODE_TITLE 1226 -#define IDS_SELECTAGAIN 1227 -#define IDS_SELECTED 1228 -#define IDS_SELECTED_SKIN 1229 -#define IDS_SETTINGS 1230 -#define IDS_SHEEP 1231 -#define IDS_SIGN_TITLE 1232 -#define IDS_SIGN_TITLE_TEXT 1233 -#define IDS_SIGNIN_PSN 1234 -#define IDS_SILVERFISH 1235 -#define IDS_SKELETON 1236 -#define IDS_SKINS 1237 -#define IDS_SLIDER_AUTOSAVE 1238 -#define IDS_SLIDER_AUTOSAVE_OFF 1239 -#define IDS_SLIDER_DIFFICULTY 1240 -#define IDS_SLIDER_GAMMA 1241 -#define IDS_SLIDER_INTERFACEOPACITY 1242 -#define IDS_SLIDER_MUSIC 1243 -#define IDS_SLIDER_SENSITIVITY_INGAME 1244 -#define IDS_SLIDER_SENSITIVITY_INMENU 1245 -#define IDS_SLIDER_SOUND 1246 -#define IDS_SLIDER_UISIZE 1247 -#define IDS_SLIDER_UISIZESPLITSCREEN 1248 -#define IDS_SLIME 1249 -#define IDS_SNOWMAN 1250 -#define IDS_SOCIAL_DEFAULT_CAPTION 1251 -#define IDS_SOCIAL_DEFAULT_DESCRIPTION 1252 -#define IDS_SOCIAL_LABEL_CAPTION 1253 -#define IDS_SOCIAL_LABEL_DESCRIPTION 1254 -#define IDS_SOCIAL_TEXT 1255 -#define IDS_SOUTHPAW 1256 -#define IDS_SPIDER 1257 -#define IDS_SQUID 1258 -#define IDS_START_GAME 1259 -#define IDS_STO_SAVING_LONG 1260 -#define IDS_STO_SAVING_SHORT 1261 -#define IDS_STRINGVERIFY_AWAITING_APPROVAL 1262 -#define IDS_STRINGVERIFY_CENSORED 1263 -#define IDS_SUPERFLAT_WORLD 1264 -#define IDS_SURVIVAL 1265 -#define IDS_TELEPORT 1266 -#define IDS_TELEPORT_TO_ME 1267 -#define IDS_TELEPORT_TO_PLAYER 1268 -#define IDS_TEXT_DELETE_SAVE 1269 -#define IDS_TEXT_SAVEOPTIONS 1270 -#define IDS_TEXTURE_PACK_TRIALVERSION 1271 -#define IDS_TEXTUREPACK_FULLVERSION 1272 -#define IDS_THEMES 1273 -#define IDS_TILE_ANVIL 1274 -#define IDS_TILE_ANVIL_INTACT 1275 -#define IDS_TILE_ANVIL_SLIGHTLYDAMAGED 1276 -#define IDS_TILE_ANVIL_VERYDAMAGED 1277 -#define IDS_TILE_BED 1278 -#define IDS_TILE_BED_MESLEEP 1279 -#define IDS_TILE_BED_NO_SLEEP 1280 -#define IDS_TILE_BED_NOT_VALID 1281 -#define IDS_TILE_BED_NOTSAFE 1282 -#define IDS_TILE_BED_OCCUPIED 1283 -#define IDS_TILE_BED_PLAYERSLEEP 1284 -#define IDS_TILE_BEDROCK 1285 -#define IDS_TILE_BIRCH 1286 -#define IDS_TILE_BIRCHWOOD_PLANKS 1287 -#define IDS_TILE_BLOCK_DIAMOND 1288 -#define IDS_TILE_BLOCK_GOLD 1289 -#define IDS_TILE_BLOCK_IRON 1290 -#define IDS_TILE_BLOCK_LAPIS 1291 -#define IDS_TILE_BOOKSHELF 1292 -#define IDS_TILE_BREWINGSTAND 1293 -#define IDS_TILE_BRICK 1294 -#define IDS_TILE_BUTTON 1295 -#define IDS_TILE_CACTUS 1296 -#define IDS_TILE_CAKE 1297 -#define IDS_TILE_CARPET 1298 -#define IDS_TILE_CARPET_BLACK 1299 -#define IDS_TILE_CARPET_BLUE 1300 -#define IDS_TILE_CARPET_BROWN 1301 -#define IDS_TILE_CARPET_CYAN 1302 -#define IDS_TILE_CARPET_GRAY 1303 -#define IDS_TILE_CARPET_GREEN 1304 -#define IDS_TILE_CARPET_LIGHT_BLUE 1305 -#define IDS_TILE_CARPET_LIME 1306 -#define IDS_TILE_CARPET_MAGENTA 1307 -#define IDS_TILE_CARPET_ORANGE 1308 -#define IDS_TILE_CARPET_PINK 1309 -#define IDS_TILE_CARPET_PURPLE 1310 -#define IDS_TILE_CARPET_RED 1311 -#define IDS_TILE_CARPET_SILVER 1312 -#define IDS_TILE_CARPET_WHITE 1313 -#define IDS_TILE_CARPET_YELLOW 1314 -#define IDS_TILE_CARROTS 1315 -#define IDS_TILE_CAULDRON 1316 -#define IDS_TILE_CHEST 1317 -#define IDS_TILE_CLAY 1318 -#define IDS_TILE_CLOTH 1319 -#define IDS_TILE_CLOTH_BLACK 1320 -#define IDS_TILE_CLOTH_BLUE 1321 -#define IDS_TILE_CLOTH_BROWN 1322 -#define IDS_TILE_CLOTH_CYAN 1323 -#define IDS_TILE_CLOTH_GRAY 1324 -#define IDS_TILE_CLOTH_GREEN 1325 -#define IDS_TILE_CLOTH_LIGHT_BLUE 1326 -#define IDS_TILE_CLOTH_LIME 1327 -#define IDS_TILE_CLOTH_MAGENTA 1328 -#define IDS_TILE_CLOTH_ORANGE 1329 -#define IDS_TILE_CLOTH_PINK 1330 -#define IDS_TILE_CLOTH_PURPLE 1331 -#define IDS_TILE_CLOTH_RED 1332 -#define IDS_TILE_CLOTH_SILVER 1333 -#define IDS_TILE_CLOTH_WHITE 1334 -#define IDS_TILE_CLOTH_YELLOW 1335 -#define IDS_TILE_COBBLESTONE_WALL 1336 -#define IDS_TILE_COBBLESTONE_WALL_MOSSY 1337 -#define IDS_TILE_COCOA 1338 -#define IDS_TILE_CROPS 1339 -#define IDS_TILE_DEAD_BUSH 1340 -#define IDS_TILE_DETECTOR_RAIL 1341 -#define IDS_TILE_DIODE 1342 -#define IDS_TILE_DIRT 1343 -#define IDS_TILE_DISPENSER 1344 -#define IDS_TILE_DOOR_IRON 1345 -#define IDS_TILE_DOOR_WOOD 1346 -#define IDS_TILE_DRAGONEGG 1347 -#define IDS_TILE_EMERALDBLOCK 1348 -#define IDS_TILE_EMERALDORE 1349 -#define IDS_TILE_ENCHANTMENTTABLE 1350 -#define IDS_TILE_END_PORTAL 1351 -#define IDS_TILE_ENDERCHEST 1352 -#define IDS_TILE_ENDPORTALFRAME 1353 -#define IDS_TILE_FARMLAND 1354 -#define IDS_TILE_FENCE 1355 -#define IDS_TILE_FENCE_GATE 1356 -#define IDS_TILE_FERN 1357 -#define IDS_TILE_FIRE 1358 -#define IDS_TILE_FLOWER 1359 -#define IDS_TILE_FLOWERPOT 1360 -#define IDS_TILE_FURNACE 1361 -#define IDS_TILE_GLASS 1362 -#define IDS_TILE_GOLDEN_RAIL 1363 -#define IDS_TILE_GRASS 1364 -#define IDS_TILE_GRAVEL 1365 -#define IDS_TILE_HELL_ROCK 1366 -#define IDS_TILE_HELL_SAND 1367 -#define IDS_TILE_HUGE_MUSHROOM_1 1368 -#define IDS_TILE_HUGE_MUSHROOM_2 1369 -#define IDS_TILE_ICE 1370 -#define IDS_TILE_IRON_FENCE 1371 -#define IDS_TILE_JUKEBOX 1372 -#define IDS_TILE_JUNGLE_PLANKS 1373 -#define IDS_TILE_LADDER 1374 -#define IDS_TILE_LAVA 1375 -#define IDS_TILE_LEAVES 1376 -#define IDS_TILE_LEAVES_BIRCH 1377 -#define IDS_TILE_LEAVES_JUNGLE 1378 -#define IDS_TILE_LEAVES_OAK 1379 -#define IDS_TILE_LEAVES_SPRUCE 1380 -#define IDS_TILE_LEVER 1381 -#define IDS_TILE_LIGHT_GEM 1382 -#define IDS_TILE_LIT_PUMPKIN 1383 -#define IDS_TILE_LOCKED_CHEST 1384 -#define IDS_TILE_LOG 1385 -#define IDS_TILE_LOG_BIRCH 1386 -#define IDS_TILE_LOG_JUNGLE 1387 -#define IDS_TILE_LOG_OAK 1388 -#define IDS_TILE_LOG_SPRUCE 1389 -#define IDS_TILE_MELON 1390 -#define IDS_TILE_MELON_STEM 1391 -#define IDS_TILE_MOB_SPAWNER 1392 -#define IDS_TILE_MONSTER_STONE_EGG 1393 -#define IDS_TILE_MUSHROOM 1394 -#define IDS_TILE_MUSIC_BLOCK 1395 -#define IDS_TILE_MYCEL 1396 -#define IDS_TILE_NETHER_QUARTZ 1397 -#define IDS_TILE_NETHERBRICK 1398 -#define IDS_TILE_NETHERFENCE 1399 -#define IDS_TILE_NETHERSTALK 1400 -#define IDS_TILE_NOT_GATE 1401 -#define IDS_TILE_OAK 1402 -#define IDS_TILE_OAKWOOD_PLANKS 1403 -#define IDS_TILE_OBSIDIAN 1404 -#define IDS_TILE_ORE_COAL 1405 -#define IDS_TILE_ORE_DIAMOND 1406 -#define IDS_TILE_ORE_GOLD 1407 -#define IDS_TILE_ORE_IRON 1408 -#define IDS_TILE_ORE_LAPIS 1409 -#define IDS_TILE_ORE_REDSTONE 1410 -#define IDS_TILE_PISTON_BASE 1411 -#define IDS_TILE_PISTON_STICK_BASE 1412 -#define IDS_TILE_PORTAL 1413 -#define IDS_TILE_POTATOES 1414 -#define IDS_TILE_PRESSURE_PLATE 1415 -#define IDS_TILE_PUMPKIN 1416 -#define IDS_TILE_PUMPKIN_STEM 1417 -#define IDS_TILE_QUARTZ_BLOCK 1418 -#define IDS_TILE_QUARTZ_BLOCK_CHISELED 1419 -#define IDS_TILE_QUARTZ_BLOCK_LINES 1420 -#define IDS_TILE_RAIL 1421 -#define IDS_TILE_REDSTONE_DUST 1422 -#define IDS_TILE_REDSTONE_LIGHT 1423 -#define IDS_TILE_REEDS 1424 -#define IDS_TILE_ROSE 1425 -#define IDS_TILE_SAND 1426 -#define IDS_TILE_SANDSTONE 1427 -#define IDS_TILE_SANDSTONE_CHISELED 1428 -#define IDS_TILE_SANDSTONE_SMOOTH 1429 -#define IDS_TILE_SAPLING 1430 -#define IDS_TILE_SAPLING_BIRCH 1431 -#define IDS_TILE_SAPLING_JUNGLE 1432 -#define IDS_TILE_SAPLING_OAK 1433 -#define IDS_TILE_SAPLING_SPRUCE 1434 -#define IDS_TILE_SHRUB 1435 -#define IDS_TILE_SIGN 1436 -#define IDS_TILE_SKULL 1437 -#define IDS_TILE_SNOW 1438 -#define IDS_TILE_SPONGE 1439 -#define IDS_TILE_SPRUCE 1440 -#define IDS_TILE_SPRUCEWOOD_PLANKS 1441 -#define IDS_TILE_STAIRS_BIRCHWOOD 1442 -#define IDS_TILE_STAIRS_BRICKS 1443 -#define IDS_TILE_STAIRS_JUNGLEWOOD 1444 -#define IDS_TILE_STAIRS_NETHERBRICK 1445 -#define IDS_TILE_STAIRS_QUARTZ 1446 -#define IDS_TILE_STAIRS_SANDSTONE 1447 -#define IDS_TILE_STAIRS_SPRUCEWOOD 1448 -#define IDS_TILE_STAIRS_STONE 1449 -#define IDS_TILE_STAIRS_STONE_BRICKS_SMOOTH 1450 -#define IDS_TILE_STAIRS_WOOD 1451 -#define IDS_TILE_STONE 1452 -#define IDS_TILE_STONE_BRICK 1453 -#define IDS_TILE_STONE_BRICK_SMOOTH 1454 -#define IDS_TILE_STONE_BRICK_SMOOTH_CHISELED 1455 -#define IDS_TILE_STONE_BRICK_SMOOTH_CRACKED 1456 -#define IDS_TILE_STONE_BRICK_SMOOTH_MOSSY 1457 -#define IDS_TILE_STONE_MOSS 1458 -#define IDS_TILE_STONE_SILVERFISH 1459 -#define IDS_TILE_STONE_SILVERFISH_COBBLESTONE 1460 -#define IDS_TILE_STONE_SILVERFISH_STONE_BRICK 1461 -#define IDS_TILE_STONESLAB 1462 -#define IDS_TILE_STONESLAB_BIRCH 1463 -#define IDS_TILE_STONESLAB_BRICK 1464 -#define IDS_TILE_STONESLAB_COBBLE 1465 -#define IDS_TILE_STONESLAB_JUNGLE 1466 -#define IDS_TILE_STONESLAB_NETHERBRICK 1467 -#define IDS_TILE_STONESLAB_OAK 1468 -#define IDS_TILE_STONESLAB_QUARTZ 1469 -#define IDS_TILE_STONESLAB_SAND 1470 -#define IDS_TILE_STONESLAB_SMOOTHBRICK 1471 -#define IDS_TILE_STONESLAB_SPRUCE 1472 -#define IDS_TILE_STONESLAB_STONE 1473 -#define IDS_TILE_STONESLAB_WOOD 1474 -#define IDS_TILE_TALL_GRASS 1475 -#define IDS_TILE_THIN_GLASS 1476 -#define IDS_TILE_TNT 1477 -#define IDS_TILE_TORCH 1478 -#define IDS_TILE_TORCHCHARCOAL 1479 -#define IDS_TILE_TORCHCOAL 1480 -#define IDS_TILE_TRAPDOOR 1481 -#define IDS_TILE_TRIPWIRE 1482 -#define IDS_TILE_TRIPWIRE_SOURCE 1483 -#define IDS_TILE_VINE 1484 -#define IDS_TILE_WATER 1485 -#define IDS_TILE_WATERLILY 1486 -#define IDS_TILE_WEB 1487 -#define IDS_TILE_WHITESTONE 1488 -#define IDS_TILE_WORKBENCH 1489 -#define IDS_TIPS_GAMETIP_0 1490 -#define IDS_TIPS_GAMETIP_1 1491 -#define IDS_TIPS_GAMETIP_10 1492 -#define IDS_TIPS_GAMETIP_11 1493 -#define IDS_TIPS_GAMETIP_12 1494 -#define IDS_TIPS_GAMETIP_13 1495 -#define IDS_TIPS_GAMETIP_14 1496 -#define IDS_TIPS_GAMETIP_15 1497 -#define IDS_TIPS_GAMETIP_16 1498 -#define IDS_TIPS_GAMETIP_17 1499 -#define IDS_TIPS_GAMETIP_18 1500 -#define IDS_TIPS_GAMETIP_19 1501 -#define IDS_TIPS_GAMETIP_2 1502 -#define IDS_TIPS_GAMETIP_20 1503 -#define IDS_TIPS_GAMETIP_21 1504 -#define IDS_TIPS_GAMETIP_22 1505 -#define IDS_TIPS_GAMETIP_23 1506 -#define IDS_TIPS_GAMETIP_24 1507 -#define IDS_TIPS_GAMETIP_25 1508 -#define IDS_TIPS_GAMETIP_26 1509 -#define IDS_TIPS_GAMETIP_27 1510 -#define IDS_TIPS_GAMETIP_28 1511 -#define IDS_TIPS_GAMETIP_29 1512 -#define IDS_TIPS_GAMETIP_3 1513 -#define IDS_TIPS_GAMETIP_30 1514 -#define IDS_TIPS_GAMETIP_31 1515 -#define IDS_TIPS_GAMETIP_32 1516 -#define IDS_TIPS_GAMETIP_33 1517 -#define IDS_TIPS_GAMETIP_34 1518 -#define IDS_TIPS_GAMETIP_35 1519 -#define IDS_TIPS_GAMETIP_36 1520 -#define IDS_TIPS_GAMETIP_37 1521 -#define IDS_TIPS_GAMETIP_38 1522 -#define IDS_TIPS_GAMETIP_39 1523 -#define IDS_TIPS_GAMETIP_4 1524 -#define IDS_TIPS_GAMETIP_40 1525 -#define IDS_TIPS_GAMETIP_41 1526 -#define IDS_TIPS_GAMETIP_42 1527 -#define IDS_TIPS_GAMETIP_43 1528 -#define IDS_TIPS_GAMETIP_44 1529 -#define IDS_TIPS_GAMETIP_45 1530 -#define IDS_TIPS_GAMETIP_46 1531 -#define IDS_TIPS_GAMETIP_47 1532 -#define IDS_TIPS_GAMETIP_48 1533 -#define IDS_TIPS_GAMETIP_49 1534 -#define IDS_TIPS_GAMETIP_5 1535 -#define IDS_TIPS_GAMETIP_50 1536 -#define IDS_TIPS_GAMETIP_6 1537 -#define IDS_TIPS_GAMETIP_7 1538 -#define IDS_TIPS_GAMETIP_8 1539 -#define IDS_TIPS_GAMETIP_9 1540 -#define IDS_TIPS_GAMETIP_NEWDLC 1541 -#define IDS_TIPS_GAMETIP_SKINPACKS 1542 -#define IDS_TIPS_TRIVIA_1 1543 -#define IDS_TIPS_TRIVIA_10 1544 -#define IDS_TIPS_TRIVIA_11 1545 -#define IDS_TIPS_TRIVIA_12 1546 -#define IDS_TIPS_TRIVIA_13 1547 -#define IDS_TIPS_TRIVIA_14 1548 -#define IDS_TIPS_TRIVIA_15 1549 -#define IDS_TIPS_TRIVIA_16 1550 -#define IDS_TIPS_TRIVIA_17 1551 -#define IDS_TIPS_TRIVIA_18 1552 -#define IDS_TIPS_TRIVIA_19 1553 -#define IDS_TIPS_TRIVIA_2 1554 -#define IDS_TIPS_TRIVIA_20 1555 -#define IDS_TIPS_TRIVIA_3 1556 -#define IDS_TIPS_TRIVIA_4 1557 -#define IDS_TIPS_TRIVIA_5 1558 -#define IDS_TIPS_TRIVIA_6 1559 -#define IDS_TIPS_TRIVIA_7 1560 -#define IDS_TIPS_TRIVIA_8 1561 -#define IDS_TIPS_TRIVIA_9 1562 -#define IDS_TITLE_DECLINE_SAVE_GAME 1563 -#define IDS_TITLE_RENAME 1564 -#define IDS_TITLE_RENAMESAVE 1565 -#define IDS_TITLE_SAVE_GAME 1566 -#define IDS_TITLE_START_GAME 1567 -#define IDS_TITLE_UPDATE_NAME 1568 -#define IDS_TITLEUPDATE 1569 -#define IDS_TNT_EXPLODES 1570 -#define IDS_TOOLTIP_CHANGE_NETWORK_MODE 1571 -#define IDS_TOOLTIPS_ACCEPT 1572 -#define IDS_TOOLTIPS_ALL_GAMES 1573 -#define IDS_TOOLTIPS_BACK 1574 -#define IDS_TOOLTIPS_BANLEVEL 1575 -#define IDS_TOOLTIPS_BLOCK 1576 -#define IDS_TOOLTIPS_CANCEL 1577 -#define IDS_TOOLTIPS_CANCEL_JOIN 1578 -#define IDS_TOOLTIPS_CHANGE_FILTER 1579 -#define IDS_TOOLTIPS_CHANGE_GROUP 1580 -#define IDS_TOOLTIPS_CHANGEDEVICE 1581 -#define IDS_TOOLTIPS_CHANGEPITCH 1582 -#define IDS_TOOLTIPS_CLEAR_QUICK_SELECT 1583 -#define IDS_TOOLTIPS_CLEARSLOTS 1584 -#define IDS_TOOLTIPS_COLLECT 1585 -#define IDS_TOOLTIPS_CONTINUE 1586 -#define IDS_TOOLTIPS_CRAFTING 1587 -#define IDS_TOOLTIPS_CREATE 1588 -#define IDS_TOOLTIPS_CREATIVE 1589 -#define IDS_TOOLTIPS_CURE 1590 -#define IDS_TOOLTIPS_DELETE 1591 -#define IDS_TOOLTIPS_DELETESAVE 1592 -#define IDS_TOOLTIPS_DETONATE 1593 -#define IDS_TOOLTIPS_DRAW_BOW 1594 -#define IDS_TOOLTIPS_DRINK 1595 -#define IDS_TOOLTIPS_DROP_ALL 1596 -#define IDS_TOOLTIPS_DROP_GENERIC 1597 -#define IDS_TOOLTIPS_DROP_ONE 1598 -#define IDS_TOOLTIPS_DYE 1599 -#define IDS_TOOLTIPS_DYECOLLAR 1600 -#define IDS_TOOLTIPS_EAT 1601 -#define IDS_TOOLTIPS_EJECT 1602 -#define IDS_TOOLTIPS_EMPTY 1603 -#define IDS_TOOLTIPS_EQUIP 1604 -#define IDS_TOOLTIPS_EXECUTE_COMMAND 1605 -#define IDS_TOOLTIPS_EXIT 1606 -#define IDS_TOOLTIPS_FEED 1607 -#define IDS_TOOLTIPS_FOLLOWME 1608 -#define IDS_TOOLTIPS_GAME_INVITES 1609 -#define IDS_TOOLTIPS_GROW 1610 -#define IDS_TOOLTIPS_HANG 1611 -#define IDS_TOOLTIPS_HARVEST 1612 -#define IDS_TOOLTIPS_HEAL 1613 -#define IDS_TOOLTIPS_HIDE 1614 -#define IDS_TOOLTIPS_HIT 1615 -#define IDS_TOOLTIPS_IGNITE 1616 -#define IDS_TOOLTIPS_INSTALL 1617 -#define IDS_TOOLTIPS_INSTALL_FULL 1618 -#define IDS_TOOLTIPS_INSTALL_TRIAL 1619 -#define IDS_TOOLTIPS_INVITE_FRIENDS 1620 -#define IDS_TOOLTIPS_INVITE_PARTY 1621 -#define IDS_TOOLTIPS_KICK 1622 -#define IDS_TOOLTIPS_LOVEMODE 1623 -#define IDS_TOOLTIPS_MILK 1624 -#define IDS_TOOLTIPS_MINE 1625 -#define IDS_TOOLTIPS_NAVIGATE 1626 -#define IDS_TOOLTIPS_NEXT 1627 -#define IDS_TOOLTIPS_OPEN 1628 -#define IDS_TOOLTIPS_OPTIONS 1629 -#define IDS_TOOLTIPS_PAGE_DOWN 1630 -#define IDS_TOOLTIPS_PAGE_UP 1631 -#define IDS_TOOLTIPS_PAGEDOWN 1632 -#define IDS_TOOLTIPS_PAGEUP 1633 -#define IDS_TOOLTIPS_PARTY_GAMES 1634 -#define IDS_TOOLTIPS_PICKUP_ALL 1635 -#define IDS_TOOLTIPS_PICKUP_GENERIC 1636 -#define IDS_TOOLTIPS_PICKUP_HALF 1637 -#define IDS_TOOLTIPS_PICKUPPLACE 1638 -#define IDS_TOOLTIPS_PLACE 1639 -#define IDS_TOOLTIPS_PLACE_ALL 1640 -#define IDS_TOOLTIPS_PLACE_GENERIC 1641 -#define IDS_TOOLTIPS_PLACE_ONE 1642 -#define IDS_TOOLTIPS_PLANT 1643 -#define IDS_TOOLTIPS_PLAY 1644 -#define IDS_TOOLTIPS_PREVIOUS 1645 -#define IDS_TOOLTIPS_PRIVILEGES 1646 -#define IDS_TOOLTIPS_QUICK_MOVE 1647 -#define IDS_TOOLTIPS_QUICK_MOVE_ARMOR 1648 -#define IDS_TOOLTIPS_QUICK_MOVE_FUEL 1649 -#define IDS_TOOLTIPS_QUICK_MOVE_INGREDIENT 1650 -#define IDS_TOOLTIPS_QUICK_MOVE_TOOL 1651 -#define IDS_TOOLTIPS_QUICK_MOVE_WEAPON 1652 -#define IDS_TOOLTIPS_READ 1653 -#define IDS_TOOLTIPS_REFRESH 1654 -#define IDS_TOOLTIPS_REINSTALL 1655 -#define IDS_TOOLTIPS_RELEASE_BOW 1656 -#define IDS_TOOLTIPS_REPAIR 1657 -#define IDS_TOOLTIPS_RIDE 1658 -#define IDS_TOOLTIPS_ROTATE 1659 -#define IDS_TOOLTIPS_SADDLE 1660 -#define IDS_TOOLTIPS_SAIL 1661 -#define IDS_TOOLTIPS_SAVEOPTIONS 1662 -#define IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD 1663 -#define IDS_TOOLTIPS_SAVETRANSFER_UPLOAD 1664 -#define IDS_TOOLTIPS_SELECT 1665 -#define IDS_TOOLTIPS_SELECT_SKIN 1666 -#define IDS_TOOLTIPS_SELECTDEVICE 1667 -#define IDS_TOOLTIPS_SEND_FRIEND_REQUEST 1668 -#define IDS_TOOLTIPS_SHARE 1669 -#define IDS_TOOLTIPS_SHEAR 1670 -#define IDS_TOOLTIPS_SHOW_DESCRIPTION 1671 -#define IDS_TOOLTIPS_SHOW_INGREDIENTS 1672 -#define IDS_TOOLTIPS_SHOW_INVENTORY 1673 -#define IDS_TOOLTIPS_SIT 1674 -#define IDS_TOOLTIPS_SLEEP 1675 -#define IDS_TOOLTIPS_SWAP 1676 -#define IDS_TOOLTIPS_SWIMUP 1677 -#define IDS_TOOLTIPS_TAME 1678 -#define IDS_TOOLTIPS_THROW 1679 -#define IDS_TOOLTIPS_TILL 1680 -#define IDS_TOOLTIPS_TRADE 1681 -#define IDS_TOOLTIPS_UNLOCKFULLVERSION 1682 -#define IDS_TOOLTIPS_USE 1683 -#define IDS_TOOLTIPS_VIEW_GAMERCARD 1684 -#define IDS_TOOLTIPS_VIEW_GAMERPROFILE 1685 -#define IDS_TOOLTIPS_WAKEUP 1686 -#define IDS_TOOLTIPS_WHAT_IS_THIS 1687 -#define IDS_TRIALOVER_TEXT 1688 -#define IDS_TRIALOVER_TITLE 1689 -#define IDS_TRUST_PLAYERS 1690 -#define IDS_TUTORIAL_BREEDING_OVERVIEW 1691 -#define IDS_TUTORIAL_COMPLETED 1692 -#define IDS_TUTORIAL_COMPLETED_EXPLORE 1693 -#define IDS_TUTORIAL_CONSTRAINT_TUTORIAL_AREA 1694 -#define IDS_TUTORIAL_CREATIVE_OVERVIEW 1695 -#define IDS_TUTORIAL_FARMING_OVERVIEW 1696 -#define IDS_TUTORIAL_FEATURES_IN_THIS_AREA 1697 -#define IDS_TUTORIAL_FEATURES_OUTSIDE_THIS_AREA 1698 -#define IDS_TUTORIAL_GOLEM_OVERVIEW 1699 -#define IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL 1700 -#define IDS_TUTORIAL_HINT_BOAT 1701 -#define IDS_TUTORIAL_HINT_CRAFT_NO_INGREDIENTS 1702 -#define IDS_TUTORIAL_HINT_DIGGER_ITEM_HATCHET 1703 -#define IDS_TUTORIAL_HINT_DIGGER_ITEM_PICKAXE 1704 -#define IDS_TUTORIAL_HINT_DIGGER_ITEM_SHOVEL 1705 -#define IDS_TUTORIAL_HINT_FISHING 1706 -#define IDS_TUTORIAL_HINT_HOLD_TO_MINE 1707 -#define IDS_TUTORIAL_HINT_INV_DROP 1708 -#define IDS_TUTORIAL_HINT_MINECART 1709 -#define IDS_TUTORIAL_HINT_PISTON_SELF_REPAIRING_BRIDGE 1710 -#define IDS_TUTORIAL_HINT_SWIM_UP 1711 -#define IDS_TUTORIAL_HINT_TOOL_DAMAGED 1712 -#define IDS_TUTORIAL_HTML_EXIT_PICTURE 1713 -#define IDS_TUTORIAL_NEW_FEATURES_CHOICE 1714 -#define IDS_TUTORIAL_PORTAL_OVERVIEW 1715 -#define IDS_TUTORIAL_PROMPT_ANVIL_MENU_OVERVIEW 1716 -#define IDS_TUTORIAL_PROMPT_ANVIL_OVERVIEW 1717 -#define IDS_TUTORIAL_PROMPT_BASIC_COMPLETE 1718 -#define IDS_TUTORIAL_PROMPT_BED_OVERVIEW 1719 -#define IDS_TUTORIAL_PROMPT_BOAT_OVERVIEW 1720 -#define IDS_TUTORIAL_PROMPT_BREEDING_OVERVIEW 1721 -#define IDS_TUTORIAL_PROMPT_BREWING_MENU_OVERVIEW 1722 -#define IDS_TUTORIAL_PROMPT_BREWING_OVERVIEW 1723 -#define IDS_TUTORIAL_PROMPT_CRAFT_OVERVIEW 1724 -#define IDS_TUTORIAL_PROMPT_CREATIVE_INV_OVERVIEW 1725 -#define IDS_TUTORIAL_PROMPT_CREATIVE_OVERVIEW 1726 -#define IDS_TUTORIAL_PROMPT_ENCHANTING_MENU_OVERVIEW 1727 -#define IDS_TUTORIAL_PROMPT_ENCHANTING_OVERVIEW 1728 -#define IDS_TUTORIAL_PROMPT_ENDERCHEST_OVERVIEW 1729 -#define IDS_TUTORIAL_PROMPT_FARMING_OVERVIEW 1730 -#define IDS_TUTORIAL_PROMPT_FISHING_OVERVIEW 1731 -#define IDS_TUTORIAL_PROMPT_FOOD_BAR_OVERVIEW 1732 -#define IDS_TUTORIAL_PROMPT_FURNACE_OVERVIEW 1733 -#define IDS_TUTORIAL_PROMPT_GOLEM_OVERVIEW 1734 -#define IDS_TUTORIAL_PROMPT_INV_OVERVIEW 1735 -#define IDS_TUTORIAL_PROMPT_MINECART_OVERVIEW 1736 -#define IDS_TUTORIAL_PROMPT_NEW_FEATURES_CHOICE 1737 -#define IDS_TUTORIAL_PROMPT_PORTAL_OVERVIEW 1738 -#define IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE 1739 -#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_DESCRIPTION 1740 -#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INGREDIENTS 1741 -#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INVENTORY 1742 -#define IDS_TUTORIAL_PROMPT_REDSTONE_OVERVIEW 1743 -#define IDS_TUTORIAL_PROMPT_START_TUTORIAL 1744 -#define IDS_TUTORIAL_PROMPT_TRADING_MENU_OVERVIEW 1745 -#define IDS_TUTORIAL_PROMPT_TRADING_OVERVIEW 1746 -#define IDS_TUTORIAL_REDSTONE_OVERVIEW 1747 -#define IDS_TUTORIAL_REMINDER 1748 -#define IDS_TUTORIAL_TASK_ACTIVATE_PORTAL 1749 -#define IDS_TUTORIAL_TASK_ANVIL_COST 1750 -#define IDS_TUTORIAL_TASK_ANVIL_COST2 1751 -#define IDS_TUTORIAL_TASK_ANVIL_ENCHANTED_BOOKS 1752 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_COST 1753 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_ENCHANT 1754 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_OVERVIEW 1755 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_RENAMING 1756 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_REPAIR 1757 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_SACRIFICE 1758 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_SMITH 1759 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_START 1760 -#define IDS_TUTORIAL_TASK_ANVIL_OVERVIEW 1761 -#define IDS_TUTORIAL_TASK_ANVIL_RENAMING 1762 -#define IDS_TUTORIAL_TASK_ANVIL_SUMMARY 1763 -#define IDS_TUTORIAL_TASK_ANVIL_USE_CHESTS 1764 -#define IDS_TUTORIAL_TASK_BASIC_COMPLETE 1765 -#define IDS_TUTORIAL_TASK_BED_MULTIPLAYER 1766 -#define IDS_TUTORIAL_TASK_BED_OVERVIEW 1767 -#define IDS_TUTORIAL_TASK_BED_PLACEMENT 1768 -#define IDS_TUTORIAL_TASK_BOAT_OVERVIEW 1769 -#define IDS_TUTORIAL_TASK_BOAT_STEER 1770 -#define IDS_TUTORIAL_TASK_BREEDING_BABY 1771 -#define IDS_TUTORIAL_TASK_BREEDING_COMPLETE 1772 -#define IDS_TUTORIAL_TASK_BREEDING_DELAY 1773 -#define IDS_TUTORIAL_TASK_BREEDING_FEED 1774 -#define IDS_TUTORIAL_TASK_BREEDING_FEED_FOOD 1775 -#define IDS_TUTORIAL_TASK_BREEDING_FOLLOW 1776 -#define IDS_TUTORIAL_TASK_BREEDING_RIDING_PIGS 1777 -#define IDS_TUTORIAL_TASK_BREEDING_WOLF_COLLAR 1778 -#define IDS_TUTORIAL_TASK_BREEDING_WOLF_TAMING 1779 -#define IDS_TUTORIAL_TASK_BREWING_CREATE_FIRE_POTION 1780 -#define IDS_TUTORIAL_TASK_BREWING_DRINK_FIRE_POTION 1781 -#define IDS_TUTORIAL_TASK_BREWING_FILL_CAULDRON 1782 -#define IDS_TUTORIAL_TASK_BREWING_FILL_GLASS_BOTTLE 1783 -#define IDS_TUTORIAL_TASK_BREWING_GET_GLASS_BOTTLE 1784 -#define IDS_TUTORIAL_TASK_BREWING_MENU_BASIC_INGREDIENTS 1785 -#define IDS_TUTORIAL_TASK_BREWING_MENU_CREATE_FIRE_POTION 1786 -#define IDS_TUTORIAL_TASK_BREWING_MENU_EXIT 1787 -#define IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS 1788 -#define IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS_2 1789 -#define IDS_TUTORIAL_TASK_BREWING_MENU_METHOD 1790 -#define IDS_TUTORIAL_TASK_BREWING_MENU_OVERVIEW 1791 -#define IDS_TUTORIAL_TASK_BREWING_OVERVIEW 1792 -#define IDS_TUTORIAL_TASK_BREWING_USE_EFFECTS 1793 -#define IDS_TUTORIAL_TASK_BREWING_USE_POTION 1794 -#define IDS_TUTORIAL_TASK_BUILD_PORTAL 1795 -#define IDS_TUTORIAL_TASK_CHOP_WOOD 1796 -#define IDS_TUTORIAL_TASK_COLLECT_RESOURCES 1797 -#define IDS_TUTORIAL_TASK_CRAFT_CRAFT_TABLE 1798 -#define IDS_TUTORIAL_TASK_CRAFT_CREATE 1799 -#define IDS_TUTORIAL_TASK_CRAFT_CREATE_FURNACE 1800 -#define IDS_TUTORIAL_TASK_CRAFT_CREATE_PLANKS 1801 -#define IDS_TUTORIAL_TASK_CRAFT_DESCRIPTION 1802 -#define IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_FURNACE 1803 -#define IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_TABLE 1804 -#define IDS_TUTORIAL_TASK_CRAFT_INGREDIENTS 1805 -#define IDS_TUTORIAL_TASK_CRAFT_INVENTORY 1806 -#define IDS_TUTORIAL_TASK_CRAFT_NAV 1807 -#define IDS_TUTORIAL_TASK_CRAFT_OVERVIEW 1808 -#define IDS_TUTORIAL_TASK_CRAFT_SELECT_CRAFTING_TABLE 1809 -#define IDS_TUTORIAL_TASK_CRAFT_SELECT_STRUCTURES 1810 -#define IDS_TUTORIAL_TASK_CRAFT_SELECT_TOOLS 1811 -#define IDS_TUTORIAL_TASK_CRAFT_SELECT_WOODEN_SHOVEL 1812 -#define IDS_TUTORIAL_TASK_CRAFT_TOOLS_BUILT 1813 -#define IDS_TUTORIAL_TASK_CRAFTING 1814 -#define IDS_TUTORIAL_TASK_CREATE_CHARCOAL 1815 -#define IDS_TUTORIAL_TASK_CREATE_CRAFTING_TABLE 1816 -#define IDS_TUTORIAL_TASK_CREATE_FURNACE 1817 -#define IDS_TUTORIAL_TASK_CREATE_GLASS 1818 -#define IDS_TUTORIAL_TASK_CREATE_PLANKS 1819 -#define IDS_TUTORIAL_TASK_CREATE_STICKS 1820 -#define IDS_TUTORIAL_TASK_CREATE_TORCH 1821 -#define IDS_TUTORIAL_TASK_CREATE_WOODEN_DOOR 1822 -#define IDS_TUTORIAL_TASK_CREATE_WOODEN_HATCHET 1823 -#define IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE 1824 -#define IDS_TUTORIAL_TASK_CREATE_WOODEN_SHOVEL 1825 -#define IDS_TUTORIAL_TASK_CREATIVE_COMPLETE 1826 -#define IDS_TUTORIAL_TASK_CREATIVE_EXIT 1827 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_DROP 1828 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_EXIT 1829 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_INFO 1830 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_MOVE 1831 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_NAV 1832 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_OVERVIEW 1833 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_PICK_UP 1834 -#define IDS_TUTORIAL_TASK_CREATIVE_MODE 1835 -#define IDS_TUTORIAL_TASK_ENCHANTING_BOOKCASES 1836 -#define IDS_TUTORIAL_TASK_ENCHANTING_BOOKS 1837 -#define IDS_TUTORIAL_TASK_ENCHANTING_BOTTLE_O_ENCHANTING 1838 -#define IDS_TUTORIAL_TASK_ENCHANTING_EXPERIENCE 1839 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_BETTER_ENCHANTMENTS 1840 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_COST 1841 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANT 1842 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANTMENTS 1843 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_OVERVIEW 1844 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_START 1845 -#define IDS_TUTORIAL_TASK_ENCHANTING_OVERVIEW 1846 -#define IDS_TUTORIAL_TASK_ENCHANTING_SUMMARY 1847 -#define IDS_TUTORIAL_TASK_ENCHANTING_USE_CHESTS 1848 -#define IDS_TUTORIAL_TASK_ENDERCHEST_FUNCTION 1849 -#define IDS_TUTORIAL_TASK_ENDERCHEST_OVERVIEW 1850 -#define IDS_TUTORIAL_TASK_ENDERCHEST_PLAYERS 1851 -#define IDS_TUTORIAL_TASK_ENDERCHEST_SUMMARY 1852 -#define IDS_TUTORIAL_TASK_FARMING_BONEMEAL 1853 -#define IDS_TUTORIAL_TASK_FARMING_CACTUS 1854 -#define IDS_TUTORIAL_TASK_FARMING_CARROTS_AND_POTATOES 1855 -#define IDS_TUTORIAL_TASK_FARMING_COMPLETE 1856 -#define IDS_TUTORIAL_TASK_FARMING_FARMLAND 1857 -#define IDS_TUTORIAL_TASK_FARMING_MUSHROOM 1858 -#define IDS_TUTORIAL_TASK_FARMING_PUMPKIN_AND_MELON 1859 -#define IDS_TUTORIAL_TASK_FARMING_SEEDS 1860 -#define IDS_TUTORIAL_TASK_FARMING_SUGARCANE 1861 -#define IDS_TUTORIAL_TASK_FARMING_WHEAT 1862 -#define IDS_TUTORIAL_TASK_FISHING_CAST 1863 -#define IDS_TUTORIAL_TASK_FISHING_FISH 1864 -#define IDS_TUTORIAL_TASK_FISHING_OVERVIEW 1865 -#define IDS_TUTORIAL_TASK_FISHING_USES 1866 -#define IDS_TUTORIAL_TASK_FLY 1867 -#define IDS_TUTORIAL_TASK_FOOD_BAR_DEPLETE 1868 -#define IDS_TUTORIAL_TASK_FOOD_BAR_EAT_STEAK 1869 -#define IDS_TUTORIAL_TASK_FOOD_BAR_FEED 1870 -#define IDS_TUTORIAL_TASK_FOOD_BAR_HEAL 1871 -#define IDS_TUTORIAL_TASK_FOOD_BAR_OVERVIEW 1872 -#define IDS_TUTORIAL_TASK_FURNACE_CHARCOAL_USES 1873 -#define IDS_TUTORIAL_TASK_FURNACE_CREATE_CHARCOAL 1874 -#define IDS_TUTORIAL_TASK_FURNACE_CREATE_GLASS 1875 -#define IDS_TUTORIAL_TASK_FURNACE_FUELS 1876 -#define IDS_TUTORIAL_TASK_FURNACE_INGREDIENTS 1877 -#define IDS_TUTORIAL_TASK_FURNACE_METHOD 1878 -#define IDS_TUTORIAL_TASK_FURNACE_OVERVIEW 1879 -#define IDS_TUTORIAL_TASK_GOLEM_IRON 1880 -#define IDS_TUTORIAL_TASK_GOLEM_IRON_VILLAGE 1881 -#define IDS_TUTORIAL_TASK_GOLEM_PUMPKIN 1882 -#define IDS_TUTORIAL_TASK_GOLEM_SNOW 1883 -#define IDS_TUTORIAL_TASK_INV_DROP 1884 -#define IDS_TUTORIAL_TASK_INV_EXIT 1885 -#define IDS_TUTORIAL_TASK_INV_INFO 1886 -#define IDS_TUTORIAL_TASK_INV_MOVE 1887 -#define IDS_TUTORIAL_TASK_INV_OVERVIEW 1888 -#define IDS_TUTORIAL_TASK_INV_PICK_UP 1889 -#define IDS_TUTORIAL_TASK_INVENTORY 1890 -#define IDS_TUTORIAL_TASK_JUMP 1891 -#define IDS_TUTORIAL_TASK_LOOK 1892 -#define IDS_TUTORIAL_TASK_MINE 1893 -#define IDS_TUTORIAL_TASK_MINE_STONE 1894 -#define IDS_TUTORIAL_TASK_MINECART_OVERVIEW 1895 -#define IDS_TUTORIAL_TASK_MINECART_POWERED_RAILS 1896 -#define IDS_TUTORIAL_TASK_MINECART_PUSHING 1897 -#define IDS_TUTORIAL_TASK_MINECART_RAILS 1898 -#define IDS_TUTORIAL_TASK_MOVE 1899 -#define IDS_TUTORIAL_TASK_NEARBY_SHELTER 1900 -#define IDS_TUTORIAL_TASK_NETHER 1901 -#define IDS_TUTORIAL_TASK_NETHER_FAST_TRAVEL 1902 -#define IDS_TUTORIAL_TASK_NIGHT_DANGER 1903 -#define IDS_TUTORIAL_TASK_OPEN_CONTAINER 1904 -#define IDS_TUTORIAL_TASK_OPEN_CREATIVE_INVENTORY 1905 -#define IDS_TUTORIAL_TASK_OPEN_WORKBENCH 1906 -#define IDS_TUTORIAL_TASK_OVERVIEW 1907 -#define IDS_TUTORIAL_TASK_PISTONS 1908 -#define IDS_TUTORIAL_TASK_PLACE_AND_OPEN_FURNACE 1909 -#define IDS_TUTORIAL_TASK_PLACE_DOOR 1910 -#define IDS_TUTORIAL_TASK_PLACE_WORKBENCH 1911 -#define IDS_TUTORIAL_TASK_REDSTONE_DUST 1912 -#define IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES 1913 -#define IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES_POSITION 1914 -#define IDS_TUTORIAL_TASK_REDSTONE_REPEATER 1915 -#define IDS_TUTORIAL_TASK_REDSTONE_TRIPWIRE 1916 -#define IDS_TUTORIAL_TASK_SCROLL 1917 -#define IDS_TUTORIAL_TASK_SPRINT 1918 -#define IDS_TUTORIAL_TASK_TRADING_DECREASE_TRADES 1919 -#define IDS_TUTORIAL_TASK_TRADING_INCREASE_TRADES 1920 -#define IDS_TUTORIAL_TASK_TRADING_MENU_DETAILS 1921 -#define IDS_TUTORIAL_TASK_TRADING_MENU_INVENTORY 1922 -#define IDS_TUTORIAL_TASK_TRADING_MENU_OVERVIEW 1923 -#define IDS_TUTORIAL_TASK_TRADING_MENU_START 1924 -#define IDS_TUTORIAL_TASK_TRADING_MENU_TRADE 1925 -#define IDS_TUTORIAL_TASK_TRADING_MENU_UNAVAILABLE 1926 -#define IDS_TUTORIAL_TASK_TRADING_OVERVIEW 1927 -#define IDS_TUTORIAL_TASK_TRADING_SUMMARY 1928 -#define IDS_TUTORIAL_TASK_TRADING_TRADES 1929 -#define IDS_TUTORIAL_TASK_TRADING_USE_CHESTS 1930 -#define IDS_TUTORIAL_TASK_TRY_IT 1931 -#define IDS_TUTORIAL_TASK_USE 1932 -#define IDS_TUTORIAL_TASK_USE_PORTAL 1933 -#define IDS_TUTORIALSAVENAME 1934 -#define IDS_UNHIDE_MASHUP_WORLDS 1935 -#define IDS_UNLOCK_ACCEPT_INVITE 1936 -#define IDS_UNLOCK_ACHIEVEMENT_TEXT 1937 -#define IDS_UNLOCK_DLC_SKIN 1938 -#define IDS_UNLOCK_DLC_TEXTUREPACK_TEXT 1939 -#define IDS_UNLOCK_DLC_TEXTUREPACK_TITLE 1940 -#define IDS_UNLOCK_DLC_TITLE 1941 -#define IDS_UNLOCK_FULL_GAME 1942 -#define IDS_UNLOCK_GUEST_TEXT 1943 -#define IDS_UNLOCK_KICK_PLAYER 1944 -#define IDS_UNLOCK_KICK_PLAYER_TITLE 1945 -#define IDS_UNLOCK_THEME_TEXT 1946 -#define IDS_UNLOCK_TITLE 1947 -#define IDS_UNLOCK_TOSAVE_TEXT 1948 -#define IDS_USER_INTERFACE 1949 -#define IDS_USING_TRIAL_TEXUREPACK_WARNING 1950 -#define IDS_VIEW_BOBBING 1951 -#define IDS_VILLAGER 1952 -#define IDS_VILLAGER_BUTCHER 1953 -#define IDS_VILLAGER_FARMER 1954 -#define IDS_VILLAGER_LIBRARIAN 1955 -#define IDS_VILLAGER_OFFERS_ITEM 1956 -#define IDS_VILLAGER_PRIEST 1957 -#define IDS_VILLAGER_SMITH 1958 -#define IDS_WARNING_ARCADE_TEXT 1959 -#define IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT 1960 -#define IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE 1961 -#define IDS_WIN_TEXT 1962 -#define IDS_WIN_TEXT_PART_2 1963 -#define IDS_WIN_TEXT_PART_3 1964 -#define IDS_WOLF 1965 -#define IDS_WORLD_NAME 1966 -#define IDS_WORLD_OPTIONS 1967 -#define IDS_YES 1968 -#define IDS_YOU_DIED 1969 -#define IDS_YOU_HAVE 1970 -#define IDS_ZOMBIE 1971 +#define IDS_ADVENTURE 4 +#define IDS_ALLOWFRIENDSOFFRIENDS 5 +#define IDS_ANY_WOOL 6 +#define IDS_ATTRIBUTE_NAME_GENERIC_ATTACKDAMAGE 7 +#define IDS_ATTRIBUTE_NAME_GENERIC_FOLLOWRANGE 8 +#define IDS_ATTRIBUTE_NAME_GENERIC_KNOCKBACKRESISTANCE 9 +#define IDS_ATTRIBUTE_NAME_GENERIC_MAXHEALTH 10 +#define IDS_ATTRIBUTE_NAME_GENERIC_MOVEMENTSPEED 11 +#define IDS_ATTRIBUTE_NAME_HORSE_JUMPSTRENGTH 12 +#define IDS_ATTRIBUTE_NAME_ZOMBIE_SPAWNREINFORCEMENTS 13 +#define IDS_AUDIO 14 +#define IDS_AUTOSAVE_COUNTDOWN 15 +#define IDS_AWARD_GAMERPIC1 16 +#define IDS_AWARD_GAMERPIC2 17 +#define IDS_AWARD_TITLE 18 +#define IDS_BACK 19 +#define IDS_BACK_BUTTON 20 +#define IDS_BANNED_LEVEL_TITLE 21 +#define IDS_BAT 22 +#define IDS_BLAZE 23 +#define IDS_BONUS_CHEST 24 +#define IDS_BOSS_ENDERDRAGON_HEALTH 25 +#define IDS_BREWING_STAND 26 +#define IDS_BUTTON_REMOVE_FROM_BAN_LIST 27 +#define IDS_CAN_ATTACK_ANIMALS 28 +#define IDS_CAN_ATTACK_PLAYERS 29 +#define IDS_CAN_BUILD_AND_MINE 30 +#define IDS_CAN_DISABLE_EXHAUSTION 31 +#define IDS_CAN_FLY 32 +#define IDS_CAN_INVISIBLE 33 +#define IDS_CAN_OPEN_CONTAINERS 34 +#define IDS_CAN_USE_DOORS_AND_SWITCHES 35 +#define IDS_CANCEL 36 +#define IDS_CANCEL_UPLOAD_TEXT 37 +#define IDS_CANCEL_UPLOAD_TITLE 38 +#define IDS_CANT_PLACE_NEAR_SPAWN_TEXT 39 +#define IDS_CANT_PLACE_NEAR_SPAWN_TITLE 40 +#define IDS_CANT_SHEAR_MOOSHROOM 41 +#define IDS_CANT_SPAWN_IN_PEACEFUL 42 +#define IDS_CANTJOIN_TITLE 43 +#define IDS_CARROTS 44 +#define IDS_CAVE_SPIDER 45 +#define IDS_CHANGE_SKIN 46 +#define IDS_CHAT_RESTRICTION_UGC 47 +#define IDS_CHECKBOX_ANIMATED_CHARACTER 48 +#define IDS_CHECKBOX_CUSTOM_SKIN_ANIM 49 +#define IDS_CHECKBOX_DEATH_MESSAGES 50 +#define IDS_CHECKBOX_DISPLAY_HAND 51 +#define IDS_CHECKBOX_DISPLAY_HUD 52 +#define IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS 53 +#define IDS_CHECKBOX_RENDER_BEDROCKFOG 54 +#define IDS_CHECKBOX_RENDER_CLOUDS 55 +#define IDS_CHECKBOX_VERTICAL_SPLIT_SCREEN 56 +#define IDS_CHEST 57 +#define IDS_CHEST_LARGE 58 +#define IDS_CHICKEN 59 +#define IDS_COMMAND_TELEPORT_ME 60 +#define IDS_COMMAND_TELEPORT_SUCCESS 61 +#define IDS_COMMAND_TELEPORT_TO_ME 62 +#define IDS_CONFIRM_CANCEL 63 +#define IDS_CONFIRM_DECLINE_SAVE_GAME 64 +#define IDS_CONFIRM_EXIT_GAME 65 +#define IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE 66 +#define IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST 67 +#define IDS_CONFIRM_LEAVE_VIA_INVITE 68 +#define IDS_CONFIRM_OK 69 +#define IDS_CONFIRM_SAVE_GAME 70 +#define IDS_CONFIRM_START_CREATIVE 71 +#define IDS_CONFIRM_START_HOST_PRIVILEGES 72 +#define IDS_CONFIRM_START_SAVEDINCREATIVE 73 +#define IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE 74 +#define IDS_CONNECTION_FAILED 75 +#define IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN 76 +#define IDS_CONNECTION_LOST 77 +#define IDS_CONNECTION_LOST_LIVE 78 +#define IDS_CONNECTION_LOST_LIVE_NO_EXIT 79 +#define IDS_CONNECTION_LOST_SERVER 80 +#define IDS_CONTAINER_ANIMAL 81 +#define IDS_CONTAINER_BEACON 82 +#define IDS_CONTAINER_BEACON_PRIMARY_POWER 83 +#define IDS_CONTAINER_BEACON_SECONDARY_POWER 84 +#define IDS_CONTAINER_DROPPER 85 +#define IDS_CONTAINER_HOPPER 86 +#define IDS_CONTAINER_MINECART 87 +#define IDS_CONTENT_RESTRICTION 88 +#define IDS_CONTENT_RESTRICTION_MULTIPLAYER 89 +#define IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE 90 +#define IDS_CONTROL 91 +#define IDS_CONTROLER_DISCONNECT_TEXT 92 +#define IDS_CONTROLER_DISCONNECT_TITLE 93 +#define IDS_CONTROLLER_A 94 +#define IDS_CONTROLLER_B 95 +#define IDS_CONTROLLER_BACK 96 +#define IDS_CONTROLLER_DPAD_D 97 +#define IDS_CONTROLLER_DPAD_L 98 +#define IDS_CONTROLLER_DPAD_R 99 +#define IDS_CONTROLLER_DPAD_U 100 +#define IDS_CONTROLLER_LEFT_BUMPER 101 +#define IDS_CONTROLLER_LEFT_STICK 102 +#define IDS_CONTROLLER_LEFT_THUMBSTICK 103 +#define IDS_CONTROLLER_LEFT_TRIGGER 104 +#define IDS_CONTROLLER_RIGHT_BUMPER 105 +#define IDS_CONTROLLER_RIGHT_STICK 106 +#define IDS_CONTROLLER_RIGHT_THUMBSTICK 107 +#define IDS_CONTROLLER_RIGHT_TRIGGER 108 +#define IDS_CONTROLLER_START 109 +#define IDS_CONTROLLER_X 110 +#define IDS_CONTROLLER_Y 111 +#define IDS_CONTROLS 112 +#define IDS_CONTROLS_ACTION 113 +#define IDS_CONTROLS_CRAFTING 114 +#define IDS_CONTROLS_DPAD 115 +#define IDS_CONTROLS_DROP 116 +#define IDS_CONTROLS_HELDITEM 117 +#define IDS_CONTROLS_INVENTORY 118 +#define IDS_CONTROLS_JUMP 119 +#define IDS_CONTROLS_JUMPFLY 120 +#define IDS_CONTROLS_LAYOUT 121 +#define IDS_CONTROLS_LOOK 122 +#define IDS_CONTROLS_MOVE 123 +#define IDS_CONTROLS_PAUSE 124 +#define IDS_CONTROLS_PLAYERS 125 +#define IDS_CONTROLS_SCHEME0 126 +#define IDS_CONTROLS_SCHEME1 127 +#define IDS_CONTROLS_SCHEME2 128 +#define IDS_CONTROLS_SNEAK 129 +#define IDS_CONTROLS_SNEAKFLY 130 +#define IDS_CONTROLS_THIRDPERSON 131 +#define IDS_CONTROLS_USE 132 +#define IDS_CORRUPT_DLC 133 +#define IDS_CORRUPT_DLC_MULTIPLE 134 +#define IDS_CORRUPT_DLC_TITLE 135 +#define IDS_CORRUPT_FILE 136 +#define IDS_CORRUPT_OPTIONS 137 +#define IDS_CORRUPT_OPTIONS_DELETE 138 +#define IDS_CORRUPT_OPTIONS_RETRY 139 +#define IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT 140 +#define IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE 141 +#define IDS_CORRUPT_SAVECACHE 142 +#define IDS_CORRUPTSAVE_TEXT 143 +#define IDS_CORRUPTSAVE_TITLE 144 +#define IDS_COW 145 +#define IDS_CREATE_NEW_WORLD 146 +#define IDS_CREATE_NEW_WORLD_RANDOM_SEED 147 +#define IDS_CREATE_NEW_WORLD_SEED 148 +#define IDS_CREATE_NEW_WORLD_SEEDTEXT 149 +#define IDS_CREATEANEWSAVE 150 +#define IDS_CREATED_IN_CREATIVE 151 +#define IDS_CREATED_IN_SURVIVAL 152 +#define IDS_CREATIVE 153 +#define IDS_CREDITS 154 +#define IDS_CREDITS_ADDITIONALSTE 155 +#define IDS_CREDITS_ART 156 +#define IDS_CREDITS_ARTDEVELOPER 157 +#define IDS_CREDITS_ASIALOC 158 +#define IDS_CREDITS_BIZDEV 159 +#define IDS_CREDITS_BULLYCOORD 160 +#define IDS_CREDITS_CEO 161 +#define IDS_CREDITS_CHIEFARCHITECT 162 +#define IDS_CREDITS_CODENINJA 163 +#define IDS_CREDITS_COMMUNITYMANAGER 164 +#define IDS_CREDITS_CONCEPTART 165 +#define IDS_CREDITS_CRUNCHER 166 +#define IDS_CREDITS_CUSTOMERSUPPORT 167 +#define IDS_CREDITS_DESIGNTEAM 168 +#define IDS_CREDITS_DESPROG 169 +#define IDS_CREDITS_DEVELOPER 170 +#define IDS_CREDITS_DEVELOPMENTTEAM 171 +#define IDS_CREDITS_DOF 172 +#define IDS_CREDITS_EUROPELOC 173 +#define IDS_CREDITS_EXECPRODUCER 174 +#define IDS_CREDITS_EXPLODANIM 175 +#define IDS_CREDITS_GAMECRAFTER 176 +#define IDS_CREDITS_JON_KAGSTROM 177 +#define IDS_CREDITS_LEADPC 178 +#define IDS_CREDITS_LEADPRODUCER 179 +#define IDS_CREDITS_LEADTESTER 180 +#define IDS_CREDITS_MARKETING 181 +#define IDS_CREDITS_MGSCENTRAL 182 +#define IDS_CREDITS_MILESTONEACCEPT 183 +#define IDS_CREDITS_MUSICANDSOUNDS 184 +#define IDS_CREDITS_OFFICEDJ 185 +#define IDS_CREDITS_ORIGINALDESIGN 186 +#define IDS_CREDITS_PMPROD 187 +#define IDS_CREDITS_PORTFOLIODIRECTOR 188 +#define IDS_CREDITS_PRODUCER 189 +#define IDS_CREDITS_PRODUCTMANAGER 190 +#define IDS_CREDITS_PROGRAMMING 191 +#define IDS_CREDITS_PROJECT 192 +#define IDS_CREDITS_QA 193 +#define IDS_CREDITS_REDMONDLOC 194 +#define IDS_CREDITS_RELEASEMANAGEMENT 195 +#define IDS_CREDITS_RESTOFMOJANG 196 +#define IDS_CREDITS_RISE_LUGO 197 +#define IDS_CREDITS_SDET 198 +#define IDS_CREDITS_SPECIALTHANKS 199 +#define IDS_CREDITS_SRTESTLEAD 200 +#define IDS_CREDITS_TESTASSOCIATES 201 +#define IDS_CREDITS_TESTLEAD 202 +#define IDS_CREDITS_TESTMANAGER 203 +#define IDS_CREDITS_TOBIAS_MOLLSTAM 204 +#define IDS_CREDITS_USERRESEARCH 205 +#define IDS_CREDITS_WCW 206 +#define IDS_CREDITS_XBLADIRECTOR 207 +#define IDS_CREEPER 208 +#define IDS_CURRENT_LAYOUT 209 +#define IDS_DAYLIGHT_CYCLE 210 +#define IDS_DEATH_ARROW 211 +#define IDS_DEATH_ARROW_ITEM 212 +#define IDS_DEATH_CACTUS 213 +#define IDS_DEATH_CACTUS_PLAYER 214 +#define IDS_DEATH_DRAGON_BREATH 215 +#define IDS_DEATH_DROWN 216 +#define IDS_DEATH_DROWN_PLAYER 217 +#define IDS_DEATH_EXPLOSION 218 +#define IDS_DEATH_EXPLOSION_PLAYER 219 +#define IDS_DEATH_FALL 220 +#define IDS_DEATH_FALLING_ANVIL 221 +#define IDS_DEATH_FALLING_TILE 222 +#define IDS_DEATH_FELL_ACCIDENT_GENERIC 223 +#define IDS_DEATH_FELL_ACCIDENT_LADDER 224 +#define IDS_DEATH_FELL_ACCIDENT_VINES 225 +#define IDS_DEATH_FELL_ACCIDENT_WATER 226 +#define IDS_DEATH_FELL_ASSIST 227 +#define IDS_DEATH_FELL_ASSIST_ITEM 228 +#define IDS_DEATH_FELL_FINISH 229 +#define IDS_DEATH_FELL_FINISH_ITEM 230 +#define IDS_DEATH_FELL_KILLER 231 +#define IDS_DEATH_FIREBALL 232 +#define IDS_DEATH_FIREBALL_ITEM 233 +#define IDS_DEATH_GENERIC 234 +#define IDS_DEATH_INDIRECT_MAGIC 235 +#define IDS_DEATH_INDIRECT_MAGIC_ITEM 236 +#define IDS_DEATH_INFIRE 237 +#define IDS_DEATH_INFIRE_PLAYER 238 +#define IDS_DEATH_INWALL 239 +#define IDS_DEATH_LAVA 240 +#define IDS_DEATH_LAVA_PLAYER 241 +#define IDS_DEATH_MAGIC 242 +#define IDS_DEATH_MOB 243 +#define IDS_DEATH_ONFIRE 244 +#define IDS_DEATH_ONFIRE_PLAYER 245 +#define IDS_DEATH_OUTOFWORLD 246 +#define IDS_DEATH_PLAYER 247 +#define IDS_DEATH_PLAYER_ITEM 248 +#define IDS_DEATH_STARVE 249 +#define IDS_DEATH_THORNS 250 +#define IDS_DEATH_THROWN 251 +#define IDS_DEATH_THROWN_ITEM 252 +#define IDS_DEATH_WITHER 253 +#define IDS_DEBUG_SETTINGS 254 +#define IDS_DEFAULT_SAVENAME 255 +#define IDS_DEFAULT_SKINS 256 +#define IDS_DEFAULT_TEXTUREPACK 257 +#define IDS_DEFAULT_WORLD_NAME 258 +#define IDS_DEFAULTS_TEXT 259 +#define IDS_DEFAULTS_TITLE 260 +#define IDS_DESC_ACTIVATOR_RAIL 261 +#define IDS_DESC_ANVIL 262 +#define IDS_DESC_APPLE 263 +#define IDS_DESC_ARROW 264 +#define IDS_DESC_BAT 265 +#define IDS_DESC_BEACON 266 +#define IDS_DESC_BED 267 +#define IDS_DESC_BEDROCK 268 +#define IDS_DESC_BEEF_COOKED 269 +#define IDS_DESC_BEEF_RAW 270 +#define IDS_DESC_BLAZE 271 +#define IDS_DESC_BLAZE_POWDER 272 +#define IDS_DESC_BLAZE_ROD 273 +#define IDS_DESC_BLOCK 274 +#define IDS_DESC_BLOCK_DIAMOND 275 +#define IDS_DESC_BLOCK_GOLD 276 +#define IDS_DESC_BLOCK_IRON 277 +#define IDS_DESC_BLOCK_LAPIS 278 +#define IDS_DESC_BOAT 279 +#define IDS_DESC_BONE 280 +#define IDS_DESC_BOOK 281 +#define IDS_DESC_BOOKSHELF 282 +#define IDS_DESC_BOOTS 283 +#define IDS_DESC_BOOTS_CHAIN 284 +#define IDS_DESC_BOOTS_DIAMOND 285 +#define IDS_DESC_BOOTS_GOLD 286 +#define IDS_DESC_BOOTS_IRON 287 +#define IDS_DESC_BOOTS_LEATHER 288 +#define IDS_DESC_BOW 289 +#define IDS_DESC_BOWL 290 +#define IDS_DESC_BREAD 291 +#define IDS_DESC_BREWING_STAND 292 +#define IDS_DESC_BRICK 293 +#define IDS_DESC_BUCKET 294 +#define IDS_DESC_BUCKET_LAVA 295 +#define IDS_DESC_BUCKET_MILK 296 +#define IDS_DESC_BUCKET_WATER 297 +#define IDS_DESC_BUTTON 298 +#define IDS_DESC_CACTUS 299 +#define IDS_DESC_CAKE 300 +#define IDS_DESC_CARPET 301 +#define IDS_DESC_CARROT_GOLDEN 302 +#define IDS_DESC_CARROT_ON_A_STICK 303 +#define IDS_DESC_CARROTS 304 +#define IDS_DESC_CAULDRON 305 +#define IDS_DESC_CAVE_SPIDER 306 +#define IDS_DESC_CHEST 307 +#define IDS_DESC_CHEST_TRAP 308 +#define IDS_DESC_CHESTPLATE 309 +#define IDS_DESC_CHESTPLATE_CHAIN 310 +#define IDS_DESC_CHESTPLATE_DIAMOND 311 +#define IDS_DESC_CHESTPLATE_GOLD 312 +#define IDS_DESC_CHESTPLATE_IRON 313 +#define IDS_DESC_CHESTPLATE_LEATHER 314 +#define IDS_DESC_CHICKEN 315 +#define IDS_DESC_CHICKEN_COOKED 316 +#define IDS_DESC_CHICKEN_RAW 317 +#define IDS_DESC_CLAY 318 +#define IDS_DESC_CLAY_TILE 319 +#define IDS_DESC_CLOCK 320 +#define IDS_DESC_COAL 321 +#define IDS_DESC_COAL_BLOCK 322 +#define IDS_DESC_COBBLESTONE_WALL 323 +#define IDS_DESC_COCOA 324 +#define IDS_DESC_COMMAND_BLOCK 325 +#define IDS_DESC_COMPARATOR 326 +#define IDS_DESC_COMPASS 327 +#define IDS_DESC_COOKIE 328 +#define IDS_DESC_COW 329 +#define IDS_DESC_CRAFTINGTABLE 330 +#define IDS_DESC_CREEPER 331 +#define IDS_DESC_CROPS 332 +#define IDS_DESC_DAYLIGHT_DETECTOR 333 +#define IDS_DESC_DEAD_BUSH 334 +#define IDS_DESC_DETECTORRAIL 335 +#define IDS_DESC_DIAMOND_HORSE_ARMOR 336 +#define IDS_DESC_DIAMONDS 337 +#define IDS_DESC_DIRT 338 +#define IDS_DESC_DISPENSER 339 +#define IDS_DESC_DONKEY 340 +#define IDS_DESC_DOOR_IRON 341 +#define IDS_DESC_DOOR_WOOD 342 +#define IDS_DESC_DRAGONEGG 343 +#define IDS_DESC_DROPPER 344 +#define IDS_DESC_DYE_BLACK 345 +#define IDS_DESC_DYE_BLUE 346 +#define IDS_DESC_DYE_BROWN 347 +#define IDS_DESC_DYE_CYAN 348 +#define IDS_DESC_DYE_GRAY 349 +#define IDS_DESC_DYE_GREEN 350 +#define IDS_DESC_DYE_LIGHTBLUE 351 +#define IDS_DESC_DYE_LIGHTGRAY 352 +#define IDS_DESC_DYE_LIME 353 +#define IDS_DESC_DYE_MAGENTA 354 +#define IDS_DESC_DYE_ORANGE 355 +#define IDS_DESC_DYE_PINK 356 +#define IDS_DESC_DYE_PURPLE 357 +#define IDS_DESC_DYE_RED 358 +#define IDS_DESC_DYE_SILVER 359 +#define IDS_DESC_DYE_WHITE 360 +#define IDS_DESC_DYE_YELLOW 361 +#define IDS_DESC_EGG 362 +#define IDS_DESC_EMERALD 363 +#define IDS_DESC_EMERALDBLOCK 364 +#define IDS_DESC_EMERALDORE 365 +#define IDS_DESC_ENCHANTED_BOOK 366 +#define IDS_DESC_ENCHANTED_GOLDENAPPLE 367 +#define IDS_DESC_ENCHANTMENTTABLE 368 +#define IDS_DESC_END_PORTAL 369 +#define IDS_DESC_ENDER_PEARL 370 +#define IDS_DESC_ENDERCHEST 371 +#define IDS_DESC_ENDERDRAGON 372 +#define IDS_DESC_ENDERMAN 373 +#define IDS_DESC_ENDPORTALFRAME 374 +#define IDS_DESC_EXP_BOTTLE 375 +#define IDS_DESC_EYE_OF_ENDER 376 +#define IDS_DESC_FARMLAND 377 +#define IDS_DESC_FEATHER 378 +#define IDS_DESC_FENCE 379 +#define IDS_DESC_FENCE_GATE 380 +#define IDS_DESC_FERMENTED_SPIDER_EYE 381 +#define IDS_DESC_FIREBALL 382 +#define IDS_DESC_FIREWORKS 383 +#define IDS_DESC_FIREWORKS_CHARGE 384 +#define IDS_DESC_FISH_COOKED 385 +#define IDS_DESC_FISH_RAW 386 +#define IDS_DESC_FISHINGROD 387 +#define IDS_DESC_FLINT 388 +#define IDS_DESC_FLINTANDSTEEL 389 +#define IDS_DESC_FLOWER 390 +#define IDS_DESC_FLOWERPOT 391 +#define IDS_DESC_FURNACE 392 +#define IDS_DESC_GHAST 393 +#define IDS_DESC_GHAST_TEAR 394 +#define IDS_DESC_GLASS 395 +#define IDS_DESC_GLASS_BOTTLE 396 +#define IDS_DESC_GLOWSTONE 397 +#define IDS_DESC_GOLD_HORSE_ARMOR 398 +#define IDS_DESC_GOLD_NUGGET 399 +#define IDS_DESC_GOLDENAPPLE 400 +#define IDS_DESC_GRASS 401 +#define IDS_DESC_GRAVEL 402 +#define IDS_DESC_HALFSLAB 403 +#define IDS_DESC_HARDENED_CLAY 404 +#define IDS_DESC_HATCHET 405 +#define IDS_DESC_HAY 406 +#define IDS_DESC_HELL_ROCK 407 +#define IDS_DESC_HELL_SAND 408 +#define IDS_DESC_HELMET 409 +#define IDS_DESC_HELMET_CHAIN 410 +#define IDS_DESC_HELMET_DIAMOND 411 +#define IDS_DESC_HELMET_GOLD 412 +#define IDS_DESC_HELMET_IRON 413 +#define IDS_DESC_HELMET_LEATHER 414 +#define IDS_DESC_HOE 415 +#define IDS_DESC_HOPPER 416 +#define IDS_DESC_HORSE 417 +#define IDS_DESC_ICE 418 +#define IDS_DESC_INGOT 419 +#define IDS_DESC_IRON_FENCE 420 +#define IDS_DESC_IRON_HORSE_ARMOR 421 +#define IDS_DESC_IRONGOLEM 422 +#define IDS_DESC_ITEM_NETHERBRICK 423 +#define IDS_DESC_ITEMFRAME 424 +#define IDS_DESC_JACKOLANTERN 425 +#define IDS_DESC_JUKEBOX 426 +#define IDS_DESC_LADDER 427 +#define IDS_DESC_LAVA 428 +#define IDS_DESC_LAVA_SLIME 429 +#define IDS_DESC_LEAD 430 +#define IDS_DESC_LEATHER 431 +#define IDS_DESC_LEAVES 432 +#define IDS_DESC_LEGGINGS 433 +#define IDS_DESC_LEGGINGS_CHAIN 434 +#define IDS_DESC_LEGGINGS_DIAMOND 435 +#define IDS_DESC_LEGGINGS_GOLD 436 +#define IDS_DESC_LEGGINGS_IRON 437 +#define IDS_DESC_LEGGINGS_LEATHER 438 +#define IDS_DESC_LEVER 439 +#define IDS_DESC_LOG 440 +#define IDS_DESC_MAGMA_CREAM 441 +#define IDS_DESC_MAP 442 +#define IDS_DESC_MAP_EMPTY 443 +#define IDS_DESC_MELON_BLOCK 444 +#define IDS_DESC_MELON_SEEDS 445 +#define IDS_DESC_MELON_SLICE 446 +#define IDS_DESC_MINECART 447 +#define IDS_DESC_MINECART_HOPPER 448 +#define IDS_DESC_MINECART_TNT 449 +#define IDS_DESC_MINECARTWITHCHEST 450 +#define IDS_DESC_MINECARTWITHFURNACE 451 +#define IDS_DESC_MOB_SPAWNER 452 +#define IDS_DESC_MONSTER_SPAWNER 453 +#define IDS_DESC_MOSS_STONE 454 +#define IDS_DESC_MULE 455 +#define IDS_DESC_MUSHROOM 456 +#define IDS_DESC_MUSHROOM_COW 457 +#define IDS_DESC_MUSHROOMSTEW 458 +#define IDS_DESC_MYCEL 459 +#define IDS_DESC_NAME_TAG 460 +#define IDS_DESC_NETHER_QUARTZ 461 +#define IDS_DESC_NETHER_QUARTZ_ORE 462 +#define IDS_DESC_NETHER_STALK_SEEDS 463 +#define IDS_DESC_NETHER_STAR 464 +#define IDS_DESC_NETHERBRICK 465 +#define IDS_DESC_NETHERFENCE 466 +#define IDS_DESC_NETHERSTALK 467 +#define IDS_DESC_NOTEBLOCK 468 +#define IDS_DESC_OBSIDIAN 469 +#define IDS_DESC_ORE_COAL 470 +#define IDS_DESC_ORE_DIAMOND 471 +#define IDS_DESC_ORE_GOLD 472 +#define IDS_DESC_ORE_IRON 473 +#define IDS_DESC_ORE_LAPIS 474 +#define IDS_DESC_ORE_REDSTONE 475 +#define IDS_DESC_OZELOT 476 +#define IDS_DESC_PAPER 477 +#define IDS_DESC_PICKAXE 478 +#define IDS_DESC_PICTURE 479 +#define IDS_DESC_PIG 480 +#define IDS_DESC_PIGZOMBIE 481 +#define IDS_DESC_PISTON 482 +#define IDS_DESC_PORKCHOP_COOKED 483 +#define IDS_DESC_PORKCHOP_RAW 484 +#define IDS_DESC_PORTAL 485 +#define IDS_DESC_POTATO 486 +#define IDS_DESC_POTATO_BAKED 487 +#define IDS_DESC_POTATO_POISONOUS 488 +#define IDS_DESC_POTION 489 +#define IDS_DESC_POWEREDRAIL 490 +#define IDS_DESC_PRESSUREPLATE 491 +#define IDS_DESC_PUMPKIN 492 +#define IDS_DESC_PUMPKIN_PIE 493 +#define IDS_DESC_PUMPKIN_SEEDS 494 +#define IDS_DESC_QUARTZ_BLOCK 495 +#define IDS_DESC_RAIL 496 +#define IDS_DESC_RECORD 497 +#define IDS_DESC_REDSTONE_BLOCK 498 +#define IDS_DESC_REDSTONE_DUST 499 +#define IDS_DESC_REDSTONE_LIGHT 500 +#define IDS_DESC_REDSTONEREPEATER 501 +#define IDS_DESC_REDSTONETORCH 502 +#define IDS_DESC_REEDS 503 +#define IDS_DESC_ROTTEN_FLESH 504 +#define IDS_DESC_SADDLE 505 +#define IDS_DESC_SAND 506 +#define IDS_DESC_SANDSTONE 507 +#define IDS_DESC_SAPLING 508 +#define IDS_DESC_SHEARS 509 +#define IDS_DESC_SHEEP 510 +#define IDS_DESC_SHOVEL 511 +#define IDS_DESC_SIGN 512 +#define IDS_DESC_SILVERFISH 513 +#define IDS_DESC_SKELETON 514 +#define IDS_DESC_SKULL 515 +#define IDS_DESC_SLAB 516 +#define IDS_DESC_SLIME 517 +#define IDS_DESC_SLIMEBALL 518 +#define IDS_DESC_SNOW 519 +#define IDS_DESC_SNOWBALL 520 +#define IDS_DESC_SNOWMAN 521 +#define IDS_DESC_SPECKLED_MELON 522 +#define IDS_DESC_SPIDER 523 +#define IDS_DESC_SPIDER_EYE 524 +#define IDS_DESC_SPONGE 525 +#define IDS_DESC_SQUID 526 +#define IDS_DESC_STAINED_CLAY 527 +#define IDS_DESC_STAINED_GLASS 528 +#define IDS_DESC_STAINED_GLASS_PANE 529 +#define IDS_DESC_STAIRS 530 +#define IDS_DESC_STICK 531 +#define IDS_DESC_STICKY_PISTON 532 +#define IDS_DESC_STONE 533 +#define IDS_DESC_STONE_BRICK 534 +#define IDS_DESC_STONE_BRICK_SMOOTH 535 +#define IDS_DESC_STONE_SILVERFISH 536 +#define IDS_DESC_STONESLAB 537 +#define IDS_DESC_STRING 538 +#define IDS_DESC_STRUCTBLOCK 539 +#define IDS_DESC_SUGAR 540 +#define IDS_DESC_SULPHUR 541 +#define IDS_DESC_SWORD 542 +#define IDS_DESC_TALL_GRASS 543 +#define IDS_DESC_THIN_GLASS 544 +#define IDS_DESC_TNT 545 +#define IDS_DESC_TOP_SNOW 546 +#define IDS_DESC_TORCH 547 +#define IDS_DESC_TRAPDOOR 548 +#define IDS_DESC_TRIPWIRE 549 +#define IDS_DESC_TRIPWIRE_SOURCE 550 +#define IDS_DESC_VILLAGER 551 +#define IDS_DESC_VINE 552 +#define IDS_DESC_WATER 553 +#define IDS_DESC_WATERLILY 554 +#define IDS_DESC_WEB 555 +#define IDS_DESC_WEIGHTED_PLATE_HEAVY 556 +#define IDS_DESC_WEIGHTED_PLATE_LIGHT 557 +#define IDS_DESC_WHEAT 558 +#define IDS_DESC_WHEAT_SEEDS 559 +#define IDS_DESC_WHITESTONE 560 +#define IDS_DESC_WITCH 561 +#define IDS_DESC_WITHER 562 +#define IDS_DESC_WOLF 563 +#define IDS_DESC_WOODENPLANKS 564 +#define IDS_DESC_WOODSLAB 565 +#define IDS_DESC_WOOL 566 +#define IDS_DESC_WOOLSTRING 567 +#define IDS_DESC_YELLOW_DUST 568 +#define IDS_DESC_ZOMBIE 569 +#define IDS_DEVICEGONE_TITLE 570 +#define IDS_DIFFICULTY_EASY 571 +#define IDS_DIFFICULTY_HARD 572 +#define IDS_DIFFICULTY_NORMAL 573 +#define IDS_DIFFICULTY_PEACEFUL 574 +#define IDS_DIFFICULTY_TITLE_EASY 575 +#define IDS_DIFFICULTY_TITLE_HARD 576 +#define IDS_DIFFICULTY_TITLE_NORMAL 577 +#define IDS_DIFFICULTY_TITLE_PEACEFUL 578 +#define IDS_DISABLE_EXHAUSTION 579 +#define IDS_DISCONNECTED 580 +#define IDS_DISCONNECTED_BANNED 581 +#define IDS_DISCONNECTED_CLIENT_OLD 582 +#define IDS_DISCONNECTED_FLYING 583 +#define IDS_DISCONNECTED_KICKED 584 +#define IDS_DISCONNECTED_LOGIN_TOO_LONG 585 +#define IDS_DISCONNECTED_NAT_TYPE_MISMATCH 586 +#define IDS_DISCONNECTED_NO_FRIENDS_IN_GAME 587 +#define IDS_DISCONNECTED_SERVER_FULL 588 +#define IDS_DISCONNECTED_SERVER_OLD 589 +#define IDS_DISCONNECTED_SERVER_QUIT 590 +#define IDS_DISPENSER 591 +#define IDS_DLC_COST 592 +#define IDS_DLC_MENU_AVATARITEMS 593 +#define IDS_DLC_MENU_GAMERPICS 594 +#define IDS_DLC_MENU_MASHUPPACKS 595 +#define IDS_DLC_MENU_SKINPACKS 596 +#define IDS_DLC_MENU_TEXTUREPACKS 597 +#define IDS_DLC_MENU_THEMES 598 +#define IDS_DLC_PRICE_FREE 599 +#define IDS_DLC_TEXTUREPACK_GET_FULL_TITLE 600 +#define IDS_DLC_TEXTUREPACK_GET_TRIAL_TITLE 601 +#define IDS_DLC_TEXTUREPACK_NOT_PRESENT 602 +#define IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE 603 +#define IDS_DLC_TEXTUREPACK_UNLOCK_TITLE 604 +#define IDS_DONE 605 +#define IDS_DONKEY 606 +#define IDS_DONT_RESET_NETHER 607 +#define IDS_DOWNLOADABLE_CONTENT_OFFERS 608 +#define IDS_DOWNLOADABLECONTENT 609 +#define IDS_DYNAFONT 610 +#define IDS_EDIT_SIGN_MESSAGE 611 +#define IDS_ENABLE_TELEPORT 612 +#define IDS_ENCHANT 613 +#define IDS_ENCHANTMENT_ARROW_DAMAGE 614 +#define IDS_ENCHANTMENT_ARROW_FIRE 615 +#define IDS_ENCHANTMENT_ARROW_INFINITE 616 +#define IDS_ENCHANTMENT_ARROW_KNOCKBACK 617 +#define IDS_ENCHANTMENT_DAMAGE_ALL 618 +#define IDS_ENCHANTMENT_DAMAGE_ARTHROPODS 619 +#define IDS_ENCHANTMENT_DAMAGE_UNDEAD 620 +#define IDS_ENCHANTMENT_DIGGING 621 +#define IDS_ENCHANTMENT_DURABILITY 622 +#define IDS_ENCHANTMENT_FIRE 623 +#define IDS_ENCHANTMENT_KNOCKBACK 624 +#define IDS_ENCHANTMENT_LEVEL_1 625 +#define IDS_ENCHANTMENT_LEVEL_10 626 +#define IDS_ENCHANTMENT_LEVEL_2 627 +#define IDS_ENCHANTMENT_LEVEL_3 628 +#define IDS_ENCHANTMENT_LEVEL_4 629 +#define IDS_ENCHANTMENT_LEVEL_5 630 +#define IDS_ENCHANTMENT_LEVEL_6 631 +#define IDS_ENCHANTMENT_LEVEL_7 632 +#define IDS_ENCHANTMENT_LEVEL_8 633 +#define IDS_ENCHANTMENT_LEVEL_9 634 +#define IDS_ENCHANTMENT_LOOT_BONUS 635 +#define IDS_ENCHANTMENT_LOOT_BONUS_DIGGER 636 +#define IDS_ENCHANTMENT_OXYGEN 637 +#define IDS_ENCHANTMENT_PROTECT_ALL 638 +#define IDS_ENCHANTMENT_PROTECT_EXPLOSION 639 +#define IDS_ENCHANTMENT_PROTECT_FALL 640 +#define IDS_ENCHANTMENT_PROTECT_FIRE 641 +#define IDS_ENCHANTMENT_PROTECT_PROJECTILE 642 +#define IDS_ENCHANTMENT_THORNS 643 +#define IDS_ENCHANTMENT_UNTOUCHING 644 +#define IDS_ENCHANTMENT_WATER_WORKER 645 +#define IDS_ENDERDRAGON 646 +#define IDS_ENDERMAN 647 +#define IDS_ERROR_NETWORK 648 +#define IDS_ERROR_NETWORK_EXIT 649 +#define IDS_ERROR_NETWORK_TITLE 650 +#define IDS_ERROR_PSN_SIGN_OUT 651 +#define IDS_ERROR_PSN_SIGN_OUT_EXIT 652 +#define IDS_EULA 653 +#define IDS_EULA_SCEA 654 +#define IDS_EULA_SCEE 655 +#define IDS_EULA_SCEE_BD 656 +#define IDS_EXIT_GAME 657 +#define IDS_EXIT_GAME_NO_SAVE 658 +#define IDS_EXIT_GAME_SAVE 659 +#define IDS_EXITING_GAME 660 +#define IDS_FAILED_TO_CREATE_GAME_TITLE 661 +#define IDS_FAILED_TO_SAVE_TITLE 662 +#define IDS_FATAL_ERROR_TEXT 663 +#define IDS_FATAL_ERROR_TITLE 664 +#define IDS_FATAL_TROPHY_ERROR 665 +#define IDS_FAVORITES_SKIN_PACK 666 +#define IDS_FIRE_SPREADS 667 +#define IDS_FIREWORKS 668 +#define IDS_FIREWORKS_CHARGE 669 +#define IDS_FIREWORKS_CHARGE_BLACK 670 +#define IDS_FIREWORKS_CHARGE_BLUE 671 +#define IDS_FIREWORKS_CHARGE_BROWN 672 +#define IDS_FIREWORKS_CHARGE_CUSTOM 673 +#define IDS_FIREWORKS_CHARGE_CYAN 674 +#define IDS_FIREWORKS_CHARGE_FADE_TO 675 +#define IDS_FIREWORKS_CHARGE_FLICKER 676 +#define IDS_FIREWORKS_CHARGE_GRAY 677 +#define IDS_FIREWORKS_CHARGE_GREEN 678 +#define IDS_FIREWORKS_CHARGE_LIGHT_BLUE 679 +#define IDS_FIREWORKS_CHARGE_LIME 680 +#define IDS_FIREWORKS_CHARGE_MAGENTA 681 +#define IDS_FIREWORKS_CHARGE_ORANGE 682 +#define IDS_FIREWORKS_CHARGE_PINK 683 +#define IDS_FIREWORKS_CHARGE_PURPLE 684 +#define IDS_FIREWORKS_CHARGE_RED 685 +#define IDS_FIREWORKS_CHARGE_SILVER 686 +#define IDS_FIREWORKS_CHARGE_TRAIL 687 +#define IDS_FIREWORKS_CHARGE_TYPE 688 +#define IDS_FIREWORKS_CHARGE_TYPE_0 689 +#define IDS_FIREWORKS_CHARGE_TYPE_1 690 +#define IDS_FIREWORKS_CHARGE_TYPE_2 691 +#define IDS_FIREWORKS_CHARGE_TYPE_3 692 +#define IDS_FIREWORKS_CHARGE_TYPE_4 693 +#define IDS_FIREWORKS_CHARGE_WHITE 694 +#define IDS_FIREWORKS_CHARGE_YELLOW 695 +#define IDS_FLOWERPOT 696 +#define IDS_FUEL 697 +#define IDS_FURNACE 698 +#define IDS_GAME_HOST_NAME 699 +#define IDS_GAME_HOST_NAME_UNKNOWN 700 +#define IDS_GAME_MODE_CHANGED 701 +#define IDS_GAME_OPTIONS 702 +#define IDS_GAMEMODE_ADVENTURE 703 +#define IDS_GAMEMODE_CREATIVE 704 +#define IDS_GAMEMODE_SURVIVAL 705 +#define IDS_GAMENAME 706 +#define IDS_GAMEOPTION_ALLOWFOF 707 +#define IDS_GAMEOPTION_BONUS_CHEST 708 +#define IDS_GAMEOPTION_DAYLIGHT_CYCLE 709 +#define IDS_GAMEOPTION_FIRE_SPREADS 710 +#define IDS_GAMEOPTION_HOST_PRIVILEGES 711 +#define IDS_GAMEOPTION_INVITEONLY 712 +#define IDS_GAMEOPTION_KEEP_INVENTORY 713 +#define IDS_GAMEOPTION_MOB_GRIEFING 714 +#define IDS_GAMEOPTION_MOB_LOOT 715 +#define IDS_GAMEOPTION_MOB_SPAWNING 716 +#define IDS_GAMEOPTION_NATURAL_REGEN 717 +#define IDS_GAMEOPTION_ONLINE 718 +#define IDS_GAMEOPTION_PVP 719 +#define IDS_GAMEOPTION_RESET_NETHER 720 +#define IDS_GAMEOPTION_SEED 721 +#define IDS_GAMEOPTION_STRUCTURES 722 +#define IDS_GAMEOPTION_SUPERFLAT 723 +#define IDS_GAMEOPTION_TILE_DROPS 724 +#define IDS_GAMEOPTION_TNT_EXPLODES 725 +#define IDS_GAMEOPTION_TRUST 726 +#define IDS_GAMERPICS 727 +#define IDS_GENERATE_STRUCTURES 728 +#define IDS_GENERIC_ERROR 729 +#define IDS_GHAST 730 +#define IDS_GRAPHICS 731 +#define IDS_GROUPNAME_ARMOUR 732 +#define IDS_GROUPNAME_BUILDING_BLOCKS 733 +#define IDS_GROUPNAME_DECORATIONS 734 +#define IDS_GROUPNAME_FOOD 735 +#define IDS_GROUPNAME_MATERIALS 736 +#define IDS_GROUPNAME_MECHANISMS 737 +#define IDS_GROUPNAME_MISCELLANEOUS 738 +#define IDS_GROUPNAME_POTIONS 739 +#define IDS_GROUPNAME_POTIONS_480 740 +#define IDS_GROUPNAME_REDSTONE_AND_TRANSPORT 741 +#define IDS_GROUPNAME_STRUCTURES 742 +#define IDS_GROUPNAME_TOOLS 743 +#define IDS_GROUPNAME_TOOLS_WEAPONS_ARMOR 744 +#define IDS_GROUPNAME_TRANSPORT 745 +#define IDS_GROUPNAME_WEAPONS 746 +#define IDS_GUEST_ORDER_CHANGED_TEXT 747 +#define IDS_GUEST_ORDER_CHANGED_TITLE 748 +#define IDS_HELP_AND_OPTIONS 749 +#define IDS_HINTS 750 +#define IDS_HORSE 751 +#define IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS 752 +#define IDS_HOST_OPTIONS 753 +#define IDS_HOST_PRIVILEGES 754 +#define IDS_HOW_TO_PLAY 755 +#define IDS_HOW_TO_PLAY_ANVIL 756 +#define IDS_HOW_TO_PLAY_BANLIST 757 +#define IDS_HOW_TO_PLAY_BASICS 758 +#define IDS_HOW_TO_PLAY_BEACONS 759 +#define IDS_HOW_TO_PLAY_BREEDANIMALS 760 +#define IDS_HOW_TO_PLAY_BREWING 761 +#define IDS_HOW_TO_PLAY_CHEST 762 +#define IDS_HOW_TO_PLAY_CRAFT_TABLE 763 +#define IDS_HOW_TO_PLAY_CRAFTING 764 +#define IDS_HOW_TO_PLAY_CREATIVE 765 +#define IDS_HOW_TO_PLAY_DISPENSER 766 +#define IDS_HOW_TO_PLAY_DROPPERS 767 +#define IDS_HOW_TO_PLAY_ENCHANTMENT 768 +#define IDS_HOW_TO_PLAY_ENDERCHEST 769 +#define IDS_HOW_TO_PLAY_FARMANIMALS 770 +#define IDS_HOW_TO_PLAY_FIREWORKS 771 +#define IDS_HOW_TO_PLAY_FURNACE 772 +#define IDS_HOW_TO_PLAY_HOPPERS 773 +#define IDS_HOW_TO_PLAY_HORSES 774 +#define IDS_HOW_TO_PLAY_HOSTOPTIONS 775 +#define IDS_HOW_TO_PLAY_HUD 776 +#define IDS_HOW_TO_PLAY_INVENTORY 777 +#define IDS_HOW_TO_PLAY_LARGECHEST 778 +#define IDS_HOW_TO_PLAY_MENU_ANVIL 779 +#define IDS_HOW_TO_PLAY_MENU_BANLIST 780 +#define IDS_HOW_TO_PLAY_MENU_BASICS 781 +#define IDS_HOW_TO_PLAY_MENU_BEACONS 782 +#define IDS_HOW_TO_PLAY_MENU_BREEDANIMALS 783 +#define IDS_HOW_TO_PLAY_MENU_BREWING 784 +#define IDS_HOW_TO_PLAY_MENU_CHESTS 785 +#define IDS_HOW_TO_PLAY_MENU_CRAFTING 786 +#define IDS_HOW_TO_PLAY_MENU_CREATIVE 787 +#define IDS_HOW_TO_PLAY_MENU_DISPENSER 788 +#define IDS_HOW_TO_PLAY_MENU_DROPPERS 789 +#define IDS_HOW_TO_PLAY_MENU_ENCHANTMENT 790 +#define IDS_HOW_TO_PLAY_MENU_FARMANIMALS 791 +#define IDS_HOW_TO_PLAY_MENU_FIREWORKS 792 +#define IDS_HOW_TO_PLAY_MENU_FURNACE 793 +#define IDS_HOW_TO_PLAY_MENU_HOPPERS 794 +#define IDS_HOW_TO_PLAY_MENU_HORSES 795 +#define IDS_HOW_TO_PLAY_MENU_HOSTOPTIONS 796 +#define IDS_HOW_TO_PLAY_MENU_HUD 797 +#define IDS_HOW_TO_PLAY_MENU_INVENTORY 798 +#define IDS_HOW_TO_PLAY_MENU_MULTIPLAYER 799 +#define IDS_HOW_TO_PLAY_MENU_NETHERPORTAL 800 +#define IDS_HOW_TO_PLAY_MENU_SOCIALMEDIA 801 +#define IDS_HOW_TO_PLAY_MENU_SPRINT 802 +#define IDS_HOW_TO_PLAY_MENU_THEEND 803 +#define IDS_HOW_TO_PLAY_MENU_TRADING 804 +#define IDS_HOW_TO_PLAY_MENU_WHATSNEW 805 +#define IDS_HOW_TO_PLAY_MULTIPLAYER 806 +#define IDS_HOW_TO_PLAY_NETHERPORTAL 807 +#define IDS_HOW_TO_PLAY_NEXT 808 +#define IDS_HOW_TO_PLAY_PREV 809 +#define IDS_HOW_TO_PLAY_SOCIALMEDIA 810 +#define IDS_HOW_TO_PLAY_THEEND 811 +#define IDS_HOW_TO_PLAY_TRADING 812 +#define IDS_HOW_TO_PLAY_WHATSNEW 813 +#define IDS_ICON_SHANK_01 814 +#define IDS_ICON_SHANK_03 815 +#define IDS_IN_GAME_GAMERTAGS 816 +#define IDS_IN_GAME_TOOLTIPS 817 +#define IDS_INGREDIENT 818 +#define IDS_INGREDIENTS 819 +#define IDS_INVENTORY 820 +#define IDS_INVERT_LOOK 821 +#define IDS_INVISIBLE 822 +#define IDS_INVITATION_BODY 823 +#define IDS_INVITATION_SUBJECT_MAX_18_CHARS 824 +#define IDS_INVITE_ONLY 825 +#define IDS_IRONGOLEM 826 +#define IDS_ITEM_APPLE 827 +#define IDS_ITEM_APPLE_GOLD 828 +#define IDS_ITEM_ARROW 829 +#define IDS_ITEM_BED 830 +#define IDS_ITEM_BEEF_COOKED 831 +#define IDS_ITEM_BEEF_RAW 832 +#define IDS_ITEM_BLAZE_POWDER 833 +#define IDS_ITEM_BLAZE_ROD 834 +#define IDS_ITEM_BOAT 835 +#define IDS_ITEM_BONE 836 +#define IDS_ITEM_BOOK 837 +#define IDS_ITEM_BOOTS_CHAIN 838 +#define IDS_ITEM_BOOTS_CLOTH 839 +#define IDS_ITEM_BOOTS_DIAMOND 840 +#define IDS_ITEM_BOOTS_GOLD 841 +#define IDS_ITEM_BOOTS_IRON 842 +#define IDS_ITEM_BOW 843 +#define IDS_ITEM_BOWL 844 +#define IDS_ITEM_BREAD 845 +#define IDS_ITEM_BREWING_STAND 846 +#define IDS_ITEM_BRICK 847 +#define IDS_ITEM_BUCKET 848 +#define IDS_ITEM_BUCKET_LAVA 849 +#define IDS_ITEM_BUCKET_MILK 850 +#define IDS_ITEM_BUCKET_WATER 851 +#define IDS_ITEM_CAKE 852 +#define IDS_ITEM_CARROT_GOLDEN 853 +#define IDS_ITEM_CARROT_ON_A_STICK 854 +#define IDS_ITEM_CAULDRON 855 +#define IDS_ITEM_CHARCOAL 856 +#define IDS_ITEM_CHESTPLATE_CHAIN 857 +#define IDS_ITEM_CHESTPLATE_CLOTH 858 +#define IDS_ITEM_CHESTPLATE_DIAMOND 859 +#define IDS_ITEM_CHESTPLATE_GOLD 860 +#define IDS_ITEM_CHESTPLATE_IRON 861 +#define IDS_ITEM_CHICKEN_COOKED 862 +#define IDS_ITEM_CHICKEN_RAW 863 +#define IDS_ITEM_CLAY 864 +#define IDS_ITEM_CLOCK 865 +#define IDS_ITEM_COAL 866 +#define IDS_ITEM_COMPARATOR 867 +#define IDS_ITEM_COMPASS 868 +#define IDS_ITEM_COOKIE 869 +#define IDS_ITEM_DIAMOND 870 +#define IDS_ITEM_DIAMOND_HORSE_ARMOR 871 +#define IDS_ITEM_DIODE 872 +#define IDS_ITEM_DOOR_IRON 873 +#define IDS_ITEM_DOOR_WOOD 874 +#define IDS_ITEM_DYE_POWDER 875 +#define IDS_ITEM_DYE_POWDER_BLACK 876 +#define IDS_ITEM_DYE_POWDER_BLUE 877 +#define IDS_ITEM_DYE_POWDER_BROWN 878 +#define IDS_ITEM_DYE_POWDER_CYAN 879 +#define IDS_ITEM_DYE_POWDER_GRAY 880 +#define IDS_ITEM_DYE_POWDER_GREEN 881 +#define IDS_ITEM_DYE_POWDER_LIGHT_BLUE 882 +#define IDS_ITEM_DYE_POWDER_LIME 883 +#define IDS_ITEM_DYE_POWDER_MAGENTA 884 +#define IDS_ITEM_DYE_POWDER_ORANGE 885 +#define IDS_ITEM_DYE_POWDER_PINK 886 +#define IDS_ITEM_DYE_POWDER_PURPLE 887 +#define IDS_ITEM_DYE_POWDER_RED 888 +#define IDS_ITEM_DYE_POWDER_SILVER 889 +#define IDS_ITEM_DYE_POWDER_WHITE 890 +#define IDS_ITEM_DYE_POWDER_YELLOW 891 +#define IDS_ITEM_EGG 892 +#define IDS_ITEM_EMERALD 893 +#define IDS_ITEM_ENCHANTED_BOOK 894 +#define IDS_ITEM_ENDER_PEARL 895 +#define IDS_ITEM_EXP_BOTTLE 896 +#define IDS_ITEM_EYE_OF_ENDER 897 +#define IDS_ITEM_FEATHER 898 +#define IDS_ITEM_FERMENTED_SPIDER_EYE 899 +#define IDS_ITEM_FIREBALL 900 +#define IDS_ITEM_FIREBALLCHARCOAL 901 +#define IDS_ITEM_FIREBALLCOAL 902 +#define IDS_ITEM_FIREWORKS_FLIGHT 903 +#define IDS_ITEM_FISH_COOKED 904 +#define IDS_ITEM_FISH_RAW 905 +#define IDS_ITEM_FISHING_ROD 906 +#define IDS_ITEM_FLINT 907 +#define IDS_ITEM_FLINT_AND_STEEL 908 +#define IDS_ITEM_GHAST_TEAR 909 +#define IDS_ITEM_GLASS_BOTTLE 910 +#define IDS_ITEM_GOLD_HORSE_ARMOR 911 +#define IDS_ITEM_GOLD_NUGGET 912 +#define IDS_ITEM_HATCHET_DIAMOND 913 +#define IDS_ITEM_HATCHET_GOLD 914 +#define IDS_ITEM_HATCHET_IRON 915 +#define IDS_ITEM_HATCHET_STONE 916 +#define IDS_ITEM_HATCHET_WOOD 917 +#define IDS_ITEM_HELMET_CHAIN 918 +#define IDS_ITEM_HELMET_CLOTH 919 +#define IDS_ITEM_HELMET_DIAMOND 920 +#define IDS_ITEM_HELMET_GOLD 921 +#define IDS_ITEM_HELMET_IRON 922 +#define IDS_ITEM_HOE_DIAMOND 923 +#define IDS_ITEM_HOE_GOLD 924 +#define IDS_ITEM_HOE_IRON 925 +#define IDS_ITEM_HOE_STONE 926 +#define IDS_ITEM_HOE_WOOD 927 +#define IDS_ITEM_INGOT_GOLD 928 +#define IDS_ITEM_INGOT_IRON 929 +#define IDS_ITEM_IRON_HORSE_ARMOR 930 +#define IDS_ITEM_ITEMFRAME 931 +#define IDS_ITEM_LEAD 932 +#define IDS_ITEM_LEATHER 933 +#define IDS_ITEM_LEGGINGS_CHAIN 934 +#define IDS_ITEM_LEGGINGS_CLOTH 935 +#define IDS_ITEM_LEGGINGS_DIAMOND 936 +#define IDS_ITEM_LEGGINGS_GOLD 937 +#define IDS_ITEM_LEGGINGS_IRON 938 +#define IDS_ITEM_MAGMA_CREAM 939 +#define IDS_ITEM_MAP 940 +#define IDS_ITEM_MAP_EMPTY 941 +#define IDS_ITEM_MELON_SEEDS 942 +#define IDS_ITEM_MELON_SLICE 943 +#define IDS_ITEM_MINECART 944 +#define IDS_ITEM_MINECART_CHEST 945 +#define IDS_ITEM_MINECART_FURNACE 946 +#define IDS_ITEM_MINECART_HOPPER 947 +#define IDS_ITEM_MINECART_TNT 948 +#define IDS_ITEM_MONSTER_SPAWNER 949 +#define IDS_ITEM_MUSHROOM_STEW 950 +#define IDS_ITEM_NAME_TAG 951 +#define IDS_ITEM_NETHER_QUARTZ 952 +#define IDS_ITEM_NETHER_STALK_SEEDS 953 +#define IDS_ITEM_NETHERBRICK 954 +#define IDS_ITEM_PAINTING 955 +#define IDS_ITEM_PAPER 956 +#define IDS_ITEM_PICKAXE_DIAMOND 957 +#define IDS_ITEM_PICKAXE_GOLD 958 +#define IDS_ITEM_PICKAXE_IRON 959 +#define IDS_ITEM_PICKAXE_STONE 960 +#define IDS_ITEM_PICKAXE_WOOD 961 +#define IDS_ITEM_PORKCHOP_COOKED 962 +#define IDS_ITEM_PORKCHOP_RAW 963 +#define IDS_ITEM_POTATO_BAKED 964 +#define IDS_ITEM_POTATO_POISONOUS 965 +#define IDS_ITEM_POTION 966 +#define IDS_ITEM_PUMPKIN_PIE 967 +#define IDS_ITEM_PUMPKIN_SEEDS 968 +#define IDS_ITEM_RECORD_01 969 +#define IDS_ITEM_RECORD_02 970 +#define IDS_ITEM_RECORD_03 971 +#define IDS_ITEM_RECORD_04 972 +#define IDS_ITEM_RECORD_05 973 +#define IDS_ITEM_RECORD_06 974 +#define IDS_ITEM_RECORD_07 975 +#define IDS_ITEM_RECORD_08 976 +#define IDS_ITEM_RECORD_09 977 +#define IDS_ITEM_RECORD_10 978 +#define IDS_ITEM_RECORD_11 979 +#define IDS_ITEM_RECORD_12 980 +#define IDS_ITEM_REDSTONE 981 +#define IDS_ITEM_REEDS 982 +#define IDS_ITEM_ROTTEN_FLESH 983 +#define IDS_ITEM_SADDLE 984 +#define IDS_ITEM_SHEARS 985 +#define IDS_ITEM_SHOVEL_DIAMOND 986 +#define IDS_ITEM_SHOVEL_GOLD 987 +#define IDS_ITEM_SHOVEL_IRON 988 +#define IDS_ITEM_SHOVEL_STONE 989 +#define IDS_ITEM_SHOVEL_WOOD 990 +#define IDS_ITEM_SIGN 991 +#define IDS_ITEM_SKULL 992 +#define IDS_ITEM_SKULL_CHARACTER 993 +#define IDS_ITEM_SKULL_CREEPER 994 +#define IDS_ITEM_SKULL_PLAYER 995 +#define IDS_ITEM_SKULL_SKELETON 996 +#define IDS_ITEM_SKULL_WITHER 997 +#define IDS_ITEM_SKULL_ZOMBIE 998 +#define IDS_ITEM_SLIMEBALL 999 +#define IDS_ITEM_SNOWBALL 1000 +#define IDS_ITEM_SPECKLED_MELON 1001 +#define IDS_ITEM_SPIDER_EYE 1002 +#define IDS_ITEM_STICK 1003 +#define IDS_ITEM_STRING 1004 +#define IDS_ITEM_SUGAR 1005 +#define IDS_ITEM_SULPHUR 1006 +#define IDS_ITEM_SWORD_DIAMOND 1007 +#define IDS_ITEM_SWORD_GOLD 1008 +#define IDS_ITEM_SWORD_IRON 1009 +#define IDS_ITEM_SWORD_STONE 1010 +#define IDS_ITEM_SWORD_WOOD 1011 +#define IDS_ITEM_WATER_BOTTLE 1012 +#define IDS_ITEM_WHEAT 1013 +#define IDS_ITEM_WHEAT_SEEDS 1014 +#define IDS_ITEM_YELLOW_DUST 1015 +#define IDS_JOIN_GAME 1016 +#define IDS_KEEP_INVENTORY 1017 +#define IDS_KEYBOARDUI_SAVEGAME_TEXT 1018 +#define IDS_KEYBOARDUI_SAVEGAME_TITLE 1019 +#define IDS_KICK_PLAYER 1020 +#define IDS_KICK_PLAYER_DESCRIPTION 1021 +#define IDS_LABEL_DIFFICULTY 1022 +#define IDS_LABEL_FIRE_SPREADS 1023 +#define IDS_LABEL_GAME_TYPE 1024 +#define IDS_LABEL_GAMERTAGS 1025 +#define IDS_LABEL_LEVEL_TYPE 1026 +#define IDS_LABEL_PvP 1027 +#define IDS_LABEL_STRUCTURES 1028 +#define IDS_LABEL_TNT 1029 +#define IDS_LABEL_TRUST 1030 +#define IDS_LANG_CHINESE_SIMPLIFIED 1031 +#define IDS_LANG_CHINESE_TRADITIONAL 1032 +#define IDS_LANG_DANISH 1033 +#define IDS_LANG_DUTCH 1034 +#define IDS_LANG_ENGLISH 1035 +#define IDS_LANG_FINISH 1036 +#define IDS_LANG_FRENCH 1037 +#define IDS_LANG_GERMAN 1038 +#define IDS_LANG_GREEK 1039 +#define IDS_LANG_ITALIAN 1040 +#define IDS_LANG_JAPANESE 1041 +#define IDS_LANG_KOREAN 1042 +#define IDS_LANG_NORWEGIAN 1043 +#define IDS_LANG_POLISH 1044 +#define IDS_LANG_PORTUGUESE 1045 +#define IDS_LANG_PORTUGUESE_BRAZIL 1046 +#define IDS_LANG_PORTUGUESE_PORTUGAL 1047 +#define IDS_LANG_RUSSIAN 1048 +#define IDS_LANG_SPANISH 1049 +#define IDS_LANG_SPANISH_LATIN_AMERICA 1050 +#define IDS_LANG_SPANISH_SPAIN 1051 +#define IDS_LANG_SWEDISH 1052 +#define IDS_LANG_SYSTEM 1053 +#define IDS_LANG_TURKISH 1054 +#define IDS_LANGUAGE_SELECTOR 1055 +#define IDS_LAVA_SLIME 1056 +#define IDS_LEADERBOARD_ENTRIES 1057 +#define IDS_LEADERBOARD_FARMING_EASY 1058 +#define IDS_LEADERBOARD_FARMING_HARD 1059 +#define IDS_LEADERBOARD_FARMING_NORMAL 1060 +#define IDS_LEADERBOARD_FARMING_PEACEFUL 1061 +#define IDS_LEADERBOARD_FILTER 1062 +#define IDS_LEADERBOARD_FILTER_FRIENDS 1063 +#define IDS_LEADERBOARD_FILTER_MYSCORE 1064 +#define IDS_LEADERBOARD_FILTER_OVERALL 1065 +#define IDS_LEADERBOARD_GAMERTAG 1066 +#define IDS_LEADERBOARD_KILLS_EASY 1067 +#define IDS_LEADERBOARD_KILLS_HARD 1068 +#define IDS_LEADERBOARD_KILLS_NORMAL 1069 +#define IDS_LEADERBOARD_LOADING 1070 +#define IDS_LEADERBOARD_MINING_BLOCKS_EASY 1071 +#define IDS_LEADERBOARD_MINING_BLOCKS_HARD 1072 +#define IDS_LEADERBOARD_MINING_BLOCKS_NORMAL 1073 +#define IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL 1074 +#define IDS_LEADERBOARD_NORESULTS 1075 +#define IDS_LEADERBOARD_RANK 1076 +#define IDS_LEADERBOARD_TRAVELLING_EASY 1077 +#define IDS_LEADERBOARD_TRAVELLING_HARD 1078 +#define IDS_LEADERBOARD_TRAVELLING_NORMAL 1079 +#define IDS_LEADERBOARD_TRAVELLING_PEACEFUL 1080 +#define IDS_LEADERBOARDS 1081 +#define IDS_LEVELTYPE_NORMAL 1082 +#define IDS_LEVELTYPE_SUPERFLAT 1083 +#define IDS_LOAD 1084 +#define IDS_LOAD_SAVED_WORLD 1085 +#define IDS_MAX_BATS_SPAWNED 1086 +#define IDS_MAX_BOATS 1087 +#define IDS_MAX_CHICKENS_BRED 1088 +#define IDS_MAX_CHICKENS_SPAWNED 1089 +#define IDS_MAX_ENEMIES_SPAWNED 1090 +#define IDS_MAX_HANGINGENTITIES 1091 +#define IDS_MAX_HORSES_BRED 1092 +#define IDS_MAX_MOOSHROOMS_SPAWNED 1093 +#define IDS_MAX_MUSHROOMCOWS_BRED 1094 +#define IDS_MAX_PIGS_SHEEP_COWS_CATS_BRED 1095 +#define IDS_MAX_PIGS_SHEEP_COWS_CATS_SPAWNED 1096 +#define IDS_MAX_SKULL_TILES 1097 +#define IDS_MAX_SQUID_SPAWNED 1098 +#define IDS_MAX_VILLAGERS_SPAWNED 1099 +#define IDS_MAX_WOLVES_BRED 1100 +#define IDS_MAX_WOLVES_SPAWNED 1101 +#define IDS_MINUTES 1102 +#define IDS_MOB_GRIEFING 1103 +#define IDS_MOB_LOOT 1104 +#define IDS_MOB_SPAWNING 1105 +#define IDS_MODERATOR 1106 +#define IDS_MORE_OPTIONS 1107 +#define IDS_MULE 1108 +#define IDS_MULTIPLAYER_FULL_TEXT 1109 +#define IDS_MULTIPLAYER_FULL_TITLE 1110 +#define IDS_MUSHROOM_COW 1111 +#define IDS_MUST_SIGN_IN_TEXT 1112 +#define IDS_MUST_SIGN_IN_TITLE 1113 +#define IDS_NAME_CAPTION 1114 +#define IDS_NAME_CAPTION_TEXT 1115 +#define IDS_NAME_DESC 1116 +#define IDS_NAME_DESC_TEXT 1117 +#define IDS_NAME_TITLE 1118 +#define IDS_NAME_TITLE_TEXT 1119 +#define IDS_NAME_WORLD 1120 +#define IDS_NAME_WORLD_TEXT 1121 +#define IDS_NATURAL_REGEN 1122 +#define IDS_NETHER_STAR 1123 +#define IDS_NETWORK_ADHOC 1124 +#define IDS_NO 1125 +#define IDS_NO_DLCCATEGORIES 1126 +#define IDS_NO_DLCOFFERS 1127 +#define IDS_NO_GAMES_FOUND 1128 +#define IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT 1129 +#define IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT 1130 +#define IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE 1131 +#define IDS_NO_SKIN_PACK 1132 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL 1133 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE 1134 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL 1135 +#define IDS_NODEVICE_DECLINE 1136 +#define IDS_NOFREESPACE_TEXT 1137 +#define IDS_NOFREESPACE_TITLE 1138 +#define IDS_NOTALLOWED_FRIENDSOFFRIENDS 1139 +#define IDS_NOWPLAYING 1140 +#define IDS_OFF 1141 +#define IDS_OK 1142 +#define IDS_ON 1143 +#define IDS_ONLINE_GAME 1144 +#define IDS_ONLINE_SERVICE_TITLE 1145 +#define IDS_OPTIONS 1146 +#define IDS_OPTIONSFILE 1147 +#define IDS_OVERWRITESAVE_NO 1148 +#define IDS_OVERWRITESAVE_TITLE 1149 +#define IDS_OVERWRITESAVE_YES 1150 +#define IDS_OZELOT 1151 +#define IDS_PIG 1152 +#define IDS_PIGZOMBIE 1153 +#define IDS_PLATFORM_NAME 1154 +#define IDS_PLAY_GAME 1155 +#define IDS_PLAY_TUTORIAL 1156 +#define IDS_PLAYER_BANNED_LEVEL 1157 +#define IDS_PLAYER_ENTERED_END 1158 +#define IDS_PLAYER_JOINED 1159 +#define IDS_PLAYER_KICKED 1160 +#define IDS_PLAYER_LEFT 1161 +#define IDS_PLAYER_LEFT_END 1162 +#define IDS_PLAYER_LIST_TITLE 1163 +#define IDS_PLAYER_VS_PLAYER 1164 +#define IDS_PLAYERS 1165 +#define IDS_PLAYERS_INVITE 1166 +#define IDS_PLAYWITHOUTSAVING 1167 +#define IDS_POTATO 1168 +#define IDS_POTION_ABSORPTION 1169 +#define IDS_POTION_ABSORPTION_POSTFIX 1170 +#define IDS_POTION_BLINDNESS 1171 +#define IDS_POTION_BLINDNESS_POSTFIX 1172 +#define IDS_POTION_CONFUSION 1173 +#define IDS_POTION_CONFUSION_POSTFIX 1174 +#define IDS_POTION_DAMAGEBOOST 1175 +#define IDS_POTION_DAMAGEBOOST_POSTFIX 1176 +#define IDS_POTION_DESC_DAMAGEBOOST 1177 +#define IDS_POTION_DESC_EMPTY 1178 +#define IDS_POTION_DESC_FIRERESISTANCE 1179 +#define IDS_POTION_DESC_HARM 1180 +#define IDS_POTION_DESC_HEAL 1181 +#define IDS_POTION_DESC_INVISIBILITY 1182 +#define IDS_POTION_DESC_MOVESLOWDOWN 1183 +#define IDS_POTION_DESC_MOVESPEED 1184 +#define IDS_POTION_DESC_NIGHTVISION 1185 +#define IDS_POTION_DESC_POISON 1186 +#define IDS_POTION_DESC_REGENERATION 1187 +#define IDS_POTION_DESC_WATER_BOTTLE 1188 +#define IDS_POTION_DESC_WEAKNESS 1189 +#define IDS_POTION_DIGSLOWDOWN 1190 +#define IDS_POTION_DIGSLOWDOWN_POSTFIX 1191 +#define IDS_POTION_DIGSPEED 1192 +#define IDS_POTION_DIGSPEED_POSTFIX 1193 +#define IDS_POTION_EFFECTS_WHENDRANK 1194 +#define IDS_POTION_EMPTY 1195 +#define IDS_POTION_FIRERESISTANCE 1196 +#define IDS_POTION_FIRERESISTANCE_POSTFIX 1197 +#define IDS_POTION_HARM 1198 +#define IDS_POTION_HARM_POSTFIX 1199 +#define IDS_POTION_HEAL 1200 +#define IDS_POTION_HEAL_POSTFIX 1201 +#define IDS_POTION_HEALTHBOOST 1202 +#define IDS_POTION_HEALTHBOOST_POSTFIX 1203 +#define IDS_POTION_HUNGER 1204 +#define IDS_POTION_HUNGER_POSTFIX 1205 +#define IDS_POTION_INVISIBILITY 1206 +#define IDS_POTION_INVISIBILITY_POSTFIX 1207 +#define IDS_POTION_JUMP 1208 +#define IDS_POTION_JUMP_POSTFIX 1209 +#define IDS_POTION_MOVESLOWDOWN 1210 +#define IDS_POTION_MOVESLOWDOWN_POSTFIX 1211 +#define IDS_POTION_MOVESPEED 1212 +#define IDS_POTION_MOVESPEED_POSTFIX 1213 +#define IDS_POTION_NIGHTVISION 1214 +#define IDS_POTION_NIGHTVISION_POSTFIX 1215 +#define IDS_POTION_POISON 1216 +#define IDS_POTION_POISON_POSTFIX 1217 +#define IDS_POTION_POTENCY_0 1218 +#define IDS_POTION_POTENCY_1 1219 +#define IDS_POTION_POTENCY_2 1220 +#define IDS_POTION_POTENCY_3 1221 +#define IDS_POTION_PREFIX_ACRID 1222 +#define IDS_POTION_PREFIX_ARTLESS 1223 +#define IDS_POTION_PREFIX_AWKWARD 1224 +#define IDS_POTION_PREFIX_BLAND 1225 +#define IDS_POTION_PREFIX_BULKY 1226 +#define IDS_POTION_PREFIX_BUNGLING 1227 +#define IDS_POTION_PREFIX_BUTTERED 1228 +#define IDS_POTION_PREFIX_CHARMING 1229 +#define IDS_POTION_PREFIX_CLEAR 1230 +#define IDS_POTION_PREFIX_CORDIAL 1231 +#define IDS_POTION_PREFIX_DASHING 1232 +#define IDS_POTION_PREFIX_DEBONAIR 1233 +#define IDS_POTION_PREFIX_DIFFUSE 1234 +#define IDS_POTION_PREFIX_ELEGANT 1235 +#define IDS_POTION_PREFIX_FANCY 1236 +#define IDS_POTION_PREFIX_FLAT 1237 +#define IDS_POTION_PREFIX_FOUL 1238 +#define IDS_POTION_PREFIX_GRENADE 1239 +#define IDS_POTION_PREFIX_GROSS 1240 +#define IDS_POTION_PREFIX_HARSH 1241 +#define IDS_POTION_PREFIX_MILKY 1242 +#define IDS_POTION_PREFIX_MUNDANE 1243 +#define IDS_POTION_PREFIX_ODORLESS 1244 +#define IDS_POTION_PREFIX_POTENT 1245 +#define IDS_POTION_PREFIX_RANK 1246 +#define IDS_POTION_PREFIX_REFINED 1247 +#define IDS_POTION_PREFIX_SMOOTH 1248 +#define IDS_POTION_PREFIX_SPARKLING 1249 +#define IDS_POTION_PREFIX_STINKY 1250 +#define IDS_POTION_PREFIX_SUAVE 1251 +#define IDS_POTION_PREFIX_THICK 1252 +#define IDS_POTION_PREFIX_THIN 1253 +#define IDS_POTION_PREFIX_UNINTERESTING 1254 +#define IDS_POTION_REGENERATION 1255 +#define IDS_POTION_REGENERATION_POSTFIX 1256 +#define IDS_POTION_RESISTANCE 1257 +#define IDS_POTION_RESISTANCE_POSTFIX 1258 +#define IDS_POTION_SATURATION 1259 +#define IDS_POTION_SATURATION_POSTFIX 1260 +#define IDS_POTION_WATERBREATHING 1261 +#define IDS_POTION_WATERBREATHING_POSTFIX 1262 +#define IDS_POTION_WEAKNESS 1263 +#define IDS_POTION_WEAKNESS_POSTFIX 1264 +#define IDS_POTION_WITHER 1265 +#define IDS_POTION_WITHER_POSTFIX 1266 +#define IDS_PRESS_START_TO_JOIN 1267 +#define IDS_PRIV_ATTACK_ANIMAL_TOGGLE_OFF 1268 +#define IDS_PRIV_ATTACK_ANIMAL_TOGGLE_ON 1269 +#define IDS_PRIV_ATTACK_MOB_TOGGLE_OFF 1270 +#define IDS_PRIV_ATTACK_MOB_TOGGLE_ON 1271 +#define IDS_PRIV_ATTACK_PLAYER_TOGGLE_OFF 1272 +#define IDS_PRIV_ATTACK_PLAYER_TOGGLE_ON 1273 +#define IDS_PRIV_BUILD_TOGGLE_OFF 1274 +#define IDS_PRIV_BUILD_TOGGLE_ON 1275 +#define IDS_PRIV_CAN_EXHAUSTION_TOGGLE_OFF 1276 +#define IDS_PRIV_CAN_EXHAUSTION_TOGGLE_ON 1277 +#define IDS_PRIV_CAN_FLY_TOGGLE_OFF 1278 +#define IDS_PRIV_CAN_FLY_TOGGLE_ON 1279 +#define IDS_PRIV_CAN_INVISIBLE_TOGGLE_OFF 1280 +#define IDS_PRIV_CAN_INVISIBLE_TOGGLE_ON 1281 +#define IDS_PRIV_CAN_TELEPORT_TOGGLE_OFF 1282 +#define IDS_PRIV_CAN_TELEPORT_TOGGLE_ON 1283 +#define IDS_PRIV_EXHAUSTION_TOGGLE_OFF 1284 +#define IDS_PRIV_EXHAUSTION_TOGGLE_ON 1285 +#define IDS_PRIV_FLY_TOGGLE_OFF 1286 +#define IDS_PRIV_FLY_TOGGLE_ON 1287 +#define IDS_PRIV_INVISIBLE_TOGGLE_OFF 1288 +#define IDS_PRIV_INVISIBLE_TOGGLE_ON 1289 +#define IDS_PRIV_INVULNERABLE_TOGGLE_OFF 1290 +#define IDS_PRIV_INVULNERABLE_TOGGLE_ON 1291 +#define IDS_PRIV_MINE_TOGGLE_OFF 1292 +#define IDS_PRIV_MINE_TOGGLE_ON 1293 +#define IDS_PRIV_MODERATOR_TOGGLE_OFF 1294 +#define IDS_PRIV_MODERATOR_TOGGLE_ON 1295 +#define IDS_PRIV_USE_CONTAINERS_TOGGLE_OFF 1296 +#define IDS_PRIV_USE_CONTAINERS_TOGGLE_ON 1297 +#define IDS_PRIV_USE_DOORS_TOGGLE_OFF 1298 +#define IDS_PRIV_USE_DOORS_TOGGLE_ON 1299 +#define IDS_PRO_ACHIEVEMENTPROBLEM_TEXT 1300 +#define IDS_PRO_ACHIEVEMENTPROBLEM_TITLE 1301 +#define IDS_PRO_GUESTPROFILE_TEXT 1302 +#define IDS_PRO_GUESTPROFILE_TITLE 1303 +#define IDS_PRO_NOPROFILE_TITLE 1304 +#define IDS_PRO_NOPROFILEOPTIONS_TEXT 1305 +#define IDS_PRO_NOTADHOCONLINE_ACCEPT 1306 +#define IDS_PRO_NOTADHOCONLINE_TEXT 1307 +#define IDS_PRO_NOTADHOCONLINE_TITLE 1308 +#define IDS_PRO_NOTONLINE_ACCEPT 1309 +#define IDS_PRO_NOTONLINE_DECLINE 1310 +#define IDS_PRO_NOTONLINE_TEXT 1311 +#define IDS_PRO_NOTONLINE_TITLE 1312 +#define IDS_PRO_RETURNEDTOMENU_ACCEPT 1313 +#define IDS_PRO_RETURNEDTOMENU_TEXT 1314 +#define IDS_PRO_RETURNEDTOMENU_TITLE 1315 +#define IDS_PRO_RETURNEDTOTITLESCREEN_TEXT 1316 +#define IDS_PRO_UNLOCKGAME_TEXT 1317 +#define IDS_PRO_UNLOCKGAME_TITLE 1318 +#define IDS_PRO_XBOXLIVE_NOTIFICATION 1319 +#define IDS_PROGRESS_AUTOSAVING_LEVEL 1320 +#define IDS_PROGRESS_BUILDING_TERRAIN 1321 +#define IDS_PROGRESS_CONNECTING 1322 +#define IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME 1323 +#define IDS_PROGRESS_DOWNLOADING_TERRAIN 1324 +#define IDS_PROGRESS_ENTERING_END 1325 +#define IDS_PROGRESS_ENTERING_NETHER 1326 +#define IDS_PROGRESS_GENERATING_LEVEL 1327 +#define IDS_PROGRESS_GENERATING_SPAWN_AREA 1328 +#define IDS_PROGRESS_HOST_SAVING 1329 +#define IDS_PROGRESS_INITIALISING_SERVER 1330 +#define IDS_PROGRESS_LEAVING_END 1331 +#define IDS_PROGRESS_LEAVING_NETHER 1332 +#define IDS_PROGRESS_LOADING_LEVEL 1333 +#define IDS_PROGRESS_LOADING_SPAWN_AREA 1334 +#define IDS_PROGRESS_NEW_WORLD_SEED 1335 +#define IDS_PROGRESS_RESPAWNING 1336 +#define IDS_PROGRESS_SAVING_CHUNKS 1337 +#define IDS_PROGRESS_SAVING_LEVEL 1338 +#define IDS_PROGRESS_SAVING_PLAYERS 1339 +#define IDS_PROGRESS_SAVING_TO_DISC 1340 +#define IDS_PROGRESS_SIMULATING_WORLD 1341 +#define IDS_REINSTALL_AVATAR_ITEM_1 1342 +#define IDS_REINSTALL_AVATAR_ITEM_2 1343 +#define IDS_REINSTALL_AVATAR_ITEM_3 1344 +#define IDS_REINSTALL_CONTENT 1345 +#define IDS_REINSTALL_GAMERPIC_1 1346 +#define IDS_REINSTALL_GAMERPIC_2 1347 +#define IDS_REINSTALL_THEME 1348 +#define IDS_RENAME_WORLD_TEXT 1349 +#define IDS_RENAME_WORLD_TITLE 1350 +#define IDS_REPAIR_AND_NAME 1351 +#define IDS_REPAIR_COST 1352 +#define IDS_REPAIR_EXPENSIVE 1353 +#define IDS_REQUIRED_ITEMS_FOR_TRADE 1354 +#define IDS_RESET_NETHER 1355 +#define IDS_RESET_TO_DEFAULTS 1356 +#define IDS_RESETNETHER_TEXT 1357 +#define IDS_RESETNETHER_TITLE 1358 +#define IDS_RESPAWN 1359 +#define IDS_RESUME_GAME 1360 +#define IDS_RETURNEDTOMENU_TITLE 1361 +#define IDS_RETURNEDTOTITLESCREEN_TEXT 1362 +#define IDS_RICHPRESENCE_GAMESTATE 1363 +#define IDS_RICHPRESENCE_IDLE 1364 +#define IDS_RICHPRESENCE_MENUS 1365 +#define IDS_RICHPRESENCE_MULTIPLAYER 1366 +#define IDS_RICHPRESENCE_MULTIPLAYER_1P 1367 +#define IDS_RICHPRESENCE_MULTIPLAYER_1POFFLINE 1368 +#define IDS_RICHPRESENCE_MULTIPLAYEROFFLINE 1369 +#define IDS_RICHPRESENCESTATE_ANVIL 1370 +#define IDS_RICHPRESENCESTATE_BLANK 1371 +#define IDS_RICHPRESENCESTATE_BOATING 1372 +#define IDS_RICHPRESENCESTATE_BREWING 1373 +#define IDS_RICHPRESENCESTATE_CD 1374 +#define IDS_RICHPRESENCESTATE_CRAFTING 1375 +#define IDS_RICHPRESENCESTATE_ENCHANTING 1376 +#define IDS_RICHPRESENCESTATE_FISHING 1377 +#define IDS_RICHPRESENCESTATE_FORGING 1378 +#define IDS_RICHPRESENCESTATE_MAP 1379 +#define IDS_RICHPRESENCESTATE_NETHER 1380 +#define IDS_RICHPRESENCESTATE_RIDING_MINECART 1381 +#define IDS_RICHPRESENCESTATE_RIDING_PIG 1382 +#define IDS_RICHPRESENCESTATE_TRADING 1383 +#define IDS_SAVE_GAME 1384 +#define IDS_SAVE_ICON_MESSAGE 1385 +#define IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA 1386 +#define IDS_SAVE_INCOMPLETE_TITLE 1387 +#define IDS_SAVE_TRANSFER_DOWNLOADCOMPLETE 1388 +#define IDS_SAVE_TRANSFER_DOWNLOADFAILED 1389 +#define IDS_SAVE_TRANSFER_NOT_AVAILABLE_TEXT 1390 +#define IDS_SAVE_TRANSFER_TEXT 1391 +#define IDS_SAVE_TRANSFER_UPLOADCOMPLETE 1392 +#define IDS_SAVE_TRANSFER_UPLOADFAILED 1393 +#define IDS_SAVE_TRANSFER_WRONG_VERSION 1394 +#define IDS_SAVECACHEFILE 1395 +#define IDS_SAVEDATA_COPIED_TEXT 1396 +#define IDS_SAVEDATA_COPIED_TITLE 1397 +#define IDS_SAVETRANSFER_STAGE_CONVERTING 1398 +#define IDS_SAVETRANSFER_STAGE_GET_DATA 1399 +#define IDS_SAVETRANSFER_STAGE_PUT_DATA 1400 +#define IDS_SAVETRANSFER_STAGE_SAVING 1401 +#define IDS_SEED 1402 +#define IDS_SELECT_NETWORK_MODE_TEXT 1403 +#define IDS_SELECT_NETWORK_MODE_TITLE 1404 +#define IDS_SELECTAGAIN 1405 +#define IDS_SELECTED 1406 +#define IDS_SELECTED_SKIN 1407 +#define IDS_SETTINGS 1408 +#define IDS_SHEEP 1409 +#define IDS_SIGN_TITLE 1410 +#define IDS_SIGN_TITLE_TEXT 1411 +#define IDS_SIGNIN_PSN 1412 +#define IDS_SILVERFISH 1413 +#define IDS_SKELETON 1414 +#define IDS_SKELETON_HORSE 1415 +#define IDS_SKINS 1416 +#define IDS_SLIDER_AUTOSAVE 1417 +#define IDS_SLIDER_AUTOSAVE_OFF 1418 +#define IDS_SLIDER_DIFFICULTY 1419 +#define IDS_SLIDER_GAMMA 1420 +#define IDS_SLIDER_INTERFACEOPACITY 1421 +#define IDS_SLIDER_MUSIC 1422 +#define IDS_SLIDER_SENSITIVITY_INGAME 1423 +#define IDS_SLIDER_SENSITIVITY_INMENU 1424 +#define IDS_SLIDER_SOUND 1425 +#define IDS_SLIDER_UISIZE 1426 +#define IDS_SLIDER_UISIZESPLITSCREEN 1427 +#define IDS_SLIME 1428 +#define IDS_SNOWMAN 1429 +#define IDS_SOCIAL_DEFAULT_CAPTION 1430 +#define IDS_SOCIAL_DEFAULT_DESCRIPTION 1431 +#define IDS_SOCIAL_LABEL_CAPTION 1432 +#define IDS_SOCIAL_LABEL_DESCRIPTION 1433 +#define IDS_SOCIAL_TEXT 1434 +#define IDS_SOUTHPAW 1435 +#define IDS_SPIDER 1436 +#define IDS_SQUID 1437 +#define IDS_START_GAME 1438 +#define IDS_STO_SAVING_LONG 1439 +#define IDS_STO_SAVING_SHORT 1440 +#define IDS_STRINGVERIFY_AWAITING_APPROVAL 1441 +#define IDS_STRINGVERIFY_CENSORED 1442 +#define IDS_SUPERFLAT_WORLD 1443 +#define IDS_SURVIVAL 1444 +#define IDS_TELEPORT 1445 +#define IDS_TELEPORT_TO_ME 1446 +#define IDS_TELEPORT_TO_PLAYER 1447 +#define IDS_TEXT_DELETE_SAVE 1448 +#define IDS_TEXT_SAVEOPTIONS 1449 +#define IDS_TEXTURE_PACK_TRIALVERSION 1450 +#define IDS_TEXTUREPACK_FULLVERSION 1451 +#define IDS_THEMES 1452 +#define IDS_TILE_ACTIVATOR_RAIL 1453 +#define IDS_TILE_ANVIL 1454 +#define IDS_TILE_ANVIL_INTACT 1455 +#define IDS_TILE_ANVIL_SLIGHTLYDAMAGED 1456 +#define IDS_TILE_ANVIL_VERYDAMAGED 1457 +#define IDS_TILE_BEACON 1458 +#define IDS_TILE_BED 1459 +#define IDS_TILE_BED_MESLEEP 1460 +#define IDS_TILE_BED_NO_SLEEP 1461 +#define IDS_TILE_BED_NOT_VALID 1462 +#define IDS_TILE_BED_NOTSAFE 1463 +#define IDS_TILE_BED_OCCUPIED 1464 +#define IDS_TILE_BED_PLAYERSLEEP 1465 +#define IDS_TILE_BEDROCK 1466 +#define IDS_TILE_BIRCH 1467 +#define IDS_TILE_BIRCHWOOD_PLANKS 1468 +#define IDS_TILE_BLOCK_DIAMOND 1469 +#define IDS_TILE_BLOCK_GOLD 1470 +#define IDS_TILE_BLOCK_IRON 1471 +#define IDS_TILE_BLOCK_LAPIS 1472 +#define IDS_TILE_BOOKSHELF 1473 +#define IDS_TILE_BREWINGSTAND 1474 +#define IDS_TILE_BRICK 1475 +#define IDS_TILE_BUTTON 1476 +#define IDS_TILE_CACTUS 1477 +#define IDS_TILE_CAKE 1478 +#define IDS_TILE_CARPET 1479 +#define IDS_TILE_CARPET_BLACK 1480 +#define IDS_TILE_CARPET_BLUE 1481 +#define IDS_TILE_CARPET_BROWN 1482 +#define IDS_TILE_CARPET_CYAN 1483 +#define IDS_TILE_CARPET_GRAY 1484 +#define IDS_TILE_CARPET_GREEN 1485 +#define IDS_TILE_CARPET_LIGHT_BLUE 1486 +#define IDS_TILE_CARPET_LIME 1487 +#define IDS_TILE_CARPET_MAGENTA 1488 +#define IDS_TILE_CARPET_ORANGE 1489 +#define IDS_TILE_CARPET_PINK 1490 +#define IDS_TILE_CARPET_PURPLE 1491 +#define IDS_TILE_CARPET_RED 1492 +#define IDS_TILE_CARPET_SILVER 1493 +#define IDS_TILE_CARPET_WHITE 1494 +#define IDS_TILE_CARPET_YELLOW 1495 +#define IDS_TILE_CARROTS 1496 +#define IDS_TILE_CAULDRON 1497 +#define IDS_TILE_CHEST 1498 +#define IDS_TILE_CHEST_TRAP 1499 +#define IDS_TILE_CLAY 1500 +#define IDS_TILE_CLOTH 1501 +#define IDS_TILE_CLOTH_BLACK 1502 +#define IDS_TILE_CLOTH_BLUE 1503 +#define IDS_TILE_CLOTH_BROWN 1504 +#define IDS_TILE_CLOTH_CYAN 1505 +#define IDS_TILE_CLOTH_GRAY 1506 +#define IDS_TILE_CLOTH_GREEN 1507 +#define IDS_TILE_CLOTH_LIGHT_BLUE 1508 +#define IDS_TILE_CLOTH_LIME 1509 +#define IDS_TILE_CLOTH_MAGENTA 1510 +#define IDS_TILE_CLOTH_ORANGE 1511 +#define IDS_TILE_CLOTH_PINK 1512 +#define IDS_TILE_CLOTH_PURPLE 1513 +#define IDS_TILE_CLOTH_RED 1514 +#define IDS_TILE_CLOTH_SILVER 1515 +#define IDS_TILE_CLOTH_WHITE 1516 +#define IDS_TILE_CLOTH_YELLOW 1517 +#define IDS_TILE_COAL 1518 +#define IDS_TILE_COBBLESTONE_WALL 1519 +#define IDS_TILE_COBBLESTONE_WALL_MOSSY 1520 +#define IDS_TILE_COCOA 1521 +#define IDS_TILE_COMMAND_BLOCK 1522 +#define IDS_TILE_COMPARATOR 1523 +#define IDS_TILE_CROPS 1524 +#define IDS_TILE_DAYLIGHT_DETECTOR 1525 +#define IDS_TILE_DEAD_BUSH 1526 +#define IDS_TILE_DETECTOR_RAIL 1527 +#define IDS_TILE_DIODE 1528 +#define IDS_TILE_DIRT 1529 +#define IDS_TILE_DISPENSER 1530 +#define IDS_TILE_DOOR_IRON 1531 +#define IDS_TILE_DOOR_WOOD 1532 +#define IDS_TILE_DRAGONEGG 1533 +#define IDS_TILE_DROPPER 1534 +#define IDS_TILE_DROPS 1535 +#define IDS_TILE_EMERALDBLOCK 1536 +#define IDS_TILE_EMERALDORE 1537 +#define IDS_TILE_ENCHANTMENTTABLE 1538 +#define IDS_TILE_END_PORTAL 1539 +#define IDS_TILE_ENDERCHEST 1540 +#define IDS_TILE_ENDPORTALFRAME 1541 +#define IDS_TILE_FARMLAND 1542 +#define IDS_TILE_FENCE 1543 +#define IDS_TILE_FENCE_GATE 1544 +#define IDS_TILE_FERN 1545 +#define IDS_TILE_FIRE 1546 +#define IDS_TILE_FLOWER 1547 +#define IDS_TILE_FLOWERPOT 1548 +#define IDS_TILE_FURNACE 1549 +#define IDS_TILE_GLASS 1550 +#define IDS_TILE_GOLDEN_RAIL 1551 +#define IDS_TILE_GRASS 1552 +#define IDS_TILE_GRAVEL 1553 +#define IDS_TILE_HARDENED_CLAY 1554 +#define IDS_TILE_HAY 1555 +#define IDS_TILE_HELL_ROCK 1556 +#define IDS_TILE_HELL_SAND 1557 +#define IDS_TILE_HOPPER 1558 +#define IDS_TILE_HUGE_MUSHROOM_1 1559 +#define IDS_TILE_HUGE_MUSHROOM_2 1560 +#define IDS_TILE_ICE 1561 +#define IDS_TILE_IRON_FENCE 1562 +#define IDS_TILE_JUKEBOX 1563 +#define IDS_TILE_JUNGLE_PLANKS 1564 +#define IDS_TILE_LADDER 1565 +#define IDS_TILE_LAVA 1566 +#define IDS_TILE_LEAVES 1567 +#define IDS_TILE_LEAVES_BIRCH 1568 +#define IDS_TILE_LEAVES_JUNGLE 1569 +#define IDS_TILE_LEAVES_OAK 1570 +#define IDS_TILE_LEAVES_SPRUCE 1571 +#define IDS_TILE_LEVER 1572 +#define IDS_TILE_LIGHT_GEM 1573 +#define IDS_TILE_LIT_PUMPKIN 1574 +#define IDS_TILE_LOCKED_CHEST 1575 +#define IDS_TILE_LOG 1576 +#define IDS_TILE_LOG_BIRCH 1577 +#define IDS_TILE_LOG_JUNGLE 1578 +#define IDS_TILE_LOG_OAK 1579 +#define IDS_TILE_LOG_SPRUCE 1580 +#define IDS_TILE_MELON 1581 +#define IDS_TILE_MELON_STEM 1582 +#define IDS_TILE_MOB_SPAWNER 1583 +#define IDS_TILE_MONSTER_STONE_EGG 1584 +#define IDS_TILE_MUSHROOM 1585 +#define IDS_TILE_MUSIC_BLOCK 1586 +#define IDS_TILE_MYCEL 1587 +#define IDS_TILE_NETHER_QUARTZ 1588 +#define IDS_TILE_NETHERBRICK 1589 +#define IDS_TILE_NETHERFENCE 1590 +#define IDS_TILE_NETHERSTALK 1591 +#define IDS_TILE_NOT_GATE 1592 +#define IDS_TILE_OAK 1593 +#define IDS_TILE_OAKWOOD_PLANKS 1594 +#define IDS_TILE_OBSIDIAN 1595 +#define IDS_TILE_ORE_COAL 1596 +#define IDS_TILE_ORE_DIAMOND 1597 +#define IDS_TILE_ORE_GOLD 1598 +#define IDS_TILE_ORE_IRON 1599 +#define IDS_TILE_ORE_LAPIS 1600 +#define IDS_TILE_ORE_REDSTONE 1601 +#define IDS_TILE_PISTON_BASE 1602 +#define IDS_TILE_PISTON_STICK_BASE 1603 +#define IDS_TILE_PLANKS 1604 +#define IDS_TILE_PORTAL 1605 +#define IDS_TILE_POTATOES 1606 +#define IDS_TILE_PRESSURE_PLATE 1607 +#define IDS_TILE_PUMPKIN 1608 +#define IDS_TILE_PUMPKIN_STEM 1609 +#define IDS_TILE_QUARTZ_BLOCK 1610 +#define IDS_TILE_QUARTZ_BLOCK_CHISELED 1611 +#define IDS_TILE_QUARTZ_BLOCK_LINES 1612 +#define IDS_TILE_RAIL 1613 +#define IDS_TILE_REDSTONE_BLOCK 1614 +#define IDS_TILE_REDSTONE_DUST 1615 +#define IDS_TILE_REDSTONE_LIGHT 1616 +#define IDS_TILE_REEDS 1617 +#define IDS_TILE_ROSE 1618 +#define IDS_TILE_SAND 1619 +#define IDS_TILE_SANDSTONE 1620 +#define IDS_TILE_SANDSTONE_CHISELED 1621 +#define IDS_TILE_SANDSTONE_SMOOTH 1622 +#define IDS_TILE_SAPLING 1623 +#define IDS_TILE_SAPLING_BIRCH 1624 +#define IDS_TILE_SAPLING_JUNGLE 1625 +#define IDS_TILE_SAPLING_OAK 1626 +#define IDS_TILE_SAPLING_SPRUCE 1627 +#define IDS_TILE_SHRUB 1628 +#define IDS_TILE_SIGN 1629 +#define IDS_TILE_SKULL 1630 +#define IDS_TILE_SNOW 1631 +#define IDS_TILE_SPONGE 1632 +#define IDS_TILE_SPRUCE 1633 +#define IDS_TILE_SPRUCEWOOD_PLANKS 1634 +#define IDS_TILE_STAINED_CLAY 1635 +#define IDS_TILE_STAINED_CLAY_BLACK 1636 +#define IDS_TILE_STAINED_CLAY_BLUE 1637 +#define IDS_TILE_STAINED_CLAY_BROWN 1638 +#define IDS_TILE_STAINED_CLAY_CYAN 1639 +#define IDS_TILE_STAINED_CLAY_GRAY 1640 +#define IDS_TILE_STAINED_CLAY_GREEN 1641 +#define IDS_TILE_STAINED_CLAY_LIGHT_BLUE 1642 +#define IDS_TILE_STAINED_CLAY_LIME 1643 +#define IDS_TILE_STAINED_CLAY_MAGENTA 1644 +#define IDS_TILE_STAINED_CLAY_ORANGE 1645 +#define IDS_TILE_STAINED_CLAY_PINK 1646 +#define IDS_TILE_STAINED_CLAY_PURPLE 1647 +#define IDS_TILE_STAINED_CLAY_RED 1648 +#define IDS_TILE_STAINED_CLAY_SILVER 1649 +#define IDS_TILE_STAINED_CLAY_WHITE 1650 +#define IDS_TILE_STAINED_CLAY_YELLOW 1651 +#define IDS_TILE_STAINED_GLASS 1652 +#define IDS_TILE_STAINED_GLASS_BLACK 1653 +#define IDS_TILE_STAINED_GLASS_BLUE 1654 +#define IDS_TILE_STAINED_GLASS_BROWN 1655 +#define IDS_TILE_STAINED_GLASS_CYAN 1656 +#define IDS_TILE_STAINED_GLASS_GRAY 1657 +#define IDS_TILE_STAINED_GLASS_GREEN 1658 +#define IDS_TILE_STAINED_GLASS_LIGHT_BLUE 1659 +#define IDS_TILE_STAINED_GLASS_LIME 1660 +#define IDS_TILE_STAINED_GLASS_MAGENTA 1661 +#define IDS_TILE_STAINED_GLASS_ORANGE 1662 +#define IDS_TILE_STAINED_GLASS_PANE 1663 +#define IDS_TILE_STAINED_GLASS_PANE_BLACK 1664 +#define IDS_TILE_STAINED_GLASS_PANE_BLUE 1665 +#define IDS_TILE_STAINED_GLASS_PANE_BROWN 1666 +#define IDS_TILE_STAINED_GLASS_PANE_CYAN 1667 +#define IDS_TILE_STAINED_GLASS_PANE_GRAY 1668 +#define IDS_TILE_STAINED_GLASS_PANE_GREEN 1669 +#define IDS_TILE_STAINED_GLASS_PANE_LIGHT_BLUE 1670 +#define IDS_TILE_STAINED_GLASS_PANE_LIME 1671 +#define IDS_TILE_STAINED_GLASS_PANE_MAGENTA 1672 +#define IDS_TILE_STAINED_GLASS_PANE_ORANGE 1673 +#define IDS_TILE_STAINED_GLASS_PANE_PINK 1674 +#define IDS_TILE_STAINED_GLASS_PANE_PURPLE 1675 +#define IDS_TILE_STAINED_GLASS_PANE_RED 1676 +#define IDS_TILE_STAINED_GLASS_PANE_SILVER 1677 +#define IDS_TILE_STAINED_GLASS_PANE_WHITE 1678 +#define IDS_TILE_STAINED_GLASS_PANE_YELLOW 1679 +#define IDS_TILE_STAINED_GLASS_PINK 1680 +#define IDS_TILE_STAINED_GLASS_PURPLE 1681 +#define IDS_TILE_STAINED_GLASS_RED 1682 +#define IDS_TILE_STAINED_GLASS_SILVER 1683 +#define IDS_TILE_STAINED_GLASS_WHITE 1684 +#define IDS_TILE_STAINED_GLASS_YELLOW 1685 +#define IDS_TILE_STAIRS_BIRCHWOOD 1686 +#define IDS_TILE_STAIRS_BRICKS 1687 +#define IDS_TILE_STAIRS_JUNGLEWOOD 1688 +#define IDS_TILE_STAIRS_NETHERBRICK 1689 +#define IDS_TILE_STAIRS_QUARTZ 1690 +#define IDS_TILE_STAIRS_SANDSTONE 1691 +#define IDS_TILE_STAIRS_SPRUCEWOOD 1692 +#define IDS_TILE_STAIRS_STONE 1693 +#define IDS_TILE_STAIRS_STONE_BRICKS_SMOOTH 1694 +#define IDS_TILE_STAIRS_WOOD 1695 +#define IDS_TILE_STONE 1696 +#define IDS_TILE_STONE_BRICK 1697 +#define IDS_TILE_STONE_BRICK_SMOOTH 1698 +#define IDS_TILE_STONE_BRICK_SMOOTH_CHISELED 1699 +#define IDS_TILE_STONE_BRICK_SMOOTH_CRACKED 1700 +#define IDS_TILE_STONE_BRICK_SMOOTH_MOSSY 1701 +#define IDS_TILE_STONE_MOSS 1702 +#define IDS_TILE_STONE_SILVERFISH 1703 +#define IDS_TILE_STONE_SILVERFISH_COBBLESTONE 1704 +#define IDS_TILE_STONE_SILVERFISH_STONE_BRICK 1705 +#define IDS_TILE_STONESLAB 1706 +#define IDS_TILE_STONESLAB_BIRCH 1707 +#define IDS_TILE_STONESLAB_BRICK 1708 +#define IDS_TILE_STONESLAB_COBBLE 1709 +#define IDS_TILE_STONESLAB_JUNGLE 1710 +#define IDS_TILE_STONESLAB_NETHERBRICK 1711 +#define IDS_TILE_STONESLAB_OAK 1712 +#define IDS_TILE_STONESLAB_QUARTZ 1713 +#define IDS_TILE_STONESLAB_SAND 1714 +#define IDS_TILE_STONESLAB_SMOOTHBRICK 1715 +#define IDS_TILE_STONESLAB_SPRUCE 1716 +#define IDS_TILE_STONESLAB_STONE 1717 +#define IDS_TILE_STONESLAB_WOOD 1718 +#define IDS_TILE_TALL_GRASS 1719 +#define IDS_TILE_THIN_GLASS 1720 +#define IDS_TILE_TNT 1721 +#define IDS_TILE_TORCH 1722 +#define IDS_TILE_TORCHCHARCOAL 1723 +#define IDS_TILE_TORCHCOAL 1724 +#define IDS_TILE_TRAPDOOR 1725 +#define IDS_TILE_TRIPWIRE 1726 +#define IDS_TILE_TRIPWIRE_SOURCE 1727 +#define IDS_TILE_VINE 1728 +#define IDS_TILE_WATER 1729 +#define IDS_TILE_WATERLILY 1730 +#define IDS_TILE_WEB 1731 +#define IDS_TILE_WEIGHTED_PLATE_HEAVY 1732 +#define IDS_TILE_WEIGHTED_PLATE_LIGHT 1733 +#define IDS_TILE_WHITESTONE 1734 +#define IDS_TILE_WORKBENCH 1735 +#define IDS_TIPS_GAMETIP_0 1736 +#define IDS_TIPS_GAMETIP_1 1737 +#define IDS_TIPS_GAMETIP_10 1738 +#define IDS_TIPS_GAMETIP_11 1739 +#define IDS_TIPS_GAMETIP_12 1740 +#define IDS_TIPS_GAMETIP_13 1741 +#define IDS_TIPS_GAMETIP_14 1742 +#define IDS_TIPS_GAMETIP_15 1743 +#define IDS_TIPS_GAMETIP_16 1744 +#define IDS_TIPS_GAMETIP_17 1745 +#define IDS_TIPS_GAMETIP_18 1746 +#define IDS_TIPS_GAMETIP_19 1747 +#define IDS_TIPS_GAMETIP_2 1748 +#define IDS_TIPS_GAMETIP_20 1749 +#define IDS_TIPS_GAMETIP_21 1750 +#define IDS_TIPS_GAMETIP_22 1751 +#define IDS_TIPS_GAMETIP_23 1752 +#define IDS_TIPS_GAMETIP_24 1753 +#define IDS_TIPS_GAMETIP_25 1754 +#define IDS_TIPS_GAMETIP_26 1755 +#define IDS_TIPS_GAMETIP_27 1756 +#define IDS_TIPS_GAMETIP_28 1757 +#define IDS_TIPS_GAMETIP_29 1758 +#define IDS_TIPS_GAMETIP_3 1759 +#define IDS_TIPS_GAMETIP_30 1760 +#define IDS_TIPS_GAMETIP_31 1761 +#define IDS_TIPS_GAMETIP_32 1762 +#define IDS_TIPS_GAMETIP_33 1763 +#define IDS_TIPS_GAMETIP_34 1764 +#define IDS_TIPS_GAMETIP_35 1765 +#define IDS_TIPS_GAMETIP_36 1766 +#define IDS_TIPS_GAMETIP_37 1767 +#define IDS_TIPS_GAMETIP_38 1768 +#define IDS_TIPS_GAMETIP_39 1769 +#define IDS_TIPS_GAMETIP_4 1770 +#define IDS_TIPS_GAMETIP_40 1771 +#define IDS_TIPS_GAMETIP_41 1772 +#define IDS_TIPS_GAMETIP_42 1773 +#define IDS_TIPS_GAMETIP_43 1774 +#define IDS_TIPS_GAMETIP_44 1775 +#define IDS_TIPS_GAMETIP_45 1776 +#define IDS_TIPS_GAMETIP_46 1777 +#define IDS_TIPS_GAMETIP_47 1778 +#define IDS_TIPS_GAMETIP_48 1779 +#define IDS_TIPS_GAMETIP_49 1780 +#define IDS_TIPS_GAMETIP_5 1781 +#define IDS_TIPS_GAMETIP_50 1782 +#define IDS_TIPS_GAMETIP_6 1783 +#define IDS_TIPS_GAMETIP_7 1784 +#define IDS_TIPS_GAMETIP_8 1785 +#define IDS_TIPS_GAMETIP_9 1786 +#define IDS_TIPS_GAMETIP_NEWDLC 1787 +#define IDS_TIPS_GAMETIP_SKINPACKS 1788 +#define IDS_TIPS_TRIVIA_1 1789 +#define IDS_TIPS_TRIVIA_10 1790 +#define IDS_TIPS_TRIVIA_11 1791 +#define IDS_TIPS_TRIVIA_12 1792 +#define IDS_TIPS_TRIVIA_13 1793 +#define IDS_TIPS_TRIVIA_14 1794 +#define IDS_TIPS_TRIVIA_15 1795 +#define IDS_TIPS_TRIVIA_16 1796 +#define IDS_TIPS_TRIVIA_17 1797 +#define IDS_TIPS_TRIVIA_18 1798 +#define IDS_TIPS_TRIVIA_19 1799 +#define IDS_TIPS_TRIVIA_2 1800 +#define IDS_TIPS_TRIVIA_20 1801 +#define IDS_TIPS_TRIVIA_3 1802 +#define IDS_TIPS_TRIVIA_4 1803 +#define IDS_TIPS_TRIVIA_5 1804 +#define IDS_TIPS_TRIVIA_6 1805 +#define IDS_TIPS_TRIVIA_7 1806 +#define IDS_TIPS_TRIVIA_8 1807 +#define IDS_TIPS_TRIVIA_9 1808 +#define IDS_TITLE_DECLINE_SAVE_GAME 1809 +#define IDS_TITLE_RENAME 1810 +#define IDS_TITLE_RENAMESAVE 1811 +#define IDS_TITLE_SAVE_GAME 1812 +#define IDS_TITLE_START_GAME 1813 +#define IDS_TITLE_UPDATE_NAME 1814 +#define IDS_TITLEUPDATE 1815 +#define IDS_TNT_EXPLODES 1816 +#define IDS_TOOLTIP_CHANGE_NETWORK_MODE 1817 +#define IDS_TOOLTIPS_ACCEPT 1818 +#define IDS_TOOLTIPS_ALL_GAMES 1819 +#define IDS_TOOLTIPS_ATTACH 1820 +#define IDS_TOOLTIPS_BACK 1821 +#define IDS_TOOLTIPS_BANLEVEL 1822 +#define IDS_TOOLTIPS_BLOCK 1823 +#define IDS_TOOLTIPS_CANCEL 1824 +#define IDS_TOOLTIPS_CANCEL_JOIN 1825 +#define IDS_TOOLTIPS_CHANGE_FILTER 1826 +#define IDS_TOOLTIPS_CHANGE_GROUP 1827 +#define IDS_TOOLTIPS_CHANGEDEVICE 1828 +#define IDS_TOOLTIPS_CHANGEPITCH 1829 +#define IDS_TOOLTIPS_CLEAR_QUICK_SELECT 1830 +#define IDS_TOOLTIPS_CLEARSLOTS 1831 +#define IDS_TOOLTIPS_COLLECT 1832 +#define IDS_TOOLTIPS_CONTINUE 1833 +#define IDS_TOOLTIPS_CRAFTING 1834 +#define IDS_TOOLTIPS_CREATE 1835 +#define IDS_TOOLTIPS_CREATIVE 1836 +#define IDS_TOOLTIPS_CURE 1837 +#define IDS_TOOLTIPS_DELETE 1838 +#define IDS_TOOLTIPS_DELETESAVE 1839 +#define IDS_TOOLTIPS_DETONATE 1840 +#define IDS_TOOLTIPS_DISMOUNT 1841 +#define IDS_TOOLTIPS_DRAW_BOW 1842 +#define IDS_TOOLTIPS_DRINK 1843 +#define IDS_TOOLTIPS_DROP_ALL 1844 +#define IDS_TOOLTIPS_DROP_GENERIC 1845 +#define IDS_TOOLTIPS_DROP_ONE 1846 +#define IDS_TOOLTIPS_DYE 1847 +#define IDS_TOOLTIPS_DYECOLLAR 1848 +#define IDS_TOOLTIPS_EAT 1849 +#define IDS_TOOLTIPS_EJECT 1850 +#define IDS_TOOLTIPS_EMPTY 1851 +#define IDS_TOOLTIPS_EQUIP 1852 +#define IDS_TOOLTIPS_EXECUTE_COMMAND 1853 +#define IDS_TOOLTIPS_EXIT 1854 +#define IDS_TOOLTIPS_FEED 1855 +#define IDS_TOOLTIPS_FIREWORK_LAUNCH 1856 +#define IDS_TOOLTIPS_FOLLOWME 1857 +#define IDS_TOOLTIPS_GAME_INVITES 1858 +#define IDS_TOOLTIPS_GROW 1859 +#define IDS_TOOLTIPS_HANG 1860 +#define IDS_TOOLTIPS_HARVEST 1861 +#define IDS_TOOLTIPS_HEAL 1862 +#define IDS_TOOLTIPS_HIDE 1863 +#define IDS_TOOLTIPS_HIT 1864 +#define IDS_TOOLTIPS_IGNITE 1865 +#define IDS_TOOLTIPS_INSTALL 1866 +#define IDS_TOOLTIPS_INSTALL_FULL 1867 +#define IDS_TOOLTIPS_INSTALL_TRIAL 1868 +#define IDS_TOOLTIPS_INVITE_FRIENDS 1869 +#define IDS_TOOLTIPS_INVITE_PARTY 1870 +#define IDS_TOOLTIPS_KICK 1871 +#define IDS_TOOLTIPS_LEASH 1872 +#define IDS_TOOLTIPS_LOVEMODE 1873 +#define IDS_TOOLTIPS_MILK 1874 +#define IDS_TOOLTIPS_MINE 1875 +#define IDS_TOOLTIPS_MOUNT 1876 +#define IDS_TOOLTIPS_NAME 1877 +#define IDS_TOOLTIPS_NAVIGATE 1878 +#define IDS_TOOLTIPS_NEXT 1879 +#define IDS_TOOLTIPS_OPEN 1880 +#define IDS_TOOLTIPS_OPTIONS 1881 +#define IDS_TOOLTIPS_PAGE_DOWN 1882 +#define IDS_TOOLTIPS_PAGE_UP 1883 +#define IDS_TOOLTIPS_PAGEDOWN 1884 +#define IDS_TOOLTIPS_PAGEUP 1885 +#define IDS_TOOLTIPS_PARTY_GAMES 1886 +#define IDS_TOOLTIPS_PICKUP_ALL 1887 +#define IDS_TOOLTIPS_PICKUP_GENERIC 1888 +#define IDS_TOOLTIPS_PICKUP_HALF 1889 +#define IDS_TOOLTIPS_PICKUPPLACE 1890 +#define IDS_TOOLTIPS_PLACE 1891 +#define IDS_TOOLTIPS_PLACE_ALL 1892 +#define IDS_TOOLTIPS_PLACE_GENERIC 1893 +#define IDS_TOOLTIPS_PLACE_ONE 1894 +#define IDS_TOOLTIPS_PLANT 1895 +#define IDS_TOOLTIPS_PLAY 1896 +#define IDS_TOOLTIPS_PREVIOUS 1897 +#define IDS_TOOLTIPS_PRIVILEGES 1898 +#define IDS_TOOLTIPS_QUICK_MOVE 1899 +#define IDS_TOOLTIPS_QUICK_MOVE_ARMOR 1900 +#define IDS_TOOLTIPS_QUICK_MOVE_FUEL 1901 +#define IDS_TOOLTIPS_QUICK_MOVE_INGREDIENT 1902 +#define IDS_TOOLTIPS_QUICK_MOVE_TOOL 1903 +#define IDS_TOOLTIPS_QUICK_MOVE_WEAPON 1904 +#define IDS_TOOLTIPS_READ 1905 +#define IDS_TOOLTIPS_REFRESH 1906 +#define IDS_TOOLTIPS_REINSTALL 1907 +#define IDS_TOOLTIPS_RELEASE_BOW 1908 +#define IDS_TOOLTIPS_REPAIR 1909 +#define IDS_TOOLTIPS_RIDE 1910 +#define IDS_TOOLTIPS_ROTATE 1911 +#define IDS_TOOLTIPS_SADDLE 1912 +#define IDS_TOOLTIPS_SADDLEBAGS 1913 +#define IDS_TOOLTIPS_SAIL 1914 +#define IDS_TOOLTIPS_SAVEOPTIONS 1915 +#define IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD 1916 +#define IDS_TOOLTIPS_SAVETRANSFER_UPLOAD 1917 +#define IDS_TOOLTIPS_SELECT 1918 +#define IDS_TOOLTIPS_SELECT_SKIN 1919 +#define IDS_TOOLTIPS_SELECTDEVICE 1920 +#define IDS_TOOLTIPS_SEND_FRIEND_REQUEST 1921 +#define IDS_TOOLTIPS_SHARE 1922 +#define IDS_TOOLTIPS_SHEAR 1923 +#define IDS_TOOLTIPS_SHOW_DESCRIPTION 1924 +#define IDS_TOOLTIPS_SHOW_INGREDIENTS 1925 +#define IDS_TOOLTIPS_SHOW_INVENTORY 1926 +#define IDS_TOOLTIPS_SIT 1927 +#define IDS_TOOLTIPS_SLEEP 1928 +#define IDS_TOOLTIPS_SWAP 1929 +#define IDS_TOOLTIPS_SWIMUP 1930 +#define IDS_TOOLTIPS_TAME 1931 +#define IDS_TOOLTIPS_THROW 1932 +#define IDS_TOOLTIPS_TILL 1933 +#define IDS_TOOLTIPS_TRADE 1934 +#define IDS_TOOLTIPS_UNLEASH 1935 +#define IDS_TOOLTIPS_UNLOCKFULLVERSION 1936 +#define IDS_TOOLTIPS_USE 1937 +#define IDS_TOOLTIPS_VIEW_GAMERCARD 1938 +#define IDS_TOOLTIPS_VIEW_GAMERPROFILE 1939 +#define IDS_TOOLTIPS_WAKEUP 1940 +#define IDS_TOOLTIPS_WHAT_IS_THIS 1941 +#define IDS_TRIALOVER_TEXT 1942 +#define IDS_TRIALOVER_TITLE 1943 +#define IDS_TRUST_PLAYERS 1944 +#define IDS_TUTORIAL_BREEDING_OVERVIEW 1945 +#define IDS_TUTORIAL_COMPLETED 1946 +#define IDS_TUTORIAL_COMPLETED_EXPLORE 1947 +#define IDS_TUTORIAL_CONSTRAINT_TUTORIAL_AREA 1948 +#define IDS_TUTORIAL_CREATIVE_OVERVIEW 1949 +#define IDS_TUTORIAL_FARMING_OVERVIEW 1950 +#define IDS_TUTORIAL_FEATURES_IN_THIS_AREA 1951 +#define IDS_TUTORIAL_FEATURES_OUTSIDE_THIS_AREA 1952 +#define IDS_TUTORIAL_GOLEM_OVERVIEW 1953 +#define IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL 1954 +#define IDS_TUTORIAL_HINT_BOAT 1955 +#define IDS_TUTORIAL_HINT_CRAFT_NO_INGREDIENTS 1956 +#define IDS_TUTORIAL_HINT_DIGGER_ITEM_HATCHET 1957 +#define IDS_TUTORIAL_HINT_DIGGER_ITEM_PICKAXE 1958 +#define IDS_TUTORIAL_HINT_DIGGER_ITEM_SHOVEL 1959 +#define IDS_TUTORIAL_HINT_FISHING 1960 +#define IDS_TUTORIAL_HINT_HOLD_TO_MINE 1961 +#define IDS_TUTORIAL_HINT_INV_DROP 1962 +#define IDS_TUTORIAL_HINT_MINECART 1963 +#define IDS_TUTORIAL_HINT_PISTON_SELF_REPAIRING_BRIDGE 1964 +#define IDS_TUTORIAL_HINT_SWIM_UP 1965 +#define IDS_TUTORIAL_HINT_TOOL_DAMAGED 1966 +#define IDS_TUTORIAL_HTML_EXIT_PICTURE 1967 +#define IDS_TUTORIAL_NEW_FEATURES_CHOICE 1968 +#define IDS_TUTORIAL_PORTAL_OVERVIEW 1969 +#define IDS_TUTORIAL_PROMPT_ANVIL_MENU_OVERVIEW 1970 +#define IDS_TUTORIAL_PROMPT_ANVIL_OVERVIEW 1971 +#define IDS_TUTORIAL_PROMPT_BASIC_COMPLETE 1972 +#define IDS_TUTORIAL_PROMPT_BEACON_MENU_OVERVIEW 1973 +#define IDS_TUTORIAL_PROMPT_BEACON_OVERVIEW 1974 +#define IDS_TUTORIAL_PROMPT_BED_OVERVIEW 1975 +#define IDS_TUTORIAL_PROMPT_BOAT_OVERVIEW 1976 +#define IDS_TUTORIAL_PROMPT_BREEDING_OVERVIEW 1977 +#define IDS_TUTORIAL_PROMPT_BREWING_MENU_OVERVIEW 1978 +#define IDS_TUTORIAL_PROMPT_BREWING_OVERVIEW 1979 +#define IDS_TUTORIAL_PROMPT_CRAFT_OVERVIEW 1980 +#define IDS_TUTORIAL_PROMPT_CREATIVE_INV_OVERVIEW 1981 +#define IDS_TUTORIAL_PROMPT_CREATIVE_OVERVIEW 1982 +#define IDS_TUTORIAL_PROMPT_ENCHANTING_MENU_OVERVIEW 1983 +#define IDS_TUTORIAL_PROMPT_ENCHANTING_OVERVIEW 1984 +#define IDS_TUTORIAL_PROMPT_ENDERCHEST_OVERVIEW 1985 +#define IDS_TUTORIAL_PROMPT_FARMING_OVERVIEW 1986 +#define IDS_TUTORIAL_PROMPT_FIREWORK_MENU_OVERVIEW 1987 +#define IDS_TUTORIAL_PROMPT_FIREWORK_OVERVIEW 1988 +#define IDS_TUTORIAL_PROMPT_FISHING_OVERVIEW 1989 +#define IDS_TUTORIAL_PROMPT_FOOD_BAR_OVERVIEW 1990 +#define IDS_TUTORIAL_PROMPT_FURNACE_OVERVIEW 1991 +#define IDS_TUTORIAL_PROMPT_GOLEM_OVERVIEW 1992 +#define IDS_TUTORIAL_PROMPT_HOPPER_OVERVIEW 1993 +#define IDS_TUTORIAL_PROMPT_HORSE_MENU_OVERVIEW 1994 +#define IDS_TUTORIAL_PROMPT_HORSE_OVERVIEW 1995 +#define IDS_TUTORIAL_PROMPT_INV_OVERVIEW 1996 +#define IDS_TUTORIAL_PROMPT_MINECART_OVERVIEW 1997 +#define IDS_TUTORIAL_PROMPT_NEW_FEATURES_CHOICE 1998 +#define IDS_TUTORIAL_PROMPT_PORTAL_OVERVIEW 1999 +#define IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE 2000 +#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_DESCRIPTION 2001 +#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INGREDIENTS 2002 +#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INVENTORY 2003 +#define IDS_TUTORIAL_PROMPT_REDSTONE_OVERVIEW 2004 +#define IDS_TUTORIAL_PROMPT_START_TUTORIAL 2005 +#define IDS_TUTORIAL_PROMPT_TRADING_MENU_OVERVIEW 2006 +#define IDS_TUTORIAL_PROMPT_TRADING_OVERVIEW 2007 +#define IDS_TUTORIAL_REDSTONE_OVERVIEW 2008 +#define IDS_TUTORIAL_REMINDER 2009 +#define IDS_TUTORIAL_TASK_ACTIVATE_PORTAL 2010 +#define IDS_TUTORIAL_TASK_ANVIL_COST 2011 +#define IDS_TUTORIAL_TASK_ANVIL_COST2 2012 +#define IDS_TUTORIAL_TASK_ANVIL_ENCHANTED_BOOKS 2013 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_COST 2014 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_ENCHANT 2015 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_OVERVIEW 2016 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_RENAMING 2017 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_REPAIR 2018 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_SACRIFICE 2019 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_SMITH 2020 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_START 2021 +#define IDS_TUTORIAL_TASK_ANVIL_OVERVIEW 2022 +#define IDS_TUTORIAL_TASK_ANVIL_RENAMING 2023 +#define IDS_TUTORIAL_TASK_ANVIL_SUMMARY 2024 +#define IDS_TUTORIAL_TASK_ANVIL_USE_CHESTS 2025 +#define IDS_TUTORIAL_TASK_BASIC_COMPLETE 2026 +#define IDS_TUTORIAL_TASK_BEACON_CHOOSING_POWERS 2027 +#define IDS_TUTORIAL_TASK_BEACON_DESIGN 2028 +#define IDS_TUTORIAL_TASK_BEACON_MENU_ACTIVATION 2029 +#define IDS_TUTORIAL_TASK_BEACON_MENU_OVERVIEW 2030 +#define IDS_TUTORIAL_TASK_BEACON_MENU_PRIMARY_POWERS 2031 +#define IDS_TUTORIAL_TASK_BEACON_MENU_SECONDARY_POWER 2032 +#define IDS_TUTORIAL_TASK_BEACON_OVERVIEW 2033 +#define IDS_TUTORIAL_TASK_BEACON_PURPOSE 2034 +#define IDS_TUTORIAL_TASK_BED_MULTIPLAYER 2035 +#define IDS_TUTORIAL_TASK_BED_OVERVIEW 2036 +#define IDS_TUTORIAL_TASK_BED_PLACEMENT 2037 +#define IDS_TUTORIAL_TASK_BOAT_OVERVIEW 2038 +#define IDS_TUTORIAL_TASK_BOAT_STEER 2039 +#define IDS_TUTORIAL_TASK_BREEDING_BABY 2040 +#define IDS_TUTORIAL_TASK_BREEDING_COMPLETE 2041 +#define IDS_TUTORIAL_TASK_BREEDING_DELAY 2042 +#define IDS_TUTORIAL_TASK_BREEDING_FEED 2043 +#define IDS_TUTORIAL_TASK_BREEDING_FEED_FOOD 2044 +#define IDS_TUTORIAL_TASK_BREEDING_FOLLOW 2045 +#define IDS_TUTORIAL_TASK_BREEDING_RIDING_PIGS 2046 +#define IDS_TUTORIAL_TASK_BREEDING_WOLF_COLLAR 2047 +#define IDS_TUTORIAL_TASK_BREEDING_WOLF_TAMING 2048 +#define IDS_TUTORIAL_TASK_BREWING_CREATE_FIRE_POTION 2049 +#define IDS_TUTORIAL_TASK_BREWING_DRINK_FIRE_POTION 2050 +#define IDS_TUTORIAL_TASK_BREWING_FILL_CAULDRON 2051 +#define IDS_TUTORIAL_TASK_BREWING_FILL_GLASS_BOTTLE 2052 +#define IDS_TUTORIAL_TASK_BREWING_GET_GLASS_BOTTLE 2053 +#define IDS_TUTORIAL_TASK_BREWING_MENU_BASIC_INGREDIENTS 2054 +#define IDS_TUTORIAL_TASK_BREWING_MENU_CREATE_FIRE_POTION 2055 +#define IDS_TUTORIAL_TASK_BREWING_MENU_EXIT 2056 +#define IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS 2057 +#define IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS_2 2058 +#define IDS_TUTORIAL_TASK_BREWING_MENU_METHOD 2059 +#define IDS_TUTORIAL_TASK_BREWING_MENU_OVERVIEW 2060 +#define IDS_TUTORIAL_TASK_BREWING_OVERVIEW 2061 +#define IDS_TUTORIAL_TASK_BREWING_USE_EFFECTS 2062 +#define IDS_TUTORIAL_TASK_BREWING_USE_POTION 2063 +#define IDS_TUTORIAL_TASK_BUILD_PORTAL 2064 +#define IDS_TUTORIAL_TASK_CHOP_WOOD 2065 +#define IDS_TUTORIAL_TASK_COLLECT_RESOURCES 2066 +#define IDS_TUTORIAL_TASK_CRAFT_CRAFT_TABLE 2067 +#define IDS_TUTORIAL_TASK_CRAFT_CREATE 2068 +#define IDS_TUTORIAL_TASK_CRAFT_CREATE_FURNACE 2069 +#define IDS_TUTORIAL_TASK_CRAFT_CREATE_PLANKS 2070 +#define IDS_TUTORIAL_TASK_CRAFT_DESCRIPTION 2071 +#define IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_FURNACE 2072 +#define IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_TABLE 2073 +#define IDS_TUTORIAL_TASK_CRAFT_INGREDIENTS 2074 +#define IDS_TUTORIAL_TASK_CRAFT_INVENTORY 2075 +#define IDS_TUTORIAL_TASK_CRAFT_NAV 2076 +#define IDS_TUTORIAL_TASK_CRAFT_OVERVIEW 2077 +#define IDS_TUTORIAL_TASK_CRAFT_SELECT_CRAFTING_TABLE 2078 +#define IDS_TUTORIAL_TASK_CRAFT_SELECT_STRUCTURES 2079 +#define IDS_TUTORIAL_TASK_CRAFT_SELECT_TOOLS 2080 +#define IDS_TUTORIAL_TASK_CRAFT_SELECT_WOODEN_SHOVEL 2081 +#define IDS_TUTORIAL_TASK_CRAFT_TOOLS_BUILT 2082 +#define IDS_TUTORIAL_TASK_CRAFTING 2083 +#define IDS_TUTORIAL_TASK_CREATE_CHARCOAL 2084 +#define IDS_TUTORIAL_TASK_CREATE_CRAFTING_TABLE 2085 +#define IDS_TUTORIAL_TASK_CREATE_FURNACE 2086 +#define IDS_TUTORIAL_TASK_CREATE_GLASS 2087 +#define IDS_TUTORIAL_TASK_CREATE_PLANKS 2088 +#define IDS_TUTORIAL_TASK_CREATE_STICKS 2089 +#define IDS_TUTORIAL_TASK_CREATE_TORCH 2090 +#define IDS_TUTORIAL_TASK_CREATE_WOODEN_DOOR 2091 +#define IDS_TUTORIAL_TASK_CREATE_WOODEN_HATCHET 2092 +#define IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE 2093 +#define IDS_TUTORIAL_TASK_CREATE_WOODEN_SHOVEL 2094 +#define IDS_TUTORIAL_TASK_CREATIVE_COMPLETE 2095 +#define IDS_TUTORIAL_TASK_CREATIVE_EXIT 2096 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_DROP 2097 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_EXIT 2098 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_INFO 2099 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_MOVE 2100 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_NAV 2101 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_OVERVIEW 2102 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_PICK_UP 2103 +#define IDS_TUTORIAL_TASK_CREATIVE_MODE 2104 +#define IDS_TUTORIAL_TASK_DONKEY_OVERVIEW 2105 +#define IDS_TUTORIAL_TASK_ENCHANTING_BOOKCASES 2106 +#define IDS_TUTORIAL_TASK_ENCHANTING_BOOKS 2107 +#define IDS_TUTORIAL_TASK_ENCHANTING_BOTTLE_O_ENCHANTING 2108 +#define IDS_TUTORIAL_TASK_ENCHANTING_EXPERIENCE 2109 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_BETTER_ENCHANTMENTS 2110 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_COST 2111 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANT 2112 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANTMENTS 2113 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_OVERVIEW 2114 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_START 2115 +#define IDS_TUTORIAL_TASK_ENCHANTING_OVERVIEW 2116 +#define IDS_TUTORIAL_TASK_ENCHANTING_SUMMARY 2117 +#define IDS_TUTORIAL_TASK_ENCHANTING_USE_CHESTS 2118 +#define IDS_TUTORIAL_TASK_ENDERCHEST_FUNCTION 2119 +#define IDS_TUTORIAL_TASK_ENDERCHEST_OVERVIEW 2120 +#define IDS_TUTORIAL_TASK_ENDERCHEST_PLAYERS 2121 +#define IDS_TUTORIAL_TASK_ENDERCHEST_SUMMARY 2122 +#define IDS_TUTORIAL_TASK_FARMING_BONEMEAL 2123 +#define IDS_TUTORIAL_TASK_FARMING_CACTUS 2124 +#define IDS_TUTORIAL_TASK_FARMING_CARROTS_AND_POTATOES 2125 +#define IDS_TUTORIAL_TASK_FARMING_COMPLETE 2126 +#define IDS_TUTORIAL_TASK_FARMING_FARMLAND 2127 +#define IDS_TUTORIAL_TASK_FARMING_MUSHROOM 2128 +#define IDS_TUTORIAL_TASK_FARMING_PUMPKIN_AND_MELON 2129 +#define IDS_TUTORIAL_TASK_FARMING_SEEDS 2130 +#define IDS_TUTORIAL_TASK_FARMING_SUGARCANE 2131 +#define IDS_TUTORIAL_TASK_FARMING_WHEAT 2132 +#define IDS_TUTORIAL_TASK_FIREWORK_CRAFTING 2133 +#define IDS_TUTORIAL_TASK_FIREWORK_CUSTOMISE 2134 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_COLOUR 2135 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_EFFECT 2136 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_FADE 2137 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_SHAPE 2138 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_START 2139 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_CRAFT 2140 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_HEIGHT 2141 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_STARS 2142 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_START 2143 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_OVERVIEW 2144 +#define IDS_TUTORIAL_TASK_FIREWORK_OVERVIEW 2145 +#define IDS_TUTORIAL_TASK_FIREWORK_PURPOSE 2146 +#define IDS_TUTORIAL_TASK_FISHING_CAST 2147 +#define IDS_TUTORIAL_TASK_FISHING_FISH 2148 +#define IDS_TUTORIAL_TASK_FISHING_OVERVIEW 2149 +#define IDS_TUTORIAL_TASK_FISHING_USES 2150 +#define IDS_TUTORIAL_TASK_FLY 2151 +#define IDS_TUTORIAL_TASK_FOOD_BAR_DEPLETE 2152 +#define IDS_TUTORIAL_TASK_FOOD_BAR_EAT_STEAK 2153 +#define IDS_TUTORIAL_TASK_FOOD_BAR_FEED 2154 +#define IDS_TUTORIAL_TASK_FOOD_BAR_HEAL 2155 +#define IDS_TUTORIAL_TASK_FOOD_BAR_OVERVIEW 2156 +#define IDS_TUTORIAL_TASK_FURNACE_CHARCOAL_USES 2157 +#define IDS_TUTORIAL_TASK_FURNACE_CREATE_CHARCOAL 2158 +#define IDS_TUTORIAL_TASK_FURNACE_CREATE_GLASS 2159 +#define IDS_TUTORIAL_TASK_FURNACE_FUELS 2160 +#define IDS_TUTORIAL_TASK_FURNACE_INGREDIENTS 2161 +#define IDS_TUTORIAL_TASK_FURNACE_METHOD 2162 +#define IDS_TUTORIAL_TASK_FURNACE_OVERVIEW 2163 +#define IDS_TUTORIAL_TASK_GOLEM_IRON 2164 +#define IDS_TUTORIAL_TASK_GOLEM_IRON_VILLAGE 2165 +#define IDS_TUTORIAL_TASK_GOLEM_PUMPKIN 2166 +#define IDS_TUTORIAL_TASK_GOLEM_SNOW 2167 +#define IDS_TUTORIAL_TASK_HOPPER_AREA 2168 +#define IDS_TUTORIAL_TASK_HOPPER_CONTAINERS 2169 +#define IDS_TUTORIAL_TASK_HOPPER_MECHANICS 2170 +#define IDS_TUTORIAL_TASK_HOPPER_OUTPUT 2171 +#define IDS_TUTORIAL_TASK_HOPPER_OVERVIEW 2172 +#define IDS_TUTORIAL_TASK_HOPPER_PURPOSE 2173 +#define IDS_TUTORIAL_TASK_HOPPER_REDSTONE 2174 +#define IDS_TUTORIAL_TASK_HORSE_AREA 2175 +#define IDS_TUTORIAL_TASK_HORSE_BREEDING 2176 +#define IDS_TUTORIAL_TASK_HORSE_INTRO 2177 +#define IDS_TUTORIAL_TASK_HORSE_MENU_EQUIPMENT 2178 +#define IDS_TUTORIAL_TASK_HORSE_MENU_LAYOUT 2179 +#define IDS_TUTORIAL_TASK_HORSE_MENU_OVERVIEW 2180 +#define IDS_TUTORIAL_TASK_HORSE_MENU_SADDLEBAGS 2181 +#define IDS_TUTORIAL_TASK_HORSE_OVERVIEW 2182 +#define IDS_TUTORIAL_TASK_HORSE_PURPOSE 2183 +#define IDS_TUTORIAL_TASK_HORSE_RIDE 2184 +#define IDS_TUTORIAL_TASK_HORSE_SADDLEBAGS 2185 +#define IDS_TUTORIAL_TASK_HORSE_SADDLES 2186 +#define IDS_TUTORIAL_TASK_HORSE_TAMING 2187 +#define IDS_TUTORIAL_TASK_HORSE_TAMING2 2188 +#define IDS_TUTORIAL_TASK_INV_DROP 2189 +#define IDS_TUTORIAL_TASK_INV_EXIT 2190 +#define IDS_TUTORIAL_TASK_INV_INFO 2191 +#define IDS_TUTORIAL_TASK_INV_MOVE 2192 +#define IDS_TUTORIAL_TASK_INV_OVERVIEW 2193 +#define IDS_TUTORIAL_TASK_INV_PICK_UP 2194 +#define IDS_TUTORIAL_TASK_INVENTORY 2195 +#define IDS_TUTORIAL_TASK_JUMP 2196 +#define IDS_TUTORIAL_TASK_LOOK 2197 +#define IDS_TUTORIAL_TASK_MINE 2198 +#define IDS_TUTORIAL_TASK_MINE_STONE 2199 +#define IDS_TUTORIAL_TASK_MINECART_OVERVIEW 2200 +#define IDS_TUTORIAL_TASK_MINECART_POWERED_RAILS 2201 +#define IDS_TUTORIAL_TASK_MINECART_PUSHING 2202 +#define IDS_TUTORIAL_TASK_MINECART_RAILS 2203 +#define IDS_TUTORIAL_TASK_MOVE 2204 +#define IDS_TUTORIAL_TASK_MULE_OVERVIEW 2205 +#define IDS_TUTORIAL_TASK_NEARBY_SHELTER 2206 +#define IDS_TUTORIAL_TASK_NETHER 2207 +#define IDS_TUTORIAL_TASK_NETHER_FAST_TRAVEL 2208 +#define IDS_TUTORIAL_TASK_NIGHT_DANGER 2209 +#define IDS_TUTORIAL_TASK_OPEN_CONTAINER 2210 +#define IDS_TUTORIAL_TASK_OPEN_CREATIVE_INVENTORY 2211 +#define IDS_TUTORIAL_TASK_OPEN_WORKBENCH 2212 +#define IDS_TUTORIAL_TASK_OVERVIEW 2213 +#define IDS_TUTORIAL_TASK_PISTONS 2214 +#define IDS_TUTORIAL_TASK_PLACE_AND_OPEN_FURNACE 2215 +#define IDS_TUTORIAL_TASK_PLACE_DOOR 2216 +#define IDS_TUTORIAL_TASK_PLACE_WORKBENCH 2217 +#define IDS_TUTORIAL_TASK_REDSTONE_DUST 2218 +#define IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES 2219 +#define IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES_POSITION 2220 +#define IDS_TUTORIAL_TASK_REDSTONE_REPEATER 2221 +#define IDS_TUTORIAL_TASK_REDSTONE_TRIPWIRE 2222 +#define IDS_TUTORIAL_TASK_SCROLL 2223 +#define IDS_TUTORIAL_TASK_SPRINT 2224 +#define IDS_TUTORIAL_TASK_TRADING_DECREASE_TRADES 2225 +#define IDS_TUTORIAL_TASK_TRADING_INCREASE_TRADES 2226 +#define IDS_TUTORIAL_TASK_TRADING_MENU_DETAILS 2227 +#define IDS_TUTORIAL_TASK_TRADING_MENU_INVENTORY 2228 +#define IDS_TUTORIAL_TASK_TRADING_MENU_OVERVIEW 2229 +#define IDS_TUTORIAL_TASK_TRADING_MENU_START 2230 +#define IDS_TUTORIAL_TASK_TRADING_MENU_TRADE 2231 +#define IDS_TUTORIAL_TASK_TRADING_MENU_UNAVAILABLE 2232 +#define IDS_TUTORIAL_TASK_TRADING_OVERVIEW 2233 +#define IDS_TUTORIAL_TASK_TRADING_SUMMARY 2234 +#define IDS_TUTORIAL_TASK_TRADING_TRADES 2235 +#define IDS_TUTORIAL_TASK_TRADING_USE_CHESTS 2236 +#define IDS_TUTORIAL_TASK_TRY_IT 2237 +#define IDS_TUTORIAL_TASK_USE 2238 +#define IDS_TUTORIAL_TASK_USE_PORTAL 2239 +#define IDS_TUTORIALSAVENAME 2240 +#define IDS_UNHIDE_MASHUP_WORLDS 2241 +#define IDS_UNLOCK_ACCEPT_INVITE 2242 +#define IDS_UNLOCK_ACHIEVEMENT_TEXT 2243 +#define IDS_UNLOCK_DLC_SKIN 2244 +#define IDS_UNLOCK_DLC_TEXTUREPACK_TEXT 2245 +#define IDS_UNLOCK_DLC_TEXTUREPACK_TITLE 2246 +#define IDS_UNLOCK_DLC_TITLE 2247 +#define IDS_UNLOCK_FULL_GAME 2248 +#define IDS_UNLOCK_GUEST_TEXT 2249 +#define IDS_UNLOCK_KICK_PLAYER 2250 +#define IDS_UNLOCK_KICK_PLAYER_TITLE 2251 +#define IDS_UNLOCK_THEME_TEXT 2252 +#define IDS_UNLOCK_TITLE 2253 +#define IDS_UNLOCK_TOSAVE_TEXT 2254 +#define IDS_USER_INTERFACE 2255 +#define IDS_USING_TRIAL_TEXUREPACK_WARNING 2256 +#define IDS_VIEW_BOBBING 2257 +#define IDS_VILLAGER 2258 +#define IDS_VILLAGER_BUTCHER 2259 +#define IDS_VILLAGER_FARMER 2260 +#define IDS_VILLAGER_LIBRARIAN 2261 +#define IDS_VILLAGER_OFFERS_ITEM 2262 +#define IDS_VILLAGER_PRIEST 2263 +#define IDS_VILLAGER_SMITH 2264 +#define IDS_WARNING_ARCADE_TEXT 2265 +#define IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT 2266 +#define IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE 2267 +#define IDS_WIN_TEXT 2268 +#define IDS_WIN_TEXT_PART_2 2269 +#define IDS_WIN_TEXT_PART_3 2270 +#define IDS_WITCH 2271 +#define IDS_WITHER 2272 +#define IDS_WOLF 2273 +#define IDS_WORLD_NAME 2274 +#define IDS_WORLD_OPTIONS 2275 +#define IDS_YES 2276 +#define IDS_YOU_DIED 2277 +#define IDS_YOU_HAVE 2278 +#define IDS_ZOMBIE 2279 +#define IDS_ZOMBIE_HORSE 2280 diff --git a/Minecraft.Client/PaintingRenderer.cpp b/Minecraft.Client/PaintingRenderer.cpp index 4238f759..f5e09dbd 100644 --- a/Minecraft.Client/PaintingRenderer.cpp +++ b/Minecraft.Client/PaintingRenderer.cpp @@ -6,6 +6,8 @@ #include "..\Minecraft.World\Random.h" #include "..\Minecraft.World\Mth.h" +ResourceLocation PaintingRenderer::PAINTING_LOCATION(TN_ART_KZ); + PaintingRenderer::PaintingRenderer() { random = new Random(); @@ -22,7 +24,7 @@ void PaintingRenderer::render(shared_ptr _painting, double x, double y, glTranslatef((float)x, (float)y, (float)z); glRotatef(rot, 0, 1, 0); glEnable(GL_RESCALE_NORMAL); - bindTexture(TN_ART_KZ); // 4J was L"/art/kz.png" + bindTexture(painting); // 4J was L"/art/kz.png" Painting::Motive *motive = painting->motive; @@ -35,82 +37,85 @@ void PaintingRenderer::render(shared_ptr _painting, double x, double y, void PaintingRenderer::renderPainting(shared_ptr painting, int w, int h, int uo, int vo) { - float xx0 = -w / 2.0f; - float yy0 = -h / 2.0f; - - float z0 = -0.5f; - float z1 = +0.5f; - - for (int xs = 0; xs < w / 16; xs++) - for (int ys = 0; ys < h / 16; ys++) - { - float x0 = xx0 + (xs + 1) * 16; - float x1 = xx0 + (xs) * 16; - float y0 = yy0 + (ys + 1) * 16; - float y1 = yy0 + (ys) * 16; - - setBrightness(painting, (x0 + x1) / 2, (y0 + y1) / 2); - - float fu0 = (uo + w - (xs) * 16) / 256.0f; - float fu1 = (uo + w - (xs + 1) * 16) / 256.0f; - float fv0 = (vo + h - (ys) * 16) / 256.0f; - float fv1 = (vo + h - (ys + 1) * 16) / 256.0f; - - float bu0 = (12 * 16) / 256.0f; - float bu1 = (12 * 16 + 16) / 256.0f; - float bv0 = (0) / 256.0f; - float bv1 = (0 + 16) / 256.0f; - - float uu0 = (12 * 16) / 256.0f; - float uu1 = (12 * 16 + 16) / 256.0f; - float uv0 = (0.5f) / 256.0f; - float uv1 = (0.5f) / 256.0f; - - float su0 = (12 * 16 + 0.5f) / 256.0f; - float su1 = (12 * 16 + 0.5f) / 256.0f; - float sv0 = (0) / 256.0f; - float sv1 = (0 + 16) / 256.0f; - - Tesselator *t = Tesselator::getInstance(); - t->begin(); - t->normal(0, 0, -1); - t->vertexUV((float)(x0), (float)( y1), (float)( z0), (float)( fu1), (float)( fv0)); - t->vertexUV((float)(x1), (float)( y1), (float)( z0), (float)( fu0), (float)( fv0)); - t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( fu0), (float)( fv1)); - t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( fu1), (float)( fv1)); - - t->normal(0, 0, 1); - t->vertexUV((float)(x0), (float)( y0), (float)( z1), (float)( bu0), (float)( bv0)); - t->vertexUV((float)(x1), (float)( y0), (float)( z1), (float)( bu1), (float)( bv0)); - t->vertexUV((float)(x1), (float)( y1), (float)( z1), (float)( bu1), (float)( bv1)); - t->vertexUV((float)(x0), (float)( y1), (float)( z1), (float)( bu0), (float)( bv1)); - - t->normal(0, 1, 0); - t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( uu0), (float)( uv0)); - t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( uu1), (float)( uv0)); - t->vertexUV((float)(x1), (float)( y0), (float)( z1), (float)( uu1), (float)( uv1)); - t->vertexUV((float)(x0), (float)( y0), (float)( z1), (float)( uu0), (float)( uv1)); - - t->normal(0, -1, 0); - t->vertexUV((float)(x0), (float)( y1), (float)( z1), (float)( uu0), (float)( uv0)); - t->vertexUV((float)(x1), (float)( y1), (float)( z1), (float)( uu1), (float)( uv0)); - t->vertexUV((float)(x1), (float)( y1), (float)( z0), (float)( uu1), (float)( uv1)); - t->vertexUV((float)(x0), (float)( y1), (float)( z0), (float)( uu0), (float)( uv1)); - - t->normal(-1, 0, 0); - t->vertexUV((float)(x0), (float)( y0), (float)( z1), (float)( su1), (float)( sv0)); - t->vertexUV((float)(x0), (float)( y1), (float)( z1), (float)( su1), (float)( sv1)); - t->vertexUV((float)(x0), (float)( y1), (float)( z0), (float)( su0), (float)( sv1)); - t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( su0), (float)( sv0)); - - t->normal(1, 0, 0); - t->vertexUV((float)(x1), (float)( y0), (float)( z0), (float)( su1), (float)( sv0)); - t->vertexUV((float)(x1), (float)( y1), (float)( z0), (float)( su1), (float)( sv1)); - t->vertexUV((float)(x1), (float)( y1), (float)( z1), (float)( su0), (float)( sv1)); - t->vertexUV((float)(x1), (float)( y0), (float)( z1), (float)( su0), (float)( sv0)); - t->end(); - } - + float xx0 = -w / 2.0f; + float yy0 = -h / 2.0f; + + float edgeWidth = 0.5f; + + // Back + float bu0 = (12 * 16) / 256.0f; + float bu1 = (12 * 16 + 16) / 256.0f; + float bv0 = (0) / 256.0f; + float bv1 = (0 + 16) / 256.0f; + + // Border + float uu0 = (12 * 16) / 256.0f; + float uu1 = (12 * 16 + 16) / 256.0f; + float uv0 = (0.5f) / 256.0f; + float uv1 = (0.5f) / 256.0f; + + // Border + float su0 = (12 * 16 + 0.5f) / 256.0f; + float su1 = (12 * 16 + 0.5f) / 256.0f; + float sv0 = (0) / 256.0f; + float sv1 = (0 + 16) / 256.0f; + + for (int xs = 0; xs < w / 16; xs++) + { + for (int ys = 0; ys < h / 16; ys++) { + float x0 = xx0 + (xs + 1) * 16; + float x1 = xx0 + (xs) * 16; + float y0 = yy0 + (ys + 1) * 16; + float y1 = yy0 + (ys) * 16; + + setBrightness(painting, (x0 + x1) / 2, (y0 + y1) / 2); + + // Painting + float fu0 = (uo + w - (xs) * 16) / 256.0f; + float fu1 = (uo + w - (xs + 1) * 16) / 256.0f; + float fv0 = (vo + h - (ys) * 16) / 256.0f; + float fv1 = (vo + h - (ys + 1) * 16) / 256.0f; + + Tesselator *t = Tesselator::getInstance(); + t->begin(); + t->normal(0, 0, -1); + t->vertexUV(x0, y1, -edgeWidth, fu1, fv0); + t->vertexUV(x1, y1, -edgeWidth, fu0, fv0); + t->vertexUV(x1, y0, -edgeWidth, fu0, fv1); + t->vertexUV(x0, y0, -edgeWidth, fu1, fv1); + + t->normal(0, 0, 1); + t->vertexUV(x0, y0, edgeWidth, bu0, bv0); + t->vertexUV(x1, y0, edgeWidth, bu1, bv0); + t->vertexUV(x1, y1, edgeWidth, bu1, bv1); + t->vertexUV(x0, y1, edgeWidth, bu0, bv1); + + t->normal(0, 1, 0); + t->vertexUV(x0, y0, -edgeWidth, uu0, uv0); + t->vertexUV(x1, y0, -edgeWidth, uu1, uv0); + t->vertexUV(x1, y0, edgeWidth, uu1, uv1); + t->vertexUV(x0, y0, edgeWidth, uu0, uv1); + + t->normal(0, -1, 0); + t->vertexUV(x0, y1, edgeWidth, uu0, uv0); + t->vertexUV(x1, y1, edgeWidth, uu1, uv0); + t->vertexUV(x1, y1, -edgeWidth, uu1, uv1); + t->vertexUV(x0, y1, -edgeWidth, uu0, uv1); + + t->normal(-1, 0, 0); + t->vertexUV(x0, y0, edgeWidth, su1, sv0); + t->vertexUV(x0, y1, edgeWidth, su1, sv1); + t->vertexUV(x0, y1, -edgeWidth, su0, sv1); + t->vertexUV(x0, y0, -edgeWidth, su0, sv0); + + t->normal(1, 0, 0); + t->vertexUV(x1, y0, -edgeWidth, su1, sv0); + t->vertexUV(x1, y1, -edgeWidth, su1, sv1); + t->vertexUV(x1, y1, edgeWidth, su0, sv1); + t->vertexUV(x1, y0, edgeWidth, su0, sv0); + t->end(); + } + } } void PaintingRenderer::setBrightness(shared_ptr painting, float ss, float ya) @@ -128,4 +133,9 @@ void PaintingRenderer::setBrightness(shared_ptr painting, float ss, fl int v = col / 65536; glMultiTexCoord2f(0, u, v); glColor3f(1, 1, 1); +} + +ResourceLocation *PaintingRenderer::getTextureLocation(shared_ptr mob) +{ + return &PAINTING_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/PaintingRenderer.h b/Minecraft.Client/PaintingRenderer.h index a750e128..42dacd01 100644 --- a/Minecraft.Client/PaintingRenderer.h +++ b/Minecraft.Client/PaintingRenderer.h @@ -8,6 +8,7 @@ class PaintingRenderer : public EntityRenderer { private: Random *random; + static ResourceLocation PAINTING_LOCATION; public: PaintingRenderer(); // 4J -added @@ -16,4 +17,5 @@ public: private: void renderPainting(shared_ptr painting, int w, int h, int uo, int vo); void setBrightness(shared_ptr painting, float ss, float ya); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; diff --git a/Minecraft.Client/Particle.cpp b/Minecraft.Client/Particle.cpp index 90ef93bc..1091a26a 100644 --- a/Minecraft.Client/Particle.cpp +++ b/Minecraft.Client/Particle.cpp @@ -85,6 +85,15 @@ void Particle::setColor(float r, float g, float b) void Particle::setAlpha(float alpha) { + // 4J - brought forward from Java 1.8 + if (this->alpha == 1.0f && alpha < 1.0f) + { + Minecraft::GetInstance()->particleEngine->markTranslucent(dynamic_pointer_cast(shared_from_this())); + } + else if (this->alpha < 1.0f && alpha == 1.0f) + { + Minecraft::GetInstance()->particleEngine->markOpaque(dynamic_pointer_cast(shared_from_this())); + } this->alpha = alpha; } diff --git a/Minecraft.Client/ParticleEngine.cpp b/Minecraft.Client/ParticleEngine.cpp index 3a34253a..a6f65fa6 100644 --- a/Minecraft.Client/ParticleEngine.cpp +++ b/Minecraft.Client/ParticleEngine.cpp @@ -2,8 +2,10 @@ #include "ParticleEngine.h" #include "Particle.h" #include "Textures.h" +#include "TextureAtlas.h" #include "Tesselator.h" #include "TerrainParticle.h" +#include "ResourceLocation.h" #include "Camera.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" @@ -11,6 +13,8 @@ #include "..\Minecraft.World\StringHelpers.h" #include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +ResourceLocation ParticleEngine::PARTICLES_LOCATION = ResourceLocation(TN_PARTICLES); + ParticleEngine::ParticleEngine(Level *level, Textures *textures) { // if (level != NULL) // 4J - removed - we want level to be initialised to *something* @@ -31,8 +35,26 @@ void ParticleEngine::add(shared_ptr p) { int t = p->getParticleTexture(); int l = p->level->dimension->id == 0 ? 0 : ( p->level->dimension->id == -1 ? 1 : 2); - if ( (t != DRAGON_BREATH_TEXTURE && particles[l][t].size() >= MAX_PARTICLES_PER_LAYER) || particles[l][t].size() >= MAX_DRAGON_BREATH_PARTICLES) particles[l][t].pop_front();//particles[l][t].erase(particles[l][t].begin()); - particles[l][t].push_back(p); + int maxParticles; + switch(p->GetType()) + { + case eTYPE_DRAGONBREATHPARTICLE: + maxParticles = MAX_DRAGON_BREATH_PARTICLES; + break; + case eType_FIREWORKSSPARKPARTICLE: + maxParticles = MAX_FIREWORK_SPARK_PARTICLES; + break; + default: + maxParticles = MAX_PARTICLES_PER_LAYER; + break; + } + int list = p->getAlpha() != 1.0f ? TRANSLUCENT_LIST : OPAQUE_LIST; // 4J - Brought forward from Java 1.8 + + if( particles[l][t][list].size() >= maxParticles) + { + particles[l][t][list].pop_front(); + } + particles[l][t][list].push_back(p); } void ParticleEngine::tick() @@ -41,22 +63,25 @@ void ParticleEngine::tick() { for (int tt = 0; tt < TEXTURE_COUNT; tt++) { - for (unsigned int i = 0; i < particles[l][tt].size(); i++) + for( int list = 0; list < LIST_COUNT; list++ ) // 4J - Brought forward from Java 1.8 { - shared_ptr p = particles[l][tt][i]; - p->tick(); - if (p->removed) + for (unsigned int i = 0; i < particles[l][tt][list].size(); i++) { - particles[l][tt][i] = particles[l][tt].back(); - particles[l][tt].pop_back(); - i--; + shared_ptr p = particles[l][tt][list][i]; + p->tick(); + if (p->removed) + { + particles[l][tt][list][i] = particles[l][tt][list].back(); + particles[l][tt][list].pop_back(); + i--; + } } } } } } -void ParticleEngine::render(shared_ptr player, float a) +void ParticleEngine::render(shared_ptr player, float a, int list) { // 4J - change brought forward from 1.2.3 float xa = Camera::xa; @@ -70,55 +95,61 @@ void ParticleEngine::render(shared_ptr player, float a) Particle::yOff = (player->yOld + (player->y - player->yOld) * a); Particle::zOff = (player->zOld + (player->z - player->zOld) * a); int l = level->dimension->id == 0 ? 0 : ( level->dimension->id == -1 ? 1 : 2 ); - for (int tt = 0; tt < TEXTURE_COUNT; tt++) + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glAlphaFunc(GL_GREATER, 1.0f / 255.0f); + + for (int tt = 0; tt < TEXTURE_COUNT; tt++) { if(tt == ENTITY_PARTICLE_TEXTURE) continue; - if (particles[l][tt].empty()) continue; - - MemSect(31); - if (tt == MISC_TEXTURE || tt == DRAGON_BREATH_TEXTURE) textures->bindTexture(TN_PARTICLES); // 4J was L"/particles.png" - if (tt == TERRAIN_TEXTURE) textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - if (tt == ITEM_TEXTURE) textures->bindTexture(TN_GUI_ITEMS); // 4J was L"/gui/items.png" - MemSect(0); - Tesselator *t = Tesselator::getInstance(); - glColor4f(1.0f, 1.0f, 1.0f, 1); -#if 0 - // Note that these changes were brought in from java (1.5ish), but as with the java version, break rendering of the particles - // next to water - removing for now - glDepthMask(false); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glAlphaFunc(GL_GREATER, 1.0f / 255.0f); -#endif - t->begin(); - for (unsigned int i = 0; i < particles[l][tt].size(); i++) + if (!particles[l][tt][list].empty()) { - if(t->hasMaxVertices()) + switch (list) { - t->end(); - t->begin(); - } - shared_ptr p = particles[l][tt][i]; + case TRANSLUCENT_LIST: + glDepthMask(false); + break; + case OPAQUE_LIST: + glDepthMask(true); + break; + } + + MemSect(31); + if (tt == MISC_TEXTURE || tt == DRAGON_BREATH_TEXTURE) textures->bindTexture(&PARTICLES_LOCATION); + if (tt == TERRAIN_TEXTURE) textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); + if (tt == ITEM_TEXTURE) textures->bindTexture(&TextureAtlas::LOCATION_ITEMS); + MemSect(0); + Tesselator *t = Tesselator::getInstance(); + glColor4f(1.0f, 1.0f, 1.0f, 1); - if (SharedConstants::TEXTURE_LIGHTING) // 4J - change brought forward from 1.8.2 + t->begin(); + for (unsigned int i = 0; i < particles[l][tt][list].size(); i++) { - t->tex2(p->getLightColor(a)); - } - p->render(t, a, xa, ya, za, xa2, za2); - } - t->end(); -#if 0 - // See comment in previous removed section - glDisable(GL_BLEND); - glDepthMask(true); - glAlphaFunc(GL_GREATER, .1f); -#endif + if(t->hasMaxVertices()) + { + t->end(); + t->begin(); + } + shared_ptr p = particles[l][tt][list][i]; + + if (SharedConstants::TEXTURE_LIGHTING) // 4J - change brought forward from 1.8.2 + { + t->tex2(p->getLightColor(a)); + } + p->render(t, a, xa, ya, za, xa2, za2); + } + t->end(); + } } + glDisable(GL_BLEND); + glDepthMask(true); + glAlphaFunc(GL_GREATER, .1f); } -void ParticleEngine::renderLit(shared_ptr player, float a) +void ParticleEngine::renderLit(shared_ptr player, float a, int list) { // 4J - added. We call this before ParticleEngine::render in the general render per player, so if we // don't set this here then the offsets will be from the previous player - a single frame lag for the @@ -137,19 +168,21 @@ void ParticleEngine::renderLit(shared_ptr player, float a) int l = level->dimension->id == 0 ? 0 : ( level->dimension->id == -1 ? 1 : 2 ); int tt = ENTITY_PARTICLE_TEXTURE; - if (particles[l][tt].empty()) return; - Tesselator *t = Tesselator::getInstance(); - for (unsigned int i = 0; i < particles[l][tt].size(); i++) + if( !particles[l][tt][list].empty() ) { - shared_ptr p = particles[l][tt][i]; - - if (SharedConstants::TEXTURE_LIGHTING) // 4J - change brought forward from 1.8.2 + Tesselator *t = Tesselator::getInstance(); + for (unsigned int i = 0; i < particles[l][tt][list].size(); i++) { - t->tex2(p->getLightColor(a)); - } - p->render(t, a, xa, ya, za, xa2, za2); - } + shared_ptr p = particles[l][tt][list][i]; + + if (SharedConstants::TEXTURE_LIGHTING) // 4J - change brought forward from 1.8.2 + { + t->tex2(p->getLightColor(a)); + } + p->render(t, a, xa, ya, za, xa2, za2); + } + } } void ParticleEngine::setLevel(Level *level) @@ -162,7 +195,10 @@ void ParticleEngine::setLevel(Level *level) { for (int tt = 0; tt < TEXTURE_COUNT; tt++) { - particles[l][tt].clear(); + for( int list = 0; list < LIST_COUNT; list++ ) + { + particles[l][tt][list].clear(); + } } } } @@ -205,8 +241,41 @@ void ParticleEngine::crack(int x, int y, int z, int face) } +void ParticleEngine::markTranslucent(shared_ptr particle) +{ + moveParticleInList(particle, OPAQUE_LIST, TRANSLUCENT_LIST); +} + +void ParticleEngine::markOpaque(shared_ptr particle) +{ + moveParticleInList(particle, TRANSLUCENT_LIST, OPAQUE_LIST); +} + +void ParticleEngine::moveParticleInList(shared_ptr particle, int source, int destination) +{ + int l = particle->level->dimension->id == 0 ? 0 : ( particle->level->dimension->id == -1 ? 1 : 2); + for (int tt = 0; tt < TEXTURE_COUNT; tt++) + { + AUTO_VAR(it, find(particles[l][tt][source].begin(), particles[l][tt][source].end(), particle) ); + if(it != particles[l][tt][source].end() ) + { + (*it) = particles[l][tt][source].back(); + particles[l][tt][source].pop_back(); + particles[l][tt][destination].push_back(particle); + } + } +} + wstring ParticleEngine::countParticles() { int l = level->dimension->id == 0 ? 0 : (level->dimension->id == -1 ? 1 : 2 ); - return _toString((int)(particles[l][0].size() + particles[l][1].size() + particles[l][2].size())); + int total = 0; + for( int tt = 0; tt < TEXTURE_COUNT; tt++ ) + { + for( int list = 0; list < LIST_COUNT; list++ ) + { + total += particles[l][tt][list].size(); + } + } + return _toString(total); } diff --git a/Minecraft.Client/ParticleEngine.h b/Minecraft.Client/ParticleEngine.h index 09e3685b..2a9aa058 100644 --- a/Minecraft.Client/ParticleEngine.h +++ b/Minecraft.Client/ParticleEngine.h @@ -11,8 +11,10 @@ using namespace std; class ParticleEngine { private: + static ResourceLocation PARTICLES_LOCATION; static const int MAX_PARTICLES_PER_LAYER = 200; // 4J - reduced from 4000 static const int MAX_DRAGON_BREATH_PARTICLES = 1000; + static const int MAX_FIREWORK_SPARK_PARTICLES = 2000; public: static const int MISC_TEXTURE = 0; @@ -20,13 +22,17 @@ public: static const int ITEM_TEXTURE = 2; static const int ENTITY_PARTICLE_TEXTURE = 3; static const int DRAGON_BREATH_TEXTURE = 4; // 4J Added - static const int TEXTURE_COUNT = 5; + // Brought forward from Java 1.8 + static const int TRANSLUCENT_LIST = 0; + static const int OPAQUE_LIST = 1; + static const int LIST_COUNT = 2; + protected: Level *level; private: - deque > particles[3][TEXTURE_COUNT]; // 4J made two arrays to cope with simultaneous two dimensions + deque > particles[3][TEXTURE_COUNT][LIST_COUNT]; // 4J made three arrays to cope with simultaneous two dimensions Textures *textures; Random *random; @@ -35,10 +41,16 @@ public: ~ParticleEngine(); void add(shared_ptr p); void tick(); - void render(shared_ptr player, float a); - void renderLit(shared_ptr player, float a); + void render(shared_ptr player, float a, int list); + void renderLit(shared_ptr player, float a, int list); void setLevel(Level *level); void destroy(int x, int y, int z, int tid, int data); void crack(int x, int y, int z, int face); - wstring countParticles(); + + // 4J - Brought forward from Java 1.8 + void markTranslucent(shared_ptr particle); + void markOpaque(shared_ptr particle); + void moveParticleInList(shared_ptr particle, int source, int destination); + + wstring countParticles(); }; \ No newline at end of file diff --git a/Minecraft.Client/PendingConnection.cpp b/Minecraft.Client/PendingConnection.cpp index 841863b6..e9b37fc6 100644 --- a/Minecraft.Client/PendingConnection.cpp +++ b/Minecraft.Client/PendingConnection.cpp @@ -24,14 +24,14 @@ PendingConnection::PendingConnection(MinecraftServer *server, Socket *socket, co { // 4J - added initialisers done = false; - _tick = 0; - name = L""; - acceptedLogin = nullptr; + _tick = 0; + name = L""; + acceptedLogin = nullptr; loginKey = L""; - this->server = server; - connection = new Connection(socket, id, this); - connection->fakeLag = FAKE_LAG; + this->server = server; + connection = new Connection(socket, id, this); + connection->fakeLag = FAKE_LAG; } PendingConnection::~PendingConnection() @@ -41,50 +41,50 @@ PendingConnection::~PendingConnection() void PendingConnection::tick() { - if (acceptedLogin != NULL) + if (acceptedLogin != NULL) { - this->handleAcceptedLogin(acceptedLogin); - acceptedLogin = nullptr; - } - if (_tick++ == MAX_TICKS_BEFORE_LOGIN) + this->handleAcceptedLogin(acceptedLogin); + acceptedLogin = nullptr; + } + if (_tick++ == MAX_TICKS_BEFORE_LOGIN) { - disconnect(DisconnectPacket::eDisconnect_LoginTooLong); - } + disconnect(DisconnectPacket::eDisconnect_LoginTooLong); + } else { - connection->tick(); - } + connection->tick(); + } } void PendingConnection::disconnect(DisconnectPacket::eDisconnectReason reason) { - // try { // 4J - removed try/catch -// logger.info("Disconnecting " + getName() + ": " + reason); - app.DebugPrintf("Pending connection disconnect: %d\n", reason ); - connection->send( shared_ptr( new DisconnectPacket(reason) ) ); - connection->sendAndQuit(); - done = true; -// } catch (Exception e) { -// e.printStackTrace(); -// } + // try { // 4J - removed try/catch + // logger.info("Disconnecting " + getName() + ": " + reason); + app.DebugPrintf("Pending connection disconnect: %d\n", reason ); + connection->send( shared_ptr( new DisconnectPacket(reason) ) ); + connection->sendAndQuit(); + done = true; + // } catch (Exception e) { + // e.printStackTrace(); + // } } void PendingConnection::handlePreLogin(shared_ptr packet) { - if (packet->m_netcodeVersion != MINECRAFT_NET_VERSION) + if (packet->m_netcodeVersion != MINECRAFT_NET_VERSION) { app.DebugPrintf("Netcode version is %d not equal to %d\n", packet->m_netcodeVersion, MINECRAFT_NET_VERSION); - if (packet->m_netcodeVersion > MINECRAFT_NET_VERSION) + if (packet->m_netcodeVersion > MINECRAFT_NET_VERSION) { - disconnect(DisconnectPacket::eDisconnect_OutdatedServer); - } + disconnect(DisconnectPacket::eDisconnect_OutdatedServer); + } else { - disconnect(DisconnectPacket::eDisconnect_OutdatedClient); - } - return; - } -// printf("Server: handlePreLogin\n"); + disconnect(DisconnectPacket::eDisconnect_OutdatedClient); + } + return; + } + // printf("Server: handlePreLogin\n"); name = packet->loginKey; // 4J Stu - Change from the login packet as we know better on client end during the pre-login packet sendPreLoginResponse(); } @@ -106,7 +106,7 @@ void PendingConnection::sendPreLoginResponse() shared_ptr player = *it; // If the offline Xuid is invalid but the online one is not then that's guest which we should ignore // If the online Xuid is invalid but the offline one is not then we are definitely an offline game so dont care about UGC - + // PADDY - this is failing when a local player with chat restrictions joins an online game if( player != NULL && player->connection->m_offlineXUID != INVALID_XUID && player->connection->m_onlineXUID != INVALID_XUID ) @@ -125,37 +125,37 @@ void PendingConnection::sendPreLoginResponse() } #if 0 - if (false)// server->onlineMode) // 4J - removed + if (false)// server->onlineMode) // 4J - removed { - loginKey = L"TOIMPLEMENT"; // 4J - todo Long.toHexString(random.nextLong()); - connection->send( shared_ptr( new PreLoginPacket(loginKey, ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion, szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex) ) ); - } + loginKey = L"TOIMPLEMENT"; // 4J - todo Long.toHexString(random.nextLong()); + connection->send( shared_ptr( new PreLoginPacket(loginKey, ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion, szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex) ) ); + } else #endif { - connection->send( shared_ptr( new PreLoginPacket(L"-", ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion,szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex, server->m_texturePackId) ) ); - } + connection->send( shared_ptr( new PreLoginPacket(L"-", ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion,szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex, server->m_texturePackId) ) ); + } } void PendingConnection::handleLogin(shared_ptr packet) { -// printf("Server: handleLogin\n"); - //name = packet->userName; - if (packet->clientVersion != SharedConstants::NETWORK_PROTOCOL_VERSION) + // printf("Server: handleLogin\n"); + //name = packet->userName; + if (packet->clientVersion != SharedConstants::NETWORK_PROTOCOL_VERSION) { app.DebugPrintf("Client version is %d not equal to %d\n", packet->clientVersion, SharedConstants::NETWORK_PROTOCOL_VERSION); - if (packet->clientVersion > SharedConstants::NETWORK_PROTOCOL_VERSION) + if (packet->clientVersion > SharedConstants::NETWORK_PROTOCOL_VERSION) { - disconnect(DisconnectPacket::eDisconnect_OutdatedServer); - } + disconnect(DisconnectPacket::eDisconnect_OutdatedServer); + } else { - disconnect(DisconnectPacket::eDisconnect_OutdatedClient); - } - return; - } + disconnect(DisconnectPacket::eDisconnect_OutdatedClient); + } + return; + } - //if (true)// 4J removed !server->onlineMode) + //if (true)// 4J removed !server->onlineMode) bool sentDisconnect = false; if( sentDisconnect ) @@ -168,33 +168,33 @@ void PendingConnection::handleLogin(shared_ptr packet) } else { - handleAcceptedLogin(packet); - } + handleAcceptedLogin(packet); + } //else { //4J - removed #if 0 - new Thread() { - public void run() { - try { - String key = loginKey; - URL url = new URL("http://www.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(packet.userName, "UTF-8") + "&serverId=" + URLEncoder.encode(key, "UTF-8")); - BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); - String msg = br.readLine(); - br.close(); - if (msg.equals("YES")) { - acceptedLogin = packet; - } else { - disconnect("Failed to verify username!"); - } - } catch (Exception e) { - disconnect("Failed to verify username! [internal error " + e + "]"); - e.printStackTrace(); - } - } - }.start(); + new Thread() { + public void run() { + try { + String key = loginKey; + URL url = new URL("http://www.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(packet.userName, "UTF-8") + "&serverId=" + URLEncoder.encode(key, "UTF-8")); + BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); + String msg = br.readLine(); + br.close(); + if (msg.equals("YES")) { + acceptedLogin = packet; + } else { + disconnect("Failed to verify username!"); + } + } catch (Exception e) { + disconnect("Failed to verify username! [internal error " + e + "]"); + e.printStackTrace(); + } + } + }.start(); #endif - } + } } @@ -211,20 +211,20 @@ void PendingConnection::handleAcceptedLogin(shared_ptr packet) PlayerUID playerXuid = packet->m_offlineXuid; if(playerXuid == INVALID_XUID) playerXuid = packet->m_onlineXuid; - shared_ptr playerEntity = server->getPlayers()->getPlayerForLogin(this, name, playerXuid,packet->m_onlineXuid); - if (playerEntity != NULL) + shared_ptr playerEntity = server->getPlayers()->getPlayerForLogin(this, name, playerXuid,packet->m_onlineXuid); + if (playerEntity != NULL) { - server->getPlayers()->placeNewPlayer(connection, playerEntity, packet); + server->getPlayers()->placeNewPlayer(connection, playerEntity, packet); connection = NULL; // We've moved responsibility for this over to the new PlayerConnection, NULL so we don't delete our reference to it here in our dtor - } - done = true; + } + done = true; } void PendingConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) { -// logger.info(getName() + " lost connection"); - done = true; + // logger.info(getName() + " lost connection"); + done = true; } void PendingConnection::handleGetInfo(shared_ptr packet) @@ -259,11 +259,16 @@ void PendingConnection::send(shared_ptr packet) wstring PendingConnection::getName() { return L"Unimplemented"; -// if (name != null) return name + " [" + connection.getRemoteAddress().toString() + "]"; -// return connection.getRemoteAddress().toString(); + // if (name != null) return name + " [" + connection.getRemoteAddress().toString() + "]"; + // return connection.getRemoteAddress().toString(); } bool PendingConnection::isServerPacketListener() { return true; +} + +bool PendingConnection::isDisconnected() +{ + return done; } \ No newline at end of file diff --git a/Minecraft.Client/PendingConnection.h b/Minecraft.Client/PendingConnection.h index 02d706f9..e8a493b0 100644 --- a/Minecraft.Client/PendingConnection.h +++ b/Minecraft.Client/PendingConnection.h @@ -11,10 +11,10 @@ class PendingConnection : public PacketListener { private: static const int FAKE_LAG = 0; - static const int MAX_TICKS_BEFORE_LOGIN = 20 * 30; + static const int MAX_TICKS_BEFORE_LOGIN = 20 * 30; -// public static Logger logger = Logger.getLogger("Minecraft"); - static Random *random; + // public static Logger logger = Logger.getLogger("Minecraft"); + static Random *random; public: Connection *connection; @@ -22,26 +22,27 @@ public: bool done; private: MinecraftServer *server; - int _tick; - wstring name; - shared_ptr acceptedLogin; - wstring loginKey; + int _tick; + wstring name; + shared_ptr acceptedLogin; + wstring loginKey; public: - PendingConnection(MinecraftServer *server, Socket *socket, const wstring& id); + PendingConnection(MinecraftServer *server, Socket *socket, const wstring& id); ~PendingConnection(); - void tick(); - void disconnect(DisconnectPacket::eDisconnectReason reason); - virtual void handlePreLogin(shared_ptr packet); - virtual void handleLogin(shared_ptr packet); - virtual void handleAcceptedLogin(shared_ptr packet); - virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); + void tick(); + void disconnect(DisconnectPacket::eDisconnectReason reason); + virtual void handlePreLogin(shared_ptr packet); + virtual void handleLogin(shared_ptr packet); + virtual void handleAcceptedLogin(shared_ptr packet); + virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); virtual void handleGetInfo(shared_ptr packet); virtual void handleKeepAlive(shared_ptr packet); - virtual void onUnhandledPacket(shared_ptr packet); - void send(shared_ptr packet); - wstring getName(); - virtual bool isServerPacketListener(); + virtual void onUnhandledPacket(shared_ptr packet); + void send(shared_ptr packet); + wstring getName(); + virtual bool isServerPacketListener(); + virtual bool isDisconnected(); private: void sendPreLoginResponse(); diff --git a/Minecraft.Client/PigRenderer.cpp b/Minecraft.Client/PigRenderer.cpp index eb78cd20..7425889d 100644 --- a/Minecraft.Client/PigRenderer.cpp +++ b/Minecraft.Client/PigRenderer.cpp @@ -2,23 +2,37 @@ #include "PigRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +ResourceLocation PigRenderer::PIG_LOCATION = ResourceLocation(TN_MOB_PIG); +ResourceLocation PigRenderer::SADDLE_LOCATION = ResourceLocation(TN_MOB_SADDLE); + PigRenderer::PigRenderer(Model *model, Model *armor, float shadow) : MobRenderer(model,shadow) { setArmor(armor); } -int PigRenderer::prepareArmor(shared_ptr _pig, int layer, float a) +int PigRenderer::prepareArmor(shared_ptr _pig, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr pig = dynamic_pointer_cast(_pig); - MemSect(31); - bindTexture(TN_MOB_SADDLE); // 4J was L"/mob/saddle.png" - MemSect(0); - return (layer == 0 && pig->hasSaddle()) ? 1 : -1; + if (layer == 0 && pig->hasSaddle()) + { + MemSect(31); + bindTexture(&SADDLE_LOCATION); + MemSect(0); + + return 1; + } + + return -1; } void PigRenderer::render(shared_ptr mob, double x, double y, double z, float rot, float a) { MobRenderer::render(mob, x, y, z, rot, a); -} \ No newline at end of file +} + +ResourceLocation *PigRenderer::getTextureLocation(shared_ptr mob) +{ + return &PIG_LOCATION; +} \ No newline at end of file diff --git a/Minecraft.Client/PigRenderer.h b/Minecraft.Client/PigRenderer.h index e674b508..b089b6bd 100644 --- a/Minecraft.Client/PigRenderer.h +++ b/Minecraft.Client/PigRenderer.h @@ -3,11 +3,17 @@ class PigRenderer : public MobRenderer { +private: + static ResourceLocation PIG_LOCATION; + static ResourceLocation SADDLE_LOCATION; + public: PigRenderer(Model *model, Model *armor, float shadow); + protected: - virtual int prepareArmor(shared_ptr _pig, int layer, float a); + virtual int prepareArmor(shared_ptr _pig, int layer, float a); public: virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/PistonPieceRenderer.cpp b/Minecraft.Client/PistonPieceRenderer.cpp index 1ce084cf..c51d2e0f 100644 --- a/Minecraft.Client/PistonPieceRenderer.cpp +++ b/Minecraft.Client/PistonPieceRenderer.cpp @@ -1,12 +1,15 @@ #include "stdafx.h" #include "PistonPieceRenderer.h" -#include "Tesselator.h" #include "Lighting.h" +#include "Tesselator.h" +#include "TextureAtlas.h" #include "TileRenderer.h" #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\PistonPieceEntity.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" +ResourceLocation PistonPieceRenderer::SIGN_LOCATION = ResourceLocation(TN_ITEM_SIGN); + PistonPieceRenderer::PistonPieceRenderer() { tileRenderer = NULL; @@ -21,7 +24,7 @@ void PistonPieceRenderer::render(shared_ptr _entity, double x, doubl if (tile != NULL && entity->getProgress(a) <= 1) // 4J - changed condition from < to <= as our chunk update is async to main thread and so we can have to render these with progress of 1 { Tesselator *t = Tesselator::getInstance(); - bindTexture(TN_TERRAIN); + bindTexture(&TextureAtlas::LOCATION_BLOCKS); Lighting::turnOff(); glColor4f(1, 1, 1, 1); // 4J added - this wouldn't be needed in real opengl as the block render has vertex colours and so this isn't use, but our pretend gl always modulates with this diff --git a/Minecraft.Client/PistonPieceRenderer.h b/Minecraft.Client/PistonPieceRenderer.h index 830ddd43..9e4e229b 100644 --- a/Minecraft.Client/PistonPieceRenderer.h +++ b/Minecraft.Client/PistonPieceRenderer.h @@ -1,10 +1,12 @@ #include "TileEntityRenderer.h" + class PistonPieceEntity; class TileRenderer; class PistonPieceRenderer : public TileEntityRenderer { private: + static ResourceLocation SIGN_LOCATION; TileRenderer *tileRenderer; public: diff --git a/Minecraft.Client/PlayerChunkMap.cpp b/Minecraft.Client/PlayerChunkMap.cpp index aedd5a9d..acf6edc3 100644 --- a/Minecraft.Client/PlayerChunkMap.cpp +++ b/Minecraft.Client/PlayerChunkMap.cpp @@ -7,6 +7,7 @@ #include "MinecraftServer.h" #include "..\Minecraft.World\net.minecraft.network.packet.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.h" #include "..\Minecraft.World\ArrayWithLength.h" #include "..\Minecraft.World\System.h" @@ -23,12 +24,9 @@ PlayerChunkMap::PlayerChunk::PlayerChunk(int x, int z, PlayerChunkMap *pcm) : po parent = pcm; // 4J added ticksToNextRegionUpdate = 0; // 4J added prioritised = false; // 4J added + firstInhabitedTime = 0; parent->getLevel()->cache->create(x, z); - // 4J - added make sure our lights are up to date as soon as we make it. This is of particular concern for local clients, who have their data - // shared as soon as the chunkvisibilitypacket is sent, and so could potentially create render data for this chunk before it has been properly lit. - while( parent->getLevel()->updateLights() ) - ; } PlayerChunkMap::PlayerChunk::~PlayerChunk() @@ -68,6 +66,11 @@ void PlayerChunkMap::PlayerChunk::add(shared_ptr player, bool send // 4J Added the sendPacket check. See PlayerChunkMap::add for the usage if( sendPacket ) player->connection->send( shared_ptr( new ChunkVisibilityPacket(pos.x, pos.z, true) ) ); + if (players.empty()) + { + firstInhabitedTime = parent->level->getGameTime(); + } + players.push_back(player); player->chunksToSend.push_back(pos); @@ -93,6 +96,12 @@ void PlayerChunkMap::PlayerChunk::remove(shared_ptr player) players.erase(it); if (players.size() == 0) { + { + LevelChunk *chunk = parent->level->getChunk(pos.x, pos.z); + updateInhabitedTime(chunk); + AUTO_VAR(it, find(parent->knownChunks.begin(), parent->knownChunks.end(),this)); + if(it != parent->knownChunks.end()) parent->knownChunks.erase(it); + } __int64 id = (pos.x + 0x7fffffffLL) | ((pos.z + 0x7fffffffLL) << 32); AUTO_VAR(it, parent->chunks.find(id)); if( it != parent->chunks.end() ) @@ -144,6 +153,18 @@ void PlayerChunkMap::PlayerChunk::remove(shared_ptr player) delete toDelete; } +void PlayerChunkMap::PlayerChunk::updateInhabitedTime() +{ + updateInhabitedTime(parent->level->getChunk(pos.x, pos.z)); +} + +void PlayerChunkMap::PlayerChunk::updateInhabitedTime(LevelChunk *chunk) +{ + chunk->inhabitedTime += parent->level->getGameTime() - firstInhabitedTime; + + firstInhabitedTime = parent->level->getGameTime(); +} + void PlayerChunkMap::PlayerChunk::tileChanged(int x, int y, int z) { if (changes == 0) @@ -380,6 +401,7 @@ PlayerChunkMap::PlayerChunkMap(ServerLevel *level, int dimension, int radius) this->radius = radius; this->level = level; this->dimension = dimension; + lastInhabitedUpdate = 0; } PlayerChunkMap::~PlayerChunkMap() @@ -397,6 +419,23 @@ ServerLevel *PlayerChunkMap::getLevel() void PlayerChunkMap::tick() { + __int64 time = level->getGameTime(); + + if (time - lastInhabitedUpdate > Level::TICKS_PER_DAY / 3) + { + lastInhabitedUpdate = time; + + for (int i = 0; i < knownChunks.size(); i++) + { + PlayerChunk *chunk = knownChunks.at(i); + + // 4J Stu - Going to let our changeChunks handler below deal with this + //chunk.broadcastChanges(); + + chunk->updateInhabitedTime(); + } + } + // 4J - some changes here so that we only send one region update per tick. The chunks themselves also // limit their resend rate to once every MIN_TICKS_BETWEEN_REGION_UPDATE ticks bool regionUpdateSent = false; @@ -451,6 +490,7 @@ PlayerChunkMap::PlayerChunk *PlayerChunkMap::getChunk(int x, int z, bool create) { chunk = new PlayerChunk(x, z, this); chunks[id] = chunk; + knownChunks.push_back(chunk); } return chunk; @@ -528,7 +568,6 @@ void PlayerChunkMap::tickAddRequests(shared_ptr player) { getChunk(itNearest->x, itNearest->z, true)->add(itNearest->player); addRequests.erase(itNearest); - return; } } } @@ -605,6 +644,12 @@ void PlayerChunkMap::add(shared_ptr player) minX = maxX = xc; minZ = maxZ = zc; + // 4J - added so that we don't fully create/send every chunk at this stage. Particularly since moving on to large worlds, where + // we can be adding 1024 chunks here of which a large % might need to be fully created, this can take a long time. Instead use + // the getChunkAndAddPlayer for anything but the central region of chunks, which adds them to a queue of chunks which are added + // one per tick per player. + const int maxLegSizeToAddNow = 14; + // All but the last leg for (int legSize = 1; legSize <= size * 2; legSize++) { @@ -620,12 +665,21 @@ void PlayerChunkMap::add(shared_ptr player) int targetX, targetZ; targetX = xc + dx; targetZ = zc + dz; - if( targetX > maxX ) maxX = targetX; - if( targetX < minX ) minX = targetX; - if( targetZ > maxZ ) maxZ = targetZ; - if( targetZ < minZ ) minZ = targetZ; - getChunk(targetX, targetZ, true)->add(player, false); + if( ( legSize < maxLegSizeToAddNow ) || + ( ( legSize == maxLegSizeToAddNow ) && ( ( leg == 0 ) || ( k < ( legSize - 1 ) ) ) ) ) + { + if( targetX > maxX ) maxX = targetX; + if( targetX < minX ) minX = targetX; + if( targetZ > maxZ ) maxZ = targetZ; + if( targetZ < minZ ) minZ = targetZ; + + getChunk(targetX, targetZ, true)->add(player, false); + } + else + { + getChunkAndAddPlayer(targetX, targetZ, player); + } } } } @@ -640,12 +694,19 @@ void PlayerChunkMap::add(shared_ptr player) int targetX, targetZ; targetX = xc + dx; targetZ = zc + dz; - if( targetX > maxX ) maxX = targetX; - if( targetX < minX ) minX = targetX; - if( targetZ > maxZ ) maxZ = targetZ; - if( targetZ < minZ ) minZ = targetZ; + if( ( size * 2 ) <= maxLegSizeToAddNow ) + { + if( targetX > maxX ) maxX = targetX; + if( targetX < minX ) minX = targetX; + if( targetZ > maxZ ) maxZ = targetZ; + if( targetZ < minZ ) minZ = targetZ; - getChunk(targetX, targetZ, true)->add(player, false); + getChunk(targetX, targetZ, true)->add(player, false); + } + else + { + getChunkAndAddPlayer(targetX, targetZ, player); + } } // CraftBukkit end diff --git a/Minecraft.Client/PlayerChunkMap.h b/Minecraft.Client/PlayerChunkMap.h index 61324272..9d1ab1b5 100644 --- a/Minecraft.Client/PlayerChunkMap.h +++ b/Minecraft.Client/PlayerChunkMap.h @@ -45,6 +45,7 @@ public: int zChangeMin, zChangeMax; int ticksToNextRegionUpdate; // 4J added bool prioritised; // 4J added + __int64 firstInhabitedTime; public: PlayerChunk(int x, int z, PlayerChunkMap *pcm); @@ -53,6 +54,12 @@ public: // 4J Added sendPacket param so we can aggregate the initial send into one much smaller packet void add(shared_ptr player, bool sendPacket = true); void remove(shared_ptr player); + void updateInhabitedTime(); + + private: + void updateInhabitedTime(LevelChunk *chunk); + + public: void tileChanged(int x, int y, int z); void prioritiseTileChanges(); // 4J added void broadcast(shared_ptr packet); @@ -68,12 +75,14 @@ public: private: unordered_map<__int64,PlayerChunk *,LongKeyHash,LongKeyEq> chunks; // 4J - was LongHashMap vector changedChunks; + vector knownChunks; vector addRequests; // 4J added void tickAddRequests(shared_ptr player); // 4J added ServerLevel *level; int radius; int dimension; + __int64 lastInhabitedUpdate; public: PlayerChunkMap(ServerLevel *level, int dimension, int radius); diff --git a/Minecraft.Client/PlayerConnection.cpp b/Minecraft.Client/PlayerConnection.cpp index f0e538a8..4928f65b 100644 --- a/Minecraft.Client/PlayerConnection.cpp +++ b/Minecraft.Client/PlayerConnection.cpp @@ -15,6 +15,7 @@ #include "..\Minecraft.World\net.minecraft.world.inventory.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "..\Minecraft.World\net.minecraft.world.level.saveddata.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" #include "..\Minecraft.World\net.minecraft.network.h" #include "..\Minecraft.World\net.minecraft.world.food.h" #include "..\Minecraft.World\AABB.h" @@ -53,7 +54,7 @@ PlayerConnection::PlayerConnection(MinecraftServer *server, Connection *connecti this->connection = connection; connection->setListener(this); this->player = player; -// player->connection = this; // 4J - moved out as we can't assign in a ctor + // player->connection = this; // 4J - moved out as we can't assign in a ctor InitializeCriticalSection(&done_cs); m_bCloseOnTick = false; @@ -95,10 +96,7 @@ void PlayerConnection::tick() lastKeepAliveId = random.nextInt(); send( shared_ptr( new KeepAlivePacket(lastKeepAliveId) ) ); } -// if (!didTick) { -// player->doTick(false); -// } - + if (chatSpamTickCount > 0) { chatSpamTickCount--; @@ -135,7 +133,7 @@ void PlayerConnection::disconnect(DisconnectPacket::eDisconnectReason reason) { server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerLeftGame) ) ); } - + server->getPlayers()->remove(player); done = true; LeaveCriticalSection(&done_cs); @@ -143,7 +141,7 @@ void PlayerConnection::disconnect(DisconnectPacket::eDisconnectReason reason) void PlayerConnection::handlePlayerInput(shared_ptr packet) { - player->setPlayerInput(packet->getXa(), packet->getYa(), packet->isJumping(), packet->isSneaking(), packet->getXRot(), packet->getYRot()); + player->setPlayerInput(packet->getXxa(), packet->getYya(), packet->isJumping(), packet->isSneaking()); } void PlayerConnection::handleMovePlayer(shared_ptr packet) @@ -175,44 +173,28 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) double xt = player->x; double yt = player->y; double zt = player->z; - double xxa = 0; - double zza = 0; + if (packet->hasRot) { yRotT = packet->yRot; xRotT = packet->xRot; } - if (packet->hasPos && packet->y == -999 && packet->yView == -999) - { - // CraftBukkit start - if (abs(packet->x) > 1 || abs(packet->z) > 1) - { - //System.err.println(player.name + " was caught trying to crash the server with an invalid position."); -#ifndef _CONTENT_PACKAGE - wprintf(L"%ls was caught trying to crash the server with an invalid position.", player->name.c_str()); -#endif - disconnect(DisconnectPacket::eDisconnect_IllegalPosition);//"Nope!"); - return; - } - // CraftBukkit end - xxa = packet->x; - zza = packet->z; - } - player->onGround = packet->onGround; - player->doTick(false); - player->move(xxa, 0, zza); + player->doTick(false); + player->ySlideOffset = 0; player->absMoveTo(xt, yt, zt, yRotT, xRotT); - player->xd = xxa; - player->zd = zza; - if (player->riding != NULL) level->forceTick(player->riding, true); if (player->riding != NULL) player->riding->positionRider(); server->getPlayers()->move(player); - xLastOk = player->x; - yLastOk = player->y; - zLastOk = player->z; + + // player may have been kicked off the mount during the tick, so + // only copy valid coordinates if the player still is "synched" + if (synched) { + xLastOk = player->x; + yLastOk = player->y; + zLastOk = player->z; + } ((Level *)level)->tick(player); return; @@ -253,7 +235,7 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) if (!player->isSleeping() && (yd > 1.65 || yd < 0.1)) { disconnect(DisconnectPacket::eDisconnect_IllegalStance); -// logger.warning(player->name + " had an illegal stance: " + yd); + // logger.warning(player->name + " had an illegal stance: " + yd); return; } if (abs(packet->x) > 32000000 || abs(packet->z) > 32000000) @@ -290,11 +272,11 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) // 4J-PB - removing this one for now /*if (dist > 100.0f) { -// logger.warning(player->name + " moved too quickly!"); - disconnect(DisconnectPacket::eDisconnect_MovedTooQuickly); -// System.out.println("Moved too quickly at " + xt + ", " + yt + ", " + zt); -// teleport(player->x, player->y, player->z, player->yRot, player->xRot); - return; + // logger.warning(player->name + " moved too quickly!"); + disconnect(DisconnectPacket::eDisconnect_MovedTooQuickly); + // System.out.println("Moved too quickly at " + xt + ", " + yt + ", " + zt); + // teleport(player->x, player->y, player->z, player->yRot, player->xRot); + return; } */ @@ -335,9 +317,9 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) if (dist > 0.25 * 0.25 && !player->isSleeping() && !player->gameMode->isCreative() && !player->isAllowedToFly()) { fail = true; -// logger.warning(player->name + " moved wrongly!"); -// System.out.println("Got position " + xt + ", " + yt + ", " + zt); -// System.out.println("Expected " + player->x + ", " + player->y + ", " + player->z); + // logger.warning(player->name + " moved wrongly!"); + // System.out.println("Got position " + xt + ", " + yt + ", " + zt); + // System.out.println("Expected " + player->x + ", " + player->y + ", " + player->z); #ifndef _CONTENT_PACKAGE wprintf(L"%ls moved wrongly!\n",player->name.c_str()); app.DebugPrintf("Got position %f, %f, %f\n", xt,yt,zt); @@ -361,7 +343,7 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) aboveGroundTickCount++; if (aboveGroundTickCount > 80) { -// logger.warning(player->name + " was kicked for floating too long!"); + // logger.warning(player->name + " was kicked for floating too long!"); #ifndef _CONTENT_PACKAGE wprintf(L"%ls was kicked for floating too long!\n", player->name.c_str()); #endif @@ -379,7 +361,10 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) server->getPlayers()->move(player); player->doCheckFallDamage(player->y - startY, packet->onGround); } - + else if ((tickCount % SharedConstants::TICKS_PER_SECOND) == 0) + { + teleport(xLastOk, yLastOk, zLastOk, player->yRot, player->xRot); + } } void PlayerConnection::teleport(double x, double y, double z, float yRot, float xRot, bool sendPacket /*= true*/) @@ -397,10 +382,16 @@ void PlayerConnection::teleport(double x, double y, double z, float yRot, float void PlayerConnection::handlePlayerAction(shared_ptr packet) { ServerLevel *level = server->getLevel(player->dimension); + player->resetLastActionTime(); if (packet->action == PlayerActionPacket::DROP_ITEM) { - player->drop(); + player->drop(false); + return; + } + else if (packet->action == PlayerActionPacket::DROP_ALL_ITEMS) + { + player->drop(true); return; } else if (packet->action == PlayerActionPacket::RELEASE_USE_ITEM) @@ -408,10 +399,10 @@ void PlayerConnection::handlePlayerAction(shared_ptr packet) player->releaseUsingItem(); return; } - // 4J Stu - We don't have ops, so just use the levels setting - bool canEditSpawn = level->canEditSpawn; // = level->dimension->id != 0 || server->players->isOp(player->name); + bool shouldVerifyLocation = false; if (packet->action == PlayerActionPacket::START_DESTROY_BLOCK) shouldVerifyLocation = true; + if (packet->action == PlayerActionPacket::ABORT_DESTROY_BLOCK) shouldVerifyLocation = true; if (packet->action == PlayerActionPacket::STOP_DESTROY_BLOCK) shouldVerifyLocation = true; int x = packet->x; @@ -434,14 +425,10 @@ void PlayerConnection::handlePlayerAction(shared_ptr packet) return; } } - Pos *spawnPos = level->getSharedSpawnPos(); - int xd = (int) Mth::abs((float)(x - spawnPos->x)); - int zd = (int) Mth::abs((float)(z - spawnPos->z)); - delete spawnPos; - if (xd > zd) zd = xd; + if (packet->action == PlayerActionPacket::START_DESTROY_BLOCK) { - if (zd > 16 || canEditSpawn) player->gameMode->startDestroyBlock(x, y, z, packet->face); + if (true) player->gameMode->startDestroyBlock(x, y, z, packet->face); // 4J - condition was !server->isUnderSpawnProtection(level, x, y, z, player) (from Java 1.6.4) but putting back to old behaviour else player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); } @@ -456,21 +443,6 @@ void PlayerConnection::handlePlayerAction(shared_ptr packet) player->gameMode->abortDestroyBlock(x, y, z); if (level->getTile(x, y, z) != 0) player->connection->send(shared_ptr( new TileUpdatePacket(x, y, z, level))); } - else if (packet->action == PlayerActionPacket::GET_UPDATED_BLOCK) - { - double xDist = player->x - (x + 0.5); - double yDist = player->y - (y + 0.5); - double zDist = player->z - (z + 0.5); - double dist = xDist * xDist + yDist * yDist + zDist * zDist; - if (dist < 16 * 16) - { - player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); - } - } - - // 4J Stu - Don't change the levels state - //level->canEditSpawn = false; - } void PlayerConnection::handleUseItem(shared_ptr packet) @@ -482,7 +454,8 @@ void PlayerConnection::handleUseItem(shared_ptr packet) int y = packet->getY(); int z = packet->getZ(); int face = packet->getFace(); - + player->resetLastActionTime(); + // 4J Stu - We don't have ops, so just use the levels setting bool canEditSpawn = level->canEditSpawn; // = level->dimension->id != 0 || server->players->isOp(player->name); if (packet->getFace() == 255) @@ -492,14 +465,9 @@ void PlayerConnection::handleUseItem(shared_ptr packet) } else if ((packet->getY() < server->getMaxBuildHeight() - 1) || (packet->getFace() != Facing::UP && packet->getY() < server->getMaxBuildHeight())) { - Pos *spawnPos = level->getSharedSpawnPos(); - int xd = (int) Mth::abs((float)(x - spawnPos->x)); - int zd = (int) Mth::abs((float)(z - spawnPos->z)); - delete spawnPos; - if (xd > zd) zd = xd; if (synched && player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) < 8 * 8) { - if (zd > 16 || canEditSpawn) + if (true) // 4J - condition was !server->isUnderSpawnProtection(level, x, y, z, player) (from java 1.6.4) but putting back to old behaviour { player->gameMode->useItemOn(player, level, item, x, y, z, face, packet->getClickX(), packet->getClickY(), packet->getClickZ()); } @@ -524,7 +492,7 @@ void PlayerConnection::handleUseItem(shared_ptr packet) if (face == 3) z++; if (face == 4) x--; if (face == 5) x++; - + // 4J - Fixes an issue where pistons briefly disappear when retracting. The pistons themselves shouldn't have their change from being pistonBase_Id to pistonMovingPiece_Id // directly sent to the client, as this will happen on the client as a result of it actioning (via a tile event) the retraction of the piston locally. However, by putting a switch // beside a piston and then performing an action on the side of it facing a piston, the following line of code will send a TileUpdatePacket containing the change to pistonMovingPiece_Id @@ -538,6 +506,12 @@ void PlayerConnection::handleUseItem(shared_ptr packet) } item = player->inventory->getSelected(); + + bool forceClientUpdate = false; + if(item != NULL && packet->getItem() == NULL) + { + forceClientUpdate = true; + } if (item != NULL && item->count == 0) { player->inventory->items[player->inventory->selected] = nullptr; @@ -552,22 +526,18 @@ void PlayerConnection::handleUseItem(shared_ptr packet) player->containerMenu->broadcastChanges(); player->ignoreSlotUpdateHack = false; - if (!ItemInstance::matches(player->inventory->getSelected(), packet->getItem())) + if (forceClientUpdate || !ItemInstance::matches(player->inventory->getSelected(), packet->getItem())) { send( shared_ptr( new ContainerSetSlotPacket(player->containerMenu->containerId, s->index, player->inventory->getSelected()) ) ); } } - - // 4J Stu - Don't change the levels state - //level->canEditSpawn = false; - } void PlayerConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) { EnterCriticalSection(&done_cs); if( done ) return; -// logger.info(player.name + " lost connection: " + reason); + // logger.info(player.name + " lost connection: " + reason); // 4J-PB - removed, since it needs to be localised in the language the client is in //server->players->broadcastAll( shared_ptr( new ChatPacket(L"e" + player->name + L" left the game.") ) ); if(getWasKicked()) @@ -585,7 +555,7 @@ void PlayerConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void PlayerConnection::onUnhandledPacket(shared_ptr packet) { -// logger.warning(getClass() + " wasn't prepared to deal with a " + packet.getClass()); + // logger.warning(getClass() + " wasn't prepared to deal with a " + packet.getClass()); disconnect(DisconnectPacket::eDisconnect_UnexpectedPacket); } @@ -628,10 +598,11 @@ void PlayerConnection::handleSetCarriedItem(shared_ptr pac { if (packet->slot < 0 || packet->slot >= Inventory::getSelectionSize()) { -// logger.warning(player.name + " tried to set an invalid carried item"); + // logger.warning(player.name + " tried to set an invalid carried item"); return; } player->inventory->selected = packet->slot; + player->resetLastActionTime(); } void PlayerConnection::handleChat(shared_ptr packet) @@ -680,6 +651,7 @@ void PlayerConnection::handleCommand(const wstring& message) void PlayerConnection::handleAnimate(shared_ptr packet) { + player->resetLastActionTime(); if (packet->action == AnimatePacket::SWING) { player->swing(); @@ -688,6 +660,7 @@ void PlayerConnection::handleAnimate(shared_ptr packet) void PlayerConnection::handlePlayerCommand(shared_ptr packet) { + player->resetLastActionTime(); if (packet->action == PlayerCommandPacket::START_SNEAKING) { player->setSneaking(true); @@ -709,6 +682,22 @@ void PlayerConnection::handlePlayerCommand(shared_ptr packe player->stopSleepInBed(false, true, true); synched = false; } + else if (packet->action == PlayerCommandPacket::RIDING_JUMP) + { + // currently only supported by horses... + if ( (player->riding != NULL) && player->riding->GetType() == eTYPE_HORSE) + { + dynamic_pointer_cast(player->riding)->onPlayerJump(packet->data); + } + } + else if (packet->action == PlayerCommandPacket::OPEN_INVENTORY) + { + // also only supported by horses... + if ( (player->riding != NULL) && player->riding->instanceof(eTYPE_HORSE) ) + { + dynamic_pointer_cast(player->riding)->openInventory(player); + } + } else if (packet->action == PlayerCommandPacket::START_IDLEANIM) { player->setIsIdle(true); @@ -717,7 +706,6 @@ void PlayerConnection::handlePlayerCommand(shared_ptr packe { player->setIsIdle(false); } - } void PlayerConnection::setShowOnMaps(bool bVal) @@ -751,13 +739,14 @@ void PlayerConnection::warn(const wstring& string) wstring PlayerConnection::getConsoleName() { - return player->name; + return player->getName(); } void PlayerConnection::handleInteract(shared_ptr packet) { ServerLevel *level = server->getLevel(player->dimension); shared_ptr target = level->getEntity(packet->target); + player->resetLastActionTime(); // Fix for #8218 - Gameplay: Attacking zombies from a different level often results in no hits being registered // 4J Stu - If the client says that we hit something, then agree with it. The canSee can fail here as it checks @@ -774,14 +763,20 @@ void PlayerConnection::handleInteract(shared_ptr packet) //if (player->distanceToSqr(target) < maxDist) //{ - if (packet->action == InteractPacket::INTERACT) - { - player->interact(target); - } - else if (packet->action == InteractPacket::ATTACK) + if (packet->action == InteractPacket::INTERACT) + { + player->interact(target); + } + else if (packet->action == InteractPacket::ATTACK) + { + if ((target->GetType() == eTYPE_ITEMENTITY) || (target->GetType() == eTYPE_EXPERIENCEORB) || (target->GetType() == eTYPE_ARROW) || target == player) { - player->attack(target); + //disconnect("Attempting to attack an invalid entity"); + //server.warn("Player " + player.getName() + " tried to attack an invalid entity"); + return; } + player->attack(target); + } //} } @@ -800,7 +795,7 @@ void PlayerConnection::handleTexture(shared_ptr packet) { // Request for texture #ifndef _CONTENT_PACKAGE - wprintf(L"Server received request for custom texture %ls\n",packet->textureName.c_str()); + wprintf(L"Server received request for custom texture %ls\n",packet->textureName.c_str()); #endif PBYTE pbData=NULL; DWORD dwBytes=0; @@ -819,7 +814,7 @@ void PlayerConnection::handleTexture(shared_ptr packet) { // Response with texture data #ifndef _CONTENT_PACKAGE - wprintf(L"Server received custom texture %ls\n",packet->textureName.c_str()); + wprintf(L"Server received custom texture %ls\n",packet->textureName.c_str()); #endif app.AddMemoryTextureFile(packet->textureName,packet->pbData,packet->dwBytes); server->connection->handleTextureReceived(packet->textureName); @@ -950,14 +945,14 @@ void PlayerConnection::handleTextureChange(shared_ptr packe case TextureChangePacket::e_TextureChange_Skin: player->setCustomSkin( app.getSkinIdFromPath( packet->path ) ); #ifndef _CONTENT_PACKAGE - wprintf(L"Skin for server player %ls has changed to %ls (%d)\n", player->name.c_str(), player->customTextureUrl.c_str(), player->getPlayerDefaultSkin() ); + wprintf(L"Skin for server player %ls has changed to %ls (%d)\n", player->name.c_str(), player->customTextureUrl.c_str(), player->getPlayerDefaultSkin() ); #endif break; case TextureChangePacket::e_TextureChange_Cape: player->setCustomCape( Player::getCapeIdFromPath( packet->path ) ); //player->customTextureUrl2 = packet->path; #ifndef _CONTENT_PACKAGE - wprintf(L"Cape for server player %ls has changed to %ls\n", player->name.c_str(), player->customTextureUrl2.c_str() ); + wprintf(L"Cape for server player %ls has changed to %ls\n", player->name.c_str(), player->customTextureUrl2.c_str() ); #endif break; } @@ -982,12 +977,12 @@ void PlayerConnection::handleTextureChange(shared_ptr packe void PlayerConnection::handleTextureAndGeometryChange(shared_ptr packet) { - player->setCustomSkin( app.getSkinIdFromPath( packet->path ) ); + player->setCustomSkin( app.getSkinIdFromPath( packet->path ) ); #ifndef _CONTENT_PACKAGE - wprintf(L"PlayerConnection::handleTextureAndGeometryChange - Skin for server player %ls has changed to %ls (%d)\n", player->name.c_str(), player->customTextureUrl.c_str(), player->getPlayerDefaultSkin() ); + wprintf(L"PlayerConnection::handleTextureAndGeometryChange - Skin for server player %ls has changed to %ls (%d)\n", player->name.c_str(), player->customTextureUrl.c_str(), player->getPlayerDefaultSkin() ); #endif - - + + if(!packet->path.empty() && packet->path.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(packet->path)) { if( server->connection->addPendingTextureRequest(packet->path)) @@ -1022,7 +1017,14 @@ void PlayerConnection::handleServerSettingsChanged(shared_ptrIsHost()) || player->isModerator()) { app.SetGameHostOption(eGameHostOption_FireSpreads, app.GetGameHostOption(packet->data,eGameHostOption_FireSpreads)); - app.SetGameHostOption(eGameHostOption_TNT, app.GetGameHostOption(packet->data,eGameHostOption_TNT)); + app.SetGameHostOption(eGameHostOption_TNT, app.GetGameHostOption(packet->data,eGameHostOption_TNT)); + app.SetGameHostOption(eGameHostOption_MobGriefing, app.GetGameHostOption(packet->data, eGameHostOption_MobGriefing)); + app.SetGameHostOption(eGameHostOption_KeepInventory, app.GetGameHostOption(packet->data, eGameHostOption_KeepInventory)); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, app.GetGameHostOption(packet->data, eGameHostOption_DoMobSpawning)); + app.SetGameHostOption(eGameHostOption_DoMobLoot, app.GetGameHostOption(packet->data, eGameHostOption_DoMobLoot)); + app.SetGameHostOption(eGameHostOption_DoTileDrops, app.GetGameHostOption(packet->data, eGameHostOption_DoTileDrops)); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, app.GetGameHostOption(packet->data, eGameHostOption_DoDaylightCycle)); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, app.GetGameHostOption(packet->data, eGameHostOption_NaturalRegeneration)); server->getPlayers()->broadcastAll( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS,app.GetGameHostOption(eGameHostOption_All) ) ) ); @@ -1048,6 +1050,7 @@ void PlayerConnection::handleGameCommand(shared_ptr packet) void PlayerConnection::handleClientCommand(shared_ptr packet) { + player->resetLastActionTime(); if (packet->action == ClientCommandPacket::PERFORM_RESPAWN) { if (player->wonGame) @@ -1092,43 +1095,44 @@ void PlayerConnection::handleContainerSetSlot(shared_ptr { if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) { - player->inventory->setCarried(packet->item); - } + player->inventory->setCarried(packet->item); + } else { - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY && packet->slot >= 36 && packet->slot < 36 + 9) + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY && packet->slot >= 36 && packet->slot < 36 + 9) { - shared_ptr lastItem = player->inventoryMenu->getSlot(packet->slot)->getItem(); - if (packet->item != NULL) + shared_ptr lastItem = player->inventoryMenu->getSlot(packet->slot)->getItem(); + if (packet->item != NULL) { - if (lastItem == NULL || lastItem->count < packet->item->count) + if (lastItem == NULL || lastItem->count < packet->item->count) { - packet->item->popTime = Inventory::POP_TIME_DURATION; - } - } + packet->item->popTime = Inventory::POP_TIME_DURATION; + } + } player->inventoryMenu->setItem(packet->slot, packet->item); player->ignoreSlotUpdateHack = true; player->containerMenu->broadcastChanges(); player->broadcastCarriedItem(); player->ignoreSlotUpdateHack = false; - } + } else if (packet->containerId == player->containerMenu->containerId) { - player->containerMenu->setItem(packet->slot, packet->item); + player->containerMenu->setItem(packet->slot, packet->item); player->ignoreSlotUpdateHack = true; player->containerMenu->broadcastChanges(); player->broadcastCarriedItem(); player->ignoreSlotUpdateHack = false; - } - } + } + } } #endif void PlayerConnection::handleContainerClick(shared_ptr packet) { + player->resetLastActionTime(); if (player->containerMenu->containerId == packet->containerId && player->containerMenu->isSynched(player)) { - shared_ptr clicked = player->containerMenu->clicked(packet->slotNum, packet->buttonNum, packet->quickKey?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, player); + shared_ptr clicked = player->containerMenu->clicked(packet->slotNum, packet->buttonNum, packet->clickType, player); if (ItemInstance::matches(packet->item, clicked)) { @@ -1147,13 +1151,13 @@ void PlayerConnection::handleContainerClick(shared_ptr pac player->containerMenu->setSynched(player, false); vector > items; - for (unsigned int i = 0; i < player->containerMenu->slots->size(); i++) + for (unsigned int i = 0; i < player->containerMenu->slots.size(); i++) { - items.push_back(player->containerMenu->slots->at(i)->getItem()); + items.push_back(player->containerMenu->slots.at(i)->getItem()); } player->refreshContainer(player->containerMenu, &items); -// player.containerMenu.broadcastChanges(); + // player.containerMenu.broadcastChanges(); } } @@ -1161,6 +1165,7 @@ void PlayerConnection::handleContainerClick(shared_ptr pac void PlayerConnection::handleContainerButtonClick(shared_ptr packet) { + player->resetLastActionTime(); if (player->containerMenu->containerId == packet->containerId && player->containerMenu->isSynched(player)) { player->containerMenu->clickMenuButton(player, packet->buttonId); @@ -1198,7 +1203,7 @@ void PlayerConnection::handleSetCreativeModeSlot(shared_ptr( new MapItemSavedData(id) ); - } + } player->level->setSavedData(id, (shared_ptr ) data); data->scale = mapScale; @@ -1245,9 +1250,9 @@ void PlayerConnection::handleSetCreativeModeSlot(shared_ptr > items; - for (unsigned int i = 0; i < player->inventoryMenu->slots->size(); i++) + for (unsigned int i = 0; i < player->inventoryMenu->slots.size(); i++) { - items.push_back(player->inventoryMenu->slots->at(i)->getItem()); + items.push_back(player->inventoryMenu->slots.at(i)->getItem()); } player->refreshContainer(player->inventoryMenu, &items); } @@ -1266,6 +1271,7 @@ void PlayerConnection::handleContainerAck(shared_ptr packet) void PlayerConnection::handleSignUpdate(shared_ptr packet) { + player->resetLastActionTime(); app.DebugPrintf("PlayerConnection::handleSignUpdate\n"); ServerLevel *level = server->getLevel(player->dimension); @@ -1276,9 +1282,9 @@ void PlayerConnection::handleSignUpdate(shared_ptr packet) if (dynamic_pointer_cast(te) != NULL) { shared_ptr ste = dynamic_pointer_cast(te); - if (!ste->isEditable()) + if (!ste->isEditable() || ste->getPlayerWhoMayEdit() != player) { - server->warn(L"Player " + player->name + L" just tried to change non-editable sign"); + server->warn(L"Player " + player->getName() + L" just tried to change non-editable sign"); return; } } @@ -1450,7 +1456,7 @@ void PlayerConnection::handleCustomPayload(shared_ptr custo ItemInstance carried = player.inventory.getSelected(); if (sentItem != null && sentItem.id == Item.writingBook.id && sentItem.id == carried.id) { - carried.setTag(sentItem.getTag()); + carried.addTagElement(WrittenBookItem.TAG_PAGES, sentItem.getTag().getList(WrittenBookItem.TAG_PAGES)); } } else if (CustomPayloadPacket.CUSTOM_BOOK_SIGN_PACKET.equals(customPayloadPacket.identifier)) @@ -1467,7 +1473,9 @@ void PlayerConnection::handleCustomPayload(shared_ptr custo ItemInstance carried = player.inventory.getSelected(); if (sentItem != null && sentItem.id == Item.writtenBook.id && carried.id == Item.writingBook.id) { - carried.setTag(sentItem.getTag()); + carried.addTagElement(WrittenBookItem.TAG_AUTHOR, new StringTag(WrittenBookItem.TAG_AUTHOR, player.getName())); + carried.addTagElement(WrittenBookItem.TAG_TITLE, new StringTag(WrittenBookItem.TAG_TITLE, sentItem.getTag().getString(WrittenBookItem.TAG_TITLE))); + carried.addTagElement(WrittenBookItem.TAG_PAGES, sentItem.getTag().getList(WrittenBookItem.TAG_PAGES)); carried.id = Item.writtenBook.id; } } @@ -1485,9 +1493,60 @@ void PlayerConnection::handleCustomPayload(shared_ptr custo ((MerchantMenu *) menu)->setSelectionHint(selection); } } + else if (CustomPayloadPacket::SET_ADVENTURE_COMMAND_PACKET.compare(customPayloadPacket->identifier) == 0) + { + if (!server->isCommandBlockEnabled()) + { + app.DebugPrintf("Command blocks not enabled"); + //player->sendMessage(ChatMessageComponent.forTranslation("advMode.notEnabled")); + } + else if (player->hasPermission(eGameCommand_Effect) && player->abilities.instabuild) + { + ByteArrayInputStream bais(customPayloadPacket->data); + DataInputStream input(&bais); + int x = input.readInt(); + int y = input.readInt(); + int z = input.readInt(); + wstring command = Packet::readUtf(&input, 256); + + shared_ptr tileEntity = player->level->getTileEntity(x, y, z); + shared_ptr cbe = dynamic_pointer_cast(tileEntity); + if (tileEntity != NULL && cbe != NULL) + { + cbe->setCommand(command); + player->level->sendTileUpdated(x, y, z); + //player->sendMessage(ChatMessageComponent.forTranslation("advMode.setCommand.success", command)); + } + } + else + { + //player.sendMessage(ChatMessageComponent.forTranslation("advMode.notAllowed")); + } + } + else if (CustomPayloadPacket::SET_BEACON_PACKET.compare(customPayloadPacket->identifier) == 0) + { + if ( dynamic_cast( player->containerMenu) != NULL) + { + ByteArrayInputStream bais(customPayloadPacket->data); + DataInputStream input(&bais); + int primary = input.readInt(); + int secondary = input.readInt(); + + BeaconMenu *beaconMenu = (BeaconMenu *) player->containerMenu; + Slot *slot = beaconMenu->getSlot(0); + if (slot->hasItem()) + { + slot->remove(1); + shared_ptr beacon = beaconMenu->getBeacon(); + beacon->setPrimaryPower(primary); + beacon->setSecondaryPower(secondary); + beacon->setChanged(); + } + } + } else if (CustomPayloadPacket::SET_ITEM_NAME_PACKET.compare(customPayloadPacket->identifier) == 0) { - RepairMenu *menu = dynamic_cast( player->containerMenu); + AnvilMenu *menu = dynamic_cast( player->containerMenu); if (menu) { if (customPayloadPacket->data.data == NULL || customPayloadPacket->data.length < 1) @@ -1508,6 +1567,11 @@ void PlayerConnection::handleCustomPayload(shared_ptr custo } } +bool PlayerConnection::isDisconnected() +{ + return done; +} + // 4J Added void PlayerConnection::handleDebugOptions(shared_ptr packet) @@ -1535,13 +1599,18 @@ void PlayerConnection::handleCraftItem(shared_ptr packet) player->drop(pTempItemInst); } } + else if (pTempItemInst->id == Item::fireworksCharge_Id || pTempItemInst->id == Item::fireworks_Id) + { + CraftingMenu *menu = (CraftingMenu *)player->containerMenu; + player->openFireworks(menu->getX(), menu->getY(), menu->getZ() ); + } else { - - // TODO 4J Stu - Assume at the moment that the client can work this out for us... - //if(pRecipeIngredientsRequired[iRecipe].bCanMake) - //{ + + // TODO 4J Stu - Assume at the moment that the client can work this out for us... + //if(pRecipeIngredientsRequired[iRecipe].bCanMake) + //{ pTempItemInst->onCraftedBy(player->level, dynamic_pointer_cast( player->shared_from_this() ), pTempItemInst->count ); // and remove those resources from your inventory @@ -1574,7 +1643,7 @@ void PlayerConnection::handleCraftItem(shared_ptr packet) } } } - + // 4J Stu - Fix for #13119 - We should add the item after we remove the ingredients if(player->inventory->add(pTempItemInst)==false ) { @@ -1587,9 +1656,9 @@ void PlayerConnection::handleCraftItem(shared_ptr packet) // 4J Stu - Maps need to have their aux value update, so the client should always be assumed to be wrong // This is how the Java works, as the client also incorrectly predicts the auxvalue of the mapItem vector > items; - for (unsigned int i = 0; i < player->containerMenu->slots->size(); i++) + for (unsigned int i = 0; i < player->containerMenu->slots.size(); i++) { - items.push_back(player->containerMenu->slots->at(i)->getItem()); + items.push_back(player->containerMenu->slots.at(i)->getItem()); } player->refreshContainer(player->containerMenu, &items); } @@ -1608,20 +1677,20 @@ void PlayerConnection::handleCraftItem(shared_ptr packet) // handle achievements switch(pTempItemInst->id ) { - case Tile::workBench_Id: player->awardStat(GenericStats::buildWorkbench(), GenericStats::param_buildWorkbench()); break; - case Item::pickAxe_wood_Id: player->awardStat(GenericStats::buildPickaxe(), GenericStats::param_buildPickaxe()); break; - case Tile::furnace_Id: player->awardStat(GenericStats::buildFurnace(), GenericStats::param_buildFurnace()); break; - case Item::hoe_wood_Id: player->awardStat(GenericStats::buildHoe(), GenericStats::param_buildHoe()); break; - case Item::bread_Id: player->awardStat(GenericStats::makeBread(), GenericStats::param_makeBread()); break; - case Item::cake_Id: player->awardStat(GenericStats::bakeCake(), GenericStats::param_bakeCake()); break; - case Item::pickAxe_stone_Id: player->awardStat(GenericStats::buildBetterPickaxe(), GenericStats::param_buildBetterPickaxe()); break; - case Item::sword_wood_Id: player->awardStat(GenericStats::buildSword(), GenericStats::param_buildSword()); break; - case Tile::dispenser_Id: player->awardStat(GenericStats::dispenseWithThis(), GenericStats::param_dispenseWithThis()); break; - case Tile::enchantTable_Id: player->awardStat(GenericStats::enchantments(), GenericStats::param_enchantments()); break; - case Tile::bookshelf_Id: player->awardStat(GenericStats::bookcase(), GenericStats::param_bookcase()); break; + case Tile::workBench_Id: player->awardStat(GenericStats::buildWorkbench(), GenericStats::param_buildWorkbench()); break; + case Item::pickAxe_wood_Id: player->awardStat(GenericStats::buildPickaxe(), GenericStats::param_buildPickaxe()); break; + case Tile::furnace_Id: player->awardStat(GenericStats::buildFurnace(), GenericStats::param_buildFurnace()); break; + case Item::hoe_wood_Id: player->awardStat(GenericStats::buildHoe(), GenericStats::param_buildHoe()); break; + case Item::bread_Id: player->awardStat(GenericStats::makeBread(), GenericStats::param_makeBread()); break; + case Item::cake_Id: player->awardStat(GenericStats::bakeCake(), GenericStats::param_bakeCake()); break; + case Item::pickAxe_stone_Id: player->awardStat(GenericStats::buildBetterPickaxe(), GenericStats::param_buildBetterPickaxe()); break; + case Item::sword_wood_Id: player->awardStat(GenericStats::buildSword(), GenericStats::param_buildSword()); break; + case Tile::dispenser_Id: player->awardStat(GenericStats::dispenseWithThis(), GenericStats::param_dispenseWithThis()); break; + case Tile::enchantTable_Id: player->awardStat(GenericStats::enchantments(), GenericStats::param_enchantments()); break; + case Tile::bookshelf_Id: player->awardStat(GenericStats::bookcase(), GenericStats::param_bookcase()); break; } //} - // ELSE The server thinks the client was wrong... + // ELSE The server thinks the client was wrong... } @@ -1657,17 +1726,17 @@ void PlayerConnection::handleTradeItem(shared_ptr packet) // Add the item we have purchased shared_ptr result = activeRecipe->getSellItem()->copy(); - + // 4J JEV - Award itemsBought stat. player->awardStat( GenericStats::itemsBought(result->getItem()->id), GenericStats::param_itemsBought( - result->getItem()->id, - result->getAuxValue(), - result->GetCount() - ) + result->getItem()->id, + result->getAuxValue(), + result->GetCount() + ) ); - + if (!player->inventory->add(result)) { player->drop(result); diff --git a/Minecraft.Client/PlayerConnection.h b/Minecraft.Client/PlayerConnection.h index 0d4ce2f6..c691e6f5 100644 --- a/Minecraft.Client/PlayerConnection.h +++ b/Minecraft.Client/PlayerConnection.h @@ -94,6 +94,7 @@ public: virtual bool isServerPacketListener(); virtual void handlePlayerAbilities(shared_ptr playerAbilitiesPacket); virtual void handleCustomPayload(shared_ptr customPayloadPacket); + virtual bool isDisconnected(); // 4J Added virtual void handleCraftItem(shared_ptr packet); diff --git a/Minecraft.Client/PlayerList.cpp b/Minecraft.Client/PlayerList.cpp index 7921cbf8..9fbef2a2 100644 --- a/Minecraft.Client/PlayerList.cpp +++ b/Minecraft.Client/PlayerList.cpp @@ -24,6 +24,7 @@ #include "..\Minecraft.World\net.minecraft.world.level.storage.h" #include "..\Minecraft.World\net.minecraft.world.level.saveddata.h" #include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\EntityIO.h" #ifdef _XBOX #include "Xbox\Network\NetworkPlayerXbox.h" #elif defined(__PS3__) || defined(__ORBIS__) @@ -36,7 +37,7 @@ PlayerList::PlayerList(MinecraftServer *server) { playerIo = NULL; - this->server = server; + this->server = server; sendAllPlayerInfoIn = 0; overrideGameMode = NULL; @@ -50,11 +51,11 @@ PlayerList::PlayerList(MinecraftServer *server) viewDistance = 10; #endif - //int viewDistance = server->settings->getInt(L"view-distance", 10); + //int viewDistance = server->settings->getInt(L"view-distance", 10); + + maxPlayers = server->settings->getInt(L"max-players", 20); + doWhiteList = false; - maxPlayers = server->settings->getInt(L"max-players", 20); - doWhiteList = false; - InitializeCriticalSection(&m_kickPlayersCS); InitializeCriticalSection(&m_closePlayersCS); } @@ -74,190 +75,236 @@ PlayerList::~PlayerList() void PlayerList::placeNewPlayer(Connection *connection, shared_ptr player, shared_ptr packet) { - bool newPlayer = load(player); - player->setLevel(server->getLevel(player->dimension)); - player->gameMode->setLevel((ServerLevel *) player->level); + CompoundTag *playerTag = load(player); - // Make sure these privileges are always turned off for the host player - INetworkPlayer *networkPlayer = connection->getSocket()->getPlayer(); - if(networkPlayer != NULL && networkPlayer->IsHost()) - { - player->enableAllPlayerPrivileges(true); - player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_HOST,1); - } + bool newPlayer = playerTag == NULL; + + player->setLevel(server->getLevel(player->dimension)); + player->gameMode->setLevel((ServerLevel *)player->level); + + // Make sure these privileges are always turned off for the host player + INetworkPlayer *networkPlayer = connection->getSocket()->getPlayer(); + if(networkPlayer != NULL && networkPlayer->IsHost()) + { + player->enableAllPlayerPrivileges(true); + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_HOST,1); + } #if defined(__PS3__) || defined(__ORBIS__) - // PS3 networking library doesn't automatically assign PlayerUIDs to the network players for anything remote, so need to tell it what to set from the data in this packet now - if( !g_NetworkManager.IsLocalGame() ) + // PS3 networking library doesn't automatically assign PlayerUIDs to the network players for anything remote, so need to tell it what to set from the data in this packet now + if( !g_NetworkManager.IsLocalGame() ) + { + if( networkPlayer != NULL ) { - if( networkPlayer != NULL ) - { - ((NetworkPlayerSony *)networkPlayer)->SetUID( packet->m_onlineXuid ); - } + ((NetworkPlayerSony *)networkPlayer)->SetUID( packet->m_onlineXuid ); } + } #endif - // 4J Stu - TU-1 hotfix - // Fix for #13150 - When a player loads/joins a game after saving/leaving in the nether, sometimes they are spawned on top of the nether and cannot mine down - validatePlayerSpawnPosition(player); + // 4J Stu - TU-1 hotfix + // Fix for #13150 - When a player loads/joins a game after saving/leaving in the nether, sometimes they are spawned on top of the nether and cannot mine down + validatePlayerSpawnPosition(player); -// logger.info(getName() + " logged in with entity id " + playerEntity.entityId + " at (" + playerEntity.x + ", " + playerEntity.y + ", " + playerEntity.z + ")"); + // logger.info(getName() + " logged in with entity id " + playerEntity.entityId + " at (" + playerEntity.x + ", " + playerEntity.y + ", " + playerEntity.z + ")"); - ServerLevel *level = server->getLevel(player->dimension); + ServerLevel *level = server->getLevel(player->dimension); - DWORD playerIndex = 0; + DWORD playerIndex = 0; + { + bool usedIndexes[MINECRAFT_NET_MAX_PLAYERS]; + ZeroMemory( &usedIndexes, MINECRAFT_NET_MAX_PLAYERS * sizeof(bool) ); + for(AUTO_VAR(it, players.begin()); it < players.end(); ++it) { - bool usedIndexes[MINECRAFT_NET_MAX_PLAYERS]; - ZeroMemory( &usedIndexes, MINECRAFT_NET_MAX_PLAYERS * sizeof(bool) ); - for(AUTO_VAR(it, players.begin()); it < players.end(); ++it) - { - usedIndexes[ (int)(*it)->getPlayerIndex() ] = true; - } - for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + usedIndexes[ (int)(*it)->getPlayerIndex() ] = true; + } + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if(!usedIndexes[i]) { - if(!usedIndexes[i]) - { - playerIndex = i; - break; - } + playerIndex = i; + break; } } - player->setPlayerIndex( playerIndex ); - player->setCustomSkin( packet->m_playerSkinId ); - player->setCustomCape( packet->m_playerCapeId ); + } + player->setPlayerIndex( playerIndex ); + player->setCustomSkin( packet->m_playerSkinId ); + player->setCustomCape( packet->m_playerCapeId ); - // 4J-JEV: Moved this here so we can send player-model texture and geometry data. - shared_ptr playerConnection = shared_ptr(new PlayerConnection(server, connection, player)); - //player->connection = playerConnection; // Used to be assigned in PlayerConnection ctor but moved out so we can use shared_ptr + // 4J-JEV: Moved this here so we can send player-model texture and geometry data. + shared_ptr playerConnection = shared_ptr(new PlayerConnection(server, connection, player)); + //player->connection = playerConnection; // Used to be assigned in PlayerConnection ctor but moved out so we can use shared_ptr - if(newPlayer) - { - int mapScale = 3; + if(newPlayer) + { + int mapScale = 3; #ifdef _LARGE_WORLDS - int scale = MapItemSavedData::MAP_SIZE * 2 * (1 << mapScale); - int centreXC = (int) (Math::round(player->x / scale) * scale); - int centreZC = (int) (Math::round(player->z / scale) * scale); + int scale = MapItemSavedData::MAP_SIZE * 2 * (1 << mapScale); + int centreXC = (int) (Math::round(player->x / scale) * scale); + int centreZC = (int) (Math::round(player->z / scale) * scale); #else - // 4J-PB - for Xbox maps, we'll centre them on the origin of the world, since we can fit the whole world in our map - int centreXC = 0; - int centreZC = 0; + // 4J-PB - for Xbox maps, we'll centre them on the origin of the world, since we can fit the whole world in our map + int centreXC = 0; + int centreZC = 0; #endif - // 4J Added - Give every player a map the first time they join a server - player->inventory->setItem( 9, shared_ptr( new ItemInstance(Item::map_Id, 1, level->getAuxValueForMap(player->getXuid(),0,centreXC, centreZC, mapScale ) ) ) ); - if(app.getGameRuleDefinitions() != NULL) - { - app.getGameRuleDefinitions()->postProcessPlayer(player); - } + // 4J Added - Give every player a map the first time they join a server + player->inventory->setItem( 9, shared_ptr( new ItemInstance(Item::map_Id, 1, level->getAuxValueForMap(player->getXuid(),0,centreXC, centreZC, mapScale ) ) ) ); + if(app.getGameRuleDefinitions() != NULL) + { + app.getGameRuleDefinitions()->postProcessPlayer(player); } + } - if(!player->customTextureUrl.empty() && player->customTextureUrl.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl)) + if(!player->customTextureUrl.empty() && player->customTextureUrl.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl)) + { + if( server->getConnection()->addPendingTextureRequest(player->customTextureUrl)) { - if( server->getConnection()->addPendingTextureRequest(player->customTextureUrl)) - { #ifndef _CONTENT_PACKAGE - wprintf(L"Sending texture packet to get custom skin %ls from player %ls\n",player->customTextureUrl.c_str(), player->name.c_str()); + wprintf(L"Sending texture packet to get custom skin %ls from player %ls\n",player->customTextureUrl.c_str(), player->name.c_str()); #endif - playerConnection->send(shared_ptr( new TextureAndGeometryPacket(player->customTextureUrl,NULL,0) ) ); - } - } - else if(!player->customTextureUrl.empty() && app.IsFileInMemoryTextures(player->customTextureUrl)) - { - // Update the ref count on the memory texture data - app.AddMemoryTextureFile(player->customTextureUrl,NULL,0); + playerConnection->send(shared_ptr( new TextureAndGeometryPacket(player->customTextureUrl,NULL,0) ) ); } + } + else if(!player->customTextureUrl.empty() && app.IsFileInMemoryTextures(player->customTextureUrl)) + { + // Update the ref count on the memory texture data + app.AddMemoryTextureFile(player->customTextureUrl,NULL,0); + } - if(!player->customTextureUrl2.empty() && player->customTextureUrl2.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl2)) + if(!player->customTextureUrl2.empty() && player->customTextureUrl2.substr(0,3).compare(L"def") != 0 && !app.IsFileInMemoryTextures(player->customTextureUrl2)) + { + if( server->getConnection()->addPendingTextureRequest(player->customTextureUrl2)) { - if( server->getConnection()->addPendingTextureRequest(player->customTextureUrl2)) - { #ifndef _CONTENT_PACKAGE - wprintf(L"Sending texture packet to get custom skin %ls from player %ls\n",player->customTextureUrl2.c_str(), player->name.c_str()); + wprintf(L"Sending texture packet to get custom skin %ls from player %ls\n",player->customTextureUrl2.c_str(), player->name.c_str()); #endif - playerConnection->send(shared_ptr( new TexturePacket(player->customTextureUrl2,NULL,0) ) ); - } - } - else if(!player->customTextureUrl2.empty() && app.IsFileInMemoryTextures(player->customTextureUrl2)) - { - // Update the ref count on the memory texture data - app.AddMemoryTextureFile(player->customTextureUrl2,NULL,0); + playerConnection->send(shared_ptr( new TexturePacket(player->customTextureUrl2,NULL,0) ) ); } + } + else if(!player->customTextureUrl2.empty() && app.IsFileInMemoryTextures(player->customTextureUrl2)) + { + // Update the ref count on the memory texture data + app.AddMemoryTextureFile(player->customTextureUrl2,NULL,0); + } - player->setIsGuest( packet->m_isGuest ); + player->setIsGuest( packet->m_isGuest ); - Pos *spawnPos = level->getSharedSpawnPos(); + Pos *spawnPos = level->getSharedSpawnPos(); - updatePlayerGameMode(player, nullptr, level); + updatePlayerGameMode(player, nullptr, level); - // Update the privileges with the correct game mode - GameType *gameType = Player::getPlayerGamePrivilege(player->getAllPlayerGamePrivileges(),Player::ePlayerGamePrivilege_CreativeMode) ? GameType::CREATIVE : GameType::SURVIVAL; - gameType = LevelSettings::validateGameType(gameType->getId()); - if (player->gameMode->getGameModeForPlayer() != gameType) - { - player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CreativeMode,player->gameMode->getGameModeForPlayer()->getId() ); - } + // Update the privileges with the correct game mode + GameType *gameType = Player::getPlayerGamePrivilege(player->getAllPlayerGamePrivileges(),Player::ePlayerGamePrivilege_CreativeMode) ? GameType::CREATIVE : GameType::SURVIVAL; + gameType = LevelSettings::validateGameType(gameType->getId()); + if (player->gameMode->getGameModeForPlayer() != gameType) + { + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_CreativeMode,player->gameMode->getGameModeForPlayer()->getId() ); + } - //shared_ptr playerConnection = shared_ptr(new PlayerConnection(server, connection, player)); - player->connection = playerConnection; // Used to be assigned in PlayerConnection ctor but moved out so we can use shared_ptr + //shared_ptr playerConnection = shared_ptr(new PlayerConnection(server, connection, player)); + player->connection = playerConnection; // Used to be assigned in PlayerConnection ctor but moved out so we can use shared_ptr - // 4J Added to store UGC settings - playerConnection->m_friendsOnlyUGC = packet->m_friendsOnlyUGC; - playerConnection->m_offlineXUID = packet->m_offlineXuid; - playerConnection->m_onlineXUID = packet->m_onlineXuid; + // 4J Added to store UGC settings + playerConnection->m_friendsOnlyUGC = packet->m_friendsOnlyUGC; + playerConnection->m_offlineXUID = packet->m_offlineXuid; + playerConnection->m_onlineXUID = packet->m_onlineXuid; - // This player is now added to the list, so incrementing this value invalidates all previous PreLogin packets - if(packet->m_friendsOnlyUGC) ++server->m_ugcPlayersVersion; + // This player is now added to the list, so incrementing this value invalidates all previous PreLogin packets + if(packet->m_friendsOnlyUGC) ++server->m_ugcPlayersVersion; - addPlayerToReceiving( player ); + addPlayerToReceiving( player ); - playerConnection->send( shared_ptr( new LoginPacket(L"", player->entityId, level->getLevelData()->getGenerator(), level->getSeed(), player->gameMode->getGameModeForPlayer()->getId(), - (byte) level->dimension->id, (byte) level->getMaxBuildHeight(), (byte) getMaxPlayers(), - level->difficulty, TelemetryManager->GetMultiplayerInstanceID(), (BYTE)playerIndex, level->useNewSeaLevel(), player->getAllPlayerGamePrivileges(), - level->getLevelData()->getXZSize(), level->getLevelData()->getHellScale() ) ) ); - playerConnection->send( shared_ptr( new SetSpawnPositionPacket(spawnPos->x, spawnPos->y, spawnPos->z) ) ); - playerConnection->send( shared_ptr( new PlayerAbilitiesPacket(&player->abilities)) ); - delete spawnPos; + playerConnection->send( shared_ptr( new LoginPacket(L"", player->entityId, level->getLevelData()->getGenerator(), level->getSeed(), player->gameMode->getGameModeForPlayer()->getId(), + (byte) level->dimension->id, (byte) level->getMaxBuildHeight(), (byte) getMaxPlayers(), + level->difficulty, TelemetryManager->GetMultiplayerInstanceID(), (BYTE)playerIndex, level->useNewSeaLevel(), player->getAllPlayerGamePrivileges(), + level->getLevelData()->getXZSize(), level->getLevelData()->getHellScale() ) ) ); + playerConnection->send( shared_ptr( new SetSpawnPositionPacket(spawnPos->x, spawnPos->y, spawnPos->z) ) ); + playerConnection->send( shared_ptr( new PlayerAbilitiesPacket(&player->abilities)) ); + playerConnection->send( shared_ptr( new SetCarriedItemPacket(player->inventory->selected))); + delete spawnPos; - sendLevelInfo(player, level); + updateEntireScoreboard((ServerScoreboard *) level->getScoreboard(), player); - // 4J-PB - removed, since it needs to be localised in the language the client is in - //server->players->broadcastAll( shared_ptr( new ChatPacket(L"e" + playerEntity->name + L" joined the game.") ) ); - broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerJoinedGame) ) ); + sendLevelInfo(player, level); - MemSect(14); - add(player); - MemSect(0); + // 4J-PB - removed, since it needs to be localised in the language the client is in + //server->players->broadcastAll( shared_ptr( new ChatPacket(L"e" + playerEntity->name + L" joined the game.") ) ); + broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerJoinedGame) ) ); - player->doTick(true, true, false); // 4J - added - force sending of the nearest chunk before the player is teleported, so we have somewhere to arrive on... - playerConnection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); + MemSect(14); + add(player); + MemSect(0); - server->getConnection()->addPlayerConnection(playerConnection); - playerConnection->send( shared_ptr( new SetTimePacket(level->getTime()) ) ); + player->doTick(true, true, false); // 4J - added - force sending of the nearest chunk before the player is teleported, so we have somewhere to arrive on... + playerConnection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); - AUTO_VAR(activeEffects, player->getActiveEffects()); - for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) + server->getConnection()->addPlayerConnection(playerConnection); + playerConnection->send( shared_ptr( new SetTimePacket(level->getGameTime(), level->getDayTime(), level->getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT)) ) ); + + AUTO_VAR(activeEffects, player->getActiveEffects()); + for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) + { + MobEffectInstance *effect = *it; + playerConnection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); + } + + player->initMenu(); + + if (playerTag != NULL && playerTag->contains(Entity::RIDING_TAG)) + { + // this player has been saved with a mount tag + shared_ptr mount = EntityIO::loadStatic(playerTag->getCompound(Entity::RIDING_TAG), level); + if (mount != NULL) { - MobEffectInstance *effect = *it; - playerConnection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); + mount->forcedLoading = true; + level->addEntity(mount); + player->ride(mount); + mount->forcedLoading = false; } + } - player->initMenu(); - - // If we are joining at the same time as someone in the end on this system is travelling through the win portal, - // then we should set our wonGame flag to true so that respawning works when the EndPoem is closed - INetworkPlayer *thisPlayer = player->connection->getNetworkPlayer(); - if( thisPlayer != NULL ) + // If we are joining at the same time as someone in the end on this system is travelling through the win portal, + // then we should set our wonGame flag to true so that respawning works when the EndPoem is closed + INetworkPlayer *thisPlayer = player->connection->getNetworkPlayer(); + if( thisPlayer != NULL ) + { + for(AUTO_VAR(it, players.begin()); it != players.end(); ++it) { - for(AUTO_VAR(it, players.begin()); it != players.end(); ++it) + shared_ptr servPlayer = *it; + INetworkPlayer *checkPlayer = servPlayer->connection->getNetworkPlayer(); + if(thisPlayer != checkPlayer && checkPlayer != NULL && thisPlayer->IsSameSystem( checkPlayer ) && servPlayer->wonGame ) { - shared_ptr servPlayer = *it; - INetworkPlayer *checkPlayer = servPlayer->connection->getNetworkPlayer(); - if(thisPlayer != checkPlayer && checkPlayer != NULL && thisPlayer->IsSameSystem( checkPlayer ) && servPlayer->wonGame ) - { - player->wonGame = true; - break; - } + player->wonGame = true; + break; } } + } +} + +void PlayerList::updateEntireScoreboard(ServerScoreboard *scoreboard, shared_ptr player) +{ + //unordered_set objectives; + + //for (PlayerTeam team : scoreboard->getPlayerTeams()) + //{ + // player->connection->send( shared_ptr(new SetPlayerTeamPacket(team, SetPlayerTeamPacket::METHOD_ADD))); + //} + + //for (int slot = 0; slot < Scoreboard::DISPLAY_SLOTS; slot++) + //{ + // Objective objective = scoreboard->getDisplayObjective(slot); + + // if (objective != NULL && !objectives->contains(objective)) + // { + // vector > *packets = scoreboard->getStartTrackingPackets(objective); + + // for (Packet packet : packets) + // { + // player->connection->send(packet); + // } + + // objectives->add(objective); + // } + //} } void PlayerList::setLevel(ServerLevelArray levels) @@ -280,8 +327,7 @@ int PlayerList::getMaxRange() return PlayerChunkMap::convertChunkRangeToBlock(getViewDistance()); } - // 4J Changed return val to bool to check if new player or loaded player -bool PlayerList::load(shared_ptr player) +CompoundTag *PlayerList::load(shared_ptr player) { return playerIo->load(player); } @@ -301,6 +347,8 @@ void PlayerList::validatePlayerSpawnPosition(shared_ptr player) // Make sure that the player is on the ground, and in the centre x/z of the current column app.DebugPrintf("Original pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); + bool spawnForced = player->isRespawnForced(); + double targetX = 0; if(player->x < 0) targetX = Mth::ceil(player->x) - 0.5; else targetX = Mth::floor(player->x) + 0.5; @@ -316,10 +364,10 @@ void PlayerList::validatePlayerSpawnPosition(shared_ptr player) app.DebugPrintf("New pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); ServerLevel *level = server->getLevel(player->dimension); - while (level->getCubes(player, player->bb)->size() != 0) + while (level->getCubes(player, player->bb)->size() != 0) { - player->setPos(player->x, player->y + 1, player->z); - } + player->setPos(player->x, player->y + 1, player->z); + } app.DebugPrintf("Final pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); // 4J Stu - If we are in the nether and the above while loop has put us above the nether then we have a problem @@ -342,11 +390,11 @@ void PlayerList::validatePlayerSpawnPosition(shared_ptr player) Pos *bedPosition = player->getRespawnPosition(); if (bedPosition != NULL) { - Pos *respawnPosition = Player::checkBedValidRespawnPosition(server->getLevel(player->dimension), bedPosition); + Pos *respawnPosition = Player::checkBedValidRespawnPosition(server->getLevel(player->dimension), bedPosition, spawnForced); if (respawnPosition != NULL) { player->moveTo(respawnPosition->x + 0.5f, respawnPosition->y + 0.1f, respawnPosition->z + 0.5f, 0, 0); - player->setRespawnPosition(bedPosition); + player->setRespawnPosition(bedPosition, spawnForced); } delete bedPosition; } @@ -354,7 +402,7 @@ void PlayerList::validatePlayerSpawnPosition(shared_ptr player) { player->setPos(player->x, player->y + 1, player->z); } - + app.DebugPrintf("Updated pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); } } @@ -367,12 +415,12 @@ void PlayerList::add(shared_ptr player) broadcastAll(shared_ptr( new PlayerInfoPacket( player ) ) ); } - players.push_back(player); + players.push_back(player); // 4J Added addPlayerToReceiving(player); - // Ensure the area the player is spawning in is loaded! + // Ensure the area the player is spawning in is loaded! ServerLevel *level = server->getLevel(player->dimension); // 4J Stu - TU-1 hotfix @@ -381,8 +429,8 @@ void PlayerList::add(shared_ptr player) // 4J Stu - Swapped these lines about so that we get the chunk visiblity packet way ahead of all the add tracked entity packets // Fix for #9169 - ART : Sign text is replaced with the words Awaiting approval. - changeDimension(player, NULL); - level->addEntity(player); + changeDimension(player, NULL); + level->addEntity(player); for (int i = 0; i < players.size(); i++) { @@ -417,12 +465,20 @@ void PlayerList::move(shared_ptr player) void PlayerList::remove(shared_ptr player) { - save(player); + save(player); //4J Stu - We don't want to save the map data for guests, so when we are sure that the player is gone delete the map if(player->isGuest()) playerIo->deleteMapFilesForPlayer(player); ServerLevel *level = player->getLevel(); - level->removeEntity(player); - level->getChunkMap()->remove(player); + if (player->riding != NULL) + { + // remove mount first because the player unmounts when being + // removed, also remove mount because it's saved in the player's + // save tag + level->removeEntityImmediately(player->riding); + app.DebugPrintf("removing player mount"); + } + level->removeEntity(player); + level->getChunkMap()->remove(player); AUTO_VAR(it, find(players.begin(),players.end(),player)); if( it != players.end() ) { @@ -441,12 +497,12 @@ void PlayerList::remove(shared_ptr player) shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID onlineXuid) { - if (players.size() >= maxPlayers) + if (players.size() >= maxPlayers) { - pendingConnection->disconnect(DisconnectPacket::eDisconnect_ServerFull); - return shared_ptr(); - } - + pendingConnection->disconnect(DisconnectPacket::eDisconnect_ServerFull); + return shared_ptr(); + } + shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(0), userName, new ServerPlayerGameMode(server->getLevel(0)) )); player->gameMode->player = player; // 4J added as had to remove this assignment from ServerPlayer ctor player->setXuid( xuid ); // 4J Added @@ -466,7 +522,7 @@ shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendin player->gameMode->setGameRules( GameRuleDefinition::generateNewGameRulesInstance(GameRulesInstance::eGameRulesInstanceType_ServerPlayer, serverRuleDefs, pendingConnection->connection) ); } - return player; + return player; } shared_ptr PlayerList::respawn(shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData) @@ -525,22 +581,24 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay AUTO_VAR(it, find(players.begin(),players.end(),serverPlayer)); if( it != players.end() ) { - players.erase(it); + players.erase(it); } - server->getLevel(serverPlayer->dimension)->removeEntityImmediately(serverPlayer); + server->getLevel(serverPlayer->dimension)->removeEntityImmediately(serverPlayer); - Pos *bedPosition = serverPlayer->getRespawnPosition(); + Pos *bedPosition = serverPlayer->getRespawnPosition(); + bool spawnForced = serverPlayer->isRespawnForced(); removePlayerFromReceiving(serverPlayer); - serverPlayer->dimension = targetDimension; + serverPlayer->dimension = targetDimension; EDefaultSkins skin = serverPlayer->getPlayerDefaultSkin(); DWORD playerIndex = serverPlayer->getPlayerIndex(); PlayerUID playerXuid = serverPlayer->getXuid(); PlayerUID playerOnlineXuid = serverPlayer->getOnlineXuid(); - - shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(serverPlayer->dimension), serverPlayer->name, new ServerPlayerGameMode(server->getLevel(serverPlayer->dimension)))); + + shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(serverPlayer->dimension), serverPlayer->getName(), new ServerPlayerGameMode(server->getLevel(serverPlayer->dimension)))); + player->connection = serverPlayer->connection; player->restoreFrom(serverPlayer, keepAllPlayerData); if (keepAllPlayerData) { @@ -552,9 +610,8 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->setOnlineXuid( playerOnlineXuid ); // 4J Added // 4J Stu - Don't reuse the id. If we do, then the player can be re-added after being removed, but the add packet gets sent before the remove packet - //player->entityId = serverPlayer->entityId; + //player->entityId = serverPlayer->entityId; - player->connection = serverPlayer->connection; player->setPlayerDefaultSkin( skin ); player->setIsGuest( serverPlayer->isGuest() ); player->setPlayerIndex( playerIndex ); @@ -570,7 +627,7 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay addPlayerToReceiving(player); - ServerLevel *level = server->getLevel(serverPlayer->dimension); + ServerLevel *level = server->getLevel(serverPlayer->dimension); // reset the player's game mode (first pick from old, then copy level if // necessary) @@ -582,39 +639,40 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->moveTo(serverPlayer->x, serverPlayer->y, serverPlayer->z, serverPlayer->yRot, serverPlayer->xRot); if(bedPosition != NULL) { - player->setRespawnPosition(bedPosition); + player->setRespawnPosition(bedPosition, spawnForced); delete bedPosition; } // Fix for #81759 - TU9: Content: Gameplay: Entering The End Exit Portal replaces the Player's currently held item with the first one from the Quickbar player->inventory->selected = serverPlayer->inventory->selected; } - else if (bedPosition != NULL) + else if (bedPosition != NULL) { - Pos *respawnPosition = Player::checkBedValidRespawnPosition(server->getLevel(serverPlayer->dimension), bedPosition); - if (respawnPosition != NULL) + Pos *respawnPosition = Player::checkBedValidRespawnPosition(server->getLevel(serverPlayer->dimension), bedPosition, spawnForced); + if (respawnPosition != NULL) { - player->moveTo(respawnPosition->x + 0.5f, respawnPosition->y + 0.1f, respawnPosition->z + 0.5f, 0, 0); - player->setRespawnPosition(bedPosition); - } + player->moveTo(respawnPosition->x + 0.5f, respawnPosition->y + 0.1f, respawnPosition->z + 0.5f, 0, 0); + player->setRespawnPosition(bedPosition, spawnForced); + } else { - player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::NO_RESPAWN_BED_AVAILABLE, 0) ) ); - } + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::NO_RESPAWN_BED_AVAILABLE, 0) ) ); + } delete bedPosition; - } + } - // Ensure the area the player is spawning in is loaded! - level->cache->create(((int) player->x) >> 4, ((int) player->z) >> 4); + // Ensure the area the player is spawning in is loaded! + level->cache->create(((int) player->x) >> 4, ((int) player->z) >> 4); - while (!level->getCubes(player, player->bb)->empty()) + while (!level->getCubes(player, player->bb)->empty()) { - player->setPos(player->x, player->y + 1, player->z); - } + player->setPos(player->x, player->y + 1, player->z); + } player->connection->send( shared_ptr( new RespawnPacket((char) player->dimension, player->level->getSeed(), player->level->getMaxBuildHeight(), - player->gameMode->getGameModeForPlayer(), level->difficulty, level->getLevelData()->getGenerator(), - player->level->useNewSeaLevel(), player->entityId, level->getLevelData()->getXZSize(), level->getLevelData()->getHellScale()) ) ); - player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); + player->gameMode->getGameModeForPlayer(), level->difficulty, level->getLevelData()->getGenerator(), + player->level->useNewSeaLevel(), player->entityId, level->getLevelData()->getXZSize(), level->getLevelData()->getHellScale()) ) ); + player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); + player->connection->send( shared_ptr( new SetExperiencePacket(player->experienceProgress, player->totalExperience, player->experienceLevel)) ); if(keepAllPlayerData) { @@ -629,13 +687,14 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); } - sendLevelInfo(player, level); + sendLevelInfo(player, level); - level->getChunkMap()->add(player); - level->addEntity(player); - players.push_back(player); + level->getChunkMap()->add(player); + level->addEntity(player); + players.push_back(player); - player->initMenu(); + player->initMenu(); + player->setHealth(player->getHealth()); // 4J-JEV - Dying before this point in the tutorial is pretty annoying, // making sure to remove health/hunger and give you back your meat. @@ -650,7 +709,7 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->displayClientMessage(IDS_PLAYER_LEFT_END); } - return player; + return player; } @@ -704,7 +763,7 @@ void PlayerList::toggleDimension(shared_ptr player, int targetDime player->getLevel()->getTracker()->removeEntity(player); } - ServerLevel *oldLevel = server->getLevel(player->dimension); + ServerLevel *oldLevel = server->getLevel(player->dimension); // 4J Stu - Do this much earlier so we don't end up unloading chunks in the wrong dimension player->getLevel()->getChunkMap()->remove(player); @@ -718,9 +777,9 @@ void PlayerList::toggleDimension(shared_ptr player, int targetDime player->displayClientMessage(IDS_PLAYER_LEFT_END); } - player->dimension = targetDimension; + player->dimension = targetDimension; - ServerLevel *newLevel = server->getLevel(player->dimension); + ServerLevel *newLevel = server->getLevel(player->dimension); // 4J Stu - Fix for #46423 - TU5: Art: Code: No burning animation visible after entering The Nether while burning player->clearFire(); // Stop burning if travelling through a portal @@ -729,109 +788,129 @@ void PlayerList::toggleDimension(shared_ptr player, int targetDime player->flushEntitiesToRemove(); player->connection->send( shared_ptr( new RespawnPacket((char) player->dimension, newLevel->getSeed(), newLevel->getMaxBuildHeight(), - player->gameMode->getGameModeForPlayer(), newLevel->difficulty, newLevel->getLevelData()->getGenerator(), - newLevel->useNewSeaLevel(), player->entityId, newLevel->getLevelData()->getXZSize(), newLevel->getLevelData()->getHellScale()) ) ); + player->gameMode->getGameModeForPlayer(), newLevel->difficulty, newLevel->getLevelData()->getGenerator(), + newLevel->useNewSeaLevel(), player->entityId, newLevel->getLevelData()->getXZSize(), newLevel->getLevelData()->getHellScale()) ) ); + + oldLevel->removeEntityImmediately(player); + player->removed = false; + + repositionAcrossDimension(player, lastDimension, oldLevel, newLevel); + changeDimension(player, oldLevel); + + player->gameMode->setLevel(newLevel); + + // Resend the teleport if we haven't yet sent the chunk they will land on + if( !g_NetworkManager.SystemFlagGet(player->connection->getNetworkPlayer(),ServerPlayer::getFlagIndexForChunk( ChunkPos(player->xChunk,player->zChunk), player->level->dimension->id ) ) ) + { + player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot, false); + // Force sending of the current chunk + player->doTick(true, true, true); + } - oldLevel->removeEntityImmediately(player); - player->removed = false; + player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); - double xt = player->x; - double zt = player->z; - double scale = newLevel->getLevelData()->getHellScale(); // 4J Scale was 8 but this is all we can fit in - if (player->dimension == -1) + // 4J Stu - Fix for #64683 - Customer Encountered: TU7: Content: Gameplay: Potion effects are removed after using the Nether Portal + vector *activeEffects = player->getActiveEffects(); + for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) { - xt /= scale; - zt /= scale; - player->moveTo(xt, player->y, zt, player->yRot, player->xRot); - if (player->isAlive()) + MobEffectInstance *effect = *it; + + player->connection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); + } + delete activeEffects; + player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); + + sendLevelInfo(player, newLevel); + sendAllPlayerInfo(player); +} + +void PlayerList::repositionAcrossDimension(shared_ptr entity, int lastDimension, ServerLevel *oldLevel, ServerLevel *newLevel) +{ + double xt = entity->x; + double zt = entity->z; + double xOriginal = entity->x; + double yOriginal = entity->y; + double zOriginal = entity->z; + float yRotOriginal = entity->yRot; + double scale = newLevel->getLevelData()->getHellScale(); // 4J Scale was 8 but this is all we can fit in + if (entity->dimension == -1) + { + xt /= scale; + zt /= scale; + entity->moveTo(xt, entity->y, zt, entity->yRot, entity->xRot); + if (entity->isAlive()) { - oldLevel->tick(player, false); - } - } - else if (player->dimension == 0) - { - xt *= scale; - zt *= scale; - player->moveTo(xt, player->y, zt, player->yRot, player->xRot); - if (player->isAlive()) + oldLevel->tick(entity, false); + } + } + else if (entity->dimension == 0) + { + xt *= scale; + zt *= scale; + entity->moveTo(xt, entity->y, zt, entity->yRot, entity->xRot); + if (entity->isAlive()) { - oldLevel->tick(player, false); - } - } + oldLevel->tick(entity, false); + } + } else { - Pos *p = newLevel->getDimensionSpecificSpawn(); + Pos *p; + + if (lastDimension == 1) + { + // Coming from the end + p = newLevel->getSharedSpawnPos(); + } + else + { + // Going to the end + p = newLevel->getDimensionSpecificSpawn(); + } xt = p->x; - player->y = p->y; + entity->y = p->y; zt = p->z; delete p; - player->moveTo(xt, player->y, zt, 90, 0); - if (player->isAlive()) + entity->moveTo(xt, entity->y, zt, 90, 0); + if (entity->isAlive()) { - oldLevel->tick(player, false); + oldLevel->tick(entity, false); } } - - removePlayerFromReceiving(player, false, lastDimension); - addPlayerToReceiving(player); - if (lastDimension == 1) + if(entity->GetType() == eTYPE_SERVERPLAYER) { + shared_ptr player = dynamic_pointer_cast(entity); + removePlayerFromReceiving(player, false, lastDimension); + addPlayerToReceiving(player); } - else + + if (lastDimension != 1) { xt = (double) Mth::clamp((int) xt, -Level::MAX_LEVEL_SIZE + 128, Level::MAX_LEVEL_SIZE - 128); zt = (double) Mth::clamp((int) zt, -Level::MAX_LEVEL_SIZE + 128, Level::MAX_LEVEL_SIZE - 128); - if (player->isAlive()) + if (entity->isAlive()) { - newLevel->addEntity(player); - player->moveTo(xt, player->y, zt, player->yRot, player->xRot); - newLevel->tick(player, false); + newLevel->addEntity(entity); + entity->moveTo(xt, entity->y, zt, entity->yRot, entity->xRot); + newLevel->tick(entity, false); newLevel->cache->autoCreate = true; - (new PortalForcer())->force(newLevel, player); + newLevel->getPortalForcer()->force(entity, xOriginal, yOriginal, zOriginal, yRotOriginal); newLevel->cache->autoCreate = false; } } - - player->setLevel(newLevel); - changeDimension(player, oldLevel); - - player->gameMode->setLevel(newLevel); - - // Resend the teleport if we haven't yet sent the chunk they will land on - if( !g_NetworkManager.SystemFlagGet(player->connection->getNetworkPlayer(),ServerPlayer::getFlagIndexForChunk( ChunkPos(player->xChunk,player->zChunk), player->level->dimension->id ) ) ) - { - player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot, false); - // Force sending of the current chunk - player->doTick(true, true, true); - } - - player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); - - // 4J Stu - Fix for #64683 - Customer Encountered: TU7: Content: Gameplay: Potion effects are removed after using the Nether Portal - vector *activeEffects = player->getActiveEffects(); - for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) - { - MobEffectInstance *effect = *it; - - player->connection->send(shared_ptr( new UpdateMobEffectPacket(player->entityId, effect) ) ); - } - delete activeEffects; - player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); - - sendLevelInfo(player, newLevel); - sendAllPlayerInfo(player); + entity->setLevel(newLevel); } void PlayerList::tick() { // 4J - brought changes to how often this is sent forward from 1.2.3 - if (++sendAllPlayerInfoIn > SEND_PLAYER_INFO_INTERVAL) + if (++sendAllPlayerInfoIn > SEND_PLAYER_INFO_INTERVAL) { - sendAllPlayerInfoIn = 0; - } + sendAllPlayerInfoIn = 0; + } if (sendAllPlayerInfoIn < players.size()) { @@ -879,7 +958,7 @@ void PlayerList::tick() { if( selectedPlayer->IsLocal() != TRUE ) { -//#ifdef _XBOX + //#ifdef _XBOX PlayerUID xuid = selectedPlayer->GetUID(); // Kick this player from the game shared_ptr player = nullptr; @@ -903,7 +982,7 @@ void PlayerList::tick() player->connection->setWasKicked(); player->connection->send( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Kicked) )); } -//#endif + //#endif } } } @@ -941,31 +1020,31 @@ void PlayerList::prioritiseTileChanges(int x, int y, int z, int dimension) void PlayerList::broadcastAll(shared_ptr packet) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr player = players[i]; - player->connection->send(packet); - } + shared_ptr player = players[i]; + player->connection->send(packet); + } } void PlayerList::broadcastAll(shared_ptr packet, int dimension) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr player = players[i]; - if (player->dimension == dimension) player->connection->send(packet); - } + shared_ptr player = players[i]; + if (player->dimension == dimension) player->connection->send(packet); + } } wstring PlayerList::getPlayerNames() { - wstring msg; - for (unsigned int i = 0; i < players.size(); i++) + wstring msg; + for (unsigned int i = 0; i < players.size(); i++) { - if (i > 0) msg += L", "; - msg += players[i]->name; - } - return msg; + if (i > 0) msg += L", "; + msg += players[i]->name; + } + return msg; } bool PlayerList::isWhiteListed(const wstring& name) @@ -991,38 +1070,145 @@ bool PlayerList::isOp(shared_ptr player) shared_ptr PlayerList::getPlayer(const wstring& name) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr p = players[i]; - if (p->name == name) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway + shared_ptr p = players[i]; + if (p->name == name) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway { - return p; - } - } - return nullptr; + return p; + } + } + return nullptr; } // 4J Added shared_ptr PlayerList::getPlayer(PlayerUID uid) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr p = players[i]; - if (p->getXuid() == uid || p->getOnlineXuid() == uid) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway + shared_ptr p = players[i]; + if (p->getXuid() == uid || p->getOnlineXuid() == uid) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway { - return p; - } - } - return nullptr; + return p; + } + } + return nullptr; +} + +shared_ptr PlayerList::getNearestPlayer(Pos *position, int range) +{ + if (players.empty()) return nullptr; + if (position == NULL) return players.at(0); + shared_ptr current = nullptr; + double dist = -1; + int rangeSqr = range * range; + + for (int i = 0; i < players.size(); i++) + { + shared_ptr next = players.at(i); + double newDist = position->distSqr(next->getCommandSenderWorldPosition()); + + if ((dist == -1 || newDist < dist) && (range <= 0 || newDist <= rangeSqr)) + { + dist = newDist; + current = next; + } + } + + return current; +} + +vector *PlayerList::getPlayers(Pos *position, int rangeMin, int rangeMax, int count, int mode, int levelMin, int levelMax, unordered_map *scoreRequirements, const wstring &playerName, const wstring &teamName, Level *level) +{ + app.DebugPrintf("getPlayers NOT IMPLEMENTED!"); + return NULL; + + /*if (players.empty()) return NULL; + vector > result = new vector >(); + bool reverse = count < 0; + bool playerNameNot = !playerName.empty() && playerName.startsWith("!"); + bool teamNameNot = !teamName.empty() && teamName.startsWith("!"); + int rangeMinSqr = rangeMin * rangeMin; + int rangeMaxSqr = rangeMax * rangeMax; + count = Mth.abs(count); + + if (playerNameNot) playerName = playerName.substring(1); + if (teamNameNot) teamName = teamName.substring(1); + + for (int i = 0; i < players.size(); i++) { + ServerPlayer player = players.get(i); + + if (level != null && player.level != level) continue; + if (playerName != null) { + if (playerNameNot == playerName.equalsIgnoreCase(player.getAName())) continue; + } + if (teamName != null) { + Team team = player.getTeam(); + String actualName = team == null ? "" : team.getName(); + if (teamNameNot == teamName.equalsIgnoreCase(actualName)) continue; + } + + if (position != null && (rangeMin > 0 || rangeMax > 0)) { + float distance = position.distSqr(player.getCommandSenderWorldPosition()); + if (rangeMin > 0 && distance < rangeMinSqr) continue; + if (rangeMax > 0 && distance > rangeMaxSqr) continue; + } + + if (!meetsScoreRequirements(player, scoreRequirements)) continue; + + if (mode != GameType.NOT_SET.getId() && mode != player.gameMode.getGameModeForPlayer().getId()) continue; + if (levelMin > 0 && player.experienceLevel < levelMin) continue; + if (player.experienceLevel > levelMax) continue; + + result.add(player); + } + + if (position != null) Collections.sort(result, new PlayerDistanceComparator(position)); + if (reverse) Collections.reverse(result); + if (count > 0) result = result.subList(0, Math.min(count, result.size())); + + return result;*/ +} + +bool PlayerList::meetsScoreRequirements(shared_ptr player, unordered_map scoreRequirements) +{ + app.DebugPrintf("meetsScoreRequirements NOT IMPLEMENTED!"); + return false; + + //if (scoreRequirements == null || scoreRequirements.size() == 0) return true; + + //for (Map.Entry requirement : scoreRequirements.entrySet()) { + // String name = requirement.getKey(); + // boolean min = false; + + // if (name.endsWith("_min") && name.length() > 4) { + // min = true; + // name = name.substring(0, name.length() - 4); + // } + + // Scoreboard scoreboard = player.getScoreboard(); + // Objective objective = scoreboard.getObjective(name); + // if (objective == null) return false; + // Score score = player.getScoreboard().getPlayerScore(player.getAName(), objective); + // int value = score.getScore(); + + // if (value < requirement.getValue() && min) { + // return false; + // } else if (value > requirement.getValue() && !min) { + // return false; + // } + //} + + //return true; } void PlayerList::sendMessage(const wstring& name, const wstring& message) { - shared_ptr player = getPlayer(name); - if (player != NULL) + shared_ptr player = getPlayer(name); + if (player != NULL) { - player->connection->send( shared_ptr( new ChatPacket(message) ) ); - } + player->connection->send( shared_ptr( new ChatPacket(message) ) ); + } } void PlayerList::broadcast(double x, double y, double z, double range, int dimension, shared_ptr packet) @@ -1040,11 +1226,11 @@ void PlayerList::broadcast(shared_ptr except, double x, double y, double sentTo.push_back(dynamic_pointer_cast(except)); } - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr p = players[i]; - if (p == except) continue; - if (p->dimension != dimension) continue; + shared_ptr p = players[i]; + if (p == except) continue; + if (p->dimension != dimension) continue; // 4J - don't send to the same machine more than once bool dontSend = false; @@ -1074,10 +1260,10 @@ void PlayerList::broadcast(shared_ptr except, double x, double y, double } - double xd = x - p->x; - double yd = y - p->y; - double zd = z - p->z; - if (xd * xd + yd * yd + zd * zd < range * range) + double xd = x - p->x; + double yd = y - p->y; + double zd = z - p->z; + if (xd * xd + yd * yd + zd * zd < range * range) { #if 0 // _DEBUG shared_ptr SoundPacket= dynamic_pointer_cast(packet); @@ -1090,35 +1276,11 @@ void PlayerList::broadcast(shared_ptr except, double x, double y, double app.DebugPrintf("\n"); } #endif - p->connection->send(packet); + p->connection->send(packet); sentTo.push_back( p ); - } - } - -} - -void PlayerList::broadcastToAllOps(const wstring& message) -{ - shared_ptr chatPacket = shared_ptr( new ChatPacket(message) ); - for (unsigned int i = 0; i < players.size(); i++) - { - shared_ptr p = players[i]; - if (isOp(p->name)) - { - p->connection->send(chatPacket); - } - } -} + } + } -bool PlayerList::sendTo(const wstring& name, shared_ptr packet) -{ - shared_ptr player = getPlayer(name); - if (player != NULL) - { - player->connection->send(packet); - return true; - } - return false; } void PlayerList::saveAll(ProgressListener *progressListener, bool bDeleteGuestMaps /*= false*/) @@ -1131,7 +1293,7 @@ void PlayerList::saveAll(ProgressListener *progressListener, bool bDeleteGuestMa for (unsigned int i = 0; i < players.size(); i++) { playerIo->save(players[i]); - + //4J Stu - We don't want to save the map data for guests, so when we are sure that the player is gone delete the map if(bDeleteGuestMaps && players[i]->isGuest()) playerIo->deleteMapFilesForPlayer(players[i]); @@ -1156,16 +1318,16 @@ void PlayerList::reloadWhitelist() void PlayerList::sendLevelInfo(shared_ptr player, ServerLevel *level) { - player->connection->send( shared_ptr( new SetTimePacket(level->getTime()) ) ); - if (level->isRaining()) + player->connection->send( shared_ptr( new SetTimePacket(level->getGameTime(), level->getDayTime(), level->getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT)) ) ); + if (level->isRaining()) { - player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); - } + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); + } else { // 4J Stu - Fix for #44836 - Customer Encountered: Out of Sync Weather [A-10] // If it was raining when the player left the level, and is now not raining we need to make sure that state is updated - player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); } // send the stronghold position if there is one @@ -1177,8 +1339,9 @@ void PlayerList::sendLevelInfo(shared_ptr player, ServerLevel *lev void PlayerList::sendAllPlayerInfo(shared_ptr player) { - player->refreshContainer(player->inventoryMenu); - player->resetSentInfo(); + player->refreshContainer(player->inventoryMenu); + player->resetSentInfo(); + player->connection->send( shared_ptr( new SetCarriedItemPacket(player->inventory->selected)) ); } int PlayerList::getPlayerCount() @@ -1215,7 +1378,7 @@ int PlayerList::getViewDistance() void PlayerList::setOverrideGameMode(GameType *gameMode) { - this->overrideGameMode = gameMode; + overrideGameMode = gameMode; } void PlayerList::updatePlayerGameMode(shared_ptr newPlayer, shared_ptr oldPlayer, Level *level) @@ -1389,7 +1552,7 @@ void PlayerList::addPlayerToReceiving(shared_ptr player) } } } - + if( shouldAddPlayer ) { #ifndef _CONTENT_PACKAGE diff --git a/Minecraft.Client/PlayerList.h b/Minecraft.Client/PlayerList.h index 14bd6b2d..6a6ee94c 100644 --- a/Minecraft.Client/PlayerList.h +++ b/Minecraft.Client/PlayerList.h @@ -13,6 +13,7 @@ class TileEntity; class ProgressListener; class GameType; class LoginPacket; +class ServerScoreboard; using namespace std; @@ -64,10 +65,15 @@ public: PlayerList(MinecraftServer *server); ~PlayerList(); void placeNewPlayer(Connection *connection, shared_ptr player, shared_ptr packet); + +protected: + void updateEntireScoreboard(ServerScoreboard *scoreboard, shared_ptr player); + +public: void setLevel(ServerLevelArray levels); void changeDimension(shared_ptr player, ServerLevel *from); int getMaxRange(); - bool load(shared_ptr player); // 4J Changed return val to bool to check if new player or loaded player + CompoundTag *load(shared_ptr player); protected: void save(shared_ptr player); public: @@ -78,6 +84,7 @@ public: shared_ptr getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID OnlineXuid); shared_ptr respawn(shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData); void toggleDimension(shared_ptr player, int targetDimension); + void repositionAcrossDimension(shared_ptr entity, int lastDimension, ServerLevel *oldLevel, ServerLevel *newLevel); void tick(); bool isTrackingTile(int x, int y, int z, int dimension); // 4J added void prioritiseTileChanges(int x, int y, int z, int dimension); // 4J added @@ -92,11 +99,16 @@ public: bool isOp(shared_ptr player); // 4J Added shared_ptr getPlayer(const wstring& name); shared_ptr getPlayer(PlayerUID uid); + shared_ptr getNearestPlayer(Pos *position, int range); + vector *getPlayers(Pos *position, int rangeMin, int rangeMax, int count, int mode, int levelMin, int levelMax, unordered_map *scoreRequirements, const wstring &playerName, const wstring &teamName, Level *level); + +private: + bool meetsScoreRequirements(shared_ptr player, unordered_map scoreRequirements); + +public: void sendMessage(const wstring& name, const wstring& message); void broadcast(double x, double y, double z, double range, int dimension, shared_ptr packet); void broadcast(shared_ptr except, double x, double y, double z, double range, int dimension, shared_ptr packet); - void broadcastToAllOps(const wstring& message); - bool sendTo(const wstring& name, shared_ptr packet); // 4J Added ProgressListener *progressListener param and bDeleteGuestMaps param void saveAll(ProgressListener *progressListener, bool bDeleteGuestMaps = false); void whiteList(const wstring& playerName); diff --git a/Minecraft.Client/PlayerRenderer.cpp b/Minecraft.Client/PlayerRenderer.cpp index c332b41c..7d135c2b 100644 --- a/Minecraft.Client/PlayerRenderer.cpp +++ b/Minecraft.Client/PlayerRenderer.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "PlayerRenderer.h" #include "SkullTileRenderer.h" +#include "HumanoidMobRenderer.h" #include "HumanoidModel.h" #include "ModelPart.h" #include "LocalPlayer.h" @@ -27,9 +28,9 @@ const unsigned int PlayerRenderer::s_nametagColors[MINECRAFT_NET_MAX_PLAYERS] = #endif }; -const wstring PlayerRenderer::MATERIAL_NAMES[5] = { L"cloth", L"chain", L"iron", L"diamond", L"gold" }; +ResourceLocation PlayerRenderer::DEFAULT_LOCATION = ResourceLocation(TN_MOB_CHAR); -PlayerRenderer::PlayerRenderer() : MobRenderer( new HumanoidModel(0), 0.5f ) +PlayerRenderer::PlayerRenderer() : LivingEntityRenderer( new HumanoidModel(0), 0.5f ) { humanoidModel = (HumanoidModel *) model; @@ -46,7 +47,7 @@ unsigned int PlayerRenderer::getNametagColour(int index) return 0xFF000000; } -int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) +int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr player = dynamic_pointer_cast(_player); @@ -65,7 +66,7 @@ int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) if (dynamic_cast(item)) { ArmorItem *armorItem = dynamic_cast(item); - bindTexture(L"armor/" + MATERIAL_NAMES[armorItem->modelIndex] + L"_" + _toString(layer == 2 ? 2 : 1) + L".png"); + bindTexture(HumanoidMobRenderer::getArmorLocation(armorItem, layer)); HumanoidModel *armor = layer == 2 ? armorParts2 : armorParts1; @@ -108,7 +109,7 @@ int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) } -void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, int layer, float a) +void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr player = dynamic_pointer_cast(_player); @@ -119,7 +120,7 @@ void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, int layer, if (dynamic_cast(item)) { ArmorItem *armorItem = dynamic_cast(item); - bindTexture(L"armor/" + MATERIAL_NAMES[armorItem->modelIndex] + L"_" + _toString(layer == 2 ? 2 : 1) + L"_b.png"); + bindTexture(HumanoidMobRenderer::getArmorLocation((ArmorItem *)item, layer, true)); float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->getBrightness(a); glColor3f(brightness, brightness, brightness); @@ -169,7 +170,7 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = mob->isSneaking(); double yp = y - mob->heightOffset; - if (mob->isSneaking() && (dynamic_pointer_cast(mob) == NULL)) + if (mob->isSneaking() && !mob->instanceof(eTYPE_LOCALPLAYER)) { yp -= 2 / 16.0f; } @@ -210,7 +211,7 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double } } - MobRenderer::render(mob, x, yp, z, rot, a); + LivingEntityRenderer::render(mob, x, yp, z, rot, a); // turn them off again if(pAdditionalModelParts && pAdditionalModelParts->size()!=0) @@ -228,97 +229,13 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double } -void PlayerRenderer::renderName(shared_ptr _mob, double x, double y, double z) +void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) { - // 4J - dynamic cast required because we aren't using templates/generics in our version - shared_ptr mob = dynamic_pointer_cast(_mob); - - if (Minecraft::renderNames() && mob != entityRenderDispatcher->cameraEntity - && !mob->isInvisibleTo(Minecraft::GetInstance()->player) ) // 4J-JEV: Todo, move to LivingEntityRenderer. - { - float size = 1.60f; - float s = 1 / 60.0f * size; - double dist = mob->distanceToSqr(entityRenderDispatcher->cameraEntity); - - float maxDist = mob->isSneaking() ? 32.0f : 64.0f; - - if (dist < maxDist * maxDist) - { - // Truncate display names longer than 16 char - wstring msg = mob->getDisplayName(); - if (msg.length() > 16) - { - msg.resize(16); - msg += L"..."; - } - - if (mob->isSneaking()) - { - if ( app.GetGameSettings(eGameSetting_DisplayHUD)==0 ) - { - // 4J-PB - turn off gamertag render - return; - } - - if(app.GetGameHostOption(eGameHostOption_Gamertags)==0) - { - // turn off gamertags if the host has set them off - return; - } - - Font *font = getFont(); - glPushMatrix(); - glTranslatef((float) x + 0, (float) y + 2.3f, (float) z); - glNormal3f(0, 1, 0); - - glRotatef(-this->entityRenderDispatcher->playerRotY, 0, 1, 0); - glRotatef(this->entityRenderDispatcher->playerRotX, 1, 0, 0); - - glScalef(-s, -s, s); - glDisable(GL_LIGHTING); - - glTranslatef(0, (float) 0.25f / s, 0); - glDepthMask(false); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - Tesselator *t = Tesselator::getInstance(); - - glDisable(GL_TEXTURE_2D); - t->begin(); - int w = font->width(msg) / 2; - t->color(0.0f, 0.0f, 0.0f, 0.25f); - t->vertex((float)(-w - 1), (float)( -1), (float)( 0)); - t->vertex((float)(-w - 1), (float)( +8), (float)( 0)); - t->vertex((float)(+w + 1), (float)( +8), (float)( 0)); - t->vertex((float)(+w + 1), (float)( -1), (float)( 0)); - t->end(); - glEnable(GL_TEXTURE_2D); - glDepthMask(true); - font->draw(msg, -font->width(msg) / 2, 0, 0x20ffffff); - glEnable(GL_LIGHTING); - glDisable(GL_BLEND); - glColor4f(1, 1, 1, 1); - glPopMatrix(); - } - else - { - if (mob->isSleeping()) - { - renderNameTag(mob, msg, x, y - 1.5f, z, 64, s_nametagColors[mob->getPlayerIndex()]); - } - else - { - renderNameTag(mob, msg, x, y, z, 64, s_nametagColors[mob->getPlayerIndex()]); - } - } - } - } + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : _mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); -} - -void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) -{ - MobRenderer::additionalRendering(_mob,a); + LivingEntityRenderer::additionalRendering(_mob,a); + LivingEntityRenderer::renderArrows(_mob, a); // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -344,7 +261,7 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) glScalef(s, -s, s); } - this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, headGear, 0); + entityRenderDispatcher->itemInHandRenderer->renderItem(mob, headGear, 0); } else if (headGear->getItem()->id == Item::skull_Id) { @@ -384,9 +301,12 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) glPopMatrix(); } } -//4J-PB -// if (bindTexture(mob->cloakTexture, L"" )) - if (bindTexture(mob->customTextureUrl2, L"" ) && !mob->isInvisible()) + + // 4J: removed + /*boolean loaded = mob->getCloakTexture()->isLoaded(); + boolean b1 = !mob->isInvisible(); + boolean b2 = !mob->isCapeHidden();*/ + if (bindTexture(mob->customTextureUrl2, L"") && !mob->isInvisible()) { glPushMatrix(); glTranslatef(0, 0, 2 / 16.0f); @@ -427,7 +347,6 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) glPopMatrix(); } - shared_ptr item = mob->inventory->getSelected(); if (item != NULL) @@ -454,7 +373,7 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) s *= 0.75f; glRotatef(20, 1, 0, 0); glRotatef(45, 0, 1, 0); - glScalef(s, -s, s); + glScalef(-s, -s, s); } else if (item->id == Item::bow->id) { @@ -513,15 +432,49 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) } else { + int col = item->getItem()->getColor(item, 0); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + glColor4f(red, g, b, 1); this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); } glPopMatrix(); + } +} + +void PlayerRenderer::renderNameTags(shared_ptr player, double x, double y, double z, wstring msg, float scale, double dist) +{ +#if 0 + if (dist < 10 * 10) + { + Scoreboard *scoreboard = player->getScoreboard(); + Objective *objective = scoreboard->getDisplayObjective(Scoreboard::DISPLAY_SLOT_BELOW_NAME); + + if (objective != NULL) + { + Score *score = scoreboard->getPlayerScore(player->getAName(), objective); + + if (player->isSleeping()) + { + renderNameTag(player, score->getScore() + " " + objective->getDisplayName(), x, y - 1.5f, z, 64); + } + else + { + renderNameTag(player, score->getScore() + " " + objective->getDisplayName(), x, y, z, 64); + } + + y += getFont()->lineHeight * 1.15f * scale; + } } +#endif + LivingEntityRenderer::renderNameTags(player, x, y, z, msg, scale, dist); } -void PlayerRenderer::scale(shared_ptr player, float a) +void PlayerRenderer::scale(shared_ptr player, float a) { float s = 15 / 16.0f; glScalef(s, s, s); @@ -529,10 +482,13 @@ void PlayerRenderer::scale(shared_ptr player, float a) void PlayerRenderer::renderHand() { + float brightness = 1; + glColor3f(brightness, brightness, brightness); + humanoidModel->m_uiAnimOverrideBitmask = Minecraft::GetInstance()->player->getAnimOverrideBitmask(); armorParts1->eating = armorParts2->eating = humanoidModel->eating = humanoidModel->idle = false; humanoidModel->attackTime = 0; - humanoidModel->setupAnim(0, 0, 0, 0, 0, 1 / 16.0f); + humanoidModel->setupAnim(0, 0, 0, 0, 0, 1 / 16.0f, Minecraft::GetInstance()->player); // 4J-PB - does this skin have its arm0 disabled? (Dalek, etc) if((humanoidModel->m_uiAnimOverrideBitmask&(1< _mob, double x, double y, double z) +void PlayerRenderer::setupPosition(shared_ptr _mob, double x, double y, double z) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); if (mob->isAlive() && mob->isSleeping()) { - MobRenderer::setupPosition(mob, x + mob->bedOffsetX, y + mob->bedOffsetY, z + mob->bedOffsetZ); + LivingEntityRenderer::setupPosition(mob, x + mob->bedOffsetX, y + mob->bedOffsetY, z + mob->bedOffsetZ); } else { - MobRenderer::setupPosition(mob, x, y, z); + if(mob->isRiding() && (mob->getAnimOverrideBitmask()&(1< _mob, float bob, float bodyRot, float a) +void PlayerRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -569,7 +529,7 @@ void PlayerRenderer::setupRotations(shared_ptr _mob, float bob, float bodyR } else { - MobRenderer::setupRotations(mob, bob, bodyRot, a); + LivingEntityRenderer::setupRotations(mob, bob, bodyRot, a); } } @@ -583,3 +543,16 @@ void PlayerRenderer::renderShadow(shared_ptr e, double x, double y, doub } EntityRenderer::renderShadow(e,x,y,z,pow,a); } + +// 4J Added override +void PlayerRenderer::bindTexture(shared_ptr entity) +{ + shared_ptr player = dynamic_pointer_cast(entity); + bindTexture(player->customTextureUrl, player->getTexture()); +} + +ResourceLocation *PlayerRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr player = dynamic_pointer_cast(entity); + return new ResourceLocation((_TEXTURE_NAME)player->getTexture()); +} \ No newline at end of file diff --git a/Minecraft.Client/PlayerRenderer.h b/Minecraft.Client/PlayerRenderer.h index 10564104..25c32a30 100644 --- a/Minecraft.Client/PlayerRenderer.h +++ b/Minecraft.Client/PlayerRenderer.h @@ -1,11 +1,17 @@ #pragma once #include "MobRenderer.h" #include "..\Minecraft.World\Player.h" + class HumanoidModel; + using namespace std; -class PlayerRenderer : public MobRenderer +class PlayerRenderer : public LivingEntityRenderer { +public: + // 4J: Made public for use in skull renderer + static ResourceLocation DEFAULT_LOCATION; + private: // 4J Added static const unsigned int s_nametagColors[MINECRAFT_NET_MAX_PLAYERS]; @@ -23,20 +29,30 @@ private: static const wstring MATERIAL_NAMES[5]; protected: - virtual int prepareArmor(shared_ptr _player, int layer, float a); - virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); + virtual int prepareArmor(shared_ptr _player, int layer, float a); + virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); + public: virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + protected: - virtual void renderName(shared_ptr _mob, double x, double y, double z); - virtual void additionalRendering(shared_ptr _mob, float a); - virtual void scale(shared_ptr _player, float a); + virtual void additionalRendering(shared_ptr _mob, float a); + void renderNameTags(shared_ptr player, double x, double y, double z, wstring msg, float scale, double dist); + + virtual void scale(shared_ptr _player, float a); public: void renderHand(); + protected: - virtual void setupPosition(shared_ptr _mob, double x, double y, double z); - virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + virtual void setupPosition(shared_ptr _mob, double x, double y, double z); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); private: virtual void renderShadow(shared_ptr e, double x, double y, double z, float pow, float a); // 4J Added override + +public: + virtual ResourceLocation *getTextureLocation(shared_ptr entity); + + using LivingEntityRenderer::bindTexture; + virtual void bindTexture(shared_ptr entity); // 4J Added override }; \ No newline at end of file diff --git a/Minecraft.Client/PreStitchedTextureMap.cpp b/Minecraft.Client/PreStitchedTextureMap.cpp index b6c22223..5ea7bc59 100644 --- a/Minecraft.Client/PreStitchedTextureMap.cpp +++ b/Minecraft.Client/PreStitchedTextureMap.cpp @@ -30,15 +30,15 @@ PreStitchedTextureMap::PreStitchedTextureMap(int type, const wstring &name, cons stitchResult = NULL; m_mipMap = mipmap; - missingPosition = (StitchedTexture *)(new SimpleIcon(NAME_MISSING_TEXTURE,0,0,1,1)); + missingPosition = (StitchedTexture *)(new SimpleIcon(NAME_MISSING_TEXTURE,NAME_MISSING_TEXTURE,0,0,1,1)); } void PreStitchedTextureMap::stitch() { // Animated StitchedTextures store a vector of textures for each frame of the animation. Free any pre-existing ones here. - for(AUTO_VAR(it, texturesToAnimate.begin()); it != texturesToAnimate.end(); ++it) + for(AUTO_VAR(it, animatedTextures.begin()); it != animatedTextures.end(); ++it) { - StitchedTexture *animatedStitchedTexture = (StitchedTexture *)texturesByName[it->first]; + StitchedTexture *animatedStitchedTexture = *it; animatedStitchedTexture->freeFrameTextures(); } @@ -88,6 +88,24 @@ void PreStitchedTextureMap::stitch() MemSect(32); wstring drive = L""; + + // 4J-PB - need to check for BD patched files +#ifdef __PS3__ + const char *pchName=wstringtofilename(filename); + if(app.GetBootedFromDiscPatch() && app.IsFileInPatchList(pchName)) + { + if(texturePack->hasFile(L"res/" + filename,false)) + { + drive = texturePack->getPath(true,pchName); + } + else + { + drive = Minecraft::GetInstance()->skins->getDefault()->getPath(true,pchName); + texturePack = Minecraft::GetInstance()->skins->getDefault(); + } + } + else +#endif if(texturePack->hasFile(L"res/" + filename,false)) { drive = texturePack->getPath(true); @@ -97,6 +115,7 @@ void PreStitchedTextureMap::stitch() drive = Minecraft::GetInstance()->skins->getDefault()->getPath(true); texturePack = Minecraft::GetInstance()->skins->getDefault(); } + //BufferedImage *image = new BufferedImage(texturePack->getResource(L"/" + filename),false,true,drive); //ImageIO::read(texturePack->getResource(L"/" + filename)); BufferedImage *image = texturePack->getImageResource(filename, false, true, drive); MemSect(0); @@ -127,47 +146,11 @@ void PreStitchedTextureMap::stitch() } MemSect(52); - for(AUTO_VAR(it, texturesToAnimate.begin()); it != texturesToAnimate.end(); ++it) + for(AUTO_VAR(it, texturesByName.begin()); it != texturesByName.end(); ++it) { - wstring textureName = it->first; - wstring textureFileName = it->second; - - StitchedTexture *preStitched = (StitchedTexture *)texturesByName[textureName]; - - if(!preStitched->hasOwnData()) - { - if(preStitched->getFrames() > 1) animatedTextures.push_back(preStitched); - continue; - } - - wstring filename = path + textureFileName + extension; - - // TODO: [EB] Put the frames into a proper object, not this inside out hack - vector *frames = TextureManager::getInstance()->createTextures(filename, m_mipMap); - if (frames == NULL || frames->empty()) - { - continue; // Couldn't load a texture, skip it - } - - Texture *first = frames->at(0); - -#ifndef _CONTENT_PACKAGE - if(first->getWidth() != preStitched->getWidth() || first->getHeight() != preStitched->getHeight()) - { - __debugbreak(); - } -#endif - - preStitched->init(stitchResult, frames, preStitched->getX(), preStitched->getY(), first->getWidth(), first->getHeight(), false); - - if (frames->size() > 1) - { - animatedTextures.push_back(preStitched); + StitchedTexture *preStitched = (StitchedTexture *)(it->second); - wstring animString = texturePack->getAnimationString(textureFileName, path, true); - - preStitched->loadAnimationFrames(animString); - } + makeTextureAnimated(texturePack, preStitched); } MemSect(0); //missingPosition = (StitchedTexture *)texturesByName.find(NAME_MISSING_TEXTURE)->second; @@ -216,6 +199,50 @@ void PreStitchedTextureMap::stitch() #endif } +void PreStitchedTextureMap::makeTextureAnimated(TexturePack *texturePack, StitchedTexture *tex) +{ + if(!tex->hasOwnData()) + { + animatedTextures.push_back(tex); + return; + } + + wstring textureFileName = tex->m_fileName; + + wstring animString = texturePack->getAnimationString(textureFileName, path, true); + + if(!animString.empty()) + { + wstring filename = path + textureFileName + extension; + + // TODO: [EB] Put the frames into a proper object, not this inside out hack + vector *frames = TextureManager::getInstance()->createTextures(filename, m_mipMap); + if (frames == NULL || frames->empty()) + { + return; // Couldn't load a texture, skip it + } + + Texture *first = frames->at(0); + +#ifndef _CONTENT_PACKAGE + if(first->getWidth() != tex->getWidth() || first->getHeight() != tex->getHeight()) + { + app.DebugPrintf("%ls - first w - %d, h - %d, tex w - %d, h - %d\n",textureFileName.c_str(),first->getWidth(),tex->getWidth(),first->getHeight(),tex->getHeight()); + //__debugbreak(); + } +#endif + + tex->init(stitchResult, frames, tex->getX(), tex->getY(), first->getWidth(), first->getHeight(), false); + + if (frames->size() > 1) + { + animatedTextures.push_back(tex); + + tex->loadAnimationFrames(animString); + } + } +} + StitchedTexture *PreStitchedTextureMap::getTexture(const wstring &name) { #ifndef _CONTENT_PACKAGE @@ -265,7 +292,7 @@ Icon *PreStitchedTextureMap::registerIcon(const wstring &name) if (result == NULL) { #ifndef _CONTENT_PACKAGE - wprintf(L"Could not find uv data for icon %ls\n", name.c_str() ); + app.DebugPrintf("Could not find uv data for icon %ls\n", name.c_str() ); __debugbreak(); #endif result = missingPosition; @@ -284,6 +311,10 @@ Icon *PreStitchedTextureMap::getMissingIcon() return missingPosition; } +#define ADD_ICON(row, column, name) (texturesByName[name] = new SimpleIcon(name,name,horizRatio*column,vertRatio*row,horizRatio*(column+1),vertRatio*(row+1))); +#define ADD_ICON_WITH_NAME(row, column, name, filename) (texturesByName[name] = new SimpleIcon(name,filename,horizRatio*column,vertRatio*row,horizRatio*(column+1),vertRatio*(row+1))); +#define ADD_ICON_SIZE(row, column, name, height, width) (texturesByName[name] = new SimpleIcon(name,name,horizRatio*column,vertRatio*row,horizRatio*(column+width),vertRatio*(row+height))); + void PreStitchedTextureMap::loadUVs() { if(!texturesByName.empty()) @@ -299,233 +330,263 @@ void PreStitchedTextureMap::loadUVs() delete it->second; } texturesByName.clear(); - texturesToAnimate.clear(); - float slotSize = 1.0f/16.0f; if(iconType != Icon::TYPE_TERRAIN) { - texturesByName.insert(stringIconMap::value_type(L"helmetCloth",new SimpleIcon(L"helmetCloth",slotSize*0,slotSize*0,slotSize*(0+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"helmetChain",new SimpleIcon(L"helmetChain",slotSize*1,slotSize*0,slotSize*(1+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"helmetIron",new SimpleIcon(L"helmetIron",slotSize*2,slotSize*0,slotSize*(2+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"helmetDiamond",new SimpleIcon(L"helmetDiamond",slotSize*3,slotSize*0,slotSize*(3+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"helmetGold",new SimpleIcon(L"helmetGold",slotSize*4,slotSize*0,slotSize*(4+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"flintAndSteel",new SimpleIcon(L"flintAndSteel",slotSize*5,slotSize*0,slotSize*(5+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"flint",new SimpleIcon(L"flint",slotSize*6,slotSize*0,slotSize*(6+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"coal",new SimpleIcon(L"coal",slotSize*7,slotSize*0,slotSize*(7+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"string",new SimpleIcon(L"string",slotSize*8,slotSize*0,slotSize*(8+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"seeds",new SimpleIcon(L"seeds",slotSize*9,slotSize*0,slotSize*(9+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"apple",new SimpleIcon(L"apple",slotSize*10,slotSize*0,slotSize*(10+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"appleGold",new SimpleIcon(L"appleGold",slotSize*11,slotSize*0,slotSize*(11+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"egg",new SimpleIcon(L"egg",slotSize*12,slotSize*0,slotSize*(12+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"sugar",new SimpleIcon(L"sugar",slotSize*13,slotSize*0,slotSize*(13+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"snowball",new SimpleIcon(L"snowball",slotSize*14,slotSize*0,slotSize*(14+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"slot_empty_helmet",new SimpleIcon(L"slot_empty_helmet",slotSize*15,slotSize*0,slotSize*(15+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"chestplateCloth",new SimpleIcon(L"chestplateCloth",slotSize*0,slotSize*1,slotSize*(0+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"chestplateChain",new SimpleIcon(L"chestplateChain",slotSize*1,slotSize*1,slotSize*(1+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"chestplateIron",new SimpleIcon(L"chestplateIron",slotSize*2,slotSize*1,slotSize*(2+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"chestplateDiamond",new SimpleIcon(L"chestplateDiamond",slotSize*3,slotSize*1,slotSize*(3+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"chestplateGold",new SimpleIcon(L"chestplateGold",slotSize*4,slotSize*1,slotSize*(4+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"bow",new SimpleIcon(L"bow",slotSize*5,slotSize*1,slotSize*(5+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"brick",new SimpleIcon(L"brick",slotSize*6,slotSize*1,slotSize*(6+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"ingotIron",new SimpleIcon(L"ingotIron",slotSize*7,slotSize*1,slotSize*(7+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"feather",new SimpleIcon(L"feather",slotSize*8,slotSize*1,slotSize*(8+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"wheat",new SimpleIcon(L"wheat",slotSize*9,slotSize*1,slotSize*(9+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"painting",new SimpleIcon(L"painting",slotSize*10,slotSize*1,slotSize*(10+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"reeds",new SimpleIcon(L"reeds",slotSize*11,slotSize*1,slotSize*(11+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"bone",new SimpleIcon(L"bone",slotSize*12,slotSize*1,slotSize*(12+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"cake",new SimpleIcon(L"cake",slotSize*13,slotSize*1,slotSize*(13+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"slimeball",new SimpleIcon(L"slimeball",slotSize*14,slotSize*1,slotSize*(14+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"slot_empty_chestplate",new SimpleIcon(L"slot_empty_chestplate",slotSize*15,slotSize*1,slotSize*(15+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"leggingsCloth",new SimpleIcon(L"leggingsCloth",slotSize*0,slotSize*2,slotSize*(0+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"leggingsChain",new SimpleIcon(L"leggingsChain",slotSize*1,slotSize*2,slotSize*(1+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"leggingsIron",new SimpleIcon(L"leggingsIron",slotSize*2,slotSize*2,slotSize*(2+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"leggingsDiamond",new SimpleIcon(L"leggingsDiamond",slotSize*3,slotSize*2,slotSize*(3+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"leggingsGold",new SimpleIcon(L"leggingsGold",slotSize*4,slotSize*2,slotSize*(4+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"arrow",new SimpleIcon(L"arrow",slotSize*5,slotSize*2,slotSize*(5+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"quiver",new SimpleIcon(L"quiver",slotSize*6,slotSize*2,slotSize*(6+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"ingotGold",new SimpleIcon(L"ingotGold",slotSize*7,slotSize*2,slotSize*(7+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"sulphur",new SimpleIcon(L"sulphur",slotSize*8,slotSize*2,slotSize*(8+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"bread",new SimpleIcon(L"bread",slotSize*9,slotSize*2,slotSize*(9+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"sign",new SimpleIcon(L"sign",slotSize*10,slotSize*2,slotSize*(10+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"doorWood",new SimpleIcon(L"doorWood",slotSize*11,slotSize*2,slotSize*(11+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"doorIron",new SimpleIcon(L"doorIron",slotSize*12,slotSize*2,slotSize*(12+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"bed",new SimpleIcon(L"bed",slotSize*13,slotSize*2,slotSize*(13+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"fireball",new SimpleIcon(L"fireball",slotSize*14,slotSize*2,slotSize*(14+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"slot_empty_leggings",new SimpleIcon(L"slot_empty_leggings",slotSize*15,slotSize*2,slotSize*(15+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"bootsCloth",new SimpleIcon(L"bootsCloth",slotSize*0,slotSize*3,slotSize*(0+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"bootsChain",new SimpleIcon(L"bootsChain",slotSize*1,slotSize*3,slotSize*(1+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"bootsIron",new SimpleIcon(L"bootsIron",slotSize*2,slotSize*3,slotSize*(2+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"bootsDiamond",new SimpleIcon(L"bootsDiamond",slotSize*3,slotSize*3,slotSize*(3+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"bootsGold",new SimpleIcon(L"bootsGold",slotSize*4,slotSize*3,slotSize*(4+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"stick",new SimpleIcon(L"stick",slotSize*5,slotSize*3,slotSize*(5+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"compass",new SimpleIcon(L"compass",slotSize*6,slotSize*3,slotSize*(6+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"compassP0",new SimpleIcon(L"compassP0",slotSize*7,slotSize*14,slotSize*(7+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"compassP1",new SimpleIcon(L"compassP1",slotSize*8,slotSize*14,slotSize*(8+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"compassP2",new SimpleIcon(L"compassP2",slotSize*9,slotSize*14,slotSize*(9+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"compassP3",new SimpleIcon(L"compassP3",slotSize*10,slotSize*14,slotSize*(10+1),slotSize*(14+1)))); - texturesToAnimate.push_back(pair(L"compass",L"compass")); - texturesToAnimate.push_back(pair(L"compassP0",L"compass")); - texturesToAnimate.push_back(pair(L"compassP1",L"compass")); - texturesToAnimate.push_back(pair(L"compassP2",L"compass")); - texturesToAnimate.push_back(pair(L"compassP3",L"compass")); - texturesByName.insert(stringIconMap::value_type(L"diamond",new SimpleIcon(L"diamond",slotSize*7,slotSize*3,slotSize*(7+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"redstone",new SimpleIcon(L"redstone",slotSize*8,slotSize*3,slotSize*(8+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"clay",new SimpleIcon(L"clay",slotSize*9,slotSize*3,slotSize*(9+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"paper",new SimpleIcon(L"paper",slotSize*10,slotSize*3,slotSize*(10+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"book",new SimpleIcon(L"book",slotSize*11,slotSize*3,slotSize*(11+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"map",new SimpleIcon(L"map",slotSize*12,slotSize*3,slotSize*(12+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"seeds_pumpkin",new SimpleIcon(L"seeds_pumpkin",slotSize*13,slotSize*3,slotSize*(13+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"seeds_melon",new SimpleIcon(L"seeds_melon",slotSize*14,slotSize*3,slotSize*(14+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"slot_empty_boots",new SimpleIcon(L"slot_empty_boots",slotSize*15,slotSize*3,slotSize*(15+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"swordWood",new SimpleIcon(L"swordWood",slotSize*0,slotSize*4,slotSize*(0+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"swordStone",new SimpleIcon(L"swordStone",slotSize*1,slotSize*4,slotSize*(1+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"swordIron",new SimpleIcon(L"swordIron",slotSize*2,slotSize*4,slotSize*(2+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"swordDiamond",new SimpleIcon(L"swordDiamond",slotSize*3,slotSize*4,slotSize*(3+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"swordGold",new SimpleIcon(L"swordGold",slotSize*4,slotSize*4,slotSize*(4+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"fishingRod",new SimpleIcon(L"fishingRod",slotSize*5,slotSize*4,slotSize*(5+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"clock",new SimpleIcon(L"clock",slotSize*6,slotSize*4,slotSize*(6+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"clockP0",new SimpleIcon(L"clockP0",slotSize*11,slotSize*14,slotSize*(11+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"clockP1",new SimpleIcon(L"clockP1",slotSize*12,slotSize*14,slotSize*(12+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"clockP2",new SimpleIcon(L"clockP2",slotSize*13,slotSize*14,slotSize*(13+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"clockP3",new SimpleIcon(L"clockP3",slotSize*14,slotSize*14,slotSize*(14+1),slotSize*(14+1)))); - texturesToAnimate.push_back(pair(L"clock",L"clock")); - texturesToAnimate.push_back(pair(L"clockP0",L"clock")); - texturesToAnimate.push_back(pair(L"clockP1",L"clock")); - texturesToAnimate.push_back(pair(L"clockP2",L"clock")); - texturesToAnimate.push_back(pair(L"clockP3",L"clock")); - texturesByName.insert(stringIconMap::value_type(L"bowl",new SimpleIcon(L"bowl",slotSize*7,slotSize*4,slotSize*(7+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"mushroomStew",new SimpleIcon(L"mushroomStew",slotSize*8,slotSize*4,slotSize*(8+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"yellowDust",new SimpleIcon(L"yellowDust",slotSize*9,slotSize*4,slotSize*(9+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"bucket",new SimpleIcon(L"bucket",slotSize*10,slotSize*4,slotSize*(10+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"bucketWater",new SimpleIcon(L"bucketWater",slotSize*11,slotSize*4,slotSize*(11+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"bucketLava",new SimpleIcon(L"bucketLava",slotSize*12,slotSize*4,slotSize*(12+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"milk",new SimpleIcon(L"milk",slotSize*13,slotSize*4,slotSize*(13+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_black",new SimpleIcon(L"dyePowder_black",slotSize*14,slotSize*4,slotSize*(14+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_gray",new SimpleIcon(L"dyePowder_gray",slotSize*15,slotSize*4,slotSize*(15+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"shovelWood",new SimpleIcon(L"shovelWood",slotSize*0,slotSize*5,slotSize*(0+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"shovelStone",new SimpleIcon(L"shovelStone",slotSize*1,slotSize*5,slotSize*(1+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"shovelIron",new SimpleIcon(L"shovelIron",slotSize*2,slotSize*5,slotSize*(2+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"shovelDiamond",new SimpleIcon(L"shovelDiamond",slotSize*3,slotSize*5,slotSize*(3+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"shovelGold",new SimpleIcon(L"shovelGold",slotSize*4,slotSize*5,slotSize*(4+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"fishingRod_empty",new SimpleIcon(L"fishingRod_empty",slotSize*5,slotSize*5,slotSize*(5+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"diode",new SimpleIcon(L"diode",slotSize*6,slotSize*5,slotSize*(6+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"porkchopRaw",new SimpleIcon(L"porkchopRaw",slotSize*7,slotSize*5,slotSize*(7+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"porkchopCooked",new SimpleIcon(L"porkchopCooked",slotSize*8,slotSize*5,slotSize*(8+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"fishRaw",new SimpleIcon(L"fishRaw",slotSize*9,slotSize*5,slotSize*(9+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"fishCooked",new SimpleIcon(L"fishCooked",slotSize*10,slotSize*5,slotSize*(10+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"rottenFlesh",new SimpleIcon(L"rottenFlesh",slotSize*11,slotSize*5,slotSize*(11+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"cookie",new SimpleIcon(L"cookie",slotSize*12,slotSize*5,slotSize*(12+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"shears",new SimpleIcon(L"shears",slotSize*13,slotSize*5,slotSize*(13+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_red",new SimpleIcon(L"dyePowder_red",slotSize*14,slotSize*5,slotSize*(14+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_pink",new SimpleIcon(L"dyePowder_pink",slotSize*15,slotSize*5,slotSize*(15+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"pickaxeWood",new SimpleIcon(L"pickaxeWood",slotSize*0,slotSize*6,slotSize*(0+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"pickaxeStone",new SimpleIcon(L"pickaxeStone",slotSize*1,slotSize*6,slotSize*(1+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"pickaxeIron",new SimpleIcon(L"pickaxeIron",slotSize*2,slotSize*6,slotSize*(2+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"pickaxeDiamond",new SimpleIcon(L"pickaxeDiamond",slotSize*3,slotSize*6,slotSize*(3+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"pickaxeGold",new SimpleIcon(L"pickaxeGold",slotSize*4,slotSize*6,slotSize*(4+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"bow_pull_0",new SimpleIcon(L"bow_pull_0",slotSize*5,slotSize*6,slotSize*(5+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"carrotOnAStick",new SimpleIcon(L"carrotOnAStick",slotSize*6,slotSize*6,slotSize*(6+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"leather",new SimpleIcon(L"leather",slotSize*7,slotSize*6,slotSize*(7+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"saddle",new SimpleIcon(L"saddle",slotSize*8,slotSize*6,slotSize*(8+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"beefRaw",new SimpleIcon(L"beefRaw",slotSize*9,slotSize*6,slotSize*(9+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"beefCooked",new SimpleIcon(L"beefCooked",slotSize*10,slotSize*6,slotSize*(10+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"enderPearl",new SimpleIcon(L"enderPearl",slotSize*11,slotSize*6,slotSize*(11+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"blazeRod",new SimpleIcon(L"blazeRod",slotSize*12,slotSize*6,slotSize*(12+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"melon",new SimpleIcon(L"melon",slotSize*13,slotSize*6,slotSize*(13+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_green",new SimpleIcon(L"dyePowder_green",slotSize*14,slotSize*6,slotSize*(14+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_lime",new SimpleIcon(L"dyePowder_lime",slotSize*15,slotSize*6,slotSize*(15+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"hatchetWood",new SimpleIcon(L"hatchetWood",slotSize*0,slotSize*7,slotSize*(0+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"hatchetStone",new SimpleIcon(L"hatchetStone",slotSize*1,slotSize*7,slotSize*(1+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"hatchetIron",new SimpleIcon(L"hatchetIron",slotSize*2,slotSize*7,slotSize*(2+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"hatchetDiamond",new SimpleIcon(L"hatchetDiamond",slotSize*3,slotSize*7,slotSize*(3+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"hatchetGold",new SimpleIcon(L"hatchetGold",slotSize*4,slotSize*7,slotSize*(4+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"bow_pull_1",new SimpleIcon(L"bow_pull_1",slotSize*5,slotSize*7,slotSize*(5+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"potatoBaked",new SimpleIcon(L"potatoBaked",slotSize*6,slotSize*7,slotSize*(6+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"potato",new SimpleIcon(L"potato",slotSize*7,slotSize*7,slotSize*(7+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"carrots",new SimpleIcon(L"carrots",slotSize*8,slotSize*7,slotSize*(8+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"chickenRaw",new SimpleIcon(L"chickenRaw",slotSize*9,slotSize*7,slotSize*(9+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"chickenCooked",new SimpleIcon(L"chickenCooked",slotSize*10,slotSize*7,slotSize*(10+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"ghastTear",new SimpleIcon(L"ghastTear",slotSize*11,slotSize*7,slotSize*(11+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"goldNugget",new SimpleIcon(L"goldNugget",slotSize*12,slotSize*7,slotSize*(12+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherStalkSeeds",new SimpleIcon(L"netherStalkSeeds",slotSize*13,slotSize*7,slotSize*(13+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_brown",new SimpleIcon(L"dyePowder_brown",slotSize*14,slotSize*7,slotSize*(14+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_yellow",new SimpleIcon(L"dyePowder_yellow",slotSize*15,slotSize*7,slotSize*(15+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"hoeWood",new SimpleIcon(L"hoeWood",slotSize*0,slotSize*8,slotSize*(0+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"hoeStone",new SimpleIcon(L"hoeStone",slotSize*1,slotSize*8,slotSize*(1+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"hoeIron",new SimpleIcon(L"hoeIron",slotSize*2,slotSize*8,slotSize*(2+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"hoeDiamond",new SimpleIcon(L"hoeDiamond",slotSize*3,slotSize*8,slotSize*(3+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"hoeGold",new SimpleIcon(L"hoeGold",slotSize*4,slotSize*8,slotSize*(4+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"bow_pull_2",new SimpleIcon(L"bow_pull_2",slotSize*5,slotSize*8,slotSize*(5+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"potatoPoisonous",new SimpleIcon(L"potatoPoisonous",slotSize*6,slotSize*8,slotSize*(6+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"minecart",new SimpleIcon(L"minecart",slotSize*7,slotSize*8,slotSize*(7+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"boat",new SimpleIcon(L"boat",slotSize*8,slotSize*8,slotSize*(8+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"speckledMelon",new SimpleIcon(L"speckledMelon",slotSize*9,slotSize*8,slotSize*(9+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"fermentedSpiderEye",new SimpleIcon(L"fermentedSpiderEye",slotSize*10,slotSize*8,slotSize*(10+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"spiderEye",new SimpleIcon(L"spiderEye",slotSize*11,slotSize*8,slotSize*(11+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"potion",new SimpleIcon(L"potion",slotSize*12,slotSize*8,slotSize*(12+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"glassBottle",new SimpleIcon(L"glassBottle",slotSize*12,slotSize*8,slotSize*(12+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"potion_contents",new SimpleIcon(L"potion_contents",slotSize*13,slotSize*8,slotSize*(13+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_blue",new SimpleIcon(L"dyePowder_blue",slotSize*14,slotSize*8,slotSize*(14+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_lightBlue",new SimpleIcon(L"dyePowder_lightBlue",slotSize*15,slotSize*8,slotSize*(15+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"helmetCloth_overlay",new SimpleIcon(L"helmetCloth_overlay",slotSize*0,slotSize*9,slotSize*(0+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"comparator",new SimpleIcon(L"comparator",slotSize*5,slotSize*9,slotSize*(5+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"carrotGolden",new SimpleIcon(L"carrotGolden",slotSize*6,slotSize*9,slotSize*(6+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"minecartChest",new SimpleIcon(L"minecartChest",slotSize*7,slotSize*9,slotSize*(7+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"pumpkinPie",new SimpleIcon(L"pumpkinPie",slotSize*8,slotSize*9,slotSize*(8+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"monsterPlacer",new SimpleIcon(L"monsterPlacer",slotSize*9,slotSize*9,slotSize*(9+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"potion_splash",new SimpleIcon(L"potion_splash",slotSize*10,slotSize*9,slotSize*(10+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"eyeOfEnder",new SimpleIcon(L"eyeOfEnder",slotSize*11,slotSize*9,slotSize*(11+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"cauldron",new SimpleIcon(L"cauldron",slotSize*12,slotSize*9,slotSize*(12+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"blazePowder",new SimpleIcon(L"blazePowder",slotSize*13,slotSize*9,slotSize*(13+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_purple",new SimpleIcon(L"dyePowder_purple",slotSize*14,slotSize*9,slotSize*(14+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_magenta",new SimpleIcon(L"dyePowder_magenta",slotSize*15,slotSize*9,slotSize*(15+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"chestplateCloth_overlay",new SimpleIcon(L"chestplateCloth_overlay",slotSize*0,slotSize*10,slotSize*(0+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherbrick",new SimpleIcon(L"netherbrick",slotSize*5,slotSize*10,slotSize*(5+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"minecartFurnace",new SimpleIcon(L"minecartFurnace",slotSize*7,slotSize*10,slotSize*(7+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"monsterPlacer_overlay",new SimpleIcon(L"monsterPlacer_overlay",slotSize*9,slotSize*10,slotSize*(9+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"ruby",new SimpleIcon(L"ruby",slotSize*10,slotSize*10,slotSize*(10+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"expBottle",new SimpleIcon(L"expBottle",slotSize*11,slotSize*10,slotSize*(11+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"brewingStand",new SimpleIcon(L"brewingStand",slotSize*12,slotSize*10,slotSize*(12+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"magmaCream",new SimpleIcon(L"magmaCream",slotSize*13,slotSize*10,slotSize*(13+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_cyan",new SimpleIcon(L"dyePowder_cyan",slotSize*14,slotSize*10,slotSize*(14+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_orange",new SimpleIcon(L"dyePowder_orange",slotSize*15,slotSize*10,slotSize*(15+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"leggingsCloth_overlay",new SimpleIcon(L"leggingsCloth_overlay",slotSize*0,slotSize*11,slotSize*(0+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"minecartHopper",new SimpleIcon(L"minecartHopper",slotSize*7,slotSize*11,slotSize*(7+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"hopper",new SimpleIcon(L"hopper",slotSize*8,slotSize*11,slotSize*(8+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherStar",new SimpleIcon(L"netherStar",slotSize*9,slotSize*11,slotSize*(9+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"emerald",new SimpleIcon(L"emerald",slotSize*10,slotSize*11,slotSize*(10+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"writingBook",new SimpleIcon(L"writingBook",slotSize*11,slotSize*11,slotSize*(11+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"writtenBook",new SimpleIcon(L"writtenBook",slotSize*12,slotSize*11,slotSize*(12+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"flowerPot",new SimpleIcon(L"flowerPot",slotSize*13,slotSize*11,slotSize*(13+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_silver",new SimpleIcon(L"dyePowder_silver",slotSize*14,slotSize*11,slotSize*(14+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"dyePowder_white",new SimpleIcon(L"dyePowder_white",slotSize*15,slotSize*11,slotSize*(15+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"bootsCloth_overlay",new SimpleIcon(L"bootsCloth_overlay",slotSize*0,slotSize*12,slotSize*(0+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"minecartTnt",new SimpleIcon(L"minecartTnt",slotSize*7,slotSize*12,slotSize*(7+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"fireworks",new SimpleIcon(L"fireworks",slotSize*9,slotSize*12,slotSize*(9+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"fireworksCharge",new SimpleIcon(L"fireworksCharge",slotSize*10,slotSize*12,slotSize*(10+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"fireworksCharge_overlay",new SimpleIcon(L"fireworksCharge_overlay",slotSize*11,slotSize*12,slotSize*(11+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherquartz",new SimpleIcon(L"netherquartz",slotSize*12,slotSize*12,slotSize*(12+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"emptyMap",new SimpleIcon(L"emptyMap",slotSize*13,slotSize*12,slotSize*(13+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"frame",new SimpleIcon(L"frame",slotSize*14,slotSize*12,slotSize*(14+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"enchantedBook",new SimpleIcon(L"enchantedBook",slotSize*15,slotSize*12,slotSize*(15+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"skull_skeleton",new SimpleIcon(L"skull_skeleton",slotSize*0,slotSize*14,slotSize*(0+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"skull_wither",new SimpleIcon(L"skull_wither",slotSize*1,slotSize*14,slotSize*(1+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"skull_zombie",new SimpleIcon(L"skull_zombie",slotSize*2,slotSize*14,slotSize*(2+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"skull_char",new SimpleIcon(L"skull_char",slotSize*3,slotSize*14,slotSize*(3+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"skull_creeper",new SimpleIcon(L"skull_creeper",slotSize*4,slotSize*14,slotSize*(4+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"dragonFireball",new SimpleIcon(L"dragonFireball",slotSize*15,slotSize*14,slotSize*(15+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_13",new SimpleIcon(L"record_13",slotSize*0,slotSize*15,slotSize*(0+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_cat",new SimpleIcon(L"record_cat",slotSize*1,slotSize*15,slotSize*(1+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_blocks",new SimpleIcon(L"record_blocks",slotSize*2,slotSize*15,slotSize*(2+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_chirp",new SimpleIcon(L"record_chirp",slotSize*3,slotSize*15,slotSize*(3+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_far",new SimpleIcon(L"record_far",slotSize*4,slotSize*15,slotSize*(4+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_mall",new SimpleIcon(L"record_mall",slotSize*5,slotSize*15,slotSize*(5+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_mellohi",new SimpleIcon(L"record_mellohi",slotSize*6,slotSize*15,slotSize*(6+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_stal",new SimpleIcon(L"record_stal",slotSize*7,slotSize*15,slotSize*(7+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_strad",new SimpleIcon(L"record_strad",slotSize*8,slotSize*15,slotSize*(8+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_ward",new SimpleIcon(L"record_ward",slotSize*9,slotSize*15,slotSize*(9+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_11",new SimpleIcon(L"record_11",slotSize*10,slotSize*15,slotSize*(10+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"record_where are we now",new SimpleIcon(L"record_where are we now",slotSize*11,slotSize*15,slotSize*(11+1),slotSize*(15+1)))); + float horizRatio = 1.0f/16.0f; + float vertRatio = 1.0f/16.0f; + + ADD_ICON(0, 0, L"helmetCloth") + ADD_ICON(0, 1, L"helmetChain") + ADD_ICON(0, 2, L"helmetIron") + ADD_ICON(0, 3, L"helmetDiamond") + ADD_ICON(0, 4, L"helmetGold") + ADD_ICON(0, 5, L"flintAndSteel") + ADD_ICON(0, 6, L"flint") + ADD_ICON(0, 7, L"coal") + ADD_ICON(0, 8, L"string") + ADD_ICON(0, 9, L"seeds") + ADD_ICON(0, 10, L"apple") + ADD_ICON(0, 11, L"appleGold") + ADD_ICON(0, 12, L"egg") + ADD_ICON(0, 13, L"sugar") + ADD_ICON(0, 14, L"snowball") + ADD_ICON(0, 15, L"slot_empty_helmet") + + ADD_ICON(1, 0, L"chestplateCloth") + ADD_ICON(1, 1, L"chestplateChain") + ADD_ICON(1, 2, L"chestplateIron") + ADD_ICON(1, 3, L"chestplateDiamond") + ADD_ICON(1, 4, L"chestplateGold") + ADD_ICON(1, 5, L"bow") + ADD_ICON(1, 6, L"brick") + ADD_ICON(1, 7, L"ingotIron") + ADD_ICON(1, 8, L"feather") + ADD_ICON(1, 9, L"wheat") + ADD_ICON(1, 10, L"painting") + ADD_ICON(1, 11, L"reeds") + ADD_ICON(1, 12, L"bone") + ADD_ICON(1, 13, L"cake") + ADD_ICON(1, 14, L"slimeball") + ADD_ICON(1, 15, L"slot_empty_chestplate") + + ADD_ICON(2, 0, L"leggingsCloth") + ADD_ICON(2, 1, L"leggingsChain") + ADD_ICON(2, 2, L"leggingsIron") + ADD_ICON(2, 3, L"leggingsDiamond") + ADD_ICON(2, 4, L"leggingsGold") + ADD_ICON(2, 5, L"arrow") + ADD_ICON(2, 6, L"quiver") + ADD_ICON(2, 7, L"ingotGold") + ADD_ICON(2, 8, L"sulphur") + ADD_ICON(2, 9, L"bread") + ADD_ICON(2, 10, L"sign") + ADD_ICON(2, 11, L"doorWood") + ADD_ICON(2, 12, L"doorIron") + ADD_ICON(2, 13, L"bed") + ADD_ICON(2, 14, L"fireball") + ADD_ICON(2, 15, L"slot_empty_leggings") + + ADD_ICON(3, 0, L"bootsCloth") + ADD_ICON(3, 1, L"bootsChain") + ADD_ICON(3, 2, L"bootsIron") + ADD_ICON(3, 3, L"bootsDiamond") + ADD_ICON(3, 4, L"bootsGold") + ADD_ICON(3, 5, L"stick") + ADD_ICON(3, 6, L"compass") + ADD_ICON(3, 7, L"diamond") + ADD_ICON(3, 8, L"redstone") + ADD_ICON(3, 9, L"clay") + ADD_ICON(3, 10, L"paper") + ADD_ICON(3, 11, L"book") + ADD_ICON(3, 12, L"map") + ADD_ICON(3, 13, L"seeds_pumpkin") + ADD_ICON(3, 14, L"seeds_melon") + ADD_ICON(3, 15, L"slot_empty_boots") + + ADD_ICON(4, 0, L"swordWood") + ADD_ICON(4, 1, L"swordStone") + ADD_ICON(4, 2, L"swordIron") + ADD_ICON(4, 3, L"swordDiamond") + ADD_ICON(4, 4, L"swordGold") + ADD_ICON(4, 5, L"fishingRod_uncast") + ADD_ICON(4, 6, L"clock") + ADD_ICON(4, 7, L"bowl") + ADD_ICON(4, 8, L"mushroomStew") + ADD_ICON(4, 9, L"yellowDust") + ADD_ICON(4, 10, L"bucket") + ADD_ICON(4, 11, L"bucketWater") + ADD_ICON(4, 12, L"bucketLava") + ADD_ICON(4, 13, L"milk") + ADD_ICON(4, 14, L"dyePowder_black") + ADD_ICON(4, 15, L"dyePowder_gray") + + ADD_ICON(5, 0, L"shovelWood") + ADD_ICON(5, 1, L"shovelStone") + ADD_ICON(5, 2, L"shovelIron") + ADD_ICON(5, 3, L"shovelDiamond") + ADD_ICON(5, 4, L"shovelGold") + ADD_ICON(5, 5, L"fishingRod_cast") + ADD_ICON(5, 6, L"diode") + ADD_ICON(5, 7, L"porkchopRaw") + ADD_ICON(5, 8, L"porkchopCooked") + ADD_ICON(5, 9, L"fishRaw") + ADD_ICON(5, 10, L"fishCooked") + ADD_ICON(5, 11, L"rottenFlesh") + ADD_ICON(5, 12, L"cookie") + ADD_ICON(5, 13, L"shears") + ADD_ICON(5, 14, L"dyePowder_red") + ADD_ICON(5, 15, L"dyePowder_pink") + + ADD_ICON(6, 0, L"pickaxeWood") + ADD_ICON(6, 1, L"pickaxeStone") + ADD_ICON(6, 2, L"pickaxeIron") + ADD_ICON(6, 3, L"pickaxeDiamond") + ADD_ICON(6, 4, L"pickaxeGold") + ADD_ICON(6, 5, L"bow_pull_0") + ADD_ICON(6, 6, L"carrotOnAStick") + ADD_ICON(6, 7, L"leather") + ADD_ICON(6, 8, L"saddle") + ADD_ICON(6, 9, L"beefRaw") + ADD_ICON(6, 10, L"beefCooked") + ADD_ICON(6, 11, L"enderPearl") + ADD_ICON(6, 12, L"blazeRod") + ADD_ICON(6, 13, L"melon") + ADD_ICON(6, 14, L"dyePowder_green") + ADD_ICON(6, 15, L"dyePowder_lime") + + ADD_ICON(7, 0, L"hatchetWood") + ADD_ICON(7, 1, L"hatchetStone") + ADD_ICON(7, 2, L"hatchetIron") + ADD_ICON(7, 3, L"hatchetDiamond") + ADD_ICON(7, 4, L"hatchetGold") + ADD_ICON(7, 5, L"bow_pull_1") + ADD_ICON(7, 6, L"potatoBaked") + ADD_ICON(7, 7, L"potato") + ADD_ICON(7, 8, L"carrots") + ADD_ICON(7, 9, L"chickenRaw") + ADD_ICON(7, 10, L"chickenCooked") + ADD_ICON(7, 11, L"ghastTear") + ADD_ICON(7, 12, L"goldNugget") + ADD_ICON(7, 13, L"netherStalkSeeds") + ADD_ICON(7, 14, L"dyePowder_brown") + ADD_ICON(7, 15, L"dyePowder_yellow") + + ADD_ICON(8, 0, L"hoeWood") + ADD_ICON(8, 1, L"hoeStone") + ADD_ICON(8, 2, L"hoeIron") + ADD_ICON(8, 3, L"hoeDiamond") + ADD_ICON(8, 4, L"hoeGold") + ADD_ICON(8, 5, L"bow_pull_2") + ADD_ICON(8, 6, L"potatoPoisonous") + ADD_ICON(8, 7, L"minecart") + ADD_ICON(8, 8, L"boat") + ADD_ICON(8, 9, L"speckledMelon") + ADD_ICON(8, 10, L"fermentedSpiderEye") + ADD_ICON(8, 11, L"spiderEye") + ADD_ICON(8, 12, L"potion") + ADD_ICON(8, 12, L"glassBottle") // Same as potion + ADD_ICON(8, 13, L"potion_contents") + ADD_ICON(8, 14, L"dyePowder_blue") + ADD_ICON(8, 15, L"dyePowder_light_blue") + + ADD_ICON(9, 0, L"helmetCloth_overlay") + //ADD_ICON(9, 1, L"unused") + ADD_ICON(9, 2, L"iron_horse_armor") + ADD_ICON(9, 3, L"diamond_horse_armor") + ADD_ICON(9, 4, L"gold_horse_armor") + ADD_ICON(9, 5, L"comparator") + ADD_ICON(9, 6, L"carrotGolden") + ADD_ICON(9, 7, L"minecart_chest") + ADD_ICON(9, 8, L"pumpkinPie") + ADD_ICON(9, 9, L"monsterPlacer") + ADD_ICON(9, 10, L"potion_splash") + ADD_ICON(9, 11, L"eyeOfEnder") + ADD_ICON(9, 12, L"cauldron") + ADD_ICON(9, 13, L"blazePowder") + ADD_ICON(9, 14, L"dyePowder_purple") + ADD_ICON(9, 15, L"dyePowder_magenta") + + ADD_ICON(10, 0, L"chestplateCloth_overlay") + //ADD_ICON(10, 1, L"unused") + //ADD_ICON(10, 2, L"unused") + ADD_ICON(10, 3, L"name_tag") + ADD_ICON(10, 4, L"lead") + ADD_ICON(10, 5, L"netherbrick") + //ADD_ICON(10, 6, L"unused") + ADD_ICON(10, 7, L"minecart_furnace") + ADD_ICON(10, 8, L"charcoal") + ADD_ICON(10, 9, L"monsterPlacer_overlay") + ADD_ICON(10, 10, L"ruby") + ADD_ICON(10, 11, L"expBottle") + ADD_ICON(10, 12, L"brewingStand") + ADD_ICON(10, 13, L"magmaCream") + ADD_ICON(10, 14, L"dyePowder_cyan") + ADD_ICON(10, 15, L"dyePowder_orange") + + ADD_ICON(11, 0, L"leggingsCloth_overlay") + //ADD_ICON(11, 1, L"unused") + //ADD_ICON(11, 2, L"unused") + //ADD_ICON(11, 3, L"unused") + //ADD_ICON(11, 4, L"unused") + //ADD_ICON(11, 5, L"unused") + //ADD_ICON(11, 6, L"unused") + ADD_ICON(11, 7, L"minecart_hopper") + ADD_ICON(11, 8, L"hopper") + ADD_ICON(11, 9, L"nether_star") + ADD_ICON(11, 10, L"emerald") + ADD_ICON(11, 11, L"writingBook") + ADD_ICON(11, 12, L"writtenBook") + ADD_ICON(11, 13, L"flowerPot") + ADD_ICON(11, 14, L"dyePowder_silver") + ADD_ICON(11, 15, L"dyePowder_white") + + ADD_ICON(12, 0, L"bootsCloth_overlay") + //ADD_ICON(12, 1, L"unused") + //ADD_ICON(12, 2, L"unused") + //ADD_ICON(12, 3, L"unused") + //ADD_ICON(12, 4, L"unused") + //ADD_ICON(12, 5, L"unused") + //ADD_ICON(12, 6, L"unused") + ADD_ICON(12, 7, L"minecart_tnt") + //ADD_ICON(12, 8, L"unused") + ADD_ICON(12, 9, L"fireworks") + ADD_ICON(12, 10, L"fireworks_charge") + ADD_ICON(12, 11, L"fireworks_charge_overlay") + ADD_ICON(12, 12, L"netherquartz") + ADD_ICON(12, 13, L"map_empty") + ADD_ICON(12, 14, L"frame") + ADD_ICON(12, 15, L"enchantedBook") + + ADD_ICON(14, 0, L"skull_skeleton") + ADD_ICON(14, 1, L"skull_wither") + ADD_ICON(14, 2, L"skull_zombie") + ADD_ICON(14, 3, L"skull_char") + ADD_ICON(14, 4, L"skull_creeper") + //ADD_ICON(14, 5, L"unused") + //ADD_ICON(14, 6, L"unused") + ADD_ICON_WITH_NAME(14, 7, L"compassP0", L"compass") // 4J Added + ADD_ICON_WITH_NAME(14, 8, L"compassP1", L"compass") // 4J Added + ADD_ICON_WITH_NAME(14, 9, L"compassP2", L"compass") // 4J Added + ADD_ICON_WITH_NAME(14, 10, L"compassP3", L"compass") // 4J Added + ADD_ICON_WITH_NAME(14, 11, L"clockP0", L"clock") // 4J Added + ADD_ICON_WITH_NAME(14, 12, L"clockP1", L"clock") // 4J Added + ADD_ICON_WITH_NAME(14, 13, L"clockP2", L"clock") // 4J Added + ADD_ICON_WITH_NAME(14, 14, L"clockP3", L"clock") // 4J Added + ADD_ICON(14, 15, L"dragonFireball") + + ADD_ICON(15, 0, L"record_13") + ADD_ICON(15, 1, L"record_cat") + ADD_ICON(15, 2, L"record_blocks") + ADD_ICON(15, 3, L"record_chirp") + ADD_ICON(15, 4, L"record_far") + ADD_ICON(15, 5, L"record_mall") + ADD_ICON(15, 6, L"record_mellohi") + ADD_ICON(15, 7, L"record_stal") + ADD_ICON(15, 8, L"record_strad") + ADD_ICON(15, 9, L"record_ward") + ADD_ICON(15, 10, L"record_11") + ADD_ICON(15, 11, L"record_where are we now") // Special cases ClockTexture *dataClock = new ClockTexture(); @@ -590,264 +651,343 @@ void PreStitchedTextureMap::loadUVs() } else { - texturesByName.insert(stringIconMap::value_type(L"grass_top",new SimpleIcon(L"grass_top",slotSize*0,slotSize*0,slotSize*(0+1),slotSize*(0+1)))); + float horizRatio = 1.0f/16.0f; + float vertRatio = 1.0f/32.0f; + + ADD_ICON(0, 0, L"grass_top") texturesByName[L"grass_top"]->setFlags(Icon::IS_GRASS_TOP); // 4J added for faster determination of texture type in tesselation - texturesByName.insert(stringIconMap::value_type(L"stone",new SimpleIcon(L"stone",slotSize*1,slotSize*0,slotSize*(1+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"dirt",new SimpleIcon(L"dirt",slotSize*2,slotSize*0,slotSize*(2+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"grass_side",new SimpleIcon(L"grass_side",slotSize*3,slotSize*0,slotSize*(3+1),slotSize*(0+1)))); + ADD_ICON(0, 1, L"stone") + ADD_ICON(0, 2, L"dirt") + ADD_ICON(0, 3, L"grass_side") texturesByName[L"grass_side"]->setFlags(Icon::IS_GRASS_SIDE); // 4J added for faster determination of texture type in tesselation - texturesByName.insert(stringIconMap::value_type(L"wood",new SimpleIcon(L"wood",slotSize*4,slotSize*0,slotSize*(4+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"stoneslab_side",new SimpleIcon(L"stoneslab_side",slotSize*5,slotSize*0,slotSize*(5+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"stoneslab_top",new SimpleIcon(L"stoneslab_top",slotSize*6,slotSize*0,slotSize*(6+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"brick",new SimpleIcon(L"brick",slotSize*7,slotSize*0,slotSize*(7+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"tnt_side",new SimpleIcon(L"tnt_side",slotSize*8,slotSize*0,slotSize*(8+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"tnt_top",new SimpleIcon(L"tnt_top",slotSize*9,slotSize*0,slotSize*(9+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"tnt_bottom",new SimpleIcon(L"tnt_bottom",slotSize*10,slotSize*0,slotSize*(10+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"web",new SimpleIcon(L"web",slotSize*11,slotSize*0,slotSize*(11+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"rose",new SimpleIcon(L"rose",slotSize*12,slotSize*0,slotSize*(12+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"flower",new SimpleIcon(L"flower",slotSize*13,slotSize*0,slotSize*(13+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"portal",new SimpleIcon(L"portal",slotSize*14,slotSize*0,slotSize*(14+1),slotSize*(0+1)))); - texturesToAnimate.push_back(pair(L"portal",L"portal")); - texturesByName.insert(stringIconMap::value_type(L"sapling",new SimpleIcon(L"sapling",slotSize*15,slotSize*0,slotSize*(15+1),slotSize*(0+1)))); - texturesByName.insert(stringIconMap::value_type(L"stonebrick",new SimpleIcon(L"stonebrick",slotSize*0,slotSize*1,slotSize*(0+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"bedrock",new SimpleIcon(L"bedrock",slotSize*1,slotSize*1,slotSize*(1+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"sand",new SimpleIcon(L"sand",slotSize*2,slotSize*1,slotSize*(2+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"gravel",new SimpleIcon(L"gravel",slotSize*3,slotSize*1,slotSize*(3+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"tree_side",new SimpleIcon(L"tree_side",slotSize*4,slotSize*1,slotSize*(4+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"tree_top",new SimpleIcon(L"tree_top",slotSize*5,slotSize*1,slotSize*(5+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"blockIron",new SimpleIcon(L"blockIron",slotSize*6,slotSize*1,slotSize*(6+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"blockGold",new SimpleIcon(L"blockGold",slotSize*7,slotSize*1,slotSize*(7+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"blockDiamond",new SimpleIcon(L"blockDiamond",slotSize*8,slotSize*1,slotSize*(8+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"blockEmerald",new SimpleIcon(L"blockEmerald",slotSize*9,slotSize*1,slotSize*(9+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"blockRedstone",new SimpleIcon(L"blockRedstone",slotSize*10,slotSize*1,slotSize*(10+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"dropper_front",new SimpleIcon(L"dropper_front",slotSize*11,slotSize*1,slotSize*(11+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"mushroom_red",new SimpleIcon(L"mushroom_red",slotSize*12,slotSize*1,slotSize*(12+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"mushroom_brown",new SimpleIcon(L"mushroom_brown",slotSize*13,slotSize*1,slotSize*(13+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"sapling_jungle",new SimpleIcon(L"sapling_jungle",slotSize*14,slotSize*1,slotSize*(14+1),slotSize*(1+1)))); - texturesByName.insert(stringIconMap::value_type(L"fire_0",new SimpleIcon(L"fire_0",slotSize*15,slotSize*1,slotSize*(15+1),slotSize*(1+1)))); - texturesToAnimate.push_back(pair(L"fire_0",L"fire_0")); - texturesByName.insert(stringIconMap::value_type(L"oreGold",new SimpleIcon(L"oreGold",slotSize*0,slotSize*2,slotSize*(0+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"oreIron",new SimpleIcon(L"oreIron",slotSize*1,slotSize*2,slotSize*(1+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"oreCoal",new SimpleIcon(L"oreCoal",slotSize*2,slotSize*2,slotSize*(2+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"bookshelf",new SimpleIcon(L"bookshelf",slotSize*3,slotSize*2,slotSize*(3+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"stoneMoss",new SimpleIcon(L"stoneMoss",slotSize*4,slotSize*2,slotSize*(4+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"obsidian",new SimpleIcon(L"obsidian",slotSize*5,slotSize*2,slotSize*(5+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"grass_side_overlay",new SimpleIcon(L"grass_side_overlay",slotSize*6,slotSize*2,slotSize*(6+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"tallgrass",new SimpleIcon(L"tallgrass",slotSize*7,slotSize*2,slotSize*(7+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"dispenser_front_vertical",new SimpleIcon(L"dispenser_front_vertical",slotSize*8,slotSize*2,slotSize*(8+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"beacon",new SimpleIcon(L"beacon",slotSize*9,slotSize*2,slotSize*(9+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"dropper_front_vertical",new SimpleIcon(L"dropper_front_vertical",slotSize*10,slotSize*2,slotSize*(10+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"workbench_top",new SimpleIcon(L"workbench_top",slotSize*11,slotSize*2,slotSize*(11+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"furnace_front",new SimpleIcon(L"furnace_front",slotSize*12,slotSize*2,slotSize*(12+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"furnace_side",new SimpleIcon(L"furnace_side",slotSize*13,slotSize*2,slotSize*(13+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"dispenser_front",new SimpleIcon(L"dispenser_front",slotSize*14,slotSize*2,slotSize*(14+1),slotSize*(2+1)))); - texturesByName.insert(stringIconMap::value_type(L"fire_1",new SimpleIcon(L"fire_1",slotSize*15,slotSize*1,slotSize*(15+1),slotSize*(1+1)))); - texturesToAnimate.push_back(pair(L"fire_1",L"fire_1")); - texturesByName.insert(stringIconMap::value_type(L"sponge",new SimpleIcon(L"sponge",slotSize*0,slotSize*3,slotSize*(0+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"glass",new SimpleIcon(L"glass",slotSize*1,slotSize*3,slotSize*(1+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"oreDiamond",new SimpleIcon(L"oreDiamond",slotSize*2,slotSize*3,slotSize*(2+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"oreRedstone",new SimpleIcon(L"oreRedstone",slotSize*3,slotSize*3,slotSize*(3+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"leaves",new SimpleIcon(L"leaves",slotSize*4,slotSize*3,slotSize*(4+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"leaves_opaque",new SimpleIcon(L"leaves_opaque",slotSize*5,slotSize*3,slotSize*(5+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"stonebricksmooth",new SimpleIcon(L"stonebricksmooth",slotSize*6,slotSize*3,slotSize*(6+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"deadbush",new SimpleIcon(L"deadbush",slotSize*7,slotSize*3,slotSize*(7+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"fern",new SimpleIcon(L"fern",slotSize*8,slotSize*3,slotSize*(8+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"daylightDetector_top",new SimpleIcon(L"daylightDetector_top",slotSize*9,slotSize*3,slotSize*(9+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"daylightDetector_side",new SimpleIcon(L"daylightDetector_side",slotSize*10,slotSize*3,slotSize*(10+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"workbench_side",new SimpleIcon(L"workbench_side",slotSize*11,slotSize*3,slotSize*(11+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"workbench_front",new SimpleIcon(L"workbench_front",slotSize*12,slotSize*3,slotSize*(12+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"furnace_front_lit",new SimpleIcon(L"furnace_front_lit",slotSize*13,slotSize*3,slotSize*(13+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"furnace_top",new SimpleIcon(L"furnace_top",slotSize*14,slotSize*3,slotSize*(14+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"sapling_spruce",new SimpleIcon(L"sapling_spruce",slotSize*15,slotSize*3,slotSize*(15+1),slotSize*(3+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_0",new SimpleIcon(L"cloth_0",slotSize*0,slotSize*4,slotSize*(0+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"mobSpawner",new SimpleIcon(L"mobSpawner",slotSize*1,slotSize*4,slotSize*(1+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"snow",new SimpleIcon(L"snow",slotSize*2,slotSize*4,slotSize*(2+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"ice",new SimpleIcon(L"ice",slotSize*3,slotSize*4,slotSize*(3+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"snow_side",new SimpleIcon(L"snow_side",slotSize*4,slotSize*4,slotSize*(4+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"cactus_top",new SimpleIcon(L"cactus_top",slotSize*5,slotSize*4,slotSize*(5+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"cactus_side",new SimpleIcon(L"cactus_side",slotSize*6,slotSize*4,slotSize*(6+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"cactus_bottom",new SimpleIcon(L"cactus_bottom",slotSize*7,slotSize*4,slotSize*(7+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"clay",new SimpleIcon(L"clay",slotSize*8,slotSize*4,slotSize*(8+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"reeds",new SimpleIcon(L"reeds",slotSize*9,slotSize*4,slotSize*(9+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"musicBlock",new SimpleIcon(L"musicBlock",slotSize*10,slotSize*4,slotSize*(10+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"jukebox_top",new SimpleIcon(L"jukebox_top",slotSize*11,slotSize*4,slotSize*(11+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"waterlily",new SimpleIcon(L"waterlily",slotSize*12,slotSize*4,slotSize*(12+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"mycel_side",new SimpleIcon(L"mycel_side",slotSize*13,slotSize*4,slotSize*(13+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"mycel_top",new SimpleIcon(L"mycel_top",slotSize*14,slotSize*4,slotSize*(14+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"sapling_birch",new SimpleIcon(L"sapling_birch",slotSize*15,slotSize*4,slotSize*(15+1),slotSize*(4+1)))); - texturesByName.insert(stringIconMap::value_type(L"torch",new SimpleIcon(L"torch",slotSize*0,slotSize*5,slotSize*(0+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"doorWood_upper",new SimpleIcon(L"doorWood_upper",slotSize*1,slotSize*5,slotSize*(1+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"doorIron_upper",new SimpleIcon(L"doorIron_upper",slotSize*2,slotSize*5,slotSize*(2+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"ladder",new SimpleIcon(L"ladder",slotSize*3,slotSize*5,slotSize*(3+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"trapdoor",new SimpleIcon(L"trapdoor",slotSize*4,slotSize*5,slotSize*(4+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"fenceIron",new SimpleIcon(L"fenceIron",slotSize*5,slotSize*5,slotSize*(5+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"farmland_wet",new SimpleIcon(L"farmland_wet",slotSize*6,slotSize*5,slotSize*(6+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"farmland_dry",new SimpleIcon(L"farmland_dry",slotSize*7,slotSize*5,slotSize*(7+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"crops_0",new SimpleIcon(L"crops_0",slotSize*8,slotSize*5,slotSize*(8+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"crops_1",new SimpleIcon(L"crops_1",slotSize*9,slotSize*5,slotSize*(9+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"crops_2",new SimpleIcon(L"crops_2",slotSize*10,slotSize*5,slotSize*(10+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"crops_3",new SimpleIcon(L"crops_3",slotSize*11,slotSize*5,slotSize*(11+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"crops_4",new SimpleIcon(L"crops_4",slotSize*12,slotSize*5,slotSize*(12+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"crops_5",new SimpleIcon(L"crops_5",slotSize*13,slotSize*5,slotSize*(13+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"crops_6",new SimpleIcon(L"crops_6",slotSize*14,slotSize*5,slotSize*(14+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"crops_7",new SimpleIcon(L"crops_7",slotSize*15,slotSize*5,slotSize*(15+1),slotSize*(5+1)))); - texturesByName.insert(stringIconMap::value_type(L"lever",new SimpleIcon(L"lever",slotSize*0,slotSize*6,slotSize*(0+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"doorWood_lower",new SimpleIcon(L"doorWood_lower",slotSize*1,slotSize*6,slotSize*(1+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"doorIron_lower",new SimpleIcon(L"doorIron_lower",slotSize*2,slotSize*6,slotSize*(2+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"redtorch_lit",new SimpleIcon(L"redtorch_lit",slotSize*3,slotSize*6,slotSize*(3+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"stonebricksmooth_mossy",new SimpleIcon(L"stonebricksmooth_mossy",slotSize*4,slotSize*6,slotSize*(4+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"stonebricksmooth_cracked",new SimpleIcon(L"stonebricksmooth_cracked",slotSize*5,slotSize*6,slotSize*(5+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"pumpkin_top",new SimpleIcon(L"pumpkin_top",slotSize*6,slotSize*6,slotSize*(6+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"hellrock",new SimpleIcon(L"hellrock",slotSize*7,slotSize*6,slotSize*(7+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"hellsand",new SimpleIcon(L"hellsand",slotSize*8,slotSize*6,slotSize*(8+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"lightgem",new SimpleIcon(L"lightgem",slotSize*9,slotSize*6,slotSize*(9+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"piston_top_sticky",new SimpleIcon(L"piston_top_sticky",slotSize*10,slotSize*6,slotSize*(10+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"piston_top",new SimpleIcon(L"piston_top",slotSize*11,slotSize*6,slotSize*(11+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"piston_side",new SimpleIcon(L"piston_side",slotSize*12,slotSize*6,slotSize*(12+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"piston_bottom",new SimpleIcon(L"piston_bottom",slotSize*13,slotSize*6,slotSize*(13+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"piston_inner_top",new SimpleIcon(L"piston_inner_top",slotSize*14,slotSize*6,slotSize*(14+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"stem_straight",new SimpleIcon(L"stem_straight",slotSize*15,slotSize*6,slotSize*(15+1),slotSize*(6+1)))); - texturesByName.insert(stringIconMap::value_type(L"rail_turn",new SimpleIcon(L"rail_turn",slotSize*0,slotSize*7,slotSize*(0+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_15",new SimpleIcon(L"cloth_15",slotSize*1,slotSize*7,slotSize*(1+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_7",new SimpleIcon(L"cloth_7",slotSize*2,slotSize*7,slotSize*(2+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"redtorch",new SimpleIcon(L"redtorch",slotSize*3,slotSize*7,slotSize*(3+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"tree_spruce",new SimpleIcon(L"tree_spruce",slotSize*4,slotSize*7,slotSize*(4+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"tree_birch",new SimpleIcon(L"tree_birch",slotSize*5,slotSize*7,slotSize*(5+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"pumpkin_side",new SimpleIcon(L"pumpkin_side",slotSize*6,slotSize*7,slotSize*(6+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"pumpkin_face",new SimpleIcon(L"pumpkin_face",slotSize*7,slotSize*7,slotSize*(7+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"pumpkin_jack",new SimpleIcon(L"pumpkin_jack",slotSize*8,slotSize*7,slotSize*(8+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"cake_top",new SimpleIcon(L"cake_top",slotSize*9,slotSize*7,slotSize*(9+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"cake_side",new SimpleIcon(L"cake_side",slotSize*10,slotSize*7,slotSize*(10+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"cake_inner",new SimpleIcon(L"cake_inner",slotSize*11,slotSize*7,slotSize*(11+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"cake_bottom",new SimpleIcon(L"cake_bottom",slotSize*12,slotSize*7,slotSize*(12+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"mushroom_skin_red",new SimpleIcon(L"mushroom_skin_red",slotSize*13,slotSize*7,slotSize*(13+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"mushroom_skin_brown",new SimpleIcon(L"mushroom_skin_brown",slotSize*14,slotSize*7,slotSize*(14+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"stem_bent",new SimpleIcon(L"stem_bent",slotSize*15,slotSize*7,slotSize*(15+1),slotSize*(7+1)))); - texturesByName.insert(stringIconMap::value_type(L"rail",new SimpleIcon(L"rail",slotSize*0,slotSize*8,slotSize*(0+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_14",new SimpleIcon(L"cloth_14",slotSize*1,slotSize*8,slotSize*(1+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_6",new SimpleIcon(L"cloth_6",slotSize*2,slotSize*8,slotSize*(2+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"repeater",new SimpleIcon(L"repeater",slotSize*3,slotSize*8,slotSize*(3+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"leaves_spruce",new SimpleIcon(L"leaves_spruce",slotSize*4,slotSize*8,slotSize*(4+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"leaves_spruce_opaque",new SimpleIcon(L"leaves_spruce_opaque",slotSize*5,slotSize*8,slotSize*(5+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"bed_feet_top",new SimpleIcon(L"bed_feet_top",slotSize*6,slotSize*8,slotSize*(6+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"bed_head_top",new SimpleIcon(L"bed_head_top",slotSize*7,slotSize*8,slotSize*(7+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"melon_side",new SimpleIcon(L"melon_side",slotSize*8,slotSize*8,slotSize*(8+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"melon_top",new SimpleIcon(L"melon_top",slotSize*9,slotSize*8,slotSize*(9+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"cauldron_top",new SimpleIcon(L"cauldron_top",slotSize*10,slotSize*8,slotSize*(10+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"cauldron_inner",new SimpleIcon(L"cauldron_inner",slotSize*11,slotSize*8,slotSize*(11+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"mushroom_skin_stem",new SimpleIcon(L"mushroom_skin_stem",slotSize*13,slotSize*8,slotSize*(13+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"mushroom_inside",new SimpleIcon(L"mushroom_inside",slotSize*14,slotSize*8,slotSize*(14+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"vine",new SimpleIcon(L"vine",slotSize*15,slotSize*8,slotSize*(15+1),slotSize*(8+1)))); - texturesByName.insert(stringIconMap::value_type(L"blockLapis",new SimpleIcon(L"blockLapis",slotSize*0,slotSize*9,slotSize*(0+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_13",new SimpleIcon(L"cloth_13",slotSize*1,slotSize*9,slotSize*(1+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_5",new SimpleIcon(L"cloth_5",slotSize*2,slotSize*9,slotSize*(2+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"repeater_lit",new SimpleIcon(L"repeater_lit",slotSize*3,slotSize*9,slotSize*(3+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"thinglass_top",new SimpleIcon(L"thinglass_top",slotSize*4,slotSize*9,slotSize*(4+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"bed_feet_end",new SimpleIcon(L"bed_feet_end",slotSize*5,slotSize*9,slotSize*(5+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"bed_feet_side",new SimpleIcon(L"bed_feet_side",slotSize*6,slotSize*9,slotSize*(6+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"bed_head_side",new SimpleIcon(L"bed_head_side",slotSize*7,slotSize*9,slotSize*(7+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"bed_head_end",new SimpleIcon(L"bed_head_end",slotSize*8,slotSize*9,slotSize*(8+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"tree_jungle",new SimpleIcon(L"tree_jungle",slotSize*9,slotSize*9,slotSize*(9+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"cauldron_side",new SimpleIcon(L"cauldron_side",slotSize*10,slotSize*9,slotSize*(10+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"cauldron_bottom",new SimpleIcon(L"cauldron_bottom",slotSize*11,slotSize*9,slotSize*(11+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"brewingStand_base",new SimpleIcon(L"brewingStand_base",slotSize*12,slotSize*9,slotSize*(12+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"brewingStand",new SimpleIcon(L"brewingStand",slotSize*13,slotSize*9,slotSize*(13+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"endframe_top",new SimpleIcon(L"endframe_top",slotSize*14,slotSize*9,slotSize*(14+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"endframe_side",new SimpleIcon(L"endframe_side",slotSize*15,slotSize*9,slotSize*(15+1),slotSize*(9+1)))); - texturesByName.insert(stringIconMap::value_type(L"oreLapis",new SimpleIcon(L"oreLapis",slotSize*0,slotSize*10,slotSize*(0+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_12",new SimpleIcon(L"cloth_12",slotSize*1,slotSize*10,slotSize*(1+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_4",new SimpleIcon(L"cloth_4",slotSize*2,slotSize*10,slotSize*(2+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"goldenRail",new SimpleIcon(L"goldenRail",slotSize*3,slotSize*10,slotSize*(3+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"redstoneDust_cross",new SimpleIcon(L"redstoneDust_cross",slotSize*4,slotSize*10,slotSize*(4+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"redstoneDust_line",new SimpleIcon(L"redstoneDust_line",slotSize*5,slotSize*10,slotSize*(5+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"enchantment_top",new SimpleIcon(L"enchantment_top",slotSize*6,slotSize*10,slotSize*(6+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"dragonEgg",new SimpleIcon(L"dragonEgg",slotSize*7,slotSize*10,slotSize*(7+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"cocoa_2",new SimpleIcon(L"cocoa_2",slotSize*8,slotSize*10,slotSize*(8+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"cocoa_1",new SimpleIcon(L"cocoa_1",slotSize*9,slotSize*10,slotSize*(9+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"cocoa_0",new SimpleIcon(L"cocoa_0",slotSize*10,slotSize*10,slotSize*(10+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"oreEmerald",new SimpleIcon(L"oreEmerald",slotSize*11,slotSize*10,slotSize*(11+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"tripWireSource",new SimpleIcon(L"tripWireSource",slotSize*12,slotSize*10,slotSize*(12+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"tripWire",new SimpleIcon(L"tripWire",slotSize*13,slotSize*10,slotSize*(13+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"endframe_eye",new SimpleIcon(L"endframe_eye",slotSize*14,slotSize*10,slotSize*(14+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"whiteStone",new SimpleIcon(L"whiteStone",slotSize*15,slotSize*10,slotSize*(15+1),slotSize*(10+1)))); - texturesByName.insert(stringIconMap::value_type(L"sandstone_top",new SimpleIcon(L"sandstone_top",slotSize*0,slotSize*11,slotSize*(0+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_11",new SimpleIcon(L"cloth_11",slotSize*1,slotSize*11,slotSize*(1+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_3",new SimpleIcon(L"cloth_3",slotSize*2,slotSize*11,slotSize*(2+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"goldenRail_powered",new SimpleIcon(L"goldenRail_powered",slotSize*3,slotSize*11,slotSize*(3+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"redstoneDust_cross_overlay",new SimpleIcon(L"redstoneDust_cross_overlay",slotSize*4,slotSize*11,slotSize*(4+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"redstoneDust_line_overlay",new SimpleIcon(L"redstoneDust_line_overlay",slotSize*5,slotSize*11,slotSize*(5+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"enchantment_side",new SimpleIcon(L"enchantment_side",slotSize*6,slotSize*11,slotSize*(6+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"enchantment_bottom",new SimpleIcon(L"enchantment_bottom",slotSize*7,slotSize*11,slotSize*(7+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"commandBlock",new SimpleIcon(L"commandBlock",slotSize*8,slotSize*11,slotSize*(8+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"itemframe_back",new SimpleIcon(L"itemframe_back",slotSize*9,slotSize*11,slotSize*(9+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"flowerPot",new SimpleIcon(L"flowerPot",slotSize*10,slotSize*11,slotSize*(10+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"comparator",new SimpleIcon(L"comparator",slotSize*11,slotSize*11,slotSize*(11+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"comparator_lit",new SimpleIcon(L"comparator_lit",slotSize*12,slotSize*11,slotSize*(12+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"activatorRail",new SimpleIcon(L"activatorRail",slotSize*13,slotSize*11,slotSize*(13+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"activatorRail_powered",new SimpleIcon(L"activatorRail_powered",slotSize*14,slotSize*11,slotSize*(14+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherquartz",new SimpleIcon(L"netherquartz",slotSize*15,slotSize*11,slotSize*(15+1),slotSize*(11+1)))); - texturesByName.insert(stringIconMap::value_type(L"sandstone_side",new SimpleIcon(L"sandstone_side",slotSize*0,slotSize*12,slotSize*(0+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_10",new SimpleIcon(L"cloth_10",slotSize*1,slotSize*12,slotSize*(1+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_2",new SimpleIcon(L"cloth_2",slotSize*2,slotSize*12,slotSize*(2+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"detectorRail",new SimpleIcon(L"detectorRail",slotSize*3,slotSize*12,slotSize*(3+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"leaves_jungle",new SimpleIcon(L"leaves_jungle",slotSize*4,slotSize*12,slotSize*(4+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"leaves_jungle_opaque",new SimpleIcon(L"leaves_jungle_opaque",slotSize*5,slotSize*12,slotSize*(5+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"wood_spruce",new SimpleIcon(L"wood_spruce",slotSize*6,slotSize*12,slotSize*(6+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"wood_jungle",new SimpleIcon(L"wood_jungle",slotSize*7,slotSize*12,slotSize*(7+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"carrots_0",new SimpleIcon(L"carrots_0",slotSize*8,slotSize*12,slotSize*(8+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"carrots_1",new SimpleIcon(L"carrots_1",slotSize*9,slotSize*12,slotSize*(9+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"carrots_2",new SimpleIcon(L"carrots_2",slotSize*10,slotSize*12,slotSize*(10+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"carrots_3",new SimpleIcon(L"carrots_3",slotSize*11,slotSize*12,slotSize*(11+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"potatoes_0",new SimpleIcon(L"potatoes_0",slotSize*8,slotSize*12,slotSize*(8+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"potatoes_1",new SimpleIcon(L"potatoes_1",slotSize*9,slotSize*12,slotSize*(9+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"potatoes_2",new SimpleIcon(L"potatoes_2",slotSize*10,slotSize*12,slotSize*(10+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"potatoes_3",new SimpleIcon(L"potatoes_3",slotSize*12,slotSize*12,slotSize*(12+1),slotSize*(12+1)))); - texturesByName.insert(stringIconMap::value_type(L"water",new SimpleIcon(L"water",slotSize*13,slotSize*12,slotSize*(13+1),slotSize*(12+1)))); - texturesToAnimate.push_back(pair(L"water",L"water")); - texturesByName.insert(stringIconMap::value_type(L"water_flow",new SimpleIcon(L"water_flow",slotSize*14,slotSize*12,slotSize*(14+2),slotSize*(12+2)))); - texturesToAnimate.push_back(pair(L"water_flow",L"water_flow")); - texturesByName.insert(stringIconMap::value_type(L"sandstone_bottom",new SimpleIcon(L"sandstone_bottom",slotSize*0,slotSize*13,slotSize*(0+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_9",new SimpleIcon(L"cloth_9",slotSize*1,slotSize*13,slotSize*(1+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_1",new SimpleIcon(L"cloth_1",slotSize*2,slotSize*13,slotSize*(2+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"redstoneLight",new SimpleIcon(L"redstoneLight",slotSize*3,slotSize*13,slotSize*(3+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"redstoneLight_lit",new SimpleIcon(L"redstoneLight_lit",slotSize*4,slotSize*13,slotSize*(4+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"stonebricksmooth_carved",new SimpleIcon(L"stonebricksmooth_carved",slotSize*5,slotSize*13,slotSize*(5+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"wood_birch",new SimpleIcon(L"wood_birch",slotSize*6,slotSize*13,slotSize*(6+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"anvil_base",new SimpleIcon(L"anvil_base",slotSize*7,slotSize*13,slotSize*(7+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"anvil_top_damaged_1",new SimpleIcon(L"anvil_top_damaged_1",slotSize*8,slotSize*13,slotSize*(8+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"quartzblock_chiseled_top",new SimpleIcon(L"quartzblock_chiseled_top",slotSize*9,slotSize*13,slotSize*(9+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"quartzblock_lines_top",new SimpleIcon(L"quartzblock_lines_top",slotSize*10,slotSize*13,slotSize*(10+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"quartzblock_top",new SimpleIcon(L"quartzblock_top",slotSize*11,slotSize*13,slotSize*(11+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"hopper",new SimpleIcon(L"hopper",slotSize*12,slotSize*13,slotSize*(12+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"detectorRail_on",new SimpleIcon(L"detectorRail_on",slotSize*13,slotSize*13,slotSize*(13+1),slotSize*(13+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherBrick",new SimpleIcon(L"netherBrick",slotSize*0,slotSize*14,slotSize*(0+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"cloth_8",new SimpleIcon(L"cloth_8",slotSize*1,slotSize*14,slotSize*(1+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherStalk_0",new SimpleIcon(L"netherStalk_0",slotSize*2,slotSize*14,slotSize*(2+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherStalk_1",new SimpleIcon(L"netherStalk_1",slotSize*3,slotSize*14,slotSize*(3+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"netherStalk_2",new SimpleIcon(L"netherStalk_2",slotSize*4,slotSize*14,slotSize*(4+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"sandstone_carved",new SimpleIcon(L"sandstone_carved",slotSize*5,slotSize*14,slotSize*(5+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"sandstone_smooth",new SimpleIcon(L"sandstone_smooth",slotSize*6,slotSize*14,slotSize*(6+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"anvil_top",new SimpleIcon(L"anvil_top",slotSize*7,slotSize*14,slotSize*(7+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"anvil_top_damaged_2",new SimpleIcon(L"anvil_top_damaged_2",slotSize*8,slotSize*14,slotSize*(8+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"quartzblock_chiseled",new SimpleIcon(L"quartzblock_chiseled",slotSize*9,slotSize*14,slotSize*(9+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"quartzblock_lines",new SimpleIcon(L"quartzblock_lines",slotSize*10,slotSize*14,slotSize*(10+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"quartzblock_side",new SimpleIcon(L"quartzblock_side",slotSize*11,slotSize*14,slotSize*(11+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"hopper_inside",new SimpleIcon(L"hopper_inside",slotSize*12,slotSize*14,slotSize*(12+1),slotSize*(14+1)))); - texturesByName.insert(stringIconMap::value_type(L"lava",new SimpleIcon(L"lava",slotSize*13,slotSize*14,slotSize*(13+1),slotSize*(14+1)))); - texturesToAnimate.push_back(pair(L"lava",L"lava")); - texturesByName.insert(stringIconMap::value_type(L"lava_flow",new SimpleIcon(L"lava_flow",slotSize*14,slotSize*14,slotSize*(14+2),slotSize*(14+2)))); - texturesToAnimate.push_back(pair(L"lava_flow",L"lava_flow")); - texturesByName.insert(stringIconMap::value_type(L"destroy_0",new SimpleIcon(L"destroy_0",slotSize*0,slotSize*15,slotSize*(0+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_1",new SimpleIcon(L"destroy_1",slotSize*1,slotSize*15,slotSize*(1+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_2",new SimpleIcon(L"destroy_2",slotSize*2,slotSize*15,slotSize*(2+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_3",new SimpleIcon(L"destroy_3",slotSize*3,slotSize*15,slotSize*(3+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_4",new SimpleIcon(L"destroy_4",slotSize*4,slotSize*15,slotSize*(4+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_5",new SimpleIcon(L"destroy_5",slotSize*5,slotSize*15,slotSize*(5+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_6",new SimpleIcon(L"destroy_6",slotSize*6,slotSize*15,slotSize*(6+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_7",new SimpleIcon(L"destroy_7",slotSize*7,slotSize*15,slotSize*(7+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_8",new SimpleIcon(L"destroy_8",slotSize*8,slotSize*15,slotSize*(8+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"destroy_9",new SimpleIcon(L"destroy_9",slotSize*9,slotSize*15,slotSize*(9+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"quartzblock_bottom",new SimpleIcon(L"quartzblock_bottom",slotSize*11,slotSize*15,slotSize*(11+1),slotSize*(15+1)))); - texturesByName.insert(stringIconMap::value_type(L"hopper_top",new SimpleIcon(L"hopper_top",slotSize*12,slotSize*15,slotSize*(12+1),slotSize*(15+1)))); + ADD_ICON(0, 4, L"planks_oak") + ADD_ICON(0, 5, L"stoneslab_side") + ADD_ICON(0, 6, L"stoneslab_top") + ADD_ICON(0, 7, L"brick") + ADD_ICON(0, 8, L"tnt_side") + ADD_ICON(0, 9, L"tnt_top") + ADD_ICON(0, 10, L"tnt_bottom") + ADD_ICON(0, 11, L"web") + ADD_ICON(0, 12, L"flower_rose") + ADD_ICON(0, 13, L"flower_dandelion") + ADD_ICON(0, 14, L"portal") + ADD_ICON(0, 15, L"sapling") + + ADD_ICON(1, 0, L"cobblestone"); + ADD_ICON(1, 1, L"bedrock"); + ADD_ICON(1, 2, L"sand"); + ADD_ICON(1, 3, L"gravel"); + ADD_ICON(1, 4, L"log_oak"); + ADD_ICON(1, 5, L"log_oak_top"); + ADD_ICON(1, 6, L"iron_block"); + ADD_ICON(1, 7, L"gold_block"); + ADD_ICON(1, 8, L"diamond_block"); + ADD_ICON(1, 9, L"emerald_block"); + ADD_ICON(1, 10, L"redstone_block"); + ADD_ICON(1, 11, L"dropper_front_horizontal"); + ADD_ICON(1, 12, L"mushroom_red"); + ADD_ICON(1, 13, L"mushroom_brown"); + ADD_ICON(1, 14, L"sapling_jungle"); + ADD_ICON(1, 15, L"fire_0"); + + ADD_ICON(2, 0, L"gold_ore"); + ADD_ICON(2, 1, L"iron_ore"); + ADD_ICON(2, 2, L"coal_ore"); + ADD_ICON(2, 3, L"bookshelf"); + ADD_ICON(2, 4, L"cobblestone_mossy"); + ADD_ICON(2, 5, L"obsidian"); + ADD_ICON(2, 6, L"grass_side_overlay"); + ADD_ICON(2, 7, L"tallgrass"); + ADD_ICON(2, 8, L"dispenser_front_vertical"); + ADD_ICON(2, 9, L"beacon"); + ADD_ICON(2, 10, L"dropper_front_vertical"); + ADD_ICON(2, 11, L"workbench_top"); + ADD_ICON(2, 12, L"furnace_front"); + ADD_ICON(2, 13, L"furnace_side"); + ADD_ICON(2, 14, L"dispenser_front"); + ADD_ICON(2, 15, L"fire_1"); + + ADD_ICON(3, 0, L"sponge"); + ADD_ICON(3, 1, L"glass"); + ADD_ICON(3, 2, L"diamond_ore"); + ADD_ICON(3, 3, L"redstone_ore"); + ADD_ICON(3, 4, L"leaves"); + ADD_ICON(3, 5, L"leaves_opaque"); + ADD_ICON(3, 6, L"stonebrick"); + ADD_ICON(3, 7, L"deadbush"); + ADD_ICON(3, 8, L"fern"); + ADD_ICON(3, 9, L"daylight_detector_top"); + ADD_ICON(3, 10, L"daylight_detector_side"); + ADD_ICON(3, 11, L"workbench_side"); + ADD_ICON(3, 12, L"workbench_front"); + ADD_ICON(3, 13, L"furnace_front_lit"); + ADD_ICON(3, 14, L"furnace_top"); + ADD_ICON(3, 15, L"sapling_spruce"); + + ADD_ICON(4, 0, L"wool_colored_white"); + ADD_ICON(4, 1, L"mob_spawner"); + ADD_ICON(4, 2, L"snow"); + ADD_ICON(4, 3, L"ice"); + ADD_ICON(4, 4, L"snow_side"); + ADD_ICON(4, 5, L"cactus_top"); + ADD_ICON(4, 6, L"cactus_side"); + ADD_ICON(4, 7, L"cactus_bottom"); + ADD_ICON(4, 8, L"clay"); + ADD_ICON(4, 9, L"reeds"); + ADD_ICON(4, 10, L"jukebox_side"); + ADD_ICON(4, 11, L"jukebox_top"); + ADD_ICON(4, 12, L"waterlily"); + ADD_ICON(4, 13, L"mycel_side"); + ADD_ICON(4, 14, L"mycel_top"); + ADD_ICON(4, 15, L"sapling_birch"); + + ADD_ICON(5, 0, L"torch_on"); + ADD_ICON(5, 1, L"door_wood_upper"); + ADD_ICON(5, 2, L"door_iron_upper"); + ADD_ICON(5, 3, L"ladder"); + ADD_ICON(5, 4, L"trapdoor"); + ADD_ICON(5, 5, L"iron_bars"); + ADD_ICON(5, 6, L"farmland_wet"); + ADD_ICON(5, 7, L"farmland_dry"); + ADD_ICON(5, 8, L"crops_0"); + ADD_ICON(5, 9, L"crops_1"); + ADD_ICON(5, 10, L"crops_2"); + ADD_ICON(5, 11, L"crops_3"); + ADD_ICON(5, 12, L"crops_4"); + ADD_ICON(5, 13, L"crops_5"); + ADD_ICON(5, 14, L"crops_6"); + ADD_ICON(5, 15, L"crops_7"); + + ADD_ICON(6, 0, L"lever"); + ADD_ICON(6, 1, L"door_wood_lower"); + ADD_ICON(6, 2, L"door_iron_lower"); + ADD_ICON(6, 3, L"redstone_torch_on"); + ADD_ICON(6, 4, L"stonebrick_mossy"); + ADD_ICON(6, 5, L"stonebrick_cracked"); + ADD_ICON(6, 6, L"pumpkin_top"); + ADD_ICON(6, 7, L"netherrack"); + ADD_ICON(6, 8, L"soul_sand"); + ADD_ICON(6, 9, L"glowstone"); + ADD_ICON(6, 10, L"piston_top_sticky"); + ADD_ICON(6, 11, L"piston_top"); + ADD_ICON(6, 12, L"piston_side"); + ADD_ICON(6, 13, L"piston_bottom"); + ADD_ICON(6, 14, L"piston_inner_top"); + ADD_ICON(6, 15, L"stem_straight"); + + ADD_ICON(7, 0, L"rail_normal_turned"); + ADD_ICON(7, 1, L"wool_colored_black"); + ADD_ICON(7, 2, L"wool_colored_gray"); + ADD_ICON(7, 3, L"redstone_torch_off"); + ADD_ICON(7, 4, L"log_spruce"); + ADD_ICON(7, 5, L"log_birch"); + ADD_ICON(7, 6, L"pumpkin_side"); + ADD_ICON(7, 7, L"pumpkin_face_off"); + ADD_ICON(7, 8, L"pumpkin_face_on"); + ADD_ICON(7, 9, L"cake_top"); + ADD_ICON(7, 10, L"cake_side"); + ADD_ICON(7, 11, L"cake_inner"); + ADD_ICON(7, 12, L"cake_bottom"); + ADD_ICON(7, 13, L"mushroom_block_skin_red"); + ADD_ICON(7, 14, L"mushroom_block_skin_brown"); + ADD_ICON(7, 15, L"stem_bent"); + + ADD_ICON(8, 0, L"rail_normal"); + ADD_ICON(8, 1, L"wool_colored_red"); + ADD_ICON(8, 2, L"wool_colored_pink"); + ADD_ICON(8, 3, L"repeater_off"); + ADD_ICON(8, 4, L"leaves_spruce"); + ADD_ICON(8, 5, L"leaves_spruce_opaque"); + ADD_ICON(8, 6, L"bed_feet_top"); + ADD_ICON(8, 7, L"bed_head_top"); + ADD_ICON(8, 8, L"melon_side"); + ADD_ICON(8, 9, L"melon_top"); + ADD_ICON(8, 10, L"cauldron_top"); + ADD_ICON(8, 11, L"cauldron_inner"); + //ADD_ICON(8, 12, L"unused"); + ADD_ICON(8, 13, L"mushroom_block_skin_stem"); + ADD_ICON(8, 14, L"mushroom_block_inside"); + ADD_ICON(8, 15, L"vine"); + + ADD_ICON(9, 0, L"lapis_block"); + ADD_ICON(9, 1, L"wool_colored_green"); + ADD_ICON(9, 2, L"wool_colored_lime"); + ADD_ICON(9, 3, L"repeater_on"); + ADD_ICON(9, 4, L"glass_pane_top"); + ADD_ICON(9, 5, L"bed_feet_end"); + ADD_ICON(9, 6, L"bed_feet_side"); + ADD_ICON(9, 7, L"bed_head_side"); + ADD_ICON(9, 8, L"bed_head_end"); + ADD_ICON(9, 9, L"log_jungle"); + ADD_ICON(9, 10, L"cauldron_side"); + ADD_ICON(9, 11, L"cauldron_bottom"); + ADD_ICON(9, 12, L"brewing_stand_base"); + ADD_ICON(9, 13, L"brewing_stand"); + ADD_ICON(9, 14, L"endframe_top"); + ADD_ICON(9, 15, L"endframe_side"); + + ADD_ICON(10, 0, L"lapis_ore"); + ADD_ICON(10, 1, L"wool_colored_brown"); + ADD_ICON(10, 2, L"wool_colored_yellow"); + ADD_ICON(10, 3, L"rail_golden"); + ADD_ICON(10, 4, L"redstone_dust_cross"); + ADD_ICON(10, 5, L"redstone_dust_line"); + ADD_ICON(10, 6, L"enchantment_top"); + ADD_ICON(10, 7, L"dragon_egg"); + ADD_ICON(10, 8, L"cocoa_2"); + ADD_ICON(10, 9, L"cocoa_1"); + ADD_ICON(10, 10, L"cocoa_0"); + ADD_ICON(10, 11, L"emerald_ore"); + ADD_ICON(10, 12, L"trip_wire_source"); + ADD_ICON(10, 13, L"trip_wire"); + ADD_ICON(10, 14, L"endframe_eye"); + ADD_ICON(10, 15, L"end_stone"); + + ADD_ICON(11, 0, L"sandstone_top"); + ADD_ICON(11, 1, L"wool_colored_blue"); + ADD_ICON(11, 2, L"wool_colored_light_blue"); + ADD_ICON(11, 3, L"rail_golden_powered"); + ADD_ICON(11, 4, L"redstone_dust_cross_overlay"); + ADD_ICON(11, 5, L"redstone_dust_line_overlay"); + ADD_ICON(11, 6, L"enchantment_side"); + ADD_ICON(11, 7, L"enchantment_bottom"); + ADD_ICON(11, 8, L"command_block"); + ADD_ICON(11, 9, L"itemframe_back"); + ADD_ICON(11, 10, L"flower_pot"); + ADD_ICON(11, 11, L"comparator_off"); + ADD_ICON(11, 12, L"comparator_on"); + ADD_ICON(11, 13, L"rail_activator"); + ADD_ICON(11, 14, L"rail_activator_powered"); + ADD_ICON(11, 15, L"quartz_ore"); + + ADD_ICON(12, 0, L"sandstone_side"); + ADD_ICON(12, 1, L"wool_colored_purple"); + ADD_ICON(12, 2, L"wool_colored_magenta"); + ADD_ICON(12, 3, L"detectorRail"); + ADD_ICON(12, 4, L"leaves_jungle"); + ADD_ICON(12, 5, L"leaves_jungle_opaque"); + ADD_ICON(12, 6, L"planks_spruce"); + ADD_ICON(12, 7, L"planks_jungle"); + ADD_ICON(12, 8, L"carrots_stage_0"); + ADD_ICON(12, 9, L"carrots_stage_1"); + ADD_ICON(12, 10, L"carrots_stage_2"); + ADD_ICON(12, 11, L"carrots_stage_3"); + //ADD_ICON(12, 12, L"unused"); + ADD_ICON(12, 13, L"water"); + ADD_ICON_SIZE(12,14,L"water_flow",2,2); + + ADD_ICON(13, 0, L"sandstone_bottom"); + ADD_ICON(13, 1, L"wool_colored_cyan"); + ADD_ICON(13, 2, L"wool_colored_orange"); + ADD_ICON(13, 3, L"redstoneLight"); + ADD_ICON(13, 4, L"redstoneLight_lit"); + ADD_ICON(13, 5, L"stonebrick_carved"); + ADD_ICON(13, 6, L"planks_birch"); + ADD_ICON(13, 7, L"anvil_base"); + ADD_ICON(13, 8, L"anvil_top_damaged_1"); + ADD_ICON(13, 9, L"quartz_block_chiseled_top"); + ADD_ICON(13, 10, L"quartz_block_lines_top"); + ADD_ICON(13, 11, L"quartz_block_top"); + ADD_ICON(13, 12, L"hopper_outside"); + ADD_ICON(13, 13, L"detectorRail_on"); + + ADD_ICON(14, 0, L"nether_brick"); + ADD_ICON(14, 1, L"wool_colored_silver"); + ADD_ICON(14, 2, L"nether_wart_stage_0"); + ADD_ICON(14, 3, L"nether_wart_stage_1"); + ADD_ICON(14, 4, L"nether_wart_stage_2"); + ADD_ICON(14, 5, L"sandstone_carved"); + ADD_ICON(14, 6, L"sandstone_smooth"); + ADD_ICON(14, 7, L"anvil_top"); + ADD_ICON(14, 8, L"anvil_top_damaged_2"); + ADD_ICON(14, 9, L"quartz_block_chiseled"); + ADD_ICON(14, 10, L"quartz_block_lines"); + ADD_ICON(14, 11, L"quartz_block_side"); + ADD_ICON(14, 12, L"hopper_inside"); + ADD_ICON(14, 13, L"lava"); + ADD_ICON_SIZE(14,14,L"lava_flow",2,2); + + ADD_ICON(15, 0, L"destroy_0"); + ADD_ICON(15, 1, L"destroy_1"); + ADD_ICON(15, 2, L"destroy_2"); + ADD_ICON(15, 3, L"destroy_3"); + ADD_ICON(15, 4, L"destroy_4"); + ADD_ICON(15, 5, L"destroy_5"); + ADD_ICON(15, 6, L"destroy_6"); + ADD_ICON(15, 7, L"destroy_7"); + ADD_ICON(15, 8, L"destroy_8"); + ADD_ICON(15, 9, L"destroy_9"); + ADD_ICON(15, 10, L"hay_block_side"); + ADD_ICON(15, 11, L"quartz_block_bottom"); + ADD_ICON(15, 12, L"hopper_top"); + ADD_ICON(15, 13, L"hay_block_top"); + + ADD_ICON(16, 0, L"coal_block"); + ADD_ICON(16, 1, L"hardened_clay"); + ADD_ICON(16, 2, L"noteblock"); + //ADD_ICON(16, 3, L"unused"); + //ADD_ICON(16, 4, L"unused"); + //ADD_ICON(16, 5, L"unused"); + //ADD_ICON(16, 6, L"unused"); + //ADD_ICON(16, 7, L"unused"); + //ADD_ICON(16, 8, L"unused"); + ADD_ICON(16, 9, L"potatoes_stage_0"); + ADD_ICON(16, 10, L"potatoes_stage_1"); + ADD_ICON(16, 11, L"potatoes_stage_2"); + ADD_ICON(16, 12, L"potatoes_stage_3"); + ADD_ICON(16, 13, L"log_spruce_top"); + ADD_ICON(16, 14, L"log_jungle_top"); + ADD_ICON(16, 15, L"log_birch_top"); + + ADD_ICON(17, 0, L"hardened_clay_stained_black"); + ADD_ICON(17, 1, L"hardened_clay_stained_blue"); + ADD_ICON(17, 2, L"hardened_clay_stained_brown"); + ADD_ICON(17, 3, L"hardened_clay_stained_cyan"); + ADD_ICON(17, 4, L"hardened_clay_stained_gray"); + ADD_ICON(17, 5, L"hardened_clay_stained_green"); + ADD_ICON(17, 6, L"hardened_clay_stained_light_blue"); + ADD_ICON(17, 7, L"hardened_clay_stained_lime"); + ADD_ICON(17, 8, L"hardened_clay_stained_magenta"); + ADD_ICON(17, 9, L"hardened_clay_stained_orange"); + ADD_ICON(17, 10, L"hardened_clay_stained_pink"); + ADD_ICON(17, 11, L"hardened_clay_stained_purple"); + ADD_ICON(17, 12, L"hardened_clay_stained_red"); + ADD_ICON(17, 13, L"hardened_clay_stained_silver"); + ADD_ICON(17, 14, L"hardened_clay_stained_white"); + ADD_ICON(17, 15, L"hardened_clay_stained_yellow"); + + ADD_ICON(18, 0, L"glass_black"); + ADD_ICON(18, 1, L"glass_blue"); + ADD_ICON(18, 2, L"glass_brown"); + ADD_ICON(18, 3, L"glass_cyan"); + ADD_ICON(18, 4, L"glass_gray"); + ADD_ICON(18, 5, L"glass_green"); + ADD_ICON(18, 6, L"glass_light_blue"); + ADD_ICON(18, 7, L"glass_lime"); + ADD_ICON(18, 8, L"glass_magenta"); + ADD_ICON(18, 9, L"glass_orange"); + ADD_ICON(18, 10, L"glass_pink"); + ADD_ICON(18, 11, L"glass_purple"); + ADD_ICON(18, 12, L"glass_red"); + ADD_ICON(18, 13, L"glass_silver"); + ADD_ICON(18, 14, L"glass_white"); + ADD_ICON(18, 15, L"glass_yellow"); + + ADD_ICON(19, 0, L"glass_pane_top_black"); + ADD_ICON(19, 1, L"glass_pane_top_blue"); + ADD_ICON(19, 2, L"glass_pane_top_brown"); + ADD_ICON(19, 3, L"glass_pane_top_cyan"); + ADD_ICON(19, 4, L"glass_pane_top_gray"); + ADD_ICON(19, 5, L"glass_pane_top_green"); + ADD_ICON(19, 6, L"glass_pane_top_light_blue"); + ADD_ICON(19, 7, L"glass_pane_top_lime"); + ADD_ICON(19, 8, L"glass_pane_top_magenta"); + ADD_ICON(19, 9, L"glass_pane_top_orange"); + ADD_ICON(19, 10, L"glass_pane_top_pink"); + ADD_ICON(19, 11, L"glass_pane_top_purple"); + ADD_ICON(19, 12, L"glass_pane_top_red"); + ADD_ICON(19, 13, L"glass_pane_top_silver"); + ADD_ICON(19, 14, L"glass_pane_top_white"); + ADD_ICON(19, 15, L"glass_pane_top_yellow"); } } diff --git a/Minecraft.Client/PreStitchedTextureMap.h b/Minecraft.Client/PreStitchedTextureMap.h index 40a755f8..882a7eae 100644 --- a/Minecraft.Client/PreStitchedTextureMap.h +++ b/Minecraft.Client/PreStitchedTextureMap.h @@ -30,13 +30,16 @@ private: Texture *stitchResult; vector animatedTextures; // = new ArrayList(); - vector > texturesToAnimate; - void loadUVs(); public: PreStitchedTextureMap(int type, const wstring &name, const wstring &path, BufferedImage *missingTexture, bool mipMap = false); void stitch(); + +private: + void makeTextureAnimated(TexturePack *texturePack, StitchedTexture *tex); + +public: StitchedTexture *getTexture(const wstring &name); void cycleAnimationFrames(); Texture *getStitchedTexture(); diff --git a/Minecraft.Client/QuadrupedModel.cpp b/Minecraft.Client/QuadrupedModel.cpp index fa7e3b4b..ea041910 100644 --- a/Minecraft.Client/QuadrupedModel.cpp +++ b/Minecraft.Client/QuadrupedModel.cpp @@ -43,7 +43,7 @@ QuadrupedModel::QuadrupedModel(int legSize, float g) : Model() void QuadrupedModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); if (young) { @@ -73,7 +73,7 @@ void QuadrupedModel::render(shared_ptr entity, float time, float r, floa } } -void QuadrupedModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void QuadrupedModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { float rad = (float) (180 / PI); head->xRot = xRot / rad; diff --git a/Minecraft.Client/QuadrupedModel.h b/Minecraft.Client/QuadrupedModel.h index 47c50599..a497b109 100644 --- a/Minecraft.Client/QuadrupedModel.h +++ b/Minecraft.Client/QuadrupedModel.h @@ -8,6 +8,6 @@ public: QuadrupedModel(int legSize, float g); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); void render(QuadrupedModel *model, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/RemotePlayer.cpp b/Minecraft.Client/RemotePlayer.cpp index c1b72864..bea12842 100644 --- a/Minecraft.Client/RemotePlayer.cpp +++ b/Minecraft.Client/RemotePlayer.cpp @@ -3,7 +3,7 @@ #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\Mth.h" -RemotePlayer::RemotePlayer(Level *level, const wstring& name) : Player(level) +RemotePlayer::RemotePlayer(Level *level, const wstring& name) : Player(level, name) { // 4J - added initialisers hasStartedUsingItem = false; @@ -11,22 +11,16 @@ RemotePlayer::RemotePlayer(Level *level, const wstring& name) : Player(level) lx = ly = lz = lyr = lxr = 0.0; fallTime = 0.0f; - this->name = name; - m_UUID = name; app.DebugPrintf("Created RemotePlayer with name %ls\n", name.c_str() ); heightOffset = 0; - this->footSize = 0; - if (name.length() > 0) - { - customTextureUrl = L"";//L"http://s3.amazonaws.com/MinecraftSkins/" + name + L".png"; - } + footSize = 0; - this->noPhysics = true; + noPhysics = true; bedOffsetY = 4 / 16.0f; - this->viewScale = 10; + viewScale = 10; } void RemotePlayer::setDefaultHeadHeight() @@ -34,7 +28,7 @@ void RemotePlayer::setDefaultHeadHeight() heightOffset = 0; } -bool RemotePlayer::hurt(DamageSource *source, int dmg) +bool RemotePlayer::hurt(DamageSource *source, float dmg) { return true; } @@ -113,8 +107,8 @@ void RemotePlayer::aiStep() xRot += (float)((lxr - xRot) / lSteps); lSteps--; - this->setPos(xt, yt, zt); - this->setRot(yRot, xRot); + setPos(xt, yt, zt); + setRot(yRot, xRot); } oBob = bob; @@ -149,4 +143,9 @@ void RemotePlayer::animateRespawn() float RemotePlayer::getHeadHeight() { return 1.82f; +} + +Pos RemotePlayer::getCommandSenderWorldPosition() +{ + return new Pos(floor(x + .5), floor(y + .5), floor(z + .5)); } \ No newline at end of file diff --git a/Minecraft.Client/RemotePlayer.h b/Minecraft.Client/RemotePlayer.h index b55fab16..3fab1dde 100644 --- a/Minecraft.Client/RemotePlayer.h +++ b/Minecraft.Client/RemotePlayer.h @@ -6,6 +6,9 @@ class Input; class RemotePlayer : public Player { +public: + eINSTANCEOF GetType() { return eTYPE_REMOTEPLAYER; } + private: bool hasStartedUsingItem; public: @@ -14,7 +17,7 @@ public: protected: virtual void setDefaultHeadHeight(); public: - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); private: int lSteps; double lx, ly, lz, lyr, lxr; @@ -30,4 +33,5 @@ public: virtual void animateRespawn(); virtual float getHeadHeight(); bool hasPermission(EGameCommand command) { return false; } + virtual Pos getCommandSenderWorldPosition(); }; \ No newline at end of file diff --git a/Minecraft.Client/ResourceLocation.h b/Minecraft.Client/ResourceLocation.h new file mode 100644 index 00000000..f53c46c8 --- /dev/null +++ b/Minecraft.Client/ResourceLocation.h @@ -0,0 +1,71 @@ +#pragma once +#include "Textures.h" + +typedef arrayWithLength<_TEXTURE_NAME> textureNameArray; +class ResourceLocation +{ +private: + textureNameArray m_texture; + wstring m_path; + bool m_preloaded; + +public: + ResourceLocation() + { + m_preloaded = false; + m_path = L""; + } + + ResourceLocation(_TEXTURE_NAME texture) + { + m_texture = textureNameArray(1); + m_texture[0] = texture; + m_preloaded = true; + } + + ResourceLocation(wstring path) + { + m_path = path; + m_preloaded = false; + } + + ResourceLocation(intArray textures) + { + m_texture = textureNameArray(textures.length); + for(unsigned int i = 0; i < textures.length; ++i) + { + m_texture[i] = (_TEXTURE_NAME)textures[i]; + } + m_preloaded = true; + } + + ~ResourceLocation() + { + delete m_texture.data; + } + + _TEXTURE_NAME getTexture() + { + return m_texture[0]; + } + + _TEXTURE_NAME getTexture(int idx) + { + return m_texture[idx]; + } + + int getTextureCount() + { + return m_texture.length; + } + + wstring getPath() + { + return m_path; + } + + bool isPreloaded() + { + return m_preloaded; + } +}; \ No newline at end of file diff --git a/Minecraft.Client/ServerChunkCache.cpp b/Minecraft.Client/ServerChunkCache.cpp index 1fe1a86f..619efa98 100644 --- a/Minecraft.Client/ServerChunkCache.cpp +++ b/Minecraft.Client/ServerChunkCache.cpp @@ -11,6 +11,7 @@ #include "..\Minecraft.World\ThreadName.h" #include "..\Minecraft.World\compression.h" #include "..\Minecraft.World\OldChunkStorage.h" +#include "..\Minecraft.World\Tile.h" ServerChunkCache::ServerChunkCache(ServerLevel *level, ChunkStorage *storage, ChunkSource *source) { @@ -40,6 +41,7 @@ ServerChunkCache::ServerChunkCache(ServerLevel *level, ChunkStorage *storage, Ch // 4J-PB added ServerChunkCache::~ServerChunkCache() { + storage->WaitForAll(); // MGH - added to fix crash bug 175183 delete emptyChunk; delete cache; delete source; @@ -307,6 +309,76 @@ LevelChunk *ServerChunkCache::getChunkLoadedOrUnloaded(int x, int z) } #endif + +// 4J MGH added, for expanding worlds, to kill any player changes and reset the chunk +#ifdef _LARGE_WORLDS +void ServerChunkCache::overwriteLevelChunkFromSource(int x, int z) +{ + int ix = x + XZOFFSET; + int iz = z + XZOFFSET; + // Check we're in range of the stored level + if( ( ix < 0 ) || ( ix >= XZSIZE ) ) assert(0); + if( ( iz < 0 ) || ( iz >= XZSIZE ) ) assert(0); + int idx = ix * XZSIZE + iz; + + LevelChunk *chunk = NULL; + chunk = source->getChunk(x, z); + assert(chunk); + if(chunk) + { + save(chunk); + } +} + + + +void ServerChunkCache::updateOverwriteHellChunk(LevelChunk* origChunk, LevelChunk* playerChunk, int xMin, int xMax, int zMin, int zMax) +{ + + // replace a section of the chunk with the original source data, if it hasn't already changed + for(int x=xMin;xgetTile(x,y,z); + if(playerTile == Tile::unbreakable_Id) // if the tile is still unbreakable, the player hasn't changed it, so we can replace with the source + playerChunk->setTileAndData(x, y, z, origChunk->getTile(x,y,z), origChunk->getData(x,y,z)); + } + } + } +} + +void ServerChunkCache::overwriteHellLevelChunkFromSource(int x, int z, int minVal, int maxVal) +{ + int ix = x + XZOFFSET; + int iz = z + XZOFFSET; + // Check we're in range of the stored level + if( ( ix < 0 ) || ( ix >= XZSIZE ) ) assert(0); + if( ( iz < 0 ) || ( iz >= XZSIZE ) ) assert(0); + int idx = ix * XZSIZE + iz; + autoCreate = true; + LevelChunk* playerChunk = getChunk(x, z); + autoCreate = false; + LevelChunk* origChunk = source->getChunk(x, z); + assert(origChunk); + if(playerChunk!= emptyChunk) + { + if(x == minVal) + updateOverwriteHellChunk(origChunk, playerChunk, 0, 4, 0, 16); + if(x == maxVal) + updateOverwriteHellChunk(origChunk, playerChunk, 12, 16, 0, 16); + if(z == minVal) + updateOverwriteHellChunk(origChunk, playerChunk, 0, 16, 0, 4); + if(z == maxVal) + updateOverwriteHellChunk(origChunk, playerChunk, 0, 16, 12, 16); + } + save(playerChunk); +} + +#endif + // 4J Added // #ifdef _LARGE_WORLDS void ServerChunkCache::dontDrop(int x, int z) @@ -335,7 +407,7 @@ LevelChunk *ServerChunkCache::load(int x, int z) } if (levelChunk != NULL) { - levelChunk->lastSaveTime = level->getTime(); + levelChunk->lastSaveTime = level->getGameTime(); } return levelChunk; } @@ -351,7 +423,7 @@ void ServerChunkCache::save(LevelChunk *levelChunk) { if (storage == NULL) return; - levelChunk->lastSaveTime = level->getTime(); + levelChunk->lastSaveTime = level->getGameTime(); storage->save(level, levelChunk); } @@ -866,20 +938,28 @@ bool ServerChunkCache::tick() LevelChunk *chunk = m_toDrop.front(); if(!chunk->isUnloaded()) { - save(chunk); - saveEntities(chunk); - chunk->unload(true); - - //loadedChunks.remove(cp); - //loadedChunkList.remove(chunk); - AUTO_VAR(it, std::find( m_loadedChunkList.begin(), m_loadedChunkList.end(), chunk) ); - if(it != m_loadedChunkList.end()) m_loadedChunkList.erase(it); - - int ix = chunk->x + XZOFFSET; - int iz = chunk->z + XZOFFSET; - int idx = ix * XZSIZE + iz; - m_unloadedCache[idx] = chunk; - cache[idx] = NULL; + // Don't unload a chunk that contains a player, as this will cause their entity to be removed from the level itself and they will never tick again. + // This can happen if a player moves a long distance in one tick, for example when the server thread has locked up doing something for a while whilst a player + // kept moving. In this case, the player is moved in the player chunk map (driven by the network packets being processed for their new position) before the + // player's tick is called to remove them from the chunk they used to be in, and add them to their current chunk. This will only be a temporary state and + // we should be able to unload the chunk on the next call to this tick. + if( !chunk->containsPlayer() ) + { + save(chunk); + saveEntities(chunk); + chunk->unload(true); + + //loadedChunks.remove(cp); + //loadedChunkList.remove(chunk); + AUTO_VAR(it, std::find( m_loadedChunkList.begin(), m_loadedChunkList.end(), chunk) ); + if(it != m_loadedChunkList.end()) m_loadedChunkList.erase(it); + + int ix = chunk->x + XZOFFSET; + int iz = chunk->z + XZOFFSET; + int idx = ix * XZSIZE + iz; + m_unloadedCache[idx] = chunk; + cache[idx] = NULL; + } } m_toDrop.pop_front(); } @@ -912,6 +992,10 @@ TilePos *ServerChunkCache::findNearestMapFeature(Level *level, const wstring &fe return source->findNearestMapFeature(level, featureName, x, y, z); } +void ServerChunkCache::recreateLogicStructuresForChunk(int chunkX, int chunkZ) +{ +} + int ServerChunkCache::runSaveThreadProc(LPVOID lpParam) { SaveThreadData *params = (SaveThreadData *)lpParam; diff --git a/Minecraft.Client/ServerChunkCache.h b/Minecraft.Client/ServerChunkCache.h index 058cecc4..cf93fdc5 100644 --- a/Minecraft.Client/ServerChunkCache.h +++ b/Minecraft.Client/ServerChunkCache.h @@ -47,6 +47,10 @@ public: virtual LevelChunk *getChunk(int x, int z); #ifdef _LARGE_WORLDS LevelChunk *getChunkLoadedOrUnloaded(int x, int z); // 4J added + void overwriteLevelChunkFromSource(int x, int z); // 4J MGH added, for expanding worlds, to kill any player changes and reset the chunk + void overwriteHellLevelChunkFromSource(int x, int z, int minVal, int maxVal); // 4J MGH added, for expanding worlds, to reset the outer tiles in the chunk + void updateOverwriteHellChunk(LevelChunk* origChunk, LevelChunk* playerChunk, int xMin, int xMax, int zMin, int zMax); + #endif virtual LevelChunk **getCache() { return cache; } // 4J added @@ -84,6 +88,7 @@ public: virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z); virtual TilePos *findNearestMapFeature(Level *level, const wstring &featureName, int x, int y, int z); + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ); private: typedef struct _SaveThreadData diff --git a/Minecraft.Client/ServerConnection.cpp b/Minecraft.Client/ServerConnection.cpp index 9880a8c6..21d77f22 100644 --- a/Minecraft.Client/ServerConnection.cpp +++ b/Minecraft.Client/ServerConnection.cpp @@ -96,14 +96,10 @@ void ServerConnection::tick() shared_ptr serverPlayer = player->getPlayer(); if( serverPlayer ) { + serverPlayer->updateFrameTick(); serverPlayer->doChunkSendingTick(false); } -// try { // 4J - removed try/catch - player->tick(); -// } catch (Exception e) { -// logger.log(Level.WARNING, "Failed to handle packet: " + e, e); -// player.disconnect("Internal server error"); -// } + player->tick(); if (player->done) { players.erase(players.begin()+i); @@ -201,4 +197,9 @@ void ServerConnection::handleServerSettingsChanged(shared_ptrsetShowOnMaps(pMinecraft->options->GetGamertagSetting()); // } // } +} + +vector< shared_ptr > * ServerConnection::getPlayers() +{ + return &players; } \ No newline at end of file diff --git a/Minecraft.Client/ServerConnection.h b/Minecraft.Client/ServerConnection.h index 56c5d39e..9ef80973 100644 --- a/Minecraft.Client/ServerConnection.h +++ b/Minecraft.Client/ServerConnection.h @@ -46,4 +46,5 @@ public: void handleTextureReceived(const wstring &textureName); void handleTextureAndGeometryReceived(const wstring &textureName); void handleServerSettingsChanged(shared_ptr packet); + vector< shared_ptr > *getPlayers(); }; diff --git a/Minecraft.Client/ServerLevel.cpp b/Minecraft.Client/ServerLevel.cpp index de8c66cd..8501cbf9 100644 --- a/Minecraft.Client/ServerLevel.cpp +++ b/Minecraft.Client/ServerLevel.cpp @@ -6,26 +6,29 @@ #include "ServerPlayer.h" #include "PlayerConnection.h" #include "EntityTracker.h" +#include "ServerScoreboard.h" +#include "..\Minecraft.World\ScoreboardSaveData.h" #include "..\Minecraft.World\net.minecraft.world.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.ai.village.h" +#include "..\Minecraft.World\net.minecraft.world.entity.global.h" +#include "..\Minecraft.World\net.minecraft.world.entity.npc.h" +#include "..\Minecraft.World\net.minecraft.world.entity.player.h" #include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.biome.h" +#include "..\Minecraft.World\net.minecraft.world.level.chunk.h" #include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.level.levelgen.feature.h" #include "..\Minecraft.World\net.minecraft.world.level.storage.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.level.biome.h" -#include "..\Minecraft.World\net.minecraft.world.entity.h" -#include "..\Minecraft.World\net.minecraft.world.entity.ai.village.h" -#include "..\Minecraft.World\net.minecraft.world.entity.player.h" -#include "..\Minecraft.World\net.minecraft.world.entity.npc.h" -#include "..\Minecraft.World\net.minecraft.world.entity.global.h" +#include "..\Minecraft.World\net.minecraft.world.scores.h" #include "..\Minecraft.World\ItemEntity.h" #include "..\Minecraft.World\Arrow.h" #include "..\Minecraft.World\PrimedTnt.h" #include "..\Minecraft.World\FallingTile.h" #include "..\Minecraft.World\net.minecraft.network.packet.h" #include "..\Minecraft.World\Mth.h" -#include "..\Minecraft.World\net.minecraft.world.level.levelgen.feature.h" -#include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\StructurePiece.h" #include "..\Minecraft.Client\ServerLevelListener.h" #include "..\Minecraft.World\WeighedTreasure.h" @@ -65,17 +68,17 @@ void ServerLevel::staticCtor() #endif m_updateThread->Run(); - RANDOM_BONUS_ITEMS = WeighedTreasureArray(20); + RANDOM_BONUS_ITEMS = WeighedTreasureArray(20); RANDOM_BONUS_ITEMS[0] = new WeighedTreasure(Item::stick_Id, 0, 1, 3, 10); - RANDOM_BONUS_ITEMS[1] = new WeighedTreasure(Tile::wood_Id, 0, 1, 3, 10); - RANDOM_BONUS_ITEMS[2] = new WeighedTreasure(Tile::treeTrunk_Id, 0, 1, 3, 10); - RANDOM_BONUS_ITEMS[3] = new WeighedTreasure(Item::hatchet_stone_Id, 0, 1, 1, 3); - RANDOM_BONUS_ITEMS[4] = new WeighedTreasure(Item::hatchet_wood_Id, 0, 1, 1, 5); - RANDOM_BONUS_ITEMS[5] = new WeighedTreasure(Item::pickAxe_stone_Id, 0, 1, 1, 3); - RANDOM_BONUS_ITEMS[6] = new WeighedTreasure(Item::pickAxe_wood_Id, 0, 1, 1, 5); - RANDOM_BONUS_ITEMS[7] = new WeighedTreasure(Item::apple_Id, 0, 2, 3, 5); - RANDOM_BONUS_ITEMS[8] = new WeighedTreasure(Item::bread_Id, 0, 2, 3, 3); + RANDOM_BONUS_ITEMS[1] = new WeighedTreasure(Tile::wood_Id, 0, 1, 3, 10); + RANDOM_BONUS_ITEMS[2] = new WeighedTreasure(Tile::treeTrunk_Id, 0, 1, 3, 10); + RANDOM_BONUS_ITEMS[3] = new WeighedTreasure(Item::hatchet_stone_Id, 0, 1, 1, 3); + RANDOM_BONUS_ITEMS[4] = new WeighedTreasure(Item::hatchet_wood_Id, 0, 1, 1, 5); + RANDOM_BONUS_ITEMS[5] = new WeighedTreasure(Item::pickAxe_stone_Id, 0, 1, 1, 3); + RANDOM_BONUS_ITEMS[6] = new WeighedTreasure(Item::pickAxe_wood_Id, 0, 1, 1, 5); + RANDOM_BONUS_ITEMS[7] = new WeighedTreasure(Item::apple_Id, 0, 2, 3, 5); + RANDOM_BONUS_ITEMS[8] = new WeighedTreasure(Item::bread_Id, 0, 2, 3, 3); // 4J-PB - new items RANDOM_BONUS_ITEMS[9] = new WeighedTreasure(Tile::sapling_Id, 0, 4, 4, 2); RANDOM_BONUS_ITEMS[10] = new WeighedTreasure(Tile::sapling_Id, 1, 4, 4, 2); @@ -87,7 +90,7 @@ void ServerLevel::staticCtor() RANDOM_BONUS_ITEMS[16] = new WeighedTreasure(Item::dye_powder_Id, DyePowderItem::BROWN, 1, 2, 2); RANDOM_BONUS_ITEMS[17] = new WeighedTreasure(Item::potato_Id, 0, 1, 2, 3); RANDOM_BONUS_ITEMS[18] = new WeighedTreasure(Item::carrots_Id, 0, 1, 2, 3); - RANDOM_BONUS_ITEMS[19] = new WeighedTreasure(Tile::mushroom1_Id, 0, 1, 2, 2); + RANDOM_BONUS_ITEMS[19] = new WeighedTreasure(Tile::mushroom_brown_Id, 0, 1, 2, 2); }; @@ -110,8 +113,21 @@ ServerLevel::ServerLevel(MinecraftServer *server, shared_ptrlevelS server->setLevel(dimension, this); // The listener needs the server to have the level set up... this will be set up anyway on return of this ctor but setting up early here addListener(new ServerLevelListener(server, this)); - this->tracker = new EntityTracker(this); - this->chunkMap = new PlayerChunkMap(this, dimension, server->getPlayers()->getViewDistance()); + tracker = new EntityTracker(this); + chunkMap = new PlayerChunkMap(this, dimension, server->getPlayers()->getViewDistance()); + + mobSpawner = new MobSpawner(); + portalForcer = new PortalForcer(this); + scoreboard = new ServerScoreboard(server); + + //shared_ptr scoreboardSaveData = dynamic_pointer_cast( savedDataStorage->get(typeid(ScoreboardSaveData), ScoreboardSaveData::FILE_ID) ); + //if (scoreboardSaveData == NULL) + //{ + // scoreboardSaveData = shared_ptr( new ScoreboardSaveData() ); + // savedDataStorage->set(ScoreboardSaveData::FILE_ID, scoreboardSaveData); + //} + //scoreboardSaveData->setScoreboard(scoreboard); + //((ServerScoreboard *) scoreboard)->setSaveData(scoreboardSaveData); // This also used to be called in parent ctor, but can't be called until chunkSource is created. Call now if required. if (!levelData->isInitialized()) @@ -145,6 +161,9 @@ ServerLevel::ServerLevel(MinecraftServer *server, shared_ptrlevelS ServerLevel::~ServerLevel() { + delete portalForcer; + delete mobSpawner; + EnterCriticalSection(&m_csQueueSendTileUpdates); for(AUTO_VAR(it, m_queuedSendTileUpdates.begin()); it != m_queuedSendTileUpdates.end(); ++it) { @@ -175,41 +194,45 @@ ServerLevel::~ServerLevel() void ServerLevel::tick() { Level::tick(); - if (getLevelData()->isHardcore() && difficulty < 3) + if (getLevelData()->isHardcore() && difficulty < 3) { - difficulty = 3; - } + difficulty = 3; + } dimension->biomeSource->update(); if (allPlayersAreSleeping()) { - bool somebodyWokeUp = false; - if (spawnEnemies && difficulty >= Difficulty::EASY) - { - } - - if (!somebodyWokeUp) + if (getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT)) { // skip time until new day - __int64 newTime = levelData->getTime() + TICKS_PER_DAY; + __int64 newTime = levelData->getDayTime() + TICKS_PER_DAY; // 4J : WESTY : Changed so that time update goes through stats tracking update code. //levelData->setTime(newTime - (newTime % TICKS_PER_DAY)); - setTime(newTime - (newTime % TICKS_PER_DAY)); - - awakenAllPlayers(); + setDayTime(newTime - (newTime % TICKS_PER_DAY)); } + awakenAllPlayers(); } PIXBeginNamedEvent(0,"Mob spawner tick"); // for Minecraft 1.8, spawn friendlies really rarely - 4J - altered from once every 400 ticks to 40 ticks as we depend on this a more than the original since we don't have chunk post-process spawning - MobSpawner::tick(this, spawnEnemies, spawnFriendlies && (levelData->getTime() % 40) == 0); + if (getGameRules()->getBoolean(GameRules::RULE_DOMOBSPAWNING)) + { + // Note - these flags are used logically in an inverted way. Mob spawning is not performed if: + // (1) finalSpawnEnemies isn't set, and mob category isn't friendly + // (2) finalSpawnFriendlies isn't set, and mob category is friendly + // (3) finalSpawnPersistent isn't set, and mob category is persistent + bool finalSpawnEnemies = spawnEnemies && ((levelData->getGameTime() % 2) == 0); // Spawn enemies every other tick + bool finalSpawnFriendlies = spawnFriendlies && ((levelData->getGameTime() % 40) == 0); // Spawn friendlies once per 40 ticks + bool finalSpawnPersistent = finalSpawnFriendlies && ((levelData->getGameTime() % 80) == 0); // All persistents are also friendly - do them once every other friendly spawning, ie once per 80 ticks + mobSpawner->tick(this, finalSpawnEnemies, finalSpawnFriendlies, finalSpawnPersistent); + } PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Chunk source tick"); chunkSource->tick(); PIXEndNamedEvent(); - int newDark = this->getOldSkyDarken(1); + int newDark = getOldSkyDarken(1); if (newDark != skyDarken) { skyDarken = newDark; @@ -222,16 +245,11 @@ void ServerLevel::tick() } } } - - PIXBeginNamedEvent(0,"runTileEvents"); - // run after entity updates - runTileEvents(); - PIXEndNamedEvent(); //4J - temporarily disabling saves as they are causing gameplay to generally stutter quite a lot - __int64 time = levelData->getTime() + 1; -// 4J Stu - Putting this back in, but I have reduced the number of chunks that save when not forced + __int64 time = levelData->getGameTime() + 1; + // 4J Stu - Putting this back in, but I have reduced the number of chunks that save when not forced #ifdef _LARGE_WORLDS if (time % (saveInterval) == (dimension->id + 1)) #else @@ -246,7 +264,18 @@ void ServerLevel::tick() // 4J : WESTY : Changed so that time update goes through stats tracking update code. //levelData->setTime(time); - setTime(time); + setGameTime(levelData->getGameTime() + 1); + if (getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT)) + { + // 4J: Debug setting added to keep it at day time +#ifndef _FINAL_BUILD + bool freezeTime = app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getDayTime() + 1); + } + } PIXBeginNamedEvent(0,"Tick pending ticks"); // if (tickCount % 5 == 0) { @@ -268,8 +297,14 @@ void ServerLevel::tick() //MemSect(0); PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick portal forcer"); + portalForcer->tick(getGameTime()); + PIXEndNamedEvent(); + // repeat after tile ticks + PIXBeginNamedEvent(0,"runTileEvents"); runTileEvents(); + PIXEndNamedEvent(); // 4J Added runQueuedSendTileUpdates(); @@ -277,10 +312,10 @@ void ServerLevel::tick() Biome::MobSpawnerData *ServerLevel::getRandomMobSpawnAt(MobCategory *mobCategory, int x, int y, int z) { - vector *mobList = getChunkSource()->getMobsAt(mobCategory, x, y, z); + vector *mobList = getChunkSource()->getMobsAt(mobCategory, x, y, z); if (mobList == NULL || mobList->empty()) return NULL; - return (Biome::MobSpawnerData *) WeighedRandom::getRandomItem(random, (vector *)mobList); + return (Biome::MobSpawnerData *) WeighedRandom::getRandomItem(random, (vector *)mobList); } void ServerLevel::updateSleepingPlayerList() @@ -289,7 +324,7 @@ void ServerLevel::updateSleepingPlayerList() m_bAtLeastOnePlayerSleeping = false; AUTO_VAR(itEnd, players.end()); - for (vector >::iterator it = players.begin(); it != itEnd; it++) + for (AUTO_VAR(it, players.begin()); it != itEnd; it++) { if (!(*it)->isSleeping()) { @@ -454,7 +489,7 @@ void ServerLevel::tickTiles() m_updateChunkX[iLev][m_updateChunkCount[iLev]] = cp.x; m_updateChunkZ[iLev][m_updateChunkCount[iLev]++] = cp.z; - LevelChunk *lc = this->getChunk(cp.x, cp.z); + LevelChunk *lc = getChunk(cp.x, cp.z); tickClientSideTiles(xo, zo, lc); if (random->nextInt(prob) == 0 && isRaining() && isThundering()) @@ -468,25 +503,24 @@ void ServerLevel::tickTiles() if (isRainingAt(x, y, z)) { addGlobalEntity( shared_ptr( new LightningBolt(this, x, y, z) ) ); - lightningTime = 2; } } // 4J - changes here brought forrward from 1.2.3 if (random->nextInt(16) == 0) { - randValue = randValue * 3 + addend; - int val = (randValue >> 2); - int x = (val & 15); - int z = ((val >> 8) & 15); - int yy = this->getTopRainBlock(x + xo, z + zo); - if (shouldFreeze(x + xo, yy - 1, z + zo)) + randValue = randValue * 3 + addend; + int val = (randValue >> 2); + int x = (val & 15); + int z = ((val >> 8) & 15); + int yy = getTopRainBlock(x + xo, z + zo); + if (shouldFreeze(x + xo, yy - 1, z + zo)) { - setTile(x + xo, yy - 1, z + zo, Tile::ice_Id); - } - if (isRaining() && shouldSnow(x + xo, yy, z + zo)) + setTileAndUpdate(x + xo, yy - 1, z + zo, Tile::ice_Id); + } + if (isRaining() && shouldSnow(x + xo, yy, z + zo)) { - setTile(x + xo, yy, z + zo, Tile::topSnow_Id); + setTileAndUpdate(x + xo, yy, z + zo, Tile::topSnow_Id); } if (isRaining()) { @@ -512,30 +546,50 @@ void ServerLevel::tickTiles() m_updateTrigger->Set(iLev); } +bool ServerLevel::isTileToBeTickedAt(int x, int y, int z, int tileId) +{ + TickNextTickData td = TickNextTickData(x, y, z, tileId); + return std::find(toBeTicked.begin(), toBeTicked.end(), td) != toBeTicked.end(); +} + void ServerLevel::addToTickNextTick(int x, int y, int z, int tileId, int tickDelay) +{ + addToTickNextTick(x, y, z, tileId, tickDelay, 0); +} + +void ServerLevel::addToTickNextTick(int x, int y, int z, int tileId, int tickDelay, int priorityTilt) { MemSect(27); TickNextTickData td = TickNextTickData(x, y, z, tileId); - int r = 8; - if (getInstaTick()) + int r = 0; + if (getInstaTick() && tileId > 0) { - if (hasChunksAt(td.x - r, td.y - r, td.z - r, td.x + r, td.y + r, td.z + r)) + if(Tile::tiles[tileId]->canInstantlyTick()) { - int id = getTile(td.x, td.y, td.z); - if (id == td.tileId && id > 0) + r = 8; + if (hasChunksAt(td.x - r, td.y - r, td.z - r, td.x + r, td.y + r, td.z + r)) { - Tile::tiles[id]->tick(this, td.x, td.y, td.z, random); + int id = getTile(td.x, td.y, td.z); + if (id == td.tileId && id > 0) + { + Tile::tiles[id]->tick(this, td.x, td.y, td.z, random); + } } + MemSect(0); + return; + } + else + { + tickDelay = 1; } - MemSect(0); - return; } if (hasChunksAt(x - r, y - r, z - r, x + r, y + r, z + r)) { if (tileId > 0) { - td.delay(tickDelay + levelData->getTime()); + td.delay(tickDelay + levelData->getGameTime()); + td.setPriorityTilt(priorityTilt); } EnterCriticalSection(&m_tickNextTickCS); if ( tickNextTickSet.find(td) == tickNextTickSet.end() ) @@ -548,20 +602,21 @@ void ServerLevel::addToTickNextTick(int x, int y, int z, int tileId, int tickDel MemSect(0); } -void ServerLevel::forceAddTileTick(int x, int y, int z, int tileId, int tickDelay) +void ServerLevel::forceAddTileTick(int x, int y, int z, int tileId, int tickDelay, int prioTilt) { - TickNextTickData td = TickNextTickData(x, y, z, tileId); + TickNextTickData td = TickNextTickData(x, y, z, tileId); + td.setPriorityTilt(prioTilt); - if (tileId > 0) + if (tileId > 0) { - td.delay(tickDelay + levelData->getTime()); - } + td.delay(tickDelay + levelData->getGameTime()); + } EnterCriticalSection(&m_tickNextTickCS); if ( tickNextTickSet.find(td) == tickNextTickSet.end() ) { - tickNextTickSet.insert(td); - tickNextTickList.insert(td); - } + tickNextTickSet.insert(td); + tickNextTickList.insert(td); + } LeaveCriticalSection(&m_tickNextTickCS); } @@ -576,12 +631,17 @@ void ServerLevel::tickEntities() } else { - emptyTime = 0; + resetEmptyTime(); } Level::tickEntities(); } +void ServerLevel::resetEmptyTime() +{ + emptyTime = 0; +} + bool ServerLevel::tickPendingTicks(bool force) { EnterCriticalSection(&m_tickNextTickCS); @@ -593,29 +653,43 @@ bool ServerLevel::tickPendingTicks(bool force) //throw new IllegalStateException("TickNextTick list out of synch"); } if (count > MAX_TICK_TILES_PER_TICK) count = MAX_TICK_TILES_PER_TICK; - + AUTO_VAR(itTickList, tickNextTickList.begin()); for (int i = 0; i < count; i++) { TickNextTickData td = *(itTickList); - if (!force && td.m_delay > levelData->getTime()) + if (!force && td.m_delay > levelData->getGameTime()) { break; } itTickList = tickNextTickList.erase(itTickList); tickNextTickSet.erase(td); - int r = 8; + toBeTicked.push_back(td); + } + + for(AUTO_VAR(it,toBeTicked.begin()); it != toBeTicked.end();) + { + TickNextTickData td = *it; + it = toBeTicked.erase(it); + + int r = 0; if (hasChunksAt(td.x - r, td.y - r, td.z - r, td.x + r, td.y + r, td.z + r)) { int id = getTile(td.x, td.y, td.z); - if (id == td.tileId && id > 0) + if (id > 0 && Tile::isMatching(id, td.tileId)) { Tile::tiles[id]->tick(this, td.x, td.y, td.z, random); } } + else + { + addToTickNextTick(td.x, td.y, td.z, td.tileId, 0); + } } + toBeTicked.clear(); + int count3 = (int)tickNextTickList.size(); int count4 = (int)tickNextTickSet.size(); @@ -628,36 +702,72 @@ bool ServerLevel::tickPendingTicks(bool force) vector *ServerLevel::fetchTicksInChunk(LevelChunk *chunk, bool remove) { EnterCriticalSection(&m_tickNextTickCS); - vector *results = new vector; + vector *results = new vector; - ChunkPos *pos = chunk->getPos(); - int west = pos->x << 4; - int east = west + 16; - int north = pos->z << 4; - int south = north + 16; + ChunkPos *pos = chunk->getPos(); + int xMin = (pos->x << 4) - 2; + int xMax = (xMin + 16) + 2; + int zMin = (pos->z << 4) - 2; + int zMax = (zMin + 16) + 2; delete pos; - for( AUTO_VAR(it, tickNextTickSet.begin()); it != tickNextTickSet.end(); ) + for (int i = 0; i < 2; i++) { - TickNextTickData td = *it; - - if (td.x >= west && td.x < east && td.z >= north && td.z < south) + if (i == 0) { - if (remove) - { - tickNextTickList.erase(td); - it = tickNextTickSet.erase(it); - } - else + for( AUTO_VAR(it, tickNextTickList.begin()); it != tickNextTickList.end(); ) { - it++; - } + TickNextTickData td = *it; + + if (td.x >= xMin && td.x < xMax && td.z >= zMin && td.z < zMax) + { + if (remove) + { + tickNextTickSet.erase(td); + it = tickNextTickList.erase(it); + } + else + { + it++; + } - results->push_back(td); - } + results->push_back(td); + } + else + { + it++; + } + } + } else { - it++; + if (!toBeTicked.empty()) + { + app.DebugPrintf("To be ticked size: %d\n",toBeTicked.size()); + } + for( AUTO_VAR(it, toBeTicked.begin()); it != toBeTicked.end();) + { + TickNextTickData td = *it; + + if (td.x >= xMin && td.x < xMax && td.z >= zMin && td.z < zMax) + { + if (remove) + { + tickNextTickList.erase(td); + it = toBeTicked.erase(it); + } + else + { + it++; + } + + results->push_back(td); + } + else + { + it++; + } + } } } @@ -667,18 +777,15 @@ vector *ServerLevel::fetchTicksInChunk(LevelChunk *chunk, bool void ServerLevel::tick(shared_ptr e, bool actual) { - if (!server->isAnimals() && ((e->GetType() & eTYPE_ANIMAL) || (e->GetType() & eTYPE_WATERANIMAL))) + if ( !server->isAnimals() && (e->instanceof(eTYPE_ANIMAL) || e->instanceof(eTYPE_WATERANIMAL)) ) { - e->remove(); - } + e->remove(); + } if (!server->isNpcsEnabled() && (dynamic_pointer_cast(e) != NULL)) { e->remove(); } - if (e->rider.lock() == NULL || (dynamic_pointer_cast(e->rider.lock())==NULL) ) // 4J - was !(e->rider instanceof Player) - { - Level::tick(e, actual); - } + Level::tick(e, actual); } void ServerLevel::forceTick(shared_ptr e, bool actual) @@ -688,23 +795,23 @@ void ServerLevel::forceTick(shared_ptr e, bool actual) ChunkSource *ServerLevel::createChunkSource() { - ChunkStorage *storage = levelStorage->createChunkStorage(dimension); + ChunkStorage *storage = levelStorage->createChunkStorage(dimension); cache = new ServerChunkCache(this, storage, dimension->createRandomLevelSource()); - return cache; + return cache; } vector > *ServerLevel::getTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1) { - vector > *result = new vector >; - for (unsigned int i = 0; i < tileEntityList.size(); i++) + vector > *result = new vector >; + for (unsigned int i = 0; i < tileEntityList.size(); i++) { - shared_ptr te = tileEntityList[i]; - if (te->x >= x0 && te->y >= y0 && te->z >= z0 && te->x < x1 && te->y < y1 && te->z < z1) + shared_ptr te = tileEntityList[i]; + 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; + result->push_back(te); + } + } + return result; } bool ServerLevel::mayInteract(shared_ptr player, int xt, int yt, int zt, int content) @@ -720,10 +827,7 @@ bool ServerLevel::mayInteract(shared_ptr player, int xt, int yt, int zt, } else if(dimension->id == 0) // 4J Stu - Only limit this in the overworld { - int xd = (int) Mth::abs((float)(xt - levelData->getXSpawn())); - int zd = (int) Mth::abs((float)(zt - levelData->getZSpawn())); - if (xd > zd) zd = xd; - return (zd > 16 || server->getPlayers()->isOp(player->name)); + return !server->isUnderSpawnProtection(this, xt, yt, zt, player); } return true; } @@ -783,7 +887,7 @@ void ServerLevel::setInitialSpawn(LevelSettings *levelSettings) zSpawn += random.nextInt(64) - random.nextInt(64); if(zSpawn>maxXZ) zSpawn=0; if(zSpawn chest = dynamic_pointer_cast(getTileEntity(x, y, z)); @@ -825,19 +929,19 @@ void ServerLevel::generateBonusItemsNearSpawn() } } - BonusChestFeature *feature = new BonusChestFeature(RANDOM_BONUS_ITEMS, 16); - for (int attempt = 0; attempt < 16; attempt++) - { - int x = levelData->getXSpawn() + random->nextInt(6) - random->nextInt(6); - int z = levelData->getZSpawn() + random->nextInt(6) - random->nextInt(6); - int y = getTopSolidBlock(x, z) + 1; - - if (feature->place(this, random, x, y, z, (attempt == 15) )) + BonusChestFeature *feature = new BonusChestFeature(RANDOM_BONUS_ITEMS, 16); + for (int attempt = 0; attempt < 16; attempt++) { - break; - } - } - delete feature; + int x = levelData->getXSpawn() + random->nextInt(6) - random->nextInt(6); + int z = levelData->getZSpawn() + random->nextInt(6) - random->nextInt(6); + int y = getTopSolidBlock(x, z) + 1; + + if (feature->place(this, random, x, y, z, (attempt == 15) )) + { + break; + } + } + delete feature; } Pos *ServerLevel::getDimensionSpecificSpawn() @@ -871,7 +975,7 @@ void ServerLevel::save(bool force, ProgressListener *progressListener, bool bAut { progressListener->progressStartNoAbort(IDS_PROGRESS_SAVING_LEVEL); } - + } PIXBeginNamedEvent(0,"Saving level data"); saveLevelData(); @@ -950,8 +1054,8 @@ void ServerLevel::saveLevelData() void ServerLevel::entityAdded(shared_ptr e) { - Level::entityAdded(e); - entitiesById[e->entityId] = e; + Level::entityAdded(e); + entitiesById[e->entityId] = e; vector > *es = e->getSubEntities(); if (es != NULL) { @@ -966,7 +1070,7 @@ void ServerLevel::entityAdded(shared_ptr e) void ServerLevel::entityRemoved(shared_ptr e) { - Level::entityRemoved(e); + Level::entityRemoved(e); entitiesById.erase(e->entityId); vector > *es = e->getSubEntities(); if (es != NULL) @@ -987,29 +1091,29 @@ shared_ptr ServerLevel::getEntity(int id) bool ServerLevel::addGlobalEntity(shared_ptr e) { - if (Level::addGlobalEntity(e)) + if (Level::addGlobalEntity(e)) { - server->getPlayers()->broadcast(e->x, e->y, e->z, 512, dimension->id, shared_ptr( new AddGlobalEntityPacket(e) ) ); - return true; - } - return false; + server->getPlayers()->broadcast(e->x, e->y, e->z, 512, dimension->id, shared_ptr( new AddGlobalEntityPacket(e) ) ); + return true; + } + return false; } void ServerLevel::broadcastEntityEvent(shared_ptr e, byte event) { - shared_ptr p = shared_ptr( new EntityEventPacket(e->entityId, event) ); - server->getLevel(dimension->id)->getTracker()->broadcastAndSend(e, p); + shared_ptr p = shared_ptr( new EntityEventPacket(e->entityId, event) ); + server->getLevel(dimension->id)->getTracker()->broadcastAndSend(e, p); } shared_ptr ServerLevel::explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks) { - // instead of calling super, we run the same explosion code here except - // we don't generate any particles - shared_ptr explosion = shared_ptr( new Explosion(this, source, x, y, z, r) ); - explosion->fire = fire; + // instead of calling super, we run the same explosion code here except + // we don't generate any particles + shared_ptr explosion = shared_ptr( new Explosion(this, source, x, y, z, r) ); + explosion->fire = fire; explosion->destroyBlocks = destroyBlocks; - explosion->explode(); - explosion->finalizeExplosion(false); + explosion->explode(); + explosion->finalizeExplosion(false); if (!destroyBlocks) { @@ -1044,17 +1148,17 @@ shared_ptr ServerLevel::explode(shared_ptr source, double x, } } - if (player->distanceToSqr(x, y, z) < 64 * 64) + if (player->distanceToSqr(x, y, z) < 64 * 64) { Vec3 *knockbackVec = explosion->getHitPlayerKnockback(player); //app.DebugPrintf("Sending %s with knockback (%f,%f,%f)\n", knockbackOnly?"knockbackOnly":"allExplosion",knockbackVec->x,knockbackVec->y,knockbackVec->z); // If the player is not the primary on the system, then we only want to send info for the knockback player->connection->send( shared_ptr( new ExplodePacket(x, y, z, r, &explosion->toBlow, knockbackVec, knockbackOnly))); sentTo.push_back( player ); - } - } + } + } - return explosion; + return explosion; } void ServerLevel::tileEvent(int x, int y, int z, int tile, int b0, int b1) @@ -1099,8 +1203,7 @@ bool ServerLevel::doTileEvent(TileEventData *te) { int t = getTile(te->getX(), te->getY(), te->getZ()); if (t == te->getTile()) { - Tile::tiles[t]->triggerEvent(this, te->getX(), te->getY(), te->getZ(), te->getParamA(), te->getParamB()); - return true; + return Tile::tiles[t]->triggerEvent(this, te->getX(), te->getY(), te->getZ(), te->getParamA(), te->getParamB()); } return false; } @@ -1112,20 +1215,20 @@ void ServerLevel::closeLevelStorage() void ServerLevel::tickWeather() { - bool wasRaining = isRaining(); - Level::tickWeather(); + bool wasRaining = isRaining(); + Level::tickWeather(); - if (wasRaining != isRaining()) + if (wasRaining != isRaining()) { - if (wasRaining) + if (wasRaining) { - server->getPlayers()->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); - } + server->getPlayers()->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); + } else { - server->getPlayers()->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); - } - } + server->getPlayers()->broadcastAll( shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); + } + } } @@ -1141,7 +1244,7 @@ EntityTracker *ServerLevel::getTracker() void ServerLevel::setTimeAndAdjustTileTicks(__int64 newTime) { - __int64 delta = newTime - levelData->getTime(); + __int64 delta = newTime - levelData->getGameTime(); // 4J - can't directly adjust m_delay in a set as it has a const interator, since changing values in here might change the ordering of the elements in the set. // Instead move to a vector, do the adjustment, put back in the set. vector temp; @@ -1155,7 +1258,7 @@ void ServerLevel::setTimeAndAdjustTileTicks(__int64 newTime) { tickNextTickList.insert(temp[i]); } - setTime(newTime); + setGameTime(newTime); } PlayerChunkMap *ServerLevel::getChunkMap() @@ -1163,6 +1266,28 @@ PlayerChunkMap *ServerLevel::getChunkMap() return chunkMap; } +PortalForcer *ServerLevel::getPortalForcer() +{ + return portalForcer; +} + +void ServerLevel::sendParticles(const wstring &name, double x, double y, double z, int count) +{ + sendParticles(name, x + 0.5f, y + 0.5f, z + 0.5f, count, 0.5f, 0.5f, 0.5f, 0.02f); +} + +void ServerLevel::sendParticles(const wstring &name, double x, double y, double z, int count, double xDist, double yDist, double zDist, double speed) +{ + shared_ptr packet = shared_ptr( new LevelParticlesPacket(name, (float) x, (float) y, (float) z, (float) xDist, (float) yDist, (float) zDist, (float) speed, count) ); + + + for(AUTO_VAR(it, players.begin()); it != players.end(); ++it) + { + shared_ptr player = dynamic_pointer_cast(*it); + player->connection->send(packet); + } +} + // 4J Stu - Sometimes we want to update tiles on the server from the main thread (eg SignTileEntity when string verify returns) void ServerLevel::queueSendTileUpdate(int x, int y, int z) { @@ -1188,19 +1313,19 @@ void ServerLevel::runQueuedSendTileUpdates() bool ServerLevel::addEntity(shared_ptr e) { // If its an item entity, and we've got to our capacity, delete the oldest - if( dynamic_pointer_cast(e) != NULL ) + if( e->instanceof(eTYPE_ITEMENTITY) ) { -// printf("Adding item entity count %d\n",m_itemEntities.size()); + // printf("Adding item entity count %d\n",m_itemEntities.size()); EnterCriticalSection(&m_limiterCS); if( m_itemEntities.size() >= MAX_ITEM_ENTITIES ) { -// printf("Adding - doing remove\n"); + // printf("Adding - doing remove\n"); removeEntityImmediately(m_itemEntities.front()); } LeaveCriticalSection(&m_limiterCS); } // If its an hanging entity, and we've got to our capacity, delete the oldest - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_HANGING_ENTITY) ) { // printf("Adding item entity count %d\n",m_itemEntities.size()); EnterCriticalSection(&m_limiterCS); @@ -1217,25 +1342,25 @@ bool ServerLevel::addEntity(shared_ptr e) LeaveCriticalSection(&m_limiterCS); } // If its an arrow entity, and we've got to our capacity, delete the oldest - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_ARROW) ) { -// printf("Adding arrow entity count %d\n",m_arrowEntities.size()); + // printf("Adding arrow entity count %d\n",m_arrowEntities.size()); EnterCriticalSection(&m_limiterCS); if( m_arrowEntities.size() >= MAX_ARROW_ENTITIES ) { -// printf("Adding - doing remove\n"); + // printf("Adding - doing remove\n"); removeEntityImmediately(m_arrowEntities.front()); } LeaveCriticalSection(&m_limiterCS); } // If its an experience orb entity, and we've got to our capacity, delete the oldest - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_EXPERIENCEORB) ) { -// printf("Adding arrow entity count %d\n",m_arrowEntities.size()); + // printf("Adding arrow entity count %d\n",m_arrowEntities.size()); EnterCriticalSection(&m_limiterCS); if( m_experienceOrbEntities.size() >= MAX_EXPERIENCEORB_ENTITIES ) { -// printf("Adding - doing remove\n"); + // printf("Adding - doing remove\n"); removeEntityImmediately(m_experienceOrbEntities.front()); } LeaveCriticalSection(&m_limiterCS); @@ -1243,44 +1368,79 @@ bool ServerLevel::addEntity(shared_ptr e) return Level::addEntity(e); } +// 4J: Returns true if the level is at its limit for this type of entity (only checks arrows, hanging, item and experience orbs) +bool ServerLevel::atEntityLimit(shared_ptr e) +{ + // TODO: This duplicates code from addEntity above, fix + + bool atLimit = false; + + if( e->instanceof(eTYPE_ITEMENTITY) ) + { + EnterCriticalSection(&m_limiterCS); + atLimit = m_itemEntities.size() >= MAX_ITEM_ENTITIES; + LeaveCriticalSection(&m_limiterCS); + } + else if( e->instanceof(eTYPE_HANGING_ENTITY) ) + { + EnterCriticalSection(&m_limiterCS); + atLimit = m_hangingEntities.size() >= MAX_HANGING_ENTITIES; + LeaveCriticalSection(&m_limiterCS); + } + else if( e->instanceof(eTYPE_ARROW) ) + { + EnterCriticalSection(&m_limiterCS); + atLimit = m_arrowEntities.size() >= MAX_ARROW_ENTITIES; + LeaveCriticalSection(&m_limiterCS); + } + else if( e->instanceof(eTYPE_EXPERIENCEORB) ) + { + EnterCriticalSection(&m_limiterCS); + atLimit = m_experienceOrbEntities.size() >= MAX_EXPERIENCEORB_ENTITIES; + LeaveCriticalSection(&m_limiterCS); + } + + return atLimit; +} + // Maintain a cound of primed tnt & falling tiles in this level void ServerLevel::entityAddedExtra(shared_ptr e) { - if( dynamic_pointer_cast(e) != NULL ) + if( e->instanceof(eTYPE_ITEMENTITY) ) { EnterCriticalSection(&m_limiterCS); m_itemEntities.push_back(e); -// printf("entity added: item entity count now %d\n",m_itemEntities.size()); + // printf("entity added: item entity count now %d\n",m_itemEntities.size()); LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_HANGING_ENTITY) ) { EnterCriticalSection(&m_limiterCS); m_hangingEntities.push_back(e); // printf("entity added: item entity count now %d\n",m_itemEntities.size()); LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_ARROW) ) { EnterCriticalSection(&m_limiterCS); m_arrowEntities.push_back(e); -// printf("entity added: arrow entity count now %d\n",m_arrowEntities.size()); + // printf("entity added: arrow entity count now %d\n",m_arrowEntities.size()); LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_EXPERIENCEORB) ) { EnterCriticalSection(&m_limiterCS); m_experienceOrbEntities.push_back(e); -// printf("entity added: experience orb entity count now %d\n",m_arrowEntities.size()); + // printf("entity added: experience orb entity count now %d\n",m_arrowEntities.size()); LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_PRIMEDTNT) ) { EnterCriticalSection(&m_limiterCS); m_primedTntCount++; LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_FALLINGTILE) ) { EnterCriticalSection(&m_limiterCS); m_fallingTileCount++; @@ -1291,20 +1451,20 @@ void ServerLevel::entityAddedExtra(shared_ptr e) // Maintain a cound of primed tnt & falling tiles in this level, and remove any item entities from our list void ServerLevel::entityRemovedExtra(shared_ptr e) { - if( dynamic_pointer_cast(e) != NULL ) + if( e->instanceof(eTYPE_ITEMENTITY) ) { EnterCriticalSection(&m_limiterCS); -// printf("entity removed: item entity count %d\n",m_itemEntities.size()); + // printf("entity removed: item entity count %d\n",m_itemEntities.size()); AUTO_VAR(it, find(m_itemEntities.begin(),m_itemEntities.end(),e)); if( it != m_itemEntities.end() ) { -// printf("Item to remove found\n"); + // printf("Item to remove found\n"); m_itemEntities.erase(it); } -// printf("entity removed: item entity count now %d\n",m_itemEntities.size()); + // printf("entity removed: item entity count now %d\n",m_itemEntities.size()); LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_HANGING_ENTITY) ) { EnterCriticalSection(&m_limiterCS); // printf("entity removed: item entity count %d\n",m_itemEntities.size()); @@ -1317,39 +1477,39 @@ void ServerLevel::entityRemovedExtra(shared_ptr e) // printf("entity removed: item entity count now %d\n",m_itemEntities.size()); LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_ARROW) ) { EnterCriticalSection(&m_limiterCS); -// printf("entity removed: arrow entity count %d\n",m_arrowEntities.size()); + // printf("entity removed: arrow entity count %d\n",m_arrowEntities.size()); AUTO_VAR(it, find(m_arrowEntities.begin(),m_arrowEntities.end(),e)); if( it != m_arrowEntities.end() ) { -// printf("Item to remove found\n"); + // printf("Item to remove found\n"); m_arrowEntities.erase(it); } -// printf("entity removed: arrow entity count now %d\n",m_arrowEntities.size()); + // printf("entity removed: arrow entity count now %d\n",m_arrowEntities.size()); LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_EXPERIENCEORB) ) { EnterCriticalSection(&m_limiterCS); -// printf("entity removed: experience orb entity count %d\n",m_arrowEntities.size()); + // printf("entity removed: experience orb entity count %d\n",m_arrowEntities.size()); AUTO_VAR(it, find(m_experienceOrbEntities.begin(),m_experienceOrbEntities.end(),e)); if( it != m_experienceOrbEntities.end() ) { -// printf("Item to remove found\n"); + // printf("Item to remove found\n"); m_experienceOrbEntities.erase(it); } -// printf("entity removed: experience orb entity count now %d\n",m_arrowEntities.size()); + // printf("entity removed: experience orb entity count now %d\n",m_arrowEntities.size()); LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_PRIMEDTNT) ) { EnterCriticalSection(&m_limiterCS); m_primedTntCount--; LeaveCriticalSection(&m_limiterCS); } - else if( dynamic_pointer_cast(e) != NULL ) + else if( e->instanceof(eTYPE_FALLINGTILE) ) { EnterCriticalSection(&m_limiterCS); m_fallingTileCount--; diff --git a/Minecraft.Client/ServerLevel.h b/Minecraft.Client/ServerLevel.h index 644c15c0..45f3114d 100644 --- a/Minecraft.Client/ServerLevel.h +++ b/Minecraft.Client/ServerLevel.h @@ -11,7 +11,7 @@ using namespace std; class ServerLevel : public Level { private: - static const int EMPTY_TIME_NO_TICK = SharedConstants::TICKS_PER_SECOND * 3; + static const int EMPTY_TIME_NO_TICK = SharedConstants::TICKS_PER_SECOND * 60; MinecraftServer *server; EntityTracker *tracker; @@ -29,10 +29,12 @@ protected: public: ServerChunkCache *cache; - bool canEditSpawn; - bool noSave; + bool canEditSpawn; + bool noSave; private: bool allPlayersSleeping; + PortalForcer *portalForcer; + MobSpawner *mobSpawner; int emptyTime; bool m_bAtLeastOnePlayerSleeping; // 4J Added static WeighedTreasureArray RANDOM_BONUS_ITEMS; // 4J - brought forward from 1.3.2 @@ -59,21 +61,27 @@ public: protected: void tickTiles(); +private: + vector toBeTicked; + public: + bool isTileToBeTickedAt(int x, int y, int z, int tileId); void addToTickNextTick(int x, int y, int z, int tileId, int tickDelay); - void forceAddTileTick(int x, int y, int z, int tileId, int tickDelay); + void addToTickNextTick(int x, int y, int z, int tileId, int tickDelay, int priorityTilt); + void forceAddTileTick(int x, int y, int z, int tileId, int tickDelay, int prioTilt); void tickEntities(); + void resetEmptyTime(); bool tickPendingTicks(bool force); vector *fetchTicksInChunk(LevelChunk *chunk, bool remove); - virtual void tick(shared_ptr e, bool actual); - void forceTick(shared_ptr e, bool actual); + virtual void tick(shared_ptr e, bool actual); + void forceTick(shared_ptr e, bool actual); bool AllPlayersAreSleeping() { return allPlayersSleeping;} // 4J added for a message to other players bool isAtLeastOnePlayerSleeping() { return m_bAtLeastOnePlayerSleeping;} protected: ChunkSource *createChunkSource(); // 4J - was virtual, but was called from parent ctor public: vector > *getTileEntitiesInRegion(int x0, int y0, int z0, int x1, int y1, int z1); - virtual bool mayInteract(shared_ptr player, int xt, int yt, int zt, int id); + virtual bool mayInteract(shared_ptr player, int xt, int yt, int zt, int content); protected: virtual void initializeLevel(LevelSettings *settings); virtual void setInitialSpawn(LevelSettings *settings); @@ -94,20 +102,20 @@ private: intEntityMap entitiesById; // 4J - was IntHashMap, using same hashing function as this uses protected: virtual void entityAdded(shared_ptr e); - virtual void entityRemoved(shared_ptr e); + virtual void entityRemoved(shared_ptr e); public: shared_ptr getEntity(int id); - virtual bool addGlobalEntity(shared_ptr e); - void broadcastEntityEvent(shared_ptr e, byte event); - virtual shared_ptr explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks); - virtual void tileEvent(int x, int y, int z, int tile, int b0, int b1); + virtual bool addGlobalEntity(shared_ptr e); + void broadcastEntityEvent(shared_ptr e, byte event); + virtual shared_ptr explode(shared_ptr source, double x, double y, double z, float r, bool fire, bool destroyBlocks); + virtual void tileEvent(int x, int y, int z, int tile, int b0, int b1); private: void runTileEvents(); bool doTileEvent(TileEventData *te); public: - void closeLevelStorage(); + void closeLevelStorage(); protected: virtual void tickWeather(); @@ -116,6 +124,9 @@ public: EntityTracker *getTracker(); void setTimeAndAdjustTileTicks(__int64 newTime); PlayerChunkMap *getChunkMap(); + PortalForcer *getPortalForcer(); + void sendParticles(const wstring &name, double x, double y, double z, int count); + void sendParticles(const wstring &name, double x, double y, double z, int count, double xDist, double yDist, double zDist, double speed); void queueSendTileUpdate(int x, int y, int z); // 4J Added private: @@ -142,7 +153,9 @@ public: virtual bool addEntity(shared_ptr e); void entityAddedExtra(shared_ptr e); void entityRemovedExtra(shared_ptr e); - + + bool atEntityLimit(shared_ptr e); // 4J: Added + virtual bool newPrimedTntAllowed(); virtual bool newFallingTileAllowed(); diff --git a/Minecraft.Client/ServerLevelListener.cpp b/Minecraft.Client/ServerLevelListener.cpp index 3b12630f..b95f6fa7 100644 --- a/Minecraft.Client/ServerLevelListener.cpp +++ b/Minecraft.Client/ServerLevelListener.cpp @@ -66,7 +66,7 @@ void ServerLevelListener::playSound(int iSound, double x, double y, double z, fl } } -void ServerLevelListener::playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fClipSoundDist) +void ServerLevelListener::playSoundExceptPlayer(shared_ptr player, int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist) { if(iSound < 0) { @@ -76,7 +76,6 @@ void ServerLevelListener::playSound(shared_ptr entity,int iSound, double { // 4J-PB - I don't want to broadcast player sounds to my local machine, since we're already playing these in the LevelRenderer::playSound. // The PC version does seem to do this and the result is I can stop walking , and then I'll hear my footstep sound with a delay - shared_ptr player= dynamic_pointer_cast(entity); server->getPlayers()->broadcast(player,x, y, z, volume > 1 ? 16 * volume : 16, level->dimension->id, shared_ptr(new LevelSoundPacket(iSound, x, y, z, volume, pitch))); } } @@ -104,7 +103,12 @@ void ServerLevelListener::playStreamingMusic(const wstring& name, int x, int y, void ServerLevelListener::levelEvent(shared_ptr source, int type, int x, int y, int z, int data) { - server->getPlayers()->broadcast(source, x, y, z, 64, level->dimension->id, shared_ptr( new LevelEventPacket(type, x, y, z, data) ) ); + server->getPlayers()->broadcast(source, x, y, z, 64, level->dimension->id, shared_ptr( new LevelEventPacket(type, x, y, z, data, false) ) ); +} + +void ServerLevelListener::globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data) +{ + server->getPlayers()->broadcastAll( shared_ptr( new LevelEventPacket(type, sourceX, sourceY, sourceZ, data, true)) ); } void ServerLevelListener::destroyTileProgress(int id, int x, int y, int z, int progress) diff --git a/Minecraft.Client/ServerLevelListener.h b/Minecraft.Client/ServerLevelListener.h index 1886a89d..5265efb5 100644 --- a/Minecraft.Client/ServerLevelListener.h +++ b/Minecraft.Client/ServerLevelListener.h @@ -22,12 +22,13 @@ public: virtual void entityRemoved(shared_ptr entity); virtual void playerRemoved(shared_ptr entity); // 4J added - for when a player is removed from the level's player array, not just the entity storage virtual void playSound(int iSound, double x, double y, double z, float volume, float pitch, float fClipSoundDist); - virtual void playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fClipSoundDist); + virtual void playSoundExceptPlayer(shared_ptr player, int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist); virtual void setTilesDirty(int x0, int y0, int z0, int x1, int y1, int z1, Level *level); // 4J - added level param virtual void skyColorChanged(); virtual void tileChanged(int x, int y, int z); virtual void tileLightChanged(int x, int y, int z); virtual void playStreamingMusic(const wstring& name, int x, int y, int z); virtual void levelEvent(shared_ptr source, int type, int x, int y, int z, int data); + virtual void globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data); virtual void destroyTileProgress(int id, int x, int y, int z, int progress); }; diff --git a/Minecraft.Client/ServerPlayer.cpp b/Minecraft.Client/ServerPlayer.cpp index 489e6f34..10fde77b 100644 --- a/Minecraft.Client/ServerPlayer.cpp +++ b/Minecraft.Client/ServerPlayer.cpp @@ -8,57 +8,69 @@ #include "Settings.h" #include "PlayerList.h" #include "MultiPlayerLevel.h" -#include "..\Minecraft.World\Pos.h" + +#include "..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\Minecraft.World\net.minecraft.world.damagesource.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\net.minecraft.world.level.storage.h" #include "..\Minecraft.World\net.minecraft.world.level.dimension.h" -#include "..\Minecraft.World\Random.h" -#include "..\Minecraft.World\net.minecraft.world.inventory.h" -#include "..\Minecraft.World\net.minecraft.network.packet.h" #include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\net.minecraft.world.item.trading.h" #include "..\Minecraft.World\net.minecraft.world.entity.item.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\Minecraft.World\net.minecraft.world.scores.h" +#include "..\Minecraft.World\net.minecraft.world.scores.criteria.h" #include "..\Minecraft.World\net.minecraft.stats.h" #include "..\Minecraft.World\net.minecraft.locale.h" -#include "..\Minecraft.World\net.minecraft.world.damagesource.h" + +#include "..\Minecraft.World\Pos.h" +#include "..\Minecraft.World\Random.h" + #include "..\Minecraft.World\LevelChunk.h" #include "LevelRenderer.h" -ServerPlayer::ServerPlayer(MinecraftServer *server, Level *level, const wstring& name, ServerPlayerGameMode *gameMode) : Player(level) + +ServerPlayer::ServerPlayer(MinecraftServer *server, Level *level, const wstring& name, ServerPlayerGameMode *gameMode) : Player(level, name) { // 4J - added initialisers connection = nullptr; - lastMoveX = lastMoveZ = 0; - spewTimer = 0; + lastMoveX = lastMoveZ = 0; + spewTimer = 0; + lastRecordedHealthAndAbsorption = FLT_MIN; lastSentHealth = -99999999; lastSentFood = -99999999; lastFoodSaturationZero = true; lastSentExp = -99999999; - invulnerableTime = 20 * 3; + invulnerableTime = 20 * 3; containerCounter = 0; ignoreSlotUpdateHack = false; latency = 0; wonGame = false; m_enteredEndExitPortal = false; - lastCarried = ItemInstanceArray(5); - viewDistance = 10; + // lastCarried = ItemInstanceArray(5); + lastActionTime = 0; + + viewDistance = server->getPlayers()->getViewDistance(); -// gameMode->player = this; // 4J - removed to avoid use of shared_from_this in ctor, now set up externally - this->gameMode = gameMode; + // gameMode->player = this; // 4J - removed to avoid use of shared_from_this in ctor, now set up externally + this->gameMode = gameMode; - Pos *spawnPos = level->getSharedSpawnPos(); - int xx = spawnPos->x; - int zz = spawnPos->z; - int yy = spawnPos->y; + Pos *spawnPos = level->getSharedSpawnPos(); + int xx = spawnPos->x; + int zz = spawnPos->z; + int yy = spawnPos->y; delete spawnPos; if (!level->dimension->hasCeiling && level->getLevelData()->getGameType() != GameType::ADVENTURE) { level->isFindingSpawn = true; + int radius = max(5, server->getSpawnProtectionRadius() - 6); + // 4J added - do additional checking that we aren't putting the player in deep water. Give up after 20 or goes just // in case the spawnPos is somehow in a really bad spot and we would just lock here. int waterDepth = 0; @@ -74,16 +86,16 @@ ServerPlayer::ServerPlayer(MinecraftServer *server, Level *level, const wstring& // Also check that we aren't straying outside of the map do { - xx2 = xx + random->nextInt(20) - 10; - zz2 = zz + random->nextInt(20) - 10; + xx2 = xx + random->nextInt(radius * 2) - radius; + zz2 = zz + random->nextInt(radius * 2) - radius; } while ( ( xx2 > maxXZ ) || ( xx2 < minXZ ) || ( zz2 > maxXZ ) || ( zz2 < minXZ ) ); yy2 = level->getTopSolidBlock(xx2, zz2); waterDepth = 0; int yw = yy2; while( ( yw < 128 ) && - (( level->getTile(xx2,yw,zz2) == Tile::water_Id ) || - ( level->getTile(xx2,yw,zz2) == Tile::calmWater_Id )) ) + (( level->getTile(xx2,yw,zz2) == Tile::water_Id ) || + ( level->getTile(xx2,yw,zz2) == Tile::calmWater_Id )) ) { yw++; waterDepth++; @@ -96,16 +108,21 @@ ServerPlayer::ServerPlayer(MinecraftServer *server, Level *level, const wstring& zz = zz2; level->isFindingSpawn = false; - } + } + + this->server = server; + footSize = 0; heightOffset = 0; // 4J - this height used to be set up after moveTo, but that ends up with the y value being incorrect as it depends on this offset - this->moveTo(xx + 0.5, yy, zz + 0.5, 0, 0); + this->moveTo(xx + 0.5, yy, zz + 0.5, 0, 0); - this->server = server; - footSize = 0; + // 4J Handled later + //while (!level->getCubes(this, bb).empty()) + //{ + // setPos(x, y + 1, z); + //} - this->name = name; - m_UUID = name; + // m_UUID = name; // 4J Added lastBrupSendTickCount = 0; @@ -113,7 +130,7 @@ ServerPlayer::ServerPlayer(MinecraftServer *server, Level *level, const wstring& ServerPlayer::~ServerPlayer() { - delete [] lastCarried.data; + // delete [] lastCarried.data; } // 4J added - add bits to a flag array that is passed in, to represent those entities which have small Ids, and are in our vector of entitiesToRemove. @@ -154,7 +171,14 @@ void ServerPlayer::readAdditionalSaveData(CompoundTag *entityTag) if (entityTag->contains(L"playerGameType")) { // 4J Stu - We do not want to change the game mode for the player, instead we let the server override it globally - //gameMode->setGameModeForPlayer(GameType::byId(entityTag->getInt(L"playerGameType"))); + //if (MinecraftServer::getInstance()->getForceGameType()) + //{ + // gameMode->setGameModeForPlayer(MinecraftServer::getInstance()->getDefaultGameType()); + //} + //else + //{ + // gameMode->setGameModeForPlayer(GameType::byId(entityTag->getInt(L"playerGameType"))); + //} } GameRulesInstance *grs = gameMode->getGameRules(); @@ -190,9 +214,9 @@ void ServerPlayer::addAdditonalSaveData(CompoundTag *entityTag) //entityTag->putInt(L"playerGameType", gameMode->getGameModeForPlayer()->getId()); } -void ServerPlayer::withdrawExperienceLevels(int amount) +void ServerPlayer::giveExperienceLevels(int amount) { - Player::withdrawExperienceLevels(amount); + Player::giveExperienceLevels(amount); lastSentExp = -1; } @@ -201,11 +225,6 @@ void ServerPlayer::initMenu() containerMenu->addSlotListener(this); } -ItemInstanceArray ServerPlayer::getEquipmentSlots() -{ - return lastCarried; -} - void ServerPlayer::setDefaultHeadHeight() { heightOffset = 0; @@ -218,10 +237,10 @@ float ServerPlayer::getHeadHeight() void ServerPlayer::tick() { - gameMode->tick(); + gameMode->tick(); - if (invulnerableTime > 0) invulnerableTime--; - containerMenu->broadcastChanges(); + if (invulnerableTime > 0) invulnerableTime--; + containerMenu->broadcastChanges(); // 4J-JEV, hook for Durango event 'EnteredNewBiome'. Biome *newBiome = level->getBiome(x,z); @@ -234,15 +253,14 @@ void ServerPlayer::tick() currentBiome = newBiome; } - for (int i = 0; i < 5; i++) + if (!level->isClientSide) { - shared_ptr currentCarried = getCarried(i); - if (currentCarried != lastCarried[i]) + if (!containerMenu->stillValid(dynamic_pointer_cast(shared_from_this()))) { - getLevel()->getTracker()->broadcast(shared_from_this(), shared_ptr( new SetEquippedItemPacket(this->entityId, i, currentCarried) ) ); - lastCarried[i] = currentCarried; - } - } + closeContainer(); + containerMenu = inventoryMenu; + } + } flushEntitiesToRemove(); } @@ -250,7 +268,7 @@ void ServerPlayer::tick() // 4J Stu - Split out here so that we can call this from other places void ServerPlayer::flushEntitiesToRemove() { - if (!entitiesToRemove.empty()) + while (!entitiesToRemove.empty()) { int sz = entitiesToRemove.size(); int amount = min(sz, RemoveEntitiesPacket::MAX_PER_PACKET); @@ -268,58 +286,63 @@ void ServerPlayer::flushEntitiesToRemove() } } - // 4J - have split doTick into 3 bits, so that we can call the doChunkSendingTick separately, but still do the equivalent of what calling a full doTick used to do, by calling this method void ServerPlayer::doTick(bool sendChunks, bool dontDelayChunks/*=false*/, bool ignorePortal/*=false*/) { + m_ignorePortal = ignorePortal; + if( sendChunks ) + { + updateFrameTick(); + } doTickA(); if( sendChunks ) { doChunkSendingTick(dontDelayChunks); } - doTickB(ignorePortal); + doTickB(); + m_ignorePortal = false; } void ServerPlayer::doTickA() { - Player::tick(); + Player::tick(); - for (unsigned int i = 0; i < inventory->getContainerSize(); i++) + for (unsigned int i = 0; i < inventory->getContainerSize(); i++) { - shared_ptr ie = inventory->getItem(i); - if (ie != NULL) + shared_ptr ie = inventory->getItem(i); + if (ie != NULL) { // 4J - removed condition. These were getting lower priority than tile update packets etc. on the slow outbound queue, and so were extremely slow to send sometimes, // particularly at the start of a game. They don't typically seem to be massive and shouldn't be send when there isn't actually any updating to do. - if (Item::items[ie->id]->isComplex() ) // && connection->countDelayedPackets() <= 2) + if (Item::items[ie->id]->isComplex() ) // && connection->countDelayedPackets() <= 2) { - shared_ptr packet = (dynamic_cast(Item::items[ie->id])->getUpdatePacket(ie, level, dynamic_pointer_cast( shared_from_this() ) ) ); - if (packet != NULL) + shared_ptr packet = (dynamic_cast(Item::items[ie->id])->getUpdatePacket(ie, level, dynamic_pointer_cast( shared_from_this() ) ) ); + if (packet != NULL) { - connection->send(packet); - } - } - } - } + connection->send(packet); + } + } + } + } } // 4J - split off the chunk sending bit of the tick here from ::doTick so we can do this exactly once per player per server tick void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) { -// printf("[%d] %s: sendChunks: %d, empty: %d\n",tickCount, connection->getNetworkPlayer()->GetUID().getOnlineID(),sendChunks,chunksToSend.empty()); + // printf("[%d] %s: sendChunks: %d, empty: %d\n",tickCount, connection->getNetworkPlayer()->GetUID().getOnlineID(),sendChunks,chunksToSend.empty()); if (!chunksToSend.empty()) { - ChunkPos nearest = chunksToSend.front(); + ChunkPos nearest = chunksToSend.front(); bool nearestValid = false; // 4J - reinstated and optimised some code that was commented out in the original, to make sure that we always // send the nearest chunk to the player. The original uses the bukkit sorting thing to try and avoid doing this, but // the player can quickly wander away from the centre of the spiral of chunks that that method creates, long before transmission // of them is complete. - double dist = DBL_MAX; + double dist = DBL_MAX; for( AUTO_VAR(it, chunksToSend.begin()); it != chunksToSend.end(); it++ ) { - ChunkPos chunk = *it; + ChunkPos chunk = *it; if( level->isChunkFinalised(chunk.x, chunk.z) ) { double newDist = chunk.distanceToSqr(x, z); @@ -330,36 +353,42 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) nearestValid = true; } } - } + } -// if (nearest != NULL) // 4J - removed as we don't have references here + // if (nearest != NULL) // 4J - removed as we don't have references here if( nearestValid ) { - bool okToSend = false; + bool okToSend = false; -// if (dist < 32 * 32) okToSend = true; + // if (dist < 32 * 32) okToSend = true; if( connection->isLocal() ) { if( !connection->done ) okToSend = true; } else { - bool canSendOnSlowQueue = MinecraftServer::canSendOnSlowQueue(connection->getNetworkPlayer()); - -// app.DebugPrintf("%ls: canSendOnSlowQueue %d, countDelayedPackets %d GetSendQueueSizeBytes %d done: %d", -// connection->getNetworkPlayer()->GetUID().toString().c_str(), -// canSendOnSlowQueue, connection->countDelayedPackets(), -// g_NetworkManager.GetHostPlayer()->GetSendQueueSizeBytes( NULL, true ), -// connection->done); - + bool canSendToPlayer = MinecraftServer::chunkPacketManagement_CanSendTo(connection->getNetworkPlayer()); + +// app.DebugPrintf(">>> %d\n", canSendToPlayer); +// if( connection->getNetworkPlayer() ) +// { +// app.DebugPrintf("%d: canSendToPlayer %d, countDelayedPackets %d GetSendQueueSizeBytes %d done: %d\n", +// connection->getNetworkPlayer()->GetSmallId(), +// canSendToPlayer, connection->countDelayedPackets(), +// g_NetworkManager.GetHostPlayer()->GetSendQueueSizeMessages( NULL, true ), +// connection->done); +// } + if( dontDelayChunks || - (canSendOnSlowQueue && - (connection->countDelayedPackets() < 4 )&& + (canSendToPlayer && #ifdef _XBOX_ONE // The network manager on xbox one doesn't currently split data into slow & fast queues - since we can only measure // both together then bytes provides a better metric than count of data items to determine if we should avoid queueing too much up (g_NetworkManager.GetHostPlayer()->GetSendQueueSizeBytes( NULL, true ) < 8192 )&& +#elif defined _XBOX + (g_NetworkManager.GetHostPlayer()->GetSendQueueSizeMessages( NULL, true ) < 4 )&& #else + (connection->countDelayedPackets() < 4 )&& (g_NetworkManager.GetHostPlayer()->GetSendQueueSizeMessages( NULL, true ) < 4 )&& #endif //(tickCount - lastBrupSendTickCount) > (connection->getNetworkPlayer()->GetCurrentRtt()>>4) && @@ -367,7 +396,7 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) { lastBrupSendTickCount = tickCount; okToSend = true; - MinecraftServer::s_slowQueuePacketSent = true; + MinecraftServer::chunkPacketManagement_DidSendTo(connection->getNetworkPlayer()); // static unordered_map mapLastTime; // __int64 thisTime = System::currentTimeMillis(); @@ -377,15 +406,15 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) } else { -// app.DebugPrintf(" - \n"); + // app.DebugPrintf(" - \n"); } } - if (okToSend) + if (okToSend) { - ServerLevel *level = server->getLevel(dimension); + ServerLevel *level = server->getLevel(dimension); int flagIndex = getFlagIndexForChunk(nearest,this->level->dimension->id); - chunksToSend.remove(nearest); + chunksToSend.remove(nearest); bool chunkDataSent = false; @@ -400,9 +429,12 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) // unloaded on the client and so just gradually build up more and more of the finite set of chunks as the player moves if( !g_NetworkManager.SystemFlagGet(connection->getNetworkPlayer(),flagIndex) ) { -// app.DebugPrintf("Creating BRUP for %d %d\n",nearest.x, nearest.z); + // app.DebugPrintf("Creating BRUP for %d %d\n",nearest.x, nearest.z); PIXBeginNamedEvent(0,"Creation BRUP for sending\n"); + __int64 before = System::currentTimeMillis(); shared_ptr packet = shared_ptr( new BlockRegionUpdatePacket(nearest.x * 16, 0, nearest.z * 16, 16, Level::maxBuildHeight, 16, level) ); + __int64 after = System::currentTimeMillis(); +// app.DebugPrintf(">>><<< %d ms\n",after-before); PIXEndNamedEvent(); if( dontDelayChunks ) packet->shouldDelay = false; @@ -435,7 +467,7 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) lc->reSyncLighting(); lc->recalcHeightmapOnly(); clientLevel->setTilesDirty(nearest.x * 16 + 1, 1, nearest.z * 16 + 1, - nearest.x * 16 + 14, Level::maxBuildHeight - 2, nearest.z * 16 + 14 ); + nearest.x * 16 + 14, Level::maxBuildHeight - 2, nearest.z * 16 + 14 ); } } // Don't send TileEntity data until we have sent the block data @@ -450,40 +482,39 @@ void ServerPlayer::doChunkSendingTick(bool dontDelayChunks) } delete tes; } - } - } - } + } + } + } } -void ServerPlayer::doTickB(bool ignorePortal) +void ServerPlayer::doTickB() { #ifndef _CONTENT_PACKAGE // check if there's a debug dimension change requested - if(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<dimension->id == 0 ) - { - ignorePortal=false; - isInsidePortal=true; - portalTime=1; - } - unsigned int uiVal=app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad()); - app.SetGameSettingsDebugMask(ProfileManager.GetPrimaryPad(),uiVal&~(1L<dimension->id == 0 ) -// { -// server->players->toggleDimension( dynamic_pointer_cast( shared_from_this() ), 1 ); -// } -// unsigned int uiVal=app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad()); -// app.SetGameSettingsDebugMask(ProfileManager.GetPrimaryPad(),uiVal&~(1L<dimension->id == 0 ) + // { + // isInsidePortal=true; + // portalTime=1; + // } + // unsigned int uiVal=app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad()); + // app.SetGameSettingsDebugMask(ProfileManager.GetPrimaryPad(),uiVal&~(1L<dimension->id == 0 ) + // { + // server->players->toggleDimension( dynamic_pointer_cast( shared_from_this() ), 1 ); + // } + // unsigned int uiVal=app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad()); + // app.SetGameSettingsDebugMask(ProfileManager.GetPrimaryPad(),uiVal&~(1L<dimension->id != 0 ) - { - ignorePortal=false; + { isInsidePortal=true; portalTime=1; } @@ -492,61 +523,34 @@ void ServerPlayer::doTickB(bool ignorePortal) } #endif - if(!ignorePortal) + if (getHealth() != lastSentHealth || lastSentFood != foodData.getFoodLevel() || ((foodData.getSaturationLevel() == 0) != lastFoodSaturationZero)) { - if (isInsidePortal) - { - if (server->isNetherEnabled()) - { - if (containerMenu != inventoryMenu) - { - closeContainer(); - } - if (riding != NULL) - { - this->ride(riding); - } - else - { - - portalTime += 1 / 80.0f; - if (portalTime >= 1) - { - portalTime = 1; - changingDimensionDelay = 10; + // 4J Stu - Added m_lastDamageSource for telemetry + connection->send( shared_ptr( new SetHealthPacket(getHealth(), foodData.getFoodLevel(), foodData.getSaturationLevel(), m_lastDamageSource) ) ); + lastSentHealth = getHealth(); + lastSentFood = foodData.getFoodLevel(); + lastFoodSaturationZero = foodData.getSaturationLevel() == 0; + } - int targetDimension = 0; - if (dimension == -1) targetDimension = 0; - else targetDimension = -1; + if (getHealth() + getAbsorptionAmount() != lastRecordedHealthAndAbsorption) + { + lastRecordedHealthAndAbsorption = getHealth() + getAbsorptionAmount(); - server->getPlayers()->toggleDimension( dynamic_pointer_cast( shared_from_this() ), targetDimension ); - lastSentExp = -1; - lastSentHealth = -1; - lastSentFood = -1; + vector *objectives = getScoreboard()->findObjectiveFor(ObjectiveCriteria::HEALTH); + if(objectives) + { + vector< shared_ptr > players = vector< shared_ptr >(); + players.push_back(dynamic_pointer_cast(shared_from_this())); - //awardStat(Achievements::portal); - } - } - isInsidePortal = false; + for (AUTO_VAR(it,objectives->begin()); it != objectives->end(); ++it) + { + Objective *objective = *it; + getScoreboard()->getPlayerScore(getAName(), objective)->updateFor(&players); } + delete objectives; } - else - { - if (portalTime > 0) portalTime -= 1 / 20.0f; - if (portalTime < 0) portalTime = 0; - } - if (changingDimensionDelay > 0) changingDimensionDelay--; } - if (getHealth() != lastSentHealth || lastSentFood != foodData.getFoodLevel() || ((foodData.getSaturationLevel() == 0) != lastFoodSaturationZero)) - { - // 4J Stu - Added m_lastDamageSource for telemetry - connection->send( shared_ptr( new SetHealthPacket(getHealth(), foodData.getFoodLevel(), foodData.getSaturationLevel(), m_lastDamageSource) ) ); - lastSentHealth = getHealth(); - lastSentFood = foodData.getFoodLevel(); - lastFoodSaturationZero = foodData.getSaturationLevel() == 0; - } - if (totalExperience != lastSentExp) { lastSentExp = totalExperience; @@ -557,42 +561,67 @@ void ServerPlayer::doTickB(bool ignorePortal) shared_ptr ServerPlayer::getCarried(int slot) { - if (slot == 0) return inventory->getSelected(); - return inventory->armor[slot - 1]; + if (slot == 0) return inventory->getSelected(); + return inventory->armor[slot - 1]; } void ServerPlayer::die(DamageSource *source) { - server->getPlayers()->broadcastAll(source->getDeathMessagePacket(dynamic_pointer_cast(shared_from_this()))); - inventory->dropAll(); + server->getPlayers()->broadcastAll(getCombatTracker()->getDeathMessagePacket()); + + if (!level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY)) + { + inventory->dropAll(); + } + + vector *objectives = level->getScoreboard()->findObjectiveFor(ObjectiveCriteria::DEATH_COUNT); + if(objectives) + { + for (int i = 0; i < objectives->size(); i++) + { + Objective *objective = objectives->at(i); + + Score *score = getScoreboard()->getPlayerScore(getAName(), objective); + score->increment(); + } + delete objectives; + } + + shared_ptr killer = getKillCredit(); + if (killer != NULL) killer->awardKillScore(shared_from_this(), deathScore); + //awardStat(Stats::deaths, 1); } -bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) +bool ServerPlayer::hurt(DamageSource *dmgSource, float dmg) { - if (invulnerableTime > 0) return false; + if (isInvulnerable()) return false; - if (dynamic_cast(dmgSource) != NULL) + // 4J: Not relevant to console servers + // Allow falldamage on dedicated pvpservers -- so people cannot cheat their way out of 'fall traps' + //bool allowFallDamage = server->isPvpAllowed() && server->isDedicatedServer() && server->isPvpAllowed() && (dmgSource->msgId.compare(L"fall") == 0); + if (!server->isPvpAllowed() && invulnerableTime > 0 && dmgSource != DamageSource::outOfWorld) return false; + + if (dynamic_cast(dmgSource) != NULL) { // 4J Stu - Fix for #46422 - TU5: Crash: Gameplay: Crash when being hit by a trap using a dispenser // getEntity returns the owner of projectiles, and this would never be the arrow. The owner is sometimes NULL. shared_ptr source = dmgSource->getDirectEntity(); - - if (dynamic_pointer_cast(source) != NULL && (!server->pvp || !dynamic_pointer_cast(source)->isAllowedToAttackPlayers()) ) + if (source->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(source)->canHarmPlayer(dynamic_pointer_cast(shared_from_this()))) { return false; } - if (source != NULL && source->GetType() == eTYPE_ARROW) + if ( (source != NULL) && source->instanceof(eTYPE_ARROW) ) { shared_ptr arrow = dynamic_pointer_cast(source); - if (dynamic_pointer_cast(arrow->owner) != NULL && (!server->pvp || !dynamic_pointer_cast(arrow->owner)->isAllowedToAttackPlayers()) ) + if ( (arrow->owner != NULL) && arrow->owner->instanceof(eTYPE_PLAYER) && !canHarmPlayer(dynamic_pointer_cast(arrow->owner)) ) { return false; } } - } - bool returnVal = Player::hurt(dmgSource, dmg); + } + bool returnVal = Player::hurt(dmgSource, dmg); if( returnVal ) { @@ -646,7 +675,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) break; case eTYPE_ARROW: if ((dynamic_pointer_cast(source))->owner != NULL) - { + { shared_ptr attacker = (dynamic_pointer_cast(source))->owner; if (attacker != NULL) { @@ -659,7 +688,7 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) case eTYPE_SERVERPLAYER: m_lastDamageSource = eTelemetryPlayerDeathSource_Player_Arrow; break; - } + } } } break; @@ -674,9 +703,29 @@ bool ServerPlayer::hurt(DamageSource *dmgSource, int dmg) return returnVal; } -bool ServerPlayer::isPlayerVersusPlayer() +bool ServerPlayer::canHarmPlayer(shared_ptr target) { - return server->pvp; + if (!server->isPvpAllowed()) return false; + if(!isAllowedToAttackPlayers()) return false; + return Player::canHarmPlayer(target); +} + +// 4J: Added for checking when only player name is provided (possible player isn't on server), e.g. can harm owned animals +bool ServerPlayer::canHarmPlayer(wstring targetName) +{ + bool canHarm = true; + + shared_ptr owner = server->getPlayers()->getPlayer(targetName); + if (owner != NULL) + { + if ((shared_from_this() != owner) && canHarmPlayer(owner)) canHarm = false; + } + else + { + if (this->name != targetName && (!isAllowedToAttackPlayers() || !server->isPvpAllowed())) canHarm = false; + } + + return canHarm; } void ServerPlayer::changeDimension(int i) @@ -717,15 +766,25 @@ void ServerPlayer::changeDimension(int i) } else { - awardStat(GenericStats::theEnd(), GenericStats::param_theEnd()); + if (dimension == 0 && i == 1) + { + awardStat(GenericStats::theEnd(), GenericStats::param_theEnd()); - Pos *pos = server->getLevel(i)->getDimensionSpecificSpawn(); - if (pos != NULL) + Pos *pos = server->getLevel(i)->getDimensionSpecificSpawn(); + if (pos != NULL) + { + connection->teleport(pos->x, pos->y, pos->z, 0, 0); + delete pos; + } + + i = 1; + } + else { - connection->teleport(pos->x, pos->y, pos->z, 0, 0); - delete pos; + // 4J: Removed on the advice of the mighty King of Achievments (JV) + // awardStat(GenericStats::portal(), GenericStats::param_portal()); } - server->getPlayers()->toggleDimension( dynamic_pointer_cast(shared_from_this()), 1); + server->getPlayers()->toggleDimension( dynamic_pointer_cast(shared_from_this()), i); lastSentExp = -1; lastSentHealth = -1; lastSentFood = -1; @@ -735,82 +794,56 @@ void ServerPlayer::changeDimension(int i) // 4J Added delay param void ServerPlayer::broadcast(shared_ptr te, bool delay /*= false*/) { - if (te != NULL) + if (te != NULL) { - shared_ptr p = te->getUpdatePacket(); - if (p != NULL) + shared_ptr p = te->getUpdatePacket(); + if (p != NULL) { p->shouldDelay = delay; if(delay) connection->queueSend(p); else connection->send(p); - } - } + } + } } void ServerPlayer::take(shared_ptr e, int orgCount) { - if (!e->removed) - { - EntityTracker *entityTracker = getLevel()->getTracker(); - if (e->GetType() == eTYPE_ITEMENTITY) - { - entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); - } - if (e->GetType() == eTYPE_ARROW) - { - entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); - } - if (e->GetType() == eTYPE_EXPERIENCEORB) - { - entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId) ) ); - } - } - Player::take(e, orgCount); - containerMenu->broadcastChanges(); -} - -void ServerPlayer::swing() -{ - if (!swinging) - { - swingTime = -1; - swinging = true; - getLevel()->getTracker()->broadcast(shared_from_this(), shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::SWING) ) ); - } + Player::take(e, orgCount); + containerMenu->broadcastChanges(); } Player::BedSleepingResult ServerPlayer::startSleepInBed(int x, int y, int z, bool bTestUse) { - BedSleepingResult result = Player::startSleepInBed(x, y, z, bTestUse); - if (result == OK) + BedSleepingResult result = Player::startSleepInBed(x, y, z, bTestUse); + if (result == OK) { - shared_ptr p = shared_ptr( new EntityActionAtPositionPacket(shared_from_this(), EntityActionAtPositionPacket::START_SLEEP, x, y, z) ); - getLevel()->getTracker()->broadcast(shared_from_this(), p); - connection->teleport(this->x, this->y, this->z, yRot, xRot); - connection->send(p); - } - return result; + shared_ptr p = shared_ptr( new EntityActionAtPositionPacket(shared_from_this(), EntityActionAtPositionPacket::START_SLEEP, x, y, z) ); + getLevel()->getTracker()->broadcast(shared_from_this(), p); + connection->teleport(this->x, this->y, this->z, yRot, xRot); + connection->send(p); + } + return result; } void ServerPlayer::stopSleepInBed(bool forcefulWakeUp, bool updateLevelList, bool saveRespawnPoint) { - if (isSleeping()) + if (isSleeping()) { - getLevel()->getTracker()->broadcastAndSend(shared_from_this(), shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::WAKE_UP) ) ); - } - Player::stopSleepInBed(forcefulWakeUp, updateLevelList, saveRespawnPoint); - if (connection != NULL) connection->teleport(x, y, z, yRot, xRot); + getLevel()->getTracker()->broadcastAndSend(shared_from_this(), shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::WAKE_UP) ) ); + } + Player::stopSleepInBed(forcefulWakeUp, updateLevelList, saveRespawnPoint); + if (connection != NULL) connection->teleport(x, y, z, yRot, xRot); } void ServerPlayer::ride(shared_ptr e) { - Player::ride(e); - connection->send( shared_ptr( new SetRidingPacket(shared_from_this(), riding) ) ); + Player::ride(e); + connection->send( shared_ptr( new SetEntityLinkPacket(SetEntityLinkPacket::RIDING, shared_from_this(), riding) ) ); // 4J Removed this - The act of riding will be handled on the client and will change the position // of the player. If we also teleport it then we can end up with a repeating movements, e.g. bouncing // up and down after exiting a boat due to slight differences in position on the client and server - //connection->teleport(x, y, z, yRot, xRot); + //connection->teleport(x, y, z, yRot, xRot); } void ServerPlayer::checkFallDamage(double ya, bool onGround) @@ -819,7 +852,17 @@ void ServerPlayer::checkFallDamage(double ya, bool onGround) void ServerPlayer::doCheckFallDamage(double ya, bool onGround) { - Player::checkFallDamage(ya, onGround); + Player::checkFallDamage(ya, onGround); +} + +void ServerPlayer::openTextEdit(shared_ptr sign) +{ + shared_ptr signTE = dynamic_pointer_cast(sign); + if (signTE != NULL) + { + signTE->setAllowedPlayerEditor(dynamic_pointer_cast(shared_from_this())); + connection->send( shared_ptr( new TileEditorOpenPacket(TileEditorOpenPacket::SIGN, sign->x, sign->y, sign->z)) ); + } } void ServerPlayer::nextContainerCounter() @@ -832,7 +875,7 @@ bool ServerPlayer::startCrafting(int x, int y, int z) if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::WORKBENCH, 0, 9) ) ); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::WORKBENCH, L"", 9, false) ) ); containerMenu = new CraftingMenu(inventory, level, x, y, z); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -841,16 +884,44 @@ bool ServerPlayer::startCrafting(int x, int y, int z) { app.DebugPrintf("ServerPlayer tried to open crafting container when one was already open\n"); } - + return true; } -bool ServerPlayer::startEnchanting(int x, int y, int z) +bool ServerPlayer::openFireworks(int x, int y, int z) { if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send(shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::ENCHANTMENT, 0, 9) )); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::FIREWORKS, L"", 9, false) ) ); + containerMenu = new FireworksMenu(inventory, level, x, y, z); + containerMenu->containerId = containerCounter; + containerMenu->addSlotListener(this); + } + else if(dynamic_cast(containerMenu) != NULL) + { + closeContainer(); + + nextContainerCounter(); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::FIREWORKS, L"", 9, false) ) ); + containerMenu = new FireworksMenu(inventory, level, x, y, z); + containerMenu->containerId = containerCounter; + containerMenu->addSlotListener(this); + } + else + { + app.DebugPrintf("ServerPlayer tried to open crafting container when one was already open\n"); + } + + return true; +} + +bool ServerPlayer::startEnchanting(int x, int y, int z, const wstring &name) +{ + if(containerMenu == inventoryMenu) + { + nextContainerCounter(); + connection->send(shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::ENCHANTMENT, name.empty()? L"" : name, 9, !name.empty() ) )); containerMenu = new EnchantmentMenu(inventory, level, x, y, z); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -868,8 +939,8 @@ bool ServerPlayer::startRepairing(int x, int y, int z) if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send(shared_ptr ( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::REPAIR_TABLE, 0, 9)) ); - containerMenu = new RepairMenu(inventory, level, x, y, z, dynamic_pointer_cast(shared_from_this())); + connection->send(shared_ptr ( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::REPAIR_TABLE, L"", 9, false)) ); + containerMenu = new AnvilMenu(inventory, level, x, y, z, dynamic_pointer_cast(shared_from_this())); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); } @@ -886,7 +957,12 @@ bool ServerPlayer::openContainer(shared_ptr container) if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::CONTAINER, container->getName(), container->getContainerSize()) ) ); + + // 4J-JEV: Added to distinguish between ender, bonus, large and small chests (for displaying the name of the chest). + int containerType = container->getContainerType(); + assert(containerType >= 0); + + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, containerType, container->getCustomName(), container->getContainerSize(), container->hasCustomName()) ) ); containerMenu = new ContainerMenu(inventory, container); containerMenu->containerId = containerCounter; @@ -900,12 +976,48 @@ bool ServerPlayer::openContainer(shared_ptr container) return true; } +bool ServerPlayer::openHopper(shared_ptr container) +{ + if(containerMenu == inventoryMenu) + { + nextContainerCounter(); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::HOPPER, container->getCustomName(), container->getContainerSize(), container->hasCustomName())) ); + containerMenu = new HopperMenu(inventory, container); + containerMenu->containerId = containerCounter; + containerMenu->addSlotListener(this); + } + else + { + app.DebugPrintf("ServerPlayer tried to open hopper container when one was already open\n"); + } + + return true; +} + +bool ServerPlayer::openHopper(shared_ptr container) +{ + if(containerMenu == inventoryMenu) + { + nextContainerCounter(); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::HOPPER, container->getCustomName(), container->getContainerSize(), container->hasCustomName())) ); + containerMenu = new HopperMenu(inventory, container); + containerMenu->containerId = containerCounter; + containerMenu->addSlotListener(this); + } + else + { + app.DebugPrintf("ServerPlayer tried to open minecart hopper container when one was already open\n"); + } + + return true; +} + bool ServerPlayer::openFurnace(shared_ptr furnace) { if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::FURNACE, 0, furnace->getContainerSize()) ) ); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::FURNACE, furnace->getCustomName(), furnace->getContainerSize(), furnace->hasCustomName()) ) ); containerMenu = new FurnaceMenu(inventory, furnace); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -923,7 +1035,7 @@ bool ServerPlayer::openTrap(shared_ptr trap) if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::TRAP, 0, trap->getContainerSize()) ) ); + connection->send( shared_ptr( new ContainerOpenPacket(containerCounter, trap->GetType() == eTYPE_DROPPERTILEENTITY ? ContainerOpenPacket::DROPPER : ContainerOpenPacket::TRAP, trap->getCustomName(), trap->getContainerSize(), trap->hasCustomName() ) ) ); containerMenu = new TrapMenu(inventory, trap); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -932,7 +1044,7 @@ bool ServerPlayer::openTrap(shared_ptr trap) { app.DebugPrintf("ServerPlayer tried to open dispenser when one was already open\n"); } - + return true; } @@ -941,7 +1053,7 @@ bool ServerPlayer::openBrewingStand(shared_ptr brewingSt if(containerMenu == inventoryMenu) { nextContainerCounter(); - connection->send(shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::BREWING_STAND, 0, brewingStand->getContainerSize()))); + connection->send(shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::BREWING_STAND, brewingStand->getCustomName(), brewingStand->getContainerSize(), brewingStand->hasCustomName() ))); containerMenu = new BrewingStandMenu(inventory, brewingStand); containerMenu->containerId = containerCounter; containerMenu->addSlotListener(this); @@ -954,7 +1066,25 @@ bool ServerPlayer::openBrewingStand(shared_ptr brewingSt return true; } -bool ServerPlayer::openTrading(shared_ptr traderTarget) +bool ServerPlayer::openBeacon(shared_ptr beacon) +{ + if(containerMenu == inventoryMenu) + { + nextContainerCounter(); + connection->send(shared_ptr( new ContainerOpenPacket(containerCounter, ContainerOpenPacket::BEACON, beacon->getCustomName(), beacon->getContainerSize(), beacon->hasCustomName() ))); + containerMenu = new BeaconMenu(inventory, beacon); + containerMenu->containerId = containerCounter; + containerMenu->addSlotListener(this); + } + else + { + app.DebugPrintf("ServerPlayer tried to open beacon when one was already open\n"); + } + + return true; +} + +bool ServerPlayer::openTrading(shared_ptr traderTarget, const wstring &name) { if(containerMenu == inventoryMenu) { @@ -964,19 +1094,19 @@ bool ServerPlayer::openTrading(shared_ptr traderTarget) containerMenu->addSlotListener(this); shared_ptr container = ((MerchantMenu *) containerMenu)->getTradeContainer(); - connection->send(shared_ptr(new ContainerOpenPacket(containerCounter, ContainerOpenPacket::TRADER_NPC, container->getName(), container->getContainerSize()))); + connection->send(shared_ptr(new ContainerOpenPacket(containerCounter, ContainerOpenPacket::TRADER_NPC, name.empty()?L"":name, container->getContainerSize(), !name.empty()))); MerchantRecipeList *offers = traderTarget->getOffers(dynamic_pointer_cast(shared_from_this())); if (offers != NULL) { - ByteArrayOutputStream rawOutput; - DataOutputStream output(&rawOutput); + ByteArrayOutputStream rawOutput; + DataOutputStream output(&rawOutput); - // just to make sure the offers are matched to the container - output.writeInt(containerCounter); - offers->writeToStream(&output); + // just to make sure the offers are matched to the container + output.writeInt(containerCounter); + offers->writeToStream(&output); - connection->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_LIST_PACKET, rawOutput.toByteArray()))); + connection->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_LIST_PACKET, rawOutput.toByteArray()))); } } else @@ -987,24 +1117,39 @@ bool ServerPlayer::openTrading(shared_ptr traderTarget) return true; } +bool ServerPlayer::openHorseInventory(shared_ptr horse, shared_ptr container) +{ + if (containerMenu != inventoryMenu) + { + closeContainer(); + } + nextContainerCounter(); + connection->send(shared_ptr(new ContainerOpenPacket(containerCounter, ContainerOpenPacket::HORSE, horse->getCustomName(), container->getContainerSize(), container->hasCustomName(), horse->entityId ))); + containerMenu = new HorseInventoryMenu(inventory, container, horse); + containerMenu->containerId = containerCounter; + containerMenu->addSlotListener(this); + + return true; +} + void ServerPlayer::slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item) { - if (dynamic_cast(container->getSlot(slotIndex))) + if (dynamic_cast(container->getSlot(slotIndex))) { - return; - } + return; + } - if (ignoreSlotUpdateHack) + if (ignoreSlotUpdateHack) { - // Do not send this packet! - // - // This is a horrible hack that makes sure that inventory clicks - // that the client correctly predicted don't get sent out to the - // client again. - return; - } + // Do not send this packet! + // + // This is a horrible hack that makes sure that inventory clicks + // that the client correctly predicted don't get sent out to the + // client again. + return; + } - connection->send( shared_ptr( new ContainerSetSlotPacket(container->containerId, slotIndex, item) ) ); + connection->send( shared_ptr( new ContainerSetSlotPacket(container->containerId, slotIndex, item) ) ); } @@ -1017,96 +1162,91 @@ void ServerPlayer::refreshContainer(AbstractContainerMenu *menu) void ServerPlayer::refreshContainer(AbstractContainerMenu *container, vector > *items) { - connection->send( shared_ptr( new ContainerSetContentPacket(container->containerId, items) ) ); - connection->send( shared_ptr( new ContainerSetSlotPacket(-1, -1, inventory->getCarried()) ) ); + connection->send( shared_ptr( new ContainerSetContentPacket(container->containerId, items) ) ); + connection->send( shared_ptr( new ContainerSetSlotPacket(-1, -1, inventory->getCarried()) ) ); } void ServerPlayer::setContainerData(AbstractContainerMenu *container, int id, int value) { // 4J - added, so that furnace updates also have this hack - if (ignoreSlotUpdateHack) - { - // Do not send this packet! - // - // This is a horrible hack that makes sure that inventory clicks - // that the client correctly predicted don't get sent out to the - // client again. - return; - } + if (ignoreSlotUpdateHack) + { + // Do not send this packet! + // + // This is a horrible hack that makes sure that inventory clicks + // that the client correctly predicted don't get sent out to the + // client again. + return; + } connection->send( shared_ptr( new ContainerSetDataPacket(container->containerId, id, value) ) ); } void ServerPlayer::closeContainer() { - connection->send( shared_ptr( new ContainerClosePacket(containerMenu->containerId) ) ); - doCloseContainer(); + connection->send( shared_ptr( new ContainerClosePacket(containerMenu->containerId) ) ); + doCloseContainer(); } void ServerPlayer::broadcastCarriedItem() { - if (ignoreSlotUpdateHack) + if (ignoreSlotUpdateHack) { - // Do not send this packet! - // This is a horrible hack that makes sure that inventory clicks - // that the client correctly predicted don't get sent out to the - // client again. - return; - } - connection->send( shared_ptr( new ContainerSetSlotPacket(-1, -1, inventory->getCarried()) ) ); + // Do not send this packet! + // This is a horrible hack that makes sure that inventory clicks + // that the client correctly predicted don't get sent out to the + // client again. + return; + } + connection->send( shared_ptr( new ContainerSetSlotPacket(-1, -1, inventory->getCarried()) ) ); } void ServerPlayer::doCloseContainer() { - containerMenu->removed( dynamic_pointer_cast( shared_from_this() ) ); - containerMenu = inventoryMenu; + containerMenu->removed( dynamic_pointer_cast( shared_from_this() ) ); + containerMenu = inventoryMenu; } -void ServerPlayer::setPlayerInput(float xa, float ya, bool jumping, bool sneaking, float xRot, float yRot) +void ServerPlayer::setPlayerInput(float xxa, float yya, bool jumping, bool sneaking) { - xxa = xa; - yya = ya; - this->jumping = jumping; - this->setSneaking(sneaking); - this->xRot = xRot; - this->yRot = yRot; + if(riding != NULL) + { + if (xxa >= -1 && xxa <= 1) this->xxa = xxa; + if (yya >= -1 && yya <= 1) this->yya = yya; + this->jumping = jumping; + this->setSneaking(sneaking); + } } void ServerPlayer::awardStat(Stat *stat, byteArray param) { - if (stat == NULL) + if (stat == NULL) { delete [] param.data; return; } - if (!stat->awardLocallyOnly) + if (!stat->awardLocallyOnly) { #ifndef _DURANGO int count = *((int*)param.data); delete [] param.data; - while (count > 100) - { - connection->send( shared_ptr( new AwardStatPacket(stat->id, 100) ) ); - count -= 100; - } connection->send( shared_ptr( new AwardStatPacket(stat->id, count) ) ); #else connection->send( shared_ptr( new AwardStatPacket(stat->id, param) ) ); // byteArray deleted in AwardStatPacket destructor. #endif - } + } else delete [] param.data; } void ServerPlayer::disconnect() { - if (riding != NULL) ride(riding); - if (rider.lock() != NULL) rider.lock()->ride(shared_from_this() ); - if (this->m_isSleeping) + if (rider.lock() != NULL) rider.lock()->ride(shared_from_this() ); + if (m_isSleeping) { - stopSleepInBed(true, false, false); - } + stopSleepInBed(true, false, false); + } } void ServerPlayer::resetSentInfo() @@ -1208,6 +1348,16 @@ void ServerPlayer::displayClientMessage(int messageId) } } break; + case IDS_MAX_BATS_SPAWNED: + for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) + { + shared_ptr player = server->getPlayers()->players[i]; + if(shared_from_this()==player) + { + player->connection->send(shared_ptr( new ChatPacket(name, ChatPacket::e_ChatPlayerMaxBats))); + } + } + break; case IDS_MAX_WOLVES_SPAWNED: for (unsigned int i = 0; i < server->getPlayers()->players.size(); i++) { @@ -1341,9 +1491,9 @@ void ServerPlayer::displayClientMessage(int messageId) break; } - //Language *language = Language::getInstance(); - //wstring languageString = app.GetString(messageId);//language->getElement(messageId); - //connection->send( shared_ptr( new ChatPacket(L"", messageType) ) ); + //Language *language = Language::getInstance(); + //wstring languageString = app.GetString(messageId);//language->getElement(messageId); + //connection->send( shared_ptr( new ChatPacket(L"", messageType) ) ); } void ServerPlayer::completeUsingItem() @@ -1378,9 +1528,9 @@ void ServerPlayer::onEffectAdded(MobEffectInstance *effect) } -void ServerPlayer::onEffectUpdated(MobEffectInstance *effect) +void ServerPlayer::onEffectUpdated(MobEffectInstance *effect, bool doRefreshAttributes) { - Player::onEffectUpdated(effect); + Player::onEffectUpdated(effect, doRefreshAttributes); connection->send(shared_ptr( new UpdateMobEffectPacket(entityId, effect) ) ); } @@ -1431,6 +1581,13 @@ void ServerPlayer::sendMessage(const wstring& message, ChatPacket::EChatPacketMe bool ServerPlayer::hasPermission(EGameCommand command) { return server->getPlayers()->isOp(dynamic_pointer_cast(shared_from_this())); + + // 4J: Removed permission level + /*if( server->getPlayers()->isOp(dynamic_pointer_cast(shared_from_this())) ) + { + return server->getOperatorUserPermissionLevel() >= permissionLevel; + } + return false;*/ } // 4J - Don't use @@ -1473,6 +1630,16 @@ int ServerPlayer::getViewDistance() // return chatVisibility; //} +Pos *ServerPlayer::getCommandSenderWorldPosition() +{ + return new Pos(Mth::floor(x), Mth::floor(y + .5), Mth::floor(z)); +} + +void ServerPlayer::resetLastActionTime() +{ + this->lastActionTime = MinecraftServer::getCurrentTimeMillis(); +} + // Get an index that can be used to uniquely reference this chunk from either dimension int ServerPlayer::getFlagIndexForChunk(const ChunkPos& pos, int dimension) { diff --git a/Minecraft.Client/ServerPlayer.h b/Minecraft.Client/ServerPlayer.h index a9b37594..57ea8947 100644 --- a/Minecraft.Client/ServerPlayer.h +++ b/Minecraft.Client/ServerPlayer.h @@ -10,6 +10,10 @@ class Stat; class TileEntity; class Entity; class BrewingStandTileEntity; +class HopperTileEntity; +class MinecartHopper; +class BeaconTileEntity; +class EntityHorse; class Merchant; using namespace std; @@ -18,24 +22,26 @@ class ServerPlayer : public Player, public net_minecraft_world_inventory::Contai public: eINSTANCEOF GetType() { return eTYPE_SERVERPLAYER; } shared_ptr connection; - MinecraftServer *server; - ServerPlayerGameMode *gameMode; - double lastMoveX, lastMoveZ; - list chunksToSend; + MinecraftServer *server; + ServerPlayerGameMode *gameMode; + double lastMoveX, lastMoveZ; + list chunksToSend; vector entitiesToRemove; - unordered_set seenChunks; - int spewTimer; + unordered_set seenChunks; + int spewTimer; // 4J-Added, for 'Adventure Time' achievement. Biome *currentBiome; private: - int lastSentHealth; + float lastRecordedHealthAndAbsorption; + float lastSentHealth; int lastSentFood; bool lastFoodSaturationZero; int lastSentExp; - int invulnerableTime; + int invulnerableTime; int viewDistance; + __int64 lastActionTime; int lastBrupSendTickCount; // 4J Added public: @@ -45,39 +51,34 @@ public: virtual void readAdditionalSaveData(CompoundTag *entityTag); virtual void addAdditonalSaveData(CompoundTag *entityTag); - virtual void withdrawExperienceLevels(int amount); - void initMenu(); + virtual void giveExperienceLevels(int amount); + void initMenu(); -private: - ItemInstanceArray lastCarried; - -public: - virtual ItemInstanceArray getEquipmentSlots(); protected: virtual void setDefaultHeadHeight(); public: virtual float getHeadHeight(); - virtual void tick(); + virtual void tick(); void flushEntitiesToRemove(); - virtual shared_ptr getCarried(int slot); - virtual void die(DamageSource *source); - virtual bool hurt(DamageSource *dmgSource, int dmg); - virtual bool isPlayerVersusPlayer(); - void doTick(bool sendChunks, bool dontDelayChunks = false, bool ignorePortal = false); + virtual shared_ptr getCarried(int slot); + virtual void die(DamageSource *source); + virtual bool hurt(DamageSource *dmgSource, float dmg); + virtual bool canHarmPlayer(shared_ptr target); + bool canHarmPlayer(wstring targetName); // 4J: Added + void doTick(bool sendChunks, bool dontDelayChunks = false, bool ignorePortal = false); void doTickA(); void doChunkSendingTick(bool dontDelayChunks); - void doTickB(bool ignorePortal); + void doTickB(); virtual void changeDimension(int i); private: void broadcast(shared_ptr te, bool delay = false); public: - virtual void take(shared_ptr e, int orgCount); - virtual void swing(); + virtual void take(shared_ptr e, int orgCount); virtual BedSleepingResult startSleepInBed(int x, int y, int z, bool bTestUse = false); public: virtual void stopSleepInBed(bool forcefulWakeUp, bool updateLevelList, bool saveRespawnPoint); - virtual void ride(shared_ptr e); + virtual void ride(shared_ptr e); protected: virtual void checkFallDamage(double ya, bool onGround); public: @@ -94,28 +95,34 @@ private: void nextContainerCounter(); public: + virtual void openTextEdit(shared_ptr sign); virtual bool startCrafting(int x, int y, int z); // 4J added bool return - virtual bool startEnchanting(int x, int y, int z); // 4J added bool return + virtual bool openFireworks(int x, int y, int z); // 4J added + virtual bool startEnchanting(int x, int y, int z, const wstring &name); // 4J added bool return virtual bool startRepairing(int x, int y, int z); // 4J added bool return - virtual bool openContainer(shared_ptr container); // 4J added bool return - virtual bool openFurnace(shared_ptr furnace); // 4J added bool return - virtual bool openTrap(shared_ptr trap); // 4J added bool return + virtual bool openContainer(shared_ptr container); // 4J added bool return + virtual bool openHopper(shared_ptr container); + virtual bool openHopper(shared_ptr container); + virtual bool openFurnace(shared_ptr furnace); // 4J added bool return + virtual bool openTrap(shared_ptr trap); // 4J added bool return virtual bool openBrewingStand(shared_ptr brewingStand); // 4J added bool return - virtual bool openTrading(shared_ptr traderTarget); // 4J added bool return - virtual void slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item); - void refreshContainer(AbstractContainerMenu *menu); - virtual void refreshContainer(AbstractContainerMenu *container, vector > *items); - virtual void setContainerData(AbstractContainerMenu *container, int id, int value); - virtual void closeContainer(); - void broadcastCarriedItem(); - void doCloseContainer(); - void setPlayerInput(float xa, float ya, bool jumping, bool sneaking, float xRot, float yRot); + virtual bool openBeacon(shared_ptr beacon); + virtual bool openTrading(shared_ptr traderTarget, const wstring &name); // 4J added bool return + virtual bool openHorseInventory(shared_ptr horse, shared_ptr container); + virtual void slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item); + void refreshContainer(AbstractContainerMenu *menu); + virtual void refreshContainer(AbstractContainerMenu *container, vector > *items); + virtual void setContainerData(AbstractContainerMenu *container, int id, int value); + virtual void closeContainer(); + void broadcastCarriedItem(); + void doCloseContainer(); + void setPlayerInput(float xa, float ya, bool jumping, bool sneaking); virtual void awardStat(Stat *stat, byteArray param); void disconnect(); - void resetSentInfo(); - virtual void displayClientMessage(int messageId); + void resetSentInfo(); + virtual void displayClientMessage(int messageId); protected: virtual void completeUsingItem(); @@ -126,24 +133,26 @@ public: protected: virtual void onEffectAdded(MobEffectInstance *effect); - virtual void onEffectUpdated(MobEffectInstance *effect); + virtual void onEffectUpdated(MobEffectInstance *effect, bool doRefreshAttributes); virtual void onEffectRemoved(MobEffectInstance *effect); public: virtual void teleportTo(double x, double y, double z); - virtual void crit(shared_ptr entity); - virtual void magicCrit(shared_ptr entity); + virtual void crit(shared_ptr entity); + virtual void magicCrit(shared_ptr entity); void onUpdateAbilities(); ServerLevel *getLevel(); void setGameMode(GameType *mode); void sendMessage(const wstring& message, ChatPacket::EChatPacketMessage type = ChatPacket::e_ChatCustom, int customData = -1, const wstring& additionalMessage = L""); bool hasPermission(EGameCommand command); - // 4J - Don't use - //void updateOptions(shared_ptr packet); + // bool hasPermission(int permissionLevel, EGameCommand command); + //void updateOptions(shared_ptr packet); // 4J: Don't use int getViewDistance(); //bool canChatInColor(); //int getChatVisibility(); + Pos *getCommandSenderWorldPosition(); + void resetLastActionTime(); public: diff --git a/Minecraft.Client/ServerPlayerGameMode.cpp b/Minecraft.Client/ServerPlayerGameMode.cpp index 9b31df0d..2e6bca35 100644 --- a/Minecraft.Client/ServerPlayerGameMode.cpp +++ b/Minecraft.Client/ServerPlayerGameMode.cpp @@ -17,12 +17,12 @@ ServerPlayerGameMode::ServerPlayerGameMode(Level *level) { // 4J - added initialisers isDestroyingBlock = false; - destroyProgressStart = 0; - xDestroyBlock = yDestroyBlock = zDestroyBlock = 0; - gameTicks = 0; - hasDelayedDestroy = false; - delayedDestroyX = delayedDestroyY = delayedDestroyZ = 0; - delayedTickStart = 0; + destroyProgressStart = 0; + xDestroyBlock = yDestroyBlock = zDestroyBlock = 0; + gameTicks = 0; + hasDelayedDestroy = false; + delayedDestroyX = delayedDestroyY = delayedDestroyZ = 0; + delayedTickStart = 0; lastSentState = -1; gameModeForPlayer = GameType::NOT_SET; @@ -72,12 +72,12 @@ void ServerPlayerGameMode::updateGameMode(GameType *gameType) void ServerPlayerGameMode::tick() { - gameTicks++; + gameTicks++; - if (hasDelayedDestroy) + if (hasDelayedDestroy) { - int ticksSpentDestroying = gameTicks - delayedTickStart; - int t = level->getTile(delayedDestroyX, delayedDestroyY, delayedDestroyZ); + int ticksSpentDestroying = gameTicks - delayedTickStart; + int t = level->getTile(delayedDestroyX, delayedDestroyY, delayedDestroyZ); if (t == 0) { hasDelayedDestroy = false; @@ -130,9 +130,12 @@ void ServerPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) { if(!player->isAllowedToMine()) return; - if (gameModeForPlayer->isReadOnly()) + if (gameModeForPlayer->isAdventureRestricted()) { - return; + if (!player->mayDestroyBlockAt(x, y, z)) + { + return; + } } if (isCreative()) @@ -144,62 +147,62 @@ void ServerPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) return; } level->extinguishFire(player, x, y, z, face); - destroyProgressStart = gameTicks; + destroyProgressStart = gameTicks; float progress = 1.0f; - int t = level->getTile(x, y, z); - if (t > 0) + int t = level->getTile(x, y, z); + if (t > 0) { Tile::tiles[t]->attack(level, x, y, z, player); progress = Tile::tiles[t]->getDestroyProgress(player, player->level, x, y, z); } - if (t > 0 && (progress >= 1 || (app.DebugSettingsOn() && (player->GetDebugOptions()&(1L< 0 && (progress >= 1 ) ) //|| (app.DebugSettingsOn() && (player->GetDebugOptions()&(1L<destroyTileProgress(player->entityId, x, y, z, state); lastSentState = state; - } + } } void ServerPlayerGameMode::stopDestroyBlock(int x, int y, int z) { - if (x == xDestroyBlock && y == yDestroyBlock && z == zDestroyBlock) + if (x == xDestroyBlock && y == yDestroyBlock && z == zDestroyBlock) { -// int ticksSpentDestroying = gameTicks - destroyProgressStart; + // int ticksSpentDestroying = gameTicks - destroyProgressStart; - int t = level->getTile(x, y, z); - if (t != 0) + int t = level->getTile(x, y, z); + if (t != 0) { - Tile *tile = Tile::tiles[t]; + Tile *tile = Tile::tiles[t]; // MGH - removed checking for the destroy progress here, it has already been checked on the client before it sent the packet. // fixes issues with this failing to destroy because of packets bunching up -// float destroyProgress = tile->getDestroyProgress(player, player->level, x, y, z) * (ticksSpentDestroying + 1); -// if (destroyProgress >= .7f || bIgnoreDestroyProgress) + // float destroyProgress = tile->getDestroyProgress(player, player->level, x, y, z) * (ticksSpentDestroying + 1); + // if (destroyProgress >= .7f || bIgnoreDestroyProgress) { isDestroyingBlock = false; level->destroyTileProgress(player->entityId, x, y, z, -1); - destroyBlock(x, y, z); - } -// else if (!hasDelayedDestroy) -// { -// isDestroyingBlock = false; -// hasDelayedDestroy = true; -// delayedDestroyX = x; -// delayedDestroyY = y; -// delayedDestroyZ = z; -// delayedTickStart = destroyProgressStart; -// } - } - } + destroyBlock(x, y, z); + } + // else if (!hasDelayedDestroy) + // { + // isDestroyingBlock = false; + // hasDelayedDestroy = true; + // delayedDestroyX = x; + // delayedDestroyY = y; + // delayedDestroyZ = z; + // delayedTickStart = destroyProgressStart; + // } + } + } } void ServerPlayerGameMode::abortDestroyBlock(int x, int y, int z) @@ -210,34 +213,45 @@ void ServerPlayerGameMode::abortDestroyBlock(int x, int y, int z) bool ServerPlayerGameMode::superDestroyBlock(int x, int y, int z) { - Tile *oldTile = Tile::tiles[level->getTile(x, y, z)]; - int data = level->getData(x, y, z); + Tile *oldTile = Tile::tiles[level->getTile(x, y, z)]; + int data = level->getData(x, y, z); if (oldTile != NULL) { oldTile->playerWillDestroy(level, x, y, z, data, player); } - bool changed = level->setTile(x, y, z, 0); - if (oldTile != NULL && changed) + bool changed = level->removeTile(x, y, z); + if (oldTile != NULL && changed) { - oldTile->destroy(level, x, y, z, data); - } - return changed; + oldTile->destroy(level, x, y, z, data); + } + return changed; } bool ServerPlayerGameMode::destroyBlock(int x, int y, int z) { - if (gameModeForPlayer->isReadOnly()) + if (gameModeForPlayer->isAdventureRestricted()) + { + if (!player->mayDestroyBlockAt(x, y, z)) + { + return false; + } + } + + if (gameModeForPlayer->isCreative()) { - return false; + if (player->getCarriedItem() != NULL && dynamic_cast(player->getCarriedItem()->getItem()) != NULL) + { + return false; + } } - int t = level->getTile(x, y, z); - int data = level->getData(x, y, z); - - level->levelEvent(player, LevelEvent::PARTICLES_DESTROY_BLOCK, x, y, z, t + (level->getData(x, y, z) << Tile::TILE_NUM_SHIFT)); - + int t = level->getTile(x, y, z); + int data = level->getData(x, y, z); + + level->levelEvent(player, LevelEvent::PARTICLES_DESTROY_BLOCK, x, y, z, t + (level->getData(x, y, z) << Tile::TILE_NUM_SHIFT)); + // 4J - In creative mode, the point where we need to tell the renderer that we are about to destroy a tile via destroyingTileAt is quite complicated. // If the player being told is remote, then we always want the client to do it as it does the final update. If the player being told is local, // then we need to update the renderer Here if we are sharing data between host & client as this is the final point where the original data is still intact. @@ -268,7 +282,7 @@ bool ServerPlayerGameMode::destroyBlock(int x, int y, int z) } } - bool changed = superDestroyBlock(x, y, z); + bool changed = superDestroyBlock(x, y, z); if (isCreative()) { @@ -297,7 +311,7 @@ bool ServerPlayerGameMode::destroyBlock(int x, int y, int z) Tile::tiles[t]->playerDestroy(level, player, x, y, z, data); } } - return changed; + return changed; } @@ -305,24 +319,28 @@ bool ServerPlayerGameMode::useItem(shared_ptr player, Level *level, shar { if(!player->isAllowedToUse(item)) return false; - int oldCount = item->count; + int oldCount = item->count; int oldAux = item->getAuxValue(); - shared_ptr itemInstance = item->use(level, player); - if ((itemInstance != NULL && itemInstance != item) || (itemInstance != NULL && itemInstance->count != oldCount) || (itemInstance != NULL && itemInstance->getUseDuration() > 0)) + shared_ptr itemInstance = item->use(level, player); + if (itemInstance != item || (itemInstance != NULL && (itemInstance->count != oldCount || itemInstance->getUseDuration() > 0 || itemInstance->getAuxValue() != oldAux))) { - player->inventory->items[player->inventory->selected] = itemInstance; + player->inventory->items[player->inventory->selected] = itemInstance; if (isCreative()) { itemInstance->count = oldCount; - itemInstance->setAuxValue(oldAux); + if (itemInstance->isDamageableItem()) itemInstance->setAuxValue(oldAux); + } + if (itemInstance->count == 0) + { + player->inventory->items[player->inventory->selected] = nullptr; } - if (itemInstance->count == 0) + if (!player->isUsingItem()) { - player->inventory->items[player->inventory->selected] = nullptr; - } - return true; - } - return false; + dynamic_pointer_cast(player)->refreshContainer(player->inventoryMenu); + } + return true; + } + return false; } @@ -330,23 +348,26 @@ bool ServerPlayerGameMode::useItemOn(shared_ptr player, Level *level, sh { // 4J-PB - Adding a test only version to allow tooltips to be displayed int t = level->getTile(x, y, z); - if (t > 0 && player->isAllowedToUse(Tile::tiles[t])) + if (!player->isSneaking() || player->getCarriedItem() == NULL) { - if(bTestUseOnOnly) - { - if (Tile::tiles[t]->TestUse()) return true; - } - else + if (t > 0 && player->isAllowedToUse(Tile::tiles[t])) { - if (Tile::tiles[t]->use(level, x, y, z, player, face, clickX, clickY, clickZ)) + if(bTestUseOnOnly) + { + if (Tile::tiles[t]->TestUse()) return true; + } + else { - if(m_gameRules != NULL) m_gameRules->onUseTile(t,x,y,z); - return true; + if (Tile::tiles[t]->use(level, x, y, z, player, face, clickX, clickY, clickZ)) + { + if(m_gameRules != NULL) m_gameRules->onUseTile(t,x,y,z); + return true; + } } } } - - if (item == NULL || !player->isAllowedToUse(item)) return false; + + if (item == NULL || !player->isAllowedToUse(item)) return false; if (isCreative()) { int aux = item->getAuxValue(); diff --git a/Minecraft.Client/ServerScoreboard.cpp b/Minecraft.Client/ServerScoreboard.cpp new file mode 100644 index 00000000..738a29c9 --- /dev/null +++ b/Minecraft.Client/ServerScoreboard.cpp @@ -0,0 +1,231 @@ +#include "stdafx.h" + +#include "ServerScoreboard.h" + +ServerScoreboard::ServerScoreboard(MinecraftServer *server) +{ + this->server = server; +} + +MinecraftServer *ServerScoreboard::getServer() +{ + return server; +} + +void ServerScoreboard::onScoreChanged(Score *score) +{ + //Scoreboard::onScoreChanged(score); + + //if (trackedObjectives.contains(score.getObjective())) + //{ + // server->getPlayers()->broadcastAll( shared_ptr( new SetScorePacket(score, SetScorePacket::METHOD_CHANGE))); + //} + + //setDirty(); +} + +void ServerScoreboard::onPlayerRemoved(const wstring &player) +{ + //Scoreboard::onPlayerRemoved(player); + //server->getPlayers()->broadcastAll( shared_ptr( new SetScorePacket(player))); + //setDirty(); +} + +void ServerScoreboard::setDisplayObjective(int slot, Objective *objective) +{ + //Objective *old = getDisplayObjective(slot); + + //Scoreboard::setDisplayObjective(slot, objective); + + //if (old != objective && old != NULL) + //{ + // if (getObjectiveDisplaySlotCount(old) > 0) + // { + // server->getPlayers()->broadcastAll( shared_ptr( new SetDisplayObjectivePacket(slot, objective))); + // } + // else + // { + // stopTrackingObjective(old); + // } + //} + + //if (objective != NULL) + //{ + // if (trackedObjectives.contains(objective)) + // { + // server->getPlayers()->broadcastAll( shared_ptr( new SetDisplayObjectivePacket(slot, objective))); + // } + // else + // { + // startTrackingObjective(objective); + // } + //} + + //setDirty(); +} + +void ServerScoreboard::addPlayerToTeam(const wstring &player, PlayerTeam *team) +{ + //Scoreboard::addPlayerToTeam(player, team); + + //server->getPlayers()->broadcastAll( shared_ptr( new SetPlayerTeamPacket(team, Arrays::asList(player), SetPlayerTeamPacket::METHOD_JOIN))); + + //setDirty(); +} + +void ServerScoreboard::removePlayerFromTeam(const wstring &player, PlayerTeam *team) +{ + //Scoreboard::removePlayerFromTeam(player, team); + + //server->getPlayers()->broadcastAll( shared_ptr( new SetPlayerTeamPacket(team, Arrays::asList(player), SetPlayerTeamPacket::METHOD_LEAVE))); + + //setDirty(); +} + +void ServerScoreboard::onObjectiveAdded(Objective *objective) +{ + //Scoreboard::onObjectiveAdded(objective); + //setDirty(); +} + +void ServerScoreboard::onObjectiveChanged(Objective *objective) +{ + //Scoreaboard::onObjectiveChanged(objective); + + //if (trackedObjectives.contains(objective)) + //{ + // server->getPlayers()->broadcastAll( shared_ptr( new SetObjectivePacket(objective, SetObjectivePacket::METHOD_CHANGE))); + //} + + //setDirty(); +} + +void ServerScoreboard::onObjectiveRemoved(Objective *objective) +{ + //Scoreboard::onObjectiveRemoved(objective); + + //if (trackedObjectives.contains(objective)) + //{ + // stopTrackingObjective(objective); + //} + + //setDirty(); +} + +void ServerScoreboard::onTeamAdded(PlayerTeam *team) +{ + //Scoreboard::onTeamAdded(team); + + //server->getPlayers()->broadcastAll( shared_ptr( new SetPlayerTeamPacket(team, SetPlayerTeamPacket::METHOD_ADD)) ); + + //setDirty(); +} + +void ServerScoreboard::onTeamChanged(PlayerTeam *team) +{ + //Scoreboard::onTeamChanged(team); + + //server->getPlayers()->broadcastAll( shared_ptr( new SetPlayerTeamPacket(team, SetPlayerTeamPacket::METHOD_CHANGE))); + + //setDirty(); +} + +void ServerScoreboard::onTeamRemoved(PlayerTeam *team) +{ + //Scoreboard::onTeamRemoved(team); + + //server->getPlayers()->broadcastAll( shared_ptr( new SetPlayerTeamPacket(team, SetPlayerTeamPacket::METHOD_REMOVE)) ); + + //setDirty(); +} + +void ServerScoreboard::setSaveData(ScoreboardSaveData *data) +{ + //saveData = data; +} + +void ServerScoreboard::setDirty() +{ + //if (saveData != NULL) + //{ + // saveData->setDirty(); + //} +} + +vector > *ServerScoreboard::getStartTrackingPackets(Objective *objective) +{ + return NULL; + + //vector > *packets = new vector >(); + //packets.push_back( shared_ptr( new SetObjectivePacket(objective, SetObjectivePacket::METHOD_ADD))); + + //for (int slot = 0; slot < DISPLAY_SLOTS; slot++) + //{ + // if (getDisplayObjective(slot) == objective) packets.push_back( shared_ptr( new SetDisplayObjectivePacket(slot, objective))); + //} + + //for (Score score : getPlayerScores(objective)) + //{ + // packets.push_back( shared_ptr( new SetScorePacket(score, SetScorePacket::METHOD_CHANGE))); + //} + + //return packets; +} + +void ServerScoreboard::startTrackingObjective(Objective *objective) +{ + //vector > *packets = getStartTrackingPackets(objective); + + //for (ServerPlayer player : server.getPlayers().players) + //{ + // for (Packet packet : packets) + // { + // player.connection.send(packet); + // } + //} + + //trackedObjectives.push_back(objective); +} + +vector > *ServerScoreboard::getStopTrackingPackets(Objective *objective) +{ + return NULL; + + //vector > *packets = new ArrayList(); + //packets->push_back( shared_ptr > *packets = getStopTrackingPackets(objective); + + //for (ServerPlayer player : server.getPlayers().players) + //{ + // for (Packet packet : packets) + // { + // player->connection->send(packet); + // } + //} + + //trackedObjectives.remove(objective); +} + +int ServerScoreboard::getObjectiveDisplaySlotCount(Objective *objective) +{ + return 0; + //int count = 0; + + //for (int slot = 0; slot < DISPLAY_SLOTS; slot++) + //{ + // if (getDisplayObjective(slot) == objective) count++; + //} + + //return count; +} \ No newline at end of file diff --git a/Minecraft.Client/ServerScoreboard.h b/Minecraft.Client/ServerScoreboard.h new file mode 100644 index 00000000..6de7f88d --- /dev/null +++ b/Minecraft.Client/ServerScoreboard.h @@ -0,0 +1,44 @@ +#pragma once + +#include "..\Minecraft.World\Scoreboard.h" + +class MinecraftServer; +class ScoreboardSaveData; +class Score; +class Objective; +class PlayerTeam; + +class ServerScoreboard : public Scoreboard +{ +private: + MinecraftServer *server; + unordered_set trackedObjectives; + ScoreboardSaveData *saveData; + +public: + ServerScoreboard(MinecraftServer *server); + + MinecraftServer *getServer(); + void onScoreChanged(Score *score); + void onPlayerRemoved(const wstring &player); + void setDisplayObjective(int slot, Objective *objective); + void addPlayerToTeam(const wstring &player, PlayerTeam *team); + void removePlayerFromTeam(const wstring &player, PlayerTeam *team); + void onObjectiveAdded(Objective *objective); + void onObjectiveChanged(Objective *objective); + void onObjectiveRemoved(Objective *objective); + void onTeamAdded(PlayerTeam *team); + void onTeamChanged(PlayerTeam *team); + void onTeamRemoved(PlayerTeam *team); + void setSaveData(ScoreboardSaveData *data); + +protected: + void setDirty(); + +public: + vector > *getStartTrackingPackets(Objective *objective); + void startTrackingObjective(Objective *objective); + vector > *getStopTrackingPackets(Objective *objective); + void stopTrackingObjective(Objective *objective); + int getObjectiveDisplaySlotCount(Objective *objective); +}; \ No newline at end of file diff --git a/Minecraft.Client/SheepFurModel.cpp b/Minecraft.Client/SheepFurModel.cpp index bb84e80d..648c5603 100644 --- a/Minecraft.Client/SheepFurModel.cpp +++ b/Minecraft.Client/SheepFurModel.cpp @@ -41,7 +41,7 @@ SheepFurModel::SheepFurModel() : QuadrupedModel(12, 0) leg3->compile(1.0f/16.0f); } -void SheepFurModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +void SheepFurModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { QuadrupedModel::prepareMobModel(mob, time, r, a); @@ -50,8 +50,8 @@ void SheepFurModel::prepareMobModel(shared_ptr mob, float time, float r, fl headXRot = sheep->getHeadEatAngleScale(a); } -void SheepFurModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void SheepFurModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - QuadrupedModel::setupAnim(time, r, bob, yRot, xRot, scale); + QuadrupedModel::setupAnim(time, r, bob, yRot, xRot, scale, entity); head->xRot = headXRot; } \ No newline at end of file diff --git a/Minecraft.Client/SheepFurModel.h b/Minecraft.Client/SheepFurModel.h index c614765e..a30f923a 100644 --- a/Minecraft.Client/SheepFurModel.h +++ b/Minecraft.Client/SheepFurModel.h @@ -1,6 +1,8 @@ #pragma once #include "QuadrupedModel.h" +class LivingEntity; + class SheepFurModel : public QuadrupedModel { private: @@ -8,6 +10,6 @@ private: public: SheepFurModel(); - virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SheepModel.cpp b/Minecraft.Client/SheepModel.cpp index 7d093353..66944604 100644 --- a/Minecraft.Client/SheepModel.cpp +++ b/Minecraft.Client/SheepModel.cpp @@ -20,7 +20,7 @@ SheepModel::SheepModel() : QuadrupedModel(12, 0) body->compile(1.0f/16.0f); } -void SheepModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +void SheepModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { QuadrupedModel::prepareMobModel(mob, time, r, a); @@ -29,9 +29,9 @@ void SheepModel::prepareMobModel(shared_ptr mob, float time, float r, float headXRot = sheep->getHeadEatAngleScale(a); } -void SheepModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void SheepModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - QuadrupedModel::setupAnim(time, r, bob, yRot, xRot, scale); + QuadrupedModel::setupAnim(time, r, bob, yRot, xRot, scale, entity); head->xRot = headXRot; } \ No newline at end of file diff --git a/Minecraft.Client/SheepModel.h b/Minecraft.Client/SheepModel.h index d4136c25..6af72ca9 100644 --- a/Minecraft.Client/SheepModel.h +++ b/Minecraft.Client/SheepModel.h @@ -8,6 +8,6 @@ private: public: SheepModel(); - virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SheepRenderer.cpp b/Minecraft.Client/SheepRenderer.cpp index 4af155d3..5a3580bc 100644 --- a/Minecraft.Client/SheepRenderer.cpp +++ b/Minecraft.Client/SheepRenderer.cpp @@ -3,12 +3,15 @@ #include "MultiPlayerLocalPlayer.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +ResourceLocation SheepRenderer::SHEEP_LOCATION = ResourceLocation(TN_MOB_SHEEP); +ResourceLocation SheepRenderer::SHEEP_FUR_LOCATION = ResourceLocation(TN_MOB_SHEEP_FUR); + SheepRenderer::SheepRenderer(Model *model, Model *armor, float shadow) : MobRenderer(model, shadow) { setArmor(armor); } -int SheepRenderer::prepareArmor(shared_ptr _sheep, int layer, float a) +int SheepRenderer::prepareArmor(shared_ptr _sheep, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr sheep = dynamic_pointer_cast(_sheep); @@ -17,8 +20,28 @@ int SheepRenderer::prepareArmor(shared_ptr _sheep, int layer, float a) !sheep->isInvisibleTo(Minecraft::GetInstance()->player)) // 4J-JEV: Todo, merge with java fix (for invisible sheep armour) in '1.7.5'. { MemSect(31); - bindTexture(TN_MOB_SHEEP_FUR); // 4J was L"/mob/sheep_fur.png" + bindTexture(&SHEEP_FUR_LOCATION); MemSect(0); + + if (sheep->hasCustomName() && sheep->getCustomName().compare(L"jeb_") == 0) + { + // easter egg... + int colorDuration = 25; + int value = (sheep->tickCount / colorDuration) + sheep->entityId; + int c1 = value % Sheep::COLOR_LENGTH; + int c2 = (value + 1) % Sheep::COLOR_LENGTH; + float subStep = ((sheep->tickCount % colorDuration) + a) / (float) colorDuration; + + glColor3f(Sheep::COLOR[c1][0] * (1.0f - subStep) + Sheep::COLOR[c2][0] * subStep, Sheep::COLOR[c1][1] * (1.0f - subStep) + Sheep::COLOR[c2][1] * subStep, Sheep::COLOR[c1][2] + * (1.0f - subStep) + Sheep::COLOR[c2][2] * subStep); + } + else + { + int color = sheep->getColor(); + glColor3f(Sheep::COLOR[color][0], Sheep::COLOR[color][1], Sheep::COLOR[color][2]); + } + + // 4J - change brought forward from 1.8.2 float brightness = SharedConstants::TEXTURE_LIGHTING ? 1.0f : sheep->getBrightness(a); int color = sheep->getColor(); @@ -32,3 +55,8 @@ void SheepRenderer::render(shared_ptr mob, double x, double y, double z, { MobRenderer::render(mob, x, y, z, rot, a); } + +ResourceLocation *SheepRenderer::getTextureLocation(shared_ptr mob) +{ + return &SHEEP_LOCATION; +} diff --git a/Minecraft.Client/SheepRenderer.h b/Minecraft.Client/SheepRenderer.h index c0dea04f..14fe2c02 100644 --- a/Minecraft.Client/SheepRenderer.h +++ b/Minecraft.Client/SheepRenderer.h @@ -3,12 +3,17 @@ class SheepRenderer : public MobRenderer { +private: + static ResourceLocation SHEEP_LOCATION; + static ResourceLocation SHEEP_FUR_LOCATION; + public: SheepRenderer(Model *model, Model *armor, float shadow); protected: - virtual int prepareArmor(shared_ptr _sheep, int layer, float a); + virtual int prepareArmor(shared_ptr _sheep, int layer, float a); public: virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/SignRenderer.cpp b/Minecraft.Client/SignRenderer.cpp index 97eff4bd..5f764a92 100644 --- a/Minecraft.Client/SignRenderer.cpp +++ b/Minecraft.Client/SignRenderer.cpp @@ -7,6 +7,7 @@ #include "..\Minecraft.World\Entity.h" #include "..\Minecraft.World\Level.h" +ResourceLocation SignRenderer::SIGN_LOCATION = ResourceLocation(TN_ITEM_SIGN); SignRenderer::SignRenderer() { @@ -45,7 +46,7 @@ void SignRenderer::render(shared_ptr _sign, double x, double y, doub signModel->cube2->visible = false; } - bindTexture(TN_ITEM_SIGN); // 4J was L"/item/sign.png" + bindTexture(&SIGN_LOCATION); // 4J was L"/item/sign.png" glPushMatrix(); glScalef(size, -size, -size); diff --git a/Minecraft.Client/SignRenderer.h b/Minecraft.Client/SignRenderer.h index 48d4d954..a95577bc 100644 --- a/Minecraft.Client/SignRenderer.h +++ b/Minecraft.Client/SignRenderer.h @@ -5,6 +5,7 @@ class SignModel; class SignRenderer : public TileEntityRenderer { private: + static ResourceLocation SIGN_LOCATION; SignModel *signModel; public: SignRenderer(); // 4J - added diff --git a/Minecraft.Client/SilverfishModel.cpp b/Minecraft.Client/SilverfishModel.cpp index 128a7e79..ce8b8254 100644 --- a/Minecraft.Client/SilverfishModel.cpp +++ b/Minecraft.Client/SilverfishModel.cpp @@ -84,7 +84,7 @@ int SilverfishModel::modelVersion() void SilverfishModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); for (unsigned int i = 0; i < bodyParts.length; i++) { @@ -96,14 +96,14 @@ void SilverfishModel::render(shared_ptr entity, float time, float r, flo } } -void SilverfishModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void SilverfishModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - for (unsigned int i = 0; i < bodyParts.length; i++) { bodyParts[i]->yRot = Mth::cos(bob * .9f + i * .15f * PI) * PI * .05f * (1 + abs((int)i - 2)); bodyParts[i]->x = Mth::sin(bob * .9f + i * .15f * PI) * PI * .2f * abs((int)i - 2); } + bodyLayers[0]->yRot = bodyParts[2]->yRot; bodyLayers[1]->yRot = bodyParts[4]->yRot; bodyLayers[1]->x = bodyParts[4]->x; diff --git a/Minecraft.Client/SilverfishModel.h b/Minecraft.Client/SilverfishModel.h index d6be3059..5e6384f6 100644 --- a/Minecraft.Client/SilverfishModel.h +++ b/Minecraft.Client/SilverfishModel.h @@ -22,5 +22,5 @@ public: int modelVersion(); void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SilverfishRenderer.cpp b/Minecraft.Client/SilverfishRenderer.cpp index 9ed194ca..a03aaef1 100644 --- a/Minecraft.Client/SilverfishRenderer.cpp +++ b/Minecraft.Client/SilverfishRenderer.cpp @@ -3,11 +3,13 @@ #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "SilverfishModel.h" +ResourceLocation SilverfishRenderer::SILVERFISH_LOCATION(TN_MOB_SILVERFISH); + SilverfishRenderer::SilverfishRenderer() : MobRenderer(new SilverfishModel(), 0.3f) { } -float SilverfishRenderer::getFlipDegrees(shared_ptr spider) +float SilverfishRenderer::getFlipDegrees(shared_ptr spider) { return 180; } @@ -17,7 +19,12 @@ void SilverfishRenderer::render(shared_ptr _mob, double x, double y, dou MobRenderer::render(_mob, x, y, z, rot, a); } -int SilverfishRenderer::prepareArmor(shared_ptr _silverfish, int layer, float a) +ResourceLocation *SilverfishRenderer::getTextureLocation(shared_ptr mob) +{ + return &SILVERFISH_LOCATION; +} + +int SilverfishRenderer::prepareArmor(shared_ptr _silverfish, int layer, float a) { return -1; } \ No newline at end of file diff --git a/Minecraft.Client/SilverfishRenderer.h b/Minecraft.Client/SilverfishRenderer.h index c1df4505..23c899bb 100644 --- a/Minecraft.Client/SilverfishRenderer.h +++ b/Minecraft.Client/SilverfishRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "MobRenderer.h" class Silverfish; @@ -8,16 +7,18 @@ class SilverfishRenderer : public MobRenderer { private: //int modelVersion; + static ResourceLocation SILVERFISH_LOCATION; public: SilverfishRenderer(); protected: - float getFlipDegrees(shared_ptr spider); + float getFlipDegrees(shared_ptr spider); public: - void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: - int prepareArmor(shared_ptr _silverfish, int layer, float a); + virtual int prepareArmor(shared_ptr _silverfish, int layer, float a); }; diff --git a/Minecraft.Client/SimpleIcon.cpp b/Minecraft.Client/SimpleIcon.cpp index ffd7b215..1054315d 100644 --- a/Minecraft.Client/SimpleIcon.cpp +++ b/Minecraft.Client/SimpleIcon.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "SimpleIcon.h" -SimpleIcon::SimpleIcon(const wstring &name, float U0, float V0, float U1, float V1) : StitchedTexture(name) +SimpleIcon::SimpleIcon(const wstring &name, const wstring &filename, float U0, float V0, float U1, float V1) : StitchedTexture(name, filename) { u0 = U0; u1 = U1; diff --git a/Minecraft.Client/SimpleIcon.h b/Minecraft.Client/SimpleIcon.h index 93aec62c..2c9172f5 100644 --- a/Minecraft.Client/SimpleIcon.h +++ b/Minecraft.Client/SimpleIcon.h @@ -7,5 +7,5 @@ using namespace std; class SimpleIcon : public StitchedTexture { public: - SimpleIcon(const wstring &name, float u0, float v0, float u1, float v1); + SimpleIcon(const wstring &name, const wstring &filename, float u0, float v0, float u1, float v1); }; \ No newline at end of file diff --git a/Minecraft.Client/SkeletonHeadModel.cpp b/Minecraft.Client/SkeletonHeadModel.cpp index 340047fe..8e126d66 100644 --- a/Minecraft.Client/SkeletonHeadModel.cpp +++ b/Minecraft.Client/SkeletonHeadModel.cpp @@ -29,14 +29,14 @@ SkeletonHeadModel::SkeletonHeadModel(int u, int v, int tw, int th) void SkeletonHeadModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); head->render(scale,usecompiled); } -void SkeletonHeadModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void SkeletonHeadModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - Model::setupAnim(time, r, bob, yRot, xRot, scale, uiBitmaskOverrideAnim); + Model::setupAnim(time, r, bob, yRot, xRot, scale, entity, uiBitmaskOverrideAnim); head->yRot = yRot / (180 / PI); head->xRot = xRot / (180 / PI); diff --git a/Minecraft.Client/SkeletonHeadModel.h b/Minecraft.Client/SkeletonHeadModel.h index 6f136c46..f6911dc6 100644 --- a/Minecraft.Client/SkeletonHeadModel.h +++ b/Minecraft.Client/SkeletonHeadModel.h @@ -15,5 +15,5 @@ public: SkeletonHeadModel(int u, int v, int tw, int th); void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SkeletonModel.cpp b/Minecraft.Client/SkeletonModel.cpp index ab4778ee..7cdba9e2 100644 --- a/Minecraft.Client/SkeletonModel.cpp +++ b/Minecraft.Client/SkeletonModel.cpp @@ -1,38 +1,39 @@ #include "stdafx.h" #include "SkeletonModel.h" #include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "ModelPart.h" void SkeletonModel::_init(float g) { - arm0 = new ModelPart(this, 24 + 16, 16); - arm0->addBox(-1, -2, -1, 2, 12, 2, g); // Arm0 - arm0->setPos(-5, 2, 0); + arm0 = new ModelPart(this, 24 + 16, 16); + arm0->addBox(-1, -2, -1, 2, 12, 2, g); // Arm0 + arm0->setPos(-5, 2, 0); - arm1 = new ModelPart(this, 24 + 16, 16); - arm1->bMirror = true; - arm1->addBox(-1, -2, -1, 2, 12, 2, g); // Arm1 - arm1->setPos(5, 2, 0); + arm1 = new ModelPart(this, 24 + 16, 16); + arm1->bMirror = true; + arm1->addBox(-1, -2, -1, 2, 12, 2, g); // Arm1 + arm1->setPos(5, 2, 0); - leg0 = new ModelPart(this, 0, 16); - leg0->addBox(-1, 0, -1, 2, 12, 2, g); // Leg0 - leg0->setPos(-2, 12, 0); + leg0 = new ModelPart(this, 0, 16); + leg0->addBox(-1, 0, -1, 2, 12, 2, g); // Leg0 + leg0->setPos(-2, 12, 0); - leg1 = new ModelPart(this, 0, 16); - leg1->bMirror = true; - leg1->addBox(-1, 0, -1, 2, 12, 2, g); // Leg1 - leg1->setPos(2, 12, 0); + leg1 = new ModelPart(this, 0, 16); + leg1->bMirror = true; + leg1->addBox(-1, 0, -1, 2, 12, 2, g); // Leg1 + leg1->setPos(2, 12, 0); // 4J added - compile now to avoid random performance hit first time cubes are rendered arm0->compile(1.0f/16.0f); - arm1->compile(1.0f/16.0f); + arm1->compile(1.0f/16.0f); leg0->compile(1.0f/16.0f); - leg1->compile(1.0f/16.0f); + leg1->compile(1.0f/16.0f); } SkeletonModel::SkeletonModel() : ZombieModel(0, 0, 64, 32) { - _init(0); + _init(0); } SkeletonModel::SkeletonModel(float g) : ZombieModel(g, 0, 64, 32) @@ -40,8 +41,15 @@ SkeletonModel::SkeletonModel(float g) : ZombieModel(g, 0, 64, 32) _init(g); } -void SkeletonModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void SkeletonModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +{ + ZombieModel::prepareMobModel(mob, time, r, a); + + bowAndArrow = dynamic_pointer_cast(mob)->getSkeletonType() == Skeleton::TYPE_WITHER; +} + +void SkeletonModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { bowAndArrow=true; - ZombieModel::setupAnim(time, r, bob, yRot, xRot, scale, uiBitmaskOverrideAnim); + ZombieModel::setupAnim(time, r, bob, yRot, xRot, scale, entity, uiBitmaskOverrideAnim); } \ No newline at end of file diff --git a/Minecraft.Client/SkeletonModel.h b/Minecraft.Client/SkeletonModel.h index ba5f9449..2a17b35a 100644 --- a/Minecraft.Client/SkeletonModel.h +++ b/Minecraft.Client/SkeletonModel.h @@ -9,5 +9,6 @@ private: public: SkeletonModel(); SkeletonModel(float g); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/SkeletonRenderer.cpp b/Minecraft.Client/SkeletonRenderer.cpp new file mode 100644 index 00000000..56682ddf --- /dev/null +++ b/Minecraft.Client/SkeletonRenderer.cpp @@ -0,0 +1,35 @@ +#include "stdafx.h" +#include "SkeletonRenderer.h" +#include "SkeletonModel.h" +#include "../Minecraft.World/Skeleton.h" + +ResourceLocation SkeletonRenderer::SKELETON_LOCATION = ResourceLocation(TN_MOB_SKELETON); +ResourceLocation SkeletonRenderer::WITHER_SKELETON_LOCATION = ResourceLocation(TN_MOB_WITHER_SKELETON); + +SkeletonRenderer::SkeletonRenderer() : HumanoidMobRenderer(new SkeletonModel(), .5f) +{ +} + +void SkeletonRenderer::scale(shared_ptr mob, float a) +{ + if (dynamic_pointer_cast(mob)->getSkeletonType() == Skeleton::TYPE_WITHER) + { + glScalef(1.2f, 1.2f, 1.2f); + } +} + +void SkeletonRenderer::translateWeaponItem() +{ + glTranslatef(1.5f / 16.0f, 3 / 16.0f, 0); +} + +ResourceLocation *SkeletonRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr skeleton = dynamic_pointer_cast(entity); + + if (skeleton->getSkeletonType() == Skeleton::TYPE_WITHER) + { + return &WITHER_SKELETON_LOCATION; + } + return &SKELETON_LOCATION; +} \ No newline at end of file diff --git a/Minecraft.Client/SkeletonRenderer.h b/Minecraft.Client/SkeletonRenderer.h new file mode 100644 index 00000000..ca996878 --- /dev/null +++ b/Minecraft.Client/SkeletonRenderer.h @@ -0,0 +1,17 @@ +#pragma once +#include "HumanoidMobRenderer.h" + +class SkeletonRenderer : public HumanoidMobRenderer +{ +private: + static ResourceLocation SKELETON_LOCATION; + static ResourceLocation WITHER_SKELETON_LOCATION; + +public: + SkeletonRenderer(); + +protected: + virtual void scale(shared_ptr mob, float a); + void translateWeaponItem(); + virtual ResourceLocation *getTextureLocation(shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/SkiModel.cpp b/Minecraft.Client/SkiModel.cpp new file mode 100644 index 00000000..021b71d1 --- /dev/null +++ b/Minecraft.Client/SkiModel.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "SkiModel.h" + +SkiModel::SkiModel() +{ + _init(false); +} + +SkiModel::SkiModel(bool leftSki) +{ + _init(leftSki); +} + +void SkiModel::_init(bool leftSki) +{ + this->leftSki = leftSki; + texWidth = 32; + texHeight = 64; + int xOffTex = 0; + if (!leftSki) { + xOffTex = 14; + } + + cubes = ModelPartArray(2); + cubes[0] = new ModelPart(this, xOffTex, 0); + cubes[1] = new ModelPart(this, xOffTex, 5); + + cubes[0]->addBox(0.f, 0.f, 0.f, 3, 1, 4, 0); + cubes[0]->setPos(0, 0, 0); + + cubes[1]->addBox(0.f, 0.f, 0.f, 3, 52, 1, 0); + cubes[1]->setPos(0, 0, 0); +} + +void SkiModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + for (int i = 0; i < cubes.length; i++) + { + cubes[i]->render(scale, usecompiled); + } +} + +void SkiModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity) +{ + cubes[0]->y = 24.2f; + cubes[0]->xRot = PI * .5f; + + cubes[1]->y = 24.2f; + cubes[1]->xRot = PI * .5f; + + if (leftSki) + { + cubes[0]->z = -26 - 12 * (cos(time * 0.6662f) * 0.7f) * r; + cubes[1]->z = -26 - 12 * (cos(time * 0.6662f) * 0.7f) * r; + cubes[0]->x = .5f; + cubes[1]->x = .5f; + } + else + { + cubes[0]->z = -26 + 12 * (cos(time * 0.6662f) * 0.7f) * r; + cubes[1]->z = -26 + 12 * (cos(time * 0.6662f) * 0.7f) * r; + cubes[0]->x = -3.5f; + cubes[1]->x = -3.5f; + } +} \ No newline at end of file diff --git a/Minecraft.Client/SkiModel.h b/Minecraft.Client/SkiModel.h new file mode 100644 index 00000000..0a7d879b --- /dev/null +++ b/Minecraft.Client/SkiModel.h @@ -0,0 +1,19 @@ +#pragma once +#include "Model.h" +#include "ModelPart.h" + +class SkiModel : public Model +{ +public: + ModelPartArray cubes; + +private: + bool leftSki; + +public: + SkiModel(); // 4J added + SkiModel(bool leftSki); + void _init(bool leftSki); // 4J added + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/SkullTileRenderer.cpp b/Minecraft.Client/SkullTileRenderer.cpp index 641a7a02..32d216cd 100644 --- a/Minecraft.Client/SkullTileRenderer.cpp +++ b/Minecraft.Client/SkullTileRenderer.cpp @@ -1,12 +1,18 @@ #include "stdafx.h" +#include "SkullTileRenderer.h" +#include "SkeletonHeadModel.h" +#include "PlayerRenderer.h" #include "..\Minecraft.World\SkullTileEntity.h" -#include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "..\Minecraft.World\net.minecraft.h" -#include "SkeletonHeadModel.h" -#include "SkullTileRenderer.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" SkullTileRenderer *SkullTileRenderer::instance = NULL; +ResourceLocation SkullTileRenderer::SKELETON_LOCATION = ResourceLocation(TN_MOB_SKELETON); +ResourceLocation SkullTileRenderer::WITHER_SKELETON_LOCATION = ResourceLocation(TN_MOB_WITHER_SKELETON); +ResourceLocation SkullTileRenderer::ZOMBIE_LOCATION = ResourceLocation(TN_MOB_ZOMBIE); +ResourceLocation SkullTileRenderer::CREEPER_LOCATION = ResourceLocation(TN_MOB_CREEPER); + SkullTileRenderer::SkullTileRenderer() { skeletonModel = new SkeletonHeadModel(0, 0, 64, 32); @@ -38,10 +44,10 @@ void SkullTileRenderer::renderSkull(float x, float y, float z, int face, float r switch (type) { case SkullTileEntity::TYPE_WITHER: - bindTexture(TN_MOB_WITHER_SKELETON); + bindTexture(&WITHER_SKELETON_LOCATION); break; case SkullTileEntity::TYPE_ZOMBIE: - bindTexture(TN_MOB_ZOMBIE); + bindTexture(&ZOMBIE_LOCATION); //model = zombieModel; break; case SkullTileEntity::TYPE_CHAR: @@ -58,15 +64,15 @@ void SkullTileRenderer::renderSkull(float x, float y, float z, int face, float r //} //else { - bindTexture(TN_MOB_CHAR); + bindTexture(&PlayerRenderer::DEFAULT_LOCATION); } break; case SkullTileEntity::TYPE_CREEPER: - bindTexture(TN_MOB_CREEPER); + bindTexture(&CREEPER_LOCATION); break; case SkullTileEntity::TYPE_SKELETON: default: - bindTexture(TN_MOB_SKELETON); + bindTexture(&SKELETON_LOCATION); break; } diff --git a/Minecraft.Client/SkullTileRenderer.h b/Minecraft.Client/SkullTileRenderer.h index 09c83f9d..ea509b8b 100644 --- a/Minecraft.Client/SkullTileRenderer.h +++ b/Minecraft.Client/SkullTileRenderer.h @@ -10,6 +10,11 @@ public: static SkullTileRenderer *instance; private: + static ResourceLocation SKELETON_LOCATION; + static ResourceLocation WITHER_SKELETON_LOCATION; + static ResourceLocation ZOMBIE_LOCATION; + static ResourceLocation CREEPER_LOCATION; + // note: this head fits most mobs, just change texture SkeletonHeadModel *skeletonModel; SkeletonHeadModel *zombieModel; diff --git a/Minecraft.Client/SlimeModel.cpp b/Minecraft.Client/SlimeModel.cpp index 1dafc2fb..834847f8 100644 --- a/Minecraft.Client/SlimeModel.cpp +++ b/Minecraft.Client/SlimeModel.cpp @@ -36,7 +36,7 @@ SlimeModel::SlimeModel(int vOffs) void SlimeModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); cube->render(scale,usecompiled); if (eye0!=NULL) diff --git a/Minecraft.Client/SlimeRenderer.cpp b/Minecraft.Client/SlimeRenderer.cpp index 23c9c16e..f3f64aed 100644 --- a/Minecraft.Client/SlimeRenderer.cpp +++ b/Minecraft.Client/SlimeRenderer.cpp @@ -2,18 +2,22 @@ #include "SlimeRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +ResourceLocation SlimeRenderer::SLIME_LOCATION = ResourceLocation(TN_MOB_SLIME); + SlimeRenderer::SlimeRenderer(Model *model, Model *armor, float shadow) : MobRenderer(model, shadow) { this->armor = armor; } -int SlimeRenderer::prepareArmor(shared_ptr _slime, int layer, float a) +int SlimeRenderer::prepareArmor(shared_ptr _slime, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr slime = dynamic_pointer_cast(_slime); - if (slime->isInvisible()) return 0; - + if (slime->isInvisible()) + { + return 0; + } if (layer == 0) { setArmor(armor); @@ -32,7 +36,7 @@ int SlimeRenderer::prepareArmor(shared_ptr _slime, int layer, float a) return -1; } -void SlimeRenderer::scale(shared_ptr _slime, float a) +void SlimeRenderer::scale(shared_ptr _slime, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr slime = dynamic_pointer_cast(_slime); @@ -41,4 +45,9 @@ void SlimeRenderer::scale(shared_ptr _slime, float a) float ss = (slime->oSquish + (slime->squish - slime->oSquish) * a) / (size * 0.5f + 1); float w = 1 / (ss + 1); glScalef(w * size, 1 / w * size, w * size); +} + +ResourceLocation *SlimeRenderer::getTextureLocation(shared_ptr mob) +{ + return &SLIME_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/SlimeRenderer.h b/Minecraft.Client/SlimeRenderer.h index 58f510aa..acf39075 100644 --- a/Minecraft.Client/SlimeRenderer.h +++ b/Minecraft.Client/SlimeRenderer.h @@ -5,9 +5,13 @@ class SlimeRenderer : public MobRenderer { private: Model *armor; + static ResourceLocation SLIME_LOCATION; + public: SlimeRenderer(Model *model, Model *armor, float shadow); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); + protected: - virtual int prepareArmor(shared_ptr _slime, int layer, float a); - virtual void scale(shared_ptr _slime, float a); + virtual int prepareArmor(shared_ptr _slime, int layer, float a); + virtual void scale(shared_ptr _slime, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/SnowManModel.cpp b/Minecraft.Client/SnowManModel.cpp index 4344a17a..eadbf367 100644 --- a/Minecraft.Client/SnowManModel.cpp +++ b/Minecraft.Client/SnowManModel.cpp @@ -36,9 +36,9 @@ SnowManModel::SnowManModel() : Model() piece2->compile(1.0f/16.0f); } -void SnowManModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void SnowManModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - Model::setupAnim(time, r, bob, yRot, xRot, scale); + Model::setupAnim(time, r, bob, yRot, xRot, scale, entity); head->yRot = yRot / (float) (180 / PI); head->xRot = xRot / (float) (180 / PI); piece1->yRot = (yRot / (float) (180 / PI)) * 0.25f; @@ -60,7 +60,7 @@ void SnowManModel::setupAnim(float time, float r, float bob, float yRot, float x void SnowManModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); piece1->render(scale,usecompiled); piece2->render(scale,usecompiled); diff --git a/Minecraft.Client/SnowManModel.h b/Minecraft.Client/SnowManModel.h index eb31e503..5472764b 100644 --- a/Minecraft.Client/SnowManModel.h +++ b/Minecraft.Client/SnowManModel.h @@ -8,6 +8,6 @@ public: ModelPart *arm1, *arm2; SnowManModel() ; - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; diff --git a/Minecraft.Client/SnowManRenderer.cpp b/Minecraft.Client/SnowManRenderer.cpp index 83edb3f5..1e258f3c 100644 --- a/Minecraft.Client/SnowManRenderer.cpp +++ b/Minecraft.Client/SnowManRenderer.cpp @@ -7,13 +7,15 @@ #include "EntityRenderDispatcher.h" #include "SnowManRenderer.h" +ResourceLocation SnowManRenderer::SNOWMAN_LOCATION = ResourceLocation(TN_MOB_SNOWMAN); + SnowManRenderer::SnowManRenderer() : MobRenderer(new SnowManModel(), 0.5f) { model = (SnowManModel *) MobRenderer::model; this->setArmor(model); } -void SnowManRenderer::additionalRendering(shared_ptr _mob, float a) +void SnowManRenderer::additionalRendering(shared_ptr _mob, float a) { // 4J - original version used generics and thus had an input parameter of type SnowMan rather than shared_ptr we have here - // do some casting around instead @@ -34,8 +36,13 @@ void SnowManRenderer::additionalRendering(shared_ptr _mob, float a) glScalef(s, -s, s); } - this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, headGear, 0); + entityRenderDispatcher->itemInHandRenderer->renderItem(mob, headGear, 0); glPopMatrix(); } +} + +ResourceLocation *SnowManRenderer::getTextureLocation(shared_ptr mob) +{ + return &SNOWMAN_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/SnowManRenderer.h b/Minecraft.Client/SnowManRenderer.h index 9bdecb4d..ee75db63 100644 --- a/Minecraft.Client/SnowManRenderer.h +++ b/Minecraft.Client/SnowManRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "MobRenderer.h" class SnowManModel; @@ -8,10 +7,12 @@ class SnowManRenderer : public MobRenderer { private: SnowManModel *model; + static ResourceLocation SNOWMAN_LOCATION; public: SnowManRenderer(); protected: - virtual void additionalRendering(shared_ptr _mob, float a); + virtual void additionalRendering(shared_ptr _mob, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/SpiderModel.cpp b/Minecraft.Client/SpiderModel.cpp index 35c51d3e..739677e4 100644 --- a/Minecraft.Client/SpiderModel.cpp +++ b/Minecraft.Client/SpiderModel.cpp @@ -70,7 +70,7 @@ SpiderModel::SpiderModel() : Model() void SpiderModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); head->render(scale,usecompiled); body0->render(scale,usecompiled); @@ -85,7 +85,7 @@ void SpiderModel::render(shared_ptr entity, float time, float r, float b leg7->render(scale,usecompiled); } -void SpiderModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void SpiderModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { head->yRot = yRot / (float) (180 / PI); head->xRot = xRot / (float) (180 / PI); diff --git a/Minecraft.Client/SpiderModel.h b/Minecraft.Client/SpiderModel.h index 61666983..767572e3 100644 --- a/Minecraft.Client/SpiderModel.h +++ b/Minecraft.Client/SpiderModel.h @@ -8,5 +8,5 @@ public: SpiderModel(); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); }; \ No newline at end of file diff --git a/Minecraft.Client/SpiderRenderer.cpp b/Minecraft.Client/SpiderRenderer.cpp index 9c31eb9e..617cce90 100644 --- a/Minecraft.Client/SpiderRenderer.cpp +++ b/Minecraft.Client/SpiderRenderer.cpp @@ -3,59 +3,59 @@ #include "SpiderModel.h" #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +ResourceLocation SpiderRenderer::SPIDER_LOCATION = ResourceLocation(TN_MOB_SPIDER); +ResourceLocation SpiderRenderer::SPIDER_EYES_LOCATION = ResourceLocation(TN_MOB_SPIDER_EYES); + SpiderRenderer::SpiderRenderer() : MobRenderer(new SpiderModel(), 1.0f) { this->setArmor(new SpiderModel()); } -float SpiderRenderer::getFlipDegrees(shared_ptr spider) +float SpiderRenderer::getFlipDegrees(shared_ptr spider) { return 180; } -int SpiderRenderer::prepareArmor(shared_ptr _spider, int layer, float a) +int SpiderRenderer::prepareArmor(shared_ptr _spider, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr spider = dynamic_pointer_cast(_spider); - if (layer!=0) return -1; + if (layer!=0) return -1; MemSect(31); - bindTexture(TN_MOB_SPIDER_EYES); // 4J was L"/mob/spider_eyes.png" + bindTexture(&SPIDER_EYES_LOCATION); MemSect(0); // 4J - changes brought forward from 1.8.2 - float br = 1.0f; // was (1-spider->getBrightness(1))*0.5f; - glEnable(GL_BLEND); + float br = 1.0f; // was (1-spider->getBrightness(1))*0.5f; + glEnable(GL_BLEND); // 4J Stu - We probably don't need to do this on 360 either (as we force it back on the renderer) // However we do want it off for other platforms that don't force it on in the render lib CBuff handling // Several texture packs have fully transparent bits that break if this is off #ifdef _XBOX - glDisable(GL_ALPHA_TEST); + glDisable(GL_ALPHA_TEST); #endif // 4J - changes brought forward from 1.8.2 glBlendFunc(GL_ONE, GL_ONE); if (spider->isInvisible()) glDepthMask(false); else glDepthMask(true); - if (SharedConstants::TEXTURE_LIGHTING) + if (SharedConstants::TEXTURE_LIGHTING) { // 4J - was 0xf0f0 but that looks like it is a mistake - maybe meant to be 0xf000f0 to enable both sky & block lighting? choosing 0x00f0 here instead // as most likely replicates what the java game does, without breaking our lighting (which doesn't like UVs out of the 0 to 255 range) - int col = 0x00f0; - int u = col % 65536; - int v = col / 65536; + int col = 0x00f0; + int u = col % 65536; + int v = col / 65536; - glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); - glColor4f(1, 1, 1, 1); - } + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); + } // 4J - this doesn't seem right - surely there should be an else in here? - glColor4f(1, 1, 1, br); - return 1; + glColor4f(1, 1, 1, br); + return 1; } -void SpiderRenderer::scale(shared_ptr _mob, float a) +ResourceLocation *SpiderRenderer::getTextureLocation(shared_ptr mob) { - // 4J - dynamic cast required because we aren't using templates/generics in our version - shared_ptr mob = dynamic_pointer_cast(_mob); - float scale = mob->getModelScale(); - glScalef(scale, scale, scale); + return &SPIDER_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/SpiderRenderer.h b/Minecraft.Client/SpiderRenderer.h index 3b937458..ef4c2d18 100644 --- a/Minecraft.Client/SpiderRenderer.h +++ b/Minecraft.Client/SpiderRenderer.h @@ -3,10 +3,15 @@ class SpiderRenderer : public MobRenderer { +private: + static ResourceLocation SPIDER_LOCATION; + static ResourceLocation SPIDER_EYES_LOCATION; + public: SpiderRenderer(); + protected: - virtual float getFlipDegrees(shared_ptr spider); - virtual int prepareArmor(shared_ptr _spider, int layer, float a); - void scale(shared_ptr _mob, float a); + virtual float getFlipDegrees(shared_ptr spider); + virtual int prepareArmor(shared_ptr _spider, int layer, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/SquidModel.cpp b/Minecraft.Client/SquidModel.cpp index 8ad20f8e..0152418f 100644 --- a/Minecraft.Client/SquidModel.cpp +++ b/Minecraft.Client/SquidModel.cpp @@ -33,7 +33,7 @@ SquidModel::SquidModel() : Model() } -void SquidModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void SquidModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { for (int i = 0; i < TENTACLES_LENGTH; i++) // 4J - 8 was tentacles.length { @@ -45,7 +45,7 @@ void SquidModel::setupAnim(float time, float r, float bob, float yRot, float xRo void SquidModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); body->render(scale, usecompiled); for (int i = 0; i < TENTACLES_LENGTH; i++) // 4J - 8 was tentacles.length // 4J Stu - Was 9 but I made it 8 as the array is [0,8) diff --git a/Minecraft.Client/SquidModel.h b/Minecraft.Client/SquidModel.h index 8f43950f..fba45147 100644 --- a/Minecraft.Client/SquidModel.h +++ b/Minecraft.Client/SquidModel.h @@ -9,6 +9,6 @@ public: ModelPart *tentacles[TENTACLES_LENGTH]; SquidModel(); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim = 0); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/SquidRenderer.cpp b/Minecraft.Client/SquidRenderer.cpp index 135f6d9b..75d14f4e 100644 --- a/Minecraft.Client/SquidRenderer.cpp +++ b/Minecraft.Client/SquidRenderer.cpp @@ -2,6 +2,8 @@ #include "SquidRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +ResourceLocation SquidRenderer::SQUID_LOCATION = ResourceLocation(TN_MOB_SQUID); + SquidRenderer::SquidRenderer(Model *model, float shadow) : MobRenderer(model, shadow) { } @@ -11,7 +13,7 @@ void SquidRenderer::render(shared_ptr mob, double x, double y, double z, MobRenderer::render(mob, x, y, z, rot, a); } -void SquidRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) +void SquidRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -26,10 +28,15 @@ void SquidRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRo glTranslatef(0, -1.2f, 0); } -float SquidRenderer::getBob(shared_ptr _mob, float a) +float SquidRenderer::getBob(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); return mob->oldTentacleAngle + (mob->tentacleAngle - mob->oldTentacleAngle) * a; +} + +ResourceLocation *SquidRenderer::getTextureLocation(shared_ptr mob) +{ + return &SQUID_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/SquidRenderer.h b/Minecraft.Client/SquidRenderer.h index ccc81944..87678443 100644 --- a/Minecraft.Client/SquidRenderer.h +++ b/Minecraft.Client/SquidRenderer.h @@ -3,13 +3,15 @@ class SquidRenderer : public MobRenderer { -public: - SquidRenderer(Model *model, float shadow); +private: + static ResourceLocation SQUID_LOCATION; public: + SquidRenderer(Model *model, float shadow); virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); protected: - virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); - virtual float getBob(shared_ptr _mob, float a); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + virtual float getBob(shared_ptr _mob, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/StatsCounter.cpp b/Minecraft.Client/StatsCounter.cpp index 4568c7db..b75625e9 100644 --- a/Minecraft.Client/StatsCounter.cpp +++ b/Minecraft.Client/StatsCounter.cpp @@ -461,9 +461,9 @@ void StatsCounter::writeStats() scores[viewCount].m_commentData.m_statsType = LeaderboardManager::eStatsType_Mining; scores[viewCount].m_commentData.m_mining.m_dirt = getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Peaceful); - scores[viewCount].m_commentData.m_mining.m_cobblestone = getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Peaceful); + scores[viewCount].m_commentData.m_mining.m_cobblestone = getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Peaceful); scores[viewCount].m_commentData.m_mining.m_sand = getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Peaceful); - scores[viewCount].m_commentData.m_mining.m_stone = getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Peaceful); + scores[viewCount].m_commentData.m_mining.m_stone = getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Peaceful); scores[viewCount].m_commentData.m_mining.m_gravel = getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Peaceful); scores[viewCount].m_commentData.m_mining.m_clay = getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Peaceful); scores[viewCount].m_commentData.m_mining.m_obsidian = getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Peaceful); @@ -489,9 +489,9 @@ void StatsCounter::writeStats() scores[viewCount].m_commentData.m_statsType = LeaderboardManager::eStatsType_Mining; scores[viewCount].m_commentData.m_mining.m_dirt = getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Easy); - scores[viewCount].m_commentData.m_mining.m_cobblestone = getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Easy); + scores[viewCount].m_commentData.m_mining.m_cobblestone = getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Easy); scores[viewCount].m_commentData.m_mining.m_sand = getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Easy); - scores[viewCount].m_commentData.m_mining.m_stone = getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Easy); + scores[viewCount].m_commentData.m_mining.m_stone = getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Easy); scores[viewCount].m_commentData.m_mining.m_gravel = getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Easy); scores[viewCount].m_commentData.m_mining.m_clay = getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Easy); scores[viewCount].m_commentData.m_mining.m_obsidian = getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Easy); @@ -517,9 +517,9 @@ void StatsCounter::writeStats() scores[viewCount].m_commentData.m_statsType = LeaderboardManager::eStatsType_Mining; scores[viewCount].m_commentData.m_mining.m_dirt = getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Normal); - scores[viewCount].m_commentData.m_mining.m_cobblestone = getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Normal); + scores[viewCount].m_commentData.m_mining.m_cobblestone = getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Normal); scores[viewCount].m_commentData.m_mining.m_sand = getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Normal); - scores[viewCount].m_commentData.m_mining.m_stone = getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Normal); + scores[viewCount].m_commentData.m_mining.m_stone = getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Normal); scores[viewCount].m_commentData.m_mining.m_gravel = getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Normal); scores[viewCount].m_commentData.m_mining.m_clay = getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Normal); scores[viewCount].m_commentData.m_mining.m_obsidian = getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Normal); @@ -545,9 +545,9 @@ void StatsCounter::writeStats() scores[viewCount].m_commentData.m_statsType = LeaderboardManager::eStatsType_Mining; scores[viewCount].m_commentData.m_mining.m_dirt = getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Hard); - scores[viewCount].m_commentData.m_mining.m_cobblestone = getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Hard); + scores[viewCount].m_commentData.m_mining.m_cobblestone = getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Hard); scores[viewCount].m_commentData.m_mining.m_sand = getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Hard); - scores[viewCount].m_commentData.m_mining.m_stone = getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Hard); + scores[viewCount].m_commentData.m_mining.m_stone = getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Hard); scores[viewCount].m_commentData.m_mining.m_gravel = getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Hard); scores[viewCount].m_commentData.m_mining.m_clay = getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Hard); scores[viewCount].m_commentData.m_mining.m_obsidian = getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Hard); @@ -573,8 +573,8 @@ void StatsCounter::writeStats() scores[viewCount].m_commentData.m_statsType = LeaderboardManager::eStatsType_Farming; scores[viewCount].m_commentData.m_farming.m_eggs = getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Peaceful); - scores[viewCount].m_commentData.m_farming.m_wheat = getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Peaceful); - scores[viewCount].m_commentData.m_farming.m_mushroom = getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Peaceful); + scores[viewCount].m_commentData.m_farming.m_wheat = getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Peaceful); + scores[viewCount].m_commentData.m_farming.m_mushroom = getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Peaceful); scores[viewCount].m_commentData.m_farming.m_sugarcane = getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Peaceful); scores[viewCount].m_commentData.m_farming.m_milk = getValue(Stats::cowsMilked, eDifficulty_Peaceful); scores[viewCount].m_commentData.m_farming.m_pumpkin = getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Peaceful); @@ -599,8 +599,8 @@ void StatsCounter::writeStats() scores[viewCount].m_commentData.m_statsType = LeaderboardManager::eStatsType_Farming; scores[viewCount].m_commentData.m_farming.m_eggs = getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Easy); - scores[viewCount].m_commentData.m_farming.m_wheat = getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Easy); - scores[viewCount].m_commentData.m_farming.m_mushroom = getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Easy); + scores[viewCount].m_commentData.m_farming.m_wheat = getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Easy); + scores[viewCount].m_commentData.m_farming.m_mushroom = getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Easy); scores[viewCount].m_commentData.m_farming.m_sugarcane = getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Easy); scores[viewCount].m_commentData.m_farming.m_milk = getValue(Stats::cowsMilked, eDifficulty_Easy); scores[viewCount].m_commentData.m_farming.m_pumpkin = getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Easy); @@ -625,8 +625,8 @@ void StatsCounter::writeStats() scores[viewCount].m_commentData.m_statsType = LeaderboardManager::eStatsType_Farming; scores[viewCount].m_commentData.m_farming.m_eggs = getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Normal); - scores[viewCount].m_commentData.m_farming.m_wheat = getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Normal); - scores[viewCount].m_commentData.m_farming.m_mushroom = getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Normal); + scores[viewCount].m_commentData.m_farming.m_wheat = getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Normal); + scores[viewCount].m_commentData.m_farming.m_mushroom = getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Normal); scores[viewCount].m_commentData.m_farming.m_sugarcane = getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Normal); scores[viewCount].m_commentData.m_farming.m_milk = getValue(Stats::cowsMilked, eDifficulty_Normal); scores[viewCount].m_commentData.m_farming.m_pumpkin = getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Normal); @@ -651,8 +651,8 @@ void StatsCounter::writeStats() scores[viewCount].m_commentData.m_statsType = LeaderboardManager::eStatsType_Farming; scores[viewCount].m_commentData.m_farming.m_eggs = getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Hard); - scores[viewCount].m_commentData.m_farming.m_wheat = getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Hard); - scores[viewCount].m_commentData.m_farming.m_mushroom = getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Hard); + scores[viewCount].m_commentData.m_farming.m_wheat = getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Hard); + scores[viewCount].m_commentData.m_farming.m_mushroom = getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Hard); scores[viewCount].m_commentData.m_farming.m_sugarcane = getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Hard); scores[viewCount].m_commentData.m_farming.m_milk = getValue(Stats::cowsMilked, eDifficulty_Hard); scores[viewCount].m_commentData.m_farming.m_pumpkin = getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Hard); @@ -775,6 +775,10 @@ void StatsCounter::writeStats() app.DebugPrintf("Successfully wrote %d leadeboard views\n", viewCount); } } + else + { + delete [] scores; + } #elif defined _XBOX @@ -907,17 +911,17 @@ void StatsCounter::writeStats() rating = getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Peaceful) + - getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Peaceful) + + getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Peaceful) + getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Peaceful) + - getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Peaceful) + + getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Peaceful) + getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Peaceful) + getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Peaceful) + getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Peaceful); setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Dirt ], PROPERTY_MINED_DIRT, getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Peaceful) ); - setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Stone ], PROPERTY_MINED_STONE, getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Peaceful) ); + setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Stone ], PROPERTY_MINED_STONE, getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Peaceful) ); setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Sand ], PROPERTY_MINED_SAND, getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Peaceful) ); - setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Cobblestone], PROPERTY_MINED_COBBLESTONE, getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Peaceful) ); + setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Cobblestone], PROPERTY_MINED_COBBLESTONE, getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Peaceful) ); setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Gravel ], PROPERTY_MINED_GRAVEL, getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Peaceful) ); setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Clay ], PROPERTY_MINED_CLAY, getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Peaceful) ); setLeaderboardProperty( &miningBlocksPeacefulProperties[LeaderboardManager::eProperty_Mining_Obsidian ], PROPERTY_MINED_OBSIDIAN, getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Peaceful) ); @@ -935,17 +939,17 @@ void StatsCounter::writeStats() rating = getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Easy) + - getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Easy) + + getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Easy) + getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Easy) + - getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Easy) + + getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Easy) + getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Easy) + getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Easy) + getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Easy); setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Dirt ], PROPERTY_MINED_DIRT, getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Easy) ); - setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Stone ], PROPERTY_MINED_STONE, getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Easy) ); + setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Stone ], PROPERTY_MINED_STONE, getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Easy) ); setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Sand ], PROPERTY_MINED_SAND, getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Easy) ); - setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Cobblestone], PROPERTY_MINED_COBBLESTONE, getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Easy) ); + setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Cobblestone], PROPERTY_MINED_COBBLESTONE, getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Easy) ); setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Gravel ], PROPERTY_MINED_GRAVEL, getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Easy) ); setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Clay ], PROPERTY_MINED_CLAY, getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Easy) ); setLeaderboardProperty( &miningBlocksEasyProperties[LeaderboardManager::eProperty_Mining_Obsidian ], PROPERTY_MINED_OBSIDIAN, getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Easy) ); @@ -963,17 +967,17 @@ void StatsCounter::writeStats() rating = getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Normal) + - getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Normal) + + getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Normal) + getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Normal) + - getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Normal) + + getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Normal) + getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Normal) + getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Normal) + getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Normal); setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Dirt ], PROPERTY_MINED_DIRT, getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Normal) ); - setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Stone ], PROPERTY_MINED_STONE, getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Normal) ); + setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Stone ], PROPERTY_MINED_STONE, getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Normal) ); setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Sand ], PROPERTY_MINED_SAND, getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Normal) ); - setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Cobblestone ], PROPERTY_MINED_COBBLESTONE, getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Normal) ); + setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Cobblestone ], PROPERTY_MINED_COBBLESTONE, getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Normal) ); setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Gravel ], PROPERTY_MINED_GRAVEL, getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Normal) ); setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Clay ], PROPERTY_MINED_CLAY, getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Normal) ); setLeaderboardProperty( &miningBlocksNormalProperties[LeaderboardManager::eProperty_Mining_Obsidian ], PROPERTY_MINED_OBSIDIAN, getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Normal) ); @@ -991,17 +995,17 @@ void StatsCounter::writeStats() rating = getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Hard) + - getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Hard) + + getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Hard) + getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Hard) + - getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Hard) + + getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Hard) + getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Hard) + getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Hard) + getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Hard); setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Dirt ], PROPERTY_MINED_DIRT, getValue(Stats::blocksMined[Tile::dirt->id], eDifficulty_Hard) ); - setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Stone ], PROPERTY_MINED_STONE, getValue(Stats::blocksMined[Tile::stoneBrick->id], eDifficulty_Hard) ); + setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Stone ], PROPERTY_MINED_STONE, getValue(Stats::blocksMined[Tile::cobblestone->id], eDifficulty_Hard) ); setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Sand ], PROPERTY_MINED_SAND, getValue(Stats::blocksMined[Tile::sand->id], eDifficulty_Hard) ); - setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Cobblestone], PROPERTY_MINED_COBBLESTONE, getValue(Stats::blocksMined[Tile::rock->id], eDifficulty_Hard) ); + setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Cobblestone], PROPERTY_MINED_COBBLESTONE, getValue(Stats::blocksMined[Tile::stone->id], eDifficulty_Hard) ); setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Gravel ], PROPERTY_MINED_GRAVEL, getValue(Stats::blocksMined[Tile::gravel->id], eDifficulty_Hard) ); setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Clay ], PROPERTY_MINED_CLAY, getValue(Stats::blocksMined[Tile::clay->id], eDifficulty_Hard) ); setLeaderboardProperty( &miningBlocksHardProperties[LeaderboardManager::eProperty_Mining_Obsidian ], PROPERTY_MINED_OBSIDIAN, getValue(Stats::blocksMined[Tile::obsidian->id], eDifficulty_Hard) ); @@ -1019,15 +1023,15 @@ void StatsCounter::writeStats() rating = getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Peaceful) + - getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Peaceful) + - getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Peaceful) + + getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Peaceful) + + getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Peaceful) + getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Peaceful) + getValue(Stats::cowsMilked, eDifficulty_Peaceful) + getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Peaceful); setLeaderboardProperty( &farmingPeacefulProperties[LeaderboardManager::eProperty_Farming_Egg ], PROPERTY_COLLECTED_EGG, getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Peaceful) ); - setLeaderboardProperty( &farmingPeacefulProperties[LeaderboardManager::eProperty_Farming_Wheat ], PROPERTY_COLLECTED_WHEAT, getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Peaceful) ); - setLeaderboardProperty( &farmingPeacefulProperties[LeaderboardManager::eProperty_Farming_Mushroom ], PROPERTY_COLLECTED_MUSHROOM, getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Peaceful) ); + setLeaderboardProperty( &farmingPeacefulProperties[LeaderboardManager::eProperty_Farming_Wheat ], PROPERTY_COLLECTED_WHEAT, getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Peaceful) ); + setLeaderboardProperty( &farmingPeacefulProperties[LeaderboardManager::eProperty_Farming_Mushroom ], PROPERTY_COLLECTED_MUSHROOM, getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Peaceful) ); setLeaderboardProperty( &farmingPeacefulProperties[LeaderboardManager::eProperty_Farming_Sugarcane ], PROPERTY_COLLECTED_SUGARCANE, getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Peaceful) ); setLeaderboardProperty( &farmingPeacefulProperties[LeaderboardManager::eProperty_Farming_Milk ], PROPERTY_COLLECTED_MILK, getValue(Stats::cowsMilked, eDifficulty_Peaceful) ); setLeaderboardProperty( &farmingPeacefulProperties[LeaderboardManager::eProperty_Farming_Pumpkin ], PROPERTY_COLLECTED_PUMPKIN, getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Peaceful) ); @@ -1045,15 +1049,15 @@ void StatsCounter::writeStats() rating = getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Easy) + - getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Easy) + - getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Easy) + + getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Easy) + + getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Easy) + getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Easy) + getValue(Stats::cowsMilked, eDifficulty_Easy) + getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Easy); setLeaderboardProperty( &farmingEasyProperties[LeaderboardManager::eProperty_Farming_Egg ], PROPERTY_COLLECTED_EGG, getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Easy) ); - setLeaderboardProperty( &farmingEasyProperties[LeaderboardManager::eProperty_Farming_Wheat ], PROPERTY_COLLECTED_WHEAT, getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Easy) ); - setLeaderboardProperty( &farmingEasyProperties[LeaderboardManager::eProperty_Farming_Mushroom ], PROPERTY_COLLECTED_MUSHROOM, getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Easy) ); + setLeaderboardProperty( &farmingEasyProperties[LeaderboardManager::eProperty_Farming_Wheat ], PROPERTY_COLLECTED_WHEAT, getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Easy) ); + setLeaderboardProperty( &farmingEasyProperties[LeaderboardManager::eProperty_Farming_Mushroom ], PROPERTY_COLLECTED_MUSHROOM, getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Easy) ); setLeaderboardProperty( &farmingEasyProperties[LeaderboardManager::eProperty_Farming_Sugarcane ], PROPERTY_COLLECTED_SUGARCANE, getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Easy) ); setLeaderboardProperty( &farmingEasyProperties[LeaderboardManager::eProperty_Farming_Milk ], PROPERTY_COLLECTED_MILK, getValue(Stats::cowsMilked, eDifficulty_Easy) ); setLeaderboardProperty( &farmingEasyProperties[LeaderboardManager::eProperty_Farming_Pumpkin ], PROPERTY_COLLECTED_PUMPKIN, getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Easy) ); @@ -1071,15 +1075,15 @@ void StatsCounter::writeStats() rating = getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Normal) + - getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Normal) + - getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Normal) + + getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Normal) + + getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Normal) + getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Normal) + getValue(Stats::cowsMilked, eDifficulty_Normal) + getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Normal); setLeaderboardProperty( &farmingNormalProperties[LeaderboardManager::eProperty_Farming_Egg ], PROPERTY_COLLECTED_EGG, getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Normal) ); - setLeaderboardProperty( &farmingNormalProperties[LeaderboardManager::eProperty_Farming_Wheat ], PROPERTY_COLLECTED_WHEAT, getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Normal) ); - setLeaderboardProperty( &farmingNormalProperties[LeaderboardManager::eProperty_Farming_Mushroom ], PROPERTY_COLLECTED_MUSHROOM, getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Normal) ); + setLeaderboardProperty( &farmingNormalProperties[LeaderboardManager::eProperty_Farming_Wheat ], PROPERTY_COLLECTED_WHEAT, getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Normal) ); + setLeaderboardProperty( &farmingNormalProperties[LeaderboardManager::eProperty_Farming_Mushroom ], PROPERTY_COLLECTED_MUSHROOM, getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Normal) ); setLeaderboardProperty( &farmingNormalProperties[LeaderboardManager::eProperty_Farming_Sugarcane], PROPERTY_COLLECTED_SUGARCANE, getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Normal) ); setLeaderboardProperty( &farmingNormalProperties[LeaderboardManager::eProperty_Farming_Milk ], PROPERTY_COLLECTED_MILK, getValue(Stats::cowsMilked, eDifficulty_Normal) ); setLeaderboardProperty( &farmingNormalProperties[LeaderboardManager::eProperty_Farming_Pumpkin ], PROPERTY_COLLECTED_PUMPKIN, getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Normal) ); @@ -1097,15 +1101,15 @@ void StatsCounter::writeStats() rating = getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Hard) + - getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Hard) + - getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Hard) + + getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Hard) + + getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Hard) + getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Hard) + getValue(Stats::cowsMilked, eDifficulty_Hard) + getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Hard); setLeaderboardProperty( &farmingHardProperties[LeaderboardManager::eProperty_Farming_Egg ], PROPERTY_COLLECTED_EGG, getValue(Stats::itemsCollected[Item::egg->id], eDifficulty_Hard) ); - setLeaderboardProperty( &farmingHardProperties[LeaderboardManager::eProperty_Farming_Wheat ], PROPERTY_COLLECTED_WHEAT, getValue(Stats::blocksMined[Tile::crops_Id], eDifficulty_Hard) ); - setLeaderboardProperty( &farmingHardProperties[LeaderboardManager::eProperty_Farming_Mushroom ], PROPERTY_COLLECTED_MUSHROOM, getValue(Stats::blocksMined[Tile::mushroom1_Id], eDifficulty_Hard) ); + setLeaderboardProperty( &farmingHardProperties[LeaderboardManager::eProperty_Farming_Wheat ], PROPERTY_COLLECTED_WHEAT, getValue(Stats::blocksMined[Tile::wheat_Id], eDifficulty_Hard) ); + setLeaderboardProperty( &farmingHardProperties[LeaderboardManager::eProperty_Farming_Mushroom ], PROPERTY_COLLECTED_MUSHROOM, getValue(Stats::blocksMined[Tile::mushroom_brown_Id], eDifficulty_Hard) ); setLeaderboardProperty( &farmingHardProperties[LeaderboardManager::eProperty_Farming_Sugarcane ], PROPERTY_COLLECTED_SUGARCANE, getValue(Stats::blocksMined[Tile::reeds_Id], eDifficulty_Hard) ); setLeaderboardProperty( &farmingHardProperties[LeaderboardManager::eProperty_Farming_Milk ], PROPERTY_COLLECTED_MILK, getValue(Stats::cowsMilked, eDifficulty_Hard) ); setLeaderboardProperty( &farmingHardProperties[LeaderboardManager::eProperty_Farming_Pumpkin ], PROPERTY_COLLECTED_PUMPKIN, getValue(Stats::itemsCollected[Tile::pumpkin->id], eDifficulty_Hard) ); @@ -1249,16 +1253,16 @@ void StatsCounter::setupStatBoards() statBoards.insert( make_pair(Stats::killsSlime, LEADERBOARD_KILLS_PEACEFUL) ); statBoards.insert( make_pair(Stats::blocksMined[Tile::dirt->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); - statBoards.insert( make_pair(Stats::blocksMined[Tile::stoneBrick->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); + statBoards.insert( make_pair(Stats::blocksMined[Tile::cobblestone->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); statBoards.insert( make_pair(Stats::blocksMined[Tile::sand->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); - statBoards.insert( make_pair(Stats::blocksMined[Tile::rock->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); + statBoards.insert( make_pair(Stats::blocksMined[Tile::stone->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); statBoards.insert( make_pair(Stats::blocksMined[Tile::gravel->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); statBoards.insert( make_pair(Stats::blocksMined[Tile::clay->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); statBoards.insert( make_pair(Stats::blocksMined[Tile::obsidian->id], LEADERBOARD_MININGBLOCKS_PEACEFUL) ); statBoards.insert( make_pair(Stats::itemsCollected[Item::egg->id], LEADERBOARD_FARMING_PEACEFUL) ); - statBoards.insert( make_pair(Stats::blocksMined[Tile::crops_Id], LEADERBOARD_FARMING_PEACEFUL) ); - statBoards.insert( make_pair(Stats::blocksMined[Tile::mushroom1_Id], LEADERBOARD_FARMING_PEACEFUL) ); + statBoards.insert( make_pair(Stats::blocksMined[Tile::wheat_Id], LEADERBOARD_FARMING_PEACEFUL) ); + statBoards.insert( make_pair(Stats::blocksMined[Tile::mushroom_brown_Id], LEADERBOARD_FARMING_PEACEFUL) ); statBoards.insert( make_pair(Stats::blocksMined[Tile::reeds_Id], LEADERBOARD_FARMING_PEACEFUL) ); statBoards.insert( make_pair(Stats::cowsMilked, LEADERBOARD_FARMING_PEACEFUL) ); statBoards.insert( make_pair(Stats::itemsCollected[Tile::pumpkin->id], LEADERBOARD_FARMING_PEACEFUL) ); diff --git a/Minecraft.Client/StitchedTexture.cpp b/Minecraft.Client/StitchedTexture.cpp index d7e47b42..c17f3db5 100644 --- a/Minecraft.Client/StitchedTexture.cpp +++ b/Minecraft.Client/StitchedTexture.cpp @@ -19,11 +19,11 @@ StitchedTexture *StitchedTexture::create(const wstring &name) } else { - return new StitchedTexture(name); + return new StitchedTexture(name,name); } } -StitchedTexture::StitchedTexture(const wstring &name) : name(name) +StitchedTexture::StitchedTexture(const wstring &name, const wstring &filename) : name(name) { // 4J Initialisers source = NULL; @@ -43,6 +43,7 @@ StitchedTexture::StitchedTexture(const wstring &name) : name(name) frameOverride = NULL; flags = 0; frames = NULL; + m_fileName = filename; } void StitchedTexture::freeFrameTextures() diff --git a/Minecraft.Client/StitchedTexture.h b/Minecraft.Client/StitchedTexture.h index 99b1d447..0ac37b2d 100644 --- a/Minecraft.Client/StitchedTexture.h +++ b/Minecraft.Client/StitchedTexture.h @@ -9,6 +9,9 @@ class StitchedTexture : public Icon private: const wstring name; +public: + wstring m_fileName; + protected: Texture *source; vector *frames; @@ -45,7 +48,7 @@ public: ~StitchedTexture(); protected: - StitchedTexture(const wstring &name); + StitchedTexture(const wstring &name, const wstring &filename); public: void initUVs(float U0, float V0, float U1, float V1); diff --git a/Minecraft.Client/StringTable.cpp b/Minecraft.Client/StringTable.cpp index b0c46a7b..a29da179 100644 --- a/Minecraft.Client/StringTable.cpp +++ b/Minecraft.Client/StringTable.cpp @@ -11,6 +11,20 @@ StringTable::StringTable(PBYTE pbData, DWORD dwSize) { src = byteArray(pbData, dwSize); + ProcessStringTableData(); +} + + +void StringTable::ReloadStringTable() +{ + m_stringsMap.clear(); + m_stringsVec.clear(); + + ProcessStringTableData(); +} + +void StringTable::ProcessStringTableData(void) +{ ByteArrayInputStream bais(src); DataInputStream dis(&bais); @@ -35,8 +49,8 @@ StringTable::StringTable(PBYTE pbData, DWORD dwSize) // for( AUTO_VAR(it_locales, locales.begin()); - it_locales!=locales.end() && (!foundLang); - it_locales++ + it_locales!=locales.end() && (!foundLang); + it_locales++ ) { bytesToSkip = 0; @@ -72,7 +86,7 @@ StringTable::StringTable(PBYTE pbData, DWORD dwSize) // Read the language file for the selected language int langVersion = dis2.readInt(); - + isStatic = false; // 4J-JEV: Versions 1 and up could use if (langVersion > 0) // integers rather than wstrings as keys. isStatic = dis2.readBoolean(); @@ -80,6 +94,8 @@ StringTable::StringTable(PBYTE pbData, DWORD dwSize) wstring langId = dis2.readUTF(); int totalStrings = dis2.readInt(); + app.DebugPrintf("IsStatic=%d totalStrings = %d\n",isStatic?1:0,totalStrings); + if (!isStatic) { for(int i = 0; i < totalStrings; ++i) @@ -109,11 +125,12 @@ StringTable::StringTable(PBYTE pbData, DWORD dwSize) isStatic = false; } - + // We can't delete this data in the dtor, so clear the reference bais.reset(); } + StringTable::~StringTable(void) { // delete src.data; TODO 4J-JEV: ? diff --git a/Minecraft.Client/StringTable.h b/Minecraft.Client/StringTable.h index 9e27d65c..2353f81b 100644 --- a/Minecraft.Client/StringTable.h +++ b/Minecraft.Client/StringTable.h @@ -61,6 +61,7 @@ public: StringTable(void); StringTable(PBYTE pbData, DWORD dwSize); ~StringTable(void); + void ReloadStringTable(); void getData(PBYTE *ppbData, UINT *pdwSize); @@ -73,6 +74,7 @@ public: private: //wstring getLangId(DWORD dwLanguage=0); + void ProcessStringTableData(void); }; diff --git a/Minecraft.Client/Tesselator.cpp b/Minecraft.Client/Tesselator.cpp index 366b09e3..7bae7aca 100644 --- a/Minecraft.Client/Tesselator.cpp +++ b/Minecraft.Client/Tesselator.cpp @@ -832,7 +832,7 @@ void Tesselator::vertex(float x, float y, float z) pShortData[5] = (((int)(v * 8192.0f))&0xffff); int16_t u2 = ((int16_t*)&_tex2)[0]; int16_t v2 = ((int16_t*)&_tex2)[1]; -#if defined _XBOX_ONE || defined __ORBIS__ +#if defined _XBOX_ONE || defined __ORBIS__ // Optimisation - pack the second UVs into a single short (they could actually go in a byte), which frees up a short to store the x offset for this chunk in the vertex itself. // This means that when rendering chunks, we don't need to update the vertex constants that specify the location for a chunk, when only the x offset has changed. pShortData[6] = ( u2 << 8 ) | v2; diff --git a/Minecraft.Client/Texture.cpp b/Minecraft.Client/Texture.cpp index e287c177..809f606a 100644 --- a/Minecraft.Client/Texture.cpp +++ b/Minecraft.Client/Texture.cpp @@ -11,6 +11,7 @@ static const int sc_maxTextureBlits = 256; static Texture_blit_DataIn g_textureBlitDataIn[sc_maxTextureBlits] __attribute__((__aligned__(16))); static int g_currentTexBlit = 0; C4JSpursJobQueue::Port* g_texBlitJobQueuePort; +// #define DISABLE_SPU_CODE #endif //__PS3__ #define MAX_MIP_LEVELS 5 diff --git a/Minecraft.Client/TextureAtlas.cpp b/Minecraft.Client/TextureAtlas.cpp new file mode 100644 index 00000000..127e9b23 --- /dev/null +++ b/Minecraft.Client/TextureAtlas.cpp @@ -0,0 +1,6 @@ +#include "stdafx.h" +#include "TextureAtlas.h" +#include "ResourceLocation.h" + +ResourceLocation TextureAtlas::LOCATION_BLOCKS = ResourceLocation(TN_TERRAIN); +ResourceLocation TextureAtlas::LOCATION_ITEMS = ResourceLocation(TN_GUI_ITEMS); \ No newline at end of file diff --git a/Minecraft.Client/TextureAtlas.h b/Minecraft.Client/TextureAtlas.h new file mode 100644 index 00000000..21f9d038 --- /dev/null +++ b/Minecraft.Client/TextureAtlas.h @@ -0,0 +1,10 @@ +#pragma once + +class ResourceLocation; + +class TextureAtlas +{ +public: + static ResourceLocation LOCATION_BLOCKS; + static ResourceLocation LOCATION_ITEMS; +}; \ No newline at end of file diff --git a/Minecraft.Client/TexturePack.cpp b/Minecraft.Client/TexturePack.cpp index 39f03569..7ed208ae 100644 --- a/Minecraft.Client/TexturePack.cpp +++ b/Minecraft.Client/TexturePack.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "TexturePack.h" -wstring TexturePack::getPath(bool bTitleUpdateTexture /*= false*/) +wstring TexturePack::getPath(bool bTitleUpdateTexture /*= false*/,const char *pchBDPatchFileName /*= NULL*/) { wstring wDrive; #ifdef _XBOX @@ -24,21 +24,38 @@ wstring TexturePack::getPath(bool bTitleUpdateTexture /*= false*/) #ifdef __PS3__ // 4J-PB - we need to check for a BD patch - this is going to be an issue for full DLC texture packs (Halloween) + char *pchUsrDir=NULL; + if(app.GetBootedFromDiscPatch() && pchBDPatchFileName!=NULL) + { + pchUsrDir = app.GetBDUsrDirPath(pchBDPatchFileName); + wstring wstr (pchUsrDir, pchUsrDir+strlen(pchUsrDir)); - char *pchUsrDir=getUsrDirPath(); - - wstring wstr (pchUsrDir, pchUsrDir+strlen(pchUsrDir)); + if(bTitleUpdateTexture) + { + wDrive= wstr + L"\\Common\\res\\TitleUpdate\\"; - if(bTitleUpdateTexture) - { - // Make the content package point to to the UPDATE: drive is needed - wDrive= wstr + L"\\Common\\res\\TitleUpdate\\"; + } + else + { + wDrive= wstr + L"/Common/"; + } } else { - wDrive= wstr + L"/Common/"; - } + pchUsrDir=getUsrDirPath(); + + wstring wstr (pchUsrDir, pchUsrDir+strlen(pchUsrDir)); + if(bTitleUpdateTexture) + { + // Make the content package point to to the UPDATE: drive is needed + wDrive= wstr + L"\\Common\\res\\TitleUpdate\\"; + } + else + { + wDrive= wstr + L"/Common/"; + } + } #elif __PSVITA__ char *pchUsrDir="";//getUsrDirPath(); diff --git a/Minecraft.Client/TexturePack.h b/Minecraft.Client/TexturePack.h index 4763b8ab..23cb4f62 100644 --- a/Minecraft.Client/TexturePack.h +++ b/Minecraft.Client/TexturePack.h @@ -39,7 +39,7 @@ public: // 4J Added - virtual wstring getPath(bool bTitleUpdateTexture = false); + virtual wstring getPath(bool bTitleUpdateTexture = false, const char *pchBDPatchFilename=NULL); virtual wstring getAnimationString(const wstring &textureName, const wstring &path, bool allowFallback) = 0; virtual BufferedImage *getImageResource(const wstring& File, bool filenameHasExtension = false, bool bTitleUpdateTexture=false, const wstring &drive =L"") = 0; virtual void loadColourTable() = 0; diff --git a/Minecraft.Client/Textures.cpp b/Minecraft.Client/Textures.cpp index ce7a9bfc..ab9db75d 100644 --- a/Minecraft.Client/Textures.cpp +++ b/Minecraft.Client/Textures.cpp @@ -16,6 +16,9 @@ #include "..\Minecraft.World\net.minecraft.world.h" #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\StringHelpers.h" +#include "ResourceLocation.h" +#include "..\Minecraft.World\ItemEntity.h" +#include "TextureAtlas.h" bool Textures::MIPMAP = true; C4JRender::eTextureFormat Textures::TEXTURE_FORMAT = C4JRender::TEXTURE_FORMAT_RxGyBzAw; @@ -120,6 +123,44 @@ wchar_t *Textures::preLoaded[TN_COUNT] = L"mob/wolf_collar", L"mob/zombie_villager", + // 1.6.4 + L"item/lead_knot", + + L"misc/beacon_beam", + + L"mob/bat", + + L"mob/horse/donkey", + L"mob/horse/horse_black", + L"mob/horse/horse_brown", + L"mob/horse/horse_chestnut", + L"mob/horse/horse_creamy", + L"mob/horse/horse_darkbrown", + L"mob/horse/horse_gray", + L"mob/horse/horse_markings_blackdots", + L"mob/horse/horse_markings_white", + L"mob/horse/horse_markings_whitedots", + L"mob/horse/horse_markings_whitefield", + L"mob/horse/horse_skeleton", + L"mob/horse/horse_white", + L"mob/horse/horse_zombie", + L"mob/horse/mule", + + L"mob/horse/armor/horse_armor_diamond", + L"mob/horse/armor/horse_armor_gold", + L"mob/horse/armor/horse_armor_iron", + + L"mob/witch", + + L"mob/wither/wither", + L"mob/wither/wither_armor", + L"mob/wither/wither_invulnerable", + + L"item/trapped", + L"item/trapped_double", + //L"item/christmas", + //L"item/christmas_double", + #ifdef _LARGE_WORLDS L"misc/additionalmapicons", #endif @@ -367,9 +408,28 @@ void Textures::bindTexture(const wstring &resourceName) } // 4J Added -void Textures::bindTexture(int resourceId) +void Textures::bindTexture(ResourceLocation *resource) { - bind(loadTexture(resourceId)); + if(resource->isPreloaded()) + { + bind(loadTexture(resource->getTexture())); + } + else + { + bind(loadTexture(TN_COUNT, resource->getPath())); + } +} + +void Textures::bindTextureLayers(ResourceLocation *resource) +{ + assert(resource->isPreloaded()); + + int layers = resource->getTextureCount(); + + for( int i = 0; i < layers; i++ ) + { + RenderManager.TextureBind(loadTexture(resource->getTexture(i))); + } } void Textures::bind(int id) @@ -382,6 +442,26 @@ void Textures::bind(int id) } } +ResourceLocation *Textures::getTextureLocation(shared_ptr entity) +{ + shared_ptr item = dynamic_pointer_cast(entity); + int iconType = item->getItem()->getIconType(); + return getTextureLocation(iconType); +} + +ResourceLocation *Textures::getTextureLocation(int iconType) +{ + switch(iconType) + { + case Icon::TYPE_TERRAIN: + return &TextureAtlas::LOCATION_BLOCKS; + break; + case Icon::TYPE_ITEM: + return &TextureAtlas::LOCATION_ITEMS; + break; + } +} + void Textures::clearLastBoundId() { lastBoundId = -1; @@ -1300,6 +1380,42 @@ TEXTURE_NAME TUImages[] = TN_PARTICLES, TN_MOB_ZOMBIE_VILLAGER, + TN_ITEM_LEASHKNOT, + + TN_MISC_BEACON_BEAM, + + TN_MOB_BAT, + + TN_MOB_DONKEY, + TN_MOB_HORSE_BLACK, + TN_MOB_HORSE_BROWN, + TN_MOB_HORSE_CHESTNUT, + TN_MOB_HORSE_CREAMY, + TN_MOB_HORSE_DARKBROWN, + TN_MOB_HORSE_GRAY, + TN_MOB_HORSE_MARKINGS_BLACKDOTS, + TN_MOB_HORSE_MARKINGS_WHITE, + TN_MOB_HORSE_MARKINGS_WHITEDOTS, + TN_MOB_HORSE_MARKINGS_WHITEFIELD, + TN_MOB_HORSE_SKELETON, + TN_MOB_HORSE_WHITE, + TN_MOB_HORSE_ZOMBIE, + TN_MOB_MULE, + TN_MOB_HORSE_ARMOR_DIAMOND, + TN_MOB_HORSE_ARMOR_GOLD, + TN_MOB_HORSE_ARMOR_IRON, + + TN_MOB_WITCH, + + TN_MOB_WITHER, + TN_MOB_WITHER_ARMOR, + TN_MOB_WITHER_INVULNERABLE, + + TN_TILE_TRAP_CHEST, + TN_TILE_LARGE_TRAP_CHEST, + //TN_TILE_XMAS_CHEST, + //TN_TILE_LARGE_XMAS_CHEST, + #ifdef _LARGE_WORLDS TN_MISC_ADDITIONALMAPICONS, #endif @@ -1324,6 +1440,8 @@ wchar_t *TUImagePaths[] = L"armor/cloth_2.png", L"armor/cloth_2_b.png", + // + NULL }; diff --git a/Minecraft.Client/Textures.h b/Minecraft.Client/Textures.h index eb0799e2..eb3d2f6d 100644 --- a/Minecraft.Client/Textures.h +++ b/Minecraft.Client/Textures.h @@ -12,6 +12,7 @@ class Options; using namespace std; class IntBuffer; class PreStitchedTextureMap; +class ResourceLocation; typedef enum _TEXTURE_NAME @@ -102,7 +103,7 @@ typedef enum _TEXTURE_NAME TN_TERRAIN_MOON_PHASES, // 1.2.3 - TN_MOB_OZELOT, + TN_MOB_OCELOT, TN_MOB_CAT_BLACK, TN_MOB_CAT_RED, TN_MOB_CAT_SIAMESE, @@ -113,6 +114,43 @@ typedef enum _TEXTURE_NAME TN_MOB_WOLF_COLLAR, TN_MOB_ZOMBIE_VILLAGER, + // 1.6.4 + TN_ITEM_LEASHKNOT, + + TN_MISC_BEACON_BEAM, + + TN_MOB_BAT, + + TN_MOB_DONKEY, + TN_MOB_HORSE_BLACK, + TN_MOB_HORSE_BROWN, + TN_MOB_HORSE_CHESTNUT, + TN_MOB_HORSE_CREAMY, + TN_MOB_HORSE_DARKBROWN, + TN_MOB_HORSE_GRAY, + TN_MOB_HORSE_MARKINGS_BLACKDOTS, + TN_MOB_HORSE_MARKINGS_WHITE, + TN_MOB_HORSE_MARKINGS_WHITEDOTS, + TN_MOB_HORSE_MARKINGS_WHITEFIELD, + TN_MOB_HORSE_SKELETON, + TN_MOB_HORSE_WHITE, + TN_MOB_HORSE_ZOMBIE, + TN_MOB_MULE, + TN_MOB_HORSE_ARMOR_DIAMOND, + TN_MOB_HORSE_ARMOR_GOLD, + TN_MOB_HORSE_ARMOR_IRON, + + TN_MOB_WITCH, + + TN_MOB_WITHER, + TN_MOB_WITHER_ARMOR, + TN_MOB_WITHER_INVULNERABLE, + + TN_TILE_TRAP_CHEST, + TN_TILE_LARGE_TRAP_CHEST, + //TN_TILE_XMAS_CHEST, + //TN_TILE_LARGE_XMAS_CHEST, + #ifdef _LARGE_WORLDS TN_MISC_ADDITIONALMAPICONS, #endif @@ -240,11 +278,15 @@ private: public: void bindTexture(const wstring &resourceName); - void bindTexture(int resourceId); // 4J Added + void bindTexture(ResourceLocation *resource); // 4J Added + void bindTextureLayers(ResourceLocation *resource); // 4J added // 4J Made public for use in XUI controls void bind(int id); + ResourceLocation *getTextureLocation(shared_ptr entity); + ResourceLocation *getTextureLocation(int iconType); + public: void clearLastBoundId(); diff --git a/Minecraft.Client/TheEndPortalRenderer.cpp b/Minecraft.Client/TheEndPortalRenderer.cpp index 52581579..98c7e7cc 100644 --- a/Minecraft.Client/TheEndPortalRenderer.cpp +++ b/Minecraft.Client/TheEndPortalRenderer.cpp @@ -7,19 +7,24 @@ #include "..\Minecraft.World\FloatBuffer.h" #include "TheEndPortalRenderer.h" +ResourceLocation TheEndPortalRenderer::END_SKY_LOCATION = ResourceLocation(TN_MISC_TUNNEL); +ResourceLocation TheEndPortalRenderer::END_PORTAL_LOCATION = ResourceLocation(TN_MISC_PARTICLEFIELD); +int TheEndPortalRenderer::RANDOM_SEED = 31100; +Random TheEndPortalRenderer::RANDOM = Random(RANDOM_SEED); + void TheEndPortalRenderer::render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J Convert as we aren't using a templated class shared_ptr table = dynamic_pointer_cast(_table); - float xx = (float) (tileEntityRenderDispatcher->xPlayer); - float yy = (float) (tileEntityRenderDispatcher->yPlayer); - float zz = (float) (tileEntityRenderDispatcher->zPlayer); + float xx = (float) tileEntityRenderDispatcher->xPlayer; + float yy = (float) tileEntityRenderDispatcher->yPlayer; + float zz = (float) tileEntityRenderDispatcher->zPlayer; glDisable(GL_LIGHTING); - Random random(31100); + RANDOM.setSeed(RANDOM_SEED); - float hoff = (12) / 16.0f; + float hoff = 12 / 16.0f; for (int i = 0; i < 16; i++) { glPushMatrix(); @@ -30,7 +35,7 @@ void TheEndPortalRenderer::render(shared_ptr _table, double x, doubl float br = 1.0f / (dist + 1); if (i == 0) { - this->bindTexture(TN_MISC_TUNNEL); // 4J was "/misc/tunnel.png" + this->bindTexture(&END_SKY_LOCATION); br = 0.1f; dist = 65; sscale = 1 / 8.0f; @@ -39,7 +44,7 @@ void TheEndPortalRenderer::render(shared_ptr _table, double x, doubl } if (i == 1) { - this->bindTexture(TN_MISC_PARTICLEFIELD); // 4J was "/misc/particlefield.png" + this->bindTexture(&END_PORTAL_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); sscale = 1 / 2.0f; @@ -78,7 +83,7 @@ void TheEndPortalRenderer::render(shared_ptr _table, double x, doubl glPushMatrix(); glLoadIdentity(); - glTranslatef(0, (System::currentTimeMillis() % 700000 / 700000.0f), 0); + glTranslatef(0, System::currentTimeMillis() % 700000 / 700000.0f, 0); glScalef(sscale, sscale, sscale); glTranslatef(0.5f, 0.5f, 0); glRotatef((i * i * 4321 + i * 9) * 2.0f, 0, 0, 1); @@ -91,9 +96,9 @@ void TheEndPortalRenderer::render(shared_ptr _table, double x, doubl t->useProjectedTexture(true); // 4J added - turns on both the generation of texture coordinates in the vertex shader & perspective divide of the texture coord in the pixel shader t->begin(); - float r = random.nextFloat() * 0.5f + 0.1f; - float g = random.nextFloat() * 0.5f + 0.4f; - float b = random.nextFloat() * 0.5f + 0.5f; + float r = RANDOM.nextFloat() * 0.5f + 0.1f; + float g = RANDOM.nextFloat() * 0.5f + 0.4f; + float b = RANDOM.nextFloat() * 0.5f + 0.5f; if (i == 0) r = g = b = 1; t->color(r * br, g * br, b * br, 1.0f); t->vertex(x, y + hoff, z); diff --git a/Minecraft.Client/TheEndPortalRenderer.h b/Minecraft.Client/TheEndPortalRenderer.h index 1e4ca546..d94fddc3 100644 --- a/Minecraft.Client/TheEndPortalRenderer.h +++ b/Minecraft.Client/TheEndPortalRenderer.h @@ -4,6 +4,12 @@ class TheEndPortalRenderer : public TileEntityRenderer { +private: + static ResourceLocation END_SKY_LOCATION; + static ResourceLocation END_PORTAL_LOCATION; + static int RANDOM_SEED; + static Random RANDOM; + public: virtual void render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); diff --git a/Minecraft.Client/TileEntityRenderDispatcher.cpp b/Minecraft.Client/TileEntityRenderDispatcher.cpp index 1708d215..f9ecfea4 100644 --- a/Minecraft.Client/TileEntityRenderDispatcher.cpp +++ b/Minecraft.Client/TileEntityRenderDispatcher.cpp @@ -13,6 +13,7 @@ #include "TheEndPortalRenderer.h" #include "SkullTileRenderer.h" #include "EnderChestRenderer.h" +#include "BeaconRenderer.h" TileEntityRenderDispatcher *TileEntityRenderDispatcher::instance = NULL; double TileEntityRenderDispatcher::xOff = 0; @@ -28,12 +29,12 @@ TileEntityRenderDispatcher::TileEntityRenderDispatcher() { // 4J -a dded font = NULL; - textures = NULL; - level = NULL; - cameraEntity = nullptr; - playerRotY = 0.0f; - playerRotX = 0.0f;; - xPlayer = yPlayer = zPlayer = 0; + textures = NULL; + level = NULL; + cameraEntity = nullptr; + playerRotY = 0.0f; + playerRotX = 0.0f;; + xPlayer = yPlayer = zPlayer = 0; glEnable(GL_LIGHTING); renderers[eTYPE_SIGNTILEENTITY] = new SignRenderer(); @@ -45,19 +46,20 @@ TileEntityRenderDispatcher::TileEntityRenderDispatcher() renderers[eTYPE_THEENDPORTALTILEENTITY] = new TheEndPortalRenderer(); renderers[eTYPE_SKULLTILEENTITY] = new SkullTileRenderer(); renderers[eTYPE_FURNACETILEENTITY] = NULL; + renderers[eTYPE_BEACONTILEENTITY] = new BeaconRenderer(); glDisable(GL_LIGHTING); AUTO_VAR(itEnd, renderers.end()); for( classToTileRendererMap::iterator it = renderers.begin(); it != itEnd; it++ ) { if(it->second) it->second->init(this); - } + } } TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(eINSTANCEOF e) { TileEntityRenderer *r = NULL; - //TileEntityRenderer *r = renderers[e]; + //TileEntityRenderer *r = renderers[e]; AUTO_VAR(it, renderers.find( e )); // 4J Stu - The .at and [] accessors insert elements if they don't exist if( it == renderers.end() ) @@ -66,13 +68,13 @@ TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(eINSTANCEOF e) } /* 4J - not doing this hierarchical search anymore. We need to explicitly add renderers for any eINSTANCEOF type that we want to be able to render - if (it == renderers.end() && e != TileEntity::_class) + if (it == renderers.end() && e != TileEntity::_class) { - r = getRenderer(dynamic_cast( e->getSuperclass() )); + r = getRenderer(dynamic_cast( e->getSuperclass() )); // 4J - added condition here to only add if a valid renderer found if( r ) renderers.insert( classToTileRendererMap::value_type( e, r ) ); //assert(false); - } + } else if(it != renderers.end() && e != TileEntity::_class) r = (*it).second; */ @@ -87,57 +89,57 @@ bool TileEntityRenderDispatcher::hasRenderer(shared_ptr e) TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(shared_ptr e) { - if (e == NULL) return NULL; - return getRenderer(e->GetType()); + if (e == NULL) return NULL; + return getRenderer(e->GetType()); } -void TileEntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a) +void TileEntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a) { if( this->level != level ) { setLevel( level ); } - this->textures = textures; - this->cameraEntity = player; - this->font = font; + this->textures = textures; + cameraEntity = player; + this->font = font; - playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; - playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; + playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; + playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; - xPlayer = player->xOld + (player->x - player->xOld) * a; - yPlayer = player->yOld + (player->y - player->yOld) * a; - zPlayer = player->zOld + (player->z - player->zOld) * a; + xPlayer = player->xOld + (player->x - player->xOld) * a; + yPlayer = player->yOld + (player->y - player->yOld) * a; + zPlayer = player->zOld + (player->z - player->zOld) * a; } void TileEntityRenderDispatcher::render(shared_ptr e, float a, bool setColor/*=true*/) { - if (e->distanceToSqr(xPlayer, yPlayer, zPlayer) < 64 * 64) + if (e->distanceToSqr(xPlayer, yPlayer, zPlayer) < e->getViewDistance()) { // 4J - changes brought forward from 1.8.2 - if (SharedConstants::TEXTURE_LIGHTING) + if (SharedConstants::TEXTURE_LIGHTING) { - int col = level->getLightColor(e->x, e->y, e->z, 0); - int u = col % 65536; - int v = col / 65536; - glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); - glColor4f(1, 1, 1, 1); - } + int col = level->getLightColor(e->x, e->y, e->z, 0); + int u = col % 65536; + int v = col / 65536; + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); + } else { - float br = level->getBrightness(e->x, e->y, e->z); - glColor4f(br, br, br, 1); - } - render(e, e->x - xOff, e->y - yOff, e->z - zOff, a, setColor); - } + float br = level->getBrightness(e->x, e->y, e->z); + glColor4f(br, br, br, 1); + } + render(e, e->x - xOff, e->y - yOff, e->z - zOff, a, setColor); + } } void TileEntityRenderDispatcher::render(shared_ptr entity, double x, double y, double z, float a, bool setColor/*=true*/, float alpha, bool useCompiled) { - TileEntityRenderer *renderer = getRenderer(entity); - if (renderer != NULL) + TileEntityRenderer *renderer = getRenderer(entity); + if (renderer != NULL) { - renderer->render(entity, x, y, z, a, setColor, alpha, useCompiled); - } + renderer->render(entity, x, y, z, a, setColor, alpha, useCompiled); + } } void TileEntityRenderDispatcher::setLevel(Level *level) @@ -152,10 +154,10 @@ void TileEntityRenderDispatcher::setLevel(Level *level) double TileEntityRenderDispatcher::distanceToSqr(double x, double y, double z) { - double xd = x - xPlayer; - double yd = y - yPlayer; - double zd = z - zPlayer; - return xd * xd + yd * yd + zd * zd; + double xd = x - xPlayer; + double yd = y - yPlayer; + double zd = z - zPlayer; + return xd * xd + yd * yd + zd * zd; } Font *TileEntityRenderDispatcher::getFont() diff --git a/Minecraft.Client/TileEntityRenderDispatcher.h b/Minecraft.Client/TileEntityRenderDispatcher.h index d86ddb01..a9d5fea7 100644 --- a/Minecraft.Client/TileEntityRenderDispatcher.h +++ b/Minecraft.Client/TileEntityRenderDispatcher.h @@ -25,7 +25,7 @@ public: Textures *textures; Level *level; - shared_ptr cameraEntity; + shared_ptr cameraEntity; float playerRotY; float playerRotX; double xPlayer, yPlayer, zPlayer; @@ -37,7 +37,7 @@ public: TileEntityRenderer *getRenderer(eINSTANCEOF e); bool hasRenderer(shared_ptr e); TileEntityRenderer * getRenderer(shared_ptr e); - void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a); + void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a); void render(shared_ptr e, float a, bool setColor = true); void render(shared_ptr entity, double x, double y, double z, float a, bool setColor = true, float alpha=1.0f, bool useCompiled = true); // 4J Added useCompiled void setLevel(Level *level); diff --git a/Minecraft.Client/TileEntityRenderer.cpp b/Minecraft.Client/TileEntityRenderer.cpp index b5c83d71..94bdd39c 100644 --- a/Minecraft.Client/TileEntityRenderer.cpp +++ b/Minecraft.Client/TileEntityRenderer.cpp @@ -2,16 +2,16 @@ #include "TileEntityRenderer.h" #include "TileEntityRenderDispatcher.h" -void TileEntityRenderer::bindTexture(int resourceName) +void TileEntityRenderer::bindTexture(ResourceLocation *location) { Textures *t = tileEntityRenderDispatcher->textures; - if(t != NULL) t->bind(t->loadTexture(resourceName)); + if(t != NULL) t->bind(t->loadTexture(location->getTexture())); } -void TileEntityRenderer::bindTexture(const wstring& urlTexture, int backupTexture) +void TileEntityRenderer::bindTexture(const wstring& urlTexture, ResourceLocation *location) { Textures *t = tileEntityRenderDispatcher->textures; - if(t != NULL) t->bind(t->loadHttpTexture(urlTexture, backupTexture)); + if(t != NULL) t->bind(t->loadHttpTexture(urlTexture, location->getTexture())); } Level *TileEntityRenderer::getLevel() diff --git a/Minecraft.Client/TileEntityRenderer.h b/Minecraft.Client/TileEntityRenderer.h index b7d08b86..b3bafb9d 100644 --- a/Minecraft.Client/TileEntityRenderer.h +++ b/Minecraft.Client/TileEntityRenderer.h @@ -1,5 +1,7 @@ #pragma once #include "Textures.h" +#include "ResourceLocation.h" + class TileEntityRenderDispatcher; class TileEntity; class Level; @@ -10,11 +12,11 @@ class TileEntityRenderer protected: TileEntityRenderDispatcher *tileEntityRenderDispatcher; public: - virtual void render(shared_ptr entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) = 0; // 4J added setColor param and alpha and useCompiled + virtual void render(shared_ptr entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) = 0; // 4J added setColor param, alpha and useCompiled virtual void onNewLevel(Level *level) {} protected: - void bindTexture(int resourceName); // 4J - changed from wstring to int - void bindTexture(const wstring& urlTexture, int backupTexture); // 4J - changed from wstring to int + void bindTexture(ResourceLocation *location); // 4J - changed from wstring to int + void bindTexture(const wstring& urlTexture, ResourceLocation *location); // 4J - changed from wstring to int private: Level *getLevel(); public: diff --git a/Minecraft.Client/TileRenderer.cpp b/Minecraft.Client/TileRenderer.cpp index 3b8d4c4e..2acc6170 100644 --- a/Minecraft.Client/TileRenderer.cpp +++ b/Minecraft.Client/TileRenderer.cpp @@ -22,7 +22,6 @@ void TileRenderer::_init() fixedTexture = NULL; xFlipTexture = false; noCulling = false; - blsmooth = 1; applyAmbienceOcclusion = false; setColor = true; northFlip = FLIP_NONE; @@ -187,6 +186,15 @@ void TileRenderer::clearFixedTexture() bool TileRenderer::hasFixedTexture() { +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita. Pass on the Alpha Cut out flag to the tesselator + if(fixedTexture) + { + Tesselator* t = Tesselator::getInstance(); + t->setAlphaCutOut( fixedTexture->getFlags() & Icon::IS_ALPHA_CUT_OUT ); + } +#endif + return fixedTexture != NULL; } @@ -244,7 +252,7 @@ void TileRenderer::tesselateInWorldFixedTexture( Tile* tile, int x, int y, int z } void TileRenderer::tesselateInWorldNoCulling( Tile* tile, int x, int y, int z, int forceData, - shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param + shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param { noCulling = true; tesselateInWorld( tile, x, y, z, forceData ); @@ -252,7 +260,7 @@ void TileRenderer::tesselateInWorldNoCulling( Tile* tile, int x, int y, int z, i } bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceData, - shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param + shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param { Tesselator* t = Tesselator::getInstance(); int shape = tt->getRenderShape(); @@ -377,9 +385,15 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat case Tile::SHAPE_BED: retVal = tesselateBedInWorld( tt, x, y, z ); break; + case Tile::SHAPE_REPEATER: + retVal = tesselateRepeaterInWorld((RepeaterTile *)tt, x, y, z); + break; case Tile::SHAPE_DIODE: retVal = tesselateDiodeInWorld( (DiodeTile *)tt, x, y, z ); break; + case Tile::SHAPE_COMPARATOR: + retVal = tesselateComparatorInWorld((ComparatorTile *)tt, x, y, z); + break; case Tile::SHAPE_PISTON_BASE: retVal = tesselatePistonBaseInWorld( tt, x, y, z, false, forceData ); break; @@ -389,6 +403,9 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat case Tile::SHAPE_IRON_FENCE: retVal = tesselateThinFenceInWorld( ( ThinFenceTile* )tt, x, y, z ); break; + case Tile::SHAPE_THIN_PANE: + retVal = tesselateThinPaneInWorld(tt, x, y, z); + break; case Tile::SHAPE_VINE: retVal = tesselateVineInWorld( tt, x, y, z ); break; @@ -411,7 +428,13 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat retVal = tesselateAirPortalFrameInWorld((TheEndPortalFrameTile *)tt, x, y, z); break; case Tile::SHAPE_COCOA: - retVal = tesselateCocoaInWorld((CocoaTile *) tt, x, y, z); + retVal = tesselateCocoaInWorld((CocoaTile *)tt, x, y, z); + break; + case Tile::SHAPE_BEACON: + retVal = tesselateBeaconInWorld(tt, x, y, z); + break; + case Tile::SHAPE_HOPPER: + retVal = tesselateHopperInWorld(tt, x, y, z); break; }; @@ -423,42 +446,42 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat bool TileRenderer::tesselateAirPortalFrameInWorld(TheEndPortalFrameTile *tt, int x, int y, int z) { - int data = level->getData(x, y, z); + int data = level->getData(x, y, z); - int direction = data & 3; - if (direction == Direction::SOUTH) + int direction = data & 3; + if (direction == Direction::SOUTH) { - upFlip = FLIP_180; - } + upFlip = FLIP_180; + } else if (direction == Direction::EAST) { - upFlip = FLIP_CW; - } + upFlip = FLIP_CW; + } else if (direction == Direction::WEST) { - upFlip = FLIP_CCW; - } + upFlip = FLIP_CCW; + } - if (!TheEndPortalFrameTile::hasEye(data)) + if (!TheEndPortalFrameTile::hasEye(data)) { - setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); - tesselateBlockInWorld(tt, x, y, z); + setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); + tesselateBlockInWorld(tt, x, y, z); - upFlip = FLIP_NONE; - return true; - } + upFlip = FLIP_NONE; + return true; + } noCulling = true; - setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); - tesselateBlockInWorld(tt, x, y, z); - setFixedTexture(tt->getEye()); - setShape(4.0f / 16.0f, 13.0f / 16.0f, 4.0f / 16.0f, 12.0f / 16.0f, 1, 12.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); + setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); + tesselateBlockInWorld(tt, x, y, z); + setFixedTexture(tt->getEye()); + setShape(4.0f / 16.0f, 13.0f / 16.0f, 4.0f / 16.0f, 12.0f / 16.0f, 1, 12.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); noCulling = false; - clearFixedTexture(); + clearFixedTexture(); - upFlip = FLIP_NONE; - return true; + upFlip = FLIP_NONE; + return true; } bool TileRenderer::tesselateBedInWorld( Tile* tt, int x, int y, int z ) @@ -613,17 +636,17 @@ bool TileRenderer::tesselateBedInWorld( Tile* tt, int x, int y, int z ) int flipEdge = Facing::WEST; switch ( direction ) { - case Direction::NORTH: - break; - case Direction::SOUTH: - flipEdge = Facing::EAST; - break; - case Direction::EAST: - flipEdge = Facing::NORTH; - break; - case Direction::WEST: - flipEdge = Facing::SOUTH; - break; + case Direction::NORTH: + break; + case Direction::SOUTH: + flipEdge = Facing::EAST; + break; + case Direction::EAST: + flipEdge = Facing::NORTH; + break; + case Direction::WEST: + flipEdge = Facing::SOUTH; + break; } if ( ( skipEdge != Facing::NORTH ) && ( noCulling || tt->shouldRenderFace( level, x, y, z - 1, Facing::NORTH ) ) ) @@ -701,38 +724,42 @@ bool TileRenderer::tesselateBedInWorld( Tile* tt, int x, int y, int z ) bool TileRenderer::tesselateBrewingStandInWorld(BrewingStandTile *tt, int x, int y, int z) { - // bounding box first - setShape(7.0f / 16.0f, 0.0f, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); + // bounding box first + setShape(7.0f / 16.0f, 0.0f, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); - setFixedTexture(tt->getBaseTexture()); - setShape(9.0f / 16.0f, 0.0f, 5.0f / 16.0f, 15.0f / 16.0f, 2 / 16.0f, 11.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); - setShape(2.0f / 16.0f, 0.0f, 1.0f / 16.0f, 8.0f / 16.0f, 2 / 16.0f, 7.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); - setShape(2.0f / 16.0f, 0.0f, 9.0f / 16.0f, 8.0f / 16.0f, 2 / 16.0f, 15.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); + setFixedTexture(tt->getBaseTexture()); + + // Fix faceculling when attached to blocks + noCulling = true; + setShape(9.0f / 16.0f, 0.0f, 5.0f / 16.0f, 15.0f / 16.0f, 2 / 16.0f, 11.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); + setShape(2.0f / 16.0f, 0.0f, 1.0f / 16.0f, 8.0f / 16.0f, 2 / 16.0f, 7.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); + setShape(2.0f / 16.0f, 0.0f, 9.0f / 16.0f, 8.0f / 16.0f, 2 / 16.0f, 15.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); + noCulling = false; - clearFixedTexture(); + clearFixedTexture(); - Tesselator *t = Tesselator::getInstance(); + Tesselator *t = Tesselator::getInstance(); - float br; - if (SharedConstants::TEXTURE_LIGHTING) + float br; + if (SharedConstants::TEXTURE_LIGHTING) { - t->tex2(getLightColor(tt, level, x, y, z)); - br = 1; - } + t->tex2(getLightColor(tt, level, x, y, z)); + br = 1; + } else { - br = tt->getBrightness(level, x, y, z); - } - int col = tt->getColor(level, x, y, z); - float r = ((col >> 16) & 0xff) / 255.0f; - float g = ((col >> 8) & 0xff) / 255.0f; - float b = ((col) & 0xff) / 255.0f; + br = tt->getBrightness(level, x, y, z); + } + int col = tt->getColor(level, x, y, z); + float r = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; - t->color(br * r, br * g, br * b); + t->color(br * r, br * g, br * b); Icon *tex = getTexture(tt, 0, 0); @@ -740,91 +767,91 @@ bool TileRenderer::tesselateBrewingStandInWorld(BrewingStandTile *tt, int x, int float v0 = tex->getV0(true); float v1 = tex->getV1(true); - int data = level->getData(x, y, z); + int data = level->getData(x, y, z); - for (int arm = 0; arm < 3; arm++) + for (int arm = 0; arm < 3; arm++) { - float angle = arm * PI * 2.0f / 3.0f + PI * 0.5f; + float angle = arm * PI * 2.0f / 3.0f + PI * 0.5f; float u0 = tex->getU(8, true); float u1 = tex->getU1(true); - if ((data & (1 << arm)) != 0) + if ((data & (1 << arm)) != 0) { - u1 = tex->getU0(true); - } + u1 = tex->getU0(true); + } float x0 = x + 8.0f / 16.0f; float x1 = x + 8.0f / 16.0f + sin(angle) * 8.0f / 16.0f; float z0 = z + 8.0f / 16.0f; float z1 = z + 8.0f / 16.0f + cos(angle) * 8.0f / 16.0f; - t->vertexUV(x0, y + 1.0f, z0, u0, v0); - t->vertexUV(x0, y + 0.0f, z0, u0, v1); - t->vertexUV(x1, y + 0.0f, z1, u1, v1); - t->vertexUV(x1, y + 1.0f, z1, u1, v0); + t->vertexUV(x0, y + 1.0f, z0, u0, v0); + t->vertexUV(x0, y + 0.0f, z0, u0, v1); + t->vertexUV(x1, y + 0.0f, z1, u1, v1); + t->vertexUV(x1, y + 1.0f, z1, u1, v0); - t->vertexUV(x1, y + 1.0f, z1, u1, v0); - t->vertexUV(x1, y + 0.0f, z1, u1, v1); - t->vertexUV(x0, y + 0.0f, z0, u0, v1); - t->vertexUV(x0, y + 1.0f, z0, u0, v0); - } + t->vertexUV(x1, y + 1.0f, z1, u1, v0); + t->vertexUV(x1, y + 0.0f, z1, u1, v1); + t->vertexUV(x0, y + 0.0f, z0, u0, v1); + t->vertexUV(x0, y + 1.0f, z0, u0, v0); + } - tt->updateDefaultShape(); + tt->updateDefaultShape(); - return true; + return true; } bool TileRenderer::tesselateCauldronInWorld(CauldronTile *tt, int x, int y, int z) { - // bounding box first - tesselateBlockInWorld(tt, x, y, z); + // bounding box first + tesselateBlockInWorld(tt, x, y, z); - Tesselator *t = Tesselator::getInstance(); + Tesselator *t = Tesselator::getInstance(); - float br; - if (SharedConstants::TEXTURE_LIGHTING) + float br; + if (SharedConstants::TEXTURE_LIGHTING) { - t->tex2(getLightColor(tt, level, x, y, z)); - br = 1; - } + t->tex2(getLightColor(tt, level, x, y, z)); + br = 1; + } else { - br = tt->getBrightness(level, x, y, z); - } - int col = tt->getColor(level, x, y, z); - float r = ((col >> 16) & 0xff) / 255.0f; - float g = ((col >> 8) & 0xff) / 255.0f; - float b = ((col) & 0xff) / 255.0f; + br = tt->getBrightness(level, x, y, z); + } + int col = tt->getColor(level, x, y, z); + float r = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; - t->color(br * r, br * g, br * b); + t->color(br * r, br * g, br * b); - // render inside - Icon *insideTex = tt->getTexture(Facing::NORTH); - const float cWidth = ( 2.0f / 16.0f ) - ( 1.0f / 128.0f ); // 4J - Moved by 1/128th (smallest movement possible with our vertex storage) to remove gap at edge of cauldron - renderEast(tt, x - 1.0f + cWidth, y, z, insideTex); - renderWest(tt, x + 1.0f - cWidth, y, z, insideTex); - renderSouth(tt, x, y, z - 1.0f + cWidth, insideTex); - renderNorth(tt, x, y, z + 1.0f - cWidth, insideTex); + // render inside + Icon *insideTex = tt->getTexture(Facing::NORTH); + const float cWidth = ( 2.0f / 16.0f ) - ( 1.0f / 128.0f ); // 4J - Moved by 1/128th (smallest movement possible with our vertex storage) to remove gap at edge of cauldron + renderEast(tt, x - 1.0f + cWidth, y, z, insideTex); + renderWest(tt, x + 1.0f - cWidth, y, z, insideTex); + renderSouth(tt, x, y, z - 1.0f + cWidth, insideTex); + renderNorth(tt, x, y, z + 1.0f - cWidth, insideTex); - Icon *bottomTex = CauldronTile::getTexture(CauldronTile::TEXTURE_INSIDE); - renderFaceUp(tt, x, y - 1.0f + 4.0f / 16.0f, z, bottomTex); - renderFaceDown(tt, x, y + 1.0f - 12.0f / 16.0f, z, bottomTex); + Icon *bottomTex = CauldronTile::getTexture(CauldronTile::TEXTURE_INSIDE); + renderFaceUp(tt, x, y - 1.0f + 4.0f / 16.0f, z, bottomTex); + renderFaceDown(tt, x, y + 1.0f - 12.0f / 16.0f, z, bottomTex); - int waterLevel = level->getData(x, y, z); - if (waterLevel > 0) + int waterLevel = level->getData(x, y, z); + if (waterLevel > 0) { - Icon *liquidTex = LiquidTile::getTexture(LiquidTile::TEXTURE_WATER_STILL); + Icon *liquidTex = LiquidTile::getTexture(LiquidTile::TEXTURE_WATER_STILL); - if (waterLevel > 3) + if (waterLevel > 3) { - waterLevel = 3; - } + waterLevel = 3; + } - renderFaceUp(tt, x, y - 1.0f + (6.0f + waterLevel * 3.0f) / 16.0f, z, liquidTex); - } + renderFaceUp(tt, x, y - 1.0f + (6.0f + waterLevel * 3.0f) / 16.0f, z, liquidTex); + } - return true; + return true; } @@ -891,10 +918,10 @@ bool TileRenderer::tesselateFlowerPotInWorld(FlowerPotTile *tt, int x, int y, in plant = Tile::flower; break; case FlowerPotTile::TYPE_MUSHROOM_BROWN: - plant = Tile::mushroom1; + plant = Tile::mushroom_brown; break; case FlowerPotTile::TYPE_MUSHROOM_RED: - plant = Tile::mushroom2; + plant = Tile::mushroom_red; break; } @@ -1108,6 +1135,8 @@ float TileRenderer::tesselateAnvilPiece(AnvilTile *tt, int x, int y, int z, int return bottom + height; } + + bool TileRenderer::tesselateTorchInWorld( Tile* tt, int x, int y, int z ) { int dir = level->getData( x, y, z ); @@ -1153,6 +1182,184 @@ bool TileRenderer::tesselateTorchInWorld( Tile* tt, int x, int y, int z ) } +bool TileRenderer::tesselateRepeaterInWorld(RepeaterTile *tt, int x, int y, int z) +{ + int data = level->getData(x, y, z); + int dir = data & DiodeTile::DIRECTION_MASK; + int delay = (data & RepeaterTile::DELAY_MASK) >> RepeaterTile::DELAY_SHIFT; + + Tesselator *t = Tesselator::getInstance(); + + if (SharedConstants::TEXTURE_LIGHTING) + { + t->tex2(tt->getLightColor(level, x, y, z)); + t->color(1.0f, 1.0f, 1.0f); + } + else + { + float br = tt->getBrightness(level, x, y, z); + if (Tile::lightEmission[tt->id] > 0) br = 1.0f; + t->color(br, br, br); + } + + double h = -3.0f / 16.0f; + bool hasLockSignal = tt->isLocked(level, x, y, z, data); + double transmitterX = 0; + double transmitterZ = 0; + double receiverX = 0; + double receiverZ = 0; + + switch (dir) + { + case Direction::SOUTH: + receiverZ = -5.0f / 16.0f; + transmitterZ = RepeaterTile::DELAY_RENDER_OFFSETS[delay]; + break; + case Direction::NORTH: + receiverZ = 5.0f / 16.0f; + transmitterZ = -RepeaterTile::DELAY_RENDER_OFFSETS[delay]; + break; + case Direction::EAST: + receiverX = -5.0f / 16.0f; + transmitterX = RepeaterTile::DELAY_RENDER_OFFSETS[delay]; + break; + case Direction::WEST: + receiverX = 5.0f / 16.0f; + transmitterX = -RepeaterTile::DELAY_RENDER_OFFSETS[delay]; + break; + } + + // render transmitter + if (!hasLockSignal) + { + tesselateTorch((Tile *)tt, x + transmitterX, y + h, z + transmitterZ, 0, 0, 0); + } + else + { + Icon *lockTex = getTexture(Tile::unbreakable); + setFixedTexture(lockTex); + + float west = 2.0f; + float east = 14.0f; + float north = 7.0f; + float south = 9.0f; + + switch (dir) + { + case Direction::SOUTH: + case Direction::NORTH: + break; + case Direction::EAST: + case Direction::WEST: + west = 7.f; + east = 9.f; + north = 2.f; + south = 14.f; + break; + } + setShape(west / 16.0f + (float) transmitterX, 2.f / 16.0f, north / 16.0f + (float) transmitterZ, east / 16.0f + (float) transmitterX, 4.f / 16.0f, south / 16.0f + (float) transmitterZ); + double u0 = lockTex->getU(west); + double v0 = lockTex->getV(north); + double u1 = lockTex->getU(east); + double v1 = lockTex->getV(south); + t->vertexUV(x + west / 16.0f + transmitterX, y + 4.0f / 16.0f, z + north / 16.0f + transmitterZ, u0, v0); + t->vertexUV(x + west / 16.0f + transmitterX, y + 4.0f / 16.0f, z + south / 16.0f + transmitterZ, u0, v1); + t->vertexUV(x + east / 16.0f + transmitterX, y + 4.0f / 16.0f, z + south / 16.0f + transmitterZ, u1, v1); + t->vertexUV(x + east / 16.0f + transmitterX, y + 4.0f / 16.0f, z + north / 16.0f + transmitterZ, u1, v0); + tesselateBlockInWorld(tt, x, y, z); + setShape(0, 0, 0, 1, 2.0f / 16.0f, 1); + clearFixedTexture(); + } + + if (SharedConstants::TEXTURE_LIGHTING) + { + t->tex2(tt->getLightColor(level, x, y, z)); + t->color(1.0f, 1.0f, 1.0f); + } + else + { + float br = tt->getBrightness(level, x, y, z); + if (Tile::lightEmission[tt->id] > 0) br = 1.0f; + t->color(br, br, br); + } + + // render receiver + tesselateTorch(tt, x + receiverX, y + h, z + receiverZ, 0, 0, 0); + + // render floor + tesselateDiodeInWorld(tt, x, y, z); + + return true; +} + +bool TileRenderer::tesselateComparatorInWorld(ComparatorTile *tt, int x, int y, int z) +{ + Tesselator *t = Tesselator::getInstance(); + + if (SharedConstants::TEXTURE_LIGHTING) + { + t->tex2(tt->getLightColor(level, x, y, z)); + t->color(1.0f, 1.0f, 1.0f); + } + else + { + float br = tt->getBrightness(level, x, y, z); + if (Tile::lightEmission[tt->id] > 0) br = 1.0f; + t->color(br, br, br); + } + + int data = level->getData(x, y, z); + int dir = data & DirectionalTile::DIRECTION_MASK; + double extenderX = 0; + double extenderY = -3.0f / 16.0f; + double extenderZ = 0; + double inputXStep = 0; + double inputZStep = 0; + Icon *extenderTex; + + if (tt->isReversedOutputSignal(data)) + { + extenderTex = Tile::redstoneTorch_on->getTexture(Facing::DOWN); + } + else + { + extenderY -= 3 / 16.0f; + extenderTex = Tile::redstoneTorch_off->getTexture(Facing::DOWN); + } + + switch (dir) + { + case Direction::SOUTH: + extenderZ = -5.0f / 16.0f; + inputZStep = 1; + break; + case Direction::NORTH: + extenderZ = 5.0f / 16.0f; + inputZStep = -1; + break; + case Direction::EAST: + extenderX = -5.0f / 16.0f; + inputXStep = 1; + break; + case Direction::WEST: + extenderX = 5.0f / 16.0f; + inputXStep = -1; + break; + } + + // Render the two input torches + tesselateTorch((Tile *)tt, x + (4 / 16.0f * inputXStep) + (3 / 16.0f * inputZStep), y - 3 / 16.0f, z + (4 / 16.0f * inputZStep) + (3 / 16.0f * inputXStep), 0, 0, data); + tesselateTorch((Tile *)tt, x + (4 / 16.0f * inputXStep) + (-3 / 16.0f * inputZStep), y - 3 / 16.0f, z + (4 / 16.0f * inputZStep) + (-3 / 16.0f * inputXStep), 0, 0, data); + + setFixedTexture(extenderTex); + tesselateTorch((Tile *)tt, x + extenderX, y + extenderY, z + extenderZ, 0, 0, data); + clearFixedTexture(); + + tesselateDiodeInWorld((DiodeTile *)tt, x, y, z, dir); + + return true; +} + bool TileRenderer::tesselateDiodeInWorld(DiodeTile *tt, int x, int y, int z) { Tesselator *t = Tesselator::getInstance(); @@ -1183,43 +1390,9 @@ void TileRenderer::tesselateDiodeInWorld( DiodeTile* tt, int x, int y, int z, in int data = level->getData(x, y, z); + // 4J-JEV - It's now been moved. // 4J Stu - This block gets moved in a later version, but we don't need that yet - // BEGIN TORCH SECTION - { - int dir = data & DiodeTile::DIRECTION_MASK; - int delay = ( data & DiodeTile::DELAY_MASK ) >> DiodeTile::DELAY_SHIFT; - float h = -3.0f / 16.0f; - float transmitterX = 0.0f; - float transmitterZ = 0.0f; - float receiverX = 0.0f; - float receiverZ = 0.0f; - - switch ( dir ) - { - case Direction::SOUTH: - receiverZ = -5.0f / 16.0f; - transmitterZ = DiodeTile::DELAY_RENDER_OFFSETS[delay]; - break; - case Direction::NORTH: - receiverZ = 5.0f / 16.0f; - transmitterZ = -DiodeTile::DELAY_RENDER_OFFSETS[delay]; - break; - case Direction::EAST: - receiverX = -5.0f / 16.0f; - transmitterX = DiodeTile::DELAY_RENDER_OFFSETS[delay]; - break; - case Direction::WEST: - receiverX = 5.0f / 16.0f; - transmitterX = -DiodeTile::DELAY_RENDER_OFFSETS[delay]; - break; - } - // render transmitter - tesselateTorch( tt, x + transmitterX, y + h, z + transmitterZ, 0.0f, 0.0f, 0 ); - // render receiver - tesselateTorch( tt, x + receiverX, y + h, z + receiverZ, 0.0f, 0.0f, 0 ); - } - // END TORCH SECTION Icon *tex = getTexture(tt, Facing::UP, data); float u0 = tex->getU0(true); @@ -1291,42 +1464,42 @@ bool TileRenderer::tesselatePistonBaseInWorld( Tile* tt, int x, int y, int z, bo { switch ( facing ) { - case Facing::DOWN: - northFlip = FLIP_180; - southFlip = FLIP_180; - eastFlip = FLIP_180; - westFlip = FLIP_180; - setShape( 0.0f, thickness, 0.0f, 1.0f, 1.0f, 1.0f ); - break; - case Facing::UP: - setShape( 0.0f, 0.0f, 0.0f, 1.0f, 1.0f - thickness, 1.0f ); - break; - case Facing::NORTH: - eastFlip = FLIP_CW; - westFlip = FLIP_CCW; - setShape( 0.0f, 0.0f, thickness, 1.0f, 1.0f, 1.0f ); - break; - case Facing::SOUTH: - eastFlip = FLIP_CCW; - westFlip = FLIP_CW; - upFlip = FLIP_180; - downFlip = FLIP_180; - setShape( 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f - thickness ); - break; - case Facing::WEST: - northFlip = FLIP_CW; - southFlip = FLIP_CCW; - upFlip = FLIP_CCW; - downFlip = FLIP_CW; - setShape( thickness, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f ); - break; - case Facing::EAST: - northFlip = FLIP_CCW; - southFlip = FLIP_CW; - upFlip = FLIP_CW; - downFlip = FLIP_CCW; - setShape( 0.0f, 0.0f, 0.0f, 1.0f - thickness, 1.0f, 1.0f ); - break; + case Facing::DOWN: + northFlip = FLIP_180; + southFlip = FLIP_180; + eastFlip = FLIP_180; + westFlip = FLIP_180; + setShape( 0.0f, thickness, 0.0f, 1.0f, 1.0f, 1.0f ); + break; + case Facing::UP: + setShape( 0.0f, 0.0f, 0.0f, 1.0f, 1.0f - thickness, 1.0f ); + break; + case Facing::NORTH: + eastFlip = FLIP_CW; + westFlip = FLIP_CCW; + setShape( 0.0f, 0.0f, thickness, 1.0f, 1.0f, 1.0f ); + break; + case Facing::SOUTH: + eastFlip = FLIP_CCW; + westFlip = FLIP_CW; + upFlip = FLIP_180; + downFlip = FLIP_180; + setShape( 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f - thickness ); + break; + case Facing::WEST: + northFlip = FLIP_CW; + southFlip = FLIP_CCW; + upFlip = FLIP_CCW; + downFlip = FLIP_CW; + setShape( thickness, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f ); + break; + case Facing::EAST: + northFlip = FLIP_CCW; + southFlip = FLIP_CW; + upFlip = FLIP_CW; + downFlip = FLIP_CCW; + setShape( 0.0f, 0.0f, 0.0f, 1.0f - thickness, 1.0f, 1.0f ); + break; } // weird way of telling the piston to use the // "inside" texture for the forward-facing edge @@ -1344,52 +1517,52 @@ bool TileRenderer::tesselatePistonBaseInWorld( Tile* tt, int x, int y, int z, bo { switch ( facing ) { - case Facing::DOWN: - northFlip = FLIP_180; - southFlip = FLIP_180; - eastFlip = FLIP_180; - westFlip = FLIP_180; - break; - case Facing::UP: - break; - case Facing::NORTH: - eastFlip = FLIP_CW; - westFlip = FLIP_CCW; - break; - case Facing::SOUTH: - eastFlip = FLIP_CCW; - westFlip = FLIP_CW; - upFlip = FLIP_180; - downFlip = FLIP_180; - break; - case Facing::WEST: - northFlip = FLIP_CW; - southFlip = FLIP_CCW; - upFlip = FLIP_CCW; - downFlip = FLIP_CW; - break; - case Facing::EAST: - northFlip = FLIP_CCW; - southFlip = FLIP_CW; - upFlip = FLIP_CW; - downFlip = FLIP_CCW; - break; - } - tesselateBlockInWorld( tt, x, y, z ); - northFlip = FLIP_NONE; - southFlip = FLIP_NONE; - eastFlip = FLIP_NONE; - westFlip = FLIP_NONE; - upFlip = FLIP_NONE; - downFlip = FLIP_NONE; - } - - return true; - + case Facing::DOWN: + northFlip = FLIP_180; + southFlip = FLIP_180; + eastFlip = FLIP_180; + westFlip = FLIP_180; + break; + case Facing::UP: + break; + case Facing::NORTH: + eastFlip = FLIP_CW; + westFlip = FLIP_CCW; + break; + case Facing::SOUTH: + eastFlip = FLIP_CCW; + westFlip = FLIP_CW; + upFlip = FLIP_180; + downFlip = FLIP_180; + break; + case Facing::WEST: + northFlip = FLIP_CW; + southFlip = FLIP_CCW; + upFlip = FLIP_CCW; + downFlip = FLIP_CW; + break; + case Facing::EAST: + northFlip = FLIP_CCW; + southFlip = FLIP_CW; + upFlip = FLIP_CW; + downFlip = FLIP_CCW; + break; + } + tesselateBlockInWorld( tt, x, y, z ); + northFlip = FLIP_NONE; + southFlip = FLIP_NONE; + eastFlip = FLIP_NONE; + westFlip = FLIP_NONE; + upFlip = FLIP_NONE; + downFlip = FLIP_NONE; + } + + return true; + } void TileRenderer::renderPistonArmUpDown( float x0, float x1, float y0, float y1, float z0, float z1, float br, - float armLengthPixels ) + float armLengthPixels ) { Icon *armTex = PistonBaseTile::getTexture(PistonBaseTile::EDGE_TEX); if (hasFixedTexture()) armTex = fixedTexture; @@ -1412,7 +1585,7 @@ void TileRenderer::renderPistonArmUpDown( float x0, float x1, float y0, float y1 } void TileRenderer::renderPistonArmNorthSouth( float x0, float x1, float y0, float y1, float z0, float z1, - float br, float armLengthPixels ) + float br, float armLengthPixels ) { Icon *armTex = PistonBaseTile::getTexture(PistonBaseTile::EDGE_TEX); if (hasFixedTexture()) armTex = fixedTexture; @@ -1434,7 +1607,7 @@ void TileRenderer::renderPistonArmNorthSouth( float x0, float x1, float y0, floa } void TileRenderer::renderPistonArmEastWest( float x0, float x1, float y0, float y1, float z0, float z1, float br, - float armLengthPixels ) + float armLengthPixels ) { Icon *armTex = PistonBaseTile::getTexture(PistonBaseTile::EDGE_TEX); if (hasFixedTexture()) armTex = fixedTexture; @@ -1477,112 +1650,112 @@ bool TileRenderer::tesselatePistonExtensionInWorld( Tile* tt, int x, int y, int Tesselator* t = Tesselator::getInstance(); switch ( facing ) { - case Facing::DOWN: - northFlip = FLIP_180; - southFlip = FLIP_180; - eastFlip = FLIP_180; - westFlip = FLIP_180; - setShape( 0.0f, 0.0f, 0.0f, 1.0f, thickness, 1.0f ); - tesselateBlockInWorld( tt, x, y, z ); - - t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld - renderPistonArmUpDown( x + leftEdge, x + rightEdge, y + thickness, y + thickness + armLength, - z + rightEdge, z + rightEdge, br * 0.8f, armLengthPixels ); - renderPistonArmUpDown( x + rightEdge, x + leftEdge, y + thickness, y + thickness + armLength, z + leftEdge, - z + leftEdge, br * 0.8f, armLengthPixels ); - renderPistonArmUpDown( x + leftEdge, x + leftEdge, y + thickness, y + thickness + armLength, z + leftEdge, - z + rightEdge, br * 0.6f, armLengthPixels ); - renderPistonArmUpDown( x + rightEdge, x + rightEdge, y + thickness, y + thickness + armLength, - z + rightEdge, z + leftEdge, br * 0.6f, armLengthPixels ); + case Facing::DOWN: + northFlip = FLIP_180; + southFlip = FLIP_180; + eastFlip = FLIP_180; + westFlip = FLIP_180; + setShape( 0.0f, 0.0f, 0.0f, 1.0f, thickness, 1.0f ); + tesselateBlockInWorld( tt, x, y, z ); - break; - case Facing::UP: - setShape( 0.0f, 1.0f - thickness, 0.0f, 1.0f, 1.0f, 1.0f ); - tesselateBlockInWorld( tt, x, y, z ); - - t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld - renderPistonArmUpDown( x + leftEdge, x + rightEdge, y - thickness + 1.0f - armLength, y - thickness + 1.0f, - z + rightEdge, z + rightEdge, br * 0.8f, armLengthPixels ); - renderPistonArmUpDown( x + rightEdge, x + leftEdge, y - thickness + 1.0f - armLength, y - thickness + 1.0f, - z + leftEdge, z + leftEdge, br * 0.8f, armLengthPixels ); - renderPistonArmUpDown( x + leftEdge, x + leftEdge, y - thickness + 1.0f - armLength, y - thickness + 1.0f, - z + leftEdge, z + rightEdge, br * 0.6f, armLengthPixels ); - renderPistonArmUpDown( x + rightEdge, x + rightEdge, y - thickness + 1.0f - armLength, - y - thickness + 1.0f, z + rightEdge, z + leftEdge, br * 0.6f, armLengthPixels ); - break; - case Facing::NORTH: - eastFlip = FLIP_CW; - westFlip = FLIP_CCW; - setShape( 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, thickness ); - tesselateBlockInWorld( tt, x, y, z ); - - t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld - renderPistonArmNorthSouth( x + leftEdge, x + leftEdge, y + rightEdge, y + leftEdge, z + thickness, - z + thickness + armLength, br * 0.6f, armLengthPixels ); - renderPistonArmNorthSouth( x + rightEdge, x + rightEdge, y + leftEdge, y + rightEdge, z + thickness, - z + thickness + armLength, br * 0.6f, armLengthPixels ); - renderPistonArmNorthSouth( x + leftEdge, x + rightEdge, y + leftEdge, y + leftEdge, z + thickness, - z + thickness + armLength, br * 0.5f, armLengthPixels ); - renderPistonArmNorthSouth( x + rightEdge, x + leftEdge, y + rightEdge, y + rightEdge, z + thickness, - z + thickness + armLength, br, armLengthPixels ); - break; - case Facing::SOUTH: - eastFlip = FLIP_CCW; - westFlip = FLIP_CW; - upFlip = FLIP_180; - downFlip = FLIP_180; - setShape( 0.0f, 0.0f, 1.0f - thickness, 1.0f, 1.0f, 1.0f ); - tesselateBlockInWorld( tt, x, y, z ); - - t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld - renderPistonArmNorthSouth( x + leftEdge, x + leftEdge, y + rightEdge, y + leftEdge, - z - thickness + 1.0f - armLength, z - thickness + 1.0f, br * 0.6f, - armLengthPixels ); - renderPistonArmNorthSouth( x + rightEdge, x + rightEdge, y + leftEdge, y + rightEdge, - z - thickness + 1.0f - armLength, z - thickness + 1.0f, br * 0.6f, - armLengthPixels ); - renderPistonArmNorthSouth( x + leftEdge, x + rightEdge, y + leftEdge, y + leftEdge, - z - thickness + 1.0f - armLength, z - thickness + 1.0f, br * 0.5f, - armLengthPixels ); - renderPistonArmNorthSouth( x + rightEdge, x + leftEdge, y + rightEdge, y + rightEdge, - z - thickness + 1.0f - armLength, z - thickness + 1.0f, br, armLengthPixels ); - break; - case Facing::WEST: - northFlip = FLIP_CW; - southFlip = FLIP_CCW; - upFlip = FLIP_CCW; - downFlip = FLIP_CW; - setShape( 0.0f, 0.0f, 0.0f, thickness, 1.0f, 1.0f ); - tesselateBlockInWorld( tt, x, y, z ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld - - t->tex2( getLightColor(tt, level, x, y , z ) ); - renderPistonArmEastWest( x + thickness, x + thickness + armLength, y + leftEdge, y + leftEdge, - z + rightEdge, z + leftEdge, br * 0.5f, armLengthPixels ); - renderPistonArmEastWest( x + thickness, x + thickness + armLength, y + rightEdge, y + rightEdge, - z + leftEdge, z + rightEdge, br, armLengthPixels ); - renderPistonArmEastWest( x + thickness, x + thickness + armLength, y + leftEdge, y + rightEdge, - z + leftEdge, z + leftEdge, br * 0.6f, armLengthPixels ); - renderPistonArmEastWest( x + thickness, x + thickness + armLength, y + rightEdge, y + leftEdge, - z + rightEdge, z + rightEdge, br * 0.6f, armLengthPixels ); - break; - case Facing::EAST: - northFlip = FLIP_CCW; - southFlip = FLIP_CW; - upFlip = FLIP_CW; - downFlip = FLIP_CCW; - setShape( 1.0f - thickness, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f ); - tesselateBlockInWorld( tt, x, y, z ); - - t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld - renderPistonArmEastWest( x - thickness + 1.0f - armLength, x - thickness + 1.0f, y + leftEdge, - y + leftEdge, z + rightEdge, z + leftEdge, br * 0.5f, armLengthPixels ); - renderPistonArmEastWest( x - thickness + 1.0f - armLength, x - thickness + 1.0f, y + rightEdge, - y + rightEdge, z + leftEdge, z + rightEdge, br, armLengthPixels ); - renderPistonArmEastWest( x - thickness + 1.0f - armLength, x - thickness + 1.0f, y + leftEdge, - y + rightEdge, z + leftEdge, z + leftEdge, br * 0.6f, armLengthPixels ); - renderPistonArmEastWest( x - thickness + 1.0f - armLength, x - thickness + 1.0f, y + rightEdge, - y + leftEdge, z + rightEdge, z + rightEdge, br * 0.6f, armLengthPixels ); - break; + t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld + renderPistonArmUpDown( x + leftEdge, x + rightEdge, y + thickness, y + thickness + armLength, + z + rightEdge, z + rightEdge, br * 0.8f, armLengthPixels ); + renderPistonArmUpDown( x + rightEdge, x + leftEdge, y + thickness, y + thickness + armLength, z + leftEdge, + z + leftEdge, br * 0.8f, armLengthPixels ); + renderPistonArmUpDown( x + leftEdge, x + leftEdge, y + thickness, y + thickness + armLength, z + leftEdge, + z + rightEdge, br * 0.6f, armLengthPixels ); + renderPistonArmUpDown( x + rightEdge, x + rightEdge, y + thickness, y + thickness + armLength, + z + rightEdge, z + leftEdge, br * 0.6f, armLengthPixels ); + + break; + case Facing::UP: + setShape( 0.0f, 1.0f - thickness, 0.0f, 1.0f, 1.0f, 1.0f ); + tesselateBlockInWorld( tt, x, y, z ); + + t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld + renderPistonArmUpDown( x + leftEdge, x + rightEdge, y - thickness + 1.0f - armLength, y - thickness + 1.0f, + z + rightEdge, z + rightEdge, br * 0.8f, armLengthPixels ); + renderPistonArmUpDown( x + rightEdge, x + leftEdge, y - thickness + 1.0f - armLength, y - thickness + 1.0f, + z + leftEdge, z + leftEdge, br * 0.8f, armLengthPixels ); + renderPistonArmUpDown( x + leftEdge, x + leftEdge, y - thickness + 1.0f - armLength, y - thickness + 1.0f, + z + leftEdge, z + rightEdge, br * 0.6f, armLengthPixels ); + renderPistonArmUpDown( x + rightEdge, x + rightEdge, y - thickness + 1.0f - armLength, + y - thickness + 1.0f, z + rightEdge, z + leftEdge, br * 0.6f, armLengthPixels ); + break; + case Facing::NORTH: + eastFlip = FLIP_CW; + westFlip = FLIP_CCW; + setShape( 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, thickness ); + tesselateBlockInWorld( tt, x, y, z ); + + t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld + renderPistonArmNorthSouth( x + leftEdge, x + leftEdge, y + rightEdge, y + leftEdge, z + thickness, + z + thickness + armLength, br * 0.6f, armLengthPixels ); + renderPistonArmNorthSouth( x + rightEdge, x + rightEdge, y + leftEdge, y + rightEdge, z + thickness, + z + thickness + armLength, br * 0.6f, armLengthPixels ); + renderPistonArmNorthSouth( x + leftEdge, x + rightEdge, y + leftEdge, y + leftEdge, z + thickness, + z + thickness + armLength, br * 0.5f, armLengthPixels ); + renderPistonArmNorthSouth( x + rightEdge, x + leftEdge, y + rightEdge, y + rightEdge, z + thickness, + z + thickness + armLength, br, armLengthPixels ); + break; + case Facing::SOUTH: + eastFlip = FLIP_CCW; + westFlip = FLIP_CW; + upFlip = FLIP_180; + downFlip = FLIP_180; + setShape( 0.0f, 0.0f, 1.0f - thickness, 1.0f, 1.0f, 1.0f ); + tesselateBlockInWorld( tt, x, y, z ); + + t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld + renderPistonArmNorthSouth( x + leftEdge, x + leftEdge, y + rightEdge, y + leftEdge, + z - thickness + 1.0f - armLength, z - thickness + 1.0f, br * 0.6f, + armLengthPixels ); + renderPistonArmNorthSouth( x + rightEdge, x + rightEdge, y + leftEdge, y + rightEdge, + z - thickness + 1.0f - armLength, z - thickness + 1.0f, br * 0.6f, + armLengthPixels ); + renderPistonArmNorthSouth( x + leftEdge, x + rightEdge, y + leftEdge, y + leftEdge, + z - thickness + 1.0f - armLength, z - thickness + 1.0f, br * 0.5f, + armLengthPixels ); + renderPistonArmNorthSouth( x + rightEdge, x + leftEdge, y + rightEdge, y + rightEdge, + z - thickness + 1.0f - armLength, z - thickness + 1.0f, br, armLengthPixels ); + break; + case Facing::WEST: + northFlip = FLIP_CW; + southFlip = FLIP_CCW; + upFlip = FLIP_CCW; + downFlip = FLIP_CW; + setShape( 0.0f, 0.0f, 0.0f, thickness, 1.0f, 1.0f ); + tesselateBlockInWorld( tt, x, y, z ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld + + t->tex2( getLightColor(tt, level, x, y , z ) ); + renderPistonArmEastWest( x + thickness, x + thickness + armLength, y + leftEdge, y + leftEdge, + z + rightEdge, z + leftEdge, br * 0.5f, armLengthPixels ); + renderPistonArmEastWest( x + thickness, x + thickness + armLength, y + rightEdge, y + rightEdge, + z + leftEdge, z + rightEdge, br, armLengthPixels ); + renderPistonArmEastWest( x + thickness, x + thickness + armLength, y + leftEdge, y + rightEdge, + z + leftEdge, z + leftEdge, br * 0.6f, armLengthPixels ); + renderPistonArmEastWest( x + thickness, x + thickness + armLength, y + rightEdge, y + leftEdge, + z + rightEdge, z + rightEdge, br * 0.6f, armLengthPixels ); + break; + case Facing::EAST: + northFlip = FLIP_CCW; + southFlip = FLIP_CW; + upFlip = FLIP_CW; + downFlip = FLIP_CCW; + setShape( 1.0f - thickness, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f ); + tesselateBlockInWorld( tt, x, y, z ); + + t->tex2( getLightColor(tt, level, x, y , z ) ); // 4J added - renderPistonArmDown doesn't set its own tex2 so just inherited from previous tesselateBlockInWorld + renderPistonArmEastWest( x - thickness + 1.0f - armLength, x - thickness + 1.0f, y + leftEdge, + y + leftEdge, z + rightEdge, z + leftEdge, br * 0.5f, armLengthPixels ); + renderPistonArmEastWest( x - thickness + 1.0f - armLength, x - thickness + 1.0f, y + rightEdge, + y + rightEdge, z + leftEdge, z + rightEdge, br, armLengthPixels ); + renderPistonArmEastWest( x - thickness + 1.0f - armLength, x - thickness + 1.0f, y + leftEdge, + y + rightEdge, z + leftEdge, z + leftEdge, br * 0.6f, armLengthPixels ); + renderPistonArmEastWest( x - thickness + 1.0f - armLength, x - thickness + 1.0f, y + rightEdge, + y + leftEdge, z + rightEdge, z + rightEdge, br * 0.6f, armLengthPixels ); + break; } northFlip = FLIP_NONE; southFlip = FLIP_NONE; @@ -1606,7 +1779,7 @@ bool TileRenderer::tesselateLeverInWorld( Tile* tt, int x, int y, int z ) Tesselator* t = Tesselator::getInstance(); bool hadFixed = hasFixedTexture(); - if (!hadFixed) this->setFixedTexture(getTexture(Tile::stoneBrick)); + if (!hadFixed) this->setFixedTexture(getTexture(Tile::cobblestone)); float w1 = 4.0f / 16.0f; float w2 = 3.0f / 16.0f; float h = 3.0f / 16.0f; @@ -2401,82 +2574,82 @@ bool TileRenderer::tesselateFireInWorld( FireTile* tt, int x, int y, int z ) if ( Tile::fire->canBurn( level, x - 1, y, z ) ) { t->vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v0 ) ); + 1.0f ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v1 ) ); + 1.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v0 ) ); + 0.0f ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v0 ) ); + 0.0f ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v1 ) ); + 1.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v0 ) ); + 1.0f ), ( float )( u1 ), ( float )( v0 ) ); } if ( Tile::fire->canBurn( level, x + 1, y, z ) ) { t->vertexUV( ( float )( x + 1 - r ), ( float )( y + h + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v0 ) ); + 0.0f ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1 - 0 ), ( float )( y + 0 + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1 - 0 ), ( float )( y + 0 + yo ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v1 ) ); + 1.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1 - r ), ( float )( y + h + yo ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v0 ) ); + 1.0f ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1.0f - r ), ( float )( y + h + yo ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v0 ) ); + 1.0f ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1.0f - 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v1 ) ); + 1.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1.0f - 0 ), ( float )( y + 0.0f + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1.0f - r ), ( float )( y + h + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v0 ) ); + 0.0f ), ( float )( u0 ), ( float )( v0 ) ); } if ( Tile::fire->canBurn( level, x, y, z - 1 ) ) { t->vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + - r ), ( float )( u1 ), ( float )( v0 ) ); + r ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 0.0f ), ( float )( u1 ), ( float )( v1 ) ); + 0.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + - r ), ( float )( u0 ), ( float )( v0 ) ); + r ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + - r ), ( float )( u0 ), ( float )( v0 ) ); + r ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 0.0f ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + - 0.0f ), ( float )( u1 ), ( float )( v1 ) ); + 0.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + - r ), ( float )( u1 ), ( float )( v0 ) ); + r ), ( float )( u1 ), ( float )( v0 ) ); } if ( Tile::fire->canBurn( level, x, y, z + 1 ) ) { t->vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f - - r ), ( float )( u0 ), ( float )( v0 ) ); + r ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f - - 0.0f ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f - - 0.0f ), ( float )( u1 ), ( float )( v1 ) ); + 0.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f - - r ), ( float )( u1 ), ( float )( v0 ) ); + r ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f - - r ), ( float )( u1 ), ( float )( v0 ) ); + r ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f - - 0.0f ), ( float )( u1 ), ( float )( v1 ) ); + 0.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f - - 0.0f ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f - - r ), ( float )( u0 ), ( float )( v0 ) ); + r ), ( float )( u0 ), ( float )( v0 ) ); } if ( Tile::fire->canBurn( level, x, y + 1.0f, z ) ) { @@ -2502,13 +2675,13 @@ bool TileRenderer::tesselateFireInWorld( FireTile* tt, int x, int y, int z ) if ( ( ( x + y + z ) & 1 ) == 0 ) { t->vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + - 0 ), ( float )( u1 ), ( float )( v0 ) ); + 0 ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + - 0 ), ( float )( u1 ), ( float )( v1 ) ); + 0 ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + - 1 ), ( float )( u0 ), ( float )( v1 ) ); + 1 ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + - 1 ), ( float )( u0 ), ( float )( v0 ) ); + 1 ), ( float )( u0 ), ( float )( v0 ) ); tex = secondTex; u0 = tex->getU0(true); @@ -2517,24 +2690,24 @@ bool TileRenderer::tesselateFireInWorld( FireTile* tt, int x, int y, int z ) v1 = tex->getV1(true); t->vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v0 ) ); + 1.0f ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x1 ), ( float )( y + 0.0f ), ( float )( z + - 1.0f ), ( float )( u1 ), ( float )( v1 ) ); + 1.0f ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x1 ), ( float )( y + 0.0f ), ( float )( z + - 0 ), ( float )( u0 ), ( float )( v1 ) ); + 0 ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + - 0 ), ( float )( u0 ), ( float )( v0 ) ); + 0 ), ( float )( u0 ), ( float )( v0 ) ); } else { t->vertexUV( ( float )( x + 0.0f ), ( float )( y + - h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) ); + h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + - 0.0f ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) ); + 0.0f ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + - 0.0f ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + - h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) ); + h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) ); tex = secondTex; u0 = tex->getU0(true); @@ -2543,13 +2716,13 @@ bool TileRenderer::tesselateFireInWorld( FireTile* tt, int x, int y, int z ) v1 = tex->getV1(true); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + - h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) ); + h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1.0f ), ( float )( y + - 0.0f ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) ); + 0.0f ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + - 0.0f ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) ); + 0.0f ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0.0f ), ( float )( y + - h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) ); + h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) ); } } } @@ -2562,7 +2735,7 @@ bool TileRenderer::tesselateDustInWorld( Tile* tt, int x, int y, int z ) { Tesselator* t = Tesselator::getInstance(); - int data = level->getData( x, y, z ); + int data = level->getData( x, y, z ); Icon *crossTexture = RedStoneDustTile::getTexture(RedStoneDustTile::TEXTURE_CROSS); Icon *lineTexture = RedStoneDustTile::getTexture(RedStoneDustTile::TEXTURE_LINE); Icon *crossTextureOverlay = RedStoneDustTile::getTexture(RedStoneDustTile::TEXTURE_CROSS_OVERLAY); @@ -2622,30 +2795,30 @@ bool TileRenderer::tesselateDustInWorld( Tile* tt, int x, int y, int z ) bool w = RedStoneDustTile::shouldConnectTo( level, x - 1, y, z, Direction::WEST ) || ( !level->isSolidBlockingTile( x - 1, y, z ) && RedStoneDustTile::shouldConnectTo( level, x - 1, y - 1, z, - Direction::UNDEFINED ) ); + Direction::UNDEFINED ) ); bool e = RedStoneDustTile::shouldConnectTo( level, x + 1, y, z, Direction::EAST ) || ( !level->isSolidBlockingTile( x + 1, y, z ) && RedStoneDustTile::shouldConnectTo( level, x + 1, y - 1, z, - Direction::UNDEFINED ) ); + Direction::UNDEFINED ) ); bool n = RedStoneDustTile::shouldConnectTo( level, x, y, z - 1, Direction::NORTH ) || ( !level->isSolidBlockingTile( x, y, z - 1 ) && RedStoneDustTile::shouldConnectTo( level, x, y - 1, z - 1, - Direction::UNDEFINED ) ); + Direction::UNDEFINED ) ); bool s = RedStoneDustTile::shouldConnectTo( level, x, y, z + 1, Direction::SOUTH ) || ( !level->isSolidBlockingTile( x, y, z + 1 ) && RedStoneDustTile::shouldConnectTo( level, x, y - 1, z + 1, - Direction::UNDEFINED ) ); + Direction::UNDEFINED ) ); if ( !level->isSolidBlockingTile( x, y + 1, z ) ) { if ( level->isSolidBlockingTile( x - 1, y, z ) && RedStoneDustTile::shouldConnectTo( level, x - 1, y + 1, z, - Direction::UNDEFINED ) ) w - = true; + Direction::UNDEFINED ) ) w + = true; if ( level->isSolidBlockingTile( x + 1, y, z ) && RedStoneDustTile::shouldConnectTo( level, x + 1, y + 1, z, - Direction::UNDEFINED ) ) e - = true; + Direction::UNDEFINED ) ) e + = true; if ( level->isSolidBlockingTile( x, y, z - 1 ) && RedStoneDustTile::shouldConnectTo( level, x, y + 1, z - 1, - Direction::UNDEFINED ) ) n - = true; + Direction::UNDEFINED ) ) n + = true; if ( level->isSolidBlockingTile( x, y, z + 1 ) && RedStoneDustTile::shouldConnectTo( level, x, y + 1, z + 1, - Direction::UNDEFINED ) ) s - = true; + Direction::UNDEFINED ) ) s + = true; } float x0 = ( float )( x + 0.0f ); float x1 = ( float )( x + 1.0f ); @@ -2658,7 +2831,7 @@ bool TileRenderer::tesselateDustInWorld( Tile* tt, int x, int y, int z ) if ( pic == 0 ) { -// if ( e || n || s || w ) + // if ( e || n || s || w ) int u0 = 0; int v0 = 0; int u1 = SharedConstants::WORLD_RESOLUTION; @@ -2902,46 +3075,46 @@ bool TileRenderer::tesselateLadderInWorld( Tile* tt, int x, int y, int z ) if ( face == 5 ) { t->vertexUV( ( float )( x + r ), ( float )( y + 1 + o ), ( float )( z + 1 + - o ), ( float )( u0 ), ( float )( v0 ) ); + o ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + r ), ( float )( y + 0 - o ), ( float )( z + 1 + - o ), ( float )( u0 ), ( float )( v1 ) ); + o ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + r ), ( float )( y + 0 - o ), ( float )( z + 0 - - o ), ( float )( u1 ), ( float )( v1 ) ); + o ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + r ), ( float )( y + 1 + o ), ( float )( z + 0 - - o ), ( float )( u1 ), ( float )( v0 ) ); + o ), ( float )( u1 ), ( float )( v0 ) ); } if ( face == 4 ) { t->vertexUV( ( float )( x + 1 - r ), ( float )( y + 0 - o ), ( float )( z + 1 + - o ), ( float )( u1 ), ( float )( v1 ) ); + o ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1 - r ), ( float )( y + 1 + o ), ( float )( z + 1 + - o ), ( float )( u1 ), ( float )( v0 ) ); + o ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1 - r ), ( float )( y + 1 + o ), ( float )( z + 0 - - o ), ( float )( u0 ), ( float )( v0 ) ); + o ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1 - r ), ( float )( y + 0 - o ), ( float )( z + 0 - - o ), ( float )( u0 ), ( float )( v1 ) ); + o ), ( float )( u0 ), ( float )( v1 ) ); } if ( face == 3 ) { t->vertexUV( ( float )( x + 1 + o ), ( float )( y + 0 - o ), ( float )( z + - r ), ( float )( u1 ), ( float )( v1 ) ); + r ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 1 + o ), ( float )( y + 1 + o ), ( float )( z + - r ), ( float )( u1 ), ( float )( v0 ) ); + r ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 0 - o ), ( float )( y + 1 + o ), ( float )( z + - r ), ( float )( u0 ), ( float )( v0 ) ); + r ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 0 - o ), ( float )( y + 0 - o ), ( float )( z + - r ), ( float )( u0 ), ( float )( v1 ) ); + r ), ( float )( u0 ), ( float )( v1 ) ); } if ( face == 2 ) { t->vertexUV( ( float )( x + 1 + o ), ( float )( y + 1 + o ), ( float )( z + 1 - - r ), ( float )( u0 ), ( float )( v0 ) ); + r ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + 1 + o ), ( float )( y + 0 - o ), ( float )( z + 1 - - r ), ( float )( u0 ), ( float )( v1 ) ); + r ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0 - o ), ( float )( y + 0 - o ), ( float )( z + 1 - - r ), ( float )( u1 ), ( float )( v1 ) ); + r ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + 0 - o ), ( float )( y + 1 + o ), ( float )( z + 1 - - r ), ( float )( u1 ), ( float )( v0 ) ); + r ), ( float )( u1 ), ( float )( v0 ) ); } return true; @@ -3042,6 +3215,418 @@ bool TileRenderer::tesselateVineInWorld( Tile* tt, int x, int y, int z ) return true; } +bool TileRenderer::tesselateThinPaneInWorld(Tile *tt, int x, int y, int z) +{ + int depth = level->getMaxBuildHeight(); + Tesselator *t = Tesselator::getInstance(); + + t->tex2(tt->getLightColor(level, x, y, z)); + int col = tt->getColor(level, x, y, z); + float r = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + if (GameRenderer::anaglyph3d) + { + float cr = (r * 30 + g * 59 + b * 11) / 100; + float cg = (r * 30 + g * 70) / (100); + float cb = (r * 30 + b * 70) / (100); + + r = cr; + g = cg; + b = cb; + } + t->color(r, g, b); + + Icon *tex; + Icon *edgeTex; + + bool stained = dynamic_cast(tt) != NULL; + if (hasFixedTexture()) + { + tex = fixedTexture; + edgeTex = fixedTexture; + } + else + { + int data = level->getData(x, y, z); + tex = getTexture(tt, 0, data); + edgeTex = (stained) ? ((StainedGlassPaneBlock *) tt)->getEdgeTexture(data) : ((ThinFenceTile *) tt)->getEdgeTexture(); + } + + double u0 = tex->getU0(); + double iu0 = tex->getU(7); + double iu1 = tex->getU(9); + double u1 = tex->getU1(); + double v0 = tex->getV0(); + double v1 = tex->getV1(); + + double eiu0 = edgeTex->getU(7); + double eiu1 = edgeTex->getU(9); + double ev0 = edgeTex->getV0(); + double ev1 = edgeTex->getV1(); + double eiv0 = edgeTex->getV(7); + double eiv1 = edgeTex->getV(9); + + double x0 = x; + double x1 = x + 1; + double z0 = z; + double z1 = z + 1; + double ix0 = x + .5 - 1.0 / 16.0; + double ix1 = x + .5 + 1.0 / 16.0; + double iz0 = z + .5 - 1.0 / 16.0; + double iz1 = z + .5 + 1.0 / 16.0; + + bool n = (stained) ? ((StainedGlassPaneBlock *)tt)->attachsTo(level->getTile(x, y, z - 1)) : ((ThinFenceTile *)tt)->attachsTo(level->getTile(x, y, z - 1)); + bool s = (stained) ? ((StainedGlassPaneBlock *)tt)->attachsTo(level->getTile(x, y, z + 1)) : ((ThinFenceTile *)tt)->attachsTo(level->getTile(x, y, z + 1)); + bool w = (stained) ? ((StainedGlassPaneBlock *)tt)->attachsTo(level->getTile(x - 1, y, z)) : ((ThinFenceTile *)tt)->attachsTo(level->getTile(x - 1, y, z)); + bool e = (stained) ? ((StainedGlassPaneBlock *)tt)->attachsTo(level->getTile(x + 1, y, z)) : ((ThinFenceTile *)tt)->attachsTo(level->getTile(x + 1, y, z)); + + double noZFightingOffset = 0.001; + double yt = 1.0 - noZFightingOffset; + double yb = 0.0 + noZFightingOffset; + + bool none = !(n || s || w || e); + + if (w || none) + { + if (w && e) + { + if (!n) + { + t->vertexUV(x1, y + yt, iz0, u1, v0); + t->vertexUV(x1, y + yb, iz0, u1, v1); + t->vertexUV(x0, y + yb, iz0, u0, v1); + t->vertexUV(x0, y + yt, iz0, u0, v0); + } + else + { + t->vertexUV(ix0, y + yt, iz0, iu0, v0); + t->vertexUV(ix0, y + yb, iz0, iu0, v1); + t->vertexUV( x0, y + yb, iz0, u0, v1); + t->vertexUV( x0, y + yt, iz0, u0, v0); + + t->vertexUV( x1, y + yt, iz0, u1, v0); + t->vertexUV( x1, y + yb, iz0, u1, v1); + t->vertexUV(ix1, y + yb, iz0, iu1, v1); + t->vertexUV(ix1, y + yt, iz0, iu1, v0); + } + if (!s) + { + t->vertexUV(x0, y + yt, iz1, u0, v0); + t->vertexUV(x0, y + yb, iz1, u0, v1); + t->vertexUV(x1, y + yb, iz1, u1, v1); + t->vertexUV(x1, y + yt, iz1, u1, v0); + } + else + { + t->vertexUV( x0, y + yt, iz1, u0, v0); + t->vertexUV( x0, y + yb, iz1, u0, v1); + t->vertexUV(ix0, y + yb, iz1, iu0, v1); + t->vertexUV(ix0, y + yt, iz1, iu0, v0); + + t->vertexUV(ix1, y + yt, iz1, iu1, v0); + t->vertexUV(ix1, y + yb, iz1, iu1, v1); + t->vertexUV( x1, y + yb, iz1, u1, v1); + t->vertexUV( x1, y + yt, iz1, u1, v0); + } + + t->vertexUV(x0, y + yt, iz1, eiu1, ev0); + t->vertexUV(x1, y + yt, iz1, eiu1, ev1); + t->vertexUV(x1, y + yt, iz0, eiu0, ev1); + t->vertexUV(x0, y + yt, iz0, eiu0, ev0); + + t->vertexUV(x1, y + yb, iz1, eiu0, ev1); + t->vertexUV(x0, y + yb, iz1, eiu0, ev0); + t->vertexUV(x0, y + yb, iz0, eiu1, ev0); + t->vertexUV(x1, y + yb, iz0, eiu1, ev1); + } + else + { + if (!(n || none)) + { + t->vertexUV(ix1, y + yt, iz0, iu1, v0); + t->vertexUV(ix1, y + yb, iz0, iu1, v1); + t->vertexUV( x0, y + yb, iz0, u0, v1); + t->vertexUV( x0, y + yt, iz0, u0, v0); + } + else + { + t->vertexUV(ix0, y + yt, iz0, iu0, v0); + t->vertexUV(ix0, y + yb, iz0, iu0, v1); + t->vertexUV( x0, y + yb, iz0, u0, v1); + t->vertexUV( x0, y + yt, iz0, u0, v0); + } + if (!(s || none)) + { + t->vertexUV( x0, y + yt, iz1, u0, v0); + t->vertexUV( x0, y + yb, iz1, u0, v1); + t->vertexUV(ix1, y + yb, iz1, iu1, v1); + t->vertexUV(ix1, y + yt, iz1, iu1, v0); + } + else + { + t->vertexUV( x0, y + yt, iz1, u0, v0); + t->vertexUV( x0, y + yb, iz1, u0, v1); + t->vertexUV(ix0, y + yb, iz1, iu0, v1); + t->vertexUV(ix0, y + yt, iz1, iu0, v0); + } + + t->vertexUV( x0, y + yt, iz1, eiu1, ev0); + t->vertexUV(ix0, y + yt, iz1, eiu1, eiv0); + t->vertexUV(ix0, y + yt, iz0, eiu0, eiv0); + t->vertexUV( x0, y + yt, iz0, eiu0, ev0); + + t->vertexUV(ix0, y + yb, iz1, eiu0, eiv0); + t->vertexUV( x0, y + yb, iz1, eiu0, ev0); + t->vertexUV( x0, y + yb, iz0, eiu1, ev0); + t->vertexUV(ix0, y + yb, iz0, eiu1, eiv0); + } + } + else if (!(n || s)) + { + t->vertexUV(ix0, y + yt, iz0, iu0, v0); + t->vertexUV(ix0, y + yb, iz0, iu0, v1); + t->vertexUV(ix0, y + yb, iz1, iu1, v1); + t->vertexUV(ix0, y + yt, iz1, iu1, v0); + } + + if ((e || none) && !w) + { + if (!(s || none)) + { + t->vertexUV(ix0, y + yt, iz1, iu0, v0); + t->vertexUV(ix0, y + yb, iz1, iu0, v1); + t->vertexUV( x1, y + yb, iz1, u1, v1); + t->vertexUV( x1, y + yt, iz1, u1, v0); + } + else + { + t->vertexUV(ix1, y + yt, iz1, iu1, v0); + t->vertexUV(ix1, y + yb, iz1, iu1, v1); + t->vertexUV( x1, y + yb, iz1, u1, v1); + t->vertexUV( x1, y + yt, iz1, u1, v0); + } + if (!(n || none)) + { + t->vertexUV( x1, y + yt, iz0, u1, v0); + t->vertexUV( x1, y + yb, iz0, u1, v1); + t->vertexUV(ix0, y + yb, iz0, iu0, v1); + t->vertexUV(ix0, y + yt, iz0, iu0, v0); + } + else + { + t->vertexUV( x1, y + yt, iz0, u1, v0); + t->vertexUV( x1, y + yb, iz0, u1, v1); + t->vertexUV(ix1, y + yb, iz0, iu1, v1); + t->vertexUV(ix1, y + yt, iz0, iu1, v0); + } + + t->vertexUV(ix1, y + yt, iz1, eiu1, eiv1); + t->vertexUV( x1, y + yt, iz1, eiu1, ev0); + t->vertexUV( x1, y + yt, iz0, eiu0, ev0); + t->vertexUV(ix1, y + yt, iz0, eiu0, eiv1); + + t->vertexUV( x1, y + yb, iz1, eiu0, ev1); + t->vertexUV(ix1, y + yb, iz1, eiu0, eiv1); + t->vertexUV(ix1, y + yb, iz0, eiu1, eiv1); + t->vertexUV( x1, y + yb, iz0, eiu1, ev1); + } + else if (!(e || n || s)) + { + t->vertexUV(ix1, y + yt, iz1, iu0, v0); + t->vertexUV(ix1, y + yb, iz1, iu0, v1); + t->vertexUV(ix1, y + yb, iz0, iu1, v1); + t->vertexUV(ix1, y + yt, iz0, iu1, v0); + } + + if (n || none) + { + if (n && s) + { + if (!w) + { + t->vertexUV(ix0, y + yt, z0, u0, v0); + t->vertexUV(ix0, y + yb, z0, u0, v1); + t->vertexUV(ix0, y + yb, z1, u1, v1); + t->vertexUV(ix0, y + yt, z1, u1, v0); + } + else + { + t->vertexUV(ix0, y + yt, z0, u0, v0); + t->vertexUV(ix0, y + yb, z0, u0, v1); + t->vertexUV(ix0, y + yb, iz0, iu0, v1); + t->vertexUV(ix0, y + yt, iz0, iu0, v0); + + t->vertexUV(ix0, y + yt, iz1, iu1, v0); + t->vertexUV(ix0, y + yb, iz1, iu1, v1); + t->vertexUV(ix0, y + yb, z1, u1, v1); + t->vertexUV(ix0, y + yt, z1, u1, v0); + } + if (!e) + { + t->vertexUV(ix1, y + yt, z1, u1, v0); + t->vertexUV(ix1, y + yb, z1, u1, v1); + t->vertexUV(ix1, y + yb, z0, u0, v1); + t->vertexUV(ix1, y + yt, z0, u0, v0); + } + else + { + t->vertexUV(ix1, y + yt, iz0, iu0, v0); + t->vertexUV(ix1, y + yb, iz0, iu0, v1); + t->vertexUV(ix1, y + yb, z0, u0, v1); + t->vertexUV(ix1, y + yt, z0, u0, v0); + + t->vertexUV(ix1, y + yt, z1, u1, v0); + t->vertexUV(ix1, y + yb, z1, u1, v1); + t->vertexUV(ix1, y + yb, iz1, iu1, v1); + t->vertexUV(ix1, y + yt, iz1, iu1, v0); + } + + t->vertexUV(ix1, y + yt, z0, eiu1, ev0); + t->vertexUV(ix0, y + yt, z0, eiu0, ev0); + t->vertexUV(ix0, y + yt, z1, eiu0, ev1); + t->vertexUV(ix1, y + yt, z1, eiu1, ev1); + + t->vertexUV(ix0, y + yb, z0, eiu0, ev0); + t->vertexUV(ix1, y + yb, z0, eiu1, ev0); + t->vertexUV(ix1, y + yb, z1, eiu1, ev1); + t->vertexUV(ix0, y + yb, z1, eiu0, ev1); + } + else + { + if (!(w || none)) + { + t->vertexUV(ix0, y + yt, z0, u0, v0); + t->vertexUV(ix0, y + yb, z0, u0, v1); + t->vertexUV(ix0, y + yb, iz1, iu1, v1); + t->vertexUV(ix0, y + yt, iz1, iu1, v0); + } + else + { + t->vertexUV(ix0, y + yt, z0, u0, v0); + t->vertexUV(ix0, y + yb, z0, u0, v1); + t->vertexUV(ix0, y + yb, iz0, iu0, v1); + t->vertexUV(ix0, y + yt, iz0, iu0, v0); + } + if (!(e || none)) + { + t->vertexUV(ix1, y + yt, iz1, iu1, v0); + t->vertexUV(ix1, y + yb, iz1, iu1, v1); + t->vertexUV(ix1, y + yb, z0, u0, v1); + t->vertexUV(ix1, y + yt, z0, u0, v0); + } + else + { + t->vertexUV(ix1, y + yt, iz0, iu0, v0); + t->vertexUV(ix1, y + yb, iz0, iu0, v1); + t->vertexUV(ix1, y + yb, z0, u0, v1); + t->vertexUV(ix1, y + yt, z0, u0, v0); + } + + t->vertexUV(ix1, y + yt, z0, eiu1, ev0); + t->vertexUV(ix0, y + yt, z0, eiu0, ev0); + t->vertexUV(ix0, y + yt, iz0, eiu0, eiv0); + t->vertexUV(ix1, y + yt, iz0, eiu1, eiv0); + + t->vertexUV(ix0, y + yb, z0, eiu0, ev0); + t->vertexUV(ix1, y + yb, z0, eiu1, ev0); + t->vertexUV(ix1, y + yb, iz0, eiu1, eiv0); + t->vertexUV(ix0, y + yb, iz0, eiu0, eiv0); + } + } + else if (!(e || w)) + { + t->vertexUV(ix1, y + yt, iz0, iu1, v0); + t->vertexUV(ix1, y + yb, iz0, iu1, v1); + t->vertexUV(ix0, y + yb, iz0, iu0, v1); + t->vertexUV(ix0, y + yt, iz0, iu0, v0); + } + + if ((s || none) && !n) + { + if (!(w || none)) + { + t->vertexUV(ix0, y + yt, iz0, iu0, v0); + t->vertexUV(ix0, y + yb, iz0, iu0, v1); + t->vertexUV(ix0, y + yb, z1, u1, v1); + t->vertexUV(ix0, y + yt, z1, u1, v0); + } + else + { + t->vertexUV(ix0, y + yt, iz1, iu1, v0); + t->vertexUV(ix0, y + yb, iz1, iu1, v1); + t->vertexUV(ix0, y + yb, z1, u1, v1); + t->vertexUV(ix0, y + yt, z1, u1, v0); + } + if (!(e || none)) + { + t->vertexUV(ix1, y + yt, z1, u1, v0); + t->vertexUV(ix1, y + yb, z1, u1, v1); + t->vertexUV(ix1, y + yb, iz0, iu0, v1); + t->vertexUV(ix1, y + yt, iz0, iu0, v0); + } + else + { + t->vertexUV(ix1, y + yt, z1, u1, v0); + t->vertexUV(ix1, y + yb, z1, u1, v1); + t->vertexUV(ix1, y + yb, iz1, iu1, v1); + t->vertexUV(ix1, y + yt, iz1, iu1, v0); + } + + t->vertexUV(ix1, y + yt, iz1, eiu1, eiv1); + t->vertexUV(ix0, y + yt, iz1, eiu0, eiv1); + t->vertexUV(ix0, y + yt, z1, eiu0, ev1); + t->vertexUV(ix1, y + yt, z1, eiu1, ev1); + + t->vertexUV(ix0, y + yb, iz1, eiu0, eiv1); + t->vertexUV(ix1, y + yb, iz1, eiu1, eiv1); + t->vertexUV(ix1, y + yb, z1, eiu1, ev1); + t->vertexUV(ix0, y + yb, z1, eiu0, ev1); + } + else if (!(s || e || w)) + { + t->vertexUV(ix0, y + yt, iz1, iu0, v0); + t->vertexUV(ix0, y + yb, iz1, iu0, v1); + t->vertexUV(ix1, y + yb, iz1, iu1, v1); + t->vertexUV(ix1, y + yt, iz1, iu1, v0); + } + + t->vertexUV(ix1, y + yt, iz0, eiu1, eiv0); + t->vertexUV(ix0, y + yt, iz0, eiu0, eiv0); + t->vertexUV(ix0, y + yt, iz1, eiu0, eiv1); + t->vertexUV(ix1, y + yt, iz1, eiu1, eiv1); + + t->vertexUV(ix0, y + yb, iz0, eiu0, eiv0); + t->vertexUV(ix1, y + yb, iz0, eiu1, eiv0); + t->vertexUV(ix1, y + yb, iz1, eiu1, eiv1); + t->vertexUV(ix0, y + yb, iz1, eiu0, eiv1); + + if (none) + { + t->vertexUV(x0, y + yt, iz0, iu0, v0); + t->vertexUV(x0, y + yb, iz0, iu0, v1); + t->vertexUV(x0, y + yb, iz1, iu1, v1); + t->vertexUV(x0, y + yt, iz1, iu1, v0); + + t->vertexUV(x1, y + yt, iz1, iu0, v0); + t->vertexUV(x1, y + yb, iz1, iu0, v1); + t->vertexUV(x1, y + yb, iz0, iu1, v1); + t->vertexUV(x1, y + yt, iz0, iu1, v0); + + t->vertexUV(ix1, y + yt, z0, iu1, v0); + t->vertexUV(ix1, y + yb, z0, iu1, v1); + t->vertexUV(ix0, y + yb, z0, iu0, v1); + t->vertexUV(ix0, y + yt, z0, iu0, v0); + + t->vertexUV(ix0, y + yt, z1, iu0, v0); + t->vertexUV(ix0, y + yb, z1, iu0, v1); + t->vertexUV(ix1, y + yb, z1, iu1, v1); + t->vertexUV(ix1, y + yt, z1, iu1, v0); + } + return true; +} + bool TileRenderer::tesselateThinFenceInWorld( ThinFenceTile* tt, int x, int y, int z ) { int depth = level->getMaxBuildHeight(); @@ -3582,9 +4167,9 @@ bool TileRenderer::tesselateCrossInWorld( Tile* tt, int x, int y, int z ) if (tt == Tile::tallgrass) { - __int64 seed = (x * 3129871) ^ (z * 116129781l) ^ (y); - seed = seed * seed * 42317861 + seed * 11; - + __int64 seed = (x * 3129871) ^ (z * 116129781l) ^ (y); + seed = seed * seed * 42317861 + seed * 11; + xt += ((((seed >> 16) & 0xf) / 15.0f) - 0.5f) * 0.5f; yt += ((((seed >> 20) & 0xf) / 15.0f) - 1.0f) * 0.2f; zt += ((((seed >> 24) & 0xf) / 15.0f) - 0.5f) * 0.5f; @@ -3702,30 +4287,30 @@ void TileRenderer::tesselateTorch( Tile* tt, float x, float y, float z, float xx t->vertexUV( ( float )( x - r ), ( float )( y + 1 ), ( float )( z0 ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x - r + xxa ), ( float )( y + 0 ), ( float )( z0 + - zza ), ( float )( u0 ), ( float )( v1 ) ); + zza ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x - r + xxa ), ( float )( y + 0 ), ( float )( z1 + - zza ), ( float )( u1 ), ( float )( v1 ) ); + zza ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x - r ), ( float )( y + 1 ), ( float )( z1 ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + r ), ( float )( y + 1 ), ( float )( z1 ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x + xxa + r ), ( float )( y + 0 ), ( float )( z1 + - zza ), ( float )( u0 ), ( float )( v1 ) ); + zza ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + xxa + r ), ( float )( y + 0 ), ( float )( z0 + - zza ), ( float )( u1 ), ( float )( v1 ) ); + zza ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x + r ), ( float )( y + 1 ), ( float )( z0 ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x0 ), ( float )( y + 1 ), ( float )( z + r ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x0 + xxa ), ( float )( y + 0 ), ( float )( z + r + - zza ), ( float )( u0 ), ( float )( v1 ) ); + zza ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x1 + xxa ), ( float )( y + 0 ), ( float )( z + r + - zza ), ( float )( u1 ), ( float )( v1 ) ); + zza ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x1 ), ( float )( y + 1 ), ( float )( z + r ), ( float )( u1 ), ( float )( v0 ) ); t->vertexUV( ( float )( x1 ), ( float )( y + 1 ), ( float )( z - r ), ( float )( u0 ), ( float )( v0 ) ); t->vertexUV( ( float )( x1 + xxa ), ( float )( y + 0 ), ( float )( z - r + - zza ), ( float )( u0 ), ( float )( v1 ) ); + zza ), ( float )( u0 ), ( float )( v1 ) ); t->vertexUV( ( float )( x0 + xxa ), ( float )( y + 0 ), ( float )( z - r + - zza ), ( float )( u1 ), ( float )( v1 ) ); + zza ), ( float )( u1 ), ( float )( v1 ) ); t->vertexUV( ( float )( x0 ), ( float )( y + 1 ), ( float )( z - r ), ( float )( u1 ), ( float )( v0 ) ); } @@ -3809,46 +4394,46 @@ void TileRenderer::tesselateStemTexture( Tile* tt, int data, float h, float x, f bool TileRenderer::tesselateLilypadInWorld(Tile *tt, int x, int y, int z) { - Tesselator *t = Tesselator::getInstance(); + Tesselator *t = Tesselator::getInstance(); Icon *tex = getTexture(tt, Facing::UP); if (hasFixedTexture()) tex = fixedTexture; - float h = 0.25f / 16.0f; + float h = 0.25f / 16.0f; float u0 = tex->getU0(true); float v0 = tex->getV0(true); float u1 = tex->getU1(true); float v1 = tex->getV1(true); - __int64 seed = (x * 3129871) ^ (z * 116129781l) ^ (y); - seed = seed * seed * 42317861 + seed * 11; + __int64 seed = (x * 3129871) ^ (z * 116129781l) ^ (y); + seed = seed * seed * 42317861 + seed * 11; - int dir = (int) ((seed >> 16) & 0x3); + int dir = (int) ((seed >> 16) & 0x3); - t->tex2(getLightColor(tt, level, x, y, z)); + t->tex2(getLightColor(tt, level, x, y, z)); - float xx = x + 0.5f; - float zz = z + 0.5f; - float c = ((dir & 1) * 0.5f) * (1 - dir / 2 % 2 * 2); - float s = (((dir + 1) & 1) * 0.5f) * (1 - (dir + 1) / 2 % 2 * 2); + float xx = x + 0.5f; + float zz = z + 0.5f; + float c = ((dir & 1) * 0.5f) * (1 - dir / 2 % 2 * 2); + float s = (((dir + 1) & 1) * 0.5f) * (1 - (dir + 1) / 2 % 2 * 2); - t->color(tt->getColor()); - t->vertexUV(xx + c - s, y + h, zz + c + s, u0, v0); - t->vertexUV(xx + c + s, y + h, zz - c + s, u1, v0); - t->vertexUV(xx - c + s, y + h, zz - c - s, u1, v1); - t->vertexUV(xx - c - s, y + h, zz + c - s, u0, v1); + t->color(tt->getColor()); + t->vertexUV(xx + c - s, y + h, zz + c + s, u0, v0); + t->vertexUV(xx + c + s, y + h, zz - c + s, u1, v0); + t->vertexUV(xx - c + s, y + h, zz - c - s, u1, v1); + t->vertexUV(xx - c - s, y + h, zz + c - s, u0, v1); - t->color((tt->getColor() & 0xfefefe) >> 1); - t->vertexUV(xx - c - s, y + h, zz + c - s, u0, v1); - t->vertexUV(xx - c + s, y + h, zz - c - s, u1, v1); - t->vertexUV(xx + c + s, y + h, zz - c + s, u1, v0); - t->vertexUV(xx + c - s, y + h, zz + c + s, u0, v0); + t->color((tt->getColor() & 0xfefefe) >> 1); + t->vertexUV(xx - c - s, y + h, zz + c - s, u0, v1); + t->vertexUV(xx - c + s, y + h, zz - c - s, u1, v1); + t->vertexUV(xx + c + s, y + h, zz - c + s, u1, v0); + t->vertexUV(xx + c - s, y + h, zz + c + s, u0, v0); - return true; + return true; } void TileRenderer::tesselateStemDirTexture( StemTile* tt, int data, int dir, float h, float x, float y, float z ) @@ -4006,7 +4591,7 @@ bool TileRenderer::tesselateWaterInWorld( Tile* tt, int x, int y, int z ) float h2 = getWaterHeight( x + 1, y, z + 1, m ); float h3 = getWaterHeight( x + 1, y, z, m ); - float offs = 0.001f; + float offs = 0.001f; // 4J - added. Farm tiles often found beside water, but they consider themselves non-solid as they only extend up to 15.0f / 16.0f. // If the max height of this water is below that level, don't bother rendering sides bordering onto farmland. float maxh = h0; @@ -4043,10 +4628,10 @@ bool TileRenderer::tesselateWaterInWorld( Tile* tt, int x, int y, int z ) tex = getTexture( tt, 2, data ); } - h0 -= offs; - h1 -= offs; - h2 -= offs; - h3 -= offs; + h0 -= offs; + h1 -= offs; + h2 -= offs; + h3 -= offs; float u00, u01, u10, u11; float v00, v01, v10, v11; @@ -4313,7 +4898,7 @@ bool TileRenderer::tesselateBlockInWorld( Tile* tt, int x, int y, int z ) if ( Tile::lightEmission[tt->id] == 0 )//4J - TODO/remove (Minecraft::useAmbientOcclusion()) { - return tesselateBlockInWorldWithAmbienceOcclusionTexLighting( tt, x, y, z, r, g, b, 0 ); + return tesselateBlockInWorldWithAmbienceOcclusionTexLighting(tt, x, y, z, r, g, b, 0, smoothShapeLighting); } else { @@ -4342,7 +4927,7 @@ bool TileRenderer::tesselateBlockInWorld( Tile* tt, int x, int y, int z, int fac if ( Tile::lightEmission[tt->id] == 0 )//4J - TODO/remove (Minecraft::useAmbientOcclusion()) { - return tesselateBlockInWorldWithAmbienceOcclusionTexLighting( tt, x, y, z, r, g, b, faceFlags ); + return tesselateBlockInWorldWithAmbienceOcclusionTexLighting( tt, x, y, z, r, g, b, faceFlags, smoothShapeLighting ); } else { @@ -4609,14 +5194,13 @@ bool TileRenderer::tesselateCocoaInWorld(CocoaTile *tt, int x, int y, int z) } } - return true; } // 4J - brought changes forward from 1.8.2 bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* tt, int pX, int pY, int pZ, - float pBaseRed, float pBaseGreen, - float pBaseBlue, int faceFlags ) + float pBaseRed, float pBaseGreen, + float pBaseBlue, int faceFlags, bool smoothShapeLighting ) { // 4J - the texture is (originally) obtained for each face in the block, if those faces are visible. For a lot of blocks, // the textures don't vary from face to face - this is particularly an issue for leaves as they not only don't vary between faces, @@ -4660,140 +5244,116 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* } applyAmbienceOcclusion = true; - float ll1 = ll000; - float ll2 = ll000; - float ll3 = ll000; - float ll4 = ll000; - bool tint0 = true; - bool tint1 = true; - bool tint2 = true; - bool tint3 = true; - bool tint4 = true; - bool tint5 = true; - - - ll000 = getShadeBrightness(tt, level, pX, pY, pZ ); - llx00 = getShadeBrightness(tt, level, pX - 1, pY, pZ ); - ll0y0 = getShadeBrightness(tt, level, pX, pY - 1, pZ ); - ll00z = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); - llX00 = getShadeBrightness(tt, level, pX + 1, pY, pZ ); - ll0Y0 = getShadeBrightness(tt, level, pX, pY + 1, pZ ); - ll00Z = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); - - // 4J - these changes brought forward from 1.2.3 + bool i = false; + float ll1 = 0; + float ll2 = 0; + float ll3 = 0; + float ll4 = 0; + + bool tintSides = true; + int centerColor = getLightColor(tt, level, pX, pY, pZ ); - int ccx00 = centerColor; - int cc0y0 = centerColor; - int cc00z = centerColor; - int ccX00 = centerColor; - int cc0Y0 = centerColor; - int cc00Z = centerColor; - - if (tileShapeY0 <= 0 || !level->isSolidRenderTile(pX, pY - 1, pZ)) cc0y0 = getLightColor(tt, level, pX, pY - 1, pZ); - if (tileShapeY1 >= 1 || !level->isSolidRenderTile(pX, pY + 1, pZ)) cc0Y0 = getLightColor(tt, level, pX, pY + 1, pZ); - if (tileShapeX0 <= 0 || !level->isSolidRenderTile(pX - 1, pY, pZ)) ccx00 = getLightColor(tt, level, pX - 1, pY, pZ); - if (tileShapeX1 >= 1 || !level->isSolidRenderTile(pX + 1, pY, pZ)) ccX00 = getLightColor(tt, level, pX + 1, pY, pZ); - if (tileShapeZ0 <= 0 || !level->isSolidRenderTile(pX, pY, pZ - 1)) cc00z = getLightColor(tt, level, pX, pY, pZ - 1); - if (tileShapeZ1 >= 1 || !level->isSolidRenderTile(pX, pY, pZ + 1)) cc00Z = getLightColor(tt, level, pX, pY, pZ + 1); Tesselator* t = Tesselator::getInstance(); t->tex2( 0xf000f ); - llTransXY0 = isTranslucentAt( level, pX + 1, pY + 1, pZ ); - llTransXy0 = isTranslucentAt( level, pX + 1, pY - 1, pZ ); - llTransX0Z = isTranslucentAt( level, pX + 1, pY, pZ + 1 ); - llTransX0z = isTranslucentAt( level, pX + 1, pY, pZ - 1 ); - llTransxY0 = isTranslucentAt( level, pX - 1, pY + 1, pZ ); - llTransxy0 = isTranslucentAt( level, pX - 1, pY - 1, pZ ); - llTransx0z = isTranslucentAt( level, pX - 1, pY, pZ - 1 ); - llTransx0Z = isTranslucentAt( level, pX - 1, pY, pZ + 1 ); - llTrans0YZ = isTranslucentAt( level, pX, pY + 1, pZ + 1 ); - llTrans0Yz = isTranslucentAt( level, pX, pY + 1, pZ - 1 ); - llTrans0yZ = isTranslucentAt( level, pX, pY - 1, pZ + 1 ); - llTrans0yz = isTranslucentAt( level, pX, pY - 1, pZ - 1 ); - if( uniformTex == NULL ) { - if ( getTexture(tt)->getFlags() == Icon::IS_GRASS_TOP ) tint0 = tint2 = tint3 = tint4 = tint5 = false; + if ( getTexture(tt)->getFlags() == Icon::IS_GRASS_TOP ) tintSides = false; + } + else if (hasFixedTexture()) + { + tintSides = false; } - if ( hasFixedTexture() ) tint0 = tint2 = tint3 = tint4 = tint5 = false; if ( faceFlags & 0x01 ) { - if ( blsmooth > 0 ) + if ( tileShapeY0 <= 0 ) pY--; + + ccxy0 = getLightColor(tt, level, pX - 1, pY, pZ ); + cc0yz = getLightColor(tt, level, pX, pY, pZ - 1 ); + cc0yZ = getLightColor(tt, level, pX, pY, pZ + 1 ); + ccXy0 = getLightColor(tt, level, pX + 1, pY, pZ ); + + llxy0 = getShadeBrightness(tt, level, pX - 1, pY, pZ ); + ll0yz = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); + ll0yZ = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); + llXy0 = getShadeBrightness(tt, level, pX + 1, pY, pZ ); + + bool llTransXy0 = Tile::transculent[level->getTile(pX + 1, pY - 1, pZ)]; + bool llTransxy0 = Tile::transculent[level->getTile(pX - 1, pY - 1, pZ)]; + bool llTrans0yZ = Tile::transculent[level->getTile(pX, pY - 1, pZ + 1)]; + bool llTrans0yz = Tile::transculent[level->getTile(pX, pY - 1, pZ - 1)]; + + if ( llTrans0yz || llTransxy0 ) + { + llxyz = getShadeBrightness(tt, level, pX - 1, pY, pZ - 1 ); + ccxyz = getLightColor(tt, level, pX - 1, pY, pZ - 1 ); + } + else + { + llxyz = llxy0; + ccxyz = ccxy0; + } + if ( llTrans0yZ || llTransxy0 ) + { + llxyZ = getShadeBrightness(tt, level, pX - 1, pY, pZ + 1 ); + ccxyZ = getLightColor(tt, level, pX - 1, pY, pZ + 1 ); + } + else + { + llxyZ = llxy0; + ccxyZ = ccxy0; + } + if ( llTrans0yz || llTransXy0 ) + { + llXyz = getShadeBrightness(tt, level, pX + 1, pY, pZ - 1 ); + ccXyz = getLightColor(tt, level, pX + 1, pY, pZ - 1 ); + } + else + { + llXyz = llXy0; + ccXyz = ccXy0; + } + if ( llTrans0yZ || llTransXy0 ) + { + llXyZ = getShadeBrightness(tt, level, pX + 1, pY, pZ + 1 ); + ccXyZ = getLightColor(tt, level, pX + 1, pY, pZ + 1 ); + } + else { - if ( tileShapeY0 <= 0 ) pY--; // 4J - condition brought forward from 1.2.3 + llXyZ = llXy0; + ccXyZ = ccXy0; + } - ccxy0 = getLightColor(tt, level, pX - 1, pY, pZ ); - cc0yz = getLightColor(tt, level, pX, pY, pZ - 1 ); - cc0yZ = getLightColor(tt, level, pX, pY, pZ + 1 ); - ccXy0 = getLightColor(tt, level, pX + 1, pY, pZ ); + if ( tileShapeY0 <= 0 ) pY++; - llxy0 = getShadeBrightness(tt, level, pX - 1, pY, pZ ); - ll0yz = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); - ll0yZ = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); - llXy0 = getShadeBrightness(tt, level, pX + 1, pY, pZ ); + int cc0y0 = centerColor; + if (tileShapeY0 <= 0 || !level->isSolidRenderTile(pX, pY - 1, pZ)) cc0y0 = tt->getLightColor(level, pX, pY - 1, pZ); + float ll0y0 = tt->getShadeBrightness(level, pX, pY - 1, pZ); - if ( llTrans0yz || llTransxy0 ) - { - llxyz = getShadeBrightness(tt, level, pX - 1, pY, pZ - 1 ); - ccxyz = getLightColor(tt, level, pX - 1, pY, pZ - 1 ); - } - else - { - llxyz = llxy0; - ccxyz = ccxy0; - } - if ( llTrans0yZ || llTransxy0 ) - { - llxyZ = getShadeBrightness(tt, level, pX - 1, pY, pZ + 1 ); - ccxyZ = getLightColor(tt, level, pX - 1, pY, pZ + 1 ); - } - else - { - llxyZ = llxy0; - ccxyZ = ccxy0; - } - if ( llTrans0yz || llTransXy0 ) - { - llXyz = getShadeBrightness(tt, level, pX + 1, pY, pZ - 1 ); - ccXyz = getLightColor(tt, level, pX + 1, pY, pZ - 1 ); - } - else - { - llXyz = llXy0; - ccXyz = ccXy0; - } - if ( llTrans0yZ || llTransXy0 ) - { - llXyZ = getShadeBrightness(tt, level, pX + 1, pY, pZ + 1 ); - ccXyZ = getLightColor(tt, level, pX + 1, pY, pZ + 1 ); - } - else - { - llXyZ = llXy0; - ccXyZ = ccXy0; - } + ll1 = ( llxyZ + llxy0 + ll0yZ + ll0y0 ) / 4.0f; + ll4 = ( ll0yZ + ll0y0 + llXyZ + llXy0 ) / 4.0f; + ll3 = ( ll0y0 + ll0yz + llXy0 + llXyz ) / 4.0f; + ll2 = ( llxy0 + llxyz + ll0y0 + ll0yz ) / 4.0f; - if ( tileShapeY0 <= 0 ) pY++; // 4J - condition brought forward from 1.2.3 - ll1 = ( llxyZ + llxy0 + ll0yZ + ll0y0 ) / 4.0f; - ll4 = ( ll0yZ + ll0y0 + llXyZ + llXy0 ) / 4.0f; - ll3 = ( ll0y0 + ll0yz + llXy0 + llXyz ) / 4.0f; - ll2 = ( llxy0 + llxyz + ll0y0 + ll0yz ) / 4.0f; + tc1 = blend( ccxyZ, ccxy0, cc0yZ, cc0y0 ); + tc4 = blend( cc0yZ, ccXyZ, ccXy0, cc0y0 ); + tc3 = blend( cc0yz, ccXy0, ccXyz, cc0y0 ); + tc2 = blend( ccxy0, ccxyz, cc0yz, cc0y0 ); - tc1 = blend( ccxyZ, ccxy0, cc0yZ, cc0y0 ); - tc4 = blend( cc0yZ, ccXyZ, ccXy0, cc0y0 ); - tc3 = blend( cc0yz, ccXy0, ccXyz, cc0y0 ); - tc2 = blend( ccxy0, ccxyz, cc0yz, cc0y0 ); + if (tintSides) + { + c1r = c2r = c3r = c4r = pBaseRed * 0.5f; + c1g = c2g = c3g = c4g = pBaseGreen * 0.5f; + c1b = c2b = c3b = c4b = pBaseBlue * 0.5f; } else { - ll1 = ll2 = ll3 = ll4 = ll0y0; - tc1 = tc2 = tc3 = tc4 = ccxy0; + c1r = c2r = c3r = c4r = 0.5f; + c1g = c2g = c3g = c4g = 0.5f; + c1b = c2b = c3b = c4b = 0.5f; } - c1r = c2r = c3r = c4r = ( tint0 ? pBaseRed : 1.0f ) * 0.5f; - c1g = c2g = c3g = c4g = ( tint0 ? pBaseGreen : 1.0f ) * 0.5f; - c1b = c2b = c3b = c4b = ( tint0 ? pBaseBlue : 1.0f ) * 0.5f; c1r *= ll1; c1g *= ll1; c1b *= ll1; @@ -4808,83 +5368,86 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* c4b *= ll4; renderFaceDown( tt, ( double )pX, ( double )pY, ( double )pZ, uniformTex ? uniformTex : getTexture( tt, level, pX, pY, pZ, 0 ) ); + i = true; } if ( faceFlags & 0x02 ) { - if ( blsmooth > 0 ) - { - if ( tileShapeY1 >= 1 ) pY++; // 4J - condition brought forward from 1.2.3 - - ccxY0 = getLightColor(tt, level, pX - 1, pY, pZ ); - ccXY0 = getLightColor(tt, level, pX + 1, pY, pZ ); - cc0Yz = getLightColor(tt, level, pX, pY, pZ - 1 ); - cc0YZ = getLightColor(tt, level, pX, pY, pZ + 1 ); + if ( tileShapeY1 >= 1 ) pY++; // 4J - condition brought forward from 1.2.3 - llxY0 = getShadeBrightness(tt, level, pX - 1, pY, pZ ); - llXY0 = getShadeBrightness(tt, level, pX + 1, pY, pZ ); - ll0Yz = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); - ll0YZ = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); + ccxY0 = getLightColor(tt, level, pX - 1, pY, pZ ); + ccXY0 = getLightColor(tt, level, pX + 1, pY, pZ ); + cc0Yz = getLightColor(tt, level, pX, pY, pZ - 1 ); + cc0YZ = getLightColor(tt, level, pX, pY, pZ + 1 ); - if ( llTrans0Yz || llTransxY0 ) - { - llxYz = getShadeBrightness(tt, level, pX - 1, pY, pZ - 1 ); - ccxYz = getLightColor(tt, level, pX - 1, pY, pZ - 1 ); - } - else - { - llxYz = llxY0; - ccxYz = ccxY0; - } - if ( llTrans0Yz || llTransXY0 ) - { - llXYz = getShadeBrightness(tt, level, pX + 1, pY, pZ - 1 ); - ccXYz = getLightColor(tt, level, pX + 1, pY, pZ - 1 ); - } - else - { - llXYz = llXY0; - ccXYz = ccXY0; - } - if ( llTrans0YZ || llTransxY0 ) - { - llxYZ = getShadeBrightness(tt, level, pX - 1, pY, pZ + 1 ); - ccxYZ = getLightColor(tt, level, pX - 1, pY, pZ + 1 ); - } - else - { - llxYZ = llxY0; - ccxYZ = ccxY0; - } - if ( llTrans0YZ || llTransXY0 ) - { - llXYZ = getShadeBrightness(tt, level, pX + 1, pY, pZ + 1 ); - ccXYZ = getLightColor(tt, level, pX + 1, pY, pZ + 1 ); - } - else - { - llXYZ = llXY0; - ccXYZ = ccXY0; - } - if ( tileShapeY1 >= 1 ) pY--; // 4J - condition brought forward from 1.2.3 + llxY0 = getShadeBrightness(tt, level, pX - 1, pY, pZ ); + llXY0 = getShadeBrightness(tt, level, pX + 1, pY, pZ ); + ll0Yz = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); + ll0YZ = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); - ll4 = ( llxYZ + llxY0 + ll0YZ + ll0Y0 ) / 4.0f; - ll1 = ( ll0YZ + ll0Y0 + llXYZ + llXY0 ) / 4.0f; - ll2 = ( ll0Y0 + ll0Yz + llXY0 + llXYz ) / 4.0f; - ll3 = ( llxY0 + llxYz + ll0Y0 + ll0Yz ) / 4.0f; + bool llTransXY0 = Tile::transculent[level->getTile(pX + 1, pY + 1, pZ)]; + bool llTransxY0 = Tile::transculent[level->getTile(pX - 1, pY + 1, pZ)]; + bool llTrans0YZ = Tile::transculent[level->getTile(pX, pY + 1, pZ + 1)]; + bool llTrans0Yz = Tile::transculent[level->getTile(pX, pY + 1, pZ - 1)]; - tc4 = blend( ccxYZ, ccxY0, cc0YZ, cc0Y0 ); - tc1 = blend( cc0YZ, ccXYZ, ccXY0, cc0Y0 ); - tc2 = blend( cc0Yz, ccXY0, ccXYz, cc0Y0 ); - tc3 = blend( ccxY0, ccxYz, cc0Yz, cc0Y0 ); + if ( llTrans0Yz || llTransxY0 ) + { + llxYz = getShadeBrightness(tt, level, pX - 1, pY, pZ - 1 ); + ccxYz = getLightColor(tt, level, pX - 1, pY, pZ - 1 ); + } + else + { + llxYz = llxY0; + ccxYz = ccxY0; + } + if ( llTrans0Yz || llTransXY0 ) + { + llXYz = getShadeBrightness(tt, level, pX + 1, pY, pZ - 1 ); + ccXYz = getLightColor(tt, level, pX + 1, pY, pZ - 1 ); } else { - ll1 = ll2 = ll3 = ll4 = ll0Y0; - tc1 = tc2 = tc3 = tc4 = cc0Y0; + llXYz = llXY0; + ccXYz = ccXY0; } - c1r = c2r = c3r = c4r = ( tint1 ? pBaseRed : 1.0f ); - c1g = c2g = c3g = c4g = ( tint1 ? pBaseGreen : 1.0f ); - c1b = c2b = c3b = c4b = ( tint1 ? pBaseBlue : 1.0f ); + if ( llTrans0YZ || llTransxY0 ) + { + llxYZ = getShadeBrightness(tt, level, pX - 1, pY, pZ + 1 ); + ccxYZ = getLightColor(tt, level, pX - 1, pY, pZ + 1 ); + } + else + { + llxYZ = llxY0; + ccxYZ = ccxY0; + } + if ( llTrans0YZ || llTransXY0 ) + { + llXYZ = getShadeBrightness(tt, level, pX + 1, pY, pZ + 1 ); + ccXYZ = getLightColor(tt, level, pX + 1, pY, pZ + 1 ); + } + else + { + llXYZ = llXY0; + ccXYZ = ccXY0; + } + if ( tileShapeY1 >= 1 ) pY--; + + int cc0Y0 = centerColor; + if (tileShapeY1 >= 1 || !level->isSolidRenderTile(pX, pY + 1, pZ)) cc0Y0 = tt->getLightColor(level, pX, pY + 1, pZ); + float ll0Y0 = tt->getShadeBrightness(level, pX, pY + 1, pZ); + + ll4 = ( llxYZ + llxY0 + ll0YZ + ll0Y0 ) / 4.0f; + ll1 = ( ll0YZ + ll0Y0 + llXYZ + llXY0 ) / 4.0f; + ll2 = ( ll0Y0 + ll0Yz + llXY0 + llXYz ) / 4.0f; + ll3 = ( llxY0 + llxYz + ll0Y0 + ll0Yz ) / 4.0f; + + tc4 = blend( ccxYZ, ccxY0, cc0YZ, cc0Y0 ); + tc1 = blend( cc0YZ, ccXYZ, ccXY0, cc0Y0 ); + tc2 = blend( cc0Yz, ccXY0, ccXYz, cc0Y0 ); + tc3 = blend( ccxY0, ccxYz, cc0Yz, cc0Y0 ); + + c1r = c2r = c3r = c4r = pBaseRed; + c1g = c2g = c3g = c4g = pBaseGreen; + c1b = c2b = c3b = c4b = pBaseBlue; c1r *= ll1; c1g *= ll1; c1b *= ll1; @@ -4898,65 +5461,74 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* c4g *= ll4; c4b *= ll4; renderFaceUp( tt, ( double )pX, ( double )pY, ( double )pZ, uniformTex ? uniformTex : getTexture( tt, level, pX, pY, pZ, 1 ) ); + i = true; } if ( faceFlags & 0x04 ) { - if ( blsmooth > 0 ) - { - if ( tileShapeZ0 <= 0 ) pZ--; // 4J - condition brought forward from 1.2.3 - llx0z = getShadeBrightness(tt, level, pX - 1, pY, pZ ); - ll0yz = getShadeBrightness(tt, level, pX, pY - 1, pZ ); - ll0Yz = getShadeBrightness(tt, level, pX, pY + 1, pZ ); - llX0z = getShadeBrightness(tt, level, pX + 1, pY, pZ ); + if ( tileShapeZ0 <= 0 ) pZ--; // 4J - condition brought forward from 1.2.3 + llx0z = getShadeBrightness(tt, level, pX - 1, pY, pZ ); + ll0yz = getShadeBrightness(tt, level, pX, pY - 1, pZ ); + ll0Yz = getShadeBrightness(tt, level, pX, pY + 1, pZ ); + llX0z = getShadeBrightness(tt, level, pX + 1, pY, pZ ); - ccx0z = getLightColor(tt, level, pX - 1, pY, pZ ); - cc0yz = getLightColor(tt, level, pX, pY - 1, pZ ); - cc0Yz = getLightColor(tt, level, pX, pY + 1, pZ ); - ccX0z = getLightColor(tt, level, pX + 1, pY, pZ ); + ccx0z = getLightColor(tt, level, pX - 1, pY, pZ ); + cc0yz = getLightColor(tt, level, pX, pY - 1, pZ ); + cc0Yz = getLightColor(tt, level, pX, pY + 1, pZ ); + ccX0z = getLightColor(tt, level, pX + 1, pY, pZ ); - if ( llTransx0z || llTrans0yz ) - { - llxyz = getShadeBrightness(tt, level, pX - 1, pY - 1, pZ ); - ccxyz = getLightColor(tt, level, pX - 1, pY - 1, pZ ); - } - else - { - llxyz = llx0z; - ccxyz = ccx0z; - } - if ( llTransx0z || llTrans0Yz ) - { - llxYz = getShadeBrightness(tt, level, pX - 1, pY + 1, pZ ); - ccxYz = getLightColor(tt, level, pX - 1, pY + 1, pZ ); - } - else - { - llxYz = llx0z; - ccxYz = ccx0z; - } - if ( llTransX0z || llTrans0yz ) - { - llXyz = getShadeBrightness(tt, level, pX + 1, pY - 1, pZ ); - ccXyz = getLightColor(tt, level, pX + 1, pY - 1, pZ ); - } - else - { - llXyz = llX0z; - ccXyz = ccX0z; - } - if ( llTransX0z || llTrans0Yz ) - { - llXYz = getShadeBrightness(tt, level, pX + 1, pY + 1, pZ ); - ccXYz = getLightColor(tt, level, pX + 1, pY + 1, pZ ); - } - else - { - llXYz = llX0z; - ccXYz = ccX0z; - } - if ( tileShapeZ0 <= 0 ) pZ++; // 4J - condition brought forward from 1.2.3 + bool llTransX0z = Tile::transculent[level->getTile(pX + 1, pY, pZ - 1)]; + bool llTransx0z = Tile::transculent[level->getTile(pX - 1, pY, pZ - 1)]; + bool llTrans0Yz = Tile::transculent[level->getTile(pX, pY + 1, pZ - 1)]; + bool llTrans0yz = Tile::transculent[level->getTile(pX, pY - 1, pZ - 1)]; + + if ( llTransx0z || llTrans0yz ) + { + llxyz = getShadeBrightness(tt, level, pX - 1, pY - 1, pZ ); + ccxyz = getLightColor(tt, level, pX - 1, pY - 1, pZ ); + } + else + { + llxyz = llx0z; + ccxyz = ccx0z; + } + if ( llTransx0z || llTrans0Yz ) + { + llxYz = getShadeBrightness(tt, level, pX - 1, pY + 1, pZ ); + ccxYz = getLightColor(tt, level, pX - 1, pY + 1, pZ ); + } + else + { + llxYz = llx0z; + ccxYz = ccx0z; + } + if ( llTransX0z || llTrans0yz ) + { + llXyz = getShadeBrightness(tt, level, pX + 1, pY - 1, pZ ); + ccXyz = getLightColor(tt, level, pX + 1, pY - 1, pZ ); + } + else + { + llXyz = llX0z; + ccXyz = ccX0z; + } + if ( llTransX0z || llTrans0Yz ) + { + llXYz = getShadeBrightness(tt, level, pX + 1, pY + 1, pZ ); + ccXYz = getLightColor(tt, level, pX + 1, pY + 1, pZ ); + } + else + { + llXYz = llX0z; + ccXYz = ccX0z; + } + if ( tileShapeZ0 <= 0 ) pZ++; - if (smoothShapeLighting && false) //minecraft->options->ambientOcclusion >= Options::AO_MAX) // 4J - disabling AO_MAX until we work out exactly what its peformance implications are/what it fixes + int cc00z = centerColor; + if (tileShapeZ0 <= 0 || !level->isSolidRenderTile(pX, pY, pZ - 1)) cc00z = tt->getLightColor(level, pX, pY, pZ - 1); + float ll00z = tt->getShadeBrightness(level, pX, pY, pZ - 1); + + { + if(smoothShapeLighting) // MGH - unifying tesselateBlockInWorldWithAmbienceOcclusionTexLighting and tesselateBlockInWorldWithAmbienceOcclusionTexLighting2 { float _ll1 = (llx0z + llxYz + ll00z + ll0Yz) / 4.0f; float _ll2 = (ll00z + ll0Yz + llX0z + llXYz) / 4.0f; @@ -4979,7 +5551,10 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* tc2 = blend(_tc1, _tc2, _tc3, _tc4, tileShapeY1 * (1.0 - tileShapeX1), tileShapeY1 * tileShapeX1, (1.0 - tileShapeY1) * tileShapeX1, (1.0 - tileShapeY1) * (1.0 - tileShapeX1)); tc3 = blend(_tc1, _tc2, _tc3, _tc4, tileShapeY0 * (1.0 - tileShapeX1), tileShapeY0 * tileShapeX1, (1.0 - tileShapeY0) * tileShapeX1, (1.0 - tileShapeY0) * (1.0 - tileShapeX1)); tc4 = blend(_tc1, _tc2, _tc3, _tc4, tileShapeY0 * (1.0 - tileShapeX0), tileShapeY0 * tileShapeX0, (1.0 - tileShapeY0) * tileShapeX0, (1.0 - tileShapeY0) * (1.0 - tileShapeX0)); - } else { + + } + else + { ll1 = ( llx0z + llxYz + ll00z + ll0Yz ) / 4.0f; ll2 = ( ll00z + ll0Yz + llX0z + llXYz ) / 4.0f; ll3 = ( ll0yz + ll00z + llXyz + llX0z ) / 4.0f; @@ -4989,16 +5564,22 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* tc2 = blend( cc0Yz, ccX0z, ccXYz, cc00z ); tc3 = blend( cc0yz, ccXyz, ccX0z, cc00z ); tc4 = blend( ccxyz, ccx0z, cc0yz, cc00z ); + } } + + if (tintSides) + { + c1r = c2r = c3r = c4r = pBaseRed * 0.8f; + c1g = c2g = c3g = c4g = pBaseGreen * 0.8f; + c1b = c2b = c3b = c4b = pBaseBlue * 0.8f; + } else { - ll1 = ll2 = ll3 = ll4 = ll00z; - tc1 = tc2 = tc3 = tc4 = cc00z; + c1r = c2r = c3r = c4r = 0.8f; + c1g = c2g = c3g = c4g = 0.8f; + c1b = c2b = c3b = c4b = 0.8f; } - c1r = c2r = c3r = c4r = ( tint2 ? pBaseRed : 1.0f ) * 0.8f; - c1g = c2g = c3g = c4g = ( tint2 ? pBaseGreen : 1.0f ) * 0.8f; - c1b = c2b = c3b = c4b = ( tint2 ? pBaseBlue : 1.0f ) * 0.8f; c1r *= ll1; c1g *= ll1; c1b *= ll1; @@ -5033,65 +5614,76 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* renderNorth( tt, ( double )pX, ( double )pY, ( double )pZ, GrassTile::getSideTextureOverlay() ); t->setMipmapEnable( prev ); } + + i = true; } if ( faceFlags & 0x08 ) { - if ( blsmooth > 0 ) - { - if ( tileShapeZ1 >= 1 ) pZ++; // 4J - condition brought forward from 1.2.3 + if ( tileShapeZ1 >= 1 ) pZ++; - llx0Z = getShadeBrightness(tt, level, pX - 1, pY, pZ ); - llX0Z = getShadeBrightness(tt, level, pX + 1, pY, pZ ); - ll0yZ = getShadeBrightness(tt, level, pX, pY - 1, pZ ); - ll0YZ = getShadeBrightness(tt, level, pX, pY + 1, pZ ); + llx0Z = getShadeBrightness(tt, level, pX - 1, pY, pZ ); + llX0Z = getShadeBrightness(tt, level, pX + 1, pY, pZ ); + ll0yZ = getShadeBrightness(tt, level, pX, pY - 1, pZ ); + ll0YZ = getShadeBrightness(tt, level, pX, pY + 1, pZ ); - ccx0Z = getLightColor(tt, level, pX - 1, pY, pZ ); - ccX0Z = getLightColor(tt, level, pX + 1, pY, pZ ); - cc0yZ = getLightColor(tt, level, pX, pY - 1, pZ ); - cc0YZ = getLightColor(tt, level, pX, pY + 1, pZ ); + ccx0Z = getLightColor(tt, level, pX - 1, pY, pZ ); + ccX0Z = getLightColor(tt, level, pX + 1, pY, pZ ); + cc0yZ = getLightColor(tt, level, pX, pY - 1, pZ ); + cc0YZ = getLightColor(tt, level, pX, pY + 1, pZ ); - if ( llTransx0Z || llTrans0yZ ) - { - llxyZ = getShadeBrightness(tt, level, pX - 1, pY - 1, pZ ); - ccxyZ = getLightColor(tt, level, pX - 1, pY - 1, pZ ); - } - else - { - llxyZ = llx0Z; - ccxyZ = ccx0Z; - } - if ( llTransx0Z || llTrans0YZ ) - { - llxYZ = getShadeBrightness(tt, level, pX - 1, pY + 1, pZ ); - ccxYZ = getLightColor(tt, level, pX - 1, pY + 1, pZ ); - } - else - { - llxYZ = llx0Z; - ccxYZ = ccx0Z; - } - if ( llTransX0Z || llTrans0yZ ) - { - llXyZ = getShadeBrightness(tt, level, pX + 1, pY - 1, pZ ); - ccXyZ = getLightColor(tt, level, pX + 1, pY - 1, pZ ); - } - else - { - llXyZ = llX0Z; - ccXyZ = ccX0Z; - } - if ( llTransX0Z || llTrans0YZ ) - { - llXYZ = getShadeBrightness(tt, level, pX + 1, pY + 1, pZ ); - ccXYZ = getLightColor(tt, level, pX + 1, pY + 1, pZ ); - } - else - { - llXYZ = llX0Z; - ccXYZ = ccX0Z; - } - if ( tileShapeZ1 >= 1 ) pZ--; // 4J - condition brought forward from 1.2.3 - if (smoothShapeLighting && false)//minecraft->options->ambientOcclusion >= Options::AO_MAX) // 4J - disabling AO_MAX until we work out exactly what its peformance implications are/what it fixes + bool llTransX0Z = Tile::transculent[level->getTile(pX + 1, pY, pZ + 1)]; + bool llTransx0Z = Tile::transculent[level->getTile(pX - 1, pY, pZ + 1)]; + bool llTrans0YZ = Tile::transculent[level->getTile(pX, pY + 1, pZ + 1)]; + bool llTrans0yZ = Tile::transculent[level->getTile(pX, pY - 1, pZ + 1)]; + + if ( llTransx0Z || llTrans0yZ ) + { + llxyZ = getShadeBrightness(tt, level, pX - 1, pY - 1, pZ ); + ccxyZ = getLightColor(tt, level, pX - 1, pY - 1, pZ ); + } + else + { + llxyZ = llx0Z; + ccxyZ = ccx0Z; + } + if ( llTransx0Z || llTrans0YZ ) + { + llxYZ = getShadeBrightness(tt, level, pX - 1, pY + 1, pZ ); + ccxYZ = getLightColor(tt, level, pX - 1, pY + 1, pZ ); + } + else + { + llxYZ = llx0Z; + ccxYZ = ccx0Z; + } + if ( llTransX0Z || llTrans0yZ ) + { + llXyZ = getShadeBrightness(tt, level, pX + 1, pY - 1, pZ ); + ccXyZ = getLightColor(tt, level, pX + 1, pY - 1, pZ ); + } + else + { + llXyZ = llX0Z; + ccXyZ = ccX0Z; + } + if ( llTransX0Z || llTrans0YZ ) + { + llXYZ = getShadeBrightness(tt, level, pX + 1, pY + 1, pZ ); + ccXYZ = getLightColor(tt, level, pX + 1, pY + 1, pZ ); + } + else + { + llXYZ = llX0Z; + ccXYZ = ccX0Z; + } + if ( tileShapeZ1 >= 1 ) pZ--; + + int cc00Z = centerColor; + if (tileShapeZ1 >= 1 || !level->isSolidRenderTile(pX, pY, pZ + 1)) cc00Z = tt->getLightColor(level, pX, pY, pZ + 1); + float ll00Z = tt->getShadeBrightness(level, pX, pY, pZ + 1); + + { + if(smoothShapeLighting) // MGH - unifying tesselateBlockInWorldWithAmbienceOcclusionTexLighting and tesselateBlockInWorldWithAmbienceOcclusionTexLighting2 { float _ll1 = (llx0Z + llxYZ + ll00Z + ll0YZ) / 4.0f; float _ll4 = (ll00Z + ll0YZ + llX0Z + llXYZ) / 4.0f; @@ -5128,14 +5720,19 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* tc2 = blend( ccxyZ, ccx0Z, cc0yZ, cc00Z ); } } + + if (tintSides) + { + c1r = c2r = c3r = c4r = pBaseRed * 0.8f; + c1g = c2g = c3g = c4g = pBaseGreen * 0.8f; + c1b = c2b = c3b = c4b = pBaseBlue * 0.8f; + } else { - ll1 = ll2 = ll3 = ll4 = ll00Z; - tc1 = tc2 = tc3 = tc4 = cc00Z; + c1r = c2r = c3r = c4r = 0.8f; + c1g = c2g = c3g = c4g = 0.8f; + c1b = c2b = c3b = c4b = 0.8f; } - c1r = c2r = c3r = c4r = ( tint3 ? pBaseRed : 1.0f ) * 0.8f; - c1g = c2g = c3g = c4g = ( tint3 ? pBaseGreen : 1.0f ) * 0.8f; - c1b = c2b = c3b = c4b = ( tint3 ? pBaseBlue : 1.0f ) * 0.8f; c1r *= ll1; c1g *= ll1; c1b *= ll1; @@ -5148,6 +5745,7 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* c4r *= ll4; c4g *= ll4; c4b *= ll4; + Icon *tex = uniformTex ? uniformTex : getTexture(tt, level, pX, pY, pZ, 3); renderSouth( tt, ( double )pX, ( double )pY, ( double )pZ, tex ); if ( fancy && (tex->getFlags() == Icon::IS_GRASS_SIDE) && !hasFixedTexture() ) @@ -5168,64 +5766,75 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* renderSouth( tt, ( double )pX, ( double )pY, ( double )pZ, GrassTile::getSideTextureOverlay() ); t->setMipmapEnable( prev ); } + + i = true; } - if ( faceFlags & 0x10 ) + if ( faceFlags & 0x10 ) // ((noCulling) || (tt->shouldRenderFace(level, pX - 1, pY, pZ, 4))) { - if ( blsmooth > 0 ) + if ( tileShapeX0 <= 0 ) pX--; // 4J - condition brought forward from 1.2.3 + llxy0 = getShadeBrightness(tt, level, pX, pY - 1, pZ ); + llx0z = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); + llx0Z = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); + llxY0 = getShadeBrightness(tt, level, pX, pY + 1, pZ ); + + ccxy0 = getLightColor(tt, level, pX, pY - 1, pZ ); + ccx0z = getLightColor(tt, level, pX, pY, pZ - 1 ); + ccx0Z = getLightColor(tt, level, pX, pY, pZ + 1 ); + ccxY0 = getLightColor(tt, level, pX, pY + 1, pZ ); + + bool llTransxY0 = Tile::transculent[level->getTile(pX - 1, pY + 1, pZ)]; + bool llTransxy0 = Tile::transculent[level->getTile(pX - 1, pY - 1, pZ)]; + bool llTransx0z = Tile::transculent[level->getTile(pX - 1, pY, pZ - 1)]; + bool llTransx0Z = Tile::transculent[level->getTile(pX - 1, pY, pZ + 1)]; + + if ( llTransx0z || llTransxy0 ) + { + llxyz = getShadeBrightness(tt, level, pX, pY - 1, pZ - 1 ); + ccxyz = getLightColor(tt, level, pX, pY - 1, pZ - 1 ); + } + else + { + llxyz = llx0z; + ccxyz = ccx0z; + } + if ( llTransx0Z || llTransxy0 ) + { + llxyZ = getShadeBrightness(tt, level, pX, pY - 1, pZ + 1 ); + ccxyZ = getLightColor(tt, level, pX, pY - 1, pZ + 1 ); + } + else { - if ( tileShapeX0 <= 0 ) pX--; // 4J - condition brought forward from 1.2.3 - llxy0 = getShadeBrightness(tt, level, pX, pY - 1, pZ ); - llx0z = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); - llx0Z = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); - llxY0 = getShadeBrightness(tt, level, pX, pY + 1, pZ ); + llxyZ = llx0Z; + ccxyZ = ccx0Z; + } + if ( llTransx0z || llTransxY0 ) + { + llxYz = getShadeBrightness(tt, level, pX, pY + 1, pZ - 1 ); + ccxYz = getLightColor(tt, level, pX, pY + 1, pZ - 1 ); + } + else + { + llxYz = llx0z; + ccxYz = ccx0z; + } + if ( llTransx0Z || llTransxY0 ) + { + llxYZ = getShadeBrightness(tt, level, pX, pY + 1, pZ + 1 ); + ccxYZ = getLightColor(tt, level, pX, pY + 1, pZ + 1 ); + } + else + { + llxYZ = llx0Z; + ccxYZ = ccx0Z; + } + if ( tileShapeX0 <= 0 ) pX++; // 4J - condition brought forward from 1.2.3 - ccxy0 = getLightColor(tt, level, pX, pY - 1, pZ ); - ccx0z = getLightColor(tt, level, pX, pY, pZ - 1 ); - ccx0Z = getLightColor(tt, level, pX, pY, pZ + 1 ); - ccxY0 = getLightColor(tt, level, pX, pY + 1, pZ ); + int ccx00 = centerColor; + if (tileShapeX0 <= 0 || !level->isSolidRenderTile(pX - 1, pY, pZ)) ccx00 = tt->getLightColor(level, pX - 1, pY, pZ); + float llx00 = tt->getShadeBrightness(level, pX - 1, pY, pZ); - if ( llTransx0z || llTransxy0 ) - { - llxyz = getShadeBrightness(tt, level, pX, pY - 1, pZ - 1 ); - ccxyz = getLightColor(tt, level, pX, pY - 1, pZ - 1 ); - } - else - { - llxyz = llx0z; - ccxyz = ccx0z; - } - if ( llTransx0Z || llTransxy0 ) - { - llxyZ = getShadeBrightness(tt, level, pX, pY - 1, pZ + 1 ); - ccxyZ = getLightColor(tt, level, pX, pY - 1, pZ + 1 ); - } - else - { - llxyZ = llx0Z; - ccxyZ = ccx0Z; - } - if ( llTransx0z || llTransxY0 ) - { - llxYz = getShadeBrightness(tt, level, pX, pY + 1, pZ - 1 ); - ccxYz = getLightColor(tt, level, pX, pY + 1, pZ - 1 ); - } - else - { - llxYz = llx0z; - ccxYz = ccx0z; - } - if ( llTransx0Z || llTransxY0 ) - { - llxYZ = getShadeBrightness(tt, level, pX, pY + 1, pZ + 1 ); - ccxYZ = getLightColor(tt, level, pX, pY + 1, pZ + 1 ); - } - else - { - llxYZ = llx0Z; - ccxYZ = ccx0Z; - } - if ( tileShapeX0 <= 0 ) pX++; // 4J - condition brought forward from 1.2.3 - if (smoothShapeLighting && false)//minecraft->options->ambientOcclusion >= Options::AO_MAX) // 4J - disabling AO_MAX until we work out exactly what its peformance implications are/what it fixes + { + if(smoothShapeLighting) // MGH - unifying tesselateBlockInWorldWithAmbienceOcclusionTexLighting and tesselateBlockInWorldWithAmbienceOcclusionTexLighting2 { float _ll4 = (llxy0 + llxyZ + llx00 + llx0Z) / 4.0f; float _ll1 = (llx00 + llx0Z + llxY0 + llxYZ) / 4.0f; @@ -5251,25 +5860,31 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* } else { - ll4 = ( llxy0 + llxyZ + llx00 + llx0Z ) / 4.0f; - ll1 = ( llx00 + llx0Z + llxY0 + llxYZ ) / 4.0f; - ll2 = ( llx0z + llx00 + llxYz + llxY0 ) / 4.0f; - ll3 = ( llxyz + llxy0 + llx0z + llx00 ) / 4.0f; - - tc4 = blend( ccxy0, ccxyZ, ccx0Z, ccx00 ); - tc1 = blend( ccx0Z, ccxY0, ccxYZ, ccx00 ); - tc2 = blend( ccx0z, ccxYz, ccxY0, ccx00 ); - tc3 = blend( ccxyz, ccxy0, ccx0z, ccx00 ); + ll4 = ( llxy0 + llxyZ + llx00 + llx0Z ) / 4.0f; + ll1 = ( llx00 + llx0Z + llxY0 + llxYZ ) / 4.0f; + ll2 = ( llx0z + llx00 + llxYz + llxY0 ) / 4.0f; + ll3 = ( llxyz + llxy0 + llx0z + llx00 ) / 4.0f; + + tc4 = blend( ccxy0, ccxyZ, ccx0Z, ccx00 ); + tc1 = blend( ccx0Z, ccxY0, ccxYZ, ccx00 ); + tc2 = blend( ccx0z, ccxYz, ccxY0, ccx00 ); + tc3 = blend( ccxyz, ccxy0, ccx0z, ccx00 ); } } + + if (tintSides) + { + c1r = c2r = c3r = c4r = pBaseRed * 0.6f; + c1g = c2g = c3g = c4g = pBaseGreen * 0.6f; + c1b = c2b = c3b = c4b = pBaseBlue * 0.6f; + } else { - ll1 = ll2 = ll3 = ll4 = llx00; - tc1 = tc2 = tc3 = tc4 = ccx00; + c1r = c2r = c3r = c4r = 0.6f; + c1g = c2g = c3g = c4g = 0.6f; + c1b = c2b = c3b = c4b = 0.6f; } - c1r = c2r = c3r = c4r = ( tint4 ? pBaseRed : 1.0f ) * 0.6f; - c1g = c2g = c3g = c4g = ( tint4 ? pBaseGreen : 1.0f ) * 0.6f; - c1b = c2b = c3b = c4b = ( tint4 ? pBaseBlue : 1.0f ) * 0.6f; + c1r *= ll1; c1g *= ll1; c1b *= ll1; @@ -5302,64 +5917,75 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* renderWest( tt, ( double )pX, ( double )pY, ( double )pZ, GrassTile::getSideTextureOverlay() ); t->setMipmapEnable( prev ); } + + i = true; } - if ( faceFlags & 0x20 ) + if ( faceFlags & 0x20 ) // ((noCulling) || (tt->shouldRenderFace(level, pX + 1, pY, pZ, 5))) { - if ( blsmooth > 0 ) - { - if ( tileShapeX1 >= 1 ) pX++; // 4J - condition brought forward from 1.2.3 - llXy0 = getShadeBrightness(tt, level, pX, pY - 1, pZ ); - llX0z = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); - llX0Z = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); - llXY0 = getShadeBrightness(tt, level, pX, pY + 1, pZ ); + if ( tileShapeX1 >= 1 ) pX++; + llXy0 = getShadeBrightness(tt, level, pX, pY - 1, pZ ); + llX0z = getShadeBrightness(tt, level, pX, pY, pZ - 1 ); + llX0Z = getShadeBrightness(tt, level, pX, pY, pZ + 1 ); + llXY0 = getShadeBrightness(tt, level, pX, pY + 1, pZ ); - ccXy0 = getLightColor(tt, level, pX, pY - 1, pZ ); - ccX0z = getLightColor(tt, level, pX, pY, pZ - 1 ); - ccX0Z = getLightColor(tt, level, pX, pY, pZ + 1 ); - ccXY0 = getLightColor(tt, level, pX, pY + 1, pZ ); + ccXy0 = getLightColor(tt, level, pX, pY - 1, pZ ); + ccX0z = getLightColor(tt, level, pX, pY, pZ - 1 ); + ccX0Z = getLightColor(tt, level, pX, pY, pZ + 1 ); + ccXY0 = getLightColor(tt, level, pX, pY + 1, pZ ); - if ( llTransXy0 || llTransX0z ) - { - llXyz = getShadeBrightness(tt, level, pX, pY - 1, pZ - 1 ); - ccXyz = getLightColor(tt, level, pX, pY - 1, pZ - 1 ); - } - else - { - llXyz = llX0z; - ccXyz = ccX0z; - } - if ( llTransXy0 || llTransX0Z ) - { - llXyZ = getShadeBrightness(tt, level, pX, pY - 1, pZ + 1 ); - ccXyZ = getLightColor(tt, level, pX, pY - 1, pZ + 1 ); - } - else - { - llXyZ = llX0Z; - ccXyZ = ccX0Z; - } - if ( llTransXY0 || llTransX0z ) - { - llXYz = getShadeBrightness(tt, level, pX, pY + 1, pZ - 1 ); - ccXYz = getLightColor(tt, level, pX, pY + 1, pZ - 1 ); - } - else - { - llXYz = llX0z; - ccXYz = ccX0z; - } - if ( llTransXY0 || llTransX0Z ) - { - llXYZ = getShadeBrightness(tt, level, pX, pY + 1, pZ + 1 ); - ccXYZ = getLightColor(tt, level, pX, pY + 1, pZ + 1 ); - } - else - { - llXYZ = llX0Z; - ccXYZ = ccX0Z; - } - if ( tileShapeX1 >= 1 ) pX--; // 4J - condition brought forward from 1.2.3 - if (smoothShapeLighting && false)//minecraft->options->ambientOcclusion >= Options::AO_MAX) // 4J - disabling AO_MAX until we work out exactly what its peformance implications are/what it fixes + bool llTransXY0 = Tile::transculent[level->getTile(pX + 1, pY + 1, pZ)]; + bool llTransXy0 = Tile::transculent[level->getTile(pX + 1, pY - 1, pZ)]; + bool llTransX0Z = Tile::transculent[level->getTile(pX + 1, pY, pZ + 1)]; + bool llTransX0z = Tile::transculent[level->getTile(pX + 1, pY, pZ - 1)]; + + if ( llTransXy0 || llTransX0z ) + { + llXyz = getShadeBrightness(tt, level, pX, pY - 1, pZ - 1 ); + ccXyz = getLightColor(tt, level, pX, pY - 1, pZ - 1 ); + } + else + { + llXyz = llX0z; + ccXyz = ccX0z; + } + if ( llTransXy0 || llTransX0Z ) + { + llXyZ = getShadeBrightness(tt, level, pX, pY - 1, pZ + 1 ); + ccXyZ = getLightColor(tt, level, pX, pY - 1, pZ + 1 ); + } + else + { + llXyZ = llX0Z; + ccXyZ = ccX0Z; + } + if ( llTransXY0 || llTransX0z ) + { + llXYz = getShadeBrightness(tt, level, pX, pY + 1, pZ - 1 ); + ccXYz = getLightColor(tt, level, pX, pY + 1, pZ - 1 ); + } + else + { + llXYz = llX0z; + ccXYz = ccX0z; + } + if ( llTransXY0 || llTransX0Z ) + { + llXYZ = getShadeBrightness(tt, level, pX, pY + 1, pZ + 1 ); + ccXYZ = getLightColor(tt, level, pX, pY + 1, pZ + 1 ); + } + else + { + llXYZ = llX0Z; + ccXYZ = ccX0Z; + } + if ( tileShapeX1 >= 1 ) pX--; // 4J - condition brought forward from 1.2.3 + + int ccX00 = centerColor; + if (tileShapeX1 >= 1 || !level->isSolidRenderTile(pX + 1, pY, pZ)) ccX00 = tt->getLightColor(level, pX + 1, pY, pZ); + float llX00 = tt->getShadeBrightness(level, pX + 1, pY, pZ); + + { + if(smoothShapeLighting) // MGH - unifying tesselateBlockInWorldWithAmbienceOcclusionTexLighting and tesselateBlockInWorldWithAmbienceOcclusionTexLighting2 { float _ll1 = (llXy0 + llXyZ + llX00 + llX0Z) / 4.0f; float _ll2 = (llXyz + llXy0 + llX0z + llX00) / 4.0f; @@ -5396,14 +6022,18 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* tc2 = blend(ccXyz, ccXy0, ccX0z, ccX00); } } + if (tintSides) + { + c1r = c2r = c3r = c4r = pBaseRed * 0.6f; + c1g = c2g = c3g = c4g = pBaseGreen * 0.6f; + c1b = c2b = c3b = c4b = pBaseBlue * 0.6f; + } else { - ll1 = ll2 = ll3 = ll4 = llX00; - tc1 = tc2 = tc3 = tc4 = ccX00; + c1r = c2r = c3r = c4r = 0.6f; + c1g = c2g = c3g = c4g = 0.6f; + c1b = c2b = c3b = c4b = 0.6f; } - c1r = c2r = c3r = c4r = ( tint5 ? pBaseRed : 1.0f ) * 0.6f; - c1g = c2g = c3g = c4g = ( tint5 ? pBaseGreen : 1.0f ) * 0.6f; - c1b = c2b = c3b = c4b = ( tint5 ? pBaseBlue : 1.0f ) * 0.6f; c1r *= ll1; c1g *= ll1; c1b *= ll1; @@ -5417,9 +6047,9 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* c4g *= ll4; c4b *= ll4; - Icon *tex = uniformTex ? uniformTex : getTexture(tt, level, pX, pY, pZ, 5); - renderEast( tt, ( double )pX, ( double )pY, ( double )pZ, tex ); - if ( fancy && (tex->getFlags() == Icon::IS_GRASS_SIDE) && !hasFixedTexture()) + Icon *tex = getTexture(tt, level, pX, pY, pZ, 5); + renderEast(tt, (double) pX, (double) pY, (double) pZ, tex); + if (fancy && (tex->getFlags() == Icon::IS_GRASS_SIDE) && !hasFixedTexture()) { c1r *= pBaseRed; c2r *= pBaseRed; @@ -5433,18 +6063,16 @@ bool TileRenderer::tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* c2b *= pBaseBlue; c3b *= pBaseBlue; c4b *= pBaseBlue; - - bool prev = t->setMipmapEnable( false ); // 4J added - this is rendering the little bit of grass at the top of the side of dirt, don't mipmap it - renderEast( tt, ( double )pX, ( double )pY, ( double )pZ, GrassTile::getSideTextureOverlay() ); - t->setMipmapEnable( prev ); + renderEast(tt, (double) pX, (double) pY, (double) pZ, GrassTile::getSideTextureOverlay()); } + i = true; } applyAmbienceOcclusion = false; return true; - } + // 4J - brought forward from 1.8.2 int TileRenderer::blend( int a, int b, int c, int def ) { @@ -5646,6 +6274,30 @@ bool TileRenderer::tesselateBlockInWorld( Tile* tt, int x, int y, int z, float r } +bool TileRenderer::tesselateBeaconInWorld(Tile *tt, int x, int y, int z) +{ + float obsHeight = 3.0f / 16.0f; + + setFixedTexture(getTexture(Tile::glass)); + setShape(0, 0, 0, 1, 1, 1); + tesselateBlockInWorld(tt, x, y, z); + + // Force drawing of all faces else the inner-block of the beacon gets culled. + noCulling = true; + setFixedTexture(getTexture(Tile::obsidian)); + setShape(2.0f / 16.0f, 0.1f / 16.0f, 2.0f / 16.0f, 14.0f / 16.0f, obsHeight, 14.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); + + setFixedTexture(getTexture(Tile::beacon)); + setShape(3.0f / 16.0f, obsHeight, 3.0f / 16.0f, 13.0f / 16.0f, 14.0f / 16.0f, 13.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); + noCulling = false; + + clearFixedTexture(); + + return true; +} + bool TileRenderer::tesselateCactusInWorld( Tile* tt, int x, int y, int z ) { int col = tt->getColor( level, x, y, z ); @@ -5692,131 +6344,44 @@ bool TileRenderer::tesselateCactusInWorld( Tile* tt, int x, int y, int z, float float b2 = c2 * b; float b3 = c3 * b; - float s = 1 / 16.0f; + float faceOffset = 1 / 16.0f; - float centerBrightness = 0.0f; - int centerColor = 0; - if ( SharedConstants::TEXTURE_LIGHTING ) - { - centerColor = getLightColor(tt, level, x, y, z ); - } - else - { - centerBrightness = tt->getBrightness( level, x, y, z ); - } + int centerColor = tt->getLightColor(level, x, y, z); - if ( noCulling || tt->shouldRenderFace( level, x, y - 1, z, 0 ) ) - { - if ( SharedConstants::TEXTURE_LIGHTING ) - { - t->tex2( tileShapeY0 > 0 ? centerColor : getLightColor(tt, level, x, y - 1, z ) ); - t->color( r10, g10, b10 ); - } - else - { - float br = tt->getBrightness( level, x, y - 1, z ); - t->color( r10 * br, g10 * br, b10 * br ); - } - renderFaceDown( tt, x, y, z, getTexture( tt, level, x, y, z, 0 ) ); - changed = true; + if (noCulling || tt->shouldRenderFace(level, x, y - 1, z, 0)) { + t->tex2(tileShapeY0 > 0 ? centerColor : tt->getLightColor(level, x, y - 1, z)); + t->color(r10, g10, b10); + renderFaceDown(tt, x, y, z, getTexture(tt, level, x, y, z, 0)); } - if ( noCulling || tt->shouldRenderFace( level, x, y + 1, z, 1 ) ) - { - if ( SharedConstants::TEXTURE_LIGHTING ) - { - t->tex2( tileShapeY1 < 1 ? centerColor : getLightColor(tt, level, x, y + 1, z ) ); - t->color( r11, g11, b11 ); - } - else - { - float br = tt->getBrightness( level, x, y + 1, z ); - if ( tileShapeY1 != 1 && !tt->material->isLiquid() ) br = centerBrightness; - t->color( r11 * br, g11 * br, b11 * br ); - } - renderFaceUp( tt, x, y, z, getTexture( tt, level, x, y, z, 1 ) ); - changed = true; + if (noCulling || tt->shouldRenderFace(level, x, y + 1, z, 1)) { + t->tex2(tileShapeY1 < 1 ? centerColor : tt->getLightColor(level, x, y + 1, z)); + t->color(r11, g11, b11); + renderFaceUp(tt, x, y, z, getTexture(tt, level, x, y, z, 1)); } - if ( noCulling || tt->shouldRenderFace( level, x, y, z - 1, 2 ) ) - { - if ( SharedConstants::TEXTURE_LIGHTING ) - { - t->tex2( tileShapeZ0 > 0 ? centerColor : getLightColor(tt, level, x, y, z - 1 ) ); - t->color( r2, g2, b2 ); - } - else - { - float br = tt->getBrightness( level, x, y, z - 1 ); - if ( tileShapeZ0 > 0 ) br = centerBrightness; - t->color( r2 * br, g2 * br, b2 * br ); - } - t->addOffset( 0, 0, s ); - renderNorth( tt, x, y, z, getTexture(tt, level, x, y, z, 2 ) ); - t->addOffset( 0, 0, -s ); - changed = true; - } + // North/South + t->tex2(centerColor); + t->color(r2, g2, b2); + t->addOffset(0, 0, faceOffset); + renderNorth(tt, x, y, z, getTexture(tt, level, x, y, z, 2)); + t->addOffset(0, 0, -faceOffset); - if ( noCulling || tt->shouldRenderFace( level, x, y, z + 1, 3 ) ) - { - if ( SharedConstants::TEXTURE_LIGHTING ) - { - t->tex2( tileShapeZ1 < 1 ? centerColor : getLightColor(tt, level, x, y, z + 1 ) ); - t->color( r2, g2, b2 ); - } - else - { - float br = tt->getBrightness( level, x, y, z + 1 ); - if ( tileShapeZ1 < 1 ) br = centerBrightness; - t->color( r2 * br, g2 * br, b2 * br ); - } - - t->addOffset( 0, 0, -s ); - renderSouth( tt, x, y, z, getTexture(tt, level, x, y, z, 3 ) ); - t->addOffset( 0, 0, s ); - changed = true; - } - - if ( noCulling || tt->shouldRenderFace( level, x - 1, y, z, 4 ) ) - { - if ( SharedConstants::TEXTURE_LIGHTING ) - { - t->tex2( tileShapeX0 > 0 ? centerColor : getLightColor(tt, level, x - 1, y, z ) ); - t->color( r3, g3, b3 ); - } - else - { - float br = tt->getBrightness( level, x - 1, y, z ); - if ( tileShapeX0 > 0 ) br = centerBrightness; - t->color( r3 * br, g3 * br, b3 * br ); - } - t->addOffset( s, 0, 0 ); - renderWest( tt, x, y, z, getTexture(tt, level, x, y, z, 4 ) ); - t->addOffset( -s, 0, 0 ); - changed = true; - } + t->addOffset(0, 0, -faceOffset); + renderSouth(tt, x, y, z, getTexture(tt, level, x, y, z, 3)); + t->addOffset(0, 0, faceOffset); - if ( noCulling || tt->shouldRenderFace( level, x + 1, y, z, 5 ) ) - { - if ( SharedConstants::TEXTURE_LIGHTING ) - { - t->tex2( tileShapeX1 < 1 ? centerColor : getLightColor(tt, level, x + 1, y, z ) ); - t->color( r3, g3, b3 ); - } - else - { - float br = tt->getBrightness( level, x + 1, y, z ); - if ( tileShapeX1 < 1 ) br = centerBrightness; - t->color( r3 * br, g3 * br, b3 * br ); - } - t->addOffset( -s, 0, 0 ); - renderEast( tt, x, y, z, getTexture(tt, level, x, y, z, 5 ) ); - t->addOffset( s, 0, 0 ); - changed = true; - } + // West/East + t->color(r3, g3, b3); + t->addOffset(faceOffset, 0, 0); + renderWest(tt, x, y, z, getTexture(tt, level, x, y, z, 4)); + t->addOffset(-faceOffset, 0, 0); - return changed; + t->addOffset(-faceOffset, 0, 0); + renderEast(tt, x, y, z, getTexture(tt, level, x, y, z, 5)); + t->addOffset(faceOffset, 0, 0); + return true; } bool TileRenderer::tesselateFenceInWorld( FenceTile* tt, int x, int y, int z ) @@ -5942,65 +6507,65 @@ bool TileRenderer::tesselateWallInWorld(WallTile *tt, int x, int y, int z) bool TileRenderer::tesselateEggInWorld(EggTile *tt, int x, int y, int z) { - bool changed = false; - - int y0 = 0; - for (int i = 0; i < 8; i++) - { - int ww = 0; - int hh = 1; - if (i == 0) ww = 2; - if (i == 1) ww = 3; - if (i == 2) ww = 4; - if (i == 3) - { - ww = 5; - hh = 2; - } - if (i == 4) - { - ww = 6; - hh = 3; - } - if (i == 5) - { - ww = 7; - hh = 5; - } - if (i == 6) - { - ww = 6; - hh = 2; - } - if (i == 7) ww = 3; - float w = ww / 16.0f; - float yy1 = 1 - (y0 / 16.0f); - float yy0 = 1 - ((y0 + hh) / 16.0f); - y0 += hh; - setShape(0.5f - w, yy0, 0.5f - w, 0.5f + w, yy1, 0.5f + w); - tesselateBlockInWorld(tt, x, y, z); - } - changed = true; - - setShape(0, 0, 0, 1, 1, 1); - - return changed; + bool changed = false; + + int y0 = 0; + for (int i = 0; i < 8; i++) + { + int ww = 0; + int hh = 1; + if (i == 0) ww = 2; + if (i == 1) ww = 3; + if (i == 2) ww = 4; + if (i == 3) + { + ww = 5; + hh = 2; + } + if (i == 4) + { + ww = 6; + hh = 3; + } + if (i == 5) + { + ww = 7; + hh = 5; + } + if (i == 6) + { + ww = 6; + hh = 2; + } + if (i == 7) ww = 3; + float w = ww / 16.0f; + float yy1 = 1 - (y0 / 16.0f); + float yy0 = 1 - ((y0 + hh) / 16.0f); + y0 += hh; + setShape(0.5f - w, yy0, 0.5f - w, 0.5f + w, yy1, 0.5f + w); + tesselateBlockInWorld(tt, x, y, z); + } + changed = true; + + setShape(0, 0, 0, 1, 1, 1); + + return changed; } bool TileRenderer::tesselateFenceGateInWorld(FenceGateTile *tt, int x, int y, int z) { - bool changed = true; + bool changed = true; - int data = level->getData(x, y, z); - bool isOpen = FenceGateTile::isOpen(data); - int direction = DirectionalTile::getDirection(data); + int data = level->getData(x, y, z); + bool isOpen = FenceGateTile::isOpen(data); + int direction = DirectionalTile::getDirection(data); - float h00 = 6 / 16.0f; - float h01 = 9 / 16.0f; - float h10 = 12 / 16.0f; - float h11 = 15 / 16.0f; - float h20 = 5 / 16.0f; - float h21 = 16 / 16.0f; + float h00 = 6 / 16.0f; + float h01 = 9 / 16.0f; + float h10 = 12 / 16.0f; + float h11 = 15 / 16.0f; + float h20 = 5 / 16.0f; + float h21 = 16 / 16.0f; if (((direction == Direction::NORTH || direction == Direction::SOUTH) && level->getTile(x - 1, y, z) == Tile::cobbleWall_Id && level->getTile(x + 1, y, z) == Tile::cobbleWall_Id) || ((direction == Direction::EAST || direction == Direction::WEST) && level->getTile(x, y, z - 1) == Tile::cobbleWall_Id && level->getTile(x, y, z + 1) == Tile::cobbleWall_Id)) @@ -6015,37 +6580,37 @@ bool TileRenderer::tesselateFenceGateInWorld(FenceGateTile *tt, int x, int y, in noCulling = true; - // edge sticks - if (direction == Direction::EAST || direction == Direction::WEST) + // edge sticks + if (direction == Direction::EAST || direction == Direction::WEST) { upFlip = FLIP_CW; - float x0 = 7 / 16.0f; - float x1 = 9 / 16.0f; - float z0 = 0 / 16.0f; - float z1 = 2 / 16.0f; - setShape(x0, h20, z0, x1, h21, z1); - tesselateBlockInWorld(tt, x, y, z); - - z0 = 14 / 16.0f; - z1 = 16 / 16.0f; - setShape(x0, h20, z0, x1, h21, z1); - tesselateBlockInWorld(tt, x, y, z); + float x0 = 7 / 16.0f; + float x1 = 9 / 16.0f; + float z0 = 0 / 16.0f; + float z1 = 2 / 16.0f; + setShape(x0, h20, z0, x1, h21, z1); + tesselateBlockInWorld(tt, x, y, z); + + z0 = 14 / 16.0f; + z1 = 16 / 16.0f; + setShape(x0, h20, z0, x1, h21, z1); + tesselateBlockInWorld(tt, x, y, z); upFlip = FLIP_NONE; - } + } else { - float x0 = 0 / 16.0f; - float x1 = 2 / 16.0f; - float z0 = 7 / 16.0f; - float z1 = 9 / 16.0f; - setShape(x0, h20, z0, x1, h21, z1); - tesselateBlockInWorld(tt, x, y, z); - - x0 = 14 / 16.0f; - x1 = 16 / 16.0f; - setShape(x0, h20, z0, x1, h21, z1); - tesselateBlockInWorld(tt, x, y, z); - } + float x0 = 0 / 16.0f; + float x1 = 2 / 16.0f; + float z0 = 7 / 16.0f; + float z1 = 9 / 16.0f; + setShape(x0, h20, z0, x1, h21, z1); + tesselateBlockInWorld(tt, x, y, z); + + x0 = 14 / 16.0f; + x1 = 16 / 16.0f; + setShape(x0, h20, z0, x1, h21, z1); + tesselateBlockInWorld(tt, x, y, z); + } if (isOpen) { if (direction == Direction::NORTH || direction == Direction::SOUTH) @@ -6095,131 +6660,370 @@ bool TileRenderer::tesselateFenceGateInWorld(FenceGateTile *tt, int x, int y, in setShape(x0, h00, z10, x1, h11, z11); tesselateBlockInWorld(tt, x, y, z); - setShape(x1, h00, z00, x2, h01, z01); - tesselateBlockInWorld(tt, x, y, z); - setShape(x1, h00, z10, x2, h01, z11); - tesselateBlockInWorld(tt, x, y, z); + setShape(x1, h00, z00, x2, h01, z01); + tesselateBlockInWorld(tt, x, y, z); + setShape(x1, h00, z10, x2, h01, z11); + tesselateBlockInWorld(tt, x, y, z); + + setShape(x1, h10, z00, x2, h11, z01); + tesselateBlockInWorld(tt, x, y, z); + setShape(x1, h10, z10, x2, h11, z11); + tesselateBlockInWorld(tt, x, y, z); + } + else if (direction == Direction::SOUTH) + { + + const float x00 = 0 / 16.0f; + const float x01 = 2 / 16.0f; + const float x10 = 14 / 16.0f; + const float x11 = 16 / 16.0f; + + const float z0 = 9 / 16.0f; + const float z1 = 13 / 16.0f; + const float z2 = 15 / 16.0f; + + setShape(x00, h00, z1, x01, h11, z2); + tesselateBlockInWorld(tt, x, y, z); + setShape(x10, h00, z1, x11, h11, z2); + tesselateBlockInWorld(tt, x, y, z); + + setShape(x00, h00, z0, x01, h01, z1); + tesselateBlockInWorld(tt, x, y, z); + setShape(x10, h00, z0, x11, h01, z1); + tesselateBlockInWorld(tt, x, y, z); + + setShape(x00, h10, z0, x01, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + setShape(x10, h10, z0, x11, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + } + else if (direction == Direction::NORTH) + { + const float x00 = 0 / 16.0f; + const float x01 = 2 / 16.0f; + const float x10 = 14 / 16.0f; + const float x11 = 16 / 16.0f; + + const float z0 = 1 / 16.0f; + const float z1 = 3 / 16.0f; + const float z2 = 7 / 16.0f; + + setShape(x00, h00, z0, x01, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + setShape(x10, h00, z0, x11, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + + setShape(x00, h00, z1, x01, h01, z2); + tesselateBlockInWorld(tt, x, y, z); + setShape(x10, h00, z1, x11, h01, z2); + tesselateBlockInWorld(tt, x, y, z); + + setShape(x00, h10, z1, x01, h11, z2); + tesselateBlockInWorld(tt, x, y, z); + setShape(x10, h10, z1, x11, h11, z2); + tesselateBlockInWorld(tt, x, y, z); + } + } + else + { + if (direction == Direction::EAST || direction == Direction::WEST) + { + upFlip = FLIP_CW; + float x0 = 7 / 16.0f; + float x1 = 9 / 16.0f; + float z0 = 6 / 16.0f; + float z1 = 8 / 16.0f; + setShape(x0, h00, z0, x1, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + z0 = 8 / 16.0f; + z1 = 10 / 16.0f; + setShape(x0, h00, z0, x1, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + z0 = 10 / 16.0f; + z1 = 14 / 16.0f; + setShape(x0, h00, z0, x1, h01, z1); + tesselateBlockInWorld(tt, x, y, z); + setShape(x0, h10, z0, x1, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + z0 = 2 / 16.0f; + z1 = 6 / 16.0f; + setShape(x0, h00, z0, x1, h01, z1); + tesselateBlockInWorld(tt, x, y, z); + setShape(x0, h10, z0, x1, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + } + else + { + float x0 = 6 / 16.0f; + float x1 = 8 / 16.0f; + float z0 = 7 / 16.0f; + float z1 = 9 / 16.0f; + setShape(x0, h00, z0, x1, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + x0 = 8 / 16.0f; + x1 = 10 / 16.0f; + setShape(x0, h00, z0, x1, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + x0 = 10 / 16.0f; + x1 = 14 / 16.0f; + setShape(x0, h00, z0, x1, h01, z1); + tesselateBlockInWorld(tt, x, y, z); + setShape(x0, h10, z0, x1, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + x0 = 2 / 16.0f; + x1 = 6 / 16.0f; + setShape(x0, h00, z0, x1, h01, z1); + tesselateBlockInWorld(tt, x, y, z); + setShape(x0, h10, z0, x1, h11, z1); + tesselateBlockInWorld(tt, x, y, z); + + } + } + noCulling = false; + upFlip = FLIP_NONE; + + setShape(0, 0, 0, 1, 1, 1); + + return changed; +} + +bool TileRenderer::tesselateHopperInWorld(Tile *tt, int x, int y, int z) +{ + Tesselator *t = Tesselator::getInstance(); + + float br; + if (SharedConstants::TEXTURE_LIGHTING) + { + t->tex2(tt->getLightColor(level, x, y, z)); + br = 1; + } + else + { + br = tt->getBrightness(level, x, y, z); + } + int col = tt->getColor(level, x, y, z); + float r = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + if (GameRenderer::anaglyph3d) + { + float cr = (r * 30 + g * 59 + b * 11) / 100; + float cg = (r * 30 + g * 70) / (100); + float cb = (r * 30 + b * 70) / (100); + + r = cr; + g = cg; + b = cb; + } + t->color(br * r, br * g, br * b); + + return tesselateHopperInWorld(tt, x, y, z, level->getData(x, y, z), false); +} + +bool TileRenderer::tesselateHopperInWorld(Tile *tt, int x, int y, int z, int data, bool render) +{ + Tesselator *t = Tesselator::getInstance(); + int facing = HopperTile::getAttachedFace(data); + + // bounding box first + double bottom = 10.0 / 16.0; + setShape(0, bottom, 0, 1, 1, 1); + + if (render) + { + t->begin(); + t->normal(0, -1, 0); + renderFaceDown(tt, 0, 0, 0, getTexture(tt, 0, data)); + t->end(); + + t->begin(); + t->normal(0, 1, 0); + renderFaceUp(tt, 0, 0, 0, getTexture(tt, 1, data)); + t->end(); + + t->begin(); + t->normal(0, 0, -1); + renderNorth(tt, 0, 0, 0, getTexture(tt, 2, data)); + t->end(); + + t->begin(); + t->normal(0, 0, 1); + renderSouth(tt, 0, 0, 0, getTexture(tt, 3, data)); + t->end(); + + t->begin(); + t->normal(-1, 0, 0); + renderWest(tt, 0, 0, 0, getTexture(tt, 4, data)); + t->end(); + + t->begin(); + t->normal(1, 0, 0); + renderEast(tt, 0, 0, 0, getTexture(tt, 5, data)); + t->end(); + } + else + { + tesselateBlockInWorld(tt, x, y, z); + } + + if (!render) + { + float br; + if (SharedConstants::TEXTURE_LIGHTING) + { + t->tex2(tt->getLightColor(level, x, y, z)); + br = 1; + } + else + { + br = tt->getBrightness(level, x, y, z); + } + int col = tt->getColor(level, x, y, z); + float r = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; + + if (GameRenderer::anaglyph3d) { + float cr = (r * 30 + g * 59 + b * 11) / 100; + float cg = (r * 30 + g * 70) / (100); + float cb = (r * 30 + b * 70) / (100); + + r = cr; + g = cg; + b = cb; + } + t->color(br * r, br * g, br * b); + } + + // render inside + Icon *hopperTex = HopperTile::getTexture(HopperTile::TEXTURE_OUTSIDE); + Icon *bottomTex = HopperTile::getTexture(HopperTile::TEXTURE_INSIDE); + float cWidth = 2.0f / 16.0f; + + if (render) + { + t->begin(); + t->normal(1, 0, 0); + renderEast(tt, -1.0f + cWidth, 0, 0, hopperTex); + t->end(); + + t->begin(); + t->normal(-1, 0, 0); + renderWest(tt, 1.0f - cWidth, 0, 0, hopperTex); + t->end(); - setShape(x1, h10, z00, x2, h11, z01); - tesselateBlockInWorld(tt, x, y, z); - setShape(x1, h10, z10, x2, h11, z11); - tesselateBlockInWorld(tt, x, y, z); - } - else if (direction == Direction::SOUTH) - { + t->begin(); + t->normal(0, 0, 1); + renderSouth(tt, 0, 0, -1.0f + cWidth, hopperTex); + t->end(); - const float x00 = 0 / 16.0f; - const float x01 = 2 / 16.0f; - const float x10 = 14 / 16.0f; - const float x11 = 16 / 16.0f; + t->begin(); + t->normal(0, 0, -1); + renderNorth(tt, 0, 0, 1.0f - cWidth, hopperTex); + t->end(); - const float z0 = 9 / 16.0f; - const float z1 = 13 / 16.0f; - const float z2 = 15 / 16.0f; + t->begin(); + t->normal(0, 1, 0); + renderFaceUp(tt, 0, -1.0f + bottom, 0, bottomTex); + t->end(); + } + else + { + renderEast(tt, x - 1.0f + cWidth, y, z, hopperTex); + renderWest(tt, x + 1.0f - cWidth, y, z, hopperTex); + renderSouth(tt, x, y, z - 1.0f + cWidth, hopperTex); + renderNorth(tt, x, y, z + 1.0f - cWidth, hopperTex); + renderFaceUp(tt, x, y - 1.0f + bottom, z, bottomTex); + } - setShape(x00, h00, z1, x01, h11, z2); - tesselateBlockInWorld(tt, x, y, z); - setShape(x10, h00, z1, x11, h11, z2); - tesselateBlockInWorld(tt, x, y, z); + // render bottom box + setFixedTexture(hopperTex); + double inset = 4.0 / 16.0; + double lboxy0 = 4.0 / 16.0; + double lboxy1 = bottom; + setShape(inset, lboxy0, inset, 1.0 - inset, lboxy1 - .002, 1.0 - inset); - setShape(x00, h00, z0, x01, h01, z1); - tesselateBlockInWorld(tt, x, y, z); - setShape(x10, h00, z0, x11, h01, z1); - tesselateBlockInWorld(tt, x, y, z); + if (render) + { + t->begin(); + t->normal(1, 0, 0); + renderEast(tt, 0, 0, 0, hopperTex); + t->end(); - setShape(x00, h10, z0, x01, h11, z1); - tesselateBlockInWorld(tt, x, y, z); - setShape(x10, h10, z0, x11, h11, z1); - tesselateBlockInWorld(tt, x, y, z); - } - else if (direction == Direction::NORTH) - { - const float x00 = 0 / 16.0f; - const float x01 = 2 / 16.0f; - const float x10 = 14 / 16.0f; - const float x11 = 16 / 16.0f; + t->begin(); + t->normal(-1, 0, 0); + renderWest(tt, 0, 0, 0, hopperTex); + t->end(); - const float z0 = 1 / 16.0f; - const float z1 = 3 / 16.0f; - const float z2 = 7 / 16.0f; + t->begin(); + t->normal(0, 0, 1); + renderSouth(tt, 0, 0, 0, hopperTex); + t->end(); - setShape(x00, h00, z0, x01, h11, z1); - tesselateBlockInWorld(tt, x, y, z); - setShape(x10, h00, z0, x11, h11, z1); - tesselateBlockInWorld(tt, x, y, z); + t->begin(); + t->normal(0, 0, -1); + renderNorth(tt, 0, 0, 0, hopperTex); + t->end(); - setShape(x00, h00, z1, x01, h01, z2); - tesselateBlockInWorld(tt, x, y, z); - setShape(x10, h00, z1, x11, h01, z2); - tesselateBlockInWorld(tt, x, y, z); + t->begin(); + t->normal(0, 1, 0); + renderFaceUp(tt, 0, 0, 0, hopperTex); + t->end(); - setShape(x00, h10, z1, x01, h11, z2); - tesselateBlockInWorld(tt, x, y, z); - setShape(x10, h10, z1, x11, h11, z2); - tesselateBlockInWorld(tt, x, y, z); - } + t->begin(); + t->normal(0, -1, 0); + renderFaceDown(tt, 0, 0, 0, hopperTex); + t->end(); } else { - if (direction == Direction::EAST || direction == Direction::WEST) + tesselateBlockInWorld(tt, x, y, z); + } + + if (!render) + { + // render pipe + double pipe = 6.0 / 16.0; + double pipeW = 4.0 / 16.0; + setFixedTexture(hopperTex); + + // down + if (facing == Facing::DOWN) { - upFlip = FLIP_CW; - float x0 = 7 / 16.0f; - float x1 = 9 / 16.0f; - float z0 = 6 / 16.0f; - float z1 = 8 / 16.0f; - setShape(x0, h00, z0, x1, h11, z1); - tesselateBlockInWorld(tt, x, y, z); - z0 = 8 / 16.0f; - z1 = 10 / 16.0f; - setShape(x0, h00, z0, x1, h11, z1); - tesselateBlockInWorld(tt, x, y, z); - z0 = 10 / 16.0f; - z1 = 14 / 16.0f; - setShape(x0, h00, z0, x1, h01, z1); - tesselateBlockInWorld(tt, x, y, z); - setShape(x0, h10, z0, x1, h11, z1); - tesselateBlockInWorld(tt, x, y, z); - z0 = 2 / 16.0f; - z1 = 6 / 16.0f; - setShape(x0, h00, z0, x1, h01, z1); - tesselateBlockInWorld(tt, x, y, z); - setShape(x0, h10, z0, x1, h11, z1); + setShape(pipe, 0, pipe, 1.0 - pipe, 4.0 / 16.0, 1.0 - pipe); tesselateBlockInWorld(tt, x, y, z); } - else + // north + if (facing == Facing::NORTH) { - float x0 = 6 / 16.0f; - float x1 = 8 / 16.0f; - float z0 = 7 / 16.0f; - float z1 = 9 / 16.0f; - setShape(x0, h00, z0, x1, h11, z1); - tesselateBlockInWorld(tt, x, y, z); - x0 = 8 / 16.0f; - x1 = 10 / 16.0f; - setShape(x0, h00, z0, x1, h11, z1); - tesselateBlockInWorld(tt, x, y, z); - x0 = 10 / 16.0f; - x1 = 14 / 16.0f; - setShape(x0, h00, z0, x1, h01, z1); + setShape(pipe, lboxy0, 0, 1.0 - pipe, lboxy0 + pipeW, inset); tesselateBlockInWorld(tt, x, y, z); - setShape(x0, h10, z0, x1, h11, z1); + } + // south + if (facing == Facing::SOUTH) + { + setShape(pipe, lboxy0, 1.0 - inset, 1.0 - pipe, lboxy0 + pipeW, 1.0); tesselateBlockInWorld(tt, x, y, z); - x0 = 2 / 16.0f; - x1 = 6 / 16.0f; - setShape(x0, h00, z0, x1, h01, z1); + } + // west + if (facing == Facing::WEST) + { + setShape(0, lboxy0, pipe, inset, lboxy0 + pipeW, 1.0 - pipe); tesselateBlockInWorld(tt, x, y, z); - setShape(x0, h10, z0, x1, h11, z1); + } + // east + if (facing == Facing::EAST) + { + setShape(1.0 - inset, lboxy0, pipe, 1.0, lboxy0 + pipeW, 1.0 - pipe); tesselateBlockInWorld(tt, x, y, z); - } } - noCulling = false; - upFlip = FLIP_NONE; - setShape(0, 0, 0, 1, 1, 1); + clearFixedTexture(); + + return true; - return changed; } bool TileRenderer::tesselateStairsInWorld( StairTile* tt, int x, int y, int z ) @@ -6469,9 +7273,9 @@ void TileRenderer::renderFaceDown( Tile* tt, double x, double y, double z, Icon if( t->getCompactVertices() ) { t->tileQuad(( float )( x0 ), ( float )( y0 ), ( float )( z1 ), ( float )( u10 ), ( float )( v10 ), c1r, c1g, c1b, tc1, - ( float )( x0 ), ( float )( y0 ), ( float )( z0 ), ( float )( u00 ), ( float )( v00 ), c2r, c2g, c2b, tc2, - ( float )( x1 ), ( float )( y0 ), ( float )( z0 ), ( float )( u01 ), ( float )( v01 ), c3r, c3g, c3b, tc3, - ( float )( x1 ), ( float )( y0 ), ( float )( z1 ), ( float )( u11 ), ( float )( v11 ), c4r, c4g, c4b, tc4); + ( float )( x0 ), ( float )( y0 ), ( float )( z0 ), ( float )( u00 ), ( float )( v00 ), c2r, c2g, c2b, tc2, + ( float )( x1 ), ( float )( y0 ), ( float )( z0 ), ( float )( u01 ), ( float )( v01 ), c3r, c3g, c3b, tc3, + ( float )( x1 ), ( float )( y0 ), ( float )( z1 ), ( float )( u11 ), ( float )( v11 ), c4r, c4g, c4b, tc4); return; } #endif @@ -6581,9 +7385,9 @@ void TileRenderer::renderFaceUp( Tile* tt, double x, double y, double z, Icon *t if( t->getCompactVertices() ) { t->tileQuad(( float )( x1 ), ( float )( y1 ), ( float )( z1 ), ( float )( u11 ), ( float )( v11 ), c1r, c1g, c1b, tc1, - ( float )( x1 ), ( float )( y1 ), ( float )( z0 ), ( float )( u01 ), ( float )( v01 ), c2r, c2g, c2b, tc2, - ( float )( x0 ), ( float )( y1 ), ( float )( z0 ), ( float )( u00 ), ( float )( v00 ), c3r, c3g, c3b, tc3, - ( float )( x0 ), ( float )( y1 ), ( float )( z1 ), ( float )( u10 ), ( float )( v10 ), c4r, c4g, c4b, tc4); + ( float )( x1 ), ( float )( y1 ), ( float )( z0 ), ( float )( u01 ), ( float )( v01 ), c2r, c2g, c2b, tc2, + ( float )( x0 ), ( float )( y1 ), ( float )( z0 ), ( float )( u00 ), ( float )( v00 ), c3r, c3g, c3b, tc3, + ( float )( x0 ), ( float )( y1 ), ( float )( z1 ), ( float )( u10 ), ( float )( v10 ), c4r, c4g, c4b, tc4); return; } #endif @@ -6700,9 +7504,9 @@ void TileRenderer::renderNorth( Tile* tt, double x, double y, double z, Icon *te if( t->getCompactVertices() ) { t->tileQuad(( float )( x0 ), ( float )( y1 ), ( float )( z0 ), ( float )( u01 ), ( float )( v01 ), c1r, c1g, c1b, tc1, - ( float )( x1 ), ( float )( y1 ), ( float )( z0 ), ( float )( u00 ), ( float )( v00 ), c2r, c2g, c2b, tc2, - ( float )( x1 ), ( float )( y0 ), ( float )( z0 ), ( float )( u10 ), ( float )( v10 ), c3r, c3g, c3b, tc3, - ( float )( x0 ), ( float )( y0 ), ( float )( z0 ), ( float )( u11 ), ( float )( v11 ), c4r, c4g, c4b, tc4); + ( float )( x1 ), ( float )( y1 ), ( float )( z0 ), ( float )( u00 ), ( float )( v00 ), c2r, c2g, c2b, tc2, + ( float )( x1 ), ( float )( y0 ), ( float )( z0 ), ( float )( u10 ), ( float )( v10 ), c3r, c3g, c3b, tc3, + ( float )( x0 ), ( float )( y0 ), ( float )( z0 ), ( float )( u11 ), ( float )( v11 ), c4r, c4g, c4b, tc4); return; } #endif @@ -6819,9 +7623,9 @@ void TileRenderer::renderSouth( Tile* tt, double x, double y, double z, Icon *te if( t->getCompactVertices() ) { t->tileQuad(( float )( x0 ), ( float )( y1 ), ( float )( z1 ), ( float )( u00 ), ( float )( v00 ), c1r, c1g, c1b, tc1, - ( float )( x0 ), ( float )( y0 ), ( float )( z1 ), ( float )( u10 ), ( float )( v10 ), c2r, c2g, c2b, tc2, - ( float )( x1 ), ( float )( y0 ), ( float )( z1 ), ( float )( u11 ), ( float )( v11 ), c3r, c3g, c3b, tc3, - ( float )( x1 ), ( float )( y1 ), ( float )( z1 ), ( float )( u01 ), ( float )( v01 ), c4r, c4g, c4b, tc4); + ( float )( x0 ), ( float )( y0 ), ( float )( z1 ), ( float )( u10 ), ( float )( v10 ), c2r, c2g, c2b, tc2, + ( float )( x1 ), ( float )( y0 ), ( float )( z1 ), ( float )( u11 ), ( float )( v11 ), c3r, c3g, c3b, tc3, + ( float )( x1 ), ( float )( y1 ), ( float )( z1 ), ( float )( u01 ), ( float )( v01 ), c4r, c4g, c4b, tc4); return; } #endif @@ -6937,9 +7741,9 @@ void TileRenderer::renderWest( Tile* tt, double x, double y, double z, Icon *tex if( t->getCompactVertices() ) { t->tileQuad(( float )( x0 ), ( float )( y1 ), ( float )( z1 ), ( float )( u01 ), ( float )( v01 ), c1r, c1g, c1b, tc1, - ( float )( x0 ), ( float )( y1 ), ( float )( z0 ), ( float )( u00 ), ( float )( v00 ), c2r, c2g, c2b, tc2, - ( float )( x0 ), ( float )( y0 ), ( float )( z0 ), ( float )( u10 ), ( float )( v10 ), c3r, c3g, c3b, tc3, - ( float )( x0 ), ( float )( y0 ), ( float )( z1 ), ( float )( u11 ), ( float )( v11 ), c4r, c4g, c4b, tc4); + ( float )( x0 ), ( float )( y1 ), ( float )( z0 ), ( float )( u00 ), ( float )( v00 ), c2r, c2g, c2b, tc2, + ( float )( x0 ), ( float )( y0 ), ( float )( z0 ), ( float )( u10 ), ( float )( v10 ), c3r, c3g, c3b, tc3, + ( float )( x0 ), ( float )( y0 ), ( float )( z1 ), ( float )( u11 ), ( float )( v11 ), c4r, c4g, c4b, tc4); return; } #endif @@ -7055,9 +7859,9 @@ void TileRenderer::renderEast( Tile* tt, double x, double y, double z, Icon *tex if( t->getCompactVertices() ) { t->tileQuad(( float )( x1 ), ( float )( y0 ), ( float )( z1 ), ( float )( u10 ), ( float )( v10 ), c1r, c1g, c1b, tc1, - ( float )( x1 ), ( float )( y0 ), ( float )( z0 ), ( float )( u11 ), ( float )( v11 ), c2r, c2g, c2b, tc2, - ( float )( x1 ), ( float )( y1 ), ( float )( z0 ), ( float )( u01 ), ( float )( v01 ), c3r, c3g, c3b, tc3, - ( float )( x1 ), ( float )( y1 ), ( float )( z1 ), ( float )( u00 ), ( float )( v00 ), c4r, c4g, c4b, tc4); + ( float )( x1 ), ( float )( y0 ), ( float )( z0 ), ( float )( u11 ), ( float )( v11 ), c2r, c2g, c2b, tc2, + ( float )( x1 ), ( float )( y1 ), ( float )( z0 ), ( float )( u01 ), ( float )( v01 ), c3r, c3g, c3b, tc3, + ( float )( x1 ), ( float )( y1 ), ( float )( z1 ), ( float )( u00 ), ( float )( v00 ), c4r, c4g, c4b, tc4); return; } #endif @@ -7124,7 +7928,7 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl bool isGrass = tile->id == Tile::grass_Id; - if (tile == Tile::dispenser || tile == Tile::furnace) // || tile == Tile.dropper + if (tile == Tile::dispenser || tile == Tile::furnace || tile == Tile::dropper) { data = 3; } @@ -7132,10 +7936,10 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl if ( setColor ) { int col = tile->getColor( data ); - if (isGrass) + if (isGrass) { - col = 0xffffff; - } + col = 0xffffff; + } float red = ( ( col >> 16 ) & 0xff ) / 255.0f; float g = ( ( col >> 8 ) & 0xff ) / 255.0f; float b = ( ( col )& 0xff ) / 255.0f; @@ -7165,25 +7969,25 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl renderFaceDown( tile, 0, 0, 0, getTexture(tile, 0, data ) ); t->end(); - if (isGrass && setColor) + if (isGrass && setColor) { - int col = tile->getColor(data); - float red = ((col >> 16) & 0xff) / 255.0f; - float g = ((col >> 8) & 0xff) / 255.0f; - float b = ((col) & 0xff) / 255.0f; + int col = tile->getColor(data); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; - glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); - } + glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); + } t->begin(); t->normal( 0, 1, 0 ); renderFaceUp( tile, 0, 0, 0, getTexture(tile, 1, data ) ); t->end(); - if (isGrass && setColor) + if (isGrass && setColor) { - glColor4f(brightness, brightness, brightness, fAlpha); - } + glColor4f(brightness, brightness, brightness, fAlpha); + } t->begin(); t->normal( 0, 0, -1 ); @@ -7192,20 +7996,20 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl if (isGrass && setColor) { - int col = tile->getColor(data); - float red = ((col >> 16) & 0xff) / 255.0f; - float g = ((col >> 8) & 0xff) / 255.0f; - float b = ((col) & 0xff) / 255.0f; + int col = tile->getColor(data); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; - glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); + glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); t->begin(); t->normal( 0, 0, -1 ); renderNorth( tile, 0, 0, 0, GrassTile::getSideTextureOverlay() ); t->end(); - glColor4f(brightness, brightness, brightness, fAlpha); - } + glColor4f(brightness, brightness, brightness, fAlpha); + } t->begin(); t->normal( 0, 0, 1 ); @@ -7214,20 +8018,20 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl if (isGrass && setColor) { - int col = tile->getColor(data); - float red = ((col >> 16) & 0xff) / 255.0f; - float g = ((col >> 8) & 0xff) / 255.0f; - float b = ((col) & 0xff) / 255.0f; + int col = tile->getColor(data); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; - glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); + glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); t->begin(); t->normal( 0, 0, 1 ); renderSouth( tile, 0, 0, 0, GrassTile::getSideTextureOverlay() ); t->end(); - glColor4f(brightness, brightness, brightness, fAlpha); - } + glColor4f(brightness, brightness, brightness, fAlpha); + } t->begin(); t->normal( -1, 0, 0 ); @@ -7236,20 +8040,20 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl if (isGrass && setColor) { - int col = tile->getColor(data); - float red = ((col >> 16) & 0xff) / 255.0f; - float g = ((col >> 8) & 0xff) / 255.0f; - float b = ((col) & 0xff) / 255.0f; + int col = tile->getColor(data); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; - glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); + glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); t->begin(); t->normal( -1, 0, 0 ); renderWest( tile, 0, 0, 0, GrassTile::getSideTextureOverlay() ); t->end(); - glColor4f(brightness, brightness, brightness, fAlpha); - } + glColor4f(brightness, brightness, brightness, fAlpha); + } t->begin(); t->normal( 1, 0, 0 ); @@ -7258,10 +8062,10 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl if (isGrass && setColor) { - int col = tile->getColor(data); - float red = ((col >> 16) & 0xff) / 255.0f; - float g = ((col >> 8) & 0xff) / 255.0f; - float b = ((col) & 0xff) / 255.0f; + int col = tile->getColor(data); + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; glColor4f(red * brightness, g * brightness, b * brightness, fAlpha); @@ -7270,8 +8074,8 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl renderEast( tile, 0, 0, 0, GrassTile::getSideTextureOverlay() ); t->end(); - glColor4f(brightness, brightness, brightness, fAlpha); - } + glColor4f(brightness, brightness, brightness, fAlpha); + } glTranslatef( 0.5f, 0.5f, 0.5f ); } @@ -7282,7 +8086,7 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl tesselateCrossTexture( tile, data, -0.5f, -0.5f, -0.5f, 1 ); t->end(); } - else if (shape == Tile::SHAPE_STEM) + else if (shape == Tile::SHAPE_STEM) { t->begin(); t->normal(0, -1, 0); @@ -7290,12 +8094,12 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl tesselateStemTexture(tile, data, tileShapeY1, -0.5f, -0.5f, -0.5f); t->end(); } - else if (shape == Tile::SHAPE_LILYPAD) + else if (shape == Tile::SHAPE_LILYPAD) { - t->begin(); - t->normal(0, -1, 0); - tile->updateDefaultShape(); - t->end(); + t->begin(); + t->normal(0, -1, 0); + tile->updateDefaultShape(); + t->end(); } else if ( shape == Tile::SHAPE_CACTUS ) { @@ -7341,13 +8145,13 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl t->end(); glTranslatef( 0.5f, 0.5f, 0.5f ); - } + } else if (shape == Tile::SHAPE_ENTITYTILE_ANIMATED) { - glRotatef(90, 0, 1, 0); - glTranslatef(-0.5f, -0.5f, -0.5f); - EntityTileRenderer::instance->render(tile, data, brightness, fAlpha, setColor, useCompiled); - glEnable(GL_RESCALE_NORMAL); + glRotatef(90, 0, 1, 0); + glTranslatef(-0.5f, -0.5f, -0.5f); + EntityTileRenderer::instance->render(tile, data, brightness, fAlpha, setColor, useCompiled); + glEnable(GL_RESCALE_NORMAL); } else if ( shape == Tile::SHAPE_ROWS ) { @@ -7406,58 +8210,58 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl } else if (shape == Tile::SHAPE_EGG) { - int y0 = 0; - glTranslatef(-0.5f, -0.5f, -0.5f); - t->begin(); - for (int i = 0; i < 8; i++) - { - int ww = 0; - int hh = 1; - if (i == 0) ww = 2; - if (i == 1) ww = 3; - if (i == 2) ww = 4; - if (i == 3) + int y0 = 0; + glTranslatef(-0.5f, -0.5f, -0.5f); + t->begin(); + for (int i = 0; i < 8; i++) + { + int ww = 0; + int hh = 1; + if (i == 0) ww = 2; + if (i == 1) ww = 3; + if (i == 2) ww = 4; + if (i == 3) { - ww = 5; - hh = 2; - } - if (i == 4) + ww = 5; + hh = 2; + } + if (i == 4) { - ww = 6; - hh = 3; - } - if (i == 5) + ww = 6; + hh = 3; + } + if (i == 5) { - ww = 7; - hh = 5; - } - if (i == 6) + ww = 7; + hh = 5; + } + if (i == 6) { - ww = 6; - hh = 2; - } - if (i == 7) ww = 3; - float w = ww / 16.0f; - float yy1 = 1 - (y0 / 16.0f); - float yy0 = 1 - ((y0 + hh) / 16.0f); - y0 += hh; - setShape(0.5f - w, yy0, 0.5f - w, 0.5f + w, yy1, 0.5f + w); - t->normal(0, -1, 0); - renderFaceDown(tile, 0, 0, 0, getTexture(tile,0)); - t->normal(0, 1, 0); - renderFaceUp(tile, 0, 0, 0, getTexture(tile,1)); - t->normal(0, 0, -1); - renderNorth(tile, 0, 0, 0, getTexture(tile,2)); - t->normal(0, 0, 1); - renderSouth(tile, 0, 0, 0, getTexture(tile,3)); - t->normal(-1, 0, 0); - renderWest(tile, 0, 0, 0, getTexture(tile,4)); - t->normal(1, 0, 0); - renderEast(tile, 0, 0, 0, getTexture(tile,5)); - } - t->end(); - glTranslatef(0.5f, 0.5f, 0.5f); - setShape(0, 0, 0, 1, 1, 1); + ww = 6; + hh = 2; + } + if (i == 7) ww = 3; + float w = ww / 16.0f; + float yy1 = 1 - (y0 / 16.0f); + float yy0 = 1 - ((y0 + hh) / 16.0f); + y0 += hh; + setShape(0.5f - w, yy0, 0.5f - w, 0.5f + w, yy1, 0.5f + w); + t->normal(0, -1, 0); + renderFaceDown(tile, 0, 0, 0, getTexture(tile,0)); + t->normal(0, 1, 0); + renderFaceUp(tile, 0, 0, 0, getTexture(tile,1)); + t->normal(0, 0, -1); + renderNorth(tile, 0, 0, 0, getTexture(tile,2)); + t->normal(0, 0, 1); + renderSouth(tile, 0, 0, 0, getTexture(tile,3)); + t->normal(-1, 0, 0); + renderWest(tile, 0, 0, 0, getTexture(tile,4)); + t->normal(1, 0, 0); + renderEast(tile, 0, 0, 0, getTexture(tile,5)); + } + t->end(); + glTranslatef(0.5f, 0.5f, 0.5f); + setShape(0, 0, 0, 1, 1, 1); } else if ( shape == Tile::SHAPE_FENCE ) @@ -7505,50 +8309,50 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl glTranslatef( 0.5f, 0.5f, 0.5f ); } setShape( 0, 0, 0, 1, 1, 1 ); - } + } else if (shape == Tile::SHAPE_FENCE_GATE) { - for (int i = 0; i < 3; i++) + for (int i = 0; i < 3; i++) { - float w = 1 / 16.0f; - if (i == 0) setShape(0.5f - w, .3f, 0, 0.5f + w, 1, w * 2); - if (i == 1) setShape(0.5f - w, .3f, 1 - w * 2, 0.5f + w, 1, 1); - w = 1 / 16.0f; - if (i == 2) setShape(0.5f - w, .5f, 0, 0.5f + w, 1 - w, 1); + float w = 1 / 16.0f; + if (i == 0) setShape(0.5f - w, .3f, 0, 0.5f + w, 1, w * 2); + if (i == 1) setShape(0.5f - w, .3f, 1 - w * 2, 0.5f + w, 1, 1); + w = 1 / 16.0f; + if (i == 2) setShape(0.5f - w, .5f, 0, 0.5f + w, 1 - w, 1); - glTranslatef(-0.5f, -0.5f, -0.5f); - t->begin(); - t->normal(0, -1, 0); - renderFaceDown(tile, 0, 0, 0, getTexture(tile,0)); - t->end(); + glTranslatef(-0.5f, -0.5f, -0.5f); + t->begin(); + t->normal(0, -1, 0); + renderFaceDown(tile, 0, 0, 0, getTexture(tile,0)); + t->end(); - t->begin(); - t->normal(0, 1, 0); - renderFaceUp(tile, 0, 0, 0, getTexture(tile,1)); - t->end(); + t->begin(); + t->normal(0, 1, 0); + renderFaceUp(tile, 0, 0, 0, getTexture(tile,1)); + t->end(); - t->begin(); - t->normal(0, 0, -1); - renderNorth(tile, 0, 0, 0, getTexture(tile,2)); - t->end(); + t->begin(); + t->normal(0, 0, -1); + renderNorth(tile, 0, 0, 0, getTexture(tile,2)); + t->end(); - t->begin(); - t->normal(0, 0, 1); - renderSouth(tile, 0, 0, 0, getTexture(tile,3)); - t->end(); + t->begin(); + t->normal(0, 0, 1); + renderSouth(tile, 0, 0, 0, getTexture(tile,3)); + t->end(); - t->begin(); - t->normal(-1, 0, 0); - renderWest(tile, 0, 0, 0, getTexture(tile,4)); - t->end(); + t->begin(); + t->normal(-1, 0, 0); + renderWest(tile, 0, 0, 0, getTexture(tile,4)); + t->end(); - t->begin(); - t->normal(1, 0, 0); - renderEast(tile, 0, 0, 0, getTexture(tile,5)); - t->end(); + t->begin(); + t->normal(1, 0, 0); + renderEast(tile, 0, 0, 0, getTexture(tile,5)); + t->end(); - glTranslatef(0.5f, 0.5f, 0.5f); - } + glTranslatef(0.5f, 0.5f, 0.5f); + } } else if (shape == Tile::SHAPE_WALL) { @@ -7595,7 +8399,7 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl else if (shape == Tile::SHAPE_ANVIL) { glTranslatef(-0.5f, -0.5f, -0.5f); - tesselateAnvilInWorld((AnvilTile *) tile, 0, 0, 0, data, true); + tesselateAnvilInWorld((AnvilTile *) tile, 0, 0, 0, data << 2, true); glTranslatef(0.5f, 0.5f, 0.5f); } else if ( shape == Tile::SHAPE_PORTAL_FRAME ) @@ -7639,6 +8443,69 @@ void TileRenderer::renderTile( Tile* tile, int data, float brightness, float fAl tile->updateDefaultShape(); } + else if (shape == Tile::SHAPE_BEACON) + { + for (int i = 0; i < 3; i++) + { + if (i == 0) + { + setShape(2.0f / 16.0f, 0, 2.0f / 16.0f, 14.0f / 16.0f, 3.0f / 16.0f, 14.0f / 16.0f); + setFixedTexture(getTexture(Tile::obsidian)); + } + else if (i == 1) + { + setShape(3.0f / 16.0f, 3.0f / 16.0f, 3.0f / 16.0f, 13.0f / 16.0f, 14.0f / 16.0f, 13.0f / 16.0f); + setFixedTexture(getTexture(Tile::beacon)); + } + else if (i == 2) + { + setShape(0, 0, 0, 1, 1, 1); + setFixedTexture(getTexture(Tile::glass)); + } + + glTranslatef(-0.5f, -0.5f, -0.5f); + t->begin(); + t->normal(0, -1, 0); + renderFaceDown(tile, 0, 0, 0, getTexture(tile, 0, data)); + t->end(); + + t->begin(); + t->normal(0, 1, 0); + renderFaceUp(tile, 0, 0, 0, getTexture(tile, 1, data)); + t->end(); + + t->begin(); + t->normal(0, 0, -1); + renderNorth(tile, 0, 0, 0, getTexture(tile, 2, data)); + t->end(); + + t->begin(); + t->normal(0, 0, 1); + renderSouth(tile, 0, 0, 0, getTexture(tile, 3, data)); + t->end(); + + t->begin(); + t->normal(-1, 0, 0); + renderWest(tile, 0, 0, 0, getTexture(tile, 4, data)); + t->end(); + + t->begin(); + t->normal(1, 0, 0); + renderEast(tile, 0, 0, 0, getTexture(tile, 5, data)); + t->end(); + + glTranslatef(0.5f, 0.5f, 0.5f); + } + setShape(0, 0, 0, 1, 1, 1); + clearFixedTexture(); + } + else if (shape == Tile::SHAPE_HOPPER) + { + glTranslatef(-0.5f, -0.5f, -0.5f); + tesselateHopperInWorld(tile, 0, 0, 0, 0, true); + glTranslatef(0.5f, 0.5f, 0.5f); + } + t->setMipmapEnable( true ); // 4J added } @@ -7651,11 +8518,12 @@ bool TileRenderer::canRender( int renderShape ) if ( renderShape == Tile::SHAPE_STAIRS ) return true; if ( renderShape == Tile::SHAPE_FENCE ) return true; if ( renderShape == Tile::SHAPE_EGG) return true; - if ( renderShape == Tile::SHAPE_ENTITYTILE_ANIMATED) return true; - if ( renderShape == Tile::SHAPE_FENCE_GATE) return true; + if ( renderShape == Tile::SHAPE_ENTITYTILE_ANIMATED) return true; + if ( renderShape == Tile::SHAPE_FENCE_GATE) return true; if ( renderShape == Tile::SHAPE_PISTON_BASE ) return true; if ( renderShape == Tile::SHAPE_PORTAL_FRAME ) return true; if ( renderShape == Tile::SHAPE_WALL) return true; + if ( renderShape == Tile::SHAPE_BEACON) return true; if ( renderShape == Tile::SHAPE_ANVIL) return true; return false; } diff --git a/Minecraft.Client/TileRenderer.h b/Minecraft.Client/TileRenderer.h index 4045ece2..817bbf48 100644 --- a/Minecraft.Client/TileRenderer.h +++ b/Minecraft.Client/TileRenderer.h @@ -13,6 +13,8 @@ class BrewingStandTile; class CauldronTile; class EggTile; class TheEndPortalFrameTile; +class RepeaterTile; +class ComparatorTile; class DiodeTile; class FireTile; class StemTile; @@ -21,6 +23,8 @@ class CocoaTile; class AnvilTile; class FlowerPotTile; class WallTile; +class BeaconTile; +class HopperTile; class Icon; class Minecraft; @@ -101,6 +105,8 @@ private: public: bool tesselateTorchInWorld( Tile* tt, int x, int y, int z ); private: + bool tesselateRepeaterInWorld(RepeaterTile *tt, int x, int y, int z); + bool tesselateComparatorInWorld(ComparatorTile *tt, int x, int y, int z); bool tesselateDiodeInWorld(DiodeTile *tt, int x, int y, int z); void tesselateDiodeInWorld( DiodeTile* tt, int x, int y, int z, int dir ); static const int FLIP_NONE = 0, FLIP_CW = 1, FLIP_CCW = 2, FLIP_180 = 3; @@ -131,6 +137,7 @@ private: bool tesselateRailInWorld( RailTile* tt, int x, int y, int z ); bool tesselateLadderInWorld( Tile* tt, int x, int y, int z ); bool tesselateVineInWorld( Tile* tt, int x, int y, int z ); + bool tesselateThinPaneInWorld(Tile *tt, int x, int y, int z); bool tesselateThinFenceInWorld( ThinFenceTile* tt, int x, int y, int z ); bool tesselateCrossInWorld( Tile* tt, int x, int y, int z ); bool tesselateStemInWorld( Tile* _tt, int x, int y, int z ); @@ -157,40 +164,40 @@ private: private: bool applyAmbienceOcclusion; - float ll000, llx00, ll0y0, ll00z, llX00, ll0Y0, ll00Z; float llxyz, llxy0, llxyZ, ll0yz, ll0yZ, llXyz, llXy0; float llXyZ, llxYz, llxY0, llxYZ, ll0Yz, llXYz, llXY0; float ll0YZ, llXYZ, llx0z, llX0z, llx0Z, llX0Z; + // 4J - brought forward changes from 1.8.2 - int ccx00, cc00z, cc0Y0, cc00Z; int ccxyz, ccxy0, ccxyZ, cc0yz, cc0yZ, ccXyz, ccXy0; int ccXyZ, ccxYz, ccxY0, ccxYZ, cc0Yz, ccXYz, ccXY0; int cc0YZ, ccXYZ, ccx0z, ccX0z, ccx0Z, ccX0Z; - int blsmooth; + int tc1, tc2, tc3, tc4; // 4J - brought forward changes from 1.8.2 float c1r, c2r, c3r, c4r; float c1g, c2g, c3g, c4g; float c1b, c2b, c3b, c4b; - bool llTrans0Yz, llTransXY0, llTransxY0, llTrans0YZ; - bool llTransx0z, llTransX0Z, llTransx0Z, llTransX0z; - bool llTrans0yz, llTransXy0, llTransxy0, llTrans0yZ; public: // 4J - brought forward changes from 1.8.2 // AP - added faceFlags so we can cull earlier bool tesselateBlockInWorldWithAmbienceOcclusionTexLighting( Tile* tt, int pX, int pY, int pZ, float pBaseRed, - float pBaseGreen, float pBaseBlue, int faceFlags ); - private: + float pBaseGreen, float pBaseBlue, int faceFlags, bool smoothShapeLighting ); + +private: int blend( int a, int b, int c, int def ); int blend(int a, int b, int c, int d, double fa, double fb, double fc, double fd); - public: +public: bool tesselateBlockInWorld( Tile* tt, int x, int y, int z, float r, float g, float b ); + bool tesselateBeaconInWorld( Tile *tt, int x, int y, int z); bool tesselateCactusInWorld( Tile* tt, int x, int y, int z ); bool tesselateCactusInWorld( Tile* tt, int x, int y, int z, float r, float g, float b ); bool tesselateFenceInWorld( FenceTile* tt, int x, int y, int z ); bool tesselateWallInWorld(WallTile *tt, int x, int y, int z); bool tesselateEggInWorld(EggTile *tt, int x, int y, int z); bool tesselateFenceGateInWorld(FenceGateTile *tt, int x, int y, int z); + bool tesselateHopperInWorld(Tile *tt, int x, int y, int z); + bool tesselateHopperInWorld(Tile *tt, int x, int y, int z, int data, bool render); bool tesselateStairsInWorld( StairTile* tt, int x, int y, int z ); bool tesselateDoorInWorld( Tile* tt, int x, int y, int z ); void renderFaceUp( Tile* tt, double x, double y, double z, Icon *tex ); diff --git a/Minecraft.Client/TitleScreen.cpp b/Minecraft.Client/TitleScreen.cpp index 7d426095..1c7d5125 100644 --- a/Minecraft.Client/TitleScreen.cpp +++ b/Minecraft.Client/TitleScreen.cpp @@ -59,7 +59,7 @@ void TitleScreen::keyPressed(wchar_t eventCharacter, int eventKey) void TitleScreen::init() { - /* 4J - removed + /* 4J - Implemented in main menu instead Calendar c = Calendar.getInstance(); c.setTime(new Date()); diff --git a/Minecraft.Client/TntMinecartRenderer.cpp b/Minecraft.Client/TntMinecartRenderer.cpp new file mode 100644 index 00000000..b168e174 --- /dev/null +++ b/Minecraft.Client/TntMinecartRenderer.cpp @@ -0,0 +1,45 @@ +#include "stdafx.h" +#include "TntMinecartRenderer.h" +#include "..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" + +void TntMinecartRenderer::renderMinecartContents(shared_ptr _cart, float a, Tile *tile, int tileData) +{ + shared_ptr cart = dynamic_pointer_cast(_cart); + + int fuse = cart->getFuse(); + + if (fuse > -1) + { + if (fuse - a + 1 < 10) + { + float g = 1 - ((fuse - a + 1) / 10.0f); + if (g < 0) g = 0; + if (g > 1) g = 1; + g *= g; + g *= g; + float s = 1.0f + g * 0.3f; + glScalef(s, s, s); + } + } + + MinecartRenderer::renderMinecartContents(cart, a, tile, tileData); + + if (fuse > -1 && fuse / 5 % 2 == 0) + { + glDisable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA); + glColor4f(1, 1, 1, (1 - ((fuse - a + 1) / 100.0f)) * 0.8f); + + glPushMatrix(); + renderer->renderTile(Tile::tnt, 0, 1); + glPopMatrix(); + + glColor4f(1, 1, 1, 1); + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); + } +} \ No newline at end of file diff --git a/Minecraft.Client/TntMinecartRenderer.h b/Minecraft.Client/TntMinecartRenderer.h new file mode 100644 index 00000000..31e57e9b --- /dev/null +++ b/Minecraft.Client/TntMinecartRenderer.h @@ -0,0 +1,10 @@ +#pragma once +#include "MinecartRenderer.h" + +class Minecart; + +class TntMinecartRenderer : public MinecartRenderer +{ +protected: + void renderMinecartContents(shared_ptr cart, float a, Tile *tile, int tileData); +}; \ No newline at end of file diff --git a/Minecraft.Client/TntRenderer.cpp b/Minecraft.Client/TntRenderer.cpp index 3bb7484f..52e2877d 100644 --- a/Minecraft.Client/TntRenderer.cpp +++ b/Minecraft.Client/TntRenderer.cpp @@ -1,12 +1,13 @@ #include "stdafx.h" #include "TntRenderer.h" +#include "TextureAtlas.h" #include "TileRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.item.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" TntRenderer::TntRenderer() { - tileRenderer = new TileRenderer(); + renderer = new TileRenderer(); this->shadowRadius = 0.5f; } @@ -29,10 +30,10 @@ void TntRenderer::render(shared_ptr _tnt, double x, double y, double z, } float br = (1 - ((tnt->life - a + 1) / 100.0f)) * 0.8f; - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + bindTexture(tnt); // 4J - change brought forward from 1.8.2 float brightness = SharedConstants::TEXTURE_LIGHTING ? 1.0f : tnt->getBrightness(a); - tileRenderer->renderTile(Tile::tnt, 0, brightness); + renderer->renderTile(Tile::tnt, 0, brightness); if (tnt->life / 5 % 2 == 0) { glDisable(GL_TEXTURE_2D); @@ -40,13 +41,18 @@ void TntRenderer::render(shared_ptr _tnt, double x, double y, double z, glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA); glColor4f(1, 1, 1, br); - tileRenderer->setColor = false; // 4J added so that renderTile doesn't set its own colour here - tileRenderer->renderTile(Tile::tnt, 0, 1); - tileRenderer->setColor = true; // 4J added so that renderTile doesn't set its own colour here + renderer->setColor = false; // 4J added so that renderTile doesn't set its own colour here + renderer->renderTile(Tile::tnt, 0, 1); + renderer->setColor = true; // 4J added so that renderTile doesn't set its own colour here glColor4f(1, 1, 1, 1); glDisable(GL_BLEND); glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); } glPopMatrix(); +} + +ResourceLocation *TntRenderer::getTextureLocation(shared_ptr mob) +{ + return &TextureAtlas::LOCATION_BLOCKS; } \ No newline at end of file diff --git a/Minecraft.Client/TntRenderer.h b/Minecraft.Client/TntRenderer.h index 4d9c029c..7aa3fa9e 100644 --- a/Minecraft.Client/TntRenderer.h +++ b/Minecraft.Client/TntRenderer.h @@ -4,9 +4,10 @@ class TntRenderer : public EntityRenderer { private: - TileRenderer *tileRenderer; + TileRenderer *renderer; public: TntRenderer(); virtual void render(shared_ptr _tnt, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/TrackedEntity.cpp b/Minecraft.Client/TrackedEntity.cpp index 70f25c93..6e956b15 100644 --- a/Minecraft.Client/TrackedEntity.cpp +++ b/Minecraft.Client/TrackedEntity.cpp @@ -13,6 +13,7 @@ #include "..\Minecraft.World\net.minecraft.network.packet.h" #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\net.minecraft.world.level.saveddata.h" +#include "..\Minecraft.World\net.minecraft.world.entity.ai.attributes.h" #include "MinecraftServer.h" #include "ServerLevel.h" #include "PlayerList.h" @@ -23,24 +24,25 @@ TrackedEntity::TrackedEntity(shared_ptr e, int range, int updateInterval, bool trackDelta) { // 4J added initialisers - xap = yap = zap = 0; - tickCount = 0; + xap = yap = zap = 0; + tickCount = 0; xpu = ypu = zpu = 0; - updatedPlayerVisibility = false; - teleportDelay = 0; + updatedPlayerVisibility = false; + teleportDelay = 0; moved = false; - + wasRiding = false; + this->e = e; - this->range = range; - this->updateInterval = updateInterval; - this->trackDelta = trackDelta; + this->range = range; + this->updateInterval = updateInterval; + this->trackDelta = trackDelta; - xp = Mth::floor(e->x * 32); - yp = Mth::floor(e->y * 32); - zp = Mth::floor(e->z * 32); + xp = Mth::floor(e->x * 32); + yp = Mth::floor(e->y * 32); + zp = Mth::floor(e->z * 32); - yRotp = Mth::floor(e->yRot * 256 / 360); - xRotp = Mth::floor(e->xRot * 256 / 360); + yRotp = Mth::floor(e->yRot * 256 / 360); + xRotp = Mth::floor(e->xRot * 256 / 360); yHeadRotp = Mth::floor(e->getYHeadRot() * 256 / 360); } @@ -48,21 +50,21 @@ int c0a = 0, c0b = 0, c1a = 0, c1b = 0, c1c = 0, c2a = 0, c2b = 0; void TrackedEntity::tick(EntityTracker *tracker, vector > *players) { - moved = false; - if (!updatedPlayerVisibility || e->distanceToSqr(xpu, ypu, zpu) > 4 * 4) - { - xpu = e->x; - ypu = e->y; - zpu = e->z; - updatedPlayerVisibility = true; - moved = true; - updatePlayers(tracker, players); - } + moved = false; + if (!updatedPlayerVisibility || e->distanceToSqr(xpu, ypu, zpu) > 4 * 4) + { + xpu = e->x; + ypu = e->y; + zpu = e->z; + updatedPlayerVisibility = true; + moved = true; + updatePlayers(tracker, players); + } - if (wasRiding != e->riding) + if (lastRidingEntity != e->riding || (e->riding != NULL && tickCount % (SharedConstants::TICKS_PER_SECOND * 3) == 0)) { - wasRiding = e->riding; - broadcast(shared_ptr(new SetRidingPacket(e, e->riding))); + lastRidingEntity = e->riding; + broadcast(shared_ptr(new SetEntityLinkPacket(SetEntityLinkPacket::RIDING, e, e->riding))); } // Moving forward special case for item frames @@ -73,18 +75,18 @@ void TrackedEntity::tick(EntityTracker *tracker, vector > *pl if (item != NULL && item->getItem()->id == Item::map_Id && !e->removed) { - shared_ptr data = Item::map->getSavedData(item, e->level); - for (AUTO_VAR(it,players->begin() ); it != players->end(); ++it) + shared_ptr data = Item::map->getSavedData(item, e->level); + for (AUTO_VAR(it,players->begin() ); it != players->end(); ++it) { - shared_ptr player = dynamic_pointer_cast(*it); - data->tickCarriedBy(player, item); - - if (!player->removed && player->connection && player->connection->countDelayedPackets() <= 5) - { - shared_ptr packet = Item::map->getUpdatePacket(item, e->level, player); - if (packet != NULL) player->connection->send(packet); - } - } + shared_ptr player = dynamic_pointer_cast(*it); + data->tickCarriedBy(player, item); + + if (!player->removed && player->connection && player->connection->countDelayedPackets() <= 5) + { + shared_ptr packet = Item::map->getUpdatePacket(item, e->level, player); + if (packet != NULL) player->connection->send(packet); + } + } } shared_ptr entityData = e->getEntityData(); @@ -93,40 +95,54 @@ void TrackedEntity::tick(EntityTracker *tracker, vector > *pl broadcastAndSend( shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); } } - else + else if (tickCount % updateInterval == 0 || e->hasImpulse || e->getEntityData()->isDirty()) { + // 4J: Moved this as it's shared + int yRotn = Mth::floor(e->yRot * 256 / 360); + int xRotn = Mth::floor(e->xRot * 256 / 360); + + // 4J: Changed rotation to be generally sent as a delta as well as position + int yRota = yRotn - yRotp; + int xRota = xRotn - xRotp; + if(e->riding == NULL) { teleportDelay++; - if (tickCount++ % updateInterval == 0 || e->hasImpulse) - { - int xn = Mth::floor(this->e->x * 32.0); - int yn = Mth::floor(this->e->y * 32.0); - int zn = Mth::floor(this->e->z * 32.0); - int yRotn = Mth::floor(e->yRot * 256 / 360); - int xRotn = Mth::floor(e->xRot * 256 / 360); + int xn = Mth::floor(e->x * 32.0); + int yn = Mth::floor(e->y * 32.0); + int zn = Mth::floor(e->z * 32.0); + + int xa = xn - xp; + int ya = yn - yp; + int za = zn - zp; + + shared_ptr packet = nullptr; + + // 4J - this pos flag used to be set based on abs(xn) etc. but that just seems wrong + bool pos = abs(xa) >= TOLERANCE_LEVEL || abs(ya) >= TOLERANCE_LEVEL || abs(za) >= TOLERANCE_LEVEL || (tickCount % (SharedConstants::TICKS_PER_SECOND * 3) == 0); - int xa = xn - xp; - int ya = yn - yp; - int za = zn - zp; + // Keep rotation deltas in +/- 180 degree range + while( yRota > 127 ) yRota -= 256; + while( yRota < -128 ) yRota += 256; + while( xRota > 127 ) xRota -= 256; + while( xRota < -128 ) xRota += 256; - shared_ptr packet = nullptr; + bool rot = abs(yRota) >= TOLERANCE_LEVEL || abs(xRota) >= TOLERANCE_LEVEL; - // 4J - this pos flag used to be set based on abs(xn) etc. but that just seems wrong - bool pos = abs(xa) >= TOLERANCE_LEVEL || abs(ya) >= TOLERANCE_LEVEL || abs(za) >= TOLERANCE_LEVEL; - // 4J - changed rotation to be generally sent as a delta as well as position - int yRota = yRotn - yRotp; - int xRota = xRotn - xRotp; - // Keep rotation deltas in +/- 180 degree range - while( yRota > 127 ) yRota -= 256; - while( yRota < -128 ) yRota += 256; - while( xRota > 127 ) xRota -= 256; - while( xRota < -128 ) xRota += 256; + // 4J: Modified the following check. It was originally added by Mojang to address + // certain unspecified issues with entity position. Turns out the issue effects a + // variety of different entities so we've left it in and just added the new exceptions + // (so far just players) - bool rot = abs(yRota) >= TOLERANCE_LEVEL || abs(xRota) >= TOLERANCE_LEVEL; + // 4J: Original comment follows + // TODO: Figure out how to fix this properly + // skip first tick since position is sent in addEntity packet + // FallingTile depends on this because it removes its source block in the first tick() - if (xa < -128 || xa >= 128 || ya < -128 || ya >= 128 || za < -128 || za >= 128 + if (tickCount > 0 || e->instanceof(eTYPE_ARROW) || e->instanceof(eTYPE_PLAYER)) // 4J: Modifed, see above + { + if (xa < -128 || xa >= 128 || ya < -128 || ya >= 128 || za < -128 || za >= 128 || wasRiding // 4J Stu - I fixed the initialisation of teleportDelay in the ctor, but we managed this far without out // and would prefer not to have all the extra traffix so ignore it // 4J Stu - Fix for #9579 - GAMEPLAY: Boats with a player in them slowly sink under the water over time, and with no player in them they float into the sky. @@ -224,81 +240,111 @@ void TrackedEntity::tick(EntityTracker *tracker, vector > *pl } } } + } - if (trackDelta) - { - double xad = e->xd - xap; - double yad = e->yd - yap; - double zad = e->zd - zap; - - double max = 0.02; - - double diff = xad * xad + yad * yad + zad * zad; + if (trackDelta) + { + double xad = e->xd - xap; + double yad = e->yd - yap; + double zad = e->zd - zap; - if (diff > max * max || (diff > 0 && e->xd == 0 && e->yd == 0 && e->zd == 0)) - { - xap = e->xd; - yap = e->yd; - zap = e->zd; - broadcast( shared_ptr( new SetEntityMotionPacket(e->entityId, xap, yap, zap) ) ); - } + double max = 0.02; - } + double diff = xad * xad + yad * yad + zad * zad; - if (packet != NULL) + if (diff > max * max || (diff > 0 && e->xd == 0 && e->yd == 0 && e->zd == 0)) { - broadcast(packet); + xap = e->xd; + yap = e->yd; + zap = e->zd; + broadcast( shared_ptr( new SetEntityMotionPacket(e->entityId, xap, yap, zap) ) ); } - shared_ptr entityData = e->getEntityData(); + } - if (entityData->isDirty()) - { - broadcastAndSend( shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); - } + if (packet != NULL) + { + broadcast(packet); + } - int yHeadRot = Mth::floor(e->getYHeadRot() * 256 / 360); - if (abs(yHeadRot - yHeadRotp) >= TOLERANCE_LEVEL) - { - broadcast(shared_ptr(new RotateHeadPacket(e->entityId, (byte) yHeadRot))); - yHeadRotp = yHeadRot; - } + sendDirtyEntityData(); - if (pos) - { - xp = xn; - yp = yn; - zp = zn; - } - if (rot) - { - yRotp = yRotn; - xRotp = xRotn; - } + if (pos) + { + xp = xn; + yp = yn; + zp = zn; + } + if (rot) + { + yRotp = yRotn; + xRotp = xRotn; + } - // if( dynamic_pointer_cast(e) != NULL ) - // { - // printf("%d: %d + %d = %d (%f)\n",e->entityId,xRotp,xRota,xRotn,e->xRot); - // } + wasRiding = false; + } + else + { + bool rot = abs(yRotn - yRotp) >= TOLERANCE_LEVEL || abs(xRotn - xRotp) >= TOLERANCE_LEVEL; + if (rot) + { + // 4J: Changed this to use deltas + broadcast( shared_ptr( new MoveEntityPacket::Rot(e->entityId, (byte) yRota, (byte) xRota)) ); + yRotp = yRotn; + xRotp = xRotn; } + xp = Mth::floor(e->x * 32.0); + yp = Mth::floor(e->y * 32.0); + zp = Mth::floor(e->z * 32.0); + + sendDirtyEntityData(); + + wasRiding = true; } - else // 4J-JEV: Added: Mobs in minecarts weren't synching their invisibility. + + int yHeadRot = Mth::floor(e->getYHeadRot() * 256 / 360); + if (abs(yHeadRot - yHeadRotp) >= TOLERANCE_LEVEL) { - shared_ptr entityData = e->getEntityData(); - if (entityData->isDirty()) - broadcastAndSend( shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false) ) ); + broadcast(shared_ptr( new RotateHeadPacket(e->entityId, (byte) yHeadRot))); + yHeadRotp = yHeadRot; } + e->hasImpulse = false; } - if (e->hurtMarked) + tickCount++; + + if (e->hurtMarked) + { + // broadcast(new AnimatePacket(e, AnimatePacket.HURT)); + broadcastAndSend( shared_ptr( new SetEntityMotionPacket(e) ) ); + e->hurtMarked = false; + } + +} + +void TrackedEntity::sendDirtyEntityData() +{ + shared_ptr entityData = e->getEntityData(); + if (entityData->isDirty()) + { + broadcastAndSend( shared_ptr( new SetEntityDataPacket(e->entityId, entityData, false)) ); + } + + if ( e->instanceof(eTYPE_LIVINGENTITY) ) { - // broadcast(new AnimatePacket(e, AnimatePacket.HURT)); - broadcastAndSend( shared_ptr( new SetEntityMotionPacket(e) ) ); - e->hurtMarked = false; - } + shared_ptr living = dynamic_pointer_cast(e); + ServersideAttributeMap *attributeMap = (ServersideAttributeMap *) living->getAttributes(); + unordered_set *attributes = attributeMap->getDirtyAttributes(); + + if (!attributes->empty()) + { + broadcastAndSend(shared_ptr( new UpdateAttributesPacket(e->entityId, attributes)) ); + } + attributes->clear(); + } } void TrackedEntity::broadcast(shared_ptr packet) @@ -334,13 +380,13 @@ void TrackedEntity::broadcast(shared_ptr packet) if( otherPlayer != NULL && thisPlayer->IsSameSystem(otherPlayer) ) { dontSend = true; - // #ifdef _DEBUG - // shared_ptr emp= dynamic_pointer_cast (packet); - // if(emp!=NULL) - // { - // app.DebugPrintf("Not sending this SetEntityMotionPacket to player - it's already been sent to a player on their console\n"); - // } - // #endif + // #ifdef _DEBUG + // shared_ptr emp= dynamic_pointer_cast (packet); + // if(emp!=NULL) + // { + // app.DebugPrintf("Not sending this SetEntityMotionPacket to player - it's already been sent to a player on their console\n"); + // } + // #endif } } } @@ -369,12 +415,12 @@ void TrackedEntity::broadcast(shared_ptr packet) void TrackedEntity::broadcastAndSend(shared_ptr packet) { vector< shared_ptr > sentTo; - broadcast(packet); - shared_ptr sp = dynamic_pointer_cast(e); + broadcast(packet); + shared_ptr sp = e->instanceof(eTYPE_SERVERPLAYER) ? dynamic_pointer_cast(e) : nullptr; if (sp != NULL && sp->connection) { - sp->connection->send(packet); - } + sp->connection->send(packet); + } } void TrackedEntity::broadcastRemoved() @@ -390,6 +436,7 @@ void TrackedEntity::removePlayer(shared_ptr sp) AUTO_VAR(it, seenBy.find( sp )); if( it != seenBy.end() ) { + sp->entitiesToRemove.push_back(e->entityId); seenBy.erase( it ); } } @@ -400,8 +447,15 @@ TrackedEntity::eVisibility TrackedEntity::isVisible(EntityTracker *tracker, shar // 4J Stu - We call update players when the entity has moved more than a certain amount at the start of it's tick // Before this call we set xpu, ypu and zpu to the entities new position, but xp,yp and zp are the old position until later in the tick. // Therefore we should use the new position for visibility checks - double xd = sp->x - xpu; //xp / 32; - double zd = sp->z - zpu; //zp / 32; + double xd = sp->x - xpu; //xp / 32; + double zd = sp->z - zpu; //zp / 32; + + // 4J Stu - Fix for loading a player who is currently riding something (e.g. a horse) + if(e->forcedLoading) + { + xd = sp->x - xp / 32; + zd = sp->z - zp / 32; + } int playersRange = range; if( playersRange > TRACKED_ENTITY_MINIMUM_VIEW_DISTANCE ) @@ -463,67 +517,86 @@ TrackedEntity::eVisibility TrackedEntity::isVisible(EntityTracker *tracker, shar void TrackedEntity::updatePlayer(EntityTracker *tracker, shared_ptr sp) { - if (sp == e) return; + if (sp == e) return; eVisibility visibility = this->isVisible(tracker, sp); - - if ( visibility == eVisibility_SeenAndVisible - && seenBy.find(sp) == seenBy.end() ) + + if ( visibility == eVisibility_SeenAndVisible + && (seenBy.find(sp) == seenBy.end() || e->forcedLoading)) { - seenBy.insert(sp); + seenBy.insert(sp); shared_ptr packet = getAddEntityPacket(); - sp->connection->send(packet); + sp->connection->send(packet); xap = e->xd; yap = e->yd; zap = e->zd; - shared_ptr plr = dynamic_pointer_cast(e); - if (plr != NULL) + if ( e->instanceof(eTYPE_PLAYER) ) { + shared_ptr plr = dynamic_pointer_cast(e); app.DebugPrintf( "TrackedEntity:: Player '%ls' is now visible to player '%ls', %s.\n", plr->name.c_str(), sp->name.c_str(), (e->riding==NULL?"not riding minecart":"in minecart") ); } + bool isAddMobPacket = dynamic_pointer_cast(packet) != NULL; + // 4J Stu brought forward to fix when Item Frames - if (!e->getEntityData()->isEmpty() && !(dynamic_pointer_cast(packet))) + if (!e->getEntityData()->isEmpty() && !isAddMobPacket) { sp->connection->send(shared_ptr( new SetEntityDataPacket(e->entityId, e->getEntityData(), true))); } - if (this->trackDelta) + if ( e->instanceof(eTYPE_LIVINGENTITY) ) + { + shared_ptr living = dynamic_pointer_cast(e); + ServersideAttributeMap *attributeMap = (ServersideAttributeMap *) living->getAttributes(); + unordered_set *attributes = attributeMap->getSyncableAttributes(); + + if (!attributes->empty()) + { + sp->connection->send(shared_ptr( new UpdateAttributesPacket(e->entityId, attributes)) ); + } + delete attributes; + } + + if (trackDelta && !isAddMobPacket) { - sp->connection->send( shared_ptr( new SetEntityMotionPacket(e->entityId, e->xd, e->yd, e->zd) ) ); - } + sp->connection->send( shared_ptr( new SetEntityMotionPacket(e->entityId, e->xd, e->yd, e->zd) ) ); + } if (e->riding != NULL) { - sp->connection->send(shared_ptr(new SetRidingPacket(e, e->riding))); + sp->connection->send(shared_ptr(new SetEntityLinkPacket(SetEntityLinkPacket::RIDING, e, e->riding))); + } + if ( e->instanceof(eTYPE_MOB) && dynamic_pointer_cast(e)->getLeashHolder() != NULL) + { + sp->connection->send( shared_ptr( new SetEntityLinkPacket(SetEntityLinkPacket::LEASH, e, dynamic_pointer_cast(e)->getLeashHolder())) ); } - ItemInstanceArray equipped = e->getEquipmentSlots(); - if (equipped.data != NULL) + if ( e->instanceof(eTYPE_LIVINGENTITY) ) { - for (unsigned int i = 0; i < equipped.length; i++) + for (int i = 0; i < 5; i++) { - sp->connection->send( shared_ptr( new SetEquippedItemPacket(e->entityId, i, equipped[i]) ) ); - } - } + shared_ptr item = dynamic_pointer_cast(e)->getCarried(i); + if(item != NULL) sp->connection->send( shared_ptr( new SetEquippedItemPacket(e->entityId, i, item) ) ); + } + } - if (dynamic_pointer_cast(e) != NULL) + if ( e->instanceof(eTYPE_PLAYER) ) { - shared_ptr spe = dynamic_pointer_cast(e); - if (spe->isSleeping()) + shared_ptr spe = dynamic_pointer_cast(e); + if (spe->isSleeping()) { - sp->connection->send( shared_ptr( new EntityActionAtPositionPacket(e, EntityActionAtPositionPacket::START_SLEEP, Mth::floor(e->x), Mth::floor(e->y), Mth::floor(e->z)) ) ); - } - } + sp->connection->send( shared_ptr( new EntityActionAtPositionPacket(e, EntityActionAtPositionPacket::START_SLEEP, Mth::floor(e->x), Mth::floor(e->y), Mth::floor(e->z)) ) ); + } + } - if (dynamic_pointer_cast(e) != NULL) + if ( e->instanceof(eTYPE_LIVINGENTITY) ) { - shared_ptr mob = dynamic_pointer_cast(e); + shared_ptr mob = dynamic_pointer_cast(e); vector *activeEffects = mob->getActiveEffects(); for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) { @@ -533,16 +606,16 @@ void TrackedEntity::updatePlayer(EntityTracker *tracker, shared_ptrentitiesToRemove.push_back(e->entityId); - } - } + seenBy.erase(it); + sp->entitiesToRemove.push_back(e->entityId); + } + } } @@ -553,15 +626,15 @@ bool TrackedEntity::canBySeenBy(shared_ptr player) // TODO - investigate further return true; -// return player->getLevel()->getChunkMap()->isPlayerIn(player, e->xChunk, e->zChunk); + // return player->getLevel()->getChunkMap()->isPlayerIn(player, e->xChunk, e->zChunk); } void TrackedEntity::updatePlayers(EntityTracker *tracker, vector > *players) { - for (unsigned int i = 0; i < players->size(); i++) + for (unsigned int i = 0; i < players->size(); i++) { - updatePlayer(tracker, dynamic_pointer_cast( players->at(i) ) ); - } + updatePlayer(tracker, dynamic_pointer_cast( players->at(i) ) ); + } } shared_ptr TrackedEntity::getAddEntityPacket() @@ -578,329 +651,136 @@ shared_ptr TrackedEntity::getAddEntityPacket() return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp, yHeadRotp) ); } - switch(e->GetType()) + if (e->instanceof(eTYPE_ITEMENTITY)) { - case eTYPE_ITEMENTITY: - { - shared_ptr packet = shared_ptr( new AddEntityPacket(e, AddEntityPacket::ITEM, 1, yRotp, xRotp, xp, yp, zp) ); - return packet; - } - break; - case eTYPE_SERVERPLAYER: - { - shared_ptr player = dynamic_pointer_cast(e); - PlayerUID xuid = INVALID_XUID; - PlayerUID OnlineXuid = INVALID_XUID; - if( player != NULL ) - { - xuid = player->getXuid(); - OnlineXuid = player->getOnlineXuid(); - } - // 4J Added yHeadRotp param to fix #102563 - TU12: Content: Gameplay: When one of the Players is idle for a few minutes his head turns 180 degrees. - return shared_ptr( new AddPlayerPacket(dynamic_pointer_cast(e), xuid, OnlineXuid, xp, yp, zp, yRotp, xRotp, yHeadRotp ) ); - } - break; - case eTYPE_MINECART: - { - shared_ptr minecart = dynamic_pointer_cast(e); - if (minecart->type == Minecart::RIDEABLE) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_RIDEABLE, yRotp, xRotp, xp, yp, zp) ); - if (minecart->type == Minecart::CHEST) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_CHEST, yRotp, xRotp, xp, yp, zp) ); - if (minecart->type == Minecart::FURNACE) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_FURNACE, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_BOAT: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_ENDERDRAGON: - { - yHeadRotp = Mth::floor(e->getYHeadRot() * 256 / 360); - return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp, yHeadRotp ) ); - } - break; - case eTYPE_FISHINGHOOK: - { - shared_ptr owner = dynamic_pointer_cast(e)->owner; - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FISH_HOOK, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_ARROW: - { - shared_ptr owner = (dynamic_pointer_cast(e))->owner; - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ARROW, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_SNOWBALL: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::SNOWBALL, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_THROWNPOTION: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_POTION, ((dynamic_pointer_cast(e))->getPotionValue()), yRotp, xRotp, xp, yp, zp)); - } - break; - case eTYPE_THROWNEXPBOTTLE: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_EXPBOTTLE, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_THROWNENDERPEARL: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_ENDERPEARL, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_EYEOFENDERSIGNAL: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EYEOFENDERSIGNAL, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_SMALL_FIREBALL: - { - shared_ptr fb = dynamic_pointer_cast(e); - shared_ptr aep = nullptr; - if (fb->owner != NULL) - { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); - } - else - { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); - } - aep->xa = (int) (fb->xPower * 8000); - aep->ya = (int) (fb->yPower * 8000); - aep->za = (int) (fb->zPower * 8000); - return aep; - } - break; - case eTYPE_DRAGON_FIREBALL: - { - shared_ptr fb = dynamic_pointer_cast(e); - shared_ptr aep = nullptr; - if (fb->owner != NULL) - { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::DRAGON_FIRE_BALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); - } - else - { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::DRAGON_FIRE_BALL, 0, yRotp, xRotp, xp, yp, zp) ); - } - aep->xa = (int) (fb->xPower * 8000); - aep->ya = (int) (fb->yPower * 8000); - aep->za = (int) (fb->zPower * 8000); - return aep; - } - break; - case eTYPE_FIREBALL: - { - shared_ptr fb = dynamic_pointer_cast(e); - shared_ptr aep = nullptr; - if (fb->owner != NULL) - { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); - } - else - { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); - } - aep->xa = (int) (fb->xPower * 8000); - aep->ya = (int) (fb->yPower * 8000); - aep->za = (int) (fb->zPower * 8000); - return aep; - } - break; - case eTYPE_THROWNEGG: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EGG, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_PRIMEDTNT: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::PRIMED_TNT, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_ENDER_CRYSTAL: - { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ENDER_CRYSTAL, yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_FALLINGTILE: - { - shared_ptr ft = dynamic_pointer_cast(e); - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING, ft->tile | (ft->data << 16), yRotp, xRotp, xp, yp, zp) ); - } - break; - case eTYPE_PAINTING: - { - return shared_ptr( new AddPaintingPacket(dynamic_pointer_cast(e)) ); - } - break; - case eTYPE_ITEM_FRAME: - { - shared_ptr frame = dynamic_pointer_cast(e); - { - - int ix= (int)frame->xTile; - int iy= (int)frame->yTile; - int iz= (int)frame->zTile; - app.DebugPrintf("eTYPE_ITEM_FRAME xyz %d,%d,%d\n",ix,iy,iz); - } - - shared_ptr packet = shared_ptr(new AddEntityPacket(e, AddEntityPacket::ITEM_FRAME, frame->dir, yRotp, xRotp, xp, yp, zp)); - packet->x = Mth::floor(frame->xTile * 32.0f); - packet->y = Mth::floor(frame->yTile * 32.0f); - packet->z = Mth::floor(frame->zTile * 32.0f); - return packet; - } - break; - case eTYPE_EXPERIENCEORB: - { - return shared_ptr( new AddExperienceOrbPacket(dynamic_pointer_cast(e)) ); - } - break; - default: - assert(false); - break; + shared_ptr packet = shared_ptr( new AddEntityPacket(e, AddEntityPacket::ITEM, 1, yRotp, xRotp, xp, yp, zp) ); + return packet; } -/* - if (e->GetType() == eTYPE_ITEMENTITY) - { - shared_ptr itemEntity = dynamic_pointer_cast(e); - shared_ptr packet = shared_ptr( new AddItemEntityPacket(itemEntity, xp, yp, zp) ); - itemEntity->x = packet->x / 32.0; - itemEntity->y = packet->y / 32.0; - itemEntity->z = packet->z / 32.0; - return packet; - } - - if (e->GetType() == eTYPE_SERVERPLAYER ) + else if (e->instanceof(eTYPE_SERVERPLAYER)) { shared_ptr player = dynamic_pointer_cast(e); - XUID xuid = INVALID_XUID; - XUID OnlineXuid = INVALID_XUID; + + PlayerUID xuid = INVALID_XUID; + PlayerUID OnlineXuid = INVALID_XUID; if( player != NULL ) { xuid = player->getXuid(); OnlineXuid = player->getOnlineXuid(); } - return shared_ptr( new AddPlayerPacket(dynamic_pointer_cast(e), xuid, OnlineXuid, xp, yp, zp, yRotp, xRotp ) ); - } - if (e->GetType() == eTYPE_MINECART) - { - shared_ptr minecart = dynamic_pointer_cast(e); - if (minecart->type == Minecart::RIDEABLE) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_RIDEABLE, yRotp, xRotp, xp, yp, zp) ); - if (minecart->type == Minecart::CHEST) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_CHEST, yRotp, xRotp, xp, yp, zp) ); - if (minecart->type == Minecart::FURNACE) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART_FURNACE, yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_BOAT) + // 4J Added yHeadRotp param to fix #102563 - TU12: Content: Gameplay: When one of the Players is idle for a few minutes his head turns 180 degrees. + return shared_ptr( new AddPlayerPacket( player, xuid, OnlineXuid, xp, yp, zp, yRotp, xRotp, yHeadRotp ) ); + } + else if (e->instanceof(eTYPE_MINECART)) { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); - } - if (dynamic_pointer_cast(e) != NULL) + shared_ptr minecart = dynamic_pointer_cast(e); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::MINECART, minecart->getType(), yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_BOAT)) { - return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_ENDERDRAGON) + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::BOAT, yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_ENDERDRAGON)) { - return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp ) ); + yHeadRotp = Mth::floor(e->getYHeadRot() * 256 / 360); + return shared_ptr( new AddMobPacket(dynamic_pointer_cast(e), yRotp, xRotp, xp, yp, zp, yHeadRotp ) ); } - if (e->GetType() == eTYPE_FISHINGHOOK) + else if (e->instanceof(eTYPE_FISHINGHOOK)) { shared_ptr owner = dynamic_pointer_cast(e)->owner; return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FISH_HOOK, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_ARROW) + } + else if (e->instanceof(eTYPE_ARROW)) { - shared_ptr owner = (dynamic_pointer_cast(e))->owner; - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ARROW, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_SNOWBALL) + shared_ptr owner = (dynamic_pointer_cast(e))->owner; + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ARROW, owner != NULL ? owner->entityId : e->entityId, yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_SNOWBALL)) { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::SNOWBALL, yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_THROWNPOTION) + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::SNOWBALL, yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_THROWNPOTION)) { return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_POTION, ((dynamic_pointer_cast(e))->getPotionValue()), yRotp, xRotp, xp, yp, zp)); } - if (e->GetType() == eTYPE_THROWNEXPBOTTLE) + else if (e->instanceof(eTYPE_THROWNEXPBOTTLE)) { return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_EXPBOTTLE, yRotp, xRotp, xp, yp, zp) ); } - if (e->GetType() == eTYPE_THROWNENDERPEARL) + else if (e->instanceof(eTYPE_THROWNENDERPEARL)) { return shared_ptr( new AddEntityPacket(e, AddEntityPacket::THROWN_ENDERPEARL, yRotp, xRotp, xp, yp, zp) ); } - if (e->GetType() == eTYPE_EYEOFENDERSIGNAL) + else if (e->instanceof(eTYPE_EYEOFENDERSIGNAL)) { return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EYEOFENDERSIGNAL, yRotp, xRotp, xp, yp, zp) ); } - if (e->GetType() == eTYPE_SMALL_FIREBALL) + else if (e->instanceof(eTYPE_FIREWORKS_ROCKET)) + { + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREWORKS, yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_FIREBALL)) { - shared_ptr fb = dynamic_pointer_cast(e); - shared_ptr aep = NULL; + eINSTANCEOF classType = e->GetType(); + int type = AddEntityPacket::FIREBALL; + if (classType == eTYPE_SMALL_FIREBALL) + { + type = AddEntityPacket::SMALL_FIREBALL; + } + else if (classType == eTYPE_DRAGON_FIREBALL) + { + type = AddEntityPacket::DRAGON_FIRE_BALL; + } + else if (classType == eTYPE_WITHER_SKULL) + { + type = AddEntityPacket::WITHER_SKULL; + } + + shared_ptr fb = dynamic_pointer_cast(e); + shared_ptr aep = nullptr; if (fb->owner != NULL) { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, type, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); } else { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::SMALL_FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); + aep = shared_ptr( new AddEntityPacket(e, type, 0, yRotp, xRotp, xp, yp, zp) ); } aep->xa = (int) (fb->xPower * 8000); aep->ya = (int) (fb->yPower * 8000); aep->za = (int) (fb->zPower * 8000); return aep; } - if (e->GetType() == eTYPE_FIREBALL) - { - shared_ptr fb = dynamic_pointer_cast(e); - shared_ptr aep = NULL; - if (fb->owner != NULL) - { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, fb->owner->entityId, yRotp, xRotp, xp, yp, zp) ); - } - else - { - aep = shared_ptr( new AddEntityPacket(e, AddEntityPacket::FIREBALL, 0, yRotp, xRotp, xp, yp, zp) ); - } - aep->xa = (int) (fb->xPower * 8000); - aep->ya = (int) (fb->yPower * 8000); - aep->za = (int) (fb->zPower * 8000); - return aep; - } - if (e->GetType() == eTYPE_THROWNEGG) + else if (e->instanceof(eTYPE_THROWNEGG)) { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EGG, yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_PRIMEDTNT) + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::EGG, yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_PRIMEDTNT)) { - return shared_ptr( new AddEntityPacket(e, AddEntityPacket::PRIMED_TNT, yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_ENDER_CRYSTAL) + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::PRIMED_TNT, yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_ENDER_CRYSTAL)) { return shared_ptr( new AddEntityPacket(e, AddEntityPacket::ENDER_CRYSTAL, yRotp, xRotp, xp, yp, zp) ); } - if (e->GetType() == eTYPE_FALLINGTILE) + else if (e->instanceof(eTYPE_FALLINGTILE)) { - shared_ptr ft = dynamic_pointer_cast(e); - if (ft->tile == Tile::sand_Id) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_SAND, yRotp, xRotp, xp, yp, zp) ); - if (ft->tile == Tile::gravel_Id) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_GRAVEL, yRotp, xRotp, xp, yp, zp) ); - if (ft->tile == Tile::dragonEgg_Id) return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING_EGG, yRotp, xRotp, xp, yp, zp) ); - } - if (e->GetType() == eTYPE_PAINTING) + shared_ptr ft = dynamic_pointer_cast(e); + return shared_ptr( new AddEntityPacket(e, AddEntityPacket::FALLING, ft->tile | (ft->data << 16), yRotp, xRotp, xp, yp, zp) ); + } + else if (e->instanceof(eTYPE_PAINTING)) { - return shared_ptr( new AddPaintingPacket(dynamic_pointer_cast(e)) ); - } - if (e->GetType() == eTYPE_ITEM_FRAME) + return shared_ptr( new AddPaintingPacket(dynamic_pointer_cast(e)) ); + } + else if (e->instanceof(eTYPE_ITEM_FRAME)) { shared_ptr frame = dynamic_pointer_cast(e); + { int ix= (int)frame->xTile; int iy= (int)frame->yTile; int iz= (int)frame->zTile; - app.DebugPrintf("eTYPE_ITEM_FRAME xyz %d,%d,%d\n",ix,iy,iz); + app.DebugPrintf("eTYPE_ITEM_FRAME xyz %d,%d,%d\n",ix,iy,iz); } shared_ptr packet = shared_ptr(new AddEntityPacket(e, AddEntityPacket::ITEM_FRAME, frame->dir, yRotp, xRotp, xp, yp, zp)); @@ -909,21 +789,33 @@ shared_ptr TrackedEntity::getAddEntityPacket() packet->z = Mth::floor(frame->zTile * 32.0f); return packet; } - if (e->GetType() == eTYPE_EXPERIENCEORB) + else if (e->instanceof(eTYPE_LEASHFENCEKNOT)) + { + shared_ptr knot = dynamic_pointer_cast(e); + shared_ptr packet = shared_ptr(new AddEntityPacket(e, AddEntityPacket::LEASH_KNOT, yRotp, xRotp, xp, yp, zp) ); + packet->x = Mth::floor((float)knot->xTile * 32); + packet->y = Mth::floor((float)knot->yTile * 32); + packet->z = Mth::floor((float)knot->zTile * 32); + return packet; + } + else if (e->instanceof(eTYPE_EXPERIENCEORB)) { - return shared_ptr( new AddExperienceOrbPacket(dynamic_pointer_cast(e)) ); - } - assert(false); - */ + return shared_ptr( new AddExperienceOrbPacket(dynamic_pointer_cast(e)) ); + } + else + { + assert(false); + } + return nullptr; } void TrackedEntity::clear(shared_ptr sp) { AUTO_VAR(it, seenBy.find(sp)); - if (it != seenBy.end()) + if (it != seenBy.end()) { - seenBy.erase(it); - sp->entitiesToRemove.push_back(e->entityId); - } + seenBy.erase(it); + sp->entitiesToRemove.push_back(e->entityId); + } } diff --git a/Minecraft.Client/TrackedEntity.h b/Minecraft.Client/TrackedEntity.h index 9fb564a4..d319deca 100644 --- a/Minecraft.Client/TrackedEntity.h +++ b/Minecraft.Client/TrackedEntity.h @@ -27,7 +27,8 @@ private: bool updatedPlayerVisibility; bool trackDelta; int teleportDelay; - shared_ptr wasRiding; + shared_ptr lastRidingEntity; + bool wasRiding; public: bool moved; @@ -37,6 +38,11 @@ public: TrackedEntity(shared_ptr e, int range, int updateInterval, bool trackDelta); void tick(EntityTracker *tracker, vector > *players); + +private: + void sendDirtyEntityData(); + +public: void broadcast(shared_ptr packet); void broadcastAndSend(shared_ptr packet); void broadcastRemoved(); diff --git a/Minecraft.Client/User.cpp b/Minecraft.Client/User.cpp index a359bfd3..b8e2f2c0 100644 --- a/Minecraft.Client/User.cpp +++ b/Minecraft.Client/User.cpp @@ -6,40 +6,40 @@ vector User::allowedTiles; void User::staticCtor() { - allowedTiles.push_back(Tile::rock); - allowedTiles.push_back(Tile::stoneBrick); - allowedTiles.push_back(Tile::redBrick); - allowedTiles.push_back(Tile::dirt); - allowedTiles.push_back(Tile::wood); - allowedTiles.push_back(Tile::treeTrunk); - allowedTiles.push_back(Tile::leaves); - allowedTiles.push_back(Tile::torch); - allowedTiles.push_back(Tile::stoneSlabHalf); + allowedTiles.push_back(Tile::stone); + allowedTiles.push_back(Tile::cobblestone); + allowedTiles.push_back(Tile::redBrick); + allowedTiles.push_back(Tile::dirt); + allowedTiles.push_back(Tile::wood); + allowedTiles.push_back(Tile::treeTrunk); + allowedTiles.push_back(Tile::leaves); + allowedTiles.push_back(Tile::torch); + allowedTiles.push_back(Tile::stoneSlabHalf); - allowedTiles.push_back(Tile::glass); - allowedTiles.push_back(Tile::mossStone); - allowedTiles.push_back(Tile::sapling); - allowedTiles.push_back(Tile::flower); - allowedTiles.push_back(Tile::rose); - allowedTiles.push_back(Tile::mushroom1); - allowedTiles.push_back(Tile::mushroom2); - allowedTiles.push_back(Tile::sand); - allowedTiles.push_back(Tile::gravel); - allowedTiles.push_back(Tile::sponge); + allowedTiles.push_back(Tile::glass); + allowedTiles.push_back(Tile::mossyCobblestone); + allowedTiles.push_back(Tile::sapling); + allowedTiles.push_back(Tile::flower); + allowedTiles.push_back(Tile::rose); + allowedTiles.push_back(Tile::mushroom_brown); + allowedTiles.push_back(Tile::mushroom_red); + allowedTiles.push_back(Tile::sand); + allowedTiles.push_back(Tile::gravel); + allowedTiles.push_back(Tile::sponge); - allowedTiles.push_back(Tile::cloth); - allowedTiles.push_back(Tile::coalOre); - allowedTiles.push_back(Tile::ironOre); - allowedTiles.push_back(Tile::goldOre); - allowedTiles.push_back(Tile::ironBlock); - allowedTiles.push_back(Tile::goldBlock); - allowedTiles.push_back(Tile::bookshelf); - allowedTiles.push_back(Tile::tnt); - allowedTiles.push_back(Tile::obsidian); + allowedTiles.push_back(Tile::wool); + allowedTiles.push_back(Tile::coalOre); + allowedTiles.push_back(Tile::ironOre); + allowedTiles.push_back(Tile::goldOre); + allowedTiles.push_back(Tile::ironBlock); + allowedTiles.push_back(Tile::goldBlock); + allowedTiles.push_back(Tile::bookshelf); + allowedTiles.push_back(Tile::tnt); + allowedTiles.push_back(Tile::obsidian); } User::User(const wstring& name, const wstring& sessionId) { - this->name = name; - this->sessionId = sessionId; + this->name = name; + this->sessionId = sessionId; } diff --git a/Minecraft.Client/ViewportCuller.cpp b/Minecraft.Client/ViewportCuller.cpp index bc22faa6..41a8eb36 100644 --- a/Minecraft.Client/ViewportCuller.cpp +++ b/Minecraft.Client/ViewportCuller.cpp @@ -49,7 +49,7 @@ bool ViewportCuller::Face::fullyInFront(double x0, double y0, double z0, double return true; } -ViewportCuller::ViewportCuller(shared_ptr mob, double fogDistance, float a) +ViewportCuller::ViewportCuller(shared_ptr mob, double fogDistance, float a) { float yRot = mob->yRotO+(mob->yRot-mob->yRotO)*a; float xRot = mob->xRotO+(mob->xRot-mob->xRotO)*a; diff --git a/Minecraft.Client/ViewportCuller.h b/Minecraft.Client/ViewportCuller.h index 2a975de9..4e9121a6 100644 --- a/Minecraft.Client/ViewportCuller.h +++ b/Minecraft.Client/ViewportCuller.h @@ -24,7 +24,7 @@ private: Face faces[6]; double xOff, yOff, zOff; public: - ViewportCuller(shared_ptr mob, double fogDistance, float a); + ViewportCuller(shared_ptr mob, double fogDistance, float a); virtual bool isVisible(AABB bb); virtual bool cubeInFrustum(double x0, double y0, double z0, double x1, double y1, double z1); virtual bool cubeFullyInFrustum(double x0, double y0, double z0, double x1, double y1, double z1); diff --git a/Minecraft.Client/VillagerGolemModel.cpp b/Minecraft.Client/VillagerGolemModel.cpp index aaeabd53..e8b1bf27 100644 --- a/Minecraft.Client/VillagerGolemModel.cpp +++ b/Minecraft.Client/VillagerGolemModel.cpp @@ -38,7 +38,7 @@ VillagerGolemModel::VillagerGolemModel(float g, float yOffset) void VillagerGolemModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); head->render(scale, usecompiled); body->render(scale, usecompiled); @@ -48,7 +48,7 @@ void VillagerGolemModel::render(shared_ptr entity, float time, float r, arm1->render(scale, usecompiled); } -void VillagerGolemModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void VillagerGolemModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { head->yRot = yRot / (float) (180 / PI); head->xRot = xRot / (float) (180 / PI); @@ -59,7 +59,7 @@ void VillagerGolemModel::setupAnim(float time, float r, float bob, float yRot, f leg1->yRot = 0; } -void VillagerGolemModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +void VillagerGolemModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { shared_ptr vg = dynamic_pointer_cast(mob); int attackTick = vg->getAttackAnimationTick(); diff --git a/Minecraft.Client/VillagerGolemModel.h b/Minecraft.Client/VillagerGolemModel.h index 83e73616..b0758e60 100644 --- a/Minecraft.Client/VillagerGolemModel.h +++ b/Minecraft.Client/VillagerGolemModel.h @@ -22,8 +22,8 @@ public: VillagerGolemModel(float g = 0.0f, float yOffset = -7.0f); void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); - void prepareMobModel(shared_ptr mob, float time, float r, float a); + void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); + void prepareMobModel(shared_ptr mob, float time, float r, float a); private: float triangleWave(float bob, float period); diff --git a/Minecraft.Client/VillagerGolemRenderer.cpp b/Minecraft.Client/VillagerGolemRenderer.cpp index f03cea4c..5d680978 100644 --- a/Minecraft.Client/VillagerGolemRenderer.cpp +++ b/Minecraft.Client/VillagerGolemRenderer.cpp @@ -3,24 +3,22 @@ #include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "VillagerGolemModel.h" #include "ModelPart.h" +#include "TextureAtlas.h" #include "VillagerGolemRenderer.h" +ResourceLocation VillagerGolemRenderer::GOLEM_LOCATION = ResourceLocation(TN_MOB_VILLAGER_GOLEM); + VillagerGolemRenderer::VillagerGolemRenderer() : MobRenderer(new VillagerGolemModel(), 0.5f) { golemModel = (VillagerGolemModel *) model; } -int VillagerGolemRenderer::prepareArmor(VillagerGolemModel *villagerGolem, int layer, float a) -{ - return -1; -} - void VillagerGolemRenderer::render(shared_ptr mob, double x, double y, double z, float rot, float a) { MobRenderer::render(mob, x, y, z, rot, a); } -void VillagerGolemRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) +void VillagerGolemRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - // do some casting around instead @@ -34,7 +32,12 @@ void VillagerGolemRenderer::setupRotations(shared_ptr _mob, float bob, floa glRotatef(6.5f * triangleWave, 0, 0, 1); } -void VillagerGolemRenderer::additionalRendering(shared_ptr _mob, float a) +ResourceLocation *VillagerGolemRenderer::getTextureLocation(shared_ptr mob) +{ + return &GOLEM_LOCATION; +} + +void VillagerGolemRenderer::additionalRendering(shared_ptr _mob, float a) { // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - // do some casting around instead @@ -62,7 +65,7 @@ void VillagerGolemRenderer::additionalRendering(shared_ptr _mob, float a) } glColor4f(1, 1, 1, 1); - bindTexture(TN_TERRAIN); //"/terrain.png"); + bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: By Icon tileRenderer->renderTile(Tile::rose, 0, 1); glPopMatrix(); glDisable(GL_RESCALE_NORMAL); diff --git a/Minecraft.Client/VillagerGolemRenderer.h b/Minecraft.Client/VillagerGolemRenderer.h index 4bc3fd9c..e20fb81c 100644 --- a/Minecraft.Client/VillagerGolemRenderer.h +++ b/Minecraft.Client/VillagerGolemRenderer.h @@ -8,17 +8,14 @@ class VillagerGolemRenderer : public MobRenderer { private: VillagerGolemModel *golemModel; + static ResourceLocation GOLEM_LOCATION; public: VillagerGolemRenderer(); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: - int prepareArmor(VillagerGolemModel *villagerGolem, int layer, float a); - -public: - void render(shared_ptr mob, double x, double y, double z, float rot, float a); - -protected: - void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); - void additionalRendering(shared_ptr mob, float a); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + virtual void additionalRendering(shared_ptr mob, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/VillagerModel.cpp b/Minecraft.Client/VillagerModel.cpp index 8885484d..669637af 100644 --- a/Minecraft.Client/VillagerModel.cpp +++ b/Minecraft.Client/VillagerModel.cpp @@ -4,16 +4,16 @@ #include "ModelPart.h" -void VillagerModel::_init(float g, float yOffset) +void VillagerModel::_init(float g, float yOffset, int xTexSize, int yTexSize) { - int xTexSize = 64; - int yTexSize = 64; - head = (new ModelPart(this))->setTexSize(xTexSize, yTexSize); head->setPos(0, 0 + yOffset, 0); head->texOffs(0, 0)->addBox(-4, -10, -4, 8, 10, 8, g); - // head.texOffs(32, 0).addBox(-4, -10, -4, 8, 12, 8, g + 0.5f); - head->texOffs(24, 0)->addBox(-1, -3, -6, 2, 4, 2, g); + + nose = (new ModelPart(this))->setTexSize(xTexSize, yTexSize); + nose->setPos(0, yOffset - 2, 0); + nose->texOffs(24, 0)->addBox(-1, -1, -6, 2, 4, 2, g); + head->addChild(nose); body = (new ModelPart(this))->setTexSize(xTexSize, yTexSize); body->setPos(0, 0 + yOffset, 0); @@ -47,17 +47,17 @@ void VillagerModel::_init(float g, float yOffset) VillagerModel::VillagerModel(float g) : Model() { - _init(g, 0); + _init(g, 0, 64, 64); } -VillagerModel::VillagerModel(float g, float yOffset) : Model() +VillagerModel::VillagerModel(float g, float yOffset, int xTexSize, int yTexSize) : Model() { - _init(g,yOffset); + _init(g, yOffset, xTexSize, yTexSize); } void VillagerModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); head->render(scale,usecompiled); body->render(scale,usecompiled); @@ -66,18 +66,18 @@ void VillagerModel::render(shared_ptr entity, float time, float r, float arms->render(scale,usecompiled); } -void VillagerModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void VillagerModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { head->yRot = yRot / (float) (180 / PI); head->xRot = xRot / (float) (180 / PI); - - arms->y = 3; - arms->z = -1; - arms->xRot = -0.75f; - - leg0->xRot = ((float) Mth::cos(time * 0.6662f) * 1.4f) * r * 0.5f; - leg1->xRot = ((float) Mth::cos(time * 0.6662f + PI) * 1.4f) * r * 0.5f; - leg0->yRot = 0; - leg1->yRot = 0; + + arms->y = 3; + arms->z = -1; + arms->xRot = -0.75f; + + leg0->xRot = ((float) Mth::cos(time * 0.6662f) * 1.4f) * r * 0.5f; + leg1->xRot = ((float) Mth::cos(time * 0.6662f + PI) * 1.4f) * r * 0.5f; + leg0->yRot = 0; + leg1->yRot = 0; } diff --git a/Minecraft.Client/VillagerModel.h b/Minecraft.Client/VillagerModel.h index 24c8b858..eaccddae 100644 --- a/Minecraft.Client/VillagerModel.h +++ b/Minecraft.Client/VillagerModel.h @@ -5,11 +5,11 @@ class VillagerModel : public Model { public: - ModelPart *head, *body, *arms, *leg0, *leg1; + ModelPart *head, *body, *arms, *leg0, *leg1, *nose; - void _init(float g, float yOffset); // 4J added - VillagerModel(float g, float yOffset); + void _init(float g, float yOffset, int xTexSize, int yTexSize); // 4J added + VillagerModel(float g, float yOffset, int xTexSize, int yTexSize); VillagerModel(float g); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) ; - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; diff --git a/Minecraft.Client/VillagerRenderer.cpp b/Minecraft.Client/VillagerRenderer.cpp index b4c88173..ac885747 100644 --- a/Minecraft.Client/VillagerRenderer.cpp +++ b/Minecraft.Client/VillagerRenderer.cpp @@ -3,12 +3,19 @@ #include "VillagerModel.h" #include "VillagerRenderer.h" +ResourceLocation VillagerRenderer::VILLAGER_LOCATION = ResourceLocation(TN_MOB_VILLAGER_VILLAGER); +ResourceLocation VillagerRenderer::VILLAGER_FARMER_LOCATION = ResourceLocation(TN_MOB_VILLAGER_FARMER); +ResourceLocation VillagerRenderer::VILLAGER_LIBRARIAN_LOCATION = ResourceLocation(TN_MOB_VILLAGER_LIBRARIAN); +ResourceLocation VillagerRenderer::VILLAGER_PRIEST_LOCATION = ResourceLocation(TN_MOB_VILLAGER_PRIEST); +ResourceLocation VillagerRenderer::VILLAGER_SMITH_LOCATION = ResourceLocation(TN_MOB_VILLAGER_SMITH); +ResourceLocation VillagerRenderer::VILLAGER_BUTCHER_LOCATION = ResourceLocation(TN_MOB_VILLAGER_BUTCHER); + VillagerRenderer::VillagerRenderer() : MobRenderer(new VillagerModel(0), 0.5f) { villagerModel = (VillagerModel *) model; } -int VillagerRenderer::prepareArmor(shared_ptr villager, int layer, float a) +int VillagerRenderer::prepareArmor(shared_ptr villager, int layer, float a) { return -1; } @@ -18,16 +25,33 @@ void VillagerRenderer::render(shared_ptr mob, double x, double y, double MobRenderer::render(mob, x, y, z, rot, a); } -void VillagerRenderer::renderName(shared_ptr mob, double x, double y, double z) +ResourceLocation *VillagerRenderer::getTextureLocation(shared_ptr _mob) { + shared_ptr mob = dynamic_pointer_cast(_mob); + + switch (mob->getProfession()) + { + case Villager::PROFESSION_FARMER: + return &VILLAGER_FARMER_LOCATION; + case Villager::PROFESSION_LIBRARIAN: + return &VILLAGER_LIBRARIAN_LOCATION; + case Villager::PROFESSION_PRIEST: + return &VILLAGER_PRIEST_LOCATION; + case Villager::PROFESSION_SMITH: + return &VILLAGER_SMITH_LOCATION; + case Villager::PROFESSION_BUTCHER: + return &VILLAGER_BUTCHER_LOCATION; + default: + return &VILLAGER_LOCATION; + } } -void VillagerRenderer::additionalRendering(shared_ptr mob, float a) +void VillagerRenderer::additionalRendering(shared_ptr mob, float a) { MobRenderer::additionalRendering(mob, a); } -void VillagerRenderer::scale(shared_ptr _mob, float a) +void VillagerRenderer::scale(shared_ptr _mob, float a) { // 4J - original version used generics and thus had an input parameter of type Blaze rather than shared_ptr we have here - // do some casting around instead diff --git a/Minecraft.Client/VillagerRenderer.h b/Minecraft.Client/VillagerRenderer.h index 21c2a631..0114bb03 100644 --- a/Minecraft.Client/VillagerRenderer.h +++ b/Minecraft.Client/VillagerRenderer.h @@ -1,25 +1,28 @@ #pragma once - #include "MobRenderer.h" class VillagerModel; class VillagerRenderer : public MobRenderer { +private: + static ResourceLocation VILLAGER_LOCATION; + static ResourceLocation VILLAGER_FARMER_LOCATION; + static ResourceLocation VILLAGER_LIBRARIAN_LOCATION; + static ResourceLocation VILLAGER_PRIEST_LOCATION; + static ResourceLocation VILLAGER_SMITH_LOCATION; + static ResourceLocation VILLAGER_BUTCHER_LOCATION; + protected: VillagerModel *villagerModel; public: VillagerRenderer(); - -protected: - virtual int prepareArmor(shared_ptr villager, int layer, float a); - -public: virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr _mob); -protected: - virtual void renderName(shared_ptr mob, double x, double y, double z); - virtual void additionalRendering(shared_ptr mob, float a); - virtual void scale(shared_ptr player, float a); +protected: + virtual int prepareArmor(shared_ptr villager, int layer, float a); + virtual void additionalRendering(shared_ptr mob, float a); + virtual void scale(shared_ptr player, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/VillagerZombieModel.cpp b/Minecraft.Client/VillagerZombieModel.cpp index d8338c89..25b8f66e 100644 --- a/Minecraft.Client/VillagerZombieModel.cpp +++ b/Minecraft.Client/VillagerZombieModel.cpp @@ -40,9 +40,9 @@ int VillagerZombieModel::version() return 10; } -void VillagerZombieModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void VillagerZombieModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, uiBitmaskOverrideAnim); + HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, entity, uiBitmaskOverrideAnim); float attack2 = Mth::sin(attackTime * PI); float attack = Mth::sin((1 - (1 - attackTime) * (1 - attackTime)) * PI); diff --git a/Minecraft.Client/VillagerZombieModel.h b/Minecraft.Client/VillagerZombieModel.h index b4400b35..1945de35 100644 --- a/Minecraft.Client/VillagerZombieModel.h +++ b/Minecraft.Client/VillagerZombieModel.h @@ -12,5 +12,5 @@ public: VillagerZombieModel(float g, float yOffset, bool isArmor); int version(); - void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h b/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h index 77d39a39..5a5a709f 100644 --- a/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h +++ b/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h @@ -8,8 +8,8 @@ EnemyWeaponID What weapon the enemy is holding or what counter/AI the enemy is t EnrollmentType How did players enroll? (Using Kinect) LandscapeOrPortrait Are you currently showing in landscape or portrait mode? (Win8 only) LevelDurationInSeconds How long, total, has the user been playing in this level - whatever best represents this duration for attempting the level you'd like to track. -LevelExitProgressStat1 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. -LevelExitProgressStat2 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. +LevelExitProgressStat1 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. +LevelExitProgressStat2 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. LevelID 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. LevelInstanceID Generated by the game every time LevelStart or LevelResume is called. This should be a unique ID (can be sequential) within a session. LowResMapX Player position normalized to 0-255 @@ -18,7 +18,7 @@ LowResMapZ Player position normalized to 0-255 MapID Unique ID for the current map the player is on MarketplaceOfferID Unique ID for the Xbox LIVE marketplace offer that the upsell links to MicroGoodTypeID Describes the type of consumable or microgood -MultiplayerInstanceID multiplayerinstanceID is a title-generated value that is the same for all players in the same multiplayer session. +MultiplayerInstanceID multiplayerinstanceID is a title-generated value that is the same for all players in the same multiplayer session.� NumberOfLocalPlayers the number of players that are playing together in the game locally in the current session (on the same piece of hardware) NumberOfOnlinePlayers the number of players that are playing together in the game online in the current session (not on the same piece of hardware) NumberOfSkeletonsInView the max and min of skeletons that were in view, regardless of enrollment @@ -28,7 +28,7 @@ PlayerLevelUpProgressStat1 Refers to a performance metric for your player when t PlayerLevelUpProgressStat2 Refers to a performance metric for your player when they level or rank up. This is entirely up to you and will help us understand how well the player performed, or how far the player has progressed. PlayerWeaponID What weapon the player is holding or what approach/tact the player is taking to overcome a challenge PlayspaceFeedbackWarningDirection identifies which side of the playspace players are getting too close to that results in the playspace feedback -SaveOrCheckpointID It is important that you also generate and save a unique SaveOrCheckpointID that can be read and reported when the player resumes from this save file or checkpoint. These IDs should be completely unique across the players experience, even if they play the same level multiple times. These IDs are critical to allowing us to re-stitch a players experience in your title and provide an accurate measure of time in level. +SaveOrCheckpointID It is important that you also generate and save a unique SaveOrCheckpointID that can be read and reported when the player resumes from this save file or checkpoint. These IDs should be completely unique across the player�s experience, even if they play the same level multiple times. These IDs are critical to allowing us to re-stitch a player�s experience in your title and provide an accurate measure of time in level. SecondsSinceInitialize Number of seconds elapsed since Sentient initialize. SecondsSinceInitializeMax Number of seconds elapsed since Sentient initialize. SecondsSinceInitializeMin Number of seconds elapsed since Sentient initialize. @@ -224,6 +224,12 @@ enum ETelemetryChallenges eTelemetryTutorial_Trading, eTelemetryTutorial_TradingMenu, eTelemetryTutorial_Enderchest, + eTelemetryTutorial_Hopper, + eTelemetryTutorial_Beacon, + eTelemetryTutorial_Horse, + eTelemetryTutorial_HorseMenu, + eTelemetryTutorial_FireworksMenu, + eTelemetryTutorial_BeaconMenu // Sent over network as a byte }; \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/Media/languages.loc b/Minecraft.Client/Windows64Media/Media/languages.loc index 3f4659e3..e3d9162b 100644 Binary files a/Minecraft.Client/Windows64Media/Media/languages.loc and b/Minecraft.Client/Windows64Media/Media/languages.loc differ diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft.msscmp b/Minecraft.Client/Windows64Media/Sound/Minecraft.msscmp new file mode 100644 index 00000000..13983f6d Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft.msscmp differ diff --git a/Minecraft.Client/Windows64Media/loc/4J_stringsGeneric.xml b/Minecraft.Client/Windows64Media/loc/4J_stringsGeneric.xml index 461ff6f0..7adcacc4 100644 --- a/Minecraft.Client/Windows64Media/loc/4J_stringsGeneric.xml +++ b/Minecraft.Client/Windows64Media/loc/4J_stringsGeneric.xml @@ -178,13 +178,12 @@ Saving of settings to gamer profile has failed. - - Guest Gamer Profile + Guest Player - Guest gamer profile cannot access this feature. Please use a different gamer profile. + Guest players cannot access the "PSN". @@ -192,13 +191,12 @@ - Saving content. Please don't turn off your console. + Saving content. Please don't turn off your system. 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. diff --git a/Minecraft.Client/Windows64Media/loc/4J_stringsPlatformSpecific.xml b/Minecraft.Client/Windows64Media/loc/4J_stringsPlatformSpecific.xml index 8d705a63..79e76680 100644 --- a/Minecraft.Client/Windows64Media/loc/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/Windows64Media/loc/4J_stringsPlatformSpecific.xml @@ -99,6 +99,10 @@ + + The save file in the save transfer area has a version number that this version doesn't support yet. + + You are being returned to the main menu because of a problem reading your profile. diff --git a/Minecraft.Client/Windows64Media/loc/AdditionalStrings.xml b/Minecraft.Client/Windows64Media/loc/AdditionalStrings.xml new file mode 100644 index 00000000..9834da86 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/AdditionalStrings.xml @@ -0,0 +1,123 @@ + + + Show all Mash-up Worlds + + + + Hide + + + + Minecraft: PlayStation®3 Edition + + + + Options + + + + Save Cache + + + + A network error has occurred. + + + + Network Error + + + + A network error has occurred. Exiting to Main Menu. + + + + Online service is disabled on your Sony Entertainment Network account due to chat restrictions. + + + + Online service is disabled on your Sony Entertainment Network account due to parental control settings. + + + + Online Service + + + + You have been signed out from the "PSN". Online features of the game will not be available until you sign back into the "PSN". + + + + You have been signed out from the "PSN". Online features of the game will not be available until you sign back into the "PSN". Exiting to Main Menu. + + + + Choose user for player %d (or cancel to play as guest) + + + + Free + + + + Your Options file is corrupt and needs to be deleted. + + + + Delete options file. + + + + Retry loading options file. + + + + Your Save Cache file is corrupt and needs to be deleted. + + + + Trophies Disabled + + + + Trophies will be disabled because this save belongs to another user. + + + + Fatal error: Trophy Initialization failed. Please exit game. + + + + View Game Invites + + + + Corrupt File + + + + Controller Disconnected + + + + Your controller has been disconnected. Please reconnect the controller. + + + + Online service is disabled on your Sony Entertainment Network account due to parental control settings for one of your local players. + + + Online features are disabled due to a game update being available. + + + There are no downloadable content offers available for this title at the moment. + + + + Invitation + + + + Please come and play a game of Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/EULA.xml b/Minecraft.Client/Windows64Media/loc/EULA.xml new file mode 100644 index 00000000..42a075b4 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: PlayStation®Vita Edition - TERMS OF USE + These Terms set out some rules for using Minecraft: PlayStation®Vita Edition ("Minecraft"). In order to protect Minecraft and the members of our community, we need these terms to set out some rules for downloading and using Minecraft. We don't like rules any more than you do, so we have tried to keep this as short as possible but if you buy, download, use or play Minecraft, you are agreeing to stick to these terms ("Terms"). + Before we get going there is one thing we want to make really clear. Minecraft is a game that allows players to build and break things. If you play with other people (multiplayer) you can build with them or you can break what they have been building - and they can do the same to you. So don't play with other people if they don't behave like you want them to. Also sometimes people do things that they shouldn't. We don't like it but there is not a lot we can do to stop it except ask that everyone behaves properly. We rely on you and others like you in the community to let us know if someone isn’t behaving properly and if that is the case and / or you think someone is breaching the rules or these Terms or using Minecraft improperly please do tell us. We have a flagging / reporting system for doing that so please use it and we will do what is necessary to deal with it. + To flag or report any issues please email us at support@mojang.com and give us as much information as you can such as the user's details and what has happened. + Now back to the Terms: + ONE MAJOR RULE + The one major rule is that you must not distribute anything we've made. By "distribute anything we've made" what we mean is "give copies of Minecraft away, make commercial use of, try to make money from, or let other people get access to Minecraft and its parts in a way that is unfair or unreasonable". So the one major rule is that (unless we specifically agree it – such as in our Brand and Asset Usage Guidelines) you must not: + • give copies of Minecraft to anyone else; + • make commercial use of anything we've made; + • try to make money from anything we've made; or + • let other people get access to anything we've made in a way that is unfair or unreasonable. + ...and so that we are crystal clear, what we have made includes, but is not limited to, the client or the server software for Minecraft. It also includes modified versions of a Game, part of it or anything else we've made. + Otherwise we are quite relaxed about what you do - in fact we really encourage you to do cool stuff (see below) - but just don't do those things that we say you can't. + USING MINECRAFT + • You have bought Minecraft so you can use it, yourself, on your PlayStation®Vita system. + • Below we also give you limited rights to do other things but we have to draw a line somewhere or else people will go too far. If you wish to make something related to anything we've made we're humbled, but please make sure that it can't be interpreted as being official and that it complies with these Terms and above all do not make commercial use of anything we've made. + • The permission we give you to use and play Minecraft can be revoked if you break these Terms. + • When you buy Minecraft, we give you permission to install Minecraft on your own PlayStation®Vita system and use and play it on that PlayStation®Vita system as set out in these Terms. This permission is personal to you, so you are not allowed to distribute Minecraft (or any part of it) to anyone else (except as expressly permitted by us of course). + • Within reason you're free to do whatever you want with screenshots and videos of Minecraft. By "within reason" we mean that you can't make any commercial use of them or do things that are unfair or adversely affect our rights. Also, don't just rip art resources and pass them around, that's no fun. + • Essentially the simple rule is do not make commercial use of anything we've made unless specifically agreed by us, either in our brand and asset usage guidelines or under these Terms. Oh and if the law expressly allows it, such as under a "fair use" or "fair dealing" doctrine then that's ok too – but only to the extent that the law says so. + OWNERSHIP OF MINECRAFT AND OTHER THINGS + • Although we give you permission to play Minecraft, we are still the owners of it. We are also the owners of our brands and any content contained in Minecraft, which is made up of our software, textures, assets, tools, infrastructure and a whole load of other clever (and not so clever) stuff that we own. All our rights in that stuff are asserted and reserved but you can use it subject to these Terms. + • That doesn’t mean we own the cool stuff that you create using Minecraft - you just have to accept that we own each part of Minecraft and Minecraft as a product and service and those things mentioned in the previous sentence – and we also own the copyright and other so called intellectual property rights ("IPRs") associated with those things and the names and brands associated with Minecraft. + • You of course are going to make your own stuff in and using Minecraft. We don’t own the original stuff that you create and we don’t claim any ownership of anything that we shouldn’t. We will however own things that are copies (or substantial copies) or derivatives of our property and creations (outlined above) - but if you create original things they aren’t ours. So, as an example: + - a single block – we own that; + - a Gothic Cathedral with a rollercoaster running through it – we don't own that. + • Therefore, when you pay for the use of Minecraft, you are only buying a permission to use the Minecraft product in accordance with these Terms. The only permissions you have in connection with Minecraft are the permissions set out in these Terms. + CONTENT + • If you make any content available on or through Minecraft, you must give us permission to use, copy, modify and adapt that content. This permission must be irrevocable and unrestricted. You must also let us permit other people to use your content and you must let the other people you let access it (such as those you play multiplayer games with) use it. + • Please think carefully before you make any content available, because it may be made public and may be used by other people in a way you don't like. + • If you are going to make something available on or through Minecraft, it must not be offensive to people or illegal, it must be honest, and it must be your own creation. The types of things you must not make available using Minecraft include: posts that include racist or homophobic language; posts that are bullying or trolling; posts that might damage our or another person's reputation; posts that include porn, advertising or someone else's creation or image; or posts that impersonate a moderator or try to trick or exploit people. + • Any content you make available on Minecraft must also be your creation. You must not make any content available, using Minecraft, that infringes the rights of anyone else. If you post content on Minecraft, and we get challenged, threatened or sued by someone because the content infringes that persons rights, we may hold you responsible and that means you may have to pay us back for any damage we suffer as a result. Therefore it is really important that you only make content available that you have created and you don't do so with any content created by anyone else. + • Please take care over who you play with. It is hard for either you or us to know for sure that what people say is true, or even if people are really who they say they are. You should also not give out information about yourself through Minecraft. + If you are going to make content ("Your Content") available using Minecraft it must: + - comply with all Sony Computer Entertainment’s rules including the ToSUA which are the "PSN" Terms of Service and the User Agreement and any other guidelines that you have to agree to in order to use your PlayStation®Vita system and the "PSN"; + - not be offensive to people; + - not be illegal or unlawful; + - be honest and not mislead, trick or exploit anyone else nor impersonate others; + - not infringe anyone’s copyright or other rights; + - not be racist, sexist or homophobic; + - not be bullying or trolling; + - not damage our or another person’s reputation; + - not include pornography; + - not include advertising. + - You must not make any content available using Minecraft that infringes the rights of anyone else. + • You are responsible for all Your Content that is made available by you using Minecraft. + • By making Your Content available you warrant and are telling us that you are fully entitled to do so under these Terms and that we are entitled to exercise the rights you have granted to us under these Terms. + • If we get challenged, threatened or sued by someone because of any content that you make available using Minecraft or is made available by anyone on or through Minecraft it may be removed, you may be held responsible and you may have to compensate us back for any damage we suffer as a result. Your access to certain aspects of Minecraft may be removed or suspended too. + USER CONTENT + The following sets out some terms concerning both Your Content and content made available by others which are referred to simply as "User Content". Minecraft is an entertainment service and ancillary to this we (and our licensees (like Sony Computer Entertainment) are involved in the transmission, distribution, storage and retrieval of User Content without review, selection or alteration of the content. What that means is that we do not review the User Content and so we won't know what is being circulated by you or other people. We have these rules in the Terms so that you and other people have to comply with but we can’t know everything that goes on. + So please note that: + • the views expressed in any User Content are the views of the individual authors or creators and not us or anyone connected with us unless we specify otherwise; + • we are not responsible for (and make no warranty or representation in relation to and disclaim all liability for) all User Content including any comments, views or remarks expressed in it; + • by using Minecraft you acknowledge that we have no responsibility to review the content of any User Content and that all User Content is made available on the basis that we are not required to and do not exercise any control or judgement over it. + HOWEVER we (or our licensees like Sony Computer Entertainment) may remove, reject or suspend access to any User Content and remove or suspend your ability to post, make available or access User Content – including removing or suspending access to Minecraft or "PSN" if we consider it is appropriate to do so, such as because you have breached these Terms or we receive a complaint. We will also act expeditiously to remove or disable access to User Content if and when we have actual knowledge of it being unlawful. + UPGRADES + • We might make upgrades and updates available from time to time, but we don't have to. We are also not obliged to provide ongoing support or maintenance of any game. Of course, we hope to continue to release new updates for Minecraft, we just can't guarantee that we will do so. + OUR LIABILITY + • When you get a copy of Minecraft, we provide it 'as is'. Updates and upgrades are also provided 'as is'. This means that we are not making any promises to you about the standard or quality of Minecraft or that Minecraft will be uninterrupted or error free or for any loss or damage that they cause. We only promise to provide Minecraft and any services with reasonable skill and care. The law in most countries says that we can't disclaim liability for death or personal injury caused by our negligence so if your computer gets up and stabs you because of something we've done wrong then we'll take the hit on that. + WE ARE NOT LIABLE FOR: + • ANY USE OR MISUSE OF MINECRAFT BY YOU OR ANY OTHER PERSON; + • ANY CONTENT THAT IS MADE AVAILABLE BY YOU USING MINECRAFT; + • ANY BREACH OF THESE TERMS BY YOU; + • ANY BREACH OF ANY TERMS BY ANY OTHER PERSON. + TERMINATION + • If we want we can terminate your right to use Minecraft if you breach these Terms. You can terminate it too, at any time, all you have to do is uninstall Minecraft from your PlayStation®Vita system. In any case the paragraphs about "Ownership of Minecraft", "Our Liability" and "General Stuff" will continue to apply even after termination. + GENERAL STUFF + • These Terms are subject to any legal rights you might have. Nothing in these Terms will limit any of your rights that may not be excluded under law nor shall it exclude or limit our liability for death or personal injury resulting from our negligence nor any fraudulent representation. + • We may also change these Terms from time to time but those changes will only be effective to the extent that they can legally apply. For example if you only use Minecraft in single player mode and don't use the updates we make available then the old EULA applies but if you do use the updates or use parts of Minecraft that rely on our providing ongoing online services then the new EULA will apply. In that case we may not be able to / don't need to tell you about the changes for them to have effect so you should check back here from time to time so you are aware of any changes to these Terms. We're not going to be unfair about this though - but sometimes the law changes or someone does something that affects other users of Minecraft and we therefore need to put a lid on it. + • If you come to us with a suggestion for Minecraft or any of our games, that suggestion is made for free. This means we can use your suggestion in any way we want and we don't have to pay you for it. If you think you have a suggestion that we would be willing to pay you for, you must tell us you expect to be paid before you tell us the suggestion. + • In addition to these Terms we also have some Brand and Asset Usage Guidelines which you can find online. + • If you break these rules we (or Sony Computer Entertainment) may stop you from using Minecraft. If you don't want to or can't agree to these rules, then you must not buy, download, use or play Minecraft. + If there’s anything legal you’re wondering about that isn’t answered from this page, don’t do it and ask us about it. Basically, don’t be ridiculous and we won’t. + We are: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sweden + Organization number: 556819-2388 + + + + + Any content purchased in an in-game store will be purchased from Sony Network Entertainment Europe Limited ("SNEE") and be subject to Sony Entertainment Network Terms of Service and User Agreement which is available on the PlayStation®Store. Please check usage rights for each purchase as these may differ from item to item. Unless otherwise shown, content available in any in-game store has the same age rating as the game. + + + + + Purchase and use of items are subject to the Network Terms of Service and User Agreement. This online service has been sublicensed to you by Sony Computer Entertainment America. + + + + Remember: Use of this software is subject to the Software Usage Terms at eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/extra.xml b/Minecraft.Client/Windows64Media/loc/extra.xml new file mode 100644 index 00000000..982fd7f8 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/extra.xml @@ -0,0 +1,14 @@ + + + Increase World Size + + + Overwrite Edges + + + Increase World Size + + + Overwrite Edges + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/stringsDynafont.xml b/Minecraft.Client/Windows64Media/loc/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml index 4eccce8b..36b521dd 100644 --- a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml +++ b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml @@ -429,6 +429,27 @@ When loading or creating a world, you can press the "More Options" button to ent {*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*} + {*T2*}Daylight Cycle{*ETW*}{*B*} + When disabled, the time of day will not change.{*B*}{*B*} + + {*T2*}Keep Inventory{*ETW*}{*B*} + When enabled, players will keep their inventory when they die.{*B*}{*B*} + + {*T2*}Mob Spawning{*ETW*}{*B*} + When disabled, mobs will not spawn naturally.{*B*}{*B*} + + {*T2*}Mob Griefing{*ETW*}{*B*} + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items.{*B*}{*B*} + + {*T2*}Mob Loot{*ETW*}{*B*} + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder).{*B*}{*B*} + + {*T2*}Tile Drops{*ETW*}{*B*} + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone).{*B*}{*B*} + + {*T2*}Natural Regeneration{*ETW*}{*B*} + When disabled, players will not regenerate health naturally.{*B*}{*B*} + {*T1*}World Generation Options{*ETW*}{*B*} When creating a new world there are some additional options.{*B*}{*B*} @@ -472,20 +493,20 @@ To modify the privileges for a player, select their name and press{*CONTROLLER_V 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*} + {*KICK_PLAYER_DESCRIPTION*}{*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. @@ -583,7 +604,7 @@ If "Host Privileges" is enabled the host player can modify some privileges for t {*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 into it to go to The End.{*B*}{*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*} @@ -605,65 +626,116 @@ so they can easily join you. - -{*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*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*} + {*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- Added new items - Hardened Clay, Stained Clay, Block of Coal, Hay Bale, Activator Rail, Block of Redstone, Daylight Sensor, Dropper, Hopper, Minecart with Hopper, Minecart with TNT, Redstone Comparator, Weighted Pressure Plate, Beacon, Trapped Chest, Firework Rocket, Firework Star, Nether Star, Lead, Horse Armor, Name Tag, Horse Spawn Egg{*B*} +- Added new Mobs - Wither, Wither Skeletons, Witches, Bats, Horses, Donkeys and Mules{*B*} +- Added new terrain generation features - Witch Huts.{*B*} +- Added Beacon interface.{*B*} +- Added Horse interface.{*B*} +- Added Hopper interface.{*B*} +- Added Fireworks - Fireworks interface is accessible from the Crafting Table when you have the ingredients to craft a Firework Star or Firework Rocket.{*B*} +- Added 'Adventure Mode' - You can only break blocks with the correct tools.{*B*} +- Added lots of new sounds.{*B*} +- Mobs, items and projectiles can now pass through portals.{*B*} +- Repeaters can now be locked by powering their sides with another Repeater.{*B*} +- Zombies and Skeletons can now spawn with different weapons and armor.{*B*} +- New death messages.{*B*} +- Name mobs with a Name Tag, and rename containers to change the title when the menu is open.{*B*} +- Bonemeal no longer instantly grows everything to full size, and instead randomly grows in stages.{*B*} +- A Redstone signal describing the contents of Chests, Brewing Stands, Dispensers and Jukeboxes can be detected by placing a Redstone Comparator directly against them.{*B*} +- Dispensers can face in any direction.{*B*} +- Eating a Golden Apple gives the player extra "absorption" health for a short period.{*B*} +- The longer you remain in an area the harder the monsters that spawn in that area will 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*} - 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*} - +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*} - Hardened Clay, Stained Clay, Block of Coal, Hay Bale, Activator Rail, Block of Redstone, Daylight Sensor, Dropper, Hopper, Minecart with Hopper, Minecart with TNT, Redstone Comparator, Weighted Pressure Plate, Beacon, Trapped Chest, Firework Rocket, Firework Star, Nether Star, Lead, Horse Armor, Name Tag, Horse Spawn Egg{*B*}{*B*} +{*T1*}New Mobs{*ETB*} - Wither, Wither Skeletons, Witches, Bats, Horses, Donkeys and Mules{*B*}{*B*} +{*T1*}New Features{*ETB*} - Tame and ride a horse, craft fireworks and put on a show, name animals and monsters with a Name Tag, create more advanced Redstone circuits, and new Host Options to help control what guests to your world can do!{*B*}{*B*} +{*T1*}New Tutorial World{*ETB*} – Learn how to use the old and new features in the Tutorial World. See if you can find all the secret Music Discs hidden in the world!{*B*}{*B*} + + + + + Horses + + + + {*T3*}HOW TO PLAY : HORSES{*ETW*}{*B*}{*B*} +Horses and Donkeys are found mainly in open plains. Mules are the offspring of a Donkey and a Horse, but are infertile themselves.{*B*} +All adult Horses, Donkeys and Mules can be ridden. However only Horses can be armored, and only Mules and Donkeys may be equipped with saddlebags for transporting items.{*B*}{*B*} +Horses, Donkeys and Mules must be tamed before they can be used. A horse is tamed by attempting to ride it, and managing to stay on the horse while it attempts to throw the rider off.{*B*} +When Love Hearts appear around the horse, it is tame, and will no longer attempt to throw the player off. To steer a horse, the player must equip the horse with a Saddle.{*B*}{*B*} +Saddles can be bought from villagers or found inside Chests hidden in the world.{*B*} +Tame Donkeys and Mules can be given saddlebags by attaching a Chest. These saddlebags can then be accessed whilst riding or sneaking.{*B*}{*B*} +Horses and Donkeys (but not Mules) can be bred like other animals using Golden Apples or Golden Carrots.{*B*} +Foals will grow into adult horses over time, although feeding them Wheat or Hay will speed this up.{*B*} + + + + + Beacons + + + + {*T3*}HOW TO PLAY : BEACONS{*ETW*}{*B*}{*B*} +Active Beacons project a bright beam of light into the sky and grant powers to nearby players.{*B*} +They are crafted with Glass, Obsidian and Nether Stars, which can be obtained by defeating the Wither.{*B*}{*B*} +Beacons must be placed so that they are in sunlight during the day. Beacons must be placed on Pyramids of Iron, Gold, Emerald or Diamond.{*B*} +The material the Beacon is placed on has no effect on the power of the Beacon.{*B*}{*B*} +In the Beacon menu you can select one primary power for your Beacon. The more tiers your pyramid has the more powers you will have to choose from.{*B*} +A Beacon on a pyramid with at least four tiers also gives the option of either the Regeneration secondary power or a stronger primary power.{*B*}{*B*} +To set the powers of your Beacon you must sacrifice an Emerald, Diamond, Gold or Iron Ingot in the payment slot.{*B*} +Once set, the powers will emanate from the Beacon indefinitely.{*B*} + + + + + Fireworks + + + + {*T3*}HOW TO PLAY : FIREWORKS{*ETW*}{*B*}{*B*} +Fireworks are decorative items that can be launched by hand or from Dispensers. They are crafted using Paper, Gunpowder and optionally a number of Firework Stars.{*B*} +The colors, fade, shape, size, and effects (such as trails and twinkle) of Firework Stars can be customized by including additional ingredients when crafting.{*B*}{*B*} +To craft a Firework place Gunpowder and Paper in the 3x3 crafting grid that is shown above your inventory.{*B*} +You can optionally place multiple Firework Stars in the crafting grid to add them to the Firework.{*B*} +Filling more slots in the crafting grid with Gunpowder will increase the height at which all the Firework Stars will explode.{*B*}{*B*} +You can then take the crafted Firework out of the output slot.{*B*}{*B*} +Firework Stars can be crafted by placing Gunpowder and Dye into the crafting grid.{*B*} + - The Dye will set the color of the explosion of the Firework Star.{*B*} + - The shape of the Firework Star is set by adding either a Fire Charge, Gold Nugget, Feather or Mob Head.{*B*} + - A trail or a twinkle can be added using Diamonds or Glowstone Dust.{*B*}{*B*} +After a Firework Star has been crafted, you can set the fade color of the Firework Star by crafting it with Dye. + + + + + Hoppers + + + + {*T3*}HOW TO PLAY : HOPPERS{*ETW*}{*B*}{*B*} +Hoppers are used to insert or remove items from containers, and to automatically pick up items thrown into them.{*B*} +They can affect Brewing Stands, Chests, Dispensers, Droppers, Minecarts with Chests, Minecarts with Hoppers, as well as other Hoppers.{*B*}{*B*} +Hoppers will continuously attempt to suck items out of a suitable container placed above them. They will also attempt to insert stored items into an output container.{*B*} +If a Hopper is powered by Redstone it will become inactive and stop both sucking and inserting items.{*B*}{*B*} +A Hopper points in the direction it tries to output items. To make a Hopper point to a particular block, place the Hopper against that block whilst sneaking.{*B*} + + + + + Droppers + + + + {*T3*}HOW TO PLAY : DROPPERS{*ETW*}{*B*}{*B*} +When powered by Redstone, Droppers will drop a single random item contained within them onto the ground. Use {*CONTROLLER_ACTION_USE*} to open the Dropper and then you can load the Dropper with items from your inventory.{*B*} +If the Dropper is facing a Chest or another type of Container, the item will be placed into that instead. Long chains of Droppers can be constructed to transport items over a distance, but for this to work they will have to be alternately powered on and off. + @@ -692,100 +764,103 @@ Pumpkin Pie, Night Vision Potion, Invisibility Potion, Nether Quartz, Nether Qua 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. - + + NOT USED + - - Gives the user 3 Armor when worn. - + + NOT USED + - - Gives the user 2 Armor when worn. - + + NOT USED + - - Gives the user 1 Armor when worn. - + + NOT USED + - - Gives the user 2 Armor when worn. - + + Gives the user 1 Armor when worn. + - - Gives the user 5 Armor when worn. - + + Gives the user 3 Armor when worn. + - - Gives the user 4 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 1 Armor when worn. - + + Gives the user 1 Armor when worn. + - - Gives the user 2 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 5 Armor when worn. - + + Gives the user 4 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 2 Armor when worn. + - - Gives the user 5 Armor when worn. - + + Gives the user 6 Armor when worn. + - - Gives the user 3 Armor when worn. - + + Gives the user 5 Armor when worn. + - - Gives the user 1 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 3 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 8 Armor when worn. - + + Gives the user 5 Armor when worn. + - - Gives the user 6 Armor when worn. - + + Gives the user 3 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. @@ -912,6 +987,10 @@ The colors of the bed are always the same, regardless of the colors of wool used Will create an image of an area explored while held. This can be used for path-finding. + + When used becomes a map of the part of the world that you are in, and gets filled in as you explore. + + Allows for ranged attacks by using arrows. @@ -920,6 +999,54 @@ The colors of the bed are always the same, regardless of the colors of wool used Used as ammunition for bows. + + Dropped by the Wither, used in crafting Beacons. + + + + When activated, create colorful explosions. The color, effect, shape and fade are determined by the Firework Star used when the Firework is created. + + + + Used to determine the color, effect and shape of a Firework. + + + + Used in Redstone circuits to maintain, compare, or subtract signal strength, or to measure certain block states. + + + + Is a type of Minecart that acts as a moving TNT block. + + + + Is a block that outputs a Redstone signal based on sunlight (or lack of sunlight). + + + + Is a special type of Minecart that functions similarly to a Hopper. It will collect items lying on tracks and from containers above it. + + + + A special type of Armor that can be equipped to a horse. Provides 5 Armor. + + + + A special type of Armor that can be equipped to a horse. Provides 7 Armor. + + + + A special type of Armor that can be equipped to a horse. Provides 11 Armor. + + + + Used to leash mobs to the player or Fence posts. + + + + Used to name mobs in the world. + + Restores 2.5{*ICON_SHANK_01*}. @@ -1022,7 +1149,7 @@ Can also be used for low-level lighting. - Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. + Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a Minecart. @@ -1566,6 +1693,66 @@ Can also be used for low-level lighting. Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + Used to execute commands. + + + + Projects a beam of light into the sky and can provide Status Effects to nearby players. + + + + Stores blocks and items inside. Place two chest side by side to create a larger chest with double capacity. The trapped chest also creates a Redstone charge when opened. + + + + Provides a Redstone charge. The charge will be stronger if more items are on the plate. + + + + Provides a Redstone charge. The charge will be stronger if more items are on the plate. Requires more weight than the light plate. + + + + Used as a redstone power source. Can be crafted back into Redstone. + + + + Used to catch items or to transfer items into and out of containers. + + + + A type of rail that can enable or disable Minecarts with Hoppers and trigger Minecarts with TNT. + + + + Used to hold and drop items, or push items into another container, when given a Redstone charge. + + + + Colorful blocks crafted by dyeing Hardened clay. + + + + Can be fed to Horses, Donkeys or Mules to heal up to 10 Hearts. Speeds up the growth of foals. + + + + Created by smelting Clay in a furnace. + + + + Crafted from glass and a dye. + + + + Crafted from Stained Glass + + + + A compact way of storing Coal. Can be used as fuel in a Furnace. + + Squid @@ -1754,6 +1941,62 @@ Can also be used for low-level lighting. Appear in Villages to protect them, and can be created using Iron Blocks and Pumpkins. + + Bat + + + + These flying creatures are found in caverns or other large enclosed spaces. + + + + Witch + + + + These enemies can be found in swamps and attack you by throwing Potions. They drop Potions when killed. + + + + Horse + + + + These animals can be tamed and can then be ridden. + + + + Donkey + + + + These animals can be tamed and can then be ridden. They can have a chest attached. + + + + Mule + + + + Born when a Horse and a Donkey breed. These animals can be tamed and can then be ridden and carry chests. + + + + Zombie Horse + + + + Skeleton Horse + + + + Wither + + + + These are crafted from Wither Skulls and Soul Sand. They fire exploding skulls at you. + + Explosives Animator @@ -2446,6 +2689,10 @@ Can also be used for low-level lighting. Map + + Empty Map + + Music Disc - "13" @@ -2650,6 +2897,50 @@ Can also be used for low-level lighting. Creeper Head + + Nether Star + + + + Firework Rocket + + + + Firework Star + + + + Redstone Comparator + + + + Minecart with TNT + + + + Minecart with Hopper + + + + Iron Horse Armor + + + + Gold Horse Armor + + + + Diamond Horse Armor + + + + Lead + + + + Name Tag + + Stone @@ -2682,6 +2973,10 @@ Can also be used for low-level lighting. Jungle Wood Planks + + Wood Planks (any type) + + Sapling @@ -2880,22 +3175,21 @@ Can also be used for low-level lighting. Block of Gold - - - - A compact way of storing Gold. - + - - Block of Iron - + + A compact way of storing Gold. + - - A compact way of storing Iron. - + + A compact way of storing Iron. + + + Block of Iron + - + Stone Slab @@ -3001,14 +3295,13 @@ Can also be used for low-level lighting. Block of Diamond - - - - A compact way of storing Diamonds. - + + + A compact way of storing Diamonds. + - + Crafting Table @@ -3134,14 +3427,13 @@ Can also be used for low-level lighting. Lapis Lazuli Block - - - - A compact way of storing Lapis Lazuli. - + + + A compact way of storing Lapis Lazuli. + - + Dispenser @@ -3357,76 +3649,444 @@ Can also be used for low-level lighting. Skull - - Current Controls + + Command Block - - Layout + + Beacon - - Move/Sprint + + Trapped Chest - - Look + + Weighted Pressure Plate (Light) - - Pause + + Weighted Pressure Plate (Heavy) - - Jump + + Redstone Comparator - - Jump/Fly Up + + Daylight Sensor - - Inventory + + Block of Redstone - - Cycle Held Item + + Hopper - - Action + + Activator Rail - - Use + + Dropper - - Crafting + + Stained Clay - - Drop + + Hay Bale - - Sneak + + Hardened Clay - - Sneak/Fly Down + + Block of Coal - - Change Camera Mode + + Black Stained Clay - - Players/Invite + + Red Stained Clay - - Movement (When Flying) + + Green Stained Clay + + + + Brown Stained Clay + + + + Blue Stained Clay + + + + Purple Stained Clay + + + + Cyan Stained Clay + + + + Light Gray Stained Clay + + + + Gray Stained Clay + + + + Pink Stained Clay + + + + Lime Stained Clay + + + + Yellow Stained Clay + + + + Light Blue Stained Clay + + + + Magenta Stained Clay + + + + Orange Stained Clay + + + + White Stained Clay + + + + Stained Glass + + + + Black Stained Glass + + + + Red Stained Glass + + + + Green Stained Glass + + + + Brown Stained Glass + + + + Blue Stained Glass + + + + Purple Stained Glass + + + + Cyan Stained Glass + + + + Light Gray Stained Glass + + + + Gray Stained Glass + + + + Pink Stained Glass + + + + Lime Stained Glass + + + + Yellow Stained Glass + + + + Light Blue Stained Glass + + + + Magenta Stained Glass + + + + Orange Stained Glass + + + + White Stained Glass + + + + Stained Glass Pane + + + + Black Stained Glass Pane + + + + Red Stained Glass Pane + + + + Green Stained Glass Pane + + + + Brown Stained Glass Pane + + + + Blue Stained Glass Pane + + + + Purple Stained Glass Pane + + + + Cyan Stained Glass Pane + + + + Light Gray Stained Glass Pane + + + + Gray Stained Glass Pane + + + + Pink Stained Glass Pane + + + + Lime Stained Glass Pane + + + + Yellow Stained Glass Pane + + + + Light Blue Stained Glass Pane + + + + Magenta Stained Glass Pane + + + + Orange Stained Glass Pane + + + + White Stained Glass Pane + + + + Small Ball + + + + Large Ball + + + + Star-shaped + + + + Creeper-shaped + + + + Burst + + + + Unknown Shape + + + + Black + + + + Red + + + + Green + + + + Brown + + + + Blue + + + + Purple + + + + Cyan + + + + Light Gray + + + + Gray + + + + Pink + + + + Lime + + + + Yellow + + + + Light Blue + + + + Magenta + + + + Orange + + + + White + + + + Custom + + + + Fade to + + + + Twinkle + + + + Trail + + + + Flight Duration: + + + + 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) @@ -3527,7 +4187,7 @@ Can also be used for low-level lighting. {*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. +Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. @@ -3565,7 +4225,7 @@ At night monsters come out, make sure to build a shelter before that happens. As you collect and craft more items, your inventory will fill up.{*B*} - Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. +Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. @@ -3629,21 +4289,15 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. - + 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. - + 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. - + 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. @@ -3679,179 +4333,128 @@ At night monsters come out, make sure to build a shelter before that happens. - - You have completed the first part of the tutorial. - + 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. - + {*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. - + 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. - +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. - + 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. - + 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 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*} . - + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Press{*CONTROLLER_VK_B*} now to exit the inventory. - + 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. - + 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. - +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. - + 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. - + 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*}. - + 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. - + 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*} . - + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . - - Press{*CONTROLLER_VK_B*} now to exit the creative mode inventory. - + 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. - + 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_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. - +Press{*CONTROLLER_VK_X*} to show the item description. {*B*} - Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. - +Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. {*B*} - Press{*CONTROLLER_VK_X*} to show the inventory again. - +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. - + 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. - + 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. - + 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 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 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 list of ingredients required to craft the selected item are now displayed. @@ -3859,516 +4462,356 @@ At night monsters come out, make sure to build a shelter before that happens. - - 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. - + 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 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*} - + 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*} - + 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*} - + 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. - + 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*} - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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*}. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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. - + 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. - +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. - + 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. - + 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. - + 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. - + 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. - + 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*} - + 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. - +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*} - + 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 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*} - + 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. - + {*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*} - + 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*} - + 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. - + {*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*} - + 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*} - + 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*} - + 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*} - + 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. - + {*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*} - + 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*} - + 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. - + 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. - + {*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. - + 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. - + 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 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*} - + 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*} - + 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 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! - + 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. - + {*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. - + 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 Obsidian 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 activate a Nether Portal, set fire to the Obsidian 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. - + 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 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. - + 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. - + 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. - + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Creative mode.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Creative mode. @@ -4388,17 +4831,13 @@ At night monsters come out, make sure to build a shelter before that happens. - - In this area a farm has been set up. Farming enables you to create a renewable source of food and other items. - + 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. - + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about farming.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about farming. @@ -4413,207 +4852,411 @@ At night monsters come out, make sure to build a shelter before that happens.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. + + 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. + + + + This is the horse inventory interface. + + + + {*B*}Press{*CONTROLLER_VK_A*} to continue. +{*B*}Press{*CONTROLLER_VK_B*} if you already know how to use the horse inventory. + + + + The horse inventory allows you to transfer, or equip items to your Horse, Donkey or Mule. + + + + Saddle your Horse by placing a Saddle in the saddle slot. Horses can be given armor by placing Horse Armor in the armor slot. + + + + You can also transfer items between your own inventory and the saddlebags strapped to Donkeys and Mules in this menu. + + + + You have found a Horse. + + + + You have found a Donkey. + + + + You have found a Mule. - - 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*} + + {*B*}Press{*CONTROLLER_VK_A*} to learn more about Horses, Donkeys and Mules. +{*B*}Press{*CONTROLLER_VK_B*} if you already know about Horses, Donkeys and Mules. - - 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*} + + Horses and Donkeys are found mainly in open plains. Mules can be bred from a Donkey and a Horse, but are infertile themselves. - - Mushrooms should be planted in a dimly lit area, and will spread to nearby dimly lit blocks.{*ICON*}39{*/ICON*} + + All adult Horses, Donkeys and Mules can be ridden. However only Horses can be armored, and only Mules and Donkeys may be equipped with saddlebags for transporting items. - - Bonemeal can be used to grow crops to their fully grown state, or grow Mushrooms into Huge Mushrooms.{*ICON*}351:15{*/ICON*} + + Horses, Donkeys and Mules must be tamed before they can be used. A horse is tamed by attempting to ride it, and managing to stay on the horse while it attempts to throw the rider off. - - You have now completed the farming tutorial. + + When tamed Love Hearts will appear around them and they will no longer buck the player off. - - - In this area animals have been penned in. You can breed animals to produce baby versions of themselves. - + + Try to ride this horse now. Use {*CONTROLLER_ACTION_USE*} with no items or tools in your hand to mount it. - - - {*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 steer a horse they must then be equipped with a saddle, which can be bought from villagers or found inside chests hidden in the world. - - To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'. + + Tame Donkeys and Mules can be given saddlebags by attaching a chest. These bags can be accessed whilst riding or when sneaking. - - 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. + + Horses and Donkeys (but not Mules) can be bred like other animals using Golden Apples or Golden Carrots. Foals will grow into adult horses over time, although feeding them wheat or hay will speed this up. - - 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. + + You can try to tame the Horses and Donkeys here, and there are Saddles, Horse Armor and other useful items for Horses in chests around here too. - - After being in Love Mode, an animal will not be able to enter it again for about five minutes. + + This is the Beacon interface, which you can use to choose powers for your Beacon to grant. - - 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*} + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the Beacon interface. - - - 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. - + + In the Beacon menu you can select 1 primary power for your Beacon. The more tiers your pyramid has the more powers you will have to choose from. - - You have now completed the animal and breeding tutorial. + + A Beacon on a pyramid with at least 4 tiers grants an additional option of either the Regeneration secondary power or a stronger primary power. - - - In this area are some pumpkins and blocks to make a Snow Golem and an Iron Golem. - + + To set the powers of your Beacon you must sacrifice an Emerald, Diamond, Gold or Iron Ingot in the payment slot. Once set, the powers will emanate from the Beacon indefinitely. - - - {*B*} - Press{*CONTROLLER_VK_A*} to learn more about Golems.{*B*} - Press{*CONTROLLER_VK_B*} if you already know about Golems. - + + At the top of this pyramid there is an inactivate Beacon. - - Golems are created by placing a pumpkin on top of a stack of blocks. + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Beacons.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Beacons. - - 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. + + Active Beacons project a bright beam of light into the sky and grant powers to nearby players. They are crafted with Glass, Obsidian and Nether Stars, which can be obtained by defeating the Wither. - - 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. + + Beacons must be placed so that they are in sunlight during the day. Beacons must be placed on Pyramids of Iron, Gold, Emerald or Diamond. However the choice of material has no effect on the power of the beacon. - - Iron Golems also appear naturally to protect villages, and will attack you if you attack any villagers. + + Try using the Beacon to set the powers it grants, you can use the Iron Ingots provided as the necessary payment. - - You cannot leave this area until you have completed the tutorial. + + This room contains Hoppers - - Different tools are better for different materials. You should use a shovel to mine soft materials like earth and sand. + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Hoppers.{*B*} +Press{*CONTROLLER_VK_B*} if you already know about Hoppers. - - Different tools are better for different materials. You should use an axe to chop tree trunks. + + Hoppers are used to insert or remove items from containers, and to automatically pick-up items thrown into them. - - 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. + + They can affect Brewing Stands, Chests, Dispensers, Droppers, Minecarts with Chests, Minecarts with Hoppers, as well as other Hoppers. - - Certain tools are better for attacking enemies. Consider using a sword to attack. + + Hoppers will continuously attempt to suck items out of suitable container placed above them. It will also attempt to insert stored items into an output container. - - 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... + + However if a Hopper is powered by Redstone it will become inactive and stop both sucking and inserting items. - - 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. + + A Hopper points in the direction it tries to output items. To make a Hopper point to a particular block, place the Hopper against that block whilst sneaking. - - Hold{*CONTROLLER_ACTION_JUMP*} to swim up. + + There are various useful Hopper layouts for you to see and experiment with in this room. - - 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. + + This is the Firework interface, which you can use to craft Fireworks and Firework Stars. - - 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. + + {*B*} +Press{*CONTROLLER_VK_A*} to continue.{*B*} +Press{*CONTROLLER_VK_B*} if you already know how to use the Firework interface. - - 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. + + To craft a Firework, place Gunpowder and Paper in the 3x3 crafting grid that is shown above your inventory. - - This more advanced piston mechanism creates a self-repairing bridge! Push the button to activate, then investigate how the components interact to learn more. + + You can optionally place multiple Firework Stars in the crafting grid to add them to the Firework. - - If you move the pointer outside of the interface while carrying an item, you can drop that item. + + Filling more slots in the crafting grid with Gunpowder will increase the height at which all the Firework Stars will explode. - - 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. + + You can then take the crafted Firework out of the output slot when you wish to craft it. - - - 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! - + + Firework Stars can be crafted by placing Gunpowder and Dye into the crafting grid. - - {*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. + + The Dye will set the color of the explosion of the Firework Star. - - Reminder: + + The shape of the Firework Star is set by adding either a Fire Charge, Gold Nugget, Feather or Mob Head. - - + + A trail or a twinkle can be added using Diamonds or Glowstone Dust. - - New features have been added to the game in the latest version, including new areas in the tutorial world. + + After a Firework Star has been crafted, you can set the fade color of the Firework Star by crafting it with Dye. - - {*B*}Press{*CONTROLLER_VK_A*} to play through the tutorial as normal.{*B*} - Press{*CONTROLLER_VK_B*} to skip the main tutorial. + + Contained within the chests here there are various items used in the creation of FIREWORKS! - - In this area you will find areas setup to help you learn about fishing, boats, pistons and redstone. + + {*B*} +Press{*CONTROLLER_VK_A*} to learn more about Fireworks. {*B*} +Press{*CONTROLLER_VK_B*} if you already know about Fireworks. - - Outside of this area you will find examples of buildings, farming, minecarts and tracks, enchanting, brewing, trading, smithing and more! + + Fireworks are decorative items that can be launched by hand or from Dispensers. They are crafted using Paper, Gunpowder and optionally a number of Firework Stars. - - - Your food bar has depleted to a level where you will no longer heal. - + + The colors, fade, shape, size, and effects (such as trails and twinkles) of Firework Stars can be customized by including additional ingredients when crafting. - - - {*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. - + + Try crafting a Firework at the Crafting Table using an assortment of ingredients from the chests. @@ -5032,6 +5675,38 @@ At night monsters come out, make sure to build a shelter before that happens.Clear All Slots + + Mount + + + + Dismount + + + + Attach Chest + + + + Launch + + + + Leash + + + + Release + + + + Attach + + + + Name + + OK @@ -5329,6 +6004,10 @@ Would you like to unlock the full game now? Leaving The END + + Finding Seed for the World Generator + + This bed is occupied @@ -5549,6 +6228,34 @@ Would you like to unlock the full game now? Dispenser + + Horse + + + + Dropper + + + + Hopper + + + + Beacon + + + + Primary Power + + + + Secondary Power + + + + Minecart + + There are no downloadable content offers of this type available for this title at the moment. @@ -5827,6 +6534,10 @@ Would you like to install the mash-up pack or texture pack now? Game Mode: Creative + + Game Mode: Adventure + + Survival @@ -5835,6 +6546,10 @@ Would you like to install the mash-up pack or texture pack now? Creative + + Adventure + + Created in Survival Mode @@ -5875,6 +6590,10 @@ Would you like to install the mash-up pack or texture pack now? Superflat + + Enter a seed to generate the same terrain again. Leave blank for a random world. + + When enabled, the game will be an online game. @@ -5919,6 +6638,34 @@ Would you like to install the mash-up pack or texture pack now? When enabled, a chest containing some useful items will be created near the player spawn point. + + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items. + + + + When enabled, players will keep their inventory when they die. + + + + When disabled, mobs will not spawn naturally. + + + + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder). + + + + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone). + + + + When disabled, players will not regenerate health naturally. + + + + When disabled, the time of day will not change. + + Skin Packs @@ -6016,7 +6763,91 @@ Would you like to install the mash-up pack or texture pack now? - {*PLAYER*} was killed by {*SOURCE*} + {*PLAYER*} was killed by {*SOURCE*} using magic + + + + {*PLAYER*} fell off a ladder + + + + {*PLAYER*} fell off some vines + + + + {*PLAYER*} fell out of the water + + + + {*PLAYER*} fell from a high place + + + + {*PLAYER*} was doomed to fall by {*SOURCE*} + + + + {*PLAYER*} was doomed to fall by {*SOURCE*} + + + + {*PLAYER*} was doomed to fall by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} fell too far and was finished by {*SOURCE*} + + + + {*PLAYER*} fell too far and was finished by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} walked into fire whilst fighting {*SOURCE*} + + + + {*PLAYER*} was burnt to a crisp whilst fighting {*SOURCE*} + + + + {*PLAYER*} tried to swim in lava to escape {*SOURCE*} + + + + {*PLAYER*} drowned whilst trying to escape {*SOURCE*} + + + + {*PLAYER*} walked into a cactus whilst trying to escape {*SOURCE*} + + + + {*PLAYER*} was blown up by {*SOURCE*} + + + + {*PLAYER*} withered away + + + + {*PLAYER*} was slain by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} was shot by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} was fireballed by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} was pummeled by {*SOURCE*} using {*ITEM*} + + + + {*PLAYER*} was killed by {*SOURCE*} using {*ITEM*} @@ -6263,11 +7094,11 @@ Would you like to install the mash-up pack or texture pack now? - Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows and Cats has been reached. + Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows, Cats and Horses 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 Pigs, Sheep, Cows, Cats and Horses has been reached. @@ -6286,6 +7117,10 @@ Would you like to install the mash-up pack or texture pack now? 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 Bats 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. @@ -6303,7 +7138,7 @@ Would you like to install the mash-up pack or texture pack now? - 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 Pigs, Sheep, Cows, Cats and Horses has been reached. @@ -6314,6 +7149,10 @@ Would you like to install the mash-up pack or texture pack now? 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 horses has been reached. + + This animal can't enter Love Mode. The maximum number of breeding Mooshrooms has been reached. @@ -6362,6 +7201,10 @@ Would you like to install the mash-up pack or texture pack now? Settings + + Languages + + Credits @@ -6410,6 +7253,38 @@ Would you like to install the mash-up pack or texture pack now? World Options + + Game Options + + + + Mob Griefing + + + + Keep Inventory + + + + Mob Spawning + + + + Mob Loot + + + + Tile Drops + + + + Natural Regeneration + + + + Daylight Cycle + + Can Build and Mine @@ -6738,6 +7613,22 @@ Would you like to install the mash-up pack or texture pack now? Poison + + Wither + + + + Health Boost + + + + Absorption + + + + Saturation + + of Swiftness @@ -6814,6 +7705,22 @@ Would you like to install the mash-up pack or texture pack now? of Poison + + of Decay + + + + of Health Boost + + + + of Absorption + + + + of Saturation + + @@ -7007,6 +7914,38 @@ Would you like to install the mash-up pack or texture pack now? Reduces health of the affected players, animals and monsters over time. + + When Applied: + + + + Horse Jump Strength + + + + Zombie Reinforcements + + + + Max Health + + + + Mob Follow Range + + + + Knockback Resistance + + + + Speed + + + + Attack Damage + + Sharpness @@ -7188,7 +8127,7 @@ Would you like to install the mash-up pack or texture pack now? - 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 1{*ICON_SHANK_01*}. Eating this can cause you to become poisoned. @@ -7871,8 +8810,5 @@ All Ender Chests in a world are linked. Items placed into an Ender Chest are acc Cure - - - Finding Seed for the World Generator - + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/stringsLanguages.xml b/Minecraft.Client/Windows64Media/loc/stringsLanguages.xml new file mode 100644 index 00000000..1468a170 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/stringsLanguages.xml @@ -0,0 +1,40 @@ + + + System Language + English + + German + + Spanish + Spanish (Spain) + Spanish (Latin America) + + French + + Italian + + Portuguese + Portuguese (Portugal) + Portuguese (Brazil) + + Japanese + + Korean + + Chinese (Traditional) + Chinese (Simplified) + + Danish + Finnish + + Dutch + + Polish + Russian + Swedish + Norwegian + + Greek + + Turkish + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/stringsLeaderboards.xml b/Minecraft.Client/Windows64Media/loc/stringsLeaderboards.xml index 17acd1e9..233f3fa4 100644 --- a/Minecraft.Client/Windows64Media/loc/stringsLeaderboards.xml +++ b/Minecraft.Client/Windows64Media/loc/stringsLeaderboards.xml @@ -1,47 +1,48 @@ + - - Kills Easy - - - Kills Normal - - - Kills Hard - - - Mining Blocks Peaceful - - - Mining Blocks Easy - - - Mining Blocks Normal - - - Mining Blocks Hard - - - Farming Peaceful - - - Farming Easy - - - Farming Normal - - - Farming Hard - - - Traveling Peaceful - - - Traveling Easy - - - Traveling Normal - - - Traveling Hard - + + Kills Easy + + + Kills Normal + + + Kills Hard + + + Mining Blocks Peaceful + + + Mining Blocks Easy + + + Mining Blocks Normal + + + Mining Blocks Hard + + + Farming Peaceful + + + Farming Easy + + + Farming Normal + + + Farming Hard + + + Traveling Peaceful + + + Traveling Easy + + + Traveling Normal + + + Traveling Hard + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/stringsRichPresence.xml b/Minecraft.Client/Windows64Media/loc/stringsRichPresence.xml new file mode 100644 index 00000000..22f550b1 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/stringsRichPresence.xml @@ -0,0 +1,66 @@ + + + + {GAME_STATE} + + + Idle + + + In the menus + + + Playing Multiplayer - {GAME_STATE} + + + Offline Multiplayer - {GAME_STATE} + + + Playing Alone - {GAME_STATE} + + + Offline Alone - {GAME_STATE} + + + Enjoying the view! + + + Riding a pig + + + Riding a minecart + + + In a boat + + + Fishing + + + Crafting + + + Forging + + + Into the Nether + + + Listening to a disc + + + Looking at a map + + + Enchanting + + + Brewing a potion + + + Working at the Anvil + + + Meeting the neighbours + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/strings.h b/Minecraft.Client/Windows64Media/strings.h index f4047769..63e3a7f4 100644 --- a/Minecraft.Client/Windows64Media/strings.h +++ b/Minecraft.Client/Windows64Media/strings.h @@ -1,1925 +1,2291 @@ #pragma once -#define IDS_ACHIEVEMENTS 0 -#define IDS_ACTION_BAN_LEVEL_DESCRIPTION 1 -#define IDS_ACTION_BAN_LEVEL_TITLE 2 -#define IDS_ALLOWFRIENDSOFFRIENDS 3 -#define IDS_ANY_WOOL 4 -#define IDS_AUDIO 5 -#define IDS_AUTOSAVE_COUNTDOWN 6 -#define IDS_AWARD_AVATAR1 7 -#define IDS_AWARD_AVATAR2 8 -#define IDS_AWARD_AVATAR3 9 -#define IDS_AWARD_GAMERPIC1 10 -#define IDS_AWARD_GAMERPIC2 11 -#define IDS_AWARD_THEME 12 -#define IDS_AWARD_TITLE 13 -#define IDS_BACK 14 -#define IDS_BACK_BUTTON 15 -#define IDS_BANNED_LEVEL_TITLE 16 -#define IDS_BLAZE 17 -#define IDS_BONUS_CHEST 18 -#define IDS_BOSS_ENDERDRAGON_HEALTH 19 -#define IDS_BREWING_STAND 20 -#define IDS_BUTTON_REMOVE_FROM_BAN_LIST 21 -#define IDS_CAN_ATTACK_ANIMALS 22 -#define IDS_CAN_ATTACK_PLAYERS 23 -#define IDS_CAN_BUILD_AND_MINE 24 -#define IDS_CAN_DISABLE_EXHAUSTION 25 -#define IDS_CAN_FLY 26 -#define IDS_CAN_INVISIBLE 27 -#define IDS_CAN_OPEN_CONTAINERS 28 -#define IDS_CAN_USE_DOORS_AND_SWITCHES 29 -#define IDS_CANCEL 30 -#define IDS_CANT_PLACE_NEAR_SPAWN_TEXT 31 -#define IDS_CANT_PLACE_NEAR_SPAWN_TITLE 32 -#define IDS_CANT_SHEAR_MOOSHROOM 33 -#define IDS_CANT_SPAWN_IN_PEACEFUL 34 -#define IDS_CANTJOIN_TITLE 35 -#define IDS_CARROTS 36 -#define IDS_CAVE_SPIDER 37 -#define IDS_CHANGE_SKIN 38 -#define IDS_CHECKBOX_ANIMATED_CHARACTER 39 -#define IDS_CHECKBOX_CUSTOM_SKIN_ANIM 40 -#define IDS_CHECKBOX_DEATH_MESSAGES 41 -#define IDS_CHECKBOX_DISPLAY_HAND 42 -#define IDS_CHECKBOX_DISPLAY_HUD 43 -#define IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS 44 -#define IDS_CHECKBOX_RENDER_BEDROCKFOG 45 -#define IDS_CHECKBOX_RENDER_CLOUDS 46 -#define IDS_CHECKBOX_VERTICAL_SPLIT_SCREEN 47 -#define IDS_CHEST 48 -#define IDS_CHEST_LARGE 49 -#define IDS_CHICKEN 50 -#define IDS_COMMAND_TELEPORT_ME 51 -#define IDS_COMMAND_TELEPORT_SUCCESS 52 -#define IDS_COMMAND_TELEPORT_TO_ME 53 -#define IDS_CONFIRM_CANCEL 54 -#define IDS_CONFIRM_DECLINE_SAVE_GAME 55 -#define IDS_CONFIRM_EXIT_GAME 56 -#define IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE 57 -#define IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST 58 -#define IDS_CONFIRM_LEAVE_VIA_INVITE 59 -#define IDS_CONFIRM_OK 60 -#define IDS_CONFIRM_SAVE_GAME 61 -#define IDS_CONFIRM_START_CREATIVE 62 -#define IDS_CONFIRM_START_HOST_PRIVILEGES 63 -#define IDS_CONFIRM_START_SAVEDINCREATIVE 64 -#define IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE 65 -#define IDS_CONNECTION_FAILED 66 -#define IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN 67 -#define IDS_CONNECTION_LOST 68 -#define IDS_CONNECTION_LOST_LIVE 69 -#define IDS_CONNECTION_LOST_LIVE_NO_EXIT 70 -#define IDS_CONNECTION_LOST_SERVER 71 -#define IDS_CONTROL 72 -#define IDS_CONTROLLER_A 73 -#define IDS_CONTROLLER_B 74 -#define IDS_CONTROLLER_BACK 75 -#define IDS_CONTROLLER_DPAD_D 76 -#define IDS_CONTROLLER_DPAD_L 77 -#define IDS_CONTROLLER_DPAD_R 78 -#define IDS_CONTROLLER_DPAD_U 79 -#define IDS_CONTROLLER_LEFT_BUMPER 80 -#define IDS_CONTROLLER_LEFT_STICK 81 -#define IDS_CONTROLLER_LEFT_THUMBSTICK 82 -#define IDS_CONTROLLER_LEFT_TRIGGER 83 -#define IDS_CONTROLLER_RIGHT_BUMPER 84 -#define IDS_CONTROLLER_RIGHT_STICK 85 -#define IDS_CONTROLLER_RIGHT_THUMBSTICK 86 -#define IDS_CONTROLLER_RIGHT_TRIGGER 87 -#define IDS_CONTROLLER_START 88 -#define IDS_CONTROLLER_X 89 -#define IDS_CONTROLLER_Y 90 -#define IDS_CONTROLS 91 -#define IDS_CONTROLS_ACTION 92 -#define IDS_CONTROLS_CRAFTING 93 -#define IDS_CONTROLS_DPAD 94 -#define IDS_CONTROLS_DROP 95 -#define IDS_CONTROLS_HELDITEM 96 -#define IDS_CONTROLS_INVENTORY 97 -#define IDS_CONTROLS_JUMP 98 -#define IDS_CONTROLS_JUMPFLY 99 -#define IDS_CONTROLS_LAYOUT 100 -#define IDS_CONTROLS_LOOK 101 -#define IDS_CONTROLS_MOVE 102 -#define IDS_CONTROLS_PAUSE 103 -#define IDS_CONTROLS_PLAYERS 104 -#define IDS_CONTROLS_SCHEME0 105 -#define IDS_CONTROLS_SCHEME1 106 -#define IDS_CONTROLS_SCHEME2 107 -#define IDS_CONTROLS_SNEAK 108 -#define IDS_CONTROLS_SNEAKFLY 109 -#define IDS_CONTROLS_THIRDPERSON 110 -#define IDS_CONTROLS_USE 111 -#define IDS_CORRUPT_DLC 112 -#define IDS_CORRUPT_DLC_MULTIPLE 113 -#define IDS_CORRUPT_DLC_TITLE 114 -#define IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT 115 -#define IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE 116 -#define IDS_CORRUPTSAVE_TEXT 117 -#define IDS_CORRUPTSAVE_TITLE 118 -#define IDS_COW 119 -#define IDS_CREATE_NEW_WORLD 120 -#define IDS_CREATE_NEW_WORLD_RANDOM_SEED 121 -#define IDS_CREATE_NEW_WORLD_SEED 122 -#define IDS_CREATE_NEW_WORLD_SEEDTEXT 123 -#define IDS_CREATEANEWSAVE 124 -#define IDS_CREATED_IN_CREATIVE 125 -#define IDS_CREATED_IN_SURVIVAL 126 -#define IDS_CREATIVE 127 -#define IDS_CREDITS 128 -#define IDS_CREDITS_ADDITIONALSTE 129 -#define IDS_CREDITS_ART 130 -#define IDS_CREDITS_ARTDEVELOPER 131 -#define IDS_CREDITS_ASIALOC 132 -#define IDS_CREDITS_BIZDEV 133 -#define IDS_CREDITS_BULLYCOORD 134 -#define IDS_CREDITS_CEO 135 -#define IDS_CREDITS_CHIEFARCHITECT 136 -#define IDS_CREDITS_CODENINJA 137 -#define IDS_CREDITS_COMMUNITYMANAGER 138 -#define IDS_CREDITS_CONCEPTART 139 -#define IDS_CREDITS_CRUNCHER 140 -#define IDS_CREDITS_CUSTOMERSUPPORT 141 -#define IDS_CREDITS_DESIGNTEAM 142 -#define IDS_CREDITS_DESPROG 143 -#define IDS_CREDITS_DEVELOPER 144 -#define IDS_CREDITS_DEVELOPMENTTEAM 145 -#define IDS_CREDITS_DOF 146 -#define IDS_CREDITS_EUROPELOC 147 -#define IDS_CREDITS_EXECPRODUCER 148 -#define IDS_CREDITS_EXPLODANIM 149 -#define IDS_CREDITS_GAMECRAFTER 150 -#define IDS_CREDITS_JON_KAGSTROM 151 -#define IDS_CREDITS_LEADPC 152 -#define IDS_CREDITS_LEADPRODUCER 153 -#define IDS_CREDITS_LEADTESTER 154 -#define IDS_CREDITS_MARKETING 155 -#define IDS_CREDITS_MGSCENTRAL 156 -#define IDS_CREDITS_MILESTONEACCEPT 157 -#define IDS_CREDITS_MUSICANDSOUNDS 158 -#define IDS_CREDITS_OFFICEDJ 159 -#define IDS_CREDITS_ORIGINALDESIGN 160 -#define IDS_CREDITS_PMPROD 161 -#define IDS_CREDITS_PORTFOLIODIRECTOR 162 -#define IDS_CREDITS_PRODUCER 163 -#define IDS_CREDITS_PRODUCTMANAGER 164 -#define IDS_CREDITS_PROGRAMMING 165 -#define IDS_CREDITS_PROJECT 166 -#define IDS_CREDITS_QA 167 -#define IDS_CREDITS_REDMONDLOC 168 -#define IDS_CREDITS_RELEASEMANAGEMENT 169 -#define IDS_CREDITS_RESTOFMOJANG 170 -#define IDS_CREDITS_RISE_LUGO 171 -#define IDS_CREDITS_SDET 172 -#define IDS_CREDITS_SPECIALTHANKS 173 -#define IDS_CREDITS_SRTESTLEAD 174 -#define IDS_CREDITS_TESTASSOCIATES 175 -#define IDS_CREDITS_TESTLEAD 176 -#define IDS_CREDITS_TESTMANAGER 177 -#define IDS_CREDITS_TOBIAS_MOLLSTAM 178 -#define IDS_CREDITS_USERRESEARCH 179 -#define IDS_CREDITS_WCW 180 -#define IDS_CREDITS_XBLADIRECTOR 181 -#define IDS_CREEPER 182 -#define IDS_CURRENT_LAYOUT 183 -#define IDS_DEATH_ARROW 184 -#define IDS_DEATH_CACTUS 185 -#define IDS_DEATH_DRAGON_BREATH 186 -#define IDS_DEATH_DROWN 187 -#define IDS_DEATH_EXPLOSION 188 -#define IDS_DEATH_FALL 189 -#define IDS_DEATH_FALLING_ANVIL 190 -#define IDS_DEATH_FALLING_TILE 191 -#define IDS_DEATH_FIREBALL 192 -#define IDS_DEATH_GENERIC 193 -#define IDS_DEATH_INDIRECT_MAGIC 194 -#define IDS_DEATH_INFIRE 195 -#define IDS_DEATH_INWALL 196 -#define IDS_DEATH_LAVA 197 -#define IDS_DEATH_MAGIC 198 -#define IDS_DEATH_MOB 199 -#define IDS_DEATH_ONFIRE 200 -#define IDS_DEATH_OUTOFWORLD 201 -#define IDS_DEATH_PLAYER 202 -#define IDS_DEATH_STARVE 203 -#define IDS_DEATH_THORNS 204 -#define IDS_DEATH_THROWN 205 -#define IDS_DEBUG_SETTINGS 206 -#define IDS_DEFAULT_SAVENAME 207 -#define IDS_DEFAULT_SKINS 208 -#define IDS_DEFAULT_TEXTUREPACK 209 -#define IDS_DEFAULT_WORLD_NAME 210 -#define IDS_DEFAULTS_TEXT 211 -#define IDS_DEFAULTS_TITLE 212 -#define IDS_DESC_ANVIL 213 -#define IDS_DESC_APPLE 214 -#define IDS_DESC_ARROW 215 -#define IDS_DESC_BED 216 -#define IDS_DESC_BEDROCK 217 -#define IDS_DESC_BEEF_COOKED 218 -#define IDS_DESC_BEEF_RAW 219 -#define IDS_DESC_BLAZE 220 -#define IDS_DESC_BLAZE_POWDER 221 -#define IDS_DESC_BLAZE_ROD 222 -#define IDS_DESC_BLOCK 223 -#define IDS_DESC_BLOCK_DIAMOND 224 -#define IDS_DESC_BLOCK_GOLD 225 -#define IDS_DESC_BLOCK_IRON 226 -#define IDS_DESC_BLOCK_LAPIS 227 -#define IDS_DESC_BOAT 228 -#define IDS_DESC_BONE 229 -#define IDS_DESC_BOOK 230 -#define IDS_DESC_BOOKSHELF 231 -#define IDS_DESC_BOOTS 232 -#define IDS_DESC_BOOTS_CHAIN 233 -#define IDS_DESC_BOOTS_DIAMOND 234 -#define IDS_DESC_BOOTS_GOLD 235 -#define IDS_DESC_BOOTS_IRON 236 -#define IDS_DESC_BOOTS_LEATHER 237 -#define IDS_DESC_BOW 238 -#define IDS_DESC_BOWL 239 -#define IDS_DESC_BREAD 240 -#define IDS_DESC_BREWING_STAND 241 -#define IDS_DESC_BRICK 242 -#define IDS_DESC_BUCKET 243 -#define IDS_DESC_BUCKET_LAVA 244 -#define IDS_DESC_BUCKET_MILK 245 -#define IDS_DESC_BUCKET_WATER 246 -#define IDS_DESC_BUTTON 247 -#define IDS_DESC_CACTUS 248 -#define IDS_DESC_CAKE 249 -#define IDS_DESC_CARPET 250 -#define IDS_DESC_CARROT_GOLDEN 251 -#define IDS_DESC_CARROT_ON_A_STICK 252 -#define IDS_DESC_CARROTS 253 -#define IDS_DESC_CAULDRON 254 -#define IDS_DESC_CAVE_SPIDER 255 -#define IDS_DESC_CHEST 256 -#define IDS_DESC_CHESTPLATE 257 -#define IDS_DESC_CHESTPLATE_CHAIN 258 -#define IDS_DESC_CHESTPLATE_DIAMOND 259 -#define IDS_DESC_CHESTPLATE_GOLD 260 -#define IDS_DESC_CHESTPLATE_IRON 261 -#define IDS_DESC_CHESTPLATE_LEATHER 262 -#define IDS_DESC_CHICKEN 263 -#define IDS_DESC_CHICKEN_COOKED 264 -#define IDS_DESC_CHICKEN_RAW 265 -#define IDS_DESC_CLAY 266 -#define IDS_DESC_CLAY_TILE 267 -#define IDS_DESC_CLOCK 268 -#define IDS_DESC_COAL 269 -#define IDS_DESC_COBBLESTONE_WALL 270 -#define IDS_DESC_COCOA 271 -#define IDS_DESC_COMPASS 272 -#define IDS_DESC_COOKIE 273 -#define IDS_DESC_COW 274 -#define IDS_DESC_CRAFTINGTABLE 275 -#define IDS_DESC_CREEPER 276 -#define IDS_DESC_CROPS 277 -#define IDS_DESC_DEAD_BUSH 278 -#define IDS_DESC_DETECTORRAIL 279 -#define IDS_DESC_DIAMONDS 280 -#define IDS_DESC_DIRT 281 -#define IDS_DESC_DISPENSER 282 -#define IDS_DESC_DOOR_IRON 283 -#define IDS_DESC_DOOR_WOOD 284 -#define IDS_DESC_DRAGONEGG 285 -#define IDS_DESC_DYE_BLACK 286 -#define IDS_DESC_DYE_BLUE 287 -#define IDS_DESC_DYE_BROWN 288 -#define IDS_DESC_DYE_CYAN 289 -#define IDS_DESC_DYE_GRAY 290 -#define IDS_DESC_DYE_GREEN 291 -#define IDS_DESC_DYE_LIGHTBLUE 292 -#define IDS_DESC_DYE_LIGHTGRAY 293 -#define IDS_DESC_DYE_LIME 294 -#define IDS_DESC_DYE_MAGENTA 295 -#define IDS_DESC_DYE_ORANGE 296 -#define IDS_DESC_DYE_PINK 297 -#define IDS_DESC_DYE_PURPLE 298 -#define IDS_DESC_DYE_RED 299 -#define IDS_DESC_DYE_SILVER 300 -#define IDS_DESC_DYE_WHITE 301 -#define IDS_DESC_DYE_YELLOW 302 -#define IDS_DESC_EGG 303 -#define IDS_DESC_EMERALD 304 -#define IDS_DESC_EMERALDBLOCK 305 -#define IDS_DESC_EMERALDORE 306 -#define IDS_DESC_ENCHANTED_BOOK 307 -#define IDS_DESC_ENCHANTED_GOLDENAPPLE 308 -#define IDS_DESC_ENCHANTMENTTABLE 309 -#define IDS_DESC_END_PORTAL 310 -#define IDS_DESC_ENDER_PEARL 311 -#define IDS_DESC_ENDERCHEST 312 -#define IDS_DESC_ENDERDRAGON 313 -#define IDS_DESC_ENDERMAN 314 -#define IDS_DESC_ENDPORTALFRAME 315 -#define IDS_DESC_EXP_BOTTLE 316 -#define IDS_DESC_EYE_OF_ENDER 317 -#define IDS_DESC_FARMLAND 318 -#define IDS_DESC_FEATHER 319 -#define IDS_DESC_FENCE 320 -#define IDS_DESC_FENCE_GATE 321 -#define IDS_DESC_FERMENTED_SPIDER_EYE 322 -#define IDS_DESC_FIREBALL 323 -#define IDS_DESC_FISH_COOKED 324 -#define IDS_DESC_FISH_RAW 325 -#define IDS_DESC_FISHINGROD 326 -#define IDS_DESC_FLINT 327 -#define IDS_DESC_FLINTANDSTEEL 328 -#define IDS_DESC_FLOWER 329 -#define IDS_DESC_FLOWERPOT 330 -#define IDS_DESC_FURNACE 331 -#define IDS_DESC_GHAST 332 -#define IDS_DESC_GHAST_TEAR 333 -#define IDS_DESC_GLASS 334 -#define IDS_DESC_GLASS_BOTTLE 335 -#define IDS_DESC_GLOWSTONE 336 -#define IDS_DESC_GOLD_NUGGET 337 -#define IDS_DESC_GOLDENAPPLE 338 -#define IDS_DESC_GRASS 339 -#define IDS_DESC_GRAVEL 340 -#define IDS_DESC_HALFSLAB 341 -#define IDS_DESC_HATCHET 342 -#define IDS_DESC_HELL_ROCK 343 -#define IDS_DESC_HELL_SAND 344 -#define IDS_DESC_HELMET 345 -#define IDS_DESC_HELMET_CHAIN 346 -#define IDS_DESC_HELMET_DIAMOND 347 -#define IDS_DESC_HELMET_GOLD 348 -#define IDS_DESC_HELMET_IRON 349 -#define IDS_DESC_HELMET_LEATHER 350 -#define IDS_DESC_HOE 351 -#define IDS_DESC_ICE 352 -#define IDS_DESC_INGOT 353 -#define IDS_DESC_IRON_FENCE 354 -#define IDS_DESC_IRONGOLEM 355 -#define IDS_DESC_ITEM_NETHERBRICK 356 -#define IDS_DESC_ITEMFRAME 357 -#define IDS_DESC_JACKOLANTERN 358 -#define IDS_DESC_JUKEBOX 359 -#define IDS_DESC_LADDER 360 -#define IDS_DESC_LAVA 361 -#define IDS_DESC_LAVA_SLIME 362 -#define IDS_DESC_LEATHER 363 -#define IDS_DESC_LEAVES 364 -#define IDS_DESC_LEGGINGS 365 -#define IDS_DESC_LEGGINGS_CHAIN 366 -#define IDS_DESC_LEGGINGS_DIAMOND 367 -#define IDS_DESC_LEGGINGS_GOLD 368 -#define IDS_DESC_LEGGINGS_IRON 369 -#define IDS_DESC_LEGGINGS_LEATHER 370 -#define IDS_DESC_LEVER 371 -#define IDS_DESC_LOG 372 -#define IDS_DESC_MAGMA_CREAM 373 -#define IDS_DESC_MAP 374 -#define IDS_DESC_MELON_BLOCK 375 -#define IDS_DESC_MELON_SEEDS 376 -#define IDS_DESC_MELON_SLICE 377 -#define IDS_DESC_MINECART 378 -#define IDS_DESC_MINECARTWITHCHEST 379 -#define IDS_DESC_MINECARTWITHFURNACE 380 -#define IDS_DESC_MOB_SPAWNER 381 -#define IDS_DESC_MONSTER_SPAWNER 382 -#define IDS_DESC_MOSS_STONE 383 -#define IDS_DESC_MUSHROOM 384 -#define IDS_DESC_MUSHROOM_COW 385 -#define IDS_DESC_MUSHROOMSTEW 386 -#define IDS_DESC_MYCEL 387 -#define IDS_DESC_NETHER_QUARTZ 388 -#define IDS_DESC_NETHER_QUARTZ_ORE 389 -#define IDS_DESC_NETHER_STALK_SEEDS 390 -#define IDS_DESC_NETHERBRICK 391 -#define IDS_DESC_NETHERFENCE 392 -#define IDS_DESC_NETHERSTALK 393 -#define IDS_DESC_NOTEBLOCK 394 -#define IDS_DESC_OBSIDIAN 395 -#define IDS_DESC_ORE_COAL 396 -#define IDS_DESC_ORE_DIAMOND 397 -#define IDS_DESC_ORE_GOLD 398 -#define IDS_DESC_ORE_IRON 399 -#define IDS_DESC_ORE_LAPIS 400 -#define IDS_DESC_ORE_REDSTONE 401 -#define IDS_DESC_OZELOT 402 -#define IDS_DESC_PAPER 403 -#define IDS_DESC_PICKAXE 404 -#define IDS_DESC_PICTURE 405 -#define IDS_DESC_PIG 406 -#define IDS_DESC_PIGZOMBIE 407 -#define IDS_DESC_PISTON 408 -#define IDS_DESC_PORKCHOP_COOKED 409 -#define IDS_DESC_PORKCHOP_RAW 410 -#define IDS_DESC_PORTAL 411 -#define IDS_DESC_POTATO 412 -#define IDS_DESC_POTATO_BAKED 413 -#define IDS_DESC_POTATO_POISONOUS 414 -#define IDS_DESC_POTION 415 -#define IDS_DESC_POWEREDRAIL 416 -#define IDS_DESC_PRESSUREPLATE 417 -#define IDS_DESC_PUMPKIN 418 -#define IDS_DESC_PUMPKIN_PIE 419 -#define IDS_DESC_PUMPKIN_SEEDS 420 -#define IDS_DESC_QUARTZ_BLOCK 421 -#define IDS_DESC_RAIL 422 -#define IDS_DESC_RECORD 423 -#define IDS_DESC_REDSTONE_DUST 424 -#define IDS_DESC_REDSTONE_LIGHT 425 -#define IDS_DESC_REDSTONEREPEATER 426 -#define IDS_DESC_REDSTONETORCH 427 -#define IDS_DESC_REEDS 428 -#define IDS_DESC_ROTTEN_FLESH 429 -#define IDS_DESC_SADDLE 430 -#define IDS_DESC_SAND 431 -#define IDS_DESC_SANDSTONE 432 -#define IDS_DESC_SAPLING 433 -#define IDS_DESC_SHEARS 434 -#define IDS_DESC_SHEEP 435 -#define IDS_DESC_SHOVEL 436 -#define IDS_DESC_SIGN 437 -#define IDS_DESC_SILVERFISH 438 -#define IDS_DESC_SKELETON 439 -#define IDS_DESC_SKULL 440 -#define IDS_DESC_SLAB 441 -#define IDS_DESC_SLIME 442 -#define IDS_DESC_SLIMEBALL 443 -#define IDS_DESC_SNOW 444 -#define IDS_DESC_SNOWBALL 445 -#define IDS_DESC_SNOWMAN 446 -#define IDS_DESC_SPECKLED_MELON 447 -#define IDS_DESC_SPIDER 448 -#define IDS_DESC_SPIDER_EYE 449 -#define IDS_DESC_SPONGE 450 -#define IDS_DESC_SQUID 451 -#define IDS_DESC_STAIRS 452 -#define IDS_DESC_STICK 453 -#define IDS_DESC_STICKY_PISTON 454 -#define IDS_DESC_STONE 455 -#define IDS_DESC_STONE_BRICK 456 -#define IDS_DESC_STONE_BRICK_SMOOTH 457 -#define IDS_DESC_STONE_SILVERFISH 458 -#define IDS_DESC_STONESLAB 459 -#define IDS_DESC_STRING 460 -#define IDS_DESC_STRUCTBLOCK 461 -#define IDS_DESC_SUGAR 462 -#define IDS_DESC_SULPHUR 463 -#define IDS_DESC_SWORD 464 -#define IDS_DESC_TALL_GRASS 465 -#define IDS_DESC_THIN_GLASS 466 -#define IDS_DESC_TNT 467 -#define IDS_DESC_TOP_SNOW 468 -#define IDS_DESC_TORCH 469 -#define IDS_DESC_TRAPDOOR 470 -#define IDS_DESC_TRIPWIRE 471 -#define IDS_DESC_TRIPWIRE_SOURCE 472 -#define IDS_DESC_VILLAGER 473 -#define IDS_DESC_VINE 474 -#define IDS_DESC_WATER 475 -#define IDS_DESC_WATERLILY 476 -#define IDS_DESC_WEB 477 -#define IDS_DESC_WHEAT 478 -#define IDS_DESC_WHEAT_SEEDS 479 -#define IDS_DESC_WHITESTONE 480 -#define IDS_DESC_WOLF 481 -#define IDS_DESC_WOODENPLANKS 482 -#define IDS_DESC_WOODSLAB 483 -#define IDS_DESC_WOOL 484 -#define IDS_DESC_WOOLSTRING 485 -#define IDS_DESC_YELLOW_DUST 486 -#define IDS_DESC_ZOMBIE 487 -#define IDS_DEVICEGONE_TEXT 488 -#define IDS_DEVICEGONE_TITLE 489 -#define IDS_DIFFICULTY_EASY 490 -#define IDS_DIFFICULTY_HARD 491 -#define IDS_DIFFICULTY_NORMAL 492 -#define IDS_DIFFICULTY_PEACEFUL 493 -#define IDS_DIFFICULTY_TITLE_EASY 494 -#define IDS_DIFFICULTY_TITLE_HARD 495 -#define IDS_DIFFICULTY_TITLE_NORMAL 496 -#define IDS_DIFFICULTY_TITLE_PEACEFUL 497 -#define IDS_DISABLE_EXHAUSTION 498 -#define IDS_DISABLE_SAVING 499 -#define IDS_DISCONNECTED 500 -#define IDS_DISCONNECTED_BANNED 501 -#define IDS_DISCONNECTED_CLIENT_OLD 502 -#define IDS_DISCONNECTED_FLYING 503 -#define IDS_DISCONNECTED_KICKED 504 -#define IDS_DISCONNECTED_LOGIN_TOO_LONG 505 -#define IDS_DISCONNECTED_NO_FRIENDS_IN_GAME 506 -#define IDS_DISCONNECTED_SERVER_FULL 507 -#define IDS_DISCONNECTED_SERVER_OLD 508 -#define IDS_DISCONNECTED_SERVER_QUIT 509 -#define IDS_DISPENSER 510 -#define IDS_DLC_COST 511 -#define IDS_DLC_MENU_AVATARITEMS 512 -#define IDS_DLC_MENU_GAMERPICS 513 -#define IDS_DLC_MENU_MASHUPPACKS 514 -#define IDS_DLC_MENU_SKINPACKS 515 -#define IDS_DLC_MENU_TEXTUREPACKS 516 -#define IDS_DLC_MENU_THEMES 517 -#define IDS_DLC_TEXTUREPACK_GET_FULL_TITLE 518 -#define IDS_DLC_TEXTUREPACK_GET_TRIAL_TITLE 519 -#define IDS_DLC_TEXTUREPACK_NOT_PRESENT 520 -#define IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE 521 -#define IDS_DLC_TEXTUREPACK_UNLOCK_TITLE 522 -#define IDS_DONE 523 -#define IDS_DONT_RESET_NETHER 524 -#define IDS_DOWNLOADABLE_CONTENT_OFFERS 525 -#define IDS_DOWNLOADABLECONTENT 526 -#define IDS_EDIT_SIGN_MESSAGE 527 -#define IDS_ENABLE_TELEPORT 528 -#define IDS_ENCHANT 529 -#define IDS_ENCHANTMENT_ARROW_DAMAGE 530 -#define IDS_ENCHANTMENT_ARROW_FIRE 531 -#define IDS_ENCHANTMENT_ARROW_INFINITE 532 -#define IDS_ENCHANTMENT_ARROW_KNOCKBACK 533 -#define IDS_ENCHANTMENT_DAMAGE_ALL 534 -#define IDS_ENCHANTMENT_DAMAGE_ARTHROPODS 535 -#define IDS_ENCHANTMENT_DAMAGE_UNDEAD 536 -#define IDS_ENCHANTMENT_DIGGING 537 -#define IDS_ENCHANTMENT_DURABILITY 538 -#define IDS_ENCHANTMENT_FIRE 539 -#define IDS_ENCHANTMENT_KNOCKBACK 540 -#define IDS_ENCHANTMENT_LEVEL_1 541 -#define IDS_ENCHANTMENT_LEVEL_10 542 -#define IDS_ENCHANTMENT_LEVEL_2 543 -#define IDS_ENCHANTMENT_LEVEL_3 544 -#define IDS_ENCHANTMENT_LEVEL_4 545 -#define IDS_ENCHANTMENT_LEVEL_5 546 -#define IDS_ENCHANTMENT_LEVEL_6 547 -#define IDS_ENCHANTMENT_LEVEL_7 548 -#define IDS_ENCHANTMENT_LEVEL_8 549 -#define IDS_ENCHANTMENT_LEVEL_9 550 -#define IDS_ENCHANTMENT_LOOT_BONUS 551 -#define IDS_ENCHANTMENT_LOOT_BONUS_DIGGER 552 -#define IDS_ENCHANTMENT_OXYGEN 553 -#define IDS_ENCHANTMENT_PROTECT_ALL 554 -#define IDS_ENCHANTMENT_PROTECT_EXPLOSION 555 -#define IDS_ENCHANTMENT_PROTECT_FALL 556 -#define IDS_ENCHANTMENT_PROTECT_FIRE 557 -#define IDS_ENCHANTMENT_PROTECT_PROJECTILE 558 -#define IDS_ENCHANTMENT_THORNS 559 -#define IDS_ENCHANTMENT_UNTOUCHING 560 -#define IDS_ENCHANTMENT_WATER_WORKER 561 -#define IDS_ENDERDRAGON 562 -#define IDS_ENDERMAN 563 -#define IDS_ERROR_NETWORK 564 -#define IDS_ERROR_NETWORK_TITLE 565 -#define IDS_EXIT_GAME 566 -#define IDS_EXIT_GAME_NO_SAVE 567 -#define IDS_EXIT_GAME_SAVE 568 -#define IDS_EXITING_GAME 569 -#define IDS_FAILED_TO_CREATE_GAME_TITLE 570 -#define IDS_FAILED_TO_LOADSAVE_TEXT 571 -#define IDS_FAILED_TO_SAVE_TEXT 572 -#define IDS_FAILED_TO_SAVE_TITLE 573 -#define IDS_FATAL_ERROR_TEXT 574 -#define IDS_FATAL_ERROR_TITLE 575 -#define IDS_FAVORITES_SKIN_PACK 576 -#define IDS_FIRE_SPREADS 577 -#define IDS_FLOWERPOT 578 -#define IDS_FUEL 579 -#define IDS_FURNACE 580 -#define IDS_GAME_HOST_NAME 581 -#define IDS_GAME_HOST_NAME_UNKNOWN 582 -#define IDS_GAME_MODE_CHANGED 583 -#define IDS_GAME_OPTIONS 584 -#define IDS_GAMEMODE_CREATIVE 585 -#define IDS_GAMEMODE_SURVIVAL 586 -#define IDS_GAMEOPTION_ALLOWFOF 587 -#define IDS_GAMEOPTION_BONUS_CHEST 588 -#define IDS_GAMEOPTION_DISABLE_SAVING 589 -#define IDS_GAMEOPTION_FIRE_SPREADS 590 -#define IDS_GAMEOPTION_HOST_PRIVILEGES 591 -#define IDS_GAMEOPTION_INVITEONLY 592 -#define IDS_GAMEOPTION_ONLINE 593 -#define IDS_GAMEOPTION_PVP 594 -#define IDS_GAMEOPTION_RESET_NETHER 595 -#define IDS_GAMEOPTION_SEED 596 -#define IDS_GAMEOPTION_STRUCTURES 597 -#define IDS_GAMEOPTION_SUPERFLAT 598 -#define IDS_GAMEOPTION_TNT_EXPLODES 599 -#define IDS_GAMEOPTION_TRUST 600 -#define IDS_GAMEOPTION_WORLD_SIZE 601 -#define IDS_GAMERPICS 602 -#define IDS_GENERATE_STRUCTURES 603 -#define IDS_GENERIC_ERROR 604 -#define IDS_GHAST 605 -#define IDS_GRAPHICS 606 -#define IDS_GROUPNAME_ARMOUR 607 -#define IDS_GROUPNAME_BUILDING_BLOCKS 608 -#define IDS_GROUPNAME_DECORATIONS 609 -#define IDS_GROUPNAME_FOOD 610 -#define IDS_GROUPNAME_MATERIALS 611 -#define IDS_GROUPNAME_MECHANISMS 612 -#define IDS_GROUPNAME_MISCELLANEOUS 613 -#define IDS_GROUPNAME_POTIONS 614 -#define IDS_GROUPNAME_POTIONS_480 615 -#define IDS_GROUPNAME_REDSTONE_AND_TRANSPORT 616 -#define IDS_GROUPNAME_STRUCTURES 617 -#define IDS_GROUPNAME_TOOLS 618 -#define IDS_GROUPNAME_TOOLS_WEAPONS_ARMOR 619 -#define IDS_GROUPNAME_TRANSPORT 620 -#define IDS_GROUPNAME_WEAPONS 621 -#define IDS_GUEST_ORDER_CHANGED_TEXT 622 -#define IDS_GUEST_ORDER_CHANGED_TITLE 623 -#define IDS_HELP_AND_OPTIONS 624 -#define IDS_HINTS 625 -#define IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS 626 -#define IDS_HOST_OPTIONS 627 -#define IDS_HOST_PRIVILEGES 628 -#define IDS_HOW_TO_PLAY 629 -#define IDS_HOW_TO_PLAY_ANVIL 630 -#define IDS_HOW_TO_PLAY_BANLIST 631 -#define IDS_HOW_TO_PLAY_BASICS 632 -#define IDS_HOW_TO_PLAY_BREEDANIMALS 633 -#define IDS_HOW_TO_PLAY_BREWING 634 -#define IDS_HOW_TO_PLAY_CHEST 635 -#define IDS_HOW_TO_PLAY_CRAFT_TABLE 636 -#define IDS_HOW_TO_PLAY_CRAFTING 637 -#define IDS_HOW_TO_PLAY_CREATIVE 638 -#define IDS_HOW_TO_PLAY_DISPENSER 639 -#define IDS_HOW_TO_PLAY_ENCHANTMENT 640 -#define IDS_HOW_TO_PLAY_ENDERCHEST 641 -#define IDS_HOW_TO_PLAY_FARMANIMALS 642 -#define IDS_HOW_TO_PLAY_FURNACE 643 -#define IDS_HOW_TO_PLAY_HOSTOPTIONS 644 -#define IDS_HOW_TO_PLAY_HUD 645 -#define IDS_HOW_TO_PLAY_INVENTORY 646 -#define IDS_HOW_TO_PLAY_LARGECHEST 647 -#define IDS_HOW_TO_PLAY_MENU_ANVIL 648 -#define IDS_HOW_TO_PLAY_MENU_BANLIST 649 -#define IDS_HOW_TO_PLAY_MENU_BASICS 650 -#define IDS_HOW_TO_PLAY_MENU_BREEDANIMALS 651 -#define IDS_HOW_TO_PLAY_MENU_BREWING 652 -#define IDS_HOW_TO_PLAY_MENU_CHESTS 653 -#define IDS_HOW_TO_PLAY_MENU_CRAFTING 654 -#define IDS_HOW_TO_PLAY_MENU_CREATIVE 655 -#define IDS_HOW_TO_PLAY_MENU_DISPENSER 656 -#define IDS_HOW_TO_PLAY_MENU_ENCHANTMENT 657 -#define IDS_HOW_TO_PLAY_MENU_FARMANIMALS 658 -#define IDS_HOW_TO_PLAY_MENU_FURNACE 659 -#define IDS_HOW_TO_PLAY_MENU_HOSTOPTIONS 660 -#define IDS_HOW_TO_PLAY_MENU_HUD 661 -#define IDS_HOW_TO_PLAY_MENU_INVENTORY 662 -#define IDS_HOW_TO_PLAY_MENU_MULTIPLAYER 663 -#define IDS_HOW_TO_PLAY_MENU_NETHERPORTAL 664 -#define IDS_HOW_TO_PLAY_MENU_SOCIALMEDIA 665 -#define IDS_HOW_TO_PLAY_MENU_SPRINT 666 -#define IDS_HOW_TO_PLAY_MENU_THEEND 667 -#define IDS_HOW_TO_PLAY_MENU_TRADING 668 -#define IDS_HOW_TO_PLAY_MENU_WHATSNEW 669 -#define IDS_HOW_TO_PLAY_MULTIPLAYER 670 -#define IDS_HOW_TO_PLAY_NETHERPORTAL 671 -#define IDS_HOW_TO_PLAY_NEXT 672 -#define IDS_HOW_TO_PLAY_PREV 673 -#define IDS_HOW_TO_PLAY_SOCIALMEDIA 674 -#define IDS_HOW_TO_PLAY_THEEND 675 -#define IDS_HOW_TO_PLAY_TRADING 676 -#define IDS_HOW_TO_PLAY_WHATSNEW 677 -#define IDS_ICON_SHANK_01 678 -#define IDS_ICON_SHANK_03 679 -#define IDS_IN_GAME_GAMERTAGS 680 -#define IDS_IN_GAME_TOOLTIPS 681 -#define IDS_INGREDIENT 682 -#define IDS_INGREDIENTS 683 -#define IDS_INVENTORY 684 -#define IDS_INVERT_LOOK 685 -#define IDS_INVISIBLE 686 -#define IDS_INVITE_ONLY 687 -#define IDS_IRONGOLEM 688 -#define IDS_ITEM_APPLE 689 -#define IDS_ITEM_APPLE_GOLD 690 -#define IDS_ITEM_ARROW 691 -#define IDS_ITEM_BED 692 -#define IDS_ITEM_BEEF_COOKED 693 -#define IDS_ITEM_BEEF_RAW 694 -#define IDS_ITEM_BLAZE_POWDER 695 -#define IDS_ITEM_BLAZE_ROD 696 -#define IDS_ITEM_BOAT 697 -#define IDS_ITEM_BONE 698 -#define IDS_ITEM_BOOK 699 -#define IDS_ITEM_BOOTS_CHAIN 700 -#define IDS_ITEM_BOOTS_CLOTH 701 -#define IDS_ITEM_BOOTS_DIAMOND 702 -#define IDS_ITEM_BOOTS_GOLD 703 -#define IDS_ITEM_BOOTS_IRON 704 -#define IDS_ITEM_BOW 705 -#define IDS_ITEM_BOWL 706 -#define IDS_ITEM_BREAD 707 -#define IDS_ITEM_BREWING_STAND 708 -#define IDS_ITEM_BRICK 709 -#define IDS_ITEM_BUCKET 710 -#define IDS_ITEM_BUCKET_LAVA 711 -#define IDS_ITEM_BUCKET_MILK 712 -#define IDS_ITEM_BUCKET_WATER 713 -#define IDS_ITEM_CAKE 714 -#define IDS_ITEM_CARROT_GOLDEN 715 -#define IDS_ITEM_CARROT_ON_A_STICK 716 -#define IDS_ITEM_CAULDRON 717 -#define IDS_ITEM_CHARCOAL 718 -#define IDS_ITEM_CHESTPLATE_CHAIN 719 -#define IDS_ITEM_CHESTPLATE_CLOTH 720 -#define IDS_ITEM_CHESTPLATE_DIAMOND 721 -#define IDS_ITEM_CHESTPLATE_GOLD 722 -#define IDS_ITEM_CHESTPLATE_IRON 723 -#define IDS_ITEM_CHICKEN_COOKED 724 -#define IDS_ITEM_CHICKEN_RAW 725 -#define IDS_ITEM_CLAY 726 -#define IDS_ITEM_CLOCK 727 -#define IDS_ITEM_COAL 728 -#define IDS_ITEM_COMPASS 729 -#define IDS_ITEM_COOKIE 730 -#define IDS_ITEM_DIAMOND 731 -#define IDS_ITEM_DIODE 732 -#define IDS_ITEM_DOOR_IRON 733 -#define IDS_ITEM_DOOR_WOOD 734 -#define IDS_ITEM_DYE_POWDER 735 -#define IDS_ITEM_DYE_POWDER_BLACK 736 -#define IDS_ITEM_DYE_POWDER_BLUE 737 -#define IDS_ITEM_DYE_POWDER_BROWN 738 -#define IDS_ITEM_DYE_POWDER_CYAN 739 -#define IDS_ITEM_DYE_POWDER_GRAY 740 -#define IDS_ITEM_DYE_POWDER_GREEN 741 -#define IDS_ITEM_DYE_POWDER_LIGHT_BLUE 742 -#define IDS_ITEM_DYE_POWDER_LIME 743 -#define IDS_ITEM_DYE_POWDER_MAGENTA 744 -#define IDS_ITEM_DYE_POWDER_ORANGE 745 -#define IDS_ITEM_DYE_POWDER_PINK 746 -#define IDS_ITEM_DYE_POWDER_PURPLE 747 -#define IDS_ITEM_DYE_POWDER_RED 748 -#define IDS_ITEM_DYE_POWDER_SILVER 749 -#define IDS_ITEM_DYE_POWDER_WHITE 750 -#define IDS_ITEM_DYE_POWDER_YELLOW 751 -#define IDS_ITEM_EGG 752 -#define IDS_ITEM_EMERALD 753 -#define IDS_ITEM_ENCHANTED_BOOK 754 -#define IDS_ITEM_ENDER_PEARL 755 -#define IDS_ITEM_EXP_BOTTLE 756 -#define IDS_ITEM_EYE_OF_ENDER 757 -#define IDS_ITEM_FEATHER 758 -#define IDS_ITEM_FERMENTED_SPIDER_EYE 759 -#define IDS_ITEM_FIREBALL 760 -#define IDS_ITEM_FIREBALLCHARCOAL 761 -#define IDS_ITEM_FIREBALLCOAL 762 -#define IDS_ITEM_FISH_COOKED 763 -#define IDS_ITEM_FISH_RAW 764 -#define IDS_ITEM_FISHING_ROD 765 -#define IDS_ITEM_FLINT 766 -#define IDS_ITEM_FLINT_AND_STEEL 767 -#define IDS_ITEM_GHAST_TEAR 768 -#define IDS_ITEM_GLASS_BOTTLE 769 -#define IDS_ITEM_GOLD_NUGGET 770 -#define IDS_ITEM_HATCHET_DIAMOND 771 -#define IDS_ITEM_HATCHET_GOLD 772 -#define IDS_ITEM_HATCHET_IRON 773 -#define IDS_ITEM_HATCHET_STONE 774 -#define IDS_ITEM_HATCHET_WOOD 775 -#define IDS_ITEM_HELMET_CHAIN 776 -#define IDS_ITEM_HELMET_CLOTH 777 -#define IDS_ITEM_HELMET_DIAMOND 778 -#define IDS_ITEM_HELMET_GOLD 779 -#define IDS_ITEM_HELMET_IRON 780 -#define IDS_ITEM_HOE_DIAMOND 781 -#define IDS_ITEM_HOE_GOLD 782 -#define IDS_ITEM_HOE_IRON 783 -#define IDS_ITEM_HOE_STONE 784 -#define IDS_ITEM_HOE_WOOD 785 -#define IDS_ITEM_INGOT_GOLD 786 -#define IDS_ITEM_INGOT_IRON 787 -#define IDS_ITEM_ITEMFRAME 788 -#define IDS_ITEM_LEATHER 789 -#define IDS_ITEM_LEGGINGS_CHAIN 790 -#define IDS_ITEM_LEGGINGS_CLOTH 791 -#define IDS_ITEM_LEGGINGS_DIAMOND 792 -#define IDS_ITEM_LEGGINGS_GOLD 793 -#define IDS_ITEM_LEGGINGS_IRON 794 -#define IDS_ITEM_MAGMA_CREAM 795 -#define IDS_ITEM_MAP 796 -#define IDS_ITEM_MELON_SEEDS 797 -#define IDS_ITEM_MELON_SLICE 798 -#define IDS_ITEM_MINECART 799 -#define IDS_ITEM_MINECART_CHEST 800 -#define IDS_ITEM_MINECART_FURNACE 801 -#define IDS_ITEM_MONSTER_SPAWNER 802 -#define IDS_ITEM_MUSHROOM_STEW 803 -#define IDS_ITEM_NETHER_QUARTZ 804 -#define IDS_ITEM_NETHER_STALK_SEEDS 805 -#define IDS_ITEM_NETHERBRICK 806 -#define IDS_ITEM_PAINTING 807 -#define IDS_ITEM_PAPER 808 -#define IDS_ITEM_PICKAXE_DIAMOND 809 -#define IDS_ITEM_PICKAXE_GOLD 810 -#define IDS_ITEM_PICKAXE_IRON 811 -#define IDS_ITEM_PICKAXE_STONE 812 -#define IDS_ITEM_PICKAXE_WOOD 813 -#define IDS_ITEM_PORKCHOP_COOKED 814 -#define IDS_ITEM_PORKCHOP_RAW 815 -#define IDS_ITEM_POTATO_BAKED 816 -#define IDS_ITEM_POTATO_POISONOUS 817 -#define IDS_ITEM_POTION 818 -#define IDS_ITEM_PUMPKIN_PIE 819 -#define IDS_ITEM_PUMPKIN_SEEDS 820 -#define IDS_ITEM_RECORD_01 821 -#define IDS_ITEM_RECORD_02 822 -#define IDS_ITEM_RECORD_03 823 -#define IDS_ITEM_RECORD_04 824 -#define IDS_ITEM_RECORD_05 825 -#define IDS_ITEM_RECORD_06 826 -#define IDS_ITEM_RECORD_07 827 -#define IDS_ITEM_RECORD_08 828 -#define IDS_ITEM_RECORD_09 829 -#define IDS_ITEM_RECORD_10 830 -#define IDS_ITEM_RECORD_11 831 -#define IDS_ITEM_RECORD_12 832 -#define IDS_ITEM_REDSTONE 833 -#define IDS_ITEM_REEDS 834 -#define IDS_ITEM_ROTTEN_FLESH 835 -#define IDS_ITEM_SADDLE 836 -#define IDS_ITEM_SHEARS 837 -#define IDS_ITEM_SHOVEL_DIAMOND 838 -#define IDS_ITEM_SHOVEL_GOLD 839 -#define IDS_ITEM_SHOVEL_IRON 840 -#define IDS_ITEM_SHOVEL_STONE 841 -#define IDS_ITEM_SHOVEL_WOOD 842 -#define IDS_ITEM_SIGN 843 -#define IDS_ITEM_SKULL 844 -#define IDS_ITEM_SKULL_CHARACTER 845 -#define IDS_ITEM_SKULL_CREEPER 846 -#define IDS_ITEM_SKULL_PLAYER 847 -#define IDS_ITEM_SKULL_SKELETON 848 -#define IDS_ITEM_SKULL_WITHER 849 -#define IDS_ITEM_SKULL_ZOMBIE 850 -#define IDS_ITEM_SLIMEBALL 851 -#define IDS_ITEM_SNOWBALL 852 -#define IDS_ITEM_SPECKLED_MELON 853 -#define IDS_ITEM_SPIDER_EYE 854 -#define IDS_ITEM_STICK 855 -#define IDS_ITEM_STRING 856 -#define IDS_ITEM_SUGAR 857 -#define IDS_ITEM_SULPHUR 858 -#define IDS_ITEM_SWORD_DIAMOND 859 -#define IDS_ITEM_SWORD_GOLD 860 -#define IDS_ITEM_SWORD_IRON 861 -#define IDS_ITEM_SWORD_STONE 862 -#define IDS_ITEM_SWORD_WOOD 863 -#define IDS_ITEM_WATER_BOTTLE 864 -#define IDS_ITEM_WHEAT 865 -#define IDS_ITEM_WHEAT_SEEDS 866 -#define IDS_ITEM_YELLOW_DUST 867 -#define IDS_JOIN_GAME 868 -#define IDS_KEYBOARDUI_SAVEGAME_TEXT 869 -#define IDS_KEYBOARDUI_SAVEGAME_TITLE 870 -#define IDS_KICK_PLAYER 871 -#define IDS_KICK_PLAYER_DESCRIPTION 872 -#define IDS_LABEL_DIFFICULTY 873 -#define IDS_LABEL_FIRE_SPREADS 874 -#define IDS_LABEL_GAME_TYPE 875 -#define IDS_LABEL_GAMERTAGS 876 -#define IDS_LABEL_LEVEL_TYPE 877 -#define IDS_LABEL_PvP 878 -#define IDS_LABEL_STRUCTURES 879 -#define IDS_LABEL_TNT 880 -#define IDS_LABEL_TRUST 881 -#define IDS_LAVA_SLIME 882 -#define IDS_LEADERBOARD_ENTRIES 883 -#define IDS_LEADERBOARD_FARMING_EASY 884 -#define IDS_LEADERBOARD_FARMING_HARD 885 -#define IDS_LEADERBOARD_FARMING_NORMAL 886 -#define IDS_LEADERBOARD_FARMING_PEACEFUL 887 -#define IDS_LEADERBOARD_FILTER 888 -#define IDS_LEADERBOARD_FILTER_FRIENDS 889 -#define IDS_LEADERBOARD_FILTER_MYSCORE 890 -#define IDS_LEADERBOARD_FILTER_OVERALL 891 -#define IDS_LEADERBOARD_GAMERTAG 892 -#define IDS_LEADERBOARD_KILLS_EASY 893 -#define IDS_LEADERBOARD_KILLS_HARD 894 -#define IDS_LEADERBOARD_KILLS_NORMAL 895 -#define IDS_LEADERBOARD_LOADING 896 -#define IDS_LEADERBOARD_MINING_BLOCKS_EASY 897 -#define IDS_LEADERBOARD_MINING_BLOCKS_HARD 898 -#define IDS_LEADERBOARD_MINING_BLOCKS_NORMAL 899 -#define IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL 900 -#define IDS_LEADERBOARD_NORESULTS 901 -#define IDS_LEADERBOARD_RANK 902 -#define IDS_LEADERBOARD_TRAVELLING_EASY 903 -#define IDS_LEADERBOARD_TRAVELLING_HARD 904 -#define IDS_LEADERBOARD_TRAVELLING_NORMAL 905 -#define IDS_LEADERBOARD_TRAVELLING_PEACEFUL 906 -#define IDS_LEADERBOARDS 907 -#define IDS_LEVELTYPE_NORMAL 908 -#define IDS_LEVELTYPE_SUPERFLAT 909 -#define IDS_LOAD 910 -#define IDS_LOAD_SAVED_WORLD 911 -#define IDS_MAX_BOATS 912 -#define IDS_MAX_CHICKENS_BRED 913 -#define IDS_MAX_CHICKENS_SPAWNED 914 -#define IDS_MAX_ENEMIES_SPAWNED 915 -#define IDS_MAX_HANGINGENTITIES 916 -#define IDS_MAX_MOOSHROOMS_SPAWNED 917 -#define IDS_MAX_MUSHROOMCOWS_BRED 918 -#define IDS_MAX_PIGS_SHEEP_COWS_CATS_BRED 919 -#define IDS_MAX_PIGS_SHEEP_COWS_CATS_SPAWNED 920 -#define IDS_MAX_SKULL_TILES 921 -#define IDS_MAX_SQUID_SPAWNED 922 -#define IDS_MAX_VILLAGERS_SPAWNED 923 -#define IDS_MAX_WOLVES_BRED 924 -#define IDS_MAX_WOLVES_SPAWNED 925 -#define IDS_MINUTES 926 -#define IDS_MODERATOR 927 -#define IDS_MORE_OPTIONS 928 -#define IDS_MULTIPLAYER_FULL_TEXT 929 -#define IDS_MULTIPLAYER_FULL_TITLE 930 -#define IDS_MUSHROOM_COW 931 -#define IDS_MUST_SIGN_IN_TEXT 932 -#define IDS_MUST_SIGN_IN_TITLE 933 -#define IDS_NAME_CAPTION 934 -#define IDS_NAME_CAPTION_TEXT 935 -#define IDS_NAME_DESC 936 -#define IDS_NAME_DESC_TEXT 937 -#define IDS_NAME_TITLE 938 -#define IDS_NAME_TITLE_TEXT 939 -#define IDS_NAME_WORLD 940 -#define IDS_NAME_WORLD_TEXT 941 -#define IDS_NO 942 -#define IDS_NO_DLCOFFERS 943 -#define IDS_NO_GAMES_FOUND 944 -#define IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT 945 -#define IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT 946 -#define IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE 947 -#define IDS_NO_SKIN_PACK 948 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL 949 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE 950 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE 951 -#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL 952 -#define IDS_NODEVICE_ACCEPT 953 -#define IDS_NODEVICE_DECLINE 954 -#define IDS_NODEVICE_TEXT 955 -#define IDS_NODEVICE_TITLE 956 -#define IDS_NOFREESPACE_TEXT 957 -#define IDS_NOFREESPACE_TITLE 958 -#define IDS_NOTALLOWED_FRIENDSOFFRIENDS 959 -#define IDS_NOWPLAYING 960 -#define IDS_NULL 961 -#define IDS_OFF 962 -#define IDS_OK 963 -#define IDS_ON 964 -#define IDS_ONLINE_GAME 965 -#define IDS_OPTIONS 966 -#define IDS_OVERWRITESAVE_NO 967 -#define IDS_OVERWRITESAVE_TEXT 968 -#define IDS_OVERWRITESAVE_TITLE 969 -#define IDS_OVERWRITESAVE_YES 970 -#define IDS_OZELOT 971 -#define IDS_PIG 972 -#define IDS_PIGZOMBIE 973 -#define IDS_PLATFORM_NAME 974 -#define IDS_PLAY_GAME 975 -#define IDS_PLAY_TUTORIAL 976 -#define IDS_PLAYER_BANNED_LEVEL 977 -#define IDS_PLAYER_ENTERED_END 978 -#define IDS_PLAYER_JOINED 979 -#define IDS_PLAYER_KICKED 980 -#define IDS_PLAYER_LEFT 981 -#define IDS_PLAYER_LEFT_END 982 -#define IDS_PLAYER_VS_PLAYER 983 -#define IDS_PLAYERS 984 -#define IDS_PLAYERS_INVITE 985 -#define IDS_PLAYWITHOUTSAVING 986 -#define IDS_POTATO 987 -#define IDS_POTION_BLINDNESS 988 -#define IDS_POTION_BLINDNESS_POSTFIX 989 -#define IDS_POTION_CONFUSION 990 -#define IDS_POTION_CONFUSION_POSTFIX 991 -#define IDS_POTION_DAMAGEBOOST 992 -#define IDS_POTION_DAMAGEBOOST_POSTFIX 993 -#define IDS_POTION_DESC_DAMAGEBOOST 994 -#define IDS_POTION_DESC_EMPTY 995 -#define IDS_POTION_DESC_FIRERESISTANCE 996 -#define IDS_POTION_DESC_HARM 997 -#define IDS_POTION_DESC_HEAL 998 -#define IDS_POTION_DESC_INVISIBILITY 999 -#define IDS_POTION_DESC_MOVESLOWDOWN 1000 -#define IDS_POTION_DESC_MOVESPEED 1001 -#define IDS_POTION_DESC_NIGHTVISION 1002 -#define IDS_POTION_DESC_POISON 1003 -#define IDS_POTION_DESC_REGENERATION 1004 -#define IDS_POTION_DESC_WATER_BOTTLE 1005 -#define IDS_POTION_DESC_WEAKNESS 1006 -#define IDS_POTION_DIGSLOWDOWN 1007 -#define IDS_POTION_DIGSLOWDOWN_POSTFIX 1008 -#define IDS_POTION_DIGSPEED 1009 -#define IDS_POTION_DIGSPEED_POSTFIX 1010 -#define IDS_POTION_EMPTY 1011 -#define IDS_POTION_FIRERESISTANCE 1012 -#define IDS_POTION_FIRERESISTANCE_POSTFIX 1013 -#define IDS_POTION_HARM 1014 -#define IDS_POTION_HARM_POSTFIX 1015 -#define IDS_POTION_HEAL 1016 -#define IDS_POTION_HEAL_POSTFIX 1017 -#define IDS_POTION_HUNGER 1018 -#define IDS_POTION_HUNGER_POSTFIX 1019 -#define IDS_POTION_INVISIBILITY 1020 -#define IDS_POTION_INVISIBILITY_POSTFIX 1021 -#define IDS_POTION_JUMP 1022 -#define IDS_POTION_JUMP_POSTFIX 1023 -#define IDS_POTION_MOVESLOWDOWN 1024 -#define IDS_POTION_MOVESLOWDOWN_POSTFIX 1025 -#define IDS_POTION_MOVESPEED 1026 -#define IDS_POTION_MOVESPEED_POSTFIX 1027 -#define IDS_POTION_NIGHTVISION 1028 -#define IDS_POTION_NIGHTVISION_POSTFIX 1029 -#define IDS_POTION_POISON 1030 -#define IDS_POTION_POISON_POSTFIX 1031 -#define IDS_POTION_POTENCY_0 1032 -#define IDS_POTION_POTENCY_1 1033 -#define IDS_POTION_POTENCY_2 1034 -#define IDS_POTION_POTENCY_3 1035 -#define IDS_POTION_PREFIX_ACRID 1036 -#define IDS_POTION_PREFIX_ARTLESS 1037 -#define IDS_POTION_PREFIX_AWKWARD 1038 -#define IDS_POTION_PREFIX_BLAND 1039 -#define IDS_POTION_PREFIX_BULKY 1040 -#define IDS_POTION_PREFIX_BUNGLING 1041 -#define IDS_POTION_PREFIX_BUTTERED 1042 -#define IDS_POTION_PREFIX_CHARMING 1043 -#define IDS_POTION_PREFIX_CLEAR 1044 -#define IDS_POTION_PREFIX_CORDIAL 1045 -#define IDS_POTION_PREFIX_DASHING 1046 -#define IDS_POTION_PREFIX_DEBONAIR 1047 -#define IDS_POTION_PREFIX_DIFFUSE 1048 -#define IDS_POTION_PREFIX_ELEGANT 1049 -#define IDS_POTION_PREFIX_FANCY 1050 -#define IDS_POTION_PREFIX_FLAT 1051 -#define IDS_POTION_PREFIX_FOUL 1052 -#define IDS_POTION_PREFIX_GRENADE 1053 -#define IDS_POTION_PREFIX_GROSS 1054 -#define IDS_POTION_PREFIX_HARSH 1055 -#define IDS_POTION_PREFIX_MILKY 1056 -#define IDS_POTION_PREFIX_MUNDANE 1057 -#define IDS_POTION_PREFIX_ODORLESS 1058 -#define IDS_POTION_PREFIX_POTENT 1059 -#define IDS_POTION_PREFIX_RANK 1060 -#define IDS_POTION_PREFIX_REFINED 1061 -#define IDS_POTION_PREFIX_SMOOTH 1062 -#define IDS_POTION_PREFIX_SPARKLING 1063 -#define IDS_POTION_PREFIX_STINKY 1064 -#define IDS_POTION_PREFIX_SUAVE 1065 -#define IDS_POTION_PREFIX_THICK 1066 -#define IDS_POTION_PREFIX_THIN 1067 -#define IDS_POTION_PREFIX_UNINTERESTING 1068 -#define IDS_POTION_REGENERATION 1069 -#define IDS_POTION_REGENERATION_POSTFIX 1070 -#define IDS_POTION_RESISTANCE 1071 -#define IDS_POTION_RESISTANCE_POSTFIX 1072 -#define IDS_POTION_WATERBREATHING 1073 -#define IDS_POTION_WATERBREATHING_POSTFIX 1074 -#define IDS_POTION_WEAKNESS 1075 -#define IDS_POTION_WEAKNESS_POSTFIX 1076 -#define IDS_PRESS_START_TO_JOIN 1077 -#define IDS_PRIV_ATTACK_ANIMAL_TOGGLE_OFF 1078 -#define IDS_PRIV_ATTACK_ANIMAL_TOGGLE_ON 1079 -#define IDS_PRIV_ATTACK_MOB_TOGGLE_OFF 1080 -#define IDS_PRIV_ATTACK_MOB_TOGGLE_ON 1081 -#define IDS_PRIV_ATTACK_PLAYER_TOGGLE_OFF 1082 -#define IDS_PRIV_ATTACK_PLAYER_TOGGLE_ON 1083 -#define IDS_PRIV_BUILD_TOGGLE_OFF 1084 -#define IDS_PRIV_BUILD_TOGGLE_ON 1085 -#define IDS_PRIV_CAN_EXHAUSTION_TOGGLE_OFF 1086 -#define IDS_PRIV_CAN_EXHAUSTION_TOGGLE_ON 1087 -#define IDS_PRIV_CAN_FLY_TOGGLE_OFF 1088 -#define IDS_PRIV_CAN_FLY_TOGGLE_ON 1089 -#define IDS_PRIV_CAN_INVISIBLE_TOGGLE_OFF 1090 -#define IDS_PRIV_CAN_INVISIBLE_TOGGLE_ON 1091 -#define IDS_PRIV_CAN_TELEPORT_TOGGLE_OFF 1092 -#define IDS_PRIV_CAN_TELEPORT_TOGGLE_ON 1093 -#define IDS_PRIV_EXHAUSTION_TOGGLE_OFF 1094 -#define IDS_PRIV_EXHAUSTION_TOGGLE_ON 1095 -#define IDS_PRIV_FLY_TOGGLE_OFF 1096 -#define IDS_PRIV_FLY_TOGGLE_ON 1097 -#define IDS_PRIV_INVISIBLE_TOGGLE_OFF 1098 -#define IDS_PRIV_INVISIBLE_TOGGLE_ON 1099 -#define IDS_PRIV_INVULNERABLE_TOGGLE_OFF 1100 -#define IDS_PRIV_INVULNERABLE_TOGGLE_ON 1101 -#define IDS_PRIV_MINE_TOGGLE_OFF 1102 -#define IDS_PRIV_MINE_TOGGLE_ON 1103 -#define IDS_PRIV_MODERATOR_TOGGLE_OFF 1104 -#define IDS_PRIV_MODERATOR_TOGGLE_ON 1105 -#define IDS_PRIV_USE_CONTAINERS_TOGGLE_OFF 1106 -#define IDS_PRIV_USE_CONTAINERS_TOGGLE_ON 1107 -#define IDS_PRIV_USE_DOORS_TOGGLE_OFF 1108 -#define IDS_PRIV_USE_DOORS_TOGGLE_ON 1109 -#define IDS_PRO_ACHIEVEMENTPROBLEM_TEXT 1110 -#define IDS_PRO_ACHIEVEMENTPROBLEM_TITLE 1111 -#define IDS_PRO_GUESTPROFILE_TEXT 1112 -#define IDS_PRO_GUESTPROFILE_TITLE 1113 -#define IDS_PRO_NOPROFILE_TITLE 1114 -#define IDS_PRO_NOPROFILEOPTIONS_TEXT 1115 -#define IDS_PRO_NOTONLINE_ACCEPT 1116 -#define IDS_PRO_NOTONLINE_DECLINE 1117 -#define IDS_PRO_NOTONLINE_TEXT 1118 -#define IDS_PRO_NOTONLINE_TITLE 1119 -#define IDS_PRO_PROFILEPROBLEM_TEXT 1120 -#define IDS_PRO_RETURNEDTOMENU_ACCEPT 1121 -#define IDS_PRO_RETURNEDTOMENU_TEXT 1122 -#define IDS_PRO_RETURNEDTOMENU_TITLE 1123 -#define IDS_PRO_RETURNEDTOTITLESCREEN_TEXT 1124 -#define IDS_PRO_UNLOCKGAME_TEXT 1125 -#define IDS_PRO_UNLOCKGAME_TITLE 1126 -#define IDS_PRO_XBOXLIVE_NOTIFICATION 1127 -#define IDS_PROGRESS_AUTOSAVING_LEVEL 1128 -#define IDS_PROGRESS_BUILDING_TERRAIN 1129 -#define IDS_PROGRESS_CONNECTING 1130 -#define IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME 1131 -#define IDS_PROGRESS_DOWNLOADING_TERRAIN 1132 -#define IDS_PROGRESS_ENTERING_END 1133 -#define IDS_PROGRESS_ENTERING_NETHER 1134 -#define IDS_PROGRESS_GENERATING_LEVEL 1135 -#define IDS_PROGRESS_GENERATING_SPAWN_AREA 1136 -#define IDS_PROGRESS_HOST_SAVING 1137 -#define IDS_PROGRESS_INITIALISING_SERVER 1138 -#define IDS_PROGRESS_LEAVING_END 1139 -#define IDS_PROGRESS_LEAVING_NETHER 1140 -#define IDS_PROGRESS_LOADING_LEVEL 1141 -#define IDS_PROGRESS_LOADING_SPAWN_AREA 1142 -#define IDS_PROGRESS_NEW_WORLD_SEED 1143 -#define IDS_PROGRESS_RESPAWNING 1144 -#define IDS_PROGRESS_SAVING_CHUNKS 1145 -#define IDS_PROGRESS_SAVING_LEVEL 1146 -#define IDS_PROGRESS_SAVING_PLAYERS 1147 -#define IDS_PROGRESS_SAVING_TO_DISC 1148 -#define IDS_PROGRESS_SIMULATING_WORLD 1149 -#define IDS_REINSTALL_AVATAR_ITEM_1 1150 -#define IDS_REINSTALL_AVATAR_ITEM_2 1151 -#define IDS_REINSTALL_AVATAR_ITEM_3 1152 -#define IDS_REINSTALL_CONTENT 1153 -#define IDS_REINSTALL_GAMERPIC_1 1154 -#define IDS_REINSTALL_GAMERPIC_2 1155 -#define IDS_REINSTALL_THEME 1156 -#define IDS_RENAME_WORLD_TEXT 1157 -#define IDS_RENAME_WORLD_TITLE 1158 -#define IDS_REPAIR_AND_NAME 1159 -#define IDS_REPAIR_COST 1160 -#define IDS_REPAIR_EXPENSIVE 1161 -#define IDS_REQUIRED_ITEMS_FOR_TRADE 1162 -#define IDS_RESET_NETHER 1163 -#define IDS_RESET_TO_DEFAULTS 1164 -#define IDS_RESETNETHER_TEXT 1165 -#define IDS_RESETNETHER_TITLE 1166 -#define IDS_RESPAWN 1167 -#define IDS_RESUME_GAME 1168 -#define IDS_RETURNEDTOMENU_TITLE 1169 -#define IDS_RETURNEDTOTITLESCREEN_TEXT 1170 -#define IDS_SAVE_GAME 1171 -#define IDS_SAVE_ICON_MESSAGE 1172 -#define IDS_SEED 1173 -#define IDS_SELECTAGAIN 1174 -#define IDS_SELECTANEWDEVICE 1175 -#define IDS_SELECTED 1176 -#define IDS_SELECTED_SKIN 1177 -#define IDS_SETTINGS 1178 -#define IDS_SHEEP 1179 -#define IDS_SIGN_TITLE 1180 -#define IDS_SIGN_TITLE_TEXT 1181 -#define IDS_SILVERFISH 1182 -#define IDS_SKELETON 1183 -#define IDS_SKINS 1184 -#define IDS_SLIDER_AUTOSAVE 1185 -#define IDS_SLIDER_AUTOSAVE_OFF 1186 -#define IDS_SLIDER_DIFFICULTY 1187 -#define IDS_SLIDER_GAMMA 1188 -#define IDS_SLIDER_INTERFACEOPACITY 1189 -#define IDS_SLIDER_MUSIC 1190 -#define IDS_SLIDER_SENSITIVITY_INGAME 1191 -#define IDS_SLIDER_SENSITIVITY_INMENU 1192 -#define IDS_SLIDER_SOUND 1193 -#define IDS_SLIDER_UISIZE 1194 -#define IDS_SLIDER_UISIZESPLITSCREEN 1195 -#define IDS_SLIME 1196 -#define IDS_SNOWMAN 1197 -#define IDS_SOCIAL_DEFAULT_CAPTION 1198 -#define IDS_SOCIAL_DEFAULT_DESCRIPTION 1199 -#define IDS_SOCIAL_LABEL_CAPTION 1200 -#define IDS_SOCIAL_LABEL_DESCRIPTION 1201 -#define IDS_SOCIAL_TEXT 1202 -#define IDS_SOUTHPAW 1203 -#define IDS_SPIDER 1204 -#define IDS_SQUID 1205 -#define IDS_START_GAME 1206 -#define IDS_STO_SAVING_LONG 1207 -#define IDS_STO_SAVING_SHORT 1208 -#define IDS_STORAGEDEVICEPROBLEM_TITLE 1209 -#define IDS_STRINGVERIFY_AWAITING_APPROVAL 1210 -#define IDS_STRINGVERIFY_CENSORED 1211 -#define IDS_SUPERFLAT_WORLD 1212 -#define IDS_SURVIVAL 1213 -#define IDS_TELEPORT 1214 -#define IDS_TELEPORT_TO_ME 1215 -#define IDS_TELEPORT_TO_PLAYER 1216 -#define IDS_TEXT_DELETE_SAVE 1217 -#define IDS_TEXT_SAVEOPTIONS 1218 -#define IDS_TEXTURE_PACK_TRIALVERSION 1219 -#define IDS_TEXTUREPACK_FULLVERSION 1220 -#define IDS_THEMES 1221 -#define IDS_TILE_ANVIL 1222 -#define IDS_TILE_ANVIL_INTACT 1223 -#define IDS_TILE_ANVIL_SLIGHTLYDAMAGED 1224 -#define IDS_TILE_ANVIL_VERYDAMAGED 1225 -#define IDS_TILE_BED 1226 -#define IDS_TILE_BED_MESLEEP 1227 -#define IDS_TILE_BED_NO_SLEEP 1228 -#define IDS_TILE_BED_NOT_VALID 1229 -#define IDS_TILE_BED_NOTSAFE 1230 -#define IDS_TILE_BED_OCCUPIED 1231 -#define IDS_TILE_BED_PLAYERSLEEP 1232 -#define IDS_TILE_BEDROCK 1233 -#define IDS_TILE_BIRCH 1234 -#define IDS_TILE_BIRCHWOOD_PLANKS 1235 -#define IDS_TILE_BLOCK_DIAMOND 1236 -#define IDS_TILE_BLOCK_GOLD 1237 -#define IDS_TILE_BLOCK_IRON 1238 -#define IDS_TILE_BLOCK_LAPIS 1239 -#define IDS_TILE_BOOKSHELF 1240 -#define IDS_TILE_BREWINGSTAND 1241 -#define IDS_TILE_BRICK 1242 -#define IDS_TILE_BUTTON 1243 -#define IDS_TILE_CACTUS 1244 -#define IDS_TILE_CAKE 1245 -#define IDS_TILE_CARPET 1246 -#define IDS_TILE_CARPET_BLACK 1247 -#define IDS_TILE_CARPET_BLUE 1248 -#define IDS_TILE_CARPET_BROWN 1249 -#define IDS_TILE_CARPET_CYAN 1250 -#define IDS_TILE_CARPET_GRAY 1251 -#define IDS_TILE_CARPET_GREEN 1252 -#define IDS_TILE_CARPET_LIGHT_BLUE 1253 -#define IDS_TILE_CARPET_LIME 1254 -#define IDS_TILE_CARPET_MAGENTA 1255 -#define IDS_TILE_CARPET_ORANGE 1256 -#define IDS_TILE_CARPET_PINK 1257 -#define IDS_TILE_CARPET_PURPLE 1258 -#define IDS_TILE_CARPET_RED 1259 -#define IDS_TILE_CARPET_SILVER 1260 -#define IDS_TILE_CARPET_WHITE 1261 -#define IDS_TILE_CARPET_YELLOW 1262 -#define IDS_TILE_CARROTS 1263 -#define IDS_TILE_CAULDRON 1264 -#define IDS_TILE_CHEST 1265 -#define IDS_TILE_CLAY 1266 -#define IDS_TILE_CLOTH 1267 -#define IDS_TILE_CLOTH_BLACK 1268 -#define IDS_TILE_CLOTH_BLUE 1269 -#define IDS_TILE_CLOTH_BROWN 1270 -#define IDS_TILE_CLOTH_CYAN 1271 -#define IDS_TILE_CLOTH_GRAY 1272 -#define IDS_TILE_CLOTH_GREEN 1273 -#define IDS_TILE_CLOTH_LIGHT_BLUE 1274 -#define IDS_TILE_CLOTH_LIME 1275 -#define IDS_TILE_CLOTH_MAGENTA 1276 -#define IDS_TILE_CLOTH_ORANGE 1277 -#define IDS_TILE_CLOTH_PINK 1278 -#define IDS_TILE_CLOTH_PURPLE 1279 -#define IDS_TILE_CLOTH_RED 1280 -#define IDS_TILE_CLOTH_SILVER 1281 -#define IDS_TILE_CLOTH_WHITE 1282 -#define IDS_TILE_CLOTH_YELLOW 1283 -#define IDS_TILE_COBBLESTONE_WALL 1284 -#define IDS_TILE_COBBLESTONE_WALL_MOSSY 1285 -#define IDS_TILE_COCOA 1286 -#define IDS_TILE_CROPS 1287 -#define IDS_TILE_DEAD_BUSH 1288 -#define IDS_TILE_DETECTOR_RAIL 1289 -#define IDS_TILE_DIODE 1290 -#define IDS_TILE_DIRT 1291 -#define IDS_TILE_DISPENSER 1292 -#define IDS_TILE_DOOR_IRON 1293 -#define IDS_TILE_DOOR_WOOD 1294 -#define IDS_TILE_DRAGONEGG 1295 -#define IDS_TILE_EMERALDBLOCK 1296 -#define IDS_TILE_EMERALDORE 1297 -#define IDS_TILE_ENCHANTMENTTABLE 1298 -#define IDS_TILE_END_PORTAL 1299 -#define IDS_TILE_ENDERCHEST 1300 -#define IDS_TILE_ENDPORTALFRAME 1301 -#define IDS_TILE_FARMLAND 1302 -#define IDS_TILE_FENCE 1303 -#define IDS_TILE_FENCE_GATE 1304 -#define IDS_TILE_FERN 1305 -#define IDS_TILE_FIRE 1306 -#define IDS_TILE_FLOWER 1307 -#define IDS_TILE_FLOWERPOT 1308 -#define IDS_TILE_FURNACE 1309 -#define IDS_TILE_GLASS 1310 -#define IDS_TILE_GOLDEN_RAIL 1311 -#define IDS_TILE_GRASS 1312 -#define IDS_TILE_GRAVEL 1313 -#define IDS_TILE_HELL_ROCK 1314 -#define IDS_TILE_HELL_SAND 1315 -#define IDS_TILE_HUGE_MUSHROOM_1 1316 -#define IDS_TILE_HUGE_MUSHROOM_2 1317 -#define IDS_TILE_ICE 1318 -#define IDS_TILE_IRON_FENCE 1319 -#define IDS_TILE_JUKEBOX 1320 -#define IDS_TILE_JUNGLE_PLANKS 1321 -#define IDS_TILE_LADDER 1322 -#define IDS_TILE_LAVA 1323 -#define IDS_TILE_LEAVES 1324 -#define IDS_TILE_LEAVES_BIRCH 1325 -#define IDS_TILE_LEAVES_JUNGLE 1326 -#define IDS_TILE_LEAVES_OAK 1327 -#define IDS_TILE_LEAVES_SPRUCE 1328 -#define IDS_TILE_LEVER 1329 -#define IDS_TILE_LIGHT_GEM 1330 -#define IDS_TILE_LIT_PUMPKIN 1331 -#define IDS_TILE_LOCKED_CHEST 1332 -#define IDS_TILE_LOG 1333 -#define IDS_TILE_LOG_BIRCH 1334 -#define IDS_TILE_LOG_JUNGLE 1335 -#define IDS_TILE_LOG_OAK 1336 -#define IDS_TILE_LOG_SPRUCE 1337 -#define IDS_TILE_MELON 1338 -#define IDS_TILE_MELON_STEM 1339 -#define IDS_TILE_MOB_SPAWNER 1340 -#define IDS_TILE_MONSTER_STONE_EGG 1341 -#define IDS_TILE_MUSHROOM 1342 -#define IDS_TILE_MUSIC_BLOCK 1343 -#define IDS_TILE_MYCEL 1344 -#define IDS_TILE_NETHER_QUARTZ 1345 -#define IDS_TILE_NETHERBRICK 1346 -#define IDS_TILE_NETHERFENCE 1347 -#define IDS_TILE_NETHERSTALK 1348 -#define IDS_TILE_NOT_GATE 1349 -#define IDS_TILE_OAK 1350 -#define IDS_TILE_OAKWOOD_PLANKS 1351 -#define IDS_TILE_OBSIDIAN 1352 -#define IDS_TILE_ORE_COAL 1353 -#define IDS_TILE_ORE_DIAMOND 1354 -#define IDS_TILE_ORE_GOLD 1355 -#define IDS_TILE_ORE_IRON 1356 -#define IDS_TILE_ORE_LAPIS 1357 -#define IDS_TILE_ORE_REDSTONE 1358 -#define IDS_TILE_PISTON_BASE 1359 -#define IDS_TILE_PISTON_STICK_BASE 1360 -#define IDS_TILE_PORTAL 1361 -#define IDS_TILE_POTATOES 1362 -#define IDS_TILE_PRESSURE_PLATE 1363 -#define IDS_TILE_PUMPKIN 1364 -#define IDS_TILE_PUMPKIN_STEM 1365 -#define IDS_TILE_QUARTZ_BLOCK 1366 -#define IDS_TILE_QUARTZ_BLOCK_CHISELED 1367 -#define IDS_TILE_QUARTZ_BLOCK_LINES 1368 -#define IDS_TILE_RAIL 1369 -#define IDS_TILE_REDSTONE_DUST 1370 -#define IDS_TILE_REDSTONE_LIGHT 1371 -#define IDS_TILE_REEDS 1372 -#define IDS_TILE_ROSE 1373 -#define IDS_TILE_SAND 1374 -#define IDS_TILE_SANDSTONE 1375 -#define IDS_TILE_SANDSTONE_CHISELED 1376 -#define IDS_TILE_SANDSTONE_SMOOTH 1377 -#define IDS_TILE_SAPLING 1378 -#define IDS_TILE_SAPLING_BIRCH 1379 -#define IDS_TILE_SAPLING_JUNGLE 1380 -#define IDS_TILE_SAPLING_OAK 1381 -#define IDS_TILE_SAPLING_SPRUCE 1382 -#define IDS_TILE_SHRUB 1383 -#define IDS_TILE_SIGN 1384 -#define IDS_TILE_SKULL 1385 -#define IDS_TILE_SNOW 1386 -#define IDS_TILE_SPONGE 1387 -#define IDS_TILE_SPRUCE 1388 -#define IDS_TILE_SPRUCEWOOD_PLANKS 1389 -#define IDS_TILE_STAIRS_BIRCHWOOD 1390 -#define IDS_TILE_STAIRS_BRICKS 1391 -#define IDS_TILE_STAIRS_JUNGLEWOOD 1392 -#define IDS_TILE_STAIRS_NETHERBRICK 1393 -#define IDS_TILE_STAIRS_QUARTZ 1394 -#define IDS_TILE_STAIRS_SANDSTONE 1395 -#define IDS_TILE_STAIRS_SPRUCEWOOD 1396 -#define IDS_TILE_STAIRS_STONE 1397 -#define IDS_TILE_STAIRS_STONE_BRICKS_SMOOTH 1398 -#define IDS_TILE_STAIRS_WOOD 1399 -#define IDS_TILE_STONE 1400 -#define IDS_TILE_STONE_BRICK 1401 -#define IDS_TILE_STONE_BRICK_SMOOTH 1402 -#define IDS_TILE_STONE_BRICK_SMOOTH_CHISELED 1403 -#define IDS_TILE_STONE_BRICK_SMOOTH_CRACKED 1404 -#define IDS_TILE_STONE_BRICK_SMOOTH_MOSSY 1405 -#define IDS_TILE_STONE_MOSS 1406 -#define IDS_TILE_STONE_SILVERFISH 1407 -#define IDS_TILE_STONE_SILVERFISH_COBBLESTONE 1408 -#define IDS_TILE_STONE_SILVERFISH_STONE_BRICK 1409 -#define IDS_TILE_STONESLAB 1410 -#define IDS_TILE_STONESLAB_BIRCH 1411 -#define IDS_TILE_STONESLAB_BRICK 1412 -#define IDS_TILE_STONESLAB_COBBLE 1413 -#define IDS_TILE_STONESLAB_JUNGLE 1414 -#define IDS_TILE_STONESLAB_NETHERBRICK 1415 -#define IDS_TILE_STONESLAB_OAK 1416 -#define IDS_TILE_STONESLAB_QUARTZ 1417 -#define IDS_TILE_STONESLAB_SAND 1418 -#define IDS_TILE_STONESLAB_SMOOTHBRICK 1419 -#define IDS_TILE_STONESLAB_SPRUCE 1420 -#define IDS_TILE_STONESLAB_STONE 1421 -#define IDS_TILE_STONESLAB_WOOD 1422 -#define IDS_TILE_TALL_GRASS 1423 -#define IDS_TILE_THIN_GLASS 1424 -#define IDS_TILE_TNT 1425 -#define IDS_TILE_TORCH 1426 -#define IDS_TILE_TORCHCHARCOAL 1427 -#define IDS_TILE_TORCHCOAL 1428 -#define IDS_TILE_TRAPDOOR 1429 -#define IDS_TILE_TRIPWIRE 1430 -#define IDS_TILE_TRIPWIRE_SOURCE 1431 -#define IDS_TILE_VINE 1432 -#define IDS_TILE_WATER 1433 -#define IDS_TILE_WATERLILY 1434 -#define IDS_TILE_WEB 1435 -#define IDS_TILE_WHITESTONE 1436 -#define IDS_TILE_WORKBENCH 1437 -#define IDS_TIPS_GAMETIP_0 1438 -#define IDS_TIPS_GAMETIP_1 1439 -#define IDS_TIPS_GAMETIP_10 1440 -#define IDS_TIPS_GAMETIP_11 1441 -#define IDS_TIPS_GAMETIP_12 1442 -#define IDS_TIPS_GAMETIP_13 1443 -#define IDS_TIPS_GAMETIP_14 1444 -#define IDS_TIPS_GAMETIP_15 1445 -#define IDS_TIPS_GAMETIP_16 1446 -#define IDS_TIPS_GAMETIP_17 1447 -#define IDS_TIPS_GAMETIP_18 1448 -#define IDS_TIPS_GAMETIP_19 1449 -#define IDS_TIPS_GAMETIP_2 1450 -#define IDS_TIPS_GAMETIP_20 1451 -#define IDS_TIPS_GAMETIP_21 1452 -#define IDS_TIPS_GAMETIP_22 1453 -#define IDS_TIPS_GAMETIP_23 1454 -#define IDS_TIPS_GAMETIP_24 1455 -#define IDS_TIPS_GAMETIP_25 1456 -#define IDS_TIPS_GAMETIP_26 1457 -#define IDS_TIPS_GAMETIP_27 1458 -#define IDS_TIPS_GAMETIP_28 1459 -#define IDS_TIPS_GAMETIP_29 1460 -#define IDS_TIPS_GAMETIP_3 1461 -#define IDS_TIPS_GAMETIP_30 1462 -#define IDS_TIPS_GAMETIP_31 1463 -#define IDS_TIPS_GAMETIP_32 1464 -#define IDS_TIPS_GAMETIP_33 1465 -#define IDS_TIPS_GAMETIP_34 1466 -#define IDS_TIPS_GAMETIP_35 1467 -#define IDS_TIPS_GAMETIP_36 1468 -#define IDS_TIPS_GAMETIP_37 1469 -#define IDS_TIPS_GAMETIP_38 1470 -#define IDS_TIPS_GAMETIP_39 1471 -#define IDS_TIPS_GAMETIP_4 1472 -#define IDS_TIPS_GAMETIP_40 1473 -#define IDS_TIPS_GAMETIP_41 1474 -#define IDS_TIPS_GAMETIP_42 1475 -#define IDS_TIPS_GAMETIP_43 1476 -#define IDS_TIPS_GAMETIP_44 1477 -#define IDS_TIPS_GAMETIP_45 1478 -#define IDS_TIPS_GAMETIP_46 1479 -#define IDS_TIPS_GAMETIP_47 1480 -#define IDS_TIPS_GAMETIP_48 1481 -#define IDS_TIPS_GAMETIP_49 1482 -#define IDS_TIPS_GAMETIP_5 1483 -#define IDS_TIPS_GAMETIP_50 1484 -#define IDS_TIPS_GAMETIP_6 1485 -#define IDS_TIPS_GAMETIP_7 1486 -#define IDS_TIPS_GAMETIP_8 1487 -#define IDS_TIPS_GAMETIP_9 1488 -#define IDS_TIPS_GAMETIP_NEWDLC 1489 -#define IDS_TIPS_GAMETIP_SKINPACKS 1490 -#define IDS_TIPS_TRIVIA_1 1491 -#define IDS_TIPS_TRIVIA_10 1492 -#define IDS_TIPS_TRIVIA_11 1493 -#define IDS_TIPS_TRIVIA_12 1494 -#define IDS_TIPS_TRIVIA_13 1495 -#define IDS_TIPS_TRIVIA_14 1496 -#define IDS_TIPS_TRIVIA_15 1497 -#define IDS_TIPS_TRIVIA_16 1498 -#define IDS_TIPS_TRIVIA_17 1499 -#define IDS_TIPS_TRIVIA_18 1500 -#define IDS_TIPS_TRIVIA_19 1501 -#define IDS_TIPS_TRIVIA_2 1502 -#define IDS_TIPS_TRIVIA_20 1503 -#define IDS_TIPS_TRIVIA_3 1504 -#define IDS_TIPS_TRIVIA_4 1505 -#define IDS_TIPS_TRIVIA_5 1506 -#define IDS_TIPS_TRIVIA_6 1507 -#define IDS_TIPS_TRIVIA_7 1508 -#define IDS_TIPS_TRIVIA_8 1509 -#define IDS_TIPS_TRIVIA_9 1510 -#define IDS_TITLE_DECLINE_SAVE_GAME 1511 -#define IDS_TITLE_RENAME 1512 -#define IDS_TITLE_RENAMESAVE 1513 -#define IDS_TITLE_SAVE_GAME 1514 -#define IDS_TITLE_START_GAME 1515 -#define IDS_TITLE_UPDATE_NAME 1516 -#define IDS_TITLEUPDATE 1517 -#define IDS_TNT_EXPLODES 1518 -#define IDS_TOOLTIPS_ACCEPT 1519 -#define IDS_TOOLTIPS_ALL_GAMES 1520 -#define IDS_TOOLTIPS_BACK 1521 -#define IDS_TOOLTIPS_BANLEVEL 1522 -#define IDS_TOOLTIPS_BLOCK 1523 -#define IDS_TOOLTIPS_CANCEL 1524 -#define IDS_TOOLTIPS_CANCEL_JOIN 1525 -#define IDS_TOOLTIPS_CHANGE_FILTER 1526 -#define IDS_TOOLTIPS_CHANGE_GROUP 1527 -#define IDS_TOOLTIPS_CHANGEDEVICE 1528 -#define IDS_TOOLTIPS_CHANGEPITCH 1529 -#define IDS_TOOLTIPS_CLEAR_QUICK_SELECT 1530 -#define IDS_TOOLTIPS_CLEARSLOTS 1531 -#define IDS_TOOLTIPS_COLLECT 1532 -#define IDS_TOOLTIPS_CONTINUE 1533 -#define IDS_TOOLTIPS_CRAFTING 1534 -#define IDS_TOOLTIPS_CREATE 1535 -#define IDS_TOOLTIPS_CREATIVE 1536 -#define IDS_TOOLTIPS_CURE 1537 -#define IDS_TOOLTIPS_DELETE 1538 -#define IDS_TOOLTIPS_DELETESAVE 1539 -#define IDS_TOOLTIPS_DETONATE 1540 -#define IDS_TOOLTIPS_DRAW_BOW 1541 -#define IDS_TOOLTIPS_DRINK 1542 -#define IDS_TOOLTIPS_DROP_ALL 1543 -#define IDS_TOOLTIPS_DROP_GENERIC 1544 -#define IDS_TOOLTIPS_DROP_ONE 1545 -#define IDS_TOOLTIPS_DYE 1546 -#define IDS_TOOLTIPS_DYECOLLAR 1547 -#define IDS_TOOLTIPS_EAT 1548 -#define IDS_TOOLTIPS_EJECT 1549 -#define IDS_TOOLTIPS_EMPTY 1550 -#define IDS_TOOLTIPS_EQUIP 1551 -#define IDS_TOOLTIPS_EXECUTE_COMMAND 1552 -#define IDS_TOOLTIPS_EXIT 1553 -#define IDS_TOOLTIPS_FEED 1554 -#define IDS_TOOLTIPS_FOLLOWME 1555 -#define IDS_TOOLTIPS_GROW 1556 -#define IDS_TOOLTIPS_HANG 1557 -#define IDS_TOOLTIPS_HARVEST 1558 -#define IDS_TOOLTIPS_HEAL 1559 -#define IDS_TOOLTIPS_HIDE 1560 -#define IDS_TOOLTIPS_HIT 1561 -#define IDS_TOOLTIPS_IGNITE 1562 -#define IDS_TOOLTIPS_INSTALL 1563 -#define IDS_TOOLTIPS_INSTALL_FULL 1564 -#define IDS_TOOLTIPS_INSTALL_TRIAL 1565 -#define IDS_TOOLTIPS_INVITE_FRIENDS 1566 -#define IDS_TOOLTIPS_INVITE_PARTY 1567 -#define IDS_TOOLTIPS_KICK 1568 -#define IDS_TOOLTIPS_LOVEMODE 1569 -#define IDS_TOOLTIPS_MILK 1570 -#define IDS_TOOLTIPS_MINE 1571 -#define IDS_TOOLTIPS_NAVIGATE 1572 -#define IDS_TOOLTIPS_NEXT 1573 -#define IDS_TOOLTIPS_OPEN 1574 -#define IDS_TOOLTIPS_OPTIONS 1575 -#define IDS_TOOLTIPS_PAGE_DOWN 1576 -#define IDS_TOOLTIPS_PAGE_UP 1577 -#define IDS_TOOLTIPS_PAGEDOWN 1578 -#define IDS_TOOLTIPS_PAGEUP 1579 -#define IDS_TOOLTIPS_PARTY_GAMES 1580 -#define IDS_TOOLTIPS_PICKUP_ALL 1581 -#define IDS_TOOLTIPS_PICKUP_GENERIC 1582 -#define IDS_TOOLTIPS_PICKUP_HALF 1583 -#define IDS_TOOLTIPS_PICKUPPLACE 1584 -#define IDS_TOOLTIPS_PLACE 1585 -#define IDS_TOOLTIPS_PLACE_ALL 1586 -#define IDS_TOOLTIPS_PLACE_GENERIC 1587 -#define IDS_TOOLTIPS_PLACE_ONE 1588 -#define IDS_TOOLTIPS_PLANT 1589 -#define IDS_TOOLTIPS_PLAY 1590 -#define IDS_TOOLTIPS_PREVIOUS 1591 -#define IDS_TOOLTIPS_PRIVILEGES 1592 -#define IDS_TOOLTIPS_QUICK_MOVE 1593 -#define IDS_TOOLTIPS_QUICK_MOVE_ARMOR 1594 -#define IDS_TOOLTIPS_QUICK_MOVE_FUEL 1595 -#define IDS_TOOLTIPS_QUICK_MOVE_INGREDIENT 1596 -#define IDS_TOOLTIPS_QUICK_MOVE_TOOL 1597 -#define IDS_TOOLTIPS_QUICK_MOVE_WEAPON 1598 -#define IDS_TOOLTIPS_READ 1599 -#define IDS_TOOLTIPS_REFRESH 1600 -#define IDS_TOOLTIPS_REINSTALL 1601 -#define IDS_TOOLTIPS_RELEASE_BOW 1602 -#define IDS_TOOLTIPS_REPAIR 1603 -#define IDS_TOOLTIPS_RIDE 1604 -#define IDS_TOOLTIPS_ROTATE 1605 -#define IDS_TOOLTIPS_SADDLE 1606 -#define IDS_TOOLTIPS_SAIL 1607 -#define IDS_TOOLTIPS_SAVEOPTIONS 1608 -#define IDS_TOOLTIPS_SELECT 1609 -#define IDS_TOOLTIPS_SELECT_SKIN 1610 -#define IDS_TOOLTIPS_SELECTDEVICE 1611 -#define IDS_TOOLTIPS_SEND_FRIEND_REQUEST 1612 -#define IDS_TOOLTIPS_SHARE 1613 -#define IDS_TOOLTIPS_SHEAR 1614 -#define IDS_TOOLTIPS_SHOW_DESCRIPTION 1615 -#define IDS_TOOLTIPS_SHOW_INGREDIENTS 1616 -#define IDS_TOOLTIPS_SHOW_INVENTORY 1617 -#define IDS_TOOLTIPS_SIT 1618 -#define IDS_TOOLTIPS_SLEEP 1619 -#define IDS_TOOLTIPS_SWAP 1620 -#define IDS_TOOLTIPS_SWIMUP 1621 -#define IDS_TOOLTIPS_TAME 1622 -#define IDS_TOOLTIPS_THROW 1623 -#define IDS_TOOLTIPS_TILL 1624 -#define IDS_TOOLTIPS_TRADE 1625 -#define IDS_TOOLTIPS_UNLOCKFULLVERSION 1626 -#define IDS_TOOLTIPS_USE 1627 -#define IDS_TOOLTIPS_VIEW_GAMERCARD 1628 -#define IDS_TOOLTIPS_VIEW_GAMERPROFILE 1629 -#define IDS_TOOLTIPS_WAKEUP 1630 -#define IDS_TOOLTIPS_WHAT_IS_THIS 1631 -#define IDS_TRIALOVER_TEXT 1632 -#define IDS_TRIALOVER_TITLE 1633 -#define IDS_TRUST_PLAYERS 1634 -#define IDS_TUTORIAL_BREEDING_OVERVIEW 1635 -#define IDS_TUTORIAL_COMPLETED 1636 -#define IDS_TUTORIAL_COMPLETED_EXPLORE 1637 -#define IDS_TUTORIAL_CONSTRAINT_TUTORIAL_AREA 1638 -#define IDS_TUTORIAL_CREATIVE_OVERVIEW 1639 -#define IDS_TUTORIAL_FARMING_OVERVIEW 1640 -#define IDS_TUTORIAL_FEATURES_IN_THIS_AREA 1641 -#define IDS_TUTORIAL_FEATURES_OUTSIDE_THIS_AREA 1642 -#define IDS_TUTORIAL_GOLEM_OVERVIEW 1643 -#define IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL 1644 -#define IDS_TUTORIAL_HINT_BOAT 1645 -#define IDS_TUTORIAL_HINT_CRAFT_NO_INGREDIENTS 1646 -#define IDS_TUTORIAL_HINT_DIGGER_ITEM_HATCHET 1647 -#define IDS_TUTORIAL_HINT_DIGGER_ITEM_PICKAXE 1648 -#define IDS_TUTORIAL_HINT_DIGGER_ITEM_SHOVEL 1649 -#define IDS_TUTORIAL_HINT_FISHING 1650 -#define IDS_TUTORIAL_HINT_HOLD_TO_MINE 1651 -#define IDS_TUTORIAL_HINT_INV_DROP 1652 -#define IDS_TUTORIAL_HINT_MINECART 1653 -#define IDS_TUTORIAL_HINT_PISTON_SELF_REPAIRING_BRIDGE 1654 -#define IDS_TUTORIAL_HINT_SWIM_UP 1655 -#define IDS_TUTORIAL_HINT_TOOL_DAMAGED 1656 -#define IDS_TUTORIAL_HTML_EXIT_PICTURE 1657 -#define IDS_TUTORIAL_NEW_FEATURES_CHOICE 1658 -#define IDS_TUTORIAL_PORTAL_OVERVIEW 1659 -#define IDS_TUTORIAL_PROMPT_ANVIL_MENU_OVERVIEW 1660 -#define IDS_TUTORIAL_PROMPT_ANVIL_OVERVIEW 1661 -#define IDS_TUTORIAL_PROMPT_BASIC_COMPLETE 1662 -#define IDS_TUTORIAL_PROMPT_BED_OVERVIEW 1663 -#define IDS_TUTORIAL_PROMPT_BOAT_OVERVIEW 1664 -#define IDS_TUTORIAL_PROMPT_BREEDING_OVERVIEW 1665 -#define IDS_TUTORIAL_PROMPT_BREWING_MENU_OVERVIEW 1666 -#define IDS_TUTORIAL_PROMPT_BREWING_OVERVIEW 1667 -#define IDS_TUTORIAL_PROMPT_CRAFT_OVERVIEW 1668 -#define IDS_TUTORIAL_PROMPT_CREATIVE_INV_OVERVIEW 1669 -#define IDS_TUTORIAL_PROMPT_CREATIVE_OVERVIEW 1670 -#define IDS_TUTORIAL_PROMPT_ENCHANTING_MENU_OVERVIEW 1671 -#define IDS_TUTORIAL_PROMPT_ENCHANTING_OVERVIEW 1672 -#define IDS_TUTORIAL_PROMPT_ENDERCHEST_OVERVIEW 1673 -#define IDS_TUTORIAL_PROMPT_FARMING_OVERVIEW 1674 -#define IDS_TUTORIAL_PROMPT_FISHING_OVERVIEW 1675 -#define IDS_TUTORIAL_PROMPT_FOOD_BAR_OVERVIEW 1676 -#define IDS_TUTORIAL_PROMPT_FURNACE_OVERVIEW 1677 -#define IDS_TUTORIAL_PROMPT_GOLEM_OVERVIEW 1678 -#define IDS_TUTORIAL_PROMPT_INV_OVERVIEW 1679 -#define IDS_TUTORIAL_PROMPT_MINECART_OVERVIEW 1680 -#define IDS_TUTORIAL_PROMPT_NEW_FEATURES_CHOICE 1681 -#define IDS_TUTORIAL_PROMPT_PORTAL_OVERVIEW 1682 -#define IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE 1683 -#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_DESCRIPTION 1684 -#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INGREDIENTS 1685 -#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INVENTORY 1686 -#define IDS_TUTORIAL_PROMPT_REDSTONE_OVERVIEW 1687 -#define IDS_TUTORIAL_PROMPT_START_TUTORIAL 1688 -#define IDS_TUTORIAL_PROMPT_TRADING_MENU_OVERVIEW 1689 -#define IDS_TUTORIAL_PROMPT_TRADING_OVERVIEW 1690 -#define IDS_TUTORIAL_REDSTONE_OVERVIEW 1691 -#define IDS_TUTORIAL_REMINDER 1692 -#define IDS_TUTORIAL_TASK_ACTIVATE_PORTAL 1693 -#define IDS_TUTORIAL_TASK_ANVIL_COST 1694 -#define IDS_TUTORIAL_TASK_ANVIL_COST2 1695 -#define IDS_TUTORIAL_TASK_ANVIL_ENCHANTED_BOOKS 1696 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_COST 1697 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_ENCHANT 1698 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_OVERVIEW 1699 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_RENAMING 1700 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_REPAIR 1701 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_SACRIFICE 1702 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_SMITH 1703 -#define IDS_TUTORIAL_TASK_ANVIL_MENU_START 1704 -#define IDS_TUTORIAL_TASK_ANVIL_OVERVIEW 1705 -#define IDS_TUTORIAL_TASK_ANVIL_RENAMING 1706 -#define IDS_TUTORIAL_TASK_ANVIL_SUMMARY 1707 -#define IDS_TUTORIAL_TASK_ANVIL_USE_CHESTS 1708 -#define IDS_TUTORIAL_TASK_BASIC_COMPLETE 1709 -#define IDS_TUTORIAL_TASK_BED_MULTIPLAYER 1710 -#define IDS_TUTORIAL_TASK_BED_OVERVIEW 1711 -#define IDS_TUTORIAL_TASK_BED_PLACEMENT 1712 -#define IDS_TUTORIAL_TASK_BOAT_OVERVIEW 1713 -#define IDS_TUTORIAL_TASK_BOAT_STEER 1714 -#define IDS_TUTORIAL_TASK_BREEDING_BABY 1715 -#define IDS_TUTORIAL_TASK_BREEDING_COMPLETE 1716 -#define IDS_TUTORIAL_TASK_BREEDING_DELAY 1717 -#define IDS_TUTORIAL_TASK_BREEDING_FEED 1718 -#define IDS_TUTORIAL_TASK_BREEDING_FEED_FOOD 1719 -#define IDS_TUTORIAL_TASK_BREEDING_FOLLOW 1720 -#define IDS_TUTORIAL_TASK_BREEDING_RIDING_PIGS 1721 -#define IDS_TUTORIAL_TASK_BREEDING_WOLF_COLLAR 1722 -#define IDS_TUTORIAL_TASK_BREEDING_WOLF_TAMING 1723 -#define IDS_TUTORIAL_TASK_BREWING_CREATE_FIRE_POTION 1724 -#define IDS_TUTORIAL_TASK_BREWING_DRINK_FIRE_POTION 1725 -#define IDS_TUTORIAL_TASK_BREWING_FILL_CAULDRON 1726 -#define IDS_TUTORIAL_TASK_BREWING_FILL_GLASS_BOTTLE 1727 -#define IDS_TUTORIAL_TASK_BREWING_GET_GLASS_BOTTLE 1728 -#define IDS_TUTORIAL_TASK_BREWING_MENU_BASIC_INGREDIENTS 1729 -#define IDS_TUTORIAL_TASK_BREWING_MENU_CREATE_FIRE_POTION 1730 -#define IDS_TUTORIAL_TASK_BREWING_MENU_EXIT 1731 -#define IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS 1732 -#define IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS_2 1733 -#define IDS_TUTORIAL_TASK_BREWING_MENU_METHOD 1734 -#define IDS_TUTORIAL_TASK_BREWING_MENU_OVERVIEW 1735 -#define IDS_TUTORIAL_TASK_BREWING_OVERVIEW 1736 -#define IDS_TUTORIAL_TASK_BREWING_USE_EFFECTS 1737 -#define IDS_TUTORIAL_TASK_BREWING_USE_POTION 1738 -#define IDS_TUTORIAL_TASK_BUILD_PORTAL 1739 -#define IDS_TUTORIAL_TASK_CHOP_WOOD 1740 -#define IDS_TUTORIAL_TASK_COLLECT_RESOURCES 1741 -#define IDS_TUTORIAL_TASK_CRAFT_CRAFT_TABLE 1742 -#define IDS_TUTORIAL_TASK_CRAFT_CREATE 1743 -#define IDS_TUTORIAL_TASK_CRAFT_CREATE_FURNACE 1744 -#define IDS_TUTORIAL_TASK_CRAFT_CREATE_PLANKS 1745 -#define IDS_TUTORIAL_TASK_CRAFT_DESCRIPTION 1746 -#define IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_FURNACE 1747 -#define IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_TABLE 1748 -#define IDS_TUTORIAL_TASK_CRAFT_INGREDIENTS 1749 -#define IDS_TUTORIAL_TASK_CRAFT_INVENTORY 1750 -#define IDS_TUTORIAL_TASK_CRAFT_NAV 1751 -#define IDS_TUTORIAL_TASK_CRAFT_OVERVIEW 1752 -#define IDS_TUTORIAL_TASK_CRAFT_SELECT_CRAFTING_TABLE 1753 -#define IDS_TUTORIAL_TASK_CRAFT_SELECT_STRUCTURES 1754 -#define IDS_TUTORIAL_TASK_CRAFT_SELECT_TOOLS 1755 -#define IDS_TUTORIAL_TASK_CRAFT_SELECT_WOODEN_SHOVEL 1756 -#define IDS_TUTORIAL_TASK_CRAFT_TOOLS_BUILT 1757 -#define IDS_TUTORIAL_TASK_CRAFTING 1758 -#define IDS_TUTORIAL_TASK_CREATE_CHARCOAL 1759 -#define IDS_TUTORIAL_TASK_CREATE_CRAFTING_TABLE 1760 -#define IDS_TUTORIAL_TASK_CREATE_FURNACE 1761 -#define IDS_TUTORIAL_TASK_CREATE_GLASS 1762 -#define IDS_TUTORIAL_TASK_CREATE_PLANKS 1763 -#define IDS_TUTORIAL_TASK_CREATE_STICKS 1764 -#define IDS_TUTORIAL_TASK_CREATE_TORCH 1765 -#define IDS_TUTORIAL_TASK_CREATE_WOODEN_DOOR 1766 -#define IDS_TUTORIAL_TASK_CREATE_WOODEN_HATCHET 1767 -#define IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE 1768 -#define IDS_TUTORIAL_TASK_CREATE_WOODEN_SHOVEL 1769 -#define IDS_TUTORIAL_TASK_CREATIVE_COMPLETE 1770 -#define IDS_TUTORIAL_TASK_CREATIVE_EXIT 1771 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_DROP 1772 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_EXIT 1773 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_INFO 1774 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_MOVE 1775 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_NAV 1776 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_OVERVIEW 1777 -#define IDS_TUTORIAL_TASK_CREATIVE_INV_PICK_UP 1778 -#define IDS_TUTORIAL_TASK_CREATIVE_MODE 1779 -#define IDS_TUTORIAL_TASK_ENCHANTING_BOOKCASES 1780 -#define IDS_TUTORIAL_TASK_ENCHANTING_BOOKS 1781 -#define IDS_TUTORIAL_TASK_ENCHANTING_BOTTLE_O_ENCHANTING 1782 -#define IDS_TUTORIAL_TASK_ENCHANTING_EXPERIENCE 1783 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_BETTER_ENCHANTMENTS 1784 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_COST 1785 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANT 1786 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANTMENTS 1787 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_OVERVIEW 1788 -#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_START 1789 -#define IDS_TUTORIAL_TASK_ENCHANTING_OVERVIEW 1790 -#define IDS_TUTORIAL_TASK_ENCHANTING_SUMMARY 1791 -#define IDS_TUTORIAL_TASK_ENCHANTING_USE_CHESTS 1792 -#define IDS_TUTORIAL_TASK_ENDERCHEST_FUNCTION 1793 -#define IDS_TUTORIAL_TASK_ENDERCHEST_OVERVIEW 1794 -#define IDS_TUTORIAL_TASK_ENDERCHEST_PLAYERS 1795 -#define IDS_TUTORIAL_TASK_ENDERCHEST_SUMMARY 1796 -#define IDS_TUTORIAL_TASK_FARMING_BONEMEAL 1797 -#define IDS_TUTORIAL_TASK_FARMING_CACTUS 1798 -#define IDS_TUTORIAL_TASK_FARMING_CARROTS_AND_POTATOES 1799 -#define IDS_TUTORIAL_TASK_FARMING_COMPLETE 1800 -#define IDS_TUTORIAL_TASK_FARMING_FARMLAND 1801 -#define IDS_TUTORIAL_TASK_FARMING_MUSHROOM 1802 -#define IDS_TUTORIAL_TASK_FARMING_PUMPKIN_AND_MELON 1803 -#define IDS_TUTORIAL_TASK_FARMING_SEEDS 1804 -#define IDS_TUTORIAL_TASK_FARMING_SUGARCANE 1805 -#define IDS_TUTORIAL_TASK_FARMING_WHEAT 1806 -#define IDS_TUTORIAL_TASK_FISHING_CAST 1807 -#define IDS_TUTORIAL_TASK_FISHING_FISH 1808 -#define IDS_TUTORIAL_TASK_FISHING_OVERVIEW 1809 -#define IDS_TUTORIAL_TASK_FISHING_USES 1810 -#define IDS_TUTORIAL_TASK_FLY 1811 -#define IDS_TUTORIAL_TASK_FOOD_BAR_DEPLETE 1812 -#define IDS_TUTORIAL_TASK_FOOD_BAR_EAT_STEAK 1813 -#define IDS_TUTORIAL_TASK_FOOD_BAR_FEED 1814 -#define IDS_TUTORIAL_TASK_FOOD_BAR_HEAL 1815 -#define IDS_TUTORIAL_TASK_FOOD_BAR_OVERVIEW 1816 -#define IDS_TUTORIAL_TASK_FURNACE_CHARCOAL_USES 1817 -#define IDS_TUTORIAL_TASK_FURNACE_CREATE_CHARCOAL 1818 -#define IDS_TUTORIAL_TASK_FURNACE_CREATE_GLASS 1819 -#define IDS_TUTORIAL_TASK_FURNACE_FUELS 1820 -#define IDS_TUTORIAL_TASK_FURNACE_INGREDIENTS 1821 -#define IDS_TUTORIAL_TASK_FURNACE_METHOD 1822 -#define IDS_TUTORIAL_TASK_FURNACE_OVERVIEW 1823 -#define IDS_TUTORIAL_TASK_GOLEM_IRON 1824 -#define IDS_TUTORIAL_TASK_GOLEM_IRON_VILLAGE 1825 -#define IDS_TUTORIAL_TASK_GOLEM_PUMPKIN 1826 -#define IDS_TUTORIAL_TASK_GOLEM_SNOW 1827 -#define IDS_TUTORIAL_TASK_INV_DROP 1828 -#define IDS_TUTORIAL_TASK_INV_EXIT 1829 -#define IDS_TUTORIAL_TASK_INV_INFO 1830 -#define IDS_TUTORIAL_TASK_INV_MOVE 1831 -#define IDS_TUTORIAL_TASK_INV_OVERVIEW 1832 -#define IDS_TUTORIAL_TASK_INV_PICK_UP 1833 -#define IDS_TUTORIAL_TASK_INVENTORY 1834 -#define IDS_TUTORIAL_TASK_JUMP 1835 -#define IDS_TUTORIAL_TASK_LOOK 1836 -#define IDS_TUTORIAL_TASK_MINE 1837 -#define IDS_TUTORIAL_TASK_MINE_STONE 1838 -#define IDS_TUTORIAL_TASK_MINECART_OVERVIEW 1839 -#define IDS_TUTORIAL_TASK_MINECART_POWERED_RAILS 1840 -#define IDS_TUTORIAL_TASK_MINECART_PUSHING 1841 -#define IDS_TUTORIAL_TASK_MINECART_RAILS 1842 -#define IDS_TUTORIAL_TASK_MOVE 1843 -#define IDS_TUTORIAL_TASK_NEARBY_SHELTER 1844 -#define IDS_TUTORIAL_TASK_NETHER 1845 -#define IDS_TUTORIAL_TASK_NETHER_FAST_TRAVEL 1846 -#define IDS_TUTORIAL_TASK_NIGHT_DANGER 1847 -#define IDS_TUTORIAL_TASK_OPEN_CONTAINER 1848 -#define IDS_TUTORIAL_TASK_OPEN_CREATIVE_INVENTORY 1849 -#define IDS_TUTORIAL_TASK_OPEN_WORKBENCH 1850 -#define IDS_TUTORIAL_TASK_OVERVIEW 1851 -#define IDS_TUTORIAL_TASK_PISTONS 1852 -#define IDS_TUTORIAL_TASK_PLACE_AND_OPEN_FURNACE 1853 -#define IDS_TUTORIAL_TASK_PLACE_DOOR 1854 -#define IDS_TUTORIAL_TASK_PLACE_WORKBENCH 1855 -#define IDS_TUTORIAL_TASK_REDSTONE_DUST 1856 -#define IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES 1857 -#define IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES_POSITION 1858 -#define IDS_TUTORIAL_TASK_REDSTONE_REPEATER 1859 -#define IDS_TUTORIAL_TASK_REDSTONE_TRIPWIRE 1860 -#define IDS_TUTORIAL_TASK_SCROLL 1861 -#define IDS_TUTORIAL_TASK_SPRINT 1862 -#define IDS_TUTORIAL_TASK_TRADING_DECREASE_TRADES 1863 -#define IDS_TUTORIAL_TASK_TRADING_INCREASE_TRADES 1864 -#define IDS_TUTORIAL_TASK_TRADING_MENU_DETAILS 1865 -#define IDS_TUTORIAL_TASK_TRADING_MENU_INVENTORY 1866 -#define IDS_TUTORIAL_TASK_TRADING_MENU_OVERVIEW 1867 -#define IDS_TUTORIAL_TASK_TRADING_MENU_START 1868 -#define IDS_TUTORIAL_TASK_TRADING_MENU_TRADE 1869 -#define IDS_TUTORIAL_TASK_TRADING_MENU_UNAVAILABLE 1870 -#define IDS_TUTORIAL_TASK_TRADING_OVERVIEW 1871 -#define IDS_TUTORIAL_TASK_TRADING_SUMMARY 1872 -#define IDS_TUTORIAL_TASK_TRADING_TRADES 1873 -#define IDS_TUTORIAL_TASK_TRADING_USE_CHESTS 1874 -#define IDS_TUTORIAL_TASK_TRY_IT 1875 -#define IDS_TUTORIAL_TASK_USE 1876 -#define IDS_TUTORIAL_TASK_USE_PORTAL 1877 -#define IDS_TUTORIALSAVENAME 1878 -#define IDS_UNHIDE_MASHUP_WORLDS 1879 -#define IDS_UNLOCK_ACCEPT_INVITE 1880 -#define IDS_UNLOCK_ACHIEVEMENT_TEXT 1881 -#define IDS_UNLOCK_AVATAR_TEXT 1882 -#define IDS_UNLOCK_DLC_SKIN 1883 -#define IDS_UNLOCK_DLC_TEXTUREPACK_TEXT 1884 -#define IDS_UNLOCK_DLC_TEXTUREPACK_TITLE 1885 -#define IDS_UNLOCK_DLC_TITLE 1886 -#define IDS_UNLOCK_FULL_GAME 1887 -#define IDS_UNLOCK_GAMERPIC_TEXT 1888 -#define IDS_UNLOCK_GUEST_TEXT 1889 -#define IDS_UNLOCK_KICK_PLAYER 1890 -#define IDS_UNLOCK_KICK_PLAYER_TITLE 1891 -#define IDS_UNLOCK_THEME_TEXT 1892 -#define IDS_UNLOCK_TITLE 1893 -#define IDS_UNLOCK_TOSAVE_TEXT 1894 -#define IDS_USER_INTERFACE 1895 -#define IDS_USING_TRIAL_TEXUREPACK_WARNING 1896 -#define IDS_VIEW_BOBBING 1897 -#define IDS_VILLAGER 1898 -#define IDS_VILLAGER_BUTCHER 1899 -#define IDS_VILLAGER_FARMER 1900 -#define IDS_VILLAGER_LIBRARIAN 1901 -#define IDS_VILLAGER_OFFERS_ITEM 1902 -#define IDS_VILLAGER_PRIEST 1903 -#define IDS_VILLAGER_SMITH 1904 -#define IDS_WARNING_ARCADE_TEXT 1905 -#define IDS_WARNING_ARCADE_TITLE 1906 -#define IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT 1907 -#define IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE 1908 -#define IDS_WIN_TEXT 1909 -#define IDS_WIN_TEXT_PART_2 1910 -#define IDS_WIN_TEXT_PART_3 1911 -#define IDS_WOLF 1912 -#define IDS_WORLD_NAME 1913 -#define IDS_WORLD_OPTIONS 1914 -#define IDS_WORLD_SIZE 1915 -#define IDS_WORLD_SIZE_TITLE_CLASSIC 1916 -#define IDS_WORLD_SIZE_TITLE_LARGE 1917 -#define IDS_WORLD_SIZE_TITLE_MEDIUM 1918 -#define IDS_WORLD_SIZE_TITLE_SMALL 1919 -#define IDS_YES 1920 -#define IDS_YOU_DIED 1921 -#define IDS_YOU_HAVE 1922 -#define IDS_ZOMBIE 1923 +// Auto-generated by StringTable builder — do not edit manually. +// Source language: en-US +// Total strings: 2286 + +#define IDS_NULL 0 +#define IDS_OK 1 +#define IDS_BACK 2 +#define IDS_CANCEL 3 +#define IDS_YES 4 +#define IDS_NO 5 +#define IDS_CORRUPTSAVE_TITLE 6 +#define IDS_CORRUPTSAVE_TEXT 7 +#define IDS_NOFREESPACE_TITLE 8 +#define IDS_NOFREESPACE_TEXT 9 +#define IDS_SELECTAGAIN 10 +#define IDS_PLAYWITHOUTSAVING 11 +#define IDS_CREATEANEWSAVE 12 +#define IDS_OVERWRITESAVE_TITLE 13 +#define IDS_OVERWRITESAVE_TEXT 14 +#define IDS_OVERWRITESAVE_NO 15 +#define IDS_OVERWRITESAVE_YES 16 +#define IDS_FAILED_TO_SAVE_TITLE 17 +#define IDS_STORAGEDEVICEPROBLEM_TITLE 18 +#define IDS_FAILED_TO_SAVE_TEXT 19 +#define IDS_FAILED_TO_LOADSAVE_TEXT 20 +#define IDS_SELECTANEWDEVICE 21 +#define IDS_NODEVICE_TITLE 22 +#define IDS_NODEVICE_TEXT 23 +#define IDS_NODEVICE_ACCEPT 24 +#define IDS_NODEVICE_DECLINE 25 +#define IDS_DEVICEGONE_TEXT 26 +#define IDS_DEVICEGONE_TITLE 27 +#define IDS_KEYBOARDUI_SAVEGAME_TITLE 28 +#define IDS_KEYBOARDUI_SAVEGAME_TEXT 29 +#define IDS_WARNING_ARCADE_TITLE 30 +#define IDS_WARNING_ARCADE_TEXT 31 +#define IDS_PRO_RETURNEDTOMENU_TITLE 32 +#define IDS_PRO_RETURNEDTOTITLESCREEN_TEXT 33 +#define IDS_PRO_RETURNEDTOMENU_TEXT 34 +#define IDS_PRO_RETURNEDTOMENU_ACCEPT 35 +#define IDS_PRO_NOTONLINE_TITLE 36 +#define IDS_PRO_NOTONLINE_TEXT 37 +#define IDS_PRO_XBOXLIVE_NOTIFICATION 38 +#define IDS_PRO_NOTONLINE_ACCEPT 39 +#define IDS_PRO_NOTONLINE_DECLINE 40 +#define IDS_PRO_ACHIEVEMENTPROBLEM_TITLE 41 +#define IDS_PRO_ACHIEVEMENTPROBLEM_TEXT 42 +#define IDS_PRO_NOPROFILE_TITLE 43 +#define IDS_PRO_NOPROFILEOPTIONS_TEXT 44 +#define IDS_PRO_GUESTPROFILE_TITLE 45 +#define IDS_PRO_GUESTPROFILE_TEXT 46 +#define IDS_STO_SAVING_SHORT 47 +#define IDS_STO_SAVING_LONG 48 +#define IDS_PRO_UNLOCKGAME_TITLE 49 +#define IDS_PRO_UNLOCKGAME_TEXT 50 +#define IDS_PRO_PROFILEPROBLEM_TEXT 51 +#define IDS_SAVE_TRANSFER_WRONG_VERSION 52 +#define IDS_UNHIDE_MASHUP_WORLDS 53 +#define IDS_TOOLTIPS_HIDE 54 +#define IDS_GAMENAME 55 +#define IDS_OPTIONSFILE 56 +#define IDS_SAVECACHEFILE 57 +#define IDS_ERROR_NETWORK 58 +#define IDS_ERROR_NETWORK_TITLE 59 +#define IDS_ERROR_NETWORK_EXIT 60 +#define IDS_CHAT_RESTRICTION_UGC 61 +#define IDS_CONTENT_RESTRICTION 62 +#define IDS_ONLINE_SERVICE_TITLE 63 +#define IDS_ERROR_PSN_SIGN_OUT 64 +#define IDS_ERROR_PSN_SIGN_OUT_EXIT 65 +#define IDS_PLAYER_LIST_TITLE 66 +#define IDS_DLC_PRICE_FREE 67 +#define IDS_CORRUPT_OPTIONS 68 +#define IDS_CORRUPT_OPTIONS_DELETE 69 +#define IDS_CORRUPT_OPTIONS_RETRY 70 +#define IDS_CORRUPT_SAVECACHE 71 +#define IDS_SAVEDATA_COPIED_TITLE 72 +#define IDS_SAVEDATA_COPIED_TEXT 73 +#define IDS_FATAL_TROPHY_ERROR 74 +#define IDS_TOOLTIPS_GAME_INVITES 75 +#define IDS_CORRUPT_FILE 76 +#define IDS_CONTROLER_DISCONNECT_TITLE 77 +#define IDS_CONTROLER_DISCONNECT_TEXT 78 +#define IDS_CONTENT_RESTRICTION_MULTIPLAYER 79 +#define IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE 80 +#define IDS_NO_DLCCATEGORIES 81 +#define IDS_INVITATION_SUBJECT_MAX_18_CHARS 82 +#define IDS_INVITATION_BODY 83 +#define IDS_EULA 84 +#define IDS_EULA_SCEE 85 +#define IDS_EULA_SCEA 86 +#define IDS_EULA_SCEE_BD 87 +#define IDS_INCREASE_WORLD_SIZE 88 +#define IDS_INCREASE_WORLD_SIZE_OVERWRITE_EDGES 89 +#define IDS_GAMEOPTION_INCREASE_WORLD_SIZE 90 +#define IDS_GAMEOPTION_INCREASE_WORLD_SIZE_OVERWRITE_EDGES 91 +#define IDS_DYNAFONT 92 +#define IDS_TIPS_GAMETIP_NEWDLC 93 +#define IDS_TIPS_GAMETIP_SKINPACKS 94 +#define IDS_TIPS_GAMETIP_2 95 +#define IDS_TIPS_GAMETIP_3 96 +#define IDS_TIPS_GAMETIP_4 97 +#define IDS_TIPS_GAMETIP_5 98 +#define IDS_TIPS_GAMETIP_6 99 +#define IDS_TIPS_GAMETIP_7 100 +#define IDS_TIPS_GAMETIP_8 101 +#define IDS_TIPS_GAMETIP_9 102 +#define IDS_TIPS_GAMETIP_10 103 +#define IDS_TIPS_GAMETIP_11 104 +#define IDS_TIPS_GAMETIP_12 105 +#define IDS_TIPS_GAMETIP_13 106 +#define IDS_TIPS_GAMETIP_14 107 +#define IDS_TIPS_GAMETIP_15 108 +#define IDS_TIPS_GAMETIP_16 109 +#define IDS_TIPS_GAMETIP_17 110 +#define IDS_TIPS_GAMETIP_18 111 +#define IDS_TIPS_GAMETIP_19 112 +#define IDS_TIPS_GAMETIP_20 113 +#define IDS_TIPS_GAMETIP_21 114 +#define IDS_TIPS_GAMETIP_22 115 +#define IDS_TIPS_GAMETIP_23 116 +#define IDS_TIPS_GAMETIP_24 117 +#define IDS_TIPS_GAMETIP_25 118 +#define IDS_TIPS_GAMETIP_26 119 +#define IDS_TIPS_GAMETIP_27 120 +#define IDS_TIPS_GAMETIP_28 121 +#define IDS_TIPS_GAMETIP_29 122 +#define IDS_TIPS_GAMETIP_30 123 +#define IDS_TIPS_GAMETIP_31 124 +#define IDS_TIPS_GAMETIP_32 125 +#define IDS_TIPS_GAMETIP_33 126 +#define IDS_TIPS_GAMETIP_34 127 +#define IDS_TIPS_GAMETIP_35 128 +#define IDS_TIPS_GAMETIP_36 129 +#define IDS_TIPS_GAMETIP_37 130 +#define IDS_TIPS_GAMETIP_38 131 +#define IDS_TIPS_GAMETIP_39 132 +#define IDS_TIPS_GAMETIP_40 133 +#define IDS_TIPS_GAMETIP_41 134 +#define IDS_TIPS_GAMETIP_42 135 +#define IDS_TIPS_GAMETIP_43 136 +#define IDS_TIPS_GAMETIP_46 137 +#define IDS_TIPS_GAMETIP_47 138 +#define IDS_TIPS_GAMETIP_49 139 +#define IDS_TIPS_GAMETIP_50 140 +#define IDS_TIPS_TRIVIA_1 141 +#define IDS_TIPS_TRIVIA_2 142 +#define IDS_TIPS_TRIVIA_3 143 +#define IDS_TIPS_TRIVIA_5 144 +#define IDS_TIPS_TRIVIA_6 145 +#define IDS_TIPS_TRIVIA_7 146 +#define IDS_TIPS_TRIVIA_8 147 +#define IDS_TIPS_TRIVIA_9 148 +#define IDS_TIPS_TRIVIA_10 149 +#define IDS_TIPS_TRIVIA_11 150 +#define IDS_TIPS_TRIVIA_12 151 +#define IDS_TIPS_TRIVIA_13 152 +#define IDS_TIPS_TRIVIA_14 153 +#define IDS_TIPS_TRIVIA_15 154 +#define IDS_TIPS_TRIVIA_16 155 +#define IDS_TIPS_TRIVIA_18 156 +#define IDS_TIPS_TRIVIA_19 157 +#define IDS_TIPS_TRIVIA_20 158 +#define IDS_HOW_TO_PLAY_BASICS 159 +#define IDS_HOW_TO_PLAY_HUD 160 +#define IDS_HOW_TO_PLAY_INVENTORY 161 +#define IDS_HOW_TO_PLAY_CHEST 162 +#define IDS_HOW_TO_PLAY_LARGECHEST 163 +#define IDS_HOW_TO_PLAY_CRAFTING 164 +#define IDS_HOW_TO_PLAY_CRAFT_TABLE 165 +#define IDS_HOW_TO_PLAY_FURNACE 166 +#define IDS_HOW_TO_PLAY_DISPENSER 167 +#define IDS_HOW_TO_PLAY_BREWING 168 +#define IDS_HOW_TO_PLAY_ENCHANTMENT 169 +#define IDS_HOW_TO_PLAY_FARMANIMALS 170 +#define IDS_HOW_TO_PLAY_BREEDANIMALS 171 +#define IDS_HOW_TO_PLAY_NETHERPORTAL 172 +#define IDS_HOW_TO_PLAY_BANLIST 173 +#define IDS_HOW_TO_PLAY_HOSTOPTIONS 174 +#define IDS_HOW_TO_PLAY_NEXT 175 +#define IDS_HOW_TO_PLAY_PREV 176 +#define IDS_HOW_TO_PLAY_MENU_BASICS 177 +#define IDS_HOW_TO_PLAY_MENU_HUD 178 +#define IDS_HOW_TO_PLAY_MENU_INVENTORY 179 +#define IDS_HOW_TO_PLAY_MENU_CHESTS 180 +#define IDS_HOW_TO_PLAY_MENU_CRAFTING 181 +#define IDS_HOW_TO_PLAY_MENU_FURNACE 182 +#define IDS_HOW_TO_PLAY_MENU_DISPENSER 183 +#define IDS_HOW_TO_PLAY_MENU_FARMANIMALS 184 +#define IDS_HOW_TO_PLAY_MENU_BREEDANIMALS 185 +#define IDS_HOW_TO_PLAY_MENU_BREWING 186 +#define IDS_HOW_TO_PLAY_MENU_ENCHANTMENT 187 +#define IDS_HOW_TO_PLAY_MENU_NETHERPORTAL 188 +#define IDS_HOW_TO_PLAY_MENU_MULTIPLAYER 189 +#define IDS_HOW_TO_PLAY_MENU_SOCIALMEDIA 190 +#define IDS_HOW_TO_PLAY_MENU_BANLIST 191 +#define IDS_HOW_TO_PLAY_MENU_CREATIVE 192 +#define IDS_HOW_TO_PLAY_MENU_HOSTOPTIONS 193 +#define IDS_HOW_TO_PLAY_MENU_TRADING 194 +#define IDS_HOW_TO_PLAY_MENU_ANVIL 195 +#define IDS_HOW_TO_PLAY_MENU_THEEND 196 +#define IDS_HOW_TO_PLAY_THEEND 197 +#define IDS_HOW_TO_PLAY_MENU_SPRINT 198 +#define IDS_HOW_TO_PLAY_MENU_WHATSNEW 199 +#define IDS_HOW_TO_PLAY_WHATSNEW 200 +#define IDS_TITLEUPDATE 201 +#define IDS_HOW_TO_PLAY_MENU_HORSES 202 +#define IDS_HOW_TO_PLAY_HORSES 203 +#define IDS_HOW_TO_PLAY_MENU_BEACONS 204 +#define IDS_HOW_TO_PLAY_BEACONS 205 +#define IDS_HOW_TO_PLAY_MENU_FIREWORKS 206 +#define IDS_HOW_TO_PLAY_FIREWORKS 207 +#define IDS_HOW_TO_PLAY_MENU_HOPPERS 208 +#define IDS_HOW_TO_PLAY_HOPPERS 209 +#define IDS_HOW_TO_PLAY_MENU_DROPPERS 210 +#define IDS_HOW_TO_PLAY_DROPPERS 211 +#define IDS_DESC_SWORD 212 +#define IDS_DESC_SHOVEL 213 +#define IDS_DESC_PICKAXE 214 +#define IDS_DESC_HATCHET 215 +#define IDS_DESC_HOE 216 +#define IDS_DESC_DOOR_WOOD 217 +#define IDS_DESC_DOOR_IRON 218 +#define IDS_DESC_HELMET 219 +#define IDS_DESC_CHESTPLATE 220 +#define IDS_DESC_LEGGINGS 221 +#define IDS_DESC_BOOTS 222 +#define IDS_DESC_HELMET_LEATHER 223 +#define IDS_DESC_CHESTPLATE_LEATHER 224 +#define IDS_DESC_LEGGINGS_LEATHER 225 +#define IDS_DESC_BOOTS_LEATHER 226 +#define IDS_DESC_HELMET_CHAIN 227 +#define IDS_DESC_CHESTPLATE_CHAIN 228 +#define IDS_DESC_LEGGINGS_CHAIN 229 +#define IDS_DESC_BOOTS_CHAIN 230 +#define IDS_DESC_HELMET_IRON 231 +#define IDS_DESC_CHESTPLATE_IRON 232 +#define IDS_DESC_LEGGINGS_IRON 233 +#define IDS_DESC_BOOTS_IRON 234 +#define IDS_DESC_HELMET_GOLD 235 +#define IDS_DESC_CHESTPLATE_GOLD 236 +#define IDS_DESC_LEGGINGS_GOLD 237 +#define IDS_DESC_BOOTS_GOLD 238 +#define IDS_DESC_HELMET_DIAMOND 239 +#define IDS_DESC_CHESTPLATE_DIAMOND 240 +#define IDS_DESC_LEGGINGS_DIAMOND 241 +#define IDS_DESC_BOOTS_DIAMOND 242 +#define IDS_DESC_INGOT 243 +#define IDS_DESC_BLOCK 244 +#define IDS_DESC_PRESSUREPLATE 245 +#define IDS_DESC_STAIRS 246 +#define IDS_DESC_SLAB 247 +#define IDS_DESC_HALFSLAB 248 +#define IDS_DESC_TORCH 249 +#define IDS_DESC_WOODENPLANKS 250 +#define IDS_DESC_SANDSTONE 251 +#define IDS_DESC_STRUCTBLOCK 252 +#define IDS_DESC_STICK 253 +#define IDS_DESC_BED 254 +#define IDS_DESC_CRAFTINGTABLE 255 +#define IDS_DESC_FURNACE 256 +#define IDS_DESC_CHEST 257 +#define IDS_DESC_FENCE 258 +#define IDS_DESC_LADDER 259 +#define IDS_DESC_TRAPDOOR 260 +#define IDS_DESC_SIGN 261 +#define IDS_DESC_GLOWSTONE 262 +#define IDS_DESC_TNT 263 +#define IDS_DESC_BOWL 264 +#define IDS_DESC_BUCKET 265 +#define IDS_DESC_BUCKET_WATER 266 +#define IDS_DESC_BUCKET_LAVA 267 +#define IDS_DESC_BUCKET_MILK 268 +#define IDS_DESC_FLINTANDSTEEL 269 +#define IDS_DESC_FISHINGROD 270 +#define IDS_DESC_CLOCK 271 +#define IDS_DESC_COMPASS 272 +#define IDS_DESC_MAP 273 +#define IDS_DESC_MAP_EMPTY 274 +#define IDS_DESC_BOW 275 +#define IDS_DESC_ARROW 276 +#define IDS_DESC_NETHER_STAR 277 +#define IDS_DESC_FIREWORKS 278 +#define IDS_DESC_FIREWORKS_CHARGE 279 +#define IDS_DESC_COMPARATOR 280 +#define IDS_DESC_MINECART_TNT 281 +#define IDS_DESC_DAYLIGHT_DETECTOR 282 +#define IDS_DESC_MINECART_HOPPER 283 +#define IDS_DESC_IRON_HORSE_ARMOR 284 +#define IDS_DESC_GOLD_HORSE_ARMOR 285 +#define IDS_DESC_DIAMOND_HORSE_ARMOR 286 +#define IDS_DESC_LEAD 287 +#define IDS_DESC_NAME_TAG 288 +#define IDS_DESC_BREAD 289 +#define IDS_DESC_CAKE 290 +#define IDS_DESC_COOKIE 291 +#define IDS_DESC_MELON_SLICE 292 +#define IDS_DESC_MUSHROOMSTEW 293 +#define IDS_DESC_CHICKEN_RAW 294 +#define IDS_DESC_CHICKEN_COOKED 295 +#define IDS_DESC_BEEF_RAW 296 +#define IDS_DESC_BEEF_COOKED 297 +#define IDS_DESC_PORKCHOP_RAW 298 +#define IDS_DESC_PORKCHOP_COOKED 299 +#define IDS_DESC_FISH_RAW 300 +#define IDS_DESC_FISH_COOKED 301 +#define IDS_DESC_APPLE 302 +#define IDS_DESC_GOLDENAPPLE 303 +#define IDS_DESC_ROTTEN_FLESH 304 +#define IDS_DESC_SUGAR 305 +#define IDS_DESC_LEVER 306 +#define IDS_DESC_REDSTONETORCH 307 +#define IDS_DESC_REDSTONEREPEATER 308 +#define IDS_DESC_BUTTON 309 +#define IDS_DESC_DISPENSER 310 +#define IDS_DESC_NOTEBLOCK 311 +#define IDS_DESC_RAIL 312 +#define IDS_DESC_POWEREDRAIL 313 +#define IDS_DESC_DETECTORRAIL 314 +#define IDS_DESC_MINECART 315 +#define IDS_DESC_MINECARTWITHCHEST 316 +#define IDS_DESC_MINECARTWITHFURNACE 317 +#define IDS_DESC_BOAT 318 +#define IDS_DESC_WOOL 319 +#define IDS_DESC_WOOLSTRING 320 +#define IDS_DESC_DYE_BLACK 321 +#define IDS_DESC_DYE_GREEN 322 +#define IDS_DESC_DYE_BROWN 323 +#define IDS_DESC_DYE_SILVER 324 +#define IDS_DESC_DYE_YELLOW 325 +#define IDS_DESC_DYE_RED 326 +#define IDS_DESC_DYE_WHITE 327 +#define IDS_DESC_DYE_PINK 328 +#define IDS_DESC_DYE_ORANGE 329 +#define IDS_DESC_DYE_LIME 330 +#define IDS_DESC_DYE_GRAY 331 +#define IDS_DESC_DYE_LIGHTGRAY 332 +#define IDS_DESC_DYE_LIGHTBLUE 333 +#define IDS_DESC_DYE_CYAN 334 +#define IDS_DESC_DYE_PURPLE 335 +#define IDS_DESC_DYE_MAGENTA 336 +#define IDS_DESC_DYE_BLUE 337 +#define IDS_DESC_JUKEBOX 338 +#define IDS_DESC_DIAMONDS 339 +#define IDS_DESC_JACKOLANTERN 340 +#define IDS_DESC_PAPER 341 +#define IDS_DESC_BOOK 342 +#define IDS_DESC_BOOKSHELF 343 +#define IDS_DESC_PICTURE 344 +#define IDS_DESC_ORE_GOLD 345 +#define IDS_DESC_ORE_IRON 346 +#define IDS_DESC_ORE_COAL 347 +#define IDS_DESC_ORE_LAPIS 348 +#define IDS_DESC_ORE_DIAMOND 349 +#define IDS_DESC_ORE_REDSTONE 350 +#define IDS_DESC_STONE 351 +#define IDS_DESC_DIRT 352 +#define IDS_DESC_SAPLING 353 +#define IDS_DESC_BEDROCK 354 +#define IDS_DESC_LAVA 355 +#define IDS_DESC_SAND 356 +#define IDS_DESC_GRAVEL 357 +#define IDS_DESC_LOG 358 +#define IDS_DESC_GLASS 359 +#define IDS_DESC_STONE_BRICK 360 +#define IDS_DESC_BRICK 361 +#define IDS_DESC_CLAY 362 +#define IDS_DESC_CLAY_TILE 363 +#define IDS_DESC_SNOW 364 +#define IDS_DESC_TOP_SNOW 365 +#define IDS_DESC_TALL_GRASS 366 +#define IDS_DESC_FLOWER 367 +#define IDS_DESC_MUSHROOM 368 +#define IDS_DESC_OBSIDIAN 369 +#define IDS_DESC_MOB_SPAWNER 370 +#define IDS_DESC_REDSTONE_DUST 371 +#define IDS_DESC_CROPS 372 +#define IDS_DESC_FARMLAND 373 +#define IDS_DESC_CACTUS 374 +#define IDS_DESC_REEDS 375 +#define IDS_DESC_PUMPKIN 376 +#define IDS_DESC_HELL_ROCK 377 +#define IDS_DESC_HELL_SAND 378 +#define IDS_DESC_PORTAL 379 +#define IDS_DESC_COAL 380 +#define IDS_DESC_STRING 381 +#define IDS_DESC_FEATHER 382 +#define IDS_DESC_SULPHUR 383 +#define IDS_DESC_WHEAT_SEEDS 384 +#define IDS_DESC_WHEAT 385 +#define IDS_DESC_FLINT 386 +#define IDS_DESC_SADDLE 387 +#define IDS_DESC_SNOWBALL 388 +#define IDS_DESC_LEATHER 389 +#define IDS_DESC_SLIMEBALL 390 +#define IDS_DESC_EGG 391 +#define IDS_DESC_YELLOW_DUST 392 +#define IDS_DESC_BONE 393 +#define IDS_DESC_RECORD 394 +#define IDS_DESC_WATER 395 +#define IDS_DESC_LEAVES 396 +#define IDS_DESC_MOSS_STONE 397 +#define IDS_DESC_SHEARS 398 +#define IDS_DESC_PISTON 399 +#define IDS_DESC_STICKY_PISTON 400 +#define IDS_DESC_STONE_BRICK_SMOOTH 401 +#define IDS_DESC_IRON_FENCE 402 +#define IDS_DESC_FENCE_GATE 403 +#define IDS_DESC_MELON_BLOCK 404 +#define IDS_DESC_THIN_GLASS 405 +#define IDS_DESC_PUMPKIN_SEEDS 406 +#define IDS_DESC_MELON_SEEDS 407 +#define IDS_DESC_ENDER_PEARL 408 +#define IDS_DESC_GRASS 409 +#define IDS_DESC_SPONGE 410 +#define IDS_DESC_WEB 411 +#define IDS_DESC_STONE_SILVERFISH 412 +#define IDS_DESC_VINE 413 +#define IDS_DESC_ICE 414 +#define IDS_DESC_DEAD_BUSH 415 +#define IDS_DESC_BLAZE_ROD 416 +#define IDS_DESC_GHAST_TEAR 417 +#define IDS_DESC_GOLD_NUGGET 418 +#define IDS_DESC_NETHER_STALK_SEEDS 419 +#define IDS_DESC_POTION 420 +#define IDS_DESC_GLASS_BOTTLE 421 +#define IDS_DESC_SPIDER_EYE 422 +#define IDS_DESC_FERMENTED_SPIDER_EYE 423 +#define IDS_DESC_BLAZE_POWDER 424 +#define IDS_DESC_MAGMA_CREAM 425 +#define IDS_DESC_BREWING_STAND 426 +#define IDS_DESC_CAULDRON 427 +#define IDS_DESC_EYE_OF_ENDER 428 +#define IDS_DESC_SPECKLED_MELON 429 +#define IDS_DESC_MYCEL 430 +#define IDS_DESC_WATERLILY 431 +#define IDS_DESC_NETHERBRICK 432 +#define IDS_DESC_NETHERFENCE 433 +#define IDS_DESC_NETHERSTALK 434 +#define IDS_DESC_ENCHANTMENTTABLE 435 +#define IDS_DESC_END_PORTAL 436 +#define IDS_DESC_ENDPORTALFRAME 437 +#define IDS_DESC_WHITESTONE 438 +#define IDS_DESC_DRAGONEGG 439 +#define IDS_DESC_EXP_BOTTLE 440 +#define IDS_DESC_FIREBALL 441 +#define IDS_DESC_ITEMFRAME 442 +#define IDS_DESC_MONSTER_SPAWNER 443 +#define IDS_DESC_WOODSLAB 444 +#define IDS_DESC_STONESLAB 445 +#define IDS_DESC_ITEM_NETHERBRICK 446 +#define IDS_DESC_REDSTONE_LIGHT 447 +#define IDS_DESC_COCOA 448 +#define IDS_DESC_SKULL 449 +#define IDS_DESC_COMMAND_BLOCK 450 +#define IDS_DESC_BEACON 451 +#define IDS_DESC_CHEST_TRAP 452 +#define IDS_DESC_WEIGHTED_PLATE_LIGHT 453 +#define IDS_DESC_WEIGHTED_PLATE_HEAVY 454 +#define IDS_DESC_REDSTONE_BLOCK 455 +#define IDS_DESC_HOPPER 456 +#define IDS_DESC_ACTIVATOR_RAIL 457 +#define IDS_DESC_DROPPER 458 +#define IDS_DESC_STAINED_CLAY 459 +#define IDS_DESC_HAY 460 +#define IDS_DESC_HARDENED_CLAY 461 +#define IDS_DESC_STAINED_GLASS 462 +#define IDS_DESC_STAINED_GLASS_PANE 463 +#define IDS_DESC_COAL_BLOCK 464 +#define IDS_SQUID 465 +#define IDS_DESC_SQUID 466 +#define IDS_COW 467 +#define IDS_DESC_COW 468 +#define IDS_SHEEP 469 +#define IDS_DESC_SHEEP 470 +#define IDS_CHICKEN 471 +#define IDS_DESC_CHICKEN 472 +#define IDS_PIG 473 +#define IDS_DESC_PIG 474 +#define IDS_WOLF 475 +#define IDS_DESC_WOLF 476 +#define IDS_CREEPER 477 +#define IDS_DESC_CREEPER 478 +#define IDS_SKELETON 479 +#define IDS_DESC_SKELETON 480 +#define IDS_SPIDER 481 +#define IDS_DESC_SPIDER 482 +#define IDS_ZOMBIE 483 +#define IDS_DESC_ZOMBIE 484 +#define IDS_PIGZOMBIE 485 +#define IDS_DESC_PIGZOMBIE 486 +#define IDS_GHAST 487 +#define IDS_DESC_GHAST 488 +#define IDS_SLIME 489 +#define IDS_DESC_SLIME 490 +#define IDS_ENDERMAN 491 +#define IDS_DESC_ENDERMAN 492 +#define IDS_SILVERFISH 493 +#define IDS_DESC_SILVERFISH 494 +#define IDS_CAVE_SPIDER 495 +#define IDS_DESC_CAVE_SPIDER 496 +#define IDS_MUSHROOM_COW 497 +#define IDS_DESC_MUSHROOM_COW 498 +#define IDS_SNOWMAN 499 +#define IDS_DESC_SNOWMAN 500 +#define IDS_ENDERDRAGON 501 +#define IDS_DESC_ENDERDRAGON 502 +#define IDS_BLAZE 503 +#define IDS_DESC_BLAZE 504 +#define IDS_LAVA_SLIME 505 +#define IDS_DESC_LAVA_SLIME 506 +#define IDS_VILLAGER 507 +#define IDS_OZELOT 508 +#define IDS_DESC_OZELOT 509 +#define IDS_IRONGOLEM 510 +#define IDS_DESC_IRONGOLEM 511 +#define IDS_BAT 512 +#define IDS_DESC_BAT 513 +#define IDS_WITCH 514 +#define IDS_DESC_WITCH 515 +#define IDS_HORSE 516 +#define IDS_DESC_HORSE 517 +#define IDS_DONKEY 518 +#define IDS_DESC_DONKEY 519 +#define IDS_MULE 520 +#define IDS_DESC_MULE 521 +#define IDS_ZOMBIE_HORSE 522 +#define IDS_SKELETON_HORSE 523 +#define IDS_WITHER 524 +#define IDS_DESC_WITHER 525 +#define IDS_CREDITS_EXPLODANIM 526 +#define IDS_CREDITS_CONCEPTART 527 +#define IDS_CREDITS_CRUNCHER 528 +#define IDS_CREDITS_BULLYCOORD 529 +#define IDS_CREDITS_ORIGINALDESIGN 530 +#define IDS_CREDITS_PMPROD 531 +#define IDS_CREDITS_RESTOFMOJANG 532 +#define IDS_CREDITS_LEADPC 533 +#define IDS_CREDITS_CODENINJA 534 +#define IDS_CREDITS_CEO 535 +#define IDS_CREDITS_WCW 536 +#define IDS_CREDITS_CUSTOMERSUPPORT 537 +#define IDS_CREDITS_OFFICEDJ 538 +#define IDS_CREDITS_DESPROG 539 +#define IDS_CREDITS_DEVELOPER 540 +#define IDS_CREDITS_CHIEFARCHITECT 541 +#define IDS_CREDITS_ARTDEVELOPER 542 +#define IDS_CREDITS_GAMECRAFTER 543 +#define IDS_CREDITS_DOF 544 +#define IDS_CREDITS_MUSICANDSOUNDS 545 +#define IDS_CREDITS_PROGRAMMING 546 +#define IDS_CREDITS_ART 547 +#define IDS_CREDITS_QA 548 +#define IDS_CREDITS_EXECPRODUCER 549 +#define IDS_CREDITS_LEADPRODUCER 550 +#define IDS_CREDITS_PRODUCER 551 +#define IDS_CREDITS_TESTLEAD 552 +#define IDS_CREDITS_LEADTESTER 553 +#define IDS_CREDITS_DESIGNTEAM 554 +#define IDS_CREDITS_DEVELOPMENTTEAM 555 +#define IDS_CREDITS_RELEASEMANAGEMENT 556 +#define IDS_CREDITS_XBLADIRECTOR 557 +#define IDS_CREDITS_BIZDEV 558 +#define IDS_CREDITS_PORTFOLIODIRECTOR 559 +#define IDS_CREDITS_PRODUCTMANAGER 560 +#define IDS_CREDITS_MARKETING 561 +#define IDS_CREDITS_COMMUNITYMANAGER 562 +#define IDS_CREDITS_EUROPELOC 563 +#define IDS_CREDITS_REDMONDLOC 564 +#define IDS_CREDITS_ASIALOC 565 +#define IDS_CREDITS_USERRESEARCH 566 +#define IDS_CREDITS_MGSCENTRAL 567 +#define IDS_CREDITS_MILESTONEACCEPT 568 +#define IDS_CREDITS_SPECIALTHANKS 569 +#define IDS_CREDITS_TESTMANAGER 570 +#define IDS_CREDITS_SRTESTLEAD 571 +#define IDS_CREDITS_SDET 572 +#define IDS_CREDITS_PROJECT 573 +#define IDS_CREDITS_ADDITIONALSTE 574 +#define IDS_CREDITS_TESTASSOCIATES 575 +#define IDS_CREDITS_JON_KAGSTROM 576 +#define IDS_CREDITS_TOBIAS_MOLLSTAM 577 +#define IDS_CREDITS_RISE_LUGO 578 +#define IDS_ITEM_SWORD_WOOD 579 +#define IDS_ITEM_SWORD_STONE 580 +#define IDS_ITEM_SWORD_IRON 581 +#define IDS_ITEM_SWORD_DIAMOND 582 +#define IDS_ITEM_SWORD_GOLD 583 +#define IDS_ITEM_SHOVEL_WOOD 584 +#define IDS_ITEM_SHOVEL_STONE 585 +#define IDS_ITEM_SHOVEL_IRON 586 +#define IDS_ITEM_SHOVEL_DIAMOND 587 +#define IDS_ITEM_SHOVEL_GOLD 588 +#define IDS_ITEM_PICKAXE_WOOD 589 +#define IDS_ITEM_PICKAXE_STONE 590 +#define IDS_ITEM_PICKAXE_IRON 591 +#define IDS_ITEM_PICKAXE_DIAMOND 592 +#define IDS_ITEM_PICKAXE_GOLD 593 +#define IDS_ITEM_HATCHET_WOOD 594 +#define IDS_ITEM_HATCHET_STONE 595 +#define IDS_ITEM_HATCHET_IRON 596 +#define IDS_ITEM_HATCHET_DIAMOND 597 +#define IDS_ITEM_HATCHET_GOLD 598 +#define IDS_ITEM_HOE_WOOD 599 +#define IDS_ITEM_HOE_STONE 600 +#define IDS_ITEM_HOE_IRON 601 +#define IDS_ITEM_HOE_DIAMOND 602 +#define IDS_ITEM_HOE_GOLD 603 +#define IDS_ITEM_DOOR_WOOD 604 +#define IDS_ITEM_DOOR_IRON 605 +#define IDS_ITEM_HELMET_CHAIN 606 +#define IDS_ITEM_CHESTPLATE_CHAIN 607 +#define IDS_ITEM_LEGGINGS_CHAIN 608 +#define IDS_ITEM_BOOTS_CHAIN 609 +#define IDS_ITEM_HELMET_CLOTH 610 +#define IDS_ITEM_HELMET_IRON 611 +#define IDS_ITEM_HELMET_DIAMOND 612 +#define IDS_ITEM_HELMET_GOLD 613 +#define IDS_ITEM_CHESTPLATE_CLOTH 614 +#define IDS_ITEM_CHESTPLATE_IRON 615 +#define IDS_ITEM_CHESTPLATE_DIAMOND 616 +#define IDS_ITEM_CHESTPLATE_GOLD 617 +#define IDS_ITEM_LEGGINGS_CLOTH 618 +#define IDS_ITEM_LEGGINGS_IRON 619 +#define IDS_ITEM_LEGGINGS_DIAMOND 620 +#define IDS_ITEM_LEGGINGS_GOLD 621 +#define IDS_ITEM_BOOTS_CLOTH 622 +#define IDS_ITEM_BOOTS_IRON 623 +#define IDS_ITEM_BOOTS_DIAMOND 624 +#define IDS_ITEM_BOOTS_GOLD 625 +#define IDS_ITEM_INGOT_IRON 626 +#define IDS_ITEM_INGOT_GOLD 627 +#define IDS_ITEM_BUCKET 628 +#define IDS_ITEM_BUCKET_WATER 629 +#define IDS_ITEM_BUCKET_LAVA 630 +#define IDS_ITEM_FLINT_AND_STEEL 631 +#define IDS_ITEM_APPLE 632 +#define IDS_ITEM_BOW 633 +#define IDS_ITEM_ARROW 634 +#define IDS_ITEM_COAL 635 +#define IDS_ITEM_CHARCOAL 636 +#define IDS_ITEM_DIAMOND 637 +#define IDS_ITEM_STICK 638 +#define IDS_ITEM_BOWL 639 +#define IDS_ITEM_MUSHROOM_STEW 640 +#define IDS_ITEM_STRING 641 +#define IDS_ITEM_FEATHER 642 +#define IDS_ITEM_SULPHUR 643 +#define IDS_ITEM_WHEAT_SEEDS 644 +#define IDS_ITEM_WHEAT 645 +#define IDS_ITEM_BREAD 646 +#define IDS_ITEM_FLINT 647 +#define IDS_ITEM_PORKCHOP_RAW 648 +#define IDS_ITEM_PORKCHOP_COOKED 649 +#define IDS_ITEM_PAINTING 650 +#define IDS_ITEM_APPLE_GOLD 651 +#define IDS_ITEM_SIGN 652 +#define IDS_ITEM_MINECART 653 +#define IDS_ITEM_SADDLE 654 +#define IDS_ITEM_REDSTONE 655 +#define IDS_ITEM_SNOWBALL 656 +#define IDS_ITEM_BOAT 657 +#define IDS_ITEM_LEATHER 658 +#define IDS_ITEM_BUCKET_MILK 659 +#define IDS_ITEM_BRICK 660 +#define IDS_ITEM_CLAY 661 +#define IDS_ITEM_REEDS 662 +#define IDS_ITEM_PAPER 663 +#define IDS_ITEM_BOOK 664 +#define IDS_ITEM_SLIMEBALL 665 +#define IDS_ITEM_MINECART_CHEST 666 +#define IDS_ITEM_MINECART_FURNACE 667 +#define IDS_ITEM_EGG 668 +#define IDS_ITEM_COMPASS 669 +#define IDS_ITEM_FISHING_ROD 670 +#define IDS_ITEM_CLOCK 671 +#define IDS_ITEM_YELLOW_DUST 672 +#define IDS_ITEM_FISH_RAW 673 +#define IDS_ITEM_FISH_COOKED 674 +#define IDS_ITEM_DYE_POWDER 675 +#define IDS_ITEM_DYE_POWDER_BLACK 676 +#define IDS_ITEM_DYE_POWDER_RED 677 +#define IDS_ITEM_DYE_POWDER_GREEN 678 +#define IDS_ITEM_DYE_POWDER_BROWN 679 +#define IDS_ITEM_DYE_POWDER_BLUE 680 +#define IDS_ITEM_DYE_POWDER_PURPLE 681 +#define IDS_ITEM_DYE_POWDER_CYAN 682 +#define IDS_ITEM_DYE_POWDER_SILVER 683 +#define IDS_ITEM_DYE_POWDER_GRAY 684 +#define IDS_ITEM_DYE_POWDER_PINK 685 +#define IDS_ITEM_DYE_POWDER_LIME 686 +#define IDS_ITEM_DYE_POWDER_YELLOW 687 +#define IDS_ITEM_DYE_POWDER_LIGHT_BLUE 688 +#define IDS_ITEM_DYE_POWDER_MAGENTA 689 +#define IDS_ITEM_DYE_POWDER_ORANGE 690 +#define IDS_ITEM_DYE_POWDER_WHITE 691 +#define IDS_ITEM_BONE 692 +#define IDS_ITEM_SUGAR 693 +#define IDS_ITEM_CAKE 694 +#define IDS_ITEM_BED 695 +#define IDS_ITEM_DIODE 696 +#define IDS_ITEM_COOKIE 697 +#define IDS_ITEM_MAP 698 +#define IDS_ITEM_MAP_EMPTY 699 +#define IDS_ITEM_RECORD_01 700 +#define IDS_ITEM_RECORD_02 701 +#define IDS_ITEM_RECORD_03 702 +#define IDS_ITEM_RECORD_04 703 +#define IDS_ITEM_RECORD_05 704 +#define IDS_ITEM_RECORD_06 705 +#define IDS_ITEM_RECORD_07 706 +#define IDS_ITEM_RECORD_08 707 +#define IDS_ITEM_RECORD_09 708 +#define IDS_ITEM_RECORD_10 709 +#define IDS_ITEM_RECORD_11 710 +#define IDS_ITEM_RECORD_12 711 +#define IDS_ITEM_SHEARS 712 +#define IDS_ITEM_PUMPKIN_SEEDS 713 +#define IDS_ITEM_MELON_SEEDS 714 +#define IDS_ITEM_CHICKEN_RAW 715 +#define IDS_ITEM_CHICKEN_COOKED 716 +#define IDS_ITEM_BEEF_RAW 717 +#define IDS_ITEM_BEEF_COOKED 718 +#define IDS_ITEM_ROTTEN_FLESH 719 +#define IDS_ITEM_ENDER_PEARL 720 +#define IDS_ITEM_MELON_SLICE 721 +#define IDS_ITEM_BLAZE_ROD 722 +#define IDS_ITEM_GHAST_TEAR 723 +#define IDS_ITEM_GOLD_NUGGET 724 +#define IDS_ITEM_NETHER_STALK_SEEDS 725 +#define IDS_ITEM_POTION 726 +#define IDS_ITEM_GLASS_BOTTLE 727 +#define IDS_ITEM_WATER_BOTTLE 728 +#define IDS_ITEM_SPIDER_EYE 729 +#define IDS_ITEM_FERMENTED_SPIDER_EYE 730 +#define IDS_ITEM_BLAZE_POWDER 731 +#define IDS_ITEM_MAGMA_CREAM 732 +#define IDS_ITEM_BREWING_STAND 733 +#define IDS_ITEM_CAULDRON 734 +#define IDS_ITEM_EYE_OF_ENDER 735 +#define IDS_ITEM_SPECKLED_MELON 736 +#define IDS_ITEM_EXP_BOTTLE 737 +#define IDS_ITEM_FIREBALL 738 +#define IDS_ITEM_FIREBALLCHARCOAL 739 +#define IDS_ITEM_FIREBALLCOAL 740 +#define IDS_ITEM_ITEMFRAME 741 +#define IDS_ITEM_MONSTER_SPAWNER 742 +#define IDS_ITEM_NETHERBRICK 743 +#define IDS_ITEM_SKULL 744 +#define IDS_ITEM_SKULL_SKELETON 745 +#define IDS_ITEM_SKULL_WITHER 746 +#define IDS_ITEM_SKULL_ZOMBIE 747 +#define IDS_ITEM_SKULL_CHARACTER 748 +#define IDS_ITEM_SKULL_PLAYER 749 +#define IDS_ITEM_SKULL_CREEPER 750 +#define IDS_NETHER_STAR 751 +#define IDS_FIREWORKS 752 +#define IDS_FIREWORKS_CHARGE 753 +#define IDS_ITEM_COMPARATOR 754 +#define IDS_ITEM_MINECART_TNT 755 +#define IDS_ITEM_MINECART_HOPPER 756 +#define IDS_ITEM_IRON_HORSE_ARMOR 757 +#define IDS_ITEM_GOLD_HORSE_ARMOR 758 +#define IDS_ITEM_DIAMOND_HORSE_ARMOR 759 +#define IDS_ITEM_LEAD 760 +#define IDS_ITEM_NAME_TAG 761 +#define IDS_TILE_STONE 762 +#define IDS_TILE_GRASS 763 +#define IDS_TILE_DIRT 764 +#define IDS_TILE_STONE_BRICK 765 +#define IDS_TILE_OAKWOOD_PLANKS 766 +#define IDS_TILE_SPRUCEWOOD_PLANKS 767 +#define IDS_TILE_BIRCHWOOD_PLANKS 768 +#define IDS_TILE_JUNGLE_PLANKS 769 +#define IDS_TILE_PLANKS 770 +#define IDS_TILE_SAPLING 771 +#define IDS_TILE_SAPLING_OAK 772 +#define IDS_TILE_SAPLING_SPRUCE 773 +#define IDS_TILE_SAPLING_BIRCH 774 +#define IDS_TILE_SAPLING_JUNGLE 775 +#define IDS_TILE_BEDROCK 776 +#define IDS_TILE_WATER 777 +#define IDS_TILE_LAVA 778 +#define IDS_TILE_SAND 779 +#define IDS_TILE_SANDSTONE 780 +#define IDS_TILE_GRAVEL 781 +#define IDS_TILE_ORE_GOLD 782 +#define IDS_TILE_ORE_IRON 783 +#define IDS_TILE_ORE_COAL 784 +#define IDS_TILE_LOG 785 +#define IDS_TILE_LOG_OAK 786 +#define IDS_TILE_LOG_SPRUCE 787 +#define IDS_TILE_LOG_BIRCH 788 +#define IDS_TILE_LOG_JUNGLE 789 +#define IDS_TILE_OAK 790 +#define IDS_TILE_SPRUCE 791 +#define IDS_TILE_BIRCH 792 +#define IDS_TILE_LEAVES 793 +#define IDS_TILE_LEAVES_OAK 794 +#define IDS_TILE_LEAVES_SPRUCE 795 +#define IDS_TILE_LEAVES_BIRCH 796 +#define IDS_TILE_LEAVES_JUNGLE 797 +#define IDS_TILE_SPONGE 798 +#define IDS_TILE_GLASS 799 +#define IDS_TILE_CLOTH 800 +#define IDS_TILE_CLOTH_BLACK 801 +#define IDS_TILE_CLOTH_RED 802 +#define IDS_TILE_CLOTH_GREEN 803 +#define IDS_TILE_CLOTH_BROWN 804 +#define IDS_TILE_CLOTH_BLUE 805 +#define IDS_TILE_CLOTH_PURPLE 806 +#define IDS_TILE_CLOTH_CYAN 807 +#define IDS_TILE_CLOTH_SILVER 808 +#define IDS_TILE_CLOTH_GRAY 809 +#define IDS_TILE_CLOTH_PINK 810 +#define IDS_TILE_CLOTH_LIME 811 +#define IDS_TILE_CLOTH_YELLOW 812 +#define IDS_TILE_CLOTH_LIGHT_BLUE 813 +#define IDS_TILE_CLOTH_MAGENTA 814 +#define IDS_TILE_CLOTH_ORANGE 815 +#define IDS_TILE_CLOTH_WHITE 816 +#define IDS_TILE_FLOWER 817 +#define IDS_TILE_ROSE 818 +#define IDS_TILE_MUSHROOM 819 +#define IDS_TILE_BLOCK_GOLD 820 +#define IDS_DESC_BLOCK_GOLD 821 +#define IDS_DESC_BLOCK_IRON 822 +#define IDS_TILE_BLOCK_IRON 823 +#define IDS_TILE_STONESLAB 824 +#define IDS_TILE_STONESLAB_STONE 825 +#define IDS_TILE_STONESLAB_SAND 826 +#define IDS_TILE_STONESLAB_WOOD 827 +#define IDS_TILE_STONESLAB_COBBLE 828 +#define IDS_TILE_STONESLAB_BRICK 829 +#define IDS_TILE_STONESLAB_SMOOTHBRICK 830 +#define IDS_TILE_STONESLAB_OAK 831 +#define IDS_TILE_STONESLAB_SPRUCE 832 +#define IDS_TILE_STONESLAB_BIRCH 833 +#define IDS_TILE_STONESLAB_JUNGLE 834 +#define IDS_TILE_STONESLAB_NETHERBRICK 835 +#define IDS_TILE_BRICK 836 +#define IDS_TILE_TNT 837 +#define IDS_TILE_BOOKSHELF 838 +#define IDS_TILE_STONE_MOSS 839 +#define IDS_TILE_OBSIDIAN 840 +#define IDS_TILE_TORCH 841 +#define IDS_TILE_TORCHCOAL 842 +#define IDS_TILE_TORCHCHARCOAL 843 +#define IDS_TILE_FIRE 844 +#define IDS_TILE_MOB_SPAWNER 845 +#define IDS_TILE_STAIRS_WOOD 846 +#define IDS_TILE_CHEST 847 +#define IDS_TILE_REDSTONE_DUST 848 +#define IDS_TILE_ORE_DIAMOND 849 +#define IDS_TILE_BLOCK_DIAMOND 850 +#define IDS_DESC_BLOCK_DIAMOND 851 +#define IDS_TILE_WORKBENCH 852 +#define IDS_TILE_CROPS 853 +#define IDS_TILE_FARMLAND 854 +#define IDS_TILE_FURNACE 855 +#define IDS_TILE_SIGN 856 +#define IDS_TILE_DOOR_WOOD 857 +#define IDS_TILE_LADDER 858 +#define IDS_TILE_RAIL 859 +#define IDS_TILE_GOLDEN_RAIL 860 +#define IDS_TILE_DETECTOR_RAIL 861 +#define IDS_TILE_STAIRS_STONE 862 +#define IDS_TILE_LEVER 863 +#define IDS_TILE_PRESSURE_PLATE 864 +#define IDS_TILE_DOOR_IRON 865 +#define IDS_TILE_ORE_REDSTONE 866 +#define IDS_TILE_NOT_GATE 867 +#define IDS_TILE_BUTTON 868 +#define IDS_TILE_SNOW 869 +#define IDS_TILE_ICE 870 +#define IDS_TILE_CACTUS 871 +#define IDS_TILE_CLAY 872 +#define IDS_TILE_REEDS 873 +#define IDS_TILE_JUKEBOX 874 +#define IDS_TILE_FENCE 875 +#define IDS_TILE_PUMPKIN 876 +#define IDS_TILE_LIT_PUMPKIN 877 +#define IDS_TILE_HELL_ROCK 878 +#define IDS_TILE_HELL_SAND 879 +#define IDS_TILE_LIGHT_GEM 880 +#define IDS_TILE_PORTAL 881 +#define IDS_TILE_ORE_LAPIS 882 +#define IDS_TILE_BLOCK_LAPIS 883 +#define IDS_DESC_BLOCK_LAPIS 884 +#define IDS_TILE_DISPENSER 885 +#define IDS_TILE_MUSIC_BLOCK 886 +#define IDS_TILE_CAKE 887 +#define IDS_TILE_BED 888 +#define IDS_TILE_WEB 889 +#define IDS_TILE_TALL_GRASS 890 +#define IDS_TILE_DEAD_BUSH 891 +#define IDS_TILE_DIODE 892 +#define IDS_TILE_LOCKED_CHEST 893 +#define IDS_TILE_TRAPDOOR 894 +#define IDS_ANY_WOOL 895 +#define IDS_TILE_PISTON_BASE 896 +#define IDS_TILE_PISTON_STICK_BASE 897 +#define IDS_TILE_MONSTER_STONE_EGG 898 +#define IDS_TILE_STONE_BRICK_SMOOTH 899 +#define IDS_TILE_STONE_BRICK_SMOOTH_MOSSY 900 +#define IDS_TILE_STONE_BRICK_SMOOTH_CRACKED 901 +#define IDS_TILE_STONE_BRICK_SMOOTH_CHISELED 902 +#define IDS_TILE_HUGE_MUSHROOM_1 903 +#define IDS_TILE_HUGE_MUSHROOM_2 904 +#define IDS_TILE_IRON_FENCE 905 +#define IDS_TILE_THIN_GLASS 906 +#define IDS_TILE_MELON 907 +#define IDS_TILE_PUMPKIN_STEM 908 +#define IDS_TILE_MELON_STEM 909 +#define IDS_TILE_VINE 910 +#define IDS_TILE_FENCE_GATE 911 +#define IDS_TILE_STAIRS_BRICKS 912 +#define IDS_TILE_STAIRS_STONE_BRICKS_SMOOTH 913 +#define IDS_TILE_STONE_SILVERFISH 914 +#define IDS_TILE_STONE_SILVERFISH_COBBLESTONE 915 +#define IDS_TILE_STONE_SILVERFISH_STONE_BRICK 916 +#define IDS_TILE_MYCEL 917 +#define IDS_TILE_WATERLILY 918 +#define IDS_TILE_NETHERBRICK 919 +#define IDS_TILE_NETHERFENCE 920 +#define IDS_TILE_STAIRS_NETHERBRICK 921 +#define IDS_TILE_NETHERSTALK 922 +#define IDS_TILE_ENCHANTMENTTABLE 923 +#define IDS_TILE_BREWINGSTAND 924 +#define IDS_TILE_CAULDRON 925 +#define IDS_TILE_END_PORTAL 926 +#define IDS_TILE_ENDPORTALFRAME 927 +#define IDS_TILE_WHITESTONE 928 +#define IDS_TILE_DRAGONEGG 929 +#define IDS_TILE_SHRUB 930 +#define IDS_TILE_FERN 931 +#define IDS_TILE_STAIRS_SANDSTONE 932 +#define IDS_TILE_STAIRS_SPRUCEWOOD 933 +#define IDS_TILE_STAIRS_BIRCHWOOD 934 +#define IDS_TILE_STAIRS_JUNGLEWOOD 935 +#define IDS_TILE_REDSTONE_LIGHT 936 +#define IDS_TILE_COCOA 937 +#define IDS_TILE_SKULL 938 +#define IDS_TILE_COMMAND_BLOCK 939 +#define IDS_TILE_BEACON 940 +#define IDS_TILE_CHEST_TRAP 941 +#define IDS_TILE_WEIGHTED_PLATE_LIGHT 942 +#define IDS_TILE_WEIGHTED_PLATE_HEAVY 943 +#define IDS_TILE_COMPARATOR 944 +#define IDS_TILE_DAYLIGHT_DETECTOR 945 +#define IDS_TILE_REDSTONE_BLOCK 946 +#define IDS_TILE_HOPPER 947 +#define IDS_TILE_ACTIVATOR_RAIL 948 +#define IDS_TILE_DROPPER 949 +#define IDS_TILE_STAINED_CLAY 950 +#define IDS_TILE_HAY 951 +#define IDS_TILE_HARDENED_CLAY 952 +#define IDS_TILE_COAL 953 +#define IDS_TILE_STAINED_CLAY_BLACK 954 +#define IDS_TILE_STAINED_CLAY_RED 955 +#define IDS_TILE_STAINED_CLAY_GREEN 956 +#define IDS_TILE_STAINED_CLAY_BROWN 957 +#define IDS_TILE_STAINED_CLAY_BLUE 958 +#define IDS_TILE_STAINED_CLAY_PURPLE 959 +#define IDS_TILE_STAINED_CLAY_CYAN 960 +#define IDS_TILE_STAINED_CLAY_SILVER 961 +#define IDS_TILE_STAINED_CLAY_GRAY 962 +#define IDS_TILE_STAINED_CLAY_PINK 963 +#define IDS_TILE_STAINED_CLAY_LIME 964 +#define IDS_TILE_STAINED_CLAY_YELLOW 965 +#define IDS_TILE_STAINED_CLAY_LIGHT_BLUE 966 +#define IDS_TILE_STAINED_CLAY_MAGENTA 967 +#define IDS_TILE_STAINED_CLAY_ORANGE 968 +#define IDS_TILE_STAINED_CLAY_WHITE 969 +#define IDS_TILE_STAINED_GLASS 970 +#define IDS_TILE_STAINED_GLASS_BLACK 971 +#define IDS_TILE_STAINED_GLASS_RED 972 +#define IDS_TILE_STAINED_GLASS_GREEN 973 +#define IDS_TILE_STAINED_GLASS_BROWN 974 +#define IDS_TILE_STAINED_GLASS_BLUE 975 +#define IDS_TILE_STAINED_GLASS_PURPLE 976 +#define IDS_TILE_STAINED_GLASS_CYAN 977 +#define IDS_TILE_STAINED_GLASS_SILVER 978 +#define IDS_TILE_STAINED_GLASS_GRAY 979 +#define IDS_TILE_STAINED_GLASS_PINK 980 +#define IDS_TILE_STAINED_GLASS_LIME 981 +#define IDS_TILE_STAINED_GLASS_YELLOW 982 +#define IDS_TILE_STAINED_GLASS_LIGHT_BLUE 983 +#define IDS_TILE_STAINED_GLASS_MAGENTA 984 +#define IDS_TILE_STAINED_GLASS_ORANGE 985 +#define IDS_TILE_STAINED_GLASS_WHITE 986 +#define IDS_TILE_STAINED_GLASS_PANE 987 +#define IDS_TILE_STAINED_GLASS_PANE_BLACK 988 +#define IDS_TILE_STAINED_GLASS_PANE_RED 989 +#define IDS_TILE_STAINED_GLASS_PANE_GREEN 990 +#define IDS_TILE_STAINED_GLASS_PANE_BROWN 991 +#define IDS_TILE_STAINED_GLASS_PANE_BLUE 992 +#define IDS_TILE_STAINED_GLASS_PANE_PURPLE 993 +#define IDS_TILE_STAINED_GLASS_PANE_CYAN 994 +#define IDS_TILE_STAINED_GLASS_PANE_SILVER 995 +#define IDS_TILE_STAINED_GLASS_PANE_GRAY 996 +#define IDS_TILE_STAINED_GLASS_PANE_PINK 997 +#define IDS_TILE_STAINED_GLASS_PANE_LIME 998 +#define IDS_TILE_STAINED_GLASS_PANE_YELLOW 999 +#define IDS_TILE_STAINED_GLASS_PANE_LIGHT_BLUE 1000 +#define IDS_TILE_STAINED_GLASS_PANE_MAGENTA 1001 +#define IDS_TILE_STAINED_GLASS_PANE_ORANGE 1002 +#define IDS_TILE_STAINED_GLASS_PANE_WHITE 1003 +#define IDS_FIREWORKS_CHARGE_TYPE_0 1004 +#define IDS_FIREWORKS_CHARGE_TYPE_1 1005 +#define IDS_FIREWORKS_CHARGE_TYPE_2 1006 +#define IDS_FIREWORKS_CHARGE_TYPE_3 1007 +#define IDS_FIREWORKS_CHARGE_TYPE_4 1008 +#define IDS_FIREWORKS_CHARGE_TYPE 1009 +#define IDS_FIREWORKS_CHARGE_BLACK 1010 +#define IDS_FIREWORKS_CHARGE_RED 1011 +#define IDS_FIREWORKS_CHARGE_GREEN 1012 +#define IDS_FIREWORKS_CHARGE_BROWN 1013 +#define IDS_FIREWORKS_CHARGE_BLUE 1014 +#define IDS_FIREWORKS_CHARGE_PURPLE 1015 +#define IDS_FIREWORKS_CHARGE_CYAN 1016 +#define IDS_FIREWORKS_CHARGE_SILVER 1017 +#define IDS_FIREWORKS_CHARGE_GRAY 1018 +#define IDS_FIREWORKS_CHARGE_PINK 1019 +#define IDS_FIREWORKS_CHARGE_LIME 1020 +#define IDS_FIREWORKS_CHARGE_YELLOW 1021 +#define IDS_FIREWORKS_CHARGE_LIGHT_BLUE 1022 +#define IDS_FIREWORKS_CHARGE_MAGENTA 1023 +#define IDS_FIREWORKS_CHARGE_ORANGE 1024 +#define IDS_FIREWORKS_CHARGE_WHITE 1025 +#define IDS_FIREWORKS_CHARGE_CUSTOM 1026 +#define IDS_FIREWORKS_CHARGE_FADE_TO 1027 +#define IDS_FIREWORKS_CHARGE_FLICKER 1028 +#define IDS_FIREWORKS_CHARGE_TRAIL 1029 +#define IDS_ITEM_FIREWORKS_FLIGHT 1030 +#define IDS_CURRENT_LAYOUT 1031 +#define IDS_CONTROLS_LAYOUT 1032 +#define IDS_CONTROLS_MOVE 1033 +#define IDS_CONTROLS_LOOK 1034 +#define IDS_CONTROLS_PAUSE 1035 +#define IDS_CONTROLS_JUMP 1036 +#define IDS_CONTROLS_JUMPFLY 1037 +#define IDS_CONTROLS_INVENTORY 1038 +#define IDS_CONTROLS_HELDITEM 1039 +#define IDS_CONTROLS_ACTION 1040 +#define IDS_CONTROLS_USE 1041 +#define IDS_CONTROLS_CRAFTING 1042 +#define IDS_CONTROLS_DROP 1043 +#define IDS_CONTROLS_SNEAK 1044 +#define IDS_CONTROLS_SNEAKFLY 1045 +#define IDS_CONTROLS_THIRDPERSON 1046 +#define IDS_CONTROLS_PLAYERS 1047 +#define IDS_CONTROLS_DPAD 1048 +#define IDS_CONTROLS_SCHEME0 1049 +#define IDS_CONTROLS_SCHEME1 1050 +#define IDS_CONTROLS_SCHEME2 1051 +#define IDS_CONTROLLER_A 1052 +#define IDS_CONTROLLER_B 1053 +#define IDS_CONTROLLER_X 1054 +#define IDS_CONTROLLER_Y 1055 +#define IDS_CONTROLLER_LEFT_STICK 1056 +#define IDS_CONTROLLER_RIGHT_STICK 1057 +#define IDS_CONTROLLER_LEFT_TRIGGER 1058 +#define IDS_CONTROLLER_RIGHT_TRIGGER 1059 +#define IDS_CONTROLLER_LEFT_BUMPER 1060 +#define IDS_CONTROLLER_RIGHT_BUMPER 1061 +#define IDS_CONTROLLER_BACK 1062 +#define IDS_CONTROLLER_START 1063 +#define IDS_CONTROLLER_RIGHT_THUMBSTICK 1064 +#define IDS_CONTROLLER_LEFT_THUMBSTICK 1065 +#define IDS_CONTROLLER_DPAD_R 1066 +#define IDS_CONTROLLER_DPAD_L 1067 +#define IDS_CONTROLLER_DPAD_U 1068 +#define IDS_CONTROLLER_DPAD_D 1069 +#define IDS_ICON_SHANK_01 1070 +#define IDS_ICON_SHANK_03 1071 +#define IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE 1072 +#define IDS_TUTORIAL_PROMPT_START_TUTORIAL 1073 +#define IDS_TUTORIAL_TASK_OVERVIEW 1074 +#define IDS_TUTORIAL_TASK_LOOK 1075 +#define IDS_TUTORIAL_TASK_MOVE 1076 +#define IDS_TUTORIAL_TASK_SPRINT 1077 +#define IDS_TUTORIAL_TASK_JUMP 1078 +#define IDS_TUTORIAL_TASK_MINE 1079 +#define IDS_TUTORIAL_TASK_CHOP_WOOD 1080 +#define IDS_TUTORIAL_TASK_CRAFTING 1081 +#define IDS_TUTORIAL_TASK_INVENTORY 1082 +#define IDS_TUTORIAL_TASK_FOOD_BAR_DEPLETE 1083 +#define IDS_TUTORIAL_TASK_FOOD_BAR_HEAL 1084 +#define IDS_TUTORIAL_TASK_FOOD_BAR_FEED 1085 +#define IDS_TUTORIAL_TASK_FOOD_BAR_EAT_STEAK 1086 +#define IDS_TUTORIAL_TASK_CREATE_PLANKS 1087 +#define IDS_TUTORIAL_TASK_CREATE_CRAFTING_TABLE 1088 +#define IDS_TUTORIAL_TASK_CREATE_STICKS 1089 +#define IDS_TUTORIAL_TASK_SCROLL 1090 +#define IDS_TUTORIAL_TASK_USE 1091 +#define IDS_TUTORIAL_TASK_PLACE_WORKBENCH 1092 +#define IDS_TUTORIAL_TASK_OPEN_WORKBENCH 1093 +#define IDS_TUTORIAL_TASK_CREATE_WOODEN_SHOVEL 1094 +#define IDS_TUTORIAL_TASK_CREATE_WOODEN_HATCHET 1095 +#define IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE 1096 +#define IDS_TUTORIAL_TASK_OPEN_CONTAINER 1097 +#define IDS_TUTORIAL_TASK_NIGHT_DANGER 1098 +#define IDS_TUTORIAL_TASK_NEARBY_SHELTER 1099 +#define IDS_TUTORIAL_TASK_COLLECT_RESOURCES 1100 +#define IDS_TUTORIAL_TASK_MINE_STONE 1101 +#define IDS_TUTORIAL_TASK_CREATE_FURNACE 1102 +#define IDS_TUTORIAL_TASK_PLACE_AND_OPEN_FURNACE 1103 +#define IDS_TUTORIAL_TASK_CREATE_CHARCOAL 1104 +#define IDS_TUTORIAL_TASK_CREATE_GLASS 1105 +#define IDS_TUTORIAL_TASK_CREATE_WOODEN_DOOR 1106 +#define IDS_TUTORIAL_TASK_PLACE_DOOR 1107 +#define IDS_TUTORIAL_TASK_CREATE_TORCH 1108 +#define IDS_TUTORIAL_TASK_BASIC_COMPLETE 1109 +#define IDS_TUTORIAL_PROMPT_BASIC_COMPLETE 1110 +#define IDS_TUTORIAL_TASK_INV_OVERVIEW 1111 +#define IDS_TUTORIAL_PROMPT_INV_OVERVIEW 1112 +#define IDS_TUTORIAL_TASK_INV_PICK_UP 1113 +#define IDS_TUTORIAL_TASK_INV_MOVE 1114 +#define IDS_TUTORIAL_TASK_INV_DROP 1115 +#define IDS_TUTORIAL_TASK_INV_INFO 1116 +#define IDS_TUTORIAL_TASK_INV_EXIT 1117 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_OVERVIEW 1118 +#define IDS_TUTORIAL_PROMPT_CREATIVE_INV_OVERVIEW 1119 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_PICK_UP 1120 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_MOVE 1121 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_DROP 1122 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_NAV 1123 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_INFO 1124 +#define IDS_TUTORIAL_TASK_CREATIVE_INV_EXIT 1125 +#define IDS_TUTORIAL_TASK_CRAFT_OVERVIEW 1126 +#define IDS_TUTORIAL_PROMPT_CRAFT_OVERVIEW 1127 +#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_DESCRIPTION 1128 +#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INGREDIENTS 1129 +#define IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INVENTORY 1130 +#define IDS_TUTORIAL_TASK_CRAFT_NAV 1131 +#define IDS_TUTORIAL_TASK_CRAFT_CREATE 1132 +#define IDS_TUTORIAL_TASK_CRAFT_CRAFT_TABLE 1133 +#define IDS_TUTORIAL_TASK_CRAFT_INVENTORY 1134 +#define IDS_TUTORIAL_TASK_CRAFT_DESCRIPTION 1135 +#define IDS_TUTORIAL_TASK_CRAFT_INGREDIENTS 1136 +#define IDS_TUTORIAL_TASK_CRAFT_CREATE_PLANKS 1137 +#define IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_TABLE 1138 +#define IDS_TUTORIAL_TASK_CRAFT_SELECT_TOOLS 1139 +#define IDS_TUTORIAL_TASK_CRAFT_SELECT_STRUCTURES 1140 +#define IDS_TUTORIAL_TASK_CRAFT_SELECT_WOODEN_SHOVEL 1141 +#define IDS_TUTORIAL_TASK_CRAFT_SELECT_CRAFTING_TABLE 1142 +#define IDS_TUTORIAL_TASK_CRAFT_TOOLS_BUILT 1143 +#define IDS_TUTORIAL_TASK_CRAFT_CREATE_FURNACE 1144 +#define IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_FURNACE 1145 +#define IDS_TUTORIAL_TASK_FURNACE_OVERVIEW 1146 +#define IDS_TUTORIAL_PROMPT_FURNACE_OVERVIEW 1147 +#define IDS_TUTORIAL_TASK_FURNACE_METHOD 1148 +#define IDS_TUTORIAL_TASK_FURNACE_FUELS 1149 +#define IDS_TUTORIAL_TASK_FURNACE_INGREDIENTS 1150 +#define IDS_TUTORIAL_TASK_FURNACE_CREATE_CHARCOAL 1151 +#define IDS_TUTORIAL_TASK_FURNACE_CHARCOAL_USES 1152 +#define IDS_TUTORIAL_TASK_FURNACE_CREATE_GLASS 1153 +#define IDS_TUTORIAL_TASK_BREWING_MENU_OVERVIEW 1154 +#define IDS_TUTORIAL_PROMPT_BREWING_MENU_OVERVIEW 1155 +#define IDS_TUTORIAL_TASK_BREWING_MENU_METHOD 1156 +#define IDS_TUTORIAL_TASK_BREWING_MENU_BASIC_INGREDIENTS 1157 +#define IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS 1158 +#define IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS_2 1159 +#define IDS_TUTORIAL_TASK_BREWING_MENU_CREATE_FIRE_POTION 1160 +#define IDS_TUTORIAL_TASK_BREWING_MENU_EXIT 1161 +#define IDS_TUTORIAL_TASK_BREWING_OVERVIEW 1162 +#define IDS_TUTORIAL_PROMPT_BREWING_OVERVIEW 1163 +#define IDS_TUTORIAL_TASK_BREWING_GET_GLASS_BOTTLE 1164 +#define IDS_TUTORIAL_TASK_BREWING_FILL_GLASS_BOTTLE 1165 +#define IDS_TUTORIAL_TASK_BREWING_FILL_CAULDRON 1166 +#define IDS_TUTORIAL_TASK_BREWING_CREATE_FIRE_POTION 1167 +#define IDS_TUTORIAL_TASK_BREWING_USE_POTION 1168 +#define IDS_TUTORIAL_TASK_BREWING_DRINK_FIRE_POTION 1169 +#define IDS_TUTORIAL_TASK_BREWING_USE_EFFECTS 1170 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_OVERVIEW 1171 +#define IDS_TUTORIAL_PROMPT_ENCHANTING_MENU_OVERVIEW 1172 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_START 1173 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANTMENTS 1174 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_COST 1175 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANT 1176 +#define IDS_TUTORIAL_TASK_ENCHANTING_MENU_BETTER_ENCHANTMENTS 1177 +#define IDS_TUTORIAL_TASK_ENCHANTING_OVERVIEW 1178 +#define IDS_TUTORIAL_PROMPT_ENCHANTING_OVERVIEW 1179 +#define IDS_TUTORIAL_TASK_ENCHANTING_SUMMARY 1180 +#define IDS_TUTORIAL_TASK_ENCHANTING_BOOKCASES 1181 +#define IDS_TUTORIAL_TASK_ENCHANTING_EXPERIENCE 1182 +#define IDS_TUTORIAL_TASK_ENCHANTING_BOTTLE_O_ENCHANTING 1183 +#define IDS_TUTORIAL_TASK_ENCHANTING_USE_CHESTS 1184 +#define IDS_TUTORIAL_TASK_MINECART_OVERVIEW 1185 +#define IDS_TUTORIAL_PROMPT_MINECART_OVERVIEW 1186 +#define IDS_TUTORIAL_TASK_MINECART_RAILS 1187 +#define IDS_TUTORIAL_TASK_MINECART_POWERED_RAILS 1188 +#define IDS_TUTORIAL_TASK_BOAT_OVERVIEW 1189 +#define IDS_TUTORIAL_PROMPT_BOAT_OVERVIEW 1190 +#define IDS_TUTORIAL_TASK_BOAT_STEER 1191 +#define IDS_TUTORIAL_TASK_FISHING_OVERVIEW 1192 +#define IDS_TUTORIAL_PROMPT_FISHING_OVERVIEW 1193 +#define IDS_TUTORIAL_TASK_FISHING_CAST 1194 +#define IDS_TUTORIAL_TASK_FISHING_FISH 1195 +#define IDS_TUTORIAL_TASK_FISHING_USES 1196 +#define IDS_TUTORIAL_TASK_BED_OVERVIEW 1197 +#define IDS_TUTORIAL_PROMPT_BED_OVERVIEW 1198 +#define IDS_TUTORIAL_TASK_BED_PLACEMENT 1199 +#define IDS_TUTORIAL_TASK_BED_MULTIPLAYER 1200 +#define IDS_TUTORIAL_REDSTONE_OVERVIEW 1201 +#define IDS_TUTORIAL_PROMPT_REDSTONE_OVERVIEW 1202 +#define IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES 1203 +#define IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES_POSITION 1204 +#define IDS_TUTORIAL_TASK_REDSTONE_DUST 1205 +#define IDS_TUTORIAL_TASK_REDSTONE_REPEATER 1206 +#define IDS_TUTORIAL_TASK_PISTONS 1207 +#define IDS_TUTORIAL_TASK_TRY_IT 1208 +#define IDS_TUTORIAL_PORTAL_OVERVIEW 1209 +#define IDS_TUTORIAL_PROMPT_PORTAL_OVERVIEW 1210 +#define IDS_TUTORIAL_TASK_BUILD_PORTAL 1211 +#define IDS_TUTORIAL_TASK_ACTIVATE_PORTAL 1212 +#define IDS_TUTORIAL_TASK_USE_PORTAL 1213 +#define IDS_TUTORIAL_TASK_NETHER 1214 +#define IDS_TUTORIAL_TASK_NETHER_FAST_TRAVEL 1215 +#define IDS_TUTORIAL_CREATIVE_OVERVIEW 1216 +#define IDS_TUTORIAL_PROMPT_CREATIVE_OVERVIEW 1217 +#define IDS_TUTORIAL_TASK_CREATIVE_MODE 1218 +#define IDS_TUTORIAL_TASK_OPEN_CREATIVE_INVENTORY 1219 +#define IDS_TUTORIAL_TASK_CREATIVE_EXIT 1220 +#define IDS_TUTORIAL_TASK_CREATIVE_COMPLETE 1221 +#define IDS_TUTORIAL_FARMING_OVERVIEW 1222 +#define IDS_TUTORIAL_PROMPT_FARMING_OVERVIEW 1223 +#define IDS_TUTORIAL_TASK_FARMING_SEEDS 1224 +#define IDS_TUTORIAL_TASK_FARMING_FARMLAND 1225 +#define IDS_TUTORIAL_TASK_FARMING_WHEAT 1226 +#define IDS_TUTORIAL_TASK_FARMING_PUMPKIN_AND_MELON 1227 +#define IDS_TUTORIAL_TASK_FARMING_SUGARCANE 1228 +#define IDS_TUTORIAL_TASK_FARMING_CACTUS 1229 +#define IDS_TUTORIAL_TASK_FARMING_MUSHROOM 1230 +#define IDS_TUTORIAL_TASK_FARMING_BONEMEAL 1231 +#define IDS_TUTORIAL_TASK_FARMING_COMPLETE 1232 +#define IDS_TUTORIAL_BREEDING_OVERVIEW 1233 +#define IDS_TUTORIAL_PROMPT_BREEDING_OVERVIEW 1234 +#define IDS_TUTORIAL_TASK_BREEDING_FEED 1235 +#define IDS_TUTORIAL_TASK_BREEDING_FEED_FOOD 1236 +#define IDS_TUTORIAL_TASK_BREEDING_BABY 1237 +#define IDS_TUTORIAL_TASK_BREEDING_DELAY 1238 +#define IDS_TUTORIAL_TASK_BREEDING_FOLLOW 1239 +#define IDS_TUTORIAL_TASK_BREEDING_WOLF_TAMING 1240 +#define IDS_TUTORIAL_TASK_BREEDING_COMPLETE 1241 +#define IDS_TUTORIAL_GOLEM_OVERVIEW 1242 +#define IDS_TUTORIAL_PROMPT_GOLEM_OVERVIEW 1243 +#define IDS_TUTORIAL_TASK_GOLEM_PUMPKIN 1244 +#define IDS_TUTORIAL_TASK_GOLEM_SNOW 1245 +#define IDS_TUTORIAL_TASK_GOLEM_IRON 1246 +#define IDS_TUTORIAL_TASK_GOLEM_IRON_VILLAGE 1247 +#define IDS_TUTORIAL_CONSTRAINT_TUTORIAL_AREA 1248 +#define IDS_TUTORIAL_HINT_DIGGER_ITEM_SHOVEL 1249 +#define IDS_TUTORIAL_HINT_DIGGER_ITEM_HATCHET 1250 +#define IDS_TUTORIAL_HINT_DIGGER_ITEM_PICKAXE 1251 +#define IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL 1252 +#define IDS_TUTORIAL_HINT_HOLD_TO_MINE 1253 +#define IDS_TUTORIAL_HINT_TOOL_DAMAGED 1254 +#define IDS_TUTORIAL_HINT_SWIM_UP 1255 +#define IDS_TUTORIAL_HINT_MINECART 1256 +#define IDS_TUTORIAL_HINT_BOAT 1257 +#define IDS_TUTORIAL_HINT_FISHING 1258 +#define IDS_TUTORIAL_HINT_PISTON_SELF_REPAIRING_BRIDGE 1259 +#define IDS_TUTORIAL_HINT_INV_DROP 1260 +#define IDS_TUTORIAL_HINT_CRAFT_NO_INGREDIENTS 1261 +#define IDS_TUTORIAL_COMPLETED 1262 +#define IDS_TUTORIAL_COMPLETED_EXPLORE 1263 +#define IDS_TUTORIAL_REMINDER 1264 +#define IDS_TUTORIAL_HTML_EXIT_PICTURE 1265 +#define IDS_TUTORIAL_NEW_FEATURES_CHOICE 1266 +#define IDS_TUTORIAL_PROMPT_NEW_FEATURES_CHOICE 1267 +#define IDS_TUTORIAL_FEATURES_IN_THIS_AREA 1268 +#define IDS_TUTORIAL_FEATURES_OUTSIDE_THIS_AREA 1269 +#define IDS_TUTORIAL_TASK_FOOD_BAR_OVERVIEW 1270 +#define IDS_TUTORIAL_PROMPT_FOOD_BAR_OVERVIEW 1271 +#define IDS_TUTORIAL_TASK_HORSE_MENU_OVERVIEW 1272 +#define IDS_TUTORIAL_PROMPT_HORSE_MENU_OVERVIEW 1273 +#define IDS_TUTORIAL_TASK_HORSE_MENU_LAYOUT 1274 +#define IDS_TUTORIAL_TASK_HORSE_MENU_EQUIPMENT 1275 +#define IDS_TUTORIAL_TASK_HORSE_MENU_SADDLEBAGS 1276 +#define IDS_TUTORIAL_TASK_HORSE_OVERVIEW 1277 +#define IDS_TUTORIAL_TASK_DONKEY_OVERVIEW 1278 +#define IDS_TUTORIAL_TASK_MULE_OVERVIEW 1279 +#define IDS_TUTORIAL_PROMPT_HORSE_OVERVIEW 1280 +#define IDS_TUTORIAL_TASK_HORSE_INTRO 1281 +#define IDS_TUTORIAL_TASK_HORSE_PURPOSE 1282 +#define IDS_TUTORIAL_TASK_HORSE_TAMING 1283 +#define IDS_TUTORIAL_TASK_HORSE_TAMING2 1284 +#define IDS_TUTORIAL_TASK_HORSE_RIDE 1285 +#define IDS_TUTORIAL_TASK_HORSE_SADDLES 1286 +#define IDS_TUTORIAL_TASK_HORSE_SADDLEBAGS 1287 +#define IDS_TUTORIAL_TASK_HORSE_BREEDING 1288 +#define IDS_TUTORIAL_TASK_HORSE_AREA 1289 +#define IDS_TUTORIAL_TASK_BEACON_MENU_OVERVIEW 1290 +#define IDS_TUTORIAL_PROMPT_BEACON_MENU_OVERVIEW 1291 +#define IDS_TUTORIAL_TASK_BEACON_MENU_PRIMARY_POWERS 1292 +#define IDS_TUTORIAL_TASK_BEACON_MENU_SECONDARY_POWER 1293 +#define IDS_TUTORIAL_TASK_BEACON_MENU_ACTIVATION 1294 +#define IDS_TUTORIAL_TASK_BEACON_OVERVIEW 1295 +#define IDS_TUTORIAL_PROMPT_BEACON_OVERVIEW 1296 +#define IDS_TUTORIAL_TASK_BEACON_PURPOSE 1297 +#define IDS_TUTORIAL_TASK_BEACON_DESIGN 1298 +#define IDS_TUTORIAL_TASK_BEACON_CHOOSING_POWERS 1299 +#define IDS_TUTORIAL_TASK_HOPPER_OVERVIEW 1300 +#define IDS_TUTORIAL_PROMPT_HOPPER_OVERVIEW 1301 +#define IDS_TUTORIAL_TASK_HOPPER_PURPOSE 1302 +#define IDS_TUTORIAL_TASK_HOPPER_CONTAINERS 1303 +#define IDS_TUTORIAL_TASK_HOPPER_MECHANICS 1304 +#define IDS_TUTORIAL_TASK_HOPPER_REDSTONE 1305 +#define IDS_TUTORIAL_TASK_HOPPER_OUTPUT 1306 +#define IDS_TUTORIAL_TASK_HOPPER_AREA 1307 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_OVERVIEW 1308 +#define IDS_TUTORIAL_PROMPT_FIREWORK_MENU_OVERVIEW 1309 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_START 1310 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_STARS 1311 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_HEIGHT 1312 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_BASIC_CRAFT 1313 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_START 1314 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_COLOUR 1315 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_SHAPE 1316 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_EFFECT 1317 +#define IDS_TUTORIAL_TASK_FIREWORK_MENU_ADV_FADE 1318 +#define IDS_TUTORIAL_TASK_FIREWORK_OVERVIEW 1319 +#define IDS_TUTORIAL_PROMPT_FIREWORK_OVERVIEW 1320 +#define IDS_TUTORIAL_TASK_FIREWORK_PURPOSE 1321 +#define IDS_TUTORIAL_TASK_FIREWORK_CUSTOMISE 1322 +#define IDS_TUTORIAL_TASK_FIREWORK_CRAFTING 1323 +#define IDS_TOOLTIPS_SELECT 1324 +#define IDS_TOOLTIPS_USE 1325 +#define IDS_TOOLTIPS_BACK 1326 +#define IDS_TOOLTIPS_EXIT 1327 +#define IDS_TOOLTIPS_CANCEL 1328 +#define IDS_TOOLTIPS_CANCEL_JOIN 1329 +#define IDS_TOOLTIPS_REFRESH 1330 +#define IDS_TOOLTIPS_PARTY_GAMES 1331 +#define IDS_TOOLTIPS_ALL_GAMES 1332 +#define IDS_TOOLTIPS_CHANGE_GROUP 1333 +#define IDS_TOOLTIPS_SHOW_INVENTORY 1334 +#define IDS_TOOLTIPS_SHOW_DESCRIPTION 1335 +#define IDS_TOOLTIPS_SHOW_INGREDIENTS 1336 +#define IDS_TOOLTIPS_CRAFTING 1337 +#define IDS_TOOLTIPS_CREATE 1338 +#define IDS_TOOLTIPS_PICKUPPLACE 1339 +#define IDS_TOOLTIPS_PICKUP_GENERIC 1340 +#define IDS_TOOLTIPS_PICKUP_ALL 1341 +#define IDS_TOOLTIPS_PICKUP_HALF 1342 +#define IDS_TOOLTIPS_PLACE_GENERIC 1343 +#define IDS_TOOLTIPS_PLACE_ALL 1344 +#define IDS_TOOLTIPS_PLACE_ONE 1345 +#define IDS_TOOLTIPS_DROP_GENERIC 1346 +#define IDS_TOOLTIPS_DROP_ALL 1347 +#define IDS_TOOLTIPS_DROP_ONE 1348 +#define IDS_TOOLTIPS_SWAP 1349 +#define IDS_TOOLTIPS_QUICK_MOVE 1350 +#define IDS_TOOLTIPS_CLEAR_QUICK_SELECT 1351 +#define IDS_TOOLTIPS_WHAT_IS_THIS 1352 +#define IDS_TOOLTIPS_SHARE 1353 +#define IDS_TOOLTIPS_CHANGE_FILTER 1354 +#define IDS_TOOLTIPS_SEND_FRIEND_REQUEST 1355 +#define IDS_TOOLTIPS_PAGE_DOWN 1356 +#define IDS_TOOLTIPS_PAGE_UP 1357 +#define IDS_TOOLTIPS_NEXT 1358 +#define IDS_TOOLTIPS_PREVIOUS 1359 +#define IDS_TOOLTIPS_KICK 1360 +#define IDS_TOOLTIPS_DYE 1361 +#define IDS_TOOLTIPS_MINE 1362 +#define IDS_TOOLTIPS_FEED 1363 +#define IDS_TOOLTIPS_TAME 1364 +#define IDS_TOOLTIPS_HEAL 1365 +#define IDS_TOOLTIPS_SIT 1366 +#define IDS_TOOLTIPS_FOLLOWME 1367 +#define IDS_TOOLTIPS_EJECT 1368 +#define IDS_TOOLTIPS_EMPTY 1369 +#define IDS_TOOLTIPS_SADDLE 1370 +#define IDS_TOOLTIPS_PLACE 1371 +#define IDS_TOOLTIPS_HIT 1372 +#define IDS_TOOLTIPS_MILK 1373 +#define IDS_TOOLTIPS_COLLECT 1374 +#define IDS_TOOLTIPS_EAT 1375 +#define IDS_TOOLTIPS_SLEEP 1376 +#define IDS_TOOLTIPS_WAKEUP 1377 +#define IDS_TOOLTIPS_PLAY 1378 +#define IDS_TOOLTIPS_RIDE 1379 +#define IDS_TOOLTIPS_SAIL 1380 +#define IDS_TOOLTIPS_GROW 1381 +#define IDS_TOOLTIPS_SWIMUP 1382 +#define IDS_TOOLTIPS_OPEN 1383 +#define IDS_TOOLTIPS_CHANGEPITCH 1384 +#define IDS_TOOLTIPS_DETONATE 1385 +#define IDS_TOOLTIPS_READ 1386 +#define IDS_TOOLTIPS_HANG 1387 +#define IDS_TOOLTIPS_THROW 1388 +#define IDS_TOOLTIPS_PLANT 1389 +#define IDS_TOOLTIPS_TILL 1390 +#define IDS_TOOLTIPS_HARVEST 1391 +#define IDS_TOOLTIPS_CONTINUE 1392 +#define IDS_TOOLTIPS_UNLOCKFULLVERSION 1393 +#define IDS_TOOLTIPS_DELETESAVE 1394 +#define IDS_TOOLTIPS_DELETE 1395 +#define IDS_TOOLTIPS_OPTIONS 1396 +#define IDS_TOOLTIPS_INVITE_FRIENDS 1397 +#define IDS_TOOLTIPS_ACCEPT 1398 +#define IDS_TOOLTIPS_SHEAR 1399 +#define IDS_TOOLTIPS_BANLEVEL 1400 +#define IDS_TOOLTIPS_SELECT_SKIN 1401 +#define IDS_TOOLTIPS_IGNITE 1402 +#define IDS_TOOLTIPS_NAVIGATE 1403 +#define IDS_TOOLTIPS_INSTALL_FULL 1404 +#define IDS_TOOLTIPS_INSTALL_TRIAL 1405 +#define IDS_TOOLTIPS_INSTALL 1406 +#define IDS_TOOLTIPS_REINSTALL 1407 +#define IDS_TOOLTIPS_SAVEOPTIONS 1408 +#define IDS_TOOLTIPS_EXECUTE_COMMAND 1409 +#define IDS_TOOLTIPS_CREATIVE 1410 +#define IDS_TOOLTIPS_QUICK_MOVE_INGREDIENT 1411 +#define IDS_TOOLTIPS_QUICK_MOVE_FUEL 1412 +#define IDS_TOOLTIPS_QUICK_MOVE_TOOL 1413 +#define IDS_TOOLTIPS_QUICK_MOVE_ARMOR 1414 +#define IDS_TOOLTIPS_QUICK_MOVE_WEAPON 1415 +#define IDS_TOOLTIPS_EQUIP 1416 +#define IDS_TOOLTIPS_DRAW_BOW 1417 +#define IDS_TOOLTIPS_RELEASE_BOW 1418 +#define IDS_TOOLTIPS_PRIVILEGES 1419 +#define IDS_TOOLTIPS_BLOCK 1420 +#define IDS_TOOLTIPS_PAGEUP 1421 +#define IDS_TOOLTIPS_PAGEDOWN 1422 +#define IDS_TOOLTIPS_LOVEMODE 1423 +#define IDS_TOOLTIPS_DRINK 1424 +#define IDS_TOOLTIPS_ROTATE 1425 +#define IDS_TOOLTIPS_CLEARSLOTS 1426 +#define IDS_TOOLTIPS_MOUNT 1427 +#define IDS_TOOLTIPS_DISMOUNT 1428 +#define IDS_TOOLTIPS_SADDLEBAGS 1429 +#define IDS_TOOLTIPS_FIREWORK_LAUNCH 1430 +#define IDS_TOOLTIPS_LEASH 1431 +#define IDS_TOOLTIPS_UNLEASH 1432 +#define IDS_TOOLTIPS_ATTACH 1433 +#define IDS_TOOLTIPS_NAME 1434 +#define IDS_CONFIRM_OK 1435 +#define IDS_CONFIRM_CANCEL 1436 +#define IDS_DOWNLOADABLECONTENT 1437 +#define IDS_CONFIRM_LEAVE_VIA_INVITE 1438 +#define IDS_EXIT_GAME 1439 +#define IDS_TITLE_SAVE_GAME 1440 +#define IDS_TITLE_DECLINE_SAVE_GAME 1441 +#define IDS_CONFIRM_SAVE_GAME 1442 +#define IDS_CONFIRM_DECLINE_SAVE_GAME 1443 +#define IDS_TITLE_START_GAME 1444 +#define IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE 1445 +#define IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT 1446 +#define IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE 1447 +#define IDS_EXIT_GAME_SAVE 1448 +#define IDS_EXIT_GAME_NO_SAVE 1449 +#define IDS_CONFIRM_EXIT_GAME 1450 +#define IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST 1451 +#define IDS_CREATE_NEW_WORLD 1452 +#define IDS_PLAY_TUTORIAL 1453 +#define IDS_TUTORIALSAVENAME 1454 +#define IDS_NAME_WORLD 1455 +#define IDS_NAME_WORLD_TEXT 1456 +#define IDS_CREATE_NEW_WORLD_SEEDTEXT 1457 +#define IDS_LOAD_SAVED_WORLD 1458 +#define IDS_PRESS_START_TO_JOIN 1459 +#define IDS_EXITING_GAME 1460 +#define IDS_GENERIC_ERROR 1461 +#define IDS_CONNECTION_FAILED 1462 +#define IDS_CONNECTION_LOST 1463 +#define IDS_CONNECTION_LOST_SERVER 1464 +#define IDS_DISCONNECTED 1465 +#define IDS_DISCONNECTED_KICKED 1466 +#define IDS_DISCONNECTED_FLYING 1467 +#define IDS_DISCONNECTED_LOGIN_TOO_LONG 1468 +#define IDS_DISCONNECTED_SERVER_FULL 1469 +#define IDS_DISCONNECTED_SERVER_QUIT 1470 +#define IDS_DISCONNECTED_NO_FRIENDS_IN_GAME 1471 +#define IDS_DISCONNECTED_BANNED 1472 +#define IDS_DISCONNECTED_SERVER_OLD 1473 +#define IDS_DISCONNECTED_CLIENT_OLD 1474 +#define IDS_DEFAULT_SAVENAME 1475 +#define IDS_AWARD_TITLE 1476 +#define IDS_AWARD_GAMERPIC1 1477 +#define IDS_AWARD_GAMERPIC2 1478 +#define IDS_UNLOCK_TITLE 1479 +#define IDS_UNLOCK_TOSAVE_TEXT 1480 +#define IDS_LEADERBOARD_LOADING 1481 +#define IDS_LEADERBOARD_NORESULTS 1482 +#define IDS_LEADERBOARD_FILTER 1483 +#define IDS_LEADERBOARD_FILTER_FRIENDS 1484 +#define IDS_LEADERBOARD_FILTER_MYSCORE 1485 +#define IDS_LEADERBOARD_FILTER_OVERALL 1486 +#define IDS_LEADERBOARD_ENTRIES 1487 +#define IDS_LEADERBOARD_RANK 1488 +#define IDS_PROGRESS_SAVING_LEVEL 1489 +#define IDS_PROGRESS_SAVING_CHUNKS 1490 +#define IDS_PROGRESS_SAVING_TO_DISC 1491 +#define IDS_PROGRESS_BUILDING_TERRAIN 1492 +#define IDS_PROGRESS_SIMULATING_WORLD 1493 +#define IDS_PROGRESS_INITIALISING_SERVER 1494 +#define IDS_PROGRESS_GENERATING_SPAWN_AREA 1495 +#define IDS_PROGRESS_LOADING_SPAWN_AREA 1496 +#define IDS_PROGRESS_ENTERING_NETHER 1497 +#define IDS_PROGRESS_LEAVING_NETHER 1498 +#define IDS_PROGRESS_RESPAWNING 1499 +#define IDS_PROGRESS_GENERATING_LEVEL 1500 +#define IDS_PROGRESS_LOADING_LEVEL 1501 +#define IDS_PROGRESS_SAVING_PLAYERS 1502 +#define IDS_PROGRESS_CONNECTING 1503 +#define IDS_PROGRESS_DOWNLOADING_TERRAIN 1504 +#define IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME 1505 +#define IDS_PROGRESS_HOST_SAVING 1506 +#define IDS_PROGRESS_ENTERING_END 1507 +#define IDS_PROGRESS_LEAVING_END 1508 +#define IDS_PROGRESS_NEW_WORLD_SEED 1509 +#define IDS_TILE_BED_OCCUPIED 1510 +#define IDS_TILE_BED_NO_SLEEP 1511 +#define IDS_TILE_BED_PLAYERSLEEP 1512 +#define IDS_TILE_BED_NOT_VALID 1513 +#define IDS_TILE_BED_NOTSAFE 1514 +#define IDS_TILE_BED_MESLEEP 1515 +#define IDS_GROUPNAME_TOOLS 1516 +#define IDS_GROUPNAME_WEAPONS 1517 +#define IDS_GROUPNAME_FOOD 1518 +#define IDS_GROUPNAME_STRUCTURES 1519 +#define IDS_GROUPNAME_ARMOUR 1520 +#define IDS_GROUPNAME_MECHANISMS 1521 +#define IDS_GROUPNAME_TRANSPORT 1522 +#define IDS_GROUPNAME_DECORATIONS 1523 +#define IDS_GROUPNAME_BUILDING_BLOCKS 1524 +#define IDS_GROUPNAME_REDSTONE_AND_TRANSPORT 1525 +#define IDS_GROUPNAME_MISCELLANEOUS 1526 +#define IDS_GROUPNAME_POTIONS 1527 +#define IDS_GROUPNAME_TOOLS_WEAPONS_ARMOR 1528 +#define IDS_GROUPNAME_MATERIALS 1529 +#define IDS_RETURNEDTOMENU_TITLE 1530 +#define IDS_SLIDER_DIFFICULTY 1531 +#define IDS_SLIDER_MUSIC 1532 +#define IDS_SLIDER_SOUND 1533 +#define IDS_SLIDER_GAMMA 1534 +#define IDS_SLIDER_SENSITIVITY_INGAME 1535 +#define IDS_SLIDER_SENSITIVITY_INMENU 1536 +#define IDS_DIFFICULTY_TITLE_PEACEFUL 1537 +#define IDS_DIFFICULTY_TITLE_EASY 1538 +#define IDS_DIFFICULTY_TITLE_NORMAL 1539 +#define IDS_DIFFICULTY_TITLE_HARD 1540 +#define IDS_DIFFICULTY_PEACEFUL 1541 +#define IDS_DIFFICULTY_EASY 1542 +#define IDS_DIFFICULTY_NORMAL 1543 +#define IDS_DIFFICULTY_HARD 1544 +#define IDS_TRIALOVER_TITLE 1545 +#define IDS_MULTIPLAYER_FULL_TITLE 1546 +#define IDS_MULTIPLAYER_FULL_TEXT 1547 +#define IDS_SIGN_TITLE 1548 +#define IDS_SIGN_TITLE_TEXT 1549 +#define IDS_NAME_TITLE 1550 +#define IDS_NAME_TITLE_TEXT 1551 +#define IDS_NAME_CAPTION 1552 +#define IDS_NAME_CAPTION_TEXT 1553 +#define IDS_NAME_DESC 1554 +#define IDS_NAME_DESC_TEXT 1555 +#define IDS_INVENTORY 1556 +#define IDS_INGREDIENTS 1557 +#define IDS_BREWING_STAND 1558 +#define IDS_CHEST 1559 +#define IDS_ENCHANT 1560 +#define IDS_FURNACE 1561 +#define IDS_INGREDIENT 1562 +#define IDS_FUEL 1563 +#define IDS_DISPENSER 1564 +#define IDS_CONTAINER_ANIMAL 1565 +#define IDS_CONTAINER_DROPPER 1566 +#define IDS_CONTAINER_HOPPER 1567 +#define IDS_CONTAINER_BEACON 1568 +#define IDS_CONTAINER_BEACON_PRIMARY_POWER 1569 +#define IDS_CONTAINER_BEACON_SECONDARY_POWER 1570 +#define IDS_CONTAINER_MINECART 1571 +#define IDS_NO_DLCOFFERS 1572 +#define IDS_PLAYER_JOINED 1573 +#define IDS_PLAYER_LEFT 1574 +#define IDS_PLAYER_KICKED 1575 +#define IDS_TEXT_DELETE_SAVE 1576 +#define IDS_STRINGVERIFY_AWAITING_APPROVAL 1577 +#define IDS_STRINGVERIFY_CENSORED 1578 +#define IDS_NOWPLAYING 1579 +#define IDS_DEFAULTS_TITLE 1580 +#define IDS_DEFAULTS_TEXT 1581 +#define IDS_FATAL_ERROR_TITLE 1582 +#define IDS_GAME_HOST_NAME 1583 +#define IDS_GAME_HOST_NAME_UNKNOWN 1584 +#define IDS_GUEST_ORDER_CHANGED_TITLE 1585 +#define IDS_GUEST_ORDER_CHANGED_TEXT 1586 +#define IDS_MUST_SIGN_IN_TITLE 1587 +#define IDS_MUST_SIGN_IN_TEXT 1588 +#define IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE 1589 +#define IDS_FAILED_TO_CREATE_GAME_TITLE 1590 +#define IDS_DEFAULT_SKINS 1591 +#define IDS_NO_SKIN_PACK 1592 +#define IDS_FAVORITES_SKIN_PACK 1593 +#define IDS_BANNED_LEVEL_TITLE 1594 +#define IDS_PLAYER_BANNED_LEVEL 1595 +#define IDS_ACTION_BAN_LEVEL_TITLE 1596 +#define IDS_ACTION_BAN_LEVEL_DESCRIPTION 1597 +#define IDS_BUTTON_REMOVE_FROM_BAN_LIST 1598 +#define IDS_SLIDER_AUTOSAVE 1599 +#define IDS_SLIDER_AUTOSAVE_OFF 1600 +#define IDS_MINUTES 1601 +#define IDS_CANT_PLACE_NEAR_SPAWN_TITLE 1602 +#define IDS_CANT_PLACE_NEAR_SPAWN_TEXT 1603 +#define IDS_SLIDER_INTERFACEOPACITY 1604 +#define IDS_PROGRESS_AUTOSAVING_LEVEL 1605 +#define IDS_SLIDER_UISIZE 1606 +#define IDS_SLIDER_UISIZESPLITSCREEN 1607 +#define IDS_SEED 1608 +#define IDS_UNLOCK_DLC_TITLE 1609 +#define IDS_UNLOCK_DLC_SKIN 1610 +#define IDS_UNLOCK_DLC_TEXTUREPACK_TITLE 1611 +#define IDS_UNLOCK_DLC_TEXTUREPACK_TEXT 1612 +#define IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE 1613 +#define IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT 1614 +#define IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE 1615 +#define IDS_DLC_TEXTUREPACK_UNLOCK_TITLE 1616 +#define IDS_DLC_TEXTUREPACK_GET_TRIAL_TITLE 1617 +#define IDS_DLC_TEXTUREPACK_GET_FULL_TITLE 1618 +#define IDS_DLC_TEXTUREPACK_NOT_PRESENT 1619 +#define IDS_TEXTURE_PACK_TRIALVERSION 1620 +#define IDS_TEXTUREPACK_FULLVERSION 1621 +#define IDS_UNLOCK_KICK_PLAYER_TITLE 1622 +#define IDS_UNLOCK_KICK_PLAYER 1623 +#define IDS_GAMERPICS 1624 +#define IDS_THEMES 1625 +#define IDS_SKINS 1626 +#define IDS_ALLOWFRIENDSOFFRIENDS 1627 +#define IDS_NOTALLOWED_FRIENDSOFFRIENDS 1628 +#define IDS_CANTJOIN_TITLE 1629 +#define IDS_SELECTED 1630 +#define IDS_SELECTED_SKIN 1631 +#define IDS_CORRUPT_DLC_TITLE 1632 +#define IDS_CORRUPT_DLC 1633 +#define IDS_CORRUPT_DLC_MULTIPLE 1634 +#define IDS_GAME_MODE_CHANGED 1635 +#define IDS_RENAME_WORLD_TITLE 1636 +#define IDS_RENAME_WORLD_TEXT 1637 +#define IDS_GAMEMODE_SURVIVAL 1638 +#define IDS_GAMEMODE_CREATIVE 1639 +#define IDS_GAMEMODE_ADVENTURE 1640 +#define IDS_SURVIVAL 1641 +#define IDS_CREATIVE 1642 +#define IDS_ADVENTURE 1643 +#define IDS_CREATED_IN_SURVIVAL 1644 +#define IDS_CREATED_IN_CREATIVE 1645 +#define IDS_CHECKBOX_RENDER_CLOUDS 1646 +#define IDS_TEXT_SAVEOPTIONS 1647 +#define IDS_TITLE_RENAMESAVE 1648 +#define IDS_AUTOSAVE_COUNTDOWN 1649 +#define IDS_ON 1650 +#define IDS_OFF 1651 +#define IDS_LEVELTYPE_NORMAL 1652 +#define IDS_LEVELTYPE_SUPERFLAT 1653 +#define IDS_GAMEOPTION_SEED 1654 +#define IDS_GAMEOPTION_ONLINE 1655 +#define IDS_GAMEOPTION_INVITEONLY 1656 +#define IDS_GAMEOPTION_ALLOWFOF 1657 +#define IDS_GAMEOPTION_PVP 1658 +#define IDS_GAMEOPTION_TRUST 1659 +#define IDS_GAMEOPTION_FIRE_SPREADS 1660 +#define IDS_GAMEOPTION_TNT_EXPLODES 1661 +#define IDS_GAMEOPTION_RESET_NETHER 1662 +#define IDS_GAMEOPTION_STRUCTURES 1663 +#define IDS_GAMEOPTION_SUPERFLAT 1664 +#define IDS_GAMEOPTION_BONUS_CHEST 1665 +#define IDS_GAMEOPTION_MOB_GRIEFING 1666 +#define IDS_GAMEOPTION_KEEP_INVENTORY 1667 +#define IDS_GAMEOPTION_MOB_SPAWNING 1668 +#define IDS_GAMEOPTION_MOB_LOOT 1669 +#define IDS_GAMEOPTION_TILE_DROPS 1670 +#define IDS_GAMEOPTION_NATURAL_REGEN 1671 +#define IDS_GAMEOPTION_DAYLIGHT_CYCLE 1672 +#define IDS_DLC_MENU_SKINPACKS 1673 +#define IDS_DLC_MENU_THEMES 1674 +#define IDS_DLC_MENU_GAMERPICS 1675 +#define IDS_DLC_MENU_AVATARITEMS 1676 +#define IDS_DLC_MENU_TEXTUREPACKS 1677 +#define IDS_DLC_MENU_MASHUPPACKS 1678 +#define IDS_DEATH_INFIRE 1679 +#define IDS_DEATH_ONFIRE 1680 +#define IDS_DEATH_LAVA 1681 +#define IDS_DEATH_INWALL 1682 +#define IDS_DEATH_DROWN 1683 +#define IDS_DEATH_STARVE 1684 +#define IDS_DEATH_CACTUS 1685 +#define IDS_DEATH_FALL 1686 +#define IDS_DEATH_OUTOFWORLD 1687 +#define IDS_DEATH_GENERIC 1688 +#define IDS_DEATH_EXPLOSION 1689 +#define IDS_DEATH_MAGIC 1690 +#define IDS_DEATH_DRAGON_BREATH 1691 +#define IDS_DEATH_MOB 1692 +#define IDS_DEATH_PLAYER 1693 +#define IDS_DEATH_ARROW 1694 +#define IDS_DEATH_FIREBALL 1695 +#define IDS_DEATH_THROWN 1696 +#define IDS_DEATH_INDIRECT_MAGIC 1697 +#define IDS_DEATH_FELL_ACCIDENT_LADDER 1698 +#define IDS_DEATH_FELL_ACCIDENT_VINES 1699 +#define IDS_DEATH_FELL_ACCIDENT_WATER 1700 +#define IDS_DEATH_FELL_ACCIDENT_GENERIC 1701 +#define IDS_DEATH_FELL_KILLER 1702 +#define IDS_DEATH_FELL_ASSIST 1703 +#define IDS_DEATH_FELL_ASSIST_ITEM 1704 +#define IDS_DEATH_FELL_FINISH 1705 +#define IDS_DEATH_FELL_FINISH_ITEM 1706 +#define IDS_DEATH_INFIRE_PLAYER 1707 +#define IDS_DEATH_ONFIRE_PLAYER 1708 +#define IDS_DEATH_LAVA_PLAYER 1709 +#define IDS_DEATH_DROWN_PLAYER 1710 +#define IDS_DEATH_CACTUS_PLAYER 1711 +#define IDS_DEATH_EXPLOSION_PLAYER 1712 +#define IDS_DEATH_WITHER 1713 +#define IDS_DEATH_PLAYER_ITEM 1714 +#define IDS_DEATH_ARROW_ITEM 1715 +#define IDS_DEATH_FIREBALL_ITEM 1716 +#define IDS_DEATH_THROWN_ITEM 1717 +#define IDS_DEATH_INDIRECT_MAGIC_ITEM 1718 +#define IDS_CHECKBOX_RENDER_BEDROCKFOG 1719 +#define IDS_CHECKBOX_DISPLAY_HUD 1720 +#define IDS_CHECKBOX_DISPLAY_HAND 1721 +#define IDS_CHECKBOX_DEATH_MESSAGES 1722 +#define IDS_CHECKBOX_ANIMATED_CHARACTER 1723 +#define IDS_CHECKBOX_CUSTOM_SKIN_ANIM 1724 +#define IDS_PRIV_MINE_TOGGLE_ON 1725 +#define IDS_PRIV_MINE_TOGGLE_OFF 1726 +#define IDS_PRIV_BUILD_TOGGLE_ON 1727 +#define IDS_PRIV_BUILD_TOGGLE_OFF 1728 +#define IDS_PRIV_USE_DOORS_TOGGLE_ON 1729 +#define IDS_PRIV_USE_DOORS_TOGGLE_OFF 1730 +#define IDS_PRIV_USE_CONTAINERS_TOGGLE_ON 1731 +#define IDS_PRIV_USE_CONTAINERS_TOGGLE_OFF 1732 +#define IDS_PRIV_ATTACK_MOB_TOGGLE_ON 1733 +#define IDS_PRIV_ATTACK_MOB_TOGGLE_OFF 1734 +#define IDS_PRIV_ATTACK_PLAYER_TOGGLE_ON 1735 +#define IDS_PRIV_ATTACK_PLAYER_TOGGLE_OFF 1736 +#define IDS_PRIV_ATTACK_ANIMAL_TOGGLE_ON 1737 +#define IDS_PRIV_ATTACK_ANIMAL_TOGGLE_OFF 1738 +#define IDS_PRIV_MODERATOR_TOGGLE_ON 1739 +#define IDS_PRIV_MODERATOR_TOGGLE_OFF 1740 +#define IDS_PRIV_FLY_TOGGLE_ON 1741 +#define IDS_PRIV_FLY_TOGGLE_OFF 1742 +#define IDS_PRIV_EXHAUSTION_TOGGLE_ON 1743 +#define IDS_PRIV_EXHAUSTION_TOGGLE_OFF 1744 +#define IDS_PRIV_INVISIBLE_TOGGLE_ON 1745 +#define IDS_PRIV_INVISIBLE_TOGGLE_OFF 1746 +#define IDS_PRIV_INVULNERABLE_TOGGLE_ON 1747 +#define IDS_PRIV_INVULNERABLE_TOGGLE_OFF 1748 +#define IDS_DLC_COST 1749 +#define IDS_BOSS_ENDERDRAGON_HEALTH 1750 +#define IDS_PLAYER_ENTERED_END 1751 +#define IDS_PLAYER_LEFT_END 1752 +#define IDS_WIN_TEXT 1753 +#define IDS_WIN_TEXT_PART_2 1754 +#define IDS_WIN_TEXT_PART_3 1755 +#define IDS_RESETNETHER_TITLE 1756 +#define IDS_RESETNETHER_TEXT 1757 +#define IDS_RESET_NETHER 1758 +#define IDS_DONT_RESET_NETHER 1759 +#define IDS_CANT_SHEAR_MOOSHROOM 1760 +#define IDS_MAX_PIGS_SHEEP_COWS_CATS_SPAWNED 1761 +#define IDS_MAX_MOOSHROOMS_SPAWNED 1762 +#define IDS_MAX_WOLVES_SPAWNED 1763 +#define IDS_MAX_CHICKENS_SPAWNED 1764 +#define IDS_MAX_SQUID_SPAWNED 1765 +#define IDS_MAX_BATS_SPAWNED 1766 +#define IDS_MAX_ENEMIES_SPAWNED 1767 +#define IDS_MAX_VILLAGERS_SPAWNED 1768 +#define IDS_MAX_HANGINGENTITIES 1769 +#define IDS_CANT_SPAWN_IN_PEACEFUL 1770 +#define IDS_MAX_PIGS_SHEEP_COWS_CATS_BRED 1771 +#define IDS_MAX_WOLVES_BRED 1772 +#define IDS_MAX_CHICKENS_BRED 1773 +#define IDS_MAX_HORSES_BRED 1774 +#define IDS_MAX_MUSHROOMCOWS_BRED 1775 +#define IDS_MAX_BOATS 1776 +#define IDS_MAX_SKULL_TILES 1777 +#define IDS_INVERT_LOOK 1778 +#define IDS_SOUTHPAW 1779 +#define IDS_YOU_DIED 1780 +#define IDS_RESPAWN 1781 +#define IDS_DOWNLOADABLE_CONTENT_OFFERS 1782 +#define IDS_CHANGE_SKIN 1783 +#define IDS_HOW_TO_PLAY 1784 +#define IDS_CONTROLS 1785 +#define IDS_SETTINGS 1786 +#define IDS_LANGUAGE_SELECTOR 1787 +#define IDS_CREDITS 1788 +#define IDS_REINSTALL_CONTENT 1789 +#define IDS_DEBUG_SETTINGS 1790 +#define IDS_FIRE_SPREADS 1791 +#define IDS_TNT_EXPLODES 1792 +#define IDS_PLAYER_VS_PLAYER 1793 +#define IDS_TRUST_PLAYERS 1794 +#define IDS_HOST_PRIVILEGES 1795 +#define IDS_GENERATE_STRUCTURES 1796 +#define IDS_SUPERFLAT_WORLD 1797 +#define IDS_BONUS_CHEST 1798 +#define IDS_WORLD_OPTIONS 1799 +#define IDS_GAME_OPTIONS 1800 +#define IDS_MOB_GRIEFING 1801 +#define IDS_KEEP_INVENTORY 1802 +#define IDS_MOB_SPAWNING 1803 +#define IDS_MOB_LOOT 1804 +#define IDS_TILE_DROPS 1805 +#define IDS_NATURAL_REGEN 1806 +#define IDS_DAYLIGHT_CYCLE 1807 +#define IDS_CAN_BUILD_AND_MINE 1808 +#define IDS_CAN_USE_DOORS_AND_SWITCHES 1809 +#define IDS_CAN_OPEN_CONTAINERS 1810 +#define IDS_CAN_ATTACK_PLAYERS 1811 +#define IDS_CAN_ATTACK_ANIMALS 1812 +#define IDS_MODERATOR 1813 +#define IDS_KICK_PLAYER 1814 +#define IDS_CAN_FLY 1815 +#define IDS_DISABLE_EXHAUSTION 1816 +#define IDS_INVISIBLE 1817 +#define IDS_HOST_OPTIONS 1818 +#define IDS_PLAYERS_INVITE 1819 +#define IDS_ONLINE_GAME 1820 +#define IDS_INVITE_ONLY 1821 +#define IDS_MORE_OPTIONS 1822 +#define IDS_LOAD 1823 +#define IDS_DEFAULT_WORLD_NAME 1824 +#define IDS_WORLD_NAME 1825 +#define IDS_CREATE_NEW_WORLD_SEED 1826 +#define IDS_CREATE_NEW_WORLD_RANDOM_SEED 1827 +#define IDS_PLAYERS 1828 +#define IDS_JOIN_GAME 1829 +#define IDS_START_GAME 1830 +#define IDS_NO_GAMES_FOUND 1831 +#define IDS_PLAY_GAME 1832 +#define IDS_LEADERBOARDS 1833 +#define IDS_HELP_AND_OPTIONS 1834 +#define IDS_UNLOCK_FULL_GAME 1835 +#define IDS_RESUME_GAME 1836 +#define IDS_SAVE_GAME 1837 +#define IDS_LABEL_DIFFICULTY 1838 +#define IDS_LABEL_GAME_TYPE 1839 +#define IDS_LABEL_STRUCTURES 1840 +#define IDS_LABEL_LEVEL_TYPE 1841 +#define IDS_LABEL_PvP 1842 +#define IDS_LABEL_TRUST 1843 +#define IDS_LABEL_TNT 1844 +#define IDS_LABEL_FIRE_SPREADS 1845 +#define IDS_REINSTALL_THEME 1846 +#define IDS_REINSTALL_GAMERPIC_1 1847 +#define IDS_REINSTALL_GAMERPIC_2 1848 +#define IDS_REINSTALL_AVATAR_ITEM_1 1849 +#define IDS_REINSTALL_AVATAR_ITEM_2 1850 +#define IDS_REINSTALL_AVATAR_ITEM_3 1851 +#define IDS_OPTIONS 1852 +#define IDS_AUDIO 1853 +#define IDS_CONTROL 1854 +#define IDS_GRAPHICS 1855 +#define IDS_USER_INTERFACE 1856 +#define IDS_RESET_TO_DEFAULTS 1857 +#define IDS_VIEW_BOBBING 1858 +#define IDS_HINTS 1859 +#define IDS_IN_GAME_TOOLTIPS 1860 +#define IDS_CHECKBOX_VERTICAL_SPLIT_SCREEN 1861 +#define IDS_DONE 1862 +#define IDS_EDIT_SIGN_MESSAGE 1863 +#define IDS_SOCIAL_TEXT 1864 +#define IDS_SOCIAL_LABEL_CAPTION 1865 +#define IDS_SOCIAL_DEFAULT_CAPTION 1866 +#define IDS_SOCIAL_LABEL_DESCRIPTION 1867 +#define IDS_DEFAULT_TEXTUREPACK 1868 +#define IDS_POTION_EMPTY 1869 +#define IDS_POTION_MOVESPEED 1870 +#define IDS_POTION_MOVESLOWDOWN 1871 +#define IDS_POTION_DIGSPEED 1872 +#define IDS_POTION_DIGSLOWDOWN 1873 +#define IDS_POTION_DAMAGEBOOST 1874 +#define IDS_POTION_WEAKNESS 1875 +#define IDS_POTION_HEAL 1876 +#define IDS_POTION_HARM 1877 +#define IDS_POTION_JUMP 1878 +#define IDS_POTION_CONFUSION 1879 +#define IDS_POTION_REGENERATION 1880 +#define IDS_POTION_RESISTANCE 1881 +#define IDS_POTION_FIRERESISTANCE 1882 +#define IDS_POTION_WATERBREATHING 1883 +#define IDS_POTION_INVISIBILITY 1884 +#define IDS_POTION_BLINDNESS 1885 +#define IDS_POTION_NIGHTVISION 1886 +#define IDS_POTION_HUNGER 1887 +#define IDS_POTION_POISON 1888 +#define IDS_POTION_WITHER 1889 +#define IDS_POTION_HEALTHBOOST 1890 +#define IDS_POTION_ABSORPTION 1891 +#define IDS_POTION_SATURATION 1892 +#define IDS_POTION_MOVESPEED_POSTFIX 1893 +#define IDS_POTION_MOVESLOWDOWN_POSTFIX 1894 +#define IDS_POTION_DIGSPEED_POSTFIX 1895 +#define IDS_POTION_DIGSLOWDOWN_POSTFIX 1896 +#define IDS_POTION_DAMAGEBOOST_POSTFIX 1897 +#define IDS_POTION_WEAKNESS_POSTFIX 1898 +#define IDS_POTION_HEAL_POSTFIX 1899 +#define IDS_POTION_HARM_POSTFIX 1900 +#define IDS_POTION_JUMP_POSTFIX 1901 +#define IDS_POTION_CONFUSION_POSTFIX 1902 +#define IDS_POTION_REGENERATION_POSTFIX 1903 +#define IDS_POTION_RESISTANCE_POSTFIX 1904 +#define IDS_POTION_FIRERESISTANCE_POSTFIX 1905 +#define IDS_POTION_WATERBREATHING_POSTFIX 1906 +#define IDS_POTION_INVISIBILITY_POSTFIX 1907 +#define IDS_POTION_BLINDNESS_POSTFIX 1908 +#define IDS_POTION_NIGHTVISION_POSTFIX 1909 +#define IDS_POTION_HUNGER_POSTFIX 1910 +#define IDS_POTION_POISON_POSTFIX 1911 +#define IDS_POTION_WITHER_POSTFIX 1912 +#define IDS_POTION_HEALTHBOOST_POSTFIX 1913 +#define IDS_POTION_ABSORPTION_POSTFIX 1914 +#define IDS_POTION_SATURATION_POSTFIX 1915 +#define IDS_POTION_POTENCY_0 1916 +#define IDS_POTION_POTENCY_1 1917 +#define IDS_POTION_POTENCY_2 1918 +#define IDS_POTION_POTENCY_3 1919 +#define IDS_POTION_PREFIX_GRENADE 1920 +#define IDS_POTION_PREFIX_MUNDANE 1921 +#define IDS_POTION_PREFIX_UNINTERESTING 1922 +#define IDS_POTION_PREFIX_BLAND 1923 +#define IDS_POTION_PREFIX_CLEAR 1924 +#define IDS_POTION_PREFIX_MILKY 1925 +#define IDS_POTION_PREFIX_DIFFUSE 1926 +#define IDS_POTION_PREFIX_ARTLESS 1927 +#define IDS_POTION_PREFIX_THIN 1928 +#define IDS_POTION_PREFIX_AWKWARD 1929 +#define IDS_POTION_PREFIX_FLAT 1930 +#define IDS_POTION_PREFIX_BULKY 1931 +#define IDS_POTION_PREFIX_BUNGLING 1932 +#define IDS_POTION_PREFIX_BUTTERED 1933 +#define IDS_POTION_PREFIX_SMOOTH 1934 +#define IDS_POTION_PREFIX_SUAVE 1935 +#define IDS_POTION_PREFIX_DEBONAIR 1936 +#define IDS_POTION_PREFIX_THICK 1937 +#define IDS_POTION_PREFIX_ELEGANT 1938 +#define IDS_POTION_PREFIX_FANCY 1939 +#define IDS_POTION_PREFIX_CHARMING 1940 +#define IDS_POTION_PREFIX_DASHING 1941 +#define IDS_POTION_PREFIX_REFINED 1942 +#define IDS_POTION_PREFIX_CORDIAL 1943 +#define IDS_POTION_PREFIX_SPARKLING 1944 +#define IDS_POTION_PREFIX_POTENT 1945 +#define IDS_POTION_PREFIX_FOUL 1946 +#define IDS_POTION_PREFIX_ODORLESS 1947 +#define IDS_POTION_PREFIX_RANK 1948 +#define IDS_POTION_PREFIX_HARSH 1949 +#define IDS_POTION_PREFIX_ACRID 1950 +#define IDS_POTION_PREFIX_GROSS 1951 +#define IDS_POTION_PREFIX_STINKY 1952 +#define IDS_POTION_DESC_WATER_BOTTLE 1953 +#define IDS_POTION_DESC_EMPTY 1954 +#define IDS_POTION_DESC_MOVESPEED 1955 +#define IDS_POTION_DESC_MOVESLOWDOWN 1956 +#define IDS_POTION_DESC_DAMAGEBOOST 1957 +#define IDS_POTION_DESC_WEAKNESS 1958 +#define IDS_POTION_DESC_HEAL 1959 +#define IDS_POTION_DESC_HARM 1960 +#define IDS_POTION_DESC_REGENERATION 1961 +#define IDS_POTION_DESC_FIRERESISTANCE 1962 +#define IDS_POTION_DESC_POISON 1963 +#define IDS_POTION_EFFECTS_WHENDRANK 1964 +#define IDS_ATTRIBUTE_NAME_HORSE_JUMPSTRENGTH 1965 +#define IDS_ATTRIBUTE_NAME_ZOMBIE_SPAWNREINFORCEMENTS 1966 +#define IDS_ATTRIBUTE_NAME_GENERIC_MAXHEALTH 1967 +#define IDS_ATTRIBUTE_NAME_GENERIC_FOLLOWRANGE 1968 +#define IDS_ATTRIBUTE_NAME_GENERIC_KNOCKBACKRESISTANCE 1969 +#define IDS_ATTRIBUTE_NAME_GENERIC_MOVEMENTSPEED 1970 +#define IDS_ATTRIBUTE_NAME_GENERIC_ATTACKDAMAGE 1971 +#define IDS_ENCHANTMENT_DAMAGE_ALL 1972 +#define IDS_ENCHANTMENT_DAMAGE_UNDEAD 1973 +#define IDS_ENCHANTMENT_DAMAGE_ARTHROPODS 1974 +#define IDS_ENCHANTMENT_KNOCKBACK 1975 +#define IDS_ENCHANTMENT_FIRE 1976 +#define IDS_ENCHANTMENT_PROTECT_ALL 1977 +#define IDS_ENCHANTMENT_PROTECT_FIRE 1978 +#define IDS_ENCHANTMENT_PROTECT_FALL 1979 +#define IDS_ENCHANTMENT_PROTECT_EXPLOSION 1980 +#define IDS_ENCHANTMENT_PROTECT_PROJECTILE 1981 +#define IDS_ENCHANTMENT_OXYGEN 1982 +#define IDS_ENCHANTMENT_WATER_WORKER 1983 +#define IDS_ENCHANTMENT_DIGGING 1984 +#define IDS_ENCHANTMENT_UNTOUCHING 1985 +#define IDS_ENCHANTMENT_DURABILITY 1986 +#define IDS_ENCHANTMENT_LOOT_BONUS 1987 +#define IDS_ENCHANTMENT_LOOT_BONUS_DIGGER 1988 +#define IDS_ENCHANTMENT_ARROW_DAMAGE 1989 +#define IDS_ENCHANTMENT_ARROW_FIRE 1990 +#define IDS_ENCHANTMENT_ARROW_KNOCKBACK 1991 +#define IDS_ENCHANTMENT_ARROW_INFINITE 1992 +#define IDS_ENCHANTMENT_LEVEL_1 1993 +#define IDS_ENCHANTMENT_LEVEL_2 1994 +#define IDS_ENCHANTMENT_LEVEL_3 1995 +#define IDS_ENCHANTMENT_LEVEL_4 1996 +#define IDS_ENCHANTMENT_LEVEL_5 1997 +#define IDS_ENCHANTMENT_LEVEL_6 1998 +#define IDS_ENCHANTMENT_LEVEL_7 1999 +#define IDS_ENCHANTMENT_LEVEL_8 2000 +#define IDS_ENCHANTMENT_LEVEL_9 2001 +#define IDS_ENCHANTMENT_LEVEL_10 2002 +#define IDS_DESC_EMERALDORE 2003 +#define IDS_DESC_ENDERCHEST 2004 +#define IDS_DESC_TRIPWIRE_SOURCE 2005 +#define IDS_DESC_TRIPWIRE 2006 +#define IDS_DESC_EMERALDBLOCK 2007 +#define IDS_DESC_COBBLESTONE_WALL 2008 +#define IDS_DESC_ANVIL 2009 +#define IDS_DESC_NETHER_QUARTZ_ORE 2010 +#define IDS_DESC_QUARTZ_BLOCK 2011 +#define IDS_DESC_EMERALD 2012 +#define IDS_DESC_FLOWERPOT 2013 +#define IDS_DESC_CARROTS 2014 +#define IDS_DESC_POTATO 2015 +#define IDS_DESC_POTATO_BAKED 2016 +#define IDS_DESC_POTATO_POISONOUS 2017 +#define IDS_DESC_CARROT_GOLDEN 2018 +#define IDS_DESC_CARROT_ON_A_STICK 2019 +#define IDS_DESC_PUMPKIN_PIE 2020 +#define IDS_DESC_ENCHANTED_BOOK 2021 +#define IDS_DESC_NETHER_QUARTZ 2022 +#define IDS_DESC_CARPET 2023 +#define IDS_ITEM_EMERALD 2024 +#define IDS_FLOWERPOT 2025 +#define IDS_CARROTS 2026 +#define IDS_POTATO 2027 +#define IDS_ITEM_POTATO_BAKED 2028 +#define IDS_ITEM_POTATO_POISONOUS 2029 +#define IDS_ITEM_CARROT_GOLDEN 2030 +#define IDS_ITEM_CARROT_ON_A_STICK 2031 +#define IDS_ITEM_PUMPKIN_PIE 2032 +#define IDS_ITEM_ENCHANTED_BOOK 2033 +#define IDS_ITEM_NETHER_QUARTZ 2034 +#define IDS_TILE_EMERALDORE 2035 +#define IDS_TILE_ENDERCHEST 2036 +#define IDS_TILE_TRIPWIRE_SOURCE 2037 +#define IDS_TILE_TRIPWIRE 2038 +#define IDS_TILE_EMERALDBLOCK 2039 +#define IDS_TILE_COBBLESTONE_WALL 2040 +#define IDS_TILE_COBBLESTONE_WALL_MOSSY 2041 +#define IDS_TILE_FLOWERPOT 2042 +#define IDS_TILE_CARROTS 2043 +#define IDS_TILE_POTATOES 2044 +#define IDS_TILE_ANVIL 2045 +#define IDS_TILE_ANVIL_INTACT 2046 +#define IDS_TILE_ANVIL_SLIGHTLYDAMAGED 2047 +#define IDS_TILE_ANVIL_VERYDAMAGED 2048 +#define IDS_TILE_NETHER_QUARTZ 2049 +#define IDS_TILE_QUARTZ_BLOCK 2050 +#define IDS_TILE_QUARTZ_BLOCK_CHISELED 2051 +#define IDS_TILE_QUARTZ_BLOCK_LINES 2052 +#define IDS_TILE_STAIRS_QUARTZ 2053 +#define IDS_TILE_CARPET 2054 +#define IDS_TILE_CARPET_BLACK 2055 +#define IDS_TILE_CARPET_RED 2056 +#define IDS_TILE_CARPET_GREEN 2057 +#define IDS_TILE_CARPET_BROWN 2058 +#define IDS_TILE_CARPET_BLUE 2059 +#define IDS_TILE_CARPET_PURPLE 2060 +#define IDS_TILE_CARPET_CYAN 2061 +#define IDS_TILE_CARPET_SILVER 2062 +#define IDS_TILE_CARPET_GRAY 2063 +#define IDS_TILE_CARPET_PINK 2064 +#define IDS_TILE_CARPET_LIME 2065 +#define IDS_TILE_CARPET_YELLOW 2066 +#define IDS_TILE_CARPET_LIGHT_BLUE 2067 +#define IDS_TILE_CARPET_MAGENTA 2068 +#define IDS_TILE_CARPET_ORANGE 2069 +#define IDS_TILE_CARPET_WHITE 2070 +#define IDS_TILE_SANDSTONE_CHISELED 2071 +#define IDS_TILE_SANDSTONE_SMOOTH 2072 +#define IDS_DEATH_THORNS 2073 +#define IDS_DEATH_FALLING_ANVIL 2074 +#define IDS_DEATH_FALLING_TILE 2075 +#define IDS_COMMAND_TELEPORT_SUCCESS 2076 +#define IDS_COMMAND_TELEPORT_ME 2077 +#define IDS_COMMAND_TELEPORT_TO_ME 2078 +#define IDS_ENCHANTMENT_THORNS 2079 +#define IDS_TILE_STONESLAB_QUARTZ 2080 +#define IDS_POTION_DESC_NIGHTVISION 2081 +#define IDS_POTION_DESC_INVISIBILITY 2082 +#define IDS_REPAIR_AND_NAME 2083 +#define IDS_REPAIR_COST 2084 +#define IDS_REPAIR_EXPENSIVE 2085 +#define IDS_TITLE_RENAME 2086 +#define IDS_YOU_HAVE 2087 +#define IDS_REQUIRED_ITEMS_FOR_TRADE 2088 +#define IDS_VILLAGER_OFFERS_ITEM 2089 +#define IDS_TOOLTIPS_REPAIR 2090 +#define IDS_TOOLTIPS_TRADE 2091 +#define IDS_TOOLTIPS_DYECOLLAR 2092 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_OVERVIEW 2093 +#define IDS_TUTORIAL_PROMPT_ANVIL_MENU_OVERVIEW 2094 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_START 2095 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_REPAIR 2096 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_SACRIFICE 2097 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_ENCHANT 2098 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_COST 2099 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_RENAMING 2100 +#define IDS_TUTORIAL_TASK_ANVIL_MENU_SMITH 2101 +#define IDS_TUTORIAL_TASK_ANVIL_OVERVIEW 2102 +#define IDS_TUTORIAL_PROMPT_ANVIL_OVERVIEW 2103 +#define IDS_TUTORIAL_TASK_ANVIL_SUMMARY 2104 +#define IDS_TUTORIAL_TASK_ANVIL_ENCHANTED_BOOKS 2105 +#define IDS_TUTORIAL_TASK_ANVIL_COST 2106 +#define IDS_TUTORIAL_TASK_ANVIL_COST2 2107 +#define IDS_TUTORIAL_TASK_ANVIL_RENAMING 2108 +#define IDS_TUTORIAL_TASK_ANVIL_USE_CHESTS 2109 +#define IDS_TUTORIAL_TASK_TRADING_MENU_OVERVIEW 2110 +#define IDS_TUTORIAL_PROMPT_TRADING_MENU_OVERVIEW 2111 +#define IDS_TUTORIAL_TASK_TRADING_MENU_START 2112 +#define IDS_TUTORIAL_TASK_TRADING_MENU_UNAVAILABLE 2113 +#define IDS_TUTORIAL_TASK_TRADING_MENU_DETAILS 2114 +#define IDS_TUTORIAL_TASK_TRADING_MENU_INVENTORY 2115 +#define IDS_TUTORIAL_TASK_TRADING_MENU_TRADE 2116 +#define IDS_TUTORIAL_TASK_TRADING_OVERVIEW 2117 +#define IDS_TUTORIAL_PROMPT_TRADING_OVERVIEW 2118 +#define IDS_TUTORIAL_TASK_TRADING_SUMMARY 2119 +#define IDS_TUTORIAL_TASK_TRADING_TRADES 2120 +#define IDS_TUTORIAL_TASK_TRADING_INCREASE_TRADES 2121 +#define IDS_TUTORIAL_TASK_TRADING_DECREASE_TRADES 2122 +#define IDS_TUTORIAL_TASK_TRADING_USE_CHESTS 2123 +#define IDS_TUTORIAL_TASK_ENDERCHEST_OVERVIEW 2124 +#define IDS_TUTORIAL_PROMPT_ENDERCHEST_OVERVIEW 2125 +#define IDS_TUTORIAL_TASK_ENDERCHEST_SUMMARY 2126 +#define IDS_TUTORIAL_TASK_ENDERCHEST_PLAYERS 2127 +#define IDS_TUTORIAL_TASK_ENDERCHEST_FUNCTION 2128 +#define IDS_DESC_ENCHANTED_GOLDENAPPLE 2129 +#define IDS_ENABLE_TELEPORT 2130 +#define IDS_TELEPORT 2131 +#define IDS_TELEPORT_TO_PLAYER 2132 +#define IDS_TELEPORT_TO_ME 2133 +#define IDS_CAN_DISABLE_EXHAUSTION 2134 +#define IDS_CAN_INVISIBLE 2135 +#define IDS_PRIV_CAN_INVISIBLE_TOGGLE_ON 2136 +#define IDS_PRIV_CAN_INVISIBLE_TOGGLE_OFF 2137 +#define IDS_PRIV_CAN_FLY_TOGGLE_ON 2138 +#define IDS_PRIV_CAN_FLY_TOGGLE_OFF 2139 +#define IDS_PRIV_CAN_EXHAUSTION_TOGGLE_ON 2140 +#define IDS_PRIV_CAN_EXHAUSTION_TOGGLE_OFF 2141 +#define IDS_PRIV_CAN_TELEPORT_TOGGLE_ON 2142 +#define IDS_PRIV_CAN_TELEPORT_TOGGLE_OFF 2143 +#define IDS_HOW_TO_PLAY_ANVIL 2144 +#define IDS_HOW_TO_PLAY_TRADING 2145 +#define IDS_HOW_TO_PLAY_ENDERCHEST 2146 +#define IDS_VILLAGER_FARMER 2147 +#define IDS_VILLAGER_LIBRARIAN 2148 +#define IDS_VILLAGER_PRIEST 2149 +#define IDS_VILLAGER_SMITH 2150 +#define IDS_VILLAGER_BUTCHER 2151 +#define IDS_DESC_VILLAGER 2152 +#define IDS_CHEST_LARGE 2153 +#define IDS_TUTORIAL_TASK_ENCHANTING_BOOKS 2154 +#define IDS_TUTORIAL_TASK_REDSTONE_TRIPWIRE 2155 +#define IDS_TUTORIAL_TASK_BREEDING_WOLF_COLLAR 2156 +#define IDS_TUTORIAL_TASK_FARMING_CARROTS_AND_POTATOES 2157 +#define IDS_TUTORIAL_TASK_BREEDING_RIDING_PIGS 2158 +#define IDS_TUTORIAL_TASK_MINECART_PUSHING 2159 +#define IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN 2160 +#define IDS_TOOLTIPS_CURE 2161 +#define IDS_LANG_SYSTEM 2162 +#define IDS_LANG_ENGLISH 2163 +#define IDS_LANG_GERMAN 2164 +#define IDS_LANG_SPANISH 2165 +#define IDS_LANG_SPANISH_SPAIN 2166 +#define IDS_LANG_SPANISH_LATIN_AMERICA 2167 +#define IDS_LANG_FRENCH 2168 +#define IDS_LANG_ITALIAN 2169 +#define IDS_LANG_PORTUGUESE 2170 +#define IDS_LANG_PORTUGUESE_PORTUGAL 2171 +#define IDS_LANG_PORTUGUESE_BRAZIL 2172 +#define IDS_LANG_JAPANESE 2173 +#define IDS_LANG_KOREAN 2174 +#define IDS_LANG_CHINESE_TRADITIONAL 2175 +#define IDS_LANG_CHINESE_SIMPLIFIED 2176 +#define IDS_LANG_DANISH 2177 +#define IDS_LANG_FINISH 2178 +#define IDS_LANG_DUTCH 2179 +#define IDS_LANG_POLISH 2180 +#define IDS_LANG_RUSSIAN 2181 +#define IDS_LANG_SWEDISH 2182 +#define IDS_LANG_NORWEGIAN 2183 +#define IDS_LANG_GREEK 2184 +#define IDS_LANG_TURKISH 2185 +#define IDS_LEADERBOARD_KILLS_EASY 2186 +#define IDS_LEADERBOARD_KILLS_NORMAL 2187 +#define IDS_LEADERBOARD_KILLS_HARD 2188 +#define IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL 2189 +#define IDS_LEADERBOARD_MINING_BLOCKS_EASY 2190 +#define IDS_LEADERBOARD_MINING_BLOCKS_NORMAL 2191 +#define IDS_LEADERBOARD_MINING_BLOCKS_HARD 2192 +#define IDS_LEADERBOARD_FARMING_PEACEFUL 2193 +#define IDS_LEADERBOARD_FARMING_EASY 2194 +#define IDS_LEADERBOARD_FARMING_NORMAL 2195 +#define IDS_LEADERBOARD_FARMING_HARD 2196 +#define IDS_LEADERBOARD_TRAVELLING_PEACEFUL 2197 +#define IDS_LEADERBOARD_TRAVELLING_EASY 2198 +#define IDS_LEADERBOARD_TRAVELLING_NORMAL 2199 +#define IDS_LEADERBOARD_TRAVELLING_HARD 2200 +#define IDS_TIPS_GAMETIP_0 2201 +#define IDS_TIPS_GAMETIP_1 2202 +#define IDS_TIPS_GAMETIP_48 2203 +#define IDS_TIPS_GAMETIP_44 2204 +#define IDS_TIPS_GAMETIP_45 2205 +#define IDS_TIPS_TRIVIA_4 2206 +#define IDS_TIPS_TRIVIA_17 2207 +#define IDS_HOW_TO_PLAY_MULTIPLAYER 2208 +#define IDS_HOW_TO_PLAY_SOCIALMEDIA 2209 +#define IDS_HOW_TO_PLAY_CREATIVE 2210 +#define IDS_TUTORIAL_TASK_FLY 2211 +#define IDS_TOOLTIPS_SELECTDEVICE 2212 +#define IDS_TOOLTIPS_CHANGEDEVICE 2213 +#define IDS_TOOLTIPS_VIEW_GAMERCARD 2214 +#define IDS_TOOLTIPS_VIEW_GAMERPROFILE 2215 +#define IDS_TOOLTIPS_INVITE_PARTY 2216 +#define IDS_CONFIRM_START_CREATIVE 2217 +#define IDS_CONFIRM_START_SAVEDINCREATIVE 2218 +#define IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE 2219 +#define IDS_CONFIRM_START_HOST_PRIVILEGES 2220 +#define IDS_CONNECTION_LOST_LIVE 2221 +#define IDS_CONNECTION_LOST_LIVE_NO_EXIT 2222 +#define IDS_AWARD_AVATAR1 2223 +#define IDS_AWARD_AVATAR2 2224 +#define IDS_AWARD_AVATAR3 2225 +#define IDS_AWARD_THEME 2226 +#define IDS_UNLOCK_ACHIEVEMENT_TEXT 2227 +#define IDS_UNLOCK_AVATAR_TEXT 2228 +#define IDS_UNLOCK_GAMERPIC_TEXT 2229 +#define IDS_UNLOCK_THEME_TEXT 2230 +#define IDS_UNLOCK_ACCEPT_INVITE 2231 +#define IDS_UNLOCK_GUEST_TEXT 2232 +#define IDS_LEADERBOARD_GAMERTAG 2233 +#define IDS_GROUPNAME_POTIONS_480 2234 +#define IDS_RETURNEDTOTITLESCREEN_TEXT 2235 +#define IDS_TRIALOVER_TEXT 2236 +#define IDS_FATAL_ERROR_TEXT 2237 +#define IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT 2238 +#define IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT 2239 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL 2240 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL 2241 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE 2242 +#define IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE 2243 +#define IDS_SAVE_ICON_MESSAGE 2244 +#define IDS_GAMEOPTION_HOST_PRIVILEGES 2245 +#define IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS 2246 +#define IDS_ACHIEVEMENTS 2247 +#define IDS_LABEL_GAMERTAGS 2248 +#define IDS_IN_GAME_GAMERTAGS 2249 +#define IDS_SOCIAL_DEFAULT_DESCRIPTION 2250 +#define IDS_TITLE_UPDATE_NAME 2251 +#define IDS_PLATFORM_NAME 2252 +#define IDS_BACK_BUTTON 2253 +#define IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS 2254 +#define IDS_KICK_PLAYER_DESCRIPTION 2255 +#define IDS_USING_TRIAL_TEXUREPACK_WARNING 2256 +#define IDS_WORLD_SIZE_TITLE_SMALL 2257 +#define IDS_WORLD_SIZE_TITLE_MEDIUM 2258 +#define IDS_WORLD_SIZE_TITLE_LARGE 2259 +#define IDS_WORLD_SIZE_TITLE_CLASSIC 2260 +#define IDS_WORLD_SIZE 2261 +#define IDS_GAMEOPTION_WORLD_SIZE 2262 +#define IDS_DISABLE_SAVING 2263 +#define IDS_GAMEOPTION_DISABLE_SAVING 2264 +#define IDS_RICHPRESENCE_GAMESTATE 2265 +#define IDS_RICHPRESENCE_IDLE 2266 +#define IDS_RICHPRESENCE_MENUS 2267 +#define IDS_RICHPRESENCE_MULTIPLAYER 2268 +#define IDS_RICHPRESENCE_MULTIPLAYEROFFLINE 2269 +#define IDS_RICHPRESENCE_MULTIPLAYER_1P 2270 +#define IDS_RICHPRESENCE_MULTIPLAYER_1POFFLINE 2271 +#define IDS_RICHPRESENCESTATE_BLANK 2272 +#define IDS_RICHPRESENCESTATE_RIDING_PIG 2273 +#define IDS_RICHPRESENCESTATE_RIDING_MINECART 2274 +#define IDS_RICHPRESENCESTATE_BOATING 2275 +#define IDS_RICHPRESENCESTATE_FISHING 2276 +#define IDS_RICHPRESENCESTATE_CRAFTING 2277 +#define IDS_RICHPRESENCESTATE_FORGING 2278 +#define IDS_RICHPRESENCESTATE_NETHER 2279 +#define IDS_RICHPRESENCESTATE_CD 2280 +#define IDS_RICHPRESENCESTATE_MAP 2281 +#define IDS_RICHPRESENCESTATE_ENCHANTING 2282 +#define IDS_RICHPRESENCESTATE_BREWING 2283 +#define IDS_RICHPRESENCESTATE_ANVIL 2284 +#define IDS_RICHPRESENCESTATE_TRADING 2285 diff --git a/Minecraft.Client/WitchModel.cpp b/Minecraft.Client/WitchModel.cpp new file mode 100644 index 00000000..2ac56697 --- /dev/null +++ b/Minecraft.Client/WitchModel.cpp @@ -0,0 +1,73 @@ +#include "stdafx.h" +#include "ModelPart.h" +#include "WitchModel.h" +#include "VillagerModel.h" +#include "../Minecraft.World/Mth.h" + +WitchModel::WitchModel(float g) : VillagerModel(g, 0, 64, 128) +{ + mole = (new ModelPart(this))->setTexSize(64, 128); + mole->setPos(0, -2, 0); + mole->texOffs(0, 0)->addBox(0, 3, -6.75f, 1, 1, 1, -0.25f); + nose->addChild(mole); + + hat = (new ModelPart(this))->setTexSize(64, 128); + hat->setPos(-5, -10 - (0.5f / 16.f), -5); + hat->texOffs(0, 64)->addBox(0, 0, 0, 10, 2, 10); + head->addChild(hat); + + ModelPart *hat2 = new ModelPart(this); + hat2->setTexSize(64, 128); + hat2->setPos(1.75f, -4, 2.f); + hat2->texOffs(0, 76)->addBox(0, 0, 0, 7, 4, 7); + hat2->xRot = -3.f * Mth::RAD_TO_GRAD; + hat2->zRot = 1.5f * Mth::RAD_TO_GRAD; + hat->addChild(hat2); + + ModelPart *hat3 = new ModelPart(this); + hat3->setTexSize(64, 128); + hat3->setPos(1.75f, -4, 2.f); + hat3->texOffs(0, 87)->addBox(0, 0, 0, 4, 4, 4); + hat3->xRot = -6.f * Mth::RAD_TO_GRAD; + hat3->zRot = 3.f * Mth::RAD_TO_GRAD; + hat2->addChild(hat3); + + ModelPart *hat4 = new ModelPart(this); + hat4->setTexSize(64, 128); + hat4->setPos(1.75f, -2, 2.f); + hat4->texOffs(0, 95)->addBox(0, 0, 0, 1, 2, 1, 0.25f); + hat4->xRot = -12.f * Mth::RAD_TO_GRAD; + hat4->zRot = 6.f * Mth::RAD_TO_GRAD; + hat3->addChild(hat4); + + // 4J added - compile now to avoid random performance hit first time cubes are rendered + mole->compile(1.0f/16.0f); + hat->compile(1.0f/16.0f); + hat2->compile(1.0f/16.0f); + hat3->compile(1.0f/16.0f); + hat4->compile(1.0f/16.0f); +} + +void WitchModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) +{ + VillagerModel::setupAnim(time, r, bob, yRot, xRot, scale, entity); + + nose->translateX = nose->translateY = nose->translateZ = 0; + + float speed = 0.01f * (entity->entityId % 10); + nose->xRot = (sin(entity->tickCount * speed) * 4.5f) * PI / 180; + nose->yRot = 0; + nose->zRot = (cos(entity->tickCount * speed) * 2.5f) * PI / 180; + + if (holdingItem) + { + nose->xRot = -0.9f; + nose->translateZ = -1.5f / 16.f; + nose->translateY = 3 / 16.f; + } +} + +int WitchModel::getModelVersion() +{ + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/WitchModel.h b/Minecraft.Client/WitchModel.h new file mode 100644 index 00000000..a0824aa5 --- /dev/null +++ b/Minecraft.Client/WitchModel.h @@ -0,0 +1,17 @@ +#pragma once +#include "VillagerModel.h" + +class WitchModel : public VillagerModel +{ +public: + bool holdingItem; + +private: + ModelPart *mole; + ModelPart *hat; + +public: + WitchModel(float g); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); + int getModelVersion(); +}; \ No newline at end of file diff --git a/Minecraft.Client/WitchRenderer.cpp b/Minecraft.Client/WitchRenderer.cpp new file mode 100644 index 00000000..5e0f2b10 --- /dev/null +++ b/Minecraft.Client/WitchRenderer.cpp @@ -0,0 +1,118 @@ +#include "stdafx.h" +#include "EntityRenderDispatcher.h" +#include "WitchRenderer.h" +#include "WitchModel.h" +#include "ModelPart.h" +#include "..\Minecraft.World\net.minecraft.world.item.h" + +ResourceLocation WitchRenderer::WITCH_LOCATION = ResourceLocation(TN_MOB_WITCH); + +WitchRenderer::WitchRenderer() : MobRenderer(new WitchModel(0), 0.5f) +{ + witchModel = dynamic_cast(model); +} + +void WitchRenderer::render(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + shared_ptr mob = dynamic_pointer_cast(entity); + + shared_ptr item = mob->getCarriedItem(); + + witchModel->holdingItem = item != NULL; + MobRenderer::render(mob, x, y, z, rot, a); +} + +ResourceLocation *WitchRenderer::getTextureLocation(shared_ptr entity) +{ + return &WITCH_LOCATION; +} + +void WitchRenderer::additionalRendering(shared_ptr entity, float a) +{ + shared_ptr mob = dynamic_pointer_cast(entity); + + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); + + MobRenderer::additionalRendering(mob, a); + + shared_ptr item = mob->getCarriedItem(); + + if (item != NULL) + { + glPushMatrix(); + + if (model->young) + { + float s = 0.5f; + glTranslatef(0 / 16.0f, 10 / 16.0f, 0 / 16.0f); + glRotatef(-20, -1, 0, 0); + glScalef(s, s, s); + } + + witchModel->nose->translateTo(1 / 16.0f); + glTranslatef(-1 / 16.0f, 8.5f / 16.0f, 3.5f / 16.0f); + + if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) + { + float s = 8 / 16.0f; + glTranslatef(-0 / 16.0f, 3 / 16.0f, -5 / 16.0f); + s *= 0.75f; + glRotatef(20, 1, 0, 0); + glRotatef(45, 0, 1, 0); + glScalef(s, -s, s); + } + else if (item->id == Item::bow->id) + { + float s = 10 / 16.0f; + glTranslatef(0 / 16.0f, 2 / 16.0f, 5 / 16.0f); + glRotatef(-20, 0, 1, 0); + glScalef(s, -s, s); + glRotatef(-100, 1, 0, 0); + glRotatef(45, 0, 1, 0); + } + else if (Item::items[item->id]->isHandEquipped()) + { + float s = 10 / 16.0f; + if (Item::items[item->id]->isMirroredArt()) + { + glRotatef(180, 0, 0, 1); + glTranslatef(0, -2 / 16.0f, 0); + } + translateWeaponItem(); + glScalef(s, -s, s); + glRotatef(-100, 1, 0, 0); + glRotatef(45, 0, 1, 0); + } + else + { + float s = 6 / 16.0f; + glTranslatef(+4 / 16.0f, +3 / 16.0f, -3 / 16.0f); + glScalef(s, s, s); + glRotatef(60, 0, 0, 1); + glRotatef(-90, 1, 0, 0); + glRotatef(20, 0, 0, 1); + } + + glRotatef(-15, 1, 0, 0); + glRotatef(40, 0, 0, 1); + + entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); + if (item->getItem()->hasMultipleSpriteLayers()) + { + entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 1); + } + glPopMatrix(); + } +} + +void WitchRenderer::translateWeaponItem() +{ + glTranslatef(0, 3 / 16.0f, 0); +} + +void WitchRenderer::scale(shared_ptr mob, float a) +{ + float s = 15 / 16.0f; + glScalef(s, s, s); +} \ No newline at end of file diff --git a/Minecraft.Client/WitchRenderer.h b/Minecraft.Client/WitchRenderer.h new file mode 100644 index 00000000..c221ab34 --- /dev/null +++ b/Minecraft.Client/WitchRenderer.h @@ -0,0 +1,21 @@ +#pragma once +#include "MobRenderer.h" + +class WitchModel; + +class WitchRenderer : public MobRenderer +{ +private: + static ResourceLocation WITCH_LOCATION; + WitchModel *witchModel; + +public: + WitchRenderer(); + virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + +protected: + virtual ResourceLocation *getTextureLocation(shared_ptr entity); + virtual void additionalRendering(shared_ptr mob, float a); + virtual void translateWeaponItem(); + virtual void scale(shared_ptr mob, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/WitherBossModel.cpp b/Minecraft.Client/WitherBossModel.cpp new file mode 100644 index 00000000..626a8950 --- /dev/null +++ b/Minecraft.Client/WitherBossModel.cpp @@ -0,0 +1,80 @@ +#include "stdafx.h" +#include "WitherBossModel.h" +#include "..\Minecraft.World\WitherBoss.h" +#include "ModelPart.h" + +WitherBossModel::WitherBossModel() +{ + texWidth = 64; + texHeight = 64; + + upperBodyParts = ModelPartArray(3); + + upperBodyParts[0] = new ModelPart(this, 0, 16); + upperBodyParts[0]->addBox(-10, 3.9f, -.5f, 20, 3, 3); + + upperBodyParts[1] = new ModelPart(this); + upperBodyParts[1]->setTexSize(texWidth, texHeight); + upperBodyParts[1]->setPos(-2, 6.9f, -.5f); + upperBodyParts[1]->texOffs(0, 22)->addBox(0, 0, 0, 3, 10, 3); + upperBodyParts[1]->texOffs(24, 22)->addBox(-4.f, 1.5f, .5f, 11, 2, 2); + upperBodyParts[1]->texOffs(24, 22)->addBox(-4.f, 4, .5f, 11, 2, 2); + upperBodyParts[1]->texOffs(24, 22)->addBox(-4.f, 6.5f, .5f, 11, 2, 2); + + upperBodyParts[2] = new ModelPart(this, 12, 22); + upperBodyParts[2]->addBox(0, 0, 0, 3, 6, 3); + + heads = ModelPartArray(3); + heads[0] = new ModelPart(this, 0, 0); + heads[0]->addBox(-4, -4, -4, 8, 8, 8); + heads[1] = new ModelPart(this, 32, 0); + heads[1]->addBox(-4, -4, -4, 6, 6, 6); + heads[1]->x = -8; + heads[1]->y = 4; + heads[2] = new ModelPart(this, 32, 0); + heads[2]->addBox(-4, -4, -4, 6, 6, 6); + heads[2]->x = 10; + heads[2]->y = 4; +} + +int WitherBossModel::modelVersion() +{ + return 32; +} + +void WitherBossModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + setupAnim(time, r, bob, yRot, xRot, scale, entity); + + for (int i = 0; i < heads.length; i++) + { + heads[i]->render(scale, usecompiled); + } + for (int i = 0; i < upperBodyParts.length; i++) + { + upperBodyParts[i]->render(scale, usecompiled); + } +} + +void WitherBossModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) +{ + float anim = cos(bob * .1f); + upperBodyParts[1]->xRot = (.065f + .05f * anim) * PI; + + upperBodyParts[2]->setPos(-2.f, 6.9f + cos(upperBodyParts[1]->xRot) * 10.f, -.5f + sin(upperBodyParts[1]->xRot) * 10.f); + upperBodyParts[2]->xRot = (.265f + .1f * anim) * PI; + + heads[0]->yRot = yRot / (180 / PI); + heads[0]->xRot = xRot / (180 / PI); +} + +void WitherBossModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +{ + shared_ptr boss = dynamic_pointer_cast(mob); + + for (int i = 1; i < 3; i++) + { + heads[i]->yRot = (boss->getHeadYRot(i - 1) - mob->yBodyRot) / (180 / PI); + heads[i]->xRot = boss->getHeadXRot(i - 1) / (180 / PI); + } +} \ No newline at end of file diff --git a/Minecraft.Client/WitherBossModel.h b/Minecraft.Client/WitherBossModel.h new file mode 100644 index 00000000..0d95b81c --- /dev/null +++ b/Minecraft.Client/WitherBossModel.h @@ -0,0 +1,18 @@ +#pragma once +#include "Model.h" +#include "ModelPart.h" + +class WitherBossModel : public Model +{ +private: + ModelPartArray upperBodyParts; + ModelPartArray heads; + +public: + WitherBossModel(); + + int modelVersion(); + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/WitherBossRenderer.cpp b/Minecraft.Client/WitherBossRenderer.cpp new file mode 100644 index 00000000..254a00bc --- /dev/null +++ b/Minecraft.Client/WitherBossRenderer.cpp @@ -0,0 +1,110 @@ +#include "stdafx.h" +#include "WitherBossRenderer.h" +#include "WitherBossModel.h" +#include "MobRenderer.h" +#include "../Minecraft.World/WitherBoss.h" +#include "../Minecraft.Client/BossMobGuiInfo.h" + +ResourceLocation WitherBossRenderer::WITHER_ARMOR_LOCATION = ResourceLocation(TN_MOB_WITHER_ARMOR); +ResourceLocation WitherBossRenderer::WITHER_INVULERABLE_LOCATION = ResourceLocation(TN_MOB_WITHER_INVULNERABLE); +ResourceLocation WitherBossRenderer::WITHER_LOCATION = ResourceLocation(TN_MOB_WITHER); + + +WitherBossRenderer::WitherBossRenderer() : MobRenderer(new WitherBossModel(), 1.0f) +{ + modelVersion = dynamic_cast(model)->modelVersion(); +} + +void WitherBossRenderer::render(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + shared_ptr mob = dynamic_pointer_cast(entity); + + BossMobGuiInfo::setBossHealth(mob, true); + + int modelVersion = dynamic_cast(model)->modelVersion(); + if (modelVersion != this->modelVersion) + { + this->modelVersion = modelVersion; + model = new WitherBossModel(); + } + MobRenderer::render(entity, x, y, z, rot, a); +} + +ResourceLocation *WitherBossRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr mob = dynamic_pointer_cast(entity); + + int invulnerableTicks = mob->getInvulnerableTicks(); + if (invulnerableTicks <= 0 || ( (invulnerableTicks <= (SharedConstants::TICKS_PER_SECOND * 4)) && (invulnerableTicks / 5) % 2 == 1) ) + { + return &WITHER_LOCATION; + } + return &WITHER_INVULERABLE_LOCATION; +} + +void WitherBossRenderer::scale(shared_ptr _mob, float a) +{ + shared_ptr mob = dynamic_pointer_cast(_mob); + int inTicks = mob->getInvulnerableTicks(); + if (inTicks > 0) + { + float scale = 2.0f - (((float) inTicks - a) / (SharedConstants::TICKS_PER_SECOND * 11)) * .5f; + glScalef(scale, scale, scale); + } + else + { + glScalef(2, 2, 2); + } +} + +int WitherBossRenderer::prepareArmor(shared_ptr entity, int layer, float a) +{ + shared_ptr mob = dynamic_pointer_cast(entity); + + if (mob->isPowered()) + { + if (mob->isInvisible()) + { + glDepthMask(false); + } + else + { + glDepthMask(true); + } + + if (layer == 1) + { + float time = mob->tickCount + a; + bindTexture(&WITHER_ARMOR_LOCATION); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + float uo = cos(time * 0.02f) * 3; + float vo = time * 0.01f; + glTranslatef(uo, vo, 0); + setArmor(model); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_BLEND); + float br = 0.5f; + glColor4f(br, br, br, 1); + glDisable(GL_LIGHTING); + glBlendFunc(GL_ONE, GL_ONE); + glTranslatef(0, -.01f, 0); + glScalef(1.1f, 1.1f, 1.1f); + return 1; + } + if (layer == 2) + { + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_LIGHTING); + glDisable(GL_BLEND); + } + } + return -1; +} + +int WitherBossRenderer::prepareArmorOverlay(shared_ptr entity, int layer, float a) +{ + return -1; +} \ No newline at end of file diff --git a/Minecraft.Client/WitherBossRenderer.h b/Minecraft.Client/WitherBossRenderer.h new file mode 100644 index 00000000..5e567d11 --- /dev/null +++ b/Minecraft.Client/WitherBossRenderer.h @@ -0,0 +1,24 @@ +#pragma once +#include "MobRenderer.h" + +class WitherBoss; +class LivingEntity; + +class WitherBossRenderer : public MobRenderer +{ +private: + static ResourceLocation WITHER_INVULERABLE_LOCATION; + static ResourceLocation WITHER_ARMOR_LOCATION; + static ResourceLocation WITHER_LOCATION; + int modelVersion; + +public: + WitherBossRenderer(); + virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr entity); + +protected: + virtual void scale(shared_ptr mob, float a); + virtual int prepareArmor(shared_ptr entity, int layer, float a); + virtual int prepareArmorOverlay(shared_ptr entity, int layer, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/WitherSkullRenderer.cpp b/Minecraft.Client/WitherSkullRenderer.cpp new file mode 100644 index 00000000..87873574 --- /dev/null +++ b/Minecraft.Client/WitherSkullRenderer.cpp @@ -0,0 +1,52 @@ +#include "stdafx.h" +#include "WitherSkullRenderer.h" +#include "SkeletonHeadModel.h" +#include "../Minecraft.World/WitherSkull.h" + +ResourceLocation WitherSkullRenderer::WITHER_ARMOR_LOCATION(TN_MOB_WITHER_INVULNERABLE); +ResourceLocation WitherSkullRenderer::WITHER_LOCATION(TN_MOB_WITHER); + +WitherSkullRenderer::WitherSkullRenderer() +{ + model = new SkeletonHeadModel(); +} + +void WitherSkullRenderer::render(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + glPushMatrix(); + glDisable(GL_CULL_FACE); + + float headRot = rotlerp(entity->yRotO, entity->yRot, a); + float headRotx = entity->xRotO + (entity->xRot - entity->xRotO) * a; + + glTranslatef((float) x, (float) y, (float) z); + + float scale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + glEnable(GL_ALPHA_TEST); + + bindTexture(entity); + + model->render(entity, 0, 0, 0, headRot, headRotx, scale, true); + + glPopMatrix(); +} + +ResourceLocation *WitherSkullRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr mob = dynamic_pointer_cast(entity); + + return mob->isDangerous() ? &WITHER_ARMOR_LOCATION : &WITHER_LOCATION; +} + +float WitherSkullRenderer::rotlerp(float from, float to, float a) +{ + float diff = to - from; + while (diff < -180) + diff += 360; + while (diff >= 180) + diff -= 360; + return from + a * diff; +} \ No newline at end of file diff --git a/Minecraft.Client/WitherSkullRenderer.h b/Minecraft.Client/WitherSkullRenderer.h new file mode 100644 index 00000000..eaf0f005 --- /dev/null +++ b/Minecraft.Client/WitherSkullRenderer.h @@ -0,0 +1,21 @@ +#pragma once +#include "EntityRenderer.h" + +class SkeletonHeadModel; + +class WitherSkullRenderer : public EntityRenderer +{ +private: + static ResourceLocation WITHER_ARMOR_LOCATION; + static ResourceLocation WITHER_LOCATION; + + SkeletonHeadModel *model; + +public: + WitherSkullRenderer(); + void render(shared_ptr entity, double x, double y, double z, float rot, float a); + ResourceLocation *getTextureLocation(shared_ptr entity); + +private: + float rotlerp(float from, float to, float a); +}; \ No newline at end of file diff --git a/Minecraft.Client/WolfModel.cpp b/Minecraft.Client/WolfModel.cpp index f4835ec3..d459240d 100644 --- a/Minecraft.Client/WolfModel.cpp +++ b/Minecraft.Client/WolfModel.cpp @@ -60,7 +60,7 @@ WolfModel::WolfModel() void WolfModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { Model::render(entity, time, r, bob, yRot, xRot, scale, usecompiled); - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); if (young) { @@ -94,7 +94,7 @@ void WolfModel::render(shared_ptr entity, float time, float r, float bob } } -void WolfModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +void WolfModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { shared_ptr wolf = dynamic_pointer_cast(mob); @@ -158,9 +158,9 @@ void WolfModel::prepareMobModel(shared_ptr mob, float time, float r, float tail->zRot = wolf->getBodyRollAngle(a, -.2f); } -void WolfModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void WolfModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - Model::setupAnim(time, r, bob, yRot, xRot, scale); + Model::setupAnim(time, r, bob, yRot, xRot, scale, entity); head->xRot = xRot / (float) (180 / PI); head->yRot = yRot / (float) (180 / PI); tail->xRot = bob; diff --git a/Minecraft.Client/WolfModel.h b/Minecraft.Client/WolfModel.h index ab26a9e8..4b7bda6c 100644 --- a/Minecraft.Client/WolfModel.h +++ b/Minecraft.Client/WolfModel.h @@ -16,6 +16,6 @@ private: public: WolfModel(); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); - void prepareMobModel(shared_ptr mob, float time, float r, float a); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/WolfRenderer.cpp b/Minecraft.Client/WolfRenderer.cpp index a21affa2..c4577db8 100644 --- a/Minecraft.Client/WolfRenderer.cpp +++ b/Minecraft.Client/WolfRenderer.cpp @@ -3,12 +3,17 @@ #include "MultiPlayerLocalPlayer.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +ResourceLocation *WolfRenderer::WOLF_LOCATION = new ResourceLocation(TN_MOB_WOLF); +ResourceLocation *WolfRenderer::WOLF_TAME_LOCATION = new ResourceLocation(TN_MOB_WOLF_TAME); +ResourceLocation *WolfRenderer::WOLF_ANGRY_LOCATION = new ResourceLocation(TN_MOB_WOLF_ANGRY); +ResourceLocation *WolfRenderer::WOLF_COLLAR_LOCATION = new ResourceLocation(TN_MOB_WOLF_COLLAR); + WolfRenderer::WolfRenderer(Model *model, Model *armor, float shadow) : MobRenderer(model, shadow) { setArmor(armor); } -float WolfRenderer::getBob(shared_ptr _mob, float a) +float WolfRenderer::getBob(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -16,7 +21,7 @@ float WolfRenderer::getBob(shared_ptr _mob, float a) return mob->getTailAngle(); } -int WolfRenderer::prepareArmor(shared_ptr mob, int layer, float a) +int WolfRenderer::prepareArmor(shared_ptr mob, int layer, float a) { if (mob->isInvisibleTo(Minecraft::GetInstance()->player)) return -1; // 4J-JEV: Todo, merge with java fix in '1.7.5'. @@ -24,14 +29,14 @@ int WolfRenderer::prepareArmor(shared_ptr mob, int layer, float a) if (layer == 0 && wolf->isWet()) { float brightness = wolf->getBrightness(a) * wolf->getWetShade(a); - bindTexture(wolf->getTexture()); + bindTexture(WOLF_LOCATION); glColor3f(brightness, brightness, brightness); return 1; } if (layer == 1 && wolf->isTame()) { - bindTexture(TN_MOB_WOLF_COLLAR); + bindTexture(WOLF_COLLAR_LOCATION); float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : wolf->getBrightness(a); int color = wolf->getCollarColor(); glColor3f(brightness * Sheep::COLOR[color][0], brightness * Sheep::COLOR[color][1], brightness * Sheep::COLOR[color][2]); @@ -40,3 +45,17 @@ int WolfRenderer::prepareArmor(shared_ptr mob, int layer, float a) } return -1; } + +ResourceLocation *WolfRenderer::getTextureLocation(shared_ptr _mob) +{ + shared_ptr mob = dynamic_pointer_cast(_mob); + if (mob->isTame()) + { + return WOLF_TAME_LOCATION; + } + if (mob->isAngry()) + { + return WOLF_ANGRY_LOCATION; + } + return WOLF_LOCATION; +} diff --git a/Minecraft.Client/WolfRenderer.h b/Minecraft.Client/WolfRenderer.h index 9cdf8caa..4d60b096 100644 --- a/Minecraft.Client/WolfRenderer.h +++ b/Minecraft.Client/WolfRenderer.h @@ -3,9 +3,17 @@ class WolfRenderer : public MobRenderer { +private: + static ResourceLocation *WOLF_LOCATION; + static ResourceLocation *WOLF_TAME_LOCATION; + static ResourceLocation *WOLF_ANGRY_LOCATION; + static ResourceLocation *WOLF_COLLAR_LOCATION; + public: WolfRenderer(Model *model, Model *armor, float shadow); + protected: - virtual float getBob(shared_ptr _mob, float a); - virtual int prepareArmor(shared_ptr mob, int layer, float a); -}; + virtual float getBob(shared_ptr _mob, float a); + virtual int prepareArmor(shared_ptr mob, int layer, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); +}; \ No newline at end of file diff --git a/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.cpp b/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.cpp index 37e24f7a..386a0206 100644 --- a/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.cpp +++ b/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.cpp @@ -12,7 +12,7 @@ unsigned char NetworkPlayerXbox::GetSmallId() return m_qnetPlayer->GetSmallId(); } -void NetworkPlayerXbox::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority) +void NetworkPlayerXbox::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack) { DWORD flags; flags = QNET_SENDDATA_RELIABLE | QNET_SENDDATA_SEQUENTIAL; @@ -20,6 +20,11 @@ void NetworkPlayerXbox::SendData(INetworkPlayer *player, const void *pvData, int m_qnetPlayer->SendData(((NetworkPlayerXbox *)player)->m_qnetPlayer, pvData, dataSize, flags); } +int NetworkPlayerXbox::GetOutstandingAckCount() +{ + return 0; +} + bool NetworkPlayerXbox::IsSameSystem(INetworkPlayer *player) { return ( m_qnetPlayer->IsSameSystem(((NetworkPlayerXbox *)player)->m_qnetPlayer) == TRUE ); @@ -119,3 +124,19 @@ IQNetPlayer *NetworkPlayerXbox::GetQNetPlayer() return m_qnetPlayer; } +void NetworkPlayerXbox::SentChunkPacket() +{ + m_lastChunkPacketTime = System::currentTimeMillis(); +} + +int NetworkPlayerXbox::GetTimeSinceLastChunkPacket_ms() +{ + // If we haven't ever sent a packet, return maximum + if( m_lastChunkPacketTime == 0 ) + { + return INT_MAX; + } + + __int64 currentTime = System::currentTimeMillis(); + return (int)( currentTime - m_lastChunkPacketTime ); +} \ No newline at end of file diff --git a/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h b/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h index 1822717c..bec7a125 100644 --- a/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h +++ b/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h @@ -11,8 +11,9 @@ public: // Common player interface NetworkPlayerXbox(IQNetPlayer *qnetPlayer); virtual unsigned char GetSmallId(); - virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority); + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack); virtual bool IsSameSystem(INetworkPlayer *player); + virtual int GetOutstandingAckCount(); virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ); virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ); virtual int GetCurrentRtt(); @@ -30,10 +31,13 @@ public: virtual const wchar_t *GetOnlineName(); virtual std::wstring GetDisplayName(); virtual PlayerUID GetUID(); + virtual void SentChunkPacket(); + virtual int GetTimeSinceLastChunkPacket_ms(); // Extra xbox-specific things IQNetPlayer *GetQNetPlayer(); private: IQNetPlayer *m_qnetPlayer; Socket *m_pSocket; + __int64 m_lastChunkPacketTime; }; \ No newline at end of file diff --git a/Minecraft.Client/ZombieModel.cpp b/Minecraft.Client/ZombieModel.cpp index 2063b830..648dd09f 100644 --- a/Minecraft.Client/ZombieModel.cpp +++ b/Minecraft.Client/ZombieModel.cpp @@ -15,9 +15,9 @@ ZombieModel::ZombieModel(float g, bool isArmor) : HumanoidModel(g, 0, 64, isArmo { } -void ZombieModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void ZombieModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, uiBitmaskOverrideAnim); + HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, entity, uiBitmaskOverrideAnim); float attack2 = Mth::sin(attackTime*PI); float attack = Mth::sin((1-(1-attackTime)*(1-attackTime))*PI); diff --git a/Minecraft.Client/ZombieModel.h b/Minecraft.Client/ZombieModel.h index 1971db09..208b4c30 100644 --- a/Minecraft.Client/ZombieModel.h +++ b/Minecraft.Client/ZombieModel.h @@ -12,5 +12,5 @@ protected: public: ZombieModel(float g, bool isArmor); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; diff --git a/Minecraft.Client/ZombieRenderer.cpp b/Minecraft.Client/ZombieRenderer.cpp index 5408736d..7fd2d201 100644 --- a/Minecraft.Client/ZombieRenderer.cpp +++ b/Minecraft.Client/ZombieRenderer.cpp @@ -4,6 +4,10 @@ #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "ZombieRenderer.h" +ResourceLocation ZombieRenderer::ZOMBIE_PIGMAN_LOCATION(TN_MOB_PIGZOMBIE); +ResourceLocation ZombieRenderer::ZOMBIE_LOCATION(TN_MOB_ZOMBIE); +ResourceLocation ZombieRenderer::ZOMBIE_VILLAGER_LOCATION(TN_MOB_ZOMBIE_VILLAGER); + ZombieRenderer::ZombieRenderer() : HumanoidMobRenderer(new ZombieModel(), .5f, 1.0f) { modelVersion = 1; @@ -34,7 +38,7 @@ void ZombieRenderer::createArmorParts() villagerArmorParts2 = new VillagerZombieModel(0.5f, 0, true); } -int ZombieRenderer::prepareArmor(shared_ptr _mob, int layer, float a) +int ZombieRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { shared_ptr mob = dynamic_pointer_cast(_mob); swapArmor(mob); @@ -48,7 +52,24 @@ void ZombieRenderer::render(shared_ptr _mob, double x, double y, double HumanoidMobRenderer::render(_mob, x, y, z, rot, a); } -void ZombieRenderer::additionalRendering(shared_ptr _mob, float a) +ResourceLocation *ZombieRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr mob = dynamic_pointer_cast(entity); + + // TODO Extract this clusterfck into 3 renderers + if ( entity->instanceof(eTYPE_PIGZOMBIE) ) + { + return &ZOMBIE_PIGMAN_LOCATION; + } + + if (mob->isVillager()) + { + return &ZOMBIE_VILLAGER_LOCATION; + } + return &ZOMBIE_LOCATION; +} + +void ZombieRenderer::additionalRendering(shared_ptr _mob, float a) { shared_ptr mob = dynamic_pointer_cast(_mob); swapArmor(mob); @@ -80,7 +101,7 @@ void ZombieRenderer::swapArmor(shared_ptr mob) humanoidModel = (HumanoidModel *) model; } -void ZombieRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) +void ZombieRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { shared_ptr mob = dynamic_pointer_cast(_mob); if (mob->isConverting()) diff --git a/Minecraft.Client/ZombieRenderer.h b/Minecraft.Client/ZombieRenderer.h index e070cc7b..c8f110b1 100644 --- a/Minecraft.Client/ZombieRenderer.h +++ b/Minecraft.Client/ZombieRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "HumanoidMobRenderer.h" class VillagerZombieModel; @@ -8,6 +7,10 @@ class Zombie; class ZombieRenderer : public HumanoidMobRenderer { private: + static ResourceLocation ZOMBIE_PIGMAN_LOCATION; + static ResourceLocation ZOMBIE_LOCATION; + static ResourceLocation ZOMBIE_VILLAGER_LOCATION; + HumanoidModel *defaultModel; VillagerZombieModel *villagerModel; @@ -24,18 +27,19 @@ public: ZombieRenderer(); protected: - void createArmorParts(); - int prepareArmor(shared_ptr _mob, int layer, float a); + virtual void createArmorParts(); + virtual int prepareArmor(shared_ptr _mob, int layer, float a); public: - void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr entity); protected: - void additionalRendering(shared_ptr _mob, float a); + virtual void additionalRendering(shared_ptr _mob, float a); private: - void swapArmor(shared_ptr mob); + virtual void swapArmor(shared_ptr mob); protected: - void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/compat_shims.cpp b/Minecraft.Client/compat_shims.cpp new file mode 100644 index 00000000..8e401c03 --- /dev/null +++ b/Minecraft.Client/compat_shims.cpp @@ -0,0 +1,5 @@ +#pragma comment(lib, "legacy_stdio_definitions.lib") + +namespace std { + char const* _Winerror_map(int) { return nullptr; } +} \ No newline at end of file diff --git a/Minecraft.Client/iob_shim.asm b/Minecraft.Client/iob_shim.asm new file mode 100644 index 00000000..4ad52c48 --- /dev/null +++ b/Minecraft.Client/iob_shim.asm @@ -0,0 +1,12 @@ +; iob_shim.asm +; Provides __iob_func for legacy libs compiled against pre-VS2015 CRT + +.code +EXTRN __acrt_iob_func:PROC + +__iob_func PROC + mov ecx, 0 + jmp __acrt_iob_func +__iob_func ENDP + +END \ No newline at end of file diff --git a/Minecraft.Client/sce_sys/keystone_vita b/Minecraft.Client/sce_sys/keystone_vita new file mode 100644 index 00000000..30388343 Binary files /dev/null and b/Minecraft.Client/sce_sys/keystone_vita differ diff --git a/Minecraft.Client/stdafx.h b/Minecraft.Client/stdafx.h index 05b17e81..25d93572 100644 --- a/Minecraft.Client/stdafx.h +++ b/Minecraft.Client/stdafx.h @@ -211,10 +211,10 @@ typedef XUID GameSessionUID; #include "Common\XUI\XUI_Scene_Base.h" #endif +#include "Common\App_defines.h" #include "Common\UI\UIEnums.h" #include "Common\UI\UIStructs.h" // #ifdef _XBOX -#include "Common\App_defines.h" #include "Common\App_enums.h" #include "Common\Tutorial\TutorialEnum.h" #include "Common\App_structs.h" diff --git a/Minecraft.World/AABB.cpp b/Minecraft.World/AABB.cpp index 4c867f0d..8bc8e140 100644 --- a/Minecraft.World/AABB.cpp +++ b/Minecraft.World/AABB.cpp @@ -49,7 +49,7 @@ void AABB::ReleaseThreadStorage() AABB *AABB::newPermanent(double x0, double y0, double z0, double x1, double y1, double z1) { - return new AABB(x0, y0, z0, x1, y1, z1); + return new AABB(x0, y0, z0, x1, y1, z1); } void AABB::clearPool() @@ -66,277 +66,289 @@ AABB *AABB::newTemp(double x0, double y0, double z0, double x1, double y1, doubl AABB *thisAABB = &tls->pool[tls->poolPointer]; thisAABB->set(x0, y0, z0, x1, y1, z1); tls->poolPointer = ( tls->poolPointer + 1 ) % ThreadStorage::POOL_SIZE; - return thisAABB; + return thisAABB; } AABB::AABB(double x0, double y0, double z0, double x1, double y1, double z1) { - this->x0 = x0; - this->y0 = y0; - this->z0 = z0; - this->x1 = x1; - this->y1 = y1; - this->z1 = z1; + this->x0 = x0; + this->y0 = y0; + this->z0 = z0; + this->x1 = x1; + this->y1 = y1; + this->z1 = z1; } AABB *AABB::set(double x0, double y0, double z0, double x1, double y1, double z1) { - this->x0 = x0; - this->y0 = y0; - this->z0 = z0; - this->x1 = x1; - this->y1 = y1; - this->z1 = z1; - return this; + this->x0 = x0; + this->y0 = y0; + this->z0 = z0; + this->x1 = x1; + this->y1 = y1; + this->z1 = z1; + return this; } AABB *AABB::expand(double xa, double ya, double za) { - double _x0 = x0; - double _y0 = y0; - double _z0 = z0; - double _x1 = x1; - double _y1 = y1; - double _z1 = z1; + double _x0 = x0; + double _y0 = y0; + double _z0 = z0; + double _x1 = x1; + double _y1 = y1; + double _z1 = z1; - if (xa < 0) _x0 += xa; - if (xa > 0) _x1 += xa; + if (xa < 0) _x0 += xa; + if (xa > 0) _x1 += xa; - if (ya < 0) _y0 += ya; - if (ya > 0) _y1 += ya; + if (ya < 0) _y0 += ya; + if (ya > 0) _y1 += ya; - if (za < 0) _z0 += za; - if (za > 0) _z1 += za; + if (za < 0) _z0 += za; + if (za > 0) _z1 += za; - return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); + return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); } AABB *AABB::grow(double xa, double ya, double za) { - double _x0 = x0 - xa; - double _y0 = y0 - ya; - double _z0 = z0 - za; - double _x1 = x1 + xa; - double _y1 = y1 + ya; - double _z1 = z1 + za; + double _x0 = x0 - xa; + double _y0 = y0 - ya; + double _z0 = z0 - za; + double _x1 = x1 + xa; + double _y1 = y1 + ya; + double _z1 = z1 + za; - return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); + return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); +} + +AABB *AABB::minmax(AABB *other) +{ + double _x0 = min(x0, other->x0); + double _y0 = min(y0, other->y0); + double _z0 = min(z0, other->z0); + double _x1 = max(x1, other->x1); + double _y1 = max(y1, other->y1); + double _z1 = max(z1, other->z1); + + return newTemp(_x0, _y0, _z0, _x1, _y1, _z1); } AABB *AABB::cloneMove(double xa, double ya, double za) { - return AABB::newTemp(x0 + xa, y0 + ya, z0 + za, x1 + xa, y1 + ya, z1 + za); + return AABB::newTemp(x0 + xa, y0 + ya, z0 + za, x1 + xa, y1 + ya, z1 + za); } double AABB::clipXCollide(AABB *c, double xa) { - if (c->y1 <= y0 || c->y0 >= y1) return xa; - if (c->z1 <= z0 || c->z0 >= z1) return xa; + if (c->y1 <= y0 || c->y0 >= y1) return xa; + if (c->z1 <= z0 || c->z0 >= z1) return xa; - if (xa > 0 && c->x1 <= x0) + if (xa > 0 && c->x1 <= x0) { - double max = x0 - c->x1; - if (max < xa) xa = max; - } - if (xa < 0 && c->x0 >= x1) + double max = x0 - c->x1; + if (max < xa) xa = max; + } + if (xa < 0 && c->x0 >= x1) { - double max = x1 - c->x0; - if (max > xa) xa = max; - } + double max = x1 - c->x0; + if (max > xa) xa = max; + } - return xa; + return xa; } double AABB::clipYCollide(AABB *c, double ya) { - if (c->x1 <= x0 || c->x0 >= x1) return ya; - if (c->z1 <= z0 || c->z0 >= z1) return ya; + if (c->x1 <= x0 || c->x0 >= x1) return ya; + if (c->z1 <= z0 || c->z0 >= z1) return ya; - if (ya > 0 && c->y1 <= y0) + if (ya > 0 && c->y1 <= y0) { - double max = y0 - c->y1; - if (max < ya) ya = max; - } - if (ya < 0 && c->y0 >= y1) + double max = y0 - c->y1; + if (max < ya) ya = max; + } + if (ya < 0 && c->y0 >= y1) { - double max = y1 - c->y0; - if (max > ya) ya = max; - } + double max = y1 - c->y0; + if (max > ya) ya = max; + } - return ya; + return ya; } double AABB::clipZCollide(AABB *c, double za) { - if (c->x1 <= x0 || c->x0 >= x1) return za; - if (c->y1 <= y0 || c->y0 >= y1) return za; + if (c->x1 <= x0 || c->x0 >= x1) return za; + if (c->y1 <= y0 || c->y0 >= y1) return za; - if (za > 0 && c->z1 <= z0) + if (za > 0 && c->z1 <= z0) { - double max = z0 - c->z1; - if (max < za) za = max; - } - if (za < 0 && c->z0 >= z1) + double max = z0 - c->z1; + if (max < za) za = max; + } + if (za < 0 && c->z0 >= z1) { - double max = z1 - c->z0; - if (max > za) za = max; - } + double max = z1 - c->z0; + if (max > za) za = max; + } - return za; + return za; } bool AABB::intersects(AABB *c) { - if (c->x1 <= x0 || c->x0 >= x1) return false; - if (c->y1 <= y0 || c->y0 >= y1) return false; - if (c->z1 <= z0 || c->z0 >= z1) return false; - return true; + if (c->x1 <= x0 || c->x0 >= x1) return false; + if (c->y1 <= y0 || c->y0 >= y1) return false; + if (c->z1 <= z0 || c->z0 >= z1) return false; + return true; } bool AABB::intersectsInner(AABB *c) { - if (c->x1 < x0 || c->x0 > x1) return false; - if (c->y1 < y0 || c->y0 > y1) return false; - if (c->z1 < z0 || c->z0 > z1) return false; - return true; + if (c->x1 < x0 || c->x0 > x1) return false; + if (c->y1 < y0 || c->y0 > y1) return false; + if (c->z1 < z0 || c->z0 > z1) return false; + return true; } AABB *AABB::move(double xa, double ya, double za) { - x0 += xa; - y0 += ya; - z0 += za; - x1 += xa; - y1 += ya; - z1 += za; - return this; + x0 += xa; + y0 += ya; + z0 += za; + x1 += xa; + y1 += ya; + z1 += za; + return this; } bool AABB::intersects(double x02, double y02, double z02, double x12, double y12, double z12) { - if (x12 <= x0 || x02 >= x1) return false; - if (y12 <= y0 || y02 >= y1) return false; - if (z12 <= z0 || z02 >= z1) return false; - return true; + if (x12 <= x0 || x02 >= x1) return false; + if (y12 <= y0 || y02 >= y1) return false; + if (z12 <= z0 || z02 >= z1) return false; + return true; } bool AABB::contains(Vec3 *p) { - if (p->x <= x0 || p->x >= x1) return false; - if (p->y <= y0 || p->y >= y1) return false; - if (p->z <= z0 || p->z >= z1) return false; - return true; + if (p->x <= x0 || p->x >= x1) return false; + if (p->y <= y0 || p->y >= y1) return false; + if (p->z <= z0 || p->z >= z1) return false; + return true; } // 4J Added bool AABB::containsIncludingLowerBound(Vec3 *p) { - if (p->x < x0 || p->x >= x1) return false; - if (p->y < y0 || p->y >= y1) return false; - if (p->z < z0 || p->z >= z1) return false; - return true; + if (p->x < x0 || p->x >= x1) return false; + if (p->y < y0 || p->y >= y1) return false; + if (p->z < z0 || p->z >= z1) return false; + return true; } double AABB::getSize() { - double xs = x1 - x0; - double ys = y1 - y0; - double zs = z1 - z0; - return (xs + ys + zs) / 3.0f; + double xs = x1 - x0; + double ys = y1 - y0; + double zs = z1 - z0; + return (xs + ys + zs) / 3.0f; } AABB *AABB::shrink(double xa, double ya, double za) { - double _x0 = x0 + xa; - double _y0 = y0 + ya; - double _z0 = z0 + za; - double _x1 = x1 - xa; - double _y1 = y1 - ya; - double _z1 = z1 - za; + double _x0 = x0 + xa; + double _y0 = y0 + ya; + double _z0 = z0 + za; + double _x1 = x1 - xa; + double _y1 = y1 - ya; + double _z1 = z1 - za; - return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); + return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); } AABB *AABB::copy() { - return AABB::newTemp(x0, y0, z0, x1, y1, z1); + return AABB::newTemp(x0, y0, z0, x1, y1, z1); } HitResult *AABB::clip(Vec3 *a, Vec3 *b) { - Vec3 *xh0 = a->clipX(b, x0); - Vec3 *xh1 = a->clipX(b, x1); + Vec3 *xh0 = a->clipX(b, x0); + Vec3 *xh1 = a->clipX(b, x1); - Vec3 *yh0 = a->clipY(b, y0); - Vec3 *yh1 = a->clipY(b, y1); + Vec3 *yh0 = a->clipY(b, y0); + Vec3 *yh1 = a->clipY(b, y1); - Vec3 *zh0 = a->clipZ(b, z0); - Vec3 *zh1 = a->clipZ(b, z1); + Vec3 *zh0 = a->clipZ(b, z0); + Vec3 *zh1 = a->clipZ(b, z1); - if (!containsX(xh0)) xh0 = NULL; - if (!containsX(xh1)) xh1 = NULL; - if (!containsY(yh0)) yh0 = NULL; - if (!containsY(yh1)) yh1 = NULL; - if (!containsZ(zh0)) zh0 = NULL; - if (!containsZ(zh1)) zh1 = NULL; + if (!containsX(xh0)) xh0 = NULL; + if (!containsX(xh1)) xh1 = NULL; + if (!containsY(yh0)) yh0 = NULL; + if (!containsY(yh1)) yh1 = NULL; + if (!containsZ(zh0)) zh0 = NULL; + if (!containsZ(zh1)) zh1 = NULL; - Vec3 *closest = NULL; + Vec3 *closest = NULL; - if (xh0 != NULL && (closest == NULL || a->distanceToSqr(xh0) < a->distanceToSqr(closest))) closest = xh0; - if (xh1 != NULL && (closest == NULL || a->distanceToSqr(xh1) < a->distanceToSqr(closest))) closest = xh1; - if (yh0 != NULL && (closest == NULL || a->distanceToSqr(yh0) < a->distanceToSqr(closest))) closest = yh0; - if (yh1 != NULL && (closest == NULL || a->distanceToSqr(yh1) < a->distanceToSqr(closest))) closest = yh1; - if (zh0 != NULL && (closest == NULL || a->distanceToSqr(zh0) < a->distanceToSqr(closest))) closest = zh0; - if (zh1 != NULL && (closest == NULL || a->distanceToSqr(zh1) < a->distanceToSqr(closest))) closest = zh1; + if (xh0 != NULL && (closest == NULL || a->distanceToSqr(xh0) < a->distanceToSqr(closest))) closest = xh0; + if (xh1 != NULL && (closest == NULL || a->distanceToSqr(xh1) < a->distanceToSqr(closest))) closest = xh1; + if (yh0 != NULL && (closest == NULL || a->distanceToSqr(yh0) < a->distanceToSqr(closest))) closest = yh0; + if (yh1 != NULL && (closest == NULL || a->distanceToSqr(yh1) < a->distanceToSqr(closest))) closest = yh1; + if (zh0 != NULL && (closest == NULL || a->distanceToSqr(zh0) < a->distanceToSqr(closest))) closest = zh0; + if (zh1 != NULL && (closest == NULL || a->distanceToSqr(zh1) < a->distanceToSqr(closest))) closest = zh1; - if (closest == NULL) return NULL; + if (closest == NULL) return NULL; - int face = -1; + int face = -1; - if (closest == xh0) face = 4; - if (closest == xh1) face = 5; - if (closest == yh0) face = 0; - if (closest == yh1) face = 1; - if (closest == zh0) face = 2; - if (closest == zh1) face = 3; + if (closest == xh0) face = 4; + if (closest == xh1) face = 5; + if (closest == yh0) face = 0; + if (closest == yh1) face = 1; + if (closest == zh0) face = 2; + if (closest == zh1) face = 3; - return new HitResult(0, 0, 0, face, closest); + return new HitResult(0, 0, 0, face, closest); } bool AABB::containsX(Vec3 *v) { - if (v == NULL) return false; - return v->y >= y0 && v->y <= y1 && v->z >= z0 && v->z <= z1; + if (v == NULL) return false; + return v->y >= y0 && v->y <= y1 && v->z >= z0 && v->z <= z1; } bool AABB::containsY(Vec3 *v) { - if (v == NULL) return false; - return v->x >= x0 && v->x <= x1 && v->z >= z0 && v->z <= z1; + if (v == NULL) return false; + return v->x >= x0 && v->x <= x1 && v->z >= z0 && v->z <= z1; } bool AABB::containsZ(Vec3 *v) { - if (v == NULL) return false; - return v->x >= x0 && v->x <= x1 && v->y >= y0 && v->y <= y1; + if (v == NULL) return false; + return v->x >= x0 && v->x <= x1 && v->y >= y0 && v->y <= y1; } void AABB::set(AABB *b) { - this->x0 = b->x0; - this->y0 = b->y0; - this->z0 = b->z0; - this->x1 = b->x1; - this->y1 = b->y1; - this->z1 = b->z1; + x0 = b->x0; + y0 = b->y0; + z0 = b->z0; + x1 = b->x1; + y1 = b->y1; + z1 = b->z1; } wstring AABB::toString() { - return L"box[" + _toString(x0) + L", " + _toString(y0) + L", " + _toString(z0) + L" -> " + + return L"box[" + _toString(x0) + L", " + _toString(y0) + L", " + _toString(z0) + L" -> " + _toString(x1) + L", " + _toString(y1) + L", " + _toString(z1) + L"]"; } diff --git a/Minecraft.World/AABB.h b/Minecraft.World/AABB.h index 81405ea1..4f7a3531 100644 --- a/Minecraft.World/AABB.h +++ b/Minecraft.World/AABB.h @@ -42,7 +42,7 @@ public: AABB *set(double x0, double y0, double z0, double x1, double y1, double z1); AABB *expand(double xa, double ya, double za); AABB *grow(double xa, double ya, double za); -public: + AABB *minmax(AABB *other); AABB *cloneMove(double xa, double ya, double za); double clipXCollide(AABB *c, double xa); double clipYCollide(AABB *c, double ya); diff --git a/Minecraft.World/Abilities.cpp b/Minecraft.World/Abilities.cpp index 06006860..1177937b 100644 --- a/Minecraft.World/Abilities.cpp +++ b/Minecraft.World/Abilities.cpp @@ -63,7 +63,7 @@ float Abilities::getFlyingSpeed() void Abilities::setFlyingSpeed(float value) { - this->flyingSpeed = value; + flyingSpeed = value; } float Abilities::getWalkingSpeed() @@ -73,5 +73,5 @@ float Abilities::getWalkingSpeed() void Abilities::setWalkingSpeed(float value) { - this->walkingSpeed = value; + walkingSpeed = value; } \ No newline at end of file diff --git a/Minecraft.World/AbsoptionMobEffect.cpp b/Minecraft.World/AbsoptionMobEffect.cpp new file mode 100644 index 00000000..6f5e1647 --- /dev/null +++ b/Minecraft.World/AbsoptionMobEffect.cpp @@ -0,0 +1,20 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.effect.h" +#include "AbsoptionMobEffect.h" + +AbsoptionMobEffect::AbsoptionMobEffect(int id, bool isHarmful, eMinecraftColour color) : MobEffect(id, isHarmful, color) +{ +} + +void AbsoptionMobEffect::removeAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier) +{ + entity->setAbsorptionAmount(entity->getAbsorptionAmount() - 4 * (amplifier + 1)); + MobEffect::removeAttributeModifiers(entity, attributes, amplifier); +} + +void AbsoptionMobEffect::addAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier) +{ + entity->setAbsorptionAmount(entity->getAbsorptionAmount() + 4 * (amplifier + 1)); + MobEffect::addAttributeModifiers(entity, attributes, amplifier); +} diff --git a/Minecraft.World/AbsoptionMobEffect.h b/Minecraft.World/AbsoptionMobEffect.h new file mode 100644 index 00000000..568186b7 --- /dev/null +++ b/Minecraft.World/AbsoptionMobEffect.h @@ -0,0 +1,14 @@ +#pragma once + +class LivingEntity; + +#include "MobEffect.h" + +class AbsoptionMobEffect : public MobEffect +{ +public: + AbsoptionMobEffect(int id, bool isHarmful, eMinecraftColour color); + + void removeAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier); + void addAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier); +}; \ No newline at end of file diff --git a/Minecraft.World/AbstractContainerMenu.cpp b/Minecraft.World/AbstractContainerMenu.cpp index 71d30feb..082e8008 100644 --- a/Minecraft.World/AbstractContainerMenu.cpp +++ b/Minecraft.World/AbstractContainerMenu.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.redstone.h" #include "Slot.h" #include "AbstractContainerMenu.h" @@ -8,46 +9,36 @@ // TODO Make sure all derived classes also call this AbstractContainerMenu::AbstractContainerMenu() { - lastSlots = new vector >(); - slots = new vector(); containerId = 0; changeUid = 0; - m_bNeedsRendered = false; - containerListeners = new vector(); + quickcraftType = -1; + quickcraftStatus = 0; + + m_bNeedsRendered = false; } AbstractContainerMenu::~AbstractContainerMenu() { - delete lastSlots; - for( unsigned int i = 0; i < slots->size(); i++ ) + for( unsigned int i = 0; i < slots.size(); i++ ) { - delete slots->at(i); + delete slots.at(i); } - delete slots; - delete containerListeners; } Slot *AbstractContainerMenu::addSlot(Slot *slot) { - slot->index = (int)slots->size(); - slots->push_back(slot); - lastSlots->push_back(nullptr); + slot->index = (int)slots.size(); + slots.push_back(slot); + lastSlots.push_back(nullptr); return slot; } void AbstractContainerMenu::addSlotListener(ContainerListener *listener) { - // TODO 4J Add exceptions - /* - if (containerListeners->contains(listener)) { - throw new IllegalArgumentException("Listener already listening"); - } - */ - containerListeners->push_back(listener); - + containerListeners.push_back(listener); vector > *items = getItems(); listener->refreshContainer(this, items); @@ -55,11 +46,17 @@ void AbstractContainerMenu::addSlotListener(ContainerListener *listener) broadcastChanges(); } +void AbstractContainerMenu::removeSlotListener(ContainerListener *listener) +{ + AUTO_VAR(it, std::find(containerListeners.begin(), containerListeners.end(), listener) ); + if(it != containerListeners.end()) containerListeners.erase(it); +} + vector > *AbstractContainerMenu::getItems() { vector > *items = new vector >(); - AUTO_VAR(itEnd, slots->end()); - for (AUTO_VAR(it, slots->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, slots.end()); + for (AUTO_VAR(it, slots.begin()); it != itEnd; it++) { items->push_back((*it)->getItem()); } @@ -68,8 +65,8 @@ vector > *AbstractContainerMenu::getItems() void AbstractContainerMenu::sendData(int id, int value) { - AUTO_VAR(itEnd, containerListeners->end()); - for (AUTO_VAR(it, containerListeners->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, containerListeners.end()); + for (AUTO_VAR(it, containerListeners.begin()); it != itEnd; it++) { (*it)->setContainerData(this, id, value); } @@ -77,18 +74,20 @@ void AbstractContainerMenu::sendData(int id, int value) void AbstractContainerMenu::broadcastChanges() { - for (unsigned int i = 0; i < slots->size(); i++) + for (unsigned int i = 0; i < slots.size(); i++) { - shared_ptr current = slots->at(i)->getItem(); - shared_ptr expected = lastSlots->at(i); + shared_ptr current = slots.at(i)->getItem(); + shared_ptr expected = lastSlots.at(i); if (!ItemInstance::matches(expected, current)) { - expected = current == NULL ? nullptr : current->copy(); - (*lastSlots)[i] = expected; + // 4J Stu - Added 0 count check. There is a bug in the Java with anvils that means this broadcast + // happens while we are in the middle of quickmoving, and before the slot properly gets set to null + expected = (current == NULL || current->count == 0) ? nullptr : current->copy(); + lastSlots[i] = expected; m_bNeedsRendered = true; - AUTO_VAR(itEnd, containerListeners->end()); - for (AUTO_VAR(it, containerListeners->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, containerListeners.end()); + for (AUTO_VAR(it, containerListeners.begin()); it != itEnd; it++) { (*it)->slotChanged(this, i, expected); } @@ -101,14 +100,14 @@ bool AbstractContainerMenu::needsRendered() bool needsRendered = m_bNeedsRendered; m_bNeedsRendered = false; - for (unsigned int i = 0; i < slots->size(); i++) + for (unsigned int i = 0; i < slots.size(); i++) { - shared_ptr current = slots->at(i)->getItem(); - shared_ptr expected = lastSlots->at(i); + shared_ptr current = slots.at(i)->getItem(); + shared_ptr expected = lastSlots.at(i); if (!ItemInstance::matches(expected, current)) { expected = current == NULL ? nullptr : current->copy(); - (*lastSlots)[i] = expected; + lastSlots[i] = expected; needsRendered = true; } } @@ -123,8 +122,8 @@ bool AbstractContainerMenu::clickMenuButton(shared_ptr player, int butto Slot *AbstractContainerMenu::getSlotFor(shared_ptr c, int index) { - AUTO_VAR(itEnd, slots->end()); - for (AUTO_VAR(it, slots->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, slots.end()); + for (AUTO_VAR(it, slots.begin()); it != itEnd; it++) { Slot *slot = *it; //slots->at(i); if (slot->isAt(c, index)) @@ -137,12 +136,12 @@ Slot *AbstractContainerMenu::getSlotFor(shared_ptr c, int index) Slot *AbstractContainerMenu::getSlot(int index) { - return slots->at(index); + return slots.at(index); } shared_ptr AbstractContainerMenu::quickMoveStack(shared_ptr player, int slotIndex) { - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL) { return slot->getItem(); @@ -150,18 +149,97 @@ shared_ptr AbstractContainerMenu::quickMoveStack(shared_ptr AbstractContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) +shared_ptr AbstractContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped) // 4J Added looped param { shared_ptr clickedEntity = nullptr; shared_ptr inventory = player->inventory; - if ((clickType == CLICK_PICKUP || clickType == CLICK_QUICK_MOVE) && (buttonNum == 0 || buttonNum == 1)) + if (clickType == CLICK_QUICK_CRAFT) + { + int expectedStatus = quickcraftStatus; + quickcraftStatus = getQuickcraftHeader(buttonNum); + + if ((expectedStatus != QUICKCRAFT_HEADER_CONTINUE || quickcraftStatus != QUICKCRAFT_HEADER_END) && expectedStatus != quickcraftStatus) + { + resetQuickCraft(); + } + else if (inventory->getCarried() == NULL) + { + resetQuickCraft(); + } + else if (quickcraftStatus == QUICKCRAFT_HEADER_START) + { + quickcraftType = getQuickcraftType(buttonNum); + + if (isValidQuickcraftType(quickcraftType)) + { + quickcraftStatus = QUICKCRAFT_HEADER_CONTINUE; + quickcraftSlots.clear(); + } + else + { + resetQuickCraft(); + } + } + else if (quickcraftStatus == QUICKCRAFT_HEADER_CONTINUE) + { + Slot *slot = slots.at(slotIndex); + + if (slot != NULL && canItemQuickReplace(slot, inventory->getCarried(), true) && slot->mayPlace(inventory->getCarried()) && inventory->getCarried()->count > quickcraftSlots.size() && canDragTo(slot)) + { + quickcraftSlots.insert(slot); + } + } + else if (quickcraftStatus == QUICKCRAFT_HEADER_END) + { + if (!quickcraftSlots.empty()) + { + shared_ptr source = inventory->getCarried()->copy(); + int remaining = inventory->getCarried()->count; + + for(AUTO_VAR(it, quickcraftSlots.begin()); it != quickcraftSlots.end(); ++it) + { + Slot *slot = *it; + if (slot != NULL && canItemQuickReplace(slot, inventory->getCarried(), true) && slot->mayPlace(inventory->getCarried()) && inventory->getCarried()->count >= quickcraftSlots.size() && canDragTo(slot)) + { + shared_ptr copy = source->copy(); + int carry = slot->hasItem() ? slot->getItem()->count : 0; + getQuickCraftSlotCount(&quickcraftSlots, quickcraftType, copy, carry); + + if (copy->count > copy->getMaxStackSize()) copy->count = copy->getMaxStackSize(); + if (copy->count > slot->getMaxStackSize()) copy->count = slot->getMaxStackSize(); + + remaining -= copy->count - carry; + slot->set(copy); + } + } + + source->count = remaining; + if (source->count <= 0) + { + source = nullptr; + } + inventory->setCarried(source); + } + + resetQuickCraft(); + } + else + { + resetQuickCraft(); + } + } + else if (quickcraftStatus != QUICKCRAFT_HEADER_START) + { + resetQuickCraft(); + } + else if ((clickType == CLICK_PICKUP || clickType == CLICK_QUICK_MOVE) && (buttonNum == 0 || buttonNum == 1)) { - if (slotIndex == CLICKED_OUTSIDE) + if (slotIndex == SLOT_CLICKED_OUTSIDE) { if (inventory->getCarried() != NULL) { - if (slotIndex == CLICKED_OUTSIDE) + if (slotIndex == SLOT_CLICKED_OUTSIDE) { if (buttonNum == 0) { @@ -179,23 +257,38 @@ shared_ptr AbstractContainerMenu::clicked(int slotIndex, int butto } else if (clickType == CLICK_QUICK_MOVE) { - Slot *slot = slots->at(slotIndex); + if (slotIndex < 0) return nullptr; + Slot *slot = slots.at(slotIndex); if(slot != NULL && slot->mayPickup(player)) { shared_ptr piiClicked = quickMoveStack(player, slotIndex); if (piiClicked != NULL) { - //int oldSize = piiClicked->count; // 4J - Commented 1.8.2 and replaced with below int oldType = piiClicked->id; - clickedEntity = piiClicked->copy(); + // 4J Stu - We ignore the return value for loopClicks, so don't make a copy + if(!looped) + { + clickedEntity = piiClicked->copy(); + } + + // 4J Stu - Remove the reference to this before we start a recursive loop + piiClicked = nullptr; if (slot != NULL) { if (slot->getItem() != NULL && slot->getItem()->id == oldType) { - // 4J Stu - Brought forward loopClick from 1.2 to fix infinite recursion bug in creative - loopClick(slotIndex, buttonNum, true, player); + if(looped) + { + // Return a non-null value to indicate that we want to loop more + clickedEntity = shared_ptr(new ItemInstance(0,1,0)); + } + else + { + // 4J Stu - Brought forward loopClick from 1.2 to fix infinite recursion bug in creative + loopClick(slotIndex, buttonNum, true, player); + } } } } @@ -205,7 +298,7 @@ shared_ptr AbstractContainerMenu::clicked(int slotIndex, int butto { if (slotIndex < 0) return nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL) { shared_ptr clicked = slot->getItem(); @@ -225,7 +318,10 @@ shared_ptr AbstractContainerMenu::clicked(int slotIndex, int butto { c = slot->getMaxStackSize(); } - slot->set(carried->remove(c)); + if (carried->count >= c) + { + slot->set(carried->remove(c)); + } if (carried->count == 0) { inventory->setCarried(nullptr); @@ -318,7 +414,7 @@ shared_ptr AbstractContainerMenu::clicked(int slotIndex, int butto } else if (clickType == CLICK_SWAP && buttonNum >= 0 && buttonNum < 9) { - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot->mayPickup(player)) { shared_ptr current = inventory->getItem(buttonNum); @@ -359,7 +455,7 @@ shared_ptr AbstractContainerMenu::clicked(int slotIndex, int butto } else if (clickType == CLICK_CLONE && player->abilities.instabuild && inventory->getCarried() == NULL && slotIndex >= 0) { - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL && slot->hasItem()) { shared_ptr copy = slot->getItem()->copy(); @@ -367,13 +463,66 @@ shared_ptr AbstractContainerMenu::clicked(int slotIndex, int butto inventory->setCarried(copy); } } + else if (clickType == CLICK_THROW && inventory->getCarried() == NULL && slotIndex >= 0) + { + Slot *slot = slots.at(slotIndex); + if (slot != NULL && slot->hasItem() && slot->mayPickup(player)) + { + shared_ptr item = slot->remove(buttonNum == 0 ? 1 : slot->getItem()->count); + slot->onTake(player, item); + player->drop(item); + } + } + else if (clickType == CLICK_PICKUP_ALL && slotIndex >= 0) + { + Slot *slot = slots.at(slotIndex); + shared_ptr carried = inventory->getCarried(); + + if (carried != NULL && (slot == NULL || !slot->hasItem() || !slot->mayPickup(player))) + { + int start = buttonNum == 0 ? 0 : slots.size() - 1; + int step = buttonNum == 0 ? 1 : -1; + + for (int pass = 0; pass < 2; pass++ ) + { + // In the first pass, we only get partial stacks. + for (int i = start; i >= 0 && i < slots.size() && carried->count < carried->getMaxStackSize(); i += step) + { + Slot *target = slots.at(i); + + if (target->hasItem() && canItemQuickReplace(target, carried, true) && target->mayPickup(player) && canTakeItemForPickAll(carried, target)) + { + if (pass == 0 && target->getItem()->count == target->getItem()->getMaxStackSize()) continue; + int count = min(carried->getMaxStackSize() - carried->count, target->getItem()->count); + shared_ptr removed = target->remove(count); + carried->count += count; + + if (removed->count <= 0) + { + target->set(nullptr); + } + target->onTake(player, removed); + } + } + } + } + + broadcastChanges(); + } return clickedEntity; } +bool AbstractContainerMenu::canTakeItemForPickAll(shared_ptr carried, Slot *target) +{ + return true; +} + // 4J Stu - Brought forward from 1.2 to fix infinite recursion bug in creative void AbstractContainerMenu::loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, shared_ptr player) { - clicked(slotIndex, buttonNum, CLICK_QUICK_MOVE, player); + while( clicked(slotIndex, buttonNum, CLICK_QUICK_MOVE, player, true) != NULL) + { + } } bool AbstractContainerMenu::mayCombine(Slot *slot, shared_ptr item) @@ -460,7 +609,7 @@ bool AbstractContainerMenu::moveItemStackTo(shared_ptr itemStack, while (itemStack->count > 0 && ((!backwards && destSlot < endSlot) || (backwards && destSlot >= startSlot))) { - Slot *slot = slots->at(destSlot); + Slot *slot = slots.at(destSlot); shared_ptr target = slot->getItem(); if (target != NULL && target->id == itemStack->id && (!itemStack->isStackedByData() || itemStack->getAuxValue() == target->getAuxValue()) && ItemInstance::tagMatches(itemStack, target) ) @@ -506,7 +655,7 @@ bool AbstractContainerMenu::moveItemStackTo(shared_ptr itemStack, } while ((!backwards && destSlot < endSlot) || (backwards && destSlot >= startSlot)) { - Slot *slot = slots->at(destSlot); + Slot *slot = slots.at(destSlot); shared_ptr target = slot->getItem(); if (target == NULL) @@ -535,3 +684,88 @@ bool AbstractContainerMenu::isOverrideResultClick(int slotNum, int buttonNum) { return false; } + +int AbstractContainerMenu::getQuickcraftType(int mask) +{ + return (mask >> 2) & 0x3; +} + +int AbstractContainerMenu::getQuickcraftHeader(int mask) +{ + return mask & 0x3; +} + +int AbstractContainerMenu::getQuickcraftMask(int header, int type) +{ + return (header & 0x3) | ((type & 0x3) << 2); +} + +bool AbstractContainerMenu::isValidQuickcraftType(int type) +{ + return type == QUICKCRAFT_TYPE_CHARITABLE || type == QUICKCRAFT_TYPE_GREEDY; +} + +void AbstractContainerMenu::resetQuickCraft() +{ + quickcraftStatus = QUICKCRAFT_HEADER_START; + quickcraftSlots.clear(); +} + +bool AbstractContainerMenu::canItemQuickReplace(Slot *slot, shared_ptr item, bool ignoreSize) +{ + bool canReplace = slot == NULL || !slot->hasItem(); + + if (slot != NULL && slot->hasItem() && item != NULL && item->sameItem(slot->getItem()) && ItemInstance::tagMatches(slot->getItem(), item)) + { + canReplace |= slot->getItem()->count + (ignoreSize ? 0 : item->count) <= item->getMaxStackSize(); + } + + return canReplace; +} + +void AbstractContainerMenu::getQuickCraftSlotCount(unordered_set *quickCraftSlots, int quickCraftingType, shared_ptr item, int carry) +{ + switch (quickCraftingType) + { + case QUICKCRAFT_TYPE_CHARITABLE: + item->count = Mth::floor(item->count / (float) quickCraftSlots->size()); + break; + case QUICKCRAFT_TYPE_GREEDY: + item->count = 1; + break; + } + + item->count += carry; +} + +bool AbstractContainerMenu::canDragTo(Slot *slot) +{ + return true; +} + +int AbstractContainerMenu::getRedstoneSignalFromContainer(shared_ptr container) +{ + if (container == NULL) return 0; + int count = 0; + float totalPct = 0; + + for (int i = 0; i < container->getContainerSize(); i++) + { + shared_ptr item = container->getItem(i); + + if (item != NULL) + { + totalPct += item->count / (float) min(container->getMaxStackSize(), item->getMaxStackSize()); + count++; + } + } + + totalPct /= container->getContainerSize(); + return Mth::floor(totalPct * (Redstone::SIGNAL_MAX - 1)) + (count > 0 ? 1 : 0); +} + +// 4J Added +bool AbstractContainerMenu::isValidIngredient(shared_ptr item, int slotId) +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.World/AbstractContainerMenu.h b/Minecraft.World/AbstractContainerMenu.h index f34e1afc..5ac115de 100644 --- a/Minecraft.World/AbstractContainerMenu.h +++ b/Minecraft.World/AbstractContainerMenu.h @@ -14,28 +14,43 @@ class Container; class AbstractContainerMenu { public: - static const int CLICKED_OUTSIDE = -999; + static const int SLOT_CLICKED_OUTSIDE = -999; static const int CLICK_PICKUP = 0; static const int CLICK_QUICK_MOVE = 1; static const int CLICK_SWAP = 2; static const int CLICK_CLONE = 3; + static const int CLICK_THROW = 4; + static const int CLICK_QUICK_CRAFT = 5; + static const int CLICK_PICKUP_ALL = 6; + + static const int QUICKCRAFT_TYPE_CHARITABLE = 0; + static const int QUICKCRAFT_TYPE_GREEDY = 1; + static const int QUICKCRAFT_HEADER_START = 0; + static const int QUICKCRAFT_HEADER_CONTINUE = 1; + static const int QUICKCRAFT_HEADER_END = 2; // 4J Stu - Added these to fix problem with items picked up while in the creative menu replacing slots in the creative menu static const int CONTAINER_ID_CARRIED = -1; static const int CONTAINER_ID_INVENTORY = 0; static const int CONTAINER_ID_CREATIVE = -2; - vector > *lastSlots; - vector *slots; + vector > lastSlots; + vector slots; int containerId; private: short changeUid; + + int quickcraftType; + int quickcraftStatus; + unordered_set quickcraftSlots; + +private: bool m_bNeedsRendered; // 4J added protected: - vector *containerListeners; + vector containerListeners; // 4J Stu - The java does not have ctor here (being an abstract) but we need one to initialise the member variables // TODO Make sure all derived classes also call this @@ -46,18 +61,22 @@ protected: public: virtual ~AbstractContainerMenu(); virtual void addSlotListener(ContainerListener *listener); - vector > *getItems(); - void sendData(int id, int value); + virtual void removeSlotListener(ContainerListener *listener); + virtual vector > *getItems(); + virtual void sendData(int id, int value); virtual void broadcastChanges(); virtual bool needsRendered(); virtual bool clickMenuButton(shared_ptr player, int buttonId); - Slot *getSlotFor(shared_ptr c, int index); - Slot *getSlot(int index); + virtual Slot *getSlotFor(shared_ptr c, int index); + virtual Slot *getSlot(int index); virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); - virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped = false); // 4J added looped param virtual bool mayCombine(Slot *slot, shared_ptr item); + virtual bool canTakeItemForPickAll(shared_ptr carried, Slot *target); + protected: virtual void loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, shared_ptr player); + public: virtual void removed(shared_ptr player); virtual void slotsChanged();// 4J used to take a shared_ptr container but wasn't using it, so removed to simplify things @@ -76,7 +95,7 @@ public: virtual bool stillValid(shared_ptr player) = 0; // 4J Stu Added for UI - unsigned int getSize() { return (unsigned int)slots->size(); } + unsigned int getSize() { return (unsigned int)slots.size(); } protected: @@ -85,4 +104,21 @@ protected: public: virtual bool isOverrideResultClick(int slotNum, int buttonNum); + + static int getQuickcraftType(int mask); + static int getQuickcraftHeader(int mask); + static int getQuickcraftMask(int header, int type); + static bool isValidQuickcraftType(int type); + +protected: + void resetQuickCraft(); + +public: + static bool canItemQuickReplace(Slot *slot, shared_ptr item, bool ignoreSize); + static void getQuickCraftSlotCount(unordered_set *quickCraftSlots, int quickCraftingType, shared_ptr item, int carry); + bool canDragTo(Slot *slot); + static int getRedstoneSignalFromContainer(shared_ptr container); + + // 4J Added + virtual bool isValidIngredient(shared_ptr item, int slotId); }; diff --git a/Minecraft.World/AbstractProjectileDispenseBehavior.cpp b/Minecraft.World/AbstractProjectileDispenseBehavior.cpp new file mode 100644 index 00000000..ccff196f --- /dev/null +++ b/Minecraft.World/AbstractProjectileDispenseBehavior.cpp @@ -0,0 +1,48 @@ +#include "stdafx.h" + +#include "AbstractProjectileDispenseBehavior.h" +#include "DispenserTile.h" +#include "Projectile.h" +#include "Level.h" +#include "LevelEvent.h" +#include "ItemInstance.h" + +shared_ptr AbstractProjectileDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + Level *world = source->getWorld(); + if ( world->countInstanceOf(eTYPE_PROJECTILE, false) >= Level::MAX_DISPENSABLE_PROJECTILES ) + { + return DefaultDispenseItemBehavior::execute(source, dispensed, outcome); + } + + Position *position = DispenserTile::getDispensePosition(source); + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + shared_ptr projectile = getProjectile(world, position); + + delete position; + + projectile->shoot(facing->getStepX(), facing->getStepY() + .1f, facing->getStepZ(), getPower(), getUncertainty()); + world->addEntity(dynamic_pointer_cast(projectile)); + + dispensed->remove(1); + return dispensed; +} + +void AbstractProjectileDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + if (outcome != LEFT_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::SOUND_LAUNCH, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } +} + +float AbstractProjectileDispenseBehavior::getUncertainty() +{ + return 6.0f; +} + +float AbstractProjectileDispenseBehavior::getPower() +{ + return 1.1f; +} diff --git a/Minecraft.World/AbstractProjectileDispenseBehavior.h b/Minecraft.World/AbstractProjectileDispenseBehavior.h new file mode 100644 index 00000000..75053d6b --- /dev/null +++ b/Minecraft.World/AbstractProjectileDispenseBehavior.h @@ -0,0 +1,17 @@ +#pragma once +#include "DefaultDispenseItemBehavior.h" + +class Projectile; +class Position; + +class AbstractProjectileDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); + +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); + virtual float getUncertainty(); + virtual float getPower(); + virtual shared_ptr getProjectile(Level *world, Position *position) = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/AddEntityPacket.h b/Minecraft.World/AddEntityPacket.h index 5ac7286c..29396479 100644 --- a/Minecraft.World/AddEntityPacket.h +++ b/Minecraft.World/AddEntityPacket.h @@ -8,35 +8,34 @@ class AddEntityPacket : public Packet, public enable_shared_from_this e, int type, int yRotp, int xRotp, int xp, int yp, int zp); + AddEntityPacket(shared_ptr e, int type, int yRotp, int xRotp, int xp, int yp, int zp); AddEntityPacket(shared_ptr e, int type, int data, int yRotp, int xRotp, int xp, int yp, int zp ); virtual void read(DataInputStream *dis); diff --git a/Minecraft.World/AddGlobalEntityPacket.cpp b/Minecraft.World/AddGlobalEntityPacket.cpp index bfb27331..9d688f74 100644 --- a/Minecraft.World/AddGlobalEntityPacket.cpp +++ b/Minecraft.World/AddGlobalEntityPacket.cpp @@ -26,13 +26,13 @@ AddGlobalEntityPacket::AddGlobalEntityPacket(shared_ptr e) x = Mth::floor(e->x * 32); y = Mth::floor(e->y * 32); z = Mth::floor(e->z * 32); - if (dynamic_pointer_cast(e) != NULL) + if ( e->instanceof(eTYPE_LIGHTNINGBOLT) ) { - this->type = LIGHTNING; + type = LIGHTNING; } else { - this->type = 0; + type = 0; } } diff --git a/Minecraft.World/AddMobPacket.cpp b/Minecraft.World/AddMobPacket.cpp index 7e744c04..878e2ee7 100644 --- a/Minecraft.World/AddMobPacket.cpp +++ b/Minecraft.World/AddMobPacket.cpp @@ -25,7 +25,7 @@ AddMobPacket::~AddMobPacket() delete unpack; } -AddMobPacket::AddMobPacket(shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp) +AddMobPacket::AddMobPacket(shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp) { id = mob->entityId; diff --git a/Minecraft.World/AddMobPacket.h b/Minecraft.World/AddMobPacket.h index 37de84c3..6af72655 100644 --- a/Minecraft.World/AddMobPacket.h +++ b/Minecraft.World/AddMobPacket.h @@ -4,7 +4,7 @@ using namespace std; #include "Packet.h" #include "SynchedEntityData.h" -class Mob; +class LivingEntity; class AddMobPacket : public Packet, public enable_shared_from_this { @@ -22,7 +22,7 @@ private: public: AddMobPacket(); ~AddMobPacket(); - AddMobPacket(shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp); + AddMobPacket(shared_ptr mob, int yRotp, int xRotp, int xp, int yp, int zp, int yHeadRotp); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/AddPlayerPacket.cpp b/Minecraft.World/AddPlayerPacket.cpp index f3d8a32b..93984367 100644 --- a/Minecraft.World/AddPlayerPacket.cpp +++ b/Minecraft.World/AddPlayerPacket.cpp @@ -35,7 +35,7 @@ AddPlayerPacket::~AddPlayerPacket() AddPlayerPacket::AddPlayerPacket(shared_ptr player, PlayerUID xuid, PlayerUID OnlineXuid,int xp, int yp, int zp, int yRotp, int xRotp, int yHeadRotp) { id = player->entityId; - name = player->name; + name = player->getName(); // 4J Stu - Send "previously sent" value of position as well so that we stay in sync x = xp;//Mth::floor(player->x * 32); diff --git a/Minecraft.World/AgableMob.cpp b/Minecraft.World/AgableMob.cpp index 39bcadbe..307aa767 100644 --- a/Minecraft.World/AgableMob.cpp +++ b/Minecraft.World/AgableMob.cpp @@ -13,40 +13,51 @@ AgableMob::AgableMob(Level *level) : PathfinderMob(level) registeredBBHeight = 0; } -bool AgableMob::interact(shared_ptr player) +bool AgableMob::mobInteract(shared_ptr player) { shared_ptr item = player->inventory->getSelected(); - if (item != NULL && item->id == Item::monsterPlacer_Id) + if (item != NULL && item->id == Item::spawnEgg_Id) { if (!level->isClientSide) { eINSTANCEOF classToSpawn = EntityIO::getClass(item->getAuxValue()); if (classToSpawn != eTYPE_NOTSET && (classToSpawn & eTYPE_AGABLE_MOB) == eTYPE_AGABLE_MOB && classToSpawn == GetType() ) // 4J Added GetType() check to only spawn same type { - shared_ptr offspring = getBreedOffspring(dynamic_pointer_cast(shared_from_this())); - if (offspring != NULL) - { - offspring->setAge(-20 * 60 * 20); - offspring->moveTo(x, y, z, 0, 0); - - level->addEntity(offspring); + int error; + shared_ptr result = SpawnEggItem::canSpawn(item->getAuxValue(), level, &error); - if (!player->abilities.instabuild) + if (result != NULL) + { + shared_ptr offspring = getBreedOffspring(dynamic_pointer_cast(shared_from_this())); + if (offspring != NULL) { - item->count--; + offspring->setAge(BABY_START_AGE); + offspring->moveTo(x, y, z, 0, 0); - if (item->count <= 0) + level->addEntity(offspring); + + if (!player->abilities.instabuild) { - player->inventory->setItem(player->inventory->selected, nullptr); + item->count--; + + if (item->count <= 0) + { + player->inventory->setItem(player->inventory->selected, nullptr); + } } } } + else + { + SpawnEggItem::DisplaySpawnError(player, error); + } } } + return true; } - return PathfinderMob::interact(player); + return false; } void AgableMob::defineSynchedData() @@ -60,6 +71,17 @@ int AgableMob::getAge() return entityData->getInteger(DATA_AGE_ID); } +void AgableMob::ageUp(int seconds) +{ + int age = getAge(); + age += seconds * SharedConstants::TICKS_PER_SECOND; + if (age > 0) + { + age = 0; + } + setAge(age); +} + void AgableMob::setAge(int age) { entityData->set(DATA_AGE_ID, age); diff --git a/Minecraft.World/AgableMob.h b/Minecraft.World/AgableMob.h index 0020e876..49f76f9e 100644 --- a/Minecraft.World/AgableMob.h +++ b/Minecraft.World/AgableMob.h @@ -7,13 +7,17 @@ class AgableMob : public PathfinderMob private: static const int DATA_AGE_ID = 12; +public: + static const int BABY_START_AGE = -20 * 60 * 20; + +private: float registeredBBWidth; float registeredBBHeight; public: AgableMob(Level *level); - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); protected: virtual void defineSynchedData(); @@ -21,6 +25,7 @@ protected: public: virtual shared_ptr getBreedOffspring(shared_ptr target) = 0; virtual int getAge(); + virtual void ageUp(int seconds); virtual void setAge(int age); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); diff --git a/Minecraft.World/AmbientCreature.cpp b/Minecraft.World/AmbientCreature.cpp new file mode 100644 index 00000000..9f01f0ec --- /dev/null +++ b/Minecraft.World/AmbientCreature.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" + +#include "AmbientCreature.h" + +AmbientCreature::AmbientCreature(Level *level) : Mob(level) +{ +} + +bool AmbientCreature::canBeLeashed() +{ + return false; +} + +bool AmbientCreature::mobInteract(shared_ptr player) +{ + return false; +} \ No newline at end of file diff --git a/Minecraft.World/AmbientCreature.h b/Minecraft.World/AmbientCreature.h new file mode 100644 index 00000000..ac7a75e0 --- /dev/null +++ b/Minecraft.World/AmbientCreature.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Mob.h" +#include "Creature.h" + +class AmbientCreature : public Mob, public Creature +{ + +public: + AmbientCreature(Level *level); + + virtual bool canBeLeashed(); + +protected: + virtual bool mobInteract(shared_ptr player); +}; \ No newline at end of file diff --git a/Minecraft.World/Animal.cpp b/Minecraft.World/Animal.cpp index 45fc304f..31de7d75 100644 --- a/Minecraft.World/Animal.cpp +++ b/Minecraft.World/Animal.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" + #include "com.mojang.nbt.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.item.h" @@ -9,11 +10,11 @@ #include "net.minecraft.world.entity.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "Random.h" #include "Animal.h" - - Animal::Animal(Level *level) : AgableMob( level ) { // inLove = 0; // 4J removed - now synched data @@ -64,7 +65,8 @@ void Animal::aiStep() void Animal::checkHurtTarget(shared_ptr target, float d) { - if (dynamic_pointer_cast(target) != NULL) + // 4J-JEV: Changed from dynamic cast to use eINSTANCEOF + if ( target->instanceof(eTYPE_PLAYER) ) { if (d < 3) { @@ -76,16 +78,14 @@ void Animal::checkHurtTarget(shared_ptr target, float d) } shared_ptr p = dynamic_pointer_cast(target); - if (p->getSelectedItem() != NULL && this->isFood(p->getSelectedItem())) - { - } - else + if (p->getSelectedItem() == NULL || !isFood(p->getSelectedItem())) { attackTarget = nullptr; } } - else if (dynamic_pointer_cast(target) != NULL) + // 4J-JEV: Changed from dynamic cast to use eINSTANCEOF + else if ( target->instanceof(eTYPE_ANIMAL) ) { shared_ptr a = dynamic_pointer_cast(target); if (getAge() > 0 && a->getAge() < 0) @@ -166,21 +166,25 @@ float Animal::getWalkTargetValue(int x, int y, int z) return level->getBrightness(x, y, z) - 0.5f; } -bool Animal::hurt(DamageSource *dmgSource, int dmg) +bool Animal::hurt(DamageSource *dmgSource, float dmg) { + if (isInvulnerable()) return false; if (dynamic_cast(dmgSource) != NULL) { shared_ptr source = dmgSource->getDirectEntity(); - if (dynamic_pointer_cast(source) != NULL && !dynamic_pointer_cast(source)->isAllowedToAttackAnimals() ) + // 4J-JEV: Changed from dynamic cast to use eINSTANCEOF + if ( source->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(source)->isAllowedToAttackAnimals() ) { return false; } - if (source != NULL && source->GetType() == eTYPE_ARROW) + if ( (source != NULL) && source->instanceof(eTYPE_ARROW) ) { shared_ptr arrow = dynamic_pointer_cast(source); - if (dynamic_pointer_cast(arrow->owner) != NULL && ! dynamic_pointer_cast(arrow->owner)->isAllowedToAttackAnimals() ) + + // 4J: Check that the arrow's owner can attack animals (dispenser arrows are not owned) + if (arrow->owner != NULL && arrow->owner->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(arrow->owner)->isAllowedToAttackAnimals() ) { return false; } @@ -188,6 +192,16 @@ bool Animal::hurt(DamageSource *dmgSource, int dmg) } fleeTime = 20 * 3; + + if (!useNewAi()) + { + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + if (speed->getModifier(eModifierId_MOB_FLEEING) == NULL) + { + speed->addModifier(new AttributeModifier(*Animal::SPEED_MODIFIER_FLEEING)); + } + } + attackTarget = nullptr; setInLoveValue(0); @@ -293,10 +307,10 @@ bool Animal::isFood(shared_ptr itemInstance) return itemInstance->id == Item::wheat_Id; } -bool Animal::interact(shared_ptr player) +bool Animal::mobInteract(shared_ptr player) { shared_ptr item = player->inventory->getSelected(); - if (item != NULL && isFood(item) && getAge() == 0) + if (item != NULL && isFood(item) && getAge() == 0 && getInLoveValue() <= 0) { if (!player->abilities.instabuild) { @@ -344,7 +358,7 @@ bool Animal::interact(shared_ptr player) return false; } } - else if( (GetType() & eTYPE_MONSTER) == eTYPE_MONSTER) + else if( instanceof(eTYPE_MONSTER) ) { } @@ -352,20 +366,11 @@ bool Animal::interact(shared_ptr player) } setInLove(player); } - - - attackTarget = nullptr; - for (int i = 0; i < 7; i++) - { - double xa = random->nextGaussian() * 0.02; - double ya = random->nextGaussian() * 0.02; - double za = random->nextGaussian() * 0.02; - level->addParticle(eParticleType_heart, x + random->nextFloat() * bbWidth * 2 - bbWidth, y + .5f + random->nextFloat() * bbHeight, z + random->nextFloat() * bbWidth * 2 - bbWidth, xa, ya, za); - } + setInLove(); return true; } - return AgableMob::interact(player); + return AgableMob::mobInteract(player); } // 4J added @@ -391,6 +396,14 @@ shared_ptr Animal::getLoveCause() return loveCause.lock(); } +void Animal::setInLove() +{ + entityData->set(DATA_IN_LOVE, 20 * 30); + + attackTarget = nullptr; + level->broadcastEntityEvent(shared_from_this(), EntityEvent::IN_LOVE_HEARTS); +} + bool Animal::isInLove() { return entityData->getInteger(DATA_IN_LOVE) > 0; @@ -407,6 +420,24 @@ bool Animal::canMate(shared_ptr partner) return isInLove() && partner->isInLove(); } +void Animal::handleEntityEvent(byte id) +{ + if (id == EntityEvent::IN_LOVE_HEARTS) + { + for (int i = 0; i < 7; i++) + { + double xa = random->nextGaussian() * 0.02; + double ya = random->nextGaussian() * 0.02; + double za = random->nextGaussian() * 0.02; + level->addParticle(eParticleType_heart, x + random->nextFloat() * bbWidth * 2 - bbWidth, y + .5f + random->nextFloat() * bbHeight, z + random->nextFloat() * bbWidth * 2 - bbWidth, xa, ya, za); + } + } + else + { + AgableMob::handleEntityEvent(id); + } +} + void Animal::updateDespawnProtectedState() { if( level->isClientSide ) return; @@ -455,4 +486,4 @@ void Animal::setDespawnProtected() m_maxWanderZ = zt; m_isDespawnProtected = true; -} +} \ No newline at end of file diff --git a/Minecraft.World/Animal.h b/Minecraft.World/Animal.h index 8c0cda8e..85a20439 100644 --- a/Minecraft.World/Animal.h +++ b/Minecraft.World/Animal.h @@ -35,7 +35,7 @@ public: virtual float getWalkTargetValue(int x, int y, int z); public: - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); @@ -52,7 +52,7 @@ protected: public: virtual bool isFood(shared_ptr itemInstance); - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); protected: int getInLoveValue(); // 4J added @@ -60,10 +60,12 @@ protected: public: void setInLoveValue(int value); // 4J added void setInLove(shared_ptr player); // 4J added, then modified to match latest Java for XboxOne achievements + virtual void setInLove(); shared_ptr getLoveCause(); bool isInLove(); void resetLove(); virtual bool canMate(shared_ptr partner); + virtual void handleEntityEvent(byte id); // 4J added for determining whether animals are enclosed or not private: diff --git a/Minecraft.World/AnimalChest.cpp b/Minecraft.World/AnimalChest.cpp new file mode 100644 index 00000000..42729c92 --- /dev/null +++ b/Minecraft.World/AnimalChest.cpp @@ -0,0 +1,11 @@ +#include "stdafx.h" + +#include "AnimalChest.h" + +AnimalChest::AnimalChest(const wstring &name, int size) : SimpleContainer(IDS_CONTAINER_ANIMAL, name, false, size) +{ +} + +AnimalChest::AnimalChest(int iTitle, const wstring &name, bool hasCustomName, int size) : SimpleContainer(iTitle, name, hasCustomName, size) +{ +} \ No newline at end of file diff --git a/Minecraft.World/AnimalChest.h b/Minecraft.World/AnimalChest.h new file mode 100644 index 00000000..a8b360fd --- /dev/null +++ b/Minecraft.World/AnimalChest.h @@ -0,0 +1,10 @@ +#pragma once + +#include "SimpleContainer.h" + +class AnimalChest : public SimpleContainer +{ +public: + AnimalChest(const wstring &name, int size); + AnimalChest(int iTitle, const wstring &name, bool hasCustomName, int size); // 4J Added iTitle param +}; \ No newline at end of file diff --git a/Minecraft.World/AnvilMenu.cpp b/Minecraft.World/AnvilMenu.cpp new file mode 100644 index 00000000..2ef00e3e --- /dev/null +++ b/Minecraft.World/AnvilMenu.cpp @@ -0,0 +1,426 @@ +#include "stdafx.h" +#include "net.minecraft.world.inventory.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.item.enchantment.h" +#include "AnvilMenu.h" + +AnvilMenu::AnvilMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt, shared_ptr player) +{ + resultSlots = shared_ptr( new ResultContainer() ); + repairSlots = shared_ptr( new RepairContainer(this,IDS_REPAIR_AND_NAME, true, 2) ); + cost = 0; + repairItemCountCost = 0; + + this->level = level; + x = xt; + y = yt; + z = zt; + this->player = player; + + addSlot(new Slot(repairSlots, INPUT_SLOT, 27, 43 + 4)); + addSlot(new Slot(repairSlots, ADDITIONAL_SLOT, 76, 43 + 4)); + + // 4J Stu - Anonymous class here is now RepairResultSlot + addSlot(new RepairResultSlot(this, xt, yt, zt, resultSlots, RESULT_SLOT, 134, 43 + 4)); + + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x + y * 9 + 9, 8 + x * 18, 84 + y * 18)); + } + } + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x, 8 + x * 18, 142)); + } +} + +void AnvilMenu::slotsChanged(shared_ptr container) +{ + AbstractContainerMenu::slotsChanged(); + + if (container == repairSlots) createResult(); +} + +void AnvilMenu::createResult() +{ + shared_ptr input = repairSlots->getItem(INPUT_SLOT); + cost = 0; + int price = 0; + int tax = 0; + int namingCost = 0; + + if (DEBUG_COST) app.DebugPrintf("----"); + + if (input == NULL) + { + resultSlots->setItem(0, nullptr); + cost = 0; + return; + } + else + { + shared_ptr result = input->copy(); + shared_ptr addition = repairSlots->getItem(ADDITIONAL_SLOT); + unordered_map *enchantments = EnchantmentHelper::getEnchantments(result); + bool usingBook = false; + + tax += input->getBaseRepairCost() + (addition == NULL ? 0 : addition->getBaseRepairCost()); + if (DEBUG_COST) + { + app.DebugPrintf("Starting with base repair tax of %d (%d + %d)\n", tax, input->getBaseRepairCost(), (addition == NULL ? 0 : addition->getBaseRepairCost())); + } + + repairItemCountCost = 0; + + if (addition != NULL) + { + usingBook = addition->id == Item::enchantedBook_Id && Item::enchantedBook->getEnchantments(addition)->size() > 0; + + if (result->isDamageableItem() && Item::items[result->id]->isValidRepairItem(input, addition)) + { + int repairAmount = min(result->getDamageValue(), result->getMaxDamage() / 4); + if (repairAmount <= 0) + { + resultSlots->setItem(0, nullptr); + cost = 0; + return; + } + else + { + int count = 0; + while (repairAmount > 0 && count < addition->count) + { + int resultDamage = result->getDamageValue() - repairAmount; + result->setAuxValue(resultDamage); + price += max(1, repairAmount / 100) + enchantments->size(); + + repairAmount = min(result->getDamageValue(), result->getMaxDamage() / 4); + count++; + } + repairItemCountCost = count; + } + } + else if (!usingBook && (result->id != addition->id || !result->isDamageableItem())) + { + resultSlots->setItem(0, nullptr); + cost = 0; + return; + } + else + { + if (result->isDamageableItem() && !usingBook) + { + int remaining1 = input->getMaxDamage() - input->getDamageValue(); + int remaining2 = addition->getMaxDamage() - addition->getDamageValue(); + int additional = remaining2 + result->getMaxDamage() * 12 / 100; + int remaining = remaining1 + additional; + int resultDamage = result->getMaxDamage() - remaining; + if (resultDamage < 0) resultDamage = 0; + + if (resultDamage < result->getAuxValue()) + { + result->setAuxValue(resultDamage); + price += max(1, additional / 100); + if (DEBUG_COST) + { + app.DebugPrintf("Repairing; price is now %d (went up by %d)\n", price, max(1, additional / 100) ); + } + } + } + + unordered_map *additionalEnchantments = EnchantmentHelper::getEnchantments(addition); + + for(AUTO_VAR(it, additionalEnchantments->begin()); it != additionalEnchantments->end(); ++it) + { + int id = it->first; + Enchantment *enchantment = Enchantment::enchantments[id]; + AUTO_VAR(localIt, enchantments->find(id)); + int current = localIt != enchantments->end() ? localIt->second : 0; + int level = it->second; + level = (current == level) ? level += 1 : max(level, current); + int extra = level - current; + bool compatible = enchantment->canEnchant(input); + + if (player->abilities.instabuild || input->id == EnchantedBookItem::enchantedBook_Id) compatible = true; + + for(AUTO_VAR(it2, enchantments->begin()); it2 != enchantments->end(); ++it2) + { + int other = it2->first; + if (other != id && !enchantment->isCompatibleWith(Enchantment::enchantments[other])) + { + compatible = false; + + price += extra; + if (DEBUG_COST) + { + app.DebugPrintf("Enchantment incompatibility fee; price is now %d (went up by %d)\n", price, extra); + } + } + } + + if (!compatible) continue; + if (level > enchantment->getMaxLevel()) level = enchantment->getMaxLevel(); + (*enchantments)[id] = level; + int fee = 0; + + switch (enchantment->getFrequency()) + { + case Enchantment::FREQ_COMMON: + fee = 1; + break; + case Enchantment::FREQ_UNCOMMON: + fee = 2; + break; + case Enchantment::FREQ_RARE: + fee = 4; + break; + case Enchantment::FREQ_VERY_RARE: + fee = 8; + break; + } + + if (usingBook) fee = max(1, fee / 2); + + price += fee * extra; + if (DEBUG_COST) + { + app.DebugPrintf("Enchantment increase fee; price is now %d (went up by %d)\n", price, fee*extra); + } + } + delete additionalEnchantments; + } + } + + if (itemName.empty()) + { + if (input->hasCustomHoverName()) + { + namingCost = input->isDamageableItem() ? 7 : input->count * 5; + + price += namingCost; + if (DEBUG_COST) + { + app.DebugPrintf("Un-naming cost; price is now %d (went up by %d)", price, namingCost); + } + result->resetHoverName(); + } + } + else if (itemName.length() > 0 && !equalsIgnoreCase(itemName, input->getHoverName()) && itemName.length() > 0) + { + namingCost = input->isDamageableItem() ? 7 : input->count * 5; + + price += namingCost; + if (DEBUG_COST) + { + app.DebugPrintf("Naming cost; price is now %d (went up by %d)", price, namingCost); + } + + if (input->hasCustomHoverName()) + { + tax += namingCost / 2; + + if (DEBUG_COST) + { + app.DebugPrintf("Already-named tax; tax is now %d (went up by %d)", tax, (namingCost / 2)); + } + } + + result->setHoverName(itemName); + } + + int count = 0; + for(AUTO_VAR(it, enchantments->begin()); it != enchantments->end(); ++it) + { + int id = it->first; + Enchantment *enchantment = Enchantment::enchantments[id]; + int level = it->second; + int fee = 0; + + count++; + + switch (enchantment->getFrequency()) + { + case Enchantment::FREQ_COMMON: + fee = 1; + break; + case Enchantment::FREQ_UNCOMMON: + fee = 2; + break; + case Enchantment::FREQ_RARE: + fee = 4; + break; + case Enchantment::FREQ_VERY_RARE: + fee = 8; + break; + } + + if (usingBook) fee = max(1, fee / 2); + + tax += count + level * fee; + if (DEBUG_COST) + { + app.DebugPrintf("Enchantment tax; tax is now %d (went up by %d)", tax, (count + level * fee)); + } + } + + if (usingBook) tax = max(1, tax / 2); + + cost = tax + price; + if (price <= 0) + { + if (DEBUG_COST) app.DebugPrintf("No purchase, only tax; aborting"); + result = nullptr; + } + if (namingCost == price && namingCost > 0 && cost >= 40) + { + if (DEBUG_COST) app.DebugPrintf("Cost is too high; aborting"); + app.DebugPrintf("Naming an item only, cost too high; giving discount to cap cost to 39 levels"); + cost = 39; + } + if (cost >= 40 && !player->abilities.instabuild) + { + if (DEBUG_COST) app.DebugPrintf("Cost is too high; aborting"); + result = nullptr; + } + + if (result != NULL) + { + int baseCost = result->getBaseRepairCost(); + if (addition != NULL && baseCost < addition->getBaseRepairCost()) baseCost = addition->getBaseRepairCost(); + if (result->hasCustomHoverName()) baseCost -= 9; + if (baseCost < 0) baseCost = 0; + baseCost += 2; + + result->setRepairCost(baseCost); + EnchantmentHelper::setEnchantments(enchantments, result); + } + + resultSlots->setItem(0, result); + } + + broadcastChanges(); + + if (DEBUG_COST) + { + if (level->isClientSide) + { + app.DebugPrintf("CLIENT Cost is %d (%d price, %d tax)\n", cost, price, tax); + } + else + { + app.DebugPrintf("SERVER Cost is %d (%d price, %d tax)\n", cost, price, tax); + } + } +} + +void AnvilMenu::sendData(int id, int value) +{ + AbstractContainerMenu::sendData(id, value); +} + +void AnvilMenu::addSlotListener(ContainerListener *listener) +{ + AbstractContainerMenu::addSlotListener(listener); + listener->setContainerData(this, DATA_TOTAL_COST, cost); +} + +void AnvilMenu::setData(int id, int value) +{ + if (id == DATA_TOTAL_COST) cost = value; +} + +void AnvilMenu::removed(shared_ptr player) +{ + AbstractContainerMenu::removed(player); + if (level->isClientSide) return; + + for (int i = 0; i < repairSlots->getContainerSize(); i++) + { + shared_ptr item = repairSlots->removeItemNoUpdate(i); + if (item != NULL) + { + player->drop(item); + } + } +} + +bool AnvilMenu::stillValid(shared_ptr player) +{ + if (level->getTile(x, y, z) != Tile::anvil_Id) return false; + if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; + return true; +} + +shared_ptr AnvilMenu::quickMoveStack(shared_ptr player, int slotIndex) +{ + shared_ptr clicked = nullptr; + Slot *slot = slots.at(slotIndex); + if (slot != NULL && slot->hasItem()) + { + shared_ptr stack = slot->getItem(); + clicked = stack->copy(); + + if (slotIndex == RESULT_SLOT) + { + if (!moveItemStackTo(stack, INV_SLOT_START, USE_ROW_SLOT_END, true)) + { + return nullptr; + } + slot->onQuickCraft(stack, clicked); + } + else if (slotIndex == INPUT_SLOT || slotIndex == ADDITIONAL_SLOT) + { + if (!moveItemStackTo(stack, INV_SLOT_START, USE_ROW_SLOT_END, false)) + { + return nullptr; + } + } + else if (slotIndex >= INV_SLOT_START && slotIndex < USE_ROW_SLOT_END) + { + if (!moveItemStackTo(stack, INPUT_SLOT, RESULT_SLOT, false)) + { + return nullptr; + } + } + if (stack->count == 0) + { + slot->set(nullptr); + } + else + { + slot->setChanged(); + } + if (stack->count == clicked->count) + { + return nullptr; + } + else + { + slot->onTake(player, stack); + } + } + return clicked; +} + +void AnvilMenu::setItemName(const wstring &name) +{ + itemName = name; + if (getSlot(RESULT_SLOT)->hasItem()) + { + shared_ptr item = getSlot(RESULT_SLOT)->getItem(); + + if (name.empty()) + { + item->resetHoverName(); + } + else + { + item->setHoverName(itemName); + } + } + createResult(); +} \ No newline at end of file diff --git a/Minecraft.World/AnvilMenu.h b/Minecraft.World/AnvilMenu.h new file mode 100644 index 00000000..a70145dd --- /dev/null +++ b/Minecraft.World/AnvilMenu.h @@ -0,0 +1,55 @@ +#pragma once + +#include "AbstractContainerMenu.h" + +class AnvilMenu : public AbstractContainerMenu +{ + friend class RepairResultSlot; +private: + static const bool DEBUG_COST = false; + +public: + static const int INPUT_SLOT = 0; + static const int ADDITIONAL_SLOT = 1; + static const int RESULT_SLOT = 2; + + static const int INV_SLOT_START = RESULT_SLOT + 1; + static const int INV_SLOT_END = INV_SLOT_START + 9 * 3; + static const int USE_ROW_SLOT_START = INV_SLOT_END; + static const int USE_ROW_SLOT_END = USE_ROW_SLOT_START + 9; + +public: + static const int DATA_TOTAL_COST = 0; + +private: + shared_ptr resultSlots; + + // 4J Stu - anonymous class here now RepairContainer + shared_ptr repairSlots; + + Level *level; + int x, y, z; + +public: + int cost; + +private: + int repairItemCountCost; + wstring itemName; + shared_ptr player; + +public: + using AbstractContainerMenu::slotsChanged; + + AnvilMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt, shared_ptr player); + + void slotsChanged(shared_ptr container); + void createResult(); + void sendData(int id, int value); + void addSlotListener(ContainerListener *listener); + void setData(int id, int value); + void removed(shared_ptr player); + bool stillValid(shared_ptr player); + shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + void setItemName(const wstring &name); +}; diff --git a/Minecraft.World/AnvilTile.cpp b/Minecraft.World/AnvilTile.cpp index e5fd736d..8789cb7c 100644 --- a/Minecraft.World/AnvilTile.cpp +++ b/Minecraft.World/AnvilTile.cpp @@ -55,16 +55,16 @@ void AnvilTile::registerIcons(IconRegister *iconRegister) } } -void AnvilTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void AnvilTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3; int dmg = level->getData(x, y, z) >> 2; dir = ++dir % 4; - if (dir == 0) level->setData(x, y, z, Direction::NORTH | (dmg << 2)); - if (dir == 1) level->setData(x, y, z, Direction::EAST | (dmg << 2)); - if (dir == 2) level->setData(x, y, z, Direction::SOUTH | (dmg << 2)); - if (dir == 3) level->setData(x, y, z, Direction::WEST | (dmg << 2)); + if (dir == 0) level->setData(x, y, z, Direction::NORTH | (dmg << 2), Tile::UPDATE_CLIENTS); + if (dir == 1) level->setData(x, y, z, Direction::EAST | (dmg << 2), Tile::UPDATE_CLIENTS); + if (dir == 2) level->setData(x, y, z, Direction::SOUTH | (dmg << 2), Tile::UPDATE_CLIENTS); + if (dir == 3) level->setData(x, y, z, Direction::WEST | (dmg << 2), Tile::UPDATE_CLIENTS); } bool AnvilTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) diff --git a/Minecraft.World/AnvilTile.h b/Minecraft.World/AnvilTile.h index 1a4f0ed7..81210c14 100644 --- a/Minecraft.World/AnvilTile.h +++ b/Minecraft.World/AnvilTile.h @@ -35,7 +35,7 @@ public: bool isSolidRender(bool isServerLevel = false); Icon *getTexture(int face, int data); void registerIcons(IconRegister *iconRegister); - void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); int getRenderShape(); int getSpawnResourcesAuxValue(int data); diff --git a/Minecraft.World/ArmorDyeRecipe.cpp b/Minecraft.World/ArmorDyeRecipe.cpp index 3b74a8bb..0f9c8955 100644 --- a/Minecraft.World/ArmorDyeRecipe.cpp +++ b/Minecraft.World/ArmorDyeRecipe.cpp @@ -43,10 +43,7 @@ bool ArmorDyeRecipe::matches(shared_ptr craftSlots, Level *le shared_ptr ArmorDyeRecipe::assembleDyedArmor(shared_ptr craftSlots) { shared_ptr target = nullptr; - int colorTotals[3]; - colorTotals[0] = 0; - colorTotals[1] = 0; - colorTotals[2] = 0; + int colorTotals[3] = {0,0,0}; int intensityTotal = 0; int colourCounts = 0; ArmorItem *armor = NULL; @@ -64,6 +61,7 @@ shared_ptr ArmorDyeRecipe::assembleDyedArmor(shared_ptrgetMaterial() == ArmorItem::ArmorMaterial::CLOTH && target == NULL) { target = item->copy(); + target->count = 1; if (armor->hasCustomColor(item)) { @@ -87,7 +85,7 @@ shared_ptr ArmorDyeRecipe::assembleDyedArmor(shared_ptrid == Item::dye_powder_Id) { - int tileData = ClothTile::getTileDataForItemAuxValue(item->getAuxValue()); + int tileData = ColoredTile::getTileDataForItemAuxValue(item->getAuxValue()); int red = (int) (Sheep::COLOR[tileData][0] * 0xFF); int green = (int) (Sheep::COLOR[tileData][1] * 0xFF); int blue = (int) (Sheep::COLOR[tileData][2] * 0xFF); diff --git a/Minecraft.World/ArmorItem.cpp b/Minecraft.World/ArmorItem.cpp index 0b2c24e4..114b200b 100644 --- a/Minecraft.World/ArmorItem.cpp +++ b/Minecraft.World/ArmorItem.cpp @@ -1,7 +1,11 @@ #include "stdafx.h" #include "..\Minecraft.Client\Minecraft.h" #include "net.minecraft.world.h" +#include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.world.level.h" #include "com.mojang.nbt.h" #include "ArmorItem.h" @@ -17,6 +21,41 @@ const wstring ArmorItem::TEXTURE_EMPTY_SLOTS[] = { L"slot_empty_helmet", L"slot_empty_chestplate", L"slot_empty_leggings", L"slot_empty_boots" }; + +shared_ptr ArmorItem::ArmorDispenseItemBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + int x = source->getBlockX() + facing->getStepX(); + int y = source->getBlockY() + facing->getStepY(); + int z = source->getBlockZ() + facing->getStepZ(); + AABB *bb = AABB::newTemp(x, y, z, x + 1, y + 1, z + 1); + EntitySelector *selector = new MobCanWearArmourEntitySelector(dispensed); + vector > *entities = source->getWorld()->getEntitiesOfClass(typeid(LivingEntity), bb, selector); + delete selector; + + if (entities->size() > 0) + { + shared_ptr target = dynamic_pointer_cast( entities->at(0) ); + int offset = target->instanceof(eTYPE_PLAYER) ? 1 : 0; + int slot = Mob::getEquipmentSlotForItem(dispensed); + shared_ptr equip = dispensed->copy(); + equip->count = 1; + target->setEquippedSlot(slot - offset, equip); + if (target->instanceof(eTYPE_MOB)) dynamic_pointer_cast(target)->setDropChance(slot, 2); + dispensed->count--; + + outcome = ACTIVATED_ITEM; + + delete entities; + return dispensed; + } + else + { + delete entities; + return DefaultDispenseItemBehavior::execute(source, dispensed, outcome); + } +} + typedef ArmorItem::ArmorMaterial _ArmorMaterial; const int _ArmorMaterial::clothArray[] = {1,3,2,1}; @@ -86,6 +125,7 @@ ArmorItem::ArmorItem(int id, const ArmorMaterial *armorType, int icon, int slot) { setMaxDamage(armorType->getHealthForSlot(slot)); maxStackSize = 1; + DispenserTile::REGISTRY.add(this, new ArmorDispenseItemBehavior()); } int ArmorItem::getColor(shared_ptr item, int spriteLayer) @@ -100,7 +140,6 @@ int ArmorItem::getColor(shared_ptr item, int spriteLayer) return color; } -//@Override bool ArmorItem::hasMultipleSpriteLayers() { return armorType == ArmorMaterial::CLOTH; @@ -145,7 +184,6 @@ int ArmorItem::getColor(shared_ptr item) } } -//@Override Icon *ArmorItem::getLayerIcon(int auxValue, int spriteLayer) { if (spriteLayer == 1) @@ -198,7 +236,6 @@ bool ArmorItem::isValidRepairItem(shared_ptr source, shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); + }; + public: class ArmorMaterial { @@ -64,27 +72,20 @@ private: public: ArmorItem(int id, const ArmorMaterial *armorType, int icon, int slot); - //@Override - int getColor(shared_ptr item, int spriteLayer); - - //@Override - bool hasMultipleSpriteLayers(); + virtual int getColor(shared_ptr item, int spriteLayer); + virtual bool hasMultipleSpriteLayers(); virtual int getEnchantmentValue(); + virtual const ArmorMaterial *getMaterial(); + virtual bool hasCustomColor(shared_ptr item); + virtual int getColor(shared_ptr item); - const ArmorMaterial *getMaterial(); - bool hasCustomColor(shared_ptr item); - int getColor(shared_ptr item); - - //@Override - Icon *getLayerIcon(int auxValue, int spriteLayer); - void clearColor(shared_ptr item); - void setColor(shared_ptr item, int color); - - bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); + virtual Icon *getLayerIcon(int auxValue, int spriteLayer); + virtual void clearColor(shared_ptr item); + virtual void setColor(shared_ptr item, int color); - //@Override - void registerIcons(IconRegister *iconRegister); + virtual bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); + virtual void registerIcons(IconRegister *iconRegister); static Icon *getEmptyIcon(int slot); }; \ No newline at end of file diff --git a/Minecraft.World/ArmorRecipes.cpp b/Minecraft.World/ArmorRecipes.cpp index 8d3483b1..c74c02a3 100644 --- a/Minecraft.World/ArmorRecipes.cpp +++ b/Minecraft.World/ArmorRecipes.cpp @@ -49,25 +49,25 @@ void ArmorRecipes::_init() ADD_OBJECT(map[0],Item::diamond); ADD_OBJECT(map[0],Item::goldIngot); - ADD_OBJECT(map[1],Item::helmet_cloth); + ADD_OBJECT(map[1],Item::helmet_leather); // ADD_OBJECT(map[1],Item::helmet_chain); ADD_OBJECT(map[1],Item::helmet_iron); ADD_OBJECT(map[1],Item::helmet_diamond); ADD_OBJECT(map[1],Item::helmet_gold); - ADD_OBJECT(map[2],Item::chestplate_cloth); + ADD_OBJECT(map[2],Item::chestplate_leather); // ADD_OBJECT(map[2],Item::chestplate_chain); ADD_OBJECT(map[2],Item::chestplate_iron); ADD_OBJECT(map[2],Item::chestplate_diamond); ADD_OBJECT(map[2],Item::chestplate_gold); - ADD_OBJECT(map[3],Item::leggings_cloth); + ADD_OBJECT(map[3],Item::leggings_leather); // ADD_OBJECT(map[3],Item::leggings_chain); ADD_OBJECT(map[3],Item::leggings_iron); ADD_OBJECT(map[3],Item::leggings_diamond); ADD_OBJECT(map[3],Item::leggings_gold); - ADD_OBJECT(map[4],Item::boots_cloth); + ADD_OBJECT(map[4],Item::boots_leather); // ADD_OBJECT(map[4],Item::boots_chain); ADD_OBJECT(map[4],Item::boots_iron); ADD_OBJECT(map[4],Item::boots_diamond); @@ -79,7 +79,7 @@ ArmorRecipes::_eArmorType ArmorRecipes::GetArmorType(int iId) { switch(iId) { - case Item::helmet_cloth_Id: + case Item::helmet_leather_Id: case Item::helmet_chain_Id: case Item::helmet_iron_Id: case Item::helmet_diamond_Id: @@ -87,7 +87,7 @@ ArmorRecipes::_eArmorType ArmorRecipes::GetArmorType(int iId) return eArmorType_Helmet; break; - case Item::chestplate_cloth_Id: + case Item::chestplate_leather_Id: case Item::chestplate_chain_Id: case Item::chestplate_iron_Id: case Item::chestplate_diamond_Id: @@ -95,7 +95,7 @@ ArmorRecipes::_eArmorType ArmorRecipes::GetArmorType(int iId) return eArmorType_Chestplate; break; - case Item::leggings_cloth_Id: + case Item::leggings_leather_Id: case Item::leggings_chain_Id: case Item::leggings_iron_Id: case Item::leggings_diamond_Id: @@ -103,7 +103,7 @@ ArmorRecipes::_eArmorType ArmorRecipes::GetArmorType(int iId) return eArmorType_Leggings; break; - case Item::boots_cloth_Id: + case Item::boots_leather_Id: case Item::boots_chain_Id: case Item::boots_iron_Id: case Item::boots_diamond_Id: diff --git a/Minecraft.World/ArmorSlot.cpp b/Minecraft.World/ArmorSlot.cpp index 1efe0b71..27993d77 100644 --- a/Minecraft.World/ArmorSlot.cpp +++ b/Minecraft.World/ArmorSlot.cpp @@ -19,6 +19,10 @@ int ArmorSlot::getMaxStackSize() bool ArmorSlot::mayPlace(shared_ptr item) { + if (item == NULL) + { + return false; + } if ( dynamic_cast( item->getItem() ) != NULL) { return dynamic_cast( item->getItem() )->slot == slotNum; diff --git a/Minecraft.World/ArrayWithLength.h b/Minecraft.World/ArrayWithLength.h index 4e9f9941..e22724c6 100644 --- a/Minecraft.World/ArrayWithLength.h +++ b/Minecraft.World/ArrayWithLength.h @@ -83,6 +83,7 @@ class Enchantment; class ClipChunk; typedef arrayWithLength doubleArray; +typedef array2DWithLength coords2DArray; typedef arrayWithLength byteArray; typedef arrayWithLength charArray; typedef arrayWithLength shortArray; diff --git a/Minecraft.World/Arrow.cpp b/Minecraft.World/Arrow.cpp index 1b102c65..743f966b 100644 --- a/Minecraft.World/Arrow.cpp +++ b/Minecraft.World/Arrow.cpp @@ -7,6 +7,9 @@ #include "net.minecraft.world.item.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.network.packet.h" +#include "..\Minecraft.Client\ServerPlayer.h" +#include "..\Minecraft.Client\PlayerConnection.h" #include "com.mojang.nbt.h" #include "Arrow.h" @@ -48,16 +51,18 @@ void Arrow::_init() Arrow::Arrow(Level *level) : Entity( level ) { _init(); - - this->setSize(0.5f, 0.5f); + + viewScale = 10; + setSize(0.5f, 0.5f); } -Arrow::Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty) : Entity( level ) +Arrow::Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty) : Entity( level ) { _init(); - - this->owner = mob; - if ( dynamic_pointer_cast( mob ) != NULL) pickup = PICKUP_ALLOWED; + + viewScale = 10; + owner = mob; + if ( mob->instanceof(eTYPE_PLAYER) ) pickup = PICKUP_ALLOWED; y = mob->y + mob->getHeadHeight() - 0.1f; @@ -82,29 +87,31 @@ Arrow::Arrow(Level *level, shared_ptr mob, shared_ptr target, float po Arrow::Arrow(Level *level, double x, double y, double z) : Entity( level ) { _init(); + + viewScale = 10; + setSize(0.5f, 0.5f); - this->setSize(0.5f, 0.5f); - - this->setPos(x, y, z); - this->heightOffset = 0; + setPos(x, y, z); + heightOffset = 0; } -Arrow::Arrow(Level *level, shared_ptr mob, float power) : Entity( level ) +Arrow::Arrow(Level *level, shared_ptr mob, float power) : Entity( level ) { _init(); - this->owner = mob; - if ( dynamic_pointer_cast( mob ) != NULL) pickup = PICKUP_ALLOWED; + viewScale = 10; + owner = mob; + if ( mob->instanceof(eTYPE_PLAYER) ) pickup = PICKUP_ALLOWED; setSize(0.5f, 0.5f); - this->moveTo(mob->x, mob->y + mob->getHeadHeight(), mob->z, mob->yRot, mob->xRot); + moveTo(mob->x, mob->y + mob->getHeadHeight(), mob->z, mob->yRot, mob->xRot); x -= Mth::cos(yRot / 180 * PI) * 0.16f; y -= 0.1f; z -= Mth::sin(yRot / 180 * PI) * 0.16f; - this->setPos(x, y, z); - this->heightOffset = 0; + setPos(x, y, z); + heightOffset = 0; xd = -Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI); zd = Mth::cos(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI); @@ -128,9 +135,9 @@ void Arrow::shoot(double xd, double yd, double zd, float pow, float uncertainty) yd /= dist; zd /= dist; - xd += (random->nextGaussian()) * 0.0075f * uncertainty; - yd += (random->nextGaussian()) * 0.0075f * uncertainty; - zd += (random->nextGaussian()) * 0.0075f * uncertainty; + xd += (random->nextGaussian() * (random->nextBoolean() ? -1 : 1)) * 0.0075f * uncertainty; + yd += (random->nextGaussian() * (random->nextBoolean() ? -1 : 1)) * 0.0075f * uncertainty; + zd += (random->nextGaussian() * (random->nextBoolean() ? -1 : 1)) * 0.0075f * uncertainty; xd *= pow; yd *= pow; @@ -142,8 +149,8 @@ void Arrow::shoot(double xd, double yd, double zd, float pow, float uncertainty) double sd = sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2(yd, sd) * 180 / PI); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, sd) * 180 / PI); life = 0; } @@ -161,8 +168,8 @@ void Arrow::lerpMotion(double xd, double yd, double zd) if (xRotO == 0 && yRotO == 0) { double sd = sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2( xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2( yd, sd) * 180 / PI); + yRotO = yRot = (float) (atan2( xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2( yd, sd) * 180 / PI); xRotO = xRot; yRotO = yRot; app.DebugPrintf("%f %f : 0x%x\n",xRot,yRot,&yRot); @@ -179,8 +186,8 @@ void Arrow::tick() if (xRotO == 0 && yRotO == 0) { double sd = sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2(yd, sd) * 180 / PI); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, sd) * 180 / PI); } @@ -269,6 +276,16 @@ void Arrow::tick() res = new HitResult(hitEntity); } + if ( (res != NULL) && (res->entity != NULL) && res->entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(res->entity); + // 4J: Check for owner being null + if ( player->abilities.invulnerable || ((owner != NULL) && (owner->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(owner)->canHarmPlayer(player)))) + { + res = NULL; + } + } + if (res != NULL) { if (res->entity != NULL) @@ -294,15 +311,19 @@ void Arrow::tick() // 4J Stu - We should not set the entity on fire unless we can cause some damage (this doesn't necessarily mean that the arrow hit lowered their health) // set targets on fire first because we want cooked // pork/chicken/steak - if (this->isOnFire()) + if (isOnFire() && res->entity->GetType() != eTYPE_ENDERMAN) { res->entity->setOnFire(5); } - shared_ptr mob = dynamic_pointer_cast(res->entity); - if (mob != NULL) + if (res->entity->instanceof(eTYPE_LIVINGENTITY)) { - mob->arrowCount++; + shared_ptr mob = dynamic_pointer_cast(res->entity); + + if (!level->isClientSide) + { + mob->setArrowCount(mob->getArrowCount() + 1); + } if (knockback > 0) { float pushLen = sqrt(xd * xd + zd * zd); @@ -316,12 +337,17 @@ void Arrow::tick() { ThornsEnchantment::doThornsAfterAttack(owner, mob, random); } + + if (owner != NULL && res->entity != owner && owner->GetType() == eTYPE_SERVERPLAYER) + { + dynamic_pointer_cast(owner)->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::SUCCESSFUL_BOW_HIT, 0)) ); + } } // 4J : WESTY : For award, need to track if creeper was killed by arrow from the player. - if ( (dynamic_pointer_cast(owner) != NULL ) && // arrow owner is a player - ( res->entity->isAlive() == false ) && // target is now dead - ( dynamic_pointer_cast( res->entity ) != NULL ) ) // target is a creeper + if (owner != NULL && owner->instanceof(eTYPE_PLAYER) // arrow owner is a player + && !res->entity->isAlive() // target is now dead + && (res->entity->GetType() == eTYPE_CREEPER)) // target is a creeper { dynamic_pointer_cast(owner)->awardStat( @@ -330,9 +356,8 @@ void Arrow::tick() ); } - // 4J - sound change brought forward from 1.2.3 - level->playSound(shared_from_this(), eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); - remove(); + playSound( eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); + if (res->entity->GetType() != eTYPE_ENDERDRAGON) remove(); } else { @@ -365,11 +390,15 @@ void Arrow::tick() z -= (zd / dd) * 0.05f; } - // 4J - sound change brought forward from 1.2.3 - level->playSound(shared_from_this(), eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); + playSound(eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); inGround = true; shakeTime = 7; setCritArrow(false); + + if (lastTile != 0) + { + Tile::tiles[lastTile]->entityInside(level, xTile, yTile, zTile, shared_from_this() ); + } } } delete res; @@ -480,12 +509,17 @@ void Arrow::playerTouch(shared_ptr player) if (bRemove) { - level->playSound(shared_from_this(), eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); + playSound(eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); player->take(shared_from_this(), 1); remove(); } } +bool Arrow::makeStepSound() +{ + return false; +} + float Arrow::getShadowHeightOffs() { return 0; diff --git a/Minecraft.World/Arrow.h b/Minecraft.World/Arrow.h index b96aa210..9cfa2f84 100644 --- a/Minecraft.World/Arrow.h +++ b/Minecraft.World/Arrow.h @@ -2,11 +2,12 @@ using namespace std; #include "Entity.h" +#include "Projectile.h" class Level; class CompoundTag; -class Arrow : public Entity +class Arrow : public Entity, public Projectile { public: eINSTANCEOF GetType() { return eTYPE_ARROW; } @@ -26,35 +27,35 @@ private: static const int FLAG_CRIT = 1; private: - int xTile; - int yTile; - int zTile; - int lastTile; - int lastData; - bool inGround; + int xTile; + int yTile; + int zTile; + int lastTile; + int lastData; + bool inGround; public: int pickup; - int shakeTime; - shared_ptr owner; + int shakeTime; + shared_ptr owner; private: double baseDamage; - int knockback; + int knockback; private: int life; - int flightTime; + int flightTime; // 4J - added common ctor code. void _init(); public: Arrow(Level *level); - Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty); - Arrow(Level *level, double x, double y, double z); - Arrow(Level *level, shared_ptr mob, float power); + Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty); + Arrow(Level *level, double x, double y, double z); + Arrow(Level *level, shared_ptr mob, float power); protected: virtual void defineSynchedData(); @@ -63,11 +64,16 @@ public: void shoot(double xd, double yd, double zd, float pow, float uncertainty); virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); virtual void lerpMotion(double xd, double yd, double zd); - virtual void tick(); - virtual void addAdditonalSaveData(CompoundTag *tag); - virtual void readAdditionalSaveData(CompoundTag *tag); - virtual void playerTouch(shared_ptr player); - virtual float getShadowHeightOffs(); + virtual void tick(); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void playerTouch(shared_ptr player); + +protected: + virtual bool makeStepSound(); + +public: + virtual float getShadowHeightOffs(); void setBaseDamage(double baseDamage); double getBaseDamage(); diff --git a/Minecraft.World/AttackDamageMobEffect.cpp b/Minecraft.World/AttackDamageMobEffect.cpp new file mode 100644 index 00000000..00ab0f95 --- /dev/null +++ b/Minecraft.World/AttackDamageMobEffect.cpp @@ -0,0 +1,19 @@ +#include "stdafx.h" + +#include "AttackDamageMobEffect.h" + +AttackDamageMobEffect::AttackDamageMobEffect(int id, bool isHarmful, eMinecraftColour color) : MobEffect(id, isHarmful, color) +{ +} + +double AttackDamageMobEffect::getAttributeModifierValue(int amplifier, AttributeModifier *original) +{ + if (id == MobEffect::weakness->id) + { + return -0.5f * (amplifier + 1); + } + else + { + return 1.3 * (amplifier + 1); + } +} \ No newline at end of file diff --git a/Minecraft.World/AttackDamageMobEffect.h b/Minecraft.World/AttackDamageMobEffect.h new file mode 100644 index 00000000..0597abfa --- /dev/null +++ b/Minecraft.World/AttackDamageMobEffect.h @@ -0,0 +1,13 @@ +#pragma once + +#include "MobEffect.h" + +class AttributeModifier; + +class AttackDamageMobEffect : public MobEffect +{ +public: + AttackDamageMobEffect(int id, bool isHarmful, eMinecraftColour color); + + double getAttributeModifierValue(int amplifier, AttributeModifier *original); +}; \ No newline at end of file diff --git a/Minecraft.World/Attribute.cpp b/Minecraft.World/Attribute.cpp new file mode 100644 index 00000000..7c280862 --- /dev/null +++ b/Minecraft.World/Attribute.cpp @@ -0,0 +1,18 @@ +#include "stdafx.h" +#include "Attribute.h" + +const int Attribute::AttributeNames [] = +{ + IDS_ATTRIBUTE_NAME_GENERIC_MAXHEALTH, + IDS_ATTRIBUTE_NAME_GENERIC_FOLLOWRANGE, + IDS_ATTRIBUTE_NAME_GENERIC_KNOCKBACKRESISTANCE, + IDS_ATTRIBUTE_NAME_GENERIC_MOVEMENTSPEED, + IDS_ATTRIBUTE_NAME_GENERIC_ATTACKDAMAGE, + IDS_ATTRIBUTE_NAME_HORSE_JUMPSTRENGTH, + IDS_ATTRIBUTE_NAME_ZOMBIE_SPAWNREINFORCEMENTS, +}; + +int Attribute::getName(eATTRIBUTE_ID id) +{ + return AttributeNames[id]; +} \ No newline at end of file diff --git a/Minecraft.World/Attribute.h b/Minecraft.World/Attribute.h new file mode 100644 index 00000000..1fb5246b --- /dev/null +++ b/Minecraft.World/Attribute.h @@ -0,0 +1,71 @@ +#pragma once +class AttributeModifier; + +// 4J: This ID is serialised into save data so new attributes must always be added after existing ones +enum eATTRIBUTE_ID +{ + // 1.6.4 + eAttributeId_GENERIC_MAXHEALTH, + eAttributeId_GENERIC_FOLLOWRANGE, + eAttributeId_GENERIC_KNOCKBACKRESISTANCE, + eAttributeId_GENERIC_MOVEMENTSPEED, + eAttributeId_GENERIC_ATTACKDAMAGE, + eAttributeId_HORSE_JUMPSTRENGTH, + eAttributeId_ZOMBIE_SPAWNREINFORCEMENTS, + + // 1.8+ + // New attributes go here + + eAttributeId_COUNT +}; + +class Attribute +{ +public: + static const int MAX_NAME_LENGTH = 64; + + /** + * 4J: Changed this from a string name to an ID + * Gets the ID of this attribute, for serialization. + * + * @return Name of this attribute. + */ + virtual eATTRIBUTE_ID getId() = 0; + + /** + * Sanitizes an attribute value, making sure it's not out of range and is an acceptable amount. + * + * + * @param value Value to sanitize. + * @return Sanitized value, safe for use. + */ + virtual double sanitizeValue(double value) = 0; + + /** + * Get the default value of this attribute, to be used upon creation. + * + * @return Default value. + */ + virtual double getDefaultValue() = 0; + + /** + * Checks if this attribute should be synced to the client. + * + * Attributes should be serverside only unless the client needs to know about it. + * + * @return True if the client should know about this attribute. + */ + virtual bool isClientSyncable() = 0; + + // 4J: Added to retrieve string ID for attribute + static int getName(eATTRIBUTE_ID id); + +protected: + static const int AttributeNames []; +}; + +#ifdef __ORBIS__ +typedef unordered_map> attrAttrModMap; +#else +typedef unordered_map attrAttrModMap; +#endif \ No newline at end of file diff --git a/Minecraft.World/AttributeInstance.h b/Minecraft.World/AttributeInstance.h new file mode 100644 index 00000000..e127f1a7 --- /dev/null +++ b/Minecraft.World/AttributeInstance.h @@ -0,0 +1,22 @@ +#pragma once +#include "AttributeModifier.h" + +class AttributeInstance +{ +public: + virtual ~AttributeInstance() {} + + virtual Attribute *getAttribute() = 0; + virtual double getBaseValue() = 0; + virtual void setBaseValue(double baseValue) = 0; + virtual double getValue() = 0; + + virtual unordered_set *getModifiers(int operation) = 0; + virtual void getModifiers(unordered_set& result) = 0; + virtual AttributeModifier *getModifier(eMODIFIER_ID id) = 0; + virtual void addModifiers(unordered_set *modifiers) = 0; + virtual void addModifier(AttributeModifier *modifier) = 0; + virtual void removeModifier(AttributeModifier *modifier) = 0; + virtual void removeModifier(eMODIFIER_ID id) = 0; + virtual void removeModifiers() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/AttributeModifier.cpp b/Minecraft.World/AttributeModifier.cpp new file mode 100644 index 00000000..c479853d --- /dev/null +++ b/Minecraft.World/AttributeModifier.cpp @@ -0,0 +1,129 @@ +#include "stdafx.h" + +#include "AttributeModifier.h" +#include "HtmlString.h" + +void AttributeModifier::_init(eMODIFIER_ID id, const wstring name, double amount, int operation) +{ + assert(operation < TOTAL_OPERATIONS); + this->amount = amount; + this->operation = operation; + this->name = name; + this->id = id; + this->serialize = true; +} + +AttributeModifier::AttributeModifier(double amount, int operation) +{ + // Create an anonymous attribute + _init(eModifierId_ANONYMOUS, name, amount, operation); +} + +AttributeModifier::AttributeModifier(eMODIFIER_ID id, double amount, int operation) +{ + _init(id, name, amount, operation); + + //Validate.notEmpty(name, "Modifier name cannot be empty"); + //Validate.inclusiveBetween(0, TOTAL_OPERATIONS - 1, operation, "Invalid operation"); +} + +eMODIFIER_ID AttributeModifier::getId() +{ + return id; +} + +wstring AttributeModifier::getName() +{ + return name; +} + +int AttributeModifier::getOperation() +{ + return operation; +} + +double AttributeModifier::getAmount() +{ + return amount; +} + +bool AttributeModifier::isSerializable() +{ + return serialize; +} + +AttributeModifier *AttributeModifier::setSerialize(bool serialize) +{ + this->serialize = serialize; + return this; +} + +bool AttributeModifier::equals(AttributeModifier *modifier) +{ + if (this == modifier) return true; + if (modifier == NULL) return false; //|| getClass() != o.getClass()) return false; + + if (id != modifier->id) return false; + + return true; +} + +wstring AttributeModifier::toString() +{ + return L""; + + /*return L"AttributeModifier{" + + L"amount=" + amount + + L", operation=" + operation + + L", name='" + name + '\'' + + L", id=" + id + + L", serialize=" + serialize + + L'}';*/ +} + +HtmlString AttributeModifier::getHoverText(eATTRIBUTE_ID attribute) +{ + double amount = getAmount(); + double displayAmount; + + if (getOperation() == AttributeModifier::OPERATION_MULTIPLY_BASE || getOperation() == AttributeModifier::OPERATION_MULTIPLY_TOTAL) + { + displayAmount = getAmount() * 100.0f; + } + else + { + displayAmount = getAmount(); + } + + eMinecraftColour color; + + if (amount > 0) + { + color = eHTMLColor_9; + } + else if (amount < 0) + { + displayAmount *= -1; + color = eHTMLColor_c; + } + + bool percentage = false; + switch(getOperation()) + { + case AttributeModifier::OPERATION_ADDITION: + percentage = false; + break; + case AttributeModifier::OPERATION_MULTIPLY_BASE: + case AttributeModifier::OPERATION_MULTIPLY_TOTAL: + percentage = true; + break; + default: + // No other operations + assert(0); + } + + wchar_t formatted[256]; + swprintf(formatted, 256, L"%ls%d%ls %ls", (amount > 0 ? L"+" : L"-"), (int) displayAmount, (percentage ? L"%" : L""), app.GetString(Attribute::getName(attribute))); + + return HtmlString(formatted, color); +} \ No newline at end of file diff --git a/Minecraft.World/AttributeModifier.h b/Minecraft.World/AttributeModifier.h new file mode 100644 index 00000000..c67fda1d --- /dev/null +++ b/Minecraft.World/AttributeModifier.h @@ -0,0 +1,69 @@ +#pragma once + +/* +4J - Both modifier uuid and name have been replaced by an id enum. Note that we have special value +"eModifierId_ANONYMOUS" for attribute modifiers that previously didn't have a fixed UUID and are never removed. + +To all intents and purposes anonymous modifiers don't have an ID and so are handled differently in some cases, for instance: + 1. You can have multiple modifiers with the anonymous ID on a single attribute instance + 2. Anonymous modifiers can't be removed from attribute instance by ID + +IMPORTANT: Saved out to file so don't change order. All new values should be added at the end. +*/ + +class HtmlString; + +enum eMODIFIER_ID +{ + eModifierId_ANONYMOUS = 0, + + eModifierId_ITEM_BASEDAMAGE, + + eModifierId_MOB_FLEEING, + eModifierId_MOB_SPRINTING, + + eModifierId_MOB_ENDERMAN_ATTACKSPEED, + eModifierId_MOB_PIG_ATTACKSPEED, + eModifierId_MOB_WITCH_DRINKSPEED, + eModifierId_MOB_ZOMBIE_BABYSPEED, + + eModifierId_POTION_DAMAGEBOOST, + eModifierId_POTION_HEALTHBOOST, + eModifierId_POTION_MOVESPEED, + eModifierId_POTION_MOVESLOWDOWN, + eModifierId_POTION_WEAKNESS, + + eModifierId_COUNT, +}; + +class AttributeModifier +{ +public: + static const int OPERATION_ADDITION = 0; + static const int OPERATION_MULTIPLY_BASE = 1; + static const int OPERATION_MULTIPLY_TOTAL = 2; + static const int TOTAL_OPERATIONS = 3; + +private: + double amount; + int operation; + wstring name; + eMODIFIER_ID id; + bool serialize; + + void _init(eMODIFIER_ID id, const wstring name, double amount, int operation); + +public: + AttributeModifier(double amount, int operation); + AttributeModifier(eMODIFIER_ID id, double amount, int operation); + + eMODIFIER_ID getId(); + wstring getName(); + int getOperation(); + double getAmount(); + bool isSerializable(); + AttributeModifier *setSerialize(bool serialize); + bool equals(AttributeModifier *modifier); + wstring toString(); + HtmlString getHoverText(eATTRIBUTE_ID attribute); // 4J: Added to keep modifier readable string creation in one place +}; \ No newline at end of file diff --git a/Minecraft.World/AvoidPlayerGoal.cpp b/Minecraft.World/AvoidPlayerGoal.cpp index c94d5cb1..53aebe89 100644 --- a/Minecraft.World/AvoidPlayerGoal.cpp +++ b/Minecraft.World/AvoidPlayerGoal.cpp @@ -10,16 +10,28 @@ #include "net.minecraft.world.phys.h" #include "AvoidPlayerGoal.h" -AvoidPlayerGoal::AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, float maxDist, float walkSpeed, float sprintSpeed) : avoidType(avoidType) +AvoidPlayerGoalEntitySelector::AvoidPlayerGoalEntitySelector(AvoidPlayerGoal *parent) +{ + m_parent = parent; +} + +bool AvoidPlayerGoalEntitySelector::matches(shared_ptr entity) const +{ + return entity->isAlive() && m_parent->mob->getSensing()->canSee(entity); +} + +AvoidPlayerGoal::AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, float maxDist, double walkSpeedModifier, double sprintSpeedModifier) : avoidType(avoidType) { this->mob = mob; //this->avoidType = avoidType; this->maxDist = maxDist; - this->walkSpeed = walkSpeed; - this->sprintSpeed = sprintSpeed; + this->walkSpeedModifier = walkSpeedModifier; + this->sprintSpeedModifier = sprintSpeedModifier; this->pathNav = mob->getNavigation(); setRequiredControlFlags(Control::MoveControlFlag); + entitySelector = new AvoidPlayerGoalEntitySelector(this); + toAvoid = weak_ptr(); path = NULL; } @@ -27,6 +39,7 @@ AvoidPlayerGoal::AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, AvoidPlayerGoal::~AvoidPlayerGoal() { if(path != NULL) delete path; + delete entitySelector; } bool AvoidPlayerGoal::canUse() @@ -40,7 +53,7 @@ bool AvoidPlayerGoal::canUse() } else { - vector > *entities = mob->level->getEntitiesOfClass(avoidType, mob->bb->grow(maxDist, 3, maxDist)); + vector > *entities = mob->level->getEntitiesOfClass(avoidType, mob->bb->grow(maxDist, 3, maxDist), entitySelector); if (entities->empty()) { delete entities; @@ -50,8 +63,6 @@ bool AvoidPlayerGoal::canUse() delete entities; } - if (!mob->getSensing()->canSee(toAvoid.lock())) return false; - Vec3 *pos = RandomPos::getPosAvoid(dynamic_pointer_cast(mob->shared_from_this()), 16, 7, Vec3::newTemp(toAvoid.lock()->x, toAvoid.lock()->y, toAvoid.lock()->z)); if (pos == NULL) return false; if (toAvoid.lock()->distanceToSqr(pos->x, pos->y, pos->z) < toAvoid.lock()->distanceToSqr(mob->shared_from_this())) return false; @@ -69,7 +80,7 @@ bool AvoidPlayerGoal::canContinueToUse() void AvoidPlayerGoal::start() { - pathNav->moveTo(path, walkSpeed); + pathNav->moveTo(path, walkSpeedModifier); path = NULL; } @@ -80,6 +91,6 @@ void AvoidPlayerGoal::stop() void AvoidPlayerGoal::tick() { - if (mob->distanceToSqr(toAvoid.lock()) < 7 * 7) mob->getNavigation()->setSpeed(sprintSpeed); - else mob->getNavigation()->setSpeed(walkSpeed); + if (mob->distanceToSqr(toAvoid.lock()) < 7 * 7) mob->getNavigation()->setSpeedModifier(sprintSpeedModifier); + else mob->getNavigation()->setSpeedModifier(walkSpeedModifier); } \ No newline at end of file diff --git a/Minecraft.World/AvoidPlayerGoal.h b/Minecraft.World/AvoidPlayerGoal.h index 0b17ee4f..267ccf7e 100644 --- a/Minecraft.World/AvoidPlayerGoal.h +++ b/Minecraft.World/AvoidPlayerGoal.h @@ -1,24 +1,38 @@ #pragma once #include "Goal.h" +#include "EntitySelector.h" class PathNavigation; class PathfinderMob; class Path; +class AvoidPlayerGoal; + +class AvoidPlayerGoalEntitySelector : public EntitySelector +{ +private: + AvoidPlayerGoal *m_parent; + +public: + AvoidPlayerGoalEntitySelector(AvoidPlayerGoal *parent); + bool matches(shared_ptr entity) const; +}; class AvoidPlayerGoal : public Goal { + friend class AvoidPlayerGoalEntitySelector; private: PathfinderMob *mob; // Owner of this goal - float walkSpeed, sprintSpeed; + double walkSpeedModifier, sprintSpeedModifier; weak_ptr toAvoid; float maxDist; Path *path; PathNavigation *pathNav; const type_info& avoidType; + EntitySelector *entitySelector; public: - AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, float maxDist, float walkSpeed, float sprintSpeed); + AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, float maxDist, double walkSpeedModifier, double sprintSpeedModifier); ~AvoidPlayerGoal(); virtual bool canUse(); diff --git a/Minecraft.World/BaseAttribute.cpp b/Minecraft.World/BaseAttribute.cpp new file mode 100644 index 00000000..ae7d32f7 --- /dev/null +++ b/Minecraft.World/BaseAttribute.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" + +#include "BaseAttribute.h" + +BaseAttribute::BaseAttribute(eATTRIBUTE_ID id, double defaultValue) +{ + this->id = id; + this->defaultValue = defaultValue; + syncable = false; +} + +eATTRIBUTE_ID BaseAttribute::getId() +{ + return id; +} + +double BaseAttribute::getDefaultValue() +{ + return defaultValue; +} + +bool BaseAttribute::isClientSyncable() +{ + return syncable; +} + +BaseAttribute *BaseAttribute::setSyncable(bool syncable) +{ + this->syncable = syncable; + return this; +} \ No newline at end of file diff --git a/Minecraft.World/BaseAttribute.h b/Minecraft.World/BaseAttribute.h new file mode 100644 index 00000000..8693daf7 --- /dev/null +++ b/Minecraft.World/BaseAttribute.h @@ -0,0 +1,20 @@ +#pragma once + +#include "Attribute.h" + +class BaseAttribute : public Attribute +{ +private: + eATTRIBUTE_ID id; + double defaultValue; + bool syncable; + +protected: + BaseAttribute(eATTRIBUTE_ID id, double defaultValue); + +public: + virtual eATTRIBUTE_ID getId(); + virtual double getDefaultValue(); + virtual bool isClientSyncable(); + virtual BaseAttribute *setSyncable(bool syncable); +}; \ No newline at end of file diff --git a/Minecraft.World/BaseAttributeMap.cpp b/Minecraft.World/BaseAttributeMap.cpp new file mode 100644 index 00000000..5a920f24 --- /dev/null +++ b/Minecraft.World/BaseAttributeMap.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "BaseAttributeMap.h" + +BaseAttributeMap::~BaseAttributeMap() +{ + for(AUTO_VAR(it,attributesById.begin()); it != attributesById.end(); ++it) + { + delete it->second; + } +} + +AttributeInstance *BaseAttributeMap::getInstance(Attribute *attribute) +{ + return getInstance(attribute->getId()); +} + +AttributeInstance *BaseAttributeMap::getInstance(eATTRIBUTE_ID id) +{ + AUTO_VAR(it,attributesById.find(id)); + if(it != attributesById.end()) + { + return it->second; + } + else + { + return NULL; + } +} + +void BaseAttributeMap::getAttributes(vector& atts) +{ + for(AUTO_VAR(it,attributesById.begin()); it != attributesById.end(); ++it) + { + atts.push_back(it->second); + } +} + +void BaseAttributeMap::onAttributeModified(ModifiableAttributeInstance *attributeInstance) +{ +} + +void BaseAttributeMap::removeItemModifiers(shared_ptr item) +{ + attrAttrModMap *modifiers = item->getAttributeModifiers(); + + for(AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + AttributeInstance *attribute = getInstance(it->first); + AttributeModifier *modifier = it->second; + + if (attribute != NULL) + { + attribute->removeModifier(modifier); + } + + delete modifier; + } + + delete modifiers; +} + +void BaseAttributeMap::addItemModifiers(shared_ptr item) +{ + attrAttrModMap *modifiers = item->getAttributeModifiers(); + + for(AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + AttributeInstance *attribute = getInstance(it->first); + AttributeModifier *modifier = it->second; + + if (attribute != NULL) + { + attribute->removeModifier(modifier); + attribute->addModifier(new AttributeModifier(*modifier)); + } + + delete modifier; + } + + delete modifiers; +} diff --git a/Minecraft.World/BaseAttributeMap.h b/Minecraft.World/BaseAttributeMap.h new file mode 100644 index 00000000..928975b8 --- /dev/null +++ b/Minecraft.World/BaseAttributeMap.h @@ -0,0 +1,29 @@ +#pragma once + +class ModifiableAttributeInstance; + +class BaseAttributeMap +{ +protected: + //unordered_map attributesByObject; +#ifdef __ORBIS__ + unordered_map > attributesById; +#else + unordered_map attributesById; +#endif + +public : + virtual ~BaseAttributeMap(); + + virtual AttributeInstance *getInstance(Attribute *attribute); + virtual AttributeInstance *getInstance(eATTRIBUTE_ID name); + + virtual AttributeInstance *registerAttribute(Attribute *attribute) = 0; + + virtual void getAttributes(vector& atts); + virtual void onAttributeModified(ModifiableAttributeInstance *attributeInstance); + + // 4J: Changed these into specialised functions for adding/removing the modifiers of an item (it's cleaner) + virtual void removeItemModifiers(shared_ptr item); + virtual void addItemModifiers(shared_ptr item); +}; \ No newline at end of file diff --git a/Minecraft.World/BaseEntityTile.cpp b/Minecraft.World/BaseEntityTile.cpp new file mode 100644 index 00000000..2edfbf92 --- /dev/null +++ b/Minecraft.World/BaseEntityTile.cpp @@ -0,0 +1,33 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.h" +#include "TileEntity.h" +#include "BaseEntityTile.h" + +BaseEntityTile::BaseEntityTile(int id, Material *material, bool isSolidRender /*= true*/) : Tile(id, material, isSolidRender) +{ + _isEntityTile = true; +} + +void BaseEntityTile::onPlace(Level *level, int x, int y, int z) +{ + Tile::onPlace(level, x, y, z); + //level->setTileEntity(x, y, z, newTileEntity(level)); +} + +void BaseEntityTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + Tile::onRemove(level, x, y, z, id, data); + level->removeTileEntity(x, y, z); +} + +bool BaseEntityTile::triggerEvent(Level *level, int x, int y, int z, int b0, int b1) +{ + Tile::triggerEvent(level, x, y, z, b0, b1); + shared_ptr te = level->getTileEntity(x, y, z); + if (te != NULL) + { + return te->triggerEvent(b0, b1); + } + return false; +} \ No newline at end of file diff --git a/Minecraft.World/BaseEntityTile.h b/Minecraft.World/BaseEntityTile.h new file mode 100644 index 00000000..5136bab8 --- /dev/null +++ b/Minecraft.World/BaseEntityTile.h @@ -0,0 +1,15 @@ +#pragma once +#include "Tile.h" +#include "EntityTile.h" + +class TileEntity; + +class BaseEntityTile : public Tile, public EntityTile +{ +protected: + BaseEntityTile(int id, Material *material, bool isSolidRender = true); +public: + virtual void onPlace(Level *level, int x, int y, int z); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual bool triggerEvent(Level *level, int x, int y, int z, int b0, int b1); +}; \ No newline at end of file diff --git a/Minecraft.World/BaseMobSpawner.cpp b/Minecraft.World/BaseMobSpawner.cpp new file mode 100644 index 00000000..887177ed --- /dev/null +++ b/Minecraft.World/BaseMobSpawner.cpp @@ -0,0 +1,401 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "BaseMobSpawner.h" + +BaseMobSpawner::BaseMobSpawner() +{ + spawnPotentials = NULL; + spawnDelay = 20; + entityId = L"Pig"; + nextSpawnData = NULL; + spin = oSpin = 0.0; + + minSpawnDelay = SharedConstants::TICKS_PER_SECOND * 10; + maxSpawnDelay = SharedConstants::TICKS_PER_SECOND * 40; + spawnCount = 4; + displayEntity = nullptr; + maxNearbyEntities = 6; + requiredPlayerRange = 16; + spawnRange = 4; +} + +BaseMobSpawner::~BaseMobSpawner() +{ + if(spawnPotentials) + { + for(AUTO_VAR(it,spawnPotentials->begin()); it != spawnPotentials->end(); ++it) + { + delete *it; + } + delete spawnPotentials; + } +} + +wstring BaseMobSpawner::getEntityId() +{ + if (getNextSpawnData() == NULL) + { + if (entityId.compare(L"Minecart") == 0) + { + entityId = L"MinecartRideable"; + } + return entityId; + } + else + { + return getNextSpawnData()->type; + } +} + +void BaseMobSpawner::setEntityId(const wstring &entityId) +{ + this->entityId = entityId; +} + +bool BaseMobSpawner::isNearPlayer() +{ + return getLevel()->getNearestPlayer(getX() + 0.5, getY() + 0.5, getZ() + 0.5, requiredPlayerRange) != NULL; +} + +void BaseMobSpawner::tick() +{ + if (!isNearPlayer()) + { + return; + } + + if (getLevel()->isClientSide) + { + double xP = getX() + getLevel()->random->nextFloat(); + double yP = getY() + getLevel()->random->nextFloat(); + double zP = getZ() + getLevel()->random->nextFloat(); + getLevel()->addParticle(eParticleType_smoke, xP, yP, zP, 0, 0, 0); + getLevel()->addParticle(eParticleType_flame, xP, yP, zP, 0, 0, 0); + + if (spawnDelay > 0) spawnDelay--; + oSpin = spin; + spin = (int)(spin + 1000 / (spawnDelay + 200.0f)) % 360; + } + else + { + if (spawnDelay == -1) delay(); + + if (spawnDelay > 0) + { + spawnDelay--; + return; + } + + bool _delay = false; + + for (int c = 0; c < spawnCount; c++) + { + shared_ptr entity = EntityIO::newEntity(getEntityId(), getLevel()); + if (entity == NULL) return; + + int nearBy = getLevel()->getEntitiesOfClass( typeid(entity.get()), AABB::newTemp(getX(), getY(), getZ(), getX() + 1, getY() + 1, getZ() + 1)->grow(spawnRange * 2, 4, spawnRange * 2))->size(); + if (nearBy >= maxNearbyEntities) + { + delay(); + return; + } + + double xp = getX() + (getLevel()->random->nextDouble() - getLevel()->random->nextDouble()) * spawnRange; + double yp = getY() + getLevel()->random->nextInt(3) - 1; + double zp = getZ() + (getLevel()->random->nextDouble() - getLevel()->random->nextDouble()) * spawnRange; + shared_ptr mob = entity->instanceof(eTYPE_MOB) ? dynamic_pointer_cast( entity ) : nullptr; + + entity->moveTo(xp, yp, zp, getLevel()->random->nextFloat() * 360, 0); + + if (mob == NULL || mob->canSpawn()) + { + loadDataAndAddEntity(entity); + getLevel()->levelEvent(LevelEvent::PARTICLES_MOBTILE_SPAWN, getX(), getY(), getZ(), 0); + + if (mob != NULL) + { + mob->spawnAnim(); + } + + _delay = true; + } + } + + if (_delay) delay(); + } +} + +shared_ptr BaseMobSpawner::loadDataAndAddEntity(shared_ptr entity) +{ + if (getNextSpawnData() != NULL) + { + CompoundTag *data = new CompoundTag(); + entity->save(data); + + vector *tags = getNextSpawnData()->tag->getAllTags(); + for (AUTO_VAR(it, tags->begin()); it != tags->end(); ++it) + { + Tag *tag = *it; + data->put(tag->getName(), tag->copy()); + } + delete tags; + + entity->load(data); + if (entity->level != NULL) entity->level->addEntity(entity); + + // add mounts + shared_ptr rider = entity; + while (data->contains(Entity::RIDING_TAG)) + { + CompoundTag *ridingTag = data->getCompound(Entity::RIDING_TAG); + shared_ptr mount = EntityIO::newEntity(ridingTag->getString(L"id"), entity->level); + if (mount != NULL) + { + CompoundTag *mountData = new CompoundTag(); + mount->save(mountData); + + vector *ridingTags = ridingTag->getAllTags(); + for (AUTO_VAR(it, ridingTags->begin()); it != ridingTags->end(); ++it) + { + Tag *tag = *it; + mountData->put(tag->getName(), tag->copy()); + } + delete ridingTags; + mount->load(mountData); + mount->moveTo(rider->x, rider->y, rider->z, rider->yRot, rider->xRot); + + if (entity->level != NULL) entity->level->addEntity(mount); + rider->ride(mount); + } + rider = mount; + data = ridingTag; + } + + } + else if (entity->instanceof(eTYPE_LIVINGENTITY) && entity->level != NULL) + { + dynamic_pointer_cast( entity )->finalizeMobSpawn(NULL); + getLevel()->addEntity(entity); + } + + return entity; +} + +void BaseMobSpawner::delay() +{ + if (maxSpawnDelay <= minSpawnDelay) + { + spawnDelay = minSpawnDelay; + } + else + { + spawnDelay = minSpawnDelay + getLevel()->random->nextInt(maxSpawnDelay - minSpawnDelay); + } + + if ( (spawnPotentials != NULL) && (spawnPotentials->size() > 0) ) + { + setNextSpawnData( (SpawnData*) WeighedRandom::getRandomItem((Random*)getLevel()->random, (vector*)spawnPotentials) ); + } + + broadcastEvent(EVENT_SPAWN); +} + +void BaseMobSpawner::load(CompoundTag *tag) +{ + entityId = tag->getString(L"EntityId"); + spawnDelay = tag->getShort(L"Delay"); + + if (tag->contains(L"SpawnPotentials")) + { + spawnPotentials = new vector(); + ListTag *potentials = (ListTag *) tag->getList(L"SpawnPotentials"); + + for (int i = 0; i < potentials->size(); i++) + { + spawnPotentials->push_back(new SpawnData(potentials->get(i))); + } + } + else + { + spawnPotentials = NULL; + } + + if (tag->contains(L"SpawnData")) + { + setNextSpawnData(new SpawnData(tag->getCompound(L"SpawnData"), entityId)); + } + else + { + setNextSpawnData(NULL); + } + + if (tag->contains(L"MinSpawnDelay")) + { + minSpawnDelay = tag->getShort(L"MinSpawnDelay"); + maxSpawnDelay = tag->getShort(L"MaxSpawnDelay"); + spawnCount = tag->getShort(L"SpawnCount"); + } + + if (tag->contains(L"MaxNearbyEntities")) + { + maxNearbyEntities = tag->getShort(L"MaxNearbyEntities"); + requiredPlayerRange = tag->getShort(L"RequiredPlayerRange"); + } + + if (tag->contains(L"SpawnRange")) spawnRange = tag->getShort(L"SpawnRange"); + + if (getLevel() != NULL && getLevel()->isClientSide) + { + displayEntity = nullptr; + } +} + +void BaseMobSpawner::save(CompoundTag *tag) +{ + tag->putString(L"EntityId", getEntityId()); + tag->putShort(L"Delay", (short) spawnDelay); + tag->putShort(L"MinSpawnDelay", (short) minSpawnDelay); + tag->putShort(L"MaxSpawnDelay", (short) maxSpawnDelay); + tag->putShort(L"SpawnCount", (short) spawnCount); + tag->putShort(L"MaxNearbyEntities", (short) maxNearbyEntities); + tag->putShort(L"RequiredPlayerRange", (short) requiredPlayerRange); + tag->putShort(L"SpawnRange", (short) spawnRange); + + if (getNextSpawnData() != NULL) + { + tag->putCompound(L"SpawnData", (CompoundTag *) getNextSpawnData()->tag->copy()); + } + + if (getNextSpawnData() != NULL || (spawnPotentials != NULL && spawnPotentials->size() > 0)) + { + ListTag *list = new ListTag(); + + if (spawnPotentials != NULL && spawnPotentials->size() > 0) + { + for (AUTO_VAR(it, spawnPotentials->begin()); it != spawnPotentials->end(); ++it) + { + SpawnData *data = *it; + list->add(data->save()); + } + } + else + { + list->add(getNextSpawnData()->save()); + } + + tag->put(L"SpawnPotentials", list); + } +} + +shared_ptr BaseMobSpawner::getDisplayEntity() +{ + if (displayEntity == NULL) + { + shared_ptr e = EntityIO::newEntity(getEntityId(), NULL); + e = loadDataAndAddEntity(e); + displayEntity = e; + } + + return displayEntity; +} + +bool BaseMobSpawner::onEventTriggered(int id) +{ + if (id == EVENT_SPAWN && getLevel()->isClientSide) + { + spawnDelay = minSpawnDelay; + return true; + } + return false; +} + +BaseMobSpawner::SpawnData *BaseMobSpawner::getNextSpawnData() +{ + return nextSpawnData; +} + +void BaseMobSpawner::setNextSpawnData(SpawnData *nextSpawnData) +{ + this->nextSpawnData = nextSpawnData; +} + +BaseMobSpawner::SpawnData::SpawnData(CompoundTag *base) : WeighedRandomItem(base->getInt(L"Weight")) +{ + CompoundTag *tag = base->getCompound(L"Properties"); + wstring _type = base->getString(L"Type"); + + if (_type.compare(L"Minecart") == 0) + { + if (tag != NULL) + { + switch (tag->getInt(L"Type")) + { + case Minecart::TYPE_CHEST: + type = L"MinecartChest"; + break; + case Minecart::TYPE_FURNACE: + type = L"MinecartFurnace"; + break; + case Minecart::TYPE_RIDEABLE: + type = L"MinecartRideable"; + break; + } + } + else + { + type = L"MinecartRideable"; + } + } + + this->tag = tag; + this->type = _type; +} + +BaseMobSpawner::SpawnData::SpawnData(CompoundTag *tag, wstring _type) : WeighedRandomItem(1) +{ + if (_type.compare(L"Minecart") == 0) + { + if (tag != NULL) + { + switch (tag->getInt(L"Type")) + { + case Minecart::TYPE_CHEST: + _type = L"MinecartChest"; + break; + case Minecart::TYPE_FURNACE: + _type = L"MinecartFurnace"; + break; + case Minecart::TYPE_RIDEABLE: + _type = L"MinecartRideable"; + break; + } + } + else + { + _type = L"MinecartRideable"; + } + } + + this->tag = tag; + this->type = _type; +} + +BaseMobSpawner::SpawnData::~SpawnData() +{ + delete tag; +} + +CompoundTag *BaseMobSpawner::SpawnData::save() +{ + CompoundTag *result = new CompoundTag(); + + result->putCompound(L"Properties", tag); + result->putString(L"Type", type); + result->putInt(L"Weight", randomWeight); + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/BaseMobSpawner.h b/Minecraft.World/BaseMobSpawner.h new file mode 100644 index 00000000..88d820e0 --- /dev/null +++ b/Minecraft.World/BaseMobSpawner.h @@ -0,0 +1,70 @@ +#pragma once + +#include "WeighedRandom.h" + +class BaseMobSpawner +{ +public: + class SpawnData : public WeighedRandomItem + { + public: + CompoundTag *tag; + wstring type; + + SpawnData(CompoundTag *base); + SpawnData(CompoundTag *tag, wstring type); + ~SpawnData(); + + virtual CompoundTag *save(); + }; + +private: + static const int EVENT_SPAWN = 1; + +public: + int spawnDelay; + +private: + wstring entityId; + vector *spawnPotentials; + SpawnData *nextSpawnData; + +public: + double spin, oSpin; + +private: + int minSpawnDelay; + int maxSpawnDelay; + int spawnCount; + shared_ptr displayEntity; + int maxNearbyEntities; + int requiredPlayerRange; + int spawnRange; + +public: + BaseMobSpawner(); + ~BaseMobSpawner(); + + virtual wstring getEntityId(); + virtual void setEntityId(const wstring &entityId); + virtual bool isNearPlayer(); + virtual void tick(); + virtual shared_ptr loadDataAndAddEntity(shared_ptr entity); + +private: + virtual void delay(); + +public: + virtual void load(CompoundTag *tag); + virtual void save(CompoundTag *tag); + virtual shared_ptr getDisplayEntity(); + virtual bool onEventTriggered(int id); + virtual SpawnData *getNextSpawnData(); + virtual void setNextSpawnData(SpawnData *nextSpawnData); + + virtual void broadcastEvent(int id) = 0; + virtual Level *getLevel() = 0; + virtual int getX() = 0; + virtual int getY() = 0; + virtual int getZ() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/BasePressurePlateTile.cpp b/Minecraft.World/BasePressurePlateTile.cpp new file mode 100644 index 00000000..128a4216 --- /dev/null +++ b/Minecraft.World/BasePressurePlateTile.cpp @@ -0,0 +1,189 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.h" +#include "net.minecraft.world.h" +#include "BasePressurePlateTile.h" + +BasePressurePlateTile::BasePressurePlateTile(int id, const wstring &tex, Material *material) : Tile(id, material, isSolidRender()) +{ + texture = tex; + setTicking(true); + + // 4J Stu - Move this to derived classes + //updateShape(getDataForSignal(Redstone::SIGNAL_MAX)); +} + +void BasePressurePlateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) +{ + updateShape(level->getData(x, y, z)); +} + +void BasePressurePlateTile::updateShape(int data) +{ + bool pressed = getSignalForData(data) > Redstone::SIGNAL_NONE; + float o = 1 / 16.0f; + + if (pressed) + { + setShape(o, 0, o, 1 - o, 0.5f / 16.0f, 1 - o); + } + else + { + setShape(o, 0, o, 1 - o, 1 / 16.0f, 1 - o); + } +} + +int BasePressurePlateTile::getTickDelay(Level *level) +{ + return SharedConstants::TICKS_PER_SECOND; +} + +AABB *BasePressurePlateTile::getAABB(Level *level, int x, int y, int z) +{ + return NULL; +} + +bool BasePressurePlateTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +bool BasePressurePlateTile::blocksLight() +{ + return false; +} + +bool BasePressurePlateTile::isCubeShaped() +{ + return false; +} + +bool BasePressurePlateTile::isPathfindable(LevelSource *level, int x, int y, int z) +{ + return true; +} + +bool BasePressurePlateTile::mayPlace(Level *level, int x, int y, int z) +{ + return level->isTopSolidBlocking(x, y - 1, z) || FenceTile::isFence(level->getTile(x, y - 1, z)); +} + +void BasePressurePlateTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + bool replace = false; + + if (!level->isTopSolidBlocking(x, y - 1, z) && !FenceTile::isFence(level->getTile(x, y - 1, z))) replace = true; + + if (replace) + { + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + } +} + +void BasePressurePlateTile::tick(Level *level, int x, int y, int z, Random *random) +{ + if (level->isClientSide) return; + int signal = getSignalForData(level->getData(x, y, z)); + if (signal > Redstone::SIGNAL_NONE) checkPressed(level, x, y, z, signal); +} + +void BasePressurePlateTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) +{ + if (level->isClientSide) return; + int signal = getSignalForData(level->getData(x, y, z)); + if (signal == Redstone::SIGNAL_NONE) checkPressed(level, x, y, z, signal); +} + +void BasePressurePlateTile::checkPressed(Level *level, int x, int y, int z, int oldSignal) +{ + int signal = getSignalStrength(level, x, y, z); + bool wasPressed = oldSignal > Redstone::SIGNAL_NONE; + bool shouldBePressed = signal > Redstone::SIGNAL_NONE; + + if (oldSignal != signal) + { + level->setData(x, y, z, getDataForSignal(signal), Tile::UPDATE_CLIENTS); + updateNeighbours(level, x, y, z); + level->setTilesDirty(x, y, z, x, y, z); + } + + if (!shouldBePressed && wasPressed) + { + level->playSound(x + 0.5, y + 0.1, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.5f); + } + else if (shouldBePressed && !wasPressed) + { + level->playSound(x + 0.5, y + 0.1, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); + } + + if (shouldBePressed) + { + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); + } +} + +AABB *BasePressurePlateTile::getSensitiveAABB(int x, int y, int z) +{ + float b = 2 / 16.0f; + return AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 0.25, z + 1 - b); +} + +void BasePressurePlateTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + if (getSignalForData(data) > 0) + { + updateNeighbours(level, x, y, z); + } + + Tile::onRemove(level, x, y, z, id, data); +} + +void BasePressurePlateTile::updateNeighbours(Level *level, int x, int y, int z) +{ + level->updateNeighborsAt(x, y, z, id); + level->updateNeighborsAt(x, y - 1, z, id); +} + +int BasePressurePlateTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +{ + return getSignalForData(level->getData(x, y, z)); +} + +int BasePressurePlateTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) +{ + if (dir == Facing::UP) + { + return getSignalForData(level->getData(x, y, z)); + } + else + { + return Redstone::SIGNAL_NONE; + } +} + +bool BasePressurePlateTile::isSignalSource() +{ + return true; +} + +void BasePressurePlateTile::updateDefaultShape() +{ + float x = 8 / 16.0f; + float y = 2 / 16.0f; + float z = 8 / 16.0f; + setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); +} + +int BasePressurePlateTile::getPistonPushReaction() +{ + return Material::PUSH_DESTROY; +} + +void BasePressurePlateTile::registerIcons(IconRegister *iconRegister) +{ + icon = iconRegister->registerIcon(texture); +} \ No newline at end of file diff --git a/Minecraft.World/BasePressurePlateTile.h b/Minecraft.World/BasePressurePlateTile.h new file mode 100644 index 00000000..c0870dab --- /dev/null +++ b/Minecraft.World/BasePressurePlateTile.h @@ -0,0 +1,55 @@ +#pragma once + +#include "Tile.h" + +class BasePressurePlateTile : public Tile +{ +private: + wstring texture; + +protected: + BasePressurePlateTile(int id, const wstring &tex, Material *material); + +public: + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); + +protected: + virtual void updateShape(int data); + +public: + virtual int getTickDelay(Level *level); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool blocksLight(); + virtual bool isCubeShaped(); + virtual bool isPathfindable(LevelSource *level, int x, int y, int z); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); + +protected: + virtual void checkPressed(Level *level, int x, int y, int z, int oldSignal); + virtual AABB *getSensitiveAABB(int x, int y, int z); + +public: + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + +protected: + virtual void updateNeighbours(Level *level, int x, int y, int z); + +public: + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); + virtual bool isSignalSource(); + virtual void updateDefaultShape(); + virtual int getPistonPushReaction(); + +protected: + virtual int getSignalStrength(Level *level, int x, int y, int z) = 0; + virtual int getSignalForData(int data) = 0; + virtual int getDataForSignal(int signal) = 0; + +public: + virtual void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/BaseRailTile.cpp b/Minecraft.World/BaseRailTile.cpp new file mode 100644 index 00000000..8ec23fd6 --- /dev/null +++ b/Minecraft.World/BaseRailTile.cpp @@ -0,0 +1,511 @@ +#include "stdafx.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.h" +#include "BaseRailTile.h" + +BaseRailTile::Rail::Rail(Level *level, int x, int y, int z) +{ + this->level = level; + this->x = x; + this->y = y; + this->z = z; + + int id = level->getTile(x, y, z); + + // 4J Stu - We saw a random crash near the end of development on XboxOne orignal version where the id here isn't a tile any more + // Adding this check in to avoid that crash + m_bValidRail = isRail(id); + if(m_bValidRail) + { + int direction = level->getData(x, y, z); + if (((BaseRailTile *) Tile::tiles[id])->usesDataBit) + { + usesDataBit = true; + direction = direction & ~RAIL_DATA_BIT; + } + else + { + usesDataBit = false; + } + updateConnections(direction); + } +} + +BaseRailTile::Rail::~Rail() +{ + for( int i = 0; i < connections.size(); i++ ) + { + delete connections[i]; + } +} + +void BaseRailTile::Rail::updateConnections(int direction) +{ + if(m_bValidRail) + { + for( int i = 0; i < connections.size(); i++ ) + { + delete connections[i]; + } + connections.clear(); + MemSect(50); + if (direction == DIR_FLAT_Z) + { + connections.push_back(new TilePos(x, y, z - 1)); + connections.push_back(new TilePos(x, y, z + 1)); + } else if (direction == DIR_FLAT_X) + { + connections.push_back(new TilePos(x - 1, y, z)); + connections.push_back(new TilePos(x + 1, y, z)); + } else if (direction == 2) + { + connections.push_back(new TilePos(x - 1, y, z)); + connections.push_back(new TilePos(x + 1, y + 1, z)); + } else if (direction == 3) + { + connections.push_back(new TilePos(x - 1, y + 1, z)); + connections.push_back(new TilePos(x + 1, y, z)); + } else if (direction == 4) + { + connections.push_back(new TilePos(x, y + 1, z - 1)); + connections.push_back(new TilePos(x, y, z + 1)); + } else if (direction == 5) + { + connections.push_back(new TilePos(x, y, z - 1)); + connections.push_back(new TilePos(x, y + 1, z + 1)); + } else if (direction == 6) + { + connections.push_back(new TilePos(x + 1, y, z)); + connections.push_back(new TilePos(x, y, z + 1)); + } else if (direction == 7) + { + connections.push_back(new TilePos(x - 1, y, z)); + connections.push_back(new TilePos(x, y, z + 1)); + } else if (direction == 8) + { + connections.push_back(new TilePos(x - 1, y, z)); + connections.push_back(new TilePos(x, y, z - 1)); + } else if (direction == 9) + { + connections.push_back(new TilePos(x + 1, y, z)); + connections.push_back(new TilePos(x, y, z - 1)); + } + MemSect(0); + } +} + +void BaseRailTile::Rail::removeSoftConnections() +{ + if(m_bValidRail) + { + for (unsigned int i = 0; i < connections.size(); i++) + { + Rail *rail = getRail(connections[i]); + if (rail == NULL || !rail->connectsTo(this)) + { + delete connections[i]; + connections.erase(connections.begin()+i); + i--; + } else + { + delete connections[i]; + MemSect(50); + connections[i] =new TilePos(rail->x, rail->y, rail->z); + MemSect(0); + } + delete rail; + } + } +} + +bool BaseRailTile::Rail::hasRail(int x, int y, int z) +{ + if(!m_bValidRail) return false; + if (isRail(level, x, y, z)) return true; + if (isRail(level, x, y + 1, z)) return true; + if (isRail(level, x, y - 1, z)) return true; + return false; +} + +BaseRailTile::Rail *BaseRailTile::Rail::getRail(TilePos *p) +{ + if(!m_bValidRail) return NULL; + if (isRail(level, p->x, p->y, p->z)) return new Rail(level, p->x, p->y, p->z); + if (isRail(level, p->x, p->y + 1, p->z)) return new Rail(level, p->x, p->y + 1, p->z); + if (isRail(level, p->x, p->y - 1, p->z)) return new Rail(level, p->x, p->y - 1, p->z); + return NULL; +} + + +bool BaseRailTile::Rail::connectsTo(Rail *rail) +{ + if(m_bValidRail) + { + AUTO_VAR(itEnd, connections.end()); + for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) + { + TilePos *p = *it; //connections[i]; + if (p->x == rail->x && p->z == rail->z) + { + return true; + } + } + } + return false; +} + +bool BaseRailTile::Rail::hasConnection(int x, int y, int z) +{ + if(m_bValidRail) + { + AUTO_VAR(itEnd, connections.end()); + for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) + { + TilePos *p = *it; //connections[i]; + if (p->x == x && p->z == z) + { + return true; + } + } + } + return false; +} + + +int BaseRailTile::Rail::countPotentialConnections() +{ + int count = 0; + + if(m_bValidRail) + { + if (hasRail(x, y, z - 1)) count++; + if (hasRail(x, y, z + 1)) count++; + if (hasRail(x - 1, y, z)) count++; + if (hasRail(x + 1, y, z)) count++; + } + + return count; +} + +bool BaseRailTile::Rail::canConnectTo(Rail *rail) +{ + if(!m_bValidRail) return false; + if (connectsTo(rail)) return true; + if (connections.size() == 2) + { + return false; + } + if (connections.empty()) + { + return true; + } + + return true; +} + +void BaseRailTile::Rail::connectTo(Rail *rail) +{ + if(m_bValidRail) + { + MemSect(50); + connections.push_back(new TilePos(rail->x, rail->y, rail->z)); + MemSect(0); + + bool n = hasConnection(x, y, z - 1); + bool s = hasConnection(x, y, z + 1); + bool w = hasConnection(x - 1, y, z); + bool e = hasConnection(x + 1, y, z); + + int dir = -1; + + if (n || s) dir = DIR_FLAT_Z; + if (w || e) dir = DIR_FLAT_X; + + if (!usesDataBit) + { + if (s && e && !n && !w) dir = 6; + if (s && w && !n && !e) dir = 7; + if (n && w && !s && !e) dir = 8; + if (n && e && !s && !w) dir = 9; + } + if (dir == DIR_FLAT_Z) + { + if (isRail(level, x, y + 1, z - 1)) dir = 4; + if (isRail(level, x, y + 1, z + 1)) dir = 5; + } + if (dir == DIR_FLAT_X) + { + if (isRail(level, x + 1, y + 1, z)) dir = 2; + if (isRail(level, x - 1, y + 1, z)) dir = 3; + } + + if (dir < 0) dir = DIR_FLAT_Z; + + int data = dir; + if (usesDataBit) + { + data = (level->getData(x, y, z) & RAIL_DATA_BIT) | dir; + } + + level->setData(x, y, z, data, Tile::UPDATE_ALL); + } +} + +bool BaseRailTile::Rail::hasNeighborRail(int x, int y, int z) +{ + if(!m_bValidRail) return false; + TilePos tp(x,y,z); + Rail *neighbor = getRail( &tp ); + if (neighbor == NULL) return false; + neighbor->removeSoftConnections(); + bool retval = neighbor->canConnectTo(this); + delete neighbor; + return retval; +} + +void BaseRailTile::Rail::place(bool hasSignal, bool first) +{ + if(m_bValidRail) + { + bool n = hasNeighborRail(x, y, z - 1); + bool s = hasNeighborRail(x, y, z + 1); + bool w = hasNeighborRail(x - 1, y, z); + bool e = hasNeighborRail(x + 1, y, z); + + int dir = -1; + + if ((n || s) && !w && !e) dir = DIR_FLAT_Z; + if ((w || e) && !n && !s) dir = DIR_FLAT_X; + + if (!usesDataBit) + { + if (s && e && !n && !w) dir = 6; + if (s && w && !n && !e) dir = 7; + if (n && w && !s && !e) dir = 8; + if (n && e && !s && !w) dir = 9; + } + if (dir == -1) + { + if (n || s) dir = DIR_FLAT_Z; + if (w || e) dir = DIR_FLAT_X; + + if (!usesDataBit) + { + if (hasSignal) + { + if (s && e) dir = 6; + if (w && s) dir = 7; + if (e && n) dir = 9; + if (n && w) dir = 8; + } else { + if (n && w) dir = 8; + if (e && n) dir = 9; + if (w && s) dir = 7; + if (s && e) dir = 6; + } + } + } + + if (dir == DIR_FLAT_Z) + { + if (isRail(level, x, y + 1, z - 1)) dir = 4; + if (isRail(level, x, y + 1, z + 1)) dir = 5; + } + if (dir == DIR_FLAT_X) + { + if (isRail(level, x + 1, y + 1, z)) dir = 2; + if (isRail(level, x - 1, y + 1, z)) dir = 3; + } + + if (dir < 0) dir = DIR_FLAT_Z; + + updateConnections(dir); + + int data = dir; + if (usesDataBit) + { + data = (level->getData(x, y, z) & RAIL_DATA_BIT) | dir; + } + + if (first || level->getData(x, y, z) != data) + { + level->setData(x, y, z, data, Tile::UPDATE_ALL); + + AUTO_VAR(itEnd, connections.end()); + for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) + { + Rail *neighbor = getRail(*it); + if (neighbor == NULL) continue; + neighbor->removeSoftConnections(); + + if (neighbor->canConnectTo(this)) + { + neighbor->connectTo(this); + } + delete neighbor; + } + } + } +} + +bool BaseRailTile::isRail(Level *level, int x, int y, int z) +{ + return isRail(level->getTile(x, y, z)); +} + +bool BaseRailTile::isRail(int id) +{ + return id == Tile::rail_Id || id == Tile::goldenRail_Id || id == Tile::detectorRail_Id || id == Tile::activatorRail_Id; +} + +BaseRailTile::BaseRailTile(int id, bool usesDataBit) : Tile(id, Material::decoration, isSolidRender()) +{ + this->usesDataBit = usesDataBit; + setShape(0, 0, 0, 1, 2 / 16.0f, 1); + + iconTurn = NULL; +} + +bool BaseRailTile::isUsesDataBit() +{ + return usesDataBit; +} + +AABB *BaseRailTile::getAABB(Level *level, int x, int y, int z) +{ + return NULL; +} + +bool BaseRailTile::blocksLight() +{ + return false; +} + +bool BaseRailTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +HitResult *BaseRailTile::clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b) +{ + updateShape(level, xt, yt, zt); + return Tile::clip(level, xt, yt, zt, a, b); +} + +void BaseRailTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param +{ + int data = level->getData(x, y, z); + if (data >= 2 && data <= 5) + { + setShape(0, 0, 0, 1, 2 / 16.0f + 0.5f, 1); + } else + { + setShape(0, 0, 0, 1, 2 / 16.0f, 1); + } +} + +bool BaseRailTile::isCubeShaped() +{ + return false; +} + +int BaseRailTile::getRenderShape() +{ + return Tile::SHAPE_RAIL; +} + +int BaseRailTile::getResourceCount(Random random) +{ + return 1; +} + +bool BaseRailTile::mayPlace(Level *level, int x, int y, int z) +{ + if (level->isTopSolidBlocking(x, y - 1, z)) + { + return true; + } + return false; +} + +void BaseRailTile::onPlace(Level *level, int x, int y, int z) +{ + if (!level->isClientSide) + { + updateDir(level, x, y, z, true); + + if (usesDataBit) + { + neighborChanged(level, x, y, z, id); + } + } +} + +void BaseRailTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + if (level->isClientSide) return; + + int data = level->getData(x, y, z); + int dir = data; + if (usesDataBit) { + dir = dir & RAIL_DIRECTION_MASK; + } + bool remove = false; + + if (!level->isTopSolidBlocking(x, y - 1, z)) remove = true; + if (dir == 2 && !level->isTopSolidBlocking(x + 1, y, z)) remove = true; + if (dir == 3 && !level->isTopSolidBlocking(x - 1, y, z)) remove = true; + if (dir == 4 && !level->isTopSolidBlocking(x, y, z - 1)) remove = true; + if (dir == 5 && !level->isTopSolidBlocking(x, y, z + 1)) remove = true; + + if (remove) + { + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + } + else + { + updateState(level, x, y, z, data, dir, type); + } + +} + +void BaseRailTile::updateState(Level *level, int x, int y, int z, int data, int dir, int type) +{ +} + +void BaseRailTile::updateDir(Level *level, int x, int y, int z, bool first) +{ + if (level->isClientSide) return; + Rail *rail = new Rail(level, x, y, z); + rail->place(level->hasNeighborSignal(x, y, z), first); + delete rail; +} + +int BaseRailTile::getPistonPushReaction() +{ + // override the decoration material's reaction + return Material::PUSH_NORMAL; +} + +void BaseRailTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + int dir = data; + if (usesDataBit) + { + dir &= RAIL_DIRECTION_MASK; + } + + Tile::onRemove(level, x, y, z, id, data); + + if (dir == 2 || dir == 3 || dir == 4 || dir == 5) + { + level->updateNeighborsAt(x, y + 1, z, id); + } + if (usesDataBit) + { + level->updateNeighborsAt(x, y, z, id); + level->updateNeighborsAt(x, y - 1, z, id); + } +} \ No newline at end of file diff --git a/Minecraft.World/BaseRailTile.h b/Minecraft.World/BaseRailTile.h new file mode 100644 index 00000000..105ddfde --- /dev/null +++ b/Minecraft.World/BaseRailTile.h @@ -0,0 +1,89 @@ +#pragma once +#include "Tile.h" +#include "TilePos.h" +#include "Definitions.h" + +class Random; +class HitResult; +class ChunkRebuildData; + +using namespace std; + +class BaseRailTile : public Tile +{ + friend class Tile; + friend class ChunkRebuildData; +public: + static const int DIR_FLAT_Z = 0; + static const int DIR_FLAT_X = 1; + // the data bit is used by boosters and detectors, so they can't turn + static const int RAIL_DATA_BIT = 8; + static const int RAIL_DIRECTION_MASK = 7; + +private: + Icon *iconTurn; + +protected: + bool usesDataBit; + + class Rail + { + friend class BaseRailTile; + friend class RailTile; + private: + Level *level; + int x, y, z; + bool usesDataBit; + vector connections; + bool m_bValidRail; // 4J added + + public: + Rail(Level *level, int x, int y, int z); + ~Rail(); + private: + void updateConnections(int direction); + void removeSoftConnections(); + bool hasRail(int x, int y, int z); + Rail *getRail(TilePos *p); + bool connectsTo(Rail *rail); + bool hasConnection(int x, int y, int z); + + protected: + int countPotentialConnections(); + + private: + bool canConnectTo(Rail *rail); + void connectTo(Rail *rail); + bool hasNeighborRail(int x, int y, int z); + public: + void place(bool hasSignal, bool first); + }; +public: + static bool isRail(Level *level, int x, int y, int z); + static bool isRail(int id); +protected: + BaseRailTile(int id, bool usesDataBit); +public: + using Tile::getResourceCount; + + bool isUsesDataBit(); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual bool blocksLight(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual bool isCubeShaped(); + virtual int getRenderShape(); + virtual int getResourceCount(Random random); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + +protected: + virtual void updateState(Level *level, int x, int y, int z, int data, int dir, int type); + virtual void updateDir(Level *level, int x, int y, int z, bool first); + +public: + int getPistonPushReaction(); + void onRemove(Level *level, int x, int y, int z, int id, int data); +}; diff --git a/Minecraft.World/BasicTypeContainers.cpp b/Minecraft.World/BasicTypeContainers.cpp index ea9839c6..9ecc865c 100644 --- a/Minecraft.World/BasicTypeContainers.cpp +++ b/Minecraft.World/BasicTypeContainers.cpp @@ -14,6 +14,8 @@ const float Float::MAX_VALUE = FLT_MAX; const double Double::MAX_VALUE = DBL_MAX; +const double Double::MIN_NORMAL = DBL_MIN; + int Integer::parseInt(wstring &str, int radix /* = 10*/) { return wcstol( str.c_str(), NULL, radix ); diff --git a/Minecraft.World/BasicTypeContainers.h b/Minecraft.World/BasicTypeContainers.h index 094e9616..5f577a97 100644 --- a/Minecraft.World/BasicTypeContainers.h +++ b/Minecraft.World/BasicTypeContainers.h @@ -47,6 +47,7 @@ class Double { public: static const double MAX_VALUE; + static const double MIN_NORMAL; static bool isNaN( double a ) { #ifdef __PS3__ diff --git a/Minecraft.World/Bat.cpp b/Minecraft.World/Bat.cpp new file mode 100644 index 00000000..d3bd3521 --- /dev/null +++ b/Minecraft.World/Bat.cpp @@ -0,0 +1,258 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "Bat.h" + +Bat::Bat(Level *level) : AmbientCreature(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); + + targetPosition = NULL; + + setSize(.5f, .9f); + setResting(true); +} + +void Bat::defineSynchedData() +{ + AmbientCreature::defineSynchedData(); + + entityData->define(DATA_ID_FLAGS, (char) 0); +} + +float Bat::getSoundVolume() +{ + return 0.1f; +} + +float Bat::getVoicePitch() +{ + return AmbientCreature::getVoicePitch() * .95f; +} + +int Bat::getAmbientSound() +{ + if (isResting() && random->nextInt(4) != 0) + { + return -1; + } + return eSoundType_MOB_BAT_IDLE; //"mob.bat.idle"; +} + +int Bat::getHurtSound() +{ + return eSoundType_MOB_BAT_HURT; //"mob.bat.hurt"; +} + +int Bat::getDeathSound() +{ + return eSoundType_MOB_BAT_DEATH; //"mob.bat.death"; +} + +bool Bat::isPushable() +{ + // bats can't be pushed by other mobs + return false; +} + +void Bat::doPush(shared_ptr e) +{ + // bats don't push other mobs +} + +void Bat::pushEntities() +{ + // bats don't push other mobs +} + +void Bat::registerAttributes() +{ + AmbientCreature::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(6); +} + +bool Bat::isResting() +{ + return (entityData->getByte(DATA_ID_FLAGS) & FLAG_RESTING) != 0; +} + +void Bat::setResting(bool value) +{ + char current = entityData->getByte(DATA_ID_FLAGS); + if (value) + { + entityData->set(DATA_ID_FLAGS, (char) (current | FLAG_RESTING)); + } + else + { + entityData->set(DATA_ID_FLAGS, (char) (current & ~FLAG_RESTING)); + } +} + +bool Bat::useNewAi() +{ + return true; +} + +void Bat::tick() +{ + + AmbientCreature::tick(); + + if (isResting()) + { + xd = yd = zd = 0; + y = Mth::floor(y) + 1.0 - bbHeight; + } + else + { + yd *= .6f; + } + +} + +inline int signum(double x) { return (x > 0) - (x < 0); } + +void Bat::newServerAiStep() +{ + AmbientCreature::newServerAiStep(); + + if (isResting()) + { + if (!level->isSolidBlockingTile(Mth::floor(x), (int) y + 1, Mth::floor(z))) + { + setResting(false); + level->levelEvent(nullptr, LevelEvent::SOUND_BAT_LIFTOFF, (int) x, (int) y, (int) z, 0); + } + else + { + + if (random->nextInt(200) == 0) + { + yHeadRot = random->nextInt(360); + } + + if (level->getNearestPlayer(shared_from_this(), 4.0f) != NULL) + { + setResting(false); + level->levelEvent(nullptr, LevelEvent::SOUND_BAT_LIFTOFF, (int) x, (int) y, (int) z, 0); + } + } + } + else + { + + if (targetPosition != NULL && (!level->isEmptyTile(targetPosition->x, targetPosition->y, targetPosition->z) || targetPosition->y < 1)) + { + delete targetPosition; + targetPosition = NULL; + } + if (targetPosition == NULL || random->nextInt(30) == 0 || targetPosition->distSqr((int) x, (int) y, (int) z) < 4) + { + delete targetPosition; + targetPosition = new Pos((int) x + random->nextInt(7) - random->nextInt(7), (int) y + random->nextInt(6) - 2, (int) z + random->nextInt(7) - random->nextInt(7)); + } + + double dx = (targetPosition->x + .5) - x; + double dy = (targetPosition->y + .1) - y; + double dz = (targetPosition->z + .5) - z; + + xd = xd + (signum(dx) * .5f - xd) * .1f; + yd = yd + (signum(dy) * .7f - yd) * .1f; + zd = zd + (signum(dz) * .5f - zd) * .1f; + + float yRotD = (float) (atan2(zd, xd) * 180 / PI) - 90; + float rotDiff = Mth::wrapDegrees(yRotD - yRot); + yya = .5f; + yRot += rotDiff; + + if (random->nextInt(100) == 0 && level->isSolidBlockingTile(Mth::floor(x), (int) y + 1, Mth::floor(z))) + { + setResting(true); + } + + } +} + +bool Bat::makeStepSound() +{ + return false; +} + +void Bat::causeFallDamage(float distance) +{ +} + +void Bat::checkFallDamage(double ya, bool onGround) +{ + // this method is empty because flying creatures should + // not trigger the "fallOn" tile calls (such as trampling crops) +} + +bool Bat::isIgnoringTileTriggers() +{ + return true; +} + +bool Bat::hurt(DamageSource *source, float dmg) +{ + if (isInvulnerable()) return false; + if (!level->isClientSide) + { + if (isResting()) + { + setResting(false); + } + } + + return AmbientCreature::hurt(source, dmg); +} + +void Bat::readAdditionalSaveData(CompoundTag *tag) +{ + AmbientCreature::readAdditionalSaveData(tag); + + entityData->set(DATA_ID_FLAGS, tag->getByte(L"BatFlags")); +} + +void Bat::addAdditonalSaveData(CompoundTag *entityTag) +{ + AmbientCreature::addAdditonalSaveData(entityTag); + + entityTag->putByte(L"BatFlags", entityData->getByte(DATA_ID_FLAGS)); +} + + +bool Bat::canSpawn() +{ + int yt = Mth::floor(bb->y0); + if (yt >= level->seaLevel) return false; + + int xt = Mth::floor(x); + int zt = Mth::floor(z); + + int br = level->getRawBrightness(xt, yt, zt); + int maxLight = 4; + + if ((Calendar::GetDayOfMonth() + 1 == 10 && Calendar::GetDayOfMonth() >= 20) || (Calendar::GetMonth() + 1 == 11 && Calendar::GetMonth() <= 3)) + { + maxLight = 7; + } + else if (random->nextBoolean()) + { + return false; + } + + if (br > random->nextInt(maxLight)) return false; + + return AmbientCreature::canSpawn(); +} \ No newline at end of file diff --git a/Minecraft.World/Bat.h b/Minecraft.World/Bat.h new file mode 100644 index 00000000..118fc6ed --- /dev/null +++ b/Minecraft.World/Bat.h @@ -0,0 +1,58 @@ +#pragma once + +#include "AmbientCreature.h" + +class Bat : public AmbientCreature +{ +public: + eINSTANCEOF GetType() { return eTYPE_BAT; } + static Entity *create(Level *level) { return new Bat(level); } + +private: + static const int DATA_ID_FLAGS = 16; + static const int FLAG_RESTING = 1; + + Pos *targetPosition; + +public: + Bat(Level *level); + +protected: + virtual void defineSynchedData(); + virtual float getSoundVolume(); + virtual float getVoicePitch(); + virtual int getAmbientSound(); + virtual int getHurtSound(); + virtual int getDeathSound(); + +public: + virtual bool isPushable(); + +protected: + virtual void doPush(shared_ptr e); + virtual void pushEntities(); + virtual void registerAttributes(); + +public: + virtual bool isResting(); + virtual void setResting(bool value); + +protected: + virtual bool useNewAi(); + +public: + virtual void tick(); + +protected: + virtual void newServerAiStep(); + virtual bool makeStepSound(); + virtual void causeFallDamage(float distance); + virtual void checkFallDamage(double ya, bool onGround); + virtual bool isIgnoringTileTriggers(); + +public: + virtual bool hurt(DamageSource *source, float dmg); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *entityTag); + virtual bool canSpawn(); +}; \ No newline at end of file diff --git a/Minecraft.World/BeachBiome.cpp b/Minecraft.World/BeachBiome.cpp index ba85908a..50e7cc1c 100644 --- a/Minecraft.World/BeachBiome.cpp +++ b/Minecraft.World/BeachBiome.cpp @@ -8,8 +8,8 @@ BeachBiome::BeachBiome(int id) : Biome(id) // remove default mob spawn settings friendlies.clear(); friendlies_chicken.clear(); // 4J added - this->topMaterial = (byte) Tile::sand_Id; - this->material = (byte) Tile::sand_Id; + topMaterial = (byte) Tile::sand_Id; + material = (byte) Tile::sand_Id; decorator->treeCount = -999; decorator->deadBushCount = 0; diff --git a/Minecraft.World/BeaconMenu.cpp b/Minecraft.World/BeaconMenu.cpp new file mode 100644 index 00000000..707e9ebf --- /dev/null +++ b/Minecraft.World/BeaconMenu.cpp @@ -0,0 +1,140 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "BeaconMenu.h" + +BeaconMenu::BeaconMenu(shared_ptr inventory, shared_ptr beacon) +{ + this->beacon = beacon; + + addSlot(paymentSlot = new BeaconMenu::PaymentSlot(beacon, PAYMENT_SLOT, 136, 110)); + + int xo = 36; + int yo = 137; + + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x + y * 9 + 9, xo + x * 18, yo + y * 18)); + } + } + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x, xo + x * 18, 58 + yo)); + } + + levels = beacon->getLevels(); + primaryPower = beacon->getPrimaryPower(); + secondaryPower = beacon->getSecondaryPower(); +} + + +void BeaconMenu::addSlotListener(ContainerListener *listener) +{ + AbstractContainerMenu::addSlotListener(listener); + + listener->setContainerData(this, 0, levels); + listener->setContainerData(this, 1, primaryPower); + listener->setContainerData(this, 2, secondaryPower); +} + +void BeaconMenu::setData(int id, int value) +{ + if (id == 0) beacon->setLevels(value); + if (id == 1) beacon->setPrimaryPower(value); + if (id == 2) beacon->setSecondaryPower(value); +} + +shared_ptr BeaconMenu::getBeacon() +{ + return beacon; +} + +bool BeaconMenu::stillValid(shared_ptr player) +{ + return beacon->stillValid(player); +} + +shared_ptr BeaconMenu::quickMoveStack(shared_ptr player, int slotIndex) +{ + shared_ptr clicked = nullptr; + Slot *slot = slots.at(slotIndex); + if (slot != NULL && slot->hasItem()) + { + shared_ptr stack = slot->getItem(); + clicked = stack->copy(); + + if (slotIndex == PAYMENT_SLOT) + { + if (!moveItemStackTo(stack, INV_SLOT_START, USE_ROW_SLOT_END, true)) + { + return nullptr; + } + slot->onQuickCraft(stack, clicked); + } + else if (!paymentSlot->hasItem() && paymentSlot->mayPlace(stack) && stack->count == 1) + { + if (!moveItemStackTo(stack, PAYMENT_SLOT, PAYMENT_SLOT + 1, false)) + { + return nullptr; + } + } + else if (slotIndex >= INV_SLOT_START && slotIndex < INV_SLOT_END) + { + if (!moveItemStackTo(stack, USE_ROW_SLOT_START, USE_ROW_SLOT_END, false)) + { + return nullptr; + } + } + else if (slotIndex >= USE_ROW_SLOT_START && slotIndex < USE_ROW_SLOT_END) + { + if (!moveItemStackTo(stack, INV_SLOT_START, INV_SLOT_END, false)) + { + return nullptr; + } + } + else + { + if (!moveItemStackTo(stack, INV_SLOT_START, USE_ROW_SLOT_END, false)) + { + return nullptr; + } + } + if (stack->count == 0) + { + slot->set(nullptr); + } + else + { + slot->setChanged(); + } + if (stack->count == clicked->count) + { + return nullptr; + } + else + { + slot->onTake(player, stack); + } + } + return clicked; +} + +BeaconMenu::PaymentSlot::PaymentSlot(shared_ptr container, int slot, int x, int y) : Slot(container, slot, x, y) +{ +} + +bool BeaconMenu::PaymentSlot::mayPlace(shared_ptr item) +{ + if (item != NULL) + { + return (item->id == Item::emerald_Id || item->id == Item::diamond_Id || item->id == Item::goldIngot_Id || item->id == Item::ironIngot_Id); + } + return false; +} + +int BeaconMenu::PaymentSlot::getMaxStackSize() +{ + return 1; +} \ No newline at end of file diff --git a/Minecraft.World/BeaconMenu.h b/Minecraft.World/BeaconMenu.h new file mode 100644 index 00000000..8d3afba6 --- /dev/null +++ b/Minecraft.World/BeaconMenu.h @@ -0,0 +1,44 @@ +#pragma once + +#include "AbstractContainerMenu.h" +#include "Slot.h" + +class BeaconTileEntity; + +class BeaconMenu : public AbstractContainerMenu +{ +private: + class PaymentSlot : public Slot + { + public: + PaymentSlot(shared_ptr container, int slot, int x, int y); + + bool mayPlace(shared_ptr item); + int getMaxStackSize(); + }; + +public: + static const int PAYMENT_SLOT = 0; + static const int INV_SLOT_START = PAYMENT_SLOT + 1; + static const int INV_SLOT_END = INV_SLOT_START + 9 * 3; + static const int USE_ROW_SLOT_START = INV_SLOT_END; + static const int USE_ROW_SLOT_END = USE_ROW_SLOT_START + 9; + +private: + shared_ptr beacon; + PaymentSlot *paymentSlot; + + // copied values because container/client system is retarded + int levels; + int primaryPower; + int secondaryPower; + +public: + BeaconMenu(shared_ptr inventory, shared_ptr beacon); + + void addSlotListener(ContainerListener *listener); + void setData(int id, int value); + shared_ptr getBeacon(); + bool stillValid(shared_ptr player); + shared_ptr quickMoveStack(shared_ptr player, int slotIndex); +}; \ No newline at end of file diff --git a/Minecraft.World/BeaconTile.cpp b/Minecraft.World/BeaconTile.cpp new file mode 100644 index 00000000..f002cbe2 --- /dev/null +++ b/Minecraft.World/BeaconTile.cpp @@ -0,0 +1,64 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "BeaconTile.h" + +BeaconTile::BeaconTile(int id) : BaseEntityTile(id, Material::glass, isSolidRender()) +{ + setDestroyTime(3.0f); +} + +shared_ptr BeaconTile::newTileEntity(Level *level) +{ + return shared_ptr( new BeaconTileEntity() ); +} + +bool BeaconTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +{ + if (level->isClientSide) return true; + + shared_ptr beacon = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + if (beacon != NULL) player->openBeacon(beacon); + + return true; +} + +bool BeaconTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +bool BeaconTile::isCubeShaped() +{ + return false; +} + +bool BeaconTile::blocksLight() +{ + return false; +} + +int BeaconTile::getRenderShape() +{ + return SHAPE_BEACON; +} + +void BeaconTile::registerIcons(IconRegister *iconRegister) +{ + BaseEntityTile::registerIcons(iconRegister); +} + +void BeaconTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + BaseEntityTile::setPlacedBy(level, x, y, z, by, itemInstance); + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } +} + +bool BeaconTile::TestUse() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.World/BeaconTile.h b/Minecraft.World/BeaconTile.h new file mode 100644 index 00000000..d213fa3d --- /dev/null +++ b/Minecraft.World/BeaconTile.h @@ -0,0 +1,19 @@ +#pragma once + +#include "BaseEntityTile.h" + +class BeaconTile : public BaseEntityTile +{ +public: + BeaconTile(int id); + + shared_ptr newTileEntity(Level *level); + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + bool isSolidRender(bool isServerLevel = false); + bool isCubeShaped(); + bool blocksLight(); + int getRenderShape(); + void registerIcons(IconRegister *iconRegister); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual bool TestUse(); +}; \ No newline at end of file diff --git a/Minecraft.World/BeaconTileEntity.cpp b/Minecraft.World/BeaconTileEntity.cpp new file mode 100644 index 00000000..4b9a3882 --- /dev/null +++ b/Minecraft.World/BeaconTileEntity.cpp @@ -0,0 +1,372 @@ +#include "stdafx.h" +#include "net.minecraft.network.packet.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "BeaconTileEntity.h" + +shared_ptr BeaconTileEntity::clone() +{ + shared_ptr result = shared_ptr( new BeaconTileEntity() ); + TileEntity::clone(result); + + result->primaryPower = primaryPower; + result->secondaryPower = secondaryPower; + result->levels = levels; + + return result; +} + +MobEffect *BeaconTileEntity::BEACON_EFFECTS[BeaconTileEntity::BEACON_EFFECTS_TIERS][BeaconTileEntity::BEACON_EFFECTS_EFFECTS]; + +void BeaconTileEntity::staticCtor() +{ + for(unsigned int tier = 0; tier < BEACON_EFFECTS_TIERS; ++tier) + { + for(unsigned int effect = 0; effect < BEACON_EFFECTS_EFFECTS; ++effect) + { + BEACON_EFFECTS[tier][effect] = NULL; + } + } + BEACON_EFFECTS[0][0] = MobEffect::movementSpeed; + BEACON_EFFECTS[0][1] = MobEffect::digSpeed; + BEACON_EFFECTS[1][0] = MobEffect::damageResistance; + BEACON_EFFECTS[1][1] = MobEffect::jump; + BEACON_EFFECTS[2][0] = MobEffect::damageBoost; + BEACON_EFFECTS[3][0] = MobEffect::regeneration; +} + +BeaconTileEntity::BeaconTileEntity() +{ + clientSideRenderTick = 0; + clientSideRenderScale = 0.0f; + + isActive = false; + levels = -1; + + primaryPower = 0; + secondaryPower = 0; + + paymentItem = nullptr; + name = L""; +} + +void BeaconTileEntity::tick() +{ + // 4J Stu - Added levels check to force an initial tick + if ( (!level->isClientSide && levels < 0) || (level->getGameTime() % (SharedConstants::TICKS_PER_SECOND * 4)) == 0) + { + updateShape(); + applyEffects(); + } + +} + +void BeaconTileEntity::applyEffects() +{ + if (isActive && levels > 0 && !level->isClientSide && primaryPower > 0) + { + + double range = (levels * 10) + 10; + int baseAmp = 0; + if (levels >= 4 && primaryPower == secondaryPower) + { + baseAmp = 1; + } + + AABB *bb = AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(range, range, range); + bb->y1 = level->getMaxBuildHeight(); + vector > *players = level->getEntitiesOfClass(typeid(Player), bb); + for (AUTO_VAR(it,players->begin()); it != players->end(); ++it) + { + shared_ptr player = dynamic_pointer_cast(*it); + player->addEffect(new MobEffectInstance(primaryPower, SharedConstants::TICKS_PER_SECOND * 9, baseAmp, true)); + } + + if (levels >= 4 && primaryPower != secondaryPower && secondaryPower > 0) + { + for (AUTO_VAR(it,players->begin()); it != players->end(); ++it) + { + shared_ptr player = dynamic_pointer_cast(*it); + player->addEffect(new MobEffectInstance(secondaryPower, SharedConstants::TICKS_PER_SECOND * 9, 0, true)); + } + } + delete players; + } +} + +void BeaconTileEntity::updateShape() +{ + + if (!level->canSeeSky(x, y + 1, z)) + { + isActive = false; + levels = 0; + } + else + { + isActive = true; + + levels = 0; + for (int step = 1; step <= 4; step++) + { + + int ly = y - step; + if (ly < 0) + { + break; + } + + bool isOk = true; + for (int lx = x - step; lx <= x + step && isOk; lx++) + { + for (int lz = z - step; lz <= z + step; lz++) + { + int tile = level->getTile(lx, ly, lz); + if (tile != Tile::emeraldBlock_Id && tile != Tile::goldBlock_Id && tile != Tile::diamondBlock_Id && tile != Tile::ironBlock_Id) + { + isOk = false; + break; + } + } + } + if (isOk) + { + levels = step; + } + else + { + break; + } + } + if (levels == 0) + { + isActive = false; + } + } + +} + +float BeaconTileEntity::getAndUpdateClientSideScale() +{ + + if (!isActive) + { + return 0; + } + + int renderDelta = (int) (level->getGameTime() - clientSideRenderTick); + clientSideRenderTick = level->getGameTime(); + if (renderDelta > 1) + { + clientSideRenderScale -= ((float) renderDelta / (float) SCALE_TIME); + + if (clientSideRenderScale < 0) + { + clientSideRenderScale = 0; + } + } + clientSideRenderScale += (1.0f / (float) SCALE_TIME); + if (clientSideRenderScale > 1) + { + clientSideRenderScale = 1; + } + return clientSideRenderScale; +} + +int BeaconTileEntity::getPrimaryPower() +{ + return primaryPower; +} + +int BeaconTileEntity::getSecondaryPower() +{ + return secondaryPower; +} + +int BeaconTileEntity::getLevels() +{ + return levels; +} + +// client-side method used by GUI +void BeaconTileEntity::setLevels(int levels) +{ + this->levels = levels; +} + +void BeaconTileEntity::setPrimaryPower(int primaryPower) +{ + this->primaryPower = 0; + + // verify power + for (int tier = 0; tier < levels && tier < 3; tier++) + { + for(unsigned int e = 0; e < BEACON_EFFECTS_EFFECTS; ++e) + { + MobEffect *effect = BEACON_EFFECTS[tier][e]; + if(effect == NULL) break; + + if (effect->id == primaryPower) + { + this->primaryPower = primaryPower; + return; + } + } + } +} + +void BeaconTileEntity::setSecondaryPower(int secondaryPower) +{ + this->secondaryPower = 0; + + // verify power + if (levels >= 4) + { + for (int tier = 0; tier < 4; tier++) + { + for(unsigned int e = 0; e < BEACON_EFFECTS_EFFECTS; ++e) + { + MobEffect *effect = BEACON_EFFECTS[tier][e]; + if(effect == NULL) break; + + if (effect->id == secondaryPower) + { + this->secondaryPower = secondaryPower; + return; + } + } + } + } +} + +shared_ptr BeaconTileEntity::getUpdatePacket() +{ + CompoundTag *tag = new CompoundTag(); + save(tag); + return shared_ptr( new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_BEACON, tag) ); +} + +double BeaconTileEntity::getViewDistance() +{ + return 256 * 256; +} + +void BeaconTileEntity::load(CompoundTag *tag) +{ + TileEntity::load(tag); + + primaryPower = tag->getInt(L"Primary"); + secondaryPower = tag->getInt(L"Secondary"); + levels = tag->getInt(L"Levels"); +} + +void BeaconTileEntity::save(CompoundTag *tag) +{ + TileEntity::save(tag); + + tag->putInt(L"Primary", primaryPower); + tag->putInt(L"Secondary", secondaryPower); + // this value is re-calculated, but save it anyway to avoid update lag + tag->putInt(L"Levels", levels); +} + +unsigned int BeaconTileEntity::getContainerSize() +{ + return 1; +} + +shared_ptr BeaconTileEntity::getItem(unsigned int slot) +{ + if (slot == 0) + { + return paymentItem; + } + return nullptr; +} + +shared_ptr BeaconTileEntity::removeItem(unsigned int slot, int count) +{ + if (slot == 0 && paymentItem != NULL) + { + if (count >= paymentItem->count) + { + shared_ptr returnItem = paymentItem; + paymentItem = nullptr; + return returnItem; + } + else + { + paymentItem->count -= count; + return shared_ptr( new ItemInstance(paymentItem->id, count, paymentItem->getAuxValue()) ); + } + } + return nullptr; +} + +shared_ptr BeaconTileEntity::removeItemNoUpdate(int slot) +{ + if (slot == 0 && paymentItem != NULL) + { + shared_ptr returnItem = paymentItem; + paymentItem = nullptr; + return returnItem; + } + return nullptr; +} + +void BeaconTileEntity::setItem(unsigned int slot, shared_ptr item) +{ + if (slot == 0) + { + paymentItem = item; + } +} + +wstring BeaconTileEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_CONTAINER_BEACON); +} + +wstring BeaconTileEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +bool BeaconTileEntity::hasCustomName() +{ + return !name.empty(); +} + +void BeaconTileEntity::setCustomName(const wstring &name) +{ + this->name = name; +} + +int BeaconTileEntity::getMaxStackSize() +{ + return 1; +} + +bool BeaconTileEntity::stillValid(shared_ptr player) +{ + if (level->getTileEntity(x, y, z) != shared_from_this()) return false; + if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; + return true; +} + +void BeaconTileEntity::startOpen() +{ +} + +void BeaconTileEntity::stopOpen() +{ +} + +bool BeaconTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + return (item->id == Item::emerald_Id || item->id == Item::diamond_Id || item->id == Item::goldIngot_Id || item->id == Item::ironIngot_Id); +} \ No newline at end of file diff --git a/Minecraft.World/BeaconTileEntity.h b/Minecraft.World/BeaconTileEntity.h new file mode 100644 index 00000000..1b6067a1 --- /dev/null +++ b/Minecraft.World/BeaconTileEntity.h @@ -0,0 +1,75 @@ +#pragma once +#include "TileEntity.h" +#include "Container.h" + +class BeaconTileEntity : public TileEntity, public Container +{ +public: + eINSTANCEOF GetType() { return eTYPE_BEACONTILEENTITY; } + static TileEntity *create() { return new BeaconTileEntity(); } + // 4J Added + virtual shared_ptr clone(); + +private: + static const int SCALE_TIME = SharedConstants::TICKS_PER_SECOND * 2; + +public: + static const int BEACON_EFFECTS_TIERS = 4; + static const int BEACON_EFFECTS_EFFECTS = 3; + static MobEffect *BEACON_EFFECTS[BEACON_EFFECTS_TIERS][BEACON_EFFECTS_EFFECTS]; + + static void staticCtor(); + +private: + __int64 clientSideRenderTick; + float clientSideRenderScale; + + bool isActive; + int levels; + + int primaryPower; + int secondaryPower; + + shared_ptr paymentItem; + wstring name; + +public: + BeaconTileEntity(); + + void tick(); + +private: + void applyEffects(); + void updateShape(); + +public: + float getAndUpdateClientSideScale(); + int getPrimaryPower(); + int getSecondaryPower(); + int getLevels(); + // client-side method used by GUI + void setLevels(int levels); + void setPrimaryPower(int primaryPower); + void setSecondaryPower(int secondaryPower); + shared_ptr getUpdatePacket(); + double getViewDistance(); + void load(CompoundTag *tag); + void save(CompoundTag *tag); + unsigned int getContainerSize(); + shared_ptr getItem(unsigned int slot); + shared_ptr removeItem(unsigned int slot, int count); + shared_ptr removeItemNoUpdate(int slot); + void setItem(unsigned int slot, shared_ptr item); + wstring getName(); + wstring getCustomName(); + bool hasCustomName(); + void setCustomName(const wstring &name); + int getMaxStackSize(); + bool stillValid(shared_ptr player); + void startOpen(); + void stopOpen(); + bool canPlaceItem(int slot, shared_ptr item); + + // 4J Stu - For container + virtual void setChanged() { TileEntity::setChanged(); } +}; \ No newline at end of file diff --git a/Minecraft.World/BedItem.cpp b/Minecraft.World/BedItem.cpp index 1ff50c6c..a55f277e 100644 --- a/Minecraft.World/BedItem.cpp +++ b/Minecraft.World/BedItem.cpp @@ -14,6 +14,8 @@ BedItem::BedItem(int id) : Item( id ) bool BedItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { + if (level->isClientSide) return true; + if (face != Facing::UP) { return false; @@ -33,21 +35,21 @@ bool BedItem::useOn(shared_ptr itemInstance, shared_ptr pl if (dir == Direction::NORTH) zra = -1; if (dir == Direction::EAST) xra = 1; - if (!player->mayBuild(x, y, z) || !player->mayBuild(x + xra, y, z + zra)) return false; + if (!player->mayUseItemAt(x, y, z, face, itemInstance) || !player->mayUseItemAt(x + xra, y, z + zra, face, itemInstance)) return false; if (level->isEmptyTile(x, y, z) && level->isEmptyTile(x + xra, y, z + zra) && level->isTopSolidBlocking(x, y - 1, z) && level->isTopSolidBlocking(x + xra, y - 1, z + zra)) { // 4J-PB - Adding a test only version to allow tooltips to be displayed if(!bTestUseOnOnly) { - level->setTileAndData(x, y, z, tile->id, dir); + level->setTileAndData(x, y, z, tile->id, dir, Tile::UPDATE_ALL); // double-check that the bed was successfully placed if (level->getTile(x, y, z) == tile->id) { // 4J-JEV: Hook for durango 'BlockPlaced' event. player->awardStat(GenericStats::blocksPlaced(tile->id), GenericStats::param_blocksPlaced(tile->id,itemInstance->getAuxValue(),1)); - level->setTileAndData(x + xra, y, z + zra, tile->id, dir + BedTile::HEAD_PIECE_DATA); + level->setTileAndData(x + xra, y, z + zra, tile->id, dir + BedTile::HEAD_PIECE_DATA, Tile::UPDATE_ALL); } itemInstance->count--; diff --git a/Minecraft.World/BedTile.cpp b/Minecraft.World/BedTile.cpp index 7d32c6d3..2023e23f 100644 --- a/Minecraft.World/BedTile.cpp +++ b/Minecraft.World/BedTile.cpp @@ -9,7 +9,7 @@ int BedTile::HEAD_DIRECTION_OFFSETS[4][2] = { - { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } + { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } }; BedTile::BedTile(int id) : DirectionalTile(id, Material::cloth, isSolidRender()) @@ -24,7 +24,7 @@ BedTile::BedTile(int id) : DirectionalTile(id, Material::cloth, isSolidRender()) // 4J Added override void BedTile::updateDefaultShape() { - setShape(); + setShape(); } // 4J-PB - Adding a TestUse for tooltip display @@ -68,75 +68,76 @@ bool BedTile::TestUse(Level *level, int x, int y, int z, shared_ptr play bool BedTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) return false; - if (level->isClientSide) return true; + if (level->isClientSide) return true; - int data = level->getData(x, y, z); + int data = level->getData(x, y, z); - if (!BedTile::isHeadPiece(data)) + if (!isHeadPiece(data)) { - // fetch head piece instead - int direction = getDirection(data); - x += HEAD_DIRECTION_OFFSETS[direction][0]; - z += HEAD_DIRECTION_OFFSETS[direction][1]; - if (level->getTile(x, y, z) != id) + // fetch head piece instead + int direction = getDirection(data); + x += HEAD_DIRECTION_OFFSETS[direction][0]; + z += HEAD_DIRECTION_OFFSETS[direction][1]; + if (level->getTile(x, y, z) != id) { - return true; - } - data = level->getData(x, y, z); - } + return true; + } + data = level->getData(x, y, z); + } - if (!level->dimension->mayRespawn()) + if (!level->dimension->mayRespawn() || level->getBiome(x, z) == Biome::hell) { - double xc = x + 0.5; - double yc = y + 0.5; - double zc = z + 0.5; - level->setTile(x, y, z, 0); - int direction = getDirection(data); - x += HEAD_DIRECTION_OFFSETS[direction][0]; - z += HEAD_DIRECTION_OFFSETS[direction][1]; - if (level->getTile(x, y, z) == id) { - level->setTile(x, y, z, 0); - xc = (xc + x + 0.5) / 2; - yc = (yc + y + 0.5) / 2; - zc = (zc + z + 0.5) / 2; - } - level->explode(nullptr, x + 0.5f, y + 0.5f, z + 0.5f, 5, true, true); - return true; - } - - if (BedTile::isOccupied(data)) + double xc = x + 0.5; + double yc = y + 0.5; + double zc = z + 0.5; + level->removeTile(x, y, z); + int direction = getDirection(data); + x += HEAD_DIRECTION_OFFSETS[direction][0]; + z += HEAD_DIRECTION_OFFSETS[direction][1]; + if (level->getTile(x, y, z) == id) + { + level->removeTile(x, y, z); + xc = (xc + x + 0.5) / 2; + yc = (yc + y + 0.5) / 2; + zc = (zc + z + 0.5) / 2; + } + level->explode(nullptr, x + 0.5f, y + 0.5f, z + 0.5f, 5, true, true); + return true; + } + + if (isOccupied(data)) { - shared_ptr sleepingPlayer = nullptr; + shared_ptr sleepingPlayer = nullptr; AUTO_VAR(itEnd, level->players.end()); - for (AUTO_VAR(it, level->players.begin()); it != itEnd; it++ ) + for (AUTO_VAR(it, level->players.begin()); it != itEnd; it++ ) { shared_ptr p = *it; - if (p->isSleeping()) + if (p->isSleeping()) { - Pos pos = p->bedPosition; - if (pos.x == x && pos.y == y && pos.z == z) + Pos pos = p->bedPosition; + if (pos.x == x && pos.y == y && pos.z == z) { - sleepingPlayer = p; - } - } - } + sleepingPlayer = p; + } + } + } - if (sleepingPlayer == NULL) + if (sleepingPlayer == NULL) { - BedTile::setOccupied(level, x, y, z, false); - } + setOccupied(level, x, y, z, false); + } else { player->displayClientMessage(IDS_TILE_BED_OCCUPIED ); - - return true; - } - } - Player::BedSleepingResult result = player->startSleepInBed(x, y, z); - if (result == Player::OK) + return true; + } + } + + Player::BedSleepingResult result = player->startSleepInBed(x, y, z); + if (result == Player::OK) { - BedTile::setOccupied(level, x, y, z, true); + setOccupied(level, x, y, z, true); // 4J-PB added // are there multiple players in the same world as us? if(level->AllPlayersAreSleeping()==false) @@ -144,18 +145,18 @@ bool BedTile::use(Level *level, int x, int y, int z, shared_ptr player, player->displayClientMessage(IDS_TILE_BED_PLAYERSLEEP); } return true; - } + } - if (result == Player::NOT_POSSIBLE_NOW) + if (result == Player::NOT_POSSIBLE_NOW) { player->displayClientMessage(IDS_TILE_BED_NO_SLEEP); - } + } else if (result == Player::NOT_SAFE) { - player->displayClientMessage(IDS_TILE_BED_NOTSAFE); - } + player->displayClientMessage(IDS_TILE_BED_NOTSAFE); + } - return true; + return true; } Icon *BedTile::getTexture(int face, int data) @@ -218,35 +219,35 @@ void BedTile::updateShape(LevelSource *level, int x, int y, int z, int forceData void BedTile::neighborChanged(Level *level, int x, int y, int z, int type) { - int data = level->getData(x, y, z); - int direction = getDirection(data); + int data = level->getData(x, y, z); + int direction = getDirection(data); - if (isHeadPiece(data)) + if (isHeadPiece(data)) { - if (level->getTile(x - HEAD_DIRECTION_OFFSETS[direction][0], y, z - HEAD_DIRECTION_OFFSETS[direction][1]) != id) + if (level->getTile(x - HEAD_DIRECTION_OFFSETS[direction][0], y, z - HEAD_DIRECTION_OFFSETS[direction][1]) != id) { - level->setTile(x, y, z, 0); - } - } else + level->removeTile(x, y, z); + } + } else { - if (level->getTile(x + HEAD_DIRECTION_OFFSETS[direction][0], y, z + HEAD_DIRECTION_OFFSETS[direction][1]) != id) + if (level->getTile(x + HEAD_DIRECTION_OFFSETS[direction][0], y, z + HEAD_DIRECTION_OFFSETS[direction][1]) != id) { - level->setTile(x, y, z, 0); - if (!level->isClientSide) + level->removeTile(x, y, z); + if (!level->isClientSide) { - Tile::spawnResources(level, x, y, z, data, 0); // 4J - had to add Tile:: here for C++ since this class doesn't have this overloaded method itself - } - } - } + Tile::spawnResources(level, x, y, z, data, 0); // 4J - had to add Tile:: here for C++ since this class doesn't have this overloaded method itself + } + } + } } int BedTile::getResource(int data, Random *random, int playerBonusLevel) { - if (isHeadPiece(data)) + if (isHeadPiece(data)) { - return 0; - } - return Item::bed->id; + return 0; + } + return Item::bed->id; } void BedTile::setShape() @@ -266,59 +267,59 @@ bool BedTile::isOccupied(int data) void BedTile::setOccupied(Level *level, int x, int y, int z, bool occupied) { - int data = level->getData(x, y, z); - if (occupied) + int data = level->getData(x, y, z); + if (occupied) { - data = data | OCCUPIED_DATA; - } else + data = data | OCCUPIED_DATA; + } else { - data = data & ~OCCUPIED_DATA; - } - level->setData(x, y, z, data); + data = data & ~OCCUPIED_DATA; + } + level->setData(x, y, z, data, Tile::UPDATE_NONE); } Pos *BedTile::findStandUpPosition(Level *level, int x, int y, int z, int skipCount) { - int data = level->getData(x, y, z); - int direction = DirectionalTile::getDirection(data); + int data = level->getData(x, y, z); + int direction = DirectionalTile::getDirection(data); - // try to find a clear location near the bed - for (int step = 0; step <= 1; step++) + // try to find a clear location near the bed + for (int step = 0; step <= 1; step++) { - int startX = x - BedTile::HEAD_DIRECTION_OFFSETS[direction][0] * step - 1; - int startZ = z - BedTile::HEAD_DIRECTION_OFFSETS[direction][1] * step - 1; - int endX = startX + 2; - int endZ = startZ + 2; + int startX = x - HEAD_DIRECTION_OFFSETS[direction][0] * step - 1; + int startZ = z - HEAD_DIRECTION_OFFSETS[direction][1] * step - 1; + int endX = startX + 2; + int endZ = startZ + 2; - for (int standX = startX; standX <= endX; standX++) + for (int standX = startX; standX <= endX; standX++) { - for (int standZ = startZ; standZ <= endZ; standZ++) + for (int standZ = startZ; standZ <= endZ; standZ++) { // 4J Stu - Changed to check isSolidBlockingTile rather than isEmpty for the blocks that we wish to place the player // This allows the player to spawn in blocks with snow, grass etc - if (level->isTopSolidBlocking(standX, y - 1, standZ) && - !level->isSolidBlockingTile(standX, y, standZ) && - !level->isSolidBlockingTile(standX, y + 1, standZ)) + if (level->isTopSolidBlocking(standX, y - 1, standZ) && + !level->getMaterial(standX, y, standZ)->isSolidBlocking() && + !level->getMaterial(standX, y + 1, standZ)->isSolidBlocking() ) { - if (skipCount > 0) { - skipCount--; - continue; - } - return new Pos(standX, y, standZ); - } - } - } - } - - return NULL; + if (skipCount > 0) { + skipCount--; + continue; + } + return new Pos(standX, y, standZ); + } + } + } + } + + return NULL; } void BedTile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus) { - if (!isHeadPiece(data)) + if (!isHeadPiece(data)) { - Tile::spawnResources(level, x, y, z, data, odds, 0); - } + Tile::spawnResources(level, x, y, z, data, odds, 0); + } } int BedTile::getPistonPushReaction() @@ -329,4 +330,21 @@ int BedTile::getPistonPushReaction() int BedTile::cloneTileId(Level *level, int x, int y, int z) { return Item::bed_Id; +} + +void BedTile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player) +{ + if (player->abilities.instabuild) + { + if (isHeadPiece(data)) + { + int direction = getDirection(data); + x -= HEAD_DIRECTION_OFFSETS[direction][0]; + z -= HEAD_DIRECTION_OFFSETS[direction][1]; + if (level->getTile(x, y, z) == id) + { + level->removeTile(x, y, z); + } + } + } } \ No newline at end of file diff --git a/Minecraft.World/BedTile.h b/Minecraft.World/BedTile.h index 339080d3..0e54ba36 100644 --- a/Minecraft.World/BedTile.h +++ b/Minecraft.World/BedTile.h @@ -17,37 +17,38 @@ private: Icon **iconTop; public: - static const int HEAD_PIECE_DATA = 0x8; - static const int OCCUPIED_DATA = 0x4; + static const int HEAD_PIECE_DATA = 0x8; + static const int OCCUPIED_DATA = 0x4; - static int HEAD_DIRECTION_OFFSETS[4][2]; + static int HEAD_DIRECTION_OFFSETS[4][2]; + + BedTile(int id); - BedTile(int id); - virtual void updateDefaultShape(); virtual bool TestUse(Level *level, int x, int y, int z, shared_ptr player); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual Icon *getTexture(int face, int data); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual Icon *getTexture(int face, int data); //@Override void registerIcons(IconRegister *iconRegister); - virtual int getRenderShape(); + virtual int getRenderShape(); virtual bool isCubeShaped(); virtual bool isSolidRender(bool isServerLevel = false); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual void neighborChanged(Level *level, int x, int y, int z, int type); - virtual int getResource(int data, Random *random,int playerBonusLevel); + virtual int getResource(int data, Random *random,int playerBonusLevel); private: using Tile::setShape; - void setShape(); + void setShape(); public: - static bool isHeadPiece(int data); - static bool isOccupied(int data); + static bool isHeadPiece(int data); + static bool isOccupied(int data); static void setOccupied(Level *level, int x, int y, int z, bool occupied); - static Pos *findStandUpPosition(Level *level, int x, int y, int z, int skipCount); + static Pos *findStandUpPosition(Level *level, int x, int y, int z, int skipCount); - virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); - virtual int getPistonPushReaction(); + virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); + virtual int getPistonPushReaction(); virtual int cloneTileId(Level *level, int x, int y, int z); + virtual void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player); }; diff --git a/Minecraft.World/Behavior.h b/Minecraft.World/Behavior.h new file mode 100644 index 00000000..12db0e0b --- /dev/null +++ b/Minecraft.World/Behavior.h @@ -0,0 +1,5 @@ +#pragma once + +class Behavior +{ +}; \ No newline at end of file diff --git a/Minecraft.World/BehaviorRegistry.cpp b/Minecraft.World/BehaviorRegistry.cpp new file mode 100644 index 00000000..8689f129 --- /dev/null +++ b/Minecraft.World/BehaviorRegistry.cpp @@ -0,0 +1,30 @@ +#include "stdafx.h" + +#include "BehaviorRegistry.h" + +BehaviorRegistry::BehaviorRegistry(DispenseItemBehavior *defaultValue) +{ + defaultBehavior = defaultValue; +} + +BehaviorRegistry::~BehaviorRegistry() +{ + for(AUTO_VAR(it, storage.begin()); it != storage.end(); ++it) + { + delete it->second; + } + + delete defaultBehavior; +} + +DispenseItemBehavior *BehaviorRegistry::get(Item *key) +{ + AUTO_VAR(it, storage.find(key)); + + return (it == storage.end()) ? defaultBehavior : it->second; +} + +void BehaviorRegistry::add(Item *key, DispenseItemBehavior *value) +{ + storage.insert(make_pair(key, value)); +} \ No newline at end of file diff --git a/Minecraft.World/BehaviorRegistry.h b/Minecraft.World/BehaviorRegistry.h new file mode 100644 index 00000000..f882c1c4 --- /dev/null +++ b/Minecraft.World/BehaviorRegistry.h @@ -0,0 +1,17 @@ +#pragma once + +class DispenseItemBehavior; + +class BehaviorRegistry +{ +private: + unordered_map storage; + DispenseItemBehavior *defaultBehavior; + +public: + BehaviorRegistry(DispenseItemBehavior *defaultValue); + ~BehaviorRegistry(); + + DispenseItemBehavior *get(Item *key); + void add(Item *key, DispenseItemBehavior *value); +}; \ No newline at end of file diff --git a/Minecraft.World/Biome.cpp b/Minecraft.World/Biome.cpp index d2f4cd1c..169db77e 100644 --- a/Minecraft.World/Biome.cpp +++ b/Minecraft.World/Biome.cpp @@ -61,30 +61,30 @@ void Biome::staticCtor() Biome::hell = (new HellBiome(8))->setColor(0xff0000)->setName(L"Hell")->setNoRain()->setTemperatureAndDownfall(2, 0)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Hell, eMinecraftColour_Foliage_Hell, eMinecraftColour_Water_Hell,eMinecraftColour_Sky_Hell); Biome::sky = (new TheEndBiome(9))->setColor(0x8080ff)->setName(L"Sky")->setNoRain()->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Sky, eMinecraftColour_Foliage_Sky, eMinecraftColour_Water_Sky,eMinecraftColour_Sky_Sky); - + Biome::frozenOcean = (new OceanBiome(10))->setColor(0x9090a0)->setName(L"FrozenOcean")->setSnowCovered()->setDepthAndScale(-1, 0.5f)->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_FrozenOcean, eMinecraftColour_Foliage_FrozenOcean, eMinecraftColour_Water_FrozenOcean,eMinecraftColour_Sky_FrozenOcean); Biome::frozenRiver = (new RiverBiome(11))->setColor(0xa0a0ff)->setName(L"FrozenRiver")->setSnowCovered()->setDepthAndScale(-0.5f, 0)->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_FrozenRiver, eMinecraftColour_Foliage_FrozenRiver, eMinecraftColour_Water_FrozenRiver,eMinecraftColour_Sky_FrozenRiver); Biome::iceFlats = (new IceBiome(12))->setColor(0xffffff)->setName(L"Ice Plains")->setSnowCovered()->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_IcePlains, eMinecraftColour_Foliage_IcePlains, eMinecraftColour_Water_IcePlains,eMinecraftColour_Sky_IcePlains); Biome::iceMountains = (new IceBiome(13))->setColor(0xa0a0a0)->setName(L"Ice Mountains")->setSnowCovered()->setDepthAndScale(0.3f, 1.3f)->setTemperatureAndDownfall(0, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_IceMountains, eMinecraftColour_Foliage_IceMountains, eMinecraftColour_Water_IceMountains,eMinecraftColour_Sky_IceMountains); - + Biome::mushroomIsland = (new MushroomIslandBiome(14))->setColor(0xff00ff)->setName(L"MushroomIsland")->setTemperatureAndDownfall(0.9f, 1.0f)->setDepthAndScale(0.2f, 1.0f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_MushroomIsland, eMinecraftColour_Foliage_MushroomIsland, eMinecraftColour_Water_MushroomIsland,eMinecraftColour_Sky_MushroomIsland); Biome::mushroomIslandShore = (new MushroomIslandBiome(15))->setColor(0xa000ff)->setName(L"MushroomIslandShore")->setTemperatureAndDownfall(0.9f, 1.0f)->setDepthAndScale(-1, 0.1f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_MushroomIslandShore, eMinecraftColour_Foliage_MushroomIslandShore, eMinecraftColour_Water_MushroomIslandShore,eMinecraftColour_Sky_MushroomIslandShore); Biome::beaches = (new BeachBiome(16))->setColor(0xfade55)->setName(L"Beach")->setTemperatureAndDownfall(0.8f, 0.4f)->setDepthAndScale(0.0f, 0.1f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Beach, eMinecraftColour_Foliage_Beach, eMinecraftColour_Water_Beach,eMinecraftColour_Sky_Beach); - Biome::desertHills = (new DesertBiome(17))->setColor(0xd25f12)->setName(L"DesertHills")->setNoRain()->setTemperatureAndDownfall(2, 0)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_DesertHills, eMinecraftColour_Foliage_DesertHills, eMinecraftColour_Water_DesertHills,eMinecraftColour_Sky_DesertHills); - Biome::forestHills = (new ForestBiome(18))->setColor(0x22551c)->setName(L"ForestHills")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.7f, 0.8f)->setDepthAndScale(0.3f, 0.7f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ForestHills, eMinecraftColour_Foliage_ForestHills, eMinecraftColour_Water_ForestHills,eMinecraftColour_Sky_ForestHills); - Biome::taigaHills = (new TaigaBiome(19))->setColor(0x163933)->setName(L"TaigaHills")->setSnowCovered()->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.05f, 0.8f)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_TaigaHills, eMinecraftColour_Foliage_TaigaHills, eMinecraftColour_Water_TaigaHills,eMinecraftColour_Sky_TaigaHills); - Biome::smallerExtremeHills = (new ExtremeHillsBiome(20))->setColor(0x72789a)->setName(L"Extreme Hills Edge")->setDepthAndScale(0.2f, 0.8f)->setTemperatureAndDownfall(0.2f, 0.3f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ExtremeHillsEdge, eMinecraftColour_Foliage_ExtremeHillsEdge, eMinecraftColour_Water_ExtremeHillsEdge,eMinecraftColour_Sky_ExtremeHillsEdge); + Biome::desertHills = (new DesertBiome(17))->setColor(0xd25f12)->setName(L"DesertHills")->setNoRain()->setTemperatureAndDownfall(2, 0)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_DesertHills, eMinecraftColour_Foliage_DesertHills, eMinecraftColour_Water_DesertHills,eMinecraftColour_Sky_DesertHills); + Biome::forestHills = (new ForestBiome(18))->setColor(0x22551c)->setName(L"ForestHills")->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.7f, 0.8f)->setDepthAndScale(0.3f, 0.7f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ForestHills, eMinecraftColour_Foliage_ForestHills, eMinecraftColour_Water_ForestHills,eMinecraftColour_Sky_ForestHills); + Biome::taigaHills = (new TaigaBiome(19))->setColor(0x163933)->setName(L"TaigaHills")->setSnowCovered()->setLeafColor(0x4EBA31)->setTemperatureAndDownfall(0.05f, 0.8f)->setDepthAndScale(0.3f, 0.8f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_TaigaHills, eMinecraftColour_Foliage_TaigaHills, eMinecraftColour_Water_TaigaHills,eMinecraftColour_Sky_TaigaHills); + Biome::smallerExtremeHills = (new ExtremeHillsBiome(20))->setColor(0x72789a)->setName(L"Extreme Hills Edge")->setDepthAndScale(0.2f, 0.8f)->setTemperatureAndDownfall(0.2f, 0.3f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_ExtremeHillsEdge, eMinecraftColour_Foliage_ExtremeHillsEdge, eMinecraftColour_Water_ExtremeHillsEdge,eMinecraftColour_Sky_ExtremeHillsEdge); Biome::jungle = (new JungleBiome(21))->setColor(0x537b09)->setName(L"Jungle")->setLeafColor(0x537b09)->setTemperatureAndDownfall(1.2f, 0.9f)->setDepthAndScale(0.2f, 0.4f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_Jungle, eMinecraftColour_Foliage_Jungle, eMinecraftColour_Water_Jungle,eMinecraftColour_Sky_Jungle); Biome::jungleHills = (new JungleBiome(22))->setColor(0x2c4205)->setName(L"JungleHills")->setLeafColor(0x537b09)->setTemperatureAndDownfall(1.2f, 0.9f)->setDepthAndScale(1.8f, 0.5f)->setLeafFoliageWaterSkyColor(eMinecraftColour_Grass_JungleHills, eMinecraftColour_Foliage_JungleHills, eMinecraftColour_Water_JungleHills,eMinecraftColour_Sky_JungleHills); } - + Biome::Biome(int id) : id(id) { // 4J Stu Default inits color = 0; -// snowCovered = false; // 4J - this isn't set by the java game any more so removing to save confusion + // snowCovered = false; // 4J - this isn't set by the java game any more so removing to save confusion topMaterial = (byte) Tile::grass_Id; material = (byte) Tile::dirt_Id; @@ -103,9 +103,9 @@ Biome::Biome(int id) : id(id) /* 4J - removing these so that we can consistently return newly created trees via getTreeFeature, and let the calling function be resposible for deleting the returned tree normalTree = new TreeFeature(); - fancyTree = new BasicTree(); - birchTree = new BirchFeature(); - swampTree = new SwampTreeFeature(); + fancyTree = new BasicTree(); + birchTree = new BirchFeature(); + swampTree = new SwampTreeFeature(); */ biomes[id] = this; @@ -126,6 +126,8 @@ Biome::Biome(int id) : id(id) // wolves are added to forests and taigas waterFriendlies.push_back(new MobSpawnerData(eTYPE_SQUID, 10, 4, 4)); + + ambientFriendlies.push_back(new MobSpawnerData(eTYPE_BAT, 10, 8, 8)); } Biome::~Biome() @@ -150,7 +152,7 @@ Biome *Biome::setLeafFoliageWaterSkyColor(eMinecraftColour grassColor, eMinecraf Biome *Biome::setTemperatureAndDownfall(float temp, float downfall) { - this->temperature = temp; + temperature = temp; this->downfall = downfall; return this; } @@ -164,17 +166,17 @@ Biome *Biome::setDepthAndScale(float depth, float scale) Biome *Biome::setNoRain() { - _hasRain = false; - return this; + _hasRain = false; + return this; } Feature *Biome::getTreeFeature(Random *random) { - if (random->nextInt(10) == 0) + if (random->nextInt(10) == 0) { - return new BasicTree(false); // 4J used to return member fancyTree, now returning newly created object so that caller can be consistently resposible for cleanup - } - return new TreeFeature(false); // 4J used to return member normalTree, now returning newly created object so that caller can be consistently resposible for cleanup + return new BasicTree(false); // 4J used to return member fancyTree, now returning newly created object so that caller can be consistently resposible for cleanup + } + return new TreeFeature(false); // 4J used to return member normalTree, now returning newly created object so that caller can be consistently resposible for cleanup } Feature *Biome::getGrassFeature(Random *random) @@ -184,48 +186,49 @@ Feature *Biome::getGrassFeature(Random *random) Biome *Biome::setSnowCovered() { - this->snowCovered = true; - return this; + snowCovered = true; + return this; } Biome *Biome::setName(const wstring &name) { - this->m_name = name; - return this; + this->m_name = name; + return this; } Biome *Biome::setLeafColor(int leafColor) { - this->leafColor = leafColor; - return this; + this->leafColor = leafColor; + return this; } Biome *Biome::setColor(int color) { - this->color = color; - return this; + this->color = color; + return this; } int Biome::getSkyColor(float temp) { - //temp /= 3.0f; - //if (temp < -1) temp = -1; - //if (temp > 1) temp = 1; - //return Color::getHSBColor(224 / 360.0f - temp * 0.05f, 0.50f + temp * 0.1f, 1.0f).getRGB(); - + //temp /= 3.0f; + //if (temp < -1) temp = -1; + //if (temp > 1) temp = 1; + //return Color::getHSBColor(224 / 360.0f - temp * 0.05f, 0.50f + temp * 0.1f, 1.0f).getRGB(); + // 4J Stu - Load colour from texture pack return Minecraft::GetInstance()->getColourTable()->getColor( m_skyColor ); } vector *Biome::getMobs(MobCategory *category) { - if (category == MobCategory::monster) return &enemies; - if (category == MobCategory::creature) return &friendlies; - if (category == MobCategory::waterCreature) return &waterFriendlies; + if (category == MobCategory::monster) return &enemies; + if (category == MobCategory::creature) return &friendlies; + if (category == MobCategory::waterCreature) return &waterFriendlies; if (category == MobCategory::creature_chicken) return &friendlies_chicken; if (category == MobCategory::creature_wolf) return &friendlies_wolf; if (category == MobCategory::creature_mushroomcow) return &friendlies_mushroomcow; - return NULL; + if (category == MobCategory::ambient) return &ambientFriendlies; + return NULL; } bool Biome::hasSnow() @@ -235,15 +238,15 @@ bool Biome::hasSnow() if( getTemperature() >= 0.15f ) return false; - return true; + return true; } bool Biome::hasRain() { // 4J - snowCovered flag removed as it wasn't being set by the game anymore, replaced by call to hasSnow() if( hasSnow() ) return false; -// if (snowCovered) return false; - return _hasRain; + // if (snowCovered) return false; + return _hasRain; } bool Biome::isHumid() @@ -256,8 +259,8 @@ float Biome::getCreatureProbability() return 0.1f; } - int Biome::getDownfallInt() - { +int Biome::getDownfallInt() +{ return (int) (downfall * 65536); } @@ -285,19 +288,19 @@ void Biome::decorate(Level *level, Random *random, int xo, int zo) int Biome::getGrassColor() { - //double temp = Mth::clamp(getTemperature(), 0.0f, 1.0f); - //double rain = Mth::clamp(getDownfall(), 0.0f, 1.0f); + //double temp = Mth::clamp(getTemperature(), 0.0f, 1.0f); + //double rain = Mth::clamp(getDownfall(), 0.0f, 1.0f); - //return GrassColor::get(temp, rain); + //return GrassColor::get(temp, rain); return Minecraft::GetInstance()->getColourTable()->getColor( m_grassColor ); } int Biome::getFolageColor() { - //double temp = Mth::clamp(getTemperature(), 0.0f, 1.0f); - //double rain = Mth::clamp(getDownfall(), 0.0f, 1.0f); + //double temp = Mth::clamp(getTemperature(), 0.0f, 1.0f); + //double rain = Mth::clamp(getDownfall(), 0.0f, 1.0f); - //return FoliageColor::get(temp, rain); + //return FoliageColor::get(temp, rain); return Minecraft::GetInstance()->getColourTable()->getColor( m_foliageColor ); } diff --git a/Minecraft.World/Biome.h b/Minecraft.World/Biome.h index 1026bae6..f7de3166 100644 --- a/Minecraft.World/Biome.h +++ b/Minecraft.World/Biome.h @@ -51,54 +51,55 @@ public: public: wstring m_name; - int color; - byte topMaterial; - byte material; - int leafColor; - float depth; - float scale; - float temperature; - float downfall; + int color; + byte topMaterial; + byte material; + int leafColor; + float depth; + float scale; + float temperature; + float downfall; //int waterColor; // 4J Stu removed - BiomeDecorator *decorator; + BiomeDecorator *decorator; const int id; - class MobSpawnerData : public WeighedRandomItem + class MobSpawnerData : public WeighedRandomItem { public: eINSTANCEOF mobClass; int minCount; int maxCount; - MobSpawnerData(eINSTANCEOF mobClass, int probabilityWeight, int minCount, int maxCount) : WeighedRandomItem(probabilityWeight) + MobSpawnerData(eINSTANCEOF mobClass, int probabilityWeight, int minCount, int maxCount) : WeighedRandomItem(probabilityWeight) { this->mobClass = mobClass; this->minCount = minCount; this->maxCount = maxCount; - } - }; + } + }; protected: - vector enemies; - vector friendlies; - vector waterFriendlies; + vector enemies; + vector friendlies; + vector waterFriendlies; vector friendlies_chicken; vector friendlies_wolf; vector friendlies_mushroomcow; - + vector ambientFriendlies; + Biome(int id); ~Biome(); - + BiomeDecorator *createDecorator(); private: Biome *setTemperatureAndDownfall(float temp, float downfall); - Biome *setDepthAndScale(float depth, float scale); + Biome *setDepthAndScale(float depth, float scale); bool snowCovered; - bool _hasRain; + bool _hasRain; // 4J Added eMinecraftColour m_grassColor; @@ -106,47 +107,47 @@ private: eMinecraftColour m_waterColor; eMinecraftColour m_skyColor; - Biome *setNoRain(); + Biome *setNoRain(); protected: /* removing these so that we can consistently return newly created trees via getTreeFeature, and let the calling function be resposible for deleting the returned tree TreeFeature *normalTree; - BasicTree *fancyTree; - BirchFeature *birchTree; - SwampTreeFeature *swampTree; + BasicTree *fancyTree; + BirchFeature *birchTree; + SwampTreeFeature *swampTree; */ public: - virtual Feature *getTreeFeature(Random *random); + virtual Feature *getTreeFeature(Random *random); virtual Feature *getGrassFeature(Random *random); protected: Biome *setSnowCovered(); - Biome *setName(const wstring &name); - Biome *setLeafColor(int leafColor); - Biome *setColor(int color); + Biome *setName(const wstring &name); + Biome *setLeafColor(int leafColor); + Biome *setColor(int color); // 4J Added Biome *setLeafFoliageWaterSkyColor(eMinecraftColour grassColor, eMinecraftColour foliageColor, eMinecraftColour waterColour, eMinecraftColour skyColour); public: - virtual int getSkyColor(float temp); + virtual int getSkyColor(float temp); - vector *getMobs(MobCategory *category); + vector *getMobs(MobCategory *category); - virtual bool hasSnow(); - virtual bool hasRain(); + virtual bool hasSnow(); + virtual bool hasRain(); virtual bool isHumid(); - virtual float getCreatureProbability(); - virtual int getDownfallInt(); - virtual int getTemperatureInt(); + virtual float getCreatureProbability(); + virtual int getDownfallInt(); + virtual int getTemperatureInt(); virtual float getDownfall(); // 4J - brought forward from 1.2.3 virtual float getTemperature(); // 4J - brought forward from 1.2.3 - virtual void decorate(Level *level, Random *random, int xo, int zo); + virtual void decorate(Level *level, Random *random, int xo, int zo); - virtual int getGrassColor(); - virtual int getFolageColor(); + virtual int getGrassColor(); + virtual int getFolageColor(); virtual int getWaterColor(); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/BiomeDecorator.cpp b/Minecraft.World/BiomeDecorator.cpp index 6ca7386c..a3cbf546 100644 --- a/Minecraft.World/BiomeDecorator.cpp +++ b/Minecraft.World/BiomeDecorator.cpp @@ -55,8 +55,8 @@ void BiomeDecorator::_init() lapisOreFeature = new OreFeature(Tile::lapisOre_Id, 6); yellowFlowerFeature = new FlowerFeature(Tile::flower_Id); roseFlowerFeature = new FlowerFeature(Tile::rose_Id); - brownMushroomFeature = new FlowerFeature(Tile::mushroom1_Id); - redMushroomFeature = new FlowerFeature(Tile::mushroom2_Id); + brownMushroomFeature = new FlowerFeature(Tile::mushroom_brown_Id); + redMushroomFeature = new FlowerFeature(Tile::mushroom_red_Id); hugeMushroomFeature = new HugeMushroomFeature(); reedsFeature = new ReedsFeature(); cactusFeature = new CactusFeature(); @@ -123,12 +123,12 @@ void BiomeDecorator::decorate() PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Decorate mushrooms/flowers/grass"); - for (int i = 0; i < hugeMushrooms; i++) + for (int i = 0; i < hugeMushrooms; i++) { - int x = xo + random->nextInt(16) + 8; - int z = zo + random->nextInt(16) + 8; - hugeMushroomFeature->place(level, random, x, level->getHeightmap(x, z), z); - } + int x = xo + random->nextInt(16) + 8; + int z = zo + random->nextInt(16) + 8; + hugeMushroomFeature->place(level, random, x, level->getHeightmap(x, z), z); + } for (int i = 0; i < flowerCount; i++) { @@ -176,15 +176,15 @@ void BiomeDecorator::decorate() } if(deadBushFeature != NULL)delete deadBushFeature; - for (int i = 0; i < waterlilyCount; i++) + for (int i = 0; i < waterlilyCount; i++) { - int x = xo + random->nextInt(16) + 8; - int z = zo + random->nextInt(16) + 8; - int y = random->nextInt(Level::genDepth); - while (y > 0 && level->getTile(x, y - 1, z) == 0) - y--; - waterlilyFeature->place(level, random, x, y, z); - } + int x = xo + random->nextInt(16) + 8; + int z = zo + random->nextInt(16) + 8; + int y = random->nextInt(Level::genDepth); + while (y > 0 && level->getTile(x, y - 1, z) == 0) + y--; + waterlilyFeature->place(level, random, x, y, z); + } for (int i = 0; i < mushroomCount; i++) { diff --git a/Minecraft.World/BiomeSource.cpp b/Minecraft.World/BiomeSource.cpp index b16efd31..8e2a5680 100644 --- a/Minecraft.World/BiomeSource.cpp +++ b/Minecraft.World/BiomeSource.cpp @@ -11,9 +11,9 @@ // 4J - removal of separate temperature & downfall layers brought forward from 1.2.3 void BiomeSource::_init() { - layer = nullptr; + layer = nullptr; zoomedLayer = nullptr; - + cache = new BiomeCache(this); playerSpawnBiomes.push_back(Biome::forest); @@ -39,7 +39,7 @@ void BiomeSource::_init(__int64 seed, LevelType *generator) BiomeSource::BiomeSource() { - _init(); + _init(); } // 4J added @@ -105,7 +105,7 @@ void BiomeSource::getDownfallBlock(floatArray &downfalls, int x, int z, int w, i BiomeCache::Block *BiomeSource::getBlockAt(int x, int y) { - return cache->getBlockAt(x, y); + return cache->getBlockAt(x, y); } float BiomeSource::getTemperature(int x, int y, int z) const @@ -277,6 +277,7 @@ void BiomeSource::getBiomeIndexBlock(byteArray& biomeIndices, int x, int z, int */ bool BiomeSource::containsOnly(int x, int z, int r, vector allowed) { + IntCache::releaseAll(); int x0 = ((x - r) >> 2); int z0 = ((z - r) >> 2); int x1 = ((x + r) >> 2); @@ -304,11 +305,12 @@ bool BiomeSource::containsOnly(int x, int z, int r, vector allowed) */ bool BiomeSource::containsOnly(int x, int z, int r, Biome *allowed) { + IntCache::releaseAll(); int x0 = ((x - r) >> 2); int z0 = ((z - r) >> 2); int x1 = ((x + r) >> 2); int z1 = ((z + r) >> 2); - + int w = x1 - x0; int h = z1 - z0; int biomesCount = w*h; @@ -330,6 +332,7 @@ bool BiomeSource::containsOnly(int x, int z, int r, Biome *allowed) */ TilePos *BiomeSource::findBiome(int x, int z, int r, Biome *toFind, Random *random) { + IntCache::releaseAll(); int x0 = ((x - r) >> 2); int z0 = ((z - r) >> 2); int x1 = ((x + r) >> 2); @@ -367,6 +370,7 @@ TilePos *BiomeSource::findBiome(int x, int z, int r, Biome *toFind, Random *rand */ TilePos *BiomeSource::findBiome(int x, int z, int r, vector allowed, Random *random) { + IntCache::releaseAll(); int x0 = ((x - r) >> 2); int z0 = ((z - r) >> 2); int x1 = ((x + r) >> 2); @@ -378,8 +382,7 @@ TilePos *BiomeSource::findBiome(int x, int z, int r, vector allowed, Ra intArray biomes = layer->getArea(x0, z0, w, h); TilePos *res = NULL; int found = 0; - int biomesCount = w*h; - for (unsigned int i = 0; i < biomesCount; i++) + for (unsigned int i = 0; i < w * h; i++) { int xx = (x0 + i % w) << 2; int zz = (z0 + i / w) << 2; @@ -420,7 +423,7 @@ __int64 BiomeSource::findSeed(LevelType *generator) mcprogress->progressStage(IDS_PROGRESS_NEW_WORLD_SEED); #ifndef _CONTENT_PACKAGE - if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<nextInt(3) + 5; + int treeHeight = random->nextInt(3) + 5; - bool free = true; - if (y < 1 || y + treeHeight + 1 > Level::maxBuildHeight) return false; + bool free = true; + if (y < 1 || y + treeHeight + 1 > Level::maxBuildHeight) return false; - for (int yy = y; yy <= y + 1 + treeHeight; yy++) + for (int yy = y; yy <= y + 1 + treeHeight; yy++) { - int r = 1; - if (yy == y) r = 0; - if (yy >= y + 1 + treeHeight - 2) r = 2; - for (int xx = x - r; xx <= x + r && free; xx++) + int r = 1; + if (yy == y) r = 0; + if (yy >= y + 1 + treeHeight - 2) r = 2; + for (int xx = x - r; xx <= x + r && free; xx++) { - for (int zz = z - r; zz <= z + r && free; zz++) + for (int zz = z - r; zz <= z + r && free; zz++) { - if (yy >= 0 && yy < Level::maxBuildHeight) + if (yy >= 0 && yy < Level::maxBuildHeight) { - int tt = level->getTile(xx, yy, zz); - if (tt != 0 && tt != Tile::leaves_Id) free = false; - } + int tt = level->getTile(xx, yy, zz); + if (tt != 0 && tt != Tile::leaves_Id) free = false; + } else { - free = false; - } - } - } - } + free = false; + } + } + } + } - if (!free) return false; + if (!free) return false; - int belowTile = level->getTile(x, y - 1, z); - if ((belowTile != Tile::grass_Id && belowTile != Tile::dirt_Id) || y >= Level::maxBuildHeight - treeHeight - 1) return false; + int belowTile = level->getTile(x, y - 1, z); + if ((belowTile != Tile::grass_Id && belowTile != Tile::dirt_Id) || y >= Level::maxBuildHeight - treeHeight - 1) return false; // 4J Stu Added to stop tree features generating areas previously place by game rule generation if(app.getLevelGenerationOptions() != NULL) @@ -54,28 +54,29 @@ bool BirchFeature::place(Level *level, Random *random, int x, int y, int z) } } - level->setTileNoUpdate(x, y - 1, z, Tile::dirt_Id); + placeBlock(level, x, y - 1, z, Tile::dirt_Id); - for (int yy = y - 3 + treeHeight; yy <= y + treeHeight; yy++) + for (int yy = y - 3 + treeHeight; yy <= y + treeHeight; yy++) { - int yo = yy - (y + treeHeight); - int offs = 1 - yo / 2; - for (int xx = x - offs; xx <= x + offs; xx++) + int yo = yy - (y + treeHeight); + int offs = 1 - yo / 2; + for (int xx = x - offs; xx <= x + offs; xx++) { - int xo = xx - (x); - for (int zz = z - offs; zz <= z + offs; zz++) + int xo = xx - (x); + for (int zz = z - offs; zz <= z + offs; zz++) { - int zo = zz - (z); - if (abs(xo) == offs && abs(zo) == offs && (random->nextInt(2) == 0 || yo == 0)) continue; - if (!Tile::solid[level->getTile(xx, yy, zz)]) placeBlock(level, xx, yy, zz, Tile::leaves_Id, LeafTile::BIRCH_LEAF); - } - } - } - for (int hh = 0; hh < treeHeight; hh++) + int zo = zz - (z); + if (abs(xo) == offs && abs(zo) == offs && (random->nextInt(2) == 0 || yo == 0)) continue; + int t = level->getTile(xx, yy, zz); + if (t == 0 || t == Tile::leaves_Id) placeBlock(level, xx, yy, zz, Tile::leaves_Id, LeafTile::BIRCH_LEAF); + } + } + } + for (int hh = 0; hh < treeHeight; hh++) { - int t = level->getTile(x, y + hh, z); - if (t == 0 || t == Tile::leaves_Id) placeBlock(level, x, y + hh, z, Tile::treeTrunk_Id, TreeTile::BIRCH_TRUNK); - } - return true; + int t = level->getTile(x, y + hh, z); + if (t == 0 || t == Tile::leaves_Id) placeBlock(level, x, y + hh, z, Tile::treeTrunk_Id, TreeTile::BIRCH_TRUNK); + } + return true; } \ No newline at end of file diff --git a/Minecraft.World/Blaze.cpp b/Minecraft.World/Blaze.cpp index 57726363..d87a83b2 100644 --- a/Minecraft.World/Blaze.cpp +++ b/Minecraft.World/Blaze.cpp @@ -5,6 +5,8 @@ #include "net.minecraft.world.phys.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.projectile.h" #include "SharedConstants.h" #include "..\Minecraft.Client\Textures.h" @@ -18,16 +20,11 @@ Blaze::Blaze(Level *level) : Monster(level) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_BLAZE; // 4J Was "/mob/fire.png"; + registerAttributes(); + setHealth(getMaxHealth()); fireImmune = true; - attackDamage = 6; xpReward = XP_REWARD_LARGE; - // this.setSize(1.2f, 1.8f); // 4J Default inits allowedHeightOffset = 0.5f; @@ -35,9 +32,10 @@ Blaze::Blaze(Level *level) : Monster(level) attackCounter = 0; } -int Blaze::getMaxHealth() +void Blaze::registerAttributes() { - return 20; + Monster::registerAttributes(); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(6); } void Blaze::defineSynchedData() @@ -89,7 +87,7 @@ void Blaze::aiStep() allowedHeightOffset = .5f + (float) random->nextGaussian() * 3; } - if (getAttackTarget() != NULL && (getAttackTarget()->y + getAttackTarget()->getHeadHeight()) > (this->y + getHeadHeight() + allowedHeightOffset)) + if (getAttackTarget() != NULL && (getAttackTarget()->y + getAttackTarget()->getHeadHeight()) > (y + getHeadHeight() + allowedHeightOffset)) { yd = yd + (.3f - yd) * .3f; } diff --git a/Minecraft.World/Blaze.h b/Minecraft.World/Blaze.h index 4f60a4a4..7242e9c3 100644 --- a/Minecraft.World/Blaze.h +++ b/Minecraft.World/Blaze.h @@ -18,9 +18,9 @@ private: public: Blaze(Level *level); - virtual int getMaxHealth(); protected: + virtual void registerAttributes(); virtual void defineSynchedData(); virtual int getAmbientSound(); virtual int getHurtSound(); diff --git a/Minecraft.World/BlockRegionUpdatePacket.cpp b/Minecraft.World/BlockRegionUpdatePacket.cpp index d85321a5..bec943d8 100644 --- a/Minecraft.World/BlockRegionUpdatePacket.cpp +++ b/Minecraft.World/BlockRegionUpdatePacket.cpp @@ -11,6 +11,8 @@ #include "Dimension.h" +#define BLOCK_REGION_UPDATE_FULLCHUNK 0x01 +#define BLOCK_REGION_UPDATE_ZEROHEIGHT 0x02 // added so we can still send a byte for ys, which really needs the range 0-256 BlockRegionUpdatePacket::~BlockRegionUpdatePacket() { @@ -82,10 +84,10 @@ BlockRegionUpdatePacket::BlockRegionUpdatePacket(int x, int y, int z, int xs, in size = inputSize; } } - + void BlockRegionUpdatePacket::read(DataInputStream *dis) //throws IOException { - bIsFullChunk = dis->readBoolean(); + byte chunkFlags = dis->readByte(); x = dis->readInt(); y = dis->readShort(); z = dis->readInt(); @@ -93,6 +95,10 @@ void BlockRegionUpdatePacket::read(DataInputStream *dis) //throws IOException ys = dis->read() + 1; zs = dis->read() + 1; + bIsFullChunk = (chunkFlags & BLOCK_REGION_UPDATE_FULLCHUNK) ? true : false; + if(chunkFlags & BLOCK_REGION_UPDATE_ZEROHEIGHT) + ys = 0; + size = dis->readInt(); levelIdx = ( size >> 30 ) & 3; size &= 0x3fffffff; @@ -131,7 +137,11 @@ void BlockRegionUpdatePacket::read(DataInputStream *dis) //throws IOException void BlockRegionUpdatePacket::write(DataOutputStream *dos) // throws IOException { - dos->writeBoolean(bIsFullChunk); + byte chunkFlags = 0; + if(bIsFullChunk) chunkFlags |= BLOCK_REGION_UPDATE_FULLCHUNK; + if(ys == 0) chunkFlags |= BLOCK_REGION_UPDATE_ZEROHEIGHT; + + dos->writeByte(chunkFlags); dos->writeInt(x); dos->writeShort(y); dos->writeInt(z); diff --git a/Minecraft.World/BlockSource.h b/Minecraft.World/BlockSource.h new file mode 100644 index 00000000..ec5d5ce8 --- /dev/null +++ b/Minecraft.World/BlockSource.h @@ -0,0 +1,36 @@ +#pragma once + +#include "LocatableSource.h" + +class Tile; +class Material; +class TileEntity; + +class BlockSource : public LocatableSource +{ +public: + /** + * @return The X coordinate for the middle of the block + */ + virtual double getX() = 0; + + /** + * @return The Y coordinate for the middle of the block + */ + virtual double getY() = 0; + + /** + * @return The Z coordinate for the middle of the block + */ + virtual double getZ() = 0; + + virtual int getBlockX() = 0; + virtual int getBlockY() = 0; + virtual int getBlockZ() = 0; + + virtual Tile *getType() = 0; + virtual int getData() = 0; + virtual Material *getMaterial() = 0; + + virtual shared_ptr getEntity() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/BlockSourceImpl.cpp b/Minecraft.World/BlockSourceImpl.cpp new file mode 100644 index 00000000..d5a3c79b --- /dev/null +++ b/Minecraft.World/BlockSourceImpl.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "BlockSourceImpl.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" + +BlockSourceImpl::BlockSourceImpl(Level *world, int x, int y, int z) +{ + this->world = world; + this->x = x; + this->y = y; + this->z = z; +} + +Level *BlockSourceImpl::getWorld() +{ + return world; +} + +double BlockSourceImpl::getX() +{ + return x + 0.5; +} + +double BlockSourceImpl::getY() +{ + return y + 0.5; +} + +double BlockSourceImpl::getZ() +{ + return z + 0.5; +} + +int BlockSourceImpl::getBlockX() +{ + return x; +} + +int BlockSourceImpl::getBlockY() +{ + return y; +} + +int BlockSourceImpl::getBlockZ() +{ + return z; +} + +Tile *BlockSourceImpl::getType() +{ + return Tile::tiles[world->getTile(x, y, z)]; +} + +int BlockSourceImpl::getData() +{ + return world->getData(x, y, z); +} + +Material *BlockSourceImpl::getMaterial() +{ + return world->getMaterial(x, y, z); +} + +shared_ptr BlockSourceImpl::getEntity() +{ + return world->getTileEntity(x, y, z); +} \ No newline at end of file diff --git a/Minecraft.World/BlockSourceImpl.h b/Minecraft.World/BlockSourceImpl.h new file mode 100644 index 00000000..69decbaa --- /dev/null +++ b/Minecraft.World/BlockSourceImpl.h @@ -0,0 +1,29 @@ +#pragma once + +#include "BlockSource.h" + +class Level; + +class BlockSourceImpl : public BlockSource +{ +private: + Level *world; + int x; + int y; + int z; + +public: + BlockSourceImpl(Level *world, int x, int y, int z); + + Level *getWorld(); + double getX(); + double getY(); + double getZ(); + int getBlockX(); + int getBlockY(); + int getBlockZ(); + Tile *getType(); + int getData(); + Material *getMaterial(); + shared_ptr getEntity(); +}; \ No newline at end of file diff --git a/Minecraft.World/Boat.cpp b/Minecraft.World/Boat.cpp index 39211e44..c0c6a2cf 100644 --- a/Minecraft.World/Boat.cpp +++ b/Minecraft.World/Boat.cpp @@ -52,7 +52,7 @@ void Boat::defineSynchedData() { entityData->define(DATA_ID_HURT, 0); entityData->define(DATA_ID_HURTDIR, 1); - entityData->define(DATA_ID_DAMAGE, 0); + entityData->define(DATA_ID_DAMAGE, 0.0f); } @@ -90,8 +90,9 @@ double Boat::getRideHeight() return bbHeight * 0.0f - 0.3f; } -bool Boat::hurt(DamageSource *source, int hurtDamage) +bool Boat::hurt(DamageSource *source, float hurtDamage) { + if (isInvulnerable()) return false; if (level->isClientSide || removed) return true; // 4J-JEV: Fix for #88212, @@ -100,9 +101,10 @@ bool Boat::hurt(DamageSource *source, int hurtDamage) { shared_ptr attacker = source->getDirectEntity(); - if (dynamic_pointer_cast(attacker) != NULL && - !dynamic_pointer_cast(attacker)->isAllowedToHurtEntity( shared_from_this() )) + if ( attacker->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(attacker)->isAllowedToHurtEntity( shared_from_this() )) + { return false; + } } setHurtDir(-getHurtDir()); @@ -117,13 +119,13 @@ bool Boat::hurt(DamageSource *source, int hurtDamage) markHurt(); // 4J Stu - Brought froward from 12w36 to fix #46611 - TU5: Gameplay: Minecarts and boat requires more hits than one to be destroyed in creative mode - shared_ptr player = dynamic_pointer_cast(source->getEntity()); - if (player != NULL && player->abilities.instabuild) setDamage(100); + // 4J-PB - Fix for XB1 #175735 - [CRASH] [Multi-Plat]: Code: Gameplay: Placing a boat on harmful surfaces causes the game to crash + bool creativePlayer = (source->getEntity() != NULL) && source->getEntity()->instanceof(eTYPE_PLAYER) && dynamic_pointer_cast(source->getEntity())->abilities.instabuild; - if (getDamage() > 20 * 2) + if (creativePlayer || getDamage() > 20 * 2) { if (rider.lock() != NULL) rider.lock()->ride( shared_from_this() ); - spawnAtLocation(Item::boat_Id, 1, 0); + if (!creativePlayer) spawnAtLocation(Item::boat_Id, 1, 0); remove(); } return true; @@ -171,9 +173,9 @@ void Boat::lerpTo(double x, double y, double z, float yRot, float xRot, int step lyr = yRot; lxr = xRot; - this->xd = lxd; - this->yd = lyd; - this->zd = lzd; + xd = lxd; + yd = lyd; + zd = lzd; } void Boat::lerpMotion(double xd, double yd, double zd) @@ -247,8 +249,8 @@ void Boat::tick() xRot += (float) ( (lxr - xRot) / lSteps ); lSteps--; - this->setPos(xt, yt, zt); - this->setRot(yRot, xRot); + setPos(xt, yt, zt); + setRot(yRot, xRot); } else { @@ -260,7 +262,7 @@ void Boat::tick() //this->setPos(xt, yt, zt); // 4J Stu - Fix for various boat bugs, ensure that we check collision on client-side movement - this->move(xd,yd,zd); + move(xd,yd,zd); if (onGround) { @@ -317,10 +319,18 @@ void Boat::tick() } - if (rider.lock() != NULL) + if ( rider.lock() != NULL && rider.lock()->instanceof(eTYPE_LIVINGENTITY) ) { - xd += rider.lock()->xd * acceleration; - zd += rider.lock()->zd * acceleration; + shared_ptr livingRider = dynamic_pointer_cast(rider.lock()); + double forward = livingRider->yya; + + if (forward > 0) + { + double riderXd = -sin(livingRider->yRot * PI / 180); + double riderZd = cos(livingRider->yRot * PI / 180); + xd += riderXd * acceleration * 0.05f; + zd += riderZd * acceleration * 0.05f; + } } double curSpeed = sqrt(xd * xd + zd * zd); @@ -355,7 +365,7 @@ void Boat::tick() if ((horizontalCollision && lastSpeed > 0.20)) { - if (!level->isClientSide) + if (!level->isClientSide && !removed) { remove(); for (int i = 0; i < 3; i++) @@ -394,7 +404,7 @@ void Boat::tick() if(level->isClientSide) return; - vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); + vector > *entities = level->getEntities(shared_from_this(), bb->grow(0.2f, 0, 0.2f)); if (entities != NULL && !entities->empty()) { AUTO_VAR(itEnd, entities->end()); @@ -417,16 +427,14 @@ void Boat::tick() { int yy = Mth::floor(y) + j; int tile = level->getTile(xx, yy, zz); - int data = level->getData(xx, yy, zz); if (tile == Tile::topSnow_Id) { - level->setTile(xx, yy, zz, 0); + level->removeTile(xx, yy, zz); } else if (tile == Tile::waterLily_Id) { - Tile::waterLily->spawnResources(level, xx, yy, zz, data, 0.3f, 0); - level->setTile(xx, yy, zz, 0); + level->destroyTile(xx, yy, zz, true); } } @@ -469,7 +477,7 @@ wstring Boat::getName() bool Boat::interact(shared_ptr player) { - if (rider.lock() != NULL && dynamic_pointer_cast(rider.lock())!=NULL && rider.lock() != player) return true; + if ( (rider.lock() != NULL) && rider.lock()->instanceof(eTYPE_PLAYER) && (rider.lock() != player) ) return true; if (!level->isClientSide) { // 4J HEG - Fixed issue with player not being able to dismount boat (issue #4446) @@ -478,14 +486,14 @@ bool Boat::interact(shared_ptr player) return true; } -void Boat::setDamage(int damage) +void Boat::setDamage(float damage) { entityData->set(DATA_ID_DAMAGE, damage); } -int Boat::getDamage() +float Boat::getDamage() { - return entityData->getInteger(DATA_ID_DAMAGE); + return entityData->getFloat(DATA_ID_DAMAGE); } void Boat::setHurtTime(int hurtTime) diff --git a/Minecraft.World/Boat.h b/Minecraft.World/Boat.h index 1039e8f9..7e79ef2d 100644 --- a/Minecraft.World/Boat.h +++ b/Minecraft.World/Boat.h @@ -47,7 +47,7 @@ public: Boat(Level *level, double x, double y, double z); virtual double getRideHeight(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); virtual void animateHurt(); virtual bool isPickable(); @@ -71,8 +71,8 @@ public: wstring getName(); virtual bool interact(shared_ptr player); - virtual void setDamage(int damage); - virtual int getDamage(); + virtual void setDamage(float damage); + virtual float getDamage(); virtual void setHurtTime(int hurtTime); virtual int getHurtTime(); virtual void setHurtDir(int hurtDir); diff --git a/Minecraft.World/BoatItem.cpp b/Minecraft.World/BoatItem.cpp index 3499bc02..d5628f09 100644 --- a/Minecraft.World/BoatItem.cpp +++ b/Minecraft.World/BoatItem.cpp @@ -9,10 +9,10 @@ BoatItem::BoatItem(int id) : Item( id ) { - this->maxStackSize = 1; + maxStackSize = 1; } -bool BoatItem::TestUse(Level *level, shared_ptr player) +bool BoatItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { // 4J-PB - added for tooltips to test use // 4J TODO really we should have the crosshair hitresult telling us if it hit water, and at what distance, so we don't need to do this again @@ -105,22 +105,28 @@ shared_ptr BoatItem::use(shared_ptr itemInstance, Le int yt = hr->y; int zt = hr->z; - if (!level->isClientSide) + if (level->getTile(xt, yt, zt) == Tile::topSnow_Id) yt--; + if( level->countInstanceOf(eTYPE_BOAT, true) < Level::MAX_XBOX_BOATS ) // 4J - added limit { - if (level->getTile(xt, yt, zt) == Tile::topSnow_Id) yt--; - if( level->countInstanceOf(eTYPE_BOAT, true) < Level::MAX_XBOX_BOATS ) // 4J - added limit + shared_ptr boat = shared_ptr( new Boat(level, xt + 0.5f, yt + 1.0f, zt + 0.5f) ); + boat->yRot = ((Mth::floor(player->yRot * 4.0F / 360.0F + 0.5) & 0x3) - 1) * 90; + if (!level->getCubes(boat, boat->bb->grow(-.1, -.1, -.1))->empty()) { - level->addEntity( shared_ptr( new Boat(level, xt + 0.5f, yt + 1.0f, zt + 0.5f) ) ); - if (!player->abilities.instabuild) - { - itemInstance->count--; - } + return itemInstance; } - else + if (!level->isClientSide) { - // display a message to say max boats has been hit - player->displayClientMessage(IDS_MAX_BOATS ); + level->addEntity(boat); } + if (!player->abilities.instabuild) + { + itemInstance->count--; + } + } + else + { + // display a message to say max boats has been hit + player->displayClientMessage(IDS_MAX_BOATS ); } } delete hr; diff --git a/Minecraft.World/BoatItem.h b/Minecraft.World/BoatItem.h index 81bc4e18..dc78e896 100644 --- a/Minecraft.World/BoatItem.h +++ b/Minecraft.World/BoatItem.h @@ -11,7 +11,7 @@ public: BoatItem(int id); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); /* diff --git a/Minecraft.World/BodyControl.cpp b/Minecraft.World/BodyControl.cpp index b74cc4dd..b39ebc45 100644 --- a/Minecraft.World/BodyControl.cpp +++ b/Minecraft.World/BodyControl.cpp @@ -5,7 +5,7 @@ const float BodyControl::maxClampAngle = 75.0f; -BodyControl::BodyControl(Mob *mob) +BodyControl::BodyControl(LivingEntity *mob) { this->mob = mob; diff --git a/Minecraft.World/BodyControl.h b/Minecraft.World/BodyControl.h index 951b2197..410f9ce9 100644 --- a/Minecraft.World/BodyControl.h +++ b/Minecraft.World/BodyControl.h @@ -5,13 +5,13 @@ class BodyControl : public Control { private: - Mob *mob; + LivingEntity *mob; static const float maxClampAngle; int timeStill; float lastHeadY; public: - BodyControl(Mob *mob); + BodyControl(LivingEntity *mob); void clientTick(); diff --git a/Minecraft.World/BonusChestFeature.cpp b/Minecraft.World/BonusChestFeature.cpp index 2d7690ee..6d083f54 100644 --- a/Minecraft.World/BonusChestFeature.cpp +++ b/Minecraft.World/BonusChestFeature.cpp @@ -37,7 +37,7 @@ bool BonusChestFeature::place(Level *level, Random *random, int x, int y, int z, y++; } - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { int x2, y2, z2; @@ -45,7 +45,7 @@ bool BonusChestFeature::place(Level *level, Random *random, int x, int y, int z, { x2 = x; y2 = y - 1; // 4J - the position passed in is actually two above the top solid block, as the calling function adds 1 to getTopSolidBlock, and that actually returns the block above anyway. - // this would explain why there is a while loop above here (not used in force mode) to move the y back down again, shouldn't really be needed if 1 wasn't added to the getTopSolidBlock return value. + // this would explain why there is a while loop above here (not used in force mode) to move the y back down again, shouldn't really be needed if 1 wasn't added to the getTopSolidBlock return value. z2 = z; } else @@ -55,34 +55,34 @@ bool BonusChestFeature::place(Level *level, Random *random, int x, int y, int z, z2 = z + random->nextInt(4) - random->nextInt(4); } - if (force || ( level->isEmptyTile(x2, y2, z2) && level->isTopSolidBlocking(x2, y2 - 1, z2))) + if (force || ( level->isEmptyTile(x2, y2, z2) && level->isTopSolidBlocking(x2, y2 - 1, z2))) { - level->setTile(x2, y2, z2, Tile::chest_Id); - shared_ptr chest = dynamic_pointer_cast(level->getTileEntity(x2, y2, z2)); - if (chest != NULL) + level->setTileAndData(x2, y2, z2, Tile::chest_Id, 0, Tile::UPDATE_CLIENTS); + shared_ptr chest = dynamic_pointer_cast(level->getTileEntity(x2, y2, z2)); + if (chest != NULL) { - WeighedTreasure::addChestItems(random, treasureList, chest, numRolls); + WeighedTreasure::addChestItems(random, treasureList, chest, numRolls); chest->isBonusChest = true; // 4J added - } - if (level->isEmptyTile(x2 - 1, y2, z2) && level->isTopSolidBlocking(x2 - 1, y2 - 1, z2)) + } + if (level->isEmptyTile(x2 - 1, y2, z2) && level->isTopSolidBlocking(x2 - 1, y2 - 1, z2)) { - level->setTile(x2 - 1, y2, z2, Tile::torch_Id); - } - if (level->isEmptyTile(x2 + 1, y2, z2) && level->isTopSolidBlocking(x2 - 1, y2 - 1, z2)) + level->setTileAndData(x2 - 1, y2, z2, Tile::torch_Id, 0, Tile::UPDATE_CLIENTS); + } + if (level->isEmptyTile(x2 + 1, y2, z2) && level->isTopSolidBlocking(x2 - 1, y2 - 1, z2)) { - level->setTile(x2 + 1, y2, z2, Tile::torch_Id); - } - if (level->isEmptyTile(x2, y2, z2 - 1) && level->isTopSolidBlocking(x2 - 1, y2 - 1, z2)) + level->setTileAndData(x2 + 1, y2, z2, Tile::torch_Id, 0, Tile::UPDATE_CLIENTS); + } + if (level->isEmptyTile(x2, y2, z2 - 1) && level->isTopSolidBlocking(x2 - 1, y2 - 1, z2)) { - level->setTile(x2, y2, z2 - 1, Tile::torch_Id); - } - if (level->isEmptyTile(x2, y2, z2 + 1) && level->isTopSolidBlocking(x2 - 1, y2 - 1, z2)) + level->setTileAndData(x2, y2, z2 - 1, Tile::torch_Id, 0, Tile::UPDATE_CLIENTS); + } + if (level->isEmptyTile(x2, y2, z2 + 1) && level->isTopSolidBlocking(x2 - 1, y2 - 1, z2)) { - level->setTile(x2, y2, z2 + 1, Tile::torch_Id); - } - return true; - } - } + level->setTileAndData(x2, y2, z2 + 1, Tile::torch_Id, 0, Tile::UPDATE_CLIENTS); + } + return true; + } + } - return false; + return false; } diff --git a/Minecraft.World/BossMob.h b/Minecraft.World/BossMob.h index 50a6d3ef..bd24c46c 100644 --- a/Minecraft.World/BossMob.h +++ b/Minecraft.World/BossMob.h @@ -1,22 +1,9 @@ #pragma once -#include "Mob.h" - -class Level; -class BossMobPart; - -class BossMob : public Mob +class BossMob { -protected: - int maxHealth; - public: - BossMob(Level *level); - - virtual int getMaxHealth(); - virtual bool hurt(shared_ptr bossMobPart, DamageSource *source, int damage); - virtual bool hurt(DamageSource *source, int damage); - -protected: - virtual bool reallyHurt(DamageSource *source, int damage); + virtual float getMaxHealth() = 0; + virtual float getHealth() = 0; + virtual wstring getAName() = 0; }; \ No newline at end of file diff --git a/Minecraft.World/BottleItem.cpp b/Minecraft.World/BottleItem.cpp index 3aecafee..0f8e3c35 100644 --- a/Minecraft.World/BottleItem.cpp +++ b/Minecraft.World/BottleItem.cpp @@ -31,7 +31,7 @@ shared_ptr BottleItem::use(shared_ptr itemInstance, { return itemInstance; } - if (!player->mayBuild(xt, yt, zt)) + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) { return itemInstance; } @@ -60,7 +60,7 @@ shared_ptr BottleItem::use(shared_ptr itemInstance, } // 4J-PB - added to allow tooltips -bool BottleItem::TestUse(Level *level, shared_ptr player) +bool BottleItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, true); if (hr == NULL) return false; @@ -76,7 +76,7 @@ bool BottleItem::TestUse(Level *level, shared_ptr player) { return false; } - if (!player->mayBuild(xt, yt, zt)) + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) { return false; } diff --git a/Minecraft.World/BottleItem.h b/Minecraft.World/BottleItem.h index a8f5bc09..95423c09 100644 --- a/Minecraft.World/BottleItem.h +++ b/Minecraft.World/BottleItem.h @@ -13,7 +13,7 @@ public: Icon *getIcon(int auxValue); virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/BoundingBox.cpp b/Minecraft.World/BoundingBox.cpp index eb828ed0..24972bf9 100644 --- a/Minecraft.World/BoundingBox.cpp +++ b/Minecraft.World/BoundingBox.cpp @@ -14,6 +14,19 @@ BoundingBox::BoundingBox() z1 = 0; } +BoundingBox::BoundingBox(intArray sourceData) +{ + if (sourceData.length == 6) + { + x0 = sourceData[0]; + y0 = sourceData[1]; + z0 = sourceData[2]; + x1 = sourceData[3]; + y1 = sourceData[4]; + z1 = sourceData[5]; + } +} + BoundingBox *BoundingBox::getUnknownBox() { return new BoundingBox(INT_MAX, INT_MAX, INT_MAX, INT_MIN, INT_MIN, INT_MIN ); @@ -21,56 +34,56 @@ BoundingBox *BoundingBox::getUnknownBox() BoundingBox *BoundingBox::orientBox(int footX, int footY, int footZ, int offX, int offY, int offZ, int width, int height, int depth, int orientation) { - switch (orientation) + switch (orientation) { - default: - return new BoundingBox(footX + offX, footY + offY, footZ + offZ, footX + width - 1 + offX, footY + height - 1 + offY, footZ + depth - 1 + offZ); + default: + return new BoundingBox(footX + offX, footY + offY, footZ + offZ, footX + width - 1 + offX, footY + height - 1 + offY, footZ + depth - 1 + offZ); case Direction::NORTH: - // foot is at x0, y0, z1 - return new BoundingBox(footX + offX, footY + offY, footZ - depth + 1 + offZ, footX + width - 1 + offX, footY + height - 1 + offY, footZ + offZ); + // foot is at x0, y0, z1 + return new BoundingBox(footX + offX, footY + offY, footZ - depth + 1 + offZ, footX + width - 1 + offX, footY + height - 1 + offY, footZ + offZ); case Direction::SOUTH: - // foot is at x0, y0, z0 - return new BoundingBox(footX + offX, footY + offY, footZ + offZ, footX + width - 1 + offX, footY + height - 1 + offY, footZ + depth - 1 + offZ); + // foot is at x0, y0, z0 + return new BoundingBox(footX + offX, footY + offY, footZ + offZ, footX + width - 1 + offX, footY + height - 1 + offY, footZ + depth - 1 + offZ); case Direction::WEST: - // foot is at x1, y0, z0, but width and depth are flipped - return new BoundingBox(footX - depth + 1 + offZ, footY + offY, footZ + offX, footX + offZ, footY + height - 1 + offY, footZ + width - 1 + offX); + // foot is at x1, y0, z0, but width and depth are flipped + return new BoundingBox(footX - depth + 1 + offZ, footY + offY, footZ + offX, footX + offZ, footY + height - 1 + offY, footZ + width - 1 + offX); case Direction::EAST: - // foot is at x0, y0, z0, but width and depth are flipped - return new BoundingBox(footX + offZ, footY + offY, footZ + offX, footX + depth - 1 + offZ, footY + height - 1 + offY, footZ + width - 1 + offX); - } + // foot is at x0, y0, z0, but width and depth are flipped + return new BoundingBox(footX + offZ, footY + offY, footZ + offX, footX + depth - 1 + offZ, footY + height - 1 + offY, footZ + width - 1 + offX); + } } BoundingBox::BoundingBox(BoundingBox *other) { - this->x0 = other->x0; - this->y0 = other->y0; - this->z0 = other->z0; - this->x1 = other->x1; - this->y1 = other->y1; - this->z1 = other->z1; + x0 = other->x0; + y0 = other->y0; + z0 = other->z0; + x1 = other->x1; + y1 = other->y1; + z1 = other->z1; } BoundingBox::BoundingBox(int x0, int y0, int z0, int x1, int y1, int z1) { - this->x0 = x0; - this->y0 = y0; - this->z0 = z0; - this->x1 = x1; - this->y1 = y1; - this->z1 = z1; + this->x0 = x0; + this->y0 = y0; + this->z0 = z0; + this->x1 = x1; + this->y1 = y1; + this->z1 = z1; } BoundingBox::BoundingBox(int x0, int z0, int x1, int z1) { - this->x0 = x0; - this->z0 = z0; - this->x1 = x1; - this->z1 = z1; + this->x0 = x0; + this->z0 = z0; + this->x1 = x1; + this->z1 = z1; // the bounding box for this constructor is limited to world size, // excluding bedrock level - this->y0 = 1; - this->y1 = 512; + y0 = 1; + y1 = 512; } bool BoundingBox::intersects(BoundingBox *other) @@ -90,39 +103,39 @@ bool BoundingBox::intersects(int x0, int z0, int x1, int z1) void BoundingBox::expand(BoundingBox *other) { - this->x0 = Math::_min(this->x0, other->x0); - this->y0 = Math::_min(this->y0, other->y0); - this->z0 = Math::_min(this->z0, other->z0); - this->x1 = Math::_max(this->x1, other->x1); - this->y1 = Math::_max(this->y1, other->y1); - this->z1 = Math::_max(this->z1, other->z1); + x0 = Math::_min(x0, other->x0); + y0 = Math::_min(y0, other->y0); + z0 = Math::_min(z0, other->z0); + x1 = Math::_max(x1, other->x1); + y1 = Math::_max(y1, other->y1); + z1 = Math::_max(z1, other->z1); } BoundingBox *BoundingBox::getIntersection(BoundingBox *other) { - if (!intersects(other)) + if (!intersects(other)) { - return NULL; - } - BoundingBox *result = new BoundingBox(); - result->x0 = Math::_max(this->x0, other->x0); - result->y0 = Math::_max(this->y0, other->y0); - result->z0 = Math::_max(this->z0, other->z0); - result->x1 = Math::_min(this->x1, other->x1); - result->y1 = Math::_min(this->y1, other->y1); - result->z1 = Math::_min(this->z1, other->z1); + return NULL; + } + BoundingBox *result = new BoundingBox(); + result->x0 = Math::_max(x0, other->x0); + result->y0 = Math::_max(y0, other->y0); + result->z0 = Math::_max(z0, other->z0); + result->x1 = Math::_min(x1, other->x1); + result->y1 = Math::_min(y1, other->y1); + result->z1 = Math::_min(z1, other->z1); - return result; + return result; } void BoundingBox::move(int dx, int dy, int dz) { - x0 += dx; - y0 += dy; - z0 += dz; - x1 += dx; - y1 += dy; - z1 += dz; + x0 += dx; + y0 += dy; + z0 += dz; + x1 += dx; + y1 += dy; + z1 += dz; } bool BoundingBox::isInside(int x, int y, int z) @@ -163,4 +176,14 @@ int BoundingBox::getZCenter() wstring BoundingBox::toString() { return L"(" + _toString(x0) + L", " + _toString(y0) + L", " + _toString(z0) + L"; " + _toString(x1) + L", " + _toString(y1) + L", " + _toString(z1) + L")"; +} + +IntArrayTag *BoundingBox::createTag(const wstring &name) +{ + // 4J-JEV: If somebody knows a better way to do this, please tell me. + int *data = new int[6](); + data[0] = x0; data[1] = y0; data[2] = z0; + data[3] = x1; data[4] = y1; data[5] = z1; + + return new IntArrayTag( name, intArray(data,6) ); } \ No newline at end of file diff --git a/Minecraft.World/BoundingBox.h b/Minecraft.World/BoundingBox.h index 23abd66d..ac29883f 100644 --- a/Minecraft.World/BoundingBox.h +++ b/Minecraft.World/BoundingBox.h @@ -1,11 +1,14 @@ #pragma once +#include "ArrayWithLength.h" + class BoundingBox { public: int x0, y0, z0, x1, y1, z1; BoundingBox(); + BoundingBox(intArray sourceData); static BoundingBox *getUnknownBox(); static BoundingBox *orientBox(int footX, int footY, int footZ, int offX, int offY, int offZ, int width, int height, int depth, int orientation); BoundingBox(BoundingBox *other); @@ -28,4 +31,5 @@ public: int getZCenter(); wstring toString(); + IntArrayTag *createTag(const wstring &name); }; \ No newline at end of file diff --git a/Minecraft.World/BowItem.cpp b/Minecraft.World/BowItem.cpp index ed2376b0..949b71e7 100644 --- a/Minecraft.World/BowItem.cpp +++ b/Minecraft.World/BowItem.cpp @@ -46,9 +46,9 @@ void BowItem::releaseUsing(shared_ptr itemInstance, Level *level, { arrow->setOnFire(100); } - itemInstance->hurt(1, player); + itemInstance->hurtAndBreak(1, player); - level->playSound(player, eSoundType_RANDOM_BOW, 1.0f, 1 / (random->nextFloat() * 0.4f + 1.2f) + pow * 0.5f); + level->playEntitySound(player, eSoundType_RANDOM_BOW, 1.0f, 1 / (random->nextFloat() * 0.4f + 1.2f) + pow * 0.5f); if (infiniteArrows) { diff --git a/Minecraft.World/BreakDoorGoal.cpp b/Minecraft.World/BreakDoorGoal.cpp index e4581c67..f63b4eb0 100644 --- a/Minecraft.World/BreakDoorGoal.cpp +++ b/Minecraft.World/BreakDoorGoal.cpp @@ -15,6 +15,7 @@ BreakDoorGoal::BreakDoorGoal(Mob *mob) : DoorInteractGoal(mob) bool BreakDoorGoal::canUse() { if (!DoorInteractGoal::canUse()) return false; + if (!mob->level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) return false; return !doorTile->isOpen(mob->level, doorX, doorY, doorZ); } @@ -57,7 +58,7 @@ void BreakDoorGoal::tick() { if (mob->level->difficulty == Difficulty::HARD) { - mob->level->setTile(doorX, doorY, doorZ, 0); + mob->level->removeTile(doorX, doorY, doorZ); mob->level->levelEvent(LevelEvent::SOUND_ZOMBIE_DOOR_CRASH, doorX, doorY, doorZ, 0); mob->level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, doorX, doorY, doorZ, doorTile->id); } diff --git a/Minecraft.World/BreedGoal.cpp b/Minecraft.World/BreedGoal.cpp index 2145d371..ce2d8fff 100644 --- a/Minecraft.World/BreedGoal.cpp +++ b/Minecraft.World/BreedGoal.cpp @@ -4,19 +4,20 @@ #include "net.minecraft.world.entity.animal.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.phys.h" +#include "BasicTypeContainers.h" #include "BreedGoal.h" #include "ExperienceOrb.h" #include "GenericStats.h" -BreedGoal::BreedGoal(Animal *animal, float speed) +BreedGoal::BreedGoal(Animal *animal, double speedModifier) { partner = weak_ptr(); loveTime = 0; this->animal = animal; this->level = animal->level; - this->speed = speed; + this->speedModifier = speedModifier; setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); } @@ -41,26 +42,28 @@ void BreedGoal::stop() void BreedGoal::tick() { animal->getLookControl()->setLookAt(partner.lock(), 10, animal->getMaxHeadXRot()); - animal->getNavigation()->moveTo(partner.lock(), speed); + animal->getNavigation()->moveTo(partner.lock(), speedModifier); ++loveTime; - if (loveTime == 20 * 3) breed(); + if (loveTime >= 20 * 3 && animal->distanceToSqr(partner.lock()) < 3*3) breed(); } shared_ptr BreedGoal::getFreePartner() { float r = 8; vector > *others = level->getEntitiesOfClass(typeid(*animal), animal->bb->grow(r, r, r)); + double dist = Double::MAX_VALUE; + shared_ptr partner = nullptr; for(AUTO_VAR(it, others->begin()); it != others->end(); ++it) { shared_ptr p = dynamic_pointer_cast(*it); - if (animal->canMate(p)) + if (animal->canMate(p) && animal->distanceToSqr(p) < dist) { - delete others; - return p; + partner = p; + dist = animal->distanceToSqr(p); } } delete others; - return nullptr; + return partner; } void BreedGoal::breed() @@ -97,7 +100,7 @@ void BreedGoal::breed() partner.lock()->setAge(5 * 60 * 20); animal->resetLove(); partner.lock()->resetLove(); - offspring->setAge(-20 * 60 * 20); + offspring->setAge(AgableMob::BABY_START_AGE); offspring->moveTo(animal->x, animal->y, animal->z, 0, 0); offspring->setDespawnProtected(); level->addEntity(offspring); diff --git a/Minecraft.World/BreedGoal.h b/Minecraft.World/BreedGoal.h index d2b47e7d..cb6b4f52 100644 --- a/Minecraft.World/BreedGoal.h +++ b/Minecraft.World/BreedGoal.h @@ -12,10 +12,10 @@ private: Level *level; weak_ptr partner; int loveTime; - float speed; + double speedModifier; public: - BreedGoal(Animal *animal, float speed); + BreedGoal(Animal *animal, double speedModifier); virtual bool canUse(); virtual bool canContinueToUse(); diff --git a/Minecraft.World/BrewingStandMenu.cpp b/Minecraft.World/BrewingStandMenu.cpp index af1fac5c..55eb953f 100644 --- a/Minecraft.World/BrewingStandMenu.cpp +++ b/Minecraft.World/BrewingStandMenu.cpp @@ -41,7 +41,7 @@ void BrewingStandMenu::broadcastChanges() AbstractContainerMenu::broadcastChanges(); //for (int i = 0; i < containerListeners->size(); i++) - for(AUTO_VAR(it, containerListeners->begin()); it != containerListeners->end(); ++it) + for(AUTO_VAR(it, containerListeners.begin()); it != containerListeners.end(); ++it) { ContainerListener *listener = *it; //containerListeners.at(i); if (tc != brewingStand->getBrewTime()) @@ -65,11 +65,11 @@ bool BrewingStandMenu::stillValid(shared_ptr player) shared_ptr BrewingStandMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); - Slot *IngredientSlot = slots->at(INGREDIENT_SLOT); - Slot *PotionSlot1 = slots->at(BOTTLE_SLOT_START); - Slot *PotionSlot2 = slots->at(BOTTLE_SLOT_START+1); - Slot *PotionSlot3 = slots->at(BOTTLE_SLOT_START+2); + Slot *slot = slots.at(slotIndex); + Slot *IngredientSlot = slots.at(INGREDIENT_SLOT); + Slot *PotionSlot1 = slots.at(BOTTLE_SLOT_START); + Slot *PotionSlot2 = slots.at(BOTTLE_SLOT_START+1); + Slot *PotionSlot3 = slots.at(BOTTLE_SLOT_START+2); if (slot != NULL && slot->hasItem()) { @@ -101,7 +101,7 @@ shared_ptr BrewingStandMenu::quickMoveStack(shared_ptr pla else if (slotIndex >= INV_SLOT_START && slotIndex < INV_SLOT_END) { // 4J-PB - if the item is an ingredient, quickmove it into the ingredient slot - if( (Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherStalkSeeds_Id) ) && + if( (Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherwart_seeds_Id) ) && (!IngredientSlot->hasItem() || (stack->id==IngredientSlot->getItem()->id) ) ) { if(!moveItemStackTo(stack, INGREDIENT_SLOT, INGREDIENT_SLOT+1, false)) @@ -125,7 +125,7 @@ shared_ptr BrewingStandMenu::quickMoveStack(shared_ptr pla else if (slotIndex >= USE_ROW_SLOT_START && slotIndex < USE_ROW_SLOT_END) { // 4J-PB - if the item is an ingredient, quickmove it into the ingredient slot - if((Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherStalkSeeds_Id)) && + if((Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherwart_seeds_Id)) && (!IngredientSlot->hasItem() || (stack->id==IngredientSlot->getItem()->id) )) { if(!moveItemStackTo(stack, INGREDIENT_SLOT, INGREDIENT_SLOT+1, false)) @@ -190,9 +190,7 @@ int BrewingStandMenu::PotionSlot::getMaxStackSize() void BrewingStandMenu::PotionSlot::onTake(shared_ptr player, shared_ptr carried) { - carried->onCraftedBy(this->player->level, dynamic_pointer_cast( this->player->shared_from_this() ), 1); - if (carried->id == Item::potion_Id && carried->getAuxValue() > 0) - this->player->awardStat(GenericStats::potion(),GenericStats::param_potion()); + if (carried->id == Item::potion_Id && carried->getAuxValue() > 0) this->player->awardStat(GenericStats::potion(),GenericStats::param_potion()); Slot::onTake(player, carried); } @@ -222,7 +220,7 @@ bool BrewingStandMenu::IngredientsSlot::mayPlace(shared_ptr item) } else { - return Item::items[item->id]->hasPotionBrewingFormula() || item->id == Item::netherStalkSeeds_Id || item->id == Item::bucket_water_Id; + return Item::items[item->id]->hasPotionBrewingFormula() || item->id == Item::netherwart_seeds_Id || item->id == Item::bucket_water_Id; } } return false; diff --git a/Minecraft.World/BrewingStandTile.cpp b/Minecraft.World/BrewingStandTile.cpp index 5f09ba02..1aeb52d8 100644 --- a/Minecraft.World/BrewingStandTile.cpp +++ b/Minecraft.World/BrewingStandTile.cpp @@ -5,10 +5,9 @@ #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.h" +#include "net.minecraft.world.inventory.h" -const wstring BrewingStandTile::TEXTURE_BASE = L"brewingStand_base"; - -BrewingStandTile::BrewingStandTile(int id) : EntityTile(id, Material::metal, isSolidRender()) +BrewingStandTile::BrewingStandTile(int id) : BaseEntityTile(id, Material::metal, isSolidRender()) { random = new Random(); iconBase = NULL; @@ -41,10 +40,10 @@ bool BrewingStandTile::isCubeShaped() void BrewingStandTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { - setShape(7.0f / 16.0f, 0, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); - EntityTile::addAABBs(level, x, y, z, box, boxes, source); - updateDefaultShape(); - EntityTile::addAABBs(level, x, y, z, box, boxes, source); + setShape(7.0f / 16.0f, 0, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); + updateDefaultShape(); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); } void BrewingStandTile::updateDefaultShape() @@ -56,62 +55,70 @@ bool BrewingStandTile::use(Level *level, int x, int y, int z, shared_ptr { if(soundOnly) return false; - if (level->isClientSide) + if (level->isClientSide) { - return true; - } - shared_ptr brewingStand = dynamic_pointer_cast(level->getTileEntity(x, y, z)); - if (brewingStand != NULL) player->openBrewingStand(brewingStand); + return true; + } + shared_ptr brewingStand = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + if (brewingStand != NULL) player->openBrewingStand(brewingStand); return true; } +void BrewingStandTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } +} + void BrewingStandTile::animateTick(Level *level, int xt, int yt, int zt, Random *random) { - double x = xt + 0.4f + random->nextFloat() * 0.2f; - double y = yt + 0.7f + random->nextFloat() * 0.3f; - double z = zt + 0.4f + random->nextFloat() * 0.2f; + double x = xt + 0.4f + random->nextFloat() * 0.2f; + double y = yt + 0.7f + random->nextFloat() * 0.3f; + double z = zt + 0.4f + random->nextFloat() * 0.2f; - level->addParticle(eParticleType_smoke, x, y, z, 0, 0, 0); + level->addParticle(eParticleType_smoke, x, y, z, 0, 0, 0); } void BrewingStandTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - shared_ptr tileEntity = level->getTileEntity(x, y, z); - if (tileEntity != NULL && ( dynamic_pointer_cast(tileEntity) != NULL) ) + shared_ptr tileEntity = level->getTileEntity(x, y, z); + if (tileEntity != NULL && ( dynamic_pointer_cast(tileEntity) != NULL) ) { - shared_ptr container = dynamic_pointer_cast(tileEntity); - for (int i = 0; i < container->getContainerSize(); i++) + shared_ptr container = dynamic_pointer_cast(tileEntity); + for (int i = 0; i < container->getContainerSize(); i++) { - shared_ptr item = container->getItem(i); - if (item != NULL) + shared_ptr item = container->getItem(i); + if (item != NULL) { - float xo = random->nextFloat() * 0.8f + 0.1f; - float yo = random->nextFloat() * 0.8f + 0.1f; - float zo = random->nextFloat() * 0.8f + 0.1f; + float xo = random->nextFloat() * 0.8f + 0.1f; + float yo = random->nextFloat() * 0.8f + 0.1f; + float zo = random->nextFloat() * 0.8f + 0.1f; - while (item->count > 0) + while (item->count > 0) { - int count = random->nextInt(21) + 10; - if (count > item->count) count = item->count; - item->count -= count; - - shared_ptr itemEntity = shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue())))); - float pow = 0.05f; - itemEntity->xd = (float) random->nextGaussian() * pow; - itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; - itemEntity->zd = (float) random->nextGaussian() * pow; - if (item->hasTag()) + int count = random->nextInt(21) + 10; + if (count > item->count) count = item->count; + item->count -= count; + + shared_ptr itemEntity = shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue())))); + float pow = 0.05f; + itemEntity->xd = (float) random->nextGaussian() * pow; + itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; + itemEntity->zd = (float) random->nextGaussian() * pow; + if (item->hasTag()) { - itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); - } - level->addEntity(itemEntity); - } - } - } - } - EntityTile::onRemove(level, x, y, z, id, data); + itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); + } + level->addEntity(itemEntity); + } + } + } + } + BaseEntityTile::onRemove(level, x, y, z, id, data); } int BrewingStandTile::getResource(int data, Random *random, int playerBonusLevel) @@ -124,10 +131,20 @@ int BrewingStandTile::cloneTileId(Level *level, int x, int y, int z) return Item::brewingStand_Id; } +bool BrewingStandTile::hasAnalogOutputSignal() +{ + return true; +} + +int BrewingStandTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + return AbstractContainerMenu::getRedstoneSignalFromContainer(dynamic_pointer_cast(level->getTileEntity(x, y, z))); +} + void BrewingStandTile::registerIcons(IconRegister *iconRegister) { - EntityTile::registerIcons(iconRegister); - iconBase = iconRegister->registerIcon(TEXTURE_BASE); + BaseEntityTile::registerIcons(iconRegister); + iconBase = iconRegister->registerIcon(getIconName() + L"_base"); } Icon *BrewingStandTile::getBaseTexture() diff --git a/Minecraft.World/BrewingStandTile.h b/Minecraft.World/BrewingStandTile.h index fc8ff462..bb1fed99 100644 --- a/Minecraft.World/BrewingStandTile.h +++ b/Minecraft.World/BrewingStandTile.h @@ -1,14 +1,12 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" class IconRegister; class ChunkRebuildData; -class BrewingStandTile : public EntityTile +class BrewingStandTile : public BaseEntityTile { friend ChunkRebuildData; -public: - static const wstring TEXTURE_BASE; private: Random *random; Icon *iconBase; @@ -16,17 +14,20 @@ private: public: BrewingStandTile(int id); ~BrewingStandTile(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual int getRenderShape(); - virtual shared_ptr newTileEntity(Level *level); - virtual bool isCubeShaped(); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); - virtual void updateDefaultShape(); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual bool isSolidRender(bool isServerLevel = false); + virtual int getRenderShape(); + virtual shared_ptr newTileEntity(Level *level); + virtual bool isCubeShaped(); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); + virtual void updateDefaultShape(); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual int getResource(int data, Random *random, int playerBonusLevel); virtual int cloneTileId(Level *level, int x, int y, int z); - void registerIcons(IconRegister *iconRegister); - Icon *getBaseTexture(); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); + virtual void registerIcons(IconRegister *iconRegister); + virtual Icon *getBaseTexture(); }; \ No newline at end of file diff --git a/Minecraft.World/BrewingStandTileEntity.cpp b/Minecraft.World/BrewingStandTileEntity.cpp index 20cb3737..00170d7b 100644 --- a/Minecraft.World/BrewingStandTileEntity.cpp +++ b/Minecraft.World/BrewingStandTileEntity.cpp @@ -2,16 +2,22 @@ #include "com.mojang.nbt.h" #include "BrewingStandTileEntity.h" #include "SharedConstants.h" +#include "net.minecraft.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.alchemy.h" +int slotsForUp [] = { BrewingStandTileEntity::INGREDIENT_SLOT }; +int slotsForOtherFaces [] = { 0, 1, 2 }; +intArray BrewingStandTileEntity::SLOTS_FOR_UP = intArray(slotsForUp, 1); +intArray BrewingStandTileEntity::SLOTS_FOR_OTHER_FACES = intArray(slotsForOtherFaces, 3); BrewingStandTileEntity::BrewingStandTileEntity() { brewTime = 0; items = ItemInstanceArray(4); + name = L""; } BrewingStandTileEntity::~BrewingStandTileEntity() @@ -19,9 +25,24 @@ BrewingStandTileEntity::~BrewingStandTileEntity() delete [] items.data; } -int BrewingStandTileEntity::getName() +wstring BrewingStandTileEntity::getName() { - return IDS_TILE_BREWINGSTAND; + return hasCustomName() ? name : app.GetString(IDS_TILE_BREWINGSTAND); +} + +wstring BrewingStandTileEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +bool BrewingStandTileEntity::hasCustomName() +{ + return !name.empty(); +} + +void BrewingStandTileEntity::setCustomName(const wstring &name) +{ + this->name = name; } unsigned int BrewingStandTileEntity::getContainerSize() @@ -31,41 +52,41 @@ unsigned int BrewingStandTileEntity::getContainerSize() void BrewingStandTileEntity::tick() { - if (brewTime > 0) + if (brewTime > 0) { - brewTime--; + brewTime--; - if (brewTime == 0) + if (brewTime == 0) { - // apply ingredients to all potions - doBrew(); - setChanged(); - } + // apply ingredients to all potions + doBrew(); + setChanged(); + } else if (!isBrewable()) { - brewTime = 0; - setChanged(); - } + brewTime = 0; + setChanged(); + } else if (ingredientId != items[INGREDIENT_SLOT]->id) { - brewTime = 0; - setChanged(); - } - } + brewTime = 0; + setChanged(); + } + } else if (isBrewable()) { - brewTime = SharedConstants::TICKS_PER_SECOND * PotionBrewing::BREWING_TIME_SECONDS; - ingredientId = items[INGREDIENT_SLOT]->id; - } + brewTime = SharedConstants::TICKS_PER_SECOND * PotionBrewing::BREWING_TIME_SECONDS; + ingredientId = items[INGREDIENT_SLOT]->id; + } - int newCount = getPotionBits(); - if (newCount != lastPotionCount) + int newCount = getPotionBits(); + if (newCount != lastPotionCount) { - lastPotionCount = newCount; - level->setData(x, y, z, newCount); - } + lastPotionCount = newCount; + level->setData(x, y, z, newCount, Tile::UPDATE_CLIENTS); + } - TileEntity::tick(); + TileEntity::tick(); } int BrewingStandTileEntity::getBrewTime() @@ -75,34 +96,34 @@ int BrewingStandTileEntity::getBrewTime() bool BrewingStandTileEntity::isBrewable() { - if (items[INGREDIENT_SLOT] == NULL || items[INGREDIENT_SLOT]->count <= 0) + if (items[INGREDIENT_SLOT] == NULL || items[INGREDIENT_SLOT]->count <= 0) { - return false; - } - shared_ptr ingredient = items[INGREDIENT_SLOT]; - if (PotionBrewing::SIMPLIFIED_BREWING) + return false; + } + shared_ptr ingredient = items[INGREDIENT_SLOT]; + if (PotionBrewing::SIMPLIFIED_BREWING) { - if (!Item::items[ingredient->id]->hasPotionBrewingFormula()) + if (!Item::items[ingredient->id]->hasPotionBrewingFormula()) { - return false; - } + return false; + } - bool oneResult = false; - for (int dest = 0; dest < 3; dest++) + bool oneResult = false; + for (int dest = 0; dest < 3; dest++) { - if (items[dest] != NULL && items[dest]->id == Item::potion_Id) + if (items[dest] != NULL && items[dest]->id == Item::potion_Id) { - int currentBrew = items[dest]->getAuxValue(); - int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); + int currentBrew = items[dest]->getAuxValue(); + int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); - if (!PotionItem::isThrowable(currentBrew) && PotionItem::isThrowable(newBrew)) + if (!PotionItem::isThrowable(currentBrew) && PotionItem::isThrowable(newBrew)) { - oneResult = true; - break; - } + oneResult = true; + break; + } - vector *currentEffects = Item::potion->getMobEffects(currentBrew); - vector *newEffects = Item::potion->getMobEffects(newBrew); + vector *currentEffects = Item::potion->getMobEffects(currentBrew); + vector *newEffects = Item::potion->getMobEffects(newBrew); // 4J - this code replaces an expression "currentEffects.equals(newEffects)" in the java. // TODO - find out whether actually checking pointers to MobEffectInstance classes for equality @@ -119,72 +140,72 @@ bool BrewingStandTileEntity::isBrewable() } } - if ((currentBrew > 0 && currentEffects == newEffects) || + if ((currentBrew > 0 && currentEffects == newEffects) || (currentEffects != NULL && (equals || newEffects == NULL))) { - } + } else if (currentBrew != newBrew) { - oneResult = true; - break; - } - } - } - return oneResult; - - } + oneResult = true; + break; + } + } + } + return oneResult; + + } else { - if (!Item::items[ingredient->id]->hasPotionBrewingFormula() && ingredient->id != Item::bucket_water_Id && ingredient->id != Item::netherStalkSeeds_Id) + if (!Item::items[ingredient->id]->hasPotionBrewingFormula() && ingredient->id != Item::bucket_water_Id && ingredient->id != Item::netherwart_seeds_Id) { - return false; - } - bool isWater = ingredient->id == Item::bucket_water_Id; + return false; + } + bool isWater = ingredient->id == Item::bucket_water_Id; - // at least one destination potion must have a result - bool oneResult = false; - for (int dest = 0; dest < 3; dest++) + // at least one destination potion must have a result + bool oneResult = false; + for (int dest = 0; dest < 3; dest++) { - if (items[dest] != NULL && items[dest]->id == Item::potion_Id) + if (items[dest] != NULL && items[dest]->id == Item::potion_Id) { - int currentBrew = items[dest]->getAuxValue(); - int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); - if (currentBrew != newBrew) + int currentBrew = items[dest]->getAuxValue(); + int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); + if (currentBrew != newBrew) { - oneResult = true; - break; - } - } + oneResult = true; + break; + } + } else if (isWater && items[dest] != NULL && items[dest]->id == Item::glassBottle_Id) { - oneResult = true; - break; - } - } - return oneResult; - } + oneResult = true; + break; + } + } + return oneResult; + } } void BrewingStandTileEntity::doBrew() { - if (!isBrewable()) + if (!isBrewable()) { - return; - } + return; + } - shared_ptr ingredient = items[INGREDIENT_SLOT]; + shared_ptr ingredient = items[INGREDIENT_SLOT]; - if (PotionBrewing::SIMPLIFIED_BREWING) + if (PotionBrewing::SIMPLIFIED_BREWING) { - for (int dest = 0; dest < 3; dest++) + for (int dest = 0; dest < 3; dest++) { - if (items[dest] != NULL && items[dest]->id == Item::potion_Id) + if (items[dest] != NULL && items[dest]->id == Item::potion_Id) { - int currentBrew = items[dest]->getAuxValue(); - int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); + int currentBrew = items[dest]->getAuxValue(); + int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); - vector *currentEffects = Item::potion->getMobEffects(currentBrew); - vector *newEffects = Item::potion->getMobEffects(newBrew); + vector *currentEffects = Item::potion->getMobEffects(currentBrew); + vector *newEffects = Item::potion->getMobEffects(newBrew); // 4J - this code replaces an expression "currentEffects.equals(newEffects)" in the java. // TODO - find out whether actually checking pointers to MobEffectInstance classes for equality @@ -201,55 +222,55 @@ void BrewingStandTileEntity::doBrew() } } - if ((currentBrew > 0 && currentEffects == newEffects) || + if ((currentBrew > 0 && currentEffects == newEffects) || (currentEffects != NULL && (equals || newEffects == NULL))) { - if (!PotionItem::isThrowable(currentBrew) && PotionItem::isThrowable(newBrew)) + if (!PotionItem::isThrowable(currentBrew) && PotionItem::isThrowable(newBrew)) { - items[dest]->setAuxValue(newBrew); - } + items[dest]->setAuxValue(newBrew); + } - } + } else if (currentBrew != newBrew) { - items[dest]->setAuxValue(newBrew); - } + items[dest]->setAuxValue(newBrew); + } - } - } + } + } - } + } else { - bool isWater = ingredient->id == Item::bucket_water_Id; + bool isWater = ingredient->id == Item::bucket_water_Id; - for (int dest = 0; dest < 3; dest++) + for (int dest = 0; dest < 3; dest++) { - if (items[dest] != NULL && items[dest]->id == Item::potion_Id) + if (items[dest] != NULL && items[dest]->id == Item::potion_Id) { - int currentBrew = items[dest]->getAuxValue(); - int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); - items[dest]->setAuxValue(newBrew); - } + int currentBrew = items[dest]->getAuxValue(); + int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); + items[dest]->setAuxValue(newBrew); + } else if (isWater && items[dest] != NULL && items[dest]->id == Item::glassBottle_Id) { - items[dest] = shared_ptr(new ItemInstance(Item::potion)); - } - } - } + items[dest] = shared_ptr(new ItemInstance(Item::potion)); + } + } + } - if (Item::items[ingredient->id]->hasCraftingRemainingItem()) + if (Item::items[ingredient->id]->hasCraftingRemainingItem()) { - items[INGREDIENT_SLOT] = shared_ptr(new ItemInstance(Item::items[ingredient->id]->getCraftingRemainingItem())); - } + items[INGREDIENT_SLOT] = shared_ptr(new ItemInstance(Item::items[ingredient->id]->getCraftingRemainingItem())); + } else { - items[INGREDIENT_SLOT]->count--; - if (items[INGREDIENT_SLOT]->count <= 0) + items[INGREDIENT_SLOT]->count--; + if (items[INGREDIENT_SLOT]->count <= 0) { - items[INGREDIENT_SLOT] = nullptr; - } - } + items[INGREDIENT_SLOT] = nullptr; + } + } } int BrewingStandTileEntity::applyIngredient(int currentBrew, shared_ptr ingredient) @@ -266,7 +287,7 @@ int BrewingStandTileEntity::applyIngredient(int currentBrew, shared_ptrid == Item::netherStalkSeeds_Id) + if (ingredient->id == Item::netherwart_seeds_Id) { return PotionBrewing::stirr(currentBrew); } @@ -278,42 +299,44 @@ int BrewingStandTileEntity::applyIngredient(int currentBrew, shared_ptr *inventoryList = (ListTag *) base->getList(L"Items"); + ListTag *inventoryList = (ListTag *) base->getList(L"Items"); delete [] items.data; - items = ItemInstanceArray(getContainerSize()); - for (int i = 0; i < inventoryList->size(); i++) + items = ItemInstanceArray(getContainerSize()); + for (int i = 0; i < inventoryList->size(); i++) { - CompoundTag *tag = inventoryList->get(i); - int slot = tag->getByte(L"Slot"); - if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); - } + CompoundTag *tag = inventoryList->get(i); + int slot = tag->getByte(L"Slot"); + if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); + } - brewTime = base->getShort(L"BrewTime"); + brewTime = base->getShort(L"BrewTime"); + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); } void BrewingStandTileEntity::save(CompoundTag *base) { - TileEntity::save(base); + TileEntity::save(base); - base->putShort(L"BrewTime", (short) (brewTime)); - ListTag *listTag = new ListTag(); + base->putShort(L"BrewTime", (short) (brewTime)); + ListTag *listTag = new ListTag(); - for (int i = 0; i < items.length; i++) + for (int i = 0; i < items.length; i++) { - if (items[i] != NULL) + if (items[i] != NULL) { - CompoundTag *tag = new CompoundTag(); - tag->putByte(L"Slot", (byte) i); - items[i]->save(tag); - listTag->add(tag); - } - } - base->put(L"Items", listTag); + CompoundTag *tag = new CompoundTag(); + tag->putByte(L"Slot", (byte) i); + items[i]->save(tag); + listTag->add(tag); + } + } + base->put(L"Items", listTag); + if (hasCustomName()) base->putString(L"CustomName", name); } shared_ptr BrewingStandTileEntity::getItem(unsigned int slot) @@ -354,7 +377,7 @@ shared_ptr BrewingStandTileEntity::removeItem(unsigned int slot, i } return nullptr; } - + shared_ptr BrewingStandTileEntity::removeItemNoUpdate(int slot) { if (slot >= 0 && slot < items.length) @@ -368,22 +391,23 @@ shared_ptr BrewingStandTileEntity::removeItemNoUpdate(int slot) void BrewingStandTileEntity::setItem(unsigned int slot, shared_ptr item) { - if (slot >= 0 && slot < items.length) + if (slot >= 0 && slot < items.length) { - items[slot] = item; - } + items[slot] = item; + } } int BrewingStandTileEntity::getMaxStackSize() { - return 1; + // this value is not used for the potion slots + return 64; } bool BrewingStandTileEntity::stillValid(shared_ptr player) { - if (level->getTileEntity(x, y, z) != shared_from_this()) return false; - if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; - return true; + if (level->getTileEntity(x, y, z) != shared_from_this()) return false; + if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; + return true; } void BrewingStandTileEntity::startOpen() @@ -394,22 +418,59 @@ void BrewingStandTileEntity::stopOpen() { } +bool BrewingStandTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + if (slot == INGREDIENT_SLOT) + { + if (PotionBrewing::SIMPLIFIED_BREWING) + { + return Item::items[item->id]->hasPotionBrewingFormula(); + } + else + { + return Item::items[item->id]->hasPotionBrewingFormula() || item->id == Item::netherwart_seeds_Id || item->id == Item::bucket_water_Id; + } + } + + return item->id == Item::potion_Id || item->id == Item::glassBottle_Id; +} + void BrewingStandTileEntity::setBrewTime(int value) { - this->brewTime = value; + brewTime = value; } int BrewingStandTileEntity::getPotionBits() { - int newCount = 0; - for (int potion = 0; potion < 3; potion++) + int newCount = 0; + for (int potion = 0; potion < 3; potion++) { - if (items[potion] != NULL) + if (items[potion] != NULL) { - newCount |= (1 << potion); - } - } - return newCount; + newCount |= (1 << potion); + } + } + return newCount; +} + +intArray BrewingStandTileEntity::getSlotsForFace(int face) +{ + if (face == Facing::UP) + { + return SLOTS_FOR_UP; + } + + return SLOTS_FOR_OTHER_FACES; +} + +bool BrewingStandTileEntity::canPlaceItemThroughFace(int slot, shared_ptr item, int face) +{ + return canPlaceItem(slot, item); +} + +bool BrewingStandTileEntity::canTakeItemThroughFace(int slot, shared_ptr item, int face) +{ + return true; } // 4J Added @@ -419,8 +480,8 @@ shared_ptr BrewingStandTileEntity::clone() TileEntity::clone(result); result->brewTime = brewTime; - result->lastPotionCount = lastPotionCount; - result->ingredientId = ingredientId; + result->lastPotionCount = lastPotionCount; + result->ingredientId = ingredientId; for (unsigned int i = 0; i < items.length; i++) { diff --git a/Minecraft.World/BrewingStandTileEntity.h b/Minecraft.World/BrewingStandTileEntity.h index 733e1073..52d3a0f1 100644 --- a/Minecraft.World/BrewingStandTileEntity.h +++ b/Minecraft.World/BrewingStandTileEntity.h @@ -1,50 +1,61 @@ #pragma once #include "TileEntity.h" -#include "Container.h" +#include "WorldlyContainer.h" -class BrewingStandTileEntity : public TileEntity, public Container +class BrewingStandTileEntity : public TileEntity, public WorldlyContainer { public: eINSTANCEOF GetType() { return eTYPE_BREWINGSTANDTILEENTITY; } static TileEntity *create() { return new BrewingStandTileEntity(); } + static const int INGREDIENT_SLOT = 3; + private: ItemInstanceArray items; - static const int INGREDIENT_SLOT = 3; + static intArray SLOTS_FOR_UP; + static intArray SLOTS_FOR_OTHER_FACES; - int brewTime; - int lastPotionCount; - int ingredientId; + int brewTime; + int lastPotionCount; + int ingredientId; + wstring name; public: BrewingStandTileEntity(); ~BrewingStandTileEntity(); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); virtual unsigned int getContainerSize(); virtual void tick(); - int getBrewTime(); + int getBrewTime(); private: bool isBrewable(); - void doBrew(); + void doBrew(); int applyIngredient(int currentBrew, shared_ptr ingredient); public: virtual void load(CompoundTag *base); - virtual void save(CompoundTag *base); - virtual shared_ptr getItem(unsigned int slot); - virtual shared_ptr removeItem(unsigned int slot, int i); + virtual void save(CompoundTag *base); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int i); virtual shared_ptr removeItemNoUpdate(int slot); - virtual void setItem(unsigned int slot, shared_ptr item); - virtual int getMaxStackSize(); - virtual bool stillValid(shared_ptr player); - virtual void startOpen(); - virtual void stopOpen(); - virtual void setBrewTime(int value); - virtual void setChanged() {} // 4J added - int getPotionBits(); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual int getMaxStackSize(); + virtual bool stillValid(shared_ptr player); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual void setBrewTime(int value); + virtual void setChanged() { TileEntity::setChanged(); } // 4J added + int getPotionBits(); + virtual intArray getSlotsForFace(int face); + virtual bool canPlaceItemThroughFace(int slot, shared_ptr item, int face); + virtual bool canTakeItemThroughFace(int slot, shared_ptr item, int face); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/BucketItem.cpp b/Minecraft.World/BucketItem.cpp index d3570cd7..a3bd7bee 100644 --- a/Minecraft.World/BucketItem.cpp +++ b/Minecraft.World/BucketItem.cpp @@ -24,12 +24,8 @@ BucketItem::BucketItem(int id, int content) : Item( id ) this->content = content; } -bool BucketItem::TestUse(Level *level, shared_ptr player) +bool BucketItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { -// double x = player->xo + (player->x - player->xo); -// double y = player->yo + (player->y - player->yo) + 1.62 - player->heightOffset; -// double z = player->zo + (player->z - player->zo); - bool pickLiquid = content == 0; HitResult *hr = getPlayerPOVHitResult(level, player, pickLiquid); if (hr == NULL) return false; @@ -48,7 +44,7 @@ bool BucketItem::TestUse(Level *level, shared_ptr player) if (content == 0) { - if (!player->mayBuild(xt, yt, zt)) return false; + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return false; if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0) { delete hr; @@ -73,8 +69,8 @@ bool BucketItem::TestUse(Level *level, shared_ptr player) if (hr->f == 3) zt++; if (hr->f == 4) xt--; if (hr->f == 5) xt++; - - if (!player->mayBuild(xt, yt, zt)) return false; + + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return false; if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid()) { @@ -126,17 +122,17 @@ shared_ptr BucketItem::use(shared_ptr itemInstance, app.DebugPrintf("Sending ChatPacket::e_ChatCannotPlaceLava to player\n"); servPlayer->connection->send( shared_ptr( new ChatPacket(L"", ChatPacket::e_ChatCannotPlaceLava ) ) ); } - + delete hr; return itemInstance; } if (content == 0) { - if (!player->mayBuild(xt, yt, zt)) return itemInstance; + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return itemInstance; if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0) { - level->setTile(xt, yt, zt, 0); + level->removeTile(xt, yt, zt); delete hr; if (player->abilities.instabuild) { @@ -160,11 +156,11 @@ shared_ptr BucketItem::use(shared_ptr itemInstance, { if( level->dimension->id == -1 ) player->awardStat( - GenericStats::netherLavaCollected(), - GenericStats::param_noArgs() - ); + GenericStats::netherLavaCollected(), + GenericStats::param_noArgs() + ); - level->setTile(xt, yt, zt, 0); + level->removeTile(xt, yt, zt); delete hr; if (player->abilities.instabuild) { @@ -197,65 +193,50 @@ shared_ptr BucketItem::use(shared_ptr itemInstance, if (hr->f == 3) zt++; if (hr->f == 4) xt--; if (hr->f == 5) xt++; - - if (!player->mayBuild(xt, yt, zt)) return itemInstance; + + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return itemInstance; - if (emptyBucket(level, x, y, z, xt, yt, zt) && !player->abilities.instabuild) + if (emptyBucket(level, xt, yt, zt) && !player->abilities.instabuild) { return shared_ptr( new ItemInstance(Item::bucket_empty) ); } } } - else - { - if (content == 0) - { - if (hr->entity->GetType() == eTYPE_COW) - { - delete hr; - if (--itemInstance->count <= 0) - { - return shared_ptr( new ItemInstance(Item::milk) ); - } - else - { - if (!player->inventory->add(shared_ptr( new ItemInstance(Item::milk)))) - { - player->drop(shared_ptr(new ItemInstance(Item::milk_Id, 1, 0))); - } - return itemInstance; - } - } - } - } delete hr; return itemInstance; } -bool BucketItem::emptyBucket(Level *level, double x, double y, double z, int xt, int yt, int zt) +bool BucketItem::emptyBucket(Level *level, int xt, int yt, int zt) { - if (content <= 0) return false; + if (content <= 0) return false; - if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid()) + Material *material = level->getMaterial(xt, yt, zt); + bool nonSolid = !material->isSolid(); + + if (level->isEmptyTile(xt, yt, zt) || nonSolid) { - if (level->dimension->ultraWarm && content == Tile::water_Id) + if (level->dimension->ultraWarm && content == Tile::water_Id) { - level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); + level->playSound(xt + 0.5f, yt + 0.5f, zt + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); - for (int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { - level->addParticle(eParticleType_largesmoke, xt + Math::random(), yt + Math::random(), zt + Math::random(), 0, 0, 0); - } - } + level->addParticle(eParticleType_largesmoke, xt + Math::random(), yt + Math::random(), zt + Math::random(), 0, 0, 0); + } + } else { - level->setTileAndData(xt, yt, zt, content, 0); - } + if (!level->isClientSide && nonSolid && !material->isLiquid()) + { + level->destroyTile(xt, yt, zt, true); + } + level->setTileAndData(xt, yt, zt, content, 0, Tile::UPDATE_ALL); + } - return true; - } + return true; + } - return false; + return false; } diff --git a/Minecraft.World/BucketItem.h b/Minecraft.World/BucketItem.h index 500d19d8..0fd90e9c 100644 --- a/Minecraft.World/BucketItem.h +++ b/Minecraft.World/BucketItem.h @@ -13,19 +13,8 @@ private: public: BucketItem(int id, int content); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); - // TU9 - bool emptyBucket(Level *level, double x, double y, double z, int xt, int yt, int zt); - - /* - * public boolean useOn(ItemInstance instance, Player player, Level level, - * int x, int y, int z, int face) { if (content == 0) { } else { if (face == - * 0) y--; if (face == 1) y++; if (face == 2) z--; if (face == 3) z++; if - * (face == 4) x--; if (face == 5) x++; int targetType = level.getTile(x, y, - * z); if (targetType == 0) { level.setTile(x, y, z, content); } - * player->inventory.items[player->inventory.selected] = new - * ItemInstance(Item.bucket_empty); } return true; } - */ + bool emptyBucket(Level *level, int xt, int yt, int zt); }; \ No newline at end of file diff --git a/Minecraft.World/Bush.cpp b/Minecraft.World/Bush.cpp index e6cd7c85..6f8e8d91 100644 --- a/Minecraft.World/Bush.cpp +++ b/Minecraft.World/Bush.cpp @@ -5,13 +5,13 @@ void Bush::_init() { - setTicking(true); - updateDefaultShape(); + setTicking(true); + updateDefaultShape(); } Bush::Bush(int id, Material *material) : Tile(id, material, isSolidRender()) { - _init(); + _init(); } Bush::Bush(int id) : Tile(id, Material::plant, isSolidRender()) @@ -22,8 +22,8 @@ Bush::Bush(int id) : Tile(id, Material::plant, isSolidRender()) // 4J Added override void Bush::updateDefaultShape() { - float ss = 0.2f; - this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, ss * 3, 0.5f + ss); + float ss = 0.2f; + setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, ss * 3, 0.5f + ss); } bool Bush::mayPlace(Level *level, int x, int y, int z) @@ -49,11 +49,11 @@ void Bush::tick(Level *level, int x, int y, int z, Random *random) void Bush::checkAlive(Level *level, int x, int y, int z) { - if (!canSurvive(level, x, y, z)) + if (!canSurvive(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - } + this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->setTileAndData(x, y, z, 0, 0, UPDATE_CLIENTS); + } } bool Bush::canSurvive(Level *level, int x, int y, int z) diff --git a/Minecraft.World/ButtonTile.cpp b/Minecraft.World/ButtonTile.cpp index 16055a7e..045d5597 100644 --- a/Minecraft.World/ButtonTile.cpp +++ b/Minecraft.World/ButtonTile.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.h" #include "ButtonTile.h" @@ -15,7 +16,7 @@ ButtonTile::ButtonTile(int id, bool sensitive) : Tile(id, Material::decoration,i Icon *ButtonTile::getTexture(int face, int data) { if(id == Tile::button_wood_Id) return Tile::wood->getTexture(Facing::UP); - else return Tile::rock->getTexture(Facing::UP); + else return Tile::stone->getTexture(Facing::UP); } AABB *ButtonTile::getAABB(Level *level, int x, int y, int z) @@ -23,7 +24,7 @@ AABB *ButtonTile::getAABB(Level *level, int x, int y, int z) return NULL; } -int ButtonTile::getTickDelay() +int ButtonTile::getTickDelay(Level *level) { return sensitive ? 30 : 20; } @@ -45,100 +46,100 @@ bool ButtonTile::isCubeShaped() bool ButtonTile::mayPlace(Level *level, int x, int y, int z, int face) { - if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) return true; - if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) return true; - if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) return true; - if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) return true; - return false; + if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) return true; + if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) return true; + if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) return true; + if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) return true; + return false; } bool ButtonTile::mayPlace(Level *level, int x, int y, int z) { - if (level->isSolidBlockingTile(x - 1, y, z)) + if (level->isSolidBlockingTile(x - 1, y, z)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x + 1, y, z)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x, y, z - 1)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x, y, z + 1)) { - return true; - } - return false; + return true; + } + return false; } int ButtonTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) { - int dir = level->getData(x, y, z); + int dir = level->getData(x, y, z); - int oldFlip = dir & 8; - dir &= 7; + int oldFlip = dir & 8; + dir &= 7; - if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) dir = 4; - else if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) dir = 3; - else if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) dir = 2; - else if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) dir = 1; - else dir = findFace(level, x, y, z); + if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) dir = 4; + else if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) dir = 3; + else if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) dir = 2; + else if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) dir = 1; + else dir = findFace(level, x, y, z); - return dir + oldFlip; + return dir + oldFlip; } int ButtonTile::findFace(Level *level, int x, int y, int z) { - if (level->isSolidBlockingTile(x - 1, y, z)) + if (level->isSolidBlockingTile(x - 1, y, z)) { - return 1; - } + return 1; + } else if (level->isSolidBlockingTile(x + 1, y, z)) { - return 2; - } + return 2; + } else if (level->isSolidBlockingTile(x, y, z - 1)) { - return 3; - } + return 3; + } else if (level->isSolidBlockingTile(x, y, z + 1)) { - return 4; - } - return 1; + return 4; + } + return 1; } void ButtonTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (checkCanSurvive(level, x, y, z)) + if (checkCanSurvive(level, x, y, z)) { - int dir = level->getData(x, y, z) & 7; - bool replace = false; + int dir = level->getData(x, y, z) & 7; + bool replace = false; - if (!level->isSolidBlockingTile(x - 1, y, z) && dir == 1) replace = true; - if (!level->isSolidBlockingTile(x + 1, y, z) && dir == 2) replace = true; - if (!level->isSolidBlockingTile(x, y, z - 1) && dir == 3) replace = true; - if (!level->isSolidBlockingTile(x, y, z + 1) && dir == 4) replace = true; + if (!level->isSolidBlockingTile(x - 1, y, z) && dir == 1) replace = true; + if (!level->isSolidBlockingTile(x + 1, y, z) && dir == 2) replace = true; + if (!level->isSolidBlockingTile(x, y, z - 1) && dir == 3) replace = true; + if (!level->isSolidBlockingTile(x, y, z + 1) && dir == 4) replace = true; - if (replace) + if (replace) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - } - } + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + } + } } bool ButtonTile::checkCanSurvive(Level *level, int x, int y, int z) { - if (!mayPlace(level, x, y, z)) + if (!mayPlace(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - return false; - } - return true; + this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + return false; + } + return true; } void ButtonTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param @@ -149,31 +150,31 @@ void ButtonTile::updateShape(LevelSource *level, int x, int y, int z, int forceD void ButtonTile::updateShape(int data) { - int dir = data & 7; - bool pressed = (data & 8) > 0; + int dir = data & 7; + bool pressed = (data & 8) > 0; - float h0 = 6 / 16.0f; - float h1 = 10 / 16.0f; - float r = 3 / 16.0f; - float d = 2 / 16.0f; - if (pressed) d = 1 / 16.0f; + float h0 = 6 / 16.0f; + float h1 = 10 / 16.0f; + float r = 3 / 16.0f; + float d = 2 / 16.0f; + if (pressed) d = 1 / 16.0f; - if (dir == 1) + if (dir == 1) { - setShape(0, h0, 0.5f - r, d, h1, 0.5f + r); - } + setShape(0, h0, 0.5f - r, d, h1, 0.5f + r); + } else if (dir == 2) { - setShape(1 - d, h0, 0.5f - r, 1, h1, 0.5f + r); - } + setShape(1 - d, h0, 0.5f - r, 1, h1, 0.5f + r); + } else if (dir == 3) { - setShape(0.5f - r, h0, 0, 0.5f + r, h1, d); - } + setShape(0.5f - r, h0, 0, 0.5f + r, h1, d); + } else if (dir == 4) { - setShape(0.5f - r, h0, 1 - d, 0.5f + r, h1, 1); - } + setShape(0.5f - r, h0, 1 - d, 0.5f + r, h1, 1); + } } void ButtonTile::attack(Level *level, int x, int y, int z, shared_ptr player) @@ -189,57 +190,58 @@ bool ButtonTile::TestUse() bool ButtonTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { - if( soundOnly) + if (soundOnly) { // 4J - added - just do enough to play the sound level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); return false; } - int data = level->getData(x, y, z); - int dir = data & 7; - int open = 8 - (data & 8); - if (open == 0) return true; - level->setData(x, y, z, dir + open); - level->setTilesDirty(x, y, z, x, y, z); + int data = level->getData(x, y, z); + int dir = data & 7; + int open = 8 - (data & 8); + if (open == 0) return true; + + level->setData(x, y, z, dir + open, Tile::UPDATE_ALL); + level->setTilesDirty(x, y, z, x, y, z); - level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); + level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); - updateNeighbours(level, x, y, z, dir); + updateNeighbours(level, x, y, z, dir); - level->addToTickNextTick(x, y, z, id, getTickDelay()); + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); - return true; + return true; } void ButtonTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - if ((data & 8) > 0) + if ((data & 8) > 0) { - int dir = data & 7; - updateNeighbours(level, x, y, z, dir); - } - Tile::onRemove(level, x, y, z, id, data); + int dir = data & 7; + updateNeighbours(level, x, y, z, dir); + } + Tile::onRemove(level, x, y, z, id, data); } -bool ButtonTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +int ButtonTile::getSignal(LevelSource *level, int x, int y, int z, int dir) { - return (level->getData(x, y, z) & 8) > 0; + return (level->getData(x, y, z) & 8) > 0 ? Redstone::SIGNAL_MAX : Redstone::SIGNAL_NONE; } -bool ButtonTile::getDirectSignal(Level *level, int x, int y, int z, int dir) +int ButtonTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) { - int data = level->getData(x, y, z); - if ((data & 8) == 0) return false; - int myDir = data & 7; + int data = level->getData(x, y, z); + if ((data & 8) == 0) return Redstone::SIGNAL_NONE; + int myDir = data & 7; - if (myDir == 5 && dir == 1) return true; - if (myDir == 4 && dir == 2) return true; - if (myDir == 3 && dir == 3) return true; - if (myDir == 2 && dir == 4) return true; - if (myDir == 1 && dir == 5) return true; + if (myDir == 5 && dir == 1) return Redstone::SIGNAL_MAX; + if (myDir == 4 && dir == 2) return Redstone::SIGNAL_MAX; + if (myDir == 3 && dir == 3) return Redstone::SIGNAL_MAX; + if (myDir == 2 && dir == 4) return Redstone::SIGNAL_MAX; + if (myDir == 1 && dir == 5) return Redstone::SIGNAL_MAX; - return false; + return false; } bool ButtonTile::isSignalSource() @@ -261,7 +263,7 @@ void ButtonTile::tick(Level *level, int x, int y, int z, Random *random) } else { - level->setData(x, y, z, data & 7); + level->setData(x, y, z, data & 7, Tile::UPDATE_ALL); int dir = data & 7; updateNeighbours(level, x, y, z, dir); @@ -273,10 +275,10 @@ void ButtonTile::tick(Level *level, int x, int y, int z, Random *random) void ButtonTile::updateDefaultShape() { - float x = 3 / 16.0f; - float y = 2 / 16.0f; - float z = 2 / 16.0f; - setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); + float x = 3 / 16.0f; + float y = 2 / 16.0f; + float z = 2 / 16.0f; + setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); } void ButtonTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) @@ -307,7 +309,7 @@ void ButtonTile::checkPressed(Level *level, int x, int y, int z) if (shouldBePressed && !wasPressed) { - level->setData(x, y, z, dir | 8); + level->setData(x, y, z, dir | 8, Tile::UPDATE_ALL); updateNeighbours(level, x, y, z, dir); level->setTilesDirty(x, y, z, x, y, z); @@ -315,7 +317,7 @@ void ButtonTile::checkPressed(Level *level, int x, int y, int z) } if (!shouldBePressed && wasPressed) { - level->setData(x, y, z, dir); + level->setData(x, y, z, dir, Tile::UPDATE_ALL); updateNeighbours(level, x, y, z, dir); level->setTilesDirty(x, y, z, x, y, z); @@ -324,7 +326,7 @@ void ButtonTile::checkPressed(Level *level, int x, int y, int z) if (shouldBePressed) { - level->addToTickNextTick(x, y, z, id, getTickDelay()); + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); } } @@ -357,7 +359,7 @@ void ButtonTile::updateNeighbours(Level *level, int x, int y, int z, int dir) bool ButtonTile::shouldTileTick(Level *level, int x,int y,int z) { int currentData = level->getData(x, y, z); - return (currentData & 8) != 0; + return (currentData & 8) != 0; } void ButtonTile::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/ButtonTile.h b/Minecraft.World/ButtonTile.h index e06158e0..96c49cdf 100644 --- a/Minecraft.World/ButtonTile.h +++ b/Minecraft.World/ButtonTile.h @@ -19,13 +19,13 @@ protected: public: Icon *getTexture(int face, int data); virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual int getTickDelay(); - virtual bool blocksLight(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual bool mayPlace(Level *level, int x, int y, int z, int face); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); + virtual int getTickDelay(Level *level); + virtual bool blocksLight(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual bool mayPlace(Level *level, int x, int y, int z, int face); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); private: int findFace(Level *level, int x, int y, int z); @@ -37,30 +37,30 @@ private: bool checkCanSurvive(Level *level, int x, int y, int z); public: - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param private: void updateShape(int data); public: - virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); - virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); - virtual bool isSignalSource(); - virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual void updateDefaultShape(); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); + virtual bool isSignalSource(); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void updateDefaultShape(); void entityInside(Level *level, int x, int y, int z, shared_ptr entity); private: void checkPressed(Level *level, int x, int y, int z); - void updateNeighbours(Level *level, int x, int y, int z, int dir); + void updateNeighbours(Level *level, int x, int y, int z, int dir); public: void registerIcons(IconRegister *iconRegister); - + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); }; \ No newline at end of file diff --git a/Minecraft.World/ByteArrayTag.h b/Minecraft.World/ByteArrayTag.h index 1b2437c0..598515ac 100644 --- a/Minecraft.World/ByteArrayTag.h +++ b/Minecraft.World/ByteArrayTag.h @@ -6,9 +6,11 @@ class ByteArrayTag : public Tag { public: byteArray data; + bool m_ownData; - ByteArrayTag(const wstring &name) : Tag(name) { } - ByteArrayTag(const wstring &name, byteArray data) : Tag(name) {this->data = data; } // 4J - added ownData param + ByteArrayTag(const wstring &name) : Tag(name) { m_ownData = false; } + ByteArrayTag(const wstring &name, byteArray data, bool ownData = false) : Tag(name) {this->data = data; m_ownData = ownData;} // 4J - added ownData param + ~ByteArrayTag() { if(m_ownData) delete [] data.data; } void write(DataOutput *dos) { @@ -16,7 +18,7 @@ public: dos->write(data); } - void load(DataInput *dis) + void load(DataInput *dis, int tagDepth) { int length = dis->readInt(); @@ -48,6 +50,6 @@ public: { byteArray cp = byteArray(data.length); System::arraycopy(data, 0, &cp, 0, data.length); - return new ByteArrayTag(getName(), cp); + return new ByteArrayTag(getName(), cp, true); } }; \ No newline at end of file diff --git a/Minecraft.World/ByteTag.h b/Minecraft.World/ByteTag.h index 0d2b3965..6b319c0b 100644 --- a/Minecraft.World/ByteTag.h +++ b/Minecraft.World/ByteTag.h @@ -9,7 +9,7 @@ public: ByteTag(const wstring &name, byte data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeByte(data); } - void load(DataInput *dis) { data = dis->readByte(); } + void load(DataInput *dis, int tagDepth) { data = dis->readByte(); } byte getId() { return TAG_Byte; } wstring toString() diff --git a/Minecraft.World/C4JThread.h b/Minecraft.World/C4JThread.h index 9a303c7b..3d5f050c 100644 --- a/Minecraft.World/C4JThread.h +++ b/Minecraft.World/C4JThread.h @@ -223,3 +223,12 @@ private: }; void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName ); + +class CriticalSectionScopeLock +{ + CRITICAL_SECTION* m_pCS; +public: + CriticalSectionScopeLock(CRITICAL_SECTION* pCS) { m_pCS = pCS; EnterCriticalSection(m_pCS); } + ~CriticalSectionScopeLock() { LeaveCriticalSection(m_pCS); } +}; + diff --git a/Minecraft.World/CactusFeature.cpp b/Minecraft.World/CactusFeature.cpp index 175c4ddb..13f5535a 100644 --- a/Minecraft.World/CactusFeature.cpp +++ b/Minecraft.World/CactusFeature.cpp @@ -5,23 +5,23 @@ bool CactusFeature::place(Level *level, Random *random, int x, int y, int z) { - for (int i = 0; i < 10; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y + random->nextInt(4) - random->nextInt(4); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (level->isEmptyTile(x2, y2, z2)) + for (int i = 0; i < 10; i++) { + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y + random->nextInt(4) - random->nextInt(4); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (level->isEmptyTile(x2, y2, z2)) { - int h = 1 + random->nextInt(random->nextInt(3) + 1); - for (int yy = 0; yy < h; yy++) + int h = 1 + random->nextInt(random->nextInt(3) + 1); + for (int yy = 0; yy < h; yy++) { - if (Tile::cactus->canSurvive(level, x2, y2+yy, z2)) + if (Tile::cactus->canSurvive(level, x2, y2+yy, z2)) { - level->setTileNoUpdate(x2, y2+yy, z2, Tile::cactus_Id); - } - } - } - } + level->setTileAndData(x2, y2+yy, z2, Tile::cactus_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } + } - return true; + return true; } diff --git a/Minecraft.World/CactusTile.cpp b/Minecraft.World/CactusTile.cpp index b72570e1..cdce293c 100644 --- a/Minecraft.World/CactusTile.cpp +++ b/Minecraft.World/CactusTile.cpp @@ -12,7 +12,7 @@ CactusTile::CactusTile(int id) : Tile(id, Material::cactus,isSolidRender()) { setTicking(true); iconTop = NULL; - iconBottom = NULL; + iconBottom = NULL; } void CactusTile::tick(Level *level, int x, int y, int z, Random *random) @@ -29,11 +29,13 @@ void CactusTile::tick(Level *level, int x, int y, int z, Random *random) int age = level->getData(x, y, z); if (age == 15) { - level->setTile(x, y + 1, z, id); - level->setData(x, y, z, 0); - } else + level->setTileAndUpdate(x, y + 1, z, id); + level->setData(x, y, z, 0, Tile::UPDATE_NONE); + neighborChanged(level, x, y + 1, z, id); + } + else { - level->setData(x, y, z, age + 1); + level->setData(x, y, z, age + 1, Tile::UPDATE_NONE); } } } @@ -41,22 +43,22 @@ void CactusTile::tick(Level *level, int x, int y, int z, Random *random) AABB *CactusTile::getAABB(Level *level, int x, int y, int z) { - float r = 1 / 16.0f; - return AABB::newTemp(x + r, y, z + r, x + 1 - r, y + 1 - r, z + 1 - r); + float r = 1 / 16.0f; + return AABB::newTemp(x + r, y, z + r, x + 1 - r, y + 1 - r, z + 1 - r); } AABB *CactusTile::getTileAABB(Level *level, int x, int y, int z) { - float r = 1 / 16.0f; - return AABB::newTemp(x + r, y, z + r, x + 1 - r, y + 1, z + 1 - r); + float r = 1 / 16.0f; + return AABB::newTemp(x + r, y, z + r, x + 1 - r, y + 1, z + 1 - r); } Icon *CactusTile::getTexture(int face, int data) { - if (face == Facing::UP) return iconTop; - if (face == Facing::DOWN) return iconBottom; - else return icon; + if (face == Facing::UP) return iconTop; + if (face == Facing::DOWN) return iconBottom; + else return icon; } bool CactusTile::isCubeShaped() @@ -76,28 +78,27 @@ int CactusTile::getRenderShape() bool CactusTile::mayPlace(Level *level, int x, int y, int z) { - if (!Tile::mayPlace(level, x, y, z)) return false; + if (!Tile::mayPlace(level, x, y, z)) return false; - return canSurvive(level, x, y, z); + return canSurvive(level, x, y, z); } void CactusTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (!canSurvive(level, x, y, z)) + if (!canSurvive(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->destroyTile(x, y, z, true); } } bool CactusTile::canSurvive(Level *level, int x, int y, int z) { - if (level->getMaterial(x - 1, y, z)->isSolid()) return false; - if (level->getMaterial(x + 1, y, z)->isSolid()) return false; - if (level->getMaterial(x, y, z - 1)->isSolid()) return false; - if (level->getMaterial(x, y, z + 1)->isSolid()) return false; - int below = level->getTile(x, y - 1, z); - return below == Tile::cactus_Id || below == Tile::sand_Id; + if (level->getMaterial(x - 1, y, z)->isSolid()) return false; + if (level->getMaterial(x + 1, y, z)->isSolid()) return false; + if (level->getMaterial(x, y, z - 1)->isSolid()) return false; + if (level->getMaterial(x, y, z + 1)->isSolid()) return false; + int below = level->getTile(x, y - 1, z); + return below == Tile::cactus_Id || below == Tile::sand_Id; } void CactusTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) @@ -114,5 +115,5 @@ void CactusTile::registerIcons(IconRegister *iconRegister) bool CactusTile::shouldTileTick(Level *level, int x,int y,int z) { - return level->isEmptyTile(x, y + 1, z); + return level->isEmptyTile(x, y + 1, z); } diff --git a/Minecraft.World/CakeTile.cpp b/Minecraft.World/CakeTile.cpp index 1254e10e..55dff176 100644 --- a/Minecraft.World/CakeTile.cpp +++ b/Minecraft.World/CakeTile.cpp @@ -20,44 +20,44 @@ CakeTile::CakeTile(int id) : Tile(id, Material::cake,isSolidRender()) void CakeTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - int d = level->getData(x, y, z); - float r = 1 / 16.0f; - float r2 = (1 + d * 2) / 16.0f; - float h = 8 / 16.0f; - this->setShape(r2, 0, r, 1 - r, h, 1 - r); + int d = level->getData(x, y, z); + float r = 1 / 16.0f; + float r2 = (1 + d * 2) / 16.0f; + float h = 8 / 16.0f; + this->setShape(r2, 0, r, 1 - r, h, 1 - r); } void CakeTile::updateDefaultShape() { - float r = 1 / 16.0f; - float h = 8 / 16.0f; - this->setShape(r, 0, r, 1 - r, h, 1 - r); + float r = 1 / 16.0f; + float h = 8 / 16.0f; + this->setShape(r, 0, r, 1 - r, h, 1 - r); } AABB *CakeTile::getAABB(Level *level, int x, int y, int z) { - int d = level->getData(x, y, z); - float r = 1 / 16.0f; - float r2 = (1 + d * 2) / 16.0f; - float h = 8 / 16.0f; - return AABB::newTemp(x + r2, y, z + r, x + 1 - r, y + h - r, z + 1 - r); + int d = level->getData(x, y, z); + float r = 1 / 16.0f; + float r2 = (1 + d * 2) / 16.0f; + float h = 8 / 16.0f; + return AABB::newTemp(x + r2, y, z + r, x + 1 - r, y + h - r, z + 1 - r); } AABB *CakeTile::getTileAABB(Level *level, int x, int y, int z) { - int d = level->getData(x, y, z); - float r = 1 / 16.0f; - float r2 = (1 + d * 2) / 16.0f; - float h = 8 / 16.0f; - return AABB::newTemp(x + r2, y, z + r, x + 1 - r, y + h, z + 1 - r); + int d = level->getData(x, y, z); + float r = 1 / 16.0f; + float r2 = (1 + d * 2) / 16.0f; + float h = 8 / 16.0f; + return AABB::newTemp(x + r2, y, z + r, x + 1 - r, y + h, z + 1 - r); } Icon *CakeTile::getTexture(int face, int data) { - if (face == Facing::UP) return iconTop; - if (face == Facing::DOWN) return iconBottom; - if (data > 0 && face == Facing::WEST) return iconInner; - return icon; + if (face == Facing::UP) return iconTop; + if (face == Facing::DOWN) return iconBottom; + if (data > 0 && face == Facing::WEST) return iconInner; + return icon; } void CakeTile::registerIcons(IconRegister *iconRegister) @@ -87,8 +87,8 @@ bool CakeTile::TestUse() bool CakeTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly ) return false; - eat(level, x, y, z, player); - return true; + eat(level, x, y, z, player); + return true; } void CakeTile::attack(Level *level, int x, int y, int z, shared_ptr player) @@ -98,35 +98,34 @@ void CakeTile::attack(Level *level, int x, int y, int z, shared_ptr play void CakeTile::eat(Level *level, int x, int y, int z, shared_ptr player) { - if (player->canEat(false)) + if (player->canEat(false)) { - player->getFoodData()->eat(2, FoodConstants::FOOD_SATURATION_POOR); + player->getFoodData()->eat(2, FoodConstants::FOOD_SATURATION_POOR); - int d = level->getData(x, y, z) + 1; - if (d >= 6) + int d = level->getData(x, y, z) + 1; + if (d >= 6) { - level->setTile(x, y, z, 0); - } else + level->removeTile(x, y, z); + } + else { - level->setData(x, y, z, d); - level->setTileDirty(x, y, z); - } - } + level->setData(x, y, z, d, Tile::UPDATE_CLIENTS); + } + } } bool CakeTile::mayPlace(Level *level, int x, int y, int z) { - if (!Tile::mayPlace(level, x, y, z)) return false; + if (!Tile::mayPlace(level, x, y, z)) return false; - return canSurvive(level, x, y, z); + return canSurvive(level, x, y, z); } void CakeTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (!canSurvive(level, x, y, z)) + if (!canSurvive(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } } diff --git a/Minecraft.World/Calendar.cpp b/Minecraft.World/Calendar.cpp new file mode 100644 index 00000000..e6d8d644 --- /dev/null +++ b/Minecraft.World/Calendar.cpp @@ -0,0 +1,19 @@ +#include "stdafx.h" +#include "Calendar.h" +#include + +unsigned int Calendar::GetDayOfMonth() +{ + time_t t = time(0); + struct tm *now = localtime(&t); + + return now->tm_mday; +} + +unsigned int Calendar::GetMonth() +{ + time_t t = time(0); + struct tm *now = localtime(&t); + + return now->tm_mon; +} \ No newline at end of file diff --git a/Minecraft.World/Calendar.h b/Minecraft.World/Calendar.h new file mode 100644 index 00000000..436c756a --- /dev/null +++ b/Minecraft.World/Calendar.h @@ -0,0 +1,10 @@ +#pragma once + +class Calendar +{ +public: + Calendar(); + + static unsigned int GetDayOfMonth(); + static unsigned int GetMonth(); +}; \ No newline at end of file diff --git a/Minecraft.World/CanyonFeature.cpp b/Minecraft.World/CanyonFeature.cpp index b96c97e0..6d1dda64 100644 --- a/Minecraft.World/CanyonFeature.cpp +++ b/Minecraft.World/CanyonFeature.cpp @@ -9,26 +9,26 @@ void CanyonFeature::addTunnel(__int64 seed, int xOffs, int zOffs, byteArray bloc MemSect(49); Random *random = new Random(seed); MemSect(0); - double xMid = xOffs * 16 + 8; - double zMid = zOffs * 16 + 8; + double xMid = xOffs * 16 + 8; + double zMid = zOffs * 16 + 8; - float yRota = 0; - float xRota = 0; - // int dist = CAVE_RADIUS * 16 - 16; - // if (step>0) dist = step*2; + float yRota = 0; + float xRota = 0; + // int dist = CAVE_RADIUS * 16 - 16; + // if (step>0) dist = step*2; - if (dist <= 0) + if (dist <= 0) { - int max = radius * 16 - 16; - dist = max - random->nextInt(max / 4); - } - bool singleStep = false; + int max = radius * 16 - 16; + dist = max - random->nextInt(max / 4); + } + bool singleStep = false; - if (step == -1) + if (step == -1) { - step = dist / 2; - singleStep = true; - } + step = dist / 2; + singleStep = true; + } float f = 1; for (int i = 0; i < Level::genDepth; i++) @@ -40,94 +40,94 @@ void CanyonFeature::addTunnel(__int64 seed, int xOffs, int zOffs, byteArray bloc rs[i] = f * f; } - for (; step < dist; step++) + for (; step < dist; step++) { - double rad = 1.5 + (Mth::sin(step * PI / dist) * thickness) * 1; - double yRad = rad * yScale; + double rad = 1.5 + (Mth::sin(step * PI / dist) * thickness) * 1; + double yRad = rad * yScale; rad *= (random->nextFloat() * 0.25 + 0.75); yRad *= (random->nextFloat() * 0.25 + 0.75); - float xc = Mth::cos(xRot); - float xs = Mth::sin(xRot); - xCave += Mth::cos(yRot) * xc; - yCave += xs; - zCave += Mth::sin(yRot) * xc; + float xc = Mth::cos(xRot); + float xs = Mth::sin(xRot); + xCave += Mth::cos(yRot) * xc; + yCave += xs; + zCave += Mth::sin(yRot) * xc; xRot *= 0.7f; - xRot += xRota * 0.05f; - yRot += yRota * 0.05f; + xRot += xRota * 0.05f; + yRot += yRota * 0.05f; - xRota *= 0.80f; - yRota *= 0.50f; - xRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 2; - yRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 4; + xRota *= 0.80f; + yRota *= 0.50f; + xRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 2; + yRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 4; - if (!singleStep && random->nextInt(4) == 0) continue; + if (!singleStep && random->nextInt(4) == 0) continue; - { - double xd = xCave - xMid; - double zd = zCave - zMid; - double remaining = dist - step; - double rr = (thickness + 2) + 16; - if (xd * xd + zd * zd - (remaining * remaining) > rr * rr) + { + double xd = xCave - xMid; + double zd = zCave - zMid; + double remaining = dist - step; + double rr = (thickness + 2) + 16; + if (xd * xd + zd * zd - (remaining * remaining) > rr * rr) { delete random; - return; - } - } + return; + } + } - if (xCave < xMid - 16 - rad * 2 || zCave < zMid - 16 - rad * 2 || xCave > xMid + 16 + rad * 2 || zCave > zMid + 16 + rad * 2) continue; + if (xCave < xMid - 16 - rad * 2 || zCave < zMid - 16 - rad * 2 || xCave > xMid + 16 + rad * 2 || zCave > zMid + 16 + rad * 2) continue; - int x0 = Mth::floor(xCave - rad) - xOffs * 16 - 1; - int x1 = Mth::floor(xCave + rad) - xOffs * 16 + 1; + int x0 = Mth::floor(xCave - rad) - xOffs * 16 - 1; + int x1 = Mth::floor(xCave + rad) - xOffs * 16 + 1; - int y0 = Mth::floor(yCave - yRad) - 1; - int y1 = Mth::floor(yCave + yRad) + 1; + int y0 = Mth::floor(yCave - yRad) - 1; + int y1 = Mth::floor(yCave + yRad) + 1; - int z0 = Mth::floor(zCave - rad) - zOffs * 16 - 1; - int z1 = Mth::floor(zCave + rad) - zOffs * 16 + 1; + int z0 = Mth::floor(zCave - rad) - zOffs * 16 - 1; + int z1 = Mth::floor(zCave + rad) - zOffs * 16 + 1; - if (x0 < 0) x0 = 0; - if (x1 > 16) x1 = 16; + if (x0 < 0) x0 = 0; + if (x1 > 16) x1 = 16; - if (y0 < 1) y0 = 1; - if (y1 > Level::genDepth - 8) y1 = Level::genDepth - 8; + if (y0 < 1) y0 = 1; + if (y1 > Level::genDepth - 8) y1 = Level::genDepth - 8; - if (z0 < 0) z0 = 0; - if (z1 > 16) z1 = 16; + if (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; - bool detectedWater = false; - for (int xx = x0; !detectedWater && xx < x1; xx++) + bool detectedWater = false; + for (int xx = x0; !detectedWater && xx < x1; xx++) { - for (int zz = z0; !detectedWater && zz < z1; zz++) + for (int zz = z0; !detectedWater && zz < z1; zz++) { - for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) + for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) { - int p = (xx * 16 + zz) * Level::genDepth + yy; - if (yy < 0 || yy >= Level::genDepth) continue; - if (blocks[p] == Tile::water_Id || blocks[p] == Tile::calmWater_Id) + int p = (xx * 16 + zz) * Level::genDepth + yy; + if (yy < 0 || yy >= Level::genDepth) continue; + if (blocks[p] == Tile::water_Id || blocks[p] == Tile::calmWater_Id) { - detectedWater = true; - } - if (yy != y0 - 1 && xx != x0 && xx != x1 - 1 && zz != z0 && zz != z1 - 1) + detectedWater = true; + } + if (yy != y0 - 1 && xx != x0 && xx != x1 - 1 && zz != z0 && zz != z1 - 1) { - yy = y0; - } - } - } - } - if (detectedWater) continue; - - for (int xx = x0; xx < x1; xx++) + yy = y0; + } + } + } + } + if (detectedWater) continue; + + for (int xx = x0; xx < x1; xx++) { - double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; - for (int zz = z0; zz < z1; zz++) + double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; + for (int zz = z0; zz < z1; zz++) { - double zd = ((zz + zOffs * 16 + 0.5) - zCave) / rad; - int p = (xx * 16 + zz) * Level::genDepth + y1; - bool hasGrass = false; + double zd = ((zz + zOffs * 16 + 0.5) - zCave) / rad; + int p = (xx * 16 + zz) * Level::genDepth + y1; + bool hasGrass = false; if (xd * xd + zd * zd < 1) { for (int yy = y1 - 1; yy >= y0; yy--) @@ -137,7 +137,7 @@ void CanyonFeature::addTunnel(__int64 seed, int xOffs, int zOffs, byteArray bloc { int block = blocks[p]; if (block == Tile::grass_Id) hasGrass = true; - if (block == Tile::rock_Id || block == Tile::dirt_Id || block == Tile::grass_Id) + if (block == Tile::stone_Id || block == Tile::dirt_Id || block == Tile::grass_Id) { if (yy < 10) { @@ -153,20 +153,20 @@ void CanyonFeature::addTunnel(__int64 seed, int xOffs, int zOffs, byteArray bloc p--; } } - } - } - if (singleStep) break; - } + } + } + if (singleStep) break; + } delete random; } void CanyonFeature::addFeature(Level *level, int x, int z, int xOffs, int zOffs, byteArray blocks) { - if (random->nextInt(50) != 0) return; + if (random->nextInt(50) != 0) return; - double xCave = x * 16 + random->nextInt(16); - double yCave = random->nextInt(random->nextInt(40) + 8) + 20; - double zCave = z * 16 + random->nextInt(16); + double xCave = x * 16 + random->nextInt(16); + double yCave = random->nextInt(random->nextInt(40) + 8) + 20; + double zCave = z * 16 + random->nextInt(16); int tunnels = 1; diff --git a/Minecraft.World/CarrotOnAStickItem.cpp b/Minecraft.World/CarrotOnAStickItem.cpp index 9845cc25..3701fce1 100644 --- a/Minecraft.World/CarrotOnAStickItem.cpp +++ b/Minecraft.World/CarrotOnAStickItem.cpp @@ -31,7 +31,7 @@ shared_ptr CarrotOnAStickItem::use(shared_ptr itemIn if (pig->getControlGoal()->canBoost() && itemInstance->getMaxDamage() - itemInstance->getAuxValue() >= 7) { pig->getControlGoal()->boost(); - itemInstance->hurt(7, player); + itemInstance->hurtAndBreak(7, player); if (itemInstance->count == 0) { diff --git a/Minecraft.World/CarrotTile.cpp b/Minecraft.World/CarrotTile.cpp index 3eba830b..677ab78a 100644 --- a/Minecraft.World/CarrotTile.cpp +++ b/Minecraft.World/CarrotTile.cpp @@ -37,6 +37,6 @@ void CarrotTile::registerIcons(IconRegister *iconRegister) { for (int i = 0; i < 4; i++) { - icons[i] = iconRegister->registerIcon(L"carrots_" + _toString(i)); + icons[i] = iconRegister->registerIcon(getIconName() + L"_stage_" + _toString(i)); } } \ No newline at end of file diff --git a/Minecraft.World/CauldronTile.cpp b/Minecraft.World/CauldronTile.cpp index 4d5640ca..f7a8d044 100644 --- a/Minecraft.World/CauldronTile.cpp +++ b/Minecraft.World/CauldronTile.cpp @@ -13,9 +13,9 @@ const wstring CauldronTile::TEXTURE_BOTTOM = L"cauldron_bottom"; CauldronTile::CauldronTile(int id) : Tile(id, Material::metal, isSolidRender()) { - iconInner = NULL; - iconTop = NULL; - iconBottom = NULL; + iconInner = NULL; + iconTop = NULL; + iconBottom = NULL; } Icon *CauldronTile::getTexture(int face, int data) @@ -48,19 +48,19 @@ Icon *CauldronTile::getTexture(const wstring &name) void CauldronTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { - setShape(0, 0, 0, 1, 5.0f / 16.0f, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - float thickness = 2.0f / 16.0f; - setShape(0, 0, 0, thickness, 1, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(0, 0, 0, 1, 1, thickness); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(1 - thickness, 0, 0, 1, 1, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(0, 0, 1 - thickness, 1, 1, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - - updateDefaultShape(); + setShape(0, 0, 0, 1, 5.0f / 16.0f, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + float thickness = 2.0f / 16.0f; + setShape(0, 0, 0, thickness, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(0, 0, 0, 1, 1, thickness); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(1 - thickness, 0, 0, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(0, 0, 1 - thickness, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + + updateDefaultShape(); } void CauldronTile::updateDefaultShape() @@ -87,43 +87,45 @@ bool CauldronTile::use(Level *level, int x, int y, int z, shared_ptr pla { if(soundOnly) return false; - if (level->isClientSide) + if (level->isClientSide) { - return true; - } + return true; + } - shared_ptr item = player->inventory->getSelected(); - if (item == NULL) + shared_ptr item = player->inventory->getSelected(); + if (item == NULL) { - return true; - } + return true; + } - int currentData = level->getData(x, y, z); + int currentData = level->getData(x, y, z); + int fillLevel = getFillLevel(currentData); - if (item->id == Item::bucket_water_Id) + if (item->id == Item::bucket_water_Id) { - if (currentData < 3) + if (fillLevel < 3) { - if (!player->abilities.instabuild) + if (!player->abilities.instabuild) { - player->inventory->setItem(player->inventory->selected, shared_ptr(new ItemInstance(Item::bucket_empty))); - } + player->inventory->setItem(player->inventory->selected, shared_ptr(new ItemInstance(Item::bucket_empty))); + } - level->setData(x, y, z, 3); - } - return true; - } + level->setData(x, y, z, 3, Tile::UPDATE_CLIENTS); + level->updateNeighbourForOutputSignal(x, y, z, id); + } + return true; + } else if (item->id == Item::glassBottle_Id) { - if (currentData > 0) + if (fillLevel > 0) { - shared_ptr potion = shared_ptr(new ItemInstance(Item::potion, 1, 0)); - if (!player->inventory->add(potion)) + shared_ptr potion = shared_ptr(new ItemInstance(Item::potion, 1, 0)); + if (!player->inventory->add(potion)) { - level->addEntity(shared_ptr(new ItemEntity(level, x + 0.5, y + 1.5, z + 0.5, potion))); - } + level->addEntity(shared_ptr(new ItemEntity(level, x + 0.5, y + 1.5, z + 0.5, potion))); + } // 4J Stu - Brought forward change to update inventory when filling bottles with water - else if (dynamic_pointer_cast( player ) != NULL) + else if (player->instanceof(eTYPE_SERVERPLAYER)) { dynamic_pointer_cast( player )->refreshContainer(player->inventoryMenu); } @@ -136,21 +138,23 @@ bool CauldronTile::use(Level *level, int x, int y, int z, shared_ptr pla player->inventory->setItem(player->inventory->selected, nullptr); } } - level->setData(x, y, z, currentData - 1); - } + level->setData(x, y, z, fillLevel - 1, Tile::UPDATE_CLIENTS); + level->updateNeighbourForOutputSignal(x, y, z, id); + } } - else if (currentData > 0) + else if (fillLevel > 0) { ArmorItem *armor = dynamic_cast(item->getItem()); if(armor && armor->getMaterial() == ArmorItem::ArmorMaterial::CLOTH) { armor->clearColor(item); - level->setData(x, y, z, currentData - 1); + level->setData(x, y, z, fillLevel - 1, Tile::UPDATE_CLIENTS); + level->updateNeighbourForOutputSignal(x, y, z, id); return true; } } - return true; + return true; } @@ -162,7 +166,7 @@ void CauldronTile::handleRain(Level *level, int x, int y, int z) if (data < 3) { - level->setData(x, y, z, data + 1); + level->setData(x, y, z, data + 1, Tile::UPDATE_CLIENTS); } } @@ -174,4 +178,21 @@ int CauldronTile::getResource(int data, Random *random, int playerBonusLevel) int CauldronTile::cloneTileId(Level *level, int x, int y, int z) { return Item::cauldron_Id; +} + +bool CauldronTile::hasAnalogOutputSignal() +{ + return true; +} + +int CauldronTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + int data = level->getData(x, y, z); + + return getFillLevel(data); +} + +int CauldronTile::getFillLevel(int data) +{ + return data; } \ No newline at end of file diff --git a/Minecraft.World/CauldronTile.h b/Minecraft.World/CauldronTile.h index 4ed3fc90..dbe5f7b8 100644 --- a/Minecraft.World/CauldronTile.h +++ b/Minecraft.World/CauldronTile.h @@ -7,12 +7,12 @@ class CauldronTile : public Tile { public: static const wstring TEXTURE_INSIDE; - static const wstring TEXTURE_BOTTOM; + static const wstring TEXTURE_BOTTOM; private: Icon *iconInner; - Icon *iconTop; - Icon *iconBottom; + Icon *iconTop; + Icon *iconBottom; public: CauldronTile(int id); @@ -30,4 +30,7 @@ public: virtual void handleRain(Level *level, int x, int y, int z); virtual int getResource(int data, Random *random, int playerBonusLevel); virtual int cloneTileId(Level *level, int x, int y, int z); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); + static int getFillLevel(int data); }; diff --git a/Minecraft.World/CaveFeature.cpp b/Minecraft.World/CaveFeature.cpp index aad92805..698ee3da 100644 --- a/Minecraft.World/CaveFeature.cpp +++ b/Minecraft.World/CaveFeature.cpp @@ -4,35 +4,35 @@ #include "net.minecraft.world.level.tile.h" using namespace std; - bool CaveFeature::place(Level *level, Random *random, int x, int y, int z) - { - float dir = random->nextFloat() * PI; - double rd = 8; +bool CaveFeature::place(Level *level, Random *random, int x, int y, int z) +{ + float dir = random->nextFloat() * PI; + double rd = 8; - double x0 = x + 8 + Mth::sin(dir) * rd; - double x1 = x + 8 - Mth::sin(dir) * rd; - double z0 = z + 8 + Mth::cos(dir) * rd; - double z1 = z + 8 - Mth::cos(dir) * rd; + double x0 = x + 8 + Mth::sin(dir) * rd; + double x1 = x + 8 - Mth::sin(dir) * rd; + double z0 = z + 8 + Mth::cos(dir) * rd; + double z1 = z + 8 - Mth::cos(dir) * rd; - double y0 = y + random->nextInt(8) + 2; - double y1 = y + random->nextInt(8) + 2; + double y0 = y + random->nextInt(8) + 2; + double y1 = y + random->nextInt(8) + 2; - double radius = random->nextDouble() * 4 + 2; - double fuss = random->nextDouble() * 0.6; + double radius = random->nextDouble() * 4 + 2; + double fuss = random->nextDouble() * 0.6; - __int64 seed = random->nextLong(); - random->setSeed(seed); - vector toRemove; + __int64 seed = random->nextLong(); + random->setSeed(seed); + vector toRemove; - for (int d = 0; d <= 16; d++) + for (int d = 0; d <= 16; d++) { - double xx = x0 + (x1 - x0) * d / 16; - double yy = y0 + (y1 - y0) * d / 16; - double zz = z0 + (z1 - z0) * d / 16; + double xx = x0 + (x1 - x0) * d / 16; + double yy = y0 + (y1 - y0) * d / 16; + double zz = z0 + (z1 - z0) * d / 16; - double ss = random->nextDouble(); - double r = (Mth::sin(d / 16.0f * PI) * radius + 1) * ss + 1; - double hr = (Mth::sin(d / 16.0f * PI) * radius + 1) * ss + 1; + double ss = random->nextDouble(); + double r = (Mth::sin(d / 16.0f * PI) * radius + 1) * ss + 1; + double hr = (Mth::sin(d / 16.0f * PI) * radius + 1) * ss + 1; // 4J Stu Added to stop cave features generating areas previously place by game rule generation if(app.getLevelGenerationOptions() != NULL) @@ -46,47 +46,47 @@ using namespace std; } } - for (int x2 = (int) (xx - r / 2); x2 <= (int) (xx + r / 2); x2++) - for (int y2 = (int) (yy - hr / 2); y2 <= (int) (yy + hr / 2); y2++) - for (int z2 = (int) (zz - r / 2); z2 <= (int) (zz + r / 2); z2++) + for (int x2 = (int) (xx - r / 2); x2 <= (int) (xx + r / 2); x2++) + for (int y2 = (int) (yy - hr / 2); y2 <= (int) (yy + hr / 2); y2++) + for (int z2 = (int) (zz - r / 2); z2 <= (int) (zz + r / 2); z2++) { - double xd = ((x2 + 0.5) - xx) / (r / 2); - double yd = ((y2 + 0.5) - yy) / (hr / 2); - double zd = ((z2 + 0.5) - zz) / (r / 2); - if (xd * xd + yd * yd + zd * zd < random->nextDouble() * fuss + (1 - fuss)) + double xd = ((x2 + 0.5) - xx) / (r / 2); + double yd = ((y2 + 0.5) - yy) / (hr / 2); + double zd = ((z2 + 0.5) - zz) / (r / 2); + if (xd * xd + yd * yd + zd * zd < random->nextDouble() * fuss + (1 - fuss)) { - if (!level->isEmptyTile(x2, y2, z2)) + if (!level->isEmptyTile(x2, y2, z2)) { - for (int x3 = (x2 - 2); x3 <= (x2 + 1); x3++) - for (int y3 = (y2 - 1); y3 <= (y2 + 1); y3++) - for (int z3 = (z2 - 1); z3 <= (z2 + 1); z3++) + for (int x3 = (x2 - 2); x3 <= (x2 + 1); x3++) + for (int y3 = (y2 - 1); y3 <= (y2 + 1); y3++) + for (int z3 = (z2 - 1); z3 <= (z2 + 1); z3++) { - if (x3 <= x || z3 <= z || x3 >= x + 16 - 1 || z3 >= z + 16 - 1) return false; - if (level->getMaterial(x3, y3, z3)->isLiquid()) return false; - } - toRemove.push_back(new TilePos(x2, y2, z2)); - } - } - } - } - + if (x3 <= x || z3 <= z || x3 >= x + 16 - 1 || z3 >= z + 16 - 1) return false; + if (level->getMaterial(x3, y3, z3)->isLiquid()) return false; + } + toRemove.push_back(new TilePos(x2, y2, z2)); + } + } + } + } + AUTO_VAR(itEnd, toRemove.end()); for (AUTO_VAR(it, toRemove.begin()); it != itEnd; it++) { - TilePos *p = *it; //toRemove[i]; - level->setTileNoUpdate(p->x, p->y, p->z, 0); - } - + TilePos *p = *it; //toRemove[i]; + level->setTileAndData(p->x, p->y, p->z, 0, 0, Tile::UPDATE_CLIENTS); + } + itEnd = toRemove.end(); for (AUTO_VAR(it, toRemove.begin()); it != itEnd; it++) { - TilePos *p = *it; //toRemove[i]; - if (level->getTile(p->x, p->y - 1, p->z) == Tile::dirt_Id && level->getDaytimeRawBrightness(p->x, p->y, p->z) > 8) + TilePos *p = *it; //toRemove[i]; + if (level->getTile(p->x, p->y - 1, p->z) == Tile::dirt_Id && level->getDaytimeRawBrightness(p->x, p->y, p->z) > 8) { - level->setTileNoUpdate(p->x, p->y - 1, p->z, Tile::grass_Id); - } + level->setTileAndData(p->x, p->y - 1, p->z, Tile::grass_Id, 0, Tile::UPDATE_CLIENTS); + } delete p; - } + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/CaveSpider.cpp b/Minecraft.World/CaveSpider.cpp index 5f7c6028..d9396c43 100644 --- a/Minecraft.World/CaveSpider.cpp +++ b/Minecraft.World/CaveSpider.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" #include "SharedConstants.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.effect.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.h" @@ -11,28 +13,23 @@ CaveSpider::CaveSpider(Level *level) : Spider(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); - this->textureIdx = TN_MOB_CAVE_SPIDER; // 4J was "/mob/cavespider.png"; this->setSize(0.7f, 0.5f); } -int CaveSpider::getMaxHealth() +void CaveSpider::registerAttributes() { - return 12; -} + Spider::registerAttributes(); -float CaveSpider::getModelScale() -{ - return .7f; + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(12); } - bool CaveSpider::doHurtTarget(shared_ptr target) { if (Spider::doHurtTarget(target)) { - if ( dynamic_pointer_cast(target) != NULL) + if ( target->instanceof(eTYPE_LIVINGENTITY) ) { int poisonTime = 0; if (level->difficulty <= Difficulty::EASY) @@ -48,8 +45,9 @@ bool CaveSpider::doHurtTarget(shared_ptr target) poisonTime = 15; } - if (poisonTime > 0) { - dynamic_pointer_cast(target)->addEffect(new MobEffectInstance(MobEffect::poison->id, poisonTime * SharedConstants::TICKS_PER_SECOND, 0)); + if (poisonTime > 0) + { + dynamic_pointer_cast(target)->addEffect(new MobEffectInstance(MobEffect::poison->id, poisonTime * SharedConstants::TICKS_PER_SECOND, 0)); } } @@ -58,7 +56,8 @@ bool CaveSpider::doHurtTarget(shared_ptr target) return false; } -void CaveSpider::finalizeMobSpawn() +MobGroupData *CaveSpider::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param { // do nothing + return groupData; } \ No newline at end of file diff --git a/Minecraft.World/CaveSpider.h b/Minecraft.World/CaveSpider.h index 26f07e5f..79824e68 100644 --- a/Minecraft.World/CaveSpider.h +++ b/Minecraft.World/CaveSpider.h @@ -4,15 +4,17 @@ class CaveSpider : public Spider { - public: - eINSTANCEOF GetType() { return eTYPE_CAVESPIDER; } - static Entity *create(Level *level) { return new CaveSpider(level); } +public: + eINSTANCEOF GetType() { return eTYPE_CAVESPIDER; } + static Entity *create(Level *level) { return new CaveSpider(level); } - public: - CaveSpider(Level *level); +public: + CaveSpider(Level *level); - virtual int getMaxHealth(); - virtual float getModelScale(); - virtual bool doHurtTarget(shared_ptr target); - void finalizeMobSpawn(); +protected: + void registerAttributes(); + +public: + virtual bool doHurtTarget(shared_ptr target); + MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param }; \ No newline at end of file diff --git a/Minecraft.World/ChatPacket.cpp b/Minecraft.World/ChatPacket.cpp index 140de15d..2988962e 100644 --- a/Minecraft.World/ChatPacket.cpp +++ b/Minecraft.World/ChatPacket.cpp @@ -13,13 +13,31 @@ ChatPacket::ChatPacket() m_messageType = e_ChatCustom; } -// Old chat packet constructor, adds message, custom data and additional message to arg vectors -ChatPacket::ChatPacket(const wstring& message, EChatPacketMessage type /*= e_ChatCustom*/, int customData /*= -1*/, const wstring& additionalMessage /*= L""*/) +ChatPacket::ChatPacket(const wstring& message, EChatPacketMessage type /*= e_ChatCustom*/, int customData /*= -1*/) { m_messageType = type; if (customData != -1) m_intArgs.push_back(customData); - if (message != L"" || additionalMessage != L"") m_stringArgs.push_back(message); - if (additionalMessage != L"") m_stringArgs.push_back(additionalMessage); + + m_stringArgs.push_back(message); +} + +ChatPacket::ChatPacket(const wstring& message, EChatPacketMessage type, int sourceEntityType, const wstring& sourceName) +{ + m_messageType = type; + if (sourceEntityType != -1) m_intArgs.push_back(sourceEntityType); + + m_stringArgs.push_back(message); + m_stringArgs.push_back(sourceName); +} + +ChatPacket::ChatPacket(const wstring& message, EChatPacketMessage type, int sourceEntityType, const wstring& sourceName, const wstring& itemName) +{ + m_messageType = type; + if (sourceEntityType != -1) m_intArgs.push_back(sourceEntityType); + + m_stringArgs.push_back(message); + m_stringArgs.push_back(sourceName); + m_stringArgs.push_back(itemName); } // Read chat packet (throws IOException) @@ -56,7 +74,7 @@ void ChatPacket::write(DataOutputStream *dos) for(int i = 0; i < m_stringArgs.size(); i++) { writeUtf(m_stringArgs[i], dos); -} + } for(int i = 0; i < m_intArgs.size(); i++) { diff --git a/Minecraft.World/ChatPacket.h b/Minecraft.World/ChatPacket.h index c480dfd0..ca9e4955 100644 --- a/Minecraft.World/ChatPacket.h +++ b/Minecraft.World/ChatPacket.h @@ -5,7 +5,7 @@ using namespace std; class ChatPacket : public Packet, public enable_shared_from_this { - // longest allowed string is "<" + name + "> " + message + // longest allowed string is "<" + name + "> " + message private: static const unsigned int MAX_LENGTH; @@ -46,11 +46,32 @@ public: e_ChatDeathThrown, e_ChatDeathIndirectMagic, e_ChatDeathDragonBreath, - e_ChatDeathWither, e_ChatDeathAnvil, e_ChatDeathFallingBlock, e_ChatDeathThorns, + e_ChatDeathFellAccidentLadder, + e_ChatDeathFellAccidentVines, + e_ChatDeathFellAccidentWater, + e_ChatDeathFellAccidentGeneric, + e_ChatDeathFellKiller, + e_ChatDeathFellAssist, + e_ChatDeathFellAssistItem, + e_ChatDeathFellFinish, + e_ChatDeathFellFinishItem, + e_ChatDeathInFirePlayer, + e_ChatDeathOnFirePlayer, + e_ChatDeathLavaPlayer, + e_ChatDeathDrownPlayer, + e_ChatDeathCactusPlayer, + e_ChatDeathExplosionPlayer, + e_ChatDeathWither, + e_ChatDeathPlayerItem, + e_ChatDeathArrowItem, + e_ChatDeathFireballItem, + e_ChatDeathThrownItem, + e_ChatDeathIndirectMagicItem, + e_ChatPlayerEnteredEnd, e_ChatPlayerLeftEnd, @@ -71,6 +92,7 @@ public: e_ChatPlayerMaxBredWolves, // Tell the player they can't put this wolf in love mode because no breeding can be done e_ChatPlayerCantShearMooshroom, // Tell the player they can't shear because the limits have been reached e_ChatPlayerMaxBoats, + e_ChatPlayerMaxBats, e_ChatCommandTeleportSuccess, e_ChatCommandTeleportMe, @@ -84,7 +106,12 @@ public: EChatPacketMessage m_messageType; ChatPacket(); - ChatPacket(const wstring& message, EChatPacketMessage type = e_ChatCustom, int customData = -1, const wstring& additionalMessage = L""); + + // 4J: Seperated the one convoluted ctor into three more readable ctors. The last two ctors are only used for death messages and I'd really + // like to consolodate them and/or the logic that uses them at some point. + ChatPacket(const wstring& message, EChatPacketMessage type = e_ChatCustom, int customData = -1); + ChatPacket(const wstring& message, EChatPacketMessage type, int sourceEntityType, const wstring& sourceName); + ChatPacket(const wstring& message, EChatPacketMessage type, int sourceEntityType, const wstring& sourceName, const wstring& itemName); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/ChestTile.cpp b/Minecraft.World/ChestTile.cpp index b7964e72..a4894c86 100644 --- a/Minecraft.World/ChestTile.cpp +++ b/Minecraft.World/ChestTile.cpp @@ -2,17 +2,19 @@ #include "net.minecraft.world.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.entity.animal.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.phys.h" #include "ChestTile.h" #include "Facing.h" -#include "Ozelot.h" -ChestTile::ChestTile(int id) : EntityTile(id, Material::wood, isSolidRender() ) +ChestTile::ChestTile(int id, int type) : BaseEntityTile(id, Material::wood, isSolidRender() ) { random = new Random(); + this->type = type; setShape(1 / 16.0f, 0, 1 / 16.0f, 15 / 16.0f, 14 / 16.0f, 15 / 16.0f); } @@ -63,150 +65,155 @@ void ChestTile::updateShape(LevelSource *level, int x, int y, int z, int forceDa void ChestTile::onPlace(Level *level, int x, int y, int z) { - EntityTile::onPlace(level, x, y, z); - recalcLockDir(level, x, y, z); - - int n = level->getTile(x, y, z - 1); // face = 2 - int s = level->getTile(x, y, z + 1); // face = 3 - int w = level->getTile(x - 1, y, z); // face = 4 - int e = level->getTile(x + 1, y, z); // face = 5 - if (n == id) recalcLockDir(level, x, y, z - 1); - if (s == id) recalcLockDir(level, x, y, z + 1); - if (w == id) recalcLockDir(level, x - 1, y, z); - if (e == id) recalcLockDir(level, x + 1, y, z); + BaseEntityTile::onPlace(level, x, y, z); + recalcLockDir(level, x, y, z); + + int n = level->getTile(x, y, z - 1); // face = 2 + int s = level->getTile(x, y, z + 1); // face = 3 + int w = level->getTile(x - 1, y, z); // face = 4 + int e = level->getTile(x + 1, y, z); // face = 5 + if (n == id) recalcLockDir(level, x, y, z - 1); + if (s == id) recalcLockDir(level, x, y, z + 1); + if (w == id) recalcLockDir(level, x - 1, y, z); + if (e == id) recalcLockDir(level, x + 1, y, z); } -void ChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void ChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { - int n = level->getTile(x, y, z - 1); // face = 2 - int s = level->getTile(x, y, z + 1); // face = 3 - int w = level->getTile(x - 1, y, z); // face = 4 - int e = level->getTile(x + 1, y, z); // face = 5 + int n = level->getTile(x, y, z - 1); // face = 2 + int s = level->getTile(x, y, z + 1); // face = 3 + int w = level->getTile(x - 1, y, z); // face = 4 + int e = level->getTile(x + 1, y, z); // face = 5 - int facing = 0; - int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3; + int facing = 0; + int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3; - if (dir == 0) facing = Facing::NORTH; - if (dir == 1) facing = Facing::EAST; - if (dir == 2) facing = Facing::SOUTH; - if (dir == 3) facing = Facing::WEST; + if (dir == 0) facing = Facing::NORTH; + if (dir == 1) facing = Facing::EAST; + if (dir == 2) facing = Facing::SOUTH; + if (dir == 3) facing = Facing::WEST; - if (n != id && s != id && w != id && e != id) + if (n != id && s != id && w != id && e != id) { - level->setData(x, y, z, facing); - } + level->setData(x, y, z, facing, Tile::UPDATE_ALL); + } else { - if ((n == id || s == id) && (facing == Facing::WEST || facing == Facing::EAST)) + if ((n == id || s == id) && (facing == Facing::WEST || facing == Facing::EAST)) { - if (n == id) level->setData(x, y, z - 1, facing); - else level->setData(x, y, z + 1, facing); - level->setData(x, y, z, facing); - } - if ((w == id || e == id) && (facing == Facing::NORTH || facing == Facing::SOUTH)) + if (n == id) level->setData(x, y, z - 1, facing, Tile::UPDATE_ALL); + else level->setData(x, y, z + 1, facing, Tile::UPDATE_ALL); + level->setData(x, y, z, facing, Tile::UPDATE_ALL); + } + if ((w == id || e == id) && (facing == Facing::NORTH || facing == Facing::SOUTH)) { - if (w == id) level->setData(x - 1, y, z, facing); - else level->setData(x + 1, y, z, facing); - level->setData(x, y, z, facing); - } - } + if (w == id) level->setData(x - 1, y, z, facing, Tile::UPDATE_ALL); + else level->setData(x + 1, y, z, facing, Tile::UPDATE_ALL); + level->setData(x, y, z, facing, Tile::UPDATE_ALL); + } + } + + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } } void ChestTile::recalcLockDir(Level *level, int x, int y, int z) { - if (level->isClientSide) + if (level->isClientSide) { - return; - } + return; + } - int n = level->getTile(x, y, z - 1); // face = 2 - int s = level->getTile(x, y, z + 1); // face = 3 - int w = level->getTile(x - 1, y, z); // face = 4 - int e = level->getTile(x + 1, y, z); // face = 5 + int n = level->getTile(x, y, z - 1); // face = 2 + int s = level->getTile(x, y, z + 1); // face = 3 + int w = level->getTile(x - 1, y, z); // face = 4 + int e = level->getTile(x + 1, y, z); // face = 5 - // Long! - int lockDir = 4; - if (n == id || s == id) + // Long! + int lockDir = 4; + if (n == id || s == id) { - int w2 = level->getTile(x - 1, y, n == id ? z - 1 : z + 1); - int e2 = level->getTile(x + 1, y, n == id ? z - 1 : z + 1); + int w2 = level->getTile(x - 1, y, n == id ? z - 1 : z + 1); + int e2 = level->getTile(x + 1, y, n == id ? z - 1 : z + 1); - lockDir = 5; + lockDir = 5; - int otherDir = -1; - if (n == id) otherDir = level->getData(x, y, z - 1); - else otherDir = level->getData(x, y, z + 1); - if (otherDir == 4) lockDir = 4; + int otherDir = -1; + if (n == id) otherDir = level->getData(x, y, z - 1); + else otherDir = level->getData(x, y, z + 1); + if (otherDir == 4) lockDir = 4; - if ((Tile::solid[w] || Tile::solid[w2]) && !Tile::solid[e] && !Tile::solid[e2]) lockDir = 5; - if ((Tile::solid[e] || Tile::solid[e2]) && !Tile::solid[w] && !Tile::solid[w2]) lockDir = 4; - } + if ((Tile::solid[w] || Tile::solid[w2]) && !Tile::solid[e] && !Tile::solid[e2]) lockDir = 5; + if ((Tile::solid[e] || Tile::solid[e2]) && !Tile::solid[w] && !Tile::solid[w2]) lockDir = 4; + } else if (w == id || e == id) { - int n2 = level->getTile(w == id ? x - 1 : x + 1, y, z - 1); - int s2 = level->getTile(w == id ? x - 1 : x + 1, y, z + 1); - - lockDir = 3; - int otherDir = -1; - if (w == id) otherDir = level->getData(x - 1, y, z); - else otherDir = level->getData(x + 1, y, z); - if (otherDir == 2) lockDir = 2; - - if ((Tile::solid[n] || Tile::solid[n2]) && !Tile::solid[s] && !Tile::solid[s2]) lockDir = 3; - if ((Tile::solid[s] || Tile::solid[s2]) && !Tile::solid[n] && !Tile::solid[n2]) lockDir = 2; - } + int n2 = level->getTile(w == id ? x - 1 : x + 1, y, z - 1); + int s2 = level->getTile(w == id ? x - 1 : x + 1, y, z + 1); + + lockDir = 3; + int otherDir = -1; + if (w == id) otherDir = level->getData(x - 1, y, z); + else otherDir = level->getData(x + 1, y, z); + if (otherDir == 2) lockDir = 2; + + if ((Tile::solid[n] || Tile::solid[n2]) && !Tile::solid[s] && !Tile::solid[s2]) lockDir = 3; + if ((Tile::solid[s] || Tile::solid[s2]) && !Tile::solid[n] && !Tile::solid[n2]) lockDir = 2; + } else { - lockDir = 3; - if (Tile::solid[n] && !Tile::solid[s]) lockDir = 3; - if (Tile::solid[s] && !Tile::solid[n]) lockDir = 2; - if (Tile::solid[w] && !Tile::solid[e]) lockDir = 5; - if (Tile::solid[e] && !Tile::solid[w]) lockDir = 4; - } - - level->setData(x, y, z, lockDir); + lockDir = 3; + if (Tile::solid[n] && !Tile::solid[s]) lockDir = 3; + if (Tile::solid[s] && !Tile::solid[n]) lockDir = 2; + if (Tile::solid[w] && !Tile::solid[e]) lockDir = 5; + if (Tile::solid[e] && !Tile::solid[w]) lockDir = 4; + } + + level->setData(x, y, z, lockDir, Tile::UPDATE_ALL); } bool ChestTile::mayPlace(Level *level, int x, int y, int z) { - int chestCount = 0; + int chestCount = 0; - if (level->getTile(x - 1, y, z) == id) chestCount++; - if (level->getTile(x + 1, y, z) == id) chestCount++; - if (level->getTile(x, y, z - 1) == id) chestCount++; - if (level->getTile(x, y, z + 1) == id) chestCount++; + if (level->getTile(x - 1, y, z) == id) chestCount++; + if (level->getTile(x + 1, y, z) == id) chestCount++; + if (level->getTile(x, y, z - 1) == id) chestCount++; + if (level->getTile(x, y, z + 1) == id) chestCount++; - if (chestCount > 1) return false; + if (chestCount > 1) return false; - if (isFullChest(level, x - 1, y, z)) return false; - if (isFullChest(level, x + 1, y, z)) return false; - if (isFullChest(level, x, y, z - 1)) return false; - if (isFullChest(level, x, y, z + 1)) return false; - return true; + if (isFullChest(level, x - 1, y, z)) return false; + if (isFullChest(level, x + 1, y, z)) return false; + if (isFullChest(level, x, y, z - 1)) return false; + if (isFullChest(level, x, y, z + 1)) return false; + return true; } bool ChestTile::isFullChest(Level *level, int x, int y, int z) { - if (level->getTile(x, y, z) != id) return false; - if (level->getTile(x - 1, y, z) == id) return true; - if (level->getTile(x + 1, y, z) == id) return true; - if (level->getTile(x, y, z - 1) == id) return true; - if (level->getTile(x, y, z + 1) == id) return true; - return false; + if (level->getTile(x, y, z) != id) return false; + if (level->getTile(x - 1, y, z) == id) return true; + if (level->getTile(x + 1, y, z) == id) return true; + if (level->getTile(x, y, z - 1) == id) return true; + if (level->getTile(x, y, z + 1) == id) return true; + return false; } void ChestTile::neighborChanged(Level *level, int x, int y, int z, int type) { - EntityTile::neighborChanged(level, x, y, z, type); - shared_ptr(cte) = dynamic_pointer_cast(level->getTileEntity(x, y, z)); - if (cte != NULL) cte->clearCache(); + BaseEntityTile::neighborChanged(level, x, y, z, type); + shared_ptr(cte) = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + if (cte != NULL) cte->clearCache(); } void ChestTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if (container != NULL ) { for (unsigned int i = 0; i < container->getContainerSize(); i++) @@ -231,10 +238,10 @@ void ChestTile::onRemove(Level *level, int x, int y, int z, int id, int data) itemEntity->xd = (float) random->nextGaussian() * pow; itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; itemEntity->zd = (float) random->nextGaussian() * pow; - if (item->hasTag()) + if (item->hasTag()) { - itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); - } + itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); + } level->addEntity(itemEntity); } @@ -243,8 +250,9 @@ void ChestTile::onRemove(Level *level, int x, int y, int z, int id, int data) container->setItem(i,nullptr); } } + level->updateNeighbourForOutputSignal(x, y, z, id); } - EntityTile::onRemove(level, x, y, z, id, data); + BaseEntityTile::onRemove(level, x, y, z, id, data); } // 4J-PB - Adding a TestUse for tooltip display @@ -258,59 +266,103 @@ bool ChestTile::use(Level *level, int x, int y, int z, shared_ptr player { if( soundOnly ) return true; - if (level->isClientSide) + if (level->isClientSide) { - return true; - } + return true; + } + shared_ptr container = getContainer(level, x, y, z); + + if (container != NULL) + { + player->openContainer(container); + } + + return true; +} + +shared_ptr ChestTile::getContainer(Level *level, int x, int y, int z) +{ + shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + if (container == NULL) return nullptr; + + if (level->isSolidBlockingTile(x, y + 1, z)) return nullptr; + if (isCatSittingOnChest(level,x, y, z)) return nullptr; + + if (level->getTile(x - 1, y, z) == id && (level->isSolidBlockingTile(x - 1, y + 1, z) || isCatSittingOnChest(level, x - 1, y, z))) return nullptr; + if (level->getTile(x + 1, y, z) == id && (level->isSolidBlockingTile(x + 1, y + 1, z) || isCatSittingOnChest(level, x + 1, y, z))) return nullptr; + if (level->getTile(x, y, z - 1) == id && (level->isSolidBlockingTile(x, y + 1, z - 1) || isCatSittingOnChest(level, x, y, z - 1))) return nullptr; + if (level->getTile(x, y, z + 1) == id && (level->isSolidBlockingTile(x, y + 1, z + 1) || isCatSittingOnChest(level, x, y, z + 1))) return nullptr; + + if (level->getTile(x - 1, y, z) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x - 1, y, z) ), container) ); + if (level->getTile(x + 1, y, z) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x + 1, y, z) )) ); + if (level->getTile(x, y, z - 1) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x, y, z - 1) ), container) ); + if (level->getTile(x, y, z + 1) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x, y, z + 1) )) ); - shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); - if (container == NULL) return true; + return container; +} - if (level->isSolidBlockingTile(x, y + 1, z)) return true; - if (isCatSittingOnChest(level,x, y, z)) return true; +shared_ptr ChestTile::newTileEntity(Level *level) +{ + MemSect(50); + shared_ptr retval = shared_ptr( new ChestTileEntity() ); + MemSect(0); + return retval; +} - if (level->getTile(x - 1, y, z) == id && (level->isSolidBlockingTile(x - 1, y + 1, z) || isCatSittingOnChest(level, x - 1, y, z))) return true; - if (level->getTile(x + 1, y, z) == id && (level->isSolidBlockingTile(x + 1, y + 1, z) || isCatSittingOnChest(level, x + 1, y, z))) return true; - if (level->getTile(x, y, z - 1) == id && (level->isSolidBlockingTile(x, y + 1, z - 1) || isCatSittingOnChest(level, x, y, z - 1))) return true; - if (level->getTile(x, y, z + 1) == id && (level->isSolidBlockingTile(x, y + 1, z + 1) || isCatSittingOnChest(level, x, y, z + 1))) return true; +bool ChestTile::isSignalSource() +{ + return type == TYPE_TRAP; +} - if (level->getTile(x - 1, y, z) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x - 1, y, z) ), container) ); - if (level->getTile(x + 1, y, z) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x + 1, y, z) )) ); - if (level->getTile(x, y, z - 1) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, dynamic_pointer_cast( level->getTileEntity(x, y, z - 1) ), container) ); - if (level->getTile(x, y, z + 1) == id) container = shared_ptr( new CompoundContainer(IDS_CHEST_LARGE, container, dynamic_pointer_cast( level->getTileEntity(x, y, z + 1) )) ); +int ChestTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +{ + if (!isSignalSource()) return Redstone::SIGNAL_NONE; - player->openContainer(container); + int openCount = dynamic_pointer_cast( level->getTileEntity(x, y, z))->openCount; + return Mth::clamp(openCount, Redstone::SIGNAL_NONE, Redstone::SIGNAL_MAX); +} - return true; +int ChestTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) +{ + if (dir == Facing::UP) + { + return getSignal(level, x, y, z, dir); + } + else + { + return Redstone::SIGNAL_NONE; + } } -// 4J-PB - added from 1.5 bool ChestTile::isCatSittingOnChest(Level *level, int x, int y, int z) { - vector > *entities = level->getEntitiesOfClass(typeid(Ozelot), AABB::newTemp(x, y + 1, z, x + 1, y + 2, z + 1)); + vector > *entities = level->getEntitiesOfClass(typeid(Ocelot), AABB::newTemp(x, y + 1, z, x + 1, y + 2, z + 1)); for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - shared_ptr ocelot = dynamic_pointer_cast(*it); + shared_ptr ocelot = dynamic_pointer_cast(*it); if(ocelot->isSitting()) { + delete entities; return true; } } - + delete entities; return false; } -shared_ptr ChestTile::newTileEntity(Level *level) +bool ChestTile::hasAnalogOutputSignal() { - MemSect(50); - shared_ptr retval = shared_ptr( new ChestTileEntity() ); - MemSect(0); - return retval; + return true; +} + +int ChestTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + return AbstractContainerMenu::getRedstoneSignalFromContainer(getContainer(level, x, y, z)); } void ChestTile::registerIcons(IconRegister *iconRegister) { // Register wood as the chest's icon, because it's used by the particles // when destroying the chest - icon = iconRegister->registerIcon(L"wood"); + icon = iconRegister->registerIcon(L"planks_oak"); } diff --git a/Minecraft.World/ChestTile.h b/Minecraft.World/ChestTile.h index ee2185cb..4fefeea9 100644 --- a/Minecraft.World/ChestTile.h +++ b/Minecraft.World/ChestTile.h @@ -1,38 +1,60 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" #include "Material.h" class Player; class Random; -class ChestTile : public EntityTile +class ChestTile : public BaseEntityTile { friend class Tile; + friend class Minecraft; + public: + static const int TYPE_BASIC = 0; + static const int TYPE_TRAP = 1; + static const int EVENT_SET_OPEN_COUNT = 1; + private: Random *random; + +public: + int type; + protected: - ChestTile(int id); + ChestTile(int id, int type); ~ChestTile(); + public: virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); virtual int getRenderShape(); virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity = shared_ptr()); virtual void onPlace(Level *level, int x, int y, int z); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); void recalcLockDir(Level *level, int x, int y, int z); - virtual bool mayPlace(Level *level, int x, int y, int z); + virtual bool mayPlace(Level *level, int x, int y, int z); + private: bool isFullChest(Level *level, int x, int y, int z); - bool isCatSittingOnChest(Level *level, int x, int y, int z); + public: virtual void neighborChanged(Level *level, int x, int y, int z, int type); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); virtual bool TestUse(); virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - shared_ptr newTileEntity(Level *level); - //@Override - void registerIcons(IconRegister *iconRegister); + virtual shared_ptr getContainer(Level *level, int x, int y, int z); + virtual shared_ptr newTileEntity(Level *level); + virtual bool isSignalSource(); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); + +private: + bool isCatSittingOnChest(Level *level, int x, int y, int z); + +public: + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); + virtual void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/ChestTileEntity.cpp b/Minecraft.World/ChestTileEntity.cpp index 406b81b5..39f957bd 100644 --- a/Minecraft.World/ChestTileEntity.cpp +++ b/Minecraft.World/ChestTileEntity.cpp @@ -1,19 +1,25 @@ -using namespace std; - #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.world.h" #include "net.minecraft.world.level.h" #include "TileEntity.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.inventory.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" #include "ChestTileEntity.h" +#include "ContainerOpenPacket.h" #include "SoundTypes.h" +int ChestTileEntity::getContainerType() +{ + if (isBonusChest) return ContainerOpenPacket::BONUS_CHEST; + else return ContainerOpenPacket::CONTAINER; +} - -ChestTileEntity::ChestTileEntity(bool isBonusChest/* = false*/) : TileEntity() +void ChestTileEntity::_init(bool isBonusChest) { items = new ItemInstanceArray(9 * 4); @@ -24,6 +30,21 @@ ChestTileEntity::ChestTileEntity(bool isBonusChest/* = false*/) : TileEntity() oOpenness = 0.0f; openCount = 0; tickInterval = 0; + + type = -1; + name = L""; +} + +ChestTileEntity::ChestTileEntity(bool isBonusChest/* = false*/) : TileEntity() +{ + _init(isBonusChest); +} + +ChestTileEntity::ChestTileEntity(int type, bool isBonusChest/* = false*/) : TileEntity() +{ + _init(isBonusChest); + + this->type = type; } ChestTileEntity::~ChestTileEntity() @@ -50,7 +71,7 @@ shared_ptr ChestTileEntity::removeItem(unsigned int slot, int coun { shared_ptr item = items->data[slot]; items->data[slot] = nullptr; - this->setChanged(); + setChanged(); // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; @@ -59,7 +80,7 @@ shared_ptr ChestTileEntity::removeItem(unsigned int slot, int coun { shared_ptr i = items->data[slot]->remove(count); if (items->data[slot]->count == 0) items->data[slot] = nullptr; - this->setChanged(); + setChanged(); // 4J Stu - Fix for duplication glitch if(i->count <= 0) return nullptr; return i; @@ -86,11 +107,25 @@ void ChestTileEntity::setItem(unsigned int slot, shared_ptr item) this->setChanged(); } -int ChestTileEntity::getName() +wstring ChestTileEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_TILE_CHEST); +} + +wstring ChestTileEntity::getCustomName() { - return IDS_TILE_CHEST; + return hasCustomName() ? name : L""; } +bool ChestTileEntity::hasCustomName() +{ + return !name.empty(); +} + +void ChestTileEntity::setCustomName(const wstring &name) +{ + this->name = name; +} void ChestTileEntity::load(CompoundTag *base) { @@ -102,6 +137,7 @@ void ChestTileEntity::load(CompoundTag *base) delete items; } items = new ItemInstanceArray(getContainerSize()); + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); for (int i = 0; i < inventoryList->size(); i++) { CompoundTag *tag = inventoryList->get(i); @@ -127,6 +163,7 @@ void ChestTileEntity::save(CompoundTag *base) } } base->put(L"Items", listTag); + if (hasCustomName()) base->putString(L"CustomName", name); base->putBoolean(L"bonus", isBonusChest); } @@ -149,127 +186,217 @@ void ChestTileEntity::setChanged() void ChestTileEntity::clearCache() { - TileEntity::clearCache(); - hasCheckedNeighbors = false; + TileEntity::clearCache(); + hasCheckedNeighbors = false; +} + +void ChestTileEntity::heyImYourNeighbor(shared_ptr neighbor, int from) +{ + if (neighbor->isRemoved()) + { + hasCheckedNeighbors = false; + } + else if (hasCheckedNeighbors) + { + switch (from) + { + case Direction::NORTH: + if (n.lock() != neighbor) hasCheckedNeighbors = false; + break; + case Direction::SOUTH: + if (s.lock() != neighbor) hasCheckedNeighbors = false; + break; + case Direction::EAST: + if (e.lock() != neighbor) hasCheckedNeighbors = false; + break; + case Direction::WEST: + if (w.lock() != neighbor) hasCheckedNeighbors = false; + break; + } + } } void ChestTileEntity::checkNeighbors() { - if (hasCheckedNeighbors) return; + if (hasCheckedNeighbors) return; - hasCheckedNeighbors = true; - n = weak_ptr(); - e = weak_ptr(); - w = weak_ptr(); - s = weak_ptr(); + hasCheckedNeighbors = true; + n = weak_ptr(); + e = weak_ptr(); + w = weak_ptr(); + s = weak_ptr(); - if (level->getTile(x - 1, y, z) == Tile::chest_Id) + if (isSameChest(x - 1, y, z)) { - w = dynamic_pointer_cast(level->getTileEntity(x - 1, y, z)); - } - if (level->getTile(x + 1, y, z) == Tile::chest_Id) + w = dynamic_pointer_cast(level->getTileEntity(x - 1, y, z)); + } + if (isSameChest(x + 1, y, z)) { - e = dynamic_pointer_cast(level->getTileEntity(x + 1, y, z)); - } - if (level->getTile(x, y, z - 1) == Tile::chest_Id) + e = dynamic_pointer_cast(level->getTileEntity(x + 1, y, z)); + } + if (isSameChest(x, y, z - 1)) { - n = dynamic_pointer_cast(level->getTileEntity(x, y, z - 1)); - } - if (level->getTile(x, y, z + 1) == Tile::chest_Id) + n = dynamic_pointer_cast(level->getTileEntity(x, y, z - 1)); + } + if (isSameChest(x, y, z + 1)) { - s = dynamic_pointer_cast(level->getTileEntity(x, y, z + 1)); - } + s = dynamic_pointer_cast(level->getTileEntity(x, y, z + 1)); + } - if (n.lock() != NULL) n.lock()->clearCache(); - if (s.lock() != NULL) s.lock()->clearCache(); - if (e.lock() != NULL) e.lock()->clearCache(); - if (w.lock() != NULL) w.lock()->clearCache(); + shared_ptr cteThis = dynamic_pointer_cast(shared_from_this()); + if (n.lock() != NULL) n.lock()->heyImYourNeighbor(cteThis, Direction::SOUTH); + if (s.lock() != NULL) s.lock()->heyImYourNeighbor(cteThis, Direction::NORTH); + if (e.lock() != NULL) e.lock()->heyImYourNeighbor(cteThis, Direction::WEST); + if (w.lock() != NULL) w.lock()->heyImYourNeighbor(cteThis, Direction::EAST); +} + +bool ChestTileEntity::isSameChest(int x, int y, int z) +{ + Tile *tile = Tile::tiles[level->getTile(x, y, z)]; + if (tile == NULL || !(dynamic_cast(tile) != NULL)) return false; + return ((ChestTile *) tile)->type == getType(); } void ChestTileEntity::tick() { - TileEntity::tick(); - checkNeighbors(); + TileEntity::tick(); + checkNeighbors(); - if (++tickInterval % 20 * 4 == 0) + ++tickInterval; + if (!level->isClientSide && openCount != 0 && (tickInterval + x + y + z) % (SharedConstants::TICKS_PER_SECOND * 10) == 0) { - //level->tileEvent(x, y, z, ChestTile::EVENT_SET_OPEN_COUNT, openCount); - } + // level.tileEvent(x, y, z, Tile.chest.id, ChestTile.EVENT_SET_OPEN_COUNT, openCount); - oOpenness = openness; + openCount = 0; - float speed = 0.10f; - if (openCount > 0 && openness == 0) + float range = 5; + vector > *players = level->getEntitiesOfClass(typeid(Player), AABB::newTemp(x - range, y - range, z - range, x + 1 + range, y + 1 + range, z + 1 + range)); + for (AUTO_VAR(it,players->begin()); it != players->end(); ++it) + { + shared_ptr player = dynamic_pointer_cast(*it); + + ContainerMenu *containerMenu = dynamic_cast(player->containerMenu); + if (containerMenu != NULL) + { + shared_ptr container = containerMenu->getContainer(); + shared_ptr thisContainer = dynamic_pointer_cast(shared_from_this()); + shared_ptr compoundContainer = dynamic_pointer_cast( container ); + if ( (container == thisContainer) || (compoundContainer != NULL && compoundContainer->contains(thisContainer)) ) + { + openCount++; + } + } + } + delete players; + } + + oOpenness = openness; + + float speed = 0.10f; + if (openCount > 0 && openness == 0) { - if (n.lock() == NULL && w.lock() == NULL) + if (n.lock() == NULL && w.lock() == NULL) { - double xc = x + 0.5; - double zc = z + 0.5; - if (s.lock() != NULL) zc += 0.5; - if (e.lock() != NULL) xc += 0.5; + double xc = x + 0.5; + double zc = z + 0.5; + if (s.lock() != NULL) zc += 0.5; + if (e.lock() != NULL) xc += 0.5; // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit - level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_OPEN, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); - } - } - if ((openCount == 0 && openness > 0) || (openCount > 0 && openness < 1)) + level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_OPEN, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); + } + } + if ((openCount == 0 && openness > 0) || (openCount > 0 && openness < 1)) { float oldOpen = openness; - if (openCount > 0) openness += speed; - else openness -= speed; - if (openness > 1) + if (openCount > 0) openness += speed; + else openness -= speed; + if (openness > 1) { - openness = 1; - } + openness = 1; + } float lim = 0.5f; - if (openness < lim && oldOpen >= lim) + if (openness < lim && oldOpen >= lim) { // Fix for #64546 - Customer Encountered: TU7: Chests placed by the Player are closing too fast. - //openness = 0; - if (n.lock() == NULL && w.lock() == NULL) + //openness = 0; + if (n.lock() == NULL && w.lock() == NULL) { - double xc = x + 0.5; - double zc = z + 0.5; - if (s.lock() != NULL) zc += 0.5; - if (e.lock() != NULL) xc += 0.5; + double xc = x + 0.5; + double zc = z + 0.5; + if (s.lock() != NULL) zc += 0.5; + if (e.lock() != NULL) xc += 0.5; // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit - level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_CLOSE, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); - } + level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_CLOSE, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); + } } - if (openness < 0) + if (openness < 0) { - openness = 0; - } - } + openness = 0; + } + } } -void ChestTileEntity::triggerEvent(int b0, int b1) +bool ChestTileEntity::triggerEvent(int b0, int b1) { - if (b0 == ChestTile::EVENT_SET_OPEN_COUNT) + if (b0 == ChestTile::EVENT_SET_OPEN_COUNT) { - openCount = b1; - } + openCount = b1; + return true; + } + return TileEntity::triggerEvent(b0, b1); } void ChestTileEntity::startOpen() { + if (openCount < 0) + { + openCount = 0; + } openCount++; - level->tileEvent(x, y, z, Tile::chest_Id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); + level->tileEvent(x, y, z, getTile()->id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); + level->updateNeighborsAt(x, y, z, getTile()->id); + level->updateNeighborsAt(x, y - 1, z, getTile()->id); } void ChestTileEntity::stopOpen() { + if (getTile() == NULL || !( dynamic_cast( getTile() ) != NULL)) return; openCount--; - level->tileEvent(x, y, z, Tile::chest_Id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); + level->tileEvent(x, y, z, getTile()->id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); + level->updateNeighborsAt(x, y, z, getTile()->id); + level->updateNeighborsAt(x, y - 1, z, getTile()->id); +} + +bool ChestTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + return true; } void ChestTileEntity::setRemoved() { - clearCache(); - checkNeighbors(); - TileEntity::setRemoved(); + TileEntity::setRemoved(); + clearCache(); + checkNeighbors(); +} + +int ChestTileEntity::getType() +{ + if (type == -1) + { + if (level != NULL && dynamic_cast( getTile() ) != NULL) + { + type = ((ChestTile *) getTile())->type; + } + else + { + return ChestTile::TYPE_BASIC; + } + } + + return type; } // 4J Added diff --git a/Minecraft.World/ChestTileEntity.h b/Minecraft.World/ChestTileEntity.h index 5eeb3c44..77c11e99 100644 --- a/Minecraft.World/ChestTileEntity.h +++ b/Minecraft.World/ChestTileEntity.h @@ -16,10 +16,16 @@ public: eINSTANCEOF GetType() { return eTYPE_CHESTTILEENTITY; } static TileEntity *create() { return new ChestTileEntity(); } -using TileEntity::setChanged; + int getContainerType(); // 4J-Added; + + using TileEntity::setChanged; + +private: + void _init(bool isBonusChest); public: ChestTileEntity(bool isBonusChest = false); // 4J added param + ChestTileEntity(int type, bool isBonusChest = false); // 4J added param virtual ~ChestTileEntity(); private: @@ -28,35 +34,53 @@ private: public: bool isBonusChest; // 4J added bool hasCheckedNeighbors; - weak_ptr n; - weak_ptr e; - weak_ptr w; - weak_ptr s; + weak_ptr n; + weak_ptr e; + weak_ptr w; + weak_ptr s; float openness, oOpenness; int openCount; private: int tickInterval; + int type; + wstring name; + public: virtual unsigned int getContainerSize(); virtual shared_ptr getItem(unsigned int slot); virtual shared_ptr removeItem(unsigned int slot, int count); virtual shared_ptr removeItemNoUpdate(int slot); virtual void setItem(unsigned int slot, shared_ptr item); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); virtual int getMaxStackSize(); virtual bool stillValid(shared_ptr player); virtual void setChanged(); virtual void clearCache(); - virtual void checkNeighbors(); - virtual void tick(); - virtual void triggerEvent(int b0, int b1); - virtual void startOpen(); - virtual void stopOpen(); - virtual void setRemoved(); + +private: + virtual void heyImYourNeighbor(shared_ptr neighbor, int from); + +public: + virtual void checkNeighbors(); + +private: + bool isSameChest(int x, int y, int z); + +public: + virtual void tick(); + virtual bool triggerEvent(int b0, int b1); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual void setRemoved(); + virtual int getType(); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/Chicken.cpp b/Minecraft.World/Chicken.cpp index 0104b2bf..5f4cf2a7 100644 --- a/Minecraft.World/Chicken.cpp +++ b/Minecraft.World/Chicken.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.level.h" @@ -24,22 +26,19 @@ Chicken::Chicken(Level *level) : Animal( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); _init(); - this->textureIdx = TN_MOB_CHICKEN; // 4J - was L"/mob/chicken.png"; - this->setSize(0.3f, 0.7f); // 4J Changed from 0.4 to 0.7 in 1.8.2 + setSize(0.3f, 0.7f); // 4J Changed from 0.4 to 0.7 in 1.8.2 eggTime = random->nextInt(20 * 60 * 5) + 20 * 60 * 5; - float walkSpeed = 0.25f; goalSelector.addGoal(0, new FloatGoal(this)); - goalSelector.addGoal(1, new PanicGoal(this, 0.38f)); - goalSelector.addGoal(2, new BreedGoal(this, walkSpeed)); - goalSelector.addGoal(3, new TemptGoal(this, 0.25f, Item::seeds_wheat_Id, false)); - goalSelector.addGoal(4, new FollowParentGoal(this, 0.28f)); - goalSelector.addGoal(5, new RandomStrollGoal(this, walkSpeed)); + goalSelector.addGoal(1, new PanicGoal(this, 1.4)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + goalSelector.addGoal(3, new TemptGoal(this, 1.0, Item::seeds_wheat_Id, false)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.1)); + goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(6, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(7, new RandomLookAroundGoal(this)); } @@ -49,9 +48,12 @@ bool Chicken::useNewAi() return true; } -int Chicken::getMaxHealth() +void Chicken::registerAttributes() { - return 4; + Animal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(4); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); } void Chicken::aiStep() @@ -79,7 +81,7 @@ void Chicken::aiStep() { if (!level->isClientSide && --eggTime <= 0) { - level->playSound(shared_from_this(), eSoundType_MOB_CHICKENPLOP, 1.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + playSound( eSoundType_MOB_CHICKENPLOP, 1.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); spawnAtLocation(Item::egg->id, 1); eggTime = random->nextInt(20 * 60 * 5) + 20 * 60 * 5; } @@ -107,6 +109,11 @@ int Chicken::getDeathSound() return eSoundType_MOB_CHICKEN_HURT; } +void Chicken::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_CHICKEN_STEP, 0.15f, 1); +} + int Chicken::getDeathLoot() { return Item::feather->id; @@ -146,5 +153,5 @@ shared_ptr Chicken::getBreedOffspring(shared_ptr target) bool Chicken::isFood(shared_ptr itemInstance) { - return (itemInstance->id == Item::seeds_wheat_Id) || (itemInstance->id == Item::netherStalkSeeds_Id) || (itemInstance->id == Item::seeds_melon_Id) || (itemInstance->id == Item::seeds_pumpkin_Id); + return (itemInstance->id == Item::seeds_wheat_Id) || (itemInstance->id == Item::netherwart_seeds_Id) || (itemInstance->id == Item::seeds_melon_Id) || (itemInstance->id == Item::seeds_pumpkin_Id); } diff --git a/Minecraft.World/Chicken.h b/Minecraft.World/Chicken.h index a162a5eb..0f406219 100644 --- a/Minecraft.World/Chicken.h +++ b/Minecraft.World/Chicken.h @@ -24,7 +24,11 @@ private: public: Chicken(Level *level); virtual bool useNewAi(); - virtual int getMaxHealth(); + +protected: + void registerAttributes(); + +public: virtual void aiStep(); protected: @@ -32,6 +36,7 @@ protected: virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); + virtual void playStepSound(int xt, int yt, int zt, int t); virtual int getDeathLoot(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); diff --git a/Minecraft.World/ChunkSource.h b/Minecraft.World/ChunkSource.h index 242f30a0..c537651c 100644 --- a/Minecraft.World/ChunkSource.h +++ b/Minecraft.World/ChunkSource.h @@ -8,16 +8,30 @@ class TilePos; #ifdef _LARGE_WORLDS // 4J Stu - Our default map (at zoom level 3) is 1024x1024 blocks (or 64 chunks) #define LEVEL_MAX_WIDTH (5*64) //(6*54) + +#define LEVEL_WIDTH_CLASSIC 54 +#define LEVEL_WIDTH_SMALL 64 +#define LEVEL_WIDTH_MEDIUM (3*64) +#define LEVEL_WIDTH_LARGE (5*64) + #else #define LEVEL_MAX_WIDTH 54 #endif #define LEVEL_MIN_WIDTH 54 #define LEVEL_LEGACY_WIDTH 54 + + // Scale was 8 in the Java game, but that would make our nether tiny // Every 1 block you move in the nether maps to HELL_LEVEL_SCALE blocks in the overworld #ifdef _LARGE_WORLDS #define HELL_LEVEL_MAX_SCALE 8 + +#define HELL_LEVEL_SCALE_CLASSIC 3 +#define HELL_LEVEL_SCALE_SMALL 3 +#define HELL_LEVEL_SCALE_MEDIUM 6 +#define HELL_LEVEL_SCALE_LARGE 8 + #else #define HELL_LEVEL_MAX_SCALE 3 #endif @@ -39,29 +53,42 @@ class ChunkSource public: // 4J Added so that we can store the maximum dimensions of this world int m_XZSize; +#ifdef _LARGE_WORLDS + bool m_classicEdgeMoat; + bool m_smallEdgeMoat; + bool m_mediumEdgeMoat; +#endif public: virtual ~ChunkSource() {} - virtual bool hasChunk(int x, int y) = 0; + virtual bool hasChunk(int x, int y) = 0; virtual bool reallyHasChunk(int x, int y) { return hasChunk(x,y); } // 4J added - virtual LevelChunk *getChunk(int x, int z) = 0; + virtual LevelChunk *getChunk(int x, int z) = 0; virtual void lightChunk(LevelChunk *lc) {} // 4J added - virtual LevelChunk *create(int x, int z) = 0; - virtual void postProcess(ChunkSource *parent, int x, int z) = 0; + virtual LevelChunk *create(int x, int z) = 0; + virtual void postProcess(ChunkSource *parent, int x, int z) = 0; virtual bool saveAllEntities() { return false; } // 4J Added - virtual bool save(bool force, ProgressListener *progressListener) = 0; - virtual bool tick() = 0; - virtual bool shouldSave() = 0; + virtual bool save(bool force, ProgressListener *progressListener) = 0; + virtual bool tick() = 0; + virtual bool shouldSave() = 0; virtual LevelChunk **getCache() { return NULL; } // 4J added virtual void dataReceived(int x, int z) {} // 4J added - /** - * Returns some stats that are rendered when the user holds F3. - */ - virtual wstring gatherStats() = 0; + /** + * Returns some stats that are rendered when the user holds F3. + */ + virtual wstring gatherStats() = 0; virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z) = 0; - virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z) = 0; + virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z) = 0; + + /** + * Recreates "logic structures" for a chunk that has been loaded from disk. + * For example, fortress bridges in the Nether. + */ + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ) = 0; + + // virtual void flushSave() = 0; // 4J removed }; diff --git a/Minecraft.World/Class.h b/Minecraft.World/Class.h index 5dbbf965..31fc4dad 100644 --- a/Minecraft.World/Class.h +++ b/Minecraft.World/Class.h @@ -7,117 +7,244 @@ class InputStream; // simplify declaring classes with this added functionality. +// 0b FFFF CCCC CCCC CCCC CCCC CCCC CCEE EEEE +// |||| |||| |||| |||| |||| |||| |||| |||| +// |||| |||| |||| |||| |||| |||| |||| |||\- BIT00: ENUM: +// |||| |||| |||| |||| |||| |||| |||| ||\-- BIT01: ENUM: +// |||| |||| |||| |||| |||| |||| |||| |\--- BIT02: ENUM: +// |||| |||| |||| |||| |||| |||| |||| \---- BIT03: ENUM: +// |||| |||| |||| |||| |||| |||| |||| +// |||| |||| |||| |||| |||| |||| |||\------ BIT04: ENUM: +// |||| |||| |||| |||| |||| |||| ||\------- BIT05: ENUM: +// |||| |||| |||| |||| |||| |||| |\-------- BIT06: CLASS: WATER_MOB +// |||| |||| |||| |||| |||| |||| \--------- BIT07: CLASS: AMBIENT_MOB +// |||| |||| |||| |||| |||| |||| +// |||| |||| |||| |||| |||| |||\----------- BIT08: CLASS: !ENTITY (so we can hide TILE_ENTITY and DISPENSER_TILE_ENTITY bits which aren't relevant for entities) +// |||| |||| |||| |||| |||| ||\------------ BIT09: CLASS: MINECART_CONTAINER +// |||| |||| |||| |||| |||| |\------------- BIT10: CLASS: SLIME +// |||| |||| |||| |||| |||| \-------------- BIT11: CLASS: ZOMBIE +// |||| |||| |||| |||| |||| +// |||| |||| |||| |||| |||\---------------- BIT12: CLASS: SPIDER +// |||| |||| |||| |||| ||\----------------- BIT13: CLASS: COW +// |||| |||| |||| |||| |\------------------ BIT14: CLASS: TAMABLE +// |||| |||| |||| |||| \------------------- BIT15: CLASS: ANIMAL +// |||| |||| |||| |||| +// |||| |||| |||| |||\--------------------- BIT16: CLASS: MONSTER +// |||| |||| |||| ||\---------------------- BIT17: CLASS: GOLEM +// |||| |||| |||| |\----------------------- BIT18: CLASS: AGABLE_MOB +// |||| |||| |||| \------------------------ BIT19: CLASS: PATHFINDER_MOB +// |||| |||| |||| +// |||| |||| |||\-------------------------- BIT20: CLASS: PLAYER +// |||| |||| ||\--------------------------- BIT21: CLASS: MOB +// |||| |||| |\---------------------------- BIT22: CLASS: HANGING_ENTITY +// |||| |||| \----------------------------- BIT23: CLASS: THROWABLE +// |||| |||| +// |||| |||\------------------------------- BIT24: CLASS: FIREBALL +// |||| ||\-------------------------------- BIT25: CLASS: MINECART +// |||| |\--------------------------------- BIT26: CLASS: LIVING_ENTITY +// |||| \---------------------------------- BIT27: CLASS: ENTITY +// |||| +// |||\------------------------------------ BIT28: FLAGS: valid in spawner flag +// ||\------------------------------------- BIT29: FLAGS: Spawnlimitcheck +// |\-------------------------------------- BIT30: FLAGS: Enemy +// \--------------------------------------- BIT31: FLAGS: projectile + + +#define Bit(a) ((1)<<(a)) + +const unsigned int BIT_NOT_LIVING_ENTITY = Bit(25); + +// Classes + +const unsigned int BIT_FLYING_MOB = Bit( 9); +const unsigned int BIT_WATER_MOB = Bit(10); +const unsigned int BIT_AMBIENT_MOB = Bit(11); + +const unsigned int BIT_NOT_ENTITY = Bit(12); +const unsigned int BIT_SLIME = Bit(13); +const unsigned int BIT_ZOMBIE = Bit(14); +const unsigned int BIT_SPIDER = Bit(15); + +const unsigned int BIT_COW = Bit(16); +const unsigned int BIT_TAMABLE = Bit(17); +const unsigned int BIT_ANIMAL = Bit(18); +const unsigned int BIT_MONSTER = Bit(19); const unsigned int BIT_MINECART_CONTAINER = Bit(19) | BIT_NOT_LIVING_ENTITY; + +const unsigned int BIT_GOLEM = Bit(20); const unsigned int BIT_HANGING_ENTITY = Bit(20) | BIT_NOT_LIVING_ENTITY; +const unsigned int BIT_AGABLE_MOB = Bit(21); const unsigned int BIT_THROWABLE = Bit(21) | BIT_NOT_LIVING_ENTITY; +const unsigned int BIT_PATHFINDER_MOB = Bit(22); const unsigned int BIT_FIREBALL = Bit(22) | BIT_NOT_LIVING_ENTITY; +const unsigned int BIT_PLAYER = Bit(23); const unsigned int BIT_MINECART = Bit(23) | BIT_NOT_LIVING_ENTITY; + +const unsigned int BIT_MOB = Bit(24); const unsigned int BIT_GLOBAL_ENTITY = Bit(24) | BIT_NOT_LIVING_ENTITY; +//const unsigned int BIT_NOT_LIVING_ENTITY = Bit(25); +const unsigned int BIT_LIVING_ENTITY = Bit(26); +const unsigned int BIT_ENTITY = Bit(27); + +// Flags +const unsigned int BIT_VALID_IN_SPAWNER = Bit(28); +const unsigned int BIT_ANIMALS_SPAWN_LIMIT_CHECK = Bit(29); +const unsigned int BIT_ENEMY = Bit(30); +const unsigned int BIT_PROJECTILE = Bit(31U); + +// Tile Entities +const unsigned int BIT_TILE_ENTITY = Bit(24) | BIT_NOT_ENTITY; +const unsigned int BIT_DISPENSERTILEENTITY = Bit(25) | BIT_NOT_ENTITY; +const unsigned int BIT_OTHER_NOT_ENTITIES = Bit(26) | BIT_NOT_ENTITY; + + +// 4J-JEV: These abstract classes only have one subclass, so ignore them. +//const unsigned int BIT_WATER_MOB = Bit(15); +//const unsigned int BIT_FLYING_MOB = Bit(17); +//const unsigned int BIT_AMBIENT_MOB = Bit(18); +//const unsigned int BIT_GLOBAL_ENTITY = Bit(); + +// #define ETYPE(a,b,c) ( (a) | (b) | (c) ) + // 4J Stu - This Enum can be used as a more lightweight version of the above, without having do dynamic casts // 4J-PB - for replacement of instanceof enum eINSTANCEOF { eTYPE_NOTSET=0, + + // Flags. + eTYPE_VALID_IN_SPAWNER_FLAG = BIT_VALID_IN_SPAWNER, + eTYPE_ANIMALS_SPAWN_LIMIT_CHECK = BIT_ANIMALS_SPAWN_LIMIT_CHECK, + eTYPE_ENEMY = BIT_ENEMY, + eTYPE_PROJECTILE = BIT_PROJECTILE, - // 4J-RR arranging these pathfinder types in a bitfield fashion so that a single and can determine whether they are derived from - // the 3 subclasses of pathfinders (water animals, animals, and monsters) that the mob spawner uses - eTYPE_WATERANIMAL = 0x100, - eTYPE_SQUID = 0x101, - - eTYPE_ANIMAL = 0x200, - - // 4J Stu - These have the ANIMAL, AGABLE_MOB and ANIMALS_SPAWN_LIMIT_CHECK bits set - eTYPE_COW = 0x82201, - eTYPE_SHEEP = 0x82202, - eTYPE_PIG = 0x82203, - eTYPE_SNOWMAN = 0x82204, - eTYPE_OZELOT = 0x82205, - - // 4J Stu - When adding new categories, please also update ConsoleSchematicFile::generateSchematicFile so these can be saved out to schematics - // 4J Stu- These have the ANIMAL and AGABLE_MOB bits set, but NOT ANIMALS_SPAWN_LIMIT_CHECK - eTYPE_CHICKEN = 0x2206, - eTYPE_WOLF = 0x2207, - eTYPE_MUSHROOMCOW = 0x2208, - - // 4J Stu - If you add new hostile mobs here you should also update the string lookup function at CConsoleMinecraftApp::getEntityName - eTYPE_MONSTER = 0x400, - eTYPE_ENEMY = 0x800, - eTYPE_CREEPER = 0xC01, - eTYPE_GIANT = 0xC02, - eTYPE_SKELETON = 0xC03, - eTYPE_SPIDER = 0xC04, - eTYPE_ZOMBIE = 0xC05, - eTYPE_PIGZOMBIE = 0xC06, - eTYPE_ENDERMAN = 0xC07, - eTYPE_SILVERFISH = 0xC08, - eTYPE_CAVESPIDER = 0xC09, - eTYPE_BLAZE = 0xC0A, - - eTYPE_GHAST = 0xC0B, // Now considering as a monster even though class inheritance doesn't work like this - but otherwise breaks mob spawning - eTYPE_SLIME = 0xC0C, // Now considering as a monster even though class inheritance doesn't work like this - but otherwise breaks mob spawning - eTYPE_LAVASLIME = 0xC0D, - - eTYPE_VILLAGERGOLEM = 0x1000, - - eTYPE_AGABLE_MOB = 0x2000, - - eTYPE_PLAYER = 0x8000, - eTYPE_SERVERPLAYER= 0x8001, - - // Include AGABLE_MOB - eTYPE_VILLAGER = 0x12000, - - eTYPE_PROJECTILE = 0x40000, - eTYPE_ARROW = 0x40001, - eTYPE_FIREBALL = 0x40002, - eTYPE_FISHINGHOOK = 0x40003, - eTYPE_SNOWBALL = 0x40004, - eTYPE_THROWNEGG = 0x40005, - eTYPE_EYEOFENDERSIGNAL = 0x40006, - eTYPE_SMALL_FIREBALL = 0x40007, - eTYPE_THROWNENDERPEARL = 0x40008, - eTYPE_THROWNPOTION = 0x40009, - eTYPE_THROWNEXPBOTTLE = 0x4000A, - - eTYPE_ANIMALS_SPAWN_LIMIT_CHECK = 0x80000, - - // Never used, exists to ensure all later entities don't match the bitmasks above - eTYPE_OTHERS = 0x100000, - - eTYPE_NETHER_SPHERE, - eTYPE_ENDER_CRYSTAL, - eTYPE_ENDERDRAGON, - eTYPE_BOSS_MOB_PART, - - eTYPE_ENTITY, - - eTYPE_MOB, - - eTYPE_LIGHTNINGBOLT, - - eTYPE_PAINTING, - eTYPE_ITEMENTITY, - eTYPE_FALLINGTILE, - eTYPE_BOAT, - eTYPE_MINECART, - eTYPE_PRIMEDTNT, - - eTYPE_TILEENTITY, - eTYPE_CHESTTILEENTITY, - eTYPE_DISPENSERTILEENTITY, - eTYPE_MOBSPAWNERTILEENTITY, - eTYPE_FURNACETILEENTITY, - eTYPE_SIGNTILEENTITY, - eTYPE_MUSICTILEENTITY, - eTYPE_RECORDPLAYERTILE, - eTYPE_PISTONPIECEENTITY, - eTYPE_BREWINGSTANDTILEENTITY, - eTYPE_ENCHANTMENTTABLEENTITY, - eTYPE_THEENDPORTALTILEENTITY, - eTYPE_SKULLTILEENTITY, - eTYPE_ENDERCHESTTILEENTITY, + eTYPE_ENTITY = BIT_ENTITY, - eType_NODE, + eTYPE_LIVINGENTITY = eTYPE_ENTITY | BIT_LIVING_ENTITY, - eType_ITEM, - eType_ITEMINSTANCE, - eType_MAPITEM, - eType_TILE, - eType_FIRETILE, + eTYPE_MOB = eTYPE_LIVINGENTITY | BIT_MOB, + + eTYPE_PATHFINDER_MOB = eTYPE_MOB | BIT_PATHFINDER_MOB, + + eTYPE_AGABLE_MOB = eTYPE_PATHFINDER_MOB | BIT_AGABLE_MOB, + + eTYPE_VILLAGER = eTYPE_AGABLE_MOB | 0x1, //0x12000, + + // 4J Stu - When adding new categories, please also update ConsoleSchematicFile::generateSchematicFile so these can be saved out to schematics + eTYPE_ANIMAL = eTYPE_AGABLE_MOB | BIT_ANIMAL, + + eTYPE_TAMABLE_ANIMAL = eTYPE_ANIMAL | BIT_TAMABLE, + + eTYPE_OCELOT = eTYPE_TAMABLE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x1, + eTYPE_WOLF = eTYPE_TAMABLE_ANIMAL | 0x2, + + eTYPE_HORSE = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x1, + eTYPE_SHEEP = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x2, + eTYPE_PIG = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x3, + eTYPE_CHICKEN = eTYPE_ANIMAL | 0x4, + + eTYPE_COW = eTYPE_ANIMAL | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | BIT_COW, + eTYPE_MUSHROOMCOW = eTYPE_COW | 0x1, + + + eTYPE_WATERANIMAL = eTYPE_PATHFINDER_MOB | BIT_WATER_MOB, //0x100, + eTYPE_SQUID = eTYPE_WATERANIMAL| 0x1, + + eTYPE_GOLEM = eTYPE_PATHFINDER_MOB | BIT_GOLEM, + + eTYPE_SNOWMAN = eTYPE_GOLEM | eTYPE_ANIMALS_SPAWN_LIMIT_CHECK | 0x1, //0x4, + eTYPE_VILLAGERGOLEM = eTYPE_GOLEM | 0x2, //0x1000, + + + // 4J Stu - If you add new hostile mobs here you should also update the string lookup function at CConsoleMinecraftApp::getEntityName + eTYPE_MONSTER = eTYPE_ENEMY | eTYPE_PATHFINDER_MOB | BIT_MONSTER, + + eTYPE_SPIDER = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | BIT_SPIDER, + eTYPE_CAVESPIDER = eTYPE_SPIDER | 0x1, + + eTYPE_ZOMBIE = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | BIT_ZOMBIE, + eTYPE_PIGZOMBIE = eTYPE_ZOMBIE | 0x1, + + eTYPE_CREEPER = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x1, + eTYPE_GIANT = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x2, + eTYPE_SKELETON = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x3, + eTYPE_ENDERMAN = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x4, + eTYPE_SILVERFISH = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x5, + eTYPE_BLAZE = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x6, + eTYPE_WITCH = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x7, + eTYPE_WITHERBOSS = eTYPE_MONSTER | eTYPE_VALID_IN_SPAWNER_FLAG | 0x8, + + + eTYPE_AMBIENT = eTYPE_MOB | BIT_AMBIENT_MOB, + eTYPE_BAT = eTYPE_AMBIENT | eTYPE_VALID_IN_SPAWNER_FLAG | 0x1, + + eTYPE_FLYING_MOB = eTYPE_MOB | BIT_FLYING_MOB, + eTYPE_GHAST = eTYPE_FLYING_MOB | eTYPE_VALID_IN_SPAWNER_FLAG | eTYPE_ENEMY | 0x1, + + eTYPE_SLIME = eTYPE_MOB | eTYPE_VALID_IN_SPAWNER_FLAG | eTYPE_ENEMY | BIT_SLIME, + eTYPE_LAVASLIME = eTYPE_SLIME | 0x1, + + eTYPE_ENDERDRAGON = eTYPE_MOB | 0x5, + + eTYPE_PLAYER = eTYPE_LIVINGENTITY | BIT_PLAYER, //0x8000, + eTYPE_SERVERPLAYER = eTYPE_PLAYER | 0x1, + eTYPE_REMOTEPLAYER = eTYPE_PLAYER | 0x2, + eTYPE_LOCALPLAYER = eTYPE_PLAYER | 0x3, + + eTYPE_GLOBAL_ENTITY = eTYPE_ENTITY | BIT_GLOBAL_ENTITY, + eTYPE_LIGHTNINGBOLT = eTYPE_GLOBAL_ENTITY | 0x1, + + eTYPE_MINECART = eTYPE_ENTITY | BIT_MINECART, //0x200000, + + eTYPE_MINECART_RIDEABLE = eTYPE_MINECART | 0x1, + eTYPE_MINECART_SPAWNER = eTYPE_MINECART | 0x6, + eTYPE_MINECART_FURNACE = eTYPE_MINECART | 0x3, + eTYPE_MINECART_TNT = eTYPE_MINECART | 0x4, + + eTYPE_MINECART_CONTAINER = eTYPE_MINECART | BIT_MINECART_CONTAINER, + + eTYPE_MINECART_CHEST = eTYPE_MINECART_CONTAINER | 0x2, + eTYPE_MINECART_HOPPER = eTYPE_MINECART_CONTAINER | 0x5, + + + eTYPE_FIREBALL = eTYPE_ENTITY | eTYPE_PROJECTILE | BIT_FIREBALL, //0x2, + + eTYPE_DRAGON_FIREBALL = eTYPE_FIREBALL | 0x1, + eTYPE_WITHER_SKULL = eTYPE_FIREBALL | 0x2, + eTYPE_LARGE_FIREBALL = eTYPE_FIREBALL | 0x3, + eTYPE_SMALL_FIREBALL = eTYPE_FIREBALL | 0x4, + + + eTYPE_THROWABLE = eTYPE_ENTITY | eTYPE_PROJECTILE | BIT_THROWABLE, + + eTYPE_SNOWBALL = eTYPE_THROWABLE | 0x1, + eTYPE_THROWNEGG = eTYPE_THROWABLE | 0x2, + eTYPE_THROWNENDERPEARL = eTYPE_THROWABLE | 0x3, + eTYPE_THROWNPOTION = eTYPE_THROWABLE | 0x4, + eTYPE_THROWNEXPBOTTLE = eTYPE_THROWABLE | 0x5, + + + eTYPE_HANGING_ENTITY = eTYPE_ENTITY | BIT_HANGING_ENTITY, + + eTYPE_PAINTING = eTYPE_HANGING_ENTITY | 0x1, + eTYPE_ITEM_FRAME = eTYPE_HANGING_ENTITY | 0x2, + eTYPE_LEASHFENCEKNOT = eTYPE_HANGING_ENTITY | 0x3, + + + // Other Entities. + + eTYPE_OTHER_ENTITIES = eTYPE_ENTITY + 1, + + eTYPE_EXPERIENCEORB = (eTYPE_OTHER_ENTITIES + 2), // 1.8.2 + eTYPE_EYEOFENDERSIGNAL = (eTYPE_OTHER_ENTITIES + 3) | eTYPE_PROJECTILE, + eTYPE_FIREWORKS_ROCKET = (eTYPE_OTHER_ENTITIES + 4) | eTYPE_PROJECTILE, + eTYPE_FISHINGHOOK = (eTYPE_OTHER_ENTITIES + 5) | eTYPE_PROJECTILE, + eTYPE_DELAYEDRELEASE = (eTYPE_OTHER_ENTITIES + 6), // 1.8.2 + eTYPE_BOAT = (eTYPE_OTHER_ENTITIES + 7), + eTYPE_FALLINGTILE = (eTYPE_OTHER_ENTITIES + 8), + eTYPE_ITEMENTITY = (eTYPE_OTHER_ENTITIES + 9), + eTYPE_PRIMEDTNT = (eTYPE_OTHER_ENTITIES + 10), + eTYPE_ARROW = (eTYPE_OTHER_ENTITIES + 11) | eTYPE_PROJECTILE, + eTYPE_MULTIENTITY_MOB_PART = (eTYPE_OTHER_ENTITIES + 12), + eTYPE_NETHER_SPHERE = (eTYPE_OTHER_ENTITIES + 13), + eTYPE_ENDER_CRYSTAL = (eTYPE_OTHER_ENTITIES + 14), + + + // === PARTICLES === // eType_BREAKINGITEMPARTICLE, eType_BUBBLEPARTICLE, @@ -137,8 +264,6 @@ enum eINSTANCEOF eType_WATERDROPPARTICLE, // 1.8.2 - eTYPE_DELAYEDRELEASE, - eTYPE_EXPERIENCEORB, eType_CRITPARTICLE, eType_CRITPARTICLE2, eType_HUGEEXPLOSIONPARTICLE, @@ -153,10 +278,329 @@ enum eINSTANCEOF eTYPE_SPELLPARTICLE, //TU9 - eTYPE_HANGING_ENTITY, - eTYPE_ITEM_FRAME, eTYPE_DRAGONBREATHPARTICLE, - eTYPE_DRAGON_FIREBALL, - eType_ENDERPARTICLE, + + eType_FIREWORKSSTARTERPARTICLE, + eType_FIREWORKSSPARKPARTICLE, + eType_FIREWORKSOVERLAYPARTICLE, + + // === Tile Entities === // + + eTYPE_TILEENTITY = BIT_TILE_ENTITY, + + eTYPE_CHESTTILEENTITY = eTYPE_TILEENTITY | 0x01, + eTYPE_MOBSPAWNERTILEENTITY = eTYPE_TILEENTITY | 0x02, + eTYPE_FURNACETILEENTITY = eTYPE_TILEENTITY | 0x03, + eTYPE_SIGNTILEENTITY = eTYPE_TILEENTITY | 0x04, + eTYPE_MUSICTILEENTITY = eTYPE_TILEENTITY | 0x05, + eTYPE_RECORDPLAYERTILE = eTYPE_TILEENTITY | 0x06, + eTYPE_PISTONPIECEENTITY = eTYPE_TILEENTITY | 0x07, + eTYPE_BREWINGSTANDTILEENTITY = eTYPE_TILEENTITY | 0x08, + eTYPE_ENCHANTMENTTABLEENTITY = eTYPE_TILEENTITY | 0x09, + eTYPE_THEENDPORTALTILEENTITY = eTYPE_TILEENTITY | 0x0A, + eTYPE_SKULLTILEENTITY = eTYPE_TILEENTITY | 0x0B, + eTYPE_ENDERCHESTTILEENTITY = eTYPE_TILEENTITY | 0x0C, + eTYPE_BEACONTILEENTITY = eTYPE_TILEENTITY | 0x0D, + eTYPE_COMMANDBLOCKTILEENTITY = eTYPE_TILEENTITY | 0x0E, + eTYPE_COMPARATORTILEENTITY = eTYPE_TILEENTITY | 0x0F, + eTYPE_DAYLIGHTDETECTORTILEENTITY = eTYPE_TILEENTITY | 0x10, + eTYPE_HOPPERTILEENTITY = eTYPE_TILEENTITY | 0x11, + + eTYPE_DISPENSERTILEENTITY = eTYPE_TILEENTITY | BIT_DISPENSERTILEENTITY, + eTYPE_DROPPERTILEENTITY = eTYPE_DISPENSERTILEENTITY | 0x1, + + + // === Never used === // + // exists to ensure all later entities don't match the bitmasks above + + eTYPE_OTHERS = BIT_OTHER_NOT_ENTITIES, + + eType_NODE, + eType_ITEM, + eType_ITEMINSTANCE, + eType_MAPITEM, + eType_TILE, + eType_FIRETILE, +}; + +inline bool eTYPE_DERIVED_FROM(eINSTANCEOF super, eINSTANCEOF sub) +{ + if ( (super & 0x3F) != 0x00 ) return super == sub; + else return (super & sub) == super; +} + +inline bool eTYPE_FLAGSET(eINSTANCEOF flag, eINSTANCEOF claz) +{ + return (flag & claz) == flag; +} + + +/// FOR CHECKING /// + +#if !(defined _WINDOWS64) + +class SubClass +{ + static void checkDerivations() {} }; + +#else + +class SubClass +{ +public: + bool m_isTerminal; + const string m_name; + const eINSTANCEOF m_id; + vector m_parents; + + static unordered_map s_ids; + + SubClass(const string &name, eINSTANCEOF id) + : m_name(name), m_id(id) + { + s_ids.insert( pair(id,this) ); + m_isTerminal = true; + } + + SubClass *addParent(eINSTANCEOF id) + { + SubClass *parent = s_ids.at(id); + parent->m_isTerminal = false; + + m_parents.push_back(id); + + for (AUTO_VAR(itr, parent->m_parents.begin()); itr != parent->m_parents.end(); itr++) + { + m_parents.push_back(*itr); + } + + return this; + } + + bool justFlag() + { + return (m_id & 0xF00000) == m_id; + } + +#define SUBCLASS(x) (new SubClass( #x , x )) + + static void checkDerivations() + { + vector *classes = new vector(); + + classes->push_back( SUBCLASS(eTYPE_VALID_IN_SPAWNER_FLAG) ); + classes->push_back( SUBCLASS(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK) ); + classes->push_back( SUBCLASS(eTYPE_ENEMY) ); + classes->push_back( SUBCLASS(eTYPE_PROJECTILE) ); + + classes->push_back( SUBCLASS(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eTYPE_LIVINGENTITY)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eTYPE_MOB)->addParent(eTYPE_LIVINGENTITY) ); + classes->push_back( SUBCLASS(eTYPE_PATHFINDER_MOB)->addParent(eTYPE_MOB) ); + classes->push_back( SUBCLASS(eTYPE_AGABLE_MOB)->addParent(eTYPE_PATHFINDER_MOB) ); + classes->push_back( SUBCLASS(eTYPE_VILLAGER)->addParent(eTYPE_AGABLE_MOB) ); + classes->push_back( SUBCLASS(eTYPE_ANIMAL)->addParent(eTYPE_AGABLE_MOB) ); + classes->push_back( SUBCLASS(eTYPE_TAMABLE_ANIMAL )->addParent( eTYPE_ANIMAL ) ); + classes->push_back( SUBCLASS(eTYPE_OCELOT )->addParent( eTYPE_TAMABLE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) ); + classes->push_back( SUBCLASS(eTYPE_WOLF )->addParent( eTYPE_TAMABLE_ANIMAL ) ); + classes->push_back( SUBCLASS(eTYPE_HORSE )->addParent( eTYPE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) ); + classes->push_back( SUBCLASS(eTYPE_SHEEP )->addParent( eTYPE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) ); + classes->push_back( SUBCLASS(eTYPE_PIG )->addParent( eTYPE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) ); + classes->push_back( SUBCLASS(eTYPE_CHICKEN )->addParent( eTYPE_ANIMAL ) ); + classes->push_back( SUBCLASS(eTYPE_COW )->addParent( eTYPE_ANIMAL)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) ); + classes->push_back( SUBCLASS(eTYPE_MUSHROOMCOW )->addParent( eTYPE_COW ) ); + classes->push_back( SUBCLASS(eTYPE_WATERANIMAL )->addParent(eTYPE_PATHFINDER_MOB) ); + classes->push_back( SUBCLASS(eTYPE_SQUID )->addParent( eTYPE_WATERANIMAL ) ); + classes->push_back( SUBCLASS(eTYPE_GOLEM )->addParent( eTYPE_PATHFINDER_MOB ) ); + classes->push_back( SUBCLASS(eTYPE_SNOWMAN )->addParent( eTYPE_GOLEM)->addParent(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK ) ); + classes->push_back( SUBCLASS(eTYPE_VILLAGERGOLEM )->addParent( eTYPE_GOLEM ) ); + classes->push_back( SUBCLASS(eTYPE_MONSTER )->addParent( eTYPE_ENEMY)->addParent(eTYPE_PATHFINDER_MOB ) ); + classes->push_back( SUBCLASS(eTYPE_SPIDER )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_CAVESPIDER )->addParent( eTYPE_SPIDER ) ); + classes->push_back( SUBCLASS(eTYPE_ZOMBIE )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_PIGZOMBIE )->addParent( eTYPE_ZOMBIE ) ); + classes->push_back( SUBCLASS(eTYPE_CREEPER )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_GIANT )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_SKELETON )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_ENDERMAN )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_SILVERFISH )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_BLAZE )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_WITCH )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_WITHERBOSS )->addParent( eTYPE_MONSTER)->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_AMBIENT )->addParent( eTYPE_MOB ) ); + classes->push_back( SUBCLASS(eTYPE_BAT )->addParent( eTYPE_AMBIENT )->addParent(eTYPE_VALID_IN_SPAWNER_FLAG ) ); + classes->push_back( SUBCLASS(eTYPE_FLYING_MOB )->addParent( eTYPE_MOB ) ); + classes->push_back( SUBCLASS(eTYPE_GHAST )->addParent( eTYPE_FLYING_MOB )->addParent(eTYPE_VALID_IN_SPAWNER_FLAG)->addParent(eTYPE_ENEMY ) ); + classes->push_back( SUBCLASS(eTYPE_SLIME )->addParent( eTYPE_MOB )->addParent(eTYPE_VALID_IN_SPAWNER_FLAG)->addParent(eTYPE_ENEMY ) ); + classes->push_back( SUBCLASS(eTYPE_LAVASLIME )->addParent( eTYPE_SLIME ) ); + classes->push_back( SUBCLASS(eTYPE_ENDERDRAGON )->addParent( eTYPE_MOB ) ); + classes->push_back( SUBCLASS(eTYPE_PLAYER )->addParent( eTYPE_LIVINGENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_SERVERPLAYER )->addParent( eTYPE_PLAYER ) ); + classes->push_back( SUBCLASS(eTYPE_REMOTEPLAYER )->addParent( eTYPE_PLAYER ) ); + classes->push_back( SUBCLASS(eTYPE_LOCALPLAYER )->addParent( eTYPE_PLAYER ) ); + classes->push_back( SUBCLASS(eTYPE_MINECART )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_MINECART_RIDEABLE )->addParent( eTYPE_MINECART ) ); + classes->push_back( SUBCLASS(eTYPE_MINECART_SPAWNER )->addParent( eTYPE_MINECART ) ); + classes->push_back( SUBCLASS(eTYPE_MINECART_FURNACE )->addParent( eTYPE_MINECART ) ); + classes->push_back( SUBCLASS(eTYPE_MINECART_TNT )->addParent( eTYPE_MINECART ) ); + classes->push_back( SUBCLASS(eTYPE_MINECART_CONTAINER )->addParent( eTYPE_MINECART ) ); + classes->push_back( SUBCLASS(eTYPE_MINECART_CHEST )->addParent( eTYPE_MINECART_CONTAINER ) ); + classes->push_back( SUBCLASS(eTYPE_MINECART_HOPPER )->addParent( eTYPE_MINECART_CONTAINER ) ); + classes->push_back( SUBCLASS(eTYPE_FIREBALL )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) ); + classes->push_back( SUBCLASS(eTYPE_DRAGON_FIREBALL )->addParent( eTYPE_FIREBALL ) ); + classes->push_back( SUBCLASS(eTYPE_WITHER_SKULL )->addParent( eTYPE_FIREBALL ) ); + classes->push_back( SUBCLASS(eTYPE_LARGE_FIREBALL )->addParent( eTYPE_FIREBALL ) ); + classes->push_back( SUBCLASS(eTYPE_SMALL_FIREBALL )->addParent( eTYPE_FIREBALL ) ); + classes->push_back( SUBCLASS(eTYPE_THROWABLE )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) ); + classes->push_back( SUBCLASS(eTYPE_SNOWBALL )->addParent( eTYPE_THROWABLE ) ); + classes->push_back( SUBCLASS(eTYPE_THROWNEGG )->addParent( eTYPE_THROWABLE ) ); + classes->push_back( SUBCLASS(eTYPE_THROWNENDERPEARL )->addParent( eTYPE_THROWABLE ) ); + classes->push_back( SUBCLASS(eTYPE_THROWNPOTION )->addParent( eTYPE_THROWABLE ) ); + classes->push_back( SUBCLASS(eTYPE_THROWNEXPBOTTLE )->addParent( eTYPE_THROWABLE ) ); + classes->push_back( SUBCLASS(eTYPE_HANGING_ENTITY )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_PAINTING )->addParent( eTYPE_HANGING_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_ITEM_FRAME )->addParent( eTYPE_HANGING_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_LEASHFENCEKNOT )->addParent( eTYPE_HANGING_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_GLOBAL_ENTITY )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_LIGHTNINGBOLT )->addParent( eTYPE_GLOBAL_ENTITY ) ); + + //classes->push_back( SUBCLASS(eTYPE_OTHER_ENTITIES )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_EXPERIENCEORB )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_EYEOFENDERSIGNAL )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) ); + classes->push_back( SUBCLASS(eTYPE_FIREWORKS_ROCKET )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) ); + classes->push_back( SUBCLASS(eTYPE_FISHINGHOOK )->addParent( eTYPE_ENTITY)->addParent(eTYPE_PROJECTILE ) ); + classes->push_back( SUBCLASS(eTYPE_DELAYEDRELEASE )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_BOAT )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_FALLINGTILE )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_ITEMENTITY )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_PRIMEDTNT )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_ARROW )->addParent( eTYPE_ENTITY )->addParent(eTYPE_PROJECTILE ) ); + classes->push_back( SUBCLASS(eTYPE_MULTIENTITY_MOB_PART )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_NETHER_SPHERE )->addParent( eTYPE_ENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_ENDER_CRYSTAL )->addParent( eTYPE_ENTITY ) ); + + classes->push_back( SUBCLASS(eType_BREAKINGITEMPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_BUBBLEPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_EXPLODEPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_FLAMEPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_FOOTSTEPPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_HEARTPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_LAVAPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_NOTEPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_NETHERPORTALPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_REDDUSTPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_SMOKEPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_SNOWSHOVELPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_SPLASHPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_TAKEANIMATIONPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_TERRAINPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_WATERDROPPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_CRITPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_CRITPARTICLE2)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_HUGEEXPLOSIONPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_HUGEEXPLOSIONSEEDPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_PLAYERCLOUDPARTICLEPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_SUSPENDEDPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_SUSPENDEDTOWNPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eTYPE_DRIPPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eTYPE_ENCHANTMENTTABLEPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eTYPE_SPELLPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eTYPE_DRAGONBREATHPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_ENDERPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_FIREWORKSSTARTERPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_FIREWORKSSPARKPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eType_FIREWORKSOVERLAYPARTICLE)->addParent(eTYPE_ENTITY) ); + classes->push_back( SUBCLASS(eTYPE_TILEENTITY) ); + classes->push_back( SUBCLASS(eTYPE_CHESTTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_MOBSPAWNERTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_FURNACETILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_SIGNTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_MUSICTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_RECORDPLAYERTILE )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_PISTONPIECEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_BREWINGSTANDTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_ENCHANTMENTTABLEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_THEENDPORTALTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_SKULLTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_ENDERCHESTTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_BEACONTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_COMMANDBLOCKTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_COMPARATORTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_DAYLIGHTDETECTORTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_HOPPERTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_DISPENSERTILEENTITY )->addParent( eTYPE_TILEENTITY ) ); + classes->push_back( SUBCLASS(eTYPE_DROPPERTILEENTITY )->addParent( eTYPE_DISPENSERTILEENTITY ) ); + + //classes->push_back( SUBCLASS(eTYPE_OTHERS) ); + classes->push_back( SUBCLASS(eType_NODE) ); + classes->push_back( SUBCLASS(eType_ITEM) ); + classes->push_back( SUBCLASS(eType_ITEMINSTANCE) ); + classes->push_back( SUBCLASS(eType_MAPITEM) ); + classes->push_back( SUBCLASS(eType_TILE) ); + classes->push_back( SUBCLASS(eType_FIRETILE) ); + + vector< pair > m_falsePositives; + vector< pair > m_falseNegatives; + + vector::iterator it1; + for (it1=classes->begin(); it1!=classes->end(); it1++) + { + SubClass *current = *it1; + //if ( current->justFlag() ) continue; + + vector::iterator it2; + for (it2=classes->begin(); it2!=classes->end(); it2++) + { + SubClass *comparing = *it2; + //if ( comparing->justFlag() ) continue; + + // We shouldn't be comparing to leaf classes anyway. + //if ( comparing->m_isTerminal ) continue; + + eINSTANCEOF typeCurr, typeComp; + typeCurr = current->m_id; + typeComp = comparing->m_id; + + bool shouldDerive, doesDerive; + + { + vector::iterator it3; + it3 = find(current->m_parents.begin(), current->m_parents.end(), typeComp); + shouldDerive = (typeComp == typeCurr) || (it3 != current->m_parents.end()); + } + + doesDerive = eTYPE_DERIVED_FROM(typeComp, typeCurr); + + if (shouldDerive != doesDerive) + { + vector< pair > *errorArray; + if (shouldDerive) errorArray = &m_falseNegatives; + else errorArray = &m_falsePositives; + + errorArray->push_back( pair(comparing, current) ); + } + } + } + + vector< pair >::iterator itrErr; + for (itrErr = m_falsePositives.begin(); itrErr != m_falsePositives.end(); itrErr++) + { + SubClass *sub = itrErr->first, *super = itrErr->second; + printf( "[Class.h] Error: '%s' incorrectly derives from '%s'.\n", sub->m_name.c_str(), super->m_name.c_str() ); + } + for (itrErr = m_falseNegatives.begin(); itrErr != m_falseNegatives.end(); itrErr++) + { + SubClass *sub = itrErr->first, *super = itrErr->second; + printf( "[Class.h] Error: '%s' doesn't derive '%s'.\n", sub->m_name.c_str(), super->m_name.c_str() ); + } + + if ( (m_falsePositives.size() > 0) || (m_falseNegatives.size() > 0) ) + { + __debugbreak(); + } + } +}; + +#endif \ No newline at end of file diff --git a/Minecraft.World/ClassDiagram.cd b/Minecraft.World/ClassDiagram.cd new file mode 100644 index 00000000..7b894197 --- /dev/null +++ b/Minecraft.World/ClassDiagram.cd @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Minecraft.World/ClayFeature.cpp b/Minecraft.World/ClayFeature.cpp index 88fd4512..277849f0 100644 --- a/Minecraft.World/ClayFeature.cpp +++ b/Minecraft.World/ClayFeature.cpp @@ -12,27 +12,27 @@ ClayFeature::ClayFeature(int radius) bool ClayFeature::place(Level *level, Random *random, int x, int y, int z) { - if (level->getMaterial(x, y, z) != Material::water) return false; + if (level->getMaterial(x, y, z) != Material::water) return false; - int r = random->nextInt(radius - 2) + 2; - int yr = 1; - for (int xx = x - r; xx <= x + r; xx++) + int r = random->nextInt(radius - 2) + 2; + int yr = 1; + for (int xx = x - r; xx <= x + r; xx++) { - for (int zz = z - r; zz <= z + r; zz++) + for (int zz = z - r; zz <= z + r; zz++) { - int xd = xx - x; - int zd = zz - z; - if (xd * xd + zd * zd > r * r) continue; - for (int yy = y - yr; yy <= y + yr; yy++) + int xd = xx - x; + int zd = zz - z; + if (xd * xd + zd * zd > r * r) continue; + for (int yy = y - yr; yy <= y + yr; yy++) { - int t = level->getTile(xx, yy, zz); - if (t == Tile::dirt_Id || t == Tile::clay_Id) + int t = level->getTile(xx, yy, zz); + if (t == Tile::dirt_Id || t == Tile::clay_Id) { - level->setTileNoUpdate(xx, yy, zz, tile); - } - } - } - } + level->setTileAndData(xx, yy, zz, tile, 0, Tile::UPDATE_CLIENTS); + } + } + } + } - return true; + return true; } diff --git a/Minecraft.World/ClientInformationPacket.h b/Minecraft.World/ClientInformationPacket.h index e5e2cc42..e9d73a5d 100644 --- a/Minecraft.World/ClientInformationPacket.h +++ b/Minecraft.World/ClientInformationPacket.h @@ -14,12 +14,13 @@ class ClientInformationPacket : public Packet public ClientInformationPacket() { } - public ClientInformationPacket(String language, int viewDistance, int chatVisibility, boolean chatColors, int difficulty) { + public ClientInformationPacket(String language, int viewDistance, int chatVisibility, boolean chatColors, int difficulty, boolean showCape) { this.language = language; this.viewDistance = viewDistance; this.chatVisibility = chatVisibility; this.chatColors = chatColors; this.difficulty = difficulty; + this.showCape = showCape; } @Override @@ -32,6 +33,7 @@ class ClientInformationPacket : public Packet chatColors = (chat & 0x8) == 0x8; difficulty = dis.readByte(); + showCape = dis.readBoolean(); } @Override @@ -40,6 +42,7 @@ class ClientInformationPacket : public Packet dos.writeByte(viewDistance); dos.writeByte(chatVisibility | (chatColors ? 1 : 0) << 3); dos.writeByte(difficulty); + dos.writeBoolean(showCape); } @Override @@ -49,7 +52,7 @@ class ClientInformationPacket : public Packet @Override public int getEstimatedSize() { - return 0; + return 7; } public String getLanguage() { @@ -72,6 +75,10 @@ class ClientInformationPacket : public Packet return difficulty; } + public boolean getShowCape() { + return showCape; + } + public void setDifficulty(int difficulty) { this.difficulty = difficulty; } diff --git a/Minecraft.World/ClientSideMerchant.cpp b/Minecraft.World/ClientSideMerchant.cpp index 5d021c22..ba179300 100644 --- a/Minecraft.World/ClientSideMerchant.cpp +++ b/Minecraft.World/ClientSideMerchant.cpp @@ -3,7 +3,7 @@ #include "net.minecraft.world.inventory.h" #include "ClientSideMerchant.h" -ClientSideMerchant::ClientSideMerchant(shared_ptr source, int name) +ClientSideMerchant::ClientSideMerchant(shared_ptr source, const wstring &name) { this->source = source; // 4J Stu - Need to do this after creating as a shared_ptr @@ -58,7 +58,7 @@ void ClientSideMerchant::notifyTradeUpdated(shared_ptr item) { } -int ClientSideMerchant::getDisplayName() +wstring ClientSideMerchant::getDisplayName() { return m_name; } \ No newline at end of file diff --git a/Minecraft.World/ClientSideMerchant.h b/Minecraft.World/ClientSideMerchant.h index 33f0c0b1..085768ca 100644 --- a/Minecraft.World/ClientSideMerchant.h +++ b/Minecraft.World/ClientSideMerchant.h @@ -10,21 +10,21 @@ class ClientSideMerchant : public Merchant, public enable_shared_from_this source; - MerchantRecipeList *currentOffers; - int m_name; + shared_ptr source; + MerchantRecipeList *currentOffers; + wstring m_name; public: - ClientSideMerchant(shared_ptr source, int name); + ClientSideMerchant(shared_ptr source, const wstring &name); ~ClientSideMerchant(); void createContainer(); // 4J Added - Container *getContainer(); - shared_ptr getTradingPlayer(); - void setTradingPlayer(shared_ptr player); - MerchantRecipeList *getOffers(shared_ptr forPlayer); - void overrideOffers(MerchantRecipeList *recipeList); - void notifyTrade(MerchantRecipe *activeRecipe); + Container *getContainer(); + shared_ptr getTradingPlayer(); + void setTradingPlayer(shared_ptr player); + MerchantRecipeList *getOffers(shared_ptr forPlayer); + void overrideOffers(MerchantRecipeList *recipeList); + void notifyTrade(MerchantRecipe *activeRecipe); void notifyTradeUpdated(shared_ptr item); - int getDisplayName(); + wstring getDisplayName(); }; \ No newline at end of file diff --git a/Minecraft.World/ClothDyeRecipes.cpp b/Minecraft.World/ClothDyeRecipes.cpp index 5ad38d82..c0625d2e 100644 --- a/Minecraft.World/ClothDyeRecipes.cpp +++ b/Minecraft.World/ClothDyeRecipes.cpp @@ -1,105 +1,125 @@ #include "stdafx.h" #include "net.minecraft.world.Item.h" -#include "DyePowderItem.h" -#include "Tile.h" -#include "ClothTile.h" +#include "net.minecraft.world.level.tile.h" #include "Recipy.h" #include "Recipes.h" #include "ClothDyeRecipes.h" void ClothDyeRecipes::addRecipes(Recipes *r) { - // recipes for converting cloth to colored cloth using dye - for (int i = 0; i < 16; i++) + // recipes for converting cloth to colored cloth using dye + for (int i = 0; i < 16; i++) { - r->addShapelessRecipy(new ItemInstance(Tile::cloth, 1, ClothTile::getItemAuxValueForTileData(i)), // + r->addShapelessRecipy(new ItemInstance(Tile::wool, 1, ColoredTile::getItemAuxValueForTileData(i)), // L"zzg", - new ItemInstance(Item::dye_powder, 1, i), new ItemInstance(Item::items[Tile::cloth_Id], 1, 0),L'D'); - } + new ItemInstance(Item::dye_powder, 1, i), new ItemInstance(Item::items[Tile::wool_Id], 1, 0),L'D'); + r->addShapedRecipy(new ItemInstance(Tile::clayHardened_colored, 8, ColoredTile::getItemAuxValueForTileData(i)), // + L"sssczczg", + L"###", + L"#X#", + L"###", + L'#', new ItemInstance(Tile::clayHardened), + L'X', new ItemInstance(Item::dye_powder, 1, i),L'D'); + +#if 0 + r->addShapedRecipy(new ItemInstance(Tile::stained_glass, 8, ColoredTile::getItemAuxValueForTileData(i)), // + L"sssczczg", + L"###", + L"#X#", + L"###", + L'#', new ItemInstance(Tile::glass), + L'X', new ItemInstance(Item::dye_powder, 1, i), L'D'); + r->addShapedRecipy(new ItemInstance(Tile::stained_glass_pane, 16, i), // + L"ssczg", + L"###", + L"###", + L'#', new ItemInstance(Tile::stained_glass, 1, i), L'D'); +#endif + } - // some dye recipes - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::YELLOW), + // some dye recipes + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::YELLOW), L"tg", Tile::flower,L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::RED), + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::RED), L"tg", Tile::rose,L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 3, DyePowderItem::WHITE), + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 3, DyePowderItem::WHITE), L"ig", Item::bone,L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::PINK), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::PINK), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::ORANGE), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::ORANGE), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::YELLOW),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::YELLOW),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::LIME), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::LIME), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::GREEN), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::GREEN), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::GRAY), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::GRAY), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLACK), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLACK), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::SILVER), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::SILVER), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::GRAY), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::GRAY), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 3, DyePowderItem::SILVER), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 3, DyePowderItem::SILVER), // L"zzzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLACK), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLACK), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::LIGHT_BLUE), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::LIGHT_BLUE), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::CYAN), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::CYAN), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::GREEN),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::GREEN),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::PURPLE), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::PURPLE), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::MAGENTA), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 2, DyePowderItem::MAGENTA), // L"zzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::PURPLE), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::PINK),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::PURPLE), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::PINK),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 3, DyePowderItem::MAGENTA), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 3, DyePowderItem::MAGENTA), // L"zzzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::PINK),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::PINK),L'D'); - r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 4, DyePowderItem::MAGENTA), // + r->addShapelessRecipy(new ItemInstance(Item::dye_powder, 4, DyePowderItem::MAGENTA), // L"zzzzg", - new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), - new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); + new ItemInstance(Item::dye_powder, 1, DyePowderItem::BLUE), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::RED), + new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE),L'D'); for (int i = 0; i < 16; i++) { r->addShapedRecipy(new ItemInstance(Tile::woolCarpet, 3, i), L"sczg", L"##", - L'#', new ItemInstance(Tile::cloth, 1, i), + L'#', new ItemInstance(Tile::wool, 1, i), L'D' ); } diff --git a/Minecraft.World/CoalItem.cpp b/Minecraft.World/CoalItem.cpp index 362689e0..94030122 100644 --- a/Minecraft.World/CoalItem.cpp +++ b/Minecraft.World/CoalItem.cpp @@ -1,9 +1,8 @@ -using namespace std; - #include "stdafx.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.h" #include "CoalItem.h" CoalItem::CoalItem(int id) : Item( id ) @@ -20,3 +19,19 @@ unsigned int CoalItem::getDescriptionId(shared_ptr instance) } return IDS_ITEM_COAL; } + +Icon *CoalItem::getIcon(int auxValue) +{ + if (auxValue == CHAR_COAL) + { + return charcoalIcon; + } + return Item::getIcon(auxValue); +} + +void CoalItem::registerIcons(IconRegister *iconRegister) +{ + Item::registerIcons(iconRegister); + + charcoalIcon = iconRegister->registerIcon(L"charcoal"); +} \ No newline at end of file diff --git a/Minecraft.World/CoalItem.h b/Minecraft.World/CoalItem.h index 24814548..3843c5de 100644 --- a/Minecraft.World/CoalItem.h +++ b/Minecraft.World/CoalItem.h @@ -7,6 +7,9 @@ class ItemInstance; class CoalItem : public Item { +private: + Icon *charcoalIcon; + public: static const int STONE_COAL = 0; static const int CHAR_COAL = 1; @@ -14,4 +17,7 @@ public: CoalItem(int id); virtual unsigned int getDescriptionId(shared_ptr instance); + + Icon *getIcon(int auxValue); + void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/CocoaTile.cpp b/Minecraft.World/CocoaTile.cpp index 1f575014..095f9b52 100644 --- a/Minecraft.World/CocoaTile.cpp +++ b/Minecraft.World/CocoaTile.cpp @@ -32,7 +32,7 @@ void CocoaTile::tick(Level *level, int x, int y, int z, Random *random) if (!canSurvive(level, x, y, z)) { this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->setTileAndData(x, y, z, 0, 0, UPDATE_CLIENTS); } else if (level->random->nextInt(5) == 0) { @@ -41,7 +41,7 @@ void CocoaTile::tick(Level *level, int x, int y, int z, Random *random) if (age < 2) { age++; - level->setData(x, y, z, (age << 2) | (getDirection(data))); + level->setData(x, y, z, (age << 2) | (getDirection(data)), Tile::UPDATE_CLIENTS); } } } @@ -112,10 +112,10 @@ void CocoaTile::updateShape(LevelSource *level, int x, int y, int z, int forceDa } } -void CocoaTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +void CocoaTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 0) % 4; - level->setData(x, y, z, dir); + level->setData(x, y, z, dir, Tile::UPDATE_CLIENTS); } int CocoaTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) @@ -132,7 +132,7 @@ void CocoaTile::neighborChanged(Level *level, int x, int y, int z, int type) if (!canSurvive(level, x, y, z)) { this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->setTileAndData(x, y, z, 0, 0, UPDATE_CLIENTS); } } diff --git a/Minecraft.World/CocoaTile.h b/Minecraft.World/CocoaTile.h index 267225ea..bcbb1d2f 100644 --- a/Minecraft.World/CocoaTile.h +++ b/Minecraft.World/CocoaTile.h @@ -26,7 +26,7 @@ public: virtual AABB *getAABB(Level *level, int x, int y, int z); virtual AABB *getTileAABB(Level *level, int x, int y, int z); virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); virtual void neighborChanged(Level *level, int x, int y, int z, int type); static int getAge(int data); diff --git a/Minecraft.World/ColoredTile.cpp b/Minecraft.World/ColoredTile.cpp new file mode 100644 index 00000000..6c8c1712 --- /dev/null +++ b/Minecraft.World/ColoredTile.cpp @@ -0,0 +1,36 @@ +#include "stdafx.h" +#include "net.minecraft.world.h" +#include "net.minecraft.world.item.h" +#include "ColoredTile.h" + +ColoredTile::ColoredTile(int id, Material *material) : Tile(id, material) +{ +} + +Icon *ColoredTile::getTexture(int face, int data) +{ + return icons[data % ICON_COUNT]; +} + +int ColoredTile::getSpawnResourcesAuxValue(int data) +{ + return data; +} + +int ColoredTile::getTileDataForItemAuxValue(int auxValue) +{ + return (~auxValue & 0xf); +} + +int ColoredTile::getItemAuxValueForTileData(int data) +{ + return (~data & 0xf); +} + +void ColoredTile::registerIcons(IconRegister *iconRegister) +{ + for (int i = 0; i < ICON_COUNT; i++) + { + icons[i] = iconRegister->registerIcon(getIconName() + L"_" + DyePowderItem::COLOR_TEXTURES[getItemAuxValueForTileData(i)]); + } +} \ No newline at end of file diff --git a/Minecraft.World/ColoredTile.h b/Minecraft.World/ColoredTile.h new file mode 100644 index 00000000..19310dda --- /dev/null +++ b/Minecraft.World/ColoredTile.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Tile.h" + +class ColoredTile : public Tile +{ + friend class ChunkRebuildData; + +private: + static const int ICON_COUNT = 16; + Icon *icons[ICON_COUNT]; + +public: + ColoredTile(int id, Material *material); + + Icon *getTexture(int face, int data); + virtual int getSpawnResourcesAuxValue(int data); + static int getTileDataForItemAuxValue(int auxValue); + static int getItemAuxValueForTileData(int data); + virtual void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/CombatEntry.cpp b/Minecraft.World/CombatEntry.cpp new file mode 100644 index 00000000..903d95bb --- /dev/null +++ b/Minecraft.World/CombatEntry.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.entity.h" +#include "BasicTypeContainers.h" +#include "CombatEntry.h" + +CombatEntry::CombatEntry(DamageSource *source, int time, float health, float damage, CombatTracker::eLOCATION location, float fallDistance) +{ + this->source = NULL; + if(source != NULL) + { + // 4J: this might actually be a derived damage source so use copy func + this->source = source->copy(); + } + this->time = time; + this->damage = damage; + this->health = health; + this->location = location; + this->fallDistance = fallDistance; +} + +CombatEntry::~CombatEntry() +{ + delete source; +} + +DamageSource *CombatEntry::getSource() +{ + return source; +} + +int CombatEntry::getTime() +{ + return time; +} + +float CombatEntry::getDamage() +{ + return damage; +} + +float CombatEntry::getHealthBeforeDamage() +{ + return health; +} + +float CombatEntry::getHealthAfterDamage() +{ + return health - damage; +} + +bool CombatEntry::isCombatRelated() +{ + return source->getEntity() && source->getEntity()->instanceof(eTYPE_LIVINGENTITY); +} + +CombatTracker::eLOCATION CombatEntry::getLocation() +{ + return location; +} + +wstring CombatEntry::getAttackerName() +{ + return getSource()->getEntity() == NULL ? L"" : getSource()->getEntity()->getNetworkName(); +} + +float CombatEntry::getFallDistance() +{ + if (source == DamageSource::outOfWorld) return Float::MAX_VALUE; + return fallDistance; +} \ No newline at end of file diff --git a/Minecraft.World/CombatEntry.h b/Minecraft.World/CombatEntry.h new file mode 100644 index 00000000..5d5be6ae --- /dev/null +++ b/Minecraft.World/CombatEntry.h @@ -0,0 +1,29 @@ +#pragma once +#include "CombatTracker.h" + +class DamageSource; + +class CombatEntry +{ +private: + DamageSource *source; + int time; + float damage; + float health; + CombatTracker::eLOCATION location; // 4J: Location is now an enum, not a string + float fallDistance; + +public: + CombatEntry(DamageSource *source, int time, float health, float damage, CombatTracker::eLOCATION nextLocation, float fallDistance); + ~CombatEntry(); + + DamageSource *getSource(); + int getTime(); + float getDamage(); + float getHealthBeforeDamage(); + float getHealthAfterDamage(); + bool isCombatRelated(); + CombatTracker::eLOCATION getLocation(); + wstring getAttackerName(); + float getFallDistance(); +}; \ No newline at end of file diff --git a/Minecraft.World/CombatTracker.cpp b/Minecraft.World/CombatTracker.cpp new file mode 100644 index 00000000..77aac68a --- /dev/null +++ b/Minecraft.World/CombatTracker.cpp @@ -0,0 +1,252 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.world.damagesource.h" +#include "CombatTracker.h" + +CombatTracker::CombatTracker(LivingEntity *mob) +{ + this->mob = mob; +} + +CombatTracker::~CombatTracker() +{ + for (AUTO_VAR(it,entries.begin()); it != entries.end(); ++it) + { + delete (*it); + } +} + + +void CombatTracker::prepareForDamage() +{ + resetPreparedStatus(); + + if (mob->onLadder()) + { + int type = mob->level->getTile(Mth::floor(mob->x), Mth::floor(mob->bb->y0), Mth::floor(mob->z)); + + if (type == Tile::ladder->id) + { + nextLocation = eLocation_LADDER; + } + else if (type == Tile::vine->id) + { + nextLocation = eLocation_VINES; + } + } + else if (mob->isInWater()) + { + nextLocation = eLocation_WATER; + } +} + +void CombatTracker::recordDamage(DamageSource *source, float health, float damage) +{ + recheckStatus(); + prepareForDamage(); + + CombatEntry *entry = new CombatEntry(source, mob->tickCount, health, damage, nextLocation, mob->fallDistance); + + entries.push_back(entry); + lastDamageTime = mob->tickCount; + takingDamage = true; + inCombat |= entry->isCombatRelated(); +} + +shared_ptr CombatTracker::getDeathMessagePacket() +{ + if (entries.size() == 0) return shared_ptr(new ChatPacket(mob->getNetworkName())); + + CombatEntry *knockOffEntry = getMostSignificantFall(); + CombatEntry *killingBlow = entries[entries.size() - 1]; + + shared_ptr result; + + shared_ptr killingEntity = killingBlow->getSource()->getEntity(); + + if (knockOffEntry != NULL && killingBlow->getSource()->equals(DamageSource::fall)) + { + shared_ptr attackerEntity = knockOffEntry->getSource()->getEntity(); + + if (knockOffEntry->getSource()->equals(DamageSource::fall) || knockOffEntry->getSource()->equals(DamageSource::outOfWorld)) + { + ChatPacket::EChatPacketMessage message; + + switch(getFallLocation(knockOffEntry)) + { + case eLocation_GENERIC: + message = ChatPacket::e_ChatDeathFellAccidentGeneric; + break; + case eLocation_LADDER: + message = ChatPacket::e_ChatDeathFellAccidentLadder; + break; + case eLocation_VINES: + message = ChatPacket::e_ChatDeathFellAccidentVines; + break; + case eLocation_WATER: + message = ChatPacket::e_ChatDeathFellAccidentWater; + break; + } + + result = shared_ptr(new ChatPacket(mob->getNetworkName(), message)); + } + else if (attackerEntity != NULL && (killingEntity == NULL || attackerEntity != killingEntity)) + { + shared_ptr attackerItem = attackerEntity->instanceof(eTYPE_LIVINGENTITY) ? dynamic_pointer_cast(attackerEntity)->getCarriedItem() : nullptr; + + if (attackerItem != NULL && attackerItem->hasCustomHoverName()) + { + result = shared_ptr(new ChatPacket(mob->getNetworkName(), ChatPacket::e_ChatDeathFellAssistItem, attackerEntity->GetType(), attackerEntity->getNetworkName(), attackerItem->getHoverName())); + } + else + { + result = shared_ptr(new ChatPacket(mob->getNetworkName(), ChatPacket::e_ChatDeathFellAssist, attackerEntity->GetType(), attackerEntity->getNetworkName())); + } + } + else if (killingEntity != NULL) + { + shared_ptr killerItem = killingEntity->instanceof(eTYPE_LIVINGENTITY) ? dynamic_pointer_cast(killingEntity)->getCarriedItem() : nullptr; + if (killerItem != NULL && killerItem->hasCustomHoverName()) + { + result = shared_ptr(new ChatPacket(mob->getNetworkName(), ChatPacket::e_ChatDeathFellFinishItem, killingEntity->GetType(), killingEntity->getNetworkName(), killerItem->getHoverName())); + } + else + { + result = shared_ptr(new ChatPacket(mob->getNetworkName(), ChatPacket::e_ChatDeathFellFinish, killingEntity->GetType(), killingEntity->getNetworkName())); + } + } + else + { + result = shared_ptr(new ChatPacket(mob->getNetworkName(), ChatPacket::e_ChatDeathFellKiller)); + } + } + else + { + result = killingBlow->getSource()->getDeathMessagePacket(dynamic_pointer_cast(mob->shared_from_this())); + } + + return result; +} + +shared_ptr CombatTracker::getKiller() +{ + shared_ptr bestMob = nullptr; + shared_ptr bestPlayer = nullptr; + float bestMobDamage = 0; + float bestPlayerDamage = 0; + + for (AUTO_VAR(it,entries.begin()); it != entries.end(); ++it) + { + CombatEntry *entry = *it; + if ( entry->getSource() != NULL && entry->getSource()->getEntity() != NULL && entry->getSource()->getEntity()->instanceof(eTYPE_PLAYER) && (bestPlayer == NULL || entry->getDamage() > bestPlayerDamage)) + { + bestPlayerDamage = entry->getDamage(); + bestPlayer = dynamic_pointer_cast(entry->getSource()->getEntity()); + } + + if ( entry->getSource() != NULL && entry->getSource()->getEntity() != NULL && entry->getSource()->getEntity()->instanceof(eTYPE_LIVINGENTITY) && (bestMob == NULL || entry->getDamage() > bestMobDamage)) + { + bestMobDamage = entry->getDamage(); + bestMob = dynamic_pointer_cast(entry->getSource()->getEntity()); + } + } + + if (bestPlayer != NULL && bestPlayerDamage >= bestMobDamage / 3) + { + return bestPlayer; + } + else + { + return bestMob; + } +} + +CombatEntry *CombatTracker::getMostSignificantFall() +{ + CombatEntry *result = NULL; + CombatEntry *alternative = NULL; + int altDamage = 0; + float bestFall = 0; + + for (int i = 0; i < entries.size(); i++) + { + CombatEntry *entry = entries.at(i); + CombatEntry *previous = i > 0 ? entries.at(i - 1) : NULL; + + bool isFall = entry->getSource()->equals(DamageSource::fall); + bool isOutOfWorld = entry->getSource()->equals(DamageSource::outOfWorld); + + if ((isFall || isOutOfWorld) && (entry->getFallDistance() > 0) && (result == NULL || entry->getFallDistance() > bestFall)) + { + if (i > 0) + { + result = previous; + } + else + { + result = entry; + } + bestFall = entry->getFallDistance(); + } + + if (entry->getLocation() != eLocation_GENERIC && (alternative == NULL || entry->getDamage() > altDamage)) + { + alternative = entry; + } + } + + if (bestFall > 5 && result != NULL) + { + return result; + } + else if (altDamage > 5 && alternative != NULL) + { + return alternative; + } + else + { + return NULL; + } +} + +CombatTracker::eLOCATION CombatTracker::getFallLocation(CombatEntry *entry) +{ + return entry->getLocation(); + +} + +bool CombatTracker::isTakingDamage() +{ + recheckStatus(); + return takingDamage; +} + +bool CombatTracker::isInCombat() +{ + recheckStatus(); + return inCombat; +} + +void CombatTracker::resetPreparedStatus() +{ + nextLocation = eLocation_GENERIC; +} + +void CombatTracker::recheckStatus() +{ + int reset = inCombat ? RESET_COMBAT_STATUS_TIME : RESET_DAMAGE_STATUS_TIME; + + if (takingDamage && mob->tickCount - lastDamageTime > reset) + { + for (AUTO_VAR(it,entries.begin()); it != entries.end(); ++it) + { + delete (*it); + } + entries.clear(); + takingDamage = false; + inCombat = false; + } +} \ No newline at end of file diff --git a/Minecraft.World/CombatTracker.h b/Minecraft.World/CombatTracker.h new file mode 100644 index 00000000..8c3b7717 --- /dev/null +++ b/Minecraft.World/CombatTracker.h @@ -0,0 +1,54 @@ +#pragma once + +#include "SharedConstants.h" + +class CombatEntry; +class LivingEntity; +class ChatPacket; + +class CombatTracker +{ +public: + static const int RESET_DAMAGE_STATUS_TIME = SharedConstants::TICKS_PER_SECOND * 5; + static const int RESET_COMBAT_STATUS_TIME = SharedConstants::TICKS_PER_SECOND * 15; + + // 4J: This enum replaces + enum eLOCATION + { + eLocation_GENERIC = 0, + eLocation_LADDER, + eLocation_VINES, + eLocation_WATER, + + eLocation_COUNT, + }; + +private: + vector entries; + LivingEntity *mob; //Owner + int lastDamageTime; + bool inCombat; + bool takingDamage; + eLOCATION nextLocation; // 4J: Location is now an enum, not a string + +public: + CombatTracker(LivingEntity *mob); + ~CombatTracker(); + + void prepareForDamage(); + void recordDamage(DamageSource *source, float health, float damage); + shared_ptr getDeathMessagePacket(); // 4J: Changed this to return a chat packet + shared_ptr getKiller(); + +private: + CombatEntry *getMostSignificantFall(); + eLOCATION getFallLocation(CombatEntry *entry); + +public: + bool isTakingDamage(); + bool isInCombat(); + +private: + void resetPreparedStatus(); + void recheckStatus(); +}; \ No newline at end of file diff --git a/Minecraft.World/Command.cpp b/Minecraft.World/Command.cpp index f6d0e592..bf546f6e 100644 --- a/Minecraft.World/Command.cpp +++ b/Minecraft.World/Command.cpp @@ -7,6 +7,11 @@ AdminLogCommand *Command::logger; +int Command::getPermissionLevel() +{ + return LEVEL_OWNERS; +} + bool Command::canExecute(shared_ptr source) { return source->hasPermission(getId()); diff --git a/Minecraft.World/Command.h b/Minecraft.World/Command.h index 815c24ba..8c060a6f 100644 --- a/Minecraft.World/Command.h +++ b/Minecraft.World/Command.h @@ -11,11 +11,24 @@ class ServerPlayer; class Command { +public: + // commands such as "help" and "emote" + static const int LEVEL_ALL = 0; + // commands such as "mute" + static const int LEVEL_MODERATORS = 1; + // commands such as "seed", "tp", "spawnpoint" and "give" + static const int LEVEL_GAMEMASTERS = 2; + // commands such as "whitelist", "ban", etc + static const int LEVEL_ADMINS = 3; + // commands such as "stop", "save-all", etc + static const int LEVEL_OWNERS = 4; + private: static AdminLogCommand *logger; public: virtual EGameCommand getId() = 0; + virtual int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData) = 0; virtual bool canExecute(shared_ptr source); diff --git a/Minecraft.World/CommandBlock.cpp b/Minecraft.World/CommandBlock.cpp new file mode 100644 index 00000000..e1b6b8dd --- /dev/null +++ b/Minecraft.World/CommandBlock.cpp @@ -0,0 +1,96 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "CommandBlock.h" + +CommandBlock::CommandBlock(int id) : BaseEntityTile(id, Material::metal, isSolidRender() ) +{ +} + +shared_ptr CommandBlock::newTileEntity(Level *level) +{ + return shared_ptr( new CommandBlockEntity() ); +} + +void CommandBlock::neighborChanged(Level *level, int x, int y, int z, int type) +{ + if (!level->isClientSide) + { + + bool signal = level->hasNeighborSignal(x, y, z); + int data = level->getData(x, y, z); + bool isTriggered = (data & TRIGGER_BIT) != 0; + + if (signal && !isTriggered) + { + level->setData(x, y, z, data | TRIGGER_BIT, Tile::UPDATE_NONE); + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); + } + else if (!signal && isTriggered) + { + level->setData(x, y, z, data & ~TRIGGER_BIT, Tile::UPDATE_NONE); + } + } +} + +void CommandBlock::tick(Level *level, int x, int y, int z, Random *random) +{ + shared_ptr tileEntity = level->getTileEntity(x, y, z); + + if (tileEntity != NULL && dynamic_pointer_cast( tileEntity ) != NULL) + { + shared_ptr commandBlock = dynamic_pointer_cast( tileEntity ); + commandBlock->setSuccessCount(commandBlock->performCommand(level)); + level->updateNeighbourForOutputSignal(x, y, z, id); + } +} + +int CommandBlock::getTickDelay(Level *level) +{ + return 1; +} + +bool CommandBlock::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +{ + shared_ptr amce = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + + if (amce != NULL) + { + player->openTextEdit(amce); + } + + return true; +} + +bool CommandBlock::hasAnalogOutputSignal() +{ + return true; +} + +int CommandBlock::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + shared_ptr tileEntity = level->getTileEntity(x, y, z); + + if (tileEntity != NULL && dynamic_pointer_cast( tileEntity ) != NULL) + { + return dynamic_pointer_cast( tileEntity )->getSuccessCount(); + } + + return Redstone::SIGNAL_NONE; +} + +void CommandBlock::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + shared_ptr cblock = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + + if (itemInstance->hasCustomHoverName()) + { + cblock->setName(itemInstance->getHoverName()); + } +} + +int CommandBlock::getResourceCount(Random *random) +{ + return 0; +} \ No newline at end of file diff --git a/Minecraft.World/CommandBlock.h b/Minecraft.World/CommandBlock.h new file mode 100644 index 00000000..eac83b51 --- /dev/null +++ b/Minecraft.World/CommandBlock.h @@ -0,0 +1,22 @@ +#pragma once + +#include "BaseEntityTile.h" + +class CommandBlock : public BaseEntityTile +{ +private: + static const int TRIGGER_BIT = 1; + +public: + CommandBlock(int id); + + virtual shared_ptr newTileEntity(Level *level); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual int getTickDelay(Level *level); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual int getResourceCount(Random *random); +}; \ No newline at end of file diff --git a/Minecraft.World/CommandBlockEntity.cpp b/Minecraft.World/CommandBlockEntity.cpp new file mode 100644 index 00000000..1c518f4f --- /dev/null +++ b/Minecraft.World/CommandBlockEntity.cpp @@ -0,0 +1,121 @@ +#include "stdafx.h" +#include "net.minecraft.network.packet.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.commands.h" +#include "..\Minecraft.Client\MinecraftServer.h" +#include "CommandBlockEntity.h" + +CommandBlockEntity::CommandBlockEntity() +{ + successCount = 0; + command = L""; + name = L"@"; +} + +void CommandBlockEntity::setCommand(const wstring &command) +{ + this->command = command; + setChanged(); +} + +wstring CommandBlockEntity::getCommand() +{ + return command; +} + +int CommandBlockEntity::performCommand(Level *level) +{ +#if 0 + if (level->isClientSide) + { + return 0; + } + + MinecraftServer *instance = MinecraftServer::getInstance(); + if (instance != NULL && instance->isCommandBlockEnabled()) + { + CommandDispatcher *commandDispatcher = instance->getCommandDispatcher(); + return commandDispatcher->performCommand(dynamic_pointer_cast(shared_from_this()), command, byteArray() ); + } + return 0; +#else + // 4J-JEV: Cannot decide what to do with the command field. + assert(false); + return 0; +#endif +} + +wstring CommandBlockEntity::getName() +{ + return name; +} + +void CommandBlockEntity::setName(const wstring &name) +{ + this->name = name; +} + +void CommandBlockEntity::sendMessage(const wstring& message, ChatPacket::EChatPacketMessage type, int customData , const wstring& additionalMessage) +{ +} + +bool CommandBlockEntity::hasPermission(EGameCommand command) +{ + return false; +} + +void CommandBlockEntity::save(CompoundTag *tag) +{ + TileEntity::save(tag); + tag->putString(L"Command", command); + tag->putInt(L"SuccessCount", successCount); + tag->putString(L"CustomName", name); +} + +void CommandBlockEntity::load(CompoundTag *tag) +{ + TileEntity::load(tag); + command = tag->getString(L"Command"); + successCount = tag->getInt(L"SuccessCount"); + if (tag->contains(L"CustomName")) name = tag->getString(L"CustomName"); +} + +Pos *CommandBlockEntity::getCommandSenderWorldPosition() +{ + return new Pos(x, y, z); +} + +Level *CommandBlockEntity::getCommandSenderWorld() +{ + return getLevel(); +} + +shared_ptr CommandBlockEntity::getUpdatePacket() +{ + CompoundTag *tag = new CompoundTag(); + save(tag); + return shared_ptr( new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_ADV_COMMAND, tag) ); +} + +int CommandBlockEntity::getSuccessCount() +{ + return successCount; +} + +void CommandBlockEntity::setSuccessCount(int successCount) +{ + this->successCount = successCount; +} + +// 4J Added +shared_ptr CommandBlockEntity::clone() +{ + shared_ptr result = shared_ptr( new CommandBlockEntity() ); + TileEntity::clone(result); + + result->successCount = successCount; + result->command = command; + result->name = name; + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/CommandBlockEntity.h b/Minecraft.World/CommandBlockEntity.h new file mode 100644 index 00000000..3a3c10b6 --- /dev/null +++ b/Minecraft.World/CommandBlockEntity.h @@ -0,0 +1,41 @@ +#pragma once + +#include "TileEntity.h" +#include "CommandSender.h" + +class ChatMessageComponent; + +class CommandBlockEntity : public TileEntity, public CommandSender +{ +public: + eINSTANCEOF GetType() { return eTYPE_COMMANDBLOCKTILEENTITY; } + static TileEntity *create() { return new CommandBlockEntity(); } + + // 4J Added + virtual shared_ptr clone(); + +private: + int successCount; + wstring command; + wstring name; + +public: + CommandBlockEntity(); + + void setCommand(const wstring &command); + wstring getCommand(); + int performCommand(Level *level); + wstring getName(); + void setName(const wstring &name); + virtual void sendMessage(const wstring& message, ChatPacket::EChatPacketMessage type = ChatPacket::e_ChatCustom, int customData = -1, const wstring& additionalMessage = L""); + virtual bool hasPermission(EGameCommand command); + //void sendMessage(ChatMessageComponent *message); + //bool hasPermission(int permissionLevel, const wstring &commandName); + void save(CompoundTag *tag); + void load(CompoundTag *tag); + Pos *getCommandSenderWorldPosition(); + Level *getCommandSenderWorld(); + shared_ptr getUpdatePacket(); + int getSuccessCount(); + void setSuccessCount(int successCount); +}; \ No newline at end of file diff --git a/Minecraft.World/CommandDispatcher.cpp b/Minecraft.World/CommandDispatcher.cpp index 68b74ca9..545063db 100644 --- a/Minecraft.World/CommandDispatcher.cpp +++ b/Minecraft.World/CommandDispatcher.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.commands.h" #include "CommandDispatcher.h" -void CommandDispatcher::performCommand(shared_ptr sender, EGameCommand command, byteArray commandData) +int CommandDispatcher::performCommand(shared_ptr sender, EGameCommand command, byteArray commandData) { AUTO_VAR(it, commandsById.find(command)); @@ -24,6 +24,8 @@ void CommandDispatcher::performCommand(shared_ptr sender, EGameCo { app.DebugPrintf("Command %d not found!\n", command); } + + return 0; } Command *CommandDispatcher::addCommand(Command *command) diff --git a/Minecraft.World/CommandDispatcher.h b/Minecraft.World/CommandDispatcher.h index 600f1db1..34d1b109 100644 --- a/Minecraft.World/CommandDispatcher.h +++ b/Minecraft.World/CommandDispatcher.h @@ -14,6 +14,6 @@ private: unordered_set commands; public: - void performCommand(shared_ptr sender, EGameCommand command, byteArray commandData); + int performCommand(shared_ptr sender, EGameCommand command, byteArray commandData); Command *addCommand(Command *command); }; \ No newline at end of file diff --git a/Minecraft.World/CommandsEnum.h b/Minecraft.World/CommandsEnum.h index 46793e21..ba46a5ee 100644 --- a/Minecraft.World/CommandsEnum.h +++ b/Minecraft.World/CommandsEnum.h @@ -3,6 +3,7 @@ enum EGameCommand { eGameCommand_DefaultGameMode, + eGameCommand_Effect, eGameCommand_EnchantItem, eGameCommand_Experience, eGameCommand_GameMode, diff --git a/Minecraft.World/CommonStats.cpp b/Minecraft.World/CommonStats.cpp index 8231070c..abef92aa 100644 --- a/Minecraft.World/CommonStats.cpp +++ b/Minecraft.World/CommonStats.cpp @@ -55,7 +55,7 @@ Stat *CommonStats::get_breedEntity(eINSTANCEOF mobType) Stat *CommonStats::get_tamedEntity(eINSTANCEOF mobType) { - if (mobType == eTYPE_OZELOT) return GenericStats::lionTamer(); + if (mobType == eTYPE_OCELOT) return GenericStats::lionTamer(); else if (mobType == eTYPE_WOLF) return Stats::befriendsWolf; else return NULL; } @@ -93,7 +93,7 @@ Stat *CommonStats::get_itemsCollected(int itemId, int itemAux) // stor itemsBought(emerald) so I don't have to make yet another massive // StatArray for Items Bought. #if (defined _EXTENDED_ACHIEVEMENTS) && (!defined _XBOX_ONE) - if (itemId == Tile::cloth_Id) return Stats::rainbowCollection[itemAux]; + if (itemId == Tile::wool_Id) return Stats::rainbowCollection[itemAux]; #endif if (itemId != Item::emerald_Id) return Stats::itemsCollected[itemId]; diff --git a/Minecraft.World/ComparatorTile.cpp b/Minecraft.World/ComparatorTile.cpp new file mode 100644 index 00000000..f611424d --- /dev/null +++ b/Minecraft.World/ComparatorTile.cpp @@ -0,0 +1,253 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.h" +#include "ComparatorTile.h" + +ComparatorTile::ComparatorTile(int id, bool on) : DiodeTile(id, on) +{ + _isEntityTile = true; +} + +int ComparatorTile::getResource(int data, Random *random, int playerBonusLevel) +{ + return Item::comparator_Id; +} + +int ComparatorTile::cloneTileId(Level *level, int x, int y, int z) +{ + return Item::comparator_Id; +} + +int ComparatorTile::getTurnOnDelay(int data) +{ + return 2; +} + +DiodeTile *ComparatorTile::getOnTile() +{ + return Tile::comparator_on; +} + +DiodeTile *ComparatorTile::getOffTile() +{ + return Tile::comparator_off; +} + +int ComparatorTile::getRenderShape() +{ + return SHAPE_COMPARATOR; +} + +Icon *ComparatorTile::getTexture(int face, int data) +{ + bool isOn = on || (data & BIT_IS_LIT) != 0; + // down is used by the torch tesselator + if (face == Facing::DOWN) + { + if (isOn) + { + return Tile::redstoneTorch_on->getTexture(face); + } + return Tile::redstoneTorch_off->getTexture(face); + } + if (face == Facing::UP) + { + if (isOn) + { + return Tile::comparator_on->icon; + } + return icon; + } + // edge of stone half-step + return Tile::stoneSlab->getTexture(Facing::UP); +} + +bool ComparatorTile::isOn(int data) +{ + return on || (data & BIT_IS_LIT) != 0; +} + +int ComparatorTile::getOutputSignal(LevelSource *levelSource, int x, int y, int z, int data) +{ + return getComparator(levelSource, x, y, z)->getOutputSignal(); +} + +int ComparatorTile::calculateOutputSignal(Level *level, int x, int y, int z, int data) +{ + if (!isReversedOutputSignal(data)) + { + return getInputSignal(level, x, y, z, data); + } + else + { + return max(getInputSignal(level, x, y, z, data) - getAlternateSignal(level, x, y, z, data), Redstone::SIGNAL_NONE); + } +} + +bool ComparatorTile::isReversedOutputSignal(int data) +{ + return (data & BIT_OUTPUT_SUBTRACT) == BIT_OUTPUT_SUBTRACT; +} + +bool ComparatorTile::shouldTurnOn(Level *level, int x, int y, int z, int data) +{ + int input = getInputSignal(level, x, y, z, data); + if (input >= Redstone::SIGNAL_MAX) return true; + if (input == Redstone::SIGNAL_NONE) return false; + + int alt = getAlternateSignal(level, x, y, z, data); + if (alt == Redstone::SIGNAL_NONE) return true; + + return input >= alt; +} + +int ComparatorTile::getInputSignal(Level *level, int x, int y, int z, int data) +{ + int result = DiodeTile::getInputSignal(level, x, y, z, data); + + int dir = getDirection(data); + int xx = x + Direction::STEP_X[dir]; + int zz = z + Direction::STEP_Z[dir]; + int tile = level->getTile(xx, y, zz); + + if (tile > 0) + { + if (Tile::tiles[tile]->hasAnalogOutputSignal()) + { + result = Tile::tiles[tile]->getAnalogOutputSignal(level, xx, y, zz, Direction::DIRECTION_OPPOSITE[dir]); + } + else if (result < Redstone::SIGNAL_MAX && Tile::isSolidBlockingTile(tile)) + { + xx += Direction::STEP_X[dir]; + zz += Direction::STEP_Z[dir]; + tile = level->getTile(xx, y, zz); + + if (tile > 0 && Tile::tiles[tile]->hasAnalogOutputSignal()) + { + result = Tile::tiles[tile]->getAnalogOutputSignal(level, xx, y, zz, Direction::DIRECTION_OPPOSITE[dir]); + } + } + } + + return result; +} + +shared_ptr ComparatorTile::getComparator(LevelSource *level, int x, int y, int z) +{ + return dynamic_pointer_cast( level->getTileEntity(x, y, z) ); +} + +bool ComparatorTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +{ + int data = level->getData(x, y, z); + bool isOn = on || ( (data & BIT_IS_LIT) != 0 ); + bool subtract = !isReversedOutputSignal(data); + int outputBit = subtract ? BIT_OUTPUT_SUBTRACT : 0; + outputBit |= isOn ? BIT_IS_LIT : 0; + + level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, subtract ? 0.55f : 0.5f); + + if (!soundOnly) + { + level->setData(x, y, z, outputBit | (data & DIRECTION_MASK), Tile::UPDATE_CLIENTS); + refreshOutputState(level, x, y, z, level->random); + } + + return true; +} + +void ComparatorTile::checkTickOnNeighbor(Level *level, int x, int y, int z, int type) +{ + if (!level->isTileToBeTickedAt(x, y, z, id)) + { + int data = level->getData(x, y, z); + int outputValue = calculateOutputSignal(level, x, y, z, data); + int oldValue = getComparator(level, x, y, z)->getOutputSignal(); + + if (outputValue != oldValue || (isOn(data) != shouldTurnOn(level, x, y, z, data))) + { + // prioritize locking comparators + if (shouldPrioritize(level, x, y, z, data)) + { + level->addToTickNextTick(x, y, z, id, getTurnOnDelay(0), -1); + } + else + { + level->addToTickNextTick(x, y, z, id, getTurnOnDelay(0), 0); + } + } + } +} + +void ComparatorTile::refreshOutputState(Level *level, int x, int y, int z, Random *random) +{ + int data = level->getData(x, y, z); + int outputValue = calculateOutputSignal(level, x, y, z, data); + int oldValue = getComparator(level, x, y, z)->getOutputSignal(); + getComparator(level, x, y, z)->setOutputSignal(outputValue); + + if (oldValue != outputValue || !isReversedOutputSignal(data)) + { + bool sourceOn = shouldTurnOn(level, x, y, z, data); + bool isOn = on || (data & BIT_IS_LIT) != 0; + if (isOn && !sourceOn) + { + level->setData(x, y, z, data & ~BIT_IS_LIT, Tile::UPDATE_CLIENTS); + } + else if (!isOn && sourceOn) + { + level->setData(x, y, z, data | BIT_IS_LIT, Tile::UPDATE_CLIENTS); + } + updateNeighborsInFront(level, x, y, z); + } +} + +void ComparatorTile::tick(Level *level, int x, int y, int z, Random *random) +{ + if (on) + { + // clean-up old tiles with the 'on' id + int data = level->getData(x, y, z); + level->setTileAndData(x, y, z, getOffTile()->id, data | BIT_IS_LIT, Tile::UPDATE_NONE); + } + refreshOutputState(level, x, y, z, random); +} + +void ComparatorTile::onPlace(Level *level, int x, int y, int z) +{ + DiodeTile::onPlace(level, x, y, z); + level->setTileEntity(x, y, z, newTileEntity(level)); +} + +void ComparatorTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + DiodeTile::onRemove(level, x, y, z, id, data); + level->removeTileEntity(x, y, z); + + updateNeighborsInFront(level, x, y, z); +} + +bool ComparatorTile::triggerEvent(Level *level, int x, int y, int z, int b0, int b1) +{ + DiodeTile::triggerEvent(level, x, y, z, b0, b1); + shared_ptr te = level->getTileEntity(x, y, z); + if (te != NULL) + { + return te->triggerEvent(b0, b1); + } + return false; +} + +shared_ptr ComparatorTile::newTileEntity(Level *level) +{ + return shared_ptr( new ComparatorTileEntity() ); +} + +bool ComparatorTile::TestUse() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.World/ComparatorTile.h b/Minecraft.World/ComparatorTile.h new file mode 100644 index 00000000..3358d3ab --- /dev/null +++ b/Minecraft.World/ComparatorTile.h @@ -0,0 +1,60 @@ +#pragma once + +#include "DiodeTile.h" +#include "EntityTile.h" + +class ComparatorTileEntity; + +class ComparatorTile : public DiodeTile, public EntityTile +{ +private: + static const int BIT_OUTPUT_SUBTRACT = 0x4; + static const int BIT_IS_LIT = 0x8; + +public: + ComparatorTile(int id, bool on); + + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int cloneTileId(Level *level, int x, int y, int z); + +protected: + virtual int getTurnOnDelay(int data); + virtual DiodeTile *getOnTile(); + virtual DiodeTile *getOffTile(); + +public: + virtual int getRenderShape(); + virtual Icon *getTexture(int face, int data); + +protected: + virtual bool isOn(int data); + virtual int getOutputSignal(LevelSource *levelSource, int x, int y, int z, int data); + +private: + virtual int calculateOutputSignal(Level *level, int x, int y, int z, int data); + +public: + virtual bool isReversedOutputSignal(int data); + +protected: + virtual bool shouldTurnOn(Level *level, int x, int y, int z, int data); + virtual int getInputSignal(Level *level, int x, int y, int z, int data); + virtual shared_ptr getComparator(LevelSource *level, int x, int y, int z); + +public: + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + +protected: + virtual void checkTickOnNeighbor(Level *level, int x, int y, int z, int type); + +private: + virtual void refreshOutputState(Level *level, int x, int y, int z, Random *random); + +public: + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual bool triggerEvent(Level *level, int x, int y, int z, int b0, int b1); + virtual shared_ptr newTileEntity(Level *level); + virtual bool TestUse(); +}; \ No newline at end of file diff --git a/Minecraft.World/ComparatorTileEntity.cpp b/Minecraft.World/ComparatorTileEntity.cpp new file mode 100644 index 00000000..9a58d23c --- /dev/null +++ b/Minecraft.World/ComparatorTileEntity.cpp @@ -0,0 +1,36 @@ +#include "stdafx.h" + +#include "ComparatorTileEntity.h" + +void ComparatorTileEntity::save(CompoundTag *tag) +{ + TileEntity::save(tag); + tag->putInt(L"OutputSignal", output); +} + +void ComparatorTileEntity::load(CompoundTag *tag) +{ + TileEntity::load(tag); + output = tag->getInt(L"OutputSignal"); +} + +int ComparatorTileEntity::getOutputSignal() +{ + return output; +} + +void ComparatorTileEntity::setOutputSignal(int value) +{ + output = value; +} + +// 4J Added +shared_ptr ComparatorTileEntity::clone() +{ + shared_ptr result = shared_ptr( new ComparatorTileEntity() ); + TileEntity::clone(result); + + result->output = output; + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/ComparatorTileEntity.h b/Minecraft.World/ComparatorTileEntity.h new file mode 100644 index 00000000..edbf367f --- /dev/null +++ b/Minecraft.World/ComparatorTileEntity.h @@ -0,0 +1,22 @@ +#pragma once + +#include "TileEntity.h" + +class ComparatorTileEntity : public TileEntity +{ +public: + eINSTANCEOF GetType() { return eTYPE_COMPARATORTILEENTITY; } + static TileEntity *create() { return new ComparatorTileEntity(); } + + // 4J Added + virtual shared_ptr clone(); + +private: + int output; + +public: + void save(CompoundTag *tag); + void load(CompoundTag *tag); + int getOutputSignal(); + void setOutputSignal(int value); +}; \ No newline at end of file diff --git a/Minecraft.World/ComplexItemDataPacket.cpp b/Minecraft.World/ComplexItemDataPacket.cpp index 4c365bbd..38c39cb6 100644 --- a/Minecraft.World/ComplexItemDataPacket.cpp +++ b/Minecraft.World/ComplexItemDataPacket.cpp @@ -32,7 +32,7 @@ void ComplexItemDataPacket::read(DataInputStream *dis) //throws IOException itemType = dis->readShort(); itemId = dis->readShort(); - data = charArray(dis->readShort() & 0xffff); + data = charArray(dis->readUnsignedShort() & 0xffff); dis->readFully(data); } @@ -40,7 +40,7 @@ void ComplexItemDataPacket::write(DataOutputStream *dos) //throws IOException { dos->writeShort(itemType); dos->writeShort(itemId); - dos->writeShort(data.length); + dos->writeUnsignedShort(data.length); byteArray ba( (byte*)data.data, data.length ); dos->write(ba); diff --git a/Minecraft.World/CompoundContainer.cpp b/Minecraft.World/CompoundContainer.cpp index 29bf60dd..674f15db 100644 --- a/Minecraft.World/CompoundContainer.cpp +++ b/Minecraft.World/CompoundContainer.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.entity.player.h" - +#include "ContainerOpenPacket.h" #include "CompoundContainer.h" CompoundContainer::CompoundContainer(int name, shared_ptr c1, shared_ptr c2) @@ -12,14 +12,38 @@ CompoundContainer::CompoundContainer(int name, shared_ptr c1, shared_ this->c2 = c2; } +int CompoundContainer::getContainerType() +{ + return ContainerOpenPacket::LARGE_CHEST; +} + unsigned int CompoundContainer::getContainerSize() { return c1->getContainerSize() + c2->getContainerSize(); } -int CompoundContainer::getName() +bool CompoundContainer::contains(shared_ptr c) +{ + return c1 == c || c2 == c; +} + +wstring CompoundContainer::getName() +{ + if (c1->hasCustomName()) return c1->getName(); + if (c2->hasCustomName()) return c2->getName(); + return app.GetString(name); +} + +wstring CompoundContainer::getCustomName() +{ + if (c1->hasCustomName()) return c1->getName(); + if (c2->hasCustomName()) return c2->getName(); + return L""; +} + +bool CompoundContainer::hasCustomName() { - return name; + return c1->hasCustomName() || c2->hasCustomName(); } shared_ptr CompoundContainer::getItem(unsigned int slot) @@ -72,4 +96,9 @@ void CompoundContainer::stopOpen() { c1->stopOpen(); c2->stopOpen(); +} + +bool CompoundContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; } \ No newline at end of file diff --git a/Minecraft.World/CompoundContainer.h b/Minecraft.World/CompoundContainer.h index b0b8b934..126a712a 100644 --- a/Minecraft.World/CompoundContainer.h +++ b/Minecraft.World/CompoundContainer.h @@ -14,23 +14,21 @@ private: public: CompoundContainer(int name, shared_ptr c1, shared_ptr c2); - unsigned int getContainerSize(); - - int getName(); - - shared_ptr getItem(unsigned int slot); - - shared_ptr removeItem(unsigned int slot, int i); - shared_ptr removeItemNoUpdate(int slot); - - void setItem(unsigned int slot, shared_ptr item); - - int getMaxStackSize(); - - void setChanged(); - - bool stillValid(shared_ptr player); + virtual int getContainerType(); + virtual unsigned int getContainerSize(); + virtual bool contains(shared_ptr c); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int i); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual int getMaxStackSize(); + virtual void setChanged(); + virtual bool stillValid(shared_ptr player); virtual void startOpen(); virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/CompoundTag.h b/Minecraft.World/CompoundTag.h index 32c31583..29d35041 100644 --- a/Minecraft.World/CompoundTag.h +++ b/Minecraft.World/CompoundTag.h @@ -20,7 +20,7 @@ public: CompoundTag() : Tag(L"") {} CompoundTag(const wstring &name) : Tag(name) {} - void write(DataOutput *dos) + void write(DataOutput *dos) { AUTO_VAR(itEnd, tags.end()); for( unordered_map::iterator it = tags.begin(); it != itEnd; it++ ) @@ -28,180 +28,188 @@ public: Tag::writeNamedTag(it->second, dos); } dos->writeByte(Tag::TAG_End); - } + } - void load(DataInput *dis) + void load(DataInput *dis, int tagDepth) { - tags.clear(); - Tag *tag; - while ((tag = Tag::readNamedTag(dis))->getId() != Tag::TAG_End) + if(tagDepth > MAX_DEPTH) + { +#ifndef _CONTENT_PACKAGE + printf("Tried to read NBT tag with too high complexity, depth > %d" , MAX_DEPTH); + __debugbreak(); +#endif + return; + } + tags.clear(); + Tag *tag; + while ((tag = Tag::readNamedTag(dis))->getId() != Tag::TAG_End) { tags[tag->getName()] = tag; - } + } delete tag; - } + } - vector *getAllTags() // 4J - was collection + vector *getAllTags() // 4J - was collection { // 4J - was return tags.values(); vector *ret = new vector; - + AUTO_VAR(itEnd, tags.end()); for( unordered_map::iterator it = tags.begin(); it != itEnd; it++ ) { ret->push_back(it->second); } - return ret; - } + return ret; + } - byte getId() + byte getId() { - return TAG_Compound; - } + return TAG_Compound; + } - void put(wchar_t *name, Tag *tag) + void put(const wstring &name, Tag *tag) { - tags[name] = tag->setName(wstring( name )); - } + tags[name] = tag->setName(name); + } - void putByte(wchar_t * name, byte value) + void putByte(const wstring &name, byte value) { - tags[name] = (new ByteTag(name,value)); - } + tags[name] = (new ByteTag(name,value)); + } - void putShort(wchar_t * name, short value) + void putShort(const wstring &name, short value) { - tags[name] = (new ShortTag(name,value)); - } + tags[name] = (new ShortTag(name,value)); + } - void putInt(wchar_t * name, int value) + void putInt(const wstring &name, int value) { - tags[name] = (new IntTag(name,value)); - } + tags[name] = (new IntTag(name,value)); + } - void putLong(wchar_t * name, __int64 value) + void putLong(const wstring &name, __int64 value) { - tags[name] = (new LongTag(name,value)); - } + tags[name] = (new LongTag(name,value)); + } - void putFloat(wchar_t * name, float value) + void putFloat(const wstring &name, float value) { - tags[name] = (new FloatTag(name,value)); - } + tags[name] = (new FloatTag(name,value)); + } - void putDouble(wchar_t * name, double value) + void putDouble(const wstring &name, double value) { - tags[name] = (new DoubleTag(name,value)); - } + tags[name] = (new DoubleTag(name,value)); + } - void putString(wchar_t *name, const wstring& value) + void putString(const wstring &name, const wstring& value) { - tags[name] = (new StringTag(name,value)); - } + tags[name] = (new StringTag(name,value)); + } - void putByteArray(wchar_t * name, byteArray value) + void putByteArray(const wstring &name, byteArray value) { - tags[name] = (new ByteArrayTag(name,value)); - } + tags[name] = (new ByteArrayTag(name,value)); + } - void putIntArray(wchar_t * name, intArray value) + void putIntArray(const wstring &name, intArray value) { tags[name] = (new IntArrayTag(name, value)); } - void putCompound(wchar_t * name, CompoundTag *value) + void putCompound(const wstring &name, CompoundTag *value) { - tags[name] = value->setName( wstring( name ) ); - } + tags[name] = value->setName( wstring( name ) ); + } - void putBoolean(wchar_t * string, bool val) + void putBoolean(const wstring &name, bool val) { - putByte(string, val?(byte)1:0); - } + putByte(name, val?(byte)1:0); + } - Tag *get(wchar_t *name) + Tag *get(const wstring &name) { AUTO_VAR(it, tags.find(name)); if(it != tags.end()) return it->second; return NULL; - } - - bool contains(wchar_t * name) + } + + bool contains(const wstring &name) { return tags.find(name) != tags.end(); - } + } - byte getByte(wchar_t * name) + byte getByte(const wstring &name) { - if (tags.find(name) == tags.end()) return (byte)0; - return ((ByteTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (byte)0; + return ((ByteTag *) tags[name])->data; + } - short getShort(wchar_t * name) + short getShort(const wstring &name) { - if (tags.find(name) == tags.end()) return (short)0; - return ((ShortTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (short)0; + return ((ShortTag *) tags[name])->data; + } - int getInt(wchar_t * name) + int getInt(const wstring &name) { - if (tags.find(name) == tags.end()) return (int)0; - return ((IntTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (int)0; + return ((IntTag *) tags[name])->data; + } - __int64 getLong(wchar_t * name) + __int64 getLong(const wstring &name) { - if (tags.find(name) == tags.end()) return (__int64)0; - return ((LongTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (__int64)0; + return ((LongTag *) tags[name])->data; + } - float getFloat(wchar_t * name) + float getFloat(const wstring &name) { - if (tags.find(name) == tags.end()) return (float)0; - return ((FloatTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (float)0; + return ((FloatTag *) tags[name])->data; + } - double getDouble(wchar_t * name) + double getDouble(const wstring &name) { - if (tags.find(name) == tags.end()) return (double)0; - return ((DoubleTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (double)0; + return ((DoubleTag *) tags[name])->data; + } - wstring getString(wchar_t * name) + wstring getString(const wstring &name) { - if (tags.find(name) == tags.end()) return wstring( L"" ); - return ((StringTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return wstring( L"" ); + return ((StringTag *) tags[name])->data; + } - byteArray getByteArray(wchar_t * name) + byteArray getByteArray(const wstring &name) { - if (tags.find(name) == tags.end()) return byteArray(); - return ((ByteArrayTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return byteArray(); + return ((ByteArrayTag *) tags[name])->data; + } - intArray getIntArray(wchar_t * name) + intArray getIntArray(const wstring &name) { - if (tags.find(name) == tags.end()) return intArray(0); + if (tags.find(name) == tags.end()) return intArray(); return ((IntArrayTag *) tags[name])->data; } - CompoundTag *getCompound(wchar_t * name) + CompoundTag *getCompound(const wstring &name) { - if (tags.find(name) == tags.end()) return new CompoundTag(name); - return (CompoundTag *) tags[name]; - } + if (tags.find(name) == tags.end()) return new CompoundTag(name); + return (CompoundTag *) tags[name]; + } - ListTag *getList(wchar_t * name) + ListTag *getList(const wstring &name) { - if (tags.find(name) == tags.end()) return new ListTag(name); - return (ListTag *) tags[name]; - } + if (tags.find(name) == tags.end()) return new ListTag(name); + return (ListTag *) tags[name]; + } - bool getBoolean(wchar_t *string) + bool getBoolean(const wstring &string) { - return getByte(string)!=0; - } + return getByte(string)!=0; + } void remove(const wstring &name) { @@ -210,38 +218,38 @@ public: //tags.remove(name); } - wstring toString() + wstring toString() { static const int bufSize = 32; static wchar_t buf[bufSize]; swprintf(buf,bufSize,L"%d entries",tags.size()); return wstring( buf ); - } + } - void print(char *prefix, ostream out) + void print(char *prefix, ostream out) { /* - Tag::print(prefix, out); + Tag::print(prefix, out); out << prefix << "{" << endl; char *newPrefix = new char[ strlen(prefix) + 4 ]; strcpy( newPrefix, prefix); strcat( newPrefix, " "); - + AUTO_VAR(itEnd, tags.end()); for( unordered_map::iterator it = tags.begin(); it != itEnd; it++ ) { - it->second->print(newPrefix, out); + it->second->print(newPrefix, out); } delete[] newPrefix; out << prefix << "}" << endl; */ - } + } - bool isEmpty() + bool isEmpty() { return tags.empty(); - } + } virtual ~CompoundTag() { @@ -255,7 +263,7 @@ public: Tag *copy() { CompoundTag *tag = new CompoundTag(getName()); - + AUTO_VAR(itEnd, tags.end()); for( AUTO_VAR(it, tags.begin()); it != itEnd; it++ ) { diff --git a/Minecraft.World/CompressedTileStorage.cpp b/Minecraft.World/CompressedTileStorage.cpp index 896bd58d..12c1ba3b 100644 --- a/Minecraft.World/CompressedTileStorage.cpp +++ b/Minecraft.World/CompressedTileStorage.cpp @@ -11,6 +11,7 @@ static const int sc_maxCompressTiles = 64; static CompressedTileStorage_compress_dataIn g_compressTileDataIn[sc_maxCompressTiles] __attribute__((__aligned__(16))); static int g_currentCompressTiles = 0; +//#define DISABLE_SPU_CODE #endif //__PS3__ // Note: See header for an overview of this class diff --git a/Minecraft.World/Connection.cpp b/Minecraft.World/Connection.cpp index 4392fe54..09f72be0 100644 --- a/Minecraft.World/Connection.cpp +++ b/Minecraft.World/Connection.cpp @@ -174,8 +174,10 @@ void Connection::send(shared_ptr packet) void Connection::queueSend(shared_ptr packet) { if (quitting) return; + EnterCriticalSection(&writeLock); estimatedRemaining += packet->getEstimatedSize() + 1; outgoing_slow.push(packet); + LeaveCriticalSection(&writeLock); } bool Connection::writeTick() @@ -204,8 +206,20 @@ bool Connection::writeTick() #ifndef _CONTENT_PACKAGE // 4J Added for debugging + int playerId = 0; if( !socket->isLocal() ) - Packet::recordOutgoingPacket(packet); + { + Socket *socket = getSocket(); + if( socket ) + { + INetworkPlayer *player = socket->getPlayer(); + if( player ) + { + playerId = player->GetSmallId(); + } + } + Packet::recordOutgoingPacket(packet,playerId); + } #endif // 4J Stu - Changed this so that rather than writing to the network stream through a buffered stream we want to: @@ -241,7 +255,11 @@ bool Connection::writeTick() // 4J Stu - Changed this so that rather than writing to the network stream through a buffered stream we want to: // a) Only push whole "game" packets to QNet, rather than amalgamated chunks of data that may include many packets, and partial packets // b) To be able to change the priority and queue of a packet if required +#ifdef _XBOX int flags = QNET_SENDDATA_LOW_PRIORITY | QNET_SENDDATA_SECONDARY; +#else + int flags = NON_QNET_SENDDATA_ACK_REQUIRED; +#endif sos->writeWithFlags( baos->buf, 0, baos->size(), flags ); baos->reset(); } @@ -253,7 +271,22 @@ bool Connection::writeTick() #ifndef _CONTENT_PACKAGE // 4J Added for debugging if( !socket->isLocal() ) - Packet::recordOutgoingPacket(packet); + { + int playerId = 0; + if( !socket->isLocal() ) + { + Socket *socket = getSocket(); + if( socket ) + { + INetworkPlayer *player = socket->getPlayer(); + if( player ) + { + playerId = player->GetSmallId(); + } + } + Packet::recordOutgoingPacket(packet,playerId); + } + } #endif writeSizes[packet->getId()] += packet->getEstimatedSize() + 1; diff --git a/Minecraft.World/ConsoleSaveFileConverter.cpp b/Minecraft.World/ConsoleSaveFileConverter.cpp index 9a3d572d..16b025a5 100644 --- a/Minecraft.World/ConsoleSaveFileConverter.cpp +++ b/Minecraft.World/ConsoleSaveFileConverter.cpp @@ -133,7 +133,9 @@ void ConsoleSaveFileConverter::ConvertSave(ConsoleSaveFile *sourceSave, ConsoleS if(progress) { +#ifndef _WINDOWS64 progress->progressStage(IDS_SAVETRANSFER_STAGE_CONVERTING); +#endif } // Overworld @@ -167,10 +169,11 @@ void ConsoleSaveFileConverter::ConvertSave(ConsoleSaveFile *sourceSave, ConsoleS bos.flush(); dos->close(); dos->deleteChildStream(); - delete dos; + delete dos; + dis->deleteChildStream(); + delete dis; } - delete dis; ++currentProgress; if(progress) progress->progressStagePercentage( (currentProgress*100)/progressTarget); @@ -212,9 +215,10 @@ void ConsoleSaveFileConverter::ConvertSave(ConsoleSaveFile *sourceSave, ConsoleS dos->close(); dos->deleteChildStream(); delete dos; + dis->deleteChildStream(); + delete dis; } - delete dis; ++currentProgress; if(progress) progress->progressStagePercentage((currentProgress*100)/progressTarget); @@ -254,9 +258,10 @@ void ConsoleSaveFileConverter::ConvertSave(ConsoleSaveFile *sourceSave, ConsoleS dos->close(); dos->deleteChildStream(); delete dos; + dis->deleteChildStream(); + delete dis; } - delete dis; ++currentProgress; if(progress) progress->progressStagePercentage((currentProgress*100)/progressTarget); diff --git a/Minecraft.World/ConsoleSaveFileOriginal.cpp b/Minecraft.World/ConsoleSaveFileOriginal.cpp index 139d99ac..c07808d4 100644 --- a/Minecraft.World/ConsoleSaveFileOriginal.cpp +++ b/Minecraft.World/ConsoleSaveFileOriginal.cpp @@ -637,6 +637,15 @@ void ConsoleSaveFileOriginal::Flush(bool autosave, bool updateThumbnail ) { LockSaveAccess(); +#ifdef __PSVITA__ + // On Vita we've had problems with saves being corrupted on rapid save/save-exiting so seems prudent to wait for idle + while( StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) + { + app.DebugPrintf("Flush wait\n"); + Sleep(10); + } +#endif + finalizeWrite(); // Get the frequency of the timer diff --git a/Minecraft.World/ConsoleSaveFileSplit.cpp b/Minecraft.World/ConsoleSaveFileSplit.cpp deleted file mode 100644 index 2d83f217..00000000 --- a/Minecraft.World/ConsoleSaveFileSplit.cpp +++ /dev/null @@ -1,1711 +0,0 @@ -#include "stdafx.h" -#include "StringHelpers.h" -#include "ConsoleSaveFileSplit.h" -#include "ConsoleSaveFileConverter.h" -#include "File.h" -#include -#include "compression.h" -#include "..\Minecraft.Client\Minecraft.h" -#include "..\Minecraft.Client\MinecraftServer.h" -#include "..\Minecraft.Client\ServerLevel.h" -#include "..\Minecraft.World\net.minecraft.world.level.h" -#include "..\Minecraft.World\LevelData.h" -#include "..\Minecraft.Client\Common\GameRules\LevelGenerationOptions.h" -#include "..\Minecraft.World\net.minecraft.world.level.chunk.storage.h" - -#define RESERVE_ALLOCATION MEM_RESERVE -#define COMMIT_ALLOCATION MEM_COMMIT - -unsigned int ConsoleSaveFileSplit::pagesCommitted = 0; -void *ConsoleSaveFileSplit::pvHeap = NULL; - -ConsoleSaveFileSplit::RegionFileReference::RegionFileReference(int index, unsigned int regionIndex, unsigned int length/*=0*/, unsigned char *data/*=NULL*/) -{ - fileEntry = new FileEntry(); - fileEntry->currentFilePointer = 0; - fileEntry->data.length = 0; - fileEntry->data.regionIndex = regionIndex; - this->data = 0; - this->index = index; - this->dirty = false; - this->dataCompressed = data; - this->dataCompressedSize = length; - this->lastWritten = 0; -} - -ConsoleSaveFileSplit::RegionFileReference::~RegionFileReference() -{ - free(data); - delete fileEntry; -} - -// Compress from data to dataCompressed. Uses a special compression method that is designed just to efficiently store runs of zeros, with little overhead on other stuff. -// Compresed format is a 4 byte uncompressed size, followed by data as follows: -// -// Byte value Meaning -// -// 1 - 255 Normal data -// 0 followed by 1 - 255 Run of 1 - 255 0s -// 0 followed by 0, followed by 256 to 65791 (as 2 bytes) Run of 256 to 65791 zeros - -void ConsoleSaveFileSplit::RegionFileReference::Compress() -{ - unsigned char *dataIn = data; - unsigned char *dataInLast = data + fileEntry->data.length; - -// int64_t startTime = System::currentTimeMillis(); - - // One pass through to work out storage space required for compressed data - unsigned int outputSize = 4; // 4 bytes required to store the uncompressed size for faster decompression - unsigned int runLength = 0; - while( dataIn != dataInLast ) - { - unsigned char thisByte = *dataIn++; - if( ( thisByte != 0 ) || ( runLength == ( 65535 + 256 ) ) ) - { - // We've got a non-zero value, or we've hit our maximum run length. - // If there was a preceeding run of zeros, encode that nwo - if( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - outputSize += 2; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - outputSize += 4; - } - // Run is now processed - runLength = 0; - } - // Now handle the current byte - if( thisByte == 0 ) - { - runLength++; - } - else - { - // Non-zero, just copy over to output - outputSize++; - } - } - else - { - // It's a zero - keep counting size of the run - runLength++; - } - } - // Handle any outstanding run - if ( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - outputSize += 2; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - outputSize += 4; - } - // Run is now processed - runLength = 0; - } - - // Now actually allocate & write the compress data. First 4 bytes store the uncompressed size - dataCompressed = (unsigned char *)malloc(outputSize); - *((unsigned int *)dataCompressed) = fileEntry->data.length; - unsigned char *dataOut = dataCompressed + 4; - dataIn = data; - - // Now same process as before, but actually writing - while( dataIn != dataInLast ) - { - unsigned char thisByte = *dataIn++; - if( ( thisByte != 0 ) || ( runLength == ( 65535 + 256 ) ) ) - { - // We've got a non-zero value, or we've hit our maximum run length. - // If there was a preceeding run of zeros, encode that nwo - if( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - *dataOut++ = 0; - *dataOut++ = runLength; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - *dataOut++ = 0; - *dataOut++ = 0; - unsigned int largeRunLength = runLength - 256; - *dataOut++ = ( largeRunLength >> 8 ) & 0xff; - *dataOut++ = ( largeRunLength ) & 0xff; - } - // Run is now processed - runLength = 0; - } - // Now handle the current byte - if( thisByte == 0 ) - { - runLength++; - } - else - { - // Non-zero, just copy over to output - *dataOut++ = thisByte; - } - } - else - { - // It's a zero - keep counting size of the run - runLength++; - } - } - // Handle any outstanding run - if( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - *dataOut++ = 0; - *dataOut++ = runLength; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - *dataOut++ = 0; - *dataOut++ = 0; - unsigned int largeRunLength = runLength - 256; - *dataOut++ = ( largeRunLength >> 8 ) & 0xff; - *dataOut++ = ( largeRunLength ) & 0xff; - } - // Run is now processed - runLength = 0; - } - assert(( dataOut - dataCompressed ) == outputSize ); - dataCompressedSize = outputSize; -// int64_t endTime = System::currentTimeMillis(); -// app.DebugPrintf("Compressing region file 0x%.8x from %d to %d bytes - %dms\n", fileEntry->data.regionIndex, fileEntry->data.length, dataCompressedSize, endTime - startTime); -} - -// Decompress from dataCompressed -> data. See comment in Compress method for format -void ConsoleSaveFileSplit::RegionFileReference::Decompress() -{ -// int64_t startTime = System::currentTimeMillis(); - fileEntry->data.length = *((unsigned int *)dataCompressed); - - // If this is unusually large, then test how big it would be when expanded before trying to allocate. Matching the expanded size - // is (currently) our means of knowing that this file is ok - if( fileEntry->data.length > 1 * 1024 * 1024 ) - { - unsigned int uncompressedSize = 0; - unsigned char *dataIn = dataCompressed + 4; - unsigned char *dataInLast = dataCompressed + dataCompressedSize; - - while (dataIn != dataInLast) - { - unsigned char thisByte = *dataIn++; - if( thisByte == 0 ) - { - thisByte = *dataIn++; - if( thisByte == 0 ) - { - unsigned int runLength = (*dataIn++) << 8; - runLength |= (*dataIn++); - runLength += 256; - uncompressedSize += runLength; - } - else - { - unsigned int runLength = thisByte; - uncompressedSize += runLength; - } - } - else - { - uncompressedSize++; - } - } - - if( fileEntry->data.length != uncompressedSize ) - { - // Treat as if it was an empty region file - fileEntry->data.length = 0; - assert(0); - return; - } - } - - - data = (unsigned char *)malloc(fileEntry->data.length); - unsigned char *dataIn = dataCompressed + 4; - unsigned char *dataInLast = dataCompressed + dataCompressedSize; - unsigned char *dataOut = data; - - while (dataIn != dataInLast) - { - unsigned char thisByte = *dataIn++; - if( thisByte == 0 ) - { - thisByte = *dataIn++; - if( thisByte == 0 ) - { - unsigned int runLength = (*dataIn++) << 8; - runLength |= (*dataIn++); - runLength += 256; - for( unsigned int i = 0; i < runLength; i++ ) - { - *dataOut++ = 0; - } - } - else - { - unsigned int runLength = thisByte; - for( unsigned int i = 0; i < runLength; i++ ) - { - *dataOut++ = 0; - } - } - } - else - { - *dataOut++ = thisByte; - } - } - // If we failed to correctly decompress, then treat as if it was an empty region file - if( ( dataOut - data ) != fileEntry->data.length ) - { - free(data); - fileEntry->data.length = 0; - data = NULL; - assert(0); - } -// int64_t endTime = System::currentTimeMillis(); -// app.DebugPrintf("Decompressing region file from 0x%.8x %d to %d bytes - %dms\n", fileEntry->data.regionIndex, dataCompressedSize, fileEntry->data.length, endTime - startTime);// -} - -unsigned int ConsoleSaveFileSplit::RegionFileReference::GetCompressedSize() -{ - unsigned char *dataIn = data; - unsigned char *dataInLast = data + fileEntry->data.length; - - unsigned int outputSize = 4; // 4 bytes required to store the uncompressed size for faster decompression - unsigned int runLength = 0; - while( dataIn != dataInLast ) - { - unsigned char thisByte = *dataIn++; - if( ( thisByte != 0 ) || ( runLength == ( 65535 + 256 ) ) ) - { - // We've got a non-zero value, or we've hit our maximum run length. - // If there was a preceeding run of zeros, encode that nwo - if( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - outputSize += 2; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - outputSize += 4; - } - // Run is now processed - runLength = 0; - } - // Now handle the current byte - if( thisByte == 0 ) - { - runLength++; - } - else - { - // Non-zero, just copy over to output - outputSize++; - } - } - else - { - // It's a zero - keep counting size of the run - runLength++; - } - } - // Handle any outstanding run - if ( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - outputSize += 2; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - outputSize += 4; - } - // Run is now processed - runLength = 0; - } - return outputSize; -} - -// Release dataCompressed -void ConsoleSaveFileSplit::RegionFileReference::ReleaseCompressed() -{ -// app.DebugPrintf("Releasing compressed data for region file from 0x%.8x\n", fileEntry->data.regionIndex ); - free(dataCompressed); - dataCompressed = NULL; - dataCompressedSize = NULL; -} - -FileEntry *ConsoleSaveFileSplit::GetRegionFileEntry(unsigned int regionIndex) -{ - // Is a region file - determine if we've got it as a separate file - AUTO_VAR(it, regionFiles.find(regionIndex) ); - if( it != regionFiles.end() ) - { - // Already got it - return it->second->fileEntry; - } - - int index = StorageManager.AddSubfile(regionIndex); - RegionFileReference *newRef = new RegionFileReference(index, regionIndex); - regionFiles[regionIndex] = newRef; - - return newRef->fileEntry; -} - -ConsoleSaveFileSplit::ConsoleSaveFileSplit(const wstring &fileName, LPVOID pvSaveData /*= NULL*/, DWORD dFileSize /*= 0*/, bool forceCleanSave /*= false*/, ESavePlatform plat /*= SAVE_FILE_PLATFORM_LOCAL*/) -{ - DWORD fileSize = dFileSize; - - // Load a save from the game rules - bool bLevelGenBaseSave = false; - LevelGenerationOptions *levelGen = app.getLevelGenerationOptions(); - if( pvSaveData == NULL && levelGen != NULL && levelGen->requiresBaseSave()) - { - pvSaveData = levelGen->getBaseSaveData(fileSize); - if(pvSaveData && fileSize != 0) bLevelGenBaseSave = true; - } - - if( pvSaveData == NULL || fileSize == 0) - fileSize = StorageManager.GetSaveSize(); - - if( forceCleanSave ) - fileSize = 0; - - _init(fileName, pvSaveData, fileSize, plat); - - if(bLevelGenBaseSave) - { - levelGen->deleteBaseSaveData(); - } -} - -ConsoleSaveFileSplit::ConsoleSaveFileSplit(ConsoleSaveFile *sourceSave, bool alreadySmallRegions, ProgressListener *progress) -{ - _init(sourceSave->getFilename(), NULL, 0, sourceSave->getSavePlatform()); - - header.setOriginalSaveVersion(sourceSave->getOriginalSaveVersion()); - header.setSaveVersion(sourceSave->getSaveVersion()); - - if(alreadySmallRegions) - { - - vector *sourceFiles = sourceSave->getFilesWithPrefix(L""); - - DWORD bytesWritten; - for(AUTO_VAR(it, sourceFiles->begin()); it != sourceFiles->end(); ++it) - { - FileEntry *sourceEntry = *it; - sourceSave->setFilePointer(sourceEntry,0,NULL,FILE_BEGIN); - - FileEntry *targetEntry = createFile(ConsoleSavePath(sourceEntry->data.filename)); - - writeFile(targetEntry, sourceSave->getWritePointer(sourceEntry), sourceEntry->getFileSize(), &bytesWritten); - } - - delete sourceFiles; - } - else - { - ConsoleSaveFileConverter::ConvertSave(sourceSave, this, progress); - } -} - -void ConsoleSaveFileSplit::_init(const wstring &fileName, LPVOID pvSaveData, DWORD fileSize, ESavePlatform plat) -{ - InitializeCriticalSectionAndSpinCount(&m_lock,5120); - - m_lastTickTime = 0; - - // One time initialise of static stuff required for our storage - if( pvHeap == NULL ) - { - // Reserve a chunk of 64MB of virtual address space for our saves, using 64KB pages. - // We'll only be committing these as required to grow the storage we need, which will - // the storage to grow without having to use realloc. - pvHeap = VirtualAlloc(NULL, MAX_PAGE_COUNT * CSF_PAGE_SIZE, RESERVE_ALLOCATION, PAGE_READWRITE ); - } - - pvSaveMem = pvHeap; - m_fileName = fileName; - - // Get details of region files. From this point on we are responsible for the memory that the storage manager initially allocated for them - unsigned int regionCount = StorageManager.GetSubfileCount(); - for( unsigned int i = 0; i < regionCount; i++ ) - { - unsigned int regionIndex; - unsigned char *regionDataCompressed; - unsigned int regionSizeCompressed; - - StorageManager.GetSubfileDetails(i, ®ionIndex, ®ionDataCompressed, ®ionSizeCompressed); - - RegionFileReference *regionFileRef = new RegionFileReference(i, regionIndex, regionSizeCompressed, regionDataCompressed); - if( regionSizeCompressed > 0 ) - { - regionFileRef->Decompress(); - } - else - { - regionFileRef->fileEntry->data.length = 0; - } - regionFileRef->ReleaseCompressed(); - regionFiles[regionIndex] = regionFileRef; - } - - DWORD heapSize = max( fileSize, (DWORD)(1024 * 1024 * 2)); // 4J Stu - Our files are going to be bigger than 2MB so allocate high to start with - - // Initially committ enough room to store headSize bytes (using CSF_PAGE_SIZE pages, so rounding up here). We should only ever have one save file at a time, - // and the pages should be decommitted in the dtor, so pages committed should always be zero at this point. - if( pagesCommitted != 0 ) - { -#ifndef _CONTENT_PACKAGE - __debugbreak(); -#endif - } - - unsigned int pagesRequired = ( heapSize + (CSF_PAGE_SIZE - 1 ) ) / CSF_PAGE_SIZE; - - void *pvRet = VirtualAlloc(pvHeap, pagesRequired * CSF_PAGE_SIZE, COMMIT_ALLOCATION, PAGE_READWRITE); - if( pvRet == NULL ) - { -#ifndef _CONTENT_PACKAGE - // Out of physical memory - __debugbreak(); -#endif - } - pagesCommitted = pagesRequired; - - if( fileSize > 0) - { - if(pvSaveData != NULL) - { - memcpy(pvSaveMem, pvSaveData, fileSize); - } - else - { - unsigned int storageLength; - StorageManager.GetSaveData( pvSaveMem, &storageLength ); - app.DebugPrintf("Filesize - %d, Adjusted size - %d\n",fileSize,storageLength); - fileSize = storageLength; - } - - int compressed = *(int*)pvSaveMem; - if( compressed == 0 ) - { - unsigned int decompSize = *( (int*)pvSaveMem+1 ); - - // An invalid save, so clear the memory and start from scratch - if(decompSize == 0) - { - // 4J Stu - Saves created between 2/12/2011 and 7/12/2011 will have this problem - app.DebugPrintf("Invalid save data format\n"); - ZeroMemory( pvSaveMem, fileSize ); - // Clear the first 8 bytes that reference the header - header.WriteHeader( pvSaveMem ); - } - else - { - unsigned char *buf = new unsigned char[decompSize]; - - if( Compression::getCompression()->Decompress(buf, &decompSize, (unsigned char *)pvSaveMem+8, fileSize-8 ) == S_OK) - { - - // Only ReAlloc if we need to (we might already have enough) and align to 512 byte boundaries - DWORD currentHeapSize = pagesCommitted * CSF_PAGE_SIZE; - - DWORD desiredSize = decompSize; - - if( desiredSize > currentHeapSize ) - { - unsigned int pagesRequired = ( desiredSize + (CSF_PAGE_SIZE - 1 ) ) / CSF_PAGE_SIZE; - void *pvRet = VirtualAlloc(pvHeap, pagesRequired * CSF_PAGE_SIZE, COMMIT_ALLOCATION, PAGE_READWRITE); - if( pvRet == NULL ) - { - // Out of physical memory - __debugbreak(); - } - pagesCommitted = pagesRequired; - } - - memcpy(pvSaveMem, buf, decompSize); - } - else - { - // Corrupt save, although most of the terrain should actually be ok - app.DebugPrintf("Failed to decompress save data!\n"); -#ifndef _CONTENT_PACKAGE - __debugbreak(); -#endif - ZeroMemory( pvSaveMem, fileSize ); - // Clear the first 8 bytes that reference the header - header.WriteHeader( pvSaveMem ); - } - - delete[] buf; - } - } - - header.ReadHeader( pvSaveMem, plat ); - - } - else - { - // Clear the first 8 bytes that reference the header - header.WriteHeader( pvSaveMem ); - } -} - -ConsoleSaveFileSplit::~ConsoleSaveFileSplit() -{ - VirtualFree( pvHeap, MAX_PAGE_COUNT * CSF_PAGE_SIZE, MEM_DECOMMIT ); - pagesCommitted = 0; - // Make sure we don't have any thumbnail data still waiting round - we can't need it now we've destroyed the save file anyway -#if defined _XBOX - app.GetSaveThumbnail(NULL,NULL); -#elif defined __PS3__ - app.GetSaveThumbnail(NULL,NULL, NULL,NULL); -#endif - - for(AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); it++ ) - { - delete it->second; - } - - StorageManager.ResetSubfiles(); - DeleteCriticalSection(&m_lock); -} - -// Add the file to our table of internal files if not already there -// Open our actual save file ready for reading/writing, and the set the file pointer to the start of this file -FileEntry *ConsoleSaveFileSplit::createFile( const ConsoleSavePath &fileName ) -{ - LockSaveAccess(); - - // Determine if the file is a region file that should be split off into its own file - unsigned int regionFileIndex; - bool isRegionFile = GetNumericIdentifierFromName(fileName.getName(), ®ionFileIndex); - if( isRegionFile ) - { - // First, for backwards compatibility, check if it is already in the main file - will just use that if so - if( !header.fileExists( fileName.getName() ) ) - { - // Find or create a new region file - FileEntry *file = GetRegionFileEntry(regionFileIndex); - ReleaseSaveAccess(); - return file; - } - } - - FileEntry *file = header.AddFile( fileName.getName() ); - ReleaseSaveAccess(); - - return file; -} - -void ConsoleSaveFileSplit::deleteFile( FileEntry *file ) -{ - if( file == NULL ) return; - - assert( file->isRegionFile() == false ); - - LockSaveAccess(); - - DWORD numberOfBytesRead = 0; - DWORD numberOfBytesWritten = 0; - - const int bufferSize = 4096; - int amountToRead = bufferSize; - byte buffer[bufferSize]; - DWORD bufferDataSize = 0; - - - char *readStartOffset = (char *)pvSaveMem + file->data.startOffset + file->getFileSize(); - - char *writeStartOffset = (char *)pvSaveMem + file->data.startOffset; - - char *endOfDataOffset = (char *)pvSaveMem + header.GetStartOfNextData(); - - while(true) - { - // Fill buffer from file - if( readStartOffset + bufferSize > endOfDataOffset ) - { - amountToRead = (int)(endOfDataOffset - readStartOffset); - } - else - { - amountToRead = bufferSize; - } - - if( amountToRead == 0 ) - break; - - memcpy( buffer, readStartOffset, amountToRead ); - numberOfBytesRead = amountToRead; - - bufferDataSize = amountToRead; - readStartOffset += numberOfBytesRead; - - // Write buffer to file - memcpy( (void *)writeStartOffset, buffer, bufferDataSize ); - numberOfBytesWritten = bufferDataSize; - - writeStartOffset += numberOfBytesWritten; - } - - header.RemoveFile( file ); - - finalizeWrite(); - - ReleaseSaveAccess(); -} - -void ConsoleSaveFileSplit::setFilePointer(FileEntry *file,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod) -{ - LockSaveAccess(); - - if( file->isRegionFile() ) - { - file->currentFilePointer = lDistanceToMove; - } - else - { - file->currentFilePointer = file->data.startOffset + lDistanceToMove; - } - - if( dwMoveMethod == FILE_END) - { - file->currentFilePointer += file->getFileSize(); - } - - ReleaseSaveAccess(); -} - -// If this file needs to grow, move the data after along -void ConsoleSaveFileSplit::PrepareForWrite( FileEntry *file, DWORD nNumberOfBytesToWrite ) -{ - int bytesToGrowBy = ( (file->currentFilePointer - file->data.startOffset) + nNumberOfBytesToWrite) - file->getFileSize(); - if( bytesToGrowBy <= 0 ) - return; - - // 4J Stu - Not forcing a minimum size, it is up to the caller to write data in sensible amounts - // This lets us keep some of the smaller files small - //if( bytesToGrowBy < 1024 ) - // bytesToGrowBy = 1024; - - // Move all the data beyond us - PIXBeginNamedEvent(0,"Growing file by %d bytes", bytesToGrowBy); - MoveDataBeyond(file, bytesToGrowBy); - PIXEndNamedEvent(); - - // Update our length - if( file->data.length < 0 ) - file->data.length = 0; - file->data.length += bytesToGrowBy; - - // Write the header with the updated data - finalizeWrite(); -} - -BOOL ConsoleSaveFileSplit::writeFile(FileEntry *file,LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten) -{ - assert( pvSaveMem != NULL ); - if( pvSaveMem == NULL ) - { - return 0; - } - - LockSaveAccess(); - - if( file->isRegionFile() ) - { - unsigned int sizeRequired = file->currentFilePointer + nNumberOfBytesToWrite; - RegionFileReference *fileRef = regionFiles[file->data.regionIndex]; - if( sizeRequired > file->getFileSize() ) - { - fileRef->data = (unsigned char *)realloc(fileRef->data, sizeRequired); - file->data.length = sizeRequired; - } - - memcpy( fileRef->data + file->currentFilePointer, lpBuffer, nNumberOfBytesToWrite ); - -// app.DebugPrintf(">>>>>>>>>>>>>> writing a region file's data 0x%.8x, 0x%x offset %d of %d bytes (writing %d bytes)\n",file->data.regionIndex,fileRef->data,file->currentFilePointer, file->getFileSize(), nNumberOfBytesToWrite); - - file->currentFilePointer += nNumberOfBytesToWrite; - file->updateLastModifiedTime(); - fileRef->dirty = true; - } - else - { - PrepareForWrite( file, nNumberOfBytesToWrite ); - - char *writeStartOffset = (char *)pvSaveMem + file->currentFilePointer; - //printf("Write: pvSaveMem = %0xd, currentFilePointer = %d, writeStartOffset = %0xd\n", pvSaveMem, file->currentFilePointer, writeStartOffset); - - memcpy( (void *)writeStartOffset, lpBuffer, nNumberOfBytesToWrite ); - *lpNumberOfBytesWritten = nNumberOfBytesToWrite; - - if(file->data.length < 0) - file->data.length = 0; - - file->currentFilePointer += *lpNumberOfBytesWritten; - - //wprintf(L"Wrote %d bytes to %s, new file pointer is %I64d\n", *lpNumberOfBytesWritten, file->data.filename, file->currentFilePointer); - - file->updateLastModifiedTime(); - } - - ReleaseSaveAccess(); - - return 1; -} - -BOOL ConsoleSaveFileSplit::zeroFile(FileEntry *file, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten) -{ - assert( pvSaveMem != NULL ); - if( pvSaveMem == NULL ) - { - return 0; - } - - LockSaveAccess(); - - if( file->isRegionFile() ) - { - unsigned int sizeRequired = file->currentFilePointer + nNumberOfBytesToWrite; - RegionFileReference *fileRef = regionFiles[file->data.regionIndex]; - if( sizeRequired > file->getFileSize() ) - { - fileRef->data = (unsigned char *)realloc(fileRef->data, sizeRequired); - file->data.length = sizeRequired; - } - - memset( fileRef->data + file->currentFilePointer, 0, nNumberOfBytesToWrite ); - -// app.DebugPrintf(">>>>>>>>>>>>>> writing a region file's data 0x%.8x, 0x%x offset %d of %d bytes (writing %d bytes)\n",file->data.regionIndex,fileRef->data,file->currentFilePointer, file->getFileSize(), nNumberOfBytesToWrite); - - file->currentFilePointer += nNumberOfBytesToWrite; - file->updateLastModifiedTime(); - fileRef->dirty = true; - } - else - { - PrepareForWrite( file, nNumberOfBytesToWrite ); - - char *writeStartOffset = (char *)pvSaveMem + file->currentFilePointer; - //printf("Write: pvSaveMem = %0xd, currentFilePointer = %d, writeStartOffset = %0xd\n", pvSaveMem, file->currentFilePointer, writeStartOffset); - - memset( (void *)writeStartOffset, 0, nNumberOfBytesToWrite ); - *lpNumberOfBytesWritten = nNumberOfBytesToWrite; - - if(file->data.length < 0) - file->data.length = 0; - - file->currentFilePointer += *lpNumberOfBytesWritten; - - //wprintf(L"Wrote %d bytes to %s, new file pointer is %I64d\n", *lpNumberOfBytesWritten, file->data.filename, file->currentFilePointer); - - file->updateLastModifiedTime(); - } - - ReleaseSaveAccess(); - - return 1; -} - -BOOL ConsoleSaveFileSplit::readFile( FileEntry *file, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead) -{ - DWORD actualBytesToRead; - assert( pvSaveMem != NULL ); - if( pvSaveMem == NULL ) - { - return 0; - } - - LockSaveAccess(); - - if( file->isRegionFile() ) - { - actualBytesToRead = nNumberOfBytesToRead; - if( file->currentFilePointer + nNumberOfBytesToRead > file->data.length ) - { - actualBytesToRead = file->data.length - file->currentFilePointer; - } - RegionFileReference *fileRef = regionFiles[file->data.regionIndex]; - memcpy( lpBuffer, fileRef->data + file->currentFilePointer, actualBytesToRead ); - *lpNumberOfBytesRead = actualBytesToRead; - - file->currentFilePointer += actualBytesToRead; - } - else - { - char *readStartOffset = (char *)pvSaveMem + file->currentFilePointer; - //printf("Read: pvSaveMem = %0xd, currentFilePointer = %d, readStartOffset = %0xd\n", pvSaveMem, file->currentFilePointer, readStartOffset); - - assert( nNumberOfBytesToRead <= file->getFileSize() ); - - actualBytesToRead = nNumberOfBytesToRead; - if( file->currentFilePointer + nNumberOfBytesToRead > file->data.startOffset + file->data.length ) - { - actualBytesToRead = (file->data.startOffset + file->data.length) - file->currentFilePointer; - } - - memcpy( lpBuffer, readStartOffset, actualBytesToRead ); - *lpNumberOfBytesRead = actualBytesToRead; - - file->currentFilePointer += *lpNumberOfBytesRead; - - //wprintf(L"Read %d bytes from %s, new file pointer is %I64d\n", *lpNumberOfBytesRead, file->data.filename, file->currentFilePointer); - } - - - - ReleaseSaveAccess(); - - return 1; -} - -BOOL ConsoleSaveFileSplit::closeHandle( FileEntry *file ) -{ - LockSaveAccess(); - finalizeWrite(); - ReleaseSaveAccess(); - - return TRUE; -} - -// In this method, attempt to write any dirty region files, subject to maintaining a maximum write output rate. Writing is prioritised by time since the region was last written. -void ConsoleSaveFileSplit::tick() -{ - int64_t currentTime = System::currentTimeMillis(); - - // Don't do anything if the save system is up to something... - if( StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) - { - return; - } - - // ...or we shouldn't be saving... - if( StorageManager.GetSaveDisabled() ) - { - return; - } - - // ... or we haven't passed the required time since last assessing what to do - if( ( currentTime - m_lastTickTime ) < WRITE_TICK_RATE_MS ) - { - return; - } - - LockSaveAccess(); - - m_lastTickTime = currentTime; - - // Get total amount of data written over the time period we are interested in averaging over. Remove any older data. - unsigned int bytesWritten = 0; - for( AUTO_VAR(it, writeHistory.begin()); it != writeHistory.end(); ) - { - if( ( currentTime - it->writeTime ) > ( WRITE_BANDWIDTH_MEASUREMENT_PERIOD_SECONDS * 1000 ) ) - { - it = writeHistory.erase(it); - } - else - { - bytesWritten += it->writeSize; - it++; - } - } - - // Compile a vector of dirty regions. - vector dirtyRegions; - for( AUTO_VAR(it, regionFiles.begin()); it != regionFiles.end(); it++ ) - { - DirtyRegionFile dirtyRegion; - - if( it->second->dirty ) - { - dirtyRegion.fileRef = it->second->fileEntry->getRegionFileIndex(); - dirtyRegion.lastWritten = it->second->lastWritten; - dirtyRegions.push_back( dirtyRegion ); - } - } - - // Sort into ascending order, by lastWritten time. First elements will therefore be the ones least recently saved - std::sort( dirtyRegions.begin(), dirtyRegions.end() ); - - bool writeRequired = false; - unsigned int bytesInTimePeriod = bytesWritten; - unsigned int bytesAddedThisTick = 0; - for( int i = 0; i < dirtyRegions.size(); i++ ) - { - RegionFileReference *regionRef = regionFiles[dirtyRegions[i].fileRef]; - unsigned int compressedSize = regionRef->GetCompressedSize(); - bytesInTimePeriod += compressedSize; - bytesAddedThisTick += compressedSize; - - // Always consider at least one item for writing, even if it breaks the rule on the maximum number of bytes we would like to send per tick - if( ( i > 0 ) && ( bytesAddedThisTick > WRITE_MAX_WRITE_PER_TICK ) ) - { - break; - } - - // Could we add this without breaking our bytes per second cap? - if ( ( bytesInTimePeriod / WRITE_BANDWIDTH_MEASUREMENT_PERIOD_SECONDS ) > WRITE_BANDWIDTH_BYTESPERSECOND ) - { - break; - } - - // Can add for writing - WriteHistory writeEvent; - writeEvent.writeSize = compressedSize; - writeEvent.writeTime = System::currentTimeMillis(); - writeHistory.push_back(writeEvent); - - regionRef->Compress(); -// app.DebugPrintf("Tick: Writing region 0x%.8x, compressed as %d bytes\n",regionRef->fileEntry->getRegionFileIndex(), regionRef->dataCompressedSize); - StorageManager.UpdateSubfile(regionRef->index, regionRef->dataCompressed, regionRef->dataCompressedSize); - regionRef->dirty = false; - regionRef->lastWritten = System::currentTimeMillis(); - - writeRequired = true; - } -#ifndef _CONTENT_PACKAGE - { - unsigned int totalDirty = 0; - unsigned int totalDirtyBytes = 0; - __int64 oldestDirty = currentTime; - for( AUTO_VAR(it, regionFiles.begin()); it != regionFiles.end(); it++ ) - { - if( it->second->dirty ) - { - if( it->second->lastWritten < oldestDirty ) - { - oldestDirty = it->second->lastWritten; - } - totalDirty++; - totalDirtyBytes += it->second->fileEntry->getFileSize(); - } - } -#ifdef _DURANGO - PIXReportCounter(L"Dirty regions", (float)totalDirty); - PIXReportCounter(L"Dirty MB", (float)totalDirtyBytes / ( 1024 * 1024) ); - PIXReportCounter(L"Dirty oldest age", ((float) currentTime - oldestDirty ) ); - PIXReportCounter(L"Region writing bandwidth",((float)bytesInTimePeriod/ WRITE_BANDWIDTH_MEASUREMENT_PERIOD_SECONDS) / ( 1024 * 1024)); -#endif - } -#endif - - if( writeRequired ) - { - StorageManager.SaveSubfiles(SaveRegionFilesCallback, this); - } - - ReleaseSaveAccess(); -} - -void ConsoleSaveFileSplit::finalizeWrite() -{ - LockSaveAccess(); - header.WriteHeader( pvSaveMem ); - ReleaseSaveAccess(); -} - -void ConsoleSaveFileSplit::MoveDataBeyond(FileEntry *file, DWORD nNumberOfBytesToWrite) -{ - DWORD numberOfBytesRead = 0; - DWORD numberOfBytesWritten = 0; - - const DWORD bufferSize = 4096; - DWORD amountToRead = bufferSize; - //assert( nNumberOfBytesToWrite <= bufferSize ); - static byte buffer1[bufferSize]; - static byte buffer2[bufferSize]; - DWORD buffer1Size = 0; - DWORD buffer2Size = 0; - - // Only ReAlloc if we need to (we might already have enough) and align to 512 byte boundaries - DWORD currentHeapSize = pagesCommitted * CSF_PAGE_SIZE; - - DWORD desiredSize = header.GetFileSize() + nNumberOfBytesToWrite; - - if( desiredSize > currentHeapSize ) - { - unsigned int pagesRequired = ( desiredSize + (CSF_PAGE_SIZE - 1 ) ) / CSF_PAGE_SIZE; - void *pvRet = VirtualAlloc(pvHeap, pagesRequired * CSF_PAGE_SIZE, COMMIT_ALLOCATION, PAGE_READWRITE); - if( pvRet == NULL ) - { - // Out of physical memory - __debugbreak(); - } - pagesCommitted = pagesRequired; - } - - // This is the start of where we want the space to be, and the start of the data that we need to move - char *spaceStartOffset = (char *)pvSaveMem + file->data.startOffset + file->getFileSize(); - - // This is the end of where we want the space to be - char *spaceEndOffset = spaceStartOffset + nNumberOfBytesToWrite; - - // This is the current end of the data that we want to move - char *beginEndOfDataOffset = (char *)pvSaveMem + header.GetStartOfNextData(); - - // This is where the end of the data is going to be - char *finishEndOfDataOffset = beginEndOfDataOffset + nNumberOfBytesToWrite; - - // This is where we are going to read from (with the amount we want to read subtracted before we read) - char *readStartOffset = beginEndOfDataOffset; - - // This is where we can safely write to (with the amount we want write subtracted before we write) - char *writeStartOffset = finishEndOfDataOffset; - - //printf("\n******* MOVEDATABEYOND *******\n"); - //printf("Space start: %d, space end: %d\n", spaceStartOffset - (char *)pvSaveMem, spaceEndOffset - (char *)pvSaveMem); - //printf("Current end of data: %d, new end of data: %d\n", beginEndOfDataOffset - (char *)pvSaveMem, finishEndOfDataOffset - (char *)pvSaveMem); - - // Optimisation for things that are being moved in whole region file sector (4K chunks). We could generalise this a bit more but seems safest at the moment to identify this particular type - // of move and code explicitly for this situation - if( ( nNumberOfBytesToWrite & 4095 ) == 0 ) - { - if( nNumberOfBytesToWrite > 0 ) - { - // Get addresses for start & end of the region we are copying from as uintptr_t, for easier maths - uintptr_t uiFromStart = (uintptr_t)spaceStartOffset; - uintptr_t uiFromEnd = (uintptr_t)beginEndOfDataOffset; - - // Round both of these values to get 4096 byte chunks that we will need to at least partially move - uintptr_t uiFromStartChunk = uiFromStart & ~((uintptr_t)4095); - uintptr_t uiFromEndChunk = (uiFromEnd - 1 ) & ~((uintptr_t)4095); - - // Loop through all the affected source 4096 chunks, going backwards so we don't overwrite anything we'll need in the future - for( uintptr_t uiCurrentChunk = uiFromEndChunk; uiCurrentChunk >= uiFromStartChunk; uiCurrentChunk -= 4096 ) - { - // Establish chunk we'll need to copy - uintptr_t uiCopyStart = uiCurrentChunk; - uintptr_t uiCopyEnd = uiCurrentChunk + 4096; - // Clamp chunk to the bounds of the full region we are trying to copy - if( uiCopyStart < uiFromStart ) - { - // Needs to be clampged against the start of our region - uiCopyStart = uiFromStart; - } - if ( uiCopyEnd > uiFromEnd ) - { - // Needs to be clamped to the end of our region - uiCopyEnd = uiFromEnd; - } - XMemCpy( (void *)(uiCopyStart + nNumberOfBytesToWrite), ( void *)uiCopyStart, uiCopyEnd - uiCopyStart ); - } - } - } - else - { - while(true) - { - // Copy buffer 1 to buffer 2 - memcpy( buffer2, buffer1, buffer1Size); - buffer2Size = buffer1Size; - - // Fill buffer 1 from file - if( (readStartOffset - bufferSize) < spaceStartOffset ) - { - amountToRead = (DWORD)(readStartOffset - spaceStartOffset); - } - else - { - amountToRead = bufferSize; - } - - // Push the read point back by the amount of bytes that we are going to read - readStartOffset -= amountToRead; - - //printf("About to read %u from %d\n", amountToRead, readStartOffset - (char *)pvSaveMem ); - - memcpy( buffer1, readStartOffset, amountToRead ); - numberOfBytesRead = amountToRead; - - buffer1Size = amountToRead; - - // Move back the write pointer by the amount of bytes we are going to write - writeStartOffset -= buffer2Size; - - // Write buffer 2 to file - if( (writeStartOffset + buffer2Size) <= finishEndOfDataOffset) - { - //printf("About to write %u to %d\n", buffer2Size, writeStartOffset - (char *)pvSaveMem ); - memcpy( (void *)writeStartOffset, buffer2, buffer2Size ); - numberOfBytesWritten = buffer2Size; - } - else - { - assert((writeStartOffset + buffer2Size) <= finishEndOfDataOffset); - numberOfBytesWritten = 0; - } - - if( numberOfBytesRead == 0 ) - { - //printf("\n************** MOVE COMPLETED *************** \n\n"); - assert( writeStartOffset == spaceEndOffset ); - break; - } - } - } - - header.AdjustStartOffsets( file, nNumberOfBytesToWrite ); -} - -// Attempt to convert a filename into a numeric identifier, which we use for region files. File names supported are of the form: -// -// Filename Encoded as -// -// r.x.z.mcr 00 00 xx zz -// DIM-1r.x.z.mcr 00 01 xx zz -// DIM1/r.x.z.mcr 00 02 xx zz - -bool ConsoleSaveFileSplit::GetNumericIdentifierFromName(const wstring &fileName, unsigned int *idOut) -{ - // Determine whether it is one of our region file names if the file extension is ".mbr" - if( fileName.length() < 4 ) return false; - wstring extension = fileName.substr(fileName.length()-4,4); - if( extension != wstring(L".mcr") ) return false; - - unsigned int id = 0; - int x, z; - - const wchar_t *cstr = fileName.c_str(); - const wchar_t *body = cstr + 2; - - // If this filename starts with a "r" then assume it is of the format "r.x.z.mcr" - don't do anything as default value we've set are correct - if( cstr[0] != L'r' ) - { - // Must be prefixed by "DIM-1r." or "DIM1/r." - body = cstr + 7; - // Differentiate between these 2 options - if( cstr[3] == L'-' ) - { - // "DIM-1r." - id = 0x00010000; - } - else - { - // "DIM/1r." - id = 0x00020000; - } - } - // Get x/z coords - swscanf_s(body, L"%d.%d.mcr", &x, &z ); - - // Pack full id - id |= ( ( x << 8 ) & 0x0000ff00 ); - id |= ( z & 0x000000ff ); - - *idOut = id; - - return true; -} - -// Convert a numeric file identifier (for region files) back into a normal filename. See comment above. - -wstring ConsoleSaveFileSplit::GetNameFromNumericIdentifier(unsigned int idIn) -{ - wstring prefix; - - switch(idIn & 0x00ff0000 ) - { - case 0: - prefix = L""; - break; - case 1: - prefix = L"DIM-1"; - break; - case 2: - prefix = L"DIM1/"; - break; - } - signed char regionX = ( idIn >> 8 ) & 255; - signed char regionZ = idIn & 255; - wstring region = ( prefix + wstring(L"r.") + _toString(regionX) + L"." + _toString(regionZ) + L".mcr" ); - - return region; -} - -// Compress any dirty region files, and tell the storage manager about them so that it will process them when we ask it to save sub files -void ConsoleSaveFileSplit::processSubfilesForWrite() -{ -#if 0 - // 4J Stu - There are debug reasons where we want to force a save of all regions - StorageManager.ResetSubfiles(); - for(AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); it++ ) - { - RegionFileReference* region = it->second; - int index = StorageManager.AddSubfile(region->fileEntry->data.regionIndex); - //if( region->dirty ) - { - region->Compress(); - StorageManager.UpdateSubfile(index, region->dataCompressed, region->dataCompressedSize); - region->dirty = false; - region->lastWritten = System::currentTimeMillis(); - } - } -#else - for(AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); it++ ) - { - RegionFileReference* region = it->second; - if( region->dirty ) - { - region->Compress(); - StorageManager.UpdateSubfile(region->index, region->dataCompressed, region->dataCompressedSize); - region->dirty = false; - region->lastWritten = System::currentTimeMillis(); - } - } -#endif -} - -// Clean up any memory allocated for compressed data when we have finished writing -void ConsoleSaveFileSplit::processSubfilesAfterWrite() -{ - // This is called from the StorageManager.Tick() which should always be on the main thread - for(AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); it++ ) - { - RegionFileReference* region = it->second; - region->ReleaseCompressed(); - } -} - -bool ConsoleSaveFileSplit::doesFileExist(ConsoleSavePath file) -{ - LockSaveAccess(); - bool exists = header.fileExists( file.getName() ); - ReleaseSaveAccess(); - - return exists; -} - -void ConsoleSaveFileSplit::Flush(bool autosave, bool updateThumbnail) -{ - LockSaveAccess(); - -#ifdef _XBOX_ONE - MinecraftServer *server = MinecraftServer::getInstance(); -#endif - - // The storage manage might potentially be busy doing a sub-file write initiated from the tick. Wait until this is totally processed. - while( StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) - { -#ifdef _XBOX_ONE - if (server && server->IsSuspending()) - { - // If the server is mid-suspend we need to tick the storage manager ourselves - StorageManager.Tick(); - } -#endif - - app.DebugPrintf("Flush wait\n"); - Sleep(10); - } - - finalizeWrite(); - - m_autosave = autosave; - if(!m_autosave) processSubfilesForWrite(); - - // Get the frequency of the timer - LARGE_INTEGER qwTicksPerSec, qwTime, qwNewTime, qwDeltaTime; - float fElapsedTime = 0.0f; - QueryPerformanceFrequency( &qwTicksPerSec ); - float fSecsPerTick = 1.0f / (float)qwTicksPerSec.QuadPart; - - unsigned int fileSize = header.GetFileSize(); - - // Assume that the compression will make it smaller so initially attempt to allocate the current file size - // We add 4 bytes to the start so that we can signal compressed data - // And another 4 bytes to store the decompressed data size - unsigned int compLength = fileSize+8; - - // 4J Stu - Added TU-1 interim - - // Attempt to allocate the required memory - // We do not own this, it belongs to the StorageManager - byte *compData = (byte *)StorageManager.AllocateSaveData( compLength ); - - // If we failed to allocate then compData will be NULL - // Pre-calculate the compressed data size so that we can attempt to allocate a smaller buffer - if(compData == NULL) - { - // Length should be 0 here so that the compression call knows that we want to know the length back - compLength = 0; - - // Pre-calculate the buffer size required for the compressed data - PIXBeginNamedEvent(0,"Pre-calc save compression"); - // Save the start time - QueryPerformanceCounter( &qwTime ); - Compression::getCompression()->Compress(NULL,&compLength,pvSaveMem,fileSize); - QueryPerformanceCounter( &qwNewTime ); - - qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; - fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); - - app.DebugPrintf("Check buffer size: Elapsed time %f\n", fElapsedTime); - PIXEndNamedEvent(); - - // We add 4 bytes to the start so that we can signal compressed data - // And another 4 bytes to store the decompressed data size - compLength = compLength+8; - - // Attempt to allocate the required memory - compData = (byte *)StorageManager.AllocateSaveData( compLength ); - } - - if(compData != NULL) - { - // Re-compress all save data before we save it to disk - PIXBeginNamedEvent(0,"Actual save compression"); - // Save the start time - QueryPerformanceCounter( &qwTime ); - Compression::getCompression()->Compress(compData+8,&compLength,pvSaveMem,fileSize); - QueryPerformanceCounter( &qwNewTime ); - - qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; - fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); - - app.DebugPrintf("Compress: Elapsed time %f\n", fElapsedTime); - PIXEndNamedEvent(); - - ZeroMemory(compData,8); - int saveVer = 0; - memcpy( compData, &saveVer, sizeof(int) ); - memcpy( compData+4, &fileSize, sizeof(int) ); - - app.DebugPrintf("Save data compressed from %d to %d\n", fileSize, compLength); - - if(updateThumbnail) - { - PBYTE pbThumbnailData=NULL; - DWORD dwThumbnailDataSize=0; - - PBYTE pbDataSaveImage=NULL; - DWORD dwDataSizeSaveImage=0; - -#if ( defined _XBOX || defined _DURANGO ) - app.GetSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); -#elif ( defined __PS3__ || defined __ORBIS__ ) - app.GetSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize,&pbDataSaveImage,&dwDataSizeSaveImage); -#endif - - BYTE bTextMetadata[88]; - ZeroMemory(bTextMetadata,88); - - __int64 seed = 0; - bool hasSeed = false; - if(MinecraftServer::getInstance()!= NULL && MinecraftServer::getInstance()->levels[0]!=NULL) - { - seed = MinecraftServer::getInstance()->levels[0]->getLevelData()->getSeed(); - hasSeed = true; - } - - int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, seed, hasSeed, app.GetGameHostOption(eGameHostOption_All), Minecraft::GetInstance()->getCurrentTexturePackId()); - - // set the icon and save image - StorageManager.SetSaveImages(pbThumbnailData,dwThumbnailDataSize,pbDataSaveImage,dwDataSizeSaveImage,bTextMetadata,iTextMetadataBytes); - app.DebugPrintf("Save thumbnail size %d\n",dwThumbnailDataSize); - - } - - INT saveOrCheckpointId = 0; - bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); - TelemetryManager->RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId, compLength+8); - - // save the data - StorageManager.SaveSaveData( &ConsoleSaveFileSplit::SaveSaveDataCallback, this ); -#ifndef _CONTENT_PACKAGE - if( app.DebugSettingsOn()) - { - if(app.GetWriteSavesToFolderEnabled() ) - { - DebugFlushToFile(compData, compLength+8); - } - } -#endif - ReleaseSaveAccess(); - } -} - -int ConsoleSaveFileSplit::SaveSaveDataCallback(LPVOID lpParam,bool bRes) -{ - ConsoleSaveFileSplit *pClass=(ConsoleSaveFileSplit *)lpParam; - - // Don't save sub files on autosave (their always being saved anyway) - if (!pClass->m_autosave) - { - // This is called from the StorageManager.Tick() which should always be on the main thread - StorageManager.SaveSubfiles(SaveRegionFilesCallback, pClass); - } - return 0; -} - -int ConsoleSaveFileSplit::SaveRegionFilesCallback(LPVOID lpParam,bool bRes) -{ - ConsoleSaveFileSplit *pClass=(ConsoleSaveFileSplit *)lpParam; - - // This is called from the StorageManager.Tick() which should always be on the main thread - pClass->processSubfilesAfterWrite(); - - return 0; -} - -#ifndef _CONTENT_PACKAGE -void ConsoleSaveFileSplit::DebugFlushToFile(void *compressedData /*= NULL*/, unsigned int compressedDataSize /*= 0*/) -{ - LockSaveAccess(); - - finalizeWrite(); - - unsigned int fileSize = header.GetFileSize(); - - DWORD numberOfBytesWritten = 0; - - File targetFileDir(L"Saves"); - - if(!targetFileDir.exists()) - targetFileDir.mkdir(); - - wchar_t *fileName = new wchar_t[XCONTENT_MAX_FILENAME_LENGTH+1]; - - SYSTEMTIME t; - GetSystemTime( &t ); - - //14 chars for the digits - //11 chars for the separators + suffix - //25 chars total - wstring cutFileName = m_fileName; - if(m_fileName.length() > XCONTENT_MAX_FILENAME_LENGTH - 25) - { - cutFileName = m_fileName.substr(0, XCONTENT_MAX_FILENAME_LENGTH - 25); - } - swprintf(fileName, XCONTENT_MAX_FILENAME_LENGTH+1, L"\\v%04d-%ls%02d.%02d.%02d.%02d.%02d.mcs",VER_PRODUCTBUILD,cutFileName.c_str(), t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); - -#ifdef _UNICODE - wstring wtemp = targetFileDir.getPath() + wstring(fileName); - LPCWSTR lpFileName = wtemp.c_str(); -#else - LPCSTR lpFileName = wstringtofilename( targetFileDir.getPath() + wstring(fileName) ); -#endif - - HANDLE hSaveFile = CreateFile( lpFileName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL); - - if(compressedData != NULL && compressedDataSize > 0) - { - WriteFile(hSaveFile,compressedData,compressedDataSize,&numberOfBytesWritten,NULL); - assert(numberOfBytesWritten == compressedDataSize); - } - else - { - WriteFile(hSaveFile,pvSaveMem,fileSize,&numberOfBytesWritten,NULL); - assert(numberOfBytesWritten == fileSize); - } - CloseHandle( hSaveFile ); - - delete[] fileName; - - ReleaseSaveAccess(); -} -#endif - -unsigned int ConsoleSaveFileSplit::getSizeOnDisk() -{ - return header.GetFileSize(); -} - -wstring ConsoleSaveFileSplit::getFilename() -{ - return m_fileName; -} - -vector *ConsoleSaveFileSplit::getFilesWithPrefix(const wstring &prefix) -{ - return header.getFilesWithPrefix( prefix ); -} - -vector *ConsoleSaveFileSplit::getRegionFilesByDimension(unsigned int dimensionIndex) -{ - vector *files = NULL; - - for( AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); ++it ) - { - unsigned int entryDimension = ( (it->first) >> 16) & 0xFF; - - if(entryDimension == dimensionIndex) - { - if( files == NULL ) - { - files = new vector(); - } - - files->push_back(it->second->fileEntry); - } - } - - return files; -} - -#if defined(__PS3__) || defined(__ORBIS__) -wstring ConsoleSaveFileSplit::getPlayerDataFilenameForLoad(const PlayerUID& pUID) -{ - return header.getPlayerDataFilenameForLoad( pUID ); -} -wstring ConsoleSaveFileSplit::getPlayerDataFilenameForSave(const PlayerUID& pUID) -{ - return header.getPlayerDataFilenameForSave( pUID ); -} -vector *ConsoleSaveFileSplit::getValidPlayerDatFiles() -{ - return header.getValidPlayerDatFiles(); -} -#endif - -int ConsoleSaveFileSplit::getSaveVersion() -{ - return header.getSaveVersion(); -} - -int ConsoleSaveFileSplit::getOriginalSaveVersion() -{ - return header.getOriginalSaveVersion(); -} - -void ConsoleSaveFileSplit::LockSaveAccess() -{ - EnterCriticalSection(&m_lock); -} - -void ConsoleSaveFileSplit::ReleaseSaveAccess() -{ - LeaveCriticalSection(&m_lock); -} - -ESavePlatform ConsoleSaveFileSplit::getSavePlatform() -{ - return header.getSavePlatform(); -} - -bool ConsoleSaveFileSplit::isSaveEndianDifferent() -{ - return header.isSaveEndianDifferent(); -} - -void ConsoleSaveFileSplit::setLocalPlatform() -{ - header.setLocalPlatform(); -} - -void ConsoleSaveFileSplit::setPlatform(ESavePlatform plat) -{ - header.setPlatform(plat); -} - -ByteOrder ConsoleSaveFileSplit::getSaveEndian() -{ - return header.getSaveEndian(); -} - -ByteOrder ConsoleSaveFileSplit::getLocalEndian() -{ - return header.getLocalEndian(); -} - -void ConsoleSaveFileSplit::setEndian(ByteOrder endian) -{ - header.setEndian(endian); -} - -void ConsoleSaveFileSplit::ConvertRegionFile(File sourceFile) -{ - DWORD numberOfBytesWritten = 0; - DWORD numberOfBytesRead = 0; - - RegionFile sourceRegionFile(this, &sourceFile); - - for(unsigned int x = 0; x < 32; ++x) - { - for(unsigned int z = 0; z < 32; ++z) - { - DataInputStream *dis = sourceRegionFile.getChunkDataInputStream(x,z); - - if(dis) - { - byteArray inData(1024*1024); - int read = dis->read(inData); - dis->close(); - dis->deleteChildStream(); - delete dis; - - DataOutputStream *dos = sourceRegionFile.getChunkDataOutputStream(x,z); - dos->write(inData, 0, read); - - - dos->close(); - dos->deleteChildStream(); - delete dos; - delete inData.data; - - } - - } - } - sourceRegionFile.writeAllOffsets(); // saves all the endian swapped offsets back out to the file (not all of these are written in the above processing). - -} - -void ConsoleSaveFileSplit::ConvertToLocalPlatform() -{ - if(getSavePlatform() == SAVE_FILE_PLATFORM_LOCAL) - { - // already in the correct format - return; - } - // convert each of the region files to the local platform - vector *allFilesInSave = getFilesWithPrefix(wstring(L"")); - for(AUTO_VAR(it, allFilesInSave->begin()); it < allFilesInSave->end(); ++it) - { - FileEntry *fe = *it; - wstring fName( fe->data.filename ); - wstring suffix(L".mcr"); - if( fName.compare(fName.length() - suffix.length(), suffix.length(), suffix) == 0 ) - { - app.DebugPrintf("Processing a region file: %ls\n",fName.c_str()); - ConvertRegionFile(File(fe->data.filename) ); - } - else - { - app.DebugPrintf("%ls is not a region file, ignoring\n", fName.c_str()); - } - } - - setLocalPlatform(); // set the platform of this save to the local platform, now that it's been coverted -} diff --git a/Minecraft.World/ConsoleSaveFileSplit.h b/Minecraft.World/ConsoleSaveFileSplit.h deleted file mode 100644 index 0b2017a2..00000000 --- a/Minecraft.World/ConsoleSaveFileSplit.h +++ /dev/null @@ -1,143 +0,0 @@ -#pragma once - -#include "FileHeader.h" -#include "ConsoleSavePath.h" -#include "ConsoleSaveFile.h" - -class ProgressRenderer; - -class ConsoleSaveFileSplit : public ConsoleSaveFile -{ -private: - FileHeader header; - - static const int WRITE_BANDWIDTH_BYTESPERSECOND = 1048576; // Average bytes per second we will cap to when writing region files during the tick() method - static const int WRITE_BANDWIDTH_MEASUREMENT_PERIOD_SECONDS = 10; // Time period over which the bytes per second average is calculated - static const int WRITE_TICK_RATE_MS = 500; // Time between attempts to work out which regions we should write during the tick - static const int WRITE_MAX_WRITE_PER_TICK = WRITE_BANDWIDTH_BYTESPERSECOND; // Maximum number of bytes we can add in a single tick - - class WriteHistory - { - public: - int64_t writeTime; - unsigned int writeSize; - } ; - - class DirtyRegionFile - { - public: - int64_t lastWritten; - unsigned int fileRef; - bool operator<(const DirtyRegionFile& rhs) { return lastWritten < rhs.lastWritten; } - }; - - class RegionFileReference - { - public: - RegionFileReference(int index, unsigned int regionIndex, unsigned int length = 0, unsigned char *data = NULL); - ~RegionFileReference(); - void Compress(); // Compress from data to dataCompressed - void Decompress(); // Decompress from dataCompressed -> data - unsigned int GetCompressedSize(); // Gets byte size for what this region will compress to - void ReleaseCompressed(); // Release dataCompressed - FileEntry *fileEntry; - unsigned char *data; - unsigned char *dataCompressed; - unsigned int dataCompressedSize; - int index; - bool dirty; - int64_t lastWritten; - }; - unordered_map regionFiles; - vector writeHistory; - int64_t m_lastTickTime; - - FileEntry *GetRegionFileEntry(unsigned int regionIndex); - - wstring m_fileName; - bool m_autosave; - -// HANDLE hHeap; - static void *pvHeap; - static unsigned int pagesCommitted; -#ifdef _LARGE_WORLDS - static const unsigned int CSF_PAGE_SIZE = 64 * 1024; - static const unsigned int MAX_PAGE_COUNT = 32 * 1024; // 2GB virtual allocation -#else - static const unsigned int CSF_PAGE_SIZE = 64 * 1024; - static const unsigned int MAX_PAGE_COUNT = 1024; -#endif - LPVOID pvSaveMem; - - CRITICAL_SECTION m_lock; - - void PrepareForWrite( FileEntry *file, DWORD nNumberOfBytesToWrite ); - void MoveDataBeyond(FileEntry *file, DWORD nNumberOfBytesToWrite); - - bool GetNumericIdentifierFromName(const wstring &fileName, unsigned int *idOut); - wstring GetNameFromNumericIdentifier(unsigned int idIn); - void processSubfilesForWrite(); - void processSubfilesAfterWrite(); -public: - static int SaveSaveDataCallback(LPVOID lpParam,bool bRes); - static int SaveRegionFilesCallback(LPVOID lpParam,bool bRes); - -private: - void _init(const wstring &fileName, LPVOID pvSaveData, DWORD fileSize, ESavePlatform plat); - -public: - ConsoleSaveFileSplit(const wstring &fileName, LPVOID pvSaveData = NULL, DWORD fileSize = 0, bool forceCleanSave = false, ESavePlatform plat = SAVE_FILE_PLATFORM_LOCAL); - ConsoleSaveFileSplit(ConsoleSaveFile *sourceSave, bool alreadySmallRegions = true, ProgressListener *progress = NULL); - virtual ~ConsoleSaveFileSplit(); - - // 4J Stu - Initial implementation is intended to have a similar interface to the standard Xbox file access functions - - virtual FileEntry *createFile( const ConsoleSavePath &fileName ); - virtual void deleteFile( FileEntry *file ); - - virtual void setFilePointer(FileEntry *file,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod); - virtual BOOL writeFile( FileEntry *file, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten ); - virtual BOOL zeroFile(FileEntry *file, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten); - virtual BOOL readFile( FileEntry *file, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead ); - virtual BOOL closeHandle( FileEntry *file ); - - virtual void finalizeWrite(); - virtual void tick(); - - virtual bool doesFileExist(ConsoleSavePath file); - - virtual void Flush(bool autosave, bool updateThumbnail = true); - -#ifndef _CONTENT_PACKAGE - virtual void DebugFlushToFile(void *compressedData = NULL, unsigned int compressedDataSize = 0); -#endif - virtual unsigned int getSizeOnDisk(); - - virtual wstring getFilename(); - - virtual vector *getFilesWithPrefix(const wstring &prefix); - virtual vector *getRegionFilesByDimension(unsigned int dimensionIndex); - -#if defined(__PS3__) || defined(__ORBIS__) - virtual wstring getPlayerDataFilenameForLoad(const PlayerUID& pUID); - virtual wstring getPlayerDataFilenameForSave(const PlayerUID& pUID); - virtual vector *getValidPlayerDatFiles(); -#endif //__PS3__ - - virtual int getSaveVersion(); - virtual int getOriginalSaveVersion(); - - virtual void LockSaveAccess(); - virtual void ReleaseSaveAccess(); - - virtual ESavePlatform getSavePlatform(); - virtual bool isSaveEndianDifferent(); - virtual void setLocalPlatform(); - virtual void setPlatform(ESavePlatform plat); - virtual ByteOrder getSaveEndian(); - virtual ByteOrder getLocalEndian(); - virtual void setEndian(ByteOrder endian); - - virtual void ConvertRegionFile(File sourceFile); - virtual void ConvertToLocalPlatform(); -}; \ No newline at end of file diff --git a/Minecraft.World/Container.h b/Minecraft.World/Container.h index 7aa63728..8fa21345 100644 --- a/Minecraft.World/Container.h +++ b/Minecraft.World/Container.h @@ -7,17 +7,23 @@ class Player; class Container { public: - static const int LARGE_MAX_STACK_SIZE = 64; + static const int LARGE_MAX_STACK_SIZE = 64; - virtual unsigned int getContainerSize() = 0; - virtual shared_ptr getItem(unsigned int slot) = 0; - virtual shared_ptr removeItem(unsigned int slot, int count) = 0; + // 4J-JEV: Added to distinguish between ender, bonus, small and large chests + virtual int getContainerType() { return -1; } + + virtual unsigned int getContainerSize() = 0; + virtual shared_ptr getItem(unsigned int slot) = 0; + virtual shared_ptr removeItem(unsigned int slot, int count) = 0; virtual shared_ptr removeItemNoUpdate(int slot) = 0; - virtual void setItem(unsigned int slot, shared_ptr item) = 0; - virtual int getName() = 0; - virtual int getMaxStackSize() = 0; - virtual void setChanged() = 0; - virtual bool stillValid(shared_ptr player) = 0; + virtual void setItem(unsigned int slot, shared_ptr item) = 0; + virtual wstring getName() = 0; + virtual wstring getCustomName() = 0; // 4J Stu added for sending over the network + virtual bool hasCustomName() = 0; + virtual int getMaxStackSize() = 0; + virtual void setChanged() = 0; + virtual bool stillValid(shared_ptr player) = 0; virtual void startOpen() = 0; virtual void stopOpen() = 0; + virtual bool canPlaceItem(int slot, shared_ptr item) = 0; }; \ No newline at end of file diff --git a/Minecraft.World/ContainerClickPacket.cpp b/Minecraft.World/ContainerClickPacket.cpp index 5b3ca24f..a9712183 100644 --- a/Minecraft.World/ContainerClickPacket.cpp +++ b/Minecraft.World/ContainerClickPacket.cpp @@ -18,16 +18,16 @@ ContainerClickPacket::ContainerClickPacket() buttonNum = 0; uid = 0; item = nullptr; - quickKey = false; + clickType = 0; } -ContainerClickPacket::ContainerClickPacket(int containerId, int slotNum, int buttonNum, bool quickKey, shared_ptr item, short uid) +ContainerClickPacket::ContainerClickPacket(int containerId, int slotNum, int buttonNum, int clickType, shared_ptr item, short uid) { this->containerId = containerId; this->slotNum = slotNum; this->buttonNum = buttonNum; this->uid = uid; - this->quickKey = quickKey; + this->clickType = clickType; // 4J - make a copy of the relevant bits of this item, as we want our packets to have full ownership of any data they reference this->item = item ? item->copy() : nullptr; } @@ -43,7 +43,7 @@ void ContainerClickPacket::read(DataInputStream *dis) //throws IOException slotNum = dis->readShort(); buttonNum = dis->readByte(); uid = dis->readShort(); - quickKey = dis->readBoolean(); + clickType = dis->readByte(); item = readItem(dis); } @@ -54,7 +54,7 @@ void ContainerClickPacket::write(DataOutputStream *dos) // throws IOException dos->writeShort(slotNum); dos->writeByte(buttonNum); dos->writeShort(uid); - dos->writeBoolean(quickKey); + dos->writeByte(clickType); writeItem(item, dos); } diff --git a/Minecraft.World/ContainerClickPacket.h b/Minecraft.World/ContainerClickPacket.h index 8bea7da5..51686166 100644 --- a/Minecraft.World/ContainerClickPacket.h +++ b/Minecraft.World/ContainerClickPacket.h @@ -11,11 +11,11 @@ public: int buttonNum; short uid; shared_ptr item; - bool quickKey; + int clickType; ContainerClickPacket(); ~ContainerClickPacket(); - ContainerClickPacket(int containerId, int slotNum, int buttonNum, bool quickKey, shared_ptr item, short uid); + ContainerClickPacket(int containerId, int slotNum, int buttonNum, int clickType, shared_ptr item, short uid); virtual void handle(PacketListener *listener); virtual void read(DataInputStream *dis); diff --git a/Minecraft.World/ContainerMenu.cpp b/Minecraft.World/ContainerMenu.cpp index 57190024..b1fd4d6b 100644 --- a/Minecraft.World/ContainerMenu.cpp +++ b/Minecraft.World/ContainerMenu.cpp @@ -11,7 +11,7 @@ ContainerMenu::ContainerMenu(shared_ptr inventory, shared_ptr container) : AbstractContainerMenu() { this->container = container; - this->containerRows = container->getContainerSize() / 9; + containerRows = container->getContainerSize() / 9; container->startOpen(); int yo = (containerRows - 4) * 18; @@ -45,7 +45,7 @@ bool ContainerMenu::stillValid(shared_ptr player) shared_ptr ContainerMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL && slot->hasItem()) { shared_ptr stack = slot->getItem(); @@ -53,7 +53,7 @@ shared_ptr ContainerMenu::quickMoveStack(shared_ptr player if (slotIndex < containerRows * 9) { - if(!moveItemStackTo(stack, containerRows * 9, (int)slots->size(), true)) + if(!moveItemStackTo(stack, containerRows * 9, (int)slots.size(), true)) { // 4J Stu - Brought forward from 1.2 return nullptr; @@ -85,9 +85,14 @@ void ContainerMenu::removed(shared_ptr player) container->stopOpen(); } -shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) +shared_ptr ContainerMenu::getContainer() { - shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); + return container; +} + +shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped) // 4J Added looped param +{ + shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player, looped); #ifdef _EXTENDED_ACHIEVEMENTS shared_ptr localPlayer = dynamic_pointer_cast(player); @@ -98,7 +103,7 @@ shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, in for (int i = 0; i < container->getContainerSize(); i++) { shared_ptr item = container->getItem(i); - if ( (item != nullptr) && (item->id == Tile::stoneBrick_Id) ) + if ( (item != nullptr) && (item->id == Tile::cobblestone_Id) ) { cobblecount += item->GetCount(); } @@ -107,7 +112,7 @@ shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, in // 4J-JEV: This check performed on XboxOne servers, for other platforms check here. #ifndef _DURANGO StatsCounter *sc = Minecraft::GetInstance()->stats[localPlayer->GetXboxPad()]; - int minedCount = sc->getTotalValue(GenericStats::blocksMined(Tile::rock_Id)) + sc->getTotalValue(GenericStats::blocksMined(Tile::stoneBrick_Id)); + int minedCount = sc->getTotalValue(GenericStats::blocksMined(Tile::stone_Id)) + sc->getTotalValue(GenericStats::blocksMined(Tile::cobblestone_Id)); if (cobblecount >= 1728 && minedCount >= 1728 ) #endif { diff --git a/Minecraft.World/ContainerMenu.h b/Minecraft.World/ContainerMenu.h index e6da0782..5d70ecc5 100644 --- a/Minecraft.World/ContainerMenu.h +++ b/Minecraft.World/ContainerMenu.h @@ -15,8 +15,9 @@ public: virtual bool stillValid(shared_ptr player); virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); - void removed(shared_ptr player); + virtual void removed(shared_ptr player); + virtual shared_ptr getContainer(); // 4J ADDED, - virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped = false); }; diff --git a/Minecraft.World/ContainerOpenPacket.cpp b/Minecraft.World/ContainerOpenPacket.cpp index 7cb530cf..d5268922 100644 --- a/Minecraft.World/ContainerOpenPacket.cpp +++ b/Minecraft.World/ContainerOpenPacket.cpp @@ -4,20 +4,30 @@ #include "PacketListener.h" #include "ContainerOpenPacket.h" -ContainerOpenPacket::ContainerOpenPacket() -{ - containerId = 0; - type = 0; - title = 0; - size = 0; -} - -ContainerOpenPacket::ContainerOpenPacket(int containerId, int type, int title, int size) +void ContainerOpenPacket::_init(int containerId, int type, const wstring &title, int size, bool customName, int entityId) { this->containerId = containerId; this->type = type; this->title = title; this->size = size; + this->customName = customName; + this->entityId = entityId; +} + +ContainerOpenPacket::ContainerOpenPacket() +{ + _init(0, 0, L"", 0, false, 0); + +} + +ContainerOpenPacket::ContainerOpenPacket(int containerId, int type, const wstring &title, int size, bool customName) +{ + _init(containerId, type, title, size, customName, 0); +} + +ContainerOpenPacket::ContainerOpenPacket(int containerId, int type, const wstring &title, int size, bool customName, int entityId) +{ + _init(containerId, type, title, size, customName, entityId); } void ContainerOpenPacket::handle(PacketListener *listener) @@ -30,19 +40,39 @@ void ContainerOpenPacket::read(DataInputStream *dis) //throws IOException { containerId = dis->readByte() & 0xff; type = dis->readByte() & 0xff; - title = dis->readShort(); size = dis->readByte() & 0xff; + customName = dis->readBoolean(); + if (type == HORSE) + { + entityId = dis->readInt(); + } + if(customName) + { + title = readUtf(dis,64); + } } void ContainerOpenPacket::write(DataOutputStream *dos) //throws IOException { dos->writeByte(containerId & 0xff); dos->writeByte(type & 0xff); - dos->writeShort(title & 0xffff); dos->writeByte(size & 0xff); + dos->writeBoolean(customName); + if (type == HORSE) + { + dos->writeInt(entityId); + } + if(customName) + { + writeUtf(title, dos); + } } int ContainerOpenPacket::getEstimatedSize() { - return 5; + if (type == HORSE) + { + return 10; + } + return 6; } diff --git a/Minecraft.World/ContainerOpenPacket.h b/Minecraft.World/ContainerOpenPacket.h index dbc65b9a..896b7dd9 100644 --- a/Minecraft.World/ContainerOpenPacket.h +++ b/Minecraft.World/ContainerOpenPacket.h @@ -15,14 +15,30 @@ public: static const int TRADER_NPC = 6; static const int BEACON = 7; static const int REPAIR_TABLE = 8; + static const int HOPPER = 9; + static const int DROPPER = 10; + static const int HORSE = 11; + static const int FIREWORKS = 12; // 4J Added + static const int BONUS_CHEST = 13; // 4J Added + static const int LARGE_CHEST = 14; // 4J Added + static const int ENDER_CHEST = 15; // 4J Added + static const int MINECART_CHEST = 16; // 4J Added + static const int MINECART_HOPPER = 17; // 4J Added int containerId; int type; - int title; // 4J Stu - Changed from string int size; + bool customName; + wstring title; + int entityId; +private: + void _init(int containerId, int type, const wstring &title, int size, bool customName, int entityId); + +public: ContainerOpenPacket(); - ContainerOpenPacket(int containerId, int type, int title, int size); + ContainerOpenPacket(int containerId, int type, const wstring &title, int size, bool customName); + ContainerOpenPacket(int containerId, int type, const wstring &title, int size, bool customName, int entityId); virtual void handle(PacketListener *listener); virtual void read(DataInputStream *dis); diff --git a/Minecraft.World/ControlledByPlayerGoal.cpp b/Minecraft.World/ControlledByPlayerGoal.cpp index 1e035494..cea227cd 100644 --- a/Minecraft.World/ControlledByPlayerGoal.cpp +++ b/Minecraft.World/ControlledByPlayerGoal.cpp @@ -36,8 +36,7 @@ void ControlledByPlayerGoal::stop() bool ControlledByPlayerGoal::canUse() { - shared_ptr player = dynamic_pointer_cast( mob->rider.lock() ); - return mob->isAlive() && player && (boosting || mob->canBeControlledByRider()); + return mob->isAlive() && mob->rider.lock() != NULL && mob->rider.lock()->instanceof(eTYPE_PLAYER) && (boosting || mob->canBeControlledByRider()); } void ControlledByPlayerGoal::tick() @@ -120,7 +119,7 @@ void ControlledByPlayerGoal::tick() if (carriedItem != NULL && carriedItem->id == Item::carrotOnAStick_Id) { - carriedItem->hurt(1, player); + carriedItem->hurtAndBreak(1, player); if (carriedItem->count == 0) { @@ -134,6 +133,11 @@ void ControlledByPlayerGoal::tick() mob->travel(0, moveSpeed); } +bool ControlledByPlayerGoal::isNoJumpTile(int tile) +{ + return Tile::tiles[tile] != NULL && (Tile::tiles[tile]->getRenderShape() == Tile::SHAPE_STAIRS || (dynamic_cast(Tile::tiles[tile]) != NULL) ); +} + bool ControlledByPlayerGoal::isBoosting() { return boosting; diff --git a/Minecraft.World/ControlledByPlayerGoal.h b/Minecraft.World/ControlledByPlayerGoal.h index f49eaaf1..25bd579c 100644 --- a/Minecraft.World/ControlledByPlayerGoal.h +++ b/Minecraft.World/ControlledByPlayerGoal.h @@ -26,6 +26,11 @@ public: void stop(); bool canUse(); void tick(); + +private: + bool isNoJumpTile(int tile); + +public: bool isBoosting(); void boost(); bool canBoost(); diff --git a/Minecraft.World/Cow.cpp b/Minecraft.World/Cow.cpp index c259183e..05e70102 100644 --- a/Minecraft.World/Cow.cpp +++ b/Minecraft.World/Cow.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.level.tile.h" @@ -7,6 +8,7 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.stats.h" #include "Cow.h" #include "..\Minecraft.Client\Textures.h" @@ -19,20 +21,18 @@ Cow::Cow(Level *level) : Animal( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_COW; // 4J was L"/mob/cow.png"; this->setSize(0.9f, 1.3f); getNavigation()->setAvoidWater(true); goalSelector.addGoal(0, new FloatGoal(this)); - goalSelector.addGoal(1, new PanicGoal(this, 0.38f)); - goalSelector.addGoal(2, new BreedGoal(this, 0.2f)); - goalSelector.addGoal(3, new TemptGoal(this, 0.25f, Item::wheat_Id, false)); - goalSelector.addGoal(4, new FollowParentGoal(this, 0.25f)); - goalSelector.addGoal(5, new RandomStrollGoal(this, 0.2f)); + goalSelector.addGoal(1, new PanicGoal(this, 2.0f)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0f)); + goalSelector.addGoal(3, new TemptGoal(this, 1.25f, Item::wheat_Id, false)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.25f)); + goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0f)); goalSelector.addGoal(6, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(7, new RandomLookAroundGoal(this)); } @@ -42,9 +42,12 @@ bool Cow::useNewAi() return true; } -int Cow::getMaxHealth() +void Cow::registerAttributes() { - return 10; + Animal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(10); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.2f); } int Cow::getAmbientSound() @@ -62,6 +65,11 @@ int Cow::getDeathSound() return eSoundType_MOB_COW_HURT; } +void Cow::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_COW_STEP, 0.15f, 1); +} + float Cow::getSoundVolume() { return 0.4f; @@ -95,25 +103,25 @@ void Cow::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) } } -bool Cow::interact(shared_ptr player) +bool Cow::mobInteract(shared_ptr player) { shared_ptr item = player->inventory->getSelected(); - if (item != NULL && item->id == Item::bucket_empty->id) + if (item != NULL && item->id == Item::bucket_empty->id && !player->abilities.instabuild) { player->awardStat(GenericStats::cowsMilked(),GenericStats::param_cowsMilked()); - if (--item->count <= 0) + if (item->count-- == 0) { - player->inventory->setItem(player->inventory->selected, shared_ptr( new ItemInstance(Item::milk) ) ); + player->inventory->setItem(player->inventory->selected, shared_ptr( new ItemInstance(Item::bucket_milk) ) ); } - else if (!player->inventory->add(shared_ptr( new ItemInstance(Item::milk) ))) + else if (!player->inventory->add(shared_ptr( new ItemInstance(Item::bucket_milk) ))) { - player->drop(shared_ptr( new ItemInstance(Item::milk) )); + player->drop(shared_ptr( new ItemInstance(Item::bucket_milk) )); } return true; } - return Animal::interact(player); + return Animal::mobInteract(player); } shared_ptr Cow::getBreedOffspring(shared_ptr target) diff --git a/Minecraft.World/Cow.h b/Minecraft.World/Cow.h index a1a91aba..24210631 100644 --- a/Minecraft.World/Cow.h +++ b/Minecraft.World/Cow.h @@ -16,17 +16,18 @@ public: public: Cow(Level *level); virtual bool useNewAi(); - virtual int getMaxHealth(); protected: + virtual void registerAttributes(); virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); virtual float getSoundVolume(); virtual int getDeathLoot(); + virtual void playStepSound(int xt, int yt, int zt, int t); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); virtual shared_ptr getBreedOffspring(shared_ptr target); }; diff --git a/Minecraft.World/CraftingContainer.cpp b/Minecraft.World/CraftingContainer.cpp index fbcc5678..7057edfe 100644 --- a/Minecraft.World/CraftingContainer.cpp +++ b/Minecraft.World/CraftingContainer.cpp @@ -41,9 +41,19 @@ shared_ptr CraftingContainer::getItem(unsigned int x, unsigned int return getItem(pos); } -int CraftingContainer::getName() +wstring CraftingContainer::getName() { - return 0; + return L""; +} + +wstring CraftingContainer::getCustomName() +{ + return L""; +} + +bool CraftingContainer::hasCustomName() +{ + return false; } shared_ptr CraftingContainer::removeItemNoUpdate(int slot) @@ -95,6 +105,11 @@ void CraftingContainer::setChanged() } bool CraftingContainer::stillValid(shared_ptr player) +{ + return true; +} + +bool CraftingContainer::canPlaceItem(int slot, shared_ptr item) { return true; } \ No newline at end of file diff --git a/Minecraft.World/CraftingContainer.h b/Minecraft.World/CraftingContainer.h index 863249a2..fc8c2967 100644 --- a/Minecraft.World/CraftingContainer.h +++ b/Minecraft.World/CraftingContainer.h @@ -18,7 +18,9 @@ public: virtual unsigned int getContainerSize(); virtual shared_ptr getItem(unsigned int slot); shared_ptr getItem(unsigned int x, unsigned int y); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); virtual shared_ptr removeItemNoUpdate(int slot); virtual shared_ptr removeItem(unsigned int slot, int count); virtual void setItem(unsigned int slot, shared_ptr item); @@ -29,4 +31,5 @@ public: void startOpen() { } // TODO Auto-generated method stub void stopOpen() { } // TODO Auto-generated method stub + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/CraftingMenu.cpp b/Minecraft.World/CraftingMenu.cpp index eeb2a6e3..c104bbec 100644 --- a/Minecraft.World/CraftingMenu.cpp +++ b/Minecraft.World/CraftingMenu.cpp @@ -23,9 +23,9 @@ CraftingMenu::CraftingMenu(shared_ptr inventory, Level *level, int xt resultSlots = shared_ptr( new ResultContainer() ); this->level = level; - this->x = xt; - this->y = yt; - this->z = zt; + x = xt; + y = yt; + z = zt; addSlot(new ResultSlot( inventory->player, craftSlots, resultSlots, 0, 120 + 4, 31 + 4)); for (int y = 0; y < 3; y++) @@ -81,7 +81,7 @@ bool CraftingMenu::stillValid(shared_ptr player) shared_ptr CraftingMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL && slot->hasItem()) { shared_ptr stack = slot->getItem(); @@ -135,4 +135,9 @@ shared_ptr CraftingMenu::quickMoveStack(shared_ptr player, } } return clicked; +} + +bool CraftingMenu::canTakeItemForPickAll(shared_ptr carried, Slot *target) +{ + return target->container != resultSlots && AbstractContainerMenu::canTakeItemForPickAll(carried, target); } \ No newline at end of file diff --git a/Minecraft.World/CraftingMenu.h b/Minecraft.World/CraftingMenu.h index 0452eccc..b10344c0 100644 --- a/Minecraft.World/CraftingMenu.h +++ b/Minecraft.World/CraftingMenu.h @@ -32,4 +32,9 @@ public: virtual void removed(shared_ptr player); virtual bool stillValid(shared_ptr player); virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + virtual bool canTakeItemForPickAll(shared_ptr carried, Slot *target); + + int getX() { return x; } + int getY() { return y; } + int getZ() { return z; } }; \ No newline at end of file diff --git a/Minecraft.World/Creeper.cpp b/Minecraft.World/Creeper.cpp index 3f6c66a7..29be2c0c 100644 --- a/Minecraft.World/Creeper.cpp +++ b/Minecraft.World/Creeper.cpp @@ -3,11 +3,13 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.animal.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.damagesource.h" #include "GeneralStat.h" #include "Skeleton.h" @@ -22,6 +24,8 @@ void Creeper::_init() { swell = 0; oldSwell = 0; + maxSwell = 30; + explosionRadius = 3; } Creeper::Creeper(Level *level) : Monster( level ) @@ -29,105 +33,124 @@ Creeper::Creeper(Level *level) : Monster( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); _init(); - - this->textureIdx = TN_MOB_CREEPER; // 4J was L"/mob/creeper.png"; goalSelector.addGoal(1, new FloatGoal(this)); goalSelector.addGoal(2, new SwellGoal(this)); - goalSelector.addGoal(3, new AvoidPlayerGoal(this, typeid(Ozelot), 6, 0.25f, 0.30f)); - goalSelector.addGoal(4, new MeleeAttackGoal(this, 0.25f, false)); - goalSelector.addGoal(5, new RandomStrollGoal(this, 0.20f)); + goalSelector.addGoal(3, new AvoidPlayerGoal(this, typeid(Ocelot), 6, 1.0, 1.2)); + goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0, false)); + goalSelector.addGoal(5, new RandomStrollGoal(this, 0.8)); goalSelector.addGoal(6, new LookAtPlayerGoal(this, typeid(Player), 8)); goalSelector.addGoal(6, new RandomLookAroundGoal(this)); - targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, typeid(Player), 16, 0, true)); + targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, typeid(Player), 0, true)); targetSelector.addGoal(2, new HurtByTargetGoal(this, false)); } +void Creeper::registerAttributes() +{ + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); +} + bool Creeper::useNewAi() { return true; } -int Creeper::getMaxHealth() +int Creeper::getMaxFallDistance() +{ + if (getTarget() == NULL) return 3; + // As long as they survive the fall they should try. + return 3 + (int) (getHealth() - 1); +} + +void Creeper::causeFallDamage(float distance) { - return 20; + Monster::causeFallDamage(distance); + + swell += distance * 1.5f; + if (swell > maxSwell - 5) swell = maxSwell - 5; } void Creeper::defineSynchedData() { - Monster::defineSynchedData(); + Monster::defineSynchedData(); - entityData->define(DATA_SWELL_DIR, (byte) -1); - entityData->define(DATA_IS_POWERED, (byte) 0); + entityData->define(DATA_SWELL_DIR, (byte) -1); + entityData->define(DATA_IS_POWERED, (byte) 0); } void Creeper::addAdditonalSaveData(CompoundTag *entityTag) { - Monster::addAdditonalSaveData(entityTag); - if (entityData->getByte(DATA_IS_POWERED) == 1) entityTag->putBoolean(L"powered", true); + Monster::addAdditonalSaveData(entityTag); + if (entityData->getByte(DATA_IS_POWERED) == 1) entityTag->putBoolean(L"powered", true); + entityTag->putShort(L"Fuse", (short) maxSwell); + entityTag->putByte(L"ExplosionRadius", (byte) explosionRadius); } void Creeper::readAdditionalSaveData(CompoundTag *tag) { - Monster::readAdditionalSaveData(tag); - entityData->set(DATA_IS_POWERED, (byte) (tag->getBoolean(L"powered") ? 1 : 0)); + Monster::readAdditionalSaveData(tag); + entityData->set(DATA_IS_POWERED, (byte) (tag->getBoolean(L"powered") ? 1 : 0)); + if (tag->contains(L"Fuse")) maxSwell = tag->getShort(L"Fuse"); + if (tag->contains(L"ExplosionRadius")) explosionRadius = tag->getByte(L"ExplosionRadius"); } void Creeper::tick() { - oldSwell = swell; - if (isAlive()) + oldSwell = swell; + if (isAlive()) { - int swellDir = getSwellDir(); - if (swellDir > 0 && swell == 0) + int swellDir = getSwellDir(); + if (swellDir > 0 && swell == 0) { - level->playSound(shared_from_this(), eSoundType_RANDOM_FUSE, 1, 0.5f); - } - swell += swellDir; - if (swell < 0) swell = 0; - if (swell >= MAX_SWELL) + playSound(eSoundType_RANDOM_FUSE, 1, 0.5f); + } + swell += swellDir; + if (swell < 0) swell = 0; + if (swell >= maxSwell) { - swell = MAX_SWELL; + swell = maxSwell; if (!level->isClientSide) { - bool destroyBlocks = true; //level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); - if (isPowered()) level->explode(shared_from_this(), x, y, z, 6, destroyBlocks); - else level->explode(shared_from_this(), x, y, z, 3,destroyBlocks); + bool destroyBlocks = level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING); + if (isPowered()) level->explode(shared_from_this(), x, y, z, explosionRadius * 2, destroyBlocks); + else level->explode(shared_from_this(), x, y, z, explosionRadius, destroyBlocks); remove(); } } - } - Monster::tick(); + } + Monster::tick(); } int Creeper::getHurtSound() { - return eSoundType_MOB_CREEPER_HURT; + return eSoundType_MOB_CREEPER_HURT; } int Creeper::getDeathSound() { - return eSoundType_MOB_CREEPER_DEATH; + return eSoundType_MOB_CREEPER_DEATH; } void Creeper::die(DamageSource *source) { - Monster::die(source); + Monster::die(source); - if ( dynamic_pointer_cast(source->getEntity()) != NULL ) + if ( source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_SKELETON) ) { - spawnAtLocation(Item::record_01_Id + random->nextInt(12), 1); - } + int recordId = Item::record_01_Id + random->nextInt(Item::record_12_Id - Item::record_01_Id + 1); + spawnAtLocation(recordId, 1); + } - shared_ptr player = dynamic_pointer_cast(source->getEntity()); - if ( (dynamic_pointer_cast(source->getDirectEntity()) != NULL) && (player != NULL) ) + if ( source->getDirectEntity() != NULL && source->getDirectEntity()->instanceof(eTYPE_ARROW) && source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_PLAYER) ) { + shared_ptr player = dynamic_pointer_cast(source->getEntity()); player->awardStat(GenericStats::archer(), GenericStats::param_archer()); } } @@ -139,31 +162,31 @@ bool Creeper::doHurtTarget(shared_ptr target) bool Creeper::isPowered() { - return entityData->getByte(DATA_IS_POWERED) == 1; + return entityData->getByte(DATA_IS_POWERED) == 1; } float Creeper::getSwelling(float a) { - return (oldSwell + (swell - oldSwell) * a) / (MAX_SWELL - 2); + return (oldSwell + (swell - oldSwell) * a) / (maxSwell - 2); } int Creeper::getDeathLoot() { - return Item::sulphur->id; + return Item::gunpowder_Id; } int Creeper::getSwellDir() { - return (int) (char) entityData->getByte(DATA_SWELL_DIR); + return (int) (char) entityData->getByte(DATA_SWELL_DIR); } void Creeper::setSwellDir(int dir) { - entityData->set(DATA_SWELL_DIR, (byte) dir); + entityData->set(DATA_SWELL_DIR, (byte) dir); } void Creeper::thunderHit(const LightningBolt *lightningBolt) { - Monster::thunderHit(lightningBolt); - entityData->set(DATA_IS_POWERED, (byte) 1); + Monster::thunderHit(lightningBolt); + entityData->set(DATA_IS_POWERED, (byte) 1); } diff --git a/Minecraft.World/Creeper.h b/Minecraft.World/Creeper.h index a5da0e10..d5cd4cff 100644 --- a/Minecraft.World/Creeper.h +++ b/Minecraft.World/Creeper.h @@ -14,30 +14,36 @@ public: private: static const int DATA_SWELL_DIR = 16; - static const int DATA_IS_POWERED = 17; + static const int DATA_IS_POWERED = 17; - int swell; - int oldSwell; - - static const int MAX_SWELL = 30; + int oldSwell; + int swell; + int maxSwell; + int explosionRadius; void _init(); public: Creeper(Level *level); +protected: + void registerAttributes(); + +public: virtual bool useNewAi(); - virtual int getMaxHealth(); + + virtual int getMaxFallDistance(); protected: + virtual void causeFallDamage(float distance); virtual void defineSynchedData(); public: virtual void addAdditonalSaveData(CompoundTag *entityTag); - virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void readAdditionalSaveData(CompoundTag *tag); protected: - virtual void tick(); + virtual void tick(); protected: virtual int getHurtSound(); @@ -47,7 +53,7 @@ public: virtual void die(DamageSource *source); virtual bool doHurtTarget(shared_ptr target); virtual bool isPowered(); - float getSwelling(float a); + float getSwelling(float a); protected: int getDeathLoot(); diff --git a/Minecraft.World/CropTile.cpp b/Minecraft.World/CropTile.cpp index 0c19d889..29c5b1c9 100644 --- a/Minecraft.World/CropTile.cpp +++ b/Minecraft.World/CropTile.cpp @@ -40,18 +40,20 @@ void CropTile::tick(Level *level, int x, int y, int z, Random *random) { float growthSpeed = getGrowthSpeed(level, x, y, z); - if (random->nextInt((int) (25 / growthSpeed) + 1) == 0) + if (random->nextInt((int) (25 / growthSpeed) + 1) == 0) { age++; - level->setData(x, y, z, age); + level->setData(x, y, z, age, Tile::UPDATE_CLIENTS); } } } } -void CropTile::growCropsToMax(Level *level, int x, int y, int z) +void CropTile::growCrops(Level *level, int x, int y, int z) { - level->setData(x, y, z, 7); + int stage = level->getData(x, y, z) + Mth::nextInt(level->random, 2, 5); + if (stage > 7) stage = 7; + level->setData(x, y, z, stage, Tile::UPDATE_CLIENTS); } float CropTile::getGrowthSpeed(Level *level, int x, int y, int z) @@ -68,9 +70,9 @@ float CropTile::getGrowthSpeed(Level *level, int x, int y, int z) int d2 = level->getTile(x + 1, y, z + 1); int d3 = level->getTile(x - 1, y, z + 1); - bool horizontal = w == this->id || e == this->id; - bool vertical = n == this->id || s == this->id; - bool diagonal = d0 == this->id || d1 == this->id || d2 == this->id || d3 == this->id; + bool horizontal = w == id || e == id; + bool vertical = n == id || s == id; + bool diagonal = d0 == id || d1 == id || d2 == id || d3 == id; for (int xx = x - 1; xx <= x + 1; xx++) for (int zz = z - 1; zz <= z + 1; zz++) @@ -89,9 +91,9 @@ float CropTile::getGrowthSpeed(Level *level, int x, int y, int z) speed += tileSpeed; } - if (diagonal || (horizontal && vertical)) speed /= 2; + if (diagonal || (horizontal && vertical)) speed /= 2; - return speed; + return speed; } @@ -117,9 +119,9 @@ int CropTile::getBasePlantId() } /** - * Using this method instead of destroy() to determine if seeds should be - * dropped - */ +* Using this method instead of destroy() to determine if seeds should be +* dropped +*/ void CropTile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus) { Bush::spawnResources(level, x, y, z, data, odds, 0); @@ -128,7 +130,8 @@ void CropTile::spawnResources(Level *level, int x, int y, int z, int data, float { return; } - if (data >= 7) { + if (data >= 7) + { int count = 3 + playerBonus; for (int i = 0; i < count; i++) { diff --git a/Minecraft.World/CropTile.h b/Minecraft.World/CropTile.h index 998c5367..165fd4af 100644 --- a/Minecraft.World/CropTile.h +++ b/Minecraft.World/CropTile.h @@ -15,29 +15,29 @@ private: protected: CropTile(int id); - virtual bool mayPlaceOn(int tile); + virtual bool mayPlaceOn(int tile); public: // 4J Added override virtual void updateDefaultShape(); virtual void tick(Level *level, int x, int y, int z, Random *random); - void growCropsToMax(Level *level, int x, int y, int z); + virtual void growCrops(Level *level, int x, int y, int z); private: float getGrowthSpeed(Level *level, int x, int y, int z); public: virtual Icon *getTexture(int face, int data); - virtual int getRenderShape(); + virtual int getRenderShape(); protected: virtual int getBaseSeedId(); virtual int getBasePlantId(); public: - /** - * Using this method instead of destroy() to determine if seeds should be - * dropped - */ - virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual int getResourceCount(Random *random); + /** + * Using this method instead of destroy() to determine if seeds should be + * dropped + */ + virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int getResourceCount(Random *random); virtual int cloneTileId(Level *level, int x, int y, int z); //@Override virtual void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/CustomLevelSource.cpp b/Minecraft.World/CustomLevelSource.cpp index 216e63b9..61316299 100644 --- a/Minecraft.World/CustomLevelSource.cpp +++ b/Minecraft.World/CustomLevelSource.cpp @@ -7,6 +7,7 @@ #include "net.minecraft.world.level.levelgen.synth.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.storage.h" +#include "net.minecraft.world.entity.h" #include "CustomLevelSource.h" const double CustomLevelSource::SNOW_SCALE = 0.3; @@ -103,15 +104,16 @@ CustomLevelSource::CustomLevelSource(Level *level, __int64 seed, bool generateSt caveFeature = new LargeCaveFeature(); strongholdFeature = new StrongholdFeature(); - villageFeature = new VillageFeature(0,m_XZSize); + villageFeature = new VillageFeature(m_XZSize); mineShaftFeature = new MineShaftFeature(); + scatteredFeature = new RandomScatteredLargeFeature(); canyonFeature = new CanyonFeature(); this->level = level; random = new Random(seed); pprandom = new Random(seed); // 4J - added, so that we can have a separate random for doing post-processing in parallel with creation - perlinNoise3 = new PerlinNoise(random, 4); + perlinNoise3 = new PerlinNoise(random, 4); #endif } @@ -127,7 +129,7 @@ CustomLevelSource::~CustomLevelSource() this->level = level; delete random; - delete perlinNoise3; + delete perlinNoise3; #endif } @@ -202,7 +204,7 @@ void CustomLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) // 4J - this comparison used to just be with 0.0f but is now varied by block above if (yc * CHUNK_HEIGHT + y < mapHeight) { - tileId = (byte) Tile::rock_Id; + tileId = (byte) Tile::stone_Id; } else if (yc * CHUNK_HEIGHT + y < waterHeight) { @@ -215,7 +217,7 @@ void CustomLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) if( emin == 0 ) { // This matches code in MultiPlayerChunkCache that makes the geometry which continues at the edge of the world - if( yc * CHUNK_HEIGHT + y <= ( level->getSeaLevel() - 10 ) ) tileId = Tile::rock_Id; + if( yc * CHUNK_HEIGHT + y <= ( level->getSeaLevel() - 10 ) ) tileId = Tile::stone_Id; else if( yc * CHUNK_HEIGHT + y < level->getSeaLevel() ) tileId = Tile::calmWater_Id; } @@ -298,14 +300,14 @@ void CustomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks, Bi { run = -1; } - else if (old == Tile::rock_Id) + else if (old == Tile::stone_Id) { if (run == -1) { if (runDepth <= 0) { top = 0; - material = (byte) Tile::rock_Id; + material = (byte) Tile::stone_Id; } else if (y >= waterHeight - 4 && y <= waterHeight + 1) { @@ -393,6 +395,7 @@ LevelChunk *CustomLevelSource::getChunk(int xOffs, int zOffs) mineShaftFeature->apply(this, level, xOffs, zOffs, blocks); villageFeature->apply(this, level, xOffs, zOffs, blocks); strongholdFeature->apply(this, level, xOffs, zOffs, blocks); + scatteredFeature->apply(this, level, xOffs, zOffs, blocks); } // canyonFeature.apply(this, level, xOffs, zOffs, blocks); // townFeature.apply(this, level, xOffs, zOffs, blocks); @@ -466,7 +469,7 @@ void CustomLevelSource::calcWaterDepths(ChunkSource *parent, int xt, int zt) int od = level->getData(xp + x2, y, zp + z2); if (od < 7 && od < d) { - level->setData(xp + x2, y, zp + z2, d); + level->setData(xp + x2, y, zp + z2, d, Tile::UPDATE_CLIENTS); } } } @@ -474,10 +477,10 @@ void CustomLevelSource::calcWaterDepths(ChunkSource *parent, int xt, int zt) } if (hadWater) { - level->setTileAndDataNoUpdate(xp, y, zp, Tile::calmWater_Id, 7); + level->setTileAndData(xp, y, zp, Tile::calmWater_Id, 7, Tile::UPDATE_CLIENTS); for (int y2 = 0; y2 < y; y2++) { - level->setTileAndDataNoUpdate(xp, y2, zp, Tile::calmWater_Id, 8); + level->setTileAndData(xp, y2, zp, Tile::calmWater_Id, 8, Tile::UPDATE_CLIENTS); } } } @@ -516,6 +519,7 @@ void CustomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) mineShaftFeature->postProcess(level, pprandom, xt, zt); hasVillage = villageFeature->postProcess(level, pprandom, xt, zt); strongholdFeature->postProcess(level, pprandom, xt, zt); + scatteredFeature->postProcess(level, random, xt, zt); } PIXEndNamedEvent(); @@ -581,11 +585,11 @@ void CustomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) if (level->shouldFreezeIgnoreNeighbors(x + xo, y - 1, z + zo)) { - level->setTileNoUpdate(x + xo, y - 1, z + zo, Tile::ice_Id); // 4J - changed from setTile, otherwise we end up creating a *lot* of dynamic water tiles as these ice tiles are set + level->setTileAndData(x + xo, y - 1, z + zo, Tile::ice_Id,0, Tile::UPDATE_INVISIBLE); // 4J - changed from setTile, otherwise we end up creating a *lot* of dynamic water tiles as these ice tiles are set } if (level->shouldSnow(x + xo, y, z + zo)) { - level->setTile(x + xo, y, z + zo, Tile::topSnow_Id); + level->setTileAndData(x + xo, y, z + zo, Tile::topSnow_Id,0, Tile::UPDATE_CLIENTS); } } } @@ -622,6 +626,10 @@ vector *CustomLevelSource::getMobsAt(MobCategory *mobCa { return NULL; } + if (mobCategory == MobCategory::monster && scatteredFeature->isSwamphut(x, y, z)) + { + return scatteredFeature->getSwamphutEnemies(); + } return biome->getMobs(mobCategory); #else return NULL; @@ -638,3 +646,16 @@ TilePos *CustomLevelSource::findNearestMapFeature(Level *level, const wstring& f #endif return NULL; } + +void CustomLevelSource::recreateLogicStructuresForChunk(int chunkX, int chunkZ) +{ + if (generateStructures) + { +#ifdef _OVERRIDE_HEIGHTMAP + mineShaftFeature->apply(this, level, chunkX, chunkZ, NULL); + villageFeature->apply(this, level, chunkX, chunkZ, NULL); + strongholdFeature->apply(this, level, chunkX, chunkZ, NULL); + scatteredFeature->apply(this, level, chunkX, chunkZ, NULL); +#endif + } +} \ No newline at end of file diff --git a/Minecraft.World/CustomLevelSource.h b/Minecraft.World/CustomLevelSource.h index af01a478..7739fc95 100644 --- a/Minecraft.World/CustomLevelSource.h +++ b/Minecraft.World/CustomLevelSource.h @@ -12,6 +12,7 @@ class LargeFeature; class StrongholdFeature; class VillageFeature; class MineShaftFeature; +class RandomScatteredLargeFeature; class CustomLevelSource : public ChunkSource { @@ -32,6 +33,7 @@ private: StrongholdFeature *strongholdFeature; VillageFeature *villageFeature; MineShaftFeature *mineShaftFeature; + RandomScatteredLargeFeature *scatteredFeature; LargeFeature *canyonFeature; Level *level; #endif @@ -76,4 +78,5 @@ public: public: virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z); virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ); }; diff --git a/Minecraft.World/DamageEnchantment.cpp b/Minecraft.World/DamageEnchantment.cpp index 686abc62..ce5a7c1f 100644 --- a/Minecraft.World/DamageEnchantment.cpp +++ b/Minecraft.World/DamageEnchantment.cpp @@ -27,19 +27,19 @@ int DamageEnchantment::getMaxLevel() return 5; } -int DamageEnchantment::getDamageBonus(int level, shared_ptr target) +float DamageEnchantment::getDamageBonus(int level, shared_ptr target) { if (type == ALL) { - return Mth::floor(level * 2.75f); + return level *1.25f; } if (type == UNDEAD && target->getMobType() == UNDEAD) { - return Mth::floor(level * 4.5f); + return level * 2.5f; } if (type == ARTHROPODS && target->getMobType() == ARTHROPOD) { - return Mth::floor(level * 4.5f); + return level * 2.5f; } return 0; } diff --git a/Minecraft.World/DamageEnchantment.h b/Minecraft.World/DamageEnchantment.h index 00f9b047..a6abffdc 100644 --- a/Minecraft.World/DamageEnchantment.h +++ b/Minecraft.World/DamageEnchantment.h @@ -23,7 +23,7 @@ public: virtual int getMinCost(int level); virtual int getMaxCost(int level); virtual int getMaxLevel(); - virtual int getDamageBonus(int level, shared_ptr target); + virtual float getDamageBonus(int level, shared_ptr target); virtual int getDescriptionId(); virtual bool isCompatibleWith(Enchantment *other) const; virtual bool canEnchant(shared_ptr item); diff --git a/Minecraft.World/DamageSource.cpp b/Minecraft.World/DamageSource.cpp index 29ea727e..1ed1c65f 100644 --- a/Minecraft.World/DamageSource.cpp +++ b/Minecraft.World/DamageSource.cpp @@ -2,65 +2,76 @@ #include "net.minecraft.world.entity.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.entity.projectile.h" +#include "net.minecraft.world.level.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.world.food.h" #include "net.minecraft.network.packet.h" -DamageSource *DamageSource::inFire = (new DamageSource(ChatPacket::e_ChatDeathInFire))->setIsFire(); -DamageSource *DamageSource::onFire = (new DamageSource(ChatPacket::e_ChatDeathOnFire))->bypassArmor()->setIsFire(); -DamageSource *DamageSource::lava = (new DamageSource(ChatPacket::e_ChatDeathLava))->setIsFire(); +DamageSource *DamageSource::inFire = (new DamageSource(ChatPacket::e_ChatDeathInFire, ChatPacket::e_ChatDeathInFirePlayer))->setIsFire(); +DamageSource *DamageSource::onFire = (new DamageSource(ChatPacket::e_ChatDeathOnFire, ChatPacket::e_ChatDeathOnFirePlayer))->bypassArmor()->setIsFire(); +DamageSource *DamageSource::lava = (new DamageSource(ChatPacket::e_ChatDeathLava, ChatPacket::e_ChatDeathLavaPlayer))->setIsFire(); DamageSource *DamageSource::inWall = (new DamageSource(ChatPacket::e_ChatDeathInWall))->bypassArmor(); -DamageSource *DamageSource::drown = (new DamageSource(ChatPacket::e_ChatDeathDrown))->bypassArmor(); +DamageSource *DamageSource::drown = (new DamageSource(ChatPacket::e_ChatDeathDrown, ChatPacket::e_ChatDeathDrownPlayer))->bypassArmor(); DamageSource *DamageSource::starve = (new DamageSource(ChatPacket::e_ChatDeathStarve))->bypassArmor(); -DamageSource *DamageSource::cactus = new DamageSource(ChatPacket::e_ChatDeathCactus); +DamageSource *DamageSource::cactus = new DamageSource(ChatPacket::e_ChatDeathCactus, ChatPacket::e_ChatDeathCactusPlayer); DamageSource *DamageSource::fall = (new DamageSource(ChatPacket::e_ChatDeathFall))->bypassArmor(); DamageSource *DamageSource::outOfWorld = (new DamageSource(ChatPacket::e_ChatDeathOutOfWorld))->bypassArmor()->bypassInvul(); DamageSource *DamageSource::genericSource = (new DamageSource(ChatPacket::e_ChatDeathGeneric))->bypassArmor(); -DamageSource *DamageSource::explosion = (new DamageSource(ChatPacket::e_ChatDeathExplosion))->setScalesWithDifficulty(); -DamageSource *DamageSource::controlledExplosion = (new DamageSource(ChatPacket::e_ChatDeathExplosion)); DamageSource *DamageSource::magic = (new DamageSource(ChatPacket::e_ChatDeathMagic))->bypassArmor()->setMagic(); DamageSource *DamageSource::dragonbreath = (new DamageSource(ChatPacket::e_ChatDeathDragonBreath))->bypassArmor(); DamageSource *DamageSource::wither = (new DamageSource(ChatPacket::e_ChatDeathWither))->bypassArmor(); DamageSource *DamageSource::anvil = (new DamageSource(ChatPacket::e_ChatDeathAnvil)); DamageSource *DamageSource::fallingBlock = (new DamageSource(ChatPacket::e_ChatDeathFallingBlock)); -DamageSource *DamageSource::mobAttack(shared_ptr mob) +DamageSource *DamageSource::mobAttack(shared_ptr mob) { - return new EntityDamageSource(ChatPacket::e_ChatDeathMob, mob); + return new EntityDamageSource(ChatPacket::e_ChatDeathMob, ChatPacket::e_ChatDeathMob, mob); } DamageSource *DamageSource::playerAttack(shared_ptr player) { - return new EntityDamageSource(ChatPacket::e_ChatDeathPlayer, player); + return new EntityDamageSource(ChatPacket::e_ChatDeathPlayer, ChatPacket::e_ChatDeathPlayerItem, player); } DamageSource *DamageSource::arrow(shared_ptr arrow, shared_ptr owner) { - return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathArrow, arrow, owner))->setProjectile(); + return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathArrow, ChatPacket::e_ChatDeathArrowItem, arrow, owner))->setProjectile(); } DamageSource *DamageSource::fireball(shared_ptr fireball, shared_ptr owner) { if (owner == NULL) { - return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathOnFire, fireball, fireball))->setIsFire()->setProjectile(); + return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathOnFire, ChatPacket::e_ChatDeathOnFire, fireball, fireball))->setIsFire()->setProjectile(); } - return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathFireball, fireball, owner))->setIsFire()->setProjectile(); + return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathFireball, ChatPacket::e_ChatDeathArrowItem, fireball, owner))->setIsFire()->setProjectile(); } DamageSource *DamageSource::thrown(shared_ptr entity, shared_ptr owner) { - return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathThrown, entity, owner))->setProjectile(); + return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathThrown, ChatPacket::e_ChatDeathThrownItem, entity, owner))->setProjectile(); } DamageSource *DamageSource::indirectMagic(shared_ptr entity, shared_ptr owner) { - return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathIndirectMagic, entity, owner) )->bypassArmor()->setMagic();; + return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathIndirectMagic, ChatPacket::e_ChatDeathIndirectMagicItem, entity, owner) )->bypassArmor()->setMagic();; } DamageSource *DamageSource::thorns(shared_ptr source) { - return (new EntityDamageSource(ChatPacket::e_ChatDeathThorns, source))->setMagic(); + return (new EntityDamageSource(ChatPacket::e_ChatDeathThorns, ChatPacket::e_ChatDeathThorns, source))->setMagic(); +} + +DamageSource *DamageSource::explosion(Explosion *explosion) +{ + if ( (explosion != NULL) && (explosion->getSourceMob() != NULL) ) + { + return (new EntityDamageSource(ChatPacket::e_ChatDeathExplosionPlayer, ChatPacket::e_ChatDeathExplosionPlayer, explosion->getSourceMob()))->setScalesWithDifficulty()->setExplosion(); + } + else + { + return (new DamageSource(ChatPacket::e_ChatDeathExplosion))->setScalesWithDifficulty()->setExplosion(); + } } bool DamageSource::isProjectile() @@ -70,7 +81,18 @@ bool DamageSource::isProjectile() DamageSource *DamageSource::setProjectile() { - this->_isProjectile = true; + _isProjectile = true; + return this; +} + +bool DamageSource::isExplosion() +{ + return _isExplosion; +} + +DamageSource *DamageSource::setExplosion() +{ + _isExplosion = true; return this; } @@ -91,7 +113,7 @@ bool DamageSource::isBypassInvul() //DamageSource::DamageSource(const wstring &msgId) -DamageSource::DamageSource(ChatPacket::EChatPacketMessage msgId) +DamageSource::DamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId) { // 4J added initialisors _bypassArmor = false; @@ -101,9 +123,11 @@ DamageSource::DamageSource(ChatPacket::EChatPacketMessage msgId) isFireSource = false; _isProjectile = false; _isMagic = false; + _isExplosion = false; //this->msgId = msgId; m_msgId = msgId; + m_msgWithItemId = msgWithItemId; } shared_ptr DamageSource::getDirectEntity() @@ -164,9 +188,17 @@ DamageSource *DamageSource::setMagic() // //return I18n.get(L"death." + msgId, player.name); //} -shared_ptr DamageSource::getDeathMessagePacket(shared_ptr player) +shared_ptr DamageSource::getDeathMessagePacket(shared_ptr player) { - return shared_ptr( new ChatPacket(player->name, m_msgId ) ); + shared_ptr source = player->getKillCredit(); + if(source != NULL) + { + return shared_ptr( new ChatPacket(player->getNetworkName(), m_msgWithItemId != ChatPacket::e_ChatCustom ? m_msgWithItemId : m_msgId, source->GetType(), source->getNetworkName() ) ); + } + else + { + return shared_ptr( new ChatPacket(player->getNetworkName(), m_msgId ) ); + } } bool DamageSource::isFire() @@ -177,4 +209,16 @@ bool DamageSource::isFire() ChatPacket::EChatPacketMessage DamageSource::getMsgId() { return m_msgId; +} + +// 4J: Very limited check for equality (used to detect fall damage, etc) +bool DamageSource::equals(DamageSource *source) +{ + return m_msgId == source->m_msgId && m_msgWithItemId == source->m_msgWithItemId; +} + +// 4J: Copy function +DamageSource *DamageSource::copy() +{ + return new DamageSource(*this); } \ No newline at end of file diff --git a/Minecraft.World/DamageSource.h b/Minecraft.World/DamageSource.h index 2e1d249d..1173db4d 100644 --- a/Minecraft.World/DamageSource.h +++ b/Minecraft.World/DamageSource.h @@ -1,11 +1,12 @@ #pragma once using namespace std; -class Mob; +class LivingEntity; class Entity; class Arrow; class Fireball; class Player; +class Explosion; #include "ChatPacket.h" @@ -22,22 +23,20 @@ public: static DamageSource *fall; static DamageSource *outOfWorld; static DamageSource *genericSource; - static DamageSource *explosion; - static DamageSource *controlledExplosion; static DamageSource *magic; static DamageSource *dragonbreath; static DamageSource *wither; static DamageSource *anvil; static DamageSource *fallingBlock; - static DamageSource *mobAttack(shared_ptr mob); + static DamageSource *mobAttack(shared_ptr mob); static DamageSource *playerAttack(shared_ptr player); static DamageSource *arrow(shared_ptr arrow, shared_ptr owner); static DamageSource *fireball(shared_ptr fireball, shared_ptr owner); static DamageSource *thrown(shared_ptr entity, shared_ptr owner); static DamageSource *indirectMagic(shared_ptr entity, shared_ptr owner); static DamageSource *thorns(shared_ptr source); - + static DamageSource *explosion(Explosion *explosion); private: bool _bypassArmor; bool _bypassInvul; @@ -47,10 +46,13 @@ private: bool _isProjectile; bool _scalesWithDifficulty; bool _isMagic; + bool _isExplosion; public: bool isProjectile(); DamageSource *setProjectile(); + bool isExplosion(); + DamageSource *setExplosion(); bool isBypassArmor(); float getFoodExhaustion(); @@ -58,10 +60,11 @@ public: //wstring msgId; ChatPacket::EChatPacketMessage m_msgId; // 4J Made int so we can localise + ChatPacket::EChatPacketMessage m_msgWithItemId; // 4J: Renamed from m_msgWithSourceId (it was already renamed in places, just made consistent) protected: //DamageSource(const wstring &msgId); - DamageSource(ChatPacket::EChatPacketMessage msgId); + DamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId = ChatPacket::e_ChatCustom); public: virtual ~DamageSource() {} @@ -83,8 +86,12 @@ public: // 4J Stu - Made return a packet //virtual wstring getLocalizedDeathMessage(shared_ptr player); - virtual shared_ptr getDeathMessagePacket(shared_ptr player); + virtual shared_ptr getDeathMessagePacket(shared_ptr player); bool isFire(); ChatPacket::EChatPacketMessage getMsgId(); // 4J Stu - Used to return String + + // 4J Added + bool equals(DamageSource *source); + virtual DamageSource *copy(); }; \ No newline at end of file diff --git a/Minecraft.World/DataInputStream.cpp b/Minecraft.World/DataInputStream.cpp index 2291bf48..97721c94 100644 --- a/Minecraft.World/DataInputStream.cpp +++ b/Minecraft.World/DataInputStream.cpp @@ -257,6 +257,13 @@ short DataInputStream::readShort() return (short)((a << 8) | (b & 0xff)); } +unsigned short DataInputStream::readUnsignedShort() +{ + int a = stream->read(); + int b = stream->read(); + return (unsigned short)((a << 8) | (b & 0xff)); +} + //Reads in a string that has been encoded using a modified UTF-8 format. The general contract of readUTF is that it reads a representation //of a Unicode character string encoded in modified UTF-8 format; this string of characters is then returned as a String. //First, two bytes are read and used to construct an unsigned 16-bit integer in exactly the manner of the readUnsignedShort method . diff --git a/Minecraft.World/DataInputStream.h b/Minecraft.World/DataInputStream.h index f69d490a..0b228a0d 100644 --- a/Minecraft.World/DataInputStream.h +++ b/Minecraft.World/DataInputStream.h @@ -18,6 +18,7 @@ public: virtual bool readBoolean(); virtual byte readByte(); virtual unsigned char readUnsignedByte(); + virtual unsigned short readUnsignedShort(); virtual wchar_t readChar(); virtual bool readFully(byteArray b); virtual bool readFully(charArray b); diff --git a/Minecraft.World/DataOutputStream.cpp b/Minecraft.World/DataOutputStream.cpp index 8e277c23..8d350f0b 100644 --- a/Minecraft.World/DataOutputStream.cpp +++ b/Minecraft.World/DataOutputStream.cpp @@ -142,6 +142,14 @@ void DataOutputStream::writeShort(short a) written += 2; } +void DataOutputStream::writeUnsignedShort(unsigned short a) +{ + stream->write( (a >> 8) & 0xff ); + stream->write( a & 0xff ); + // TODO 4J Stu - Error handling? + written += 2; +} + //Writes a char to the underlying output stream as a 2-byte value, high byte first. //If no exception is thrown, the counter written is incremented by 2. //Parameters: diff --git a/Minecraft.World/DataOutputStream.h b/Minecraft.World/DataOutputStream.h index 01be8309..8a8c0e12 100644 --- a/Minecraft.World/DataOutputStream.h +++ b/Minecraft.World/DataOutputStream.h @@ -28,6 +28,7 @@ public: virtual void writeInt(int a); virtual void writeLong(__int64 a); virtual void writeShort(short a); + virtual void writeUnsignedShort(unsigned short a); virtual void writeChar(wchar_t a); virtual void writeChars(const wstring& a); virtual void writeBoolean(bool b); diff --git a/Minecraft.World/DaylightDetectorTile.cpp b/Minecraft.World/DaylightDetectorTile.cpp new file mode 100644 index 00000000..1bc9943e --- /dev/null +++ b/Minecraft.World/DaylightDetectorTile.cpp @@ -0,0 +1,114 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "net.minecraft.world.level.dimension.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.h" +#include "JavaMath.h" +#include "DaylightDetectorTile.h" + +DaylightDetectorTile::DaylightDetectorTile(int id) : BaseEntityTile(id, Material::wood, isSolidRender() ) +{ + updateDefaultShape(); +} + +void DaylightDetectorTile::updateDefaultShape() +{ + setShape(0, 0, 0, 1, 6.0f / 16.0f, 1); +} + +void DaylightDetectorTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) +{ + setShape(0, 0, 0, 1, 6.0f / 16.0f, 1); +} + +int DaylightDetectorTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +{ + return level->getData(x, y, z); +} + +void DaylightDetectorTile::tick(Level *level, int x, int y, int z, Random *random) +{ + // updateSignalStrength(level, x, y, z); +} + +void DaylightDetectorTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + // level.addToTickNextTick(x, y, z, id, getTickDelay()); +} + +void DaylightDetectorTile::onPlace(Level *level, int x, int y, int z) +{ + // level.addToTickNextTick(x, y, z, id, getTickDelay()); +} + +void DaylightDetectorTile::updateSignalStrength(Level *level, int x, int y, int z) +{ + if (level->dimension->hasCeiling) return; + + int current = level->getData(x, y, z); + int target = level->getBrightness(LightLayer::Sky, x, y, z) - level->skyDarken; + float sunAngle = level->getSunAngle(1); + + // tilt sunAngle towards zenith (to make the transition to night + // smoother) + if (sunAngle < PI) + { + sunAngle = sunAngle + (0 - sunAngle) * .2f; + } + else + { + sunAngle = sunAngle + (PI * 2.0f - sunAngle) * .2f; + } + + target = Math::round((float) target * Mth::cos(sunAngle)); + if (target < 0) + { + target = 0; + } + if (target > Redstone::SIGNAL_MAX) + { + target = Redstone::SIGNAL_MAX; + } + + if (current != target) + { + level->setData(x, y, z, target, UPDATE_ALL); + } +} + +bool DaylightDetectorTile::isCubeShaped() +{ + return false; +} + +bool DaylightDetectorTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +bool DaylightDetectorTile::isSignalSource() +{ + return true; +} + +shared_ptr DaylightDetectorTile::newTileEntity(Level *level) +{ + return shared_ptr( new DaylightDetectorTileEntity() ); +} + +Icon *DaylightDetectorTile::getTexture(int face, int data) +{ + if (face == Facing::UP) + { + return icons[0]; + } + return icons[1]; +} + +void DaylightDetectorTile::registerIcons(IconRegister *iconRegister) +{ + icons[0] = iconRegister->registerIcon(getIconName() + L"_top"); + icons[1] = iconRegister->registerIcon(getIconName() + L"_side"); +} \ No newline at end of file diff --git a/Minecraft.World/DaylightDetectorTile.h b/Minecraft.World/DaylightDetectorTile.h new file mode 100644 index 00000000..635504d2 --- /dev/null +++ b/Minecraft.World/DaylightDetectorTile.h @@ -0,0 +1,27 @@ +#pragma once + +#include "BaseEntityTile.h" + +class DaylightDetectorTile : public BaseEntityTile +{ + friend class ChunkRebuildData; +private: + Icon *icons[2]; + +public: + DaylightDetectorTile(int id); + + virtual void updateDefaultShape(); // 4J Added override + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void updateSignalStrength(Level *level, int x, int y, int z); + virtual bool isCubeShaped(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isSignalSource(); + virtual shared_ptr newTileEntity(Level *level); + virtual Icon *getTexture(int face, int data); + virtual void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/DaylightDetectorTileEntity.cpp b/Minecraft.World/DaylightDetectorTileEntity.cpp new file mode 100644 index 00000000..5a329413 --- /dev/null +++ b/Minecraft.World/DaylightDetectorTileEntity.cpp @@ -0,0 +1,29 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "DaylightDetectorTileEntity.h" + +DaylightDetectorTileEntity::DaylightDetectorTileEntity() +{ +} + +void DaylightDetectorTileEntity::tick() +{ + if (level != NULL && !level->isClientSide && (level->getGameTime() % SharedConstants::TICKS_PER_SECOND) == 0) + { + tile = getTile(); + if (tile != NULL && dynamic_cast(tile) != NULL) + { + ((DaylightDetectorTile *) tile)->updateSignalStrength(level, x, y, z); + } + } +} + +// 4J Added +shared_ptr DaylightDetectorTileEntity::clone() +{ + shared_ptr result = shared_ptr( new DaylightDetectorTileEntity() ); + TileEntity::clone(result); + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/DaylightDetectorTileEntity.h b/Minecraft.World/DaylightDetectorTileEntity.h new file mode 100644 index 00000000..b4036f8e --- /dev/null +++ b/Minecraft.World/DaylightDetectorTileEntity.h @@ -0,0 +1,16 @@ +#pragma once + +class DaylightDetectorTileEntity : public TileEntity +{ +public: + eINSTANCEOF GetType() { return eTYPE_DAYLIGHTDETECTORTILEENTITY; } + static TileEntity *create() { return new DaylightDetectorTileEntity(); } + + // 4J Added + virtual shared_ptr clone(); + +public: + DaylightDetectorTileEntity(); + + void tick(); +}; \ No newline at end of file diff --git a/Minecraft.World/DeadBushFeature.cpp b/Minecraft.World/DeadBushFeature.cpp index e27a36c6..23bdd488 100644 --- a/Minecraft.World/DeadBushFeature.cpp +++ b/Minecraft.World/DeadBushFeature.cpp @@ -10,24 +10,24 @@ DeadBushFeature::DeadBushFeature(int tile) bool DeadBushFeature::place(Level *level, Random *random, int x, int y, int z) { - int t = 0; - while (((t = level->getTile(x, y, z)) == 0 || t == Tile::leaves_Id) && y > 0) - y--; + int t = 0; + while (((t = level->getTile(x, y, z)) == 0 || t == Tile::leaves_Id) && y > 0) + y--; - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y + random->nextInt(4) - random->nextInt(4); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (level->isEmptyTile(x2, y2, z2) ) + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y + random->nextInt(4) - random->nextInt(4); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (level->isEmptyTile(x2, y2, z2) ) { - if (Tile::tiles[tile]->canSurvive(level, x2, y2, z2)) + if (Tile::tiles[tile]->canSurvive(level, x2, y2, z2)) { - level->setTileNoUpdate(x2, y2, z2, tile); - } - } - } + level->setTileAndData(x2, y2, z2, tile, 0, Tile::UPDATE_CLIENTS); + } + } + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/DefaultDispenseItemBehavior.cpp b/Minecraft.World/DefaultDispenseItemBehavior.cpp new file mode 100644 index 00000000..8fd13282 --- /dev/null +++ b/Minecraft.World/DefaultDispenseItemBehavior.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "net.minecraft.core.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.item.h" +#include "DefaultDispenseItemBehavior.h" + +shared_ptr DefaultDispenseItemBehavior::dispense(BlockSource *source, shared_ptr dispensed) +{ + eOUTCOME outcome = DISPENCED_ITEM; + shared_ptr result = execute(source, dispensed, outcome); + + playSound(source, outcome); + playAnimation(source, DispenserTile::getFacing(source->getData()), outcome); + + return result; +} + +shared_ptr DefaultDispenseItemBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Position *position = DispenserTile::getDispensePosition(source); + + shared_ptr itemInstance = dispensed->remove(1); + + spawnItem(source->getWorld(), itemInstance, 6, facing, position); + + delete position; + + outcome = DISPENCED_ITEM; + return dispensed; +} + +void DefaultDispenseItemBehavior::spawnItem(Level *world, shared_ptr item, int accuracy, FacingEnum *facing, Position *position) +{ + double spawnX = position->getX(); + double spawnY = position->getY(); + double spawnZ = position->getZ(); + + shared_ptr itemEntity = shared_ptr(new ItemEntity(world, spawnX, spawnY - 0.3, spawnZ, item)); + + double pow = world->random->nextDouble() * 0.1 + 0.2; + itemEntity->xd = facing->getStepX() * pow; + itemEntity->yd = .2f; + itemEntity->zd = facing->getStepZ() * pow; + + itemEntity->xd += world->random->nextGaussian() * 0.0075f * accuracy; + itemEntity->yd += world->random->nextGaussian() * 0.0075f * accuracy; + itemEntity->zd += world->random->nextGaussian() * 0.0075f * accuracy; + + world->addEntity(itemEntity); +} + +void DefaultDispenseItemBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + if (outcome != LEFT_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } + else + { + // some negative sound effect? + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK_FAIL, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } +} + +void DefaultDispenseItemBehavior::playAnimation(BlockSource *source, FacingEnum *facing, eOUTCOME outcome) +{ + if (outcome != LEFT_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::PARTICLES_SHOOT, source->getBlockX(), source->getBlockY(), source->getBlockZ(), getLevelEventDataFrom(facing)); + } + else + { + } +} + +int DefaultDispenseItemBehavior::getLevelEventDataFrom(FacingEnum *facing) +{ + return facing->getStepX() + 1 + (facing->getStepZ() + 1) * 3; +} \ No newline at end of file diff --git a/Minecraft.World/DefaultDispenseItemBehavior.h b/Minecraft.World/DefaultDispenseItemBehavior.h new file mode 100644 index 00000000..a680f2a4 --- /dev/null +++ b/Minecraft.World/DefaultDispenseItemBehavior.h @@ -0,0 +1,40 @@ +#pragma once +#include "DispenseItemBehavior.h" + +class FacingEnum; +class Position; + +class DefaultDispenseItemBehavior : public DispenseItemBehavior +{ +protected: + enum eOUTCOME + { + // Item has special behaviour that was executed successfully. + ACTIVATED_ITEM = 0, + + // Item was dispenced onto the ground as a pickup. + DISPENCED_ITEM = 1, + + // Execution failed, the item was left unaffected. + LEFT_ITEM = 2, + }; + +public: + DefaultDispenseItemBehavior() {}; + virtual ~DefaultDispenseItemBehavior() {}; + virtual shared_ptr dispense(BlockSource *source, shared_ptr dispensed); + +protected: + // 4J-JEV: Added value used to play FAILED sound effect upon reaching spawn limits. + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); + +public: + static void spawnItem(Level *world, shared_ptr item, int accuracy, FacingEnum *facing, Position *position); + +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); + virtual void playAnimation(BlockSource *source, FacingEnum *facing, eOUTCOME outcome); + +private: + virtual int getLevelEventDataFrom(FacingEnum *facing); +}; \ No newline at end of file diff --git a/Minecraft.World/DefaultGameModeCommand.cpp b/Minecraft.World/DefaultGameModeCommand.cpp index 529733f7..b0a58176 100644 --- a/Minecraft.World/DefaultGameModeCommand.cpp +++ b/Minecraft.World/DefaultGameModeCommand.cpp @@ -9,18 +9,27 @@ EGameCommand DefaultGameModeCommand::getId() void DefaultGameModeCommand::execute(shared_ptr source, byteArray commandData) { - //if (args.length > 0) - //{ + //if (args.length > 0) { // GameType newMode = getModeForString(source, args[0]); // doSetGameType(newMode); - // String modeName = I18n.get("gameMode." + newMode.getName()); - // logAdminAction(source, "commands.defaultgamemode.success", modeName); + // logAdminAction(source, "commands.defaultgamemode.success", ChatMessageComponent.forTranslation("gameMode." + newMode.getName())); + // return; //} + + //throw new UsageException("commands.defaultgamemode.usage"); } void DefaultGameModeCommand::doSetGameType(GameType *newGameType) { - //MinecraftServer::getInstance()->setDefaultGameMode(newGameType); + //MinecraftServer minecraftServer = MinecraftServer.getInstance(); + //minecraftServer.setDefaultGameMode(newGameType); + + //if (minecraftServer.getForceGameType()) { + // for (ServerPlayer player : MinecraftServer.getInstance().getPlayers().players) { + // player.setGameMode(newGameType); + // player.fallDistance = 0; // reset falldistance so flying people do not die :P + // } + //} } \ No newline at end of file diff --git a/Minecraft.World/DefendVillageTargetGoal.cpp b/Minecraft.World/DefendVillageTargetGoal.cpp index ad6b3fd8..6ed6af53 100644 --- a/Minecraft.World/DefendVillageTargetGoal.cpp +++ b/Minecraft.World/DefendVillageTargetGoal.cpp @@ -3,7 +3,7 @@ #include "net.minecraft.world.entity.animal.h" #include "DefendVillageTargetGoal.h" -DefendVillageTargetGoal::DefendVillageTargetGoal(VillagerGolem *golem) : TargetGoal(golem, 16, false, true) +DefendVillageTargetGoal::DefendVillageTargetGoal(VillagerGolem *golem) : TargetGoal(golem, false, true) { this->golem = golem; setRequiredControlFlags(TargetGoal::TargetFlag); @@ -13,8 +13,22 @@ bool DefendVillageTargetGoal::canUse() { shared_ptr village = golem->getVillage(); if (village == NULL) return false; - potentialTarget = weak_ptr(village->getClosestAggressor(dynamic_pointer_cast(golem->shared_from_this()))); - return canAttack(potentialTarget.lock(), false); + potentialTarget = weak_ptr(village->getClosestAggressor(dynamic_pointer_cast(golem->shared_from_this()))); + shared_ptr potTarget = potentialTarget.lock(); + if (!canAttack(potTarget, false)) + { + // look for bad players + if (mob->getRandom()->nextInt(20) == 0) + { + potentialTarget = village->getClosestBadStandingPlayer(dynamic_pointer_cast(golem->shared_from_this() )); + return canAttack(potTarget, false); + } + return false; + } + else + { + return true; + } } void DefendVillageTargetGoal::start() diff --git a/Minecraft.World/DefendVillageTargetGoal.h b/Minecraft.World/DefendVillageTargetGoal.h index d74d95b0..9956ae0a 100644 --- a/Minecraft.World/DefendVillageTargetGoal.h +++ b/Minecraft.World/DefendVillageTargetGoal.h @@ -8,7 +8,7 @@ class DefendVillageTargetGoal : public TargetGoal { private: VillagerGolem *golem; // Owner of this goal - weak_ptr potentialTarget; + weak_ptr potentialTarget; public: DefendVillageTargetGoal(VillagerGolem *golem); diff --git a/Minecraft.World/DelayedRelease.cpp b/Minecraft.World/DelayedRelease.cpp index ebd0398f..ce8e1188 100644 --- a/Minecraft.World/DelayedRelease.cpp +++ b/Minecraft.World/DelayedRelease.cpp @@ -27,7 +27,7 @@ void DelayedRelease::tick() } } -bool DelayedRelease::hurt(DamageSource *source, int damage) +bool DelayedRelease::hurt(DamageSource *source, float damage) { return false; } diff --git a/Minecraft.World/DelayedRelease.h b/Minecraft.World/DelayedRelease.h index aaccc843..babef9cf 100644 --- a/Minecraft.World/DelayedRelease.h +++ b/Minecraft.World/DelayedRelease.h @@ -21,7 +21,7 @@ protected: public: virtual void tick(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); protected: virtual void defineSynchedData(); diff --git a/Minecraft.World/DerivedLevelData.cpp b/Minecraft.World/DerivedLevelData.cpp index 71c4d87b..198b8c76 100644 --- a/Minecraft.World/DerivedLevelData.cpp +++ b/Minecraft.World/DerivedLevelData.cpp @@ -43,9 +43,14 @@ int DerivedLevelData::getZSpawn() return wrapped->getZSpawn(); } -__int64 DerivedLevelData::getTime() +__int64 DerivedLevelData::getGameTime() { - return wrapped->getTime(); + return wrapped->getGameTime(); +} + +__int64 DerivedLevelData::getDayTime() +{ + return wrapped->getDayTime(); } __int64 DerivedLevelData::getSizeOnDisk() @@ -114,7 +119,11 @@ void DerivedLevelData::setZSpawn(int zSpawn) { } -void DerivedLevelData::setTime(__int64 time) +void DerivedLevelData::setGameTime(__int64 time) +{ +} + +void DerivedLevelData::setDayTime(__int64 time) { } @@ -198,6 +207,11 @@ void DerivedLevelData::setInitialized(bool initialized) { } +GameRules *DerivedLevelData::getGameRules() +{ + return wrapped->getGameRules(); +} + int DerivedLevelData::getXZSize() { return wrapped->getXZSize(); diff --git a/Minecraft.World/DerivedLevelData.h b/Minecraft.World/DerivedLevelData.h index a39f7d04..ad612cc9 100644 --- a/Minecraft.World/DerivedLevelData.h +++ b/Minecraft.World/DerivedLevelData.h @@ -2,6 +2,8 @@ #include "LevelData.h" +class GameRules; + class DerivedLevelData : public LevelData { private: @@ -20,7 +22,8 @@ public: int getXSpawn(); int getYSpawn(); int getZSpawn(); - __int64 getTime(); + __int64 getGameTime(); + __int64 getDayTime(); __int64 getSizeOnDisk(); CompoundTag *getLoadedPlayerTag(); wstring getLevelName(); @@ -35,7 +38,8 @@ public: void setXSpawn(int xSpawn); void setYSpawn(int ySpawn); void setZSpawn(int zSpawn); - void setTime(__int64 time); + void setGameTime(__int64 time); + void setDayTime(__int64 time); void setSizeOnDisk(__int64 sizeOnDisk); void setLoadedPlayerTag(CompoundTag *loadedPlayerTag); void setDimension(int dimension); @@ -55,6 +59,7 @@ public: void setAllowCommands(bool allowCommands); bool isInitialized(); void setInitialized(bool initialized); + GameRules *getGameRules(); int getXZSize(); // 4J Added int getHellScale(); // 4J Addded }; diff --git a/Minecraft.World/DesertBiome.cpp b/Minecraft.World/DesertBiome.cpp index 6928861e..c36b0908 100644 --- a/Minecraft.World/DesertBiome.cpp +++ b/Minecraft.World/DesertBiome.cpp @@ -10,8 +10,8 @@ DesertBiome::DesertBiome(int id) : Biome(id) friendlies.clear(); friendlies_chicken.clear(); // 4J added friendlies_wolf.clear(); // 4J added - this->topMaterial = (BYTE) Tile::sand_Id; - this->material = (BYTE) Tile::sand_Id; + topMaterial = (BYTE) Tile::sand_Id; + material = (BYTE) Tile::sand_Id; decorator->treeCount = -999; decorator->deadBushCount = 2; diff --git a/Minecraft.World/DesertWellFeature.cpp b/Minecraft.World/DesertWellFeature.cpp index c89006bf..62e19bb8 100644 --- a/Minecraft.World/DesertWellFeature.cpp +++ b/Minecraft.World/DesertWellFeature.cpp @@ -33,17 +33,17 @@ bool DesertWellFeature::place(Level *level, Random *random, int x, int y, int z) { for (int oz = -2; oz <= 2; oz++) { - level->setTileNoUpdate(x + ox, y + oy, z + oz, Tile::sandStone_Id); + level->setTileAndData(x + ox, y + oy, z + oz, Tile::sandStone_Id, 0, Tile::UPDATE_CLIENTS); } } } // place water cross - level->setTileNoUpdate(x, y, z, Tile::water_Id); - level->setTileNoUpdate(x - 1, y, z, Tile::water_Id); - level->setTileNoUpdate(x + 1, y, z, Tile::water_Id); - level->setTileNoUpdate(x, y, z - 1, Tile::water_Id); - level->setTileNoUpdate(x, y, z + 1, Tile::water_Id); + level->setTileAndData(x, y, z, Tile::water_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x - 1, y, z, Tile::water_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y, z, Tile::water_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y, z - 1, Tile::water_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y, z + 1, Tile::water_Id, 0, Tile::UPDATE_CLIENTS); // place "fence" for (int ox = -2; ox <= 2; ox++) @@ -52,14 +52,14 @@ bool DesertWellFeature::place(Level *level, Random *random, int x, int y, int z) { if (ox == -2 || ox == 2 || oz == -2 || oz == 2) { - level->setTileNoUpdate(x + ox, y + 1, z + oz, Tile::sandStone_Id); + level->setTileAndData(x + ox, y + 1, z + oz, Tile::sandStone_Id, 0, Tile::UPDATE_CLIENTS); } } } - level->setTileAndDataNoUpdate(x + 2, y + 1, z, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB); - level->setTileAndDataNoUpdate(x - 2, y + 1, z, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB); - level->setTileAndDataNoUpdate(x, y + 1, z + 2, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB); - level->setTileAndDataNoUpdate(x, y + 1, z - 2, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB); + level->setTileAndData(x + 2, y + 1, z, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB, Tile::UPDATE_CLIENTS); + level->setTileAndData(x - 2, y + 1, z, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y + 1, z + 2, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y + 1, z - 2, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB, Tile::UPDATE_CLIENTS); // place roof for (int ox = -1; ox <= 1; ox++) @@ -68,11 +68,11 @@ bool DesertWellFeature::place(Level *level, Random *random, int x, int y, int z) { if (ox == 0 && oz == 0) { - level->setTileNoUpdate(x + ox, y + 4, z + oz, Tile::sandStone_Id); + level->setTileAndData(x + ox, y + 4, z + oz, Tile::sandStone_Id, 0, Tile::UPDATE_CLIENTS); } else { - level->setTileAndDataNoUpdate(x + ox, y + 4, z + oz, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB); + level->setTileAndData(x + ox, y + 4, z + oz, Tile::stoneSlabHalf_Id, StoneSlabTile::SAND_SLAB, Tile::UPDATE_CLIENTS); } } } @@ -80,10 +80,10 @@ bool DesertWellFeature::place(Level *level, Random *random, int x, int y, int z) // place pillars for (int oy = 1; oy <= 3; oy++) { - level->setTileNoUpdate(x - 1, y + oy, z - 1, Tile::sandStone_Id); - level->setTileNoUpdate(x - 1, y + oy, z + 1, Tile::sandStone_Id); - level->setTileNoUpdate(x + 1, y + oy, z - 1, Tile::sandStone_Id); - level->setTileNoUpdate(x + 1, y + oy, z + 1, Tile::sandStone_Id); + level->setTileAndData(x - 1, y + oy, z - 1, Tile::sandStone_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x - 1, y + oy, z + 1, Tile::sandStone_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y + oy, z - 1, Tile::sandStone_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y + oy, z + 1, Tile::sandStone_Id, 0, Tile::UPDATE_CLIENTS); } return true; diff --git a/Minecraft.World/DetectorRailTile.cpp b/Minecraft.World/DetectorRailTile.cpp index e01ec259..16265ceb 100644 --- a/Minecraft.World/DetectorRailTile.cpp +++ b/Minecraft.World/DetectorRailTile.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" +#include "net.minecraft.world.inventory.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.world.entity.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.phys.h" @@ -7,13 +9,13 @@ #include "DetectorRailTile.h" #include "net.minecraft.h" -DetectorRailTile::DetectorRailTile(int id) : RailTile(id, true) +DetectorRailTile::DetectorRailTile(int id) : BaseRailTile(id, true) { setTicking(true); icons = NULL; } -int DetectorRailTile::getTickDelay() +int DetectorRailTile::getTickDelay(Level *level) { return 20; } @@ -25,79 +27,110 @@ bool DetectorRailTile::isSignalSource() void DetectorRailTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { - if (level->isClientSide) + if (level->isClientSide) { - return; - } + return; + } - int data = level->getData(x, y, z); - if ((data & RAIL_DATA_BIT) != 0) + int data = level->getData(x, y, z); + if ((data & RAIL_DATA_BIT) != 0) { - return; - } + return; + } - checkPressed(level, x, y, z, data); + checkPressed(level, x, y, z, data); } void DetectorRailTile::tick(Level *level, int x, int y, int z, Random *random) { - if (level->isClientSide) return; + if (level->isClientSide) return; - int data = level->getData(x, y, z); - if ((data & RAIL_DATA_BIT) == 0) + int data = level->getData(x, y, z); + if ((data & RAIL_DATA_BIT) == 0) { - return; - } + return; + } - checkPressed(level, x, y, z, data); + checkPressed(level, x, y, z, data); } -bool DetectorRailTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +int DetectorRailTile::getSignal(LevelSource *level, int x, int y, int z, int dir) { - return (level->getData(x, y, z) & RAIL_DATA_BIT) != 0; + return (level->getData(x, y, z) & RAIL_DATA_BIT) != 0 ? Redstone::SIGNAL_MAX : Redstone::SIGNAL_NONE; } -bool DetectorRailTile::getDirectSignal(Level *level, int x, int y, int z, int facing) +int DetectorRailTile::getDirectSignal(LevelSource *level, int x, int y, int z, int facing) { - if ((level->getData(x, y, z) & RAIL_DATA_BIT) == 0) return false; - return (facing == Facing::UP); + if ((level->getData(x, y, z) & RAIL_DATA_BIT) == 0) return Redstone::SIGNAL_NONE; + return (facing == Facing::UP) ? Redstone::SIGNAL_MAX : Redstone::SIGNAL_NONE; } void DetectorRailTile::checkPressed(Level *level, int x, int y, int z, int currentData) { - bool wasPressed = (currentData & RAIL_DATA_BIT) != 0; - bool shouldBePressed = false; + bool wasPressed = (currentData & RAIL_DATA_BIT) != 0; + bool shouldBePressed = false; - float b = 2 / 16.0f; + float b = 2 / 16.0f; vector > *entities = level->getEntitiesOfClass(typeid(Minecart), AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 1 - b, z + 1 - b)); - if (!entities->empty()) + if (!entities->empty()) { - shouldBePressed = true; - } + shouldBePressed = true; + } - if (shouldBePressed && !wasPressed) + if (shouldBePressed && !wasPressed) { - level->setData(x, y, z, currentData | RAIL_DATA_BIT); - level->updateNeighborsAt(x, y, z, id); - level->updateNeighborsAt(x, y - 1, z, id); - level->setTilesDirty(x, y, z, x, y, z); - } - if (!shouldBePressed && wasPressed) + level->setData(x, y, z, currentData | RAIL_DATA_BIT, Tile::UPDATE_ALL); + level->updateNeighborsAt(x, y, z, id); + level->updateNeighborsAt(x, y - 1, z, id); + level->setTilesDirty(x, y, z, x, y, z); + } + if (!shouldBePressed && wasPressed) { - level->setData(x, y, z, currentData & RAIL_DIRECTION_MASK); - level->updateNeighborsAt(x, y, z, id); - level->updateNeighborsAt(x, y - 1, z, id); - level->setTilesDirty(x, y, z, x, y, z); - } + level->setData(x, y, z, currentData & RAIL_DIRECTION_MASK, Tile::UPDATE_ALL); + level->updateNeighborsAt(x, y, z, id); + level->updateNeighborsAt(x, y - 1, z, id); + level->setTilesDirty(x, y, z, x, y, z); + } - if (shouldBePressed) + if (shouldBePressed) { - level->addToTickNextTick(x, y, z, id, getTickDelay()); - } + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); + } + + level->updateNeighbourForOutputSignal(x, y, z, id); delete entities; } +void DetectorRailTile::onPlace(Level *level, int x, int y, int z) +{ + BaseRailTile::onPlace(level, x, y, z); + checkPressed(level, x, y, z, level->getData(x, y, z)); +} + +bool DetectorRailTile::hasAnalogOutputSignal() +{ + return true; +} + +int DetectorRailTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + if ((level->getData(x, y, z) & RAIL_DATA_BIT) > 0) + { + float b = 2 / 16.0f; + vector > *entities = level->getEntitiesOfClass(typeid(Minecart), AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 1 - b, z + 1 - b), EntitySelector::CONTAINER_ENTITY_SELECTOR); + + if (entities->size() > 0) + { + shared_ptr out = entities->at(0); + delete entities; + return AbstractContainerMenu::getRedstoneSignalFromContainer(dynamic_pointer_cast(out)); + } + } + + return Redstone::SIGNAL_NONE; +} + void DetectorRailTile::registerIcons(IconRegister *iconRegister) { icons = new Icon*[2]; diff --git a/Minecraft.World/DetectorRailTile.h b/Minecraft.World/DetectorRailTile.h index dd0e6374..4e919912 100644 --- a/Minecraft.World/DetectorRailTile.h +++ b/Minecraft.World/DetectorRailTile.h @@ -1,12 +1,12 @@ #pragma once -#include "RailTile.h" +#include "BaseRailTile.h" class Entity; class Random; class Level; class ChunkRebuildData; -class DetectorRailTile : public RailTile +class DetectorRailTile : public BaseRailTile { friend class ChunkRebuildData; private: @@ -14,12 +14,16 @@ private: public: DetectorRailTile(int id); - virtual int getTickDelay(); + virtual int getTickDelay(Level *level); virtual bool isSignalSource(); virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); - virtual bool getDirectSignal(Level *level, int x, int y, int z, int facing); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int facing); + virtual void onPlace(Level *level, int x, int y, int z); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); + private: virtual void checkPressed(Level *level, int x, int y, int z, int currentData); public: diff --git a/Minecraft.World/DiggerItem.cpp b/Minecraft.World/DiggerItem.cpp index 144b1a11..25310806 100644 --- a/Minecraft.World/DiggerItem.cpp +++ b/Minecraft.World/DiggerItem.cpp @@ -1,10 +1,12 @@ #include "stdafx.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.level.tile.h" #include "DiggerItem.h" -DiggerItem::DiggerItem(int id, int attackDamage, const Tier *tier, TileArray *tiles) : Item( id ), tier( tier ) +DiggerItem::DiggerItem(int id, float attackDamage, const Tier *tier, TileArray *tiles) : Item( id ), tier( tier ) { //this->tier = tier; this->tiles = tiles; @@ -21,24 +23,19 @@ float DiggerItem::getDestroySpeed(shared_ptr itemInstance, Tile *t return 1; } -bool DiggerItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) +bool DiggerItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { - itemInstance->hurt(2, attacker); + itemInstance->hurtAndBreak(2, attacker); return true; } -bool DiggerItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) +bool DiggerItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { // Don't damage tools if the tile can be destroyed in one hit. - if (Tile::tiles[tile]->getDestroySpeed(level, x, y, z) != 0.0) itemInstance->hurt(1, owner); + if (Tile::tiles[tile]->getDestroySpeed(level, x, y, z) != 0.0) itemInstance->hurtAndBreak(1, owner); return true; } -int DiggerItem::getAttackDamage(shared_ptr entity) -{ - return attackDamage; -} - bool DiggerItem::isHandEquipped() { return true; @@ -61,4 +58,13 @@ bool DiggerItem::isValidRepairItem(shared_ptr source, shared_ptrgetId()] = new AttributeModifier(eModifierId_ITEM_BASEDAMAGE, attackDamage, AttributeModifier::OPERATION_ADDITION); + + return result; } \ No newline at end of file diff --git a/Minecraft.World/DiggerItem.h b/Minecraft.World/DiggerItem.h index 4a4eeb07..fd148c2b 100644 --- a/Minecraft.World/DiggerItem.h +++ b/Minecraft.World/DiggerItem.h @@ -11,21 +11,21 @@ private: protected: float speed; private: - int attackDamage; + float attackDamage; protected: const Tier *tier; - DiggerItem(int id, int attackDamage, const Tier *tier, TileArray *tiles); + DiggerItem(int id, float attackDamage, const Tier *tier, TileArray *tiles); public: virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); - virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); - virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); - virtual int getAttackDamage(shared_ptr entity); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); virtual bool isHandEquipped(); virtual int getEnchantmentValue(); const Tier *getTier(); bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); + virtual attrAttrModMap *getDefaultAttributeModifiers(); }; \ No newline at end of file diff --git a/Minecraft.World/Dimension.cpp b/Minecraft.World/Dimension.cpp index 35e66698..697da010 100644 --- a/Minecraft.World/Dimension.cpp +++ b/Minecraft.World/Dimension.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "net.minecraft.world.level.levelgen.flat.h" #include "net.minecraft.world.level.levelgen.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.storage.h" @@ -13,42 +14,47 @@ #include "..\Minecraft.Client\Minecraft.h" #include "..\Minecraft.Client\Common\Colours\ColourTable.h" +const float Dimension::MOON_BRIGHTNESS_PER_PHASE[8] = {1.0f, 0.75f, 0.5f, 0.25f, 0, 0.25f, 0.5f, 0.75f}; + void Dimension::init(Level *level) { - this->level = level; - this->levelType = level->getLevelData()->getGenerator(); - init(); - updateLightRamp(); + this->level = level; + levelType = level->getLevelData()->getGenerator(); + levelTypeOptions = level->getLevelData()->getGeneratorOptions(); + init(); + updateLightRamp(); } void Dimension::updateLightRamp() { - float ambientLight = 0.00f; - for (int i = 0; i <= Level::MAX_BRIGHTNESS; i++) + float ambientLight = 0.00f; + for (int i = 0; i <= Level::MAX_BRIGHTNESS; i++) { - float v = (1 - i / (float) (Level::MAX_BRIGHTNESS)); - brightnessRamp[i] = ((1 - v) / (v * 3 + 1)) * (1 - ambientLight) + ambientLight; - } + float v = (1 - i / (float) (Level::MAX_BRIGHTNESS)); + brightnessRamp[i] = ((1 - v) / (v * 3 + 1)) * (1 - ambientLight) + ambientLight; + } } void Dimension::init() { #ifdef _OVERRIDE_HEIGHTMAP // 4J Stu - Added to enable overriding the heightmap from a loaded in data file - if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getLevelData()->getGenerator() == LevelType::lvl_flat) - { - biomeSource = new FixedBiomeSource(Biome::plains, 0.5f, 0.5f); - } - else - { - biomeSource = new BiomeSource(level); - } + if (level->getLevelData()->getGenerator() == LevelType::lvl_flat) + { + FlatGeneratorInfo *generator = FlatGeneratorInfo::fromValue(level->getLevelData()->getGeneratorOptions()); + biomeSource = new FixedBiomeSource(Biome::biomes[generator->getBiome()], 0.5f, 0.5f); + delete generator; + } + else + { + biomeSource = new BiomeSource(level); + } } Dimension::Dimension() @@ -57,6 +63,7 @@ Dimension::Dimension() hasCeiling = false; brightnessRamp = new float[Level::MAX_BRIGHTNESS + 1]; id = 0; + levelTypeOptions = L""; } Dimension::~Dimension() @@ -71,20 +78,20 @@ ChunkSource *Dimension::createRandomLevelSource() const { #ifdef _OVERRIDE_HEIGHTMAP // 4J Stu - Added to enable overriding the heightmap from a loaded in data file - if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getSeed(), level->getLevelData()->isGenerateMapFeatures()); } else #endif - if (levelType == LevelType::lvl_flat) - { - return new FlatLevelSource(level, level->getSeed(), level->getLevelData()->isGenerateMapFeatures()); - } - else - { - return new RandomLevelSource(level, level->getSeed(), level->getLevelData()->isGenerateMapFeatures()); - } + if (levelType == LevelType::lvl_flat) + { + return new FlatLevelSource(level, level->getSeed(), level->getLevelData()->isGenerateMapFeatures()); + } + else + { + return new RandomLevelSource(level, level->getSeed(), level->getLevelData()->isGenerateMapFeatures()); + } } ChunkSource *Dimension::createFlatLevelSource() const @@ -99,28 +106,28 @@ ChunkStorage *Dimension::createStorage(File dir) bool Dimension::isValidSpawn(int x, int z) const { - int topTile = level->getTopTile(x, z); + int topTile = level->getTopTile(x, z); - if (topTile != Tile::grass_Id) return false; + if (topTile != Tile::grass_Id) return false; - return true; + return true; } float Dimension::getTimeOfDay(__int64 time, float a) const { - int dayStep = (int) (time % Level::TICKS_PER_DAY); - float td = (dayStep + a) / Level::TICKS_PER_DAY - 0.25f; - if (td < 0) td += 1; - if (td > 1) td -= 1; - float tdo = td; - td = 1 - (float) ((cos(td * PI) + 1) / 2); - td = tdo + (td - tdo) / 3.0f; - return td; + int dayStep = (int) (time % Level::TICKS_PER_DAY); + float td = (dayStep + a) / Level::TICKS_PER_DAY - 0.25f; + if (td < 0) td += 1; + if (td > 1) td -= 1; + float tdo = td; + td = 1 - (float) ((cos(td * PI) + 1) / 2); + td = tdo + (td - tdo) / 3.0f; + return td; } -int Dimension::getMoonPhase(__int64 time, float a) const +int Dimension::getMoonPhase(__int64 time) const { - return ((int) (time / Level::TICKS_PER_DAY)) % 8; + return ((int) (time / Level::TICKS_PER_DAY)) % 8; } bool Dimension::isNaturalDimension() @@ -136,42 +143,42 @@ float *Dimension::getSunriseColor(float td, float a) unsigned int clr2 = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Sky_Dawn_Bright ); // 0xFFE533 double r2 = ( (clr2>>16)&0xFF )/255.0f, g2 = ( (clr2>>8)&0xFF )/255.0, b2 = ( clr2&0xFF )/255.0; - float span = 0.4f; - float tt = Mth::cos(td * PI * 2) - 0.0f; - float mid = -0.0f; - if (tt >= mid - span && tt <= mid + span) + float span = 0.4f; + float tt = Mth::cos(td * PI * 2) - 0.0f; + float mid = -0.0f; + if (tt >= mid - span && tt <= mid + span) { - float aa = ((tt - mid) / span) * 0.5f + 0.5f; - float mix = 1 - (((1 - sin(aa * PI))) * 0.99f); - mix = mix * mix; - //sunriseCol[0] = (aa * 0.3f + 0.7f); - //sunriseCol[1] = (aa * aa * 0.7f + 0.2f); - //sunriseCol[2] = (aa * aa * 0.0f + 0.2f); + float aa = ((tt - mid) / span) * 0.5f + 0.5f; + float mix = 1 - (((1 - sin(aa * PI))) * 0.99f); + mix = mix * mix; + //sunriseCol[0] = (aa * 0.3f + 0.7f); + //sunriseCol[1] = (aa * aa * 0.7f + 0.2f); + //sunriseCol[2] = (aa * aa * 0.0f + 0.2f); sunriseCol[0] = (aa * (r2-r1) + r1); sunriseCol[1] = (aa * (g2-g1) + g1); sunriseCol[2] = (aa * (b2-b1) + b1); - sunriseCol[3] = mix; - return sunriseCol; - } + sunriseCol[3] = mix; + return sunriseCol; + } - return NULL; + return NULL; } Vec3 *Dimension::getFogColor(float td, float a) const { - float br = Mth::cos(td * PI * 2) * 2 + 0.5f; - if (br < 0.0f) br = 0.0f; - if (br > 1.0f) br = 1.0f; - + float br = Mth::cos(td * PI * 2) * 2 + 0.5f; + if (br < 0.0f) br = 0.0f; + if (br > 1.0f) br = 1.0f; + unsigned int baseFogColour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Default_Fog_Colour ); - float r = ((baseFogColour >> 16) & 0xff) / 255.0f; - float g = ((baseFogColour >> 8) & 0xff) / 255.0f; - float b = ((baseFogColour) & 0xff) / 255.0f; - r *= br * 0.94f + 0.06f; - g *= br * 0.94f + 0.06f; - b *= br * 0.91f + 0.09f; + float r = ((baseFogColour >> 16) & 0xff) / 255.0f; + float g = ((baseFogColour >> 8) & 0xff) / 255.0f; + float b = ((baseFogColour) & 0xff) / 255.0f; + r *= br * 0.94f + 0.06f; + g *= br * 0.94f + 0.06f; + b *= br * 0.91f + 0.09f; - return Vec3::newTemp(r, g, b); + return Vec3::newTemp(r, g, b); } bool Dimension::mayRespawn() const @@ -181,11 +188,11 @@ bool Dimension::mayRespawn() const Dimension *Dimension::getNew(int id) { - if (id == -1) return new HellDimension(); - if (id == 0) return new NormalDimension(); - if (id == 1) return new TheEndDimension(); + if (id == -1) return new HellDimension(); + if (id == 0) return new NormalDimension(); + if (id == 1) return new TheEndDimension(); - return NULL; + return NULL; } float Dimension::getCloudHeight() diff --git a/Minecraft.World/Dimension.h b/Minecraft.World/Dimension.h index 36df385e..5cccd68b 100644 --- a/Minecraft.World/Dimension.h +++ b/Minecraft.World/Dimension.h @@ -12,44 +12,47 @@ class LevelType; class Dimension { public: - Level *level; + static const float MOON_BRIGHTNESS_PER_PHASE[8]; + + Level *level; LevelType *levelType; - BiomeSource *biomeSource; - bool ultraWarm ; - bool hasCeiling; - float *brightnessRamp; - int id; + wstring levelTypeOptions; + BiomeSource *biomeSource; + bool ultraWarm ; + bool hasCeiling; + float *brightnessRamp; + int id; - virtual void init(Level *level); + virtual void init(Level *level); protected: - virtual void updateLightRamp(); - virtual void init(); + virtual void updateLightRamp(); + virtual void init(); public: Dimension(); ~Dimension(); virtual ChunkSource *createRandomLevelSource() const; virtual ChunkSource *createFlatLevelSource() const; - virtual ChunkStorage *createStorage(File dir); + virtual ChunkStorage *createStorage(File dir); - virtual bool isValidSpawn(int x, int z) const; + virtual bool isValidSpawn(int x, int z) const; - virtual float getTimeOfDay(__int64 time, float a) const; - virtual int getMoonPhase(__int64 time, float a) const; + virtual float getTimeOfDay(__int64 time, float a) const; + virtual int getMoonPhase(__int64 time) const; virtual bool isNaturalDimension(); private: - static const int fogColor = 0xc0d8ff; + static const int fogColor = 0xc0d8ff; - float sunriseCol[4]; + float sunriseCol[4]; public: - virtual float *getSunriseColor(float td, float a); - virtual Vec3 *getFogColor(float td, float a) const; - virtual bool mayRespawn() const; - static Dimension *getNew(int id); - virtual float getCloudHeight(); - virtual bool hasGround(); + virtual float *getSunriseColor(float td, float a); + virtual Vec3 *getFogColor(float td, float a) const; + virtual bool mayRespawn() const; + static Dimension *getNew(int id); + virtual float getCloudHeight(); + virtual bool hasGround(); virtual Pos *getSpawnPos(); int getSpawnYPosition(); diff --git a/Minecraft.World/DiodeTile.cpp b/Minecraft.World/DiodeTile.cpp index c28778d3..e5bbfede 100644 --- a/Minecraft.World/DiodeTile.cpp +++ b/Minecraft.World/DiodeTile.cpp @@ -1,14 +1,13 @@ #include "stdafx.h" #include "net.minecraft.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.h" #include "net.minecraft.world.h" #include "DiodeTile.h" -const double DiodeTile::DELAY_RENDER_OFFSETS[4] = { -1.0f / 16.0f, 1.0f / 16.0f, 3.0f / 16.0f, 5.0f / 16.0f }; -const int DiodeTile::DELAYS[4] = { 1, 2, 3, 4 }; - DiodeTile::DiodeTile(int id, bool on) : DirectionalTile(id, Material::decoration,isSolidRender()) { this->on = on; @@ -47,20 +46,22 @@ bool DiodeTile::canSurvive(Level *level, int x, int y, int z) void DiodeTile::tick(Level *level, int x, int y, int z, Random *random) { int data = level->getData(x, y, z); - bool sourceOn = getSourceSignal(level, x, y, z, data); - if (on && !sourceOn) - { - level->setTileAndData(x, y, z, Tile::diode_off_Id, data); - } - else if (!on) + if (!isLocked(level, x, y, z, data)) { - // when off-diodes are ticked, they always turn on for one tick and - // then off again if necessary - level->setTileAndData(x, y, z, Tile::diode_on_Id, data); - if (!sourceOn) + bool sourceOn = shouldTurnOn(level, x, y, z, data); + if (on && !sourceOn) + { + level->setTileAndData(x, y, z, getOffTile()->id, data, Tile::UPDATE_CLIENTS); + } + else if (!on) { - int delay = (data & DELAY_MASK) >> DELAY_SHIFT; - level->addToTickNextTick(x, y, z, Tile::diode_on_Id, DELAYS[delay] * 2); + // when off-diodes are ticked, they always turn on for one tick and + // then off again if necessary + level->setTileAndData(x, y, z, getOnTile()->id, data, Tile::UPDATE_CLIENTS); + if (!sourceOn) + { + level->addToTickNextTick(x, y, z, getOnTile()->id, getTurnOffDelay(data), -1); + } } } } @@ -72,9 +73,9 @@ Icon *DiodeTile::getTexture(int face, int data) { if (on) { - return Tile::notGate_on->getTexture(face); + return Tile::redstoneTorch_on->getTexture(face); } - return Tile::notGate_off->getTexture(face); + return Tile::redstoneTorch_off->getTexture(face); } if (face == Facing::UP) { @@ -84,11 +85,6 @@ Icon *DiodeTile::getTexture(int face, int data) return Tile::stoneSlab->getTexture(Facing::UP); } -void DiodeTile::registerIcons(IconRegister *iconRegister) -{ - icon = iconRegister->registerIcon(on ? L"repeater_lit" : L"repeater"); -} - bool DiodeTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { if (face == Facing::DOWN || face == Facing::UP) @@ -104,26 +100,32 @@ int DiodeTile::getRenderShape() return SHAPE_DIODE; } -bool DiodeTile::getDirectSignal(Level *level, int x, int y, int z, int dir) +bool DiodeTile::isOn(int data) +{ + return on; +} + +int DiodeTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) { return getSignal(level, x, y, z, dir); } -bool DiodeTile::getSignal(LevelSource *level, int x, int y, int z, int facing) +int DiodeTile::getSignal(LevelSource *level, int x, int y, int z, int facing) { - if (!on) + int data = level->getData(x, y, z); + if (!isOn(data)) { - return false; + return Redstone::SIGNAL_NONE; } - int dir = getDirection(level->getData(x, y, z)); + int dir = getDirection(data); - if (dir == Direction::SOUTH && facing == Facing::SOUTH) return true; - if (dir == Direction::WEST && facing == Facing::WEST) return true; - if (dir == Direction::NORTH && facing == Facing::NORTH) return true; - if (dir == Direction::EAST && facing == Facing::EAST) return true; + if (dir == Direction::SOUTH && facing == Facing::SOUTH) return getOutputSignal(level, x, y, z, data); + if (dir == Direction::WEST && facing == Facing::WEST) return getOutputSignal(level, x, y, z, data); + if (dir == Direction::NORTH && facing == Facing::NORTH) return getOutputSignal(level, x, y, z, data); + if (dir == Direction::EAST && facing == Facing::EAST) return getOutputSignal(level, x, y, z, data); - return false; + return Redstone::SIGNAL_NONE; } void DiodeTile::neighborChanged(Level *level, int x, int y, int z, int type) @@ -131,7 +133,7 @@ void DiodeTile::neighborChanged(Level *level, int x, int y, int z, int type) if (!canSurvive(level, x, y, z)) { this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); level->updateNeighborsAt(x + 1, y, z, id); level->updateNeighborsAt(x - 1, y, z, id); level->updateNeighborsAt(x, y, z + 1, id); @@ -141,49 +143,91 @@ void DiodeTile::neighborChanged(Level *level, int x, int y, int z, int type) return; } + checkTickOnNeighbor(level, x, y, z, type); +} + +void DiodeTile::checkTickOnNeighbor(Level *level, int x, int y, int z, int type) +{ int data = level->getData(x, y, z); - bool sourceOn = getSourceSignal(level, x, y, z, data); - int delay = (data & DELAY_MASK) >> DELAY_SHIFT; - if ( (on && !sourceOn) || (!on && sourceOn)) + if (!isLocked(level, x, y, z, data)) { - level->addToTickNextTick(x, y, z, id, DELAYS[delay] * 2); + bool sourceOn = shouldTurnOn(level, x, y, z, data); + if ((on && !sourceOn || !on && sourceOn) && !level->isTileToBeTickedAt(x, y, z, id)) + { + int prio = -1; + + // if the tile in front is a repeater, we prioritize this update + if (shouldPrioritize(level, x, y, z, data)) + { + prio = -3; + } + else if (on) + { + prio = -2; + } + + level->addToTickNextTick(x, y, z, id, getTurnOnDelay(data), prio); + } } } -bool DiodeTile::getSourceSignal(Level *level, int x, int y, int z, int data) +bool DiodeTile::isLocked(LevelSource *level, int x, int y, int z, int data) +{ + return false; +} + +bool DiodeTile::shouldTurnOn(Level *level, int x, int y, int z, int data) +{ + return getInputSignal(level, x, y, z, data) > Redstone::SIGNAL_NONE; +} + +int DiodeTile::getInputSignal(Level *level, int x, int y, int z, int data) { int dir = getDirection(data); + + int xx = x + Direction::STEP_X[dir]; + int zz = z + Direction::STEP_Z[dir]; + int input = level->getSignal(xx, y, zz, Direction::DIRECTION_FACING[dir]); + + if (input >= Redstone::SIGNAL_MAX) return input; + return max(input, level->getTile(xx, y, zz) == Tile::redStoneDust_Id ? level->getData(xx, y, zz) : Redstone::SIGNAL_NONE); +} + +int DiodeTile::getAlternateSignal(LevelSource *level, int x, int y, int z, int data) +{ + int dir = getDirection(data); + switch (dir) { - case Direction::SOUTH: - return level->getSignal(x, y, z + 1, Facing::SOUTH) || (level->getTile(x, y, z + 1) == Tile::redStoneDust_Id && level->getData(x, y, z + 1) > 0); - case Direction::NORTH: - return level->getSignal(x, y, z - 1, Facing::NORTH) || (level->getTile(x, y, z - 1) == Tile::redStoneDust_Id && level->getData(x, y, z - 1) > 0); - case Direction::EAST: - return level->getSignal(x + 1, y, z, Facing::EAST) || (level->getTile(x + 1, y, z) == Tile::redStoneDust_Id && level->getData(x + 1, y, z) > 0); - case Direction::WEST: - return level->getSignal(x - 1, y, z, Facing::WEST) || (level->getTile(x - 1, y, z) == Tile::redStoneDust_Id && level->getData(x - 1, y, z) > 0); + case Direction::SOUTH: + case Direction::NORTH: + return max(getAlternateSignalAt(level, x - 1, y, z, Facing::WEST), getAlternateSignalAt(level, x + 1, y, z, Facing::EAST)); + case Direction::EAST: + case Direction::WEST: + return max(getAlternateSignalAt(level, x, y, z + 1, Facing::SOUTH), getAlternateSignalAt(level, x, y, z - 1, Facing::NORTH)); } - return false; -} -// 4J-PB - Adding a TestUse for tooltip display -bool DiodeTile::TestUse() -{ - return true; + return Redstone::SIGNAL_NONE; } -bool DiodeTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +int DiodeTile::getAlternateSignalAt(LevelSource *level, int x, int y, int z, int facing) { - if( soundOnly) return false; + int tile = level->getTile(x, y, z); - int data = level->getData(x, y, z); - int delay = (data & DELAY_MASK) >> DELAY_SHIFT; - delay = ((delay + 1) << DELAY_SHIFT) & DELAY_MASK; + if (isAlternateInput(tile)) + { + if (tile == Tile::redStoneDust_Id) + { + return level->getData(x, y, z); + } + else + { + return level->getDirectSignal(x, y, z, facing); + } + } - level->setData(x, y, z, delay | (data & DIRECTION_MASK)); - return true; + return Redstone::SIGNAL_NONE; } bool DiodeTile::isSignalSource() @@ -191,12 +235,12 @@ bool DiodeTile::isSignalSource() return true; } -void DiodeTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void DiodeTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 2) % 4; - level->setData(x, y, z, dir); + level->setData(x, y, z, dir, Tile::UPDATE_ALL); - bool sourceOn = getSourceSignal(level, x, y, z, dir); + bool sourceOn = shouldTurnOn(level, x, y, z, dir); if (sourceOn) { level->addToTickNextTick(x, y, z, id, 1); @@ -205,17 +249,37 @@ void DiodeTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr b void DiodeTile::onPlace(Level *level, int x, int y, int z) { - level->updateNeighborsAt(x + 1, y, z, id); - level->updateNeighborsAt(x - 1, y, z, id); - level->updateNeighborsAt(x, y, z + 1, id); - level->updateNeighborsAt(x, y, z - 1, id); - level->updateNeighborsAt(x, y - 1, z, id); - level->updateNeighborsAt(x, y + 1, z, id); + updateNeighborsInFront(level, x, y, z); +} + +void DiodeTile::updateNeighborsInFront(Level *level, int x, int y, int z) +{ + int dir = getDirection(level->getData(x, y, z)); + if (dir == Direction::WEST) + { + level->neighborChanged(x + 1, y, z, id); + level->updateNeighborsAtExceptFromFacing(x + 1, y, z, id, Facing::WEST); + } + if (dir == Direction::EAST) + { + level->neighborChanged(x - 1, y, z, id); + level->updateNeighborsAtExceptFromFacing(x - 1, y, z, id, Facing::EAST); + } + if (dir == Direction::NORTH) + { + level->neighborChanged(x, y, z + 1, id); + level->updateNeighborsAtExceptFromFacing(x, y, z + 1, id, Facing::NORTH); + } + if (dir == Direction::SOUTH) + { + level->neighborChanged(x, y, z - 1, id); + level->updateNeighborsAtExceptFromFacing(x, y, z - 1, id, Facing::SOUTH); + } } void DiodeTile::destroy(Level *level, int x, int y, int z, int data) { - if (on) + if (on) { level->updateNeighborsAt(x + 1, y, z, id); level->updateNeighborsAt(x - 1, y, z, id); @@ -224,7 +288,7 @@ void DiodeTile::destroy(Level *level, int x, int y, int z, int data) level->updateNeighborsAt(x, y - 1, z, id); level->updateNeighborsAt(x, y + 1, z, id); } - Tile::destroy(level, x, y, z, data); + Tile::destroy(level, x, y, z, data); } bool DiodeTile::isSolidRender(bool isServerLevel) @@ -232,68 +296,45 @@ bool DiodeTile::isSolidRender(bool isServerLevel) return false; } -int DiodeTile::getResource(int data, Random *random, int playerBonusLevel) +bool DiodeTile::isAlternateInput(int tile) { - return Item::diode->id; + Tile *tt = Tile::tiles[tile]; + return tt != NULL && tt->isSignalSource(); } -void DiodeTile::animateTick(Level *level, int xt, int yt, int zt, Random *random) +int DiodeTile::getOutputSignal(LevelSource *level, int x, int y, int z, int data) { - if (!on) return; - int data = level->getData(xt, yt, zt); - int dir = getDirection(data); + return Redstone::SIGNAL_MAX; +} - double x = xt + 0.5f + (random->nextFloat() - 0.5f) * 0.2; - double y = yt + 0.4f + (random->nextFloat() - 0.5f) * 0.2; - double z = zt + 0.5f + (random->nextFloat() - 0.5f) * 0.2; +bool DiodeTile::isDiode(int id) +{ + return Tile::diode_off->isSameDiode(id) || Tile::comparator_off->isSameDiode(id); +} - double xo = 0; - double zo = 0; +bool DiodeTile::isSameDiode(int id) +{ + return id == getOnTile()->id || id == getOffTile()->id; +} - if (random->nextInt(2) == 0) - { - // spawn on receiver - switch (dir) - { - case Direction::SOUTH: - zo = -5.0f / 16.0f; - break; - case Direction::NORTH: - zo = 5.0f / 16.0f; - break; - case Direction::EAST: - xo = -5.0f / 16.0f; - break; - case Direction::WEST: - xo = 5.0f / 16.0f; - break; - } - } - else +bool DiodeTile::shouldPrioritize(Level *level, int x, int y, int z, int data) +{ + int dir = getDirection(data); + if (isDiode(level->getTile(x - Direction::STEP_X[dir], y, z - Direction::STEP_Z[dir]))) { - // spawn on transmitter - int delay = (data & DELAY_MASK) >> DELAY_SHIFT; - switch (dir) - { - case Direction::SOUTH: - zo = DiodeTile::DELAY_RENDER_OFFSETS[delay]; - break; - case Direction::NORTH: - zo = -DiodeTile::DELAY_RENDER_OFFSETS[delay]; - break; - case Direction::EAST: - xo = DiodeTile::DELAY_RENDER_OFFSETS[delay]; - break; - case Direction::WEST: - xo = -DiodeTile::DELAY_RENDER_OFFSETS[delay]; - break; - } + int odata = level->getData(x - Direction::STEP_X[dir], y, z - Direction::STEP_Z[dir]); + int odir = getDirection(odata); + return odir != dir; } - level->addParticle(eParticleType_reddust, x + xo, y, z + zo, 0, 0, 0); - + return false; } -int DiodeTile::cloneTileId(Level *level, int x, int y, int z) +int DiodeTile::getTurnOffDelay(int data) { - return Item::diode_Id; + return getTurnOnDelay(data); } + +bool DiodeTile::isMatching(int id) +{ + return isSameDiode(id); +} \ No newline at end of file diff --git a/Minecraft.World/DiodeTile.h b/Minecraft.World/DiodeTile.h index 003b011f..16f3347b 100644 --- a/Minecraft.World/DiodeTile.h +++ b/Minecraft.World/DiodeTile.h @@ -8,43 +8,71 @@ class Level; class DiodeTile : public DirectionalTile { friend class Tile; +protected: + bool on; + +protected: + DiodeTile(int id, bool on); +public: + virtual void updateDefaultShape(); // 4J Added override + virtual bool isCubeShaped(); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual bool canSurvive(Level *level, int x, int y, int z); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual Icon *getTexture(int face, int data); + virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); + virtual int getRenderShape(); + +protected: + virtual bool isOn(int data); + public: - static const int DELAY_MASK = DIRECTION_INV_MASK; - static const int DELAY_SHIFT = 2; + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getSignal(LevelSource *level, int x, int y, int z, int facing); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); - static const double DELAY_RENDER_OFFSETS[4]; - static const int DELAYS[4]; +protected: + virtual void checkTickOnNeighbor(Level *level, int x, int y, int z, int type); -private: - bool on; +public: + virtual bool isLocked(LevelSource *level, int x, int y, int z, int data); protected: - DiodeTile(int id, bool on); + virtual bool shouldTurnOn(Level *level, int x, int y, int z, int data); + virtual int getInputSignal(Level *level, int x, int y, int z, int data); + virtual int getAlternateSignal(LevelSource *level, int x, int y, int z, int data); + virtual int getAlternateSignalAt(LevelSource *level, int x, int y, int z, int facing); + public: - virtual void updateDefaultShape(); // 4J Added override - virtual bool isCubeShaped(); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual bool canSurvive(Level *level, int x, int y, int z); - virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual Icon *getTexture(int face, int data); - //@Override - void registerIcons(IconRegister *iconRegister); - virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - virtual int getRenderShape(); - virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); - virtual bool getSignal(LevelSource *level, int x, int y, int z, int facing); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); -private: - virtual bool getSourceSignal(Level *level, int x, int y, int z, int data); + virtual bool isSignalSource(); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void onPlace(Level *level, int x, int y, int z); + +protected: + virtual void updateNeighborsInFront(Level *level, int x, int y, int z); + public: - virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual bool isSignalSource(); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); - virtual void onPlace(Level *level, int x, int y, int z); virtual void destroy(Level *level, int x, int y, int z, int data); - virtual bool isSolidRender(bool isServerLevel = false); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); - virtual int cloneTileId(Level *level, int x, int y, int z); + virtual bool isSolidRender(bool isServerLevel = false); + virtual int getResource(int data, Random *random, int playerBonusLevel) = 0; + virtual int cloneTileId(Level *level, int x, int y, int z) = 0; + +protected: + virtual bool isAlternateInput(int tile); + virtual int getOutputSignal(LevelSource *level, int x, int y, int z, int data); + +public: + static bool isDiode(int id); + virtual bool isSameDiode(int id); + virtual bool shouldPrioritize(Level *level, int x, int y, int z, int data); + +protected: + virtual int getTurnOffDelay(int data); + + virtual int getTurnOnDelay(int data) = 0; + virtual DiodeTile *getOnTile() = 0; + virtual DiodeTile *getOffTile() = 0; + +public: + virtual bool isMatching(int id); }; diff --git a/Minecraft.World/Direction.cpp b/Minecraft.World/Direction.cpp index 408bbab5..f758798b 100644 --- a/Minecraft.World/Direction.cpp +++ b/Minecraft.World/Direction.cpp @@ -4,18 +4,20 @@ const int Direction::STEP_X[] = { - 0, -1, 0, 1 + 0, -1, 0, 1 }; const int Direction::STEP_Z[] = { - 1, 0, -1, 0 + 1, 0, -1, 0 }; +const wstring Direction::NAMES[] = {L"SOUTH", L"WEST", L"NORTH", L"EAST" }; + // for [direction] it gives [tile-face] int Direction::DIRECTION_FACING[4] = { - Facing::SOUTH, Facing::WEST, Facing::NORTH, Facing::EAST + Facing::SOUTH, Facing::WEST, Facing::NORTH, Facing::EAST }; // for [facing] it gives [direction] @@ -26,37 +28,71 @@ int Direction::FACING_DIRECTION[] = int Direction::DIRECTION_OPPOSITE[4] = { - Direction::NORTH, Direction::EAST, Direction::SOUTH, Direction::WEST + NORTH, EAST, SOUTH, WEST }; // for [direction] it gives [90 degrees clockwise direction] int Direction::DIRECTION_CLOCKWISE[] = { - Direction::WEST, Direction::NORTH, Direction::EAST, Direction::SOUTH + WEST, NORTH, EAST, SOUTH }; // for [direction] it gives [90 degrees counter clockwise direction] int Direction::DIRECTION_COUNTER_CLOCKWISE[] = { - Direction::EAST, Direction::SOUTH, Direction::WEST, Direction::NORTH + EAST, SOUTH, WEST, NORTH }; int Direction::RELATIVE_DIRECTION_FACING[4][6] = { - // south - { - Facing::UP, Facing::DOWN, Facing::SOUTH, Facing::NORTH, Facing::EAST, Facing::WEST - }, - // west - { - Facing::UP, Facing::DOWN, Facing::EAST, Facing::WEST, Facing::NORTH, Facing::SOUTH - }, - // north - { - Facing::UP, Facing::DOWN, Facing::NORTH, Facing::SOUTH, Facing::WEST, Facing::EAST - }, - // east - { - Facing::UP, Facing::DOWN, Facing::WEST, Facing::EAST, Facing::SOUTH, Facing::NORTH - } + // south + { + Facing::UP, Facing::DOWN, Facing::SOUTH, Facing::NORTH, Facing::EAST, Facing::WEST + }, + // west + { + Facing::UP, Facing::DOWN, Facing::EAST, Facing::WEST, Facing::NORTH, Facing::SOUTH + }, + // north + { + Facing::UP, Facing::DOWN, Facing::NORTH, Facing::SOUTH, Facing::WEST, Facing::EAST + }, + // east + { + Facing::UP, Facing::DOWN, Facing::WEST, Facing::EAST, Facing::SOUTH, Facing::NORTH + } }; + +int Direction::getDirection(double xd, double zd) +{ + if (Mth::abs((float) xd) > Mth::abs((float) zd)) + { + if (xd > 0) + { + return WEST; + } + else + { + return EAST; + } + } + else + { + if (zd > 0) + { + return NORTH; + } + else + { + return SOUTH; + } + } +} + +int Direction::getDirection(int x0, int z0, int x1, int z1) +{ + int xd = x0 - x1; + int zd = z0 - z1; + + return getDirection(xd, zd); +} \ No newline at end of file diff --git a/Minecraft.World/Direction.h b/Minecraft.World/Direction.h index aadd2bbb..61c6ef58 100644 --- a/Minecraft.World/Direction.h +++ b/Minecraft.World/Direction.h @@ -4,29 +4,34 @@ class Direction { public: static const int UNDEFINED = -1; - static const int SOUTH = 0; - static const int WEST = 1; - static const int NORTH = 2; - static const int EAST = 3; + static const int SOUTH = 0; + static const int WEST = 1; + static const int NORTH = 2; + static const int EAST = 3; static const int STEP_X[]; static const int STEP_Z[]; - // for [direction] it gives [tile-face] - static int DIRECTION_FACING[]; + static const wstring NAMES[];; - // for [facing] it gives [direction] + // for [direction] it gives [tile-face] + static int DIRECTION_FACING[]; + + // for [facing] it gives [direction] static int FACING_DIRECTION[]; - // for [direction] it gives [opposite direction] - static int DIRECTION_OPPOSITE[]; + // for [direction] it gives [opposite direction] + static int DIRECTION_OPPOSITE[]; - // for [direction] it gives [90 degrees clockwise direction] + // for [direction] it gives [90 degrees clockwise direction] static int DIRECTION_CLOCKWISE[]; - // for [direction] it gives [90 degrees counter-clockwise direction] + // for [direction] it gives [90 degrees counter-clockwise direction] static int DIRECTION_COUNTER_CLOCKWISE[]; - // for [direction][world-facing] it gives [tile-facing] - static int RELATIVE_DIRECTION_FACING[4][6]; + // for [direction][world-facing] it gives [tile-facing] + static int RELATIVE_DIRECTION_FACING[4][6]; + + static int getDirection(double xd, double zd); + static int getDirection(int x0, int z0, int x1, int z1); }; \ No newline at end of file diff --git a/Minecraft.World/DirectionalTile.cpp b/Minecraft.World/DirectionalTile.cpp index 783e88bd..e1231a00 100644 --- a/Minecraft.World/DirectionalTile.cpp +++ b/Minecraft.World/DirectionalTile.cpp @@ -2,10 +2,6 @@ #include "DirectionalTile.h" -DirectionalTile::DirectionalTile(int id, Material *material) : Tile(id, material) -{ -} - DirectionalTile::DirectionalTile(int id, Material *material, bool isSolidRender) : Tile(id, material, isSolidRender) { } diff --git a/Minecraft.World/DirectionalTile.h b/Minecraft.World/DirectionalTile.h index cc4715c6..5de80567 100644 --- a/Minecraft.World/DirectionalTile.h +++ b/Minecraft.World/DirectionalTile.h @@ -9,7 +9,6 @@ public: static const int DIRECTION_INV_MASK = 0xC; protected: - DirectionalTile(int id, Material *material); DirectionalTile(int id, Material *material, bool isSolidRender); public: diff --git a/Minecraft.World/DirectoryLevelStorage.cpp b/Minecraft.World/DirectoryLevelStorage.cpp index 27514c9b..ba9bec6a 100644 --- a/Minecraft.World/DirectoryLevelStorage.cpp +++ b/Minecraft.World/DirectoryLevelStorage.cpp @@ -328,7 +328,7 @@ LevelData *DirectoryLevelStorage::prepareLevel() } m_bHasLoadedMapDataMappings = true; - } + } // 4J Jev, removed try/catch @@ -344,7 +344,7 @@ LevelData *DirectoryLevelStorage::prepareLevel() return ret; } - return NULL; + return NULL; } void DirectoryLevelStorage::saveLevelData(LevelData *levelData, vector > *players) @@ -428,18 +428,15 @@ void DirectoryLevelStorage::save(shared_ptr player) } } - // 4J Changed return val to bool to check if new player or loaded player -bool DirectoryLevelStorage::load(shared_ptr player) +// 4J Changed return val to bool to check if new player or loaded player +CompoundTag *DirectoryLevelStorage::load(shared_ptr player) { - bool newPlayer = true; CompoundTag *tag = loadPlayerDataTag( player->getXuid() ); if (tag != NULL) { - newPlayer = false; player->load(tag); - delete tag; } - return newPlayer; + return tag; } CompoundTag *DirectoryLevelStorage::loadPlayerDataTag(PlayerUID xuid) @@ -506,20 +503,20 @@ void DirectoryLevelStorage::clearOldPlayerFiles() sort(playerFiles->begin(), playerFiles->end(), FileEntry::newestFirst ); for(unsigned int i = MAX_PLAYER_DATA_SAVES; i < playerFiles->size(); ++i ) - { + { FileEntry *file = playerFiles->at(i); wstring xuidStr = replaceAll( replaceAll(file->data.filename,playerDir.getName(),L""),L".dat",L""); #if defined(__PS3__) || defined(__ORBIS__) || defined(_DURANGO) - PlayerUID xuid(xuidStr); + PlayerUID xuid(xuidStr); #else - PlayerUID xuid = _fromString(xuidStr); + PlayerUID xuid = _fromString(xuidStr); #endif - deleteMapFilesForPlayer(xuid); - m_saveFile->deleteFile( playerFiles->at(i) ); - } + deleteMapFilesForPlayer(xuid); + m_saveFile->deleteFile( playerFiles->at(i) ); + } } - delete playerFiles; + delete playerFiles; } } @@ -704,10 +701,10 @@ void DirectoryLevelStorage::saveMapIdLookup() ); #else m_saveFile->writeFile( fileEntry, - &m_saveableMapDataMappings, // data buffer - sizeof(MapDataMappings), // number of bytes to write - &NumberOfBytesWritten // number of bytes written - ); + &m_saveableMapDataMappings, // data buffer + sizeof(MapDataMappings), // number of bytes to write + &NumberOfBytesWritten // number of bytes written + ); assert( NumberOfBytesWritten == sizeof(MapDataMappings) ); #endif } diff --git a/Minecraft.World/DirectoryLevelStorage.h b/Minecraft.World/DirectoryLevelStorage.h index 820ef31f..3c811ef3 100644 --- a/Minecraft.World/DirectoryLevelStorage.h +++ b/Minecraft.World/DirectoryLevelStorage.h @@ -122,7 +122,7 @@ public: virtual void saveLevelData(LevelData *levelData, vector > *players); virtual void saveLevelData(LevelData *levelData); virtual void save(shared_ptr player); - virtual bool load(shared_ptr player); // 4J Changed return val to bool to check if new player or loaded player + virtual CompoundTag *load(shared_ptr player); // 4J Changed return val to bool to check if new player or loaded player virtual CompoundTag *loadPlayerDataTag(PlayerUID xuid); virtual void clearOldPlayerFiles(); // 4J Added PlayerIO *getPlayerIO(); diff --git a/Minecraft.World/DispenseItemBehavior.cpp b/Minecraft.World/DispenseItemBehavior.cpp new file mode 100644 index 00000000..19eb5d0b --- /dev/null +++ b/Minecraft.World/DispenseItemBehavior.cpp @@ -0,0 +1,10 @@ +#include "stdafx.h" + +#include "DispenseItemBehavior.h" + +DispenseItemBehavior *DispenseItemBehavior::NOOP = new NoOpDispenseItemBehavior(); + +shared_ptr NoOpDispenseItemBehavior::dispense(BlockSource *source, shared_ptr dispensed) +{ + return dispensed; +} \ No newline at end of file diff --git a/Minecraft.World/DispenseItemBehavior.h b/Minecraft.World/DispenseItemBehavior.h new file mode 100644 index 00000000..08e1460b --- /dev/null +++ b/Minecraft.World/DispenseItemBehavior.h @@ -0,0 +1,29 @@ +#pragma once + +#include "Behavior.h" + +class ItemInstance; +class BlockSource; + +class DispenseItemBehavior : public Behavior +{ +public: + /** + * The 'do nothing' behavior. + */ + static DispenseItemBehavior *NOOP; + + /** + * + * @param source The source of this call (the dispenser that calls it) + * @param dispensed The ItemInstance which is being dispensed + * @return The ItemInstance that should is 'left over' + */ + virtual shared_ptr dispense(BlockSource *source, shared_ptr dispensed) = 0; +}; + +class NoOpDispenseItemBehavior : public DispenseItemBehavior +{ +public: + shared_ptr dispense(BlockSource *source, shared_ptr dispensed); +}; \ No newline at end of file diff --git a/Minecraft.World/DispenserTile.cpp b/Minecraft.World/DispenserTile.cpp index 286737c9..8758b3c5 100644 --- a/Minecraft.World/DispenserTile.cpp +++ b/Minecraft.World/DispenserTile.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.inventory.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.tile.entity.h" @@ -11,7 +12,9 @@ #include "net.minecraft.h" #include "Mob.h" -DispenserTile::DispenserTile(int id) : EntityTile(id, Material::stone) +BehaviorRegistry DispenserTile::REGISTRY = BehaviorRegistry(new DefaultDispenseItemBehavior()); + +DispenserTile::DispenserTile(int id) : BaseEntityTile(id, Material::stone) { random = new Random(); @@ -20,19 +23,14 @@ DispenserTile::DispenserTile(int id) : EntityTile(id, Material::stone) iconFrontVertical = NULL; } -int DispenserTile::getTickDelay() +int DispenserTile::getTickDelay(Level *level) { return 4; } -int DispenserTile::getResource(int data, Random *random, int playerBonusLevel) -{ - return Tile::dispenser_Id; -} - void DispenserTile::onPlace(Level *level, int x, int y, int z) { - EntityTile::onPlace(level, x, y, z); + BaseEntityTile::onPlace(level, x, y, z); recalcLockDir(level, x, y, z); } @@ -53,7 +51,7 @@ void DispenserTile::recalcLockDir(Level *level, int x, int y, int z) if (Tile::solid[s] && !Tile::solid[n]) lockDir = 2; if (Tile::solid[w] && !Tile::solid[e]) lockDir = 5; if (Tile::solid[e] && !Tile::solid[w]) lockDir = 4; - level->setData(x, y, z, lockDir); + level->setData(x, y, z, lockDir, Tile::UPDATE_CLIENTS); } Icon *DispenserTile::getTexture(int face, int data) @@ -113,80 +111,58 @@ bool DispenserTile::use(Level *level, int x, int y, int z, shared_ptr pl return true; } -void DispenserTile::fireArrow(Level *level, int x, int y, int z, Random *random) +void DispenserTile::dispenseFrom(Level *level, int x, int y, int z) { - const int lockDir = level->getData(x, y, z); - //const float power = 1.1f; - const int accuracy = 6; - //bool bLaunched=true; + BlockSourceImpl source(level, x, y, z); + shared_ptr trap = dynamic_pointer_cast( source.getEntity() ); + if (trap == NULL) return; - int xd = 0, zd = 0; - if (lockDir == Facing::SOUTH) + int slot = trap->getRandomSlot(); + if (slot < 0) { - zd = 1; - } - else if (lockDir == Facing::NORTH) - { - zd = -1; - } - else if (lockDir == Facing::EAST) - { - xd = 1; + level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); } else { - xd = -1; - } - - shared_ptr trap = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); - if(trap != NULL) - { - int slot=trap->getRandomSlot(); + shared_ptr item = trap->getItem(slot); + DispenseItemBehavior *behavior = getDispenseMethod(item); - if (slot < 0) + if (behavior != DispenseItemBehavior::NOOP) { - level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); - } - else - { - double xp = x + xd * 0.6 + 0.5; - double yp = y + 0.5; - double zp = z + zd * 0.6 + 0.5; - shared_ptr item=trap->getItem(slot); - int result = dispenseItem(trap, level, item, random, x, y, z, xd, zd, xp, yp, zp); - if (result == REMOVE_ITEM) - { - trap->removeItem(slot, 1); - } - else if (result == DISPENSE_ITEM) - { - item = trap->removeItem(slot, 1); - throwItem(level, item, random, accuracy, xd, zd, xp, yp, zp); - level->levelEvent(LevelEvent::SOUND_CLICK, x, y, z, 0); - } + shared_ptr leftOver = behavior->dispense(&source, item); - level->levelEvent(LevelEvent::PARTICLES_SHOOT, x, y, z, (xd + 1) + (zd + 1) * 3); + trap->setItem(slot, leftOver->count == 0 ? nullptr : leftOver); } } } +DispenseItemBehavior *DispenserTile::getDispenseMethod(shared_ptr item) +{ + return REGISTRY.get(item->getItem()); +} + void DispenserTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (type > 0 && Tile::tiles[type]->isSignalSource()) + bool signal = level->hasNeighborSignal(x, y, z) || level->hasNeighborSignal(x, y + 1, z); + int data = level->getData(x, y, z); + bool isTriggered = (data & TRIGGER_BIT) != 0; + + if (signal && !isTriggered) { - bool signal = level->hasNeighborSignal(x, y, z) || level->hasNeighborSignal(x, y + 1, z); - if (signal) - { - level->addToTickNextTick(x, y, z, this->id, getTickDelay()); - } + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); + level->setData(x, y, z, data | TRIGGER_BIT, UPDATE_NONE); + } + else if (!signal && isTriggered) + { + level->setData(x, y, z, data & ~TRIGGER_BIT, UPDATE_NONE); } } void DispenserTile::tick(Level *level, int x, int y, int z, Random *random) { - if (!level->isClientSide && ( level->hasNeighborSignal(x, y, z) || level->hasNeighborSignal(x, y + 1, z))) + if (!level->isClientSide) // && (level.hasNeighborSignal(x, y, z) || level.hasNeighborSignal(x, y + 1, z))) { - fireArrow(level, x, y, z, random); + dispenseFrom(level, x, y, z); } } @@ -195,14 +171,16 @@ shared_ptr DispenserTile::newTileEntity(Level *level) return shared_ptr( new DispenserTileEntity() ); } -void DispenserTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void DispenserTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { - int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3; + int dir = PistonBaseTile::getNewFacing(level, x, y, z, by); - if (dir == 0) level->setData(x, y, z, Facing::NORTH); - if (dir == 1) level->setData(x, y, z, Facing::EAST); - if (dir == 2) level->setData(x, y, z, Facing::SOUTH); - if (dir == 3) level->setData(x, y, z, Facing::WEST); + level->setData(x, y, z, dir, Tile::UPDATE_CLIENTS); + + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } } void DispenserTile::onRemove(Level *level, int x, int y, int z, int id, int data) @@ -243,331 +221,33 @@ void DispenserTile::onRemove(Level *level, int x, int y, int z, int id, int data container->setItem(i,nullptr); } } + level->updateNeighbourForOutputSignal(x, y, z, id); } - EntityTile::onRemove(level, x, y, z, id, data); + BaseEntityTile::onRemove(level, x, y, z, id, data); } -void DispenserTile::throwItem(Level *level, shared_ptr item, Random *random, int accuracy, int xd, int zd, double xp, double yp, double zp) +Position *DispenserTile::getDispensePosition(BlockSource *source) { - shared_ptr itemEntity = shared_ptr(new ItemEntity(level, xp, yp - 0.3, zp, item)); + FacingEnum *facing = getFacing(source->getData()); - double pow = random->nextDouble() * 0.1 + 0.2; - itemEntity->xd = xd * pow; - itemEntity->yd = .2f; - itemEntity->zd = zd * pow; + double originX = source->getX() + 0.7 * facing->getStepX(); + double originY = source->getY() + 0.7 * facing->getStepY(); + double originZ = source->getZ() + 0.7 * facing->getStepZ(); - itemEntity->xd += (random->nextGaussian()) * 0.0075f * accuracy; - itemEntity->yd += (random->nextGaussian()) * 0.0075f * accuracy; - itemEntity->zd += (random->nextGaussian()) * 0.0075f * accuracy; - - level->addEntity(itemEntity); + return new PositionImpl(originX, originY, originZ); } -int DispenserTile::dispenseItem(shared_ptr trap, Level *level, shared_ptr item, Random *random, int x, int y, int z, int xd, int zd, double xp, double yp, double zp) +FacingEnum *DispenserTile::getFacing(int data) { - float power = 1.1f; - int accuracy = 6; - - // 4J-PB - moved to a switch - switch(item->id) - { - case Item::arrow_Id: - { - int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); - if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit - { - shared_ptr arrow = shared_ptr( new Arrow(level, xp, yp, zp) ); - arrow->shoot(xd, .1f, zd, power, (float) accuracy); - arrow->pickup = Arrow::PICKUP_ALLOWED; - level->addEntity(arrow); - level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); - return REMOVE_ITEM; - } - else - { - // some negative sound effect? - level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); - - // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs - return LEAVE_ITEM; - } - } - break; - case Item::egg_Id: - { - int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); - if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit - { - shared_ptr egg = shared_ptr( new ThrownEgg(level, xp, yp, zp) ); - egg->shoot(xd, .1f, zd, power, (float) accuracy); - level->addEntity(egg); - level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); - return REMOVE_ITEM; - } - else - { - // some negative sound effect? - level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); - - // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs - return LEAVE_ITEM; - } - } - break; - case Item::snowBall_Id: - { - int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); - if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit - { - shared_ptr snowball = shared_ptr( new Snowball(level, xp, yp, zp) ); - snowball->shoot(xd, .1f, zd, power, (float) accuracy); - level->addEntity(snowball); - level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); - return REMOVE_ITEM; - } - else - { - // some negative sound effect? - level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); - - // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs - return LEAVE_ITEM; - } - } - break; - case Item::potion_Id: - { - int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); - if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit - { - if(PotionItem::isThrowable(item->getAuxValue())) - { - shared_ptr potion = shared_ptr(new ThrownPotion(level, xp, yp, zp, item->getAuxValue())); - potion->shoot(xd, .1f, zd, power * 1.25f, accuracy * .5f); - level->addEntity(potion); - level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); - } - else - { - shared_ptr itemEntity = shared_ptr( new ItemEntity(level, xp, yp - 0.3, zp, item) ); - - double pow = random->nextDouble() * 0.1 + 0.2; - itemEntity->xd = xd * pow; - itemEntity->yd = .2f; - itemEntity->zd = zd * pow; - - itemEntity->xd += (random->nextGaussian()) * 0.0075f * accuracy; - itemEntity->yd += (random->nextGaussian()) * 0.0075f * accuracy; - itemEntity->zd += (random->nextGaussian()) * 0.0075f * accuracy; - - level->addEntity(itemEntity); - level->levelEvent(LevelEvent::SOUND_CLICK, x, y, z, 0); - } - return REMOVE_ITEM; - } - else - { - // some negative sound effect? - level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); - - // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs - return LEAVE_ITEM; - } - } - break; - case Item::expBottle_Id: - { - int currentProjectiles = level->countInstanceOf(eTYPE_PROJECTILE,false); - if(currentProjectiles < Level::MAX_DISPENSABLE_PROJECTILES) // 4J - added limit - { - shared_ptr expBottle = shared_ptr( new ThrownExpBottle(level, xp, yp, zp) ); - expBottle->shoot(xd, .1f, zd, power * 1.25f, accuracy * .5f); - level->addEntity(expBottle); - level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); - return REMOVE_ITEM; - } - else - { - // some negative sound effect? - level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); - - // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs - return LEAVE_ITEM; - } - } - break; - case Item::fireball_Id: // TU9 - { - int currentFireballs = level->countInstanceOf(eTYPE_SMALL_FIREBALL,true); - if(currentFireballs < Level::MAX_DISPENSABLE_FIREBALLS) // 4J - added limit - { - shared_ptr fireball = shared_ptr( new SmallFireball(level, xp + xd * .3, yp, zp + zd * .3, xd + random->nextGaussian() * .05, random->nextGaussian() * .05, zd + random->nextGaussian() * .05)); - level->addEntity(fireball); - level->levelEvent(LevelEvent::SOUND_BLAZE_FIREBALL, x, y, z, 0); - return REMOVE_ITEM; - } - else - { - // some negative sound effect? - level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); - - // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs - return LEAVE_ITEM; - } - } - break; - case Item::monsterPlacer_Id: - { - int iResult=0; - //MonsterPlacerItem *spawnEgg = (MonsterPlacerItem *)item->getItem(); - shared_ptr newEntity = MonsterPlacerItem::canSpawn(item->getAuxValue(), level,&iResult); - - shared_ptr mob = dynamic_pointer_cast(newEntity); - if (mob != NULL) - { - // 4J-PB - Changed the line below slightly since mobs were sticking to the dispenser rather than dropping down when fired - mob->moveTo(xp + xd * 0.4, yp - 0.3, zp + zd * 0.4, level->random->nextFloat() * 360, 0); - mob->finalizeMobSpawn(); - level->addEntity(mob); - level->levelEvent(LevelEvent::SOUND_LAUNCH, x, y, z, 0); - return REMOVE_ITEM; - } - else - { - // some negative sound effect? - level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); - - // not sending a message here, since we will probably get flooded with them when people have automatic dispensers for spawn eggs - return LEAVE_ITEM; - } - } - break; - case Item::bucket_lava_Id: - case Item::bucket_water_Id: - { - BucketItem *pBucket = (BucketItem *) item->getItem(); - - if (pBucket->emptyBucket(level, x, y, z, x + xd, y, z + zd)) - { - item->id = Item::bucket_empty_Id; - item->count = 1; - return LEAVE_ITEM; - } - return DISPENSE_ITEM; - } - break; - case Item::bucket_empty_Id: - { - int xt = x + xd; - int zt = z + zd; - Material *pMaterial=level->getMaterial(xt, y, zt); - int data = level->getData(xt, y, zt); - - if (pMaterial == Material::water && data == 0) - { - level->setTile(xt, y, zt, 0); - - if (--item->count == 0) - { - item->id = Item::bucket_water_Id; - item->count = 1; - } - else if (trap->addItem(shared_ptr(new ItemInstance(Item::bucket_water))) < 0) - { - throwItem(level, shared_ptr(new ItemInstance(Item::bucket_water)), random, 6, xd, zd, xp, yp, zp); - } - - return LEAVE_ITEM; - } - else if (pMaterial == Material::lava && data == 0) - { - level->setTile(xt, y, zt, 0); - - if (--item->count == 0) - { - item->id = Item::bucket_lava_Id; - item->count = 1; - } - else if (trap->addItem(shared_ptr(new ItemInstance(Item::bucket_lava))) < 0) - { - throwItem(level, shared_ptr(new ItemInstance(Item::bucket_lava)), random, 6, xd, zd, xp, yp, zp); - } - - return LEAVE_ITEM; - } - return DISPENSE_ITEM; - } - - break; - // TU12 - case Item::minecart_Id: - case Item::minecart_chest_Id: - case Item::minecart_furnace_Id: - { - xp = x + (xd < 0 ? xd * 0.8 : xd * 1.8f) + Mth::abs(zd) * 0.5f; - zp = z + (zd < 0 ? zd * 0.8 : zd * 1.8f) + Mth::abs(xd) * 0.5f; - - if (RailTile::isRail(level, x + xd, y, z + zd)) - { - yp = y + 0.5f; - } - else if (level->isEmptyTile(x + xd, y, z + zd) && RailTile::isRail(level, x + xd, y - 1, z + zd)) - { - yp = y - 0.5f; - } - else - { - return DISPENSE_ITEM; - } - - if( level->countInstanceOf(eTYPE_MINECART, true) < Level::MAX_CONSOLE_MINECARTS ) // 4J - added limit - { - shared_ptr minecart = shared_ptr(new Minecart(level, xp, yp, zp, ((MinecartItem *) item->getItem())->type)); - level->addEntity(minecart); - level->levelEvent(LevelEvent::SOUND_CLICK, x, y, z, 0); - - return REMOVE_ITEM; - } - else - { - return DISPENSE_ITEM; - } - } - break; - - case Item::boat_Id: - { - bool bLaunchBoat=false; - - xp = x + (xd < 0 ? xd * 0.8 : xd * 1.8f) + Mth::abs(zd) * 0.5f; - zp = z + (zd < 0 ? zd * 0.8 : zd * 1.8f) + Mth::abs(xd) * 0.5f; - - if (level->getMaterial(x + xd, y, z + zd) == Material::water) - { - bLaunchBoat=true; - yp = y + 1.0f; - } - else if (level->isEmptyTile(x + xd, y, z + zd) && level->getMaterial(x + xd, y - 1, z + zd) == Material::water) - { - bLaunchBoat=true; - yp = y; - } - - // check the limit on boats - if( bLaunchBoat && level->countInstanceOf(eTYPE_BOAT, true) < Level::MAX_XBOX_BOATS ) // 4J - added limit - { - shared_ptr boat = shared_ptr(new Boat(level, xp, yp, zp)); - level->addEntity(boat); - level->levelEvent(LevelEvent::SOUND_CLICK, x, y, z, 0); - return REMOVE_ITEM; - } - else - { - return DISPENSE_ITEM; - } - } - break; - } + return FacingEnum::fromData(data & FACING_MASK); +} - return DISPENSE_ITEM; +bool DispenserTile::hasAnalogOutputSignal() +{ + return true; } + +int DispenserTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + return AbstractContainerMenu::getRedstoneSignalFromContainer(dynamic_pointer_cast( level->getTileEntity(x, y, z)) ); +} \ No newline at end of file diff --git a/Minecraft.World/DispenserTile.h b/Minecraft.World/DispenserTile.h index 5bc892aa..1205be94 100644 --- a/Minecraft.World/DispenserTile.h +++ b/Minecraft.World/DispenserTile.h @@ -1,21 +1,20 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" +#include "net.minecraft.core.h" class Player; class Mob; class ChunkRebuildData; -class DispenserTile : public EntityTile + +class DispenserTile : public BaseEntityTile { friend class Tile; friend class ChunkRebuildData; -private: - static const int DISPENSE_ITEM = 0; - static const int REMOVE_ITEM = 1; - static const int LEAVE_ITEM = 2; - public: static const int FACING_MASK = 0x7; + static const int TRIGGER_BIT = 8; + static BehaviorRegistry REGISTRY; protected: Random *random; @@ -28,31 +27,31 @@ protected: DispenserTile(int id); public: - virtual int getTickDelay(); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual void onPlace(Level *level, int x, int y, int z); + virtual int getTickDelay(Level *level); + virtual void onPlace(Level *level, int x, int y, int z); private: void recalcLockDir(Level *level, int x, int y, int z); public: virtual Icon *getTexture(int face, int data); - //@Override - void registerIcons(IconRegister *iconRegister); + virtual void registerIcons(IconRegister *iconRegister); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param -private: - void fireArrow(Level *level, int x, int y, int z, Random *random); +protected: + virtual void dispenseFrom(Level *level, int x, int y, int z); + virtual DispenseItemBehavior *getDispenseMethod(shared_ptr item); public: virtual void neighborChanged(Level *level, int x, int y, int z, int type); - virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void tick(Level *level, int x, int y, int z, Random *random); virtual shared_ptr newTileEntity(Level *level); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); -private: - static void throwItem(Level *level, shared_ptr item, Random *random, int accuracy, int xd, int zd, double xp, double yp, double zp); - static int dispenseItem(shared_ptr trap, Level *level, shared_ptr item, Random *random, int x, int y, int z, int xd, int zd, double xp, double yp, double zp); + static Position *getDispensePosition(BlockSource *source); + static FacingEnum *getFacing(int data); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); }; \ No newline at end of file diff --git a/Minecraft.World/DispenserTileEntity.cpp b/Minecraft.World/DispenserTileEntity.cpp index 2c4705ea..b087e535 100644 --- a/Minecraft.World/DispenserTileEntity.cpp +++ b/Minecraft.World/DispenserTileEntity.cpp @@ -1,5 +1,3 @@ -using namespace std; - #include "stdafx.h" #include "com.mojang.nbt.h" #include "TileEntity.h" @@ -13,14 +11,14 @@ using namespace std; DispenserTileEntity::DispenserTileEntity() : TileEntity() { - items = new ItemInstanceArray(9); + items = ItemInstanceArray(9); random = new Random(); + name = L""; } DispenserTileEntity::~DispenserTileEntity() { - delete[] items->data; - delete items; + delete[] items.data; delete random; } @@ -32,27 +30,27 @@ unsigned int DispenserTileEntity::getContainerSize() shared_ptr DispenserTileEntity::getItem(unsigned int slot) { - return items->data[slot]; + return items[slot]; } shared_ptr DispenserTileEntity::removeItem(unsigned int slot, int count) { - if (items->data[slot] != NULL) + if (items[slot] != NULL) { - if (items->data[slot]->count <= count) + if (items[slot]->count <= count) { - shared_ptr item = items->data[slot]; - items->data[slot] = nullptr; - this->setChanged(); + shared_ptr item = items[slot]; + items[slot] = nullptr; + setChanged(); // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; } else { - shared_ptr i = items->data[slot]->remove(count); - if (items->data[slot]->count == 0) items->data[slot] = nullptr; - this->setChanged(); + shared_ptr i = items[slot]->remove(count); + if (items[slot]->count == 0) items[slot] = nullptr; + setChanged(); // 4J Stu - Fix for duplication glitch if(i->count <= 0) return nullptr; return i; @@ -63,10 +61,10 @@ shared_ptr DispenserTileEntity::removeItem(unsigned int slot, int shared_ptr DispenserTileEntity::removeItemNoUpdate(int slot) { - if (items->data[slot] != NULL) + if (items[slot] != NULL) { - shared_ptr item = items->data[slot]; - items->data[slot] = nullptr; + shared_ptr item = items[slot]; + items[slot] = nullptr; return item; } return nullptr; @@ -75,20 +73,20 @@ shared_ptr DispenserTileEntity::removeItemNoUpdate(int slot) // 4J-PB added for spawn eggs not being useable due to limits, so add them in again void DispenserTileEntity::AddItemBack(shared_ptritem, unsigned int slot) { - if (items->data[slot] != NULL) + if (items[slot] != NULL) { // just increment the count of the items - if(item->id==items->data[slot]->id) + if(item->id==items[slot]->id) { - items->data[slot]->count++; - this->setChanged(); + items[slot]->count++; + setChanged(); } } else { - items->data[slot] = item; + items[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); - this->setChanged(); + setChanged(); } } /** @@ -99,9 +97,9 @@ void DispenserTileEntity::AddItemBack(shared_ptritem, unsigned int */ bool DispenserTileEntity::removeProjectile(int itemId) { - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if (items->data[i] != NULL && items->data[i]->id == itemId) + if (items[i] != NULL && items[i]->id == itemId) { shared_ptr removedItem = removeItem(i, 1); return removedItem != NULL; @@ -114,9 +112,9 @@ int DispenserTileEntity::getRandomSlot() { int replaceSlot = -1; int replaceOdds = 1; - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if (items->data[i] != NULL && random->nextInt(replaceOdds++) == 0) + if (items[i] != NULL && random->nextInt(replaceOdds++) == 0) { replaceSlot = i; } @@ -127,18 +125,18 @@ int DispenserTileEntity::getRandomSlot() void DispenserTileEntity::setItem(unsigned int slot, shared_ptr item) { - items->data[slot] = item; + items[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); - this->setChanged(); + setChanged(); } int DispenserTileEntity::addItem(shared_ptr item) { - for (int i = 0; i < items->length; i++) + for (int i = 0; i < items.length; i++) { - if ((*items)[i] == NULL || (*items)[i]->id == 0) + if (items[i] == NULL || items[i]->id == 0) { - (*items)[i] = item; + setItem(i, item); return i; } } @@ -146,22 +144,39 @@ int DispenserTileEntity::addItem(shared_ptr item) return -1; } -int DispenserTileEntity::getName() +wstring DispenserTileEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_TILE_DISPENSER); +} + +wstring DispenserTileEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +void DispenserTileEntity::setCustomName(const wstring &name) { - return IDS_TILE_DISPENSER; + this->name = name; +} + +bool DispenserTileEntity::hasCustomName() +{ + return !name.empty(); } void DispenserTileEntity::load(CompoundTag *base) { TileEntity::load(base); ListTag *inventoryList = (ListTag *) base->getList(L"Items"); - items = new ItemInstanceArray(getContainerSize()); + delete [] items.data; + items = ItemInstanceArray(getContainerSize()); for (int i = 0; i < inventoryList->size(); i++) { CompoundTag *tag = inventoryList->get(i); unsigned int slot = tag->getByte(L"Slot") & 0xff; - if (slot >= 0 && slot < items->length) (*items)[slot] = ItemInstance::fromTag(tag); + if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); } + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); } void DispenserTileEntity::save(CompoundTag *base) @@ -169,17 +184,18 @@ void DispenserTileEntity::save(CompoundTag *base) TileEntity::save(base); ListTag *listTag = new ListTag; - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if (items->data[i] != NULL) + if (items[i] != NULL) { CompoundTag *tag = new CompoundTag(); tag->putByte(L"Slot", (byte) i); - items->data[i]->save(tag); + items[i]->save(tag); listTag->add(tag); } } base->put(L"Items", listTag); + if (hasCustomName()) base->putString(L"CustomName", name); } int DispenserTileEntity::getMaxStackSize() @@ -207,17 +223,22 @@ void DispenserTileEntity::stopOpen() { } +bool DispenserTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + // 4J Added shared_ptr DispenserTileEntity::clone() { shared_ptr result = shared_ptr( new DispenserTileEntity() ); TileEntity::clone(result); - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if (items->data[i] != NULL) + if (items[i] != NULL) { - result->items->data[i] = ItemInstance::clone(items->data[i]); + result->items[i] = ItemInstance::clone(items[i]); } } return result; diff --git a/Minecraft.World/DispenserTileEntity.h b/Minecraft.World/DispenserTileEntity.h index 8519ad54..fc0c1f39 100644 --- a/Minecraft.World/DispenserTileEntity.h +++ b/Minecraft.World/DispenserTileEntity.h @@ -18,12 +18,15 @@ public: static TileEntity *create() { return new DispenserTileEntity(); } -using TileEntity::setChanged; + using TileEntity::setChanged; private: - ItemInstanceArray *items; + ItemInstanceArray items; Random *random; +protected: + wstring name; + public: DispenserTileEntity(); virtual ~DispenserTileEntity(); @@ -31,20 +34,24 @@ public: virtual unsigned int getContainerSize(); virtual shared_ptr getItem(unsigned int slot); virtual shared_ptr removeItem(unsigned int slot, int count); - shared_ptr removeItemNoUpdate(int slot); - bool removeProjectile(int itemId); - int getRandomSlot(); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual bool removeProjectile(int itemId); + virtual int getRandomSlot(); virtual void setItem(unsigned int slot, shared_ptr item); virtual int addItem(shared_ptr item); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual void setCustomName(const wstring &name); + virtual bool hasCustomName(); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); virtual int getMaxStackSize(); virtual bool stillValid(shared_ptr player); virtual void setChanged(); - void startOpen(); - void stopOpen(); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/DoorItem.cpp b/Minecraft.World/DoorItem.cpp index d59ac8d9..97de0f65 100644 --- a/Minecraft.World/DoorItem.cpp +++ b/Minecraft.World/DoorItem.cpp @@ -28,7 +28,7 @@ bool DoorItem::useOn(shared_ptr instance, shared_ptr playe if (material == Material::wood) tile = Tile::door_wood; else tile = Tile::door_iron; - if (!player->mayBuild(x, y, z) || !player->mayBuild(x, y + 1, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance) || !player->mayUseItemAt(x, y + 1, z, face, instance)) return false; if (!tile->mayPlace(level, x, y, z)) return false; // 4J-PB - Adding a test only version to allow tooltips to be displayed @@ -65,10 +65,8 @@ void DoorItem::place(Level *level, int x, int y, int z, int dir, Tile *tile) if (doorLeft && !doorRight) flip = true; else if (solidRight > solidLeft) flip = true; - level->noNeighborUpdate = true; - level->setTileAndData(x, y, z, tile->id, dir); - level->setTileAndData(x, y + 1, z, tile->id, 8 | (flip ? 1 : 0)); - level->noNeighborUpdate = false; + level->setTileAndData(x, y, z, tile->id, dir, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y + 1, z, tile->id, 8 | (flip ? 1 : 0), Tile::UPDATE_CLIENTS); level->updateNeighborsAt(x, y, z, tile->id); level->updateNeighborsAt(x, y + 1, z, tile->id); } diff --git a/Minecraft.World/DoorTile.cpp b/Minecraft.World/DoorTile.cpp index be31be27..8b70e6d9 100644 --- a/Minecraft.World/DoorTile.cpp +++ b/Minecraft.World/DoorTile.cpp @@ -12,8 +12,6 @@ const wstring DoorTile::TEXTURES[] = { L"doorWood_lower", L"doorWood_upper", L"d DoorTile::DoorTile(int id, Material *material) : Tile(id, material,isSolidRender()) { - icons = NULL; - if (material == Material::metal) { texBase = 2; @@ -30,12 +28,12 @@ DoorTile::DoorTile(int id, Material *material) : Tile(id, material,isSolidRender Icon *DoorTile::getTexture(int face, int data) { - return icons[texBase]; + return iconBottom[TEXTURE_NORMAL]; } Icon *DoorTile::getTexture(LevelSource *level, int x, int y, int z, int face) { - if (face == Facing::UP || face == Facing::DOWN) return icons[texBase]; + if (face == Facing::UP || face == Facing::DOWN) return iconBottom[TEXTURE_NORMAL]; int compositeData = getCompositeData(level, x, y, z); int dir = compositeData & C_DIR_MASK; @@ -59,18 +57,22 @@ Icon *DoorTile::getTexture(LevelSource *level, int x, int y, int z, int face) if ((compositeData & C_RIGHT_HINGE_MASK) != 0) flip = !flip; } - return icons[texBase + (flip ? DOOR_TILE_TEXTURE_COUNT : 0) + (upper ? 1 : 0)]; + if (upper) + { + return iconTop[flip ? TEXTURE_FLIPPED : TEXTURE_NORMAL]; + } + else + { + return iconBottom[flip ? TEXTURE_FLIPPED : TEXTURE_NORMAL]; + } } void DoorTile::registerIcons(IconRegister *iconRegister) { - icons = new Icon*[DOOR_TILE_TEXTURE_COUNT * 2]; - - for (int i = 0; i < DOOR_TILE_TEXTURE_COUNT; i++) - { - icons[i] = iconRegister->registerIcon(TEXTURES[i]); - icons[i + DOOR_TILE_TEXTURE_COUNT] = new FlippedIcon(icons[i], true, false); - } + iconTop[TEXTURE_NORMAL] = iconRegister->registerIcon(getIconName() + L"_upper"); + iconBottom[TEXTURE_NORMAL] = iconRegister->registerIcon(getIconName() + L"_lower"); + iconTop[TEXTURE_FLIPPED] = new FlippedIcon(iconTop[TEXTURE_NORMAL], true, false); + iconBottom[TEXTURE_FLIPPED] = new FlippedIcon(iconBottom[TEXTURE_NORMAL], true, false); } bool DoorTile::blocksLight() @@ -177,12 +179,12 @@ void DoorTile::attack(Level *level, int x, int y, int z, shared_ptr play // 4J-PB - Adding a TestUse for tooltip display bool DoorTile::TestUse() { - return true; + return id == Tile::door_wood_Id; } bool DoorTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { - if(soundOnly) + if (soundOnly) { // 4J - added - just do enough to play the sound if (material != Material::metal) @@ -199,12 +201,12 @@ bool DoorTile::use(Level *level, int x, int y, int z, shared_ptr player, lowerData ^= 4; if ((compositeData & C_IS_UPPER_MASK) == 0) { - level->setData(x, y, z, lowerData);//, Tile.UPDATE_CLIENTS); + level->setData(x, y, z, lowerData, Tile::UPDATE_CLIENTS); level->setTilesDirty(x, y, z, x, y, z); } else { - level->setData(x, y - 1, z, lowerData);//, Tile.UPDATE_CLIENTS); + level->setData(x, y - 1, z, lowerData, Tile::UPDATE_CLIENTS); level->setTilesDirty(x, y - 1, z, x, y, z); } @@ -222,12 +224,12 @@ void DoorTile::setOpen(Level *level, int x, int y, int z, bool shouldOpen) lowerData ^= 4; if ((compositeData & C_IS_UPPER_MASK) == 0) { - level->setData(x, y, z, lowerData);//, Tile.UPDATE_CLIENTS); + level->setData(x, y, z, lowerData, Tile::UPDATE_CLIENTS); level->setTilesDirty(x, y, z, x, y, z); } else { - level->setData(x, y - 1, z, lowerData);//, Tile.UPDATE_CLIENTS); + level->setData(x, y - 1, z, lowerData, Tile::UPDATE_CLIENTS); level->setTilesDirty(x, y - 1, z, x, y, z); } @@ -242,16 +244,16 @@ void DoorTile::neighborChanged(Level *level, int x, int y, int z, int type) bool spawn = false; if (level->getTile(x, y + 1, z) != id) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); spawn = true; } if (!level->isSolidBlockingTile(x, y - 1, z)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); spawn = true; if (level->getTile(x, y + 1, z) == id) { - level->setTile(x, y + 1, z, 0); + level->removeTile(x, y + 1, z); } } if (spawn) @@ -274,7 +276,7 @@ void DoorTile::neighborChanged(Level *level, int x, int y, int z, int type) { if (level->getTile(x, y - 1, z) != id) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } if (type > 0 && type != id) { @@ -339,3 +341,17 @@ int DoorTile::cloneTileId(Level *level, int x, int y, int z) { return material == Material::metal ? Item::door_iron_Id : Item::door_wood_Id; } + +void DoorTile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player) +{ + if (player->abilities.instabuild) + { + if ((data & UPPER_BIT) != 0) + { + if (level->getTile(x, y - 1, z) == id) + { + level->removeTile(x, y - 1, z); + } + } + } +} \ No newline at end of file diff --git a/Minecraft.World/DoorTile.h b/Minecraft.World/DoorTile.h index 59a8b414..a4e4f62f 100644 --- a/Minecraft.World/DoorTile.h +++ b/Minecraft.World/DoorTile.h @@ -10,6 +10,11 @@ class DoorTile : public Tile { friend class Tile; friend class ChunkRebuildData; + +private: + static const int TEXTURE_NORMAL = 0; + static const int TEXTURE_FLIPPED = 1; + public: static const int UPPER_BIT = 8; static const int C_DIR_MASK = 3; @@ -22,16 +27,15 @@ private: static const int DOOR_TILE_TEXTURE_COUNT = 4; static const wstring TEXTURES[]; int texBase; - Icon **icons; + Icon *iconTop[2]; + Icon *iconBottom[2]; protected: DoorTile(int id, Material *material); public: virtual Icon *getTexture(int face, int data); - //@Override - Icon *getTexture(LevelSource *level, int x, int y, int z, int face); - //@Override - void registerIcons(IconRegister *iconRegister); + virtual Icon *getTexture(LevelSource *level, int x, int y, int z, int face); + virtual void registerIcons(IconRegister *iconRegister); virtual bool blocksLight(); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); @@ -57,4 +61,5 @@ public: virtual int getPistonPushReaction(); int getCompositeData(LevelSource *level, int x, int y, int z); virtual int cloneTileId(Level *level, int x, int y, int z); + virtual void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player); }; diff --git a/Minecraft.World/DoubleTag.h b/Minecraft.World/DoubleTag.h index 130c3ebb..1f768d5b 100644 --- a/Minecraft.World/DoubleTag.h +++ b/Minecraft.World/DoubleTag.h @@ -10,7 +10,7 @@ public: DoubleTag(const wstring &name, double data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeDouble(data); } - void load(DataInput *dis) { data = dis->readDouble(); } + void load(DataInput *dis, int tagDepth) { data = dis->readDouble(); } byte getId() { return TAG_Double; } wstring toString() diff --git a/Minecraft.World/DragonFireball.cpp b/Minecraft.World/DragonFireball.cpp index e3b5d579..32524592 100644 --- a/Minecraft.World/DragonFireball.cpp +++ b/Minecraft.World/DragonFireball.cpp @@ -17,7 +17,7 @@ DragonFireball::DragonFireball(Level *level) : Fireball(level) setSize(5 / 16.0f, 5 / 16.0f); } -DragonFireball::DragonFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) +DragonFireball::DragonFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) { setSize(5 / 16.0f, 5 / 16.0f); } @@ -32,7 +32,7 @@ void DragonFireball::onHit(HitResult *res) if (!level->isClientSide) { AABB *aoe = bb->grow(SPLASH_RANGE, SPLASH_RANGE / 2, SPLASH_RANGE); - vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(Mob), aoe); + vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(LivingEntity), aoe); if (entitiesOfClass != NULL && !entitiesOfClass->empty()) { @@ -40,7 +40,7 @@ void DragonFireball::onHit(HitResult *res) for( AUTO_VAR(it, entitiesOfClass->begin()); it != entitiesOfClass->end(); ++it) { //shared_ptr e = *it; - shared_ptr e = dynamic_pointer_cast( *it ); + shared_ptr e = dynamic_pointer_cast( *it ); double dist = distanceToSqr(e); if (dist < SPLASH_RANGE_SQ) { @@ -65,22 +65,17 @@ bool DragonFireball::isPickable() return false; } -bool DragonFireball::hurt(DamageSource *source, int damage) +bool DragonFireball::hurt(DamageSource *source, float damage) { return false; } -bool DragonFireball::shouldBurn() -{ - return false; -} - -int DragonFireball::getIcon() +ePARTICLE_TYPE DragonFireball::getTrailParticleType() { - return 15 + 14 * 16; + return eParticleType_dragonbreath; } -ePARTICLE_TYPE DragonFireball::getTrailParticleType() +bool DragonFireball::shouldBurn() { - return eParticleType_dragonbreath; + return false; } \ No newline at end of file diff --git a/Minecraft.World/DragonFireball.h b/Minecraft.World/DragonFireball.h index 9ce199ed..a7fe1f1f 100644 --- a/Minecraft.World/DragonFireball.h +++ b/Minecraft.World/DragonFireball.h @@ -18,7 +18,7 @@ private: public: DragonFireball(Level *level); - DragonFireball(Level *level, shared_ptr mob, double xa, double ya, double za); + DragonFireball(Level *level, shared_ptr mob, double xa, double ya, double za); DragonFireball(Level *level, double x, double y, double z, double xa, double ya, double za); protected: @@ -26,12 +26,11 @@ protected: public: virtual bool isPickable(); - virtual bool hurt(DamageSource *source, int damage); - - virtual bool shouldBurn(); - virtual int getIcon(); + virtual bool hurt(DamageSource *source, float damage); protected: // 4J Added TU9 virtual ePARTICLE_TYPE getTrailParticleType(); + + virtual bool shouldBurn(); }; \ No newline at end of file diff --git a/Minecraft.World/DropperTile.cpp b/Minecraft.World/DropperTile.cpp new file mode 100644 index 00000000..a28228c9 --- /dev/null +++ b/Minecraft.World/DropperTile.cpp @@ -0,0 +1,74 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.h" +#include "net.minecraft.world.h" +#include "net.minecraft.core.h" +#include "DropperTile.h" + +DropperTile::DropperTile(int id) : DispenserTile(id) +{ + DISPENSE_BEHAVIOUR = new DefaultDispenseItemBehavior(); +} + +void DropperTile::registerIcons(IconRegister *iconRegister) +{ + icon = iconRegister->registerIcon(L"furnace_side"); + iconTop = iconRegister->registerIcon(L"furnace_top"); + iconFront = iconRegister->registerIcon(getIconName() + L"_front_horizontal"); + iconFrontVertical = iconRegister->registerIcon(getIconName() + L"_front_vertical"); +} + +DispenseItemBehavior *DropperTile::getDispenseMethod(shared_ptr item) +{ + return DISPENSE_BEHAVIOUR; +} + +shared_ptr DropperTile::newTileEntity(Level *level) +{ + return shared_ptr( new DropperTileEntity() ); +} + +void DropperTile::dispenseFrom(Level *level, int x, int y, int z) +{ + BlockSourceImpl source(level, x, y, z); + shared_ptr trap = dynamic_pointer_cast( source.getEntity() ); + if (trap == NULL) return; + + int slot = trap->getRandomSlot(); + if (slot < 0) + { + level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); + } + else + { + shared_ptr item = trap->getItem(slot); + int face = level->getData(x, y, z) & DispenserTile::FACING_MASK; + shared_ptr into = HopperTileEntity::getContainerAt(level, x + Facing::STEP_X[face], y + Facing::STEP_Y[face], z + Facing::STEP_Z[face]); + shared_ptr remaining = nullptr; + + if (into != NULL) + { + remaining = HopperTileEntity::addItem(into.get(), item->copy()->remove(1), Facing::OPPOSITE_FACING[face]); + + if (remaining == NULL) + { + remaining = item->copy(); + if (--remaining->count == 0) remaining = nullptr; + } + else + { + // placing one item failed, so restore original count + remaining = item->copy(); + } + } + else + { + remaining = DISPENSE_BEHAVIOUR->dispense(&source, item); + if (remaining != NULL && remaining->count == 0) remaining = nullptr; + } + + trap->setItem(slot, remaining); + } +} \ No newline at end of file diff --git a/Minecraft.World/DropperTile.h b/Minecraft.World/DropperTile.h new file mode 100644 index 00000000..7769abde --- /dev/null +++ b/Minecraft.World/DropperTile.h @@ -0,0 +1,23 @@ +#pragma once + +#include "DispenserTile.h" + +class DropperTile : public DispenserTile +{ +private: + DispenseItemBehavior *DISPENSE_BEHAVIOUR; + +public: + DropperTile(int id); + + virtual void registerIcons(IconRegister *iconRegister); + +protected: + virtual DispenseItemBehavior *getDispenseMethod(shared_ptr item); + +public: + virtual shared_ptr newTileEntity(Level *level); + +protected: + virtual void dispenseFrom(Level *level, int x, int y, int z); +}; \ No newline at end of file diff --git a/Minecraft.World/DropperTileEntity.cpp b/Minecraft.World/DropperTileEntity.cpp new file mode 100644 index 00000000..51bf6abf --- /dev/null +++ b/Minecraft.World/DropperTileEntity.cpp @@ -0,0 +1,19 @@ +#include "stdafx.h" + +#include "DropperTileEntity.h" + +wstring DropperTileEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_CONTAINER_DROPPER); +} + +// 4J Added +shared_ptr DropperTileEntity::clone() +{ + shared_ptr result = shared_ptr( new DropperTileEntity() ); + TileEntity::clone(result); + + result->name = name; + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/DropperTileEntity.h b/Minecraft.World/DropperTileEntity.h new file mode 100644 index 00000000..d04113c8 --- /dev/null +++ b/Minecraft.World/DropperTileEntity.h @@ -0,0 +1,15 @@ +#pragma once + +#include "DispenserTileEntity.h" + +class DropperTileEntity : public DispenserTileEntity +{ +public: + eINSTANCEOF GetType() { return eTYPE_DROPPERTILEENTITY; } + static TileEntity *create() { return new DropperTileEntity(); } + // 4J Added + virtual shared_ptr clone(); + +public: + wstring getName(); +}; \ No newline at end of file diff --git a/Minecraft.World/DummyCriteria.cpp b/Minecraft.World/DummyCriteria.cpp new file mode 100644 index 00000000..5ae7dad9 --- /dev/null +++ b/Minecraft.World/DummyCriteria.cpp @@ -0,0 +1,24 @@ +#include "stdafx.h" + +#include "DummyCriteria.h" + +DummyCriteria::DummyCriteria(const wstring &name) +{ + this->name = name; + ObjectiveCriteria::CRITERIA_BY_NAME[name] = this; +} + +wstring DummyCriteria::getName() +{ + return name; +} + +int DummyCriteria::getScoreModifier(vector > *players) +{ + return 0; +} + +bool DummyCriteria::isReadOnly() +{ + return false; +} \ No newline at end of file diff --git a/Minecraft.World/DummyCriteria.h b/Minecraft.World/DummyCriteria.h new file mode 100644 index 00000000..6d2fc12c --- /dev/null +++ b/Minecraft.World/DummyCriteria.h @@ -0,0 +1,16 @@ +#pragma once + +#include "ObjectiveCriteria.h" + +class DummyCriteria : public ObjectiveCriteria +{ +private: + wstring name; + +public: + DummyCriteria(const wstring &name); + + virtual wstring getName(); + virtual int getScoreModifier(vector > *players); + virtual bool isReadOnly(); +}; \ No newline at end of file diff --git a/Minecraft.World/DungeonFeature.cpp b/Minecraft.World/DungeonFeature.cpp index cefc49ca..6c7dc673 100644 --- a/Minecraft.World/DungeonFeature.cpp +++ b/Minecraft.World/DungeonFeature.cpp @@ -10,182 +10,182 @@ void DungeonFeature::addRoom(int xOffs, int zOffs, byteArray blocks, double xRoo void DungeonFeature::addTunnel(int xOffs, int zOffs, byteArray blocks, double xCave, double yCave, double zCave, float thickness, float yRot, float xRot, int step, int dist, double yScale) { - double xMid = xOffs * 16 + 8; - double zMid = zOffs * 16 + 8; + double xMid = xOffs * 16 + 8; + double zMid = zOffs * 16 + 8; - float yRota = 0; - float xRota = 0; - Random *random = new Random(this->random->nextLong()); + float yRota = 0; + float xRota = 0; + Random *random = new Random(this->random->nextLong()); - if (dist <= 0) + if (dist <= 0) { - int max = radius * 16 - 16; - dist = max - random->nextInt(max / 4); - } - bool singleStep = false; + int max = radius * 16 - 16; + dist = max - random->nextInt(max / 4); + } + bool singleStep = false; - if (step == -1) + if (step == -1) { - step = dist / 2; - singleStep = true; - } + step = dist / 2; + singleStep = true; + } - int splitPoint = random->nextInt(dist / 2) + dist / 4; - bool steep = random->nextInt(6) == 0; + int splitPoint = random->nextInt(dist / 2) + dist / 4; + bool steep = random->nextInt(6) == 0; - for (; step < dist; step++) + for (; step < dist; step++) { - double rad = 1.5 + (Mth::sin(step * PI / dist) * thickness) * 1; - double yRad = rad * yScale; + double rad = 1.5 + (Mth::sin(step * PI / dist) * thickness) * 1; + double yRad = rad * yScale; - float xc = Mth::cos(xRot); - float xs = Mth::sin(xRot); - xCave += Mth::cos(yRot) * xc; - yCave += xs; - zCave += Mth::sin(yRot) * xc; + float xc = Mth::cos(xRot); + float xs = Mth::sin(xRot); + xCave += Mth::cos(yRot) * xc; + yCave += xs; + zCave += Mth::sin(yRot) * xc; - if (steep) + if (steep) { - xRot *= 0.92f; - } + xRot *= 0.92f; + } else { - xRot *= 0.7f; - } - xRot += xRota * 0.1f; - yRot += yRota * 0.1f; + xRot *= 0.7f; + } + xRot += xRota * 0.1f; + yRot += yRota * 0.1f; - xRota *= 0.90f; - yRota *= 0.75f; - xRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 2; - yRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 4; + xRota *= 0.90f; + yRota *= 0.75f; + xRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 2; + yRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 4; - if (!singleStep && step == splitPoint && thickness > 1) + if (!singleStep && step == splitPoint && thickness > 1) { - addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, random->nextFloat() * 0.5f + 0.5f, yRot - PI / 2, xRot / 3, step, dist, 1.0); - addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, random->nextFloat() * 0.5f + 0.5f, yRot + PI / 2, xRot / 3, step, dist, 1.0); - return; - } - if (!singleStep && random->nextInt(4) == 0) continue; - - { - double xd = xCave - xMid; - double zd = zCave - zMid; - double remaining = dist - step; - double rr = (thickness + 2) + 16; - if (xd * xd + zd * zd - (remaining * remaining) > rr * rr) + addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, random->nextFloat() * 0.5f + 0.5f, yRot - PI / 2, xRot / 3, step, dist, 1.0); + addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, random->nextFloat() * 0.5f + 0.5f, yRot + PI / 2, xRot / 3, step, dist, 1.0); + return; + } + if (!singleStep && random->nextInt(4) == 0) continue; + + { + double xd = xCave - xMid; + double zd = zCave - zMid; + double remaining = dist - step; + double rr = (thickness + 2) + 16; + if (xd * xd + zd * zd - (remaining * remaining) > rr * rr) { - return; - } - } + return; + } + } - if (xCave < xMid - 16 - rad * 2 || zCave < zMid - 16 - rad * 2 || xCave > xMid + 16 + rad * 2 || zCave > zMid + 16 + rad * 2) continue; + if (xCave < xMid - 16 - rad * 2 || zCave < zMid - 16 - rad * 2 || xCave > xMid + 16 + rad * 2 || zCave > zMid + 16 + rad * 2) continue; - int x0 = Mth::floor(xCave - rad) - xOffs * 16 - 1; - int x1 = Mth::floor(xCave + rad) - xOffs * 16 + 1; + int x0 = Mth::floor(xCave - rad) - xOffs * 16 - 1; + int x1 = Mth::floor(xCave + rad) - xOffs * 16 + 1; - int y0 = Mth::floor(yCave - yRad) - 1; - int y1 = Mth::floor(yCave + yRad) + 1; + int y0 = Mth::floor(yCave - yRad) - 1; + int y1 = Mth::floor(yCave + yRad) + 1; - int z0 = Mth::floor(zCave - rad) - zOffs * 16 - 1; - int z1 = Mth::floor(zCave + rad) - zOffs * 16 + 1; + int z0 = Mth::floor(zCave - rad) - zOffs * 16 - 1; + int z1 = Mth::floor(zCave + rad) - zOffs * 16 + 1; - if (x0 < 0) x0 = 0; - if (x1 > 16) x1 = 16; + if (x0 < 0) x0 = 0; + if (x1 > 16) x1 = 16; - if (y0 < 1) y0 = 1; - if (y1 > Level::genDepth - 8) y1 = Level::genDepth - 8; + if (y0 < 1) y0 = 1; + if (y1 > Level::genDepth - 8) y1 = Level::genDepth - 8; - if (z0 < 0) z0 = 0; - if (z1 > 16) z1 = 16; + if (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; - bool detectedWater = false; - for (int xx = x0; !detectedWater && xx < x1; xx++) + bool detectedWater = false; + for (int xx = x0; !detectedWater && xx < x1; xx++) { - for (int zz = z0; !detectedWater && zz < z1; zz++) + for (int zz = z0; !detectedWater && zz < z1; zz++) { - for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) + for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) { - int p = (xx * 16 + zz) * Level::genDepth + yy; + int p = (xx * 16 + zz) * Level::genDepth + yy; if (yy < 0 || yy >= Level::genDepth) continue; - if (blocks[p] == Tile::water_Id || blocks[p] == Tile::calmWater_Id) + if (blocks[p] == Tile::water_Id || blocks[p] == Tile::calmWater_Id) { - detectedWater = true; - } - if (yy != y0 - 1 && xx != x0 && xx != x1 - 1 && zz != z0 && zz != z1 - 1) + detectedWater = true; + } + if (yy != y0 - 1 && xx != x0 && xx != x1 - 1 && zz != z0 && zz != z1 - 1) { - yy = y0; - } - } - } - } - if (detectedWater) continue; - - for (int xx = x0; xx < x1; xx++) + yy = y0; + } + } + } + } + if (detectedWater) continue; + + for (int xx = x0; xx < x1; xx++) { - double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; - for (int zz = z0; zz < z1; zz++) + double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; + for (int zz = z0; zz < z1; zz++) { - double zd = ((zz + zOffs * 16 + 0.5) - zCave) / rad; - int p = (xx * 16 + zz) * Level::genDepth + y1; - bool hasGrass = false; - for (int yy = y1 - 1; yy >= y0; yy--) + double zd = ((zz + zOffs * 16 + 0.5) - zCave) / rad; + int p = (xx * 16 + zz) * Level::genDepth + y1; + bool hasGrass = false; + for (int yy = y1 - 1; yy >= y0; yy--) { - double yd = (yy + 0.5 - yCave) / yRad; - if (yd > -0.7 && xd * xd + yd * yd + zd * zd < 1) + double yd = (yy + 0.5 - yCave) / yRad; + if (yd > -0.7 && xd * xd + yd * yd + zd * zd < 1) { - int block = blocks[p]; - if (block == Tile::grass_Id) hasGrass = true; - if (block == Tile::rock_Id || block == Tile::dirt_Id || block == Tile::grass_Id) + int block = blocks[p]; + if (block == Tile::grass_Id) hasGrass = true; + if (block == Tile::stone_Id || block == Tile::dirt_Id || block == Tile::grass_Id) { - if (yy < 10) + if (yy < 10) { - blocks[p] = (byte) Tile::lava_Id; - } + blocks[p] = (byte) Tile::lava_Id; + } else { - blocks[p] = (byte) 0; - if (hasGrass && blocks[p - 1] == Tile::dirt_Id) blocks[p - 1] = (byte) Tile::grass_Id; - } - } - } - p--; - } - } - } - if (singleStep) break; - } + blocks[p] = (byte) 0; + if (hasGrass && blocks[p - 1] == Tile::dirt_Id) blocks[p - 1] = (byte) Tile::grass_Id; + } + } + } + p--; + } + } + } + if (singleStep) break; + } } void DungeonFeature::addFeature(Level *level, int x, int z, int xOffs, int zOffs, byteArray blocks) { - int caves = random->nextInt(random->nextInt(random->nextInt(40) + 1) + 1); - if (random->nextInt(15) != 0) caves = 0; + int caves = random->nextInt(random->nextInt(random->nextInt(40) + 1) + 1); + if (random->nextInt(15) != 0) caves = 0; - for (int cave = 0; cave < caves; cave++) + for (int cave = 0; cave < caves; cave++) { - double xCave = x * 16 + random->nextInt(16); - double yCave = random->nextInt(random->nextInt(Level::genDepth - 8) + 8); - double zCave = z * 16 + random->nextInt(16); + double xCave = x * 16 + random->nextInt(16); + double yCave = random->nextInt(random->nextInt(Level::genDepth - 8) + 8); + double zCave = z * 16 + random->nextInt(16); - int tunnels = 1; - if (random->nextInt(4) == 0) + int tunnels = 1; + if (random->nextInt(4) == 0) { - addRoom(xOffs, zOffs, blocks, xCave, yCave, zCave); - tunnels += random->nextInt(4); - } + addRoom(xOffs, zOffs, blocks, xCave, yCave, zCave); + tunnels += random->nextInt(4); + } - for (int i = 0; i < tunnels; i++) + for (int i = 0; i < tunnels; i++) { - float yRot = random->nextFloat() * PI * 2; - float xRot = ((random->nextFloat() - 0.5f) * 2) / 8; - float thickness = random->nextFloat() * 2 + random->nextFloat(); + float yRot = random->nextFloat() * PI * 2; + float xRot = ((random->nextFloat() - 0.5f) * 2) / 8; + float thickness = random->nextFloat() * 2 + random->nextFloat(); - addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, thickness, yRot, xRot, 0, 0, 1.0); - } - } + addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, thickness, yRot, xRot, 0, 0, 1.0); + } + } } \ No newline at end of file diff --git a/Minecraft.World/DurangoStats.cpp b/Minecraft.World/DurangoStats.cpp index c9b51c84..6e50fd20 100644 --- a/Minecraft.World/DurangoStats.cpp +++ b/Minecraft.World/DurangoStats.cpp @@ -45,8 +45,8 @@ bool DsItemEvent::onLeaderboard(ELeaderboardId leaderboard, eAcquisitionMethod m switch (param->itemId) { case Item::egg_Id: - case Tile::mushroom1_Id: - case Tile::mushroom2_Id: + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: return leaderboard == eLeaderboardId_FARMING; } break; @@ -57,13 +57,13 @@ bool DsItemEvent::onLeaderboard(ELeaderboardId leaderboard, eAcquisitionMethod m case Tile::dirt_Id: case Tile::stoneBrick_Id: case Tile::sand_Id: - case Tile::rock_Id: + case Tile::stone_Id: case Tile::gravel_Id: case Tile::clay_Id: case Tile::obsidian_Id: return leaderboard == eLeaderboardId_MINING; - case Tile::crops_Id: + case Tile::wheat_Id: case Tile::pumpkin_Id: case Tile::reeds_Id: return leaderboard == eLeaderboardId_FARMING; @@ -83,9 +83,9 @@ int DsItemEvent::mergeIds(int itemId) default: return itemId; - case Tile::mushroom1_Id: - case Tile::mushroom2_Id: - return Tile::mushroom1_Id; + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: + return Tile::mushroom_brown_Id; case Tile::dirt_Id: case Tile::grass_Id: @@ -267,11 +267,11 @@ byteArray DsMobKilled::createParamBlob(shared_ptr player, shared_ptrGetType(); - if ( (mobEType == eTYPE_SPIDER) && (mob->rider.lock() != NULL) && (mob->rider.lock()->GetType() == eTYPE_SKELETON) ) + if ( (mobEType == eTYPE_SPIDER) && (mob->rider.lock() != NULL) && (mob->rider.lock()->GetType() == eTYPE_SKELETON) && mob->rider.lock()->isAlive() ) { mob_networking_id = SPIDER_JOCKEY_ID; // Spider jockey only a concept for leaderboards. } - else if ( (mobEType == eTYPE_SKELETON) && (mob->riding != NULL) && (mob->riding->GetType() == eTYPE_SPIDER) ) + else if ( (mobEType == eTYPE_SKELETON) && (mob->riding != NULL) && (mob->riding->GetType() == eTYPE_SPIDER) && mob->riding->isAlive() ) { mob_networking_id = SPIDER_JOCKEY_ID; // Spider jockey only a concept for leaderboards. } @@ -769,7 +769,7 @@ Stat* DurangoStats::get_pigOneM() Stat *DurangoStats::get_cowsMilked() { - return get_itemsCrafted(Item::milk_Id); + return get_itemsCrafted(Item::bucket_milk_Id); } Stat* DurangoStats::get_killMob() @@ -930,7 +930,7 @@ byteArray DurangoStats::getParam_pigOneM(int distance) byteArray DurangoStats::getParam_cowsMilked() { - return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Crafted, Item::milk_Id, 0, 1); + return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Crafted, Item::bucket_milk_Id, 0, 1); } byteArray DurangoStats::getParam_blocksPlaced(int blockId, int data, int count) diff --git a/Minecraft.World/DyePowderItem.cpp b/Minecraft.World/DyePowderItem.cpp index a05b8354..b4ab86fa 100644 --- a/Minecraft.World/DyePowderItem.cpp +++ b/Minecraft.World/DyePowderItem.cpp @@ -62,8 +62,8 @@ const unsigned int DyePowderItem::COLOR_USE_DESCS[] = }; const wstring DyePowderItem::COLOR_TEXTURES[] = -{ L"dyePowder_black", L"dyePowder_red", L"dyePowder_green", L"dyePowder_brown", L"dyePowder_blue", L"dyePowder_purple", L"dyePowder_cyan", L"dyePowder_silver", L"dyePowder_gray", L"dyePowder_pink", -L"dyePowder_lime", L"dyePowder_yellow", L"dyePowder_lightBlue", L"dyePowder_magenta", L"dyePowder_orange", L"dyePowder_white"}; +{ L"black", L"red", L"green", L"brown", L"blue", L"purple", L"cyan", L"silver", L"gray", L"pink", +L"lime", L"yellow", L"light_blue", L"magenta", L"orange", L"white"}; const int DyePowderItem::COLOR_RGB[] = { @@ -73,8 +73,8 @@ const int DyePowderItem::COLOR_RGB[] = 0x51301a, 0x253192, 0x7b2fbe, - 0xababab, 0x287697, + 0xababab, 0x434343, 0xd88198, 0x41cd34, @@ -121,33 +121,42 @@ unsigned int DyePowderItem::getUseDescriptionId(shared_ptr itemIns bool DyePowderItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { - if (!player->mayBuild(x, y, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, itemInstance)) return false; // 4J-PB - Adding a test only version to allow tooltips to be displayed if (itemInstance->getAuxValue() == WHITE) { // bone meal is a fertilizer, so instantly grow trees and stuff - int tile = level->getTile(x, y, z); - if (tile == Tile::sapling_Id) + if (growCrop(itemInstance, level, x, y, z, bTestUseOnOnly)) { - if(!bTestUseOnOnly) - { - if (!level->isClientSide) - { - ((Sapling *) Tile::sapling)->growTree(level, x, y, z, level->random); - itemInstance->count--; - } - } + if (!level->isClientSide) level->levelEvent(LevelEvent::PARTICLES_PLANT_GROWTH, x, y, z, 0); return true; } - else if (tile == Tile::mushroom1_Id || tile == Tile::mushroom2_Id) + } + else if (itemInstance->getAuxValue() == BROWN) + { + // plant cocoa + + int tile = level->getTile(x, y, z); + int data = level->getData(x, y, z); + + if (tile == Tile::treeTrunk_Id && TreeTile::getWoodType(data) == TreeTile::JUNGLE_TRUNK) { + if (face == 0) return false; + if (face == 1) return false; + if (face == 2) z--; + if (face == 3) z++; + if (face == 4) x--; + if (face == 5) x++; + if(!bTestUseOnOnly) { - if (!level->isClientSide) + if (level->isEmptyTile(x, y, z)) { - if (((Mushroom *) Tile::tiles[tile])->growTree(level, x, y, z, level->random)) + int cocoaData = Tile::tiles[Tile::cocoa_Id]->getPlacedOnFaceDataValue(level, x, y, z, face, clickX, clickY, clickZ, 0); + level->setTileAndData(x, y, z, Tile::cocoa_Id, cocoaData, Tile::UPDATE_CLIENTS); + if (!player->abilities.instabuild) { itemInstance->count--; } @@ -155,147 +164,169 @@ bool DyePowderItem::useOn(shared_ptr itemInstance, shared_ptrgetData(x, y, z) == 7) return false; - if(!bTestUseOnOnly) + } + return false; +} + +bool DyePowderItem::growCrop(shared_ptr itemInstance, Level *level, int x, int y, int z, bool bTestUseOnOnly) +{ + int tile = level->getTile(x, y, z); + if (tile == Tile::sapling_Id) + { + if(!bTestUseOnOnly) + { + if (!level->isClientSide) { - if (!level->isClientSide) - { - ((StemTile *) Tile::tiles[tile])->growCropsToMax(level, x, y, z); - itemInstance->count--; - } + if (level->random->nextFloat() < 0.45) ((Sapling *) Tile::sapling)->advanceTree(level, x, y, z, level->random); + itemInstance->count--; } - return true; - } - else if (tile == Tile::carrots_Id || tile == Tile::potatoes_Id) + } + return true; + } + else if (tile == Tile::mushroom_brown_Id || tile == Tile::mushroom_red_Id) + { + if(!bTestUseOnOnly) { - if (level->getData(x, y, z) == 7) return false; - if(!bTestUseOnOnly) + if (!level->isClientSide) { - if (!level->isClientSide) - { - ((CropTile *) Tile::tiles[tile])->growCropsToMax(level, x, y, z); - itemInstance->count--; - } + if (level->random->nextFloat() < 0.4) ((Mushroom *) Tile::tiles[tile])->growTree(level, x, y, z, level->random); + itemInstance->count--; } - return true; } - else if (tile == Tile::crops_Id) + return true; + } + else if (tile == Tile::melonStem_Id || tile == Tile::pumpkinStem_Id) + { + if (level->getData(x, y, z) == 7) return false; + if(!bTestUseOnOnly) { - if (level->getData(x, y, z) == 7) return false; - if(!bTestUseOnOnly) - { - if (!level->isClientSide) - { - ((CropTile *) Tile::crops)->growCropsToMax(level, x, y, z); - itemInstance->count--; - } + if (!level->isClientSide) + { + ((StemTile *) Tile::tiles[tile])->growCrops(level, x, y, z); + itemInstance->count--; } - return true; } - else if (tile == Tile::cocoa_Id) + return true; + } + else if (tile == Tile::carrots_Id || tile == Tile::potatoes_Id) + { + if (level->getData(x, y, z) == 7) return false; + if(!bTestUseOnOnly) { - if(!bTestUseOnOnly) + if (!level->isClientSide) { - if (!level->isClientSide) - { - level->setData(x, y, z, (2 << 2) | DirectionalTile::getDirection(level->getData(x, y, z))); - itemInstance->count--; - } + ((CropTile *) Tile::tiles[tile])->growCrops(level, x, y, z); + itemInstance->count--; } - return true; - } - else if (tile == Tile::grass_Id) + } + return true; + } + else if (tile == Tile::wheat_Id) + { + if (level->getData(x, y, z) == 7) return false; + if(!bTestUseOnOnly) + { + if (!level->isClientSide) + { + ((CropTile *) Tile::tiles[tile])->growCrops(level, x, y, z); + itemInstance->count--; + } + } + return true; + } + else if (tile == Tile::cocoa_Id) + { + if(!bTestUseOnOnly) { - if(!bTestUseOnOnly) - { - if (!level->isClientSide) - { - itemInstance->count--; + int data = level->getData(x, y, z); + int direction = DirectionalTile::getDirection(data); + int age = CocoaTile::getAge(data); + if (age >= 2) return false; + if (!level->isClientSide) + { + age++; + level->setData(x, y, z, (age << 2) | direction, Tile::UPDATE_CLIENTS); + itemInstance->count--; + } + } + return true; + } + else if (tile == Tile::grass_Id) + { + if(!bTestUseOnOnly) + { + if (!level->isClientSide) + { + itemInstance->count--; - for (int j = 0; j < 128; j++) + for (int j = 0; j < 128; j++) + { + int xx = x; + int yy = y + 1; + int zz = z; + for (int i = 0; i < j / 16; i++) { - int xx = x; - int yy = y + 1; - int zz = z; - for (int i = 0; i < j / 16; i++) + xx += random->nextInt(3) - 1; + yy += (random->nextInt(3) - 1) * random->nextInt(3) / 2; + zz += random->nextInt(3) - 1; + if (level->getTile(xx, yy - 1, zz) != Tile::grass_Id || level->isSolidBlockingTile(xx, yy, zz)) { - xx += random->nextInt(3) - 1; - yy += (random->nextInt(3) - 1) * random->nextInt(3) / 2; - zz += random->nextInt(3) - 1; - if (level->getTile(xx, yy - 1, zz) != Tile::grass_Id || level->isSolidBlockingTile(xx, yy, zz)) - { - goto mainloop; - } + goto mainloop; } + } - if (level->getTile(xx, yy, zz) == 0) + if (level->getTile(xx, yy, zz) == 0) + { + if (random->nextInt(10) != 0) + { + if (Tile::tallgrass->canSurvive(level, xx, yy, zz)) level->setTileAndData(xx, yy, zz, Tile::tallgrass_Id, TallGrass::TALL_GRASS, Tile::UPDATE_ALL); + } + else if (random->nextInt(3) != 0) { - if (random->nextInt(10) != 0) - { - if (Tile::tallgrass->canSurvive(level, xx, yy, zz)) level->setTileAndData(xx, yy, zz, Tile::tallgrass_Id, TallGrass::TALL_GRASS); - } - else if (random->nextInt(3) != 0) - { - if (Tile::flower->canSurvive(level, xx, yy, zz)) level->setTile(xx, yy, zz, Tile::flower_Id); - } - else - { - if (Tile::rose->canSurvive(level, xx, yy, zz)) level->setTile(xx, yy, zz, Tile::rose_Id); - } + if (Tile::flower->canSurvive(level, xx, yy, zz)) level->setTileAndUpdate(xx, yy, zz, Tile::flower_Id); + } + else + { + if (Tile::rose->canSurvive(level, xx, yy, zz)) level->setTileAndUpdate(xx, yy, zz, Tile::rose_Id); } + } - // 4J - Stops infinite loops. + // 4J - Stops infinite loops. mainloop: continue; - } } } - - return true; } + + return true; } - else if (itemInstance->getAuxValue() == BROWN) - { - // plant cocoa + return false; +} - int tile = level->getTile(x, y, z); - int data = level->getData(x, y, z); +void DyePowderItem::addGrowthParticles(Level *level, int x, int y, int z, int count) +{ + int id = level->getTile(x, y, z); + if (count == 0) count = 15; + Tile *tile = id > 0 && id < Tile::TILE_NUM_COUNT ? Tile::tiles[id] : NULL; - if (tile == Tile::treeTrunk_Id && TreeTile::getWoodType(data) == TreeTile::JUNGLE_TRUNK) - { - if (face == 0) return false; - if (face == 1) return false; - if (face == 2) z--; - if (face == 3) z++; - if (face == 4) x--; - if (face == 5) x++; + if (tile == NULL) return; + tile->updateShape(level, x, y, z); - if(!bTestUseOnOnly) - { - if (level->isEmptyTile(x, y, z)) - { - int cocoaData = Tile::tiles[Tile::cocoa_Id]->getPlacedOnFaceDataValue(level, x, y, z, face, clickX, clickY, clickZ, 0); - level->setTileAndData(x, y, z, Tile::cocoa_Id, cocoaData); - if (!player->abilities.instabuild) - { - itemInstance->count--; - } - } - } - return true; - } - } - return false; + for (int i = 0; i < count; i++) + { + double xa = level->random->nextGaussian() * 0.02; + double ya = level->random->nextGaussian() * 0.02; + double za = level->random->nextGaussian() * 0.02; + level->addParticle(eParticleType_happyVillager, x + level->random->nextFloat(), y + level->random->nextFloat() * tile->getShapeY1(), z + level->random->nextFloat(), xa, ya, za); + } } -bool DyePowderItem::interactEnemy(shared_ptr itemInstance, shared_ptr mob) +bool DyePowderItem::interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob) { if (dynamic_pointer_cast( mob ) != NULL) { shared_ptr sheep = dynamic_pointer_cast(mob); // convert to tile-based color value (0 is white instead of black) - int newColor = ClothTile::getTileDataForItemAuxValue(itemInstance->getAuxValue()); + int newColor = ColoredTile::getTileDataForItemAuxValue(itemInstance->getAuxValue()); if (!sheep->isSheared() && sheep->getColor() != newColor) { sheep->setColor(newColor); @@ -312,6 +343,6 @@ void DyePowderItem::registerIcons(IconRegister *iconRegister) for (int i = 0; i < DYE_POWDER_ITEM_TEXTURE_COUNT; i++) { - icons[i] = iconRegister->registerIcon(COLOR_TEXTURES[i]); + icons[i] = iconRegister->registerIcon(getIconName() + L"_" + COLOR_TEXTURES[i]); } } \ No newline at end of file diff --git a/Minecraft.World/DyePowderItem.h b/Minecraft.World/DyePowderItem.h index b96b4087..270b5424 100644 --- a/Minecraft.World/DyePowderItem.h +++ b/Minecraft.World/DyePowderItem.h @@ -43,7 +43,9 @@ public: virtual unsigned int getDescriptionId(shared_ptr itemInstance); virtual unsigned int getUseDescriptionId(shared_ptr itemInstance); virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr mob); + static bool growCrop(shared_ptr itemInstance, Level *level, int x, int y, int z, bool bTestUseOnOnly); + static void addGrowthParticles(Level *level, int x, int y, int z, int count); + virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob); //@Override void registerIcons(IconRegister *iconRegister); diff --git a/Minecraft.World/EatTileGoal.cpp b/Minecraft.World/EatTileGoal.cpp index 55bf2f35..c2cbd6bf 100644 --- a/Minecraft.World/EatTileGoal.cpp +++ b/Minecraft.World/EatTileGoal.cpp @@ -11,7 +11,7 @@ EatTileGoal::EatTileGoal(Mob *mob) eatAnimationTick = 0; this->mob = mob; - this->level = mob->level; + level = mob->level; setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag | Control::JumpControlFlag); } @@ -60,14 +60,13 @@ void EatTileGoal::tick() if (level->getTile(xx, yy, zz) == Tile::tallgrass_Id) { - level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, xx, yy, zz, Tile::tallgrass_Id + (TallGrass::TALL_GRASS << Tile::TILE_NUM_SHIFT)); - level->setTile(xx, yy, zz, 0); + level->destroyTile(xx, yy, zz, false); mob->ate(); } else if (level->getTile(xx, yy - 1, zz) == Tile::grass_Id) { level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, xx, yy - 1, zz, Tile::grass_Id); - level->setTile(xx, yy - 1, zz, Tile::dirt_Id); + level->setTileAndData(xx, yy - 1, zz, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); mob->ate(); } } \ No newline at end of file diff --git a/Minecraft.World/EffectCommand.cpp b/Minecraft.World/EffectCommand.cpp new file mode 100644 index 00000000..5d708db8 --- /dev/null +++ b/Minecraft.World/EffectCommand.cpp @@ -0,0 +1,86 @@ +#include "stdafx.h" +#include "net.minecraft.commands.common.h" +#include "..\Minecraft.Client\MinecraftServer.h" + +EGameCommand EffectCommand::getId() +{ + return eGameCommand_Effect; +} + +int EffectCommand::getPermissionLevel() +{ + return LEVEL_GAMEMASTERS; +} + +wstring EffectCommand::getUsage(CommandSender *source) +{ + return L"commands.effect.usage"; +} + +void EffectCommand::execute(shared_ptr source, byteArray commandData) +{ + //if (args.length >= 2) + //{ + // Player player = convertToPlayer(source, args[0]); + + // if (args[1].equals("clear")) { + // if (player.getActiveEffects().isEmpty()) { + // throw new CommandException("commands.effect.failure.notActive.all", player.getAName()); + // } else { + // player.removeAllEffects(); + // logAdminAction(source, "commands.effect.success.removed.all", player.getAName()); + // } + // } else { + // int effectId = convertArgToInt(source, args[1], 1); + // int duration = SharedConstants.TICKS_PER_SECOND * 30; + // int seconds = 30; + // int amplifier = 0; + + // if (effectId < 0 || effectId >= MobEffect.effects.length || MobEffect.effects[effectId] == null) { + // throw new InvalidNumberException("commands.effect.notFound", effectId); + // } + + // if (args.length >= 3) { + // seconds = convertArgToInt(source, args[2], 0, 1000000); + // if (MobEffect.effects[effectId].isInstantenous()) { + // duration = seconds; + // } else { + // duration = seconds * SharedConstants.TICKS_PER_SECOND; + // } + // } else if (MobEffect.effects[effectId].isInstantenous()) { + // duration = 1; + // } + + // if (args.length >= 4) { + // amplifier = convertArgToInt(source, args[3], 0, 255); + // } + + // if (seconds == 0) { + // if (player.hasEffect(effectId)) { + // player.removeEffect(effectId); + // logAdminAction(source, "commands.effect.success.removed", ChatMessageComponent.forTranslation(MobEffect.effects[effectId].getDescriptionId()), player.getAName()); + // } else { + // throw new CommandException("commands.effect.failure.notActive", ChatMessageComponent.forTranslation(MobEffect.effects[effectId].getDescriptionId()), player.getAName()); + // } + // } else { + // MobEffectInstance instance = new MobEffectInstance(effectId, duration, amplifier); + // player.addEffect(instance); + // logAdminAction(source, "commands.effect.success", ChatMessageComponent.forTranslation(instance.getDescriptionId()), effectId, amplifier, player.getAName(), seconds); + // } + // } + + // return; + //} + + //throw new UsageException("commands.effect.usage"); +} + +wstring EffectCommand::getPlayerNames() +{ + return L""; //MinecraftServer::getInstance()->getPlayerNames(); +} + +bool EffectCommand::isValidWildcardPlayerArgument(wstring args, int argumentIndex) +{ + return argumentIndex == 0; +} \ No newline at end of file diff --git a/Minecraft.World/EffectCommand.h b/Minecraft.World/EffectCommand.h new file mode 100644 index 00000000..e198d0ac --- /dev/null +++ b/Minecraft.World/EffectCommand.h @@ -0,0 +1,18 @@ +#pragma once + +#include "Command.h" + +class EffectCommand : public Command +{ +public: + EGameCommand getId(); + int getPermissionLevel(); + wstring getUsage(CommandSender *source); + void execute(shared_ptr source, byteArray commandData); + +protected: + wstring getPlayerNames(); + +public: + bool isValidWildcardPlayerArgument(wstring args, int argumentIndex); +}; \ No newline at end of file diff --git a/Minecraft.World/EggItem.cpp b/Minecraft.World/EggItem.cpp index b85dbcd6..0655a2fa 100644 --- a/Minecraft.World/EggItem.cpp +++ b/Minecraft.World/EggItem.cpp @@ -16,7 +16,7 @@ using namespace std; EggItem::EggItem(int id) : Item( id ) { - this->maxStackSize = 16; + maxStackSize = 16; } shared_ptr EggItem::use(shared_ptr instance, Level *level, shared_ptr player) @@ -25,7 +25,7 @@ shared_ptr EggItem::use(shared_ptr instance, Level * { instance->count--; } - level->playSound( dynamic_pointer_cast(player), eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) level->addEntity( shared_ptr( new ThrownEgg(level, dynamic_pointer_cast( player )) )); - return instance; + level->playEntitySound( player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + if (!level->isClientSide) level->addEntity( shared_ptr(new ThrownEgg(level, player)) ); + return instance; } diff --git a/Minecraft.World/EggTile.cpp b/Minecraft.World/EggTile.cpp index e6711a3f..3a11c0d1 100644 --- a/Minecraft.World/EggTile.cpp +++ b/Minecraft.World/EggTile.cpp @@ -10,12 +10,12 @@ EggTile::EggTile(int id) : Tile(id, Material::egg, isSolidRender()) void EggTile::onPlace(Level *level, int x, int y, int z) { - level->addToTickNextTick(x, y, z, id, getTickDelay()); + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); } void EggTile::neighborChanged(Level *level, int x, int y, int z, int type) { - level->addToTickNextTick(x, y, z, id, getTickDelay()); + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); } void EggTile::tick(Level *level, int x, int y, int z, Random *random) @@ -30,12 +30,12 @@ void EggTile::checkSlide(Level *level, int x, int y, int z) int r = 32; if (HeavyTile::instaFall || !level->hasChunksAt(x - r, y - r, z - r, x + r, y + r, z + r)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); while (HeavyTile::isFree(level, x, y - 1, z) && y > 0) y--; if (y > 0) { - level->setTile(x, y, z, id); + level->setTileAndData(x, y, z, id, 0, Tile::UPDATE_CLIENTS); } } else @@ -50,8 +50,8 @@ bool EggTile::use(Level *level, int x, int y, int z, shared_ptr player, { if(soundOnly) return false; - teleport(level, x, y, z); - return true; + teleport(level, x, y, z); + return true; } void EggTile::attack(Level *level, int x, int y, int z, shared_ptr player) @@ -74,8 +74,8 @@ void EggTile::teleport(Level *level, int x, int y, int z) // Don't set tiles on client, and don't create particles on the server (matches later change in Java) if(!level->isClientSide) { - level->setTileAndData(xt, yt, zt, id, level->getData(x, y, z)); - level->setTile(x, y, z, 0); + level->setTileAndData(xt, yt, zt, id, level->getData(x, y, z), Tile::UPDATE_CLIENTS); + level->removeTile(x, y, z); // 4J Stu - The PC version is wrong as the particles calculated on the client side will point towards a different // location to the one where the egg has actually moved. As the deltas are all small we can pack them into an int @@ -90,31 +90,31 @@ void EggTile::teleport(Level *level, int x, int y, int z) // 4J Stu - This code will not work correctly on the client as it will show the particles going in the wrong direction // and only for the player who attacks the egg - // else - // { - // int count = 128; - // for (int j = 0; j < count; j++) - // { - // double d = level->random->nextDouble(); // j < count / 2 ? 0 : - //// 1; - // float xa = (level->random->nextFloat() - 0.5f) * 0.2f; - // float ya = (level->random->nextFloat() - 0.5f) * 0.2f; - // float za = (level->random->nextFloat() - 0.5f) * 0.2f; - - // double _x = xt + (x - xt) * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f; - // double _y = yt + (y - yt) * d + level->random->nextDouble() * 1 - 0.5f; - // double _z = zt + (z - zt) * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f; - // level->addParticle(eParticleType_ender, _x, _y, _z, xa, ya, za); - // } - // } + // else + // { + // int count = 128; + // for (int j = 0; j < count; j++) + // { + // double d = level->random->nextDouble(); // j < count / 2 ? 0 : + //// 1; + // float xa = (level->random->nextFloat() - 0.5f) * 0.2f; + // float ya = (level->random->nextFloat() - 0.5f) * 0.2f; + // float za = (level->random->nextFloat() - 0.5f) * 0.2f; + + // double _x = xt + (x - xt) * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f; + // double _y = yt + (y - yt) * d + level->random->nextDouble() * 1 - 0.5f; + // double _z = zt + (z - zt) * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f; + // level->addParticle(eParticleType_ender, _x, _y, _z, xa, ya, za); + // } + // } return; } } } -int EggTile::getTickDelay() +int EggTile::getTickDelay(Level *level) { - return 3; + return 5; } bool EggTile::blocksLight() @@ -132,6 +132,11 @@ bool EggTile::isCubeShaped() return false; } +bool EggTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) +{ + return true; +} + int EggTile::getRenderShape() { return Tile::SHAPE_EGG; @@ -165,9 +170,4 @@ void EggTile::generateTeleportParticles(Level *level,int xt,int yt, int zt,int d double _z = zt + deltaZ * d + (level->random->nextDouble() - 0.5) * 1 + 0.5f; level->addParticle(eParticleType_ender, _x, _y, _z, xa, ya, za); } -} - -bool EggTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) -{ - return true; } \ No newline at end of file diff --git a/Minecraft.World/EggTile.h b/Minecraft.World/EggTile.h index c8929cbe..354a4436 100644 --- a/Minecraft.World/EggTile.h +++ b/Minecraft.World/EggTile.h @@ -5,23 +5,23 @@ class EggTile : public Tile { public: EggTile(int id); - virtual void onPlace(Level *level, int x, int y, int z); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); - virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void tick(Level *level, int x, int y, int z, Random *random); private: void checkSlide(Level *level, int x, int y, int z); public: virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); private: void teleport(Level *level, int x, int y, int z); public: - virtual int getTickDelay(); - virtual bool blocksLight(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); + virtual int getTickDelay(Level *level); + virtual bool blocksLight(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - virtual int getRenderShape(); + virtual int getRenderShape(); virtual int cloneTileId(Level *level, int x, int y, int z); // 4J Added diff --git a/Minecraft.World/EmptyLevelChunk.cpp b/Minecraft.World/EmptyLevelChunk.cpp index 80460b10..1353ca4d 100644 --- a/Minecraft.World/EmptyLevelChunk.cpp +++ b/Minecraft.World/EmptyLevelChunk.cpp @@ -26,7 +26,7 @@ bool EmptyLevelChunk::isAt(int x, int z) int EmptyLevelChunk::getHeightmap(int x, int z) { - return 0; + return 0; } void EmptyLevelChunk::recalcBlockLights() @@ -140,15 +140,20 @@ void EmptyLevelChunk::unload(bool unloadTileEntities) // 4J - added parameter { } +bool EmptyLevelChunk::containsPlayer() +{ + return false; +} + void EmptyLevelChunk::markUnsaved() { } -void EmptyLevelChunk::getEntities(shared_ptr except, AABB bb, vector > &es) +void EmptyLevelChunk::getEntities(shared_ptr except, AABB bb, vector > &es, EntitySelector *selector) { } -void EmptyLevelChunk::getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es) +void EmptyLevelChunk::getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es, EntitySelector *selector) { } @@ -168,12 +173,12 @@ void EmptyLevelChunk::setBlocks(byteArray newBlocks, int sub) int EmptyLevelChunk::getBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int p, bool includeLighting/* = true*/) { - int xs = x1 - x0; - int ys = y1 - y0; - int zs = z1 - z0; + int xs = x1 - x0; + int ys = y1 - y0; + int zs = z1 - z0; - int s = xs * ys * zs; - int len; + int s = xs * ys * zs; + int len; if( includeLighting ) { len = s + s / 2 * 3; @@ -184,20 +189,20 @@ int EmptyLevelChunk::getBlocksAndData(byteArray data, int x0, int y0, int z0, in } - Arrays::fill(data, p, p + len, (byte) 0); - return len; + Arrays::fill(data, p, p + len, (byte) 0); + return len; } int EmptyLevelChunk::setBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int p, bool includeLighting/* = true*/) { - int xs = x1 - x0; - int ys = y1 - y0; - int zs = z1 - z0; + int xs = x1 - x0; + int ys = y1 - y0; + int zs = z1 - z0; - int s = xs * ys * zs; + int s = xs * ys * zs; if( includeLighting ) { - return s + s / 2 * 3; + return s + s / 2 * 3; } else { diff --git a/Minecraft.World/EmptyLevelChunk.h b/Minecraft.World/EmptyLevelChunk.h index 02ffc176..06bffea9 100644 --- a/Minecraft.World/EmptyLevelChunk.h +++ b/Minecraft.World/EmptyLevelChunk.h @@ -39,9 +39,10 @@ public: void removeTileEntity(int x, int y, int z); void load(); void unload(bool unloadTileEntities) ; // 4J - added parameter + bool containsPlayer(); // 4J added void markUnsaved(); - void getEntities(shared_ptr except, AABB bb, vector > &es); - void getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es); + void getEntities(shared_ptr except, AABB bb, vector > &es, EntitySelector *selector); + void getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es, EntitySelector *selector); int countEntities(); bool shouldSave(bool force); void setBlocks(byteArray newBlocks, int sub); diff --git a/Minecraft.World/EmptyMapItem.cpp b/Minecraft.World/EmptyMapItem.cpp new file mode 100644 index 00000000..42adc304 --- /dev/null +++ b/Minecraft.World/EmptyMapItem.cpp @@ -0,0 +1,43 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.player.h" +#include "EmptyMapItem.h" + +EmptyMapItem::EmptyMapItem(int id) : ComplexItem(id) +{ +} + +shared_ptr EmptyMapItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) +{ + //shared_ptr map = shared_ptr( new ItemInstance(Item::map, 1, level->getFreeAuxValueFor(L"map")) ); + + //String id = "map_" + map.getAuxValue(); + //MapItemSavedData data = new MapItemSavedData(id); + //level.setSavedData(id, data); + + //data.scale = 0; + //int scale = MapItemSavedData.MAP_SIZE * 2 * (1 << data.scale); + //data.x = (int) (Math.round(player.x / scale) * scale); + //data.z = (int) (Math.round(player.z / scale) * scale); + //data.dimension = (byte) level.dimension.id; + + //data.setDirty(); + + shared_ptr map = shared_ptr( new ItemInstance(Item::map, 1, -1) ); + Item::map->onCraftedBy(map, level, player); + + itemInstance->count--; + if (itemInstance->count <= 0) + { + return map; + } + else + { + if (!player->inventory->add(map->copy())) + { + player->drop(map); + } + } + + return itemInstance; +} \ No newline at end of file diff --git a/Minecraft.World/EmptyMapItem.h b/Minecraft.World/EmptyMapItem.h new file mode 100644 index 00000000..825111d0 --- /dev/null +++ b/Minecraft.World/EmptyMapItem.h @@ -0,0 +1,11 @@ +#pragma once + +#include "ComplexItem.h" + +class EmptyMapItem : public ComplexItem +{ +public: + EmptyMapItem(int id); + + shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); +}; \ No newline at end of file diff --git a/Minecraft.World/EnchantItemCommand.cpp b/Minecraft.World/EnchantItemCommand.cpp index aa02b533..7ec57563 100644 --- a/Minecraft.World/EnchantItemCommand.cpp +++ b/Minecraft.World/EnchantItemCommand.cpp @@ -12,7 +12,7 @@ EGameCommand EnchantItemCommand::getId() int EnchantItemCommand::getPermissionLevel() { - return 0; //aLEVEL_GAMEMASTERS; + return LEVEL_GAMEMASTERS; } void EnchantItemCommand::execute(shared_ptr source, byteArray commandData) diff --git a/Minecraft.World/EnchantedBookItem.cpp b/Minecraft.World/EnchantedBookItem.cpp index 59e7156b..88776c18 100644 --- a/Minecraft.World/EnchantedBookItem.cpp +++ b/Minecraft.World/EnchantedBookItem.cpp @@ -43,9 +43,9 @@ ListTag *EnchantedBookItem::getEnchantments(shared_ptr *) item->tag->get((wchar_t *)TAG_STORED_ENCHANTMENTS.c_str()); } -void EnchantedBookItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void EnchantedBookItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced) { - Item::appendHoverText(itemInstance, player, lines, advanced, unformattedStrings); + Item::appendHoverText(itemInstance, player, lines, advanced); ListTag *list = getEnchantments(itemInstance); @@ -59,8 +59,7 @@ void EnchantedBookItem::appendHoverText(shared_ptr itemInstance, s if (Enchantment::enchantments[type] != NULL) { - lines->push_back(Enchantment::enchantments[type]->getFullname(level, unformatted)); - unformattedStrings.push_back(unformatted); + lines->push_back(Enchantment::enchantments[type]->getFullname(level)); } } } diff --git a/Minecraft.World/EnchantedBookItem.h b/Minecraft.World/EnchantedBookItem.h index c67f208f..9296f3c3 100644 --- a/Minecraft.World/EnchantedBookItem.h +++ b/Minecraft.World/EnchantedBookItem.h @@ -15,7 +15,7 @@ public: bool isEnchantable(shared_ptr itemInstance); const Rarity *getRarity(shared_ptr itemInstance); ListTag *getEnchantments(shared_ptr item); - void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); + void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced); void addEnchantment(shared_ptr item, EnchantmentInstance *enchantment); shared_ptr createForEnchantment(EnchantmentInstance *enchant); void createForEnchantment(Enchantment *enchant, vector > *items); diff --git a/Minecraft.World/Enchantment.cpp b/Minecraft.World/Enchantment.cpp index 2ce1441a..ae638b27 100644 --- a/Minecraft.World/Enchantment.cpp +++ b/Minecraft.World/Enchantment.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.item.h" #include "Enchantment.h" //Enchantment *Enchantment::enchantments[256]; @@ -129,9 +130,9 @@ int Enchantment::getDamageProtection(int level, DamageSource *source) return 0; } -int Enchantment::getDamageBonus(int level, shared_ptr target) +float Enchantment::getDamageBonus(int level, shared_ptr target) { - return 0; + return 0.0f; } bool Enchantment::isCompatibleWith(Enchantment *other) const @@ -150,13 +151,12 @@ int Enchantment::getDescriptionId() return descriptionId; } -wstring Enchantment::getFullname(int level,wstring &unformatted) +HtmlString Enchantment::getFullname(int level) { wchar_t formatted[256]; - swprintf(formatted,256,L"%ls %ls",app.GetString( getDescriptionId() ), getLevelString(level).c_str()); - unformatted = formatted; - swprintf(formatted,256,L"%ls",app.GetHTMLColour(eHTMLColor_f),unformatted.c_str()); - return formatted; + swprintf(formatted, 256, L"%ls %ls", app.GetString(getDescriptionId()), getLevelString(level).c_str()); + + return HtmlString(formatted, eHTMLColor_f); } bool Enchantment::canEnchant(shared_ptr item) diff --git a/Minecraft.World/Enchantment.h b/Minecraft.World/Enchantment.h index 794edf85..7daa1a37 100644 --- a/Minecraft.World/Enchantment.h +++ b/Minecraft.World/Enchantment.h @@ -74,11 +74,11 @@ public: virtual int getMinCost(int level); virtual int getMaxCost(int level); virtual int getDamageProtection(int level, DamageSource *source); - virtual int getDamageBonus(int level, shared_ptr target); + virtual float getDamageBonus(int level, shared_ptr target); virtual bool isCompatibleWith(Enchantment *other) const; virtual Enchantment *setDescriptionId(int id); virtual int getDescriptionId(); - virtual wstring getFullname(int level,wstring &unformatted); // 4J Stu added unformatted + virtual HtmlString getFullname(int level); virtual bool canEnchant(shared_ptr item); private: diff --git a/Minecraft.World/EnchantmentContainer.cpp b/Minecraft.World/EnchantmentContainer.cpp index 6e5541fb..166e8d5f 100644 --- a/Minecraft.World/EnchantmentContainer.cpp +++ b/Minecraft.World/EnchantmentContainer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.inventory.h" #include "EnchantmentContainer.h" -EnchantmentContainer::EnchantmentContainer(EnchantmentMenu *menu) : SimpleContainer(IDS_ENCHANT, 1), m_menu( menu ) +EnchantmentContainer::EnchantmentContainer(EnchantmentMenu *menu) : SimpleContainer(IDS_ENCHANT, L"", false, 1), m_menu( menu ) { } @@ -15,4 +15,9 @@ void EnchantmentContainer::setChanged() { SimpleContainer::setChanged(); m_menu->slotsChanged(); // Remove this param as it's not needed +} + +bool EnchantmentContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; } \ No newline at end of file diff --git a/Minecraft.World/EnchantmentContainer.h b/Minecraft.World/EnchantmentContainer.h index 48d8687f..8b337f48 100644 --- a/Minecraft.World/EnchantmentContainer.h +++ b/Minecraft.World/EnchantmentContainer.h @@ -15,4 +15,5 @@ public: EnchantmentContainer(EnchantmentMenu *menu); virtual int getMaxStackSize(); virtual void setChanged(); + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/EnchantmentHelper.cpp b/Minecraft.World/EnchantmentHelper.cpp index f43ced01..da784d5a 100644 --- a/Minecraft.World/EnchantmentHelper.cpp +++ b/Minecraft.World/EnchantmentHelper.cpp @@ -88,6 +88,7 @@ void EnchantmentHelper::setEnchantments(unordered_map *enchantments, s int EnchantmentHelper::getEnchantmentLevel(int enchantmentId, ItemInstanceArray inventory) { + if (inventory.data == NULL) return 0; int bestLevel = 0; //for (ItemInstance piece : inventory) for(unsigned int i = 0; i < inventory.length; ++i) @@ -147,12 +148,12 @@ EnchantmentHelper::GetDamageProtectionIteration EnchantmentHelper::getDamageProt * @param source * @return */ -int EnchantmentHelper::getDamageProtection(shared_ptr inventory, DamageSource *source) +int EnchantmentHelper::getDamageProtection(ItemInstanceArray armor, DamageSource *source) { getDamageProtectionIteration.sum = 0; getDamageProtectionIteration.source = source; - runIterationOnInventory(getDamageProtectionIteration, inventory->armor); + runIterationOnInventory(getDamageProtectionIteration, armor); if (getDamageProtectionIteration.sum > 25) { @@ -177,72 +178,68 @@ EnchantmentHelper::GetDamageBonusIteration EnchantmentHelper::getDamageBonusIter * @param target * @return */ -int EnchantmentHelper::getDamageBonus(shared_ptr inventory, shared_ptr target) +float EnchantmentHelper::getDamageBonus(shared_ptr source, shared_ptr target) { getDamageBonusIteration.sum = 0; getDamageBonusIteration.target = target; - runIterationOnItem(getDamageBonusIteration, inventory->getSelected()); + runIterationOnItem(getDamageBonusIteration, source->getCarriedItem() ); - if (getDamageBonusIteration.sum > 0) - { - return 1 + random.nextInt(getDamageBonusIteration.sum); - } - return 0; + return getDamageBonusIteration.sum; } -int EnchantmentHelper::getKnockbackBonus(shared_ptr inventory, shared_ptr target) +int EnchantmentHelper::getKnockbackBonus(shared_ptr source, shared_ptr target) { - return getEnchantmentLevel(Enchantment::knockback->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::knockback->id, source->getCarriedItem() ); } -int EnchantmentHelper::getFireAspect(shared_ptr source) +int EnchantmentHelper::getFireAspect(shared_ptr source) { return getEnchantmentLevel(Enchantment::fireAspect->id, source->getCarriedItem()); } -int EnchantmentHelper::getOxygenBonus(shared_ptr inventory) +int EnchantmentHelper::getOxygenBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::drownProtection->id, inventory->armor); + return getEnchantmentLevel(Enchantment::drownProtection->id, source->getEquipmentSlots() ); } -int EnchantmentHelper::getDiggingBonus(shared_ptr inventory) +int EnchantmentHelper::getDiggingBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::diggingBonus->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::diggingBonus->id, source->getCarriedItem() ); } -int EnchantmentHelper::getDigDurability(shared_ptr inventory) +int EnchantmentHelper::getDigDurability(shared_ptr source) { - return getEnchantmentLevel(Enchantment::digDurability->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::digDurability->id, source->getCarriedItem() ); } -bool EnchantmentHelper::hasSilkTouch(shared_ptr inventory) +bool EnchantmentHelper::hasSilkTouch(shared_ptr source) { - return getEnchantmentLevel(Enchantment::untouching->id, inventory->getSelected()) > 0; + return getEnchantmentLevel(Enchantment::untouching->id, source->getCarriedItem() ) > 0; } -int EnchantmentHelper::getDiggingLootBonus(shared_ptr inventory) +int EnchantmentHelper::getDiggingLootBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::resourceBonus->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::resourceBonus->id, source->getCarriedItem() ); } -int EnchantmentHelper::getKillingLootBonus(shared_ptr inventory) +int EnchantmentHelper::getKillingLootBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::lootBonus->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::lootBonus->id, source->getCarriedItem() ); } -bool EnchantmentHelper::hasWaterWorkerBonus(shared_ptr inventory) +bool EnchantmentHelper::hasWaterWorkerBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::waterWorker->id, inventory->armor) > 0; + return getEnchantmentLevel(Enchantment::waterWorker->id, source->getEquipmentSlots() ) > 0; } -int EnchantmentHelper::getArmorThorns(shared_ptr source) +int EnchantmentHelper::getArmorThorns(shared_ptr source) { return getEnchantmentLevel(Enchantment::thorns->id, source->getEquipmentSlots()); } -shared_ptr EnchantmentHelper::getRandomItemWith(Enchantment *enchantment, shared_ptr source) +shared_ptr EnchantmentHelper::getRandomItemWith(Enchantment *enchantment, shared_ptr source) { ItemInstanceArray items = source->getEquipmentSlots(); for(unsigned int i = 0; i < items.length; ++i) diff --git a/Minecraft.World/EnchantmentHelper.h b/Minecraft.World/EnchantmentHelper.h index 9f7de5c5..6ed2e398 100644 --- a/Minecraft.World/EnchantmentHelper.h +++ b/Minecraft.World/EnchantmentHelper.h @@ -49,14 +49,14 @@ private: * @return */ public: - static int getDamageProtection(shared_ptr inventory, DamageSource *source); + static int getDamageProtection(ItemInstanceArray armor, DamageSource *source); private: class GetDamageBonusIteration : public EnchantmentIterationMethod { public: - int sum; - shared_ptr target; + float sum; + shared_ptr target; virtual void doEnchantment(Enchantment *enchantment, int level); }; @@ -70,18 +70,18 @@ private: * @return */ public: - static int getDamageBonus(shared_ptr inventory, shared_ptr target); - static int getKnockbackBonus(shared_ptr inventory, shared_ptr target); - static int getFireAspect(shared_ptr source); - static int getOxygenBonus(shared_ptr inventory); - static int getDiggingBonus(shared_ptr inventory); - static int getDigDurability(shared_ptr inventory); - static bool hasSilkTouch(shared_ptr inventory); - static int getDiggingLootBonus(shared_ptr inventory); - static int getKillingLootBonus(shared_ptr inventory); - static bool hasWaterWorkerBonus(shared_ptr inventory); - static int getArmorThorns(shared_ptr source); - static shared_ptr getRandomItemWith(Enchantment *enchantment, shared_ptr source); + static float getDamageBonus(shared_ptr source, shared_ptr target); + static int getKnockbackBonus(shared_ptr source, shared_ptr target); + static int getFireAspect(shared_ptr source); + static int getOxygenBonus(shared_ptr source); + static int getDiggingBonus(shared_ptr source); + static int getDigDurability(shared_ptr source); + static bool hasSilkTouch(shared_ptr source); + static int getDiggingLootBonus(shared_ptr source); + static int getKillingLootBonus(shared_ptr source); + static bool hasWaterWorkerBonus(shared_ptr source); + static int getArmorThorns(shared_ptr source); + static shared_ptr getRandomItemWith(Enchantment *enchantment, shared_ptr source); /** * diff --git a/Minecraft.World/EnchantmentMenu.cpp b/Minecraft.World/EnchantmentMenu.cpp index 23b366ce..fa769bf9 100644 --- a/Minecraft.World/EnchantmentMenu.cpp +++ b/Minecraft.World/EnchantmentMenu.cpp @@ -17,9 +17,9 @@ EnchantmentMenu::EnchantmentMenu(shared_ptr inventory, Level *level, } this->level = level; - this->x = xt; - this->y = yt; - this->z = zt; + x = xt; + y = yt; + z = zt; addSlot(new EnchantmentSlot(enchantSlots, 0, 21 + 4, 43 + 4)); for (int y = 0; y < 3; y++) @@ -53,9 +53,9 @@ void EnchantmentMenu::broadcastChanges() // 4J Added m_costsChanged to stop continually sending update packets even when no changes have been made if(m_costsChanged) { - for (int i = 0; i < containerListeners->size(); i++) + for (int i = 0; i < containerListeners.size(); i++) { - ContainerListener *listener = containerListeners->at(i); + ContainerListener *listener = containerListeners.at(i); listener->setContainerData(this, 0, costs[0]); listener->setContainerData(this, 1, costs[1]); listener->setContainerData(this, 2, costs[2]); @@ -162,7 +162,7 @@ bool EnchantmentMenu::clickMenuButton(shared_ptr player, int i) vector *newEnchantment = EnchantmentHelper::selectEnchantment(&random, item, costs[i]); if (newEnchantment != NULL) { - player->withdrawExperienceLevels(costs[i]); + player->giveExperienceLevels(-costs[i]); if (isBook) item->id = Item::enchantedBook_Id; int randomIndex = isBook ? random.nextInt(newEnchantment->size()) : -1; //for (EnchantmentInstance e : newEnchantment) @@ -216,8 +216,8 @@ bool EnchantmentMenu::stillValid(shared_ptr player) shared_ptr EnchantmentMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); - Slot *IngredientSlot = slots->at(INGREDIENT_SLOT); + Slot *slot = slots.at(slotIndex); + Slot *IngredientSlot = slots.at(INGREDIENT_SLOT); if (slot != NULL && slot->hasItem()) { diff --git a/Minecraft.World/EnchantmentTableEntity.cpp b/Minecraft.World/EnchantmentTableEntity.cpp index 31da3c49..15131aa2 100644 --- a/Minecraft.World/EnchantmentTableEntity.cpp +++ b/Minecraft.World/EnchantmentTableEntity.cpp @@ -10,15 +10,16 @@ EnchantmentTableEntity::EnchantmentTableEntity() random = new Random(); time = 0; - flip = 0.0f; + flip = 0.0f; oFlip = 0.0f; flipT = 0.0f; flipA = 0.0f; - open = 0.0f; + open = 0.0f; oOpen = 0.0f; - rot = 0.0f; + rot = 0.0f; oRot = 0.0f; tRot = 0.0f; + name = L""; } EnchantmentTableEntity::~EnchantmentTableEntity() @@ -26,6 +27,18 @@ EnchantmentTableEntity::~EnchantmentTableEntity() delete random; } +void EnchantmentTableEntity::save(CompoundTag *base) +{ + TileEntity::save(base); + if (hasCustomName()) base->putString(L"CustomName", name); +} + +void EnchantmentTableEntity::load(CompoundTag *base) +{ + TileEntity::load(base); + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); +} + void EnchantmentTableEntity::tick() { TileEntity::tick(); @@ -89,6 +102,26 @@ void EnchantmentTableEntity::tick() flip = flip + flipA; } +wstring EnchantmentTableEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_ENCHANT); +} + +wstring EnchantmentTableEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +bool EnchantmentTableEntity::hasCustomName() +{ + return !name.empty(); +} + +void EnchantmentTableEntity::setCustomName(const wstring &name) +{ + this->name = name; +} + shared_ptr EnchantmentTableEntity::clone() { shared_ptr result = shared_ptr( new EnchantmentTableEntity() ); diff --git a/Minecraft.World/EnchantmentTableEntity.h b/Minecraft.World/EnchantmentTableEntity.h index aa54c812..18ae5b75 100644 --- a/Minecraft.World/EnchantmentTableEntity.h +++ b/Minecraft.World/EnchantmentTableEntity.h @@ -10,15 +10,24 @@ public: public: int time; - float flip, oFlip, flipT, flipA; - float open, oOpen; - float rot, oRot, tRot; + float flip, oFlip, flipT, flipA; + float open, oOpen; + float rot, oRot, tRot; private: Random *random; + wstring name; + public: EnchantmentTableEntity(); ~EnchantmentTableEntity(); - virtual void tick(); + + virtual void save(CompoundTag *base); + virtual void load(CompoundTag *base); + virtual void tick(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/EnchantmentTableTile.cpp b/Minecraft.World/EnchantmentTableTile.cpp index 70c127ba..d50fe5f5 100644 --- a/Minecraft.World/EnchantmentTableTile.cpp +++ b/Minecraft.World/EnchantmentTableTile.cpp @@ -9,10 +9,10 @@ const wstring EnchantmentTableTile::TEXTURE_SIDE = L"enchantment_side"; const wstring EnchantmentTableTile::TEXTURE_TOP = L"enchantment_top"; const wstring EnchantmentTableTile::TEXTURE_BOTTOM = L"enchantment_bottom"; -EnchantmentTableTile::EnchantmentTableTile(int id) : EntityTile(id, Material::stone, isSolidRender()) +EnchantmentTableTile::EnchantmentTableTile(int id) : BaseEntityTile(id, Material::stone, isSolidRender()) { updateDefaultShape(); - setLightBlock(0); + setLightBlock(0); iconTop = NULL; iconBottom = NULL; @@ -21,7 +21,7 @@ EnchantmentTableTile::EnchantmentTableTile(int id) : EntityTile(id, Material::st // 4J Added override void EnchantmentTableTile::updateDefaultShape() { - setShape(0, 0, 0, 1, 12 / 16.0f, 1); + setShape(0, 0, 0, 1, 12 / 16.0f, 1); } bool EnchantmentTableTile::isCubeShaped() @@ -31,28 +31,28 @@ bool EnchantmentTableTile::isCubeShaped() void EnchantmentTableTile::animateTick(Level *level, int x, int y, int z, Random *random) { - EntityTile::animateTick(level, x, y, z, random); + BaseEntityTile::animateTick(level, x, y, z, random); - for (int xx = x - 2; xx <= x + 2; xx++) + for (int xx = x - 2; xx <= x + 2; xx++) { - for (int zz = z - 2; zz <= z + 2; zz++) + for (int zz = z - 2; zz <= z + 2; zz++) { - if (xx > x - 2 && xx < x + 2 && zz == z - 1) + if (xx > x - 2 && xx < x + 2 && zz == z - 1) { - zz = z + 2; - } - if (random->nextInt(16) != 0) continue; - for (int yy = y; yy <= y + 1; yy++) + zz = z + 2; + } + if (random->nextInt(16) != 0) continue; + for (int yy = y; yy <= y + 1; yy++) { - if (level->getTile(xx, yy, zz) == Tile::bookshelf_Id) + if (level->getTile(xx, yy, zz) == Tile::bookshelf_Id) { - if (!level->isEmptyTile((xx - x) / 2 + x, yy, (zz - z) / 2 + z)) break; + if (!level->isEmptyTile((xx - x) / 2 + x, yy, (zz - z) / 2 + z)) break; - level->addParticle(eParticleType_enchantmenttable, x + 0.5, y + 2.0, z + 0.5, xx - x + random->nextFloat() - 0.5, yy - y - random->nextFloat() - 1, zz - z + random->nextFloat() - 0.5); - } - } - } - } + level->addParticle(eParticleType_enchantmenttable, x + 0.5, y + 2.0, z + 0.5, xx - x + random->nextFloat() - 0.5, yy - y - random->nextFloat() - 1, zz - z + random->nextFloat() - 0.5); + } + } + } + } } bool EnchantmentTableTile::isSolidRender(bool isServerLevel) @@ -76,12 +76,22 @@ bool EnchantmentTableTile::use(Level *level, int x, int y, int z, shared_ptrisClientSide) + if (level->isClientSide) { - return true; - } - player->startEnchanting(x, y, z); - return true; + return true; + } + shared_ptr table = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + player->startEnchanting(x, y, z, table->hasCustomName() ? table->getName() : L""); + return true; +} + +void EnchantmentTableTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + BaseEntityTile::setPlacedBy(level, x, y, z, by, itemInstance); + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } } void EnchantmentTableTile::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/EnchantmentTableTile.h b/Minecraft.World/EnchantmentTableTile.h index 43816cec..ec5c70bf 100644 --- a/Minecraft.World/EnchantmentTableTile.h +++ b/Minecraft.World/EnchantmentTableTile.h @@ -1,8 +1,8 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" class ChunkRebuildData; -class EnchantmentTableTile : public EntityTile +class EnchantmentTableTile : public BaseEntityTile { friend class ChunkRebuildData; public: @@ -16,14 +16,14 @@ private: public: EnchantmentTableTile(int id); - - virtual void updateDefaultShape(); // 4J Added override - bool isCubeShaped(); - void animateTick(Level *level, int x, int y, int z, Random *random); - bool isSolidRender(bool isServerLevel = false); - Icon *getTexture(int face, int data); - shared_ptr newTileEntity(Level *level); - bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - //@Override - void registerIcons(IconRegister *iconRegister); + + virtual void updateDefaultShape(); // 4J Added override + virtual bool isCubeShaped(); + virtual void animateTick(Level *level, int x, int y, int z, Random *random); + virtual bool isSolidRender(bool isServerLevel = false); + virtual Icon *getTexture(int face, int data); + virtual shared_ptr newTileEntity(Level *level); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/EndPodiumFeature.cpp b/Minecraft.World/EndPodiumFeature.cpp index 261b6446..7cf742fa 100644 --- a/Minecraft.World/EndPodiumFeature.cpp +++ b/Minecraft.World/EndPodiumFeature.cpp @@ -74,7 +74,7 @@ bool EndPodiumFeature::place(Level *level, Random *random, int x, int y, int z) { if(level->isEmptyTile(xx,yy,zz)) { - placeBlock(level, xx, yy, zz, Tile::whiteStone_Id, 0); + placeBlock(level, xx, yy, zz, Tile::endStone_Id, 0); } } } diff --git a/Minecraft.World/EndTag.h b/Minecraft.World/EndTag.h index 684ee6ce..2815a577 100644 --- a/Minecraft.World/EndTag.h +++ b/Minecraft.World/EndTag.h @@ -7,7 +7,7 @@ public: EndTag() : Tag(L"") {} EndTag(const wstring &name) : Tag(name) {} - void load(DataInput *dis) {}; + void load(DataInput *dis, int tagDepth) {}; void write(DataOutput *dos) {}; byte getId() { return TAG_End; } diff --git a/Minecraft.World/EnderChestTile.cpp b/Minecraft.World/EnderChestTile.cpp index 7e50a933..ef3c2046 100644 --- a/Minecraft.World/EnderChestTile.cpp +++ b/Minecraft.World/EnderChestTile.cpp @@ -7,7 +7,7 @@ #include "net.minecraft.h" #include "EnderChestTile.h" -EnderChestTile::EnderChestTile(int id) : EntityTile(id, Material::stone, isSolidRender()) +EnderChestTile::EnderChestTile(int id) : BaseEntityTile(id, Material::stone, isSolidRender()) { updateDefaultShape(); } @@ -48,7 +48,7 @@ bool EnderChestTile::isSilkTouchable() return true; } -void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { int facing = 0; int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5f)) & 3; @@ -58,7 +58,7 @@ void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptrsetData(x, y, z, facing); + level->setData(x, y, z, facing, Tile::UPDATE_CLIENTS); } bool EnderChestTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) diff --git a/Minecraft.World/EnderChestTile.h b/Minecraft.World/EnderChestTile.h index 96173f63..4c2bbcbf 100644 --- a/Minecraft.World/EnderChestTile.h +++ b/Minecraft.World/EnderChestTile.h @@ -1,15 +1,15 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" #include "ChestTile.h" -class EnderChestTile : public EntityTile +class EnderChestTile : public BaseEntityTile { public: static const int EVENT_SET_OPEN_COUNT = ChestTile::EVENT_SET_OPEN_COUNT; EnderChestTile(int id); - virtual void updateDefaultShape(); // 4J Added override + virtual void updateDefaultShape(); // 4J Added override bool isSolidRender(bool isServerLevel = false); bool isCubeShaped(); @@ -21,7 +21,7 @@ protected: bool isSilkTouchable(); public: - void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); shared_ptr newTileEntity(Level *level); void animateTick(Level *level, int xt, int yt, int zt, Random *random); diff --git a/Minecraft.World/EnderChestTileEntity.cpp b/Minecraft.World/EnderChestTileEntity.cpp index dffa2bd5..8169c029 100644 --- a/Minecraft.World/EnderChestTileEntity.cpp +++ b/Minecraft.World/EnderChestTileEntity.cpp @@ -55,12 +55,14 @@ void EnderChestTileEntity::tick() } } -void EnderChestTileEntity::triggerEvent(int b0, int b1) +bool EnderChestTileEntity::triggerEvent(int b0, int b1) { if (b0 == ChestTile::EVENT_SET_OPEN_COUNT) { openCount = b1; + return true; } + return TileEntity::triggerEvent(b0, b1); } void EnderChestTileEntity::setRemoved() diff --git a/Minecraft.World/EnderChestTileEntity.h b/Minecraft.World/EnderChestTileEntity.h index f6882980..1231bbd3 100644 --- a/Minecraft.World/EnderChestTileEntity.h +++ b/Minecraft.World/EnderChestTileEntity.h @@ -19,7 +19,7 @@ public: EnderChestTileEntity(); void tick(); - void triggerEvent(int b0, int b1); + bool triggerEvent(int b0, int b1); void setRemoved(); void startOpen(); void stopOpen(); diff --git a/Minecraft.World/EnderCrystal.cpp b/Minecraft.World/EnderCrystal.cpp index 719e9d96..78e00419 100644 --- a/Minecraft.World/EnderCrystal.cpp +++ b/Minecraft.World/EnderCrystal.cpp @@ -63,7 +63,7 @@ void EnderCrystal::tick() int zt = Mth::floor(z); if (level->getTile(xt, yt, zt) != Tile::fire_Id) { - level->setTile(xt, yt, zt, Tile::fire_Id); + level->setTileAndUpdate(xt, yt, zt, Tile::fire_Id); } } } @@ -88,12 +88,12 @@ bool EnderCrystal::isPickable() return true; } -bool EnderCrystal::hurt(DamageSource *source, int damage) +bool EnderCrystal::hurt(DamageSource *source, float damage) { - // 4J-PB - if the owner of the source is the enderdragon, then ignore it (where the dragon's fireball hits an endercrystal) - shared_ptr sourceIsDragon = dynamic_pointer_cast(source->getEntity()); + if (isInvulnerable()) return false; - if(sourceIsDragon!=NULL) + // 4J-PB - if the owner of the source is the enderdragon, then ignore it (where the dragon's fireball hits an endercrystal) + if ( source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_ENDERDRAGON) ) { return false; } diff --git a/Minecraft.World/EnderCrystal.h b/Minecraft.World/EnderCrystal.h index 26606e26..15940452 100644 --- a/Minecraft.World/EnderCrystal.h +++ b/Minecraft.World/EnderCrystal.h @@ -38,5 +38,5 @@ protected: public: virtual float getShadowHeightOffs(); virtual bool isPickable(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); }; \ No newline at end of file diff --git a/Minecraft.World/EnderDragon.cpp b/Minecraft.World/EnderDragon.cpp index 2ccd453c..2dc0c434 100644 --- a/Minecraft.World/EnderDragon.cpp +++ b/Minecraft.World/EnderDragon.cpp @@ -2,7 +2,9 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.boss.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.damagesource.h" @@ -42,9 +44,8 @@ void EnderDragon::_init() // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); xTarget = yTarget = zTarget = 0.0; posPointer = -1; @@ -80,32 +81,10 @@ void EnderDragon::_init() m_currentPath = NULL; } -EnderDragon::EnderDragon(Level *level) : BossMob(level) +EnderDragon::EnderDragon(Level *level) : Mob(level) { _init(); - head = shared_ptr( new BossMobPart(this, L"head", 6, 6) ); - neck = shared_ptr( new BossMobPart(this, L"neck", 6, 6) ); // 4J Added - body = shared_ptr( new BossMobPart(this, L"body", 8, 8) ); - tail1 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - tail2 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - tail3 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - wing1 = shared_ptr( new BossMobPart(this, L"wing", 4, 4) ); - wing2 = shared_ptr( new BossMobPart(this, L"wing", 4, 4) ); - - subEntities.push_back(head); - subEntities.push_back(neck); // 4J Added - subEntities.push_back(body); - subEntities.push_back(tail1); - subEntities.push_back(tail2); - subEntities.push_back(tail3); - subEntities.push_back(wing1); - subEntities.push_back(wing2); - - maxHealth = 200; - setHealth(maxHealth); - - this->textureIdx = TN_MOB_ENDERDRAGON; // 4J was "/mob/enderdragon/ender.png"; setSize(16, 8); noPhysics = true; @@ -118,6 +97,28 @@ EnderDragon::EnderDragon(Level *level) : BossMob(level) noCulling = true; } +// 4J - split off from ctor so we can use shared_from_this() +void EnderDragon::AddParts() +{ + head = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"head", 6, 6) ); + neck = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"neck", 6, 6) ); // 4J Added + body = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"body", 8, 8) ); + tail1 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"tail", 4, 4) ); + tail2 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"tail", 4, 4) ); + tail3 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"tail", 4, 4) ); + wing1 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"wing", 4, 4) ); + wing2 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"wing", 4, 4) ); + + subEntities.push_back(head); + subEntities.push_back(neck); // 4J Added + subEntities.push_back(body); + subEntities.push_back(tail1); + subEntities.push_back(tail2); + subEntities.push_back(tail3); + subEntities.push_back(wing1); + subEntities.push_back(wing2); +} + EnderDragon::~EnderDragon() { if(m_nodes->data != NULL) @@ -132,11 +133,16 @@ EnderDragon::~EnderDragon() if( m_currentPath != NULL ) delete m_currentPath; } -void EnderDragon::defineSynchedData() +void EnderDragon::registerAttributes() { - BossMob::defineSynchedData(); + Mob::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(200); +} - entityData->define(DATA_ID_SYNCHED_HEALTH, maxHealth); +void EnderDragon::defineSynchedData() +{ + Mob::defineSynchedData(); // 4J Added for new dragon behaviour entityData->define(DATA_ID_SYNCHED_ACTION, e_EnderdragonAction_HoldingPattern); @@ -144,7 +150,7 @@ void EnderDragon::defineSynchedData() void EnderDragon::getLatencyPos(doubleArray result, int step, float a) { - if (health <= 0) + if (getHealth() <= 0) { a = 0; } @@ -172,32 +178,28 @@ void EnderDragon::getLatencyPos(doubleArray result, int step, float a) void EnderDragon::aiStep() { - if (!level->isClientSide) - { - entityData->set(DATA_ID_SYNCHED_HEALTH, health); - } - else + if (level->isClientSide) { // 4J Stu - If saved when dead we need to make sure that the actual health is updated correctly on the client // Fix for TU9: Content: Gameplay: Enderdragon respawns after loading game which was previously saved at point of hes death - health = getSynchedHealth(); + setHealth(getHealth()); float flap = Mth::cos(flapTime * PI * 2); float oldFlap = Mth::cos(oFlapTime * PI * 2); if (oldFlap <= -0.3f && flap >= -0.3f) { - level->playLocalSound(x, y, z, eSoundType_MOB_ENDERDRAGON_MOVE, 1, 0.8f + random->nextFloat() * .3f, 100.0f); + level->playLocalSound(x, y, z, eSoundType_MOB_ENDERDRAGON_MOVE, 1, 0.8f + random->nextFloat() * .3f, false, 100.0f); } // play a growl every now and then if(! (getSynchedAction() == e_EnderdragonAction_Sitting_Flaming || - getSynchedAction() == e_EnderdragonAction_Sitting_Scanning || - getSynchedAction() == e_EnderdragonAction_Sitting_Attacking)) + getSynchedAction() == e_EnderdragonAction_Sitting_Scanning || + getSynchedAction() == e_EnderdragonAction_Sitting_Attacking)) { m_iGrowlTimer--; if(m_iGrowlTimer<0) { - level->playLocalSound(x, y, z, eSoundType_MOB_ENDERDRAGON_GROWL, 0.5f, 0.8f + random->nextFloat() * .3f, 100.0f); + level->playLocalSound(x, y, z, eSoundType_MOB_ENDERDRAGON_GROWL, 0.5f, 0.8f + random->nextFloat() * .3f, false, 100.0f); m_iGrowlTimer=200+(random->nextInt(200)); } } @@ -205,7 +207,7 @@ void EnderDragon::aiStep() oFlapTime = flapTime; - if (health <= 0) + if (getHealth() <= 0) { // level.addParticle("explode", x + random.nextFloat() * bbWidth * 2 - bbWidth, y + random.nextFloat() * bbHeight, z + random.nextFloat() * bbWidth * 2 - bbWidth, 0, 0, 0); float xo = (random->nextFloat() - 0.5f) * 8; @@ -342,7 +344,7 @@ void EnderDragon::aiStep() else if( getSynchedAction() == e_EnderdragonAction_Sitting_Attacking ) { // AP - changed this to use playLocalSound because no sound could be heard with playSound (cos it's a stub function) - level->playLocalSound(x, y, z, eSoundType_MOB_ENDERDRAGON_GROWL, 0.5f, 0.8f + random->nextFloat() * .3f, 100.0f); + level->playLocalSound(x, y, z, eSoundType_MOB_ENDERDRAGON_GROWL, 0.5f, 0.8f + random->nextFloat() * .3f, false, 100.0f); } } else @@ -352,7 +354,7 @@ void EnderDragon::aiStep() double zdd = zTarget - z; double dist = xdd * xdd + ydd * ydd + zdd * zdd; - + if( getSynchedAction() == e_EnderdragonAction_Sitting_Flaming ) { --m_actionTicks; @@ -379,7 +381,7 @@ void EnderDragon::aiStep() else if( getSynchedAction() == e_EnderdragonAction_Sitting_Scanning ) { attackTarget = level->getNearestPlayer( shared_from_this(), SITTING_ATTACK_VIEW_RANGE, SITTING_ATTACK_Y_VIEW_RANGE ); - + ++m_actionTicks; if( attackTarget != NULL ) { @@ -444,10 +446,10 @@ void EnderDragon::aiStep() for( AUTO_VAR(it, targets->begin() ); it != targets->end(); ++it) { - shared_ptr e = dynamic_pointer_cast( *it ); - if (e != NULL) + if ( (*it)->instanceof(eTYPE_LIVINGENTITY) ) { //app.DebugPrintf("Attacking entity with acid\n"); + shared_ptr e = dynamic_pointer_cast( *it ); e->hurt(DamageSource::dragonbreath, 2); } } @@ -511,9 +513,9 @@ void EnderDragon::aiStep() } else { -// double xTargetO = xTarget; -// double yTargetO = yTarget; -// double zTargetO = zTarget; + // double xTargetO = xTarget; + // double yTargetO = yTarget; + // double zTargetO = zTarget; if (getSynchedAction() == e_EnderdragonAction_StrafePlayer && attackTarget != NULL && m_currentPath != NULL && m_currentPath->isDone()) { xTarget = attackTarget->x; @@ -685,7 +687,7 @@ void EnderDragon::aiStep() // Curls/straightens the tail for (int i = 0; i < 3; i++) { - shared_ptr part = nullptr; + shared_ptr part = nullptr; if (i == 0) part = tail1; if (i == 1) part = tail2; @@ -706,7 +708,7 @@ void EnderDragon::aiStep() } -// 4J Stu - Fireball attack taken from Ghast + // 4J Stu - Fireball attack taken from Ghast if (!level->isClientSide) { double maxDist = 64.0f; @@ -763,7 +765,7 @@ void EnderDragon::aiStep() if (m_fireballCharge > 0) m_fireballCharge--; } } -// End fireball attack + // End fireball attack if (!level->isClientSide) { @@ -779,14 +781,14 @@ void EnderDragon::checkCrystals() { if (!level->isClientSide) { - hurt(head, DamageSource::explosion, 10); + hurt(head, DamageSource::explosion(NULL), 10); } nearestCrystal = nullptr; } else if (tickCount % 10 == 0) { - if (health < maxHealth) health++; + if (getHealth() < getMaxHealth()) setHealth(getHealth() + 1); } } @@ -798,7 +800,7 @@ void EnderDragon::checkCrystals() shared_ptr crystal = nullptr; double nearest = Double::MAX_VALUE; //for (Entity ec : crystals) - for(AUTO_VAR(it, crystals->begin()); it != crystals->end(); ++it) + for(AUTO_VAR(it, crystals->begin()); it != crystals->end(); ++it) { shared_ptr ec = dynamic_pointer_cast( *it ); double dist = ec->distanceToSqr(shared_from_this() ); @@ -809,7 +811,7 @@ void EnderDragon::checkCrystals() } } delete crystals; - + nearestCrystal = crystal; } @@ -819,10 +821,10 @@ void EnderDragon::checkAttack() { //if (tickCount % 20 == 0) { -// Vec3 *v = getViewVector(1); -// double xdd = 0; -// double ydd = -1; -// double zdd = 0; + // Vec3 *v = getViewVector(1); + // double xdd = 0; + // double ydd = -1; + // double zdd = 0; // double x = (body.bb.x0 + body.bb.x1) / 2; // double y = (body.bb.y0 + body.bb.y1) / 2 - 2; @@ -840,9 +842,10 @@ void EnderDragon::knockBack(vector > *entities) //for (Entity e : entities) for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - shared_ptr e = dynamic_pointer_cast( *it ); - if (e != NULL)//(e instanceof Mob) + + if ( (*it)->instanceof(eTYPE_LIVINGENTITY) )//(e instanceof Mob) { + shared_ptr e = dynamic_pointer_cast( *it ); double xd = e->x - xm; double zd = e->z - zm; double dd = xd * xd + zd * zd; @@ -856,10 +859,11 @@ void EnderDragon::hurt(vector > *entities) //for (int i = 0; i < entities->size(); i++) for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { - shared_ptr e = dynamic_pointer_cast( *it );//entities.get(i); - if (e != NULL) //(e instanceof Mob) + + if ( (*it)->instanceof(eTYPE_LIVINGENTITY) ) //(e instanceof Mob) { - DamageSource *damageSource = DamageSource::mobAttack( dynamic_pointer_cast( shared_from_this() )); + shared_ptr e = dynamic_pointer_cast( *it );//entities.get(i); + DamageSource *damageSource = DamageSource::mobAttack( dynamic_pointer_cast( shared_from_this() )); e->hurt(damageSource, 10); delete damageSource; } @@ -918,12 +922,12 @@ void EnderDragon::findNewTarget() } break; case e_EnderdragonAction_Landing: -// setSynchedAction(e_EnderdragonAction_Sitting_Flaming); -//#if PRINT_DRAGON_STATE_CHANGE_MESSAGES -// app.DebugPrintf("Dragon action is now: SittingFlaming\n"); -//#endif -// m_actionTicks = FLAME_TICKS; - + // setSynchedAction(e_EnderdragonAction_Sitting_Flaming); + //#if PRINT_DRAGON_STATE_CHANGE_MESSAGES + // app.DebugPrintf("Dragon action is now: SittingFlaming\n"); + //#endif + // m_actionTicks = FLAME_TICKS; + m_flameAttacks = 0; setSynchedAction(e_EnderdragonAction_Sitting_Scanning); attackTarget = level->getNearestPlayer( shared_from_this(), SITTING_ATTACK_VIEW_RANGE, SITTING_ATTACK_Y_VIEW_RANGE ); @@ -948,7 +952,7 @@ void EnderDragon::findNewTarget() if( m_currentPath == NULL || m_currentPath->isDone() ) { int currentNodeIndex = findClosestNode(); - + // To get the angle to the player correct when landing, head to a node diametrically opposite the player, then swoop in to 4,4 int eggHeight = max( level->seaLevel + 5, level->getTopSolidBlock(PODIUM_X_POS,PODIUM_Z_POS) ); //level->getHeightmap(4,4); playerNearestToEgg = level->getNearestPlayer(PODIUM_X_POS, eggHeight, PODIUM_Z_POS, 128.0); @@ -986,8 +990,8 @@ void EnderDragon::findNewTarget() } } else if(getSynchedAction() == e_EnderdragonAction_Sitting_Flaming || - getSynchedAction() == e_EnderdragonAction_Sitting_Attacking || - getSynchedAction() == e_EnderdragonAction_Sitting_Scanning) + getSynchedAction() == e_EnderdragonAction_Sitting_Attacking || + getSynchedAction() == e_EnderdragonAction_Sitting_Scanning) { // Does no movement } @@ -1076,14 +1080,13 @@ bool EnderDragon::checkWalls(AABB *bb) { } - else if (t == Tile::obsidian_Id || t == Tile::whiteStone_Id || t == Tile::unbreakable_Id) + else if (t == Tile::obsidian_Id || t == Tile::endStone_Id || t == Tile::unbreakable_Id || !level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) { hitWall = true; } else { - destroyedTile = true; - level->setTile(x, y, z, 0); + destroyedTile = level->removeTile(x, y, z) || destroyedTile; } } } @@ -1100,9 +1103,9 @@ bool EnderDragon::checkWalls(AABB *bb) return hitWall; } -bool EnderDragon::hurt(shared_ptr bossMobPart, DamageSource *source, int damage) +bool EnderDragon::hurt(shared_ptr MultiEntityMobPart, DamageSource *source, float damage) { - if (bossMobPart != head) + if (MultiEntityMobPart != head) { damage = damage / 4 + 1; } @@ -1116,18 +1119,18 @@ bool EnderDragon::hurt(shared_ptr bossMobPart, DamageSource *source //zTarget = z - cc1 * 5 + (random->nextFloat() - 0.5f) * 2; //attackTarget = NULL; - if (source == DamageSource::explosion || (dynamic_pointer_cast(source->getEntity()) != NULL)) + if ( source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_PLAYER) || source->isExplosion() ) { - int healthBefore = health; + int healthBefore = getHealth(); reallyHurt(source, damage); //if(!level->isClientSide) app.DebugPrintf("Health is now %d\n", health); - if( health <= 0 && + if( getHealth() <= 0 && !( getSynchedAction() == e_EnderdragonAction_Sitting_Flaming || - getSynchedAction() == e_EnderdragonAction_Sitting_Scanning || - getSynchedAction() == e_EnderdragonAction_Sitting_Attacking) ) + getSynchedAction() == e_EnderdragonAction_Sitting_Scanning || + getSynchedAction() == e_EnderdragonAction_Sitting_Attacking) ) { - health = 1; + setHealth(1); if( setSynchedAction(e_EnderdragonAction_LandingApproach) ) { @@ -1150,7 +1153,7 @@ bool EnderDragon::hurt(shared_ptr bossMobPart, DamageSource *source getSynchedAction() == e_EnderdragonAction_Sitting_Scanning || getSynchedAction() == e_EnderdragonAction_Sitting_Attacking) { - m_sittingDamageReceived += healthBefore - health; + m_sittingDamageReceived += healthBefore - getHealth(); if(m_sittingDamageReceived > (SITTING_ALLOWED_DAMAGE_PERCENTAGE*getMaxHealth() ) ) { @@ -1166,13 +1169,23 @@ bool EnderDragon::hurt(shared_ptr bossMobPart, DamageSource *source return true; } +bool EnderDragon::hurt(DamageSource *source, float damage) +{ + return false; +} + +bool EnderDragon::reallyHurt(DamageSource *source, float damage) +{ + return Mob::hurt(source, damage); +} + void EnderDragon::tickDeath() { if( getSynchedAction() != e_EnderdragonAction_Sitting_Flaming && getSynchedAction() != e_EnderdragonAction_Sitting_Scanning && getSynchedAction() != e_EnderdragonAction_Sitting_Attacking) { - if(!level->isClientSide) health = 1; + if(!level->isClientSide) setHealth(1); return; } @@ -1198,8 +1211,7 @@ void EnderDragon::tickDeath() } if (dragonDeathTime == 1) { - //level->globalLevelEvent(LevelEvent::SOUND_DRAGON_DEATH, (int) x, (int) y, (int) z, 0); - level->levelEvent(LevelEvent::SOUND_DRAGON_DEATH, (int) x, (int) y, (int) z, 0); + level->globalLevelEvent(LevelEvent::SOUND_DRAGON_DEATH, (int) x, (int) y, (int) z, 0); } } move(0, 0.1f, 0); @@ -1257,22 +1269,22 @@ void EnderDragon::spawnExitPortal(int x, int z) } else { - level->setTile(xx, yy, zz, Tile::unbreakable_Id); + level->setTileAndUpdate(xx, yy, zz, Tile::unbreakable_Id); } } else if (yy > y) { - level->setTile(xx, yy, zz, 0); + level->setTileAndUpdate(xx, yy, zz, 0); } else { if (d > r - 1 - 0.5) { - level->setTile(xx, yy, zz, Tile::unbreakable_Id); + level->setTileAndUpdate(xx, yy, zz, Tile::unbreakable_Id); } else { - level->setTile(xx, yy, zz, Tile::endPortalTile_Id); + level->setTileAndUpdate(xx, yy, zz, Tile::endPortalTile_Id); } } } @@ -1280,15 +1292,15 @@ void EnderDragon::spawnExitPortal(int x, int z) } } - level->setTile(x, y + 0, z, Tile::unbreakable_Id); - level->setTile(x, y + 1, z, Tile::unbreakable_Id); - level->setTile(x, y + 2, z, Tile::unbreakable_Id); - level->setTile(x - 1, y + 2, z, Tile::torch_Id); - level->setTile(x + 1, y + 2, z, Tile::torch_Id); - level->setTile(x, y + 2, z - 1, Tile::torch_Id); - level->setTile(x, y + 2, z + 1, Tile::torch_Id); - level->setTile(x, y + 3, z, Tile::unbreakable_Id); - level->setTile(x, y + 4, z, Tile::dragonEgg_Id); + level->setTileAndUpdate(x, y + 0, z, Tile::unbreakable_Id); + level->setTileAndUpdate(x, y + 1, z, Tile::unbreakable_Id); + level->setTileAndUpdate(x, y + 2, z, Tile::unbreakable_Id); + level->setTileAndUpdate(x - 1, y + 2, z, Tile::torch_Id); + level->setTileAndUpdate(x + 1, y + 2, z, Tile::torch_Id); + level->setTileAndUpdate(x, y + 2, z - 1, Tile::torch_Id); + level->setTileAndUpdate(x, y + 2, z + 1, Tile::torch_Id); + level->setTileAndUpdate(x, y + 3, z, Tile::unbreakable_Id); + level->setTileAndUpdate(x, y + 4, z, Tile::dragonEgg_Id); // 4J-PB - The podium can be floating with nothing under it, so put some whiteStone under it if this is the case for (int yy = y - 5; yy < y - 1; yy++) @@ -1299,7 +1311,7 @@ void EnderDragon::spawnExitPortal(int x, int z) { if(level->isEmptyTile(xx,yy,zz)) { - level->setTile(xx, yy, zz, Tile::whiteStone_Id); + level->setTileAndUpdate(xx, yy, zz, Tile::endStone_Id); } } } @@ -1322,15 +1334,24 @@ bool EnderDragon::isPickable() return false; } -// Fix for TU9 Enderdragon sound hits being the player sound hits - moved this forward from later version -int EnderDragon::getHurtSound() +Level *EnderDragon::getLevel() { - return eSoundType_MOB_ENDERDRAGON_HIT; + return level; } -int EnderDragon::getSynchedHealth() +int EnderDragon::getAmbientSound() { - return entityData->getInteger(DATA_ID_SYNCHED_HEALTH); + return eSoundType_MOB_ENDERDRAGON_GROWL; //"mob.enderdragon.growl"; +} + +int EnderDragon::getHurtSound() +{ + return eSoundType_MOB_ENDERDRAGON_HIT; //"mob.enderdragon.hit"; +} + +float EnderDragon::getSoundVolume() +{ + return 5; } // 4J Added for new dragon behaviour @@ -1343,74 +1364,74 @@ bool EnderDragon::setSynchedAction(EEnderdragonAction action, bool force /*= fal case e_EnderdragonAction_HoldingPattern: switch(action) { - case e_EnderdragonAction_StrafePlayer: - case e_EnderdragonAction_LandingApproach: - validTransition = true; - break; + case e_EnderdragonAction_StrafePlayer: + case e_EnderdragonAction_LandingApproach: + validTransition = true; + break; }; break; case e_EnderdragonAction_StrafePlayer: switch(action) { - case e_EnderdragonAction_HoldingPattern: - case e_EnderdragonAction_LandingApproach: - validTransition = true; - break; + case e_EnderdragonAction_HoldingPattern: + case e_EnderdragonAction_LandingApproach: + validTransition = true; + break; }; break; case e_EnderdragonAction_LandingApproach: switch(action) { - case e_EnderdragonAction_Landing: - validTransition = true; - break; + case e_EnderdragonAction_Landing: + validTransition = true; + break; }; break; case e_EnderdragonAction_Landing: switch(action) { - case e_EnderdragonAction_Sitting_Flaming: - case e_EnderdragonAction_Sitting_Scanning: - validTransition = true; - break; + case e_EnderdragonAction_Sitting_Flaming: + case e_EnderdragonAction_Sitting_Scanning: + validTransition = true; + break; }; break; case e_EnderdragonAction_Takeoff: switch(action) { - case e_EnderdragonAction_HoldingPattern: - validTransition = true; - break; + case e_EnderdragonAction_HoldingPattern: + validTransition = true; + break; }; break; case e_EnderdragonAction_Sitting_Flaming: switch(action) { - case e_EnderdragonAction_Sitting_Scanning: - case e_EnderdragonAction_Sitting_Attacking: - case e_EnderdragonAction_Takeoff: - validTransition = true; - break; + case e_EnderdragonAction_Sitting_Scanning: + case e_EnderdragonAction_Sitting_Attacking: + case e_EnderdragonAction_Takeoff: + validTransition = true; + break; }; break; case e_EnderdragonAction_Sitting_Scanning: switch(action) { - case e_EnderdragonAction_Sitting_Flaming: - case e_EnderdragonAction_Sitting_Attacking: - case e_EnderdragonAction_Takeoff: - validTransition = true; - break; + case e_EnderdragonAction_Sitting_Flaming: + case e_EnderdragonAction_Sitting_Attacking: + case e_EnderdragonAction_Takeoff: + validTransition = true; + break; }; break; case e_EnderdragonAction_Sitting_Attacking: switch(action) { - case e_EnderdragonAction_Sitting_Flaming: - case e_EnderdragonAction_Sitting_Scanning: - case e_EnderdragonAction_Takeoff: - validTransition = true; - break; + case e_EnderdragonAction_Sitting_Flaming: + case e_EnderdragonAction_Sitting_Scanning: + case e_EnderdragonAction_Takeoff: + validTransition = true; + break; }; break; }; @@ -1461,7 +1482,7 @@ void EnderDragon::handleCrystalDestroyed(DamageSource *source) #endif } } - else if(dynamic_pointer_cast(source->getEntity()) != NULL) + else if(source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_PLAYER)) { if(setSynchedAction(e_EnderdragonAction_StrafePlayer)) { @@ -1652,14 +1673,14 @@ Path *EnderDragon::findPath(int startIndex, int endIndex, Node *finalNode /* = N Node *from = m_nodes->data[startIndex]; Node *to = m_nodes->data[endIndex]; - from->g = 0; - from->h = from->distanceTo(to); - from->f = from->h; + from->g = 0; + from->h = from->distanceTo(to); + from->f = from->h; - openSet->clear(); - openSet->insert(from); + openSet->clear(); + openSet->insert(from); - Node *closest = from; + Node *closest = from; int minimumNodeIndex = 0; if(m_remainingCrystalsCount <= 0) @@ -1668,9 +1689,9 @@ Path *EnderDragon::findPath(int startIndex, int endIndex, Node *finalNode /* = N minimumNodeIndex = 12; } - while (!openSet->isEmpty()) + while (!openSet->isEmpty()) { - Node *x = openSet->pop(); + Node *x = openSet->pop(); if (x->equals(to)) { @@ -1680,14 +1701,14 @@ Path *EnderDragon::findPath(int startIndex, int endIndex, Node *finalNode /* = N finalNode->cameFrom = to; to = finalNode; } - return reconstruct_path(from, to); - } + return reconstruct_path(from, to); + } - if (x->distanceTo(to) < closest->distanceTo(to)) + if (x->distanceTo(to) < closest->distanceTo(to)) { - closest = x; - } - x->closed = true; + closest = x; + } + x->closed = true; unsigned int xIndex = 0; for(unsigned int i = 0; i < 24; ++i) @@ -1699,7 +1720,7 @@ Path *EnderDragon::findPath(int startIndex, int endIndex, Node *finalNode /* = N } } - for (int i = minimumNodeIndex; i < 24; i++) + for (int i = minimumNodeIndex; i < 24; i++) { if(m_nodeAdjacency[xIndex] & (1<cameFrom = closest; closest = finalNode; } - return reconstruct_path(from, closest); + return reconstruct_path(from, closest); } // function reconstruct_path(came_from,current_node) Path *EnderDragon::reconstruct_path(Node *from, Node *to) { - int count = 1; - Node *n = to; - while (n->cameFrom != NULL) + int count = 1; + Node *n = to; + while (n->cameFrom != NULL) { - count++; - n = n->cameFrom; - } - - NodeArray nodes = NodeArray(count); - n = to; - nodes.data[--count] = n; - while (n->cameFrom != NULL) + count++; + n = n->cameFrom; + } + + NodeArray nodes = NodeArray(count); + n = to; + nodes.data[--count] = n; + while (n->cameFrom != NULL) { - n = n->cameFrom; - nodes.data[--count] = n; - } + n = n->cameFrom; + nodes.data[--count] = n; + } Path *ret = new Path(nodes); delete [] nodes.data; - return ret; + return ret; } void EnderDragon::addAdditonalSaveData(CompoundTag *entityTag) @@ -1767,7 +1788,7 @@ void EnderDragon::addAdditonalSaveData(CompoundTag *entityTag) entityTag->putShort(L"RemainingCrystals", m_remainingCrystalsCount); entityTag->putInt(L"DragonState", (int)getSynchedAction() ); - BossMob::addAdditonalSaveData(entityTag); + Mob::addAdditonalSaveData(entityTag); } void EnderDragon::readAdditionalSaveData(CompoundTag *tag) @@ -1778,7 +1799,7 @@ void EnderDragon::readAdditionalSaveData(CompoundTag *tag) if(tag->contains(L"DragonState")) setSynchedAction( (EEnderdragonAction)tag->getInt(L"DragonState"), true); - BossMob::readAdditionalSaveData(tag); + Mob::readAdditionalSaveData(tag); } float EnderDragon::getTilt(float a) @@ -1895,7 +1916,7 @@ double EnderDragon::getHeadPartYRotDiff(int partIndex, doubleArray bodyPos, doub Vec3 *EnderDragon::getHeadLookVector(float a) { Vec3 *result = NULL; - + if( getSynchedAction() == e_EnderdragonAction_Landing || getSynchedAction() == e_EnderdragonAction_Takeoff ) { int eggHeight = level->getTopSolidBlock(PODIUM_X_POS,PODIUM_Z_POS); //level->getHeightmap(4,4); @@ -1903,7 +1924,7 @@ Vec3 *EnderDragon::getHeadLookVector(float a) if( dist < 1.0f ) dist = 1.0f; // The 6.0f is dragon->getHeadPartYOffset(6, start, p) float yOffset = 6.0f / dist; - + double xRotTemp = xRot; double rotScale = 1.5f; xRot = -yOffset * rotScale * 5.0f; diff --git a/Minecraft.World/EnderDragon.h b/Minecraft.World/EnderDragon.h index 8a12c08c..a13ecaa2 100644 --- a/Minecraft.World/EnderDragon.h +++ b/Minecraft.World/EnderDragon.h @@ -1,22 +1,22 @@ #pragma once using namespace std; #include "BossMob.h" +#include "MultiEntityMob.h" +#include "Enemy.h" -class BossMobPart; +class MultiEntityMobPart; class EnderCrystal; class Node; class BinaryHeap; class Path; -class EnderDragon : public BossMob +class EnderDragon : public Mob, public BossMob, public MultiEntityMob, public Enemy { public: eINSTANCEOF GetType() { return eTYPE_ENDERDRAGON; }; static Entity *create(Level *level) { return new EnderDragon(level); } -private: - static const int DATA_ID_SYNCHED_HEALTH = 16; - +private: // 4J Added for new behaviours static const int DATA_ID_SYNCHED_ACTION = 17; @@ -27,16 +27,16 @@ public: double positions[positionsLength][3]; int posPointer; - //BossMobPart[] subEntities; + //MultiEntityMobPart[] subEntities; vector > subEntities; - shared_ptr head; - shared_ptr neck; // 4J Added - shared_ptr body; - shared_ptr tail1; - shared_ptr tail2; - shared_ptr tail3; - shared_ptr wing1; - shared_ptr wing2; + shared_ptr head; + shared_ptr neck; // 4J Added + shared_ptr body; + shared_ptr tail1; + shared_ptr tail2; + shared_ptr tail3; + shared_ptr wing1; + shared_ptr wing2; float oFlapTime; float flapTime; @@ -112,9 +112,11 @@ private: public: EnderDragon(Level *level); + void AddParts(); virtual ~EnderDragon(); protected: + virtual void registerAttributes(); virtual void defineSynchedData(); public: @@ -122,7 +124,7 @@ public: virtual void aiStep(); private: - using BossMob::hurt; + using MultiEntityMob::hurt; void checkCrystals(); void checkAttack(); @@ -133,9 +135,11 @@ private: bool checkWalls(AABB *bb); public: - virtual bool hurt(shared_ptr bossMobPart, DamageSource *source, int damage); + virtual bool hurt(shared_ptr MultiEntityMobPart, DamageSource *source, float damage); + virtual bool hurt(DamageSource *source, float damage); protected: + virtual bool reallyHurt(DamageSource *source, float damage); virtual void tickDeath(); private: @@ -143,11 +147,15 @@ private: protected: virtual void checkDespawn(); - virtual int getHurtSound(); public: virtual vector > *getSubEntities(); virtual bool isPickable(); - virtual int getSynchedHealth(); + Level *getLevel(); + +protected: + int getAmbientSound(); + int getHurtSound(); + float getSoundVolume(); private: // 4J added for new dragon behaviour @@ -174,4 +182,8 @@ public: double getHeadPartYOffset(int partIndex, doubleArray bodyPos, doubleArray partPos); double getHeadPartYRotDiff(int partIndex, doubleArray bodyPos, doubleArray partPos); Vec3 *getHeadLookVector(float a); + + virtual wstring getAName() { return app.GetString(IDS_ENDERDRAGON); }; + virtual float getHealth() { return LivingEntity::getHealth(); }; + virtual float getMaxHealth() { return LivingEntity::getMaxHealth(); }; }; diff --git a/Minecraft.World/EnderEyeItem.cpp b/Minecraft.World/EnderEyeItem.cpp index a08c1f62..063e1408 100644 --- a/Minecraft.World/EnderEyeItem.cpp +++ b/Minecraft.World/EnderEyeItem.cpp @@ -18,11 +18,12 @@ bool EnderEyeItem::useOn(shared_ptr instance, shared_ptr p int targetType = level->getTile(x, y, z); int targetData = level->getData(x, y, z); - if (player->mayBuild(x, y, z) && targetType == Tile::endPortalFrameTile_Id && !TheEndPortalFrameTile::hasEye(targetData)) + if (player->mayUseItemAt(x, y, z, face, instance) && targetType == Tile::endPortalFrameTile_Id && !TheEndPortalFrameTile::hasEye(targetData)) { if(bTestUseOnOnly) return true; if (level->isClientSide) return true; - level->setData(x, y, z, targetData + TheEndPortalFrameTile::EYE_BIT); + level->setData(x, y, z, targetData + TheEndPortalFrameTile::EYE_BIT, Tile::UPDATE_CLIENTS); + level->updateNeighbourForOutputSignal(x, y, z, Tile::endPortalFrameTile_Id); instance->count--; for (int i = 0; i < 16; i++) @@ -121,7 +122,7 @@ bool EnderEyeItem::useOn(shared_ptr instance, shared_ptr p targetX += Direction::STEP_X[direction] * pz; targetZ += Direction::STEP_Z[direction] * pz; - level->setTile(targetX, y, targetZ, Tile::endPortalTile_Id); + level->setTileAndData(targetX, y, targetZ, Tile::endPortalTile_Id, 0, Tile::UPDATE_CLIENTS); } } } @@ -132,7 +133,7 @@ bool EnderEyeItem::useOn(shared_ptr instance, shared_ptr p return false; } -bool EnderEyeItem::TestUse(Level *level, shared_ptr player) +bool EnderEyeItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, false); if (hr != NULL && hr->type == HitResult::TILE) @@ -210,29 +211,13 @@ shared_ptr EnderEyeItem::use(shared_ptr instance, Le eyeOfEnderSignal->signalTo(level->getLevelData()->getXStronghold()<<4, player->y + 1.62 - player->heightOffset, level->getLevelData()->getZStronghold()<<4); level->addEntity(eyeOfEnderSignal); - level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + level->playEntitySound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); level->levelEvent(nullptr, LevelEvent::SOUND_LAUNCH, (int) player->x, (int) player->y, (int) player->z, 0); if (!player->abilities.instabuild) { instance->count--; } } - - /*TilePos *nearestMapFeature = level->findNearestMapFeature(LargeFeature::STRONGHOLD, (int) player->x, (int) player->y, (int) player->z); - if (nearestMapFeature != NULL) - { - shared_ptr eyeOfEnderSignal = shared_ptr( new EyeOfEnderSignal(level, player->x, player->y + 1.62 - player->heightOffset, player->z) ); - eyeOfEnderSignal->signalTo(nearestMapFeature->x, nearestMapFeature->y, nearestMapFeature->z); - delete nearestMapFeature; - level->addEntity(eyeOfEnderSignal); - - level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - level->levelEvent(NULL, LevelEvent::SOUND_LAUNCH, (int) player->x, (int) player->y, (int) player->z, 0); - if (!player->abilities.instabuild) - { - instance->count--; - } - }*/ } return instance; } \ No newline at end of file diff --git a/Minecraft.World/EnderEyeItem.h b/Minecraft.World/EnderEyeItem.h index 72036aa5..cbe880d2 100644 --- a/Minecraft.World/EnderEyeItem.h +++ b/Minecraft.World/EnderEyeItem.h @@ -8,6 +8,6 @@ public: EnderEyeItem(int id); virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/EnderMan.cpp b/Minecraft.World/EnderMan.cpp index abfc5cb5..d099911c 100644 --- a/Minecraft.World/EnderMan.cpp +++ b/Minecraft.World/EnderMan.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" @@ -10,7 +12,7 @@ #include "..\Minecraft.Client\Textures.h" #include "EnderMan.h" - +AttributeModifier *EnderMan::SPEED_MODIFIER_ATTACKING = (new AttributeModifier(eModifierId_MOB_ENDERMAN_ATTACKSPEED, 6.2f, AttributeModifier::OPERATION_ADDITION))->setSerialize(false); bool EnderMan::MAY_TAKE[256]; @@ -23,8 +25,8 @@ void EnderMan::staticCtor() MAY_TAKE[Tile::gravel_Id] = true; MAY_TAKE[Tile::flower_Id] = true; MAY_TAKE[Tile::rose_Id] = true; - MAY_TAKE[Tile::mushroom1_Id] = true; - MAY_TAKE[Tile::mushroom2_Id] = true; + MAY_TAKE[Tile::mushroom_brown_Id] = true; + MAY_TAKE[Tile::mushroom_red_Id] = true; MAY_TAKE[Tile::tnt_Id] = true; MAY_TAKE[Tile::cactus_Id] = true; MAY_TAKE[Tile::clay_Id] = true; @@ -39,27 +41,28 @@ EnderMan::EnderMan(Level *level) : Monster( level ) // the derived version of the function is called // Brought forward from 1.2.3 this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); // 4J initialisors teleportTime = 0; aggroTime = 0; + lastAttackTarget = nullptr; + aggroedByPlayer = false; - this->textureIdx = TN_MOB_ENDERMAN; // 4J was "/mob/enderman.png"; - runSpeed = 0.2f; - attackDamage = 7; setSize(0.6f, 2.9f); footSize = 1; } -int EnderMan::getMaxHealth() +void EnderMan::registerAttributes() { - return 40; + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(40); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.3f); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(7); } -// Brought forward from 1.2.3 void EnderMan::defineSynchedData() { Monster::defineSynchedData(); @@ -97,6 +100,8 @@ shared_ptr EnderMan::findAttackTarget() { if (isLookingAtMe(player)) { + aggroedByPlayer = true; + if (aggroTime == 0) level->playEntitySound(player, eSoundType_MOB_ENDERMAN_STARE, 1, 1); if (aggroTime++ == 5) { aggroTime = 0; @@ -131,48 +136,61 @@ bool EnderMan::isLookingAtMe(shared_ptr player) void EnderMan::aiStep() { - if (this->isInWaterOrRain()) hurt(DamageSource::drown, 1); + if (isInWaterOrRain()) hurt(DamageSource::drown, 1); + + if (lastAttackTarget != attackTarget) + { + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + speed->removeModifier(SPEED_MODIFIER_ATTACKING); + + if (attackTarget != NULL) + { + speed->addModifier(new AttributeModifier(*SPEED_MODIFIER_ATTACKING)); + } + } - runSpeed = attackTarget != NULL ? 6.5f : 0.3f; + lastAttackTarget = attackTarget; if (!level->isClientSide) { - if (getCarryingTile() == 0) + if (level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) { - if (random->nextInt(20) == 0) + if (getCarryingTile() == 0) { - int xt = Mth::floor(x - 2 + random->nextDouble() * 4); - int yt = Mth::floor(y + random->nextDouble() * 3); - int zt = Mth::floor(z - 2 + random->nextDouble() * 4); - int t = level->getTile(xt, yt, zt); - //if (t > 0 && Tile::tiles[t]->isCubeShaped()) - if(EnderMan::MAY_TAKE[t]) // 4J - Brought forward from 1.2.3 + if (random->nextInt(20) == 0) { - setCarryingTile(level->getTile(xt, yt, zt)); - setCarryingData(level->getData(xt, yt, zt)); - level->setTile(xt, yt, zt, 0); + int xt = Mth::floor(x - 2 + random->nextDouble() * 4); + int yt = Mth::floor(y + random->nextDouble() * 3); + int zt = Mth::floor(z - 2 + random->nextDouble() * 4); + int t = level->getTile(xt, yt, zt); + if(MAY_TAKE[t]) + { + setCarryingTile(level->getTile(xt, yt, zt)); + setCarryingData(level->getData(xt, yt, zt)); + level->setTileAndUpdate(xt, yt, zt, 0); + } } } - } - else - { - if (random->nextInt(2000) == 0) + else { - int xt = Mth::floor(x - 1 + random->nextDouble() * 2); - int yt = Mth::floor(y + random->nextDouble() * 2); - int zt = Mth::floor(z - 1 + random->nextDouble() * 2); - int t = level->getTile(xt, yt, zt); - int bt = level->getTile(xt, yt - 1, zt); - if (t == 0 && bt > 0 && Tile::tiles[bt]->isCubeShaped()) + if (random->nextInt(2000) == 0) { - level->setTileAndData(xt, yt, zt, getCarryingTile(), getCarryingData()); - setCarryingTile(0); + int xt = Mth::floor(x - 1 + random->nextDouble() * 2); + int yt = Mth::floor(y + random->nextDouble() * 2); + int zt = Mth::floor(z - 1 + random->nextDouble() * 2); + int t = level->getTile(xt, yt, zt); + int bt = level->getTile(xt, yt - 1, zt); + if (t == 0 && bt > 0 && Tile::tiles[bt]->isCubeShaped()) + { + level->setTileAndData(xt, yt, zt, getCarryingTile(), getCarryingData(), Tile::UPDATE_ALL); + setCarryingTile(0); + } } } } } - // 4J - Brought forward particles from 1.2.3 + for (int i = 0; i < 2; i++) { level->addParticle(eParticleType_ender, x + (random->nextDouble() - 0.5) * bbWidth, y + random->nextDouble() * bbHeight - 0.25f, z + (random->nextDouble() - 0.5) * bbWidth, @@ -184,37 +202,41 @@ void EnderMan::aiStep() float br = getBrightness(1); if (br > 0.5f) { - if (level->canSeeSky(Mth::floor(x), Mth::floor(y), Mth::floor(z)) && random->nextFloat() * 30 < (br - 0.4f) * 2) + if (level->canSeeSky(Mth::floor(x), (int)floor( y + 0.5 ), Mth::floor(z)) && random->nextFloat() * 30 < (br - 0.4f) * 2) { - // 4J - Brought forward behaviour change from 1.2.3 - //onFire = 20 * 15; attackTarget = nullptr; setCreepy(false); + aggroedByPlayer = false; teleport(); } } } - // 4J Brought forward behaviour change from 1.2.3 + if (isInWaterOrRain() || isOnFire()) { attackTarget = nullptr; setCreepy(false); + aggroedByPlayer = false; teleport(); } + + if (isCreepy() && !aggroedByPlayer && random->nextInt(100) == 0) + { + setCreepy(false); + } + jumping = false; if (attackTarget != NULL) { - this->lookAt(attackTarget, 100, 100); + lookAt(attackTarget, 100, 100); } if (!level->isClientSide && isAlive()) { if (attackTarget != NULL) { - if ( dynamic_pointer_cast(attackTarget) != NULL && isLookingAtMe(dynamic_pointer_cast(attackTarget))) + if ( attackTarget->instanceof(eTYPE_PLAYER) && isLookingAtMe(dynamic_pointer_cast(attackTarget))) { - xxa = yya = 0; - runSpeed = 0; if (attackTarget->distanceToSqr(shared_from_this()) < 4 * 4) { teleport(); @@ -316,13 +338,10 @@ bool EnderMan::teleport(double xx, double yy, double zz) double _y = yo + (y - yo) * d + random->nextDouble() * bbHeight; double _z = zo + (z - zo) * d + (random->nextDouble() - 0.5) * bbWidth * 2; - // 4J - Brought forward particle change from 1.2.3 - //level->addParticle(eParticleType_largesmoke, _x, _y, _z, xa, ya, za); level->addParticle(eParticleType_ender, _x, _y, _z, xa, ya, za); } - // 4J - moved sounds forward from 1.2.3 level->playSound(xo, yo, zo, eSoundType_MOB_ENDERMEN_PORTAL, 1, 1); - level->playSound(shared_from_this(), eSoundType_MOB_ENDERMEN_PORTAL, 1, 1); + playSound(eSoundType_MOB_ENDERMEN_PORTAL, 1, 1); return true; } else @@ -334,19 +353,16 @@ bool EnderMan::teleport(double xx, double yy, double zz) int EnderMan::getAmbientSound() { - // 4J - brought sound change forward from 1.2.3 - return eSoundType_MOB_ENDERMEN_IDLE; + return isCreepy()? eSoundType_MOB_ENDERMAN_SCREAM : eSoundType_MOB_ENDERMEN_IDLE; } int EnderMan::getHurtSound() { - // 4J - brought sound change forward from 1.2.3 return eSoundType_MOB_ENDERMEN_HIT; } int EnderMan::getDeathSound() { - // 4J - brought sound change forward from 1.2.3 return eSoundType_MOB_ENDERMEN_DEATH; } @@ -387,13 +403,25 @@ int EnderMan::getCarryingData() return entityData->getByte(DATA_CARRY_ITEM_DATA); } -bool EnderMan::hurt(DamageSource *source, int damage) +bool EnderMan::hurt(DamageSource *source, float damage) { + if (isInvulnerable()) return false; + setCreepy(true); + + if ( dynamic_cast(source) != NULL && source->getEntity()->instanceof(eTYPE_PLAYER)) + { + aggroedByPlayer = true; + } + if (dynamic_cast(source) != NULL) { + aggroedByPlayer = false; for (int i = 0; i < 64; i++) { - if (teleport()) return true; + if (teleport()) + { + return true; + } } return false; } diff --git a/Minecraft.World/EnderMan.h b/Minecraft.World/EnderMan.h index f5084532..10fb2b37 100644 --- a/Minecraft.World/EnderMan.h +++ b/Minecraft.World/EnderMan.h @@ -10,6 +10,8 @@ public: public: static void staticCtor(); private: + static AttributeModifier *SPEED_MODIFIER_ATTACKING; + static bool MAY_TAKE[256]; static const int DATA_CARRY_ITEM_ID = 16; @@ -19,13 +21,14 @@ private: private: int teleportTime; int aggroTime; + shared_ptr lastAttackTarget; + bool aggroedByPlayer; public: EnderMan(Level *level); - virtual int getMaxHealth(); - protected: + virtual void registerAttributes(); virtual void defineSynchedData(); public: @@ -53,12 +56,11 @@ protected: virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: - // 4J Brought forward from 1.2.3 to help fix Enderman behaviour void setCarryingTile(int carryingTile); int getCarryingTile(); void setCarryingData(int carryingData); int getCarryingData(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); bool isCreepy(); void setCreepy(bool creepy); }; \ No newline at end of file diff --git a/Minecraft.World/EnderpearlItem.cpp b/Minecraft.World/EnderpearlItem.cpp index 7a9b6e52..e1ed693b 100644 --- a/Minecraft.World/EnderpearlItem.cpp +++ b/Minecraft.World/EnderpearlItem.cpp @@ -7,10 +7,10 @@ EnderpearlItem::EnderpearlItem(int id) : Item(id) { - this->maxStackSize = 16; + maxStackSize = 16; } -bool EnderpearlItem::TestUse(Level *level, shared_ptr player) +bool EnderpearlItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { return true; } @@ -25,7 +25,7 @@ shared_ptr EnderpearlItem::use(shared_ptr instance, instance->count--; } - level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + level->playEntitySound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); if (!level->isClientSide) { level->addEntity( shared_ptr( new ThrownEnderpearl(level, player) ) ); diff --git a/Minecraft.World/EnderpearlItem.h b/Minecraft.World/EnderpearlItem.h index 84913b9e..973f5284 100644 --- a/Minecraft.World/EnderpearlItem.h +++ b/Minecraft.World/EnderpearlItem.h @@ -9,5 +9,5 @@ public: virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); // 4J added - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr instance, Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/Enemy.cpp b/Minecraft.World/Enemy.cpp index 25d1ad47..b9aa3e20 100644 --- a/Minecraft.World/Enemy.cpp +++ b/Minecraft.World/Enemy.cpp @@ -1,10 +1,9 @@ #include "stdafx.h" #include "Enemy.h" +EntitySelector *Enemy::ENEMY_SELECTOR = new Enemy::EnemyEntitySelector(); - -const int Enemy::XP_REWARD_NONE = 0; -const int Enemy::XP_REWARD_SMALL = 3; -const int Enemy::XP_REWARD_MEDIUM = 5; -const int Enemy::XP_REWARD_LARGE = 10; -const int Enemy::XP_REWARD_HUGE = 20; \ No newline at end of file +bool Enemy::EnemyEntitySelector::matches(shared_ptr entity) const +{ + return (entity != NULL) && entity->instanceof(eTYPE_ENEMY); +} \ No newline at end of file diff --git a/Minecraft.World/Enemy.h b/Minecraft.World/Enemy.h index cb7d3a3e..9d5f4603 100644 --- a/Minecraft.World/Enemy.h +++ b/Minecraft.World/Enemy.h @@ -1,14 +1,21 @@ #pragma once #include "Creature.h" - -class Level; +#include "EntitySelector.h" class Enemy : public Creature { public: - static const int XP_REWARD_NONE; - static const int XP_REWARD_SMALL; - static const int XP_REWARD_MEDIUM; - static const int XP_REWARD_LARGE; - static const int XP_REWARD_HUGE; + class EnemyEntitySelector : public EntitySelector + { + bool matches(shared_ptr entity) const; + }; + + static const int XP_REWARD_NONE = 0; + static const int XP_REWARD_SMALL = 3; + static const int XP_REWARD_MEDIUM = 5; + static const int XP_REWARD_LARGE = 10; + static const int XP_REWARD_HUGE = 20; + static const int XP_REWARD_BOSS = 50; + + static EntitySelector *ENEMY_SELECTOR; }; diff --git a/Minecraft.World/Entity.cpp b/Minecraft.World/Entity.cpp index 4c9d5cf6..f1c2259c 100644 --- a/Minecraft.World/Entity.cpp +++ b/Minecraft.World/Entity.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.enchantment.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.entity.item.h" @@ -21,7 +22,10 @@ #include "..\Minecraft.Client\MinecraftServer.h" #include "..\Minecraft.Client\MultiPlayerLevel.h" #include "..\Minecraft.Client\MultiplayerLocalPlayer.h" +#include "..\Minecraft.Client\ServerLevel.h" +#include "..\Minecraft.Client\PlayerList.h" +const wstring Entity::RIDING_TAG = L"Riding"; int Entity::entityCounter = 2048; // 4J - changed initialiser to 2048, as we are using range 0 - 2047 as special unique smaller ids for things that need network tracked DWORD Entity::tlsIdx = TlsAlloc(); @@ -55,7 +59,7 @@ int Entity::getSmallId() if( removedFound ) { // Has set up the entityIdRemovingFlags vector in this case, so we should check against this when allocating new ids -// app.DebugPrintf("getSmallId: Removed entities found\n"); + // app.DebugPrintf("getSmallId: Removed entities found\n"); puiRemovedFlags = entityIdRemovingFlags; } } @@ -75,7 +79,7 @@ int Entity::getSmallId() { if( puiRemovedFlags[i] & uiMask ) { -// app.DebugPrintf("Avoiding using ID %d (0x%x)\n", i * 32 + j,puiRemovedFlags[i]); + // app.DebugPrintf("Avoiding using ID %d (0x%x)\n", i * 32 + j,puiRemovedFlags[i]); uiMask >>= 1; continue; } @@ -234,7 +238,7 @@ void Entity::tickExtraWandering() // 4J - added for common ctor code // Do all the default initialisations done in the java class -void Entity::_init(bool useSmallId) +void Entity::_init(bool useSmallId, Level *level) { // 4J - changed to assign two different types of ids. A range from 0-2047 is used for things that we'll be wanting to identify over the network, // so we should only need 11 bits rather than 32 to uniquely identify them. The rest of the range is used for anything we don't need to track like this, @@ -254,6 +258,7 @@ void Entity::_init(bool useSmallId) blocksBuilding = false; rider = weak_ptr(); riding = nullptr; + forcedLoading = false; //level = NULL; // Level is assigned to in the original c_tor code xo = yo = zo = 0.0; @@ -277,6 +282,7 @@ void Entity::_init(bool useSmallId) walkDistO = 0; walkDist = 0; + moveDist = 0.0f; fallDistance = 0; @@ -301,15 +307,17 @@ void Entity::_init(bool useSmallId) firstTick = true; - - customTextureUrl = L""; - customTextureUrl2 = L""; - - fireImmune = false; // values that need to be sent to clients in SMP - entityData = shared_ptr(new SynchedEntityData()); + if( useSmallId ) + { + entityData = shared_ptr(new SynchedEntityData()); + } + else + { + entityData = nullptr; + } xRideRotA = yRideRotA = 0.0; inChunk = false; @@ -320,23 +328,43 @@ void Entity::_init(bool useSmallId) hasImpulse = false; + changingDimensionDelay = 0; + isInsidePortal = false; + portalTime = 0; + dimension = 0; + portalEntranceDir = 0; + invulnerable = false; + if( useSmallId ) + { + uuid = L"ent" + Mth::createInsecureUUID(random); + } + // 4J Added m_ignoreVerticalCollisions = false; m_uiAnimOverrideBitmask = 0L; + m_ignorePortal = false; } Entity::Entity(Level *level, bool useSmallId) // 4J - added useSmallId parameter { MemSect(16); - _init(useSmallId); + _init(useSmallId, level); MemSect(0); this->level = level; // resetPos(); setPos(0, 0, 0); - entityData->define(DATA_SHARED_FLAGS_ID, (byte) 0); - entityData->define(DATA_AIR_SUPPLY_ID, TOTAL_AIR_SUPPLY); // 4J Stu - Brought forward from 1.2.3 to fix 38654 - Gameplay: Player will take damage when air bubbles are present if resuming game from load/autosave underwater. + if (level != NULL) + { + dimension = level->dimension->id; + } + + if( entityData ) + { + entityData->define(DATA_SHARED_FLAGS_ID, (byte) 0); + entityData->define(DATA_AIR_SUPPLY_ID, TOTAL_AIR_SUPPLY); // 4J Stu - Brought forward from 1.2.3 to fix 38654 - Gameplay: Player will take damage when air bubbles are present if resuming game from load/autosave underwater. + } // 4J Stu - We cannot call virtual functions in ctors, as at this point the object // is of type Entity and not a derived class @@ -482,9 +510,11 @@ void Entity::baseTick() // 4J Stu - Not needed //util.Timer.push("entityBaseTick"); - if (riding != NULL && riding->removed) riding = nullptr; + if (riding != NULL && riding->removed) + { + riding = nullptr; + } - tickCount++; walkDistO = walkDist; xo = x; yo = y; @@ -492,10 +522,54 @@ void Entity::baseTick() xRotO = xRot; yRotO = yRot; + if (!level->isClientSide) // 4J Stu - Don't need this && level instanceof ServerLevel) + { + if(!m_ignorePortal) // 4J Added + { + MinecraftServer *server = dynamic_cast(level)->getServer(); + int waitTime = getPortalWaitTime(); + + if (isInsidePortal) + { + if (server->isNetherEnabled()) + { + if (riding == NULL) + { + if (portalTime++ >= waitTime) + { + portalTime = waitTime; + changingDimensionDelay = getDimensionChangingDelay(); + + int targetDimension; + + if (level->dimension->id == -1) + { + targetDimension = 0; + } + else + { + targetDimension = -1; + } + + changeDimension(targetDimension); + } + } + isInsidePortal = false; + } + } + else + { + if (portalTime > 0) portalTime -= 4; + if (portalTime < 0) portalTime = 0; + } + if (changingDimensionDelay > 0) changingDimensionDelay--; + } + } + if (isSprinting() && !isInWater() && canCreateParticles()) { int xt = Mth::floor(x); - int yt = Mth::floor(y - 0.2f - this->heightOffset); + int yt = Mth::floor(y - 0.2f - heightOffset); int zt = Mth::floor(z); int t = level->getTile(xt, yt, zt); int d = level->getData(xt, yt, zt); @@ -505,37 +579,7 @@ void Entity::baseTick() } } - if (updateInWaterState()) - { - if (!wasInWater && !firstTick && canCreateParticles()) - { - float speed = Mth::sqrt(xd * xd * 0.2f + yd * yd + zd * zd * 0.2f) * 0.2f; - if (speed > 1) speed = 1; - MemSect(31); - level->playSound(shared_from_this(), eSoundType_RANDOM_SPLASH, speed, 1 + (random->nextFloat() - random->nextFloat()) * 0.4f); - MemSect(0); - float yt = (float) Mth::floor(bb->y0); - for (int i = 0; i < 1 + bbWidth * 20; i++) - { - float xo = (random->nextFloat() * 2 - 1) * bbWidth; - float zo = (random->nextFloat() * 2 - 1) * bbWidth; - level->addParticle(eParticleType_bubble, x + xo, yt + 1, z + zo, xd, yd - random->nextFloat() * 0.2f, zd); - } - for (int i = 0; i < 1 + bbWidth * 20; i++) - { - float xo = (random->nextFloat() * 2 - 1) * bbWidth; - float zo = (random->nextFloat() * 2 - 1) * bbWidth; - level->addParticle(eParticleType_splash, x + xo, yt + 1, z + zo, xd, yd, zd); - } - } - fallDistance = 0; - wasInWater = true; - onFire = 0; - } - else - { - wasInWater = false; - } + updateInWaterState(); if (level->isClientSide) { @@ -575,7 +619,6 @@ void Entity::baseTick() if (!level->isClientSide) { setSharedFlag(FLAG_ONFIRE, onFire > 0); - setSharedFlag(FLAG_RIDING, riding != NULL); } firstTick = false; @@ -584,6 +627,10 @@ void Entity::baseTick() //util.Timer.pop(); } +int Entity::getPortalWaitTime() +{ + return 0; +} void Entity::lavaHurt() { @@ -650,6 +697,7 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - ySlideOffset *= 0.4f; double xo = x; + double yo = y; double zo = z; if (isStuckInWeb) @@ -670,7 +718,7 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - AABB *bbOrg = bb->copy(); - bool isPlayerSneaking = onGround && isSneaking() && dynamic_pointer_cast(shared_from_this()) != NULL; + bool isPlayerSneaking = onGround && isSneaking() && instanceof(eTYPE_PLAYER); if (isPlayerSneaking) { @@ -709,8 +757,8 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - AUTO_VAR(itEndAABB, aABBs->end()); // 4J Stu - Particles (and possibly other entities) don't have xChunk and zChunk set, so calculate the chunk instead - int xc = Mth::floor(x / 16); - int zc = Mth::floor(z / 16); + int xc = Mth::floor(x / 16); + int zc = Mth::floor(z / 16); if(!level->isClientSide || level->reallyHasChunk(xc, zc)) { // 4J Stu - It's horrible that the client is doing any movement at all! But if we don't have the chunk @@ -824,13 +872,6 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - za = zaN; bb->set(normal); } - else - { - double ss = bb->y0 - (int) bb->y0; - if (ss > 0) { - ySlideOffset += (float) (ss + 0.01); - } - } } @@ -849,14 +890,14 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - if (zaOrg != za) zd = 0; double xm = x - xo; + double ym = y - yo; double zm = z - zo; if (makeStepSound() && !isPlayerSneaking && riding == NULL) { - walkDist += (float) ( sqrt(xm * xm + zm * zm) * 0.6 ); int xt = Mth::floor(x); - int yt = Mth::floor(y - 0.2f - this->heightOffset); + int yt = Mth::floor(y - 0.2f - heightOffset); int zt = Mth::floor(z); int t = level->getTile(xt, yt, zt); if (t == 0) @@ -867,10 +908,23 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - t = level->getTile(xt, yt - 1, zt); } } + if (t != Tile::ladder_Id) + { + ym = 0; + } + + walkDist += Mth::sqrt(xm * xm + zm * zm) * 0.6; + moveDist += Mth::sqrt(xm * xm + ym * ym + zm * zm) * 0.6; - if (walkDist > nextStep && t > 0) + if (moveDist > nextStep && t > 0) { - nextStep = (int) walkDist + 1; + nextStep = (int) moveDist + 1; + if (isInWater()) + { + float speed = Mth::sqrt(xd * xd * 0.2f + yd * yd + zd * zd * 0.2f) * 0.35f; + if (speed > 1) speed = 1; + playSound(eSoundType_LIQUID_SWIM, speed, 1 + (random->nextFloat() - random->nextFloat()) * 0.4f); + } playStepSound(xt, yt, zt, t); Tile::tiles[t]->stepOn(level, xt, yt, zt, shared_from_this()); } @@ -879,7 +933,7 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - checkInsideTiles(); - bool water = this->isInWaterOrRain(); + bool water = isInWaterOrRain(); if (level->containsFireTile(bb->shrink(0.001, 0.001, 0.001))) { burn(1); @@ -899,7 +953,7 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - if (water && onFire > 0) { - level->playSound(shared_from_this(), eSoundType_RANDOM_FIZZ, 0.7f, 1.6f + (random->nextFloat() - random->nextFloat()) * 0.4f); + playSound(eSoundType_RANDOM_FIZZ, 0.7f, 1.6f + (random->nextFloat() - random->nextFloat()) * 0.4f); onFire = -flameTime; } } @@ -933,7 +987,8 @@ void Entity::playStepSound(int xt, int yt, int zt, int t) { const Tile::SoundType *soundType = Tile::tiles[t]->soundType; MemSect(31); - if(GetType() == eTYPE_PLAYER) + + if (GetType() == eTYPE_PLAYER) { // should we turn off step sounds? unsigned int uiAnimOverrideBitmask=getAnimOverrideBitmask(); // this is masked for custom anim off, and force anim @@ -943,51 +998,23 @@ void Entity::playStepSound(int xt, int yt, int zt, int t) return; } - MultiPlayerLevel *mplevel= (MultiPlayerLevel *)level; - - if(mplevel) - { - if (level->getTile(xt, yt + 1, zt) == Tile::topSnow_Id) - { - soundType = Tile::topSnow->soundType; - mplevel->playLocalSound((double)xt+0.5,(double)yt,(double)zt+0.5,soundType->getStepSound(), soundType->getVolume() * 0.15f, soundType->getPitch()); - } - else if (!Tile::tiles[t]->material->isLiquid()) - { - mplevel->playLocalSound((double)xt+0.5,(double)yt,(double)zt+0.5,soundType->getStepSound(), soundType->getVolume() * 0.15f, soundType->getPitch()); - } - } - else - { - if (level->getTile(xt, yt + 1, zt) == Tile::topSnow_Id) - { - soundType = Tile::topSnow->soundType; - level->playLocalSound((double)xt+0.5,(double)yt,(double)zt+0.5,soundType->getStepSound(), soundType->getVolume() * 0.15f, soundType->getPitch()); - } - else if (!Tile::tiles[t]->material->isLiquid()) - { - level->playLocalSound((double)xt+0.5,(double)yt,(double)zt+0.5,soundType->getStepSound(), soundType->getVolume() * 0.15f, soundType->getPitch()); - } - } } - else + if (level->getTile(xt, yt + 1, zt) == Tile::topSnow_Id) { - if (level->getTile(xt, yt + 1, zt) == Tile::topSnow_Id) - { - soundType = Tile::topSnow->soundType; - level->playSound(shared_from_this(), soundType->getStepSound(), soundType->getVolume() * 0.15f, soundType->getPitch()); - } - else if (!Tile::tiles[t]->material->isLiquid()) - { - level->playSound(shared_from_this(), soundType->getStepSound(), soundType->getVolume() * 0.15f, soundType->getPitch()); - } + soundType = Tile::topSnow->soundType; + playSound(soundType->getStepSound(), soundType->getVolume() * 0.15f, soundType->getPitch()); + } + else if (!Tile::tiles[t]->material->isLiquid()) + { + playSound(soundType->getStepSound(), soundType->getVolume() * 0.15f, soundType->getPitch()); } + MemSect(0); } void Entity::playSound(int iSound, float volume, float pitch) { - level->playSound(shared_from_this(), iSound, volume, pitch); + level->playEntitySound(shared_from_this(), iSound, volume, pitch); } bool Entity::makeStepSound() @@ -1001,22 +1028,6 @@ void Entity::checkFallDamage(double ya, bool onGround) { if (fallDistance > 0) { - if (dynamic_pointer_cast(shared_from_this()) != NULL) - { - int xt = Mth::floor(x); - int yt = Mth::floor(y - 0.2f - this->heightOffset); - int zt = Mth::floor(z); - int t = level->getTile(xt, yt, zt); - if (t == 0 && level->getTile(xt, yt - 1, zt) == Tile::fence_Id) - { - t = level->getTile(xt, yt - 1, zt); - } - - if (t > 0) - { - Tile::tiles[t]->fallOn(level, xt, yt, zt, shared_from_this(), fallDistance); - } - } causeFallDamage(fallDistance); fallDistance = 0; } @@ -1053,7 +1064,7 @@ void Entity::causeFallDamage(float distance) bool Entity::isInWaterOrRain() { - return wasInWater || (level->isRainingAt( Mth::floor(x), Mth::floor(y), Mth::floor(z))); + return wasInWater || (level->isRainingAt( Mth::floor(x), Mth::floor(y), Mth::floor(z)) || level->isRainingAt(Mth::floor(x), Mth::floor(y + bbHeight), Mth::floor(z))); } bool Entity::isInWater() @@ -1063,7 +1074,38 @@ bool Entity::isInWater() bool Entity::updateInWaterState() { - return level->checkAndHandleWater(bb->grow(0, -0.4f, 0)->shrink(0.001, 0.001, 0.001), Material::water, shared_from_this()); + if(level->checkAndHandleWater(bb->grow(0, -0.4f, 0)->shrink(0.001, 0.001, 0.001), Material::water, shared_from_this())) + { + if (!wasInWater && !firstTick && canCreateParticles()) + { + float speed = Mth::sqrt(xd * xd * 0.2f + yd * yd + zd * zd * 0.2f) * 0.2f; + if (speed > 1) speed = 1; + MemSect(31); + playSound(eSoundType_RANDOM_SPLASH, speed, 1 + (random->nextFloat() - random->nextFloat()) * 0.4f); + MemSect(0); + float yt = (float) Mth::floor(bb->y0); + for (int i = 0; i < 1 + bbWidth * 20; i++) + { + float xo = (random->nextFloat() * 2 - 1) * bbWidth; + float zo = (random->nextFloat() * 2 - 1) * bbWidth; + level->addParticle(eParticleType_bubble, x + xo, yt + 1, z + zo, xd, yd - random->nextFloat() * 0.2f, zd); + } + for (int i = 0; i < 1 + bbWidth * 20; i++) + { + float xo = (random->nextFloat() * 2 - 1) * bbWidth; + float zo = (random->nextFloat() * 2 - 1) * bbWidth; + level->addParticle(eParticleType_splash, x + xo, yt + 1, z + zo, xd, yd, zd); + } + } + fallDistance = 0; + wasInWater = true; + onFire = 0; + } + else + { + wasInWater = false; + } + return wasInWater; } bool Entity::isUnderLiquid(Material *material) @@ -1118,7 +1160,7 @@ int Entity::getLightColor(float a) if (level->hasChunkAt(xTile, 0, zTile)) { double hh = (bb->y1 - bb->y0) * 0.66; - int yTile = Mth::floor(y - this->heightOffset + hh); + int yTile = Mth::floor(y - heightOffset + hh); return level->getLightColor(xTile, yTile, zTile, 0); } return 0; @@ -1132,7 +1174,7 @@ float Entity::getBrightness(float a) if (level->hasChunkAt(xTile, 0, zTile)) { double hh = (bb->y1 - bb->y0) * 0.66; - int yTile = Mth::floor(y - this->heightOffset + hh); + int yTile = Mth::floor(y - heightOffset + hh); return level->getBrightness(xTile, yTile, zTile); } return 0; @@ -1145,28 +1187,28 @@ void Entity::setLevel(Level *level) void Entity::absMoveTo(double x, double y, double z, float yRot, float xRot) { - this->xo = this->x = x; - this->yo = this->y = y; - this->zo = this->z = z; - this->yRotO = this->yRot = yRot; - this->xRotO = this->xRot = xRot; + xo = this->x = x; + yo = this->y = y; + zo = this->z = z; + yRotO = this->yRot = yRot; + xRotO = this->xRot = xRot; ySlideOffset = 0; double yRotDiff = yRotO - yRot; if (yRotDiff < -180) yRotO += 360; if (yRotDiff >= 180) yRotO -= 360; - this->setPos(this->x, this->y, this->z); - this->setRot(yRot, xRot); + setPos(this->x, this->y, this->z); + setRot(yRot, xRot); } void Entity::moveTo(double x, double y, double z, float yRot, float xRot) { - this->xOld = this->xo = this->x = x; - this->yOld = this->yo = this->y = y + heightOffset; - this->zOld = this->zo = this->z = z; + xOld = xo = this->x = x; + yOld = yo = this->y = y + heightOffset; + zOld = zo = this->z = z; this->yRot = yRot; this->xRot = xRot; - this->setPos(this->x, this->y, this->z); + setPos(this->x, this->y, this->z); } float Entity::distanceTo(shared_ptr e) @@ -1231,7 +1273,7 @@ void Entity::push(shared_ptr e) xa *= 1 - pushthrough; za *= 1 - pushthrough; - this->push(-xa, 0, -za); + push(-xa, 0, -za); e->push(xa, 0, za); } } @@ -1241,18 +1283,17 @@ void Entity::push(double xa, double ya, double za) xd += xa; yd += ya; zd += za; - this->hasImpulse = true; + hasImpulse = true; } - void Entity::markHurt() { - this->hurtMarked = true; + hurtMarked = true; } - -bool Entity::hurt(DamageSource *source, int damage) +bool Entity::hurt(DamageSource *source, float damage) { + if(isInvulnerable()) return false; markHurt(); return false; } @@ -1297,21 +1338,28 @@ bool Entity::shouldRenderAtSqrDistance(double distance) return distance < size * size; } -// 4J - used to be wstring return type, returning L"" -int Entity::getTexture() +bool Entity::isCreativeModeAllowed() { - return -1; + return false; } -bool Entity::isCreativeModeAllowed() +bool Entity::saveAsMount(CompoundTag *entityTag) { - return false; + wstring id = getEncodeId(); + if (removed || id.empty() ) + { + return false; + } + // TODO Is this fine to be casting to a non-const char pointer? + entityTag->putString(L"id", id ); + saveWithoutId(entityTag); + return true; } bool Entity::save(CompoundTag *entityTag) { wstring id = getEncodeId(); - if (removed || id.empty() ) + if (removed || id.empty() || (rider.lock() != NULL) ) { return false; } @@ -1331,8 +1379,22 @@ void Entity::saveWithoutId(CompoundTag *entityTag) entityTag->putShort(L"Fire", (short) onFire); entityTag->putShort(L"Air", (short) getAirSupply()); entityTag->putBoolean(L"OnGround", onGround); + entityTag->putInt(L"Dimension", dimension); + entityTag->putBoolean(L"Invulnerable", invulnerable); + entityTag->putInt(L"PortalCooldown", changingDimensionDelay); + + entityTag->putString(L"UUID", uuid); addAdditonalSaveData(entityTag); + + if (riding != NULL) + { + CompoundTag *ridingTag = new CompoundTag(RIDING_TAG); + if (riding->saveAsMount(ridingTag)) + { + entityTag->put(L"Riding", ridingTag); + } + } } void Entity::load(CompoundTag *tag) @@ -1369,19 +1431,43 @@ void Entity::load(CompoundTag *tag) onFire = tag->getShort(L"Fire"); setAirSupply(tag->getShort(L"Air")); onGround = tag->getBoolean(L"OnGround"); + dimension = tag->getInt(L"Dimension"); + invulnerable = tag->getBoolean(L"Invulnerable"); + changingDimensionDelay = tag->getInt(L"PortalCooldown"); + + if (tag->contains(L"UUID")) + { + uuid = tag->getString(L"UUID"); + } setPos(x, y, z); setRot(yRot, xRot); readAdditionalSaveData(tag); + + // set position again because bb size may have changed + if (repositionEntityAfterLoad()) setPos(x, y, z); } +bool Entity::repositionEntityAfterLoad() +{ + return true; +} const wstring Entity::getEncodeId() { return EntityIO::getEncodeId( shared_from_this() ); } +/** +* Called after load() has finished and the entity has been added to the +* world +*/ +void Entity::onLoadedFromSave() +{ + +} + ListTag *Entity::newDoubleList(unsigned int number, double firstValue, ...) { ListTag *res = new ListTag(); @@ -1449,6 +1535,10 @@ shared_ptr Entity::spawnAtLocation(int resource, int count, float yO shared_ptr Entity::spawnAtLocation(shared_ptr itemInstance, float yOffs) { + if (itemInstance->count == 0) + { + return nullptr; + } shared_ptr ie = shared_ptr( new ItemEntity(level, x, y + yOffs, z, itemInstance) ); ie->throwTime = 10; level->addEntity(ie); @@ -1468,7 +1558,7 @@ bool Entity::isInWall() float yo = ((i >> 1) % 2 - 0.5f) * 0.1f; float zo = ((i >> 2) % 2 - 0.5f) * bbWidth * 0.8f; int xt = Mth::floor(x + xo); - int yt = Mth::floor(y + this->getHeadHeight() + yo); + int yt = Mth::floor(y + getHeadHeight() + yo); int zt = Mth::floor(z + zo); if (level->isSolidBlockingTile(xt, yt, zt)) { @@ -1525,24 +1615,20 @@ void Entity::rideTick() yRideRotA -= yra; xRideRotA -= xra; - yRot += (float) yra; - xRot += (float) xra; + // jeb: This caused the crosshair to "drift" while riding horses. For now I've just disabled it, + // because I can't figure out what it's needed for. Riding boats and minecarts seem unaffected... + // yRot += yra; + // xRot += xra; } void Entity::positionRider() { shared_ptr lockedRider = rider.lock(); - if( lockedRider ) + if( lockedRider == NULL) { - shared_ptr player = dynamic_pointer_cast(lockedRider); - if (!(player && player->isLocalPlayer())) - { - lockedRider->xOld = xOld; - lockedRider->yOld = yOld + getRideHeight() + lockedRider->getRidingHeight(); - lockedRider->zOld = zOld; - } - lockedRider->setPos(x, y + getRideHeight() + lockedRider->getRidingHeight(), z); + return; } + lockedRider->setPos(x, y + getRideHeight() + lockedRider->getRidingHeight(), z); } double Entity::getRidingHeight() @@ -1564,7 +1650,7 @@ void Entity::ride(shared_ptr e) { if (riding != NULL) { - // 4J Stu - Position should already be updated before the SetRidingPacket comes in + // 4J Stu - Position should already be updated before the SetEntityLinkPacket comes in if(!level->isClientSide) moveTo(riding->x, riding->bb->y0 + riding->bbHeight, riding->z, yRot, xRot); riding->rider = weak_ptr(); } @@ -1579,52 +1665,6 @@ void Entity::ride(shared_ptr e) e->rider = shared_from_this(); } -// 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player -void Entity::findStandUpPosition(shared_ptr vehicle) -{ - AABB *boundingBox; - double fallbackX = vehicle->x; - double fallbackY = vehicle->bb->y0 + vehicle->bbHeight; - double fallbackZ = vehicle->z; - - for (double xDiff = -1.5; xDiff < 2; xDiff += 1.5) - { - for (double zDiff = -1.5; zDiff < 2; zDiff += 1.5) - { - if (xDiff == 0 && zDiff == 0) - { - continue; - } - - int xToInt = (int) (this->x + xDiff); - int zToInt = (int) (this->z + zDiff); - - // 4J Stu - Added loop over y to restaring the bb into 2 block high spaces if required (eg the track block plus 1 air block above it for minecarts) - for(double yDiff = 1.0; yDiff >= 0; yDiff -= 0.5) - { - boundingBox = this->bb->cloneMove(xDiff, yDiff, zDiff); - - if (level->getTileCubes(boundingBox,true)->size() == 0) - { - if (level->isTopSolidBlocking(xToInt, (int) (y - (1-yDiff)), zToInt)) - { - this->moveTo(this->x + xDiff, this->y + yDiff, this->z + zDiff, yRot, xRot); - return; - } - else if (level->isTopSolidBlocking(xToInt, (int) (y - (1-yDiff)) - 1, zToInt) || level->getMaterial(xToInt, (int) (y - (1-yDiff)) - 1, zToInt) == Material::water) - { - fallbackX = x + xDiff; - fallbackY = y + yDiff; - fallbackZ = z + zDiff; - } - } - } - } - } - - this->moveTo(fallbackX, fallbackY, fallbackZ, yRot, xRot); -} - void Entity::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) { setPos(x, y, z); @@ -1663,6 +1703,26 @@ Vec3 *Entity::getLookAngle() void Entity::handleInsidePortal() { + if (changingDimensionDelay > 0) + { + changingDimensionDelay = getDimensionChangingDelay(); + return; + } + + double xd = xo - x; + double zd = zo - z; + + if (!level->isClientSide && !isInsidePortal) + { + portalEntranceDir = Direction::getDirection(xd, zd); + } + + isInsidePortal = true; +} + +int Entity::getDimensionChangingDelay() +{ + return SharedConstants::TICKS_PER_SECOND * 45; } void Entity::lerpMotion(double xd, double yd, double zd) @@ -1680,10 +1740,6 @@ void Entity::animateHurt() { } -void Entity::prepareCustomTextures() -{ -} - ItemInstanceArray Entity::getEquipmentSlots() // ItemInstance[] { return ItemInstanceArray(); // Default ctor creates NULL internal array @@ -1696,12 +1752,12 @@ void Entity::setEquippedSlot(int slot, shared_ptr item) bool Entity::isOnFire() { - return onFire > 0 || getSharedFlag(FLAG_ONFIRE); + return !fireImmune && (onFire > 0 || getSharedFlag(FLAG_ONFIRE)); } bool Entity::isRiding() { - return riding != NULL || getSharedFlag(FLAG_RIDING); + return riding != NULL; } bool Entity::isSneaking() @@ -1771,19 +1827,29 @@ void Entity::setUsingItemFlag(bool value) bool Entity::getSharedFlag(int flag) { - return (entityData->getByte(DATA_SHARED_FLAGS_ID) & (1 << flag)) != 0; + if( entityData ) + { + return (entityData->getByte(DATA_SHARED_FLAGS_ID) & (1 << flag)) != 0; + } + else + { + return false; + } } void Entity::setSharedFlag(int flag, bool value) { - byte currentValue = entityData->getByte(DATA_SHARED_FLAGS_ID); - if (value) - { - entityData->set(DATA_SHARED_FLAGS_ID, (byte) (currentValue | (1 << flag))); - } - else + if( entityData ) { - entityData->set(DATA_SHARED_FLAGS_ID, (byte) (currentValue & ~(1 << flag))); + byte currentValue = entityData->getByte(DATA_SHARED_FLAGS_ID); + if (value) + { + entityData->set(DATA_SHARED_FLAGS_ID, (byte) (currentValue | (1 << flag))); + } + else + { + entityData->set(DATA_SHARED_FLAGS_ID, (byte) (currentValue & ~(1 << flag))); + } } } @@ -1806,11 +1872,10 @@ void Entity::thunderHit(const LightningBolt *lightningBolt) if (onFire == 0) setOnFire(8); } -void Entity::killed(shared_ptr mob) +void Entity::killed(shared_ptr mob) { } - bool Entity::checkInTile(double x, double y, double z) { int xTile = Mth::floor(x); @@ -1821,16 +1886,17 @@ bool Entity::checkInTile(double x, double y, double z) double yd = y - (yTile); double zd = z - (zTile); - if (level->isSolidBlockingTile(xTile, yTile, zTile)) + vector *cubes = level->getTileCubes(bb); + if ( (cubes && !cubes->empty()) || level->isFullAABBTile(xTile, yTile, zTile)) { - bool west = !level->isSolidBlockingTile(xTile - 1, yTile, zTile); - bool east = !level->isSolidBlockingTile(xTile + 1, yTile, zTile); - bool up = !level->isSolidBlockingTile(xTile, yTile - 1, zTile); - bool down = !level->isSolidBlockingTile(xTile, yTile + 1, zTile); - bool north = !level->isSolidBlockingTile(xTile, yTile, zTile - 1); - bool south = !level->isSolidBlockingTile(xTile, yTile, zTile + 1); - - int dir = -1; + bool west = !level->isFullAABBTile(xTile - 1, yTile, zTile); + bool east = !level->isFullAABBTile(xTile + 1, yTile, zTile); + bool down = !level->isFullAABBTile(xTile, yTile - 1, zTile); + bool up = !level->isFullAABBTile(xTile, yTile + 1, zTile); + bool north = !level->isFullAABBTile(xTile, yTile, zTile - 1); + bool south = !level->isFullAABBTile(xTile, yTile, zTile + 1); + + int dir = 3; double closest = 9999; if (west && xd < closest) { @@ -1842,12 +1908,7 @@ bool Entity::checkInTile(double x, double y, double z) closest = 1 - xd; dir = 1; } - if (up && yd < closest) - { - closest = yd; - dir = 2; - } - if (down && 1 - yd < closest) + if (up && 1 - yd < closest) { closest = 1 - yd; dir = 3; @@ -1872,9 +1933,9 @@ bool Entity::checkInTile(double x, double y, double z) if (dir == 4) this->zd = -speed; if (dir == 5) this->zd = +speed; + return true; } - return false; } @@ -1886,10 +1947,13 @@ void Entity::makeStuckInWeb() wstring Entity::getAName() { +#ifdef _DEBUG wstring id = EntityIO::getEncodeId(shared_from_this()); if (id.empty()) id = L"generic"; return L"entity." + id + _toString(entityId); - //return I18n.get("entity." + id + ".name"); +#else + return L""; +#endif } vector > *Entity::getSubEntities() @@ -1916,16 +1980,147 @@ bool Entity::isAttackable() return true; } -bool Entity::isInvulnerable() +bool Entity::skipAttackInteraction(shared_ptr source) { return false; } +bool Entity::isInvulnerable() +{ + return invulnerable; +} + void Entity::copyPosition(shared_ptr target) { moveTo(target->x, target->y, target->z, target->yRot, target->xRot); } +void Entity::restoreFrom(shared_ptr oldEntity, bool teleporting) +{ + CompoundTag *tag = new CompoundTag(); + oldEntity->saveWithoutId(tag); + load(tag); + delete tag; + changingDimensionDelay = oldEntity->changingDimensionDelay; + portalEntranceDir = oldEntity->portalEntranceDir; +} + +void Entity::changeDimension(int i) +{ + if (level->isClientSide || removed) return; + + MinecraftServer *server = MinecraftServer::getInstance(); + int lastDimension = dimension; + ServerLevel *oldLevel = server->getLevel(lastDimension); + ServerLevel *newLevel = server->getLevel(i); + + if (lastDimension == 1 && i == 1) + { + newLevel = server->getLevel(0); + } + + // 4J: Restrictions on what can go through + { + // 4J: Some things should just be destroyed when they hit a portal + if (instanceof(eTYPE_FALLINGTILE)) + { + removed = true; + return; + } + + // 4J: Check server level entity limit (arrows, item entities, experience orbs, etc) + if (newLevel->atEntityLimit(shared_from_this())) return; + + // 4J: Check level limit on living entities, minecarts and boats + if (!instanceof(eTYPE_PLAYER) && !newLevel->canCreateMore(GetType(), Level::eSpawnType_Portal)) return; + } + + // 4J: Definitely sending, set dimension now + dimension = newLevel->dimension->id; + + level->removeEntity(shared_from_this()); + removed = false; + + server->getPlayers()->repositionAcrossDimension(shared_from_this(), lastDimension, oldLevel, newLevel); + shared_ptr newEntity = EntityIO::newEntity(EntityIO::getEncodeId(shared_from_this()), newLevel); + + if (newEntity != NULL) + { + newEntity->restoreFrom(shared_from_this(), true); + + if (lastDimension == 1 && i == 1) + { + Pos *spawnPos = newLevel->getSharedSpawnPos(); + spawnPos->y = level->getTopSolidBlock(spawnPos->x, spawnPos->z); + newEntity->moveTo(spawnPos->x, spawnPos->y, spawnPos->z, newEntity->yRot, newEntity->xRot); + delete spawnPos; + } + + newLevel->addEntity(newEntity); + } + + removed = true; + + oldLevel->resetEmptyTime(); + newLevel->resetEmptyTime(); +} + +float Entity::getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile) +{ + return tile->getExplosionResistance(shared_from_this()); +} + +bool Entity::shouldTileExplode(Explosion *explosion, Level *level, int x, int y, int z, int id, float power) +{ + return true; +} + +int Entity::getMaxFallDistance() +{ + return 3; +} + +int Entity::getPortalEntranceDir() +{ + return portalEntranceDir; +} + +bool Entity::isIgnoringTileTriggers() +{ + return false; +} + +bool Entity::displayFireAnimation() +{ + return isOnFire(); +} + +void Entity::setUUID(const wstring &UUID) +{ + uuid = UUID; +} + +wstring Entity::getUUID() +{ + return uuid; +} + +bool Entity::isPushedByWater() +{ + return true; +} + +wstring Entity::getDisplayName() +{ + return getAName(); +} + +// 4J: Added to retrieve name that should be sent in ChatPackets (important on Xbox One for players) +wstring Entity::getNetworkName() +{ + return getDisplayName(); +} + void Entity::setAnimOverrideBitmask(unsigned int uiBitmask) { m_uiAnimOverrideBitmask=uiBitmask; @@ -1953,4 +2148,4 @@ unsigned int Entity::getAnimOverrideBitmask() } return m_uiAnimOverrideBitmask; -} +} \ No newline at end of file diff --git a/Minecraft.World/Entity.h b/Minecraft.World/Entity.h index bde83e30..e2a26290 100644 --- a/Minecraft.World/Entity.h +++ b/Minecraft.World/Entity.h @@ -6,7 +6,7 @@ using namespace std; #include "Vec3.h" #include "Definitions.h" -class Mob; +class LivingEntity; class LightningBolt; class ItemEntity; class EntityPos; @@ -17,6 +17,7 @@ class Random; class Level; class CompoundTag; class DamageSource; +class Explosion; // 4J Stu Added this mainly to allow is to record telemetry for player deaths enum EEntityDamageType @@ -33,13 +34,16 @@ enum EEntityDamageType class Entity : public enable_shared_from_this { -friend class Gui; // 4J Stu - Added to be able to access the shared flag functions and constants, without making them publicly available to everything + friend class Gui; // 4J Stu - Added to be able to access the shared flag functions and constants, without making them publicly available to everything public: // 4J-PB - added to replace (e instanceof Type), avoiding dynamic casts virtual eINSTANCEOF GetType() = 0; -public: + inline bool instanceof(eINSTANCEOF super) { return eTYPE_DERIVED_FROM(super, GetType()); } + inline static bool instanceof(eINSTANCEOF type, eINSTANCEOF super) { return eTYPE_DERIVED_FROM(super, type); } +public: + static const wstring RIDING_TAG; static const short TOTAL_AIR_SUPPLY = 20 * 15; private: @@ -53,6 +57,7 @@ public: bool blocksBuilding; weak_ptr rider; // Changed to weak to avoid circular dependency between rider/riding entity shared_ptr riding; + bool forcedLoading; Level *level; double xo, yo, zo; @@ -79,6 +84,7 @@ public: float walkDistO; float walkDist; + float moveDist; float fallDistance; private: @@ -110,10 +116,6 @@ public: private: bool firstTick; -public: - wstring customTextureUrl; - wstring customTextureUrl2; - protected: bool fireImmune; @@ -125,7 +127,7 @@ private: static const int DATA_SHARED_FLAGS_ID = 0; static const int FLAG_ONFIRE = 0; static const int FLAG_SNEAKING = 1; - static const int FLAG_RIDING = 2; + //static const int FLAG_ = 2; static const int FLAG_SPRINTING = 3; static const int FLAG_USING_ITEM = 4; static const int FLAG_INVISIBLE = 5; @@ -138,22 +140,39 @@ private: public: bool inChunk; - int xChunk, yChunk, zChunk; - int xp, yp, zp, xRotp, yRotp; - bool noCulling; - bool hasImpulse; + int xChunk, yChunk, zChunk; + int xp, yp, zp, xRotp, yRotp; + bool noCulling; + bool hasImpulse; + int changingDimensionDelay; + +protected: + bool isInsidePortal; + int portalTime; + +public: + int dimension; + +protected: + int portalEntranceDir; + +private: + bool invulnerable; + wstring uuid; protected: // 4J Added so that client side simulations on the host are not affected by zero-lag bool m_ignoreVerticalCollisions; + bool m_ignorePortal; + public: Entity(Level *level, bool useSmallId = true); // 4J - added useSmallId parameter virtual ~Entity(); protected: // 4J - added for common ctor code - void _init(bool useSmallId); + void _init(bool useSmallId, Level *level); protected: virtual void defineSynchedData() = 0; @@ -191,6 +210,7 @@ public: void interpolateTurn(float xo, float yo); virtual void tick(); virtual void baseTick(); + virtual int getPortalWaitTime(); protected: void lavaHurt(); @@ -256,7 +276,7 @@ protected: public: // 4J Added damageSource param to enable telemetry on player deaths - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); bool intersects(double x0, double y0, double z0, double x1, double y1, double z1); virtual bool isPickable(); virtual bool isPushable(); @@ -264,18 +284,24 @@ public: virtual void awardKillScore(shared_ptr victim, int score); virtual bool shouldRender(Vec3 *c); virtual bool shouldRenderAtSqrDistance(double distance); - virtual int getTexture(); // 4J - changed from wstring to int virtual bool isCreativeModeAllowed(); + bool saveAsMount(CompoundTag *entityTag); bool save(CompoundTag *entityTag); void saveWithoutId(CompoundTag *entityTag); virtual void load(CompoundTag *tag); protected: + virtual bool repositionEntityAfterLoad(); const wstring getEncodeId(); public: virtual void readAdditionalSaveData(CompoundTag *tag) = 0; virtual void addAdditonalSaveData(CompoundTag *tag) = 0; + /** + * Called after load() has finished and the entity has been added to the + * world + */ + virtual void onLoadedFromSave(); protected: ListTag *newDoubleList(unsigned int number, double firstValue, ...); @@ -296,15 +322,14 @@ public: virtual double getRidingHeight(); virtual double getRideHeight(); virtual void ride(shared_ptr e); - virtual void findStandUpPosition(shared_ptr vehicle); // 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); virtual float getPickRadius(); virtual Vec3 *getLookAngle(); virtual void handleInsidePortal(); + virtual int getDimensionChangingDelay(); virtual void lerpMotion(double xd, double yd, double zd); virtual void handleEntityEvent(byte eventId); virtual void animateHurt(); - virtual void prepareCustomTextures(); virtual ItemInstanceArray getEquipmentSlots(); // ItemInstance[] virtual void setEquippedSlot(int slot, shared_ptr item); // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game virtual bool isOnFire(); @@ -336,7 +361,7 @@ public: void setAirSupply(int supply); virtual void thunderHit(const LightningBolt *lightningBolt); - virtual void killed(shared_ptr mob); + virtual void killed(shared_ptr mob); protected: bool checkInTile(double x, double y, double z); @@ -346,9 +371,6 @@ public: virtual wstring getAName(); - // TU9 - bool skipAttackInteraction(shared_ptr source) {return false;} - // 4J - added to manage allocation of small ids private: // Things also added here to be able to manage the concept of a number of extra "wandering" entities - normally path finding entities aren't allowed to @@ -374,14 +396,28 @@ public: void considerForExtraWandering(bool enable); bool isExtraWanderingEnabled(); int getWanderingQuadrant(); - + virtual vector > *getSubEntities(); virtual bool is(shared_ptr other); virtual float getYHeadRot(); virtual void setYHeadRot(float yHeadRot); virtual bool isAttackable(); + virtual bool skipAttackInteraction(shared_ptr source); virtual bool isInvulnerable(); virtual void copyPosition(shared_ptr target); + virtual void restoreFrom(shared_ptr oldEntity, bool teleporting); + virtual void changeDimension(int i); + virtual float getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile); + virtual bool shouldTileExplode(Explosion *explosion, Level *level, int x, int y, int z, int id, float power); + virtual int getMaxFallDistance(); + virtual int getPortalEntranceDir(); + virtual bool isIgnoringTileTriggers(); + virtual bool displayFireAnimation(); + virtual void setUUID(const wstring &UUID); + virtual wstring getUUID(); + virtual bool isPushedByWater(); + virtual wstring getDisplayName(); + virtual wstring getNetworkName(); // 4J: Added private: unsigned int m_uiAnimOverrideBitmask; diff --git a/Minecraft.World/EntityActionAtPositionPacket.cpp b/Minecraft.World/EntityActionAtPositionPacket.cpp index 7353f932..64f36d1f 100644 --- a/Minecraft.World/EntityActionAtPositionPacket.cpp +++ b/Minecraft.World/EntityActionAtPositionPacket.cpp @@ -24,7 +24,7 @@ EntityActionAtPositionPacket::EntityActionAtPositionPacket(shared_ptr e, this->x = x; this->y = y; this->z = z; - this->id = e->entityId; + id = e->entityId; } void EntityActionAtPositionPacket::read(DataInputStream *dis) //throws IOException diff --git a/Minecraft.World/EntityDamageSource.cpp b/Minecraft.World/EntityDamageSource.cpp index 8c7a5ee1..22237bf1 100644 --- a/Minecraft.World/EntityDamageSource.cpp +++ b/Minecraft.World/EntityDamageSource.cpp @@ -5,7 +5,7 @@ #include "net.minecraft.network.packet.h" //EntityDamageSource::EntityDamageSource(const wstring &msgId, shared_ptr entity) : DamageSource(msgId) -EntityDamageSource::EntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity) : DamageSource(msgId) +EntityDamageSource::EntityDamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId, shared_ptr entity) : DamageSource(msgId, msgWithItemId) { this->entity = entity; } @@ -21,18 +21,41 @@ shared_ptr EntityDamageSource::getEntity() // //return I18n.get("death." + msgId, player.name, entity.getAName()); //} -shared_ptr EntityDamageSource::getDeathMessagePacket(shared_ptr player) +shared_ptr EntityDamageSource::getDeathMessagePacket(shared_ptr player) { + shared_ptr held = (entity != NULL) && entity->instanceof(eTYPE_LIVINGENTITY) ? dynamic_pointer_cast(entity)->getCarriedItem() : nullptr; wstring additional = L""; - if(entity->GetType() == eTYPE_SERVERPLAYER) + + if (entity->instanceof(eTYPE_SERVERPLAYER)) + { + additional = dynamic_pointer_cast(entity)->name; + } + else if (entity->instanceof(eTYPE_MOB)) + { + shared_ptr mob = dynamic_pointer_cast(entity); + if (mob->hasCustomName()) + { + additional = mob->getCustomName(); + } + } + + if ( (held != NULL) && held->hasCustomHoverName()) { - shared_ptr sourcePlayer = dynamic_pointer_cast(entity); - if(sourcePlayer != NULL) additional = sourcePlayer->name; + return shared_ptr( new ChatPacket(player->getNetworkName(), m_msgWithItemId, entity->GetType(), additional, held->getHoverName() ) ); + } + else + { + return shared_ptr( new ChatPacket(player->getNetworkName(), m_msgId, entity->GetType(), additional ) ); } - return shared_ptr( new ChatPacket(player->name, m_msgId, entity->GetType(), additional ) ); } bool EntityDamageSource::scalesWithDifficulty() { - return entity != NULL && dynamic_pointer_cast(entity) && !(dynamic_pointer_cast(entity)); + return (entity != NULL) && entity->instanceof(eTYPE_LIVINGENTITY) && !entity->instanceof(eTYPE_PLAYER); +} + +// 4J: Copy function +DamageSource *EntityDamageSource::copy() +{ + return new EntityDamageSource(*this); } \ No newline at end of file diff --git a/Minecraft.World/EntityDamageSource.h b/Minecraft.World/EntityDamageSource.h index bdbe36e7..3df654fd 100644 --- a/Minecraft.World/EntityDamageSource.h +++ b/Minecraft.World/EntityDamageSource.h @@ -13,14 +13,16 @@ protected: public: //EntityDamageSource(const wstring &msgId, shared_ptr entity); - EntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity); + EntityDamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId, shared_ptr entity); virtual ~EntityDamageSource() { } - shared_ptr getEntity(); + shared_ptr getEntity(); // 4J Stu - Made return a packet //virtual wstring getLocalizedDeathMessage(shared_ptr player); - virtual shared_ptr getDeathMessagePacket(shared_ptr player); + virtual shared_ptr getDeathMessagePacket(shared_ptr player); virtual bool scalesWithDifficulty(); + + virtual DamageSource *copy(); }; \ No newline at end of file diff --git a/Minecraft.World/EntityDiagram.cd b/Minecraft.World/EntityDiagram.cd new file mode 100644 index 00000000..2cfded11 --- /dev/null +++ b/Minecraft.World/EntityDiagram.cd @@ -0,0 +1,805 @@ + + + + + + + + + + lk9By8fuVr+s9Vq2ZZrRsbv3c3+a+rkZfp7902m71mE= + Entity.h + + + + + + + + + + + + + + IkXwEshzVK9k0lP3eIozMydyc56b0ZNv9VTruo1/COQ= + livingentity.h + + + + + + + + + + + + + + UAlyxmP2UGIgHDSYIll6BnYGw1UcADEHoAPyGCoBCMA= + mob.h + + + + + + EBBIAgACgAIAkgAQQAgQAAQAAwAAAAECgADAAgIgAIA= + PigZombie.h + + + + + + kABEAiYAlAIA2gQQAABSoAwgQiAIAAEA0BDAgAEgAsA= + Zombie.h + + + + + + + + + + + + + + EAJAAAAAAAAAAAAAAAAQAEAgAAAIAAECAgDAAAAgAAA= + monster.h + + + + + + + + + + + + + + + + ECKEBAAAAAAEAgCGAAASOQAgBBAAAAACEAIBQAEgAUQ= + PathfinderMob.h + + + + + + AAIAAAAAAAAAAAAAEAAQAAAAAAAAAAEAAABAAAAAAAA= + Giant.h + + + + + + wABwAgAQQUYBkAQUAlQQACAoQyCJIEEDwgPCEYglAMA= + Wolf.h + + + + + + AAAQgAAAEAoAAAAQAABAAAQAUACBAQBAABIACCABAEA= + TamableAnimal.h + + + + + + EAICgQAAIBIgAAQwgiAAAIAAThgJAAADIACCAIAhAEA= + Animal.h + + + + + + + + + + + + + + AIgAAEAAAQIAAAgQQAACAAAAQgAICEEGAAAAAAAEAAA= + AgableMob.h + + + + + + AAAAAAAAAAAAkAABAYoYAAAEASAJAAEAgABAAABlAIA= + Chicken.h + + + + + + AAAAAAAAAAAAkAAAAAAQAAAAAyGAAAEAgABAAAAkAIA= + Cow.h + + + + + + + + + + + + + + AAAAgAAAAAAAkAQAAAAAAAAAAAAAAAAAAAAAAAAlAAA= + Golem.h + + + + + + EAAAAQAAAAAAAAAAAAAAAAAAAgAAAAEAAABAAAAEAAA= + mushroomcow.h + + + + + + EAAECgAACAIQkIQwAAAQABAgSwCBAAFBoADCAIA1AYA= + ocelot.h + + + + + + QAAAQEACAAIEkAAQAAASABAAQyABAAECgABAQAAlAIA= + Pig.h + + + + + + BAAAQhAiAAIQkAAQAEAQAIAQQyAoAAGAgABAgAQsAsA= + Sheep.h + + + + + + AAAAAAAAAAAAAAAAAAAQAAAgAQAIAAEAgCBAAAAAAIA= + SnowMan.h + + + + + + FEAAAABEAgBAkQAgCAgQAAABAYCIAwEAgBBAAAAgAkA= + Squid.h + + + + + + + + + + + + + + EAAAgAAAAAEAAAQAAAIAAAAAABAAAAAAAAAAAAABAAA= + WaterAnimal.h + + + + + + QEIACCAAECIAkAAwEAAQAAAiQSAIgAEAFADCBAAgAMA= + VillagerGolem.h + + + + + + AAAAAAAAAAQAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAA= + AmbientCreature.h + + + + + + EABAEAACAAoAkAAwAAAQIAEAUQCAgAkAAADAAAIxAIA= + Bat.h + + + + + + QABiQAADwAMA0gCQJAARAQAgQwAoAgEAEBDRCBCxBZA= + WitherBoss.h + + + + + + AAAAAAAAAAIAAAAQAAEAAAAAQAAAAAEAAAAAAAAAAAA= + nethersphere.h + + + + + + AUQkhQAAyxJqEAAeUAkdPDLp8bCIIAURQADhQQg6A0g= + EnderDragon.h + + + + + + gAFBQABAAAIAEQAwAAgAAAABQAAAAAEAAADAAAAAAAA= + EnderCrystal.h + + + + + + AAAAAAAAAAIAEEAQAAAAAAAAQAAQAAEAQACAAAAAAgA= + MultiEntityMobPart.h + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA= + GlobalEntity.h + + + + + + AAFAAMAAAAIAQgAQAAAAAAAAQAAgAAEAAAAAAAAAAAE= + lightningbolt.h + + + + + + AoRASBACFAIAEUAwIAgRgAMAUASAACVAEADUAAAECCQ= + Boat.h + + + + + + AABBQAAACAIgEQAwAAlAAAIAQAAAAAEAIABRAAAhQAA= + FallingTile.h + + + + + + AABAAIBExAIAQEAwAUgABAAAQAAAQAEAKAXAAEAEAAg= + ItemEntity.h + + + + + + + + + + + + + + AoBgSAICEEKAcUQ0YCgDgGMAUQaMAIFAOCCaQGBAKCw= + minecart.h + + + + + + AACAAAAAAAAAAAAAAAAAAEAAAQAIAAEAgCBAAAAAAAA= + minecartchest.h + + + + + + AAAIAAAkQAIAABAUAAgAAEACAQAAACAACAAUAAAAAAA= + minecartcontainer.h + + + + + + AADAAgAAAAIAASAQAgmAAUAAAQAIAKEAACBAgAAABgA= + minecarthopper.h + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAQAAACEAAABAAAAAACA= + minecartrideable.h + + + + + + EABABAAAAAIABAAQAAAAAAAAAQAIAAEAgABAAAAAAEA= + minecartspawner.h + + + + + + CARAAAAAAAIAAAAQSAgAAEAAAUEIBIUAAABAEAABAEA= + MinecartTNT.h + + + + + + AAFAwAAAAAIAkQAwCAgAAAAAQAEAAAEAAABAAAAAAAA= + PrimedTnt.h + + + + + + gAAAAAAAEAAAkAAAAAARAMIAQQAICAEAgABEABAhACA= + Blaze.h + + + + + + + + + + + + AAIAAgAAAAAAAAAAAAAQAAAgAAAAAAEAAABAAAAAAAA= + CaveSpider.h + + + + + + AABAIgQAEAAAsAAAAAAQAAAAQSASAAEGgBBQAAAgAAA= + Spider.h + + + + + + AoBAQAAQAjIAgAAQICgQgAAgQAAAAAEAgEpAAAAhAIA= + Creeper.h + + + + + + IIgoAIAAgAIAkIAUQAAUADoAQQAIAAEGgADAgAEgCIA= + EnderMan.h + + + + + + EAgABAAAgAYAkAQSMAgQAAAAQQCAAAEAgIDEAQggAEA= + Ghast.h + + + + + + AAAAAAAAAAAAAAAAAAAAIAAAAIACAAIAAAAAAAABAAA= + FlyingMob.h + + + + + + EAAAAAgAACAAgAgAAAARAIAAJQgACAEAkABQEBAhAAA= + lavaslime.h + + + + + + EABAAAgABIIAgAgUBBgAAAAAZACAAAMApEBQABAiAFA= + Slime.h + + + + + + EAJAAAAAAAAAkAAgAAAQAEAAACAAQAECgBDAAAAggEA= + Silverfish.h + + + + + + AEACAgCAACIgkAAYAKAQAAQhQSgIBAEAgBBBAQAgAYA= + Skeleton.h + + + + + + AAAABAACAAAAkAEAEAAQCAAgQQAIAAEAAEBAAQAiAOA= + Witch.h + + + + + + AJEAGgEYQWMAkASxMBgYgGBQUkAgBhEJUSDCCEAmEcA= + Villager.h + + + + + + tnzh7119+X+pYpq2sMm9VykjcZ9d6HXvO5y/lb7N/3c= + Player.h + + + + + + ABFAQAhOBIIggQIwoAoABABAQgACIAEAAChAIAAABCg= + Arrow.h + + + + + + + + + + + + + + AAAAAAAAAAAgEAAAAAAAAgAAAAEAAAEAAADAQBAAAAA= + DragonFireball.h + + + + + + ABFAQEgMAAIAkAAQAAoBBQAAQAEACAEEAACQSAAAAAE= + Fireball.h + + + + + + BAFAQABGAAIAAAAQCAgDAAAAQAAACAEAADBAAAAAAAA= + EyeOfEnderSignal.h + + + + + + AAFAwABGAAIAAAAQAAABAAAAQAAACAEAAABAAABAIEA= + FireworksRocketEntity.h + + + + + + ABHAQAgOAAIAgECUAAoABAAAUAAAAAEAECAAAACAACQ= + FishingHook.h + + + + + + + + + + + + + + CAAAAAAAAAIAAAAQAAAAAAAAAAAAAAEAAABAQAAAAAA= + largefireball.h + + + + + + AAAAAAAAAAAAEAEAAAAAAAAAAAAAAAEAAADAQAAAAAA= + SmallFireball.h + + + + + + AAAAAAAAAAAAAAAAAAgAAEAAAAAAAAEAAABAQAAAAAA= + Snowball.h + + + + + + ABFAwAgOAAIAgFAQAAIABAAEQAAAAAMAACAAQgAAAAA= + Throwable.h + + + + + + AAAAAAAAAAAAAAAAAAgAAAAQAAAAAAEAAAAAQAAAAAA= + ThrownEgg.h + + + + + + AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEAAABAQAAAAAA= + ThrownEnderpearl.h + + + + + + AEAAAAAAAAAAgBAAAAAAAAAAAAAAAAEAAABAQgAAAAA= + ThrownExpBottle.h + + + + + + AAAAAAAAAAIggBAQAAgAAgAAAAAAIgEAAABQQgEAAAA= + ThrownPotion.h + + + + + + + + + + + + + + AAAAAEAIAAAAEAAAAAAAAIAAQgEAAAEAAADARAAAIAA= + WitherSkull.h + + + + + + BABAAAAAAAIAAAAwAEAAAAgAQAAAAAEAAACAAAAAAAA= + DelayedRelease.h + + + + + + AABAgMBABAIAQCAwABgJAAAAQAIAACEAAATCAAAUAAg= + ExperienceOrb.h + + + + + + QBBAAAAIACIAEgCQAAoAACIAwBEAQAEAAACIAAAoAAA= + HangingEntity.h + + + + + + QAAIAIAEQAIAAEAQAAgAAAAASAAAQCFAAABAAAQggAA= + ItemFrame.h + + + + + + QAAIAAAEAAqAAAAQAAgAAAIAwAAAQCEAAABACAAgAAA= + leashfenceknotentity.h + + + + + + QAAAAAAAAAIAAEAQAAgAAQAgAAAAQAEAAABAAAAgAAA= + Painting.h + + + + + + Mh4VJEJMQKcF4KAXixAFjgAkYcMfAR3KuAoZDsCBDmI= + c:\users\james\documents\work2\storiespark\minecraft\minecraftconsoles-dev-branch-1.6.4\minecraft.client\localplayer.h + + + + + + IjjhQugN4T4hcAiyCQEFsChhAgJRAAECaZ6AVIotPjI= + c:\users\james\documents\work2\storiespark\minecraft\minecraftconsoles-dev-branch-1.6.4\minecraft.client\serverplayer.h + + + + + + WZjVmhMVAOcMt1dRYs4aD5EBV/2vlC9CtyDQNqwvnNA= + EntityHorse.h + + + + + + ANFRCAAAwIKBIBgEASEAAAggAAEAAWEAAgBxEQEABAg= + TileEntity.h + + + + + + AADIAAAGQICIiBQEBUEAIDAiCVEMAAEAAEheEAAAAAA= + BeaconTileEntity.h + + + + + + AADoIAAEQIGkIJDMAAgCAAACAwAEAgEAAABWGQAAQAA= + BrewingStandTileEntity.h + + + + + + AADIAAAERYCCABAkCQgAAAAGASAFAQECEIhXEAAABAg= + ChestTileEntity.h + + + + + + AAAAAAAAAICAAAAABAgAAAAgARQEAANAIEBEAAAEBCA= + CommandBlockEntity.h + + + + + + AAAAAAAAAICAAAAAAAAAABAACAEAAAEAAABAAAAAAAA= + ComparatorTileEntity.h + + + + + + + + + + + + + + AABAAAAAAAABAAAAAAAAAAAAAAAAAAEAAABAAAAAAAA= + DaylightDetectorTileEntity.h + + + + + + AACIAAAEQICAABAEAAiAKAACAwAECAEAAAVWEAAAAAA= + dispensertileentity.h + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAABEEAAAAAA= + DropperTileEntity.h + + + + + + AIFBAAAAAIGIAAAAISAQAAQCAAAEAAEAAARWEBAAAAA= + EnchantmentTableEntity.h + + + + + + AABIAAAAAAACABIgAAAAAAACACAAAQEAAABQEAAABAA= + EnderChestTileEntity.h + + + + + + AgDsAIEEQoCAABWMABgCoMASAQCEBAMAIARWEAABAAA= + furnacetileentity.h + + + + + + AADJAgAkRICAADAEAgmAAQACAQAEAAEAQBBWEAyFJgA= + HopperTileEntity.h + + + + + + AABABAAAAICABAAAAAAAAAAgAQAAAQEAAQBAEAAAAAA= + mobspawnertileentity.h + + + + + + AQAAgAwAAICAAAAQAAAAAAAAAAAAAAEAAABAEAAAAAA= + musictileentity.h + + + + + + ACABYAAAQICAEgCgAAAAgAIwEGABEAEACBhQEQCAAAA= + SignTileEntity.h + + + + + + AAAAAIiAgICAAAAAgACAAAAiCCCAAAEAAABAFAAABCg= + SkullTileEntity.h + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAABAEAAAAAA= + TheEndPortalTileEntity.h + + + + \ No newline at end of file diff --git a/Minecraft.World/EntityHorse.cpp b/Minecraft.World/EntityHorse.cpp new file mode 100644 index 00000000..2d67d21b --- /dev/null +++ b/Minecraft.World/EntityHorse.cpp @@ -0,0 +1,1841 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.inventory.h" +#include "net.minecraft.world.phys.h" +#include "..\Minecraft.Client\Textures.h" +#include "..\Minecraft.Client\Minecraft.h" +#include "BasicTypeContainers.h" +#include "EntityHorse.h" + +const wstring EntityHorse::TEX_FOLDER = L"mob/horse/"; + +const EntitySelector *EntityHorse::PARENT_HORSE_SELECTOR = new HorseEntitySelector(); + +Attribute *EntityHorse::JUMP_STRENGTH = (new RangedAttribute(eAttributeId_HORSE_JUMPSTRENGTH, .7, 0, 2.0))->setSyncable(true); + +wstring EntityHorse::ARMOR_TEXTURES[EntityHorse::ARMORS] = {L"", L"armor/horse_armor_iron.png", L"armor/horse_armor_gold.png", L"armor/horse_armor_diamond.png"}; +int EntityHorse::ARMOR_TEXTURES_ID[EntityHorse::ARMORS] = {-1, TN_MOB_HORSE_ARMOR_IRON, TN_MOB_HORSE_ARMOR_GOLD, TN_MOB_HORSE_ARMOR_DIAMOND }; +wstring EntityHorse::ARMOR_HASHES[EntityHorse::ARMORS] = {L"", L"meo", L"goo", L"dio"}; +int EntityHorse::ARMOR_PROTECTION[EntityHorse::ARMORS] = {0, 5, 7, 11}; + +wstring EntityHorse::VARIANT_TEXTURES[EntityHorse::VARIANTS] = {L"horse_white.png", L"horse_creamy.png", L"horse_chestnut.png", L"horse_brown.png", L"horse_black.png", L"horse_gray.png", L"horse_darkbrown.png"}; +int EntityHorse::VARIANT_TEXTURES_ID[EntityHorse::VARIANTS] = {TN_MOB_HORSE_WHITE, TN_MOB_HORSE_CREAMY, TN_MOB_HORSE_CHESTNUT, TN_MOB_HORSE_BROWN, TN_MOB_HORSE_BLACK, TN_MOB_HORSE_GRAY, TN_MOB_HORSE_DARKBROWN}; + +wstring EntityHorse::VARIANT_HASHES[EntityHorse::VARIANTS] = {L"hwh", L"hcr", L"hch", L"hbr", L"hbl", L"hgr", L"hdb"}; + +wstring EntityHorse::MARKING_TEXTURES[EntityHorse::MARKINGS] = {L"", L"horse_markings_white.png", L"horse_markings_whitefield.png", L"horse_markings_whitedots.png", L"horse_markings_blackdots.png"}; +int EntityHorse::MARKING_TEXTURES_ID[EntityHorse::MARKINGS] = {-1, TN_MOB_HORSE_MARKINGS_WHITE, TN_MOB_HORSE_MARKINGS_WHITEFIELD, TN_MOB_HORSE_MARKINGS_WHITEDOTS, TN_MOB_HORSE_MARKINGS_BLACKDOTS}; +wstring EntityHorse::MARKING_HASHES[EntityHorse::MARKINGS] = {L"", L"wo_", L"wmo", L"wdo", L"bdo"}; + +bool HorseEntitySelector::matches(shared_ptr entity) const +{ + return entity->instanceof(eTYPE_HORSE) && dynamic_pointer_cast(entity)->isBred(); +} + +EntityHorse::EntityHorse(Level *level) : Animal(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called + this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); + + countEating = 0; + mouthCounter = 0; + standCounter = 0; + tailCounter = 0; + sprintCounter = 0; + isEntityJumping = false; + inventory = nullptr; + hasReproduced = false; + temper = 0; + playerJumpPendingScale = 0.0f; + allowStandSliding = false; + eatAnim = eatAnimO = 0.0f; + standAnim = standAnimO = 0.0f; + mouthAnim = mouthAnimO = 0.0f; + gallopSoundCounter = 0; + + layerTextureHashName = L""; + + layerTextureLayers = intArray(3); + for(unsigned int i = 0; i < 3; ++i) + { + layerTextureLayers[i] = -1; + } + + setSize(1.4f, 1.6f); + fireImmune = false; + setChestedHorse(false); + + getNavigation()->setAvoidWater(true); + goalSelector.addGoal(0, new FloatGoal(this)); + goalSelector.addGoal(1, new PanicGoal(this, 1.2)); + goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.0)); + goalSelector.addGoal(6, new RandomStrollGoal(this, .7)); + goalSelector.addGoal(7, new LookAtPlayerGoal(this, typeid(Player), 6)); + goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + + createInventory(); +} + +EntityHorse::~EntityHorse() +{ + delete [] layerTextureLayers.data; +} + +void EntityHorse::defineSynchedData() +{ + Animal::defineSynchedData(); + entityData->define(DATA_ID_HORSE_FLAGS, 0); + entityData->define(DATA_ID_TYPE, (byte) 0); + entityData->define(DATA_ID_TYPE_VARIANT, 0); + entityData->define(DATA_ID_OWNER_NAME, L""); + entityData->define(DATA_ID_ARMOR, 0); +} + +void EntityHorse::setType(int i) +{ + entityData->set(DATA_ID_TYPE, (byte) i); + clearLayeredTextureInfo(); +} + +int EntityHorse::getType() +{ + return entityData->getByte(DATA_ID_TYPE); +} + +void EntityHorse::setVariant(int i) +{ + entityData->set(DATA_ID_TYPE_VARIANT, i); + clearLayeredTextureInfo(); +} + +int EntityHorse::getVariant() +{ + return entityData->getInteger(DATA_ID_TYPE_VARIANT); +} + +wstring EntityHorse::getAName() +{ + if (hasCustomName()) return getCustomName(); +#ifdef _DEBUG + int type = getType(); + switch (type) + { + default: + case TYPE_HORSE: + return L"entity.horse.name"; + case TYPE_DONKEY: + return L"entity.donkey.name"; + case TYPE_MULE: + return L"entity.mule.name"; + case TYPE_SKELETON: + return L"entity.skeletonhorse.name"; + case TYPE_UNDEAD: + return L"entity.zombiehorse.name"; + } +#else + return L""; +#endif +} + +bool EntityHorse::getHorseFlag(int flag) +{ + return (entityData->getInteger(DATA_ID_HORSE_FLAGS) & flag) != 0; +} + +void EntityHorse::setHorseFlag(int flag, bool value) +{ + int current = entityData->getInteger(DATA_ID_HORSE_FLAGS); + if (value) + { + entityData->set(DATA_ID_HORSE_FLAGS, current | flag); + } + else + { + entityData->set(DATA_ID_HORSE_FLAGS, current & ~flag); + } +} + +bool EntityHorse::isAdult() +{ + return !isBaby(); +} + +bool EntityHorse::isTamed() +{ + return getHorseFlag(FLAG_TAME); +} + +bool EntityHorse::isRidable() +{ + return isAdult(); +} + +wstring EntityHorse::getOwnerName() +{ + return entityData->getString(DATA_ID_OWNER_NAME); +} + +void EntityHorse::setOwner(const wstring &par1Str) +{ + entityData->set(DATA_ID_OWNER_NAME, par1Str); +} + +float EntityHorse::getFoalScale() +{ + int age = getAge(); + if (age >= 0) + { + return 1.0f; + } + return .5f + (float) (BABY_START_AGE - age) / (float) BABY_START_AGE * .5f; +} + + +void EntityHorse::updateSize(bool isBaby) +{ + if (isBaby) + { + internalSetSize(getFoalScale()); + } + else + { + internalSetSize(1.0f); + } +} + +bool EntityHorse::getIsJumping() +{ + return isEntityJumping; +} + +void EntityHorse::setTamed(bool flag) +{ + setHorseFlag(FLAG_TAME, flag); +} + +void EntityHorse::setIsJumping(bool flag) +{ + isEntityJumping = flag; +} + + +bool EntityHorse::canBeLeashed() +{ + return !isUndead() && Animal::canBeLeashed(); +} + +void EntityHorse::onLeashDistance(float distanceToLeashHolder) +{ + if (distanceToLeashHolder > 6 && isEating()) + { + setEating(false); + } +} + +bool EntityHorse::isChestedHorse() +{ + return getHorseFlag(FLAG_CHESTED); +} + +int EntityHorse::getArmorType() +{ + return entityData->getInteger(DATA_ID_ARMOR); +} + +int EntityHorse::getArmorTypeForItem(shared_ptr armorItem) +{ + if (armorItem == NULL) + { + return ARMOR_NONE; + } + if (armorItem->id == Item::horseArmorMetal_Id) + { + return ARMOR_IRON; + } + else if (armorItem->id == Item::horseArmorGold_Id) + { + return ARMOR_GOLD; + } + else if (armorItem->id == Item::horseArmorDiamond_Id) + { + return ARMOR_DIAMOND; + } + return ARMOR_NONE; +} + +bool EntityHorse::isEating() +{ + return getHorseFlag(FLAG_EATING); +} + +bool EntityHorse::isStanding() +{ + return getHorseFlag(FLAG_STANDING); +} + +bool EntityHorse::isBred() +{ + return getHorseFlag(FLAG_BRED); +} + +bool EntityHorse::getHasReproduced() +{ + return hasReproduced; +} + +void EntityHorse::setArmorType(int i) +{ + entityData->set(DATA_ID_ARMOR, i); + clearLayeredTextureInfo(); +} + +void EntityHorse::setBred(bool flag) +{ + setHorseFlag(FLAG_BRED, flag); + +} + +void EntityHorse::setChestedHorse(bool flag) +{ + setHorseFlag(FLAG_CHESTED, flag); +} + +void EntityHorse::setReproduced(bool flag) +{ + hasReproduced = flag; +} + +void EntityHorse::setSaddled(bool flag) +{ + setHorseFlag(FLAG_SADDLE, flag); +} + +int EntityHorse::getTemper() +{ + return temper; +} + +void EntityHorse::setTemper(int temper) +{ + this->temper = temper; +} + +int EntityHorse::modifyTemper(int amount) +{ + int temper = Mth::clamp(getTemper() + amount, 0, getMaxTemper()); + + setTemper(temper); + return temper; +} + + +bool EntityHorse::hurt(DamageSource *damagesource, float dmg) +{ + // 4J: Protect owned horses from untrusted players + if (isTamed()) + { + shared_ptr entity = damagesource->getDirectEntity(); + if (entity != NULL && entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr attacker = dynamic_pointer_cast(entity); + attacker->canHarmPlayer(getOwnerName()); + } + } + + shared_ptr attacker = damagesource->getEntity(); + if (rider.lock() != NULL && (rider.lock() == (attacker) )) + { + return false; + } + + return Animal::hurt(damagesource, dmg); +} + + +int EntityHorse::getArmorValue() +{ + return ARMOR_PROTECTION[getArmorType()]; +} + + +bool EntityHorse::isPushable() +{ + return rider.lock() == NULL; +} + +// TODO: [EB]: Explain why this is being done - what side effect does getBiome have? +bool EntityHorse::checkSpawningBiome() +{ + int x = Mth::floor(this->x); + int z = Mth::floor(this->z); + + level->getBiome(x, z); + return true; +} + +/** +* Drops a chest block if the horse is bagged +*/ +void EntityHorse::dropBags() +{ + if (level->isClientSide || !isChestedHorse()) + { + return; + } + + spawnAtLocation(Tile::chest_Id, 1); + setChestedHorse(false); +} + +void EntityHorse::eatingHorse() +{ + openMouth(); + level->playEntitySound(shared_from_this(), eSoundType_EATING, 1.0f, 1.0f + (random->nextFloat() - random->nextFloat()) * 0.2f); +} + +/** +* Changed to adjust fall damage for riders +*/ +void EntityHorse::causeFallDamage(float fallDistance) +{ + + if (fallDistance > 1) + { + playSound(eSoundType_MOB_HORSE_LAND, .4f, 1); + } + + int dmg = Mth::ceil(fallDistance * .5f - 3.0f); + if (dmg <= 0) return; + + hurt(DamageSource::fall, dmg); + + if (rider.lock() != NULL) + { + rider.lock()->hurt(DamageSource::fall, dmg); + } + + int id = level->getTile(Mth::floor(x), Mth::floor(y - 0.2 - yRotO), Mth::floor(z)); + if (id > 0) + { + const Tile::SoundType *stepsound = Tile::tiles[id]->soundType; + level->playEntitySound(shared_from_this(), stepsound->getStepSound(), stepsound->getVolume() * 0.5f, stepsound->getPitch() * 0.75f); + } +} + + +/** +* Different inventory sizes depending on the kind of horse +* +* @return +*/ +int EntityHorse::getInventorySize() +{ + int type = getType(); + if (isChestedHorse() && (type == TYPE_DONKEY || type == TYPE_MULE)) + { + return INV_BASE_COUNT + INV_DONKEY_CHEST_COUNT; + } + return INV_BASE_COUNT; +} + +void EntityHorse::createInventory() +{ + shared_ptr old = inventory; + inventory = shared_ptr( new AnimalChest(L"HorseChest", getInventorySize()) ); + inventory->setCustomName(getAName()); + if (old != NULL) + { + old->removeListener(this); + + int max = min(old->getContainerSize(), inventory->getContainerSize()); + for (int slot = 0; slot < max; slot++) + { + shared_ptr item = old->getItem(slot); + if (item != NULL) + { + inventory->setItem(slot, item->copy()); + } + } + old = nullptr; + } + inventory->addListener(this); + updateEquipment(); +} + +void EntityHorse::updateEquipment() +{ + if (!level->isClientSide) + { + setSaddled(inventory->getItem(INV_SLOT_SADDLE) != NULL); + if (canWearArmor()) + { + setArmorType(getArmorTypeForItem(inventory->getItem(INV_SLOT_ARMOR))); + } + } +} + +void EntityHorse::containerChanged() +{ + int armorType = getArmorType(); + bool saddled = isSaddled(); + updateEquipment(); + if (tickCount > 20) + { + if (armorType == ARMOR_NONE && armorType != getArmorType()) + { + playSound(eSoundType_MOB_HORSE_ARMOR, .5f, 1); + } + if (!saddled && isSaddled()) + { + playSound(eSoundType_MOB_HORSE_LEATHER, .5f, 1); + } + } + +} + + +bool EntityHorse::canSpawn() +{ + checkSpawningBiome(); + return Animal::canSpawn(); +} + + +shared_ptr EntityHorse::getClosestMommy(shared_ptr baby, double searchRadius) +{ + double closestDistance = Double::MAX_VALUE; + + shared_ptr mommy = nullptr; + vector > *list = level->getEntities(baby, baby->bb->expand(searchRadius, searchRadius, searchRadius), PARENT_HORSE_SELECTOR); + + for(AUTO_VAR(it,list->begin()); it != list->end(); ++it) + { + shared_ptr horse = *it; + double distanceSquared = horse->distanceToSqr(baby->x, baby->y, baby->z); + + if (distanceSquared < closestDistance) + { + mommy = horse; + closestDistance = distanceSquared; + } + } + delete list; + + return dynamic_pointer_cast(mommy); +} + +double EntityHorse::getCustomJump() +{ + return getAttribute(JUMP_STRENGTH)->getValue(); +} + +int EntityHorse::getDeathSound() +{ + openMouth(); + int type = getType(); + if (type == TYPE_UNDEAD) + { + return eSoundType_MOB_HORSE_ZOMBIE_DEATH; //"mob.horse.zombie.death"; + } + if (type == TYPE_SKELETON) + { + return eSoundType_MOB_HORSE_SKELETON_DEATH; //"mob.horse.skeleton.death"; + } + if (type == TYPE_DONKEY || type == TYPE_MULE) + { + return eSoundType_MOB_HORSE_DONKEY_DEATH; //"mob.horse.donkey.death"; + } + return eSoundType_MOB_HORSE_DEATH; //"mob.horse.death"; +} + +int EntityHorse::getDeathLoot() +{ + bool flag = random->nextInt(4) == 0; + + int type = getType(); + if (type == TYPE_SKELETON) + { + return Item::bone_Id; + } + if (type == TYPE_UNDEAD) + { + if (flag) + { + return 0; + } + return Item::rotten_flesh_Id; + } + + return Item::leather_Id; +} + +int EntityHorse::getHurtSound() +{ + openMouth(); + { + if (random->nextInt(3) == 0) + { + stand(); + } + } + int type = getType(); + if (type == TYPE_UNDEAD) + { + return eSoundType_MOB_HORSE_ZOMBIE_HIT; //"mob.horse.zombie.hit"; + } + if (type == TYPE_SKELETON) + { + return eSoundType_MOB_HORSE_SKELETON_HIT; //"mob.horse.skeleton.hit"; + } + if (type == TYPE_DONKEY || type == TYPE_MULE) + { + return eSoundType_MOB_HORSE_DONKEY_HIT; //"mob.horse.donkey.hit"; + } + return eSoundType_MOB_HORSE_HIT; //"mob.horse.hit"; +} + +bool EntityHorse::isSaddled() +{ + return getHorseFlag(FLAG_SADDLE); +} + + +int EntityHorse::getAmbientSound() +{ + openMouth(); + if (random->nextInt(10) == 0 && !isImmobile()) + { + stand(); + } + int type = getType(); + if (type == TYPE_UNDEAD) + { + return eSoundType_MOB_HORSE_ZOMBIE_IDLE; //"mob.horse.zombie.idle"; + } + if (type == TYPE_SKELETON) + { + return eSoundType_MOB_HORSE_SKELETON_IDLE; //"mob.horse.skeleton.idle"; + } + if (type == TYPE_DONKEY || type == TYPE_MULE) + { + return eSoundType_MOB_HORSE_DONKEY_IDLE; //"mob.horse.donkey.idle"; + } + return eSoundType_MOB_HORSE_IDLE; //"mob.horse.idle"; +} + +/** +* sound played when an untamed mount buckles rider +*/ +int EntityHorse::getMadSound() +{ + openMouth(); + stand(); + int type = getType(); + if (type == TYPE_UNDEAD || type == TYPE_SKELETON) + { + return -1; + } + if (type == TYPE_DONKEY || type == TYPE_MULE) + { + return eSoundType_MOB_HORSE_DONKEY_ANGRY; //"mob.horse.donkey.angry"; + } + return eSoundType_MOB_HORSE_ANGRY; //"mob.horse.angry"; +} + +void EntityHorse::playStepSound(int xt, int yt, int zt, int t) +{ + const Tile::SoundType *soundType = Tile::tiles[t]->soundType; + if (level->getTile(xt, yt + 1, zt) == Tile::topSnow_Id) + { + soundType = Tile::topSnow->soundType; + } + if (!Tile::tiles[t]->material->isLiquid()) + { + int type = getType(); + if (rider.lock() != NULL && type != TYPE_DONKEY && type != TYPE_MULE) + { + gallopSoundCounter++; + if (gallopSoundCounter > 5 && gallopSoundCounter % 3 == 0) + { + playSound(eSoundType_MOB_HORSE_GALLOP, soundType->getVolume() * 0.15f, soundType->getPitch()); + if (type == TYPE_HORSE && random->nextInt(10) == 0) + { + playSound(eSoundType_MOB_HORSE_BREATHE, soundType->getVolume() * 0.6f, soundType->getPitch()); + } + } + else if (gallopSoundCounter <= 5) + { + playSound(eSoundType_MOB_HORSE_WOOD, soundType->getVolume() * 0.15f, soundType->getPitch()); + } + } + else if (soundType == Tile::SOUND_WOOD) + { + playSound(eSoundType_MOB_HORSE_SOFT, soundType->getVolume() * 0.15f, soundType->getPitch()); + } + else + { + playSound(eSoundType_MOB_HORSE_WOOD, soundType->getVolume() * 0.15f, soundType->getPitch()); + } + } +} + +void EntityHorse::registerAttributes() +{ + Animal::registerAttributes(); + + getAttributes()->registerAttribute(JUMP_STRENGTH); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(53); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.225f); +} + +int EntityHorse::getMaxSpawnClusterSize() +{ + return 6; +} + +/** +* How difficult is the creature to be tamed? the Higher the number, the +* more difficult +*/ +int EntityHorse::getMaxTemper() +{ + return 100; +} + +float EntityHorse::getSoundVolume() +{ + return 0.8f; +} + + +int EntityHorse::getAmbientSoundInterval() +{ + return 400; +} + +bool EntityHorse::hasLayeredTextures() +{ + return getType() == TYPE_HORSE || getArmorType() > 0; +} + +void EntityHorse::clearLayeredTextureInfo() +{ + layerTextureHashName = L""; +} + +void EntityHorse::rebuildLayeredTextureInfo() +{ + layerTextureHashName = L"horse/"; + layerTextureLayers[0] = -1; + layerTextureLayers[1] = -1; + layerTextureLayers[2] = -1; + + int type = getType(); + int variant = getVariant(); + int armorIndex = 2; + if (type == TYPE_HORSE) + { + int skin = variant & 0xFF; + int markings = (variant & 0xFF00) >> 8; + layerTextureLayers[0] = VARIANT_TEXTURES_ID[skin]; + layerTextureHashName += VARIANT_HASHES[skin]; + + layerTextureLayers[1] = MARKING_TEXTURES_ID[markings]; + layerTextureHashName += MARKING_HASHES[markings]; + + if(layerTextureLayers[1] == -1) + { + armorIndex = 1; + } + } + else + { + layerTextureLayers[0] = -1; + layerTextureHashName += L"_" + _toString(type) + L"_"; + armorIndex = 1; + } + + int armor = getArmorType(); + layerTextureLayers[armorIndex] = ARMOR_TEXTURES_ID[armor]; + layerTextureHashName += ARMOR_HASHES[armor]; +} + +wstring EntityHorse::getLayeredTextureHashName() +{ + if (layerTextureHashName.empty()) + { + rebuildLayeredTextureInfo(); + } + return layerTextureHashName; +} + +intArray EntityHorse::getLayeredTextureLayers() +{ + if (layerTextureHashName.empty()) + { + rebuildLayeredTextureInfo(); + } + return layerTextureLayers; +} + +void EntityHorse::openInventory(shared_ptr player) +{ + if (!level->isClientSide && (rider.lock() == NULL || rider.lock() == player) && isTamed()) + { + inventory->setCustomName(getAName()); + player->openHorseInventory(dynamic_pointer_cast(shared_from_this()), inventory); + } +} + +bool EntityHorse::mobInteract(shared_ptr player) +{ + shared_ptr itemstack = player->inventory->getSelected(); + + if (itemstack != NULL && itemstack->id == Item::spawnEgg_Id) + { + return Animal::mobInteract(player); + } + + if (!isTamed()) + { + if (isUndead()) + { + return false; + } + } + + if (isTamed() && isAdult() && player->isSneaking()) + { + openInventory(player); + return true; + } + + if (isRidable() && rider.lock() != NULL) + { + return Animal::mobInteract(player); + } + + // consumables + if (itemstack != NULL) + { + bool itemUsed = false; + + if (canWearArmor()) + { + int armorType = -1; + + if (itemstack->id == Item::horseArmorMetal_Id) + { + armorType = ARMOR_IRON; + } + else if (itemstack->id == Item::horseArmorGold_Id) + { + armorType = ARMOR_GOLD; + } + else if (itemstack->id == Item::horseArmorDiamond_Id) + { + armorType = ARMOR_DIAMOND; + } + + if (armorType >= 0) + { + if (!isTamed()) + { + makeMad(); + return true; + } + openInventory(player); + return true; + } + } + + if (!itemUsed && !isUndead()) + { + float _heal = 0; + int _ageUp = 0; + int temper = 0; + + if (itemstack->id == Item::wheat_Id) + { + _heal = 2; + _ageUp = 60; + temper = 3; + } + else if (itemstack->id == Item::sugar_Id) + { + _heal = 1; + _ageUp = 30; + temper = 3; + } + else if (itemstack->id == Item::bread_Id) + { + _heal = 7; + _ageUp = 180; + temper = 3; + } + else if (itemstack->id == Tile::hayBlock_Id) + { + _heal = 20; + _ageUp = 180; + } + else if (itemstack->id == Item::apple_Id) + { + _heal = 3; + _ageUp = 60; + temper = 3; + } + else if (itemstack->id == Item::carrotGolden_Id) + { + _heal = 4; + _ageUp = 60; + temper = 5; + if (isTamed() && getAge() == 0) + { + itemUsed = true; + setInLove(); + } + } + else if (itemstack->id == Item::apple_gold_Id) + { + _heal = 10; + _ageUp = 240; + temper = 10; + if (isTamed() && getAge() == 0) + { + itemUsed = true; + setInLove(); + } + } + if (getHealth() < getMaxHealth() && _heal > 0) + { + heal(_heal); + itemUsed = true; + } + if (!isAdult() && _ageUp > 0) + { + ageUp(_ageUp); + itemUsed = true; + } + if (temper > 0 && (itemUsed || !isTamed()) && temper < getMaxTemper()) + { + itemUsed = true; + modifyTemper(temper); + } + if (itemUsed) + { + eatingHorse(); + } + } + + if (!isTamed() && !itemUsed) + { + if (itemstack != NULL && itemstack->interactEnemy(player, dynamic_pointer_cast(shared_from_this()))) + { + return true; + } + makeMad(); + return true; + } + + if (!itemUsed && canWearBags() && !isChestedHorse()) + { + if (itemstack->id == Tile::chest_Id) + { + setChestedHorse(true); + playSound(eSoundType_MOB_CHICKENPLOP, 1.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + itemUsed = true; + createInventory(); + } + } + + if (!itemUsed && isRidable() && !isSaddled()) + { + if (itemstack->id == Item::saddle_Id) + { + openInventory(player); + return true; + } + } + + if (itemUsed) + { + if (!player->abilities.instabuild) + { + if (--itemstack->count == 0) + { + player->inventory->setItem(player->inventory->selected, nullptr); + } + } + return true; + } + } + + if (isRidable() && rider.lock() == NULL) + { + // for name tag items and such, we must call the item's interaction + // method before riding + if (itemstack != NULL && itemstack->interactEnemy(player, dynamic_pointer_cast(shared_from_this()))) + { + return true; + } + doPlayerRide(player); + + app.DebugPrintf(" Horse speed: %f\n", (float) (getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->getValue())); + + return true; + } + else + { + return Animal::mobInteract(player); + } +} + +void EntityHorse::doPlayerRide(shared_ptr player) +{ + player->yRot = yRot; + player->xRot = xRot; + setEating(false); + setStanding(false); + if (!level->isClientSide) + { + player->ride(shared_from_this()); + } +} + +/** +* Can this horse be trapped in an amulet? +*/ +bool EntityHorse::isAmuletHorse() +{ + return getType() == TYPE_SKELETON; +} + +/** +* Can wear regular armor +*/ +bool EntityHorse::canWearArmor() +{ + return getType() == TYPE_HORSE; +} + +/** +* able to carry bags +* +* @return +*/ +bool EntityHorse::canWearBags() +{ + int type = getType(); + return type == TYPE_MULE || type == TYPE_DONKEY; +} + +bool EntityHorse::isImmobile() +{ + if (rider.lock() != NULL && isSaddled()) + { + return true; + } + return isEating() || isStanding(); +} + +/** +* Rare horse that can be transformed into Nightmares or Bathorses or give +* ghost horses on dead +*/ +bool EntityHorse::isPureBreed() +{ + return getType() > 10 && getType() < 21; +} + +/** +* Is this an Undead Horse? +* +* @return +*/ +bool EntityHorse::isUndead() +{ + int type = getType(); + return type == TYPE_UNDEAD || type == TYPE_SKELETON; +} + +bool EntityHorse::isSterile() +{ + return isUndead() || getType() == TYPE_MULE; +} + + +bool EntityHorse::isFood(shared_ptr itemInstance) +{ + // horses have their own food behaviors in mobInterract + return false; +} + +void EntityHorse::moveTail() +{ + tailCounter = 1; +} + +int EntityHorse::nameYOffset() +{ + if (isAdult()) + { + return -80; + } + else + { + return (int) (-5 - getFoalScale() * 80.0f); + } +} + +void EntityHorse::die(DamageSource *damagesource) +{ + Animal::die(damagesource); + if (!level->isClientSide) + { + dropMyStuff(); + } +} + +void EntityHorse::aiStep() +{ + if (random->nextInt(200) == 0) + { + moveTail(); + } + + Animal::aiStep(); + + if (!level->isClientSide) + { + if (random->nextInt(900) == 0 && deathTime == 0) + { + heal(1); + } + + if (!isEating() && rider.lock() == NULL && random->nextInt(300) == 0) + { + if (level->getTile(Mth::floor(x), Mth::floor(y) - 1, Mth::floor(z)) == Tile::grass_Id) + { + setEating(true); + } + } + + if (isEating() && ++countEating > 50) + { + countEating = 0; + setEating(false); + } + + if (isBred() && !isAdult() && !isEating()) + { + shared_ptr mommy = getClosestMommy(shared_from_this(), 16); + if (mommy != NULL && distanceToSqr(mommy) > 4.0) + { + Path *pathentity = level->findPath(shared_from_this(), mommy, 16.0f, true, false, false, true); + setPath(pathentity); + } + + } + } +} + +void EntityHorse::tick() +{ + Animal::tick(); + + // if client-side data values have changed, rebuild texture info + if (level->isClientSide && entityData->isDirty()) + { + entityData->clearDirty(); + clearLayeredTextureInfo(); + } + + if (mouthCounter > 0 && ++mouthCounter > 30) + { + mouthCounter = 0; + setHorseFlag(FLAG_OPEN_MOUTH, false); + } + + if (!level->isClientSide) + { + if (standCounter > 0 && ++standCounter > 20) + { + standCounter = 0; + setStanding(false); + } + } + + if (tailCounter > 0 && ++tailCounter > 8) + { + tailCounter = 0; + } + + if (sprintCounter > 0) + { + ++sprintCounter; + + if (sprintCounter > 300) + { + sprintCounter = 0; + } + } + + eatAnimO = eatAnim; + if (isEating()) + { + eatAnim += (1.0f - eatAnim) * .4f + .05f; + if (eatAnim > 1) + { + eatAnim = 1; + } + } + else + { + eatAnim += (.0f - eatAnim) * .4f - .05f; + if (eatAnim < 0) + { + eatAnim = 0; + } + } + standAnimO = standAnim; + if (isStanding()) + { + // standing is incompatible with eating, so lock eat anim + eatAnimO = eatAnim = 0; + standAnim += (1.0f - standAnim) * .4f + .05f; + if (standAnim > 1) + { + standAnim = 1; + } + } + else + { + allowStandSliding = false; + // the animation falling back to ground is slower in the beginning + standAnim += (.8f * standAnim * standAnim * standAnim - standAnim) * .6f - .05f; + if (standAnim < 0) + { + standAnim = 0; + } + } + mouthAnimO = mouthAnim; + if (getHorseFlag(FLAG_OPEN_MOUTH)) + { + mouthAnim += (1.0f - mouthAnim) * .7f + .05f; + if (mouthAnim > 1) + { + mouthAnim = 1; + } + } + else + { + mouthAnim += (.0f - mouthAnim) * .7f - .05f; + if (mouthAnim < 0) + { + mouthAnim = 0; + } + } +} + +void EntityHorse::openMouth() +{ + if (!level->isClientSide) + { + mouthCounter = 1; + setHorseFlag(FLAG_OPEN_MOUTH, true); + } +} + +bool EntityHorse::isReadyForParenting() +{ + return rider.lock() == NULL && riding == NULL && isTamed() && isAdult() && !isSterile() && getHealth() >= getMaxHealth(); +} + +bool EntityHorse::renderName() +{ + return hasCustomName() && rider.lock() == NULL; +} + +bool EntityHorse::rideableEntity() +{ + return true; +} + + +void EntityHorse::setUsingItemFlag(bool flag) +{ + setHorseFlag(FLAG_EATING, flag); +} + +void EntityHorse::setEating(bool state) +{ + setUsingItemFlag(state); +} + +void EntityHorse::setStanding(bool state) +{ + if (state) + { + setEating(false); + } + setHorseFlag(FLAG_STANDING, state); +} + +void EntityHorse::stand() +{ + if (!level->isClientSide) + { + standCounter = 1; + setStanding(true); + } +} + +void EntityHorse::makeMad() +{ + stand(); + int ambient = getMadSound(); + playSound(ambient, getSoundVolume(), getVoicePitch()); +} + +void EntityHorse::dropMyStuff() +{ + dropInventory(shared_from_this(), inventory); + dropBags(); +} + +void EntityHorse::dropInventory(shared_ptr entity, shared_ptr animalchest) +{ + if (animalchest == NULL || level->isClientSide) return; + + for (int i = 0; i < animalchest->getContainerSize(); i++) + { + shared_ptr itemstack = animalchest->getItem(i); + if (itemstack == NULL) + { + continue; + } + spawnAtLocation(itemstack, 0); + } + +} + +bool EntityHorse::tameWithName(shared_ptr player) +{ + setOwner(player->getName()); + setTamed(true); + return true; +} + +/** +* Overridden method to add control to mounts, should be moved to +* EntityLiving +*/ +void EntityHorse::travel(float xa, float ya) +{ + // If the entity is not ridden by Player, then execute the normal + // Entityliving code + if (rider.lock() == NULL || !isSaddled()) + { + footSize = .5f; + flyingSpeed = .02f; + Animal::travel(xa, ya); + return; + } + + yRotO = yRot = rider.lock()->yRot; + xRot = rider.lock()->xRot * 0.5f; + setRot(yRot, xRot); + yHeadRot = yBodyRot = yRot; + + shared_ptr livingRider = dynamic_pointer_cast(rider.lock()); + xa = livingRider->xxa * .5f; + ya = livingRider->yya; + + // move much slower backwards + if (ya <= 0) + { + ya *= .25f; + gallopSoundCounter = 0; + } + + if (onGround && playerJumpPendingScale == 0 && isStanding() && !allowStandSliding) + { + xa = 0; + ya = 0; + } + + if (playerJumpPendingScale > 0 && !getIsJumping() && onGround) + { + yd = getCustomJump() * playerJumpPendingScale; + if (hasEffect(MobEffect::jump)) + { + yd += (getEffect(MobEffect::jump)->getAmplifier() + 1) * .1f; + } + + setIsJumping(true); + hasImpulse = true; + + if (ya > 0) + { + float sin = Mth::sin(yRot * PI / 180); + float cos = Mth::cos(yRot * PI / 180); + + xd += -0.4f * sin * playerJumpPendingScale; + zd += 0.4f * cos * playerJumpPendingScale; + + playSound(eSoundType_MOB_HORSE_JUMP, .4f, 1); + } + playerJumpPendingScale = 0; + } + + footSize = 1; + flyingSpeed = getSpeed() * .1f; + if (!level->isClientSide) + { + setSpeed((float) (getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->getValue())); + Animal::travel(xa, ya); + } + + + if (onGround) + { + // blood - fixes jump bug + playerJumpPendingScale = 0; + setIsJumping(false); + } + walkAnimSpeedO = walkAnimSpeed; + double dx = x - xo; + double dz = z - zo; + float wst = Mth::sqrt(dx * dx + dz * dz) * 4.0f; + if (wst > 1.0f) + { + wst = 1.0f; + } + + walkAnimSpeed += (wst - walkAnimSpeed) * 0.4f; + walkAnimPos += walkAnimSpeed; + +} + + +void EntityHorse::addAdditonalSaveData(CompoundTag *tag) +{ + Animal::addAdditonalSaveData(tag); + + tag->putBoolean(L"EatingHaystack", isEating()); + tag->putBoolean(L"ChestedHorse", isChestedHorse()); + tag->putBoolean(L"HasReproduced", getHasReproduced()); + tag->putBoolean(L"Bred", isBred()); + tag->putInt(L"Type", getType()); + tag->putInt(L"Variant", getVariant()); + tag->putInt(L"Temper", getTemper()); + tag->putBoolean(L"Tame", isTamed()); + tag->putString(L"OwnerName", getOwnerName()); + + if (isChestedHorse()) + { + ListTag *listTag = new ListTag(); + + for (int i = INV_BASE_COUNT; i < inventory->getContainerSize(); i++) + { + shared_ptr stack = inventory->getItem(i); + + if (stack != NULL) + { + CompoundTag *compoundTag = new CompoundTag(); + + compoundTag->putByte(L"Slot", (byte) i); + + stack->save(compoundTag); + listTag->add(compoundTag); + } + } + tag->put(L"Items", listTag); + } + + if (inventory->getItem(INV_SLOT_ARMOR) != NULL) + { + tag->put(L"ArmorItem", inventory->getItem(INV_SLOT_ARMOR)->save(new CompoundTag(L"ArmorItem"))); + } + if (inventory->getItem(INV_SLOT_SADDLE) != NULL) + { + tag->put(L"SaddleItem", inventory->getItem(INV_SLOT_SADDLE)->save(new CompoundTag(L"SaddleItem"))); + } +} + + +void EntityHorse::readAdditionalSaveData(CompoundTag *tag) +{ + Animal::readAdditionalSaveData(tag); + setEating(tag->getBoolean(L"EatingHaystack")); + setBred(tag->getBoolean(L"Bred")); + setChestedHorse(tag->getBoolean(L"ChestedHorse")); + setReproduced(tag->getBoolean(L"HasReproduced")); + setType(tag->getInt(L"Type")); + setVariant(tag->getInt(L"Variant")); + setTemper(tag->getInt(L"Temper")); + setTamed(tag->getBoolean(L"Tame")); + if (tag->contains(L"OwnerName")) + { + setOwner(tag->getString(L"OwnerName")); + } + + // 4J: This is for handling old save data, not needed on console + /*AttributeInstance *oldSpeedAttribute = getAttributes()->getInstance(SharedMonsterAttributes::MOVEMENT_SPEED); + + if (oldSpeedAttribute != NULL) + { + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(oldSpeedAttribute->getBaseValue() * 0.25f); + }*/ + + if (isChestedHorse()) + { + ListTag *nbttaglist = (ListTag *) tag->getList(L"Items"); + createInventory(); + + for (int i = 0; i < nbttaglist->size(); i++) + { + CompoundTag *compoundTag = nbttaglist->get(i); + int slot = compoundTag->getByte(L"Slot") & 0xFF; + + if (slot >= INV_BASE_COUNT && slot < inventory->getContainerSize()) + { + inventory->setItem(slot, ItemInstance::fromTag(compoundTag)); + } + } + } + + if (tag->contains(L"ArmorItem")) + { + shared_ptr armor = ItemInstance::fromTag(tag->getCompound(L"ArmorItem")); + if (armor != NULL && isHorseArmor(armor->id)) + { + inventory->setItem(INV_SLOT_ARMOR, armor); + } + } + + if (tag->contains(L"SaddleItem")) + { + shared_ptr saddleItem = ItemInstance::fromTag(tag->getCompound(L"SaddleItem")); + if (saddleItem != NULL && saddleItem->id == Item::saddle_Id) + { + inventory->setItem(INV_SLOT_SADDLE, saddleItem); + } + } + else if (tag->getBoolean(L"Saddle")) + { + inventory->setItem(INV_SLOT_SADDLE, shared_ptr( new ItemInstance(Item::saddle))); + } + updateEquipment(); +} + + +bool EntityHorse::canMate(shared_ptr partner) +{ + if (partner == shared_from_this()) return false; + if (partner->GetType() != GetType()) return false; + + shared_ptr horsePartner = dynamic_pointer_cast(partner); + + if (!isReadyForParenting() || !horsePartner->isReadyForParenting()) + { + return false; + } + int type = getType(); + int pType = horsePartner->getType(); + + return type == pType || (type == TYPE_HORSE && pType == TYPE_DONKEY) || (type == TYPE_DONKEY && pType == TYPE_HORSE); +} + + +shared_ptr EntityHorse::getBreedOffspring(shared_ptr partner) +{ + shared_ptr horsePartner = dynamic_pointer_cast(partner); + shared_ptr baby = shared_ptr( new EntityHorse(level) ); + + int type = getType(); + int partnerType = horsePartner->getType(); + int babyType = TYPE_HORSE; + + if (type == partnerType) + { + babyType = type; + } + else if (type == TYPE_HORSE && partnerType == TYPE_DONKEY || type == TYPE_DONKEY && partnerType == TYPE_HORSE) + { + babyType = TYPE_MULE; + } + + // select skin and marking colors + if (babyType == TYPE_HORSE) + { + int skinResult; + int selectSkin = random->nextInt(9); + if (selectSkin < 4) + { + skinResult = getVariant() & 0xff; + } + else if (selectSkin < 8) + { + skinResult = horsePartner->getVariant() & 0xff; + } + else + { + skinResult = random->nextInt(VARIANTS); + } + + int selectMarking = random->nextInt(5); + if (selectMarking < 4) + { + skinResult |= getVariant() & 0xff00; + } + else if (selectMarking < 8) + { + skinResult |= horsePartner->getVariant() & 0xff00; + } + else + { + skinResult |= (random->nextInt(MARKINGS) << 8) & 0xff00; + } + baby->setVariant(skinResult); + } + + baby->setType(babyType); + + // generate stats from parents + double maxHealth = getAttribute(SharedMonsterAttributes::MAX_HEALTH)->getBaseValue() + partner->getAttribute(SharedMonsterAttributes::MAX_HEALTH)->getBaseValue() + generateRandomMaxHealth(); + baby->getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(maxHealth / 3.0f); + + double jumpStrength = getAttribute(JUMP_STRENGTH)->getBaseValue() + partner->getAttribute(JUMP_STRENGTH)->getBaseValue() + generateRandomJumpStrength(); + baby->getAttribute(JUMP_STRENGTH)->setBaseValue(jumpStrength / 3.0f); + + double speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->getBaseValue() + partner->getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->getBaseValue() + generateRandomSpeed(); + baby->getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(speed / 3.0f); + + return baby; +} + +MobGroupData *EntityHorse::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param +{ + groupData = Animal::finalizeMobSpawn(groupData); + + int type = 0; + int variant = 0; + + if ( dynamic_cast(groupData) != NULL ) + { + type = ((HorseGroupData *) groupData)->horseType; + variant = ((HorseGroupData *) groupData)->horseVariant & 0xff | (random->nextInt(MARKINGS) << 8); + } + else + { + if(extraData != 0) + { + type = extraData - 1; + } + else if (random->nextInt(10) == 0) + { + type = TYPE_DONKEY; + } + else + { + type = TYPE_HORSE; + } + + if(type == TYPE_HORSE) + { + int skin = random->nextInt(VARIANTS); + int mark = random->nextInt(MARKINGS); + variant = skin | (mark << 8); + } + groupData = new HorseGroupData(type, variant); + } + + setType(type); + setVariant(variant); + + if (random->nextInt(5) == 0) + { + setAge(AgableMob::BABY_START_AGE); + } + + if (type == TYPE_SKELETON || type == TYPE_UNDEAD) + { + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(15); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.2f); + } + else + { + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(generateRandomMaxHealth()); + if (type == TYPE_HORSE) + { + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(generateRandomSpeed()); + } + else + { + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.175f); + } + } + if (type == TYPE_MULE || type == TYPE_DONKEY) + { + getAttribute(JUMP_STRENGTH)->setBaseValue(.5f); + } + else + { + getAttribute(JUMP_STRENGTH)->setBaseValue(generateRandomJumpStrength()); + } + setHealth(getMaxHealth()); + + return groupData; +} + +float EntityHorse::getEatAnim(float a) +{ + return eatAnimO + (eatAnim - eatAnimO) * a; +} + +float EntityHorse::getStandAnim(float a) +{ + return standAnimO + (standAnim - standAnimO) * a; +} + +float EntityHorse::getMouthAnim(float a) +{ + return mouthAnimO + (mouthAnim - mouthAnimO) * a; +} + +bool EntityHorse::useNewAi() +{ + return true; +} + +void EntityHorse::onPlayerJump(int jumpAmount) +{ + if (isSaddled()) + { + if (jumpAmount < 0) + { + jumpAmount = 0; + } + else + { + allowStandSliding = true; + stand(); + } + + if (jumpAmount >= 90) + { + playerJumpPendingScale = 1.0f; + } + else + { + playerJumpPendingScale = .4f + .4f * (float) jumpAmount / 90.0f; + } + } +} + +void EntityHorse::spawnTamingParticles(bool success) +{ + ePARTICLE_TYPE particle = success ? eParticleType_heart : eParticleType_smoke; + + for (int i = 0; i < 7; i++) + { + double xa = random->nextGaussian() * 0.02; + double ya = random->nextGaussian() * 0.02; + double za = random->nextGaussian() * 0.02; + level->addParticle(particle, x + random->nextFloat() * bbWidth * 2 - bbWidth, y + .5f + random->nextFloat() * bbHeight, z + random->nextFloat() * bbWidth * 2 - bbWidth, xa, ya, za); + } +} + +void EntityHorse::handleEntityEvent(byte id) +{ + if (id == EntityEvent::TAMING_SUCCEEDED) + { + spawnTamingParticles(true); + } + else if (id == EntityEvent::TAMING_FAILED) + { + spawnTamingParticles(false); + } + else + { + Animal::handleEntityEvent(id); + } +} + +void EntityHorse::positionRider() +{ + Animal::positionRider(); + + if (standAnimO > 0) + { + float sin = Mth::sin(yBodyRot * PI / 180); + float cos = Mth::cos(yBodyRot * PI / 180); + float dist = .7f * standAnimO; + float height = .15f * standAnimO; + + rider.lock()->setPos(x + dist * sin, y + getRideHeight() + rider.lock()->getRidingHeight() + height, z - dist * cos); + + if ( rider.lock()->instanceof(eTYPE_LIVINGENTITY) ) + { + shared_ptr livingRider = dynamic_pointer_cast(rider.lock()); + livingRider->yBodyRot = yBodyRot; + } + } +} + +// Health is between 15 and 30 +float EntityHorse::generateRandomMaxHealth() +{ + return 15.0f + random->nextInt(8) + random->nextInt(9); +} + +double EntityHorse::generateRandomJumpStrength() +{ + return .4f + random->nextDouble() * .2 + random->nextDouble() * .2 + random->nextDouble() * .2; +} + +double EntityHorse::generateRandomSpeed() +{ + double speed = (0.45f + random->nextDouble() * .3 + random->nextDouble() * .3 + random->nextDouble() * .3) * 0.25f; + app.DebugPrintf(" Speed: %f\n", speed); + return speed; +} + +EntityHorse::HorseGroupData::HorseGroupData(int type, int variant) +{ + horseType = type; + horseVariant = variant; +} + +bool EntityHorse::isHorseArmor(int itemId) +{ + return itemId == Item::horseArmorMetal_Id || itemId == Item::horseArmorGold_Id || itemId == Item::horseArmorDiamond_Id; +} + +bool EntityHorse::onLadder() +{ + // prevent horses from climbing ladders + return false; +} + +shared_ptr EntityHorse::getOwner() +{ + return level->getPlayerByUUID(getOwnerName()); +} \ No newline at end of file diff --git a/Minecraft.World/EntityHorse.h b/Minecraft.World/EntityHorse.h new file mode 100644 index 00000000..c2784491 --- /dev/null +++ b/Minecraft.World/EntityHorse.h @@ -0,0 +1,342 @@ +#pragma once + +#include "Animal.h" +#include "net.minecraft.world.ContainerListener.h" +#include "MobGroupData.h" +#include "EntitySelector.h" + +class Attribute; +class AnimalChest; + +class HorseEntitySelector : public EntitySelector +{ +public: + bool matches(shared_ptr entity) const; +}; + +class EntityHorse : public Animal, public net_minecraft_world::ContainerListener +{ +public: + eINSTANCEOF GetType() { return eTYPE_HORSE; } + static Entity *create(Level *level) { return new EntityHorse(level); } + +private: + static const wstring TEX_FOLDER; + + static const EntitySelector *PARENT_HORSE_SELECTOR; + + static Attribute *JUMP_STRENGTH; + + static const int DATA_ID_HORSE_FLAGS = 16; + static const int DATA_ID_TYPE = 19; + static const int DATA_ID_TYPE_VARIANT = 20; + static const int DATA_ID_OWNER_NAME = 21; + static const int DATA_ID_ARMOR = 22; + + static const int FLAG_TAME = 1 << 1; + static const int FLAG_SADDLE = 1 << 2; + static const int FLAG_CHESTED = 1 << 3; + static const int FLAG_BRED = 1 << 4; + static const int FLAG_EATING = 1 << 5; + static const int FLAG_STANDING = 1 << 6; + static const int FLAG_OPEN_MOUTH = 1 << 7; + +public: + static const int INV_SLOT_SADDLE = 0; + static const int INV_SLOT_ARMOR = 1; + static const int INV_BASE_COUNT = 2; + static const int INV_DONKEY_CHEST_COUNT = 15; + + // TODO: USE ENUMS! // Original comment + static const int ARMOR_NONE = 0; + static const int ARMOR_IRON = 1; + static const int ARMOR_GOLD = 2; + static const int ARMOR_DIAMOND = 3; + +private: + static const int ARMORS = 4; + static wstring ARMOR_TEXTURES[ARMORS]; + static int ARMOR_TEXTURES_ID[ARMORS]; + static wstring ARMOR_HASHES[ARMORS]; + static int ARMOR_PROTECTION[ARMORS]; + +public: + static const int TYPE_HORSE = 0; + static const int TYPE_DONKEY = 1; + static const int TYPE_MULE = 2; + static const int TYPE_UNDEAD = 3; + static const int TYPE_SKELETON = 4; + + static const int VARIANT_WHITE = 0; + static const int VARIANT_CREAMY = 1; + static const int VARIANT_CHESTNUT = 2; + static const int VARIANT_BROWN = 3; + static const int VARIANT_BLACK = 4; + static const int VARIANT_GRAY = 5; + static const int VARIANT_DARKBROWN = 6; + +private: + static const int VARIANTS = 7; + static wstring VARIANT_TEXTURES[VARIANTS]; + static int VARIANT_TEXTURES_ID[VARIANTS]; + static wstring VARIANT_HASHES[VARIANTS]; + +public: + static const int MARKING_NONE = 0; + static const int MARKING_WHITE_DETAILS = 1; + static const int MARKING_WHITE_FIELDS = 2; + static const int MARKING_WHITE_DOTS = 3; + static const int MARKING_BLACK_DOTS = 4; + +private: + static const int MARKINGS = 5; + static wstring MARKING_TEXTURES[MARKINGS]; + static int MARKING_TEXTURES_ID[MARKINGS]; + static wstring MARKING_HASHES[MARKINGS]; + +private: + int countEating; // eating timer + int mouthCounter; + int standCounter; + +public: + int tailCounter; + int sprintCounter; + +protected: + bool isEntityJumping; + +private: + shared_ptr inventory; + bool hasReproduced; + +protected: + int temper; + float playerJumpPendingScale; + +private: + bool allowStandSliding; + + // animation data + float eatAnim, eatAnimO; + float standAnim, standAnimO; + float mouthAnim, mouthAnimO; + +public: + EntityHorse(Level *world); + ~EntityHorse(); + +protected: + virtual void defineSynchedData(); + +public: + virtual void setType(int i); + virtual int getType(); + virtual void setVariant(int i); + virtual int getVariant(); + virtual wstring getAName(); + +private: + virtual bool getHorseFlag(int flag); + virtual void setHorseFlag(int flag, bool value); + +public: + virtual bool isAdult(); + virtual bool isTamed(); + virtual bool isRidable(); + virtual wstring getOwnerName(); + virtual void setOwner(const wstring &par1Str); + virtual float getFoalScale(); + virtual void updateSize(bool isBaby); + virtual bool getIsJumping(); + virtual void setTamed(bool flag); + virtual void setIsJumping(bool flag); + virtual bool canBeLeashed(); + +protected: + virtual void onLeashDistance(float distanceToLeashHolder); + +public: + virtual bool isChestedHorse(); + virtual int getArmorType(); + virtual int getArmorTypeForItem(shared_ptr armorItem); + virtual bool isEating(); + virtual bool isStanding(); + virtual bool isBred(); + virtual bool getHasReproduced(); + virtual void setArmorType(int i); + virtual void setBred(bool flag); + virtual void setChestedHorse(bool flag); + virtual void setReproduced(bool flag); + virtual void setSaddled(bool flag); + virtual int getTemper(); + virtual void setTemper(int temper); + virtual int modifyTemper(int amount); + virtual bool hurt(DamageSource *damagesource, float dmg); + virtual int getArmorValue(); + virtual bool isPushable(); + virtual bool checkSpawningBiome(); + virtual void dropBags(); + +private: + virtual void eatingHorse(); + +protected: + virtual void causeFallDamage(float fallDistance); + +private: + virtual int getInventorySize(); + virtual void createInventory(); + virtual void updateEquipment(); + +public: + virtual void containerChanged(); + virtual bool canSpawn(); + +protected: + virtual shared_ptr getClosestMommy(shared_ptr baby, double searchRadius); + +public: + virtual double getCustomJump(); + +protected: + virtual int getDeathSound(); + virtual int getDeathLoot(); + virtual int getHurtSound(); + +public: + virtual bool isSaddled(); + +protected: + virtual int getAmbientSound(); + virtual int getMadSound(); + +private: + int gallopSoundCounter; + + +protected: + virtual void playStepSound(int xt, int yt, int zt, int t); + virtual void registerAttributes(); + +public: + virtual int getMaxSpawnClusterSize(); + virtual int getMaxTemper(); + +protected: + virtual float getSoundVolume(); + +public: + virtual int getAmbientSoundInterval(); + virtual bool hasLayeredTextures(); + +private: + wstring layerTextureHashName; + intArray layerTextureLayers; + +private: + virtual void clearLayeredTextureInfo(); + virtual void rebuildLayeredTextureInfo(); + +public: + virtual wstring getLayeredTextureHashName(); + virtual intArray getLayeredTextureLayers(); + virtual void openInventory(shared_ptr player); + virtual bool mobInteract(shared_ptr player); + +private: + virtual void doPlayerRide(shared_ptr player); + +public: + virtual bool isAmuletHorse(); + virtual bool canWearArmor(); + virtual bool canWearBags(); + +protected: + virtual bool isImmobile(); + +public: + virtual bool isPureBreed(); + virtual bool isUndead(); + virtual bool isSterile(); + virtual bool isFood(shared_ptr itemInstance); + +private: + virtual void moveTail(); + +public: + virtual int nameYOffset(); + virtual void die(DamageSource *damagesource); + virtual void aiStep(); + virtual void tick(); + +private: + virtual void openMouth(); + +public: + // 4J-JEV: Made public for tooltip code, doesn't change state anyway. + virtual bool isReadyForParenting(); + +public: + virtual bool renderName(); + virtual bool rideableEntity(); + virtual void setUsingItemFlag(bool flag); + virtual void setEating(bool state); + virtual void setStanding(bool state); + +private: + virtual void stand(); + +public: + virtual void makeMad(); + virtual void dropMyStuff(); + +private: + virtual void dropInventory(shared_ptr entity, shared_ptr animalchest); + +public: + virtual bool tameWithName(shared_ptr player); + virtual void travel(float xa, float ya); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual bool canMate(shared_ptr partner); + virtual shared_ptr getBreedOffspring(shared_ptr partner); + virtual MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param + virtual float getEatAnim(float a); + virtual float getStandAnim(float a); + virtual float getMouthAnim(float a); + +protected: + virtual bool useNewAi(); + +public: + virtual void onPlayerJump(int jumpAmount); + +protected: + virtual void spawnTamingParticles(bool success); + +public: + virtual void handleEntityEvent(byte id); + virtual void positionRider(); + +private: + virtual float generateRandomMaxHealth(); + virtual double generateRandomJumpStrength(); + virtual double generateRandomSpeed(); + + shared_ptr getOwner(); + +public: + class HorseGroupData : public MobGroupData + { + + public: + int horseType; + int horseVariant; + + HorseGroupData(int type, int variant); + }; + + static bool isHorseArmor(int itemId); + virtual bool onLadder(); +}; \ No newline at end of file diff --git a/Minecraft.World/EntityIO.cpp b/Minecraft.World/EntityIO.cpp index d0677d38..4532e8dd 100644 --- a/Minecraft.World/EntityIO.cpp +++ b/Minecraft.World/EntityIO.cpp @@ -3,6 +3,8 @@ #include "Painting.h" #include "System.h" #include "Entity.h" +#include "WitherBoss.h" +#include "net.minecraft.world.entity.ambient.h" #include "net.minecraft.world.entity.animal.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.monster.h" @@ -24,7 +26,7 @@ unordered_map EntityIO::idsSpawnableInCreativ void EntityIO::setId(entityCreateFn createFn, eINSTANCEOF clas, const wstring &id, int idNum) { - idCreateMap->insert( unordered_map::value_type(id, createFn) ); + idCreateMap->insert( unordered_map::value_type(id, createFn) ); classIdMap->insert( unordered_map::value_type(clas,id ) ); numCreateMap->insert( unordered_map::value_type(idNum, createFn) ); numClassMap->insert( unordered_map::value_type(idNum, clas) ); @@ -43,52 +45,65 @@ void EntityIO::staticCtor() { setId(ItemEntity::create, eTYPE_ITEMENTITY, L"Item", 1); setId(ExperienceOrb::create, eTYPE_EXPERIENCEORB, L"XPOrb", 2); - - setId(Painting::create, eTYPE_PAINTING, L"Painting", 9); - setId(Arrow::create, eTYPE_ARROW, L"Arrow", 10); - setId(Snowball::create, eTYPE_SNOWBALL, L"Snowball", 11); - setId(Fireball::create, eTYPE_FIREBALL, L"Fireball", 12); + + setId(LeashFenceKnotEntity::create, eTYPE_LEASHFENCEKNOT, L"LeashKnot", 8); + setId(Painting::create, eTYPE_PAINTING, L"Painting", 9); + setId(Arrow::create, eTYPE_ARROW, L"Arrow", 10); + setId(Snowball::create, eTYPE_SNOWBALL, L"Snowball", 11); + setId(LargeFireball::create, eTYPE_FIREBALL, L"Fireball", 12); setId(SmallFireball::create, eTYPE_SMALL_FIREBALL, L"SmallFireball", 13); setId(ThrownEnderpearl::create, eTYPE_THROWNENDERPEARL, L"ThrownEnderpearl", 14); setId(EyeOfEnderSignal::create, eTYPE_EYEOFENDERSIGNAL, L"EyeOfEnderSignal", 15); setId(ThrownPotion::create, eTYPE_THROWNPOTION, L"ThrownPotion", 16); setId(ThrownExpBottle::create, eTYPE_THROWNEXPBOTTLE, L"ThrownExpBottle", 17); setId(ItemFrame::create, eTYPE_ITEM_FRAME, L"ItemFrame", 18); - - setId(PrimedTnt::create, eTYPE_PRIMEDTNT, L"PrimedTnt", 20); - setId(FallingTile::create, eTYPE_FALLINGTILE, L"FallingSand", 21); - - setId(Minecart::create, eTYPE_MINECART, L"Minecart", 40); - setId(Boat::create, eTYPE_BOAT, L"Boat", 41); - - setId(Mob::create, eTYPE_MOB, L"Mob", 48); - setId(Monster::create, eTYPE_MONSTER, L"Monster", 49); - - setId(Creeper::create, eTYPE_CREEPER, L"Creeper", 50, eMinecraftColour_Mob_Creeper_Colour1, eMinecraftColour_Mob_Creeper_Colour2, IDS_CREEPER); - setId(Skeleton::create, eTYPE_SKELETON, L"Skeleton", 51, eMinecraftColour_Mob_Skeleton_Colour1, eMinecraftColour_Mob_Skeleton_Colour2, IDS_SKELETON); - setId(Spider::create, eTYPE_SPIDER, L"Spider", 52, eMinecraftColour_Mob_Spider_Colour1, eMinecraftColour_Mob_Spider_Colour2, IDS_SPIDER); - setId(Giant::create, eTYPE_GIANT, L"Giant", 53); - setId(Zombie::create, eTYPE_ZOMBIE, L"Zombie", 54, eMinecraftColour_Mob_Zombie_Colour1, eMinecraftColour_Mob_Zombie_Colour2, IDS_ZOMBIE); - setId(Slime::create, eTYPE_SLIME, L"Slime", 55, eMinecraftColour_Mob_Slime_Colour1, eMinecraftColour_Mob_Slime_Colour2, IDS_SLIME); - setId(Ghast::create, eTYPE_GHAST, L"Ghast", 56, eMinecraftColour_Mob_Ghast_Colour1, eMinecraftColour_Mob_Ghast_Colour2, IDS_GHAST); - setId(PigZombie::create, eTYPE_PIGZOMBIE, L"PigZombie", 57, eMinecraftColour_Mob_PigZombie_Colour1, eMinecraftColour_Mob_PigZombie_Colour2, IDS_PIGZOMBIE); + setId(WitherSkull::create, eTYPE_WITHER_SKULL, L"WitherSkull", 19); + + setId(PrimedTnt::create, eTYPE_PRIMEDTNT, L"PrimedTnt", 20); + setId(FallingTile::create, eTYPE_FALLINGTILE, L"FallingSand", 21); + + setId(FireworksRocketEntity::create, eTYPE_FIREWORKS_ROCKET, L"FireworksRocketEntity", 22); + + setId(Boat::create, eTYPE_BOAT, L"Boat", 41); + setId(MinecartRideable::create, eTYPE_MINECART_RIDEABLE, L"MinecartRideable", 42); + setId(MinecartChest::create, eTYPE_MINECART_CHEST, L"MinecartChest", 43); + setId(MinecartFurnace::create, eTYPE_MINECART_FURNACE, L"MinecartFurnace", 44); + setId(MinecartTNT::create, eTYPE_MINECART_TNT, L"MinecartTNT", 45); + setId(MinecartHopper::create, eTYPE_MINECART_HOPPER, L"MinecartHopper", 46); + setId(MinecartSpawner::create, eTYPE_MINECART_SPAWNER, L"MinecartSpawner", 47); + + setId(Mob::create, eTYPE_MOB, L"Mob", 48); + setId(Monster::create, eTYPE_MONSTER, L"Monster", 49); + + setId(Creeper::create, eTYPE_CREEPER, L"Creeper", 50, eMinecraftColour_Mob_Creeper_Colour1, eMinecraftColour_Mob_Creeper_Colour2, IDS_CREEPER); + setId(Skeleton::create, eTYPE_SKELETON, L"Skeleton", 51, eMinecraftColour_Mob_Skeleton_Colour1, eMinecraftColour_Mob_Skeleton_Colour2, IDS_SKELETON); + setId(Spider::create, eTYPE_SPIDER, L"Spider", 52, eMinecraftColour_Mob_Spider_Colour1, eMinecraftColour_Mob_Spider_Colour2, IDS_SPIDER); + setId(Giant::create, eTYPE_GIANT, L"Giant", 53); + setId(Zombie::create, eTYPE_ZOMBIE, L"Zombie", 54, eMinecraftColour_Mob_Zombie_Colour1, eMinecraftColour_Mob_Zombie_Colour2, IDS_ZOMBIE); + setId(Slime::create, eTYPE_SLIME, L"Slime", 55, eMinecraftColour_Mob_Slime_Colour1, eMinecraftColour_Mob_Slime_Colour2, IDS_SLIME); + setId(Ghast::create, eTYPE_GHAST, L"Ghast", 56, eMinecraftColour_Mob_Ghast_Colour1, eMinecraftColour_Mob_Ghast_Colour2, IDS_GHAST); + setId(PigZombie::create, eTYPE_PIGZOMBIE, L"PigZombie", 57, eMinecraftColour_Mob_PigZombie_Colour1, eMinecraftColour_Mob_PigZombie_Colour2, IDS_PIGZOMBIE); setId(EnderMan::create, eTYPE_ENDERMAN, L"Enderman", 58, eMinecraftColour_Mob_Enderman_Colour1, eMinecraftColour_Mob_Enderman_Colour2, IDS_ENDERMAN); setId(CaveSpider::create, eTYPE_CAVESPIDER, L"CaveSpider", 59, eMinecraftColour_Mob_CaveSpider_Colour1, eMinecraftColour_Mob_CaveSpider_Colour2, IDS_CAVE_SPIDER); setId(Silverfish::create, eTYPE_SILVERFISH, L"Silverfish", 60, eMinecraftColour_Mob_Silverfish_Colour1, eMinecraftColour_Mob_Silverfish_Colour2, IDS_SILVERFISH); setId(Blaze::create, eTYPE_BLAZE, L"Blaze", 61, eMinecraftColour_Mob_Blaze_Colour1, eMinecraftColour_Mob_Blaze_Colour2, IDS_BLAZE); setId(LavaSlime::create, eTYPE_LAVASLIME, L"LavaSlime", 62, eMinecraftColour_Mob_LavaSlime_Colour1, eMinecraftColour_Mob_LavaSlime_Colour2, IDS_LAVA_SLIME); - setId(EnderDragon::create, eTYPE_ENDERDRAGON, L"EnderDragon", 63); - - setId(Pig::create, eTYPE_PIG, L"Pig", 90, eMinecraftColour_Mob_Pig_Colour1, eMinecraftColour_Mob_Pig_Colour2, IDS_PIG); - setId(Sheep::create, eTYPE_SHEEP, L"Sheep", 91, eMinecraftColour_Mob_Sheep_Colour1, eMinecraftColour_Mob_Sheep_Colour2, IDS_SHEEP); - setId(Cow::create, eTYPE_COW, L"Cow", 92, eMinecraftColour_Mob_Cow_Colour1, eMinecraftColour_Mob_Cow_Colour2, IDS_COW); - setId(Chicken::create, eTYPE_CHICKEN, L"Chicken", 93, eMinecraftColour_Mob_Chicken_Colour1, eMinecraftColour_Mob_Chicken_Colour2, IDS_CHICKEN); - setId(Squid::create, eTYPE_SQUID, L"Squid", 94, eMinecraftColour_Mob_Squid_Colour1, eMinecraftColour_Mob_Squid_Colour2, IDS_SQUID); - setId(Wolf::create, eTYPE_WOLF, L"Wolf", 95, eMinecraftColour_Mob_Wolf_Colour1, eMinecraftColour_Mob_Wolf_Colour2, IDS_WOLF); + setId(EnderDragon::create, eTYPE_ENDERDRAGON, L"EnderDragon", 63, eMinecraftColour_Mob_Enderman_Colour1, eMinecraftColour_Mob_Enderman_Colour1, IDS_ENDERDRAGON); + setId(WitherBoss::create, eTYPE_WITHERBOSS, L"WitherBoss", 64); + setId(Bat::create, eTYPE_BAT, L"Bat", 65, eMinecraftColour_Mob_Bat_Colour1, eMinecraftColour_Mob_Bat_Colour2, IDS_BAT); + setId(Witch::create, eTYPE_WITCH, L"Witch", 66, eMinecraftColour_Mob_Witch_Colour1, eMinecraftColour_Mob_Witch_Colour2, IDS_WITCH); + + setId(Pig::create, eTYPE_PIG, L"Pig", 90, eMinecraftColour_Mob_Pig_Colour1, eMinecraftColour_Mob_Pig_Colour2, IDS_PIG); + setId(Sheep::create, eTYPE_SHEEP, L"Sheep", 91, eMinecraftColour_Mob_Sheep_Colour1, eMinecraftColour_Mob_Sheep_Colour2, IDS_SHEEP); + setId(Cow::create, eTYPE_COW, L"Cow", 92, eMinecraftColour_Mob_Cow_Colour1, eMinecraftColour_Mob_Cow_Colour2, IDS_COW); + setId(Chicken::create, eTYPE_CHICKEN, L"Chicken", 93, eMinecraftColour_Mob_Chicken_Colour1, eMinecraftColour_Mob_Chicken_Colour2, IDS_CHICKEN); + setId(Squid::create, eTYPE_SQUID, L"Squid", 94, eMinecraftColour_Mob_Squid_Colour1, eMinecraftColour_Mob_Squid_Colour2, IDS_SQUID); + setId(Wolf::create, eTYPE_WOLF, L"Wolf", 95, eMinecraftColour_Mob_Wolf_Colour1, eMinecraftColour_Mob_Wolf_Colour2, IDS_WOLF); setId(MushroomCow::create, eTYPE_MUSHROOMCOW, L"MushroomCow", 96, eMinecraftColour_Mob_MushroomCow_Colour1, eMinecraftColour_Mob_MushroomCow_Colour2, IDS_MUSHROOM_COW); setId(SnowMan::create, eTYPE_SNOWMAN, L"SnowMan", 97); - setId(Ozelot::create, eTYPE_OZELOT, L"Ozelot", 98, eMinecraftColour_Mob_Ocelot_Colour1, eMinecraftColour_Mob_Ocelot_Colour2, IDS_OZELOT); + setId(Ocelot::create, eTYPE_OCELOT, L"Ozelot", 98, eMinecraftColour_Mob_Ocelot_Colour1, eMinecraftColour_Mob_Ocelot_Colour2, IDS_OZELOT); setId(VillagerGolem::create, eTYPE_VILLAGERGOLEM, L"VillagerGolem", 99); + setId(EntityHorse::create, eTYPE_HORSE, L"EntityHorse", 100, eMinecraftColour_Mob_Horse_Colour1, eMinecraftColour_Mob_Horse_Colour2, IDS_HORSE); setId(Villager::create, eTYPE_VILLAGER, L"Villager", 120, eMinecraftColour_Mob_Villager_Colour1, eMinecraftColour_Mob_Villager_Colour2, IDS_VILLAGER); @@ -96,70 +111,116 @@ void EntityIO::staticCtor() // 4J Added setId(DragonFireball::create, eTYPE_DRAGON_FIREBALL, L"DragonFireball", 1000); + + // 4J-PB - moved to allow the eggs to be named and coloured in the Creative Mode menu + // 4J Added for custom spawn eggs + setId(EntityHorse::create, eTYPE_HORSE, L"EntityHorse", 100 | ((EntityHorse::TYPE_DONKEY + 1) << 12), eMinecraftColour_Mob_Horse_Colour1, eMinecraftColour_Mob_Horse_Colour2, IDS_DONKEY); + setId(EntityHorse::create, eTYPE_HORSE, L"EntityHorse", 100 | ((EntityHorse::TYPE_MULE + 1) << 12), eMinecraftColour_Mob_Horse_Colour1, eMinecraftColour_Mob_Horse_Colour2, IDS_MULE); + +#ifndef _CONTENT_PACKAGE + setId(EntityHorse::create, eTYPE_HORSE, L"EntityHorse", 100 | ((EntityHorse::TYPE_SKELETON + 1) << 12), eMinecraftColour_Mob_Horse_Colour1, eMinecraftColour_Mob_Horse_Colour2, IDS_SKELETON_HORSE); + setId(EntityHorse::create, eTYPE_HORSE, L"EntityHorse", 100 | ((EntityHorse::TYPE_UNDEAD + 1) << 12), eMinecraftColour_Mob_Horse_Colour1, eMinecraftColour_Mob_Horse_Colour2, IDS_ZOMBIE_HORSE); + setId(Ocelot::create, eTYPE_OCELOT, L"Ozelot", 98 | ((Ocelot::TYPE_BLACK + 1) << 12), eMinecraftColour_Mob_Ocelot_Colour1, eMinecraftColour_Mob_Ocelot_Colour2, IDS_OZELOT ); + setId(Ocelot::create, eTYPE_OCELOT, L"Ozelot", 98 | ((Ocelot::TYPE_RED + 1) << 12), eMinecraftColour_Mob_Ocelot_Colour1, eMinecraftColour_Mob_Ocelot_Colour2, IDS_OZELOT ); + setId(Ocelot::create, eTYPE_OCELOT, L"Ozelot", 98 | ((Ocelot::TYPE_SIAMESE + 1) << 12), eMinecraftColour_Mob_Ocelot_Colour1, eMinecraftColour_Mob_Ocelot_Colour2, IDS_OZELOT ); + setId(Spider::create, eTYPE_SPIDER, L"Spider", 52 | (2 << 12), eMinecraftColour_Mob_Spider_Colour1, eMinecraftColour_Mob_Spider_Colour2, IDS_SKELETON ); +#endif } shared_ptr EntityIO::newEntity(const wstring& id, Level *level) { - shared_ptr entity; + shared_ptr entity; AUTO_VAR(it, idCreateMap->find(id)); if(it != idCreateMap->end() ) { entityCreateFn create = it->second; if (create != NULL) entity = shared_ptr(create(level)); + if( ( entity != NULL ) && entity->GetType() == eTYPE_ENDERDRAGON ) + { + dynamic_pointer_cast(entity)->AddParts(); // 4J added to finalise creation + } } - return entity; + return entity; } shared_ptr EntityIO::loadStatic(CompoundTag *tag, Level *level) { - shared_ptr entity; + shared_ptr entity; + + if (tag->getString(L"id").compare(L"Minecart") == 0) + { + // I don't like this any more than you do. Sadly, compatibility... + + switch (tag->getInt(L"Type")) + { + case Minecart::TYPE_CHEST: + tag->putString(L"id", L"MinecartChest"); + break; + case Minecart::TYPE_FURNACE: + tag->putString(L"id", L"MinecartFurnace"); + break; + case Minecart::TYPE_RIDEABLE: + tag->putString(L"id", L"MinecartRideable"); + break; + } + + tag->remove(L"Type"); + } AUTO_VAR(it, idCreateMap->find(tag->getString(L"id"))); if(it != idCreateMap->end() ) { entityCreateFn create = it->second; if (create != NULL) entity = shared_ptr(create(level)); + if( ( entity != NULL ) && entity->GetType() == eTYPE_ENDERDRAGON ) + { + dynamic_pointer_cast(entity)->AddParts(); // 4J added to finalise creation + } } - if (entity != NULL) + if (entity != NULL) { - entity->load(tag); - } + entity->load(tag); + } else { #ifdef _DEBUG app.DebugPrintf("Skipping Entity with id %ls\n", tag->getString(L"id").c_str() ); #endif - } - return entity; + } + return entity; } shared_ptr EntityIO::newById(int id, Level *level) { - shared_ptr entity; + shared_ptr entity; AUTO_VAR(it, numCreateMap->find(id)); if(it != numCreateMap->end() ) { entityCreateFn create = it->second; if (create != NULL) entity = shared_ptr(create(level)); + if( ( entity != NULL ) && entity->GetType() == eTYPE_ENDERDRAGON ) + { + dynamic_pointer_cast(entity)->AddParts(); // 4J added to finalise creation + } } - if (entity != NULL) + if (entity != NULL) { - } + } else { - //printf("Skipping Entity with id %d\n", id ) ; - } - return entity; + //printf("Skipping Entity with id %d\n", id ) ; + } + return entity; } shared_ptr EntityIO::newByEnumType(eINSTANCEOF eType, Level *level) { - shared_ptr entity; + shared_ptr entity; unordered_map::iterator it = classNumMap->find( eType ); if( it != classNumMap->end() ) @@ -169,10 +230,14 @@ shared_ptr EntityIO::newByEnumType(eINSTANCEOF eType, Level *level) { entityCreateFn create = it2->second; if (create != NULL) entity = shared_ptr(create(level)); + if( ( entity != NULL ) && entity->GetType() == eTYPE_ENDERDRAGON ) + { + dynamic_pointer_cast(entity)->AddParts(); // 4J added to finalise creation + } } } - return entity; + return entity; } int EntityIO::getId(shared_ptr entity) @@ -208,7 +273,7 @@ wstring EntityIO::getEncodeId(int entityIoValue) //{ //return classIdMap.get(class1); //} - + AUTO_VAR(it, numClassMap->find(entityIoValue)); if(it != numClassMap->end() ) { diff --git a/Minecraft.World/EntitySelector.cpp b/Minecraft.World/EntitySelector.cpp new file mode 100644 index 00000000..36c7bf88 --- /dev/null +++ b/Minecraft.World/EntitySelector.cpp @@ -0,0 +1,42 @@ +#include "stdafx.h" +#include "Container.h" +#include "EntitySelector.h" + +const EntitySelector *EntitySelector::ENTITY_STILL_ALIVE = new AliveEntitySelector(); +const EntitySelector *EntitySelector::CONTAINER_ENTITY_SELECTOR = new ContainerEntitySelector(); + +bool AliveEntitySelector::matches(shared_ptr entity) const +{ + return entity->isAlive(); +} + +bool ContainerEntitySelector::matches(shared_ptr entity) const +{ + return (dynamic_pointer_cast(entity) != NULL) && entity->isAlive(); +} + +MobCanWearArmourEntitySelector::MobCanWearArmourEntitySelector(shared_ptr item) +{ + this->item = item; +} + +bool MobCanWearArmourEntitySelector::matches(shared_ptr entity) const +{ + if ( !entity->isAlive() ) return false; + if ( !entity->instanceof(eTYPE_LIVINGENTITY) ) return false; + + shared_ptr mob = dynamic_pointer_cast(entity); + + if (mob->getCarried(Mob::getEquipmentSlotForItem(item)) != NULL) return false; + + if ( mob->instanceof(eTYPE_MOB) ) + { + return dynamic_pointer_cast(mob)->canPickUpLoot(); + } + else if (mob->instanceof(eTYPE_PLAYER)) + { + return true; + } + + return false; +} \ No newline at end of file diff --git a/Minecraft.World/EntitySelector.h b/Minecraft.World/EntitySelector.h new file mode 100644 index 00000000..5cba9e84 --- /dev/null +++ b/Minecraft.World/EntitySelector.h @@ -0,0 +1,32 @@ +#pragma once + +class EntitySelector +{ +public: + static const EntitySelector *ENTITY_STILL_ALIVE; + static const EntitySelector *CONTAINER_ENTITY_SELECTOR; + + virtual bool matches(shared_ptr entity) const = 0; +}; + +class AliveEntitySelector : public EntitySelector +{ +public: + bool matches(shared_ptr entity) const; +}; + +class ContainerEntitySelector : public EntitySelector +{ +public: + bool matches(shared_ptr entity) const; +}; + +class MobCanWearArmourEntitySelector : public EntitySelector +{ +private: + shared_ptr item; + +public: + MobCanWearArmourEntitySelector(shared_ptr item); + bool matches(shared_ptr entity) const; +}; \ No newline at end of file diff --git a/Minecraft.World/EntityTile.h b/Minecraft.World/EntityTile.h index 7f781c19..50e62397 100644 --- a/Minecraft.World/EntityTile.h +++ b/Minecraft.World/EntityTile.h @@ -1,15 +1,7 @@ #pragma once -#include "Tile.h" -class TileEntity; - -class EntityTile : public Tile +class EntityTile { -protected: - EntityTile(int id, Material *material, bool isSolidRender = true); public: - virtual void onPlace(Level *level, int x, int y, int z); - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); virtual shared_ptr newTileEntity(Level *level) = 0; - virtual void triggerEvent(Level *level, int x, int y, int z, int b0, int b1); }; \ No newline at end of file diff --git a/Minecraft.World/ExperienceCommand.cpp b/Minecraft.World/ExperienceCommand.cpp index b8ac2efc..9a59d71a 100644 --- a/Minecraft.World/ExperienceCommand.cpp +++ b/Minecraft.World/ExperienceCommand.cpp @@ -2,6 +2,7 @@ #include "net.minecraft.commands.h" #include "..\Minecraft.Client\MinecraftServer.h" #include "..\Minecraft.Client\PlayerList.h" +#include "net.minecraft.world.level.h" #include "ExperienceCommand.h" EGameCommand ExperienceCommand::getId() @@ -9,33 +10,50 @@ EGameCommand ExperienceCommand::getId() return eGameCommand_Experience; } -void ExperienceCommand::execute(shared_ptr source, byteArray commandData) +int ExperienceCommand::getPermissionLevel() { - //if (args.length > 0) - //{ - // Player player; - // int amount = convertArgToInt(source, args[0], 0, 5000); - - // if (args.length > 1) { - // player = getPlayer(args[1]); - // } else { - // player = convertSourceToPlayer(source); - // } - - // player.increaseXp(amount); - // logAdminAction(source, "commands.xp.success", amount, player.getAName()); - //} + return LEVEL_GAMEMASTERS; } -shared_ptr ExperienceCommand::getPlayer(PlayerUID playerId) +void ExperienceCommand::execute(shared_ptr source, byteArray commandData) { - return nullptr; - //shared_ptr player = MinecraftServer::getInstance()->getPlayers()->getPlayer(playerId); - - //if (player == null) - //{ - // throw new PlayerNotFoundException(); - //} else { - // return player; - //} +// if (args.length > 0) { +// Player player; +// String inputAmount = args[0]; +// +// boolean levels = inputAmount.endsWith("l") || inputAmount.endsWith("L"); +// if (levels && inputAmount.length() > 1) inputAmount = inputAmount.substring(0, inputAmount.length() - 1); +// +// int amount = convertArgToInt(source, inputAmount); +// boolean take = amount < 0; +// +// if (take) amount *= -1; +// +// if (args.length > 1) { +// player = convertToPlayer(source, args[1]); +// } else { +// player = convertSourceToPlayer(source); +// } +// +// if (levels) { +// if (take) { +// player.giveExperienceLevels(-amount); +// logAdminAction(source, "commands.xp.success.negative.levels", amount, player.getAName()); +// } else { +// player.giveExperienceLevels(amount); +// logAdminAction(source, "commands.xp.success.levels", amount, player.getAName()); +// } +// } else { +// if (take) { +// throw new UsageException("commands.xp.failure.widthdrawXp"); +// } else { +// player.increaseXp(amount); +// logAdminAction(source, "commands.xp.success", amount, player.getAName()); +// } +// } +// +// return; +// } +// +// throw new UsageException("commands.xp.usage"); } \ No newline at end of file diff --git a/Minecraft.World/ExperienceCommand.h b/Minecraft.World/ExperienceCommand.h index b1dd2cbe..2ca86aff 100644 --- a/Minecraft.World/ExperienceCommand.h +++ b/Minecraft.World/ExperienceCommand.h @@ -8,8 +8,6 @@ class ExperienceCommand : public Command { public: virtual EGameCommand getId(); + virtual int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData); - -protected: - shared_ptr getPlayer(PlayerUID playerId); }; \ No newline at end of file diff --git a/Minecraft.World/ExperienceItem.cpp b/Minecraft.World/ExperienceItem.cpp index 497c2385..433c1207 100644 --- a/Minecraft.World/ExperienceItem.cpp +++ b/Minecraft.World/ExperienceItem.cpp @@ -15,7 +15,7 @@ bool ExperienceItem::isFoil(shared_ptr itemInstance) return true; } -bool ExperienceItem::TestUse(Level *level, shared_ptr player) +bool ExperienceItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { return true; } @@ -26,7 +26,7 @@ shared_ptr ExperienceItem::use(shared_ptr itemInstan { itemInstance->count--; } - level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + level->playEntitySound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); if (!level->isClientSide) level->addEntity( shared_ptr( new ThrownExpBottle(level, player) )); return itemInstance; } \ No newline at end of file diff --git a/Minecraft.World/ExperienceItem.h b/Minecraft.World/ExperienceItem.h index c8e95925..89dac191 100644 --- a/Minecraft.World/ExperienceItem.h +++ b/Minecraft.World/ExperienceItem.h @@ -11,5 +11,5 @@ public: virtual bool isFoil(shared_ptr itemInstance); virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); }; \ No newline at end of file diff --git a/Minecraft.World/ExperienceOrb.cpp b/Minecraft.World/ExperienceOrb.cpp index 76f2a9ae..9fed6d71 100644 --- a/Minecraft.World/ExperienceOrb.cpp +++ b/Minecraft.World/ExperienceOrb.cpp @@ -90,7 +90,7 @@ void ExperienceOrb::tick() yd = 0.2f; xd = (random->nextFloat() - random->nextFloat()) * 0.2f; zd = (random->nextFloat() - random->nextFloat()) * 0.2f; - level->playSound(shared_from_this(), eSoundType_RANDOM_FIZZ, 0.4f, 2.0f + random->nextFloat() * 0.4f); + playSound(eSoundType_RANDOM_FIZZ, 0.4f, 2.0f + random->nextFloat() * 0.4f); } checkInTile(x, (bb->y0 + bb->y1) / 2, z); @@ -162,8 +162,9 @@ void ExperienceOrb::burn(int dmg) hurt(DamageSource::inFire, dmg); } -bool ExperienceOrb::hurt(DamageSource *source, int damage) +bool ExperienceOrb::hurt(DamageSource *source, float damage) { + if (isInvulnerable()) return false; markHurt(); health -= damage; if (health <= 0) @@ -195,7 +196,7 @@ void ExperienceOrb::playerTouch(shared_ptr player) { player->takeXpDelay = 2; // 4J - sound change brought forward from 1.2.3 - level->playSound(shared_from_this(), eSoundType_RANDOM_ORB, 0.1f, 0.5f * ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.8f)); + playSound(eSoundType_RANDOM_ORB, 0.1f, 0.5f * ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.8f)); player->take(shared_from_this(), 1); player->increaseXp(value); remove(); diff --git a/Minecraft.World/ExperienceOrb.h b/Minecraft.World/ExperienceOrb.h index 524ae52a..37d11a6c 100644 --- a/Minecraft.World/ExperienceOrb.h +++ b/Minecraft.World/ExperienceOrb.h @@ -46,7 +46,7 @@ protected: virtual void burn(int dmg); public: - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); virtual void addAdditonalSaveData(CompoundTag *entityTag); virtual void readAdditionalSaveData(CompoundTag *tag); virtual void playerTouch(shared_ptr player); diff --git a/Minecraft.World/Explosion.cpp b/Minecraft.World/Explosion.cpp index 604813b7..028ad673 100644 --- a/Minecraft.World/Explosion.cpp +++ b/Minecraft.World/Explosion.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.item.enchantment.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" @@ -69,9 +71,11 @@ void Explosion::explode() int t = level->getTile(xt, yt, zt); if (t > 0) { - remainingPower -= (Tile::tiles[t]->getExplosionResistance(source) + 0.3f) * stepSize; + Tile *tile = Tile::tiles[t]; + float resistance = source != NULL ? source->getTileExplosionResistance(this, level, xt, yt, zt, tile) : tile->getExplosionResistance(source); + remainingPower -= (resistance + 0.3f) * stepSize; } - if (remainingPower > 0) + if (remainingPower > 0&& (source == NULL || source->shouldTileExplode(this, level, xt, yt, zt, t, remainingPower))) { toBlow.insert(TilePos(xt, yt, zt)); } @@ -142,16 +146,17 @@ void Explosion::explode() double sp = level->getSeenPercent(center, e->bb); double pow = (1 - dist) * sp; - if(canDamage) e->hurt(DamageSource::explosion, (int) ((pow * pow + pow) / 2 * 8 * r + 1)); + if(canDamage) e->hurt(DamageSource::explosion(this), (int) ((pow * pow + pow) / 2 * 8 * r + 1)); - double push = pow; - e->xd += xa * push; - e->yd += ya * push; - e->zd += za * push; + double kbPower = ProtectionEnchantment::getExplosionKnockbackAfterDampener(e, pow); + e->xd += xa *kbPower; + e->yd += ya *kbPower; + e->zd += za *kbPower; - shared_ptr player = dynamic_pointer_cast(e); - if (player != NULL) + + if (e->instanceof(eTYPE_PLAYER)) { + shared_ptr player = dynamic_pointer_cast(e); //app.DebugPrintf("Adding player knockback (%f,%f,%f)\n", xa * pow, ya * pow, za * pow); hitPlayers.insert( playerVec3Map::value_type( player, Vec3::newPermanent(xa * pow, ya * pow, za * pow))); } @@ -164,68 +169,82 @@ void Explosion::explode() void Explosion::finalizeExplosion(bool generateParticles, vector *toBlowDirect/*=NULL*/) // 4J - added toBlowDirect parameter { level->playSound(x, y, z, eSoundType_RANDOM_EXPLODE, 4, (1 + (level->random->nextFloat() - level->random->nextFloat()) * 0.2f) * 0.7f); - level->addParticle(eParticleType_hugeexplosion, x, y, z, 0, 0, 0); - + if (r < 2 || !destroyBlocks) + { + level->addParticle(eParticleType_largeexplode, x, y, z, 1.0f, 0, 0); + } + else + { + level->addParticle(eParticleType_hugeexplosion, x, y, z, 1.0f, 0, 0); + } + // 4J - use pointer to vector directly passed in if this is available - used to speed up calling this from an incoming packet vector *toBlowArray = toBlowDirect ? toBlowDirect : new vector( toBlow.begin(), toBlow.end() ); - //toBlowArray.addAll(toBlow); - // TODO 4J Stu - Reverse iterator - PIXBeginNamedEvent(0,"Finalizing explosion size %d",toBlow.size()); - app.DebugPrintf("Finalizing explosion size %d\n",toBlow.size()); - static const int MAX_EXPLODE_PARTICLES = 50; - // 4J - try and make at most MAX_EXPLODE_PARTICLES pairs of particles - int fraction = (int)toBlowArray->size() / MAX_EXPLODE_PARTICLES; - if( fraction == 0 ) fraction = 1; - size_t j = toBlowArray->size() - 1; - //for (size_t j = toBlowArray->size() - 1; j >= 0; j--) - for(AUTO_VAR(it,toBlowArray->rbegin()); it != toBlowArray->rend(); ++it) + if (destroyBlocks) { - TilePos *tp = &(*it); //&toBlowArray->at(j); - int xt = tp->x; - int yt = tp->y; - int zt = tp->z; - // if (xt >= 0 && yt >= 0 && zt >= 0 && xt < width && yt < depth && - // zt < height) { - int t = level->getTile(xt, yt, zt); - - if (generateParticles) + //toBlowArray.addAll(toBlow); + // TODO 4J Stu - Reverse iterator + PIXBeginNamedEvent(0,"Finalizing explosion size %d",toBlow.size()); + app.DebugPrintf("Finalizing explosion size %d\n",toBlow.size()); + static const int MAX_EXPLODE_PARTICLES = 50; + // 4J - try and make at most MAX_EXPLODE_PARTICLES pairs of particles + int fraction = (int)toBlowArray->size() / MAX_EXPLODE_PARTICLES; + if( fraction == 0 ) fraction = 1; + size_t j = toBlowArray->size() - 1; + //for (size_t j = toBlowArray->size() - 1; j >= 0; j--) + for(AUTO_VAR(it,toBlowArray->rbegin()); it != toBlowArray->rend(); ++it) { - if( ( j % fraction ) == 0 ) + TilePos *tp = &(*it); //&toBlowArray->at(j); + int xt = tp->x; + int yt = tp->y; + int zt = tp->z; + // if (xt >= 0 && yt >= 0 && zt >= 0 && xt < width && yt < depth && + // zt < height) { + int t = level->getTile(xt, yt, zt); + + if (generateParticles) { - double xa = xt + level->random->nextFloat(); - double ya = yt + level->random->nextFloat(); - double za = zt + level->random->nextFloat(); + if( ( j % fraction ) == 0 ) + { + double xa = xt + level->random->nextFloat(); + double ya = yt + level->random->nextFloat(); + double za = zt + level->random->nextFloat(); - double xd = xa - x; - double yd = ya - y; - double zd = za - z; + double xd = xa - x; + double yd = ya - y; + double zd = za - z; - double dd = sqrt(xd * xd + yd * yd + zd * zd); + double dd = sqrt(xd * xd + yd * yd + zd * zd); - xd /= dd; - yd /= dd; - zd /= dd; + xd /= dd; + yd /= dd; + zd /= dd; - double speed = 0.5 / (dd / r + 0.1); - speed *= (level->random->nextFloat() * level->random->nextFloat() + 0.3f); - xd *= speed; - yd *= speed; - zd *= speed; + double speed = 0.5 / (dd / r + 0.1); + speed *= (level->random->nextFloat() * level->random->nextFloat() + 0.3f); + xd *= speed; + yd *= speed; + zd *= speed; - level->addParticle(eParticleType_explode, (xa + x * 1) / 2, (ya + y * 1) / 2, (za + z * 1) / 2, xd, yd, zd); - level->addParticle(eParticleType_smoke, xa, ya, za, xd, yd, zd); + level->addParticle(eParticleType_explode, (xa + x * 1) / 2, (ya + y * 1) / 2, (za + z * 1) / 2, xd, yd, zd); + level->addParticle(eParticleType_smoke, xa, ya, za, xd, yd, zd); + } } - } - if (t > 0) - { - Tile::tiles[t]->spawnResources(level, xt, yt, zt, level->getData(xt, yt, zt), 0.3f, 0); - level->setTile(xt, yt, zt, 0); - Tile::tiles[t]->wasExploded(level, xt, yt, zt); - } - // } + if (t > 0) + { + Tile *tile = Tile::tiles[t]; - --j; + if (tile->dropFromExplosion(this)) + { + tile->spawnResources(level, xt, yt, zt, level->getData(xt, yt, zt), 1.0f / r, 0); + } + level->setTileAndData(xt, yt, zt, 0, 0, Tile::UPDATE_ALL); + tile->wasExploded(level, xt, yt, zt, this); + } + + --j; + } } if (fire) @@ -241,7 +260,7 @@ void Explosion::finalizeExplosion(bool generateParticles, vector *toBlo int b = level->getTile(xt, yt - 1, zt); if (t == 0 && Tile::solid[b] && random->nextInt(3) == 0) { - level->setTile(xt, yt, zt, Tile::fire_Id); + level->setTileAndUpdate(xt, yt, zt, Tile::fire_Id); } } } @@ -262,4 +281,12 @@ Vec3 *Explosion::getHitPlayerKnockback( shared_ptr player ) if(it == hitPlayers.end() ) return Vec3::newTemp(0.0,0.0,0.0); return it->second; +} + +shared_ptr Explosion::getSourceMob() +{ + if (source == NULL) return nullptr; + if (source->instanceof(eTYPE_PRIMEDTNT)) return dynamic_pointer_cast(source)->getOwner(); + if (source->instanceof(eTYPE_LIVINGENTITY)) return dynamic_pointer_cast(source); + return nullptr; } \ No newline at end of file diff --git a/Minecraft.World/Explosion.h b/Minecraft.World/Explosion.h index c06960d2..1fe1e57b 100644 --- a/Minecraft.World/Explosion.h +++ b/Minecraft.World/Explosion.h @@ -39,4 +39,5 @@ public: void finalizeExplosion(bool generateParticles, vector *toBlowDirect = NULL); // 4J - added toBlow parameter playerVec3Map *getHitPlayers(); Vec3 *getHitPlayerKnockback( shared_ptr player ); + shared_ptr getSourceMob(); }; \ No newline at end of file diff --git a/Minecraft.World/ExtremeHillsBiome.cpp b/Minecraft.World/ExtremeHillsBiome.cpp index 7e62c7d3..26d97dd4 100644 --- a/Minecraft.World/ExtremeHillsBiome.cpp +++ b/Minecraft.World/ExtremeHillsBiome.cpp @@ -1,13 +1,20 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.levelgen.feature.h" #include "ExtremeHillsBiome.h" ExtremeHillsBiome::ExtremeHillsBiome(int id) : Biome(id) { + silverfishFeature = new OreFeature(Tile::monsterStoneEgg_Id, 8); friendlies.clear(); } +ExtremeHillsBiome::~ExtremeHillsBiome() +{ + delete silverfishFeature; +} + void ExtremeHillsBiome::decorate(Level *level, Random *random, int xo, int zo) { Biome::decorate(level, random, xo, zo); @@ -20,11 +27,18 @@ void ExtremeHillsBiome::decorate(Level *level, Random *random, int xo, int zo) { int y = random->nextInt((Level::genDepth / 4) - 4) + 4; int z = zo + random->nextInt(16); int tile = level->getTile(x, y, z); - if (tile == Tile::rock_Id) + if (tile == Tile::stone_Id) { - level->setTileNoUpdate(x, y, z, Tile::emeraldOre_Id); + level->setTileAndData(x, y, z, Tile::emeraldOre_Id, 0, Tile::UPDATE_CLIENTS); } } } + for (int i = 0; i < 7; i++) + { + int x = xo + random->nextInt(16); + int y = random->nextInt(Level::genDepth / 2); + int z = zo + random->nextInt(16); + silverfishFeature->place(level, random, x, y, z); + } } diff --git a/Minecraft.World/ExtremeHillsBiome.h b/Minecraft.World/ExtremeHillsBiome.h index faafa66e..cf9edabc 100644 --- a/Minecraft.World/ExtremeHillsBiome.h +++ b/Minecraft.World/ExtremeHillsBiome.h @@ -7,9 +7,11 @@ class ExtremeHillsBiome : public Biome friend class Biome; private: static const bool GENERATE_EMERALD_ORE = true; + Feature *silverfishFeature; protected: ExtremeHillsBiome(int id); + ~ExtremeHillsBiome(); public: void decorate(Level *level, Random *random, int xo, int zo); diff --git a/Minecraft.World/EyeOfEnderSignal.cpp b/Minecraft.World/EyeOfEnderSignal.cpp index 39d9f82e..95747a89 100644 --- a/Minecraft.World/EyeOfEnderSignal.cpp +++ b/Minecraft.World/EyeOfEnderSignal.cpp @@ -8,8 +8,6 @@ #include "JavaMath.h" #include "EyeOfEnderSignal.h" - - void EyeOfEnderSignal::_init() { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that @@ -23,7 +21,6 @@ void EyeOfEnderSignal::_init() surviveAfterDeath = false; } - EyeOfEnderSignal::EyeOfEnderSignal(Level *level) : Entity(level) { _init(); @@ -34,7 +31,6 @@ void EyeOfEnderSignal::defineSynchedData() { } - bool EyeOfEnderSignal::shouldRenderAtSqrDistance(double distance) { double size = bb->getSize() * 4; @@ -49,8 +45,8 @@ EyeOfEnderSignal::EyeOfEnderSignal(Level *level, double x, double y, double z) : setSize(0.25f, 0.25f); - this->setPos(x, y, z); - this->heightOffset = 0; + setPos(x, y, z); + heightOffset = 0; } void EyeOfEnderSignal::signalTo(double tx, int ty, double tz) @@ -85,8 +81,8 @@ void EyeOfEnderSignal::lerpMotion(double xd, double yd, double zd) if (xRotO == 0 && yRotO == 0) { float sd = (float) sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2(yd, (double)sd) * 180 / PI); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, (double)sd) * 180 / PI); } } diff --git a/Minecraft.World/Facing.cpp b/Minecraft.World/Facing.cpp index 9df4187d..33742e92 100644 --- a/Minecraft.World/Facing.cpp +++ b/Minecraft.World/Facing.cpp @@ -20,3 +20,5 @@ const int Facing::STEP_Z[6] = { 0, 0, -1, 1, 0, 0 }; + +const wstring Facing::NAMES[] = {L"DOWN", L"UP", L"NORTH", L"SOUTH", L"WEST", L"EAST"}; \ No newline at end of file diff --git a/Minecraft.World/Facing.h b/Minecraft.World/Facing.h index 1c4cfdf3..b257e4bf 100644 --- a/Minecraft.World/Facing.h +++ b/Minecraft.World/Facing.h @@ -3,15 +3,17 @@ class Facing { public: - static const int DOWN = 0; - static const int UP = 1; - static const int NORTH = 2; - static const int SOUTH = 3; - static const int WEST = 4; - static const int EAST = 5; + static const int DOWN = 0; + static const int UP = 1; + static const int NORTH = 2; + static const int SOUTH = 3; + static const int WEST = 4; + static const int EAST = 5; static const int OPPOSITE_FACING[6]; static const int STEP_X[6]; static const int STEP_Y[6]; static const int STEP_Z[6]; + + static const wstring NAMES[]; }; \ No newline at end of file diff --git a/Minecraft.World/FacingEnum.cpp b/Minecraft.World/FacingEnum.cpp new file mode 100644 index 00000000..cfcb61e0 --- /dev/null +++ b/Minecraft.World/FacingEnum.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" + +#include "FacingEnum.h" + +FacingEnum *FacingEnum::DOWN = new FacingEnum(0, 1, 0, -1, 0); +FacingEnum *FacingEnum::UP = new FacingEnum(1, 0, 0, 1, 0); +FacingEnum *FacingEnum::NORTH = new FacingEnum(2, 3, 0, 0, -1); +FacingEnum *FacingEnum::SOUTH = new FacingEnum(3, 2, 0, 0, 1); +FacingEnum *FacingEnum::EAST = new FacingEnum(4, 5, -1, 0, 0); +FacingEnum *FacingEnum::WEST = new FacingEnum(5, 4, 1, 0, 0); + +FacingEnum *FacingEnum::BY_DATA[6] = {FacingEnum::DOWN,FacingEnum::UP,FacingEnum::NORTH,FacingEnum::SOUTH,FacingEnum::EAST,FacingEnum::WEST}; + +FacingEnum::FacingEnum(int dataValue, int oppositeIndex, int stepX, int stepY, int stepZ) + : dataValue(dataValue), oppositeIndex(oppositeIndex), stepX(stepX), stepY(stepY), stepZ(stepZ) +{ +} + +int FacingEnum::getDataValue() +{ + return dataValue; +} + +FacingEnum *FacingEnum::getOpposite() +{ + return BY_DATA[oppositeIndex]; +} + +int FacingEnum::getStepX() +{ + return stepX; +} + +int FacingEnum::getStepY() +{ + return stepY; +} + +int FacingEnum::getStepZ() +{ + return stepZ; +} + +FacingEnum *FacingEnum::fromData(int data) +{ + return BY_DATA[data % 6]; +} \ No newline at end of file diff --git a/Minecraft.World/FacingEnum.h b/Minecraft.World/FacingEnum.h new file mode 100644 index 00000000..5857956f --- /dev/null +++ b/Minecraft.World/FacingEnum.h @@ -0,0 +1,31 @@ +#pragma once + +class FacingEnum +{ +public: + static FacingEnum *DOWN; + static FacingEnum *UP; + static FacingEnum *NORTH; + static FacingEnum *SOUTH; + static FacingEnum *EAST; + static FacingEnum *WEST; + +private: + const int dataValue; + const int oppositeIndex; + const int stepX; + const int stepY; + const int stepZ; + + static FacingEnum *BY_DATA[6]; + + FacingEnum(int dataValue, int oppositeIndex, int stepX, int stepY, int stepZ); + +public: + int getDataValue(); + FacingEnum *getOpposite(); + int getStepX(); + int getStepY(); + int getStepZ(); + static FacingEnum *fromData(int data); +}; \ No newline at end of file diff --git a/Minecraft.World/FallingTile.cpp b/Minecraft.World/FallingTile.cpp index 254631ff..28248014 100644 --- a/Minecraft.World/FallingTile.cpp +++ b/Minecraft.World/FallingTile.cpp @@ -24,6 +24,7 @@ void FallingTile::_init() hurtEntities = false; fallDamageMax = 40; fallDamageAmount = 2; + tileData = NULL; // 4J Added so that client-side falling tiles can fall through blocks // This fixes a bug on the host where the tile update from the server comes in before the client-side falling tile @@ -62,6 +63,11 @@ FallingTile::FallingTile(Level *level, double x, double y, double z, int tile, i zOld = z; } +FallingTile::~FallingTile() +{ + delete tileData; +} + bool FallingTile::makeStepSound() { return false; @@ -105,7 +111,7 @@ void FallingTile::tick() { if (level->getTile(xt, yt, zt) == tile) { - level->setTile(xt, yt, zt, 0); + level->removeTile(xt, yt, zt); } else { @@ -120,17 +126,36 @@ void FallingTile::tick() zd *= 0.7f; yd *= -0.5f; - // if (HeavyTile.isFree(level, xt, yt, zt)) { if (level->getTile(xt, yt, zt) != Tile::pistonMovingPiece_Id) { remove(); - if (!cancelDrop && level->mayPlace(tile, xt, yt, zt, true, 1, nullptr) && !HeavyTile::isFree(level, xt, yt - 1, zt) && level->setTileAndData(xt, yt, zt, tile, data)) + if (!cancelDrop && level->mayPlace(tile, xt, yt, zt, true, 1, nullptr, nullptr) && !HeavyTile::isFree(level, xt, yt - 1, zt) && level->setTileAndData(xt, yt, zt, tile, data, Tile::UPDATE_ALL)) { HeavyTile *hv = dynamic_cast(Tile::tiles[tile]); if (hv) { hv->onLand(level, xt, yt, zt, data); } + if (tileData != NULL && Tile::tiles[tile]->isEntityTile()) + { + shared_ptr tileEntity = level->getTileEntity(xt, yt, zt); + + if (tileEntity != NULL) + { + CompoundTag *swap = new CompoundTag(); + tileEntity->save(swap); + vector *allTags = tileData->getAllTags(); + for(AUTO_VAR(it, allTags->begin()); it != allTags->end(); ++it) + { + Tag *tag = *it; + if (tag->getName().compare(L"x") == 0 || tag->getName().compare(L"y") == 0 || tag->getName().compare(L"z") == 0) continue; + swap->put(tag->getName(), tag->copy()); + } + delete allTags; + tileEntity->load(swap); + tileEntity->setChanged(); + } + } } else { @@ -140,7 +165,7 @@ void FallingTile::tick() } else if ( (time > 20 * 5 && !level->isClientSide && (yt < 1 || yt > Level::maxBuildHeight)) || (time > 20 * 30)) { - if(dropItem) spawnAtLocation(tile, 1); + if(dropItem) spawnAtLocation( shared_ptr( new ItemInstance(tile, 1, Tile::tiles[tile]->getSpawnResourcesAuxValue(data) )), 0); remove(); } } @@ -153,14 +178,16 @@ void FallingTile::causeFallDamage(float distance) int dmg = Mth::ceil(distance - 1); if (dmg > 0) { - vector > *entities = level->getEntities(shared_from_this(), bb); + // 4J: Copy vector since it might be modified when we hurt the entities (invalidating our iterator) + vector > *entities = new vector >(*level->getEntities(shared_from_this(), bb)); DamageSource *source = tile == Tile::anvil_Id ? DamageSource::anvil : DamageSource::fallingBlock; - //for (Entity entity : entities) - for(AUTO_VAR(it,entities->begin()); it != entities->end(); ++it) + for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) { (*it)->hurt(source, min(Mth::floor(dmg * fallDamageAmount), fallDamageMax)); } + delete entities; + if (tile == Tile::anvil_Id && random->nextFloat() < 0.05f + (dmg * 0.05)) { int damage = data >> 2; @@ -182,17 +209,26 @@ void FallingTile::causeFallDamage(float distance) void FallingTile::addAdditonalSaveData(CompoundTag *tag) { tag->putByte(L"Tile", (byte) tile); + tag->putInt(L"TileID", tile); tag->putByte(L"Data", (byte) data); tag->putByte(L"Time", (byte) time); tag->putBoolean(L"DropItem", dropItem); tag->putBoolean(L"HurtEntities", hurtEntities); tag->putFloat(L"FallHurtAmount", fallDamageAmount); tag->putInt(L"FallHurtMax", fallDamageMax); + if (tileData != NULL) tag->putCompound(L"TileEntityData", tileData); } void FallingTile::readAdditionalSaveData(CompoundTag *tag) { - tile = tag->getByte(L"Tile") & 0xff; + if (tag->contains(L"TileID")) + { + tile = tag->getInt(L"TileID"); + } + else + { + tile = tag->getByte(L"Tile") & 0xff; + } data = tag->getByte(L"Data") & 0xff; time = tag->getByte(L"Time") & 0xff; @@ -212,6 +248,11 @@ void FallingTile::readAdditionalSaveData(CompoundTag *tag) dropItem = tag->getBoolean(L"DropItem"); } + if (tag->contains(L"TileEntityData")) + { + tileData = tag->getCompound(L"TileEntityData"); + } + if (tile == 0) { tile = Tile::sand_Id; diff --git a/Minecraft.World/FallingTile.h b/Minecraft.World/FallingTile.h index eefc9e3b..7ca97416 100644 --- a/Minecraft.World/FallingTile.h +++ b/Minecraft.World/FallingTile.h @@ -25,8 +25,12 @@ private: void _init(); public: + CompoundTag *tileData; + + FallingTile(Level *level); FallingTile(Level *level, double x, double y, double z, int tile, int data = 0); + ~FallingTile(); protected: virtual bool makeStepSound(); diff --git a/Minecraft.World/FarmTile.cpp b/Minecraft.World/FarmTile.cpp index ecfaf44b..6cbe40ac 100644 --- a/Minecraft.World/FarmTile.cpp +++ b/Minecraft.World/FarmTile.cpp @@ -8,18 +8,18 @@ FarmTile::FarmTile(int id) : Tile(id, Material::dirt,isSolidRender()) { - iconWet = NULL; + iconWet = NULL; iconDry = NULL; - setTicking(true); - updateDefaultShape(); - setLightBlock(255); + setTicking(true); + updateDefaultShape(); + setLightBlock(255); } // 4J Added override void FarmTile::updateDefaultShape() { - setShape(0, 0, 0, 1, 15 / 16.0f, 1); + setShape(0, 0, 0, 1, 15 / 16.0f, 1); } AABB *FarmTile::getAABB(Level *level, int x, int y, int z) @@ -39,7 +39,7 @@ bool FarmTile::isCubeShaped() Icon *FarmTile::getTexture(int face, int data) { - if (face == Facing::UP) + if (face == Facing::UP) { if(data > 0) { @@ -50,28 +50,30 @@ Icon *FarmTile::getTexture(int face, int data) return iconDry; } } - return Tile::dirt->getTexture(face); + return Tile::dirt->getTexture(face); } void FarmTile::tick(Level *level, int x, int y, int z, Random *random) { - if (isNearWater(level, x, y, z) || level->isRainingAt(x, y + 1, z)) + if (isNearWater(level, x, y, z) || level->isRainingAt(x, y + 1, z)) { - level->setData(x, y, z, 7); - } else + level->setData(x, y, z, 7, Tile::UPDATE_CLIENTS); + } + else { - int moisture = level->getData(x, y, z); - if (moisture > 0) + int moisture = level->getData(x, y, z); + if (moisture > 0) { - level->setData(x, y, z, moisture - 1); - } else + level->setData(x, y, z, moisture - 1, Tile::UPDATE_CLIENTS); + } + else { - if (!isUnderCrops(level, x, y, z)) + if (!isUnderCrops(level, x, y, z)) { - level->setTile(x, y, z, Tile::dirt_Id); - } - } - } + level->setTileAndUpdate(x, y, z, Tile::dirt_Id); + } + } + } } void FarmTile::fallOn(Level *level, int x, int y, int z, shared_ptr entity, float fallDistance) @@ -80,49 +82,59 @@ void FarmTile::fallOn(Level *level, int x, int y, int z, shared_ptr enti // We should not be setting tiles on the client based on random values! if (!level->isClientSide && level->random->nextFloat() < (fallDistance - .5f)) { - // Fix for #60547 - TU7: Content: Gameplay: Players joining a game can destroy crops even with Trust Players option disabled. - shared_ptr player = dynamic_pointer_cast(entity); - if(player == NULL || player->isAllowedToMine()) level->setTile(x, y, z, Tile::dirt_Id); - } + if(entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(entity); + if(!player->isAllowedToMine()) + { + return; + } + } + else if (!level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) + { + return; + } + level->setTileAndUpdate(x, y, z, Tile::dirt_Id); + } } bool FarmTile::isUnderCrops(Level *level, int x, int y, int z) { - int r = 0; - for (int xx = x - r; xx <= x + r; xx++) - for (int zz = z - r; zz <= z + r; zz++) + int r = 0; + for (int xx = x - r; xx <= x + r; xx++) + for (int zz = z - r; zz <= z + r; zz++) { - int tile = level->getTile(xx, y + 1, zz); - if (tile == Tile::crops_Id || tile == Tile::melonStem_Id || tile == Tile::pumpkinStem_Id || tile == Tile::potatoes_Id || tile == Tile::carrots_Id) + int tile = level->getTile(xx, y + 1, zz); + if (tile == Tile::wheat_Id || tile == Tile::melonStem_Id || tile == Tile::pumpkinStem_Id || tile == Tile::potatoes_Id || tile == Tile::carrots_Id) { - return true; - } - } - return false; + return true; + } + } + return false; } bool FarmTile::isNearWater(Level *level, int x, int y, int z) { - for (int xx = x - 4; xx <= x + 4; xx++) - for (int yy = y; yy <= y + 1; yy++) - for (int zz = z - 4; zz <= z + 4; zz++) + for (int xx = x - 4; xx <= x + 4; xx++) + for (int yy = y; yy <= y + 1; yy++) + for (int zz = z - 4; zz <= z + 4; zz++) { - if (level->getMaterial(xx, yy, zz) == Material::water) + if (level->getMaterial(xx, yy, zz) == Material::water) { - return true; - } - } - return false; + return true; + } + } + return false; } void FarmTile::neighborChanged(Level *level, int x, int y, int z, int type) { - Tile::neighborChanged(level, x, y, z, type); - Material *above = level->getMaterial(x, y + 1, z); - if (above->isSolid()) + Tile::neighborChanged(level, x, y, z, type); + Material *above = level->getMaterial(x, y + 1, z); + if (above->isSolid()) { - level->setTile(x, y, z, Tile::dirt_Id); - } + level->setTileAndUpdate(x, y, z, Tile::dirt_Id); + } } bool FarmTile::blocksLight() diff --git a/Minecraft.World/Feature.cpp b/Minecraft.World/Feature.cpp index 301bd26c..b4d9a6ee 100644 --- a/Minecraft.World/Feature.cpp +++ b/Minecraft.World/Feature.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" #include "Feature.h" @@ -13,6 +14,10 @@ Feature::Feature(bool doUpdate) this->doUpdate = doUpdate; } +void Feature::applyFeature(Level *level, Random *random, int xChunk, int zChunk) +{ +} + void Feature::placeBlock(Level *level, int x, int y, int z, int tile) { placeBlock(level, x, y, z, tile, 0); @@ -22,10 +27,10 @@ void Feature::placeBlock(Level *level, int x, int y, int z, int tile, int data) { if (doUpdate) { - level->setTileAndData(x, y, z, tile, data); + level->setTileAndData(x, y, z, tile, data, Tile::UPDATE_ALL); } else { - level->setTileAndDataNoUpdate(x, y, z, tile, data); + level->setTileAndData(x, y, z, tile, data, Tile::UPDATE_CLIENTS); } -} +} \ No newline at end of file diff --git a/Minecraft.World/Feature.h b/Minecraft.World/Feature.h index 9b89c0a6..84ea5abd 100644 --- a/Minecraft.World/Feature.h +++ b/Minecraft.World/Feature.h @@ -14,6 +14,8 @@ public: virtual bool place(Level *level, Random *random, int x, int y, int z) = 0; virtual bool placeWithIndex(Level *level, Random *random, int x, int y, int z,int iIndex, int iRadius) { return false;} virtual void init(double V1, double V2, double V3) {}; + virtual void applyFeature(Level *level, Random *random, int xChunk, int zChunk); + protected: virtual void placeBlock(Level *level, int x, int y, int z, int tile); virtual void placeBlock(Level *level, int x, int y, int z, int tile, int data); diff --git a/Minecraft.World/FenceGateTile.cpp b/Minecraft.World/FenceGateTile.cpp index 6b0243ed..a8de450e 100644 --- a/Minecraft.World/FenceGateTile.cpp +++ b/Minecraft.World/FenceGateTile.cpp @@ -16,17 +16,17 @@ Icon *FenceGateTile::getTexture(int face, int data) bool FenceGateTile::mayPlace(Level *level, int x, int y, int z) { - if (!level->getMaterial(x, y - 1, z)->isSolid()) return false; - return Tile::mayPlace(level, x, y, z); + if (!level->getMaterial(x, y - 1, z)->isSolid()) return false; + return Tile::mayPlace(level, x, y, z); } AABB *FenceGateTile::getAABB(Level *level, int x, int y, int z) { - int data = level->getData(x, y, z); - if (isOpen(data)) + int data = level->getData(x, y, z); + if (isOpen(data)) { - return NULL; - } + return NULL; + } // 4J Brought forward change from 1.2.3 to fix hit box rotation if (data == Direction::NORTH || data == Direction::SOUTH) { @@ -75,38 +75,39 @@ int FenceGateTile::getRenderShape() return Tile::SHAPE_FENCE_GATE; } -void FenceGateTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void FenceGateTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { - int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3)) % 4; - level->setData(x, y, z, dir); + int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3)) % 4; + level->setData(x, y, z, dir, Tile::UPDATE_CLIENTS); } bool FenceGateTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { - if( soundOnly ) + if (soundOnly) { // 4J - added - just do enough to play the sound level->levelEvent(player, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0); // 4J - changed event to pass player rather than NULL as the source of the event so we can filter the broadcast properly return false; } - int data = level->getData(x, y, z); - if (isOpen(data)) + int data = level->getData(x, y, z); + if (isOpen(data)) { - level->setData(x, y, z, data & ~OPEN_BIT); - } + level->setData(x, y, z, data & ~OPEN_BIT, Tile::UPDATE_CLIENTS); + } else { - // open the door from the player - int dir = (((Mth::floor(player->yRot * 4 / (360) + 0.5)) & 3)) % 4; - int current = getDirection(data); - if (current == ((dir + 2) % 4)) { - data = dir; - } - level->setData(x, y, z, data | OPEN_BIT); - } - level->levelEvent(player, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0); - return true; + // open the door from the player + int dir = (((Mth::floor(player->yRot * 4 / (360) + 0.5)) & 3)) % 4; + int current = getDirection(data); + if (current == ((dir + 2) % 4)) + { + data = dir; + } + level->setData(x, y, z, data | OPEN_BIT, Tile::UPDATE_CLIENTS); + } + level->levelEvent(player, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0); + return true; } void FenceGateTile::neighborChanged(Level *level, int x, int y, int z, int type) @@ -120,12 +121,12 @@ void FenceGateTile::neighborChanged(Level *level, int x, int y, int z, int type) { if (signal && !isOpen(data)) { - level->setData(x, y, z, data | OPEN_BIT); + level->setData(x, y, z, data | OPEN_BIT, Tile::UPDATE_CLIENTS); level->levelEvent(nullptr, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0); } else if (!signal && isOpen(data)) { - level->setData(x, y, z, data & ~OPEN_BIT); + level->setData(x, y, z, data & ~OPEN_BIT, Tile::UPDATE_CLIENTS); level->levelEvent(nullptr, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0); } } diff --git a/Minecraft.World/FenceGateTile.h b/Minecraft.World/FenceGateTile.h index 277fcd4d..125a776d 100644 --- a/Minecraft.World/FenceGateTile.h +++ b/Minecraft.World/FenceGateTile.h @@ -4,23 +4,23 @@ class FenceGateTile : public DirectionalTile { private: - static const int OPEN_BIT = 4; + static const int OPEN_BIT = 4; public: FenceGateTile(int id); - Icon *getTexture(int face, int data); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual AABB *getAABB(Level *level, int x, int y, int z); + Icon *getTexture(int face, int data); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual AABB *getAABB(Level *level, int x, int y, int z); virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param // Brought forward from 1.2.3 - virtual bool blocksLight(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); + virtual bool blocksLight(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); virtual bool isPathfindable(LevelSource *level, int x, int y, int z); virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - virtual int getRenderShape(); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual int getRenderShape(); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param virtual void neighborChanged(Level *level, int x, int y, int z, int type); - static bool isOpen(int data); + static bool isOpen(int data); void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/FenceTile.cpp b/Minecraft.World/FenceTile.cpp index 0d1f9bc4..39f4aac1 100644 --- a/Minecraft.World/FenceTile.cpp +++ b/Minecraft.World/FenceTile.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" +#include "net.minecraft.world.item.h" #include "net.minecraft.world.level.h" -#include "net.minecraft.world.phys.h" #include "net.minecraft.world.h" #include "FenceTile.h" @@ -9,73 +9,89 @@ FenceTile::FenceTile(int id, const wstring &texture, Material *material) : Tile( this->texture = texture; } -AABB *FenceTile::getAABB(Level *level, int x, int y, int z) +void FenceTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { - bool n = connectsTo(level, x, y, z - 1); - bool s = connectsTo(level, x, y, z + 1); - bool w = connectsTo(level, x - 1, y, z); - bool e = connectsTo(level, x + 1, y, z); + bool n = connectsTo(level, x, y, z - 1); + bool s = connectsTo(level, x, y, z + 1); + bool w = connectsTo(level, x - 1, y, z); + bool e = connectsTo(level, x + 1, y, z); - float west = 6.0f / 16.0f; - float east = 10.0f / 16.0f; - float north = 6.0f / 16.0f; - float south = 10.0f / 16.0f; + float west = 6.0f / 16.0f; + float east = 10.0f / 16.0f; + float north = 6.0f / 16.0f; + float south = 10.0f / 16.0f; - if (n) + if (n) { - north = 0; - } - if (s) + north = 0; + } + if (s) { - south = 1; - } - if (w) + south = 1; + } + if (n || s) { - west = 0; - } - if (e) + setShape(west, 0, north, east, 1.5f, south); + Tile::addAABBs(level, x, y, z, box, boxes, source); + } + north = 6.0f / 16.0f; + south = 10.0f / 16.0f; + if (w) { - east = 1; - } + west = 0; + } + if (e) + { + east = 1; + } + if (w || e || (!n && !s)) + { + setShape(west, 0, north, east, 1.5f, south); + Tile::addAABBs(level, x, y, z, box, boxes, source); + } + + if (n) + { + north = 0; + } + if (s) + { + south = 1; + } - return AABB::newTemp(x + west, y, z + north, x + east, y + 1.5f, z + south); + setShape(west, 0, north, east, 1.0f, south); } void FenceTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - bool n = connectsTo(level, x, y, z - 1); - bool s = connectsTo(level, x, y, z + 1); - bool w = connectsTo(level, x - 1, y, z); - bool e = connectsTo(level, x + 1, y, z); + bool n = connectsTo(level, x, y, z - 1); + bool s = connectsTo(level, x, y, z + 1); + bool w = connectsTo(level, x - 1, y, z); + bool e = connectsTo(level, x + 1, y, z); - float west = 6.0f / 16.0f; - float east = 10.0f / 16.0f; - float north = 6.0f / 16.0f; - float south = 10.0f / 16.0f; + float west = 6.0f / 16.0f; + float east = 10.0f / 16.0f; + float north = 6.0f / 16.0f; + float south = 10.0f / 16.0f; - if (n) + if (n) { - north = 0; - } - if (s) + north = 0; + } + if (s) { - south = 1; - } - if (w) + south = 1; + } + if (w) { - west = 0; - } - if (e) + west = 0; + } + if (e) { - east = 1; - } + east = 1; + } - setShape(west, 0, north, east, 1.0f, south); -} - -bool FenceTile::blocksLight() -{ - return false; + setShape(west, 0, north, east, 1.0f, south); } bool FenceTile::isSolidRender(bool isServerLevel) @@ -100,20 +116,20 @@ int FenceTile::getRenderShape() bool FenceTile::connectsTo(LevelSource *level, int x, int y, int z) { - int tile = level->getTile(x, y, z); - if (tile == id || tile == Tile::fenceGate_Id) + int tile = level->getTile(x, y, z); + if (tile == id || tile == Tile::fenceGate_Id) { - return true; - } - Tile *tileInstance = Tile::tiles[tile]; - if (tileInstance != NULL) + return true; + } + Tile *tileInstance = Tile::tiles[tile]; + if (tileInstance != NULL) { - if (tileInstance->material->isSolidBlocking() && tileInstance->isCubeShaped()) + if (tileInstance->material->isSolidBlocking() && tileInstance->isCubeShaped()) { - return tileInstance->material != Material::vegetable; - } - } - return false; + return tileInstance->material != Material::vegetable; + } + } + return false; } bool FenceTile::isFence(int tile) @@ -129,4 +145,14 @@ void FenceTile::registerIcons(IconRegister *iconRegister) bool FenceTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { return true; +} + +bool FenceTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +{ + if (level->isClientSide) return true; + if (LeashItem::bindPlayerMobs(player, level, x, y, z)) + { + return true; + } + return false; } \ No newline at end of file diff --git a/Minecraft.World/FenceTile.h b/Minecraft.World/FenceTile.h index 5b61fca4..ca22163a 100644 --- a/Minecraft.World/FenceTile.h +++ b/Minecraft.World/FenceTile.h @@ -9,15 +9,15 @@ private: public: FenceTile(int id, const wstring &texture, Material *material); - virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - virtual bool blocksLight(); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); virtual bool isPathfindable(LevelSource *level, int x, int y, int z); virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); virtual int getRenderShape(); - bool connectsTo(LevelSource *level, int x, int y, int z); + virtual bool connectsTo(LevelSource *level, int x, int y, int z); static bool isFence(int tile); - void registerIcons(IconRegister *iconRegister); + virtual void registerIcons(IconRegister *iconRegister); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); }; \ No newline at end of file diff --git a/Minecraft.World/File.cpp b/Minecraft.World/File.cpp index 1d66bfeb..21bc3021 100644 --- a/Minecraft.World/File.cpp +++ b/Minecraft.World/File.cpp @@ -37,7 +37,7 @@ File::File( const wstring& pathname ) //: parent( NULL ) m_abstractPathName = pathname; #ifdef _WINDOWS64 - string path = wstringtofilename(m_abstractPathName); + string path = wstringtochararray(m_abstractPathName); string finalPath = StorageManager.GetMountedPath(path.c_str()); if(finalPath.size() == 0) finalPath = path; m_abstractPathName = convStringToWstring(finalPath); diff --git a/Minecraft.World/FileHeader.cpp b/Minecraft.World/FileHeader.cpp index 59e97d9b..35f7b02d 100644 --- a/Minecraft.World/FileHeader.cpp +++ b/Minecraft.World/FileHeader.cpp @@ -217,6 +217,7 @@ void FileHeader::ReadHeader( LPVOID saveMem, ESavePlatform plat /*= SAVE_FILE_PL // : Bumped it to 6 for PS3 v1 to update map data mappings to use larger PlayerUID // : Bumped it to 7 for Durango v1 to update map data mappings to use string based PlayerUID // : Bumped it to 8 for Durango v1 when to save the chunks in a different compressed format + case SAVE_FILE_VERSION_CHUNK_INHABITED_TIME: case SAVE_FILE_VERSION_COMPRESSED_CHUNK_STORAGE: case SAVE_FILE_VERSION_DURANGO_CHANGE_MAP_DATA_MAPPING_SIZE: case SAVE_FILE_VERSION_CHANGE_MAP_DATA_MAPPING_SIZE: diff --git a/Minecraft.World/FileHeader.h b/Minecraft.World/FileHeader.h index 203ec322..4444409f 100644 --- a/Minecraft.World/FileHeader.h +++ b/Minecraft.World/FileHeader.h @@ -36,6 +36,12 @@ enum ESaveVersions // This is the version at which we changed the chunk format to directly save the compressed storage formats SAVE_FILE_VERSION_COMPRESSED_CHUNK_STORAGE, + // This is the version at which we added inhabited time to chunk (1.6.4) + SAVE_FILE_VERSION_CHUNK_INHABITED_TIME, + + + // 4J Stu - If you add a new version here, the save conversion tool will also need updated to be able to read this new format + SAVE_FILE_VERSION_NEXT, }; diff --git a/Minecraft.World/FireChargeItem.cpp b/Minecraft.World/FireChargeItem.cpp index c4e47b0c..7a865ff5 100644 --- a/Minecraft.World/FireChargeItem.cpp +++ b/Minecraft.World/FireChargeItem.cpp @@ -13,7 +13,7 @@ FireChargeItem::FireChargeItem(int id) : Item(id) m_dragonFireballIcon = NULL; } -bool FireChargeItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool FireChargeItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { if (level->isClientSide) { @@ -27,7 +27,7 @@ bool FireChargeItem::useOn(shared_ptr itemInstance, shared_ptrmayBuild(x, y, z)) + if (!player->mayUseItemAt(x, y, z, face, instance)) { return false; } @@ -42,13 +42,13 @@ bool FireChargeItem::useOn(shared_ptr itemInstance, shared_ptrplaySound( x + 0.5, y + 0.5, z + 0.5,eSoundType_FIRE_IGNITE, 1, random->nextFloat() * 0.4f + 0.8f); - level->setTile(x, y, z, Tile::fire_Id); + level->playSound( x + 0.5, y + 0.5, z + 0.5,eSoundType_FIRE_NEWIGNITE, 1, random->nextFloat() * 0.4f + 0.8f); + level->setTileAndUpdate(x, y, z, Tile::fire_Id); } if (!player->abilities.instabuild) { - itemInstance->count--; + instance->count--; } return true; } diff --git a/Minecraft.World/FireTile.cpp b/Minecraft.World/FireTile.cpp index 60f062db..dfb4b961 100644 --- a/Minecraft.World/FireTile.cpp +++ b/Minecraft.World/FireTile.cpp @@ -50,8 +50,10 @@ void FireTile::init() setFlammable(Tile::bookshelf_Id, FLAME_EASY, BURN_MEDIUM); setFlammable(Tile::tnt_Id, FLAME_MEDIUM, BURN_INSTANT); setFlammable(Tile::tallgrass_Id, FLAME_INSTANT, BURN_INSTANT); - setFlammable(Tile::cloth_Id, FLAME_EASY, BURN_EASY); + setFlammable(Tile::wool_Id, FLAME_EASY, BURN_EASY); setFlammable(Tile::vine_Id, FLAME_MEDIUM, BURN_INSTANT); + setFlammable(Tile::coalBlock_Id, FLAME_HARD, BURN_HARD); + setFlammable(Tile::hayBlock_Id, FLAME_INSTANT, BURN_MEDIUM); } void FireTile::setFlammable(int id, int flame, int burn) @@ -90,13 +92,18 @@ int FireTile::getResourceCount(Random *random) return 0; } -int FireTile::getTickDelay() +int FireTile::getTickDelay(Level *level) { return 30; } void FireTile::tick(Level *level, int x, int y, int z, Random *random) { + if (!level->getGameRules()->getBoolean(GameRules::RULE_DOFIRETICK)) + { + return; + } + // 4J added - we don't want fire to do anything that might create new fire, or destroy this fire, if we aren't actually tracking (for network) the chunk this is in in the player // chunk map. If we did change something in that case, then the change wouldn't get sent to any player that had already received that full chunk, and so we'd just become desynchronised. // Seems safest just to do an addToTickNextTick here instead with a decent delay, to make sure that we will get ticked again in the future, when we might again be in a chunk @@ -105,13 +112,13 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) { if( !MinecraftServer::getInstance()->getPlayers()->isTrackingTile(x, y, z, level->dimension->id) ) { - level->addToTickNextTick(x, y, z, id, getTickDelay() * 5); + level->addToTickNextTick(x, y, z, id, getTickDelay(level) * 5); return; } } - bool infiniBurn = level->getTile(x, y - 1, z) == Tile::hellRock_Id; + bool infiniBurn = level->getTile(x, y - 1, z) == Tile::netherRack_Id; if (level->dimension->id == 1) // 4J - was == instanceof TheEndDimension { if (level->getTile(x, y - 1, z) == Tile::unbreakable_Id) infiniBurn = true; @@ -119,14 +126,14 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) if (!mayPlace(level, x, y, z)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } if (!infiniBurn && level->isRaining()) { if (level->isRainingAt(x, y, z) || level->isRainingAt(x - 1, y, z) || level->isRainingAt(x + 1, y, z) || level->isRainingAt(x, y, z - 1) || level->isRainingAt(x, y, z + 1)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } } @@ -134,13 +141,13 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) int age = level->getData(x, y, z); if (age < 15) { - level->setDataNoUpdate(x, y, z, age + random->nextInt(3) / 2); + level->setData(x, y, z, age + random->nextInt(3) / 2, Tile::UPDATE_NONE); } - level->addToTickNextTick(x, y, z, id, getTickDelay() + random->nextInt(10)); + level->addToTickNextTick(x, y, z, id, getTickDelay(level) + random->nextInt(10)); if (!infiniBurn && !isValidFireLocation(level, x, y, z)) { - if (!level->isTopSolidBlocking(x, y - 1, z) || age > 3) level->setTile(x, y, z, 0); + if (!level->isTopSolidBlocking(x, y - 1, z) || age > 3) level->removeTile(x, y, z); return; } @@ -148,7 +155,7 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) { if (age == 15 && random->nextInt(4) == 0) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } } @@ -183,23 +190,18 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) int fodds = getFireOdds(level, xx, yy, zz); if (fodds > 0) { - int odds = (fodds + 40) / (age + 30); + int odds = (fodds + 40 + (level->difficulty * 7)) / (age + 30); if (isHumid) { odds /= 2; } if (odds > 0 && random->nextInt(rate) <= odds) { - if ((level->isRaining() && level->isRainingAt(xx, yy, zz)) || level->isRainingAt(xx - 1, yy, z) || level->isRainingAt(xx + 1, yy, zz) || level->isRainingAt(xx, yy, zz - 1) - || level->isRainingAt(xx, yy, zz + 1)) + if (!(level->isRaining() && level->isRainingAt(xx, yy, zz) || level->isRainingAt(xx - 1, yy, z) || level->isRainingAt(xx + 1, yy, zz) || level->isRainingAt(xx, yy, zz - 1) || level->isRainingAt(xx, yy, zz + 1))) { - // DO NOTHING, rain! - - } else { int tAge = age + random->nextInt(5) / 4; if (tAge > 15) tAge = 15; - level->setTileAndData(xx, yy, zz, this->id, tAge); - + level->setTileAndData(xx, yy, zz, id, tAge, Tile::UPDATE_ALL); } } } @@ -209,6 +211,11 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) } } +bool FireTile::canInstantlyTick() +{ + return false; +} + void FireTile::checkBurnOut(Level *level, int x, int y, int z, int chance, Random *random, int age) { int odds = burnOdds[level->getTile(x, y, z)]; @@ -219,10 +226,10 @@ void FireTile::checkBurnOut(Level *level, int x, int y, int z, int chance, Rando { int tAge = age + random->nextInt(5) / 4; if (tAge > 15) tAge = 15; - level->setTileAndData(x, y, z, this->id, tAge); + level->setTileAndData(x, y, z, id, tAge, Tile::UPDATE_ALL); } else { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } if (wasTnt) { @@ -284,7 +291,7 @@ void FireTile::neighborChanged(Level *level, int x, int y, int z, int type) { if (!level->isTopSolidBlocking(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } } @@ -300,10 +307,10 @@ void FireTile::onPlace(Level *level, int x, int y, int z) } if (!level->isTopSolidBlocking(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } - level->addToTickNextTick(x, y, z, id, getTickDelay() + level->random->nextInt(10)); + level->addToTickNextTick(x, y, z, id, getTickDelay(level) + level->random->nextInt(10)); } bool FireTile::isFlammable(int tile) @@ -315,7 +322,7 @@ void FireTile::animateTick(Level *level, int x, int y, int z, Random *random) { if (random->nextInt(24) == 0) { - level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f,eSoundType_FIRE_FIRE, 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f); + level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f,eSoundType_FIRE_FIRE, 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f, false); } if (level->isTopSolidBlocking(x, y - 1, z) || Tile::fire->canBurn(level, x, y - 1, z)) diff --git a/Minecraft.World/FireTile.h b/Minecraft.World/FireTile.h index af079a6a..1d823752 100644 --- a/Minecraft.World/FireTile.h +++ b/Minecraft.World/FireTile.h @@ -13,19 +13,19 @@ public: static const wstring TEXTURE_SECOND; static const int FLAME_INSTANT = 60; - static const int FLAME_EASY = 30; - static const int FLAME_MEDIUM = 15; - static const int FLAME_HARD = 5; - - static const int BURN_INSTANT = 100; - static const int BURN_EASY = 60; - static const int BURN_MEDIUM = 20; - static const int BURN_HARD = 5; - static const int BURN_NEVER = 0; + static const int FLAME_EASY = 30; + static const int FLAME_MEDIUM = 15; + static const int FLAME_HARD = 5; + + static const int BURN_INSTANT = 100; + static const int BURN_EASY = 60; + static const int BURN_MEDIUM = 20; + static const int BURN_HARD = 5; + static const int BURN_NEVER = 0; private: - int *flameOdds; - int *burnOdds; + int *flameOdds; + int *burnOdds; Icon **icons; protected: FireTile(int id); @@ -36,17 +36,19 @@ private: void setFlammable(int id, int flame, int burn); public: virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual bool blocksLight(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual int getRenderShape(); - virtual int getResourceCount(Random *random); - virtual int getTickDelay(); - virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual bool blocksLight(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual int getRenderShape(); + virtual int getResourceCount(Random *random); + virtual int getTickDelay(Level *level); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual bool canInstantlyTick(); + private: void checkBurnOut(Level *level, int x, int y, int z, int chance, Random *random, int age); - bool isValidFireLocation(Level *level, int x, int y, int z); - int getFireOdds(Level *level, int x, int y, int z); + bool isValidFireLocation(Level *level, int x, int y, int z); + int getFireOdds(Level *level, int x, int y, int z); public: virtual bool mayPick(); bool canBurn(LevelSource *level, int x, int y, int z); diff --git a/Minecraft.World/Fireball.cpp b/Minecraft.World/Fireball.cpp index 46be68f7..1d9fbdda 100644 --- a/Minecraft.World/Fireball.cpp +++ b/Minecraft.World/Fireball.cpp @@ -63,8 +63,8 @@ Fireball::Fireball(Level *level, double x, double y, double z, double xa, double setSize(16 / 16.0f, 16 / 16.0f); - this->moveTo(x, y, z, yRot, xRot); - this->setPos(x, y, z); + moveTo(x, y, z, yRot, xRot); + setPos(x, y, z); double dd = sqrt(xa * xa + ya * ya + za * za); @@ -84,7 +84,7 @@ Fireball::Fireball(Level *level, double x, double y, double z, double xa, double } } -Fireball::Fireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Entity ( level ) +Fireball::Fireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Entity ( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called @@ -92,13 +92,13 @@ Fireball::Fireball(Level *level, shared_ptr mob, double xa, double ya, doub _init(); - this->owner = mob; + owner = mob; setSize(16 / 16.0f, 16 / 16.0f); - this->moveTo(mob->x, mob->y, mob->z, mob->yRot, mob->xRot); - this->setPos(x, y, z); - this->heightOffset = 0; + moveTo(mob->x, mob->y, mob->z, mob->yRot, mob->xRot); + setPos(x, y, z); + heightOffset = 0; xd = yd = zd = 0.0; @@ -198,7 +198,7 @@ void Fireball::tick() to = Vec3::newTemp(res->pos->x, res->pos->y, res->pos->z); } shared_ptr hitEntity = nullptr; - vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); + vector > *objects = level->getEntities(shared_from_this(), bb->expand(xd, yd, zd)->grow(1, 1, 1)); double nearest = 0; AUTO_VAR(itEnd, objects->end()); for (AUTO_VAR(it, objects->begin()); it != itEnd; it++) @@ -239,8 +239,8 @@ void Fireball::tick() z += zd; double sd = sqrt(xd * xd + zd * zd); - yRot = (float) (atan2(xd, zd) * 180 / PI); - xRot = (float) (atan2(yd, sd) * 180 / PI); + yRot = (float) (atan2(zd, xd) * 180 / PI) + 90; + xRot = (float) (atan2(sd, yd) * 180 / PI) - 90; while (xRot - xRotO < -180) xRotO -= 360; @@ -256,7 +256,7 @@ void Fireball::tick() yRot = yRotO + (yRot - yRotO) * 0.2f; - float inertia = 0.95f; + float inertia = getInertia(); if (isInWater()) { for (int i = 0; i < 4; i++) @@ -292,37 +292,19 @@ void Fireball::tick() setPos(x, y, z); } -void Fireball::onHit(HitResult *res) +float Fireball::getInertia() { - if (!level->isClientSide) - { - if (res->entity != NULL) - { - DamageSource *damageSource = DamageSource::fireball(dynamic_pointer_cast( shared_from_this() ), owner); - if (res->entity->hurt(damageSource, 6)) - { - } - else - { - } - delete damageSource; - } - - bool destroyBlocks = true;//level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); - level->explode(nullptr, x, y, z, 1, true, destroyBlocks); - - remove(); - } + return 0.95f; } void Fireball::addAdditonalSaveData(CompoundTag *tag) { - tag->putShort(L"xTile", (short) xTile); + tag->putShort(L"xTile", (short) xTile); tag->putShort(L"yTile", (short) yTile); tag->putShort(L"zTile", (short) zTile); tag->putByte(L"inTile", (byte) lastTile); tag->putByte(L"inGround", (byte) (inGround ? 1 : 0)); - tag->put(L"direction", this->newDoubleList(3, this->xd, this->yd, this->zd)); + tag->put(L"direction", newDoubleList(3, xd, yd, zd)); } void Fireball::readAdditionalSaveData(CompoundTag *tag) @@ -338,13 +320,13 @@ void Fireball::readAdditionalSaveData(CompoundTag *tag) if (tag->contains(L"direction")) { ListTag *listTag = (ListTag *)tag->getList(L"direction"); - this->xd = ((DoubleTag *) listTag->get(0))->data; - this->yd = ((DoubleTag *) listTag->get(1))->data; - this->zd = ((DoubleTag *) listTag->get(2))->data; + xd = ((DoubleTag *) listTag->get(0))->data; + yd = ((DoubleTag *) listTag->get(1))->data; + zd = ((DoubleTag *) listTag->get(2))->data; } else { - this->remove(); + remove(); } } @@ -358,8 +340,9 @@ float Fireball::getPickRadius() return 1; } -bool Fireball::hurt(DamageSource *source, int damage) +bool Fireball::hurt(DamageSource *source, float damage) { + if (isInvulnerable()) return false; markHurt(); if (source->getEntity() != NULL) @@ -374,10 +357,9 @@ bool Fireball::hurt(DamageSource *source, int damage) yPower = yd * 0.1; zPower = zd * 0.1; } - shared_ptr mob = dynamic_pointer_cast( source->getEntity() ); - if (mob != NULL) + if ( source->getEntity()->instanceof(eTYPE_LIVINGENTITY) ) { - owner = mob; + owner = dynamic_pointer_cast( source->getEntity() ); } return true; } @@ -399,17 +381,12 @@ int Fireball::getLightColor(float a) return 15 << 20 | 15 << 4; } -bool Fireball::shouldBurn() -{ - return true; -} - -int Fireball::getIcon() +ePARTICLE_TYPE Fireball::getTrailParticleType() { - return 14 + 2 * 16; + return eParticleType_smoke; } -ePARTICLE_TYPE Fireball::getTrailParticleType() +bool Fireball::shouldBurn() { - return eParticleType_smoke; + return true; } \ No newline at end of file diff --git a/Minecraft.World/Fireball.h b/Minecraft.World/Fireball.h index c9471625..0f902099 100644 --- a/Minecraft.World/Fireball.h +++ b/Minecraft.World/Fireball.h @@ -10,7 +10,6 @@ class Fireball : public Entity { public: eINSTANCEOF GetType() { return eTYPE_FIREBALL; } - static Entity *create(Level *level) { return new Fireball(level); } private: int xTile; @@ -22,7 +21,7 @@ private: bool inGround; public: - shared_ptr owner; + shared_ptr owner; private: int life; @@ -43,31 +42,30 @@ public: virtual bool shouldRenderAtSqrDistance(double distance); Fireball(Level *level, double x, double y, double z, double xa, double ya, double za); - Fireball(Level *level, shared_ptr mob, double xa, double ya, double za); + Fireball(Level *level, shared_ptr mob, double xa, double ya, double za); public: virtual void tick(); protected: - virtual void onHit(HitResult *res); + virtual float getInertia(); + virtual void onHit(HitResult *res) = 0; public: virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); virtual bool isPickable(); virtual float getPickRadius(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); virtual float getShadowHeightOffs(); virtual float getBrightness(float a); virtual int getLightColor(float a); - // 4J Added TU9 - virtual bool shouldBurn(); - virtual int getIcon(); - protected: // 4J Added TU9 virtual ePARTICLE_TYPE getTrailParticleType(); + + virtual bool shouldBurn(); }; diff --git a/Minecraft.World/FireworksChargeItem.cpp b/Minecraft.World/FireworksChargeItem.cpp new file mode 100644 index 00000000..2de2be04 --- /dev/null +++ b/Minecraft.World/FireworksChargeItem.cpp @@ -0,0 +1,211 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.h" +#include "FireworksChargeItem.h" + +FireworksChargeItem::FireworksChargeItem(int id) : Item(id) +{ +} + +Icon *FireworksChargeItem::getLayerIcon(int auxValue, int spriteLayer) +{ + if (spriteLayer > 0) + { + return overlay; + } + return Item::getLayerIcon(auxValue, spriteLayer); +} + +int FireworksChargeItem::getColor(shared_ptr item, int spriteLayer) +{ + if (spriteLayer == 1) + { + Tag *colorTag = getExplosionTagField(item, FireworksItem::TAG_E_COLORS); + if (colorTag != NULL) + { + IntArrayTag *colors = (IntArrayTag *) colorTag; + if (colors->data.length == 1) + { + return colors->data[0]; + } + int totalRed = 0; + int totalGreen = 0; + int totalBlue = 0; + for (unsigned int i = 0; i < colors->data.length; ++i) + { + int c = colors->data[i]; + totalRed += (c & 0xff0000) >> 16; + totalGreen += (c & 0x00ff00) >> 8; + totalBlue += (c & 0x0000ff) >> 0; + } + totalRed /= colors->data.length; + totalGreen /= colors->data.length; + totalBlue /= colors->data.length; + return (totalRed << 16) | (totalGreen << 8) | totalBlue; + } + return 0x8a8a8a; + } + return Item::getColor(item, spriteLayer); +} + +bool FireworksChargeItem::hasMultipleSpriteLayers() +{ + return true; +} + +Tag *FireworksChargeItem::getExplosionTagField(shared_ptr instance, const wstring &field) +{ + if (instance->hasTag()) + { + CompoundTag *explosion = instance->getTag()->getCompound(FireworksItem::TAG_EXPLOSION); + if (explosion != NULL) + { + return explosion->get(field); + } + } + return NULL; +} + +void FireworksChargeItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced) +{ + if (itemInstance->hasTag()) + { + CompoundTag *explosion = itemInstance->getTag()->getCompound(FireworksItem::TAG_EXPLOSION); + if (explosion != NULL) + { + appendHoverText(explosion, lines); + } + } +} + +const unsigned int FIREWORKS_CHARGE_TYPE_NAME[] = +{ + IDS_FIREWORKS_CHARGE_TYPE_0, + IDS_FIREWORKS_CHARGE_TYPE_1, + IDS_FIREWORKS_CHARGE_TYPE_2, + IDS_FIREWORKS_CHARGE_TYPE_3, + IDS_FIREWORKS_CHARGE_TYPE_4 +}; + +const unsigned int FIREWORKS_CHARGE_COLOUR_NAME[] = +{ + IDS_FIREWORKS_CHARGE_BLACK, + IDS_FIREWORKS_CHARGE_RED, + IDS_FIREWORKS_CHARGE_GREEN, + IDS_FIREWORKS_CHARGE_BROWN, + IDS_FIREWORKS_CHARGE_BLUE, + IDS_FIREWORKS_CHARGE_PURPLE, + IDS_FIREWORKS_CHARGE_CYAN, + IDS_FIREWORKS_CHARGE_SILVER, + IDS_FIREWORKS_CHARGE_GRAY, + IDS_FIREWORKS_CHARGE_PINK, + IDS_FIREWORKS_CHARGE_LIME, + IDS_FIREWORKS_CHARGE_YELLOW, + IDS_FIREWORKS_CHARGE_LIGHT_BLUE, + IDS_FIREWORKS_CHARGE_MAGENTA, + IDS_FIREWORKS_CHARGE_ORANGE, + IDS_FIREWORKS_CHARGE_WHITE +}; + +void FireworksChargeItem::appendHoverText(CompoundTag *expTag, vector *lines) +{ + // shape + byte type = expTag->getByte(FireworksItem::TAG_E_TYPE); + if (type >= FireworksItem::TYPE_MIN && type <= FireworksItem::TYPE_MAX) + { + lines->push_back(HtmlString(app.GetString(FIREWORKS_CHARGE_TYPE_NAME[type]))); + } + else + { + lines->push_back(HtmlString(app.GetString(IDS_FIREWORKS_CHARGE_TYPE))); + } + + // colors + intArray colorList = expTag->getIntArray(FireworksItem::TAG_E_COLORS); + if (colorList.length > 0) + { + + bool first = true; + wstring output = L""; + for (unsigned int i = 0; i < colorList.length; ++i) + { + int c = colorList[i]; + if (!first) + { + output += L",\n"; // 4J-PB - without the newline, they tend to go offscreen in split-screen or localised languages + } + first = false; + + // find color name by lookup + bool found = false; + for (int dc = 0; dc < 16; dc++) + { + if (c == DyePowderItem::COLOR_RGB[dc]) + { + found = true; + output += app.GetString(FIREWORKS_CHARGE_COLOUR_NAME[dc]); + break; + } + } + if (!found) + { + output += app.GetString(IDS_FIREWORKS_CHARGE_CUSTOM); + } + } + lines->push_back(output); + } + + // has fade? + intArray fadeList = expTag->getIntArray(FireworksItem::TAG_E_FADECOLORS); + if (fadeList.length > 0) + { + bool first = true; + wstring output = wstring(app.GetString(IDS_FIREWORKS_CHARGE_FADE_TO)) + L" "; + for (unsigned int i = 0; i < fadeList.length; ++i) + { + int c = fadeList[i]; + if (!first) + { + output += L",\n";// 4J-PB - without the newline, they tend to go offscreen in split-screen or localised languages + } + first = false; + + // find color name by lookup + bool found = false; + for (int dc = 0; dc < 16; dc++) + { + if (c == DyePowderItem::COLOR_RGB[dc]) + { + found = true; + output += app.GetString(FIREWORKS_CHARGE_COLOUR_NAME[dc]); + break; + } + } + if (!found) + { + output += app.GetString(IDS_FIREWORKS_CHARGE_CUSTOM); + } + } + lines->push_back(output); + } + + // has trail + bool trail = expTag->getBoolean(FireworksItem::TAG_E_TRAIL); + if (trail) + { + lines->push_back(HtmlString(app.GetString(IDS_FIREWORKS_CHARGE_TRAIL))); + } + + // has flicker + bool flicker = expTag->getBoolean(FireworksItem::TAG_E_FLICKER); + if (flicker) + { + lines->push_back(HtmlString(app.GetString(IDS_FIREWORKS_CHARGE_FLICKER))); + } +} + +void FireworksChargeItem::registerIcons(IconRegister *iconRegister) +{ + Item::registerIcons(iconRegister); + overlay = iconRegister->registerIcon(getIconName() + L"_overlay"); +} \ No newline at end of file diff --git a/Minecraft.World/FireworksChargeItem.h b/Minecraft.World/FireworksChargeItem.h new file mode 100644 index 00000000..bfdca8ac --- /dev/null +++ b/Minecraft.World/FireworksChargeItem.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Item.h" + +class FireworksChargeItem : public Item +{ +private: + Icon *overlay; + +public: + FireworksChargeItem(int id); + + virtual Icon *getLayerIcon(int auxValue, int spriteLayer); + virtual int getColor(shared_ptr item, int spriteLayer); + virtual bool hasMultipleSpriteLayers(); + + static Tag *getExplosionTagField(shared_ptr instance, const wstring &field); + + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced); + + static void appendHoverText(CompoundTag *expTag, vector *lines); + + virtual void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/FireworksItem.cpp b/Minecraft.World/FireworksItem.cpp new file mode 100644 index 00000000..045ea130 --- /dev/null +++ b/Minecraft.World/FireworksItem.cpp @@ -0,0 +1,81 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.projectile.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "FireworksItem.h" + +const wstring FireworksItem::TAG_FIREWORKS = L"Fireworks"; +const wstring FireworksItem::TAG_EXPLOSION = L"Explosion"; +const wstring FireworksItem::TAG_EXPLOSIONS = L"Explosions"; +const wstring FireworksItem::TAG_FLIGHT = L"Flight"; +const wstring FireworksItem::TAG_E_TYPE = L"Type"; +const wstring FireworksItem::TAG_E_TRAIL = L"Trail"; +const wstring FireworksItem::TAG_E_FLICKER = L"Flicker"; +const wstring FireworksItem::TAG_E_COLORS = L"Colors"; +const wstring FireworksItem::TAG_E_FADECOLORS = L"FadeColors"; + +FireworksItem::FireworksItem(int id) : Item(id) +{ +} + +bool FireworksItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +{ + // 4J-JEV: Fix for xb1 #173493 - CU7: Content: UI: Missing tooltip for Firework Rocket. + if (bTestUseOnOnly) return true; + + if (!level->isClientSide) + { + shared_ptr f = shared_ptr( new FireworksRocketEntity(level, x + clickX, y + clickY, z + clickZ, instance) ); + level->addEntity(f); + + if (!player->abilities.instabuild) + { + instance->count--; + } + return true; + } + + return false; +} + +void FireworksItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced) +{ + if (!itemInstance->hasTag()) + { + return; + } + CompoundTag *fireTag = itemInstance->getTag()->getCompound(TAG_FIREWORKS); + if (fireTag == NULL) + { + return; + } + if (fireTag->contains(TAG_FLIGHT)) + { + lines->push_back(wstring(app.GetString(IDS_ITEM_FIREWORKS_FLIGHT)) + L" " + _toString((fireTag->getByte(TAG_FLIGHT)))); + } + + ListTag *explosions = (ListTag *) fireTag->getList(TAG_EXPLOSIONS); + if (explosions != NULL && explosions->size() > 0) + { + + for (int i = 0; i < explosions->size(); i++) + { + CompoundTag *expTag = explosions->get(i); + + vector eLines; + FireworksChargeItem::appendHoverText(expTag, &eLines); + + if (eLines.size() > 0) + { + // Indent lines after first line + for (int i = 1; i < eLines.size(); i++) + { + eLines[i].indent = true; + } + + lines->insert(lines->end(), eLines.begin(), eLines.end()); + } + } + } +} \ No newline at end of file diff --git a/Minecraft.World/FireworksItem.h b/Minecraft.World/FireworksItem.h new file mode 100644 index 00000000..afc6cb59 --- /dev/null +++ b/Minecraft.World/FireworksItem.h @@ -0,0 +1,31 @@ +#pragma once + +#include "Item.h" + +class FireworksItem : public Item +{ +public: + static const wstring TAG_FIREWORKS; + static const wstring TAG_EXPLOSION; + static const wstring TAG_EXPLOSIONS; + static const wstring TAG_FLIGHT; + static const wstring TAG_E_TYPE; + static const wstring TAG_E_TRAIL; + static const wstring TAG_E_FLICKER; + static const wstring TAG_E_COLORS; + static const wstring TAG_E_FADECOLORS; + + static const byte TYPE_SMALL = 0; + static const byte TYPE_BIG = 1; + static const byte TYPE_STAR = 2; + static const byte TYPE_CREEPER = 3; + static const byte TYPE_BURST = 4; + + static const byte TYPE_MIN = TYPE_SMALL; + static const byte TYPE_MAX = TYPE_BURST; + + FireworksItem(int id); + + bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced); +}; \ No newline at end of file diff --git a/Minecraft.World/FireworksMenu.cpp b/Minecraft.World/FireworksMenu.cpp new file mode 100644 index 00000000..68c9e0f2 --- /dev/null +++ b/Minecraft.World/FireworksMenu.cpp @@ -0,0 +1,150 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.item.crafting.h" +#include "CraftingContainer.h" +#include "ResultContainer.h" +#include "ResultSlot.h" +#include "FireworksMenu.h" + +FireworksMenu::FireworksMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt) : AbstractContainerMenu() +{ + m_canMakeFireworks = false; + m_canMakeCharge = false; + m_canMakeFade = false; + + craftSlots = shared_ptr( new CraftingContainer(this, 3, 3) ); + resultSlots = shared_ptr( new ResultContainer() ); + + this->level = level; + x = xt; + y = yt; + z = zt; + addSlot(new ResultSlot( inventory->player, craftSlots, resultSlots, 0, 120 + 4, 31 + 4)); + + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 3; x++) + { + addSlot(new Slot(craftSlots, x + y * 3, 30 + x * 18, 17 + y * 18)); + } + } + + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x + y * 9 + 9, 8 + x * 18, 84 + y * 18)); + } + } + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x, 8 + x * 18, 142)); + } + + slotsChanged(); // 4J - removed craftSlots parameter, see comment below +} + +void FireworksMenu::slotsChanged() // 4J used to take a shared_ptr but wasn't using it, so removed to simplify things +{ + FireworksRecipe::updatePossibleRecipes(craftSlots, &m_canMakeFireworks, &m_canMakeCharge, &m_canMakeFade); + resultSlots->setItem(0, Recipes::getInstance()->getItemFor(craftSlots, level, Recipes::pFireworksRecipes)); +} + +void FireworksMenu::removed(shared_ptr player) +{ + AbstractContainerMenu::removed(player); + if (level->isClientSide) return; + + for (int i = 0; i < 9; i++) + { + shared_ptr item = craftSlots->removeItemNoUpdate(i); + if (item != NULL) + { + player->drop(item); + } + } +} + +bool FireworksMenu::stillValid(shared_ptr player) +{ + return true; +} + +shared_ptr FireworksMenu::quickMoveStack(shared_ptr player, int slotIndex) +{ + shared_ptr clicked = nullptr; + Slot *slot = slots.at(slotIndex); + if (slot != NULL && slot->hasItem()) + { + shared_ptr stack = slot->getItem(); + clicked = stack->copy(); + + if (slotIndex == RESULT_SLOT) + { + if(!moveItemStackTo(stack, INV_SLOT_START, USE_ROW_SLOT_END, true)) + { + return nullptr; + } + slot->onQuickCraft(stack, clicked); + } + else if (slotIndex >= INV_SLOT_START && slotIndex < INV_SLOT_END) + { + if(isValidIngredient(stack, -1) && moveItemStackTo(stack, CRAFT_SLOT_START, CRAFT_SLOT_END, false)) + { + } + else if(!moveItemStackTo(stack, USE_ROW_SLOT_START, USE_ROW_SLOT_END, false)) + { + return nullptr; + } + } + else if (slotIndex >= USE_ROW_SLOT_START && slotIndex < USE_ROW_SLOT_END) + { + if(isValidIngredient(stack, -1) && moveItemStackTo(stack, CRAFT_SLOT_START, CRAFT_SLOT_END, false)) + { + } + else if(!moveItemStackTo(stack, INV_SLOT_START, INV_SLOT_END, false)) + { + return nullptr; + } + } + else + { + if(!moveItemStackTo(stack, INV_SLOT_START, USE_ROW_SLOT_END, false)) + { + return nullptr; + } + } + if (stack->count == 0) + { + slot->set(nullptr); + } + else + { + slot->setChanged(); + } + if (stack->count == clicked->count) + { + // nothing moved + return nullptr; + } + else + { + slot->onTake(player, stack); + } + } + return clicked; +} + +bool FireworksMenu::canTakeItemForPickAll(shared_ptr carried, Slot *target) +{ + return target->container != resultSlots && AbstractContainerMenu::canTakeItemForPickAll(carried, target); +} + +bool FireworksMenu::isValidIngredient(shared_ptr item, int slotId) +{ + if(item == NULL || slotId == RESULT_SLOT) return true; + return FireworksRecipe::isValidIngredient(item, m_canMakeFireworks, m_canMakeCharge, m_canMakeFade); +} \ No newline at end of file diff --git a/Minecraft.World/FireworksMenu.h b/Minecraft.World/FireworksMenu.h new file mode 100644 index 00000000..97621261 --- /dev/null +++ b/Minecraft.World/FireworksMenu.h @@ -0,0 +1,43 @@ +#pragma once + +#include "AbstractContainerMenu.h" + +class CraftingContainer; +class Container; + +class FireworksMenu : public AbstractContainerMenu +{ + // 4J Stu Made these public for UI menus, perhaps should make friend class? +public: + static const int RESULT_SLOT = 0; + static const int CRAFT_SLOT_START = 1; + static const int CRAFT_SLOT_END = CRAFT_SLOT_START + 9; + static const int INV_SLOT_START = CRAFT_SLOT_END; + static const int INV_SLOT_END = INV_SLOT_START + (9*3); + static const int USE_ROW_SLOT_START = INV_SLOT_END; + static const int USE_ROW_SLOT_END = USE_ROW_SLOT_START + 9; + +public: + shared_ptr craftSlots; + shared_ptr resultSlots; + +private: + Level *level; + int x, y, z; + + bool m_canMakeFireworks; + bool m_canMakeCharge; + bool m_canMakeFade; + +public: + FireworksMenu(shared_ptr inventory, Level *level, int xt, int yt, int zt); + + virtual void slotsChanged();// 4J used to take a shared_ptr but wasn't using it, so removed to simplify things + virtual void removed(shared_ptr player); + virtual bool stillValid(shared_ptr player); + virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + virtual bool canTakeItemForPickAll(shared_ptr carried, Slot *target); + + // 4J Added + virtual bool isValidIngredient(shared_ptr item, int slotId); +}; \ No newline at end of file diff --git a/Minecraft.World/FireworksRecipe.cpp b/Minecraft.World/FireworksRecipe.cpp new file mode 100644 index 00000000..a357c9cb --- /dev/null +++ b/Minecraft.World/FireworksRecipe.cpp @@ -0,0 +1,418 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "FireworksRecipe.h" + +DWORD FireworksRecipe::tlsIdx = 0; +FireworksRecipe::ThreadStorage *FireworksRecipe::tlsDefault = NULL; + +FireworksRecipe::ThreadStorage::ThreadStorage() +{ + resultItem = nullptr; +} + +void FireworksRecipe::CreateNewThreadStorage() +{ + ThreadStorage *tls = new ThreadStorage(); + if(tlsDefault == NULL ) + { + tlsIdx = TlsAlloc(); + tlsDefault = tls; + } + TlsSetValue(tlsIdx, tls); +} + +void FireworksRecipe::UseDefaultThreadStorage() +{ + TlsSetValue(tlsIdx, tlsDefault); +} + +void FireworksRecipe::ReleaseThreadStorage() +{ + ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx); + if( tls == tlsDefault ) return; + + delete tls; +} + +void FireworksRecipe::setResultItem(shared_ptr item) +{ + ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx); + tls->resultItem = item; +} + +FireworksRecipe::FireworksRecipe() +{ + //resultItem = nullptr; +} + +bool FireworksRecipe::matches(shared_ptr craftSlots, Level *level) +{ + shared_ptr resultItem = nullptr; + + int paperCount = 0; + int sulphurCount = 0; + int colorCount = 0; + int chargeCount = 0; + int chargeComponents = 0; + int typeComponents = 0; + + for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) + { + shared_ptr item = craftSlots->getItem(slot); + if (item == NULL) continue; + + if (item->id == Item::gunpowder_Id) + { + sulphurCount++; + } + else if (item->id == Item::fireworksCharge_Id) + { + chargeCount++; + } + else if (item->id == Item::dye_powder_Id) + { + colorCount++; + } + else if (item->id == Item::paper_Id) + { + paperCount++; + } + else if (item->id == Item::yellowDust_Id) + { + // glowstone dust gives flickering + chargeComponents++; + } + else if (item->id == Item::diamond_Id) + { + // diamonds give trails + chargeComponents++; + } + else if (item->id == Item::fireball_Id) + { + // fireball gives larger explosion + typeComponents++; + } + else if (item->id == Item::feather_Id) + { + // burst + typeComponents++; + } + else if (item->id == Item::goldNugget_Id) + { + // star + typeComponents++; + } + else if (item->id == Item::skull_Id) + { + // creeper + typeComponents++; + } + else + { + setResultItem(resultItem); + return false; + } + } + chargeComponents += colorCount + typeComponents; + + if (sulphurCount > 3 || paperCount > 1) + { + setResultItem(resultItem); + return false; + } + + // create fireworks + if (sulphurCount >= 1 && paperCount == 1 && chargeComponents == 0) + { + resultItem = shared_ptr( new ItemInstance(Item::fireworks) ); + if (chargeCount > 0) + { + CompoundTag *itemTag = new CompoundTag(); + CompoundTag *fireTag = new CompoundTag(FireworksItem::TAG_FIREWORKS); + ListTag *expTags = new ListTag(FireworksItem::TAG_EXPLOSIONS); + + for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) + { + shared_ptr item = craftSlots->getItem(slot); + if (item == NULL || item->id != Item::fireworksCharge_Id) continue; + + if (item->hasTag() && item->getTag()->contains(FireworksItem::TAG_EXPLOSION)) + { + expTags->add((CompoundTag *)item->getTag()->getCompound(FireworksItem::TAG_EXPLOSION)->copy()); + } + } + + fireTag->put(FireworksItem::TAG_EXPLOSIONS, expTags); + fireTag->putByte(FireworksItem::TAG_FLIGHT, (byte) sulphurCount); + itemTag->put(FireworksItem::TAG_FIREWORKS, fireTag); + + resultItem->setTag(itemTag); + } + setResultItem(resultItem); + return true; + } + // create firecharge + if (sulphurCount == 1 && paperCount == 0 && chargeCount == 0 && colorCount > 0 && typeComponents <= 1) + { + + resultItem = shared_ptr( new ItemInstance(Item::fireworksCharge) ); + CompoundTag *itemTag = new CompoundTag(); + CompoundTag *expTag = new CompoundTag(FireworksItem::TAG_EXPLOSION); + + byte type = 0; + + vector colors; + for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) + { + shared_ptr item = craftSlots->getItem(slot); + if (item == NULL) continue; + + if (item->id == Item::dye_powder_Id) + { + colors.push_back(DyePowderItem::COLOR_RGB[item->getAuxValue()]); + } + else if (item->id == Item::yellowDust_Id) + { + // glowstone dust gives flickering + expTag->putBoolean(FireworksItem::TAG_E_FLICKER, true); + } + else if (item->id == Item::diamond_Id) + { + // diamonds give trails + expTag->putBoolean(FireworksItem::TAG_E_TRAIL, true); + } + else if (item->id == Item::fireball_Id) + { + type = FireworksItem::TYPE_BIG; + } + else if (item->id == Item::feather_Id) + { + type = FireworksItem::TYPE_BURST; + } + else if (item->id == Item::goldNugget_Id) + { + type = FireworksItem::TYPE_STAR; + } + else if (item->id == Item::skull_Id) + { + type = FireworksItem::TYPE_CREEPER; + } + } + intArray colorArray(colors.size()); + for (int i = 0; i < colorArray.length; i++) + { + colorArray[i] = colors.at(i); + } + expTag->putIntArray(FireworksItem::TAG_E_COLORS, colorArray); + + expTag->putByte(FireworksItem::TAG_E_TYPE, type); + + itemTag->put(FireworksItem::TAG_EXPLOSION, expTag); + resultItem->setTag(itemTag); + + setResultItem(resultItem); + return true; + } + // apply fade colors to firecharge + if (sulphurCount == 0 && paperCount == 0 && chargeCount == 1 && colorCount > 0 && colorCount == chargeComponents) + { + + vector colors; + for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) + { + shared_ptr item = craftSlots->getItem(slot); + if (item == NULL) continue; + + if (item->id == Item::dye_powder_Id) + { + colors.push_back(DyePowderItem::COLOR_RGB[item->getAuxValue()]); + } + else if (item->id == Item::fireworksCharge_Id) + { + resultItem = item->copy(); + resultItem->count = 1; + } + } + intArray colorArray(colors.size()); + for (int i = 0; i < colorArray.length; i++) + { + colorArray[i] = colors.at(i); + } + if (resultItem != NULL && resultItem->hasTag()) + { + CompoundTag *compound = resultItem->getTag()->getCompound(FireworksItem::TAG_EXPLOSION); + if (compound == NULL) + { + delete colorArray.data; + + setResultItem(resultItem); + return false; + } + compound->putIntArray(FireworksItem::TAG_E_FADECOLORS, colorArray); + } + else + { + delete colorArray.data; + + setResultItem(resultItem); + return false; + } + + setResultItem(resultItem); + return true; + } + + setResultItem(resultItem); + return false; +} + +shared_ptr FireworksRecipe::assemble(shared_ptr craftSlots) +{ + ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx); + return tls->resultItem->copy(); + //return resultItem->copy(); +} + +int FireworksRecipe::size() +{ + return 10; +} + +const ItemInstance *FireworksRecipe::getResultItem() +{ + ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx); + return tls->resultItem.get(); + //return resultItem.get(); +} + +void FireworksRecipe::updatePossibleRecipes(shared_ptr craftSlots, bool *firework, bool *charge, bool *fade) +{ + *firework = false; + *charge = false; + *fade = false; + + int paperCount = 0; + int sulphurCount = 0; + int colorCount = 0; + int chargeCount = 0; + int chargeComponents = 0; + int typeComponents = 0; + + for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) + { + shared_ptr item = craftSlots->getItem(slot); + if (item == NULL) continue; + + if (item->id == Item::gunpowder_Id) + { + sulphurCount++; + } + else if (item->id == Item::fireworksCharge_Id) + { + chargeCount++; + } + else if (item->id == Item::dye_powder_Id) + { + colorCount++; + } + else if (item->id == Item::paper_Id) + { + paperCount++; + } + else if (item->id == Item::yellowDust_Id) + { + // glowstone dust gives flickering + chargeComponents++; + } + else if (item->id == Item::diamond_Id) + { + // diamonds give trails + chargeComponents++; + } + else if (item->id == Item::fireball_Id) + { + // fireball gives larger explosion + typeComponents++; + } + else if (item->id == Item::feather_Id) + { + // burst + typeComponents++; + } + else if (item->id == Item::goldNugget_Id) + { + // star + typeComponents++; + } + else if (item->id == Item::skull_Id) + { + // creeper + typeComponents++; + } + else + { + return; + } + } + chargeComponents += colorCount + typeComponents; + + if (sulphurCount > 3 || paperCount > 1) + { + return; + } + + // create fireworks + if ( paperCount <= 1 && chargeComponents == 0 ) + { + *firework = true; + } + // create firecharge + if ( sulphurCount <= 1 && colorCount >= 0 && paperCount == 0 && chargeCount == 0 && typeComponents <= 1 ) + { + *charge = true; + } + // apply fade colors to firecharge + if ( sulphurCount == 0 && paperCount == 0 && chargeCount <= 1 && colorCount >= 0 ) + { + *fade = true; + } +} + +bool FireworksRecipe::isValidIngredient(shared_ptr item, bool firework, bool charge, bool fade) +{ + bool valid = false; + switch(item->id) + { + case Item::gunpowder_Id: + valid = firework || charge; + break; + case Item::fireworksCharge_Id: + valid = firework || fade; + break; + case Item::dye_powder_Id: + valid = charge || fade; + break; + case Item::paper_Id: + valid = firework; + break; + case Item::yellowDust_Id: + valid = charge; + break; + case Item::diamond_Id: + valid = charge; + break; + case Item::fireball_Id: + valid = charge; + break; + case Item::feather_Id: + valid = charge; + break; + case Item::goldNugget_Id: + valid = charge; + break; + case Item::skull_Id: + valid = charge; + break; + } + return valid; +} \ No newline at end of file diff --git a/Minecraft.World/FireworksRecipe.h b/Minecraft.World/FireworksRecipe.h new file mode 100644 index 00000000..ef2815ea --- /dev/null +++ b/Minecraft.World/FireworksRecipe.h @@ -0,0 +1,46 @@ +#pragma once + +#include "Recipy.h" + +class FireworksRecipe : public Recipy +{ +private: + //shared_ptr resultItem; + + // 4J added so we can have separate contexts and rleBuf for different threads + class ThreadStorage + { + public: + shared_ptr resultItem; + ThreadStorage(); + }; + static DWORD tlsIdx; + static ThreadStorage *tlsDefault; + + void setResultItem(shared_ptr item); +public: + // Each new thread that needs to use Compression will need to call one of the following 2 functions, to either create its own + // local storage, or share the default storage already allocated by the main thread + static void CreateNewThreadStorage(); + static void UseDefaultThreadStorage(); + static void ReleaseThreadStorage(); + +public: + FireworksRecipe(); + + bool matches(shared_ptr craftSlots, Level *level); + shared_ptr assemble(shared_ptr craftSlots); + int size(); + const ItemInstance *getResultItem(); + + + virtual const int getGroup() { return 0; } + + // 4J-PB + virtual bool requires(int iRecipe) { return false; }; + virtual void requires(INGREDIENTS_REQUIRED *pIngReq) {}; + + // 4J Added + static void updatePossibleRecipes(shared_ptr craftSlots, bool *firework, bool *charge, bool *fade); + static bool isValidIngredient(shared_ptr item, bool firework, bool charge, bool fade); +}; \ No newline at end of file diff --git a/Minecraft.World/FireworksRocketEntity.cpp b/Minecraft.World/FireworksRocketEntity.cpp new file mode 100644 index 00000000..e84844f1 --- /dev/null +++ b/Minecraft.World/FireworksRocketEntity.cpp @@ -0,0 +1,181 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "FireworksRocketEntity.h" + +FireworksRocketEntity::FireworksRocketEntity(Level *level) : Entity(level) +{ + defineSynchedData(); + + life = 0; + lifetime = 0; + setSize(0.25f, 0.25f); +} + +void FireworksRocketEntity::defineSynchedData() +{ + entityData->defineNULL(DATA_ID_FIREWORKS_ITEM, NULL); +} + +bool FireworksRocketEntity::shouldRenderAtSqrDistance(double distance) +{ + return distance < 64 * 64; +} + +FireworksRocketEntity::FireworksRocketEntity(Level *level, double x, double y, double z, shared_ptr sourceItem) : Entity(level) +{ + defineSynchedData(); + + life = 0; + + setSize(0.25f, 0.25f); + + setPos(x, y, z); + heightOffset = 0; + + int flightCount = 1; + if (sourceItem != NULL && sourceItem->hasTag()) + { + entityData->set(DATA_ID_FIREWORKS_ITEM, sourceItem); + + CompoundTag *tag = sourceItem->getTag(); + CompoundTag *compound = tag->getCompound(FireworksItem::TAG_FIREWORKS); + if (compound != NULL) + { + flightCount += compound->getByte(FireworksItem::TAG_FLIGHT); + } + } + xd = random->nextGaussian() * .001; + zd = random->nextGaussian() * .001; + yd = 0.05; + + lifetime = (SharedConstants::TICKS_PER_SECOND / 2) * flightCount + random->nextInt(6) + random->nextInt(7); +} + +void FireworksRocketEntity::lerpMotion(double xd, double yd, double zd) +{ + xd = xd; + yd = yd; + zd = zd; + if (xRotO == 0 && yRotO == 0) + { + double sd = Mth::sqrt(xd * xd + zd * zd); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, sd) * 180 / PI); + } +} + +void FireworksRocketEntity::tick() +{ + xOld = x; + yOld = y; + zOld = z; + Entity::tick(); + + xd *= 1.15; + zd *= 1.15; + yd += .04; + move(xd, yd, zd); + + double sd = Mth::sqrt(xd * xd + zd * zd); + yRot = (float) (atan2(xd, zd) * 180 / PI); + xRot = (float) (atan2(yd, sd) * 180 / PI); + + while (xRot - xRotO < -180) + xRotO -= 360; + while (xRot - xRotO >= 180) + xRotO += 360; + + while (yRot - yRotO < -180) + yRotO -= 360; + while (yRot - yRotO >= 180) + yRotO += 360; + + xRot = xRotO + (xRot - xRotO) * 0.2f; + yRot = yRotO + (yRot - yRotO) * 0.2f; + + if (!level->isClientSide ) + { + if (life == 0) + { + level->playEntitySound(shared_from_this(), eSoundType_FIREWORKS_LAUNCH, 3, 1); + } + } + + life++; + if (level->isClientSide && (life % 2) < 2) + { + level->addParticle(eParticleType_fireworksspark, x, y - .3, z, random->nextGaussian() * .05, -yd * .5, random->nextGaussian() * .05); + } + if (!level->isClientSide && life > lifetime) + { + level->broadcastEntityEvent(shared_from_this(), EntityEvent::FIREWORKS_EXPLODE); + remove(); + } +} + +void FireworksRocketEntity::handleEntityEvent(byte eventId) +{ + if (eventId == EntityEvent::FIREWORKS_EXPLODE && level->isClientSide) + { + shared_ptr sourceItem = entityData->getItemInstance(DATA_ID_FIREWORKS_ITEM); + CompoundTag *tag = NULL; + if (sourceItem != NULL && sourceItem->hasTag()) + { + tag = sourceItem->getTag()->getCompound(FireworksItem::TAG_FIREWORKS); + } + level->createFireworks(x, y, z, xd, yd, zd, tag); + } + Entity::handleEntityEvent(eventId); +} + +void FireworksRocketEntity::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putInt(L"Life", life); + tag->putInt(L"LifeTime", lifetime); + shared_ptr itemInstance = entityData->getItemInstance(DATA_ID_FIREWORKS_ITEM); + if (itemInstance != NULL) + { + CompoundTag *itemTag = new CompoundTag(); + itemInstance->save(itemTag); + tag->putCompound(L"FireworksItem", itemTag); + } + +} + +void FireworksRocketEntity::readAdditionalSaveData(CompoundTag *tag) +{ + life = tag->getInt(L"Life"); + lifetime = tag->getInt(L"LifeTime"); + + CompoundTag *itemTag = tag->getCompound(L"FireworksItem"); + if (itemTag != NULL) + { + shared_ptr fromTag = ItemInstance::fromTag(itemTag); + if (fromTag != NULL) + { + entityData->set(DATA_ID_FIREWORKS_ITEM, fromTag); + } + } +} + +float FireworksRocketEntity::getShadowHeightOffs() +{ + return 0; +} + +float FireworksRocketEntity::getBrightness(float a) +{ + return Entity::getBrightness(a); +} + +int FireworksRocketEntity::getLightColor(float a) +{ + return Entity::getLightColor(a); +} + +bool FireworksRocketEntity::isAttackable() +{ + return false; +} \ No newline at end of file diff --git a/Minecraft.World/FireworksRocketEntity.h b/Minecraft.World/FireworksRocketEntity.h new file mode 100644 index 00000000..025a2778 --- /dev/null +++ b/Minecraft.World/FireworksRocketEntity.h @@ -0,0 +1,38 @@ +#pragma once + +#include "Entity.h" + +class FireworksRocketEntity : public Entity +{ +public: + eINSTANCEOF GetType() { return eTYPE_FIREWORKS_ROCKET; } + static Entity *create(Level *level) { return new FireworksRocketEntity(level); } + +private: + static const int DATA_ID_FIREWORKS_ITEM = 8; + + int life; + int lifetime; + + // constructor needed for level loader +public: + FireworksRocketEntity(Level *level); + +protected: + virtual void defineSynchedData(); + +public: + virtual bool shouldRenderAtSqrDistance(double distance); + + FireworksRocketEntity(Level *level, double x, double y, double z, shared_ptr sourceItem); + + virtual void lerpMotion(double xd, double yd, double zd); + virtual void tick(); + virtual void handleEntityEvent(byte eventId); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual float getShadowHeightOffs(); + virtual float getBrightness(float a); + virtual int getLightColor(float a); + virtual bool isAttackable(); +}; \ No newline at end of file diff --git a/Minecraft.World/FishingHook.cpp b/Minecraft.World/FishingHook.cpp index efa2dbc6..3e627af2 100644 --- a/Minecraft.World/FishingHook.cpp +++ b/Minecraft.World/FishingHook.cpp @@ -67,18 +67,18 @@ FishingHook::FishingHook(Level *level, shared_ptr mob) : Entity( level ) { _init(); - this->owner = mob; + owner = mob; // 4J Stu - Moved this outside the ctor //owner->fishing = dynamic_pointer_cast( shared_from_this() ); - this->moveTo(mob->x, mob->y + 1.62 - mob->heightOffset, mob->z, mob->yRot, mob->xRot); + moveTo(mob->x, mob->y + 1.62 - mob->heightOffset, mob->z, mob->yRot, mob->xRot); x -= Mth::cos(yRot / 180 * PI) * 0.16f; y -= 0.1f; z -= Mth::sin(yRot / 180 * PI) * 0.16f; - this->setPos(x, y, z); - this->heightOffset = 0; + setPos(x, y, z); + heightOffset = 0; float speed = 0.4f; @@ -122,8 +122,8 @@ void FishingHook::shoot(double xd, double yd, double zd, float pow, float uncert double sd = sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2(yd, sd) * 180 / PI); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, sd) * 180 / PI); life = 0; } @@ -137,9 +137,9 @@ void FishingHook::lerpTo(double x, double y, double z, float yRot, float xRot, i lSteps = steps; - this->xd = lxd; - this->yd = lyd; - this->zd = lzd; + xd = lxd; + yd = lyd; + zd = lzd; } void FishingHook::lerpMotion(double xd, double yd, double zd) @@ -165,15 +165,15 @@ void FishingHook::tick() xRot += (float) ( (lxr - xRot) / lSteps ); lSteps--; - this->setPos(xt, yt, zt); - this->setRot(yRot, xRot); + setPos(xt, yt, zt); + setRot(yRot, xRot); return; } if (!level->isClientSide) { shared_ptr selectedItem = owner->getSelectedItem(); - if (owner->removed || !owner->isAlive() || selectedItem == NULL || selectedItem->getItem() != Item::fishingRod || this->distanceToSqr(owner) > 32 * 32) + if (owner->removed || !owner->isAlive() || selectedItem == NULL || selectedItem->getItem() != Item::fishingRod || distanceToSqr(owner) > 32 * 32) { remove(); owner->fishing = nullptr; @@ -231,7 +231,7 @@ void FishingHook::tick() to = Vec3::newTemp(res->pos->x, res->pos->y, res->pos->z); } shared_ptr hitEntity = nullptr; - vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); + vector > *objects = level->getEntities(shared_from_this(), bb->expand(xd, yd, zd)->grow(1, 1, 1)); double nearest = 0; AUTO_VAR(itEnd, objects->end()); for (AUTO_VAR(it, objects->begin()); it != itEnd; it++) @@ -337,7 +337,7 @@ void FishingHook::tick() { nibble = random->nextInt(30) + 10; yd -= 0.2f; - level->playSound(shared_from_this(), eSoundType_RANDOM_SPLASH, 0.25f, 1 + (random->nextFloat() - random->nextFloat()) * 0.4f); + playSound(eSoundType_RANDOM_SPLASH, 0.25f, 1 + (random->nextFloat() - random->nextFloat()) * 0.4f); float yt = (float) Mth::floor(bb->y0); for (int i = 0; i < 1 + bbWidth * 20; i++) { @@ -432,7 +432,7 @@ int FishingHook::retrieve() ie->Entity::yd = ya * speed + sqrt(dist) * 0.08; ie->Entity::zd = za * speed; level->addEntity(ie); - owner->level->addEntity( shared_ptr( new ExperienceOrb(owner->level, owner->x, owner->y + 0.5f, owner->z + 0.5f, random->nextInt(3) + 1) ) ); // 4J Stu brought forward from 1.4 + owner->level->addEntity( shared_ptr( new ExperienceOrb(owner->level, owner->x, owner->y + 0.5f, owner->z + 0.5f, random->nextInt(6) + 1) ) ); // 4J Stu brought forward from 1.4 dmg = 1; } if (inGround) dmg = 2; diff --git a/Minecraft.World/FishingRodItem.cpp b/Minecraft.World/FishingRodItem.cpp index 858005e0..883eb2de 100644 --- a/Minecraft.World/FishingRodItem.cpp +++ b/Minecraft.World/FishingRodItem.cpp @@ -13,8 +13,6 @@ #include "FishingRodItem.h" #include "SoundTypes.h" -const wstring FishingRodItem::TEXTURE_EMPTY = L"fishingRod_empty"; - FishingRodItem::FishingRodItem(int id) : Item(id) { setMaxDamage(64); @@ -37,12 +35,12 @@ shared_ptr FishingRodItem::use(shared_ptr instance, if (player->fishing != NULL) { int dmg = player->fishing->retrieve(); - instance->hurt(dmg, player); + instance->hurtAndBreak(dmg, player); player->swing(); } else { - level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + level->playEntitySound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); if (!level->isClientSide) { // 4J Stu - Move the player->fishing out of the ctor as we cannot reference 'this' @@ -57,8 +55,8 @@ shared_ptr FishingRodItem::use(shared_ptr instance, void FishingRodItem::registerIcons(IconRegister *iconRegister) { - Item::registerIcons(iconRegister); - emptyIcon = iconRegister->registerIcon(TEXTURE_EMPTY); + icon = iconRegister->registerIcon(getIconName() + L"_uncast"); + emptyIcon = iconRegister->registerIcon(getIconName() + L"_cast"); } Icon *FishingRodItem::getEmptyIcon() diff --git a/Minecraft.World/FishingRodItem.h b/Minecraft.World/FishingRodItem.h index a6df606d..5d95177a 100644 --- a/Minecraft.World/FishingRodItem.h +++ b/Minecraft.World/FishingRodItem.h @@ -8,9 +8,6 @@ class Level; class FishingRodItem : public Item { -public: - static const wstring TEXTURE_EMPTY; - private: Icon *emptyIcon; @@ -21,7 +18,6 @@ public: virtual bool isMirroredArt(); virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); - //@Override void registerIcons(IconRegister *iconRegister); Icon *getEmptyIcon(); }; diff --git a/Minecraft.World/FixedBiomeSource.cpp b/Minecraft.World/FixedBiomeSource.cpp index 35708cb2..257ec3db 100644 --- a/Minecraft.World/FixedBiomeSource.cpp +++ b/Minecraft.World/FixedBiomeSource.cpp @@ -4,7 +4,7 @@ FixedBiomeSource::FixedBiomeSource(Biome *fixed, float temperature, float downfall) { - this->biome = fixed; + biome = fixed; this->temperature = temperature; this->downfall = downfall; } @@ -45,9 +45,9 @@ floatArray FixedBiomeSource::getTemperatureBlock(int x, int z, int w, int h) con // 4J - note that caller is responsible for deleting returned array. temperatures array is for output only. void FixedBiomeSource::getTemperatureBlock(doubleArray& temperatures, int x, int z, int w, int h) const { - temperatures = doubleArray(w * h); + temperatures = doubleArray(w * h); - Arrays::fill(temperatures, 0, w * h, (double)temperature); + Arrays::fill(temperatures, 0, w * h, (double)temperature); } void FixedBiomeSource::getDownfallBlock(floatArray &downfalls, int x, int z, int w, int h) const diff --git a/Minecraft.World/FlatGeneratorInfo.cpp b/Minecraft.World/FlatGeneratorInfo.cpp new file mode 100644 index 00000000..9df19693 --- /dev/null +++ b/Minecraft.World/FlatGeneratorInfo.cpp @@ -0,0 +1,250 @@ +#include "stdafx.h" +#include "StringHelpers.h" +#include "net.minecraft.world.level.levelgen.flat.h" +#include "net.minecraft.world.level.tile.h" +#include "FlatGeneratorInfo.h" + +const wstring FlatGeneratorInfo::STRUCTURE_VILLAGE = L"village"; +const wstring FlatGeneratorInfo::STRUCTURE_BIOME_SPECIFIC = L"biome_1"; +const wstring FlatGeneratorInfo::STRUCTURE_STRONGHOLD = L"stronghold"; +const wstring FlatGeneratorInfo::STRUCTURE_MINESHAFT = L"mineshaft"; +const wstring FlatGeneratorInfo::STRUCTURE_BIOME_DECORATION = L"decoration"; +const wstring FlatGeneratorInfo::STRUCTURE_LAKE = L"lake"; +const wstring FlatGeneratorInfo::STRUCTURE_LAVA_LAKE = L"lava_lake"; +const wstring FlatGeneratorInfo::STRUCTURE_DUNGEON = L"dungeon"; + +FlatGeneratorInfo::FlatGeneratorInfo() +{ + biome = 0; +} + +FlatGeneratorInfo::~FlatGeneratorInfo() +{ + for(AUTO_VAR(it, layers.begin()); it != layers.end(); ++it) + { + delete *it; + } +} + +int FlatGeneratorInfo::getBiome() +{ + return biome; +} + +void FlatGeneratorInfo::setBiome(int biome) +{ + this->biome = biome; +} + +unordered_map > *FlatGeneratorInfo::getStructures() +{ + return &structures; +} + +vector *FlatGeneratorInfo::getLayers() +{ + return &layers; +} + +void FlatGeneratorInfo::updateLayers() +{ + int y = 0; + + for(AUTO_VAR(it, layers.begin()); it != layers.end(); ++it) + { + FlatLayerInfo *layer = *it; + layer->setStart(y); + y += layer->getHeight(); + } +} + +wstring FlatGeneratorInfo::toString() +{ + return L""; +#if 0 + StringBuilder builder = new StringBuilder(); + + builder.append(SERIALIZATION_VERSION); + builder.append(";"); + + for (int i = 0; i < layers.size(); i++) + { + if (i > 0) builder.append(","); + builder.append(layers.get(i).toString()); + } + + builder.append(";"); + builder.append(biome); + + if (!structures.isEmpty()) + { + builder.append(";"); + int structCount = 0; + + for (Map.Entry> structure : structures.entrySet()) + { + if (structCount++ > 0) builder.append(","); + builder.append(structure.getKey().toLowerCase()); + + Map options = structure.getValue(); + if (!options.isEmpty()) + { + builder.append("("); + int optionCount = 0; + + for (Map.Entry option : options.entrySet()) + { + if (optionCount++ > 0) builder.append(" "); + builder.append(option.getKey()); + builder.append("="); + builder.append(option.getValue()); + } + + builder.append(")"); + } + } + } + else + { + builder.append(";"); + } + + return builder.toString(); +#endif +} + +FlatLayerInfo *FlatGeneratorInfo::getLayerFromString(const wstring &input, int yOffset) +{ + return NULL; +#if 0 + std::vector parts = stringSplit(input, L'x'); + + int height = 1; + int id; + int data = 0; + + if (parts.size() == 2) + { + height = _fromString(parts[0]); + if (yOffset + height >= Level::maxBuildHeight) height = Level::maxBuildHeight - yOffset; + if (height < 0) height = 0; + } + + wstring identity = parts[parts.size() - 1]; + parts = stringSplit(identity, L':'); + + id = _fromString(parts[0]); + if (parts.size() > 1) data = _from_String(parts[1]); + + if (Tile::tiles[id] == NULL) + { + id = 0; + data = 0; + } + + if (data < 0 || data > 15) data = 0; + + FlatLayerInfo *result = new FlatLayerInfo(height, id, data); + result->setStart(yOffset); + return result; +#endif +} + +vector *FlatGeneratorInfo::getLayersFromString(const wstring &input) +{ + if (input.empty()) return NULL; + + vector *result = new vector(); + std::vector depths = stringSplit(input, L','); + + int yOffset = 0; + + for(AUTO_VAR(it, depths.begin()); it != depths.end(); ++it) + { + FlatLayerInfo *layer = getLayerFromString(*it, yOffset); + if (layer == NULL) return NULL; + result->push_back(layer); + yOffset += layer->getHeight(); + } + + return result; +} + +FlatGeneratorInfo *FlatGeneratorInfo::fromValue(const wstring &input) +{ + return getDefault(); + +#if 0 + if (input.empty()) return getDefault(); + std::vector parts = stringSplit(input, L';'); + + int version = parts.size() == 1 ? 0 : Mth::getInt(parts[0], 0); + if (version < 0 || version > SERIALIZATION_VERSION) return getDefault(); + + FlatGeneratorInfo *result = new FlatGeneratorInfo(); + int index = parts.size() == 1 ? 0 : 1; + vector *layers = getLayersFromString(parts[index++]); + + if (layers == NULL || layers->isEmpty()) + { + delete layers; + return getDefault(); + } + + result->getLayers()->addAll(layers); + delete layers; + result->updateLayers(); + + int biome = Biome::plains_Id; + if (version > 0 && parts.size() > index) biome = Mth::getInt(parts[index++], biome); + result->setBiome(biome); + + if (version > 0 && parts.size() > index) + { + std::vector structures = stringSplit(parts[index++], L','); + + for(AUTO_VAR(it, structures.begin()); it != structures.end(); ++it) + { + std::vector separated = stringSplit(parts[index++], L"\\("); + + unordered_map structureOptions; + + if (separated[0].length() > 0) + { + (*result->getStructures())[separated[0]] = structureOptions; + + if (separated.size() > 1 && separated[1].endsWith(L")") && separated[1].length() > 1) + { + String[] options = separated[1].substring(0, separated[1].length() - 1).split(" "); + + for (int option = 0; option < options.length; option++) + { + String[] split = options[option].split("=", 2); + if (split.length == 2) structureOptions[split[0]] = split[1]; + } + } + } + } + } + else + { + (* (result->getStructures()) )[STRUCTURE_VILLAGE] = unordered_map(); + } + + return result; +#endif +} + +FlatGeneratorInfo *FlatGeneratorInfo::getDefault() +{ + FlatGeneratorInfo *result = new FlatGeneratorInfo(); + + result->setBiome(Biome::plains->id); + result->getLayers()->push_back(new FlatLayerInfo(1, Tile::unbreakable_Id)); + result->getLayers()->push_back(new FlatLayerInfo(2, Tile::dirt_Id)); + result->getLayers()->push_back(new FlatLayerInfo(1, Tile::grass_Id)); + result->updateLayers(); + (* (result->getStructures()) )[STRUCTURE_VILLAGE] = unordered_map(); + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/FlatGeneratorInfo.h b/Minecraft.World/FlatGeneratorInfo.h new file mode 100644 index 00000000..4fda8e43 --- /dev/null +++ b/Minecraft.World/FlatGeneratorInfo.h @@ -0,0 +1,41 @@ +#pragma once + +class FlatLayerInfo; + +class FlatGeneratorInfo +{ +public: + static const int SERIALIZATION_VERSION = 2; + static const wstring STRUCTURE_VILLAGE; + static const wstring STRUCTURE_BIOME_SPECIFIC; + static const wstring STRUCTURE_STRONGHOLD; + static const wstring STRUCTURE_MINESHAFT; + static const wstring STRUCTURE_BIOME_DECORATION; + static const wstring STRUCTURE_LAKE; + static const wstring STRUCTURE_LAVA_LAKE; + static const wstring STRUCTURE_DUNGEON; + +private: + vector layers; + unordered_map > structures; + int biome; + +public: + FlatGeneratorInfo(); + ~FlatGeneratorInfo(); + + int getBiome(); + void setBiome(int biome); + unordered_map > *getStructures(); + vector *getLayers(); + void updateLayers(); + wstring toString(); + +private: + static FlatLayerInfo *getLayerFromString(const wstring &input, int yOffset); + static vector *getLayersFromString(const wstring &input); + +public: + static FlatGeneratorInfo *fromValue(const wstring &input); + static FlatGeneratorInfo *getDefault(); +}; \ No newline at end of file diff --git a/Minecraft.World/FlatLayerInfo.cpp b/Minecraft.World/FlatLayerInfo.cpp new file mode 100644 index 00000000..4a4d79dd --- /dev/null +++ b/Minecraft.World/FlatLayerInfo.cpp @@ -0,0 +1,78 @@ +#include "stdafx.h" + +#include "FlatLayerInfo.h" + +void FlatLayerInfo::_init(int height, int id) +{ + this->height = height; + this->id = id; + data = 0; + start = 0; +} + +FlatLayerInfo::FlatLayerInfo(int height, int id) +{ + _init(height, id); +} + +FlatLayerInfo::FlatLayerInfo(int height, int id, int data) +{ + _init(height, id); + this->data = data; +} + +int FlatLayerInfo::getHeight() +{ + return height; +} + +void FlatLayerInfo::setHeight(int height) +{ + this->height = height; +} + +int FlatLayerInfo::getId() +{ + return id; +} + +void FlatLayerInfo::setId(int id) +{ + this->id = id; +} + +int FlatLayerInfo::getData() +{ + return data; +} + +void FlatLayerInfo::setData(int data) +{ + this->data = data; +} + +int FlatLayerInfo::getStart() +{ + return start; +} + +void FlatLayerInfo::setStart(int start) +{ + this->start = start; +} + +wstring FlatLayerInfo::toString() +{ + wstring result = _toString(id); + + if (height > 1) + { + result = _toString(height) + L"x" + result; + } + if (data > 0) + { + result += L":" + _toString(data); + } + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/FlatLayerInfo.h b/Minecraft.World/FlatLayerInfo.h new file mode 100644 index 00000000..68096720 --- /dev/null +++ b/Minecraft.World/FlatLayerInfo.h @@ -0,0 +1,26 @@ +#pragma once + +class FlatLayerInfo +{ +private: + int height; + int id; + int data; + int start; + + void _init(int height, int id); + +public: + FlatLayerInfo(int height, int id); + FlatLayerInfo(int height, int id, int data); + + int getHeight(); + void setHeight(int height); + int getId(); + void setId(int id); + int getData(); + void setData(int data); + int getStart(); + void setStart(int start); + wstring toString(); +}; \ No newline at end of file diff --git a/Minecraft.World/FlatLevelSource.cpp b/Minecraft.World/FlatLevelSource.cpp index 6435bfb4..7a31374e 100644 --- a/Minecraft.World/FlatLevelSource.cpp +++ b/Minecraft.World/FlatLevelSource.cpp @@ -20,7 +20,7 @@ FlatLevelSource::FlatLevelSource(Level *level, __int64 seed, bool generateStruct this->random = new Random(seed); this->pprandom = new Random(seed); // 4J - added, so that we can have a separate random for doing post-processing in parallel with creation - villageFeature = new VillageFeature(0,m_XZSize); + villageFeature = new VillageFeature(m_XZSize); } @@ -151,3 +151,8 @@ TilePos *FlatLevelSource::findNearestMapFeature(Level *level, const wstring& fea { return NULL; } + +void FlatLevelSource::recreateLogicStructuresForChunk(int chunkX, int chunkZ) +{ + // TODO +} \ No newline at end of file diff --git a/Minecraft.World/FlatLevelSource.h b/Minecraft.World/FlatLevelSource.h index 804a7b5a..8f8a506d 100644 --- a/Minecraft.World/FlatLevelSource.h +++ b/Minecraft.World/FlatLevelSource.h @@ -41,4 +41,5 @@ public: virtual wstring gatherStats(); virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z); virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ); }; diff --git a/Minecraft.World/FleeSunGoal.cpp b/Minecraft.World/FleeSunGoal.cpp index a9799038..d58ad709 100644 --- a/Minecraft.World/FleeSunGoal.cpp +++ b/Minecraft.World/FleeSunGoal.cpp @@ -6,10 +6,10 @@ #include "net.minecraft.world.phys.h" #include "FleeSunGoal.h" -FleeSunGoal::FleeSunGoal(PathfinderMob *mob, float speed) +FleeSunGoal::FleeSunGoal(PathfinderMob *mob, double speedModifier) { this->mob = mob; - this->speed = speed; + this->speedModifier = speedModifier; this->level = mob->level; setRequiredControlFlags(Control::MoveControlFlag); } @@ -35,7 +35,7 @@ bool FleeSunGoal::canContinueToUse() void FleeSunGoal::start() { - mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speed); + mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speedModifier); } Vec3 *FleeSunGoal::getHidePos() diff --git a/Minecraft.World/FleeSunGoal.h b/Minecraft.World/FleeSunGoal.h index 9d26c9f6..18f384c4 100644 --- a/Minecraft.World/FleeSunGoal.h +++ b/Minecraft.World/FleeSunGoal.h @@ -7,11 +7,11 @@ class FleeSunGoal : public Goal private: PathfinderMob *mob; // Owner of this goal double wantedX, wantedY, wantedZ; - float speed; + double speedModifier; Level *level; public: - FleeSunGoal(PathfinderMob *mob, float speed); + FleeSunGoal(PathfinderMob *mob, double speedModifier); virtual bool canUse(); virtual bool canContinueToUse(); diff --git a/Minecraft.World/FlintAndSteelItem.cpp b/Minecraft.World/FlintAndSteelItem.cpp index 5ebdad2b..18f6bb18 100644 --- a/Minecraft.World/FlintAndSteelItem.cpp +++ b/Minecraft.World/FlintAndSteelItem.cpp @@ -25,7 +25,7 @@ bool FlintAndSteelItem::useOn(shared_ptr instance, shared_ptrmayBuild(x, y, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; int targetType = level->getTile(x, y, z); @@ -47,11 +47,11 @@ bool FlintAndSteelItem::useOn(shared_ptr instance, shared_ptrplaySound(x + 0.5, y + 0.5, z + 0.5, eSoundType_FIRE_IGNITE, 1, random->nextFloat() * 0.4f + 0.8f); - level->setTile(x, y, z, Tile::fire_Id); + level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_FIRE_NEWIGNITE, 1, random->nextFloat() * 0.4f + 0.8f); + level->setTileAndUpdate(x, y, z, Tile::fire_Id); } - instance->hurt(1, player); + instance->hurtAndBreak(1, player); } else { diff --git a/Minecraft.World/FloatTag.h b/Minecraft.World/FloatTag.h index 266db4d3..80301649 100644 --- a/Minecraft.World/FloatTag.h +++ b/Minecraft.World/FloatTag.h @@ -10,7 +10,7 @@ public: FloatTag(const wstring &name, float data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeFloat(data); } - void load(DataInput *dis) { data = dis->readFloat(); } + void load(DataInput *dis, int tagDepth) { data = dis->readFloat(); } byte getId() { return TAG_Float; } wstring toString() diff --git a/Minecraft.World/FlowerFeature.cpp b/Minecraft.World/FlowerFeature.cpp index 3fd8bac4..f24d61bf 100644 --- a/Minecraft.World/FlowerFeature.cpp +++ b/Minecraft.World/FlowerFeature.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.dimension.h" #include "FlowerFeature.h" #include "net.minecraft.world.level.tile.h" @@ -22,19 +23,19 @@ bool FlowerFeature::place(Level *level, Random *random, int x, int y, int z) } } - for (int i = 0; i < 64; i++) + for (int i = 0; i < 64; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y + random->nextInt(4) - random->nextInt(4); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (level->isEmptyTile(x2, y2, z2)) + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y + random->nextInt(4) - random->nextInt(4); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (level->isEmptyTile(x2, y2, z2) && (!level->dimension->hasCeiling || y2 < Level::genDepthMinusOne)) { - if (Tile::tiles[tile]->canSurvive(level, x2, y2, z2)) + if (Tile::tiles[tile]->canSurvive(level, x2, y2, z2)) { - level->setTileNoUpdate(x2, y2, z2, tile); - } - } - } + level->setTileAndData(x2, y2, z2, tile, 0, Tile::UPDATE_CLIENTS); + } + } + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/FlowerPotTile.cpp b/Minecraft.World/FlowerPotTile.cpp index b245e56d..4cdd529c 100644 --- a/Minecraft.World/FlowerPotTile.cpp +++ b/Minecraft.World/FlowerPotTile.cpp @@ -42,7 +42,7 @@ bool FlowerPotTile::use(Level *level, int x, int y, int z, shared_ptr pl if (type > 0) { - level->setData(x, y, z, type); + level->setData(x, y, z, type, Tile::UPDATE_CLIENTS); if (!player->abilities.instabuild) { @@ -102,7 +102,7 @@ void FlowerPotTile::neighborChanged(Level *level, int x, int y, int z, int type) { spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } } @@ -133,9 +133,9 @@ shared_ptr FlowerPotTile::getItemFromType(int type) case TYPE_CACTUS: return shared_ptr( new ItemInstance(Tile::cactus) ); case TYPE_MUSHROOM_BROWN: - return shared_ptr( new ItemInstance(Tile::mushroom1) ); + return shared_ptr( new ItemInstance(Tile::mushroom_brown) ); case TYPE_MUSHROOM_RED: - return shared_ptr( new ItemInstance(Tile::mushroom2) ); + return shared_ptr( new ItemInstance(Tile::mushroom_red) ); case TYPE_DEAD_BUSH: return shared_ptr( new ItemInstance(Tile::deadBush) ); case TYPE_SAPLING_DEFAULT: @@ -160,8 +160,8 @@ int FlowerPotTile::getTypeFromItem(shared_ptr item) if (id == Tile::rose_Id) return TYPE_FLOWER_RED; if (id == Tile::flower_Id) return TYPE_FLOWER_YELLOW; if (id == Tile::cactus_Id) return TYPE_CACTUS; - if (id == Tile::mushroom1_Id) return TYPE_MUSHROOM_BROWN; - if (id == Tile::mushroom2_Id) return TYPE_MUSHROOM_RED; + if (id == Tile::mushroom_brown_Id) return TYPE_MUSHROOM_BROWN; + if (id == Tile::mushroom_red_Id) return TYPE_MUSHROOM_RED; if (id == Tile::deadBush_Id) return TYPE_DEAD_BUSH; if (id == Tile::sapling_Id) diff --git a/Minecraft.World/FlyingMob.cpp b/Minecraft.World/FlyingMob.cpp index b7a01678..1757ae58 100644 --- a/Minecraft.World/FlyingMob.cpp +++ b/Minecraft.World/FlyingMob.cpp @@ -14,6 +14,12 @@ void FlyingMob::causeFallDamage(float distance) // not trigger the "fallOn" tile calls (such as trampling crops) } +void FlyingMob::checkFallDamage(double ya, bool onGround) +{ + // this method is empty because flying creatures should + // not trigger the "fallOn" tile calls (such as trampling crops) +} + void FlyingMob::travel(float xa, float ya) { if (isInWater()) diff --git a/Minecraft.World/FlyingMob.h b/Minecraft.World/FlyingMob.h index f3bb2a03..ac45e97f 100644 --- a/Minecraft.World/FlyingMob.h +++ b/Minecraft.World/FlyingMob.h @@ -11,6 +11,7 @@ public: protected: virtual void causeFallDamage(float distance); + virtual void checkFallDamage(double ya, bool onGround); public: virtual void travel(float xa, float ya); diff --git a/Minecraft.World/FollowOwnerGoal.cpp b/Minecraft.World/FollowOwnerGoal.cpp index faba2226..8565d782 100644 --- a/Minecraft.World/FollowOwnerGoal.cpp +++ b/Minecraft.World/FollowOwnerGoal.cpp @@ -7,16 +7,16 @@ #include "net.minecraft.world.phys.h" #include "FollowOwnerGoal.h" -FollowOwnerGoal::FollowOwnerGoal(TamableAnimal *tamable, float speed, float startDistance, float stopDistance) +FollowOwnerGoal::FollowOwnerGoal(TamableAnimal *tamable, double speedModifier, float startDistance, float stopDistance) { owner = weak_ptr(); timeToRecalcPath = 0; oldAvoidWater = false; this->tamable = tamable; - this->level = tamable->level; - this->speed = speed; - this->navigation = tamable->getNavigation(); + level = tamable->level; + this->speedModifier = speedModifier; + navigation = tamable->getNavigation(); this->startDistance = startDistance; this->stopDistance = stopDistance; setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); @@ -24,11 +24,11 @@ FollowOwnerGoal::FollowOwnerGoal(TamableAnimal *tamable, float speed, float star bool FollowOwnerGoal::canUse() { - shared_ptr owner = tamable->getOwner(); + shared_ptr owner = dynamic_pointer_cast( tamable->getOwner() ); if (owner == NULL) return false; if (tamable->isSitting()) return false; if (tamable->distanceToSqr(owner) < startDistance * startDistance) return false; - this->owner = weak_ptr(owner); + this->owner = weak_ptr(owner); return true; } @@ -59,7 +59,8 @@ void FollowOwnerGoal::tick() if (--timeToRecalcPath > 0) return; timeToRecalcPath = 10; - if (navigation->moveTo(owner.lock(), speed)) return; + if (navigation->moveTo(owner.lock(), speedModifier)) return; + if (tamable->isLeashed()) return; if (tamable->distanceToSqr(owner.lock()) < TeleportDistance * TeleportDistance) return; // find a good spawn position nearby the owner diff --git a/Minecraft.World/FollowOwnerGoal.h b/Minecraft.World/FollowOwnerGoal.h index e7b598fa..09cb0edc 100644 --- a/Minecraft.World/FollowOwnerGoal.h +++ b/Minecraft.World/FollowOwnerGoal.h @@ -12,16 +12,16 @@ public: private: TamableAnimal *tamable; // Owner of this goal - weak_ptr owner; + weak_ptr owner; Level *level; - float speed; + double speedModifier; PathNavigation *navigation; int timeToRecalcPath; float stopDistance, startDistance; bool oldAvoidWater; public: - FollowOwnerGoal(TamableAnimal *tamable, float speed, float startDistance, float stopDistance); + FollowOwnerGoal(TamableAnimal *tamable, double speedModifier, float startDistance, float stopDistance); virtual bool canUse(); virtual bool canContinueToUse(); diff --git a/Minecraft.World/FollowParentGoal.cpp b/Minecraft.World/FollowParentGoal.cpp index 3e347d62..61c5614a 100644 --- a/Minecraft.World/FollowParentGoal.cpp +++ b/Minecraft.World/FollowParentGoal.cpp @@ -6,12 +6,12 @@ #include "BasicTypeContainers.h" #include "FollowParentGoal.h" -FollowParentGoal::FollowParentGoal(Animal *animal, float speed) +FollowParentGoal::FollowParentGoal(Animal *animal, double speedModifier) { timeToRecalcPath = 0; this->animal = animal; - this->speed = speed; + this->speedModifier = speedModifier; } bool FollowParentGoal::canUse() @@ -61,5 +61,5 @@ void FollowParentGoal::tick() { if (--timeToRecalcPath > 0) return; timeToRecalcPath = 10; - animal->getNavigation()->moveTo(parent.lock(), speed); + animal->getNavigation()->moveTo(parent.lock(), speedModifier); } \ No newline at end of file diff --git a/Minecraft.World/FollowParentGoal.h b/Minecraft.World/FollowParentGoal.h index 0aa64bbf..40b828dc 100644 --- a/Minecraft.World/FollowParentGoal.h +++ b/Minecraft.World/FollowParentGoal.h @@ -9,11 +9,11 @@ class FollowParentGoal : public Goal private: Animal *animal; // Owner of this goal weak_ptr parent; - float speed; + double speedModifier; int timeToRecalcPath; public: - FollowParentGoal(Animal *animal, float speed); + FollowParentGoal(Animal *animal, double speedModifier); virtual bool canUse(); virtual bool canContinueToUse(); diff --git a/Minecraft.World/FoodConstants.cpp b/Minecraft.World/FoodConstants.cpp index a05b21c8..6ced45d5 100644 --- a/Minecraft.World/FoodConstants.cpp +++ b/Minecraft.World/FoodConstants.cpp @@ -25,6 +25,7 @@ const float FoodConstants::FOOD_SATURATION_MAX = 1.0f; const float FoodConstants::FOOD_SATURATION_SUPERNATURAL = 1.2f; // some exhaustion guidelines +const float FoodConstants::EXHAUSTION_HEAL = 3.0f; const float FoodConstants::EXHAUSTION_JUMP = .2f; const float FoodConstants::EXHAUSTION_SPRINT_JUMP = FoodConstants::EXHAUSTION_JUMP * 4; const float FoodConstants::EXHAUSTION_MINE = .025f; diff --git a/Minecraft.World/FoodConstants.h b/Minecraft.World/FoodConstants.h index 6f80b041..cc4620cb 100644 --- a/Minecraft.World/FoodConstants.h +++ b/Minecraft.World/FoodConstants.h @@ -3,35 +3,36 @@ class FoodConstants { public: - static const int MAX_FOOD; - static const float MAX_SATURATION; - static const float START_SATURATION; - static const float SATURATION_FLOOR; + static const int MAX_FOOD; + static const float MAX_SATURATION; + static const float START_SATURATION; + static const float SATURATION_FLOOR; - // this value modifies how quickly food is dropped - static const float EXHAUSTION_DROP; + // this value modifies how quickly food is dropped + static const float EXHAUSTION_DROP; - // number of game ticks to change health because of food - static const int HEALTH_TICK_COUNT; + // number of game ticks to change health because of food + static const int HEALTH_TICK_COUNT; - static const int HEAL_LEVEL; - static const int STARVE_LEVEL; + static const int HEAL_LEVEL; + static const int STARVE_LEVEL; - // some saturation guidelines - static const float FOOD_SATURATION_POOR; - static const float FOOD_SATURATION_LOW; - static const float FOOD_SATURATION_NORMAL; - static const float FOOD_SATURATION_GOOD; - static const float FOOD_SATURATION_MAX; - static const float FOOD_SATURATION_SUPERNATURAL; + // some saturation guidelines + static const float FOOD_SATURATION_POOR; + static const float FOOD_SATURATION_LOW; + static const float FOOD_SATURATION_NORMAL; + static const float FOOD_SATURATION_GOOD; + static const float FOOD_SATURATION_MAX; + static const float FOOD_SATURATION_SUPERNATURAL; - // some exhaustion guidelines - static const float EXHAUSTION_JUMP; - static const float EXHAUSTION_SPRINT_JUMP; - static const float EXHAUSTION_MINE; - static const float EXHAUSTION_ATTACK; - static const float EXHAUSTION_DAMAGE; - static const float EXHAUSTION_WALK; - static const float EXHAUSTION_SPRINT; - static const float EXHAUSTION_SWIM; + // some exhaustion guidelines + static const float EXHAUSTION_HEAL; + static const float EXHAUSTION_JUMP; + static const float EXHAUSTION_SPRINT_JUMP; + static const float EXHAUSTION_MINE; + static const float EXHAUSTION_ATTACK; + static const float EXHAUSTION_DAMAGE; + static const float EXHAUSTION_WALK; + static const float EXHAUSTION_SPRINT; + static const float EXHAUSTION_SWIM; }; \ No newline at end of file diff --git a/Minecraft.World/FoodData.cpp b/Minecraft.World/FoodData.cpp index 79ef0fc1..ab0ced84 100644 --- a/Minecraft.World/FoodData.cpp +++ b/Minecraft.World/FoodData.cpp @@ -13,9 +13,9 @@ FoodData::FoodData() exhaustionLevel = 0; tickTimer = 0; - this->foodLevel = FoodConstants::MAX_FOOD; - this->lastFoodLevel = FoodConstants::MAX_FOOD; - this->saturationLevel = FoodConstants::START_SATURATION; + foodLevel = FoodConstants::MAX_FOOD; + lastFoodLevel = FoodConstants::MAX_FOOD; + saturationLevel = FoodConstants::START_SATURATION; } void FoodData::eat(int food, float saturationModifier) @@ -50,9 +50,9 @@ void FoodData::tick(shared_ptr player) } } - // 4J Added - Allow host to disable using hunger. We don't deplete the hunger bar due to exhaustion - // but I think we should deplete it to heal - if(player->isAllowedToIgnoreExhaustion()) + // 4J: Added - Allow host to disable using hunger. We don't deplete the hunger bar due to exhaustion + // but I think we should deplete it to heal. Don't heal if natural regen is disabled + if(player->isAllowedToIgnoreExhaustion() && player->level->getGameRules()->getBoolean(GameRules::RULE_NATURAL_REGENERATION)) { if(foodLevel > 0 && player->isHurt()) { @@ -65,12 +65,13 @@ void FoodData::tick(shared_ptr player) } } } - else if (foodLevel >= FoodConstants::HEAL_LEVEL && player->isHurt()) + else if (player->level->getGameRules()->getBoolean(GameRules::RULE_NATURAL_REGENERATION) && foodLevel >= FoodConstants::HEAL_LEVEL && player->isHurt()) { tickTimer++; if (tickTimer >= FoodConstants::HEALTH_TICK_COUNT) { player->heal(1); + addExhaustion(FoodConstants::EXHAUSTION_HEAL); tickTimer = 0; } } @@ -145,15 +146,15 @@ float FoodData::getSaturationLevel() void FoodData::setFoodLevel(int food) { - this->foodLevel = food; + foodLevel = food; } void FoodData::setSaturation(float saturation) { - this->saturationLevel = saturation; + saturationLevel = saturation; } void FoodData::setExhaustion(float exhaustion) { - this->exhaustionLevel = exhaustion; + exhaustionLevel = exhaustion; } \ No newline at end of file diff --git a/Minecraft.World/FoodItem.cpp b/Minecraft.World/FoodItem.cpp index f5304cb9..557404cb 100644 --- a/Minecraft.World/FoodItem.cpp +++ b/Minecraft.World/FoodItem.cpp @@ -38,7 +38,7 @@ shared_ptr FoodItem::useTimeDepleted(shared_ptr inst instance->count--; player->getFoodData()->eat(this); // 4J - new sound brought forward from 1.2.3 - level->playSound(player, eSoundType_RANDOM_BURP, 0.5f, level->random->nextFloat() * 0.1f + 0.9f); + level->playEntitySound(player, eSoundType_RANDOM_BURP, 0.5f, level->random->nextFloat() * 0.1f + 0.9f); addEatEffect(instance, level, player); diff --git a/Minecraft.World/FoodRecipies.cpp b/Minecraft.World/FoodRecipies.cpp index 1497cd41..e78700f4 100644 --- a/Minecraft.World/FoodRecipies.cpp +++ b/Minecraft.World/FoodRecipies.cpp @@ -14,38 +14,31 @@ void FoodRecipies::addRecipes(Recipes *r) L"###", // L"#X#", // L"###", // - L'#', Item::goldNugget, L'X', Item::apple, + L'#', Item::goldIngot, L'X', Item::apple, + L'F'); + + r->addShapedRecipy(new ItemInstance(Item::apple_gold, 1, 1), // + L"sssctcig", + L"###", // + L"#X#", // + L"###", // + L'#', Tile::goldBlock, L'X', Item::apple, + L'F'); + + r->addShapedRecipy(new ItemInstance(Item::speckledMelon, 1), // + L"ssscicig", + L"###", // + L"#X#", // + L"###", // + + L'#', Item::goldNugget, L'X', Item::melon, L'F'); - // 4J-PB - Moving the mushroom stew shaped->shapeless forward from 1.9, so it will not need the crafting table r->addShapelessRecipy(new ItemInstance(Item::mushroomStew), L"ttig", - Tile::mushroom1, Tile::mushroom2, Item::bowl, + Tile::mushroom_brown, Tile::mushroom_red, Item::bowl, L'F'); - - /*r->addShapedRecipy(new ItemInstance(Item::mushroomStew), // - L"sssctctcig", - L"Y", // - L"X", // - L"#", // - - L'X', Tile::mushroom1, - L'Y', Tile::mushroom2, - L'#', Item::bowl, - L'F');*/ - - // 4J-PB - removing for the xbox game - we already have it above -// r->addShapedRecipy(new ItemInstance(Item::mushroomStew), // -// L"sssctctcig", -// L"Y", // -// L"X", // -// L"#", // -// -// L'X', Tile::mushroom2, -// L'Y', Tile::mushroom1, -// L'#', Item::bowl, -// L'F'); -// + r->addShapedRecipy(new ItemInstance(Item::cookie, 8), // L"sczcig", L"#X#", // @@ -82,14 +75,6 @@ void FoodRecipies::addRecipes(Recipes *r) Tile::pumpkin, Item::sugar, Item::egg, L'F'); - r->addShapedRecipy(new ItemInstance(Item::apple_gold, 1, 1), // - L"sssctcig", - L"###", // - L"#X#", // - L"###", // - L'#', Tile::goldBlock, L'X', Item::apple, - L'F'); - r->addShapedRecipy(new ItemInstance(Item::carrotGolden, 1, 0), // L"ssscicig", L"###", // @@ -101,12 +86,7 @@ void FoodRecipies::addRecipes(Recipes *r) r->addShapelessRecipy(new ItemInstance(Item::fermentedSpiderEye), // L"itig", - Item::spiderEye, Tile::mushroom1, Item::sugar, - L'F'); - - r->addShapelessRecipy(new ItemInstance(Item::speckledMelon), // - L"iig", - Item::melon, Item::goldNugget, + Item::spiderEye, Tile::mushroom_brown, Item::sugar, L'F'); r->addShapelessRecipy(new ItemInstance(Item::blazePowder, 2), // diff --git a/Minecraft.World/FurnaceMenu.cpp b/Minecraft.World/FurnaceMenu.cpp index dca02231..2a6ebc63 100644 --- a/Minecraft.World/FurnaceMenu.cpp +++ b/Minecraft.World/FurnaceMenu.cpp @@ -45,8 +45,8 @@ void FurnaceMenu::broadcastChanges() { AbstractContainerMenu::broadcastChanges(); - AUTO_VAR(itEnd, containerListeners->end()); - for (AUTO_VAR(it, containerListeners->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, containerListeners.end()); + for (AUTO_VAR(it, containerListeners.begin()); it != itEnd; it++) { ContainerListener *listener = *it; //containerListeners->at(i); if (tc != furnace->tickCount) @@ -83,7 +83,7 @@ bool FurnaceMenu::stillValid(shared_ptr player) shared_ptr FurnaceMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); //Slot *IngredientSlot = slots->at(INGREDIENT_SLOT); bool charcoalUsed = furnace->wasCharcoalUsed(); @@ -160,11 +160,11 @@ shared_ptr FurnaceMenu::quickMoveStack(shared_ptr player, return clicked; } -shared_ptr FurnaceMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) +shared_ptr FurnaceMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped) // 4J Added looped param { bool charcoalUsed = furnace->wasCharcoalUsed(); - shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); + shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player, looped); #ifdef _EXTENDED_ACHIEVEMENTS if ( charcoalUsed && (out!=nullptr) && (buttonNum==0 || buttonNum==1) && clickType==CLICK_PICKUP diff --git a/Minecraft.World/FurnaceMenu.h b/Minecraft.World/FurnaceMenu.h index 72b264d3..6eaf98e6 100644 --- a/Minecraft.World/FurnaceMenu.h +++ b/Minecraft.World/FurnaceMenu.h @@ -34,5 +34,6 @@ public: virtual bool stillValid(shared_ptr player); virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); - virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); + // 4J Added looped param + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped = false); }; diff --git a/Minecraft.World/FurnaceRecipes.cpp b/Minecraft.World/FurnaceRecipes.cpp index 49ded1f5..af59884c 100644 --- a/Minecraft.World/FurnaceRecipes.cpp +++ b/Minecraft.World/FurnaceRecipes.cpp @@ -25,14 +25,14 @@ FurnaceRecipes::FurnaceRecipes() addFurnaceRecipy(Item::beef_raw_Id, new ItemInstance(Item::beef_cooked), .35f); addFurnaceRecipy(Item::chicken_raw_Id, new ItemInstance(Item::chicken_cooked), .35f); addFurnaceRecipy(Item::fish_raw_Id, new ItemInstance(Item::fish_cooked), .35f); - addFurnaceRecipy(Tile::stoneBrick_Id, new ItemInstance(Tile::rock), .1f); + addFurnaceRecipy(Tile::cobblestone_Id, new ItemInstance(Tile::stone), .1f); addFurnaceRecipy(Item::clay_Id, new ItemInstance(Item::brick), .3f); + addFurnaceRecipy(Tile::clay_Id, new ItemInstance(Tile::clayHardened), .35f); addFurnaceRecipy(Tile::cactus_Id, new ItemInstance(Item::dye_powder, 1, DyePowderItem::GREEN), .2f); addFurnaceRecipy(Tile::treeTrunk_Id, new ItemInstance(Item::coal, 1, CoalItem::CHAR_COAL), .15f); addFurnaceRecipy(Tile::emeraldOre_Id, new ItemInstance(Item::emerald), 1); addFurnaceRecipy(Item::potato_Id, new ItemInstance(Item::potatoBaked), .35f); - // 4J - TU9 - add in smelting netherrack - addFurnaceRecipy(Tile::hellRock_Id, new ItemInstance(Item::netherbrick), .1f); + addFurnaceRecipy(Tile::netherRack_Id, new ItemInstance(Item::netherbrick), .1f); // special silk touch related recipes: addFurnaceRecipy(Tile::coalOre_Id, new ItemInstance(Item::coal), .1f); diff --git a/Minecraft.World/FurnaceTile.cpp b/Minecraft.World/FurnaceTile.cpp index ea0f84e8..d22d6ca7 100644 --- a/Minecraft.World/FurnaceTile.cpp +++ b/Minecraft.World/FurnaceTile.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.inventory.h" #include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.h" #include "FurnaceTile.h" @@ -11,7 +12,7 @@ bool FurnaceTile::noDrop = false; -FurnaceTile::FurnaceTile(int id, bool lit) : EntityTile(id, Material::stone) +FurnaceTile::FurnaceTile(int id, bool lit) : BaseEntityTile(id, Material::stone) { random = new Random(); this->lit = lit; @@ -27,7 +28,7 @@ int FurnaceTile::getResource(int data, Random *random, int playerBonusLevel) void FurnaceTile::onPlace(Level *level, int x, int y, int z) { - EntityTile::onPlace(level, x, y, z); + BaseEntityTile::onPlace(level, x, y, z); recalcLockDir(level, x, y, z); } @@ -48,7 +49,7 @@ void FurnaceTile::recalcLockDir(Level *level, int x, int y, int z) if (Tile::solid[s] && !Tile::solid[n]) lockDir = 2; if (Tile::solid[w] && !Tile::solid[e]) lockDir = 5; if (Tile::solid[e] && !Tile::solid[w]) lockDir = 4; - level->setData(x, y, z, lockDir); + level->setData(x, y, z, lockDir, Tile::UPDATE_CLIENTS); } Icon *FurnaceTile::getTexture(int face, int data) @@ -83,15 +84,18 @@ void FurnaceTile::animateTick(Level *level, int xt, int yt, int zt, Random *rand { level->addParticle(eParticleType_smoke, x - r, y, z + ss, 0, 0, 0); level->addParticle(eParticleType_flame, x - r, y, z + ss, 0, 0, 0); - } else if (dir == 5) + } + else if (dir == 5) { level->addParticle(eParticleType_smoke, x + r, y, z + ss, 0, 0, 0); level->addParticle(eParticleType_flame, x + r, y, z + ss, 0, 0, 0); - } else if (dir == 2) + } + else if (dir == 2) { level->addParticle(eParticleType_smoke, x + ss, y, z - r, 0, 0, 0); level->addParticle(eParticleType_flame, x + ss, y, z - r, 0, 0, 0); - } else if (dir == 3) + } + else if (dir == 3) { level->addParticle(eParticleType_smoke, x + ss, y, z + r, 0, 0, 0); level->addParticle(eParticleType_flame, x + ss, y, z + r, 0, 0, 0); @@ -123,11 +127,11 @@ void FurnaceTile::setLit(bool lit, Level *level, int x, int y, int z) shared_ptr te = level->getTileEntity(x, y, z); noDrop = true; - if (lit) level->setTile(x, y, z, Tile::furnace_lit_Id); - else level->setTile(x, y, z, Tile::furnace_Id); + if (lit) level->setTileAndUpdate(x, y, z, Tile::furnace_lit_Id); + else level->setTileAndUpdate(x, y, z, Tile::furnace_Id); noDrop = false; - level->setData(x, y, z, data); + level->setData(x, y, z, data, Tile::UPDATE_CLIENTS); if( te != NULL ) { te->clearRemoved(); @@ -140,14 +144,19 @@ shared_ptr FurnaceTile::newTileEntity(Level *level) return shared_ptr( new FurnaceTileEntity() ); } -void FurnaceTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void FurnaceTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3; - if (dir == 0) level->setData(x, y, z, Facing::NORTH); - if (dir == 1) level->setData(x, y, z, Facing::EAST); - if (dir == 2) level->setData(x, y, z, Facing::SOUTH); - if (dir == 3) level->setData(x, y, z, Facing::WEST); + if (dir == 0) level->setData(x, y, z, Facing::NORTH, Tile::UPDATE_CLIENTS); + if (dir == 1) level->setData(x, y, z, Facing::EAST, Tile::UPDATE_CLIENTS); + if (dir == 2) level->setData(x, y, z, Facing::SOUTH, Tile::UPDATE_CLIENTS); + if (dir == 3) level->setData(x, y, z, Facing::WEST, Tile::UPDATE_CLIENTS); + + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } } void FurnaceTile::onRemove(Level *level, int x, int y, int z, int id, int data) @@ -201,8 +210,24 @@ void FurnaceTile::onRemove(Level *level, int x, int y, int z, int id, int data) container->setItem(i,nullptr); } } + level->updateNeighbourForOutputSignal(x, y, z, id); } } - EntityTile::onRemove(level, x, y, z, id, data); + BaseEntityTile::onRemove(level, x, y, z, id, data); + +} +bool FurnaceTile::hasAnalogOutputSignal() +{ + return true; +} + +int FurnaceTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + return AbstractContainerMenu::getRedstoneSignalFromContainer(dynamic_pointer_cast( level->getTileEntity(x, y, z)) ); } + +int FurnaceTile::cloneTileId(Level *level, int x, int y, int z) +{ + return Tile::furnace_Id; +} \ No newline at end of file diff --git a/Minecraft.World/FurnaceTile.h b/Minecraft.World/FurnaceTile.h index c192f94d..a868863f 100644 --- a/Minecraft.World/FurnaceTile.h +++ b/Minecraft.World/FurnaceTile.h @@ -1,19 +1,19 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" class Mob; class Player; class Random; class ChunkRebuildData; -class FurnaceTile : public EntityTile +class FurnaceTile : public BaseEntityTile { friend class Tile; friend class ChunkRebuildData; private: Random *random; - bool lit; - static bool noDrop; + bool lit; + static bool noDrop; Icon *iconTop; Icon *iconFront; @@ -21,19 +21,23 @@ protected: FurnaceTile(int id, bool lit); public: virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual void onPlace(Level *level, int x, int y, int z); + virtual void onPlace(Level *level, int x, int y, int z); private: void recalcLockDir(Level *level, int x, int y, int z); public: Icon *getTexture(int face, int data); - void registerIcons(IconRegister *iconRegister); - virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); + void registerIcons(IconRegister *iconRegister); + virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - static void setLit(bool lit, Level *level, int x, int y, int z); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + static void setLit(bool lit, Level *level, int x, int y, int z); protected: virtual shared_ptr newTileEntity(Level *level); public: - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); + virtual int cloneTileId(Level *level, int x, int y, int z); }; \ No newline at end of file diff --git a/Minecraft.World/FurnaceTileEntity.cpp b/Minecraft.World/FurnaceTileEntity.cpp index 0f18528c..a11e8527 100644 --- a/Minecraft.World/FurnaceTileEntity.cpp +++ b/Minecraft.World/FurnaceTileEntity.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.crafting.h" @@ -8,40 +9,43 @@ #include "Material.h" #include "FurnaceTileEntity.h" +int furnaceSlotsForUp [] = { FurnaceTileEntity::SLOT_INPUT }; +int furnaceSlotsForDown [] = { FurnaceTileEntity::SLOT_RESULT, FurnaceTileEntity::SLOT_FUEL }; +int furnaceSlotsForSides [] = { FurnaceTileEntity::SLOT_FUEL }; +const intArray FurnaceTileEntity::SLOTS_FOR_UP = intArray(furnaceSlotsForUp, 1); +const intArray FurnaceTileEntity::SLOTS_FOR_DOWN = intArray(furnaceSlotsForDown, 2); +const intArray FurnaceTileEntity::SLOTS_FOR_SIDES = intArray(furnaceSlotsForSides, 1); const int FurnaceTileEntity::BURN_INTERVAL = 10 * 20; // 4J Stu - Need a ctor to initialise member variables FurnaceTileEntity::FurnaceTileEntity() : TileEntity() { - items = new ItemInstanceArray(3); + items = ItemInstanceArray(3); litTime = 0; - litDuration = 0; - tickCount = 0; - m_charcoalUsed = false; + name = L""; } FurnaceTileEntity::~FurnaceTileEntity() { - delete[] items->data; - delete items; + delete[] items.data; } unsigned int FurnaceTileEntity::getContainerSize() { - return items->length; + return items.length; } shared_ptr FurnaceTileEntity::getItem(unsigned int slot) { - return (*items)[slot]; + return items[slot]; } @@ -49,20 +53,20 @@ shared_ptr FurnaceTileEntity::removeItem(unsigned int slot, int co { m_charcoalUsed = false; - if ((*items)[slot] != NULL) + if (items[slot] != NULL) { - if ((*items)[slot]->count <= count) + if (items[slot]->count <= count) { - shared_ptr item = (*items)[slot]; - (*items)[slot] = nullptr; + shared_ptr item = items[slot]; + items[slot] = nullptr; // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; } else { - shared_ptr i = (*items)[slot]->remove(count); - if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; + shared_ptr i = items[slot]->remove(count); + if (items[slot]->count == 0) items[slot] = nullptr; // 4J Stu - Fix for duplication glitch if(i->count <= 0) return nullptr; return i; @@ -75,10 +79,10 @@ shared_ptr FurnaceTileEntity::removeItemNoUpdate(int slot) { m_charcoalUsed = false; - if (items->data[slot] != NULL) + if (items[slot] != NULL) { - shared_ptr item = items->data[slot]; - items->data[slot] = nullptr; + shared_ptr item = items[slot]; + items[slot] = nullptr; return item; } return nullptr; @@ -87,32 +91,48 @@ shared_ptr FurnaceTileEntity::removeItemNoUpdate(int slot) void FurnaceTileEntity::setItem(unsigned int slot, shared_ptr item) { - (*items)[slot] = item; + items[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); } -int FurnaceTileEntity::getName() +wstring FurnaceTileEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_TILE_FURNACE); +} + +wstring FurnaceTileEntity::getCustomName() { - return IDS_TILE_FURNACE; + return hasCustomName() ? name : L""; +} + +bool FurnaceTileEntity::hasCustomName() +{ + return !name.empty(); +} + +void FurnaceTileEntity::setCustomName(const wstring &name) +{ + this->name = name; } void FurnaceTileEntity::load(CompoundTag *base) { TileEntity::load(base); ListTag *inventoryList = (ListTag *) base->getList(L"Items"); - items = new ItemInstanceArray(getContainerSize()); + delete[] items.data; + items = ItemInstanceArray(getContainerSize()); for (int i = 0; i < inventoryList->size(); i++) { CompoundTag *tag = inventoryList->get(i); unsigned int slot = tag->getByte(L"Slot"); - if (slot >= 0 && slot < items->length) (*items)[slot] = ItemInstance::fromTag(tag); + if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); } litTime = base->getShort(L"BurnTime"); tickCount = base->getShort(L"CookTime"); - litDuration = getBurnDuration((*items)[FUEL_SLOT]); - + litDuration = getBurnDuration(items[SLOT_FUEL]); + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); m_charcoalUsed = base->getBoolean(L"CharcoalUsed"); } @@ -124,18 +144,18 @@ void FurnaceTileEntity::save(CompoundTag *base) base->putShort(L"CookTime", (short) (tickCount)); ListTag *listTag = new ListTag(); - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if ((*items)[i] != NULL) + if (items[i] != NULL) { CompoundTag *tag = new CompoundTag(); tag->putByte(L"Slot", (byte) i); - (*items)[i]->save(tag); + items[i]->save(tag); listTag->add(tag); } } base->put(L"Items", listTag); - + if (hasCustomName()) base->putString(L"CustomName", name); base->putBoolean(L"CharcoalUsed", m_charcoalUsed); } @@ -178,24 +198,24 @@ void FurnaceTileEntity::tick() { if (litTime == 0 && canBurn()) { - litDuration = litTime = getBurnDuration((*items)[FUEL_SLOT]); + litDuration = litTime = getBurnDuration(items[SLOT_FUEL]); if (litTime > 0) { changed = true; - if ((*items)[FUEL_SLOT] != NULL) + if (items[SLOT_FUEL] != NULL) { // 4J Added: Keep track of whether charcoal was used in production of current stack. - if ( (*items)[FUEL_SLOT]->getItem()->id == Item::coal_Id - && (*items)[FUEL_SLOT]->getAuxValue() == CoalItem::CHAR_COAL) + if ( items[SLOT_FUEL]->getItem()->id == Item::coal_Id + && items[SLOT_FUEL]->getAuxValue() == CoalItem::CHAR_COAL) { m_charcoalUsed = true; } - (*items)[FUEL_SLOT]->count--; - if ((*items)[FUEL_SLOT]->count == 0) + items[SLOT_FUEL]->count--; + if (items[SLOT_FUEL]->count == 0) { - Item *remaining = (*items)[FUEL_SLOT]->getItem()->getCraftingRemainingItem(); - (*items)[FUEL_SLOT] = remaining != NULL ? shared_ptr(new ItemInstance(remaining)) : nullptr; + Item *remaining = items[SLOT_FUEL]->getItem()->getCraftingRemainingItem(); + items[SLOT_FUEL] = remaining != NULL ? shared_ptr(new ItemInstance(remaining)) : nullptr; } } } @@ -229,13 +249,13 @@ void FurnaceTileEntity::tick() bool FurnaceTileEntity::canBurn() { - if ((*items)[INPUT_SLOT] == NULL) return false; - ItemInstance *burnResult = FurnaceRecipes::getInstance()->getResult((*items)[0]->getItem()->id); + if (items[SLOT_INPUT] == NULL) return false; + ItemInstance *burnResult = FurnaceRecipes::getInstance()->getResult(items[SLOT_INPUT]->getItem()->id); if (burnResult == NULL) return false; - if ((*items)[RESULT_SLOT] == NULL) return true; - if (!(*items)[RESULT_SLOT]->sameItem_not_shared(burnResult)) return false; - if ((*items)[RESULT_SLOT]->count < getMaxStackSize() && (*items)[RESULT_SLOT]->count < (*items)[RESULT_SLOT]->getMaxStackSize()) return true; - if ((*items)[RESULT_SLOT]->count < burnResult->getMaxStackSize()) return true; + if (items[SLOT_RESULT] == NULL) return true; + if (!items[SLOT_RESULT]->sameItem_not_shared(burnResult)) return false; + if (items[SLOT_RESULT]->count < getMaxStackSize() && items[SLOT_RESULT]->count < items[SLOT_RESULT]->getMaxStackSize()) return true; + if (items[SLOT_RESULT]->count < burnResult->getMaxStackSize()) return true; return false; } @@ -244,12 +264,12 @@ void FurnaceTileEntity::burn() { if (!canBurn()) return; - ItemInstance *result = FurnaceRecipes::getInstance()->getResult((*items)[0]->getItem()->id); - if ((*items)[RESULT_SLOT] == NULL) (*items)[RESULT_SLOT] = result->copy(); - else if ((*items)[RESULT_SLOT]->id == result->id) (*items)[RESULT_SLOT]->count++; + ItemInstance *result = FurnaceRecipes::getInstance()->getResult(items[SLOT_INPUT]->getItem()->id); + if (items[SLOT_RESULT] == NULL) items[SLOT_RESULT] = result->copy(); + else if (items[SLOT_RESULT]->id == result->id) items[SLOT_RESULT]->count++; - (*items)[INPUT_SLOT]->count--; - if ((*items)[INPUT_SLOT]->count <= 0) (*items)[INPUT_SLOT] = nullptr; + items[SLOT_INPUT]->count--; + if (items[SLOT_INPUT]->count <= 0) items[SLOT_INPUT] = nullptr; } @@ -273,6 +293,11 @@ int FurnaceTileEntity::getBurnDuration(shared_ptr itemInstance) { return BURN_INTERVAL * 3 / 2; } + + if (tile == Tile::coalBlock) + { + return BURN_INTERVAL * 8 * 10; + } } if (dynamic_cast(item) && ((DiggerItem *) item)->getTier() == Item::Tier::WOOD) @@ -329,6 +354,45 @@ void FurnaceTileEntity::stopOpen() { } +bool FurnaceTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + if (slot == SLOT_RESULT) return false; + if (slot == SLOT_FUEL) return isFuel(item); + return true; +} + +intArray FurnaceTileEntity::getSlotsForFace(int face) +{ + if (face == Facing::DOWN) + { + return SLOTS_FOR_DOWN; + } + else if (face == Facing::UP) + { + return SLOTS_FOR_UP; + } + else + { + return SLOTS_FOR_SIDES; + } +} + +bool FurnaceTileEntity::canPlaceItemThroughFace(int slot, shared_ptr item, int face) +{ + return canPlaceItem(slot, item); + +} + +bool FurnaceTileEntity::canTakeItemThroughFace(int slot, shared_ptr item, int face) +{ + if (face == Facing::DOWN && slot == SLOT_FUEL) + { + if (item->id != Item::bucket_empty_Id) return false; + } + + return true; +} + // 4J Added shared_ptr FurnaceTileEntity::clone() { @@ -339,11 +403,11 @@ shared_ptr FurnaceTileEntity::clone() result->tickCount = tickCount; result->litDuration = litDuration; - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if ((*items)[i] != NULL) + if (items[i] != NULL) { - (*result->items)[i] = ItemInstance::clone((*items)[i]); + result->items[i] = ItemInstance::clone(items[i]); } } return result; diff --git a/Minecraft.World/FurnaceTileEntity.h b/Minecraft.World/FurnaceTileEntity.h index db39452e..2907a4ca 100644 --- a/Minecraft.World/FurnaceTileEntity.h +++ b/Minecraft.World/FurnaceTileEntity.h @@ -3,28 +3,30 @@ using namespace std; #include "FurnaceTile.h" #include "TileEntity.h" -#include "Container.h" +#include "WorldlyContainer.h" class Player; class Level; -class FurnaceTileEntity : public TileEntity, public Container +class FurnaceTileEntity : public TileEntity, public WorldlyContainer { public: eINSTANCEOF GetType() { return eTYPE_FURNACETILEENTITY; } static TileEntity *create() { return new FurnaceTileEntity(); } -using TileEntity::setChanged; + using TileEntity::setChanged; + + static const int SLOT_INPUT = 0; + static const int SLOT_FUEL = 1; + static const int SLOT_RESULT = 2; private: - static const int BURN_INTERVAL; - ItemInstanceArray *items; + static const intArray SLOTS_FOR_UP; + static const intArray SLOTS_FOR_DOWN; + static const intArray SLOTS_FOR_SIDES; - enum { - INPUT_SLOT = 0, - FUEL_SLOT, - RESULT_SLOT, - }; + static const int BURN_INTERVAL; + ItemInstanceArray items; // 4J-JEV: Added for 'Renewable Energy' achievement. // Should be true iff characoal was consumed whilst cooking the current stack. @@ -35,6 +37,10 @@ public: int litDuration; int tickCount; +private: + + wstring name; + public: // 4J Stu - Need a ctor to initialise member variables FurnaceTileEntity(); @@ -45,7 +51,10 @@ public: virtual shared_ptr removeItem(unsigned int slot, int count); virtual shared_ptr removeItemNoUpdate(int slot); virtual void setItem(unsigned int slot, shared_ptr item); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); virtual int getMaxStackSize(); @@ -67,8 +76,13 @@ public: virtual bool stillValid(shared_ptr player); virtual void setChanged(); - void startOpen(); - void stopOpen(); + void startOpen(); + void stopOpen(); + + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual intArray getSlotsForFace(int face); + virtual bool canPlaceItemThroughFace(int slot, shared_ptr item, int face); + virtual bool canTakeItemThroughFace(int slot, shared_ptr item, int face); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/GameDifficultyCommand.h b/Minecraft.World/GameDifficultyCommand.h new file mode 100644 index 00000000..ffa0cc2d --- /dev/null +++ b/Minecraft.World/GameDifficultyCommand.h @@ -0,0 +1,75 @@ +/* +package net.minecraft.commands.common; + +import java.util.List; + +import net.minecraft.commands.*; +import net.minecraft.commands.exceptions.UsageException; +import net.minecraft.locale.I18n; +import net.minecraft.network.chat.ChatMessageComponent; +import net.minecraft.server.MinecraftServer; + +public class GameDifficultyCommand extends BaseCommand { + + // note: copied from Options.java, move to shared location? + private static final String[] DIFFICULTY_NAMES = { + "options.difficulty.peaceful", "options.difficulty.easy", "options.difficulty.normal", "options.difficulty.hard" + }; + + @Override + public String getName() { + return "difficulty"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + + @Override + public String getUsage(CommandSender source) { + return "commands.difficulty.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + if (args.length > 0) { + int newDiff = getDifficultyForString(source, args[0]); + + MinecraftServer.getInstance().setDifficulty(newDiff); + + logAdminAction(source, "commands.difficulty.success", ChatMessageComponent.forTranslation(DIFFICULTY_NAMES[newDiff])); + + return; + } + + throw new UsageException("commands.difficulty.usage"); + } + + protected int getDifficultyForString(CommandSender source, String name) { + if (name.equalsIgnoreCase("peaceful") || name.equalsIgnoreCase("p")) { + return 0; + } else if (name.equalsIgnoreCase("easy") || name.equalsIgnoreCase("e")) { + return 1; + } else if (name.equalsIgnoreCase("normal") || name.equalsIgnoreCase("n")) { + return 2; + } else if (name.equalsIgnoreCase("hard") || name.equalsIgnoreCase("h")) { + return 3; + } else { + return convertArgToInt(source, name, 0, 3); + } + } + + @Override + public List matchArguments(CommandSender source, String[] args) { + if (args.length == 1) { + return matchArguments(args, "peaceful", "easy", "normal", "hard"); + } + + return null; + } + +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/GameModeCommand.cpp b/Minecraft.World/GameModeCommand.cpp index 86d4c5a5..f8c1ffb6 100644 --- a/Minecraft.World/GameModeCommand.cpp +++ b/Minecraft.World/GameModeCommand.cpp @@ -7,23 +7,32 @@ EGameCommand GameModeCommand::getId() return eGameCommand_GameMode; } +int GameModeCommand::getPermissionLevel() +{ + return LEVEL_GAMEMASTERS; +} + void GameModeCommand::execute(shared_ptr source, byteArray commandData) { - //if (args.length > 0) - //{ + //if (args.length > 0) { // GameType newMode = getModeForString(source, args[0]); - // Player player = args.length >= 2 ? getPlayer(args[1]) : convertSourceToPlayer(source); + // Player player = args.length >= 2 ? convertToPlayer(source, args[1]) : convertSourceToPlayer(source); // player.setGameMode(newMode); + // player.fallDistance = 0; // reset falldistance so flying people do not die :P - // String mode = I18n.get("gameMode." + newMode.getName()); + // ChatMessageComponent mode = ChatMessageComponent.forTranslation("gameMode." + newMode.getName()); // if (player != source) { // logAdminAction(source, AdminLogCommand.LOGTYPE_DONT_SHOW_TO_SELF, "commands.gamemode.success.other", player.getAName(), mode); // } else { // logAdminAction(source, AdminLogCommand.LOGTYPE_DONT_SHOW_TO_SELF, "commands.gamemode.success.self", mode); // } + + // return; //} + + //throw new UsageException("commands.gamemode.usage"); } GameType *GameModeCommand::getModeForString(shared_ptr source, const wstring &name) @@ -38,16 +47,4 @@ GameType *GameModeCommand::getModeForString(shared_ptr source, co //} else { // return LevelSettings.validateGameType(convertArgToInt(source, name, 0, GameType.values().length - 2)); //} -} - -shared_ptr GameModeCommand::getPlayer(PlayerUID playerId) -{ - return nullptr; - //Player player = MinecraftServer.getInstance().getPlayers().getPlayer(name); - - //if (player == null) { - // throw new PlayerNotFoundException(); - //} else { - // return player; - //} } \ No newline at end of file diff --git a/Minecraft.World/GameModeCommand.h b/Minecraft.World/GameModeCommand.h index 66401587..302be9f5 100644 --- a/Minecraft.World/GameModeCommand.h +++ b/Minecraft.World/GameModeCommand.h @@ -8,9 +8,9 @@ class GameModeCommand : public Command { public: virtual EGameCommand getId(); + int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData); protected: GameType *getModeForString(shared_ptr source, const wstring &name); - shared_ptr getPlayer(PlayerUID playerId); }; \ No newline at end of file diff --git a/Minecraft.World/GameRuleCommand.h b/Minecraft.World/GameRuleCommand.h new file mode 100644 index 00000000..25cf12ce --- /dev/null +++ b/Minecraft.World/GameRuleCommand.h @@ -0,0 +1,83 @@ +/* +package net.minecraft.commands.common; + +import net.minecraft.commands.BaseCommand; +import net.minecraft.commands.CommandSender; +import net.minecraft.commands.exceptions.UsageException; +import net.minecraft.network.chat.ChatMessageComponent; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.GameRules; + +import java.util.List; + +public class GameRuleCommand extends BaseCommand { + @Override + public String getName() { + return "gamerule"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + + @Override + public String getUsage(CommandSender source) { + return "commands.gamerule.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + if (args.length == 2) { + String rule = args[0]; + String value = args[1]; + + GameRules rules = getRules(); + + if (rules.contains(rule)) { + rules.set(rule, value); + logAdminAction(source, "commands.gamerule.success"); + } else { + logAdminAction(source, "commands.gamerule.norule", rule); + } + + return; + } else if (args.length == 1) { + String rule = args[0]; + GameRules rules = getRules(); + + if (rules.contains(rule)) { + String value = rules.get(rule); + source.sendMessage(ChatMessageComponent.forPlainText(rule).addPlainText(" = ").addPlainText(value)); + } else { + logAdminAction(source, "commands.gamerule.norule", rule); + } + + return; + } else if (args.length == 0) { + GameRules rules = getRules(); + source.sendMessage(ChatMessageComponent.forPlainText(joinStrings(rules.getRuleNames()))); + return; + } + + throw new UsageException("commands.gamerule.usage"); + } + + @Override + public List matchArguments(CommandSender source, String[] args) { + if (args.length == 1) { + return matchArguments(args, getRules().getRuleNames()); + } else if (args.length == 2) { + return matchArguments(args, "true", "false"); + } + + return null; + } + + private GameRules getRules() { + return MinecraftServer.getInstance().getLevel(0).getGameRules(); + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/GameRules.cpp b/Minecraft.World/GameRules.cpp new file mode 100644 index 00000000..0e594520 --- /dev/null +++ b/Minecraft.World/GameRules.cpp @@ -0,0 +1,193 @@ +#include "stdafx.h" + +#include "GameRules.h" + +// 4J: GameRules isn't in use anymore, just routes any requests to app game host options, kept things commented out for context + +const int GameRules::RULE_DOFIRETICK = 0; +const int GameRules::RULE_MOBGRIEFING = 1; +const int GameRules::RULE_KEEPINVENTORY = 2; +const int GameRules::RULE_DOMOBSPAWNING = 3; +const int GameRules::RULE_DOMOBLOOT = 4; +const int GameRules::RULE_DOTILEDROPS = 5; +//const int GameRules::RULE_COMMANDBLOCKOUTPUT = 6; +const int GameRules::RULE_NATURAL_REGENERATION = 7; +const int GameRules::RULE_DAYLIGHT = 8; + +GameRules::GameRules() +{ + /*registerRule(RULE_DOFIRETICK, L"1"); + registerRule(RULE_MOBGRIEFING, L"1"); + registerRule(RULE_KEEPINVENTORY, L"0"); + registerRule(RULE_DOMOBSPAWNING, L"1"); + registerRule(RULE_DOMOBLOOT, L"1"); + registerRule(RULE_DOTILEDROPS, L"1"); + registerRule(RULE_COMMANDBLOCKOUTPUT, L"1"); + registerRule(RULE_NATURAL_REGENERATION, L"1"); + registerRule(RULE_DAYLIGHT, L"1");*/ +} + +GameRules::~GameRules() +{ + /*for(AUTO_VAR(it,rules.begin()); it != rules.end(); ++it) + { + delete it->second; + }*/ +} + +bool GameRules::getBoolean(const int rule) +{ + switch(rule) + { + case GameRules::RULE_DOFIRETICK: + return app.GetGameHostOption(eGameHostOption_FireSpreads); + case GameRules::RULE_MOBGRIEFING: + return app.GetGameHostOption(eGameHostOption_MobGriefing); + case GameRules::RULE_KEEPINVENTORY: + return app.GetGameHostOption(eGameHostOption_KeepInventory); + case GameRules::RULE_DOMOBSPAWNING: + return app.GetGameHostOption(eGameHostOption_DoMobSpawning); + case GameRules::RULE_DOMOBLOOT: + return app.GetGameHostOption(eGameHostOption_DoMobLoot); + case GameRules::RULE_DOTILEDROPS: + return app.GetGameHostOption(eGameHostOption_DoTileDrops); + case GameRules::RULE_NATURAL_REGENERATION: + return app.GetGameHostOption(eGameHostOption_NaturalRegeneration); + case GameRules::RULE_DAYLIGHT: + return app.GetGameHostOption(eGameHostOption_DoDaylightCycle); + default: + assert(0); + return false; + } +} + +/* +void GameRules::registerRule(const wstring &name, const wstring &startValue) +{ + rules[name] = new GameRule(startValue); +} + +void GameRules::set(const wstring &ruleName, const wstring &newValue) +{ + AUTO_VAR(it, rules.find(ruleName)); + if(it != rules.end() ) + { + GameRule *gameRule = it->second; + gameRule->set(newValue); + } + else + { + registerRule(ruleName, newValue); + } +} + +wstring GameRules::get(const wstring &ruleName) +{ + AUTO_VAR(it, rules.find(ruleName)); + if(it != rules.end() ) + { + GameRule *gameRule = it->second; + return gameRule->get(); + } + return L""; +} + +int GameRules::getInt(const wstring &ruleName) +{ + AUTO_VAR(it, rules.find(ruleName)); + if(it != rules.end() ) + { + GameRule *gameRule = it->second; + return gameRule->getInt(); + } + return 0; +} + +double GameRules::getDouble(const wstring &ruleName) +{ + AUTO_VAR(it, rules.find(ruleName)); + if(it != rules.end() ) + { + GameRule *gameRule = it->second; + return gameRule->getDouble(); + } + return 0; +} + +CompoundTag *GameRules::createTag() +{ + CompoundTag *result = new CompoundTag(L"GameRules"); + + for(AUTO_VAR(it,rules.begin()); it != rules.end(); ++it) + { + GameRule *gameRule = it->second; + result->putString(it->first, gameRule->get()); + } + + return result; +} + +void GameRules::loadFromTag(CompoundTag *tag) +{ + vector *allTags = tag->getAllTags(); + for (AUTO_VAR(it, allTags->begin()); it != allTags->end(); ++it) + { + Tag *ruleTag = *it; + wstring ruleName = ruleTag->getName(); + wstring value = tag->getString(ruleTag->getName()); + + set(ruleName, value); + } + delete allTags; +} + +// Need to delete returned vector. +vector *GameRules::getRuleNames() +{ + vector *out = new vector(); + for (AUTO_VAR(it, rules.begin()); it != rules.end(); it++) out->push_back(it->first); + return out; +} + +bool GameRules::contains(const wstring &rule) +{ + AUTO_VAR(it, rules.find(rule)); + return it != rules.end(); +} + +GameRules::GameRule::GameRule(const wstring &startValue) +{ + value = L""; + booleanValue = false; + intValue = 0; + doubleValue = 0.0; + set(startValue); +} + +void GameRules::GameRule::set(const wstring &newValue) +{ + value = newValue; + booleanValue = _fromString(newValue); + intValue = _fromString(newValue); + doubleValue = _fromString(newValue); +} + +wstring GameRules::GameRule::get() +{ + return value; +} + +bool GameRules::GameRule::getBoolean() +{ + return booleanValue; +} + +int GameRules::GameRule::getInt() +{ + return intValue; +} + +double GameRules::GameRule::getDouble() +{ + return doubleValue; +}*/ \ No newline at end of file diff --git a/Minecraft.World/GameRules.h b/Minecraft.World/GameRules.h new file mode 100644 index 00000000..35eddc6c --- /dev/null +++ b/Minecraft.World/GameRules.h @@ -0,0 +1,56 @@ +#pragma once + +class GameRules +{ +private: + class GameRule + { + private: + wstring value; + bool booleanValue; + int intValue; + double doubleValue; + + public: + GameRule(const wstring &startValue); + + void set(const wstring &newValue); + wstring get(); + bool getBoolean(); + int getInt(); + double getDouble(); + }; + +public: + // 4J: Originally strings + // default rules + static const int RULE_DOFIRETICK; + static const int RULE_MOBGRIEFING; + static const int RULE_KEEPINVENTORY; + static const int RULE_DOMOBSPAWNING; + static const int RULE_DOMOBLOOT; + static const int RULE_DOTILEDROPS; + static const int RULE_COMMANDBLOCKOUTPUT; + static const int RULE_NATURAL_REGENERATION; + static const int RULE_DAYLIGHT; + +private: + unordered_map rules; + +public: + GameRules(); + ~GameRules(); + + bool getBoolean(const int rule); + + // 4J: Removed unused functions + /*void set(const wstring &ruleName, const wstring &newValue); + void registerRule(const wstring &name, const wstring &startValue); + wstring get(const wstring &ruleName); + int getInt(const wstring &ruleName); + double getDouble(const wstring &ruleName); + CompoundTag *createTag(); + void loadFromTag(CompoundTag *tag); + vector *getRuleNames(); + bool contains(const wstring &rule);*/ +}; \ No newline at end of file diff --git a/Minecraft.World/Ghast.cpp b/Minecraft.World/Ghast.cpp index fcf0b705..f0817791 100644 --- a/Minecraft.World/Ghast.cpp +++ b/Minecraft.World/Ghast.cpp @@ -3,8 +3,10 @@ #include "net.minecraft.world.phys.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.stats.h" @@ -17,6 +19,7 @@ void Ghast::_init() { + explosionPower = 1; floatDuration = 0; target = nullptr; retargetTime = 0; @@ -33,28 +36,31 @@ Ghast::Ghast(Level *level) : FlyingMob( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + _init(); - _init(); - - this->textureIdx = TN_MOB_GHAST; // 4J was L"/mob/ghast.png"; - this->setSize(4, 4); - this->fireImmune = true; + setSize(4, 4); + fireImmune = true; xpReward = Enemy::XP_REWARD_MEDIUM; } -bool Ghast::hurt(DamageSource *source, int dmg) +bool Ghast::isCharging() +{ + return entityData->getByte(DATA_IS_CHARGING) != 0; +} + +bool Ghast::hurt(DamageSource *source, float dmg) { + if (isInvulnerable()) return false; if (source->getMsgId() == ChatPacket::e_ChatDeathFireball) { - shared_ptr player = dynamic_pointer_cast( source->getEntity() ); - if (player != NULL) + if ( (source->getEntity() != NULL) && source->getEntity()->instanceof(eTYPE_PLAYER) ) { // reflected fireball, kill the ghast FlyingMob::hurt(source, 1000); - player->awardStat(GenericStats::ghast(),GenericStats::param_ghast()); + dynamic_pointer_cast(source->getEntity())->awardStat(GenericStats::ghast(), GenericStats::param_ghast()); return true; } } @@ -64,123 +70,118 @@ bool Ghast::hurt(DamageSource *source, int dmg) void Ghast::defineSynchedData() { - FlyingMob::defineSynchedData(); + FlyingMob::defineSynchedData(); - entityData->define(DATA_IS_CHARGING, (byte) 0); + entityData->define(DATA_IS_CHARGING, (byte) 0); } -int Ghast::getMaxHealth() +void Ghast::registerAttributes() { - return 10; -} + FlyingMob::registerAttributes(); -void Ghast::tick() -{ - FlyingMob::tick(); - byte current = entityData->getByte(DATA_IS_CHARGING); -// this->textureName = current == 1 ? L"/mob/ghast_fire.png" : L"/mob/ghast.png"; // 4J replaced with following line - this->textureIdx = current == 1 ? TN_MOB_GHAST_FIRE : TN_MOB_GHAST; + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(10); } void Ghast::serverAiStep() { - if (!level->isClientSide && level->difficulty == Difficulty::PEACEFUL) remove(); - checkDespawn(); + if (!level->isClientSide && level->difficulty == Difficulty::PEACEFUL) remove(); + checkDespawn(); - oCharge = charge; - double xd = xTarget - x; - double yd = yTarget - y; - double zd = zTarget - z; + oCharge = charge; + double xd = xTarget - x; + double yd = yTarget - y; + double zd = zTarget - z; - double dd = xd * xd + yd * yd + zd * zd; + double dd = xd * xd + yd * yd + zd * zd; - if (dd < 1 * 1 || dd > 60 * 60) + if (dd < 1 * 1 || dd > 60 * 60) { - xTarget = x + (random->nextFloat() * 2 - 1) * 16; - yTarget = y + (random->nextFloat() * 2 - 1) * 16; - zTarget = z + (random->nextFloat() * 2 - 1) * 16; - } + xTarget = x + (random->nextFloat() * 2 - 1) * 16; + yTarget = y + (random->nextFloat() * 2 - 1) * 16; + zTarget = z + (random->nextFloat() * 2 - 1) * 16; + } - if (floatDuration-- <= 0) + if (floatDuration-- <= 0) { - floatDuration += random->nextInt(5) + 2; + floatDuration += random->nextInt(5) + 2; dd = sqrt(dd); - if (canReach(xTarget, yTarget, zTarget, dd)) + if (canReach(xTarget, yTarget, zTarget, dd)) { - this->xd += xd / dd * 0.1; - this->yd += yd / dd * 0.1; - this->zd += zd / dd * 0.1; - } + this->xd += xd / dd * 0.1; + this->yd += yd / dd * 0.1; + this->zd += zd / dd * 0.1; + } else { - xTarget = x; - yTarget = y; - zTarget = z; - } - } - - if (target != NULL && target->removed) target = nullptr; - if (target == NULL || retargetTime-- <= 0) + xTarget = x; + yTarget = y; + zTarget = z; + } + } + + if (target != NULL && target->removed) target = nullptr; + if (target == NULL || retargetTime-- <= 0) { - target = level->getNearestAttackablePlayer(shared_from_this(), 100); - if (target != NULL) + target = level->getNearestAttackablePlayer(shared_from_this(), 100); + if (target != NULL) { - retargetTime = 20; - } - } + retargetTime = 20; + } + } - double maxDist = 64.0f; - if (target != NULL && target->distanceToSqr(shared_from_this()) < maxDist * maxDist) + double maxDist = 64.0f; + if (target != NULL && target->distanceToSqr(shared_from_this()) < maxDist * maxDist) { - double xdd = target->x - x; - double ydd = (target->bb->y0 + target->bbHeight / 2) - (y + bbHeight / 2); - double zdd = target->z - z; - yBodyRot = yRot = -(float) atan2(xdd, zdd) * 180 / PI; + double xdd = target->x - x; + double ydd = (target->bb->y0 + target->bbHeight / 2) - (y + bbHeight / 2); + double zdd = target->z - z; + yBodyRot = yRot = -(float) atan2(xdd, zdd) * 180 / PI; - if (this->canSee(target)) + if (canSee(target)) { - if (charge == 10) + if (charge == 10) { // 4J - change brought forward from 1.2.3 level->levelEvent(nullptr, LevelEvent::SOUND_GHAST_WARNING, (int) x, (int) y, (int) z, 0); - } - charge++; - if (charge == 20) + } + charge++; + if (charge == 20) { // 4J - change brought forward from 1.2.3 level->levelEvent(nullptr, LevelEvent::SOUND_GHAST_FIREBALL, (int) x, (int) y, (int) z, 0); - shared_ptr ie = shared_ptr( new Fireball(level, dynamic_pointer_cast( shared_from_this() ), xdd, ydd, zdd) ); - double d = 4; - Vec3 *v = getViewVector(1); - ie->x = x + v->x * d; - ie->y = y + bbHeight / 2 + 0.5f; - ie->z = z + v->z * d; - level->addEntity(ie); - charge = -40; - } - } + shared_ptr ie = shared_ptr( new LargeFireball(level, dynamic_pointer_cast( shared_from_this() ), xdd, ydd, zdd) ); + ie->explosionPower = explosionPower; + double d = 4; + Vec3 *v = getViewVector(1); + ie->x = x + v->x * d; + ie->y = y + bbHeight / 2 + 0.5f; + ie->z = z + v->z * d; + level->addEntity(ie); + charge = -40; + } + } else { - if (charge > 0) charge--; - } - } + if (charge > 0) charge--; + } + } else { - yBodyRot = yRot = -(float) atan2(this->xd, this->zd) * 180 / PI; - if (charge > 0) charge--; - } + yBodyRot = yRot = -(float) atan2(this->xd, this->zd) * 180 / PI; + if (charge > 0) charge--; + } - if (!level->isClientSide) + if (!level->isClientSide) { - byte old = entityData->getByte(DATA_IS_CHARGING); - byte current = (byte) (charge > 10 ? 1 : 0); - if (old != current) + byte old = entityData->getByte(DATA_IS_CHARGING); + byte current = (byte) (charge > 10 ? 1 : 0); + if (old != current) { - entityData->set(DATA_IS_CHARGING, current); - } - } + entityData->set(DATA_IS_CHARGING, current); + } + } } bool Ghast::canReach(double xt, double yt, double zt, double dist) @@ -192,31 +193,31 @@ bool Ghast::canReach(double xt, double yt, double zt, double dist) AABB *bb = this->bb->copy(); for (int d = 1; d < dist; d++) { - bb->move(xd, yd, zd); - if (!level->getCubes( shared_from_this(), bb)->empty()) return false; + bb->move(xd, yd, zd); + if (!level->getCubes( shared_from_this(), bb)->empty()) return false; } - return true; + return true; } int Ghast::getAmbientSound() { - return eSoundType_MOB_GHAST_MOAN; + return eSoundType_MOB_GHAST_MOAN; } int Ghast::getHurtSound() { - return eSoundType_MOB_GHAST_SCREAM; + return eSoundType_MOB_GHAST_SCREAM; } int Ghast::getDeathSound() { - return eSoundType_MOB_GHAST_DEATH; + return eSoundType_MOB_GHAST_DEATH; } int Ghast::getDeathLoot() { - return Item::sulphur->id; + return Item::gunpowder_Id; } void Ghast::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) @@ -229,21 +230,32 @@ void Ghast::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) count = random->nextInt(3) + random->nextInt(1 + playerBonusLevel); for (int i = 0; i < count; i++) { - spawnAtLocation(Item::sulphur_Id, 1); + spawnAtLocation(Item::gunpowder_Id, 1); } } float Ghast::getSoundVolume() { - return 0.4f;//10; 4J-PB - changing due to customer demands + return 0.4f;//10; 4J-PB - changing due to customer demands } bool Ghast::canSpawn() { - return (random->nextInt(20) == 0 && FlyingMob::canSpawn() && level->difficulty > Difficulty::PEACEFUL); + return (random->nextInt(20) == 0 && FlyingMob::canSpawn() && level->difficulty > Difficulty::PEACEFUL); } int Ghast::getMaxSpawnClusterSize() { - return 1; + return 1; +} +void Ghast::addAdditonalSaveData(CompoundTag *tag) +{ + FlyingMob::addAdditonalSaveData(tag); + tag->putInt(L"ExplosionPower", explosionPower); } + +void Ghast::readAdditionalSaveData(CompoundTag *tag) +{ + FlyingMob::readAdditionalSaveData(tag); + if (tag->contains(L"ExplosionPower")) explosionPower = tag->getInt(L"ExplosionPower"); +} \ No newline at end of file diff --git a/Minecraft.World/Ghast.h b/Minecraft.World/Ghast.h index cdb44b61..f19f737c 100644 --- a/Minecraft.World/Ghast.h +++ b/Minecraft.World/Ghast.h @@ -29,21 +29,20 @@ public: int charge; private: + int explosionPower; + + void _init(); public: Ghast(Level *level); - virtual bool hurt(DamageSource *source, int dmg); + virtual bool isCharging(); + virtual bool hurt(DamageSource *source, float dmg); protected: virtual void defineSynchedData(); - -public: - int getMaxHealth(); - -public: - virtual void tick(); + virtual void registerAttributes(); protected: virtual void serverAiStep(); @@ -61,5 +60,7 @@ protected: public: virtual bool canSpawn(); - virtual int getMaxSpawnClusterSize(); + virtual int getMaxSpawnClusterSize(); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditionalSaveData(CompoundTag *tag); }; diff --git a/Minecraft.World/Giant.cpp b/Minecraft.World/Giant.cpp index 054394da..dbb790bf 100644 --- a/Minecraft.World/Giant.cpp +++ b/Minecraft.World/Giant.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "Giant.h" #include "..\Minecraft.Client\Textures.h" @@ -10,20 +12,19 @@ Giant::Giant(Level *level) : Monster( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_ZOMBIE; // 4J was L"/mob/zombie.png"; - runSpeed = 0.5f; - attackDamage = 50; - this->heightOffset*=6; - this->setSize(bbWidth * 6, bbHeight * 6); + heightOffset*=6; + setSize(bbWidth * 6, bbHeight * 6); } -int Giant::getMaxHealth() +void Giant::registerAttributes() { - return 100; + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(100); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.5f); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(50); } float Giant::getWalkTargetValue(int x, int y, int z) diff --git a/Minecraft.World/Giant.h b/Minecraft.World/Giant.h index 21798854..478de94c 100644 --- a/Minecraft.World/Giant.h +++ b/Minecraft.World/Giant.h @@ -12,7 +12,10 @@ public: static Entity *create(Level *level) { return new Giant(level); } Giant(Level *level); - - int getMaxHealth(); + +protected: + virtual void registerAttributes(); + +public: virtual float getWalkTargetValue(int x, int y, int z); }; diff --git a/Minecraft.World/GiveItemCommand.cpp b/Minecraft.World/GiveItemCommand.cpp index 1d13592f..b3cbff4f 100644 --- a/Minecraft.World/GiveItemCommand.cpp +++ b/Minecraft.World/GiveItemCommand.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.commands.h" +#include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.item.h" #include "net.minecraft.network.packet.h" #include "..\Minecraft.Client\ServerPlayer.h" @@ -10,6 +11,11 @@ EGameCommand GiveItemCommand::getId() return eGameCommand_Give; } +int GiveItemCommand::getPermissionLevel() +{ + return LEVEL_GAMEMASTERS; +} + void GiveItemCommand::execute(shared_ptr source, byteArray commandData) { ByteArrayInputStream bais(commandData); @@ -20,14 +26,15 @@ void GiveItemCommand::execute(shared_ptr source, byteArray comman int amount = dis.readInt(); int aux = dis.readInt(); wstring tag = dis.readUTF(); - + bais.reset(); shared_ptr player = getPlayer(uid); if(player != NULL && item > 0 && Item::items[item] != NULL) { shared_ptr itemInstance = shared_ptr(new ItemInstance(item, amount, aux)); - player->drop(itemInstance); + shared_ptr drop = player->drop(itemInstance); + drop->throwTime = 0; //logAdminAction(source, L"commands.give.success", ChatPacket::e_ChatCustom, Item::items[item]->getName(itemInstance), item, amount, player->getAName()); logAdminAction(source, ChatPacket::e_ChatCustom, L"commands.give.success", item, player->getAName()); } diff --git a/Minecraft.World/GiveItemCommand.h b/Minecraft.World/GiveItemCommand.h index 532070a6..fbe99c4f 100644 --- a/Minecraft.World/GiveItemCommand.h +++ b/Minecraft.World/GiveItemCommand.h @@ -8,6 +8,7 @@ class GiveItemCommand : public Command { public: virtual EGameCommand getId(); + virtual int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData); public: diff --git a/Minecraft.World/GlowstoneTile.cpp b/Minecraft.World/GlowstoneTile.cpp new file mode 100644 index 00000000..dba4ce91 --- /dev/null +++ b/Minecraft.World/GlowstoneTile.cpp @@ -0,0 +1,22 @@ +#include "stdafx.h" +#include "Glowstonetile.h" +#include "net.minecraft.world.item.h" + +Glowstonetile::Glowstonetile(int id, Material *material) : Tile(id, material) +{ +} + +int Glowstonetile::getResourceCountForLootBonus(int bonusLevel, Random *random) +{ + return Mth::clamp(getResourceCount(random) + random->nextInt(bonusLevel + 1), 1, 4); +} + +int Glowstonetile::getResourceCount(Random *random) +{ + return 2 + random->nextInt(3); +} + +int Glowstonetile::getResource(int data, Random *random, int playerBonusLevel) +{ + return Item::yellowDust->id; +} \ No newline at end of file diff --git a/Minecraft.World/GlowstoneTile.h b/Minecraft.World/GlowstoneTile.h new file mode 100644 index 00000000..f09491bd --- /dev/null +++ b/Minecraft.World/GlowstoneTile.h @@ -0,0 +1,13 @@ +#pragma once +#include "Tile.h" + +class Random; + +class Glowstonetile : public Tile +{ +public: + Glowstonetile(int id, Material *material); + virtual int getResourceCountForLootBonus(int bonusLevel, Random *random); + virtual int getResourceCount(Random *random); + virtual int getResource(int data, Random *random, int playerBonusLevel); +}; \ No newline at end of file diff --git a/Minecraft.World/GoalSelector.cpp b/Minecraft.World/GoalSelector.cpp index 85a37dda..3e3d99b5 100644 --- a/Minecraft.World/GoalSelector.cpp +++ b/Minecraft.World/GoalSelector.cpp @@ -30,6 +30,33 @@ void GoalSelector::addGoal(int prio, Goal *goal, bool canDeletePointer /*= true* goals.push_back(new InternalGoal(prio, goal, canDeletePointer)); } +void GoalSelector::removeGoal(Goal *toRemove) +{ + for(AUTO_VAR(it, goals.begin()); it != goals.end(); ) + { + InternalGoal *ig = *it; + Goal *goal = ig->goal; + + if (goal == toRemove) + { + AUTO_VAR(it2, find(usingGoals.begin(), usingGoals.end(), ig) ); + if (it2 != usingGoals.end()) + { + goal->stop(); + usingGoals.erase(it2); + } + + if(ig->canDeletePointer) delete ig->goal; + delete ig; + it = goals.erase(it); + } + else + { + ++it; + } + } +} + void GoalSelector::tick() { vector toStart; diff --git a/Minecraft.World/GoalSelector.h b/Minecraft.World/GoalSelector.h index c2bf0b87..3841b93a 100644 --- a/Minecraft.World/GoalSelector.h +++ b/Minecraft.World/GoalSelector.h @@ -29,6 +29,7 @@ public: // 4J Added canDelete param void addGoal(int prio, Goal *goal, bool canDeletePointer = true); + void removeGoal(Goal *toRemove); void tick(); vector *getRunningGoals(); diff --git a/Minecraft.World/GoldenAppleItem.cpp b/Minecraft.World/GoldenAppleItem.cpp index 6c99d201..47e2c21c 100644 --- a/Minecraft.World/GoldenAppleItem.cpp +++ b/Minecraft.World/GoldenAppleItem.cpp @@ -26,11 +26,13 @@ const Rarity *GoldenAppleItem::getRarity(shared_ptr itemInstance) void GoldenAppleItem::addEatEffect(shared_ptr instance, Level *level, shared_ptr player) { + if (!level->isClientSide) player->addEffect(new MobEffectInstance(MobEffect::absorption->id, 2 * 60 * SharedConstants::TICKS_PER_SECOND, 0)); + if (instance->getAuxValue() > 0) { if (!level->isClientSide) { - player->addEffect(new MobEffectInstance(MobEffect::regeneration->id, 30 * SharedConstants::TICKS_PER_SECOND, 3)); + player->addEffect(new MobEffectInstance(MobEffect::regeneration->id, 30 * SharedConstants::TICKS_PER_SECOND, 4)); player->addEffect(new MobEffectInstance(MobEffect::damageResistance->id, 300 * SharedConstants::TICKS_PER_SECOND, 0)); player->addEffect(new MobEffectInstance(MobEffect::fireResistance->id, 300 * SharedConstants::TICKS_PER_SECOND, 0)); } diff --git a/Minecraft.World/GrassTile.cpp b/Minecraft.World/GrassTile.cpp index 0e955025..68e7c233 100644 --- a/Minecraft.World/GrassTile.cpp +++ b/Minecraft.World/GrassTile.cpp @@ -16,23 +16,23 @@ GrassTile::GrassTile(int id) : Tile(id, Material::grass) iconSnowSide = NULL; iconSideOverlay = NULL; - setTicking(true); + setTicking(true); } Icon *GrassTile::getTexture(int face, int data) { - if (face == Facing::UP) return iconTop; - if (face == Facing::DOWN) return Tile::dirt->getTexture(face); - return icon; + if (face == Facing::UP) return iconTop; + if (face == Facing::DOWN) return Tile::dirt->getTexture(face); + return icon; } Icon *GrassTile::getTexture(LevelSource *level, int x, int y, int z, int face) { - if (face == Facing::UP) return iconTop; - if (face == Facing::DOWN) return Tile::dirt->getTexture(face); - Material *above = level->getMaterial(x, y + 1, z); - if (above == Material::topSnow || above == Material::snow) return iconSnowSide; - else return icon; + if (face == Facing::UP) return iconTop; + if (face == Facing::DOWN) return Tile::dirt->getTexture(face); + Material *above = level->getMaterial(x, y + 1, z); + if (above == Material::topSnow || above == Material::snow) return iconSnowSide; + else return icon; } void GrassTile::registerIcons(IconRegister *iconRegister) @@ -46,10 +46,10 @@ void GrassTile::registerIcons(IconRegister *iconRegister) int GrassTile::getColor() const { // 4J Replaced - //double temp = 0.5; - //double rain = 1.0; + //double temp = 0.5; + //double rain = 1.0; - //return GrassColor::get(temp, rain); + //return GrassColor::get(temp, rain); return Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Grass_Common ); } @@ -90,15 +90,15 @@ int GrassTile::getColor(LevelSource *level, int x, int y, int z, int data) void GrassTile::tick(Level *level, int x, int y, int z, Random *random) { - if (level->isClientSide) return; + if (level->isClientSide) return; - if (level->getRawBrightness(x, y + 1, z) < MIN_BRIGHTNESS && Tile::lightBlock[level->getTile(x, y + 1, z)] > 2) + if (level->getRawBrightness(x, y + 1, z) < MIN_BRIGHTNESS && Tile::lightBlock[level->getTile(x, y + 1, z)] > 2) { - level->setTile(x, y, z, Tile::dirt_Id); - } + level->setTileAndUpdate(x, y, z, Tile::dirt_Id); + } else { - if (level->getRawBrightness(x, y + 1, z) >= Level::MAX_BRIGHTNESS - 6) + if (level->getRawBrightness(x, y + 1, z) >= Level::MAX_BRIGHTNESS - 6) { for (int i = 0; i < 4; i++) { @@ -108,11 +108,11 @@ void GrassTile::tick(Level *level, int x, int y, int z, Random *random) int above = level->getTile(xt, yt + 1, zt); if (level->getTile(xt, yt, zt) == Tile::dirt_Id && level->getRawBrightness(xt, yt + 1, zt) >= MIN_BRIGHTNESS && Tile::lightBlock[above] <= 2) { - level->setTile(xt, yt, zt, Tile::grass_Id); + level->setTileAndUpdate(xt, yt, zt, Tile::grass_Id); } } - } - } + } + } } int GrassTile::getResource(int data, Random *random, int playerBonusLevel) diff --git a/Minecraft.World/GravelTile.cpp b/Minecraft.World/GravelTile.cpp index 1ee866a9..86c34962 100644 --- a/Minecraft.World/GravelTile.cpp +++ b/Minecraft.World/GravelTile.cpp @@ -8,6 +8,7 @@ GravelTile::GravelTile(int type) : HeavyTile(type) int GravelTile::getResource(int data, Random *random, int playerBonusLevel) { - if (random->nextInt(10 - playerBonusLevel * 3) == 0) return Item::flint->id; - return id; + if (playerBonusLevel > 3) playerBonusLevel = 3; + if (random->nextInt(10 - playerBonusLevel * 3) == 0) return Item::flint->id; + return id; } \ No newline at end of file diff --git a/Minecraft.World/GroundBushFeature.cpp b/Minecraft.World/GroundBushFeature.cpp index df7561f3..88b7f733 100644 --- a/Minecraft.World/GroundBushFeature.cpp +++ b/Minecraft.World/GroundBushFeature.cpp @@ -5,8 +5,8 @@ GroundBushFeature::GroundBushFeature(int trunkType, int leafType) { - this->trunkTileType = trunkType; - this->leafTileType = leafType; + trunkTileType = trunkType; + leafTileType = leafType; } bool GroundBushFeature::place(Level *level, Random *random, int x, int y, int z) diff --git a/Minecraft.World/HalfSlabTile.cpp b/Minecraft.World/HalfSlabTile.cpp index ed3969c1..13308b9a 100644 --- a/Minecraft.World/HalfSlabTile.cpp +++ b/Minecraft.World/HalfSlabTile.cpp @@ -6,17 +6,6 @@ #include "net.minecraft.stats.h" #include "Facing.h" -/*package net.minecraft.world.level.tile; - -import java.util.*; - -import net.minecraft.Facing; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.*; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.phys.AABB;*/ - - HalfSlabTile::HalfSlabTile(int id, bool fullSize, Material *material) : Tile(id, material, fullSize) { @@ -98,41 +87,41 @@ int HalfSlabTile::getResourceCount(Random *random) int HalfSlabTile::getSpawnResourcesAuxValue(int data) { - return data & TYPE_MASK; + return data & TYPE_MASK; } bool HalfSlabTile::isCubeShaped() { - return fullSize; + return fullSize; } bool HalfSlabTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { - if (fullSize) return Tile::shouldRenderFace(level, x, y, z, face); + if (fullSize) return Tile::shouldRenderFace(level, x, y, z, face); - if (face != Facing::UP && face != Facing::DOWN && !Tile::shouldRenderFace(level, x, y, z, face)) - { - return false; - } + if (face != Facing::UP && face != Facing::DOWN && !Tile::shouldRenderFace(level, x, y, z, face)) + { + return false; + } - int ox = x, oy = y, oz = z; - ox += Facing::STEP_X[Facing::OPPOSITE_FACING[face]]; - oy += Facing::STEP_Y[Facing::OPPOSITE_FACING[face]]; - oz += Facing::STEP_Z[Facing::OPPOSITE_FACING[face]]; + int ox = x, oy = y, oz = z; + ox += Facing::STEP_X[Facing::OPPOSITE_FACING[face]]; + oy += Facing::STEP_Y[Facing::OPPOSITE_FACING[face]]; + oz += Facing::STEP_Z[Facing::OPPOSITE_FACING[face]]; - boolean isUpper = (level->getData(ox, oy, oz) & TOP_SLOT_BIT) != 0; - if (isUpper) - { - if (face == Facing::DOWN) return true; - if (face == Facing::UP && Tile::shouldRenderFace(level, x, y, z, face)) return true; - return !(isHalfSlab(level->getTile(x, y, z)) && (level->getData(x, y, z) & TOP_SLOT_BIT) != 0); - } - else - { - if (face == Facing::UP) return true; - if (face == Facing::DOWN && Tile::shouldRenderFace(level, x, y, z, face)) return true; - return !(isHalfSlab(level->getTile(x, y, z)) && (level->getData(x, y, z) & TOP_SLOT_BIT) == 0); - } + boolean isUpper = (level->getData(ox, oy, oz) & TOP_SLOT_BIT) != 0; + if (isUpper) + { + if (face == Facing::DOWN) return true; + if (face == Facing::UP && Tile::shouldRenderFace(level, x, y, z, face)) return true; + return !(isHalfSlab(level->getTile(x, y, z)) && (level->getData(x, y, z) & TOP_SLOT_BIT) != 0); + } + else + { + if (face == Facing::UP) return true; + if (face == Facing::DOWN && Tile::shouldRenderFace(level, x, y, z, face)) return true; + return !(isHalfSlab(level->getTile(x, y, z)) && (level->getData(x, y, z) & TOP_SLOT_BIT) == 0); + } } bool HalfSlabTile::isHalfSlab(int tileId) @@ -140,4 +129,24 @@ bool HalfSlabTile::isHalfSlab(int tileId) return tileId == Tile::stoneSlabHalf_Id || tileId == Tile::woodSlabHalf_Id; } +int HalfSlabTile::cloneTileData(Level *level, int x, int y, int z) +{ + return Tile::cloneTileData(level, x, y, z) & TYPE_MASK; +} +int HalfSlabTile::cloneTileId(Level *level, int x, int y, int z) +{ + if (isHalfSlab(id)) + { + return id; + } + if (id == Tile::stoneSlab_Id) + { + return Tile::stoneSlabHalf_Id; + } + if (id == Tile::woodSlab_Id) + { + return Tile::woodSlabHalf_Id; + } + return Tile::stoneSlabHalf_Id; +} \ No newline at end of file diff --git a/Minecraft.World/HalfSlabTile.h b/Minecraft.World/HalfSlabTile.h index 183a4add..6399d827 100644 --- a/Minecraft.World/HalfSlabTile.h +++ b/Minecraft.World/HalfSlabTile.h @@ -5,11 +5,9 @@ class HalfSlabTile : public Tile { - - public: - static const int TYPE_MASK = 7; - static const int TOP_SLOT_BIT = 8; + static const int TYPE_MASK = 7; + static const int TOP_SLOT_BIT = 8; protected: bool fullSize; @@ -30,4 +28,6 @@ private: public: virtual int getAuxName(int auxValue) = 0; + virtual int cloneTileData(Level *level, int x, int y, int z); + virtual int cloneTileId(Level *level, int x, int y, int z); }; \ No newline at end of file diff --git a/Minecraft.World/HalfTransparentTile.h b/Minecraft.World/HalfTransparentTile.h index e3d34c3f..41908ef2 100644 --- a/Minecraft.World/HalfTransparentTile.h +++ b/Minecraft.World/HalfTransparentTile.h @@ -15,5 +15,5 @@ public: virtual bool isSolidRender(bool isServerLevel = false); virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); virtual bool blocksLight(); - void registerIcons(IconRegister *iconRegister); + virtual void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/HangingEntity.cpp b/Minecraft.World/HangingEntity.cpp index 6256a381..8ba3e1fc 100644 --- a/Minecraft.World/HangingEntity.cpp +++ b/Minecraft.World/HangingEntity.cpp @@ -14,22 +14,19 @@ void HangingEntity::_init(Level *level) checkInterval = 0; dir = 0; xTile = yTile = zTile = 0; + this->heightOffset = 0; + this->setSize(0.5f, 0.5f); } HangingEntity::HangingEntity(Level *level) : Entity( level ) { _init(level); - this->heightOffset = 0; - this->setSize(0.5f, 0.5f); } HangingEntity::HangingEntity(Level *level, int xTile, int yTile, int zTile, int dir) : Entity( level ) { _init(level); - //motive = NULL; - this->heightOffset = 0; - this->setSize(0.5f, 0.5f); this->xTile = xTile; this->yTile = yTile; this->zTile = zTile; @@ -38,7 +35,7 @@ HangingEntity::HangingEntity(Level *level, int xTile, int yTile, int zTile, int void HangingEntity::setDir(int dir) { this->dir = dir; - this->yRotO = this->yRot = (float)(dir * 90); + yRotO = yRot = (float)(dir * 90); float w = (float)getWidth(); float h = (float)getHeight(); @@ -75,7 +72,7 @@ void HangingEntity::setDir(int dir) if (dir == Direction::EAST) z -= offs(getWidth()); y += offs(getHeight()); - this->setPos(x, y, z); + setPos(x, y, z); float ss = -(0.5f / 16.0f); @@ -98,13 +95,16 @@ float HangingEntity::offs(int w) void HangingEntity::tick() { - if (checkInterval++ == 20 * 5 && !level->isClientSide)//isClientSide) + xo = x; + yo = y; + zo = z; + if (checkInterval++ == 20 * 5 && !level->isClientSide) { checkInterval = 0; if (!removed && !survives()) { remove(); - dropItem(); + dropItem(nullptr); } } } @@ -156,7 +156,7 @@ bool HangingEntity::survives() for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { shared_ptr e = (*it); - if(dynamic_pointer_cast(e) != NULL) + if( e->instanceof(eTYPE_HANGING_ENTITY) ) { return false; } @@ -181,15 +181,16 @@ bool HangingEntity::skipAttackInteraction(shared_ptr source) return false; } -bool HangingEntity::hurt(DamageSource *source, int damage) +bool HangingEntity::hurt(DamageSource *source, float damage) { + if (isInvulnerable()) return false; if (!removed && !level->isClientSide) { if (dynamic_cast(source) != NULL) { shared_ptr sourceEntity = source->getDirectEntity(); - if (dynamic_pointer_cast(sourceEntity) != NULL && !dynamic_pointer_cast(sourceEntity)->isAllowedToHurtEntity(shared_from_this()) ) + if ( (sourceEntity != NULL) && sourceEntity->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(sourceEntity)->isAllowedToHurtEntity(shared_from_this()) ) { return false; } @@ -200,7 +201,7 @@ bool HangingEntity::hurt(DamageSource *source, int damage) shared_ptr player = nullptr; shared_ptr e = source->getEntity(); - if (e!=NULL && ((e->GetType() & eTYPE_PLAYER)!=0) ) // check if it's serverplayer or player + if ( (e!=NULL) && e->instanceof(eTYPE_PLAYER) ) // check if it's serverplayer or player { player = dynamic_pointer_cast( e ); } @@ -210,7 +211,7 @@ bool HangingEntity::hurt(DamageSource *source, int damage) return true; } - dropItem(); + dropItem(nullptr); } return true; } @@ -221,7 +222,7 @@ void HangingEntity::move(double xa, double ya, double za, bool noEntityCubes) if (!level->isClientSide && !removed && (xa * xa + ya * ya + za * za) > 0) { remove(); - dropItem(); + dropItem(nullptr); } } @@ -230,7 +231,7 @@ void HangingEntity::push(double xa, double ya, double za) if (!level->isClientSide && !removed && (xa * xa + ya * ya + za * za) > 0) { remove(); - dropItem(); + dropItem(nullptr); } } @@ -289,4 +290,7 @@ void HangingEntity::readAdditionalSaveData(CompoundTag *tag) setDir(dir); } - +bool HangingEntity::repositionEntityAfterLoad() +{ + return false; +} \ No newline at end of file diff --git a/Minecraft.World/HangingEntity.h b/Minecraft.World/HangingEntity.h index b87915e4..30d0a1bd 100644 --- a/Minecraft.World/HangingEntity.h +++ b/Minecraft.World/HangingEntity.h @@ -10,7 +10,6 @@ public: private: void _init(Level *level); - float offs(int w); int checkInterval; //eINSTANCEOF eType; @@ -25,12 +24,16 @@ public: HangingEntity(Level *level); HangingEntity(Level *level, int xTile, int yTile, int zTile, int dir); void setDir(int dir); - bool survives(); + virtual bool survives(); + +private: + float offs(int w); +public: virtual void tick(); virtual bool isPickable(); virtual bool skipAttackInteraction(shared_ptr source); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); virtual void move(double xa, double ya, double za, bool noEntityCubes=false); // 4J - added noEntityCubes parameter virtual void push(double xa, double ya, double za); virtual void addAdditonalSaveData(CompoundTag *tag); @@ -38,5 +41,8 @@ public: virtual int getWidth()=0; virtual int getHeight()=0; - virtual void dropItem()=0; + virtual void dropItem(shared_ptr causedBy)=0; + +protected: + virtual bool repositionEntityAfterLoad(); }; diff --git a/Minecraft.World/HangingEntityItem.cpp b/Minecraft.World/HangingEntityItem.cpp index 505dce4d..9e4e9d5b 100644 --- a/Minecraft.World/HangingEntityItem.cpp +++ b/Minecraft.World/HangingEntityItem.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.phys.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" #include "net.minecraft.world.level.h" #include "HangingEntityItem.h" #include "HangingEntity.h" @@ -13,10 +14,7 @@ HangingEntityItem::HangingEntityItem(int id, eINSTANCEOF eClassType) : Item(id) { - //super(id); - //this.clazz = clazz; this->eType=eClassType; - // setItemCategory(CreativeModeTab.TAB_DECORATIONS); } bool HangingEntityItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int xt, int yt, int zt, int face, float clickX, float clickY, float clickZ, bool bTestOnly) @@ -26,17 +24,16 @@ bool HangingEntityItem::useOn(shared_ptr instance, shared_ptrmayBuild(xt, yt, zt)) return false; + if (!player->mayUseItemAt(xt, yt, zt, face, instance)) return false; return true; } int dir = Direction::FACING_DIRECTION[face]; - shared_ptr entity = createEntity(level, xt, yt, zt, dir); + shared_ptr entity = createEntity(level, xt, yt, zt, dir, instance->getAuxValue() ); - //if (!player->mayUseItemAt(xt, yt, zt, face, instance)) return false; - if (!player->mayBuild(xt, yt, zt)) return false; + if (!player->mayUseItemAt(xt, yt, zt, face, instance)) return false; if (entity != NULL && entity->survives()) { @@ -65,12 +62,22 @@ bool HangingEntityItem::useOn(shared_ptr instance, shared_ptr HangingEntityItem::createEntity(Level *level, int x, int y, int z, int dir) +shared_ptr HangingEntityItem::createEntity(Level *level, int x, int y, int z, int dir, int auxValue) // 4J added auxValue { if (eType == eTYPE_PAINTING) { shared_ptr painting = shared_ptr(new Painting(level, x, y, z, dir)); - painting->PaintingPostConstructor(dir); + +#ifndef _CONTENT_PACKAGE + if (app.DebugArtToolsOn() && auxValue > 0) + { + painting->PaintingPostConstructor(dir, auxValue - 1); + } + else +#endif + { + painting->PaintingPostConstructor(dir); + } return dynamic_pointer_cast (painting); } @@ -86,3 +93,25 @@ shared_ptr HangingEntityItem::createEntity(Level *level, int x, i } } +// 4J Adding overrides for art tools +void HangingEntityItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced) +{ +#ifndef _CONTENT_PACKAGE + if (eType == eTYPE_PAINTING && app.DebugArtToolsOn() && itemInstance->getAuxValue() > 0 ) + { + int motive = itemInstance->getAuxValue() - 1; + + wchar_t formatted[256]; + ZeroMemory(formatted, 256 * sizeof(wchar_t)); + swprintf(formatted, 256, L"** %ls %dx%d",Painting::Motive::values[motive]->name.c_str(),Painting::Motive::values[motive]->w/16,Painting::Motive::values[motive]->h/16); + + wstring motiveName = formatted; + + lines->push_back(HtmlString(motiveName.c_str(), eHTMLColor_c)); + } + else +#endif + { + return Item::appendHoverText(itemInstance, player, lines, advanced); + } +} \ No newline at end of file diff --git a/Minecraft.World/HangingEntityItem.h b/Minecraft.World/HangingEntityItem.h index 51bd8b23..d0e82897 100644 --- a/Minecraft.World/HangingEntityItem.h +++ b/Minecraft.World/HangingEntityItem.h @@ -16,6 +16,8 @@ public: virtual bool useOn(shared_ptr instance, shared_ptr player, Level *level, int xt, int yt, int zt, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly);//, float clickX, float clickY, float clickZ); private: - shared_ptr createEntity(Level *level, int x, int y, int z, int dir) ; + shared_ptr createEntity(Level *level, int x, int y, int z, int dir, int auxValue); // 4J Stu added auxValue param +public: + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced); }; diff --git a/Minecraft.World/Hasher.cpp b/Minecraft.World/Hasher.cpp index 7c3d0564..954ff1e4 100644 --- a/Minecraft.World/Hasher.cpp +++ b/Minecraft.World/Hasher.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" -#include +#include #include "Hasher.h" @@ -19,7 +19,7 @@ wstring Hasher::getHash(wstring &name) //return new BigInteger(1, m.digest()).toString(16); // TODO 4J Stu - Will this hash us with the same distribution as the MD5? - return _toString( std::hash{}( s ) ); + return _toString(std::hash{}( s ) ); //} //catch (NoSuchAlgorithmException e) //{ diff --git a/Minecraft.World/HatchetItem.cpp b/Minecraft.World/HatchetItem.cpp index 16bf89bf..7fa204ca 100644 --- a/Minecraft.World/HatchetItem.cpp +++ b/Minecraft.World/HatchetItem.cpp @@ -25,7 +25,7 @@ HatchetItem::HatchetItem(int id, const Tier *tier) : DiggerItem (id, 3, tier, di // 4J - brought forward from 1.2.3 float HatchetItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { - if (tile != NULL && tile->material == Material::wood) + if (tile != NULL && (tile->material == Material::wood || tile->material == Material::plant || tile->material == Material::replaceable_plant)) { return speed; } diff --git a/Minecraft.World/HayBlockTile.cpp b/Minecraft.World/HayBlockTile.cpp new file mode 100644 index 00000000..c782835c --- /dev/null +++ b/Minecraft.World/HayBlockTile.cpp @@ -0,0 +1,23 @@ +#include "stdafx.h" +#include "net.minecraft.world.h" +#include "HayBlockTile.h" + +HayBlockTile::HayBlockTile(int id) : RotatedPillarTile(id, Material::grass) +{ +} + +int HayBlockTile::getRenderShape() +{ + return SHAPE_TREE; +} + +Icon *HayBlockTile::getTypeTexture(int type) +{ + return icon; +} + +void HayBlockTile::registerIcons(IconRegister *iconRegister) +{ + iconTop = iconRegister->registerIcon(getIconName() + L"_top"); + icon = iconRegister->registerIcon(getIconName() + L"_side"); +} \ No newline at end of file diff --git a/Minecraft.World/HayBlockTile.h b/Minecraft.World/HayBlockTile.h new file mode 100644 index 00000000..fca2e449 --- /dev/null +++ b/Minecraft.World/HayBlockTile.h @@ -0,0 +1,18 @@ +#pragma once + +#include "RotatedPillarTile.h" + +class HayBlockTile : public RotatedPillarTile +{ + friend class ChunkRebuildData; +public: + HayBlockTile(int id); + + int getRenderShape(); + +protected: + Icon *getTypeTexture(int type); + +public: + void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/HealthBoostMobEffect.cpp b/Minecraft.World/HealthBoostMobEffect.cpp new file mode 100644 index 00000000..9066a041 --- /dev/null +++ b/Minecraft.World/HealthBoostMobEffect.cpp @@ -0,0 +1,16 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "HealthBoostMobEffect.h" + +HealthBoostMobEffect::HealthBoostMobEffect(int id, bool isHarmful, eMinecraftColour color) : MobEffect(id, isHarmful, color) +{ +} + +void HealthBoostMobEffect::removeAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier) +{ + MobEffect::removeAttributeModifiers(entity, attributes, amplifier); + if (entity->getHealth() > entity->getMaxHealth()) + { + entity->setHealth(entity->getMaxHealth()); + } +} diff --git a/Minecraft.World/HealthBoostMobEffect.h b/Minecraft.World/HealthBoostMobEffect.h new file mode 100644 index 00000000..e5746ba0 --- /dev/null +++ b/Minecraft.World/HealthBoostMobEffect.h @@ -0,0 +1,14 @@ +#pragma once + +#include "MobEffect.h" + +class LivingEntity; +class BaseAttributeMap; + +class HealthBoostMobEffect : public MobEffect +{ +public: + HealthBoostMobEffect(int id, bool isHarmful, eMinecraftColour color); + + void removeAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier); +}; \ No newline at end of file diff --git a/Minecraft.World/HealthCriteria.cpp b/Minecraft.World/HealthCriteria.cpp new file mode 100644 index 00000000..52db9f11 --- /dev/null +++ b/Minecraft.World/HealthCriteria.cpp @@ -0,0 +1,27 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "HealthCriteria.h" + +HealthCriteria::HealthCriteria(const wstring &id) : DummyCriteria(id) +{ +} + +int HealthCriteria::getScoreModifier(vector > *players) +{ + float health = 0; + + for (AUTO_VAR(it,players->begin()); it != players->end(); ++it) + { + shared_ptr player = *it; + health += player->getHealth() + player->getAbsorptionAmount(); + } + + if (players->size() > 0) health /= players->size(); + + return Mth::ceil(health); +} + +bool HealthCriteria::isReadOnly() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.World/HealthCriteria.h b/Minecraft.World/HealthCriteria.h new file mode 100644 index 00000000..8cd57046 --- /dev/null +++ b/Minecraft.World/HealthCriteria.h @@ -0,0 +1,12 @@ +#pragma once + +#include "DummyCriteria.h" + +class HealthCriteria : public DummyCriteria +{ +public: + HealthCriteria(const wstring &id); + + int getScoreModifier(vector > *players); + bool isReadOnly(); +}; \ No newline at end of file diff --git a/Minecraft.World/HeavyTile.cpp b/Minecraft.World/HeavyTile.cpp index 18460f2f..6c2b96e6 100644 --- a/Minecraft.World/HeavyTile.cpp +++ b/Minecraft.World/HeavyTile.cpp @@ -16,12 +16,12 @@ HeavyTile::HeavyTile(int type, Material *material, bool isSolidRender) : Tile(ty void HeavyTile::onPlace(Level *level, int x, int y, int z) { - level->addToTickNextTick(x, y, z, id, getTickDelay()); + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); } void HeavyTile::neighborChanged(Level *level, int x, int y, int z, int type) { - level->addToTickNextTick(x, y, z, id, getTickDelay()); + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); } void HeavyTile::tick(Level *level, int x, int y, int z, Random *random) @@ -34,56 +34,57 @@ void HeavyTile::tick(Level *level, int x, int y, int z, Random *random) void HeavyTile::checkSlide(Level *level, int x, int y, int z) { - int x2 = x; - int y2 = y; - int z2 = z; - if (isFree(level, x2, y2 - 1, z2) && y2 >= 0) + int x2 = x; + int y2 = y; + int z2 = z; + if (isFree(level, x2, y2 - 1, z2) && y2 >= 0) { - int r = 32; + int r = 32; if (instaFall || !level->hasChunksAt(x - r, y - r, z - r, x + r, y + r, z + r) ) { - level->setTile(x, y, z, 0); - while (isFree(level, x, y - 1, z) && y > 0) - y--; - if (y > 0) { - level->setTile(x, y, z, id); - } - } + level->removeTile(x, y, z); + while (isFree(level, x, y - 1, z) && y > 0) + y--; + if (y > 0) + { + level->setTileAndUpdate(x, y, z, id); + } + } else if (!level->isClientSide) { // 4J added - don't do anything just now if we can't create any new falling tiles if( !level->newFallingTileAllowed() ) { - level->addToTickNextTick(x, y, z, id, getTickDelay()); + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); return; } - shared_ptr e = shared_ptr( new FallingTile(level, x + 0.5f, y + 0.5f, z + 0.5f, id, level->getData(x, y, z)) ); + shared_ptr e = shared_ptr( new FallingTile(level, x + 0.5f, y + 0.5f, z + 0.5f, id, level->getData(x, y, z)) ); falling(e); - level->addEntity(e); - } - } + level->addEntity(e); + } + } } void HeavyTile::falling(shared_ptr entity) { } -int HeavyTile::getTickDelay() +int HeavyTile::getTickDelay(Level *level) { - return 5; + return 2; } bool HeavyTile::isFree(Level *level, int x, int y, int z) { - int t = level->getTile(x, y, z); - if (t == 0) return true; - if (t == Tile::fire_Id) return true; - Material *material = Tile::tiles[t]->material; - if (material == Material::water) return true; - if (material == Material::lava) return true; - return false; + int t = level->getTile(x, y, z); + if (t == 0) return true; + if (t == Tile::fire_Id) return true; + Material *material = Tile::tiles[t]->material; + if (material == Material::water) return true; + if (material == Material::lava) return true; + return false; } void HeavyTile::onLand(Level *level, int xt, int yt, int zt, int data) diff --git a/Minecraft.World/HeavyTile.h b/Minecraft.World/HeavyTile.h index a9186eae..f68ed162 100644 --- a/Minecraft.World/HeavyTile.h +++ b/Minecraft.World/HeavyTile.h @@ -10,17 +10,17 @@ class HeavyTile : public Tile public: static bool instaFall; - HeavyTile(int type, bool isSolidRender = true); - HeavyTile(int type, Material *material, bool isSolidRender = true); - virtual void onPlace(Level *level, int x, int y, int z); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); - virtual void tick(Level *level, int x, int y, int z, Random *random); + HeavyTile(int type, bool isSolidRender = true); + HeavyTile(int type, Material *material, bool isSolidRender = true); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void tick(Level *level, int x, int y, int z, Random *random); private: void checkSlide(Level *level, int x, int y, int z); protected: virtual void falling(shared_ptr entity); public: - virtual int getTickDelay(); - static bool isFree(Level *level, int x, int y, int z); + virtual int getTickDelay(Level *level); + static bool isFree(Level *level, int x, int y, int z); virtual void onLand(Level *level, int xt, int yt, int zt, int data); }; diff --git a/Minecraft.World/HellBiome.cpp b/Minecraft.World/HellBiome.cpp index df0b4ed7..d023c01d 100644 --- a/Minecraft.World/HellBiome.cpp +++ b/Minecraft.World/HellBiome.cpp @@ -4,13 +4,14 @@ HellBiome::HellBiome(int id) : Biome(id) { - enemies.clear(); - friendlies.clear(); + enemies.clear(); + friendlies.clear(); friendlies_chicken.clear(); // 4J added friendlies_wolf.clear(); // 4J added - waterFriendlies.clear(); + waterFriendlies.clear(); + ambientFriendlies.clear(); - enemies.push_back(new MobSpawnerData(eTYPE_GHAST, 50, 4, 4)); - enemies.push_back(new MobSpawnerData(eTYPE_PIGZOMBIE, 100, 4, 4)); + enemies.push_back(new MobSpawnerData(eTYPE_GHAST, 50, 4, 4)); + enemies.push_back(new MobSpawnerData(eTYPE_PIGZOMBIE, 100, 4, 4)); enemies.push_back(new MobSpawnerData(eTYPE_LAVASLIME, 1, 4, 4)); } \ No newline at end of file diff --git a/Minecraft.World/HellFireFeature.cpp b/Minecraft.World/HellFireFeature.cpp index f795d997..4b32134c 100644 --- a/Minecraft.World/HellFireFeature.cpp +++ b/Minecraft.World/HellFireFeature.cpp @@ -5,15 +5,15 @@ bool HellFireFeature::place(Level *level, Random *random, int x, int y, int z) { - for (int i = 0; i < 64; i++) + for (int i = 0; i < 64; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y + random->nextInt(4) - random->nextInt(4); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (!level->isEmptyTile(x2, y2, z2)) continue; - if (level->getTile(x2, y2 - 1, z2) != Tile::hellRock_Id) continue; - level->setTile(x2, y2, z2, Tile::fire_Id); - } + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y + random->nextInt(4) - random->nextInt(4); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (!level->isEmptyTile(x2, y2, z2)) continue; + if (level->getTile(x2, y2 - 1, z2) != Tile::netherRack_Id) continue; + level->setTileAndData(x2, y2, z2, Tile::fire_Id, 0, Tile::UPDATE_CLIENTS); + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/HellFlatLevelSource.cpp b/Minecraft.World/HellFlatLevelSource.cpp index 0b1c4359..4957f617 100644 --- a/Minecraft.World/HellFlatLevelSource.cpp +++ b/Minecraft.World/HellFlatLevelSource.cpp @@ -10,15 +10,15 @@ HellFlatLevelSource::HellFlatLevelSource(Level *level, __int64 seed) int hellScale = level->getLevelData()->getHellScale(); m_XZSize = ceil((float)xzSize / hellScale); - this->level = level; + this->level = level; - random = new Random(seed); + random = new Random(seed); pprandom = new Random(seed); } HellFlatLevelSource::~HellFlatLevelSource() { - delete random; + delete random; delete pprandom; } @@ -35,7 +35,7 @@ void HellFlatLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) int block = 0; if ( (yc <= 6) || ( yc >= 121 ) ) { - block = Tile::hellRock_Id; + block = Tile::netherRack_Id; } blocks[xc << 11 | zc << 7 | yc] = (byte) block; @@ -46,13 +46,13 @@ void HellFlatLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) void HellFlatLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks) { - for (int x = 0; x < 16; x++) + for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) + for (int z = 0; z < 16; z++) { - for (int y = Level::genDepthMinusOne; y >= 0; y--) + for (int y = Level::genDepthMinusOne; y >= 0; y--) { - int offs = (z * 16 + x) * Level::genDepth + y; + int offs = (z * 16 + x) * Level::genDepth + y; // 4J Build walls around the level bool blockSet = false; @@ -93,15 +93,15 @@ void HellFlatLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks) if (y >= Level::genDepthMinusOne - random->nextInt(5)) { - blocks[offs] = (byte) Tile::unbreakable_Id; - } + blocks[offs] = (byte) Tile::unbreakable_Id; + } else if (y <= 0 + random->nextInt(5)) { - blocks[offs] = (byte) Tile::unbreakable_Id; -} - } - } - } + blocks[offs] = (byte) Tile::unbreakable_Id; + } + } + } + } } LevelChunk *HellFlatLevelSource::create(int x, int z) @@ -111,28 +111,28 @@ LevelChunk *HellFlatLevelSource::create(int x, int z) LevelChunk *HellFlatLevelSource::getChunk(int xOffs, int zOffs) { - random->setSeed(xOffs * 341873128712l + zOffs * 132897987541l); + random->setSeed(xOffs * 341873128712l + zOffs * 132897987541l); // 4J - now allocating this with a physical alloc & bypassing general memory management so that it will get cleanly freed int chunksSize = Level::genDepth * 16 * 16; byte *tileData = (byte *)XPhysicalAlloc(chunksSize, MAXULONG_PTR, 4096, PAGE_READWRITE); XMemSet128(tileData,0,chunksSize); byteArray blocks = byteArray(tileData,chunksSize); -// byteArray blocks = byteArray(16 * level->depth * 16); + // byteArray blocks = byteArray(16 * level->depth * 16); - prepareHeights(xOffs, zOffs, blocks); - buildSurfaces(xOffs, zOffs, blocks); + prepareHeights(xOffs, zOffs, blocks); + buildSurfaces(xOffs, zOffs, blocks); -// caveFeature->apply(this, level, xOffs, zOffs, blocks); - // townFeature.apply(this, level, xOffs, zOffs, blocks); - // addCaves(xOffs, zOffs, blocks); - // addTowns(xOffs, zOffs, blocks); + // caveFeature->apply(this, level, xOffs, zOffs, blocks); + // townFeature.apply(this, level, xOffs, zOffs, blocks); + // addCaves(xOffs, zOffs, blocks); + // addTowns(xOffs, zOffs, blocks); // 4J - this now creates compressed block data from the blocks array passed in, so needs to be after data is finalised. // Also now need to free the passed in blocks as the LevelChunk doesn't use the passed in allocation anymore. - LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); + LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); XPhysicalFree(tileData); - return levelChunk; + return levelChunk; } // 4J - removed & moved into its own method from getChunk, so we can call recalcHeightmap after the chunk is added into the cache. Without @@ -151,9 +151,9 @@ bool HellFlatLevelSource::hasChunk(int x, int y) void HellFlatLevelSource::postProcess(ChunkSource *parent, int xt, int zt) { - HeavyTile::instaFall = true; - int xo = xt * 16; - int zo = zt * 16; + HeavyTile::instaFall = true; + int xo = xt * 16; + int zo = zt * 16; // 4J - added. The original java didn't do any setting of the random seed here. We'll be running our postProcess in parallel with getChunk etc. so // we need to use a separate random - have used the same initialisation code as used in RandomLevelSource::postProcess to make sure this random value @@ -163,26 +163,26 @@ void HellFlatLevelSource::postProcess(ChunkSource *parent, int xt, int zt) __int64 zScale = pprandom->nextLong() / 2 * 2 + 1; pprandom->setSeed(((xt * xScale) + (zt * zScale)) ^ level->getSeed()); - int count = pprandom->nextInt(pprandom->nextInt(10) + 1) + 1; + int count = pprandom->nextInt(pprandom->nextInt(10) + 1) + 1; - for (int i = 0; i < count; i++) + for (int i = 0; i < count; i++) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth - 8) + 4; - int z = zo + pprandom->nextInt(16) + 8; - HellFireFeature().place(level, pprandom, x, y, z); - } - - count = pprandom->nextInt(pprandom->nextInt(10) + 1); - for (int i = 0; i < count; i++) + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth - 8) + 4; + int z = zo + pprandom->nextInt(16) + 8; + HellFireFeature().place(level, pprandom, x, y, z); + } + + count = pprandom->nextInt(pprandom->nextInt(10) + 1); + for (int i = 0; i < count; i++) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth - 8) + 4; - int z = zo + pprandom->nextInt(16) + 8; - LightGemFeature().place(level, pprandom, x, y, z); - } + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth - 8) + 4; + int z = zo + pprandom->nextInt(16) + 8; + LightGemFeature().place(level, pprandom, x, y, z); + } - HeavyTile::instaFall = false; + HeavyTile::instaFall = false; app.processSchematics(parent->getChunk(xt,zt)); @@ -210,15 +210,19 @@ wstring HellFlatLevelSource::gatherStats() vector *HellFlatLevelSource::getMobsAt(MobCategory *mobCategory, int x, int y, int z) { - Biome *biome = level->getBiome(x, z); - if (biome == NULL) - { - return NULL; - } - return biome->getMobs(mobCategory); + Biome *biome = level->getBiome(x, z); + if (biome == NULL) + { + return NULL; + } + return biome->getMobs(mobCategory); } TilePos *HellFlatLevelSource::findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z) { return NULL; } + +void HellFlatLevelSource::recreateLogicStructuresForChunk(int chunkX, int chunkZ) +{ +} \ No newline at end of file diff --git a/Minecraft.World/HellFlatLevelSource.h b/Minecraft.World/HellFlatLevelSource.h index b756d9a6..2e58f160 100644 --- a/Minecraft.World/HellFlatLevelSource.h +++ b/Minecraft.World/HellFlatLevelSource.h @@ -16,7 +16,7 @@ class HellFlatLevelSource : public ChunkSource { public: static const int CHUNK_HEIGHT = 8; - static const int CHUNK_WIDTH = 4; + static const int CHUNK_WIDTH = 4; private: Random *random; @@ -26,14 +26,14 @@ private: Level *level; public: - HellFlatLevelSource(Level *level, __int64 seed); + HellFlatLevelSource(Level *level, __int64 seed); ~HellFlatLevelSource(); private: - void prepareHeights(int xOffs, int zOffs, byteArray blocks); + void prepareHeights(int xOffs, int zOffs, byteArray blocks); public: - void buildSurfaces(int xOffs, int zOffs, byteArray blocks); + void buildSurfaces(int xOffs, int zOffs, byteArray blocks); LevelChunk *create(int x, int z); LevelChunk *getChunk(int xOffs, int zOffs); @@ -41,11 +41,12 @@ public: public: virtual bool hasChunk(int x, int y); - void postProcess(ChunkSource *parent, int xt, int zt); - bool save(bool force, ProgressListener *progressListener); - bool tick(); - bool shouldSave(); - wstring gatherStats(); + void postProcess(ChunkSource *parent, int xt, int zt); + bool save(bool force, ProgressListener *progressListener); + bool tick(); + bool shouldSave(); + wstring gatherStats(); virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z); - virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ); }; diff --git a/Minecraft.World/HellPortalFeature.cpp b/Minecraft.World/HellPortalFeature.cpp index 7a918e2c..66485578 100644 --- a/Minecraft.World/HellPortalFeature.cpp +++ b/Minecraft.World/HellPortalFeature.cpp @@ -5,33 +5,33 @@ bool HellPortalFeature::place(Level *level, Random *random, int x, int y, int z) { - if (!level->isEmptyTile(x, y, z)) return false; - if (level->getTile(x, y + 1, z) != Tile::hellRock_Id) return false; - level->setTile(x, y, z, Tile::lightGem_Id); + if (!level->isEmptyTile(x, y, z)) return false; + if (level->getTile(x, y + 1, z) != Tile::netherRack_Id) return false; + level->setTileAndData(x, y, z, Tile::glowstone_Id, 0, Tile::UPDATE_CLIENTS); - for (int i = 0; i < 1500; i++) + for (int i = 0; i < 1500; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y - random->nextInt(12); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (level->getTile(x2, y2, z2) != 0) continue; + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y - random->nextInt(12); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (level->getTile(x2, y2, z2) != 0) continue; - int count = 0; - for (int t = 0; t < 6; t++) + int count = 0; + for (int t = 0; t < 6; t++) { - int tile = 0; - if (t == 0) tile = level->getTile(x2 - 1, y2, z2); - if (t == 1) tile = level->getTile(x2 + 1, y2, z2); - if (t == 2) tile = level->getTile(x2, y2 - 1, z2); - if (t == 3) tile = level->getTile(x2, y2 + 1, z2); - if (t == 4) tile = level->getTile(x2, y2, z2 - 1); - if (t == 5) tile = level->getTile(x2, y2, z2 + 1); + int tile = 0; + if (t == 0) tile = level->getTile(x2 - 1, y2, z2); + if (t == 1) tile = level->getTile(x2 + 1, y2, z2); + if (t == 2) tile = level->getTile(x2, y2 - 1, z2); + if (t == 3) tile = level->getTile(x2, y2 + 1, z2); + if (t == 4) tile = level->getTile(x2, y2, z2 - 1); + if (t == 5) tile = level->getTile(x2, y2, z2 + 1); - if (tile == Tile::lightGem_Id) count++; - } + if (tile == Tile::glowstone_Id) count++; + } - if (count == 1) level->setTile(x2, y2, z2, Tile::lightGem_Id); - } + if (count == 1) level->setTileAndData(x2, y2, z2, Tile::glowstone_Id, 0, Tile::UPDATE_CLIENTS); + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/HellRandomLevelSource.cpp b/Minecraft.World/HellRandomLevelSource.cpp index 10194f7d..31bb3d69 100644 --- a/Minecraft.World/HellRandomLevelSource.cpp +++ b/Minecraft.World/HellRandomLevelSource.cpp @@ -16,18 +16,18 @@ HellRandomLevelSource::HellRandomLevelSource(Level *level, __int64 seed) netherBridgeFeature = new NetherBridgeFeature(); caveFeature = new LargeHellCaveFeature(); - this->level = level; + this->level = level; - random = new Random(seed); + random = new Random(seed); pprandom = new Random(seed); // 4J - added, so that we can have a separate random for doing post-processing in parallel with creation - lperlinNoise1 = new PerlinNoise(random, 16); - lperlinNoise2 = new PerlinNoise(random, 16); - perlinNoise1 = new PerlinNoise(random, 8); - perlinNoise2 = new PerlinNoise(random, 4); - perlinNoise3 = new PerlinNoise(random, 4); - - scaleNoise = new PerlinNoise(random, 10); - depthNoise = new PerlinNoise(random, 16); + lperlinNoise1 = new PerlinNoise(random, 16); + lperlinNoise2 = new PerlinNoise(random, 16); + perlinNoise1 = new PerlinNoise(random, 8); + perlinNoise2 = new PerlinNoise(random, 4); + perlinNoise3 = new PerlinNoise(random, 4); + + scaleNoise = new PerlinNoise(random, 10); + depthNoise = new PerlinNoise(random, 16); } HellRandomLevelSource::~HellRandomLevelSource() @@ -35,124 +35,124 @@ HellRandomLevelSource::~HellRandomLevelSource() delete netherBridgeFeature; delete caveFeature; - delete random; + delete random; delete pprandom; // 4J added - delete lperlinNoise1; - delete lperlinNoise2; - delete perlinNoise1; - delete perlinNoise2; - delete perlinNoise3; - - delete scaleNoise; - delete depthNoise; + delete lperlinNoise1; + delete lperlinNoise2; + delete perlinNoise1; + delete perlinNoise2; + delete perlinNoise3; + + delete scaleNoise; + delete depthNoise; } void HellRandomLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) { - int xChunks = 16 / CHUNK_WIDTH; - int waterHeight = 32; + int xChunks = 16 / CHUNK_WIDTH; + int waterHeight = 32; - int xSize = xChunks + 1; - int ySize = Level::genDepth / CHUNK_HEIGHT + 1; - int zSize = xChunks + 1; + int xSize = xChunks + 1; + int ySize = Level::genDepth / CHUNK_HEIGHT + 1; + int zSize = xChunks + 1; doubleArray buffer; // 4J - used to be declared with class level scope but tidying up for thread safety reasons - buffer = getHeights(buffer, xOffs * xChunks, 0, zOffs * xChunks, xSize, ySize, zSize); + buffer = getHeights(buffer, xOffs * xChunks, 0, zOffs * xChunks, xSize, ySize, zSize); - for (int xc = 0; xc < xChunks; xc++) + for (int xc = 0; xc < xChunks; xc++) { - for (int zc = 0; zc < xChunks; zc++) + for (int zc = 0; zc < xChunks; zc++) { - for (int yc = 0; yc < Level::genDepth / CHUNK_HEIGHT; yc++) + for (int yc = 0; yc < Level::genDepth / CHUNK_HEIGHT; yc++) { - double yStep = 1 / (double) CHUNK_HEIGHT; - double s0 = buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 0)]; - double s1 = buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 0)]; - double s2 = buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 0)]; - double s3 = buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 0)]; - - double s0a = (buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 1)] - s0) * yStep; - double s1a = (buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 1)] - s1) * yStep; - double s2a = (buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 1)] - s2) * yStep; - double s3a = (buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 1)] - s3) * yStep; - - for (int y = 0; y < CHUNK_HEIGHT; y++) + double yStep = 1 / (double) CHUNK_HEIGHT; + double s0 = buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 0)]; + double s1 = buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 0)]; + double s2 = buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 0)]; + double s3 = buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 0)]; + + double s0a = (buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 1)] - s0) * yStep; + double s1a = (buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 1)] - s1) * yStep; + double s2a = (buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 1)] - s2) * yStep; + double s3a = (buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 1)] - s3) * yStep; + + for (int y = 0; y < CHUNK_HEIGHT; y++) { - double xStep = 1 / (double) CHUNK_WIDTH; + double xStep = 1 / (double) CHUNK_WIDTH; - double _s0 = s0; - double _s1 = s1; - double _s0a = (s2 - s0) * xStep; - double _s1a = (s3 - s1) * xStep; + double _s0 = s0; + double _s1 = s1; + double _s0a = (s2 - s0) * xStep; + double _s1a = (s3 - s1) * xStep; - for (int x = 0; x < CHUNK_WIDTH; x++) + for (int x = 0; x < CHUNK_WIDTH; x++) { - int offs = (x + xc * CHUNK_WIDTH) << Level::genDepthBitsPlusFour | (0 + zc * CHUNK_WIDTH) << Level::genDepthBits | (yc * CHUNK_HEIGHT + y); - int step = 1 << Level::genDepthBits; - double zStep = 1 / (double) CHUNK_WIDTH; + int offs = (x + xc * CHUNK_WIDTH) << Level::genDepthBitsPlusFour | (0 + zc * CHUNK_WIDTH) << Level::genDepthBits | (yc * CHUNK_HEIGHT + y); + int step = 1 << Level::genDepthBits; + double zStep = 1 / (double) CHUNK_WIDTH; - double val = _s0; - double vala = (_s1 - _s0) * zStep; - for (int z = 0; z < CHUNK_WIDTH; z++) + double val = _s0; + double vala = (_s1 - _s0) * zStep; + for (int z = 0; z < CHUNK_WIDTH; z++) { - int tileId = 0; - if (yc * CHUNK_HEIGHT + y < waterHeight) + int tileId = 0; + if (yc * CHUNK_HEIGHT + y < waterHeight) { - tileId = Tile::calmLava_Id; - } - if (val > 0) + tileId = Tile::calmLava_Id; + } + if (val > 0) { - tileId = Tile::hellRock_Id; - } - - blocks[offs] = (byte) tileId; - offs += step; - val += vala; - } - _s0 += _s0a; - _s1 += _s1a; - } - - s0 += s0a; - s1 += s1a; - s2 += s2a; - s3 += s3a; - } - } - } - } + tileId = Tile::netherRack_Id; + } + + blocks[offs] = (byte) tileId; + offs += step; + val += vala; + } + _s0 += _s0a; + _s1 += _s1a; + } + + s0 += s0a; + s1 += s1a; + s2 += s2a; + s3 += s3a; + } + } + } + } delete [] buffer.data; } void HellRandomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks) { - int waterHeight = Level::genDepth - 64; + int waterHeight = Level::genDepth - 64; - double s = 1 / 32.0; + double s = 1 / 32.0; - doubleArray sandBuffer(16*16); // 4J - used to be declared with class level scope but moved here for thread safety + doubleArray sandBuffer(16*16); // 4J - used to be declared with class level scope but moved here for thread safety doubleArray gravelBuffer(16*16); doubleArray depthBuffer(16*16); - sandBuffer = perlinNoise2->getRegion(sandBuffer, xOffs * 16, zOffs * 16, 0, 16, 16, 1, s, s, 1); - gravelBuffer = perlinNoise2->getRegion(gravelBuffer, xOffs * 16, 109, zOffs * 16, 16, 1, 16, s, 1, s); - depthBuffer = perlinNoise3->getRegion(depthBuffer, xOffs * 16, zOffs * 16, 0, 16, 16, 1, s * 2, s * 2, s * 2); + sandBuffer = perlinNoise2->getRegion(sandBuffer, xOffs * 16, zOffs * 16, 0, 16, 16, 1, s, s, 1); + gravelBuffer = perlinNoise2->getRegion(gravelBuffer, xOffs * 16, 109, zOffs * 16, 16, 1, 16, s, 1, s); + depthBuffer = perlinNoise3->getRegion(depthBuffer, xOffs * 16, zOffs * 16, 0, 16, 16, 1, s * 2, s * 2, s * 2); - for (int x = 0; x < 16; x++) + for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) + for (int z = 0; z < 16; z++) { - bool sand = (sandBuffer[x + z * 16] + random->nextDouble() * 0.2) > 0; - bool gravel = (gravelBuffer[x + z * 16] + random->nextDouble() * 0.2) > 0; - int runDepth = (int) (depthBuffer[x + z * 16] / 3 + 3 + random->nextDouble() * 0.25); + bool sand = (sandBuffer[x + z * 16] + random->nextDouble() * 0.2) > 0; + bool gravel = (gravelBuffer[x + z * 16] + random->nextDouble() * 0.2) > 0; + int runDepth = (int) (depthBuffer[x + z * 16] / 3 + 3 + random->nextDouble() * 0.25); - int run = -1; + int run = -1; - byte top = (byte) Tile::hellRock_Id; - byte material = (byte) Tile::hellRock_Id; + byte top = (byte) Tile::netherRack_Id; + byte material = (byte) Tile::netherRack_Id; - for (int y = Level::genDepthMinusOne; y >= 0; y--) + for (int y = Level::genDepthMinusOne; y >= 0; y--) { - int offs = (z * 16 + x) * Level::genDepth + y; + int offs = (z * 16 + x) * Level::genDepth + y; // 4J Build walls around the level bool blockSet = false; @@ -193,38 +193,38 @@ void HellRandomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks if (y >= Level::genDepthMinusOne - random->nextInt(5) || y <= 0 + random->nextInt(5)) { - blocks[offs] = (byte) Tile::unbreakable_Id; - } + blocks[offs] = (byte) Tile::unbreakable_Id; + } else { - int old = blocks[offs]; + int old = blocks[offs]; - if (old == 0) + if (old == 0) { - run = -1; - } - else if (old == Tile::hellRock_Id) + run = -1; + } + else if (old == Tile::netherRack_Id) { - if (run == -1) + if (run == -1) { - if (runDepth <= 0) + if (runDepth <= 0) { - top = 0; - material = (byte) Tile::hellRock_Id; - } + top = 0; + material = (byte) Tile::netherRack_Id; + } else if (y >= waterHeight - 4 && y <= waterHeight + 1) { - top = (byte) Tile::hellRock_Id; - material = (byte) Tile::hellRock_Id; - if (gravel) top = (byte) Tile::gravel_Id; - if (gravel) material = (byte) Tile::hellRock_Id; + top = (byte) Tile::netherRack_Id; + material = (byte) Tile::netherRack_Id; + if (gravel) top = (byte) Tile::gravel_Id; + if (gravel) material = (byte) Tile::netherRack_Id; if (sand) { // 4J Stu - Make some nether wart spawn outside of the nether fortresses if(random->nextInt(16) == 0) { top = (byte) Tile::netherStalk_Id; - + // Place the nether wart on top of the soul sand y += 1; int genDepthMinusOne = Level::genDepthMinusOne; // Take into local int for PS4 as min takes a reference to the const int there and then needs the value to exist for the linker @@ -234,30 +234,30 @@ void HellRandomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks } else { - top = (byte) Tile::hellSand_Id; + top = (byte) Tile::soulsand_Id; } } - if (sand) material = (byte) Tile::hellSand_Id; - } + if (sand) material = (byte) Tile::soulsand_Id; + } - if (y < waterHeight && top == 0) top = (byte) Tile::calmLava_Id; + if (y < waterHeight && top == 0) top = (byte) Tile::calmLava_Id; - run = runDepth; + run = runDepth; // 4J Stu - If sand, then allow adding nether wart at heights below the water level - if (y >= waterHeight - 1 || sand) blocks[offs] = top; - else blocks[offs] = material; - } + if (y >= waterHeight - 1 || sand) blocks[offs] = top; + else blocks[offs] = material; + } else if (run > 0) { - run--; - blocks[offs] = material; - } - } - } - } - } - } - delete [] sandBuffer.data; + run--; + blocks[offs] = material; + } + } + } + } + } + } + delete [] sandBuffer.data; delete [] gravelBuffer.data; delete [] depthBuffer.data; } @@ -269,27 +269,27 @@ LevelChunk *HellRandomLevelSource::create(int x, int z) LevelChunk *HellRandomLevelSource::getChunk(int xOffs, int zOffs) { - random->setSeed(xOffs * 341873128712l + zOffs * 132897987541l); + random->setSeed(xOffs * 341873128712l + zOffs * 132897987541l); // 4J - now allocating this with a physical alloc & bypassing general memory management so that it will get cleanly freed int blocksSize = Level::genDepth * 16 * 16; byte *tileData = (byte *)XPhysicalAlloc(blocksSize, MAXULONG_PTR, 4096, PAGE_READWRITE); XMemSet128(tileData,0,blocksSize); byteArray blocks = byteArray(tileData,blocksSize); -// byteArray blocks = byteArray(16 * level->depth * 16); + // byteArray blocks = byteArray(16 * level->depth * 16); - prepareHeights(xOffs, zOffs, blocks); - buildSurfaces(xOffs, zOffs, blocks); + prepareHeights(xOffs, zOffs, blocks); + buildSurfaces(xOffs, zOffs, blocks); - caveFeature->apply(this, level, xOffs, zOffs, blocks); + caveFeature->apply(this, level, xOffs, zOffs, blocks); netherBridgeFeature->apply(this, level, xOffs, zOffs, blocks); // 4J - this now creates compressed block data from the blocks array passed in, so needs to be after data is finalised. // Also now need to free the passed in blocks as the LevelChunk doesn't use the passed in allocation anymore. - LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); + LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); levelChunk->setCheckAllLight(); XPhysicalFree(tileData); - return levelChunk; + return levelChunk; } // 4J - removed & moved into its own method from getChunk, so we can call recalcHeightmap after the chunk is added into the cache. Without @@ -303,105 +303,105 @@ void HellRandomLevelSource::lightChunk(LevelChunk *lc) doubleArray HellRandomLevelSource::getHeights(doubleArray buffer, int x, int y, int z, int xSize, int ySize, int zSize) { - if (buffer.data == NULL) + if (buffer.data == NULL) { - buffer = doubleArray(xSize * ySize * zSize); - } + buffer = doubleArray(xSize * ySize * zSize); + } - double s = 1 * 684.412; - double hs = 1 * 684.412 * 3; + double s = 1 * 684.412; + double hs = 1 * 684.412 * 3; doubleArray pnr, ar, br, sr, dr, fi, fis; // 4J - used to be declared with class level scope but moved here for thread safety - sr = scaleNoise->getRegion(sr, x, y, z, xSize, 1, zSize, 1.0, 0, 1.0); - dr = depthNoise->getRegion(dr, x, y, z, xSize, 1, zSize, 100.0, 0, 100.0); + sr = scaleNoise->getRegion(sr, x, y, z, xSize, 1, zSize, 1.0, 0, 1.0); + dr = depthNoise->getRegion(dr, x, y, z, xSize, 1, zSize, 100.0, 0, 100.0); - pnr = perlinNoise1->getRegion(pnr, x, y, z, xSize, ySize, zSize, s / 80.0, hs / 60.0, s / 80.0); - ar = lperlinNoise1->getRegion(ar, x, y, z, xSize, ySize, zSize, s, hs, s); - br = lperlinNoise2->getRegion(br, x, y, z, xSize, ySize, zSize, s, hs, s); + pnr = perlinNoise1->getRegion(pnr, x, y, z, xSize, ySize, zSize, s / 80.0, hs / 60.0, s / 80.0); + ar = lperlinNoise1->getRegion(ar, x, y, z, xSize, ySize, zSize, s, hs, s); + br = lperlinNoise2->getRegion(br, x, y, z, xSize, ySize, zSize, s, hs, s); - int p = 0; - int pp = 0; - doubleArray yoffs = doubleArray(ySize); - for (int yy = 0; yy < ySize; yy++) + int p = 0; + int pp = 0; + doubleArray yoffs = doubleArray(ySize); + for (int yy = 0; yy < ySize; yy++) { - yoffs[yy] = cos(yy * PI * 6 / (double) ySize) * 2; + yoffs[yy] = cos(yy * PI * 6 / (double) ySize) * 2; - double dd = yy; - if (yy > ySize / 2) + double dd = yy; + if (yy > ySize / 2) { - dd = (ySize - 1) - yy; - } - if (dd < 4) { - dd = 4 - dd; - yoffs[yy] -= dd * dd * dd * 10; - } - } - - for (int xx = 0; xx < xSize; xx++) + dd = (ySize - 1) - yy; + } + if (dd < 4) { + dd = 4 - dd; + yoffs[yy] -= dd * dd * dd * 10; + } + } + + for (int xx = 0; xx < xSize; xx++) { - for (int zz = 0; zz < zSize; zz++) + for (int zz = 0; zz < zSize; zz++) { - double scale = ((sr[pp] + 256.0) / 512); - if (scale > 1) scale = 1; + double scale = ((sr[pp] + 256.0) / 512); + if (scale > 1) scale = 1; - double floating = 0; + double floating = 0; - double depth = (dr[pp] / 8000.0); - if (depth < 0) depth = -depth; - depth = depth * 3.0 - 3.0; + double depth = (dr[pp] / 8000.0); + if (depth < 0) depth = -depth; + depth = depth * 3.0 - 3.0; - if (depth < 0) + if (depth < 0) { - depth = depth / 2; - if (depth < -1) depth = -1; - depth = depth / 1.4; - depth /= 2; - scale = 0; - } + depth = depth / 2; + if (depth < -1) depth = -1; + depth = depth / 1.4; + depth /= 2; + scale = 0; + } else { - if (depth > 1) depth = 1; - depth = depth / 6; - } - scale = (scale) + 0.5; - depth = depth * ySize / 16; - pp++; - - for (int yy = 0; yy < ySize; yy++) + if (depth > 1) depth = 1; + depth = depth / 6; + } + scale = (scale) + 0.5; + depth = depth * ySize / 16; + pp++; + + for (int yy = 0; yy < ySize; yy++) { - double val = 0; + double val = 0; - double yOffs = yoffs[yy]; + double yOffs = yoffs[yy]; - double bb = ar[p] / 512; - double cc = br[p] / 512; + double bb = ar[p] / 512; + double cc = br[p] / 512; - double v = (pnr[p] / 10 + 1) / 2; - if (v < 0) val = bb; - else if (v > 1) val = cc; - else val = bb + (cc - bb) * v; - val -= yOffs; + double v = (pnr[p] / 10 + 1) / 2; + if (v < 0) val = bb; + else if (v > 1) val = cc; + else val = bb + (cc - bb) * v; + val -= yOffs; - if (yy > ySize - 4) + if (yy > ySize - 4) { - double slide = (yy - (ySize - 4)) / (4 - 1.0f); - val = val * (1 - slide) + -10 * slide; - } + double slide = (yy - (ySize - 4)) / (4 - 1.0f); + val = val * (1 - slide) + -10 * slide; + } - if (yy < floating) + if (yy < floating) { - double slide = (floating - yy) / (4); - if (slide < 0) slide = 0; - if (slide > 1) slide = 1; - val = val * (1 - slide) + -10 * slide; - } - - buffer[p] = val; - p++; - } - } - } + double slide = (floating - yy) / (4); + if (slide < 0) slide = 0; + if (slide > 1) slide = 1; + val = val * (1 - slide) + -10 * slide; + } + + buffer[p] = val; + p++; + } + } + } delete [] pnr.data; delete [] ar.data; @@ -412,7 +412,7 @@ doubleArray HellRandomLevelSource::getHeights(doubleArray buffer, int x, int y, delete [] fis.data; delete [] yoffs.data; - return buffer; + return buffer; } bool HellRandomLevelSource::hasChunk(int x, int y) @@ -422,9 +422,9 @@ bool HellRandomLevelSource::hasChunk(int x, int y) void HellRandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) { - HeavyTile::instaFall = true; - int xo = xt * 16; - int zo = zt * 16; + HeavyTile::instaFall = true; + int xo = xt * 16; + int zo = zt * 16; // 4J - added. The original java didn't do any setting of the random seed here. We'll be running our postProcess in parallel with getChunk etc. so // we need to use a separate random - have used the same initialisation code as used in RandomLevelSource::postProcess to make sure this random value @@ -436,58 +436,58 @@ void HellRandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) netherBridgeFeature->postProcess(level, pprandom, xt, zt); - for (int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth - 8) + 4; - int z = zo + pprandom->nextInt(16) + 8; - HellSpringFeature(Tile::lava_Id).place(level, pprandom, x, y, z); - } + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth - 8) + 4; + int z = zo + pprandom->nextInt(16) + 8; + HellSpringFeature(Tile::lava_Id, false).place(level, pprandom, x, y, z); + } - int count = pprandom->nextInt(pprandom->nextInt(10) + 1) + 1; + int count = pprandom->nextInt(pprandom->nextInt(10) + 1) + 1; - for (int i = 0; i < count; i++) + for (int i = 0; i < count; i++) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth - 8) + 4; - int z = zo + pprandom->nextInt(16) + 8; - HellFireFeature().place(level, pprandom, x, y, z); - } - - count = pprandom->nextInt(pprandom->nextInt(10) + 1); - for (int i = 0; i < count; i++) + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth - 8) + 4; + int z = zo + pprandom->nextInt(16) + 8; + HellFireFeature().place(level, pprandom, x, y, z); + } + + count = pprandom->nextInt(pprandom->nextInt(10) + 1); + for (int i = 0; i < count; i++) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth - 8) + 4; - int z = zo + pprandom->nextInt(16) + 8; - LightGemFeature().place(level, pprandom, x, y, z); - } + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth - 8) + 4; + int z = zo + pprandom->nextInt(16) + 8; + LightGemFeature().place(level, pprandom, x, y, z); + } - for (int i = 0; i < 10; i++) + for (int i = 0; i < 10; i++) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth); - int z = zo + pprandom->nextInt(16) + 8; - HellPortalFeature().place(level, pprandom, x, y, z); - } + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth); + int z = zo + pprandom->nextInt(16) + 8; + HellPortalFeature().place(level, pprandom, x, y, z); + } - if (pprandom->nextInt(1) == 0) + if (pprandom->nextInt(1) == 0) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth); - int z = zo + pprandom->nextInt(16) + 8; - FlowerFeature(Tile::mushroom1_Id).place(level, pprandom, x, y, z); - } + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth); + int z = zo + pprandom->nextInt(16) + 8; + FlowerFeature(Tile::mushroom_brown_Id).place(level, pprandom, x, y, z); + } - if (pprandom->nextInt(1) == 0) + if (pprandom->nextInt(1) == 0) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth); - int z = zo + pprandom->nextInt(16) + 8; - FlowerFeature(Tile::mushroom2_Id).place(level, pprandom, x, y, z); - } + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth); + int z = zo + pprandom->nextInt(16) + 8; + FlowerFeature(Tile::mushroom_red_Id).place(level, pprandom, x, y, z); + } - OreFeature quartzFeature(Tile::netherQuartz_Id, 13, Tile::hellRock_Id); + OreFeature quartzFeature(Tile::netherQuartz_Id, 13, Tile::netherRack_Id); for (int i = 0; i < 16; i++) { int x = xo + pprandom->nextInt(16); @@ -496,8 +496,17 @@ void HellRandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) quartzFeature.place(level, pprandom, x, y, z); } - HeavyTile::instaFall = false; - + for (int i = 0; i < 16; i++) + { + int x = xo + random->nextInt(16); + int y = random->nextInt(Level::genDepth - 20) + 10; + int z = zo + random->nextInt(16); + HellSpringFeature hellSpringFeature(Tile::lava_Id, true); + hellSpringFeature.place(level, random, x, y, z); + } + + HeavyTile::instaFall = false; + app.processSchematics(parent->getChunk(xt,zt)); } @@ -524,21 +533,33 @@ wstring HellRandomLevelSource::gatherStats() vector *HellRandomLevelSource::getMobsAt(MobCategory *mobCategory, int x, int y, int z) { - // check if the coordinates is within a netherbridge - if (mobCategory == MobCategory::monster && netherBridgeFeature->isInsideFeature(x, y, z)) + // check if the coordinates is within a netherbridge + if (mobCategory == MobCategory::monster) { - return netherBridgeFeature->getBridgeEnemies(); - } + if(netherBridgeFeature->isInsideFeature(x, y, z)) + { + return netherBridgeFeature->getBridgeEnemies(); + } + if ((netherBridgeFeature->isInsideBoundingFeature(x, y, z) && level->getTile(x, y - 1, z) == Tile::netherBrick_Id)) + { + return netherBridgeFeature->getBridgeEnemies(); + } + } - Biome *biome = level->getBiome(x, z); - if (biome == NULL) + Biome *biome = level->getBiome(x, z); + if (biome == NULL) { - return NULL; - } - return biome->getMobs(mobCategory); + return NULL; + } + return biome->getMobs(mobCategory); } TilePos *HellRandomLevelSource::findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z) { return NULL; } + +void HellRandomLevelSource::recreateLogicStructuresForChunk(int chunkX, int chunkZ) +{ + netherBridgeFeature->apply(this, level, chunkX, chunkZ, NULL); +} \ No newline at end of file diff --git a/Minecraft.World/HellRandomLevelSource.h b/Minecraft.World/HellRandomLevelSource.h index 0587e86a..2a0c3c86 100644 --- a/Minecraft.World/HellRandomLevelSource.h +++ b/Minecraft.World/HellRandomLevelSource.h @@ -17,36 +17,36 @@ class HellRandomLevelSource : public ChunkSource { public: static const int CHUNK_HEIGHT = 8; - static const int CHUNK_WIDTH = 4; + static const int CHUNK_WIDTH = 4; private: Random *random; Random *pprandom; // 4J added PerlinNoise *lperlinNoise1; - PerlinNoise *lperlinNoise2; - PerlinNoise *perlinNoise1; - PerlinNoise *perlinNoise2; - PerlinNoise *perlinNoise3; + PerlinNoise *lperlinNoise2; + PerlinNoise *perlinNoise1; + PerlinNoise *perlinNoise2; + PerlinNoise *perlinNoise3; public: PerlinNoise *scaleNoise; - PerlinNoise *depthNoise; + PerlinNoise *depthNoise; private: Level *level; public: - HellRandomLevelSource(Level *level, __int64 seed); + HellRandomLevelSource(Level *level, __int64 seed); ~HellRandomLevelSource(); NetherBridgeFeature *netherBridgeFeature; private: - void prepareHeights(int xOffs, int zOffs, byteArray blocks); + void prepareHeights(int xOffs, int zOffs, byteArray blocks); public: - void buildSurfaces(int xOffs, int zOffs, byteArray blocks); + void buildSurfaces(int xOffs, int zOffs, byteArray blocks); private: LargeFeature *caveFeature; @@ -57,16 +57,17 @@ public: virtual void lightChunk(LevelChunk *lc); // 4J added private: - doubleArray getHeights(doubleArray buffer, int x, int y, int z, int xSize, int ySize, int zSize); + doubleArray getHeights(doubleArray buffer, int x, int y, int z, int xSize, int ySize, int zSize); public: bool hasChunk(int x, int y); - void postProcess(ChunkSource *parent, int xt, int zt); - bool save(bool force, ProgressListener *progressListener); - bool tick(); - bool shouldSave(); - wstring gatherStats(); + void postProcess(ChunkSource *parent, int xt, int zt); + bool save(bool force, ProgressListener *progressListener); + bool tick(); + bool shouldSave(); + wstring gatherStats(); virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z); - virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ); }; diff --git a/Minecraft.World/HellSpringFeature.cpp b/Minecraft.World/HellSpringFeature.cpp index cfd2d74f..1b62b9b2 100644 --- a/Minecraft.World/HellSpringFeature.cpp +++ b/Minecraft.World/HellSpringFeature.cpp @@ -3,40 +3,41 @@ #include "HellSpringFeature.h" #include "net.minecraft.world.level.tile.h" -HellSpringFeature::HellSpringFeature(int tile) +HellSpringFeature::HellSpringFeature(int tile, bool insideRock) { this->tile = tile; + this->insideRock = insideRock; } bool HellSpringFeature::place(Level *level, Random *random, int x, int y, int z) { - if (level->getTile(x, y + 1, z) != Tile::hellRock_Id) return false; - if (level->getTile(x, y - 1, z) != Tile::hellRock_Id) return false; - - if (level->getTile(x, y, z) != 0 && level->getTile(x, y, z) != Tile::hellRock_Id) return false; - - int rockCount = 0; - if (level->getTile(x - 1, y, z) == Tile::hellRock_Id) rockCount++; - if (level->getTile(x + 1, y, z) == Tile::hellRock_Id) rockCount++; - if (level->getTile(x, y, z - 1) == Tile::hellRock_Id) rockCount++; - if (level->getTile(x, y, z + 1) == Tile::hellRock_Id) rockCount++; - if (level->getTile(x, y - 1, z) == Tile::hellRock_Id) rockCount++; - - int holeCount = 0; - if (level->isEmptyTile(x - 1, y, z)) holeCount++; - if (level->isEmptyTile(x + 1, y, z)) holeCount++; - if (level->isEmptyTile(x, y, z - 1)) holeCount++; - if (level->isEmptyTile(x, y, z + 1)) holeCount++; + if (level->getTile(x, y + 1, z) != Tile::netherRack_Id) return false; + if (level->getTile(x, y - 1, z) != Tile::netherRack_Id) return false; + + if (level->getTile(x, y, z) != 0 && level->getTile(x, y, z) != Tile::netherRack_Id) return false; + + int rockCount = 0; + if (level->getTile(x - 1, y, z) == Tile::netherRack_Id) rockCount++; + if (level->getTile(x + 1, y, z) == Tile::netherRack_Id) rockCount++; + if (level->getTile(x, y, z - 1) == Tile::netherRack_Id) rockCount++; + if (level->getTile(x, y, z + 1) == Tile::netherRack_Id) rockCount++; + if (level->getTile(x, y - 1, z) == Tile::netherRack_Id) rockCount++; + + int holeCount = 0; + if (level->isEmptyTile(x - 1, y, z)) holeCount++; + if (level->isEmptyTile(x + 1, y, z)) holeCount++; + if (level->isEmptyTile(x, y, z - 1)) holeCount++; + if (level->isEmptyTile(x, y, z + 1)) holeCount++; if (level->isEmptyTile(x, y - 1, z)) holeCount++; - if (rockCount == 4 && holeCount == 1) + if ((!insideRock && rockCount == 4 && holeCount == 1) || rockCount == 5) { - level->setTile(x, y, z, tile); - level->setInstaTick(true); - Tile::tiles[tile]->tick(level, x, y, z, random); - level->setInstaTick(false); - } + level->setTileAndData(x, y, z, tile, 0, Tile::UPDATE_CLIENTS); + level->setInstaTick(true); + Tile::tiles[tile]->tick(level, x, y, z, random); + level->setInstaTick(false); + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/HellSpringFeature.h b/Minecraft.World/HellSpringFeature.h index a8ffbc00..a0ab4c93 100644 --- a/Minecraft.World/HellSpringFeature.h +++ b/Minecraft.World/HellSpringFeature.h @@ -6,9 +6,10 @@ class HellSpringFeature : public Feature { private: int tile; + bool insideRock; public: - HellSpringFeature(int tile); + HellSpringFeature(int tile, bool insideRock); - virtual bool place(Level *level, Random *random, int x, int y, int z); + virtual bool place(Level *level, Random *random, int x, int y, int z); }; \ No newline at end of file diff --git a/Minecraft.World/HitResult.cpp b/Minecraft.World/HitResult.cpp index ffa93541..8599e034 100644 --- a/Minecraft.World/HitResult.cpp +++ b/Minecraft.World/HitResult.cpp @@ -5,7 +5,7 @@ HitResult::HitResult(int x, int y, int z, int f, Vec3 *pos) { - this->type = TILE; + type = TILE; this->x = x; this->y = y; this->z = z; @@ -17,7 +17,7 @@ HitResult::HitResult(int x, int y, int z, int f, Vec3 *pos) HitResult::HitResult(shared_ptr entity) { - this->type = ENTITY; + type = ENTITY; this->entity = entity; pos = Vec3::newTemp(entity->x, entity->y, entity->z); diff --git a/Minecraft.World/HoeItem.cpp b/Minecraft.World/HoeItem.cpp index 50dde305..9714e5fc 100644 --- a/Minecraft.World/HoeItem.cpp +++ b/Minecraft.World/HoeItem.cpp @@ -14,15 +14,13 @@ HoeItem::HoeItem(int id, const Tier *tier) : Item(id) bool HoeItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { - if (!player->mayBuild(x, y, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; // 4J-PB - Adding a test only version to allow tooltips to be displayed int targetType = level->getTile(x, y, z); - // Material above = level.getMaterial(x, y + 1, z); int above = level->getTile(x, y + 1, z); - // 4J-PB - missing parentheses if (face != 0 && above == 0 && (targetType == Tile::grass_Id || targetType == Tile::dirt_Id)) { if(!bTestUseOnOnly) @@ -31,8 +29,8 @@ bool HoeItem::useOn(shared_ptr instance, shared_ptr player level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, tile->soundType->getStepSound(), (tile->soundType->getVolume() + 1) / 2, tile->soundType->getPitch() * 0.8f); if (level->isClientSide) return true; - level->setTile(x, y, z, tile->id); - instance->hurt(1, player); + level->setTileAndUpdate(x, y, z, tile->id); + instance->hurtAndBreak(1, player); } return true; } diff --git a/Minecraft.World/Hopper.h b/Minecraft.World/Hopper.h new file mode 100644 index 00000000..08555dcf --- /dev/null +++ b/Minecraft.World/Hopper.h @@ -0,0 +1,14 @@ +#pragma once + +#include "Container.h" + +class Level; + +class Hopper : public virtual Container +{ +public: + virtual Level *getLevel() = 0; + virtual double getLevelX() = 0; + virtual double getLevelY() = 0; + virtual double getLevelZ() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/HopperMenu.cpp b/Minecraft.World/HopperMenu.cpp new file mode 100644 index 00000000..afc700c3 --- /dev/null +++ b/Minecraft.World/HopperMenu.cpp @@ -0,0 +1,76 @@ +#include "stdafx.h" +#include "net.minecraft.world.inventory.h" +#include "HopperMenu.h" + +HopperMenu::HopperMenu(shared_ptr inventory, shared_ptr hopper) +{ + this->hopper = hopper; + hopper->startOpen(); + int yo = 51; + + for (int x = 0; x < hopper->getContainerSize(); x++) + { + addSlot(new Slot(hopper, x, 44 + x * 18, 20)); + } + + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x + y * 9 + 9, 8 + x * 18, y * 18 + yo)); + } + } + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x, 8 + x * 18, 58 + yo)); + } +} + +bool HopperMenu::stillValid(shared_ptr player) +{ + return hopper->stillValid(player); +} + +shared_ptr HopperMenu::quickMoveStack(shared_ptr player, int slotIndex) +{ + shared_ptr clicked = nullptr; + Slot *slot = slots.at(slotIndex); + if (slot != NULL && slot->hasItem()) + { + shared_ptr stack = slot->getItem(); + clicked = stack->copy(); + + if (slotIndex < hopper->getContainerSize()) + { + if (!moveItemStackTo(stack, hopper->getContainerSize(), slots.size(), true)) + { + return nullptr; + } + } else { + if (!moveItemStackTo(stack, 0, hopper->getContainerSize(), false)) + { + return nullptr; + } + } + if (stack->count == 0) + { + slot->set(nullptr); + } + else + { + slot->setChanged(); + } + } + return clicked; +} + +void HopperMenu::removed(shared_ptr player) +{ + AbstractContainerMenu::removed(player); + hopper->stopOpen(); +} + +shared_ptr HopperMenu::getContainer() +{ + return hopper; +} \ No newline at end of file diff --git a/Minecraft.World/HopperMenu.h b/Minecraft.World/HopperMenu.h new file mode 100644 index 00000000..ee0c4b93 --- /dev/null +++ b/Minecraft.World/HopperMenu.h @@ -0,0 +1,24 @@ +#pragma once + +#include "AbstractContainerMenu.h" + +class HopperMenu : public AbstractContainerMenu +{ +private: + shared_ptr hopper; + +public: + static const int CONTENTS_SLOT_START = 0; + static const int INV_SLOT_START = CONTENTS_SLOT_START + 5; + static const int INV_SLOT_END = INV_SLOT_START + 9 * 3; + static const int USE_ROW_SLOT_START = INV_SLOT_END; + static const int USE_ROW_SLOT_END = USE_ROW_SLOT_START + 9; + +public: + HopperMenu(shared_ptr inventory, shared_ptr hopper); + + bool stillValid(shared_ptr player); + shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + void removed(shared_ptr player); + shared_ptr getContainer(); +}; \ No newline at end of file diff --git a/Minecraft.World/HopperTile.cpp b/Minecraft.World/HopperTile.cpp new file mode 100644 index 00000000..c111105e --- /dev/null +++ b/Minecraft.World/HopperTile.cpp @@ -0,0 +1,211 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.inventory.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.h" +#include "HopperTile.h" + +const wstring HopperTile::TEXTURE_OUTSIDE = L"hopper_outside"; +const wstring HopperTile::TEXTURE_INSIDE = L"hopper_inside"; + +HopperTile::HopperTile(int id) : BaseEntityTile(id, Material::metal, isSolidRender() ) +{ + setShape(0, 0, 0, 1, 1, 1); +} + +void HopperTile::updateShape(LevelSource *level, int x, int y, int z, int forceData , shared_ptr forceEntity) +{ + setShape(0, 0, 0, 1, 1, 1); +} + +void HopperTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) +{ + setShape(0, 0, 0, 1, 10.0f / 16.0f, 1); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); + float thickness = 2.0f / 16.0f; + setShape(0, 0, 0, thickness, 1, 1); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); + setShape(0, 0, 0, 1, 1, thickness); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); + setShape(1 - thickness, 0, 0, 1, 1, 1); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); + setShape(0, 0, 1 - thickness, 1, 1, 1); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); + + setShape(0, 0, 0, 1, 1, 1); +} + +int HopperTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) +{ + int attached = Facing::OPPOSITE_FACING[face]; + if (attached == Facing::UP) attached = Facing::DOWN; + return attached; +} + +shared_ptr HopperTile::newTileEntity(Level *level) +{ + return shared_ptr( new HopperTileEntity() ); +} + +void HopperTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + BaseEntityTile::setPlacedBy(level, x, y, z, by, itemInstance); + + if (itemInstance->hasCustomHoverName()) + { + shared_ptr hopper = getHopper(level, x, y, z); + hopper->setCustomName(itemInstance->getHoverName()); + } +} + +void HopperTile::onPlace(Level *level, int x, int y, int z) +{ + BaseEntityTile::onPlace(level, x, y, z); + checkPoweredState(level, x, y, z); +} + +bool HopperTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +{ + if (level->isClientSide) + { + return true; + } + shared_ptr hopper = getHopper(level, x, y, z); + if (hopper != NULL) player->openHopper(hopper); + return true; +} + +void HopperTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + checkPoweredState(level, x, y, z); +} + +void HopperTile::checkPoweredState(Level *level, int x, int y, int z) +{ + int data = level->getData(x, y, z); + int attachedFace = getAttachedFace(data); + bool shouldBeOn = !level->hasNeighborSignal(x, y, z); + bool isOn = isTurnedOn(data); + + if (shouldBeOn != isOn) + { + level->setData(x, y, z, attachedFace | (shouldBeOn ? 0 : MASK_TOGGLE), UPDATE_NONE); + } +} + +void HopperTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + shared_ptr container = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + if (container != NULL) + { + for (int i = 0; i < container->getContainerSize(); i++) + { + shared_ptr item = container->getItem(i); + if (item != NULL) + { + float xo = random.nextFloat() * 0.8f + 0.1f; + float yo = random.nextFloat() * 0.8f + 0.1f; + float zo = random.nextFloat() * 0.8f + 0.1f; + + while (item->count > 0) + { + int count = random.nextInt(21) + 10; + if (count > item->count) count = item->count; + item->count -= count; + + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue())))); + + if (item->hasTag()) + { + itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); + } + + float pow = 0.05f; + itemEntity->xd = (float) random.nextGaussian() * pow; + itemEntity->yd = (float) random.nextGaussian() * pow + 0.2f; + itemEntity->zd = (float) random.nextGaussian() * pow; + level->addEntity(itemEntity); + } + } + } + level->updateNeighbourForOutputSignal(x, y, z, id); + } + + BaseEntityTile::onRemove(level, x, y, z, id, data); +} + +int HopperTile::getRenderShape() +{ + return SHAPE_HOPPER; +} + +bool HopperTile::isCubeShaped() +{ + return false; +} + +bool HopperTile::isSolidRender(bool isServerLevel /*= false*/) +{ + return false; +} + +bool HopperTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) +{ + return true; +} + +Icon *HopperTile::getTexture(int face, int data) +{ + if (face == Facing::UP) + { + return hopperTopIcon; + } + return hopperIcon; +} + +int HopperTile::getAttachedFace(int data) +{ + return data & MASK_ATTACHED; +} + +bool HopperTile::isTurnedOn(int data) +{ + return (data & MASK_TOGGLE) != MASK_TOGGLE; +} + +bool HopperTile::hasAnalogOutputSignal() +{ + return true; +} + +int HopperTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + return AbstractContainerMenu::getRedstoneSignalFromContainer(getHopper(level, x, y, z)); +} + +void HopperTile::registerIcons(IconRegister *iconRegister) +{ + hopperIcon = iconRegister->registerIcon(TEXTURE_OUTSIDE); + hopperTopIcon = iconRegister->registerIcon(L"hopper_top"); + hopperInnerIcon = iconRegister->registerIcon(TEXTURE_INSIDE); +} + +Icon *HopperTile::getTexture(const wstring &name) +{ + if (name.compare(TEXTURE_OUTSIDE) == 0) return Tile::hopper->hopperIcon; + if (name.compare(TEXTURE_INSIDE) == 0) return Tile::hopper->hopperInnerIcon; + return NULL; +} + +wstring HopperTile::getTileItemIconName() +{ + return L"hopper"; +} + +shared_ptr HopperTile::getHopper(LevelSource *level, int x, int y, int z) +{ + return dynamic_pointer_cast( level->getTileEntity(x, y, z) ); +} \ No newline at end of file diff --git a/Minecraft.World/HopperTile.h b/Minecraft.World/HopperTile.h new file mode 100644 index 00000000..12631587 --- /dev/null +++ b/Minecraft.World/HopperTile.h @@ -0,0 +1,56 @@ +#pragma once + +#include "BaseEntityTile.h" + +class HopperTileEntity; + +class HopperTile : public BaseEntityTile +{ + friend class ChunkRebuildData; +private: + static const int MASK_TOGGLE = 0x8; + static const int MASK_ATTACHED = 0x7; + +public : + static const wstring TEXTURE_OUTSIDE; + static const wstring TEXTURE_INSIDE; + +private: + Random random; + +private: + Icon *hopperIcon; + Icon *hopperTopIcon; + Icon *hopperInnerIcon; + +public: + HopperTile(int id); + + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); + virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); + virtual shared_ptr newTileEntity(Level *level); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void onPlace(Level *level, int x, int y, int z); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + +private: + virtual void checkPoweredState(Level *level, int x, int y, int z); + +public: + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual int getRenderShape(); + virtual bool isCubeShaped(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); + virtual Icon *getTexture(int face, int data); + static int getAttachedFace(int data); + static bool isTurnedOn(int data); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); + virtual void registerIcons(IconRegister *iconRegister); + static Icon *getTexture(const wstring &name); + virtual wstring getTileItemIconName(); + static shared_ptr getHopper(LevelSource *level, int x, int y, int z); +}; \ No newline at end of file diff --git a/Minecraft.World/HopperTileEntity.cpp b/Minecraft.World/HopperTileEntity.cpp new file mode 100644 index 00000000..77cb8152 --- /dev/null +++ b/Minecraft.World/HopperTileEntity.cpp @@ -0,0 +1,505 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.world.h" +#include "HopperTileEntity.h" + +HopperTileEntity::HopperTileEntity() +{ + items = ItemInstanceArray(5); + name = L""; + cooldownTime = -1; +} + +HopperTileEntity::~HopperTileEntity() +{ + delete [] items.data; +} + +void HopperTileEntity::load(CompoundTag *base) +{ + TileEntity::load(base); + + ListTag *inventoryList = (ListTag *) base->getList(L"Items"); + delete[] items.data; + items = ItemInstanceArray(getContainerSize()); + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); + cooldownTime = base->getInt(L"TransferCooldown"); + for (int i = 0; i < inventoryList->size(); i++) + { + CompoundTag *tag = inventoryList->get(i); + int slot = tag->getByte(L"Slot"); + if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); + } +} + +void HopperTileEntity::save(CompoundTag *base) +{ + TileEntity::save(base); + ListTag *listTag = new ListTag(); + + for (int i = 0; i < items.length; i++) + { + if (items[i] != NULL) + { + CompoundTag *tag = new CompoundTag(); + tag->putByte(L"Slot", (byte) i); + items[i]->save(tag); + listTag->add(tag); + } + } + base->put(L"Items", listTag); + base->putInt(L"TransferCooldown", cooldownTime); + if (hasCustomName()) base->putString(L"CustomName", name); +} + +void HopperTileEntity::setChanged() +{ + TileEntity::setChanged(); +} + +unsigned int HopperTileEntity::getContainerSize() +{ + return items.length; +} + +shared_ptr HopperTileEntity::getItem(unsigned int slot) +{ + return items[slot]; +} + +shared_ptr HopperTileEntity::removeItem(unsigned int slot, int count) +{ + if (items[slot] != NULL) + { + if (items[slot]->count <= count) + { + shared_ptr item = items[slot]; + items[slot] = nullptr; + return item; + } + else + { + shared_ptr i = items[slot]->remove(count); + if (items[slot]->count == 0) items[slot] = nullptr; + return i; + } + } + return nullptr; +} + +shared_ptr HopperTileEntity::removeItemNoUpdate(int slot) +{ + if (items[slot] != NULL) + { + shared_ptr item = items[slot]; + items[slot] = nullptr; + return item; + } + return nullptr; +} + +void HopperTileEntity::setItem(unsigned int slot, shared_ptr item) +{ + items[slot] = item; + if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); +} + +wstring HopperTileEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_CONTAINER_HOPPER); +} + +wstring HopperTileEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +bool HopperTileEntity::hasCustomName() +{ + return !name.empty(); +} + +void HopperTileEntity::setCustomName(const wstring &name) +{ + this->name = name; +} + +int HopperTileEntity::getMaxStackSize() +{ + return Container::LARGE_MAX_STACK_SIZE; +} + +bool HopperTileEntity::stillValid(shared_ptr player) +{ + if (level->getTileEntity(x, y, z) != shared_from_this()) return false; + if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; + return true; +} + +void HopperTileEntity::startOpen() +{ +} + +void HopperTileEntity::stopOpen() +{ +} + +bool HopperTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + +void HopperTileEntity::tick() +{ + if (level == NULL || level->isClientSide) return; + + cooldownTime--; + + if (!isOnCooldown()) + { + setCooldown(0); + tryMoveItems(); + } +} + +bool HopperTileEntity::tryMoveItems() +{ + if (level == NULL || level->isClientSide) return false; + + if (!isOnCooldown() && HopperTile::isTurnedOn(getData())) + { + bool changed = ejectItems(); + changed = suckInItems(this) || changed; + + if (changed) + { + setCooldown(MOVE_ITEM_SPEED); + setChanged(); + return true; + } + } + + return false; +} + +bool HopperTileEntity::ejectItems() +{ + shared_ptr container = getAttachedContainer(); + if (container == NULL) + { + return false; + } + + for (int slot = 0; slot < getContainerSize(); slot++) + { + if (getItem(slot) == NULL) continue; + + shared_ptr original = getItem(slot)->copy(); + shared_ptr result = addItem(container.get(), removeItem(slot, 1), Facing::OPPOSITE_FACING[HopperTile::getAttachedFace(getData())]); + + if (result == NULL || result->count == 0) + { + container->setChanged(); + return true; + } + else + { + setItem(slot, original); + } + } + + return false; +} + +bool HopperTileEntity::suckInItems(Hopper *hopper) +{ + shared_ptr container = getSourceContainer(hopper); + + if (container != NULL) + { + int face = Facing::DOWN; + + shared_ptr worldly = dynamic_pointer_cast(container); + if ( (worldly != NULL) && (face > -1) ) + { + intArray slots = worldly->getSlotsForFace(face); + + for (int i = 0; i < slots.length; i++) + { + if (tryTakeInItemFromSlot(hopper, container.get(), slots[i], face)) return true; + } + } + else + { + int size = container->getContainerSize(); + for (int i = 0; i < size; i++) + { + if (tryTakeInItemFromSlot(hopper, container.get(), i, face)) return true; + } + } + } + else + { + shared_ptr above = getItemAt(hopper->getLevel(), hopper->getLevelX(), hopper->getLevelY() + 1, hopper->getLevelZ()); + + if (above != NULL) + { + return addItem(hopper, above); + } + } + + return false; +} + +bool HopperTileEntity::tryTakeInItemFromSlot(Hopper *hopper, Container *container, int slot, int face) +{ + shared_ptr item = container->getItem(slot); + + if (item != NULL && canTakeItemFromContainer(container, item, slot, face)) + { + shared_ptr original = item->copy(); + shared_ptr result = addItem(hopper, container->removeItem(slot, 1), -1); + + if (result == NULL || result->count == 0) + { + container->setChanged(); + return true; + } + else + { + container->setItem(slot, original); + } + } + + return false; +} + +bool HopperTileEntity::addItem(Container *container, shared_ptr item) +{ + bool changed = false; + if (item == NULL) return false; + + shared_ptr copy = item->getItem()->copy(); + shared_ptr result = addItem(container, copy, -1); + + if (result == NULL || result->count == 0) + { + changed = true; + + item->remove(); + } + else + { + item->setItem(result); + } + + return changed; +} + +shared_ptr HopperTileEntity::addItem(Container *container, shared_ptr item, int face) +{ + if (dynamic_cast( container ) != NULL && face > -1) + { + WorldlyContainer *worldly = (WorldlyContainer *) container; + intArray slots = worldly->getSlotsForFace(face); + + for (int i = 0; i < slots.length && item != NULL && item->count > 0; i++) + { + item = tryMoveInItem(container, item, slots[i], face); + } + } + else + { + int size = container->getContainerSize(); + for (int i = 0; i < size && item != NULL && item->count > 0; i++) + { + item = tryMoveInItem(container, item, i, face); + } + } + + if (item != NULL && item->count == 0) + { + item = nullptr; + } + + return item; +} + +bool HopperTileEntity::canPlaceItemInContainer(Container *container, shared_ptr item, int slot, int face) +{ + if (!container->canPlaceItem(slot, item)) return false; + if ( dynamic_cast( container ) != NULL && !dynamic_cast( container )->canPlaceItemThroughFace(slot, item, face)) return false; + return true; +} + +bool HopperTileEntity::canTakeItemFromContainer(Container *container, shared_ptr item, int slot, int face) +{ + if (dynamic_cast( container ) != NULL && !dynamic_cast( container )->canTakeItemThroughFace(slot, item, face)) return false; + return true; +} + +shared_ptr HopperTileEntity::tryMoveInItem(Container *container, shared_ptr item, int slot, int face) +{ + shared_ptr current = container->getItem(slot); + + if (canPlaceItemInContainer(container, item, slot, face)) + { + bool success = false; + if (current == NULL) + { + container->setItem(slot, item); + item = nullptr; + success = true; + } + else if (canMergeItems(current, item)) + { + int space = item->getMaxStackSize() - current->count; + int count = min(item->count, space); + + item->count -= count; + current->count += count; + success = count > 0; + } + if (success) + { + HopperTileEntity *hopper = dynamic_cast(container); + if (hopper != NULL) + { + hopper->setCooldown(MOVE_ITEM_SPEED); + container->setChanged(); + } + container->setChanged(); + } + } + return item; +} + +shared_ptr HopperTileEntity::getAttachedContainer() +{ + int face = HopperTile::getAttachedFace(getData()); + return getContainerAt(getLevel(), x + Facing::STEP_X[face], y + Facing::STEP_Y[face], z + Facing::STEP_Z[face]); +} + +shared_ptr HopperTileEntity::getSourceContainer(Hopper *hopper) +{ + return getContainerAt(hopper->getLevel(), hopper->getLevelX(), hopper->getLevelY() + 1, hopper->getLevelZ()); +} + +shared_ptr HopperTileEntity::getItemAt(Level *level, double xt, double yt, double zt) +{ + vector > *entities = level->getEntitiesOfClass(typeid(ItemEntity), AABB::newTemp(xt, yt, zt, xt + 1, yt + 1, zt + 1), EntitySelector::ENTITY_STILL_ALIVE); + + if (entities->size() > 0) + { + shared_ptr out = dynamic_pointer_cast( entities->at(0) ); + delete entities; + return out; + } + else + { + delete entities; + return nullptr; + } +} + +shared_ptr HopperTileEntity::getContainerAt(Level *level, double x, double y, double z) +{ + shared_ptr result = nullptr; + + int xt = Mth::floor(x); + int yt = Mth::floor(y); + int zt = Mth::floor(z); + + shared_ptr entity = level->getTileEntity(xt, yt, zt); + + result = dynamic_pointer_cast(entity); + if (result != NULL) + { + if ( dynamic_pointer_cast(result) != NULL ) + { + int id = level->getTile(xt, yt, zt); + Tile *tile = Tile::tiles[id]; + + if ( dynamic_cast( tile ) != NULL ) + { + result = ((ChestTile *) tile)->getContainer(level, xt, yt, zt); + } + } + } + + if (result == NULL) + { + vector > *entities = level->getEntities(nullptr, AABB::newTemp(x, y, z, x + 1, y + 1, z + 1), EntitySelector::CONTAINER_ENTITY_SELECTOR); + + if ( (entities != NULL) && (entities->size() > 0) ) + { + result = dynamic_pointer_cast( entities->at( level->random->nextInt(entities->size()) ) ); + } + } + + return result; +} + +bool HopperTileEntity::canMergeItems(shared_ptr a, shared_ptr b) +{ + if (a->id != b->id) return false; + if (a->getAuxValue() != b->getAuxValue()) return false; + if (a->count > a->getMaxStackSize()) return false; + if (!ItemInstance::tagMatches(a, b)) return false; + return true; +} + +Level *HopperTileEntity::getLevel() +{ + return TileEntity::getLevel(); +} + +double HopperTileEntity::getLevelX() +{ + return x; +} + +double HopperTileEntity::getLevelY() +{ + return y; +} + +double HopperTileEntity::getLevelZ() +{ + return z; +} + +void HopperTileEntity::setCooldown(int time) +{ + cooldownTime = time; +} + +bool HopperTileEntity::isOnCooldown() +{ + return cooldownTime > 0; +} + +// 4J Added +shared_ptr HopperTileEntity::clone() +{ + shared_ptr result = shared_ptr( new HopperTileEntity() ); + TileEntity::clone(result); + + result->name = name; + result->cooldownTime = cooldownTime; + for (unsigned int i = 0; i < items.length; i++) + { + if (items[i] != NULL) + { + result->items[i] = ItemInstance::clone(items[i]); + } + } + return result; +} \ No newline at end of file diff --git a/Minecraft.World/HopperTileEntity.h b/Minecraft.World/HopperTileEntity.h new file mode 100644 index 00000000..2e84ffdb --- /dev/null +++ b/Minecraft.World/HopperTileEntity.h @@ -0,0 +1,80 @@ +#pragma once + +#include "TileEntity.h" +#include "Hopper.h" + +class HopperTileEntity : public TileEntity, public Hopper +{ +public: + eINSTANCEOF GetType() { return eTYPE_HOPPERTILEENTITY; } + static TileEntity *create() { return new HopperTileEntity(); } + // 4J Added + virtual shared_ptr clone(); + +public: + static const int MOVE_ITEM_SPEED = 8; + +private: + ItemInstanceArray items; + wstring name; + int cooldownTime ; + +public: + HopperTileEntity(); + ~HopperTileEntity(); + + virtual void load(CompoundTag *base); + virtual void save(CompoundTag *base); + virtual void setChanged(); + virtual unsigned int getContainerSize(); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); + virtual int getMaxStackSize(); + virtual bool stillValid(shared_ptr player); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual void tick(); + virtual bool tryMoveItems(); + +private: + virtual bool ejectItems(); + +public: + static bool suckInItems(Hopper *hopper); + +private: + static bool tryTakeInItemFromSlot(Hopper *hopper, Container *container, int slot, int face); + +public: + static bool addItem(Container *container, shared_ptr item); + static shared_ptr addItem(Container *container, shared_ptr item, int face); + +private: + static bool canPlaceItemInContainer(Container *container, shared_ptr item, int slot, int face); + static bool canTakeItemFromContainer(Container *container, shared_ptr item, int slot, int face); + static shared_ptr tryMoveInItem(Container *container, shared_ptr item, int slot, int face); + virtual shared_ptr getAttachedContainer(); + +public: + static shared_ptr getSourceContainer(Hopper *hopper); + static shared_ptr getItemAt(Level *level, double xt, double yt, double zt); + static shared_ptr getContainerAt(Level *level, double x, double y, double z); + +private: + static bool canMergeItems(shared_ptr a, shared_ptr b); + +public: + virtual Level *getLevel(); + virtual double getLevelX(); + virtual double getLevelY(); + virtual double getLevelZ(); + virtual void setCooldown(int time); + virtual bool isOnCooldown(); +}; \ No newline at end of file diff --git a/Minecraft.World/HorseInventoryMenu.cpp b/Minecraft.World/HorseInventoryMenu.cpp new file mode 100644 index 00000000..7dba791f --- /dev/null +++ b/Minecraft.World/HorseInventoryMenu.cpp @@ -0,0 +1,132 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.animal.h" +#include "HorseInventoryMenu.h" + +HorseSaddleSlot::HorseSaddleSlot( shared_ptr horseInventory ) : Slot(horseInventory, EntityHorse::INV_SLOT_SADDLE, 8, 18) +{ +} + +bool HorseSaddleSlot::mayPlace(shared_ptr item) +{ + return Slot::mayPlace(item) && item->id == Item::saddle_Id && !hasItem(); +} + + +HorseArmorSlot::HorseArmorSlot( HorseInventoryMenu *parent, shared_ptr horseInventory ) : Slot(horseInventory, EntityHorse::INV_SLOT_ARMOR, 8, 18 * 2) +{ + m_parent = parent; +} + +bool HorseArmorSlot::mayPlace(shared_ptr item) +{ + return Slot::mayPlace(item) && m_parent->horse->canWearArmor() && EntityHorse::isHorseArmor(item->id); +} + +bool HorseArmorSlot::isActive() +{ + return m_parent->horse->canWearArmor(); +} + + +HorseInventoryMenu::HorseInventoryMenu(shared_ptr playerInventory, shared_ptr horseInventory, shared_ptr horse) +{ + horseContainer = horseInventory; + this->horse = horse; + int containerRows = 3; + horseInventory->startOpen(); + + int yo = (containerRows - 4) * 18; + + // equipment slots + addSlot(new HorseSaddleSlot(horseInventory) ); + addSlot(new HorseArmorSlot(this, horseInventory) ); + + if (horse->isChestedHorse()) + { + for (int y = 0; y < containerRows; y++) + { + for (int x = 0; x < 5; x++) + { + addSlot(new Slot(horseInventory, EntityHorse::INV_BASE_COUNT + x + y * 5, 80 + x * 18, 18 + y * 18)); + } + } + } + + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(playerInventory, x + y * 9 + 9, 8 + x * 18, 102 + y * 18 + yo)); + } + } + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(playerInventory, x, 8 + x * 18, 160 + yo)); + } +} + +bool HorseInventoryMenu::stillValid(shared_ptr player) +{ + return horseContainer->stillValid(player) && horse->isAlive() && horse->distanceTo(player) < 8; +} + +shared_ptr HorseInventoryMenu::quickMoveStack(shared_ptr player, int slotIndex) +{ + shared_ptr clicked = nullptr; + Slot *slot = slots.at(slotIndex); + if (slot != NULL && slot->hasItem()) + { + shared_ptr stack = slot->getItem(); + clicked = stack->copy(); + + if (slotIndex < horseContainer->getContainerSize()) + { + if (!moveItemStackTo(stack, horseContainer->getContainerSize(), slots.size(), true)) + { + return nullptr; + } + } + else + { + if (getSlot(EntityHorse::INV_SLOT_ARMOR)->mayPlace(stack) && !getSlot(EntityHorse::INV_SLOT_ARMOR)->hasItem()) + { + if (!moveItemStackTo(stack, EntityHorse::INV_SLOT_ARMOR, EntityHorse::INV_SLOT_ARMOR + 1, false)) + { + return nullptr; + } + } + else if (getSlot(EntityHorse::INV_SLOT_SADDLE)->mayPlace(stack)) + { + if (!moveItemStackTo(stack, EntityHorse::INV_SLOT_SADDLE, EntityHorse::INV_SLOT_SADDLE + 1, false)) + { + return nullptr; + } + } + else if (horseContainer->getContainerSize() <= EntityHorse::INV_BASE_COUNT || !moveItemStackTo(stack, EntityHorse::INV_BASE_COUNT, horseContainer->getContainerSize(), false)) + { + return nullptr; + } + } + if (stack->count == 0) + { + slot->set(nullptr); + } + else + { + slot->setChanged(); + } + } + return clicked; +} + +void HorseInventoryMenu::removed(shared_ptr player) +{ + AbstractContainerMenu::removed(player); + horseContainer->stopOpen(); +} + +shared_ptr HorseInventoryMenu::getContainer() +{ + return horseContainer; +} \ No newline at end of file diff --git a/Minecraft.World/HorseInventoryMenu.h b/Minecraft.World/HorseInventoryMenu.h new file mode 100644 index 00000000..613c55f9 --- /dev/null +++ b/Minecraft.World/HorseInventoryMenu.h @@ -0,0 +1,41 @@ +#pragma once + +#include "AbstractContainerMenu.h" +#include "Slot.h" + +class HorseInventoryMenu; + +class HorseSaddleSlot : public Slot +{ +public: + HorseSaddleSlot( shared_ptr horseInventory ); + + bool mayPlace(shared_ptr item); +}; + +class HorseArmorSlot : public Slot +{ +private: + HorseInventoryMenu *m_parent; +public: + HorseArmorSlot( HorseInventoryMenu *parent, shared_ptr horseInventory ); + + bool mayPlace(shared_ptr item); + bool isActive(); +}; + +class HorseInventoryMenu : public AbstractContainerMenu +{ + friend class HorseArmorSlot; +private: + shared_ptr horseContainer; + shared_ptr horse; + +public: + HorseInventoryMenu(shared_ptr playerInventory, shared_ptr horseInventory, shared_ptr horse); + + bool stillValid(shared_ptr player); + shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + void removed(shared_ptr player); + shared_ptr getContainer(); +}; \ No newline at end of file diff --git a/Minecraft.World/HouseFeature.cpp b/Minecraft.World/HouseFeature.cpp index f8c5d173..40b4e770 100644 --- a/Minecraft.World/HouseFeature.cpp +++ b/Minecraft.World/HouseFeature.cpp @@ -7,187 +7,188 @@ bool HouseFeature::place(Level *level, Random *random, int x, int y, int z) { - while (y > 0 && !level->getMaterial(x, y - 1, z)->blocksMotion()) - y--; + while (y > 0 && !level->getMaterial(x, y - 1, z)->blocksMotion()) + y--; int w = random->nextInt(7) + 7; int h = 4 + random->nextInt(3) / 2; int d = random->nextInt(7) + 7; - int x0 = x - w / 2; - int y0 = y; - int z0 = z - d / 2; + int x0 = x - w / 2; + int y0 = y; + int z0 = z - d / 2; - int doorSide = random->nextInt(4); - if (doorSide < 2) d += 2; - else w += 2; + int doorSide = random->nextInt(4); + if (doorSide < 2) d += 2; + else w += 2; - for (int xx = x0; xx < x0 + w; xx++) + for (int xx = x0; xx < x0 + w; xx++) { - for (int zz = z0; zz < z0 + d; zz++) + for (int zz = z0; zz < z0 + d; zz++) { - Material *m = level->getMaterial(xx, y - 1, zz); - if (!m->blocksMotion() || m == Material::ice) return false; - - bool ok = false; - if (doorSide == 0 && xx < x0 + 2) ok = true; - if (doorSide == 1 && xx > x0 + w - 1 - 2) ok = true; - if (doorSide == 2 && zz < z0 + 2) ok = true; - if (doorSide == 3 && zz > z0 + d - 1 - 2) ok = true; - int t = level->getTile(xx, y, zz); - if (ok) + Material *m = level->getMaterial(xx, y - 1, zz); + if (!m->blocksMotion() || m == Material::ice) return false; + + bool ok = false; + if (doorSide == 0 && xx < x0 + 2) ok = true; + if (doorSide == 1 && xx > x0 + w - 1 - 2) ok = true; + if (doorSide == 2 && zz < z0 + 2) ok = true; + if (doorSide == 3 && zz > z0 + d - 1 - 2) ok = true; + int t = level->getTile(xx, y, zz); + if (ok) { - if (t != 0) return false; - } + if (t != 0) return false; + } else { - if (t == Tile::stoneBrick_Id || t == Tile::mossStone_Id) return false; + if (t == Tile::cobblestone_Id || t == Tile::mossyCobblestone_Id) return false; } - } - } + } + } - if (doorSide == 0) + if (doorSide == 0) { - x0++; - w--; - } + x0++; + w--; + } else if (doorSide == 1) { - w--; - } + w--; + } else if (doorSide == 2) { - z0++; - d--; - } + z0++; + d--; + } else if (doorSide == 3) { - d--; - } - - int xx0 = x0; - int xx1 = x0 + w - 1; - int zz0 = z0; - int zz1 = z0 + d - 1; - if (doorSide >= 2) + d--; + } + + int xx0 = x0; + int xx1 = x0 + w - 1; + int zz0 = z0; + int zz1 = z0 + d - 1; + if (doorSide >= 2) { xx0++; xx1--; - } + } else { zz0++; zz1--; - } - for (int xx = x0; xx < x0 + w; xx++) + } + for (int xx = x0; xx < x0 + w; xx++) { - for (int zz = z0; zz < z0 + d; zz++) + for (int zz = z0; zz < z0 + d; zz++) { - int ho = h; + int ho = h; - int d1 = zz - z0; - int d2 = (z0 + d - 1) - zz; - if (doorSide < 2) + int d1 = zz - z0; + int d2 = (z0 + d - 1) - zz; + if (doorSide < 2) { - d1 = xx - x0; - d2 = (x0 + w - 1) - xx; - } + d1 = xx - x0; + d2 = (x0 + w - 1) - xx; + } - if (d2 < d1) d1 = d2; - h += d1; - for (int yy = y0 - 1; yy < y0 + h; yy++) + if (d2 < d1) d1 = d2; + h += d1; + for (int yy = y0 - 1; yy < y0 + h; yy++) { - int material = -1; - if (yy == y0 + h - 1) + int material = -1; + if (yy == y0 + h - 1) { - material = Tile::wood_Id; - } + material = Tile::wood_Id; + } else if (xx >= xx0 && xx <= xx1 && zz >= zz0 && zz <= zz1) { - material = 0; - if (yy == y0 - 1 || yy == y0 + h - 1 || xx == xx0 || zz == zz0 || xx == xx1 || zz == zz1) + material = 0; + if (yy == y0 - 1 || yy == y0 + h - 1 || xx == xx0 || zz == zz0 || xx == xx1 || zz == zz1) { - if (yy <= y0 + random->nextInt(3)) material = Tile::mossStone_Id; - else material = Tile::stoneBrick_Id; - } - } + if (yy <= y0 + random->nextInt(3)) material = Tile::mossyCobblestone_Id; + else material = Tile::cobblestone_Id; + } + } - if (material >= 0) + if (material >= 0) { - level->setTileNoUpdate(xx, yy, zz, material); - } - } - h = ho; - } - } - { - int xx = x0 + random->nextInt(w - 4) + 2; - int zz = z0 + random->nextInt(d - 4) + 2; - if (doorSide == 0) xx = x0; - if (doorSide == 1) xx = x0 + w - 1; - if (doorSide == 2) zz = z0; - if (doorSide == 3) zz = z0 + d - 1; - level->setTileNoUpdate(xx, y0, zz, 0); - level->setTileNoUpdate(xx, y0 + 1, zz, 0); - - int dir = 0; - if (doorSide == 0) dir = 0; - if (doorSide == 2) dir = 1; - if (doorSide == 1) dir = 2; - if (doorSide == 3) dir = 3; - - DoorItem::place(level, xx, y0, zz, dir, Tile::door_wood); - } - - for (int i = 0; i < (w * 2 + d * 2) * 3; i++) + level->setTileAndData(xx, yy, zz, material, 0, Tile::UPDATE_CLIENTS); + } + } + h = ho; + } + } + { + int xx = x0 + random->nextInt(w - 4) + 2; + int zz = z0 + random->nextInt(d - 4) + 2; + if (doorSide == 0) xx = x0; + if (doorSide == 1) xx = x0 + w - 1; + if (doorSide == 2) zz = z0; + if (doorSide == 3) zz = z0 + d - 1; + level->setTileAndData(xx, y0, zz, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(xx, y0 + 1, zz, 0, 0, Tile::UPDATE_CLIENTS); + + int dir = 0; + if (doorSide == 0) dir = 0; + if (doorSide == 2) dir = 1; + if (doorSide == 1) dir = 2; + if (doorSide == 3) dir = 3; + + DoorItem::place(level, xx, y0, zz, dir, Tile::door_wood); + } + + for (int i = 0; i < (w * 2 + d * 2) * 3; i++) { - int xx = x0 + random->nextInt(w - 4) + 2; - int zz = z0 + random->nextInt(d - 4) + 2; - int side = random->nextInt(4); + int xx = x0 + random->nextInt(w - 4) + 2; + int zz = z0 + random->nextInt(d - 4) + 2; + int side = random->nextInt(4); - if (side == 0) xx = xx0; - if (side == 1) xx = xx1; - if (side == 2) zz = zz0; - if (side == 3) zz = zz1; + if (side == 0) xx = xx0; + if (side == 1) xx = xx1; + if (side == 2) zz = zz0; + if (side == 3) zz = zz1; - if (level->isSolidBlockingTile(xx, y0 + 1, zz)) + if (level->isSolidBlockingTile(xx, y0 + 1, zz)) { - int count = 0; - if (level->isSolidBlockingTile(xx - 1, y0 + 1, zz) && level->isSolidBlockingTile(xx + 1, y0 + 1, zz)) count++; - if (level->isSolidBlockingTile(xx, y0 + 1, zz - 1) && level->isSolidBlockingTile(xx, y0 + 1, zz + 1)) count++; - if (count == 1) { - level->setTileNoUpdate(xx, y0 + 1, zz, Tile::glass_Id); - } - } - } - - int ww = xx1 - xx0; - int dd = zz1 - zz0; - for (int i = 0; i < (ww * 2 + dd * 2); i++) + int count = 0; + if (level->isSolidBlockingTile(xx - 1, y0 + 1, zz) && level->isSolidBlockingTile(xx + 1, y0 + 1, zz)) count++; + if (level->isSolidBlockingTile(xx, y0 + 1, zz - 1) && level->isSolidBlockingTile(xx, y0 + 1, zz + 1)) count++; + if (count == 1) + { + level->setTileAndData(xx, y0 + 1, zz, Tile::glass_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } + + int ww = xx1 - xx0; + int dd = zz1 - zz0; + for (int i = 0; i < (ww * 2 + dd * 2); i++) { - int xx = xx0 + random->nextInt(ww - 1) + 1; - int zz = zz0 + random->nextInt(dd - 1) + 1; - int yy = y0; + int xx = xx0 + random->nextInt(ww - 1) + 1; + int zz = zz0 + random->nextInt(dd - 1) + 1; + int yy = y0; - if (level->getTile(xx, yy + 2, zz) == 0) + if (level->getTile(xx, yy + 2, zz) == 0) { - int count = 0; - if (level->isSolidBlockingTile(xx - 1, yy + 2, zz)) count++; - if (level->isSolidBlockingTile(xx + 1, yy + 2, zz)) count++; - if (level->isSolidBlockingTile(xx, yy + 2, zz - 1)) count++; - if (level->isSolidBlockingTile(xx, yy + 2, zz + 1)) count++; - if (count == 1) + int count = 0; + if (level->isSolidBlockingTile(xx - 1, yy + 2, zz)) count++; + if (level->isSolidBlockingTile(xx + 1, yy + 2, zz)) count++; + if (level->isSolidBlockingTile(xx, yy + 2, zz - 1)) count++; + if (level->isSolidBlockingTile(xx, yy + 2, zz + 1)) count++; + if (count == 1) { - level->setTileNoUpdate(xx, y0 + 2, zz, Tile::torch_Id); - } - } - } + level->setTileAndData(xx, y0 + 2, zz, Tile::torch_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } - shared_ptr(pz) = shared_ptr(new PigZombie(level)); - pz->moveTo(x0 + w / 2.0 + 0.5, y0 + 0.5, z0 + d / 2.0 + 0.5, 0, 0); - level->addEntity(pz); + shared_ptr(pz) = shared_ptr(new PigZombie(level)); + pz->moveTo(x0 + w / 2.0 + 0.5, y0 + 0.5, z0 + d / 2.0 + 0.5, 0, 0); + level->addEntity(pz); - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/HtmlString.cpp b/Minecraft.World/HtmlString.cpp new file mode 100644 index 00000000..ce25740e --- /dev/null +++ b/Minecraft.World/HtmlString.cpp @@ -0,0 +1,57 @@ +#include "stdafx.h" +#include "HtmlString.h" +#include + +HtmlString::HtmlString(wstring text, eMinecraftColour hexColor, bool italics, bool indent) +{ + this->text = escapeXML(text); + this->color = hexColor; + this->italics = italics; + this->indent = indent; +} + +wstring HtmlString::ToString() +{ + std::wstringstream ss; + + if (indent) + { + ss << L"  "; + } + + if (italics) + { + ss << ""; + } + + eMinecraftColour color = this->color == eMinecraftColour_NOT_SET ? eHTMLColor_7 : this->color; + + ss << L"" << text << ""; + + if (italics) + { + ss << ""; + } + + return ss.str(); +} + +wstring HtmlString::Compose(vector *strings) +{ + if (strings == NULL) return L""; + + std::wstringstream ss; + + for(int i = 0; i < strings->size(); i++) + { + ss << strings->at(i).ToString(); + + // Add a break if there's another line + if (i + 1 < strings->size()) + { + ss << L"
"; + } + } + + return ss.str(); +} \ No newline at end of file diff --git a/Minecraft.World/HtmlString.h b/Minecraft.World/HtmlString.h new file mode 100644 index 00000000..16108073 --- /dev/null +++ b/Minecraft.World/HtmlString.h @@ -0,0 +1,16 @@ +#pragma once + +// 4J: Simple string wrapper that includes basic formatting information +class HtmlString +{ +public: + wstring text; // Text content of string + eMinecraftColour color; // Hex color + bool italics; // Show text in italics + bool indent; // Indent text + + HtmlString(wstring text, eMinecraftColour color = eMinecraftColour_NOT_SET, bool italics = false, bool indent = false); + wstring ToString(); + + static wstring Compose(vector *strings); +}; \ No newline at end of file diff --git a/Minecraft.World/HugeMushroomFeature.cpp b/Minecraft.World/HugeMushroomFeature.cpp index f67cf971..cc8696ae 100644 --- a/Minecraft.World/HugeMushroomFeature.cpp +++ b/Minecraft.World/HugeMushroomFeature.cpp @@ -15,97 +15,93 @@ HugeMushroomFeature::HugeMushroomFeature() : Feature(false) bool HugeMushroomFeature::place(Level *level, Random *random, int x, int y, int z) { - int type = random->nextInt(2); - if (forcedType >= 0) type = forcedType; - - int treeHeight = random->nextInt(3) + 4; + int type = random->nextInt(2); + if (forcedType >= 0) type = forcedType; - bool free = true; + int treeHeight = random->nextInt(3) + 4; + + bool free = true; if (y < 1 || y + treeHeight + 1 >= Level::maxBuildHeight) return false; - for (int yy = y; yy <= y + 1 + treeHeight; yy++) + for (int yy = y; yy <= y + 1 + treeHeight; yy++) { - int r = 3; - if (yy <= (y + 3) ) r = 0; - for (int xx = x - r; xx <= x + r && free; xx++) + int r = 3; + if (yy <= (y + 3) ) r = 0; + for (int xx = x - r; xx <= x + r && free; xx++) { - for (int zz = z - r; zz <= z + r && free; zz++) + for (int zz = z - r; zz <= z + r && free; zz++) { - if (yy >= 0 && yy < Level::maxBuildHeight) + if (yy >= 0 && yy < Level::maxBuildHeight) { - int tt = level->getTile(xx, yy, zz); - if (tt != 0 && tt != Tile::leaves_Id) + int tt = level->getTile(xx, yy, zz); + if (tt != 0 && tt != Tile::leaves_Id) { free = false; } - } + } else { - free = false; - } - } - } - } + free = false; + } + } + } + } - int belowTile = level->getTile(x, y - 1, z); - if (belowTile != Tile::dirt_Id && belowTile != Tile::grass_Id && belowTile != Tile::mycel_Id) + int belowTile = level->getTile(x, y - 1, z); + if (belowTile != Tile::dirt_Id && belowTile != Tile::grass_Id && belowTile != Tile::mycel_Id) { - return false; - } - - if (!free) return false; - - //if (!Tile::mushroom1->mayPlace(level, x, y, z)) return false; + return false; + } - //placeBlock(level, x, y - 1, z, Tile::dirt_Id, 0); + if (!free) return false; - int low = y + treeHeight; - if (type == 1) { - low = y + treeHeight - 3; - } - for (int yy = low; yy <= y + treeHeight; yy++) + int low = y + treeHeight; + if (type == 1) { + low = y + treeHeight - 3; + } + for (int yy = low; yy <= y + treeHeight; yy++) { - int offs = 1; - if (yy < y + treeHeight) offs += 1; - if (type == 0) offs = 3; - for (int xx = x - offs; xx <= x + offs; xx++) + int offs = 1; + if (yy < y + treeHeight) offs += 1; + if (type == 0) offs = 3; + for (int xx = x - offs; xx <= x + offs; xx++) { - for (int zz = z - offs; zz <= z + offs; zz++) + for (int zz = z - offs; zz <= z + offs; zz++) { - int data = 5; - if (xx == x - offs) data--; - if (xx == x + offs) data++; - if (zz == z - offs) data -= 3; - if (zz == z + offs) data += 3; + int data = 5; + if (xx == x - offs) data--; + if (xx == x + offs) data++; + if (zz == z - offs) data -= 3; + if (zz == z + offs) data += 3; - if (type == 0 || yy < y + treeHeight) + if (type == 0 || yy < y + treeHeight) { - if ((xx == x - offs || xx == x + offs) && (zz == z - offs || zz == z + offs)) continue; - if (xx == x - (offs - 1) && zz == z - offs) data = 1; - if (xx == x - offs && zz == z - (offs - 1)) data = 1; + if ((xx == x - offs || xx == x + offs) && (zz == z - offs || zz == z + offs)) continue; + if (xx == x - (offs - 1) && zz == z - offs) data = 1; + if (xx == x - offs && zz == z - (offs - 1)) data = 1; - if (xx == x + (offs - 1) && zz == z - offs) data = 3; - if (xx == x + offs && zz == z - (offs - 1)) data = 3; + if (xx == x + (offs - 1) && zz == z - offs) data = 3; + if (xx == x + offs && zz == z - (offs - 1)) data = 3; - if (xx == x - (offs - 1) && zz == z + offs) data = 7; - if (xx == x - offs && zz == z + (offs - 1)) data = 7; + if (xx == x - (offs - 1) && zz == z + offs) data = 7; + if (xx == x - offs && zz == z + (offs - 1)) data = 7; - if (xx == x + (offs - 1) && zz == z + offs) data = 9; - if (xx == x + offs && zz == z + (offs - 1)) data = 9; - } + if (xx == x + (offs - 1) && zz == z + offs) data = 9; + if (xx == x + offs && zz == z + (offs - 1)) data = 9; + } - if (data == 5 && yy < y + treeHeight) data = 0; - if (data != 0 || y >= y + treeHeight - 1) + if (data == 5 && yy < y + treeHeight) data = 0; + if (data != 0 || y >= y + treeHeight - 1) { - if (!Tile::solid[level->getTile(xx, yy, zz)]) placeBlock(level, xx, yy, zz, Tile::hugeMushroom1_Id + type, data); - } - } - } - } - for (int hh = 0; hh < treeHeight; hh++) + if (!Tile::solid[level->getTile(xx, yy, zz)]) placeBlock(level, xx, yy, zz, Tile::hugeMushroom_brown_Id + type, data); + } + } + } + } + for (int hh = 0; hh < treeHeight; hh++) { - int t = level->getTile(x, y + hh, z); - if (!Tile::solid[t]) placeBlock(level, x, y + hh, z, Tile::hugeMushroom1_Id + type, 10); - } - return true; + int t = level->getTile(x, y + hh, z); + if (!Tile::solid[t]) placeBlock(level, x, y + hh, z, Tile::hugeMushroom_brown_Id + type, 10); + } + return true; } diff --git a/Minecraft.World/HugeMushroomTile.cpp b/Minecraft.World/HugeMushroomTile.cpp index 9b8344c0..e96cfd1f 100644 --- a/Minecraft.World/HugeMushroomTile.cpp +++ b/Minecraft.World/HugeMushroomTile.cpp @@ -2,13 +2,13 @@ #include "net.minecraft.world.h" #include "HugeMushroomTile.h" -const wstring HugeMushroomTile::TEXTURE_STEM = L"mushroom_skin_stem"; -const wstring HugeMushroomTile::TEXTURE_INSIDE = L"mushroom_inside"; -const wstring HugeMushroomTile::TEXTURE_TYPE[] = {L"mushroom_skin_brown", L"mushroom_skin_red"}; +const wstring HugeMushroomTile::TEXTURE_STEM = L"skin_stem"; +const wstring HugeMushroomTile::TEXTURE_INSIDE = L"inside"; +const wstring HugeMushroomTile::TEXTURE_TYPE[] = {L"skin_brown", L"skin_red"}; HugeMushroomTile::HugeMushroomTile(int id, Material *material, int type) : Tile(id, material) { - this->type = type; + this->type = type; icons = NULL; iconStem = NULL; iconInside = NULL; @@ -16,45 +16,45 @@ HugeMushroomTile::HugeMushroomTile(int id, Material *material, int type) : Tile( Icon *HugeMushroomTile::getTexture(int face, int data) { - // 123 - // 456 10 - // 789 - if (data == 10 && face > 1) return iconStem; - if (data >= 1 && data <= 9 && face == 1) return icons[type]; - if (data >= 1 && data <= 3 && face == 2) return icons[type]; - if (data >= 7 && data <= 9 && face == 3) return icons[type]; + // 123 + // 456 10 + // 789 + if (data == 10 && face > 1) return iconStem; + if (data >= 1 && data <= 9 && face == 1) return icons[type]; + if (data >= 1 && data <= 3 && face == 2) return icons[type]; + if (data >= 7 && data <= 9 && face == 3) return icons[type]; - if ((data == 1 || data == 4 || data == 7) && face == 4) return icons[type]; - if ((data == 3 || data == 6 || data == 9) && face == 5) return icons[type]; + if ((data == 1 || data == 4 || data == 7) && face == 4) return icons[type]; + if ((data == 3 || data == 6 || data == 9) && face == 5) return icons[type]; - // two special cases requested by rhodox (painterly pack) - if (data == 14) + // two special cases requested by rhodox (painterly pack) + if (data == 14) { - return icons[type]; - } - if (data == 15) + return icons[type]; + } + if (data == 15) { - return iconStem; - } + return iconStem; + } - return iconInside; + return iconInside; } int HugeMushroomTile::getResourceCount(Random *random) { - int count = random->nextInt(10) - 7; - if (count < 0) count = 0; - return count; + int count = random->nextInt(10) - 7; + if (count < 0) count = 0; + return count; } int HugeMushroomTile::getResource(int data, Random *random, int playerBonusLevel) { - return Tile::mushroom1_Id + type; + return Tile::mushroom_brown_Id + type; } int HugeMushroomTile::cloneTileId(Level *level, int x, int y, int z) { - return Tile::mushroom1_Id + type; + return Tile::mushroom_brown_Id + type; } void HugeMushroomTile::registerIcons(IconRegister *iconRegister) @@ -63,9 +63,9 @@ void HugeMushroomTile::registerIcons(IconRegister *iconRegister) for (int i = 0; i < HUGE_MUSHROOM_TEXTURE_COUNT; i++) { - icons[i] = iconRegister->registerIcon(TEXTURE_TYPE[i]); + icons[i] = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_TYPE[i]); } - iconInside = iconRegister->registerIcon(TEXTURE_INSIDE); - iconStem = iconRegister->registerIcon(TEXTURE_STEM); + iconInside = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_INSIDE); + iconStem = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_STEM); } \ No newline at end of file diff --git a/Minecraft.World/HugeMushroomTile.h b/Minecraft.World/HugeMushroomTile.h index 2aa22fbb..0b45cf63 100644 --- a/Minecraft.World/HugeMushroomTile.h +++ b/Minecraft.World/HugeMushroomTile.h @@ -6,6 +6,9 @@ class HugeMushroomTile : public Tile { friend class ChunkRebuildData; public: + static const int MUSHROOM_TYPE_BROWN = 0; + static const int MUSHROOM_TYPE_RED = 1; + static const wstring TEXTURE_STEM; static const wstring TEXTURE_INSIDE; @@ -18,9 +21,9 @@ private: Icon *iconInside; public: HugeMushroomTile(int id, Material *material, int type); - Icon *getTexture(int face, int data); - int getResourceCount(Random *random); - int getResource(int data, Random *random, int playerBonusLevel); + Icon *getTexture(int face, int data); + int getResourceCount(Random *random); + int getResource(int data, Random *random, int playerBonusLevel); int cloneTileId(Level *level, int x, int y, int z); void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/HurtByTargetGoal.cpp b/Minecraft.World/HurtByTargetGoal.cpp index a146c47d..32bcd3c7 100644 --- a/Minecraft.World/HurtByTargetGoal.cpp +++ b/Minecraft.World/HurtByTargetGoal.cpp @@ -4,42 +4,38 @@ #include "net.minecraft.world.level.h" #include "HurtByTargetGoal.h" -HurtByTargetGoal::HurtByTargetGoal(Mob *mob, bool alertSameType) : TargetGoal(mob, 16, false) +HurtByTargetGoal::HurtByTargetGoal(PathfinderMob *mob, bool alertSameType) : TargetGoal(mob, false) { this->alertSameType = alertSameType; setRequiredControlFlags(TargetGoal::TargetFlag); + timestamp = 0; } bool HurtByTargetGoal::canUse() { - return canAttack(mob->getLastHurtByMob(), false); + int ts = mob->getLastHurtByMobTimestamp(); + return ts != timestamp && canAttack(mob->getLastHurtByMob(), false); } void HurtByTargetGoal::start() { mob->setTarget(mob->getLastHurtByMob()); - oldHurtByMob = mob->getLastHurtByMob(); + timestamp = mob->getLastHurtByMobTimestamp(); if (alertSameType) { + double within = getFollowDistance(); vector > *nearby = mob->level->getEntitiesOfClass(typeid(*mob), AABB::newTemp(mob->x, mob->y, mob->z, mob->x + 1, mob->y + 1, mob->z + 1)->grow(within, 4, within)); for(AUTO_VAR(it, nearby->begin()); it != nearby->end(); ++it) { - shared_ptr other = dynamic_pointer_cast(*it); + shared_ptr other = dynamic_pointer_cast(*it); if (this->mob->shared_from_this() == other) continue; if (other->getTarget() != NULL) continue; + if (other->isAlliedTo(mob->getLastHurtByMob())) continue; // don't target allies other->setTarget(mob->getLastHurtByMob()); } delete nearby; } TargetGoal::start(); -} - -void HurtByTargetGoal::tick() -{ - if (mob->getLastHurtByMob() != NULL && mob->getLastHurtByMob() != oldHurtByMob) - { - this->start(); - } -} +} \ No newline at end of file diff --git a/Minecraft.World/HurtByTargetGoal.h b/Minecraft.World/HurtByTargetGoal.h index 4c6ee5fe..4f7235e9 100644 --- a/Minecraft.World/HurtByTargetGoal.h +++ b/Minecraft.World/HurtByTargetGoal.h @@ -6,12 +6,11 @@ class HurtByTargetGoal : public TargetGoal { private: bool alertSameType; - shared_ptr oldHurtByMob; + int timestamp; public: - HurtByTargetGoal(Mob *mob, bool alertSameType); + HurtByTargetGoal(PathfinderMob *mob, bool alertSameType); bool canUse(); void start(); - void tick(); }; diff --git a/Minecraft.World/IceTile.cpp b/Minecraft.World/IceTile.cpp index 6ca9cc80..938c098f 100644 --- a/Minecraft.World/IceTile.cpp +++ b/Minecraft.World/IceTile.cpp @@ -27,7 +27,7 @@ void IceTile::playerDestroy(Level *level, shared_ptr player, int x, int player->awardStat(GenericStats::blocksMined(id), GenericStats::param_blocksMined(id,data,1) ); player->causeFoodExhaustion(FoodConstants::EXHAUSTION_MINE); - if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player->inventory)) + if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player)) { shared_ptr item = getSilkTouchItemInstance(data); if (item != NULL) @@ -39,16 +39,16 @@ void IceTile::playerDestroy(Level *level, shared_ptr player, int x, int { if (level->dimension->ultraWarm) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } - int playerBonusLevel = EnchantmentHelper::getDiggingLootBonus(player->inventory); + int playerBonusLevel = EnchantmentHelper::getDiggingLootBonus(player); spawnResources(level, x, y, z, data, playerBonusLevel); Material *below = level->getMaterial(x, y - 1, z); if (below->blocksMotion() || below->isLiquid()) { - level->setTile(x, y, z, Tile::water_Id); + level->setTileAndUpdate(x, y, z, Tile::water_Id); } } } @@ -64,11 +64,11 @@ void IceTile::tick(Level *level, int x, int y, int z, Random *random) { if (level->dimension->ultraWarm) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, Tile::calmWater_Id); + level->setTileAndUpdate(x, y, z, Tile::calmWater_Id); } } diff --git a/Minecraft.World/IndirectEntityDamageSource.cpp b/Minecraft.World/IndirectEntityDamageSource.cpp index 01c54ed6..c2a67af5 100644 --- a/Minecraft.World/IndirectEntityDamageSource.cpp +++ b/Minecraft.World/IndirectEntityDamageSource.cpp @@ -5,7 +5,7 @@ #include "net.minecraft.network.packet.h" //IndirectEntityDamageSource::IndirectEntityDamageSource(const wstring &msgId, shared_ptr entity, shared_ptr owner) : EntityDamageSource(msgId, entity) -IndirectEntityDamageSource::IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity, shared_ptr owner) : EntityDamageSource(msgId, entity) +IndirectEntityDamageSource::IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId, shared_ptr entity, shared_ptr owner) : EntityDamageSource(msgId, msgWithItemId, entity) { this->owner = owner; } @@ -27,8 +27,9 @@ shared_ptr IndirectEntityDamageSource::getEntity() // //return I18n.get("death." + msgId, player.name, owner.getAName()); //} -shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(shared_ptr player) +shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(shared_ptr player) { + shared_ptr held = entity->instanceof(eTYPE_LIVINGENTITY) ? dynamic_pointer_cast(entity)->getCarriedItem() : nullptr; wstring additional = L""; int type; if(owner != NULL) @@ -44,5 +45,18 @@ shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(shared_ { type = entity->GetType(); } - return shared_ptr( new ChatPacket(player->name, m_msgId, type, additional ) ); + if(held != NULL && held->hasCustomHoverName() ) + { + return shared_ptr( new ChatPacket(player->getNetworkName(), m_msgWithItemId, type, additional, held->getHoverName() ) ); + } + else + { + return shared_ptr( new ChatPacket(player->getNetworkName(), m_msgId, type, additional ) ); + } +} + +// 4J: Copy function +DamageSource *IndirectEntityDamageSource::copy() +{ + return new IndirectEntityDamageSource(*this); } \ No newline at end of file diff --git a/Minecraft.World/IndirectEntityDamageSource.h b/Minecraft.World/IndirectEntityDamageSource.h index b7aec18c..5ec397c3 100644 --- a/Minecraft.World/IndirectEntityDamageSource.h +++ b/Minecraft.World/IndirectEntityDamageSource.h @@ -13,7 +13,7 @@ private: public: //IndirectEntityDamageSource(const wstring &msgId, shared_ptr entity, shared_ptr owner); - IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity, shared_ptr owner); + IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId, shared_ptr entity, shared_ptr owner); virtual ~IndirectEntityDamageSource() { } virtual shared_ptr getDirectEntity(); // 4J Stu - Brought forward from 1.2.3 to fix #46422 @@ -21,5 +21,7 @@ public: // 4J Stu - Made return a packet //virtual wstring getLocalizedDeathMessage(shared_ptr player); - virtual shared_ptr getDeathMessagePacket(shared_ptr player); + virtual shared_ptr getDeathMessagePacket(shared_ptr player); + + virtual DamageSource *copy(); }; \ No newline at end of file diff --git a/Minecraft.World/InputStream.cpp b/Minecraft.World/InputStream.cpp index dbec82cc..e325db8a 100644 --- a/Minecraft.World/InputStream.cpp +++ b/Minecraft.World/InputStream.cpp @@ -5,5 +5,7 @@ InputStream *InputStream::getResourceAsStream(const wstring &fileName) { - return new FileInputStream( File( fileName ) ); + File file( fileName ); + + return file.exists() ? new FileInputStream( file ) : NULL; } \ No newline at end of file diff --git a/Minecraft.World/IntArrayTag.h b/Minecraft.World/IntArrayTag.h index 58339bf6..48f4ce74 100644 --- a/Minecraft.World/IntArrayTag.h +++ b/Minecraft.World/IntArrayTag.h @@ -10,6 +10,7 @@ public: IntArrayTag(const wstring &name) : Tag(name) { + data = intArray(); } IntArrayTag(const wstring &name, intArray data) : Tag(name) @@ -17,6 +18,11 @@ public: this->data = data; } + ~IntArrayTag() + { + delete [] data.data; + } + void write(DataOutput *dos) { dos->writeInt(data.length); @@ -26,7 +32,7 @@ public: } } - void load(DataInput *dis) + void load(DataInput *dis, int tagDepth) { int length = dis->readInt(); @@ -52,7 +58,7 @@ public: if (Tag::equals(obj)) { IntArrayTag *o = (IntArrayTag *) obj; - return ((data.data == NULL && o->data.data == NULL) || (data.data != NULL && data.length == o->data.length && memcmp(data.data, o->data.data, data.length) == 0) ); + return ((data.data == NULL && o->data.data == NULL) || (data.data != NULL && data.length == o->data.length && memcmp(data.data, o->data.data, data.length * sizeof(int)) == 0) ); } return false; } diff --git a/Minecraft.World/IntTag.h b/Minecraft.World/IntTag.h index f4d30818..cce87da3 100644 --- a/Minecraft.World/IntTag.h +++ b/Minecraft.World/IntTag.h @@ -9,7 +9,7 @@ public: IntTag(const wstring &name, int data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeInt(data); } - void load(DataInput *dis) { data = dis->readInt(); } + void load(DataInput *dis, int tagDepth) { data = dis->readInt(); } byte getId() { return TAG_Int; } wstring toString() diff --git a/Minecraft.World/Inventory.cpp b/Minecraft.World/Inventory.cpp index 8ef3f085..f6a136c9 100644 --- a/Minecraft.World/Inventory.cpp +++ b/Minecraft.World/Inventory.cpp @@ -154,35 +154,63 @@ void Inventory::swapPaint(int wheel) selected -= 9; } -void Inventory::clearInventory() +int Inventory::clearInventory(int id, int data) { - for (unsigned int i = 0; i < items.length; i++) + int count = 0; + for (int i = 0; i < items.length; i++) { + shared_ptr item = items[i]; + if (item == NULL) continue; + if (id > -1 && item->id != id) continue; + if (data > -1 && item->getAuxValue() != data) continue; + + count += item->count; items[i] = nullptr; } - for (unsigned int i = 0; i < armor.length; i++) + for (int i = 0; i < armor.length; i++) { + shared_ptr item = armor[i]; + if (item == NULL) continue; + if (id > -1 && item->id != id) continue; + if (data > -1 && item->getAuxValue() != data) continue; + + count += item->count; armor[i] = nullptr; } + + if (carried != NULL) + { + if (id > -1 && carried->id != id) return count; + if (data > -1 && carried->getAuxValue() != data) return count; + + count += carried->count; + setCarried(nullptr); + } + + return count; } void Inventory::replaceSlot(Item *item, int data) { if (item != NULL) { + // It's too easy to accidentally pick block and lose enchanted items. + if (heldItem != NULL && heldItem->isEnchantable() && getSlot(heldItem->id, heldItem->getDamageValue()) == selected) + { + return; + } + int oldSlot = getSlot(item->id, data); if (oldSlot >= 0) { + int oldSlotCount = items[oldSlot]->count; items[oldSlot] = items[selected]; + items[selected] = shared_ptr( new ItemInstance(Item::items[item->id], oldSlotCount, data) ); } - - // It's too easy to accidentally pick block and lose enchanted - // items. - if (heldItem != NULL && heldItem->isEnchantable() && getSlot(heldItem->id, heldItem->getDamageValue()) == selected) + else { - return; + items[selected] = shared_ptr(new ItemInstance(Item::items[item->id], 1, data)); } - items[selected] = shared_ptr(new ItemInstance(Item::items[item->id], 1, data)); } } @@ -324,8 +352,8 @@ void Inventory::swapSlots(int from, int to) bool Inventory::add(shared_ptr item) { - // 4J Stu - Fix for duplication glitch - if(item->count <= 0) return true; + if (item == NULL) return false; + if (item->count == 0) return false; if (!item->isDamaged()) { @@ -364,7 +392,7 @@ bool Inventory::add(shared_ptr item) GenericStats::param_itemsCollected(item->id, item->getAuxValue(), item->GetCount())); items[slot] = ItemInstance::clone(item); - items[slot]->popTime = Inventory::POP_TIME_DURATION; + items[slot]->popTime = POP_TIME_DURATION; item->count = 0; return true; } @@ -549,21 +577,24 @@ shared_ptr Inventory::getItem(unsigned int slot) */ } -int Inventory::getName() +wstring Inventory::getName() { - return IDS_INVENTORY; + return app.GetString(IDS_INVENTORY); } -int Inventory::getMaxStackSize() +wstring Inventory::getCustomName() { - return MAX_INVENTORY_STACK_SIZE; + return L""; } -int Inventory::getAttackDamage(shared_ptr entity) +bool Inventory::hasCustomName() { - shared_ptr item = getItem(selected); - if (item != NULL) return item->getAttackDamage(entity); - return 1; + return false; +} + +int Inventory::getMaxStackSize() +{ + return MAX_INVENTORY_STACK_SIZE; } bool Inventory::canDestroy(Tile *tile) @@ -595,7 +626,7 @@ int Inventory::getArmorValue() return val; } -void Inventory::hurtArmor(int dmg) +void Inventory::hurtArmor(float dmg) { dmg = dmg / 4; if (dmg < 1) @@ -606,7 +637,7 @@ void Inventory::hurtArmor(int dmg) { if (armor[i] != NULL && dynamic_cast( armor[i]->getItem() ) != NULL ) { - armor[i]->hurt(dmg, dynamic_pointer_cast( player->shared_from_this() ) ); + armor[i]->hurtAndBreak( (int) dmg, dynamic_pointer_cast( player->shared_from_this() ) ); if (armor[i]->count == 0) { armor[i] = nullptr; @@ -699,11 +730,11 @@ bool Inventory::contains(shared_ptr itemInstance) { for (unsigned int i = 0; i < armor.length; i++) { - if (armor[i] != NULL && armor[i]->equals(itemInstance)) return true; + if (armor[i] != NULL && armor[i]->sameItem(itemInstance)) return true; } for (unsigned int i = 0; i < items.length; i++) { - if (items[i] != NULL && items[i]->equals(itemInstance)) return true; + if (items[i] != NULL && items[i]->sameItem(itemInstance)) return true; } return false; } @@ -718,6 +749,11 @@ void Inventory::stopOpen() // TODO Auto-generated method stub } +bool Inventory::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + void Inventory::replaceWith(shared_ptr other) { for (int i = 0; i < items.length; i++) @@ -728,6 +764,8 @@ void Inventory::replaceWith(shared_ptr other) { armor[i] = ItemInstance::clone(other->armor[i]); } + + selected = other->selected; } int Inventory::countMatches(shared_ptr itemInstance) diff --git a/Minecraft.World/Inventory.h b/Minecraft.World/Inventory.h index 9d1aa7e0..5c49e904 100644 --- a/Minecraft.World/Inventory.h +++ b/Minecraft.World/Inventory.h @@ -37,7 +37,6 @@ public: shared_ptr getSelected(); // 4J-PB - Added for the in-game tooltips bool IsHeldItem(); - static int getSelectionSize(); private: @@ -45,16 +44,12 @@ private: int getSlot(int tileId, int data); int getSlotWithRemainingSpace(shared_ptr item); - + public: int getFreeSlot(); - void grabTexture(int id, int data, bool checkData, bool mayReplace); - void swapPaint(int wheel); - - void clearInventory(); - + int clearInventory(int id, int data); void replaceSlot(Item *item, int data); private: @@ -62,56 +57,37 @@ private: public: void tick(); - bool removeResource(int type); // 4J-PB added to get the right resource from the inventory for removal bool removeResource(int type,int iAuxVal); void removeResources(shared_ptr item); // 4J Added for trading - + // 4J-Stu added to the get the item that would be affected by the removeResource functions shared_ptr getResourceItem(int type); shared_ptr getResourceItem(int type,int iAuxVal); bool hasResource(int type); - void swapSlots(int from, int to); - bool add(shared_ptr item); - shared_ptr removeItem(unsigned int slot, int count); virtual shared_ptr removeItemNoUpdate(int slot); - void setItem(unsigned int slot, shared_ptr item); - float getDestroySpeed(Tile *tile); - ListTag *save(ListTag *listTag); - void load(ListTag *inventoryList); - unsigned int getContainerSize(); - shared_ptr getItem(unsigned int slot); - - int getName(); - + wstring getName(); + wstring getCustomName(); + bool hasCustomName(); int getMaxStackSize(); - - int getAttackDamage(shared_ptr entity); - bool canDestroy(Tile *tile); - shared_ptr getArmor(int layer); - int getArmorValue(); - - void hurtArmor(int dmg); - + void hurtArmor(float dmg); void dropAll(); - void setChanged(); - bool isSame(shared_ptr copy); private: @@ -119,17 +95,13 @@ private: public: shared_ptr copy(); - void setCarried(shared_ptr carried); - shared_ptr getCarried(); - bool stillValid(shared_ptr player); - bool contains(shared_ptr itemInstance); - virtual void startOpen(); virtual void stopOpen(); + bool canPlaceItem(int slot, shared_ptr item); void replaceWith(shared_ptr other); int countMatches(shared_ptr itemInstance); // 4J Added diff --git a/Minecraft.World/InventoryMenu.cpp b/Minecraft.World/InventoryMenu.cpp index 979243c1..ae5d9269 100644 --- a/Minecraft.World/InventoryMenu.cpp +++ b/Minecraft.World/InventoryMenu.cpp @@ -94,12 +94,12 @@ bool InventoryMenu::stillValid(shared_ptr player) shared_ptr InventoryMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); - Slot *HelmetSlot = slots->at(ARMOR_SLOT_START); - Slot *ChestplateSlot = slots->at(ARMOR_SLOT_START+1); - Slot *LeggingsSlot = slots->at(ARMOR_SLOT_START+2); - Slot *BootsSlot = slots->at(ARMOR_SLOT_START+3); + Slot *HelmetSlot = slots.at(ARMOR_SLOT_START); + Slot *ChestplateSlot = slots.at(ARMOR_SLOT_START+1); + Slot *LeggingsSlot = slots.at(ARMOR_SLOT_START+2); + Slot *BootsSlot = slots.at(ARMOR_SLOT_START+3); if (slot != NULL && slot->hasItem()) @@ -225,16 +225,21 @@ bool InventoryMenu::mayCombine(Slot *slot, shared_ptr item) return slot->mayCombine(item); } +bool InventoryMenu::canTakeItemForPickAll(shared_ptr carried, Slot *target) +{ + return target->container != resultSlots && AbstractContainerMenu::canTakeItemForPickAll(carried, target); +} + // 4J-JEV: Added for achievement 'Iron Man'. -shared_ptr InventoryMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) +shared_ptr InventoryMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped) // 4J Added looped param { - shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); + shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player, looped); #ifdef _EXTENDED_ACHIEVEMENTS static int ironItems[4] = {Item::helmet_iron_Id,Item::chestplate_iron_Id,Item::leggings_iron_Id,Item::boots_iron_Id}; for (int i = ARMOR_SLOT_START; i < ARMOR_SLOT_END; i++) { - Slot *slot = slots->at(i); + Slot *slot = slots.at(i); if ( (slot==NULL) || (!slot->hasItem()) || (slot->getItem()->getItem()->id != ironItems[i-ARMOR_SLOT_START]) ) { return out; diff --git a/Minecraft.World/InventoryMenu.h b/Minecraft.World/InventoryMenu.h index b37a4be9..1795eaef 100644 --- a/Minecraft.World/InventoryMenu.h +++ b/Minecraft.World/InventoryMenu.h @@ -38,7 +38,8 @@ public: virtual bool stillValid(shared_ptr player); virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); virtual bool mayCombine(Slot *slot, shared_ptr item); + virtual bool canTakeItemForPickAll(shared_ptr carried, Slot *target); // 4J ADDED, - virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped = false); }; diff --git a/Minecraft.World/Item.cpp b/Minecraft.World/Item.cpp index 5d723ec5..35768ac1 100644 --- a/Minecraft.World/Item.cpp +++ b/Minecraft.World/Item.cpp @@ -14,9 +14,12 @@ #include "MapItem.h" #include "Item.h" #include "HangingEntityItem.h" +#include "HtmlString.h" typedef Item::Tier _Tier; +//const UUID Item::BASE_ATTACK_DAMAGE_UUID = UUID::fromString(L"CB3F55D3-645C-4F38-A497-9C13A33DB5CF"); + wstring Item::ICON_DESCRIPTION_PREFIX = L"item."; const _Tier *_Tier::WOOD = new _Tier(0, 59, 2, 0, 15); // @@ -68,7 +71,7 @@ Item *Item::hatchet_gold = NULL; Item *Item::string = NULL; Item *Item::feather = NULL; -Item *Item::sulphur = NULL; +Item *Item::gunpowder = NULL; Item *Item::hoe_wood = NULL; Item *Item::hoe_stone = NULL; @@ -80,10 +83,10 @@ Item *Item::seeds_wheat = NULL; Item *Item::wheat = NULL; Item *Item::bread = NULL; -ArmorItem *Item::helmet_cloth = NULL; -ArmorItem *Item::chestplate_cloth = NULL; -ArmorItem *Item::leggings_cloth = NULL; -ArmorItem *Item::boots_cloth = NULL; +ArmorItem *Item::helmet_leather = NULL; +ArmorItem *Item::chestplate_leather = NULL; +ArmorItem *Item::leggings_leather = NULL; +ArmorItem *Item::boots_leather = NULL; ArmorItem *Item::helmet_chain = NULL; ArmorItem *Item::chestplate_chain = NULL; @@ -128,7 +131,7 @@ Item *Item::snowBall = NULL; Item *Item::boat = NULL; Item *Item::leather = NULL; -Item *Item::milk = NULL; +Item *Item::bucket_milk = NULL; Item *Item::brick = NULL; Item *Item::clay = NULL; Item *Item::reeds = NULL; @@ -152,7 +155,7 @@ Item *Item::cake = NULL; Item *Item::bed = NULL; -Item *Item::diode = NULL; +Item *Item::repeater = NULL; Item *Item::cookie = NULL; MapItem *Item::map = NULL; @@ -188,7 +191,7 @@ Item *Item::enderPearl = NULL; Item *Item::blazeRod = NULL; Item *Item::ghastTear = NULL; Item *Item::goldNugget = NULL; -Item *Item::netherStalkSeeds = NULL; +Item *Item::netherwart_seeds = NULL; PotionItem *Item::potion = NULL; Item *Item::glassBottle = NULL; Item *Item::spiderEye = NULL; @@ -200,14 +203,13 @@ Item *Item::cauldron = NULL; Item *Item::eyeOfEnder = NULL; Item *Item::speckledMelon = NULL; -Item *Item::monsterPlacer = NULL; +Item *Item::spawnEgg = NULL; Item *Item::expBottle = NULL; // TU9 Item *Item::fireball = NULL; Item *Item::frame = NULL; -Item *Item::netherbrick = NULL; Item *Item::skull = NULL; @@ -225,247 +227,273 @@ Item *Item::potato = NULL; Item *Item::potatoBaked = NULL; Item *Item::potatoPoisonous = NULL; +EmptyMapItem *Item::emptyMap = NULL; + Item *Item::carrotGolden = NULL; Item *Item::carrotOnAStick = NULL; +Item *Item::netherStar = NULL; Item *Item::pumpkinPie = NULL; +Item *Item::fireworks = NULL; +Item *Item::fireworksCharge = NULL; EnchantedBookItem *Item::enchantedBook = NULL; + +Item *Item::comparator = NULL; +Item *Item::netherbrick = NULL; Item *Item::netherQuartz = NULL; +Item *Item::minecart_tnt = NULL; +Item *Item::minecart_hopper = NULL; + +Item *Item::horseArmorMetal = NULL; +Item *Item::horseArmorGold = NULL; +Item *Item::horseArmorDiamond = NULL; +Item *Item::lead = NULL; +Item *Item::nameTag = NULL; void Item::staticCtor() { - - - Item::sword_wood = ( new WeaponItem(12, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_wood) ->setTextureName(L"swordWood")->setDescriptionId(IDS_ITEM_SWORD_WOOD)->setUseDescriptionId(IDS_DESC_SWORD); - Item::sword_stone = ( new WeaponItem(16, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_stone) ->setTextureName(L"swordStone")->setDescriptionId(IDS_ITEM_SWORD_STONE)->setUseDescriptionId(IDS_DESC_SWORD); - Item::sword_iron = ( new WeaponItem(11, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_iron) ->setTextureName(L"swordIron")->setDescriptionId(IDS_ITEM_SWORD_IRON)->setUseDescriptionId(IDS_DESC_SWORD); - Item::sword_diamond = ( new WeaponItem(20, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_diamond) ->setTextureName(L"swordDiamond")->setDescriptionId(IDS_ITEM_SWORD_DIAMOND)->setUseDescriptionId(IDS_DESC_SWORD); - Item::sword_gold = ( new WeaponItem(27, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_gold) ->setTextureName(L"swordGold")->setDescriptionId(IDS_ITEM_SWORD_GOLD)->setUseDescriptionId(IDS_DESC_SWORD); - - Item::shovel_wood = ( new ShovelItem(13, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_wood) ->setTextureName(L"shovelWood")->setDescriptionId(IDS_ITEM_SHOVEL_WOOD)->setUseDescriptionId(IDS_DESC_SHOVEL); - Item::shovel_stone = ( new ShovelItem(17, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_stone) ->setTextureName(L"shovelStone")->setDescriptionId(IDS_ITEM_SHOVEL_STONE)->setUseDescriptionId(IDS_DESC_SHOVEL); - Item::shovel_iron = ( new ShovelItem(0, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_iron) ->setTextureName(L"shovelIron")->setDescriptionId(IDS_ITEM_SHOVEL_IRON)->setUseDescriptionId(IDS_DESC_SHOVEL); - Item::shovel_diamond = ( new ShovelItem(21, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_diamond) ->setTextureName(L"shovelDiamond")->setDescriptionId(IDS_ITEM_SHOVEL_DIAMOND)->setUseDescriptionId(IDS_DESC_SHOVEL); - Item::shovel_gold = ( new ShovelItem(28, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_gold) ->setTextureName(L"shovelGold")->setDescriptionId(IDS_ITEM_SHOVEL_GOLD)->setUseDescriptionId(IDS_DESC_SHOVEL); - - Item::pickAxe_wood = ( new PickaxeItem(14, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_wood) ->setTextureName(L"pickaxeWood")->setDescriptionId(IDS_ITEM_PICKAXE_WOOD)->setUseDescriptionId(IDS_DESC_PICKAXE); - Item::pickAxe_stone = ( new PickaxeItem(18, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_stone) ->setTextureName(L"pickaxeStone")->setDescriptionId(IDS_ITEM_PICKAXE_STONE)->setUseDescriptionId(IDS_DESC_PICKAXE); - Item::pickAxe_iron = ( new PickaxeItem(1, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_iron) ->setTextureName(L"pickaxeIron")->setDescriptionId(IDS_ITEM_PICKAXE_IRON)->setUseDescriptionId(IDS_DESC_PICKAXE); - Item::pickAxe_diamond = ( new PickaxeItem(22, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_diamond) ->setTextureName(L"pickaxeDiamond")->setDescriptionId(IDS_ITEM_PICKAXE_DIAMOND)->setUseDescriptionId(IDS_DESC_PICKAXE); - Item::pickAxe_gold = ( new PickaxeItem(29, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_gold) ->setTextureName(L"pickaxeGold")->setDescriptionId(IDS_ITEM_PICKAXE_GOLD)->setUseDescriptionId(IDS_DESC_PICKAXE); - - Item::hatchet_wood = ( new HatchetItem(15, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_wood) ->setTextureName(L"hatchetWood")->setDescriptionId(IDS_ITEM_HATCHET_WOOD)->setUseDescriptionId(IDS_DESC_HATCHET); - Item::hatchet_stone = ( new HatchetItem(19, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_stone) ->setTextureName(L"hatchetStone")->setDescriptionId(IDS_ITEM_HATCHET_STONE)->setUseDescriptionId(IDS_DESC_HATCHET); - Item::hatchet_iron = ( new HatchetItem(2, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_iron) ->setTextureName(L"hatchetIron")->setDescriptionId(IDS_ITEM_HATCHET_IRON)->setUseDescriptionId(IDS_DESC_HATCHET); - Item::hatchet_diamond = ( new HatchetItem(23, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_diamond) ->setTextureName(L"hatchetDiamond")->setDescriptionId(IDS_ITEM_HATCHET_DIAMOND)->setUseDescriptionId(IDS_DESC_HATCHET); - Item::hatchet_gold = ( new HatchetItem(30, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_gold) ->setTextureName(L"hatchetGold")->setDescriptionId(IDS_ITEM_HATCHET_GOLD)->setUseDescriptionId(IDS_DESC_HATCHET); - - Item::hoe_wood = ( new HoeItem(34, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_wood) ->setTextureName(L"hoeWood")->setDescriptionId(IDS_ITEM_HOE_WOOD)->setUseDescriptionId(IDS_DESC_HOE); - Item::hoe_stone = ( new HoeItem(35, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_stone) ->setTextureName(L"hoeStone")->setDescriptionId(IDS_ITEM_HOE_STONE)->setUseDescriptionId(IDS_DESC_HOE); - Item::hoe_iron = ( new HoeItem(36, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_iron) ->setTextureName(L"hoeIron")->setDescriptionId(IDS_ITEM_HOE_IRON)->setUseDescriptionId(IDS_DESC_HOE); - Item::hoe_diamond = ( new HoeItem(37, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_diamond) ->setTextureName(L"hoeDiamond")->setDescriptionId(IDS_ITEM_HOE_DIAMOND)->setUseDescriptionId(IDS_DESC_HOE); - Item::hoe_gold = ( new HoeItem(38, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_gold) ->setTextureName(L"hoeGold")->setDescriptionId(IDS_ITEM_HOE_GOLD)->setUseDescriptionId(IDS_DESC_HOE); - - Item::door_wood = ( new DoorItem(68, Material::wood) ) ->setBaseItemTypeAndMaterial(eBaseItemType_door, eMaterial_wood)->setTextureName(L"doorWood")->setDescriptionId(IDS_ITEM_DOOR_WOOD)->setUseDescriptionId(IDS_DESC_DOOR_WOOD); - Item::door_iron = ( new DoorItem(74, Material::metal) ) ->setBaseItemTypeAndMaterial(eBaseItemType_door, eMaterial_iron)->setTextureName(L"doorIron")->setDescriptionId(IDS_ITEM_DOOR_IRON)->setUseDescriptionId(IDS_DESC_DOOR_IRON); - - Item::helmet_cloth = (ArmorItem *) ( ( new ArmorItem(42, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_cloth) ->setTextureName(L"helmetCloth")->setDescriptionId(IDS_ITEM_HELMET_CLOTH)->setUseDescriptionId(IDS_DESC_HELMET_LEATHER) ); - Item::helmet_iron = (ArmorItem *) ( ( new ArmorItem(50, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_iron) ->setTextureName(L"helmetIron")->setDescriptionId(IDS_ITEM_HELMET_IRON)->setUseDescriptionId(IDS_DESC_HELMET_IRON) ); - Item::helmet_diamond = (ArmorItem *) ( ( new ArmorItem(54, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_diamond) ->setTextureName(L"helmetDiamond")->setDescriptionId(IDS_ITEM_HELMET_DIAMOND)->setUseDescriptionId(IDS_DESC_HELMET_DIAMOND) ); - Item::helmet_gold = (ArmorItem *) ( ( new ArmorItem(58, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_gold) ->setTextureName(L"helmetGold")->setDescriptionId(IDS_ITEM_HELMET_GOLD)->setUseDescriptionId(IDS_DESC_HELMET_GOLD) ); + Item::sword_wood = ( new WeaponItem(12, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_wood) ->setIconName(L"swordWood")->setDescriptionId(IDS_ITEM_SWORD_WOOD)->setUseDescriptionId(IDS_DESC_SWORD); + Item::sword_stone = ( new WeaponItem(16, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_stone) ->setIconName(L"swordStone")->setDescriptionId(IDS_ITEM_SWORD_STONE)->setUseDescriptionId(IDS_DESC_SWORD); + Item::sword_iron = ( new WeaponItem(11, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_iron) ->setIconName(L"swordIron")->setDescriptionId(IDS_ITEM_SWORD_IRON)->setUseDescriptionId(IDS_DESC_SWORD); + Item::sword_diamond = ( new WeaponItem(20, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_diamond) ->setIconName(L"swordDiamond")->setDescriptionId(IDS_ITEM_SWORD_DIAMOND)->setUseDescriptionId(IDS_DESC_SWORD); + Item::sword_gold = ( new WeaponItem(27, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_gold) ->setIconName(L"swordGold")->setDescriptionId(IDS_ITEM_SWORD_GOLD)->setUseDescriptionId(IDS_DESC_SWORD); + + Item::shovel_wood = ( new ShovelItem(13, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_wood) ->setIconName(L"shovelWood")->setDescriptionId(IDS_ITEM_SHOVEL_WOOD)->setUseDescriptionId(IDS_DESC_SHOVEL); + Item::shovel_stone = ( new ShovelItem(17, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_stone) ->setIconName(L"shovelStone")->setDescriptionId(IDS_ITEM_SHOVEL_STONE)->setUseDescriptionId(IDS_DESC_SHOVEL); + Item::shovel_iron = ( new ShovelItem(0, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_iron) ->setIconName(L"shovelIron")->setDescriptionId(IDS_ITEM_SHOVEL_IRON)->setUseDescriptionId(IDS_DESC_SHOVEL); + Item::shovel_diamond = ( new ShovelItem(21, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_diamond) ->setIconName(L"shovelDiamond")->setDescriptionId(IDS_ITEM_SHOVEL_DIAMOND)->setUseDescriptionId(IDS_DESC_SHOVEL); + Item::shovel_gold = ( new ShovelItem(28, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_shovel, eMaterial_gold) ->setIconName(L"shovelGold")->setDescriptionId(IDS_ITEM_SHOVEL_GOLD)->setUseDescriptionId(IDS_DESC_SHOVEL); + + Item::pickAxe_wood = ( new PickaxeItem(14, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_wood) ->setIconName(L"pickaxeWood")->setDescriptionId(IDS_ITEM_PICKAXE_WOOD)->setUseDescriptionId(IDS_DESC_PICKAXE); + Item::pickAxe_stone = ( new PickaxeItem(18, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_stone) ->setIconName(L"pickaxeStone")->setDescriptionId(IDS_ITEM_PICKAXE_STONE)->setUseDescriptionId(IDS_DESC_PICKAXE); + Item::pickAxe_iron = ( new PickaxeItem(1, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_iron) ->setIconName(L"pickaxeIron")->setDescriptionId(IDS_ITEM_PICKAXE_IRON)->setUseDescriptionId(IDS_DESC_PICKAXE); + Item::pickAxe_diamond = ( new PickaxeItem(22, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_diamond) ->setIconName(L"pickaxeDiamond")->setDescriptionId(IDS_ITEM_PICKAXE_DIAMOND)->setUseDescriptionId(IDS_DESC_PICKAXE); + Item::pickAxe_gold = ( new PickaxeItem(29, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pickaxe, eMaterial_gold) ->setIconName(L"pickaxeGold")->setDescriptionId(IDS_ITEM_PICKAXE_GOLD)->setUseDescriptionId(IDS_DESC_PICKAXE); + + Item::hatchet_wood = ( new HatchetItem(15, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_wood) ->setIconName(L"hatchetWood")->setDescriptionId(IDS_ITEM_HATCHET_WOOD)->setUseDescriptionId(IDS_DESC_HATCHET); + Item::hatchet_stone = ( new HatchetItem(19, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_stone) ->setIconName(L"hatchetStone")->setDescriptionId(IDS_ITEM_HATCHET_STONE)->setUseDescriptionId(IDS_DESC_HATCHET); + Item::hatchet_iron = ( new HatchetItem(2, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_iron) ->setIconName(L"hatchetIron")->setDescriptionId(IDS_ITEM_HATCHET_IRON)->setUseDescriptionId(IDS_DESC_HATCHET); + Item::hatchet_diamond = ( new HatchetItem(23, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_diamond) ->setIconName(L"hatchetDiamond")->setDescriptionId(IDS_ITEM_HATCHET_DIAMOND)->setUseDescriptionId(IDS_DESC_HATCHET); + Item::hatchet_gold = ( new HatchetItem(30, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hatchet, eMaterial_gold) ->setIconName(L"hatchetGold")->setDescriptionId(IDS_ITEM_HATCHET_GOLD)->setUseDescriptionId(IDS_DESC_HATCHET); + + Item::hoe_wood = ( new HoeItem(34, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_wood) ->setIconName(L"hoeWood")->setDescriptionId(IDS_ITEM_HOE_WOOD)->setUseDescriptionId(IDS_DESC_HOE); + Item::hoe_stone = ( new HoeItem(35, _Tier::STONE) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_stone) ->setIconName(L"hoeStone")->setDescriptionId(IDS_ITEM_HOE_STONE)->setUseDescriptionId(IDS_DESC_HOE); + Item::hoe_iron = ( new HoeItem(36, _Tier::IRON) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_iron) ->setIconName(L"hoeIron")->setDescriptionId(IDS_ITEM_HOE_IRON)->setUseDescriptionId(IDS_DESC_HOE); + Item::hoe_diamond = ( new HoeItem(37, _Tier::DIAMOND) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_diamond) ->setIconName(L"hoeDiamond")->setDescriptionId(IDS_ITEM_HOE_DIAMOND)->setUseDescriptionId(IDS_DESC_HOE); + Item::hoe_gold = ( new HoeItem(38, _Tier::GOLD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_hoe, eMaterial_gold) ->setIconName(L"hoeGold")->setDescriptionId(IDS_ITEM_HOE_GOLD)->setUseDescriptionId(IDS_DESC_HOE); + + Item::door_wood = ( new DoorItem(68, Material::wood) ) ->setBaseItemTypeAndMaterial(eBaseItemType_door, eMaterial_wood)->setIconName(L"doorWood")->setDescriptionId(IDS_ITEM_DOOR_WOOD)->setUseDescriptionId(IDS_DESC_DOOR_WOOD); + Item::door_iron = ( new DoorItem(74, Material::metal) ) ->setBaseItemTypeAndMaterial(eBaseItemType_door, eMaterial_iron)->setIconName(L"doorIron")->setDescriptionId(IDS_ITEM_DOOR_IRON)->setUseDescriptionId(IDS_DESC_DOOR_IRON); + + Item::helmet_leather = (ArmorItem *) ( ( new ArmorItem(42, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_cloth) ->setIconName(L"helmetCloth")->setDescriptionId(IDS_ITEM_HELMET_CLOTH)->setUseDescriptionId(IDS_DESC_HELMET_LEATHER) ); + Item::helmet_iron = (ArmorItem *) ( ( new ArmorItem(50, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_iron) ->setIconName(L"helmetIron")->setDescriptionId(IDS_ITEM_HELMET_IRON)->setUseDescriptionId(IDS_DESC_HELMET_IRON) ); + Item::helmet_diamond = (ArmorItem *) ( ( new ArmorItem(54, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_diamond) ->setIconName(L"helmetDiamond")->setDescriptionId(IDS_ITEM_HELMET_DIAMOND)->setUseDescriptionId(IDS_DESC_HELMET_DIAMOND) ); + Item::helmet_gold = (ArmorItem *) ( ( new ArmorItem(58, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_gold) ->setIconName(L"helmetGold")->setDescriptionId(IDS_ITEM_HELMET_GOLD)->setUseDescriptionId(IDS_DESC_HELMET_GOLD) ); - Item::chestplate_cloth = (ArmorItem *) ( ( new ArmorItem(43, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_cloth) ->setTextureName(L"chestplateCloth")->setDescriptionId(IDS_ITEM_CHESTPLATE_CLOTH)->setUseDescriptionId(IDS_DESC_CHESTPLATE_LEATHER) ); - Item::chestplate_iron = (ArmorItem *) ( ( new ArmorItem(51, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_iron) ->setTextureName(L"chestplateIron")->setDescriptionId(IDS_ITEM_CHESTPLATE_IRON)->setUseDescriptionId(IDS_DESC_CHESTPLATE_IRON) ); - Item::chestplate_diamond = (ArmorItem *) ( ( new ArmorItem(55, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_diamond) ->setTextureName(L"chestplateDiamond")->setDescriptionId(IDS_ITEM_CHESTPLATE_DIAMOND)->setUseDescriptionId(IDS_DESC_CHESTPLATE_DIAMOND) ); - Item::chestplate_gold = (ArmorItem *) ( ( new ArmorItem(59, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_gold) ->setTextureName(L"chestplateGold")->setDescriptionId(IDS_ITEM_CHESTPLATE_GOLD)->setUseDescriptionId(IDS_DESC_CHESTPLATE_GOLD) ); + Item::chestplate_leather = (ArmorItem *) ( ( new ArmorItem(43, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_cloth) ->setIconName(L"chestplateCloth")->setDescriptionId(IDS_ITEM_CHESTPLATE_CLOTH)->setUseDescriptionId(IDS_DESC_CHESTPLATE_LEATHER) ); + Item::chestplate_iron = (ArmorItem *) ( ( new ArmorItem(51, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_iron) ->setIconName(L"chestplateIron")->setDescriptionId(IDS_ITEM_CHESTPLATE_IRON)->setUseDescriptionId(IDS_DESC_CHESTPLATE_IRON) ); + Item::chestplate_diamond = (ArmorItem *) ( ( new ArmorItem(55, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_diamond) ->setIconName(L"chestplateDiamond")->setDescriptionId(IDS_ITEM_CHESTPLATE_DIAMOND)->setUseDescriptionId(IDS_DESC_CHESTPLATE_DIAMOND) ); + Item::chestplate_gold = (ArmorItem *) ( ( new ArmorItem(59, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_gold) ->setIconName(L"chestplateGold")->setDescriptionId(IDS_ITEM_CHESTPLATE_GOLD)->setUseDescriptionId(IDS_DESC_CHESTPLATE_GOLD) ); - Item::leggings_cloth = (ArmorItem *) ( ( new ArmorItem(44, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_cloth) ->setTextureName(L"leggingsCloth")->setDescriptionId(IDS_ITEM_LEGGINGS_CLOTH)->setUseDescriptionId(IDS_DESC_LEGGINGS_LEATHER) ); - Item::leggings_iron = (ArmorItem *) ( ( new ArmorItem(52, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_iron) ->setTextureName(L"leggingsIron")->setDescriptionId(IDS_ITEM_LEGGINGS_IRON)->setUseDescriptionId(IDS_DESC_LEGGINGS_IRON) ); - Item::leggings_diamond = (ArmorItem *) ( ( new ArmorItem(56, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_diamond) ->setTextureName(L"leggingsDiamond")->setDescriptionId(IDS_ITEM_LEGGINGS_DIAMOND)->setUseDescriptionId(IDS_DESC_LEGGINGS_DIAMOND) ); - Item::leggings_gold = (ArmorItem *) ( ( new ArmorItem(60, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_gold) ->setTextureName(L"leggingsGold")->setDescriptionId(IDS_ITEM_LEGGINGS_GOLD)->setUseDescriptionId(IDS_DESC_LEGGINGS_GOLD) ); + Item::leggings_leather = (ArmorItem *) ( ( new ArmorItem(44, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_cloth) ->setIconName(L"leggingsCloth")->setDescriptionId(IDS_ITEM_LEGGINGS_CLOTH)->setUseDescriptionId(IDS_DESC_LEGGINGS_LEATHER) ); + Item::leggings_iron = (ArmorItem *) ( ( new ArmorItem(52, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_iron) ->setIconName(L"leggingsIron")->setDescriptionId(IDS_ITEM_LEGGINGS_IRON)->setUseDescriptionId(IDS_DESC_LEGGINGS_IRON) ); + Item::leggings_diamond = (ArmorItem *) ( ( new ArmorItem(56, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_diamond) ->setIconName(L"leggingsDiamond")->setDescriptionId(IDS_ITEM_LEGGINGS_DIAMOND)->setUseDescriptionId(IDS_DESC_LEGGINGS_DIAMOND) ); + Item::leggings_gold = (ArmorItem *) ( ( new ArmorItem(60, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_gold) ->setIconName(L"leggingsGold")->setDescriptionId(IDS_ITEM_LEGGINGS_GOLD)->setUseDescriptionId(IDS_DESC_LEGGINGS_GOLD) ); - Item::helmet_chain = (ArmorItem *) ( ( new ArmorItem(46, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_chain) ->setTextureName(L"helmetChain")->setDescriptionId(IDS_ITEM_HELMET_CHAIN)->setUseDescriptionId(IDS_DESC_HELMET_CHAIN) ); - Item::chestplate_chain = (ArmorItem *) ( ( new ArmorItem(47, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_chain) ->setTextureName(L"chestplateChain")->setDescriptionId(IDS_ITEM_CHESTPLATE_CHAIN)->setUseDescriptionId(IDS_DESC_CHESTPLATE_CHAIN) ); - Item::leggings_chain = (ArmorItem *) ( ( new ArmorItem(48, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_chain) ->setTextureName(L"leggingsChain")->setDescriptionId(IDS_ITEM_LEGGINGS_CHAIN)->setUseDescriptionId(IDS_DESC_LEGGINGS_CHAIN) ); - Item::boots_chain = (ArmorItem *) ( ( new ArmorItem(49, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_chain) ->setTextureName(L"bootsChain")->setDescriptionId(IDS_ITEM_BOOTS_CHAIN)->setUseDescriptionId(IDS_DESC_BOOTS_CHAIN) ); + Item::helmet_chain = (ArmorItem *) ( ( new ArmorItem(46, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_chain) ->setIconName(L"helmetChain")->setDescriptionId(IDS_ITEM_HELMET_CHAIN)->setUseDescriptionId(IDS_DESC_HELMET_CHAIN) ); + Item::chestplate_chain = (ArmorItem *) ( ( new ArmorItem(47, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_chain) ->setIconName(L"chestplateChain")->setDescriptionId(IDS_ITEM_CHESTPLATE_CHAIN)->setUseDescriptionId(IDS_DESC_CHESTPLATE_CHAIN) ); + Item::leggings_chain = (ArmorItem *) ( ( new ArmorItem(48, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_chain) ->setIconName(L"leggingsChain")->setDescriptionId(IDS_ITEM_LEGGINGS_CHAIN)->setUseDescriptionId(IDS_DESC_LEGGINGS_CHAIN) ); + Item::boots_chain = (ArmorItem *) ( ( new ArmorItem(49, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_chain) ->setIconName(L"bootsChain")->setDescriptionId(IDS_ITEM_BOOTS_CHAIN)->setUseDescriptionId(IDS_DESC_BOOTS_CHAIN) ); - Item::boots_cloth = (ArmorItem *) ( ( new ArmorItem(45, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_cloth) ->setTextureName(L"bootsCloth")->setDescriptionId(IDS_ITEM_BOOTS_CLOTH)->setUseDescriptionId(IDS_DESC_BOOTS_LEATHER) ); - Item::boots_iron = (ArmorItem *) ( ( new ArmorItem(53, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_iron) ->setTextureName(L"bootsIron")->setDescriptionId(IDS_ITEM_BOOTS_IRON)->setUseDescriptionId(IDS_DESC_BOOTS_IRON) ); - Item::boots_diamond = (ArmorItem *) ( ( new ArmorItem(57, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_diamond) ->setTextureName(L"bootsDiamond")->setDescriptionId(IDS_ITEM_BOOTS_DIAMOND)->setUseDescriptionId(IDS_DESC_BOOTS_DIAMOND) ); - Item::boots_gold = (ArmorItem *) ( ( new ArmorItem(61, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_gold) ->setTextureName(L"bootsGold")->setDescriptionId(IDS_ITEM_BOOTS_GOLD)->setUseDescriptionId(IDS_DESC_BOOTS_GOLD) ); + Item::boots_leather = (ArmorItem *) ( ( new ArmorItem(45, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_cloth) ->setIconName(L"bootsCloth")->setDescriptionId(IDS_ITEM_BOOTS_CLOTH)->setUseDescriptionId(IDS_DESC_BOOTS_LEATHER) ); + Item::boots_iron = (ArmorItem *) ( ( new ArmorItem(53, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_iron) ->setIconName(L"bootsIron")->setDescriptionId(IDS_ITEM_BOOTS_IRON)->setUseDescriptionId(IDS_DESC_BOOTS_IRON) ); + Item::boots_diamond = (ArmorItem *) ( ( new ArmorItem(57, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_diamond) ->setIconName(L"bootsDiamond")->setDescriptionId(IDS_ITEM_BOOTS_DIAMOND)->setUseDescriptionId(IDS_DESC_BOOTS_DIAMOND) ); + Item::boots_gold = (ArmorItem *) ( ( new ArmorItem(61, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_gold) ->setIconName(L"bootsGold")->setDescriptionId(IDS_ITEM_BOOTS_GOLD)->setUseDescriptionId(IDS_DESC_BOOTS_GOLD) ); - Item::ironIngot = ( new Item(9) )->setTextureName(L"ingotIron") ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_iron)->setDescriptionId(IDS_ITEM_INGOT_IRON)->setUseDescriptionId(IDS_DESC_INGOT); - Item::goldIngot = ( new Item(10) )->setTextureName(L"ingotGold") ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_gold)->setDescriptionId(IDS_ITEM_INGOT_GOLD)->setUseDescriptionId(IDS_DESC_INGOT); + Item::ironIngot = ( new Item(9) )->setIconName(L"ingotIron") ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_iron)->setDescriptionId(IDS_ITEM_INGOT_IRON)->setUseDescriptionId(IDS_DESC_INGOT); + Item::goldIngot = ( new Item(10) )->setIconName(L"ingotGold") ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_gold)->setDescriptionId(IDS_ITEM_INGOT_GOLD)->setUseDescriptionId(IDS_DESC_INGOT); // 4J-PB - todo - add materials and base types to the ones below - Item::bucket_empty = ( new BucketItem(69, 0) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_water)->setTextureName(L"bucket")->setDescriptionId(IDS_ITEM_BUCKET)->setUseDescriptionId(IDS_DESC_BUCKET)->setMaxStackSize(16); - Item::bowl = ( new Item(25) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_wood)->setTextureName(L"bowl")->setDescriptionId(IDS_ITEM_BOWL)->setUseDescriptionId(IDS_DESC_BOWL)->setMaxStackSize(64); + Item::bucket_empty = ( new BucketItem(69, 0) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_water)->setIconName(L"bucket")->setDescriptionId(IDS_ITEM_BUCKET)->setUseDescriptionId(IDS_DESC_BUCKET)->setMaxStackSize(16); + Item::bowl = ( new Item(25) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_wood)->setIconName(L"bowl")->setDescriptionId(IDS_ITEM_BOWL)->setUseDescriptionId(IDS_DESC_BOWL)->setMaxStackSize(64); - Item::bucket_water = ( new BucketItem(70, Tile::water_Id) ) ->setTextureName(L"bucketWater")->setDescriptionId(IDS_ITEM_BUCKET_WATER)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_WATER); - Item::bucket_lava = ( new BucketItem(71, Tile::lava_Id) ) ->setTextureName(L"bucketLava")->setDescriptionId(IDS_ITEM_BUCKET_LAVA)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_LAVA); - Item::milk = ( new MilkBucketItem(79) )->setTextureName(L"milk")->setDescriptionId(IDS_ITEM_BUCKET_MILK)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_MILK); + Item::bucket_water = ( new BucketItem(70, Tile::water_Id) ) ->setIconName(L"bucketWater")->setDescriptionId(IDS_ITEM_BUCKET_WATER)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_WATER); + Item::bucket_lava = ( new BucketItem(71, Tile::lava_Id) ) ->setIconName(L"bucketLava")->setDescriptionId(IDS_ITEM_BUCKET_LAVA)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_LAVA); + Item::bucket_milk = ( new MilkBucketItem(79) )->setIconName(L"milk")->setDescriptionId(IDS_ITEM_BUCKET_MILK)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_MILK); - Item::bow = (BowItem *)( new BowItem(5) ) ->setTextureName(L"bow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_bow) ->setDescriptionId(IDS_ITEM_BOW)->setUseDescriptionId(IDS_DESC_BOW); - Item::arrow = ( new Item(6) ) ->setTextureName(L"arrow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_arrow) ->setDescriptionId(IDS_ITEM_ARROW)->setUseDescriptionId(IDS_DESC_ARROW); + Item::bow = (BowItem *)( new BowItem(5) ) ->setIconName(L"bow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_bow) ->setDescriptionId(IDS_ITEM_BOW)->setUseDescriptionId(IDS_DESC_BOW); + Item::arrow = ( new Item(6) ) ->setIconName(L"arrow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_arrow) ->setDescriptionId(IDS_ITEM_ARROW)->setUseDescriptionId(IDS_DESC_ARROW); - Item::compass = ( new CompassItem(89) ) ->setTextureName(L"compass")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_compass) ->setDescriptionId(IDS_ITEM_COMPASS)->setUseDescriptionId(IDS_DESC_COMPASS); - Item::clock = ( new ClockItem(91) ) ->setTextureName(L"clock")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_clock) ->setDescriptionId(IDS_ITEM_CLOCK)->setUseDescriptionId(IDS_DESC_CLOCK); - Item::map = (MapItem *) ( new MapItem(102) ) ->setTextureName(L"map")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_map) ->setDescriptionId(IDS_ITEM_MAP)->setUseDescriptionId(IDS_DESC_MAP); + Item::compass = ( new CompassItem(89) ) ->setIconName(L"compass")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_compass) ->setDescriptionId(IDS_ITEM_COMPASS)->setUseDescriptionId(IDS_DESC_COMPASS); + Item::clock = ( new ClockItem(91) ) ->setIconName(L"clock")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_clock) ->setDescriptionId(IDS_ITEM_CLOCK)->setUseDescriptionId(IDS_DESC_CLOCK); + Item::map = (MapItem *) ( new MapItem(102) ) ->setIconName(L"map")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_map) ->setDescriptionId(IDS_ITEM_MAP)->setUseDescriptionId(IDS_DESC_MAP); - Item::flintAndSteel = ( new FlintAndSteelItem(3) ) ->setTextureName(L"flintAndSteel")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_flintandsteel)->setDescriptionId(IDS_ITEM_FLINT_AND_STEEL)->setUseDescriptionId(IDS_DESC_FLINTANDSTEEL); - Item::apple = ( new FoodItem(4, 4, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setTextureName(L"apple")->setDescriptionId(IDS_ITEM_APPLE)->setUseDescriptionId(IDS_DESC_APPLE); - Item::coal = ( new CoalItem(7) ) ->setTextureName(L"coal")->setDescriptionId(IDS_ITEM_COAL)->setUseDescriptionId(IDS_DESC_COAL); - Item::diamond = ( new Item(8) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_diamond)->setTextureName(L"diamond")->setDescriptionId(IDS_ITEM_DIAMOND)->setUseDescriptionId(IDS_DESC_DIAMONDS); - Item::stick = ( new Item(24) ) ->setTextureName(L"stick")->handEquipped()->setDescriptionId(IDS_ITEM_STICK)->setUseDescriptionId(IDS_DESC_STICK); - Item::mushroomStew = ( new BowlFoodItem(26, 6) ) ->setTextureName(L"mushroomStew")->setDescriptionId(IDS_ITEM_MUSHROOM_STEW)->setUseDescriptionId(IDS_DESC_MUSHROOMSTEW); + Item::flintAndSteel = ( new FlintAndSteelItem(3) ) ->setIconName(L"flintAndSteel")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_flintandsteel)->setDescriptionId(IDS_ITEM_FLINT_AND_STEEL)->setUseDescriptionId(IDS_DESC_FLINTANDSTEEL); + Item::apple = ( new FoodItem(4, 4, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setIconName(L"apple")->setDescriptionId(IDS_ITEM_APPLE)->setUseDescriptionId(IDS_DESC_APPLE); + Item::coal = ( new CoalItem(7) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_coal)->setIconName(L"coal")->setDescriptionId(IDS_ITEM_COAL)->setUseDescriptionId(IDS_DESC_COAL); + Item::diamond = ( new Item(8) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_diamond)->setIconName(L"diamond")->setDescriptionId(IDS_ITEM_DIAMOND)->setUseDescriptionId(IDS_DESC_DIAMONDS); + Item::stick = ( new Item(24) ) ->setIconName(L"stick")->handEquipped()->setDescriptionId(IDS_ITEM_STICK)->setUseDescriptionId(IDS_DESC_STICK); + Item::mushroomStew = ( new BowlFoodItem(26, 6) ) ->setIconName(L"mushroomStew")->setDescriptionId(IDS_ITEM_MUSHROOM_STEW)->setUseDescriptionId(IDS_DESC_MUSHROOMSTEW); - Item::string = ( new TilePlanterItem(31, Tile::tripWire) ) ->setTextureName(L"string")->setDescriptionId(IDS_ITEM_STRING)->setUseDescriptionId(IDS_DESC_STRING); - Item::feather = ( new Item(32) ) ->setTextureName(L"feather")->setDescriptionId(IDS_ITEM_FEATHER)->setUseDescriptionId(IDS_DESC_FEATHER); - Item::sulphur = ( new Item(33) ) ->setTextureName(L"sulphur")->setDescriptionId(IDS_ITEM_SULPHUR)->setUseDescriptionId(IDS_DESC_SULPHUR)->setPotionBrewingFormula(PotionBrewing::MOD_GUNPOWDER); + Item::string = ( new TilePlanterItem(31, Tile::tripWire) ) ->setIconName(L"string")->setDescriptionId(IDS_ITEM_STRING)->setUseDescriptionId(IDS_DESC_STRING); + Item::feather = ( new Item(32) ) ->setIconName(L"feather")->setDescriptionId(IDS_ITEM_FEATHER)->setUseDescriptionId(IDS_DESC_FEATHER); + Item::gunpowder = ( new Item(33) ) ->setIconName(L"sulphur")->setDescriptionId(IDS_ITEM_SULPHUR)->setUseDescriptionId(IDS_DESC_SULPHUR)->setPotionBrewingFormula(PotionBrewing::MOD_GUNPOWDER); - Item::seeds_wheat = ( new SeedItem(39, Tile::crops_Id, Tile::farmland_Id) ) ->setTextureName(L"seeds")->setDescriptionId(IDS_ITEM_WHEAT_SEEDS)->setUseDescriptionId(IDS_DESC_WHEAT_SEEDS); - Item::wheat = ( new Item(40) ) ->setTextureName(L"wheat")->setDescriptionId(IDS_ITEM_WHEAT)->setUseDescriptionId(IDS_DESC_WHEAT); - Item::bread = ( new FoodItem(41, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setTextureName(L"bread")->setDescriptionId(IDS_ITEM_BREAD)->setUseDescriptionId(IDS_DESC_BREAD); + Item::seeds_wheat = ( new SeedItem(39, Tile::wheat_Id, Tile::farmland_Id) ) ->setIconName(L"seeds")->setDescriptionId(IDS_ITEM_WHEAT_SEEDS)->setUseDescriptionId(IDS_DESC_WHEAT_SEEDS); + Item::wheat = ( new Item(40) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_wheat)->setIconName(L"wheat")->setDescriptionId(IDS_ITEM_WHEAT)->setUseDescriptionId(IDS_DESC_WHEAT); + Item::bread = ( new FoodItem(41, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setIconName(L"bread")->setDescriptionId(IDS_ITEM_BREAD)->setUseDescriptionId(IDS_DESC_BREAD); - Item::flint = ( new Item(62) ) ->setTextureName(L"flint")->setDescriptionId(IDS_ITEM_FLINT)->setUseDescriptionId(IDS_DESC_FLINT); - Item::porkChop_raw = ( new FoodItem(63, 3, FoodConstants::FOOD_SATURATION_LOW, true) ) ->setTextureName(L"porkchopRaw")->setDescriptionId(IDS_ITEM_PORKCHOP_RAW)->setUseDescriptionId(IDS_DESC_PORKCHOP_RAW); - Item::porkChop_cooked = ( new FoodItem(64, 8, FoodConstants::FOOD_SATURATION_GOOD, true) ) ->setTextureName(L"porkchopCooked")->setDescriptionId(IDS_ITEM_PORKCHOP_COOKED)->setUseDescriptionId(IDS_DESC_PORKCHOP_COOKED); - Item::painting = ( new HangingEntityItem(65,eTYPE_PAINTING) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_cloth)->setTextureName(L"painting")->setDescriptionId(IDS_ITEM_PAINTING)->setUseDescriptionId(IDS_DESC_PICTURE); + Item::flint = ( new Item(62) ) ->setIconName(L"flint")->setDescriptionId(IDS_ITEM_FLINT)->setUseDescriptionId(IDS_DESC_FLINT); + Item::porkChop_raw = ( new FoodItem(63, 3, FoodConstants::FOOD_SATURATION_LOW, true) ) ->setIconName(L"porkchopRaw")->setDescriptionId(IDS_ITEM_PORKCHOP_RAW)->setUseDescriptionId(IDS_DESC_PORKCHOP_RAW); + Item::porkChop_cooked = ( new FoodItem(64, 8, FoodConstants::FOOD_SATURATION_GOOD, true) ) ->setIconName(L"porkchopCooked")->setDescriptionId(IDS_ITEM_PORKCHOP_COOKED)->setUseDescriptionId(IDS_DESC_PORKCHOP_COOKED); + Item::painting = ( new HangingEntityItem(65,eTYPE_PAINTING) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_cloth)->setIconName(L"painting")->setDescriptionId(IDS_ITEM_PAINTING)->setUseDescriptionId(IDS_DESC_PICTURE); - Item::apple_gold = ( new GoldenAppleItem(66, 4, FoodConstants::FOOD_SATURATION_SUPERNATURAL, false) )->setCanAlwaysEat()->setEatEffect(MobEffect::regeneration->id, 5, 0, 1.0f) - ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit,eMaterial_apple)->setTextureName(L"appleGold")->setDescriptionId(IDS_ITEM_APPLE_GOLD);//->setUseDescriptionId(IDS_DESC_GOLDENAPPLE); + Item::apple_gold = ( new GoldenAppleItem(66, 4, FoodConstants::FOOD_SATURATION_SUPERNATURAL, false) )->setCanAlwaysEat()->setEatEffect(MobEffect::regeneration->id, 5, 1, 1.0f) + ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit,eMaterial_apple)->setIconName(L"appleGold")->setDescriptionId(IDS_ITEM_APPLE_GOLD);//->setUseDescriptionId(IDS_DESC_GOLDENAPPLE); - Item::sign = ( new SignItem(67) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_wood)->setTextureName(L"sign")->setDescriptionId(IDS_ITEM_SIGN)->setUseDescriptionId(IDS_DESC_SIGN); + Item::sign = ( new SignItem(67) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_wood)->setIconName(L"sign")->setDescriptionId(IDS_ITEM_SIGN)->setUseDescriptionId(IDS_DESC_SIGN); - Item::minecart = ( new MinecartItem(72, Minecart::RIDEABLE) ) ->setTextureName(L"minecart")->setDescriptionId(IDS_ITEM_MINECART)->setUseDescriptionId(IDS_DESC_MINECART); - Item::saddle = ( new SaddleItem(73) ) ->setTextureName(L"saddle")->setDescriptionId(IDS_ITEM_SADDLE)->setUseDescriptionId(IDS_DESC_SADDLE); - Item::redStone = ( new RedStoneItem(75) ) ->setTextureName(L"redstone")->setDescriptionId(IDS_ITEM_REDSTONE)->setUseDescriptionId(IDS_DESC_REDSTONE_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_REDSTONE); - Item::snowBall = ( new SnowballItem(76) ) ->setTextureName(L"snowball")->setDescriptionId(IDS_ITEM_SNOWBALL)->setUseDescriptionId(IDS_DESC_SNOWBALL); - - Item::boat = ( new BoatItem(77) ) ->setTextureName(L"boat")->setDescriptionId(IDS_ITEM_BOAT)->setUseDescriptionId(IDS_DESC_BOAT); - - Item::leather = ( new Item(78) ) ->setTextureName(L"leather")->setDescriptionId(IDS_ITEM_LEATHER)->setUseDescriptionId(IDS_DESC_LEATHER); - Item::brick = ( new Item(80) ) ->setTextureName(L"brick")->setDescriptionId(IDS_ITEM_BRICK)->setUseDescriptionId(IDS_DESC_BRICK); - Item::clay = ( new Item(81) ) ->setTextureName(L"clay")->setDescriptionId(IDS_ITEM_CLAY)->setUseDescriptionId(IDS_DESC_CLAY); - Item::reeds = ( new TilePlanterItem(82, Tile::reeds) ) ->setTextureName(L"reeds")->setDescriptionId(IDS_ITEM_REEDS)->setUseDescriptionId(IDS_DESC_REEDS); - Item::paper = ( new Item(83) ) ->setTextureName(L"paper")->setDescriptionId(IDS_ITEM_PAPER)->setUseDescriptionId(IDS_DESC_PAPER); - Item::book = ( new BookItem(84) ) ->setTextureName(L"book")->setDescriptionId(IDS_ITEM_BOOK)->setUseDescriptionId(IDS_DESC_BOOK); - Item::slimeBall = ( new Item(85) ) ->setTextureName(L"slimeball")->setDescriptionId(IDS_ITEM_SLIMEBALL)->setUseDescriptionId(IDS_DESC_SLIMEBALL); - Item::minecart_chest = ( new MinecartItem(86, Minecart::CHEST) ) ->setTextureName(L"minecartChest")->setDescriptionId(IDS_ITEM_MINECART_CHEST)->setUseDescriptionId(IDS_DESC_MINECARTWITHCHEST); - Item::minecart_furnace = ( new MinecartItem(87, Minecart::FURNACE) )->setTextureName(L"minecartFurnace")->setDescriptionId(IDS_ITEM_MINECART_FURNACE)->setUseDescriptionId(IDS_DESC_MINECARTWITHFURNACE); - Item::egg = ( new EggItem(88) ) ->setTextureName(L"egg")->setDescriptionId(IDS_ITEM_EGG)->setUseDescriptionId(IDS_DESC_EGG); - Item::fishingRod = (FishingRodItem *)( new FishingRodItem(90) ) ->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_wood)->setTextureName(L"fishingRod")->setDescriptionId(IDS_ITEM_FISHING_ROD)->setUseDescriptionId(IDS_DESC_FISHINGROD); - Item::yellowDust = ( new Item(92) ) ->setTextureName(L"yellowDust")->setDescriptionId(IDS_ITEM_YELLOW_DUST)->setUseDescriptionId(IDS_DESC_YELLOW_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_GLOWSTONE); - Item::fish_raw = ( new FoodItem(93, 2, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setTextureName(L"fishRaw")->setDescriptionId(IDS_ITEM_FISH_RAW)->setUseDescriptionId(IDS_DESC_FISH_RAW); - Item::fish_cooked = ( new FoodItem(94, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setTextureName(L"fishCooked")->setDescriptionId(IDS_ITEM_FISH_COOKED)->setUseDescriptionId(IDS_DESC_FISH_COOKED); - - Item::dye_powder = ( new DyePowderItem(95) ) ->setBaseItemTypeAndMaterial(eBaseItemType_dyepowder, eMaterial_dye)->setTextureName(L"dyePowder")->setDescriptionId(IDS_ITEM_DYE_POWDER)->setUseDescriptionId(-1); - - Item::bone = ( new Item(96) ) ->setTextureName(L"bone")->setDescriptionId(IDS_ITEM_BONE)->handEquipped()->setUseDescriptionId(IDS_DESC_BONE); - Item::sugar = ( new Item(97) ) ->setTextureName(L"sugar")->setDescriptionId(IDS_ITEM_SUGAR)->setUseDescriptionId(IDS_DESC_SUGAR)->setPotionBrewingFormula(PotionBrewing::MOD_SUGAR); + Item::minecart = ( new MinecartItem(72, Minecart::TYPE_RIDEABLE) ) ->setIconName(L"minecart")->setDescriptionId(IDS_ITEM_MINECART)->setUseDescriptionId(IDS_DESC_MINECART); + Item::saddle = ( new SaddleItem(73) ) ->setIconName(L"saddle")->setDescriptionId(IDS_ITEM_SADDLE)->setUseDescriptionId(IDS_DESC_SADDLE); + Item::redStone = ( new RedStoneItem(75) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_redstone)->setIconName(L"redstone")->setDescriptionId(IDS_ITEM_REDSTONE)->setUseDescriptionId(IDS_DESC_REDSTONE_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_REDSTONE); + Item::snowBall = ( new SnowballItem(76) ) ->setIconName(L"snowball")->setDescriptionId(IDS_ITEM_SNOWBALL)->setUseDescriptionId(IDS_DESC_SNOWBALL); + + Item::boat = ( new BoatItem(77) ) ->setIconName(L"boat")->setDescriptionId(IDS_ITEM_BOAT)->setUseDescriptionId(IDS_DESC_BOAT); + + Item::leather = ( new Item(78) ) ->setIconName(L"leather")->setDescriptionId(IDS_ITEM_LEATHER)->setUseDescriptionId(IDS_DESC_LEATHER); + Item::brick = ( new Item(80) ) ->setIconName(L"brick")->setDescriptionId(IDS_ITEM_BRICK)->setUseDescriptionId(IDS_DESC_BRICK); + Item::clay = ( new Item(81) ) ->setIconName(L"clay")->setDescriptionId(IDS_ITEM_CLAY)->setUseDescriptionId(IDS_DESC_CLAY); + Item::reeds = ( new TilePlanterItem(82, Tile::reeds) ) ->setIconName(L"reeds")->setDescriptionId(IDS_ITEM_REEDS)->setUseDescriptionId(IDS_DESC_REEDS); + Item::paper = ( new Item(83) ) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_paper, Item::eMaterial_paper)->setIconName(L"paper")->setDescriptionId(IDS_ITEM_PAPER)->setUseDescriptionId(IDS_DESC_PAPER); + Item::book = ( new BookItem(84) ) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_paper, Item::eMaterial_book)->setIconName(L"book")->setDescriptionId(IDS_ITEM_BOOK)->setUseDescriptionId(IDS_DESC_BOOK); + Item::slimeBall = ( new Item(85) ) ->setIconName(L"slimeball")->setDescriptionId(IDS_ITEM_SLIMEBALL)->setUseDescriptionId(IDS_DESC_SLIMEBALL); + Item::minecart_chest = ( new MinecartItem(86, Minecart::TYPE_CHEST) ) ->setIconName(L"minecart_chest")->setDescriptionId(IDS_ITEM_MINECART_CHEST)->setUseDescriptionId(IDS_DESC_MINECARTWITHCHEST); + Item::minecart_furnace = ( new MinecartItem(87, Minecart::TYPE_FURNACE) )->setIconName(L"minecart_furnace")->setDescriptionId(IDS_ITEM_MINECART_FURNACE)->setUseDescriptionId(IDS_DESC_MINECARTWITHFURNACE); + Item::egg = ( new EggItem(88) ) ->setIconName(L"egg")->setDescriptionId(IDS_ITEM_EGG)->setUseDescriptionId(IDS_DESC_EGG); + Item::fishingRod = (FishingRodItem *)( new FishingRodItem(90) ) ->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_wood)->setIconName(L"fishingRod")->setDescriptionId(IDS_ITEM_FISHING_ROD)->setUseDescriptionId(IDS_DESC_FISHINGROD); + Item::yellowDust = ( new Item(92) ) ->setIconName(L"yellowDust")->setDescriptionId(IDS_ITEM_YELLOW_DUST)->setUseDescriptionId(IDS_DESC_YELLOW_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_GLOWSTONE); + Item::fish_raw = ( new FoodItem(93, 2, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setIconName(L"fishRaw")->setDescriptionId(IDS_ITEM_FISH_RAW)->setUseDescriptionId(IDS_DESC_FISH_RAW); + Item::fish_cooked = ( new FoodItem(94, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setIconName(L"fishCooked")->setDescriptionId(IDS_ITEM_FISH_COOKED)->setUseDescriptionId(IDS_DESC_FISH_COOKED); + + Item::dye_powder = ( new DyePowderItem(95) ) ->setBaseItemTypeAndMaterial(eBaseItemType_dyepowder, eMaterial_dye)->setIconName(L"dyePowder")->setDescriptionId(IDS_ITEM_DYE_POWDER)->setUseDescriptionId(-1); + + Item::bone = ( new Item(96) ) ->setIconName(L"bone")->setDescriptionId(IDS_ITEM_BONE)->handEquipped()->setUseDescriptionId(IDS_DESC_BONE); + Item::sugar = ( new Item(97) ) ->setIconName(L"sugar")->setDescriptionId(IDS_ITEM_SUGAR)->setUseDescriptionId(IDS_DESC_SUGAR)->setPotionBrewingFormula(PotionBrewing::MOD_SUGAR); // 4J-PB - changing the cake to be stackable - Jens ok'ed this 23/10/12 //Item::cake = ( new TilePlanterItem(98, Tile::cake) )->setMaxStackSize(1)->setIcon(13, 1)->setDescriptionId(IDS_ITEM_CAKE)->setUseDescriptionId(IDS_DESC_CAKE); - Item::cake = ( new TilePlanterItem(98, Tile::cake) ) ->setTextureName(L"cake")->setDescriptionId(IDS_ITEM_CAKE)->setUseDescriptionId(IDS_DESC_CAKE); + Item::cake = ( new TilePlanterItem(98, Tile::cake) ) ->setIconName(L"cake")->setDescriptionId(IDS_ITEM_CAKE)->setUseDescriptionId(IDS_DESC_CAKE); - Item::bed = ( new BedItem(99) ) ->setMaxStackSize(1)->setTextureName(L"bed")->setDescriptionId(IDS_ITEM_BED)->setUseDescriptionId(IDS_DESC_BED); + Item::bed = ( new BedItem(99) ) ->setMaxStackSize(1)->setIconName(L"bed")->setDescriptionId(IDS_ITEM_BED)->setUseDescriptionId(IDS_DESC_BED); - Item::diode = ( new TilePlanterItem(100, (Tile *)Tile::diode_off) ) ->setTextureName(L"diode")->setDescriptionId(IDS_ITEM_DIODE)->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER); - Item::cookie = ( new FoodItem(101, 2, FoodConstants::FOOD_SATURATION_POOR, false) ) ->setTextureName(L"cookie")->setDescriptionId(IDS_ITEM_COOKIE)->setUseDescriptionId(IDS_DESC_COOKIE); + Item::repeater = ( new TilePlanterItem(100, (Tile *)Tile::diode_off) ) ->setIconName(L"diode")->setDescriptionId(IDS_ITEM_DIODE)->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER); + Item::cookie = ( new FoodItem(101, 2, FoodConstants::FOOD_SATURATION_POOR, false) ) ->setIconName(L"cookie")->setDescriptionId(IDS_ITEM_COOKIE)->setUseDescriptionId(IDS_DESC_COOKIE); - Item::shears = (ShearsItem *)( new ShearsItem(103) ) ->setTextureName(L"shears")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_shears)->setDescriptionId(IDS_ITEM_SHEARS)->setUseDescriptionId(IDS_DESC_SHEARS); + Item::shears = (ShearsItem *)( new ShearsItem(103) ) ->setIconName(L"shears")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_shears)->setDescriptionId(IDS_ITEM_SHEARS)->setUseDescriptionId(IDS_DESC_SHEARS); - Item::melon = (new FoodItem(104, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setTextureName(L"melon")->setDescriptionId(IDS_ITEM_MELON_SLICE)->setUseDescriptionId(IDS_DESC_MELON_SLICE); + Item::melon = (new FoodItem(104, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setIconName(L"melon")->setDescriptionId(IDS_ITEM_MELON_SLICE)->setUseDescriptionId(IDS_DESC_MELON_SLICE); - Item::seeds_pumpkin = (new SeedItem(105, Tile::pumpkinStem_Id, Tile::farmland_Id)) ->setTextureName(L"seeds_pumpkin")->setBaseItemTypeAndMaterial(eBaseItemType_seed, eMaterial_pumpkin)->setDescriptionId(IDS_ITEM_PUMPKIN_SEEDS)->setUseDescriptionId(IDS_DESC_PUMPKIN_SEEDS); - Item::seeds_melon = (new SeedItem(106, Tile::melonStem_Id, Tile::farmland_Id)) ->setTextureName(L"seeds_melon")->setBaseItemTypeAndMaterial(eBaseItemType_seed, eMaterial_melon)->setDescriptionId(IDS_ITEM_MELON_SEEDS)->setUseDescriptionId(IDS_DESC_MELON_SEEDS); + Item::seeds_pumpkin = (new SeedItem(105, Tile::pumpkinStem_Id, Tile::farmland_Id)) ->setIconName(L"seeds_pumpkin")->setBaseItemTypeAndMaterial(eBaseItemType_seed, eMaterial_pumpkin)->setDescriptionId(IDS_ITEM_PUMPKIN_SEEDS)->setUseDescriptionId(IDS_DESC_PUMPKIN_SEEDS); + Item::seeds_melon = (new SeedItem(106, Tile::melonStem_Id, Tile::farmland_Id)) ->setIconName(L"seeds_melon")->setBaseItemTypeAndMaterial(eBaseItemType_seed, eMaterial_melon)->setDescriptionId(IDS_ITEM_MELON_SEEDS)->setUseDescriptionId(IDS_DESC_MELON_SEEDS); - Item::beef_raw = (new FoodItem(107, 3, FoodConstants::FOOD_SATURATION_LOW, true)) ->setTextureName(L"beefRaw")->setDescriptionId(IDS_ITEM_BEEF_RAW)->setUseDescriptionId(IDS_DESC_BEEF_RAW); - Item::beef_cooked = (new FoodItem(108, 8, FoodConstants::FOOD_SATURATION_GOOD, true))->setTextureName(L"beefCooked")->setDescriptionId(IDS_ITEM_BEEF_COOKED)->setUseDescriptionId(IDS_DESC_BEEF_COOKED); - Item::chicken_raw = (new FoodItem(109, 2, FoodConstants::FOOD_SATURATION_LOW, true))->setEatEffect(MobEffect::hunger->id, 30, 0, .3f)->setTextureName(L"chickenRaw")->setDescriptionId(IDS_ITEM_CHICKEN_RAW)->setUseDescriptionId(IDS_DESC_CHICKEN_RAW); - Item::chicken_cooked = (new FoodItem(110, 6, FoodConstants::FOOD_SATURATION_NORMAL, true))->setTextureName(L"chickenCooked")->setDescriptionId(IDS_ITEM_CHICKEN_COOKED)->setUseDescriptionId(IDS_DESC_CHICKEN_COOKED); - Item::rotten_flesh = (new FoodItem(111, 4, FoodConstants::FOOD_SATURATION_POOR, true))->setEatEffect(MobEffect::hunger->id, 30, 0, .8f)->setTextureName(L"rottenFlesh")->setDescriptionId(IDS_ITEM_ROTTEN_FLESH)->setUseDescriptionId(IDS_DESC_ROTTEN_FLESH); + Item::beef_raw = (new FoodItem(107, 3, FoodConstants::FOOD_SATURATION_LOW, true)) ->setIconName(L"beefRaw")->setDescriptionId(IDS_ITEM_BEEF_RAW)->setUseDescriptionId(IDS_DESC_BEEF_RAW); + Item::beef_cooked = (new FoodItem(108, 8, FoodConstants::FOOD_SATURATION_GOOD, true))->setIconName(L"beefCooked")->setDescriptionId(IDS_ITEM_BEEF_COOKED)->setUseDescriptionId(IDS_DESC_BEEF_COOKED); + Item::chicken_raw = (new FoodItem(109, 2, FoodConstants::FOOD_SATURATION_LOW, true))->setEatEffect(MobEffect::hunger->id, 30, 0, .3f)->setIconName(L"chickenRaw")->setDescriptionId(IDS_ITEM_CHICKEN_RAW)->setUseDescriptionId(IDS_DESC_CHICKEN_RAW); + Item::chicken_cooked = (new FoodItem(110, 6, FoodConstants::FOOD_SATURATION_NORMAL, true))->setIconName(L"chickenCooked")->setDescriptionId(IDS_ITEM_CHICKEN_COOKED)->setUseDescriptionId(IDS_DESC_CHICKEN_COOKED); + Item::rotten_flesh = (new FoodItem(111, 4, FoodConstants::FOOD_SATURATION_POOR, true))->setEatEffect(MobEffect::hunger->id, 30, 0, .8f)->setIconName(L"rottenFlesh")->setDescriptionId(IDS_ITEM_ROTTEN_FLESH)->setUseDescriptionId(IDS_DESC_ROTTEN_FLESH); - Item::enderPearl = (new EnderpearlItem(112)) ->setTextureName(L"enderPearl")->setDescriptionId(IDS_ITEM_ENDER_PEARL)->setUseDescriptionId(IDS_DESC_ENDER_PEARL); + Item::enderPearl = (new EnderpearlItem(112)) ->setIconName(L"enderPearl")->setDescriptionId(IDS_ITEM_ENDER_PEARL)->setUseDescriptionId(IDS_DESC_ENDER_PEARL); - Item::blazeRod = (new Item(113) ) ->setTextureName(L"blazeRod")->setDescriptionId(IDS_ITEM_BLAZE_ROD)->setUseDescriptionId(IDS_DESC_BLAZE_ROD)->handEquipped(); - Item::ghastTear = (new Item(114) ) ->setTextureName(L"ghastTear")->setDescriptionId(IDS_ITEM_GHAST_TEAR)->setUseDescriptionId(IDS_DESC_GHAST_TEAR)->setPotionBrewingFormula(PotionBrewing::MOD_GHASTTEARS); - Item::goldNugget = (new Item(115) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_gold)->setTextureName(L"goldNugget")->setDescriptionId(IDS_ITEM_GOLD_NUGGET)->setUseDescriptionId(IDS_DESC_GOLD_NUGGET); + Item::blazeRod = (new Item(113) ) ->setIconName(L"blazeRod")->setDescriptionId(IDS_ITEM_BLAZE_ROD)->setUseDescriptionId(IDS_DESC_BLAZE_ROD)->handEquipped(); + Item::ghastTear = (new Item(114) ) ->setIconName(L"ghastTear")->setDescriptionId(IDS_ITEM_GHAST_TEAR)->setUseDescriptionId(IDS_DESC_GHAST_TEAR)->setPotionBrewingFormula(PotionBrewing::MOD_GHASTTEARS); + Item::goldNugget = (new Item(115) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_gold)->setIconName(L"goldNugget")->setDescriptionId(IDS_ITEM_GOLD_NUGGET)->setUseDescriptionId(IDS_DESC_GOLD_NUGGET); - Item::netherStalkSeeds = (new SeedItem(116, Tile::netherStalk_Id, Tile::hellSand_Id) ) ->setTextureName(L"netherStalkSeeds")->setDescriptionId(IDS_ITEM_NETHER_STALK_SEEDS)->setUseDescriptionId(IDS_DESC_NETHER_STALK_SEEDS)->setPotionBrewingFormula(PotionBrewing::MOD_NETHERWART); + Item::netherwart_seeds = (new SeedItem(116, Tile::netherStalk_Id, Tile::soulsand_Id) ) ->setIconName(L"netherStalkSeeds")->setDescriptionId(IDS_ITEM_NETHER_STALK_SEEDS)->setUseDescriptionId(IDS_DESC_NETHER_STALK_SEEDS)->setPotionBrewingFormula(PotionBrewing::MOD_NETHERWART); - Item::potion = (PotionItem *) ( ( new PotionItem(117) ) ->setTextureName(L"potion")->setDescriptionId(IDS_ITEM_POTION)->setUseDescriptionId(IDS_DESC_POTION) ); - Item::glassBottle = (new BottleItem(118) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_glass)->setTextureName(L"glassBottle")->setDescriptionId(IDS_ITEM_GLASS_BOTTLE)->setUseDescriptionId(IDS_DESC_GLASS_BOTTLE); + Item::potion = (PotionItem *) ( ( new PotionItem(117) ) ->setIconName(L"potion")->setDescriptionId(IDS_ITEM_POTION)->setUseDescriptionId(IDS_DESC_POTION) ); + Item::glassBottle = (new BottleItem(118) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_glass)->setIconName(L"glassBottle")->setDescriptionId(IDS_ITEM_GLASS_BOTTLE)->setUseDescriptionId(IDS_DESC_GLASS_BOTTLE); - Item::spiderEye = (new FoodItem(119, 2, FoodConstants::FOOD_SATURATION_GOOD, false) ) ->setEatEffect(MobEffect::poison->id, 5, 0, 1.0f)->setTextureName(L"spiderEye")->setDescriptionId(IDS_ITEM_SPIDER_EYE)->setUseDescriptionId(IDS_DESC_SPIDER_EYE)->setPotionBrewingFormula(PotionBrewing::MOD_SPIDEREYE); - Item::fermentedSpiderEye = (new Item(120) ) ->setTextureName(L"fermentedSpiderEye")->setDescriptionId(IDS_ITEM_FERMENTED_SPIDER_EYE)->setUseDescriptionId(IDS_DESC_FERMENTED_SPIDER_EYE)->setPotionBrewingFormula(PotionBrewing::MOD_FERMENTEDEYE); + Item::spiderEye = (new FoodItem(119, 2, FoodConstants::FOOD_SATURATION_GOOD, false) ) ->setEatEffect(MobEffect::poison->id, 5, 0, 1.0f)->setIconName(L"spiderEye")->setDescriptionId(IDS_ITEM_SPIDER_EYE)->setUseDescriptionId(IDS_DESC_SPIDER_EYE)->setPotionBrewingFormula(PotionBrewing::MOD_SPIDEREYE); + Item::fermentedSpiderEye = (new Item(120) ) ->setIconName(L"fermentedSpiderEye")->setDescriptionId(IDS_ITEM_FERMENTED_SPIDER_EYE)->setUseDescriptionId(IDS_DESC_FERMENTED_SPIDER_EYE)->setPotionBrewingFormula(PotionBrewing::MOD_FERMENTEDEYE); - Item::blazePowder = (new Item(121) ) ->setTextureName(L"blazePowder")->setDescriptionId(IDS_ITEM_BLAZE_POWDER)->setUseDescriptionId(IDS_DESC_BLAZE_POWDER)->setPotionBrewingFormula(PotionBrewing::MOD_BLAZEPOWDER); - Item::magmaCream = (new Item(122) ) ->setTextureName(L"magmaCream")->setDescriptionId(IDS_ITEM_MAGMA_CREAM)->setUseDescriptionId(IDS_DESC_MAGMA_CREAM)->setPotionBrewingFormula(PotionBrewing::MOD_MAGMACREAM); + Item::blazePowder = (new Item(121) ) ->setIconName(L"blazePowder")->setDescriptionId(IDS_ITEM_BLAZE_POWDER)->setUseDescriptionId(IDS_DESC_BLAZE_POWDER)->setPotionBrewingFormula(PotionBrewing::MOD_BLAZEPOWDER); + Item::magmaCream = (new Item(122) ) ->setIconName(L"magmaCream")->setDescriptionId(IDS_ITEM_MAGMA_CREAM)->setUseDescriptionId(IDS_DESC_MAGMA_CREAM)->setPotionBrewingFormula(PotionBrewing::MOD_MAGMACREAM); - Item::brewingStand = (new TilePlanterItem(123, Tile::brewingStand) ) ->setBaseItemTypeAndMaterial(eBaseItemType_device, eMaterial_blaze)->setTextureName(L"brewingStand")->setDescriptionId(IDS_ITEM_BREWING_STAND)->setUseDescriptionId(IDS_DESC_BREWING_STAND); - Item::cauldron = (new TilePlanterItem(124, Tile::cauldron) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_iron)->setTextureName(L"cauldron")->setDescriptionId(IDS_ITEM_CAULDRON)->setUseDescriptionId(IDS_DESC_CAULDRON); - Item::eyeOfEnder = (new EnderEyeItem(125) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_ender)->setTextureName(L"eyeOfEnder")->setDescriptionId(IDS_ITEM_EYE_OF_ENDER)->setUseDescriptionId(IDS_DESC_EYE_OF_ENDER); - Item::speckledMelon = (new Item(126) ) ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit, eMaterial_melon)->setTextureName(L"speckledMelon")->setDescriptionId(IDS_ITEM_SPECKLED_MELON)->setUseDescriptionId(IDS_DESC_SPECKLED_MELON)->setPotionBrewingFormula(PotionBrewing::MOD_SPECKLEDMELON); + Item::brewingStand = (new TilePlanterItem(123, Tile::brewingStand) ) ->setBaseItemTypeAndMaterial(eBaseItemType_device, eMaterial_blaze)->setIconName(L"brewingStand")->setDescriptionId(IDS_ITEM_BREWING_STAND)->setUseDescriptionId(IDS_DESC_BREWING_STAND); + Item::cauldron = (new TilePlanterItem(124, Tile::cauldron) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_iron)->setIconName(L"cauldron")->setDescriptionId(IDS_ITEM_CAULDRON)->setUseDescriptionId(IDS_DESC_CAULDRON); + Item::eyeOfEnder = (new EnderEyeItem(125) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_ender)->setIconName(L"eyeOfEnder")->setDescriptionId(IDS_ITEM_EYE_OF_ENDER)->setUseDescriptionId(IDS_DESC_EYE_OF_ENDER); + Item::speckledMelon = (new Item(126) ) ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit, eMaterial_melon)->setIconName(L"speckledMelon")->setDescriptionId(IDS_ITEM_SPECKLED_MELON)->setUseDescriptionId(IDS_DESC_SPECKLED_MELON)->setPotionBrewingFormula(PotionBrewing::MOD_SPECKLEDMELON); - Item::monsterPlacer = (new MonsterPlacerItem(127)) ->setTextureName(L"monsterPlacer")->setDescriptionId(IDS_ITEM_MONSTER_SPAWNER)->setUseDescriptionId(IDS_DESC_MONSTER_SPAWNER); + Item::spawnEgg = (new SpawnEggItem(127)) ->setIconName(L"monsterPlacer")->setDescriptionId(IDS_ITEM_MONSTER_SPAWNER)->setUseDescriptionId(IDS_DESC_MONSTER_SPAWNER); // 4J Stu - Brought this forward - Item::expBottle = (new ExperienceItem(128)) ->setTextureName(L"expBottle")->setDescriptionId(IDS_ITEM_EXP_BOTTLE)->setUseDescriptionId(IDS_DESC_EXP_BOTTLE); + Item::expBottle = (new ExperienceItem(128)) ->setIconName(L"expBottle")->setDescriptionId(IDS_ITEM_EXP_BOTTLE)->setUseDescriptionId(IDS_DESC_EXP_BOTTLE); - Item::record_01 = ( new RecordingItem(2000, L"13") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_01)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_02 = ( new RecordingItem(2001, L"cat") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_02)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_01 = ( new RecordingItem(2000, L"13") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_01)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_02 = ( new RecordingItem(2001, L"cat") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_02)->setUseDescriptionId(IDS_DESC_RECORD); // 4J - new records brought forward from 1.2.3 - Item::record_03 = ( new RecordingItem(2002, L"blocks") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_03)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_04 = ( new RecordingItem(2003, L"chirp") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_04)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_05 = ( new RecordingItem(2004, L"far") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_05)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_06 = ( new RecordingItem(2005, L"mall") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_06)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_07 = ( new RecordingItem(2006, L"mellohi") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_07)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_09 = ( new RecordingItem(2007, L"stal") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_08)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_10 = ( new RecordingItem(2008, L"strad") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_09)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_11 = ( new RecordingItem(2009, L"ward") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_10)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_12 = ( new RecordingItem(2010, L"11") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_11)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_08 = ( new RecordingItem(2011, L"where are we now") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_12)->setUseDescriptionId(IDS_DESC_RECORD); - + Item::record_03 = ( new RecordingItem(2002, L"blocks") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_03)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_04 = ( new RecordingItem(2003, L"chirp") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_04)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_05 = ( new RecordingItem(2004, L"far") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_05)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_06 = ( new RecordingItem(2005, L"mall") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_06)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_07 = ( new RecordingItem(2006, L"mellohi") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_07)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_09 = ( new RecordingItem(2007, L"stal") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_08)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_10 = ( new RecordingItem(2008, L"strad") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_09)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_11 = ( new RecordingItem(2009, L"ward") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_10)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_12 = ( new RecordingItem(2010, L"11") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_11)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_08 = ( new RecordingItem(2011, L"where are we now") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_12)->setUseDescriptionId(IDS_DESC_RECORD); // TU9 // putting the fire charge in as a torch, so that it stacks without being near the middle of the selection boxes - Item::fireball = (new FireChargeItem(129)) ->setBaseItemTypeAndMaterial(eBaseItemType_torch, eMaterial_setfire)->setTextureName(L"fireball")->setDescriptionId(IDS_ITEM_FIREBALL)->setUseDescriptionId(IDS_DESC_FIREBALL); - Item::frame = (new HangingEntityItem(133,eTYPE_ITEM_FRAME)) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_glass)->setTextureName(L"frame")->setDescriptionId(IDS_ITEM_ITEMFRAME)->setUseDescriptionId(IDS_DESC_ITEMFRAME); - Item::netherbrick = (new Item(149)) ->setTextureName(L"netherbrick")->setDescriptionId(IDS_ITEM_NETHERBRICK)->setUseDescriptionId(IDS_DESC_ITEM_NETHERBRICK); + Item::fireball = (new FireChargeItem(129)) ->setBaseItemTypeAndMaterial(eBaseItemType_torch, eMaterial_setfire)->setIconName(L"fireball")->setDescriptionId(IDS_ITEM_FIREBALL)->setUseDescriptionId(IDS_DESC_FIREBALL); + Item::frame = (new HangingEntityItem(133,eTYPE_ITEM_FRAME)) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_glass)->setIconName(L"frame")->setDescriptionId(IDS_ITEM_ITEMFRAME)->setUseDescriptionId(IDS_DESC_ITEMFRAME); + // TU12 - Item::skull = (new SkullItem(141)) ->setTextureName(L"skull")->setDescriptionId(IDS_ITEM_SKULL)->setUseDescriptionId(IDS_DESC_SKULL); + Item::skull = (new SkullItem(141)) ->setIconName(L"skull")->setDescriptionId(IDS_ITEM_SKULL)->setUseDescriptionId(IDS_DESC_SKULL); // TU14 //Item::writingBook = (new WritingBookItem(130))->setIcon(11, 11)->setDescriptionId("writingBook"); //Item::writtenBook = (new WrittenBookItem(131))->setIcon(12, 11)->setDescriptionId("writtenBook"); - Item::emerald = (new Item(132)) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_emerald)->setTextureName(L"emerald")->setDescriptionId(IDS_ITEM_EMERALD)->setUseDescriptionId(IDS_DESC_EMERALD); + Item::emerald = (new Item(132)) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_emerald)->setIconName(L"emerald")->setDescriptionId(IDS_ITEM_EMERALD)->setUseDescriptionId(IDS_DESC_EMERALD); - Item::flowerPot = (new TilePlanterItem(134, Tile::flowerPot)) ->setTextureName(L"flowerPot")->setDescriptionId(IDS_FLOWERPOT)->setUseDescriptionId(IDS_DESC_FLOWERPOT); + Item::flowerPot = (new TilePlanterItem(134, Tile::flowerPot)) ->setIconName(L"flowerPot")->setDescriptionId(IDS_FLOWERPOT)->setUseDescriptionId(IDS_DESC_FLOWERPOT); - Item::carrots = (new SeedFoodItem(135, 4, FoodConstants::FOOD_SATURATION_NORMAL, Tile::carrots_Id, Tile::farmland_Id)) ->setTextureName(L"carrots")->setDescriptionId(IDS_CARROTS)->setUseDescriptionId(IDS_DESC_CARROTS); - Item::potato = (new SeedFoodItem(136, 1, FoodConstants::FOOD_SATURATION_LOW, Tile::potatoes_Id, Tile::farmland_Id)) ->setTextureName(L"potato")->setDescriptionId(IDS_POTATO)->setUseDescriptionId(IDS_DESC_POTATO); - Item::potatoBaked = (new FoodItem(137, 6, FoodConstants::FOOD_SATURATION_NORMAL, false)) ->setTextureName(L"potatoBaked")->setDescriptionId(IDS_ITEM_POTATO_BAKED)->setUseDescriptionId(IDS_DESC_POTATO_BAKED); - Item::potatoPoisonous = (new FoodItem(138, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setEatEffect(MobEffect::poison->id, 5, 0, .6f)->setTextureName(L"potatoPoisonous")->setDescriptionId(IDS_ITEM_POTATO_POISONOUS)->setUseDescriptionId(IDS_DESC_POTATO_POISONOUS); + Item::carrots = (new SeedFoodItem(135, 4, FoodConstants::FOOD_SATURATION_NORMAL, Tile::carrots_Id, Tile::farmland_Id)) ->setIconName(L"carrots")->setDescriptionId(IDS_CARROTS)->setUseDescriptionId(IDS_DESC_CARROTS); + Item::potato = (new SeedFoodItem(136, 1, FoodConstants::FOOD_SATURATION_LOW, Tile::potatoes_Id, Tile::farmland_Id)) ->setIconName(L"potato")->setDescriptionId(IDS_POTATO)->setUseDescriptionId(IDS_DESC_POTATO); + Item::potatoBaked = (new FoodItem(137, 6, FoodConstants::FOOD_SATURATION_NORMAL, false)) ->setIconName(L"potatoBaked")->setDescriptionId(IDS_ITEM_POTATO_BAKED)->setUseDescriptionId(IDS_DESC_POTATO_BAKED); + Item::potatoPoisonous = (new FoodItem(138, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setEatEffect(MobEffect::poison->id, 5, 0, .6f)->setIconName(L"potatoPoisonous")->setDescriptionId(IDS_ITEM_POTATO_POISONOUS)->setUseDescriptionId(IDS_DESC_POTATO_POISONOUS); - Item::carrotGolden = (new FoodItem(140, 6, FoodConstants::FOOD_SATURATION_SUPERNATURAL, false)) ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit, eMaterial_carrot)->setTextureName(L"carrotGolden")->setPotionBrewingFormula(PotionBrewing::MOD_GOLDENCARROT)->setDescriptionId(IDS_ITEM_CARROT_GOLDEN)->setUseDescriptionId(IDS_DESC_CARROT_GOLDEN); + Item::emptyMap = (EmptyMapItem *) (new EmptyMapItem(139))->setIconName(L"map_empty")->setDescriptionId(IDS_ITEM_MAP_EMPTY)->setUseDescriptionId(IDS_DESC_MAP_EMPTY); - Item::carrotOnAStick = (new CarrotOnAStickItem(142)) ->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_carrot)->setTextureName(L"carrotOnAStick")->setDescriptionId(IDS_ITEM_CARROT_ON_A_STICK)->setUseDescriptionId(IDS_DESC_CARROT_ON_A_STICK); - Item::pumpkinPie = (new FoodItem(144, 8, FoodConstants::FOOD_SATURATION_LOW, false)) ->setTextureName(L"pumpkinPie")->setDescriptionId(IDS_ITEM_PUMPKIN_PIE)->setUseDescriptionId(IDS_DESC_PUMPKIN_PIE); + Item::carrotGolden = (new FoodItem(140, 6, FoodConstants::FOOD_SATURATION_SUPERNATURAL, false)) ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit, eMaterial_carrot)->setIconName(L"carrotGolden")->setPotionBrewingFormula(PotionBrewing::MOD_GOLDENCARROT)->setDescriptionId(IDS_ITEM_CARROT_GOLDEN)->setUseDescriptionId(IDS_DESC_CARROT_GOLDEN); - EnchantedBookItem::enchantedBook = (EnchantedBookItem *)(new EnchantedBookItem(147)) ->setMaxStackSize(1)->setTextureName(L"enchantedBook")->setDescriptionId(IDS_ITEM_ENCHANTED_BOOK)->setUseDescriptionId(IDS_DESC_ENCHANTED_BOOK); - Item::netherQuartz = (new Item(150))->setTextureName(L"netherquartz")->setDescriptionId(IDS_ITEM_NETHER_QUARTZ)->setUseDescriptionId(IDS_DESC_NETHER_QUARTZ); -} + Item::carrotOnAStick = (new CarrotOnAStickItem(142)) ->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_carrot)->setIconName(L"carrotOnAStick")->setDescriptionId(IDS_ITEM_CARROT_ON_A_STICK)->setUseDescriptionId(IDS_DESC_CARROT_ON_A_STICK); + Item::netherStar = (new SimpleFoiledItem(143)) ->setIconName(L"nether_star")->setDescriptionId(IDS_NETHER_STAR)->setUseDescriptionId(IDS_DESC_NETHER_STAR); + Item::pumpkinPie = (new FoodItem(144, 8, FoodConstants::FOOD_SATURATION_LOW, false)) ->setIconName(L"pumpkinPie")->setDescriptionId(IDS_ITEM_PUMPKIN_PIE)->setUseDescriptionId(IDS_DESC_PUMPKIN_PIE); + Item::fireworks = (new FireworksItem(145)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fireworks, Item::eMaterial_undefined)->setIconName(L"fireworks")->setDescriptionId(IDS_FIREWORKS)->setUseDescriptionId(IDS_DESC_FIREWORKS); + Item::fireworksCharge = (new FireworksChargeItem(146)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fireworks, Item::eMaterial_undefined)->setIconName(L"fireworks_charge")->setDescriptionId(IDS_FIREWORKS_CHARGE)->setUseDescriptionId(IDS_DESC_FIREWORKS_CHARGE); + EnchantedBookItem::enchantedBook = (EnchantedBookItem *)(new EnchantedBookItem(147)) ->setMaxStackSize(1)->setIconName(L"enchantedBook")->setDescriptionId(IDS_ITEM_ENCHANTED_BOOK)->setUseDescriptionId(IDS_DESC_ENCHANTED_BOOK); + Item::comparator = (new TilePlanterItem(148, Tile::comparator_off)) ->setIconName(L"comparator")->setDescriptionId(IDS_ITEM_COMPARATOR)->setUseDescriptionId(IDS_DESC_COMPARATOR); + Item::netherbrick = (new Item(149)) ->setIconName(L"netherbrick")->setDescriptionId(IDS_ITEM_NETHERBRICK)->setUseDescriptionId(IDS_DESC_ITEM_NETHERBRICK); + Item::netherQuartz = (new Item(150)) ->setIconName(L"netherquartz")->setDescriptionId(IDS_ITEM_NETHER_QUARTZ)->setUseDescriptionId(IDS_DESC_NETHER_QUARTZ); + Item::minecart_tnt = (new MinecartItem(151, Minecart::TYPE_TNT)) ->setIconName(L"minecart_tnt")->setDescriptionId(IDS_ITEM_MINECART_TNT)->setUseDescriptionId(IDS_DESC_MINECART_TNT); + Item::minecart_hopper = (new MinecartItem(152, Minecart::TYPE_HOPPER)) ->setIconName(L"minecart_hopper")->setDescriptionId(IDS_ITEM_MINECART_HOPPER)->setUseDescriptionId(IDS_DESC_MINECART_HOPPER); + + Item::horseArmorMetal = (new Item(161)) ->setIconName(L"iron_horse_armor")->setMaxStackSize(1)->setDescriptionId(IDS_ITEM_IRON_HORSE_ARMOR)->setUseDescriptionId(IDS_DESC_IRON_HORSE_ARMOR); + Item::horseArmorGold = (new Item(162)) ->setIconName(L"gold_horse_armor")->setMaxStackSize(1)->setDescriptionId(IDS_ITEM_GOLD_HORSE_ARMOR)->setUseDescriptionId(IDS_DESC_GOLD_HORSE_ARMOR); + Item::horseArmorDiamond = (new Item(163)) ->setIconName(L"diamond_horse_armor")->setMaxStackSize(1)->setDescriptionId(IDS_ITEM_DIAMOND_HORSE_ARMOR)->setUseDescriptionId(IDS_DESC_DIAMOND_HORSE_ARMOR); + Item::lead = (new LeashItem(164)) ->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_undefined)->setIconName(L"lead")->setDescriptionId(IDS_ITEM_LEAD)->setUseDescriptionId(IDS_DESC_LEAD); + Item::nameTag = (new NameTagItem(165)) ->setIconName(L"name_tag")->setDescriptionId(IDS_ITEM_NAME_TAG)->setUseDescriptionId(IDS_DESC_NAME_TAG);} // 4J Stu - We need to do this after the staticCtor AND after staticCtors for other class @@ -476,7 +504,7 @@ void Item::staticInit() } -_Tier::Tier(int level, int uses, float speed, int damage, int enchantmentValue) : +_Tier::Tier(int level, int uses, float speed, float damage, int enchantmentValue) : level( level ), uses( uses ), speed( speed ), @@ -496,7 +524,7 @@ float _Tier::getSpeed() const return speed; } -int _Tier::getAttackDamageBonus() const +float _Tier::getAttackDamageBonus() const { return damage; } @@ -519,7 +547,7 @@ int _Tier::getTierItemId() const } else if (this == Tier::STONE) { - return Tile::stoneBrick_Id; + return Tile::cobblestone_Id; } else if (this == Tier::GOLD) { @@ -582,13 +610,18 @@ int Item::getMaterial() return this->m_iMaterial; } -Item *Item::setTextureName(const wstring &name) +Item *Item::setIconName(const wstring &name) { m_textureName = name; return this; } +wstring Item::getIconName() +{ + return m_textureName; +} + Item *Item::setMaxStackSize(int max) { maxStackSize = max; @@ -610,11 +643,6 @@ Icon *Item::getIcon(shared_ptr itemInstance) return getIcon(itemInstance->getAuxValue()); } -const bool Item::useOn(shared_ptr itemInstance, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly) -{ - return false; -} - bool Item::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { return false; @@ -625,7 +653,7 @@ float Item::getDestroySpeed(shared_ptr itemInstance, Tile *tile) return 1; } -bool Item::TestUse(Level *level, shared_ptr player) +bool Item::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { return false; } @@ -689,7 +717,7 @@ bool Item::canBeDepleted() * @param attacker * @return */ -bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) +bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { return false; } @@ -705,7 +733,7 @@ bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, * @param owner * @return */ -bool Item::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) +bool Item::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { return false; } @@ -720,14 +748,14 @@ bool Item::canDestroySpecial(Tile *tile) return false; } -bool Item::interactEnemy(shared_ptr itemInstance, shared_ptr mob) +bool Item::interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob) { return false; } Item *Item::handEquipped() { - this->m_handEquipped = true; + m_handEquipped = true; return this; } @@ -864,7 +892,7 @@ bool Item::hasPotionBrewingFormula() return !potionBrewingFormula.empty(); } -void Item::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void Item::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced) { } @@ -935,6 +963,11 @@ Icon *Item::getLayerIcon(int auxValue, int spriteLayer) return getIcon(auxValue); } +bool Item::mayBePlacedInAdventureMode() +{ + return true; +} + bool Item::isValidRepairItem(shared_ptr source, shared_ptr repairItem) { return false; @@ -945,6 +978,11 @@ void Item::registerIcons(IconRegister *iconRegister) icon = iconRegister->registerIcon(m_textureName); } +attrAttrModMap *Item::getDefaultAttributeModifiers() +{ + return new attrAttrModMap(); +} + /* 4J: These are necesary on the PS3. @@ -984,7 +1022,7 @@ const int Item::pickAxe_gold_Id ; const int Item::hatchet_gold_Id ; const int Item::string_Id ; const int Item::feather_Id ; -const int Item::sulphur_Id ; +const int Item::gunpowder_Id ; const int Item::hoe_wood_Id ; const int Item::hoe_stone_Id ; const int Item::hoe_iron_Id ; @@ -993,10 +1031,10 @@ const int Item::hoe_gold_Id ; const int Item::seeds_wheat_Id ; const int Item::wheat_Id ; const int Item::bread_Id ; -const int Item::helmet_cloth_Id ; -const int Item::chestplate_cloth_Id ; -const int Item::leggings_cloth_Id ; -const int Item::boots_cloth_Id ; +const int Item::helmet_leather_Id ; +const int Item::chestplate_leather_Id ; +const int Item::leggings_leather_Id ; +const int Item::boots_leather_Id ; const int Item::helmet_chain_Id ; const int Item::chestplate_chain_Id ; const int Item::leggings_chain_Id ; @@ -1030,7 +1068,7 @@ const int Item::redStone_Id ; const int Item::snowBall_Id ; const int Item::boat_Id ; const int Item::leather_Id ; -const int Item::milk_Id ; +const int Item::bucket_milk_Id ; const int Item::brick_Id ; const int Item::clay_Id ; const int Item::reeds_Id ; @@ -1051,7 +1089,7 @@ const int Item::bone_Id ; const int Item::sugar_Id ; const int Item::cake_Id ; const int Item::bed_Id ; -const int Item::diode_Id ; +const int Item::repeater_Id ; const int Item::cookie_Id ; const int Item::map_Id ; const int Item::shears_Id ; @@ -1067,7 +1105,7 @@ const int Item::enderPearl_Id ; const int Item::blazeRod_Id ; const int Item::ghastTear_Id ; const int Item::goldNugget_Id ; -const int Item::netherStalkSeeds_Id ; +const int Item::netherwart_seeds_Id; const int Item::potion_Id ; const int Item::glassBottle_Id ; const int Item::spiderEye_Id ; @@ -1078,7 +1116,7 @@ const int Item::brewingStand_Id ; const int Item::cauldron_Id ; const int Item::eyeOfEnder_Id ; const int Item::speckledMelon_Id ; -const int Item::monsterPlacer_Id ; +const int Item::spawnEgg_Id; const int Item::expBottle_Id ; const int Item::skull_Id ; const int Item::record_01_Id ; diff --git a/Minecraft.World/Item.h b/Minecraft.World/Item.h index 727fc661..0f9a8b1b 100644 --- a/Minecraft.World/Item.h +++ b/Minecraft.World/Item.h @@ -20,12 +20,16 @@ class ArmorItem; class BowItem; class FishingRodItem; class EnchantedBookItem; +class EmptyMapItem; #define ITEM_ICON_COLUMNS 16 class Item : public enable_shared_from_this { +protected: + //static const UUID BASE_ATTACK_DAMAGE_UUID; + public: static const int ITEM_NUM_COUNT = 32000; @@ -79,7 +83,14 @@ public: eMaterial_emerald, eMaterial_quartz, eMaterial_apple, - eMaterial_carrot + eMaterial_carrot, + eMaterial_redstone, + eMaterial_coal, + eMaterial_paper, + eMaterial_book, + eMaterial_bookshelf, + eMaterial_wheat, + } eMaterial; @@ -123,6 +134,12 @@ public: eBaseItemType_rod, eBaseItemType_giltFruit, eBaseItemType_carpet, + eBaseItemType_clay, + eBaseItemType_glass, + eBaseItemType_redstoneContainer, + eBaseItemType_fireworks, + eBaseItemType_lever, + eBaseItemType_paper, eBaseItemType_MAXTYPES, } eBaseItemType; @@ -146,25 +163,20 @@ public: const int level; const int uses; const float speed; - const int damage; + const float damage; const int enchantmentValue; // 4J Stu - Had to make this public but was protected // We shouldn't be creating these except the static initialisation public: - Tier(int level, int uses, float speed, int damage, int enchantmentValue); + Tier(int level, int uses, float speed, float damage, int enchantmentValue); public: int getUses() const; - float getSpeed() const; - - int getAttackDamageBonus() const; - + float getAttackDamageBonus() const; int getLevel() const; - int getEnchantmentValue() const; - int getTierItemId() const; }; @@ -216,7 +228,7 @@ public: static Item *string; static Item *feather; - static Item *sulphur; + static Item *gunpowder; static Item *hoe_wood; static Item *hoe_stone; @@ -228,10 +240,10 @@ public: static Item *wheat; static Item *bread; - static ArmorItem *helmet_cloth; - static ArmorItem *chestplate_cloth; - static ArmorItem *leggings_cloth; - static ArmorItem *boots_cloth; + static ArmorItem *helmet_leather; + static ArmorItem *chestplate_leather; + static ArmorItem *leggings_leather; + static ArmorItem *boots_leather; static ArmorItem *helmet_chain; static ArmorItem *chestplate_chain; @@ -276,7 +288,7 @@ public: static Item *boat; static Item *leather; - static Item *milk; + static Item *bucket_milk; static Item *brick; static Item *clay; static Item *reeds; @@ -300,7 +312,7 @@ public: static Item *bed; - static Item *diode; + static Item *repeater; static Item *cookie; static MapItem *map; @@ -324,7 +336,7 @@ public: static Item *ghastTear; static Item *goldNugget; - static Item *netherStalkSeeds; + static Item *netherwart_seeds; static PotionItem *potion; static Item *glassBottle; @@ -340,7 +352,7 @@ public: static Item *eyeOfEnder; static Item *speckledMelon; - static Item *monsterPlacer; + static Item *spawnEgg; static Item *expBottle; @@ -362,7 +374,6 @@ public: // TU9 static Item *fireball; static Item *frame; - static Item *netherbrick; // TU14 //static Item writingBook; @@ -377,13 +388,29 @@ public: static Item *potatoBaked; static Item *potatoPoisonous; + static EmptyMapItem *emptyMap; + static Item *carrotGolden; static Item *carrotOnAStick; + static Item *netherStar; static Item *pumpkinPie; + + static Item *fireworks; + static Item *fireworksCharge; static Item *netherQuartz; + static Item *comparator; + static Item *netherbrick; static EnchantedBookItem *enchantedBook; + static Item *minecart_tnt; + static Item *minecart_hopper; + + static Item *horseArmorMetal; + static Item *horseArmorGold; + static Item *horseArmorDiamond; + static Item *lead; + static Item *nameTag; static const int shovel_iron_Id = 256; @@ -419,7 +446,7 @@ public: static const int hatchet_gold_Id = 286; static const int string_Id = 287; static const int feather_Id = 288; - static const int sulphur_Id = 289; + static const int gunpowder_Id = 289; static const int hoe_wood_Id = 290; static const int hoe_stone_Id = 291; static const int hoe_iron_Id = 292; @@ -429,10 +456,10 @@ public: static const int wheat_Id = 296; static const int bread_Id = 297; - static const int helmet_cloth_Id = 298; - static const int chestplate_cloth_Id = 299; - static const int leggings_cloth_Id = 300; - static const int boots_cloth_Id = 301; + static const int helmet_leather_Id = 298; + static const int chestplate_leather_Id = 299; + static const int leggings_leather_Id = 300; + static const int boots_leather_Id = 301; static const int helmet_chain_Id = 302; static const int chestplate_chain_Id = 303; @@ -471,7 +498,7 @@ public: static const int snowBall_Id = 332; static const int boat_Id = 333; static const int leather_Id = 334; - static const int milk_Id = 335; + static const int bucket_milk_Id = 335; static const int brick_Id = 336; static const int clay_Id = 337; static const int reeds_Id = 338; @@ -492,7 +519,7 @@ public: static const int sugar_Id = 353; static const int cake_Id = 354; static const int bed_Id = 355; - static const int diode_Id = 356; + static const int repeater_Id = 356; static const int cookie_Id = 357; static const int map_Id = 358; @@ -514,7 +541,7 @@ public: static const int blazeRod_Id = 369; static const int ghastTear_Id = 370; static const int goldNugget_Id = 371; - static const int netherStalkSeeds_Id = 372; + static const int netherwart_seeds_Id = 372; static const int potion_Id = 373; static const int glassBottle_Id = 374; static const int spiderEye_Id = 375; @@ -527,7 +554,7 @@ public: static const int speckledMelon_Id = 382; // 1.1 - static const int monsterPlacer_Id = 383; + static const int spawnEgg_Id = 383; static const int expBottle_Id = 384; @@ -552,7 +579,6 @@ public: // TU9 static const int fireball_Id = 385; static const int itemFrame_Id = 389; - static const int netherbrick_Id = 405; // TU14 //static const int writingBook_Id = 130; @@ -567,14 +593,30 @@ public: static const int potatoBaked_Id = 393; static const int potatoPoisonous_Id = 394; + static const int emptyMap_Id = 395; static const int carrotGolden_Id = 396; static const int carrotOnAStick_Id = 398; + static const int netherStar_Id = 399; static const int pumpkinPie_Id = 400; + static const int fireworks_Id = 401; + static const int fireworksCharge_Id = 402; + static const int enchantedBook_Id = 403; + + static const int comparator_Id = 404; + static const int netherbrick_Id = 405; static const int netherQuartz_Id = 406; + static const int minecart_tnt_Id = 407; + static const int minecart_hopper_Id = 408; + + static const int horseArmorMetal_Id = 417; + static const int horseArmorGold_Id = 418; + static const int horseArmorDiamond_Id = 419; + static const int lead_Id = 420; + static const int nameTag_Id = 421; public: const int id; @@ -610,7 +652,8 @@ protected: public: // 4J Using per-item textures now - Item *setTextureName(const wstring &name); + Item *setIconName(const wstring &name); + wstring getIconName(); Item *setMaxStackSize(int max); Item *setBaseItemTypeAndMaterial(int iType,int iMaterial); int getBaseItemType(); @@ -620,11 +663,9 @@ public: virtual Icon *getIcon(int auxValue); Icon *getIcon(shared_ptr itemInstance); - const bool useOn(shared_ptr itemInstance, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly=false); - virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); virtual shared_ptr useTimeDepleted(shared_ptr itemInstance, Level *level, shared_ptr player); virtual int getMaxStackSize(); @@ -651,7 +692,7 @@ public: * @param attacker * @return */ - virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); /** * Returns true when the item was used to mine more efficiently @@ -664,10 +705,10 @@ public: * @param owner * @return */ - virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); virtual int getAttackDamage(shared_ptr entity); virtual bool canDestroySpecial(Tile *tile); - virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr mob); + virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob); Item *handEquipped(); virtual bool isHandEquipped(); virtual bool isMirroredArt(); @@ -700,7 +741,7 @@ protected: public: virtual wstring getPotionBrewingFormula(); virtual bool hasPotionBrewingFormula(); - virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); // 4J Added unformattedStrings + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced); virtual wstring getHoverName(shared_ptr itemInstance); virtual bool isFoil(shared_ptr itemInstance); virtual const Rarity *getRarity(shared_ptr itemInstance); @@ -713,6 +754,8 @@ public: virtual int getEnchantmentValue(); virtual bool hasMultipleSpriteLayers(); virtual Icon *getLayerIcon(int auxValue, int spriteLayer); + virtual bool mayBePlacedInAdventureMode(); virtual bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); virtual void registerIcons(IconRegister *iconRegister); + virtual attrAttrModMap *getDefaultAttributeModifiers(); }; diff --git a/Minecraft.World/ItemDispenseBehaviors.cpp b/Minecraft.World/ItemDispenseBehaviors.cpp new file mode 100644 index 00000000..f66afe31 --- /dev/null +++ b/Minecraft.World/ItemDispenseBehaviors.cpp @@ -0,0 +1,457 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.entity.projectile.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.item.h" +#include "ItemDispenseBehaviors.h" + +/* Arrow */ + +shared_ptr ArrowDispenseBehavior::getProjectile(Level *world, Position *position) +{ + shared_ptr arrow = shared_ptr(new Arrow(world, position->getX(), position->getY(), position->getZ())); + arrow->pickup = Arrow::PICKUP_ALLOWED; + + return arrow; +} + +/* ThrownEgg */ + +shared_ptr EggDispenseBehavior::getProjectile(Level *world, Position *position) +{ + return shared_ptr(new ThrownEgg(world, position->getX(), position->getY(), position->getZ())); +} + + +/* Snowball */ + +shared_ptr SnowballDispenseBehavior::getProjectile(Level *world, Position *position) +{ + return shared_ptr(new Snowball(world, position->getX(), position->getY(), position->getZ())); +} + + +/* Exp Bottle */ + +shared_ptr ExpBottleDispenseBehavior::getProjectile(Level *world, Position *position) +{ + return shared_ptr(new ThrownExpBottle(world, position->getX(), position->getY(), position->getZ())); +} + +float ExpBottleDispenseBehavior::getUncertainty() +{ + return AbstractProjectileDispenseBehavior::getUncertainty() * .5f; +} + +float ExpBottleDispenseBehavior::getPower() +{ + return AbstractProjectileDispenseBehavior::getPower() * 1.25f; +} + + +/* Thrown Potion */ + +ThrownPotionDispenseBehavior::ThrownPotionDispenseBehavior(int potionValue) +{ + m_potionValue = potionValue; +} + +shared_ptr ThrownPotionDispenseBehavior::getProjectile(Level *world, Position *position) +{ + return shared_ptr(new ThrownPotion(world, position->getX(), position->getY(), position->getZ(), m_potionValue)); +} + +float ThrownPotionDispenseBehavior::getUncertainty() +{ + return AbstractProjectileDispenseBehavior::getUncertainty() * .5f; +} + +float ThrownPotionDispenseBehavior::getPower() +{ + return AbstractProjectileDispenseBehavior::getPower() * 1.25f; +} + + +/* Potion */ + +shared_ptr PotionDispenseBehavior::dispense(BlockSource *source, shared_ptr dispensed) +{ + if (PotionItem::isThrowable(dispensed->getAuxValue())) + { + return ThrownPotionDispenseBehavior(dispensed->getAuxValue()).dispense(source, dispensed); + } + else + { + return DefaultDispenseItemBehavior::dispense(source, dispensed); + } +} + + +/* SpawnEggItem */ + +shared_ptr SpawnEggDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + // Spawn entity in the middle of the block in front of the dispenser + double spawnX = source->getX() + facing->getStepX(); + double spawnY = source->getBlockY() + .2f; // Above pressure plates + double spawnZ = source->getZ() + facing->getStepZ(); + + int iResult = 0; + shared_ptr entity = SpawnEggItem::spawnMobAt(source->getWorld(), dispensed->getAuxValue(), spawnX, spawnY, spawnZ, &iResult); + + // 4J-JEV: Added in-case spawn limit is encountered. + if (entity == NULL) + { + outcome = LEFT_ITEM; + return dispensed; + } + + if (entity->instanceof(eTYPE_MOB) && dispensed->hasCustomHoverName()) + { + dynamic_pointer_cast(entity)->setCustomName(dispensed->getHoverName()); + } + + outcome = ACTIVATED_ITEM; + + dispensed->remove(1); + return dispensed; +} + + +/* Fireworks*/ + +shared_ptr FireworksDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + Level *world = source->getWorld(); + if ( world->countInstanceOf(eTYPE_PROJECTILE,false) >= Level::MAX_DISPENSABLE_PROJECTILES ) + { + outcome = LEFT_ITEM; + return dispensed; + } + + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + double spawnX = source->getX() + facing->getStepX(); + double spawnY = source->getBlockY() + .2f; + double spawnZ = source->getZ() + facing->getStepZ(); + + shared_ptr firework = shared_ptr(new FireworksRocketEntity(world, spawnX, spawnY, spawnZ, dispensed)); + source->getWorld()->addEntity(firework); + + outcome = ACTIVATED_ITEM; + + dispensed->remove(1); + return dispensed; +} + +void FireworksDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + // 4J-JEV: This is exactly the same as the default at the moment. + //source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + + DefaultDispenseItemBehavior::playSound(source,outcome); +} + + +/* Fireballs */ + +shared_ptr FireballDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + Level *world = source->getWorld(); + if (world->countInstanceOf(eTYPE_SMALL_FIREBALL,true) >= Level::MAX_DISPENSABLE_FIREBALLS) + { + outcome = LEFT_ITEM; + return dispensed; + } + + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + Position *position = DispenserTile::getDispensePosition(source); + double spawnX = position->getX() + facing->getStepX() * .3f; + double spawnY = position->getY() + facing->getStepX() * .3f; + double spawnZ = position->getZ() + facing->getStepZ() * .3f; + + delete position; + + Random *random = world->random; + + double dirX = random->nextGaussian() * .05 + facing->getStepX(); + double dirY = random->nextGaussian() * .05 + facing->getStepY(); + double dirZ = random->nextGaussian() * .05 + facing->getStepZ(); + + world->addEntity(shared_ptr(new SmallFireball(world, spawnX, spawnY, spawnZ, dirX, dirY, dirZ))); + + outcome = ACTIVATED_ITEM; + + dispensed->remove(1); + return dispensed; +} + +void FireballDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + if (outcome == ACTIVATED_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::SOUND_BLAZE_FIREBALL, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } + else + { + DefaultDispenseItemBehavior::playSound(source, outcome); + } +} + + +/* Boats */ + +BoatDispenseBehavior::BoatDispenseBehavior() : DefaultDispenseItemBehavior() +{ + defaultDispenseItemBehavior = new DefaultDispenseItemBehavior(); +} + +BoatDispenseBehavior::~BoatDispenseBehavior() +{ + delete defaultDispenseItemBehavior; +} + +shared_ptr BoatDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + // Spawn the boat 'just' outside the dispenser, it overlaps 2 'pixels' now. + double spawnX = source->getX() + facing->getStepX() * (1 + 2.0f / 16); + double spawnY = source->getY() + facing->getStepY() * (1 + 2.0f / 16); + double spawnZ = source->getZ() + facing->getStepZ() * (1 + 2.0f / 16); + + int frontX = source->getBlockX() + facing->getStepX(); + int frontY = source->getBlockY() + facing->getStepY(); + int frontZ = source->getBlockZ() + facing->getStepZ(); + Material *inFront = world->getMaterial(frontX, frontY, frontZ); + + double yOffset; + + // 4J: If we're at limit, just dispense item (instead of adding boat) + if (world->countInstanceOf(eTYPE_BOAT, true) >= Level::MAX_XBOX_BOATS) + { + return defaultDispenseItemBehavior->dispense(source, dispensed); + } + + if (Material::water == inFront) + { + yOffset = 1; + } + else if (Material::air == inFront && Material::water == world->getMaterial(frontX, frontY - 1, frontZ)) + { + yOffset = 0; + } + else + { + return defaultDispenseItemBehavior->dispense(source, dispensed); + } + + outcome = ACTIVATED_ITEM; + + shared_ptr boat = shared_ptr(new Boat(world, spawnX, spawnY + yOffset, spawnZ)); + world->addEntity(boat); + + dispensed->remove(1); + return dispensed; +} + +void BoatDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + // 4J-JEV: This is exactly the same as the default at the moment. + //source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + DefaultDispenseItemBehavior::playSound(source,outcome); +} + + +/* FilledBucket */ + +shared_ptr FilledBucketDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + BucketItem *bucket = (BucketItem *)dispensed->getItem(); + int sourceX = source->getBlockX(); + int sourceY = source->getBlockY(); + int sourceZ = source->getBlockZ(); + + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + if (bucket->emptyBucket(source->getWorld(), sourceX + facing->getStepX(), sourceY + facing->getStepY(), sourceZ + facing->getStepZ())) + { + dispensed->id = Item::bucket_empty->id; + dispensed->count = 1; + + outcome = ACTIVATED_ITEM; + return dispensed; + } + + return DefaultDispenseItemBehavior::dispense(source, dispensed); +} + + +/* EmptyBucket */ + +shared_ptr EmptyBucketDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + int targetX = source->getBlockX() + facing->getStepX(); + int targetY = source->getBlockY() + facing->getStepY(); + int targetZ = source->getBlockZ() + facing->getStepZ(); + + Material *material = world->getMaterial(targetX, targetY, targetZ); + int dataValue = world->getData(targetX, targetY, targetZ); + + Item *targetType; + if (Material::water == material && dataValue == 0) + { + targetType = Item::bucket_water; + } + else if (Material::lava == material && dataValue == 0) + { + targetType = Item::bucket_lava; + } + else + { + return DefaultDispenseItemBehavior::execute(source, dispensed, outcome); + } + + world->removeTile(targetX, targetY, targetZ); + if (--dispensed->count == 0) + { + dispensed->id = targetType->id; + dispensed->count = 1; + } + else if (dynamic_pointer_cast(source->getEntity())->addItem(shared_ptr(new ItemInstance(targetType))) < 0) + { + DefaultDispenseItemBehavior::dispense(source, shared_ptr(new ItemInstance(targetType))); + } + + outcome = ACTIVATED_ITEM; + return dispensed; +} + + +/* Flint and Steel */ + +shared_ptr FlintAndSteelDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + outcome = ACTIVATED_ITEM; + + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + int targetX = source->getBlockX() + facing->getStepX(); + int targetY = source->getBlockY() + facing->getStepY(); + int targetZ = source->getBlockZ() + facing->getStepZ(); + + if (world->isEmptyTile(targetX, targetY, targetZ)) + { + world->setTileAndUpdate(targetX, targetY, targetZ, Tile::fire_Id); + + if (dispensed->hurt(1, world->random)) + { + dispensed->count = 0; + } + } + else if (world->getTile(targetX, targetY, targetZ) == Tile::tnt_Id) + { + Tile::tnt->destroy(world, targetX, targetY, targetZ, 1); + world->removeTile(targetX, targetY, targetZ); + } + else + { + outcome = LEFT_ITEM; + } + + return dispensed; +} + +void FlintAndSteelDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + if (outcome == ACTIVATED_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } + else + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK_FAIL, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } +} + + +/* Dye */ + +shared_ptr DyeDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + if (dispensed->getAuxValue() == DyePowderItem::WHITE) + { + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + int targetX = source->getBlockX() + facing->getStepX(); + int targetY = source->getBlockY() + facing->getStepY(); + int targetZ = source->getBlockZ() + facing->getStepZ(); + + if (DyePowderItem::growCrop(dispensed, world, targetX, targetY, targetZ, false)) + { + if (!world->isClientSide) world->levelEvent(LevelEvent::PARTICLES_PLANT_GROWTH, targetX, targetY, targetZ, 0); + outcome = ACTIVATED_ITEM; + } + else + { + outcome = LEFT_ITEM; + } + + + return dispensed; + } + else + { + return DefaultDispenseItemBehavior::execute(source, dispensed, outcome); + } +} + +void DyeDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + if (outcome == ACTIVATED_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } + else + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK_FAIL, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } +} + + +/* TNT */ + +shared_ptr TntDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + if( world->newPrimedTntAllowed() && app.GetGameHostOption(eGameHostOption_TNT) ) + { + int targetX = source->getBlockX() + facing->getStepX(); + int targetY = source->getBlockY() + facing->getStepY(); + int targetZ = source->getBlockZ() + facing->getStepZ(); + + shared_ptr tnt = shared_ptr(new PrimedTnt(world, targetX + 0.5f, targetY + 0.5f, targetZ + 0.5f, nullptr)); + world->addEntity(tnt); + + outcome = ACTIVATED_ITEM; + + dispensed->count--; + } + else + { + outcome = LEFT_ITEM; + } + return dispensed; +} \ No newline at end of file diff --git a/Minecraft.World/ItemDispenseBehaviors.h b/Minecraft.World/ItemDispenseBehaviors.h new file mode 100644 index 00000000..4635c8a4 --- /dev/null +++ b/Minecraft.World/ItemDispenseBehaviors.h @@ -0,0 +1,117 @@ +#pragma once +#include "DefaultDispenseItemBehavior.h" +#include "AbstractProjectileDispenseBehavior.h" + +class ArrowDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); +}; + +class EggDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); +}; + +class SnowballDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); +}; + +class ExpBottleDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); + virtual float getUncertainty(); + virtual float getPower(); +}; + +class ThrownPotionDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +private: + int m_potionValue; +public: + ThrownPotionDispenseBehavior(int potionValue); +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); + virtual float getUncertainty(); + virtual float getPower(); +}; + +class PotionDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr dispense(BlockSource *source, shared_ptr dispensed); +}; + +class SpawnEggDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +}; + +class FireworksDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +}; + +class FireballDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +}; + +class BoatDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + BoatDispenseBehavior(); + virtual ~BoatDispenseBehavior(); + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +private: + DefaultDispenseItemBehavior *defaultDispenseItemBehavior; +}; + +class FilledBucketDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +}; + +class EmptyBucketDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +}; + +class FlintAndSteelDispenseBehavior : public DefaultDispenseItemBehavior +{ + // bool success; // 4J-JEV: Removed because we have something cleaner for this now. +public: + shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +}; + +class DyeDispenseBehavior : public DefaultDispenseItemBehavior +{ + // bool success; // 4J-JEV: Removed because we have something cleaner for this now. +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +}; + +class TntDispenseBehavior : public DefaultDispenseItemBehavior +{ +protected: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +}; \ No newline at end of file diff --git a/Minecraft.World/ItemEntity.cpp b/Minecraft.World/ItemEntity.cpp index eb7684a6..e6bdffa5 100644 --- a/Minecraft.World/ItemEntity.cpp +++ b/Minecraft.World/ItemEntity.cpp @@ -94,7 +94,7 @@ void ItemEntity::tick() xd = (random->nextFloat() - random->nextFloat()) * 0.2f; zd = (random->nextFloat() - random->nextFloat()) * 0.2f; MemSect(31); - level->playSound(shared_from_this(), eSoundType_RANDOM_FIZZ, 0.4f, 2.0f + random->nextFloat() * 0.4f); + playSound(eSoundType_RANDOM_FIZZ, 0.4f, 2.0f + random->nextFloat() * 0.4f); MemSect(0); } @@ -184,13 +184,15 @@ void ItemEntity::burn(int dmg) } -bool ItemEntity::hurt(DamageSource *source, int damage) +bool ItemEntity::hurt(DamageSource *source, float damage) { // 4J - added next line: found whilst debugging an issue with item entities getting into a bad state when being created by a cactus, since entities insides cactuses get hurt // and therefore depending on the timing of things they could get removed from the client when they weren't supposed to be. Are there really any cases were we would want // an itemEntity to be locally hurt? - if (level->isClientSide ) return false; + if (level->isClientSide ) return false; + if (isInvulnerable()) return false; + if (getItem() != NULL && getItem()->id == Item::netherStar_Id && source->isExplosion()) return false; markHurt(); health -= damage; if (health <= 0) @@ -254,7 +256,7 @@ void ItemEntity::playerTouch(shared_ptr player) if (item->id == Item::blazeRod_Id) player->awardStat(GenericStats::blazeRod(), GenericStats::param_blazeRod()); - level->playSound(shared_from_this(), eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); + playSound(eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); player->take(shared_from_this(), orgCount); // System.out.println(item.count + ", " + orgCount); if (item->count <= 0) remove(); @@ -267,6 +269,13 @@ wstring ItemEntity::getAName() //return I18n.get("item." + item.getDescriptionId()); } +void ItemEntity::changeDimension(int i) +{ + Entity::changeDimension(i); + + if (!level->isClientSide) mergeWithNeighbours(); +} + shared_ptr ItemEntity::getItem() { shared_ptr result = getEntityData()->getItemInstance(DATA_ITEM); @@ -278,7 +287,7 @@ shared_ptr ItemEntity::getItem() app.DebugPrintf("Item entity %d has no item?!\n", entityId); //level.getLogger().severe("Item entity " + entityId + " has no item?!"); } - return shared_ptr(new ItemInstance(Tile::rock)); + return shared_ptr(new ItemInstance(Tile::stone)); } return result; diff --git a/Minecraft.World/ItemEntity.h b/Minecraft.World/ItemEntity.h index 1f42bc21..3b442b90 100644 --- a/Minecraft.World/ItemEntity.h +++ b/Minecraft.World/ItemEntity.h @@ -58,13 +58,13 @@ protected: virtual void burn(int dmg); public: - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); virtual void addAdditonalSaveData(CompoundTag *entityTag); virtual void readAdditionalSaveData(CompoundTag *tag); virtual void playerTouch(shared_ptr player); virtual wstring getAName(); - + virtual void changeDimension(int i); shared_ptr getItem(); void setItem(shared_ptr item); virtual bool isAttackable(); diff --git a/Minecraft.World/ItemFrame.cpp b/Minecraft.World/ItemFrame.cpp index 141f0630..0d52b421 100644 --- a/Minecraft.World/ItemFrame.cpp +++ b/Minecraft.World/ItemFrame.cpp @@ -20,6 +20,8 @@ void ItemFrame::_init() // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + + dropChance = 1; } ItemFrame::ItemFrame(Level *level) : HangingEntity( level ) @@ -39,19 +41,45 @@ void ItemFrame::defineSynchedData() getEntityData()->define(DATA_ROTATION, (byte) 0); } -void ItemFrame::dropItem() +bool ItemFrame::shouldRenderAtSqrDistance(double distance) +{ + double size = 16; + size *= 64.0f * viewScale; + return distance < size * size; +} + +void ItemFrame::dropItem(shared_ptr causedBy) { - spawnAtLocation(shared_ptr(new ItemInstance(Item::frame)), 0.0f); shared_ptr item = getItem(); - if (item != NULL) + + if (causedBy != NULL && causedBy->instanceof(eTYPE_PLAYER)) { - shared_ptr data = Item::map->getSavedData(item, level); - data->removeItemFrameDecoration(item); + if (dynamic_pointer_cast(causedBy)->abilities.instabuild) + { + removeFramedMap(item); + return; + } + } - shared_ptr itemToDrop = item->copy(); - itemToDrop->setFramed(nullptr); - spawnAtLocation(itemToDrop, 0.0f); + spawnAtLocation( shared_ptr(new ItemInstance(Item::frame) ), 0); + if ( (item != NULL) && (random->nextFloat() < dropChance) ) + { + item = item->copy(); + removeFramedMap(item); + spawnAtLocation(item, 0); + } +} + +void ItemFrame::removeFramedMap(shared_ptr item) +{ + if (item == NULL) return; + if (item->id == Item::map_Id) + { + shared_ptr mapItemSavedData = Item::map->getSavedData(item, level); + mapItemSavedData->removeItemFrameDecoration(item); + //mapItemSavedData.decorations.remove("frame-" + entityId); } + item->setFramed(nullptr); } shared_ptr ItemFrame::getItem() @@ -88,7 +116,7 @@ void ItemFrame::addAdditonalSaveData(CompoundTag *tag) { tag->putCompound(L"Item", getItem()->save(new CompoundTag())); tag->putByte(L"ItemRotation", (byte) getRotation()); - //tag->putFloat(L"ItemDropChance", dropChance); + tag->putFloat(L"ItemDropChance", dropChance); } HangingEntity::addAdditonalSaveData(tag); } @@ -101,7 +129,7 @@ void ItemFrame::readAdditionalSaveData(CompoundTag *tag) setItem(ItemInstance::fromTag(itemTag)); setRotation(tag->getByte(L"ItemRotation")); - //if (tag->contains(L"ItemDropChance")) dropChance = tag->getFloat(L"ItemDropChance"); + if (tag->contains(L"ItemDropChance")) dropChance = tag->getFloat(L"ItemDropChance"); } HangingEntity::readAdditionalSaveData(tag); } @@ -125,10 +153,10 @@ bool ItemFrame::interact(shared_ptr player) if (!player->abilities.instabuild) { - if (--item->count <= 0) - { - player->inventory->setItem(player->inventory->selected, nullptr); - } + if (--item->count <= 0) + { + player->inventory->setItem(player->inventory->selected, nullptr); + } } } } diff --git a/Minecraft.World/ItemFrame.h b/Minecraft.World/ItemFrame.h index 1af5c2e9..06c1f111 100644 --- a/Minecraft.World/ItemFrame.h +++ b/Minecraft.World/ItemFrame.h @@ -14,6 +14,8 @@ private: static const int DATA_ITEM = 2; static const int DATA_ROTATION = 3; + float dropChance; + private: void _init(); @@ -24,12 +26,17 @@ public: protected: virtual void defineSynchedData(); + +public: virtual int getWidth() {return 9;} virtual int getHeight() {return 9;} - virtual void dropItem(); + virtual bool shouldRenderAtSqrDistance(double distance); + virtual void dropItem(shared_ptr causedBy); -public: +private: + void removeFramedMap(shared_ptr item); +public: shared_ptr getItem(); void setItem(shared_ptr item); int getRotation(); diff --git a/Minecraft.World/ItemInstance.cpp b/Minecraft.World/ItemInstance.cpp index ab042af0..c83b67dd 100644 --- a/Minecraft.World/ItemInstance.cpp +++ b/Minecraft.World/ItemInstance.cpp @@ -3,6 +3,8 @@ #include "net.minecraft.locale.h" #include "net.minecraft.stats.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" @@ -10,8 +12,9 @@ #include "net.minecraft.world.item.enchantment.h" #include "Item.h" #include "ItemInstance.h" +#include "HtmlString.h" - +const wstring ItemInstance::ATTRIBUTE_MODIFIER_FORMAT = L"#.###"; const wchar_t *ItemInstance::TAG_ENCH_ID = L"id"; const wchar_t *ItemInstance::TAG_ENCH_LEVEL = L"lvl"; @@ -45,29 +48,33 @@ ItemInstance::ItemInstance(MapItem *item, int count) ItemInstance::ItemInstance(Tile *tile, int count, int auxValue) { - _init(tile->id, count, auxValue); + _init(tile->id, count, auxValue); } ItemInstance::ItemInstance(Item *item) { - _init(item->id, 1, 0); + _init(item->id, 1, 0); } ItemInstance::ItemInstance(Item *item, int count) { - _init(item->id, count, 0); + _init(item->id, count, 0); } ItemInstance::ItemInstance(Item *item, int count, int auxValue) { - _init(item->id, count, auxValue); + _init(item->id, count, auxValue); } ItemInstance::ItemInstance(int id, int count, int damage) { - _init(id,count,damage); + _init(id,count,damage); + if (auxValue < 0) + { + auxValue = 0; + } } shared_ptr ItemInstance::fromTag(CompoundTag *itemTag) @@ -98,12 +105,12 @@ shared_ptr ItemInstance::remove(int count) Item *ItemInstance::getItem() const { - return Item::items[id]; + return Item::items[id]; } Icon *ItemInstance::getIcon() { - return getItem()->getIcon(shared_from_this()); + return getItem()->getIcon(shared_from_this()); } int ItemInstance::getIconType() @@ -118,17 +125,17 @@ bool ItemInstance::useOn(shared_ptr player, Level *level, int x, int y, float ItemInstance::getDestroySpeed(Tile *tile) { - return getItem()->getDestroySpeed(shared_from_this(), tile); + return getItem()->getDestroySpeed(shared_from_this(), tile); } -bool ItemInstance::TestUse(Level *level, shared_ptr player) +bool ItemInstance::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { - return getItem()->TestUse( level, player); + return getItem()->TestUse( itemInstance, level, player); } shared_ptr ItemInstance::use(Level *level, shared_ptr player) { - return getItem()->use(shared_from_this(), level, player); + return getItem()->use(shared_from_this(), level, player); } shared_ptr ItemInstance::useTimeDepleted(Level *level, shared_ptr player) @@ -138,135 +145,159 @@ shared_ptr ItemInstance::useTimeDepleted(Level *level, shared_ptr< CompoundTag *ItemInstance::save(CompoundTag *compoundTag) { - compoundTag->putShort(L"id", (short) id); - compoundTag->putByte(L"Count", (byte) count); - compoundTag->putShort(L"Damage", (short) auxValue); - if (this->tag != NULL) compoundTag->put(L"tag", tag->copy()); - return compoundTag; + compoundTag->putShort(L"id", (short) id); + compoundTag->putByte(L"Count", (byte) count); + compoundTag->putShort(L"Damage", (short) auxValue); + if (tag != NULL) compoundTag->put(L"tag", tag->copy()); + return compoundTag; } void ItemInstance::load(CompoundTag *compoundTag) { popTime = 0; - id = compoundTag->getShort(L"id"); - count = compoundTag->getByte(L"Count"); - auxValue = compoundTag->getShort(L"Damage"); + id = compoundTag->getShort(L"id"); + count = compoundTag->getByte(L"Count"); + auxValue = compoundTag->getShort(L"Damage"); + if (auxValue < 0) + { + auxValue = 0; + } if (compoundTag->contains(L"tag")) { + delete tag; tag = (CompoundTag *)compoundTag->getCompound(L"tag")->copy(); } } int ItemInstance::getMaxStackSize() { - return getItem()->getMaxStackSize(); + return getItem()->getMaxStackSize(); } bool ItemInstance::isStackable() { - return getMaxStackSize() > 1 && (!isDamageableItem() || !isDamaged()); + return getMaxStackSize() > 1 && (!isDamageableItem() || !isDamaged()); } bool ItemInstance::isDamageableItem() { - return Item::items[id]->getMaxDamage() > 0; + return Item::items[id]->getMaxDamage() > 0; } /** - * Returns true if this item type only can be stacked with items that have - * the same auxValue data. - * - * @return - */ +* Returns true if this item type only can be stacked with items that have +* the same auxValue data. +* +* @return +*/ bool ItemInstance::isStackedByData() { - return Item::items[id]->isStackedByData(); + return Item::items[id]->isStackedByData(); } bool ItemInstance::isDamaged() { - return isDamageableItem() && auxValue > 0; + return isDamageableItem() && auxValue > 0; } int ItemInstance::getDamageValue() { - return auxValue; + return auxValue; } int ItemInstance::getAuxValue() const { - return auxValue; + return auxValue; } void ItemInstance::setAuxValue(int value) { - auxValue = value; + auxValue = value; + if (auxValue < 0) + { + auxValue = 0; + } } int ItemInstance::getMaxDamage() { - return Item::items[id]->getMaxDamage(); + return Item::items[id]->getMaxDamage(); } -void ItemInstance::hurt(int i, shared_ptr owner) +bool ItemInstance::hurt(int dmg, Random *random) { - if (!isDamageableItem()) + if (!isDamageableItem()) { - return; - } + return false; + } - shared_ptr player = dynamic_pointer_cast(owner); - if (i > 0 && player != NULL) + if (dmg > 0) { - int enchanted = EnchantmentHelper::getDigDurability(player->inventory); - // Fix for #65233 - TU8: Content: Gameplay: Tools Enchanted with "Unbreaking" occasionally repair themselves. - // 4J Stu - If it's the clientside level, then always assume that no damage is done. This stops the case where the client random - // results in damage, but the server random does not - if (enchanted > 0 && (owner->level->isClientSide || owner->level->random->nextInt(enchanted + 1) > 0) ) + int level = EnchantmentHelper::getEnchantmentLevel(Enchantment::digDurability->id, shared_from_this()); + + int drop = 0; + for (int y = 0; level > 0 && y < dmg; y++) { - // enchantment prevents damage - return; + if (DigDurabilityEnchantment::shouldIgnoreDurabilityDrop(shared_from_this(), level, random)) + { + drop++; + } } + dmg -= drop; + + if (dmg <= 0) return false; } - // 4J Stu - Changed in TU6 to not damage items in creative mode - if (!(owner != NULL && player->abilities.instabuild)) auxValue += i; - - if (auxValue > getMaxDamage()) - { - owner->breakItem(shared_from_this()); - count--; - if (count < 0) count = 0; - auxValue = 0; - } + auxValue += dmg; + + return auxValue > getMaxDamage(); } -void ItemInstance::hurtEnemy(shared_ptr mob, shared_ptr attacker) +void ItemInstance::hurtAndBreak(int dmg, shared_ptr owner) { - //bool used = - Item::items[id]->hurtEnemy(shared_from_this(), mob, attacker); + shared_ptr player = dynamic_pointer_cast(owner); + if (player != NULL && player->abilities.instabuild) return; + if (!isDamageableItem()) return; + + if (hurt(dmg, owner->getRandom())) + { + owner->breakItem(shared_from_this()); + + count--; + if (player != NULL) + { + //player->awardStat(Stats::itemBroke[id], 1); + if (count == 0 && dynamic_cast( getItem() ) != NULL) + { + player->removeSelectedItem(); + } + } + if (count < 0) count = 0; + auxValue = 0; + } } -void ItemInstance::mineBlock(Level *level, int tile, int x, int y, int z, shared_ptr owner) +void ItemInstance::hurtEnemy(shared_ptr mob, shared_ptr attacker) { - //bool used = - Item::items[id]->mineBlock( shared_from_this(), level, tile, x, y, z, owner); + //bool used = + Item::items[id]->hurtEnemy(shared_from_this(), mob, attacker); } -int ItemInstance::getAttackDamage(shared_ptr entity) +void ItemInstance::mineBlock(Level *level, int tile, int x, int y, int z, shared_ptr owner) { - return Item::items[id]->getAttackDamage(entity); + //bool used = + Item::items[id]->mineBlock( shared_from_this(), level, tile, x, y, z, owner); } bool ItemInstance::canDestroySpecial(Tile *tile) { - return Item::items[id]->canDestroySpecial(tile); + return Item::items[id]->canDestroySpecial(tile); } -bool ItemInstance::interactEnemy(shared_ptr mob) +bool ItemInstance::interactEnemy(shared_ptr player, shared_ptr mob) { - return Item::items[id]->interactEnemy(shared_from_this(), mob); + return Item::items[id]->interactEnemy(shared_from_this(), player, mob); } shared_ptr ItemInstance::copy() const @@ -313,16 +344,16 @@ bool ItemInstance::tagMatches(shared_ptr a, shared_ptr a, shared_ptr b) { - if (a == NULL && b == NULL) return true; - if (a == NULL || b == NULL) return false; - return a->matches(b); + if (a == NULL && b == NULL) return true; + if (a == NULL || b == NULL) return false; + return a->matches(b); } bool ItemInstance::matches(shared_ptr b) { - if (count != b->count) return false; - if (id != b->id) return false; - if (auxValue != b->auxValue) return false; + if (count != b->count) return false; + if (id != b->id) return false; + if (auxValue != b->auxValue) return false; if (tag == NULL && b->tag != NULL) { return false; @@ -331,25 +362,25 @@ bool ItemInstance::matches(shared_ptr b) { return false; } - return true; + return true; } /** - * Checks if this item is the same item as the other one, disregarding the - * 'count' value. - * - * @param b - * @return - */ +* Checks if this item is the same item as the other one, disregarding the +* 'count' value. +* +* @param b +* @return +*/ bool ItemInstance::sameItem(shared_ptr b) { - return id == b->id && auxValue == b->auxValue; + return id == b->id && auxValue == b->auxValue; } bool ItemInstance::sameItemWithTags(shared_ptr b) { - if (id != b->id) return false; - if (auxValue != b->auxValue) return false; + if (id != b->id) return false; + if (auxValue != b->auxValue) return false; if (tag == NULL && b->tag != NULL) { return false; @@ -358,41 +389,41 @@ bool ItemInstance::sameItemWithTags(shared_ptr b) { return false; } - return true; + return true; } // 4J Stu - Added this for the one time when we compare with a non-shared pointer bool ItemInstance::sameItem_not_shared(ItemInstance *b) { - return id == b->id && auxValue == b->auxValue; + return id == b->id && auxValue == b->auxValue; } unsigned int ItemInstance::getUseDescriptionId() { - return Item::items[id]->getUseDescriptionId(shared_from_this()); + return Item::items[id]->getUseDescriptionId(shared_from_this()); } unsigned int ItemInstance::getDescriptionId(int iData /*= -1*/) { - return Item::items[id]->getDescriptionId(shared_from_this()); + return Item::items[id]->getDescriptionId(shared_from_this()); } ItemInstance *ItemInstance::setDescriptionId(unsigned int id) { // 4J Stu - I don't think this function is ever used. It if is, it should probably return shared_from_this() assert(false); - return this; + return this; } shared_ptr ItemInstance::clone(shared_ptr item) { - return item == NULL ? nullptr : item->copy(); + return item == NULL ? nullptr : item->copy(); } wstring ItemInstance::toString() { - //return count + "x" + Item::items[id]->getDescriptionId() + "@" + auxValue; - + //return count + "x" + Item::items[id]->getDescriptionId() + "@" + auxValue; + std::wostringstream oss; // 4J-PB - TODO - temp fix until ore recipe issue is fixed if(Item::items[id]==NULL) @@ -408,8 +439,8 @@ wstring ItemInstance::toString() void ItemInstance::inventoryTick(Level *level, shared_ptr owner, int slot, bool selected) { - if (popTime > 0) popTime--; - Item::items[id]->inventoryTick(shared_from_this(), level, owner, slot, selected); + if (popTime > 0) popTime--; + Item::items[id]->inventoryTick(shared_from_this(), level, owner, slot, selected); } void ItemInstance::onCraftedBy(Level *level, shared_ptr player, int craftCount) @@ -422,12 +453,12 @@ void ItemInstance::onCraftedBy(Level *level, shared_ptr player, int craf GenericStats::param_itemsCrafted(id, auxValue, craftCount) ); - Item::items[id]->onCraftedBy(shared_from_this(), level, player); + Item::items[id]->onCraftedBy(shared_from_this(), level, player); } bool ItemInstance::equals(shared_ptr ii) { - return id == ii->id && count == ii->count && auxValue == ii->auxValue; + return id == ii->id && count == ii->count && auxValue == ii->auxValue; } int ItemInstance::getUseDuration() @@ -467,6 +498,7 @@ ListTag *ItemInstance::getEnchantmentTags() void ItemInstance::setTag(CompoundTag *tag) { + delete this->tag; this->tag = tag; } @@ -494,6 +526,24 @@ void ItemInstance::setHoverName(const wstring &name) tag->getCompound(L"display")->putString(L"Name", name); } +void ItemInstance::resetHoverName() +{ + if (tag == NULL) return; + if (!tag->contains(L"display")) return; + CompoundTag *display = tag->getCompound(L"display"); + display->remove(L"Name"); + + if (display->isEmpty()) + { + tag->remove(L"display"); + + if (tag->isEmpty()) + { + setTag(NULL); + } + } +} + bool ItemInstance::hasCustomHoverName() { if (tag == NULL) return false; @@ -501,49 +551,49 @@ bool ItemInstance::hasCustomHoverName() return tag->getCompound(L"display")->contains(L"Name"); } -vector *ItemInstance::getHoverText(shared_ptr player, bool advanced, vector &unformattedStrings) +vector *ItemInstance::getHoverText(shared_ptr player, bool advanced) { - vector *lines = new vector(); + vector *lines = new vector(); Item *item = Item::items[id]; - wstring title = getHoverName(); - - // 4J Stu - We don't do italics, but do change colour. But handle this later in the process due to text length measuring on the Xbox360 - //if (hasCustomHoverName()) - //{ - // title = L"" + title + L""; - //} - - // 4J Stu - Don't currently have this - //if (advanced) - //{ - // String suffix = ""; - - // if (title.length() > 0) { - // title += " ("; - // suffix = ")"; - // } - - // if (isStackedByData()) - // { - // title += String.format("#%04d/%d%s", id, auxValue, suffix); - // } - // else - // { - // title += String.format("#%04d%s", id, suffix); - // } - //} - //else - // if (!hasCustomHoverName()) - //{ - // if (id == Item::map_Id) - // { - // title += L" #" + _toString(auxValue); - // } - //} + HtmlString title = HtmlString(getHoverName()); + + if (hasCustomHoverName()) + { + title.italics = true; + } + + // 4J: This is for showing aux values, not useful in console version + /* + if (advanced) + { + wstring suffix = L""; + + if (title.length() > 0) + { + title += L" ("; + suffix = L")"; + } + + if (isStackedByData()) + { + title += String.format("#%04d/%d%s", id, auxValue, suffix); + } + else + { + title += String.format("#%04d%s", id, suffix); + } + } + else if (!hasCustomHoverName() && id == Item::map_Id) + */ + + /*if (!hasCustomHoverName() && id == Item::map_Id) + { + title.text += L" #" + _toString(auxValue); + }*/ lines->push_back(title); - unformattedStrings.push_back(title); - item->appendHoverText(shared_from_this(), player, lines, advanced, unformattedStrings); + + item->appendHoverText(shared_from_this(), player, lines, advanced); if (hasTag()) { @@ -558,22 +608,87 @@ vector *ItemInstance::getHoverText(shared_ptr player, bool adva if (Enchantment::enchantments[type] != NULL) { wstring unformatted = L""; - lines->push_back(Enchantment::enchantments[type]->getFullname(level, unformatted)); - unformattedStrings.push_back(unformatted); + lines->push_back(Enchantment::enchantments[type]->getFullname(level)); } } } + + if (tag->contains(L"display")) + { + //CompoundTag *display = tag->getCompound(L"display"); + + //if (display->contains(L"color")) + //{ + // if (advanced) + // { + // wchar_t text [256]; + // swprintf(text, 256, L"Color: LOCALISE #%08X", display->getInt(L"color")); + // lines->push_back(HtmlString(text)); + // } + // else + // { + // lines->push_back(HtmlString(L"Dyed LOCALISE", eMinecraftColour_NOT_SET, true)); + // } + //} + + // 4J: Lore isn't in use in game + /*if (display->contains(L"Lore")) + { + ListTag *lore = (ListTag *) display->getList(L"Lore"); + if (lore->size() > 0) + { + for (int i = 0; i < lore->size(); i++) + { + //lines->push_back(ChatFormatting::DARK_PURPLE + "" + ChatFormatting::ITALIC + lore->get(i)->data); + lines->push_back(lore->get(i)->data); + } + } + }*/ + } } + + attrAttrModMap *modifiers = getAttributeModifiers(); + + if (!modifiers->empty()) + { + // New line + lines->push_back(HtmlString(L"")); + + // Modifier descriptions + for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + // 4J: Moved modifier string building to AttributeModifier + lines->push_back(it->second->getHoverText(it->first)); + } + } + + // Delete modifiers map + for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + AttributeModifier *modifier = it->second; + delete modifier; + } + delete modifiers; + + if (advanced) + { + if (isDamaged()) + { + wstring damageStr = L"Durability: LOCALISE " + _toString((getMaxDamage()) - getDamageValue()) + L" / " + _toString(getMaxDamage()); + lines->push_back(HtmlString(damageStr)); + } + } + return lines; } // 4J Added -vector *ItemInstance::getHoverTextOnly(shared_ptr player, bool advanced, vector &unformattedStrings) +vector *ItemInstance::getHoverTextOnly(shared_ptr player, bool advanced) { - vector *lines = new vector(); + vector *lines = new vector(); Item *item = Item::items[id]; - item->appendHoverText(shared_from_this(), player, lines, advanced, unformattedStrings); + item->appendHoverText(shared_from_this(), player, lines, advanced); if (hasTag()) { @@ -588,8 +703,7 @@ vector *ItemInstance::getHoverTextOnly(shared_ptr player, bool if (Enchantment::enchantments[type] != NULL) { wstring unformatted = L""; - lines->push_back(Enchantment::enchantments[type]->getFullname(level,unformatted)); - unformattedStrings.push_back(unformatted); + lines->push_back(Enchantment::enchantments[type]->getFullname(level)); } } } @@ -636,11 +750,78 @@ void ItemInstance::addTagElement(wstring name, Tag *tag) { if (this->tag == NULL) { - this->setTag(new CompoundTag()); + setTag(new CompoundTag()); } this->tag->put((wchar_t *)name.c_str(), tag); } +bool ItemInstance::mayBePlacedInAdventureMode() +{ + return getItem()->mayBePlacedInAdventureMode(); +} + +bool ItemInstance::isFramed() +{ + return frame != NULL; +} + +void ItemInstance::setFramed(shared_ptr frame) +{ + this->frame = frame; +} + +shared_ptr ItemInstance::getFrame() +{ + return frame; +} + +int ItemInstance::getBaseRepairCost() +{ + if (hasTag() && tag->contains(L"RepairCost")) + { + return tag->getInt(L"RepairCost"); + } + else + { + return 0; + } +} + +void ItemInstance::setRepairCost(int cost) +{ + if (!hasTag()) tag = new CompoundTag(); + tag->putInt(L"RepairCost", cost); +} + +attrAttrModMap *ItemInstance::getAttributeModifiers() +{ + attrAttrModMap *result = NULL; + + if (hasTag() && tag->contains(L"AttributeModifiers")) + { + result = new attrAttrModMap(); + ListTag *entries = (ListTag *) tag->getList(L"AttributeModifiers"); + + for (int i = 0; i < entries->size(); i++) + { + CompoundTag *entry = entries->get(i); + AttributeModifier *attribute = SharedMonsterAttributes::loadAttributeModifier(entry); + + // 4J Not sure why but this is a check that the attribute ID is not empty + /*if (attribute->getId()->getLeastSignificantBits() != 0 && attribute->getId()->getMostSignificantBits() != 0) + {*/ + result->insert(std::pair(static_cast(entry->getInt(L"ID")), attribute)); + /*}*/ + } + } + else + { + result = getItem()->getDefaultAttributeModifiers(); + } + + return result; +} + void ItemInstance::set4JData(int data) { if(tag == NULL && data == 0) return; @@ -689,39 +870,4 @@ int ItemInstance::GetPotionStrength() { return (auxValue&MASK_LEVEL2EXTENDED)>>5; } -} - -// TU9 - -bool ItemInstance::isFramed() -{ - return frame != NULL; -} - -void ItemInstance::setFramed(shared_ptr frame) -{ - this->frame = frame; -} - -shared_ptr ItemInstance::getFrame() -{ - return frame; -} - -int ItemInstance::getBaseRepairCost() -{ - if (hasTag() && tag->contains(L"RepairCost")) - { - return tag->getInt(L"RepairCost"); - } - else - { - return 0; - } -} - -void ItemInstance::setRepairCost(int cost) -{ - if (!hasTag()) tag = new CompoundTag(); - tag->putInt(L"RepairCost", cost); -} +} \ No newline at end of file diff --git a/Minecraft.World/ItemInstance.h b/Minecraft.World/ItemInstance.h index c1e52177..034c72f8 100644 --- a/Minecraft.World/ItemInstance.h +++ b/Minecraft.World/ItemInstance.h @@ -3,39 +3,45 @@ using namespace std; #include "UseAnim.h" #include "com.mojang.nbt.h" +#include "Attribute.h" class Entity; class Level; class Player; class Mob; +class LivingEntity; class CompoundTag; class Enchantment; class Rarity; +class AttributeModifier; +class Random; // 4J-PB - added class MapItem; class ItemFrame; class Icon; +class HtmlString; // 4J Stu - While this is not really an abstract class, we don't want to make new instances of it, // mainly because there are too many ctors and that doesn't fit well into out macroisation setup class ItemInstance: public enable_shared_from_this { public: + static const wstring ATTRIBUTE_MODIFIER_FORMAT; static const wchar_t *TAG_ENCH_ID; - static const wchar_t *TAG_ENCH_LEVEL; + static const wchar_t *TAG_ENCH_LEVEL; int count; - int popTime; - int id; + int popTime; + int id; // 4J Stu - Brought forward for enchanting/game rules CompoundTag *tag; - /** - * This was previously the damage value, but is now used for different stuff - * depending on item / tile. Use the getter methods to make sure the value - * is interpreted correctly. - */ + /** + * This was previously the damage value, but is now used for different stuff + * depending on item / tile. Use the getter methods to make sure the value + * is interpreted correctly. + */ private: int auxValue; // 4J-PB - added for trading menu @@ -71,7 +77,7 @@ public: int getIconType(); bool useOn(shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); float getDestroySpeed(Tile *tile); - bool TestUse(Level *level, shared_ptr player); + bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); shared_ptr use(Level *level, shared_ptr player); shared_ptr useTimeDepleted(Level *level, shared_ptr player); CompoundTag *save(CompoundTag *compoundTag); @@ -85,12 +91,12 @@ public: int getAuxValue() const; void setAuxValue(int value); int getMaxDamage(); - void hurt(int i, shared_ptr owner); - void hurtEnemy(shared_ptr mob, shared_ptr attacker); + bool hurt(int dmg, Random *random); + void hurtAndBreak(int dmg, shared_ptr owner); + void hurtEnemy(shared_ptr mob, shared_ptr attacker); void mineBlock(Level *level, int tile, int x, int y, int z, shared_ptr owner); - int getAttackDamage(shared_ptr entity); bool canDestroySpecial(Tile *tile); - bool interactEnemy(shared_ptr mob); + bool interactEnemy(shared_ptr player, shared_ptr mob); shared_ptr copy() const; ItemInstance *copy_not_shared() const; // 4J Stu - Added for use in recipes static bool tagMatches(shared_ptr a, shared_ptr b); // 4J Brought forward from 1.2 @@ -128,27 +134,27 @@ public: void setTag(CompoundTag *tag); wstring getHoverName(); void setHoverName(const wstring &name); + void resetHoverName(); bool hasCustomHoverName(); - vector *getHoverText(shared_ptr player, bool advanced, vector &unformattedStrings); - vector *getHoverTextOnly(shared_ptr player, bool advanced, vector &unformattedStrings); // 4J Added + vector *getHoverText(shared_ptr player, bool advanced); + vector *getHoverTextOnly(shared_ptr player, bool advanced); // 4J Added bool isFoil(); const Rarity *getRarity(); bool isEnchantable(); void enchant(const Enchantment *enchantment, int level); bool isEnchanted(); void addTagElement(wstring name, Tag *tag); + bool mayBePlacedInAdventureMode(); + bool isFramed(); + void setFramed(shared_ptr frame); + shared_ptr getFrame(); + int getBaseRepairCost(); + void setRepairCost(int cost); + attrAttrModMap *getAttributeModifiers(); // 4J Added void set4JData(int data); int get4JData(); bool hasPotionStrengthBar(); int GetPotionStrength(); - - // TU9 - bool isFramed(); - void setFramed(shared_ptr frame); - shared_ptr getFrame(); - - int getBaseRepairCost(); - void setRepairCost(int cost); }; \ No newline at end of file diff --git a/Minecraft.World/JukeboxTile.cpp b/Minecraft.World/JukeboxTile.cpp new file mode 100644 index 00000000..cf53a751 --- /dev/null +++ b/Minecraft.World/JukeboxTile.cpp @@ -0,0 +1,167 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.h" +#include "net.minecraft.world.h" +#include "JukeboxTile.h" +#include "LevelEvent.h" + +JukeboxTile::Entity::Entity() : TileEntity() +{ + record = nullptr; +} + +void JukeboxTile::Entity::load(CompoundTag *tag) +{ + TileEntity::load(tag); + + if (tag->contains(L"RecordItem")) + { + setRecord(ItemInstance::fromTag(tag->getCompound(L"RecordItem"))); + } + else if (tag->getInt(L"Record") > 0) + { + setRecord(shared_ptr( new ItemInstance(tag->getInt(L"Record"), 1, 0))); + } +} + +void JukeboxTile::Entity::save(CompoundTag *tag) +{ + TileEntity::save(tag); + + if (getRecord() != NULL) + { + tag->putCompound(L"RecordItem", getRecord()->save(new CompoundTag())); + + tag->putInt(L"Record", getRecord()->id); + } +} + +// 4J Added +shared_ptr JukeboxTile::Entity::clone() +{ + shared_ptr result = shared_ptr( new JukeboxTile::Entity() ); + TileEntity::clone(result); + + result->record = record; + + return result; +} + +shared_ptr JukeboxTile::Entity::getRecord() +{ + return record; +} + +void JukeboxTile::Entity::setRecord(shared_ptr record) +{ + this->record = record; + setChanged(); +} + +JukeboxTile::JukeboxTile(int id) : BaseEntityTile(id, Material::wood) +{ + iconTop = NULL; +} + +Icon *JukeboxTile::getTexture(int face, int data) +{ + if (face == Facing::UP) + { + return iconTop; + } + return icon; +} + +// 4J-PB - Adding a TestUse for tooltip display +bool JukeboxTile::TestUse(Level *level, int x, int y, int z, shared_ptr player) +{ + // if the jukebox is empty, return true + if (level->getData(x, y, z) == 0) return false; + return true; +} + +bool JukeboxTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +{ + if (soundOnly) return false; + if (level->getData(x, y, z) == 0) return false; + dropRecording(level, x, y, z); + return true; +} + +void JukeboxTile::setRecord(Level *level, int x, int y, int z, shared_ptr record) +{ + if (level->isClientSide) return; + + shared_ptr rte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + rte->setRecord(record->copy()); + rte->setChanged(); + + level->setData(x, y, z, 1, Tile::UPDATE_CLIENTS); +} + +void JukeboxTile::dropRecording(Level *level, int x, int y, int z) +{ + if (level->isClientSide) return; + + shared_ptr rte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + if( rte == NULL ) return; + + shared_ptr oldRecord = rte->getRecord(); + if (oldRecord == NULL) return; + + + level->levelEvent(LevelEvent::SOUND_PLAY_RECORDING, x, y, z, 0); + // 4J-PB- the level event will play the music + //level->playStreamingMusic(L"", x, y, z); + rte->setRecord(nullptr); + rte->setChanged(); + level->setData(x, y, z, 0, Tile::UPDATE_CLIENTS); + + float s = 0.7f; + double xo = level->random->nextFloat() * s + (1 - s) * 0.5; + double yo = level->random->nextFloat() * s + (1 - s) * 0.2 + 0.6; + double zo = level->random->nextFloat() * s + (1 - s) * 0.5; + + shared_ptr itemInstance = oldRecord->copy(); + + shared_ptr item = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, itemInstance ) ); + item->throwTime = 10; + level->addEntity(item); +} + +void JukeboxTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + dropRecording(level, x, y, z); + Tile::onRemove(level, x, y, z, id, data); +} + +void JukeboxTile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus) +{ + if (level->isClientSide) return; + Tile::spawnResources(level, x, y, z, data, odds, 0); +} + +shared_ptr JukeboxTile::newTileEntity(Level *level) +{ + return shared_ptr( new JukeboxTile::Entity() ); +} + +void JukeboxTile::registerIcons(IconRegister *iconRegister) +{ + icon = iconRegister->registerIcon(getIconName() + L"_side"); + iconTop = iconRegister->registerIcon(getIconName() + L"_top"); +} + +bool JukeboxTile::hasAnalogOutputSignal() +{ + return true; +} + +int JukeboxTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + shared_ptr record = dynamic_pointer_cast( level->getTileEntity(x, y, z))->getRecord(); + return record == NULL ? Redstone::SIGNAL_NONE : record->id + 1 - Item::record_01_Id; +} \ No newline at end of file diff --git a/Minecraft.World/JukeboxTile.h b/Minecraft.World/JukeboxTile.h new file mode 100644 index 00000000..dd592872 --- /dev/null +++ b/Minecraft.World/JukeboxTile.h @@ -0,0 +1,55 @@ +#pragma once + +#include "BaseEntityTile.h" +#include "CompoundTag.h" +#include "TileEntity.h" + +class CompoundTag; +class ChunkRebuildData; + +class JukeboxTile : public BaseEntityTile +{ + friend class Tile; + friend class ChunkRebuildData; +public: + class Entity : public TileEntity + { + public: + eINSTANCEOF GetType() { return eTYPE_RECORDPLAYERTILE; } + static TileEntity *create() { return new JukeboxTile::Entity(); } + + private: + shared_ptr record; + + public: + Entity(); + + virtual void load(CompoundTag *tag); + virtual void save(CompoundTag *tag); + virtual shared_ptr getRecord(); + virtual void setRecord(shared_ptr record); + + // 4J Added + shared_ptr clone(); + }; + +private: + Icon *iconTop; + +protected: + JukeboxTile(int id); + +public: + virtual Icon *getTexture(int face, int data); + virtual bool TestUse(Level *level, int x, int y, int z, shared_ptr player); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + void setRecord(Level *level, int x, int y, int z, shared_ptr record); + void dropRecording(Level *level, int x, int y, int z); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); + + virtual shared_ptr newTileEntity(Level *level); + virtual void registerIcons(IconRegister *iconRegister); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); +}; diff --git a/Minecraft.World/JungleBiome.cpp b/Minecraft.World/JungleBiome.cpp index ba30a896..1388e97f 100644 --- a/Minecraft.World/JungleBiome.cpp +++ b/Minecraft.World/JungleBiome.cpp @@ -12,7 +12,7 @@ JungleBiome::JungleBiome(int id) : Biome(id) decorator->grassCount = 25; decorator->flowerCount = 4; - enemies.push_back(new MobSpawnerData(eTYPE_OZELOT, 2, 1, 1)); + enemies.push_back(new MobSpawnerData(eTYPE_OCELOT, 2, 1, 1)); // make chicken a lot more common in the jungle friendlies.push_back(new MobSpawnerData(eTYPE_CHICKEN, 10, 4, 4)); diff --git a/Minecraft.World/KillCommand.cpp b/Minecraft.World/KillCommand.cpp index 30a7880e..c726b21f 100644 --- a/Minecraft.World/KillCommand.cpp +++ b/Minecraft.World/KillCommand.cpp @@ -2,6 +2,7 @@ #include "net.minecraft.commands.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.damagesource.h" +#include "BasicTypeContainers.h" #include "KillCommand.h" EGameCommand KillCommand::getId() @@ -9,11 +10,17 @@ EGameCommand KillCommand::getId() return eGameCommand_Kill; } +int KillCommand::getPermissionLevel() +{ + return LEVEL_ALL; +} + void KillCommand::execute(shared_ptr source, byteArray commandData) { shared_ptr player = dynamic_pointer_cast(source); - player->hurt(DamageSource::outOfWorld, 1000); + player->hurt(DamageSource::outOfWorld, Float::MAX_VALUE); source->sendMessage(L"Ouch. That look like it hurt."); +//source.sendMessage(ChatMessageComponent.forTranslation("commands.kill.success")); } \ No newline at end of file diff --git a/Minecraft.World/KillCommand.h b/Minecraft.World/KillCommand.h index a88b2069..50db2c79 100644 --- a/Minecraft.World/KillCommand.h +++ b/Minecraft.World/KillCommand.h @@ -6,5 +6,6 @@ class KillCommand : public Command { public: virtual EGameCommand getId(); + virtual int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData); }; \ No newline at end of file diff --git a/Minecraft.World/LadderTile.cpp b/Minecraft.World/LadderTile.cpp index 32f35ed8..438d2bbf 100644 --- a/Minecraft.World/LadderTile.cpp +++ b/Minecraft.World/LadderTile.cpp @@ -15,8 +15,8 @@ AABB *LadderTile::getAABB(Level *level, int x, int y, int z) AABB *LadderTile::getTileAABB(Level *level, int x, int y, int z) { - updateShape(level, x, y, z); - return Tile::getTileAABB(level, x, y, z); + updateShape(level, x, y, z); + return Tile::getTileAABB(level, x, y, z); } void LadderTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param @@ -57,53 +57,53 @@ int LadderTile::getRenderShape() bool LadderTile::mayPlace(Level *level, int x, int y, int z) { - if (level->isSolidBlockingTile(x - 1, y, z)) + if (level->isSolidBlockingTile(x - 1, y, z)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x + 1, y, z)) { - return true; + return true; } else if (level->isSolidBlockingTile(x, y, z - 1)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x, y, z + 1)) { - return true; - } - return false; + return true; + } + return false; } int LadderTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) { - int dir = level->getData(x, y, z); + int dir = level->getData(x, y, z); - if ((dir == 0 || face == 2) && level->isSolidBlockingTile(x, y, z + 1)) dir = 2; - if ((dir == 0 || face == 3) && level->isSolidBlockingTile(x, y, z - 1)) dir = 3; - if ((dir == 0 || face == 4) && level->isSolidBlockingTile(x + 1, y, z)) dir = 4; - if ((dir == 0 || face == 5) && level->isSolidBlockingTile(x - 1, y, z)) dir = 5; + if ((dir == 0 || face == 2) && level->isSolidBlockingTile(x, y, z + 1)) dir = 2; + if ((dir == 0 || face == 3) && level->isSolidBlockingTile(x, y, z - 1)) dir = 3; + if ((dir == 0 || face == 4) && level->isSolidBlockingTile(x + 1, y, z)) dir = 4; + if ((dir == 0 || face == 5) && level->isSolidBlockingTile(x - 1, y, z)) dir = 5; - return dir; + return dir; } void LadderTile::neighborChanged(Level *level, int x, int y, int z, int type) { - int face = level->getData(x, y, z); - bool ok = false; - - if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) ok = true; - if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) ok = true; - if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) ok = true; - if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) ok = true; - if (!ok) + int face = level->getData(x, y, z); + bool ok = false; + + if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) ok = true; + if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) ok = true; + if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) ok = true; + if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) ok = true; + if (!ok) { - spawnResources(level, x, y, z, face, 0); - level->setTile(x, y, z, 0); - } + spawnResources(level, x, y, z, face, 0); + level->removeTile(x, y, z); + } - Tile::neighborChanged(level, x, y, z, type); + Tile::neighborChanged(level, x, y, z, type); } int LadderTile::getResourceCount(Random* random) diff --git a/Minecraft.World/LakeFeature.cpp b/Minecraft.World/LakeFeature.cpp index 7450450d..ac240e61 100644 --- a/Minecraft.World/LakeFeature.cpp +++ b/Minecraft.World/LakeFeature.cpp @@ -11,16 +11,16 @@ LakeFeature::LakeFeature(int tile) bool LakeFeature::place(Level *level, Random *random, int x, int y, int z) { - x -= 8; - z -= 8; - while (y > 5 && level->isEmptyTile(x, y, z)) - y--; + x -= 8; + z -= 8; + while (y > 5 && level->isEmptyTile(x, y, z)) + y--; if (y <= 4) { return false; } - y -= 4; + y -= 4; bool grid[16*16*8] = {0}; @@ -32,7 +32,7 @@ bool LakeFeature::place(Level *level, Random *random, int x, int y, int z) int minX = x; int minY = y; int minZ = z; - + int maxX = x + 16; int maxY = y + 8; int maxZ = z + 16; @@ -45,98 +45,97 @@ bool LakeFeature::place(Level *level, Random *random, int x, int y, int z) } } - int spots = random->nextInt(4) + 4; - for (int i = 0; i < spots; i++) + int spots = random->nextInt(4) + 4; + for (int i = 0; i < spots; i++) { - double xr = random->nextDouble() * 6 + 3; - double yr = random->nextDouble() * 4 + 2; - double zr = random->nextDouble() * 6 + 3; + double xr = random->nextDouble() * 6 + 3; + double yr = random->nextDouble() * 4 + 2; + double zr = random->nextDouble() * 6 + 3; - double xp = random->nextDouble() * (16 - xr - 2) + 1 + xr / 2; - double yp = random->nextDouble() * (8 - yr - 4) + 2 + yr / 2; - double zp = random->nextDouble() * (16 - zr - 2) + 1 + zr / 2; + double xp = random->nextDouble() * (16 - xr - 2) + 1 + xr / 2; + double yp = random->nextDouble() * (8 - yr - 4) + 2 + yr / 2; + double zp = random->nextDouble() * (16 - zr - 2) + 1 + zr / 2; - for (int xx = 1; xx < 15; xx++) + for (int xx = 1; xx < 15; xx++) { - for (int zz = 1; zz < 15; zz++) + for (int zz = 1; zz < 15; zz++) { - for (int yy = 1; yy < 7; yy++) + for (int yy = 1; yy < 7; yy++) { - double xd = ((xx - xp) / (xr / 2)); - double yd = ((yy - yp) / (yr / 2)); - double zd = ((zz - zp) / (zr / 2)); - double d = xd * xd + yd * yd + zd * zd; - if (d < 1) grid[((xx) * 16 + (zz)) * 8 + (yy)] = true; - } - } - } - } - - for (int xx = 0; xx < 16; xx++) + double xd = ((xx - xp) / (xr / 2)); + double yd = ((yy - yp) / (yr / 2)); + double zd = ((zz - zp) / (zr / 2)); + double d = xd * xd + yd * yd + zd * zd; + if (d < 1) grid[((xx) * 16 + (zz)) * 8 + (yy)] = true; + } + } + } + } + + for (int xx = 0; xx < 16; xx++) { - for (int zz = 0; zz < 16; zz++) + for (int zz = 0; zz < 16; zz++) { - for (int yy = 0; yy < 8; yy++) + for (int yy = 0; yy < 8; yy++) { - bool check = !grid[((xx) * 16 + (zz)) * 8 + (yy)] && ( - (xx < 15 && grid[((xx + 1) * 16 + (zz)) * 8 + (yy)]) - || (xx > 0 && grid[((xx - 1) * 16 + (zz)) * 8 + (yy)]) - || (zz < 15 && grid[((xx) * 16 + (zz + 1)) * 8 + (yy)]) - || (zz > 0 && grid[((xx) * 16 + (zz - 1)) * 8 + (yy)]) - || (yy < 7 && grid[((xx) * 16 + (zz)) * 8 + (yy + 1)]) - || (yy > 0 && grid[((xx) * 16 + (zz)) * 8 + (yy - 1)])); - - if (check) + bool check = !grid[((xx) * 16 + (zz)) * 8 + (yy)] && ((xx < 15 && grid[((xx + 1) * 16 + (zz)) * 8 + (yy)])// + || (xx > 0 && grid[((xx - 1) * 16 + (zz)) * 8 + (yy)]) + || (zz < 15 && grid[((xx) * 16 + (zz + 1)) * 8 + (yy)]) + || (zz > 0 && grid[((xx) * 16 + (zz - 1)) * 8 + (yy)]) + || (yy < 7 && grid[((xx) * 16 + (zz)) * 8 + (yy + 1)]) + || (yy > 0 && grid[((xx) * 16 + (zz)) * 8 + (yy - 1)])); + + if (check) { - Material *m = level->getMaterial(x + xx, y + yy, z + zz); - if (yy >= 4 && m->isLiquid()) return false; - if (yy < 4 && (!m->isSolid() && level->getTile(x + xx, y + yy, z + zz) != tile)) return false; + Material *m = level->getMaterial(x + xx, y + yy, z + zz); + if (yy >= 4 && m->isLiquid()) return false; + if (yy < 4 && (!m->isSolid() && level->getTile(x + xx, y + yy, z + zz) != tile)) return false; - } - } - } - } + } + } + } + } - for (int xx = 0; xx < 16; xx++) + for (int xx = 0; xx < 16; xx++) { - for (int zz = 0; zz < 16; zz++) + for (int zz = 0; zz < 16; zz++) { - for (int yy = 0; yy < 8; yy++) + for (int yy = 0; yy < 8; yy++) { - if (grid[((xx) * 16 + (zz)) * 8 + (yy)]) + if (grid[((xx) * 16 + (zz)) * 8 + (yy)]) { - level->setTileNoUpdate(x + xx, y + yy, z + zz, yy >= 4 ? 0 : tile); - } - } - } - } + level->setTileAndData(x + xx, y + yy, z + zz, yy >= 4 ? 0 : tile, 0, Tile::UPDATE_CLIENTS); + } + } + } + } - for (int xx = 0; xx < 16; xx++) + for (int xx = 0; xx < 16; xx++) { - for (int zz = 0; zz < 16; zz++) + for (int zz = 0; zz < 16; zz++) { - for (int yy = 4; yy < 8; yy++) + for (int yy = 4; yy < 8; yy++) { - if (grid[((xx) * 16 + (zz)) * 8 + (yy)]) + if (grid[((xx) * 16 + (zz)) * 8 + (yy)]) { - if (level->getTile(x + xx, y + yy - 1, z + zz) == Tile::dirt_Id && level->getBrightness(LightLayer::Sky, x + xx, y + yy, z + zz) > 0) + if (level->getTile(x + xx, y + yy - 1, z + zz) == Tile::dirt_Id && level->getBrightness(LightLayer::Sky, x + xx, y + yy, z + zz) > 0) { Biome *b = level->getBiome(x + xx, z + zz); - if (b->topMaterial == Tile::mycel_Id) level->setTileNoUpdate(x + xx, y + yy - 1, z + zz, Tile::mycel_Id); - else level->setTileNoUpdate(x + xx, y + yy - 1, z + zz, Tile::grass_Id); - } - } - } - } - } - - if (Tile::tiles[tile]->material == Material::lava) + if (b->topMaterial == Tile::mycel_Id) level->setTileAndData(x + xx, y + yy - 1, z + zz, Tile::mycel_Id, 0, Tile::UPDATE_CLIENTS); + else level->setTileAndData(x + xx, y + yy - 1, z + zz, Tile::grass_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } + } + } + + if (Tile::tiles[tile]->material == Material::lava) { - for (int xx = 0; xx < 16; xx++) + for (int xx = 0; xx < 16; xx++) { - for (int zz = 0; zz < 16; zz++) + for (int zz = 0; zz < 16; zz++) { - for (int yy = 0; yy < 8; yy++) + for (int yy = 0; yy < 8; yy++) { bool check = !grid[((xx) * 16 + (zz)) * 8 + (yy)] && ( (xx < 15 && grid[(((xx + 1) * 16 + (zz)) * 8 + (yy))]) @@ -146,30 +145,30 @@ bool LakeFeature::place(Level *level, Random *random, int x, int y, int z) || (yy < 7 && grid[(((xx) * 16 + (zz)) * 8 + (yy + 1))]) || (yy > 0 && grid[(((xx) * 16 + (zz)) * 8 + (yy - 1))])); - if (check) + if (check) { - if ((yy<4 || random->nextInt(2)!=0) && level->getMaterial(x + xx, y + yy, z + zz)->isSolid()) + if ((yy<4 || random->nextInt(2)!=0) && level->getMaterial(x + xx, y + yy, z + zz)->isSolid()) { - level->setTileNoUpdate(x + xx, y + yy, z + zz, Tile::rock_Id); - } - } - } - } - } - } + level->setTileAndData(x + xx, y + yy, z + zz, Tile::stone_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } + } + } + } // 4J - brought forward from 1.8.2 - if (Tile::tiles[tile]->material == Material::water) + if (Tile::tiles[tile]->material == Material::water) { - for (int xx = 0; xx < 16; xx++) + for (int xx = 0; xx < 16; xx++) { - for (int zz = 0; zz < 16; zz++) + for (int zz = 0; zz < 16; zz++) { - int yy = 4; - if (level->shouldFreezeIgnoreNeighbors(x + xx, y + yy, z + zz)) level->setTileNoUpdate(x + xx, y + yy, z + zz, Tile::ice_Id); - } - } - } + int yy = 4; + if (level->shouldFreezeIgnoreNeighbors(x + xx, y + yy, z + zz)) level->setTileAndData(x + xx, y + yy, z + zz, Tile::ice_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/LargeCaveFeature.cpp b/Minecraft.World/LargeCaveFeature.cpp index 20b83a30..c05447cf 100644 --- a/Minecraft.World/LargeCaveFeature.cpp +++ b/Minecraft.World/LargeCaveFeature.cpp @@ -11,186 +11,186 @@ void LargeCaveFeature::addRoom(__int64 seed, int xOffs, int zOffs, byteArray blo void LargeCaveFeature::addTunnel(__int64 seed, int xOffs, int zOffs, byteArray blocks, double xCave, double yCave, double zCave, float thickness, float yRot, float xRot, int step, int dist, double yScale) { - double xMid = xOffs * 16 + 8; - double zMid = zOffs * 16 + 8; + double xMid = xOffs * 16 + 8; + double zMid = zOffs * 16 + 8; - float yRota = 0; - float xRota = 0; - Random random = Random(seed); + float yRota = 0; + float xRota = 0; + Random random = Random(seed); - if (dist <= 0) + if (dist <= 0) { - int max = radius * 16 - 16; - dist = max - random.nextInt(max / 4); - } - bool singleStep = false; + int max = radius * 16 - 16; + dist = max - random.nextInt(max / 4); + } + bool singleStep = false; - if (step == -1) + if (step == -1) { - step = dist / 2; - singleStep = true; - } + step = dist / 2; + singleStep = true; + } - int splitPoint = random.nextInt(dist / 2) + dist / 4; - bool steep = random.nextInt(6) == 0; + int splitPoint = random.nextInt(dist / 2) + dist / 4; + bool steep = random.nextInt(6) == 0; - for (; step < dist; step++) + for (; step < dist; step++) { - double rad = 1.5 + (Mth::sin(step * PI / dist) * thickness) * 1; - double yRad = rad * yScale; + double rad = 1.5 + (Mth::sin(step * PI / dist) * thickness) * 1; + double yRad = rad * yScale; - float xc = Mth::cos(xRot); - float xs = Mth::sin(xRot); - xCave += Mth::cos(yRot) * xc; - yCave += xs; - zCave += Mth::sin(yRot) * xc; + float xc = Mth::cos(xRot); + float xs = Mth::sin(xRot); + xCave += Mth::cos(yRot) * xc; + yCave += xs; + zCave += Mth::sin(yRot) * xc; - if (steep) + if (steep) { - xRot *= 0.92f; - } + xRot *= 0.92f; + } else { - xRot *= 0.7f; - } - xRot += xRota * 0.1f; - yRot += yRota * 0.1f; + xRot *= 0.7f; + } + xRot += xRota * 0.1f; + yRot += yRota * 0.1f; - xRota *= 0.90f; - yRota *= 0.75f; - xRota += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 2; - yRota += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 4; + xRota *= 0.90f; + yRota *= 0.75f; + xRota += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 2; + yRota += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 4; - if (!singleStep && step == splitPoint && thickness > 1 && dist > 0) + if (!singleStep && step == splitPoint && thickness > 1 && dist > 0) { - addTunnel(random.nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, random.nextFloat() * 0.5f + 0.5f, yRot - PI / 2, xRot / 3, step, dist, 1.0); - addTunnel(random.nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, random.nextFloat() * 0.5f + 0.5f, yRot + PI / 2, xRot / 3, step, dist, 1.0); - return; - } - if (!singleStep && random.nextInt(4) == 0) continue; - { - double xd = xCave - xMid; - double zd = zCave - zMid; - double remaining = dist - step; - double rr = (thickness + 2) + 16; - if (xd * xd + zd * zd - (remaining * remaining) > rr * rr) + addTunnel(random.nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, random.nextFloat() * 0.5f + 0.5f, yRot - PI / 2, xRot / 3, step, dist, 1.0); + addTunnel(random.nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, random.nextFloat() * 0.5f + 0.5f, yRot + PI / 2, xRot / 3, step, dist, 1.0); + return; + } + if (!singleStep && random.nextInt(4) == 0) continue; + { + double xd = xCave - xMid; + double zd = zCave - zMid; + double remaining = dist - step; + double rr = (thickness + 2) + 16; + if (xd * xd + zd * zd - (remaining * remaining) > rr * rr) { - return; - } - } + return; + } + } - if (xCave < xMid - 16 - rad * 2 || zCave < zMid - 16 - rad * 2 || xCave > xMid + 16 + rad * 2 || zCave > zMid + 16 + rad * 2) continue; + if (xCave < xMid - 16 - rad * 2 || zCave < zMid - 16 - rad * 2 || xCave > xMid + 16 + rad * 2 || zCave > zMid + 16 + rad * 2) continue; - int x0 = Mth::floor(xCave - rad) - xOffs * 16 - 1; - int x1 = Mth::floor(xCave + rad) - xOffs * 16 + 1; + int x0 = Mth::floor(xCave - rad) - xOffs * 16 - 1; + int x1 = Mth::floor(xCave + rad) - xOffs * 16 + 1; - int y0 = Mth::floor(yCave - yRad) - 1; - int y1 = Mth::floor(yCave + yRad) + 1; + int y0 = Mth::floor(yCave - yRad) - 1; + int y1 = Mth::floor(yCave + yRad) + 1; - int z0 = Mth::floor(zCave - rad) - zOffs * 16 - 1; - int z1 = Mth::floor(zCave + rad) - zOffs * 16 + 1; + int z0 = Mth::floor(zCave - rad) - zOffs * 16 - 1; + int z1 = Mth::floor(zCave + rad) - zOffs * 16 + 1; - if (x0 < 0) x0 = 0; - if (x1 > 16) x1 = 16; + if (x0 < 0) x0 = 0; + if (x1 > 16) x1 = 16; - if (y0 < 1) y0 = 1; - if (y1 > Level::genDepth - 8) y1 = Level::genDepth - 8; + if (y0 < 1) y0 = 1; + if (y1 > Level::genDepth - 8) y1 = Level::genDepth - 8; - if (z0 < 0) z0 = 0; - if (z1 > 16) z1 = 16; + if (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; - bool detectedWater = false; - for (int xx = x0; !detectedWater && xx < x1; xx++) + bool detectedWater = false; + for (int xx = x0; !detectedWater && xx < x1; xx++) { - for (int zz = z0; !detectedWater && zz < z1; zz++) + for (int zz = z0; !detectedWater && zz < z1; zz++) { - for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) + for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) { - int p = (xx * 16 + zz) * Level::genDepth + yy; - if (yy < 0 || yy >= Level::genDepth) continue; - if (blocks[p] == Tile::water_Id || blocks[p] == Tile::calmWater_Id) + int p = (xx * 16 + zz) * Level::genDepth + yy; + if (yy < 0 || yy >= Level::genDepth) continue; + if (blocks[p] == Tile::water_Id || blocks[p] == Tile::calmWater_Id) { - detectedWater = true; - } - if (yy != y0 - 1 && xx != x0 && xx != x1 - 1 && zz != z0 && zz != z1 - 1) + detectedWater = true; + } + if (yy != y0 - 1 && xx != x0 && xx != x1 - 1 && zz != z0 && zz != z1 - 1) { - yy = y0; - } - } - } - } - if (detectedWater) continue; - - for (int xx = x0; xx < x1; xx++) + yy = y0; + } + } + } + } + if (detectedWater) continue; + + for (int xx = x0; xx < x1; xx++) { - double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; - for (int zz = z0; zz < z1; zz++) + double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; + for (int zz = z0; zz < z1; zz++) { - double zd = ((zz + zOffs * 16 + 0.5) - zCave) / rad; - int p = (xx * 16 + zz) * Level::genDepth + y1; - bool hasGrass = false; - if (xd * xd + zd * zd < 1) + double zd = ((zz + zOffs * 16 + 0.5) - zCave) / rad; + int p = (xx * 16 + zz) * Level::genDepth + y1; + bool hasGrass = false; + if (xd * xd + zd * zd < 1) { - for (int yy = y1 - 1; yy >= y0; yy--) + for (int yy = y1 - 1; yy >= y0; yy--) { - double yd = (yy + 0.5 - yCave) / yRad; - if (yd > -0.7 && xd * xd + yd * yd + zd * zd < 1) + double yd = (yy + 0.5 - yCave) / yRad; + if (yd > -0.7 && xd * xd + yd * yd + zd * zd < 1) { - int block = blocks[p]; - if (block == Tile::grass_Id) hasGrass = true; - if (block == Tile::rock_Id || block == Tile::dirt_Id || block == Tile::grass_Id) + int block = blocks[p]; + if (block == Tile::grass_Id) hasGrass = true; + if (block == Tile::stone_Id || block == Tile::dirt_Id || block == Tile::grass_Id) { - if (yy < 10) + if (yy < 10) { - blocks[p] = (byte) Tile::lava_Id; - } + blocks[p] = (byte) Tile::lava_Id; + } else { - blocks[p] = (byte) 0; - if (hasGrass && blocks[p - 1] == Tile::dirt_Id) blocks[p - 1] = (byte) level->getBiome(xx + xOffs * 16, zz + zOffs * 16)->topMaterial; - } - } - } - p--; - } - } - } - } - if (singleStep) break; - } + blocks[p] = (byte) 0; + if (hasGrass && blocks[p - 1] == Tile::dirt_Id) blocks[p - 1] = (byte) level->getBiome(xx + xOffs * 16, zz + zOffs * 16)->topMaterial; + } + } + } + p--; + } + } + } + } + if (singleStep) break; + } } void LargeCaveFeature::addFeature(Level *level, int x, int z, int xOffs, int zOffs, byteArray blocks) { int caves = random->nextInt(random->nextInt(random->nextInt(40) + 1) + 1); - if (random->nextInt(15) != 0) caves = 0; + if (random->nextInt(15) != 0) caves = 0; - for (int cave = 0; cave < caves; cave++) + for (int cave = 0; cave < caves; cave++) { - double xCave = x * 16 + random->nextInt(16); - double yCave = random->nextInt(random->nextInt(Level::genDepth - 8) + 8); - double zCave = z * 16 + random->nextInt(16); + double xCave = x * 16 + random->nextInt(16); + double yCave = random->nextInt(random->nextInt(Level::genDepth - 8) + 8); + double zCave = z * 16 + random->nextInt(16); - int tunnels = 1; - if (random->nextInt(4) == 0) + int tunnels = 1; + if (random->nextInt(4) == 0) { - addRoom(random->nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave); - tunnels += random->nextInt(4); - } + addRoom(random->nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave); + tunnels += random->nextInt(4); + } - for (int i = 0; i < tunnels; i++) + for (int i = 0; i < tunnels; i++) { - float yRot = random->nextFloat() * PI * 2; - float xRot = ((random->nextFloat() - 0.5f) * 2) / 8; - float thickness = random->nextFloat() * 2 + random->nextFloat(); + float yRot = random->nextFloat() * PI * 2; + float xRot = ((random->nextFloat() - 0.5f) * 2) / 8; + float thickness = random->nextFloat() * 2 + random->nextFloat(); if (random->nextInt(10) == 0) thickness *= random->nextFloat() * random->nextFloat() * 3 + 1; - addTunnel(random->nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, thickness, yRot, xRot, 0, 0, 1.0); - } - } + addTunnel(random->nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, thickness, yRot, xRot, 0, 0, 1.0); + } + } } diff --git a/Minecraft.World/LargeFireball.cpp b/Minecraft.World/LargeFireball.cpp new file mode 100644 index 00000000..9f8da92c --- /dev/null +++ b/Minecraft.World/LargeFireball.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.phys.h" +#include "LargeFireball.h" + +LargeFireball::LargeFireball(Level *level) : Fireball(level) +{ + explosionPower = 1; +} + +LargeFireball::LargeFireball(Level *level, double x, double y, double z, double xa, double ya, double za) : Fireball(level, x, y, z, xa, ya, za) +{ + explosionPower = 1; +} + +LargeFireball::LargeFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) +{ + explosionPower = 1; +} + +void LargeFireball::onHit(HitResult *res) +{ + if (!level->isClientSide) + { + if (res->entity != NULL) + { + DamageSource *damageSource = DamageSource::fireball(dynamic_pointer_cast( shared_from_this() ), owner); + res->entity->hurt(damageSource, 6); + delete damageSource; + } + level->explode(nullptr, x, y, z, explosionPower, true, level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)); + remove(); + } +} + +void LargeFireball::addAdditonalSaveData(CompoundTag *tag) +{ + Fireball::addAdditonalSaveData(tag); + tag->putInt(L"ExplosionPower", explosionPower); +} + +void LargeFireball::readAdditionalSaveData(CompoundTag *tag) +{ + Fireball::readAdditionalSaveData(tag); + if (tag->contains(L"ExplosionPower")) explosionPower = tag->getInt(L"ExplosionPower"); +} \ No newline at end of file diff --git a/Minecraft.World/LargeFireball.h b/Minecraft.World/LargeFireball.h new file mode 100644 index 00000000..555569c7 --- /dev/null +++ b/Minecraft.World/LargeFireball.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Fireball.h" + +class LargeFireball : public Fireball +{ +public: + eINSTANCEOF GetType() { return eTYPE_LARGE_FIREBALL; } + static Entity *create(Level *level) { return new LargeFireball(level); } + +public: + int explosionPower; + + LargeFireball(Level *level); + LargeFireball(Level *level, double x, double y, double z, double xa, double ya, double za); + LargeFireball(Level *level, shared_ptr mob, double xa, double ya, double za); + +protected: + void onHit(HitResult *res); + +public: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditionalSaveData(CompoundTag *tag); +}; \ No newline at end of file diff --git a/Minecraft.World/LargeHellCaveFeature.cpp b/Minecraft.World/LargeHellCaveFeature.cpp index ac5d0eda..b1e636eb 100644 --- a/Minecraft.World/LargeHellCaveFeature.cpp +++ b/Minecraft.World/LargeHellCaveFeature.cpp @@ -3,182 +3,181 @@ #include "LargeHellCaveFeature.h" #include "net.minecraft.world.level.tile.h" -void LargeHellCaveFeature::addRoom(int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, double zRoom) +void LargeHellCaveFeature::addRoom(__int64 seed, int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, double zRoom) { - addTunnel(xOffs, zOffs, blocks, xRoom, yRoom, zRoom, 1 + random->nextFloat() * 6, 0, 0, -1, -1, 0.5); + addTunnel(seed, xOffs, zOffs, blocks, xRoom, yRoom, zRoom, 1 + random->nextFloat() * 6, 0, 0, -1, -1, 0.5); } -void LargeHellCaveFeature::addTunnel(int xOffs, int zOffs, byteArray blocks, double xCave, double yCave, double zCave, float thickness, float yRot, float xRot, int step, int dist, double yScale) +void LargeHellCaveFeature::addTunnel(__int64 seed, int xOffs, int zOffs, byteArray blocks, double xCave, double yCave, double zCave, float thickness, float yRot, float xRot, int step, int dist, double yScale) { - double xMid = xOffs * 16 + 8; - double zMid = zOffs * 16 + 8; + double xMid = xOffs * 16 + 8; + double zMid = zOffs * 16 + 8; - float yRota = 0; - float xRota = 0; - Random *random = new Random(this->random->nextLong()); + float yRota = 0; + float xRota = 0; + Random random(seed); - if (dist <= 0) + if (dist <= 0) { - int max = radius * 16 - 16; - dist = max - random->nextInt(max / 4); - } - bool singleStep = false; + int max = radius * 16 - 16; + dist = max - random.nextInt(max / 4); + } + bool singleStep = false; - if (step == -1) + if (step == -1) { - step = dist / 2; - singleStep = true; - } + step = dist / 2; + singleStep = true; + } - int splitPoint = random->nextInt(dist / 2) + dist / 4; - bool steep = random->nextInt(6) == 0; + int splitPoint = random.nextInt(dist / 2) + dist / 4; + bool steep = random.nextInt(6) == 0; - for (; step < dist; step++) + for (; step < dist; step++) { - double rad = 1.5 + (Mth::sin(step * PI / dist) * thickness) * 1; - double yRad = rad * yScale; + double rad = 1.5 + (Mth::sin(step * PI / dist) * thickness) * 1; + double yRad = rad * yScale; - float xc = Mth::cos(xRot); - float xs = Mth::sin(xRot); - xCave += Mth::cos(yRot) * xc; - yCave += xs; - zCave += Mth::sin(yRot) * xc; + float xc = Mth::cos(xRot); + float xs = Mth::sin(xRot); + xCave += Mth::cos(yRot) * xc; + yCave += xs; + zCave += Mth::sin(yRot) * xc; - if (steep) + if (steep) { - xRot *= 0.92f; - } + xRot *= 0.92f; + } else { - xRot *= 0.7f; - } - xRot += xRota * 0.1f; - yRot += yRota * 0.1f; + xRot *= 0.7f; + } + xRot += xRota * 0.1f; + yRot += yRota * 0.1f; - xRota *= 0.90f; - yRota *= 0.75f; - xRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 2; - yRota += (random->nextFloat() - random->nextFloat()) * random->nextFloat() * 4; + xRota *= 0.90f; + yRota *= 0.75f; + xRota += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 2; + yRota += (random.nextFloat() - random.nextFloat()) * random.nextFloat() * 4; - if (!singleStep && step == splitPoint && thickness > 1) + if (!singleStep && step == splitPoint && thickness > 1) { - addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, random->nextFloat() * 0.5f + 0.5f, yRot - PI / 2, xRot / 3, step, dist, 1.0); - addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, random->nextFloat() * 0.5f + 0.5f, yRot + PI / 2, xRot / 3, step, dist, 1.0); - delete random; - return; - } - if (!singleStep && random->nextInt(4) == 0) continue; - - { - double xd = xCave - xMid; - double zd = zCave - zMid; - double remaining = dist - step; - double rr = (thickness + 2) + 16; - if (xd * xd + zd * zd - (remaining * remaining) > rr * rr) + addTunnel(random.nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, random.nextFloat() * 0.5f + 0.5f, yRot - PI / 2, xRot / 3, step, dist, 1.0); + addTunnel(random.nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, random.nextFloat() * 0.5f + 0.5f, yRot + PI / 2, xRot / 3, step, dist, 1.0); + return; + } + if (!singleStep && random.nextInt(4) == 0) continue; + + { + double xd = xCave - xMid; + double zd = zCave - zMid; + double remaining = dist - step; + double rr = (thickness + 2) + 16; + if (xd * xd + zd * zd - (remaining * remaining) > rr * rr) { - delete random; - return; - } - } + return; + } + } - if (xCave < xMid - 16 - rad * 2 || zCave < zMid - 16 - rad * 2 || xCave > xMid + 16 + rad * 2 || zCave > zMid + 16 + rad * 2) continue; + if (xCave < xMid - 16 - rad * 2 || zCave < zMid - 16 - rad * 2 || xCave > xMid + 16 + rad * 2 || zCave > zMid + 16 + rad * 2) continue; - int x0 = Mth::floor(xCave - rad) - xOffs * 16 - 1; - int x1 = Mth::floor(xCave + rad) - xOffs * 16 + 1; + int x0 = Mth::floor(xCave - rad) - xOffs * 16 - 1; + int x1 = Mth::floor(xCave + rad) - xOffs * 16 + 1; - int y0 = Mth::floor(yCave - yRad) - 1; - int y1 = Mth::floor(yCave + yRad) + 1; + int y0 = Mth::floor(yCave - yRad) - 1; + int y1 = Mth::floor(yCave + yRad) + 1; - int z0 = Mth::floor(zCave - rad) - zOffs * 16 - 1; - int z1 = Mth::floor(zCave + rad) - zOffs * 16 + 1; + int z0 = Mth::floor(zCave - rad) - zOffs * 16 - 1; + int z1 = Mth::floor(zCave + rad) - zOffs * 16 + 1; - if (x0 < 0) x0 = 0; - if (x1 > 16) x1 = 16; + if (x0 < 0) x0 = 0; + if (x1 > 16) x1 = 16; - if (y0 < 1) y0 = 1; - if (y1 > Level::genDepth - 8) y1 = Level::genDepth - 8; + if (y0 < 1) y0 = 1; + if (y1 > Level::genDepth - 8) y1 = Level::genDepth - 8; - if (z0 < 0) z0 = 0; - if (z1 > 16) z1 = 16; + if (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; - bool detectedWater = false; - for (int xx = x0; !detectedWater && xx < x1; xx++) + bool detectedWater = false; + for (int xx = x0; !detectedWater && xx < x1; xx++) { - for (int zz = z0; !detectedWater && zz < z1; zz++) + for (int zz = z0; !detectedWater && zz < z1; zz++) { - for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) + for (int yy = y1 + 1; !detectedWater && yy >= y0 - 1; yy--) { - int p = (xx * 16 + zz) * Level::genDepth + yy; - if (yy < 0 || yy >= Level::genDepth) continue; - if (blocks[p] == Tile::lava_Id || blocks[p] == Tile::calmLava_Id) + int p = (xx * 16 + zz) * Level::genDepth + yy; + if (yy < 0 || yy >= Level::genDepth) continue; + if (blocks[p] == Tile::lava_Id || blocks[p] == Tile::calmLava_Id) { - detectedWater = true; - } - if (yy != y0 - 1 && xx != x0 && xx != x1 - 1 && zz != z0 && zz != z1 - 1) + detectedWater = true; + } + if (yy != y0 - 1 && xx != x0 && xx != x1 - 1 && zz != z0 && zz != z1 - 1) { - yy = y0; - } - } - } - } - if (detectedWater) continue; - - for (int xx = x0; xx < x1; xx++) + yy = y0; + } + } + } + } + if (detectedWater) continue; + + for (int xx = x0; xx < x1; xx++) { - double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; - for (int zz = z0; zz < z1; zz++) + double xd = ((xx + xOffs * 16 + 0.5) - xCave) / rad; + for (int zz = z0; zz < z1; zz++) { - double zd = ((zz + zOffs * 16 + 0.5) - zCave) / rad; - int p = (xx * 16 + zz) * Level::genDepth + y1; - for (int yy = y1 - 1; yy >= y0; yy--) + double zd = ((zz + zOffs * 16 + 0.5) - zCave) / rad; + int p = (xx * 16 + zz) * Level::genDepth + y1; + for (int yy = y1 - 1; yy >= y0; yy--) { - double yd = (yy + 0.5 - yCave) / yRad; - if (yd > -0.7 && xd * xd + yd * yd + zd * zd < 1) + double yd = (yy + 0.5 - yCave) / yRad; + if (yd > -0.7 && xd * xd + yd * yd + zd * zd < 1) { - int block = blocks[p]; - if (block == Tile::hellRock_Id || block == Tile::dirt_Id || block == Tile::grass_Id) + int block = blocks[p]; + if (block == Tile::netherRack_Id || block == Tile::dirt_Id || block == Tile::grass_Id) { - blocks[p] = (byte) 0; - } - } - p--; - } - } - } - if (singleStep) break; - } - delete random; + blocks[p] = (byte) 0; + } + } + p--; + } + } + } + if (singleStep) break; + } } void LargeHellCaveFeature::addFeature(Level *level, int x, int z, int xOffs, int zOffs, byteArray blocks) { - int caves = random->nextInt(random->nextInt(random->nextInt(10) + 1) + 1); - if (random->nextInt(5) != 0) caves = 0; + int caves = random->nextInt(random->nextInt(random->nextInt(10) + 1) + 1); + if (random->nextInt(5) != 0) caves = 0; - for (int cave = 0; cave < caves; cave++) + for (int cave = 0; cave < caves; cave++) { - double xCave = x * 16 + random->nextInt(16); - double yCave = random->nextInt(Level::genDepth); - double zCave = z * 16 + random->nextInt(16); + double xCave = x * 16 + random->nextInt(16); + double yCave = random->nextInt(Level::genDepth); + double zCave = z * 16 + random->nextInt(16); - int tunnels = 1; - if (random->nextInt(4) == 0) { - addRoom(xOffs, zOffs, blocks, xCave, yCave, zCave); - tunnels += random->nextInt(4); - } + int tunnels = 1; + if (random->nextInt(4) == 0) + { + addRoom(random->nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave); + tunnels += random->nextInt(4); + } - for (int i = 0; i < tunnels; i++) { + for (int i = 0; i < tunnels; i++) + { - float yRot = random->nextFloat() * PI * 2; - float xRot = ((random->nextFloat() - 0.5f) * 2) / 8; - float thickness = random->nextFloat() * 2 + random->nextFloat(); + float yRot = random->nextFloat() * PI * 2; + float xRot = ((random->nextFloat() - 0.5f) * 2) / 8; + float thickness = random->nextFloat() * 2 + random->nextFloat(); - addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, thickness*2, yRot, xRot, 0, 0, 0.5); - } - } + addTunnel(random->nextLong(), xOffs, zOffs, blocks, xCave, yCave, zCave, thickness*2, yRot, xRot, 0, 0, 0.5); + } + } } diff --git a/Minecraft.World/LargeHellCaveFeature.h b/Minecraft.World/LargeHellCaveFeature.h index 53d33692..ab6558b8 100644 --- a/Minecraft.World/LargeHellCaveFeature.h +++ b/Minecraft.World/LargeHellCaveFeature.h @@ -5,7 +5,7 @@ class LargeHellCaveFeature : public LargeFeature { protected: - void addRoom(int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, double zRoom); - void addTunnel(int xOffs, int zOffs, byteArray blocks, double xCave, double yCave, double zCave, float thickness, float yRot, float xRot, int step, int dist, double yScale); + void addRoom(__int64 seed, int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, double zRoom); + void addTunnel(__int64 seed, int xOffs, int zOffs, byteArray blocks, double xCave, double yCave, double zCave, float thickness, float yRot, float xRot, int step, int dist, double yScale); virtual void addFeature(Level *level, int x, int z, int xOffs, int zOffs, byteArray blocks); }; diff --git a/Minecraft.World/LavaSlime.cpp b/Minecraft.World/LavaSlime.cpp index 3ab32d90..21982995 100644 --- a/Minecraft.World/LavaSlime.cpp +++ b/Minecraft.World/LavaSlime.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.item.h" #include "..\Minecraft.Client\Textures.h" #include "LavaSlime.h" @@ -14,13 +16,16 @@ LavaSlime::LavaSlime(Level *level) : Slime(level) // the derived version of the function is called // 4J Stu - The Slime ctor has already called this, and as we don't override it here don't need to call it //this->defineSynchedData(); + registerAttributes(); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_LAVA; // 4J was "/mob/lava.png"; fireImmune = true; - walkingSpeed = .2f; +} + +void LavaSlime::registerAttributes() +{ + Slime::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.2f); } bool LavaSlime::canSpawn() @@ -95,7 +100,7 @@ void LavaSlime::decreaseSquish() void LavaSlime::jumpFromGround() { yd = 0.42f + getSize() * .1f; - this->hasImpulse = true; + hasImpulse = true; } void LavaSlime::causeFallDamage(float distance) @@ -114,12 +119,12 @@ int LavaSlime::getAttackDamage() int LavaSlime::getHurtSound() { - return eSoundType_MOB_SLIME; + return getSize() > 1 ? eSoundType_MOB_SLIME_BIG : eSoundType_MOB_SLIME_SMALL; } int LavaSlime::getDeathSound() { - return eSoundType_MOB_SLIME; + return getSize() > 1 ? eSoundType_MOB_SLIME_BIG : eSoundType_MOB_SLIME_SMALL; } int LavaSlime::getSquishSound() diff --git a/Minecraft.World/LavaSlime.h b/Minecraft.World/LavaSlime.h index 08857ca9..b16a7e6f 100644 --- a/Minecraft.World/LavaSlime.h +++ b/Minecraft.World/LavaSlime.h @@ -11,6 +11,10 @@ public: public: LavaSlime(Level *level); +protected: + virtual void registerAttributes(); + +public: virtual bool canSpawn(); virtual int getArmorValue(); diff --git a/Minecraft.World/Layer.cpp b/Minecraft.World/Layer.cpp index 1d010e72..956a8917 100644 --- a/Minecraft.World/Layer.cpp +++ b/Minecraft.World/Layer.cpp @@ -86,7 +86,7 @@ LayerArray Layer::getDefaultLayers(__int64 seed, LevelType *levelType) #ifndef _CONTENT_PACKAGE #ifdef _BIOME_OVERRIDE - if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<(new BiomeOverrideLayer(1)); } diff --git a/Minecraft.World/LeafTile.cpp b/Minecraft.World/LeafTile.cpp index 8b7d381c..684618a7 100644 --- a/Minecraft.World/LeafTile.cpp +++ b/Minecraft.World/LeafTile.cpp @@ -8,18 +8,18 @@ #include "net.minecraft.world.h" const unsigned int LeafTile::LEAF_NAMES[LEAF_NAMES_LENGTH] = { IDS_TILE_LEAVES_OAK, - IDS_TILE_LEAVES_SPRUCE, - IDS_TILE_LEAVES_BIRCH, - IDS_TILE_LEAVES_JUNGLE, - }; + IDS_TILE_LEAVES_SPRUCE, + IDS_TILE_LEAVES_BIRCH, + IDS_TILE_LEAVES_JUNGLE, +}; const wstring LeafTile::TEXTURES[2][4] = { {L"leaves", L"leaves_spruce", L"leaves", L"leaves_jungle"}, {L"leaves_opaque", L"leaves_spruce_opaque", L"leaves_opaque", L"leaves_jungle_opaque"},}; LeafTile::LeafTile(int id) : TransparentTile(id, Material::leaves, false, isSolidRender()) { checkBuffer = NULL; - fancyTextureSet = 0; - setTicking(true); + fancyTextureSet = 0; + setTicking(true); } LeafTile::~LeafTile() @@ -30,26 +30,26 @@ LeafTile::~LeafTile() int LeafTile::getColor() const { // 4J Stu - Not using this any more - //double temp = 0.5; - //double rain = 1.0; + //double temp = 0.5; + //double rain = 1.0; - //return FoliageColor::get(temp, rain); + //return FoliageColor::get(temp, rain); return Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Foliage_Common ); } int LeafTile::getColor(int data) { - if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF) + if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF) { - return FoliageColor::getEvergreenColor(); - } - if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF) + return FoliageColor::getEvergreenColor(); + } + if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF) { - return FoliageColor::getBirchColor(); - } + return FoliageColor::getBirchColor(); + } - return FoliageColor::getDefaultColor(); + return FoliageColor::getDefaultColor(); } int LeafTile::getColor(LevelSource *level, int x, int y, int z) @@ -60,14 +60,14 @@ int LeafTile::getColor(LevelSource *level, int x, int y, int z) // 4J - changed interface to have data passed in, and put existing interface as wrapper above int LeafTile::getColor(LevelSource *level, int x, int y, int z, int data) { - if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF) + if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF) { - return FoliageColor::getEvergreenColor(); - } - if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF) + return FoliageColor::getEvergreenColor(); + } + if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF) { - return FoliageColor::getBirchColor(); - } + return FoliageColor::getBirchColor(); + } int totalRed = 0; int totalGreen = 0; @@ -90,113 +90,113 @@ int LeafTile::getColor(LevelSource *level, int x, int y, int z, int data) void LeafTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - int r = 1; - int r2 = r + 1; + int r = 1; + int r2 = r + 1; - if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2)) + if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2)) { - for (int xo = -r; xo <= r; xo++) - for (int yo = -r; yo <= r; yo++) - for (int zo = -r; zo <= r; zo++) + for (int xo = -r; xo <= r; xo++) + for (int yo = -r; yo <= r; yo++) + for (int zo = -r; zo <= r; zo++) { - int t = level->getTile(x + xo, y + yo, z + zo); - if (t == Tile::leaves_Id) + int t = level->getTile(x + xo, y + yo, z + zo); + if (t == Tile::leaves_Id) { - int currentData = level->getData(x + xo, y + yo, z + zo); - level->setDataNoUpdate(x + xo, y + yo, z + zo, currentData | UPDATE_LEAF_BIT); - } - } - } + int currentData = level->getData(x + xo, y + yo, z + zo); + level->setData(x + xo, y + yo, z + zo, currentData | UPDATE_LEAF_BIT, Tile::UPDATE_NONE); + } + } + } } void LeafTile::tick(Level *level, int x, int y, int z, Random *random) { - if (level->isClientSide) return; + if (level->isClientSide) return; - int currentData = level->getData(x, y, z); - if ((currentData & UPDATE_LEAF_BIT) != 0 && (currentData & PERSISTENT_LEAF_BIT) == 0) + int currentData = level->getData(x, y, z); + if ((currentData & UPDATE_LEAF_BIT) != 0 && (currentData & PERSISTENT_LEAF_BIT) == 0) { - int r = LeafTile::REQUIRED_WOOD_RANGE; - int r2 = r + 1; + int r = REQUIRED_WOOD_RANGE; + int r2 = r + 1; - int W = 32; - int WW = W * W; - int WO = W / 2; - if (checkBuffer == NULL) + int W = 32; + int WW = W * W; + int WO = W / 2; + if (checkBuffer == NULL) { - checkBuffer = new int[W * W * W]; - } + checkBuffer = new int[W * W * W]; + } - if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2)) + if (level->hasChunksAt(x - r2, y - r2, z - r2, x + r2, y + r2, z + r2)) { // 4J Stu - Assuming we remain in the same chunk, getTile accesses an array that varies least by y // Changing the ordering here to loop by y last - for (int xo = -r; xo <= r; xo++) + for (int xo = -r; xo <= r; xo++) for (int zo = -r; zo <= r; zo++) for (int yo = -r; yo <= r; yo++) { - int t = level->getTile(x + xo, y + yo, z + zo); - if (t == Tile::treeTrunk_Id) + int t = level->getTile(x + xo, y + yo, z + zo); + if (t == Tile::treeTrunk_Id) { - checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = 0; + checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = 0; } else if (t == Tile::leaves_Id) { - checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = -2; - } + checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = -2; + } else { - checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = -1; - } - } - for (int i = 1; i <= LeafTile::REQUIRED_WOOD_RANGE; i++) - { - for (int xo = -r; xo <= r; xo++) - for (int yo = -r; yo <= r; yo++) - for (int zo = -r; zo <= r; zo++) - { - if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] == i - 1) - { - if (checkBuffer[(xo + WO - 1) * WW + (yo + WO) * W + (zo + WO)] == -2) - { - checkBuffer[(xo + WO - 1) * WW + (yo + WO) * W + (zo + WO)] = i; - } - if (checkBuffer[(xo + WO + 1) * WW + (yo + WO) * W + (zo + WO)] == -2) - { - checkBuffer[(xo + WO + 1) * WW + (yo + WO) * W + (zo + WO)] = i; - } - if (checkBuffer[(xo + WO) * WW + (yo + WO - 1) * W + (zo + WO)] == -2) - { - checkBuffer[(xo + WO) * WW + (yo + WO - 1) * W + (zo + WO)] = i; - } - if (checkBuffer[(xo + WO) * WW + (yo + WO + 1) * W + (zo + WO)] == -2) - { - checkBuffer[(xo + WO) * WW + (yo + WO + 1) * W + (zo + WO)] = i; - } - if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO - 1)] == -2) - { - checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO - 1)] = i; - } - if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO + 1)] == -2) + checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] = -1; + } + } + for (int i = 1; i <= REQUIRED_WOOD_RANGE; i++) + { + for (int xo = -r; xo <= r; xo++) + for (int yo = -r; yo <= r; yo++) + for (int zo = -r; zo <= r; zo++) { - checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO + 1)] = i; - } - } - } - } - } - - int mid = checkBuffer[(WO) * WW + (WO) * W + (WO)]; - if (mid >= 0) + if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO)] == i - 1) + { + if (checkBuffer[(xo + WO - 1) * WW + (yo + WO) * W + (zo + WO)] == -2) + { + checkBuffer[(xo + WO - 1) * WW + (yo + WO) * W + (zo + WO)] = i; + } + if (checkBuffer[(xo + WO + 1) * WW + (yo + WO) * W + (zo + WO)] == -2) + { + checkBuffer[(xo + WO + 1) * WW + (yo + WO) * W + (zo + WO)] = i; + } + if (checkBuffer[(xo + WO) * WW + (yo + WO - 1) * W + (zo + WO)] == -2) + { + checkBuffer[(xo + WO) * WW + (yo + WO - 1) * W + (zo + WO)] = i; + } + if (checkBuffer[(xo + WO) * WW + (yo + WO + 1) * W + (zo + WO)] == -2) + { + checkBuffer[(xo + WO) * WW + (yo + WO + 1) * W + (zo + WO)] = i; + } + if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO - 1)] == -2) + { + checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO - 1)] = i; + } + if (checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO + 1)] == -2) + { + checkBuffer[(xo + WO) * WW + (yo + WO) * W + (zo + WO + 1)] = i; + } + } + } + } + } + + int mid = checkBuffer[(WO) * WW + (WO) * W + (WO)]; + if (mid >= 0) { - level->setDataNoUpdate(x, y, z, currentData & ~UPDATE_LEAF_BIT); - } + level->setData(x, y, z, currentData & ~UPDATE_LEAF_BIT, Tile::UPDATE_NONE); + } else { - die(level, x, y, z); - } - } + die(level, x, y, z); + } + } } @@ -214,8 +214,8 @@ void LeafTile::animateTick(Level *level, int x, int y, int z, Random *random) void LeafTile::die(Level *level, int x, int y, int z) { - Tile::spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + Tile::spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); } int LeafTile::getResourceCount(Random *random) @@ -238,13 +238,30 @@ void LeafTile::spawnResources(Level *level, int x, int y, int z, int data, float { chance = 40; } + if (playerBonusLevel > 0) + { + chance -= 2 << playerBonusLevel; + if (chance < 10) + { + chance = 10; + } + } if (level->random->nextInt(chance) == 0) { int type = getResource(data, level->random,playerBonusLevel); popResource(level, x, y, z, shared_ptr( new ItemInstance(type, 1, getSpawnResourcesAuxValue(data)))); } - if ((data & LEAF_TYPE_MASK) == NORMAL_LEAF && level->random->nextInt(200) == 0) + chance = 200; + if (playerBonusLevel > 0) + { + chance -= 10 << playerBonusLevel; + if (chance < 40) + { + chance = 40; + } + } + if ((data & LEAF_TYPE_MASK) == NORMAL_LEAF && level->random->nextInt(chance) == 0) { popResource(level, x, y, z, shared_ptr(new ItemInstance(Item::apple_Id, 1, 0))); } @@ -253,20 +270,20 @@ void LeafTile::spawnResources(Level *level, int x, int y, int z, int data, float void LeafTile::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { - if (!level->isClientSide && player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears->id) + if (!level->isClientSide && player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears->id) { - player->awardStat( + player->awardStat( GenericStats::blocksMined(id), GenericStats::param_blocksMined(id,data,1) ); - // drop leaf block instead of sapling - popResource(level, x, y, z, shared_ptr(new ItemInstance(Tile::leaves_Id, 1, data & LEAF_TYPE_MASK))); - } + // drop leaf block instead of sapling + popResource(level, x, y, z, shared_ptr(new ItemInstance(Tile::leaves_Id, 1, data & LEAF_TYPE_MASK))); + } else { - TransparentTile::playerDestroy(level, player, x, y, z, data); - } + TransparentTile::playerDestroy(level, player, x, y, z, data); + } } int LeafTile::getSpawnResourcesAuxValue(int data) @@ -284,21 +301,25 @@ bool LeafTile::isSolidRender(bool isServerLevel) Icon *LeafTile::getTexture(int face, int data) { - if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF) + if ((data & LEAF_TYPE_MASK) == EVERGREEN_LEAF) { - return icons[fancyTextureSet][EVERGREEN_LEAF]; - } - if ((data & LEAF_TYPE_MASK) == JUNGLE_LEAF) + return icons[fancyTextureSet][EVERGREEN_LEAF]; + } + if ((data & LEAF_TYPE_MASK) == JUNGLE_LEAF) + { + return icons[fancyTextureSet][JUNGLE_LEAF]; + } + if ((data & LEAF_TYPE_MASK) == BIRCH_LEAF) { - return icons[fancyTextureSet][JUNGLE_LEAF]; - } - return icons[fancyTextureSet][0]; + return icons[fancyTextureSet][BIRCH_LEAF]; + } + return icons[fancyTextureSet][0]; } void LeafTile::setFancy(bool fancyGraphics) { - allowSame = fancyGraphics; - fancyTextureSet = (fancyGraphics ? 0 : 1); + allowSame = fancyGraphics; + fancyTextureSet = (fancyGraphics ? 0 : 1); } shared_ptr LeafTile::getSilkTouchItemInstance(int data) @@ -314,7 +335,7 @@ void LeafTile::stepOn(Level *level, int x, int y, int z, shared_ptr enti bool LeafTile::shouldTileTick(Level *level, int x,int y,int z) { int currentData = level->getData(x, y, z); - return (currentData & UPDATE_LEAF_BIT) != 0; + return (currentData & UPDATE_LEAF_BIT) != 0; } unsigned int LeafTile::getDescriptionId(int iData /*= -1*/) diff --git a/Minecraft.World/LeapAtTargetGoal.cpp b/Minecraft.World/LeapAtTargetGoal.cpp index ea4a1c0e..6aebc9a8 100644 --- a/Minecraft.World/LeapAtTargetGoal.cpp +++ b/Minecraft.World/LeapAtTargetGoal.cpp @@ -5,7 +5,7 @@ LeapAtTargetGoal::LeapAtTargetGoal(Mob *mob, float yd) { - target = weak_ptr(); + target = weak_ptr(); this->mob = mob; this->yd = yd; @@ -14,7 +14,7 @@ LeapAtTargetGoal::LeapAtTargetGoal(Mob *mob, float yd) bool LeapAtTargetGoal::canUse() { - target = weak_ptr(mob->getTarget()); + target = weak_ptr(mob->getTarget()); if (target.lock() == NULL) return false; double d = mob->distanceToSqr(target.lock()); if (d < 2 * 2 || d > 4 * 4) return false; diff --git a/Minecraft.World/LeapAtTargetGoal.h b/Minecraft.World/LeapAtTargetGoal.h index 6495e131..a6e667ed 100644 --- a/Minecraft.World/LeapAtTargetGoal.h +++ b/Minecraft.World/LeapAtTargetGoal.h @@ -6,7 +6,7 @@ class LeapAtTargetGoal : public Goal { private: Mob *mob; // Owner of this goal - weak_ptr target; + weak_ptr target; float yd; public: diff --git a/Minecraft.World/LeashFenceKnotEntity.cpp b/Minecraft.World/LeashFenceKnotEntity.cpp new file mode 100644 index 00000000..21f98a6a --- /dev/null +++ b/Minecraft.World/LeashFenceKnotEntity.cpp @@ -0,0 +1,157 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.phys.h" +#include "LeashFenceKnotEntity.h" + +void LeashFenceKnotEntity::_init() +{ + defineSynchedData(); +} + +LeashFenceKnotEntity::LeashFenceKnotEntity(Level *level) : HangingEntity(level) +{ + _init(); +} + +LeashFenceKnotEntity::LeashFenceKnotEntity(Level *level, int xTile, int yTile, int zTile) : HangingEntity(level, xTile, yTile, zTile, 0) +{ + _init(); + setPos(xTile + .5, yTile + .5, zTile + .5); +} + +void LeashFenceKnotEntity::defineSynchedData() +{ + HangingEntity::defineSynchedData(); +} + +void LeashFenceKnotEntity::setDir(int dir) +{ + // override to do nothing, knots don't have directions +} + +int LeashFenceKnotEntity::getWidth() +{ + return 9; +} + +int LeashFenceKnotEntity::getHeight() +{ + return 9; +} + +bool LeashFenceKnotEntity::shouldRenderAtSqrDistance(double distance) +{ + return distance < 32 * 32; +} + +void LeashFenceKnotEntity::dropItem(shared_ptr causedBy) +{ + +} + +bool LeashFenceKnotEntity::save(CompoundTag *entityTag) +{ + // knots are not saved, they are recreated by the entities that are tied + return false; +} + +void LeashFenceKnotEntity::addAdditonalSaveData(CompoundTag *tag) +{ +} + +void LeashFenceKnotEntity::readAdditionalSaveData(CompoundTag *tag) +{ +} + +bool LeashFenceKnotEntity::interact(shared_ptr player) +{ + shared_ptr item = player->getCarriedItem(); + + bool attachedMob = false; + if (item != NULL && item->id == Item::lead_Id) + { + if (!level->isClientSide) + { + // look for entities that can be attached to the fence + double range = 7; + vector > *mobs = level->getEntitiesOfClass(typeid(Mob), AABB::newTemp(x - range, y - range, z - range, x + range, y + range, z + range)); + if (mobs != NULL) + { + for(AUTO_VAR(it, mobs->begin()); it != mobs->end(); ++it) + { + shared_ptr mob = dynamic_pointer_cast( *it ); + if (mob->isLeashed() && mob->getLeashHolder() == player) + { + mob->setLeashedTo(shared_from_this(), true); + attachedMob = true; + } + } + delete mobs; + } + } + } + if (!level->isClientSide && !attachedMob) + { + remove(); + + if (player->abilities.instabuild) + { + // if the player is in creative mode, attempt to remove all leashed mobs without dropping additional items + double range = 7; + vector > *mobs = level->getEntitiesOfClass(typeid(Mob), AABB::newTemp(x - range, y - range, z - range, x + range, y + range, z + range)); + if (mobs != NULL) + { + for(AUTO_VAR(it, mobs->begin()); it != mobs->end(); ++it) + { + shared_ptr mob = dynamic_pointer_cast( *it ); + if (mob->isLeashed() && mob->getLeashHolder() == shared_from_this()) + { + mob->dropLeash(true, false); + } + } + delete mobs; + } + } + } + return true; +} + +bool LeashFenceKnotEntity::survives() +{ + // knots are placed on top of fence tiles + int tile = level->getTile(xTile, yTile, zTile); + if (Tile::tiles[tile] != NULL && Tile::tiles[tile]->getRenderShape() == Tile::SHAPE_FENCE) + { + return true; + } + return false; +} + +shared_ptr LeashFenceKnotEntity::createAndAddKnot(Level *level, int x, int y, int z) +{ + shared_ptr knot = shared_ptr( new LeashFenceKnotEntity(level, x, y, z) ); + knot->forcedLoading = true; + level->addEntity(knot); + return knot; +} + +shared_ptr LeashFenceKnotEntity::findKnotAt(Level *level, int x, int y, int z) +{ + vector > *knots = level->getEntitiesOfClass(typeid(LeashFenceKnotEntity), AABB::newTemp(x - 1.0, y - 1.0, z - 1.0, x + 1.0, y + 1.0, z + 1.0)); + if (knots != NULL) + { + for(AUTO_VAR(it, knots->begin()); it != knots->end(); ++it) + { + shared_ptr knot = dynamic_pointer_cast( *it ); + if (knot->xTile == x && knot->yTile == y && knot->zTile == z) + { + delete knots; + return knot; + } + } + delete knots; + } + return nullptr; +} \ No newline at end of file diff --git a/Minecraft.World/LeashFenceKnotEntity.h b/Minecraft.World/LeashFenceKnotEntity.h new file mode 100644 index 00000000..1bf3a7b7 --- /dev/null +++ b/Minecraft.World/LeashFenceKnotEntity.h @@ -0,0 +1,36 @@ +#pragma once + +#include "HangingEntity.h" + +class LeashFenceKnotEntity : public HangingEntity +{ + +public: + eINSTANCEOF GetType() { return eTYPE_LEASHFENCEKNOT; }; + static Entity *create(Level *level) { return new LeashFenceKnotEntity(level); } + +private: + + void _init(); + +public: + LeashFenceKnotEntity(Level *level); + LeashFenceKnotEntity(Level *level, int xTile, int yTile, int zTile); + +protected: + void defineSynchedData(); + +public: + void setDir(int dir); + int getWidth(); + int getHeight(); + bool shouldRenderAtSqrDistance(double distance); + void dropItem(shared_ptr causedBy); + bool save(CompoundTag *entityTag); + void addAdditonalSaveData(CompoundTag *tag); + void readAdditionalSaveData(CompoundTag *tag); + bool interact(shared_ptr player); + virtual bool survives(); + static shared_ptr createAndAddKnot(Level *level, int x, int y, int z); + static shared_ptr findKnotAt(Level *level, int x, int y, int z); +}; \ No newline at end of file diff --git a/Minecraft.World/LeashItem.cpp b/Minecraft.World/LeashItem.cpp new file mode 100644 index 00000000..d8d7b3fc --- /dev/null +++ b/Minecraft.World/LeashItem.cpp @@ -0,0 +1,74 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.phys.h" +#include "LeashItem.h" + +LeashItem::LeashItem(int id) : Item(id) +{ +} + +bool LeashItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +{ + int tile = level->getTile(x, y, z); + if (Tile::tiles[tile] != NULL && Tile::tiles[tile]->getRenderShape() == Tile::SHAPE_FENCE) + { + if (bTestUseOnOnly) return bindPlayerMobsTest(player, level, x,y,z); + + if (level->isClientSide) + { + return true; + } + + bindPlayerMobs(player, level, x, y, z); + return true; + } + return false; +} + +bool LeashItem::bindPlayerMobs(shared_ptr player, Level *level, int x, int y, int z) +{ + // check if there is a knot at the given coordinate + shared_ptr activeKnot = LeashFenceKnotEntity::findKnotAt(level, x, y, z); + + // look for entities that can be attached to the fence + bool foundMobs = false; + double range = 7; + vector > *mobs = level->getEntitiesOfClass(typeid(Mob), AABB::newTemp(x - range, y - range, z - range, x + range, y + range, z + range)); + if (mobs != NULL) + { + for(AUTO_VAR(it,mobs->begin()); it != mobs->end(); ++it) + { + shared_ptr mob = dynamic_pointer_cast(*it); + if (mob->isLeashed() && mob->getLeashHolder() == player) + { + if (activeKnot == NULL) + { + activeKnot = LeashFenceKnotEntity::createAndAddKnot(level, x, y, z); + } + mob->setLeashedTo(activeKnot, true); + foundMobs = true; + } + } + } + return foundMobs; +} + +// 4J-JEV: Similar to bindPlayerMobs, but doesn't actually bind mobs, +bool LeashItem::bindPlayerMobsTest(shared_ptr player, Level *level, int x, int y, int z) +{ + // look for entities that can be attached to the fence + double range = 7; + vector > *mobs = level->getEntitiesOfClass(typeid(Mob), AABB::newTemp(x - range, y - range, z - range, x + range, y + range, z + range)); + + if (mobs != NULL) + { + for(AUTO_VAR(it,mobs->begin()); it != mobs->end(); ++it) + { + shared_ptr mob = dynamic_pointer_cast(*it); + if (mob->isLeashed() && mob->getLeashHolder() == player) return true; + } + } + return false; +} \ No newline at end of file diff --git a/Minecraft.World/LeashItem.h b/Minecraft.World/LeashItem.h new file mode 100644 index 00000000..373bfdfa --- /dev/null +++ b/Minecraft.World/LeashItem.h @@ -0,0 +1,13 @@ +#pragma once + +#include "Item.h" + +class LeashItem : public Item +{ +public: + LeashItem(int id); + + bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + static bool bindPlayerMobs(shared_ptr player, Level *level, int x, int y, int z); + static bool bindPlayerMobsTest(shared_ptr player, Level *level, int x, int y, int z); +}; \ No newline at end of file diff --git a/Minecraft.World/Level.cpp b/Minecraft.World/Level.cpp index 4b6a64f5..f9c383ed 100644 --- a/Minecraft.World/Level.cpp +++ b/Minecraft.World/Level.cpp @@ -18,14 +18,11 @@ #include "net.minecraft.world.level.levelgen.h" #include "net.minecraft.world.level.storage.h" #include "net.minecraft.world.level.pathfinder.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.scores.h" #include "net.minecraft.world.phys.h" -#include "ChunkPos.h" #include "Explosion.h" #include "LevelListener.h" -#include "LightLayer.h" -#include "MobSpawner.h" -#include "Region.h" -#include "TickNextTickData.h" #include "Level.h" #include "ThreadName.h" #include "WeighedRandom.h" @@ -41,6 +38,7 @@ #include "..\Minecraft.Client\DLCTexturePack.h" #include "..\Minecraft.Client\Common\DLC\DLCPack.h" #include "..\Minecraft.Client\PS3\PS3Extras\ShutdownManager.h" +#include "..\Minecraft.Client\MinecraftServer.h" DWORD Level::tlsIdx = TlsAlloc(); @@ -103,12 +101,80 @@ void Level::destroyLightingCache() XPhysicalFree(cache); } -void Level::initCache(lightCache_t *cache) +inline int GetIndex(int x, int y, int z) +{ + return ( ( x & 15 ) << 8 ) | ( ( y & 15 ) << 4 ) | ( z & 15 ); +} + +void Level::initCachePartial(lightCache_t *cache, int xc, int yc, int zc) { cachewritten = false; if( cache == NULL ) return; + int idx; + if( !(yc & 0xffffff00) ) + { + idx = GetIndex(xc, yc, zc); + cache[idx] = 0; + idx = GetIndex(xc - 1, yc, zc); + cache[idx] = 0; + idx = GetIndex(xc + 1, yc, zc); + cache[idx] = 0; + idx = GetIndex(xc, yc, zc - 1); + cache[idx] = 0; + idx = GetIndex(xc, yc, zc + 1); + cache[idx] = 0; + } + if( !((yc-1) & 0xffffff00) ) + { + idx = GetIndex(xc, yc - 1, zc); + cache[idx] = 0; + } + if( !((yc+1) & 0xffffff00) ) + { + idx = GetIndex(xc, yc + 1, zc); + cache[idx] = 0; + } +} + +void Level::initCacheComplete(lightCache_t *cache, int xc, int yc, int zc) +{ + lightCache_t old[7]; + if( !(yc & 0xffffff00) ) + { + old[0] = cache[GetIndex(xc, yc, zc)]; + old[1] = cache[GetIndex(xc - 1, yc, zc)]; + old[2] = cache[GetIndex(xc + 1, yc, zc)]; + old[5] = cache[GetIndex(xc, yc, zc - 1)]; + old[6] = cache[GetIndex(xc, yc, zc + 1)]; + } + if( !((yc-1) & 0xffffff00) ) + { + old[3] = cache[GetIndex(xc, yc - 1, zc)]; + } + if( !((yc+1) & 0xffffff00) ) + { + old[4] = cache[GetIndex(xc, yc + 1, zc)]; + } + XMemSet128(cache,0,16*16*16*sizeof(lightCache_t)); + + if( !(yc & 0xffffff00) ) + { + cache[GetIndex(xc, yc, zc)] = old[0]; + cache[GetIndex(xc - 1, yc, zc)] = old[1]; + cache[GetIndex(xc + 1, yc, zc)] = old[2]; + cache[GetIndex(xc, yc, zc - 1)] = old[5]; + cache[GetIndex(xc, yc, zc + 1)] = old[6]; + } + if( !((yc-1) & 0xffffff00) ) + { + cache[GetIndex(xc, yc - 1, zc)] = old[3]; + } + if( !((yc+1) & 0xffffff00) ) + { + cache[GetIndex(xc, yc + 1, zc)] = old[4]; + } } // Set a brightness value, going through the cache if enabled for this thread @@ -122,15 +188,15 @@ void inline Level::setBrightnessCached(lightCache_t *cache, __uint64 *cacheUse, if( y & 0xffffff00 ) return; // Eliminate -ve ys and values > 255 int idx = ( ( x & 15 ) << 8 ) | - ( ( y & 15 ) << 4 ) | - ( z & 15 ); + ( ( y & 15 ) << 4 ) | + ( z & 15 ); lightCache_t posbits = ( ( x & 0x3f0 ) << 6 ) | - ( ( y & 0x0f0 ) << 2 ) | - ( ( z & 0x3f0 ) >> 4 ); + ( ( y & 0x0f0 ) << 2 ) | + ( ( z & 0x3f0 ) >> 4 ); #ifdef _LARGE_WORLDS // Add in the higher bits for x and z posbits |= ( ( ((__uint64)x) & 0x3FFFC00L) << 38) | - ( ( ((__uint64)z) & 0x3FFFC00L) << 22); + ( ( ((__uint64)z) & 0x3FFFC00L) << 22); #endif lightCache_t cacheValue = cache[idx]; @@ -181,15 +247,15 @@ inline int Level::getBrightnessCached(lightCache_t *cache, LightLayer::variety l if( y & 0xffffff00 ) return getBrightness(layer, x, y, z); // Fall back on original method for out-of-bounds y int idx = ( ( x & 15 ) << 8 ) | - ( ( y & 15 ) << 4 ) | - ( z & 15 ); + ( ( y & 15 ) << 4 ) | + ( z & 15 ); lightCache_t posbits = ( ( x & 0x3f0 ) << 6 ) | - ( ( y & 0x0f0 ) << 2 ) | - ( ( z & 0x3f0 ) >> 4 ); + ( ( y & 0x0f0 ) << 2 ) | + ( ( z & 0x3f0 ) >> 4 ); #ifdef _LARGE_WORLDS // Add in the higher bits for x and z posbits |= ( ( ((__uint64)x) & 0x3FFFC00L) << 38) | - ( ( ((__uint64)z) & 0x3FFFC00L) << 22); + ( ( ((__uint64)z) & 0x3FFFC00L) << 22); #endif lightCache_t cacheValue = cache[idx]; @@ -248,15 +314,15 @@ inline int Level::getEmissionCached(lightCache_t *cache, int ct, int x, int y, i if( cache == NULL ) return Tile::lightEmission[ct]; int idx = ( ( x & 15 ) << 8 ) | - ( ( y & 15 ) << 4 ) | - ( z & 15 ); + ( ( y & 15 ) << 4 ) | + ( z & 15 ); lightCache_t posbits = ( ( x & 0x3f0 ) << 6 ) | - ( ( y & 0x0f0 ) << 2 ) | - ( ( z & 0x3f0 ) >> 4 ); + ( ( y & 0x0f0 ) << 2 ) | + ( ( z & 0x3f0 ) >> 4 ); #ifdef _LARGE_WORLDS // Add in the higher bits for x and z posbits |= ( ( ((__uint64)x) & 0x3FFFC00) << 38) | - ( ( ((__uint64)z) & 0x3FFFC00) << 22); + ( ( ((__uint64)z) & 0x3FFFC00) << 22); #endif lightCache_t cacheValue = cache[idx]; @@ -285,7 +351,7 @@ inline int Level::getEmissionCached(lightCache_t *cache, int ct, int x, int y, i #endif setBrightness(LightLayer::Block, xx, yy, zz, val, true); } - + // Update both emission & blocking values whilst we are here cacheValue = posbits | EMISSION_VALID | BLOCKING_VALID; int t = getTile(x,y,z); @@ -324,15 +390,15 @@ inline int Level::getBlockingCached(lightCache_t *cache, LightLayer::variety lay } int idx = ( ( x & 15 ) << 8 ) | - ( ( y & 15 ) << 4 ) | - ( z & 15 ); + ( ( y & 15 ) << 4 ) | + ( z & 15 ); lightCache_t posbits = ( ( x & 0x3f0 ) << 6 ) | - ( ( y & 0x0f0 ) << 2 ) | - ( ( z & 0x3f0 ) >> 4 ); + ( ( y & 0x0f0 ) << 2 ) | + ( ( z & 0x3f0 ) >> 4 ); #ifdef _LARGE_WORLDS // Add in the higher bits for x and z posbits |= ( ( ((__uint64)x) & 0x3FFFC00L) << 38) | - ( ( ((__uint64)z) & 0x3FFFC00L) << 22); + ( ( ((__uint64)z) & 0x3FFFC00L) << 22); #endif lightCache_t cacheValue = cache[idx]; @@ -361,7 +427,7 @@ inline int Level::getBlockingCached(lightCache_t *cache, LightLayer::variety lay #endif setBrightness(layer, xx, yy, zz, val, true); } - + // Update both emission & blocking values whilst we are here cacheValue = posbits | EMISSION_VALID | BLOCKING_VALID; int t = getTile(x,y,z); @@ -488,11 +554,7 @@ void Level::_init() oThunderLevel = thunderLevel = 0.0f; - lightningTime = 0; - - lightningBoltTime = 0; - - noNeighborUpdate = false; + skyFlashTime = 0; difficulty = 0; @@ -522,11 +584,10 @@ void Level::_init() InitializeCriticalSection(&m_entitiesCS); InitializeCriticalSection(&m_tileEntityListCS); - m_timeOfDayOverride = -1; - updatingTileEntities = false; villageSiege = new VillageSiege(this); + scoreboard = new Scoreboard(); toCheckLevel = new int[ 32 * 32 * 32]; // 4J - brought forward from 1.8.2 InitializeCriticalSectionAndSpinCount(&m_checkLightCS, 5120); // 4J - added for 1.8.2 lighting @@ -540,17 +601,17 @@ void Level::_init() // 4J - brought forward from 1.8.2 Biome *Level::getBiome(int x, int z) { - if (hasChunkAt(x, 0, z)) + if (hasChunkAt(x, 0, z)) { - LevelChunk *lc = getChunkAt(x, z); - if (lc != NULL) + LevelChunk *lc = getChunkAt(x, z); + if (lc != NULL) { // Water chunks at the edge of the world return NULL for their biome as they can't store it, so should fall back on the normal method below Biome *biome = lc->getBiome(x & 0xf, z & 0xf, dimension->biomeSource); - if( biome ) return biome; - } - } - return dimension->biomeSource->getBiome(x, z); + if( biome ) return biome; + } + } + return dimension->biomeSource->getBiome(x, z); } BiomeSource *Level::getBiomeSource() @@ -564,9 +625,9 @@ Level::Level(shared_ptr levelStorage, const wstring& name, Dimensi _init(); this->levelStorage = levelStorage;//shared_ptr(levelStorage); this->dimension = dimension; - this->levelData = new LevelData(levelSettings, name); + levelData = new LevelData(levelSettings, name); if( !this->levelData->useNewSeaLevel() ) seaLevel = Level::genDepth / 2; // 4J added - sea level is one unit lower since 1.8.2, maintain older height for old levels - this->savedDataStorage = new SavedDataStorage(levelStorage.get()); + savedDataStorage = new SavedDataStorage(levelStorage.get()); shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); if (savedVillages == NULL) @@ -587,36 +648,6 @@ Level::Level(shared_ptr levelStorage, const wstring& name, Dimensi prepareWeather(); } - -Level::Level(Level *level, Dimension *dimension) - :seaLevel( constSeaLevel ) -{ - _init(); - this->levelStorage = level->levelStorage; - this->levelData = new LevelData(level->levelData); - if( !this->levelData->useNewSeaLevel() ) seaLevel = Level::genDepth / 2; // 4J added - sea level is one unit lower since 1.8.2, maintain older height for old levels - this->savedDataStorage = new SavedDataStorage( levelStorage.get() ); - - shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); - if (savedVillages == NULL) - { - villages = shared_ptr(new Villages(this)); - savedDataStorage->set(Villages::VILLAGE_FILE_ID, villages); - } - else - { - villages = savedVillages; - villages->setLevel(this); - } - - this->dimension = dimension; - dimension->init(this); - chunkSource = NULL; - updateSkyBrightness(); - prepareWeather(); -} - - Level::Level(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings) : seaLevel( constSeaLevel ) { @@ -634,7 +665,7 @@ void Level::_init(shared_ptrlevelStorage, const wstring& levelName { _init(); this->levelStorage = levelStorage;//shared_ptr(levelStorage); - this->savedDataStorage = new SavedDataStorage(levelStorage.get()); + savedDataStorage = new SavedDataStorage(levelStorage.get()); shared_ptr savedVillages = dynamic_pointer_cast(savedDataStorage->get(typeid(Villages), Villages::VILLAGE_FILE_ID)); if (savedVillages == NULL) @@ -676,7 +707,7 @@ void Level::_init(shared_ptrlevelStorage, const wstring& levelName if( !this->levelData->useNewSeaLevel() ) seaLevel = Level::genDepth / 2; // 4J added - sea level is one unit lower since 1.8.2, maintain older height for old levels ((Dimension *) dimension)->init( this ); - + chunkSource = doCreateChunkSource ? createChunkSource() : NULL; // 4J - added flag so chunk source can be called from derived class instead // 4J Stu- Moved to derived classes @@ -698,6 +729,8 @@ Level::~Level() delete chunkSource; delete levelData; delete toCheckLevel; + delete scoreboard; + delete villageSiege; if( !isClientSide ) { @@ -715,8 +748,8 @@ Level::~Level() // 4J Stu - At least one of the listeners is something we cannot delete, the LevelRenderer /* for(int i = 0; i < listeners.size(); i++) - delete listeners[i]; - */ + delete listeners[i]; + */ } void Level::initializeLevel(LevelSettings *settings) @@ -791,6 +824,16 @@ int Level::getTileRenderShape(int x, int y, int z) return Tile::SHAPE_INVISIBLE; } +// 4J Added to slightly optimise and avoid getTile call if we already know the tile +int Level::getTileRenderShape(int t) +{ + if (Tile::tiles[t] != NULL) + { + return Tile::tiles[t]->getRenderShape(); + } + return Tile::SHAPE_INVISIBLE; +} + bool Level::hasChunkAt(int x, int y, int z) { if (y < minBuildHeight || y >= maxBuildHeight) return false; @@ -870,13 +913,7 @@ LevelChunk *Level::getChunk(int x, int z) return this->chunkSource->getChunk(x, z); } - -bool Level::setTileAndDataNoUpdate(int x, int y, int z, int tile, int data) -{ - return setTileAndDataNoUpdate(x, y, z, tile, data, true); -} - -bool Level::setTileAndDataNoUpdate(int x, int y, int z, int tile, int data, bool informClients) +bool Level::setTileAndData(int x, int y, int z, int tile, int data, int updateFlags) { if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) { @@ -885,56 +922,44 @@ bool Level::setTileAndDataNoUpdate(int x, int y, int z, int tile, int data, bool if (y < 0) return false; if (y >= maxBuildHeight) return false; LevelChunk *c = getChunk(x >> 4, z >> 4); - // 4J - changes for lighting brought forward from 1.8.2 + + int oldTile = 0; + if ((updateFlags & Tile::UPDATE_NEIGHBORS) != 0) + { + oldTile = c->getTile(x & 15, y, z & 15); + } bool result; #ifndef _CONTENT_PACKAGE int old = c->getTile(x & 15, y, z & 15); int olddata = c->getData( x & 15, y, z & 15); #endif result = c->setTileAndData(x & 15, y, z & 15, tile, data); + if( updateFlags != Tile::UPDATE_INVISIBLE_NO_LIGHT) + { #ifndef _CONTENT_PACKAGE - PIXBeginNamedEvent(0,"Checking light %d %d %d",x,y,z); - PIXBeginNamedEvent(0,"was %d, %d now %d, %d",old,olddata,tile,data); + PIXBeginNamedEvent(0,"Checking light %d %d %d",x,y,z); + PIXBeginNamedEvent(0,"was %d, %d now %d, %d",old,olddata,tile,data); #endif - this->checkLight(x, y, z); - PIXEndNamedEvent(); - PIXEndNamedEvent(); - if (informClients && result && (isClientSide || c->seenByPlayer)) sendTileUpdated(x, y, z); - return result; -} - - -bool Level::setTileNoUpdate(int x, int y, int z, int tile) -{ - if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) - { - return false; + checkLight(x, y, z); + PIXEndNamedEvent(); + PIXEndNamedEvent(); } - if (y < 0) return false; - if (y >= maxBuildHeight) return false; - LevelChunk *c = getChunk(x >> 4, z >> 4); - // 4J - changes for lighting brought forward from 1.8.2 - bool result = c->setTile(x & 15, y, z & 15, tile); - this->checkLight(x, y, z); - if (result && (isClientSide || c->seenByPlayer)) sendTileUpdated(x, y, z); - return result; -} - -bool Level::setTileNoUpdateNoLightCheck(int x, int y, int z, int tile) -{ - if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) + if (result) { - return false; + if ((updateFlags & Tile::UPDATE_CLIENTS) != 0 && !(isClientSide && (updateFlags & Tile::UPDATE_INVISIBLE) != 0)) + { + sendTileUpdated(x, y, z); + } + if (!isClientSide && (updateFlags & Tile::UPDATE_NEIGHBORS) != 0) + { + tileUpdated(x, y, z, oldTile); + Tile *tobj = Tile::tiles[tile]; + if (tobj != NULL && tobj->hasAnalogOutputSignal()) updateNeighbourForOutputSignal(x, y, z, tile); + } } - if (y < 0) return false; - if (y >= maxBuildHeight) return false; - LevelChunk *c = getChunk(x >> 4, z >> 4); - // 4J - changes for lighting brought forward from 1.8.2 - bool result = c->setTile(x & 15, y, z & 15, tile); return result; } - Material *Level::getMaterial(int x, int y, int z) { int t = getTile(x, y, z); @@ -942,7 +967,6 @@ Material *Level::getMaterial(int x, int y, int z) return Tile::tiles[t]->material; } - int Level::getData(int x, int y, int z) { if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) @@ -957,16 +981,7 @@ int Level::getData(int x, int y, int z) return c->getData(x, y, z); } - -void Level::setData(int x, int y, int z, int data, bool forceUpdate/*=false*/) // 4J added forceUpdate -{ - if (setDataNoUpdate(x, y, z, data) || forceUpdate) - { - tileUpdated(x, y, z, getTile(x, y, z)); - } -} - -bool Level::setDataNoUpdate(int x, int y, int z, int data) +bool Level::setData(int x, int y, int z, int data, int updateFlags, bool forceUpdate/*=false*/) // 4J added forceUpdate) { if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) { @@ -985,30 +1000,65 @@ bool Level::setDataNoUpdate(int x, int y, int z, int data) bool maskedBitsChanged; bool result = c->setData(cx, y, cz, data, importantMask, &maskedBitsChanged); - if (result && (isClientSide || (c->seenByPlayer && sendTileData && maskedBitsChanged))) sendTileUpdated(x, y, z); + if (result || forceUpdate) + { + int tile = c->getTile(cx, y, cz); + if (forceUpdate || ((updateFlags & Tile::UPDATE_CLIENTS) != 0 && !(isClientSide && (updateFlags & Tile::UPDATE_INVISIBLE) != 0))) + { + sendTileUpdated(x, y, z); + } + if (!isClientSide && (forceUpdate || (updateFlags & Tile::UPDATE_NEIGHBORS) != 0) ) + { + tileUpdated(x, y, z, tile); + Tile *tobj = Tile::tiles[tile]; + if (tobj != NULL && tobj->hasAnalogOutputSignal()) updateNeighbourForOutputSignal(x, y, z, tile); + } + } return result; } +/** +* Sets a tile to air without dropping resources or showing any animation. +* +* @param x +* @param y +* @param z +* @return +*/ +bool Level::removeTile(int x, int y, int z) +{ + return setTileAndData(x, y, z, 0, 0, Tile::UPDATE_ALL); +} -bool Level::setTile(int x, int y, int z, int tile) +/** +* Sets a tile to air and plays a destruction animation, with option to also +* drop resources. +* +* @param x +* @param y +* @param z +* @param dropResources +* @return True if anything was changed +*/ +bool Level::destroyTile(int x, int y, int z, bool dropResources) { - if (setTileNoUpdate(x, y, z, tile)) + int tile = getTile(x, y, z); + if (tile > 0) { - tileUpdated(x, y, z, tile); - return true; + int data = getData(x, y, z); + levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, x, y, z, tile + (data << Tile::TILE_NUM_SHIFT)); + if (dropResources) + { + Tile::tiles[tile]->spawnResources(this, x, y, z, data, 0); + } + return setTileAndData(x, y, z, 0, 0, Tile::UPDATE_ALL); } return false; } - -bool Level::setTileAndData(int x, int y, int z, int tile, int data) +bool Level::setTileAndUpdate(int x, int y, int z, int tile) { - if (setTileAndDataNoUpdate(x, y, z, tile, data)) - { - tileUpdated(x, y, z, tile); - return true; - } - return false; + return setTileAndData(x, y, z, tile, 0, Tile::UPDATE_ALL); } void Level::sendTileUpdated(int x, int y, int z) @@ -1022,10 +1072,9 @@ void Level::sendTileUpdated(int x, int y, int z) void Level::tileUpdated(int x, int y, int z, int tile) { - this->updateNeighborsAt(x, y, z, tile); + updateNeighborsAt(x, y, z, tile); } - void Level::lightColumnChanged(int x, int z, int y0, int y1) { PIXBeginNamedEvent(0,"LightColumnChanged (%d,%d) %d to %d",x,z,y0,y1); @@ -1073,22 +1122,6 @@ void Level::setTilesDirty(int x0, int y0, int z0, int x1, int y1, int z1) } } - -void Level::swap(int x1, int y1, int z1, int x2, int y2, int z2) -{ - int t1 = getTile(x1, y1, z1); - int d1 = getData(x1, y1, z1); - int t2 = getTile(x2, y2, z2); - int d2 = getData(x2, y2, z2); - - setTileAndDataNoUpdate(x1, y1, z1, t2, d2); - setTileAndDataNoUpdate(x2, y2, z2, t1, d1); - - updateNeighborsAt(x1, y1, z1, t2); - updateNeighborsAt(x2, y2, z2, t1); -} - - void Level::updateNeighborsAt(int x, int y, int z, int tile) { neighborChanged(x - 1, y, z, tile); @@ -1099,15 +1132,32 @@ void Level::updateNeighborsAt(int x, int y, int z, int tile) neighborChanged(x, y, z + 1, tile); } +void Level::updateNeighborsAtExceptFromFacing(int x, int y, int z, int tile, int skipFacing) +{ + if (skipFacing != Facing::WEST) neighborChanged(x - 1, y, z, tile); + if (skipFacing != Facing::EAST) neighborChanged(x + 1, y, z, tile); + if (skipFacing != Facing::DOWN) neighborChanged(x, y - 1, z, tile); + if (skipFacing != Facing::UP) neighborChanged(x, y + 1, z, tile); + if (skipFacing != Facing::NORTH) neighborChanged(x, y, z - 1, tile); + if (skipFacing != Facing::SOUTH) neighborChanged(x, y, z + 1, tile); +} void Level::neighborChanged(int x, int y, int z, int type) { - if (noNeighborUpdate || isClientSide) return; - Tile *tile = Tile::tiles[getTile(x, y, z)]; - if (tile != NULL) tile->neighborChanged(this, x, y, z, type); -} + if (isClientSide) return; + int id = getTile(x, y, z); + Tile *tile = Tile::tiles[id]; + if (tile != NULL) + { + tile->neighborChanged(this, x, y, z, type); + } +} +bool Level::isTileToBeTickedAt(int x, int y, int z, int tileId) +{ + return false; +} bool Level::canSeeSky(int x, int y, int z) { @@ -1139,13 +1189,7 @@ int Level::getRawBrightness(int x, int y, int z, bool propagate) if (propagate) { int id = getTile(x, y, z); - switch(id) - { - case Tile::stoneSlabHalf_Id: - case Tile::woodSlabHalf_Id: - case Tile::farmland_Id: - case Tile::stairs_stone_Id: - case Tile::stairs_wood_Id: + if (Tile::propagate[id]) { int br = getRawBrightness(x, y + 1, z, false); int br1 = getRawBrightness(x + 1, y, z, false); @@ -1158,8 +1202,6 @@ int Level::getRawBrightness(int x, int y, int z, bool propagate) if (br4 > br) br = br4; return br; } - break; - } } if (y < 0) return 0; @@ -1203,6 +1245,17 @@ int Level::getHeightmap(int x, int z) return c->getHeightmap(x & 15, z & 15); } +int Level::getLowestHeightmap(int x, int z) +{ + if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) + { + return 0; + } + if (!hasChunk(x >> 4, z >> 4)) return 0; + + LevelChunk *c = getChunk(x >> 4, z >> 4); + return c->lowestHeightmap; +} void Level::updateLightIfOtherThan(LightLayer::variety layer, int x, int y, int z, int expected) { @@ -1231,44 +1284,44 @@ int Level::getBrightnessPropagate(LightLayer::variety layer, int x, int y, int z { if (dimension->hasCeiling && layer == LightLayer::Sky) return 0; - if (y < 0) y = 0; - if (y >= maxBuildHeight && layer == LightLayer::Sky) + if (y < 0) y = 0; + if (y >= maxBuildHeight && layer == LightLayer::Sky) { // 4J Stu - The java LightLayer was an enum class type with a member "surrounding" which is what we // were returning here. Surrounding has the same value as the enum value in our C++ code, so just cast // it to an int return (int)layer; - } - if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) + } + if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) { // 4J Stu - The java LightLayer was an enum class type with a member "surrounding" which is what we // were returning here. Surrounding has the same value as the enum value in our C++ code, so just cast // it to an int return (int)layer; - } - int xc = x >> 4; - int zc = z >> 4; - if (!hasChunk(xc, zc)) return (int)layer; + } + int xc = x >> 4; + int zc = z >> 4; + if (!hasChunk(xc, zc)) return (int)layer; - { + { int id = tileId > -1 ? tileId : getTile(x,y,z); if (Tile::propagate[id]) { - int br = getBrightness(layer, x, y + 1, z); - int br1 = getBrightness(layer, x + 1, y, z); - int br2 = getBrightness(layer, x - 1, y, z); - int br3 = getBrightness(layer, x, y, z + 1); - int br4 = getBrightness(layer, x, y, z - 1); - if (br1 > br) br = br1; - if (br2 > br) br = br2; - if (br3 > br) br = br3; - if (br4 > br) br = br4; - return br; - } - } + int br = getBrightness(layer, x, y + 1, z); + int br1 = getBrightness(layer, x + 1, y, z); + int br2 = getBrightness(layer, x - 1, y, z); + int br3 = getBrightness(layer, x, y, z + 1); + int br4 = getBrightness(layer, x, y, z - 1); + if (br1 > br) br = br1; + if (br2 > br) br = br2; + if (br3 > br) br = br3; + if (br4 > br) br = br4; + return br; + } + } - LevelChunk *c = getChunk(xc, zc); - return c->getBrightness(layer, x & 15, y, z & 15); + LevelChunk *c = getChunk(xc, zc); + return c->getBrightness(layer, x & 15, y, z & 15); } int Level::getBrightness(LightLayer::variety layer, int x, int y, int z) @@ -1288,8 +1341,8 @@ int Level::getBrightness(LightLayer::variety layer, int x, int y, int z) if( c == NULL ) return (int)layer; - if (y < 0) y = 0; - if (y >= maxBuildHeight) y = maxBuildHeight - 1; + if (y < 0) y = 0; + if (y >= maxBuildHeight) y = maxBuildHeight - 1; return c->getBrightness(layer, x & 15, y, z & 15); } @@ -1410,9 +1463,9 @@ void Level::setTileBrightnessChanged(int x, int y, int z) int Level::getLightColor(int x, int y, int z, int emitt, int tileId/*=-1*/) { int s = getBrightnessPropagate(LightLayer::Sky, x, y, z, tileId); - int b = getBrightnessPropagate(LightLayer::Block, x, y, z, tileId); - if (b < emitt) b = emitt; - return s << 20 | b << 4; + int b = getBrightnessPropagate(LightLayer::Block, x, y, z, tileId); + if (b < emitt) b = emitt; + return s << 20 | b << 4; } float Level::getBrightness(int x, int y, int z, int emitt) @@ -1431,7 +1484,7 @@ float Level::getBrightness(int x, int y, int z) bool Level::isDay() { - return this->skyDarken < 4; + return skyDarken < 4; } @@ -1581,7 +1634,7 @@ HitResult *Level::clip(Vec3 *a, Vec3 *b, bool liquid, bool solidOnly) } -void Level::playSound(shared_ptr entity, int iSound, float volume, float pitch) +void Level::playEntitySound(shared_ptr entity, int iSound, float volume, float pitch) { if(entity == NULL) return; AUTO_VAR(itEnd, listeners.end()); @@ -1591,8 +1644,8 @@ void Level::playSound(shared_ptr entity, int iSound, float volume, float if(entity->GetType() == eTYPE_SERVERPLAYER) { //app.DebugPrintf("ENTITY is serverplayer\n"); - - (*it)->playSound(entity,iSound, entity->x, entity->y - entity->heightOffset, entity->z, volume, pitch); + + (*it)->playSound(iSound, entity->x, entity->y - entity->heightOffset, entity->z, volume, pitch); } else { @@ -1601,6 +1654,15 @@ void Level::playSound(shared_ptr entity, int iSound, float volume, float } } +void Level::playPlayerSound(shared_ptr entity, int iSound, float volume, float pitch) +{ + if (entity == NULL) return; + AUTO_VAR(itEnd, listeners.end()); + for (AUTO_VAR(it, listeners.begin()); it != itEnd; it++) + { + (*it)->playSoundExceptPlayer(entity, iSound, entity->x, entity->y - entity->heightOffset, entity->z, volume, pitch); + } +} //void Level::playSound(double x, double y, double z, const wstring& name, float volume, float pitch) void Level::playSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist) @@ -1612,7 +1674,7 @@ void Level::playSound(double x, double y, double z, int iSound, float volume, fl } } -void Level::playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist) +void Level::playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, bool distanceDelay, float fClipSoundDist) { } @@ -1634,9 +1696,9 @@ void Level::playMusic(double x, double y, double z, const wstring& string, float /* void Level::addParticle(const wstring& id, double x, double y, double z, double xd, double yd, double zd) { - AUTO_VAR(itEnd, listeners.end()); - for (AUTO_VAR(it, listeners.begin()); it != itEnd; it++) - (*it)->addParticle(id, x, y, z, xd, yd, zd); +AUTO_VAR(itEnd, listeners.end()); +for (AUTO_VAR(it, listeners.begin()); it != itEnd; it++) +(*it)->addParticle(id, x, y, z, xd, yd, zd); } */ @@ -1666,15 +1728,15 @@ bool Level::addEntity(shared_ptr e) return false; } - bool forced = false; - if (dynamic_pointer_cast( e ) != NULL) + bool forced = e->forcedLoading; + if (e->instanceof(eTYPE_PLAYER)) { forced = true; } if (forced || hasChunk(xc, zc)) { - if (dynamic_pointer_cast( e ) != NULL) + if (e->instanceof(eTYPE_PLAYER)) { shared_ptr player = dynamic_pointer_cast(e); @@ -1744,7 +1806,7 @@ void Level::removeEntity(shared_ptr e) e->ride(nullptr); } e->remove(); - if (dynamic_pointer_cast( e ) != NULL) + if (e->instanceof(eTYPE_PLAYER)) { vector >::iterator it = players.begin(); vector >::iterator itEnd = players.end(); @@ -1766,7 +1828,7 @@ void Level::removeEntityImmediately(shared_ptr e) { e->remove(); - if (dynamic_pointer_cast( e ) != NULL) + if (e->instanceof(eTYPE_PLAYER)) { vector >::iterator it = players.begin(); vector >::iterator itEnd = players.end(); @@ -1823,7 +1885,7 @@ void Level::removeListener(LevelListener *listener) // 4J - added noEntities and blockAtEdge parameter -AABBList *Level::getCubes(shared_ptr source, AABB *box, bool noEntities, bool blockAtEdge) +AABBList *Level::getCubes(shared_ptr source, AABB *box, bool noEntities/* = false*/, bool blockAtEdge/* = false*/) { boxes.clear(); int x0 = Mth::floor(box->x0); @@ -1843,7 +1905,7 @@ AABBList *Level::getCubes(shared_ptr source, AABB *box, bool noEntities, { for (int y = y0 - 1; y < y1; y++) { - Tile::rock->addAABBs(this, x, y, z, box, &boxes, source); + Tile::stone->addAABBs(this, x, y, z, box, &boxes, source); } } else @@ -1861,62 +1923,62 @@ AABBList *Level::getCubes(shared_ptr source, AABB *box, bool noEntities, } } } - // 4J - also stop player falling out of the bottom of the map if blockAtEdge is true. Again, rock is an arbitrary choice here - // 4J Stu - Don't stop entities falling into the void while in The End (it has no bedrock) - if( blockAtEdge && ( ( y0 - 1 ) < 0 ) && dimension->id != 1 ) - { - for (int y = y0 - 1; y < 0; y++) + // 4J - also stop player falling out of the bottom of the map if blockAtEdge is true. Again, rock is an arbitrary choice here + // 4J Stu - Don't stop entities falling into the void while in The End (it has no bedrock) + if( blockAtEdge && ( ( y0 - 1 ) < 0 ) && dimension->id != 1 ) { - for (int x = x0; x < x1; x++) - for (int z = z0; z < z1; z++) - { - Tile::rock->addAABBs(this, x, y, z, box, &boxes, source ); - } + for (int y = y0 - 1; y < 0; y++) + { + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + Tile::stone->addAABBs(this, x, y, z, box, &boxes, source ); + } + } } - } - // 4J - final bounds check - limit vertical movement so we can't move above maxMovementHeight - if( blockAtEdge && ( y1 > maxMovementHeight ) ) - { - for (int y = maxMovementHeight; y < y1; y++) + // 4J - final bounds check - limit vertical movement so we can't move above maxMovementHeight + if( blockAtEdge && ( y1 > maxMovementHeight ) ) { - for (int x = x0; x < x1; x++) - for (int z = z0; z < z1; z++) - { - Tile::rock->addAABBs(this, x, y, z, box, &boxes, source ); - } + for (int y = maxMovementHeight; y < y1; y++) + { + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + Tile::stone->addAABBs(this, x, y, z, box, &boxes, source ); + } + } } - } - // 4J - now add in collision for any blocks which have actually been removed, but haven't had their render data updated to reflect this yet. This is to stop the player - // being able to move the view position inside a tile which is (visually) still there, and see out of the world. This is particularly a problem when moving upwards in - // creative mode as the player can get very close to the edge of tiles whilst looking upwards and can therefore very quickly move inside one. - Minecraft::GetInstance()->levelRenderer->destroyedTileManager->addAABBs( this, box, &boxes); - - // 4J - added - if( noEntities ) return &boxes; - - double r = 0.25; - vector > *ee = getEntities(source, box->grow(r, r, r)); - vector >::iterator itEnd = ee->end(); - for (AUTO_VAR(it, ee->begin()); it != itEnd; it++) - { - AABB *collideBox = (*it)->getCollideBox(); - if (collideBox != NULL && collideBox->intersects(box)) + // 4J - now add in collision for any blocks which have actually been removed, but haven't had their render data updated to reflect this yet. This is to stop the player + // being able to move the view position inside a tile which is (visually) still there, and see out of the world. This is particularly a problem when moving upwards in + // creative mode as the player can get very close to the edge of tiles whilst looking upwards and can therefore very quickly move inside one. + Minecraft::GetInstance()->levelRenderer->destroyedTileManager->addAABBs( this, box, &boxes); + + // 4J - added + if( noEntities ) return &boxes; + + double r = 0.25; + vector > *ee = getEntities(source, box->grow(r, r, r)); + vector >::iterator itEnd = ee->end(); + for (AUTO_VAR(it, ee->begin()); it != itEnd; it++) { - boxes.push_back(collideBox); - } + AABB *collideBox = (*it)->getCollideBox(); + if (collideBox != NULL && collideBox->intersects(box)) + { + boxes.push_back(collideBox); + } - collideBox = source->getCollideAgainstBox(*it); - if (collideBox != NULL && collideBox->intersects(box)) - { - boxes.push_back(collideBox); + collideBox = source->getCollideAgainstBox(*it); + if (collideBox != NULL && collideBox->intersects(box)) + { + boxes.push_back(collideBox); + } } - } - return &boxes; + return &boxes; } // 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player -AABBList *Level::getTileCubes(AABB *box, bool blockAtEdge) +AABBList *Level::getTileCubes(AABB *box, bool blockAtEdge/* = false */) { return getCubes(nullptr, box, true, blockAtEdge); //boxes.clear(); @@ -1969,19 +2031,19 @@ int Level::getOldSkyDarken(float a) //4J - change brought forward from 1.8.2 float Level::getSkyDarken(float a) { - float td = getTimeOfDay(a); + float td = getTimeOfDay(a); - float br = 1 - (Mth::cos(td * PI * 2) * 2 + 0.2f); - if (br < 0.0f) br = 0.0f; - if (br > 1.0f) br = 1.0f; + float br = 1 - (Mth::cos(td * PI * 2) * 2 + 0.2f); + if (br < 0.0f) br = 0.0f; + if (br > 1.0f) br = 1.0f; - br = 1.0f - br; + br = 1.0f - br; - br *= 1.0f - (getRainLevel(a) * 5.0f / 16.0f); - br *= 1.0f - (getThunderLevel(a) * 5.0f / 16.0f); - // return ((int) (br * 13)); + br *= 1.0f - (getRainLevel(a) * 5.0f / 16.0f); + br *= 1.0f - (getThunderLevel(a) * 5.0f / 16.0f); + // return ((int) (br * 13)); - return br * 0.8f + 0.2f; + return br * 0.8f + 0.2f; } @@ -2028,9 +2090,9 @@ Vec3 *Level::getSkyColor(shared_ptr source, float a) b = b * ba + mid * (1 - ba); } - if (lightningBoltTime > 0) + if (skyFlashTime > 0) { - float f = (lightningBoltTime - a); + float f = (skyFlashTime - a); if (f > 1) f = 1; f = f * 0.45f; r = r * (1 - f) + 0.8f * f; @@ -2052,19 +2114,17 @@ float Level::getTimeOfDay(float a) /* if (this != NULL) return 0.5f; */ // 4J Added if so we can override timeOfDay without changing the time that affects ticking of things - if( m_timeOfDayOverride >= 0 ) - { - return dimension->getTimeOfDay(m_timeOfDayOverride, a); - } - else - { - return dimension->getTimeOfDay(levelData->getTime(), a);; - } + return dimension->getTimeOfDay(levelData->getDayTime(), a);; +} + +int Level::getMoonPhase() +{ + return dimension->getMoonPhase(levelData->getDayTime()); } -int Level::getMoonPhase(float a) +float Level::getMoonBrightness() { - return dimension->getMoonPhase(levelData->getTime(), a); + return Dimension::MOON_BRIGHTNESS_PER_PHASE[dimension->getMoonPhase(levelData->getDayTime())]; } float Level::getSunAngle(float a) @@ -2185,26 +2245,28 @@ float Level::getStarBrightness(float a) return br * br * 0.5f; } - void Level::addToTickNextTick(int x, int y, int z, int tileId, int tickDelay) { } -void Level::forceAddTileTick(int x, int y, int z, int tileId, int tickDelay) +void Level::addToTickNextTick(int x, int y, int z, int tileId, int tickDelay, int priorityTilt) +{ +} + +void Level::forceAddTileTick(int x, int y, int z, int tileId, int tickDelay, int prioTilt) { } void Level::tickEntities() { - //for (int i = 0; i < globalEntities.size(); i++) vector >::iterator itGE = globalEntities.begin(); while( itGE != globalEntities.end() ) { - shared_ptr e = *itGE;//globalEntities.at(i); + shared_ptr e = *itGE; + e->tickCount++; e->tick(); if (e->removed) { - //globalEntities.remove(i--); itGE = globalEntities.erase( itGE ); } else @@ -2213,7 +2275,6 @@ void Level::tickEntities() } } - //entities.removeAll(entitiesToRemove); EnterCriticalSection(&m_entitiesCS); for( AUTO_VAR(it, entities.begin()); it != entities.end(); ) @@ -2261,14 +2322,14 @@ void Level::tickEntities() //for (int i = 0; i < entities.size(); i++) /* 4J Jev, using an iterator causes problems here as - * the vector is modified from inside this loop. - */ + * the vector is modified from inside this loop. + */ EnterCriticalSection(&m_entitiesCS); for (unsigned int i = 0; i < entities.size(); ) { shared_ptr e = entities.at(i); - + if (e->riding != NULL) { if (e->riding->removed || e->riding->rider.lock() != e) @@ -2286,7 +2347,7 @@ void Level::tickEntities() if (!e->removed) { #ifndef _FINAL_BUILD - if(!( app.DebugSettingsOn() && app.GetMobsDontTickEnabled() && (dynamic_pointer_cast(e) != NULL) && (dynamic_pointer_cast(e) == NULL))) + if ( !( app.DebugSettingsOn() && app.GetMobsDontTickEnabled() && e->instanceof(eTYPE_MOB) && !e->instanceof(eTYPE_PLAYER)) ) #endif { tick(e); @@ -2357,7 +2418,7 @@ void Level::tickEntities() } updatingTileEntities = false; -// 4J-PB - Stuart - check this is correct here + // 4J-PB - Stuart - check this is correct here if (!tileEntitiesToUnload.empty()) { @@ -2407,7 +2468,7 @@ void Level::tickEntities() if (lc != NULL) lc->setTileEntity(e->x & 15, e->y, e->z & 15, e); } - sendTileUpdated(e->x, e->y, e->z); + sendTileUpdated(e->x, e->y, e->z); } } pendingTileEntities.clear(); @@ -2469,6 +2530,7 @@ void Level::tick(shared_ptr e, bool actual) if (actual && e->inChunk ) #endif { + e->tickCount++; if (e->riding != NULL) { e->rideTick(); @@ -2677,7 +2739,9 @@ bool Level::checkAndHandleWater(AABB *box, Material *material, shared_ptrlength() > 0) + } + } + if (current->length() > 0 && e->isPushedByWater()) { current = current->normalize(); double pow = 0.014; @@ -2713,7 +2779,9 @@ bool Level::containsMaterial(AABB *box, Material *material) int z1 = Mth::floor(box->z1 + 1); for (int x = x0; x < x1; x++) + { for (int y = y0; y < y1; y++) + { for (int z = z0; z < z1; z++) { Tile *tile = Tile::tiles[getTile(x, y, z)]; @@ -2722,6 +2790,8 @@ bool Level::containsMaterial(AABB *box, Material *material) return true; } } + } + } return false; } @@ -2736,7 +2806,9 @@ bool Level::containsLiquid(AABB *box, Material *material) int z1 = Mth::floor(box->z1 + 1); for (int x = x0; x < x1; x++) + { for (int y = y0; y < y1; y++) + { for (int z = z0; z < z1; z++) { Tile *tile = Tile::tiles[getTile(x, y, z)]; @@ -2754,6 +2826,8 @@ bool Level::containsLiquid(AABB *box, Material *material) } } } + } + } return false; } @@ -2795,7 +2869,7 @@ float Level::getSeenPercent(Vec3 *center, AABB *bb) count++; } - return hits / (float) count; + return hits / (float) count; } @@ -2811,7 +2885,7 @@ bool Level::extinguishFire(shared_ptr player, int x, int y, int z, int f if (getTile(x, y, z) == Tile::fire_Id) { levelEvent(player, LevelEvent::SOUND_FIZZ, x, y, z, 0); - setTile(x, y, z, 0); + removeTile(x, y, z); return true; } return false; @@ -2820,7 +2894,7 @@ bool Level::extinguishFire(shared_ptr player, int x, int y, int z, int f /* shared_ptr Level::findSubclassOf(Entity::Class *entityClass) { - return shared_ptr(); +return shared_ptr(); } */ @@ -2829,7 +2903,7 @@ wstring Level::gatherStats() { wchar_t buf[64]; EnterCriticalSection(&m_entitiesCS); - swprintf(buf,64,L"All:%d",this->entities.size()); + swprintf(buf,64,L"All:%d",entities.size()); LeaveCriticalSection(&m_entitiesCS); return wstring(buf); } @@ -2843,81 +2917,110 @@ wstring Level::gatherChunkSourceStats() shared_ptr Level::getTileEntity(int x, int y, int z) { - if (y >= Level::maxBuildHeight) + if (y < minBuildHeight || y >= maxBuildHeight) { return nullptr; } - LevelChunk *lc = getChunk(x >> 4, z >> 4); - if (lc != NULL) return lc->getTileEntity(x & 15, y, z & 15); + shared_ptr tileEntity = nullptr; - if (lc != NULL) + if (updatingTileEntities) { - shared_ptr tileEntity = lc->getTileEntity(x & 15, y, z & 15); - - if (tileEntity == NULL) + EnterCriticalSection(&m_tileEntityListCS); + for (int i = 0; i < pendingTileEntities.size(); i++) { - EnterCriticalSection(&m_tileEntityListCS); - for( AUTO_VAR(it, pendingTileEntities.begin()); it != pendingTileEntities.end(); it++ ) + shared_ptr e = pendingTileEntities.at(i); + if (!e->isRemoved() && e->x == x && e->y == y && e->z == z) { - shared_ptr e = *it; - - if (!e->isRemoved() && e->x == x && e->y == y && e->z == z) - { - tileEntity = e; - break; - } - } - LeaveCriticalSection(&m_tileEntityListCS); - } - return tileEntity; - } - - return nullptr; -} + tileEntity = e; + break; + } + } + LeaveCriticalSection(&m_tileEntityListCS); + } + + if (tileEntity == NULL) + { + LevelChunk *lc = getChunk(x >> 4, z >> 4); + if (lc != NULL) + { + tileEntity = lc->getTileEntity(x & 15, y, z & 15); + } + } + + if (tileEntity == NULL) + { + EnterCriticalSection(&m_tileEntityListCS); + for( AUTO_VAR(it, pendingTileEntities.begin()); it != pendingTileEntities.end(); it++ ) + { + shared_ptr e = *it; + + if (!e->isRemoved() && e->x == x && e->y == y && e->z == z) + { + tileEntity = e; + break; + } + } + LeaveCriticalSection(&m_tileEntityListCS); + } + return tileEntity; +} void Level::setTileEntity(int x, int y, int z, shared_ptr tileEntity) { - if (tileEntity != NULL && !tileEntity->isRemoved()) + if (tileEntity != NULL && !tileEntity->isRemoved()) { EnterCriticalSection(&m_tileEntityListCS); - if (updatingTileEntities) + if (updatingTileEntities) { - tileEntity->x = x; - tileEntity->y = y; - tileEntity->z = z; - pendingTileEntities.push_back(tileEntity); - } + tileEntity->x = x; + tileEntity->y = y; + tileEntity->z = z; + + // avoid adding duplicates + for( AUTO_VAR(it, pendingTileEntities.begin()); it != pendingTileEntities.end();) + { + shared_ptr next = *it; + if (next->x == x && next->y == y && next->z == z) + { + next->setRemoved(); + it = pendingTileEntities.erase(it); + } + else + { + ++it; + } + } + + pendingTileEntities.push_back(tileEntity); + } else { - tileEntityList.push_back(tileEntity); + tileEntityList.push_back(tileEntity); LevelChunk *lc = getChunk(x >> 4, z >> 4); if (lc != NULL) lc->setTileEntity(x & 15, y, z & 15, tileEntity); } LeaveCriticalSection(&m_tileEntityListCS); } - - } - void Level::removeTileEntity(int x, int y, int z) { EnterCriticalSection(&m_tileEntityListCS); - shared_ptr te = getTileEntity(x, y, z); - if (te != NULL && updatingTileEntities) + shared_ptr te = getTileEntity(x, y, z); + if (te != NULL && updatingTileEntities) { - te->setRemoved(); + te->setRemoved(); AUTO_VAR(it, find(pendingTileEntities.begin(), pendingTileEntities.end(), te )); if( it != pendingTileEntities.end() ) { pendingTileEntities.erase(it); } - } + } else { - if (te != NULL) + if (te != NULL) { AUTO_VAR(it, find(pendingTileEntities.begin(), pendingTileEntities.end(), te )); if( it != pendingTileEntities.end() ) @@ -2929,7 +3032,7 @@ void Level::removeTileEntity(int x, int y, int z) { tileEntityList.erase(it2); } - } + } LevelChunk *lc = getChunk(x >> 4, z >> 4); if (lc != NULL) lc->removeTileEntity(x & 15, y, z & 15); } @@ -2945,7 +3048,7 @@ bool Level::isSolidRenderTile(int x, int y, int z) { Tile *tile = Tile::tiles[getTile(x, y, z)]; if (tile == NULL) return false; - + // 4J - addition here to make rendering big blocks of leaves more efficient. Normally leaves never consider themselves as solid, so // blocks of leaves will have all sides of each block completely visible. Changing to consider as solid if this block is surrounded by // other leaves (or solid things). This is paired with another change in Tile::getTexture which makes such solid tiles actually visibly solid (these @@ -2978,51 +3081,67 @@ bool Level::isSolidBlockingTile(int x, int y, int z) } /** - * This method does the same as isSolidBlockingTile, except it will not - * check the tile if the coordinates is in an unloaded or empty chunk. This - * is to help vs the problem of "popping" torches in SMP. - */ +* This method does the same as isSolidBlockingTile, except it will not +* check the tile if the coordinates is in an unloaded or empty chunk. This +* is to help vs the problem of "popping" torches in SMP. +*/ bool Level::isSolidBlockingTileInLoadedChunk(int x, int y, int z, bool valueIfNotLoaded) { - if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) + if (x < -MAX_LEVEL_SIZE || z < -MAX_LEVEL_SIZE || x >= MAX_LEVEL_SIZE || z >= MAX_LEVEL_SIZE) { - return valueIfNotLoaded; - } - LevelChunk *chunk = chunkSource->getChunk(x >> 4, z >> 4); - if (chunk == NULL || chunk->isEmpty()) + return valueIfNotLoaded; + } + LevelChunk *chunk = chunkSource->getChunk(x >> 4, z >> 4); + if (chunk == NULL || chunk->isEmpty()) { - return valueIfNotLoaded; - } + return valueIfNotLoaded; + } - Tile *tile = Tile::tiles[getTile(x, y, z)]; - if (tile == NULL) return false; - return tile->material->isSolidBlocking() && tile->isCubeShaped(); + Tile *tile = Tile::tiles[getTile(x, y, z)]; + if (tile == NULL) return false; + return tile->material->isSolidBlocking() && tile->isCubeShaped(); +} + +bool Level::isFullAABBTile(int x, int y, int z) +{ + int tile = getTile(x, y, z); + if (tile == 0 || Tile::tiles[tile] == NULL) + { + return false; + } + AABB *aabb = Tile::tiles[tile]->getAABB(this, x, y, z); + return aabb != NULL && aabb->getSize() >= 1; } -// 4J - brought forward from 1.3.2 bool Level::isTopSolidBlocking(int x, int y, int z) { - // Temporary workaround until tahgs per-face solidity is finished - Tile *tile = Tile::tiles[getTile(x, y, z)]; - if (tile == NULL) return false; + // Temporary workaround until tahgs per-face solidity is finished + Tile *tile = Tile::tiles[getTile(x, y, z)]; + return isTopSolidBlocking(tile, getData(x, y, z)); +} - if (tile->material->isSolidBlocking() && tile->isCubeShaped()) return true; +bool Level::isTopSolidBlocking(Tile *tile, int data) +{ + if (tile == NULL) return false; + + if (tile->material->isSolidBlocking() && tile->isCubeShaped()) return true; if (dynamic_cast(tile) != NULL) { - return (getData(x, y, z) & StairTile::UPSIDEDOWN_BIT) == StairTile::UPSIDEDOWN_BIT; + return (data & StairTile::UPSIDEDOWN_BIT) == StairTile::UPSIDEDOWN_BIT; } - if (dynamic_cast(tile) != NULL) + if (dynamic_cast(tile) != NULL) { - return (getData(x, y, z) & HalfSlabTile::TOP_SLOT_BIT) == HalfSlabTile::TOP_SLOT_BIT; + return (data & HalfSlabTile::TOP_SLOT_BIT) == HalfSlabTile::TOP_SLOT_BIT; } - if (dynamic_cast(tile) != NULL) return (getData(x, y, z) & TopSnowTile::HEIGHT_MASK) == TopSnowTile::MAX_HEIGHT + 1; - return false; + if (dynamic_cast(tile) != NULL) return true; + if (dynamic_cast(tile) != NULL) return (data & TopSnowTile::HEIGHT_MASK) == TopSnowTile::MAX_HEIGHT + 1; + return false; } void Level::updateSkyBrightness() { - int newDark = this->getOldSkyDarken(1); + int newDark = getOldSkyDarken(1); if (newDark != skyDarken) { skyDarken = newDark; @@ -3046,10 +3165,10 @@ void Level::prepareWeather() { if (levelData->isRaining()) { - this->rainLevel = 1; + rainLevel = 1; if (levelData->isThundering()) { - this->thunderLevel = 1; + thunderLevel = 1; } } } @@ -3073,11 +3192,6 @@ void Level::tickWeather() } #endif - if (lightningTime > 0) - { - lightningTime--; - } - int thunderTime = levelData->getThunderTime(); if (thunderTime <= 0) { @@ -3120,9 +3234,9 @@ void Level::tickWeather() { levelData->setRaining(!levelData->isRaining()); } -/* if( !levelData->isRaining() ) + /* if( !levelData->isRaining() ) { - levelData->setRaining(true); + levelData->setRaining(true); }*/ } @@ -3153,8 +3267,8 @@ void Level::tickWeather() void Level::toggleDownfall() { - // this will trick the tickWeather method to toggle rain next tick - levelData->setRainTime(1); + // this will trick the tickWeather method to toggle rain next tick + levelData->setRainTime(1); } void Level::buildAndPrepareChunksToPoll() @@ -3205,7 +3319,7 @@ void Level::buildAndPrepareChunksToPoll() delete [] xx; delete [] zz; #endif - + if (delayUntilNextMoodSound > 0) delayUntilNextMoodSound--; // 4J Stu - Added 1.2.3, but not sure if we want to do it @@ -3226,7 +3340,7 @@ void Level::tickClientSideTiles(int xo, int zo, LevelChunk *lc) { //lc->tick(); // 4J - brought this lighting update forward from 1.8.2 - if (delayUntilNextMoodSound == 0) + if (delayUntilNextMoodSound == 0 && !isClientSide) { randValue = randValue * 3 + addend; int val = (randValue >> 2); @@ -3248,7 +3362,7 @@ void Level::tickClientSideTiles(int xo, int zo, LevelChunk *lc) #else this->playSound(x + 0.5, y + 0.5, z + 0.5,eSoundType_AMBIENT_CAVE_CAVE, 0.7f, 0.8f + random->nextFloat() * 0.2f); #endif - delayUntilNextMoodSound = random->nextInt(20 * 60 * 10) + 20 * 60 * 5; + delayUntilNextMoodSound = random->nextInt(SharedConstants::TICKS_PER_SECOND * 60 * 10) + SharedConstants::TICKS_PER_SECOND * 60 * 5; } } } @@ -3264,123 +3378,94 @@ void Level::tickTiles() bool Level::shouldFreezeIgnoreNeighbors(int x, int y, int z) { - return shouldFreeze(x, y, z, false); + return shouldFreeze(x, y, z, false); } bool Level::shouldFreeze(int x, int y, int z) { - return shouldFreeze(x, y, z, true); + return shouldFreeze(x, y, z, true); } bool Level::shouldFreeze(int x, int y, int z, bool checkNeighbors) { - Biome *biome = getBiome(x, z); - float temp = biome->getTemperature(); - if (temp > 0.15f) return false; + Biome *biome = getBiome(x, z); + float temp = biome->getTemperature(); + if (temp > 0.15f) return false; - if (y >= 0 && y < maxBuildHeight && getBrightness(LightLayer::Block, x, y, z) < 10) + if (y >= 0 && y < maxBuildHeight && getBrightness(LightLayer::Block, x, y, z) < 10) { - int current = getTile(x, y, z); - if ((current == Tile::calmWater_Id || current == Tile::water_Id) && getData(x, y, z) == 0) + int current = getTile(x, y, z); + if ((current == Tile::calmWater_Id || current == Tile::water_Id) && getData(x, y, z) == 0) { - if (!checkNeighbors) return true; - - bool surroundedByWater = true; - if (surroundedByWater && getMaterial(x - 1, y, z) != Material::water) surroundedByWater = false; - if (surroundedByWater && getMaterial(x + 1, y, z) != Material::water) surroundedByWater = false; - if (surroundedByWater && getMaterial(x, y, z - 1) != Material::water) surroundedByWater = false; - if (surroundedByWater && getMaterial(x, y, z + 1) != Material::water) surroundedByWater = false; - if (!surroundedByWater) return true; - } - } - return false; + if (!checkNeighbors) return true; + + bool surroundedByWater = true; + if (surroundedByWater && getMaterial(x - 1, y, z) != Material::water) surroundedByWater = false; + if (surroundedByWater && getMaterial(x + 1, y, z) != Material::water) surroundedByWater = false; + if (surroundedByWater && getMaterial(x, y, z - 1) != Material::water) surroundedByWater = false; + if (surroundedByWater && getMaterial(x, y, z + 1) != Material::water) surroundedByWater = false; + if (!surroundedByWater) return true; + } + } + return false; } bool Level::shouldSnow(int x, int y, int z) { - Biome *biome = getBiome(x, z); - float temp = biome->getTemperature(); - if (temp > 0.15f) return false; + Biome *biome = getBiome(x, z); + float temp = biome->getTemperature(); + if (temp > 0.15f) return false; - if (y >= 0 && y < maxBuildHeight && getBrightness(LightLayer::Block, x, y, z) < 10) + if (y >= 0 && y < maxBuildHeight && getBrightness(LightLayer::Block, x, y, z) < 10) { - int below = getTile(x, y - 1, z); - int current = getTile(x, y, z); - if (current == 0) + int below = getTile(x, y - 1, z); + int current = getTile(x, y, z); + if (current == 0) { - if (Tile::topSnow->mayPlace(this, x, y, z) && (below != 0 && below != Tile::ice_Id && Tile::tiles[below]->material->blocksMotion())) + if (Tile::topSnow->mayPlace(this, x, y, z) && (below != 0 && below != Tile::ice_Id && Tile::tiles[below]->material->blocksMotion())) { - return true; - } - } - } + return true; + } + } + } - return false; + return false; } - void Level::checkLight(int x, int y, int z, bool force, bool rootOnlyEmissive) // 4J added force, rootOnlyEmissive parameters { - if (!dimension->hasCeiling) checkLight(LightLayer::Sky, x, y, z, force, false); - checkLight(LightLayer::Block, x, y, z, force, rootOnlyEmissive); + if (!dimension->hasCeiling) checkLight(LightLayer::Sky, x, y, z, force, false); + checkLight(LightLayer::Block, x, y, z, force, rootOnlyEmissive); } -int Level::getExpectedSkyColor(lightCache_t *cache, int oc, int x, int y , int z, int ct, int block) -{ - int expected = 0; - - if( block == 255 ) return 0; // 4J added as optimisation - if (canSeeSky(x, y, z)) - { - expected = 15; - } - else - { - if (block == 0) block = 1; - - // 4J - changed this to attempt to get all 6 brightnesses of neighbours in a single call, as an optimisation - int b[6]; - b[0] = getBrightnessCached(cache, LightLayer::Sky, x - 1, y, z); - b[1] = getBrightnessCached(cache, LightLayer::Sky, x + 1, y, z); - b[2] = getBrightnessCached(cache, LightLayer::Sky, x, y - 1, z); - b[3] = getBrightnessCached(cache, LightLayer::Sky, x, y + 1, z); - b[4] = getBrightnessCached(cache, LightLayer::Sky, x, y, z - 1); - b[5] = getBrightnessCached(cache, LightLayer::Sky, x, y, z + 1); - for( int i = 0; i < 6; i++ ) - { - if( ( b[i] - block ) > expected ) expected = b[i] - block; - } - } - - return expected; -} - -int Level::getExpectedBlockColor(lightCache_t *cache, int oc, int x, int y, int z, int ct, int block, bool propagatedOnly) +int Level::getExpectedLight(lightCache_t *cache, int x, int y, int z, LightLayer::variety layer, bool propagatedOnly) { - int expected = propagatedOnly ? 0 : getEmissionCached(cache, ct, x, y, z); + if (layer == LightLayer::Sky && canSeeSky(x, y, z)) return MAX_BRIGHTNESS; + int id = getTile(x, y, z); + int result = layer == LightLayer::Sky ? 0 : Tile::lightEmission[id]; + int block = Tile::lightBlock[id]; + if (block >= MAX_BRIGHTNESS && Tile::lightEmission[id] > 0) block = 1; + if (block < 1) block = 1; + if (block >= MAX_BRIGHTNESS) + { + return propagatedOnly ? 0 : getEmissionCached(cache, 0, x, y, z); + } - if( block >= 15 ) return expected; // 4J added as optimisation + if (result >= MAX_BRIGHTNESS - 1) return result; - // 4J - changed this to attempt to get all 6 brightnesses of neighbours in a single call, as an optimisation - int b[6]; - b[0] = getBrightnessCached(cache, LightLayer::Block, x - 1, y, z); - b[1] = getBrightnessCached(cache, LightLayer::Block, x + 1, y, z); - b[2] = getBrightnessCached(cache, LightLayer::Block, x, y - 1, z); - b[3] = getBrightnessCached(cache, LightLayer::Block, x, y + 1, z); - b[4] = getBrightnessCached(cache, LightLayer::Block, x, y, z - 1); - b[5] = getBrightnessCached(cache, LightLayer::Block, x, y, z + 1); - for( int i = 0; i < 6; i++ ) + for (int face = 0; face < 6; face++) { - if( ( b[i] - block ) > expected ) expected = b[i] - block; - } + int xx = x + Facing::STEP_X[face]; + int yy = y + Facing::STEP_Y[face]; + int zz = z + Facing::STEP_Z[face]; + int brightness = getBrightnessCached(cache, layer, xx, yy, zz) - block; - return expected; -} + if (brightness > result) result = brightness; + if (result >= MAX_BRIGHTNESS - 1) return result; + } -inline int GetIndex(int x, int y, int z) -{ - return ( ( x & 15 ) << 8 ) | ( ( y & 15 ) << 4 ) | ( z & 15 ); + return result; } // 4J - Made changes here so that lighting goes through a cache, if enabled for this thread @@ -3397,12 +3482,12 @@ void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool f else { // 4J - this is normal java behaviour - if (!hasChunksAt(xc, yc, zc, 17)) return; + if (!hasChunksAt(xc, yc, zc, 17)) return; } #if 0 ///////////////////////////////////////////////////////////////////////////////////////////// - // Get the frequency of the timer + // Get the frequency of the timer LARGE_INTEGER qwTicksPerSec, qwTime, qwNewTime, qwDeltaTime1, qwDeltaTime2; float fElapsedTime1 = 0.0f; float fElapsedTime2 = 0.0f; @@ -3415,42 +3500,10 @@ void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool f EnterCriticalSection(&m_checkLightCS); -#ifdef __PSVITA__ - // AP - only clear the one array element required to check if something has changed - cachewritten = false; - if( cache != NULL ) - { - int idx; - if( !(yc & 0xffffff00) ) - { - idx = GetIndex(xc, yc, zc); - cache[idx] = 0; - idx = GetIndex(xc - 1, yc, zc); - cache[idx] = 0; - idx = GetIndex(xc + 1, yc, zc); - cache[idx] = 0; - idx = GetIndex(xc, yc, zc - 1); - cache[idx] = 0; - idx = GetIndex(xc, yc, zc + 1); - cache[idx] = 0; - } - if( !((yc-1) & 0xffffff00) ) - { - idx = GetIndex(xc, yc - 1, zc); - cache[idx] = 0; - } - if( !((yc+1) & 0xffffff00) ) - { - idx = GetIndex(xc, yc + 1, zc); - cache[idx] = 0; - } - } -#else - initCache(cache); -#endif + initCachePartial(cache, xc, yc, zc); // If we're in cached mode, then use memory allocated after the cached data itself for the toCheck array, in an attempt to make both that & the other cached data sit on the CPU L2 cache better. - + int *toCheck; if( cache == NULL ) { @@ -3461,8 +3514,8 @@ void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool f toCheck = (int *)(cache + (16*16*16)); } - int tcp = 0; - int tcc = 0; + int checkedPosition = 0; + int toCheckCount = 0; //int darktcc = 0; @@ -3476,162 +3529,100 @@ void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool f } // Lock 128K of cache (containing all the lighting cache + first 112K of toCheck array) on L2 to try and stop any cached data getting knocked out of L2 by other non-cached reads (or vice-versa) -// if( cache ) XLockL2(XLOCKL2_INDEX_TITLE, cache, 128 * 1024, XLOCKL2_LOCK_SIZE_1_WAY, 0 ); - - { - int cc = getBrightnessCached(cache, layer, xc, yc, zc); - int ex = 0; - { - int ct = 0; - int block = getBlockingCached(cache, layer, &ct, xc, yc, zc); - if (block == 0) block = 1; - - int expected = 0; - if (layer == LightLayer::Sky) - { - expected = getExpectedSkyColor(cache, cc, xc, yc, zc, ct, block); - } - else - { - expected = getExpectedBlockColor(cache, cc, xc, yc, zc, ct, block, false); - } - - ex = expected; - - } + // if( cache ) XLockL2(XLOCKL2_INDEX_TITLE, cache, 128 * 1024, XLOCKL2_LOCK_SIZE_1_WAY, 0 ); -#ifdef __PSVITA__ - // AP - we only need to memset the entire array if we discover something has changed - if( ex != cc && cache ) + { + int centerCurrent = getBrightnessCached(cache, layer, xc, yc, zc); + int centerExpected = getExpectedLight(cache, xc, yc, zc, layer, false); + + if( centerExpected != centerCurrent && cache ) { - lightCache_t old[7]; - if( !(yc & 0xffffff00) ) - { - old[0] = cache[GetIndex(xc, yc, zc)]; - old[1] = cache[GetIndex(xc - 1, yc, zc)]; - old[2] = cache[GetIndex(xc + 1, yc, zc)]; - old[5] = cache[GetIndex(xc, yc, zc - 1)]; - old[6] = cache[GetIndex(xc, yc, zc + 1)]; - } - if( !((yc-1) & 0xffffff00) ) - { - old[3] = cache[GetIndex(xc, yc - 1, zc)]; - } - if( !((yc+1) & 0xffffff00) ) - { - old[4] = cache[GetIndex(xc, yc + 1, zc)]; - } - - XMemSet128(cache,0,16*16*16*sizeof(lightCache_t)); - - if( !(yc & 0xffffff00) ) - { - cache[GetIndex(xc, yc, zc)] = old[0]; - cache[GetIndex(xc - 1, yc, zc)] = old[1]; - cache[GetIndex(xc + 1, yc, zc)] = old[2]; - cache[GetIndex(xc, yc, zc - 1)] = old[5]; - cache[GetIndex(xc, yc, zc + 1)] = old[6]; - } - if( !((yc-1) & 0xffffff00) ) - { - cache[GetIndex(xc, yc - 1, zc)] = old[3]; - } - if( !((yc+1) & 0xffffff00) ) - { - cache[GetIndex(xc, yc + 1, zc)] = old[4]; - } + initCacheComplete(cache, xc, yc, zc); } -#endif - if (ex > cc) + if (centerExpected > centerCurrent) { - toCheck[tcc++] = ((32)) + ((32) << 6) + ((32) << 12); - } - else if (ex < cc) + toCheck[toCheckCount++] = 32 | (32 << 6) | (32 << 12); + } + else if (centerExpected < centerCurrent) { // 4J - added tcn. This is the code that is run when checkLight has been called for a light source that has got darker / turned off. // In the original version, after zeroing tiles brightnesses that are deemed to come from this light source, all the zeroed tiles are then passed to the next // stage of the function to potentially have their brightnesses put back up again. We shouldn't need to consider All these tiles as starting points for this process, now just // considering the edge tiles (defined as a tile where we have a neighbour that is brightner than can be explained by the original light source we are turning off) int tcn = 0; - if (layer == LightLayer::Block || true) + if (layer == LightLayer::Block || true) { - toCheck[tcc++] = ((32)) + ((32) << 6) + ((32) << 12) + (cc << 18); - while (tcp < tcc) + toCheck[toCheckCount++] = 32 | (32 << 6) | (32 << 12) | (centerCurrent << 18); + while (checkedPosition < toCheckCount) { - int p = toCheck[tcp++]; - int x = ((p) & 63) - 32 + xc; - int y = ((p >> 6) & 63) - 32 + yc; - int z = ((p >> 12) & 63) - 32 + zc; - int cexp = ((p >> 18) & 15); - int o = getBrightnessCached(cache, layer, x, y, z); - if (o == cexp) + int p = toCheck[checkedPosition++]; + int x = ((p) & 63) - 32 + xc; + int y = ((p >> 6) & 63) - 32 + yc; + int z = ((p >> 12) & 63) - 32 + zc; + int expected = ((p >> 18) & 15); + int current = getBrightnessCached(cache, layer, x, y, z); + if (current == expected) { - setBrightnessCached(cache, &cacheUse, layer, x, y, z, 0); - // cexp--; // 4J - removed, change from 1.2.3 - if (cexp > 0) + setBrightnessCached(cache, &cacheUse, layer, x, y, z, 0); + // cexp--; // 4J - removed, change from 1.2.3 + if (expected > 0) { - int xd = x - xc; - int yd = y - yc; - int zd = z - zc; - if (xd < 0) xd = -xd; - if (yd < 0) yd = -yd; - if (zd < 0) zd = -zd; - if (xd + yd + zd < 17) + int xd = Mth::abs(x - xc); + int yd = Mth::abs(y - yc); + int zd = Mth::abs(z - zc); + if (xd + yd + zd < 17) { bool edge = false; - for (int j = 0; j < 6; j++) + for (int face = 0; face < 6; face++) { - int flip = j % 2 * 2 - 1; - - int xx = x + ((j / 2) % 3 / 2) * flip; - int yy = y + ((j / 2 + 1) % 3 / 2) * flip; - int zz = z + ((j / 2 + 2) % 3 / 2) * flip; + int xx = x + Facing::STEP_X[face]; + int yy = y + Facing::STEP_Y[face]; + int zz = z + Facing::STEP_Z[face]; // 4J - added - don't let this lighting creep out of the normal fixed world and into the infinite water chunks beyond if( ( xx > maxXZ ) || ( xx < minXZ ) || ( zz > maxXZ ) || ( zz < minXZ ) ) continue; if( ( yy < 0 ) || ( yy >= maxBuildHeight ) ) continue; - o = getBrightnessCached(cache, layer, xx, yy, zz); // 4J - some changes here brought forward from 1.2.3 - int block = getBlockingCached(cache, layer, NULL, xx, yy, zz); - if (block == 0) block = 1; - if ((o == cexp - block) && (tcc < (32 * 32 * 32))) // 4J - 32 * 32 * 32 was toCheck.length + int block = max(1, getBlockingCached(cache, layer, NULL, xx, yy, zz) ); + current = getBrightnessCached(cache, layer, xx, yy, zz); + if ((current == expected - block) && (toCheckCount < (32 * 32 * 32))) // 4J - 32 * 32 * 32 was toCheck.length { - toCheck[tcc++] = (((xx - xc) + 32)) + (((yy - yc) + 32) << 6) + (((zz - zc) + 32) << 12) + ((cexp - block) << 18); + toCheck[toCheckCount++] = (xx - xc + 32) | ((yy - yc + 32) << 6) | ((zz - zc + 32) << 12) | ((expected - block) << 18); } else { // 4J - added - keep track of which tiles form the edge of the region we are zeroing - if( o > ( cexp - block ) ) + if( current > ( expected - block ) ) { edge = true; } } - } + } // 4J - added - keep track of which tiles form the edge of the region we are zeroing - can store over the original elements in the array because tcn must be <= tcp if( edge == true ) { toCheck[tcn++] = p; } - } - } + } + } - } - } - } - tcp = 0; -// darktcc = tcc; /////////////////////////////////////////////////// - tcc = tcn; // 4J added - we've moved all the edge tiles to the start of the array, so only need to process these now. The original processes all tcc tiles again in the next section - } - } + } + } + } + checkedPosition = 0; + // darktcc = tcc; /////////////////////////////////////////////////// + toCheckCount = tcn; // 4J added - we've moved all the edge tiles to the start of the array, so only need to process these now. The original processes all tcc tiles again in the next section + } + } - while (tcp < tcc) + while (checkedPosition < toCheckCount) { - int p = toCheck[tcp++]; - int x = ((p) & 63) - 32 + xc; - int y = ((p >> 6) & 63) - 32 + yc; - int z = ((p >> 12) & 63) - 32 + zc; + int p = toCheck[checkedPosition++]; + int x = ((p) & 63) - 32 + xc; + int y = ((p >> 6) & 63) - 32 + yc; + int z = ((p >> 12) & 63) - 32 + zc; // If force is set, then this is being used to in a special mode to try and light lava tiles as chunks are being loaded in. In this case, we // don't want a lighting update to drag in any neighbouring chunks that aren't loaded yet. @@ -3642,54 +3633,43 @@ void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool f continue; } } + int current = getBrightnessCached(cache, layer, x, y, z); - int c = getBrightnessCached(cache, layer, x, y, z); - int ct = 0; - int block = getBlockingCached(cache, layer, &ct, x, y, z); - if (block == 0) block = 1; - - int expected = 0; - if (layer == LightLayer::Sky) - { - expected = getExpectedSkyColor(cache, c, x, y, z, ct, block); - } - else + // If rootOnlyEmissive flag is set, then only consider the starting tile to be possibly emissive. + bool propagatedOnly = false; + if (layer == LightLayer::Block) { - // If rootOnlyEmissive flag is set, then only consider the starting tile to be possibly emissive. - bool propagatedOnly = false; if( rootOnlyEmissive ) { propagatedOnly = ( x != xc ) || ( y != yc ) || ( z != zc ); } - expected = getExpectedBlockColor(cache, c, x, y, z, ct, block, propagatedOnly); - } + } + int expected = getExpectedLight(cache, x, y, z, layer, propagatedOnly); - if (expected != c) + if (expected != current) { - setBrightnessCached(cache, &cacheUse, layer, x, y, z, expected); + setBrightnessCached(cache, &cacheUse, layer, x, y, z, expected); - if (expected > c) + if (expected > current) { - int xd = x - xc; - int yd = y - yc; - int zd = z - zc; - if (xd < 0) xd = -xd; - if (yd < 0) yd = -yd; - if (zd < 0) zd = -zd; - if (xd + yd + zd < 17 && tcc < (32 * 32 * 32) - 6) // 4J - 32 * 32 * 32 was toCheck.length + int xd = abs(x - xc); + int yd = abs(y - yc); + int zd = abs(z - zc); + bool withinBounds = toCheckCount < (32 * 32 * 32) - 6; // 4J - 32 * 32 * 32 was toCheck.length + if (xd + yd + zd < 17 && withinBounds) { // 4J - added extra checks here to stop lighting updates moving out of the actual fixed world and into the infinite water chunks - if( ( x - 1 ) >= minXZ ) { if (getBrightnessCached(cache, layer, x - 1, y, z) < expected) toCheck[tcc++] = (((x - 1 - xc) + 32)) + (((y - yc) + 32) << 6) + (((z - zc) + 32) << 12); } - if( ( x + 1 ) <= maxXZ ) { if (getBrightnessCached(cache, layer, x + 1, y, z) < expected) toCheck[tcc++] = (((x + 1 - xc) + 32)) + (((y - yc) + 32) << 6) + (((z - zc) + 32) << 12); } - if( ( y - 1 ) >= 0 ) { if (getBrightnessCached(cache, layer, x, y - 1, z) < expected) toCheck[tcc++] = (((x - xc) + 32)) + (((y - 1 - yc) + 32) << 6) + (((z - zc) + 32) << 12); } - if( ( y + 1 ) < maxBuildHeight ) { if (getBrightnessCached(cache, layer, x, y + 1, z) < expected) toCheck[tcc++] = (((x - xc) + 32)) + (((y + 1 - yc) + 32) << 6) + (((z - zc) + 32) << 12); } - if( ( z - 1 ) >= minXZ ) { if (getBrightnessCached(cache, layer, x, y, z - 1) < expected) toCheck[tcc++] = (((x - xc) + 32)) + (((y - yc) + 32) << 6) + (((z - 1 - zc) + 32) << 12); } - if( ( z + 1 ) <= maxXZ ) { if (getBrightnessCached(cache, layer, x, y, z + 1) < expected) toCheck[tcc++] = (((x - xc) + 32)) + (((y - yc) + 32) << 6) + (((z + 1 - zc) + 32) << 12); } - } - } - } - } -// if( cache ) XUnlockL2(XLOCKL2_INDEX_TITLE); + if( ( x - 1 ) >= minXZ ) { if (getBrightnessCached(cache, layer, x - 1, y, z) < expected) toCheck[toCheckCount++] = (((x - 1 - xc) + 32)) + (((y - yc) + 32) << 6) + (((z - zc) + 32) << 12); } + if( ( x + 1 ) <= maxXZ ) { if (getBrightnessCached(cache, layer, x + 1, y, z) < expected) toCheck[toCheckCount++] = (((x + 1 - xc) + 32)) + (((y - yc) + 32) << 6) + (((z - zc) + 32) << 12); } + if( ( y - 1 ) >= 0 ) { if (getBrightnessCached(cache, layer, x, y - 1, z) < expected) toCheck[toCheckCount++] = (((x - xc) + 32)) + (((y - 1 - yc) + 32) << 6) + (((z - zc) + 32) << 12); } + if( ( y + 1 ) < maxBuildHeight ) { if (getBrightnessCached(cache, layer, x, y + 1, z) < expected) toCheck[toCheckCount++] = (((x - xc) + 32)) + (((y + 1 - yc) + 32) << 6) + (((z - zc) + 32) << 12); } + if( ( z - 1 ) >= minXZ ) { if (getBrightnessCached(cache, layer, x, y, z - 1) < expected) toCheck[toCheckCount++] = (((x - xc) + 32)) + (((y - yc) + 32) << 6) + (((z - 1 - zc) + 32) << 12); } + if( ( z + 1 ) <= maxXZ ) { if (getBrightnessCached(cache, layer, x, y, z + 1) < expected) toCheck[toCheckCount++] = (((x - xc) + 32)) + (((y - yc) + 32) << 6) + (((z + 1 - zc) + 32) << 12); } + } + } + } + } + // if( cache ) XUnlockL2(XLOCKL2_INDEX_TITLE); #if 0 QueryPerformanceCounter( &qwNewTime ); qwDeltaTime1.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; @@ -3713,7 +3693,7 @@ void Level::checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool f ///////////////////////////////////////////////////////////////// #endif LeaveCriticalSection(&m_checkLightCS); - + } @@ -3729,6 +3709,11 @@ vector *Level::fetchTicksInChunk(LevelChunk *chunk, bool remov vector > *Level::getEntities(shared_ptr except, AABB *bb) +{ + return getEntities(except, bb, NULL); +} + +vector > *Level::getEntities(shared_ptr except, AABB *bb, const EntitySelector *selector) { MemSect(40); es.clear(); @@ -3751,24 +3736,28 @@ vector > *Level::getEntities(shared_ptr except, AABB { if (hasChunk(xc, zc)) { - getChunk(xc, zc)->getEntities(except, bb, es); + getChunk(xc, zc)->getEntities(except, bb, es, selector); } } - MemSect(0); + MemSect(0); #ifdef __PSVITA__ #ifdef _ENTITIES_RW_SECTION - LeaveCriticalRWSection(&LevelChunk::m_csEntities, false); + LeaveCriticalRWSection(&LevelChunk::m_csEntities, false); #else - LeaveCriticalSection(&LevelChunk::m_csEntities); + LeaveCriticalSection(&LevelChunk::m_csEntities); #endif #endif - return &es; + return &es; } - vector > *Level::getEntitiesOfClass(const type_info& baseClass, AABB *bb) +{ + return getEntitiesOfClass(baseClass, bb, NULL); +} + +vector > *Level::getEntitiesOfClass(const type_info& baseClass, AABB *bb, const EntitySelector *selector) { int xc0 = Mth::floor((bb->x0 - 2) / 16); int xc1 = Mth::floor((bb->x1 + 2) / 16); @@ -3786,13 +3775,15 @@ vector > *Level::getEntitiesOfClass(const type_info& baseClas #endif for (int xc = xc0; xc <= xc1; xc++) + { for (int zc = zc0; zc <= zc1; zc++) { if (hasChunk(xc, zc)) { - getChunk(xc, zc)->getEntitiesOfClass(baseClass, bb, *es); + getChunk(xc, zc)->getEntitiesOfClass(baseClass, bb, *es, selector); } } + } #ifdef __PSVITA__ #ifdef _ENTITIES_RW_SECTION @@ -3889,7 +3880,7 @@ unsigned int Level::countInstanceOf(eINSTANCEOF clas, bool singleType, unsigned } else { - if (e->GetType() & clas) count++; + if (e->instanceof(clas)) count++; } } LeaveCriticalSection(&m_entitiesCS); @@ -3905,7 +3896,7 @@ unsigned int Level::countInstanceOfInRange(eINSTANCEOF clas, bool singleType, in for (AUTO_VAR(it, entities.begin()); it != itEnd; it++) { shared_ptr e = *it;//entities.at(i); - + float sd = e->distanceTo(x,y,z); if (sd * sd > range * range) { @@ -3921,10 +3912,7 @@ unsigned int Level::countInstanceOfInRange(eINSTANCEOF clas, bool singleType, in } else { - if (e->GetType() & clas) - { - count++; - } + if (e->instanceof(clas)) count++; } } LeaveCriticalSection(&m_entitiesCS); @@ -3979,7 +3967,7 @@ void Level::removeEntities(vector > *list) entitiesToRemove.insert(entitiesToRemove.end(), list->begin(), list->end()); } -bool Level::mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int face, shared_ptr ignoreEntity) +bool Level::mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int face, shared_ptr ignoreEntity, shared_ptr item) { int targetType = getTile(x, y, z); Tile *targetTile = Tile::tiles[targetType]; @@ -3991,11 +3979,14 @@ bool Level::mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int f if (aabb != NULL && !isUnobstructed(aabb, ignoreEntity)) return false; if (targetTile != NULL && (targetTile == Tile::water || targetTile == Tile::calmWater || targetTile == Tile::lava || - targetTile == Tile::calmLava || targetTile == Tile::fire || targetTile->material->isReplaceable())) targetTile = NULL; + targetTile == Tile::calmLava || targetTile == Tile::fire || targetTile->material->isReplaceable())) + { + targetTile = NULL; + } if (targetTile != NULL && targetTile->material == Material::decoration && tile == Tile::anvil) return true; if (tileId > 0 && targetTile == NULL) { - if (tile->mayPlace(this, x, y, z, face)) + if (tile->mayPlace(this, x, y, z, face, item)) { return true; } @@ -4023,7 +4014,7 @@ Path *Level::findPath(shared_ptr from, shared_ptr to, float maxD int x2 = x + r; int y2 = y + r; int z2 = z + r; - Region region = Region(this, x1, y1, z1, x2, y2, z2); + Region region = Region(this, x1, y1, z1, x2, y2, z2, 0); Path *path = (PathFinder(®ion, canPassDoors, canOpenDoors, avoidWater, canFloat)).findPath(from.get(), to.get(), maxDist); return path; } @@ -4042,55 +4033,79 @@ Path *Level::findPath(shared_ptr from, int xBest, int yBest, int zBest, int x2 = x + r; int y2 = y + r; int z2 = z + r; - Region region = Region(this, x1, y1, z1, x2, y2, z2); + Region region = Region(this, x1, y1, z1, x2, y2, z2, 0); Path *path = (PathFinder(®ion, canPassDoors, canOpenDoors, avoidWater, canFloat)).findPath(from.get(), xBest, yBest, zBest, maxDist); return path; } -bool Level::getDirectSignal(int x, int y, int z, int dir) +int Level::getDirectSignal(int x, int y, int z, int dir) { int t = getTile(x, y, z); - if (t == 0) return false; + if (t == 0) return Redstone::SIGNAL_NONE; return Tile::tiles[t]->getDirectSignal(this, x, y, z, dir); } +int Level::getDirectSignalTo(int x, int y, int z) +{ + int result = Redstone::SIGNAL_NONE; + result = max(result, getDirectSignal(x, y - 1, z, 0)); + if (result >= Redstone::SIGNAL_MAX) return result; + result = max(result, getDirectSignal(x, y + 1, z, 1)); + if (result >= Redstone::SIGNAL_MAX) return result; + result = max(result, getDirectSignal(x, y, z - 1, 2)); + if (result >= Redstone::SIGNAL_MAX) return result; + result = max(result, getDirectSignal(x, y, z + 1, 3)); + if (result >= Redstone::SIGNAL_MAX) return result; + result = max(result, getDirectSignal(x - 1, y, z, 4)); + if (result >= Redstone::SIGNAL_MAX) return result; + result = max(result, getDirectSignal(x + 1, y, z, 5)); + if (result >= Redstone::SIGNAL_MAX) return result; + return result; +} -bool Level::hasDirectSignal(int x, int y, int z) +bool Level::hasSignal(int x, int y, int z, int dir) { - if (getDirectSignal(x, y - 1, z, 0)) return true; - if (getDirectSignal(x, y + 1, z, 1)) return true; - if (getDirectSignal(x, y, z - 1, 2)) return true; - if (getDirectSignal(x, y, z + 1, 3)) return true; - if (getDirectSignal(x - 1, y, z, 4)) return true; - if (getDirectSignal(x + 1, y, z, 5)) return true; - return false; + return getSignal(x, y, z, dir) > Redstone::SIGNAL_NONE; } - -bool Level::getSignal(int x, int y, int z, int dir) +int Level::getSignal(int x, int y, int z, int dir) { if (isSolidBlockingTile(x, y, z)) { - return hasDirectSignal(x, y, z); + return getDirectSignalTo(x, y, z); } int t = getTile(x, y, z); - if (t == 0) return false; + if (t == 0) return Redstone::SIGNAL_NONE; return Tile::tiles[t]->getSignal(this, x, y, z, dir); } - bool Level::hasNeighborSignal(int x, int y, int z) { - if (getSignal(x, y - 1, z, 0)) return true; - if (getSignal(x, y + 1, z, 1)) return true; - if (getSignal(x, y, z - 1, 2)) return true; - if (getSignal(x, y, z + 1, 3)) return true; - if (getSignal(x - 1, y, z, 4)) return true; - if (getSignal(x + 1, y, z, 5)) return true; + if (getSignal(x, y - 1, z, 0) > 0) return true; + if (getSignal(x, y + 1, z, 1) > 0) return true; + if (getSignal(x, y, z - 1, 2) > 0) return true; + if (getSignal(x, y, z + 1, 3) > 0) return true; + if (getSignal(x - 1, y, z, 4) > 0) return true; + if (getSignal(x + 1, y, z, 5) > 0) return true; return false; } +int Level::getBestNeighborSignal(int x, int y, int z) +{ + int best = Redstone::SIGNAL_NONE; + + for (int i = 0; i < 6; i++) + { + int signal = getSignal(x + Facing::STEP_X[i], y + Facing::STEP_Y[i], z + Facing::STEP_Z[i], i); + + if (signal >= Redstone::SIGNAL_MAX) return Redstone::SIGNAL_MAX; + if (signal > best) best = signal; + } + + return best; +} + // 4J Stu - Added maxYDist param shared_ptr Level::getNearestPlayer(shared_ptr source, double maxDist, double maxYDist /*= -1*/) { @@ -4148,15 +4163,16 @@ shared_ptr Level::getNearestAttackablePlayer(shared_ptr source, shared_ptr Level::getNearestAttackablePlayer(double x, double y, double z, double maxDist) { - double best = -1; - - shared_ptr result = nullptr; + double best = -1; + + shared_ptr result = nullptr; AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) { shared_ptr p = *it; - if (p->abilities.invulnerable) + // 4J Stu - Added privilege check + if (p->abilities.invulnerable || !p->isAlive() || p->hasInvisiblePrivilege() ) { continue; } @@ -4166,28 +4182,27 @@ shared_ptr Level::getNearestAttackablePlayer(double x, double y, double // decrease the max attackable distance if the target player // is sneaking or invisible - if (p->isSneaking()) + if (p->isSneaking()) { - visibleDist *= .8f; - } + visibleDist *= .8f; + } if (p->isInvisible()) { - float coverPercentage = p->getArmorCoverPercentage(); - if (coverPercentage < .1f) + float coverPercentage = p->getArmorCoverPercentage(); + if (coverPercentage < .1f) { - coverPercentage = .1f; - } - visibleDist *= (.7f * coverPercentage); - } - - // 4J Stu - Added check that this player is still alive and privilege check - if ((visibleDist < 0 || dist < visibleDist * visibleDist) && (best == -1 || dist < best) && p->isAlive() && !p->hasInvisiblePrivilege()) + coverPercentage = .1f; + } + visibleDist *= (.7f * coverPercentage); + } + + if ((visibleDist < 0 || dist < visibleDist * visibleDist) && (best == -1 || dist < best)) { - best = dist; - result = p; - } - } - return result; + best = dist; + result = p; + } + } + return result; } shared_ptr Level::getPlayerByName(const wstring& name) @@ -4195,7 +4210,7 @@ shared_ptr Level::getPlayerByName(const wstring& name) AUTO_VAR(itEnd, players.end()); for (AUTO_VAR(it, players.begin()); it != itEnd; it++) { - if (name.compare( (*it)->name) == 0) + if (name.compare( (*it)->getName()) == 0) { return *it; //players.at(i); } @@ -4318,25 +4333,13 @@ void Level::checkSession() } -void Level::setTime(__int64 time) +void Level::setGameTime(__int64 time) { // 4J : WESTY : Added to track game time played by players for other awards. if (time != 0) // Ignore setting time to 0, done at level start and during tutorial. { // Determine step in time and ensure it is reasonable ( we only have an int to store the player stat). - __int64 timeDiff = time - levelData->getTime(); - - // debug setting added to keep it at day time -#ifndef _FINAL_BUILD - if(app.DebugSettingsOn()) - { - if(app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getTime(); - } - } -#endif + __int64 timeDiff = time - levelData->getGameTime(); if (timeDiff < 0) { @@ -4350,7 +4353,7 @@ void Level::setTime(__int64 time) } // Apply stat to each player. - if ( timeDiff > 0 && levelData->getTime() != -1 ) + if ( timeDiff > 0 && levelData->getGameTime() != -1 ) { AUTO_VAR(itEnd, players.end()); for (vector >::iterator it = players.begin(); it != itEnd; it++) @@ -4360,12 +4363,7 @@ void Level::setTime(__int64 time) } } - this->levelData->setTime(time); -} - -void Level::setOverrideTimeOfDay(__int64 time) -{ - m_timeOfDayOverride = time; + levelData->setGameTime(time); } __int64 Level::getSeed() @@ -4373,12 +4371,20 @@ __int64 Level::getSeed() return levelData->getSeed(); } +__int64 Level::getGameTime() +{ + return levelData->getGameTime(); +} -__int64 Level::getTime() +__int64 Level::getDayTime() { - return levelData->getTime(); + return levelData->getDayTime(); } +void Level::setDayTime(__int64 newTime) +{ + levelData->setDayTime(newTime); +} Pos *Level::getSharedSpawnPos() { @@ -4395,7 +4401,6 @@ void Level::setSpawnPos(Pos *spawnPos) setSpawnPos(spawnPos->x, spawnPos->y, spawnPos->z); } - void Level::ensureAdded(shared_ptr entity) { int xc = Mth::floor(entity->x / 16); @@ -4405,7 +4410,7 @@ void Level::ensureAdded(shared_ptr entity) { for (int z = zc - r; z <= zc + r; z++) { - this->getChunk(x, z); + getChunk(x, z); } } @@ -4452,6 +4457,10 @@ LevelData *Level::getLevelData() return levelData; } +GameRules *Level::getGameRules() +{ + return levelData->getGameRules(); +} void Level::updateSleepingPlayerList() { @@ -4471,7 +4480,7 @@ float Level::getRainLevel(float a) void Level::setRainLevel(float rainLevel) { - this->oRainLevel = rainLevel; + oRainLevel = rainLevel; this->rainLevel = rainLevel; } @@ -4494,7 +4503,7 @@ bool Level::isRainingAt(int x, int y, int z) if (!canSeeSky(x, y, z)) return false; if (getTopRainBlock(x, z) > y) return false; -// 4J - changed to use new method of getting biomedata that caches results of rain & snow + // 4J - changed to use new method of getting biomedata that caches results of rain & snow if (biomeHasSnow(x, z)) return false; return biomeHasRain(x, z); } @@ -4529,14 +4538,14 @@ int Level::getAuxValueForMap(PlayerUID xuid, int dimension, int centreXC, int ce return savedDataStorage->getAuxValueForMap(xuid, dimension, centreXC, centreZC, scale); } -// void Level::globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data) -// { -// auto itEnd = listeners.end(); -// for (auto it = listeners.begin(); it != itEnd; it++) -// { -// (*it)->globalLevelEvent(type, sourceX, sourceY, sourceZ, data); -// } -// } +void Level::globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data) +{ + AUTO_VAR(itEnd, listeners.end()); + for (AUTO_VAR(it, listeners.begin()); it != itEnd; it++) + { + (*it)->globalLevelEvent(type, sourceX, sourceY, sourceZ, data); + } +} void Level::levelEvent(int type, int x, int y, int z, int data) { @@ -4563,6 +4572,11 @@ int Level::getHeight() return dimension->hasCeiling ? genDepth : maxBuildHeight; } +Tickable *Level::makeSoundUpdater(shared_ptr minecart) +{ + return NULL; +} + Random *Level::getRandomFor(int x, int z, int blend) { __int64 seed = (x * 341873128712l + z * 132897987541l) + getLevelData()->getSeed() + blend; @@ -4570,14 +4584,9 @@ Random *Level::getRandomFor(int x, int z, int blend) return random; } -bool Level::updateLights() -{ - return false; -} - TilePos *Level::findNearestMapFeature(const wstring& featureName, int x, int y, int z) { - return getChunkSource()->findNearestMapFeature(this, featureName, x, y, z); + return getChunkSource()->findNearestMapFeature(this, featureName, x, y, z); } bool Level::isAllEmpty() @@ -4603,6 +4612,75 @@ void Level::destroyTileProgress(int id, int x, int y, int z, int progress) } } +void Level::createFireworks(double x, double y, double z, double xd, double yd, double zd, CompoundTag *infoTag) +{ + +} + +Scoreboard *Level::getScoreboard() +{ + return scoreboard; +} + +void Level::updateNeighbourForOutputSignal(int x, int y, int z, int source) +{ + for (int dir = 0; dir < 4; dir++) + { + int xx = x + Direction::STEP_X[dir]; + int zz = z + Direction::STEP_Z[dir]; + int id = getTile(xx, y, zz); + if (id == 0) continue; + Tile *tile = Tile::tiles[id]; + + if (Tile::comparator_off->isSameDiode(id)) + { + tile->neighborChanged(this, xx, y, zz, source); + } + else if (Tile::isSolidBlockingTile(id)) + { + xx += Direction::STEP_X[dir]; + zz += Direction::STEP_Z[dir]; + id = getTile(xx, y, zz); + tile = Tile::tiles[id]; + + if (Tile::comparator_off->isSameDiode(id)) + { + tile->neighborChanged(this, xx, y, zz, source); + } + } + } +} + +float Level::getDifficulty(double x, double y, double z) +{ + return getDifficulty(Mth::floor(x), Mth::floor(y), Mth::floor(z)); +} + +/** +* Returns a difficulty scaled from 0 (easiest) to 1 (normal), may overflow +* to 1.5 (hardest) if allowed by player. +*/ +float Level::getDifficulty(int x, int y, int z) +{ + float result = 0; + bool isHard = difficulty == Difficulty::HARD; + + if (hasChunkAt(x, y, z)) + { + float moonBrightness = getMoonBrightness(); + + result += Mth::clamp(getChunkAt(x, z)->inhabitedTime / (TICKS_PER_DAY * 150.0f), 0.0f, 1.0f) * (isHard ? 1.0f : 0.75f); + result += moonBrightness * 0.25f; + } + + if (difficulty < Difficulty::NORMAL) + { + result *= difficulty / 2.0f; + } + + return Mth::clamp(result, 0.0f, isHard ? 1.5f : 1.0f);; +} + bool Level::useNewSeaLevel() { return levelData->useNewSeaLevel(); @@ -4650,7 +4728,7 @@ bool Level::isChunkFinalised(int x, int z) if( !isChunkPostPostProcessed(x + xo, z + zo) ) return false; } - return true; + return true; } int Level::getUnsavedChunkCount() @@ -4672,7 +4750,7 @@ bool Level::canCreateMore(eINSTANCEOF type, ESPAWN_TYPE spawnType) { int count = 0; int max = 0; - if(spawnType == eSpawnType_Egg) + if(spawnType == eSpawnType_Egg || spawnType == eSpawnType_Portal) { switch(type) { @@ -4704,17 +4782,38 @@ bool Level::canCreateMore(eINSTANCEOF type, ESPAWN_TYPE spawnType) count = countInstanceOf( eTYPE_VILLAGERGOLEM, true); max = MobCategory::MAX_XBOX_IRONGOLEM; break; + case eTYPE_WITHERBOSS: + count = countInstanceOf(eTYPE_WITHERBOSS, true) + countInstanceOf(eTYPE_ENDERDRAGON, true); + max = MobCategory::MAX_CONSOLE_BOSS; + break; default: if((type & eTYPE_ANIMALS_SPAWN_LIMIT_CHECK) == eTYPE_ANIMALS_SPAWN_LIMIT_CHECK) { count = countInstanceOf( eTYPE_ANIMALS_SPAWN_LIMIT_CHECK, false); max = MobCategory::MAX_XBOX_ANIMALS_WITH_SPAWN_EGG; } - else if( (type & eTYPE_MONSTER) == eTYPE_MONSTER) + // 4J: Use eTYPE_ENEMY instead of monster (slimes and ghasts aren't monsters) + else if(Entity::instanceof(type, eTYPE_ENEMY)) { - count = countInstanceOf( eTYPE_MONSTER, false); + count = countInstanceOf(eTYPE_ENEMY, false); max = MobCategory::MAX_XBOX_MONSTERS_WITH_SPAWN_EGG; } + else if( (type & eTYPE_AMBIENT) == eTYPE_AMBIENT) + { + count = countInstanceOf( eTYPE_AMBIENT, false); + max = MobCategory::MAX_AMBIENT_WITH_SPAWN_EGG; + } + // 4J: Added minecart and boats + else if (Entity::instanceof(type, eTYPE_MINECART)) + { + count = countInstanceOf(eTYPE_MINECART, false); + max = Level::MAX_CONSOLE_MINECARTS; + } + else if (Entity::instanceof(type, eTYPE_BOAT)) + { + count = countInstanceOf(eTYPE_BOAT, true); + max = Level::MAX_XBOX_BOATS; + } }; } else if(spawnType == eSpawnType_Breed) @@ -4750,5 +4849,6 @@ bool Level::canCreateMore(eINSTANCEOF type, ESPAWN_TYPE spawnType) break; } } - return count < max; + // 4J: Interpret 0 as no limit + return max == 0 || count < max; } \ No newline at end of file diff --git a/Minecraft.World/Level.h b/Minecraft.World/Level.h index 361a40e8..6e6b28cd 100644 --- a/Minecraft.World/Level.h +++ b/Minecraft.World/Level.h @@ -41,6 +41,11 @@ class LevelSettings; class Biome; class Villages; class VillageSiege; +class Tickable; +class Minecart; +class EntitySelector; +class Scoreboard; +class GameRules; class Level : public LevelSource { @@ -61,7 +66,7 @@ public: static const int MAX_LEVEL_SIZE = 30000000; static const int maxMovementHeight = 512; // 4J added - static const int minBuildHeight = 0; // 4J - brought forward from 1.2.3 + static const int minBuildHeight = 0; // 4J - brought forward from 1.2.3 static const int maxBuildHeight = 256; // 4J - brought forward from 1.2.3 static const int genDepthBits = 7; static const int genDepthBitsPlusFour = genDepthBits + 4; @@ -84,7 +89,7 @@ public: static bool getCacheTestEnabled(); static bool getInstaTick(); static void setInstaTick(bool enable); -// bool instaTick; // 4J - removed + // bool instaTick; // 4J - removed static const int MAX_BRIGHTNESS = 15; static const int TICKS_PER_DAY = 20 * 60 * 20; // ORG:20*60*20 @@ -124,16 +129,15 @@ public: protected: float oRainLevel, rainLevel; float oThunderLevel, thunderLevel; - int lightningTime; public: - int lightningBoltTime; - bool noNeighborUpdate; + int skyFlashTime; + int difficulty; Random *random; bool isNew; Dimension *dimension; - + protected: vector listeners; @@ -152,6 +156,13 @@ public: shared_ptr villages; VillageSiege *villageSiege; +private: + // 4J - Calendar is now static + // Calendar *calendar; + +protected: + Scoreboard *scoreboard; + public: Biome *getBiome(int x, int z); // 4J - brought forward from 1.2.3 virtual BiomeSource *getBiomeSource(); @@ -164,7 +175,6 @@ private: public: Level(shared_ptrlevelStorage, const wstring& name, Dimension *dimension, LevelSettings *levelSettings, bool doCreateChunkSource = true); - Level(Level *level, Dimension *dimension); Level(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings); Level(shared_ptrlevelStorage, const wstring& levelName, LevelSettings *levelSettings, Dimension *fixedDimension, bool doCreateChunkSource = true); @@ -187,6 +197,7 @@ public: bool isEmptyTile(int x, int y, int z); virtual bool isEntityTile(int x, int y, int z); int getTileRenderShape(int x, int y, int z); + int getTileRenderShape(int t); // 4J Added to slightly optimise and avoid getTile call if we already know the tile bool hasChunkAt(int x, int y, int z); bool hasChunksAt(int x, int y, int z, int r); bool hasChunksAt(int x0, int y0, int z0, int x1, int y1, int z1); @@ -201,36 +212,31 @@ public: public: LevelChunk *getChunkAt(int x, int z); LevelChunk *getChunk(int x, int z); - virtual bool setTileAndDataNoUpdate(int x, int y, int z, int tile, int data); - virtual bool setTileAndDataNoUpdate(int x, int y, int z, int tile, int data, bool informClients); - virtual bool setTileNoUpdate(int x, int y, int z, int tile); - bool setTileNoUpdateNoLightCheck(int x, int y, int z, int tile); // 4J added + virtual bool setTileAndData(int x, int y, int z, int tile, int data, int updateFlags); Material *getMaterial(int x, int y, int z); virtual int getData(int x, int y, int z); - void setData(int x, int y, int z, int data, bool forceUpdate=false); // 4J added forceUpdate - virtual bool setDataNoUpdate(int x, int y, int z, int data); - bool setTile(int x, int y, int z, int tile); - bool setTileAndData(int x, int y, int z, int tile, int data); - void sendTileUpdated(int x, int y, int z); + virtual bool setData(int x, int y, int z, int data, int updateFlags, bool forceUpdate =false); // 4J added forceUpdate + virtual bool removeTile(int x, int y, int z); + virtual bool destroyTile(int x, int y, int z, bool dropResources); + virtual bool setTileAndUpdate(int x, int y, int z, int tile); + virtual void sendTileUpdated(int x, int y, int z); public: virtual void tileUpdated(int x, int y, int z, int tile); void lightColumnChanged(int x, int z, int y0, int y1); void setTileDirty(int x, int y, int z); void setTilesDirty(int x0, int y0, int z0, int x1, int y1, int z1); - void swap(int x1, int y1, int z1, int x2, int y2, int z2); void updateNeighborsAt(int x, int y, int z, int tile); - -private: + void updateNeighborsAtExceptFromFacing(int x, int y, int z, int tile, int skipFacing); void neighborChanged(int x, int y, int z, int type); - -public: + virtual bool isTileToBeTickedAt(int x, int y, int z, int tileId); bool canSeeSky(int x, int y, int z); int getDaytimeRawBrightness(int x, int y, int z); int getRawBrightness(int x, int y, int z); int getRawBrightness(int x, int y, int z, bool propagate); bool isSkyLit(int x, int y, int z); int getHeightmap(int x, int z); + int getLowestHeightmap(int x, int z); void updateLightIfOtherThan(LightLayer::variety layer, int x, int y, int z, int expected); int getBrightnessPropagate(LightLayer::variety layer, int x, int y, int z, int tileId); // 4J added tileId void getNeighbourBrightnesses(int *brightnesses, LightLayer::variety layer, int x, int y, int z); // 4J added @@ -247,7 +253,8 @@ public: inline int getBrightnessCached(lightCache_t *cache, LightLayer::variety layer, int x, int y, int z); inline int getEmissionCached(lightCache_t *cache, int ct, int x, int y, int z); inline int getBlockingCached(lightCache_t *cache, LightLayer::variety layer, int *ct, int x, int y, int z); - void initCache(lightCache_t *cache); + void initCachePartial(lightCache_t *cache, int xc, int yc, int zc); + void initCacheComplete(lightCache_t *cache, int xc, int yc, int zc); void flushCache(lightCache_t *cache, __uint64 cacheUse, LightLayer::variety layer); bool cachewritten; @@ -278,10 +285,11 @@ public: HitResult *clip(Vec3 *a, Vec3 *b, bool liquid); HitResult *clip(Vec3 *a, Vec3 *b, bool liquid, bool solidOnly); - virtual void playSound(shared_ptr entity, int iSound, float volume, float pitch); + virtual void playEntitySound(shared_ptr entity, int iSound, float volume, float pitch); + virtual void playPlayerSound(shared_ptr entity, int iSound, float volume, float pitch); virtual void playSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist=16.0f); - virtual void playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, float fClipSoundDist=16.0f); + virtual void playLocalSound(double x, double y, double z, int iSound, float volume, float pitch, bool distanceDelay, float fClipSoundDist=16.0f); void playStreamingMusic(const wstring& name, int x, int y, int z); void playMusic(double x, double y, double z, const wstring& string, float volume); @@ -305,13 +313,14 @@ private: AABBList boxes; public: - AABBList *getCubes(shared_ptr source, AABB *box, bool noEntities=false, bool blockAtEdge=false); // 4J - added noEntities & blockAtEdge parameters - AABBList *getTileCubes(AABB *box, bool blockAtEdge); // 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player + AABBList *getCubes(shared_ptr source, AABB *box, bool noEntities = false, bool blockAtEdge = false); // 4J: Added noEntities & blockAtEdge parameters + AABBList *getTileCubes(AABB *box, bool blockAtEdge = false); // 4J: Added noEntities & blockAtEdge parameters int getOldSkyDarken(float a); // 4J - change brought forward from 1.8.2 float getSkyDarken(float a); // 4J - change brought forward from 1.8.2 Vec3 *getSkyColor(shared_ptr source, float a); float getTimeOfDay(float a); - int getMoonPhase(float a); + int getMoonPhase(); + float getMoonBrightness(); float getSunAngle(float a); Vec3 *getCloudColor(float a); Vec3 *getFogColor(float a); @@ -322,7 +331,8 @@ public: int getLightDepth(int x, int z); float getStarBrightness(float a); virtual void addToTickNextTick(int x, int y, int z, int tileId, int tickDelay); - virtual void forceAddTileTick(int x, int y, int z, int tileId, int tickDelay); + virtual void addToTickNextTick(int x, int y, int z, int tileId, int tickDelay, int priorityTilt); + virtual void forceAddTileTick(int x, int y, int z, int tileId, int tickDelay, int prioTilt); virtual void tickEntities(); void addAllPendingTileEntities(vector< shared_ptr >& entities); void tick(shared_ptr e); @@ -350,7 +360,9 @@ public: virtual bool isSolidRenderTile(int x, int y, int z); virtual bool isSolidBlockingTile(int x, int y, int z); bool isSolidBlockingTileInLoadedChunk(int x, int y, int z, bool valueIfNotLoaded); + bool isFullAABBTile(int x, int y, int z); virtual bool isTopSolidBlocking(int x, int y, int z); // 4J - brought forward from 1.3.2 + bool isTopSolidBlocking(Tile *tile, int data); protected: bool spawnEnemies; @@ -386,7 +398,7 @@ protected: private: int delayUntilNextMoodSound; static const int CHUNK_POLL_RANGE = 9; - static const int CHUNK_TILE_TICK_COUNT = 80; + static const int CHUNK_TILE_TICK_COUNT = 80; static const int CHUNK_SECTION_TILE_TICK_COUNT = (CHUNK_TILE_TICK_COUNT / 8) + 1; protected: @@ -402,9 +414,8 @@ public: bool shouldSnow(int x, int y, int z); void checkLight(int x, int y, int z, bool force = false, bool rootOnlyEmissive = false); // 4J added force, rootOnlySource parameters private: - int *toCheckLevel; - int getExpectedSkyColor(lightCache_t *cache, int oc, int x, int y , int z, int ct, int block); - int getExpectedBlockColor(lightCache_t *cache, int oc, int x, int y, int z, int ct, int block, bool propagatedOnly); // 4J added parameter + int *toCheckLevel; + int getExpectedLight(lightCache_t *cache, int x, int y, int z, LightLayer::variety layer, bool propagatedOnly); public: void checkLight(LightLayer::variety layer, int xc, int yc, int zc, bool force = false, bool rootOnlyEmissive = false); // 4J added force, rootOnlySource parameters @@ -419,29 +430,34 @@ public: bool isClientSide; vector > *getEntities(shared_ptr except, AABB *bb); + vector > *getEntities(shared_ptr except, AABB *bb, const EntitySelector *selector); vector > *getEntitiesOfClass(const type_info& baseClass, AABB *bb); + vector > *getEntitiesOfClass(const type_info& baseClass, AABB *bb, const EntitySelector *selector); shared_ptr getClosestEntityOfClass(const type_info& baseClass, AABB *bb, shared_ptr source); + virtual shared_ptr getEntity(int entityId) = 0; vector > getAllEntities(); void tileEntityChanged(int x, int y, int z, shared_ptr te); -// unsigned int countInstanceOf(BaseObject::Class *clas); + // unsigned int countInstanceOf(BaseObject::Class *clas); unsigned int countInstanceOf(eINSTANCEOF clas, bool singleType, unsigned int *protectedCount = NULL, unsigned int *couldWanderCount = NULL); // 4J added unsigned int countInstanceOfInRange(eINSTANCEOF clas, bool singleType, int range, int x, int y, int z); // 4J Added void addEntities(vector > *list); virtual void removeEntities(vector > *list); - bool mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int face, shared_ptr ignoreEntity); + bool mayPlace(int tileId, int x, int y, int z, bool ignoreEntities, int face, shared_ptr ignoreEntity, shared_ptr item); int getSeaLevel(); Path *findPath(shared_ptr from, shared_ptr to, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat); Path *findPath(shared_ptr from, int xBest, int yBest, int zBest, float maxDist, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat); - bool getDirectSignal(int x, int y, int z, int dir); - bool hasDirectSignal(int x, int y, int z); - bool getSignal(int x, int y, int z, int dir); + int getDirectSignal(int x, int y, int z, int dir); + int getDirectSignalTo(int x, int y, int z); + bool hasSignal(int x, int y, int z, int dir); + int getSignal(int x, int y, int z, int dir); bool hasNeighborSignal(int x, int y, int z); + int getBestNeighborSignal(int x, int y, int z); // 4J Added maxYDist param shared_ptr getNearestPlayer(shared_ptr source, double maxDist, double maxYDist = -1); shared_ptr getNearestPlayer(double x, double y, double z, double maxDist, double maxYDist = -1); shared_ptr getNearestPlayer(double x, double z, double maxDist); - shared_ptr getNearestAttackablePlayer(shared_ptr source, double maxDist); - shared_ptr getNearestAttackablePlayer(double x, double y, double z, double maxDist); + shared_ptr getNearestAttackablePlayer(shared_ptr source, double maxDist); + shared_ptr getNearestAttackablePlayer(double x, double y, double z, double maxDist); shared_ptr getPlayerByName(const wstring& name); shared_ptr getPlayerByUUID(const wstring& name); // 4J Added @@ -449,10 +465,11 @@ public: void setBlocksAndData(int x, int y, int z, int xs, int ys, int zs, byteArray data, bool includeLighting = true); virtual void disconnect(bool sendDisconnect = true); void checkSession(); - void setTime(__int64 time); - void setOverrideTimeOfDay(__int64 time); // 4J Added so we can override timeOfDay without changing tick time + void setGameTime(__int64 time); __int64 getSeed(); - __int64 getTime(); + __int64 getGameTime(); + __int64 getDayTime(); + void setDayTime(__int64 newTime); Pos *getSharedSpawnPos(); void setSpawnPos(int x, int y, int z); void setSpawnPos(Pos *spawnPos); @@ -463,6 +480,7 @@ public: virtual void tileEvent(int x, int y, int z, int tile, int b0, int b1); LevelStorage *getLevelStorage(); LevelData *getLevelData(); + GameRules *getGameRules(); virtual void updateSleepingPlayerList(); bool useNewSeaLevel(); // 4J added bool getHasBeenInCreative(); // 4J Added @@ -479,25 +497,27 @@ public: void setSavedData(const wstring& id, shared_ptr data); shared_ptr getSavedData(const type_info& clazz, const wstring& id); int getFreeAuxValueFor(const wstring& id); + void globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data); void levelEvent(int type, int x, int y, int z, int data); void levelEvent(shared_ptr source, int type, int x, int y, int z, int data); int getMaxBuildHeight(); int getHeight(); + virtual Tickable *makeSoundUpdater(shared_ptr minecart); Random *getRandomFor(int x, int z, int blend); - bool updateLights(); virtual bool isAllEmpty(); double getHorizonHeight() ; void destroyTileProgress(int id, int x, int y, int z, int progress); - TilePos *findNearestMapFeature(const wstring& featureName, int x, int y, int z); + // Calendar *getCalendar(); // 4J - Calendar is now static + virtual void createFireworks(double x, double y, double z, double xd, double yd, double zd, CompoundTag *infoTag); + virtual Scoreboard *getScoreboard(); + virtual void updateNeighbourForOutputSignal(int x, int y, int z, int source); + virtual float getDifficulty(double x, double y, double z); + virtual float getDifficulty(int x, int y, int z); + TilePos *findNearestMapFeature(const wstring& featureName, int x, int y, int z); // 4J Added int getAuxValueForMap(PlayerUID xuid, int dimension, int centreXC, int centreZC, int scale); - // 4J added - - - __int64 m_timeOfDayOverride; - // 4J - optimisation - keep direct reference of underlying cache here LevelChunk **chunkSourceCache; int chunkSourceXZSize; @@ -531,6 +551,7 @@ public: { eSpawnType_Egg, eSpawnType_Breed, + eSpawnType_Portal, }; bool canCreateMore(eINSTANCEOF type, ESPAWN_TYPE spawnType); diff --git a/Minecraft.World/LevelChunk.cpp b/Minecraft.World/LevelChunk.cpp index 823c7c4c..920fdfc1 100644 --- a/Minecraft.World/LevelChunk.cpp +++ b/Minecraft.World/LevelChunk.cpp @@ -11,10 +11,13 @@ #include "SparseLightStorage.h" #include "BlockReplacements.h" #include "LevelChunk.h" +#include "BasicTypeContainers.h" #include "..\Minecraft.Client\MinecraftServer.h" #include "..\Minecraft.Client\ServerLevel.h" #include "..\Minecraft.Client\ServerChunkCache.h" #include "..\Minecraft.Client\GameRenderer.h" +#include "ItemEntity.h" +#include "Minecart.h" #ifdef __PS3__ #include "C4JSpursJob.h" @@ -25,10 +28,10 @@ CRITICAL_SECTION LevelChunk::m_csSharing; #endif #ifdef _ENTITIES_RW_SECTION - // AP - use a RW critical section so we can have multiple threads reading the same data to avoid a clash - CRITICAL_RW_SECTION LevelChunk::m_csEntities; +// AP - use a RW critical section so we can have multiple threads reading the same data to avoid a clash +CRITICAL_RW_SECTION LevelChunk::m_csEntities; #else - CRITICAL_SECTION LevelChunk::m_csEntities; +CRITICAL_SECTION LevelChunk::m_csEntities; #endif CRITICAL_SECTION LevelChunk::m_csTileEntities; bool LevelChunk::touchedSky = false; @@ -78,11 +81,11 @@ void LevelChunk::init(Level *level, int x, int z) // 4J Stu - Not using this checkLightPosition = 0; //LIGHT_CHECK_MAX_POS; - this->level = level; - this->x = x; - this->z = z; + this->level = level; + this->x = x; + this->z = z; MemSect(1); - heightmap = byteArray(16 * 16); + heightmap = byteArray(16 * 16); #ifdef _ENTITIES_RW_SECTION EnterCriticalRWSection(&m_csEntities, true); #else @@ -90,8 +93,8 @@ void LevelChunk::init(Level *level, int x, int z) #endif for (int i = 0; i < ENTITY_BLOCKS_LENGTH; i++) { - entityBlocks[i] = new vector >(); - } + entityBlocks[i] = new vector >(); + } #ifdef _ENTITIES_RW_SECTION LeaveCriticalRWSection(&m_csEntities, true); #else @@ -100,6 +103,9 @@ void LevelChunk::init(Level *level, int x, int z) MemSect(0); + lowestHeightmap = 256; + inhabitedTime = 0; + // Optimisation brought forward from 1.8.2, change from int to unsigned char & this special value changed from -999 to 255 for(int i = 0; i < 16 * 16; i++ ) { @@ -124,11 +130,11 @@ void LevelChunk::init(Level *level, int x, int z) // This ctor is used for loading a save into LevelChunk::LevelChunk(Level *level, int x, int z) : ENTITY_BLOCKS_LENGTH( Level::maxBuildHeight/16 ) { - init(level, x, z); + init(level, x, z); lowerBlocks = new CompressedTileStorage(); - lowerData = NULL; - lowerSkyLight = NULL; - lowerBlockLight = NULL; + lowerData = NULL; + lowerSkyLight = NULL; + lowerBlockLight = NULL; serverTerrainPopulated = NULL; if(Level::maxBuildHeight > Level::COMPRESSED_CHUNK_SECTION_HEIGHT) @@ -180,8 +186,8 @@ LevelChunk::LevelChunk(Level *level, byteArray blocks, int x, int z) : ENTITY_BL lowerSkyLight = new SparseLightStorage(true); lowerBlockLight = new SparseLightStorage(false); } -// skyLight = new DataLayer(blocks.length, level->depthBits); -// blockLight = new DataLayer(blocks.length, level->depthBits); + // skyLight = new DataLayer(blocks.length, level->depthBits); + // blockLight = new DataLayer(blocks.length, level->depthBits); if(Level::maxBuildHeight > Level::COMPRESSED_CHUNK_SECTION_HEIGHT) { @@ -209,16 +215,16 @@ LevelChunk::LevelChunk(Level *level, byteArray blocks, int x, int z) : ENTITY_BL // The original version this is shared from owns all the data that is shared into this copy, so it isn't deleted in the dtor. LevelChunk::LevelChunk(Level *level, int x, int z, LevelChunk *lc) : ENTITY_BLOCKS_LENGTH( Level::maxBuildHeight/16 ) { - init(level, x, z); + init(level, x, z); // 4J Stu - Copy over the biome data memcpy(biomes.data,lc->biomes.data,biomes.length); #ifdef SHARING_ENABLED - lowerBlocks = lc->lowerBlocks; - lowerData = lc->lowerData; - lowerSkyLight = new SparseLightStorage( lc->lowerSkyLight ); - lowerBlockLight = new SparseLightStorage( lc->lowerBlockLight ); + lowerBlocks = lc->lowerBlocks; + lowerData = lc->lowerData; + lowerSkyLight = new SparseLightStorage( lc->lowerSkyLight ); + lowerBlockLight = new SparseLightStorage( lc->lowerBlockLight ); upperBlocks = lc->upperBlocks; upperData = lc->upperData; upperSkyLight = new SparseLightStorage( lc->upperSkyLight ); @@ -454,12 +460,12 @@ LevelChunk::~LevelChunk() bool LevelChunk::isAt(int x, int z) { - return x == this->x && z == this->z; + return x == this->x && z == this->z; } int LevelChunk::getHeightmap(int x, int z) { - return heightmap[z << 4 | x] & 0xff; + return heightmap[z << 4 | x] & 0xff; } int LevelChunk::getHighestSectionPosition() @@ -499,7 +505,7 @@ void LevelChunk::recalcHeightmapOnly() #ifdef __PSVITA__ int Index = ( x << 11 ) + ( z << 7 ); int offset = Level::COMPRESSED_CHUNK_SECTION_TILES; - y = 127; + y = 127; while (y > 0 && Tile::lightBlock[blockData[Index + offset + (y - 1)]] == 0) // 4J - was blocks->get() was blocks[p + y - 1] { y--; @@ -533,7 +539,7 @@ void LevelChunk::recalcHeightmapOnly() this->setUnsaved(true); #ifdef __PSVITA__ - delete blockData.data; + delete blockData.data; #endif } @@ -544,18 +550,19 @@ void LevelChunk::recalcHeightmap() byteArray blockData = byteArray(Level::CHUNK_TILE_COUNT); getBlockData(blockData); #endif + lowestHeightmap = Integer::MAX_VALUE; - int min = Level::maxBuildHeight - 1; - for (int x = 0; x < 16; x++) - for (int z = 0; z < 16; z++) + int min = Level::maxBuildHeight - 1; + for (int x = 0; x < 16; x++) + for (int z = 0; z < 16; z++) { - int y = Level::maxBuildHeight - 1; -// int p = x << level->depthBitsPlusFour | z << level->depthBits; // 4J - removed - + int y = Level::maxBuildHeight - 1; + // int p = x << level->depthBitsPlusFour | z << level->depthBits; // 4J - removed + #ifdef __PSVITA__ int Index = ( x << 11 ) + ( z << 7 ); int offset = Level::COMPRESSED_CHUNK_SECTION_TILES; - y = 127; + y = 127; while (y > 0 && Tile::lightBlock[blockData[Index + offset + (y - 1)]] == 0) // 4J - was blocks->get() was blocks[p + y - 1] { y--; @@ -575,32 +582,33 @@ void LevelChunk::recalcHeightmap() } #else CompressedTileStorage *blocks = (y-1) >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT?upperBlocks : lowerBlocks; - while (y > 0 && Tile::lightBlock[blocks->get(x,(y-1) % Level::COMPRESSED_CHUNK_SECTION_HEIGHT,z) & 0xff] == 0) // 4J - was blocks->get() was blocks[p + y - 1] + while (y > 0 && Tile::lightBlock[blocks->get(x,(y-1) % Level::COMPRESSED_CHUNK_SECTION_HEIGHT,z) & 0xff] == 0) // 4J - was blocks->get() was blocks[p + y - 1] { - y--; + y--; blocks = (y-1) >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT?upperBlocks : lowerBlocks; } #endif - heightmap[z << 4 | x] = (byte) y; - if (y < min) min = y; + heightmap[z << 4 | x] = (byte) y; + if (y < min) min = y; + if (y < lowestHeightmap) lowestHeightmap = y; - if (!level->dimension->hasCeiling) + if (!level->dimension->hasCeiling) { - int br = Level::MAX_BRIGHTNESS; + int br = Level::MAX_BRIGHTNESS; int yy = Level::maxBuildHeight - 1; #ifdef __PSVITA__ int offset = Level::COMPRESSED_CHUNK_SECTION_TILES; SparseLightStorage *skyLight = upperSkyLight; yy = 127; - do + do { - br -= Tile::lightBlock[blockData[Index + offset + yy]]; // 4J - blocks->get() was blocks[p + yy] - if (br > 0) + br -= Tile::lightBlock[blockData[Index + offset + yy]]; // 4J - blocks->get() was blocks[p + yy] + if (br > 0) { - skyLight->set(x, yy, z, br); - } - yy--; - } while (yy > 0 && br > 0); + skyLight->set(x, yy, z, br); + } + yy--; + } while (yy > 0 && br > 0); if( yy == 0 && br > 0 ) { @@ -620,33 +628,33 @@ void LevelChunk::recalcHeightmap() #else CompressedTileStorage *blocks = yy >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT?upperBlocks : lowerBlocks; SparseLightStorage *skyLight = yy >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT? upperSkyLight : lowerSkyLight; - do + do { - br -= Tile::lightBlock[blocks->get(x,(yy % Level::COMPRESSED_CHUNK_SECTION_HEIGHT),z) & 0xff]; // 4J - blocks->get() was blocks[p + yy] - if (br > 0) + br -= Tile::lightBlock[blocks->get(x,(yy % Level::COMPRESSED_CHUNK_SECTION_HEIGHT),z) & 0xff]; // 4J - blocks->get() was blocks[p + yy] + if (br > 0) { - skyLight->set(x, (yy % Level::COMPRESSED_CHUNK_SECTION_HEIGHT), z, br); - } - yy--; + skyLight->set(x, (yy % Level::COMPRESSED_CHUNK_SECTION_HEIGHT), z, br); + } + yy--; blocks = yy >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT?upperBlocks : lowerBlocks; skyLight = yy >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT? upperSkyLight : lowerSkyLight; - } while (yy > 0 && br > 0); + } while (yy > 0 && br > 0); #endif - } - } + } + } - this->minHeight = min; + this->minHeight = min; - for (int x = 0; x < 16; x++) - for (int z = 0; z < 16; z++) - { - lightGaps(x, z); - } + for (int x = 0; x < 16; x++) + for (int z = 0; z < 16; z++) + { + lightGaps(x, z); + } - this->setUnsaved(true); + this->setUnsaved(true); #ifdef __PSVITA__ - delete blockData.data; + delete blockData.data; #endif } @@ -656,11 +664,11 @@ void LevelChunk::recalcHeightmap() void LevelChunk::lightLava() { if( !emissiveAdded ) return; - + for (int x = 0; x < 16; x++) for (int z = 0; z < 16; z++) { -// int p = x << 11 | z << 7; // 4J - removed + // int p = x << 11 | z << 7; // 4J - removed int ymax = getHeightmap(x,z); for (int y = 0; y < Level::COMPRESSED_CHUNK_SECTION_HEIGHT; y++) { @@ -668,7 +676,7 @@ void LevelChunk::lightLava() int emit = Tile::lightEmission[blocks->get(x,y,z)]; // 4J - blocks->get() was blocks[p + y] if( emit > 0 ) { -// printf("(%d,%d,%d)",this->x * 16 + x, y, this->z * 16 + z); + // printf("(%d,%d,%d)",this->x * 16 + x, y, this->z * 16 + z); // We'll be calling this function for a lot of chunks as they are post-processed. For every chunk that is // post-processed we're calling this for each of its neighbours in case some post-processing also created something // that needed lighting outside the starting chunk. Because of this, do a quick test on any emissive blocks that have @@ -681,7 +689,7 @@ void LevelChunk::lightLava() } } } - emissiveAdded = false; + emissiveAdded = false; } void LevelChunk::lightGaps(int x, int z) @@ -704,19 +712,19 @@ void LevelChunk::recheckGaps(bool bForce) int maxXZ = (level->dimension->getXZSize() * 16 ) / 2 - 1; // 4J - note - this test will currently return true for chunks at the edge of our world. Making further checks inside the loop now to address this issue. - if (level->hasChunksAt(x * 16 + 8, Level::maxBuildHeight / 2, z * 16 + 8, 16)) + if (level->hasChunksAt(x * 16 + 8, Level::maxBuildHeight / 2, z * 16 + 8, 16)) { - for (int x = 0; x < 16; x++) - for (int z = 0; z < 16; z++) + for (int x = 0; x < 16; x++) + for (int z = 0; z < 16; z++) { int slot = ( x >> 1 ) | (z * 8); int shift = ( x & 1 ) * 4; - if (bForce || ( columnFlags[slot] & ( eColumnFlag_recheck << shift ) ) ) + if (bForce || ( columnFlags[slot] & ( eColumnFlag_recheck << shift ) ) ) { - columnFlags[slot] &= ~( eColumnFlag_recheck << shift ); - int height = getHeightmap(x, z); - int xOffs = (this->x * 16) + x; - int zOffs = (this->z * 16) + z; + columnFlags[slot] &= ~( eColumnFlag_recheck << shift ); + int height = getHeightmap(x, z); + int xOffs = (this->x * 16) + x; + int zOffs = (this->z * 16) + z; // 4J - rewritten this to make sure that the minimum neighbour height which is calculated doesn't involve getting any heights from beyond the edge of the world, // which can lead to large, very expensive, non-existent cliff edges to be lit @@ -741,7 +749,7 @@ void LevelChunk::recheckGaps(bool bForce) int n = level->getHeightmap(xOffs, zOffs + 1); if ( n < nmin ) nmin = n; } - lightGap(xOffs, zOffs, nmin); + lightGap(xOffs, zOffs, nmin); if( !bForce ) // 4J - if doing a full forced thing over every single column, we don't need to do these offset checks too { @@ -751,77 +759,77 @@ void LevelChunk::recheckGaps(bool bForce) if( zOffs + 1 <= maxXZ ) lightGap(xOffs, zOffs + 1, height); } hasGapsToCheck = false; - } - } - } + } + } + } } void LevelChunk::lightGap(int x, int z, int source) { - int height = level->getHeightmap(x, z); + int height = level->getHeightmap(x, z); - if (height > source) + if (height > source) { - lightGap(x, z, source, height + 1); - } + lightGap(x, z, source, height + 1); + } else if (height < source) { - lightGap(x, z, height, source + 1); - } + lightGap(x, z, height, source + 1); + } } void LevelChunk::lightGap(int x, int z, int y1, int y2) { - if (y2 > y1) + if (y2 > y1) { - if (level->hasChunksAt(x, Level::maxBuildHeight / 2, z, 16)) + if (level->hasChunksAt(x, Level::maxBuildHeight / 2, z, 16)) { - for (int y = y1; y < y2; y++) + for (int y = y1; y < y2; y++) { - level->checkLight(LightLayer::Sky, x, y, z); - } - this->setUnsaved(true); - } - } + level->checkLight(LightLayer::Sky, x, y, z); + } + this->setUnsaved(true); + } + } } void LevelChunk::recalcHeight(int x, int yStart, int z) { - int yOld = heightmap[z << 4 | x] & 0xff; - int y = yOld; - if (yStart > yOld) y = yStart; + int yOld = heightmap[z << 4 | x] & 0xff; + int y = yOld; + if (yStart > yOld) y = yStart; + + // int p = x << level->depthBitsPlusFour | z << level->depthBits; // 4J - removed -// int p = x << level->depthBitsPlusFour | z << level->depthBits; // 4J - removed - CompressedTileStorage *blocks = (y-1) >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT?upperBlocks : lowerBlocks; while (y > 0 && Tile::lightBlock[blocks->get(x,(y-1) % Level::COMPRESSED_CHUNK_SECTION_HEIGHT,z) & 0xff] == 0) // 4J - blocks->get() was blocks[p + y - 1] { - y--; + y--; blocks = (y-1) >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT?upperBlocks : lowerBlocks; } - if (y == yOld) return; + if (y == yOld) return; -// level->lightColumnChanged(x, z, y, yOld); // 4J - this call moved below & corrected - see comment further down - heightmap[z << 4 | x] = (byte) y; + // level->lightColumnChanged(x, z, y, yOld); // 4J - this call moved below & corrected - see comment further down + heightmap[z << 4 | x] = (byte) y; - if (y < minHeight) + if (y < minHeight) { - minHeight = y; - } + minHeight = y; + } else { - int min = Level::maxBuildHeight - 1; - for (int _x = 0; _x < 16; _x++) - for (int _z = 0; _z < 16; _z++) + int min = Level::maxBuildHeight - 1; + for (int _x = 0; _x < 16; _x++) + for (int _z = 0; _z < 16; _z++) { - if ((heightmap[_z << 4 | _x] & 0xff) < min) min = (heightmap[_z << 4 | _x] & 0xff); - } - this->minHeight = min; - } + if ((heightmap[_z << 4 | _x] & 0xff) < min) min = (heightmap[_z << 4 | _x] & 0xff); + } + this->minHeight = min; + } - int xOffs = (this->x * 16) + x; - int zOffs = (this->z * 16) + z; + int xOffs = (this->x * 16) + x; + int zOffs = (this->z * 16) + z; if (!level->dimension->hasCeiling) { if (y < yOld) @@ -835,7 +843,7 @@ void LevelChunk::recalcHeight(int x, int yStart, int z) } else { // 4J - lighting change brought forward from 1.8.2 - // level->updateLight(LightLayer::Sky, xOffs, yOld, zOffs, xOffs, y, zOffs); + // level->updateLight(LightLayer::Sky, xOffs, yOld, zOffs, xOffs, y, zOffs); SparseLightStorage *skyLight = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT? upperSkyLight : lowerSkyLight; for (int yy = yOld; yy < y; yy++) { @@ -845,7 +853,7 @@ void LevelChunk::recalcHeight(int x, int yStart, int z) } int br = 15; - + SparseLightStorage *skyLight = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT? upperSkyLight : lowerSkyLight; while (y > 0 && br > 0) { @@ -857,7 +865,7 @@ void LevelChunk::recalcHeight(int x, int yStart, int z) if (br < 0) br = 0; skyLight->set(x, (y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT), z, br); // level.updateLightIfOtherThan(LightLayer.Sky, xOffs, y, zOffs, - // -1); + // -1); } } // 4J - changed to use xOffs and zOffs rather than the (incorrect) x and z it used to, and also moved so that it happens after all the lighting should be @@ -865,15 +873,16 @@ void LevelChunk::recalcHeight(int x, int yStart, int z) level->lightColumnChanged(xOffs, zOffs, y, yOld); // 4J - lighting changes brought forward from 1.8.2 - int height = heightmap[z << 4 | x]; - int y1 = yOld; - int y2 = height; - if (y2 < y1) - { - int tmp = y1; - y1 = y2; - y2 = tmp; - } + int height = heightmap[z << 4 | x]; + int y1 = yOld; + int y2 = height; + if (y2 < y1) + { + int tmp = y1; + y1 = y2; + y2 = tmp; + } + if (height < lowestHeightmap) lowestHeightmap = height; if (!level->dimension->hasCeiling) { PIXBeginNamedEvent(0,"Light gaps"); @@ -885,7 +894,7 @@ void LevelChunk::recalcHeight(int x, int yStart, int z) PIXEndNamedEvent(); } - this->setUnsaved(true); + this->setUnsaved(true); } /** @@ -910,25 +919,35 @@ int LevelChunk::getTile(int x, int y, int z) bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) { - byte tile = (byte) _tile; + byte tile = (byte) _tile; // Optimisation brought forward from 1.8.2, change from int to unsigned char & this special value changed from -999 to 255 - int slot = z << 4 | x; + int slot = z << 4 | x; - if (y >= ((int)rainHeights[slot]) - 1) + if (y >= ((int)rainHeights[slot]) - 1) { - rainHeights[slot] = 255; - } + rainHeights[slot] = 255; + } + + int oldHeight = heightmap[slot] & 0xff; - int oldHeight = heightmap[slot] & 0xff; - CompressedTileStorage *blocks = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperBlocks : lowerBlocks; SparseDataStorage *data = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperData : lowerData; int old = blocks->get(x,y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT,z); int oldData = data->get(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z); - if (old == _tile && oldData == _data) return false; - int xOffs = this->x * 16 + x; - int zOffs = this->z * 16 + z; + if (old == _tile && oldData == _data) + { + // 4J Stu - Need to do this here otherwise double chests don't always work correctly + shared_ptr te = getTileEntity(x, y, z); + if (te != NULL) + { + te->clearCache(); + } + + return false; + } + int xOffs = this->x * 16 + x; + int zOffs = this->z * 16 + z; if (old != 0 && !level->isClientSide) { Tile::tiles[old]->onRemoving(level, xOffs, y, zOffs, oldData); @@ -936,9 +955,9 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) PIXBeginNamedEvent(0,"Chunk setting tile"); blocks->set(x,y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT,z,tile); PIXEndNamedEvent(); - if (old != 0) + if (old != 0) { - if (!level->isClientSide) + if (!level->isClientSide) { Tile::tiles[old]->onRemove(level, xOffs, y, zOffs, old, oldData); } @@ -946,7 +965,7 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) { level->removeTileEntity(xOffs, y, zOffs); } - } + } PIXBeginNamedEvent(0,"Chunk setting data"); data->set(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z, _data); PIXEndNamedEvent(); @@ -984,14 +1003,14 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) } // level.updateLight(LightLayer.Carried, xOffs, y, zOffs, xOffs, y, - // zOffs); + // zOffs); PIXBeginNamedEvent(0,"Lighting gaps"); lightGaps(x, z); PIXEndNamedEvent(); } PIXEndNamedEvent(); data->set(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z, _data); - if (_tile != 0) + if (_tile != 0) { if (!level->isClientSide) { @@ -1008,18 +1027,18 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) if(!Tile::tiles[_tile]->mayPlace(level, xOffs, y, zOffs )) { blocks->set(x,y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT,z,0); -// blocks[x << level->depthBitsPlusFour | z << level->depthBits | y] = 0; + // blocks[x << level->depthBitsPlusFour | z << level->depthBits | y] = 0; } } } // AP - changed the method of EntityTile detection cos it's well slow on Vita mate -// if (_tile > 0 && dynamic_cast(Tile::tiles[_tile]) != NULL) + // if (_tile > 0 && dynamic_cast(Tile::tiles[_tile]) != NULL) if (_tile > 0 && Tile::tiles[_tile] != NULL && Tile::tiles[_tile]->isEntityTile()) { shared_ptr te = getTileEntity(x, y, z); if (te == NULL) { - te = ((EntityTile *) Tile::tiles[_tile])->newTileEntity(level); + te = dynamic_cast(Tile::tiles[_tile])->newTileEntity(level); //app.DebugPrintf("%s: Setting tile id %d, created tileEntity type %d\n", level->isClientSide?"Client":"Server", _tile, te->GetType()); level->setTileEntity(xOffs, y, zOffs, te); } @@ -1031,7 +1050,7 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) } } // AP - changed the method of EntityTile detection cos it's well slow on Vita mate -// else if (old > 0 && dynamic_cast(Tile::tiles[old]) != NULL) + // else if (old > 0 && dynamic_cast(Tile::tiles[old]) != NULL) else if (old > 0 && Tile::tiles[_tile] != NULL && Tile::tiles[_tile]->isEntityTile()) { shared_ptr te = getTileEntity(x, y, z); @@ -1039,10 +1058,10 @@ bool LevelChunk::setTileAndData(int x, int y, int z, int _tile, int _data) { te->clearCache(); } - } + } - this->setUnsaved(true); - return true; + this->setUnsaved(true); + return true; } bool LevelChunk::setTile(int x, int y, int z, int _tile) @@ -1060,17 +1079,17 @@ int LevelChunk::getData(int x, int y, int z) bool LevelChunk::setData(int x, int y, int z, int val, int mask, bool *maskedBitsChanged) { SparseDataStorage *data = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperData : lowerData; - this->setUnsaved(true); + this->setUnsaved(true); int old = data->get(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z); *maskedBitsChanged = ( ( old & mask ) != ( val & mask ) ); - if (old == val) + if (old == val) { - return false; - } + return false; + } - data->set(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z, val); + data->set(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z, val); int _tile = getTile(x, y, z); if (_tile > 0 && dynamic_cast( Tile::tiles[_tile] ) != NULL) { @@ -1086,19 +1105,23 @@ bool LevelChunk::setData(int x, int y, int z, int val, int mask, bool *maskedBit int LevelChunk::getBrightness(LightLayer::variety layer, int x, int y, int z) { - if (layer == LightLayer::Sky) + if (layer == LightLayer::Sky) { + if (level->dimension->hasCeiling) + { + return 0; + } SparseLightStorage *skyLight = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperSkyLight : lowerSkyLight; if(!skyLight) return 0; return skyLight->get(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z); } - else if (layer == LightLayer::Block) + else if (layer == LightLayer::Block) { SparseLightStorage *blockLight = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperBlockLight : lowerBlockLight; if(!blockLight) return 0; return blockLight->get(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z); } - else return 0; + else return 0; } // 4J added @@ -1116,12 +1139,12 @@ void LevelChunk::getNeighbourBrightnesses(int *brightnesses, LightLayer::variety brightnesses[5] = light->get(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z + 1); } - + if( layer == LightLayer::Sky ) light = (y-1) >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperSkyLight : lowerSkyLight; else light = (y-1) >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperBlockLight : lowerBlockLight; if(light) brightnesses[2] = light->get(x, (y - 1) % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z); - + if( layer == LightLayer::Sky ) light = (y+1) >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperSkyLight : lowerSkyLight; else light = (y+1) >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperBlockLight : lowerBlockLight; if(light) brightnesses[3] = light->get(x, (y + 1) % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z); @@ -1129,8 +1152,8 @@ void LevelChunk::getNeighbourBrightnesses(int *brightnesses, LightLayer::variety void LevelChunk::setBrightness(LightLayer::variety layer, int x, int y, int z, int brightness) { - this->setUnsaved(true); - if (layer == LightLayer::Sky) + this->setUnsaved(true); + if (layer == LightLayer::Sky) { if(!level->dimension->hasCeiling) { @@ -1138,7 +1161,7 @@ void LevelChunk::setBrightness(LightLayer::variety layer, int x, int y, int z, i skyLight->set(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z, brightness); } } - else if (layer == LightLayer::Block) + else if (layer == LightLayer::Block) { SparseLightStorage *blockLight = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperBlockLight : lowerBlockLight; blockLight->set(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z, brightness); @@ -1149,42 +1172,42 @@ int LevelChunk::getRawBrightness(int x, int y, int z, int skyDampen) { SparseLightStorage *skyLight = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperSkyLight : lowerSkyLight; int light = level->dimension->hasCeiling ? 0 : skyLight->get(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z); - if (light > 0) LevelChunk::touchedSky = true; - light -= skyDampen; + if (light > 0) touchedSky = true; + light -= skyDampen; SparseLightStorage *blockLight = y >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT ? upperBlockLight : lowerBlockLight; int block = blockLight->get(x, y % Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z); - if (block > light) light = block; + if (block > light) light = block; - /* - * int xd = (absFloor(level.player.x-(this->x*16+x))); int yd = - * (absFloor(level.player.y-(y))); int zd = - * (absFloor(level.player.z-(this->z*16+z))); int dd = xd+yd+zd; if - * (dd<15){ int carried = 15-dd; if (carried<0) carried = 0; if - * (carried>15) carried = 15; if (carried > light) light = carried; } - */ + /* + * int xd = (absFloor(level.player.x-(this->x*16+x))); int yd = + * (absFloor(level.player.y-(y))); int zd = + * (absFloor(level.player.z-(this->z*16+z))); int dd = xd+yd+zd; if + * (dd<15){ int carried = 15-dd; if (carried<0) carried = 0; if + * (carried>15) carried = 15; if (carried > light) light = carried; } + */ - return light; + return light; } void LevelChunk::addEntity(shared_ptr e) { - lastSaveHadEntities = true; + lastSaveHadEntities = true; - int xc = Mth::floor(e->x / 16); - int zc = Mth::floor(e->z / 16); - if (xc != this->x || zc != this->z) + int xc = Mth::floor(e->x / 16); + int zc = Mth::floor(e->z / 16); + if (xc != this->x || zc != this->z) { app.DebugPrintf("Wrong location!"); -// System.out.println("Wrong location! " + e); -// Thread.dumpStack(); - } - int yc = Mth::floor(e->y / 16); - if (yc < 0) yc = 0; + // System.out.println("Wrong location! " + e); + // Thread.dumpStack(); + } + int yc = Mth::floor(e->y / 16); + if (yc < 0) yc = 0; if (yc >= ENTITY_BLOCKS_LENGTH) yc = ENTITY_BLOCKS_LENGTH - 1; - e->inChunk = true; - e->xChunk = x; - e->yChunk = yc; - e->zChunk = z; + e->inChunk = true; + e->xChunk = x; + e->yChunk = yc; + e->zChunk = z; #ifdef _ENTITIES_RW_SECTION EnterCriticalRWSection(&m_csEntities, true); @@ -1202,13 +1225,13 @@ void LevelChunk::addEntity(shared_ptr e) void LevelChunk::removeEntity(shared_ptr e) { - removeEntity(e, e->yChunk); + removeEntity(e, e->yChunk); } void LevelChunk::removeEntity(shared_ptr e, int yc) { - if (yc < 0) yc = 0; - if (yc >= ENTITY_BLOCKS_LENGTH) yc = ENTITY_BLOCKS_LENGTH - 1; + if (yc < 0) yc = 0; + if (yc >= ENTITY_BLOCKS_LENGTH) yc = ENTITY_BLOCKS_LENGTH - 1; #ifdef _ENTITIES_RW_SECTION EnterCriticalRWSection(&m_csEntities, true); @@ -1246,27 +1269,27 @@ void LevelChunk::removeEntity(shared_ptr e, int yc) bool LevelChunk::isSkyLit(int x, int y, int z) { - return y >= (heightmap[z << 4 | x] & 0xff); + return y >= (heightmap[z << 4 | x] & 0xff); } void LevelChunk::skyBrightnessChanged() { - int x0 = this->x * 16; - int y0 = this->minHeight - 16; - int z0 = this->z * 16; - int x1 = this->x * 16 + 16; - int y1 = Level::maxBuildHeight - 1; - int z1 = this->z * 16 + 16; + int x0 = this->x * 16; + int y0 = this->minHeight - 16; + int z0 = this->z * 16; + int x1 = this->x * 16 + 16; + int y1 = Level::maxBuildHeight - 1; + int z1 = this->z * 16 + 16; - level->setTilesDirty(x0, y0, z0, x1, y1, z1); + level->setTilesDirty(x0, y0, z0, x1, y1, z1); } shared_ptr LevelChunk::getTileEntity(int x, int y, int z) { - TilePos pos(x, y, z); + TilePos pos(x, y, z); // 4J Stu - Changed as we should not be using the [] accessor (causes an insert when we don't want one) - //shared_ptr tileEntity = tileEntities[pos]; + //shared_ptr tileEntity = tileEntities[pos]; EnterCriticalSection(&m_csTileEntities); shared_ptr tileEntity = nullptr; AUTO_VAR(it, tileEntities.find(pos)); @@ -1280,20 +1303,20 @@ shared_ptr LevelChunk::getTileEntity(int x, int y, int z) // which then causes new tile entities to be created if the neighbour has already been destroyed if(level->m_bDisableAddNewTileEntities) return nullptr; - int t = getTile(x, y, z); - if (t <= 0 || !Tile::tiles[t]->isEntityTile()) return nullptr; - + int t = getTile(x, y, z); + if (t <= 0 || !Tile::tiles[t]->isEntityTile()) return nullptr; + // 4J-PB changed from this in 1.7.3 //EntityTile *et = (EntityTile *) Tile::tiles[t]; - //et->onPlace(level, this->x * 16 + x, y, this->z * 16 + z); + //et->onPlace(level, this->x * 16 + x, y, this->z * 16 + z); //if (tileEntity == NULL) //{ - tileEntity = ((EntityTile *) Tile::tiles[t])->newTileEntity(level); - level->setTileEntity(this->x * 16 + x, y, this->z * 16 + z, tileEntity); + tileEntity = dynamic_cast(Tile::tiles[t])->newTileEntity(level); + level->setTileEntity(this->x * 16 + x, y, this->z * 16 + z, tileEntity); //} - //tileEntity = tileEntities[pos]; // 4J - TODO - this doesn't seem right - assignment wrong way? Check + //tileEntity = tileEntities[pos]; // 4J - TODO - this doesn't seem right - assignment wrong way? Check // 4J Stu - It should have been inserted by now, but check to be sure EnterCriticalSection(&m_csTileEntities); @@ -1303,29 +1326,29 @@ shared_ptr LevelChunk::getTileEntity(int x, int y, int z) tileEntity = newIt->second; } LeaveCriticalSection(&m_csTileEntities); - } + } else { tileEntity = it->second; LeaveCriticalSection(&m_csTileEntities); } - if (tileEntity != NULL && tileEntity->isRemoved()) + if (tileEntity != NULL && tileEntity->isRemoved()) { EnterCriticalSection(&m_csTileEntities); - tileEntities.erase(pos); + tileEntities.erase(pos); LeaveCriticalSection(&m_csTileEntities); - return nullptr; - } - - return tileEntity; + return nullptr; + } + + return tileEntity; } void LevelChunk::addTileEntity(shared_ptr te) { - int xx = (int)(te->x - this->x * 16); - int yy = (int)te->y; - int zz = (int)(te->z - this->z * 16); - setTileEntity(xx, yy, zz, te); + int xx = (int)(te->x - this->x * 16); + int yy = (int)te->y; + int zz = (int)(te->z - this->z * 16); + setTileEntity(xx, yy, zz, te); if( loaded ) { EnterCriticalSection(&level->m_tileEntityListCS); @@ -1336,37 +1359,39 @@ void LevelChunk::addTileEntity(shared_ptr te) void LevelChunk::setTileEntity(int x, int y, int z, shared_ptr tileEntity) { - TilePos pos(x, y, z); + TilePos pos(x, y, z); - tileEntity->setLevel(level); - tileEntity->x = this->x * 16 + x; - tileEntity->y = y; - tileEntity->z = this->z * 16 + z; + tileEntity->setLevel(level); + tileEntity->x = this->x * 16 + x; + tileEntity->y = y; + tileEntity->z = this->z * 16 + z; if (getTile(x, y, z) == 0 || !Tile::tiles[getTile(x, y, z)]->isEntityTile()) // 4J - was !(Tile.tiles[getTile(x, y, z)] instanceof EntityTile)) { - app.DebugPrintf("Attempted to place a tile entity where there was no entity tile!\n"); - return; - } + app.DebugPrintf("Attempted to place a tile entity where there was no entity tile!\n"); + return; + } + AUTO_VAR(it, tileEntities.find(pos) ); + if(it != tileEntities.end()) it->second->setRemoved(); tileEntity->clearRemoved(); EnterCriticalSection(&m_csTileEntities); - tileEntities[pos] = tileEntity; + tileEntities[pos] = tileEntity; LeaveCriticalSection(&m_csTileEntities); } void LevelChunk::removeTileEntity(int x, int y, int z) { - TilePos pos(x, y, z); + TilePos pos(x, y, z); if (loaded) { // 4J - was: // TileEntity removeThis = tileEntities.remove(pos); - // if (removeThis != null) { - // removeThis.setRemoved(); - // } + // if (removeThis != null) { + // removeThis.setRemoved(); + // } EnterCriticalSection(&m_csTileEntities); AUTO_VAR(it, tileEntities.find(pos)); if( it != tileEntities.end() ) @@ -1401,10 +1426,11 @@ void LevelChunk::load() for (int i = 0; i < entityTags->size(); i++) { CompoundTag *teTag = entityTags->get(i); - shared_ptr te = EntityIO::loadStatic(teTag, level); - if (te != NULL) + shared_ptr ent = EntityIO::loadStatic(teTag, level); + if (ent != NULL) { - addEntity(te); + ent->onLoadedFromSave(); + addEntity(ent); } } } @@ -1462,13 +1488,13 @@ void LevelChunk::load() void LevelChunk::unload(bool unloadTileEntities) // 4J - added parameter { - loaded = false; + loaded = false; if( unloadTileEntities ) { EnterCriticalSection(&m_csTileEntities); for( AUTO_VAR(it, tileEntities.begin()); it != tileEntities.end(); it++ ) { - // 4J-PB -m 1.7.3 was it->second->setRemoved(); + // 4J-PB -m 1.7.3 was it->second->setRemoved(); level->markForRemoval(it->second); } LeaveCriticalSection(&m_csTileEntities); @@ -1502,12 +1528,12 @@ void LevelChunk::unload(bool unloadTileEntities) // 4J - added parameter PIXBeginNamedEvent(0,"Saving entities"); ListTag *entityTags = new ListTag(); - EnterCriticalSection(&m_csEntities); + EnterCriticalSection(&m_csEntities); for (int i = 0; i < ENTITY_BLOCKS_LENGTH; i++) { AUTO_VAR(itEnd, entityBlocks[i]->end()); for( vector >::iterator it = entityBlocks[i]->begin(); it != itEnd; it++ ) - { + { shared_ptr e = *it; CompoundTag *teTag = new CompoundTag(); if (e->save(teTag)) @@ -1520,7 +1546,7 @@ void LevelChunk::unload(bool unloadTileEntities) // 4J - added parameter // Clear out this list entityBlocks[i]->clear(); } - LeaveCriticalSection(&m_csEntities); + LeaveCriticalSection(&m_csEntities); m_unloadedEntitiesTag->put(L"Entities", entityTags); PIXEndNamedEvent(); @@ -1547,6 +1573,37 @@ void LevelChunk::unload(bool unloadTileEntities) // 4J - added parameter #endif } +bool LevelChunk::containsPlayer() +{ +#ifdef _ENTITIES_RW_SECTION + EnterCriticalRWSection(&m_csEntities, true); +#else + EnterCriticalSection(&m_csEntities); +#endif + for (int i = 0; i < ENTITY_BLOCKS_LENGTH; i++) + { + vector > *vecEntity = entityBlocks[i]; + for( int j = 0; j < vecEntity->size(); j++ ) + { + if(vecEntity->at(j)->GetType() == eTYPE_SERVERPLAYER ) + { +#ifdef _ENTITIES_RW_SECTION + LeaveCriticalRWSection(&m_csEntities, true); +#else + LeaveCriticalSection(&m_csEntities); +#endif + return true; + } + } + } +#ifdef _ENTITIES_RW_SECTION + LeaveCriticalRWSection(&m_csEntities, true); +#else + LeaveCriticalSection(&m_csEntities); +#endif + return false; +} + #ifdef _LARGE_WORLDS bool LevelChunk::isUnloaded() { @@ -1556,98 +1613,108 @@ bool LevelChunk::isUnloaded() void LevelChunk::markUnsaved() { - this->setUnsaved(true); + this->setUnsaved(true); } -void LevelChunk::getEntities(shared_ptr except, AABB *bb, vector > &es) +void LevelChunk::getEntities(shared_ptr except, AABB *bb, vector > &es, const EntitySelector *selector) { - int yc0 = Mth::floor((bb->y0 - 2) / 16); - int yc1 = Mth::floor((bb->y1 + 2) / 16); - if (yc0 < 0) yc0 = 0; - if (yc1 >= ENTITY_BLOCKS_LENGTH) yc1 = ENTITY_BLOCKS_LENGTH - 1; + int yc0 = Mth::floor((bb->y0 - 2) / 16); + int yc1 = Mth::floor((bb->y1 + 2) / 16); + if (yc0 < 0) yc0 = 0; + if (yc1 >= ENTITY_BLOCKS_LENGTH) yc1 = ENTITY_BLOCKS_LENGTH - 1; #ifndef __PSVITA__ // AP - RW critical sections are expensive so enter once in Level::getEntities EnterCriticalSection(&m_csEntities); #endif - for (int yc = yc0; yc <= yc1; yc++) + for (int yc = yc0; yc <= yc1; yc++) { - vector > *entities = entityBlocks[yc]; + vector > *entities = entityBlocks[yc]; AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - shared_ptr e = *it; //entities->at(i); - if (e != except && e->bb->intersects(bb)) + shared_ptr e = *it; //entities->at(i); + if (e != except && e->bb->intersects(bb) && (selector == NULL || selector->matches(e))) { es.push_back(e); - vector > *subs = e->getSubEntities(); - if (subs != NULL) + vector > *subs = e->getSubEntities(); + if (subs != NULL) { - for (int j = 0; j < subs->size(); j++) + for (int j = 0; j < subs->size(); j++) { - e = subs->at(j); - if (e != except && e->bb->intersects(bb)) + e = subs->at(j); + if (e != except && e->bb->intersects(bb) && (selector == NULL || selector->matches(e))) { - es.push_back(e); - } - } - } + es.push_back(e); + } + } + } } - } - } + } + } #ifndef __PSVITA__ LeaveCriticalSection(&m_csEntities); #endif } -void LevelChunk::getEntitiesOfClass(const type_info& ec, AABB *bb, vector > &es) +void LevelChunk::getEntitiesOfClass(const type_info& ec, AABB *bb, vector > &es, const EntitySelector *selector) { - int yc0 = Mth::floor((bb->y0 - 2) / 16); - int yc1 = Mth::floor((bb->y1 + 2) / 16); + int yc0 = Mth::floor((bb->y0 - 2) / 16); + int yc1 = Mth::floor((bb->y1 + 2) / 16); - if (yc0 < 0) + if (yc0 < 0) { - yc0 = 0; - } + yc0 = 0; + } else if (yc0 >= ENTITY_BLOCKS_LENGTH) { - yc0 = ENTITY_BLOCKS_LENGTH - 1; - } - if (yc1 >= ENTITY_BLOCKS_LENGTH) + yc0 = ENTITY_BLOCKS_LENGTH - 1; + } + if (yc1 >= ENTITY_BLOCKS_LENGTH) { - yc1 = ENTITY_BLOCKS_LENGTH - 1; - } + yc1 = ENTITY_BLOCKS_LENGTH - 1; + } else if (yc1 < 0) { - yc1 = 0; - } + yc1 = 0; + } #ifndef __PSVITA__ // AP - RW critical sections are expensive so enter once in Level::getEntitiesOfClass EnterCriticalSection(&m_csEntities); #endif - for (int yc = yc0; yc <= yc1; yc++) + for (int yc = yc0; yc <= yc1; yc++) { - vector > *entities = entityBlocks[yc]; - + vector > *entities = entityBlocks[yc]; + AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) { - shared_ptr e = *it; //entities->at(i); + shared_ptr e = *it; //entities->at(i); bool isAssignableFrom = false; // Some special cases where the base class is a general type that our class may be derived from, otherwise do a direct comparison of type_info - if( ec == typeid(Player) ) { if( dynamic_pointer_cast(e) != NULL ) isAssignableFrom = true; } - else if ( ec == typeid(Mob) ) { if( dynamic_pointer_cast(e) != NULL ) isAssignableFrom = true; } - else if ( ec == typeid(Monster) ) { if( dynamic_pointer_cast(e) != NULL ) isAssignableFrom = true; } - else if ( ec == typeid(Zombie) ) { if( dynamic_pointer_cast(e) != NULL ) isAssignableFrom = true; } + if ( ec==typeid(Player) ) isAssignableFrom = e->instanceof(eTYPE_PLAYER); + else if ( ec==typeid(Entity) ) isAssignableFrom = e->instanceof(eTYPE_ENTITY); + else if ( ec==typeid(Mob) ) isAssignableFrom = e->instanceof(eTYPE_MOB); + else if ( ec==typeid(LivingEntity) ) isAssignableFrom = e->instanceof(eTYPE_LIVINGENTITY); + else if ( ec==typeid(ItemEntity) ) isAssignableFrom = e->instanceof(eTYPE_ITEMENTITY); + else if ( ec==typeid(Minecart) ) isAssignableFrom = e->instanceof(eTYPE_MINECART); + else if ( ec==typeid(Monster) ) isAssignableFrom = e->instanceof(eTYPE_MONSTER); + else if ( ec==typeid(Zombie) ) isAssignableFrom = e->instanceof(eTYPE_ZOMBIE); else if(e != NULL && ec == typeid(*(e.get())) ) isAssignableFrom = true; - if (isAssignableFrom && e->bb->intersects(bb)) es.push_back(e); + if (isAssignableFrom && e->bb->intersects(bb)) + { + if (selector == NULL || selector->matches(e)) + { + es.push_back(e); + } + } // 4J - note needs to be equivalent to baseClass.isAssignableFrom(e.getClass()) - } - } + } + } #ifndef __PSVITA__ LeaveCriticalSection(&m_csEntities); #endif @@ -1655,16 +1722,16 @@ void LevelChunk::getEntitiesOfClass(const type_info& ec, AABB *bb, vectorsize(); - } + entityCount += (int)entityBlocks[yc]->size(); + } #ifdef _ENTITIES_RW_SECTION LeaveCriticalRWSection(&m_csEntities, false); #else @@ -1675,22 +1742,27 @@ int LevelChunk::countEntities() bool LevelChunk::shouldSave(bool force) { - if (dontSave) return false; - if (force) + if (dontSave) return false; + if (force) + { + if ((lastSaveHadEntities && level->getGameTime() != lastSaveTime) || m_unsaved) + { + return true; + } + } + else { - if (lastSaveHadEntities && level->getTime() != lastSaveTime) return true; - } else { - if (lastSaveHadEntities && level->getTime() >= lastSaveTime + 20 * 30) return true; - } + if (lastSaveHadEntities && level->getGameTime() >= lastSaveTime + 20 * 30) return true; + } - return m_unsaved; + return m_unsaved; } int LevelChunk::getBlocksAndData(byteArray *data, int x0, int y0, int z0, int x1, int y1, int z1, int p, bool includeLighting/* = true*/) { - int xs = x1 - x0; - int ys = y1 - y0; - int zs = z1 - z0; + int xs = x1 - x0; + int ys = y1 - y0; + int zs = z1 - z0; // 4J Stu - Added this because some "min" functions don't let us use our constants :( int compressedHeight = Level::COMPRESSED_CHUNK_SECTION_HEIGHT; @@ -1714,26 +1786,26 @@ int LevelChunk::getBlocksAndData(byteArray *data, int x0, int y0, int z0, int x1 } /* - for (int x = x0; x < x1; x++) - for (int z = z0; z < z1; z++) - { - int slot = (x << level->depthBitsPlusFour | z << level->depthBits | y0) >> 1; - int len = (y1 - y0) / 2; - System::arraycopy(blockLight->data, slot, data, p, len); - p += len; - } - - for (int x = x0; x < x1; x++) - for (int z = z0; z < z1; z++) - { - int slot = (x << level->depthBitsPlusFour | z << level->depthBits | y0) >> 1; - int len = (y1 - y0) / 2; - System::arraycopy(skyLight->data, slot, data, p, len); - p += len; - } - */ + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + int slot = (x << level->depthBitsPlusFour | z << level->depthBits | y0) >> 1; + int len = (y1 - y0) / 2; + System::arraycopy(blockLight->data, slot, data, p, len); + p += len; + } + + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + int slot = (x << level->depthBitsPlusFour | z << level->depthBits | y0) >> 1; + int len = (y1 - y0) / 2; + System::arraycopy(skyLight->data, slot, data, p, len); + p += len; + } + */ - return p; + return p; } // 4J added - return true if setBlocksAndData would change any blocks @@ -1791,16 +1863,16 @@ int LevelChunk::setBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, if(y0 < Level::COMPRESSED_CHUNK_SECTION_HEIGHT) p += lowerBlocks->setDataRegion( data, x0, y0, z0, x1, min(compressedHeight, y1), z1, p, includeLighting ? NULL : tileUpdatedCallback, this, 0 ); if(y1 > Level::COMPRESSED_CHUNK_SECTION_HEIGHT) p += upperBlocks->setDataRegion( data, x0, max(y0-compressedHeight,0), z0, x1, y1-Level::COMPRESSED_CHUNK_SECTION_HEIGHT, z1, p, includeLighting ? NULL : tileUpdatedCallback, this, Level::COMPRESSED_CHUNK_SECTION_HEIGHT ); /* - for (int x = x0; x < x1; x++) - for (int z = z0; z < z1; z++) - { - int slot = x << level->depthBitsPlusFour | z << level->depthBits | y0; - int len = y1 - y0; - System::arraycopy(data, p, &blocks, slot, len); - p += len; - }*/ + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + int slot = x << level->depthBitsPlusFour | z << level->depthBits | y0; + int len = y1 - y0; + System::arraycopy(data, p, &blocks, slot, len); + p += len; + }*/ - recalcHeightmapOnly(); + recalcHeightmapOnly(); // 4J - replaced data storage as now uses SparseDataStorage if(y0 < Level::COMPRESSED_CHUNK_SECTION_HEIGHT) p += lowerData->setDataRegion( data, x0, y0, z0, x1, min(compressedHeight, y1), z1, p, includeLighting ? NULL : tileUpdatedCallback, this, 0 ); @@ -1838,30 +1910,30 @@ int LevelChunk::setBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, } /* - for (int x = x0; x < x1; x++) - for (int z = z0; z < z1; z++) - { - int slot = (x << level->depthBitsPlusFour | z << level->depthBits | y0) >> 1; - int len = (y1 - y0) / 2; - System::arraycopy(data, p, &blockLight->data, slot, len); - p += len; - } - - for (int x = x0; x < x1; x++) - for (int z = z0; z < z1; z++) - { - int slot = (x << level->depthBitsPlusFour | z << level->depthBits | y0) >> 1; - int len = (y1 - y0) / 2; - System::arraycopy(data, p, &skyLight->data, slot, len); - p += len; - } - */ + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + int slot = (x << level->depthBitsPlusFour | z << level->depthBits | y0) >> 1; + int len = (y1 - y0) / 2; + System::arraycopy(data, p, &blockLight->data, slot, len); + p += len; + } + + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + int slot = (x << level->depthBitsPlusFour | z << level->depthBits | y0) >> 1; + int len = (y1 - y0) / 2; + System::arraycopy(data, p, &skyLight->data, slot, len); + p += len; + } + */ for(AUTO_VAR(it, tileEntities.begin()); it != tileEntities.end(); ++it) { it->second->clearCache(); } -// recalcHeightmap(); + // recalcHeightmap(); // If the includeLighting flag is set, then this is a full chunk's worth of data. This is a good time to compress everything that we've just set up. if( includeLighting ) @@ -1871,7 +1943,7 @@ int LevelChunk::setBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, compressData(); } - return p; + return p; } void LevelChunk::setCheckAllLight() @@ -1881,26 +1953,26 @@ void LevelChunk::setCheckAllLight() Random *LevelChunk::getRandom(__int64 l) { - return new Random((level->getSeed() + x * x * 4987142 + x * 5947611 + z * z * 4392871l + z * 389711) ^ l); + return new Random((level->getSeed() + x * x * 4987142 + x * 5947611 + z * z * 4392871l + z * 389711) ^ l); } bool LevelChunk::isEmpty() { - return false; + return false; } void LevelChunk::attemptCompression() { // 4J - removed #if 0 - try { - ByteArrayOutputStream *baos = new ByteArrayOutputStream(); - GZIPOutputStream *gzos = new GZIPOutputStream(baos); - DataOutputStream *dos = new DataOutputStream(gzos); - dos.close(); - System.out.println("Compressed size: " + baos.toByteArray().length); - } catch (Exception e) { - - } + try { + ByteArrayOutputStream *baos = new ByteArrayOutputStream(); + GZIPOutputStream *gzos = new GZIPOutputStream(baos); + DataOutputStream *dos = new DataOutputStream(gzos); + dos.close(); + System.out.println("Compressed size: " + baos.toByteArray().length); + } catch (Exception e) { + + } #endif } @@ -1955,7 +2027,7 @@ void LevelChunk::tick() ChunkPos *LevelChunk::getPos() { - return new ChunkPos(x, z); + return new ChunkPos(x, z); } bool LevelChunk::isYSpaceEmpty(int y1, int y2) @@ -1963,20 +2035,34 @@ bool LevelChunk::isYSpaceEmpty(int y1, int y2) return false; // 4J Unused /*if (y1 < 0) { - y1 = 0; + y1 = 0; } if (y2 >= Level.maxBuildHeight) { - y2 = Level.maxBuildHeight - 1; + y2 = Level.maxBuildHeight - 1; } for (int y = y1; y <= y2; y += 16) { - LevelChunkSection section = sections[y >> 4]; - if (section != null && !section.isEmpty()) { - return false; - } + LevelChunkSection section = sections[y >> 4]; + if (section != null && !section.isEmpty()) { + return false; + } } return true;*/ } +// 4J Added +void LevelChunk::reloadBiomes() +{ + BiomeSource *biomeSource = level->dimension->biomeSource; + for(unsigned int x = 0; x < 16; ++x) + { + for(unsigned int z = 0; z < 16; ++z) + { + Biome *biome = biomeSource->getBiome((this->x << 4) + x, (this->z << 4) + z); + biomes[(z << 4) | x] = (byte) ( (biome->id) & 0xff); + } + } +} + Biome *LevelChunk::getBiome(int x, int z, BiomeSource *biomeSource) { int value = biomes[(z << 4) | x] & 0xff; @@ -2007,33 +2093,33 @@ void LevelChunk::setBiomes(byteArray biomes) // 4J - optimisation brought forward from 1.8.2 int LevelChunk::getTopRainBlock(int x, int z) { - int slot = x | (z << 4); - int h = rainHeights[slot]; + int slot = x | (z << 4); + int h = rainHeights[slot]; - if (h == 255) + if (h == 255) { - int y = Level::maxBuildHeight - 1; - h = -1; - while (y > 0 && h == -1) + int y = Level::maxBuildHeight - 1; + h = -1; + while (y > 0 && h == -1) { - int t = getTile(x, y, z); - Material *m = t == 0 ? Material::air : Tile::tiles[t]->material; - if (!m->blocksMotion() && !m->isLiquid()) + int t = getTile(x, y, z); + Material *m = t == 0 ? Material::air : Tile::tiles[t]->material; + if (!m->blocksMotion() && !m->isLiquid()) { - y--; - } + y--; + } else { - h = y + 1; - } - } + h = y + 1; + } + } // 255 indicates that the rain height needs recalculated. If the rain height ever actually Does get to 255, then it will just keep not being cached, so // probably better just to let the rain height be 254 in this instance and suffer a slightly incorrect results if( h == 255 ) h = 254; rainHeights[slot] = h; - } + } - return h; + return h; } // 4J added as optimisation, these biome checks are expensive so caching through flags in levelchunk @@ -2313,7 +2399,14 @@ int LevelChunk::getBlocksAllocatedSize(int *count0, int *count1, int *count2, in int LevelChunk::getHighestNonEmptyY() { int highestNonEmptyY = -1; - if(upperBlocks) highestNonEmptyY = upperBlocks->getHighestNonEmptyY() + Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + if(upperBlocks) + { + int upperNonEmpty = upperBlocks->getHighestNonEmptyY(); + if( upperNonEmpty >= 0 ) + { + highestNonEmptyY = upperNonEmpty + Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + } + } if(highestNonEmptyY < 0) highestNonEmptyY = lowerBlocks->getHighestNonEmptyY(); if(highestNonEmptyY < 0) highestNonEmptyY = 0; @@ -2400,7 +2493,7 @@ void LevelChunk::reorderBlocksAndDataToXZY(int y0, int xs, int ys, int zs, byteA int y1 = y0 + ys; unsigned int tileCount = xs * ys * zs; unsigned int halfTileCount = tileCount/2; - + int sectionHeight = Level::COMPRESSED_CHUNK_SECTION_HEIGHT; int lowerYSpan = min(y1, sectionHeight) - y0; int upperYSpan = ys - lowerYSpan; diff --git a/Minecraft.World/LevelChunk.h b/Minecraft.World/LevelChunk.h index e9510ad5..bc45016b 100644 --- a/Minecraft.World/LevelChunk.h +++ b/Minecraft.World/LevelChunk.h @@ -5,6 +5,8 @@ class DataLayer; class TileEntity; class Random; class ChunkSource; +class EntitySelector; + #include "SparseLightStorage.h" #include "CompressedTileStorage.h" #include "SparseDataStorage.h" @@ -31,7 +33,7 @@ public: const int ENTITY_BLOCKS_LENGTH; static const int BLOCKS_LENGTH = Level::CHUNK_TILE_COUNT; // 4J added - static bool touchedSky; + static bool touchedSky; enum EColumnFlag { @@ -41,7 +43,7 @@ public: eColumnFlag_biomeHasRain = 8, }; -// byteArray blocks; + // byteArray blocks; // 4J - actual storage for blocks is now private with public methods to access it private: CompressedTileStorage *lowerBlocks; // 0 - 127 @@ -52,10 +54,10 @@ public: void getBlockData(byteArray data); // Sets data in passed in array of size 32768, from the block data in this chunk int getBlocksAllocatedSize(int *count0, int *count1, int *count2, int *count4, int *count8); - bool loaded; + bool loaded; unsigned char rainHeights[16*16]; // 4J - optimisation brought forward from 1.8.2 (was int arrayb in java though) unsigned char columnFlags[16*8]; // 4J - lighting update brought forward from 1.8.2, was a bool array but now mixed with other flags in our version, and stored in nybbles - Level *level; + Level *level; // 4J - actual storage for data is now private with public methods to access it private: @@ -65,7 +67,7 @@ public: void setDataData(byteArray data); // Set data to that passed in in the input array of size 32768 void getDataData(byteArray data); // Sets data in passed in array of size 16384, from the data in this chunk -// DataLayer *data; + // DataLayer *data; private: // 4J - actual storage for sky & block lights is now private with new methods to be able to access it. @@ -93,16 +95,16 @@ public: void readCompressedSkyLightData(DataInputStream *dis); void readCompressedBlockLightData(DataInputStream *dis); - byteArray heightmap; - int minHeight; - int x, z; + byteArray heightmap; + int minHeight; + int x, z; private: bool hasGapsToCheck; public: - unordered_map, TilePosKeyHash, TilePosKeyEq> tileEntities; - vector > **entityBlocks; - + unordered_map, TilePosKeyHash, TilePosKeyEq> tileEntities; + vector > **entityBlocks; + static const int sTerrainPopulatedFromHere = 2; static const int sTerrainPopulatedFromW = 4; static const int sTerrainPopulatedFromS = 8; @@ -116,17 +118,17 @@ public: static const int sTerrainPopulatedAllNeighbours = 1022; // The post-processing passes of all neighbours to this chunk are complete static const int sTerrainPostPostProcessed = 1024; // This chunk has been post-post-processed, which is only done when all neighbours have been post-processed - short terrainPopulated; // 4J - changed from bool to bitfield within short + short terrainPopulated; // 4J - changed from bool to bitfield within short short *serverTerrainPopulated; // 4J added void setUnsaved(bool unsaved); // 4J added protected: // 4J Stu - Stopped this being private so we can add some more logic to it - bool m_unsaved; + bool m_unsaved; public: - bool dontSave; - bool lastSaveHadEntities; + bool dontSave; + bool lastSaveHadEntities; #ifdef SHARING_ENABLED bool sharingTilesAndData; // 4J added #endif @@ -135,8 +137,10 @@ public: virtual void reSyncLighting(); // 4J added void startSharingTilesAndData(int forceMs = 0); // 4J added __int64 lastUnsharedTime; // 4J added - __int64 lastSaveTime; + __int64 lastSaveTime; bool seenByPlayer; + int lowestHeightmap; + __int64 inhabitedTime; #ifdef _LARGE_WORLDS bool m_bUnloaded; @@ -149,73 +153,74 @@ private: public: virtual void init(Level *level, int x, int z); - LevelChunk(Level *level, int x, int z); - LevelChunk(Level *level, byteArray blocks, int x, int z); + LevelChunk(Level *level, int x, int z); + LevelChunk(Level *level, byteArray blocks, int x, int z); LevelChunk(Level *level, int x, int z, LevelChunk *lc); ~LevelChunk(); - virtual bool isAt(int x, int z); + virtual bool isAt(int x, int z); - virtual int getHeightmap(int x, int z); + virtual int getHeightmap(int x, int z); int getHighestSectionPosition(); - virtual void recalcBlockLights(); + virtual void recalcBlockLights(); - virtual void recalcHeightmapOnly(); + virtual void recalcHeightmapOnly(); - virtual void recalcHeightmap(); + virtual void recalcHeightmap(); - virtual void lightLava(); + virtual void lightLava(); private: - void lightGaps(int x, int z); + void lightGaps(int x, int z); // 4J - changes for lighting brought forward from 1.8.2 public: void recheckGaps(bool bForce = false); // 4J - added parameter, made public private: - void lightGap(int x, int z, int source); + void lightGap(int x, int z, int source); void lightGap(int x, int z, int y1, int y2); - void recalcHeight(int x, int yStart, int z); + void recalcHeight(int x, int yStart, int z); public: virtual int getTileLightBlock(int x, int y, int z); - virtual int getTile(int x, int y, int z); - virtual bool setTileAndData(int x, int y, int z, int _tile, int _data); - virtual bool setTile(int x, int y, int z, int _tile); - virtual int getData(int x, int y, int z); - virtual bool setData(int x, int y, int z, int val, int mask, bool *maskedBitsChanged); // 4J added mask - virtual int getBrightness(LightLayer::variety layer, int x, int y, int z); + virtual int getTile(int x, int y, int z); + virtual bool setTileAndData(int x, int y, int z, int _tile, int _data); + virtual bool setTile(int x, int y, int z, int _tile); + virtual int getData(int x, int y, int z); + virtual bool setData(int x, int y, int z, int val, int mask, bool *maskedBitsChanged); // 4J added mask + virtual int getBrightness(LightLayer::variety layer, int x, int y, int z); virtual void getNeighbourBrightnesses(int *brightnesses, LightLayer::variety layer, int x, int y, int z); // 4J added - virtual void setBrightness(LightLayer::variety layer, int x, int y, int z, int brightness); - virtual int getRawBrightness(int x, int y, int z, int skyDampen); - virtual void addEntity(shared_ptr e); - virtual void removeEntity(shared_ptr e); - virtual void removeEntity(shared_ptr e, int yc); - virtual bool isSkyLit(int x, int y, int z); - virtual void skyBrightnessChanged(); - virtual shared_ptr getTileEntity(int x, int y, int z); - virtual void addTileEntity(shared_ptr te); - virtual void setTileEntity(int x, int y, int z, shared_ptr tileEntity); - virtual void removeTileEntity(int x, int y, int z); - virtual void load(); - virtual void unload(bool unloadTileEntities) ; // 4J - added parameter + virtual void setBrightness(LightLayer::variety layer, int x, int y, int z, int brightness); + virtual int getRawBrightness(int x, int y, int z, int skyDampen); + virtual void addEntity(shared_ptr e); + virtual void removeEntity(shared_ptr e); + virtual void removeEntity(shared_ptr e, int yc); + virtual bool isSkyLit(int x, int y, int z); + virtual void skyBrightnessChanged(); + virtual shared_ptr getTileEntity(int x, int y, int z); + virtual void addTileEntity(shared_ptr te); + virtual void setTileEntity(int x, int y, int z, shared_ptr tileEntity); + virtual void removeTileEntity(int x, int y, int z); + virtual void load(); + virtual void unload(bool unloadTileEntities) ; // 4J - added parameter + virtual bool containsPlayer(); // 4J - added #ifdef _LARGE_WORLDS virtual bool isUnloaded(); #endif - virtual void markUnsaved(); - virtual void getEntities(shared_ptr except, AABB *bb, vector > &es); - virtual void getEntitiesOfClass(const type_info& ec, AABB *bb, vector > &es); - virtual int countEntities(); - virtual bool shouldSave(bool force); - virtual int getBlocksAndData(byteArray *data, int x0, int y0, int z0, int x1, int y1, int z1, int p, bool includeLighting = true); // 4J - added includeLighting parameter + virtual void markUnsaved(); + virtual void getEntities(shared_ptr except, AABB *bb, vector > &es, const EntitySelector *selector); + virtual void getEntitiesOfClass(const type_info& ec, AABB *bb, vector > &es, const EntitySelector *selector); + virtual int countEntities(); + virtual bool shouldSave(bool force); + virtual int getBlocksAndData(byteArray *data, int x0, int y0, int z0, int x1, int y1, int z1, int p, bool includeLighting = true); // 4J - added includeLighting parameter static void tileUpdatedCallback(int x, int y, int z, void *param, int yparam); // 4J added - virtual int setBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int p, bool includeLighting = true); // 4J - added includeLighting parameter + virtual int setBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int p, bool includeLighting = true); // 4J - added includeLighting parameter virtual bool testSetBlocksAndData(byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int p); // 4J added virtual void setCheckAllLight(); - virtual Random *getRandom(__int64 l); - virtual bool isEmpty(); - virtual void attemptCompression(); + virtual Random *getRandom(__int64 l); + virtual bool isEmpty(); + virtual void attemptCompression(); #ifdef SHARING_ENABLED static CRITICAL_SECTION m_csSharing; // 4J added @@ -234,6 +239,7 @@ public: void tick(); // 4J - lighting change brought forward from 1.8.2 ChunkPos *getPos(); bool isYSpaceEmpty(int y1, int y2); + void reloadBiomes(); // 4J added virtual Biome *getBiome(int x, int z, BiomeSource *biomeSource); byteArray getBiomes(); void setBiomes(byteArray biomes); diff --git a/Minecraft.World/LevelData.cpp b/Minecraft.World/LevelData.cpp index 026dca70..91b72fe8 100644 --- a/Minecraft.World/LevelData.cpp +++ b/Minecraft.World/LevelData.cpp @@ -12,7 +12,7 @@ LevelData::LevelData() LevelData::LevelData(CompoundTag *tag) { - seed = tag->getLong(L"RandomSeed"); + seed = tag->getLong(L"RandomSeed"); m_pGenerator = LevelType::lvl_normal; if (tag->contains(L"generatorName")) { @@ -31,31 +31,41 @@ LevelData::LevelData(CompoundTag *tag) } m_pGenerator = m_pGenerator->getReplacementForVersion(generatorVersion); } + + if (tag->contains(L"generatorOptions")) generatorOptions = tag->getString(L"generatorOptions"); } gameType = GameType::byId(tag->getInt(L"GameType")); - if (tag->contains(L"MapFeatures")) + if (tag->contains(L"MapFeatures")) { - generateMapFeatures = tag->getBoolean(L"MapFeatures"); - } + generateMapFeatures = tag->getBoolean(L"MapFeatures"); + } else { generateMapFeatures = true; - } + } spawnBonusChest = tag->getBoolean(L"spawnBonusChest"); - xSpawn = tag->getInt(L"SpawnX"); - ySpawn = tag->getInt(L"SpawnY"); - zSpawn = tag->getInt(L"SpawnZ"); - time = tag->getLong(L"Time"); - lastPlayed = tag->getLong(L"LastPlayed"); - sizeOnDisk = tag->getLong(L"SizeOnDisk"); - levelName = tag->getString(L"LevelName"); - version = tag->getInt(L"version"); - rainTime = tag->getInt(L"rainTime"); - raining = tag->getBoolean(L"raining"); - thunderTime = tag->getInt(L"thunderTime"); - thundering = tag->getBoolean(L"thundering"); + xSpawn = tag->getInt(L"SpawnX"); + ySpawn = tag->getInt(L"SpawnY"); + zSpawn = tag->getInt(L"SpawnZ"); + gameTime = tag->getLong(L"Time"); + if (tag->contains(L"DayTime")) + { + dayTime = tag->getLong(L"DayTime"); + } + else + { + dayTime = gameTime; + } + lastPlayed = tag->getLong(L"LastPlayed"); + sizeOnDisk = tag->getLong(L"SizeOnDisk"); + levelName = tag->getString(L"LevelName"); + version = tag->getInt(L"version"); + rainTime = tag->getInt(L"rainTime"); + raining = tag->getBoolean(L"raining"); + thunderTime = tag->getInt(L"thunderTime"); + thundering = tag->getBoolean(L"thundering"); hardcore = tag->getBoolean(L"hardcore"); if (tag->contains(L"initialized")) @@ -76,6 +86,12 @@ LevelData::LevelData(CompoundTag *tag) allowCommands = gameType == GameType::CREATIVE; } + // 4J: Game rules are now stored with app game host options + /*if (tag->contains(L"GameRules")) + { + gameRules.loadFromTag(tag->getCompound(L"GameRules")); + }*/ + newSeaLevel = tag->getBoolean(L"newSeaLevel"); // 4J added - only use new sea level for newly created maps. This read defaults to false. (sea level changes in 1.8.2) hasBeenInCreative = tag->getBoolean(L"hasBeenInCreative"); // 4J added so we can not award achievements to levels modified in creative @@ -111,7 +127,33 @@ LevelData::LevelData(CompoundTag *tag) // 4J Added m_xzSize = tag->getInt(L"XZSize"); m_hellScale = tag->getInt(L"HellScale"); - + +#ifdef _LARGE_WORLDS + m_classicEdgeMoat = tag->getInt(L"ClassicMoat"); + m_smallEdgeMoat = tag->getInt(L"SmallMoat"); + m_mediumEdgeMoat = tag->getInt(L"MediumMoat"); + + int newWorldSize = app.GetGameNewWorldSize(); + int newHellScale = app.GetGameNewHellScale(); + m_hellScaleOld = m_hellScale; + m_xzSizeOld = m_xzSize; + if(newWorldSize > m_xzSize) + { + bool bUseMoat = app.GetGameNewWorldSizeUseMoat(); + switch (m_xzSize) + { + case LEVEL_WIDTH_CLASSIC: m_classicEdgeMoat = bUseMoat; break; + case LEVEL_WIDTH_SMALL: m_smallEdgeMoat = bUseMoat; break; + case LEVEL_WIDTH_MEDIUM: m_mediumEdgeMoat = bUseMoat; break; + default: assert(0); break; + } + assert(newWorldSize > m_xzSize); + m_xzSize = newWorldSize; + m_hellScale = newHellScale; + } +#endif + + m_xzSize = min(m_xzSize,LEVEL_MAX_WIDTH); m_xzSize = max(m_xzSize,LEVEL_MIN_WIDTH); @@ -125,15 +167,29 @@ LevelData::LevelData(CompoundTag *tag) hellXZSize = m_xzSize / m_hellScale; } +#ifdef _LARGE_WORLDS + // set the host option, in case it wasn't setup already + EGameHostOptionWorldSize hostOptionworldSize = e_worldSize_Unknown; + switch(m_xzSize) + { + case LEVEL_WIDTH_CLASSIC: hostOptionworldSize = e_worldSize_Classic; break; + case LEVEL_WIDTH_SMALL: hostOptionworldSize = e_worldSize_Small; break; + case LEVEL_WIDTH_MEDIUM: hostOptionworldSize = e_worldSize_Medium; break; + case LEVEL_WIDTH_LARGE: hostOptionworldSize = e_worldSize_Large; break; + default: assert(0); break; + } + app.SetGameHostOption(eGameHostOption_WorldSize, hostOptionworldSize ); +#endif + /* 4J - we don't store this anymore - if (tag->contains(L"Player")) + if (tag->contains(L"Player")) { - loadedPlayerTag = tag->getCompound(L"Player"); - dimension = loadedPlayerTag->getInt(L"Dimension"); - } + loadedPlayerTag = tag->getCompound(L"Player"); + dimension = loadedPlayerTag->getInt(L"Dimension"); + } else { - this->loadedPlayerTag = NULL; + this->loadedPlayerTag = NULL; } */ dimension = 0; @@ -141,45 +197,47 @@ LevelData::LevelData(CompoundTag *tag) LevelData::LevelData(LevelSettings *levelSettings, const wstring& levelName) { - this->seed = levelSettings->getSeed(); - this->gameType = levelSettings->getGameType(); - this->generateMapFeatures = levelSettings->isGenerateMapFeatures(); - this->spawnBonusChest = levelSettings->hasStartingBonusItems(); - this->levelName = levelName; - this->m_pGenerator = levelSettings->getLevelType(); - this->hardcore = levelSettings->isHardcore(); + seed = levelSettings->getSeed(); + gameType = levelSettings->getGameType(); + generateMapFeatures = levelSettings->isGenerateMapFeatures(); + spawnBonusChest = levelSettings->hasStartingBonusItems(); + this->levelName = levelName; + m_pGenerator = levelSettings->getLevelType(); + hardcore = levelSettings->isHardcore(); + generatorOptions = levelSettings->getLevelTypeOptions(); + allowCommands = levelSettings->getAllowCommands(); // 4J Stu - Default initers - this->xSpawn = 0; - this->ySpawn = 0; - this->zSpawn = 0; - this->time = -1; // 4J-JEV: Edited: To know when this is uninitialized. - this->lastPlayed = 0; - this->sizeOnDisk = 0; -// this->loadedPlayerTag = NULL; // 4J - we don't store this anymore - this->dimension = 0; - this->version = 0; - this->rainTime = 0; - this->raining = false; - this->thunderTime = 0; - this->thundering = false; - this->allowCommands = levelSettings->getAllowCommands(); - this->initialized = false; - this->newSeaLevel = levelSettings->useNewSeaLevel(); // 4J added - only use new sea level for newly created maps (sea level changes in 1.8.2) - this->hasBeenInCreative = levelSettings->getGameType() == GameType::CREATIVE; // 4J added + xSpawn = 0; + ySpawn = 0; + zSpawn = 0; + dayTime = -1; // 4J-JEV: Edited: To know when this is uninitialized. + gameTime = -1; + lastPlayed = 0; + sizeOnDisk = 0; + // this->loadedPlayerTag = NULL; // 4J - we don't store this anymore + dimension = 0; + version = 0; + rainTime = 0; + raining = false; + thunderTime = 0; + thundering = false; + initialized = false; + newSeaLevel = levelSettings->useNewSeaLevel(); // 4J added - only use new sea level for newly created maps (sea level changes in 1.8.2) + hasBeenInCreative = levelSettings->getGameType() == GameType::CREATIVE; // 4J added // 4J-PB for the stronghold position - this->bStronghold=false; - this->xStronghold = 0; - this->yStronghold = 0; - this->zStronghold = 0; - - this->xStrongholdEndPortal = 0; - this->zStrongholdEndPortal = 0; - this->bStrongholdEndPortal = false; + bStronghold=false; + xStronghold = 0; + yStronghold = 0; + zStronghold = 0; + + xStrongholdEndPortal = 0; + zStrongholdEndPortal = 0; + bStrongholdEndPortal = false; m_xzSize = levelSettings->getXZSize(); m_hellScale = levelSettings->getHellScale(); - + m_xzSize = min(m_xzSize,LEVEL_MAX_WIDTH); m_xzSize = max(m_xzSize,LEVEL_MIN_WIDTH); @@ -191,56 +249,74 @@ LevelData::LevelData(LevelSettings *levelSettings, const wstring& levelName) { ++m_hellScale; hellXZSize = m_xzSize / m_hellScale; -} + } +#ifdef _LARGE_WORLDS + m_hellScaleOld = m_hellScale; + m_xzSizeOld = m_xzSize; + m_classicEdgeMoat = false; + m_smallEdgeMoat = false; + m_mediumEdgeMoat = false; +#endif + } LevelData::LevelData(LevelData *copy) { - this->seed = copy->seed; - this->m_pGenerator = copy->m_pGenerator; - this->gameType = copy->gameType; - this->generateMapFeatures = copy->generateMapFeatures; - this->spawnBonusChest = copy->spawnBonusChest; - this->xSpawn = copy->xSpawn; - this->ySpawn = copy->ySpawn; - this->zSpawn = copy->zSpawn; - this->time = copy->time; - this->lastPlayed = copy->lastPlayed; - this->sizeOnDisk = copy->sizeOnDisk; -// this->loadedPlayerTag = copy->loadedPlayerTag; // 4J - we don't store this anymore - this->dimension = copy->dimension; - this->levelName = copy->levelName; - this->version = copy->version; - this->rainTime = copy->rainTime; - this->raining = copy->raining; - this->thunderTime = copy->thunderTime; - this->thundering = copy->thundering; - this->hardcore = copy->hardcore; - this->allowCommands = copy->allowCommands; - this->initialized = copy->initialized; - this->newSeaLevel = copy->newSeaLevel; - this->hasBeenInCreative = copy->hasBeenInCreative; + seed = copy->seed; + m_pGenerator = copy->m_pGenerator; + generatorOptions = copy->generatorOptions; + gameType = copy->gameType; + generateMapFeatures = copy->generateMapFeatures; + spawnBonusChest = copy->spawnBonusChest; + xSpawn = copy->xSpawn; + ySpawn = copy->ySpawn; + zSpawn = copy->zSpawn; + gameTime = copy->gameTime; + dayTime = copy->dayTime; + lastPlayed = copy->lastPlayed; + sizeOnDisk = copy->sizeOnDisk; + // this->loadedPlayerTag = copy->loadedPlayerTag; // 4J - we don't store this anymore + dimension = copy->dimension; + levelName = copy->levelName; + version = copy->version; + rainTime = copy->rainTime; + raining = copy->raining; + thunderTime = copy->thunderTime; + thundering = copy->thundering; + hardcore = copy->hardcore; + allowCommands = copy->allowCommands; + initialized = copy->initialized; + newSeaLevel = copy->newSeaLevel; + hasBeenInCreative = copy->hasBeenInCreative; + gameRules = copy->gameRules; // 4J-PB for the stronghold position - this->bStronghold=copy->bStronghold; - this->xStronghold = copy->xStronghold; - this->yStronghold = copy->yStronghold; - this->zStronghold = copy->zStronghold; - - this->xStrongholdEndPortal = copy->xStrongholdEndPortal; - this->zStrongholdEndPortal = copy->zStrongholdEndPortal; - this->bStrongholdEndPortal = copy->bStrongholdEndPortal; + bStronghold=copy->bStronghold; + xStronghold = copy->xStronghold; + yStronghold = copy->yStronghold; + zStronghold = copy->zStronghold; + + xStrongholdEndPortal = copy->xStrongholdEndPortal; + zStrongholdEndPortal = copy->zStrongholdEndPortal; + bStrongholdEndPortal = copy->bStrongholdEndPortal; m_xzSize = copy->m_xzSize; m_hellScale = copy->m_hellScale; +#ifdef _LARGE_WORLDS + m_classicEdgeMoat = copy->m_classicEdgeMoat; + m_smallEdgeMoat = copy->m_smallEdgeMoat; + m_mediumEdgeMoat = copy->m_mediumEdgeMoat; + m_xzSizeOld = copy->m_xzSizeOld; + m_hellScaleOld = copy->m_hellScaleOld; +#endif } CompoundTag *LevelData::createTag() { - CompoundTag *tag = new CompoundTag(); + CompoundTag *tag = new CompoundTag(); - setTagData(tag); + setTagData(tag); - return tag; + return tag; } CompoundTag *LevelData::createTag(vector > *players) @@ -251,27 +327,31 @@ CompoundTag *LevelData::createTag(vector > *players) void LevelData::setTagData(CompoundTag *tag) { - tag->putLong(L"RandomSeed", seed); + tag->putLong(L"RandomSeed", seed); tag->putString(L"generatorName", m_pGenerator->getGeneratorName()); tag->putInt(L"generatorVersion", m_pGenerator->getVersion()); - tag->putInt(L"GameType", gameType->getId()); - tag->putBoolean(L"MapFeatures", generateMapFeatures); + tag->putString(L"generatorOptions", generatorOptions); + tag->putInt(L"GameType", gameType->getId()); + tag->putBoolean(L"MapFeatures", generateMapFeatures); tag->putBoolean(L"spawnBonusChest",spawnBonusChest); - tag->putInt(L"SpawnX", xSpawn); - tag->putInt(L"SpawnY", ySpawn); - tag->putInt(L"SpawnZ", zSpawn); - tag->putLong(L"Time", time); - tag->putLong(L"SizeOnDisk", sizeOnDisk); - tag->putLong(L"LastPlayed", System::currentTimeMillis()); - tag->putString(L"LevelName", levelName); - tag->putInt(L"version", version); - tag->putInt(L"rainTime", rainTime); - tag->putBoolean(L"raining", raining); - tag->putInt(L"thunderTime", thunderTime); - tag->putBoolean(L"thundering", thundering); + tag->putInt(L"SpawnX", xSpawn); + tag->putInt(L"SpawnY", ySpawn); + tag->putInt(L"SpawnZ", zSpawn); + tag->putLong(L"Time", gameTime); + tag->putLong(L"DayTime", dayTime); + tag->putLong(L"SizeOnDisk", sizeOnDisk); + tag->putLong(L"LastPlayed", System::currentTimeMillis()); + tag->putString(L"LevelName", levelName); + tag->putInt(L"version", version); + tag->putInt(L"rainTime", rainTime); + tag->putBoolean(L"raining", raining); + tag->putInt(L"thunderTime", thunderTime); + tag->putBoolean(L"thundering", thundering); tag->putBoolean(L"hardcore", hardcore); tag->putBoolean(L"allowCommands", allowCommands); tag->putBoolean(L"initialized", initialized); + // 4J: Game rules are now stored with app game host options + //tag->putCompound(L"GameRules", gameRules.createTag()); tag->putBoolean(L"newSeaLevel", newSeaLevel); tag->putBoolean(L"hasBeenInCreative", hasBeenInCreative); // store the stronghold position @@ -284,27 +364,33 @@ void LevelData::setTagData(CompoundTag *tag) tag->putInt(L"StrongholdEndPortalX", xStrongholdEndPortal); tag->putInt(L"StrongholdEndPortalZ", zStrongholdEndPortal); tag->putInt(L"XZSize", m_xzSize); +#ifdef _LARGE_WORLDS + tag->putInt(L"ClassicMoat", m_classicEdgeMoat); + tag->putInt(L"SmallMoat", m_smallEdgeMoat); + tag->putInt(L"MediumMoat", m_mediumEdgeMoat); +#endif + tag->putInt(L"HellScale", m_hellScale); } __int64 LevelData::getSeed() { - return seed; + return seed; } int LevelData::getXSpawn() { - return xSpawn; + return xSpawn; } int LevelData::getYSpawn() { - return ySpawn; + return ySpawn; } int LevelData::getZSpawn() { - return zSpawn; + return zSpawn; } int LevelData::getXStronghold() @@ -329,19 +415,24 @@ int LevelData::getZStrongholdEndPortal() return zStrongholdEndPortal; } -__int64 LevelData::getTime() +__int64 LevelData::getGameTime() { - return time; + return gameTime; +} + +__int64 LevelData::getDayTime() +{ + return dayTime; } __int64 LevelData::getSizeOnDisk() { - return sizeOnDisk; + return sizeOnDisk; } CompoundTag *LevelData::getLoadedPlayerTag() { - return NULL; // 4J - we don't store this anymore + return NULL; // 4J - we don't store this anymore } // 4J Removed TU9 as it's never accurate due to the dimension never being set @@ -352,22 +443,22 @@ CompoundTag *LevelData::getLoadedPlayerTag() void LevelData::setSeed(__int64 seed) { - this->seed = seed; + this->seed = seed; } void LevelData::setXSpawn(int xSpawn) { - this->xSpawn = xSpawn; + this->xSpawn = xSpawn; } void LevelData::setYSpawn(int ySpawn) { - this->ySpawn = ySpawn; + this->ySpawn = ySpawn; } void LevelData::setZSpawn(int zSpawn) { - this->zSpawn = zSpawn; + this->zSpawn = zSpawn; } void LevelData::setHasStronghold() @@ -411,20 +502,25 @@ void LevelData::setZStrongholdEndPortal(int zStrongholdEndPortal) this->zStrongholdEndPortal = zStrongholdEndPortal; } -void LevelData::setTime(__int64 time) +void LevelData::setGameTime(__int64 time) +{ + gameTime = time; +} + +void LevelData::setDayTime(__int64 time) { - this->time = time; + dayTime = time; } void LevelData::setSizeOnDisk(__int64 sizeOnDisk) { - this->sizeOnDisk = sizeOnDisk; + this->sizeOnDisk = sizeOnDisk; } void LevelData::setLoadedPlayerTag(CompoundTag *loadedPlayerTag) { // 4J - we don't store this anymore -// this->loadedPlayerTag = loadedPlayerTag; + // this->loadedPlayerTag = loadedPlayerTag; } // 4J Remove TU9 as it's never used @@ -435,74 +531,74 @@ void LevelData::setLoadedPlayerTag(CompoundTag *loadedPlayerTag) void LevelData::setSpawn(int xSpawn, int ySpawn, int zSpawn) { - this->xSpawn = xSpawn; - this->ySpawn = ySpawn; - this->zSpawn = zSpawn; + this->xSpawn = xSpawn; + this->ySpawn = ySpawn; + this->zSpawn = zSpawn; } wstring LevelData::getLevelName() { - return levelName; + return levelName; } void LevelData::setLevelName(const wstring& levelName) { - this->levelName = levelName; + this->levelName = levelName; } int LevelData::getVersion() { - return version; + return version; } void LevelData::setVersion(int version) { - this->version = version; + this->version = version; } __int64 LevelData::getLastPlayed() { - return lastPlayed; + return lastPlayed; } bool LevelData::isThundering() { - return thundering; + return thundering; } void LevelData::setThundering(bool thundering) { - this->thundering = thundering; + this->thundering = thundering; } int LevelData::getThunderTime() { - return thunderTime; + return thunderTime; } void LevelData::setThunderTime(int thunderTime) { - this->thunderTime = thunderTime; + this->thunderTime = thunderTime; } bool LevelData::isRaining() { - return raining; + return raining; } void LevelData::setRaining(bool raining) { - this->raining = raining; + this->raining = raining; } int LevelData::getRainTime() { - return rainTime; + return rainTime; } void LevelData::setRainTime(int rainTime) { - this->rainTime = rainTime; + this->rainTime = rainTime; } GameType *LevelData::getGameType() @@ -525,7 +621,9 @@ void LevelData::setGameType(GameType *gameType) this->gameType = gameType; // 4J Added - hasBeenInCreative = hasBeenInCreative || (gameType == GameType::CREATIVE) || app.GetGameHostOption(eGameHostOption_CheatsEnabled) > 0; + hasBeenInCreative = hasBeenInCreative || + (gameType == GameType::CREATIVE) || + (app.GetGameHostOption(eGameHostOption_CheatsEnabled) > 0); } bool LevelData::useNewSeaLevel() @@ -553,6 +651,16 @@ void LevelData::setGenerator(LevelType *generator) m_pGenerator = generator; } +wstring LevelData::getGeneratorOptions() +{ + return generatorOptions; +} + +void LevelData::setGeneratorOptions(const wstring &options) +{ + generatorOptions = options; +} + bool LevelData::isHardcore() { return hardcore; @@ -578,11 +686,47 @@ void LevelData::setInitialized(bool initialized) this->initialized = initialized; } +GameRules *LevelData::getGameRules() +{ + return &gameRules; +} + int LevelData::getXZSize() { return m_xzSize; } +#ifdef _LARGE_WORLDS +int LevelData::getXZSizeOld() +{ + return m_xzSizeOld; +} + +void LevelData::getMoatFlags(bool* bClassicEdgeMoat, bool* bSmallEdgeMoat, bool* bMediumEdgeMoat) +{ + *bClassicEdgeMoat = m_classicEdgeMoat; + *bSmallEdgeMoat = m_smallEdgeMoat; + *bMediumEdgeMoat = m_mediumEdgeMoat; + +} + +int LevelData::getXZHellSizeOld() +{ + int hellXZSizeOld = ceil((float)m_xzSizeOld / m_hellScaleOld); + + while(hellXZSizeOld > HELL_LEVEL_MAX_WIDTH && m_hellScaleOld < HELL_LEVEL_MAX_SCALE) + { + assert(0); // should never get in here? + ++m_hellScaleOld; + hellXZSizeOld = m_xzSize / m_hellScale; + } + + return hellXZSizeOld; +} + + +#endif + int LevelData::getHellScale() { return m_hellScale; diff --git a/Minecraft.World/LevelData.h b/Minecraft.World/LevelData.h index 0afe9be2..2ab243c3 100644 --- a/Minecraft.World/LevelData.h +++ b/Minecraft.World/LevelData.h @@ -1,6 +1,8 @@ #pragma once using namespace std; +#include "GameRules.h" + class Player; class CompoundTag; class LevelSettings; @@ -13,22 +15,24 @@ class LevelData private: __int64 seed; LevelType *m_pGenerator;// = LevelType.normal; - int xSpawn; - int ySpawn; - int zSpawn; - __int64 time; - __int64 lastPlayed; - __int64 sizeOnDisk; + wstring generatorOptions; + int xSpawn; + int ySpawn; + int zSpawn; + __int64 gameTime; + __int64 dayTime; + __int64 lastPlayed; + __int64 sizeOnDisk; // CompoundTag *loadedPlayerTag; // 4J removed - int dimension; - wstring levelName; - int version; + int dimension; + wstring levelName; + int version; - bool raining; - int rainTime; + bool raining; + int rainTime; - bool thundering; - int thunderTime; + bool thundering; + int thunderTime; GameType *gameType; bool generateMapFeatures; bool hardcore; @@ -38,6 +42,13 @@ private: bool hasBeenInCreative; // 4J added bool spawnBonusChest; // 4J added int m_xzSize; // 4J Added +#ifdef _LARGE_WORLDS + int m_xzSizeOld; // 4J MGH Added, for expanding worlds + int m_hellScaleOld; + bool m_classicEdgeMoat; + bool m_smallEdgeMoat; + bool m_mediumEdgeMoat; +#endif int m_hellScale; // 4J Added // 4J added @@ -50,15 +61,17 @@ private: int zStrongholdEndPortal; bool bStrongholdEndPortal; + GameRules gameRules; + protected: LevelData(); public: LevelData(CompoundTag *tag); - LevelData(LevelSettings *levelSettings, const wstring& levelName); - LevelData(LevelData *copy); - CompoundTag *createTag(); - CompoundTag *createTag(vector > *players); + LevelData(LevelSettings *levelSettings, const wstring& levelName); + LevelData(LevelData *copy); + CompoundTag *createTag(); + CompoundTag *createTag(vector > *players); enum { @@ -71,63 +84,74 @@ protected: virtual void setTagData(CompoundTag *tag); // 4J - removed CompoundTag *playerTag public: - virtual __int64 getSeed(); - virtual int getXSpawn(); - virtual int getYSpawn(); - virtual int getZSpawn(); - virtual int getXStronghold(); - virtual int getZStronghold(); - virtual int getXStrongholdEndPortal(); - virtual int getZStrongholdEndPortal(); - virtual __int64 getTime(); - virtual __int64 getSizeOnDisk(); - virtual CompoundTag *getLoadedPlayerTag(); - //int getDimension(); // 4J Removed TU 9 as it's never accurate - virtual void setSeed(__int64 seed); - virtual void setXSpawn(int xSpawn); - virtual void setYSpawn(int ySpawn); - virtual void setZSpawn(int zSpawn); - virtual void setHasStronghold(); - virtual bool getHasStronghold(); - virtual void setXStronghold(int xStronghold); - virtual void setZStronghold(int zStronghold); - virtual void setHasStrongholdEndPortal(); - virtual bool getHasStrongholdEndPortal(); - virtual void setXStrongholdEndPortal(int xStrongholdEndPortal); - virtual void setZStrongholdEndPortal(int zStrongholdEndPortal); + virtual __int64 getSeed(); + virtual int getXSpawn(); + virtual int getYSpawn(); + virtual int getZSpawn(); + virtual int getXStronghold(); + virtual int getZStronghold(); + virtual int getXStrongholdEndPortal(); + virtual int getZStrongholdEndPortal(); + virtual __int64 getGameTime(); + virtual __int64 getDayTime(); + virtual __int64 getSizeOnDisk(); + virtual CompoundTag *getLoadedPlayerTag(); + //int getDimension(); // 4J Removed TU 9 as it's never accurate + virtual void setSeed(__int64 seed); + virtual void setXSpawn(int xSpawn); + virtual void setYSpawn(int ySpawn); + virtual void setZSpawn(int zSpawn); + virtual void setHasStronghold(); + virtual bool getHasStronghold(); + virtual void setXStronghold(int xStronghold); + virtual void setZStronghold(int zStronghold); + virtual void setHasStrongholdEndPortal(); + virtual bool getHasStrongholdEndPortal(); + virtual void setXStrongholdEndPortal(int xStrongholdEndPortal); + virtual void setZStrongholdEndPortal(int zStrongholdEndPortal); + + virtual void setGameTime(__int64 time); + virtual void setDayTime(__int64 time); + virtual void setSizeOnDisk(__int64 sizeOnDisk); + virtual void setLoadedPlayerTag(CompoundTag *loadedPlayerTag); + //void setDimension(int dimension); // 4J Removed TU 9 as it's never used + virtual void setSpawn(int xSpawn, int ySpawn, int zSpawn); + virtual wstring getLevelName(); + virtual void setLevelName(const wstring& levelName); + virtual int getVersion(); + virtual void setVersion(int version); + virtual __int64 getLastPlayed(); + virtual bool isThundering(); + virtual void setThundering(bool thundering); + virtual int getThunderTime(); + virtual void setThunderTime(int thunderTime); + virtual bool isRaining(); + virtual void setRaining(bool raining); + virtual int getRainTime(); + virtual void setRainTime(int rainTime); + virtual GameType *getGameType(); + virtual bool isGenerateMapFeatures(); + virtual bool getSpawnBonusChest(); + virtual void setGameType(GameType *gameType); + virtual bool useNewSeaLevel(); + virtual bool getHasBeenInCreative(); // 4J Added + virtual void setHasBeenInCreative(bool value); // 4J Added + virtual LevelType *getGenerator(); + virtual void setGenerator(LevelType *generator); + virtual wstring getGeneratorOptions(); + virtual void setGeneratorOptions(const wstring &options); + virtual bool isHardcore(); + virtual bool getAllowCommands(); + virtual void setAllowCommands(bool allowCommands); + virtual bool isInitialized(); + virtual void setInitialized(bool initialized); + virtual GameRules *getGameRules(); + virtual int getXZSize(); // 4J Added +#ifdef _LARGE_WORLDS + virtual int getXZSizeOld(); // 4J Added + virtual void getMoatFlags(bool* bClassicEdgeMoat, bool* bSmallEdgeMoat, bool* bMediumEdgeMoat); //4J MGH - added + virtual int getXZHellSizeOld(); // 4J Added - virtual void setTime(__int64 time); - virtual void setSizeOnDisk(__int64 sizeOnDisk); - virtual void setLoadedPlayerTag(CompoundTag *loadedPlayerTag); - //void setDimension(int dimension); // 4J Removed TU 9 as it's never used - virtual void setSpawn(int xSpawn, int ySpawn, int zSpawn); - virtual wstring getLevelName(); - virtual void setLevelName(const wstring& levelName); - virtual int getVersion(); - virtual void setVersion(int version); - virtual __int64 getLastPlayed(); - virtual bool isThundering(); - virtual void setThundering(bool thundering); - virtual int getThunderTime(); - virtual void setThunderTime(int thunderTime); - virtual bool isRaining(); - virtual void setRaining(bool raining); - virtual int getRainTime(); - virtual void setRainTime(int rainTime); - virtual GameType *getGameType(); - virtual bool isGenerateMapFeatures(); - virtual bool getSpawnBonusChest(); - virtual void setGameType(GameType *gameType); - virtual bool useNewSeaLevel(); - virtual bool getHasBeenInCreative(); // 4J Added - virtual void setHasBeenInCreative(bool value); // 4J Added - virtual LevelType *getGenerator(); - virtual void setGenerator(LevelType *generator); - virtual bool isHardcore(); - virtual bool getAllowCommands(); - virtual void setAllowCommands(bool allowCommands); - virtual bool isInitialized(); - virtual void setInitialized(bool initialized); - virtual int getXZSize(); // 4J Added - virtual int getHellScale(); // 4J Addded +#endif + virtual int getHellScale(); // 4J Addded }; diff --git a/Minecraft.World/LevelEvent.h b/Minecraft.World/LevelEvent.h index c78c3569..8bd3fea5 100644 --- a/Minecraft.World/LevelEvent.h +++ b/Minecraft.World/LevelEvent.h @@ -4,20 +4,20 @@ class LevelEvent { public: - static const int SOUND_CLICK = 1000; - static const int SOUND_CLICK_FAIL = 1001; - static const int SOUND_LAUNCH = 1002; - static const int SOUND_OPEN_DOOR = 1003; - static const int SOUND_FIZZ = 1004; + static const int SOUND_CLICK = 1000; + static const int SOUND_CLICK_FAIL = 1001; + static const int SOUND_LAUNCH = 1002; + static const int SOUND_OPEN_DOOR = 1003; + static const int SOUND_FIZZ = 1004; static const int SOUND_PLAY_RECORDING = 1005; - static const int SOUND_GHAST_WARNING = 1007; - static const int SOUND_GHAST_FIREBALL = 1008; - static const int SOUND_BLAZE_FIREBALL = 1009; + static const int SOUND_GHAST_WARNING = 1007; + static const int SOUND_GHAST_FIREBALL = 1008; + static const int SOUND_BLAZE_FIREBALL = 1009; - static const int SOUND_ZOMBIE_WOODEN_DOOR = 1010; - static const int SOUND_ZOMBIE_IRON_DOOR = 1011; - static const int SOUND_ZOMBIE_DOOR_CRASH = 1012; + static const int SOUND_ZOMBIE_WOODEN_DOOR = 1010; + static const int SOUND_ZOMBIE_IRON_DOOR = 1011; + static const int SOUND_ZOMBIE_DOOR_CRASH = 1012; static const int SOUND_WITHER_BOSS_SPAWN = 1013; static const int SOUND_WITHER_BOSS_SHOOT = 1014; static const int SOUND_BAT_LIFTOFF = 1015; @@ -29,11 +29,12 @@ public: static const int SOUND_ANVIL_USED = 1021; static const int SOUND_ANVIL_LAND = 1022; - static const int PARTICLES_SHOOT = 2000; - static const int PARTICLES_DESTROY_BLOCK = 2001; - static const int PARTICLES_POTION_SPLASH = 2002; - static const int PARTICLES_EYE_OF_ENDER_DEATH = 2003; - static const int PARTICLES_MOBTILE_SPAWN = 2004; + static const int PARTICLES_SHOOT = 2000; + static const int PARTICLES_DESTROY_BLOCK = 2001; + static const int PARTICLES_POTION_SPLASH = 2002; + static const int PARTICLES_EYE_OF_ENDER_DEATH = 2003; + static const int PARTICLES_MOBTILE_SPAWN = 2004; + static const int PARTICLES_PLANT_GROWTH = 2005; //static const int ENDERDRAGON_KILLED = 9000; // 4J Added to signal the the enderdragon was killed static const int ENDERDRAGON_FIREBALL_SPLASH = 9001; diff --git a/Minecraft.World/LevelEventPacket.cpp b/Minecraft.World/LevelEventPacket.cpp index a044aded..34992156 100644 --- a/Minecraft.World/LevelEventPacket.cpp +++ b/Minecraft.World/LevelEventPacket.cpp @@ -15,13 +15,14 @@ LevelEventPacket::LevelEventPacket() z = 0; } -LevelEventPacket::LevelEventPacket(int type, int x, int y, int z, int data) +LevelEventPacket::LevelEventPacket(int type, int x, int y, int z, int data, bool globalEvent) { this->type = type; this->x = x; this->y = y; this->z = z; this->data = data; + this->globalEvent = globalEvent; } void LevelEventPacket::read(DataInputStream *dis) //throws IOException @@ -31,6 +32,7 @@ void LevelEventPacket::read(DataInputStream *dis) //throws IOException y = dis->readByte() & 0xff; z = dis->readInt(); data = dis->readInt(); + globalEvent = dis->readBoolean(); } void LevelEventPacket::write(DataOutputStream *dos) //throws IOException @@ -40,6 +42,7 @@ void LevelEventPacket::write(DataOutputStream *dos) //throws IOException dos->writeByte(y & 0xff); dos->writeInt(z); dos->writeInt(data); + dos->writeBoolean(globalEvent); } void LevelEventPacket::handle(PacketListener *listener) @@ -52,3 +55,7 @@ int LevelEventPacket::getEstimatedSize() return 4 * 5 + 1; } +bool LevelEventPacket::isGlobalEvent() +{ + return globalEvent; +} diff --git a/Minecraft.World/LevelEventPacket.h b/Minecraft.World/LevelEventPacket.h index 6c2fdbaf..1d8c36e2 100644 --- a/Minecraft.World/LevelEventPacket.h +++ b/Minecraft.World/LevelEventPacket.h @@ -9,14 +9,16 @@ public: int type; int data; int x, y, z; + bool globalEvent; LevelEventPacket(); - LevelEventPacket(int type, int x, int y, int z, int data); + LevelEventPacket(int type, int x, int y, int z, int data, bool globalEvent); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); + bool isGlobalEvent(); public: static shared_ptr create() { return shared_ptr(new LevelEventPacket()); } diff --git a/Minecraft.World/LevelListener.h b/Minecraft.World/LevelListener.h index ec9b11de..dcf30886 100644 --- a/Minecraft.World/LevelListener.h +++ b/Minecraft.World/LevelListener.h @@ -18,7 +18,7 @@ public: //virtual void playSound(const wstring& name, double x, double y, double z, float volume, float pitch) = 0; virtual void playSound(int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f) = 0; - virtual void playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f) = 0; + virtual void playSoundExceptPlayer(shared_ptr player, int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f) = 0; // 4J removed - virtual void addParticle(const wstring& name, double x, double y, double z, double xa, double ya, double za) = 0; @@ -33,7 +33,7 @@ public: virtual void skyColorChanged() = 0; virtual void playStreamingMusic(const wstring& name, int x, int y, int z) = 0; - + virtual void globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data) = 0; virtual void levelEvent(shared_ptr source, int type, int x, int y, int z, int data) = 0; virtual void destroyTileProgress(int id, int x, int y, int z, int progress) = 0; diff --git a/Minecraft.World/LevelParticlesPacket.cpp b/Minecraft.World/LevelParticlesPacket.cpp new file mode 100644 index 00000000..4d53cf4f --- /dev/null +++ b/Minecraft.World/LevelParticlesPacket.cpp @@ -0,0 +1,110 @@ +#include "stdafx.h" +#include "PacketListener.h" +#include "LevelParticlesPacket.h" + +LevelParticlesPacket::LevelParticlesPacket() +{ + this->name = L""; + this->x = 0.0f; + this->y = 0.0f; + this->z = 0.0f; + this->xDist = 0.0f; + this->yDist = 0.0f; + this->zDist = 0.0f; + this->maxSpeed = 0.0f; + this->count = 0; +} + +LevelParticlesPacket::LevelParticlesPacket(const wstring &name, float x, float y, float z, float xDist, float yDist, float zDist, float maxSpeed, int count) +{ + this->name = name; + this->x = x; + this->y = y; + this->z = z; + this->xDist = xDist; + this->yDist = yDist; + this->zDist = zDist; + this->maxSpeed = maxSpeed; + this->count = count; +} + +void LevelParticlesPacket::read(DataInputStream *dis) +{ + name = readUtf(dis, 64); + x = dis->readFloat(); + y = dis->readFloat(); + z = dis->readFloat(); + xDist = dis->readFloat(); + yDist = dis->readFloat(); + zDist = dis->readFloat(); + maxSpeed = dis->readFloat(); + count = dis->readInt(); +} + +void LevelParticlesPacket::write(DataOutputStream *dos) +{ + writeUtf(name, dos); + dos->writeFloat(x); + dos->writeFloat(y); + dos->writeFloat(z); + dos->writeFloat(xDist); + dos->writeFloat(yDist); + dos->writeFloat(zDist); + dos->writeFloat(maxSpeed); + dos->writeInt(count); +} + +wstring LevelParticlesPacket::getName() +{ + return name; +} + +double LevelParticlesPacket::getX() +{ + return x; +} + +double LevelParticlesPacket::getY() +{ + return y; +} + +double LevelParticlesPacket::getZ() +{ + return z; +} + +float LevelParticlesPacket::getXDist() +{ + return xDist; +} + +float LevelParticlesPacket::getYDist() +{ + return yDist; +} + +float LevelParticlesPacket::getZDist() +{ + return zDist; +} + +float LevelParticlesPacket::getMaxSpeed() +{ + return maxSpeed; +} + +int LevelParticlesPacket::getCount() +{ + return count; +} + +void LevelParticlesPacket::handle(PacketListener *listener) +{ + listener->handleParticleEvent(shared_from_this()); +} + +int LevelParticlesPacket::getEstimatedSize() +{ + return 4 * 2 + 7 * 8; +} \ No newline at end of file diff --git a/Minecraft.World/LevelParticlesPacket.h b/Minecraft.World/LevelParticlesPacket.h new file mode 100644 index 00000000..7676f771 --- /dev/null +++ b/Minecraft.World/LevelParticlesPacket.h @@ -0,0 +1,39 @@ +#pragma once + +#include "Packet.h" + +class LevelParticlesPacket : public Packet, public enable_shared_from_this +{ +private: + wstring name; + float x; + float y; + float z; + float xDist; + float yDist; + float zDist; + float maxSpeed; + int count; + +public: + LevelParticlesPacket(); + LevelParticlesPacket(const wstring &name, float x, float y, float z, float xDist, float yDist, float zDist, float maxSpeed, int count); + + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + wstring getName(); + double getX(); + double getY(); + double getZ(); + float getXDist(); + float getYDist(); + float getZDist(); + float getMaxSpeed(); + int getCount(); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new LevelParticlesPacket()); } + virtual int getId() { return 63; } +}; \ No newline at end of file diff --git a/Minecraft.World/LevelSettings.cpp b/Minecraft.World/LevelSettings.cpp index 59faa1ca..dca8ce61 100644 --- a/Minecraft.World/LevelSettings.cpp +++ b/Minecraft.World/LevelSettings.cpp @@ -47,10 +47,10 @@ void GameType::updatePlayerAbilities(Abilities *abilities) abilities->invulnerable = false; abilities->flying = false; } - abilities->mayBuild = !isReadOnly(); + abilities->mayBuild = !isAdventureRestricted(); } -bool GameType::isReadOnly() +bool GameType::isAdventureRestricted() { return this == ADVENTURE; } @@ -95,6 +95,7 @@ void LevelSettings::_init(__int64 seed, GameType *gameType, bool generateMapFeat this->levelType = levelType; this->allowCommands = false; this->startingBonusItems = false; + levelTypeOptions = L""; m_xzSize = xzSize; m_hellScale = hellScale; } @@ -128,6 +129,12 @@ LevelSettings *LevelSettings::enableSinglePlayerCommands() return this; } +LevelSettings *LevelSettings::setLevelTypeOptions(const wstring &options) +{ + levelTypeOptions = options; + return this; +} + bool LevelSettings::hasStartingBonusItems() { return startingBonusItems; @@ -183,3 +190,8 @@ int LevelSettings::getHellScale() { return m_hellScale; } + +wstring LevelSettings::getLevelTypeOptions() +{ + return levelTypeOptions; +} \ No newline at end of file diff --git a/Minecraft.World/LevelSettings.h b/Minecraft.World/LevelSettings.h index c183df8c..906a6f70 100644 --- a/Minecraft.World/LevelSettings.h +++ b/Minecraft.World/LevelSettings.h @@ -4,6 +4,8 @@ class LevelType; class Abilities; class LevelData; +#define _ADVENTURE_MODE_ENABLED + // 4J Stu - Was Java enum class class GameType { @@ -25,7 +27,7 @@ public: int getId(); wstring getName(); void updatePlayerAbilities(Abilities *abilities); - bool isReadOnly(); + bool isAdventureRestricted(); bool isCreative(); bool isSurvival(); static GameType *byId(int id); @@ -43,6 +45,7 @@ private: LevelType *levelType; bool allowCommands; bool startingBonusItems; // 4J - brought forward from 1.3.2 + wstring levelTypeOptions; int m_xzSize; // 4J Added int m_hellScale; @@ -53,6 +56,7 @@ public: LevelSettings(LevelData *levelData); LevelSettings *enableStartingBonusItems(); // 4J - brought forward from 1.3.2 LevelSettings *enableSinglePlayerCommands(); + LevelSettings *setLevelTypeOptions(const wstring &options); bool hasStartingBonusItems(); // 4J - brought forward from 1.3.2 __int64 getSeed(); GameType *getGameType(); @@ -64,4 +68,5 @@ public: int getXZSize(); // 4J Added int getHellScale(); // 4J Added static GameType *validateGameType(int gameType); + wstring getLevelTypeOptions(); }; diff --git a/Minecraft.World/LevelSource.h b/Minecraft.World/LevelSource.h index 7ff99146..fbe64a99 100644 --- a/Minecraft.World/LevelSource.h +++ b/Minecraft.World/LevelSource.h @@ -25,5 +25,6 @@ public: virtual int getMaxBuildHeight() = 0; virtual bool isAllEmpty() = 0; virtual bool isTopSolidBlocking(int x, int y, int z) = 0; + virtual int getDirectSignal(int x, int y, int z, int dir) = 0; virtual ~LevelSource() {} }; \ No newline at end of file diff --git a/Minecraft.World/LevelType.cpp b/Minecraft.World/LevelType.cpp index 2fe1df95..30b08132 100644 --- a/Minecraft.World/LevelType.cpp +++ b/Minecraft.World/LevelType.cpp @@ -46,6 +46,7 @@ LevelType::LevelType(int id, wstring generatorName, int version) void LevelType::init(int id, wstring generatorName, int version) { + this->id = id; m_generatorName = generatorName; m_version = version; m_selectable = true; @@ -115,4 +116,7 @@ LevelType *LevelType::getLevelType(wstring name) return NULL; } - +int LevelType::getId() +{ + return id; +} \ No newline at end of file diff --git a/Minecraft.World/LevelType.h b/Minecraft.World/LevelType.h index a269c583..0aa015b5 100644 --- a/Minecraft.World/LevelType.h +++ b/Minecraft.World/LevelType.h @@ -14,6 +14,7 @@ public: static void staticCtor(); private: + int id; wstring m_generatorName; int m_version; bool m_selectable; @@ -36,4 +37,5 @@ private: public: bool hasReplacement(); static LevelType *getLevelType(wstring name); + int getId(); }; diff --git a/Minecraft.World/LeverTile.cpp b/Minecraft.World/LeverTile.cpp index a8231251..eea9e3d3 100644 --- a/Minecraft.World/LeverTile.cpp +++ b/Minecraft.World/LeverTile.cpp @@ -1,8 +1,8 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.h" #include "LeverTile.h" -#include "SoundTypes.h" LeverTile::LeverTile(int id) : Tile(id, Material::decoration,isSolidRender()) { @@ -35,38 +35,38 @@ int LeverTile::getRenderShape() bool LeverTile::mayPlace(Level *level, int x, int y, int z, int face) { - if (face == 0 && level->isSolidBlockingTile(x, y + 1, z)) return true; - if (face == 1 && level->isTopSolidBlocking(x, y - 1, z)) return true; - if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) return true; - if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) return true; - if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) return true; - if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) return true; - return false; + if (face == Facing::DOWN && level->isSolidBlockingTile(x, y + 1, z)) return true; + if (face == Facing::UP && level->isTopSolidBlocking(x, y - 1, z)) return true; + if (face == Facing::NORTH && level->isSolidBlockingTile(x, y, z + 1)) return true; + if (face == Facing::SOUTH && level->isSolidBlockingTile(x, y, z - 1)) return true; + if (face == Facing::WEST && level->isSolidBlockingTile(x + 1, y, z)) return true; + if (face == Facing::EAST && level->isSolidBlockingTile(x - 1, y, z)) return true; + return false; } bool LeverTile::mayPlace(Level *level, int x, int y, int z) { - if (level->isSolidBlockingTile(x - 1, y, z)) + if (level->isSolidBlockingTile(x - 1, y, z)) { - return true; - } else if (level->isSolidBlockingTile(x + 1, y, z)) + return true; + } else if (level->isSolidBlockingTile(x + 1, y, z)) { - return true; - } else if (level->isSolidBlockingTile(x, y, z - 1)) + return true; + } else if (level->isSolidBlockingTile(x, y, z - 1)) { - return true; - } else if (level->isSolidBlockingTile(x, y, z + 1)) + return true; + } else if (level->isSolidBlockingTile(x, y, z + 1)) { - return true; - } else if (level->isTopSolidBlocking(x, y - 1, z)) + return true; + } else if (level->isTopSolidBlocking(x, y - 1, z)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x, y + 1, z)) { return true; } - return false; + return false; } int LeverTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) @@ -88,6 +88,36 @@ int LeverTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int f return dir + oldFlip; } +void LeverTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + int data = level->getData(x, y, z); + int dir = data & 7; + int flip = data & 8; + + if (dir == getLeverFacing(Facing::UP)) + { + if ((Mth::floor(by->yRot * 4 / (360) + 0.5) & 1) == 0) + { + level->setData(x, y, z, 5 | flip, Tile::UPDATE_CLIENTS); + } + else + { + level->setData(x, y, z, 6 | flip, Tile::UPDATE_CLIENTS); + } + } + else if (dir == getLeverFacing(Facing::DOWN)) + { + if ((Mth::floor(by->yRot * 4 / (360) + 0.5) & 1) == 0) + { + level->setData(x, y, z, 7 | flip, Tile::UPDATE_CLIENTS); + } + else + { + level->setData(x, y, z, 0 | flip, Tile::UPDATE_CLIENTS); + } + } +} + int LeverTile::getLeverFacing(int facing) { switch (facing) @@ -110,65 +140,65 @@ int LeverTile::getLeverFacing(int facing) void LeverTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (checkCanSurvive(level, x, y, z)) + if (checkCanSurvive(level, x, y, z)) { - int dir = level->getData(x, y, z) & 7; - bool replace = false; + int dir = level->getData(x, y, z) & 7; + bool replace = false; - if (!level->isSolidBlockingTile(x - 1, y, z) && dir == 1) replace = true; - if (!level->isSolidBlockingTile(x + 1, y, z) && dir == 2) replace = true; - if (!level->isSolidBlockingTile(x, y, z - 1) && dir == 3) replace = true; + if (!level->isSolidBlockingTile(x - 1, y, z) && dir == 1) replace = true; + if (!level->isSolidBlockingTile(x + 1, y, z) && dir == 2) replace = true; + if (!level->isSolidBlockingTile(x, y, z - 1) && dir == 3) replace = true; if (!level->isSolidBlockingTile(x, y, z + 1) && dir == 4) replace = true; if (!level->isTopSolidBlocking(x, y - 1, z) && dir == 5) replace = true; if (!level->isTopSolidBlocking(x, y - 1, z) && dir == 6) replace = true; if (!level->isSolidBlockingTile(x, y + 1, z) && dir == 0) replace = true; if (!level->isSolidBlockingTile(x, y + 1, z) && dir == 7) replace = true; - if (replace) + if (replace) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - } - } + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + } + } } bool LeverTile::checkCanSurvive(Level *level, int x, int y, int z) { - if (!mayPlace(level, x, y, z)) + if (!mayPlace(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - return false; - } - return true; + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + return false; + } + return true; } void LeverTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - int dir = level->getData(x, y, z) & 7; - float r = 3 / 16.0f; - if (dir == 1) + int dir = level->getData(x, y, z) & 7; + float r = 3 / 16.0f; + if (dir == 1) { - setShape(0, 0.2f, 0.5f - r, r * 2, 0.8f, 0.5f + r); - } + setShape(0, 0.2f, 0.5f - r, r * 2, 0.8f, 0.5f + r); + } else if (dir == 2) { - setShape(1 - r * 2, 0.2f, 0.5f - r, 1, 0.8f, 0.5f + r); - } + setShape(1 - r * 2, 0.2f, 0.5f - r, 1, 0.8f, 0.5f + r); + } else if (dir == 3) { - setShape(0.5f - r, 0.2f, 0, 0.5f + r, 0.8f, r * 2); - } + setShape(0.5f - r, 0.2f, 0, 0.5f + r, 0.8f, r * 2); + } else if (dir == 4) { - setShape(0.5f - r, 0.2f, 1 - r * 2, 0.5f + r, 0.8f, 1); - } + setShape(0.5f - r, 0.2f, 1 - r * 2, 0.5f + r, 0.8f, 1); + } else if (dir == 5 || dir == 6) { - r = 4 / 16.0f; - setShape(0.5f - r, 0.0f, 0.5f - r, 0.5f + r, 0.6f, 0.5f + r); - } + r = 4 / 16.0f; + setShape(0.5f - r, 0.0f, 0.5f - r, 0.5f + r, 0.6f, 0.5f + r); + } else if (dir == 0 || dir == 7) { r = 4 / 16.0f; @@ -176,11 +206,6 @@ void LeverTile::updateShape(LevelSource *level, int x, int y, int z, int forceDa } } -void LeverTile::attack(Level *level, int x, int y, int z, shared_ptr player) -{ - use(level, x, y, z, player, 0, 0, 0, 0); -} - // 4J-PB - Adding a TestUse for tooltip display bool LeverTile::TestUse() { @@ -198,7 +223,7 @@ bool LeverTile::use(Level *level, int x, int y, int z, shared_ptr player level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, open > 0 ? 0.6f : 0.5f); return false; } - if (level->isClientSide) + if (level->isClientSide) { // 4J - added stuff to play sound in this case too int data = level->getData(x, y, z); @@ -208,99 +233,99 @@ bool LeverTile::use(Level *level, int x, int y, int z, shared_ptr player return true; } - int data = level->getData(x, y, z); - int dir = data & 7; - int open = 8 - (data & 8); + int data = level->getData(x, y, z); + int dir = data & 7; + int open = 8 - (data & 8); - level->setData(x, y, z, dir + open); - level->setTilesDirty(x, y, z, x, y, z); + level->setData(x, y, z, dir + open, Tile::UPDATE_ALL); + level->setTilesDirty(x, y, z, x, y, z); - level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, open > 0 ? 0.6f : 0.5f); + level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, open > 0 ? 0.6f : 0.5f); - level->updateNeighborsAt(x, y, z, id); - if (dir == 1) + level->updateNeighborsAt(x, y, z, id); + if (dir == 1) { - level->updateNeighborsAt(x - 1, y, z, id); - } + level->updateNeighborsAt(x - 1, y, z, id); + } else if (dir == 2) { - level->updateNeighborsAt(x + 1, y, z, id); - } + level->updateNeighborsAt(x + 1, y, z, id); + } else if (dir == 3) { - level->updateNeighborsAt(x, y, z - 1, id); - } + level->updateNeighborsAt(x, y, z - 1, id); + } else if (dir == 4) { - level->updateNeighborsAt(x, y, z + 1, id); - } + level->updateNeighborsAt(x, y, z + 1, id); + } else if (dir == 5 || dir == 6) { - level->updateNeighborsAt(x, y - 1, z, id); - } + level->updateNeighborsAt(x, y - 1, z, id); + } else if (dir == 0 || dir == 7) { level->updateNeighborsAt(x, y + 1, z, id); } - return true; + return true; } void LeverTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - if ((data & 8) > 0) + if ((data & 8) > 0) { - level->updateNeighborsAt(x, y, z, this->id); - int dir = data & 7; - if (dir == 1) + level->updateNeighborsAt(x, y, z, this->id); + int dir = data & 7; + if (dir == 1) { - level->updateNeighborsAt(x - 1, y, z, this->id); - } + level->updateNeighborsAt(x - 1, y, z, this->id); + } else if (dir == 2) { - level->updateNeighborsAt(x + 1, y, z, this->id); - } + level->updateNeighborsAt(x + 1, y, z, this->id); + } else if (dir == 3) { - level->updateNeighborsAt(x, y, z - 1, this->id); - } + level->updateNeighborsAt(x, y, z - 1, this->id); + } else if (dir == 4) { - level->updateNeighborsAt(x, y, z + 1, this->id); - } + level->updateNeighborsAt(x, y, z + 1, this->id); + } else if (dir == 5 || dir == 6) { - level->updateNeighborsAt(x, y - 1, z, this->id); + level->updateNeighborsAt(x, y - 1, z, this->id); } else if (dir == 0 || dir == 7) { level->updateNeighborsAt(x, y + 1, z, this->id); } - } - Tile::onRemove(level, x, y, z, id, data); + } + Tile::onRemove(level, x, y, z, id, data); } -bool LeverTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +int LeverTile::getSignal(LevelSource *level, int x, int y, int z, int dir) { - return (level->getData(x, y, z) & 8) > 0; + return (level->getData(x, y, z) & 8) > 0 ? Redstone::SIGNAL_MAX : Redstone::SIGNAL_NONE; } -bool LeverTile::getDirectSignal(Level *level, int x, int y, int z, int dir) +int LeverTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) { - int data = level->getData(x, y, z); - if ((data & 8) == 0) return false; - int myDir = data & 7; - - if (myDir == 0 && dir == 0) return true; - if (myDir == 7 && dir == 0) return true; - if (myDir == 6 && dir == 1) return true; - if (myDir == 5 && dir == 1) return true; - if (myDir == 4 && dir == 2) return true; - if (myDir == 3 && dir == 3) return true; - if (myDir == 2 && dir == 4) return true; - if (myDir == 1 && dir == 5) return true; - - return false; + int data = level->getData(x, y, z); + if ((data & 8) == 0) return Redstone::SIGNAL_NONE; + int myDir = data & 7; + + if (myDir == 0 && dir == 0) return Redstone::SIGNAL_MAX; + if (myDir == 7 && dir == 0) return Redstone::SIGNAL_MAX; + if (myDir == 6 && dir == 1) return Redstone::SIGNAL_MAX; + if (myDir == 5 && dir == 1) return Redstone::SIGNAL_MAX; + if (myDir == 4 && dir == 2) return Redstone::SIGNAL_MAX; + if (myDir == 3 && dir == 3) return Redstone::SIGNAL_MAX; + if (myDir == 2 && dir == 4) return Redstone::SIGNAL_MAX; + if (myDir == 1 && dir == 5) return Redstone::SIGNAL_MAX; + + return Redstone::SIGNAL_NONE; } bool LeverTile::isSignalSource() diff --git a/Minecraft.World/LeverTile.h b/Minecraft.World/LeverTile.h index 4d00db78..da719868 100644 --- a/Minecraft.World/LeverTile.h +++ b/Minecraft.World/LeverTile.h @@ -7,25 +7,25 @@ class LeverTile : public Tile protected: LeverTile(int id); public: - virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual bool blocksLight(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual int getRenderShape(); - virtual bool mayPlace(Level *level, int x, int y, int z, int face); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual bool blocksLight(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual int getRenderShape(); + virtual bool mayPlace(Level *level, int x, int y, int z, int face); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); static int getLeverFacing(int facing); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); private: virtual bool checkCanSurvive(Level *level, int x, int y, int z); public: virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - virtual void attack(Level *level, int x, int y, int z, shared_ptr player); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); - virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); - virtual bool isSignalSource(); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); + virtual bool isSignalSource(); }; diff --git a/Minecraft.World/LightGemFeature.cpp b/Minecraft.World/LightGemFeature.cpp index f42d78ff..6ad1193a 100644 --- a/Minecraft.World/LightGemFeature.cpp +++ b/Minecraft.World/LightGemFeature.cpp @@ -5,33 +5,33 @@ bool LightGemFeature::place(Level *level, Random *random, int x, int y, int z) { - if (!level->isEmptyTile(x, y, z)) return false; - if (level->getTile(x, y + 1, z) != Tile::hellRock_Id) return false; - level->setTile(x, y, z, Tile::lightGem_Id); + if (!level->isEmptyTile(x, y, z)) return false; + if (level->getTile(x, y + 1, z) != Tile::netherRack_Id) return false; + level->setTileAndData(x, y, z, Tile::glowstone_Id, 0, Tile::UPDATE_CLIENTS); - for (int i = 0; i < 1500; i++) + for (int i = 0; i < 1500; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y - random->nextInt(12); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (level->getTile(x2, y2, z2) != 0) continue; + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y - random->nextInt(12); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (level->getTile(x2, y2, z2) != 0) continue; - int count = 0; - for (int t = 0; t < 6; t++) + int count = 0; + for (int t = 0; t < 6; t++) { - int tile = 0; - if (t == 0) tile = level->getTile(x2 - 1, y2, z2); - if (t == 1) tile = level->getTile(x2 + 1, y2, z2); - if (t == 2) tile = level->getTile(x2, y2 - 1, z2); - if (t == 3) tile = level->getTile(x2, y2 + 1, z2); - if (t == 4) tile = level->getTile(x2, y2, z2 - 1); - if (t == 5) tile = level->getTile(x2, y2, z2 + 1); + int tile = 0; + if (t == 0) tile = level->getTile(x2 - 1, y2, z2); + if (t == 1) tile = level->getTile(x2 + 1, y2, z2); + if (t == 2) tile = level->getTile(x2, y2 - 1, z2); + if (t == 3) tile = level->getTile(x2, y2 + 1, z2); + if (t == 4) tile = level->getTile(x2, y2, z2 - 1); + if (t == 5) tile = level->getTile(x2, y2, z2 + 1); - if (tile == Tile::lightGem_Id) count++; - } + if (tile == Tile::glowstone_Id) count++; + } - if (count == 1) level->setTile(x2, y2, z2, Tile::lightGem_Id); - } + if (count == 1) level->setTileAndData(x2, y2, z2, Tile::glowstone_Id, 0, Tile::UPDATE_CLIENTS); + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/LightningBolt.cpp b/Minecraft.World/LightningBolt.cpp index 901bedf1..7f32c8ec 100644 --- a/Minecraft.World/LightningBolt.cpp +++ b/Minecraft.World/LightningBolt.cpp @@ -27,31 +27,28 @@ LightningBolt::LightningBolt(Level *level, double x, double y, double z) : flashes = 1; // 4J - added clientside check - if( !level->isClientSide ) + if( !level->isClientSide && level->getGameRules()->getBoolean(GameRules::RULE_DOFIRETICK)&&level->difficulty >= 2 && level->hasChunksAt( Mth::floor(x), Mth::floor(y), Mth::floor(z), 10)) { - if (level->difficulty >= 2 && level->hasChunksAt( Mth::floor(x), Mth::floor(y), Mth::floor(z), 10)) { + int xt = Mth::floor(x); + int yt = Mth::floor(y); + int zt = Mth::floor(z); + // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation + if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) ) { - int xt = Mth::floor(x); - int yt = Mth::floor(y); - int zt = Mth::floor(z); - // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation - if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) ) - { - if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTile(xt, yt, zt, Tile::fire_Id); - } + if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTileAndUpdate(xt, yt, zt, Tile::fire_Id); } + } - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) + { + int xt = Mth::floor(x) + random->nextInt(3) - 1; + int yt = Mth::floor(y) + random->nextInt(3) - 1; + int zt = Mth::floor(z) + random->nextInt(3) - 1; + // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation + if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) ) { - int xt = Mth::floor(x) + random->nextInt(3) - 1; - int yt = Mth::floor(y) + random->nextInt(3) - 1; - int zt = Mth::floor(z) + random->nextInt(3) - 1; - // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation - if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) ) - { - if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTile(xt, yt, zt, Tile::fire_Id); - } + if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTileAndUpdate(xt, yt, zt, Tile::fire_Id); } } } @@ -79,21 +76,18 @@ void LightningBolt::tick() { flashes--; life = 1; - // 4J - added clientside check - if( !level->isClientSide ) + + seed = random->nextLong(); + if (!level->isClientSide && level->getGameRules()->getBoolean(GameRules::RULE_DOFIRETICK) && level->hasChunksAt( (int) floor(x), (int) floor(y), (int) floor(z), 10)) { - seed = random->nextLong(); - if (level->hasChunksAt( (int) floor(x), (int) floor(y), (int) floor(z), 10)) + int xt = (int) floor(x); + int yt = (int) floor(y); + int zt = (int) floor(z); + + // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation + if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) ) { - int xt = (int) floor(x); - int yt = (int) floor(y); - int zt = (int) floor(z); - - // 4J added - don't go setting tiles if we aren't tracking them for network synchronisation - if( MinecraftServer::getInstance()->getPlayers()->isTrackingTile(xt, yt, zt, level->dimension->id) ) - { - if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTile(xt, yt, zt, Tile::fire_Id); - } + if (level->getTile(xt, yt, zt) == 0 && Tile::fire->mayPlace(level, xt, yt, zt)) level->setTileAndUpdate(xt, yt, zt, Tile::fire_Id); } } } @@ -101,10 +95,13 @@ void LightningBolt::tick() if (life >= 0) { - double r = 3; - // 4J - added clientside check - if( !level->isClientSide ) + if (level->isClientSide) + { + level->skyFlashTime = 2; + } + else { + double r = 3; vector > *entities = level->getEntities(shared_from_this(), AABB::newTemp(x - r, y - r, z - r, x + r, y + 6 + r, z + r)); AUTO_VAR(itEnd, entities->end()); for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) @@ -113,8 +110,6 @@ void LightningBolt::tick() e->thunderHit(this); } } - - level->lightningBoltTime = 2; } } diff --git a/Minecraft.World/LiquidTile.cpp b/Minecraft.World/LiquidTile.cpp index 466589a4..c31b6466 100644 --- a/Minecraft.World/LiquidTile.cpp +++ b/Minecraft.World/LiquidTile.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "JavaMath.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.h" #include "LiquidTile.h" @@ -14,11 +15,11 @@ const wstring LiquidTile::TEXTURE_LAVA_FLOW = L"lava_flow"; LiquidTile::LiquidTile(int id, Material *material) : Tile(id, material,isSolidRender()) { - float yo = 0; - float e = 0; + float yo = 0; + float e = 0; - setShape(0 + e, 0 + yo, 0 + e, 1 + e, 1 + yo, 1 + e); - setTicking(true); + setShape(0 + e, 0 + yo, 0 + e, 1 + e, 1 + yo, 1 + e); + setTicking(true); } bool LiquidTile::isPathfindable(LevelSource *level, int x, int y, int z) @@ -64,34 +65,34 @@ int LiquidTile::getColor(LevelSource *level, int x, int y, int z, int d) float LiquidTile::getHeight(int d) { - if (d >= 8) d = 0; - return (d + 1) / 9.0f; + if (d >= 8) d = 0; + return (d + 1) / 9.0f; } Icon *LiquidTile::getTexture(int face, int data) { if (face == Facing::DOWN || face == Facing::UP) { - return icons[0]; + return icons[0]; } else { - return icons[1]; - } + return icons[1]; + } } int LiquidTile::getDepth(Level *level, int x, int y, int z) { - if (level->getMaterial(x, y, z) == material) return level->getData(x, y, z); + if (level->getMaterial(x, y, z) == material) return level->getData(x, y, z); else return -1; } int LiquidTile::getRenderedDepth(LevelSource *level, int x, int y, int z) { - if (level->getMaterial(x, y, z) != material) return -1; - int d = level->getData(x, y, z); - if (d >= 8) d = 0; - return d; + if (level->getMaterial(x, y, z) != material) return -1; + int d = level->getData(x, y, z); + if (d >= 8) d = 0; + return d; } bool LiquidTile::isCubeShaped() @@ -111,21 +112,21 @@ bool LiquidTile::mayPick(int data, bool liquid) bool LiquidTile::isSolidFace(LevelSource *level, int x, int y, int z, int face) { - Material *m = level->getMaterial(x, y, z); - if (m == this->material) return false; + Material *m = level->getMaterial(x, y, z); + if (m == material) return false; if (face == Facing::UP) return true; - if (m == Material::ice) return false; - - return Tile::isSolidFace(level, x, y, z, face); + if (m == Material::ice) return false; + + return Tile::isSolidFace(level, x, y, z, face); } bool LiquidTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { - Material *m = level->getMaterial(x, y, z); - if (m == this->material) return false; + Material *m = level->getMaterial(x, y, z); + if (m == material) return false; if (face == Facing::UP) return true; - if (m == Material::ice) return false; - return Tile::shouldRenderFace(level, x, y, z, face); + if (m == Material::ice) return false; + return Tile::shouldRenderFace(level, x, y, z, face); } AABB *LiquidTile::getAABB(Level *level, int x, int y, int z) @@ -150,94 +151,104 @@ int LiquidTile::getResourceCount(Random *random) Vec3 *LiquidTile::getFlow(LevelSource *level, int x, int y, int z) { - Vec3 *flow = Vec3::newTemp(0,0,0); - int mid = getRenderedDepth(level, x, y, z); - for (int d = 0; d < 4; d++) + Vec3 *flow = Vec3::newTemp(0,0,0); + int mid = getRenderedDepth(level, x, y, z); + for (int d = 0; d < 4; d++) { - int xt = x; - int yt = y; - int zt = z; + int xt = x; + int yt = y; + int zt = z; - if (d == 0) xt--; - if (d == 1) zt--; - if (d == 2) xt++; - if (d == 3) zt++; + if (d == 0) xt--; + if (d == 1) zt--; + if (d == 2) xt++; + if (d == 3) zt++; - int t = getRenderedDepth(level, xt, yt, zt); - if (t < 0) + int t = getRenderedDepth(level, xt, yt, zt); + if (t < 0) { - if (!level->getMaterial(xt, yt, zt)->blocksMotion()) + if (!level->getMaterial(xt, yt, zt)->blocksMotion()) { - t = getRenderedDepth(level, xt, yt - 1, zt); - if (t >= 0) + t = getRenderedDepth(level, xt, yt - 1, zt); + if (t >= 0) { - int dir = t - (mid - 8); - flow = flow->add((xt - x) * dir, (yt - y) * dir, (zt - z) * dir); - } - } - } else + int dir = t - (mid - 8); + flow = flow->add((xt - x) * dir, (yt - y) * dir, (zt - z) * dir); + } + } + } else { - if (t >= 0) + if (t >= 0) { - int dir = t - mid; - flow = flow->add((xt - x) * dir, (yt - y) * dir, (zt - z) * dir); - } - } + int dir = t - mid; + flow = flow->add((xt - x) * dir, (yt - y) * dir, (zt - z) * dir); + } + } - } - if (level->getData(x, y, z) >= 8) + } + if (level->getData(x, y, z) >= 8) { - bool ok = false; - if (ok || isSolidFace(level, x, y, z - 1, 2)) ok = true; - if (ok || isSolidFace(level, x, y, z + 1, 3)) ok = true; - if (ok || isSolidFace(level, x - 1, y, z, 4)) ok = true; - if (ok || isSolidFace(level, x + 1, y, z, 5)) ok = true; - if (ok || isSolidFace(level, x, y + 1, z - 1, 2)) ok = true; - if (ok || isSolidFace(level, x, y + 1, z + 1, 3)) ok = true; - if (ok || isSolidFace(level, x - 1, y + 1, z, 4)) ok = true; - if (ok || isSolidFace(level, x + 1, y + 1, z, 5)) ok = true; - if (ok) flow = flow->normalize()->add(0, -6, 0); - } - flow = flow->normalize(); - return flow; + bool ok = false; + if (ok || isSolidFace(level, x, y, z - 1, 2)) ok = true; + if (ok || isSolidFace(level, x, y, z + 1, 3)) ok = true; + if (ok || isSolidFace(level, x - 1, y, z, 4)) ok = true; + if (ok || isSolidFace(level, x + 1, y, z, 5)) ok = true; + if (ok || isSolidFace(level, x, y + 1, z - 1, 2)) ok = true; + if (ok || isSolidFace(level, x, y + 1, z + 1, 3)) ok = true; + if (ok || isSolidFace(level, x - 1, y + 1, z, 4)) ok = true; + if (ok || isSolidFace(level, x + 1, y + 1, z, 5)) ok = true; + if (ok) flow = flow->normalize()->add(0, -6, 0); + } + flow = flow->normalize(); + return flow; } void LiquidTile::handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current) { - Vec3 *flow = getFlow(level, x, y, z); - current->x += flow->x; - current->y += flow->y; - current->z += flow->z; + Vec3 *flow = getFlow(level, x, y, z); + current->x += flow->x; + current->y += flow->y; + current->z += flow->z; } -int LiquidTile::getTickDelay() +int LiquidTile::getTickDelay(Level *level) { - if (material == Material::water) return 5; - if (material == Material::lava) return 30; - return 0; + if (material == Material::water) return 5; + if (material == Material::lava) + { + if (level->dimension->hasCeiling) + { + return 10; + } + else + { + return 30; + } + } + return 0; } // 4J - change brought forward from 1.8.2 int LiquidTile::getLightColor(LevelSource *level, int x, int y, int z, int tileId/*=-1*/) { // 4J - note that this code seems to basically be a hack to fix a problem where post-processed things like lakes aren't getting lit properly - int a = level->getLightColor(x, y, z, 0, tileId); - int b = level->getLightColor(x, y + 1, z, 0, tileId); + int a = level->getLightColor(x, y, z, 0, tileId); + int b = level->getLightColor(x, y + 1, z, 0, tileId); - int aa = a & 0xff; - int ba = b & 0xff; - int ab = (a >> 16) & 0xff; - int bb = (b >> 16) & 0xff; + int aa = a & 0xff; + int ba = b & 0xff; + int ab = (a >> 16) & 0xff; + int bb = (b >> 16) & 0xff; - return (aa > ba ? aa : ba) | ((ab > bb ? ab : bb) << 16); + return (aa > ba ? aa : ba) | ((ab > bb ? ab : bb) << 16); } float LiquidTile::getBrightness(LevelSource *level, int x, int y, int z) { - float a = level->getBrightness(x, y, z); - float b = level->getBrightness(x, y + 1, z); - return a > b ? a : b; + float a = level->getBrightness(x, y, z); + float b = level->getBrightness(x, y + 1, z); + return a > b ? a : b; } int LiquidTile::getRenderLayer() @@ -247,102 +258,102 @@ int LiquidTile::getRenderLayer() void LiquidTile::animateTick(Level *level, int x, int y, int z, Random *random) { - if (material == Material::water) + if (material == Material::water) { - if (random->nextInt(10) == 0) + if (random->nextInt(10) == 0) { - int d = level->getData(x, y, z); - if (d <= 0 || d >= 8) + int d = level->getData(x, y, z); + if (d <= 0 || d >= 8) { - level->addParticle(eParticleType_suspended, x + random->nextFloat(), y + random->nextFloat(), z + random->nextFloat(), 0, 0, 0); - } - } + level->addParticle(eParticleType_suspended, x + random->nextFloat(), y + random->nextFloat(), z + random->nextFloat(), 0, 0, 0); + } + } // 4J-PB - this loop won't run! - for (int i = 0; i < 0; i++) + for (int i = 0; i < 0; i++) { // This was an attempt to add foam to // the bottoms of waterfalls. It // didn't went ok. - int dir = random->nextInt(4); - int xt = x; - int zt = z; - if (dir == 0) xt--; - if (dir == 1) xt++; - if (dir == 2) zt--; - if (dir == 3) zt++; - if (level->getMaterial(xt, y, zt) == Material::air && (level->getMaterial(xt, y - 1, zt)->blocksMotion() || level->getMaterial(xt, y - 1, zt)->isLiquid())) + int dir = random->nextInt(4); + int xt = x; + int zt = z; + if (dir == 0) xt--; + if (dir == 1) xt++; + if (dir == 2) zt--; + if (dir == 3) zt++; + if (level->getMaterial(xt, y, zt) == Material::air && (level->getMaterial(xt, y - 1, zt)->blocksMotion() || level->getMaterial(xt, y - 1, zt)->isLiquid())) { - float r = 1 / 16.0f; - double xx = x + random->nextFloat(); - double yy = y + random->nextFloat(); - double zz = z + random->nextFloat(); - if (dir == 0) xx = x - r; - if (dir == 1) xx = x + 1 + r; - if (dir == 2) zz = z - r; - if (dir == 3) zz = z + 1 + r; - - double xd = 0; - double zd = 0; - - if (dir == 0) xd = -r; - if (dir == 1) xd = +r; - if (dir == 2) zd = -r; - if (dir == 3) zd = +r; - - level->addParticle(eParticleType_splash, xx, yy, zz, xd, 0, zd); - } - } - } - if (material == Material::water && random->nextInt(64) == 0) + float r = 1 / 16.0f; + double xx = x + random->nextFloat(); + double yy = y + random->nextFloat(); + double zz = z + random->nextFloat(); + if (dir == 0) xx = x - r; + if (dir == 1) xx = x + 1 + r; + if (dir == 2) zz = z - r; + if (dir == 3) zz = z + 1 + r; + + double xd = 0; + double zd = 0; + + if (dir == 0) xd = -r; + if (dir == 1) xd = +r; + if (dir == 2) zd = -r; + if (dir == 3) zd = +r; + + level->addParticle(eParticleType_splash, xx, yy, zz, xd, 0, zd); + } + } + } + if (material == Material::water && random->nextInt(64) == 0) { - int d = level->getData(x, y, z); - if (d > 0 && d < 8) + int d = level->getData(x, y, z); + if (d > 0 && d < 8) { - level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_LIQUID_WATER, random->nextFloat() * 0.25f + 0.75f, random->nextFloat() * 1.0f + 0.5f); - } - } - if (material == Material::lava) + level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_LIQUID_WATER, random->nextFloat() * 0.25f + 0.75f, random->nextFloat() * 1.0f + 0.5f, false); + } + } + if (material == Material::lava) { - if (level->getMaterial(x, y + 1, z) == Material::air && !level->isSolidRenderTile(x, y + 1, z)) + if (level->getMaterial(x, y + 1, z) == Material::air && !level->isSolidRenderTile(x, y + 1, z)) { - if (random->nextInt(100) == 0) + if (random->nextInt(100) == 0) { ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); - double xx = x + random->nextFloat(); - double yy = y + tls->yy1; - double zz = z + random->nextFloat(); - level->addParticle(eParticleType_lava, xx, yy, zz, 0, 0, 0); + double xx = x + random->nextFloat(); + double yy = y + tls->yy1; + double zz = z + random->nextFloat(); + level->addParticle(eParticleType_lava, xx, yy, zz, 0, 0, 0); // 4J - new sound brought forward from 1.2.3 - level->playLocalSound(xx, yy, zz, eSoundType_LIQUID_LAVA_POP, 0.2f + random->nextFloat() * 0.2f, 0.9f + random->nextFloat() * 0.15f); - } + level->playLocalSound(xx, yy, zz, eSoundType_LIQUID_LAVA_POP, 0.2f + random->nextFloat() * 0.2f, 0.9f + random->nextFloat() * 0.15f, false); + } // 4J - new sound brought forward from 1.2.3 - if (random->nextInt(200) == 0) + if (random->nextInt(200) == 0) { - level->playLocalSound(x, y, z, eSoundType_LIQUID_LAVA, 0.2f + random->nextFloat() * 0.2f, 0.9f + random->nextFloat() * 0.15f); - } - } - } + level->playLocalSound(x, y, z, eSoundType_LIQUID_LAVA, 0.2f + random->nextFloat() * 0.2f, 0.9f + random->nextFloat() * 0.15f, false); + } + } + } - if (random->nextInt(10) == 0) + if (random->nextInt(10) == 0) { - if (level->isTopSolidBlocking(x, y - 1, z) && !level->getMaterial(x, y - 2, z)->blocksMotion()) + if (level->isTopSolidBlocking(x, y - 1, z) && !level->getMaterial(x, y - 2, z)->blocksMotion()) { - double xx = x + random->nextFloat(); - double yy = y - 1.05; - double zz = z + random->nextFloat(); + double xx = x + random->nextFloat(); + double yy = y - 1.05; + double zz = z + random->nextFloat(); if (material == Material::water) level->addParticle(eParticleType_dripWater, xx, yy, zz, 0, 0, 0); - else level->addParticle(eParticleType_dripLava, xx, yy, zz, 0, 0, 0); - } - } + else level->addParticle(eParticleType_dripLava, xx, yy, zz, 0, 0, 0); + } + } } double LiquidTile::getSlopeAngle(LevelSource *level, int x, int y, int z, Material *m) { - Vec3 *flow = NULL; - if (m == Material::water) flow = ((LiquidTile *) Tile::water)->getFlow(level, x, y, z); - if (m == Material::lava) flow = ((LiquidTile *) Tile::lava)->getFlow(level, x, y, z); - if (flow->x == 0 && flow->z == 0) return -1000; - return atan2(flow->z, flow->x) - PI / 2; + Vec3 *flow = NULL; + if (m == Material::water) flow = ((LiquidTile *) Tile::water)->getFlow(level, x, y, z); + if (m == Material::lava) flow = ((LiquidTile *) Tile::lava)->getFlow(level, x, y, z); + if (flow->x == 0 && flow->z == 0) return -1000; + return atan2(flow->z, flow->x) - PI / 2; } void LiquidTile::onPlace(Level *level, int x, int y, int z) @@ -357,41 +368,41 @@ void LiquidTile::neighborChanged(Level *level, int x, int y, int z, int type) void LiquidTile::updateLiquid(Level *level, int x, int y, int z) { - if (level->getTile(x, y, z) != id) return; - if (material == Material::lava) + if (level->getTile(x, y, z) != id) return; + if (material == Material::lava) { - bool water = false; - if (water || level->getMaterial(x, y, z - 1) == Material::water) water = true; - if (water || level->getMaterial(x, y, z + 1) == Material::water) water = true; - if (water || level->getMaterial(x - 1, y, z) == Material::water) water = true; - if (water || level->getMaterial(x + 1, y, z) == Material::water) water = true; - if (water || level->getMaterial(x, y + 1, z) == Material::water) water = true; - if (water) + bool water = false; + if (water || level->getMaterial(x, y, z - 1) == Material::water) water = true; + if (water || level->getMaterial(x, y, z + 1) == Material::water) water = true; + if (water || level->getMaterial(x - 1, y, z) == Material::water) water = true; + if (water || level->getMaterial(x + 1, y, z) == Material::water) water = true; + if (water || level->getMaterial(x, y + 1, z) == Material::water) water = true; + if (water) { - int data = level->getData(x, y, z); - if (data == 0) + int data = level->getData(x, y, z); + if (data == 0) { - level->setTile(x, y, z, Tile::obsidian_Id); - } + level->setTileAndUpdate(x, y, z, Tile::obsidian_Id); + } else if (data <= 4) { - level->setTile(x, y, z, Tile::stoneBrick_Id); - } - fizz(level, x, y, z); - } - } + level->setTileAndUpdate(x, y, z, Tile::cobblestone_Id); + } + fizz(level, x, y, z); + } + } } void LiquidTile::fizz(Level *level, int x, int y, int z) { MemSect(31); - level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); + level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); MemSect(0); - for (int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { - level->addParticle(eParticleType_largesmoke, x +Math::random(), y + 1.2, z + Math::random(), 0, 0, 0); - } + level->addParticle(eParticleType_largesmoke, x +Math::random(), y + 1.2, z + Math::random(), 0, 0, 0); + } } void LiquidTile::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/LiquidTile.h b/Minecraft.World/LiquidTile.h index 67eb5b65..bcc00347 100644 --- a/Minecraft.World/LiquidTile.h +++ b/Minecraft.World/LiquidTile.h @@ -22,13 +22,13 @@ protected: public: virtual bool isPathfindable(LevelSource *level, int x, int y, int z); virtual int getColor() const; - virtual int getColor(LevelSource *level, int x, int y, int z); + virtual int getColor(LevelSource *level, int x, int y, int z); virtual int getColor(LevelSource *level, int x, int y, int z, int data); // 4J added - static float getHeight(int d); - virtual Icon *getTexture(int face, int data); + static float getHeight(int d); + virtual Icon *getTexture(int face, int data); protected: virtual int getDepth(Level *level, int x, int y, int z); - virtual int getRenderedDepth(LevelSource *level, int x, int y, int z); + virtual int getRenderedDepth(LevelSource *level, int x, int y, int z); public: virtual bool isCubeShaped(); virtual bool isSolidRender(bool isServerLevel = false); @@ -43,7 +43,7 @@ private: virtual Vec3 *getFlow(LevelSource *level, int x, int y, int z); public: virtual void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); - virtual int getTickDelay(); + virtual int getTickDelay(Level *level); virtual int getLightColor(LevelSource *level, int x, int y, int z, int tileId=-1); // 4J - brought forward from 1.8.2 virtual float getBrightness(LevelSource *level, int x, int y, int z); virtual int getRenderLayer(); diff --git a/Minecraft.World/LiquidTileDynamic.cpp b/Minecraft.World/LiquidTileDynamic.cpp index 14a93b93..2c7c74f4 100644 --- a/Minecraft.World/LiquidTileDynamic.cpp +++ b/Minecraft.World/LiquidTileDynamic.cpp @@ -6,8 +6,8 @@ LiquidTileDynamic::LiquidTileDynamic(int id, Material *material) : LiquidTile(id, material) { maxCount = 0; - result = new bool[4]; - dist = new int[4]; + result = new bool[4]; + dist = new int[4]; m_iterativeInstatick = false; } @@ -19,9 +19,8 @@ LiquidTileDynamic::~LiquidTileDynamic() void LiquidTileDynamic::setStatic(Level *level, int x, int y, int z) { - int d = level->getData(x, y, z); - level->setTileAndDataNoUpdate(x, y, z, id + 1, d); - level->setTilesDirty(x, y, z, x, y, z); + int d = level->getData(x, y, z); + level->setTileAndData(x, y, z, id + 1, d, Tile::UPDATE_CLIENTS); } bool LiquidTileDynamic::isPathfindable(LevelSource *level, int x, int y, int z) @@ -32,13 +31,16 @@ bool LiquidTileDynamic::isPathfindable(LevelSource *level, int x, int y, int z) void LiquidTileDynamic::iterativeTick(Level *level, int x, int y, int z, Random *random) { m_tilesToTick.push_back(LiquidTickData(level, x,y,z,random)); - - while(m_tilesToTick.size() > 0) + + int failsafe = 100; + while((m_tilesToTick.size() > 0) && ( failsafe > 0 ) ) { LiquidTickData tickData = m_tilesToTick.front(); m_tilesToTick.pop_front(); mainTick(tickData.level, tickData.x, tickData.y, tickData.z, tickData.random); + failsafe--; } + m_tilesToTick.clear(); } void LiquidTileDynamic::tick(Level *level, int x, int y, int z, Random *random) @@ -63,117 +65,119 @@ void LiquidTileDynamic::tick(Level *level, int x, int y, int z, Random *random) // This is to fix the stack overflow that occurs sometimes when instaticking on level gen. void LiquidTileDynamic::mainTick(Level *level, int x, int y, int z, Random *random) { - int depth = getDepth(level, x, y, z); + int depth = getDepth(level, x, y, z); - int dropOff = 1; - if (material == Material::lava && !level->dimension->ultraWarm) dropOff = 2; + int dropOff = 1; + if (material == Material::lava && !level->dimension->ultraWarm) dropOff = 2; - bool becomeStatic = true; - if (depth > 0) + bool becomeStatic = true; + int tickDelay = getTickDelay(level); + if (depth > 0) { - int highest = -100; - maxCount = 0; - highest = getHighest(level, x - 1, y, z, highest); - highest = getHighest(level, x + 1, y, z, highest); - highest = getHighest(level, x, y, z - 1, highest); - highest = getHighest(level, x, y, z + 1, highest); + int highest = -100; + maxCount = 0; + highest = getHighest(level, x - 1, y, z, highest); + highest = getHighest(level, x + 1, y, z, highest); + highest = getHighest(level, x, y, z - 1, highest); + highest = getHighest(level, x, y, z + 1, highest); - int newDepth = highest + dropOff; - if (newDepth >= 8 || highest < 0) + int newDepth = highest + dropOff; + if (newDepth >= 8 || highest < 0) { - newDepth = -1; - } - if (getDepth(level, x, y + 1, z) >= 0) + newDepth = -1; + } + if (getDepth(level, x, y + 1, z) >= 0) { - int above = getDepth(level, x, y + 1, z); - if (above >= 8) newDepth = above; - else newDepth = above + 8; - } - if (maxCount >= 2 && material == Material::water) + int above = getDepth(level, x, y + 1, z); + if (above >= 8) newDepth = above; + else newDepth = above + 8; + } + if (maxCount >= 2 && material == Material::water) { - // Only spread spring if it's on top of an existing spring, or + // Only spread spring if it's on top of an existing spring, or // on top of solid ground. - if (level->getMaterial(x, y - 1, z)->isSolid()) + if (level->getMaterial(x, y - 1, z)->isSolid()) { - newDepth = 0; - } + newDepth = 0; + } else if (level->getMaterial(x, y - 1, z) == material && level->getData(x, y - 1, z) == 0) { - newDepth = 0; - } - } - if (material == Material::lava) + newDepth = 0; + } + } + if (material == Material::lava) { - if (depth < 8 && newDepth < 8) + if (depth < 8 && newDepth < 8) { - if (newDepth > depth) + if (newDepth > depth) { - if (random->nextInt(4) != 0) + if (random->nextInt(4) != 0) { - newDepth = depth; - becomeStatic = false; - } - } - } - } - if (newDepth == depth) + tickDelay = tickDelay * 4; + } + } + } + } + if (newDepth == depth) { - if (becomeStatic) + if (becomeStatic) { setStatic(level, x, y, z); } - } + } else { - depth = newDepth; - if (depth < 0) + depth = newDepth; + if (depth < 0) { - level->setTile(x, y, z, 0); - } else + level->removeTile(x, y, z); + } + else { - level->setData(x, y, z, depth); - level->addToTickNextTick(x, y, z, id, getTickDelay()); - level->updateNeighborsAt(x, y, z, id); - } - } - } else + level->setData(x, y, z, depth, Tile::UPDATE_CLIENTS); + level->addToTickNextTick(x, y, z, id, tickDelay); + level->updateNeighborsAt(x, y, z, id); + } + } + } + else { - setStatic(level, x, y, z); - } - if (canSpreadTo(level, x, y - 1, z)) + setStatic(level, x, y, z); + } + if (canSpreadTo(level, x, y - 1, z)) { - if (material == Material::lava) + if (material == Material::lava) { - if (level->getMaterial(x, y - 1, z) == Material::water) + if (level->getMaterial(x, y - 1, z) == Material::water) { - level->setTile(x, y - 1, z, Tile::rock_Id); - fizz(level, x, y - 1, z); - return; - } - } + level->setTileAndUpdate(x, y - 1, z, Tile::stone_Id); + fizz(level, x, y - 1, z); + return; + } + } - if (depth >= 8) trySpreadTo(level, x, y - 1, z, depth); - else trySpreadTo(level, x, y - 1, z, depth + 8); - } + if (depth >= 8) trySpreadTo(level, x, y - 1, z, depth); + else trySpreadTo(level, x, y - 1, z, depth + 8); + } else if (depth >= 0 && (depth == 0 || isWaterBlocking(level, x, y - 1, z))) { - bool *spreads = getSpread(level, x, y, z); - int neighbor = depth + dropOff; - if (depth >= 8) + bool *spreads = getSpread(level, x, y, z); + int neighbor = depth + dropOff; + if (depth >= 8) { - neighbor = 1; - } - if (neighbor >= 8) return; - if (spreads[0]) trySpreadTo(level, x - 1, y, z, neighbor); - if (spreads[1]) trySpreadTo(level, x + 1, y, z, neighbor); - if (spreads[2]) trySpreadTo(level, x, y, z - 1, neighbor); - if (spreads[3]) trySpreadTo(level, x, y, z + 1, neighbor); - } + neighbor = 1; + } + if (neighbor >= 8) return; + if (spreads[0]) trySpreadTo(level, x - 1, y, z, neighbor); + if (spreads[1]) trySpreadTo(level, x + 1, y, z, neighbor); + if (spreads[2]) trySpreadTo(level, x, y, z - 1, neighbor); + if (spreads[3]) trySpreadTo(level, x, y, z + 1, neighbor); + } } void LiquidTileDynamic::trySpreadTo(Level *level, int x, int y, int z, int neighbor) { - if (canSpreadTo(level, x, y, z)) + if (canSpreadTo(level, x, y, z)) { { int old = level->getTile(x, y, z); @@ -189,129 +193,129 @@ void LiquidTileDynamic::trySpreadTo(Level *level, int x, int y, int z, int neigh } } } - level->setTileAndData(x, y, z, id, neighbor); - } + level->setTileAndData(x, y, z, id, neighbor, Tile::UPDATE_ALL); + } } int LiquidTileDynamic::getSlopeDistance(Level *level, int x, int y, int z, int pass, int from) { - int lowest = 1000; - for (int d = 0; d < 4; d++) + int lowest = 1000; + for (int d = 0; d < 4; d++) { - if (d == 0 && from == 1) continue; - if (d == 1 && from == 0) continue; - if (d == 2 && from == 3) continue; - if (d == 3 && from == 2) continue; + if (d == 0 && from == 1) continue; + if (d == 1 && from == 0) continue; + if (d == 2 && from == 3) continue; + if (d == 3 && from == 2) continue; - int xx = x; - int yy = y; - int zz = z; + int xx = x; + int yy = y; + int zz = z; - if (d == 0) xx--; - if (d == 1) xx++; - if (d == 2) zz--; - if (d == 3) zz++; + if (d == 0) xx--; + if (d == 1) xx++; + if (d == 2) zz--; + if (d == 3) zz++; - if (isWaterBlocking(level, xx, yy, zz)) + if (isWaterBlocking(level, xx, yy, zz)) { - continue; - } else if (level->getMaterial(xx, yy, zz) == material && level->getData(xx, yy, zz) == 0) + continue; + } else if (level->getMaterial(xx, yy, zz) == material && level->getData(xx, yy, zz) == 0) { - continue; - } + continue; + } else { - if (isWaterBlocking(level, xx, yy - 1, zz)) + if (isWaterBlocking(level, xx, yy - 1, zz)) { - if (pass < 4) + if (pass < 4) { - int v = getSlopeDistance(level, xx, yy, zz, pass + 1, d); - if (v < lowest) lowest = v; - } - } + int v = getSlopeDistance(level, xx, yy, zz, pass + 1, d); + if (v < lowest) lowest = v; + } + } else { - return pass; - } - } - } - return lowest; + return pass; + } + } + } + return lowest; } bool *LiquidTileDynamic::getSpread(Level *level, int x, int y, int z) { - for (int d = 0; d < 4; d++) + for (int d = 0; d < 4; d++) { - dist[d] = 1000; - int xx = x; - int yy = y; - int zz = z; + dist[d] = 1000; + int xx = x; + int yy = y; + int zz = z; - if (d == 0) xx--; - if (d == 1) xx++; - if (d == 2) zz--; - if (d == 3) zz++; - if (isWaterBlocking(level, xx, yy, zz)) + if (d == 0) xx--; + if (d == 1) xx++; + if (d == 2) zz--; + if (d == 3) zz++; + if (isWaterBlocking(level, xx, yy, zz)) { - continue; - } + continue; + } else if (level->getMaterial(xx, yy, zz) == material && level->getData(xx, yy, zz) == 0) { - continue; - } + continue; + } { - if (isWaterBlocking(level, xx, yy - 1, zz)) + if (isWaterBlocking(level, xx, yy - 1, zz)) { - dist[d] = getSlopeDistance(level, xx, yy, zz, 1, d); - } + dist[d] = getSlopeDistance(level, xx, yy, zz, 1, d); + } else { - dist[d] = 0; - } - } - } + dist[d] = 0; + } + } + } - int lowest = dist[0]; - for (int d = 1; d < 4; d++) + int lowest = dist[0]; + for (int d = 1; d < 4; d++) { - if (dist[d] < lowest) lowest = dist[d]; - } + if (dist[d] < lowest) lowest = dist[d]; + } - for (int d = 0; d < 4; d++) + for (int d = 0; d < 4; d++) { - result[d] = (dist[d] == lowest); - } - return result; + result[d] = (dist[d] == lowest); + } + return result; } bool LiquidTileDynamic::isWaterBlocking(Level *level, int x, int y, int z) { - int t = level->getTile(x, y, z); - if (t == Tile::door_wood_Id || t == Tile::door_iron_Id || t == Tile::sign_Id || t == Tile::ladder_Id || t == Tile::reeds_Id) + int t = level->getTile(x, y, z); + if (t == Tile::door_wood_Id || t == Tile::door_iron_Id || t == Tile::sign_Id || t == Tile::ladder_Id || t == Tile::reeds_Id) { - return true; - } - if (t == 0) return false; - Material *m = Tile::tiles[t]->material; - if (m == Material::portal) return true; - if (m->blocksMotion()) return true; - return false; + return true; + } + if (t == 0) return false; + Material *m = Tile::tiles[t]->material; + if (m == Material::portal) return true; + if (m->blocksMotion()) return true; + return false; } int LiquidTileDynamic::getHighest(Level *level, int x, int y, int z, int current) { - int d = getDepth(level, x, y, z); - if (d < 0) return current; - if (d == 0) maxCount++; - if (d >= 8) + int d = getDepth(level, x, y, z); + if (d < 0) return current; + if (d == 0) maxCount++; + if (d >= 8) { - d = 0; - } - return current < 0 || d < current ? d : current; + d = 0; + } + return current < 0 || d < current ? d : current; } bool LiquidTileDynamic::canSpreadTo(Level *level, int x, int y, int z) @@ -326,17 +330,22 @@ bool LiquidTileDynamic::canSpreadTo(Level *level, int x, int y, int z) if( ( ix < 0 ) || ( ix >= level->chunkSourceXZSize ) ) return false; if( ( iz < 0 ) || ( iz >= level->chunkSourceXZSize ) ) return false; - Material *target = level->getMaterial(x, y, z); - if (target == material) return false; - if (target == Material::lava) return false; - return !isWaterBlocking(level, x, y, z); + Material *target = level->getMaterial(x, y, z); + if (target == material) return false; + if (target == Material::lava) return false; + return !isWaterBlocking(level, x, y, z); } void LiquidTileDynamic::onPlace(Level *level, int x, int y, int z) { - LiquidTile::onPlace(level, x, y, z); - if (level->getTile(x, y, z) == id) + LiquidTile::onPlace(level, x, y, z); + if (level->getTile(x, y, z) == id) { - level->addToTickNextTick(x, y, z, id, getTickDelay()); - } + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); + } } + +bool LiquidTileDynamic::canInstantlyTick() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.World/LiquidTileDynamic.h b/Minecraft.World/LiquidTileDynamic.h index 51bbf181..bf0c9a6d 100644 --- a/Minecraft.World/LiquidTileDynamic.h +++ b/Minecraft.World/LiquidTileDynamic.h @@ -25,7 +25,7 @@ protected: virtual ~LiquidTileDynamic(); private: void setStatic(Level *level, int x, int y, int z); - int maxCount; + int maxCount; public: virtual bool isPathfindable(LevelSource *level, int x, int y, int z); @@ -38,17 +38,18 @@ public: private: void trySpreadTo(Level *level, int x, int y, int z, int neighbor); - bool *result; - int *dist; + bool *result; + int *dist; private: int getSlopeDistance(Level *level, int x, int y, int z, int pass, int from); - bool *getSpread(Level *level, int x, int y, int z); - bool isWaterBlocking(Level *level, int x, int y, int z); + bool *getSpread(Level *level, int x, int y, int z); + bool isWaterBlocking(Level *level, int x, int y, int z); protected: int getHighest(Level *level, int x, int y, int z, int current); private: bool canSpreadTo(Level *level, int x, int y, int z); public: void onPlace(Level *level, int x, int y, int z); + bool canInstantlyTick(); }; \ No newline at end of file diff --git a/Minecraft.World/LiquidTileStatic.cpp b/Minecraft.World/LiquidTileStatic.cpp index 1d82d3dd..46018093 100644 --- a/Minecraft.World/LiquidTileStatic.cpp +++ b/Minecraft.World/LiquidTileStatic.cpp @@ -5,8 +5,8 @@ LiquidTileStatic::LiquidTileStatic(int id, Material *material) : LiquidTile(id, material) { - setTicking(false); - if (material == Material::lava) setTicking(true); + setTicking(false); + if (material == Material::lava) setTicking(true); } bool LiquidTileStatic::isPathfindable(LevelSource *level, int x, int y, int z) @@ -16,53 +16,50 @@ bool LiquidTileStatic::isPathfindable(LevelSource *level, int x, int y, int z) void LiquidTileStatic::neighborChanged(Level *level, int x, int y, int z, int type) { - LiquidTile::neighborChanged(level, x, y, z, type); - if (level->getTile(x, y, z) == id) + LiquidTile::neighborChanged(level, x, y, z, type); + if (level->getTile(x, y, z) == id) { - setDynamic(level, x, y, z); - } + setDynamic(level, x, y, z); + } } void LiquidTileStatic::setDynamic(Level *level, int x, int y, int z) { - int d = level->getData(x, y, z); - level->noNeighborUpdate = true; - level->setTileAndDataNoUpdate(x, y, z, id - 1, d); - level->setTilesDirty(x, y, z, x, y, z); - level->addToTickNextTick(x, y, z, id - 1, getTickDelay()); - level->noNeighborUpdate = false; + int d = level->getData(x, y, z); + level->setTileAndData(x, y, z, id - 1, d, Tile::UPDATE_CLIENTS); + level->addToTickNextTick(x, y, z, id - 1, getTickDelay(level)); } void LiquidTileStatic::tick(Level *level, int x, int y, int z, Random *random) { - if (material == Material::lava) + if (material == Material::lava) { - int h = random->nextInt(3); - for (int i = 0; i < h; i++) + int h = random->nextInt(3); + for (int i = 0; i < h; i++) { - x += random->nextInt(3) - 1; - y++; - z += random->nextInt(3) - 1; - int t = level->getTile(x, y, z); - if (t == 0) + x += random->nextInt(3) - 1; + y++; + z += random->nextInt(3) - 1; + int t = level->getTile(x, y, z); + if (t == 0) { - if (isFlammable(level, x - 1, y, z) || + if (isFlammable(level, x - 1, y, z) || isFlammable(level, x + 1, y, z) || isFlammable(level, x, y, z - 1) || isFlammable(level, x, y, z + 1) || isFlammable(level, x, y - 1, z) || isFlammable(level, x, y + 1, z)) { - level->setTile(x, y, z, Tile::fire_Id); - return; - } - } + level->setTileAndUpdate(x, y, z, Tile::fire_Id); + return; + } + } else if (Tile::tiles[t]->material->blocksMotion()) { - return; - } + return; + } - } + } if (h == 0) { int ox = x; @@ -71,12 +68,13 @@ void LiquidTileStatic::tick(Level *level, int x, int y, int z, Random *random) { x = ox + random->nextInt(3) - 1; z = oz + random->nextInt(3) - 1; - if (level->isEmptyTile(x, y + 1, z) && isFlammable(level, x, y, z)) { - level->setTile(x, y + 1, z, Tile::fire_Id); + if (level->isEmptyTile(x, y + 1, z) && isFlammable(level, x, y, z)) + { + level->setTileAndUpdate(x, y + 1, z, Tile::fire_Id); } } } - } + } } bool LiquidTileStatic::isFlammable(Level *level, int x, int y, int z) diff --git a/Minecraft.World/ListTag.h b/Minecraft.World/ListTag.h index 9deeb22d..c80c0f39 100644 --- a/Minecraft.World/ListTag.h +++ b/Minecraft.World/ListTag.h @@ -5,51 +5,60 @@ using namespace std; template class ListTag : public Tag { private: - vector list; - byte type; + vector list; + byte type; public: ListTag() : Tag(L"") {} ListTag(const wstring &name) : Tag(name) {} - void write(DataOutput *dos) + void write(DataOutput *dos) { - if (list.size() > 0) type = (list[0])->getId(); - else type = 1; + if (list.size() > 0) type = (list[0])->getId(); + else type = 1; - dos->writeByte(type); - dos->writeInt((int)list.size()); + dos->writeByte(type); + dos->writeInt((int)list.size()); AUTO_VAR(itEnd, list.end()); - for (AUTO_VAR(it, list.begin()); it != itEnd; it++) - (*it)->write(dos); + for (AUTO_VAR(it, list.begin()); it != itEnd; it++) + (*it)->write(dos); } - void load(DataInput *dis) + + void load(DataInput *dis, int tagDepth) { - type = dis->readByte(); - int size = dis->readInt(); + if (tagDepth > MAX_DEPTH) + { +#ifndef _CONTENT_PACKAGE + printf("Tried to read NBT tag with too high complexity, depth > %d", MAX_DEPTH); + __debugbreak(); +#endif + return; + } + type = dis->readByte(); + int size = dis->readInt(); - list.clear(); - for (int i = 0; i < size; i++) + list.clear(); + for (int i = 0; i < size; i++) { - Tag *tag = Tag::newTag(type, L""); - tag->load(dis); - list.push_back(tag); - } + Tag *tag = Tag::newTag(type, L""); + tag->load(dis, tagDepth); + list.push_back(tag); + } } byte getId() { return TAG_List; } - wstring toString() + wstring toString() { static wchar_t buf[64]; swprintf(buf,64,L"%d entries of type %ls",list.size(),Tag::getTagName(type)); return wstring( buf ); } - void print(char *prefix, ostream out) + void print(char *prefix, ostream out) { - Tag::print(prefix, out); + Tag::print(prefix, out); out << prefix << "{" << endl; @@ -57,24 +66,29 @@ public: strcpy( newPrefix, prefix); strcat( newPrefix, " "); AUTO_VAR(itEnd, list.end()); - for (AUTO_VAR(it, list.begin()); it != itEnd; it++) - (*it)->print(newPrefix, out); + for (AUTO_VAR(it, list.begin()); it != itEnd; it++) + (*it)->print(newPrefix, out); delete[] newPrefix; out << prefix << "}" << endl; } - void add(T *tag) + void add(T *tag) { - type = tag->getId(); - list.push_back(tag); + type = tag->getId(); + // 4J: List tag write/load doesn't preserve tag names so remove them so we can safely do comparisons + // There are a few ways I could have fixed this but this seems the least invasive, most complete fix + // (covers other items that also use list tags and require equality checks to work) + // considering we can't change the write/load functions. + tag->setName(L""); + list.push_back(tag); } - T *get(int index) + T *get(int index) { return (T *) list[index]; } - int size() + int size() { return (int)list.size(); } @@ -82,18 +96,18 @@ public: virtual ~ListTag() { AUTO_VAR(itEnd, list.end()); - for (AUTO_VAR(it, list.begin()); it != itEnd; it++) + for (AUTO_VAR(it, list.begin()); it != itEnd; it++) { delete *it; } } - Tag *copy() + virtual Tag *copy() { ListTag *res = new ListTag(getName()); res->type = type; AUTO_VAR(itEnd, list.end()); - for (AUTO_VAR(it, list.begin()); it != itEnd; it++) + for (AUTO_VAR(it, list.begin()); it != itEnd; it++) { T *copy = (T *) (*it)->copy(); res->list.push_back(copy); @@ -101,8 +115,7 @@ public: return res; } -#if 0 - bool equals(Object obj) + virtual bool equals(Tag *obj) { if (Tag::equals(obj)) { @@ -115,10 +128,10 @@ public: equal = true; AUTO_VAR(itEnd, list.end()); // 4J Stu - Pretty inefficient method, but I think we can live with it give how often it will happen, and the small sizes of the data sets - for (AUTO_VAR(it, list.begin()); it != itEnd; it++) + for (AUTO_VAR(it, list.begin()); it != itEnd; ++it) { bool thisMatches = false; - for(AUTO_VAR(it2, o->list.begin()); it != o->list.end(); ++it2) + for(AUTO_VAR(it2, o->list.begin()); it2 != o->list.end(); ++it2) { if((*it)->equals(*it2)) { @@ -140,5 +153,4 @@ public: } return false; } -#endif }; \ No newline at end of file diff --git a/Minecraft.World/LivingEntity.cpp b/Minecraft.World/LivingEntity.cpp new file mode 100644 index 00000000..5f8a3dd1 --- /dev/null +++ b/Minecraft.World/LivingEntity.cpp @@ -0,0 +1,2005 @@ +#include "stdafx.h" +#include "JavaMath.h" +#include "Mth.h" +#include "net.minecraft.network.packet.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.ai.sensing.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.chunk.h" +#include "net.minecraft.world.level.material.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.world.item.alchemy.h" +#include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.scores.h" +#include "com.mojang.nbt.h" +#include "LivingEntity.h" +#include "..\Minecraft.Client\Textures.h" +#include "..\Minecraft.Client\ServerLevel.h" +#include "..\Minecraft.Client\EntityTracker.h" +#include "SoundTypes.h" +#include "BasicTypeContainers.h" +#include "ParticleTypes.h" +#include "GenericStats.h" +#include "ItemEntity.h" + +const double LivingEntity::MIN_MOVEMENT_DISTANCE = 0.005; + +AttributeModifier *LivingEntity::SPEED_MODIFIER_SPRINTING = (new AttributeModifier(eModifierId_MOB_SPRINTING, 0.3f, AttributeModifier::OPERATION_MULTIPLY_TOTAL))->setSerialize(false); + +void LivingEntity::_init() +{ + attributes = NULL; + combatTracker = new CombatTracker(this); + lastEquipment = ItemInstanceArray(5); + + swinging = false; + swingTime = 0; + removeArrowTime = 0; + lastHealth = 0.0f; + + hurtTime = 0; + hurtDuration = 0; + hurtDir = 0.0f; + deathTime = 0; + attackTime = 0; + oAttackAnim = attackAnim = 0.0f; + + walkAnimSpeedO = 0.0f; + walkAnimSpeed = 0.0f; + walkAnimPos = 0.0f; + invulnerableDuration = 20; + oTilt = tilt = 0.0f; + timeOffs = 0.0f; + rotA = 0.0f; + yBodyRot = yBodyRotO = 0.0f; + yHeadRot = yHeadRotO = 0.0f; + flyingSpeed = 0.02f; + + lastHurtByPlayer = nullptr; + lastHurtByPlayerTime = 0; + dead = false; + noActionTime = 0; + oRun = run = 0.0f; + animStep = animStepO = 0.0f; + rotOffs = 0.0f; + deathScore = 0; + lastHurt = 0.0f; + jumping = false; + + xxa = 0.0f; + yya = 0.0f; + yRotA = 0.0f; + lSteps = 0; + lx = ly = lz = lyr = lxr = 0.0; + + effectsDirty = false; + + lastHurtByMob = nullptr; + lastHurtByMobTimestamp = 0; + lastHurtMob = nullptr; + lastHurtMobTimestamp = 0; + + speed = 0.0f; + noJumpDelay = 0; + absorptionAmount = 0.0f; +} + +LivingEntity::LivingEntity( Level* level) : Entity(level) +{ + MemSect(56); + _init(); + MemSect(0); + + // 4J Stu - This will not call the correct derived function, so moving to each derived class + //setHealth(0); + //registerAttributes(); + + blocksBuilding = true; + + rotA = (float) (Math::random() + 1) * 0.01f; + setPos(x, y, z); + timeOffs = (float) Math::random() * 12398; + yRot = (float) (Math::random() * PI * 2); + yHeadRot = yRot; + + footSize = 0.5f; +} + +LivingEntity::~LivingEntity() +{ + for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ++it) + { + delete it->second; + } + + delete attributes; + delete combatTracker; + + if(lastEquipment.data != NULL) delete [] lastEquipment.data; +} + +void LivingEntity::defineSynchedData() +{ + entityData->define(DATA_EFFECT_COLOR_ID, 0); + entityData->define(DATA_EFFECT_AMBIENCE_ID, (byte) 0); + entityData->define(DATA_ARROW_COUNT_ID, (byte) 0); + entityData->define(DATA_HEALTH_ID, 1.0f); +} + +void LivingEntity::registerAttributes() +{ + getAttributes()->registerAttribute(SharedMonsterAttributes::MAX_HEALTH); + getAttributes()->registerAttribute(SharedMonsterAttributes::KNOCKBACK_RESISTANCE); + getAttributes()->registerAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + + if (!useNewAi()) + { + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.1f); + } +} + +void LivingEntity::checkFallDamage(double ya, bool onGround) +{ + if (!isInWater()) + { + // double-check if we've reached water in this move tick + updateInWaterState(); + } + + if (onGround && fallDistance > 0) + { + int xt = Mth::floor(x); + int yt = Mth::floor(y - 0.2f - heightOffset); + int zt = Mth::floor(z); + int t = level->getTile(xt, yt, zt); + if (t == 0) + { + int renderShape = level->getTileRenderShape(xt, yt - 1, zt); + if (renderShape == Tile::SHAPE_FENCE || renderShape == Tile::SHAPE_WALL || renderShape == Tile::SHAPE_FENCE_GATE) + { + t = level->getTile(xt, yt - 1, zt); + } + } + + if (t > 0) + { + Tile::tiles[t]->fallOn(level, xt, yt, zt, shared_from_this(), fallDistance); + } + } + + Entity::checkFallDamage(ya, onGround); +} + +bool LivingEntity::isWaterMob() +{ + return false; +} + +void LivingEntity::baseTick() +{ + oAttackAnim = attackAnim; + Entity::baseTick(); + + if (isAlive() && isInWall()) + { + hurt(DamageSource::inWall, 1); + } + + if (isFireImmune() || level->isClientSide) clearFire(); + shared_ptr thisPlayer = dynamic_pointer_cast(shared_from_this()); + bool isInvulnerable = (thisPlayer != NULL && thisPlayer->abilities.invulnerable); + + if (isAlive() && isUnderLiquid(Material::water)) + { + if(!isWaterMob() && !hasEffect(MobEffect::waterBreathing->id) && !isInvulnerable) + { + setAirSupply(decreaseAirSupply(getAirSupply())); + if (getAirSupply() == -20) + { + setAirSupply(0); + if(canCreateParticles()) + { + for (int i = 0; i < 8; i++) + { + float xo = random->nextFloat() - random->nextFloat(); + float yo = random->nextFloat() - random->nextFloat(); + float zo = random->nextFloat() - random->nextFloat(); + level->addParticle(eParticleType_bubble, x + xo, y + yo, z + zo, xd, yd, zd); + } + } + hurt(DamageSource::drown, 2); + } + } + + clearFire(); + if ( !level->isClientSide && isRiding() && riding->instanceof(eTYPE_LIVINGENTITY) ) + { + ride(nullptr); + } + } + else + { + setAirSupply(TOTAL_AIR_SUPPLY); + } + + oTilt = tilt; + + if (attackTime > 0) attackTime--; + if (hurtTime > 0) hurtTime--; + if (invulnerableTime > 0) invulnerableTime--; + if (getHealth() <= 0) + { + tickDeath(); + } + + if (lastHurtByPlayerTime > 0) lastHurtByPlayerTime--; + else + { + // Note - this used to just set to nullptr, but that has to create a new shared_ptr and free an old one, when generally this won't be doing anything at all. This + // is the lightweight but ugly alternative + if( lastHurtByPlayer ) + { + lastHurtByPlayer.reset(); + } + } + if (lastHurtMob != NULL && !lastHurtMob->isAlive()) + { + lastHurtMob = nullptr; + } + + // If lastHurtByMob is dead, remove it + if (lastHurtByMob != NULL && !lastHurtByMob->isAlive()) + { + setLastHurtByMob(nullptr); + } + + // Update effects + tickEffects(); + + animStepO = animStep; + + yBodyRotO = yBodyRot; + yHeadRotO = yHeadRot; + yRotO = yRot; + xRotO = xRot; +} + +bool LivingEntity::isBaby() +{ + return false; +} + +void LivingEntity::tickDeath() +{ + deathTime++; + if (deathTime == 20) + { + // 4J Stu - Added level->isClientSide check from 1.2 to fix XP orbs being created client side + if(!level->isClientSide && (lastHurtByPlayerTime > 0 || isAlwaysExperienceDropper()) ) + { + if (!isBaby() && level->getGameRules()->getBoolean(GameRules::RULE_DOMOBLOOT)) + { + int xpCount = this->getExperienceReward(lastHurtByPlayer); + while (xpCount > 0) + { + int newCount = ExperienceOrb::getExperienceValue(xpCount); + xpCount -= newCount; + level->addEntity(shared_ptr( new ExperienceOrb(level, x, y, z, newCount) ) ); + } + } + } + + remove(); + for (int i = 0; i < 20; i++) + { + double xa = random->nextGaussian() * 0.02; + double ya = random->nextGaussian() * 0.02; + double za = random->nextGaussian() * 0.02; + level->addParticle(eParticleType_explode, x + random->nextFloat() * bbWidth * 2 - bbWidth, y + random->nextFloat() * bbHeight, z + random->nextFloat() * bbWidth * 2 - bbWidth, xa, ya, za); + } + } +} + +int LivingEntity::decreaseAirSupply(int currentSupply) +{ + int oxygenBonus = EnchantmentHelper::getOxygenBonus(dynamic_pointer_cast(shared_from_this())); + if (oxygenBonus > 0) + { + if (random->nextInt(oxygenBonus + 1) > 0) + { + // the oxygen bonus prevents us from drowning + return currentSupply; + } + } + if(instanceof(eTYPE_PLAYER)) + { + app.DebugPrintf("++++++++++ %s: Player decreasing air supply to %d\n", level->isClientSide ? "CLIENT" : "SERVER", currentSupply - 1 ); + } + return currentSupply - 1; +} + +int LivingEntity::getExperienceReward(shared_ptr killedBy) +{ + return 0; +} + +bool LivingEntity::isAlwaysExperienceDropper() +{ + return false; +} + +Random *LivingEntity::getRandom() +{ + return random; +} + +shared_ptr LivingEntity::getLastHurtByMob() +{ + return lastHurtByMob; +} + +int LivingEntity::getLastHurtByMobTimestamp() +{ + return lastHurtByMobTimestamp; +} + +void LivingEntity::setLastHurtByMob(shared_ptr target) +{ + lastHurtByMob = target; + lastHurtByMobTimestamp = tickCount; +} + +shared_ptr LivingEntity::getLastHurtMob() +{ + return lastHurtMob; +} + +int LivingEntity::getLastHurtMobTimestamp() +{ + return lastHurtMobTimestamp; +} + +void LivingEntity::setLastHurtMob(shared_ptr target) +{ + if ( target->instanceof(eTYPE_LIVINGENTITY) ) + { + lastHurtMob = dynamic_pointer_cast(target); + } + else + { + lastHurtMob = nullptr; + } + lastHurtMobTimestamp = tickCount; +} + +int LivingEntity::getNoActionTime() +{ + return noActionTime; +} + +void LivingEntity::addAdditonalSaveData(CompoundTag *entityTag) +{ + entityTag->putFloat(L"HealF", getHealth()); + entityTag->putShort(L"Health", (short) ceil(getHealth())); + entityTag->putShort(L"HurtTime", (short) hurtTime); + entityTag->putShort(L"DeathTime", (short) deathTime); + entityTag->putShort(L"AttackTime", (short) attackTime); + entityTag->putFloat(L"AbsorptionAmount", getAbsorptionAmount()); + + ItemInstanceArray items = getEquipmentSlots(); + for (unsigned int i = 0; i < items.length; ++i) + { + shared_ptr item = items[i]; + if (item != NULL) + { + attributes->removeItemModifiers(item); + } + } + + entityTag->put(L"Attributes", SharedMonsterAttributes::saveAttributes(getAttributes())); + + for (unsigned int i = 0; i < items.length; ++i) + { + shared_ptr item = items[i]; + if (item != NULL) + { + attributes->addItemModifiers(item); + } + } + + if (!activeEffects.empty()) + { + ListTag *listTag = new ListTag(); + + for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ++it) + { + MobEffectInstance *effect = it->second; + listTag->add(effect->save(new CompoundTag())); + } + entityTag->put(L"ActiveEffects", listTag); + } +} + +void LivingEntity::readAdditionalSaveData(CompoundTag *tag) +{ + setAbsorptionAmount(tag->getFloat(L"AbsorptionAmount")); + + if (tag->contains(L"Attributes") && level != NULL && !level->isClientSide) + { + SharedMonsterAttributes::loadAttributes(getAttributes(), (ListTag *) tag->getList(L"Attributes")); + } + + if (tag->contains(L"ActiveEffects")) + { + ListTag *effects = (ListTag *) tag->getList(L"ActiveEffects"); + for (int i = 0; i < effects->size(); i++) + { + CompoundTag *effectTag = effects->get(i); + MobEffectInstance *effect = MobEffectInstance::load(effectTag); + activeEffects.insert( unordered_map::value_type( effect->getId(), effect ) ); + } + } + + if (tag->contains(L"HealF")) + { + setHealth( tag->getFloat(L"HealF") ); + } + else + { + Tag *healthTag = tag->get(L"Health"); + if (healthTag == NULL) + { + setHealth(getMaxHealth()); + } + else if (healthTag->getId() == Tag::TAG_Float) + { + setHealth(((FloatTag *) healthTag)->data); + } + else if (healthTag->getId() == Tag::TAG_Short) + { + // pre-1.6 health + setHealth((float) ((ShortTag *) healthTag)->data); + } + } + + hurtTime = tag->getShort(L"HurtTime"); + deathTime = tag->getShort(L"DeathTime"); + attackTime = tag->getShort(L"AttackTime"); +} + +void LivingEntity::tickEffects() +{ + bool removed = false; + for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end();) + { + MobEffectInstance *effect = it->second; + removed = false; + if (!effect->tick(dynamic_pointer_cast(shared_from_this()))) + { + if (!level->isClientSide) + { + it = activeEffects.erase( it ); + onEffectRemoved(effect); + delete effect; + removed = true; + } + } + else if (effect->getDuration() % (SharedConstants::TICKS_PER_SECOND * 30) == 0) + { + // update effects every 30 seconds to synchronize client-side + // timer + onEffectUpdated(effect, false); + } + if(!removed) + { + ++it; + } + } + if (effectsDirty) + { + if (!level->isClientSide) + { + if (activeEffects.empty()) + { + entityData->set(DATA_EFFECT_AMBIENCE_ID, (byte) 0); + entityData->set(DATA_EFFECT_COLOR_ID, 0); + setInvisible(false); + setWeakened(false); + } + else + { + vector values; + for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end();++it) + { + values.push_back(it->second); + } + int colorValue = PotionBrewing::getColorValue(&values); + entityData->set(DATA_EFFECT_AMBIENCE_ID, PotionBrewing::areAllEffectsAmbient(&values) ? (byte) 1 : (byte) 0); + values.clear(); + entityData->set(DATA_EFFECT_COLOR_ID, colorValue); + setInvisible(hasEffect(MobEffect::invisibility->id)); + setWeakened(hasEffect(MobEffect::weakness->id)); + } + } + effectsDirty = false; + } + int colorValue = entityData->getInteger(DATA_EFFECT_COLOR_ID); + bool ambient = entityData->getByte(DATA_EFFECT_AMBIENCE_ID) > 0; + + if (colorValue > 0) + { + boolean doParticle = false; + + if (!isInvisible()) + { + doParticle = random->nextBoolean(); + } + else + { + // much fewer particles when invisible + doParticle = random->nextInt(15) == 0; + } + + if (ambient) doParticle &= random->nextInt(5) == 0; + + if (doParticle) + { + // int colorValue = entityData.getInteger(DATA_EFFECT_COLOR_ID); + if (colorValue > 0) + { + double red = (double) ((colorValue >> 16) & 0xff) / 255.0; + double green = (double) ((colorValue >> 8) & 0xff) / 255.0; + double blue = (double) ((colorValue >> 0) & 0xff) / 255.0; + + level->addParticle(ambient? eParticleType_mobSpellAmbient : eParticleType_mobSpell, x + (random->nextDouble() - 0.5) * bbWidth, y + random->nextDouble() * bbHeight - heightOffset, z + (random->nextDouble() - 0.5) * bbWidth, red, green, blue); + } + } + } +} + +void LivingEntity::removeAllEffects() +{ + //Iterator effectIdIterator = activeEffects.keySet().iterator(); + //while (effectIdIterator.hasNext()) + for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ) + { + //Integer effectId = effectIdIterator.next(); + MobEffectInstance *effect = it->second;//activeEffects.get(effectId); + + if (!level->isClientSide) + { + //effectIdIterator.remove(); + it = activeEffects.erase(it); + onEffectRemoved(effect); + delete effect; + } + else + { + ++it; + } + } +} + +vector *LivingEntity::getActiveEffects() +{ + vector *active = new vector(); + + for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ++it) + { + active->push_back(it->second); + } + + return active; +} + +bool LivingEntity::hasEffect(int id) +{ + return activeEffects.find(id) != activeEffects.end();; +} + +bool LivingEntity::hasEffect(MobEffect *effect) +{ + return activeEffects.find(effect->id) != activeEffects.end(); +} + +MobEffectInstance *LivingEntity::getEffect(MobEffect *effect) +{ + MobEffectInstance *effectInst = NULL; + + AUTO_VAR(it, activeEffects.find(effect->id)); + if(it != activeEffects.end() ) effectInst = it->second; + + return effectInst; +} + +void LivingEntity::addEffect(MobEffectInstance *newEffect) +{ + if (!canBeAffected(newEffect)) + { + return; + } + + if (activeEffects.find(newEffect->getId()) != activeEffects.end() ) + { + // replace effect and update + MobEffectInstance *effectInst = activeEffects.find(newEffect->getId())->second; + effectInst->update(newEffect); + onEffectUpdated(effectInst, true); + } + else + { + activeEffects.insert( unordered_map::value_type( newEffect->getId(), newEffect ) ); + onEffectAdded(newEffect); + } +} + +// 4J Added +void LivingEntity::addEffectNoUpdate(MobEffectInstance *newEffect) +{ + if (!canBeAffected(newEffect)) + { + return; + } + + if (activeEffects.find(newEffect->getId()) != activeEffects.end() ) + { + // replace effect and update + MobEffectInstance *effectInst = activeEffects.find(newEffect->getId())->second; + effectInst->update(newEffect); + } + else + { + activeEffects.insert( unordered_map::value_type( newEffect->getId(), newEffect ) ); + } +} + +bool LivingEntity::canBeAffected(MobEffectInstance *newEffect) +{ + if (getMobType() == UNDEAD) + { + int id = newEffect->getId(); + if (id == MobEffect::regeneration->id || id == MobEffect::poison->id) + { + return false; + } + } + + return true; +} + +bool LivingEntity::isInvertedHealAndHarm() +{ + return getMobType() == UNDEAD; +} + +void LivingEntity::removeEffectNoUpdate(int effectId) +{ + AUTO_VAR(it, activeEffects.find(effectId)); + if (it != activeEffects.end()) + { + MobEffectInstance *effect = it->second; + if(effect != NULL) + { + delete effect; + } + activeEffects.erase(it); + } +} + +void LivingEntity::removeEffect(int effectId) +{ + AUTO_VAR(it, activeEffects.find(effectId)); + if (it != activeEffects.end()) + { + MobEffectInstance *effect = it->second; + if(effect != NULL) + { + onEffectRemoved(effect); + delete effect; + } + activeEffects.erase(it); + } +} + +void LivingEntity::onEffectAdded(MobEffectInstance *effect) +{ + effectsDirty = true; + if (!level->isClientSide) MobEffect::effects[effect->getId()]->addAttributeModifiers(dynamic_pointer_cast(shared_from_this()), getAttributes(), effect->getAmplifier()); +} + +void LivingEntity::onEffectUpdated(MobEffectInstance *effect, bool doRefreshAttributes) +{ + effectsDirty = true; + if (doRefreshAttributes && !level->isClientSide) + { + MobEffect::effects[effect->getId()]->removeAttributeModifiers(dynamic_pointer_cast(shared_from_this()), getAttributes(), effect->getAmplifier()); + MobEffect::effects[effect->getId()]->addAttributeModifiers(dynamic_pointer_cast(shared_from_this()), getAttributes(), effect->getAmplifier()); + } +} + +void LivingEntity::onEffectRemoved(MobEffectInstance *effect) +{ + effectsDirty = true; + if (!level->isClientSide) MobEffect::effects[effect->getId()]->removeAttributeModifiers(dynamic_pointer_cast(shared_from_this()), getAttributes(), effect->getAmplifier()); +} + +void LivingEntity::heal(float heal) +{ + float health = getHealth(); + if (health > 0) + { + setHealth(health + heal); + } +} + +float LivingEntity::getHealth() +{ + return entityData->getFloat(DATA_HEALTH_ID); +} + +void LivingEntity::setHealth(float health) +{ + entityData->set(DATA_HEALTH_ID, Mth::clamp(health, 0.0f, getMaxHealth())); +} + +bool LivingEntity::hurt(DamageSource *source, float dmg) +{ + if (isInvulnerable()) return false; + + // 4J Stu - Reworked this function a bit to show hurt damage on the client before the server responds. + // Fix for #8823 - Gameplay: Confirmation that a monster or animal has taken damage from an attack is highly delayed + // 4J Stu - Change to the fix to only show damage when attacked, rather than collision damage + // Fix for #10299 - When in corners, passive mobs may show that they are taking damage. + // 4J Stu - Change to the fix for TU6, as source is never NULL due to changes in 1.8.2 to what source actually is + if (level->isClientSide && dynamic_cast(source) == NULL) return false; + noActionTime = 0; + if (getHealth() <= 0) return false; + + if ( source->isFire() && hasEffect(MobEffect::fireResistance) ) + { + // 4J-JEV, for new achievement Stayin'Frosty, TODO merge with Java version. + if ( this->instanceof(eTYPE_PLAYER) && (source == DamageSource::lava) ) // Only award when in lava (not any fire). + { + shared_ptr plr = dynamic_pointer_cast(shared_from_this()); + plr->awardStat(GenericStats::stayinFrosty(),GenericStats::param_stayinFrosty()); + } + return false; + } + + if ((source == DamageSource::anvil || source == DamageSource::fallingBlock) && getCarried(SLOT_HELM) != NULL) + { + getCarried(SLOT_HELM)->hurtAndBreak((int) (dmg * 4 + random->nextFloat() * dmg * 2.0f), dynamic_pointer_cast( shared_from_this() )); + dmg *= 0.75f; + } + + walkAnimSpeed = 1.5f; + + bool sound = true; + if (invulnerableTime > invulnerableDuration / 2.0f) + { + if (dmg <= lastHurt) return false; + if(!level->isClientSide) actuallyHurt(source, dmg - lastHurt); + lastHurt = dmg; + sound = false; + } + else + { + lastHurt = dmg; + lastHealth = getHealth(); + invulnerableTime = invulnerableDuration; + if (!level->isClientSide) actuallyHurt(source, dmg); + hurtTime = hurtDuration = 10; + } + + hurtDir = 0; + + shared_ptr sourceEntity = source->getEntity(); + if (sourceEntity != NULL) + { + if ( sourceEntity->instanceof(eTYPE_LIVINGENTITY) ) + { + setLastHurtByMob(dynamic_pointer_cast(sourceEntity)); + } + + if ( sourceEntity->instanceof(eTYPE_PLAYER) ) + { + lastHurtByPlayerTime = PLAYER_HURT_EXPERIENCE_TIME; + lastHurtByPlayer = dynamic_pointer_cast(sourceEntity); + } + else if ( sourceEntity->instanceof(eTYPE_WOLF) ) + { + shared_ptr w = dynamic_pointer_cast(sourceEntity); + if (w->isTame()) + { + lastHurtByPlayerTime = PLAYER_HURT_EXPERIENCE_TIME; + lastHurtByPlayer = nullptr; + } + } + } + + if (sound && level->isClientSide) + { + return false; + } + + if (sound) + { + level->broadcastEntityEvent(shared_from_this(), EntityEvent::HURT); + if (source != DamageSource::drown) markHurt(); + if (sourceEntity != NULL) + { + double xd = sourceEntity->x - x; + double zd = sourceEntity->z - z; + while (xd * xd + zd * zd < 0.0001) + { + xd = (Math::random() - Math::random()) * 0.01; + zd = (Math::random() - Math::random()) * 0.01; + } + hurtDir = (float) (atan2(zd, xd) * 180 / PI) - yRot; + knockback(sourceEntity, dmg, xd, zd); + } + else + { + hurtDir = (float) (int) ((Math::random() * 2) * 180); // 4J This cast is the same as Java + } + } + + MemSect(31); + if (getHealth() <= 0) + { + if (sound) playSound(getDeathSound(), getSoundVolume(), getVoicePitch()); + die(source); + } + else + { + if (sound) playSound(getHurtSound(), getSoundVolume(), getVoicePitch()); + } + MemSect(0); + + return true; +} + +void LivingEntity::breakItem(shared_ptr itemInstance) +{ + playSound(eSoundType_RANDOM_BREAK, 0.8f, 0.8f + level->random->nextFloat() * 0.4f); + + for (int i = 0; i < 5; i++) + { + Vec3 *d = Vec3::newTemp((random->nextFloat() - 0.5) * 0.1, Math::random() * 0.1 + 0.1, 0); + d->xRot(-xRot * PI / 180); + d->yRot(-yRot * PI / 180); + + Vec3 *p = Vec3::newTemp((random->nextFloat() - 0.5) * 0.3, -random->nextFloat() * 0.6 - 0.3, 0.6); + p->xRot(-xRot * PI / 180); + p->yRot(-yRot * PI / 180); + p = p->add(x, y + getHeadHeight(), z); + level->addParticle(PARTICLE_ICONCRACK(itemInstance->getItem()->id,0), p->x, p->y, p->z, d->x, d->y + 0.05, d->z); + } +} + +void LivingEntity::die(DamageSource *source) +{ + shared_ptr sourceEntity = source->getEntity(); + shared_ptr killer = getKillCredit(); + if (deathScore >= 0 && killer != NULL) killer->awardKillScore(shared_from_this(), deathScore); + + if (sourceEntity != NULL) sourceEntity->killed( dynamic_pointer_cast( shared_from_this() ) ); + + dead = true; + + if (!level->isClientSide) + { + int playerBonus = 0; + + shared_ptr player = nullptr; + if ( (sourceEntity != NULL) && sourceEntity->instanceof(eTYPE_PLAYER) ) + { + player = dynamic_pointer_cast(sourceEntity); + playerBonus = EnchantmentHelper::getKillingLootBonus(dynamic_pointer_cast(player)); + } + + if (!isBaby() && level->getGameRules()->getBoolean(GameRules::RULE_DOMOBLOOT)) + { + dropDeathLoot(lastHurtByPlayerTime > 0, playerBonus); + dropEquipment(lastHurtByPlayerTime > 0, playerBonus); + if (lastHurtByPlayerTime > 0) + { + int rareLoot = random->nextInt(200) - playerBonus; + if (rareLoot < 5) + { + dropRareDeathLoot((rareLoot <= 0) ? 1 : 0); + } + } + } + + // 4J-JEV, hook for Durango mobKill event. + if (player != NULL) + { + player->awardStat(GenericStats::killMob(),GenericStats::param_mobKill(player, dynamic_pointer_cast(shared_from_this()), source)); + } + } + + level->broadcastEntityEvent(shared_from_this(), EntityEvent::DEATH); +} + +void LivingEntity::dropEquipment(bool byPlayer, int playerBonusLevel) +{ +} + +void LivingEntity::knockback(shared_ptr source, float dmg, double xd, double zd) +{ + if (random->nextDouble() < getAttribute(SharedMonsterAttributes::KNOCKBACK_RESISTANCE)->getValue()) + { + return; + } + + hasImpulse = true; + float dd = Mth::sqrt(xd * xd + zd * zd); + float pow = 0.4f; + + this->xd /= 2; + yd /= 2; + this->zd /= 2; + + this->xd -= xd / dd * pow; + yd += pow; + this->zd -= zd / dd * pow; + + if (yd > 0.4f) yd = 0.4f; +} + +int LivingEntity::getHurtSound() +{ + return eSoundType_DAMAGE_HURT; +} + +int LivingEntity::getDeathSound() +{ + return eSoundType_DAMAGE_HURT; +} + +/** +* Drop extra rare loot. Only occurs roughly 5% of the time, rareRootLevel +* is set to 1 (otherwise 0) 1% of the time. +* +* @param rareLootLevel +*/ +void LivingEntity::dropRareDeathLoot(int rareLootLevel) +{ + +} + +void LivingEntity::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) +{ +} + +bool LivingEntity::onLadder() +{ + int xt = Mth::floor(x); + int yt = Mth::floor(bb->y0); + int zt = Mth::floor(z); + + // 4J-PB - TU9 - add climbable vines + int iTile = level->getTile(xt, yt, zt); + return (iTile== Tile::ladder_Id) || (iTile== Tile::vine_Id); +} + +bool LivingEntity::isShootable() +{ + return true; +} + +bool LivingEntity::isAlive() +{ + return !removed && getHealth() > 0; +} + +void LivingEntity::causeFallDamage(float distance) +{ + Entity::causeFallDamage(distance); + MobEffectInstance *jumpBoost = getEffect(MobEffect::jump); + float padding = jumpBoost != NULL ? jumpBoost->getAmplifier() + 1 : 0; + + int dmg = (int) ceil(distance - 3 - padding); + if (dmg > 0) + { + // 4J - new sounds here brought forward from 1.2.3 + if (dmg > 4) + { + playSound(eSoundType_DAMAGE_FALL_BIG, 1, 1); + } + else + { + playSound(eSoundType_DAMAGE_FALL_SMALL, 1, 1); + } + hurt(DamageSource::fall, dmg); + + int t = level->getTile( Mth::floor(x), Mth::floor(y - 0.2f - this->heightOffset), Mth::floor(z)); + if (t > 0) + { + const Tile::SoundType *soundType = Tile::tiles[t]->soundType; + MemSect(31); + playSound(soundType->getStepSound(), soundType->getVolume() * 0.5f, soundType->getPitch() * 0.75f); + MemSect(0); + } + } +} + +void LivingEntity::animateHurt() +{ + hurtTime = hurtDuration = 10; + hurtDir = 0; +} + +/** +* Fetches the mob's armor value, from 0 (no armor) to 20 (full armor) +* +* @return +*/ +int LivingEntity::getArmorValue() +{ + int val = 0; + ItemInstanceArray items = getEquipmentSlots(); + for (unsigned int i = 0; i < items.length; ++i) + { + shared_ptr item = items[i]; + if (item != NULL && dynamic_cast(item->getItem()) != NULL) + { + int baseProtection = ((ArmorItem *) item->getItem())->defense; + val += baseProtection; + } + } + return val; +} + +void LivingEntity::hurtArmor(float damage) +{ +} + +float LivingEntity::getDamageAfterArmorAbsorb(DamageSource *damageSource, float damage) +{ + if (!damageSource->isBypassArmor()) + { + int absorb = 25 - getArmorValue(); + float v = (damage) * absorb; + hurtArmor(damage); + damage = v / 25; + } + return damage; +} + +float LivingEntity::getDamageAfterMagicAbsorb(DamageSource *damageSource, float damage) +{ + // [EB]: Stupid hack :( + if ( this->instanceof(eTYPE_ZOMBIE) ) + { + damage = damage; + } + if (hasEffect(MobEffect::damageResistance) && damageSource != DamageSource::outOfWorld) + { + int absorbValue = (getEffect(MobEffect::damageResistance)->getAmplifier() + 1) * 5; + int absorb = 25 - absorbValue; + float v = (damage) * absorb; + damage = v / 25; + } + + if (damage <= 0) return 0; + + int enchantmentArmor = EnchantmentHelper::getDamageProtection(getEquipmentSlots(), damageSource); + if (enchantmentArmor > 20) + { + enchantmentArmor = 20; + } + if (enchantmentArmor > 0 && enchantmentArmor <= 20) + { + int absorb = 25 - enchantmentArmor; + float v = damage * absorb; + damage = v / 25; + } + + return damage; +} + +void LivingEntity::actuallyHurt(DamageSource *source, float dmg) +{ + if (isInvulnerable()) return; + dmg = getDamageAfterArmorAbsorb(source, dmg); + dmg = getDamageAfterMagicAbsorb(source, dmg); + + float originalDamage = dmg; + dmg = max(dmg - getAbsorptionAmount(), 0.0f); + setAbsorptionAmount(getAbsorptionAmount() - (originalDamage - dmg)); + if (dmg == 0) return; + + float oldHealth = getHealth(); + setHealth(oldHealth - dmg); + getCombatTracker()->recordDamage(source, oldHealth, dmg); + setAbsorptionAmount(getAbsorptionAmount() - dmg); +} + +CombatTracker *LivingEntity::getCombatTracker() +{ + return combatTracker; +} + +shared_ptr LivingEntity::getKillCredit() +{ + if (combatTracker->getKiller() != NULL) return combatTracker->getKiller(); + if (lastHurtByPlayer != NULL) return lastHurtByPlayer; + if (lastHurtByMob != NULL) return lastHurtByMob; + return nullptr; +} + +float LivingEntity::getMaxHealth() +{ + return (float) getAttribute(SharedMonsterAttributes::MAX_HEALTH)->getValue(); +} + +int LivingEntity::getArrowCount() +{ + return entityData->getByte(DATA_ARROW_COUNT_ID); +} + +void LivingEntity::setArrowCount(int count) +{ + entityData->set(DATA_ARROW_COUNT_ID, (byte) count); +} + +int LivingEntity::getCurrentSwingDuration() +{ + if (hasEffect(MobEffect::digSpeed)) + { + return SWING_DURATION - (1 + getEffect(MobEffect::digSpeed)->getAmplifier()) * 1; + } + if (hasEffect(MobEffect::digSlowdown)) + { + return SWING_DURATION + (1 + getEffect(MobEffect::digSlowdown)->getAmplifier()) * 2; + } + return SWING_DURATION; +} + +void LivingEntity::swing() +{ + if (!swinging || swingTime >= getCurrentSwingDuration() / 2 || swingTime < 0) + { + swingTime = -1; + swinging = true; + + if (dynamic_cast(level) != NULL) + { + ((ServerLevel *) level)->getTracker()->broadcast(shared_from_this(), shared_ptr( new AnimatePacket(shared_from_this(), AnimatePacket::SWING))); + } + } +} + +void LivingEntity::handleEntityEvent(byte id) +{ + if (id == EntityEvent::HURT) + { + walkAnimSpeed = 1.5f; + + invulnerableTime = invulnerableDuration; + hurtTime = hurtDuration = 10; + hurtDir = 0; + + MemSect(31); + // 4J-PB -added because villagers have no sounds + int iHurtSound=getHurtSound(); + if(iHurtSound!=-1) + { + playSound(iHurtSound, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + } + MemSect(0); + hurt(DamageSource::genericSource, 0); + } + else if (id == EntityEvent::DEATH) + { + MemSect(31); + // 4J-PB -added because villagers have no sounds + int iDeathSound=getDeathSound(); + if(iDeathSound!=-1) + { + playSound(iDeathSound, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + } + MemSect(0); + setHealth(0); + die(DamageSource::genericSource); + } + else + { + Entity::handleEntityEvent(id); + } +} + +void LivingEntity::outOfWorld() +{ + hurt(DamageSource::outOfWorld, 4); +} + +void LivingEntity::updateSwingTime() +{ + int currentSwingDuration = getCurrentSwingDuration(); + if (swinging) + { + swingTime++; + if (swingTime >= currentSwingDuration) + { + swingTime = 0; + swinging = false; + } + } + else + { + swingTime = 0; + } + + attackAnim = swingTime / (float) currentSwingDuration; +} + +AttributeInstance *LivingEntity::getAttribute(Attribute *attribute) +{ + return getAttributes()->getInstance(attribute); +} + +BaseAttributeMap *LivingEntity::getAttributes() +{ + if (attributes == NULL) + { + attributes = new ServersideAttributeMap(); + } + + return attributes; +} + +MobType LivingEntity::getMobType() +{ + return UNDEFINED; +} + +void LivingEntity::setSprinting(bool value) +{ + Entity::setSprinting(value); + + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + if (speed->getModifier(eModifierId_MOB_SPRINTING) != NULL) + { + speed->removeModifier(eModifierId_MOB_SPRINTING); + } + if (value) + { + speed->addModifier(new AttributeModifier(*SPEED_MODIFIER_SPRINTING)); + } +} + +float LivingEntity::getSoundVolume() +{ + return 1; +} + +float LivingEntity::getVoicePitch() +{ + if (isBaby()) + { + return (random->nextFloat() - random->nextFloat()) * 0.2f + 1.5f; + + } + return (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f; +} + +bool LivingEntity::isImmobile() +{ + return getHealth() <= 0; +} + +void LivingEntity::teleportTo(double x, double y, double z) +{ + moveTo(x, y, z, yRot, xRot); +} + +void LivingEntity::findStandUpPosition(shared_ptr vehicle) +{ + AABB *boundingBox; + double fallbackX = vehicle->x; + double fallbackY = vehicle->bb->y0 + vehicle->bbHeight; + double fallbackZ = vehicle->z; + + for (double xDiff = -1.5; xDiff < 2; xDiff += 1.5) + { + for (double zDiff = -1.5; zDiff < 2; zDiff += 1.5) + { + if (xDiff == 0 && zDiff == 0) + { + continue; + } + + int xToInt = (int) (x + xDiff); + int zToInt = (int) (z + zDiff); + boundingBox = bb->cloneMove(xDiff, 1, zDiff); + + if (level->getTileCubes(boundingBox, true)->empty()) + { + if (level->isTopSolidBlocking(xToInt, (int) y, zToInt)) + { + teleportTo(x + xDiff, y + 1, z + zDiff); + return; + } + else if (level->isTopSolidBlocking(xToInt, (int) y - 1, zToInt) || level->getMaterial(xToInt, (int) y - 1, zToInt) == Material::water) + { + fallbackX = x + xDiff; + fallbackY = y + 1; + fallbackZ = z + zDiff; + } + } + } + } + + teleportTo(fallbackX, fallbackY, fallbackZ); +} + +bool LivingEntity::shouldShowName() +{ + return false; +} + +Icon *LivingEntity::getItemInHandIcon(shared_ptr item, int layer) +{ + return item->getIcon(); +} + +void LivingEntity::jumpFromGround() +{ + yd = 0.42f; + if (hasEffect(MobEffect::jump)) + { + yd += (getEffect(MobEffect::jump)->getAmplifier() + 1) * .1f; + } + if (isSprinting()) + { + float rr = yRot * Mth::RAD_TO_GRAD; + + xd -= Mth::sin(rr) * 0.2f; + zd += Mth::cos(rr) * 0.2f; + } + this->hasImpulse = true; +} + +void LivingEntity::travel(float xa, float ya) +{ +#ifdef __PSVITA__ + // AP - dynamic_pointer_cast is a non-trivial call + Player *thisPlayer = NULL; + if( this->instanceof(eTYPE_PLAYER) ) + { + thisPlayer = (Player*) this; + } +#else + shared_ptr thisPlayer = dynamic_pointer_cast(shared_from_this()); +#endif + if (isInWater() && !(thisPlayer && thisPlayer->abilities.flying) ) + { + double yo = y; + moveRelative(xa, ya, useNewAi() ? 0.04f : 0.02f); + move(xd, yd, zd); + + xd *= 0.80f; + yd *= 0.80f; + zd *= 0.80f; + yd -= 0.02; + + if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) + { + yd = 0.3f; + } + } + else if (isInLava() && !(thisPlayer && thisPlayer->abilities.flying) ) + { + double yo = y; + moveRelative(xa, ya, 0.02f); + move(xd, yd, zd); + xd *= 0.50f; + yd *= 0.50f; + zd *= 0.50f; + yd -= 0.02; + + if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) + { + yd = 0.3f; + } + } + else + { + float friction = 0.91f; + if (onGround) + { + friction = 0.6f * 0.91f; + int t = level->getTile(Mth::floor(x), Mth::floor(bb->y0) - 1, Mth::floor(z)); + if (t > 0) + { + friction = Tile::tiles[t]->friction * 0.91f; + } + } + + float friction2 = (0.6f * 0.6f * 0.91f * 0.91f * 0.6f * 0.91f) / (friction * friction * friction); + + float speed; + if (onGround) + { + speed = getSpeed() * friction2; + } + else + { + speed = flyingSpeed; + } + + moveRelative(xa, ya, speed); + + friction = 0.91f; + if (onGround) + { + friction = 0.6f * 0.91f; + int t = level->getTile( Mth::floor(x), Mth::floor(bb->y0) - 1, Mth::floor(z)); + if (t > 0) + { + friction = Tile::tiles[t]->friction * 0.91f; + } + } + if (onLadder()) + { + float max = 0.15f; + if (xd < -max) xd = -max; + if (xd > max) xd = max; + if (zd < -max) zd = -max; + if (zd > max) zd = max; + fallDistance = 0; + if (yd < -0.15) yd = -0.15; + bool playerSneaking = isSneaking() && this->instanceof(eTYPE_PLAYER); + if (playerSneaking && yd < 0) yd = 0; + } + + move(xd, yd, zd); + + if (horizontalCollision && onLadder()) + { + yd = 0.2; + } + + if (!level->isClientSide || (level->hasChunkAt((int) x, 0, (int) z) && level->getChunkAt((int) x, (int) z)->loaded)) + { + yd -= 0.08; + } + else if (y > 0) + { + yd = -0.1; + } + else + { + yd = 0; + } + + yd *= 0.98f; + xd *= friction; + zd *= friction; + } + + walkAnimSpeedO = walkAnimSpeed; + double xxd = x - xo; + double zzd = z - zo; + float wst = Mth::sqrt(xxd * xxd + zzd * zzd) * 4; + if (wst > 1) wst = 1; + walkAnimSpeed += (wst - walkAnimSpeed) * 0.4f; + walkAnimPos += walkAnimSpeed; +} + +// 4J - added for more accurate lighting of mobs. Takes a weighted average of all tiles touched by the bounding volume of the entity - the method in the Entity class (which used to be used for +// mobs too) simply gets a single tile's lighting value causing sudden changes of lighting values when entities go in and out of lit areas, for example when bobbing in the water. +int LivingEntity::getLightColor(float a) +{ + float accum[2] = {0,0}; + float totVol = ( bb->x1 - bb->x0 ) * ( bb->y1 - bb->y0 ) * ( bb->z1 - bb->z0 ); + int xmin = Mth::floor(bb->x0); + int xmax = Mth::floor(bb->x1); + int ymin = Mth::floor(bb->y0); + int ymax = Mth::floor(bb->y1); + int zmin = Mth::floor(bb->z0); + int zmax = Mth::floor(bb->z1); + for( int xt = xmin; xt <= xmax; xt++ ) + for( int yt = ymin; yt <= ymax; yt++ ) + for( int zt = zmin; zt <= zmax; zt++ ) + { + float tilexmin = (float)xt; + float tilexmax = (float)(xt+1); + float tileymin = (float)yt; + float tileymax = (float)(yt+1); + float tilezmin = (float)zt; + float tilezmax = (float)(zt+1); + if( tilexmin < bb->x0 ) tilexmin = bb->x0; + if( tilexmax > bb->x1 ) tilexmax = bb->x1; + if( tileymin < bb->y0 ) tileymin = bb->y0; + if( tileymax > bb->y1 ) tileymax = bb->y1; + if( tilezmin < bb->z0 ) tilezmin = bb->z0; + if( tilezmax > bb->z1 ) tilezmax = bb->z1; + float tileVol = ( tilexmax - tilexmin ) * ( tileymax - tileymin ) * ( tilezmax - tilezmin ); + float frac = tileVol / totVol; + int lc = level->getLightColor(xt, yt, zt, 0); + accum[0] += frac * (float)( lc & 0xffff ); + accum[1] += frac * (float)( lc >> 16 ); + } + + if( accum[0] > 240.0f ) accum[0] = 240.0f; + if( accum[1] > 240.0f ) accum[1] = 240.0f; + + return ( ( (int)accum[1])<<16) | ((int)accum[0]); +} + +bool LivingEntity::useNewAi() +{ + return false; +} + +float LivingEntity::getSpeed() +{ + if (useNewAi()) + { + return speed; + } + else + { + return 0.1f; + } +} + +void LivingEntity::setSpeed(float speed) +{ + this->speed = speed; +} + +bool LivingEntity::doHurtTarget(shared_ptr target) +{ + setLastHurtMob(target); + return false; +} + +bool LivingEntity::isSleeping() +{ + return false; +} + +void LivingEntity::tick() +{ + Entity::tick(); + + if (!level->isClientSide) + { + int arrowCount = getArrowCount(); + if (arrowCount > 0) + { + if (removeArrowTime <= 0) + { + removeArrowTime = SharedConstants::TICKS_PER_SECOND * (30 - arrowCount); + } + removeArrowTime--; + if (removeArrowTime <= 0) + { + setArrowCount(arrowCount - 1); + } + } + + for (int i = 0; i < 5; i++) + { + shared_ptr previous = lastEquipment[i]; + shared_ptr current = getCarried(i); + + if (!ItemInstance::matches(current, previous)) + { + ((ServerLevel *) level)->getTracker()->broadcast(shared_from_this(), shared_ptr( new SetEquippedItemPacket(entityId, i, current))); + if (previous != NULL) attributes->removeItemModifiers(previous); + if (current != NULL) attributes->addItemModifiers(current); + lastEquipment[i] = current == NULL ? nullptr : current->copy(); + } + } + } + + aiStep(); + + double xd = x - xo; + double zd = z - zo; + + float sideDist = xd * xd + zd * zd; + + float yBodyRotT = yBodyRot; + + float walkSpeed = 0; + oRun = run; + float tRun = 0; + if (sideDist > 0.05f * 0.05f) + { + tRun = 1; + walkSpeed = sqrt(sideDist) * 3; + yBodyRotT = ((float) atan2(zd, xd) * 180 / (float) PI - 90); + } + if (attackAnim > 0) + { + yBodyRotT = yRot; + } + if (!onGround) + { + tRun = 0; + } + run = run + (tRun - run) * 0.3f; + + walkSpeed = tickHeadTurn(yBodyRotT, walkSpeed); + + while (yRot - yRotO < -180) + yRotO -= 360; + while (yRot - yRotO >= 180) + yRotO += 360; + + while (yBodyRot - yBodyRotO < -180) + yBodyRotO -= 360; + while (yBodyRot - yBodyRotO >= 180) + yBodyRotO += 360; + + while (xRot - xRotO < -180) + xRotO -= 360; + while (xRot - xRotO >= 180) + xRotO += 360; + + while (yHeadRot - yHeadRotO < -180) + yHeadRotO -= 360; + while (yHeadRot - yHeadRotO >= 180) + yHeadRotO += 360; + + animStep += walkSpeed; +} + +float LivingEntity::tickHeadTurn(float yBodyRotT, float walkSpeed) +{ + float yBodyRotD = Mth::wrapDegrees(yBodyRotT - yBodyRot); + yBodyRot += yBodyRotD * 0.3f; + + float headDiff = Mth::wrapDegrees(yRot - yBodyRot); + bool behind = headDiff < -90 || headDiff >= 90; + if (headDiff < -75) headDiff = -75; + if (headDiff >= 75) headDiff = +75; + yBodyRot = yRot - headDiff; + if (headDiff * headDiff > 50 * 50) + { + yBodyRot += headDiff * 0.2f; + } + + if (behind) + { + walkSpeed *= -1; + } + + return walkSpeed; +} + +void LivingEntity::aiStep() +{ + if (noJumpDelay > 0) noJumpDelay--; + if (lSteps > 0) + { + double xt = x + (lx - x) / lSteps; + double yt = y + (ly - y) / lSteps; + double zt = z + (lz - z) / lSteps; + + double yrd = Mth::wrapDegrees(lyr - yRot); + double xrd = Mth::wrapDegrees(lxr - xRot); + + yRot += (float) ( (yrd) / lSteps ); + xRot += (float) ( (xrd) / lSteps ); + + lSteps--; + setPos(xt, yt, zt); + setRot(yRot, xRot); + + // 4J - this collision is carried out to try and stop the lerping push the mob through the floor, + // in which case gravity can then carry on moving the mob because the collision just won't work anymore. + // BB for collision used to be calculated as: bb->shrink(1 / 32.0, 0, 1 / 32.0) + // now using a reduced BB to try and get rid of some issues where mobs pop up the sides of walls, undersides of + // trees etc. + AABB *shrinkbb = bb->shrink(0.1, 0, 0.1); + shrinkbb->y1 = shrinkbb->y0 + 0.1; + AABBList *collisions = level->getCubes(shared_from_this(), shrinkbb); + if (collisions->size() > 0) + { + double yTop = 0; + AUTO_VAR(itEnd, collisions->end()); + for (AUTO_VAR(it, collisions->begin()); it != itEnd; it++) + { + AABB *ab = *it; //collisions->at(i); + if (ab->y1 > yTop) yTop = ab->y1; + } + + yt += yTop - bb->y0; + setPos(xt, yt, zt); + } + } + else if (!isEffectiveAi()) + { + // slow down predicted speed, to prevent mobs from sliding through + // walls etc + xd *= .98; + yd *= .98; + zd *= .98; + } + + if (abs(xd) < MIN_MOVEMENT_DISTANCE) xd = 0; + if (abs(yd) < MIN_MOVEMENT_DISTANCE) yd = 0; + if (abs(zd) < MIN_MOVEMENT_DISTANCE) zd = 0; + + if (isImmobile()) + { + jumping = false; + xxa = 0; + yya = 0; + yRotA = 0; + } + else + { + MemSect(25); + if (isEffectiveAi()) + { + if (useNewAi()) + { + newServerAiStep(); + } + else + { + serverAiStep(); + yHeadRot = yRot; + } + } + MemSect(0); + } + + if (jumping) + { + if (isInWater() || isInLava() ) + { + yd += 0.04f; + } + else if (onGround) + { + if (noJumpDelay == 0) + { + jumpFromGround(); + noJumpDelay = 10; + } + } + } + else + { + noJumpDelay = 0; + } + + + xxa *= 0.98f; + yya *= 0.98f; + yRotA *= 0.9f; + + travel(xxa, yya); + + if(!level->isClientSide) + { + pushEntities(); + } +} + +void LivingEntity::newServerAiStep() +{ +} + +void LivingEntity::pushEntities() +{ + + vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); + if (entities != NULL && !entities->empty()) + { + AUTO_VAR(itEnd, entities->end()); + for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) + { + shared_ptr e = *it; //entities->at(i); + if (e->isPushable()) e->push(shared_from_this()); + } + } +} + +void LivingEntity::doPush(shared_ptr e) +{ + e->push(shared_from_this()); +} + +void LivingEntity::rideTick() +{ + Entity::rideTick(); + oRun = run; + run = 0; + fallDistance = 0; +} + +void LivingEntity::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) +{ + heightOffset = 0; + lx = x; + ly = y; + lz = z; + lyr = yRot; + lxr = xRot; + + lSteps = steps; +} + +void LivingEntity::serverAiMobStep() +{ +} + +void LivingEntity::serverAiStep() +{ + noActionTime++; +} + +void LivingEntity::setJumping(bool jump) +{ + jumping = jump; +} + +void LivingEntity::take(shared_ptr e, int orgCount) +{ + if (!e->removed && !level->isClientSide) + { + EntityTracker *entityTracker = ((ServerLevel *) level)->getTracker(); + if ( e->instanceof(eTYPE_ITEMENTITY) ) + { + entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId))); + } + else if ( e->instanceof(eTYPE_ARROW) ) + { + entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId))); + } + else if ( e->instanceof(eTYPE_EXPERIENCEORB) ) + { + entityTracker->broadcast(e, shared_ptr( new TakeItemEntityPacket(e->entityId, entityId))); + } + } +} + +bool LivingEntity::canSee(shared_ptr target) +{ + HitResult *hres = level->clip(Vec3::newTemp(x, y + getHeadHeight(), z), Vec3::newTemp(target->x, target->y + target->getHeadHeight(), target->z)); + bool retVal = (hres == NULL); + delete hres; + return retVal; +} + +Vec3 *LivingEntity::getLookAngle() +{ + return getViewVector(1); +} + +Vec3 *LivingEntity::getViewVector(float a) +{ + if (a == 1) + { + float yCos = Mth::cos(-yRot * Mth::RAD_TO_GRAD - PI); + float ySin = Mth::sin(-yRot * Mth::RAD_TO_GRAD - PI); + float xCos = -Mth::cos(-xRot * Mth::RAD_TO_GRAD); + float xSin = Mth::sin(-xRot * Mth::RAD_TO_GRAD); + + return Vec3::newTemp(ySin * xCos, xSin, yCos * xCos); + } + float xRot = xRotO + (this->xRot - xRotO) * a; + float yRot = yRotO + (this->yRot - yRotO) * a; + + float yCos = Mth::cos(-yRot * Mth::RAD_TO_GRAD - PI); + float ySin = Mth::sin(-yRot * Mth::RAD_TO_GRAD - PI); + float xCos = -Mth::cos(-xRot * Mth::RAD_TO_GRAD); + float xSin = Mth::sin(-xRot * Mth::RAD_TO_GRAD); + + return Vec3::newTemp(ySin * xCos, xSin, yCos * xCos); +} + +float LivingEntity::getAttackAnim(float a) +{ + float diff = attackAnim - oAttackAnim; + if (diff < 0) diff += 1; + return oAttackAnim + diff * a; +} + +Vec3 *LivingEntity::getPos(float a) +{ + if (a == 1) + { + return Vec3::newTemp(x, y, z); + } + double x = xo + (this->x - xo) * a; + double y = yo + (this->y - yo) * a; + double z = zo + (this->z - zo) * a; + + return Vec3::newTemp(x, y, z); +} + +HitResult *LivingEntity::pick(double range, float a) +{ + Vec3 *from = getPos(a); + Vec3 *b = getViewVector(a); + Vec3 *to = from->add(b->x * range, b->y * range, b->z * range); + return level->clip(from, to); +} + +bool LivingEntity::isEffectiveAi() +{ + return !level->isClientSide; +} + +bool LivingEntity::isPickable() +{ + return !removed; +} + +bool LivingEntity::isPushable() +{ + return !removed; +} + +float LivingEntity::getHeadHeight() +{ + return bbHeight * 0.85f; +} + +void LivingEntity::markHurt() +{ + hurtMarked = random->nextDouble() >= getAttribute(SharedMonsterAttributes::KNOCKBACK_RESISTANCE)->getValue(); +} + +float LivingEntity::getYHeadRot() +{ + return yHeadRot; +} + +void LivingEntity::setYHeadRot(float yHeadRot) +{ + this->yHeadRot = yHeadRot; +} + +float LivingEntity::getAbsorptionAmount() +{ + return absorptionAmount; +} + +void LivingEntity::setAbsorptionAmount(float absorptionAmount) +{ + if (absorptionAmount < 0) absorptionAmount = 0; + this->absorptionAmount = absorptionAmount; +} + +Team *LivingEntity::getTeam() +{ + return NULL; +} + +bool LivingEntity::isAlliedTo(shared_ptr other) +{ + return isAlliedTo(other->getTeam()); +} + +bool LivingEntity::isAlliedTo(Team *other) +{ + if (getTeam() != NULL) + { + return getTeam()->isAlliedTo(other); + } + return false; +} \ No newline at end of file diff --git a/Minecraft.World/LivingEntity.h b/Minecraft.World/LivingEntity.h new file mode 100644 index 00000000..5869eeb2 --- /dev/null +++ b/Minecraft.World/LivingEntity.h @@ -0,0 +1,323 @@ +#pragma once +using namespace std; + +#include "Entity.h" +#include "MobType.h" +#include "GoalSelector.h" +#include "SharedConstants.h" + +class CombatTracker; +class AttributeInstance; +class AttributeModifier; +class MobEffectInstance; +class BaseAttributeMap; +class Team; +class Attribute; +class MobEffect; +class HitResult; +class Vec3; + +class LivingEntity : public Entity +{ + friend class MobSpawner; +protected: + // 4J - added for common ctor code + void _init(); +public: + // 4J-PB - added to replace (e instanceof Type), avoiding dynamic casts + eINSTANCEOF GetType() { return eTYPE_LIVINGENTITY;} + static Entity *create(Level *level) { return NULL; } + +private: + static AttributeModifier *SPEED_MODIFIER_SPRINTING; + +public: + static const int SLOT_WEAPON = 0; + static const int SLOT_BOOTS = 1; + static const int SLOT_LEGGINGS = 2; + static const int SLOT_CHEST = 3; + static const int SLOT_HELM = 4; + + static const int SWING_DURATION = 6; + static const int PLAYER_HURT_EXPERIENCE_TIME = SharedConstants::TICKS_PER_SECOND * 5; + +private: + static const double MIN_MOVEMENT_DISTANCE; + +public: + static const int DATA_HEALTH_ID = 6; + static const int DATA_EFFECT_COLOR_ID = 7; + static const int DATA_EFFECT_AMBIENCE_ID = 8; + static const int DATA_ARROW_COUNT_ID = 9; + +private: + BaseAttributeMap *attributes; + CombatTracker *combatTracker; + unordered_map activeEffects; + ItemInstanceArray lastEquipment; + +public: + bool swinging; + int swingTime; + int removeArrowTime; + float lastHealth; + + int hurtTime; + int hurtDuration; + float hurtDir; + int deathTime; + int attackTime; + float oAttackAnim, attackAnim; + + float walkAnimSpeedO; + float walkAnimSpeed; + float walkAnimPos; + int invulnerableDuration; + float oTilt, tilt; + float timeOffs; + float rotA; + float yBodyRot, yBodyRotO; + float yHeadRot, yHeadRotO; + float flyingSpeed; + +protected: + shared_ptr lastHurtByPlayer; + int lastHurtByPlayerTime; + bool dead; + int noActionTime; + float oRun, run; + float animStep, animStepO; + float rotOffs; + int deathScore; + float lastHurt; + bool jumping; + +public: + float xxa; + float yya; + +protected: + float yRotA; + int lSteps; + double lx, ly, lz, lyr, lxr; + +private: + bool effectsDirty; + + shared_ptr lastHurtByMob; + int lastHurtByMobTimestamp; + shared_ptr lastHurtMob; + int lastHurtMobTimestamp; + + float speed; + +protected: + int noJumpDelay; + +private: + float absorptionAmount; + +public: + LivingEntity(Level* level); + virtual ~LivingEntity(); + +protected: + virtual void defineSynchedData(); + virtual void registerAttributes(); + virtual void checkFallDamage(double ya, bool onGround); + +public: + virtual bool isWaterMob(); + virtual void baseTick(); + virtual bool isBaby(); + +protected: + virtual void tickDeath(); + virtual int decreaseAirSupply(int currentSupply); + virtual int getExperienceReward(shared_ptr killedBy); + virtual bool isAlwaysExperienceDropper(); + +public: + virtual Random *getRandom(); + virtual shared_ptr getLastHurtByMob(); + virtual int getLastHurtByMobTimestamp(); + virtual void setLastHurtByMob(shared_ptr hurtBy); + virtual shared_ptr getLastHurtMob(); + virtual int getLastHurtMobTimestamp(); + virtual void setLastHurtMob(shared_ptr target); + virtual int getNoActionTime(); + virtual void addAdditonalSaveData(CompoundTag *entityTag); + virtual void readAdditionalSaveData(CompoundTag *tag); + +protected: + virtual void tickEffects(); + +public: + virtual void removeAllEffects(); + virtual vector *getActiveEffects(); + virtual bool hasEffect(int id); + virtual bool hasEffect(MobEffect *effect); + virtual MobEffectInstance *getEffect(MobEffect *effect); + virtual void addEffect(MobEffectInstance *newEffect); + virtual void addEffectNoUpdate(MobEffectInstance *newEffect); // 4J added + virtual bool canBeAffected(MobEffectInstance *newEffect); + virtual bool isInvertedHealAndHarm(); + virtual void removeEffectNoUpdate(int effectId); + virtual void removeEffect(int effectId); + +protected: + virtual void onEffectAdded(MobEffectInstance *effect); + virtual void onEffectUpdated(MobEffectInstance *effect, bool doRefreshAttributes); + virtual void onEffectRemoved(MobEffectInstance *effect); + +public: + virtual void heal(float heal); + virtual float getHealth(); + virtual void setHealth(float health); + virtual bool hurt(DamageSource *source, float dmg); + virtual void breakItem(shared_ptr itemInstance); + virtual void die(DamageSource *source); + +protected: + virtual void dropEquipment(bool byPlayer, int playerBonusLevel); + +public: + virtual void knockback(shared_ptr source, float dmg, double xd, double zd); + +protected: + virtual int getHurtSound(); + virtual int getDeathSound(); + +protected: + virtual void dropRareDeathLoot(int rareLootLevel); + virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); + +public: + virtual bool onLadder(); + virtual bool isShootable(); + virtual bool isAlive(); + virtual void causeFallDamage(float distance); + virtual void animateHurt(); + virtual int getArmorValue(); + +protected: + virtual void hurtArmor(float damage); + virtual float getDamageAfterArmorAbsorb(DamageSource *damageSource, float damage); + virtual float getDamageAfterMagicAbsorb(DamageSource *damageSource, float damage); + virtual void actuallyHurt(DamageSource *source, float dmg); + +public: + virtual CombatTracker *getCombatTracker(); + virtual shared_ptr getKillCredit(); + virtual float getMaxHealth(); + virtual int getArrowCount(); + virtual void setArrowCount(int count); + +private: + int getCurrentSwingDuration(); + +public: + virtual void swing(); + virtual void handleEntityEvent(byte id); + +protected: + virtual void outOfWorld(); + virtual void updateSwingTime(); + +public: + virtual AttributeInstance *getAttribute(Attribute *attribute); + virtual BaseAttributeMap *getAttributes(); + virtual MobType getMobType(); + + virtual shared_ptr getCarriedItem() = 0; + virtual shared_ptr getCarried(int slot) = 0; + virtual shared_ptr getArmor(int pos) = 0; + virtual void setEquippedSlot(int slot, shared_ptr item) = 0; + virtual void setSprinting(bool value); + + virtual ItemInstanceArray getEquipmentSlots() = 0; + + virtual Icon *getItemInHandIcon(shared_ptr item, int layer); + +protected: + virtual float getSoundVolume(); + virtual float getVoicePitch(); + virtual bool isImmobile(); + +public: + virtual void teleportTo(double x, double y, double z); + +protected: + virtual void findStandUpPosition(shared_ptr vehicle); + +public: + virtual bool shouldShowName(); + +protected: + virtual void jumpFromGround(); + +public: + virtual void travel(float xa, float ya); + + virtual int getLightColor(float a); // 4J - added + +protected: + virtual bool useNewAi(); + +public: + virtual float getSpeed(); + virtual void setSpeed(float speed); + virtual bool doHurtTarget(shared_ptr target); + virtual bool isSleeping(); + virtual void tick(); + +protected: + virtual float tickHeadTurn(float yBodyRotT, float walkSpeed); + +public: + virtual void aiStep(); + +protected: + virtual void newServerAiStep(); + virtual void pushEntities(); + virtual void doPush(shared_ptr e); + +public: + virtual void rideTick(); + virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); + +protected: + virtual void serverAiMobStep(); + virtual void serverAiStep(); + +public: + virtual void setJumping(bool jump); + virtual void take(shared_ptr e, int orgCount); + virtual bool canSee(shared_ptr target); + + +public: + virtual Vec3 *getLookAngle(); + virtual Vec3 *getViewVector(float a); + virtual float getAttackAnim(float a); + virtual Vec3 *getPos(float a); + virtual HitResult *pick(double range, float a); + virtual bool isEffectiveAi(); + + virtual bool isPickable(); + virtual bool isPushable(); + virtual float getHeadHeight(); + +protected: + virtual void markHurt(); + +public: + virtual float getYHeadRot(); + virtual void setYHeadRot(float yHeadRot); + + virtual float getAbsorptionAmount(); + virtual void setAbsorptionAmount(float absorptionAmount); + virtual Team *getTeam(); + virtual bool isAlliedTo(shared_ptr other); + virtual bool isAlliedTo(Team *other); +}; diff --git a/Minecraft.World/LocatableSource.h b/Minecraft.World/LocatableSource.h new file mode 100644 index 00000000..980a3e4b --- /dev/null +++ b/Minecraft.World/LocatableSource.h @@ -0,0 +1,8 @@ +#pragma once + +#include "Source.h" +#include "Location.h" + +class LocatableSource : public Source, public Location +{ +}; \ No newline at end of file diff --git a/Minecraft.World/Location.h b/Minecraft.World/Location.h new file mode 100644 index 00000000..d00bca7a --- /dev/null +++ b/Minecraft.World/Location.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Position.h" + +class Level; + +class Location : public Position +{ +public: + virtual Level *getWorld() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/LockedChestTile.cpp b/Minecraft.World/LockedChestTile.cpp index 774fb929..8873820e 100644 --- a/Minecraft.World/LockedChestTile.cpp +++ b/Minecraft.World/LockedChestTile.cpp @@ -13,7 +13,7 @@ bool LockedChestTile::mayPlace(Level *level, int x, int y, int z) void LockedChestTile::tick(Level *level, int x, int y, int z, Random *random) { - level->setTile(x,y,z,0); + level->removeTile(x, y, z); } void LockedChestTile::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/LongTag.h b/Minecraft.World/LongTag.h index 2dcd3819..8cfae41d 100644 --- a/Minecraft.World/LongTag.h +++ b/Minecraft.World/LongTag.h @@ -9,7 +9,7 @@ public: LongTag(const wstring &name, __int64 data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeLong(data); } - void load(DataInput *dis) { data = dis->readLong(); } + void load(DataInput *dis, int tagDepth) { data = dis->readLong(); } byte getId() { return TAG_Long; } wstring toString() diff --git a/Minecraft.World/LookAtPlayerGoal.cpp b/Minecraft.World/LookAtPlayerGoal.cpp index f2dc10c3..dcf1ea4f 100644 --- a/Minecraft.World/LookAtPlayerGoal.cpp +++ b/Minecraft.World/LookAtPlayerGoal.cpp @@ -9,7 +9,7 @@ LookAtPlayerGoal::LookAtPlayerGoal(Mob *mob, const type_info& lookAtType, float { this->mob = mob; this->lookDistance = lookDistance; - this->probability = 0.02f; + probability = 0.02f; setRequiredControlFlags(Control::LookControlFlag); lookTime = 0; @@ -28,8 +28,19 @@ LookAtPlayerGoal::LookAtPlayerGoal(Mob *mob, const type_info& lookAtType, float bool LookAtPlayerGoal::canUse() { if (mob->getRandom()->nextFloat() >= probability) return false; - if (lookAtType == typeid(Player)) lookAt = mob->level->getNearestPlayer(mob->shared_from_this(), lookDistance); - else lookAt = weak_ptr(mob->level->getClosestEntityOfClass(lookAtType, mob->bb->grow(lookDistance, 3, lookDistance), mob->shared_from_this())); + + if (mob->getTarget() != NULL) + { + lookAt = mob->getTarget(); + } + if (lookAtType == typeid(Player)) + { + lookAt = mob->level->getNearestPlayer(mob->shared_from_this(), lookDistance); + } + else + { + lookAt = weak_ptr(mob->level->getClosestEntityOfClass(lookAtType, mob->bb->grow(lookDistance, 3, lookDistance), mob->shared_from_this())); + } return lookAt.lock() != NULL; } diff --git a/Minecraft.World/LookControl.cpp b/Minecraft.World/LookControl.cpp index 829c3e4a..1e0d5258 100644 --- a/Minecraft.World/LookControl.cpp +++ b/Minecraft.World/LookControl.cpp @@ -15,11 +15,10 @@ LookControl::LookControl(Mob *mob) void LookControl::setLookAt(shared_ptr target, float yMax, float xMax) { - this->wantedX = target->x; - shared_ptr targetMob = dynamic_pointer_cast(target); - if (targetMob != NULL) this->wantedY = target->y + targetMob->getHeadHeight(); - else this->wantedY = (target->bb->y0 + target->bb->y1) / 2; - this->wantedZ = target->z; + wantedX = target->x; + if ( target->instanceof(eTYPE_LIVINGENTITY) ) wantedY = target->y + dynamic_pointer_cast(target)->getHeadHeight(); + else wantedY = (target->bb->y0 + target->bb->y1) / 2; + wantedZ = target->z; this->yMax = yMax; this->xMax = xMax; hasWanted = true; @@ -27,9 +26,9 @@ void LookControl::setLookAt(shared_ptr target, float yMax, float xMax) void LookControl::setLookAt(double x, double y, double z, float yMax, float xMax) { - this->wantedX = x; - this->wantedY = y; - this->wantedZ = z; + wantedX = x; + wantedY = y; + wantedZ = z; this->yMax = yMax; this->xMax = xMax; hasWanted = true; diff --git a/Minecraft.World/MakeLoveGoal.cpp b/Minecraft.World/MakeLoveGoal.cpp index 89f09f1d..c399d632 100644 --- a/Minecraft.World/MakeLoveGoal.cpp +++ b/Minecraft.World/MakeLoveGoal.cpp @@ -78,6 +78,11 @@ bool MakeLoveGoal::villageNeedsMoreVillagers() shared_ptr _village = village.lock(); if( _village == NULL ) return false; + if (!_village->isBreedTimerOk()) + { + return false; + } + int idealSize = (int) ((float) _village->getDoorCount() * 0.35); // System.out.println("idealSize: " + idealSize + " pop: " + // village.getPopulationSize()); @@ -93,9 +98,8 @@ void MakeLoveGoal::breed() // 4J - added limit to number of animals that can be bred if(level->canCreateMore( eTYPE_VILLAGER, Level::eSpawnType_Breed) ) { - shared_ptr child = shared_ptr( new Villager(level) ); + shared_ptr child = dynamic_pointer_cast( villager->getBreedOffspring(partner.lock()) ); child->setAge(-20 * 60 * 20); - child->setProfession(villager->getRandom()->nextInt(Villager::PROFESSION_MAX)); child->moveTo(villager->x, villager->y, villager->z, 0, 0); level->addEntity(child); level->broadcastEntityEvent(child, EntityEvent::LOVE_HEARTS); diff --git a/Minecraft.World/MapCloningRecipe.h b/Minecraft.World/MapCloningRecipe.h new file mode 100644 index 00000000..272f9b86 --- /dev/null +++ b/Minecraft.World/MapCloningRecipe.h @@ -0,0 +1,63 @@ +#pragma once + +/* +class MapCloningRecipe implements Recipy { + @Override + public boolean matches(CraftingContainer craftSlots, Level level) { + int count = 0; + ItemInstance source = null; + + for (int slot = 0; slot < craftSlots.getContainerSize(); slot++) { + ItemInstance item = craftSlots.getItem(slot); + if (item == null) continue; + + if (item.id == Item.map.id) { + if (source != null) return false; + source = item; + } else if (item.id == Item.emptyMap.id) { + count++; + } else { + return false; + } + } + + return source != null && count > 0; + } + + @Override + public ItemInstance assemble(CraftingContainer craftSlots) { + int count = 0; + ItemInstance source = null; + + for (int slot = 0; slot < craftSlots.getContainerSize(); slot++) { + ItemInstance item = craftSlots.getItem(slot); + if (item == null) continue; + + if (item.id == Item.map.id) { + if (source != null) return null; + source = item; + } else if (item.id == Item.emptyMap.id) { + count++; + } else { + return null; + } + } + + if (source == null || count < 1) return null; + + ItemInstance result = new ItemInstance(Item.map, count + 1, source.getAuxValue()); + if (source.hasCustomHoverName()) result.setHoverName(source.getHoverName()); + return result; + } + + @Override + public int size() { + return 9; + } + + @Override + public ItemInstance getResultItem() { + return null; + } +}; +*/ \ No newline at end of file diff --git a/Minecraft.World/MapExtendingRecipe.h b/Minecraft.World/MapExtendingRecipe.h new file mode 100644 index 00000000..40f94937 --- /dev/null +++ b/Minecraft.World/MapExtendingRecipe.h @@ -0,0 +1,46 @@ +#pragma once +/* +class MapExtendingRecipe extends ShapedRecipy { + public MapExtendingRecipe() { + super(3, 3, new ItemInstance[] { + new ItemInstance(Item.paper), new ItemInstance(Item.paper), new ItemInstance(Item.paper), + new ItemInstance(Item.paper), new ItemInstance(Item.map, 0, Recipes.ANY_AUX_VALUE), new ItemInstance(Item.paper), + new ItemInstance(Item.paper), new ItemInstance(Item.paper), new ItemInstance(Item.paper), + }, new ItemInstance(Item.emptyMap, 0, 0)); + } + + @Override + public boolean matches(CraftingContainer craftSlots, Level level) { + if (!super.matches(craftSlots, level)) return false; + ItemInstance map = null; + + for (int i = 0; i < craftSlots.getContainerSize() && map == null; i++) { + ItemInstance item = craftSlots.getItem(i); + if (item != null && item.id == Item.map.id) map = item; + } + + if (map == null) return false; + MapItemSavedData data = Item.map.getSavedData(map, level); + if (data == null) return false; + return data.scale < MapItemSavedData.MAX_SCALE; + } + + @Override + public ItemInstance assemble(CraftingContainer craftSlots) { + ItemInstance map = null; + + for (int i = 0; i < craftSlots.getContainerSize() && map == null; i++) { + ItemInstance item = craftSlots.getItem(i); + if (item != null && item.id == Item.map.id) map = item; + } + + map = map.copy(); + map.count = 1; + + if (map.getTag() == null) map.setTag(new CompoundTag()); + map.getTag().putBoolean("map_is_scaling", true); + + return map; + } +}; +*/ \ No newline at end of file diff --git a/Minecraft.World/MapItem.cpp b/Minecraft.World/MapItem.cpp index abf4fb9a..a5143257 100644 --- a/Minecraft.World/MapItem.cpp +++ b/Minecraft.World/MapItem.cpp @@ -16,7 +16,7 @@ MapItem::MapItem(int id) : ComplexItem(id) { - this->setMaxStackSize(1); + setStackedByData(true); } shared_ptr MapItem::getSavedData(short idNum, Level *level) @@ -86,7 +86,7 @@ shared_ptr MapItem::getSavedData(shared_ptr item void MapItem::update(Level *level, shared_ptr player, shared_ptr data) { - if (level->dimension->id != data->dimension) + if ( (level->dimension->id != data->dimension) || !player->instanceof(eTYPE_PLAYER) ) { // Wrong dimension, abort return; @@ -108,11 +108,12 @@ void MapItem::update(Level *level, shared_ptr player, shared_ptrstep++; + shared_ptr hp = data->getHoldingPlayer(dynamic_pointer_cast(player)); + hp->step++; for (int x = xp - rad + 1; x < xp + rad; x++) { - if ((x & 15) != (data->step & 15)) continue; + if ((x & 15) != (hp->step & 15)) continue; int yd0 = 255; int yd1 = 0; @@ -130,11 +131,6 @@ void MapItem::update(Level *level, shared_ptr player, shared_ptr player, shared_ptr> 20) & 1) == 0) count[Tile::dirt_Id] += 10; - else count[Tile::rock_Id] += 10; + else count[Tile::stone_Id] += 10; hh = 100; } else @@ -201,9 +197,6 @@ void MapItem::update(Level *level, shared_ptr player, shared_ptr itemInstance, Level *level, if (level->isClientSide) return; shared_ptr data = getSavedData(itemInstance, level); - if (dynamic_pointer_cast(owner) != NULL) + if ( owner->instanceof(eTYPE_PLAYER) ) { shared_ptr player = dynamic_pointer_cast(owner); @@ -298,6 +291,17 @@ void MapItem::inventoryTick(shared_ptr itemInstance, Level *level, } } +shared_ptr MapItem::getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player) +{ + charArray data = MapItem::getSavedData(itemInstance, level)->getUpdatePacket(itemInstance, level, player); + + if (data.data == NULL || data.length == 0) return nullptr; + + shared_ptr retval = shared_ptr(new ComplexItemDataPacket((short) Item::map->id, (short) itemInstance->getAuxValue(), data)); + delete data.data; + return retval; +} + void MapItem::onCraftedBy(shared_ptr itemInstance, Level *level, shared_ptr player) { wchar_t buf[64]; @@ -335,13 +339,18 @@ void MapItem::onCraftedBy(shared_ptr itemInstance, Level *level, s data->setDirty(); } -shared_ptr MapItem::getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player) -{ - charArray data = MapItem::getSavedData(itemInstance, level)->getUpdatePacket(itemInstance, level, player); - - if (data.data == NULL || data.length == 0) return nullptr; - - shared_ptr retval = shared_ptr(new ComplexItemDataPacket((short) Item::map->id, (short) itemInstance->getAuxValue(), data)); - delete data.data; - return retval; +// 4J - Don't want +/* +void appendHoverText(ItemInstance itemInstance, Player player, List lines, boolean advanced) { + MapItemSavedData data = getSavedData(itemInstance, player.level); + + if (advanced) { + if (data == null) { + lines.add("Unknown map"); + } else { + lines.add("Scaling at 1:" + (1 << data.scale)); + lines.add("(Level " + data.scale + "/" + MapItemSavedData.MAX_SCALE + ")"); + } + } } +*/ diff --git a/Minecraft.World/MapItem.h b/Minecraft.World/MapItem.h index dc16339d..e6b113b2 100644 --- a/Minecraft.World/MapItem.h +++ b/Minecraft.World/MapItem.h @@ -18,6 +18,6 @@ public: // 4J Stu - Was protected in Java, but then we can't access it where we shared_ptr getSavedData(shared_ptr itemInstance, Level *level); void update(Level *level, shared_ptr player, shared_ptr data); virtual void inventoryTick(shared_ptr itemInstance, Level *level, shared_ptr owner, int slot, bool selected); - virtual void onCraftedBy(shared_ptr itemInstance, Level *level, shared_ptr player); shared_ptr getUpdatePacket(shared_ptr itemInstance, Level *level, shared_ptr player); + virtual void onCraftedBy(shared_ptr itemInstance, Level *level, shared_ptr player); }; diff --git a/Minecraft.World/MapItemSavedData.cpp b/Minecraft.World/MapItemSavedData.cpp index d69a7f53..6304aa62 100644 --- a/Minecraft.World/MapItemSavedData.cpp +++ b/Minecraft.World/MapItemSavedData.cpp @@ -31,6 +31,8 @@ MapItemSavedData::HoldingPlayer::HoldingPlayer(shared_ptr player, const tick = 0; sendPosTick = 0; + step = 0; + hasSentInitial = false; // java ctor //this->player = player; @@ -50,6 +52,15 @@ MapItemSavedData::HoldingPlayer::~HoldingPlayer() charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(shared_ptr itemInstance) { + if (!hasSentInitial) + { + charArray data(2); + data[0] = HEADER_METADATA; + data[1] = parent->scale; + + hasSentInitial = true; + return data; + } if (--sendPosTick < 0) { sendPosTick = 4; @@ -128,8 +139,7 @@ charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(shared_ptr servPlayer = dynamic_pointer_cast(player); for (int d = 0; d < 10; d++) { - int column = (tick * 11) % (MapItem::IMAGE_WIDTH); - tick++; + int column = (tick++ * 11) % (MapItem::IMAGE_WIDTH); if (rowsDirtyMin[column] >= 0) { @@ -137,7 +147,7 @@ charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(shared_ptrgetInt(L"zCenter"); scale = tag->getByte(L"scale"); if (scale < 0) scale = 0; - if (scale > 4) scale = 4; + if (scale > MAX_SCALE) scale = MAX_SCALE; int width = tag->getShort(L"width"); int height = tag->getShort(L"height"); @@ -332,7 +341,7 @@ void MapItemSavedData::tickCarriedBy(shared_ptr player, shared_ptrgetFrame()->dir * 90) * 16 / 360); if (dimension < 0) { - int s = step / 10; + int s = (int) (playerLevel->getLevelData()->getDayTime() / 10); rot = (char) ((s * s * 34187121 + s * 121) >> 15 & 15); } #ifdef _LARGE_WORLDS @@ -412,7 +421,7 @@ void MapItemSavedData::tickCarriedBy(shared_ptr player, shared_ptryRot * 16 / 360 + 0.5); if (dimension < 0) { - int s = step / 10; + int s = (int) (playerLevel->getLevelData()->getDayTime() / 10); rot = (char) ((s * s * 34187121 + s * 121) >> 15 & 15); } @@ -494,7 +503,7 @@ void MapItemSavedData::setDirty(int x, int y0, int y1) void MapItemSavedData::handleComplexItemData(charArray &data) { - if (data[0] == 0) + if (data[0] == HEADER_COLOURS) { int xx = data[1] & 0xff; int yy = data[2] & 0xff; @@ -505,7 +514,7 @@ void MapItemSavedData::handleComplexItemData(charArray &data) setDirty(); } - else if (data[0] == 1) + else if (data[0] == HEADER_DECORATIONS) { for( unsigned int i = 0; i < decorations.size(); i++ ) { @@ -529,6 +538,29 @@ void MapItemSavedData::handleComplexItemData(charArray &data) decorations.push_back(new MapDecoration(img, x, y, rot, entityId, visible)); } } + else if (data[0] == HEADER_METADATA) + { + scale = data[1]; + } +} + +shared_ptr MapItemSavedData::getHoldingPlayer(shared_ptr player) +{ + shared_ptr hp = nullptr; + AUTO_VAR(it,carriedByPlayers.find(player)); + + if (it == carriedByPlayers.end()) + { + hp = shared_ptr( new HoldingPlayer(player, this) ); + carriedByPlayers[player] = hp; + carriedBy.push_back(hp); + } + else + { + hp = it->second; + } + + return hp; } // 4J Added diff --git a/Minecraft.World/MapItemSavedData.h b/Minecraft.World/MapItemSavedData.h index fcbe5e30..21322644 100644 --- a/Minecraft.World/MapItemSavedData.h +++ b/Minecraft.World/MapItemSavedData.h @@ -5,6 +5,11 @@ class MapItemSavedData : public SavedData { +private: + static const int HEADER_COLOURS = 0; + static const int HEADER_DECORATIONS = 1; + static const int HEADER_METADATA = 2; + public: static const int MAP_SIZE = 64; static const int MAX_SCALE = 4; @@ -37,6 +42,12 @@ public: int sendPosTick; charArray lastSentDecorations; + public: + int step; + + private: + bool hasSentInitial; + protected: const MapItemSavedData *parent; @@ -52,10 +63,10 @@ public: char dimension; byte scale; byteArray colors; - int step; vector > carriedBy; private: + typedef unordered_map , shared_ptr , PlayerKeyHash, PlayerKeyEq> playerHoldingPlayerMapType; playerHoldingPlayerMapType carriedByPlayers; @@ -82,6 +93,7 @@ public: using SavedData::setDirty; void setDirty(int x, int y0, int y1); void handleComplexItemData(charArray &data); + shared_ptr getHoldingPlayer(shared_ptr player); // 4J Stu Added void mergeInMapData(shared_ptr dataToAdd); diff --git a/Minecraft.World/McRegionChunkStorage.cpp b/Minecraft.World/McRegionChunkStorage.cpp index a11cb1c1..d02125a6 100644 --- a/Minecraft.World/McRegionChunkStorage.cpp +++ b/Minecraft.World/McRegionChunkStorage.cpp @@ -160,6 +160,13 @@ LevelChunk *McRegionChunkStorage::load(Level *level, int x, int z) #endif delete chunkData; } +#ifndef _CONTENT_PACKAGE + if(levelChunk && app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<reloadBiomes(); + } +#endif return levelChunk; } diff --git a/Minecraft.World/MegaTreeFeature.cpp b/Minecraft.World/MegaTreeFeature.cpp index 77e06e30..09195fb4 100644 --- a/Minecraft.World/MegaTreeFeature.cpp +++ b/Minecraft.World/MegaTreeFeature.cpp @@ -55,10 +55,10 @@ bool MegaTreeFeature::place(Level *level, Random *random, int x, int y, int z) int belowTile = level->getTile(x, y - 1, z); if ((belowTile != Tile::grass_Id && belowTile != Tile::dirt_Id) || y >= Level::maxBuildHeight - treeHeight - 1) return false; - level->setTileNoUpdate(x, y - 1, z, Tile::dirt_Id); - level->setTileNoUpdate(x + 1, y - 1, z, Tile::dirt_Id); - level->setTileNoUpdate(x, y - 1, z + 1, Tile::dirt_Id); - level->setTileNoUpdate(x + 1, y - 1, z + 1, Tile::dirt_Id); + level->setTileAndData(x, y - 1, z, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y - 1, z, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z + 1, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y - 1, z + 1, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); PIXBeginNamedEvent(0,"MegaTree placing leaves, %d, %d, %d", x, z, y+treeHeight); placeLeaves(level, x, z, y + treeHeight, 2, random); @@ -189,7 +189,7 @@ void MegaTreeFeature::placeLeaves(Level *level, int x, int z, int topPosition, i PIXBeginNamedEvent(0,"Getting tile"); int t = level->getTile(xx, yy, zz); PIXEndNamedEvent(); - if (!Tile::solid[t]) + if (t == 0 || t == Tile::leaves_Id) { PIXBeginNamedEvent(0,"Placing block"); placeBlock(level, xx, yy, zz, Tile::leaves_Id, leafType); diff --git a/Minecraft.World/MeleeAttackGoal.cpp b/Minecraft.World/MeleeAttackGoal.cpp index f3aa6455..7003609e 100644 --- a/Minecraft.World/MeleeAttackGoal.cpp +++ b/Minecraft.World/MeleeAttackGoal.cpp @@ -8,12 +8,12 @@ #include "net.minecraft.world.phys.h" #include "MeleeAttackGoal.h" -void MeleeAttackGoal::_init(Mob *mob, float speed, bool trackTarget) +void MeleeAttackGoal::_init(PathfinderMob *mob, double speedModifier, bool trackTarget) { this->attackType = eTYPE_NOTSET; this->mob = mob; - this->level = mob->level; - this->speed = speed; + level = mob->level; + this->speedModifier = speedModifier; this->trackTarget = trackTarget; setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); @@ -23,15 +23,15 @@ void MeleeAttackGoal::_init(Mob *mob, float speed, bool trackTarget) timeToRecalcPath = 0; } -MeleeAttackGoal::MeleeAttackGoal(Mob *mob, eINSTANCEOF attackType, float speed, bool trackTarget) +MeleeAttackGoal::MeleeAttackGoal(PathfinderMob *mob, eINSTANCEOF attackType, double speedModifier, bool trackTarget) { - _init(mob, speed, trackTarget); + _init(mob, speedModifier, trackTarget); this->attackType = attackType; } -MeleeAttackGoal::MeleeAttackGoal(Mob *mob, float speed, bool trackTarget) +MeleeAttackGoal::MeleeAttackGoal(PathfinderMob *mob, double speedModifier, bool trackTarget) { - _init(mob,speed,trackTarget); + _init(mob,speedModifier,trackTarget); } MeleeAttackGoal::~MeleeAttackGoal() @@ -41,56 +41,56 @@ MeleeAttackGoal::~MeleeAttackGoal() bool MeleeAttackGoal::canUse() { - shared_ptr bestTarget = mob->getTarget(); - if (bestTarget == NULL) return false; - if(!bestTarget->isAlive()) return false; - if (attackType != eTYPE_NOTSET && (attackType & bestTarget->GetType()) != attackType) return false; - target = weak_ptr(bestTarget); + shared_ptr target = mob->getTarget(); + if (target == NULL) return false; + if (!target->isAlive()) return false; + if (attackType != NULL && !target->instanceof(attackType)) return false; delete path; - path = mob->getNavigation()->createPath(target.lock()); + path = mob->getNavigation()->createPath(target); return path != NULL; } bool MeleeAttackGoal::canContinueToUse() { - shared_ptr bestTarget = mob->getTarget(); - if (bestTarget == NULL) return false; - if (target.lock() == NULL || !target.lock()->isAlive()) return false; + shared_ptr target = mob->getTarget(); + if (target == NULL) return false; + if (!target->isAlive()) return false; if (!trackTarget) return !mob->getNavigation()->isDone(); - if (!mob->isWithinRestriction(Mth::floor(target.lock()->x), Mth::floor(target.lock()->y), Mth::floor(target.lock()->z))) return false; + if (!mob->isWithinRestriction(Mth::floor(target->x), Mth::floor(target->y), Mth::floor(target->z))) return false; return true; } void MeleeAttackGoal::start() { - mob->getNavigation()->moveTo(path, speed); + mob->getNavigation()->moveTo(path, speedModifier); path = NULL; timeToRecalcPath = 0; } void MeleeAttackGoal::stop() { - target = weak_ptr(); mob->getNavigation()->stop(); } void MeleeAttackGoal::tick() { - mob->getLookControl()->setLookAt(target.lock(), 30, 30); - if (trackTarget || mob->getSensing()->canSee(target.lock())) + shared_ptr target = mob->getTarget(); + mob->getLookControl()->setLookAt(target, 30, 30); + if (trackTarget || mob->getSensing()->canSee(target)) { if (--timeToRecalcPath <= 0) { timeToRecalcPath = 4 + mob->getRandom()->nextInt(7); - mob->getNavigation()->moveTo(target.lock(), speed); + mob->getNavigation()->moveTo(target, speedModifier); } } attackTime = max(attackTime - 1, 0); - double meleeRadiusSqr = (mob->bbWidth * 2) * (mob->bbWidth * 2); - if (mob->distanceToSqr(target.lock()->x, target.lock()->bb->y0, target.lock()->z) > meleeRadiusSqr) return; + double meleeRadiusSqr = (mob->bbWidth * 2) * (mob->bbWidth * 2) + target->bbWidth; + if (mob->distanceToSqr(target->x, target->bb->y0, target->z) > meleeRadiusSqr) return; if (attackTime > 0) return; attackTime = 20; - mob->doHurtTarget(target.lock()); + if (mob->getCarriedItem() != NULL) mob->swing(); + mob->doHurtTarget(target); } diff --git a/Minecraft.World/MeleeAttackGoal.h b/Minecraft.World/MeleeAttackGoal.h index c8f5e19d..dd6b1958 100644 --- a/Minecraft.World/MeleeAttackGoal.h +++ b/Minecraft.World/MeleeAttackGoal.h @@ -3,28 +3,26 @@ #include "Goal.h" class Level; -class Mob; +class PathfinderMob; class Path; class MeleeAttackGoal : public Goal { private: Level *level; - Mob *mob; // Owner of this goal - weak_ptr target; - + PathfinderMob *mob; // Owner of this goal int attackTime; - float speed; + double speedModifier; bool trackTarget; Path *path; eINSTANCEOF attackType; int timeToRecalcPath; - void _init(Mob *mob, float speed, bool trackTarget); + void _init(PathfinderMob *mob, double speedModifier, bool trackTarget); public: - MeleeAttackGoal(Mob *mob, eINSTANCEOF attackType, float speed, bool trackTarget); - MeleeAttackGoal(Mob *mob, float speed, bool trackTarget); + MeleeAttackGoal(PathfinderMob *mob, eINSTANCEOF attackType, double speedModifier, bool trackTarget); + MeleeAttackGoal(PathfinderMob *mob, double speedModifier, bool trackTarget); ~MeleeAttackGoal(); virtual bool canUse(); diff --git a/Minecraft.World/MelonTile.cpp b/Minecraft.World/MelonTile.cpp index 881eadc2..298ae61f 100644 --- a/Minecraft.World/MelonTile.cpp +++ b/Minecraft.World/MelonTile.cpp @@ -4,9 +4,6 @@ #include "net.minecraft.world.h" #include "Facing.h" -const wstring MelonTile::TEX = L"melon_side"; -const wstring MelonTile::TEX_TOP = L"melon_top"; - MelonTile::MelonTile(int id) : Tile(id, Material::vegetable) { iconTop = NULL; @@ -40,6 +37,6 @@ int MelonTile::getResourceCountForLootBonus(int bonusLevel, Random *random) void MelonTile::registerIcons(IconRegister *iconRegister) { - icon = iconRegister->registerIcon(TEX); - iconTop = iconRegister->registerIcon(TEX_TOP); + icon = iconRegister->registerIcon(getIconName() + L"_side"); + iconTop = iconRegister->registerIcon(getIconName() + L"_top"); } \ No newline at end of file diff --git a/Minecraft.World/MelonTile.h b/Minecraft.World/MelonTile.h index 029cb1cb..1b3d1a35 100644 --- a/Minecraft.World/MelonTile.h +++ b/Minecraft.World/MelonTile.h @@ -6,19 +6,16 @@ class MelonTile : public Tile { friend class ChunkRebuildData; private: - static const wstring TEX; - static const wstring TEX_TOP; - Icon *iconTop; // 4J Stu - I don't know why this is protected in Java -//protected: + //protected: public: MelonTile(int id); public: virtual Icon *getTexture(int face, int data); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual int getResourceCount(Random *random); + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int getResourceCount(Random *random); virtual int getResourceCountForLootBonus(int bonusLevel, Random *random); void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/MenuBackup.cpp b/Minecraft.World/MenuBackup.cpp index 6d09f3e3..b6d3ba09 100644 --- a/Minecraft.World/MenuBackup.cpp +++ b/Minecraft.World/MenuBackup.cpp @@ -15,11 +15,11 @@ MenuBackup::MenuBackup(shared_ptr inventory, AbstractContainerMenu *m void MenuBackup::save(short changeUid) { - ItemInstanceArray *backup = new ItemInstanceArray( (int)menu->slots->size() + 1 ); + ItemInstanceArray *backup = new ItemInstanceArray( (int)menu->slots.size() + 1 ); (*backup)[0] = ItemInstance::clone(inventory->getCarried()); - for (unsigned int i = 0; i < menu->slots->size(); i++) + for (unsigned int i = 0; i < menu->slots.size(); i++) { - (*backup)[i + 1] = ItemInstance::clone(menu->slots->at(i)->getItem()); + (*backup)[i + 1] = ItemInstance::clone(menu->slots.at(i)->getItem()); } // TODO Is unordered_map use correct? // Was backups.put(changeUid, backup); @@ -39,9 +39,9 @@ void MenuBackup::rollback(short changeUid) ItemInstanceArray *backup = backups->at(changeUid); backups->clear(); inventory->setCarried( (*backup)[0] ); - for (unsigned int i = 0; i < menu->slots->size(); i++) + for (unsigned int i = 0; i < menu->slots.size(); i++) { - menu->slots->at(i)->set( (*backup)[i + 1] ); + menu->slots.at(i)->set( (*backup)[i + 1] ); } } \ No newline at end of file diff --git a/Minecraft.World/Merchant.h b/Minecraft.World/Merchant.h index 8b4b7a69..f47e2acb 100644 --- a/Minecraft.World/Merchant.h +++ b/Minecraft.World/Merchant.h @@ -13,5 +13,5 @@ public: virtual void overrideOffers(MerchantRecipeList *recipeList) = 0; virtual void notifyTrade(MerchantRecipe *activeRecipe) = 0; virtual void notifyTradeUpdated(shared_ptr item) = 0; - virtual int getDisplayName() = 0; + virtual wstring getDisplayName() = 0; }; \ No newline at end of file diff --git a/Minecraft.World/MerchantContainer.cpp b/Minecraft.World/MerchantContainer.cpp index cadbe4e3..cd3fde5e 100644 --- a/Minecraft.World/MerchantContainer.cpp +++ b/Minecraft.World/MerchantContainer.cpp @@ -90,11 +90,21 @@ void MerchantContainer::setItem(unsigned int slot, shared_ptr item } } -int MerchantContainer::getName() +wstring MerchantContainer::getName() { return merchant->getDisplayName(); } +wstring MerchantContainer::getCustomName() +{ + return L""; +} + +bool MerchantContainer::hasCustomName() +{ + return false; +} + int MerchantContainer::getMaxStackSize() { return Container::LARGE_MAX_STACK_SIZE; @@ -113,6 +123,11 @@ void MerchantContainer::stopOpen() { } +bool MerchantContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + void MerchantContainer::setChanged() { updateSellItem(); diff --git a/Minecraft.World/MerchantContainer.h b/Minecraft.World/MerchantContainer.h index efba13d6..91893c1b 100644 --- a/Minecraft.World/MerchantContainer.h +++ b/Minecraft.World/MerchantContainer.h @@ -30,11 +30,14 @@ private: public: shared_ptr removeItemNoUpdate(int slot); void setItem(unsigned int slot, shared_ptr item); - int getName(); + wstring getName(); + wstring getCustomName(); + bool hasCustomName(); int getMaxStackSize(); bool stillValid(shared_ptr player); void startOpen(); void stopOpen(); + bool canPlaceItem(int slot, shared_ptr item); void setChanged(); void updateSellItem(); MerchantRecipe *getActiveRecipe(); diff --git a/Minecraft.World/MerchantMenu.cpp b/Minecraft.World/MerchantMenu.cpp index a6dfca1f..52ce34f9 100644 --- a/Minecraft.World/MerchantMenu.cpp +++ b/Minecraft.World/MerchantMenu.cpp @@ -69,7 +69,7 @@ shared_ptr MerchantMenu::quickMoveStack(shared_ptr player, shared_ptr clicked = nullptr; Slot *slot = NULL; - if(slotIndex < slots->size()) slot = slots->at(slotIndex); + if(slotIndex < slots.size()) slot = slots.at(slotIndex); if (slot != NULL && slot->hasItem()) { shared_ptr stack = slot->getItem(); diff --git a/Minecraft.World/MineShaftFeature.cpp b/Minecraft.World/MineShaftFeature.cpp index ac4d0c3f..78178de0 100644 --- a/Minecraft.World/MineShaftFeature.cpp +++ b/Minecraft.World/MineShaftFeature.cpp @@ -1,6 +1,32 @@ #include "stdafx.h" #include "net.minecraft.world.level.levelgen.structure.h" #include "JavaMath.h" +#include "Mth.h" + +const wstring MineShaftFeature::OPTION_CHANCE = L"chance"; + +MineShaftFeature::MineShaftFeature() +{ + chance = 0.01; +} + +wstring MineShaftFeature::getFeatureName() +{ + return L"Mineshaft"; +} + +MineShaftFeature::MineShaftFeature(unordered_map options) +{ + chance = 0.01; + + for(AUTO_VAR(it,options.begin()); it != options.end(); ++it) + { + if (it->first.compare(OPTION_CHANCE) == 0) + { + chance = Mth::getDouble(it->second, chance); + } + } +} bool MineShaftFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) { @@ -11,7 +37,7 @@ bool MineShaftFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) forcePlacement = levelGenOptions->isFeatureChunk(x,z,eFeature_Mineshaft); } - return forcePlacement || (random->nextInt(100) == 0 && random->nextInt(80) < max(abs(x), abs(z))); + return forcePlacement || (random->nextDouble() < chance && random->nextInt(80) < max(abs(x), abs(z))); } StructureStart *MineShaftFeature::createStructureStart(int x, int z) diff --git a/Minecraft.World/MineShaftFeature.h b/Minecraft.World/MineShaftFeature.h index 698010ec..cec786c6 100644 --- a/Minecraft.World/MineShaftFeature.h +++ b/Minecraft.World/MineShaftFeature.h @@ -4,6 +4,19 @@ class MineShaftFeature : public StructureFeature { +public: + static const wstring OPTION_CHANCE; + +private: + double chance; + +public: + MineShaftFeature(); + + wstring getFeatureName(); + + MineShaftFeature(unordered_map options); + protected: virtual bool isFeatureChunk(int x, int z, bool bIsSuperflat=false); virtual StructureStart *createStructureStart(int x, int z); diff --git a/Minecraft.World/MineShaftPieces.cpp b/Minecraft.World/MineShaftPieces.cpp index fe13b49f..844514dc 100644 --- a/Minecraft.World/MineShaftPieces.cpp +++ b/Minecraft.World/MineShaftPieces.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.level.levelgen.structure.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" @@ -12,7 +13,7 @@ WeighedTreasureArray MineShaftPieces::smallTreasureItems;; void MineShaftPieces::staticCtor() { - smallTreasureItems = WeighedTreasureArray(11); + smallTreasureItems = WeighedTreasureArray(13); smallTreasureItems[0] = new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 10); smallTreasureItems[1] = new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 5); smallTreasureItems[2] = new WeighedTreasure(Item::redStone_Id, 0, 4, 9, 5); @@ -23,8 +24,18 @@ void MineShaftPieces::staticCtor() smallTreasureItems[7] = new WeighedTreasure(Item::pickAxe_iron_Id, 0, 1, 1, 1); smallTreasureItems[8] = new WeighedTreasure(Tile::rail_Id, 0, 4, 8, 1); smallTreasureItems[9] = new WeighedTreasure(Item::seeds_melon_Id, 0, 2, 4, 10); - // 4J-PB - Adding from 1.2.3 smallTreasureItems[10] = new WeighedTreasure(Item::seeds_pumpkin_Id, 0, 2, 4, 10); + // very rare for shafts ... + smallTreasureItems[11] = new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 3); + smallTreasureItems[12] = new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 1); +} + +void MineShaftPieces::loadStatic() +{ + StructureFeatureIO::setPieceId( eStructurePiece_MineShaftCorridor, MineShaftCorridor::Create, L"MSCorridor"); + StructureFeatureIO::setPieceId( eStructurePiece_MineShaftCrossing, MineShaftCrossing::Create, L"MSCrossing"); + StructureFeatureIO::setPieceId( eStructurePiece_MineShaftRoom, MineShaftRoom::Create, L"MSRoom"); + StructureFeatureIO::setPieceId( eStructurePiece_MineShaftStairs, MineShaftStairs::Create, L"MSStairs"); } StructurePiece *MineShaftPieces::createRandomShaftPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) @@ -80,6 +91,10 @@ StructurePiece *MineShaftPieces::generateAndAddPiece(StructurePiece *startPiece, return newPiece; } +MineShaftPieces::MineShaftRoom::MineShaftRoom() +{ + // for reflection +} MineShaftPieces::MineShaftRoom::MineShaftRoom(int genDepth, Random *random, int west, int north) : StructurePiece(genDepth) { @@ -199,6 +214,46 @@ bool MineShaftPieces::MineShaftRoom::postProcess(Level *level, Random *random, B return true; } +void MineShaftPieces::MineShaftRoom::addAdditonalSaveData(CompoundTag *tag) +{ + ListTag *entrances = new ListTag(L"Entrances"); + for (AUTO_VAR(it,childEntranceBoxes.begin()); it != childEntranceBoxes.end(); ++it) + { + BoundingBox *bb =*it; + entrances->add(bb->createTag(L"")); + } + tag->put(L"Entrances", entrances); +} + +void MineShaftPieces::MineShaftRoom::readAdditonalSaveData(CompoundTag *tag) +{ + ListTag *entrances = (ListTag *) tag->getList(L"Entrances"); + for (int i = 0; i < entrances->size(); i++) + { + childEntranceBoxes.push_back(new BoundingBox(entrances->get(i)->data)); + } +} + +MineShaftPieces::MineShaftCorridor::MineShaftCorridor() +{ + // for reflection +} + +void MineShaftPieces::MineShaftCorridor::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putBoolean(L"hr", hasRails); + tag->putBoolean(L"sc", spiderCorridor); + tag->putBoolean(L"hps", hasPlacedSpider); + tag->putInt(L"Num", numSections); +} + +void MineShaftPieces::MineShaftCorridor::readAdditonalSaveData(CompoundTag *tag) +{ + hasRails = tag->getBoolean(L"hr"); + spiderCorridor = tag->getBoolean(L"sc"); + hasPlacedSpider = tag->getBoolean(L"hps"); + numSections = tag->getInt(L"Num"); +} MineShaftPieces::MineShaftCorridor::MineShaftCorridor(int genDepth, Random *random, BoundingBox *corridorBox, int direction) : StructurePiece(genDepth) @@ -370,6 +425,27 @@ void MineShaftPieces::MineShaftCorridor::addChildren(StructurePiece *startPiece, } } +bool MineShaftPieces::MineShaftCorridor::createChest(Level *level, BoundingBox *chunkBB, Random *random, int x, int y, int z, WeighedTreasureArray treasure, int numRolls) +{ + int worldX = getWorldX(x, z); + int worldY = getWorldY(y); + int worldZ = getWorldZ(x, z); + + if (chunkBB->isInside(worldX, worldY, worldZ)) + { + if (level->getTile(worldX, worldY, worldZ) == 0) + { + level->setTileAndData(worldX, worldY, worldZ, Tile::rail_Id, getOrientationData(Tile::rail_Id, random->nextBoolean() ? RailTile::DIR_FLAT_X : RailTile::DIR_FLAT_Z), Tile::UPDATE_CLIENTS); + shared_ptr chest = shared_ptr( new MinecartChest(level, worldX + 0.5f, worldY + 0.5f, worldZ + 0.5f) ); + WeighedTreasure::addChestItems(random, treasure, chest, numRolls); + level->addEntity(chest); + return true; + } + } + + return false; +} + bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { if (edgesLiquid(level, chunkBB)) @@ -439,9 +515,9 @@ bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *rando if (chunkBB->isInside(x, y, newZ)) { hasPlacedSpider = true; - level->setTile(x, y, newZ, Tile::mobSpawner_Id); + level->setTileAndData(x, y, newZ, Tile::mobSpawner_Id, 0, Tile::UPDATE_CLIENTS); shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, newZ) ); - if (entity != NULL) entity->setEntityId(L"CaveSpider"); + if (entity != NULL) entity->getSpawner()->setEntityId(L"CaveSpider"); } } } @@ -466,7 +542,7 @@ bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *rando int floor = getBlock(level, x0 + 1, y0 - 1, z, chunkBB); if (floor > 0 && Tile::solid[floor]) { - maybeGenerateBlock(level, chunkBB, random, .7f, x0 + 1, y0, z, Tile::rail_Id, getOrientationData(Tile::rail_Id, RailTile::DIR_FLAT_Z)); + maybeGenerateBlock(level, chunkBB, random, .7f, x0 + 1, y0, z, Tile::rail_Id, getOrientationData(Tile::rail_Id, BaseRailTile::DIR_FLAT_Z)); } } } @@ -474,6 +550,23 @@ bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *rando return true; } +MineShaftPieces::MineShaftCrossing::MineShaftCrossing() +{ + // for reflection +} + +void MineShaftPieces::MineShaftCrossing::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putBoolean(L"tf", isTwoFloored); + tag->putInt(L"D", direction); +} + +void MineShaftPieces::MineShaftCrossing::readAdditonalSaveData(CompoundTag *tag) +{ + isTwoFloored = tag->getBoolean(L"tf"); + direction = tag->getInt(L"D"); +} + MineShaftPieces::MineShaftCrossing::MineShaftCrossing(int genDepth, Random *random, BoundingBox *crossingBox, int direction) : StructurePiece(genDepth), direction(direction), isTwoFloored( crossingBox->getYSpan() > DEFAULT_SHAFT_HEIGHT ) { @@ -609,6 +702,10 @@ bool MineShaftPieces::MineShaftCrossing::postProcess(Level *level, Random *rando return true; } +MineShaftPieces::MineShaftStairs::MineShaftStairs() +{ + // for reflection +} MineShaftPieces::MineShaftStairs::MineShaftStairs(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StructurePiece(genDepth) { @@ -616,6 +713,15 @@ MineShaftPieces::MineShaftStairs::MineShaftStairs(int genDepth, Random *random, boundingBox = stairsBox; } + +void MineShaftPieces::MineShaftStairs::addAdditonalSaveData(CompoundTag *tag) +{ +} + +void MineShaftPieces::MineShaftStairs::readAdditonalSaveData(CompoundTag *tag) +{ +} + BoundingBox *MineShaftPieces::MineShaftStairs::findStairs(list *pieces, Random *random, int footX, int footY, int footZ, int direction) { // stairs are two steps in, 5x5 steps down, two steps out diff --git a/Minecraft.World/MineShaftPieces.h b/Minecraft.World/MineShaftPieces.h index 5f9cf000..c2278467 100644 --- a/Minecraft.World/MineShaftPieces.h +++ b/Minecraft.World/MineShaftPieces.h @@ -11,6 +11,10 @@ private: static const int MAX_DEPTH = 8; // 1.2.3 change +public: + static void loadStatic(); + +private: static StructurePiece *createRandomShaftPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); static StructurePiece *generateAndAddPiece(StructurePiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); @@ -21,15 +25,24 @@ private: public: class MineShaftRoom : public StructurePiece { + public: + static StructurePiece *Create() { return new MineShaftRoom(); } + virtual EStructurePiece GetType() { return eStructurePiece_MineShaftRoom; } + private: list childEntranceBoxes; public: + MineShaftRoom(); MineShaftRoom(int genDepth, Random *random, int west, int north); ~MineShaftRoom(); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); }; /** @@ -38,17 +51,33 @@ public: */ class MineShaftCorridor : public StructurePiece { + public: + static StructurePiece *Create() { return new MineShaftCorridor(); } + virtual EStructurePiece GetType() { return eStructurePiece_MineShaftCorridor; } + private: bool hasRails; // was final bool spiderCorridor; // was final bool hasPlacedSpider; int numSections; + public: + MineShaftCorridor(); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); + public: MineShaftCorridor(int genDepth, Random *random, BoundingBox *corridorBox, int direction); static BoundingBox *findCorridorSize(list *pieces, Random *random, int footX, int footY, int footZ, int direction); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + + protected: + virtual bool createChest(Level *level, BoundingBox *chunkBB, Random *random, int x, int y, int z, WeighedTreasureArray treasure, int numRolls); + + public: virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); }; @@ -58,9 +87,20 @@ public: */ class MineShaftCrossing : public StructurePiece { + public: + static StructurePiece *Create() { return new MineShaftCrossing(); } + virtual EStructurePiece GetType() { return eStructurePiece_MineShaftCrossing; } + private: - const int direction; - const bool isTwoFloored; + int direction; + bool isTwoFloored; + + public: + MineShaftCrossing(); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); public: MineShaftCrossing(int genDepth, Random *random, BoundingBox *crossingBox, int direction); @@ -77,8 +117,18 @@ public: class MineShaftStairs : public StructurePiece { public: + static StructurePiece *Create() { return new MineShaftStairs(); } + virtual EStructurePiece GetType() { return eStructurePiece_MineShaftStairs; } + + public: + MineShaftStairs(); MineShaftStairs(int genDepth, Random *random, BoundingBox *stairsBox, int direction); + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); + + public: static BoundingBox *findStairs(list *pieces, Random *random, int footX, int footY, int footZ, int direction); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); diff --git a/Minecraft.World/MineShaftStart.cpp b/Minecraft.World/MineShaftStart.cpp index badd3a04..eaf9f7c8 100644 --- a/Minecraft.World/MineShaftStart.cpp +++ b/Minecraft.World/MineShaftStart.cpp @@ -1,7 +1,12 @@ #include "stdafx.h" #include "net.minecraft.world.level.levelgen.structure.h" -MineShaftStart::MineShaftStart(Level *level, Random *random, int chunkX, int chunkZ) +MineShaftStart::MineShaftStart() +{ + // for reflection +} + +MineShaftStart::MineShaftStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart(chunkX, chunkZ) { MineShaftPieces::MineShaftRoom *mineShaftRoom = new MineShaftPieces::MineShaftRoom(0, random, (chunkX << 4) + 2, (chunkZ << 4) + 2); pieces.push_back(mineShaftRoom); diff --git a/Minecraft.World/MineShaftStart.h b/Minecraft.World/MineShaftStart.h index b46e3d67..7afb9b62 100644 --- a/Minecraft.World/MineShaftStart.h +++ b/Minecraft.World/MineShaftStart.h @@ -5,5 +5,10 @@ class MineShaftStart : public StructureStart { public: + static StructureStart *Create() { return new MineShaftStart(); } + virtual EStructureStart GetType() { return eStructureStart_MineShaftStart; } + +public: + MineShaftStart(); MineShaftStart(Level *level, Random *random, int chunkX, int chunkZ); }; \ No newline at end of file diff --git a/Minecraft.World/Minecart.cpp b/Minecraft.World/Minecart.cpp index 2b8fbb95..48787f55 100644 --- a/Minecraft.World/Minecart.cpp +++ b/Minecraft.World/Minecart.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" @@ -8,6 +9,8 @@ #include "net.minecraft.world.entity.animal.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.damagesource.h" +#include "..\Minecraft.Client\MinecraftServer.h" +#include "..\Minecraft.Client\ServerLevel.h" #include "com.mojang.nbt.h" #include "Minecart.h" #include "SharedConstants.h" @@ -16,89 +19,23 @@ const int Minecart::EXITS[][2][3] = { // // - { - { - +0, +0, -1 - }, { - +0, +0, +1 - } - }, // 0 - { - { - -1, +0, +0 - }, { - +1, +0, +0 - } - }, // 1 - { - { - -1, -1, +0 - }, { - +1, +0, +0 - } - }, // 2 - { - { - -1, +0, +0 - }, { - +1, -1, +0 - } - }, // 3 - { - { - +0, +0, -1 - }, { - +0, -1, +1 - } - }, // 4 - { - { - +0, -1, -1 - }, { - +0, +0, +1 - } - }, // 5 - - { - { - +0, +0, +1 - }, { - +1, +0, +0 - } - }, // 6 - { - { - +0, +0, +1 - }, { - -1, +0, +0 - } - }, // 7 - { - { - +0, +0, -1 - }, { - -1, +0, +0 - } - }, // 8 - { - { - +0, +0, -1 - }, { - +1, +0, +0 - } - }, // 9 + {{+0, +0, -1}, {+0, +0, +1}}, // 0 + {{-1, +0, +0}, {+1, +0, +0}}, // 1 + {{-1, -1, +0}, {+1, +0, +0}}, // 2 + {{-1, +0, +0}, {+1, -1, +0}}, // 3 + {{+0, +0, -1}, {+0, -1, +1}}, // 4 + {{+0, -1, -1}, {+0, +0, +1}}, // 5 + + {{+0, +0, +1}, {+1, +0, +0}}, // 6 + {{+0, +0, +1}, {-1, +0, +0}}, // 7 + {{+0, +0, -1}, {-1, +0, +0}}, // 8 + {{+0, +0, -1}, {+1, +0, +0}}, // 9 }; void Minecart::_init() { - // 4J TODO This gets replaced again later so should maybe be inited as NULL? - items = new ItemInstanceArray(9 * 4); - flipped = false; - type = fuel = 0; - xPush = zPush = 0.0; - lSteps = 0; lx = ly = lz = lyr = lxr = 0.0; lxd = lyd = lzd = 0.0; @@ -107,6 +44,8 @@ void Minecart::_init() blocksBuilding = true; setSize(0.98f, 0.7f); heightOffset = bbHeight / 2.0f; + soundUpdater = NULL; + name = L""; // // 4J Added @@ -115,13 +54,34 @@ void Minecart::_init() Minecart::Minecart(Level *level) : Entity( level ) { - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that - // the derived version of the function is called - this->defineSynchedData(); - _init(); + + //soundUpdater = level != NULL ? level->makeSoundUpdater(this) : NULL; } +Minecart::~Minecart() +{ + delete soundUpdater; +} + +shared_ptr Minecart::createMinecart(Level *level, double x, double y, double z, int type) +{ + switch (type) + { + case TYPE_CHEST: + return shared_ptr( new MinecartChest(level, x, y, z) ); + case TYPE_FURNACE: + return shared_ptr( new MinecartFurnace(level, x, y, z) ); + case TYPE_TNT: + return shared_ptr( new MinecartTNT(level, x, y, z) ); + case TYPE_SPAWNER: + return shared_ptr( new MinecartSpawner(level, x, y, z) ); + case TYPE_HOPPER: + return shared_ptr( new MinecartHopper(level, x, y, z) ); + default: + return shared_ptr( new MinecartRideable(level, x, y, z) ); + } +} bool Minecart::makeStepSound() { @@ -130,21 +90,26 @@ bool Minecart::makeStepSound() void Minecart::defineSynchedData() { - entityData->define(DATA_ID_FUEL, (byte) 0); entityData->define(DATA_ID_HURT, 0); entityData->define(DATA_ID_HURTDIR, 1); - entityData->define(DATA_ID_DAMAGE, 0); + entityData->define(DATA_ID_DAMAGE, 0.0f); + entityData->define(DATA_ID_DISPLAY_TILE, 0); + entityData->define(DATA_ID_DISPLAY_OFFSET, 6); + entityData->define(DATA_ID_CUSTOM_DISPLAY, (byte) 0); } AABB *Minecart::getCollideAgainstBox(shared_ptr entity) { - return entity->bb; + if (entity->isPushable()) + { + return entity->bb; + } + return NULL; } AABB *Minecart::getCollideBox() { - // if (level->isClientSide) return NULL; return NULL; } @@ -153,14 +118,11 @@ bool Minecart::isPushable() return true; } -Minecart::Minecart(Level *level, double x, double y, double z, int type) : Entity( level ) +Minecart::Minecart(Level *level, double x, double y, double z) : Entity( level ) { - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that - // the derived version of the function is called - this->defineSynchedData(); _init(); - setPos(x, y + heightOffset, z); + setPos(x, y, z); xd = 0; yd = 0; @@ -169,7 +131,6 @@ Minecart::Minecart(Level *level, double x, double y, double z, int type) : Entit xo = x; yo = y; zo = z; - this->type = type; } double Minecart::getRideHeight() @@ -177,88 +138,65 @@ double Minecart::getRideHeight() return bbHeight * 0.0 - 0.3f; } -bool Minecart::hurt(DamageSource *source, int hurtDamage) +bool Minecart::hurt(DamageSource *source, float hurtDamage) { if (level->isClientSide || removed) return true; - + if (isInvulnerable()) return false; + // 4J-JEV: Fix for #88212, // Untrusted players shouldn't be able to damage minecarts or boats. if (dynamic_cast(source) != NULL) { shared_ptr attacker = source->getDirectEntity(); - if (dynamic_pointer_cast(attacker) != NULL && - !dynamic_pointer_cast(attacker)->isAllowedToHurtEntity( shared_from_this() )) + if ( attacker->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(attacker)->isAllowedToHurtEntity( shared_from_this() )) + { return false; + } } setHurtDir(-getHurtDir()); setHurtTime(10); markHurt(); + setDamage(getDamage() + (hurtDamage * 10)); // 4J Stu - If someone is riding in this, then it can tick multiple times which causes the damage to // decrease too quickly. So just make the damage a bit higher to start with for similar behaviour // to an unridden one. Only do this change if the riding player is attacking it. if( rider.lock() != NULL && rider.lock() == source->getEntity() ) hurtDamage += 1; - // 4J Stu - Brought froward from 12w36 to fix #46611 - TU5: Gameplay: Minecarts and boat requires more hits than one to be destroyed in creative mode - shared_ptr player = dynamic_pointer_cast(source->getEntity()); - if (player != NULL && player->abilities.instabuild) this->setDamage(100); + bool creativePlayer = source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_PLAYER) && dynamic_pointer_cast(source->getEntity())->abilities.instabuild; - this->setDamage(getDamage() + (hurtDamage * 10)); - if (this->getDamage() > 20 * 2) + if (creativePlayer || getDamage() > 20 * 2) { // 4J HEG - Fixed issue with player falling through the ground on destroying a minecart while riding (issue #160607) if (rider.lock() != NULL) rider.lock()->ride(nullptr); - remove(); - spawnAtLocation(Item::minecart->id, 1, 0); - if (type == Minecart::CHEST) + if (!creativePlayer || hasCustomName()) { - shared_ptr container = dynamic_pointer_cast( shared_from_this() ); - for (unsigned int i = 0; i < container->getContainerSize(); i++) - { - shared_ptr item = container->getItem(i); - if (item != NULL) - { - float xo = random->nextFloat() * 0.8f + 0.1f; - float yo = random->nextFloat() * 0.8f + 0.1f; - float zo = random->nextFloat() * 0.8f + 0.1f; - - while (item->count > 0) - { - int count = random->nextInt(21) + 10; - if (count > item->count) count = item->count; - item->count -= count; - - shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ) ) ); - float pow = 0.05f; - itemEntity->xd = (float) random->nextGaussian() * pow; - itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; - itemEntity->zd = (float) random->nextGaussian() * pow; - if (item->hasTag()) - { - itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); - } - level->addEntity(itemEntity); - } - } - } - spawnAtLocation(Tile::chest_Id, 1, 0); + destroy(source); } - else if (type == Minecart::FURNACE) + else { - spawnAtLocation(Tile::furnace_Id, 1, 0); + remove(); } } return true; } +void Minecart::destroy(DamageSource *source) +{ + remove(); + shared_ptr item = shared_ptr( new ItemInstance(Item::minecart, 1) ); + if (!name.empty()) item->setHoverName(name); + spawnAtLocation(item, 0); +} + void Minecart::animateHurt() { setHurtDir(-getHurtDir()); setHurtTime(10); - this->setDamage(this->getDamage() + (getDamage() * 10)); + setDamage(getDamage() + (getDamage() * 10)); } bool Minecart::isPickable() @@ -268,40 +206,13 @@ bool Minecart::isPickable() void Minecart::remove() { - for (unsigned int i = 0; i < getContainerSize(); i++) - { - shared_ptr item = getItem(i); - if (item != NULL) - { - float xo = random->nextFloat() * 0.8f + 0.1f; - float yo = random->nextFloat() * 0.8f + 0.1f; - float zo = random->nextFloat() * 0.8f + 0.1f; - - while (item->count > 0) - { - int count = random->nextInt(21) + 10; - if (count > item->count) count = item->count; - item->count -= count; - - shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()) ) ) ); - float pow = 0.05f; - itemEntity->xd = (float) random->nextGaussian() * pow; - itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; - itemEntity->zd = (float) random->nextGaussian() * pow; - if (item->hasTag()) - { - itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); - } - level->addEntity(itemEntity); - } - } - } Entity::remove(); + //if (soundUpdater != NULL) soundUpdater->tick(); } - void Minecart::tick() { + //if (soundUpdater != NULL) soundUpdater->tick(); // 4J - make minecarts (server-side) tick twice, to put things back to how they were when we were accidently ticking them twice for( int i = 0; i < 2; i++ ) { @@ -312,9 +223,45 @@ void Minecart::tick() outOfWorld(); } - if (hasFuel() && random->nextInt(4) == 0) + if (!level->isClientSide && dynamic_cast(level) != NULL) { - level->addParticle(eParticleType_largesmoke, x, y + 0.8, z, 0, 0, 0); + MinecraftServer *server = ((ServerLevel *) level)->getServer(); + int waitTime = getPortalWaitTime(); + + if (isInsidePortal) + { + if (server->isNetherEnabled()) + { + if (riding == NULL) + { + if (portalTime++ >= waitTime) + { + portalTime = waitTime; + changingDimensionDelay = getDimensionChangingDelay(); + + int targetDimension; + + if (level->dimension->id == -1) + { + targetDimension = 0; + } + else + { + targetDimension = -1; + } + + changeDimension(targetDimension); + } + } + isInsidePortal = false; + } + } + else + { + if (portalTime > 0) portalTime -= 4; + if (portalTime < 0) portalTime = 0; + } + if (changingDimensionDelay > 0) changingDimensionDelay--; } // 4J Stu - Fix for #8284 - Gameplay: Collision: Minecart clips into/ through blocks at the end of the track, prevents player from riding @@ -332,13 +279,13 @@ void Minecart::tick() xRot += (float) ( (lxr - xRot) / lSteps ); lSteps--; - this->setPos(xt, yt, zt); - this->setRot(yRot, xRot); + setPos(xt, yt, zt); + setRot(yRot, xRot); } else { - this->setPos(x, y, z); - this->setRot(yRot, xRot); + setPos(x, y, z); + setRot(yRot, xRot); } return; // 4J - return here stops the client-side version of this from ticking twice @@ -352,7 +299,7 @@ void Minecart::tick() int xt = Mth::floor(x); int yt = Mth::floor(y); int zt = Mth::floor(z); - if (RailTile::isRail(level, xt, yt - 1, zt)) + if (BaseRailTile::isRail(level, xt, yt - 1, zt)) { yt--; } @@ -361,356 +308,330 @@ void Minecart::tick() double slideSpeed = 1 / 128.0; int tile = level->getTile(xt, yt, zt); - if (RailTile::isRail(tile)) + if (BaseRailTile::isRail(tile)) { - Vec3 *oldPos = getPos(x, y, z); int data = level->getData(xt, yt, zt); - y = yt; + moveAlongTrack(xt, yt, zt, max, slideSpeed, tile, data); - bool powerTrack = false; - bool haltTrack = false; - if (tile == Tile::goldenRail_Id) - { - powerTrack = (data & RailTile::RAIL_DATA_BIT) != 0; - haltTrack = !powerTrack; - } - if (((RailTile *) Tile::tiles[tile])->isUsesDataBit()) + if (tile == Tile::activatorRail_Id) { - data &= RailTile::RAIL_DIRECTION_MASK; + activateMinecart(xt, yt, zt, (data & BaseRailTile::RAIL_DATA_BIT) != 0); } + } + else + { + comeOffTrack(max); + } - if (data >= 2 && data <= 5) - { - y = yt + 1; - } + checkInsideTiles(); - if (data == 2) xd -= slideSpeed; - if (data == 3) xd += slideSpeed; - if (data == 4) zd += slideSpeed; - if (data == 5) zd -= slideSpeed; - - // 4J TODO Is this a good way to copy the bit of the array that we need? - int exits[2][3]; - memcpy( &exits, (void *)EXITS[data], sizeof(int) * 2 * 3); - //int exits[2][3] = EXITS[data]; - - double xD = exits[1][0] - exits[0][0]; - double zD = exits[1][2] - exits[0][2]; - double dd = sqrt(xD * xD + zD * zD); - - double flip = xd * xD + zd * zD; - if (flip < 0) - { - xD = -xD; - zD = -zD; - } + xRot = 0; + double xDiff = xo - x; + double zDiff = zo - z; + if (xDiff * xDiff + zDiff * zDiff > 0.001) + { + yRot = (float) (atan2(zDiff, xDiff) * 180 / PI); + if (flipped) yRot += 180; + } - double pow = sqrt(xd * xd + zd * zd); + double rotDiff = Mth::wrapDegrees(yRot - yRotO); - xd = pow * xD / dd; - zd = pow * zD / dd; - - shared_ptr sharedRider = rider.lock(); - if (sharedRider != NULL) - { - double riderDist = (sharedRider->xd * sharedRider->xd + sharedRider->zd * sharedRider->zd); - double ownDist = xd * xd + zd * zd; + if (rotDiff < -170 || rotDiff >= 170) + { + yRot += 180; + flipped = !flipped; + } + setRot(yRot, xRot); - if (riderDist > 0.0001 && ownDist < 0.01) + vector > *entities = level->getEntities(shared_from_this(), bb->grow(0.2f, 0, 0.2f)); + if (entities != NULL && !entities->empty()) + { + AUTO_VAR(itEnd, entities->end()); + for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) + { + shared_ptr e = (*it); //entities->at(i); + if (e != rider.lock() && e->isPushable() && e->instanceof(eTYPE_MINECART)) { - xd += sharedRider->xd * 0.1; - zd += sharedRider->zd * 0.1; + shared_ptr cart = dynamic_pointer_cast(e); + cart->m_bHasPushedCartThisTick = false; + cart->push(shared_from_this()); - haltTrack = false; + // 4J Added - We should only be pushed by one minecart per tick, the closest one + // Fix for #46937 - TU5: Gameplay: Crash/Freeze occurs when a minecart with an animal inside will be forced to despawn + if( cart->m_bHasPushedCartThisTick ) break; } } + } - // on golden rails without power, stop the cart - if (haltTrack) + if (rider.lock() != NULL) + { + if (rider.lock()->removed) { - double speedLength = sqrt(xd * xd + zd * zd); - if (speedLength < 0.03) - { - xd *= 0; - yd *= 0; - zd *= 0; - } - else + if (rider.lock()->riding == shared_from_this()) { - xd *= 0.5f; - yd *= 0; - zd *= 0.5f; + rider.lock()->riding = nullptr; } + rider = weak_ptr(); } + } + } +} - double progress = 0; - double x0 = xt + 0.5 + exits[0][0] * 0.5; - double z0 = zt + 0.5 + exits[0][2] * 0.5; - double x1 = xt + 0.5 + exits[1][0] * 0.5; - double z1 = zt + 0.5 + exits[1][2] * 0.5; +void Minecart::activateMinecart(int xt, int yt, int zt, bool state) +{ +} - xD = x1 - x0; - zD = z1 - z0; +void Minecart::comeOffTrack(double maxSpeed) +{ + if (xd < -maxSpeed) xd = -maxSpeed; + if (xd > +maxSpeed) xd = +maxSpeed; + if (zd < -maxSpeed) zd = -maxSpeed; + if (zd > +maxSpeed) zd = +maxSpeed; + if (onGround) + { + xd *= 0.5f; + yd *= 0.5f; + zd *= 0.5f; + } + move(xd, yd, zd); - if (xD == 0) - { - x = xt + 0.5; - progress = z - zt; - } - else if (zD == 0) - { - z = zt + 0.5; - progress = x - xt; - } - else - { + if (!onGround) + { + xd *= 0.95f; + yd *= 0.95f; + zd *= 0.95f; + } +} - double xx = x - x0; - double zz = z - z0; +void Minecart::moveAlongTrack(int xt, int yt, int zt, double maxSpeed, double slideSpeed, int tile, int data) +{ + fallDistance = 0; - progress = (xx * xD + zz * zD) * 2; - } + Vec3 *oldPos = getPos(x, y, z); + y = yt; - x = x0 + xD * progress; - z = z0 + zD * progress; + bool powerTrack = false; + bool haltTrack = false; + if (tile == Tile::goldenRail_Id) + { + powerTrack = (data & BaseRailTile::RAIL_DATA_BIT) != 0; + haltTrack = !powerTrack; + } + if (((BaseRailTile *) Tile::tiles[tile])->isUsesDataBit()) + { + data &= BaseRailTile::RAIL_DIRECTION_MASK; + } - setPos(x, y + heightOffset, z); + if (data >= 2 && data <= 5) + { + y = yt + 1; + } - double xdd = xd; - double zdd = zd; - if (rider.lock() != NULL) - { - xdd *= 0.75; - zdd *= 0.75; - } - if (xdd < -max) xdd = -max; - if (xdd > +max) xdd = +max; - if (zdd < -max) zdd = -max; - if (zdd > +max) zdd = +max; - move(xdd, 0, zdd); + if (data == 2) xd -= slideSpeed; + if (data == 3) xd += slideSpeed; + if (data == 4) zd += slideSpeed; + if (data == 5) zd -= slideSpeed; - if (exits[0][1] != 0 && Mth::floor(x) - xt == exits[0][0] && Mth::floor(z) - zt == exits[0][2]) - { - setPos(x, y + exits[0][1], z); - } - else if (exits[1][1] != 0 && Mth::floor(x) - xt == exits[1][0] && Mth::floor(z) - zt == exits[1][2]) - { - setPos(x, y + exits[1][1], z); - } - else - { - } + int exits[2][3]; + memcpy( exits, EXITS[data], sizeof(int) * 2 * 3); - if (rider.lock() != NULL) - { - xd *= 0.997f; - yd *= 0; - zd *= 0.997f; - } - else - { - if (type == Minecart::FURNACE) - { - double sd = xPush * xPush + zPush * zPush; - if (sd > 0.01 * 0.01) - { - sd = sqrt(sd); - xPush /= sd; - zPush /= sd; - double speed = 0.04; - xd *= 0.8f; - yd *= 0; - zd *= 0.8f; - xd += xPush * speed; - zd += zPush * speed; - } - else - { - xd *= 0.9f; - yd *= 0; - zd *= 0.9f; - } - } - xd *= 0.96f; - yd *= 0; - zd *= 0.96f; + double xD = exits[1][0] - exits[0][0]; + double zD = exits[1][2] - exits[0][2]; + double dd = sqrt(xD * xD + zD * zD); - } + double flip = xd * xD + zd * zD; + if (flip < 0) + { + xD = -xD; + zD = -zD; + } - Vec3 *newPos = getPos(x, y, z); - if (newPos != NULL && oldPos != NULL) - { - double speed = (oldPos->y - newPos->y) * 0.05; + double pow = sqrt(xd * xd + zd * zd); + if (pow > 2) + { + pow = 2; + } - pow = sqrt(xd * xd + zd * zd); - if (pow > 0) - { - xd = xd / pow * (pow + speed); - zd = zd / pow * (pow + speed); - } - setPos(x, newPos->y, z); - } + xd = pow * xD / dd; + zd = pow * zD / dd; - int xn = Mth::floor(x); - int zn = Mth::floor(z); - if (xn != xt || zn != zt) - { - pow = sqrt(xd * xd + zd * zd); + + if ( rider.lock() != NULL && rider.lock()->instanceof(eTYPE_LIVINGENTITY) ) + { + shared_ptr living = dynamic_pointer_cast(rider.lock()); - xd = pow * (xn - xt); - zd = pow * (zn - zt); - } + double forward = living->yya; - if (type == Minecart::FURNACE) - { - double sd = xPush * xPush + zPush * zPush; - if (sd > 0.01 * 0.01 && xd * xd + zd * zd > 0.001) - { - sd = sqrt(sd); - xPush /= sd; - zPush /= sd; + if (forward > 0) + { + double riderXd = -sin(living->yRot * PI / 180); + double riderZd = cos(living->yRot * PI / 180); - if (xPush * xd + zPush * zd < 0) - { - xPush = 0; - zPush = 0; - } - else - { - xPush = xd; - zPush = zd; - } - } - } + double ownDist = xd * xd + zd * zd; - // if on golden rail with power, increase speed - if (powerTrack) + if (ownDist < 0.01) { - double speedLength = sqrt(xd * xd + zd * zd); - if (speedLength > .01) - { - double speed = 0.06; - xd += xd / speedLength * speed; - zd += zd / speedLength * speed; - } - else - { - // if the minecart is standing still, accelerate it away - // from potentional walls - if (data == RailTile::DIR_FLAT_X) - { - if (level->isSolidBlockingTile(xt - 1, yt, zt)) - { - xd = .02; - } - else if (level->isSolidBlockingTile(xt + 1, yt, zt)) - { - xd = -.02; - } - } - else if (data == RailTile::DIR_FLAT_Z) - { - if (level->isSolidBlockingTile(xt, yt, zt - 1)) - { - zd = .02; - } - else if (level->isSolidBlockingTile(xt, yt, zt + 1)) - { - zd = -.02; - } - } - } + xd += riderXd * 0.1; + zd += riderZd * 0.1; + + haltTrack = false; } + } + } - checkInsideTiles(); + // on golden rails without power, stop the cart + if (haltTrack) + { + double speedLength = sqrt(xd * xd + zd * zd); + if (speedLength < .03) + { + xd *= 0; + yd *= 0; + zd *= 0; } else { - if (xd < -max) xd = -max; - if (xd > +max) xd = +max; - if (zd < -max) zd = -max; - if (zd > +max) zd = +max; - if (onGround) - { - xd *= 0.5f; - yd *= 0.5f; - zd *= 0.5f; - } - move(xd, yd, zd); - - if (onGround) - { - } - else - { - xd *= 0.95f; - yd *= 0.95f; - zd *= 0.95f; - } + xd *= 0.5f; + yd *= 0; + zd *= 0.5f; } + } - xRot = 0; - double xDiff = xo - x; - double zDiff = zo - z; - if (xDiff * xDiff + zDiff * zDiff > 0.001) + double progress = 0; + double x0 = xt + 0.5 + exits[0][0] * 0.5; + double z0 = zt + 0.5 + exits[0][2] * 0.5; + double x1 = xt + 0.5 + exits[1][0] * 0.5; + double z1 = zt + 0.5 + exits[1][2] * 0.5; + + xD = x1 - x0; + zD = z1 - z0; + + if (xD == 0) + { + x = xt + 0.5; + progress = z - zt; + } + else if (zD == 0) + { + z = zt + 0.5; + progress = x - xt; + } + else + { + + double xx = x - x0; + double zz = z - z0; + + progress = (xx * xD + zz * zD) * 2; + } + + x = x0 + xD * progress; + z = z0 + zD * progress; + + setPos(x, y + heightOffset, z); + + double xdd = xd; + double zdd = zd; + if (rider.lock() != NULL) + { + xdd *= 0.75; + zdd *= 0.75; + } + if (xdd < -maxSpeed) xdd = -maxSpeed; + if (xdd > +maxSpeed) xdd = +maxSpeed; + if (zdd < -maxSpeed) zdd = -maxSpeed; + if (zdd > +maxSpeed) zdd = +maxSpeed; + + move(xdd, 0, zdd); + + if (exits[0][1] != 0 && Mth::floor(x) - xt == exits[0][0] && Mth::floor(z) - zt == exits[0][2]) + { + setPos(x, y + exits[0][1], z); + } + else if (exits[1][1] != 0 && Mth::floor(x) - xt == exits[1][0] && Mth::floor(z) - zt == exits[1][2]) + { + setPos(x, y + exits[1][1], z); + } + + applyNaturalSlowdown(); + + Vec3 *newPos = getPos(x, y, z); + if (newPos != NULL && oldPos != NULL) + { + double speed = (oldPos->y - newPos->y) * 0.05; + + pow = sqrt(xd * xd + zd * zd); + if (pow > 0) { - yRot = (float) (atan2(zDiff, xDiff) * 180 / PI); - if (flipped) yRot += 180; + xd = xd / pow * (pow + speed); + zd = zd / pow * (pow + speed); } + setPos(x, newPos->y, z); + } - double rotDiff = Mth::wrapDegrees(yRot - yRotO); + int xn = Mth::floor(x); + int zn = Mth::floor(z); + if (xn != xt || zn != zt) + { + pow = sqrt(xd * xd + zd * zd); - if (rotDiff < -170 || rotDiff >= 170) + xd = pow * (xn - xt); + zd = pow * (zn - zt); + } + + // if on golden rail with power, increase speed + if (powerTrack) + { + double speedLength = sqrt(xd * xd + zd * zd); + if (speedLength > .01) { - yRot += 180; - flipped = !flipped; + double speed = 0.06; + xd += xd / speedLength * speed; + zd += zd / speedLength * speed; } - setRot(yRot, xRot); - - // if (!level->isClientSide) { + else { - vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); - if (entities != NULL && !entities->empty()) + // if the minecart is standing still, accelerate it away from + // potential walls + if (data == BaseRailTile::DIR_FLAT_X) { - AUTO_VAR(itEnd, entities->end()); - for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) + if (level->isSolidBlockingTile(xt - 1, yt, zt)) { - shared_ptr e = (*it); //entities->at(i); - if (e != rider.lock() && e->isPushable() && e->GetType() == eTYPE_MINECART) - { - shared_ptr cart = dynamic_pointer_cast(e); - cart->m_bHasPushedCartThisTick = false; - cart->push(shared_from_this()); - - // 4J Added - We should only be pushed by one minecart per tick, the closest one - // Fix for #46937 - TU5: Gameplay: Crash/Freeze occurs when a minecart with an animal inside will be forced to despawn - if( cart->m_bHasPushedCartThisTick ) break; - } + xd = .02; + } + else if (level->isSolidBlockingTile(xt + 1, yt, zt)) + { + xd = -.02; } } - } - - if (rider.lock() != NULL) - { - if (rider.lock()->removed) + else if (data == BaseRailTile::DIR_FLAT_Z) { - if (rider.lock()->riding == shared_from_this()) + if (level->isSolidBlockingTile(xt, yt, zt - 1)) { - rider.lock()->riding = nullptr; + zd = .02; + } + else if (level->isSolidBlockingTile(xt, yt, zt + 1)) + { + zd = -.02; } - rider = weak_ptr(); } } + } +} - if (fuel > 0) - { - fuel--; - } - if (fuel <= 0) - { - xPush = zPush = 0; - } - setHasFuel(fuel > 0); +void Minecart::applyNaturalSlowdown() +{ + if (rider.lock() != NULL) + { + xd *= 0.997f; + yd *= 0; + zd *= 0.997f; + } + else + { + xd *= 0.96f; + yd *= 0; + zd *= 0.96f; } } @@ -719,19 +640,19 @@ Vec3 *Minecart::getPosOffs(double x, double y, double z, double offs) int xt = Mth::floor(x); int yt = Mth::floor(y); int zt = Mth::floor(z); - if (RailTile::isRail(level, xt, yt - 1, zt)) + if (BaseRailTile::isRail(level, xt, yt - 1, zt)) { yt--; } int tile = level->getTile(xt, yt, zt); - if (RailTile::isRail(tile)) + if (BaseRailTile::isRail(tile)) { int data = level->getData(xt, yt, zt); - if (((RailTile *) Tile::tiles[tile])->isUsesDataBit()) + if (((BaseRailTile *) Tile::tiles[tile])->isUsesDataBit()) { - data &= RailTile::RAIL_DIRECTION_MASK; + data &= BaseRailTile::RAIL_DIRECTION_MASK; } y = yt; @@ -762,9 +683,6 @@ Vec3 *Minecart::getPosOffs(double x, double y, double z, double offs) { y += exits[1][1]; } - else - { - } return getPos(x, y, z); } @@ -776,20 +694,20 @@ Vec3 *Minecart::getPos(double x, double y, double z) int xt = Mth::floor(x); int yt = Mth::floor(y); int zt = Mth::floor(z); - if (RailTile::isRail(level, xt, yt - 1, zt)) + if (BaseRailTile::isRail(level, xt, yt - 1, zt)) { yt--; } int tile = level->getTile(xt, yt, zt); - if (RailTile::isRail(tile)) + if (BaseRailTile::isRail(tile)) { int data = level->getData(xt, yt, zt); y = yt; - if (((RailTile *) Tile::tiles[tile])->isUsesDataBit()) + if (((BaseRailTile *) Tile::tiles[tile])->isUsesDataBit()) { - data &= RailTile::RAIL_DIRECTION_MASK; + data &= BaseRailTile::RAIL_DIRECTION_MASK; } if (data >= 2 && data <= 5) @@ -843,57 +761,30 @@ Vec3 *Minecart::getPos(double x, double y, double z) return NULL; } - -void Minecart::addAdditonalSaveData(CompoundTag *base) +void Minecart::readAdditionalSaveData(CompoundTag *tag) { - base->putInt(L"Type", type); - - if (type == Minecart::FURNACE) + if (tag->getBoolean(L"CustomDisplayTile")) { - base->putDouble(L"PushX", xPush); - base->putDouble(L"PushZ", zPush); - base->putShort(L"Fuel", (short) fuel); + setDisplayTile(tag->getInt(L"DisplayTile")); + setDisplayData(tag->getInt(L"DisplayData")); + setDisplayOffset(tag->getInt(L"DisplayOffset")); } - else if (type == Minecart::CHEST) - { - ListTag *listTag = new ListTag(); - for (unsigned int i = 0; i < items->length; i++) - { - if ( (*items)[i] != NULL) - { - CompoundTag *tag = new CompoundTag(); - tag->putByte(L"Slot", (byte) i); - (*items)[i]->save(tag); - listTag->add(tag); - } - } - base->put(L"Items", listTag); - } + if (tag->contains(L"CustomName") && tag->getString(L"CustomName").length() > 0) name = tag->getString(L"CustomName"); } -void Minecart::readAdditionalSaveData(CompoundTag *base) +void Minecart::addAdditonalSaveData(CompoundTag *tag) { - type = base->getInt(L"Type"); - if (type == Minecart::FURNACE) - { - xPush = base->getDouble(L"PushX"); - zPush = base->getDouble(L"PushZ"); - fuel = base->getShort(L"Fuel"); - } - else if (type == Minecart::CHEST) + if (hasCustomDisplay()) { - ListTag *inventoryList = (ListTag *) base->getList(L"Items"); - items = new ItemInstanceArray( getContainerSize() ); - for (int i = 0; i < inventoryList->size(); i++) - { - CompoundTag *tag = inventoryList->get(i); - unsigned int slot = tag->getByte(L"Slot") & 0xff; - if (slot >= 0 && slot < items->length) (*items)[slot] = shared_ptr( ItemInstance::fromTag(tag) ); - } + tag->putBoolean(L"CustomDisplayTile", true); + tag->putInt(L"DisplayTile", getDisplayTile() == NULL ? 0 : getDisplayTile()->id); + tag->putInt(L"DisplayData", getDisplayData()); + tag->putInt(L"DisplayOffset", getDisplayOffset()); } -} + if (!name.empty()) tag->putString(L"CustomName", name); +} float Minecart::getShadowHeightOffs() { @@ -905,9 +796,9 @@ void Minecart::push(shared_ptr e) if (level->isClientSide) return; if (e == rider.lock()) return; - if (( dynamic_pointer_cast(e)!=NULL) && dynamic_pointer_cast(e)==NULL && dynamic_pointer_cast(e) == NULL && type == Minecart::RIDEABLE && xd * xd + zd * zd > 0.01) + if ( e->instanceof(eTYPE_LIVINGENTITY) && !e->instanceof(eTYPE_PLAYER) && !e->instanceof(eTYPE_VILLAGERGOLEM) && (getType() == TYPE_RIDEABLE) && (xd * xd + zd * zd > 0.01) ) { - if (rider.lock() == NULL && e->riding == NULL) + if ( (rider.lock() == NULL) && (e->riding == NULL) ) { e->ride( shared_from_this() ); } @@ -934,7 +825,7 @@ void Minecart::push(shared_ptr e) xa *= 0.5; za *= 0.5; - if (e->GetType() == eTYPE_MINECART) + if (e->instanceof(eTYPE_MINECART)) { double xo = e->x - x; double zo = e->z - z; @@ -955,16 +846,16 @@ void Minecart::push(shared_ptr e) double zdd = (e->zd + zd); shared_ptr cart = dynamic_pointer_cast(e); - if (cart != NULL && cart->type == Minecart::FURNACE && type != Minecart::FURNACE) + if (cart != NULL && cart->getType() == TYPE_FURNACE && getType() != TYPE_FURNACE) { xd *= 0.2f; zd *= 0.2f; - this->Entity::push( e->xd - xa, 0, e->zd - za); + push( e->xd - xa, 0, e->zd - za); e->xd *= 0.95f; e->zd *= 0.95f; m_bHasPushedCartThisTick = true; } - else if (cart != NULL && cart->type != Minecart::FURNACE && type == Minecart::FURNACE) + else if (cart != NULL && cart->getType() != TYPE_FURNACE && getType() == TYPE_FURNACE) { e->xd *= 0.2f; e->zd *= 0.2f; @@ -979,7 +870,7 @@ void Minecart::push(shared_ptr e) zdd /= 2; xd *= 0.2f; zd *= 0.2f; - this->Entity::push(xdd - xa, 0, zdd - za); + push(xdd - xa, 0, zdd - za); e->xd *= 0.2f; e->zd *= 0.2f; e->push(xdd + xa, 0, zdd + za); @@ -1006,206 +897,146 @@ void Minecart::push(shared_ptr e) } else { - this->Entity::push(-xa, 0, -za); + push(-xa, 0, -za); e->push(xa / 4, 0, za / 4); } } } -unsigned int Minecart::getContainerSize() +void Minecart::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) { - return 9 * 3; + lx = x; + ly = y; + lz = z; + lyr = yRot; + lxr = xRot; + + lSteps = steps + 2; + + xd = lxd; + yd = lyd; + zd = lzd; } -shared_ptr Minecart::getItem(unsigned int slot) +void Minecart::lerpMotion(double xd, double yd, double zd) { - return (*items)[slot]; + lxd = this->xd = xd; + lyd = this->yd = yd; + lzd = this->zd = zd; } -shared_ptr Minecart::removeItem(unsigned int slot, int count) +void Minecart::setDamage(float damage) { - if ( (*items)[slot] != NULL) - { - if ( (*items)[slot]->count <= count) - { - shared_ptr item = (*items)[slot]; - (*items)[slot] = nullptr; - return item; - } - else - { - shared_ptr i = (*items)[slot]->remove(count); - if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; - return i; - } - } - return nullptr; + entityData->set(DATA_ID_DAMAGE, damage); } -shared_ptr Minecart::removeItemNoUpdate(int slot) +float Minecart::getDamage() { - if ( (*items)[slot] != NULL) - { - shared_ptr item = (*items)[slot]; - (*items)[slot] = nullptr; - return item; - } - return nullptr; + return entityData->getFloat(DATA_ID_DAMAGE); } -void Minecart::setItem(unsigned int slot, shared_ptr item) +void Minecart::setHurtTime(int hurtTime) { - (*items)[slot] = item; - if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); + entityData->set(DATA_ID_HURT, hurtTime); } -int Minecart::getName() +int Minecart::getHurtTime() { - return IDS_ITEM_MINECART; + return entityData->getInteger(DATA_ID_HURT); } -int Minecart::getMaxStackSize() +void Minecart::setHurtDir(int hurtDir) { - return Container::LARGE_MAX_STACK_SIZE; + entityData->set(DATA_ID_HURTDIR, hurtDir); } -void Minecart::setChanged() +int Minecart::getHurtDir() { + return entityData->getInteger(DATA_ID_HURTDIR); } -bool Minecart::interact(shared_ptr player) +Tile *Minecart::getDisplayTile() { - if (type == Minecart::RIDEABLE) - { - if (rider.lock() != NULL && dynamic_pointer_cast(rider.lock())!=NULL && rider.lock() != player) return true; - if (!level->isClientSide) - { - // 4J HEG - Fixed issue with player not being able to dismount minecart (issue #4455) - player->ride( rider.lock() == player ? nullptr : shared_from_this() ); - } - } - else if (type == Minecart::CHEST) - { - if ( player->isAllowedToInteract(shared_from_this()) ) - { - if (!level->isClientSide) - player->openContainer( dynamic_pointer_cast( shared_from_this() ) ); - } - else - { - return false; - } - } - else if (type == Minecart::FURNACE) - { - shared_ptr selected = player->inventory->getSelected(); - if (selected != NULL && selected->id == Item::coal->id) - { - if (--selected->count == 0) player->inventory->setItem(player->inventory->selected, nullptr); - fuel += SharedConstants::TICKS_PER_SECOND * 180; - - } - xPush = x - player->x; - zPush = z - player->z; - } - return true; + if (!hasCustomDisplay()) return getDefaultDisplayTile(); + int id = getEntityData()->getInteger(DATA_ID_DISPLAY_TILE) & 0xFFFF; + return id > 0 && id < Tile::TILE_NUM_COUNT ? Tile::tiles[id] : NULL; } -float Minecart::getLootContent() +Tile *Minecart::getDefaultDisplayTile() { - int count = 0; - for (unsigned int i = 0; i < items->length; i++) - { - if ( (*items)[i] != NULL) count++; - } - return count / (float) items->length; + return NULL; } - -void Minecart::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) +int Minecart::getDisplayData() { - lx = x; - ly = y; - lz = z; - lyr = yRot; - lxr = xRot; - - lSteps = steps + 2; - - this->xd = lxd; - this->yd = lyd; - this->zd = lzd; + if (!hasCustomDisplay()) return getDefaultDisplayData(); + return getEntityData()->getInteger(DATA_ID_DISPLAY_TILE) >> 16; } -void Minecart::lerpMotion(double xd, double yd, double zd) +int Minecart::getDefaultDisplayData() { - lxd = this->xd = xd; - lyd = this->yd = yd; - lzd = this->zd = zd; + return 0; } -bool Minecart::stillValid(shared_ptr player) +int Minecart::getDisplayOffset() { - if (this->removed) return false; - if (player->distanceToSqr(shared_from_this()) > 8 * 8) return false; - return true; + if (!hasCustomDisplay()) return getDefaultDisplayOffset(); + return getEntityData()->getInteger(DATA_ID_DISPLAY_OFFSET); } -bool Minecart::hasFuel() +int Minecart::getDefaultDisplayOffset() { - return (entityData->getByte(DATA_ID_FUEL) & 1) != 0; + return 6; } -void Minecart::setHasFuel(bool fuel) +void Minecart::setDisplayTile(int id) { - if (fuel) - { - entityData->set(DATA_ID_FUEL, (byte) (entityData->getByte(DATA_ID_FUEL) | 1)); - } - else - { - entityData->set(DATA_ID_FUEL, (byte) (entityData->getByte(DATA_ID_FUEL) & ~1)); - } + getEntityData()->set(DATA_ID_DISPLAY_TILE, (id & 0xFFFF) | (getDisplayData() << 16)); + setCustomDisplay(true); } -void Minecart::startOpen() +void Minecart::setDisplayData(int data) { - // TODO Auto-generated method stub + Tile *tile = getDisplayTile(); + int id = tile == NULL ? 0 : tile->id; + getEntityData()->set(DATA_ID_DISPLAY_TILE, (id & 0xFFFF) | (data << 16)); + setCustomDisplay(true); } -void Minecart::stopOpen() +void Minecart::setDisplayOffset(int offset) { - // TODO Auto-generated method stub - + getEntityData()->set(DATA_ID_DISPLAY_OFFSET, offset); + setCustomDisplay(true); } -void Minecart::setDamage(int damage) +bool Minecart::hasCustomDisplay() { - entityData->set(DATA_ID_DAMAGE, damage); + return getEntityData()->getByte(DATA_ID_CUSTOM_DISPLAY) == 1; } -int Minecart::getDamage() +void Minecart::setCustomDisplay(bool value) { - return entityData->getInteger(DATA_ID_DAMAGE); + getEntityData()->set(DATA_ID_CUSTOM_DISPLAY, (byte) (value ? 1 : 0)); } -void Minecart::setHurtTime(int hurtTime) +void Minecart::setCustomName(const wstring &name) { - entityData->set(DATA_ID_HURT, hurtTime); + this->name = name; } -int Minecart::getHurtTime() +wstring Minecart::getAName() { - return entityData->getInteger(DATA_ID_HURT); + if (!name.empty()) return name; + return Entity::getAName(); } -void Minecart::setHurtDir(int hurtDir) +bool Minecart::hasCustomName() { - entityData->set(DATA_ID_HURTDIR, hurtDir); + return !name.empty(); } -int Minecart::getHurtDir() +wstring Minecart::getCustomName() { - return entityData->getInteger(DATA_ID_HURTDIR); + return name; } \ No newline at end of file diff --git a/Minecraft.World/Minecart.h b/Minecraft.World/Minecart.h index ea119bce..bd1a69e6 100644 --- a/Minecraft.World/Minecart.h +++ b/Minecraft.World/Minecart.h @@ -1,48 +1,49 @@ #pragma once #include "Entity.h" -#include "Container.h" class DamageSource; +class Tickable; -class Minecart : public Entity, public Container +class Minecart : public Entity { + friend class MinecartRenderer; public: eINSTANCEOF GetType() { return eTYPE_MINECART; }; - static Entity *create(Level *level) { return new Minecart(level); } public: - static const int RIDEABLE = 0; - static const int CHEST = 1; - static const int FURNACE = 2; - -private: - ItemInstanceArray *items; // Array + static const int TYPE_RIDEABLE = 0; + static const int TYPE_CHEST = 1; + static const int TYPE_FURNACE = 2; + static const int TYPE_TNT = 3; + static const int TYPE_SPAWNER = 4; + static const int TYPE_HOPPER = 5; public: static const int serialVersionUID = 0; private: - static const int DATA_ID_FUEL = 16; static const int DATA_ID_HURT = 17; static const int DATA_ID_HURTDIR = 18; static const int DATA_ID_DAMAGE = 19; + static const int DATA_ID_DISPLAY_TILE = 20; + static const int DATA_ID_DISPLAY_OFFSET = 21; + static const int DATA_ID_CUSTOM_DISPLAY = 22; - int fuel; - -private: bool flipped; + Tickable *soundUpdater; + wstring name; protected: // 4J Added bool m_bHasPushedCartThisTick; public: - int type; - double xPush, zPush; - void _init(); Minecart(Level *level); + virtual ~Minecart(); + + static shared_ptr createMinecart(Level *level, double x, double y, double z, int type); protected: virtual bool makeStepSound(); @@ -53,10 +54,11 @@ public: virtual AABB *getCollideBox(); virtual bool isPushable(); - Minecart(Level *level, double x, double y, double z, int type); + Minecart(Level *level, double x, double y, double z); virtual double getRideHeight(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); + virtual void destroy(DamageSource *source); virtual void animateHurt(); virtual bool isPickable(); virtual void remove(); @@ -66,6 +68,12 @@ private: public: virtual void tick(); + virtual void activateMinecart(int xt, int yt, int zt, bool state); + +protected: + virtual void comeOffTrack(double maxSpeed); + virtual void moveAlongTrack(int xt, int yt, int zt, double maxSpeed, double slideSpeed, int tile, int data); + virtual void applyNaturalSlowdown(); virtual Vec3 *getPosOffs(double x, double y, double z, double offs); virtual Vec3 *getPos(double x, double y, double z); @@ -75,17 +83,8 @@ protected: public: virtual float getShadowHeightOffs(); + using Entity::push; virtual void push(shared_ptr e); - virtual unsigned int getContainerSize(); - virtual shared_ptr getItem(unsigned int slot); - virtual shared_ptr removeItem(unsigned int slot, int count); - virtual shared_ptr removeItemNoUpdate(int slot); - virtual void setItem(unsigned int slot, shared_ptr item); - int getName(); - virtual int getMaxStackSize(); - virtual void setChanged(); - virtual bool interact(shared_ptr player); - virtual float getLootContent(); private: int lSteps; @@ -95,20 +94,29 @@ private: public: virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); virtual void lerpMotion(double xd, double yd, double zd); - virtual bool stillValid(shared_ptr player); -protected: - bool hasFuel(); - void setHasFuel(bool fuel); - -public: - virtual void startOpen(); - virtual void stopOpen(); - - void setDamage(int damage); - int getDamage(); - void setHurtTime(int hurtTime); - int getHurtTime(); - void setHurtDir(int hurtDir); - int getHurtDir(); + virtual void setDamage(float damage); + virtual float getDamage(); + virtual void setHurtTime(int hurtTime); + virtual int getHurtTime(); + virtual void setHurtDir(int hurtDir); + virtual int getHurtDir(); + + virtual int getType() = 0; + + virtual Tile *getDisplayTile(); + virtual Tile *getDefaultDisplayTile(); + virtual int getDisplayData(); + virtual int getDefaultDisplayData(); + virtual int getDisplayOffset(); + virtual int getDefaultDisplayOffset(); + virtual void setDisplayTile(int id); + virtual void setDisplayData(int data); + virtual void setDisplayOffset(int offset); + virtual bool hasCustomDisplay(); + virtual void setCustomDisplay(bool value); + virtual void setCustomName(const wstring &name); + virtual wstring getAName(); + virtual bool hasCustomName(); + virtual wstring getCustomName(); }; diff --git a/Minecraft.World/MinecartChest.cpp b/Minecraft.World/MinecartChest.cpp new file mode 100644 index 00000000..af137826 --- /dev/null +++ b/Minecraft.World/MinecartChest.cpp @@ -0,0 +1,51 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.network.packet.h" +#include "MinecartChest.h" + +MinecartChest::MinecartChest(Level *level) : MinecartContainer(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +MinecartChest::MinecartChest(Level *level, double x, double y, double z) : MinecartContainer(level, x, y, z) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +// 4J Added +int MinecartChest::getContainerType() +{ + return ContainerOpenPacket::MINECART_CHEST; +} + +void MinecartChest::destroy(DamageSource *source) +{ + MinecartContainer::destroy(source); + + spawnAtLocation(Tile::chest_Id, 1, 0); +} + +unsigned int MinecartChest::getContainerSize() +{ + return 9 * 3; +} + +int MinecartChest::getType() +{ + return TYPE_CHEST; +} + +Tile *MinecartChest::getDefaultDisplayTile() +{ + return Tile::chest; +} + +int MinecartChest::getDefaultDisplayOffset() +{ + return 8; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartChest.h b/Minecraft.World/MinecartChest.h new file mode 100644 index 00000000..5eccb7e6 --- /dev/null +++ b/Minecraft.World/MinecartChest.h @@ -0,0 +1,23 @@ +#pragma once + +#include "MinecartContainer.h" + +class MinecartChest : public MinecartContainer +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_CHEST; }; + static Entity *create(Level *level) { return new MinecartChest(level); } + +public: + MinecartChest(Level *level); + MinecartChest(Level *level, double x, double y, double z); + + // 4J added + virtual int getContainerType(); + + virtual void destroy(DamageSource *source); + virtual unsigned int getContainerSize(); + virtual int getType(); + virtual Tile *getDefaultDisplayTile(); + virtual int getDefaultDisplayOffset(); +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartContainer.cpp b/Minecraft.World/MinecartContainer.cpp new file mode 100644 index 00000000..61d0d32b --- /dev/null +++ b/Minecraft.World/MinecartContainer.cpp @@ -0,0 +1,233 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.inventory.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "MinecartContainer.h" + +void MinecartContainer::_init() +{ + items = ItemInstanceArray(9 * 4); + dropEquipment = true; + + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +MinecartContainer::MinecartContainer(Level *level) : Minecart(level) +{ + _init(); +} + +MinecartContainer::MinecartContainer(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + _init(); +} + +void MinecartContainer::destroy(DamageSource *source) +{ + Minecart::destroy(source); + + for (int i = 0; i < getContainerSize(); i++) + { + shared_ptr item = getItem(i); + if (item != NULL) + { + float xo = random->nextFloat() * 0.8f + 0.1f; + float yo = random->nextFloat() * 0.8f + 0.1f; + float zo = random->nextFloat() * 0.8f + 0.1f; + + while (item->count > 0) + { + int count = random->nextInt(21) + 10; + if (count > item->count) count = item->count; + item->count -= count; + + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()))) ); + float pow = 0.05f; + itemEntity->xd = (float) random->nextGaussian() * pow; + itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; + itemEntity->zd = (float) random->nextGaussian() * pow; + level->addEntity(itemEntity); + } + } + } +} + +shared_ptr MinecartContainer::getItem(unsigned int slot) +{ + return items[slot]; +} + +shared_ptr MinecartContainer::removeItem(unsigned int slot, int count) +{ + if (items[slot] != NULL) + { + if (items[slot]->count <= count) + { + shared_ptr item = items[slot]; + items[slot] = nullptr; + return item; + } + else + { + shared_ptr i = items[slot]->remove(count); + if (items[slot]->count == 0) items[slot] = nullptr; + return i; + } + } + return nullptr; +} + +shared_ptr MinecartContainer::removeItemNoUpdate(int slot) +{ + if (items[slot] != NULL) + { + shared_ptr item = items[slot]; + items[slot] = nullptr; + return item; + } + return nullptr; +} + +void MinecartContainer::setItem(unsigned int slot, shared_ptr item) +{ + items[slot] = item; + if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); +} + +void MinecartContainer::setChanged() +{ +} + +bool MinecartContainer::stillValid(shared_ptr player) +{ + if (removed) return false; + if (player->distanceToSqr(shared_from_this()) > 8 * 8) return false; + return true; +} + +void MinecartContainer::startOpen() +{ +} + +void MinecartContainer::stopOpen() +{ +} + +bool MinecartContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + +wstring MinecartContainer::getName() +{ + return hasCustomName() ? getCustomName() : app.GetString(IDS_CONTAINER_MINECART); +} + +int MinecartContainer::getMaxStackSize() +{ + return Container::LARGE_MAX_STACK_SIZE; +} + +void MinecartContainer::changeDimension(int i) +{ + dropEquipment = false; + Minecart::changeDimension(i); +} + +void MinecartContainer::remove() +{ + if (dropEquipment) + { + for (int i = 0; i < getContainerSize(); i++) + { + shared_ptr item = getItem(i); + if (item != NULL) + { + float xo = random->nextFloat() * 0.8f + 0.1f; + float yo = random->nextFloat() * 0.8f + 0.1f; + float zo = random->nextFloat() * 0.8f + 0.1f; + + while (item->count > 0) + { + int count = random->nextInt(21) + 10; + if (count > item->count) count = item->count; + item->count -= count; + + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue())))); + + if (item->hasTag()) + { + itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); + } + + float pow = 0.05f; + itemEntity->xd = (float) random->nextGaussian() * pow; + itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; + itemEntity->zd = (float) random->nextGaussian() * pow; + level->addEntity(itemEntity); + } + } + } + } + + Minecart::remove(); +} + +void MinecartContainer::addAdditonalSaveData(CompoundTag *base) +{ + Minecart::addAdditonalSaveData(base); + + ListTag *listTag = new ListTag(); + + for (int i = 0; i < items.length; i++) + { + if (items[i] != NULL) + { + CompoundTag *tag = new CompoundTag(); + tag->putByte(L"Slot", (byte) i); + items[i]->save(tag); + listTag->add(tag); + } + } + base->put(L"Items", listTag); +} + +void MinecartContainer::readAdditionalSaveData(CompoundTag *base) +{ + Minecart::readAdditionalSaveData(base); + + ListTag *inventoryList = (ListTag *) base->getList(L"Items"); + delete [] items.data; + items = ItemInstanceArray(getContainerSize()); + for (int i = 0; i < inventoryList->size(); i++) + { + CompoundTag *tag = inventoryList->get(i); + int slot = tag->getByte(L"Slot") & 0xff; + if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); + } +} + +bool MinecartContainer::interact(shared_ptr player) +{ + if (!level->isClientSide) + { + player->openContainer( dynamic_pointer_cast(shared_from_this())); + } + + return true; +} + +void MinecartContainer::applyNaturalSlowdown() +{ + shared_ptr container = dynamic_pointer_cast(shared_from_this()); + int emptiness = Redstone::SIGNAL_MAX - AbstractContainerMenu::getRedstoneSignalFromContainer(container); + float keep = 0.98f + (emptiness * 0.001f); + + xd *= keep; + yd *= 0; + zd *= keep; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartContainer.h b/Minecraft.World/MinecartContainer.h new file mode 100644 index 00000000..89517658 --- /dev/null +++ b/Minecraft.World/MinecartContainer.h @@ -0,0 +1,48 @@ +#pragma once + +#include "Minecart.h" +#include "Container.h" + +class MinecartContainer : public Minecart, public virtual Container +{ +private: + ItemInstanceArray items; + bool dropEquipment; + + void _init(); + +public: + MinecartContainer(Level *level); + MinecartContainer(Level *level, double x, double y, double z); + + virtual void destroy(DamageSource *source); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual void setChanged(); + virtual bool stillValid(shared_ptr player); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual wstring getName(); + virtual int getMaxStackSize(); + virtual void changeDimension(int i); + virtual void remove(); + +protected: + virtual void addAdditonalSaveData(CompoundTag *base); + virtual void readAdditionalSaveData(CompoundTag *base); + +public: + virtual bool interact(shared_ptr player); + +protected: + virtual void applyNaturalSlowdown(); + +public: + + // 4J Stu - For container + virtual bool hasCustomName() { return Minecart::hasCustomName(); } + virtual wstring getCustomName() { return Minecart::getCustomName(); } +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartFurnace.cpp b/Minecraft.World/MinecartFurnace.cpp new file mode 100644 index 00000000..24950d5c --- /dev/null +++ b/Minecraft.World/MinecartFurnace.cpp @@ -0,0 +1,179 @@ +#include "stdafx.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.network.packet.h" +#include "MinecartFurnace.h" + +MinecartFurnace::MinecartFurnace(Level *level) : Minecart(level) +{ + defineSynchedData(); + + fuel = 0; + xPush = zPush = 0.0f; +} + +MinecartFurnace::MinecartFurnace(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + defineSynchedData(); + + fuel = 0; + xPush = zPush = 0.0f; +} + +// 4J Added +int MinecartFurnace::getContainerType() +{ + return ContainerOpenPacket::MINECART_HOPPER; +} + +int MinecartFurnace::getType() +{ + return TYPE_FURNACE; +} + +void MinecartFurnace::defineSynchedData() +{ + Minecart::defineSynchedData(); + entityData->define(DATA_ID_FUEL, (byte) 0); +} + +void MinecartFurnace::tick() +{ + Minecart::tick(); + + if (fuel > 0) + { + fuel--; + } + if (fuel <= 0) + { + xPush = zPush = 0; + } + setHasFuel(fuel > 0); + + if (hasFuel() && random->nextInt(4) == 0) + { + level->addParticle(eParticleType_largesmoke, x, y + 0.8, z, 0, 0, 0); + } +} + +void MinecartFurnace::destroy(DamageSource *source) +{ + Minecart::destroy(source); + + if (!source->isExplosion()) + { + spawnAtLocation(shared_ptr(new ItemInstance(Tile::furnace, 1)), 0); + } +} + +void MinecartFurnace::moveAlongTrack(int xt, int yt, int zt, double maxSpeed, double slideSpeed, int tile, int data) +{ + Minecart::moveAlongTrack(xt, yt, zt, maxSpeed, slideSpeed, tile, data); + + double sd = xPush * xPush + zPush * zPush; + if (sd > 0.01 * 0.01 && xd * xd + zd * zd > 0.001) + { + sd = Mth::sqrt(sd); + xPush /= sd; + zPush /= sd; + + if (xPush * xd + zPush * zd < 0) + { + xPush = 0; + zPush = 0; + } + else + { + xPush = xd; + zPush = zd; + } + } +} + +void MinecartFurnace::applyNaturalSlowdown() +{ + double sd = xPush * xPush + zPush * zPush; + + if (sd > 0.01 * 0.01) + { + sd = Mth::sqrt(sd); + xPush /= sd; + zPush /= sd; + double speed = 0.05; + xd *= 0.8f; + yd *= 0; + zd *= 0.8f; + xd += xPush * speed; + zd += zPush * speed; + } + else + { + xd *= 0.98f; + yd *= 0; + zd *= 0.98f; + } + + Minecart::applyNaturalSlowdown(); +} + +bool MinecartFurnace::interact(shared_ptr player) +{ + shared_ptr selected = player->inventory->getSelected(); + if (selected != NULL && selected->id == Item::coal_Id) + { + if (!player->abilities.instabuild && --selected->count == 0) player->inventory->setItem(player->inventory->selected, nullptr); + fuel += SharedConstants::TICKS_PER_SECOND * 180; + + } + xPush = x - player->x; + zPush = z - player->z; + + return true; +} + +void MinecartFurnace::addAdditonalSaveData(CompoundTag *base) +{ + Minecart::addAdditonalSaveData(base); + base->putDouble(L"PushX", xPush); + base->putDouble(L"PushZ", zPush); + base->putShort(L"Fuel", (short) fuel); +} + +void MinecartFurnace::readAdditionalSaveData(CompoundTag *base) +{ + Minecart::readAdditionalSaveData(base); + xPush = base->getDouble(L"PushX"); + zPush = base->getDouble(L"PushZ"); + fuel = base->getShort(L"Fuel"); +} + +bool MinecartFurnace::hasFuel() +{ + return (entityData->getByte(DATA_ID_FUEL) & 1) != 0; +} + +void MinecartFurnace::setHasFuel(bool fuel) +{ + if (fuel) + { + entityData->set(DATA_ID_FUEL, (byte) (entityData->getByte(DATA_ID_FUEL) | 1)); + } + else + { + entityData->set(DATA_ID_FUEL, (byte) (entityData->getByte(DATA_ID_FUEL) & ~1)); + } +} + +Tile *MinecartFurnace::getDefaultDisplayTile() +{ + return Tile::furnace_lit; +} + +int MinecartFurnace::getDefaultDisplayData() +{ + return 2; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartFurnace.h b/Minecraft.World/MinecartFurnace.h new file mode 100644 index 00000000..aa8bf9e0 --- /dev/null +++ b/Minecraft.World/MinecartFurnace.h @@ -0,0 +1,51 @@ +#pragma once + +#include "Minecart.h" + +class MinecartFurnace : public Minecart +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_FURNACE; }; + static Entity *create(Level *level) { return new MinecartFurnace(level); } + +private: + static const int DATA_ID_FUEL = 16; + +private: + int fuel; + +public: + double xPush, zPush; + + MinecartFurnace(Level *level); + MinecartFurnace(Level *level, double x, double y, double z); + + // 4J added + virtual int getContainerType(); + + int getType(); + +protected: + void defineSynchedData(); + +public: + void tick(); + void destroy(DamageSource *source); + +protected: + void moveAlongTrack(int xt, int yt, int zt, double maxSpeed, double slideSpeed, int tile, int data); + void applyNaturalSlowdown(); + +public: + bool interact(shared_ptr player); + +protected: + void addAdditonalSaveData(CompoundTag *base); + void readAdditionalSaveData(CompoundTag *base); + bool hasFuel(); + void setHasFuel(bool fuel); + +public: + Tile *getDefaultDisplayTile(); + int getDefaultDisplayData(); +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartHopper.cpp b/Minecraft.World/MinecartHopper.cpp new file mode 100644 index 00000000..8bf02f8f --- /dev/null +++ b/Minecraft.World/MinecartHopper.cpp @@ -0,0 +1,165 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.phys.h" +#include "MinecartHopper.h" + +const int MinecartHopper::MOVE_ITEM_SPEED = HopperTileEntity::MOVE_ITEM_SPEED / 2; + +void MinecartHopper::_init() +{ + enabled = true; + cooldownTime = -1; + + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +MinecartHopper::MinecartHopper(Level *level) : MinecartContainer(level) +{ + _init(); +} + +MinecartHopper::MinecartHopper(Level *level, double x, double y, double z) : MinecartContainer(level, x, y, z) +{ + _init(); +} + +int MinecartHopper::getType() +{ + return TYPE_HOPPER; +} + +Tile *MinecartHopper::getDefaultDisplayTile() +{ + return Tile::hopper; +} + +int MinecartHopper::getDefaultDisplayOffset() +{ + return 1; +} + +unsigned int MinecartHopper::getContainerSize() +{ + return 5; +} + +bool MinecartHopper::interact(shared_ptr player) +{ + if (!level->isClientSide) + { + player->openHopper(dynamic_pointer_cast(shared_from_this())); + } + + return true; +} + +void MinecartHopper::activateMinecart(int xt, int yt, int zt, bool state) +{ + bool newEnabled = !state; + + if (newEnabled != isEnabled()) + { + setEnabled(newEnabled); + } +} + +bool MinecartHopper::isEnabled() +{ + return enabled; +} + +void MinecartHopper::setEnabled(bool enabled) +{ + this->enabled = enabled; +} + +Level *MinecartHopper::getLevel() +{ + return level; +} + +double MinecartHopper::getLevelX() +{ + return x; +} + +double MinecartHopper::getLevelY() +{ + return y; +} + +double MinecartHopper::getLevelZ() +{ + return z; +} + +void MinecartHopper::tick() +{ + MinecartContainer::tick(); + + if (!level->isClientSide && isAlive() && isEnabled()) + { + cooldownTime--; + if (!isOnCooldown()) + { + setCooldown(0); + + if (suckInItems()) + { + setCooldown(MOVE_ITEM_SPEED); + MinecartContainer::setChanged(); + } + } + } +} + +bool MinecartHopper::suckInItems() +{ + if (HopperTileEntity::suckInItems(this)) return true; + + vector > *items = level->getEntitiesOfClass(typeid(ItemEntity), bb->grow(0.25f, 0, 0.25f), EntitySelector::ENTITY_STILL_ALIVE); + + if (items->size() > 0) + { + HopperTileEntity::addItem( this, dynamic_pointer_cast(items->at(0)) ); + } + delete items; + + return false; +} + +void MinecartHopper::destroy(DamageSource *source) +{ + MinecartContainer::destroy(source); + + spawnAtLocation(Tile::hopper_Id, 1, 0); +} + +void MinecartHopper::addAdditonalSaveData(CompoundTag *base) +{ + MinecartContainer::addAdditonalSaveData(base); + base->putInt(L"TransferCooldown", cooldownTime); +} + +void MinecartHopper::readAdditionalSaveData(CompoundTag *base) +{ + MinecartContainer::readAdditionalSaveData(base); + cooldownTime = base->getInt(L"TransferCooldown"); +} + +void MinecartHopper::setCooldown(int time) +{ + cooldownTime = time; +} + +bool MinecartHopper::isOnCooldown() +{ + return cooldownTime > 0; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartHopper.h b/Minecraft.World/MinecartHopper.h new file mode 100644 index 00000000..874bab6a --- /dev/null +++ b/Minecraft.World/MinecartHopper.h @@ -0,0 +1,64 @@ +#pragma once + +#include "MinecartContainer.h" +#include "Hopper.h" + +class MinecartHopper : public MinecartContainer, public Hopper +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_HOPPER; }; + static Entity *create(Level *level) { return new MinecartHopper(level); } + +public: + static const int MOVE_ITEM_SPEED; + +private: + bool enabled; + int cooldownTime; + + void _init(); + +public: + MinecartHopper(Level *level); + MinecartHopper(Level *level, double x, double y, double z); + + virtual int getType(); + virtual Tile *getDefaultDisplayTile(); + virtual int getDefaultDisplayOffset(); + virtual unsigned int getContainerSize(); + virtual bool interact(shared_ptr player); + virtual void activateMinecart(int xt, int yt, int zt, bool state); + virtual bool isEnabled(); + virtual void setEnabled(bool enabled); + virtual Level *getLevel(); + virtual double getLevelX(); + virtual double getLevelY(); + virtual double getLevelZ(); + virtual void tick(); + virtual bool suckInItems(); + virtual void destroy(DamageSource *source); + +protected: + virtual void addAdditonalSaveData(CompoundTag *base); + virtual void readAdditionalSaveData(CompoundTag *base); + +public: + void setCooldown(int time); + bool isOnCooldown(); + + // 4J For Hopper + virtual shared_ptr getItem(unsigned int slot) { return MinecartContainer::getItem(slot); } + virtual shared_ptr removeItem(unsigned int slot, int count) { return MinecartContainer::removeItem(slot, count); } + virtual shared_ptr removeItemNoUpdate(int slot) { return MinecartContainer::removeItemNoUpdate(slot); } + virtual void setItem(unsigned int slot, shared_ptr item) { MinecartContainer::setItem(slot, item); } + virtual wstring getName() { return MinecartContainer::getName(); } + virtual wstring getCustomName() { return MinecartContainer::getCustomName(); } + virtual bool hasCustomName() { return MinecartContainer::hasCustomName(); } + virtual int getMaxStackSize() { return MinecartContainer::getMaxStackSize(); } + + virtual void setChanged() { MinecartContainer::setChanged(); } + virtual bool stillValid(shared_ptr player) { return MinecartContainer::stillValid(player); } + virtual void startOpen() { MinecartContainer::startOpen(); } + virtual void stopOpen() { MinecartContainer::stopOpen(); } + virtual bool canPlaceItem(int slot, shared_ptr item) { return MinecartContainer::canPlaceItem(slot, item); } +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartItem.cpp b/Minecraft.World/MinecartItem.cpp index 3b062ccf..6100be65 100644 --- a/Minecraft.World/MinecartItem.cpp +++ b/Minecraft.World/MinecartItem.cpp @@ -6,10 +6,68 @@ #include "ItemInstance.h" #include "MinecartItem.h" + +shared_ptr MinecartItem::MinecartDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + // Spawn the minecart 'just' outside the dispenser, it overlaps 2 'pixels' now. + // Also at half-block-height so it can connect with sloped rails + double spawnX = source->getX() + facing->getStepX() * (1 + 2.0f / 16); + double spawnY = source->getY() + facing->getStepY() * (1 + 2.0f / 16); + double spawnZ = source->getZ() + facing->getStepZ() * (1 + 2.0f / 16); + + int frontX = source->getBlockX() + facing->getStepX(); + int frontY = source->getBlockY() + facing->getStepY(); + int frontZ = source->getBlockZ() + facing->getStepZ(); + int inFront = world->getTile(frontX, frontY, frontZ); + + // 4J: If we're at limit, just dispense item (instead of adding minecart) + if (world->countInstanceOf(eTYPE_MINECART, false) >= Level::MAX_CONSOLE_MINECARTS) + { + outcome = DISPENCED_ITEM; + return defaultDispenseItemBehavior.dispense(source, dispensed); + } + + double yOffset; + if (BaseRailTile::isRail(inFront)) + { + yOffset = 0; + } + else if (inFront == 0 && BaseRailTile::isRail(world->getTile(frontX, frontY - 1, frontZ))) + { + yOffset = -1; + } + else + { + outcome = DISPENCED_ITEM; + return defaultDispenseItemBehavior.dispense(source, dispensed); + } + + outcome = ACTIVATED_ITEM; + + shared_ptr minecart = Minecart::createMinecart(world, spawnX, spawnY + yOffset, spawnZ, ((MinecartItem *) dispensed->getItem())->type); + if (dispensed->hasCustomHoverName()) + { + minecart->setCustomName(dispensed->getHoverName()); + } + world->addEntity(minecart); + + dispensed->remove(1); + return dispensed; +} + +void MinecartItem::MinecartDispenseBehavior::playSound(BlockSource *source) +{ + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); +} + MinecartItem::MinecartItem(int id, int type) : Item(id) { - this->maxStackSize = 1; + maxStackSize = 1; this->type = type; + DispenserTile::REGISTRY.add(this, new MinecartDispenseBehavior()); } bool MinecartItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) @@ -17,13 +75,18 @@ bool MinecartItem::useOn(shared_ptr instance, shared_ptr p // 4J-PB - Adding a test only version to allow tooltips to be displayed int targetType = level->getTile(x, y, z); - if (RailTile::isRail(targetType)) + if (BaseRailTile::isRail(targetType)) { if(!bTestUseOnOnly) { if (!level->isClientSide) { - level->addEntity(shared_ptr( new Minecart(level, x + 0.5f, y + 0.5f, z + 0.5f, type) ) ); + shared_ptr cart = Minecart::createMinecart(level, x + 0.5f, y + 0.5f, z + 0.5f, type); + if (instance->hasCustomHoverName()) + { + cart->setCustomName(instance->getHoverName()); + } + level->addEntity(cart); } instance->count--; } diff --git a/Minecraft.World/MinecartItem.h b/Minecraft.World/MinecartItem.h index c63082a1..ed06ff1f 100644 --- a/Minecraft.World/MinecartItem.h +++ b/Minecraft.World/MinecartItem.h @@ -2,9 +2,23 @@ using namespace std; #include "Item.h" +#include "DefaultDispenseItemBehavior.h" class MinecartItem : public Item { +private: + class MinecartDispenseBehavior : public DefaultDispenseItemBehavior + { + private: + DefaultDispenseItemBehavior defaultDispenseItemBehavior; + + public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); + + protected: + virtual void playSound(BlockSource *source); + }; + public: int type; diff --git a/Minecraft.World/MinecartRideable.cpp b/Minecraft.World/MinecartRideable.cpp new file mode 100644 index 00000000..a006a2bc --- /dev/null +++ b/Minecraft.World/MinecartRideable.cpp @@ -0,0 +1,39 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "MinecartRideable.h" + + +MinecartRideable::MinecartRideable(Level *level) : Minecart(level) +{ + + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +MinecartRideable::MinecartRideable(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +bool MinecartRideable::interact(shared_ptr player) +{ + if (rider.lock() != NULL && rider.lock()->instanceof(eTYPE_PLAYER) && rider.lock() != player) return true; + if (rider.lock() != NULL && rider.lock() != player) return false; + if (!level->isClientSide) + { + player->ride(shared_from_this()); + } + + return true; +} + +int MinecartRideable::getType() +{ + return TYPE_RIDEABLE; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartRideable.h b/Minecraft.World/MinecartRideable.h new file mode 100644 index 00000000..e6156acc --- /dev/null +++ b/Minecraft.World/MinecartRideable.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Minecart.h" + +class MinecartRideable : public Minecart +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_RIDEABLE; }; + static Entity *create(Level *level) { return new MinecartRideable(level); } + +public: + MinecartRideable(Level *level); + MinecartRideable(Level *level, double x, double y, double z); + + virtual bool interact(shared_ptr player); + virtual int getType(); +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartSpawner.cpp b/Minecraft.World/MinecartSpawner.cpp new file mode 100644 index 00000000..3fcd4ef0 --- /dev/null +++ b/Minecraft.World/MinecartSpawner.cpp @@ -0,0 +1,95 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "MinecartSpawner.h" + +MinecartSpawner::MinecartMobSpawner::MinecartMobSpawner(MinecartSpawner *parent) +{ + m_parent = parent; +} + +void MinecartSpawner::MinecartMobSpawner::broadcastEvent(int id) +{ + m_parent->level->broadcastEntityEvent(m_parent->shared_from_this(), (byte) id); +} + +Level *MinecartSpawner::MinecartMobSpawner::getLevel() +{ + return m_parent->level; +} + +int MinecartSpawner::MinecartMobSpawner::getX() +{ + return Mth::floor(m_parent->x); +} + +int MinecartSpawner::MinecartMobSpawner::getY() +{ + return Mth::floor(m_parent->y); +} + +int MinecartSpawner::MinecartMobSpawner::getZ() +{ + return Mth::floor(m_parent->z); +} + +MinecartSpawner::MinecartSpawner(Level *level) : Minecart(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + + spawner = new MinecartMobSpawner(this); +} + +MinecartSpawner::MinecartSpawner(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + + spawner = new MinecartMobSpawner(this); +} + +MinecartSpawner::~MinecartSpawner() +{ + delete spawner; +} + +int MinecartSpawner::getType() +{ + return TYPE_SPAWNER; +} + +Tile *MinecartSpawner::getDefaultDisplayTile() +{ + return Tile::mobSpawner; +} + +void MinecartSpawner::readAdditionalSaveData(CompoundTag *tag) +{ + Minecart::readAdditionalSaveData(tag); + spawner->load(tag); +} + +void MinecartSpawner::addAdditonalSaveData(CompoundTag *tag) +{ + Minecart::addAdditonalSaveData(tag); + spawner->save(tag); +} + +void MinecartSpawner::handleEntityEvent(byte eventId) +{ + spawner->onEventTriggered(eventId); +} + +void MinecartSpawner::tick() +{ + Minecart::tick(); + spawner->tick(); +} + +BaseMobSpawner *MinecartSpawner::getSpawner() +{ + return spawner; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartSpawner.h b/Minecraft.World/MinecartSpawner.h new file mode 100644 index 00000000..a0b7944f --- /dev/null +++ b/Minecraft.World/MinecartSpawner.h @@ -0,0 +1,45 @@ +#pragma once + +#include "Minecart.h" +#include "BaseMobSpawner.h" + +class MinecartSpawner : public Minecart +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_SPAWNER; }; + static Entity *create(Level *level) { return new MinecartSpawner(level); } + +private: + BaseMobSpawner *spawner; + + class MinecartMobSpawner : public BaseMobSpawner + { + private: + MinecartSpawner *m_parent; + + public: + MinecartMobSpawner(MinecartSpawner *parent); + void broadcastEvent(int id); + Level *getLevel(); + int getX(); + int getY(); + int getZ(); + }; + +public: + MinecartSpawner(Level *level); + MinecartSpawner(Level *level, double x, double y, double z); + virtual ~MinecartSpawner(); + + virtual int getType(); + virtual Tile *getDefaultDisplayTile(); + +protected: + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); + +public: + virtual void handleEntityEvent(byte eventId); + virtual void tick(); + virtual BaseMobSpawner *getSpawner(); +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartTNT.cpp b/Minecraft.World/MinecartTNT.cpp new file mode 100644 index 00000000..26cac5cf --- /dev/null +++ b/Minecraft.World/MinecartTNT.cpp @@ -0,0 +1,168 @@ +#include "stdafx.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "MinecartTNT.h" + +void MinecartTNT::_init() +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + + fuse = -1; +} + +MinecartTNT::MinecartTNT(Level *level) : Minecart(level) +{ + _init(); +} + +MinecartTNT::MinecartTNT(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + _init(); +} + +int MinecartTNT::getType() +{ + return TYPE_TNT; +} + +Tile *MinecartTNT::getDefaultDisplayTile() +{ + return Tile::tnt; +} + +void MinecartTNT::tick() +{ + Minecart::tick(); + + if (fuse > 0) + { + fuse--; + level->addParticle(eParticleType_smoke, x, y + 0.5f, z, 0, 0, 0); + } + else if (fuse == 0) + { + explode(xd * xd + zd * zd); + } + + if (horizontalCollision) + { + double speedSqr = xd * xd + zd * zd; + + if (speedSqr >= 0.01f) + { + explode(speedSqr); + } + } +} + +void MinecartTNT::destroy(DamageSource *source) +{ + Minecart::destroy(source); + + double speedSqr = xd * xd + zd * zd; + + if (!source->isExplosion()) + { + spawnAtLocation( shared_ptr( new ItemInstance(Tile::tnt, 1) ), 0); + } + + if (source->isFire() || source->isExplosion() || speedSqr >= 0.01f) + { + explode(speedSqr); + } +} + +void MinecartTNT::explode(double speedSqr) +{ + if (!level->isClientSide) + { + double speed = sqrt(speedSqr); + if (speed > 5) speed = 5; + level->explode(shared_from_this(), x, y, z, (float) (4 + random->nextDouble() * 1.5f * speed), true); + remove(); + } +} + +void MinecartTNT::causeFallDamage(float distance) +{ + if (distance >= 3) + { + float power = distance / 10; + explode(power * power); + } + + Minecart::causeFallDamage(distance); +} + +void MinecartTNT::activateMinecart(int xt, int yt, int zt, bool state) +{ + if (state && fuse < 0) + { + primeFuse(); + } +} + +void MinecartTNT::handleEntityEvent(byte eventId) +{ + if (eventId == EVENT_PRIME) + { + primeFuse(); + } + else + { + Minecart::handleEntityEvent(eventId); + } +} + +void MinecartTNT::primeFuse() +{ + fuse = 80; + + if (!level->isClientSide) + { + level->broadcastEntityEvent(shared_from_this(), EVENT_PRIME); + level->playEntitySound(shared_from_this(), eSoundType_RANDOM_FUSE, 1, 1.0f); + } +} + +int MinecartTNT::getFuse() +{ + return fuse; +} + +bool MinecartTNT::isPrimed() +{ + return fuse > -1; +} + +float MinecartTNT::getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile) +{ + if (isPrimed() && (BaseRailTile::isRail(tile->id) || BaseRailTile::isRail(level, x, y + 1, z))) + { + return 0; + } + + return Minecart::getTileExplosionResistance(explosion, level, x, y, z, tile); +} + +bool MinecartTNT::shouldTileExplode(Explosion *explosion, Level *level, int x, int y, int z, int id, float power) +{ + if (isPrimed() && (BaseRailTile::isRail(id) || BaseRailTile::isRail(level, x, y + 1, z))) return false; + + return Minecart::shouldTileExplode(explosion, level, x, y, z, id, power); +} + +void MinecartTNT::readAdditionalSaveData(CompoundTag *tag) +{ + Minecart::readAdditionalSaveData(tag); + if (tag->contains(L"TNTFuse")) fuse = tag->getInt(L"TNTFuse"); +} + +void MinecartTNT::addAdditonalSaveData(CompoundTag *tag) +{ + Minecart::addAdditonalSaveData(tag); + tag->putInt(L"TNTFuse", fuse); +} \ No newline at end of file diff --git a/Minecraft.World/MinecartTNT.h b/Minecraft.World/MinecartTNT.h new file mode 100644 index 00000000..8637803c --- /dev/null +++ b/Minecraft.World/MinecartTNT.h @@ -0,0 +1,43 @@ +#pragma once + +#include "Minecart.h" + +class MinecartTNT : public Minecart +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_TNT; }; + static Entity *create(Level *level) { return new MinecartTNT(level); } + +private: + static const byte EVENT_PRIME = 10; + + int fuse; + + void _init(); + +public: + MinecartTNT(Level *level); + MinecartTNT(Level *level, double x, double y, double z); + + virtual int getType(); + virtual Tile *getDefaultDisplayTile(); + virtual void tick(); + virtual void destroy(DamageSource *source); + +protected: + virtual void explode(double speedSqr); + virtual void causeFallDamage(float distance); + +public: + virtual void activateMinecart(int xt, int yt, int zt, bool state); + virtual void handleEntityEvent(byte eventId); + virtual void primeFuse(); + virtual int getFuse(); + virtual bool isPrimed(); + virtual float getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile); + virtual bool shouldTileExplode(Explosion *explosion, Level *level, int x, int y, int z, int id, float power); + +protected: + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); +}; \ No newline at end of file diff --git a/Minecraft.World/Minecraft.World.cpp b/Minecraft.World/Minecraft.World.cpp index 30495443..1ee6eb47 100644 --- a/Minecraft.World/Minecraft.World.cpp +++ b/Minecraft.World/Minecraft.World.cpp @@ -1,43 +1,21 @@ #include "stdafx.h" -#include "Packet.h" -#include "MaterialColor.h" -#include "Material.h" -#include "Tile.h" -#include "HatchetItem.h" -#include "PickaxeItem.h" -#include "ShovelItem.h" -#include "BlockReplacements.h" -#include "Biome.h" -#include "Item.h" -#include "FurnaceRecipes.h" -#include "Recipes.h" -#include "Stats.h" -#include "Achievements.h" -#include "Skeleton.h" -#include "PigZombie.h" -#include "TileEntity.h" -#include "EntityIO.h" -#include "SharedConstants.h" -#include "MobCategory.h" -#include "LevelChunk.h" -#include "MineShaftPieces.h" -#include "StrongholdFeature.h" -#include "VillageFeature.h" -#include "LevelType.h" -#include "EnderMan.h" -#include "PotionBrewing.h" -#include "Enchantment.h" -#include "VillagePieces.h" -#include "RandomScatteredLargeFeature.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.item.alchemy.h" +#include "net.minecraft.world.item.crafting.h" +#include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.level.chunk.h" +#include "net.minecraft.world.level.chunk.storage.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.entity.npc.h" +#include "net.minecraft.world.effect.h" #include "Minecraft.World.h" #include "..\Minecraft.Client\ServerLevel.h" -#include "SparseLightStorage.h" -#include "SparseDataStorage.h" -#include "McRegionChunkStorage.h" -#include "Villager.h" -#include "LevelSettings.h" #ifdef _DURANGO #include "DurangoStats.h" @@ -60,7 +38,8 @@ void MinecraftWorld_RunStaticCtors() PickaxeItem::staticCtor(); ShovelItem::staticCtor(); BlockReplacements::staticCtor(); - Biome::staticCtor(); + Biome::staticCtor(); + MobEffect::staticCtor(); Item::staticCtor(); FurnaceRecipes::staticCtor(); Recipes::staticCtor(); @@ -71,8 +50,6 @@ void MinecraftWorld_RunStaticCtors() Stats::staticCtor(); #endif //Achievements::staticCtor(); // 4J Stu - This is now called from within the Stats::staticCtor() - Skeleton::staticCtor(); - PigZombie::staticCtor(); TileEntity::staticCtor(); EntityIO::staticCtor(); MobCategory::staticCtor(); @@ -82,11 +59,15 @@ void MinecraftWorld_RunStaticCtors() LevelType::staticCtor(); - MineShaftPieces::staticCtor(); - StrongholdFeature::staticCtor(); - VillagePieces::Smithy::staticCtor(); - VillageFeature::staticCtor(); - RandomScatteredLargeFeature::staticCtor(); + { + StructureFeatureIO::staticCtor(); + + MineShaftPieces::staticCtor(); + StrongholdFeature::staticCtor(); + VillagePieces::Smithy::staticCtor(); + VillageFeature::staticCtor(); + RandomScatteredLargeFeature::staticCtor(); + } } EnderMan::staticCtor(); PotionBrewing::staticCtor(); @@ -101,4 +82,5 @@ void MinecraftWorld_RunStaticCtors() McRegionChunkStorage::staticCtor(); Villager::staticCtor(); GameType::staticCtor(); + BeaconTileEntity::staticCtor(); } diff --git a/Minecraft.World/Minecraft.World.vcxproj b/Minecraft.World/Minecraft.World.vcxproj index 5146b56c..eeef292f 100644 --- a/Minecraft.World/Minecraft.World.vcxproj +++ b/Minecraft.World/Minecraft.World.vcxproj @@ -17,6 +17,10 @@ ContentPackage_NO_TU PSVita + + ContentPackage_NO_TU + Win32 + ContentPackage_NO_TU x64 @@ -41,6 +45,10 @@ CONTENTPACKAGE_SYMBOLS PSVita + + CONTENTPACKAGE_SYMBOLS + Win32 + CONTENTPACKAGE_SYMBOLS x64 @@ -65,6 +73,10 @@ ContentPackage_Vita PSVita + + ContentPackage_Vita + Win32 + ContentPackage_Vita x64 @@ -89,6 +101,10 @@ ContentPackage PSVita + + ContentPackage + Win32 + ContentPackage x64 @@ -113,6 +129,10 @@ Debug PSVita + + Debug + Win32 + Debug x64 @@ -137,6 +157,10 @@ ReleaseForArt PSVita + + ReleaseForArt + Win32 + ReleaseForArt x64 @@ -161,6 +185,10 @@ Release PSVita + + Release + Win32 + Release x64 @@ -179,7 +207,6 @@ SAK SAK title - 10.0 @@ -232,7 +259,11 @@ StaticLibrary MultiByte v143 - 10.0 + + + StaticLibrary + MultiByte + v143 StaticLibrary @@ -243,13 +274,22 @@ StaticLibrary MultiByte v143 - 10.0 + + + StaticLibrary + MultiByte + v143 StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary Unicode @@ -323,21 +363,41 @@ MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary Unicode @@ -361,7 +421,7 @@ StaticLibrary MultiByte - v110 + v143 Clang @@ -424,15 +484,24 @@ + + + + + + + + + @@ -478,15 +547,27 @@ + + + + + + + + + + + + @@ -518,7 +599,7 @@ $(OutDir)$(ProjectName).lib - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) $(OutDir)$(ProjectName).lib @@ -530,7 +611,7 @@ $(OutDir)$(ProjectName).lib - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) $(OutDir)$(ProjectName).lib @@ -542,6 +623,12 @@ $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64headers;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)..\Minecraft.Client\Durango\DurangoExtras;$(ProjectDir)\x64headers;$(Console_SdkIncludeRoot) @@ -558,12 +645,24 @@ $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64headers;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64headers;$(IncludePath) $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64headers;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)..\Minecraft.Client\Durango\DurangoExtras;$(ProjectDir)\x64headers;$(Console_SdkIncludeRoot) @@ -602,7 +701,7 @@ $(OutDir)$(ProjectName).lib - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) $(OutDir)$(ProjectName).lib @@ -633,24 +732,46 @@ $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) $(ProjectDir)\$(Configuration)\ $(ProjectDir)\$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64headers;$(Console_SdkIncludeRoot) @@ -1016,6 +1137,28 @@ true + + + Use + Level3 + ProgramDatabase + Disabled + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + true + false + false + true + Default + + + true + + Use @@ -1026,7 +1169,7 @@ true $(OutDir)$(ProjectName).pch MultiThreadedDebugDLL - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_DEBUG;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_DEBUG;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions) Disabled true false @@ -1067,6 +1210,29 @@ true + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + true + false + false + true + Default + Speed + + + true + + Use @@ -1090,6 +1256,29 @@ true + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + true + false + false + true + Default + Speed + + + true + + Use @@ -1414,6 +1603,7 @@ true Level2 Branchless2 + Cpp11 true @@ -1494,6 +1684,29 @@ true + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;NDEBUG;_XBOX;_LIB;_CONTENT_PACKAGE;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + + + true + true + true + + Level3 @@ -1517,6 +1730,29 @@ true + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;NDEBUG;_XBOX;_LIB;_CONTENT_PACKAGE;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + + + true + true + true + + Level3 @@ -1540,6 +1776,29 @@ true + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;NDEBUG;_XBOX;_LIB;_CONTENT_PACKAGE;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + + + true + true + true + + Level3 @@ -1563,6 +1822,29 @@ true + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;NDEBUG;_XBOX;_LIB;_CONTENT_PACKAGE;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + + + true + true + true + + Level3 @@ -1770,7 +2052,9 @@ Document + + @@ -1780,6 +2064,7 @@ + @@ -1795,7 +2080,9 @@ + + @@ -1805,20 +2092,32 @@ - + + + + + + + + + + + + + @@ -1832,6 +2131,8 @@ + + @@ -1839,7 +2140,47 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1878,6 +2219,8 @@ + + @@ -1887,50 +2230,6 @@ - - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - @@ -1938,6 +2237,8 @@ + + @@ -1945,6 +2246,7 @@ + @@ -1978,8 +2280,10 @@ true true true + true + @@ -2001,9 +2305,12 @@ + + + @@ -2013,7 +2320,9 @@ + + @@ -2025,6 +2334,7 @@ + @@ -2040,7 +2350,12 @@ + + + + + @@ -2055,13 +2370,37 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + @@ -2069,6 +2408,7 @@ + @@ -2076,6 +2416,7 @@ + @@ -2084,72 +2425,107 @@ - + + - - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2162,6 +2538,8 @@ false + + @@ -2172,14 +2550,12 @@ - - @@ -2260,8 +2636,7 @@ - - + @@ -2330,7 +2705,7 @@ - + @@ -2386,9 +2761,9 @@ - + - + @@ -2457,7 +2832,7 @@ - + @@ -2477,7 +2852,7 @@ - + @@ -2542,16 +2917,66 @@ - + - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + - + @@ -2584,7 +3009,7 @@ - + @@ -2614,7 +3039,6 @@ - @@ -2669,7 +3093,6 @@ - @@ -2709,6 +3132,7 @@ + @@ -2723,7 +3147,9 @@ + + @@ -2732,17 +3158,27 @@ - + + + + + + + + + + + @@ -2759,14 +3195,50 @@ + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2801,9 +3273,12 @@ false + false false false + false false + false false false @@ -2817,12 +3292,37 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2837,51 +3337,6 @@ - - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - @@ -2895,7 +3350,10 @@ + + + true true @@ -2926,21 +3384,47 @@ true true true + true true + true true + true true + true true + true true + true true + true + + + + + + + + + + + + + + + + + + + @@ -3044,7 +3528,7 @@ - + @@ -3057,7 +3541,7 @@ - + @@ -3066,8 +3550,8 @@ - - + + @@ -3086,7 +3570,7 @@ - + @@ -3111,6 +3595,7 @@ + @@ -3118,6 +3603,9 @@ + + + false @@ -3139,13 +3627,11 @@ - - @@ -3180,7 +3666,7 @@ - + @@ -3235,9 +3721,9 @@ - + - + @@ -3276,9 +3762,12 @@ false + false false false + false false + false false false @@ -3290,7 +3779,7 @@ - + @@ -3320,9 +3809,13 @@ true true true + true true + true true + true true + true true true true @@ -3338,9 +3831,12 @@ true true true + true true true + true true + true true true true @@ -3365,9 +3861,13 @@ true true true + true true + true true + true true + true true true true @@ -3383,9 +3883,12 @@ true true true + true true true + true true + true true true true @@ -3410,9 +3913,13 @@ true true true + true true + true true + true true + true true true true @@ -3428,9 +3935,12 @@ true true true + true true true + true true + true true true true @@ -3464,7 +3974,7 @@ - + @@ -3481,9 +3991,13 @@ true true true + true true + true true + true true + true true true true @@ -3499,9 +4013,12 @@ true true true + true true true + true true + true true true true @@ -3550,14 +4067,64 @@ - + - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + - + @@ -3593,7 +4160,7 @@ - + @@ -3606,9 +4173,12 @@ false + false false false + false false + false false false @@ -3628,9 +4198,12 @@ true true true + true true true + true true + true true true true @@ -3646,9 +4219,13 @@ true true true + true true + true true + true true + true true true true @@ -3675,7 +4252,6 @@ - @@ -3692,9 +4268,12 @@ Create Create Create + Create Create Create + Create Create + Create Create Create Create @@ -3710,18 +4289,25 @@ Create Create Create + Create Create + Create Create + Create Create + Create Create Create Create Create Create false + false false false + false false + false false false Create @@ -3796,7 +4382,6 @@ - @@ -3837,9 +4422,13 @@ true true true + true true + true true + true true + true true true true @@ -3855,9 +4444,12 @@ true true true + true true true + true true + true true true true @@ -3882,9 +4474,13 @@ true true true + true true + true true + true true + true true true true @@ -3900,9 +4496,12 @@ true true true + true true true + true true + true true true true @@ -3927,9 +4526,13 @@ true true true + true true + true true + true true + true true true true @@ -3945,9 +4548,12 @@ true true true + true true true + true true + true true true true @@ -3960,8 +4566,7 @@ - - + diff --git a/Minecraft.World/Minecraft.World.vcxproj.filters b/Minecraft.World/Minecraft.World.vcxproj.filters index eb5e4a8c..bf872596 100644 --- a/Minecraft.World/Minecraft.World.vcxproj.filters +++ b/Minecraft.World/Minecraft.World.vcxproj.filters @@ -39,9 +39,6 @@ {0a1baf2e-2c84-488f-afd0-f5ddba3ac849} - - {bf44f635-1f68-4c61-a946-acc2cca87955} - {b734aa5c-6770-4181-b8ab-e86980054dca} @@ -54,24 +51,6 @@ {b17885f1-37c1-481f-94b1-a74f0c886b29} - - {6252deb7-1b31-4ba0-83b7-db11fa2123eb} - - - {0954c9e3-8650-4c2c-b51c-1ab9a4476b14} - - - {1152442e-07f2-4ec9-85c0-7e3b040eee40} - - - {0023db14-c89d-4ce1-b0d3-b4d83c742c35} - - - {becb642b-be13-43a9-90e2-61d563c35682} - - - {be720f83-accf-4b92-8831-c890ef2fa69d} - {c29b0728-1151-40d1-ae10-4b5d1bd136cd} @@ -147,15 +126,6 @@ {2ac6971f-ddc3-438b-921a-315ea5e3ad5a} - - {a81770a3-9c91-487b-9321-e39f63998514} - - - {5abf2525-8223-4c6b-bb6b-5c9446334868} - - - {24e2f412-a3f1-447a-bbea-7aa6561a93eb} - {05f1cf3e-10f1-40a0-a72d-99bdd4d783d4} @@ -174,6 +144,51 @@ {c87ae9ac-b823-48e4-b007-39d45aff76e6} + + {e61b6eae-3e06-4649-86f6-ab1a6624833f} + + + {e43a9174-9dbd-4e7d-8aa0-7609d879b0e3} + + + {3cc9bf7f-fcf2-4819-85ea-3cdf5bbea411} + + + {1aaaae5f-20f2-4dea-9182-c5263a8085a6} + + + {5a6edf15-80d1-4d0f-b1a9-17073737227c} + + + {bf44f635-1f68-4c61-a946-acc2cca87955} + + + {6252deb7-1b31-4ba0-83b7-db11fa2123eb} + + + {0954c9e3-8650-4c2c-b51c-1ab9a4476b14} + + + {1152442e-07f2-4ec9-85c0-7e3b040eee40} + + + {0023db14-c89d-4ce1-b0d3-b4d83c742c35} + + + {becb642b-be13-43a9-90e2-61d563c35682} + + + {be720f83-accf-4b92-8831-c890ef2fa69d} + + + {a81770a3-9c91-487b-9321-e39f63998514} + + + {5abf2525-8223-4c6b-bb6b-5c9446334868} + + + {24e2f412-a3f1-447a-bbea-7aa6561a93eb} + {bd03576a-c1b3-4c04-bc52-d67abed85da4} @@ -183,12 +198,12 @@ {83228256-d4e1-447b-8102-4f824d131ff0} - - {5c2a5df8-8116-4e7e-ae85-c688843e36bc} - {569feaf7-5d52-44fc-883d-87c10196ea2f} + + {5c2a5df8-8116-4e7e-ae85-c688843e36bc} + {c554494b-5cc6-4251-8d1f-c70afdb4ba2d} @@ -198,17 +213,26 @@ {19721528-fc70-4673-8183-d9329e751555} - - {e61b6eae-3e06-4649-86f6-ab1a6624833f} + + {ef8aa915-dc0f-44c6-8533-1250c461b636} - - {e43a9174-9dbd-4e7d-8aa0-7609d879b0e3} + + {be58a6fd-f674-4c0d-b7e9-94dc4bab4cae} - - {3cc9bf7f-fcf2-4819-85ea-3cdf5bbea411} + + {d5c9e9a6-4945-40d7-8b19-f9c53ac83815} - - {1aaaae5f-20f2-4dea-9182-c5263a8085a6} + + {e76a4209-219e-4f30-8758-82af8ea845e2} + + + {b3d1eb81-7216-4d46-b742-3053cee0940b} + + + {8589c074-b333-49e2-bd6e-bb49f7052b70} + + + {fabb7f9b-01fe-446a-ac67-f231110fec0a} @@ -236,6 +260,10 @@ net\minecraft\world\damageSource + + net\minecraft\core + + @@ -553,9 +581,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -565,15 +590,9 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -613,12 +632,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -643,9 +656,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -667,9 +677,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -694,9 +701,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -1003,9 +1007,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -1072,9 +1073,6 @@ net\minecraft\world\level\tile\entity - - net\minecraft\world\item - net\minecraft\world\item @@ -1087,9 +1085,6 @@ net\minecraft\world\item - - net\minecraft\world\item - net\minecraft\world\item @@ -1339,9 +1334,6 @@ net\minecraft\network\packet - - net\minecraft\network\packet - net\minecraft\network\packet @@ -1936,9 +1928,6 @@ net\minecraft\world\level\levelgen\feature - - net\minecraft\world\item - net\minecraft\world\level\biome @@ -1990,9 +1979,6 @@ net\minecraft\world\entity\boss - - net\minecraft\world\entity\boss - net\minecraft\world\entity\boss\enderdragon @@ -2155,9 +2141,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -2203,9 +2186,6 @@ net\minecraft\network\packet - - net\minecraft\world\item - net\minecraft\network\packet @@ -2314,9 +2294,6 @@ net\minecraft\world\entity\ai\navigation - - net\minecraft\world\item - net\minecraft\world\level\biome @@ -2389,9 +2366,6 @@ net\minecraft\world\entity\ai\goal\target - - net\minecraft\world\entity\ai\goal - net\minecraft\world\entity\ai\goal @@ -2446,9 +2420,6 @@ net\minecraft\world\entity\ai\goal - - net\minecraft\world\entity\ai\goal - net\minecraft\world\entity\ai\goal @@ -2503,12 +2474,6 @@ net\minecraft\world\entity - - net\minecraft\world\entity\animal - - - net\minecraft\world\entity\animal - net\minecraft\world\entity\animal @@ -2650,9 +2615,6 @@ net\minecraft\world\entity\ai\goal - - net\minecraft\world\inventory - net\minecraft\world\inventory @@ -2767,131 +2729,590 @@ ConsoleHelpers\ConsoleSaveFileIO - - ConsoleHelpers\ConsoleSaveFileIO - ConsoleHelpers\ConsoleSaveFileIO ConsoleHelpers - - - - Source Files - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\levelgen\synth - - - net\minecraft\world\level\biome - - - net\minecraft\world\level\biome - - - net\minecraft\world\level\biome - - - net\minecraft\world\level\biome - - - net\minecraft\world\level\biome - - - net\minecraft\world\level\biome - - - net\minecraft\world\level\biome - - - net\minecraft\world\level\chunk - - - net\minecraft\world\level\chunk - - - net\minecraft\world\level\chunk - - - net\minecraft\world\level\chunk - - - net\minecraft\world\level\chunk\storage - - - net\minecraft\world\level\chunk\storage - - - com\mojang\nbt - - - com\mojang\nbt - - - net\minecraft\world\level\chunk\storage - - - net\minecraft\world\level\chunk\storage - - - net\minecraft\world\level\chunk\storage - - - net\minecraft\world\level\chunk\storage - - - net\minecraft\world\level\chunk\storage - - - net\minecraft\world\level\chunk\storage - - - net\minecraft\world\level\chunk\storage - - - net\minecraft\world\level\dimension - - - net\minecraft\world\level\dimension - - - net\minecraft\world\level\levelgen\feature - - - net\minecraft\world\level\levelgen\feature - - - net\minecraft\world\level\levelgen\feature - + + net\minecraft\commands\common + + + net\minecraft\commands\common + + + net\minecraft\commands\common + + + net\minecraft\commands\common + + + net\minecraft\commands\common + + + net\minecraft\commands\common + + + net\minecraft\commands\common + + + net\minecraft\commands\common + + + net\minecraft\commands + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\world\damageSource + + + net\minecraft\world\damageSource + + + net\minecraft\world\effect + + + net\minecraft\world\effect + + + net\minecraft\world\effect + + + net\minecraft\world\entity + + + net\minecraft\world\entity + + + net\minecraft\world\entity + + + net\minecraft\world\entity + + + net\minecraft\world\entity + + + net\minecraft\world\entity + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\goal + + + net\minecraft\world\entity\ai\goal + + + net\minecraft\world\entity\ai\goal + + + net\minecraft\world\entity\ambient + + + net\minecraft\world\entity\ambient + + + net\minecraft\world\entity\ambient + + + net\minecraft\world\entity\animal + + + net\minecraft\world\entity\boss + + + net\minecraft\world\entity\boss + + + net\minecraft\world\entity\boss\wither + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\animal + + + net\minecraft\world\entity\monster + + + net\minecraft\world\entity\monster + + + net\minecraft\world\entity\monster + + + net\minecraft\world\entity\projectile + + + net\minecraft\world\entity\projectile + + + net\minecraft\world\entity\projectile + + + net\minecraft\world\entity\projectile + + + net\minecraft\world\scores + + + net\minecraft\world\inventory + + + net\minecraft\world\inventory + + + net\minecraft\world\inventory + + + net\minecraft\world\inventory + + + net\minecraft\world\inventory + + + net\minecraft\world\item\crafting + + + net\minecraft\world\item\crafting + + + net\minecraft\world\item\crafting + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\level\levelgen\flat + + + net\minecraft\world\level\levelgen\flat + + + net\minecraft\world\level\levelgen\flat + + + net\minecraft\world\level\levelgen\structure + + + net\minecraft\world\level\levelgen\structure + + + net\minecraft\world\level\redstone + + + net\minecraft\world\level\redstone + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\world\scores\criteria + + + net\minecraft\world\scores\criteria + + + net\minecraft\world\scores\criteria + + + net\minecraft\world\scores\criteria + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\core + + + net\minecraft\world\level + + + net\minecraft\world\level + + + net\minecraft\world\level + + + net\minecraft\world\entity\item + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\util + + + net\minecraft\world\inventory + + + + + Source Files + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\levelgen\synth + + + net\minecraft\world\level\biome + + + net\minecraft\world\level\biome + + + net\minecraft\world\level\biome + + + net\minecraft\world\level\biome + + + net\minecraft\world\level\biome + + + net\minecraft\world\level\biome + + + net\minecraft\world\level\biome + + + net\minecraft\world\level\chunk + + + net\minecraft\world\level\chunk + + + net\minecraft\world\level\chunk + + + net\minecraft\world\level\chunk + + + net\minecraft\world\level\chunk\storage + + + net\minecraft\world\level\chunk\storage + + + com\mojang\nbt + + + com\mojang\nbt + + + net\minecraft\world\level\chunk\storage + + + net\minecraft\world\level\chunk\storage + + + net\minecraft\world\level\chunk\storage + + + net\minecraft\world\level\chunk\storage + + + net\minecraft\world\level\chunk\storage + + + net\minecraft\world\level\chunk\storage + + + net\minecraft\world\level\chunk\storage + + + net\minecraft\world\level\dimension + + + net\minecraft\world\level\dimension + + + net\minecraft\world\level\levelgen\feature + + + net\minecraft\world\level\levelgen\feature + + + net\minecraft\world\level\levelgen\feature + net\minecraft\world\level\levelgen\feature @@ -3006,9 +3427,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -3018,15 +3436,9 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -3060,16 +3472,10 @@ net\minecraft\world\level\tile - - net\minecraft\world\level - - - net\minecraft\world\level\tile - - - net\minecraft\world\level\tile + + net\minecraft\world\level - + net\minecraft\world\level\tile @@ -3090,9 +3496,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -3111,9 +3514,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -3138,9 +3538,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -3375,9 +3772,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -3426,9 +3820,6 @@ net\minecraft\world\level - - net\minecraft\world\item - net\minecraft\world\item @@ -3441,9 +3832,6 @@ net\minecraft\world\item - - net\minecraft\world\item - net\minecraft\world\item @@ -3666,9 +4054,6 @@ net\minecraft\network\packet - - net\minecraft\network\packet - net\minecraft\network\packet @@ -3828,9 +4213,6 @@ net\minecraft\util - - net\minecraft\world - net\minecraft\world\entity @@ -4194,9 +4576,6 @@ net\minecraft\world\level\levelgen\feature - - net\minecraft\world\item - net\minecraft\world\level\biome @@ -4239,12 +4618,6 @@ net\minecraft\world\entity\animal - - net\minecraft\world\entity\boss - - - net\minecraft\world\entity\boss - net\minecraft\world\entity\boss\enderdragon @@ -4350,9 +4723,6 @@ net\minecraft\world\level\tile - - net\minecraft\world\level\tile - net\minecraft\world\level\tile @@ -4509,9 +4879,6 @@ net\minecraft\world\entity\ai\navigation - - net\minecraft\world\item - net\minecraft\world\level\biome @@ -4536,9 +4903,6 @@ net\minecraft\world\entity - - net\minecraft\world\item - net\minecraft\world @@ -4578,9 +4942,6 @@ net\minecraft\world\entity\ai\goal\target - - net\minecraft\world\entity\ai\goal - net\minecraft\world\entity\ai\goal @@ -4635,9 +4996,6 @@ net\minecraft\world\entity\ai\goal - - net\minecraft\world\entity\ai\goal - net\minecraft\world\entity\ai\goal @@ -4683,12 +5041,6 @@ net\minecraft\world\entity - - net\minecraft\world\entity\animal - - - net\minecraft\world\entity\animal - net\minecraft\world\entity\animal @@ -4812,9 +5164,6 @@ net\minecraft\world\entity\ai\goal - - net\minecraft\world\inventory - net\minecraft\world\inventory @@ -4914,14 +5263,368 @@ ConsoleHelpers\ConsoleSaveFileIO - - ConsoleHelpers\ConsoleSaveFileIO - ConsoleHelpers\ConsoleSaveFileIO ConsoleHelpers + + net\minecraft\commands\common + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\network\packet + + + net\minecraft\world\damageSource + + + net\minecraft\world\damageSource + + + net\minecraft\world\effect + + + net\minecraft\world\effect + + + net\minecraft\world\effect + + + net\minecraft\world\entity + + + net\minecraft\world\entity + + + net\minecraft\world\entity + + + net\minecraft\world\entity + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\world\entity\ai\goal + + + net\minecraft\world\entity\ai\goal + + + net\minecraft\world\entity\ai\goal + + + net\minecraft\world\entity\ambient + + + net\minecraft\world\entity\ambient + + + net\minecraft\world\entity\animal + + + net\minecraft\world\entity\boss + + + net\minecraft\world\entity\boss\wither + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\item + + + net\minecraft\world\entity\animal + + + net\minecraft\world\entity\monster + + + net\minecraft\world\entity\monster + + + net\minecraft\world\entity\projectile + + + net\minecraft\world\entity\projectile + + + net\minecraft\world\entity\projectile + + + net\minecraft\world\inventory + + + net\minecraft\world\inventory + + + net\minecraft\world\inventory + + + net\minecraft\world\inventory + + + net\minecraft\world\inventory + + + net\minecraft\world\item\crafting + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\item + + + net\minecraft\world\level\levelgen\flat + + + net\minecraft\world\level\levelgen\flat + + + net\minecraft\world\level\levelgen\structure + + + net\minecraft\world\level\levelgen\structure + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile\entity + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\core + + + net\minecraft\core + + + net\minecraft\world\scores\criteria + + + net\minecraft\world\scores\criteria + + + net\minecraft\world\scores\criteria + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\world\scores + + + net\minecraft\core + + + net\minecraft\world\level + + + net\minecraft\world\level + + + net\minecraft\world\level + + + net\minecraft\world\entity\item + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\tile + + + net\minecraft\world\level\redstone + + + net\minecraft\world\entity\ai\attributes + + + net\minecraft\util + + + net\minecraft\world\inventory + + + net\minecraft\world\item + \ No newline at end of file diff --git a/Minecraft.World/Mob.cpp b/Minecraft.World/Mob.cpp index d2dcddfb..cac25ddb 100644 --- a/Minecraft.World/Mob.cpp +++ b/Minecraft.World/Mob.cpp @@ -1,8 +1,10 @@ #include "stdafx.h" #include "JavaMath.h" +#include "net.minecraft.network.packet.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.control.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.ai.sensing.h" @@ -16,6 +18,9 @@ #include "net.minecraft.world.effect.h" #include "net.minecraft.world.item.alchemy.h" #include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.h" +#include "..\Minecraft.Client\ServerLevel.h" +#include "..\Minecraft.Client\EntityTracker.h" #include "com.mojang.nbt.h" #include "Mob.h" #include "..\Minecraft.Client\Textures.h" @@ -25,134 +30,63 @@ #include "GenericStats.h" #include "ItemEntity.h" -const double Mob::MIN_MOVEMENT_DISTANCE = 0.005; +const float Mob::MAX_WEARING_ARMOR_CHANCE = 0.15f; +const float Mob::MAX_PICKUP_LOOT_CHANCE = 0.55f; +const float Mob::MAX_ENCHANTED_ARMOR_CHANCE = 0.50f; +const float Mob::MAX_ENCHANTED_WEAPON_CHANCE = 0.25f; void Mob::_init() { - invulnerableDuration = 20; - timeOffs = 0.0f; - - yBodyRot = 0; - yBodyRotO = 0; - yHeadRot = 0; - yHeadRotO = 0; - - oRun = 0.0f; - run = 0.0f; - - animStep = 0.0f; - animStepO = 0.0f; - - MemSect(31); - hasHair = true; - textureIdx = TN_MOB_CHAR; // 4J was L"/mob/char.png"; - allowAlpha = true; - rotOffs = 0; - modelName = L""; - bobStrength = 1; - deathScore = 0; - renderOffset = 0; - MemSect(0); - - walkingSpeed = 0.1f; - flyingSpeed = 0.02f; - - oAttackAnim = 0.0f; - attackAnim = 0.0f; - - lastHealth = 0; - dmgSpill = 0; - ambientSoundTime = 0; - - hurtTime = 0; - hurtDuration = 0; - hurtDir = 0; - deathTime = 0; - attackTime = 0; - oTilt = 0; - tilt = 0; - - dead = false; xpReward = 0; - - modelNum = -1; - animSpeed = (float) (Math::random() * 0.9f + 0.1f); - - walkAnimSpeedO = 0.0f; - walkAnimSpeed = 0.0f; - walkAnimPos = 0.0f; - - lastHurtByPlayer = nullptr; - lastHurtByPlayerTime = 0; - lastHurtByMob = nullptr; - lastHurtByMobTime = 0; - lastHurtMob = nullptr; - - arrowCount = 0; - removeArrowTime = 0; - - lSteps = 0; - lx = ly = lz = lyr = lxr = 0.0; - - fallTime = 0.0f; - - lastHurt = 0; - - noActionTime = 0; - xxa = yya = yRotA = 0.0f; - jumping = false; defaultLookAngle = 0.0f; - runSpeed = 0.7f; - noJumpDelay = 0; - lookingAt = nullptr; lookTime = 0; - - effectsDirty = true; - effectColor = 0; - target = nullptr; sensing = NULL; - speed = 0.0f; - restrictCenter = new Pos(0, 0, 0); - restrictRadius = -1.0f; + equipment = ItemInstanceArray(5); + dropChances = floatArray(5); + for(unsigned int i = 0; i < 5; ++i) + { + equipment[i] = nullptr; + dropChances[i] = 0.0f; + } + + _canPickUpLoot = false; + persistenceRequired = false; + + _isLeashed = false; + leashHolder = nullptr; + leashInfoTag = NULL; } -Mob::Mob( Level* level) : Entity(level) +Mob::Mob( Level* level) : LivingEntity(level) { + MemSect(57); _init(); + MemSect(0); - // 4J Stu - This will not call the correct derived function, so moving to each derived class - //health = getMaxHealth(); - health = 0; - - blocksBuilding = true; + MemSect(58); + // 4J Stu - We call this again in the derived classes, but need to do it here for some internal members + registerAttributes(); + MemSect(0); lookControl = new LookControl(this); moveControl = new MoveControl(this); jumpControl = new JumpControl(this); bodyControl = new BodyControl(this); - navigation = new PathNavigation(this, level, 16); + navigation = new PathNavigation(this, level); sensing = new Sensing(this); - rotA = (float) (Math::random() + 1) * 0.01f; - setPos(x, y, z); - timeOffs = (float) Math::random() * 12398; - yRot = (float) (Math::random() * PI * 2); - yHeadRot = yRot; - - this->footSize = 0.5f; + for (int i = 0; i < 5; i++) + { + dropChances[i] = 0.085f; + } } Mob::~Mob() { - for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ++it) - { - delete it->second; - } - if(lookControl != NULL) delete lookControl; if(moveControl != NULL) delete moveControl; if(jumpControl != NULL) delete jumpControl; @@ -160,7 +94,17 @@ Mob::~Mob() if(navigation != NULL) delete navigation; if(sensing != NULL) delete sensing; - delete restrictCenter; + if(leashInfoTag != NULL) delete leashInfoTag; + + if(equipment.data != NULL) delete [] equipment.data; + delete [] dropChances.data; +} + +void Mob::registerAttributes() +{ + LivingEntity::registerAttributes(); + + getAttributes()->registerAttribute(SharedMonsterAttributes::FOLLOW_RANGE)->setBaseValue(16); } LookControl *Mob::getLookControl() @@ -188,65 +132,12 @@ Sensing *Mob::getSensing() return sensing; } -Random *Mob::getRandom() -{ - return random; -} - -shared_ptr Mob::getLastHurtByMob() -{ - return lastHurtByMob; -} - -shared_ptr Mob::getLastHurtMob() -{ - return lastHurtMob; -} - -void Mob::setLastHurtMob(shared_ptr target) -{ - shared_ptr mob = dynamic_pointer_cast(target); - if (mob != NULL) lastHurtMob = mob; -} - -int Mob::getNoActionTime() -{ - return noActionTime; -} - -float Mob::getYHeadRot() -{ - return yHeadRot; -} - -void Mob::setYHeadRot(float yHeadRot) -{ - this->yHeadRot = yHeadRot; -} - -float Mob::getSpeed() -{ - return speed; -} - -void Mob::setSpeed(float speed) -{ - this->speed = speed; - setYya(speed); -} - -bool Mob::doHurtTarget(shared_ptr target) -{ - setLastHurtMob(target); - return false; -} - -shared_ptr Mob::getTarget() +shared_ptr Mob::getTarget() { return target; } -void Mob::setTarget(shared_ptr target) +void Mob::setTarget(shared_ptr target) { this->target = target; } @@ -261,81 +152,11 @@ void Mob::ate() { } -// might move to navigation, might make area -bool Mob::isWithinRestriction() -{ - return isWithinRestriction(Mth::floor(x), Mth::floor(y), Mth::floor(z)); -} - -bool Mob::isWithinRestriction(int x, int y, int z) -{ - if (restrictRadius == -1) return true; - return restrictCenter->distSqr(x, y, z) < restrictRadius * restrictRadius; -} - -void Mob::restrictTo(int x, int y, int z, int radius) -{ - restrictCenter->set(x, y, z); - restrictRadius = radius; -} - -Pos *Mob::getRestrictCenter() -{ - return restrictCenter; -} - -float Mob::getRestrictRadius() -{ - return restrictRadius; -} - -void Mob::clearRestriction() -{ - restrictRadius = -1; -} - -bool Mob::hasRestriction() -{ - return restrictRadius != -1; -} - -void Mob::setLastHurtByMob(shared_ptr hurtBy) -{ - lastHurtByMob = hurtBy; - lastHurtByMobTime = lastHurtByMob != NULL ? PLAYER_HURT_EXPERIENCE_TIME : 0; -} - void Mob::defineSynchedData() { - entityData->define(DATA_EFFECT_COLOR_ID, effectColor); -} - -bool Mob::canSee(shared_ptr target) -{ - HitResult *hres = level->clip(Vec3::newTemp(x, y + getHeadHeight(), z), Vec3::newTemp(target->x, target->y + target->getHeadHeight(), target->z)); - bool retVal = (hres == NULL); - delete hres; - return retVal; -} - -int Mob::getTexture() -{ - return textureIdx; -} - -bool Mob::isPickable() -{ - return !removed; -} - -bool Mob::isPushable() -{ - return !removed; -} - -float Mob::getHeadHeight() -{ - return bbHeight * 0.85f; + LivingEntity::defineSynchedData(); + entityData->define(DATA_CUSTOM_NAME_VISIBLE, (byte) 0); + entityData->define(DATA_CUSTOM_NAME, L""); } int Mob::getAmbientSoundInterval() @@ -349,15 +170,14 @@ void Mob::playAmbientSound() int ambient = getAmbientSound(); if (ambient != -1) { - level->playSound(shared_from_this(), ambient, getSoundVolume(), getVoicePitch()); + playSound(ambient, getSoundVolume(), getVoicePitch()); } MemSect(0); } void Mob::baseTick() { - oAttackAnim = attackAnim; - Entity::baseTick(); + LivingEntity::baseTick(); if (isAlive() && random->nextInt(1000) < ambientSoundTime++) { @@ -365,126 +185,30 @@ void Mob::baseTick() playAmbientSound(); } +} - if (isAlive() && isInWall()) +int Mob::getExperienceReward(shared_ptr killedBy) +{ + if (xpReward > 0) { - hurt(DamageSource::inWall, 1); - } + int result = xpReward; - if (isFireImmune() || level->isClientSide) clearFire(); - - if (isAlive() && isUnderLiquid(Material::water) && !isWaterMob() && activeEffects.find(MobEffect::waterBreathing->id) == activeEffects.end()) - { - setAirSupply(decreaseAirSupply(getAirSupply())); - if (getAirSupply() == -20) + ItemInstanceArray slots = getEquipmentSlots(); + for (int i = 0; i < slots.length; i++) { - setAirSupply(0); - if(canCreateParticles()) + if (slots[i] != NULL && dropChances[i] <= 1) { - for (int i = 0; i < 8; i++) - { - float xo = random->nextFloat() - random->nextFloat(); - float yo = random->nextFloat() - random->nextFloat(); - float zo = random->nextFloat() - random->nextFloat(); - level->addParticle(eParticleType_bubble, x + xo, y + yo, z + zo, xd, yd, zd); - } + result += 1 + random->nextInt(3); } - hurt(DamageSource::drown, 2); } - clearFire(); - } - else - { - setAirSupply(TOTAL_AIR_SUPPLY); - } - - oTilt = tilt; - - if (attackTime > 0) attackTime--; - if (hurtTime > 0) hurtTime--; - if (invulnerableTime > 0) invulnerableTime--; - if (health <= 0) - { - tickDeath(); + return result; } - - if (lastHurtByPlayerTime > 0) lastHurtByPlayerTime--; else { - // Note - this used to just set to nullptr, but that has to create a new shared_ptr and free an old one, when generally this won't be doing anything at all. This - // is the lightweight but ugly alternative - if( lastHurtByPlayer ) - { - lastHurtByPlayer.reset(); - } + return xpReward; } - if (lastHurtMob != NULL && !lastHurtMob->isAlive()) lastHurtMob = nullptr; - - if (lastHurtByMob != NULL) - { - if (!lastHurtByMob->isAlive()) setLastHurtByMob(nullptr); - else if (lastHurtByMobTime > 0) lastHurtByMobTime--; - else setLastHurtByMob(nullptr); - } - - // update effects - tickEffects(); - - animStepO = animStep; - - yBodyRotO = yBodyRot; - yHeadRotO = yHeadRot; - yRotO = yRot; - xRotO = xRot; } - -void Mob::tickDeath() -{ - deathTime++; - if (deathTime == 20) - { - // 4J Stu - Added level->isClientSide check from 1.2 to fix XP orbs being created client side - if(!level->isClientSide && (lastHurtByPlayerTime > 0 || isAlwaysExperienceDropper()) ) - { - if (!isBaby()) - { - int xpCount = this->getExperienceReward(lastHurtByPlayer); - while (xpCount > 0) - { - int newCount = ExperienceOrb::getExperienceValue(xpCount); - xpCount -= newCount; - level->addEntity(shared_ptr( new ExperienceOrb(level, x, y, z, newCount) ) ); - } - } - } - - remove(); - for (int i = 0; i < 20; i++) - { - double xa = random->nextGaussian() * 0.02; - double ya = random->nextGaussian() * 0.02; - double za = random->nextGaussian() * 0.02; - level->addParticle(eParticleType_explode, x + random->nextFloat() * bbWidth * 2 - bbWidth, y + random->nextFloat() * bbHeight, z + random->nextFloat() * bbWidth * 2 - bbWidth, xa, ya, za); - } - } -} - -int Mob::decreaseAirSupply(int currentSupply) -{ - return currentSupply - 1; -} - -int Mob::getExperienceReward(shared_ptr killedBy) -{ - return xpReward; -} - -bool Mob::isAlwaysExperienceDropper() -{ - return false; -} - void Mob::spawnAnim() { for (int i = 0; i < 20; i++) @@ -498,408 +222,37 @@ void Mob::spawnAnim() } } -void Mob::rideTick() -{ - Entity::rideTick(); - oRun = run; - run = 0; - fallDistance = 0; -} - -void Mob::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) -{ - heightOffset = 0; - lx = x; - ly = y; - lz = z; - lyr = yRot; - lxr = xRot; - - lSteps = steps; -} - -void Mob::superTick() -{ - Entity::tick(); -} - void Mob::tick() { - Entity::tick(); - - if (arrowCount > 0) - { - if (removeArrowTime <= 0) - { - removeArrowTime = 20 * 3; - } - removeArrowTime--; - if (removeArrowTime <= 0) - { - arrowCount--; - } - } - - aiStep(); - - double xd = x - xo; - double zd = z - zo; + LivingEntity::tick(); - float sideDist = xd * xd + zd * zd; - - float yBodyRotT = yBodyRot; - - float walkSpeed = 0; - oRun = run; - float tRun = 0; - if (sideDist <= 0.05f * 0.05f) - { - // animStep = 0; - } - else - { - tRun = 1; - walkSpeed = sqrt(sideDist) * 3; - yBodyRotT = ((float) atan2(zd, xd) * 180 / (float) PI - 90); - } - if (attackAnim > 0) + if (!level->isClientSide) { - yBodyRotT = yRot; + tickLeash(); } - if (!onGround) - { - tRun = 0; - } - run = run + (tRun - run) * 0.3f; - - /* - * float yBodyRotD = yRot-yBodyRot; while (yBodyRotD < -180) yBodyRotD - * += 360; while (yBodyRotD >= 180) yBodyRotD -= 360; yBodyRot += - * yBodyRotD * 0.1f; - */ +} +float Mob::tickHeadTurn(float yBodyRotT, float walkSpeed) +{ if (useNewAi()) { bodyControl->clientTick(); + return walkSpeed; } else { - float yBodyRotD = Mth::wrapDegrees(yBodyRotT - yBodyRot); - yBodyRot += yBodyRotD * 0.3f; - - float headDiff = Mth::wrapDegrees(yRot - yBodyRot); - bool behind = headDiff < -90 || headDiff >= 90; - if (headDiff < -75) headDiff = -75; - if (headDiff >= 75) headDiff = +75; - yBodyRot = yRot - headDiff; - if (headDiff * headDiff > 50 * 50) - { - yBodyRot += headDiff * 0.2f; - } - - if (behind) - { - walkSpeed *= -1; - } - } - while (yRot - yRotO < -180) - yRotO -= 360; - while (yRot - yRotO >= 180) - yRotO += 360; - - while (yBodyRot - yBodyRotO < -180) - yBodyRotO -= 360; - while (yBodyRot - yBodyRotO >= 180) - yBodyRotO += 360; - - while (xRot - xRotO < -180) - xRotO -= 360; - while (xRot - xRotO >= 180) - xRotO += 360; - - while (yHeadRot - yHeadRotO < -180) - yHeadRotO -= 360; - while (yHeadRot - yHeadRotO >= 180) - yHeadRotO += 360; - - animStep += walkSpeed; -} - -void Mob::heal(int heal) -{ - if (health <= 0) return; - health += heal; - if (health > getMaxHealth()) health = getMaxHealth(); - invulnerableTime = invulnerableDuration / 2; -} - -int Mob::getHealth() -{ - return health; -} - -void Mob::setHealth(int health) -{ - this->health = health; - if (health > getMaxHealth()) - { - health = getMaxHealth(); + return LivingEntity::tickHeadTurn(yBodyRotT, walkSpeed); } } -bool Mob::hurt(DamageSource *source, int dmg) -{ - // 4J Stu - Reworked this function a bit to show hurt damage on the client before the server responds. - // Fix for #8823 - Gameplay: Confirmation that a monster or animal has taken damage from an attack is highly delayed - // 4J Stu - Change to the fix to only show damage when attacked, rather than collision damage - // Fix for #10299 - When in corners, passive mobs may show that they are taking damage. - // 4J Stu - Change to the fix for TU6, as source is never NULL due to changes in 1.8.2 to what source actually is - if (level->isClientSide && dynamic_cast(source) == NULL) return false; - noActionTime = 0; - if (health <= 0) return false; - - if ( source->isFire() && hasEffect(MobEffect::fireResistance) ) - { - // 4J-JEV, for new achievement Stayin'Frosty, TODO merge with Java version. - shared_ptr plr = dynamic_pointer_cast(shared_from_this()); - if ( plr != NULL && source == DamageSource::lava ) // Only award when in lava (not any fire). - { - plr->awardStat(GenericStats::stayinFrosty(),GenericStats::param_stayinFrosty()); - } - return false; - } - - this->walkAnimSpeed = 1.5f; - - bool sound = true; - if (invulnerableTime > invulnerableDuration / 2.0f) - { - if (dmg <= lastHurt) return false; - if(!level->isClientSide) actuallyHurt(source, dmg - lastHurt); - lastHurt = dmg; - sound = false; - } - else - { - lastHurt = dmg; - lastHealth = health; - invulnerableTime = invulnerableDuration; - if (!level->isClientSide) actuallyHurt(source, dmg); - hurtTime = hurtDuration = 10; - } - - hurtDir = 0; - - shared_ptr sourceEntity = source->getEntity(); - if (sourceEntity != NULL) - { - if (dynamic_pointer_cast(sourceEntity) != NULL) { - setLastHurtByMob(dynamic_pointer_cast(sourceEntity)); - - } - if (dynamic_pointer_cast(sourceEntity) != NULL) - { - lastHurtByPlayerTime = PLAYER_HURT_EXPERIENCE_TIME; - lastHurtByPlayer = dynamic_pointer_cast(sourceEntity); - } - else if (dynamic_pointer_cast(sourceEntity)) - { - shared_ptr w = dynamic_pointer_cast(sourceEntity); - if (w->isTame()) - { - lastHurtByPlayerTime = PLAYER_HURT_EXPERIENCE_TIME; - lastHurtByPlayer = nullptr; - } - } - } - - if (sound && level->isClientSide) - { - return false; - } - - if (sound) - { - level->broadcastEntityEvent(shared_from_this(), EntityEvent::HURT); - if (source != DamageSource::drown && source != DamageSource::controlledExplosion) markHurt(); - if (sourceEntity != NULL) - { - double xd = sourceEntity->x - x; - double zd = sourceEntity->z - z; - while (xd * xd + zd * zd < 0.0001) - { - xd = (Math::random() - Math::random()) * 0.01; - zd = (Math::random() - Math::random()) * 0.01; - } - hurtDir = (float) (atan2(zd, xd) * 180 / PI) - yRot; - knockback(sourceEntity, dmg, xd, zd); - } - else - { - hurtDir = (float) (int) ((Math::random() * 2) * 180); // 4J This cast is the same as Java - } - } - - MemSect(31); - if (health <= 0) - { - if (sound) level->playSound(shared_from_this(), getDeathSound(), getSoundVolume(), getVoicePitch()); - die(source); - } - else - { - if (sound) level->playSound(shared_from_this(), getHurtSound(), getSoundVolume(), getVoicePitch()); - } - MemSect(0); - - return true; -} - -float Mob::getVoicePitch() -{ - if (isBaby()) - { - return (random->nextFloat() - random->nextFloat()) * 0.2f + 1.5f; - - } - return (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f; -} - -void Mob::animateHurt() -{ - hurtTime = hurtDuration = 10; - hurtDir = 0; -} - -int Mob::getArmorValue() -{ - return 0; -} - -void Mob::hurtArmor(int damage) -{ -} - -int Mob::getDamageAfterArmorAbsorb(DamageSource *damageSource, int damage) -{ - if (!damageSource->isBypassArmor()) - { - int absorb = 25 - getArmorValue(); - int v = (damage) * absorb + dmgSpill; - hurtArmor(damage); - damage = v / 25; - dmgSpill = v % 25; - } - return damage; -} - -int Mob::getDamageAfterMagicAbsorb(DamageSource *damageSource, int damage) -{ - if (hasEffect(MobEffect::damageResistance)) - { - int absorbValue = (getEffect(MobEffect::damageResistance)->getAmplifier() + 1) * 5; - int absorb = 25 - absorbValue; - int v = (damage) * absorb + dmgSpill; - damage = v / 25; - dmgSpill = v % 25; - } - return damage; -} - -void Mob::actuallyHurt(DamageSource *source, int dmg) -{ - dmg = getDamageAfterArmorAbsorb(source, dmg); - dmg = getDamageAfterMagicAbsorb(source, dmg); - health -= dmg; -} - - -float Mob::getSoundVolume() -{ - return 1; -} - int Mob::getAmbientSound() { return -1; } -int Mob::getHurtSound() -{ - return eSoundType_DAMAGE_HURT; -} - -int Mob::getDeathSound() -{ - return eSoundType_DAMAGE_HURT; -} - -void Mob::knockback(shared_ptr source, int dmg, double xd, double zd) -{ - hasImpulse = true; - float dd = (float) sqrt(xd * xd + zd * zd); - float pow = 0.4f; - - this->xd /= 2; - this->yd /= 2; - this->zd /= 2; - - this->xd -= xd / dd * pow; - this->yd += pow; - this->zd -= zd / dd * pow; - - if (this->yd > 0.4f) this->yd = 0.4f; -} - -void Mob::die(DamageSource *source) -{ - shared_ptr sourceEntity = source->getEntity(); - if (deathScore >= 0 && sourceEntity != NULL) sourceEntity->awardKillScore(shared_from_this(), deathScore); - - if (sourceEntity != NULL) sourceEntity->killed( dynamic_pointer_cast( shared_from_this() ) ); - - dead = true; - - if (!level->isClientSide) - { - int playerBonus = 0; - shared_ptr player = dynamic_pointer_cast(sourceEntity); - if (player != NULL) - { - playerBonus = EnchantmentHelper::getKillingLootBonus(player->inventory); - } - if (!isBaby()) - { - dropDeathLoot(lastHurtByPlayerTime > 0, playerBonus); - if (lastHurtByPlayerTime > 0) - { - int rareLoot = random->nextInt(200) - playerBonus; - if (rareLoot < 5) - { - dropRareDeathLoot((rareLoot <= 0) ? 1 : 0); - } - } - } - - // 4J-JEV, hook for Durango mobKill event. - if (player != NULL) - { - player->awardStat(GenericStats::killMob(),GenericStats::param_mobKill(player, dynamic_pointer_cast(shared_from_this()), source)); - } - } - - level->broadcastEntityEvent(shared_from_this(), EntityEvent::DEATH); -} - -/** -* Drop extra rare loot. Only occurs roughly 5% of the time, rareRootLevel -* is set to 1 (otherwise 0) 1% of the time. -* -* @param rareLootLevel -*/ -void Mob::dropRareDeathLoot(int rareLootLevel) +int Mob::getDeathLoot() { - + return 0; } void Mob::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) @@ -917,430 +270,191 @@ void Mob::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) } } -int Mob::getDeathLoot() -{ - return 0; -} - -void Mob::causeFallDamage(float distance) -{ - Entity::causeFallDamage(distance); - int dmg = (int) ceil(distance - 3); - if (dmg > 0) - { - // 4J - new sounds here brought forward from 1.2.3 - if (dmg > 4) - { - level->playSound(shared_from_this(), eSoundType_DAMAGE_FALL_BIG, 1, 1); - } - else - { - level->playSound(shared_from_this(), eSoundType_DAMAGE_FALL_SMALL, 1, 1); - } - hurt(DamageSource::fall, dmg); - - int t = level->getTile( Mth::floor(x), Mth::floor(y - 0.2f - this->heightOffset), Mth::floor(z)); - if (t > 0) - { - const Tile::SoundType *soundType = Tile::tiles[t]->soundType; - MemSect(31); - level->playSound(shared_from_this(), soundType->getStepSound(), soundType->getVolume() * 0.5f, soundType->getPitch() * 0.75f); - MemSect(0); - } - } -} - -void Mob::travel(float xa, float ya) -{ -#ifdef __PSVITA__ - // AP - dynamic_pointer_cast is a non-trivial call - Player *thisPlayer = NULL; - if( (GetType() & eTYPE_PLAYER) == eTYPE_PLAYER ) - { - thisPlayer = (Player*) this; - } -#else - shared_ptr thisPlayer = dynamic_pointer_cast(shared_from_this()); -#endif - if (isInWater() && !(thisPlayer && thisPlayer->abilities.flying) ) - { - double yo = y; - moveRelative(xa, ya, useNewAi() ? 0.04f : 0.02f); - move(xd, yd, zd); - - xd *= 0.80f; - yd *= 0.80f; - zd *= 0.80f; - yd -= 0.02; - - if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) - { - yd = 0.3f; - } - } - else if (isInLava() && !(thisPlayer && thisPlayer->abilities.flying) ) - { - double yo = y; - moveRelative(xa, ya, 0.02f); - move(xd, yd, zd); - xd *= 0.50f; - yd *= 0.50f; - zd *= 0.50f; - yd -= 0.02; - - if (horizontalCollision && isFree(xd, yd + 0.6f - y + yo, zd)) - { - yd = 0.3f; - } - } - else - { - float friction = 0.91f; - if (onGround) - { - friction = 0.6f * 0.91f; - int t = level->getTile(Mth::floor(x), Mth::floor(bb->y0) - 1, Mth::floor(z)); - if (t > 0) - { - friction = Tile::tiles[t]->friction * 0.91f; - } - } - - float friction2 = (0.6f * 0.6f * 0.91f * 0.91f * 0.6f * 0.91f) / (friction * friction * friction); - - float speed; - if (onGround) - { - if (useNewAi()) speed = getSpeed(); - else speed = walkingSpeed; - speed *= friction2; - } - else speed = flyingSpeed; - - moveRelative(xa, ya, speed); - - friction = 0.91f; - if (onGround) - { - friction = 0.6f * 0.91f; - int t = level->getTile( Mth::floor(x), Mth::floor(bb->y0) - 1, Mth::floor(z)); - if (t > 0) - { - friction = Tile::tiles[t]->friction * 0.91f; - } - } - if (onLadder()) - { - float max = 0.15f; - if (xd < -max) xd = -max; - if (xd > max) xd = max; - if (zd < -max) zd = -max; - if (zd > max) zd = max; - this->fallDistance = 0; - if (yd < -0.15) yd = -0.15; - bool playerSneaking = isSneaking() && dynamic_pointer_cast(shared_from_this()) != NULL; - if (playerSneaking && yd < 0) yd = 0; - } - - move(xd, yd, zd); - - if (horizontalCollision && onLadder()) - { - yd = 0.2; - } - - yd -= 0.08; - yd *= 0.98f; - xd *= friction; - zd *= friction; - } - - walkAnimSpeedO = walkAnimSpeed; - double xxd = x - xo; - double zzd = z - zo; - float wst = Mth::sqrt(xxd * xxd + zzd * zzd) * 4; - if (wst > 1) wst = 1; - walkAnimSpeed += (wst - walkAnimSpeed) * 0.4f; - walkAnimPos += walkAnimSpeed; -} - -bool Mob::onLadder() -{ - int xt = Mth::floor(x); - int yt = Mth::floor(bb->y0); - int zt = Mth::floor(z); - - // 4J-PB - TU9 - add climbable vines - int iTile = level->getTile(xt, yt, zt); - return (iTile== Tile::ladder_Id) || (iTile== Tile::vine_Id); -} - - -bool Mob::isShootable() -{ - return true; -} - void Mob::addAdditonalSaveData(CompoundTag *entityTag) { - entityTag->putShort(L"Health", (short) health); - entityTag->putShort(L"HurtTime", (short) hurtTime); - entityTag->putShort(L"DeathTime", (short) deathTime); - entityTag->putShort(L"AttackTime", (short) attackTime); - - if (!activeEffects.empty()) - { - ListTag *listTag = new ListTag(); - - for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ++it) - { - MobEffectInstance *effect = it->second; - - CompoundTag *tag = new CompoundTag(); - tag->putByte(L"Id", (BYTE) effect->getId()); - tag->putByte(L"Amplifier", (char) effect->getAmplifier()); - tag->putInt(L"Duration", effect->getDuration()); - listTag->add(tag); - } - entityTag->put(L"ActiveEffects", listTag); - } -} - -void Mob::readAdditionalSaveData(CompoundTag *tag) -{ - if (health < Short::MIN_VALUE) health = Short::MIN_VALUE; - health = tag->getShort(L"Health"); - if (!tag->contains(L"Health")) health = getMaxHealth(); - hurtTime = tag->getShort(L"HurtTime"); - deathTime = tag->getShort(L"DeathTime"); - attackTime = tag->getShort(L"AttackTime"); - - if (tag->contains(L"ActiveEffects")) - { - ListTag *effects = (ListTag *) tag->getList(L"ActiveEffects"); - for (int i = 0; i < effects->size(); i++) - { - CompoundTag *effectTag = effects->get(i); - int id = effectTag->getByte(L"Id"); - int amplifier = effectTag->getByte(L"Amplifier"); - int duration = effectTag->getInt(L"Duration"); - - activeEffects.insert( unordered_map::value_type( id, new MobEffectInstance(id, duration, amplifier) ) ); - } - } -} - -bool Mob::isAlive() -{ - return !removed && health > 0; -} - -bool Mob::isWaterMob() -{ - return false; -} - -// 4J - added for more accurate lighting of mobs. Takes a weighted average of all tiles touched by the bounding volume of the entity - the method in the Entity class (which used to be used for -// mobs too) simply gets a single tile's lighting value causing sudden changes of lighting values when entities go in and out of lit areas, for example when bobbing in the water. -int Mob::getLightColor(float a) -{ - float accum[2] = {0,0}; - float totVol = ( bb->x1 - bb->x0 ) * ( bb->y1 - bb->y0 ) * ( bb->z1 - bb->z0 ); - int xmin = Mth::floor(bb->x0); - int xmax = Mth::floor(bb->x1); - int ymin = Mth::floor(bb->y0); - int ymax = Mth::floor(bb->y1); - int zmin = Mth::floor(bb->z0); - int zmax = Mth::floor(bb->z1); - for( int xt = xmin; xt <= xmax; xt++ ) - for( int yt = ymin; yt <= ymax; yt++ ) - for( int zt = zmin; zt <= zmax; zt++ ) - { - float tilexmin = (float)xt; - float tilexmax = (float)(xt+1); - float tileymin = (float)yt; - float tileymax = (float)(yt+1); - float tilezmin = (float)zt; - float tilezmax = (float)(zt+1); - if( tilexmin < bb->x0 ) tilexmin = bb->x0; - if( tilexmax > bb->x1 ) tilexmax = bb->x1; - if( tileymin < bb->y0 ) tileymin = bb->y0; - if( tileymax > bb->y1 ) tileymax = bb->y1; - if( tilezmin < bb->z0 ) tilezmin = bb->z0; - if( tilezmax > bb->z1 ) tilezmax = bb->z1; - float tileVol = ( tilexmax - tilexmin ) * ( tileymax - tileymin ) * ( tilezmax - tilezmin ); - float frac = tileVol / totVol; - int lc = level->getLightColor(xt, yt, zt, 0); - accum[0] += frac * (float)( lc & 0xffff ); - accum[1] += frac * (float)( lc >> 16 ); - } - - if( accum[0] > 240.0f ) accum[0] = 240.0f; - if( accum[1] > 240.0f ) accum[1] = 240.0f; - - return ( ( (int)accum[1])<<16) | ((int)accum[0]); -} - -void Mob::setYya(float yya) -{ - this->yya = yya; -} - -void Mob::setJumping(bool jump) -{ - jumping = jump; -} - -void Mob::aiStep() -{ - if (noJumpDelay > 0) noJumpDelay--; - if (lSteps > 0) - { - double xt = x + (lx - x) / lSteps; - double yt = y + (ly - y) / lSteps; - double zt = z + (lz - z) / lSteps; - - double yrd = Mth::wrapDegrees(lyr - yRot); - double xrd = Mth::wrapDegrees(lxr - xRot); - - yRot += (float) ( (yrd) / lSteps ); - xRot += (float) ( (xrd) / lSteps ); - - lSteps--; - this->setPos(xt, yt, zt); - this->setRot(yRot, xRot); - - // 4J - this collision is carried out to try and stop the lerping push the mob through the floor, - // in which case gravity can then carry on moving the mob because the collision just won't work anymore. - // BB for collision used to be calculated as: bb->shrink(1 / 32.0, 0, 1 / 32.0) - // now using a reduced BB to try and get rid of some issues where mobs pop up the sides of walls, undersides of - // trees etc. - AABB *shrinkbb = bb->shrink(0.1, 0, 0.1); - shrinkbb->y1 = shrinkbb->y0 + 0.1; - AABBList *collisions = level->getCubes(shared_from_this(), shrinkbb); - if (collisions->size() > 0) - { - double yTop = 0; - AUTO_VAR(itEnd, collisions->end()); - for (AUTO_VAR(it, collisions->begin()); it != itEnd; it++) - { - AABB *ab = *it; //collisions->at(i); - if (ab->y1 > yTop) yTop = ab->y1; - } + LivingEntity::addAdditonalSaveData(entityTag); + entityTag->putBoolean(L"CanPickUpLoot", canPickUpLoot()); + entityTag->putBoolean(L"PersistenceRequired", persistenceRequired); - yt += yTop - bb->y0; - setPos(xt, yt, zt); - } - if (abs(xd) < MIN_MOVEMENT_DISTANCE) xd = 0; - if (abs(yd) < MIN_MOVEMENT_DISTANCE) yd = 0; - if (abs(zd) < MIN_MOVEMENT_DISTANCE) zd = 0; - } - - if (isImmobile()) + ListTag *gear = new ListTag(); + for (int i = 0; i < equipment.length; i++) { - jumping = false; - xxa = 0; - yya = 0; - yRotA = 0; - } - else + CompoundTag *tag = new CompoundTag(); + if (equipment[i] != NULL) equipment[i]->save(tag); + gear->add(tag); + } + entityTag->put(L"Equipment", gear); + + ListTag *dropChanceList = new ListTag(); + for (int i = 0; i < dropChances.length; i++) { - MemSect(25); - if (isEffectiveAI()) - { - if (useNewAi()) - { - newServerAiStep(); - } - else - { - serverAiStep(); - yHeadRot = yRot; - } - } - MemSect(0); + dropChanceList->add(new FloatTag( _toString(i), dropChances[i])); } + entityTag->put(L"DropChances", dropChanceList); + entityTag->putString(L"CustomName", getCustomName()); + entityTag->putBoolean(L"CustomNameVisible", isCustomNameVisible()); - if (jumping) + // leash info + entityTag->putBoolean(L"Leashed", _isLeashed); + if (leashHolder != NULL) { - if (isInWater() || isInLava() ) + CompoundTag *leashTag = new CompoundTag(L"Leash"); + if ( leashHolder->instanceof(eTYPE_LIVINGENTITY) ) { - yd += 0.04f; + // a walking, talking, leash holder + leashTag->putString(L"UUID", leashHolder->getUUID()); } - else if (onGround) + else if ( leashHolder->instanceof(eTYPE_HANGING_ENTITY) ) { - if (noJumpDelay == 0) - { - jumpFromGround(); - noJumpDelay = 10; - } + // a fixed holder (that doesn't save itself) + shared_ptr hangInThere = dynamic_pointer_cast(leashHolder); + leashTag->putInt(L"X", hangInThere->xTile); + leashTag->putInt(L"Y", hangInThere->yTile); + leashTag->putInt(L"Z", hangInThere->zTile); } + entityTag->put(L"Leash", leashTag); } - else - { - noJumpDelay = 0; - } +} + +void Mob::readAdditionalSaveData(CompoundTag *tag) +{ + LivingEntity::readAdditionalSaveData(tag); + setCanPickUpLoot(tag->getBoolean(L"CanPickUpLoot")); + persistenceRequired = tag->getBoolean(L"PersistenceRequired"); + if (tag->contains(L"CustomName") && tag->getString(L"CustomName").length() > 0) setCustomName(tag->getString(L"CustomName")); + setCustomNameVisible(tag->getBoolean(L"CustomNameVisible")); - xxa *= 0.98f; - yya *= 0.98f; - yRotA *= 0.9f; + if (tag->contains(L"Equipment")) + { + ListTag *gear = (ListTag *) tag->getList(L"Equipment"); - float normalSpeed = walkingSpeed; - walkingSpeed *= getWalkingSpeedModifier(); - travel(xxa, yya); - walkingSpeed = normalSpeed; + for (int i = 0; i < equipment.length; i++) + { + equipment[i] = ItemInstance::fromTag(gear->get(i)); + } + } - if(!level->isClientSide) + if (tag->contains(L"DropChances")) { - vector > *entities = level->getEntities(shared_from_this(), this->bb->grow(0.2f, 0, 0.2f)); - if (entities != NULL && !entities->empty()) + ListTag *items = (ListTag *) tag->getList(L"DropChances"); + for (int i = 0; i < items->size(); i++) { - AUTO_VAR(itEnd, entities->end()); - for (AUTO_VAR(it, entities->begin()); it != itEnd; it++) - { - shared_ptr e = *it; //entities->at(i); - if (e->isPushable()) e->push(shared_from_this()); - } + dropChances[i] = items->get(i)->data; } } -} -bool Mob::useNewAi() -{ - return false; + _isLeashed = tag->getBoolean(L"Leashed"); + if (_isLeashed && tag->contains(L"Leash")) + { + leashInfoTag = (CompoundTag *)tag->getCompound(L"Leash")->copy(); + } } -bool Mob::isEffectiveAI() +void Mob::setYya(float yya) { - return !level->isClientSide; + this->yya = yya; } -bool Mob::isImmobile() +void Mob::setSpeed(float speed) { - return health <= 0; + LivingEntity::setSpeed(speed); + setYya(speed); } -bool Mob::isBlocking() +void Mob::aiStep() { - return false; -} + LivingEntity::aiStep(); -void Mob::jumpFromGround() -{ - yd = 0.42f; - if (hasEffect(MobEffect::jump)) - { - yd += (getEffect(MobEffect::jump)->getAmplifier() + 1) * .1f; - } - if (isSprinting()) + if (!level->isClientSide && canPickUpLoot() && !dead && level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) { - float rr = yRot * Mth::RAD_TO_GRAD; + vector > *entities = level->getEntitiesOfClass(typeid(ItemEntity), bb->grow(1, 0, 1)); + for (AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) + { + shared_ptr entity = dynamic_pointer_cast(*it); + if (entity->removed || entity->getItem() == NULL) continue; + shared_ptr item = entity->getItem(); + int slot = getEquipmentSlotForItem(item); - xd -= Mth::sin(rr) * 0.2f; - zd += Mth::cos(rr) * 0.2f; + if (slot > -1) + { + bool replace = true; + shared_ptr current = getCarried(slot); + + if (current != NULL) + { + if (slot == SLOT_WEAPON) + { + WeaponItem *newWeapon = dynamic_cast(item->getItem()); + WeaponItem *oldWeapon = dynamic_cast(current->getItem()); + if ( newWeapon != NULL && oldWeapon == NULL) + { + replace = true; + } + else if (newWeapon != NULL && oldWeapon != NULL) + { + if (newWeapon->getTierDamage() == oldWeapon->getTierDamage()) + { + replace = item->getAuxValue() > current->getAuxValue() || item->hasTag() && !current->hasTag(); + } + else + { + replace = newWeapon->getTierDamage() > oldWeapon->getTierDamage(); + } + } + else + { + replace = false; + } + } + else + { + ArmorItem *newArmor = dynamic_cast(item->getItem()); + ArmorItem *oldArmor = dynamic_cast(current->getItem()); + if (newArmor != NULL && oldArmor == NULL) + { + replace = true; + } + else if (newArmor != NULL && oldArmor != NULL) + { + if (newArmor->defense == oldArmor->defense) + { + replace = item->getAuxValue() > current->getAuxValue() || item->hasTag() && !current->hasTag(); + } + else + { + replace = newArmor->defense > oldArmor->defense; + } + } + else + { + replace = false; + } + } + } + + if (replace) + { + if (current != NULL && random->nextFloat() - 0.1f < dropChances[slot]) + { + spawnAtLocation(current, 0); + } + + setEquippedSlot(slot, item); + dropChances[slot] = 2; + persistenceRequired = true; + take(entity, 1); + entity->remove(); + } + } + } + delete entities; } - this->hasImpulse = true; +} + +bool Mob::useNewAi() +{ + return false; } bool Mob::removeWhenFarAway() @@ -1350,6 +464,11 @@ bool Mob::removeWhenFarAway() void Mob::checkDespawn() { + if (persistenceRequired) + { + noActionTime = 0; + return; + } shared_ptr player = level->getNearestPlayer(shared_from_this(), -1); if (player != NULL) { @@ -1376,36 +495,54 @@ void Mob::checkDespawn() void Mob::newServerAiStep() { + PIXBeginNamedEvent(0,"Tick target selector for %d",GetType()); MemSect(51); noActionTime++; + PIXBeginNamedEvent(0,"Check despawn"); checkDespawn(); - sensing->tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick sensing"); + sensing->tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick target selector"); targetSelector.tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick goal selectors"); goalSelector.tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick navigation"); navigation->tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick server ai mob step"); serverAiMobStep(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick move"); moveControl->tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick look"); lookControl->tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Tick jump"); jumpControl->tick(); + PIXEndNamedEvent(); // Consider this for extra strolling if it is protected against despawning. We aren't interested in ones that aren't protected as the whole point of this // extra wandering is to potentially transition from protected to not protected. + PIXBeginNamedEvent(0,"Consider extra wandering"); considerForExtraWandering( isDespawnProtected() ); + PIXEndNamedEvent(); MemSect(0); -} - -void Mob::serverAiMobStep() -{ + PIXEndNamedEvent(); } void Mob::serverAiStep() { - noActionTime++; - - checkDespawn(); + LivingEntity::serverAiStep(); xxa = 0; yya = 0; + checkDespawn(); + float lookDistance = 8; if (random->nextFloat() < 0.02f) { @@ -1454,11 +591,12 @@ void Mob::lookAt(shared_ptr e, float yMax, float xMax) double xd = e->x - x; double yd; double zd = e->z - z; + - shared_ptr mob = dynamic_pointer_cast(e); - if(mob != NULL) + if ( e->instanceof(eTYPE_LIVINGENTITY) ) { - yd = (y + getHeadHeight()) - (mob->y + mob->getHeadHeight()); + shared_ptr mob = dynamic_pointer_cast(e); + yd = (mob->y + mob->getHeadHeight()) - (y + getHeadHeight()); } else { @@ -1469,7 +607,7 @@ void Mob::lookAt(shared_ptr e, float yMax, float xMax) float yRotD = (float) (atan2(zd, xd) * 180 / PI) - 90; float xRotD = (float) -(atan2(yd, sd) * 180 / PI); - xRot = -rotlerp(xRot, xRotD, xMax); + xRot = rotlerp(xRot, xRotD, xMax); yRot = rotlerp(yRot, yRotD, yMax); } @@ -1503,59 +641,6 @@ bool Mob::canSpawn() return level->isUnobstructed(bb) && level->getCubes(shared_from_this(), bb)->empty() && !level->containsAnyLiquid_NoLoad(bb); } -void Mob::outOfWorld() -{ - hurt(DamageSource::outOfWorld, 4); -} - -float Mob::getAttackAnim(float a) -{ - float diff = attackAnim - oAttackAnim; - if (diff < 0) diff += 1; - return oAttackAnim + diff * a; -} - - -Vec3 *Mob::getPos(float a) -{ - if (a == 1) - { - return Vec3::newTemp(x, y, z); - } - double x = xo + (this->x - xo) * a; - double y = yo + (this->y - yo) * a; - double z = zo + (this->z - zo) * a; - - return Vec3::newTemp(x, y, z); -} - -Vec3 *Mob::getLookAngle() -{ - return getViewVector(1); -} - -Vec3 *Mob::getViewVector(float a) -{ - if (a == 1) - { - float yCos = Mth::cos(-yRot * Mth::RAD_TO_GRAD - PI); - float ySin = Mth::sin(-yRot * Mth::RAD_TO_GRAD - PI); - float xCos = -Mth::cos(-xRot * Mth::RAD_TO_GRAD); - float xSin = Mth::sin(-xRot * Mth::RAD_TO_GRAD); - - return Vec3::newTemp(ySin * xCos, xSin, yCos * xCos); - } - float xRot = xRotO + (this->xRot - xRotO) * a; - float yRot = yRotO + (this->yRot - yRotO) * a; - - float yCos = Mth::cos(-yRot * Mth::RAD_TO_GRAD - PI); - float ySin = Mth::sin(-yRot * Mth::RAD_TO_GRAD - PI); - float xCos = -Mth::cos(-xRot * Mth::RAD_TO_GRAD); - float xSin = Mth::sin(-xRot * Mth::RAD_TO_GRAD); - - return Vec3::newTemp(ySin * xCos, xSin, yCos * xCos); -} - float Mob::getSizeScale() { return 1.0f; @@ -1566,362 +651,421 @@ float Mob::getHeadSizeScale() return 1.0f; } -HitResult *Mob::pick(double range, float a) -{ - Vec3 *from = getPos(a); - Vec3 *b = getViewVector(a); - Vec3 *to = from->add(b->x * range, b->y * range, b->z * range); - return level->clip(from, to); -} - int Mob::getMaxSpawnClusterSize() { return 4; } -shared_ptr Mob::getCarriedItem() +int Mob::getMaxFallDistance() { - return nullptr; + if (getTarget() == NULL) return 3; + int sacrifice = (int) (getHealth() - (getMaxHealth() * 0.33f)); + sacrifice -= (3 - level->difficulty) * 4; + if (sacrifice < 0) sacrifice = 0; + return sacrifice + 3; } -shared_ptr Mob::getArmor(int pos) +shared_ptr Mob::getCarriedItem() { - // 4J Stu - Not implemented yet - return nullptr; - //return equipment[pos + 1]; + return equipment[SLOT_WEAPON]; } -void Mob::handleEntityEvent(byte id) +shared_ptr Mob::getCarried(int slot) { - if (id == EntityEvent::HURT) - { - this->walkAnimSpeed = 1.5f; - - invulnerableTime = invulnerableDuration; - hurtTime = hurtDuration = 10; - hurtDir = 0; - - MemSect(31); - // 4J-PB -added because villagers have no sounds - int iHurtSound=getHurtSound(); - if(iHurtSound!=-1) - { - level->playSound(shared_from_this(), iHurtSound, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); - } - MemSect(0); - hurt(DamageSource::genericSource, 0); - } - else if (id == EntityEvent::DEATH) - { - MemSect(31); - // 4J-PB -added because villagers have no sounds - int iDeathSound=getDeathSound(); - if(iDeathSound!=-1) - { - level->playSound(shared_from_this(), iDeathSound, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); - } - MemSect(0); - health = 0; - die(DamageSource::genericSource); - } - else - { - Entity::handleEntityEvent(id); - } + return equipment[slot]; } -bool Mob::isSleeping() +shared_ptr Mob::getArmor(int pos) { - return false; + return equipment[pos + 1]; } -Icon *Mob::getItemInHandIcon(shared_ptr item, int layer) +void Mob::setEquippedSlot(int slot, shared_ptr item) { - return item->getIcon(); + equipment[slot] = item; } -// 4J added so we can not render mobs before their chunks are loaded - to resolve bug 10327 :Gameplay: NPCs can spawn over chunks that have not yet been streamed and display jitter. -bool Mob::shouldRender(Vec3 *c) +ItemInstanceArray Mob::getEquipmentSlots() { - if( !level->reallyHasChunksAt( Mth::floor(bb->x0), Mth::floor(bb->y0), Mth::floor(bb->z0), Mth::floor(bb->x1), Mth::floor(bb->y1), Mth::floor(bb->z1))) - { - return false; - } - return Entity::shouldRender(c); + return equipment; } -void Mob::tickEffects() +void Mob::dropEquipment(bool byPlayer, int playerBonusLevel) { - bool removed = false; - for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end();) + for (int slot = 0; slot < getEquipmentSlots().length; slot++) { - MobEffectInstance *effect = it->second; - removed = false; - if (!effect->tick(dynamic_pointer_cast(shared_from_this()))) + shared_ptr item = getCarried(slot); + bool preserve = dropChances[slot] > 1; + + if (item != NULL && (byPlayer || preserve) && random->nextFloat() - playerBonusLevel * 0.01f < dropChances[slot]) { - if (!level->isClientSide) + if (!preserve && item->isDamageableItem()) { - it = activeEffects.erase( it ); - onEffectRemoved(effect); - delete effect; - removed = true; + int _max = max(item->getMaxDamage() - 25, 1); + int damage = item->getMaxDamage() - random->nextInt(random->nextInt(_max) + 1); + if (damage > _max) damage = _max; + if (damage < 1) damage = 1; + item->setAuxValue(damage); } - } - if(!removed) - { - ++it; + spawnAtLocation(item, 0); } } - if (effectsDirty) +} + +void Mob::populateDefaultEquipmentSlots() +{ + if (random->nextFloat() < MAX_WEARING_ARMOR_CHANCE * level->getDifficulty(x, y, z)) { - if (!level->isClientSide) + int armorType = random->nextInt(2); + float partialChance = level->difficulty == Difficulty::HARD ? 0.1f : 0.25f; + if (random->nextFloat() < 0.095f) armorType++; + if (random->nextFloat() < 0.095f) armorType++; + if (random->nextFloat() < 0.095f) armorType++; + + for (int i = 3; i >= 0; i--) { - if (activeEffects.empty()) - { - entityData->set(DATA_EFFECT_COLOR_ID, (int) 0); - setInvisible(false); - setWeakened(false); - } - else + shared_ptr item = getArmor(i); + if (i < 3 && random->nextFloat() < partialChance) break; + if (item == NULL) { - vector values; - for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end();++it) - { - values.push_back(it->second); - } - int colorValue = PotionBrewing::getColorValue(&values); - values.clear(); - entityData->set(DATA_EFFECT_COLOR_ID, colorValue); - setInvisible(hasEffect(MobEffect::invisibility->id)); - setWeakened(hasEffect(MobEffect::weakness->id)); + Item *equip = getEquipmentForSlot(i + 1, armorType); + if (equip != NULL) setEquippedSlot(i + 1, shared_ptr(new ItemInstance(equip))); } } - effectsDirty = false; } - if (random->nextBoolean()) +} + +int Mob::getEquipmentSlotForItem(shared_ptr item) +{ + if (item->id == Tile::pumpkin_Id || item->id == Item::skull_Id) { - int colorValue = entityData->getInteger(DATA_EFFECT_COLOR_ID); - if (colorValue > 0) - { - double red = (double) ((colorValue >> 16) & 0xff) / 255.0; - double green = (double) ((colorValue >> 8) & 0xff) / 255.0; - double blue = (double) ((colorValue >> 0) & 0xff) / 255.0; + return SLOT_HELM; + } - level->addParticle(eParticleType_mobSpell, x + (random->nextDouble() - 0.5) * bbWidth, y + random->nextDouble() * bbHeight - heightOffset, z + (random->nextDouble() - 0.5) * bbWidth, red, green, blue); + ArmorItem *armorItem = dynamic_cast(item->getItem()); + if (armorItem != NULL) + { + switch (armorItem->slot) + { + case ArmorItem::SLOT_FEET: + return SLOT_BOOTS; + case ArmorItem::SLOT_LEGS: + return SLOT_LEGGINGS; + case ArmorItem::SLOT_TORSO: + return SLOT_CHEST; + case ArmorItem::SLOT_HEAD: + return SLOT_HELM; } } + + return SLOT_WEAPON; } -void Mob::removeAllEffects() +Item *Mob::getEquipmentForSlot(int slot, int type) { - //Iterator effectIdIterator = activeEffects.keySet().iterator(); - //while (effectIdIterator.hasNext()) - for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ) + switch (slot) { - //Integer effectId = effectIdIterator.next(); - MobEffectInstance *effect = it->second;//activeEffects.get(effectId); + case SLOT_HELM: + if (type == 0) return Item::helmet_leather; + if (type == 1) return Item::helmet_gold; + if (type == 2) return Item::helmet_chain; + if (type == 3) return Item::helmet_iron; + if (type == 4) return Item::helmet_diamond; + case SLOT_CHEST: + if (type == 0) return Item::chestplate_leather; + if (type == 1) return Item::chestplate_gold; + if (type == 2) return Item::chestplate_chain; + if (type == 3) return Item::chestplate_iron; + if (type == 4) return Item::chestplate_diamond; + case SLOT_LEGGINGS: + if (type == 0) return Item::leggings_leather; + if (type == 1) return Item::leggings_gold; + if (type == 2) return Item::leggings_chain; + if (type == 3) return Item::leggings_iron; + if (type == 4) return Item::leggings_diamond; + case SLOT_BOOTS: + if (type == 0) return Item::boots_leather; + if (type == 1) return Item::boots_gold; + if (type == 2) return Item::boots_chain; + if (type == 3) return Item::boots_iron; + if (type == 4) return Item::boots_diamond; + } - if (!level->isClientSide) - { - //effectIdIterator.remove(); - it = activeEffects.erase(it); - onEffectRemoved(effect); - delete effect; - } - else + return NULL; +} + +void Mob::populateDefaultEquipmentEnchantments() +{ + float difficulty = level->getDifficulty(x, y, z); + + if (getCarriedItem() != NULL && random->nextFloat() < MAX_ENCHANTED_WEAPON_CHANCE * difficulty) { + EnchantmentHelper::enchantItem(random, getCarriedItem(), (int) (5 + difficulty * random->nextInt(18))); + } + + for (int i = 0; i < 4; i++) + { + shared_ptr item = getArmor(i); + if (item != NULL && random->nextFloat() < MAX_ENCHANTED_ARMOR_CHANCE * difficulty) { - ++it; + EnchantmentHelper::enchantItem(random, item, (int) (5 + difficulty * random->nextInt(18))); } } } -vector *Mob::getActiveEffects() +/** +* Added this method so mobs can handle their own spawn settings instead of +* hacking MobSpawner.java +* +* @param groupData +* TODO +* @return TODO +*/ +MobGroupData *Mob::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param { - vector *active = new vector(); + // 4J Stu - Take this out, it's not great and nobody will notice. Also not great for performance. + //getAttribute(SharedMonsterAttributes::FOLLOW_RANGE)->addModifier(new AttributeModifier(random->nextGaussian() * 0.05, AttributeModifier::OPERATION_MULTIPLY_BASE)); - for(AUTO_VAR(it, activeEffects.begin()); it != activeEffects.end(); ++it) - { - active->push_back(it->second); - } + return groupData; +} - return active; +void Mob::finalizeSpawnEggSpawn(int extraData) +{ } -bool Mob::hasEffect(int id) +bool Mob::canBeControlledByRider() { - return activeEffects.find(id) != activeEffects.end();; + return false; } -bool Mob::hasEffect(MobEffect *effect) +wstring Mob::getAName() { - return activeEffects.find(effect->id) != activeEffects.end(); + if (hasCustomName()) return getCustomName(); + return LivingEntity::getAName(); } -MobEffectInstance *Mob::getEffect(MobEffect *effect) +void Mob::setPersistenceRequired() { - MobEffectInstance *effectInst = NULL; + persistenceRequired = true; +} - AUTO_VAR(it, activeEffects.find(effect->id)); - if(it != activeEffects.end() ) effectInst = it->second; +void Mob::setCustomName(const wstring &name) +{ + entityData->set(DATA_CUSTOM_NAME, name); +} - return effectInst; +wstring Mob::getCustomName() +{ + return entityData->getString(DATA_CUSTOM_NAME); } -void Mob::addEffect(MobEffectInstance *newEffect) +bool Mob::hasCustomName() { - if (!canBeAffected(newEffect)) - { - return; - } + return entityData->getString(DATA_CUSTOM_NAME).length() > 0; +} - if (activeEffects.find(newEffect->getId()) != activeEffects.end() ) - { - // replace effect and update - MobEffectInstance *effectInst = activeEffects.find(newEffect->getId())->second; - effectInst->update(newEffect); - onEffectUpdated(effectInst); - } - else - { - activeEffects.insert( unordered_map::value_type( newEffect->getId(), newEffect ) ); - onEffectAdded(newEffect); - } +void Mob::setCustomNameVisible(bool visible) +{ + entityData->set(DATA_CUSTOM_NAME_VISIBLE, visible ? (byte) 1 : (byte) 0); } -// 4J Added -void Mob::addEffectNoUpdate(MobEffectInstance *newEffect) +bool Mob::isCustomNameVisible() { - if (!canBeAffected(newEffect)) - { - return; - } + return entityData->getByte(DATA_CUSTOM_NAME_VISIBLE) == 1; +} - if (activeEffects.find(newEffect->getId()) != activeEffects.end() ) - { - // replace effect and update - MobEffectInstance *effectInst = activeEffects.find(newEffect->getId())->second; - effectInst->update(newEffect); - } - else - { - activeEffects.insert( unordered_map::value_type( newEffect->getId(), newEffect ) ); - } +bool Mob::shouldShowName() +{ + return isCustomNameVisible(); } -bool Mob::canBeAffected(MobEffectInstance *newEffect) +void Mob::setDropChance(int slot, float pct) { - if (getMobType() == UNDEAD) - { - int id = newEffect->getId(); - if (id == MobEffect::regeneration->id || id == MobEffect::poison->id) - { - return false; - } - } + dropChances[slot] = pct; +} - return true; +bool Mob::canPickUpLoot() +{ + return _canPickUpLoot; } -bool Mob::isInvertedHealAndHarm() +void Mob::setCanPickUpLoot(bool canPickUpLoot) { - return getMobType() == UNDEAD; + _canPickUpLoot = canPickUpLoot; } -void Mob::removeEffectNoUpdate(int effectId) +bool Mob::isPersistenceRequired() { - AUTO_VAR(it, activeEffects.find(effectId)); - if (it != activeEffects.end()) - { - MobEffectInstance *effect = it->second; - if(effect != NULL) - { - delete effect; - } - activeEffects.erase(it); - } + return persistenceRequired; } -void Mob::removeEffect(int effectId) +bool Mob::interact(shared_ptr player) { - AUTO_VAR(it, activeEffects.find(effectId)); - if (it != activeEffects.end()) + + if (isLeashed() && getLeashHolder() == player) + { + dropLeash(true, !player->abilities.instabuild); + return true; + } + + shared_ptr itemstack = player->inventory->getSelected(); + if (itemstack != NULL) { - MobEffectInstance *effect = it->second; - if(effect != NULL) + // it's inconvenient to have the leash code here, but it's because + // the mob.interact(player) method has priority over + // item.interact(mob) + if (itemstack->id == Item::lead_Id) { - onEffectRemoved(effect); - delete effect; + if (canBeLeashed()) + { + shared_ptr tamableAnimal = nullptr; + if ( shared_from_this()->instanceof(eTYPE_TAMABLE_ANIMAL) + && (tamableAnimal = dynamic_pointer_cast(shared_from_this()))->isTame() ) // 4J-JEV: excuse the assignment operator in here, don't want to dyn-cast if it's avoidable. + { + if (player->getUUID().compare(tamableAnimal->getOwnerUUID()) == 0) + { + setLeashedTo(player, true); + itemstack->count--; + return true; + } + } + else + { + setLeashedTo(player, true); + itemstack->count--; + return true; + } + } } - activeEffects.erase(it); } -} -void Mob::onEffectAdded(MobEffectInstance *effect) -{ - effectsDirty = true; -} + if (mobInteract(player)) + { + return true; + } -void Mob::onEffectUpdated(MobEffectInstance *effect) -{ - effectsDirty = true; + return LivingEntity::interact(player); } -void Mob::onEffectRemoved(MobEffectInstance *effect) +bool Mob::mobInteract(shared_ptr player) { - effectsDirty = true; + return false; } -float Mob::getWalkingSpeedModifier() +void Mob::tickLeash() { - float speed = 1.0f; - if (hasEffect(MobEffect::movementSpeed)) + if (leashInfoTag != NULL) + { + restoreLeashFromSave(); + } + if (!_isLeashed) + { + return; + } + + if (leashHolder == NULL || leashHolder->removed) { - speed *= 1.0f + .2f * (getEffect(MobEffect::movementSpeed)->getAmplifier() + 1); + dropLeash(true, true); + return; } - if (hasEffect(MobEffect::movementSlowdown)) +} + +void Mob::dropLeash(bool synch, bool createItemDrop) +{ + if (_isLeashed) { - speed *= 1.0f - .15f * (getEffect(MobEffect::movementSlowdown)->getAmplifier() + 1); + _isLeashed = false; + leashHolder = nullptr; + if (!level->isClientSide && createItemDrop) + { + spawnAtLocation(Item::lead_Id, 1); + } + + ServerLevel *serverLevel = dynamic_cast(level); + if (!level->isClientSide && synch && serverLevel != NULL) + { + serverLevel->getTracker()->broadcast(shared_from_this(), shared_ptr(new SetEntityLinkPacket(SetEntityLinkPacket::LEASH, shared_from_this(), nullptr))); + } } - return speed; } -void Mob::teleportTo(double x, double y, double z) +bool Mob::canBeLeashed() { - moveTo(x, y, z, yRot, xRot); + return !isLeashed() && !shared_from_this()->instanceof(eTYPE_ENEMY); } -bool Mob::isBaby() +bool Mob::isLeashed() { - return false; + return _isLeashed; } -MobType Mob::getMobType() +shared_ptr Mob::getLeashHolder() { - return UNDEFINED; + return leashHolder; } -void Mob::breakItem(shared_ptr itemInstance) +void Mob::setLeashedTo(shared_ptr holder, bool synch) { - level->playSound(shared_from_this(), eSoundType_RANDOM_BREAK, 0.8f, 0.8f + level->random->nextFloat() * 0.4f); + _isLeashed = true; + leashHolder = holder; + + ServerLevel *serverLevel = dynamic_cast(level); + if (!level->isClientSide && synch && serverLevel) + { + serverLevel->getTracker()->broadcast(shared_from_this(), shared_ptr( new SetEntityLinkPacket(SetEntityLinkPacket::LEASH, shared_from_this(), leashHolder))); + } +} - for (int i = 0; i < 5; i++) +void Mob::restoreLeashFromSave() +{ + // after being added to the world, attempt to recreate leash bond + if (_isLeashed && leashInfoTag != NULL) { - Vec3 *d = Vec3::newTemp((random->nextFloat() - 0.5) * 0.1, Math::random() * 0.1 + 0.1, 0); - d->xRot(-xRot * PI / 180); - d->yRot(-yRot * PI / 180); - - Vec3 *p = Vec3::newTemp((random->nextFloat() - 0.5) * 0.3, -random->nextFloat() * 0.6 - 0.3, 0.6); - p->xRot(-xRot * PI / 180); - p->yRot(-yRot * PI / 180); - p = p->add(x, y + getHeadHeight(), z); - level->addParticle(PARTICLE_ICONCRACK(itemInstance->getItem()->id,0), p->x, p->y, p->z, d->x, d->y + 0.05, d->z); + if (leashInfoTag->contains(L"UUID")) + { + wstring leashUuid = leashInfoTag->getString(L"UUID"); + vector > *livingEnts = level->getEntitiesOfClass(typeid(LivingEntity), bb->grow(10, 10, 10)); + for(AUTO_VAR(it, livingEnts->begin()); it != livingEnts->end(); ++it) + { + shared_ptr le = dynamic_pointer_cast(*it); + if (le->getUUID().compare(leashUuid) == 0) + { + leashHolder = le; + setLeashedTo(leashHolder, true); + break; + } + } + delete livingEnts; + } + else if (leashInfoTag->contains(L"X") && leashInfoTag->contains(L"Y") && leashInfoTag->contains(L"Z")) + { + int x = leashInfoTag->getInt(L"X"); + int y = leashInfoTag->getInt(L"Y"); + int z = leashInfoTag->getInt(L"Z"); + + shared_ptr activeKnot = LeashFenceKnotEntity::findKnotAt(level, x, y, z); + if (activeKnot == NULL) + { + activeKnot = LeashFenceKnotEntity::createAndAddKnot(level, x, y, z); + } + leashHolder = activeKnot; + setLeashedTo(leashHolder, true); + } + else + { + dropLeash(false, true); + } } + leashInfoTag = NULL; } -bool Mob::isInvulnerable() +// 4J added so we can not render mobs before their chunks are loaded - to resolve bug 10327 :Gameplay: NPCs can spawn over chunks that have not yet been streamed and display jitter. +bool Mob::shouldRender(Vec3 *c) { - // 4J-JEV: I have no idea what was going on here (it gets changed in a later java version). - return invulnerableTime > 0; // invulnerableTime <= invulnerableTime / 2; + if( !level->reallyHasChunksAt( Mth::floor(bb->x0), Mth::floor(bb->y0), Mth::floor(bb->z0), Mth::floor(bb->x1), Mth::floor(bb->y1), Mth::floor(bb->z1))) + { + return false; + } + return Entity::shouldRender(c); } void Mob::setLevel(Level *level) @@ -1930,14 +1074,4 @@ void Mob::setLevel(Level *level) navigation->setLevel(level); goalSelector.setLevel(level); targetSelector.setLevel(level); -} - -void Mob::finalizeMobSpawn() -{ - -} - -bool Mob::canBeControlledByRider() -{ - return false; -} +} \ No newline at end of file diff --git a/Minecraft.World/Mob.h b/Minecraft.World/Mob.h index 0e1af2be..11310509 100644 --- a/Minecraft.World/Mob.h +++ b/Minecraft.World/Mob.h @@ -1,7 +1,7 @@ #pragma once using namespace std; -#include "Entity.h" +#include "LivingEntity.h" #include "MobType.h" #include "GoalSelector.h" @@ -19,105 +19,33 @@ class PathNavigation; class Sensing; class Icon; class Pos; +class MobGroupData; -class Mob : public Entity +class Mob : public LivingEntity { friend class MobSpawner; -protected: - // 4J - added for common ctor code - void _init(); public: - Mob(Level* level); - virtual ~Mob(); - // 4J-PB - added to replace (e instanceof Type), avoiding dynamic casts eINSTANCEOF GetType() { return eTYPE_MOB;} static Entity *create(Level *level) { return NULL; } public: - static const int ATTACK_DURATION = 5; - static const int PLAYER_HURT_EXPERIENCE_TIME = 20 * 3; - -public: // 4J Stu - Made public - static const int DATA_EFFECT_COLOR_ID = 8; + static const float MAX_WEARING_ARMOR_CHANCE; + static const float MAX_PICKUP_LOOT_CHANCE; + static const float MAX_ENCHANTED_ARMOR_CHANCE; + static const float MAX_ENCHANTED_WEAPON_CHANCE; private: - static const double MIN_MOVEMENT_DISTANCE; - -public: - int invulnerableDuration; - float timeOffs; - float rotA; - float yBodyRot, yBodyRotO; - float yHeadRot, yHeadRotO; - -protected: - float oRun, run; - float animStep, animStepO; - bool hasHair; - // wstring textureName; - int textureIdx; // 4J changed from wstring textureName - bool allowAlpha; - float rotOffs; - wstring modelName; - float bobStrength; - int deathScore; - float renderOffset; - -public: - float walkingSpeed; - float flyingSpeed; - float oAttackAnim, attackAnim; - -protected: - int health; - -public: - int lastHealth; - -protected: - int dmgSpill; + static const int DATA_CUSTOM_NAME = 10; + static const int DATA_CUSTOM_NAME_VISIBLE = 11; public: int ambientSoundTime; - int hurtTime; - int hurtDuration; - float hurtDir; - int deathTime; - int attackTime; - float oTilt, tilt; protected: - bool dead; int xpReward; -public: - int modelNum; - float animSpeed; - float walkAnimSpeedO; - float walkAnimSpeed; - float walkAnimPos; - -protected: - shared_ptr lastHurtByPlayer; - int lastHurtByPlayerTime; - private: - shared_ptr lastHurtByMob; - int lastHurtByMobTime; - shared_ptr lastHurtMob; - -public: - int arrowCount; - int removeArrowTime; - -protected: - map activeEffects; - -private: - bool effectsDirty; - int effectColor; - LookControl *lookControl; MoveControl *moveControl; JumpControl *jumpControl; @@ -129,12 +57,28 @@ protected: GoalSelector targetSelector; private: - shared_ptr target; + shared_ptr target; Sensing *sensing; - float speed; - Pos *restrictCenter; - float restrictRadius; + ItemInstanceArray equipment; + +protected: + floatArray dropChances; + +private: + bool _canPickUpLoot; + bool persistenceRequired; + +protected: + // 4J - added for common ctor code + void _init(); + +public: + Mob(Level* level); + virtual ~Mob(); + +protected: + void registerAttributes(); public: virtual LookControl *getLookControl(); @@ -142,147 +86,46 @@ public: virtual JumpControl *getJumpControl(); virtual PathNavigation *getNavigation(); virtual Sensing *getSensing(); - virtual Random *getRandom(); - virtual shared_ptr getLastHurtByMob(); - virtual shared_ptr getLastHurtMob(); - void setLastHurtMob(shared_ptr target); - virtual int getNoActionTime(); - float getYHeadRot(); - void setYHeadRot(float yHeadRot); - float getSpeed(); - void setSpeed(float speed); - virtual bool doHurtTarget(shared_ptr target); - shared_ptr getTarget(); - virtual void setTarget(shared_ptr target); + shared_ptr getTarget(); + virtual void setTarget(shared_ptr target); virtual bool canAttackType(eINSTANCEOF targetType); virtual void ate(); - bool isWithinRestriction(); - bool isWithinRestriction(int x, int y, int z); - void restrictTo(int x, int y, int z, int radius); - Pos *getRestrictCenter(); - float getRestrictRadius(); - void clearRestriction(); - bool hasRestriction(); - - virtual void setLastHurtByMob(shared_ptr hurtBy); - protected: virtual void defineSynchedData(); public: - bool canSee(shared_ptr target); - virtual int getTexture(); // 4J - changed from wstring to int - virtual bool isPickable() ; - virtual bool isPushable(); - virtual float getHeadHeight(); virtual int getAmbientSoundInterval(); void playAmbientSound(); virtual void baseTick(); protected: - virtual void tickDeath(); - virtual int decreaseAirSupply(int currentSupply); virtual int getExperienceReward(shared_ptr killedBy); - virtual bool isAlwaysExperienceDropper(); - -public: - void spawnAnim(); - virtual void rideTick(); - -protected: - int lSteps; - double lx, ly, lz, lyr, lxr; public: - virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); - -private: - float fallTime; - -public: - void superTick(); + virtual void spawnAnim(); virtual void tick(); - virtual void heal(int heal); - virtual int getMaxHealth() = 0; - virtual int getHealth(); - virtual void setHealth(int health); - -protected: - int lastHurt; - -public: - virtual bool hurt(DamageSource *source, int dmg); protected: - float getVoicePitch(); - -public: - virtual void animateHurt(); - - /** - * Fetches the mob's armor value, from 0 (no armor) to 20 (full armor) - * - * @return - */ - virtual int getArmorValue(); - -protected: - virtual void hurtArmor(int damage); - virtual int getDamageAfterArmorAbsorb(DamageSource *damageSource, int damage); - virtual int getDamageAfterMagicAbsorb(DamageSource *damageSource, int damage); - - virtual void actuallyHurt(DamageSource *source, int dmg); - virtual float getSoundVolume(); + virtual float tickHeadTurn(float yBodyRotT, float walkSpeed); virtual int getAmbientSound(); - virtual int getHurtSound(); - virtual int getDeathSound(); - -public: - void knockback(shared_ptr source, int dmg, double xd, double zd); - virtual void die(DamageSource *source); - -protected: - virtual void dropRareDeathLoot(int rareLootLevel); - virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); virtual int getDeathLoot(); - virtual void causeFallDamage(float distance); + virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: - virtual void travel(float xa, float ya); - virtual bool onLadder(); - virtual bool isShootable(); virtual void addAdditonalSaveData(CompoundTag *entityTag); virtual void readAdditionalSaveData(CompoundTag *tag); - virtual bool isAlive(); - virtual bool isWaterMob(); - virtual int getLightColor(float a); // 4J - added protected: - int noActionTime; - float xxa, yya, yRotA; - bool jumping; float defaultLookAngle; - float runSpeed; -protected: - int noJumpDelay; public: virtual void setYya(float yya); - virtual void setJumping(bool jump); - + virtual void setSpeed(float speed); virtual void aiStep(); protected: virtual bool useNewAi(); - virtual bool isEffectiveAI(); - virtual bool isImmobile(); - -public: - virtual bool isBlocking(); - -protected: - virtual void jumpFromGround(); virtual bool removeWhenFarAway(); private: @@ -293,7 +136,6 @@ protected: virtual void checkDespawn(); virtual void newServerAiStep(); - virtual void serverAiMobStep(); virtual void serverAiStep(); public: @@ -309,60 +151,79 @@ private: public: virtual bool canSpawn(); - -protected: - virtual void outOfWorld(); - -public: - float getAttackAnim(float a); - virtual Vec3 *getPos(float a); - virtual Vec3 *getLookAngle(); - Vec3 *getViewVector(float a); virtual float getSizeScale(); virtual float getHeadSizeScale(); - HitResult *pick(double range, float a); virtual int getMaxSpawnClusterSize(); + virtual int getMaxFallDistance(); virtual shared_ptr getCarriedItem(); + virtual shared_ptr getCarried(int slot); virtual shared_ptr getArmor(int pos); - virtual void handleEntityEvent(byte id); - virtual bool isSleeping(); - virtual Icon *getItemInHandIcon(shared_ptr item, int layer); - virtual bool shouldRender(Vec3 *c); + virtual void setEquippedSlot(int slot, shared_ptr item); + virtual ItemInstanceArray getEquipmentSlots(); protected: - void tickEffects(); + virtual void dropEquipment(bool byPlayer, int playerBonusLevel); + virtual void populateDefaultEquipmentSlots(); public: - void removeAllEffects(); - vector *getActiveEffects(); - bool hasEffect(int id); - bool hasEffect(MobEffect *effect); - MobEffectInstance *getEffect(MobEffect *effect); - void addEffect(MobEffectInstance *newEffect); - void addEffectNoUpdate(MobEffectInstance *newEffect); // 4J Added - virtual bool canBeAffected(MobEffectInstance *newEffect); - virtual bool isInvertedHealAndHarm(); - void removeEffectNoUpdate(int effectId); - void removeEffect(int effectId); + static int getEquipmentSlotForItem(shared_ptr item); + static Item *getEquipmentForSlot(int slot, int type); protected: - virtual void onEffectAdded(MobEffectInstance *effect); - virtual void onEffectUpdated(MobEffectInstance *effect); - virtual void onEffectRemoved(MobEffectInstance *effect); + virtual void populateDefaultEquipmentEnchantments(); public: - virtual float getWalkingSpeedModifier(); + /** + * Added this method so mobs can handle their own spawn settings instead of + * hacking MobSpawner.java + * + * @param groupData + * TODO + * @return TODO + */ + virtual MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param + virtual void finalizeSpawnEggSpawn(int extraData); // 4J Added + virtual bool canBeControlledByRider(); + virtual wstring getAName(); + virtual void setPersistenceRequired(); + virtual void setCustomName(const wstring &name); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomNameVisible(bool visible); + virtual bool isCustomNameVisible(); + virtual bool shouldShowName(); + virtual void setDropChance(int slot, float pct); + virtual bool canPickUpLoot(); + virtual void setCanPickUpLoot(bool canPickUpLoot); + virtual bool isPersistenceRequired(); + virtual bool interact(shared_ptr player); - // 4J-Pb added (from 1.2.3) - virtual void teleportTo(double x, double y, double z); - virtual bool isBaby(); - virtual MobType getMobType(); - virtual void breakItem(shared_ptr itemInstance); +protected: + virtual bool mobInteract(shared_ptr player); - virtual bool isInvulnerable(); + // roper / leash methods - virtual void finalizeMobSpawn(); - virtual bool canBeControlledByRider(); +private: + bool _isLeashed; + shared_ptr leashHolder; + CompoundTag *leashInfoTag; + +protected: + virtual void tickLeash(); + +public: + virtual void dropLeash(bool synch, bool createItemDrop); + virtual bool canBeLeashed(); + virtual bool isLeashed(); + virtual shared_ptr getLeashHolder(); + virtual void setLeashedTo(shared_ptr holder, bool synch); + +private: + virtual void restoreLeashFromSave(); + virtual bool shouldRender(Vec3 *c); + + +public: // 4J Added override to update ai elements when loading entity from schematics virtual void setLevel(Level *level); diff --git a/Minecraft.World/MobCategory.cpp b/Minecraft.World/MobCategory.cpp index 787b2004..507be6ed 100644 --- a/Minecraft.World/MobCategory.cpp +++ b/Minecraft.World/MobCategory.cpp @@ -7,35 +7,38 @@ MobCategory *MobCategory::monster = NULL; MobCategory *MobCategory::creature = NULL; +MobCategory *MobCategory::ambient = NULL; MobCategory *MobCategory::waterCreature = NULL; // 4J - added these extra categories MobCategory *MobCategory::creature_wolf = NULL; MobCategory *MobCategory::creature_chicken = NULL; MobCategory *MobCategory::creature_mushroomcow = NULL; -MobCategoryArray MobCategory::values = MobCategoryArray(6); +MobCategoryArray MobCategory::values = MobCategoryArray(7); void MobCategory::staticCtor() { // 4J - adjusted the max levels here for the xbox version, which now represent the max levels in the whole world - monster = new MobCategory(70, Material::air, false, eTYPE_MONSTER, false, CONSOLE_MONSTERS_HARD_LIMIT); - creature = new MobCategory(10, Material::air, true, eTYPE_ANIMALS_SPAWN_LIMIT_CHECK, false, CONSOLE_ANIMALS_HARD_LIMIT); - waterCreature = new MobCategory(5, Material::water, true, eTYPE_WATERANIMAL, false, CONSOLE_SQUID_HARD_LIMIT); + monster = new MobCategory(70, Material::air, false, false, eTYPE_MONSTER, false, CONSOLE_MONSTERS_HARD_LIMIT); + creature = new MobCategory(10, Material::air, true, true, eTYPE_ANIMALS_SPAWN_LIMIT_CHECK, false, CONSOLE_ANIMALS_HARD_LIMIT); + ambient = new MobCategory(15, Material::air, true, false, eTYPE_AMBIENT, false, CONSOLE_AMBIENT_HARD_LIMIT), + waterCreature = new MobCategory(5, Material::water, true, false, eTYPE_WATERANIMAL, false, CONSOLE_SQUID_HARD_LIMIT); values[0] = monster; values[1] = creature; - values[2] = waterCreature; + values[2] = ambient; + values[3] = waterCreature; // 4J - added 2 new categories to give us better control over spawning wolves & chickens - creature_wolf = new MobCategory(3, Material::air, true, eTYPE_WOLF, true, MAX_XBOX_WOLVES); - creature_chicken = new MobCategory( 2, Material::air, true, eTYPE_CHICKEN, true, MAX_XBOX_CHICKENS); - creature_mushroomcow = new MobCategory(2, Material::air, true, eTYPE_MUSHROOMCOW, true, MAX_XBOX_MUSHROOMCOWS); - values[3] = creature_wolf; - values[4] = creature_chicken; - values[5] = creature_mushroomcow; + creature_wolf = new MobCategory(3, Material::air, true, true, eTYPE_WOLF, true, MAX_XBOX_WOLVES); + creature_chicken = new MobCategory( 2, Material::air, true, true, eTYPE_CHICKEN, true, MAX_XBOX_CHICKENS); + creature_mushroomcow = new MobCategory(2, Material::air, true, true, eTYPE_MUSHROOMCOW, true, MAX_XBOX_MUSHROOMCOWS); + values[4] = creature_wolf; + values[5] = creature_chicken; + values[6] = creature_mushroomcow; } -MobCategory::MobCategory(int maxVar, Material *spawnPositionMaterial, bool isFriendly, eINSTANCEOF eBase, bool isSingleType, int maxPerLevel) - : m_max(maxVar), spawnPositionMaterial(spawnPositionMaterial), m_isFriendly(isFriendly), m_eBase(eBase), m_isSingleType(isSingleType), m_maxPerLevel(maxPerLevel) +MobCategory::MobCategory(int maxVar, Material *spawnPositionMaterial, bool isFriendly, bool isPersistent, eINSTANCEOF eBase, bool isSingleType, int maxPerLevel) + : m_max(maxVar), spawnPositionMaterial(spawnPositionMaterial), m_isFriendly(isFriendly), m_isPersistent(isPersistent), m_eBase(eBase), m_isSingleType(isSingleType), m_maxPerLevel(maxPerLevel) { } @@ -69,3 +72,8 @@ bool MobCategory::isSingleType() { return m_isSingleType; } + +bool MobCategory::isPersistent() +{ + return m_isPersistent; +} diff --git a/Minecraft.World/MobCategory.h b/Minecraft.World/MobCategory.h index a978c40e..4fe5c826 100644 --- a/Minecraft.World/MobCategory.h +++ b/Minecraft.World/MobCategory.h @@ -9,6 +9,7 @@ public: // 4J - putting constants for xbox spawning in one place to tidy things up a bit - all numbers are per level static const int CONSOLE_MONSTERS_HARD_LIMIT = 50; // Max number of enemies (skeleton, zombie, creeper etc) that the mob spawner will produce static const int CONSOLE_ANIMALS_HARD_LIMIT = 50; // Max number of animals (cows, sheep, pigs) that the mob spawner will produce + static const int CONSOLE_AMBIENT_HARD_LIMIT = 20; // Ambient mobs static const int MAX_XBOX_CHICKENS = 8; // Max number of chickens that the mob spawner will produce static const int MAX_XBOX_WOLVES = 8; // Max number of wolves that the mob spawner will produce @@ -16,6 +17,7 @@ public: static const int MAX_XBOX_SNOWMEN = 16; // Max number of snow golems that can be created by placing blocks - 4J-PB increased limit due to player requests static const int MAX_XBOX_IRONGOLEM = 16; // Max number of iron golems that can be created by placing blocks - 4J-PB increased limit due to player requests static const int CONSOLE_SQUID_HARD_LIMIT = 5; + static const int MAX_CONSOLE_BOSS = 1; // Max number of bosses (enderdragon/wither) static const int MAX_XBOX_ANIMALS_WITH_BREEDING = CONSOLE_ANIMALS_HARD_LIMIT + 20; // Max number of animals that we can produce (in total), when breeding static const int MAX_XBOX_CHICKENS_WITH_BREEDING = MAX_XBOX_CHICKENS + 8; // Max number of chickens that we can produce (in total), when breeding/hatching @@ -30,6 +32,7 @@ public: static const int MAX_XBOX_VILLAGERS_WITH_SPAWN_EGG = MAX_VILLAGERS_WITH_BREEDING + 15; // 4J-PB - increased this limit due to player requests static const int MAX_XBOX_MUSHROOMCOWS_WITH_SPAWN_EGG = MAX_XBOX_MUSHROOMCOWS_WITH_BREEDING + 8; static const int MAX_XBOX_SQUIDS_WITH_SPAWN_EGG = CONSOLE_SQUID_HARD_LIMIT + 8; + static const int MAX_AMBIENT_WITH_SPAWN_EGG = CONSOLE_AMBIENT_HARD_LIMIT + 8; /* Maximum animals = 50 + 20 + 20 = 90 @@ -48,6 +51,7 @@ public: static MobCategory *monster; static MobCategory *creature; + static MobCategory *ambient; static MobCategory *waterCreature; // 4J added extra categories, to break these out of general creatures & give us more control of levels static MobCategory *creature_wolf; @@ -64,10 +68,11 @@ private: const int m_maxPerLevel; const Material *spawnPositionMaterial; const bool m_isFriendly; + const bool m_isPersistent; const bool m_isSingleType; // 4J Added - const eINSTANCEOF m_eBase; // 4J added + const eINSTANCEOF m_eBase; // 4J added - MobCategory(int maxVar, Material *spawnPositionMaterial, bool isFriendly, eINSTANCEOF eBase, bool isSingleType, int maxPerLevel); + MobCategory(int maxVar, Material *spawnPositionMaterial, bool isFriendly, bool isPersistent, eINSTANCEOF eBase, bool isSingleType, int maxPerLevel); public: const type_info getBaseClass(); @@ -77,6 +82,8 @@ public: Material *getSpawnPositionMaterial(); bool isFriendly(); bool isSingleType(); + bool isPersistent(); + public: static void staticCtor(); }; diff --git a/Minecraft.World/MobEffect.cpp b/Minecraft.World/MobEffect.cpp index f9687a15..61aee91f 100644 --- a/Minecraft.World/MobEffect.cpp +++ b/Minecraft.World/MobEffect.cpp @@ -1,5 +1,9 @@ #include "stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.level.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.world.food.h" #include "net.minecraft.world.effect.h" @@ -7,39 +11,74 @@ MobEffect *MobEffect::effects[NUM_EFFECTS]; -MobEffect *MobEffect::voidEffect = NULL; -MobEffect *MobEffect::movementSpeed = (new MobEffect(1, false, eMinecraftColour_Effect_MovementSpeed)) ->setDescriptionId(IDS_POTION_MOVESPEED) ->setPostfixDescriptionId(IDS_POTION_MOVESPEED_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Speed); //setIcon(0, 0); -MobEffect *MobEffect::movementSlowdown = (new MobEffect(2, true, eMinecraftColour_Effect_MovementSlowDown)) ->setDescriptionId(IDS_POTION_MOVESLOWDOWN) ->setPostfixDescriptionId(IDS_POTION_MOVESLOWDOWN_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Slowness); //->setIcon(1, 0); -MobEffect *MobEffect::digSpeed = (new MobEffect(3, false, eMinecraftColour_Effect_DigSpeed)) ->setDescriptionId(IDS_POTION_DIGSPEED) ->setPostfixDescriptionId(IDS_POTION_DIGSPEED_POSTFIX)->setDurationModifier(1.5)->setIcon(MobEffect::e_MobEffectIcon_Haste); //->setIcon(2, 0); -MobEffect *MobEffect::digSlowdown = (new MobEffect(4, true, eMinecraftColour_Effect_DigSlowdown)) ->setDescriptionId(IDS_POTION_DIGSLOWDOWN) ->setPostfixDescriptionId(IDS_POTION_DIGSLOWDOWN_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_MiningFatigue); //->setIcon(3, 0); -MobEffect *MobEffect::damageBoost = (new MobEffect(5, false, eMinecraftColour_Effect_DamageBoost)) ->setDescriptionId(IDS_POTION_DAMAGEBOOST) ->setPostfixDescriptionId(IDS_POTION_DAMAGEBOOST_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Strength); //->setIcon(4, 0); -MobEffect *MobEffect::heal = (new InstantenousMobEffect(6, false, eMinecraftColour_Effect_Heal)) ->setDescriptionId(IDS_POTION_HEAL) ->setPostfixDescriptionId(IDS_POTION_HEAL_POSTFIX); -MobEffect *MobEffect::harm = (new InstantenousMobEffect(7, true, eMinecraftColour_Effect_Harm)) ->setDescriptionId(IDS_POTION_HARM) ->setPostfixDescriptionId(IDS_POTION_HARM_POSTFIX); -MobEffect *MobEffect::jump = (new MobEffect(8, false, eMinecraftColour_Effect_Jump)) ->setDescriptionId(IDS_POTION_JUMP) ->setPostfixDescriptionId(IDS_POTION_JUMP_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_JumpBoost); //->setIcon(2, 1); -MobEffect *MobEffect::confusion = (new MobEffect(9, true, eMinecraftColour_Effect_Confusion)) ->setDescriptionId(IDS_POTION_CONFUSION) ->setPostfixDescriptionId(IDS_POTION_CONFUSION_POSTFIX)->setDurationModifier(.25)->setIcon(MobEffect::e_MobEffectIcon_Nausea); //->setIcon(3, 1); -MobEffect *MobEffect::regeneration = (new MobEffect(10, false, eMinecraftColour_Effect_Regeneration)) ->setDescriptionId(IDS_POTION_REGENERATION) ->setPostfixDescriptionId(IDS_POTION_REGENERATION_POSTFIX)->setDurationModifier(.25)->setIcon(MobEffect::e_MobEffectIcon_Regeneration); //->setIcon(7, 0); -MobEffect *MobEffect::damageResistance = (new MobEffect(11, false, eMinecraftColour_Effect_DamageResistance))->setDescriptionId(IDS_POTION_RESISTANCE) ->setPostfixDescriptionId(IDS_POTION_RESISTANCE_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Resistance); //->setIcon(6, 1); -MobEffect *MobEffect::fireResistance = (new MobEffect(12, false, eMinecraftColour_Effect_FireResistance)) ->setDescriptionId(IDS_POTION_FIRERESISTANCE) ->setPostfixDescriptionId(IDS_POTION_FIRERESISTANCE_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_FireResistance); //->setIcon(7, 1); -MobEffect *MobEffect::waterBreathing = (new MobEffect(13, false, eMinecraftColour_Effect_WaterBreathing)) ->setDescriptionId(IDS_POTION_WATERBREATHING) ->setPostfixDescriptionId(IDS_POTION_WATERBREATHING_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_WaterBreathing); //->setIcon(0, 2); -MobEffect *MobEffect::invisibility = (new MobEffect(14, false, eMinecraftColour_Effect_Invisiblity)) ->setDescriptionId(IDS_POTION_INVISIBILITY) ->setPostfixDescriptionId(IDS_POTION_INVISIBILITY_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Invisiblity); //->setIcon(0, 1); -MobEffect *MobEffect::blindness = (new MobEffect(15, true, eMinecraftColour_Effect_Blindness)) ->setDescriptionId(IDS_POTION_BLINDNESS) ->setPostfixDescriptionId(IDS_POTION_BLINDNESS_POSTFIX)->setDurationModifier(.25)->setIcon(MobEffect::e_MobEffectIcon_Blindness); //->setIcon(5, 1); -MobEffect *MobEffect::nightVision = (new MobEffect(16, false, eMinecraftColour_Effect_NightVision)) ->setDescriptionId(IDS_POTION_NIGHTVISION) ->setPostfixDescriptionId(IDS_POTION_NIGHTVISION_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_NightVision); //->setIcon(4, 1); -MobEffect *MobEffect::hunger = (new MobEffect(17, true, eMinecraftColour_Effect_Hunger)) ->setDescriptionId(IDS_POTION_HUNGER) ->setPostfixDescriptionId(IDS_POTION_HUNGER_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Hunger); //->setIcon(1, 1); -MobEffect *MobEffect::weakness = (new MobEffect(18, true, eMinecraftColour_Effect_Weakness)) ->setDescriptionId(IDS_POTION_WEAKNESS) ->setPostfixDescriptionId(IDS_POTION_WEAKNESS_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Weakness); //->setIcon(5, 0); -MobEffect *MobEffect::poison = (new MobEffect(19, true, eMinecraftColour_Effect_Poison)) ->setDescriptionId(IDS_POTION_POISON) ->setPostfixDescriptionId(IDS_POTION_POISON_POSTFIX)->setDurationModifier(.25)->setIcon(MobEffect::e_MobEffectIcon_Poison); //->setIcon(6, 0); -MobEffect *MobEffect::reserved_20 = NULL; -MobEffect *MobEffect::reserved_21 = NULL; -MobEffect *MobEffect::reserved_22 = NULL; -MobEffect *MobEffect::reserved_23 = NULL; -MobEffect *MobEffect::reserved_24 = NULL; -MobEffect *MobEffect::reserved_25 = NULL; -MobEffect *MobEffect::reserved_26 = NULL; -MobEffect *MobEffect::reserved_27 = NULL; -MobEffect *MobEffect::reserved_28 = NULL; -MobEffect *MobEffect::reserved_29 = NULL; -MobEffect *MobEffect::reserved_30 = NULL; -MobEffect *MobEffect::reserved_31 = NULL; - +MobEffect *MobEffect::voidEffect; +MobEffect *MobEffect::movementSpeed; +MobEffect *MobEffect::movementSlowdown; +MobEffect *MobEffect::digSpeed; +MobEffect *MobEffect::digSlowdown; +MobEffect *MobEffect::damageBoost; +MobEffect *MobEffect::heal; +MobEffect *MobEffect::harm; +MobEffect *MobEffect::jump; +MobEffect *MobEffect::confusion; +MobEffect *MobEffect::regeneration; +MobEffect *MobEffect::damageResistance; +MobEffect *MobEffect::fireResistance; +MobEffect *MobEffect::waterBreathing; +MobEffect *MobEffect::invisibility; +MobEffect *MobEffect::blindness; +MobEffect *MobEffect::nightVision; +MobEffect *MobEffect::hunger; +MobEffect *MobEffect::weakness; +MobEffect *MobEffect::poison; +MobEffect *MobEffect::wither; +MobEffect *MobEffect::healthBoost; +MobEffect *MobEffect::absorption; +MobEffect *MobEffect::saturation; +MobEffect *MobEffect::reserved_24; +MobEffect *MobEffect::reserved_25; +MobEffect *MobEffect::reserved_26; +MobEffect *MobEffect::reserved_27; +MobEffect *MobEffect::reserved_28; +MobEffect *MobEffect::reserved_29; +MobEffect *MobEffect::reserved_30; +MobEffect *MobEffect::reserved_31; + +void MobEffect::staticCtor() +{ + voidEffect = NULL; + movementSpeed = (new MobEffect(1, false, eMinecraftColour_Effect_MovementSpeed)) ->setDescriptionId(IDS_POTION_MOVESPEED) ->setPostfixDescriptionId(IDS_POTION_MOVESPEED_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Speed)->addAttributeModifier(SharedMonsterAttributes::MOVEMENT_SPEED, eModifierId_POTION_MOVESPEED, 0.2f, AttributeModifier::OPERATION_MULTIPLY_TOTAL); //setIcon(0, 0); + movementSlowdown = (new MobEffect(2, true, eMinecraftColour_Effect_MovementSlowDown)) ->setDescriptionId(IDS_POTION_MOVESLOWDOWN) ->setPostfixDescriptionId(IDS_POTION_MOVESLOWDOWN_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Slowness)->addAttributeModifier(SharedMonsterAttributes::MOVEMENT_SPEED, eModifierId_POTION_MOVESLOWDOWN, -0.15f, AttributeModifier::OPERATION_MULTIPLY_TOTAL); //->setIcon(1, 0); + digSpeed = (new MobEffect(3, false, eMinecraftColour_Effect_DigSpeed)) ->setDescriptionId(IDS_POTION_DIGSPEED) ->setPostfixDescriptionId(IDS_POTION_DIGSPEED_POSTFIX)->setDurationModifier(1.5)->setIcon(MobEffect::e_MobEffectIcon_Haste); //->setIcon(2, 0); + digSlowdown = (new MobEffect(4, true, eMinecraftColour_Effect_DigSlowdown)) ->setDescriptionId(IDS_POTION_DIGSLOWDOWN) ->setPostfixDescriptionId(IDS_POTION_DIGSLOWDOWN_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_MiningFatigue); //->setIcon(3, 0); + damageBoost = (new AttackDamageMobEffect(5, false, eMinecraftColour_Effect_DamageBoost)) ->setDescriptionId(IDS_POTION_DAMAGEBOOST) ->setPostfixDescriptionId(IDS_POTION_DAMAGEBOOST_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Strength)->addAttributeModifier(SharedMonsterAttributes::ATTACK_DAMAGE, eModifierId_POTION_DAMAGEBOOST, 3, AttributeModifier::OPERATION_MULTIPLY_TOTAL); //->setIcon(4, 0); + heal = (new InstantenousMobEffect(6, false, eMinecraftColour_Effect_Heal)) ->setDescriptionId(IDS_POTION_HEAL) ->setPostfixDescriptionId(IDS_POTION_HEAL_POSTFIX); + harm = (new InstantenousMobEffect(7, true, eMinecraftColour_Effect_Harm)) ->setDescriptionId(IDS_POTION_HARM) ->setPostfixDescriptionId(IDS_POTION_HARM_POSTFIX); + jump = (new MobEffect(8, false, eMinecraftColour_Effect_Jump)) ->setDescriptionId(IDS_POTION_JUMP) ->setPostfixDescriptionId(IDS_POTION_JUMP_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_JumpBoost); //->setIcon(2, 1); + confusion = (new MobEffect(9, true, eMinecraftColour_Effect_Confusion)) ->setDescriptionId(IDS_POTION_CONFUSION) ->setPostfixDescriptionId(IDS_POTION_CONFUSION_POSTFIX)->setDurationModifier(.25)->setIcon(MobEffect::e_MobEffectIcon_Nausea); //->setIcon(3, 1); + regeneration = (new MobEffect(10, false, eMinecraftColour_Effect_Regeneration)) ->setDescriptionId(IDS_POTION_REGENERATION) ->setPostfixDescriptionId(IDS_POTION_REGENERATION_POSTFIX)->setDurationModifier(.25)->setIcon(MobEffect::e_MobEffectIcon_Regeneration); //->setIcon(7, 0); + damageResistance = (new MobEffect(11, false, eMinecraftColour_Effect_DamageResistance)) ->setDescriptionId(IDS_POTION_RESISTANCE) ->setPostfixDescriptionId(IDS_POTION_RESISTANCE_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Resistance); //->setIcon(6, 1); + fireResistance = (new MobEffect(12, false, eMinecraftColour_Effect_FireResistance)) ->setDescriptionId(IDS_POTION_FIRERESISTANCE) ->setPostfixDescriptionId(IDS_POTION_FIRERESISTANCE_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_FireResistance); //->setIcon(7, 1); + waterBreathing = (new MobEffect(13, false, eMinecraftColour_Effect_WaterBreathing)) ->setDescriptionId(IDS_POTION_WATERBREATHING) ->setPostfixDescriptionId(IDS_POTION_WATERBREATHING_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_WaterBreathing); //->setIcon(0, 2); + invisibility = (new MobEffect(14, false, eMinecraftColour_Effect_Invisiblity)) ->setDescriptionId(IDS_POTION_INVISIBILITY) ->setPostfixDescriptionId(IDS_POTION_INVISIBILITY_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Invisiblity); //->setIcon(0, 1); + blindness = (new MobEffect(15, true, eMinecraftColour_Effect_Blindness)) ->setDescriptionId(IDS_POTION_BLINDNESS) ->setPostfixDescriptionId(IDS_POTION_BLINDNESS_POSTFIX)->setDurationModifier(.25)->setIcon(MobEffect::e_MobEffectIcon_Blindness); //->setIcon(5, 1); + nightVision = (new MobEffect(16, false, eMinecraftColour_Effect_NightVision)) ->setDescriptionId(IDS_POTION_NIGHTVISION) ->setPostfixDescriptionId(IDS_POTION_NIGHTVISION_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_NightVision); //->setIcon(4, 1); + hunger = (new MobEffect(17, true, eMinecraftColour_Effect_Hunger)) ->setDescriptionId(IDS_POTION_HUNGER) ->setPostfixDescriptionId(IDS_POTION_HUNGER_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Hunger); //->setIcon(1, 1); + weakness = (new AttackDamageMobEffect(18, true, eMinecraftColour_Effect_Weakness)) ->setDescriptionId(IDS_POTION_WEAKNESS) ->setPostfixDescriptionId(IDS_POTION_WEAKNESS_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Weakness)->addAttributeModifier(SharedMonsterAttributes::ATTACK_DAMAGE, eModifierId_POTION_WEAKNESS, 2, AttributeModifier::OPERATION_ADDITION); //->setIcon(5, 0); + poison = (new MobEffect(19, true, eMinecraftColour_Effect_Poison)) ->setDescriptionId(IDS_POTION_POISON) ->setPostfixDescriptionId(IDS_POTION_POISON_POSTFIX)->setDurationModifier(.25)->setIcon(MobEffect::e_MobEffectIcon_Poison); //->setIcon(6, 0); + wither = (new MobEffect(20, true, eMinecraftColour_Effect_Wither)) ->setDescriptionId(IDS_POTION_WITHER) ->setPostfixDescriptionId(IDS_POTION_WITHER_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Wither)->setDurationModifier(.25); + healthBoost = (new HealthBoostMobEffect(21, false, eMinecraftColour_Effect_HealthBoost)) ->setDescriptionId(IDS_POTION_HEALTHBOOST) ->setPostfixDescriptionId(IDS_POTION_HEALTHBOOST_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_HealthBoost)->addAttributeModifier(SharedMonsterAttributes::MAX_HEALTH, eModifierId_POTION_HEALTHBOOST, 4, AttributeModifier::OPERATION_ADDITION); + absorption = (new AbsoptionMobEffect(22, false, eMinecraftColour_Effect_Absoprtion)) ->setDescriptionId(IDS_POTION_ABSORPTION) ->setPostfixDescriptionId(IDS_POTION_ABSORPTION_POSTFIX)->setIcon(MobEffect::e_MobEffectIcon_Absorption); + saturation = (new InstantenousMobEffect(23, false, eMinecraftColour_Effect_Saturation)) ->setDescriptionId(IDS_POTION_SATURATION) ->setPostfixDescriptionId(IDS_POTION_SATURATION_POSTFIX); + reserved_24 = NULL; + reserved_25 = NULL; + reserved_26 = NULL; + reserved_27 = NULL; + reserved_28 = NULL; + reserved_29 = NULL; + reserved_30 = NULL; + reserved_31 = NULL; +} MobEffect::MobEffect(int id, bool isHarmful, eMinecraftColour color) : id(id), _isHarmful(isHarmful), color(color) { @@ -86,9 +125,8 @@ int MobEffect::getId() * @param mob * @param amplification */ -void MobEffect::applyEffectTick(shared_ptr mob, int amplification) +void MobEffect::applyEffectTick(shared_ptr mob, int amplification) { - // Maybe move this to separate class implementations in the future? if (id == regeneration->id) { @@ -104,15 +142,26 @@ void MobEffect::applyEffectTick(shared_ptr mob, int amplification) mob->hurt(DamageSource::magic, 1); } } - else if (id == hunger->id && dynamic_pointer_cast(mob) != NULL) + else if (id == wither->id) + { + mob->hurt(DamageSource::wither, 1); + } + else if ( (id == hunger->id) && mob->instanceof(eTYPE_PLAYER) ) { // every tick, cause the same amount of exhaustion as when removing // a block, times amplification dynamic_pointer_cast(mob)->causeFoodExhaustion(FoodConstants::EXHAUSTION_MINE * (amplification + 1)); } + else if ( (id == saturation->id) && mob->instanceof(eTYPE_PLAYER) ) + { + if (!mob->level->isClientSide) + { + dynamic_pointer_cast(mob)->getFoodData()->eat(amplification + 1, FoodConstants::FOOD_SATURATION_MAX); + } + } else if ((id == heal->id && !mob->isInvertedHealAndHarm()) || (id == harm->id && mob->isInvertedHealAndHarm())) { - mob->heal(6 << amplification); + mob->heal(max(4 << amplification, 0)); } else if ((id == harm->id && !mob->isInvertedHealAndHarm()) || (id == heal->id && mob->isInvertedHealAndHarm())) { @@ -120,11 +169,11 @@ void MobEffect::applyEffectTick(shared_ptr mob, int amplification) } } -void MobEffect::applyInstantenousEffect(shared_ptr source, shared_ptr mob, int amplification, double scale) +void MobEffect::applyInstantenousEffect(shared_ptr source, shared_ptr mob, int amplification, double scale) { if ((id == heal->id && !mob->isInvertedHealAndHarm()) || (id == harm->id && mob->isInvertedHealAndHarm())) { - int amount = (int) (scale * (double) (6 << amplification) + .5); + int amount = (int) (scale * (double) (4 << amplification) + .5); mob->heal(amount); } else if ((id == harm->id && !mob->isInvertedHealAndHarm()) || (id == heal->id && mob->isInvertedHealAndHarm())) @@ -162,7 +211,17 @@ bool MobEffect::isDurationEffectTick(int remainingDuration, int amplification) { // Maybe move this to separate class implementations in the future? - if (id == regeneration->id || id == poison->id) + if (id == regeneration->id) + { + // tick intervals are 50, 25, 12, 6.. + int interval = 50 >> amplification; + if (interval > 0) + { + return (remainingDuration % interval) == 0; + } + return true; + } + else if (id == poison->id) { // tick intervals are 25, 12, 6.. int interval = 25 >> amplification; @@ -172,6 +231,15 @@ bool MobEffect::isDurationEffectTick(int remainingDuration, int amplification) } return true; } + else if (id == wither->id) + { + int interval = 40 >> amplification; + if (interval > 0) + { + return (remainingDuration % interval) == 0; + } + return true; + } else if (id == hunger->id) { return true; @@ -219,6 +287,10 @@ bool MobEffect::isHarmful() wstring MobEffect::formatDuration(MobEffectInstance *instance) { + if (instance->isNoCounter()) + { + return L"**:**"; + } int duration = instance->getDuration(); int seconds = duration / SharedConstants::TICKS_PER_SECOND; @@ -255,7 +327,7 @@ double MobEffect::getDurationModifier() MobEffect *MobEffect::setDisabled() { - this->_isDisabled = true; + _isDisabled = true; return this; } @@ -267,4 +339,49 @@ bool MobEffect::isDisabled() eMinecraftColour MobEffect::getColor() { return color; +} + +MobEffect *MobEffect::addAttributeModifier(Attribute *attribute, eMODIFIER_ID id, double amount, int operation) +{ + AttributeModifier *effect = new AttributeModifier(id, amount, operation); + attributeModifiers.insert(std::pair(attribute, effect)); + return this; +} + +unordered_map *MobEffect::getAttributeModifiers() +{ + return &attributeModifiers; +} + +void MobEffect::removeAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier) +{ + for (AUTO_VAR(it, attributeModifiers.begin()); it != attributeModifiers.end(); ++it) + { + AttributeInstance *attribute = attributes->getInstance(it->first); + + if (attribute != NULL) + { + attribute->removeModifier(it->second); + } + } +} + +void MobEffect::addAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier) +{ + for (AUTO_VAR(it, attributeModifiers.begin()); it != attributeModifiers.end(); ++it) + { + AttributeInstance *attribute = attributes->getInstance(it->first); + + if (attribute != NULL) + { + AttributeModifier *original = it->second; + attribute->removeModifier(original); + attribute->addModifier(new AttributeModifier(original->getId(), getAttributeModifierValue(amplifier, original), original->getOperation())); + } + } +} + +double MobEffect::getAttributeModifierValue(int amplifier, AttributeModifier *original) +{ + return original->getAmount() * (amplifier + 1); } \ No newline at end of file diff --git a/Minecraft.World/MobEffect.h b/Minecraft.World/MobEffect.h index b0460bf1..84068452 100644 --- a/Minecraft.World/MobEffect.h +++ b/Minecraft.World/MobEffect.h @@ -1,8 +1,11 @@ #pragma once using namespace std; +#include "AttributeModifier.h" + class Mob; class MobEffectInstance; +class Attribute; class MobEffect { @@ -27,6 +30,9 @@ public: e_MobEffectIcon_Strength, e_MobEffectIcon_WaterBreathing, e_MobEffectIcon_Weakness, + e_MobEffectIcon_Wither, + e_MobEffectIcon_HealthBoost, + e_MobEffectIcon_Absorption, e_MobEffectIcon_COUNT, }; @@ -34,42 +40,45 @@ public: static const int NUM_EFFECTS = 32; static MobEffect *effects[NUM_EFFECTS]; - static MobEffect *voidEffect; - static MobEffect *movementSpeed; - static MobEffect *movementSlowdown; - static MobEffect *digSpeed; - static MobEffect *digSlowdown; - static MobEffect *damageBoost; - static MobEffect *heal; - static MobEffect *harm; - static MobEffect *jump; - static MobEffect *confusion; - static MobEffect *regeneration; - static MobEffect *damageResistance; - static MobEffect *fireResistance; - static MobEffect *waterBreathing; - static MobEffect *invisibility; - static MobEffect *blindness; - static MobEffect *nightVision; - static MobEffect *hunger; - static MobEffect *weakness; - static MobEffect *poison; - static MobEffect *reserved_20; - static MobEffect *reserved_21; - static MobEffect *reserved_22; - static MobEffect *reserved_23; - static MobEffect *reserved_24; - static MobEffect *reserved_25; - static MobEffect *reserved_26; - static MobEffect *reserved_27; - static MobEffect *reserved_28; - static MobEffect *reserved_29; - static MobEffect *reserved_30; - static MobEffect *reserved_31; - - const int id; + static MobEffect *voidEffect; + static MobEffect *movementSpeed; + static MobEffect *movementSlowdown; + static MobEffect *digSpeed; + static MobEffect *digSlowdown; + static MobEffect *damageBoost; + static MobEffect *heal; + static MobEffect *harm; + static MobEffect *jump; + static MobEffect *confusion; + static MobEffect *regeneration; + static MobEffect *damageResistance; + static MobEffect *fireResistance; + static MobEffect *waterBreathing; + static MobEffect *invisibility; + static MobEffect *blindness; + static MobEffect *nightVision; + static MobEffect *hunger; + static MobEffect *weakness; + static MobEffect *poison; + static MobEffect *wither; + static MobEffect *healthBoost; + static MobEffect *absorption; + static MobEffect *saturation; + static MobEffect *reserved_24; + static MobEffect *reserved_25; + static MobEffect *reserved_26; + static MobEffect *reserved_27; + static MobEffect *reserved_28; + static MobEffect *reserved_29; + static MobEffect *reserved_30; + static MobEffect *reserved_31; + + const int id; + + static void staticCtor(); private: + unordered_map attributeModifiers; int descriptionId; int m_postfixDescriptionId; // 4J added EMobEffectIcon icon; // 4J changed type @@ -85,15 +94,15 @@ protected: MobEffect *setIcon(EMobEffectIcon icon); public: - int getId(); - void applyEffectTick(shared_ptr mob, int amplification); - void applyInstantenousEffect(shared_ptr source, shared_ptr mob, int amplification, double scale); - virtual bool isInstantenous(); - virtual bool isDurationEffectTick(int remainingDuration, int amplification); + virtual int getId(); + virtual void applyEffectTick(shared_ptr mob, int amplification); + virtual void applyInstantenousEffect(shared_ptr source, shared_ptr mob, int amplification, double scale); + virtual bool isInstantenous(); + virtual bool isDurationEffectTick(int remainingDuration, int amplification); MobEffect *setDescriptionId(unsigned int id); unsigned int getDescriptionId(int iData = -1); - + // 4J Added MobEffect *setPostfixDescriptionId(unsigned int id); unsigned int getPostfixDescriptionId(int iData = -1); @@ -107,8 +116,14 @@ protected: MobEffect *setDurationModifier(double durationModifier); public: - double getDurationModifier(); - MobEffect *setDisabled(); - bool isDisabled(); - eMinecraftColour getColor(); + virtual double getDurationModifier(); + virtual MobEffect *setDisabled(); + virtual bool isDisabled(); + virtual eMinecraftColour getColor(); + + virtual MobEffect *addAttributeModifier(Attribute *attribute, eMODIFIER_ID id, double amount, int operation); + virtual unordered_map *getAttributeModifiers(); + virtual void removeAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier); + virtual void addAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier); + virtual double getAttributeModifierValue(int amplifier, AttributeModifier *original); }; \ No newline at end of file diff --git a/Minecraft.World/MobEffectInstance.cpp b/Minecraft.World/MobEffectInstance.cpp index 1e15e58c..2ca696f6 100644 --- a/Minecraft.World/MobEffectInstance.cpp +++ b/Minecraft.World/MobEffectInstance.cpp @@ -6,6 +6,10 @@ void MobEffectInstance::_init(int id, int duration, int amplifier) this->id = id; this->duration = duration; this->amplifier = amplifier; + + splash = false; + ambient = false; + noCounter = false; } MobEffectInstance::MobEffectInstance(int id) @@ -23,27 +27,40 @@ MobEffectInstance::MobEffectInstance(int id, int duration, int amplifier) _init(id,duration,amplifier); } +MobEffectInstance::MobEffectInstance(int id, int duration, int amplifier, bool ambient) +{ + _init(id,duration,amplifier); + this->ambient = ambient; +} + MobEffectInstance::MobEffectInstance(MobEffectInstance *copy) { this->id = copy->id; this->duration = copy->duration; this->amplifier = copy->amplifier; + this->splash = copy->splash; + this->ambient = copy->ambient; + this->noCounter = copy->noCounter; } void MobEffectInstance::update(MobEffectInstance *takeOver) { - if (this->id != takeOver->id) + if (id != takeOver->id) { app.DebugPrintf("This method should only be called for matching effects!"); } - if (takeOver->amplifier > this->amplifier) + if (takeOver->amplifier > amplifier) { - this->amplifier = takeOver->amplifier; - this->duration = takeOver->duration; + amplifier = takeOver->amplifier; + duration = takeOver->duration; } - else if (takeOver->amplifier == this->amplifier && this->duration < takeOver->duration) + else if (takeOver->amplifier == amplifier && duration < takeOver->duration) { - this->duration = takeOver->duration; + duration = takeOver->duration; + } + else if (!takeOver->ambient && ambient) + { + ambient = takeOver->ambient; } } @@ -62,13 +79,28 @@ int MobEffectInstance::getAmplifier() return amplifier; } +bool MobEffectInstance::isSplash() +{ + return splash; +} + +void MobEffectInstance::setSplash(bool splash) +{ + this->splash = splash; +} + +bool MobEffectInstance::isAmbient() +{ + return ambient; +} + /** * Runs the effect on a Mob target. * * @param target * @return True if the effect is still active. */ -bool MobEffectInstance::tick(shared_ptr target) +bool MobEffectInstance::tick(shared_ptr target) { if (duration > 0) { @@ -86,7 +118,7 @@ int MobEffectInstance::tickDownDuration() return --duration; } -void MobEffectInstance::applyEffect(shared_ptr mob) +void MobEffectInstance::applyEffect(shared_ptr mob) { if (duration > 0) { @@ -133,7 +165,35 @@ wstring MobEffectInstance::toString() } // Was bool equals(Object obj) -bool MobEffectInstance::equals(MobEffectInstance *obj) +bool MobEffectInstance::equals(MobEffectInstance *instance) +{ + return id == instance->id && amplifier == instance->amplifier && duration == instance->duration && splash == instance->splash && ambient == instance->ambient; +} + +CompoundTag *MobEffectInstance::save(CompoundTag *tag) +{ + tag->putByte(L"Id", (byte) getId()); + tag->putByte(L"Amplifier", (byte) getAmplifier()); + tag->putInt(L"Duration", getDuration()); + tag->putBoolean(L"Ambient", isAmbient()); + return tag; +} + +MobEffectInstance *MobEffectInstance::load(CompoundTag *tag) +{ + int id = tag->getByte(L"Id"); + int amplifier = tag->getByte(L"Amplifier"); + int duration = tag->getInt(L"Duration"); + boolean ambient = tag->getBoolean(L"Ambient"); + return new MobEffectInstance(id, duration, amplifier, ambient); +} + +void MobEffectInstance::setNoCounter(bool noCounter) +{ + this->noCounter = noCounter; +} + +bool MobEffectInstance::isNoCounter() { - return this->id == obj->id && this->amplifier == obj->amplifier && this->duration == obj->duration; + return noCounter; } \ No newline at end of file diff --git a/Minecraft.World/MobEffectInstance.h b/Minecraft.World/MobEffectInstance.h index d1c716e6..5d9e68f6 100644 --- a/Minecraft.World/MobEffectInstance.h +++ b/Minecraft.World/MobEffectInstance.h @@ -11,6 +11,9 @@ private: int duration; // sent as byte int amplifier; + bool splash; + bool ambient; + bool noCounter; void _init(int id, int duration, int amplifier); @@ -18,19 +21,25 @@ public: MobEffectInstance(int id); MobEffectInstance(int id, int duration); MobEffectInstance(int id, int duration, int amplifier); + MobEffectInstance(int id, int duration, int amplifier, bool ambient); MobEffectInstance(MobEffectInstance *copy); void update(MobEffectInstance *takeOver); int getId(); int getDuration(); int getAmplifier(); - bool tick(shared_ptr target); + + bool isSplash(); + void setSplash(bool splash); + bool isAmbient(); + + bool tick(shared_ptr target); private: int tickDownDuration(); public: - void applyEffect(shared_ptr mob); + void applyEffect(shared_ptr mob); int getDescriptionId(); int getPostfixDescriptionId(); // 4J Added int hashCode(); @@ -39,4 +48,9 @@ public: // Was bool equals(Object obj) bool equals(MobEffectInstance *obj); + + CompoundTag *save(CompoundTag *tag); + static MobEffectInstance *load(CompoundTag *tag); + void setNoCounter(bool noCounter); + bool isNoCounter(); }; \ No newline at end of file diff --git a/Minecraft.World/MobGroupData.h b/Minecraft.World/MobGroupData.h new file mode 100644 index 00000000..f7b1e1b7 --- /dev/null +++ b/Minecraft.World/MobGroupData.h @@ -0,0 +1,8 @@ +#pragma once + +class MobGroupData +{ +public: + // Required so this class is polymorphic + virtual void emptyFunc() {} +}; \ No newline at end of file diff --git a/Minecraft.World/MobSpawner.cpp b/Minecraft.World/MobSpawner.cpp index d2b4f6fd..8cd60e92 100644 --- a/Minecraft.World/MobSpawner.cpp +++ b/Minecraft.World/MobSpawner.cpp @@ -39,7 +39,7 @@ TilePos MobSpawner::getRandomPosWithin(Level *level, int cx, int cz) unordered_map MobSpawner::chunksToPoll; #endif -const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFriendlies) +const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFriendlies, bool spawnPersistent) { #ifndef _CONTENT_PACKAGE @@ -94,7 +94,7 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie #endif #endif - if (!spawnEnemies && !spawnFriendlies) + if (!spawnEnemies && !spawnFriendlies && !spawnPersistent) { return 0; } @@ -193,15 +193,24 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie MemSect(31); Pos *spawnPos = level->getSharedSpawnPos(); MemSect(0); - + for (unsigned int i = 0; i < MobCategory::values.length; i++) { MobCategory *mobCategory = MobCategory::values[i]; - if ((mobCategory->isFriendly() && !spawnFriendlies) || (!mobCategory->isFriendly() && !spawnEnemies)) + if ((mobCategory->isFriendly() && !spawnFriendlies) || (!mobCategory->isFriendly() && !spawnEnemies) || (mobCategory->isPersistent() && !spawnPersistent)) { continue; } + // 4J - early out for non-main dimensions, if spawning anything friendly + if( mobCategory->isFriendly() ) + { + if( level->dimension->id != 0 ) + { + continue; + } + } + // 4J - this is now quite different to the java version. We just have global max counts for the level whereas the original has a max per chunk that // scales with the number of chunks to be polled. int categoryCount = level->countInstanceOf( mobCategory->getEnumBaseClass(), mobCategory->isSingleType()); @@ -221,8 +230,7 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie #endif if( it->second ) { - // don't add mobs to edge chunks, to prevent adding mobs - // "outside" of the active playground + // don't add mobs to edge chunks, to prevent adding mobs "outside" of the active playground continue; } ChunkPos *cp = (ChunkPos *) (&it->first); @@ -247,6 +255,7 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie int ss = 6; Biome::MobSpawnerData *currentMobType = NULL; + MobGroupData *groupData = NULL; for (int ll = 0; ll < 4; ll++) { @@ -349,8 +358,7 @@ const int MobSpawner::tick(ServerLevel *level, bool spawnEnemies, bool spawnFrie categoryCount++; mob->setDespawnProtected(); // 4J added - default to protected against despawning level->addEntity(mob); - finalizeMobSettings(mob, level, xx, yy, zz); - mob->finalizeMobSpawn(); + groupData = mob->finalizeMobSpawn(groupData); // 4J - change here so that we can't ever make more than the desired amount of entities in each priority. In the original java version // depending on the random spawn positions being considered the only limit as to the number of entities created per category is the number // of chunks to poll. @@ -420,171 +428,7 @@ bool MobSpawner::isSpawnPositionOk(MobCategory *category, Level *level, int x, i int tt = level->getTile(x, y - 1, z); return tt != Tile::unbreakable_Id && !level->isSolidBlockingTile(x, y, z) && !level->getMaterial(x, y, z)->isLiquid() && !level->isSolidBlockingTile(x, y + 1, z); } -} - - -void MobSpawner::finalizeMobSettings(shared_ptr mob, Level *level, float xx, float yy, float zz) -{ - if (dynamic_pointer_cast( mob ) != NULL && level->random->nextInt(100) == 0) - { - shared_ptr skeleton = shared_ptr( new Skeleton(level) ); - skeleton->moveTo(xx, yy, zz, mob->yRot, 0); - level->addEntity(skeleton); - skeleton->ride(mob); - } - else if (dynamic_pointer_cast( mob ) != NULL) - { - (dynamic_pointer_cast( mob ))->setColor(Sheep::getSheepColor(level->random)); - } - else if (dynamic_pointer_cast( mob ) != NULL) - { - if (level->random->nextInt(7) == 0) - { - for (int kitten = 0; kitten < 2; kitten++) - { - shared_ptr ozelot = shared_ptr(new Ozelot(level)); - ozelot->moveTo(xx, yy, zz, mob->yRot, 0); - ozelot->setAge(-20 * 60 * 20); - level->addEntity(ozelot); - } - } - } -} - - -// 4J Stu TODO This was an array of Class type. I haven't made a base Class type yet, but don't need to -// as this can be an array of Mob type? -eINSTANCEOF MobSpawner::bedEnemies[bedEnemyCount] = { - eTYPE_SPIDER, eTYPE_ZOMBIE, eTYPE_SKELETON -}; - - -bool MobSpawner::attackSleepingPlayers(Level *level, vector > *players) -{ - - bool somebodyWokeUp = false; - - PathFinder finder = PathFinder(level, true, false, false, true); - - AUTO_VAR(itEnd, players->end()); - for (AUTO_VAR(it, players->begin()); it != itEnd; it++) - { - shared_ptr player = (*it); - - bool nextPlayer = false; - - for (int attemptCount = 0; attemptCount < 20 && !nextPlayer; attemptCount++)\ - { - - - // limit position within the range of the player - int x = Mth::floor(player->x) + level->random->nextInt(32) - level->random->nextInt(32); - int z = Mth::floor(player->z) + level->random->nextInt(32) - level->random->nextInt(32); - int yStart = Mth::floor(player->y) + level->random->nextInt(16) - level->random->nextInt(16); - if (yStart < 1) - { - yStart = 1; - } - else if (yStart > Level::maxBuildHeight) - { - yStart = Level::maxBuildHeight; - } - - { - int type = level->random->nextInt(bedEnemyCount); - int y = yStart; - - while (y > 2 && !level->isTopSolidBlocking(x, y - 1, z)) - { - y--; - } - - while (!isSpawnPositionOk( (MobCategory *) MobCategory::monster, level, x, y, z) && y < (yStart + 16) && y < Level::maxBuildHeight) - { - y++; - } - if (y >= (yStart + 16) || y >= Level::maxBuildHeight) - { - y = yStart; - continue; } - else - { - float xx = x + 0.5f; - float yy = (float) y; - float zz = z + 0.5f; - - shared_ptr mob; -// 4J - removed try/catch -// try -// { - //mob = classes[type].getConstructor(Level.class).newInstance(level); - // 4J - there was a classes array here which duplicated the bedEnemies array but have removed it - mob = dynamic_pointer_cast(EntityIO::newByEnumType(bedEnemies[type], level )); -// } -// catch (exception e) -// { -// // TODO 4J Stu - We can't print a stack trace, and newInstance doesn't currently throw an exception anyway -// //e.printStackTrace(); -// return somebodyWokeUp; -// } - - // System.out.println("Placing night mob"); - mob->moveTo(xx, yy, zz, level->random->nextFloat() * 360, 0); - // check if the mob can spawn at this location - if (!mob->canSpawn()) - { - continue; - } - Pos *bedPos = BedTile::findStandUpPosition(level, Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z), 1); - if (bedPos == NULL) - { - // an unlikely case where the bed is - // completely blocked - bedPos = new Pos(x, y + 1, z); - } - - // 4J Stu - TU-1 hotfix - // Fix for #13152 - If the player sleeps in a bed next to a wall in an enclosed, well lit area they will be awoken by a monster - // The pathfinder should attempt to get close to the position that we will move the mob to, - // instead of the player who could be next to a wall. Otherwise the paths gets to the other - // side of the the wall, then moves the mob inside the building - //Path *findPath = finder.findPath(mob.get(), player.get(), 32.0f); - Path *findPath = finder.findPath(mob.get(), bedPos->x, bedPos->y, bedPos->z, 32.0f); - if (findPath != NULL && findPath->getSize() > 1) - { - Node *last = findPath->last(); - - if (abs(last->x - bedPos->x) < 1.5 && abs(last->z - bedPos->z) < 1.5 && abs(last->y - bedPos->y) < 1.5) - { - // System.out.println("Found path!"); - - mob->moveTo(bedPos->x + 0.5f, bedPos->y, bedPos->z + 0.5f, 0, 0); - // the mob would maybe not be able to - // spawn here, but we ignore that now (we assume - // it walked here) - { - level->addEntity(mob); - finalizeMobSettings(mob, level, bedPos->x + 0.5f, (float) bedPos->y, bedPos->z + 0.5f); - mob->finalizeMobSpawn(); - player->stopSleepInBed(true, false, false); - // play a sound effect to scare the player - mob->playAmbientSound(); - somebodyWokeUp = true; - nextPlayer = true; - } - } - delete findPath; - } - delete bedPos; - } - } - } - } - - - return somebodyWokeUp; -} void MobSpawner::postProcessSpawnMobs(Level *level, Biome *biome, int xo, int zo, int cellWidth, int cellHeight, Random *random) { @@ -599,6 +443,7 @@ void MobSpawner::postProcessSpawnMobs(Level *level, Biome *biome, int xo, int zo while (random->nextFloat() < biome->getCreatureProbability()) { Biome::MobSpawnerData *type = (Biome::MobSpawnerData *) WeighedRandom::getRandomItem(level->random, ((vector *)mobs)); + MobGroupData *groupData = NULL; int count = type->minCount + random->nextInt(1 + type->maxCount - type->minCount); int x = xo + random->nextInt(cellWidth); @@ -633,7 +478,7 @@ void MobSpawner::postProcessSpawnMobs(Level *level, Biome *biome, int xo, int zo mob->setDespawnProtected(); level->addEntity(mob); - finalizeMobSettings(mob, level, xx, yy, zz); + groupData = mob->finalizeMobSpawn(groupData); success = true; } diff --git a/Minecraft.World/MobSpawner.h b/Minecraft.World/MobSpawner.h index b5022a77..452ddcc4 100644 --- a/Minecraft.World/MobSpawner.h +++ b/Minecraft.World/MobSpawner.h @@ -26,19 +26,9 @@ private: #endif public: - static const int tick(ServerLevel *level, bool spawnEnemies, bool spawnFriendlies); + static const int tick(ServerLevel *level, bool spawnEnemies, bool spawnFriendlies, bool spawnPersistent); static bool isSpawnPositionOk(MobCategory *category, Level *level, int x, int y, int z); -private: - static void finalizeMobSettings(shared_ptr mob, Level *level, float xx, float yy, float zz); - -protected: - // 4J Stu TODO This was an array of Class type. I haven't made a base Class type yet, but don't need to - // as this can be an array of Mob type? - static const int bedEnemyCount = 3; - static eINSTANCEOF bedEnemies[bedEnemyCount]; - - public: static bool attackSleepingPlayers(Level *level, vector > *players); diff --git a/Minecraft.World/MobSpawnerTile.cpp b/Minecraft.World/MobSpawnerTile.cpp index d926fc24..4665015a 100644 --- a/Minecraft.World/MobSpawnerTile.cpp +++ b/Minecraft.World/MobSpawnerTile.cpp @@ -3,7 +3,7 @@ #include "net.minecraft.world.level.tile.entity.h" #include "MobSpawnerTile.h" -MobSpawnerTile::MobSpawnerTile(int id) : EntityTile(id, Material::stone, isSolidRender() ) +MobSpawnerTile::MobSpawnerTile(int id) : BaseEntityTile(id, Material::stone, isSolidRender() ) { } diff --git a/Minecraft.World/MobSpawnerTile.h b/Minecraft.World/MobSpawnerTile.h index edf3c5e7..39fac148 100644 --- a/Minecraft.World/MobSpawnerTile.h +++ b/Minecraft.World/MobSpawnerTile.h @@ -1,19 +1,19 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" class Random; -class MobSpawnerTile : public EntityTile +class MobSpawnerTile : public BaseEntityTile { friend class Tile; protected: MobSpawnerTile(int id); public: - virtual shared_ptr newTileEntity(Level *level); + virtual shared_ptr newTileEntity(Level *level); virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual int getResourceCount(Random *random); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool blocksLight(); + virtual int getResourceCount(Random *random); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool blocksLight(); virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); virtual int cloneTileId(Level *level, int x, int y, int z); }; \ No newline at end of file diff --git a/Minecraft.World/MobSpawnerTileEntity.cpp b/Minecraft.World/MobSpawnerTileEntity.cpp index ce7ae1dc..013503b6 100644 --- a/Minecraft.World/MobSpawnerTileEntity.cpp +++ b/Minecraft.World/MobSpawnerTileEntity.cpp @@ -1,233 +1,102 @@ #include "stdafx.h" -#include "com.mojang.nbt.h" -#include "TileEntity.h" -#include "LevelEvent.h" -#include "net.minecraft.world.level.h" -#include "net.minecraft.world.entity.item.h" -#include "net.minecraft.world.entity.player.h" -#include "net.minecraft.world.item.h" -#include "net.minecraft.world.entity.h" -#include "net.minecraft.world.phys.h" #include "net.minecraft.network.packet.h" -#include "SharedConstants.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" #include "MobSpawnerTileEntity.h" - - -const int MobSpawnerTileEntity::MAX_DIST = 16; - -MobSpawnerTileEntity::MobSpawnerTileEntity() : TileEntity() +MobSpawnerTileEntity::TileEntityMobSpawner::TileEntityMobSpawner(MobSpawnerTileEntity *parent) { - spin = 0; - oSpin = 0; - - // entityId = "Skeleton"; - entityId = L"Pig"; - m_bEntityIdUpdated = false; - - spawnData = NULL; - - spawnDelay = 20; - - minSpawnDelay = SharedConstants::TICKS_PER_SECOND * 10; - maxSpawnDelay = SharedConstants::TICKS_PER_SECOND * 40; - spawnCount = 4; - displayEntity = nullptr; + m_parent = parent; } -wstring MobSpawnerTileEntity::getEntityId() +void MobSpawnerTileEntity::TileEntityMobSpawner::broadcastEvent(int id) { - return entityId; + m_parent->level->tileEvent(m_parent->x, m_parent->y, m_parent->z, Tile::mobSpawner_Id, id, 0); } -void MobSpawnerTileEntity::setEntityId(const wstring& entityId) +Level *MobSpawnerTileEntity::TileEntityMobSpawner::getLevel() { - this->entityId = entityId; + return m_parent->level; } -bool MobSpawnerTileEntity::isNearPlayer() +int MobSpawnerTileEntity::TileEntityMobSpawner::getX() { - return level->getNearestPlayer(x + 0.5, y + 0.5, z + 0.5, MAX_DIST) != NULL; + return m_parent->x; } -void MobSpawnerTileEntity::tick() +int MobSpawnerTileEntity::TileEntityMobSpawner::getY() { - if (!isNearPlayer()) - { - return; - } - - if (level->isClientSide) - { - double xP = x + level->random->nextFloat(); - double yP = y + level->random->nextFloat(); - double zP = z + level->random->nextFloat(); - level->addParticle(eParticleType_smoke, xP, yP, zP, 0, 0, 0); - level->addParticle(eParticleType_flame, xP, yP, zP, 0, 0, 0); - - oSpin = spin; - spin += 1000 / 220.0f; - while (spin > 360) - { - spin -= 360; - } - while(oSpin > 360) - { - oSpin -= 360; - } - } - else - { - - if (spawnDelay == -1) delay(); - - if (spawnDelay > 0) - { - spawnDelay--; - return; - } - - for (int c = 0; c < spawnCount; c++) - { - shared_ptr entity = dynamic_pointer_cast (EntityIO::newEntity(entityId, level)); - if (entity == NULL) return; - - vector > *vecNearby = level->getEntitiesOfClass(typeid(*entity), AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(8, 4, 8)); - int nearBy = (int)vecNearby->size(); //4J - IB, TODO, Mob contains no getClass - delete vecNearby; - - if (nearBy >= 6) - { - delay(); - return; - } - - // 4J added - our mobspawner tiles should only be spawning monsters. Also respect the global limits we have for those so we don't go - // creating silly numbers of them. Have set this limit slightly higher than the main spawner has so that this tile entity is more likely to - // actually make something (60 rather than 50) - if(level->countInstanceOf( eTYPE_MONSTER, false) >= 60 ) - { - return; - } - - if (entity != NULL) - { - double xp = x + (level->random->nextDouble() - level->random->nextDouble()) * 4; - double yp = y + level->random->nextInt(3) - 1; - double zp = z + (level->random->nextDouble() - level->random->nextDouble()) * 4; - shared_ptr mob = dynamic_pointer_cast( entity ); - - entity->moveTo(xp, yp, zp, level->random->nextFloat() * 360, 0); - - if (mob == NULL || mob->canSpawn()) - { - fillExtraData(entity); - - level->addEntity(entity); - - level->levelEvent(LevelEvent::PARTICLES_MOBTILE_SPAWN, x, y, z, 0); - - if (mob != NULL) mob->spawnAnim(); - delay(); - } - } - } - } - - TileEntity::tick(); + return m_parent->y; } -void MobSpawnerTileEntity::fillExtraData(shared_ptr entity) +int MobSpawnerTileEntity::TileEntityMobSpawner::getZ() { - if (spawnData != NULL) - { - CompoundTag *data = new CompoundTag(); - entity->save(data); + return m_parent->z; +} - vector *allTags = spawnData->getAllTags(); - for(AUTO_VAR(it, allTags->begin()); it != allTags->end(); ++it) - { - Tag *tag = *it; - data->put((wchar_t *)tag->getName().c_str(), tag->copy()); - } - if(allTags != NULL) delete allTags; +void MobSpawnerTileEntity::TileEntityMobSpawner::setNextSpawnData(BaseMobSpawner::SpawnData *nextSpawnData) +{ + BaseMobSpawner::setNextSpawnData(nextSpawnData); + if (getLevel() != NULL) getLevel()->sendTileUpdated(m_parent->x, m_parent->y, m_parent->z); +} - entity->load(data); - } +MobSpawnerTileEntity::MobSpawnerTileEntity() +{ + spawner = new TileEntityMobSpawner(this); } -void MobSpawnerTileEntity::delay() +MobSpawnerTileEntity::~MobSpawnerTileEntity() { - spawnDelay = minSpawnDelay + level->random->nextInt(maxSpawnDelay - minSpawnDelay); + delete spawner; } void MobSpawnerTileEntity::load(CompoundTag *tag) { TileEntity::load(tag); - entityId = tag->getString(L"EntityId"); - m_bEntityIdUpdated = true; - - spawnDelay = tag->getShort(L"Delay"); - - if (tag->contains(L"SpawnData")) - { - spawnData = tag->getCompound(L"SpawnData"); - } - else - { - spawnData = NULL; - } - - if (tag->contains(L"MinSpawnDelay")) - { - minSpawnDelay = tag->getShort(L"MinSpawnDelay"); - maxSpawnDelay = tag->getShort(L"MaxSpawnDelay"); - spawnCount = tag->getShort(L"SpawnCount"); - } + spawner->load(tag); } void MobSpawnerTileEntity::save(CompoundTag *tag) { TileEntity::save(tag); - tag->putString(L"EntityId", entityId ); - tag->putShort(L"Delay", (short) spawnDelay); - tag->putShort(L"MinSpawnDelay", (short) minSpawnDelay); - tag->putShort(L"MaxSpawnDelay", (short) maxSpawnDelay); - tag->putShort(L"SpawnCount", (short) spawnCount); - - if (spawnData != NULL) - { - tag->putCompound(L"SpawnData", spawnData); - } + spawner->save(tag); } -shared_ptr MobSpawnerTileEntity::getDisplayEntity() +void MobSpawnerTileEntity::tick() { - if (displayEntity == NULL || m_bEntityIdUpdated) - { - shared_ptr e = EntityIO::newEntity(getEntityId(), NULL); - fillExtraData(e); - displayEntity = e; - m_bEntityIdUpdated = false; - } - - return displayEntity; + spawner->tick(); + TileEntity::tick(); } shared_ptr MobSpawnerTileEntity::getUpdatePacket() { CompoundTag *tag = new CompoundTag(); save(tag); + tag->remove(L"SpawnPotentials"); return shared_ptr( new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_MOB_SPAWNER, tag) ); } +bool MobSpawnerTileEntity::triggerEvent(int b0, int b1) +{ + if (spawner->onEventTriggered(b0)) return true; + return TileEntity::triggerEvent(b0, b1); +} + +BaseMobSpawner *MobSpawnerTileEntity::getSpawner() +{ + return spawner; +} + // 4J Added shared_ptr MobSpawnerTileEntity::clone() { shared_ptr result = shared_ptr( new MobSpawnerTileEntity() ); TileEntity::clone(result); - result->entityId = entityId; - result->spawnDelay = spawnDelay; return result; +} + +void MobSpawnerTileEntity::setEntityId(const wstring &id) +{ + spawner->setEntityId(id); } \ No newline at end of file diff --git a/Minecraft.World/MobSpawnerTileEntity.h b/Minecraft.World/MobSpawnerTileEntity.h index 9cfb9f2f..b649702b 100644 --- a/Minecraft.World/MobSpawnerTileEntity.h +++ b/Minecraft.World/MobSpawnerTileEntity.h @@ -2,6 +2,7 @@ using namespace std; #include "TileEntity.h" +#include "BaseMobSpawner.h" class Packet; class Entity; @@ -12,48 +13,37 @@ public: eINSTANCEOF GetType() { return eTYPE_MOBSPAWNERTILEENTITY; } static TileEntity *create() { return new MobSpawnerTileEntity(); } -using TileEntity::setChanged; - private: - static const int MAX_DIST; + class TileEntityMobSpawner : public BaseMobSpawner + { + private: + MobSpawnerTileEntity *m_parent; -public: - int spawnDelay; + public: + TileEntityMobSpawner(MobSpawnerTileEntity *parent); -private: - wstring entityId; - CompoundTag *spawnData; + void broadcastEvent(int id); + Level *getLevel(); + int getX(); + int getY(); + int getZ(); + void setNextSpawnData(BaseMobSpawner::SpawnData *nextSpawnData); + }; - bool m_bEntityIdUpdated; // 4J Added + BaseMobSpawner *spawner; -public: - double spin, oSpin; - -private: - int minSpawnDelay; - int maxSpawnDelay; - int spawnCount; - shared_ptr displayEntity; - public: MobSpawnerTileEntity(); + ~MobSpawnerTileEntity(); - wstring getEntityId(); - void setEntityId(const wstring& entityId); - bool isNearPlayer(); - virtual void tick(); - void fillExtraData(shared_ptr entity); - -private: - void delay(); - -public: virtual void load(CompoundTag *tag); virtual void save(CompoundTag *tag); - - shared_ptr getDisplayEntity(); + virtual void tick(); virtual shared_ptr getUpdatePacket(); + virtual bool triggerEvent(int b0, int b1); + virtual BaseMobSpawner *getSpawner(); // 4J Added virtual shared_ptr clone(); + void setEntityId(const wstring &id); }; diff --git a/Minecraft.World/ModifiableAttributeInstance.cpp b/Minecraft.World/ModifiableAttributeInstance.cpp new file mode 100644 index 00000000..50aa6504 --- /dev/null +++ b/Minecraft.World/ModifiableAttributeInstance.cpp @@ -0,0 +1,185 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "ModifiableAttributeInstance.h" + +ModifiableAttributeInstance::ModifiableAttributeInstance(BaseAttributeMap *attributeMap, Attribute *attribute) +{ + this->attributeMap = attributeMap; + this->attribute = attribute; + + dirty = true; + cachedValue = 0.0; + + baseValue = attribute->getDefaultValue(); +} + +ModifiableAttributeInstance::~ModifiableAttributeInstance() +{ + for (int i = 0; i < AttributeModifier::TOTAL_OPERATIONS; i++) + { + for (AUTO_VAR(it, modifiers[i].begin()); it != modifiers[i].end(); ++it) + { + // Delete all modifiers + delete *it; + } + } +} + +Attribute *ModifiableAttributeInstance::getAttribute() +{ + return attribute; +} + +double ModifiableAttributeInstance::getBaseValue() +{ + return baseValue; +} + +void ModifiableAttributeInstance::setBaseValue(double baseValue) +{ + if (baseValue == this->getBaseValue()) return; + this->baseValue = baseValue; + setDirty(); +} + +// Returns a pointer to an internally managed vector of modifers by operation +unordered_set *ModifiableAttributeInstance::getModifiers(int operation) +{ + return &modifiers[operation]; +} + +// Returns a pointer to a new vector of all modifiers +void ModifiableAttributeInstance::getModifiers(unordered_set& result) +{ + for (int i = 0; i < AttributeModifier::TOTAL_OPERATIONS; i++) + { + unordered_set *opModifiers = &modifiers[i]; + + for (AUTO_VAR(it, opModifiers->begin()); it != opModifiers->end(); ++it) + { + result.insert(*it); + } + } +} + +AttributeModifier *ModifiableAttributeInstance::getModifier(eMODIFIER_ID id) +{ + AttributeModifier *modifier = NULL; + + AUTO_VAR(it, modifierById.find(id)); + if(it != modifierById.end()) + { + modifier = it->second; + } + + return modifier; +} + +void ModifiableAttributeInstance::addModifiers(unordered_set *modifiers) +{ + for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + addModifier(*it); + } +} + +// Add new modifier to attribute instance (takes ownership of modifier) +void ModifiableAttributeInstance::addModifier(AttributeModifier *modifier) +{ + // Can't add modifiers with the same ID (unless the modifier is anonymous) + if (modifier->getId() != eModifierId_ANONYMOUS && getModifier(modifier->getId()) != NULL) + { + assert(0); + // throw new IllegalArgumentException("Modifier is already applied on this attribute!"); + return; + } + + modifiers[modifier->getOperation()].insert(modifier); + modifierById[modifier->getId()] = modifier; + + setDirty(); +} + +void ModifiableAttributeInstance::setDirty() +{ + dirty = true; + attributeMap->onAttributeModified(this); +} + +void ModifiableAttributeInstance::removeModifier(AttributeModifier *modifier) +{ + for (int i = 0; i < AttributeModifier::TOTAL_OPERATIONS; i++) + { + for (AUTO_VAR(it, modifiers[i].begin()); it != modifiers[i].end(); ++it) + { + if (modifier->equals(*it)) + { + modifiers[i].erase(it); + break; + } + } + } + + modifierById.erase(modifier->getId()); + + setDirty(); +} + +void ModifiableAttributeInstance::removeModifier(eMODIFIER_ID id) +{ + AttributeModifier *modifier = getModifier(id); + if (modifier != NULL) removeModifier(modifier); +} + +void ModifiableAttributeInstance::removeModifiers() +{ + unordered_set removingModifiers; + getModifiers(removingModifiers); + + for (AUTO_VAR(it, removingModifiers.begin()); it != removingModifiers.end(); ++it) + { + removeModifier(*it); + } +} + +double ModifiableAttributeInstance::getValue() +{ + if (dirty) + { + cachedValue = calculateValue(); + dirty = false; + } + + return cachedValue; +} + +double ModifiableAttributeInstance::calculateValue() +{ + double base = getBaseValue(); + unordered_set *modifiers; + + modifiers = getModifiers(AttributeModifier::OPERATION_ADDITION); + for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + AttributeModifier *modifier = *it; + base += modifier->getAmount(); + } + + double result = base; + + modifiers = getModifiers(AttributeModifier::OPERATION_MULTIPLY_BASE); + for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + AttributeModifier *modifier = *it; + result += base * modifier->getAmount(); + } + + modifiers = getModifiers(AttributeModifier::OPERATION_MULTIPLY_TOTAL); + for (AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + AttributeModifier *modifier = *it; + result *= 1 + modifier->getAmount(); + } + + return attribute->sanitizeValue(result); +} \ No newline at end of file diff --git a/Minecraft.World/ModifiableAttributeInstance.h b/Minecraft.World/ModifiableAttributeInstance.h new file mode 100644 index 00000000..6d118862 --- /dev/null +++ b/Minecraft.World/ModifiableAttributeInstance.h @@ -0,0 +1,40 @@ +#pragma once + +#include "AttributeInstance.h" + +class ModifiableAttributeInstance : public AttributeInstance +{ +private: + BaseAttributeMap *attributeMap; + Attribute *attribute; + unordered_set modifiers [AttributeModifier::TOTAL_OPERATIONS]; + unordered_map modifierById; + double baseValue; + bool dirty; + double cachedValue; + +public: + ModifiableAttributeInstance(BaseAttributeMap *attributeMap, Attribute *attribute); + ~ModifiableAttributeInstance(); + + Attribute *getAttribute(); + double getBaseValue(); + void setBaseValue(double baseValue); + unordered_set *getModifiers(int operation); + void getModifiers(unordered_set& result); + AttributeModifier *getModifier(eMODIFIER_ID id); + void addModifiers(unordered_set *modifiers); + void addModifier(AttributeModifier *modifier); + +private: + void setDirty(); + +public: + void removeModifier(AttributeModifier *modifier); + void removeModifier(eMODIFIER_ID id); + void removeModifiers(); + double getValue(); + +private: + double calculateValue(); +}; \ No newline at end of file diff --git a/Minecraft.World/Monster.cpp b/Minecraft.World/Monster.cpp index 627ce8d1..174a706c 100644 --- a/Minecraft.World/Monster.cpp +++ b/Minecraft.World/Monster.cpp @@ -2,7 +2,9 @@ #include "net.minecraft.world.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.world.effect.h" #include "net.minecraft.world.item.enchantment.h" @@ -11,40 +13,27 @@ #include "..\Minecraft.Client\Minecraft.h" - -void Monster::_init() -{ - attackDamage = 2; -} - Monster::Monster(Level *level) : PathfinderMob( level ) { - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that - // the derived version of the function is called - - // 4J Stu - Only the most derived classes should call this - //this->defineSynchedData(); - - _init(); - xpReward = Enemy::XP_REWARD_MEDIUM; } void Monster::aiStep() { - float br = getBrightness(1); - if (br > 0.5f) + updateSwingTime(); + float br = getBrightness(1); + if (br > 0.5f) { - noActionTime += 2; - } + noActionTime += 2; + } - PathfinderMob::aiStep(); + PathfinderMob::aiStep(); } void Monster::tick() { - PathfinderMob::tick(); - if (!level->isClientSide && (level->difficulty == Difficulty::PEACEFUL || Minecraft::GetInstance()->isTutorial() ) ) remove(); + PathfinderMob::tick(); + if (!level->isClientSide && (level->difficulty == Difficulty::PEACEFUL || Minecraft::GetInstance()->isTutorial() ) ) remove(); } shared_ptr Monster::findAttackTarget() @@ -56,25 +45,26 @@ shared_ptr Monster::findAttackTarget() } #endif - shared_ptr player = level->getNearestAttackablePlayer(shared_from_this(), 16); + shared_ptr player = level->getNearestAttackablePlayer(shared_from_this(), 16); if (player != NULL && canSee(player) ) return player; - return shared_ptr(); + return shared_ptr(); } -bool Monster::hurt(DamageSource *source, int dmg) +bool Monster::hurt(DamageSource *source, float dmg) { - if (PathfinderMob::hurt(source, dmg)) + if (isInvulnerable()) return false; + if (PathfinderMob::hurt(source, dmg)) { shared_ptr sourceEntity = source->getEntity(); - if (rider.lock() == sourceEntity || riding == sourceEntity) return true; + if (rider.lock() == sourceEntity || riding == sourceEntity) return true; - if (sourceEntity != shared_from_this()) + if (sourceEntity != shared_from_this()) { - this->attackTarget = sourceEntity; - } - return true; - } - return false; + attackTarget = sourceEntity; + } + return true; + } + return false; } /** @@ -85,75 +75,86 @@ bool Monster::hurt(DamageSource *source, int dmg) */ bool Monster::doHurtTarget(shared_ptr target) { - int dmg = attackDamage; - if (hasEffect(MobEffect::damageBoost)) - { - dmg += (3 << getEffect(MobEffect::damageBoost)->getAmplifier()); - } - if (hasEffect(MobEffect::weakness)) + float dmg = (float) getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->getValue(); + int knockback = 0; + + + if ( target->instanceof(eTYPE_LIVINGENTITY) ) { - dmg -= (2 << getEffect(MobEffect::weakness)->getAmplifier()); + shared_ptr livingTarget = dynamic_pointer_cast(target); + dmg += EnchantmentHelper::getDamageBonus(dynamic_pointer_cast(shared_from_this()), livingTarget); + knockback += EnchantmentHelper::getKnockbackBonus(dynamic_pointer_cast(shared_from_this()), livingTarget); } - DamageSource *damageSource = DamageSource::mobAttack(dynamic_pointer_cast( shared_from_this() ) ); - bool didHurt = target->hurt(damageSource, dmg); - delete damageSource; + boolean wasHurt = target->hurt(DamageSource::mobAttack(dynamic_pointer_cast(shared_from_this())), dmg); - if (didHurt) + if (wasHurt) { - int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast(shared_from_this())); + if (knockback > 0) + { + target->push(-Mth::sin(yRot * PI / 180) * knockback * .5f, 0.1, Mth::cos(yRot * PI / 180) * knockback * .5f); + xd *= 0.6; + zd *= 0.6; + } + + int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast(shared_from_this())); if (fireAspect > 0) { target->setOnFire(fireAspect * 4); } - shared_ptr mob = dynamic_pointer_cast(target); - if (mob != NULL) + if (target->instanceof(eTYPE_LIVINGENTITY)) { - ThornsEnchantment::doThornsAfterAttack(shared_from_this(), mob, random); + shared_ptr livingTarget = dynamic_pointer_cast(target); + ThornsEnchantment::doThornsAfterAttack(shared_from_this(), livingTarget, random); } } - return didHurt; + return wasHurt; } void Monster::checkHurtTarget(shared_ptr target, float distance) { - if (attackTime <= 0 && distance < 2.0f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) + if (attackTime <= 0 && distance < 2.0f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) { - attackTime = 20; - doHurtTarget(target); - } + attackTime = 20; + doHurtTarget(target); + } } float Monster::getWalkTargetValue(int x, int y, int z) { - return 0.5f - level->getBrightness(x, y, z); + return 0.5f - level->getBrightness(x, y, z); } bool Monster::isDarkEnoughToSpawn() { - int xt = Mth::floor(x); - int yt = Mth::floor(bb->y0); - int zt = Mth::floor(z); - if (level->getBrightness(LightLayer::Sky, xt, yt, zt) > random->nextInt(32)) return false; + int xt = Mth::floor(x); + int yt = Mth::floor(bb->y0); + int zt = Mth::floor(z); + if (level->getBrightness(LightLayer::Sky, xt, yt, zt) > random->nextInt(32)) return false; - int br = level->getRawBrightness(xt, yt, zt); + int br = level->getRawBrightness(xt, yt, zt); - if (level->isThundering()) + if (level->isThundering()) { - int tmp = level->skyDarken; - level->skyDarken = 10; - br = level->getRawBrightness(xt, yt, zt); - level->skyDarken = tmp; - } + int tmp = level->skyDarken; + level->skyDarken = 10; + br = level->getRawBrightness(xt, yt, zt); + level->skyDarken = tmp; + } - return br <= random->nextInt(8); + return br <= random->nextInt(8); } bool Monster::canSpawn() { - // 4J Stu - // Fix for #8265 - AI: Monsters will flash briefly on the screen around Monster Spawners when the game settings are set to Peaceful. - return isDarkEnoughToSpawn() && PathfinderMob::canSpawn() && level->difficulty > Difficulty::PEACEFUL; + return level->difficulty > Difficulty::PEACEFUL && isDarkEnoughToSpawn() && PathfinderMob::canSpawn(); +} + +void Monster::registerAttributes() +{ + PathfinderMob::registerAttributes(); + + getAttributes()->registerAttribute(SharedMonsterAttributes::ATTACK_DAMAGE); } \ No newline at end of file diff --git a/Minecraft.World/Monster.h b/Minecraft.World/Monster.h index 2bad48da..33f72b0e 100644 --- a/Minecraft.World/Monster.h +++ b/Minecraft.World/Monster.h @@ -14,35 +14,31 @@ public: eINSTANCEOF GetType() { return eTYPE_MONSTER; } static Entity *create(Level *level) { return NULL; } -protected: - int attackDamage; - -private: - void _init(); - public: Monster(Level *level); - virtual void aiStep(); - virtual void tick(); + virtual void aiStep(); + virtual void tick(); protected: virtual shared_ptr findAttackTarget(); public: - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); virtual bool doHurtTarget(shared_ptr target); protected: virtual void checkHurtTarget(shared_ptr target, float distance); public: - virtual float getWalkTargetValue(int x, int y, int z); + virtual float getWalkTargetValue(int x, int y, int z); protected: - virtual bool isDarkEnoughToSpawn(); + virtual bool isDarkEnoughToSpawn(); public: virtual bool canSpawn(); -}; +protected: + void registerAttributes(); +}; \ No newline at end of file diff --git a/Minecraft.World/MonsterRoomFeature.cpp b/Minecraft.World/MonsterRoomFeature.cpp index cd44376a..17ac55ae 100644 --- a/Minecraft.World/MonsterRoomFeature.cpp +++ b/Minecraft.World/MonsterRoomFeature.cpp @@ -4,8 +4,28 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.item.h" +#include "WeighedTreasure.h" #include "MonsterRoomFeature.h" +WeighedTreasure *MonsterRoomFeature::monsterRoomTreasure[MonsterRoomFeature::TREASURE_ITEMS_COUNT] = +{ + new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 10), + new WeighedTreasure(Item::ironIngot_Id, 0, 1, 4, 10), + new WeighedTreasure(Item::bread_Id, 0, 1, 1, 10), + new WeighedTreasure(Item::wheat_Id, 0, 1, 4, 10), + new WeighedTreasure(Item::gunpowder_Id, 0, 1, 4, 10), + new WeighedTreasure(Item::string_Id, 0, 1, 4, 10), + new WeighedTreasure(Item::bucket_empty_Id, 0, 1, 1, 10), + new WeighedTreasure(Item::apple_gold_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::redStone_Id, 0, 1, 4, 10), + new WeighedTreasure(Item::record_01_Id, 0, 1, 1, 10), + new WeighedTreasure(Item::record_02_Id, 0, 1, 1, 10), + new WeighedTreasure(Item::nameTag_Id, 0, 1, 1, 10), + new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 2), + new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 1), +}; + bool MonsterRoomFeature::place(Level *level, Random *random, int x, int y, int z) { int hr = 3; @@ -48,19 +68,22 @@ bool MonsterRoomFeature::place(Level *level, Random *random, int x, int y, int z { if (yy >= 0 && !level->getMaterial(xx, yy - 1, zz)->isSolid()) { - level->setTile(xx, yy, zz, 0); - } else if (level->getMaterial(xx, yy, zz)->isSolid()) + level->removeTile(xx, yy, zz); + } + else if (level->getMaterial(xx, yy, zz)->isSolid()) { if (yy == y - 1 && random->nextInt(4) != 0) { - level->setTile(xx, yy, zz, Tile::mossStone_Id); - } else { - level->setTile(xx, yy, zz, Tile::stoneBrick_Id); + level->setTileAndData(xx, yy, zz, Tile::mossyCobblestone_Id, 0, Tile::UPDATE_CLIENTS); + } + else + { + level->setTileAndData(xx, yy, zz, Tile::cobblestone_Id, 0, Tile::UPDATE_CLIENTS); } } } else { - level->setTile(xx, yy, zz, 0); + level->removeTile(xx, yy, zz); } } } @@ -83,15 +106,13 @@ bool MonsterRoomFeature::place(Level *level, Random *random, int x, int y, int z if (count != 1) continue; - level->setTile(xc, yc, zc, Tile::chest_Id); + level->setTileAndData(xc, yc, zc, Tile::chest_Id, 0, Tile::UPDATE_CLIENTS); + WeighedTreasureArray wrapperArray(monsterRoomTreasure, TREASURE_ITEMS_COUNT); + WeighedTreasureArray treasure = WeighedTreasure::addToTreasure(wrapperArray, Item::enchantedBook->createForRandomTreasure(random)); shared_ptr chest = dynamic_pointer_cast( level->getTileEntity(xc, yc, zc) ); if (chest != NULL ) { - for (int j = 0; j < 8; j++) - { - shared_ptr item = randomItem(random); - if (item != NULL) chest->setItem(random->nextInt(chest->getContainerSize()), item); - } + WeighedTreasure::addChestItems(random, treasure, chest, 8); } break; @@ -99,36 +120,17 @@ bool MonsterRoomFeature::place(Level *level, Random *random, int x, int y, int z } - level->setTile(x, y, z, Tile::mobSpawner_Id); + level->setTileAndData(x, y, z, Tile::mobSpawner_Id, 0, Tile::UPDATE_CLIENTS); shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); if( entity != NULL ) { - entity->setEntityId(randomEntityId(random)); + entity->getSpawner()->setEntityId(randomEntityId(random)); } return true; } -shared_ptr MonsterRoomFeature::randomItem(Random *random) -{ - int type = random->nextInt(12); - if (type == 0) return shared_ptr( new ItemInstance(Item::saddle) ); - if (type == 1) return shared_ptr( new ItemInstance(Item::ironIngot, random->nextInt(4) + 1) ); - if (type == 2) return shared_ptr( new ItemInstance(Item::bread) ); - if (type == 3) return shared_ptr( new ItemInstance(Item::wheat, random->nextInt(4) + 1) ); - if (type == 4) return shared_ptr( new ItemInstance(Item::sulphur, random->nextInt(4) + 1) ); - if (type == 5) return shared_ptr( new ItemInstance(Item::string, random->nextInt(4) + 1) ); - if (type == 6) return shared_ptr( new ItemInstance(Item::bucket_empty) ); - if (type == 7 && random->nextInt(100) == 0) return shared_ptr( new ItemInstance(Item::apple_gold) ); - if (type == 8 && random->nextInt(2) == 0) return shared_ptr( new ItemInstance(Item::redStone, random->nextInt(4) + 1) ); - if (type == 9 && random->nextInt(10) == 0) return shared_ptr( new ItemInstance( Item::items[Item::record_01->id + random->nextInt(2)]) ); - if (type == 10) return shared_ptr( new ItemInstance(Item::dye_powder, 1, DyePowderItem::BROWN) ); - if (type == 11) return Item::enchantedBook->createForRandomLoot(random); - - return shared_ptr(); -} - wstring MonsterRoomFeature::randomEntityId(Random *random) { int id = random->nextInt(4); diff --git a/Minecraft.World/MonsterRoomFeature.h b/Minecraft.World/MonsterRoomFeature.h index 88304ad6..2b911e10 100644 --- a/Minecraft.World/MonsterRoomFeature.h +++ b/Minecraft.World/MonsterRoomFeature.h @@ -2,15 +2,18 @@ #include "Feature.h" #include "Material.h" +class WeighedTreasure; + class MonsterRoomFeature : public Feature { private: - //int tile; + + static const int TREASURE_ITEMS_COUNT = 15; + static WeighedTreasure *monsterRoomTreasure[TREASURE_ITEMS_COUNT]; public: virtual bool place(Level *level, Random *random, int x, int y, int z); private: - shared_ptr randomItem(Random *random); - wstring randomEntityId(Random *random); + wstring randomEntityId(Random *random); }; diff --git a/Minecraft.World/MoveControl.cpp b/Minecraft.World/MoveControl.cpp index 30e94e68..02b5a9e0 100644 --- a/Minecraft.World/MoveControl.cpp +++ b/Minecraft.World/MoveControl.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" -#include "net.minecraft.world.entity.ai.control.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.phys.h" #include "MoveControl.h" @@ -14,7 +16,7 @@ MoveControl::MoveControl(Mob *mob) wantedY = mob->y; wantedZ = mob->z; - speed = 0.0f; + speedModifier = 0.0; _hasWanted = false; } @@ -24,17 +26,17 @@ bool MoveControl::hasWanted() return _hasWanted; } -float MoveControl::getSpeed() +double MoveControl::getSpeedModifier() { - return speed; + return speedModifier; } -void MoveControl::setWantedPosition(double x, double y, double z, float speed) +void MoveControl::setWantedPosition(double x, double y, double z, double speedModifier) { wantedX = x; wantedY = y; wantedZ = z; - this->speed = speed; + this->speedModifier = speedModifier; _hasWanted = true; } @@ -55,7 +57,7 @@ void MoveControl::tick() float yRotD = (float) (atan2(zd, xd) * 180 / PI) - 90; mob->yRot = rotlerp(mob->yRot, yRotD, MAX_TURN); - mob->setSpeed(speed * mob->getWalkingSpeedModifier()); + mob->setSpeed((float) (speedModifier * mob->getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->getValue())); if (yd > 0 && xd * xd + zd * zd < 1) mob->getJumpControl()->jump(); } diff --git a/Minecraft.World/MoveControl.h b/Minecraft.World/MoveControl.h index 4138280e..fdc5d65d 100644 --- a/Minecraft.World/MoveControl.h +++ b/Minecraft.World/MoveControl.h @@ -17,15 +17,15 @@ private: double wantedX; double wantedY; double wantedZ; - float speed; + double speedModifier; bool _hasWanted; public: MoveControl(Mob *mob); bool hasWanted(); - float getSpeed(); - void setWantedPosition(double x, double y, double z, float speed); + double getSpeedModifier(); + void setWantedPosition(double x, double y, double z, double speedModifier); void setSpeed(float speed); virtual void tick(); diff --git a/Minecraft.World/MoveIndoorsGoal.cpp b/Minecraft.World/MoveIndoorsGoal.cpp index 215f9a29..395fe578 100644 --- a/Minecraft.World/MoveIndoorsGoal.cpp +++ b/Minecraft.World/MoveIndoorsGoal.cpp @@ -45,9 +45,9 @@ void MoveIndoorsGoal::start() if (mob->distanceToSqr(_doorInfo->getIndoorX(), _doorInfo->y, _doorInfo->getIndoorZ()) > 16 * 16) { Vec3 *pos = RandomPos::getPosTowards(dynamic_pointer_cast(mob->shared_from_this()), 14, 3, Vec3::newTemp(_doorInfo->getIndoorX() + 0.5, _doorInfo->getIndoorY(), _doorInfo->getIndoorZ() + 0.5)); - if (pos != NULL) mob->getNavigation()->moveTo(pos->x, pos->y, pos->z, 0.3f); + if (pos != NULL) mob->getNavigation()->moveTo(pos->x, pos->y, pos->z, 1.0f); } - else mob->getNavigation()->moveTo(_doorInfo->getIndoorX() + 0.5, _doorInfo->getIndoorY(), _doorInfo->getIndoorZ() + 0.5, 0.3f); + else mob->getNavigation()->moveTo(_doorInfo->getIndoorX() + 0.5, _doorInfo->getIndoorY(), _doorInfo->getIndoorZ() + 0.5, 1.0f); } void MoveIndoorsGoal::stop() diff --git a/Minecraft.World/MoveThroughVillageGoal.cpp b/Minecraft.World/MoveThroughVillageGoal.cpp index 2405374f..d4cdde94 100644 --- a/Minecraft.World/MoveThroughVillageGoal.cpp +++ b/Minecraft.World/MoveThroughVillageGoal.cpp @@ -9,13 +9,13 @@ #include "MoveThroughVillageGoal.h" #include "Path.h" -MoveThroughVillageGoal::MoveThroughVillageGoal(PathfinderMob *mob, float speed, bool onlyAtNight) +MoveThroughVillageGoal::MoveThroughVillageGoal(PathfinderMob *mob, double speedModifier, bool onlyAtNight) { path = NULL; doorInfo = weak_ptr(); this->mob = mob; - this->speed = speed; + this->speedModifier = speedModifier; this->onlyAtNight = onlyAtNight; setRequiredControlFlags(Control::MoveControlFlag); } @@ -67,7 +67,7 @@ bool MoveThroughVillageGoal::canContinueToUse() void MoveThroughVillageGoal::start() { - mob->getNavigation()->moveTo(path, speed); + mob->getNavigation()->moveTo(path, speedModifier); path = NULL; } diff --git a/Minecraft.World/MoveThroughVillageGoal.h b/Minecraft.World/MoveThroughVillageGoal.h index a087e522..73b9bd9a 100644 --- a/Minecraft.World/MoveThroughVillageGoal.h +++ b/Minecraft.World/MoveThroughVillageGoal.h @@ -10,14 +10,14 @@ class MoveThroughVillageGoal : public Goal { private: PathfinderMob *mob; - float speed; + double speedModifier; Path *path; weak_ptr doorInfo; bool onlyAtNight; vector< weak_ptr > visited; public: - MoveThroughVillageGoal(PathfinderMob *mob, float speed, bool onlyAtNight); + MoveThroughVillageGoal(PathfinderMob *mob, double speedModifier, bool onlyAtNight); ~MoveThroughVillageGoal(); virtual bool canUse(); diff --git a/Minecraft.World/MoveTowardsRestrictionGoal.cpp b/Minecraft.World/MoveTowardsRestrictionGoal.cpp index a1848d46..2c3900b6 100644 --- a/Minecraft.World/MoveTowardsRestrictionGoal.cpp +++ b/Minecraft.World/MoveTowardsRestrictionGoal.cpp @@ -6,12 +6,12 @@ #include "net.minecraft.world.level.h" #include "MoveTowardsRestrictionGoal.h" -MoveTowardsRestrictionGoal::MoveTowardsRestrictionGoal(PathfinderMob *mob, float speed) +MoveTowardsRestrictionGoal::MoveTowardsRestrictionGoal(PathfinderMob *mob, double speedModifier) { wantedX = wantedY = wantedZ = 0.0; this->mob = mob; - this->speed = speed; + this->speedModifier = speedModifier; setRequiredControlFlags(Control::MoveControlFlag); } @@ -34,5 +34,5 @@ bool MoveTowardsRestrictionGoal::canContinueToUse() void MoveTowardsRestrictionGoal::start() { - mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speed); + mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speedModifier); } \ No newline at end of file diff --git a/Minecraft.World/MoveTowardsRestrictionGoal.h b/Minecraft.World/MoveTowardsRestrictionGoal.h index 859b5ee8..f2864a9b 100644 --- a/Minecraft.World/MoveTowardsRestrictionGoal.h +++ b/Minecraft.World/MoveTowardsRestrictionGoal.h @@ -7,10 +7,10 @@ class MoveTowardsRestrictionGoal : public Goal private: PathfinderMob *mob; double wantedX, wantedY, wantedZ; - float speed; + double speedModifier; public: - MoveTowardsRestrictionGoal(PathfinderMob *mob, float speed); + MoveTowardsRestrictionGoal(PathfinderMob *mob, double speedModifier); bool canUse(); bool canContinueToUse(); diff --git a/Minecraft.World/MoveTowardsTargetGoal.cpp b/Minecraft.World/MoveTowardsTargetGoal.cpp index 6d9810b5..c0537d1f 100644 --- a/Minecraft.World/MoveTowardsTargetGoal.cpp +++ b/Minecraft.World/MoveTowardsTargetGoal.cpp @@ -6,17 +6,17 @@ #include "net.minecraft.world.phys.h" #include "MoveTowardsTargetGoal.h" -MoveTowardsTargetGoal::MoveTowardsTargetGoal(PathfinderMob *mob, float speed, float within) +MoveTowardsTargetGoal::MoveTowardsTargetGoal(PathfinderMob *mob, double speedModifier, float within) { this->mob = mob; - this->speed = speed; + this->speedModifier = speedModifier; this->within = within; setRequiredControlFlags(Control::MoveControlFlag); } bool MoveTowardsTargetGoal::canUse() { - target = weak_ptr(mob->getTarget()); + target = weak_ptr(mob->getTarget()); if (target.lock() == NULL) return false; if (target.lock()->distanceToSqr(mob->shared_from_this()) > within * within) return false; Vec3 *pos = RandomPos::getPosTowards(dynamic_pointer_cast(mob->shared_from_this()), 16, 7, Vec3::newTemp(target.lock()->x, target.lock()->y, target.lock()->z)); @@ -39,5 +39,5 @@ void MoveTowardsTargetGoal::stop() void MoveTowardsTargetGoal::start() { - mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speed); + mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speedModifier); } \ No newline at end of file diff --git a/Minecraft.World/MoveTowardsTargetGoal.h b/Minecraft.World/MoveTowardsTargetGoal.h index 5186b752..bf451301 100644 --- a/Minecraft.World/MoveTowardsTargetGoal.h +++ b/Minecraft.World/MoveTowardsTargetGoal.h @@ -6,12 +6,13 @@ class MoveTowardsTargetGoal : public Goal { private: PathfinderMob *mob; - weak_ptr target; + weak_ptr target; double wantedX, wantedY, wantedZ; - float speed, within; + double speedModifier; + float within; public: - MoveTowardsTargetGoal(PathfinderMob *mob, float speed, float within); + MoveTowardsTargetGoal(PathfinderMob *mob, double speedModifier, float within); bool canUse(); bool canContinueToUse(); diff --git a/Minecraft.World/Mth.cpp b/Minecraft.World/Mth.cpp index eccd828e..ab990e6c 100644 --- a/Minecraft.World/Mth.cpp +++ b/Minecraft.World/Mth.cpp @@ -1,12 +1,13 @@ #include "stdafx.h" #include "Mth.h" #include "Random.h" +#include "StringHelpers.h" const int Mth::BIG_ENOUGH_INT = 1024; const float Mth::BIG_ENOUGH_FLOAT = BIG_ENOUGH_INT; -const float Mth::RAD_TO_GRAD = PI / 180.0f; const float Mth::DEGRAD = PI / 180.0f; const float Mth::RADDEG = 180.0f / PI; +const float Mth::RAD_TO_GRAD = PI / 180.0f; float *Mth::_sin = NULL; @@ -15,11 +16,11 @@ const float Mth::sinScale = 65536.0f / (float) (PI * 2); // 4J - added - was in static constructor void Mth::init() { - _sin = new float[65536]; - for (int i = 0; i < 65536; i++) + _sin = new float[65536]; + for (int i = 0; i < 65536; i++) { - _sin[i] = (float) ::sin(i * PI * 2 / 65536.0f); - } + _sin[i] = (float) ::sin(i * PI * 2 / 65536.0f); + } } float Mth::sin(float i) @@ -46,14 +47,14 @@ float Mth::sqrt(double x) int Mth::floor(float v) { - int i = (int) v; - return v < i ? i - 1 : i; + int i = (int) v; + return v < i ? i - 1 : i; } __int64 Mth::lfloor(double v) { - __int64 i = (__int64) v; - return v < i ? i - 1 : i; + __int64 i = (__int64) v; + return v < i ? i - 1 : i; } int Mth::fastFloor(double x) @@ -63,8 +64,8 @@ int Mth::fastFloor(double x) int Mth::floor(double v) { - int i = (int) v; - return v < i ? i - 1 : i; + int i = (int) v; + return v < i ? i - 1 : i; } int Mth::absFloor(double v) @@ -84,21 +85,21 @@ int Mth::abs(int v) int Mth::ceil(float v) { - int i = (int) v; - return v > i ? i + 1 : i; + int i = (int) v; + return v > i ? i + 1 : i; } int Mth::clamp(int value, int min, int max) { - if (value < min) + if (value < min) { - return min; - } - if (value > max) + return min; + } + if (value > max) { - return max; - } - return value; + return max; + } + return value; } float Mth::clamp(float value, float min, float max) @@ -116,25 +117,37 @@ float Mth::clamp(float value, float min, float max) double Mth::asbMax(double a, double b) { - if (a < 0) a = -a; - if (b < 0) b = -b; - return a > b ? a : b; + if (a < 0) a = -a; + if (b < 0) b = -b; + return a > b ? a : b; } int Mth::intFloorDiv(int a, int b) { - if (a < 0) return -((-a - 1) / b) - 1; - return a / b; + if (a < 0) return -((-a - 1) / b) - 1; + return a / b; } int Mth::nextInt(Random *random, int minInclusive, int maxInclusive) { - if (minInclusive >= maxInclusive) + if (minInclusive >= maxInclusive) { - return minInclusive; - } - return random->nextInt(maxInclusive - minInclusive + 1) + minInclusive; + return minInclusive; + } + return random->nextInt(maxInclusive - minInclusive + 1) + minInclusive; +} + +float Mth::nextFloat(Random *random, float min, float max) +{ + if (min >= max) return min; + return (random->nextFloat() * (max - min)) + min; +} + +double Mth::nextDouble(Random *random, double min, double max) +{ + if (min >= max) return min; + return (random->nextDouble() * (max - min)) + min; } float Mth::wrapDegrees(float input) @@ -165,6 +178,66 @@ double Mth::wrapDegrees(double input) return input; } +int Mth::getInt(const wstring &input, int def) +{ + int result = def; + + result = _fromString(input); + + return result; +} + +int Mth::getInt(const wstring &input, int def, int min) +{ + int result = def; + + result = _fromString(input); + + if (result < min) result = min; + return result; +} + +double Mth::getDouble(const wstring &input, double def) +{ + double result = def; + + result = _fromString(input); + + return result; +} + +double Mth::getDouble(const wstring &input, double def, double min) +{ + double result = def; + + result = _fromString(input); + + if (result < min) result = min; + return result; +} + +// 4J Changed this to remove the use of the actuall UUID type +wstring Mth::createInsecureUUID(Random *random) +{ + wchar_t output[33]; + output[32] = 0; + __int64 high = (random->nextLong() & ~UUID_VERSION) | UUID_VERSION_TYPE_4; + __int64 low = (random->nextLong() & ~UUID_VARIANT) | UUID_VARIANT_2; + for(int i = 0; i < 16; i++ ) + { + wchar_t nybbleHigh = high & 0xf; + wchar_t nybbleLow = low & 0xf; + nybbleHigh = (nybbleHigh > 9 ) ? ( nybbleHigh + (L'a'-10) ) : ( nybbleHigh + L'0' ); + nybbleLow = (nybbleLow > 9 ) ? ( nybbleLow + (L'a'-10) ) : ( nybbleLow + L'0' ); + high >>= 4; + low >>= 4; + output[31 - i] = nybbleLow; + output[15 - i] = nybbleHigh; + } + return wstring(output); +} + + // 4J Added bool Mth::almostEquals( double double1, double double2, double precision) { diff --git a/Minecraft.World/Mth.h b/Minecraft.World/Mth.h index 17119fb1..4ce90893 100644 --- a/Minecraft.World/Mth.h +++ b/Minecraft.World/Mth.h @@ -4,13 +4,16 @@ class Mth { private: static const int BIG_ENOUGH_INT; - static const float BIG_ENOUGH_FLOAT; - -public: - static const float RAD_TO_GRAD; + static const float BIG_ENOUGH_FLOAT; public: static const float DEGRAD; static const float RADDEG; + static const float RAD_TO_GRAD; + + static const __int64 UUID_VERSION = 0x000000000000f000L; + static const __int64 UUID_VERSION_TYPE_4 = 0x0000000000004000L; + static const __int64 UUID_VARIANT = 0xc000000000000000L; + static const __int64 UUID_VARIANT_2 = 0x8000000000000000L; private: static float *_sin; private: @@ -18,24 +21,31 @@ private: public : static void init(); // 4J added static float sin(float i); - static float cos(float i); - static float sqrt(float x); - static float sqrt(double x); - static int floor(float v); + static float cos(float i); + static float sqrt(float x); + static float sqrt(double x); + static int floor(float v); static __int64 lfloor(double v); - static int fastFloor(double x); - static int floor(double v); - static int absFloor(double v); - static float abs(float v); + static int fastFloor(double x); + static int floor(double v); + static int absFloor(double v); + static float abs(float v); static int abs(int v); - static int ceil(float v); + static int ceil(float v); static int clamp(int value, int min, int max) ; static float clamp(float value, float min, float max); - static double asbMax(double a, double b); - static int intFloorDiv(int a, int b); - static int nextInt(Random *random, int minInclusive, int maxInclusive); + static double asbMax(double a, double b); + static int intFloorDiv(int a, int b); + static int nextInt(Random *random, int minInclusive, int maxInclusive); + static float nextFloat(Random *random, float min, float max); + static double nextDouble(Random *random, double min, double max); static float wrapDegrees(float input); static double wrapDegrees(double input); + static wstring createInsecureUUID(Random *random); + static int getInt(const wstring &input, int def); + static int getInt(const wstring &input, int def, int min); + static double getDouble(const wstring &input, double def); + static double getDouble(const wstring &input, double def, double min); // 4J Added static bool almostEquals( double double1, double double2, double precision); diff --git a/Minecraft.World/MultiEntityMob.h b/Minecraft.World/MultiEntityMob.h new file mode 100644 index 00000000..a52d0916 --- /dev/null +++ b/Minecraft.World/MultiEntityMob.h @@ -0,0 +1,10 @@ +#pragma once + +class MultiEntityMobPart; + +class MultiEntityMob +{ +public: + virtual Level *getLevel() = 0; + virtual bool hurt(shared_ptr MultiEntityMobPart, DamageSource *source, float damage) = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/MultiEntityMobPart.cpp b/Minecraft.World/MultiEntityMobPart.cpp new file mode 100644 index 00000000..dfca1b2f --- /dev/null +++ b/Minecraft.World/MultiEntityMobPart.cpp @@ -0,0 +1,42 @@ +#include "stdafx.h" +#include "BossMob.h" +#include "MultiEntityMob.h" +#include "MultiEntityMobPart.h" + +MultiEntityMobPart::MultiEntityMobPart(shared_ptrparentMob, const wstring &id, float w, float h) : Entity(parentMob->getLevel()), parentMob( parentMob ), id( id ) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + + setSize(w, h); +} + + +void MultiEntityMobPart::defineSynchedData() +{ +} + +void MultiEntityMobPart::readAdditionalSaveData(CompoundTag *tag) +{ +} + +void MultiEntityMobPart::addAdditonalSaveData(CompoundTag *tag) +{ +} + + +bool MultiEntityMobPart::isPickable() +{ + return true; +} + +bool MultiEntityMobPart::hurt(DamageSource *source, float damage) +{ + return parentMob.lock()->hurt( dynamic_pointer_cast( shared_from_this() ), source, damage); +} + +bool MultiEntityMobPart::is(shared_ptr other) +{ + return shared_from_this() == other || parentMob.lock() == dynamic_pointer_cast(other); +} \ No newline at end of file diff --git a/Minecraft.World/MultiEntityMobPart.h b/Minecraft.World/MultiEntityMobPart.h new file mode 100644 index 00000000..b5322317 --- /dev/null +++ b/Minecraft.World/MultiEntityMobPart.h @@ -0,0 +1,27 @@ +#pragma once +using namespace std; +#include "Entity.h" + +class Level; +class MultiEntityMob; + +class MultiEntityMobPart : public Entity +{ +public: + eINSTANCEOF GetType() { return eTYPE_MULTIENTITY_MOB_PART; }; +public: + weak_ptr parentMob; + const wstring id; + + MultiEntityMobPart(shared_ptr parentMob, const wstring &id, float w, float h); + +protected: + virtual void defineSynchedData(); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); + +public: + virtual bool isPickable(); + virtual bool hurt(DamageSource *source, float damage); + virtual bool is(shared_ptr other); +}; \ No newline at end of file diff --git a/Minecraft.World/MultiTextureTileItem.cpp b/Minecraft.World/MultiTextureTileItem.cpp index a41a896f..88343275 100644 --- a/Minecraft.World/MultiTextureTileItem.cpp +++ b/Minecraft.World/MultiTextureTileItem.cpp @@ -1,14 +1,24 @@ #include "stdafx.h" #include "Tile.h" #include "MultiTextureTileItem.h" +#include "net.minecraft.world.item.crafting.h" -MultiTextureTileItem::MultiTextureTileItem(int id, Tile *parentTile, int *nameExtensions, int iLength) : TileItem(id) +MultiTextureTileItem::MultiTextureTileItem(int id, Tile *parentTile, int *nameExtensions, int iLength, int anyValueName) : TileItem(id) { this->parentTile = parentTile; this->nameExtensions = nameExtensions; this->m_iNameExtensionsLength=iLength; + if(anyValueName != -1) + { + m_anyValueName = anyValueName; + } + else + { + m_anyValueName = nameExtensions[0]; + } + setMaxDamage(0); setStackedByData(true); } @@ -29,18 +39,15 @@ unsigned int MultiTextureTileItem::getDescriptionId(int iData) { iData = 0; } - //return super.getDescriptionId() + "." + nameExtensions[auxValue]; return nameExtensions[iData]; } unsigned int MultiTextureTileItem::getDescriptionId(shared_ptr instance) { - int auxValue = instance->getAuxValue(); - if (auxValue < 0 || auxValue >= m_iNameExtensionsLength) - { - auxValue = 0; - } - //return super.getDescriptionId() + "." + nameExtensions[auxValue]; - return nameExtensions[auxValue]; -} - + int auxValue = instance->getAuxValue(); + if (auxValue == Recipes::ANY_AUX_VALUE || auxValue < 0 || auxValue >= m_iNameExtensionsLength) + { + return m_anyValueName; + } + return nameExtensions[auxValue]; +} \ No newline at end of file diff --git a/Minecraft.World/MultiTextureTileItem.h b/Minecraft.World/MultiTextureTileItem.h index 078357ea..510d1f0f 100644 --- a/Minecraft.World/MultiTextureTileItem.h +++ b/Minecraft.World/MultiTextureTileItem.h @@ -11,9 +11,10 @@ private: //private final String[] nameExtensions; int *nameExtensions; int m_iNameExtensionsLength; + int m_anyValueName; // 4J Added public: - MultiTextureTileItem(int id, Tile *parentTile,int *nameExtensions, int iLength); + MultiTextureTileItem(int id, Tile *parentTile,int *nameExtensions, int iLength, int anyValueName = -1); // 4J Added anyValueName virtual Icon *getIcon(int itemAuxValue); virtual int getLevelDataForAuxValue(int auxValue); diff --git a/Minecraft.World/Mushroom.cpp b/Minecraft.World/Mushroom.cpp index 1056cdec..6b20e0d1 100644 --- a/Minecraft.World/Mushroom.cpp +++ b/Minecraft.World/Mushroom.cpp @@ -4,54 +4,53 @@ #include "net.minecraft.world.h" #include "Mushroom.h" -Mushroom::Mushroom(int id, const wstring &texture) : Bush(id) +Mushroom::Mushroom(int id) : Bush(id) { - this->updateDefaultShape(); - this->setTicking(true); - this->texture = texture; + this->updateDefaultShape(); + this->setTicking(true); } // 4J Added override void Mushroom::updateDefaultShape() { - float ss = 0.2f; - this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, ss * 2, 0.5f + ss); + float ss = 0.2f; + this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, ss * 2, 0.5f + ss); } void Mushroom::tick(Level *level, int x, int y, int z, Random *random) { - if (random->nextInt(25) == 0) + if (random->nextInt(25) == 0) { - int r = 4; - int max = 5; - for (int xx = x - r; xx <= x + r; xx++) - for (int zz = z - r; zz <= z + r; zz++) - for (int yy = y - 1; yy <= y + 1; yy++) + int r = 4; + int max = 5; + for (int xx = x - r; xx <= x + r; xx++) + for (int zz = z - r; zz <= z + r; zz++) + for (int yy = y - 1; yy <= y + 1; yy++) { - if (level->getTile(xx, yy, zz) == id && --max <= 0) return; - } + if (level->getTile(xx, yy, zz) == id && --max <= 0) return; + } - int x2 = x + random->nextInt(3) - 1; - int y2 = y + random->nextInt(2) - random->nextInt(2); - int z2 = z + random->nextInt(3) - 1; - for (int i = 0; i < 4; i++) - { - if (level->isEmptyTile(x2, y2, z2) && canSurvive(level, x2, y2, z2)) + int x2 = x + random->nextInt(3) - 1; + int y2 = y + random->nextInt(2) - random->nextInt(2); + int z2 = z + random->nextInt(3) - 1; + for (int i = 0; i < 4; i++) { - x = x2; - y = y2; - z = z2; - } - x2 = x + random->nextInt(3) - 1; - y2 = y + random->nextInt(2) - random->nextInt(2); - z2 = z + random->nextInt(3) - 1; - } + if (level->isEmptyTile(x2, y2, z2) && canSurvive(level, x2, y2, z2)) + { + x = x2; + y = y2; + z = z2; + } + x2 = x + random->nextInt(3) - 1; + y2 = y + random->nextInt(2) - random->nextInt(2); + z2 = z + random->nextInt(3) - 1; + } - if (level->isEmptyTile(x2, y2, z2) && canSurvive(level, x2, y2, z2)) - { - level->setTile(x2, y2, z2, id); - } - } + if (level->isEmptyTile(x2, y2, z2) && canSurvive(level, x2, y2, z2)) + { + level->setTileAndData(x2, y2, z2, id, 0, UPDATE_CLIENTS); + } + } } bool Mushroom::mayPlace(Level *level, int x, int y, int z) @@ -68,40 +67,35 @@ bool Mushroom::canSurvive(Level *level, int x, int y, int z) { if (y < 0 || y >= Level::maxBuildHeight) return false; - int below = level->getTile(x, y - 1, z); + int below = level->getTile(x, y - 1, z); - return below == Tile::mycel_Id || (level->getDaytimeRawBrightness(x, y, z) < 13 && mayPlaceOn(below)); + return below == Tile::mycel_Id || (level->getDaytimeRawBrightness(x, y, z) < 13 && mayPlaceOn(below)); } bool Mushroom::growTree(Level *level, int x, int y, int z, Random *random) { - int data = level->getData(x, y, z); + int data = level->getData(x, y, z); - level->setTileNoUpdate(x, y, z, 0); - Feature *f = NULL; + level->removeTile(x, y, z); + Feature *f = NULL; - if (id == Tile::mushroom1_Id) + if (id == Tile::mushroom_brown_Id) { - f = new HugeMushroomFeature(0); - } - else if (id == Tile::mushroom2_Id) + f = new HugeMushroomFeature(0); + } + else if (id == Tile::mushroom_red_Id) { - f = new HugeMushroomFeature(1); - } + f = new HugeMushroomFeature(1); + } - if (f == NULL || !f->place(level, random, x, y, z)) + if (f == NULL || !f->place(level, random, x, y, z)) { - level->setTileAndDataNoUpdate(x, y, z, this->id, data); + level->setTileAndData(x, y, z, id, data, Tile::UPDATE_ALL); if( f != NULL ) delete f; - return false; - } + return false; + } if( f != NULL ) delete f; - return true; -} - -void Mushroom::registerIcons(IconRegister *iconRegister) -{ - icon = iconRegister->registerIcon(texture); -} + return true; +} \ No newline at end of file diff --git a/Minecraft.World/Mushroom.h b/Minecraft.World/Mushroom.h index 260ba048..65a3ea1d 100644 --- a/Minecraft.World/Mushroom.h +++ b/Minecraft.World/Mushroom.h @@ -6,12 +6,10 @@ class Random; class Mushroom : public Bush { friend class Tile; -private: - wstring texture; protected: - Mushroom(int id, const wstring &texture); + Mushroom(int id); public: - virtual void updateDefaultShape(); // 4J Added override + virtual void updateDefaultShape(); // 4J Added override virtual void tick(Level *level, int x, int y, int z, Random *random); virtual bool mayPlace(Level *level, int x, int y, int z); protected: @@ -19,5 +17,4 @@ protected: public: virtual bool canSurvive(Level *level, int x, int y, int z); bool growTree(Level *level, int x, int y, int z, Random *random); - void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/MushroomCow.cpp b/Minecraft.World/MushroomCow.cpp index a2aef158..0f88c843 100644 --- a/Minecraft.World/MushroomCow.cpp +++ b/Minecraft.World/MushroomCow.cpp @@ -13,14 +13,15 @@ MushroomCow::MushroomCow(Level *level) : Cow(level) { - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + setHealth(getMaxHealth()); - this->textureIdx = TN_MOB_RED_COW;// 4J was "/mob/redcow.png"; this->setSize(0.9f, 1.3f); } -bool MushroomCow::interact(shared_ptr player) +bool MushroomCow::mobInteract(shared_ptr player) { shared_ptr item = player->inventory->getSelected(); if (item != NULL && item->id == Item::bowl_Id && getAge() >= 0) @@ -36,14 +37,14 @@ bool MushroomCow::interact(shared_ptr player) player->inventory->removeItem(player->inventory->selected, 1); return true; } - } - if (item != NULL && item->id == Item::shears_Id && getAge() >= 0) + } + // 4J: Do not allow shearing if we can't create more cows + if (item != NULL && item->id == Item::shears_Id && getAge() >= 0 && level->canCreateMore(eTYPE_COW, Level::eSpawnType_Breed)) { remove(); level->addParticle(eParticleType_largeexplode, x, y + bbHeight / 2, z, 0, 0, 0); if(!level->isClientSide) { - // 4J Stu - We don't need to check spawn limits when adding the new cow, as we are removing the MushroomCow remove(); shared_ptr cow = shared_ptr( new Cow(level) ); cow->moveTo(x, y, z, yRot, xRot); @@ -52,13 +53,13 @@ bool MushroomCow::interact(shared_ptr player) level->addEntity(cow); for (int i = 0; i < 5; i++) { - level->addEntity( shared_ptr( new ItemEntity(level, x, y + bbHeight, z, shared_ptr( new ItemInstance(Tile::mushroom2))) )); + level->addEntity( shared_ptr( new ItemEntity(level, x, y + bbHeight, z, shared_ptr( new ItemInstance(Tile::mushroom_red))) )); } - return true; + return true; } return true; } - return Cow::interact(player); + return Cow::mobInteract(player); } // 4J - added so that mushroom cows have more of a chance of spawning, they can now spawn on mycelium as well as grass - seems a bit odd that they don't already really diff --git a/Minecraft.World/MushroomCow.h b/Minecraft.World/MushroomCow.h index 4ec97476..fb87bc67 100644 --- a/Minecraft.World/MushroomCow.h +++ b/Minecraft.World/MushroomCow.h @@ -11,7 +11,7 @@ public: public: MushroomCow(Level *level); - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); virtual bool canSpawn(); // 4J added virtual shared_ptr getBreedOffspring(shared_ptr target); }; \ No newline at end of file diff --git a/Minecraft.World/MusicTileEntity.cpp b/Minecraft.World/MusicTileEntity.cpp index 4c2d2615..d947cc69 100644 --- a/Minecraft.World/MusicTileEntity.cpp +++ b/Minecraft.World/MusicTileEntity.cpp @@ -12,8 +12,8 @@ MusicTileEntity::MusicTileEntity() : TileEntity() { - note = 0; - + note = 0; + on = false; } @@ -49,7 +49,7 @@ void MusicTileEntity::playNote(Level *level, int x, int y, int z) if (m == Material::glass) i = 3; if (m == Material::wood) i = 4; - level->tileEvent(x, y, z, Tile::musicBlock_Id, i, note); + level->tileEvent(x, y, z, Tile::noteblock_Id, i, note); } // 4J Added diff --git a/Minecraft.World/MycelTile.cpp b/Minecraft.World/MycelTile.cpp index 7b8a90e1..875a598d 100644 --- a/Minecraft.World/MycelTile.cpp +++ b/Minecraft.World/MycelTile.cpp @@ -7,24 +7,24 @@ MycelTile::MycelTile(int id) : Tile(id, Material::grass) { iconTop = NULL; - iconSnowSide = NULL; - setTicking(true); + iconSnowSide = NULL; + setTicking(true); } Icon *MycelTile::getTexture(int face, int data) { - if (face == Facing::UP) return iconTop; - if (face == Facing::DOWN) return Tile::dirt->getTexture(face); - return icon; + if (face == Facing::UP) return iconTop; + if (face == Facing::DOWN) return Tile::dirt->getTexture(face); + return icon; } Icon *MycelTile::getTexture(LevelSource *level, int x, int y, int z, int face) { - if (face == Facing::UP) return iconTop; - if (face == Facing::DOWN) return Tile::dirt->getTexture(face); - Material *above = level->getMaterial(x, y + 1, z); - if (above == Material::topSnow || above == Material::snow) return iconSnowSide; - else return icon; + if (face == Facing::UP) return iconTop; + if (face == Facing::DOWN) return Tile::dirt->getTexture(face); + Material *above = level->getMaterial(x, y + 1, z); + if (above == Material::topSnow || above == Material::snow) return iconSnowSide; + else return icon; } void MycelTile::registerIcons(IconRegister *iconRegister) @@ -40,7 +40,7 @@ void MycelTile::tick(Level *level, int x, int y, int z, Random *random) if (level->getRawBrightness(x, y + 1, z) < MIN_BRIGHTNESS && Tile::lightBlock[level->getTile(x, y + 1, z)] > 2) { - level->setTile(x, y, z, Tile::dirt_Id); + level->setTileAndUpdate(x, y, z, Tile::dirt_Id); } else { @@ -54,7 +54,7 @@ void MycelTile::tick(Level *level, int x, int y, int z, Random *random) int above = level->getTile(xt, yt + 1, zt); if (level->getTile(xt, yt, zt) == Tile::dirt_Id && level->getRawBrightness(xt, yt + 1, zt) >= MIN_BRIGHTNESS && Tile::lightBlock[above] <= 2) { - level->setTile(xt, yt, zt, id); + level->setTileAndUpdate(xt, yt, zt, id); } } } @@ -63,8 +63,8 @@ void MycelTile::tick(Level *level, int x, int y, int z, Random *random) void MycelTile::animateTick(Level *level, int x, int y, int z, Random *random) { - Tile::animateTick(level, x, y, z, random); - if (random->nextInt(10) == 0) level->addParticle(eParticleType_townaura, x + random->nextFloat(), y + 1.1f, z + random->nextFloat(), 0, 0, 0); + Tile::animateTick(level, x, y, z, random); + if (random->nextInt(10) == 0) level->addParticle(eParticleType_townaura, x + random->nextFloat(), y + 1.1f, z + random->nextFloat(), 0, 0, 0); } diff --git a/Minecraft.World/NameTagItem.cpp b/Minecraft.World/NameTagItem.cpp new file mode 100644 index 00000000..9c11f2af --- /dev/null +++ b/Minecraft.World/NameTagItem.cpp @@ -0,0 +1,23 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "NameTagItem.h" + +NameTagItem::NameTagItem(int id) : Item(id) +{ +} + +bool NameTagItem::interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr target) +{ + if (!itemInstance->hasCustomHoverName()) return false; + + if ( (target != NULL) && target->instanceof(eTYPE_MOB) ) + { + shared_ptr mob = dynamic_pointer_cast(target); + mob->setCustomName(itemInstance->getHoverName()); + mob->setPersistenceRequired(); + itemInstance->count--; + return true; + } + + return Item::interactEnemy(itemInstance, player, target); +} \ No newline at end of file diff --git a/Minecraft.World/NameTagItem.h b/Minecraft.World/NameTagItem.h new file mode 100644 index 00000000..d0aa32e4 --- /dev/null +++ b/Minecraft.World/NameTagItem.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Item.h" + +class NameTagItem : public Item +{ +public: + NameTagItem(int id); + + bool interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr target); +}; \ No newline at end of file diff --git a/Minecraft.World/NearestAttackableTargetGoal.cpp b/Minecraft.World/NearestAttackableTargetGoal.cpp index 5ed9f4f1..1dbf587e 100644 --- a/Minecraft.World/NearestAttackableTargetGoal.cpp +++ b/Minecraft.World/NearestAttackableTargetGoal.cpp @@ -4,6 +4,24 @@ #include "net.minecraft.world.phys.h" #include "NearestAttackableTargetGoal.h" +SubselectEntitySelector::SubselectEntitySelector(NearestAttackableTargetGoal *parent, EntitySelector *subselector) +{ + m_parent = parent; + m_subselector = subselector; +} + +SubselectEntitySelector::~SubselectEntitySelector() +{ + delete m_subselector; +} + +bool SubselectEntitySelector::matches(shared_ptr entity) const +{ + if (!entity->instanceof(eTYPE_LIVINGENTITY)) return false; + if (m_subselector != NULL && !m_subselector->matches(entity)) return false; + return m_parent->canAttack(dynamic_pointer_cast(entity), false); +} + NearestAttackableTargetGoal::DistComp::DistComp(Entity *source) { this->source = source; @@ -19,49 +37,39 @@ bool NearestAttackableTargetGoal::DistComp::operator() (shared_ptr e1, s return true; } -NearestAttackableTargetGoal::NearestAttackableTargetGoal(Mob *mob, const type_info& targetType, float within, int randomInterval, bool mustSee, bool mustReach /*= false*/) : TargetGoal(mob, within, mustSee, mustReach), targetType(targetType) +NearestAttackableTargetGoal::NearestAttackableTargetGoal(PathfinderMob *mob, const type_info& targetType, int randomInterval, bool mustSee, bool mustReach /*= false*/, EntitySelector *entitySelector /* =NULL */) + : TargetGoal(mob, mustSee, mustReach), targetType(targetType) { - //this->targetType = targetType; - this->within = within; this->randomInterval = randomInterval; this->distComp = new DistComp(mob); setRequiredControlFlags(TargetGoal::TargetFlag); + + this->selector = new SubselectEntitySelector(this, entitySelector); } NearestAttackableTargetGoal::~NearestAttackableTargetGoal() { delete distComp; + delete selector; } bool NearestAttackableTargetGoal::canUse() { if (randomInterval > 0 && mob->getRandom()->nextInt(randomInterval) != 0) return false; - if (targetType == typeid(Player)) - { - shared_ptr potentialTarget = mob->level->getNearestAttackablePlayer(mob->shared_from_this(), within); - if (canAttack(potentialTarget, false)) - { - target = weak_ptr(potentialTarget); - return true; - } - } - else + double within = getFollowDistance(); + + vector > *entities = mob->level->getEntitiesOfClass(targetType, mob->bb->grow(within, 4, within), selector); + + bool result = false; + if(entities != NULL && !entities->empty() ) { - vector > *entities = mob->level->getEntitiesOfClass(targetType, mob->bb->grow(within, 4, within)); - //Collections.sort(entities, distComp); std::sort(entities->begin(), entities->end(), *distComp); - for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) - { - shared_ptr potTarget = dynamic_pointer_cast(*it); - if (canAttack(potTarget, false)) - { - target = weak_ptr(potTarget); - return true; - } - } - delete entities; + target = weak_ptr(dynamic_pointer_cast(entities->at(0))); + result = true; } - return false; + + delete entities; + return result; } void NearestAttackableTargetGoal::start() diff --git a/Minecraft.World/NearestAttackableTargetGoal.h b/Minecraft.World/NearestAttackableTargetGoal.h index a10e9264..1ba6c519 100644 --- a/Minecraft.World/NearestAttackableTargetGoal.h +++ b/Minecraft.World/NearestAttackableTargetGoal.h @@ -1,9 +1,26 @@ #pragma once #include "TargetGoal.h" +#include "EntitySelector.h" + +class NearestAttackableTargetGoal; + +// Anonymous class from NearestAttackableTargetGoal +class SubselectEntitySelector : public EntitySelector +{ +private: + EntitySelector *m_subselector; + NearestAttackableTargetGoal *m_parent; + +public: + SubselectEntitySelector(NearestAttackableTargetGoal *parent, EntitySelector *subselector); + ~SubselectEntitySelector(); + bool matches(shared_ptr entity) const; +}; class NearestAttackableTargetGoal : public TargetGoal { + friend class SubselectEntitySelector; public: class DistComp { @@ -17,18 +34,15 @@ public: }; private: - weak_ptr target; const type_info& targetType; int randomInterval; DistComp *distComp; + EntitySelector *selector; + weak_ptr target; public: - //public NearestAttackableTargetGoal(Mob mob, const type_info& targetType, float within, int randomInterval, bool mustSee) - //{ - // this(mob, targetType, within, randomInterval, mustSee, false); - //} + NearestAttackableTargetGoal(PathfinderMob *mob, const type_info& targetType, int randomInterval, bool mustSee, bool mustReach = false, EntitySelector *entitySelector = NULL); - NearestAttackableTargetGoal(Mob *mob, const type_info& targetType, float within, int randomInterval, bool mustSee, bool mustReach = false); virtual ~NearestAttackableTargetGoal(); virtual bool canUse(); diff --git a/Minecraft.World/NetherBridgeFeature.cpp b/Minecraft.World/NetherBridgeFeature.cpp index b8308af7..2cf883c4 100644 --- a/Minecraft.World/NetherBridgeFeature.cpp +++ b/Minecraft.World/NetherBridgeFeature.cpp @@ -10,9 +10,10 @@ NetherBridgeFeature::NetherBridgeFeature() : StructureFeature() { - bridgeEnemies.push_back(new Biome::MobSpawnerData(eTYPE_BLAZE, 10, 2, 3)); - bridgeEnemies.push_back(new Biome::MobSpawnerData(eTYPE_PIGZOMBIE, 10, 4, 4)); - bridgeEnemies.push_back(new Biome::MobSpawnerData(eTYPE_LAVASLIME, 3, 4, 4)); + bridgeEnemies.push_back(new Biome::MobSpawnerData(eTYPE_BLAZE, 10, 2, 3)); + bridgeEnemies.push_back(new Biome::MobSpawnerData(eTYPE_PIGZOMBIE, 5, 4, 4)); + bridgeEnemies.push_back(new Biome::MobSpawnerData(eTYPE_SKELETON, 10, 4, 4)); + bridgeEnemies.push_back(new Biome::MobSpawnerData(eTYPE_LAVASLIME, 3, 4, 4)); isSpotSelected=false; netherFortressPos = NULL; @@ -23,6 +24,11 @@ NetherBridgeFeature::~NetherBridgeFeature() if( netherFortressPos != NULL ) delete netherFortressPos; } +wstring NetherBridgeFeature::getFeatureName() +{ + return L"Fortress"; +} + vector *NetherBridgeFeature::getBridgeEnemies() { return &bridgeEnemies; @@ -48,7 +54,7 @@ bool NetherBridgeFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) isSpotSelected = true; } - + bool forcePlacement = false; LevelGenerationOptions *levelGenOptions = app.getLevelGenerationOptions(); if( levelGenOptions != NULL ) @@ -57,7 +63,7 @@ bool NetherBridgeFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) } if(forcePlacement || (x == netherFortressPos->x && z == netherFortressPos->z) ) return true; - + #ifdef _LARGE_WORLDS int xzSize = level->dimension->getXZSize(); if(xzSize > 30) @@ -90,7 +96,7 @@ bool NetherBridgeFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) StructureStart *NetherBridgeFeature::createStructureStart(int x, int z) { - return new NetherBridgeStart(level, random, x, z); + return new NetherBridgeStart(level, random, x, z); } void NetherBridgeFeature::clearCachedBuildings() @@ -98,22 +104,27 @@ void NetherBridgeFeature::clearCachedBuildings() cachedStructures.clear(); } -NetherBridgeFeature::NetherBridgeStart::NetherBridgeStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart() +NetherBridgeFeature::NetherBridgeStart::NetherBridgeStart() { - NetherBridgePieces::StartPiece *start = new NetherBridgePieces::StartPiece(random, (chunkX << 4) + 2, (chunkZ << 4) + 2, level); - pieces.push_back(start); - start->addChildren(start, &pieces, random); + // for reflection +} + +NetherBridgeFeature::NetherBridgeStart::NetherBridgeStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart(chunkX, chunkZ) +{ + NetherBridgePieces::StartPiece *start = new NetherBridgePieces::StartPiece(random, (chunkX << 4) + 2, (chunkZ << 4) + 2, level); + pieces.push_back(start); + start->addChildren(start, &pieces, random); - vector *pendingChildren = &start->pendingChildren; - while (!pendingChildren->empty()) + vector *pendingChildren = &start->pendingChildren; + while (!pendingChildren->empty()) { - int pos = random->nextInt((int)pendingChildren->size()); + int pos = random->nextInt((int)pendingChildren->size()); AUTO_VAR(it, pendingChildren->begin() + pos); - StructurePiece *structurePiece = *it; + StructurePiece *structurePiece = *it; pendingChildren->erase(it); - structurePiece->addChildren(start, &pieces, random); - } + structurePiece->addChildren(start, &pieces, random); + } - calculateBoundingBox(); - moveInsideHeights(level, random, 48, 70); + calculateBoundingBox(); + moveInsideHeights(level, random, 48, 70); } diff --git a/Minecraft.World/NetherBridgeFeature.h b/Minecraft.World/NetherBridgeFeature.h index cd7f315f..2fd1701a 100644 --- a/Minecraft.World/NetherBridgeFeature.h +++ b/Minecraft.World/NetherBridgeFeature.h @@ -15,16 +15,22 @@ private: public: NetherBridgeFeature(); ~NetherBridgeFeature(); - vector *getBridgeEnemies(); + wstring getFeatureName(); + vector *getBridgeEnemies(); protected: virtual bool isFeatureChunk(int x, int z, bool bIsSuperflat); - virtual StructureStart *createStructureStart(int x, int z); + virtual StructureStart *createStructureStart(int x, int z); public: void clearCachedBuildings(); -private: + class NetherBridgeStart : public StructureStart { +public: + static StructureStart *Create() { return new NetherBridgeStart(); } + virtual EStructureStart GetType() { return eStructureStart_NetherBridgeStart; } + public: + NetherBridgeStart(); NetherBridgeStart(Level *level, Random *random, int chunkX, int chunkZ); - }; + }; }; diff --git a/Minecraft.World/NetherBridgePieces.cpp b/Minecraft.World/NetherBridgePieces.cpp index 9a795e78..ff158fba 100644 --- a/Minecraft.World/NetherBridgePieces.cpp +++ b/Minecraft.World/NetherBridgePieces.cpp @@ -1,12 +1,34 @@ #include "stdafx.h" +#include "net.minecraft.world.item.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.level.levelgen.h" #include "net.minecraft.world.level.storage.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "WeighedTreasure.h" #include "NetherBridgePieces.h" #include "Direction.h" +void NetherBridgePieces::loadStatic() +{ + StructureFeatureIO::setPieceId( eStructurePiece_BridgeCrossing, BridgeCrossing::Create, L"NeBCr"); + StructureFeatureIO::setPieceId( eStructurePiece_BridgeEndFiller, BridgeEndFiller::Create, L"NeBEF"); + StructureFeatureIO::setPieceId( eStructurePiece_BridgeStraight, BridgeStraight::Create, L"NeBS"); + StructureFeatureIO::setPieceId( eStructurePiece_CastleCorridorStairsPiece, CastleCorridorStairsPiece::Create, L"NeCCS"); + StructureFeatureIO::setPieceId( eStructurePiece_CastleCorridorTBalconyPiece, CastleCorridorTBalconyPiece::Create, L"NeCTB"); + StructureFeatureIO::setPieceId( eStructurePiece_CastleEntrance, CastleEntrance::Create, L"NeCE"); + StructureFeatureIO::setPieceId( eStructurePiece_CastleSmallCorridorCrossingPiece, CastleSmallCorridorCrossingPiece::Create, L"NeSCSC"); + StructureFeatureIO::setPieceId( eStructurePiece_CastleSmallCorridorLeftTurnPiece, CastleSmallCorridorLeftTurnPiece::Create, L"NeSCLT"); + StructureFeatureIO::setPieceId( eStructurePiece_CastleSmallCorridorPiece, CastleSmallCorridorPiece::Create, L"NeSC"); + StructureFeatureIO::setPieceId( eStructurePiece_CastleSmallCorridorRightTurnPiece, CastleSmallCorridorRightTurnPiece::Create, L"NeSCRT"); + StructureFeatureIO::setPieceId( eStructurePiece_CastleStalkRoom, CastleStalkRoom::Create, L"NeCSR"); + StructureFeatureIO::setPieceId( eStructurePiece_MonsterThrone, MonsterThrone::Create, L"NeMT"); + StructureFeatureIO::setPieceId( eStructurePiece_RoomCrossing, RoomCrossing::Create, L"NeRC"); + StructureFeatureIO::setPieceId( eStructurePiece_StairsRoom, StairsRoom::Create, L"NeSR"); + StructureFeatureIO::setPieceId( eStructurePiece_NetherBridgeStartPiece, StartPiece::Create, L"NeStart"); +} + NetherBridgePieces::PieceWeight::PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount, bool allowInRow) : weight(weight) { this->placeCount = 0; @@ -114,10 +136,37 @@ NetherBridgePieces::NetherBridgePiece *NetherBridgePieces::findAndCreateBridgePi return structurePiece; } +WeighedTreasure *NetherBridgePieces::NetherBridgePiece::fortressTreasureItems[FORTRESS_TREASURE_ITEMS_COUNT] = { + new WeighedTreasure(Item::diamond_Id, 0, 1, 3, 5), + new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 5), + new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 15), + new WeighedTreasure(Item::sword_gold_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::chestplate_gold_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::flintAndSteel_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::netherwart_seeds_Id, 0, 3, 7, 5), + new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 10), + new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 8), + new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 3), +}; + +NetherBridgePieces::NetherBridgePiece::NetherBridgePiece() +{ + // for reflection +} + NetherBridgePieces::NetherBridgePiece::NetherBridgePiece(int genDepth) : StructurePiece(genDepth) { } +void NetherBridgePieces::NetherBridgePiece::readAdditonalSaveData(CompoundTag *tag) +{ +} + +void NetherBridgePieces::NetherBridgePiece::addAdditonalSaveData(CompoundTag *tag) +{ +} + int NetherBridgePieces::NetherBridgePiece::updatePieceWeight(list *currentPieces) { bool hasAnyPieces = false; @@ -280,12 +329,12 @@ void NetherBridgePieces::NetherBridgePiece::generateLightPost(Level *level, Rand if (level->isEmptyTile(worldX, worldY, worldZ) && level->isEmptyTile(worldX, worldY + 1, worldZ) && level->isEmptyTile(worldX, worldY + 2, worldZ) && level->isEmptyTile(worldX, worldY + 3, worldZ)) { - level->setTileAndDataNoUpdate(worldX, worldY, worldZ, Tile::netherFence_Id, 0); - level->setTileAndDataNoUpdate(worldX, worldY + 1, worldZ, Tile::netherFence_Id, 0); - level->setTileAndDataNoUpdate(worldX, worldY + 2, worldZ, Tile::netherFence_Id, 0); - level->setTileAndDataNoUpdate(worldX, worldY + 3, worldZ, Tile::netherFence_Id, 0); + level->setTileAndData(worldX, worldY, worldZ, Tile::netherFence_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(worldX, worldY + 1, worldZ, Tile::netherFence_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(worldX, worldY + 2, worldZ, Tile::netherFence_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(worldX, worldY + 3, worldZ, Tile::netherFence_Id, 0, Tile::UPDATE_CLIENTS); placeBlock(level, Tile::netherFence_Id, 0, x + xOff, y + 3, z + zOff, chunkBB); - placeBlock(level, Tile::lightGem_Id, 0, x + xOff, y + 2, z + zOff, chunkBB); + placeBlock(level, Tile::glowstone_Id, 0, x + xOff, y + 2, z + zOff, chunkBB); } } @@ -309,6 +358,10 @@ void NetherBridgePieces::NetherBridgePiece::generateLightPostFacingDown(Level *l generateLightPost(level, random, chunkBB, x, y, z, 0, -1); } +NetherBridgePieces::BridgeStraight::BridgeStraight() +{ + // for reflection +} NetherBridgePieces::BridgeStraight::BridgeStraight(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { @@ -328,7 +381,7 @@ NetherBridgePieces::BridgeStraight *NetherBridgePieces::BridgeStraight::createPi StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -375,6 +428,11 @@ bool NetherBridgePieces::BridgeStraight::postProcess(Level *level, Random *rando return true; } +NetherBridgePieces::BridgeEndFiller::BridgeEndFiller() +{ + // for reflection +} + NetherBridgePieces::BridgeEndFiller::BridgeEndFiller(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { orientation = direction; @@ -389,7 +447,7 @@ NetherBridgePieces::BridgeEndFiller *NetherBridgePieces::BridgeEndFiller::create StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -442,6 +500,25 @@ bool NetherBridgePieces::BridgeEndFiller::postProcess(Level *level, Random *rand return true; } +void NetherBridgePieces::BridgeEndFiller::readAdditonalSaveData(CompoundTag *tag) +{ + NetherBridgePiece::readAdditonalSaveData(tag); + + selfSeed = tag->getInt(L"Seed"); +} + +void NetherBridgePieces::BridgeEndFiller::addAdditonalSaveData(CompoundTag *tag) +{ + NetherBridgePiece::addAdditonalSaveData(tag); + + tag->putInt(L"Seed", selfSeed); +} + +NetherBridgePieces::BridgeCrossing::BridgeCrossing() +{ + // for reflection +} + NetherBridgePieces::BridgeCrossing::BridgeCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { orientation = direction; @@ -478,7 +555,7 @@ NetherBridgePieces::BridgeCrossing *NetherBridgePieces::BridgeCrossing::createPi StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -535,10 +612,14 @@ bool NetherBridgePieces::BridgeCrossing::postProcess(Level *level, Random *rando return true; } +NetherBridgePieces::StartPiece::StartPiece() +{ + // for reflection + previousPiece = NULL; +} NetherBridgePieces::StartPiece::StartPiece(Random *random, int west, int north, Level *level) : BridgeCrossing(random, west, north) { - isLibraryAdded = false; previousPiece = NULL; m_level = level; @@ -558,6 +639,20 @@ NetherBridgePieces::StartPiece::StartPiece(Random *random, int west, int north, } } +void NetherBridgePieces::StartPiece::readAdditonalSaveData(CompoundTag *tag) +{ + BridgeCrossing::readAdditonalSaveData(tag); +} + +void NetherBridgePieces::StartPiece::addAdditonalSaveData(CompoundTag *tag) +{ + BridgeCrossing::addAdditonalSaveData(tag); +} + +NetherBridgePieces::RoomCrossing::RoomCrossing() +{ + // for reflection +} NetherBridgePieces::RoomCrossing::RoomCrossing(int genDepth, Random *random, BoundingBox *box, int direction) : NetherBridgePiece(genDepth) { @@ -579,7 +674,7 @@ NetherBridgePieces::RoomCrossing *NetherBridgePieces::RoomCrossing::createPiece( StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -626,6 +721,11 @@ bool NetherBridgePieces::RoomCrossing::postProcess(Level *level, Random *random, return true; } +NetherBridgePieces::StairsRoom::StairsRoom() +{ + // for reflection +} + NetherBridgePieces::StairsRoom::StairsRoom(int genDepth, Random *random, BoundingBox *box, int direction) : NetherBridgePiece(genDepth) { orientation = direction; @@ -644,7 +744,7 @@ NetherBridgePieces::StairsRoom *NetherBridgePieces::StairsRoom::createPiece(list StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -699,6 +799,10 @@ bool NetherBridgePieces::StairsRoom::postProcess(Level *level, Random *random, B } +NetherBridgePieces::MonsterThrone::MonsterThrone() +{ + // for reflection +} NetherBridgePieces::MonsterThrone::MonsterThrone(int genDepth, Random *random, BoundingBox *box, int direction) : NetherBridgePiece(genDepth) { @@ -714,7 +818,7 @@ NetherBridgePieces::MonsterThrone *NetherBridgePieces::MonsterThrone::createPiec StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -723,6 +827,20 @@ NetherBridgePieces::MonsterThrone *NetherBridgePieces::MonsterThrone::createPiec return new MonsterThrone(genDepth, random, box, direction); } +void NetherBridgePieces::MonsterThrone::readAdditonalSaveData(CompoundTag *tag) +{ + NetherBridgePiece::readAdditonalSaveData(tag); + + hasPlacedMobSpawner = tag->getBoolean(L"Mob"); +} + +void NetherBridgePieces::MonsterThrone::addAdditonalSaveData(CompoundTag *tag) +{ + NetherBridgePiece::addAdditonalSaveData(tag); + + tag->putBoolean(L"Mob", hasPlacedMobSpawner); +} + bool NetherBridgePieces::MonsterThrone::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { generateBox(level, chunkBB, 0, 2, 0, 6, 7, 7, 0, 0, false); @@ -756,9 +874,9 @@ bool NetherBridgePieces::MonsterThrone::postProcess(Level *level, Random *random if (chunkBB->isInside(x, y, z)) { hasPlacedMobSpawner = true; - level->setTile(x, y, z, Tile::mobSpawner_Id); + level->setTileAndData(x, y, z, Tile::mobSpawner_Id, 0, Tile::UPDATE_CLIENTS); shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); - if (entity != NULL) entity->setEntityId(L"Blaze"); + if (entity != NULL) entity->getSpawner()->setEntityId(L"Blaze"); } } @@ -773,6 +891,10 @@ bool NetherBridgePieces::MonsterThrone::postProcess(Level *level, Random *random return true; } +NetherBridgePieces::CastleEntrance::CastleEntrance() +{ + // for reflection +} NetherBridgePieces::CastleEntrance::CastleEntrance(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { @@ -792,7 +914,7 @@ NetherBridgePieces::CastleEntrance *NetherBridgePieces::CastleEntrance::createPi StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -898,6 +1020,10 @@ bool NetherBridgePieces::CastleEntrance::postProcess(Level *level, Random *rando return true; } +NetherBridgePieces::CastleStalkRoom::CastleStalkRoom() +{ + // for reflection +} NetherBridgePieces::CastleStalkRoom::CastleStalkRoom(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { @@ -918,7 +1044,7 @@ NetherBridgePieces::CastleStalkRoom *NetherBridgePieces::CastleStalkRoom::create StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -1024,8 +1150,8 @@ bool NetherBridgePieces::CastleStalkRoom::postProcess(Level *level, Random *rand placeBlock(level, Tile::stairs_netherBricks_Id, eastOrientation, 8, 5, 10, chunkBB); // farmlands - generateBox(level, chunkBB, 3, 4, 4, 4, 4, 8, Tile::hellSand_Id, Tile::hellSand_Id, false); - generateBox(level, chunkBB, 8, 4, 4, 9, 4, 8, Tile::hellSand_Id, Tile::hellSand_Id, false); + generateBox(level, chunkBB, 3, 4, 4, 4, 4, 8, Tile::soulsand_Id, Tile::soulsand_Id, false); + generateBox(level, chunkBB, 8, 4, 4, 9, 4, 8, Tile::soulsand_Id, Tile::soulsand_Id, false); generateBox(level, chunkBB, 3, 5, 4, 4, 5, 8, Tile::netherStalk_Id, Tile::netherStalk_Id, false); generateBox(level, chunkBB, 8, 5, 4, 9, 5, 8, Tile::netherStalk_Id, Tile::netherStalk_Id, false); @@ -1059,6 +1185,10 @@ bool NetherBridgePieces::CastleStalkRoom::postProcess(Level *level, Random *rand } +NetherBridgePieces::CastleSmallCorridorPiece::CastleSmallCorridorPiece() +{ + // for reflection +} NetherBridgePieces::CastleSmallCorridorPiece::CastleSmallCorridorPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { @@ -1080,7 +1210,7 @@ NetherBridgePieces::CastleSmallCorridorPiece *NetherBridgePieces::CastleSmallCor StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -1119,6 +1249,10 @@ bool NetherBridgePieces::CastleSmallCorridorPiece::postProcess(Level *level, Ran return true; } +NetherBridgePieces::CastleSmallCorridorCrossingPiece::CastleSmallCorridorCrossingPiece() +{ + // for reflection +} NetherBridgePieces::CastleSmallCorridorCrossingPiece::CastleSmallCorridorCrossingPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { @@ -1140,7 +1274,7 @@ NetherBridgePieces::CastleSmallCorridorCrossingPiece *NetherBridgePieces::Castle StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -1177,11 +1311,31 @@ bool NetherBridgePieces::CastleSmallCorridorCrossingPiece::postProcess(Level *le return true; } +NetherBridgePieces::CastleSmallCorridorRightTurnPiece::CastleSmallCorridorRightTurnPiece() +{ + // for reflection + isNeedingChest = false; +} NetherBridgePieces::CastleSmallCorridorRightTurnPiece::CastleSmallCorridorRightTurnPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { orientation = direction; boundingBox = stairsBox; + isNeedingChest = random->nextInt(3) == 0; +} + +void NetherBridgePieces::CastleSmallCorridorRightTurnPiece::readAdditonalSaveData(CompoundTag *tag) +{ + NetherBridgePiece::readAdditonalSaveData(tag); + + isNeedingChest = tag->getBoolean(L"Chest"); +} + +void NetherBridgePieces::CastleSmallCorridorRightTurnPiece::addAdditonalSaveData(CompoundTag *tag) +{ + NetherBridgePiece::addAdditonalSaveData(tag); + + tag->putBoolean(L"Chest", isNeedingChest); } void NetherBridgePieces::CastleSmallCorridorRightTurnPiece::addChildren(StructurePiece *startPiece, list *pieces, Random *random) @@ -1196,7 +1350,7 @@ NetherBridgePieces::CastleSmallCorridorRightTurnPiece *NetherBridgePieces::Castl StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -1223,6 +1377,17 @@ bool NetherBridgePieces::CastleSmallCorridorRightTurnPiece::postProcess(Level *l generateBox(level, chunkBB, 1, 3, 4, 1, 4, 4, Tile::netherFence_Id, Tile::netherBrick_Id, false); generateBox(level, chunkBB, 3, 3, 4, 3, 4, 4, Tile::netherFence_Id, Tile::netherBrick_Id, false); + if (isNeedingChest) + { + int y = getWorldY(2); + int x = getWorldX(1, 3), z = getWorldZ(1, 3); + if (chunkBB->isInside(x, y, z)) + { + isNeedingChest = false; + createChest(level, chunkBB, random, 1, 2, 3, WeighedTreasureArray(fortressTreasureItems,FORTRESS_TREASURE_ITEMS_COUNT), 2 + random->nextInt(4)); + } + } + // roof generateBox(level, chunkBB, 0, 6, 0, 4, 6, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false); @@ -1238,11 +1403,31 @@ bool NetherBridgePieces::CastleSmallCorridorRightTurnPiece::postProcess(Level *l return true; } +NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::CastleSmallCorridorLeftTurnPiece() +{ + isNeedingChest = false; + // for reflection +} NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::CastleSmallCorridorLeftTurnPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { orientation = direction; boundingBox = stairsBox; + isNeedingChest = random->nextInt(3) == 0; +} + +void NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::readAdditonalSaveData(CompoundTag *tag) +{ + NetherBridgePiece::readAdditonalSaveData(tag); + + isNeedingChest = tag->getBoolean(L"Chest"); +} + +void NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::addAdditonalSaveData(CompoundTag *tag) +{ + NetherBridgePiece::addAdditonalSaveData(tag); + + tag->putBoolean(L"Chest", isNeedingChest); } void NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::addChildren(StructurePiece *startPiece, list *pieces, Random *random) @@ -1257,7 +1442,7 @@ NetherBridgePieces::CastleSmallCorridorLeftTurnPiece *NetherBridgePieces::Castle StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -1284,6 +1469,17 @@ bool NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::postProcess(Level *le generateBox(level, chunkBB, 1, 3, 4, 1, 4, 4, Tile::netherFence_Id, Tile::netherBrick_Id, false); generateBox(level, chunkBB, 3, 3, 4, 3, 4, 4, Tile::netherFence_Id, Tile::netherBrick_Id, false); + if (isNeedingChest) + { + int y = getWorldY(2); + int x = getWorldX(3, 3), z = getWorldZ(3, 3); + if (chunkBB->isInside(x, y, z)) + { + isNeedingChest = false; + createChest(level, chunkBB, random, 3, 2, 3, WeighedTreasureArray(fortressTreasureItems,FORTRESS_TREASURE_ITEMS_COUNT), 2 + random->nextInt(4)); + } + } + // roof generateBox(level, chunkBB, 0, 6, 0, 4, 6, 4, Tile::netherBrick_Id, Tile::netherBrick_Id, false); @@ -1299,6 +1495,10 @@ bool NetherBridgePieces::CastleSmallCorridorLeftTurnPiece::postProcess(Level *le return true; } +NetherBridgePieces::CastleCorridorStairsPiece::CastleCorridorStairsPiece() +{ + // for reflection +} NetherBridgePieces::CastleCorridorStairsPiece::CastleCorridorStairsPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { @@ -1318,7 +1518,7 @@ NetherBridgePieces::CastleCorridorStairsPiece *NetherBridgePieces::CastleCorrido StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; @@ -1369,6 +1569,10 @@ bool NetherBridgePieces::CastleCorridorStairsPiece::postProcess(Level *level, Ra return true; } +NetherBridgePieces::CastleCorridorTBalconyPiece::CastleCorridorTBalconyPiece() +{ + // for reflection +} NetherBridgePieces::CastleCorridorTBalconyPiece::CastleCorridorTBalconyPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : NetherBridgePiece(genDepth) { @@ -1396,7 +1600,7 @@ NetherBridgePieces::CastleCorridorTBalconyPiece *NetherBridgePieces::CastleCorri StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((NetherBridgePieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; return NULL; diff --git a/Minecraft.World/NetherBridgePieces.h b/Minecraft.World/NetherBridgePieces.h index 47d2ca67..81cb1560 100644 --- a/Minecraft.World/NetherBridgePieces.h +++ b/Minecraft.World/NetherBridgePieces.h @@ -5,8 +5,8 @@ class NetherBridgePieces { private: static const int MAX_DEPTH = 30; - // the dungeon starts at 64 and traverses downwards to this point - static const int LOWEST_Y_POSITION = 10; + // the dungeon starts at 64 and traverses downwards to this point + static const int LOWEST_Y_POSITION = 10; // 4J - added to replace use of Class within this class enum EPieceClass @@ -27,317 +27,433 @@ private: EPieceClass_CastleCorridorTBalconyPiece }; - class PieceWeight +public: + static void loadStatic(); + +private: + class PieceWeight { public: - EPieceClass pieceClass; - const int weight; - int placeCount; - int maxPlaceCount; - bool allowInRow; - - PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount, bool allowInRow); - PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount); - bool doPlace(int depth); - bool isValid(); - }; + EPieceClass pieceClass; + const int weight; + int placeCount; + int maxPlaceCount; + bool allowInRow; + + PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount, bool allowInRow); + PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount); + bool doPlace(int depth); + bool isValid(); + }; static const int BRIDGE_PIECEWEIGHTS_COUNT = 6; static const int CASTLE_PIECEWEIGHTS_COUNT = 7; - static NetherBridgePieces::PieceWeight *bridgePieceWeights[BRIDGE_PIECEWEIGHTS_COUNT]; + static NetherBridgePieces::PieceWeight *bridgePieceWeights[BRIDGE_PIECEWEIGHTS_COUNT]; static NetherBridgePieces::PieceWeight *castlePieceWeights[CASTLE_PIECEWEIGHTS_COUNT]; private: class NetherBridgePiece; static NetherBridgePiece *findAndCreateBridgePieceFactory(NetherBridgePieces::PieceWeight *piece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); - /** - * - * - */ + /** + * + * + */ public: class StartPiece; private: - class NetherBridgePiece : public StructurePiece + class NetherBridgePiece : public StructurePiece { - protected: - NetherBridgePiece(int genDepth); + protected: + static const int FORTRESS_TREASURE_ITEMS_COUNT = 11; + static WeighedTreasure *fortressTreasureItems[FORTRESS_TREASURE_ITEMS_COUNT]; + + public: + NetherBridgePiece(); + + protected: + NetherBridgePiece(int genDepth); + + virtual void readAdditonalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); + private: int updatePieceWeight(list *currentPieces); - NetherBridgePiece *generatePiece(StartPiece *startPiece, list *currentPieces, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); - StructurePiece *generateAndAddPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth, bool isCastle); + NetherBridgePiece *generatePiece(StartPiece *startPiece, list *currentPieces, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); + StructurePiece *generateAndAddPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth, bool isCastle); protected: StructurePiece *generateChildForward(StartPiece *startPiece, list *pieces, Random *random, int xOff, int yOff, bool isCastle); StructurePiece *generateChildLeft(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff, bool isCastle); StructurePiece *generateChildRight(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff, bool isCastle); - + static bool isOkBox(BoundingBox *box, StartPiece *startRoom); // 4J added startRoom param void generateLightPost(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z, int xOff, int zOff); - + void generateLightPostFacingRight(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z); void generateLightPostFacingLeft(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z); void generateLightPostFacingUp(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z); void generateLightPostFacingDown(Level *level, Random *random, BoundingBox *chunkBB, int x, int y, int z); - }; + }; - /** - * - * - */ + /** + * + * + */ class BridgeStraight : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new BridgeStraight(); } + virtual EStructurePiece GetType() { return eStructurePiece_BridgeStraight; } + private: static const int width = 5; - static const int height = 10; - static const int depth = 19; + static const int height = 10; + static const int depth = 19; public: + BridgeStraight(); BridgeStraight(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static BridgeStraight *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static BridgeStraight *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; - class BridgeEndFiller : public NetherBridgePiece + class BridgeEndFiller : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new BridgeEndFiller(); } + virtual EStructurePiece GetType() { return eStructurePiece_BridgeEndFiller; } + private: static const int width = 5; - static const int height = 10; - static const int depth = 8; + static const int height = 10; + static const int depth = 8; - int selfSeed; + int selfSeed; public: + BridgeEndFiller(); BridgeEndFiller(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - static BridgeEndFiller *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - class BridgeCrossing : public NetherBridgePiece + static BridgeEndFiller *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + + protected: + void readAdditonalSaveData(CompoundTag *tag); + void addAdditonalSaveData(CompoundTag *tag); + }; + + class BridgeCrossing : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new BridgeCrossing(); } + virtual EStructurePiece GetType() { return eStructurePiece_BridgeCrossing; } + private: static const int width = 19; - static const int height = 10; - static const int depth = 19; + static const int height = 10; + static const int depth = 19; public: + BridgeCrossing(); BridgeCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction); protected: BridgeCrossing(Random *random, int west, int north); public: - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static BridgeCrossing *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static BridgeCrossing *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; public: - class StartPiece : public BridgeCrossing + class StartPiece : public BridgeCrossing { + public: + virtual EStructurePiece GetType() { return eStructurePiece_NetherBridgeStartPiece; } public: - bool isLibraryAdded; - PieceWeight *previousPiece; + PieceWeight *previousPiece; Level *m_level; - list availableBridgePieces; - list availableCastlePieces; + list availableBridgePieces; + list availableCastlePieces; - // this queue is used so that the addChildren calls are - // called in a random order - vector pendingChildren; + // this queue is used so that the addChildren calls are + // called in a random order + vector pendingChildren; - StartPiece(Random *random, int west, int north, Level *level); // 4J Added level param + StartPiece(); + StartPiece(Random *random, int west, int north, Level *level); // 4J Added level param - }; + protected: + virtual void readAdditonalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); + }; private: - class RoomCrossing : public NetherBridgePiece + class RoomCrossing : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new RoomCrossing(); } + virtual EStructurePiece GetType() { return eStructurePiece_RoomCrossing; } + private: static const int width = 7; - static const int height = 9; - static const int depth = 7; + static const int height = 9; + static const int depth = 7; public: + RoomCrossing(); RoomCrossing(int genDepth, Random *random, BoundingBox *box, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static RoomCrossing *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static RoomCrossing *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; - class StairsRoom : public NetherBridgePiece + class StairsRoom : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new StairsRoom(); } + virtual EStructurePiece GetType() { return eStructurePiece_StairsRoom; } + private: static const int width = 7; - static const int height = 11; - static const int depth = 7; + static const int height = 11; + static const int depth = 7; public: + StairsRoom(); StairsRoom(int genDepth, Random *random, BoundingBox *box, int direction); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static StairsRoom *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + static StairsRoom *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; - class MonsterThrone : public NetherBridgePiece + class MonsterThrone : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new MonsterThrone(); } + virtual EStructurePiece GetType() { return eStructurePiece_MonsterThrone; } + private: static const int width = 7; - static const int height = 8; - static const int depth = 9; + static const int height = 8; + static const int depth = 9; - bool hasPlacedMobSpawner; + bool hasPlacedMobSpawner; public: + MonsterThrone(); MonsterThrone(int genDepth, Random *random, BoundingBox *box, int direction); - static MonsterThrone *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - - /** - * - * - */ - class CastleEntrance : public NetherBridgePiece + + protected: + virtual void readAdditonalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); + + public: + static MonsterThrone *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ + class CastleEntrance : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new CastleEntrance(); } + virtual EStructurePiece GetType() { return eStructurePiece_CastleEntrance; } + private: - static const int width = 13; - static const int height = 14; - static const int depth = 13; - public: - CastleEntrance(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static CastleEntrance *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - - /** - * - * - */ - class CastleStalkRoom : public NetherBridgePiece + static const int width = 13; + static const int height = 14; + static const int depth = 13; + public: + CastleEntrance(); + CastleEntrance(int genDepth, Random *random, BoundingBox *stairsBox, int direction); + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static CastleEntrance *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ + class CastleStalkRoom : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new CastleStalkRoom(); } + virtual EStructurePiece GetType() { return eStructurePiece_CastleStalkRoom; } + private: - static const int width = 13; - static const int height = 14; - static const int depth = 13; + static const int width = 13; + static const int height = 14; + static const int depth = 13; public: + CastleStalkRoom(); CastleStalkRoom(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static CastleStalkRoom *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - - /** - * - * - */ + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static CastleStalkRoom *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ class CastleSmallCorridorPiece : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new CastleSmallCorridorPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_CastleSmallCorridorPiece; } + private: - static const int width = 5; - static const int height = 7; - static const int depth = 5; + static const int width = 5; + static const int height = 7; + static const int depth = 5; public: + CastleSmallCorridorPiece(); CastleSmallCorridorPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static CastleSmallCorridorPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - - /** - * - * - */ - class CastleSmallCorridorCrossingPiece : public NetherBridgePiece + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static CastleSmallCorridorPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ + class CastleSmallCorridorCrossingPiece : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new CastleSmallCorridorCrossingPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_CastleSmallCorridorCrossingPiece; } + private: - static const int width = 5; - static const int height = 7; - static const int depth = 5; + static const int width = 5; + static const int height = 7; + static const int depth = 5; public: + CastleSmallCorridorCrossingPiece(); CastleSmallCorridorCrossingPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static CastleSmallCorridorCrossingPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - - /** - * - * - */ - class CastleSmallCorridorRightTurnPiece : public NetherBridgePiece + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static CastleSmallCorridorCrossingPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ + class CastleSmallCorridorRightTurnPiece : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new CastleSmallCorridorRightTurnPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_CastleSmallCorridorRightTurnPiece; } + private: static const int width = 5; static const int height = 7; static const int depth = 5; + bool isNeedingChest; + public: + CastleSmallCorridorRightTurnPiece(); CastleSmallCorridorRightTurnPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static CastleSmallCorridorRightTurnPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + protected: + virtual void readAdditonalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); + + public: + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static CastleSmallCorridorRightTurnPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + + }; - /** - * - * - */ - class CastleSmallCorridorLeftTurnPiece : public NetherBridgePiece + /** + * + * + */ + class CastleSmallCorridorLeftTurnPiece : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new CastleSmallCorridorLeftTurnPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_CastleSmallCorridorLeftTurnPiece; } + private: static const int width = 5; static const int height = 7; static const int depth = 5; + bool isNeedingChest; public: + CastleSmallCorridorLeftTurnPiece(); CastleSmallCorridorLeftTurnPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static CastleSmallCorridorLeftTurnPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - - /** - * - * - */ - class CastleCorridorStairsPiece : public NetherBridgePiece + + protected: + virtual void readAdditonalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); + + public: + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static CastleSmallCorridorLeftTurnPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ + class CastleCorridorStairsPiece : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new CastleCorridorStairsPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_CastleCorridorStairsPiece; } + private: static const int width = 5; static const int height = 14; static const int depth = 10; public: + CastleCorridorStairsPiece(); CastleCorridorStairsPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static CastleCorridorStairsPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static CastleCorridorStairsPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; - /** - * - * - */ - class CastleCorridorTBalconyPiece : public NetherBridgePiece + /** + * + * + */ + class CastleCorridorTBalconyPiece : public NetherBridgePiece { + public: + static StructurePiece *Create() { return new CastleCorridorTBalconyPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_CastleCorridorTBalconyPiece; } + private: - static const int width = 9; - static const int height = 7; - static const int depth = 9; + static const int width = 9; + static const int height = 7; + static const int depth = 9; public: + CastleCorridorTBalconyPiece(); CastleCorridorTBalconyPiece(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static CastleCorridorTBalconyPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static CastleCorridorTBalconyPiece *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; }; diff --git a/Minecraft.World/NetherWartTile.cpp b/Minecraft.World/NetherWartTile.cpp new file mode 100644 index 00000000..1faa57ca --- /dev/null +++ b/Minecraft.World/NetherWartTile.cpp @@ -0,0 +1,112 @@ +#include "stdafx.h" +#include "NetherWartTile.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.biome.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.h" + +NetherWartTile::NetherWartTile(int id) : Bush(id) +{ + setTicking(true); + updateDefaultShape(); +} + +// 4J Added override +void NetherWartTile::updateDefaultShape() +{ + float ss = 0.5f; + setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, 0.25f, 0.5f + ss); +} + +bool NetherWartTile::mayPlaceOn(int tile) +{ + return tile == Tile::soulsand_Id; +} + +// Brought forward to fix #60073 - TU7: Content: Gameplay: Nether Warts cannot be placed next to each other in the Nether +bool NetherWartTile::canSurvive(Level *level, int x, int y, int z) +{ + return mayPlaceOn(level->getTile(x, y - 1, z)); +} + +void NetherWartTile::tick(Level *level, int x, int y, int z, Random *random) +{ + int age = level->getData(x, y, z); + if (age < MAX_AGE) + { + if (random->nextInt(10) == 0) + { + age++; + level->setData(x, y, z, age, Tile::UPDATE_CLIENTS); + } + } + + Bush::tick(level, x, y, z, random); +} + +void NetherWartTile::growCropsToMax(Level *level, int x, int y, int z) +{ + level->setData(x, y, z, MAX_AGE, Tile::UPDATE_CLIENTS); +} + +Icon *NetherWartTile::getTexture(int face, int data) +{ + if (data >= MAX_AGE) + { + return icons[2]; + } + if (data > 0) + { + return icons[1]; + } + return icons[0]; +} + +int NetherWartTile::getRenderShape() +{ + return Tile::SHAPE_ROWS; +} + +void NetherWartTile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus) +{ + if (level->isClientSide) + { + return; + } + int count = 1; + if (data >= MAX_AGE) + { + count = 2 + level->random->nextInt(3); + if (playerBonus > 0) + { + count += level->random->nextInt(playerBonus + 1); + } + } + for (int i = 0; i < count; i++) + { + popResource(level, x, y, z, shared_ptr(new ItemInstance(Item::netherwart_seeds))); + } +} + +int NetherWartTile::getResource(int data, Random *random, int playerBonusLevel) +{ + return 0; +} + +int NetherWartTile::getResourceCount(Random *random) +{ + return 0; +} + +int NetherWartTile::cloneTileId(Level *level, int x, int y, int z) +{ + return Item::netherwart_seeds_Id; +} + +void NetherWartTile::registerIcons(IconRegister *iconRegister) +{ + for (int i = 0; i < NETHER_STALK_TEXTURE_COUNT; i++) + { + icons[i] = iconRegister->registerIcon(getIconName() + L"_stage_" + _toString(i) ); + } +} diff --git a/Minecraft.World/NetherWartTile.h b/Minecraft.World/NetherWartTile.h new file mode 100644 index 00000000..3e5088b2 --- /dev/null +++ b/Minecraft.World/NetherWartTile.h @@ -0,0 +1,31 @@ +#pragma once +#include "Bush.h" + +class ChunkRebuildData; +class NetherWartTile : public Bush +{ + friend class ChunkRebuildData; +private: + static const int MAX_AGE = 3; + + static const int NETHER_STALK_TEXTURE_COUNT = 3; + Icon *icons[NETHER_STALK_TEXTURE_COUNT]; + +public: + NetherWartTile(int id); + virtual void updateDefaultShape(); // 4J Added override + virtual bool mayPlaceOn(int tile); + + // Brought forward to fix #60073 - TU7: Content: Gameplay: Nether Warts cannot be placed next to each other in the Nether + virtual bool canSurvive(Level *level, int x, int y, int z); + + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void growCropsToMax(Level *level, int x, int y, int z); + virtual Icon *getTexture(int face, int data); + virtual int getRenderShape(); + virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int getResourceCount(Random *random); + virtual int cloneTileId(Level *level, int x, int y, int z); + void registerIcons(IconRegister *iconRegister); +}; diff --git a/Minecraft.World/NetherrackTile.cpp b/Minecraft.World/NetherrackTile.cpp new file mode 100644 index 00000000..8f99fb53 --- /dev/null +++ b/Minecraft.World/NetherrackTile.cpp @@ -0,0 +1,6 @@ +#include "stdafx.h" +#include "NetherrackTile.h" + +NetherrackTile::NetherrackTile(int id) : Tile(id, Material::stone) +{ +} \ No newline at end of file diff --git a/Minecraft.World/NetherrackTile.h b/Minecraft.World/NetherrackTile.h new file mode 100644 index 00000000..d137a229 --- /dev/null +++ b/Minecraft.World/NetherrackTile.h @@ -0,0 +1,8 @@ +#pragma once +#include "Tile.h" + +class NetherrackTile : public Tile +{ +public: + NetherrackTile(int id); +}; \ No newline at end of file diff --git a/Minecraft.World/NonTameRandomTargetGoal.cpp b/Minecraft.World/NonTameRandomTargetGoal.cpp index 734d637f..5fb6c79d 100644 --- a/Minecraft.World/NonTameRandomTargetGoal.cpp +++ b/Minecraft.World/NonTameRandomTargetGoal.cpp @@ -2,13 +2,12 @@ #include "net.minecraft.world.entity.animal.h" #include "NonTameRandomTargetGoal.h" -NonTameRandomTargetGoal::NonTameRandomTargetGoal(TamableAnimal *mob, const type_info& targetType, float within, int randomInterval, bool mustSee) : NearestAttackableTargetGoal(mob, targetType, within, randomInterval, mustSee) +NonTameRandomTargetGoal::NonTameRandomTargetGoal(TamableAnimal *mob, const type_info& targetType, int randomInterval, bool mustSee) : NearestAttackableTargetGoal(mob, targetType, randomInterval, mustSee) { - this->tamableMob = mob; + tamableMob = mob; } bool NonTameRandomTargetGoal::canUse() { - if (tamableMob->isTame()) return false; - return NearestAttackableTargetGoal::canUse(); + return !tamableMob->isTame() && NearestAttackableTargetGoal::canUse(); } diff --git a/Minecraft.World/NonTameRandomTargetGoal.h b/Minecraft.World/NonTameRandomTargetGoal.h index 8adba7df..f30244a1 100644 --- a/Minecraft.World/NonTameRandomTargetGoal.h +++ b/Minecraft.World/NonTameRandomTargetGoal.h @@ -10,7 +10,7 @@ private: TamableAnimal *tamableMob; // Owner of this goal public: - NonTameRandomTargetGoal(TamableAnimal *mob, const type_info& targetType, float within, int randomInterval, bool mustSee); + NonTameRandomTargetGoal(TamableAnimal *mob, const type_info& targetType, int randomInterval, bool mustSee); bool canUse(); }; \ No newline at end of file diff --git a/Minecraft.World/NotGateTile.cpp b/Minecraft.World/NotGateTile.cpp index a3971284..464e0ca5 100644 --- a/Minecraft.World/NotGateTile.cpp +++ b/Minecraft.World/NotGateTile.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" #include "NotGateTile.h" #include "SoundTypes.h" #include "net.minecraft.world.h" @@ -24,201 +25,209 @@ bool NotGateTile::isToggledTooFrequently(Level *level, int x, int y, int z, bool { recentToggles[level] = new deque; } - if (add) recentToggles[level]->push_back(Toggle(x, y, z, level->getTime())); - int count = 0; + if (add) recentToggles[level]->push_back(Toggle(x, y, z, level->getGameTime())); + int count = 0; AUTO_VAR(itEnd, recentToggles[level]->end()); for (AUTO_VAR(it, recentToggles[level]->begin()); it != itEnd; it++) { - if (it->x == x && it->y == y && it->z == z) + if (it->x == x && it->y == y && it->z == z) { - count++; - if (count >= MAX_RECENT_TOGGLES) + count++; + if (count >= MAX_RECENT_TOGGLES) { - return true; - } - } - } - return false; + return true; + } + } + } + return false; } NotGateTile::NotGateTile(int id, bool on) : TorchTile(id) { - this->on = on; - this->setTicking(true); + this->on = on; + this->setTicking(true); } -int NotGateTile::getTickDelay() +int NotGateTile::getTickDelay(Level *level) { return 2; } void NotGateTile::onPlace(Level *level, int x, int y, int z) { - if (level->getData(x, y, z) == 0) TorchTile::onPlace(level, x, y, z); - if (on) + if (level->getData(x, y, z) == 0) TorchTile::onPlace(level, x, y, z); + if (on) { - level->updateNeighborsAt(x, y - 1, z, id); - level->updateNeighborsAt(x, y + 1, z, id); - level->updateNeighborsAt(x - 1, y, z, id); - level->updateNeighborsAt(x + 1, y, z, id); - level->updateNeighborsAt(x, y, z - 1, id); - level->updateNeighborsAt(x, y, z + 1, id); - } + level->updateNeighborsAt(x, y - 1, z, id); + level->updateNeighborsAt(x, y + 1, z, id); + level->updateNeighborsAt(x - 1, y, z, id); + level->updateNeighborsAt(x + 1, y, z, id); + level->updateNeighborsAt(x, y, z - 1, id); + level->updateNeighborsAt(x, y, z + 1, id); + } } void NotGateTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - if (on) + if (on) { - level->updateNeighborsAt(x, y - 1, z, this->id); - level->updateNeighborsAt(x, y + 1, z, this->id); - level->updateNeighborsAt(x - 1, y, z, this->id); - level->updateNeighborsAt(x + 1, y, z, this->id); - level->updateNeighborsAt(x, y, z - 1, this->id); - level->updateNeighborsAt(x, y, z + 1, this->id); - } + level->updateNeighborsAt(x, y - 1, z, this->id); + level->updateNeighborsAt(x, y + 1, z, this->id); + level->updateNeighborsAt(x - 1, y, z, this->id); + level->updateNeighborsAt(x + 1, y, z, this->id); + level->updateNeighborsAt(x, y, z - 1, this->id); + level->updateNeighborsAt(x, y, z + 1, this->id); + } } -bool NotGateTile::getSignal(LevelSource *level, int x, int y, int z, int face) +int NotGateTile::getSignal(LevelSource *level, int x, int y, int z, int face) { - if (!on) return false; + if (!on) return Redstone::SIGNAL_NONE; - int dir = level->getData(x, y, z); + int dir = level->getData(x, y, z); - if (dir == 5 && face == 1) return false; - if (dir == 3 && face == 3) return false; - if (dir == 4 && face == 2) return false; - if (dir == 1 && face == 5) return false; - if (dir == 2 && face == 4) return false; + if (dir == 5 && face == 1) return Redstone::SIGNAL_NONE; + if (dir == 3 && face == 3) return Redstone::SIGNAL_NONE; + if (dir == 4 && face == 2) return Redstone::SIGNAL_NONE; + if (dir == 1 && face == 5) return Redstone::SIGNAL_NONE; + if (dir == 2 && face == 4) return Redstone::SIGNAL_NONE; - return true; + return Redstone::SIGNAL_MAX; } bool NotGateTile::hasNeighborSignal(Level *level, int x, int y, int z) { - int dir = level->getData(x, y, z); + int dir = level->getData(x, y, z); - if (dir == 5 && level->getSignal(x, y - 1, z, 0)) return true; - if (dir == 3 && level->getSignal(x, y, z - 1, 2)) return true; - if (dir == 4 && level->getSignal(x, y, z + 1, 3)) return true; - if (dir == 1 && level->getSignal(x - 1, y, z, 4)) return true; - if (dir == 2 && level->getSignal(x + 1, y, z, 5)) return true; - return false; + if (dir == 5 && level->hasSignal(x, y - 1, z, 0)) return true; + if (dir == 3 && level->hasSignal(x, y, z - 1, 2)) return true; + if (dir == 4 && level->hasSignal(x, y, z + 1, 3)) return true; + if (dir == 1 && level->hasSignal(x - 1, y, z, 4)) return true; + if (dir == 2 && level->hasSignal(x + 1, y, z, 5)) return true; + return false; } void NotGateTile::tick(Level *level, int x, int y, int z, Random *random) { - bool neighborSignal = hasNeighborSignal(level, x, y, z); + bool neighborSignal = hasNeighborSignal(level, x, y, z); // 4J - brought forward changes from 1.3.2 to associate toggles with level if( recentToggles.find(level) != recentToggles.end() ) { deque *toggles = recentToggles[level]; - while (!toggles->empty() && level->getTime() - toggles->front().when > RECENT_TOGGLE_TIMER) + while (!toggles->empty() && level->getGameTime() - toggles->front().when > RECENT_TOGGLE_TIMER) { toggles->pop_front(); } } - if (on) + if (on) { - if (neighborSignal) + if (neighborSignal) { - level->setTileAndData(x, y, z, Tile::notGate_off_Id, level->getData(x, y, z)); + level->setTileAndData(x, y, z, Tile::redstoneTorch_off_Id, level->getData(x, y, z), Tile::UPDATE_ALL); - if (isToggledTooFrequently(level, x, y, z, true)) + if (isToggledTooFrequently(level, x, y, z, true)) { app.DebugPrintf("Torch at (%d,%d,%d) has toggled too many times\n",x,y,z); - level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); - for (int i = 0; i < 5; i++) + level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); + for (int i = 0; i < 5; i++) { - double xx = x + random->nextDouble() * 0.6 + 0.2; - double yy = y + random->nextDouble() * 0.6 + 0.2; - double zz = z + random->nextDouble() * 0.6 + 0.2; - - level->addParticle(eParticleType_smoke, xx, yy, zz, 0, 0, 0); - } - } - } - } + double xx = x + random->nextDouble() * 0.6 + 0.2; + double yy = y + random->nextDouble() * 0.6 + 0.2; + double zz = z + random->nextDouble() * 0.6 + 0.2; + + level->addParticle(eParticleType_smoke, xx, yy, zz, 0, 0, 0); + } + } + } + } else { - if (!neighborSignal) + if (!neighborSignal) { - if (!isToggledTooFrequently(level, x, y, z, false)) + if (!isToggledTooFrequently(level, x, y, z, false)) { - level->setTileAndData(x, y, z, Tile::notGate_on_Id, level->getData(x, y, z)); - } + level->setTileAndData(x, y, z, Tile::redstoneTorch_on_Id, level->getData(x, y, z), Tile::UPDATE_ALL); + } else { app.DebugPrintf("Torch at (%d,%d,%d) has toggled too many times\n",x,y,z); } - } - } + } + } } void NotGateTile::neighborChanged(Level *level, int x, int y, int z, int type) { - TorchTile::neighborChanged(level, x, y, z, type); - level->addToTickNextTick(x, y, z, id, getTickDelay()); + if (checkDoPop(level, x, y, z, type)) + { + return; + } + + bool neighborSignal = hasNeighborSignal(level, x, y, z); + if ((on && neighborSignal) || (!on && !neighborSignal)) + { + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); + } } -bool NotGateTile::getDirectSignal(Level *level, int x, int y, int z, int face) +int NotGateTile::getDirectSignal(LevelSource *level, int x, int y, int z, int face) { - if (face == 0) + if (face == 0) { - return getSignal(level, x, y, z, face); - } - return false; + return getSignal(level, x, y, z, face); + } + return Redstone::SIGNAL_NONE; } int NotGateTile::getResource(int data, Random *random, int playerBonusLevel) { - return Tile::notGate_on_Id; + return Tile::redstoneTorch_on_Id; } bool NotGateTile::isSignalSource() { - return true; + return true; } void NotGateTile::animateTick(Level *level, int xt, int yt, int zt, Random *random) { - if (!on) return; - int dir = level->getData(xt, yt, zt); - double x = xt + 0.5f + (random->nextFloat() - 0.5f) * 0.2; - double y = yt + 0.7f + (random->nextFloat() - 0.5f) * 0.2; - double z = zt + 0.5f + (random->nextFloat() - 0.5f) * 0.2; - double h = 0.22f; - double r = 0.27f; - if (dir == 1) - { - level->addParticle(eParticleType_reddust, x - r, y + h, z, 0, 0, 0); - } + if (!on) return; + int dir = level->getData(xt, yt, zt); + double x = xt + 0.5f + (random->nextFloat() - 0.5f) * 0.2; + double y = yt + 0.7f + (random->nextFloat() - 0.5f) * 0.2; + double z = zt + 0.5f + (random->nextFloat() - 0.5f) * 0.2; + double h = 0.22f; + double r = 0.27f; + if (dir == 1) + { + level->addParticle(eParticleType_reddust, x - r, y + h, z, 0, 0, 0); + } else if(dir == 2) { - level->addParticle(eParticleType_reddust, x + r, y + h, z, 0, 0, 0); - } + level->addParticle(eParticleType_reddust, x + r, y + h, z, 0, 0, 0); + } else if (dir == 3) { - level->addParticle(eParticleType_reddust, x, y + h, z - r, 0, 0, 0); - } + level->addParticle(eParticleType_reddust, x, y + h, z - r, 0, 0, 0); + } else if (dir == 4) { - level->addParticle(eParticleType_reddust, x, y + h, z + r, 0, 0, 0); - } + level->addParticle(eParticleType_reddust, x, y + h, z + r, 0, 0, 0); + } else { - level->addParticle(eParticleType_reddust, x, y, z, 0, 0, 0); - } + level->addParticle(eParticleType_reddust, x, y, z, 0, 0, 0); + } } int NotGateTile::cloneTileId(Level *level, int x, int y, int z) { - return Tile::notGate_on_Id; + return Tile::redstoneTorch_on_Id; } void NotGateTile::levelTimeChanged(Level *level, __int64 delta, __int64 newTime) @@ -234,14 +243,7 @@ void NotGateTile::levelTimeChanged(Level *level, __int64 delta, __int64 newTime) } } -void NotGateTile::registerIcons(IconRegister *iconRegister) +bool NotGateTile::isMatching(int id) { - if (on) - { - icon = iconRegister->registerIcon(L"redtorch_lit"); - } - else - { - icon = iconRegister->registerIcon(L"redtorch"); - } + return id == Tile::redstoneTorch_off_Id || id == Tile::redstoneTorch_on_Id; } \ No newline at end of file diff --git a/Minecraft.World/NotGateTile.h b/Minecraft.World/NotGateTile.h index 52dd4a2e..b1f3431d 100644 --- a/Minecraft.World/NotGateTile.h +++ b/Minecraft.World/NotGateTile.h @@ -10,58 +10,57 @@ class NotGateTile : public TorchTile private: static const int RECENT_TOGGLE_TIMER = 20 * 3; - static const int MAX_RECENT_TOGGLES = 8; + static const int MAX_RECENT_TOGGLES = 8; - bool on; + bool on; public: - class Toggle + class Toggle { public: - int x, y, z; - __int64 when; + int x, y, z; + __int64 when; - Toggle(int x, int y, int z, __int64 when) + Toggle(int x, int y, int z, __int64 when) { - this->x = x; - this->y = y; - this->z = z; - this->when = when; - } - }; + this->x = x; + this->y = y; + this->z = z; + this->when = when; + } + }; private: static unordered_map *> recentToggles; // 4J - brought forward change from 1.3.2 public: static void removeLevelReferences(Level *level); // 4J added private: - bool isToggledTooFrequently(Level *level, int x, int y, int z, bool add); + bool isToggledTooFrequently(Level *level, int x, int y, int z, bool add); protected: NotGateTile(int id, bool on); public: - int getTickDelay(); + int getTickDelay(Level *level); void onPlace(Level *level, int x, int y, int z); void onRemove(Level *level, int x, int y, int z, int id, int data); - bool getSignal(LevelSource *level, int x, int y, int z, int face); + int getSignal(LevelSource *level, int x, int y, int z, int face); private: bool hasNeighborSignal(Level *level, int x, int y, int z); public: - void tick(Level *level, int x, int y, int z, Random *random); - void neighborChanged(Level *level, int x, int y, int z, int type); + void tick(Level *level, int x, int y, int z, Random *random); + void neighborChanged(Level *level, int x, int y, int z, int type); - bool getDirectSignal(Level *level, int x, int y, int z, int face); + int getDirectSignal(LevelSource *level, int x, int y, int z, int face); - int getResource(int data, Random *random, int playerBonusLevel); - bool isSignalSource(); + int getResource(int data, Random *random, int playerBonusLevel); + bool isSignalSource(); public: void animateTick(Level *level, int xt, int yt, int zt, Random *random); int cloneTileId(Level *level, int x, int y, int z); - void levelTimeChanged(Level *level, __int64 delta, __int64 newTime); - - void registerIcons(IconRegister *iconRegister); + void levelTimeChanged(Level *level, __int64 delta, __int64 newTime); + bool isMatching(int id); }; \ No newline at end of file diff --git a/Minecraft.World/NoteBlockTile.cpp b/Minecraft.World/NoteBlockTile.cpp new file mode 100644 index 00000000..25ea587a --- /dev/null +++ b/Minecraft.World/NoteBlockTile.cpp @@ -0,0 +1,86 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "NoteBlockTile.h" +#include "SoundTypes.h" + +NoteBlockTile::NoteBlockTile(int id) : BaseEntityTile(id, Material::wood) +{ +} + +void NoteBlockTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + app.DebugPrintf("-------- Neighbour changed type %d\n", type); + bool signal = level->hasNeighborSignal(x, y, z); + shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + app.DebugPrintf("-------- Signal is %s, tile is currently %s\n",signal?"TRUE":"FALSE", mte->on?"ON":"OFF"); + if (mte != NULL && mte->on != signal) + { + if (signal) + { + mte->playNote(level, x, y, z); + } + mte->on = signal; + } +} + +// 4J-PB - Adding a TestUse for tooltip display +bool NoteBlockTile::TestUse() +{ + return true; +} + +bool NoteBlockTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +{ + if (soundOnly) return false; + if (level->isClientSide) return true; + shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + if (mte != NULL ) + { + mte->tune(); + mte->playNote(level, x, y, z); + } + return true; +} + +void NoteBlockTile::attack(Level *level, int x, int y, int z, shared_ptr player) +{ + if (level->isClientSide) return; + shared_ptr mte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + if( mte != NULL ) mte->playNote(level, x, y, z); +} + +shared_ptr NoteBlockTile::newTileEntity(Level *level) +{ + return shared_ptr( new MusicTileEntity() ); +} + +bool NoteBlockTile::triggerEvent(Level *level, int x, int y, int z, int i, int note) +{ + float pitch = (float) pow(2, (note - 12) / 12.0); + + int iSound; + switch(i) + { + case 1: + iSound=eSoundType_NOTE_BD; + break; + case 2: + iSound=eSoundType_NOTE_SNARE; + break; + case 3: + iSound=eSoundType_NOTE_HAT; + break; + case 4: + iSound=eSoundType_NOTE_BASSATTACK; + break; + default: + iSound=eSoundType_NOTE_HARP; + break; + } + app.DebugPrintf("NoteBlockTile::triggerEvent - playSound - pitch = %f\n",pitch); + level->playSound(x + 0.5, y + 0.5, z + 0.5, iSound, 3, pitch); + level->addParticle(eParticleType_note, x + 0.5, y + 1.2, z + 0.5, note / 24.0, 0, 0); + + return true; +} diff --git a/Minecraft.World/NoteBlockTile.h b/Minecraft.World/NoteBlockTile.h new file mode 100644 index 00000000..e072b5e6 --- /dev/null +++ b/Minecraft.World/NoteBlockTile.h @@ -0,0 +1,16 @@ +#pragma once +#include "BaseEntityTile.h" + +class Player; + +class NoteBlockTile : public BaseEntityTile +{ +public: + NoteBlockTile(int id); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual bool TestUse(); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual shared_ptr newTileEntity(Level *level); + virtual bool triggerEvent(Level *level, int x, int y, int z, int i, int note); +}; \ No newline at end of file diff --git a/Minecraft.World/Objective.cpp b/Minecraft.World/Objective.cpp new file mode 100644 index 00000000..243713d4 --- /dev/null +++ b/Minecraft.World/Objective.cpp @@ -0,0 +1,38 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "Objective.h" + +Objective::Objective(Scoreboard *scoreboard, const wstring &name, ObjectiveCriteria *criteria) +{ + this->scoreboard = scoreboard; + this->name = name; + this->criteria = criteria; + + displayName = name; +} + +Scoreboard *Objective::getScoreboard() +{ + return scoreboard; +} + +wstring Objective::getName() +{ + return name; +} + +ObjectiveCriteria *Objective::getCriteria() +{ + return criteria; +} + +wstring Objective::getDisplayName() +{ + return displayName; +} + +void Objective::setDisplayName(const wstring &name) +{ + displayName = name; + scoreboard->onObjectiveChanged(this); +} \ No newline at end of file diff --git a/Minecraft.World/Objective.h b/Minecraft.World/Objective.h new file mode 100644 index 00000000..eebec31a --- /dev/null +++ b/Minecraft.World/Objective.h @@ -0,0 +1,26 @@ +#pragma once + +class Scoreboard; +class ObjectiveCriteria; + +class Objective +{ +public: + static const int MAX_NAME_LENGTH = 16; + static const int MAX_DISPLAY_NAME_LENGTH = 32; + +private: + Scoreboard *scoreboard; + wstring name; + ObjectiveCriteria *criteria; + wstring displayName; + +public: + Objective(Scoreboard *scoreboard, const wstring &name, ObjectiveCriteria *criteria); + + Scoreboard *getScoreboard(); + wstring getName(); + ObjectiveCriteria *getCriteria(); + wstring getDisplayName(); + void setDisplayName(const wstring &name); +}; \ No newline at end of file diff --git a/Minecraft.World/ObjectiveCriteria.cpp b/Minecraft.World/ObjectiveCriteria.cpp new file mode 100644 index 00000000..3f87890d --- /dev/null +++ b/Minecraft.World/ObjectiveCriteria.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.criteria.h" +#include "ObjectiveCriteria.h" + + +unordered_map ObjectiveCriteria::CRITERIA_BY_NAME; + +ObjectiveCriteria *ObjectiveCriteria::DUMMY = new DummyCriteria(L"dummy"); +ObjectiveCriteria *ObjectiveCriteria::DEATH_COUNT = new DummyCriteria(L"deathCount"); +ObjectiveCriteria *ObjectiveCriteria::KILL_COUNT_PLAYERS = new DummyCriteria(L"playerKillCount"); +ObjectiveCriteria *ObjectiveCriteria::KILL_COUNT_ALL = new DummyCriteria(L"totalKillCount"); +ObjectiveCriteria *ObjectiveCriteria::HEALTH = new HealthCriteria(L"health"); \ No newline at end of file diff --git a/Minecraft.World/ObjectiveCriteria.h b/Minecraft.World/ObjectiveCriteria.h new file mode 100644 index 00000000..833665e0 --- /dev/null +++ b/Minecraft.World/ObjectiveCriteria.h @@ -0,0 +1,17 @@ +#pragma once + +class ObjectiveCriteria +{ +public: + static unordered_map CRITERIA_BY_NAME; + + static ObjectiveCriteria *DUMMY; + static ObjectiveCriteria *DEATH_COUNT; + static ObjectiveCriteria *KILL_COUNT_PLAYERS; + static ObjectiveCriteria *KILL_COUNT_ALL; + static ObjectiveCriteria *HEALTH; + + virtual wstring getName() = 0; + virtual int getScoreModifier(vector > *players) = 0; + virtual bool isReadOnly() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/Ocelot.cpp b/Minecraft.World/Ocelot.cpp new file mode 100644 index 00000000..50285682 --- /dev/null +++ b/Minecraft.World/Ocelot.cpp @@ -0,0 +1,361 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.ai.goal.target.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.phys.h" +#include "SynchedEntityData.h" +#include "StringHelpers.h" +#include "..\Minecraft.Client\Textures.h" +#include "..\Minecraft.Client\Minecraft.h" +#include "..\Minecraft.Client\MultiPlayerLocalPlayer.h" +#include "GenericStats.h" +#include "Ocelot.h" + +const double Ocelot::SNEAK_SPEED_MOD = 0.6; +const double Ocelot::WALK_SPEED_MOD = 0.8; +const double Ocelot::FOLLOW_SPEED_MOD = 1.0; +const double Ocelot::SPRINT_SPEED_MOD = 1.33; + +const int Ocelot::DATA_TYPE_ID = 18; + +Ocelot::Ocelot(Level *level) : TamableAnimal(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); + + setSize(0.6f, 0.8f); + + getNavigation()->setAvoidWater(true); + goalSelector.addGoal(1, new FloatGoal(this)); + goalSelector.addGoal(2, sitGoal, false); + goalSelector.addGoal(3, temptGoal = new TemptGoal(this, SNEAK_SPEED_MOD, Item::fish_raw_Id, true), false); + goalSelector.addGoal(4, new AvoidPlayerGoal(this, typeid(Player), 16, WALK_SPEED_MOD, SPRINT_SPEED_MOD)); + goalSelector.addGoal(5, new FollowOwnerGoal(this, FOLLOW_SPEED_MOD, 10, 5)); + goalSelector.addGoal(6, new OcelotSitOnTileGoal(this, SPRINT_SPEED_MOD)); + goalSelector.addGoal(7, new LeapAtTargetGoal(this, 0.3f)); + goalSelector.addGoal(8, new OcelotAttackGoal(this)); + goalSelector.addGoal(9, new BreedGoal(this, WALK_SPEED_MOD)); + goalSelector.addGoal(10, new RandomStrollGoal(this, WALK_SPEED_MOD)); + goalSelector.addGoal(11, new LookAtPlayerGoal(this, typeid(Player), 10)); + + targetSelector.addGoal(1, new NonTameRandomTargetGoal(this, typeid(Chicken), 750, false)); +} + +void Ocelot::defineSynchedData() +{ + TamableAnimal::defineSynchedData(); + + entityData->define(DATA_TYPE_ID, (byte) 0); +} + +void Ocelot::serverAiMobStep() +{ + if (getMoveControl()->hasWanted()) + { + double speed = getMoveControl()->getSpeedModifier(); + if (speed == SNEAK_SPEED_MOD) + { + setSneaking(true); + setSprinting(false); + } + else if (speed == SPRINT_SPEED_MOD) + { + setSneaking(false); + setSprinting(true); + } + else + { + setSneaking(false); + setSprinting(false); + } + } + else + { + setSneaking(false); + setSprinting(false); + } +} + +bool Ocelot::removeWhenFarAway() +{ + return Animal::removeWhenFarAway() && !isTame() && tickCount > SharedConstants::TICKS_PER_SECOND * 60 * 2; +} + +bool Ocelot::useNewAi() +{ + return true; +} + +void Ocelot::registerAttributes() +{ + TamableAnimal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(10); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.3f); +} + +void Ocelot::causeFallDamage(float distance) +{ + // do nothing +} + +void Ocelot::addAdditonalSaveData(CompoundTag *tag) +{ + TamableAnimal::addAdditonalSaveData(tag); + tag->putInt(L"CatType", getCatType()); +} + +void Ocelot::readAdditionalSaveData(CompoundTag *tag) +{ + TamableAnimal::readAdditionalSaveData(tag); + if(isTame()) + { + setCatType(tag->getInt(L"CatType")); + } + else + { + setCatType(TYPE_OCELOT); + } +} + +int Ocelot::getAmbientSound() +{ + if (isTame()) + { + if (isInLove()) + { + return eSoundType_MOB_CAT_PURR; + } + if (random->nextInt(4) == 0) + { + return eSoundType_MOB_CAT_PURREOW; + } + return eSoundType_MOB_CAT_MEOW; + } + + return -1; +} + +int Ocelot::getHurtSound() +{ + return eSoundType_MOB_CAT_HIT; +} + +int Ocelot::getDeathSound() +{ + return eSoundType_MOB_CAT_HIT; +} + +float Ocelot::getSoundVolume() +{ + return 0.4f; +} + +int Ocelot::getDeathLoot() +{ + return Item::leather_Id; +} + +bool Ocelot::doHurtTarget(shared_ptr target) +{ + return target->hurt(DamageSource::mobAttack(dynamic_pointer_cast(shared_from_this())), 3); +} + +bool Ocelot::hurt(DamageSource *source, float dmg) +{ + if (isInvulnerable()) return false; + sitGoal->wantToSit(false); + return TamableAnimal::hurt(source, dmg); +} + +void Ocelot::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) +{ +} + +bool Ocelot::mobInteract(shared_ptr player) +{ + shared_ptr item = player->inventory->getSelected(); + if (isTame()) + { + if (equalsIgnoreCase(player->getUUID(), getOwnerUUID())) + { + if (!level->isClientSide && !isFood(item)) + { + sitGoal->wantToSit(!isSitting()); + } + } + } + else + { + if (temptGoal->isRunning() && item != NULL && item->id == Item::fish_raw_Id && player->distanceToSqr(shared_from_this()) < 3 * 3) + { + // 4J-PB - don't lose the fish in creative mode + if (!player->abilities.instabuild) item->count--; + if (item->count <= 0) + { + player->inventory->setItem(player->inventory->selected, nullptr); + } + + if (!level->isClientSide) + { + if (random->nextInt(3) == 0) + { + setTame(true); + + // 4J-JEV, hook for durango event. + player->awardStat(GenericStats::tamedEntity(eTYPE_OCELOT),GenericStats::param_tamedEntity(eTYPE_OCELOT)); + + setCatType(1 + level->random->nextInt(3)); + setOwnerUUID(player->getUUID()); + spawnTamingParticles(true); + sitGoal->wantToSit(true); + level->broadcastEntityEvent(shared_from_this(), EntityEvent::TAMING_SUCCEEDED); + } + else + { + spawnTamingParticles(false); + level->broadcastEntityEvent(shared_from_this(), EntityEvent::TAMING_FAILED); + } + } + return true; + } + } + return TamableAnimal::mobInteract(player); +} + +shared_ptr Ocelot::getBreedOffspring(shared_ptr target) +{ + // 4J - added limit to number of animals that can be bred + if( level->canCreateMore( GetType(), Level::eSpawnType_Breed) ) + { + shared_ptr offspring = shared_ptr( new Ocelot(level) ); + if (isTame()) + { + offspring->setOwnerUUID(getOwnerUUID()); + offspring->setTame(true); + offspring->setCatType(getCatType()); + } + return offspring; + } + else + { + return nullptr; + } +} + +bool Ocelot::isFood(shared_ptr itemInstance) +{ + return itemInstance != NULL && itemInstance->id == Item::fish_raw_Id; +} + +bool Ocelot::canMate(shared_ptr animal) +{ + if (animal == shared_from_this()) return false; + if (!isTame()) return false; + + shared_ptr partner = dynamic_pointer_cast(animal); + if (partner == NULL) return false; + if (!partner->isTame()) return false; + + return isInLove() && partner->isInLove(); +} + +int Ocelot::getCatType() +{ + return entityData->getByte(DATA_TYPE_ID); +} + +void Ocelot::setCatType(int type) +{ + entityData->set(DATA_TYPE_ID, (byte) type); +} + +bool Ocelot::canSpawn() +{ + // artificially make ozelots more rare + if (level->random->nextInt(3) == 0) + { + return false; + } + if (level->isUnobstructed(bb) && level->getCubes(shared_from_this(), bb)->empty() && !level->containsAnyLiquid(bb)) + { + int xt = Mth::floor(x); + int yt = Mth::floor(bb->y0); + int zt = Mth::floor(z); + if (yt < level->seaLevel) + { + return false; + } + + int tile = level->getTile(xt, yt - 1, zt); + if (tile == Tile::grass_Id || tile == Tile::leaves_Id) + { + return true; + } + } + return false; +} + +wstring Ocelot::getAName() +{ + if (hasCustomName()) return getCustomName(); +#ifdef _DEBUG + if (isTame()) + { + return L"entity.Cat.name"; + } + return TamableAnimal::getAName(); +#else + return L""; +#endif +} + +MobGroupData *Ocelot::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param +{ + groupData = TamableAnimal::finalizeMobSpawn(groupData); + +#ifndef _CONTENT_PACKAGE + if (app.DebugArtToolsOn() && (extraData != 0)) + { + setTame(true); + setCatType(extraData - 1); + setOwnerUUID(Minecraft::GetInstance()->localplayers[ProfileManager.GetPrimaryPad()]->getUUID()); + } + else +#endif + if (level->random->nextInt(7) == 0) + { + for (int kitten = 0; kitten < 2; kitten++) + { + shared_ptr ocelot = shared_ptr( new Ocelot(level) ); + ocelot->moveTo(x, y, z, yRot, 0); + ocelot->setAge(-20 * 60 * 20); + level->addEntity(ocelot); + } + } + return groupData; +} + +void Ocelot::setSittingOnTile(bool val) +{ + byte current = entityData->getByte(DATA_FLAGS_ID); + entityData->set(DATA_FLAGS_ID, val ? (byte) (current | 0x02) : (byte) (current & ~0x02) ); +} + +bool Ocelot::isSittingOnTile() +{ + byte current = entityData->getByte(DATA_FLAGS_ID); + return (current & 0x02) > 0; +} \ No newline at end of file diff --git a/Minecraft.World/Ocelot.h b/Minecraft.World/Ocelot.h new file mode 100644 index 00000000..7f02bf02 --- /dev/null +++ b/Minecraft.World/Ocelot.h @@ -0,0 +1,90 @@ +#pragma once + +#include "TamableAnimal.h" + +class TemptGoal; + +class Ocelot : public TamableAnimal +{ + friend class OcelotSitOnTileGoal; + +public: + eINSTANCEOF GetType() { return eTYPE_OCELOT; } + static Entity *create(Level *level) { return new Ocelot(level); } + +public: + static const double SNEAK_SPEED_MOD; + static const double WALK_SPEED_MOD; + static const double FOLLOW_SPEED_MOD; + static const double SPRINT_SPEED_MOD; + +private: + static const int DATA_TYPE_ID; + +public: + enum + { + TYPE_OCELOT, + TYPE_BLACK, + TYPE_RED, + TYPE_SIAMESE, + }; + +private: + TemptGoal *temptGoal; + +public: + Ocelot(Level *level); + +protected: + virtual void defineSynchedData(); + +public: + virtual void serverAiMobStep(); + +protected: + virtual bool removeWhenFarAway(); + +public: + virtual bool useNewAi(); + +protected: + virtual void registerAttributes(); + virtual void causeFallDamage(float distance); + +public: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditionalSaveData(CompoundTag *tag); + +protected: + virtual int getAmbientSound(); + virtual int getHurtSound(); + virtual int getDeathSound(); + virtual float getSoundVolume(); + virtual int getDeathLoot(); + +public: + virtual bool doHurtTarget(shared_ptr target); + virtual bool hurt(DamageSource *source, float dmg); + +protected: + virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); + +public: + virtual bool mobInteract(shared_ptr player); + virtual shared_ptr getBreedOffspring(shared_ptr target); + virtual bool isFood(shared_ptr itemInstance); + virtual bool canMate(shared_ptr animal); + virtual int getCatType(); + virtual void setCatType(int type); + virtual bool canSpawn(); + virtual wstring getAName(); + virtual MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param + + + // 4J-JEV: Added for tooltips, is cat annoying player by sitting on chest or furnace. +private: + void setSittingOnTile(bool val); +public: + bool isSittingOnTile(); +}; \ No newline at end of file diff --git a/Minecraft.World/OcelotAttackGoal.cpp b/Minecraft.World/OcelotAttackGoal.cpp new file mode 100644 index 00000000..d9e0f29b --- /dev/null +++ b/Minecraft.World/OcelotAttackGoal.cpp @@ -0,0 +1,61 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.phys.h" +#include "OcelotAttackGoal.h" + +OcelotAttackGoal::OcelotAttackGoal(Mob *mob) +{ + target = weak_ptr(); + attackTime = 0; + speed = 0; + trackTarget = false; + + this->mob = mob; + this->level = mob->level; + setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); +} + +bool OcelotAttackGoal::canUse() +{ + shared_ptr bestTarget = mob->getTarget(); + if (bestTarget == NULL) return false; + target = weak_ptr(bestTarget); + return true; +} + +bool OcelotAttackGoal::canContinueToUse() +{ + if (target.lock() == NULL || !target.lock()->isAlive()) return false; + if (mob->distanceToSqr(target.lock()) > 15 * 15) return false; + return !mob->getNavigation()->isDone() || canUse(); +} + +void OcelotAttackGoal::stop() +{ + target = weak_ptr(); + mob->getNavigation()->stop(); +} + +void OcelotAttackGoal::tick() +{ + mob->getLookControl()->setLookAt(target.lock(), 30, 30); + + double meleeRadiusSqr = (mob->bbWidth * 2) * (mob->bbWidth * 2); + double distSqr = mob->distanceToSqr(target.lock()->x, target.lock()->bb->y0, target.lock()->z); + + double speedModifier = Ocelot::WALK_SPEED_MOD; + if (distSqr > meleeRadiusSqr && distSqr < 4 * 4) speedModifier = Ocelot::SPRINT_SPEED_MOD; + else if (distSqr < 15 * 15) speedModifier = Ocelot::SNEAK_SPEED_MOD; + + mob->getNavigation()->moveTo(target.lock(), speedModifier); + + attackTime = max(attackTime - 1, 0); + + if (distSqr > meleeRadiusSqr) return; + if (attackTime > 0) return; + attackTime = 20; + mob->doHurtTarget(target.lock()); +} \ No newline at end of file diff --git a/Minecraft.World/OcelotAttackGoal.h b/Minecraft.World/OcelotAttackGoal.h new file mode 100644 index 00000000..8efabe32 --- /dev/null +++ b/Minecraft.World/OcelotAttackGoal.h @@ -0,0 +1,25 @@ +#pragma once + +#include "Goal.h" + +class OcelotAttackGoal : public Goal +{ +private: + Level *level; + Mob *mob; + weak_ptr target; + int attackTime; + float speed; + bool trackTarget; + +public: + OcelotAttackGoal(Mob *mob); + + virtual bool canUse(); + virtual bool canContinueToUse(); + virtual void stop(); + virtual void tick(); + + // 4J Added override to update ai elements when loading entity from schematics + virtual void setLevel(Level *level) { this->level = level; } +}; \ No newline at end of file diff --git a/Minecraft.World/OcelotSitOnTileGoal.cpp b/Minecraft.World/OcelotSitOnTileGoal.cpp index f5cf7066..a35537fb 100644 --- a/Minecraft.World/OcelotSitOnTileGoal.cpp +++ b/Minecraft.World/OcelotSitOnTileGoal.cpp @@ -15,7 +15,7 @@ const int OcelotSitOnTileGoal::SIT_TICKS = 60 * SharedConstants::TICKS_PER_SECON const int OcelotSitOnTileGoal::SEARCH_RANGE = 8; const double OcelotSitOnTileGoal::SIT_CHANCE = 0.0065f; -OcelotSitOnTileGoal::OcelotSitOnTileGoal(Ozelot *ocelot, float speed) +OcelotSitOnTileGoal::OcelotSitOnTileGoal(Ocelot *ocelot, double speedModifier) { _tick = 0; tryTicks = 0; @@ -25,7 +25,7 @@ OcelotSitOnTileGoal::OcelotSitOnTileGoal(Ozelot *ocelot, float speed) tileZ = 0; this->ocelot = ocelot; - this->speed = speed; + this->speedModifier = speedModifier; setRequiredControlFlags(Control::MoveControlFlag | Control::JumpControlFlag); } @@ -41,16 +41,20 @@ bool OcelotSitOnTileGoal::canContinueToUse() void OcelotSitOnTileGoal::start() { - ocelot->getNavigation()->moveTo((float) tileX + 0.5, tileY + 1, (float) tileZ + 0.5, speed); + ocelot->getNavigation()->moveTo((float) tileX + 0.5, tileY + 1, (float) tileZ + 0.5, speedModifier); _tick = 0; tryTicks = 0; maxTicks = ocelot->getRandom()->nextInt(ocelot->getRandom()->nextInt(SIT_TICKS) + SIT_TICKS) + SIT_TICKS; ocelot->getSitGoal()->wantToSit(false); + + ocelot->setSittingOnTile(true); // 4J-Added. } void OcelotSitOnTileGoal::stop() { ocelot->setSitting(false); + + ocelot->setSittingOnTile(false); // 4J-Added. } void OcelotSitOnTileGoal::tick() @@ -60,7 +64,7 @@ void OcelotSitOnTileGoal::tick() if (ocelot->distanceToSqr(tileX, tileY + 1, tileZ) > 1) { ocelot->setSitting(false); - ocelot->getNavigation()->moveTo((float) tileX + 0.5, tileY + 1, (float) tileZ + 0.5, speed); + ocelot->getNavigation()->moveTo((float) tileX + 0.5, tileY + 1, (float) tileZ + 0.5, speedModifier); tryTicks++; } else if (!ocelot->isSitting()) @@ -88,9 +92,9 @@ bool OcelotSitOnTileGoal::findNearestTile() if (dist < distSqr) { - this->tileX = x; - this->tileY = y; - this->tileZ = z; + tileX = x; + tileY = y; + tileZ = z; distSqr = dist; } } diff --git a/Minecraft.World/OcelotSitOnTileGoal.h b/Minecraft.World/OcelotSitOnTileGoal.h index 6a8d9ed5..2691915a 100644 --- a/Minecraft.World/OcelotSitOnTileGoal.h +++ b/Minecraft.World/OcelotSitOnTileGoal.h @@ -2,7 +2,7 @@ #include "Goal.h" -class Ozelot; +class Ocelot; class OcelotSitOnTileGoal : public Goal { @@ -13,8 +13,8 @@ private: static const double SIT_CHANCE; private: - Ozelot *ocelot; // Owner of this goal - float speed; + Ocelot *ocelot; // Owner of this goal + double speedModifier; int _tick; int tryTicks; int maxTicks; @@ -23,7 +23,7 @@ private: int tileZ; public: - OcelotSitOnTileGoal(Ozelot *ocelot, float speed); + OcelotSitOnTileGoal(Ocelot *ocelot, double speedModifier); bool canUse(); bool canContinueToUse(); diff --git a/Minecraft.World/OldChunkStorage.cpp b/Minecraft.World/OldChunkStorage.cpp index 50c29a96..31f4394f 100644 --- a/Minecraft.World/OldChunkStorage.cpp +++ b/Minecraft.World/OldChunkStorage.cpp @@ -239,7 +239,8 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, DataOutputStream *dos) dos->writeShort(SAVE_FILE_VERSION_NUMBER); dos->writeInt(lc->x); dos->writeInt(lc->z); - dos->writeLong(level->getTime()); + dos->writeLong(level->getGameTime()); + dos->writeLong(lc->inhabitedTime); PIXBeginNamedEvent(0,"Getting block data"); lc->writeCompressedBlockData(dos); @@ -283,7 +284,7 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, DataOutputStream *dos) vector *ticksInChunk = level->fetchTicksInChunk(lc, false); if (ticksInChunk != NULL) { - __int64 levelTime = level->getTime(); + __int64 levelTime = level->getGameTime(); ListTag *tickTags = new ListTag(); for( int i = 0; i < ticksInChunk->size(); i++ ) @@ -313,7 +314,8 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, CompoundTag *tag) level->checkSession(); tag->putInt(L"xPos", lc->x); tag->putInt(L"zPos", lc->z); - tag->putLong(L"LastUpdate", level->getTime()); + tag->putLong(L"LastUpdate", level->getGameTime()); + tag->putLong(L"InhabitedTime", lc->inhabitedTime); // 4J - changes here for new storage. Now have static storage for getting lighting data for block, data, and sky & block lighting. This // wasn't required in the original version as we could just reference the information in the level itself, but with our new storage system // the full data doesn't normally exist & so getSkyLightData/getBlockLightData etc. need somewhere to output this data. Making this static so @@ -372,7 +374,7 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, CompoundTag *tag) vector *ticksInChunk = level->fetchTicksInChunk(lc, false); if (ticksInChunk != NULL) { - __int64 levelTime = level->getTime(); + __int64 levelTime = level->getGameTime(); ListTag *tickTags = new ListTag(); for( int i = 0; i < ticksInChunk->size(); i++ ) @@ -384,6 +386,7 @@ void OldChunkStorage::save(LevelChunk *lc, Level *level, CompoundTag *tag) teTag->putInt(L"y", td.y); teTag->putInt(L"z", td.z); teTag->putInt(L"t", (int) (td.m_delay - levelTime)); + teTag->putInt(L"p", td.priorityTilt); tickTags->add(teTag); } @@ -428,6 +431,7 @@ void OldChunkStorage::loadEntities(LevelChunk *lc, Level *level, CompoundTag *ta LevelChunk *OldChunkStorage::load(Level *level, DataInputStream *dis) { + PIXBeginNamedEvent(0,"Loading chunk"); short version = dis->readShort(); int x = dis->readInt(); int z = dis->readInt(); @@ -435,6 +439,11 @@ LevelChunk *OldChunkStorage::load(Level *level, DataInputStream *dis) LevelChunk *levelChunk = new LevelChunk(level, x, z); + if (version >= SAVE_FILE_VERSION_CHUNK_INHABITED_TIME) + { + levelChunk->inhabitedTime = dis->readLong(); + } + levelChunk->readCompressedBlockData(dis); levelChunk->readCompressedDataData(dis); levelChunk->readCompressedSkyLightData(dis); @@ -451,7 +460,19 @@ LevelChunk *OldChunkStorage::load(Level *level, DataInputStream *dis) levelChunk->terrainPopulated |= LevelChunk::sTerrainPostPostProcessed; } - dis->readFully(levelChunk->biomes); +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<biomes.length); + dis->readFully(dummyBiomes); + delete [] dummyBiomes.data; + } + else +#endif + { + dis->readFully(levelChunk->biomes); + } CompoundTag *tag = NbtIo::read(dis); @@ -459,6 +480,7 @@ LevelChunk *OldChunkStorage::load(Level *level, DataInputStream *dis) if (tag->contains(L"TileTicks")) { + PIXBeginNamedEvent(0,"Loading TileTicks"); ListTag *tileTicks = (ListTag *) tag->getList(L"TileTicks"); if (tileTicks != NULL) @@ -467,13 +489,16 @@ LevelChunk *OldChunkStorage::load(Level *level, DataInputStream *dis) { CompoundTag *teTag = tileTicks->get(i); - level->forceAddTileTick(teTag->getInt(L"x"), teTag->getInt(L"y"), teTag->getInt(L"z"), teTag->getInt(L"i"), teTag->getInt(L"t")); + level->forceAddTileTick(teTag->getInt(L"x"), teTag->getInt(L"y"), teTag->getInt(L"z"), teTag->getInt(L"i"), teTag->getInt(L"t"), teTag->getInt(L"p")); } } + PIXEndNamedEvent(); } delete tag; + PIXEndNamedEvent(); + return levelChunk; } @@ -556,9 +581,18 @@ LevelChunk *OldChunkStorage::load(Level *level, CompoundTag *tag) } #endif - if (tag->contains(L"Biomes")) +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<setBiomes(tag->getByteArray(L"Biomes")); + if (tag->contains(L"Biomes")) + { + levelChunk->setBiomes(tag->getByteArray(L"Biomes")); + } } loadEntities(levelChunk, level, tag); @@ -573,7 +607,7 @@ LevelChunk *OldChunkStorage::load(Level *level, CompoundTag *tag) { CompoundTag *teTag = tileTicks->get(i); - level->forceAddTileTick(teTag->getInt(L"x"), teTag->getInt(L"y"), teTag->getInt(L"z"), teTag->getInt(L"i"), teTag->getInt(L"t")); + level->forceAddTileTick(teTag->getInt(L"x"), teTag->getInt(L"y"), teTag->getInt(L"z"), teTag->getInt(L"i"), teTag->getInt(L"t"), teTag->getInt(L"p")); } } } diff --git a/Minecraft.World/OpenDoorGoal.cpp b/Minecraft.World/OpenDoorGoal.cpp index dbe5b410..b19592bb 100644 --- a/Minecraft.World/OpenDoorGoal.cpp +++ b/Minecraft.World/OpenDoorGoal.cpp @@ -6,7 +6,7 @@ OpenDoorGoal::OpenDoorGoal(Mob *mob, bool closeDoorAfter) : DoorInteractGoal(mob) { this->mob = mob; - this->closeDoor = closeDoorAfter; + closeDoor = closeDoorAfter; } bool OpenDoorGoal::canContinueToUse() diff --git a/Minecraft.World/OreFeature.cpp b/Minecraft.World/OreFeature.cpp index 75482a57..c057511b 100644 --- a/Minecraft.World/OreFeature.cpp +++ b/Minecraft.World/OreFeature.cpp @@ -12,7 +12,7 @@ void OreFeature::_init(int tile, int count, int targetTile) OreFeature::OreFeature(int tile, int count) { - _init(tile, count, Tile::rock_Id); + _init(tile, count, Tile::stone_Id); } OreFeature::OreFeature(int tile, int count, int targetTile) @@ -23,18 +23,18 @@ OreFeature::OreFeature(int tile, int count, int targetTile) bool OreFeature::place(Level *level, Random *random, int x, int y, int z) { PIXBeginNamedEvent(0,"Place Ore Feature"); - float dir = random->nextFloat() * PI; + float dir = random->nextFloat() * PI; - double x0 = x + 8 + Mth::sin(dir) * count / 8; - double x1 = x + 8 - Mth::sin(dir) * count / 8; - double z0 = z + 8 + Mth::cos(dir) * count / 8; - double z1 = z + 8 - Mth::cos(dir) * count / 8; + double x0 = x + 8 + Mth::sin(dir) * count / 8; + double x1 = x + 8 - Mth::sin(dir) * count / 8; + double z0 = z + 8 + Mth::cos(dir) * count / 8; + double z1 = z + 8 - Mth::cos(dir) * count / 8; - double y0 = y + random->nextInt(3) - 2; - double y1 = y + random->nextInt(3) - 2; + double y0 = y + random->nextInt(3) - 2; + double y1 = y + random->nextInt(3) - 2; bool collisionsExpected = false; - + LevelGenerationOptions *levelGenOptions = NULL; if( app.getLevelGenerationOptions() != NULL ) { @@ -44,7 +44,7 @@ bool OreFeature::place(Level *level, Random *random, int x, int y, int z) int minX = x0 - 1; int minY = y0 - 1; int minZ = z0 - 1; - + double maxss = count / 16; double maxr = (Mth::sin(PI) + 1) * maxss + 1; double maxhr = (Mth::sin(PI) + 1) * maxss + 1; @@ -55,23 +55,32 @@ bool OreFeature::place(Level *level, Random *random, int x, int y, int z) collisionsExpected = levelGenOptions->checkIntersects(minX, minY, minZ, maxX, maxY, maxZ); } - for (int d = 0; d <= count; d++) + bool doEarlyRejectTest = false; + if( y0 > level->getSeaLevel() ) + { + doEarlyRejectTest = true; + } + + for (int d = 0; d <= count; d++) { - double xx = x0 + (x1 - x0) * d / count; - double yy = y0 + (y1 - y0) * d / count; - double zz = z0 + (z1 - z0) * d / count; + double xx = x0 + (x1 - x0) * d / count; + double yy = y0 + (y1 - y0) * d / count; + double zz = z0 + (z1 - z0) * d / count; double ss = random->nextDouble() * count / 16; double r = (Mth::sin(d * PI / count) + 1) * ss + 1; - double hr = (Mth::sin(d * PI / count) + 1) * ss + 1; + double hr = r; //(Mth::sin(d * PI / count) + 1) * ss + 1; + + double halfR = r/2; + double halfHR = halfR; //hr/2; - int xt0 = Mth::floor(xx - r / 2); - int yt0 = Mth::floor(yy - hr / 2); - int zt0 = Mth::floor(zz - r / 2); - - int xt1 = Mth::floor(xx + r / 2); - int yt1 = Mth::floor(yy + hr / 2); - int zt1 = Mth::floor(zz + r / 2); + int xt0 = Mth::floor(xx - halfR); + int yt0 = Mth::floor(yy - halfHR); + int zt0 = Mth::floor(zz - halfR); + + int xt1 = Mth::floor(xx + halfR); + int yt1 = Mth::floor(yy + halfHR); + int zt1 = Mth::floor(zz + halfR); // 4J Stu Added to stop ore features generating areas previously place by game rule generation if(collisionsExpected && levelGenOptions != NULL) @@ -87,36 +96,49 @@ bool OreFeature::place(Level *level, Random *random, int x, int y, int z) // A large % of ore placement is entirely into the air. Attempt to identify some of these early, by check the corners // of the area we are placing in to see if we are going to (very probably) be entirely above the height stored in the heightmap - bool earlyReject = true; - if ( level->getHeightmap(xt0, zt0) >= yt0 ) earlyReject = false; - else if( level->getHeightmap(xt1, zt0) >= yt0 ) earlyReject = false; - else if( level->getHeightmap(xt0, zt1) >= yt0 ) earlyReject = false; - else if( level->getHeightmap(xt1, zt1) >= yt0 ) earlyReject = false; + if( doEarlyRejectTest ) + { + bool earlyReject = true; + if ( level->getHeightmap(xt0, zt0) >= yt0 ) earlyReject = false; + else if( level->getHeightmap(xt1, zt0) >= yt0 ) earlyReject = false; + else if( level->getHeightmap(xt0, zt1) >= yt0 ) earlyReject = false; + else if( level->getHeightmap(xt1, zt1) >= yt0 ) earlyReject = false; + + if( earlyReject ) continue; + } + + double xdxd,ydyd; + + double xd0 = ((xt0 + 0.5) - xx); + double yd0 = ((yt0 + 0.5) - yy); + double zd0 = ((zt0 + 0.5) - zz); - if( earlyReject ) continue; + double halfRSq = halfR * halfR; - for (int x2 = xt0; x2 <= xt1; x2++) + double xd = xd0; + for (int x2 = xt0; x2 <= xt1; x2++, xd++) { - double xd = ((x2 + 0.5) - xx) / (r / 2); - if (xd * xd < 1) + xdxd = xd * xd; + if (xdxd < halfRSq) { - for (int y2 = yt0; y2 <= yt1; y2++) + double yd = yd0; + for (int y2 = yt0; y2 <= yt1; y2++, yd++) { - double yd = ((y2 + 0.5) - yy) / (hr / 2); - if (xd * xd + yd * yd < 1) + ydyd = yd * yd; + if (xdxd + ydyd < halfRSq) { - for (int z2 = zt0; z2 <= zt1; z2++) + double zd = zd0; + for (int z2 = zt0; z2 <= zt1; z2++, zd++) { - double zd = ((z2 + 0.5) - zz) / (r / 2); - if (xd * xd + yd * yd + zd * zd < 1) + if (xdxd + ydyd + zd * zd < halfRSq) { - if (level->getTile(x2, y2, z2) == targetTile) - { - level->setTileNoUpdateNoLightCheck(x2, y2, z2, tile); // 4J changed from setTileNoUpdate + if ( level->getTile(x2, y2, z2) == targetTile) + { + level->setTileAndData(x2, y2, z2, tile, 0, Tile::UPDATE_INVISIBLE_NO_LIGHT); } } } - } + } } } } diff --git a/Minecraft.World/OreRecipies.cpp b/Minecraft.World/OreRecipies.cpp index f18e985c..387d059b 100644 --- a/Minecraft.World/OreRecipies.cpp +++ b/Minecraft.World/OreRecipies.cpp @@ -1,10 +1,3 @@ -// package net.minecraft.world.item.crafting; -// -// import net.minecraft.world.item.DyePowderItem; -// import net.minecraft.world.item.Item; -// import net.minecraft.world.item.ItemInstance; -// import net.minecraft.world.level.tile.Tile; - #include "stdafx.h" #include "net.minecraft.world.item.h" #include "DyePowderItem.h" @@ -13,25 +6,8 @@ #include "Recipes.h" #include "OreRecipies.h" - -/* - private Object[][] map = { - { - Tile.goldBlock, new ItemInstance(Item.goldIngot, 9) - }, { - Tile.ironBlock, new ItemInstance(Item.ironIngot, 9) - }, { - Tile.diamondBlock, new ItemInstance(Item.diamond, 9) - }, { - Tile.lapisBlock, new ItemInstance(Item.dye_powder, 9, DyePowderItem.BLUE) - }, - }; -*/ - void OreRecipies::_init() { - map = new vector [MAX_ORE_RECIPES]; - ADD_OBJECT(map[0],Tile::goldBlock); ADD_OBJECT(map[0],new ItemInstance(Item::goldIngot, 9)); @@ -46,10 +22,18 @@ void OreRecipies::_init() ADD_OBJECT(map[4],Tile::lapisBlock); ADD_OBJECT(map[4],new ItemInstance(Item::dye_powder, 9, DyePowderItem::BLUE)); + + ADD_OBJECT(map[5],Tile::redstoneBlock); + ADD_OBJECT(map[5],new ItemInstance(Item::redStone, 9)); + + ADD_OBJECT(map[6],Tile::coalBlock); + ADD_OBJECT(map[6],new ItemInstance(Item::coal, 9, CoalItem::STONE_COAL)); + + ADD_OBJECT(map[7],Tile::hayBlock); + ADD_OBJECT(map[7],new ItemInstance(Item::wheat, 9)); } void OreRecipies::addRecipes(Recipes *r) { - for (int i = 0; i < MAX_ORE_RECIPES; i++) { Tile *from = (Tile*) map[i].at(0)->tile; diff --git a/Minecraft.World/OreRecipies.h b/Minecraft.World/OreRecipies.h index fa226a8a..f2bef1f7 100644 --- a/Minecraft.World/OreRecipies.h +++ b/Minecraft.World/OreRecipies.h @@ -1,6 +1,6 @@ #pragma once -#define MAX_ORE_RECIPES 5 +#define MAX_ORE_RECIPES 8 class OreRecipies { @@ -10,7 +10,7 @@ public: OreRecipies() {_init();} private: - vector *map; + vector map[MAX_ORE_RECIPES]; public: void addRecipes(Recipes *r); diff --git a/Minecraft.World/OwnableEntity.h b/Minecraft.World/OwnableEntity.h new file mode 100644 index 00000000..ae6e5383 --- /dev/null +++ b/Minecraft.World/OwnableEntity.h @@ -0,0 +1,8 @@ +#pragma once + +class OwnableEntity +{ +public: + virtual wstring getOwnerUUID() = 0; + virtual shared_ptr getOwner() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/OwnerHurtByTargetGoal.cpp b/Minecraft.World/OwnerHurtByTargetGoal.cpp index e576f575..8250dc18 100644 --- a/Minecraft.World/OwnerHurtByTargetGoal.cpp +++ b/Minecraft.World/OwnerHurtByTargetGoal.cpp @@ -6,20 +6,31 @@ OwnerHurtByTargetGoal::OwnerHurtByTargetGoal(TamableAnimal *tameAnimal) : TargetGoal(tameAnimal, 32, false) { this->tameAnimal = tameAnimal; + timestamp = 0; setRequiredControlFlags(TargetGoal::TargetFlag); } bool OwnerHurtByTargetGoal::canUse() { if (!tameAnimal->isTame()) return false; - shared_ptr owner = tameAnimal->getOwner(); + shared_ptr owner = dynamic_pointer_cast( tameAnimal->getOwner() ); if (owner == NULL) return false; - ownerLastHurtBy = weak_ptr(owner->getLastHurtByMob()); - return canAttack(ownerLastHurtBy.lock(), false); + ownerLastHurtBy = weak_ptr(owner->getLastHurtByMob()); + int ts = owner->getLastHurtByMobTimestamp(); + + shared_ptr locked = ownerLastHurtBy.lock(); + return ts != timestamp && canAttack(locked, false) && tameAnimal->wantsToAttack(locked, owner); } void OwnerHurtByTargetGoal::start() { mob->setTarget(ownerLastHurtBy.lock()); + + shared_ptr owner = dynamic_pointer_cast( tameAnimal->getOwner() ); + if (owner != NULL) + { + timestamp = owner->getLastHurtByMobTimestamp(); + } + TargetGoal::start(); } \ No newline at end of file diff --git a/Minecraft.World/OwnerHurtByTargetGoal.h b/Minecraft.World/OwnerHurtByTargetGoal.h index 48b30313..2cdc9378 100644 --- a/Minecraft.World/OwnerHurtByTargetGoal.h +++ b/Minecraft.World/OwnerHurtByTargetGoal.h @@ -8,7 +8,8 @@ class OwnerHurtByTargetGoal : public TargetGoal { private: TamableAnimal *tameAnimal; // Owner of this goal - weak_ptr ownerLastHurtBy; + weak_ptr ownerLastHurtBy; + int timestamp; public: OwnerHurtByTargetGoal(TamableAnimal *tameAnimal); diff --git a/Minecraft.World/OwnerHurtTargetGoal.cpp b/Minecraft.World/OwnerHurtTargetGoal.cpp index c6c367d7..b7e74505 100644 --- a/Minecraft.World/OwnerHurtTargetGoal.cpp +++ b/Minecraft.World/OwnerHurtTargetGoal.cpp @@ -7,19 +7,30 @@ OwnerHurtTargetGoal::OwnerHurtTargetGoal(TamableAnimal *tameAnimal) : TargetGoal { this->tameAnimal = tameAnimal; setRequiredControlFlags(TargetGoal::TargetFlag); + timestamp = 0; } bool OwnerHurtTargetGoal::canUse() { if (!tameAnimal->isTame()) return false; - shared_ptr owner = tameAnimal->getOwner(); + shared_ptr owner = dynamic_pointer_cast( tameAnimal->getOwner() ); if (owner == NULL) return false; - ownerLastHurt = weak_ptr(owner->getLastHurtMob()); - return canAttack(ownerLastHurt.lock(), false); + ownerLastHurt = weak_ptr(owner->getLastHurtMob()); + int ts = owner->getLastHurtMobTimestamp(); + shared_ptr locked = ownerLastHurt.lock(); + return ts != timestamp && canAttack(locked, false) && tameAnimal->wantsToAttack(locked, owner); } void OwnerHurtTargetGoal::start() { mob->setTarget(ownerLastHurt.lock()); - TargetGoal::start(); + + shared_ptr owner = dynamic_pointer_cast( tameAnimal->getOwner() ); + if (owner != NULL) + { + timestamp = owner->getLastHurtMobTimestamp(); + + + TargetGoal::start(); + } } \ No newline at end of file diff --git a/Minecraft.World/OwnerHurtTargetGoal.h b/Minecraft.World/OwnerHurtTargetGoal.h index 71079645..1eba5957 100644 --- a/Minecraft.World/OwnerHurtTargetGoal.h +++ b/Minecraft.World/OwnerHurtTargetGoal.h @@ -8,7 +8,8 @@ class OwnerHurtTargetGoal : public TargetGoal { private: TamableAnimal *tameAnimal; // Owner of this goal - weak_ptr ownerLastHurt; + weak_ptr ownerLastHurt; + int timestamp; public: OwnerHurtTargetGoal(TamableAnimal *tameAnimal); diff --git a/Minecraft.World/Packet.cpp b/Minecraft.World/Packet.cpp index 0a59204c..93f02399 100644 --- a/Minecraft.World/Packet.cpp +++ b/Minecraft.World/Packet.cpp @@ -37,7 +37,7 @@ void Packet::staticCtor() map(14, false, true, false, false, typeid(PlayerActionPacket), PlayerActionPacket::create); map(15, false, true, false, false, typeid(UseItemPacket), UseItemPacket::create); - map(16, false, true, false, false, typeid(SetCarriedItemPacket), SetCarriedItemPacket::create); + map(16, true, true, true, false, typeid(SetCarriedItemPacket), SetCarriedItemPacket::create); // 4J-PB - we need to send to any client for the sleep in bed //map(17, true, false, false, false, EntityActionAtPositionPacket)); map(17, true, false, true, false, typeid(EntityActionAtPositionPacket), EntityActionAtPositionPacket::create); @@ -52,7 +52,7 @@ void Packet::staticCtor() map(24, true, false, false, true, typeid(AddMobPacket), AddMobPacket::create); map(25, true, false, false, false, typeid(AddPaintingPacket), AddPaintingPacket::create); map(26, true, false, false, false, typeid(AddExperienceOrbPacket), AddExperienceOrbPacket::create); // TODO New for 1.8.2 - Needs sendToAny? - //map(27, false, true, false, false, PlayerInputPacket)); + map(27, false, true, false, false, typeid(PlayerInputPacket), PlayerInputPacket::create); // 4J-PB - needs to go to any player, due to the knockback effect when a played is hit map(28, true, false, true, true, typeid(SetEntityMotionPacket), SetEntityMotionPacket::create); map(29, true, false, false, true, typeid(RemoveEntitiesPacket), RemoveEntitiesPacket::create); @@ -66,11 +66,12 @@ void Packet::staticCtor() // 4J - needs to go to any player, to create sound effect when a player is hit map(38, true, false, true, true, typeid(EntityEventPacket), EntityEventPacket::create); - map(39, true, false, true, false, typeid(SetRidingPacket), SetRidingPacket::create); + map(39, true, false, true, false, typeid(SetEntityLinkPacket), SetEntityLinkPacket::create); map(40, true, false, true, true, typeid(SetEntityDataPacket), SetEntityDataPacket::create); map(41, true, false, true, false, typeid(UpdateMobEffectPacket), UpdateMobEffectPacket::create); map(42, true, false, true, false, typeid(RemoveMobEffectPacket), RemoveMobEffectPacket::create); map(43, true, false, true, false, typeid(SetExperiencePacket), SetExperiencePacket::create); + map(44, true, false, true, false, typeid(UpdateAttributesPacket), UpdateAttributesPacket::create); map(50, true, false, true, true, typeid(ChunkVisibilityPacket), ChunkVisibilityPacket::create); map(51, true, false, true, true, typeid(BlockRegionUpdatePacket), BlockRegionUpdatePacket::create); // Changed to LevelChunkPacket in Java but we aren't using that @@ -83,7 +84,7 @@ void Packet::staticCtor() map(61, true, false, true, false, typeid(LevelEventPacket), LevelEventPacket::create); // 4J-PB - don't see the need for this, we can use 61 map(62, true, false, true, false, typeid(LevelSoundPacket), LevelSoundPacket::create); - //map(62, true, false, true, false, typeid(LevelSoundPacket), LevelSoundPacket::create); + map(63, true, false, true, false, typeid(LevelParticlesPacket), LevelParticlesPacket::create); map(70, true, false, false, false, typeid(GameEventPacket), GameEventPacket::create); map(71, true, false, false, false, typeid(AddGlobalEntityPacket), AddGlobalEntityPacket::create); @@ -107,6 +108,7 @@ void Packet::staticCtor() map(130, true, true, true, false, typeid(SignUpdatePacket), SignUpdatePacket::create); map(131, true, false, true, false, typeid(ComplexItemDataPacket), ComplexItemDataPacket::create); map(132, true, false, false, false, typeid(TileEntityDataPacket), TileEntityDataPacket::create); + map(133, true, false, true, false, typeid(TileEditorOpenPacket), TileEditorOpenPacket::create); // 4J Added map(150, false, true, false, false, typeid(CraftItemPacket), CraftItemPacket::create); @@ -136,6 +138,12 @@ void Packet::staticCtor() //map(203, true, true, true, false, ChatAutoCompletePacket.class); //map(204, false, true, true, false, ClientInformationPacket.class); map(205, false, true, true, false, typeid(ClientCommandPacket), ClientCommandPacket::create); + + map(206, true, false, true, false, typeid(SetObjectivePacket), SetObjectivePacket::create); + map(207, true, false, true, false, typeid(SetScorePacket), SetScorePacket::create); + map(208, true, false, true, false, typeid(SetDisplayObjectivePacket), SetDisplayObjectivePacket::create); + map(209, true, false, true, false, typeid(SetPlayerTeamPacket), SetPlayerTeamPacket::create); + map(250, true, true, true, false, typeid(CustomPayloadPacket), CustomPayloadPacket::create); // 4J Stu - These added 1.3.2, but don't think we need them //map(252, true, true, SharedKeyPacket.class); @@ -207,16 +215,25 @@ void Packet::map(int id, bool receiveOnClient, bool receiveOnServer, bool sendTo } // 4J Added to record data for outgoing packets -void Packet::recordOutgoingPacket(shared_ptr packet) +void Packet::recordOutgoingPacket(shared_ptr packet, int playerIndex) { #ifndef _CONTENT_PACKAGE #if PACKET_ENABLE_STAT_TRACKING - AUTO_VAR(it, outgoingStatistics.find(packet->getId())); +#if 0 + int idx = packet->getId(); +#else + int idx = playerIndex; + if( packet->getId() != 51 ) + { + idx = 100; + } +#endif + AUTO_VAR(it, outgoingStatistics.find(idx)); if( it == outgoingStatistics.end() ) { - Packet::PacketStatistics *packetStatistics = new PacketStatistics(packet->getId()); - outgoingStatistics[packet->getId()] = packetStatistics; + Packet::PacketStatistics *packetStatistics = new PacketStatistics(idx); + outgoingStatistics[idx] = packetStatistics; packetStatistics->addPacket(packet->getEstimatedSize()); } else @@ -227,77 +244,31 @@ void Packet::recordOutgoingPacket(shared_ptr packet) #endif } -void Packet::renderPacketStats(int id) -{ - AUTO_VAR(it, outgoingStatistics.find(id)); - - if( it != outgoingStatistics.end() ) - { - it->second->renderStats(); - } -} - -void Packet::renderAllPacketStats() +void Packet::updatePacketStatsPIX() { #ifndef _CONTENT_PACKAGE #if PACKET_ENABLE_STAT_TRACKING - Minecraft *pMinecraft = Minecraft::GetInstance(); - pMinecraft->gui->renderStackedGraph(Packet::renderPos, 512, renderableStats.size(), &Packet::getIndexedStatValue ); - - renderAllPacketStatsKey(); - - Packet::renderPos++; - Packet::renderPos%=511; -#endif -#endif -} - -void Packet::renderAllPacketStatsKey() -{ -#ifndef _CONTENT_PACKAGE -#if PACKET_ENABLE_STAT_TRACKING - Minecraft *pMinecraft = Minecraft::GetInstance(); - int total = Packet::renderableStats.size(); - for(unsigned int i = 0; i < total; ++i) + + for( AUTO_VAR(it, outgoingStatistics.begin()); it != outgoingStatistics.end(); it++ ) { - Packet::PacketStatistics *stat = Packet::renderableStats[i]; - float vary = (float)i/total; - int fColour = floor(vary * 0xffffff); - - int colour = 0xff000000 + fColour; - pMinecraft->gui->drawString( pMinecraft->font, stat->getLegendString(), 900, 30 + (10 * i), colour); + Packet::PacketStatistics *stat = it->second; + __int64 count = stat->getRunningCount(); + wchar_t pixName[256]; + swprintf_s(pixName,L"Packet count %d",stat->id); +// PIXReportCounter(pixName,(float)count); + __int64 total = stat->getRunningTotal(); + swprintf_s(pixName,L"Packet bytes %d",stat->id); + PIXReportCounter(pixName,(float)total); + stat->IncrementPos(); } #endif #endif } -__int64 Packet::getIndexedStatValue(unsigned int samplePos, unsigned int renderableId) -{ - __int64 val = 0; - -#ifndef _CONTENT_PACKAGE -#if PACKET_ENABLE_STAT_TRACKING - val = renderableStats[renderableId]->getCountSample(samplePos); -#endif -#endif - - return val; -} - - shared_ptr Packet::getPacket(int id) { - // 4J - removed try/catch - // try - // { + // 4J: Removed try/catch return idToCreateMap[id](); - // } - // catch (exception e) - // { - // // TODO 4J JEV print stack trace, newInstance doesnt throw an exception in c++ yet. - // printf("Skipping packet with id %d" , id); - // return NULL; - // } } void Packet::writeBytes(DataOutputStream *dataoutputstream, byteArray bytes) @@ -320,7 +291,7 @@ byteArray Packet::readBytes(DataInputStream *datainputstream) } byteArray bytes(size); - datainputstream->read(bytes); + datainputstream->readFully(bytes); return bytes; } @@ -446,18 +417,19 @@ wstring Packet::readUtf(DataInputStream *dis, int maxLength) // throws IOExcepti return builder; } +Packet::PacketStatistics::PacketStatistics(int id) : id( id ), count( 0 ), totalSize( 0 ), samplesPos( 0 ) +{ + memset(countSamples, 0, sizeof(countSamples)); + memset(sizeSamples, 0, sizeof(sizeSamples)); +} + void Packet::PacketStatistics::addPacket(int bytes) { - if(count == 0) - { - firstSampleTime = System::currentTimeMillis(); - } - count++; + countSamples[samplesPos]++; + sizeSamples[samplesPos] += bytes; + timeSamples[samplesPos] = System::currentTimeMillis(); totalSize += bytes; - - // 4J Added - countSamples[samplesPos & (512 - 1)]++; - sizeSamples[samplesPos & (512 - 1)] += (unsigned int) bytes; + count++; } int Packet::PacketStatistics::getCount() @@ -474,44 +446,45 @@ double Packet::PacketStatistics::getAverageSize() return (double) totalSize / count; } -void Packet::PacketStatistics::renderStats( ) +int Packet::PacketStatistics::getTotalSize() { -#ifndef _CONTENT_PACKAGE -#if PACKET_ENABLE_STAT_TRACKING - samplesPos++; - - countSamples[samplesPos & (512 - 1)] = 0; - sizeSamples[samplesPos & (512 - 1)] = 0; - - Minecraft *pMinecraft = Minecraft::GetInstance(); - pMinecraft->gui->renderGraph(512, samplesPos, countSamples, 1, 10, sizeSamples, 1, 50); -#endif -#endif + return totalSize; } -__int64 Packet::PacketStatistics::getCountSample(int samplePos) +__int64 Packet::PacketStatistics::getRunningTotal() { - if(samplePos == 511) + __int64 total = 0; + __int64 currentTime = System::currentTimeMillis(); + for( int i = 0; i < TOTAL_TICKS; i++ ) { - samplesPos++; - countSamples[samplesPos & (512 - 1)] = 0; - sizeSamples[samplesPos & (512 - 1)] = 0; + if( currentTime - timeSamples[i] <= 1000 ) + { + total += sizeSamples[i]; + } } - - return countSamples[samplePos] * 10; + return total; } -wstring Packet::PacketStatistics::getLegendString() +__int64 Packet::PacketStatistics::getRunningCount() { - static wchar_t string[128]; - double bps = 0.0; - if(firstSampleTime > 0) + __int64 total = 0; + __int64 currentTime = System::currentTimeMillis(); + for( int i = 0; i < TOTAL_TICKS; i++ ) { - float timeDiff = ((System::currentTimeMillis() - firstSampleTime)/1000); - if(timeDiff > 0) bps = totalSize / timeDiff; + if( currentTime - timeSamples[i] <= 1000 ) + { + total += countSamples[i]; + } } - swprintf(string, 128, L"id: %d , packets: %d , total: %d , bytes: %d, total: %d, %f Bps", id, countSamples[(samplesPos - 1) & (512 - 1)], count, sizeSamples[(samplesPos - 1) & (512 - 1)], totalSize, bps ); - return string; + return total; +} + +void Packet::PacketStatistics::IncrementPos() +{ + samplesPos = ( samplesPos + 1 ) % TOTAL_TICKS; + countSamples[samplesPos] = 0; + sizeSamples[samplesPos] = 0; + timeSamples[samplesPos] = 0; } bool Packet::canBeInvalidated() diff --git a/Minecraft.World/Packet.h b/Minecraft.World/Packet.h index 60410df3..7c30f6aa 100644 --- a/Minecraft.World/Packet.h +++ b/Minecraft.World/Packet.h @@ -21,26 +21,26 @@ public: int count; int totalSize; + static const int TOTAL_TICKS = 100; + // 4J Added - __int64 countSamples[512]; - __int64 sizeSamples[512]; + __int64 countSamples[TOTAL_TICKS]; + __int64 sizeSamples[TOTAL_TICKS]; + __int64 timeSamples[TOTAL_TICKS]; int samplesPos; - __int64 firstSampleTime; - public: const int id; public: - PacketStatistics(int id) : id( id ), count( 0 ), totalSize( 0 ), samplesPos( 0 ), firstSampleTime( 0 ) { countSamples[0] = 0; sizeSamples[0] = 0; } + PacketStatistics(int id); void addPacket(int bytes); int getCount(); + int getTotalSize(); double getAverageSize(); - - // 4J Added - void renderStats(); - __int64 getCountSample(int samplePos); - wstring getLegendString(); + __int64 getRunningTotal(); + __int64 getRunningCount(); + void IncrementPos(); }; // 4J JEV, replaces the static blocks. @@ -80,12 +80,8 @@ private: static vector renderableStats; static int renderPos; public: - static void recordOutgoingPacket(shared_ptr packet); - static void renderPacketStats(int id); - static void renderAllPacketStats(); - static void renderAllPacketStatsKey(); - static __int64 getIndexedStatValue(unsigned int samplePos, unsigned int renderableId); - + static void recordOutgoingPacket(shared_ptr packet, int playerIndex); + static void updatePacketStatsPIX(); private : static unordered_map statistics; //static int nextPrint; diff --git a/Minecraft.World/PacketListener.cpp b/Minecraft.World/PacketListener.cpp index 2f051d7d..09fbb052 100644 --- a/Minecraft.World/PacketListener.cpp +++ b/Minecraft.World/PacketListener.cpp @@ -139,7 +139,7 @@ void PacketListener::handleSetEntityData(shared_ptr packet) onUnhandledPacket( (shared_ptr ) packet); } -void PacketListener::handleRidePacket(shared_ptr packet) +void PacketListener::handleEntityLinkPacket(shared_ptr packet) { onUnhandledPacket( (shared_ptr ) packet); } @@ -388,6 +388,48 @@ bool PacketListener::canHandleAsyncPackets() return false; } + + +// 1.6.4 +void PacketListener::handleAddObjective(shared_ptr packet) +{ + onUnhandledPacket(packet); +} + +void PacketListener::handleSetScore(shared_ptr packet) +{ + onUnhandledPacket(packet); +} + +void PacketListener::handleSetDisplayObjective(shared_ptr packet) +{ + onUnhandledPacket(packet); +} + +void PacketListener::handleSetPlayerTeamPacket(shared_ptr packet) +{ + onUnhandledPacket(packet); +} + +void PacketListener::handleParticleEvent(shared_ptr packet) +{ + onUnhandledPacket(packet); +} + +void PacketListener::handleUpdateAttributes(shared_ptr packet) +{ + onUnhandledPacket(packet); +} + +void PacketListener::handleTileEditorOpen(shared_ptr tileEditorOpenPacket) +{ +} + +bool PacketListener::isDisconnected() +{ + return false; +} + // 4J Added void PacketListener::handleCraftItem(shared_ptr packet) diff --git a/Minecraft.World/PacketListener.h b/Minecraft.World/PacketListener.h index 93b14603..f63b6bc7 100644 --- a/Minecraft.World/PacketListener.h +++ b/Minecraft.World/PacketListener.h @@ -45,7 +45,7 @@ class SetEntityDataPacket; class SetEntityMotionPacket; class SetEquippedItemPacket; class SetHealthPacket; -class SetRidingPacket; +class SetEntityLinkPacket; class SetSpawnPositionPacket; class SetTimePacket; class SignUpdatePacket; @@ -86,6 +86,15 @@ class TileDestructionPacket; class ClientCommandPacket; class LevelChunksPacket; +// 1.6.4 +class SetObjectivePacket; +class SetScorePacket; +class SetDisplayObjectivePacket; +class SetPlayerTeamPacket; +class LevelParticlesPacket; +class UpdateAttributesPacket; +class TileEditorOpenPacket; + // 4J Added class CraftItemPacket; class TradeItemPacket; @@ -135,7 +144,7 @@ public: virtual void handleSetSpawn(shared_ptr packet); virtual void handleSetEntityMotion(shared_ptr packet); virtual void handleSetEntityData(shared_ptr packet); - virtual void handleRidePacket(shared_ptr packet); + virtual void handleEntityLinkPacket(shared_ptr packet); virtual void handleInteract(shared_ptr packet); virtual void handleEntityEvent(shared_ptr packet); virtual void handleSetHealth(shared_ptr packet); @@ -193,6 +202,16 @@ public: //virtual void handleLevelChunks(shared_ptr packet); virtual bool canHandleAsyncPackets(); + // 1.6.4 + virtual void handleAddObjective(shared_ptr packet); + virtual void handleSetScore(shared_ptr packet); + virtual void handleSetDisplayObjective(shared_ptr packet); + virtual void handleSetPlayerTeamPacket(shared_ptr packet); + virtual void handleParticleEvent(shared_ptr packet); + virtual void handleUpdateAttributes(shared_ptr packet); + virtual void handleTileEditorOpen(shared_ptr tileEditorOpenPacket); + virtual bool isDisconnected(); + // 4J Added virtual void handleCraftItem(shared_ptr packet); virtual void handleTradeItem(shared_ptr packet); diff --git a/Minecraft.World/Painting.cpp b/Minecraft.World/Painting.cpp index 0d8f35fe..208beb77 100644 --- a/Minecraft.World/Painting.cpp +++ b/Minecraft.World/Painting.cpp @@ -74,23 +74,34 @@ Painting::Painting(Level *level, int xTile, int yTile, int zTile, int dir) : Han } // 4J Stu - Added this so that we can use some shared_ptr functions that were needed in the ctor -void Painting::PaintingPostConstructor(int dir) +// 4J Stu - Added motive param for debugging/artists only +void Painting::PaintingPostConstructor(int dir, int motive) { - vector *survivableMotives = new vector(); - for (int i = 0 ; i < LAST_VALUE; i++) +#ifndef _CONTENT_PACKAGE + if (app.DebugArtToolsOn() && motive >= 0) { - this->motive = (Motive *)Motive::values[i]; + this->motive = (Motive *)Motive::values[motive]; setDir(dir); - if (survives()) - { - survivableMotives->push_back(this->motive); - } } - if (!survivableMotives->empty()) + else +#endif { - this->motive = survivableMotives->at(random->nextInt((int)survivableMotives->size())); + vector *survivableMotives = new vector(); + for (int i = 0 ; i < LAST_VALUE; i++) + { + this->motive = (Motive *)Motive::values[i]; + setDir(dir); + if (survives()) + { + survivableMotives->push_back(this->motive); + } + } + if (!survivableMotives->empty()) + { + this->motive = survivableMotives->at(random->nextInt((int)survivableMotives->size())); + } + setDir(dir); } - setDir(dir); } Painting::Painting(Level *level, int x, int y, int z, int dir, wstring motiveName) : HangingEntity( level , x, y, z, dir ) @@ -142,7 +153,16 @@ int Painting::getHeight() return motive->h; } -void Painting::dropItem() +void Painting::dropItem(shared_ptr causedBy) { + if ( (causedBy != NULL) && causedBy->instanceof(eTYPE_PLAYER) ) + { + shared_ptr player = dynamic_pointer_cast(causedBy); + if (player->abilities.instabuild) + { + return; + } + } + spawnAtLocation(shared_ptr(new ItemInstance(Item::painting)), 0.0f); } \ No newline at end of file diff --git a/Minecraft.World/Painting.h b/Minecraft.World/Painting.h index 7866b662..b47a012b 100644 --- a/Minecraft.World/Painting.h +++ b/Minecraft.World/Painting.h @@ -72,10 +72,6 @@ public: }; public: -// int dir; -// -// int xTile, yTile, zTile; - Motive *motive; private: @@ -88,7 +84,8 @@ public: Painting(Level *level, int x, int y, int z, int dir, wstring motiveName); // 4J Stu - Added this so that we can use some shared_ptr functions that were needed in the ctor - void PaintingPostConstructor(int dir); + // 4J Stu - Added motive param for debugging/artists only + void PaintingPostConstructor(int dir, int motive = -1); protected: //void defineSynchedData(); @@ -113,5 +110,5 @@ public: virtual int getWidth(); virtual int getHeight(); - virtual void dropItem(); + virtual void dropItem(shared_ptr causedBy); }; diff --git a/Minecraft.World/PanicGoal.cpp b/Minecraft.World/PanicGoal.cpp index da951ca2..564fa59d 100644 --- a/Minecraft.World/PanicGoal.cpp +++ b/Minecraft.World/PanicGoal.cpp @@ -6,16 +6,16 @@ #include "net.minecraft.world.phys.h" #include "PanicGoal.h" -PanicGoal::PanicGoal(PathfinderMob *mob, float speed) +PanicGoal::PanicGoal(PathfinderMob *mob, double speedModifier) { this->mob = mob; - this->speed = speed; + this->speedModifier = speedModifier; setRequiredControlFlags(Control::MoveControlFlag); } bool PanicGoal::canUse() { - if (mob->getLastHurtByMob() == NULL) return false; + if (mob->getLastHurtByMob() == NULL && !mob->isOnFire()) return false; Vec3 *pos = RandomPos::getPos(dynamic_pointer_cast(mob->shared_from_this()), 5, 4); if (pos == NULL) return false; posX = pos->x; @@ -26,7 +26,7 @@ bool PanicGoal::canUse() void PanicGoal::start() { - mob->getNavigation()->moveTo(posX, posY, posZ, speed); + mob->getNavigation()->moveTo(posX, posY, posZ, speedModifier); } bool PanicGoal::canContinueToUse() diff --git a/Minecraft.World/PanicGoal.h b/Minecraft.World/PanicGoal.h index 03d82782..2db64a75 100644 --- a/Minecraft.World/PanicGoal.h +++ b/Minecraft.World/PanicGoal.h @@ -8,11 +8,11 @@ class PanicGoal : public Goal { private: PathfinderMob *mob; - float speed; + double speedModifier; double posX, posY, posZ; public: - PanicGoal(PathfinderMob *mob, float speed); + PanicGoal(PathfinderMob *mob, double speedModifier); virtual bool canUse(); virtual void start(); diff --git a/Minecraft.World/ParticleTypes.h b/Minecraft.World/ParticleTypes.h index d822008e..ecc2ab96 100644 --- a/Minecraft.World/ParticleTypes.h +++ b/Minecraft.World/ParticleTypes.h @@ -26,7 +26,9 @@ enum ePARTICLE_TYPE eParticleType_largeexplode, eParticleType_townaura, eParticleType_spell, + eParticleType_witchMagic, eParticleType_mobSpell, + eParticleType_mobSpellAmbient, eParticleType_instantSpell, eParticleType_magicCrit, eParticleType_dripWater, @@ -36,6 +38,7 @@ enum ePARTICLE_TYPE eParticleType_ender, // 4J Added - These are things that used the "portal" particle but are actually end related entities eParticleType_angryVillager, eParticleType_happyVillager, + eParticleType_fireworksspark, // 4J-JEV: In the java, the particle name was used to sneak parameters in for the Terrain and IconCrack particle constructors. diff --git a/Minecraft.World/PathFinder.cpp b/Minecraft.World/PathFinder.cpp index 878c74f1..029cf582 100644 --- a/Minecraft.World/PathFinder.cpp +++ b/Minecraft.World/PathFinder.cpp @@ -17,7 +17,7 @@ PathFinder::PathFinder(LevelSource *level, bool canPassDoors, bool canOpenDoors, this->canOpenDoors = canOpenDoors; this->avoidWater = avoidWater; this->canFloat = canFloat; - this->level = level; + this->level = level; } PathFinder::~PathFinder() @@ -35,17 +35,17 @@ PathFinder::~PathFinder() Path *PathFinder::findPath(Entity *from, Entity *to, float maxDist) { - return findPath(from, to->x, to->bb->y0, to->z, maxDist); + return findPath(from, to->x, to->bb->y0, to->z, maxDist); } Path *PathFinder::findPath(Entity *from, int x, int y, int z, float maxDist) { - return findPath(from, x + 0.5f, y + 0.5f, z + 0.5f, maxDist); + return findPath(from, x + 0.5f, y + 0.5f, z + 0.5f, maxDist); } Path *PathFinder::findPath(Entity *e, double xt, double yt, double zt, float maxDist) { - openSet.clear(); + openSet.clear(); nodes.clear(); bool resetAvoidWater = avoidWater; @@ -63,143 +63,144 @@ Path *PathFinder::findPath(Entity *e, double xt, double yt, double zt, float max avoidWater = false; } else startY = Mth::floor(e->bb->y0 + 0.5f); - Node *from = getNode((int) floor(e->bb->x0), startY, (int) floor(e->bb->z0)); - Node *to = getNode((int) floor(xt - e->bbWidth / 2), (int) floor(yt), (int) floor(zt - e->bbWidth / 2)); + Node *from = getNode((int) floor(e->bb->x0), startY, (int) floor(e->bb->z0)); + Node *to = getNode((int) floor(xt - e->bbWidth / 2), (int) floor(yt), (int) floor(zt - e->bbWidth / 2)); - Node *size = new Node((int) floor(e->bbWidth + 1), (int) floor(e->bbHeight + 1), (int) floor(e->bbWidth + 1)); - Path *path = findPath(e, from, to, size, maxDist); + Node *size = new Node((int) floor(e->bbWidth + 1), (int) floor(e->bbHeight + 1), (int) floor(e->bbWidth + 1)); + Path *path = findPath(e, from, to, size, maxDist); delete size; avoidWater = resetAvoidWater; - return path; + return path; } // function A*(start,goal) Path *PathFinder::findPath(Entity *e, Node *from, Node *to, Node *size, float maxDist) { - from->g = 0; - from->h = from->distanceToSqr(to); - from->f = from->h; + from->g = 0; + from->h = from->distanceToSqr(to); + from->f = from->h; - openSet.clear(); - openSet.insert(from); + openSet.clear(); + openSet.insert(from); - Node *closest = from; + Node *closest = from; - while (!openSet.isEmpty()) + while (!openSet.isEmpty()) { - Node *x = openSet.pop(); + Node *x = openSet.pop(); if (x->equals(to)) { - return reconstruct_path(from, to); - } + return reconstruct_path(from, to); + } - if (x->distanceToSqr(to) < closest->distanceToSqr(to)) + if (x->distanceToSqr(to) < closest->distanceToSqr(to)) { - closest = x; - } - x->closed = true; + closest = x; + } + x->closed = true; - int neighborCount = getNeighbors(e, x, size, to, maxDist); - for (int i = 0; i < neighborCount; i++) + int neighborCount = getNeighbors(e, x, size, to, maxDist); + for (int i = 0; i < neighborCount; i++) { - Node *y = neighbors->data[i]; + Node *y = neighbors->data[i]; - float tentative_g_score = x->g + x->distanceToSqr(y); - if (!y->inOpenSet() || tentative_g_score < y->g) + float tentative_g_score = x->g + x->distanceToSqr(y); + if (!y->inOpenSet() || tentative_g_score < y->g) { - y->cameFrom = x; - y->g = tentative_g_score; - y->h = y->distanceToSqr(to); - if (y->inOpenSet()) + y->cameFrom = x; + y->g = tentative_g_score; + y->h = y->distanceToSqr(to); + if (y->inOpenSet()) { - openSet.changeCost(y, y->g + y->h); - } + openSet.changeCost(y, y->g + y->h); + } else { - y->f = y->g + y->h; - openSet.insert(y); - } - } - } - } - - if (closest == from) return NULL; - return reconstruct_path(from, closest); + y->f = y->g + y->h; + openSet.insert(y); + } + } + } + } + + if (closest == from) return NULL; + return reconstruct_path(from, closest); } int PathFinder::getNeighbors(Entity *entity, Node *pos, Node *size, Node *target, float maxDist) { - int p = 0; + int p = 0; - int jumpSize = 0; - if (isFree(entity, pos->x, pos->y + 1, pos->z, size) == TYPE_OPEN) jumpSize = 1; + int jumpSize = 0; + if (isFree(entity, pos->x, pos->y + 1, pos->z, size) == TYPE_OPEN) jumpSize = 1; - Node *n = getNode(entity, pos->x, pos->y, pos->z + 1, size, jumpSize); - Node *w = getNode(entity, pos->x - 1, pos->y, pos->z, size, jumpSize); - Node *e = getNode(entity, pos->x + 1, pos->y, pos->z, size, jumpSize); - Node *s = getNode(entity, pos->x, pos->y, pos->z - 1, size, jumpSize); + Node *n = getNode(entity, pos->x, pos->y, pos->z + 1, size, jumpSize); + Node *w = getNode(entity, pos->x - 1, pos->y, pos->z, size, jumpSize); + Node *e = getNode(entity, pos->x + 1, pos->y, pos->z, size, jumpSize); + Node *s = getNode(entity, pos->x, pos->y, pos->z - 1, size, jumpSize); - if (n != NULL && !n->closed && n->distanceTo(target) < maxDist) neighbors->data[p++] = n; - if (w != NULL && !w->closed && w->distanceTo(target) < maxDist) neighbors->data[p++] = w; - if (e != NULL && !e->closed && e->distanceTo(target) < maxDist) neighbors->data[p++] = e; - if (s != NULL && !s->closed && s->distanceTo(target) < maxDist) neighbors->data[p++] = s; + if (n != NULL && !n->closed && n->distanceTo(target) < maxDist) neighbors->data[p++] = n; + if (w != NULL && !w->closed && w->distanceTo(target) < maxDist) neighbors->data[p++] = w; + if (e != NULL && !e->closed && e->distanceTo(target) < maxDist) neighbors->data[p++] = e; + if (s != NULL && !s->closed && s->distanceTo(target) < maxDist) neighbors->data[p++] = s; - return p; + return p; } Node *PathFinder::getNode(Entity *entity, int x, int y, int z, Node *size, int jumpSize) { - Node *best = NULL; + Node *best = NULL; int pathType = isFree(entity, x, y, z, size); if (pathType == TYPE_WALKABLE) return getNode(x, y, z); - if (pathType == TYPE_OPEN) best = getNode(x, y, z); - if (best == NULL && jumpSize > 0 && pathType != TYPE_FENCE && pathType != TYPE_TRAP && isFree(entity, x, y + jumpSize, z, size) == TYPE_OPEN) + if (pathType == TYPE_OPEN) best = getNode(x, y, z); + if (best == NULL && jumpSize > 0 && pathType != TYPE_FENCE && pathType != TYPE_TRAP && isFree(entity, x, y + jumpSize, z, size) == TYPE_OPEN) { - best = getNode(x, y + jumpSize, z); - y += jumpSize; - } + best = getNode(x, y + jumpSize, z); + y += jumpSize; + } - if (best != NULL) + if (best != NULL) { - int drop = 0; - int cost = 0; - while (y > 0) + int drop = 0; + int cost = 0; + while (y > 0) { cost = isFree(entity, x, y - 1, z, size); if (avoidWater && cost == TYPE_WATER) return NULL; if (cost != TYPE_OPEN) break; - // fell too far? - if (++drop >= 4) return NULL; - y--; + // fell too far? + if (++drop >= 4) return NULL; // 4J - rolling this back to pre-java 1.6.4 version as we're suspicious of the performance implications of this +// if (drop++ >= entity->getMaxFallDistance()) return NULL; + y--; - if (y > 0) best = getNode(x, y, z); - } - // fell into lava? - if (cost == TYPE_LAVA) return NULL; - } + if (y > 0) best = getNode(x, y, z); + } + // fell into lava? + if (cost == TYPE_LAVA) return NULL; + } - return best; + return best; } /*final*/ Node *PathFinder::getNode(int x, int y, int z) { - int i = Node::createHash(x, y, z); - Node *node; + int i = Node::createHash(x, y, z); + Node *node; AUTO_VAR(it, nodes.find(i)); - if ( it == nodes.end() ) + if ( it == nodes.end() ) { MemSect(54); - node = new Node(x, y, z); + node = new Node(x, y, z); MemSect(0); - nodes.insert( unordered_map::value_type(i, node) ); - } + nodes.insert( unordered_map::value_type(i, node) ); + } else { node = (*it).second; } - return node; + return node; } int PathFinder::isFree(Entity *entity, int x, int y, int z, Node *size) @@ -228,6 +229,24 @@ int PathFinder::isFree(Entity *entity, int x, int y, int z, Node *size, bool avo } Tile *tile = Tile::tiles[tileId]; + + // 4J Stu - Use new getTileRenderShape passing in the tileId we have already got + if (entity->level->getTileRenderShape(tileId) == Tile::SHAPE_RAIL) + { + int xt = Mth::floor(entity->x); + int yt = Mth::floor(entity->y); + int zt = Mth::floor(entity->z); + if (entity->level->getTileRenderShape(xt, yt, zt) == Tile::SHAPE_RAIL + || entity->level->getTileRenderShape(xt, yt - 1, zt) == Tile::SHAPE_RAIL) + { + continue; + } + else + { + return TYPE_FENCE; + } + } + if (tile->isPathfindable(entity->level, xx, yy, zz)) continue; if (canOpenDoors && tileId == Tile::door_wood_Id) continue; @@ -243,29 +262,29 @@ int PathFinder::isFree(Entity *entity, int x, int y, int z, Node *size, bool avo return TYPE_BLOCKED; } - return walkable ? TYPE_WALKABLE : TYPE_OPEN; + return walkable ? TYPE_WALKABLE : TYPE_OPEN; } // function reconstruct_path(came_from,current_node) Path *PathFinder::reconstruct_path(Node *from, Node *to) { - int count = 1; - Node *n = to; - while (n->cameFrom != NULL) + int count = 1; + Node *n = to; + while (n->cameFrom != NULL) { - count++; - n = n->cameFrom; - } - - NodeArray nodes = NodeArray(count); - n = to; - nodes.data[--count] = n; - while (n->cameFrom != NULL) + count++; + n = n->cameFrom; + } + + NodeArray nodes = NodeArray(count); + n = to; + nodes.data[--count] = n; + while (n->cameFrom != NULL) { - n = n->cameFrom; - nodes.data[--count] = n; - } + n = n->cameFrom; + nodes.data[--count] = n; + } Path *ret = new Path(nodes); delete [] nodes.data; - return ret; + return ret; } \ No newline at end of file diff --git a/Minecraft.World/PathFinder.h b/Minecraft.World/PathFinder.h index 87321264..1e35ccb5 100644 --- a/Minecraft.World/PathFinder.h +++ b/Minecraft.World/PathFinder.h @@ -9,12 +9,12 @@ class PathFinder private: LevelSource *level; - BinaryHeap openSet; + BinaryHeap openSet; // 4J Jev, was a IntHashMap, thought this was close enough. - unordered_map nodes; + unordered_map nodes; - NodeArray *neighbors; + NodeArray *neighbors; bool canPassDoors; bool canOpenDoors; @@ -25,30 +25,30 @@ public: PathFinder(LevelSource *level, bool canPassDoors, bool canOpenDoors, bool avoidWater, bool canFloat); ~PathFinder(); - Path *findPath(Entity *from, Entity *to, float maxDist); - Path *findPath(Entity *from, int x, int y, int z, float maxDist); + Path *findPath(Entity *from, Entity *to, float maxDist); + Path *findPath(Entity *from, int x, int y, int z, float maxDist); private: Path *findPath(Entity *e, double xt, double yt, double zt, float maxDist); - // function A*(start,goal) - Path *findPath(Entity *e, Node *from, Node *to, Node *size, float maxDist); - int getNeighbors(Entity *entity, Node *pos, Node *size, Node *target, float maxDist); - Node *getNode(Entity *entity, int x, int y, int z, Node *size, int jumpSize); - /*final*/ Node *getNode(int x, int y, int z); + // function A*(start,goal) + Path *findPath(Entity *e, Node *from, Node *to, Node *size, float maxDist); + int getNeighbors(Entity *entity, Node *pos, Node *size, Node *target, float maxDist); + Node *getNode(Entity *entity, int x, int y, int z, Node *size, int jumpSize); + /*final*/ Node *getNode(int x, int y, int z); public: static const int TYPE_TRAP = -4; static const int TYPE_FENCE = -3; static const int TYPE_LAVA = -2; - static const int TYPE_WATER = -1; - static const int TYPE_BLOCKED = 0; - static const int TYPE_OPEN = 1; + static const int TYPE_WATER = -1; + static const int TYPE_BLOCKED = 0; + static const int TYPE_OPEN = 1; static const int TYPE_WALKABLE = 2; int isFree(Entity *entity, int x, int y, int z, Node *size); static int isFree(Entity *entity, int x, int y, int z, Node *size, bool avoidWater, bool canOpenDoors, bool canPassDoors); - // function reconstruct_path(came_from,current_node) - Path *reconstruct_path(Node *from, Node *to); + // function reconstruct_path(came_from,current_node) + Path *reconstruct_path(Node *from, Node *to); }; \ No newline at end of file diff --git a/Minecraft.World/PathNavigation.cpp b/Minecraft.World/PathNavigation.cpp index 2bf01672..7cac052e 100644 --- a/Minecraft.World/PathNavigation.cpp +++ b/Minecraft.World/PathNavigation.cpp @@ -2,20 +2,22 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.pathfinder.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "PathNavigation.h" -PathNavigation::PathNavigation(Mob *mob, Level *level, float maxDist) +PathNavigation::PathNavigation(Mob *mob, Level *level) { this->mob = mob; this->level = level; - this->maxDist = maxDist; + dist = mob->getAttribute(SharedMonsterAttributes::FOLLOW_RANGE); path = NULL; - speed = 0.0f; + speedModifier = 0.0; avoidSun = false; _tick = 0; lastStuckCheck = 0; @@ -67,9 +69,9 @@ void PathNavigation::setAvoidSun(bool avoidSun) this->avoidSun = avoidSun; } -void PathNavigation::setSpeed(float speed) +void PathNavigation::setSpeedModifier(double speedModifier) { - this->speed = speed; + this->speedModifier = speedModifier; } void PathNavigation::setCanFloat(bool canFloat) @@ -77,38 +79,43 @@ void PathNavigation::setCanFloat(bool canFloat) this->canFloat = canFloat; } +float PathNavigation::getMaxDist() +{ + return (float) dist->getValue(); +} + Path *PathNavigation::createPath(double x, double y, double z) { if (!canUpdatePath()) return NULL; - return level->findPath(mob->shared_from_this(), Mth::floor(x), (int) y, Mth::floor(z), maxDist, _canPassDoors, _canOpenDoors, avoidWater, canFloat); + return level->findPath(mob->shared_from_this(), Mth::floor(x), (int) y, Mth::floor(z), getMaxDist(), _canPassDoors, _canOpenDoors, avoidWater, canFloat); } -bool PathNavigation::moveTo(double x, double y, double z, float speed) +bool PathNavigation::moveTo(double x, double y, double z, double speedModifier) { MemSect(52); Path *newPath = createPath(Mth::floor(x), (int) y, Mth::floor(z)); MemSect(0); // No need to delete newPath here as this will be copied into the member variable path and the class can assume responsibility for it - return moveTo(newPath, speed); + return moveTo(newPath, speedModifier); } -Path *PathNavigation::createPath(shared_ptr target) +Path *PathNavigation::createPath(shared_ptr target) { if (!canUpdatePath()) return NULL; - return level->findPath(mob->shared_from_this(), target, maxDist, _canPassDoors, _canOpenDoors, avoidWater, canFloat); + return level->findPath(mob->shared_from_this(), target, getMaxDist(), _canPassDoors, _canOpenDoors, avoidWater, canFloat); } -bool PathNavigation::moveTo(shared_ptr target, float speed) +bool PathNavigation::moveTo(shared_ptr target, double speedModifier) { MemSect(53); Path *newPath = createPath(target); MemSect(0); // No need to delete newPath here as this will be copied into the member variable path and the class can assume responsibility for it - if (newPath != NULL) return moveTo(newPath, speed); + if (newPath != NULL) return moveTo(newPath, speedModifier); else return false; } -bool PathNavigation::moveTo(Path *newPath, float speed) +bool PathNavigation::moveTo(Path *newPath, double speedModifier) { if(newPath == NULL) { @@ -128,7 +135,7 @@ bool PathNavigation::moveTo(Path *newPath, float speed) if (avoidSun) trimPathFromSun(); if (path->getSize() == 0) return false; - this->speed = speed; + this->speedModifier = speedModifier; Vec3 *mobPos = getTempMobPos(); lastStuckCheck = _tick; lastStuckCheckPos->x = mobPos->x; @@ -153,7 +160,7 @@ void PathNavigation::tick() Vec3 *target = path->currentPos(mob->shared_from_this()); if (target == NULL) return; - mob->getMoveControl()->setWantedPosition(target->x, target->y, target->z, speed); + mob->getMoveControl()->setWantedPosition(target->x, target->y, target->z, speedModifier); } void PathNavigation::updatePath() diff --git a/Minecraft.World/PathNavigation.h b/Minecraft.World/PathNavigation.h index b8a8cfd6..9b68637a 100644 --- a/Minecraft.World/PathNavigation.h +++ b/Minecraft.World/PathNavigation.h @@ -10,8 +10,8 @@ private: Mob *mob; Level *level; Path *path; - float speed; - float maxDist; + double speedModifier; + AttributeInstance *dist; bool avoidSun; int _tick; int lastStuckCheck; @@ -23,7 +23,7 @@ private: bool canFloat; public: - PathNavigation(Mob *mob, Level *level, float maxDist); + PathNavigation(Mob *mob, Level *level); ~PathNavigation(); void setAvoidWater(bool avoidWater); @@ -33,13 +33,14 @@ public: void setCanPassDoors(bool canPass); bool canOpenDoors(); void setAvoidSun(bool avoidSun); - void setSpeed(float speed); + void setSpeedModifier(double speedModifier); void setCanFloat(bool canFloat); + float getMaxDist(); Path *createPath(double x, double y, double z); - bool moveTo(double x, double y, double z, float speed); - Path *createPath(shared_ptr target); - bool moveTo(shared_ptr target, float speed); - bool moveTo(Path *newPath, float speed); + bool moveTo(double x, double y, double z, double speedModifier); + Path *createPath(shared_ptr target); + bool moveTo(shared_ptr target, double speedModifier); + bool moveTo(Path *newPath, double speedModifier); Path *getPath(); void tick(); diff --git a/Minecraft.World/PathfinderMob.cpp b/Minecraft.World/PathfinderMob.cpp index b72e064f..c01790e7 100644 --- a/Minecraft.World/PathfinderMob.cpp +++ b/Minecraft.World/PathfinderMob.cpp @@ -1,12 +1,17 @@ #include "stdafx.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.pathfinder.h" #include "net.minecraft.world.phys.h" #include "SharedConstants.h" #include "PathfinderMob.h" - +AttributeModifier *PathfinderMob::SPEED_MODIFIER_FLEEING = (new AttributeModifier(eModifierId_MOB_FLEEING, 2.0f, AttributeModifier::OPERATION_MULTIPLY_TOTAL))->setSerialize(false); PathfinderMob::PathfinderMob(Level *level) : Mob( level ) { @@ -14,6 +19,11 @@ PathfinderMob::PathfinderMob(Level *level) : Mob( level ) attackTarget = nullptr; holdGround = false; fleeTime = 0; + + restrictRadius = -1; + restrictCenter = new Pos(0, 0, 0); + addedLeashRestrictionGoal = false; + leashRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0f); } bool PathfinderMob::shouldHoldGround() @@ -24,11 +34,20 @@ bool PathfinderMob::shouldHoldGround() PathfinderMob::~PathfinderMob() { delete path; + delete restrictCenter; + delete leashRestrictionGoal; } void PathfinderMob::serverAiStep() { - if (fleeTime > 0) fleeTime--; + if (fleeTime > 0) + { + if (--fleeTime == 0) + { + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + speed->removeModifier(SPEED_MODIFIER_FLEEING); + } + } holdGround = shouldHoldGround(); float maxDist = 16; @@ -124,7 +143,7 @@ void PathfinderMob::serverAiStep() double yd = target->y - yFloor; float yRotD = (float) (atan2(zd, xd) * 180 / PI) - 90; float rotDiff = Mth::wrapDegrees(yRotD - yRot); - yya = runSpeed; + yya = (float) getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->getValue(); if (rotDiff > MAX_TURN) { rotDiff = MAX_TURN; @@ -161,7 +180,7 @@ void PathfinderMob::serverAiStep() lookAt(attackTarget, 30, 30); } - if (this->horizontalCollision && !isPathFinding()) jumping = true; + if (horizontalCollision && !isPathFinding()) jumping = true; if (random->nextFloat() < 0.8f && (inWater || inLava)) jumping = true; } @@ -250,12 +269,108 @@ void PathfinderMob::setAttackTarget(shared_ptr attacker) attackTarget = attacker; } -float PathfinderMob::getWalkingSpeedModifier() +// might move to navigation, might make area +bool PathfinderMob::isWithinRestriction() +{ + return isWithinRestriction(Mth::floor(x), Mth::floor(y), Mth::floor(z)); +} + +bool PathfinderMob::isWithinRestriction(int x, int y, int z) +{ + if (restrictRadius == -1) return true; + return restrictCenter->distSqr(x, y, z) < restrictRadius * restrictRadius; +} + +void PathfinderMob::restrictTo(int x, int y, int z, int radius) +{ + restrictCenter->set(x, y, z); + restrictRadius = radius; +} + +Pos *PathfinderMob::getRestrictCenter() +{ + return restrictCenter; +} + +float PathfinderMob::getRestrictRadius() +{ + return restrictRadius; +} + +void PathfinderMob::clearRestriction() +{ + restrictRadius = -1; +} + +bool PathfinderMob::hasRestriction() +{ + return restrictRadius != -1; +} + +void PathfinderMob::tickLeash() +{ + Mob::tickLeash(); + + if (isLeashed() && getLeashHolder() != NULL && getLeashHolder()->level == this->level) + { + // soft restriction + shared_ptr leashHolder = getLeashHolder(); + restrictTo((int) leashHolder->x, (int) leashHolder->y, (int) leashHolder->z, 5); + + float _distanceTo = distanceTo(leashHolder); + + shared_ptr tamabaleAnimal = shared_from_this()->instanceof(eTYPE_TAMABLE_ANIMAL) ? dynamic_pointer_cast(shared_from_this()) : nullptr; + if ( (tamabaleAnimal != NULL) && tamabaleAnimal->isSitting() ) + { + if (_distanceTo > 10) + { + dropLeash(true, true); + } + return; + } + + if (!addedLeashRestrictionGoal) + { + goalSelector.addGoal(2, leashRestrictionGoal, false); + getNavigation()->setAvoidWater(false); + addedLeashRestrictionGoal = true; + } + + onLeashDistance(_distanceTo); + + if (_distanceTo > 4) + { + // harder restriction + getNavigation()->moveTo(leashHolder, 1.0); + } + if (_distanceTo > 6) + { + // hardest restriction + double dx = (leashHolder->x - x) / _distanceTo; + double dy = (leashHolder->y - y) / _distanceTo; + double dz = (leashHolder->z - z) / _distanceTo; + + xd += dx * abs(dx) * .4; + yd += dy * abs(dy) * .4; + zd += dz * abs(dz) * .4; + } + if (_distanceTo > 10) + { + dropLeash(true, true); + } + + } + else if (!isLeashed() && addedLeashRestrictionGoal) + { + addedLeashRestrictionGoal = false; + goalSelector.removeGoal(leashRestrictionGoal); + getNavigation()->setAvoidWater(true); + clearRestriction(); + } +} + +void PathfinderMob::onLeashDistance(float distanceToLeashHolder) { - if (useNewAi()) return 1.0f; - float speed = Mob::getWalkingSpeedModifier(); - if (fleeTime > 0) speed *= 2; - return speed; } bool PathfinderMob::couldWander() diff --git a/Minecraft.World/PathfinderMob.h b/Minecraft.World/PathfinderMob.h index fdbadf8c..1f2b86c7 100644 --- a/Minecraft.World/PathfinderMob.h +++ b/Minecraft.World/PathfinderMob.h @@ -7,6 +7,9 @@ class Path; class PathfinderMob : public Mob { +public: + static AttributeModifier *SPEED_MODIFIER_FLEEING; + private: static const int MAX_TURN = 30; @@ -22,6 +25,13 @@ protected: bool holdGround; int fleeTime; +private: + Pos *restrictCenter; + float restrictRadius; + Goal *leashRestrictionGoal; + bool addedLeashRestrictionGoal; + +protected: virtual bool shouldHoldGround(); virtual void serverAiStep(); virtual void findRandomStrollLocation(int quadrant = -1); @@ -35,13 +45,23 @@ protected: public: virtual bool canSpawn(); - bool isPathFinding(); - void setPath(Path *path); - shared_ptr getAttackTarget(); - void setAttackTarget(shared_ptr attacker); + virtual bool isPathFinding(); + virtual void setPath(Path *path); + virtual shared_ptr getAttackTarget(); + virtual void setAttackTarget(shared_ptr attacker); + + // might move to navigation, might make area + virtual bool isWithinRestriction(); + virtual bool isWithinRestriction(int x, int y, int z); + virtual void restrictTo(int x, int y, int z, int radius); + virtual Pos *getRestrictCenter(); + virtual float getRestrictRadius(); + virtual void clearRestriction(); + virtual bool hasRestriction(); protected: - float getWalkingSpeedModifier(); + void tickLeash(); + void onLeashDistance(float distanceToLeashHolder); // 4J added public: diff --git a/Minecraft.World/PickaxeItem.cpp b/Minecraft.World/PickaxeItem.cpp index 5876b9bb..05177e7b 100644 --- a/Minecraft.World/PickaxeItem.cpp +++ b/Minecraft.World/PickaxeItem.cpp @@ -2,37 +2,37 @@ #include "net.minecraft.world.level.tile.h" #include "PickaxeItem.h" -TileArray *PickaxeItem::diggables = NULL; +TileArray PickaxeItem::diggables; void PickaxeItem::staticCtor() { - PickaxeItem::diggables = new TileArray( PICKAXE_DIGGABLES); - diggables->data[0] = Tile::stoneBrick; - diggables->data[1] = Tile::stoneSlab; - diggables->data[2] = Tile::stoneSlabHalf; - diggables->data[3] = Tile::rock; - diggables->data[4] = Tile::sandStone; - diggables->data[5] = Tile::mossStone; - diggables->data[6] = Tile::ironOre; - diggables->data[7] = Tile::ironBlock; - diggables->data[8] = Tile::coalOre; - diggables->data[9] = Tile::goldBlock; - diggables->data[10] = Tile::goldOre; - diggables->data[11] = Tile::diamondOre; - diggables->data[12] = Tile::diamondBlock; - diggables->data[13] = Tile::ice; - diggables->data[14] = Tile::hellRock; - diggables->data[15] = Tile::lapisOre; - diggables->data[16] = Tile::lapisBlock; - // 4J - brought forward from 1.2.3 - diggables->data[17] = Tile::redStoneOre; - diggables->data[18] = Tile::redStoneOre_lit; - diggables->data[19] = Tile::rail; - diggables->data[20] = Tile::detectorRail; - diggables->data[21] = Tile::goldenRail; + PickaxeItem::diggables = TileArray( PICKAXE_DIGGABLES); + diggables.data[0] = Tile::cobblestone; + diggables.data[1] = Tile::stoneSlab; + diggables.data[2] = Tile::stoneSlabHalf; + diggables.data[3] = Tile::stone; + diggables.data[4] = Tile::sandStone; + diggables.data[5] = Tile::mossyCobblestone; + diggables.data[6] = Tile::ironOre; + diggables.data[7] = Tile::ironBlock; + diggables.data[8] = Tile::coalOre; + diggables.data[9] = Tile::goldBlock; + diggables.data[10] = Tile::goldOre; + diggables.data[11] = Tile::diamondOre; + diggables.data[12] = Tile::diamondBlock; + diggables.data[13] = Tile::ice; + diggables.data[14] = Tile::netherRack; + diggables.data[15] = Tile::lapisOre; + diggables.data[16] = Tile::lapisBlock; + diggables.data[17] = Tile::redStoneOre; + diggables.data[18] = Tile::redStoneOre_lit; + diggables.data[19] = Tile::rail; + diggables.data[20] = Tile::detectorRail; + diggables.data[21] = Tile::goldenRail; + diggables.data[21] = Tile::activatorRail; } -PickaxeItem::PickaxeItem(int id, const Tier *tier) : DiggerItem(id, 2, tier, diggables) +PickaxeItem::PickaxeItem(int id, const Tier *tier) : DiggerItem(id, 2, tier, &diggables) { } @@ -54,9 +54,9 @@ bool PickaxeItem::canDestroySpecial(Tile *tile) // 4J - brought forward from 1.2.3 float PickaxeItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { - if (tile != NULL && (tile->material == Material::metal || tile->material == Material::heavyMetal || tile->material == Material::stone)) + if (tile != NULL && (tile->material == Material::metal || tile->material == Material::heavyMetal || tile->material == Material::stone)) { - return speed; - } - return DiggerItem::getDestroySpeed(itemInstance, tile); + return speed; + } + return DiggerItem::getDestroySpeed(itemInstance, tile); } diff --git a/Minecraft.World/PickaxeItem.h b/Minecraft.World/PickaxeItem.h index 52dac510..36caf49a 100644 --- a/Minecraft.World/PickaxeItem.h +++ b/Minecraft.World/PickaxeItem.h @@ -2,12 +2,12 @@ #include "DiggerItem.h" -#define PICKAXE_DIGGABLES 22 +#define PICKAXE_DIGGABLES 23 class PickaxeItem : public DiggerItem { private: - static TileArray *diggables; + static TileArray diggables; public: // static void staticCtor(); diff --git a/Minecraft.World/Pig.cpp b/Minecraft.World/Pig.cpp index b556a936..cc042f58 100644 --- a/Minecraft.World/Pig.cpp +++ b/Minecraft.World/Pig.cpp @@ -6,6 +6,7 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.item.h" @@ -23,23 +24,20 @@ Pig::Pig(Level *level) : Animal( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_PIG; // 4J - was L"/mob/pig.png"; - this->setSize(0.9f, 0.9f); + setSize(0.9f, 0.9f); getNavigation()->setAvoidWater(true); - float walkSpeed = 0.25f; goalSelector.addGoal(0, new FloatGoal(this)); - goalSelector.addGoal(1, new PanicGoal(this, 0.38f)); - goalSelector.addGoal(2, controlGoal = new ControlledByPlayerGoal(this, 0.34f, walkSpeed)); - goalSelector.addGoal(3, new BreedGoal(this, walkSpeed)); - goalSelector.addGoal(4, new TemptGoal(this, 0.3f, Item::carrotOnAStick_Id, false)); - goalSelector.addGoal(4, new TemptGoal(this, 0.25f, Item::carrots_Id, false)); - goalSelector.addGoal(5, new FollowParentGoal(this, 0.28f)); - goalSelector.addGoal(6, new RandomStrollGoal(this, walkSpeed)); + goalSelector.addGoal(1, new PanicGoal(this, 1.25)); + goalSelector.addGoal(2, controlGoal = new ControlledByPlayerGoal(this, 0.3f, 0.25f)); + goalSelector.addGoal(3, new BreedGoal(this, 1.0)); + goalSelector.addGoal(4, new TemptGoal(this, 1.2, Item::carrotOnAStick_Id, false)); + goalSelector.addGoal(4, new TemptGoal(this, 1.2, Item::carrots_Id, false)); + goalSelector.addGoal(5, new FollowParentGoal(this, 1.1)); + goalSelector.addGoal(6, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(7, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(8, new RandomLookAroundGoal(this)); } @@ -49,9 +47,17 @@ bool Pig::useNewAi() return true; } -int Pig::getMaxHealth() +void Pig::registerAttributes() +{ + Animal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(10); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); +} + +void Pig::newServerAiStep() { - return 10; + Animal::newServerAiStep(); } bool Pig::canBeControlledByRider() @@ -94,9 +100,14 @@ int Pig::getDeathSound() return eSoundType_MOB_PIG_DEATH; } -bool Pig::interact(shared_ptr player) +void Pig::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_PIG_STEP, 0.15f, 1); +} + +bool Pig::mobInteract(shared_ptr player) { - if(!Animal::interact(player)) + if(!Animal::mobInteract(player)) { if (hasSaddle() && !level->isClientSide && (rider.lock() == NULL || rider.lock() == player)) { @@ -162,7 +173,7 @@ void Pig::thunderHit(const LightningBolt *lightningBolt) void Pig::causeFallDamage(float distance) { Animal::causeFallDamage(distance); - if (distance > 5 && dynamic_pointer_cast( rider.lock() ) != NULL) + if ( (distance > 5) && rider.lock() != NULL && rider.lock()->instanceof(eTYPE_PLAYER) ) { (dynamic_pointer_cast(rider.lock()))->awardStat(GenericStats::flyPig(),GenericStats::param_flyPig()); } diff --git a/Minecraft.World/Pig.h b/Minecraft.World/Pig.h index adcfbf4e..9b7183da 100644 --- a/Minecraft.World/Pig.h +++ b/Minecraft.World/Pig.h @@ -21,7 +21,12 @@ public: Pig(Level *level); virtual bool useNewAi(); - virtual int getMaxHealth(); + +protected: + virtual void registerAttributes(); + virtual void newServerAiStep(); + +public: virtual bool canBeControlledByRider(); protected: @@ -35,9 +40,10 @@ protected: virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); + virtual void playStepSound(int xt, int yt, int zt, int t); public: - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); protected: virtual int getDeathLoot(); diff --git a/Minecraft.World/PigZombie.cpp b/Minecraft.World/PigZombie.cpp index cc060484..7a736c9a 100644 --- a/Minecraft.World/PigZombie.cpp +++ b/Minecraft.World/PigZombie.cpp @@ -3,7 +3,9 @@ #include "net.minecraft.world.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.phys.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.enchantment.h" #include "net.minecraft.world.entity.item.h" @@ -12,38 +14,31 @@ #include "..\Minecraft.Client\Textures.h" #include "SoundTypes.h" - - -shared_ptr PigZombie::sword; - -void PigZombie::staticCtor() -{ - PigZombie::sword = shared_ptr( new ItemInstance(Item::sword_gold, 1) ); -} +AttributeModifier *PigZombie::SPEED_MODIFIER_ATTACKING = (new AttributeModifier(eModifierId_MOB_PIG_ATTACKSPEED, 0.45, AttributeModifier::OPERATION_ADDITION))->setSerialize(false); void PigZombie::_init() { + registerAttributes(); + angerTime = 0; playAngrySoundIn = 0; + lastAttackTarget = nullptr; } PigZombie::PigZombie(Level *level) : Zombie( level ) { - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that - // the derived version of the function is called - - // 4J Stu - Zombie has already called this, and we don't override it so the Zombie one is the most derived version anyway - //this->defineSynchedData(); + _init(); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + fireImmune = true; +} - _init(); +void PigZombie::registerAttributes() +{ + Zombie::registerAttributes(); - this->textureIdx = TN_MOB_PIGZOMBIE; // 4J was L"/mob/pigzombie.png"; - runSpeed = 0.5f; - attackDamage = 5; - this->fireImmune = true; + getAttribute(SPAWN_REINFORCEMENTS_CHANCE)->setBaseValue(0); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.5f); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(5); } bool PigZombie::useNewAi() @@ -51,39 +46,45 @@ bool PigZombie::useNewAi() return false; } -int PigZombie::getTexture() -{ - return textureIdx; -} - void PigZombie::tick() { - runSpeed = attackTarget != NULL ? 0.95f : 0.5f; - if (playAngrySoundIn > 0) + if (lastAttackTarget != attackTarget && !level->isClientSide) + { + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + speed->removeModifier(SPEED_MODIFIER_ATTACKING); + + if (attackTarget != NULL) + { + speed->addModifier(new AttributeModifier(*SPEED_MODIFIER_ATTACKING)); + } + } + lastAttackTarget = attackTarget; + + if (playAngrySoundIn > 0) { - if (--playAngrySoundIn == 0) + if (--playAngrySoundIn == 0) { - level->playSound(shared_from_this(), eSoundType_MOB_ZOMBIEPIG_ZPIGANGRY, getSoundVolume() * 2, ((random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f) * 1.8f); - } - } - Zombie::tick(); + playSound(eSoundType_MOB_ZOMBIEPIG_ZPIGANGRY, getSoundVolume() * 2, ((random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f) * 1.8f); + } + } + Zombie::tick(); } bool PigZombie::canSpawn() { - return level->difficulty > Difficulty::PEACEFUL && level->isUnobstructed(bb) && level->getCubes(shared_from_this(), bb)->empty() && !level->containsAnyLiquid(bb); + return level->difficulty > Difficulty::PEACEFUL && level->isUnobstructed(bb) && level->getCubes(shared_from_this(), bb)->empty() && !level->containsAnyLiquid(bb); } void PigZombie::addAdditonalSaveData(CompoundTag *tag) { - Zombie::addAdditonalSaveData(tag); - tag->putShort(L"Anger", (short) angerTime); + Zombie::addAdditonalSaveData(tag); + tag->putShort(L"Anger", (short) angerTime); } void PigZombie::readAdditionalSaveData(CompoundTag *tag) { - Zombie::readAdditionalSaveData(tag); - angerTime = tag->getShort(L"Anger"); + Zombie::readAdditionalSaveData(tag); + angerTime = tag->getShort(L"Anger"); } shared_ptr PigZombie::findAttackTarget() @@ -97,51 +98,51 @@ shared_ptr PigZombie::findAttackTarget() #endif #endif - if (angerTime == 0) return nullptr; - return Zombie::findAttackTarget(); + if (angerTime == 0) return nullptr; + return Zombie::findAttackTarget(); } -bool PigZombie::hurt(DamageSource *source, int dmg) +bool PigZombie::hurt(DamageSource *source, float dmg) { shared_ptr sourceEntity = source->getEntity(); - if (dynamic_pointer_cast(sourceEntity) != NULL) + if ( sourceEntity != NULL && sourceEntity->instanceof(eTYPE_PLAYER) ) { - vector > *nearby = level->getEntities( shared_from_this(), bb->grow(32, 32, 32)); + vector > *nearby = level->getEntities( shared_from_this(), bb->grow(32, 32, 32)); AUTO_VAR(itEnd, nearby->end()); for (AUTO_VAR(it, nearby->begin()); it != itEnd; it++) { - shared_ptr e = *it; //nearby->at(i); - if (dynamic_pointer_cast(e) != NULL) + shared_ptr e = *it; //nearby->at(i); + if ( e->instanceof(eTYPE_PIGZOMBIE) ) { - shared_ptr pigZombie = dynamic_pointer_cast(e); - pigZombie->alert(sourceEntity); - } - } - alert(sourceEntity); - } - return Zombie::hurt(source, dmg); + shared_ptr pigZombie = dynamic_pointer_cast(e); + pigZombie->alert(sourceEntity); + } + } + alert(sourceEntity); + } + return Zombie::hurt(source, dmg); } void PigZombie::alert(shared_ptr target) { - this->attackTarget = target; - angerTime = 20 * 20 + random->nextInt(20 * 20); - playAngrySoundIn = random->nextInt(20 * 2); + attackTarget = target; + angerTime = 20 * 20 + random->nextInt(20 * 20); + playAngrySoundIn = random->nextInt(20 * 2); } int PigZombie::getAmbientSound() { - return eSoundType_MOB_ZOMBIEPIG_AMBIENT; + return eSoundType_MOB_ZOMBIEPIG_AMBIENT; } int PigZombie::getHurtSound() { - return eSoundType_MOB_ZOMBIEPIG_HURT; + return eSoundType_MOB_ZOMBIEPIG_HURT; } int PigZombie::getDeathSound() { - return eSoundType_MOB_ZOMBIEPIG_DEATH; + return eSoundType_MOB_ZOMBIEPIG_DEATH; } void PigZombie::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) @@ -158,45 +159,29 @@ void PigZombie::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) } } +bool PigZombie::mobInteract(shared_ptr player) +{ + return false; +} + void PigZombie::dropRareDeathLoot(int rareLootLevel) { - if (rareLootLevel > 0) - { - shared_ptr sword = shared_ptr( new ItemInstance(Item::sword_gold) ); - EnchantmentHelper::enchantItem(random, sword, 5); - spawnAtLocation(sword, 0); - } - else - { - int select = random->nextInt(3); - if (select == 0) - { - spawnAtLocation(Item::goldIngot_Id, 1); - } - else if (select == 1) - { - spawnAtLocation(Item::sword_gold_Id, 1); - } - else if (select == 2) - { - spawnAtLocation(Item::helmet_gold_Id, 1); - } - } + spawnAtLocation(Item::goldIngot_Id, 1); } int PigZombie::getDeathLoot() { - return Item::rotten_flesh_Id; + return Item::rotten_flesh_Id; } -void PigZombie::finalizeMobSpawn() +void PigZombie::populateDefaultEquipmentSlots() { - Zombie::finalizeMobSpawn(); - setVillager(false); + setEquippedSlot(SLOT_WEAPON, shared_ptr( new ItemInstance(Item::sword_gold)) ); } -shared_ptr PigZombie::getCarriedItem() +MobGroupData *PigZombie::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param { - // TODO 4J - could be of const shared_ptr type. - return (shared_ptr ) sword; -} + Zombie::finalizeMobSpawn(groupData); + setVillager(false); + return groupData; +} \ No newline at end of file diff --git a/Minecraft.World/PigZombie.h b/Minecraft.World/PigZombie.h index b47efacb..21ccd49e 100644 --- a/Minecraft.World/PigZombie.h +++ b/Minecraft.World/PigZombie.h @@ -13,8 +13,11 @@ public: static Entity *create(Level *level) { return new PigZombie(level); } private: + static AttributeModifier *SPEED_MODIFIER_ATTACKING; + int angerTime; - int playAngrySoundIn; + int playAngrySoundIn; + shared_ptr lastAttackTarget; void _init(); @@ -22,20 +25,20 @@ public: PigZombie(Level *level); protected: - bool useNewAi(); + virtual void registerAttributes(); + virtual bool useNewAi(); public: - virtual int getTexture(); - virtual void tick(); - virtual bool canSpawn(); - virtual void addAdditonalSaveData(CompoundTag *tag); - virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void tick(); + virtual bool canSpawn(); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditionalSaveData(CompoundTag *tag); protected: virtual shared_ptr findAttackTarget(); public: - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); private: void alert(shared_ptr target); @@ -45,16 +48,16 @@ protected: virtual int getHurtSound(); virtual int getDeathSound(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); - virtual void dropRareDeathLoot(int rareLootLevel); - virtual int getDeathLoot(); - -private: - static shared_ptr sword; public: - virtual void finalizeMobSpawn(); + virtual bool mobInteract(shared_ptr player); - shared_ptr getCarriedItem(); +protected: + virtual void dropRareDeathLoot(int rareLootLevel); + virtual int getDeathLoot(); + virtual void populateDefaultEquipmentSlots(); - static void staticCtor(); + +public: + virtual MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param }; diff --git a/Minecraft.World/PistonBaseTile.cpp b/Minecraft.World/PistonBaseTile.cpp index cbad5cec..c71bbf95 100644 --- a/Minecraft.World/PistonBaseTile.cpp +++ b/Minecraft.World/PistonBaseTile.cpp @@ -41,9 +41,9 @@ PistonBaseTile::PistonBaseTile(int id, bool isSticky) : Tile(id, Material::pisto // 4J - added initialiser ignoreUpdate(false); - this->isSticky = isSticky; - setSoundType(SOUND_STONE); - setDestroyTime(0.5f); + this->isSticky = isSticky; + setSoundType(SOUND_STONE); + setDestroyTime(0.5f); iconInside = NULL; iconBack = NULL; @@ -52,7 +52,7 @@ PistonBaseTile::PistonBaseTile(int id, bool isSticky) : Tile(id, Material::pisto Icon *PistonBaseTile::getPlatformTexture() { - return iconPlatform; + return iconPlatform; } void PistonBaseTile::updateShape(float x0, float y0, float z0, float x1, float y1, float z1) @@ -62,32 +62,32 @@ void PistonBaseTile::updateShape(float x0, float y0, float z0, float x1, float y Icon *PistonBaseTile::getTexture(int face, int data) { - int facing = getFacing(data); + int facing = getFacing(data); - if (facing > 5) + if (facing > 5) { - return iconPlatform; - } + return iconPlatform; + } - if (face == facing) + if (face == facing) { - // sorry about this mess... - // when the piston is extended, either normally - // or because a piston arm animation, the top - // texture is the furnace bottom + // sorry about this mess... + // when the piston is extended, either normally + // or because a piston arm animation, the top + // texture is the furnace bottom ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); - if (isExtended(data) || tls->xx0 > 0 || tls->yy0 > 0 || tls->zz0 > 0 || tls->xx1 < 1 || tls->yy1 < 1 || tls->zz1 < 1) + if (isExtended(data) || tls->xx0 > 0 || tls->yy0 > 0 || tls->zz0 > 0 || tls->xx1 < 1 || tls->yy1 < 1 || tls->zz1 < 1) { - return iconInside; - } - return iconPlatform; - } - if (face == Facing::OPPOSITE_FACING[facing]) + return iconInside; + } + return iconPlatform; + } + if (face == Facing::OPPOSITE_FACING[facing]) { - return iconBack; - } + return iconBack; + } - return icon; + return icon; } Icon *PistonBaseTile::getTexture(const wstring &name) @@ -124,107 +124,112 @@ bool PistonBaseTile::use(Level *level, int x, int y, int z, shared_ptr p return false; } -void PistonBaseTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void PistonBaseTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { - int targetData = getNewFacing(level, x, y, z, dynamic_pointer_cast(by) ); - level->setData(x, y, z, targetData); - if (!level->isClientSide && !ignoreUpdate()) + int targetData = getNewFacing(level, x, y, z, dynamic_pointer_cast(by) ); + level->setData(x, y, z, targetData, Tile::UPDATE_CLIENTS); + if (!level->isClientSide && !ignoreUpdate()) { - checkIfExtend(level, x, y, z); - } + checkIfExtend(level, x, y, z); + } } void PistonBaseTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (!level->isClientSide && !ignoreUpdate()) + if (!level->isClientSide && !ignoreUpdate()) { - checkIfExtend(level, x, y, z); - } + checkIfExtend(level, x, y, z); + } } void PistonBaseTile::onPlace(Level *level, int x, int y, int z) { - if (!level->isClientSide && level->getTileEntity(x, y, z) == NULL && !ignoreUpdate()) + if (!level->isClientSide && level->getTileEntity(x, y, z) == NULL && !ignoreUpdate()) { - checkIfExtend(level, x, y, z); - } + checkIfExtend(level, x, y, z); + } } void PistonBaseTile::checkIfExtend(Level *level, int x, int y, int z) { - int data = level->getData(x, y, z); - int facing = getFacing(data); + int data = level->getData(x, y, z); + int facing = getFacing(data); - if (facing == UNDEFINED_FACING) + if (facing == UNDEFINED_FACING) { - return; - } - bool extend = getNeighborSignal(level, x, y, z, facing); + return; + } + bool extend = getNeighborSignal(level, x, y, z, facing); - if (extend && !isExtended(data)) + if (extend && !isExtended(data)) { - if (canPush(level, x, y, z, facing)) + if (canPush(level, x, y, z, facing)) { - //level->setDataNoUpdate(x, y, z, facing | EXTENDED_BIT); - level->tileEvent(x, y, z, id, TRIGGER_EXTEND, facing); - } - } + level->tileEvent(x, y, z, id, TRIGGER_EXTEND, facing); + } + } else if (!extend && isExtended(data)) { - //level->setDataNoUpdate(x, y, z, facing); - level->tileEvent(x, y, z, id, TRIGGER_CONTRACT, facing); - } + level->setData(x, y, z, facing, UPDATE_CLIENTS); + level->tileEvent(x, y, z, id, TRIGGER_CONTRACT, facing); + } } /** - * This method checks neighbor signals for this block and the block above, - * and directly beneath. However, it avoids checking blocks that would be - * pushed by this block. - * - * @param level - * @param x - * @param y - * @param z - * @return - */ +* This method checks neighbor signals for this block and the block above, +* and directly beneath. However, it avoids checking blocks that would be +* pushed by this block. +* +* @param level +* @param x +* @param y +* @param z +* @return +*/ bool PistonBaseTile::getNeighborSignal(Level *level, int x, int y, int z, int facing) { - // check adjacent neighbors, but not in push direction - if (facing != Facing::DOWN && level->getSignal(x, y - 1, z, Facing::DOWN)) return true; - if (facing != Facing::UP && level->getSignal(x, y + 1, z, Facing::UP)) return true; - if (facing != Facing::NORTH && level->getSignal(x, y, z - 1, Facing::NORTH)) return true; - if (facing != Facing::SOUTH && level->getSignal(x, y, z + 1, Facing::SOUTH)) return true; - if (facing != Facing::EAST && level->getSignal(x + 1, y, z, Facing::EAST)) return true; - if (facing != Facing::WEST && level->getSignal(x - 1, y, z, Facing::WEST)) return true; - - // check signals above - if (level->getSignal(x, y, z, 0)) return true; - if (level->getSignal(x, y + 2, z, 1)) return true; - if (level->getSignal(x, y + 1, z - 1, 2)) return true; - if (level->getSignal(x, y + 1, z + 1, 3)) return true; - if (level->getSignal(x - 1, y + 1, z, 4)) return true; - if (level->getSignal(x + 1, y + 1, z, 5)) return true; - - return false; + // check adjacent neighbors, but not in push direction + if (facing != Facing::DOWN && level->hasSignal(x, y - 1, z, Facing::DOWN)) return true; + if (facing != Facing::UP && level->hasSignal(x, y + 1, z, Facing::UP)) return true; + if (facing != Facing::NORTH && level->hasSignal(x, y, z - 1, Facing::NORTH)) return true; + if (facing != Facing::SOUTH && level->hasSignal(x, y, z + 1, Facing::SOUTH)) return true; + if (facing != Facing::EAST && level->hasSignal(x + 1, y, z, Facing::EAST)) return true; + if (facing != Facing::WEST && level->hasSignal(x - 1, y, z, Facing::WEST)) return true; + + // check signals above + if (level->hasSignal(x, y, z, 0)) return true; + if (level->hasSignal(x, y + 2, z, 1)) return true; + if (level->hasSignal(x, y + 1, z - 1, 2)) return true; + if (level->hasSignal(x, y + 1, z + 1, 3)) return true; + if (level->hasSignal(x - 1, y + 1, z, 4)) return true; + if (level->hasSignal(x + 1, y + 1, z, 5)) return true; + + return false; } -void PistonBaseTile::triggerEvent(Level *level, int x, int y, int z, int param1, int facing) +bool PistonBaseTile::triggerEvent(Level *level, int x, int y, int z, int param1, int facing) { ignoreUpdate(true); - if (param1 == TRIGGER_EXTEND) - { - level->setDataNoUpdate(x, y, z, facing | EXTENDED_BIT); - } - else + if (!level->isClientSide) { - level->setDataNoUpdate(x, y, z, facing); + bool extend = getNeighborSignal(level, x, y, z, facing); + + if (extend && param1 == TRIGGER_CONTRACT) + { + level->setData(x, y, z, facing | EXTENDED_BIT, UPDATE_CLIENTS); + return false; + } + else if (!extend && param1 == TRIGGER_EXTEND) + { + return false; + } } - if (param1 == TRIGGER_EXTEND) + if (param1 == TRIGGER_EXTEND) { PIXBeginNamedEvent(0,"Create push\n"); - if (createPush(level, x, y, z, facing)) + if (createPush(level, x, y, z, facing)) { // 4J - it is (currently) critical that this setData sends data to the client, so have added a bool to the method so that it sends data even if the data was already set to the same value // as before, which was actually its behaviour until a change in 1.0.1 meant that setData only conditionally sent updates to listeners. If the data update Isn't sent, then what @@ -237,139 +242,140 @@ void PistonBaseTile::triggerEvent(Level *level, int x, int y, int z, int param1, // We really need to spend some time investigating a better way for pistons to work as it all seems a bit scary how the host/client interact, but forcing this to send should at least // restore the behaviour of the pistons to something closer to what they were before the 1.0.1 update. By sending this data update, then (4) in the list above doesn't happen // because the client does actually receive an update for this tile from the host after the event has been processed on the cient. - level->setData(x, y, z, facing | EXTENDED_BIT, true); - level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_TILE_PISTON_OUT, 0.5f, level->random->nextFloat() * 0.25f + 0.6f); - } + level->setData(x, y, z, facing | EXTENDED_BIT, Tile::UPDATE_CLIENTS, true); + level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_TILE_PISTON_OUT, 0.5f, level->random->nextFloat() * 0.25f + 0.6f); + } else { - level->setDataNoUpdate(x, y, z, facing); + return false; } PIXEndNamedEvent(); - } + } else if (param1 == TRIGGER_CONTRACT) { PIXBeginNamedEvent(0,"Contract phase A\n"); - shared_ptr prevTileEntity = level->getTileEntity(x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing]); - if (prevTileEntity != NULL && dynamic_pointer_cast(prevTileEntity) != NULL) + shared_ptr prevTileEntity = level->getTileEntity(x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing]); + if (prevTileEntity != NULL && dynamic_pointer_cast(prevTileEntity) != NULL) { - dynamic_pointer_cast(prevTileEntity)->finalTick(); - } + dynamic_pointer_cast(prevTileEntity)->finalTick(); + } stopSharingIfServer(level, x, y, z); // 4J added - level->setTileAndDataNoUpdate(x, y, z, Tile::pistonMovingPiece_Id, facing); - level->setTileEntity(x, y, z, PistonMovingPiece::newMovingPieceEntity(id, facing, facing, false, true)); + level->setTileAndData(x, y, z, Tile::pistonMovingPiece_Id, facing, Tile::UPDATE_ALL); + level->setTileEntity(x, y, z, PistonMovingPiece::newMovingPieceEntity(id, facing, facing, false, true)); PIXEndNamedEvent(); - // sticky movement - if (isSticky) + // sticky movement + if (isSticky) { PIXBeginNamedEvent(0,"Contract sticky phase A\n"); - int twoX = x + Facing::STEP_X[facing] * 2; - int twoY = y + Facing::STEP_Y[facing] * 2; - int twoZ = z + Facing::STEP_Z[facing] * 2; - int block = level->getTile(twoX, twoY, twoZ); - int blockData = level->getData(twoX, twoY, twoZ); - bool pistonPiece = false; + int twoX = x + Facing::STEP_X[facing] * 2; + int twoY = y + Facing::STEP_Y[facing] * 2; + int twoZ = z + Facing::STEP_Z[facing] * 2; + int block = level->getTile(twoX, twoY, twoZ); + int blockData = level->getData(twoX, twoY, twoZ); + bool pistonPiece = false; PIXEndNamedEvent(); - if (block == Tile::pistonMovingPiece_Id) + if (block == Tile::pistonMovingPiece_Id) { PIXBeginNamedEvent(0,"Contract sticky phase B\n"); - // the block two steps away is a moving piston block piece, - // so replace it with the real data, since it's probably - // this piston which is changing too fast - shared_ptr tileEntity = level->getTileEntity(twoX, twoY, twoZ); - if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL ) + // the block two steps away is a moving piston block piece, so replace it with the real data, + // since it's probably this piston which is changing too fast + shared_ptr tileEntity = level->getTileEntity(twoX, twoY, twoZ); + if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL ) { - shared_ptr ppe = dynamic_pointer_cast(tileEntity); + shared_ptr ppe = dynamic_pointer_cast(tileEntity); - if (ppe->getFacing() == facing && ppe->isExtending()) + if (ppe->getFacing() == facing && ppe->isExtending()) { - // force the tile to air before pushing - ppe->finalTick(); - block = ppe->getId(); - blockData = ppe->getData(); - pistonPiece = true; - } - } + // force the tile to air before pushing + ppe->finalTick(); + block = ppe->getId(); + blockData = ppe->getData(); + pistonPiece = true; + } + } PIXEndNamedEvent(); - } + } PIXBeginNamedEvent(0,"Contract sticky phase C\n"); - if (!pistonPiece && block > 0 && (isPushable(block, level, twoX, twoY, twoZ, false)) - && (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_NORMAL || block == Tile::pistonBase_Id || block == Tile::pistonStickyBase_Id)) + if (!pistonPiece && block > 0 && (isPushable(block, level, twoX, twoY, twoZ, false)) + && (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_NORMAL || block == Tile::pistonBase_Id || block == Tile::pistonStickyBase_Id)) { stopSharingIfServer(level, twoX, twoY, twoZ); // 4J added - x += Facing::STEP_X[facing]; - y += Facing::STEP_Y[facing]; - z += Facing::STEP_Z[facing]; + x += Facing::STEP_X[facing]; + y += Facing::STEP_Y[facing]; + z += Facing::STEP_Z[facing]; - level->setTileAndDataNoUpdate(x, y, z, Tile::pistonMovingPiece_Id, blockData); - level->setTileEntity(x, y, z, PistonMovingPiece::newMovingPieceEntity(block, blockData, facing, false, false)); + level->setTileAndData(x, y, z, Tile::pistonMovingPiece_Id, blockData, Tile::UPDATE_ALL); + level->setTileEntity(x, y, z, PistonMovingPiece::newMovingPieceEntity(block, blockData, facing, false, false)); ignoreUpdate(false); - level->setTile(twoX, twoY, twoZ, 0); + level->removeTile(twoX, twoY, twoZ); ignoreUpdate(true); } else if (!pistonPiece) { stopSharingIfServer(level, x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing]); // 4J added ignoreUpdate(false); - level->setTile(x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing], 0); + level->removeTile(x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing]); ignoreUpdate(true); - } + } PIXEndNamedEvent(); - } + } else { stopSharingIfServer(level, x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing]); // 4J added ignoreUpdate(false); - level->setTile(x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing], 0); + level->removeTile(x + Facing::STEP_X[facing], y + Facing::STEP_Y[facing], z + Facing::STEP_Z[facing]); ignoreUpdate(true); - } + } - level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_TILE_PISTON_IN, 0.5f, level->random->nextFloat() * 0.15f + 0.6f); - } + level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_TILE_PISTON_IN, 0.5f, level->random->nextFloat() * 0.15f + 0.6f); + } ignoreUpdate(false); + + return true; } void PistonBaseTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - int data = (forceData == -1 ) ? level->getData(x, y, z) : forceData; + int data = (forceData == -1 ) ? level->getData(x, y, z) : forceData; - if (isExtended(data)) + if (isExtended(data)) { - const float thickness = PLATFORM_THICKNESS / 16.0f; - switch (getFacing(data)) + const float thickness = PLATFORM_THICKNESS / 16.0f; + switch (getFacing(data)) { case Facing::DOWN: - setShape(0, thickness, 0, 1, 1, 1); - break; + setShape(0, thickness, 0, 1, 1, 1); + break; case Facing::UP: - setShape(0, 0, 0, 1, 1 - thickness, 1); - break; + setShape(0, 0, 0, 1, 1 - thickness, 1); + break; case Facing::NORTH: - setShape(0, 0, thickness, 1, 1, 1); - break; + setShape(0, 0, thickness, 1, 1, 1); + break; case Facing::SOUTH: - setShape(0, 0, 0, 1, 1, 1 - thickness); - break; + setShape(0, 0, 0, 1, 1, 1 - thickness); + break; case Facing::WEST: - setShape(thickness, 0, 0, 1, 1, 1); - break; + setShape(thickness, 0, 0, 1, 1, 1); + break; case Facing::EAST: - setShape(0, 0, 0, 1 - thickness, 1, 1); - break; - } - } + setShape(0, 0, 0, 1 - thickness, 1, 1); + break; + } + } else { - setShape(0, 0, 0, 1, 1, 1); - } + setShape(0, 0, 0, 1, 1, 1); + } } void PistonBaseTile::updateDefaultShape() @@ -379,8 +385,8 @@ void PistonBaseTile::updateDefaultShape() void PistonBaseTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { - setShape(0, 0, 0, 1, 1, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(0, 0, 0, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); } AABB *PistonBaseTile::getAABB(Level *level, int x, int y, int z) @@ -404,64 +410,68 @@ bool PistonBaseTile::isExtended(int data) return (data & EXTENDED_BIT) != 0; } -int PistonBaseTile::getNewFacing(Level *level, int x, int y, int z, shared_ptr player) +int PistonBaseTile::getNewFacing(Level *level, int x, int y, int z, shared_ptr player) { - if (Mth::abs((float) player->x - x) < 2 && Mth::abs((float) player->z - z) < 2) + if (Mth::abs((float) player->x - x) < 2 && Mth::abs((float) player->z - z) < 2) { - // If the player is above the block, the slot is on the top - double py = player->y + 1.82 - player->heightOffset; - if (py - y > 2) + // If the player is above the block, the slot is on the top + double py = player->y + 1.82 - player->heightOffset; + if (py - y > 2) { - return Facing::UP; - } - // If the player is below the block, the slot is on the bottom - if (y - py > 0) + return Facing::UP; + } + // If the player is below the block, the slot is on the bottom + if (y - py > 0) { - return Facing::DOWN; - } - } - // The slot is on the side - int i = Mth::floor(player->yRot * 4.0f / 360.0f + 0.5) & 0x3; - if (i == 0) return Facing::NORTH; - if (i == 1) return Facing::EAST; - if (i == 2) return Facing::SOUTH; - if (i == 3) return Facing::WEST; - return 0; + return Facing::DOWN; + } + } + // The slot is on the side + int i = Mth::floor(player->yRot * 4.0f / 360.0f + 0.5) & 0x3; + if (i == 0) return Facing::NORTH; + if (i == 1) return Facing::EAST; + if (i == 2) return Facing::SOUTH; + if (i == 3) return Facing::WEST; + return 0; } bool PistonBaseTile::isPushable(int block, Level *level, int cx, int cy, int cz, bool allowDestroyable) { - // special case for obsidian - if (block == Tile::obsidian_Id) + // special case for obsidian + if (block == Tile::obsidian_Id) { - return false; - } + return false; + } - if (block == Tile::pistonBase_Id || block == Tile::pistonStickyBase_Id) + if (block == Tile::pistonBase_Id || block == Tile::pistonStickyBase_Id) { - // special case for piston bases - if (isExtended(level->getData(cx, cy, cz))) + // special case for piston bases + if (isExtended(level->getData(cx, cy, cz))) { - return false; - } - } + return false; + } + } else { - if (Tile::tiles[block]->getDestroySpeed(level, cx, cy, cz) == Tile::INDESTRUCTIBLE_DESTROY_TIME) + if (Tile::tiles[block]->getDestroySpeed(level, cx, cy, cz) == Tile::INDESTRUCTIBLE_DESTROY_TIME) { - return false; - } + return false; + } - if (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_BLOCK) + if (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_BLOCK) { - return false; - } - - if (!allowDestroyable && Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_DESTROY) + return false; + } + + if (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_DESTROY) { - return false; - } - } + if(!allowDestroyable) + { + return false; + } + return true; + } + } if( Tile::tiles[block]->isEntityTile() ) // 4J - java uses instanceof EntityTile here { @@ -474,19 +484,19 @@ bool PistonBaseTile::isPushable(int block, Level *level, int cx, int cy, int cz, bool PistonBaseTile::canPush(Level *level, int sx, int sy, int sz, int facing) { - int cx = sx + Facing::STEP_X[facing]; - int cy = sy + Facing::STEP_Y[facing]; - int cz = sz + Facing::STEP_Z[facing]; + int cx = sx + Facing::STEP_X[facing]; + int cy = sy + Facing::STEP_Y[facing]; + int cz = sz + Facing::STEP_Z[facing]; - for (int i = 0; i < MAX_PUSH_DEPTH + 1; i++) + for (int i = 0; i < MAX_PUSH_DEPTH + 1; i++) { if (cy <= 0 || cy >= (Level::maxBuildHeight - 1)) { - // out of bounds - return false; - } - + // out of bounds + return false; + } + // 4J - added to also check for out of bounds in x/z for our finite world int minXZ = - (level->dimension->getXZSize() * 16 ) / 2; int maxXZ = (level->dimension->getXZSize() * 16 ) / 2 - 1; @@ -494,35 +504,35 @@ bool PistonBaseTile::canPush(Level *level, int sx, int sy, int sz, int facing) { return false; } - int block = level->getTile(cx, cy, cz); - if (block == 0) + int block = level->getTile(cx, cy, cz); + if (block == 0) { - break; - } + break; + } - if (!isPushable(block, level, cx, cy, cz, true)) + if (!isPushable(block, level, cx, cy, cz, true)) { - return false; - } + return false; + } - if (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_DESTROY) + if (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_DESTROY) { - break; - } + break; + } - if (i == MAX_PUSH_DEPTH) + if (i == MAX_PUSH_DEPTH) { - // we've reached the maximum push depth - // without finding air or a breakable block - return false; - } + // we've reached the maximum push depth + // without finding air or a breakable block + return false; + } - cx += Facing::STEP_X[facing]; - cy += Facing::STEP_Y[facing]; - cz += Facing::STEP_Z[facing]; - } + cx += Facing::STEP_X[facing]; + cy += Facing::STEP_Y[facing]; + cz += Facing::STEP_Z[facing]; + } - return true; + return true; } @@ -541,18 +551,18 @@ void PistonBaseTile::stopSharingIfServer(Level *level, int x, int y, int z) bool PistonBaseTile::createPush(Level *level, int sx, int sy, int sz, int facing) { - int cx = sx + Facing::STEP_X[facing]; - int cy = sy + Facing::STEP_Y[facing]; - int cz = sz + Facing::STEP_Z[facing]; + int cx = sx + Facing::STEP_X[facing]; + int cy = sy + Facing::STEP_Y[facing]; + int cz = sz + Facing::STEP_Z[facing]; - for (int i = 0; i < MAX_PUSH_DEPTH + 1; i++) + for (int i = 0; i < MAX_PUSH_DEPTH + 1; i++) { if (cy <= 0 || cy >= (Level::maxBuildHeight - 1)) { - // out of bounds - return false; - } - + // out of bounds + return false; + } + // 4J - added to also check for out of bounds in x/z for our finite world int minXZ = - (level->dimension->getXZSize() * 16 ) / 2; int maxXZ = (level->dimension->getXZSize() * 16 ) / 2 - 1; @@ -561,68 +571,91 @@ bool PistonBaseTile::createPush(Level *level, int sx, int sy, int sz, int facing return false; } - int block = level->getTile(cx, cy, cz); - if (block == 0) + int block = level->getTile(cx, cy, cz); + if (block == 0) { - break; - } + break; + } - if (!isPushable(block, level, cx, cy, cz, true)) + if (!isPushable(block, level, cx, cy, cz, true)) { - return false; - } + return false; + } - if (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_DESTROY) + if (Tile::tiles[block]->getPistonPushReaction() == Material::PUSH_DESTROY) { - // this block is destroyed when pushed - Tile::tiles[block]->spawnResources(level, cx, cy, cz, level->getData(cx, cy, cz), 0); - // setting the tile to air is actually superflous, but - // helps vs multiplayer problems + // this block is destroyed when pushed + Tile::tiles[block]->spawnResources(level, cx, cy, cz, level->getData(cx, cy, cz), 0); + // setting the tile to air is actually superflous, but helps vs multiplayer problems stopSharingIfServer(level, cx, cy, cz); // 4J added - level->setTile(cx, cy, cz, 0); - break; - } + level->removeTile(cx, cy, cz); + break; + } - if (i == MAX_PUSH_DEPTH) + if (i == MAX_PUSH_DEPTH) { - // we've reached the maximum push depth - // without finding air or a breakable block - return false; - } + // we've reached the maximum push depth without finding air or a breakable block + return false; + } + + cx += Facing::STEP_X[facing]; + cy += Facing::STEP_Y[facing]; + cz += Facing::STEP_Z[facing]; + } - cx += Facing::STEP_X[facing]; - cy += Facing::STEP_Y[facing]; - cz += Facing::STEP_Z[facing]; - } + int ex = cx; + int ey = cy; + int ez = cz; + int count = 0; + int tiles[MAX_PUSH_DEPTH + 1]; - while (cx != sx || cy != sy || cz != sz) + while (cx != sx || cy != sy || cz != sz) { - int nx = cx - Facing::STEP_X[facing]; - int ny = cy - Facing::STEP_Y[facing]; - int nz = cz - Facing::STEP_Z[facing]; + int nx = cx - Facing::STEP_X[facing]; + int ny = cy - Facing::STEP_Y[facing]; + int nz = cz - Facing::STEP_Z[facing]; - int block = level->getTile(nx, ny, nz); - int data = level->getData(nx, ny, nz); + int block = level->getTile(nx, ny, nz); + int data = level->getData(nx, ny, nz); stopSharingIfServer(level, cx, cy, cz); // 4J added - if (block == id && nx == sx && ny == sy && nz == sz) + if (block == id && nx == sx && ny == sy && nz == sz) { - level->setTileAndDataNoUpdate(cx, cy, cz, Tile::pistonMovingPiece_Id, facing | (isSticky ? PistonExtensionTile::STICKY_BIT : 0), false); - level->setTileEntity(cx, cy, cz, PistonMovingPiece::newMovingPieceEntity(Tile::pistonExtensionPiece_Id, facing | (isSticky ? PistonExtensionTile::STICKY_BIT : 0), facing, true, false)); - } + level->setTileAndData(cx, cy, cz, Tile::pistonMovingPiece_Id, facing | (isSticky ? PistonExtensionTile::STICKY_BIT : 0), Tile::UPDATE_NONE); + level->setTileEntity(cx, cy, cz, PistonMovingPiece::newMovingPieceEntity(Tile::pistonExtensionPiece_Id, facing | (isSticky ? PistonExtensionTile::STICKY_BIT : 0), facing, true, false)); + } else { - level->setTileAndDataNoUpdate(cx, cy, cz, Tile::pistonMovingPiece_Id, data, false); - level->setTileEntity(cx, cy, cz, PistonMovingPiece::newMovingPieceEntity(block, data, facing, true, false)); - } + level->setTileAndData(cx, cy, cz, Tile::pistonMovingPiece_Id, data, Tile::UPDATE_NONE); + level->setTileEntity(cx, cy, cz, PistonMovingPiece::newMovingPieceEntity(block, data, facing, true, false)); + } + tiles[count++] = block; - cx = nx; - cy = ny; - cz = nz; - } + cx = nx; + cy = ny; + cz = nz; + } + + cx = ex; + cy = ey; + cz = ez; + count = 0; - return true; + while (cx != sx || cy != sy || cz != sz) + { + int nx = cx - Facing::STEP_X[facing]; + int ny = cy - Facing::STEP_Y[facing]; + int nz = cz - Facing::STEP_Z[facing]; + + level->updateNeighborsAt(nx, ny, nz, tiles[count++]); + + cx = nx; + cy = ny; + cz = nz; + } + + return true; } diff --git a/Minecraft.World/PistonBaseTile.h b/Minecraft.World/PistonBaseTile.h index 0fda1391..59c2e833 100644 --- a/Minecraft.World/PistonBaseTile.h +++ b/Minecraft.World/PistonBaseTile.h @@ -27,45 +27,45 @@ private: static DWORD tlsIdx; // 4J - was just a static but implemented with TLS for our version - static bool ignoreUpdate(); + static bool ignoreUpdate(); static void ignoreUpdate(bool set); public: PistonBaseTile(int id, bool isSticky); - Icon *getPlatformTexture(); + Icon *getPlatformTexture(); virtual void updateShape(float x0, float y0, float z0, float x1, float y1, float z1); - virtual Icon *getTexture(int face, int data); + virtual Icon *getTexture(int face, int data); static Icon *getTexture(const wstring &name); void registerIcons(IconRegister *iconRegister); - virtual int getRenderShape(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); - virtual void onPlace(Level *level, int x, int y, int z); + virtual int getRenderShape(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void onPlace(Level *level, int x, int y, int z); private: - void checkIfExtend(Level *level, int x, int y, int z); - bool getNeighborSignal(Level *level, int x, int y, int z, int facing); + void checkIfExtend(Level *level, int x, int y, int z); + bool getNeighborSignal(Level *level, int x, int y, int z, int facing); public: - virtual void triggerEvent(Level *level, int x, int y, int z, int param1, int facing); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - virtual void updateDefaultShape(); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); + virtual bool triggerEvent(Level *level, int x, int y, int z, int param1, int facing); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual void updateDefaultShape(); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual bool isCubeShaped(); + virtual bool isCubeShaped(); - static int getFacing(int data); - static bool isExtended(int data); - static int getNewFacing(Level *level, int x, int y, int z, shared_ptr player); + static int getFacing(int data); + static bool isExtended(int data); + static int getNewFacing(Level *level, int x, int y, int z, shared_ptr player); private: - static bool isPushable(int block, Level *level, int cx, int cy, int cz, bool allowDestroyable); - static bool canPush(Level *level, int sx, int sy, int sz, int facing); + static bool isPushable(int block, Level *level, int cx, int cy, int cz, bool allowDestroyable); + static bool canPush(Level *level, int sx, int sy, int sz, int facing); static void stopSharingIfServer(Level *level, int x, int y, int z); // 4J added - bool createPush(Level *level, int sx, int sy, int sz, int facing); + bool createPush(Level *level, int sx, int sy, int sz, int facing); }; \ No newline at end of file diff --git a/Minecraft.World/PistonExtensionTile.cpp b/Minecraft.World/PistonExtensionTile.cpp index 1827ddde..25c5adb9 100644 --- a/Minecraft.World/PistonExtensionTile.cpp +++ b/Minecraft.World/PistonExtensionTile.cpp @@ -9,8 +9,8 @@ PistonExtensionTile::PistonExtensionTile(int id) : Tile(id, Material::piston,isS // 4J added initialiser overrideTopTexture = NULL; - setSoundType(SOUND_STONE); - setDestroyTime(0.5f); + setSoundType(SOUND_STONE); + setDestroyTime(0.5f); } void PistonExtensionTile::setOverrideTopTexture(Icon *overrideTopTexture) @@ -23,49 +23,63 @@ void PistonExtensionTile::clearOverrideTopTexture() this->overrideTopTexture = NULL; } +void PistonExtensionTile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player) +{ + if (player->abilities.instabuild) + { + int facing = getFacing(data); + int tile = level->getTile(x - Facing::STEP_X[facing], y - Facing::STEP_Y[facing], z - Facing::STEP_Z[facing]); + if (tile == Tile::pistonBase_Id || tile == Tile::pistonStickyBase_Id) + { + level->removeTile(x - Facing::STEP_X[facing], y - Facing::STEP_Y[facing], z - Facing::STEP_Z[facing]); + } + } + Tile::playerWillDestroy(level, x, y, z, data, player); +} + void PistonExtensionTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - Tile::onRemove(level, x, y, z, id, data); - int facing = Facing::OPPOSITE_FACING[getFacing(data)]; - x += Facing::STEP_X[facing]; - y += Facing::STEP_Y[facing]; - z += Facing::STEP_Z[facing]; + Tile::onRemove(level, x, y, z, id, data); + int facing = Facing::OPPOSITE_FACING[getFacing(data)]; + x += Facing::STEP_X[facing]; + y += Facing::STEP_Y[facing]; + z += Facing::STEP_Z[facing]; - int t = level->getTile(x, y, z); + int t = level->getTile(x, y, z); - if (t == Tile::pistonBase_Id || t == Tile::pistonStickyBase_Id) + if (t == Tile::pistonBase_Id || t == Tile::pistonStickyBase_Id) { - data = level->getData(x, y, z); - if (PistonBaseTile::isExtended(data)) + data = level->getData(x, y, z); + if (PistonBaseTile::isExtended(data)) { - Tile::tiles[t]->spawnResources(level, x, y, z, data, 0); - level->setTile(x, y, z, 0); + Tile::tiles[t]->spawnResources(level, x, y, z, data, 0); + level->removeTile(x, y, z); - } - } + } + } } Icon *PistonExtensionTile::getTexture(int face, int data) { - int facing = getFacing(data); + int facing = getFacing(data); - if (face == facing) + if (face == facing) { - if (overrideTopTexture != NULL) + if (overrideTopTexture != NULL) { - return overrideTopTexture; - } - if ((data & STICKY_BIT) != 0) + return overrideTopTexture; + } + if ((data & STICKY_BIT) != 0) { return PistonBaseTile::getTexture(PistonBaseTile::PLATFORM_STICKY_TEX); - } - return PistonBaseTile::getTexture(PistonBaseTile::PLATFORM_TEX); - } - if (facing < 6 && face == Facing::OPPOSITE_FACING[facing]) + } + return PistonBaseTile::getTexture(PistonBaseTile::PLATFORM_TEX); + } + if (facing < 6 && face == Facing::OPPOSITE_FACING[facing]) { - return PistonBaseTile::getTexture(PistonBaseTile::PLATFORM_TEX); - } - return PistonBaseTile::getTexture(PistonBaseTile::EDGE_TEX); // edge and arms + return PistonBaseTile::getTexture(PistonBaseTile::PLATFORM_TEX); + } + return PistonBaseTile::getTexture(PistonBaseTile::EDGE_TEX); // edge and arms } void PistonExtensionTile::registerIcons(IconRegister *iconRegister) @@ -105,98 +119,98 @@ int PistonExtensionTile::getResourceCount(Random *random) void PistonExtensionTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { - int data = level->getData(x, y, z); + int data = level->getData(x, y, z); - const float thickness = PistonBaseTile::PLATFORM_THICKNESS / 16.0f; - const float smallEdge1 = (8.0f - (PistonBaseTile::PLATFORM_THICKNESS / 2.0f)) / 16.0f; - const float smallEdge2 = (8.0f + (PistonBaseTile::PLATFORM_THICKNESS / 2.0f)) / 16.0f; - const float largeEdge1 = (8.0f - PistonBaseTile::PLATFORM_THICKNESS) / 16.0f; - const float largeEdge2 = (8.0f + PistonBaseTile::PLATFORM_THICKNESS) / 16.0f; + const float thickness = PistonBaseTile::PLATFORM_THICKNESS / 16.0f; + const float smallEdge1 = (8.0f - (PistonBaseTile::PLATFORM_THICKNESS / 2.0f)) / 16.0f; + const float smallEdge2 = (8.0f + (PistonBaseTile::PLATFORM_THICKNESS / 2.0f)) / 16.0f; + const float largeEdge1 = (8.0f - PistonBaseTile::PLATFORM_THICKNESS) / 16.0f; + const float largeEdge2 = (8.0f + PistonBaseTile::PLATFORM_THICKNESS) / 16.0f; - switch (getFacing(data)) + switch (getFacing(data)) { - case Facing::DOWN: - setShape(0, 0, 0, 1, thickness, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(smallEdge1, thickness, smallEdge1, smallEdge2, 1, smallEdge2); - Tile::addAABBs(level, x, y, z, box, boxes, source); - break; - case Facing::UP: - setShape(0, 1 - thickness, 0, 1, 1, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(smallEdge1, 0, smallEdge1, smallEdge2, 1 - thickness, smallEdge2); - Tile::addAABBs(level, x, y, z, box, boxes, source); - break; - case Facing::NORTH: - setShape(0, 0, 0, 1, 1, thickness); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(largeEdge1, smallEdge1, thickness, largeEdge2, smallEdge2, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - break; - case Facing::SOUTH: - setShape(0, 0, 1 - thickness, 1, 1, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(largeEdge1, smallEdge1, 0, largeEdge2, smallEdge2, 1 - thickness); - Tile::addAABBs(level, x, y, z, box, boxes, source); - break; - case Facing::WEST: - setShape(0, 0, 0, thickness, 1, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(smallEdge1, largeEdge1, thickness, smallEdge2, largeEdge2, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - break; - case Facing::EAST: - setShape(1 - thickness, 0, 0, 1, 1, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); - setShape(0, smallEdge1, largeEdge1, 1 - thickness, smallEdge2, largeEdge2); - Tile::addAABBs(level, x, y, z, box, boxes, source); - break; - } - setShape(0, 0, 0, 1, 1, 1); + case Facing::DOWN: + setShape(0, 0, 0, 1, thickness, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(smallEdge1, thickness, smallEdge1, smallEdge2, 1, smallEdge2); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::UP: + setShape(0, 1 - thickness, 0, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(smallEdge1, 0, smallEdge1, smallEdge2, 1 - thickness, smallEdge2); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::NORTH: + setShape(0, 0, 0, 1, 1, thickness); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(largeEdge1, smallEdge1, thickness, largeEdge2, smallEdge2, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::SOUTH: + setShape(0, 0, 1 - thickness, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(largeEdge1, smallEdge1, 0, largeEdge2, smallEdge2, 1 - thickness); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::WEST: + setShape(0, 0, 0, thickness, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(smallEdge1, largeEdge1, thickness, smallEdge2, largeEdge2, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + case Facing::EAST: + setShape(1 - thickness, 0, 0, 1, 1, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(0, smallEdge1, largeEdge1, 1 - thickness, smallEdge2, largeEdge2); + Tile::addAABBs(level, x, y, z, box, boxes, source); + break; + } + setShape(0, 0, 0, 1, 1, 1); } void PistonExtensionTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - int data = (forceData == -1 ) ? level->getData(x, y, z) : forceData; + int data = (forceData == -1 ) ? level->getData(x, y, z) : forceData; - const float thickness = PistonBaseTile::PLATFORM_THICKNESS / 16.0f; + const float thickness = PistonBaseTile::PLATFORM_THICKNESS / 16.0f; - switch (getFacing(data)) + switch (getFacing(data)) { - case Facing::DOWN: - setShape(0, 0, 0, 1, thickness, 1); - break; - case Facing::UP: - setShape(0, 1 - thickness, 0, 1, 1, 1); - break; - case Facing::NORTH: - setShape(0, 0, 0, 1, 1, thickness); - break; - case Facing::SOUTH: - setShape(0, 0, 1 - thickness, 1, 1, 1); - break; - case Facing::WEST: - setShape(0, 0, 0, thickness, 1, 1); - break; - case Facing::EAST: - setShape(1 - thickness, 0, 0, 1, 1, 1); - break; - } + case Facing::DOWN: + setShape(0, 0, 0, 1, thickness, 1); + break; + case Facing::UP: + setShape(0, 1 - thickness, 0, 1, 1, 1); + break; + case Facing::NORTH: + setShape(0, 0, 0, 1, 1, thickness); + break; + case Facing::SOUTH: + setShape(0, 0, 1 - thickness, 1, 1, 1); + break; + case Facing::WEST: + setShape(0, 0, 0, thickness, 1, 1); + break; + case Facing::EAST: + setShape(1 - thickness, 0, 0, 1, 1, 1); + break; + } } void PistonExtensionTile::neighborChanged(Level *level, int x, int y, int z, int type) { - int facing = getFacing(level->getData(x, y, z)); - int tile = level->getTile(x - Facing::STEP_X[facing], y - Facing::STEP_Y[facing], z - Facing::STEP_Z[facing]); - if (tile != Tile::pistonBase_Id && tile != Tile::pistonStickyBase_Id) + int facing = getFacing(level->getData(x, y, z)); + int tile = level->getTile(x - Facing::STEP_X[facing], y - Facing::STEP_Y[facing], z - Facing::STEP_Z[facing]); + if (tile != Tile::pistonBase_Id && tile != Tile::pistonStickyBase_Id) { - level->setTile(x, y, z, 0); - } - else + level->removeTile(x, y, z); + } + else { - Tile::tiles[tile]->neighborChanged(level, x - Facing::STEP_X[facing], y - Facing::STEP_Y[facing], z - Facing::STEP_Z[facing], type); - } + Tile::tiles[tile]->neighborChanged(level, x - Facing::STEP_X[facing], y - Facing::STEP_Y[facing], z - Facing::STEP_Z[facing], type); + } } int PistonExtensionTile::getFacing(int data) @@ -206,5 +220,11 @@ int PistonExtensionTile::getFacing(int data) int PistonExtensionTile::cloneTileId(Level *level, int x, int y, int z) { + int data = level->getData(x, y, z); + if ((data & STICKY_BIT) != 0) + { + return Tile::pistonStickyBase_Id; + } + return Tile::pistonBase_Id; return 0; } \ No newline at end of file diff --git a/Minecraft.World/PistonExtensionTile.h b/Minecraft.World/PistonExtensionTile.h index a0b08729..bd00b8e2 100644 --- a/Minecraft.World/PistonExtensionTile.h +++ b/Minecraft.World/PistonExtensionTile.h @@ -4,28 +4,29 @@ class PistonExtensionTile : public Tile { public: - // i'm reusing this block for the sticky pistons - static const int STICKY_BIT = 8; + // i'm reusing this block for the sticky pistons + static const int STICKY_BIT = 8; private: Icon *overrideTopTexture; public: PistonExtensionTile(int id); - void setOverrideTopTexture(Icon *overrideTopTexture); - void clearOverrideTopTexture(); - void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual Icon *getTexture(int face, int data); - void registerIcons(IconRegister *iconRegister); - virtual int getRenderShape(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual bool mayPlace(Level *level, int x, int y, int z, int face); - virtual int getResourceCount(Random *random); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - virtual void neighborChanged(Level *level, int x, int y, int z, int type); - static int getFacing(int data); + virtual void setOverrideTopTexture(Icon *overrideTopTexture); + virtual void clearOverrideTopTexture(); + virtual void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual Icon *getTexture(int face, int data); + virtual void registerIcons(IconRegister *iconRegister); + virtual int getRenderShape(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual bool mayPlace(Level *level, int x, int y, int z, int face); + virtual int getResourceCount(Random *random); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + static int getFacing(int data); virtual int cloneTileId(Level *level, int x, int y, int z); }; \ No newline at end of file diff --git a/Minecraft.World/PistonMovingPiece.cpp b/Minecraft.World/PistonMovingPiece.cpp index e141cebe..5fa9a475 100644 --- a/Minecraft.World/PistonMovingPiece.cpp +++ b/Minecraft.World/PistonMovingPiece.cpp @@ -6,7 +6,7 @@ #include "Facing.h" #include "AABB.h" -PistonMovingPiece::PistonMovingPiece(int id) : EntityTile(id, Material::piston, isSolidRender() ) +PistonMovingPiece::PistonMovingPiece(int id) : BaseEntityTile(id, Material::piston, isSolidRender() ) { setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME); } @@ -22,15 +22,15 @@ void PistonMovingPiece::onPlace(Level *level, int x, int y, int z) void PistonMovingPiece::onRemove(Level *level, int x, int y, int z, int id, int data) { - shared_ptr tileEntity = level->getTileEntity(x, y, z); - if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL) + shared_ptr tileEntity = level->getTileEntity(x, y, z); + if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL) { - dynamic_pointer_cast(tileEntity)->finalTick(); - } + dynamic_pointer_cast(tileEntity)->finalTick(); + } else { - EntityTile::onRemove(level, x, y, z, id, data); - } + BaseEntityTile::onRemove(level, x, y, z, id, data); + } } bool PistonMovingPiece::mayPlace(Level *level, int x, int y, int z) @@ -61,14 +61,14 @@ bool PistonMovingPiece::isCubeShaped() bool PistonMovingPiece::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) return false; - // this is a special case in order to help removing invisible, unbreakable, blocks in the world - if (!level->isClientSide && level->getTileEntity(x, y, z) == NULL) + // this is a special case in order to help removing invisible, unbreakable, blocks in the world + if (!level->isClientSide && level->getTileEntity(x, y, z) == NULL) { - // this block is no longer valid - level->setTile(x, y, z, 0); - return true; - } - return false; + // this block is no longer valid + level->removeTile(x, y, z); + return true; + } + return false; } int PistonMovingPiece::getResource(int data, Random *random, int playerBonusLevel) @@ -78,22 +78,23 @@ int PistonMovingPiece::getResource(int data, Random *random, int playerBonusLeve void PistonMovingPiece::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus) { - if (level->isClientSide) return; + if (level->isClientSide) return; - shared_ptr entity = getEntity(level, x, y, z); - if (entity == NULL) + shared_ptr entity = getEntity(level, x, y, z); + if (entity == NULL) { - return; - } + return; + } - Tile::tiles[entity->getId()]->spawnResources(level, x, y, z, entity->getData(), 0); + Tile::tiles[entity->getId()]->spawnResources(level, x, y, z, entity->getData(), 0); } void PistonMovingPiece::neighborChanged(Level *level, int x, int y, int z, int type) { - if (!level->isClientSide && level->getTileEntity(x, y, z) == NULL) + if (!level->isClientSide) { - } + level->getTileEntity(x, y, z) == NULL; + } } shared_ptr PistonMovingPiece::newMovingPieceEntity(int block, int data, int facing, bool extending, bool isSourcePiston) @@ -103,64 +104,64 @@ shared_ptr PistonMovingPiece::newMovingPieceEntity(int block, int da AABB *PistonMovingPiece::getAABB(Level *level, int x, int y, int z) { - shared_ptr entity = getEntity(level, x, y, z); - if (entity == NULL) + shared_ptr entity = getEntity(level, x, y, z); + if (entity == NULL) { - return NULL; - } + return NULL; + } - // move the aabb depending on the animation - float progress = entity->getProgress(0); - if (entity->isExtending()) + // move the aabb depending on the animation + float progress = entity->getProgress(0); + if (entity->isExtending()) { - progress = 1.0f - progress; - } - return getAABB(level, x, y, z, entity->getId(), progress, entity->getFacing()); + progress = 1.0f - progress; + } + return getAABB(level, x, y, z, entity->getId(), progress, entity->getFacing()); } void PistonMovingPiece::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - shared_ptr entity = dynamic_pointer_cast(forceEntity); + shared_ptr entity = dynamic_pointer_cast(forceEntity); if( entity == NULL ) entity = getEntity(level, x, y, z); - if (entity != NULL) + if (entity != NULL) { - Tile *tile = Tile::tiles[entity->getId()]; - if (tile == NULL || tile == this) + Tile *tile = Tile::tiles[entity->getId()]; + if (tile == NULL || tile == this) { - return; - } - tile->updateShape(level, x, y, z); + return; + } + tile->updateShape(level, x, y, z); - float progress = entity->getProgress(0); - if (entity->isExtending()) + float progress = entity->getProgress(0); + if (entity->isExtending()) { - progress = 1.0f - progress; - } - int facing = entity->getFacing(); + progress = 1.0f - progress; + } + int facing = entity->getFacing(); ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); - tls->xx0 = tile->getShapeX0() - Facing::STEP_X[facing] * progress; - tls->yy0 = tile->getShapeY0() - Facing::STEP_Y[facing] * progress; - tls->zz0 = tile->getShapeZ0() - Facing::STEP_Z[facing] * progress; - tls->xx1 = tile->getShapeX1() - Facing::STEP_X[facing] * progress; - tls->yy1 = tile->getShapeY1() - Facing::STEP_Y[facing] * progress; - tls->zz1 = tile->getShapeZ1() - Facing::STEP_Z[facing] * progress; - } + tls->xx0 = tile->getShapeX0() - Facing::STEP_X[facing] * progress; + tls->yy0 = tile->getShapeY0() - Facing::STEP_Y[facing] * progress; + tls->zz0 = tile->getShapeZ0() - Facing::STEP_Z[facing] * progress; + tls->xx1 = tile->getShapeX1() - Facing::STEP_X[facing] * progress; + tls->yy1 = tile->getShapeY1() - Facing::STEP_Y[facing] * progress; + tls->zz1 = tile->getShapeZ1() - Facing::STEP_Z[facing] * progress; + } } AABB *PistonMovingPiece::getAABB(Level *level, int x, int y, int z, int tile, float progress, int facing) { - if (tile == 0 || tile == id) + if (tile == 0 || tile == id) { - return NULL; - } - AABB *aabb = Tile::tiles[tile]->getAABB(level, x, y, z); + return NULL; + } + AABB *aabb = Tile::tiles[tile]->getAABB(level, x, y, z); - if (aabb == NULL) + if (aabb == NULL) { - return NULL; - } + return NULL; + } - // move the aabb depending on the animation + // move the aabb depending on the animation if (Facing::STEP_X[facing] < 0) { aabb->x0 -= Facing::STEP_X[facing] * progress; @@ -185,17 +186,17 @@ AABB *PistonMovingPiece::getAABB(Level *level, int x, int y, int z, int tile, fl { aabb->z1 -= Facing::STEP_Z[facing] * progress; } - return aabb; + return aabb; } shared_ptr PistonMovingPiece::getEntity(LevelSource *level, int x, int y, int z) { - shared_ptr tileEntity = level->getTileEntity(x, y, z); - if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL) + shared_ptr tileEntity = level->getTileEntity(x, y, z); + if (tileEntity != NULL && dynamic_pointer_cast(tileEntity) != NULL) { - return dynamic_pointer_cast(tileEntity); - } - return nullptr; + return dynamic_pointer_cast(tileEntity); + } + return nullptr; } void PistonMovingPiece::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/PistonMovingPiece.h b/Minecraft.World/PistonMovingPiece.h index 1b1a61dc..cf64cabf 100644 --- a/Minecraft.World/PistonMovingPiece.h +++ b/Minecraft.World/PistonMovingPiece.h @@ -1,8 +1,8 @@ -#include "EntityTile.h" +#include "BaseEntityTile.h" class PistonPieceEntity; -class PistonMovingPiece : public EntityTile +class PistonMovingPiece : public BaseEntityTile { public: PistonMovingPiece(int id); @@ -12,21 +12,21 @@ protected: public: virtual void onPlace(Level *level, int x, int y, int z); - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual bool mayPlace(Level *level, int x, int y, int z, int face); - virtual int getRenderShape(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param; - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); - static shared_ptr newMovingPieceEntity(int block, int data, int facing, bool extending, bool isSourcePiston); - virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual bool mayPlace(Level *level, int x, int y, int z, int face); + virtual int getRenderShape(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param; + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + static shared_ptr newMovingPieceEntity(int block, int data, int facing, bool extending, bool isSourcePiston); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - AABB *getAABB(Level *level, int x, int y, int z, int tile, float progress, int facing); + AABB *getAABB(Level *level, int x, int y, int z, int tile, float progress, int facing); private: shared_ptr getEntity(LevelSource *level, int x, int y, int z); diff --git a/Minecraft.World/PistonPieceEntity.cpp b/Minecraft.World/PistonPieceEntity.cpp index 3498cec0..0d0a86d0 100644 --- a/Minecraft.World/PistonPieceEntity.cpp +++ b/Minecraft.World/PistonPieceEntity.cpp @@ -146,7 +146,10 @@ void PistonPieceEntity::finalTick() level->removeTileEntity(x, y, z); setRemoved(); if (level->getTile(x, y, z) == Tile::pistonMovingPiece_Id) - level->setTileAndData(x, y, z, id, data); + { + level->setTileAndData(x, y, z, id, data, Tile::UPDATE_ALL); + level->neighborChanged(x, y, z, id); + } } } @@ -160,7 +163,10 @@ void PistonPieceEntity::tick() level->removeTileEntity(x, y, z); setRemoved(); if (level->getTile(x, y, z) == Tile::pistonMovingPiece_Id) - level->setTileAndData(x, y, z, id, data); + { + level->setTileAndData(x, y, z, id, data, Tile::UPDATE_ALL); + level->neighborChanged(x, y, z, id); + } return; } diff --git a/Minecraft.World/PlainsBiome.cpp b/Minecraft.World/PlainsBiome.cpp index e26c664b..df6f4785 100644 --- a/Minecraft.World/PlainsBiome.cpp +++ b/Minecraft.World/PlainsBiome.cpp @@ -3,6 +3,8 @@ PlainsBiome::PlainsBiome(int id) : Biome(id) { + friendlies.push_back(new MobSpawnerData(eTYPE_HORSE, 5, 2, 6)); + decorator->treeCount = -999; decorator->flowerCount = 4; decorator->grassCount = 10; diff --git a/Minecraft.World/PlayGoal.cpp b/Minecraft.World/PlayGoal.cpp index 304e7758..a3760862 100644 --- a/Minecraft.World/PlayGoal.cpp +++ b/Minecraft.World/PlayGoal.cpp @@ -9,14 +9,14 @@ #include "BasicTypeContainers.h" #include "PlayGoal.h" -PlayGoal::PlayGoal(Villager *mob, float speed) +PlayGoal::PlayGoal(Villager *mob, double speedModifier) { - followFriend = weak_ptr(); + followFriend = weak_ptr(); wantedX = wantedY = wantedZ = 0.0; playTime = 0; this->mob = mob; - this->speed = speed; + this->speedModifier = speedModifier; setRequiredControlFlags(Control::MoveControlFlag); } @@ -38,7 +38,7 @@ bool PlayGoal::canUse() double distSqr = friendV->distanceToSqr(mob->shared_from_this()); if (distSqr > closestDistSqr) continue; closestDistSqr = distSqr; - followFriend = weak_ptr(friendV); + followFriend = weak_ptr(friendV); } delete children; @@ -64,7 +64,7 @@ void PlayGoal::start() void PlayGoal::stop() { mob->setChasing(false); - followFriend = weak_ptr(); + followFriend = weak_ptr(); } void PlayGoal::tick() @@ -72,7 +72,7 @@ void PlayGoal::tick() --playTime; if (followFriend.lock() != NULL) { - if (mob->distanceToSqr(followFriend.lock()) > 2 * 2) mob->getNavigation()->moveTo(followFriend.lock(), speed); + if (mob->distanceToSqr(followFriend.lock()) > 2 * 2) mob->getNavigation()->moveTo(followFriend.lock(), speedModifier); } else { @@ -80,7 +80,7 @@ void PlayGoal::tick() { Vec3 *pos = RandomPos::getPos(dynamic_pointer_cast(mob->shared_from_this()), 16, 3); if (pos == NULL) return; - mob->getNavigation()->moveTo(pos->x, pos->y, pos->z, speed); + mob->getNavigation()->moveTo(pos->x, pos->y, pos->z, speedModifier); } } } \ No newline at end of file diff --git a/Minecraft.World/PlayGoal.h b/Minecraft.World/PlayGoal.h index a1b1a291..0c927d76 100644 --- a/Minecraft.World/PlayGoal.h +++ b/Minecraft.World/PlayGoal.h @@ -6,13 +6,13 @@ class PlayGoal : public Goal { private: Villager *mob; - weak_ptr followFriend; - float speed; + weak_ptr followFriend; + double speedModifier; double wantedX, wantedY, wantedZ; int playTime; public: - PlayGoal(Villager *mob, float speed); + PlayGoal(Villager *mob, double speedModifier); virtual bool canUse(); virtual bool canContinueToUse(); diff --git a/Minecraft.World/PlaySoundCommand.h b/Minecraft.World/PlaySoundCommand.h new file mode 100644 index 00000000..1f43143b --- /dev/null +++ b/Minecraft.World/PlaySoundCommand.h @@ -0,0 +1,88 @@ +/* +package net.minecraft.commands.common; + +import net.minecraft.commands.BaseCommand; +import net.minecraft.commands.CommandSender; +import net.minecraft.commands.exceptions.CommandException; +import net.minecraft.commands.exceptions.UsageException; +import net.minecraft.network.packet.LevelSoundPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +public class PlaySoundCommand extends BaseCommand { + @Override + public String getName() { + return "playsound"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + @Override + public String getUsage(CommandSender source) { + return "commands.playsound.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + if (args.length < 2) { + throw new UsageException(getUsage(source)); + } + + int index = 0; + String sound = args[index++]; + ServerPlayer player = convertToPlayer(source, args[index++]); + double x = player.getCommandSenderWorldPosition().x; + double y = player.getCommandSenderWorldPosition().y; + double z = player.getCommandSenderWorldPosition().z; + double volume = 1; + double pitch = 1; + double minVolume = 0; + + if (args.length > index) x = convertArgToCoordinate(source, x, args[index++]); + if (args.length > index) y = convertArgToCoordinate(source, y, args[index++], 0, 0); + if (args.length > index) z = convertArgToCoordinate(source, z, args[index++]); + + if (args.length > index) volume = convertArgToDouble(source, args[index++], 0, Float.MAX_VALUE); + if (args.length > index) pitch = convertArgToDouble(source, args[index++], 0, 2); + if (args.length > index) minVolume = convertArgToDouble(source, args[index++], 0, 1); + + double maxDist = volume > 1 ? volume * 16 : 16; + double dist = player.distanceTo(x, y, z); + + if (dist > maxDist) { + if (minVolume > 0) { + double deltaX = x - player.x; + double deltaY = y - player.y; + double deltaZ = z - player.z; + double length = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ); + double soundX = player.x; + double soundY = player.y; + double soundZ = player.z; + + if (length > 0) { + soundX += deltaX / length * 2; + soundY += deltaY / length * 2; + soundZ += deltaZ / length * 2; + } + + player.connection.send(new LevelSoundPacket(sound, soundX, soundY, soundZ, (float) minVolume, (float) pitch)); + } else { + throw new CommandException("commands.playsound.playerTooFar", player.getAName()); + } + } else { + player.connection.send(new LevelSoundPacket(sound, x, y, z, (float) volume, (float) pitch)); + } + + logAdminAction(source, "commands.playsound.success", sound, player.getAName()); + } + + @Override + public boolean isValidWildcardPlayerArgument(String[] args, int argumentIndex) { + return argumentIndex == 1; + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/Player.cpp b/Minecraft.World/Player.cpp index d4832e40..700935f6 100644 --- a/Minecraft.World/Player.cpp +++ b/Minecraft.World/Player.cpp @@ -15,7 +15,9 @@ #include "net.minecraft.world.level.chunk.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.boss.h" #include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.item.h" @@ -24,6 +26,8 @@ #include "net.minecraft.world.level.material.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.scores.h" +#include "net.minecraft.world.scores.criteria.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.inventory.h" #include "net.minecraft.world.damagesource.h" @@ -43,52 +47,35 @@ void Player::_init() { + registerAttributes(); + setHealth(getMaxHealth()); inventory = shared_ptr( new Inventory( this ) ); userType = 0; - score = 0; oBob = bob = 0.0f; - swinging = false; - swingTime = 0; - - //string name; - dimension = 0; - //string cloakTexture; xCloakO = yCloakO = zCloakO = 0.0; xCloak = yCloak = zCloak = 0.0; m_isSleeping = false; + customTextureUrl = L""; + customTextureUrl2 = L""; m_uiPlayerCurrentSkin=0; bedPosition = NULL; - sleepCounter = 0; deathFadeCounter=0; - bedOffsetX = bedOffsetY = bedOffsetZ = 0.0f; stats = NULL; - respawnPosition = NULL; + respawnForced = false; minecartAchievementPos = NULL; - - changingDimensionDelay = 20; - - - isInsidePortal = false; - - - portalTime = oPortalTime = 0.0f; - - dmgSpill = 0; - - fishing = nullptr; distanceWalk = distanceSwim = distanceFall = distanceClimb = distanceMinecart = distanceBoat = distancePig = 0; @@ -106,6 +93,8 @@ void Player::_init() defaultWalkSpeed = 0.1f; defaultFlySpeed = 0.02f; + lastLevelUpTime = 0; + m_uiGamePrivileges = 0; m_ppAdditionalModelParts=NULL; @@ -121,14 +110,13 @@ void Player::_init() m_bAwardedOnARail=false; } -Player::Player(Level *level) : Mob( level ) +Player::Player(Level *level, const wstring &name) : LivingEntity( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + this->name = name; _init(); MemSect(11); @@ -139,14 +127,12 @@ Player::Player(Level *level) : Mob( level ) heightOffset = 1.62f; Pos *spawnPos = level->getSharedSpawnPos(); - this->moveTo(spawnPos->x + 0.5, spawnPos->y + 1, spawnPos->z + 0.5, 0, 0); + moveTo(spawnPos->x + 0.5, spawnPos->y + 1, spawnPos->z + 0.5, 0, 0); delete spawnPos; - modelName = L"humanoid"; rotOffs = 180; flameTime = 20; - textureIdx = TN_MOB_CHAR; // 4J - was L"/mob/char.png"; m_skinIndex = eDefaultSkins_Skin0; m_playerIndex = 0; m_dwSkinId = 0; @@ -158,7 +144,12 @@ Player::Player(Level *level) : Mob( level ) //m_bShownOnMaps = true; setShowOnMaps(app.GetGameHostOption(eGameHostOption_Gamertags)!=0?true:false); m_bIsGuest = false; - m_UUID = L""; + +#ifndef _XBOX_ONE + // 4J: Set UUID to name on none-XB1 consoles, may change in future but for now + // ownership of animals on these consoles is done by name + setUUID(name); +#endif } Player::~Player() @@ -173,17 +164,20 @@ Player::~Player() //if( containerMenu != inventoryMenu ) delete containerMenu; } -int Player::getMaxHealth() +void Player::registerAttributes() { - return MAX_HEALTH; + LivingEntity::registerAttributes(); + + getAttributes()->registerAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(1); } void Player::defineSynchedData() { - this->Mob::defineSynchedData(); + LivingEntity::defineSynchedData(); entityData->define(DATA_PLAYER_FLAGS_ID, (byte) 0); - entityData->define(DATA_PLAYER_RUNNING_ID, (byte) 0); + entityData->define(DATA_PLAYER_ABSORPTION_ID, (float) 0); + entityData->define(DATA_SCORE_ID, (int) 0); } shared_ptr Player::getUseItem() @@ -240,8 +234,8 @@ bool Player::isBlocking() return isUsingItem() && Item::items[useItem->id]->getUseAnimation(useItem) == UseAnim_block; } - -void Player::tick() +// 4J Stu - Added for things that should only be ticked once per simulation frame +void Player::updateFrameTick() { if (useItem != NULL) { @@ -308,7 +302,17 @@ void Player::tick() deathFadeCounter = DEATHFADE_DURATION; } } - this->Mob::tick(); +} + +void Player::tick() +{ + if(level->isClientSide) + { + // 4J Stu - Server player calls this differently so that it only happens once per simulation tick + updateFrameTick(); + } + + LivingEntity::tick(); if (!level->isClientSide) { @@ -459,62 +463,61 @@ void Player::tick() this->drop( shared_ptr( new ItemInstance( Tile::goldenRail, 10 ) ) ); this->drop( shared_ptr( new ItemInstance( Tile::lever, 10 ) ) ); - level->setTime( 0 ); int poweredCount = 0; for(int i = 10; i < 2800; ++i) { - level->setTile(x+i,y-1,z-2,Tile::quartzBlock_Id); - level->setTile(x+i,y,z-2,Tile::quartzBlock_Id); - level->setTile(x+i,y+1,z-2,Tile::quartzBlock_Id); - level->setTile(x+i,y+2,z-2,Tile::lightGem_Id); - level->setTile(x+i,y+3,z-2,Tile::quartzBlock_Id); + level->setTileAndData(x+i,y-1,z-2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y,z-2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+1,z-2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+2,z-2,Tile::glowstone_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+3,z-2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); - level->setTile(x+i,y-1,z-1,Tile::stoneBrick_Id); + level->setTileAndData(x+i,y-1,z-1,Tile::stoneBrick_Id,0,Tile::UPDATE_CLIENTS); if(i%20 == 0) { - level->setTile(x+i,y,z-1,Tile::notGate_on_Id); + level->setTileAndData(x+i,y,z-1,Tile::redstoneTorch_on_Id,0,Tile::UPDATE_CLIENTS); poweredCount = 4; } else { - level->setTile(x+i,y,z-1,0); + level->setTileAndData(x+i,y,z-1,0,0,Tile::UPDATE_CLIENTS); } - level->setTile(x+i,y+1,z-1,0); - level->setTile(x+i,y+2,z-1,0); - level->setTile(x+i,y+3,z-1,0); + level->setTileAndData(x+i,y+1,z-1,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+2,z-1,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+3,z-1,0,0,Tile::UPDATE_CLIENTS); - level->setTile(x+i,y-1,z,Tile::stoneBrick_Id); + level->setTileAndData(x+i,y-1,z,Tile::stoneBrick_Id,0,Tile::UPDATE_CLIENTS); if(poweredCount>0) { - level->setTile(x+i,y,z,Tile::goldenRail_Id); + level->setTileAndData(x+i,y,z,Tile::goldenRail_Id,0,Tile::UPDATE_CLIENTS); --poweredCount; } else { - level->setTile(x+i,y,z,Tile::rail_Id); + level->setTileAndData(x+i,y,z,Tile::rail_Id,0,Tile::UPDATE_CLIENTS); } - level->setTile(x+i,y+1,z,0); - level->setTile(x+i,y+2,z,0); - level->setTile(x+i,y+3,z,0); + level->setTileAndData(x+i,y+1,z,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+2,z,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+3,z,0,0,Tile::UPDATE_CLIENTS); - level->setTile(x+i,y-1,z+1,Tile::stoneBrick_Id); + level->setTileAndData(x+i,y-1,z+1,Tile::stoneBrick_Id,0,Tile::UPDATE_CLIENTS); if((i+5)%20 == 0) { - level->setTile(x+i,y,z+1,Tile::torch_Id); + level->setTileAndData(x+i,y,z+1,Tile::torch_Id,0,Tile::UPDATE_CLIENTS); } else { - level->setTile(x+i,y,z+1,0); + level->setTileAndData(x+i,y,z+1,0,0,Tile::UPDATE_CLIENTS); } - level->setTile(x+i,y+1,z+1,0); - level->setTile(x+i,y+2,z+1,0); - level->setTile(x+i,y+3,z+1,0); - - level->setTile(x+i,y-1,z+2,Tile::quartzBlock_Id); - level->setTile(x+i,y,z+2,Tile::quartzBlock_Id); - level->setTile(x+i,y+1,z+2,Tile::quartzBlock_Id); - level->setTile(x+i,y+2,z+2,Tile::lightGem_Id); - level->setTile(x+i,y+3,z+2,Tile::quartzBlock_Id); + level->setTileAndData(x+i,y+1,z+1,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+2,z+1,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+3,z+1,0,0,Tile::UPDATE_CLIENTS); + + level->setTileAndData(x+i,y-1,z+2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y,z+2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+1,z+2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+2,z+2,Tile::glowstone_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+3,z+2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); } madeTrack = true; } @@ -523,11 +526,28 @@ void Player::tick() //End 4J sTU } +int Player::getPortalWaitTime() +{ + return abilities.invulnerable ? 0 : SharedConstants::TICKS_PER_SECOND * 4; +} + +int Player::getDimensionChangingDelay() +{ + return SharedConstants::TICKS_PER_SECOND / 2; +} + +void Player::playSound(int iSound, float volume, float pitch) +{ + // this sound method will play locally for the local player, and + // broadcast to remote players + level->playPlayerSound(dynamic_pointer_cast(shared_from_this()), iSound, volume, pitch); +} + void Player::spawnEatParticles(shared_ptr useItem, int count) { if (useItem->getUseAnimation() == UseAnim_drink) { - level->playSound(shared_from_this(), eSoundType_RANDOM_DRINK, 0.5f, level->random->nextFloat() * 0.1f + 0.9f); + playSound(eSoundType_RANDOM_DRINK, 0.5f, level->random->nextFloat() * 0.1f + 0.9f); } if (useItem->getUseAnimation() == UseAnim_eat) { @@ -547,7 +567,7 @@ void Player::spawnEatParticles(shared_ptr useItem, int count) } // 4J Stu - Was L"mob.eat" which doesnt exist - level->playSound(shared_from_this(), eSoundType_RANDOM_EAT, 0.5f + 0.5f * random->nextInt(2), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + playSound(eSoundType_RANDOM_EAT, 0.5f + 0.5f * random->nextInt(2), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); } } @@ -579,7 +599,7 @@ void Player::handleEntityEvent(byte id) } else { - Mob::handleEntityEvent(id); + LivingEntity::handleEntityEvent(id); } } @@ -588,7 +608,6 @@ bool Player::isImmobile() return getHealth() <= 0 || isSleeping(); } - void Player::closeContainer() { containerMenu = inventoryMenu; @@ -608,7 +627,7 @@ void Player::ride(shared_ptr e) return; } - Mob::ride(e); + LivingEntity::ride(e); } void Player::setPlayerDefaultSkin(EDefaultSkins skin) @@ -927,10 +946,17 @@ void Player::prepareCustomTextures() void Player::rideTick() { + if (!level->isClientSide && isSneaking()) + { + ride(nullptr); + setSneaking(false); + return; + } + double preX = x, preY = y, preZ = z; float preYRot = yRot, preXRot = xRot; - this->Mob::rideTick(); + LivingEntity::rideTick(); oBob = bob; bob = 0; @@ -958,42 +984,15 @@ void Player::resetPos() { heightOffset = 1.62f; setSize(0.6f, 1.8f); - this->Mob::resetPos(); + LivingEntity::resetPos(); setHealth(getMaxHealth()); deathTime = 0; } -int Player::getCurrentSwingDuration() -{ - if (hasEffect(MobEffect::digSpeed)) - { - return SWING_DURATION - (1 + getEffect(MobEffect::digSpeed)->getAmplifier()) * 1; - } - if (hasEffect(MobEffect::digSlowdown)) - { - return SWING_DURATION + (1 + getEffect(MobEffect::digSlowdown)->getAmplifier()) * 2; - } - return SWING_DURATION; -} - void Player::serverAiStep() { - int currentSwingDuration = getCurrentSwingDuration(); - if (swinging) - { - swingTime++; - if (swingTime >= currentSwingDuration) - { - swingTime = 0; - swinging = false; - } - } - else - { - swingTime = 0; - } - - attackAnim = swingTime / (float) currentSwingDuration; + LivingEntity::serverAiStep(); + updateSwingTime(); } @@ -1001,23 +1000,25 @@ void Player::aiStep() { if (jumpTriggerTime > 0) jumpTriggerTime--; - if (level->difficulty == Difficulty::PEACEFUL && getHealth() < getMaxHealth()) + if (level->difficulty == Difficulty::PEACEFUL && getHealth() < getMaxHealth() && level->getGameRules()->getBoolean(GameRules::RULE_NATURAL_REGENERATION)) { if (tickCount % 20 * 12 == 0) heal(1); } inventory->tick(); oBob = bob; - this->Mob::aiStep(); + LivingEntity::aiStep(); - this->walkingSpeed = abilities.getWalkingSpeed(); - this->flyingSpeed = defaultFlySpeed; + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + if (!level->isClientSide) speed->setBaseValue(abilities.getWalkingSpeed()); + flyingSpeed = defaultFlySpeed; if (isSprinting()) { - walkingSpeed += abilities.getWalkingSpeed() * 0.3f; flyingSpeed += defaultFlySpeed * 0.3f; } + setSpeed((float) speed->getValue()); + float tBob = (float) sqrt(xd * xd + zd * zd); // 4J added - we were getting a NaN with zero xd & zd @@ -1037,7 +1038,19 @@ void Player::aiStep() if (getHealth() > 0) { - vector > *entities = level->getEntities(shared_from_this(), bb->grow(1, 0, 1)); + AABB *pickupArea = NULL; + if (riding != NULL && !riding->removed) + { + // if the player is riding, also touch entities under the + // pig/horse + pickupArea = bb->minmax(riding->bb)->grow(1, 0, 1); + } + else + { + pickupArea = bb->grow(1, .5, 1); + } + + vector > *entities = level->getEntities(shared_from_this(), pickupArea); if (entities != NULL) { AUTO_VAR(itEnd, entities->end()); @@ -1059,21 +1072,26 @@ void Player::touch(shared_ptr entity) entity->playerTouch( dynamic_pointer_cast( shared_from_this() ) ); } -// 4J - Removed 1.0.1 -//bool Player::addResource(int resource) -//{ -// return inventory->add(shared_ptr( new ItemInstance(resource, 1, 0) ) ); -//} - int Player::getScore() { - return score; + return entityData->getInteger(DATA_SCORE_ID); +} + +void Player::setScore(int value) +{ + entityData->set(DATA_SCORE_ID, value); +} + +void Player::increaseScore(int amount) +{ + int score = getScore(); + entityData->set(DATA_SCORE_ID, score + amount); } void Player::die(DamageSource *source) { - this->Mob::die(source); - this->setSize(0.2f, 0.2f); + LivingEntity::die(source); + setSize(0.2f, 0.2f); setPos(x, y, z); yd = 0.1f; @@ -1082,7 +1100,10 @@ void Player::die(DamageSource *source) { drop(shared_ptr( new ItemInstance(Item::apple, 1) ), true); } - inventory->dropAll(); + if (!level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY)) + { + inventory->dropAll(); + } if (source != NULL) { @@ -1093,26 +1114,33 @@ void Player::die(DamageSource *source) { xd = zd = 0; } - this->heightOffset = 0.1f; + heightOffset = 0.1f; } -void Player::awardKillScore(shared_ptr victim, int score) +void Player::awardKillScore(shared_ptr victim, int awardPoints) { - this->score += score; -} + increaseScore(awardPoints); + vector *objectives = getScoreboard()->findObjectiveFor(ObjectiveCriteria::KILL_COUNT_ALL); -int Player::decreaseAirSupply(int currentSupply) -{ - int oxygenBonus = EnchantmentHelper::getOxygenBonus(inventory); - if (oxygenBonus > 0) + //if (victim instanceof Player) + //{ + // awardStat(Stats::playerKills, 1); + // objectives.addAll(getScoreboard().findObjectiveFor(ObjectiveCriteria::KILL_COUNT_PLAYERS)); + //} + //else + //{ + // awardStat(Stats::mobKills, 1); + //} + + if(objectives) { - if (random->nextInt(oxygenBonus + 1) > 0) + for (AUTO_VAR(it,objectives->begin()); it != objectives->end(); ++it) { - // the oxygen bonus prevents us from drowning - return currentSupply; + Objective *objective = *it; + Score *score = getScoreboard()->getPlayerScore(getAName(), objective); + score->increment(); } } - return Mob::decreaseAirSupply(currentSupply); } bool Player::isShootable() @@ -1125,9 +1153,9 @@ bool Player::isCreativeModeAllowed() return true; } -shared_ptr Player::drop() +shared_ptr Player::drop(bool all) { - return drop(inventory->removeItem(inventory->selected, 1), false); + return drop(inventory->removeItem(inventory->selected, all && inventory->getSelected() != NULL ? inventory->getSelected()->count : 1), false); } shared_ptr Player::drop(shared_ptr item) @@ -1138,6 +1166,7 @@ shared_ptr Player::drop(shared_ptr item) shared_ptr Player::drop(shared_ptr item, bool randomly) { if (item == NULL) return nullptr; + if (item->count == 0) return nullptr; shared_ptr thrownItem = shared_ptr( new ItemEntity(level, x, y - 0.3f + getHeadHeight(), z, item) ); thrownItem->throwTime = 20 * 2; @@ -1181,14 +1210,28 @@ void Player::reallyDrop(shared_ptr thrownItem) } -float Player::getDestroySpeed(Tile *tile) +float Player::getDestroySpeed(Tile *tile, bool hasProperTool) { float speed = inventory->getDestroySpeed(tile); - int efficiency = EnchantmentHelper::getDiggingBonus(inventory); - if (efficiency > 0 && inventory->canDestroy(tile)) + if (speed > 1) { - speed += (efficiency * efficiency + 1); + int efficiency = EnchantmentHelper::getDiggingBonus(dynamic_pointer_cast(shared_from_this())); + shared_ptr item = inventory->getSelected(); + + if (efficiency > 0 && item != NULL) + { + float boost = efficiency * efficiency + 1; + + if (item->canDestroySpecial(tile) || speed > 1) + { + speed += boost; + } + else + { + speed += boost * 0.08f; + } + } } if (hasEffect(MobEffect::digSpeed)) @@ -1200,7 +1243,7 @@ float Player::getDestroySpeed(Tile *tile) speed *= 1.0f - (getEffect(MobEffect::digSlowdown)->getAmplifier() + 1) * .2f; } - if (isUnderLiquid(Material::water) && !EnchantmentHelper::hasWaterWorkerBonus(inventory)) speed /= 5; + if (isUnderLiquid(Material::water) && !EnchantmentHelper::hasWaterWorkerBonus(dynamic_pointer_cast(shared_from_this()))) speed /= 5; // 4J Stu - onGround is set to true on the client when we are flying, which means // the dig speed is out of sync with the server. Removing this speed change when @@ -1217,16 +1260,17 @@ bool Player::canDestroy(Tile *tile) void Player::readAdditionalSaveData(CompoundTag *entityTag) { - Mob::readAdditionalSaveData(entityTag); + LivingEntity::readAdditionalSaveData(entityTag); ListTag *inventoryList = (ListTag *) entityTag->getList(L"Inventory"); inventory->load(inventoryList); - dimension = entityTag->getInt(L"Dimension"); + inventory->selected = entityTag->getInt(L"SelectedItemSlot"); m_isSleeping = entityTag->getBoolean(L"Sleeping"); sleepCounter = entityTag->getShort(L"SleepTimer"); experienceProgress = entityTag->getFloat(L"XpP"); experienceLevel = entityTag->getInt(L"XpLevel"); totalExperience = entityTag->getInt(L"XpTotal"); + setScore(entityTag->getInt(L"Score")); if (m_isSleeping) { @@ -1237,6 +1281,7 @@ void Player::readAdditionalSaveData(CompoundTag *entityTag) if (entityTag->contains(L"SpawnX") && entityTag->contains(L"SpawnY") && entityTag->contains(L"SpawnZ")) { respawnPosition = new Pos(entityTag->getInt(L"SpawnX"), entityTag->getInt(L"SpawnY"), entityTag->getInt(L"SpawnZ")); + respawnForced = entityTag->getBoolean(L"SpawnForced"); } foodData.readAdditionalSaveData(entityTag); @@ -1254,21 +1299,23 @@ void Player::readAdditionalSaveData(CompoundTag *entityTag) void Player::addAdditonalSaveData(CompoundTag *entityTag) { - Mob::addAdditonalSaveData(entityTag); + LivingEntity::addAdditonalSaveData(entityTag); entityTag->put(L"Inventory", inventory->save(new ListTag())); - entityTag->putInt(L"Dimension", dimension); + entityTag->putInt(L"SelectedItemSlot", inventory->selected); entityTag->putBoolean(L"Sleeping", m_isSleeping); entityTag->putShort(L"SleepTimer", (short) sleepCounter); entityTag->putFloat(L"XpP", experienceProgress); entityTag->putInt(L"XpLevel", experienceLevel); entityTag->putInt(L"XpTotal", totalExperience); + entityTag->putInt(L"Score", getScore()); if (respawnPosition != NULL) { entityTag->putInt(L"SpawnX", respawnPosition->x); entityTag->putInt(L"SpawnY", respawnPosition->y); entityTag->putInt(L"SpawnZ", respawnPosition->z); + entityTag->putBoolean(L"SpawnForced", respawnForced); } foodData.addAdditonalSaveData(entityTag); @@ -1281,21 +1328,27 @@ void Player::addAdditonalSaveData(CompoundTag *entityTag) } -Pos *Player::getRespawnPosition(Level *level, CompoundTag *entityTag) +bool Player::openContainer(shared_ptr container) { - if (entityTag->contains(L"SpawnX") && entityTag->contains(L"SpawnY") && entityTag->contains(L"SpawnZ")) - { - return new Pos(entityTag->getInt(L"SpawnX"), entityTag->getInt(L"SpawnY"), entityTag->getInt(L"SpawnZ")); - } - return level->getSharedSpawnPos(); + return true; } -bool Player::openContainer(shared_ptr container) +bool Player::openHopper(shared_ptr container) +{ + return true; +} + +bool Player::openHopper(shared_ptr container) +{ + return true; +} + +bool Player::openHorseInventory(shared_ptr horse, shared_ptr container) { return true; } -bool Player::startEnchanting(int x, int y, int z) +bool Player::startEnchanting(int x, int y, int z, const wstring &name) { return true; } @@ -1310,8 +1363,9 @@ bool Player::startCrafting(int x, int y, int z) return true; } -void Player::take(shared_ptr e, int orgCount) +bool Player::openFireworks(int x, int y, int z) { + return true; } float Player::getHeadHeight() @@ -1325,8 +1379,9 @@ void Player::setDefaultHeadHeight() heightOffset = 1.62f; } -bool Player::hurt(DamageSource *source, int dmg) +bool Player::hurt(DamageSource *source, float dmg) { + if (isInvulnerable()) return false; if ( hasInvulnerablePrivilege() || (abilities.invulnerable && !source->isBypassInvul()) ) return false; // 4J-JEV: Fix for PSVita: #3987 - [IN GAME] The user can take damage/die, when attempting to re-enter fly mode when falling from a height. @@ -1350,95 +1405,40 @@ bool Player::hurt(DamageSource *source, int dmg) if (dmg == 0) return false; shared_ptr attacker = source->getEntity(); - if ( dynamic_pointer_cast( attacker ) != NULL ) + if ( attacker != NULL && attacker->instanceof(eTYPE_ARROW) ) { - if ((dynamic_pointer_cast(attacker))->owner != NULL) + shared_ptr arrow = dynamic_pointer_cast(attacker); + if ( arrow->owner != NULL) { - attacker = (dynamic_pointer_cast(attacker))->owner; + attacker = arrow->owner; } } - if ( dynamic_pointer_cast( attacker ) != NULL ) - { - // aggreviate all pet wolves nearby - directAllTameWolvesOnTarget(dynamic_pointer_cast(attacker), false); - } - return this->Mob::hurt(source, dmg); + return LivingEntity::hurt(source, dmg); } -int Player::getDamageAfterMagicAbsorb(DamageSource *damageSource, int damage) +bool Player::canHarmPlayer(shared_ptr target) { - int remainingDamage = Mob::getDamageAfterMagicAbsorb(damageSource, damage); - if (remainingDamage <= 0) - { - return 0; - } + Team *team = getTeam(); + Team *otherTeam = target->getTeam(); - int enchantmentArmor = EnchantmentHelper::getDamageProtection(inventory, damageSource); - if (enchantmentArmor > 20) + if (team == NULL) { - enchantmentArmor = 20; + return true; } - if (enchantmentArmor > 0 && enchantmentArmor <= 20) + if (!team->isAlliedTo(otherTeam)) { - int absorb = 25 - enchantmentArmor; - int v = remainingDamage * absorb + dmgSpill; - remainingDamage = v / 25; - dmgSpill = v % 25; + return true; } - - return remainingDamage; + return team->isAllowFriendlyFire(); } -bool Player::isPlayerVersusPlayer() +bool Player::canHarmPlayer(wstring targetName) { - return false; -} - -void Player::directAllTameWolvesOnTarget(shared_ptr target, bool skipSitting) -{ - - // filter un-attackable mobs - if ((dynamic_pointer_cast( target ) != NULL) || (dynamic_pointer_cast( target) != NULL)) - { - return; - } - // never target wolves that has this player as owner - if (dynamic_pointer_cast(target) != NULL) - { - shared_ptr wolfTarget = dynamic_pointer_cast(target); - if (wolfTarget->isTame() && m_UUID.compare( wolfTarget->getOwnerUUID() ) == 0 ) - { - return; - } - } - if ((dynamic_pointer_cast( target ) != NULL) && !isPlayerVersusPlayer()) - { - // pvp is off - return; - } - - - // TODO: Optimize this? Most of the time players wont have pets: - vector > *nearbyWolves = level->getEntitiesOfClass(typeid(Wolf), AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(16, 4, 16)); - AUTO_VAR(itEnd, nearbyWolves->end()); - for (AUTO_VAR(it, nearbyWolves->begin()); it != itEnd; it++) - { - shared_ptr wolf = dynamic_pointer_cast(*it);; - if (wolf->isTame() && wolf->getAttackTarget() == NULL && m_UUID.compare( wolf->getOwnerUUID() ) == 0) - { - if (!skipSitting || !wolf->isSitting()) - { - wolf->setSitting(false); - wolf->setAttackTarget(target); - } - } - } - delete nearbyWolves; - + return true; } -void Player::hurtArmor(int damage) +void Player::hurtArmor(float damage) { inventory->hurtArmor(damage); } @@ -1450,30 +1450,37 @@ int Player::getArmorValue() float Player::getArmorCoverPercentage() { - int count = 0; + int count = 0; for (int i = 0; i < inventory->armor.length; i++) { - if (inventory->armor[i] != NULL) { - count++; - } - } - return (float) count / (float) inventory->armor.length; + if (inventory->armor[i] != NULL) { + count++; + } + } + return (float) count / (float) inventory->armor.length; } -void Player::actuallyHurt(DamageSource *source, int dmg) +void Player::actuallyHurt(DamageSource *source, float dmg) { - if (!source->isBypassArmor() && isBlocking()) + if (isInvulnerable()) return; + if (!source->isBypassArmor() && isBlocking() && dmg > 0) { - dmg = (1 + dmg) >> 1; + dmg = (1 + dmg) * .5f; } dmg = getDamageAfterArmorAbsorb(source, dmg); dmg = getDamageAfterMagicAbsorb(source, dmg); + + float originalDamage = dmg; + dmg = max(dmg - getAbsorptionAmount(), 0.0f); + setAbsorptionAmount(getAbsorptionAmount() - (originalDamage - dmg)); + if (dmg == 0) return; + causeFoodExhaustion(source->getFoodExhaustion()); - //this->Mob::actuallyHurt(source, dmg); - health -= dmg; + float oldHealth = getHealth(); + setHealth(getHealth() - dmg); + getCombatTracker()->recordDamage(source, oldHealth, dmg); } - bool Player::openFurnace(shared_ptr container) { return true; @@ -1484,7 +1491,7 @@ bool Player::openTrap(shared_ptr container) return true; } -void Player::openTextEdit(shared_ptr sign) +void Player::openTextEdit(shared_ptr sign) { } @@ -1493,7 +1500,12 @@ bool Player::openBrewingStand(shared_ptr brewingStand) return true; } -bool Player::openTrading(shared_ptr traderTarget) +bool Player::openBeacon(shared_ptr beacon) +{ + return true; +} + +bool Player::openTrading(shared_ptr traderTarget, const wstring &name) { return true; } @@ -1509,21 +1521,41 @@ void Player::openItemInstanceGui(shared_ptr itemInstance) bool Player::interact(shared_ptr entity) { - if (entity->interact( dynamic_pointer_cast( shared_from_this() ) )) return true; + shared_ptr thisPlayer = dynamic_pointer_cast(shared_from_this()); + shared_ptr item = getSelectedItem(); - if (item != NULL && dynamic_pointer_cast( entity ) != NULL) + shared_ptr itemClone = (item != NULL) ? item->copy() : nullptr; + if ( entity->interact(thisPlayer) ) + { + // [EB]: Added rude check to see if we're still talking about the + // same item; this code caused bucket->milkbucket to be deleted because + // the milkbuckets' stack got decremented to 0. + if (item != NULL && item == getSelectedItem()) + { + if (item->count <= 0 && !abilities.instabuild) + { + removeSelectedItem(); + } + else if (item->count < itemClone->count && abilities.instabuild) + { + item->count = itemClone->count; + } + } + return true; + } + + if ( (item != NULL) && entity->instanceof(eTYPE_LIVINGENTITY) ) { // 4J - PC Comments // Hack to prevent item stacks from decrementing if the player has // the ability to instabuild - if(this->abilities.instabuild) item = item->copy(); - if(item->interactEnemy(dynamic_pointer_cast(entity))) + if(this->abilities.instabuild) item = itemClone; + if(item->interactEnemy(thisPlayer, dynamic_pointer_cast(entity))) { // 4J - PC Comments // Don't remove the item in hand if the player has the ability - // to - // instabuild - if (item->count <= 0 && !this->abilities.instabuild) + // to instabuild + if ( (item->count <= 0) && !abilities.instabuild) { removeSelectedItem(); } @@ -1548,15 +1580,6 @@ double Player::getRidingHeight() return heightOffset - 0.5f; } -void Player::swing() -{ - if (!swinging || swingTime >= getCurrentSwingDuration() / 2 || swingTime < 0) - { - swingTime = -1; - swinging = true; - } -} - void Player::attack(shared_ptr entity) { if (!entity->isAttackable()) @@ -1564,24 +1587,22 @@ void Player::attack(shared_ptr entity) return; } - int dmg = inventory->getAttackDamage(entity); - - if (hasEffect(MobEffect::damageBoost)) - { - dmg += (3 << getEffect(MobEffect::damageBoost)->getAmplifier()); - } - if (hasEffect(MobEffect::weakness)) + if (entity->skipAttackInteraction(shared_from_this())) { - dmg -= (2 << getEffect(MobEffect::weakness)->getAmplifier()); + return; } + float dmg = (float) getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->getValue(); + int knockback = 0; - int magicBoost = 0; - shared_ptr mob = dynamic_pointer_cast(entity); - if (mob != NULL) + float magicBoost = 0; + + if ( entity->instanceof(eTYPE_LIVINGENTITY) ) { - magicBoost = EnchantmentHelper::getDamageBonus(inventory, mob); - knockback += EnchantmentHelper::getKnockbackBonus(inventory, mob); + shared_ptr thisPlayer = dynamic_pointer_cast(shared_from_this()); + shared_ptr mob = dynamic_pointer_cast(entity); + magicBoost = EnchantmentHelper::getDamageBonus(thisPlayer, mob); + knockback += EnchantmentHelper::getKnockbackBonus(thisPlayer, mob); } if (isSprinting()) { @@ -1590,18 +1611,18 @@ void Player::attack(shared_ptr entity) if (dmg > 0 || magicBoost > 0) { - bool bCrit = fallDistance > 0 && !onGround && !onLadder() && !isInWater() && !hasEffect(MobEffect::blindness) && riding == NULL && mob != NULL; - if (bCrit) + bool bCrit = fallDistance > 0 && !onGround && !onLadder() && !isInWater() && !hasEffect(MobEffect::blindness) && (riding == NULL) && entity->instanceof(eTYPE_LIVINGENTITY); + if (bCrit && dmg > 0) { - dmg += random->nextInt(dmg / 2 + 2); + dmg *= 1.5f; } dmg += magicBoost; - + // Ensure we put the entity on fire if we're hitting with a // fire-enchanted weapon bool setOnFireTemporatily = false; - int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast(shared_from_this())); - if (dynamic_pointer_cast(entity) && fireAspect > 0 && !entity->isOnFire()) + int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast(shared_from_this())); + if ( entity->instanceof(eTYPE_MOB) && fireAspect > 0 && !entity->isOnFire()) { setOnFireTemporatily = true; entity->setOnFire(1); @@ -1635,29 +1656,36 @@ void Player::attack(shared_ptr entity) } setLastHurtMob(entity); - shared_ptr mob = dynamic_pointer_cast(entity); - if (mob) + + if ( entity->instanceof(eTYPE_LIVINGENTITY) ) { + shared_ptr mob = dynamic_pointer_cast(entity); ThornsEnchantment::doThornsAfterAttack(shared_from_this(), mob, random); } } shared_ptr item = getSelectedItem(); - if (item != NULL && dynamic_pointer_cast( entity ) != NULL) + shared_ptr hurtTarget = entity; + if ( entity->instanceof(eTYPE_MULTIENTITY_MOB_PART) ) { - item->hurtEnemy(dynamic_pointer_cast(entity), dynamic_pointer_cast( shared_from_this() ) ); - if (item->count <= 0) + shared_ptr multiMob = dynamic_pointer_cast((dynamic_pointer_cast(entity))->parentMob.lock()); + if ( (multiMob != NULL) && multiMob->instanceof(eTYPE_LIVINGENTITY) ) { - removeSelectedItem(); + hurtTarget = dynamic_pointer_cast( multiMob ); } } - if (dynamic_pointer_cast( entity ) != NULL) + if ( (item != NULL) && hurtTarget->instanceof(eTYPE_LIVINGENTITY) ) { - if (entity->isAlive()) + item->hurtEnemy(dynamic_pointer_cast(hurtTarget), dynamic_pointer_cast( shared_from_this() ) ); + if (item->count <= 0) { - directAllTameWolvesOnTarget(dynamic_pointer_cast(entity), true); + removeSelectedItem(); } - // 4J Stu - Brought forward wasHurt check to Fix 66140 - Bug: Fire Aspect bypasses "Player v Player" being Disabled + } + if ( entity->instanceof(eTYPE_LIVINGENTITY) ) + { + //awardStat(Stats.damageDealt, (int) Math.round(dmg * 10)); + if (fireAspect > 0 && wasHurt) { entity->setOnFire(fireAspect * 4); @@ -1670,6 +1698,11 @@ void Player::attack(shared_ptr entity) causeFoodExhaustion(FoodConstants::EXHAUSTION_ATTACK); } + + // if (SharedConstants::INGAME_DEBUG_OUTPUT) + // { + // //sendMessage(ChatMessageComponent.forPlainText("DMG " + dmg + ", " + magicBoost + ", " + knockback)); + // } } void Player::crit(shared_ptr entity) @@ -1707,7 +1740,7 @@ Slot *Player::getInventorySlot(int slotId) void Player::remove() { - this->Mob::remove(); + LivingEntity::remove(); inventoryMenu->removed( dynamic_pointer_cast( shared_from_this() ) ); if (containerMenu != NULL) { @@ -1717,7 +1750,7 @@ void Player::remove() bool Player::isInWall() { - return !m_isSleeping && this->Mob::isInWall(); + return !m_isSleeping && LivingEntity::isInWall(); } bool Player::isLocalPlayer() @@ -1759,6 +1792,7 @@ Player::BedSleepingResult Player::startSleepInBed(int x, int y, int z, bool bTes vector > *monsters = level->getEntitiesOfClass(typeid(Monster), AABB::newTemp(x - hRange, y - vRange, z - hRange, x + hRange, y + vRange, z + hRange)); if (!monsters->empty()) { + delete monsters; return NOT_SAFE; } delete monsters; @@ -1778,8 +1812,10 @@ Player::BedSleepingResult Player::startSleepInBed(int x, int y, int z, bool bTes return OK; } - // 4J Stu - You can use a bed from within a minecart, and this causes all sorts of problems. - ride(nullptr); + if (isRiding()) + { + ride(nullptr); + } setSize(0.2f, 0.2f); heightOffset = .2f; @@ -1898,7 +1934,7 @@ void Player::stopSleepInBed(bool forcefulWakeUp, bool updateLevelList, bool save } if (saveRespawnPoint) { - setRespawnPosition(bedPosition); + setRespawnPosition(bedPosition, false); } } @@ -1909,7 +1945,7 @@ bool Player::checkBed() } -Pos *Player::checkBedValidRespawnPosition(Level *level, Pos *pos) +Pos *Player::checkBedValidRespawnPosition(Level *level, Pos *pos, bool forced) { // make sure the chunks around the bed exist ChunkSource *chunkSource = level->getChunkSource(); @@ -1921,6 +1957,15 @@ Pos *Player::checkBedValidRespawnPosition(Level *level, Pos *pos) // make sure the bed is still standing if (level->getTile(pos->x, pos->y, pos->z) != Tile::bed_Id) { + Material *bottomMaterial = level->getMaterial(pos->x, pos->y, pos->z); + Material *topMaterial = level->getMaterial(pos->x, pos->y + 1, pos->z); + bool freeFeet = !bottomMaterial->isSolid() && !bottomMaterial->isLiquid(); + bool freeHead = !topMaterial->isSolid() && !topMaterial->isLiquid(); + + if (forced && freeFeet && freeHead) + { + return pos; + } return NULL; } // make sure the bed still has a stand-up position @@ -2005,15 +2050,22 @@ Pos *Player::getRespawnPosition() return respawnPosition; } -void Player::setRespawnPosition(Pos *respawnPosition) +bool Player::isRespawnForced() +{ + return respawnForced; +} + +void Player::setRespawnPosition(Pos *respawnPosition, bool forced) { if (respawnPosition != NULL) { this->respawnPosition = new Pos(*respawnPosition); + respawnForced = forced; } else { this->respawnPosition = NULL; + respawnForced = false; } } @@ -2028,7 +2080,7 @@ void Player::awardStat(Stat *stat, byteArray paramBlob) void Player::jumpFromGround() { - this->Mob::jumpFromGround(); + LivingEntity::jumpFromGround(); // 4J Stu - This seems to have been missed from 1.7.3, but do we care? //awardStat(Stats::jump, 1); @@ -2050,21 +2102,25 @@ void Player::travel(float xa, float ya) if (abilities.flying && riding == NULL) { - double ydo = this->yd; + double ydo = yd; float ofs = flyingSpeed; flyingSpeed = abilities.getFlyingSpeed(); - this->Mob::travel(xa, ya); - this->yd = ydo * 0.6; + LivingEntity::travel(xa, ya); + yd = ydo * 0.6; flyingSpeed = ofs; } else { - this->Mob::travel(xa, ya); + LivingEntity::travel(xa, ya); } checkMovementStatistiscs(x - preX, y - preY, z - preZ); } +float Player::getSpeed() +{ + return (float) getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->getValue(); +} void Player::checkMovementStatistiscs(double dx, double dy, double dz) { @@ -2142,7 +2198,7 @@ void Player::checkRidingStatistiscs(double dx, double dy, double dz) int distance = (int) Math::round(sqrt(dx * dx + dy * dy + dz * dz) * 100.0f); if (distance > 0) { - if ( dynamic_pointer_cast( riding ) ) + if ( riding->instanceof(eTYPE_MINECART) ) { distanceMinecart += distance; if( distanceMinecart >= 100 ) @@ -2189,7 +2245,7 @@ void Player::checkRidingStatistiscs(double dx, double dy, double dz) } } - else if (dynamic_pointer_cast( riding ) != NULL) + else if ( riding->instanceof(eTYPE_BOAT) ) { distanceBoat += distance; if( distanceBoat >= 100 ) @@ -2199,7 +2255,7 @@ void Player::checkRidingStatistiscs(double dx, double dy, double dz) awardStat(GenericStats::boatOneM(), GenericStats::param_boat(newDistance/100) ); } } - else if (dynamic_pointer_cast( riding ) != NULL) + else if ( riding->instanceof(eTYPE_PIG) ) { distancePig += distance; if( distancePig >= 100 ) @@ -2228,14 +2284,14 @@ void Player::causeFallDamage(float distance) awardStat(GenericStats::fallOneM(), GenericStats::param_fall(newDistance/100) ); } } - this->Mob::causeFallDamage(distance); + LivingEntity::causeFallDamage(distance); } -void Player::killed(shared_ptr mob) +void Player::killed(shared_ptr mob) { // 4J-PB - added the lavaslime enemy - fix for #64007 - TU7: Code: Achievements: TCR#073: Killing Magma Cubes doesn't unlock "Monster Hunter" Achievement. - if( dynamic_pointer_cast( mob ) != NULL || mob->GetType() == eTYPE_GHAST || mob->GetType() == eTYPE_SLIME || mob->GetType() == eTYPE_LAVASLIME || mob->GetType() == eTYPE_ENDERDRAGON) + if( mob->instanceof(eTYPE_ENEMY) || mob->GetType() == eTYPE_GHAST || mob->GetType() == eTYPE_SLIME || mob->GetType() == eTYPE_LAVASLIME || mob->GetType() == eTYPE_ENDERDRAGON) { awardStat(GenericStats::killEnemy(), GenericStats::param_noArgs()); @@ -2282,9 +2338,14 @@ void Player::killed(shared_ptr mob) } } +void Player::makeStuckInWeb() +{ + if (!abilities.flying) LivingEntity::makeStuckInWeb(); +} + Icon *Player::getItemInHandIcon(shared_ptr item, int layer) { - Icon *icon = Mob::getItemInHandIcon(item, layer); + Icon *icon = LivingEntity::getItemInHandIcon(item, layer); if (item->id == Item::fishingRod->id && fishing != NULL) { icon = Item::fishingRod->getEmptyIcon(); @@ -2317,21 +2378,9 @@ shared_ptr Player::getArmor(int pos) return inventory->getArmor(pos); } -void Player::handleInsidePortal() -{ - if (changingDimensionDelay > 0) - { - changingDimensionDelay = 10; - return; - } - - isInsidePortal = true; -} - void Player::increaseXp(int i) { - // Update xp calculations from 1.3 - score += i; + increaseScore(i); int max = INT_MAX - totalExperience; if (i > max) { @@ -2342,17 +2391,26 @@ void Player::increaseXp(int i) while (experienceProgress >= 1) { experienceProgress = (experienceProgress - 1) * getXpNeededForNextLevel(); - levelUp(); + giveExperienceLevels(1); experienceProgress /= getXpNeededForNextLevel(); } } -void Player::withdrawExperienceLevels(int amount) +void Player::giveExperienceLevels(int amount) { - experienceLevel -= amount; + experienceLevel += amount; if (experienceLevel < 0) { experienceLevel = 0; + experienceProgress = 0; + totalExperience = 0; + } + + if (amount > 0 && experienceLevel % 5 == 0 && lastLevelUpTime < tickCount - SharedConstants::TICKS_PER_SECOND * 5.0f) + { + float vol = experienceLevel > 30 ? 1 : experienceLevel / 30.0f; + level->playEntitySound(shared_from_this(), eSoundType_RANDOM_LEVELUP, vol * 0.75f, 1); + lastLevelUpTime = tickCount; } } @@ -2370,11 +2428,6 @@ int Player::getXpNeededForNextLevel() return 17; } -void Player::levelUp() -{ - experienceLevel++; -} - /** * This method adds on to the player's exhaustion, which may decrease the * player's food level. @@ -2433,13 +2486,49 @@ void Player::startUsingItem(shared_ptr instance, int duration) #endif } -bool Player::mayBuild(int x, int y, int z) +bool Player::mayDestroyBlockAt(int x, int y, int z) { - return abilities.mayBuild; + if (abilities.mayBuild) + { + return true; + } + int t = level->getTile(x, y, z); + if (t > 0) { + Tile *tile = Tile::tiles[t]; + + if (tile->material->isDestroyedByHand()) + { + return true; + } + else if (getSelectedItem() != NULL) + { + shared_ptr carried = getSelectedItem(); + + if (carried->canDestroySpecial(tile) || carried->getDestroySpeed(tile) > 1) + { + return true; + } + } + } + return false; +} + +bool Player::mayUseItemAt(int x, int y, int z, int face, shared_ptr item) +{ + if (abilities.mayBuild) + { + return true; + } + if (item != NULL) + { + return item->mayBePlacedInAdventureMode(); + } + return false; } int Player::getExperienceReward(shared_ptr killedBy) { + if (level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY)) return 0; int reward = experienceLevel * 7; if (reward > 100) { @@ -2459,8 +2548,9 @@ wstring Player::getAName() return name; } -void Player::changeDimension(int i) +bool Player::shouldShowName() { + return true; } void Player::restoreFrom(shared_ptr oldPlayer, bool restoreAll) @@ -2469,21 +2559,24 @@ void Player::restoreFrom(shared_ptr oldPlayer, bool restoreAll) { inventory->replaceWith(oldPlayer->inventory); - health = oldPlayer->health; + setHealth(oldPlayer->getHealth()); foodData = oldPlayer->foodData; experienceLevel = oldPlayer->experienceLevel; totalExperience = oldPlayer->totalExperience; experienceProgress = oldPlayer->experienceProgress; - score = oldPlayer->score; + setScore(oldPlayer->getScore()); + portalEntranceDir = oldPlayer->portalEntranceDir; + } + else if (level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY)) + { + inventory->replaceWith(oldPlayer->inventory); - for(AUTO_VAR(it, oldPlayer->activeEffects.begin()); it != oldPlayer->activeEffects.end(); ++it) - { - MobEffectInstance *instance = it->second; - addEffectNoUpdate( instance ); - } - oldPlayer->activeEffects.clear(); + experienceLevel = oldPlayer->experienceLevel; + totalExperience = oldPlayer->totalExperience; + experienceProgress = oldPlayer->experienceProgress; + setScore(oldPlayer->getScore()); } enderChestInventory = oldPlayer->enderChestInventory; } @@ -2508,25 +2601,83 @@ wstring Player::getName() wstring Player::getDisplayName() { - return displayName; + //PlayerTeam.formatNameForTeam(getTeam(), name); + + // If player display name is not set, return name + return m_displayName.size() > 0 ? m_displayName : name; } -//Language getLanguage() { return Language.getInstance(); } -//String localize(String key, Object... args) { return getLanguage().getElement(key, args); } +wstring Player::getNetworkName() +{ + // 4J: We can only transmit gamertag in network packets + return name; +} + +Level *Player::getCommandSenderWorld() +{ + return level; +} shared_ptr Player::getEnderChestInventory() { return enderChestInventory; } +shared_ptr Player::getCarried(int slot) +{ + if (slot == 0) return inventory->getSelected(); + return inventory->armor[slot - 1]; +} + shared_ptr Player::getCarriedItem() { return inventory->getSelected(); } +void Player::setEquippedSlot(int slot, shared_ptr item) +{ + inventory->armor[slot] = item; +} + bool Player::isInvisibleTo(shared_ptr player) { - return isInvisible(); + return isInvisible(); +} + +ItemInstanceArray Player::getEquipmentSlots() +{ + return inventory->armor; +} + +bool Player::isCapeHidden() +{ + return getPlayerFlag(FLAG_HIDE_CAPE); +} + +bool Player::isPushedByWater() +{ + return !abilities.flying; +} + +Scoreboard *Player::getScoreboard() +{ + return level->getScoreboard(); +} + +Team *Player::getTeam() +{ + return getScoreboard()->getPlayersTeam(name); +} + +void Player::setAbsorptionAmount(float absorptionAmount) +{ + if (absorptionAmount < 0) absorptionAmount = 0; + getEntityData()->set(DATA_PLAYER_ABSORPTION_ID, absorptionAmount); +} + +float Player::getAbsorptionAmount() +{ + return getEntityData()->getFloat(DATA_PLAYER_ABSORPTION_ID); } int Player::getTexture() @@ -2561,7 +2712,7 @@ int Player::hash_fnct(const shared_ptr k) #ifdef __PS3__ return (int)boost::hash_value( k->name ); // 4J Stu - Names are completely unique? #else - return (int)std::hash{}( k->name ); // 4J Stu - Names are completely unique? + return (int)std::hash{}(k->name); // 4J Stu - Names are completely unique? #endif //__PS3__ } @@ -2770,12 +2921,12 @@ bool Player::isAllowedToInteract(shared_ptr target) bool allowed = true; if(app.GetGameHostOption(eGameHostOption_TrustPlayers) == 0) { - if (target->GetType() == eTYPE_MINECART) + if (target->instanceof(eTYPE_MINECART)) { if (getPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanUseContainers) == 0) { shared_ptr minecart = dynamic_pointer_cast( target ); - if (minecart->type == Minecart::CHEST) + if (minecart->getType() == Minecart::TYPE_CHEST) allowed = false; } diff --git a/Minecraft.World/Player.h b/Minecraft.World/Player.h index 185a70a7..2e223a1e 100644 --- a/Minecraft.World/Player.h +++ b/Minecraft.World/Player.h @@ -1,25 +1,29 @@ #pragma once using namespace std; -#include "Mob.h" +#include "LivingEntity.h" #include "Definitions.h" #include "Abilities.h" #include "FoodData.h" #include "PlayerEnderChestContainer.h" #include "CommandSender.h" +#include "ScoreHolder.h" class AbstractContainerMenu; class Stats; class FishingHook; - +class EntityHorse; class ItemEntity; class Slot; class Pos; - +class TileEntity; +class BeaconTileEntity; class FurnaceTileEntity; class DispenserTileEntity; class SignTileEntity; class BrewingStandTileEntity; +class HopperTileEntity; +class MinecartHopper; class Inventory; class Container; class FoodData; @@ -27,13 +31,13 @@ class DamageSource; class Merchant; class PlayerEnderChestContainer; class GameType; +class Scoreboard; -class Player : public Mob, public CommandSender +class Player : public LivingEntity, public CommandSender, public ScoreHolder { public: static const int MAX_NAME_LENGTH = 16 + 4; static const int MAX_HEALTH = 20; - static const int SWING_DURATION = 6; static const int SLEEP_DURATION = 100; static const int WAKE_UP_DURATION = 10; @@ -47,7 +51,11 @@ private: static const int FLY_ACHIEVEMENT_SPEED = 25; static const int DATA_PLAYER_FLAGS_ID = 16; - static const int DATA_PLAYER_RUNNING_ID = 17; + static const int DATA_PLAYER_ABSORPTION_ID = 17; + static const int DATA_SCORE_ID = 18; + +protected: + static const int FLAG_HIDE_CAPE = 1; public: shared_ptr inventory; @@ -65,16 +73,14 @@ protected: public: BYTE userType; - int score; float oBob, bob; - bool swinging; - int swingTime; wstring name; - int dimension; int takeXpDelay; // 4J-PB - track custom skin + wstring customTextureUrl; + wstring customTextureUrl2; unsigned int m_uiPlayerCurrentSkin; void ChangePlayerSkin(); @@ -83,8 +89,8 @@ public: double xCloakO, yCloakO, zCloakO; double xCloak, yCloak, zCloak; - // 4J-HEG - store display name, added for Xbox One - wstring displayName; + // 4J-HG: store display name, added for Xbox One "game display name" + wstring m_displayName; protected: // player sleeping in bed? @@ -103,20 +109,13 @@ public: private: Pos *respawnPosition; + bool respawnForced; Pos *minecartAchievementPos; //4J Gordon: These are in cms, every time they go > 1m they are entered into the stats int distanceWalk, distanceSwim, distanceFall, distanceClimb, distanceMinecart, distanceBoat, distancePig; public: - int changingDimensionDelay; - -protected: - bool isInsidePortal; - -public: - float portalTime, oPortalTime; - Abilities abilities; int experienceLevel, totalExperience; @@ -131,6 +130,9 @@ protected: float defaultWalkSpeed; float defaultFlySpeed; +private: + int lastLevelUpTime; + public: eINSTANCEOF GetType() { return eTYPE_PLAYER; } @@ -138,11 +140,11 @@ public: // 4J Added to default init void _init(); - Player(Level *level); + Player(Level *level, const wstring &name); virtual ~Player(); - virtual int getMaxHealth(); protected: + virtual void registerAttributes(); virtual void defineSynchedData(); public: @@ -153,7 +155,13 @@ public: void stopUsingItem(); virtual bool isBlocking(); + // 4J Stu - Added for things that should only be ticked once per simulation frame + virtual void updateFrameTick(); + virtual void tick(); + virtual int getPortalWaitTime(); + virtual int getDimensionChangingDelay(); + virtual void playSound(int iSound, float volume, float pitch); protected: void spawnEatParticles(shared_ptr useItem, int count); @@ -172,9 +180,6 @@ public: virtual void rideTick(); virtual void resetPos(); -private: - int getCurrentSwingDuration(); - protected: virtual void serverAiStep(); @@ -185,18 +190,14 @@ private: virtual void touch(shared_ptr entity); public: - //bool addResource(int resource); // 4J - Removed 1.0.1 - int getScore(); + virtual int getScore(); + virtual void setScore(int value); + virtual void increaseScore(int amount); virtual void die(DamageSource *source); - void awardKillScore(shared_ptr victim, int score); - -protected: - virtual int decreaseAirSupply(int currentSupply); - -public: + virtual void awardKillScore(shared_ptr victim, int awardPoints); virtual bool isShootable(); bool isCreativeModeAllowed(); - virtual shared_ptr drop(); + virtual shared_ptr drop(bool all); shared_ptr drop(shared_ptr item); shared_ptr drop(shared_ptr item, bool randomly); @@ -204,16 +205,18 @@ protected: virtual void reallyDrop(shared_ptr thrownItem); public: - float getDestroySpeed(Tile *tile); + float getDestroySpeed(Tile *tile, bool hasProperTool); bool canDestroy(Tile *tile); virtual void readAdditionalSaveData(CompoundTag *entityTag); virtual void addAdditonalSaveData(CompoundTag *entityTag); - static Pos *getRespawnPosition(Level *level, CompoundTag *entityTag); virtual bool openContainer(shared_ptr container); // 4J - added bool return - virtual bool startEnchanting(int x, int y, int z); // 4J - added bool return + virtual bool openHopper(shared_ptr container); + virtual bool openHopper(shared_ptr container); + virtual bool openHorseInventory(shared_ptr horse, shared_ptr container); + virtual bool startEnchanting(int x, int y, int z, const wstring &name); // 4J - added bool return virtual bool startRepairing(int x, int y, int z); // 4J - added bool return - virtual bool startCrafting(int x, int y, int z); // 4J - added boo return - virtual void take(shared_ptr e, int orgCount); + virtual bool startCrafting(int x, int y, int z); // 4J - added bool return + virtual bool openFireworks(int x, int y, int z); // 4J - added virtual float getHeadHeight(); // 4J-PB - added to keep the code happy with the change to make the third person view per player @@ -226,35 +229,34 @@ protected: public: shared_ptr fishing; - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); + virtual bool canHarmPlayer(shared_ptr target); + virtual bool canHarmPlayer(wstring targetName); // 4J: Added for ServerPlayer when only player name is provided protected: - virtual int getDamageAfterMagicAbsorb(DamageSource *damageSource, int damage); - virtual bool isPlayerVersusPlayer(); - void directAllTameWolvesOnTarget(shared_ptr target, bool skipSitting); - virtual void hurtArmor(int damage); + virtual void hurtArmor(float damage); public: virtual int getArmorValue(); - float getArmorCoverPercentage(); + virtual float getArmorCoverPercentage(); protected: - virtual void actuallyHurt(DamageSource *source, int dmg); + virtual void actuallyHurt(DamageSource *source, float dmg); public: using Entity::interact; virtual bool openFurnace(shared_ptr container); // 4J - added bool return virtual bool openTrap(shared_ptr container); // 4J - added bool return - virtual void openTextEdit(shared_ptr sign); + virtual void openTextEdit(shared_ptr sign); virtual bool openBrewingStand(shared_ptr brewingStand); // 4J - added bool return - virtual bool openTrading(shared_ptr traderTarget); // 4J - added bool return + virtual bool openBeacon(shared_ptr beacon); + virtual bool openTrading(shared_ptr traderTarget, const wstring &name); // 4J - added bool return virtual void openItemInstanceGui(shared_ptr itemInstance); virtual bool interact(shared_ptr entity); virtual shared_ptr getSelectedItem(); void removeSelectedItem(); virtual double getRidingHeight(); - virtual void swing(); virtual void attack(shared_ptr entity); virtual void crit(shared_ptr entity); virtual void magicCrit(shared_ptr entity); @@ -298,7 +300,7 @@ private: bool checkBed(); public: - static Pos *checkBedValidRespawnPosition(Level *level, Pos *pos); + static Pos *checkBedValidRespawnPosition(Level *level, Pos *pos, bool forced); float getSleepRotation(); bool isSleeping(); bool isSleepingLongEnough(); @@ -316,16 +318,18 @@ public: * client. */ virtual void displayClientMessage(int messageId); - Pos *getRespawnPosition(); - void setRespawnPosition(Pos *respawnPosition); + virtual Pos *getRespawnPosition(); + virtual bool isRespawnForced(); + virtual void setRespawnPosition(Pos *respawnPosition, bool forced); virtual void awardStat(Stat *stat, byteArray param); protected: void jumpFromGround(); public: - void travel(float xa, float ya); - void checkMovementStatistiscs(double dx, double dy, double dz); + virtual void travel(float xa, float ya); + virtual float getSpeed(); + virtual void checkMovementStatistiscs(double dx, double dy, double dz); private: void checkRidingStatistiscs(double dx, double dy, double dz); @@ -336,25 +340,20 @@ protected: virtual void causeFallDamage(float distance); public: - virtual void killed(shared_ptr mob); + virtual void killed(shared_ptr mob); + virtual void makeStuckInWeb(); virtual Icon *getItemInHandIcon(shared_ptr item, int layer); virtual shared_ptr getArmor(int pos); - virtual void handleInsidePortal(); - - void increaseXp(int i); - virtual void withdrawExperienceLevels(int amount); + virtual void increaseXp(int i); + virtual void giveExperienceLevels(int amount); int getXpNeededForNextLevel(); - -private: - void levelUp(); - -public: void causeFoodExhaustion(float amount); FoodData *getFoodData(); bool canEat(bool magicalItem); bool isHurt(); virtual void startUsingItem(shared_ptr instance, int duration); - bool mayBuild(int x, int y, int z); + virtual bool mayDestroyBlockAt(int x, int y, int z); + virtual bool mayUseItemAt(int x, int y, int z, int face, shared_ptr item); protected: virtual int getExperienceReward(shared_ptr killedBy); @@ -362,8 +361,7 @@ protected: public: virtual wstring getAName(); - - virtual void changeDimension(int i); + virtual bool shouldShowName(); virtual void restoreFrom(shared_ptr oldPlayer, bool restoreAll); protected: @@ -373,17 +371,26 @@ public: void onUpdateAbilities(); void setGameMode(GameType *mode); wstring getName(); - wstring getDisplayName(); // 4J added + virtual wstring getDisplayName(); + virtual wstring getNetworkName(); // 4J: Added - //Language getLanguage() { return Language.getInstance(); } - //String localize(String key, Object... args) { return getLanguage().getElement(key, args); } + virtual Level *getCommandSenderWorld(); shared_ptr getEnderChestInventory(); -public: + virtual shared_ptr getCarried(int slot); virtual shared_ptr getCarriedItem(); - + virtual void setEquippedSlot(int slot, shared_ptr item); virtual bool isInvisibleTo(shared_ptr player); + virtual ItemInstanceArray getEquipmentSlots(); + virtual bool isCapeHidden(); + virtual bool isPushedByWater(); + virtual Scoreboard *getScoreboard(); + virtual Team *getTeam(); + virtual void setAbsorptionAmount(float absorptionAmount); + virtual float getAbsorptionAmount(); + + //////// 4J ///////////////// static int hash_fnct(const shared_ptr k); static bool eq_test(const shared_ptr x, const shared_ptr y); @@ -410,8 +417,6 @@ public: PlayerUID getXuid() { return m_xuid; } void setOnlineXuid(PlayerUID xuid) { m_OnlineXuid = xuid; } PlayerUID getOnlineXuid() { return m_OnlineXuid; } - void setUUID(const wstring &UUID) { m_UUID = UUID; } - wstring getUUID() { return m_UUID; } void setPlayerIndex(DWORD dwIndex) { m_playerIndex = dwIndex; } DWORD getPlayerIndex() { return m_playerIndex; } @@ -421,15 +426,13 @@ public: void setShowOnMaps(bool bVal) { m_bShownOnMaps = bVal; } bool canShowOnMaps() { return m_bShownOnMaps && !getPlayerGamePrivilege(ePlayerGamePrivilege_Invisible); } - + virtual void sendMessage(const wstring& message, ChatPacket::EChatPacketMessage type = ChatPacket::e_ChatCustom, int customData = -1, const wstring& additionalMessage = L"") { } private: PlayerUID m_xuid; PlayerUID m_OnlineXuid; protected: - wstring m_UUID; // 4J Added - bool m_bShownOnMaps; bool m_bIsGuest; diff --git a/Minecraft.World/PlayerAbilitiesPacket.cpp b/Minecraft.World/PlayerAbilitiesPacket.cpp index b1b854a5..d02f164c 100644 --- a/Minecraft.World/PlayerAbilitiesPacket.cpp +++ b/Minecraft.World/PlayerAbilitiesPacket.cpp @@ -3,8 +3,6 @@ #include "net.minecraft.network.packet.h" #include "PlayerAbilitiesPacket.h" -const float PlayerAbilitiesPacket::SPEED_ACCURACY = 255.0f; - PlayerAbilitiesPacket::PlayerAbilitiesPacket() { invulnerable = false; @@ -17,24 +15,24 @@ PlayerAbilitiesPacket::PlayerAbilitiesPacket() PlayerAbilitiesPacket::PlayerAbilitiesPacket(Abilities *abilities) { - this->setInvulnerable(abilities->invulnerable); - this->setFlying(abilities->flying); - this->setCanFly(abilities->mayfly); - this->setInstabuild(abilities->instabuild); - this->setFlyingSpeed(abilities->getFlyingSpeed()); - this->setWalkingSpeed(abilities->getWalkingSpeed()); + setInvulnerable(abilities->invulnerable); + setFlying(abilities->flying); + setCanFly(abilities->mayfly); + setInstabuild(abilities->instabuild); + setFlyingSpeed(abilities->getFlyingSpeed()); + setWalkingSpeed(abilities->getWalkingSpeed()); } void PlayerAbilitiesPacket::read(DataInputStream *dis) { byte bitfield = dis->readByte(); - this->setInvulnerable((bitfield & FLAG_INVULNERABLE) > 0); - this->setFlying((bitfield & FLAG_FLYING) > 0); - this->setCanFly((bitfield & FLAG_CAN_FLY) > 0); - this->setInstabuild((bitfield & FLAG_INSTABUILD) > 0); - this->setFlyingSpeed(dis->readByte() / SPEED_ACCURACY); - this->setWalkingSpeed(dis->readByte() / SPEED_ACCURACY); + setInvulnerable((bitfield & FLAG_INVULNERABLE) > 0); + setFlying((bitfield & FLAG_FLYING) > 0); + setCanFly((bitfield & FLAG_CAN_FLY) > 0); + setInstabuild((bitfield & FLAG_INSTABUILD) > 0); + setFlyingSpeed(dis->readFloat()); + setWalkingSpeed(dis->readFloat()); } void PlayerAbilitiesPacket::write(DataOutputStream *dos) @@ -47,8 +45,8 @@ void PlayerAbilitiesPacket::write(DataOutputStream *dos) if (canInstabuild()) bitfield |= FLAG_INSTABUILD; dos->writeByte(bitfield); - dos->writeByte((int) (flyingSpeed * SPEED_ACCURACY)); - dos->writeByte((int) (walkingSpeed * SPEED_ACCURACY)); + dos->writeFloat(flyingSpeed); + dos->writeFloat(walkingSpeed); } void PlayerAbilitiesPacket::handle(PacketListener *listener) @@ -113,7 +111,7 @@ float PlayerAbilitiesPacket::getFlyingSpeed() void PlayerAbilitiesPacket::setFlyingSpeed(float flySpeed) { - this->flyingSpeed = flySpeed; + flyingSpeed = flySpeed; } float PlayerAbilitiesPacket::getWalkingSpeed() diff --git a/Minecraft.World/PlayerAbilitiesPacket.h b/Minecraft.World/PlayerAbilitiesPacket.h index 21c1fdc2..8cd82bf5 100644 --- a/Minecraft.World/PlayerAbilitiesPacket.h +++ b/Minecraft.World/PlayerAbilitiesPacket.h @@ -11,7 +11,6 @@ private: static const int FLAG_FLYING = 1 << 1; static const int FLAG_CAN_FLY = 1 << 2; static const int FLAG_INSTABUILD = 1 << 3; - static const float SPEED_ACCURACY; bool invulnerable; bool _isFlying; diff --git a/Minecraft.World/PlayerActionPacket.cpp b/Minecraft.World/PlayerActionPacket.cpp index ce438cb6..aaa3e37e 100644 --- a/Minecraft.World/PlayerActionPacket.cpp +++ b/Minecraft.World/PlayerActionPacket.cpp @@ -7,7 +7,7 @@ const int PlayerActionPacket::START_DESTROY_BLOCK = 0; const int PlayerActionPacket::ABORT_DESTROY_BLOCK = 1; const int PlayerActionPacket::STOP_DESTROY_BLOCK = 2; -const int PlayerActionPacket::GET_UPDATED_BLOCK = 3; +const int PlayerActionPacket::DROP_ALL_ITEMS = 3; const int PlayerActionPacket::DROP_ITEM = 4; const int PlayerActionPacket::RELEASE_USE_ITEM = 5; @@ -31,11 +31,11 @@ PlayerActionPacket::PlayerActionPacket(int action, int x, int y, int z, int face void PlayerActionPacket::read(DataInputStream *dis) //throws IOException { - action = dis->read(); + action = dis->readUnsignedByte(); x = dis->readInt(); - y = dis->read(); + y = dis->readUnsignedByte(); z = dis->readInt(); - face = dis->read(); + face = dis->readUnsignedByte(); } void PlayerActionPacket::write(DataOutputStream *dos) //throws IOException diff --git a/Minecraft.World/PlayerActionPacket.h b/Minecraft.World/PlayerActionPacket.h index 0228ebb4..45c077d2 100644 --- a/Minecraft.World/PlayerActionPacket.h +++ b/Minecraft.World/PlayerActionPacket.h @@ -9,7 +9,7 @@ public: static const int START_DESTROY_BLOCK; static const int ABORT_DESTROY_BLOCK; static const int STOP_DESTROY_BLOCK; - static const int GET_UPDATED_BLOCK; + static const int DROP_ALL_ITEMS; static const int DROP_ITEM; static const int RELEASE_USE_ITEM; diff --git a/Minecraft.World/PlayerCommandPacket.cpp b/Minecraft.World/PlayerCommandPacket.cpp index 6aecc0e6..72e34c80 100644 --- a/Minecraft.World/PlayerCommandPacket.cpp +++ b/Minecraft.World/PlayerCommandPacket.cpp @@ -14,30 +14,43 @@ const int PlayerCommandPacket::START_SPRINTING = 4; const int PlayerCommandPacket::STOP_SPRINTING = 5; const int PlayerCommandPacket::START_IDLEANIM = 6; const int PlayerCommandPacket::STOP_IDLEANIM = 7; +const int PlayerCommandPacket::RIDING_JUMP = 8; +const int PlayerCommandPacket::OPEN_INVENTORY = 9; PlayerCommandPacket::PlayerCommandPacket() { id = -1; action = 0; + data = 0; } PlayerCommandPacket::PlayerCommandPacket(shared_ptr e, int action) { id = e->entityId; this->action = action; + this->data = 0; +} + +PlayerCommandPacket::PlayerCommandPacket(shared_ptr e, int action, int data) +{ + id = e->entityId; + this->action = action; + this->data = data; } void PlayerCommandPacket::read(DataInputStream *dis) //throws IOException { id = dis->readInt(); action = dis->readByte(); + data = dis->readInt(); } void PlayerCommandPacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(id); dos->writeByte(action); + dos->writeInt(data); } void PlayerCommandPacket::handle(PacketListener *listener) @@ -47,5 +60,5 @@ void PlayerCommandPacket::handle(PacketListener *listener) int PlayerCommandPacket::getEstimatedSize() { - return 5; + return 9; } diff --git a/Minecraft.World/PlayerCommandPacket.h b/Minecraft.World/PlayerCommandPacket.h index dd6c8cb1..92ee57eb 100644 --- a/Minecraft.World/PlayerCommandPacket.h +++ b/Minecraft.World/PlayerCommandPacket.h @@ -7,12 +7,14 @@ class PlayerCommandPacket : public Packet, public enable_shared_from_this e, int action); + PlayerCommandPacket(shared_ptr e, int action, int data); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/PlayerEnderChestContainer.cpp b/Minecraft.World/PlayerEnderChestContainer.cpp index 466d9710..f0a1aaa3 100644 --- a/Minecraft.World/PlayerEnderChestContainer.cpp +++ b/Minecraft.World/PlayerEnderChestContainer.cpp @@ -1,12 +1,18 @@ #include "stdafx.h" #include "net.minecraft.world.level.tile.entity.h" +#include "ContainerOpenPacket.h" #include "PlayerEnderChestContainer.h" -PlayerEnderChestContainer::PlayerEnderChestContainer() : SimpleContainer(IDS_TILE_ENDERCHEST, 9 * 3) +PlayerEnderChestContainer::PlayerEnderChestContainer() : SimpleContainer(IDS_TILE_ENDERCHEST, L"", false, 9 * 3) { activeChest = nullptr; } +int PlayerEnderChestContainer::getContainerType() +{ + return ContainerOpenPacket::ENDER_CHEST; +} + void PlayerEnderChestContainer::setActiveChest(shared_ptr activeChest) { this->activeChest = activeChest; @@ -69,4 +75,9 @@ void PlayerEnderChestContainer::stopOpen() } SimpleContainer::stopOpen(); activeChest = nullptr; +} + +bool PlayerEnderChestContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; } \ No newline at end of file diff --git a/Minecraft.World/PlayerEnderChestContainer.h b/Minecraft.World/PlayerEnderChestContainer.h index 523417aa..67522244 100644 --- a/Minecraft.World/PlayerEnderChestContainer.h +++ b/Minecraft.World/PlayerEnderChestContainer.h @@ -12,10 +12,13 @@ private: public: PlayerEnderChestContainer(); + virtual int getContainerType(); + void setActiveChest(shared_ptr activeChest); void setItemsByTag(ListTag *enderItemsList); ListTag *createTag(); bool stillValid(shared_ptr player); void startOpen(); void stopOpen(); + bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/PlayerIO.h b/Minecraft.World/PlayerIO.h index 559ab2ee..153c55e3 100644 --- a/Minecraft.World/PlayerIO.h +++ b/Minecraft.World/PlayerIO.h @@ -11,7 +11,7 @@ class PlayerIO { public: virtual void save(shared_ptr player) = 0; - virtual bool load(shared_ptr player) = 0; // 4J Changed return val to bool to check if new player or loaded player + virtual CompoundTag *load(shared_ptr player) = 0; virtual CompoundTag *loadPlayerDataTag(PlayerUID xuid) = 0; // 4J Changed from string name to xuid // 4J Added diff --git a/Minecraft.World/PlayerInputPacket.cpp b/Minecraft.World/PlayerInputPacket.cpp index 6dd6fcae..04aebf0f 100644 --- a/Minecraft.World/PlayerInputPacket.cpp +++ b/Minecraft.World/PlayerInputPacket.cpp @@ -8,40 +8,32 @@ PlayerInputPacket::PlayerInputPacket() { - xa = 0.0f; - ya = 0.0f; + xxa = 0.0f; + yya = 0.0f; isJumpingVar = false; isSneakingVar = false; - xRot = 0.0f; - yRot = 0.0f; } -PlayerInputPacket::PlayerInputPacket(float xa, float ya, bool isJumpingVar, bool isSneakingVar, float xRot, float yRot) +PlayerInputPacket::PlayerInputPacket(float xxa, float yya, bool isJumpingVar, bool isSneakingVar) { - this->xa = xa; - this->ya = ya; + this->xxa = xxa; + this->yya = yya; this->isJumpingVar = isJumpingVar; this->isSneakingVar = isSneakingVar; - this->xRot = xRot; - this->yRot = yRot; } void PlayerInputPacket::read(DataInputStream *dis) //throws IOException { - xa = dis->readFloat(); - ya = dis->readFloat(); - xRot = dis->readFloat(); - yRot = dis->readFloat(); + xxa = dis->readFloat(); + yya = dis->readFloat(); isJumpingVar = dis->readBoolean(); isSneakingVar = dis->readBoolean(); } void PlayerInputPacket::write(DataOutputStream *dos) //throws IOException { - dos->writeFloat(xa); - dos->writeFloat(ya); - dos->writeFloat(xRot); - dos->writeFloat(yRot); + dos->writeFloat(xxa); + dos->writeFloat(yya); dos->writeBoolean(isJumpingVar); dos->writeBoolean(isSneakingVar); } @@ -53,27 +45,17 @@ void PlayerInputPacket::handle(PacketListener *listener) int PlayerInputPacket::getEstimatedSize() { - return 18; + return 10; } -float PlayerInputPacket::getXa() +float PlayerInputPacket::getXxa() { - return xa; + return xxa; } -float PlayerInputPacket::getXRot() +float PlayerInputPacket::getYya() { - return xRot; -} - -float PlayerInputPacket::getYa() -{ - return ya; -} - -float PlayerInputPacket::getYRot() -{ - return yRot; + return yya; } bool PlayerInputPacket::isJumping() diff --git a/Minecraft.World/PlayerInputPacket.h b/Minecraft.World/PlayerInputPacket.h index 8bc11d3e..bc2d3985 100644 --- a/Minecraft.World/PlayerInputPacket.h +++ b/Minecraft.World/PlayerInputPacket.h @@ -7,26 +7,22 @@ class PlayerInputPacket : public Packet, public enable_shared_from_this args = getArguments(matcher.group(TARGETS_GROUP_ARGS)); + String type = matcher.group(TARGETS_GROUP_TYPE); + int rangeMin = getDefaultRangeMin(type); + int rangeMax = getDefaultRangeMax(type); + int levelMin = getDefaultLevelMin(type); + int levelMax = getDefaultLevelMax(type); + int count = getDefaultCount(type); + int mode = LevelSettings.GameType.NOT_SET.getId(); + Pos pos = source.getCommandSenderWorldPosition(); + Map scores = getScores(args); + String name = null; + String team = null; + boolean requireLevel = false; + + if (args.containsKey(ARGUMENT_RANGE_MIN)) { + rangeMin = Mth.getInt(args.get(ARGUMENT_RANGE_MIN), rangeMin); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_RANGE_MAX)) { + rangeMax = Mth.getInt(args.get(ARGUMENT_RANGE_MAX), rangeMax); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_LEVEL_MIN)) { + levelMin = Mth.getInt(args.get(ARGUMENT_LEVEL_MIN), levelMin); + } + if (args.containsKey(ARGUMENT_LEVEL_MAX)) { + levelMax = Mth.getInt(args.get(ARGUMENT_LEVEL_MAX), levelMax); + } + if (args.containsKey(ARGUMENT_COORDINATE_X)) { + pos.x = Mth.getInt(args.get(ARGUMENT_COORDINATE_X), pos.x); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_COORDINATE_Y)) { + pos.y = Mth.getInt(args.get(ARGUMENT_COORDINATE_Y), pos.y); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_COORDINATE_Z)) { + pos.z = Mth.getInt(args.get(ARGUMENT_COORDINATE_Z), pos.z); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_MODE)) { + mode = Mth.getInt(args.get(ARGUMENT_MODE), mode); + } + if (args.containsKey(ARGUMENT_COUNT)) { + count = Mth.getInt(args.get(ARGUMENT_COUNT), count); + } + if (args.containsKey(ARGUMENT_TEAM_NAME)) { + team = args.get(ARGUMENT_TEAM_NAME); + } + if (args.containsKey(ARGUMENT_PLAYER_NAME)) { + name = args.get(ARGUMENT_PLAYER_NAME); + } + + Level level = requireLevel ? source.getCommandSenderWorld() : null; + + if (type.equals(TARGET_NEAREST) || type.equals(TARGET_ALL)) { + List players = MinecraftServer.getInstance().getPlayers().getPlayers(pos, rangeMin, rangeMax, count, mode, levelMin, levelMax, scores, name, team, level); + return players == null || players.isEmpty() ? new ServerPlayer[0] : players.toArray(new ServerPlayer[0]); + } else if (type.equals(TARGET_RANDOM)) { + List players = MinecraftServer.getInstance().getPlayers().getPlayers(pos, rangeMin, rangeMax, 0, mode, levelMin, levelMax, scores, name, team, level); + Collections.shuffle(players); + players = players.subList(0, Math.min(count, players.size())); + return players == null || players.isEmpty() ? new ServerPlayer[0] : players.toArray(new ServerPlayer[0]); + } else { + return null; + } + } else { + return null; + } + } + + public static Map getScores(Map input) { + Map result = new HashMap(); + + for (String key : input.keySet()) { + if (key.startsWith(ARGUMENT_SCORE_PREFIX) && key.length() > ARGUMENT_SCORE_PREFIX.length()) { + String name = key.substring(ARGUMENT_SCORE_PREFIX.length()); + result.put(name, Mth.getInt(input.get(key), 1)); + } + } + + return result; + } + + public static boolean isList(String input) { + Matcher matcher = PATTERN_TARGETS.matcher(input); + + if (matcher.matches()) { + Map args = getArguments(matcher.group(TARGETS_GROUP_ARGS)); + String type = matcher.group(TARGETS_GROUP_TYPE); + int count = getDefaultCount(type); + if (args.containsKey(ARGUMENT_COUNT)) count = Mth.getInt(args.get(ARGUMENT_COUNT), count); + return count != 1; + } + + return false; + } + + public static boolean isPattern(String input, String onlyType) { + Matcher matcher = PATTERN_TARGETS.matcher(input); + + if (matcher.matches()) { + String type = matcher.group(TARGETS_GROUP_TYPE); + if (onlyType != null && !onlyType.equals(type)) return false; + + return true; + } + + return false; + } + + public static boolean isPattern(String input) { + return isPattern(input, null); + } + + private static final int getDefaultRangeMin(String type) { + return 0; + } + + private static final int getDefaultRangeMax(String type) { + return 0; + } + + private static final int getDefaultLevelMax(String type) { + return Integer.MAX_VALUE; + } + + private static final int getDefaultLevelMin(String type) { + return 0; + } + + private static final int getDefaultCount(String type) { + if (type.equals(TARGET_ALL)) { + return 0; + } else { + return 1; + } + } + + private static Map getArguments(String input) { + HashMap result = new HashMap(); + if (input == null) return result; + Matcher matcher = PATTERN_SHORT_ARGUMENT.matcher(input); + int count = 0; + int last = -1; + + while (matcher.find()) { + String name = null; + + switch (count++) { + case 0: + name = ARGUMENT_COORDINATE_X; + break; + case 1: + name = ARGUMENT_COORDINATE_Y; + break; + case 2: + name = ARGUMENT_COORDINATE_Z; + break; + case 3: + name = ARGUMENT_RANGE_MAX; + break; + } + + if (name != null && matcher.group(1).length() > 0) result.put(name, matcher.group(1)); + last = matcher.end(); + } + + if (last < input.length()) { + matcher = PATTERN_LONG_ARGUMENT.matcher(last == -1 ? input : input.substring(last)); + + while (matcher.find()) { + result.put(matcher.group(1), matcher.group(2)); + } + } + + return result; + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/PlayerTeam.cpp b/Minecraft.World/PlayerTeam.cpp new file mode 100644 index 00000000..3e159af4 --- /dev/null +++ b/Minecraft.World/PlayerTeam.cpp @@ -0,0 +1,120 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "PlayerTeam.h" + +PlayerTeam::PlayerTeam(Scoreboard *scoreboard, const wstring &name) +{ + this->scoreboard = scoreboard; + this->name = name; + displayName = name; + + prefix = L""; + suffix = L""; + allowFriendlyFire = true; + seeFriendlyInvisibles = true; +} + +Scoreboard *PlayerTeam::getScoreboard() +{ + return scoreboard; +} + +wstring PlayerTeam::getName() +{ + return name; +} + +wstring PlayerTeam::getDisplayName() +{ + return displayName; +} + +void PlayerTeam::setDisplayName(const wstring &displayName) +{ + //if (displayName == null) throw new IllegalArgumentException("Name cannot be null"); + this->displayName = displayName; + scoreboard->onTeamChanged(this); +} + +unordered_set *PlayerTeam::getPlayers() +{ + return &players; +} + +wstring PlayerTeam::getPrefix() +{ + return prefix; +} + +void PlayerTeam::setPrefix(const wstring &prefix) +{ + //if (prefix == null) throw new IllegalArgumentException("Prefix cannot be null"); + this->prefix = prefix; + scoreboard->onTeamChanged(this); +} + +wstring PlayerTeam::getSuffix() +{ + return suffix; +} + +void PlayerTeam::setSuffix(const wstring &suffix) +{ + //if (suffix == null) throw new IllegalArgumentException("Suffix cannot be null"); + this->suffix = suffix; + scoreboard->onTeamChanged(this); +} + +wstring PlayerTeam::getFormattedName(const wstring &teamMemberName) +{ + return getPrefix() + teamMemberName + getSuffix(); +} + +wstring PlayerTeam::formatNameForTeam(PlayerTeam *team) +{ + return formatNameForTeam(team, team->getDisplayName()); +} + +wstring PlayerTeam::formatNameForTeam(Team *team, const wstring &name) +{ + if (team == NULL) return name; + return team->getFormattedName(name); +} + +bool PlayerTeam::isAllowFriendlyFire() +{ + return allowFriendlyFire; +} + +void PlayerTeam::setAllowFriendlyFire(bool allowFriendlyFire) +{ + this->allowFriendlyFire = allowFriendlyFire; + scoreboard->onTeamChanged(this); +} + +bool PlayerTeam::canSeeFriendlyInvisibles() +{ + return seeFriendlyInvisibles; +} + +void PlayerTeam::setSeeFriendlyInvisibles(bool seeFriendlyInvisibles) +{ + this->seeFriendlyInvisibles = seeFriendlyInvisibles; + scoreboard->onTeamChanged(this); +} + +int PlayerTeam::packOptions() +{ + int result = 0; + + if (isAllowFriendlyFire()) result |= 1 << BIT_FRIENDLY_FIRE; + if (canSeeFriendlyInvisibles()) result |= 1 << BIT_SEE_INVISIBLES; + + return result; +} + +void PlayerTeam::unpackOptions(int options) +{ + setAllowFriendlyFire((options & (1 << BIT_FRIENDLY_FIRE)) > 0); + setSeeFriendlyInvisibles((options & (1 << BIT_SEE_INVISIBLES)) > 0); +} \ No newline at end of file diff --git a/Minecraft.World/PlayerTeam.h b/Minecraft.World/PlayerTeam.h new file mode 100644 index 00000000..bf91309a --- /dev/null +++ b/Minecraft.World/PlayerTeam.h @@ -0,0 +1,49 @@ +#pragma once + +#include "Team.h" + +class Scoreboard; + +class PlayerTeam : public Team +{ +public: + static const int MAX_NAME_LENGTH = 16; + static const int MAX_DISPLAY_NAME_LENGTH = 32; + static const int MAX_PREFIX_LENGTH = 16; + static const int MAX_SUFFIX_LENGTH = 16; + +private: + static const int BIT_FRIENDLY_FIRE = 0; + static const int BIT_SEE_INVISIBLES = 1; + + Scoreboard *scoreboard; + wstring name; + unordered_set players; + wstring displayName; + wstring prefix; + wstring suffix; + bool allowFriendlyFire; + bool seeFriendlyInvisibles; + +public: + PlayerTeam(Scoreboard *scoreboard, const wstring &name); + + Scoreboard *getScoreboard(); + wstring getName(); + wstring getDisplayName(); + void setDisplayName(const wstring &displayName); + unordered_set *getPlayers(); + wstring getPrefix(); + void setPrefix(const wstring &prefix); + wstring getSuffix(); + void setSuffix(const wstring &suffix); + wstring getFormattedName(const wstring &teamMemberName); + static wstring formatNameForTeam(PlayerTeam *team); + static wstring formatNameForTeam(Team *team, const wstring &name); + bool isAllowFriendlyFire(); + void setAllowFriendlyFire(bool allowFriendlyFire); + bool canSeeFriendlyInvisibles(); + void setSeeFriendlyInvisibles(bool seeFriendlyInvisibles); + int packOptions(); + void unpackOptions(int options); +}; \ No newline at end of file diff --git a/Minecraft.World/PortalForcer.cpp b/Minecraft.World/PortalForcer.cpp index 7c9b7a86..8880399e 100644 --- a/Minecraft.World/PortalForcer.cpp +++ b/Minecraft.World/PortalForcer.cpp @@ -3,58 +3,72 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.dimension.h" +#include "..\Minecraft.Client\ServerLevel.h" #include "PortalForcer.h" -PortalForcer::PortalForcer() +PortalForcer::PortalPosition::PortalPosition(int x, int y, int z, __int64 time) : Pos(x, y, z) { - random = new Random(); + lastUsed = time; } +PortalForcer::PortalForcer(ServerLevel *level) +{ + this->level = level; + random = new Random(level->getSeed()); +} + +PortalForcer::~PortalForcer() +{ + for(AUTO_VAR(it,cachedPortals.begin()); it != cachedPortals.end(); ++it) + { + delete it->second; + } +} -void PortalForcer::force(Level *level, shared_ptr e) +void PortalForcer::force(shared_ptr e, double xOriginal, double yOriginal, double zOriginal, float yRotOriginal) { - if (level->dimension->id == 1) + if (level->dimension->id == 1) { - int x = Mth::floor(e->x); - int y = Mth::floor(e->y) - 1; - int z = Mth::floor(e->z); + int x = Mth::floor(e->x); + int y = Mth::floor(e->y) - 1; + int z = Mth::floor(e->z); - int xa = 1; - int za = 0; - for (int b = -2; b <= 2; b++) + int xa = 1; + int za = 0; + for (int b = -2; b <= 2; b++) { - for (int s = -2; s <= 2; s++) + for (int s = -2; s <= 2; s++) { - for (int h = -1; h < 3; h++) + for (int h = -1; h < 3; h++) { - int xt = x + s * xa + b * za; - int yt = y + h; - int zt = z + s * za - b * xa; + int xt = x + s * xa + b * za; + int yt = y + h; + int zt = z + s * za - b * xa; - bool border = h < 0; + bool border = h < 0; - level->setTile(xt, yt, zt, border ? Tile::obsidian_Id : 0); - } - } - } + level->setTileAndUpdate(xt, yt, zt, border ? Tile::obsidian_Id : 0); + } + } + } - e->moveTo(x, y, z, e->yRot, 0); - e->xd = e->yd = e->zd = 0; + e->moveTo(x, y, z, e->yRot, 0); + e->xd = e->yd = e->zd = 0; - return; - } + return; + } - if (findPortal(level, e)) + if (findPortal(e, xOriginal, yOriginal, zOriginal, yRotOriginal)) { return; } - createPortal(level, e); - findPortal(level, e); + createPortal(e); + findPortal(e, xOriginal, yOriginal, zOriginal, yRotOriginal); } -bool PortalForcer::findPortal(Level *level, shared_ptr e) +bool PortalForcer::findPortal(shared_ptr e, double xOriginal, double yOriginal, double zOriginal, float yRotOriginal) { // 4J Stu - Decrease the range at which we search for a portal in the nether given our smaller nether int r = 16;//* 8; @@ -79,29 +93,47 @@ bool PortalForcer::findPortal(Level *level, shared_ptr e) int xc = Mth::floor(e->x); int zc = Mth::floor(e->z); - for (int x = xc - r; x <= xc + r; x++) + long hash = ChunkPos::hashCode(xc, zc); + bool updateCache = true; + + AUTO_VAR(it, cachedPortals.find(hash)); + if (it != cachedPortals.end()) + { + PortalPosition *pos = it->second; + + closest = 0; + xTarget = pos->x; + yTarget = pos->y; + zTarget = pos->z; + pos->lastUsed = level->getGameTime(); + updateCache = false; + } + else { - double xd = (x + 0.5) - e->x; - for (int z = zc - r; z <= zc + r; z++) + for (int x = xc - r; x <= xc + r; x++) { - double zd = (z + 0.5) - e->z; - for (int y = level->getHeight() - 1; y >= 0; y--) + double xd = (x + 0.5) - e->x; + for (int z = zc - r; z <= zc + r; z++) { - if (level->getTile(x, y, z) == Tile::portalTile_Id) + double zd = (z + 0.5) - e->z; + for (int y = level->getHeight() - 1; y >= 0; y--) { - while (level->getTile(x, y - 1, z) == Tile::portalTile_Id) + if (level->getTile(x, y, z) == Tile::portalTile_Id) { - y--; - } + while (level->getTile(x, y - 1, z) == Tile::portalTile_Id) + { + y--; + } - double yd = (y + 0.5) - e->y; - double dist = xd * xd + yd * yd + zd * zd; - if (closest < 0 || dist < closest) - { - closest = dist; - xTarget = x; - yTarget = y; - zTarget = z; + double yd = (y + 0.5) - e->y; + double dist = xd * xd + yd * yd + zd * zd; + if (closest < 0 || dist < closest) + { + closest = dist; + xTarget = x; + yTarget = y; + zTarget = z; + } } } } @@ -114,18 +146,110 @@ bool PortalForcer::findPortal(Level *level, shared_ptr e) int y = yTarget; int z = zTarget; + if (updateCache) + { + cachedPortals[hash] = new PortalPosition(x, y, z, level->getGameTime()); + cachedPortalKeys.push_back(hash); + } + double xt = x + 0.5; double yt = y + 0.5; double zt = z + 0.5; + int dir = Direction::UNDEFINED; - if (level->getTile(x - 1, y, z) == Tile::portalTile_Id) xt -= 0.5; - if (level->getTile(x + 1, y, z) == Tile::portalTile_Id) xt += 0.5; + if (level->getTile(x - 1, y, z) == Tile::portalTile_Id) dir = Direction::NORTH; + if (level->getTile(x + 1, y, z) == Tile::portalTile_Id) dir = Direction::SOUTH; + if (level->getTile(x, y, z - 1) == Tile::portalTile_Id) dir = Direction::EAST; + if (level->getTile(x, y, z + 1) == Tile::portalTile_Id) dir = Direction::WEST; - if (level->getTile(x, y, z - 1) == Tile::portalTile_Id) zt -= 0.5; - if (level->getTile(x, y, z + 1) == Tile::portalTile_Id) zt += 0.5; + int originalDir = e->getPortalEntranceDir(); - e->moveTo(xt, yt, zt, e->yRot, 0); - e->xd = e->yd = e->zd = 0; + if (dir > Direction::UNDEFINED) + { + int leftDir = Direction::DIRECTION_COUNTER_CLOCKWISE[dir]; + int forwardsx = Direction::STEP_X[dir]; + int forwardsz = Direction::STEP_Z[dir]; + int leftx = Direction::STEP_X[leftDir]; + int leftz = Direction::STEP_Z[leftDir]; + + bool leftBlocked = !level->isEmptyTile(x + forwardsx + leftx, y, z + forwardsz + leftz) || !level->isEmptyTile(x + forwardsx + leftx, y + 1, z + forwardsz + leftz); + bool rightBlocked = !level->isEmptyTile(x + forwardsx, y, z + forwardsz) || !level->isEmptyTile(x + forwardsx, y + 1, z + forwardsz); + + if (leftBlocked && rightBlocked) + { + dir = Direction::DIRECTION_OPPOSITE[dir]; + leftDir = Direction::DIRECTION_OPPOSITE[leftDir]; + forwardsx = Direction::STEP_X[dir]; + forwardsz = Direction::STEP_Z[dir]; + leftx = Direction::STEP_X[leftDir]; + leftz = Direction::STEP_Z[leftDir]; + + x -= leftx; + xt -= leftx; + z -= leftz; + zt -= leftz; + leftBlocked = !level->isEmptyTile(x + forwardsx + leftx, y, z + forwardsz + leftz) || !level->isEmptyTile(x + forwardsx + leftx, y + 1, z + forwardsz + leftz); + rightBlocked = !level->isEmptyTile(x + forwardsx, y, z + forwardsz) || !level->isEmptyTile(x + forwardsx, y + 1, z + forwardsz); + } + + float offsetLeft = 0.5f; + float offsetForwards = 0.5f; + + if (!leftBlocked && rightBlocked) + { + offsetLeft = 1; + } + else if (leftBlocked && !rightBlocked) + { + offsetLeft = 0; + } + else if (leftBlocked && rightBlocked) + { + offsetForwards = 0; + } + + // Center them in the frame and push them out forwards + xt += (leftx * offsetLeft) + (offsetForwards * forwardsx); + zt += (leftz * offsetLeft) + (offsetForwards * forwardsz); + + float xx = 0; + float zz = 0; + float xz = 0; + float zx = 0; + + if (dir == originalDir) + { + xx = 1; + zz = 1; + } + else if (dir == Direction::DIRECTION_OPPOSITE[originalDir]) + { + xx = -1; + zz = -1; + } + else if (dir == Direction::DIRECTION_CLOCKWISE[originalDir]) + { + xz = 1; + zx = -1; + } + else + { + xz = -1; + zx = 1; + } + + double xd = e->xd; + double zd = e->zd; + e->xd = xd * xx + zd * zx; + e->zd = xd * xz + zd * zz; + e->yRot = (yRotOriginal - originalDir * 90) + (dir * 90); + } + else + { + e->xd = e->yd = e->zd = 0; + } + + e->moveTo(xt, yt, zt, e->yRot, e->xRot); return true; } @@ -133,7 +257,7 @@ bool PortalForcer::findPortal(Level *level, shared_ptr e) } -bool PortalForcer::createPortal(Level *level, shared_ptr e) +bool PortalForcer::createPortal(shared_ptr e) { // 4J Stu - Increase the range at which we try and create a portal to stop creating them floating in mid air over lava int r = 16 * 3; @@ -240,7 +364,7 @@ bool PortalForcer::createPortal(Level *level, shared_ptr e) } } } - next_first: continue; +next_first: continue; } } } @@ -299,7 +423,7 @@ bool PortalForcer::createPortal(Level *level, shared_ptr e) } } } - next_second: continue; +next_second: continue; } } } @@ -341,7 +465,7 @@ bool PortalForcer::createPortal(Level *level, shared_ptr e) bool border = h < 0; - level->setTile(xt, yt, zt, border ? Tile::obsidian_Id : 0); + level->setTileAndUpdate(xt, yt, zt, border ? Tile::obsidian_Id : 0); } } } @@ -349,7 +473,6 @@ bool PortalForcer::createPortal(Level *level, shared_ptr e) for (int pass = 0; pass < 4; pass++) { - level->noNeighborUpdate = true; for (int s = 0; s < 4; s++) { for (int h = -1; h < 4; h++) @@ -359,10 +482,9 @@ bool PortalForcer::createPortal(Level *level, shared_ptr e) int zt = z + (s - 1) * za; bool border = s == 0 || s == 3 || h == -1 || h == 3; - level->setTile(xt, yt, zt, border ? Tile::obsidian_Id : Tile::portalTile_Id); + level->setTileAndData(xt, yt, zt, border ? Tile::obsidian_Id : Tile::portalTile_Id, 0, Tile::UPDATE_CLIENTS); } } - level->noNeighborUpdate = false; for (int s = 0; s < 4; s++) { @@ -379,3 +501,28 @@ bool PortalForcer::createPortal(Level *level, shared_ptr e) return true; } + +void PortalForcer::tick(__int64 time) +{ + if (time % (SharedConstants::TICKS_PER_SECOND * 5) == 0) + { + __int64 cutoff = time - SharedConstants::TICKS_PER_SECOND * 30; + + for(AUTO_VAR(it,cachedPortalKeys.begin()); it != cachedPortalKeys.end();) + { + __int64 key = *it; + PortalPosition *pos = cachedPortals[key]; + + if (pos == NULL || pos->lastUsed < cutoff) + { + delete pos; + it = cachedPortalKeys.erase(it); + cachedPortals.erase(key); + } + else + { + ++it; + } + } + } +} \ No newline at end of file diff --git a/Minecraft.World/PortalForcer.h b/Minecraft.World/PortalForcer.h index feb2f129..a589d9b3 100644 --- a/Minecraft.World/PortalForcer.h +++ b/Minecraft.World/PortalForcer.h @@ -4,18 +4,27 @@ class Random; class PortalForcer { -private: - Random *random; - public: - // 4J Stu Added - Java has no ctor, but we need to initialise random - PortalForcer(); + class PortalPosition : public Pos + { + public: + __int64 lastUsed; - void force(Level *level, shared_ptr e); + PortalPosition(int x, int y, int z, __int64 time); + }; -public: - bool findPortal(Level *level, shared_ptr e); +private: + ServerLevel *level; + Random *random; + unordered_map<__int64, PortalPosition *> cachedPortals; + vector<__int64> cachedPortalKeys; public: - bool createPortal(Level *level, shared_ptr e); + PortalForcer(ServerLevel *level); + ~PortalForcer(); + + void force(shared_ptr e, double xOriginal, double yOriginal, double zOriginal, float yRotOriginal); + bool findPortal(shared_ptr e, double xOriginal, double yOriginal, double zOriginal, float yRotOriginal); + bool createPortal(shared_ptr e); + void tick(__int64 time); }; \ No newline at end of file diff --git a/Minecraft.World/PortalTile.cpp b/Minecraft.World/PortalTile.cpp index 1b500a36..5e891e53 100644 --- a/Minecraft.World/PortalTile.cpp +++ b/Minecraft.World/PortalTile.cpp @@ -26,8 +26,12 @@ void PortalTile::tick(Level *level, int x, int y, int z, Random *random) if (y0 > 0 && !level->isSolidBlockingTile(x, y0 + 1, z)) { // spawn a pig man here - int result = 0; - bool spawned = MonsterPlacerItem::spawnMobAt(level, 57, x + .5, y0 + 1.1, z + .5, &result) != NULL; + int iResult = 0; + shared_ptr entity = SpawnEggItem::spawnMobAt(level, 57, x + .5, y0 + 1.1, z + .5, &iResult); + if (entity != NULL) + { + entity->changingDimensionDelay = entity->getDimensionChangingDelay(); + } } } } @@ -39,18 +43,18 @@ AABB *PortalTile::getAABB(Level *level, int x, int y, int z) void PortalTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id) + if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id) { - float xr = 8 / 16.0f; - float yr = 2 / 16.0f; - this->setShape(0.5f - xr, 0, 0.5f - yr, 0.5f + xr, 1, 0.5f + yr); - } + float xr = 8 / 16.0f; + float yr = 2 / 16.0f; + setShape(0.5f - xr, 0, 0.5f - yr, 0.5f + xr, 1, 0.5f + yr); + } else { - float xr = 2 / 16.0f; - float yr = 8 / 16.0f; - this->setShape(0.5f - xr, 0, 0.5f - yr, 0.5f + xr, 1, 0.5f + yr); - } + float xr = 2 / 16.0f; + float yr = 8 / 16.0f; + setShape(0.5f - xr, 0, 0.5f - yr, 0.5f + xr, 1, 0.5f + yr); + } } bool PortalTile::isSolidRender(bool isServerLevel) @@ -65,124 +69,122 @@ bool PortalTile::isCubeShaped() bool PortalTile::trySpawnPortal(Level *level, int x, int y, int z, bool actuallySpawn) { - int xd = 0; - int zd = 0; - if (level->getTile(x - 1, y, z) == Tile::obsidian_Id || level->getTile(x + 1, y, z) == Tile::obsidian_Id) xd = 1; - if (level->getTile(x, y, z - 1) == Tile::obsidian_Id || level->getTile(x, y, z + 1) == Tile::obsidian_Id) zd = 1; + int xd = 0; + int zd = 0; + if (level->getTile(x - 1, y, z) == Tile::obsidian_Id || level->getTile(x + 1, y, z) == Tile::obsidian_Id) xd = 1; + if (level->getTile(x, y, z - 1) == Tile::obsidian_Id || level->getTile(x, y, z + 1) == Tile::obsidian_Id) zd = 1; - if (xd == zd) return false; + if (xd == zd) return false; - if (level->getTile(x - xd, y, z - zd) == 0) + if (level->getTile(x - xd, y, z - zd) == 0) { - x -= xd; - z -= zd; - } + x -= xd; + z -= zd; + } - for (int xx = -1; xx <= 2; xx++) + for (int xx = -1; xx <= 2; xx++) { - for (int yy = -1; yy <= 3; yy++) + for (int yy = -1; yy <= 3; yy++) { - bool edge = (xx == -1) || (xx == 2) || (yy == -1) || (yy == 3); - if ((xx == -1 || xx == 2) && (yy == -1 || yy == 3)) continue; + bool edge = (xx == -1) || (xx == 2) || (yy == -1) || (yy == 3); + if ((xx == -1 || xx == 2) && (yy == -1 || yy == 3)) continue; - int t = level->getTile(x + xd * xx, y + yy, z + zd * xx); + int t = level->getTile(x + xd * xx, y + yy, z + zd * xx); - if (edge) + if (edge) { - if (t != Tile::obsidian_Id) return false; - } + if (t != Tile::obsidian_Id) return false; + } else { - if (t != 0 && t != Tile::fire_Id) return false; - } - } - } + if (t != 0 && t != Tile::fire_Id) return false; + } + } + } if( !actuallySpawn ) return true; - level->noNeighborUpdate = true; - for (int xx = 0; xx < 2; xx++) + for (int xx = 0; xx < 2; xx++) { - for (int yy = 0; yy < 3; yy++) + for (int yy = 0; yy < 3; yy++) { - level->setTile(x + xd * xx, y + yy, z + zd * xx, Tile::portalTile_Id); - } - } - level->noNeighborUpdate = false; + level->setTileAndData(x + xd * xx, y + yy, z + zd * xx, Tile::portalTile_Id, 0, Tile::UPDATE_CLIENTS); + } + } - return true; + return true; } void PortalTile::neighborChanged(Level *level, int x, int y, int z, int type) { - int xd = 0; - int zd = 1; - if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id) + int xd = 0; + int zd = 1; + if (level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id) { - xd = 1; - zd = 0; - } + xd = 1; + zd = 0; + } - int yBottom = y; - while (level->getTile(x, yBottom - 1, z) == id) - yBottom--; + int yBottom = y; + while (level->getTile(x, yBottom - 1, z) == id) + yBottom--; - if (level->getTile(x, yBottom - 1, z) != Tile::obsidian_Id) + if (level->getTile(x, yBottom - 1, z) != Tile::obsidian_Id) { - level->setTile(x, y, z, 0); - return; - } + level->removeTile(x, y, z); + return; + } - int height = 1; - while (height < 4 && level->getTile(x, yBottom + height, z) == id) - height++; + int height = 1; + while (height < 4 && level->getTile(x, yBottom + height, z) == id) + height++; - if (height != 3 || level->getTile(x, yBottom + height, z) != Tile::obsidian_Id) + if (height != 3 || level->getTile(x, yBottom + height, z) != Tile::obsidian_Id) { - level->setTile(x, y, z, 0); - return; - } + level->removeTile(x, y, z); + return; + } - bool we = level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id; - bool ns = level->getTile(x, y, z - 1) == id || level->getTile(x, y, z + 1) == id; - if (we && ns) + bool we = level->getTile(x - 1, y, z) == id || level->getTile(x + 1, y, z) == id; + bool ns = level->getTile(x, y, z - 1) == id || level->getTile(x, y, z + 1) == id; + if (we && ns) { - level->setTile(x, y, z, 0); - return; - } - - if (!(// - (level->getTile(x + xd, y, z + zd) == Tile::obsidian_Id && level->getTile(x - xd, y, z - zd) == id) || // - (level->getTile(x - xd, y, z - zd) == Tile::obsidian_Id && level->getTile(x + xd, y, z + zd) == id)// - )) + level->removeTile(x, y, z); + return; + } + + if (!(// + (level->getTile(x + xd, y, z + zd) == Tile::obsidian_Id && level->getTile(x - xd, y, z - zd) == id) || // + (level->getTile(x - xd, y, z - zd) == Tile::obsidian_Id && level->getTile(x + xd, y, z + zd) == id)// + )) { - level->setTile(x, y, z, 0); - return; - } + level->removeTile(x, y, z); + return; + } } bool PortalTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { - if (level->getTile(x, y, z) == id) return false; + if (level->getTile(x, y, z) == id) return false; - bool w = level->getTile(x - 1, y, z) == id && level->getTile(x - 2, y, z) != id; - bool e = level->getTile(x + 1, y, z) == id && level->getTile(x + 2, y, z) != id; + bool w = level->getTile(x - 1, y, z) == id && level->getTile(x - 2, y, z) != id; + bool e = level->getTile(x + 1, y, z) == id && level->getTile(x + 2, y, z) != id; - bool n = level->getTile(x, y, z - 1) == id && level->getTile(x, y, z - 2) != id; - bool s = level->getTile(x, y, z + 1) == id && level->getTile(x, y, z + 2) != id; + bool n = level->getTile(x, y, z - 1) == id && level->getTile(x, y, z - 2) != id; + bool s = level->getTile(x, y, z + 1) == id && level->getTile(x, y, z + 2) != id; - bool we = w || e; - bool ns = n || s; + bool we = w || e; + bool ns = n || s; - if (we && face == 4) return true; - if (we && face == 5) return true; - if (ns && face == 2) return true; - if (ns && face == 3) return true; + if (we && face == 4) return true; + if (we && face == 5) return true; + if (ns && face == 2) return true; + if (ns && face == 3) return true; - return false; + return false; } int PortalTile::getResourceCount(Random *random) @@ -197,40 +199,42 @@ int PortalTile::getRenderLayer() void PortalTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { + if (entity->GetType() == eTYPE_EXPERIENCEORB ) return; // 4J added + if (entity->riding == NULL && entity->rider.lock() == NULL) entity->handleInsidePortal(); } void PortalTile::animateTick(Level *level, int xt, int yt, int zt, Random *random) { - if (random->nextInt(100) == 0) + if (random->nextInt(100) == 0) { - level->playLocalSound(xt + 0.5, yt + 0.5, zt + 0.5, eSoundType_PORTAL_PORTAL, 0.5f, random->nextFloat() * 0.4f + 0.8f); - } - for (int i = 0; i < 4; i++) + level->playLocalSound(xt + 0.5, yt + 0.5, zt + 0.5, eSoundType_PORTAL_PORTAL, 0.5f, random->nextFloat() * 0.4f + 0.8f, false); + } + for (int i = 0; i < 4; i++) { - double x = xt + random->nextFloat(); - double y = yt + random->nextFloat(); - double z = zt + random->nextFloat(); - double xa = 0; - double ya = 0; - double za = 0; - int flip = random->nextInt(2) * 2 - 1; - xa = (random->nextFloat() - 0.5) * 0.5; - ya = (random->nextFloat() - 0.5) * 0.5; - za = (random->nextFloat() - 0.5) * 0.5; - if (level->getTile(xt - 1, yt, zt) == id || level->getTile(xt + 1, yt, zt) == id) + double x = xt + random->nextFloat(); + double y = yt + random->nextFloat(); + double z = zt + random->nextFloat(); + double xa = 0; + double ya = 0; + double za = 0; + int flip = random->nextInt(2) * 2 - 1; + xa = (random->nextFloat() - 0.5) * 0.5; + ya = (random->nextFloat() - 0.5) * 0.5; + za = (random->nextFloat() - 0.5) * 0.5; + if (level->getTile(xt - 1, yt, zt) == id || level->getTile(xt + 1, yt, zt) == id) { - z = zt + 0.5 + (0.25) * flip; - za = (random->nextFloat() * 2) * flip; - } + z = zt + 0.5 + (0.25) * flip; + za = (random->nextFloat() * 2) * flip; + } else { - x = xt + 0.5 + (0.25) * flip; - xa = (random->nextFloat() * 2) * flip; - } + x = xt + 0.5 + (0.25) * flip; + xa = (random->nextFloat() * 2) * flip; + } - level->addParticle(eParticleType_netherportal, x, y, z, xa, ya, za); - } + level->addParticle(eParticleType_netherportal, x, y, z, xa, ya, za); + } } int PortalTile::cloneTileId(Level *level, int x, int y, int z) diff --git a/Minecraft.World/Pos.cpp b/Minecraft.World/Pos.cpp index 3fad76e8..e673ecc3 100644 --- a/Minecraft.World/Pos.cpp +++ b/Minecraft.World/Pos.cpp @@ -18,9 +18,9 @@ Pos::Pos(int x, int y, int z) Pos::Pos(Pos *position) { - this->x = position->x; - this->y = position->y; - this->z = position->z; + x = position->x; + y = position->y; + z = position->z; } //@Override @@ -71,9 +71,9 @@ void Pos::set(int x, int y, int z) void Pos::set(Pos *pos) { - this->x = pos->x; - this->y = pos->y; - this->z = pos->z; + x = pos->x; + y = pos->y; + z = pos->z; } Pos *Pos::above() @@ -145,93 +145,93 @@ void Pos::move(int x, int y, int z) void Pos::move(Pos pos) { - this->x += pos.x; - this->y += pos.y; - this->z += pos.z; + x += pos.x; + y += pos.y; + z += pos.z; } void Pos::moveX(int steps) { - this->x += steps; + x += steps; } void Pos::moveY(int steps) { - this->y += steps; + y += steps; } void Pos::moveZ(int steps) { - this->z += steps; + z += steps; } void Pos::moveUp(int steps) { - this->y += steps; + y += steps; } void Pos::moveUp() { - this->y++; + y++; } void Pos::moveDown(int steps) { - this->y -= steps; + y -= steps; } void Pos::moveDown() { - this->y--; + y--; } void Pos::moveEast(int steps) { - this->x += steps; + x += steps; } void Pos::moveEast() { - this->x++; + x++; } void Pos::moveWest(int steps) { - this->x -= steps; + x -= steps; } void Pos::moveWest() { - this->x--; + x--; } void Pos::moveNorth(int steps) { - this->z -= steps; + z -= steps; } void Pos::moveNorth() { - this->z--; + z--; } void Pos::moveSouth(int steps) { - this->z += steps; + z += steps; } void Pos::moveSouth() { - this->z++; + z++; } double Pos::dist(int x, int y, int z) { - int dx = this->x - x; - int dy = this->y - y; - int dz = this->z - z; + double dx = this->x - x; + double dy = this->y - y; + double dz = this->z - z; - return sqrt( (double) dx * dx + dy * dy + dz * dz); + return sqrt( dx * dx + dy * dy + dz * dz); } double Pos::dist(Pos *pos) @@ -241,8 +241,13 @@ double Pos::dist(Pos *pos) float Pos::distSqr(int x, int y, int z) { - int dx = this->x - x; - int dy = this->y - y; - int dz = this->z - z; + float dx = this->x - x; + float dy = this->y - y; + float dz = this->z - z; return dx * dx + dy * dy + dz * dz; +} + +float Pos::distSqr(Pos *pos) +{ + return distSqr(pos->x, pos->y, pos->z); } \ No newline at end of file diff --git a/Minecraft.World/Pos.h b/Minecraft.World/Pos.h index a07c7fe3..c2130441 100644 --- a/Minecraft.World/Pos.h +++ b/Minecraft.World/Pos.h @@ -23,75 +23,44 @@ public: bool equals(void *other); int hashCode(); - int compareTo(Pos *pos); - Pos *offset(int x, int y, int z); - void set(int x, int y, int z); - void set(Pos *pos); Pos *above(); - Pos *above(int steps); - Pos *below(); - Pos *below(int steps); - Pos *north(); - Pos *north(int steps); - Pos *south(); - Pos *south(int steps); - Pos *west(); - Pos *west(int steps); - Pos *east(); - Pos *east(int steps); void move(int x, int y, int z); - void move(Pos pos); - void moveX(int steps); - void moveY(int steps); - void moveZ(int steps); - void moveUp(int steps); - void moveUp(); - void moveDown(int steps); - void moveDown(); - void moveEast(int steps); - void moveEast(); - void moveWest(int steps); - void moveWest(); - void moveNorth(int steps); - void moveNorth(); - void moveSouth(int steps); - void moveSouth(); double dist(int x, int y, int z); - double dist(Pos *pos); float distSqr(int x, int y, int z); + float distSqr(Pos *pos); }; \ No newline at end of file diff --git a/Minecraft.World/Position.h b/Minecraft.World/Position.h new file mode 100644 index 00000000..ca2596bc --- /dev/null +++ b/Minecraft.World/Position.h @@ -0,0 +1,9 @@ +#pragma once + +class Position +{ +public: + virtual double getX() = 0; + virtual double getY() = 0; + virtual double getZ() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/PositionImpl.h b/Minecraft.World/PositionImpl.h new file mode 100644 index 00000000..e194bc54 --- /dev/null +++ b/Minecraft.World/PositionImpl.h @@ -0,0 +1,34 @@ +#pragma once + +#include "Position.h" + +class PositionImpl : public Position +{ +protected: + double x; + double y; + double z; + +public: + PositionImpl(double x, double y, double z) + { + this->x = x; + this->y = y; + this->z = z; + } + + double getX() + { + return x; + } + + double getY() + { + return y; + } + + double getZ() + { + return z; + } +}; \ No newline at end of file diff --git a/Minecraft.World/PotatoTile.cpp b/Minecraft.World/PotatoTile.cpp index 27ca1984..64a696ec 100644 --- a/Minecraft.World/PotatoTile.cpp +++ b/Minecraft.World/PotatoTile.cpp @@ -55,6 +55,6 @@ void PotatoTile::registerIcons(IconRegister *iconRegister) { for (int i = 0; i < 4; i++) { - icons[i] = iconRegister->registerIcon(L"potatoes_" + _toString(i)); + icons[i] = iconRegister->registerIcon(getIconName() + L"_stage_" + _toString(i) ); } } \ No newline at end of file diff --git a/Minecraft.World/PotionBrewing.cpp b/Minecraft.World/PotionBrewing.cpp index eb973655..5c454fd4 100644 --- a/Minecraft.World/PotionBrewing.cpp +++ b/Minecraft.World/PotionBrewing.cpp @@ -218,6 +218,17 @@ int PotionBrewing::getColorValue(vector *effects) return ((int) red) << 16 | ((int) green) << 8 | ((int) blue); } +bool PotionBrewing::areAllEffectsAmbient(vector *effects) +{ + for(AUTO_VAR(it, effects->begin()); it != effects->end(); ++it) + { + MobEffectInstance *effect = *it; + if (!effect->isAmbient()) return false; + } + + return true; +} + int PotionBrewing::getColorValue(int brew, bool includeDisabledEffects) { if (!includeDisabledEffects) @@ -598,7 +609,9 @@ vector *PotionBrewing::getEffects(int brew, bool includeDis { list = new vector(); } - list->push_back(new MobEffectInstance(effect->getId(), duration, amplifier)); + MobEffectInstance *instance = new MobEffectInstance(effect->getId(), duration, amplifier); + if ((brew & THROWABLE_MASK) != 0) instance->setSplash(true); + list->push_back(instance); } } diff --git a/Minecraft.World/PotionBrewing.h b/Minecraft.World/PotionBrewing.h index 68679293..8f110c93 100644 --- a/Minecraft.World/PotionBrewing.h +++ b/Minecraft.World/PotionBrewing.h @@ -5,6 +5,14 @@ class MobEffectInstance; class PotionBrewing { public: + static const int POTION_ID_SPLASH_DAMAGE = 32732; + static const int POTION_ID_SPLASH_WEAKNESS = 32696; + static const int POTION_ID_SPLASH_SLOWNESS = 32698; + static const int POTION_ID_SPLASH_POISON = 32660; + static const int POTION_ID_HEAL = 16341; + static const int POTION_ID_SWIFTNESS = 16274; + static const int POTION_ID_FIRE_RESISTANCE = 16307; + static const bool SIMPLIFIED_BREWING = true; // 4J Stu - Made #define so we can use it to select const initialisation #define _SIMPLIFIED_BREWING 1 @@ -28,6 +36,12 @@ public: static const wstring MOD_GUNPOWDER; static const wstring MOD_GOLDENCARROT; + static const int BITS_FOR_MAX_NORMAL_EFFECT = 0xF; + static const int BITS_FOR_DURATION = (1 << 5); + static const int BITS_FOR_EXTENDED = (1 << 6); + static const int BITS_FOR_NORMAL = (1 << 13); + static const int BITS_FOR_SPLASH = (1 << 14); + private: typedef unordered_map intStringMap; static intStringMap potionEffectDuration; @@ -55,6 +69,7 @@ private: public: static int getAppearanceValue(int brew); static int getColorValue(vector *effects); + static bool areAllEffectsAmbient(vector *effects); private: static unordered_map cachedColors; diff --git a/Minecraft.World/PotionItem.cpp b/Minecraft.World/PotionItem.cpp index 643e9661..e302b8f9 100644 --- a/Minecraft.World/PotionItem.cpp +++ b/Minecraft.World/PotionItem.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.item.alchemy.h" #include "net.minecraft.world.effect.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.h" @@ -32,7 +33,33 @@ PotionItem::PotionItem(int id) : Item(id) vector *PotionItem::getMobEffects(shared_ptr potion) { - return getMobEffects(potion->getAuxValue()); + if (!potion->hasTag() || !potion->getTag()->contains(L"CustomPotionEffects")) + { + vector *effects = NULL; + AUTO_VAR(it, cachedMobEffects.find(potion->getAuxValue())); + if(it != cachedMobEffects.end()) effects = it->second; + if (effects == NULL) + { + effects = PotionBrewing::getEffects(potion->getAuxValue(), false); + cachedMobEffects[potion->getAuxValue()] = effects; + } + + // Result should be a new (unmanaged) vector, so create a new one + return effects == NULL ? NULL : new vector(*effects); + } + else + { + vector *effects = new vector(); + ListTag *customList = (ListTag *) potion->getTag()->getList(L"CustomPotionEffects"); + + for (int i = 0; i < customList->size(); i++) + { + CompoundTag *tag = customList->get(i); + effects->push_back(MobEffectInstance::load(tag)); + } + + return effects; + } } vector *PotionItem::getMobEffects(int auxValue) @@ -89,7 +116,7 @@ UseAnim PotionItem::getUseAnimation(shared_ptr itemInstance) return UseAnim_drink; } -bool PotionItem::TestUse(Level *level, shared_ptr player) +bool PotionItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { return true; } @@ -99,7 +126,7 @@ shared_ptr PotionItem::use(shared_ptr instance, Leve if (isThrowable(instance->getAuxValue())) { if (!player->abilities.instabuild) instance->count--; - level->playSound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + level->playEntitySound(player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); if (!level->isClientSide) level->addEntity(shared_ptr( new ThrownPotion(level, player, instance->getAuxValue()) )); return instance; } @@ -212,20 +239,39 @@ wstring PotionItem::getHoverName(shared_ptr itemInstance) return elementName; } -void PotionItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void PotionItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced) { if (itemInstance->getAuxValue() == 0) { return; } vector *effects = ((PotionItem *) Item::potion)->getMobEffects(itemInstance); + attrAttrModMap modifiers; if (effects != NULL && !effects->empty()) { //for (MobEffectInstance effect : effects) for(AUTO_VAR(it, effects->begin()); it != effects->end(); ++it) { MobEffectInstance *effect = *it; - wstring effectString = app.GetString( effect->getDescriptionId() );//I18n.get(effect.getDescriptionId()).trim(); + wstring effectString = app.GetString( effect->getDescriptionId() ); + + MobEffect *mobEffect = MobEffect::effects[effect->getId()]; + unordered_map *effectModifiers = mobEffect->getAttributeModifiers(); + + if (effectModifiers != NULL && effectModifiers->size() > 0) + { + for(AUTO_VAR(it, effectModifiers->begin()); it != effectModifiers->end(); ++it) + { + // 4J - anonymous modifiers added here are destroyed shortly? + AttributeModifier *original = it->second; + AttributeModifier *modifier = new AttributeModifier(mobEffect->getAttributeModifierValue(effect->getAmplifier(), original), original->getOperation()); + modifiers.insert( std::pair( it->first->getId(), modifier) ); + } + } + + // Don't want to delete this (that's a pointer to mobEffects internal vector of modifiers) + // delete effectModifiers; + if (effect->getAmplifier() > 0) { wstring potencyString = L""; @@ -247,37 +293,46 @@ void PotionItem::appendHoverText(shared_ptr itemInstance, shared_p potencyString = app.GetString( IDS_POTION_POTENCY_0 ); break; } - effectString += potencyString;// + I18n.get("potion.potency." + effect.getAmplifier()).trim(); + effectString += potencyString; // + I18n.get("potion.potency." + effect.getAmplifier()).trim(); } if (effect->getDuration() > SharedConstants::TICKS_PER_SECOND) { effectString += L" (" + MobEffect::formatDuration(effect) + L")"; } - unformattedStrings.push_back(effectString); - wchar_t formatted[256]; - ZeroMemory(formatted, 256 * sizeof(wchar_t)); - eMinecraftColour colour = eMinecraftColour_NOT_SET; - if (MobEffect::effects[effect->getId()]->isHarmful()) + + eMinecraftColour color = eMinecraftColour_NOT_SET; + + if (mobEffect->isHarmful()) { - colour = eHTMLColor_c; - //lines->push_back(L"c + effectString); //"c" + color = eHTMLColor_c; } else { - colour = eHTMLColor_7; - //lines->push_back(L"7" + effectString); //"7" + color = eHTMLColor_7; } - swprintf(formatted, 256, L"%ls",app.GetHTMLColour(colour),effectString.c_str()); - lines->push_back(formatted); + + lines->push_back(HtmlString(effectString, color)); } } else { wstring effectString = app.GetString(IDS_POTION_EMPTY); //I18n.get("potion.empty").trim(); - //eHTMLColor_7 - wchar_t formatted[256]; - swprintf(formatted,256,L"%ls",app.GetHTMLColour(eHTMLColor_7),effectString.c_str()); - lines->push_back(formatted); //"7" + + lines->push_back(HtmlString(effectString, eHTMLColor_7)); //"7" + } + + if (!modifiers.empty()) + { + // Add new line + lines->push_back(HtmlString(L"")); + lines->push_back(HtmlString(app.GetString(IDS_POTION_EFFECTS_WHENDRANK), eHTMLColor_5)); + + // Add modifier descriptions + for (AUTO_VAR(it, modifiers.begin()); it != modifiers.end(); ++it) + { + // 4J: Moved modifier string building to AttributeModifier + lines->push_back(it->second->getHoverText(it->first)); + } } } @@ -290,11 +345,6 @@ bool PotionItem::isFoil(shared_ptr itemInstance) unsigned int PotionItem::getUseDescriptionId(shared_ptr instance) { int brew = instance->getAuxValue(); - - -#define MACRO_POTION_IS_NIGHTVISION(aux) ((aux & 0x200F) == MASK_NIGHTVISION) -#define MACRO_POTION_IS_INVISIBILITY(aux) ((aux & 0x200F) == MASK_INVISIBILITY) - if(brew == 0) return IDS_POTION_DESC_WATER_BOTTLE; else if( MACRO_POTION_IS_REGENERATION(brew)) return IDS_POTION_DESC_REGENERATION; else if( MACRO_POTION_IS_SPEED(brew) ) return IDS_POTION_DESC_MOVESPEED; diff --git a/Minecraft.World/PotionItem.h b/Minecraft.World/PotionItem.h index d03d3308..9fa158c2 100644 --- a/Minecraft.World/PotionItem.h +++ b/Minecraft.World/PotionItem.h @@ -30,7 +30,7 @@ public: virtual int getUseDuration(shared_ptr itemInstance); virtual UseAnim getUseAnimation(shared_ptr itemInstance); virtual shared_ptr use(shared_ptr instance, Level *level, shared_ptr player); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); virtual Icon *getIcon(int auxValue); virtual Icon *getLayerIcon(int auxValue, int spriteLayer); @@ -40,7 +40,7 @@ public: virtual bool hasMultipleSpriteLayers(); virtual bool hasInstantenousEffects(int itemAuxValue); virtual wstring getHoverName(shared_ptr itemInstance); - virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced); virtual bool isFoil(shared_ptr itemInstance); virtual unsigned int getUseDescriptionId(shared_ptr instance); diff --git a/Minecraft.World/PoweredMetalTile.cpp b/Minecraft.World/PoweredMetalTile.cpp new file mode 100644 index 00000000..71938975 --- /dev/null +++ b/Minecraft.World/PoweredMetalTile.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.redstone.h" +#include "PoweredMetalTile.h" + +PoweredMetalTile::PoweredMetalTile(int id) : MetalTile(id) +{ +} + +bool PoweredMetalTile::isSignalSource() +{ + return true; +} + +int PoweredMetalTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +{ + return Redstone::SIGNAL_MAX; +} \ No newline at end of file diff --git a/Minecraft.World/PoweredMetalTile.h b/Minecraft.World/PoweredMetalTile.h new file mode 100644 index 00000000..1ee573de --- /dev/null +++ b/Minecraft.World/PoweredMetalTile.h @@ -0,0 +1,12 @@ +#pragma once + +#include "MetalTile.h" + +class PoweredMetalTile : public MetalTile +{ +public: + PoweredMetalTile(int id); + + virtual bool isSignalSource(); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); +}; \ No newline at end of file diff --git a/Minecraft.World/PoweredRailTile.cpp b/Minecraft.World/PoweredRailTile.cpp new file mode 100644 index 00000000..9ebf6291 --- /dev/null +++ b/Minecraft.World/PoweredRailTile.cpp @@ -0,0 +1,187 @@ +#include "stdafx.h" +#include "net.minecraft.world.h" +#include "net.minecraft.world.level.h" +#include "PoweredRailTile.h" + +PoweredRailTile::PoweredRailTile(int id) : BaseRailTile(id, true) +{ +} + +Icon *PoweredRailTile::getTexture(int face, int data) +{ + if ((data & RAIL_DATA_BIT) == 0) + { + return icon; + } + else + { + return iconPowered; + } +} + +void PoweredRailTile::registerIcons(IconRegister *iconRegister) +{ + BaseRailTile::registerIcons(iconRegister); + iconPowered = iconRegister->registerIcon(getIconName() + L"_powered"); +} + +bool PoweredRailTile::findPoweredRailSignal(Level *level, int x, int y, int z, int data, bool forward, int searchDepth) +{ + if (searchDepth >= 8) + { + return false; + } + + int dir = data & RAIL_DIRECTION_MASK; + + bool checkBelow = true; + switch (dir) + { + case DIR_FLAT_Z: + if (forward) + { + z++; + } + else + { + z--; + } + break; + case DIR_FLAT_X: + if (forward) + { + x--; + } + else + { + x++; + } + break; + case 2: + if (forward) + { + x--; + } + else + { + x++; + y++; + checkBelow = false; + } + dir = DIR_FLAT_X; + break; + case 3: + if (forward) + { + x--; + y++; + checkBelow = false; + } + else + { + x++; + } + dir = DIR_FLAT_X; + break; + case 4: + if (forward) + { + z++; + } + else + { + z--; + y++; + checkBelow = false; + } + dir = DIR_FLAT_Z; + break; + case 5: + if (forward) + { + z++; + y++; + checkBelow = false; + } + else + { + z--; + } + dir = DIR_FLAT_Z; + break; + } + + if (isSameRailWithPower(level, x, y, z, forward, searchDepth, dir)) + { + return true; + } + if (checkBelow && isSameRailWithPower(level, x, y - 1, z, forward, searchDepth, dir)) + { + return true; + } + return false; +} + +bool PoweredRailTile::isSameRailWithPower(Level *level, int x, int y, int z, bool forward, int searchDepth, int dir) +{ + int tile = level->getTile(x, y, z); + + if (tile == id) + { + int tileData = level->getData(x, y, z); + int myDir = tileData & RAIL_DIRECTION_MASK; + + if (dir == DIR_FLAT_X && (myDir == DIR_FLAT_Z || myDir == 4 || myDir == 5)) + { + return false; + } + if (dir == DIR_FLAT_Z && (myDir == DIR_FLAT_X || myDir == 2 || myDir == 3)) + { + return false; + } + + if ((tileData & RAIL_DATA_BIT) != 0) + { + if (level->hasNeighborSignal(x, y, z)) + { + return true; + } + else + { + return findPoweredRailSignal(level, x, y, z, tileData, forward, searchDepth + 1); + } + } + } + + return false; +} + +void PoweredRailTile::updateState(Level *level, int x, int y, int z, int data, int dir, int type) +{ + bool signal = level->hasNeighborSignal(x, y, z); + signal = signal || findPoweredRailSignal(level, x, y, z, data, true, 0) || findPoweredRailSignal(level, x, y, z, data, false, 0); + + bool changed = false; + if (signal && (data & RAIL_DATA_BIT) == 0) + { + level->setData(x, y, z, dir | RAIL_DATA_BIT, Tile::UPDATE_ALL); + changed = true; + } + else if (!signal && (data & RAIL_DATA_BIT) != 0) + { + level->setData(x, y, z, dir, Tile::UPDATE_ALL); + changed = true; + } + + // usually the level only updates neighbors that are in the same + // y plane as the current tile, but sloped rails may need to + // update tiles above or below it as well + if (changed) + { + level->updateNeighborsAt(x, y - 1, z, id); + if (dir == 2 || dir == 3 || dir == 4 || dir == 5) + { + level->updateNeighborsAt(x, y + 1, z, id); + } + } +} \ No newline at end of file diff --git a/Minecraft.World/PoweredRailTile.h b/Minecraft.World/PoweredRailTile.h new file mode 100644 index 00000000..42b330cc --- /dev/null +++ b/Minecraft.World/PoweredRailTile.h @@ -0,0 +1,21 @@ +#pragma once + +#include "BaseRailTile.h" + +class PoweredRailTile : public BaseRailTile +{ + friend class ChunkRebuildData; +protected: + Icon *iconPowered; + +public: + PoweredRailTile(int id); + + virtual Icon *getTexture(int face, int data); + virtual void registerIcons(IconRegister *iconRegister); + +protected: + virtual bool findPoweredRailSignal(Level *level, int x, int y, int z, int data, bool forward, int searchDepth); + virtual bool isSameRailWithPower(Level *level, int x, int y, int z, bool forward, int searchDepth, int dir); + virtual void updateState(Level *level, int x, int y, int z, int data, int dir, int type); +}; \ No newline at end of file diff --git a/Minecraft.World/PressurePlateTile.cpp b/Minecraft.World/PressurePlateTile.cpp index eacdeb07..6a30819d 100644 --- a/Minecraft.World/PressurePlateTile.cpp +++ b/Minecraft.World/PressurePlateTile.cpp @@ -1,211 +1,48 @@ #include "stdafx.h" -#include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.level.h" -#include "net.minecraft.world.level.tile.h" -#include "net.minecraft.world.phys.h" -#include "net.minecraft.world.h" +#include "net.minecraft.world.level.redstone.h" #include "PressurePlateTile.h" -#include "SoundTypes.h" -PressurePlateTile::PressurePlateTile(int id, const wstring &tex, Material *material, Sensitivity sensitivity) : Tile(id, material, isSolidRender()) +PressurePlateTile::PressurePlateTile(int id, const wstring &tex, Material *material, Sensitivity sensitivity) : BasePressurePlateTile(id, tex, material) { this->sensitivity = sensitivity; - this->setTicking(true); - this->texture = tex; - float o = 1 / 16.0f; - setShape(o, 0, o, 1 - o, 0.5f / 16.0f, 1 - o); + // 4J Stu - Move this from base class to use virtual function + updateShape(getDataForSignal(Redstone::SIGNAL_MAX)); } -int PressurePlateTile::getTickDelay() +int PressurePlateTile::getDataForSignal(int signal) { - return 20; + return signal > 0 ? 1 : 0; } -AABB *PressurePlateTile::getAABB(Level *level, int x, int y, int z) +int PressurePlateTile::getSignalForData(int data) { - return NULL; + return data == 1 ? Redstone::SIGNAL_MAX : 0; } -bool PressurePlateTile::isSolidRender(bool isServerLevel) +int PressurePlateTile::getSignalStrength(Level *level, int x, int y, int z) { - return false; -} - -bool PressurePlateTile::blocksLight() -{ - return false; -} - -bool PressurePlateTile::isCubeShaped() -{ - return false; -} - -bool PressurePlateTile::isPathfindable(LevelSource *level, int x, int y, int z) -{ - return true; -} - -bool PressurePlateTile::mayPlace(Level *level, int x, int y, int z) -{ - return level->isTopSolidBlocking(x, y - 1, z) || FenceTile::isFence(level->getTile(x, y - 1, z)); -} - -void PressurePlateTile::neighborChanged(Level *level, int x, int y, int z, int type) -{ - bool replace = false; - - if (!level->isTopSolidBlocking(x, y - 1, z) && !FenceTile::isFence(level->getTile(x, y - 1, z))) replace = true; - - if (replace) - { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - } -} - -void PressurePlateTile::tick(Level *level, int x, int y, int z, Random *random) -{ - if (level->isClientSide) return; - if (level->getData(x, y, z) == 0) - { - return; - } - - checkPressed(level, x, y, z); -} - -void PressurePlateTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) -{ - if (level->isClientSide) return; - - if (level->getData(x, y, z) == 1) - { - return; - } - - checkPressed(level, x, y, z); -} - -void PressurePlateTile::checkPressed(Level *level, int x, int y, int z) -{ - bool wasPressed = level->getData(x, y, z) == 1; - bool shouldBePressed = false; - - float b = 2 / 16.0f; - vector > *entities = NULL; - - bool entitiesToBeFreed = false; - if (sensitivity == PressurePlateTile::everything) entities = level->getEntities(nullptr, AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 0.25, z + 1 - b)); - - if (sensitivity == PressurePlateTile::mobs) - { - entities = level->getEntitiesOfClass(typeid(Mob), AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 0.25, z + 1 - b)); - entitiesToBeFreed = true; - } - if (sensitivity == PressurePlateTile::players) - { - entities = level->getEntitiesOfClass(typeid(Player), AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 0.25, z + 1 - b)); - entitiesToBeFreed = true; - } + vector< shared_ptr > *entities = NULL; - if (!entities->empty()) - { - shouldBePressed = true; - } - - if (shouldBePressed && !wasPressed) - { - level->setData(x, y, z, 1); - level->updateNeighborsAt(x, y, z, id); - level->updateNeighborsAt(x, y - 1, z, id); - level->setTilesDirty(x, y, z, x, y, z); - - level->playSound(x + 0.5, y + 0.1, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); - } - if (!shouldBePressed && wasPressed) - { - level->setData(x, y, z, 0); - level->updateNeighborsAt(x, y, z, id); - level->updateNeighborsAt(x, y - 1, z, id); - level->setTilesDirty(x, y, z, x, y, z); + if (sensitivity == everything) entities = level->getEntities(nullptr, getSensitiveAABB(x, y, z)); + else if (sensitivity == mobs) entities = level->getEntitiesOfClass(typeid(LivingEntity), getSensitiveAABB(x, y, z)); + else if (sensitivity == players) entities = level->getEntitiesOfClass(typeid(Player), getSensitiveAABB(x, y, z)); + else __debugbreak(); // 4J-JEV: We're going to delete something at a random location. - level->playSound(x + 0.5, y + 0.1, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.5f); - } - - if (shouldBePressed) - { - level->addToTickNextTick(x, y, z, id, getTickDelay()); - } - - if( entitiesToBeFreed ) + if (entities != NULL && !entities->empty()) { - delete entities; + for (AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) + { + shared_ptr e = *it; + if (!e->isIgnoringTileTriggers()) + { + if (sensitivity != everything) delete entities; + return Redstone::SIGNAL_MAX; + } + } } -} - -void PressurePlateTile::onRemove(Level *level, int x, int y, int z, int id, int data) -{ - if (data > 0) - { - level->updateNeighborsAt(x, y, z, this->id); - level->updateNeighborsAt(x, y - 1, z, this->id); - } - Tile::onRemove(level, x, y, z, id, data); -} - -void PressurePlateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param -{ - bool pressed = level->getData(x, y, z) == 1; - float o = 1 / 16.0f; - if (pressed) - { - this->setShape(o, 0, o, 1 - o, 0.5f / 16.0f, 1 - o); - } - else - { - setShape(o, 0, o, 1 - o, 1 / 16.0f, 1 - o); - } -} - -bool PressurePlateTile::getSignal(LevelSource *level, int x, int y, int z, int dir) -{ - return (level->getData(x, y, z)) > 0; -} - -bool PressurePlateTile::getDirectSignal(Level *level, int x, int y, int z, int dir) -{ - if (level->getData(x, y, z) == 0) return false; - return (dir == 1); -} - -bool PressurePlateTile::isSignalSource() -{ - return true; -} - -void PressurePlateTile::updateDefaultShape() -{ - float x = 8 / 16.0f; - float y = 2 / 16.0f; - float z = 8 / 16.0f; - setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); - -} - -bool PressurePlateTile::shouldTileTick(Level *level, int x,int y,int z) -{ - return level->getData(x, y, z) != 0; -} - -int PressurePlateTile::getPistonPushReaction() -{ - return Material::PUSH_DESTROY; -} - -void PressurePlateTile::registerIcons(IconRegister *iconRegister) -{ - icon = iconRegister->registerIcon(texture); + if (sensitivity != everything) delete entities; + return Redstone::SIGNAL_NONE; } \ No newline at end of file diff --git a/Minecraft.World/PressurePlateTile.h b/Minecraft.World/PressurePlateTile.h index 0b70fca9..ca3e6b0b 100644 --- a/Minecraft.World/PressurePlateTile.h +++ b/Minecraft.World/PressurePlateTile.h @@ -1,49 +1,22 @@ #pragma once -#include "Tile.h" -#include "Definitions.h" +#include "BasePressurePlateTile.h" -class Random; - -class PressurePlateTile : public Tile +class PressurePlateTile : public BasePressurePlateTile { - friend class Tile; -private: - wstring texture; public: - enum Sensitivity + enum Sensitivity { - everything, - mobs, - players - }; + everything, mobs, players + }; private: Sensitivity sensitivity; -protected: - PressurePlateTile(int id, const wstring &tex, Material *material, Sensitivity sensitivity); -public: - virtual int getTickDelay(); - virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool blocksLight(); - virtual bool isCubeShaped(); - virtual bool isPathfindable(LevelSource *level, int x, int y, int z); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); - virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); -private: - virtual void checkPressed(Level *level, int x, int y, int z); + public: - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); - virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); - virtual bool isSignalSource(); - virtual void updateDefaultShape(); - virtual int getPistonPushReaction(); - void registerIcons(IconRegister *iconRegister); - - // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing - virtual bool shouldTileTick(Level *level, int x,int y,int z); -}; + PressurePlateTile(int id, const wstring &tex, Material *material, Sensitivity sensitivity); + +protected: + virtual int getDataForSignal(int signal); + virtual int getSignalForData(int data); + virtual int getSignalStrength(Level *level, int x, int y, int z); +}; \ No newline at end of file diff --git a/Minecraft.World/PrimedTnt.cpp b/Minecraft.World/PrimedTnt.cpp index 09926d50..79fd760f 100644 --- a/Minecraft.World/PrimedTnt.cpp +++ b/Minecraft.World/PrimedTnt.cpp @@ -14,6 +14,8 @@ void PrimedTnt::_init() blocksBuilding = true; setSize(0.98f, 0.98f); heightOffset = bbHeight / 2.0f; + + owner = weak_ptr(); } PrimedTnt::PrimedTnt(Level *level) : Entity( level ) @@ -25,7 +27,7 @@ PrimedTnt::PrimedTnt(Level *level) : Entity( level ) _init(); } -PrimedTnt::PrimedTnt(Level *level, double x, double y, double z) : Entity( level ) +PrimedTnt::PrimedTnt(Level *level, double x, double y, double z, shared_ptr owner) : Entity( level ) { _init(); @@ -41,6 +43,8 @@ PrimedTnt::PrimedTnt(Level *level, double x, double y, double z) : Entity( level xo = x; yo = y; zo = z; + + this->owner = weak_ptr(owner); } void PrimedTnt::defineSynchedData() @@ -95,7 +99,7 @@ void PrimedTnt::tick() void PrimedTnt::explode() { float r = 4.0f; - level->explode(nullptr, x, y, z, r, true); + level->explode(shared_from_this(), x, y, z, r, true); } @@ -109,8 +113,12 @@ void PrimedTnt::readAdditionalSaveData(CompoundTag *tag) life = tag->getByte(L"Fuse"); } - float PrimedTnt::getShadowHeightOffs() { return 0; +} + +shared_ptr PrimedTnt::getOwner() +{ + return owner.lock(); } \ No newline at end of file diff --git a/Minecraft.World/PrimedTnt.h b/Minecraft.World/PrimedTnt.h index 8f1b11dd..0b65a5ca 100644 --- a/Minecraft.World/PrimedTnt.h +++ b/Minecraft.World/PrimedTnt.h @@ -11,11 +11,12 @@ public: static const int serialVersionUID = 0; int life; + weak_ptr owner; void _init(); PrimedTnt(Level *level); - PrimedTnt(Level *level, double x, double y, double z); + PrimedTnt(Level *level, double x, double y, double z, shared_ptr owner); protected: virtual void defineSynchedData(); @@ -34,4 +35,5 @@ protected: public: virtual float getShadowHeightOffs(); + virtual shared_ptr getOwner(); }; diff --git a/Minecraft.World/Projectile.h b/Minecraft.World/Projectile.h new file mode 100644 index 00000000..ab6b0b05 --- /dev/null +++ b/Minecraft.World/Projectile.h @@ -0,0 +1,7 @@ +#pragma once + +class Projectile +{ +public: + virtual void shoot(double xd, double yd, double zd, float pow, float uncertainty) = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/ProtectionEnchantment.cpp b/Minecraft.World/ProtectionEnchantment.cpp index 39e3eca1..8304529b 100644 --- a/Minecraft.World/ProtectionEnchantment.cpp +++ b/Minecraft.World/ProtectionEnchantment.cpp @@ -41,7 +41,7 @@ int ProtectionEnchantment::getDamageProtection(int level, DamageSource *source) if (type == ALL) return Mth::floor(protect * 0.75f); if (type == FIRE && source->isFire()) return Mth::floor(protect * 1.25f); if (type == FALL && source == DamageSource::fall) return Mth::floor(protect * 2.5f); - if (type == EXPLOSION && source == DamageSource::explosion) return Mth::floor(protect * 1.5f); + if (type == EXPLOSION && source->isExplosion() ) return Mth::floor(protect * 1.5f); if (type == PROJECTILE && source->isProjectile()) return Mth::floor(protect * 1.5f); return 0; } @@ -56,11 +56,11 @@ bool ProtectionEnchantment::isCompatibleWith(Enchantment *other) const ProtectionEnchantment *pe = dynamic_cast( other ); if (pe != NULL) { - if (pe->type == this->type) + if (pe->type == type) { return false; } - if (this->type == FALL || pe->type == FALL) + if (type == FALL || pe->type == FALL) { return true; } diff --git a/Minecraft.World/PumpkinFeature.cpp b/Minecraft.World/PumpkinFeature.cpp index 6af6a9a1..95f306b3 100644 --- a/Minecraft.World/PumpkinFeature.cpp +++ b/Minecraft.World/PumpkinFeature.cpp @@ -5,19 +5,19 @@ bool PumpkinFeature::place(Level *level, Random *random, int x, int y, int z) { - for (int i = 0; i < 64; i++) + for (int i = 0; i < 64; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y + random->nextInt(4) - random->nextInt(4); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (level->isEmptyTile(x2, y2, z2) && level->getTile(x2, y2 - 1, z2) == Tile::grass_Id) + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y + random->nextInt(4) - random->nextInt(4); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (level->isEmptyTile(x2, y2, z2) && level->getTile(x2, y2 - 1, z2) == Tile::grass_Id) { - if (Tile::pumpkin->mayPlace(level, x2, y2, z2)) + if (Tile::pumpkin->mayPlace(level, x2, y2, z2)) { - level->setTileAndDataNoUpdate(x2, y2, z2, Tile::pumpkin_Id, random->nextInt(4)); - } - } - } + level->setTileAndData(x2, y2, z2, Tile::pumpkin_Id, random->nextInt(4), Tile::UPDATE_CLIENTS); + } + } + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/PumpkinTile.cpp b/Minecraft.World/PumpkinTile.cpp index 577b9a17..2bc36972 100644 --- a/Minecraft.World/PumpkinTile.cpp +++ b/Minecraft.World/PumpkinTile.cpp @@ -11,47 +11,47 @@ const wstring PumpkinTile::TEXTURE_FACE = L"pumpkin_face"; const wstring PumpkinTile::TEXTURE_LANTERN = L"pumpkin_jack"; -PumpkinTile::PumpkinTile(int id, bool lit) : DirectionalTile(id, Material::vegetable) +PumpkinTile::PumpkinTile(int id, bool lit) : DirectionalTile(id, Material::vegetable, isSolidRender() ) { - iconTop = NULL; + iconTop = NULL; iconFace = NULL; - setTicking(true); - this->lit = lit; + setTicking(true); + this->lit = lit; } Icon *PumpkinTile::getTexture(int face, int data) { - if (face == Facing::UP) return iconTop; - if (face == Facing::DOWN) return iconTop; + if (face == Facing::UP) return iconTop; + if (face == Facing::DOWN) return iconTop; - if (data == DIR_NORTH && face == Facing::NORTH) return iconFace; - if (data == DIR_EAST && face == Facing::EAST) return iconFace; - if (data == DIR_SOUTH && face == Facing::SOUTH) return iconFace; - if (data == DIR_WEST && face == Facing::WEST) return iconFace; + if (data == DIR_NORTH && face == Facing::NORTH) return iconFace; + if (data == DIR_EAST && face == Facing::EAST) return iconFace; + if (data == DIR_SOUTH && face == Facing::SOUTH) return iconFace; + if (data == DIR_WEST && face == Facing::WEST) return iconFace; - else return icon; + else return icon; } void PumpkinTile::onPlace(Level *level, int x, int y, int z) { Tile::onPlace(level, x, y, z); - if (level->getTile(x, y - 1, z) == Tile::snow_Id && level->getTile(x, y - 2, z) == Tile::snow_Id) + if (level->getTile(x, y - 1, z) == Tile::snow_Id && level->getTile(x, y - 2, z) == Tile::snow_Id) { - if (!level->isClientSide) + if (!level->isClientSide) { // 4J - added limit of number of snowmen that can be spawned if( level->canCreateMore( eTYPE_SNOWMAN, Level::eSpawnType_Egg) ) { - level->setTileNoUpdate(x, y, z, 0); - level->setTileNoUpdate(x, y - 1, z, 0); - level->setTileNoUpdate(x, y - 2, z, 0); + level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 2, z, 0, 0, Tile::UPDATE_CLIENTS); shared_ptr snowMan = shared_ptr(new SnowMan(level)); snowMan->moveTo(x + 0.5, y - 1.95, z + 0.5, 0, 0); level->addEntity(snowMan); - level->tileUpdated(x, y, z, 0); - level->tileUpdated(x, y - 1, z, 0); - level->tileUpdated(x, y - 2, z, 0); + level->tileUpdated(x, y, z, 0); + level->tileUpdated(x, y - 1, z, 0); + level->tileUpdated(x, y - 2, z, 0); } else { @@ -59,15 +59,15 @@ void PumpkinTile::onPlace(Level *level, int x, int y, int z) Tile::spawnResources(level, x, y, z, level->getData(x, y, z), 0); Tile::tiles[Tile::snow_Id]->spawnResources(level, x, y - 1, z, level->getData(x, y - 1, z), 0); Tile::tiles[Tile::snow_Id]->spawnResources(level, x, y - 2, z, level->getData(x, y - 2, z), 0); - level->setTile(x, y, z, 0); - level->setTile(x, y - 1, z, 0); - level->setTile(x, y - 2, z, 0); + level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 2, z, 0, 0, Tile::UPDATE_CLIENTS); } - } - for (int i = 0; i < 120; i++) + } + for (int i = 0; i < 120; i++) { - level->addParticle(eParticleType_snowshovel, x + level->random->nextDouble(), y - 2 + level->random->nextDouble() * 2.5, z + level->random->nextDouble(), 0, 0, 0); - } + level->addParticle(eParticleType_snowshovel, x + level->random->nextDouble(), y - 2 + level->random->nextDouble() * 2.5, z + level->random->nextDouble(), 0, 0, 0); + } } else if (level->getTile(x, y - 1, z) == Tile::ironBlock_Id && level->getTile(x, y - 2, z) == Tile::ironBlock_Id) { @@ -80,18 +80,18 @@ void PumpkinTile::onPlace(Level *level, int x, int y, int z) // 4J - added limit of number of golems that can be spawned if( level->canCreateMore( eTYPE_VILLAGERGOLEM, Level::eSpawnType_Egg) ) { - level->setTileNoUpdate(x, y, z, 0); - level->setTileNoUpdate(x, y - 1, z, 0); - level->setTileNoUpdate(x, y - 2, z, 0); + level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 2, z, 0, 0, Tile::UPDATE_CLIENTS); if (xArms) { - level->setTileNoUpdate(x - 1, y - 1, z, 0); - level->setTileNoUpdate(x + 1, y - 1, z, 0); + level->setTileAndData(x - 1, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); } else { - level->setTileNoUpdate(x, y - 1, z - 1, 0); - level->setTileNoUpdate(x, y - 1, z + 1, 0); + level->setTileAndData(x, y - 1, z - 1, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z + 1, 0, 0, Tile::UPDATE_CLIENTS); } shared_ptr villagerGolem = shared_ptr(new VillagerGolem(level)); @@ -124,23 +124,23 @@ void PumpkinTile::onPlace(Level *level, int x, int y, int z) Tile::spawnResources(level, x, y, z, level->getData(x, y, z), 0); Tile::tiles[Tile::ironBlock_Id]->spawnResources(level, x, y - 1, z, level->getData(x, y - 1, z), 0); Tile::tiles[Tile::ironBlock_Id]->spawnResources(level, x, y - 2, z, level->getData(x, y - 2, z), 0); - level->setTile(x, y, z, 0); - level->setTile(x, y - 1, z, 0); - level->setTile(x, y - 2, z, 0); + level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 2, z, 0, 0, Tile::UPDATE_CLIENTS); if(xArms) { Tile::tiles[Tile::ironBlock_Id]->spawnResources(level, x - 1, y - 1, z, level->getData(x - 1, y - 1, z), 0); Tile::tiles[Tile::ironBlock_Id]->spawnResources(level, x + 1, y - 1, z, level->getData(x + 1, y - 1, z), 0); - level->setTile(x - 1, y - 1, z, 0); - level->setTile(x + 1, y - 1, z, 0); + level->setTileAndData(x - 1, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); } else { Tile::tiles[Tile::ironBlock_Id]->spawnResources(level, x, y - 1, z - 1, level->getData(x, y - 1, z - 1), 0); Tile::tiles[Tile::ironBlock_Id]->spawnResources(level, x, y - 1, z + 1, level->getData(x, y - 1, z + 1), 0); - level->setTile(x, y - 1, z - 1, 0); - level->setTile(x, y - 1, z + 1, 0); + level->setTileAndData(x, y - 1, z - 1, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z + 1, 0, 0, Tile::UPDATE_CLIENTS); } } } @@ -150,20 +150,20 @@ void PumpkinTile::onPlace(Level *level, int x, int y, int z) bool PumpkinTile::mayPlace(Level *level, int x, int y, int z) { - int t = level->getTile(x, y, z); - return (t == 0 || Tile::tiles[t]->material->isReplaceable()) && level->isTopSolidBlocking(x, y - 1, z); + int t = level->getTile(x, y, z); + return (t == 0 || Tile::tiles[t]->material->isReplaceable()) && level->isTopSolidBlocking(x, y - 1, z); } -void PumpkinTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void PumpkinTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { - int dir = Mth::floor(by->yRot * 4 / (360) + 2.5) & 3; - level->setData(x, y, z, dir); + int dir = Mth::floor(by->yRot * 4 / (360) + 2.5) & 3; + level->setData(x, y, z, dir, Tile::UPDATE_CLIENTS); } void PumpkinTile::registerIcons(IconRegister *iconRegister) { - iconFace = iconRegister->registerIcon(lit ? TEXTURE_LANTERN : TEXTURE_FACE); - iconTop = iconRegister->registerIcon(L"pumpkin_top"); - icon = iconRegister->registerIcon(L"pumpkin_side"); + iconFace = iconRegister->registerIcon(getIconName() + L"_face_" + (lit ? L"on" : L"off")); + iconTop = iconRegister->registerIcon(getIconName() + L"_top"); + icon = iconRegister->registerIcon(getIconName() + L"_side"); } diff --git a/Minecraft.World/PumpkinTile.h b/Minecraft.World/PumpkinTile.h index 1c808b54..59b4d819 100644 --- a/Minecraft.World/PumpkinTile.h +++ b/Minecraft.World/PumpkinTile.h @@ -23,9 +23,9 @@ private: protected: PumpkinTile(int id, bool lit); public: - virtual Icon *getTexture(int face, int data); - virtual void onPlace(Level *level, int x, int y, int z); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + virtual Icon *getTexture(int face, int data); + virtual void onPlace(Level *level, int x, int y, int z); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/QuartzBlockTile.cpp b/Minecraft.World/QuartzBlockTile.cpp index a7beeb21..709e0c1e 100644 --- a/Minecraft.World/QuartzBlockTile.cpp +++ b/Minecraft.World/QuartzBlockTile.cpp @@ -12,11 +12,11 @@ int QuartzBlockTile::BLOCK_NAMES[QUARTZ_BLOCK_NAMES] = { IDS_TILE_QUARTZ_BLOCK, IDS_TILE_QUARTZ_BLOCK_CHISELED, IDS_TILE_QUARTZ_BLOCK_LINES, IDS_TILE_QUARTZ_BLOCK_LINES, IDS_TILE_QUARTZ_BLOCK_LINES }; -const wstring QuartzBlockTile::TEXTURE_TOP = L"quartzblock_top"; -const wstring QuartzBlockTile::TEXTURE_CHISELED_TOP = L"quartzblock_chiseled_top"; -const wstring QuartzBlockTile::TEXTURE_LINES_TOP = L"quartzblock_lines_top"; -const wstring QuartzBlockTile::TEXTURE_BOTTOM = L"quartzblock_bottom"; -const wstring QuartzBlockTile::TEXTURE_NAMES[QUARTZ_BLOCK_TEXTURES] = { L"quartzblock_side", L"quartzblock_chiseled", L"quartzblock_lines", L"", L""}; +const wstring QuartzBlockTile::TEXTURE_TOP = L"top"; +const wstring QuartzBlockTile::TEXTURE_CHISELED_TOP = L"chiseled_top"; +const wstring QuartzBlockTile::TEXTURE_LINES_TOP = L"lines_top"; +const wstring QuartzBlockTile::TEXTURE_BOTTOM = L"bottom"; +const wstring QuartzBlockTile::TEXTURE_NAMES[QUARTZ_BLOCK_TEXTURES] = { L"side", L"chiseled", L"lines", L"", L""}; QuartzBlockTile::QuartzBlockTile(int id) : Tile(id, Material::stone) { @@ -111,12 +111,12 @@ void QuartzBlockTile::registerIcons(IconRegister *iconRegister) } else { - icons[i] = iconRegister->registerIcon(TEXTURE_NAMES[i]); + icons[i] = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_NAMES[i]); } } - iconTop = iconRegister->registerIcon(TEXTURE_TOP); - iconChiseledTop = iconRegister->registerIcon(TEXTURE_CHISELED_TOP); - iconLinesTop = iconRegister->registerIcon(TEXTURE_LINES_TOP); - iconBottom = iconRegister->registerIcon(TEXTURE_BOTTOM); + iconTop = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_TOP); + iconChiseledTop = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_CHISELED_TOP); + iconLinesTop = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_LINES_TOP); + iconBottom = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_BOTTOM); } \ No newline at end of file diff --git a/Minecraft.World/RailTile.cpp b/Minecraft.World/RailTile.cpp index 4ece48ca..798d248c 100644 --- a/Minecraft.World/RailTile.cpp +++ b/Minecraft.World/RailTile.cpp @@ -1,676 +1,36 @@ #include "stdafx.h" -#include "net.minecraft.world.phys.h" -#include "net.minecraft.world.level.h" #include "net.minecraft.world.h" #include "RailTile.h" -RailTile::Rail::Rail(Level *level, int x, int y, int z) +RailTile::RailTile(int id) : BaseRailTile(id, false) { - this->level = level; - this->x = x; - this->y = y; - this->z = z; - - int id = level->getTile(x, y, z); - - // 4J Stu - We saw a random crash near the end of development on XboxOne orignal version where the id here isn't a tile any more - // Adding this check in to avoid that crash - m_bValidRail = isRail(id); - if(m_bValidRail) - { - int direction = level->getData(x, y, z); - if (((RailTile *) Tile::tiles[id])->usesDataBit) - { - usesDataBit = true; - direction = direction & ~RAIL_DATA_BIT; - } - else - { - usesDataBit = false; - } - updateConnections(direction); - } -} - -RailTile::Rail::~Rail() -{ - for( int i = 0; i < connections.size(); i++ ) - { - delete connections[i]; - } -} - -void RailTile::Rail::updateConnections(int direction) -{ - if(m_bValidRail) - { - for( int i = 0; i < connections.size(); i++ ) - { - delete connections[i]; - } - connections.clear(); - MemSect(50); - if (direction == DIR_FLAT_Z) - { - connections.push_back(new TilePos(x, y, z - 1)); - connections.push_back(new TilePos(x, y, z + 1)); - } else if (direction == DIR_FLAT_X) - { - connections.push_back(new TilePos(x - 1, y, z)); - connections.push_back(new TilePos(x + 1, y, z)); - } else if (direction == 2) - { - connections.push_back(new TilePos(x - 1, y, z)); - connections.push_back(new TilePos(x + 1, y + 1, z)); - } else if (direction == 3) - { - connections.push_back(new TilePos(x - 1, y + 1, z)); - connections.push_back(new TilePos(x + 1, y, z)); - } else if (direction == 4) - { - connections.push_back(new TilePos(x, y + 1, z - 1)); - connections.push_back(new TilePos(x, y, z + 1)); - } else if (direction == 5) - { - connections.push_back(new TilePos(x, y, z - 1)); - connections.push_back(new TilePos(x, y + 1, z + 1)); - } else if (direction == 6) - { - connections.push_back(new TilePos(x + 1, y, z)); - connections.push_back(new TilePos(x, y, z + 1)); - } else if (direction == 7) - { - connections.push_back(new TilePos(x - 1, y, z)); - connections.push_back(new TilePos(x, y, z + 1)); - } else if (direction == 8) - { - connections.push_back(new TilePos(x - 1, y, z)); - connections.push_back(new TilePos(x, y, z - 1)); - } else if (direction == 9) - { - connections.push_back(new TilePos(x + 1, y, z)); - connections.push_back(new TilePos(x, y, z - 1)); - } - MemSect(0); - } -} - -void RailTile::Rail::removeSoftConnections() -{ - if(m_bValidRail) - { - for (unsigned int i = 0; i < connections.size(); i++) - { - Rail *rail = getRail(connections[i]); - if (rail == NULL || !rail->connectsTo(this)) - { - delete connections[i]; - connections.erase(connections.begin()+i); - i--; - } else - { - delete connections[i]; - MemSect(50); - connections[i] =new TilePos(rail->x, rail->y, rail->z); - MemSect(0); - } - delete rail; - } - } -} - -bool RailTile::Rail::hasRail(int x, int y, int z) -{ - if(!m_bValidRail) return false; - if (isRail(level, x, y, z)) return true; - if (isRail(level, x, y + 1, z)) return true; - if (isRail(level, x, y - 1, z)) return true; - return false; -} - -RailTile::Rail *RailTile::Rail::getRail(TilePos *p) -{ - if(!m_bValidRail) return NULL; - if (isRail(level, p->x, p->y, p->z)) return new Rail(level, p->x, p->y, p->z); - if (isRail(level, p->x, p->y + 1, p->z)) return new Rail(level, p->x, p->y + 1, p->z); - if (isRail(level, p->x, p->y - 1, p->z)) return new Rail(level, p->x, p->y - 1, p->z); - return NULL; -} - - -bool RailTile::Rail::connectsTo(Rail *rail) -{ - if(m_bValidRail) - { - AUTO_VAR(itEnd, connections.end()); - for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) - { - TilePos *p = *it; //connections[i]; - if (p->x == rail->x && p->z == rail->z) - { - return true; - } - } - } - return false; -} - -bool RailTile::Rail::hasConnection(int x, int y, int z) -{ - if(m_bValidRail) - { - AUTO_VAR(itEnd, connections.end()); - for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) - { - TilePos *p = *it; //connections[i]; - if (p->x == x && p->z == z) - { - return true; - } - } - } - return false; -} - - -int RailTile::Rail::countPotentialConnections() -{ - int count = 0; - - if(m_bValidRail) - { - if (hasRail(x, y, z - 1)) count++; - if (hasRail(x, y, z + 1)) count++; - if (hasRail(x - 1, y, z)) count++; - if (hasRail(x + 1, y, z)) count++; - } - - return count; -} - -bool RailTile::Rail::canConnectTo(Rail *rail) -{ - if(!m_bValidRail) return false; - if (connectsTo(rail)) return true; - if (connections.size() == 2) - { - return false; - } - if (connections.empty()) - { - return true; - } - - TilePos *c = connections[0]; - - return true; -} - -void RailTile::Rail::connectTo(Rail *rail) -{ - if(m_bValidRail) - { - MemSect(50); - connections.push_back(new TilePos(rail->x, rail->y, rail->z)); - MemSect(0); - - bool n = hasConnection(x, y, z - 1); - bool s = hasConnection(x, y, z + 1); - bool w = hasConnection(x - 1, y, z); - bool e = hasConnection(x + 1, y, z); - - int dir = -1; - - if (n || s) dir = DIR_FLAT_Z; - if (w || e) dir = DIR_FLAT_X; - - if (!usesDataBit) - { - if (s && e && !n && !w) dir = 6; - if (s && w && !n && !e) dir = 7; - if (n && w && !s && !e) dir = 8; - if (n && e && !s && !w) dir = 9; - } - if (dir == DIR_FLAT_Z) - { - if (isRail(level, x, y + 1, z - 1)) dir = 4; - if (isRail(level, x, y + 1, z + 1)) dir = 5; - } - if (dir == DIR_FLAT_X) - { - if (isRail(level, x + 1, y + 1, z)) dir = 2; - if (isRail(level, x - 1, y + 1, z)) dir = 3; - } - - if (dir < 0) dir = DIR_FLAT_Z; - - int data = dir; - if (usesDataBit) - { - data = (level->getData(x, y, z) & RAIL_DATA_BIT) | dir; - } - - level->setData(x, y, z, data); - } -} - -bool RailTile::Rail::hasNeighborRail(int x, int y, int z) -{ - if(!m_bValidRail) return false; - TilePos tp(x,y,z); - Rail *neighbor = getRail( &tp ); - if (neighbor == NULL) return false; - neighbor->removeSoftConnections(); - bool retval = neighbor->canConnectTo(this); - delete neighbor; - return retval; -} - -void RailTile::Rail::place(bool hasSignal, bool first) -{ - if(m_bValidRail) - { - bool n = hasNeighborRail(x, y, z - 1); - bool s = hasNeighborRail(x, y, z + 1); - bool w = hasNeighborRail(x - 1, y, z); - bool e = hasNeighborRail(x + 1, y, z); - - int dir = -1; - - if ((n || s) && !w && !e) dir = DIR_FLAT_Z; - if ((w || e) && !n && !s) dir = DIR_FLAT_X; - - if (!usesDataBit) - { - if (s && e && !n && !w) dir = 6; - if (s && w && !n && !e) dir = 7; - if (n && w && !s && !e) dir = 8; - if (n && e && !s && !w) dir = 9; - } - if (dir == -1) - { - if (n || s) dir = DIR_FLAT_Z; - if (w || e) dir = DIR_FLAT_X; - - if (!usesDataBit) - { - if (hasSignal) - { - if (s && e) dir = 6; - if (w && s) dir = 7; - if (e && n) dir = 9; - if (n && w) dir = 8; - } else { - if (n && w) dir = 8; - if (e && n) dir = 9; - if (w && s) dir = 7; - if (s && e) dir = 6; - } - } - } - - if (dir == DIR_FLAT_Z) - { - if (isRail(level, x, y + 1, z - 1)) dir = 4; - if (isRail(level, x, y + 1, z + 1)) dir = 5; - } - if (dir == DIR_FLAT_X) - { - if (isRail(level, x + 1, y + 1, z)) dir = 2; - if (isRail(level, x - 1, y + 1, z)) dir = 3; - } - - if (dir < 0) dir = DIR_FLAT_Z; - - updateConnections(dir); - - int data = dir; - if (usesDataBit) - { - data = (level->getData(x, y, z) & RAIL_DATA_BIT) | dir; - } - - if (first || level->getData(x, y, z) != data) - { - level->setData(x, y, z, data); - - AUTO_VAR(itEnd, connections.end()); - for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) - { - Rail *neighbor = getRail(*it); - if (neighbor == NULL) continue; - neighbor->removeSoftConnections(); - - if (neighbor->canConnectTo(this)) - { - neighbor->connectTo(this); - } - delete neighbor; - } - } - } -} - -bool RailTile::isRail(Level *level, int x, int y, int z) -{ - int tile = level->getTile(x, y, z); - return tile == Tile::rail_Id || tile == Tile::goldenRail_Id || tile == Tile::detectorRail_Id; - -} - -bool RailTile::isRail(int id) -{ - return id == Tile::rail_Id || id == Tile::goldenRail_Id || id == Tile::detectorRail_Id; -} - -RailTile::RailTile(int id, bool usesDataBit) : Tile(id, Material::decoration, isSolidRender()) -{ - this->usesDataBit = usesDataBit; - this->setShape(0, 0, 0, 1, 2 / 16.0f, 1); - - iconTurn = NULL; -} - -bool RailTile::isUsesDataBit() -{ - return usesDataBit; -} - -AABB *RailTile::getAABB(Level *level, int x, int y, int z) -{ - return NULL; -} - -bool RailTile::blocksLight() -{ - return false; -} - -bool RailTile::isSolidRender(bool isServerLevel) -{ - return false; -} - -HitResult *RailTile::clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b) -{ - updateShape(level, xt, yt, zt); - return Tile::clip(level, xt, yt, zt, a, b); -} - -void RailTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param -{ - int data = level->getData(x, y, z); - if (data >= 2 && data <= 5) - { - setShape(0, 0, 0, 1, 2 / 16.0f + 0.5f, 1); - } else - { - setShape(0, 0, 0, 1, 2 / 16.0f, 1); - } } Icon *RailTile::getTexture(int face, int data) { - if (usesDataBit) + if (data >= 6) { - if (id == Tile::goldenRail_Id) - { - if ((data & RAIL_DATA_BIT) == 0) - { - return icon; - } - else - { - return iconTurn; // Actually the powered rail on version - } - } - } else if (data >= 6) return iconTurn; - return icon; -} - -bool RailTile::isCubeShaped() -{ - return false; -} - -int RailTile::getRenderShape() -{ - return Tile::SHAPE_RAIL; -} - -int RailTile::getResourceCount(Random random) -{ - return 1; -} - -bool RailTile::mayPlace(Level *level, int x, int y, int z) -{ - if (level->isTopSolidBlocking(x, y - 1, z)) - { - return true; - } - return false; -} - -void RailTile::onPlace(Level *level, int x, int y, int z) -{ - if (!level->isClientSide) - { - updateDir(level, x, y, z, true); - - if (id == Tile::goldenRail_Id) - { - neighborChanged(level, x, y, z, id); - } - } -} - -void RailTile::neighborChanged(Level *level, int x, int y, int z, int type) -{ - if (level->isClientSide) return; - - int data = level->getData(x, y, z); - int dir = data; - if (usesDataBit) { - dir = dir & RAIL_DIRECTION_MASK; - } - bool remove = false; - - if (!level->isTopSolidBlocking(x, y - 1, z)) remove = true; - if (dir == 2 && !level->isTopSolidBlocking(x + 1, y, z)) remove = true; - if (dir == 3 && !level->isTopSolidBlocking(x - 1, y, z)) remove = true; - if (dir == 4 && !level->isTopSolidBlocking(x, y, z - 1)) remove = true; - if (dir == 5 && !level->isTopSolidBlocking(x, y, z + 1)) remove = true; - - if (remove) - { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + return iconTurn; } else { - if (id == Tile::goldenRail_Id) - { - bool signal = level->hasNeighborSignal(x, y, z); - signal = signal || findGoldenRailSignal(level, x, y, z, data, true, 0) || findGoldenRailSignal(level, x, y, z, data, false, 0); - - bool changed = false; - if (signal && (data & RAIL_DATA_BIT) == 0) - { - level->setData(x, y, z, dir | RAIL_DATA_BIT); - changed = true; - } else if (!signal && (data & RAIL_DATA_BIT) != 0) - { - level->setData(x, y, z, dir); - changed = true; - } - - // usually the level only updates neighbors that are in the same - // y plane as the current tile, but sloped rails may need to - // update tiles above or below it as well - if (changed) { - level->updateNeighborsAt(x, y - 1, z, id); - if (dir == 2 || dir == 3 || dir == 4 || dir == 5) - { - level->updateNeighborsAt(x, y + 1, z, id); - } - } - } - else if (type > 0 && Tile::tiles[type]->isSignalSource() && !usesDataBit) - { - Rail *rail = new Rail(level, x, y, z); - if (rail->countPotentialConnections() == 3) - { - updateDir(level, x, y, z, false); - } - delete rail; - } + return icon; } - } -void RailTile::updateDir(Level *level, int x, int y, int z, bool first) +void RailTile::registerIcons(IconRegister *iconRegister) { - if (level->isClientSide) return; - Rail *rail = new Rail(level, x, y, z); - rail->place(level->hasNeighborSignal(x, y, z), first); - delete rail; + BaseRailTile::registerIcons(iconRegister); + iconTurn = iconRegister->registerIcon(getIconName() + L"_turned"); } -bool RailTile::findGoldenRailSignal(Level *level, int x, int y, int z, int data, bool forward, int searchDepth) +void RailTile::updateState(Level *level, int x, int y, int z, int data, int dir, int type) { - if (searchDepth >= 8) + if (type > 0 && Tile::tiles[type]->isSignalSource()) { - return false; - } - - int dir = data & RAIL_DIRECTION_MASK; - - bool checkBelow = true; - switch (dir) - { - case DIR_FLAT_Z: - if (forward) - { - z++; - } else { - z--; - } - break; - case DIR_FLAT_X: - if (forward) + if (Rail(level, x, y, z).countPotentialConnections() == 3) { - x--; - } else { - x++; + updateDir(level, x, y, z, false); } - break; - case 2: - if (forward) - { - x--; - } else - { - x++; - y++; - checkBelow = false; - } - dir = DIR_FLAT_X; - break; - case 3: - if (forward) - { - x--; - y++; - checkBelow = false; - } else { - x++; - } - dir = DIR_FLAT_X; - break; - case 4: - if (forward) - { - z++; - } else { - z--; - y++; - checkBelow = false; - } - dir = DIR_FLAT_Z; - break; - case 5: - if (forward) - { - z++; - y++; - checkBelow = false; - } else - { - z--; - } - dir = DIR_FLAT_Z; - break; - } - - if (isGoldenRailWithPower(level, x, y, z, forward, searchDepth, dir)) - { - return true; - } - if (checkBelow && isGoldenRailWithPower(level, x, y - 1, z, forward, searchDepth, dir)) - { - return true; - } - return false; - -} - -bool RailTile::isGoldenRailWithPower(Level *level, int x, int y, int z, bool forward, int searchDepth, int dir) -{ - int tile = level->getTile(x, y, z); - if (tile == Tile::goldenRail_Id) - { - int tileData = level->getData(x, y, z); - int myDir = tileData & RAIL_DIRECTION_MASK; - - if (dir == DIR_FLAT_X && (myDir == DIR_FLAT_Z || myDir == 4 || myDir == 5)) - { - return false; - } - if (dir == DIR_FLAT_Z && (myDir == DIR_FLAT_X || myDir == 2 || myDir == 3)) - { - return false; - } - - if ((tileData & RAIL_DATA_BIT) != 0) - { - if (level->hasNeighborSignal(x, y, z)) - { - return true; - } - else - { - return findGoldenRailSignal(level, x, y, z, tileData, forward, searchDepth + 1); - } - } - } - return false; -} - -int RailTile::getPistonPushReaction() -{ - return Material::PUSH_NORMAL; -} - -void RailTile::registerIcons(IconRegister *iconRegister) -{ - Tile::registerIcons(iconRegister); - if(id == Tile::goldenRail_Id) - { - iconTurn = iconRegister->registerIcon(L"goldenRail_powered"); - } - else - { - iconTurn = iconRegister->registerIcon(L"rail_turn"); } } \ No newline at end of file diff --git a/Minecraft.World/RailTile.h b/Minecraft.World/RailTile.h index 776d8454..eacbf05b 100644 --- a/Minecraft.World/RailTile.h +++ b/Minecraft.World/RailTile.h @@ -1,84 +1,20 @@ #pragma once -#include "Tile.h" -#include "TilePos.h" -#include "Definitions.h" -class Random; -class HitResult; -class ChunkRebuildData; +#include "BaseRailTile.h" -using namespace std; - -class RailTile : public Tile +class RailTile : public BaseRailTile { - friend class Tile; friend class ChunkRebuildData; -public: - static const int DIR_FLAT_Z = 0; - static const int DIR_FLAT_X = 1; - // the data bit is used by boosters and detectors, so they can't turn - static const int RAIL_DATA_BIT = 8; - static const int RAIL_DIRECTION_MASK = 7; private: Icon *iconTurn; - - bool usesDataBit; - - class Rail - { - friend class RailTile; - private: - Level *level; - int x, y, z; - bool usesDataBit; - vector connections; - bool m_bValidRail; // 4J added - - public: - Rail(Level *level, int x, int y, int z); - ~Rail(); - private: - void updateConnections(int direction); - void removeSoftConnections(); - bool hasRail(int x, int y, int z); - Rail *getRail(TilePos *p); - bool connectsTo(Rail *rail); - bool hasConnection(int x, int y, int z); - int countPotentialConnections(); - bool canConnectTo(Rail *rail); - private: - void connectTo(Rail *rail); - bool hasNeighborRail(int x, int y, int z); - public: - void place(bool hasSignal, bool first); - }; + public: - static bool isRail(Level *level, int x, int y, int z); - static bool isRail(int id); -protected: - RailTile(int id, bool usesDataBit); -public: - using Tile::getResourceCount; + RailTile(int id); - bool isUsesDataBit(); - virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual bool blocksLight(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - virtual Icon *getTexture(int face, int data); - virtual bool isCubeShaped(); - virtual int getRenderShape(); - virtual int getResourceCount(Random random); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual void onPlace(Level *level, int x, int y, int z); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); -private: - void updateDir(Level *level, int x, int y, int z, bool first); - bool findGoldenRailSignal(Level *level, int x, int y, int z, int data, bool forward, int searchDepth); - bool isGoldenRailWithPower(Level *level, int x, int y, int z, bool forward, int searchDepth, int dir); -public: - virtual int getPistonPushReaction(); + Icon *getTexture(int face, int data); void registerIcons(IconRegister *iconRegister); -}; + +protected: + void updateState(Level *level, int x, int y, int z, int data, int dir, int type); +}; \ No newline at end of file diff --git a/Minecraft.World/RandomLevelSource.cpp b/Minecraft.World/RandomLevelSource.cpp index 4e26134a..2b93578a 100644 --- a/Minecraft.World/RandomLevelSource.cpp +++ b/Minecraft.World/RandomLevelSource.cpp @@ -7,6 +7,7 @@ #include "net.minecraft.world.level.levelgen.synth.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.storage.h" +#include "net.minecraft.world.entity.h" #include "RandomLevelSource.h" #ifdef __PS3__ @@ -17,6 +18,8 @@ static PerlinNoise_DataIn g_lperlinNoise2_SPU __attribute__((__aligned__(16))); static PerlinNoise_DataIn g_perlinNoise1_SPU __attribute__((__aligned__(16))); static PerlinNoise_DataIn g_scaleNoise_SPU __attribute__((__aligned__(16))); static PerlinNoise_DataIn g_depthNoise_SPU __attribute__((__aligned__(16))); +//#define DISABLE_SPU_CODE + #endif @@ -26,38 +29,40 @@ const double RandomLevelSource::SNOW_CUTOFF = 0.5; RandomLevelSource::RandomLevelSource(Level *level, __int64 seed, bool generateStructures) : generateStructures( generateStructures ) { m_XZSize = level->getLevelData()->getXZSize(); - +#ifdef _LARGE_WORLDS + level->getLevelData()->getMoatFlags(&m_classicEdgeMoat, &m_smallEdgeMoat, &m_mediumEdgeMoat); +#endif caveFeature = new LargeCaveFeature(); strongholdFeature = new StrongholdFeature(); - villageFeature = new VillageFeature(0,m_XZSize); - mineShaftFeature = new MineShaftFeature(); + villageFeature = new VillageFeature(m_XZSize); + mineShaftFeature = new MineShaftFeature(); scatteredFeature = new RandomScatteredLargeFeature(); canyonFeature = new CanyonFeature(); - this->level = level; + this->level = level; - random = new Random(seed); + random = new Random(seed); pprandom = new Random(seed); // 4J - added, so that we can have a separate random for doing post-processing in parallel with creation - lperlinNoise1 = new PerlinNoise(random, 16); - lperlinNoise2 = new PerlinNoise(random, 16); - perlinNoise1 = new PerlinNoise(random, 8); - perlinNoise3 = new PerlinNoise(random, 4); + lperlinNoise1 = new PerlinNoise(random, 16); + lperlinNoise2 = new PerlinNoise(random, 16); + perlinNoise1 = new PerlinNoise(random, 8); + perlinNoise3 = new PerlinNoise(random, 4); - scaleNoise = new PerlinNoise(random, 10); - depthNoise = new PerlinNoise(random, 16); + scaleNoise = new PerlinNoise(random, 10); + depthNoise = new PerlinNoise(random, 16); - if (FLOATING_ISLANDS) + if (FLOATING_ISLANDS) { - floatingIslandScale = new PerlinNoise(random, 10); - floatingIslandNoise = new PerlinNoise(random, 16); - } + floatingIslandScale = new PerlinNoise(random, 10); + floatingIslandNoise = new PerlinNoise(random, 16); + } else { floatingIslandScale = NULL; floatingIslandNoise = NULL; } - forestNoise = new PerlinNoise(random, 8); + forestNoise = new PerlinNoise(random, 8); } RandomLevelSource::~RandomLevelSource() @@ -69,24 +74,24 @@ RandomLevelSource::~RandomLevelSource() delete scatteredFeature; delete canyonFeature; - this->level = level; + this->level = level; - delete random;; - delete lperlinNoise1; - delete lperlinNoise2; - delete perlinNoise1; - delete perlinNoise3; + delete random;; + delete lperlinNoise1; + delete lperlinNoise2; + delete perlinNoise1; + delete perlinNoise3; - delete scaleNoise; - delete depthNoise; + delete scaleNoise; + delete depthNoise; - if (FLOATING_ISLANDS) + if (FLOATING_ISLANDS) { - delete floatingIslandScale; - delete floatingIslandNoise; - } + delete floatingIslandScale; + delete floatingIslandNoise; + } - delete forestNoise; + delete forestNoise; if( pows.data != NULL ) delete [] pows.data; } @@ -97,115 +102,225 @@ LARGE_INTEGER g_totalPrepareHeightsTime = {0,0}; LARGE_INTEGER g_averagePrepareHeightsTime = {0, 0}; + + + + +#ifdef _LARGE_WORLDS + +int RandomLevelSource::getMinDistanceToEdge(int xxx, int zzz, int worldSize, float falloffStart) +{ + // Get distance to edges of world in x + // we have to do a proper line dist check here + int min = -worldSize/2; + int max = (worldSize/2)-1; + + // // only check if either x or z values are within the falloff + // if(xxx > (min - falloffStart) + + Vec3* topLeft = Vec3::newTemp(min, 0, min); + Vec3* topRight = Vec3::newTemp(max, 0, min); + Vec3* bottomLeft = Vec3::newTemp(min, 0, max); + Vec3* bottomRight = Vec3::newTemp(max, 0, max); + + float closest = falloffStart; + float dist; + // make sure we're in range of the edges before we do a full distance check + if( (xxx > (min-falloffStart) && xxx < (min+falloffStart)) || + (xxx > (max-falloffStart) && xxx < (max+falloffStart)) ) + { + Vec3* point = Vec3::newTemp(xxx, 0, zzz); + if(xxx>0) + dist = point->distanceFromLine(topRight, bottomRight); + else + dist = point->distanceFromLine(topLeft, bottomLeft); + closest = dist; + } + + // make sure we're in range of the edges before we do a full distance check + if( (zzz > (min-falloffStart) && zzz < (min+falloffStart)) || + (zzz > (max-falloffStart) && zzz < (max+falloffStart)) ) + { + Vec3* point = Vec3::newTemp(xxx, 0, zzz); + if(zzz>0) + dist = point->distanceFromLine(bottomLeft, bottomRight); + else + dist = point->distanceFromLine(topLeft, topRight); + if(dist expandedWorldSizes[i])) + { + // this world has been expanded, with moat settings, so we need fallofs at this edges too + int eminMoat = getMinDistanceToEdge(xxx, zzz, expandedWorldSizes[i], falloffStart); + if(eminMoat < emin) + { + emin = eminMoat; + } + } + } + + // Calculate how much we want the world to fall away, if we're in the defined region to do so + if( emin < falloffStart ) + { + int falloff = falloffStart - emin; + comp = ((float)falloff / (float)falloffStart ) * falloffMax; + } + *pEMin = emin; + return comp; + // 4J - end of extra code + /////////////////////////////////////////////////////////////////// +} + +#else + + +// MGH - go back to using the simpler version for PS3/vita/360, as it was causing a lot of slow down on the tuturial generation +float RandomLevelSource::getHeightFalloff(int xxx, int zzz, int* pEMin) +{ + /////////////////////////////////////////////////////////////////// + // 4J - add this chunk of code to make land "fall-off" at the edges of + // a finite world - size of that world is currently hard-coded in here + const int worldSize = m_XZSize * 16; + const int falloffStart = 32; // chunks away from edge were we start doing fall-off + const float falloffMax = 128.0f; // max value we need to get to falloff by the edge of the map + + // Get distance to edges of world in x + int xxx0 = xxx + ( worldSize / 2 ); + if( xxx0 < 0 ) xxx0 = 0; + int xxx1 = ( ( worldSize / 2 ) - 1 ) - xxx; + if( xxx1 < 0 ) xxx1 = 0; + + // Get distance to edges of world in z + int zzz0 = zzz + ( worldSize / 2 ); + if( zzz0 < 0 ) zzz0 = 0; + int zzz1 = ( ( worldSize / 2 ) - 1 ) - zzz; + if( zzz1 < 0 ) zzz1 = 0; + + // Get min distance to any edge + int emin = xxx0; + if (xxx1 < emin ) emin = xxx1; + if (zzz0 < emin ) emin = zzz0; + if (zzz1 < emin ) emin = zzz1; + + float comp = 0.0f; + + // Calculate how much we want the world to fall away, if we're in the defined region to do so + if( emin < falloffStart ) + { + int falloff = falloffStart - emin; + comp = ((float)falloff / (float)falloffStart ) * falloffMax; + } + // 4J - end of extra code + /////////////////////////////////////////////////////////////////// + *pEMin = emin; + return comp; +} + +#endif // _LARGE_WORLDS + void RandomLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) { LARGE_INTEGER startTime; - int xChunks = 16 / CHUNK_WIDTH; + int xChunks = 16 / CHUNK_WIDTH; int yChunks = Level::genDepth / CHUNK_HEIGHT; int waterHeight = level->seaLevel; - int xSize = xChunks + 1; - int ySize = Level::genDepth / CHUNK_HEIGHT + 1; - int zSize = xChunks + 1; + int xSize = xChunks + 1; + int ySize = Level::genDepth / CHUNK_HEIGHT + 1; + int zSize = xChunks + 1; BiomeArray biomes; // 4J created locally here for thread safety, java has this as a class member level->getBiomeSource()->getRawBiomeBlock(biomes, xOffs * CHUNK_WIDTH - 2, zOffs * CHUNK_WIDTH - 2, xSize + 5, zSize + 5); doubleArray buffer; // 4J - used to be declared with class level scope but tidying up for thread safety reasons - buffer = getHeights(buffer, xOffs * xChunks, 0, zOffs * xChunks, xSize, ySize, zSize, biomes); + buffer = getHeights(buffer, xOffs * xChunks, 0, zOffs * xChunks, xSize, ySize, zSize, biomes); QueryPerformanceCounter(&startTime); - for (int xc = 0; xc < xChunks; xc++) + for (int xc = 0; xc < xChunks; xc++) { - for (int zc = 0; zc < xChunks; zc++) + for (int zc = 0; zc < xChunks; zc++) { - for (int yc = 0; yc < yChunks; yc++) + for (int yc = 0; yc < yChunks; yc++) { - double yStep = 1 / (double) CHUNK_HEIGHT; - double s0 = buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 0)]; - double s1 = buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 0)]; - double s2 = buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 0)]; - double s3 = buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 0)]; - - double s0a = (buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 1)] - s0) * yStep; - double s1a = (buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 1)] - s1) * yStep; - double s2a = (buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 1)] - s2) * yStep; - double s3a = (buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 1)] - s3) * yStep; - - for (int y = 0; y < CHUNK_HEIGHT; y++) + double yStep = 1 / (double) CHUNK_HEIGHT; + double s0 = buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 0)]; + double s1 = buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 0)]; + double s2 = buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 0)]; + double s3 = buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 0)]; + + double s0a = (buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 1)] - s0) * yStep; + double s1a = (buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 1)] - s1) * yStep; + double s2a = (buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 1)] - s2) * yStep; + double s3a = (buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 1)] - s3) * yStep; + + for (int y = 0; y < CHUNK_HEIGHT; y++) { - double xStep = 1 / (double) CHUNK_WIDTH; + double xStep = 1 / (double) CHUNK_WIDTH; - double _s0 = s0; - double _s1 = s1; - double _s0a = (s2 - s0) * xStep; - double _s1a = (s3 - s1) * xStep; + double _s0 = s0; + double _s1 = s1; + double _s0a = (s2 - s0) * xStep; + double _s1a = (s3 - s1) * xStep; - for (int x = 0; x < CHUNK_WIDTH; x++) + for (int x = 0; x < CHUNK_WIDTH; x++) { - int offs = (x + xc * CHUNK_WIDTH) << Level::genDepthBitsPlusFour | (0 + zc * CHUNK_WIDTH) << Level::genDepthBits | (yc * CHUNK_HEIGHT + y); - int step = 1 << Level::genDepthBits; + int offs = (x + xc * CHUNK_WIDTH) << Level::genDepthBitsPlusFour | (0 + zc * CHUNK_WIDTH) << Level::genDepthBits | (yc * CHUNK_HEIGHT + y); + int step = 1 << Level::genDepthBits; offs -= step; - double zStep = 1 / (double) CHUNK_WIDTH; + double zStep = 1 / (double) CHUNK_WIDTH; - double val = _s0; - double vala = (_s1 - _s0) * zStep; + double val = _s0; + double vala = (_s1 - _s0) * zStep; val -= vala; - for (int z = 0; z < CHUNK_WIDTH; z++) + for (int z = 0; z < CHUNK_WIDTH; z++) { - /////////////////////////////////////////////////////////////////// - // 4J - add this chunk of code to make land "fall-off" at the edges of - // a finite world - size of that world is currently hard-coded in here - const int worldSize = m_XZSize * 16; - const int falloffStart = 32; // chunks away from edge were we start doing fall-off - const float falloffMax = 128.0f; // max value we need to get to falloff by the edge of the map - +// 4J Stu - I have removed all uses of the new getHeightFalloff function for now as we had some problems with PS3/PSVita world generation +// I have fixed the non large worlds method, however we will be happier if the current builds go out with completely old code +// We can put the new code back in mid-november 2014 once those PS3/Vita builds are gone (and the PS4 doesn't have world enlarging in these either anyway) int xxx = ( ( xOffs * 16 ) + x + ( xc * CHUNK_WIDTH ) ); int zzz = ( ( zOffs * 16 ) + z + ( zc * CHUNK_WIDTH ) ); + int emin; + float comp = getHeightFalloff(xxx, zzz, &emin); - // Get distance to edges of world in x - int xxx0 = xxx + ( worldSize / 2 ); - if( xxx0 < 0 ) xxx0 = 0; - int xxx1 = ( ( worldSize / 2 ) - 1 ) - xxx; - if( xxx1 < 0 ) xxx1 = 0; - - // Get distance to edges of world in z - int zzz0 = zzz + ( worldSize / 2 ); - if( zzz0 < 0 ) zzz0 = 0; - int zzz1 = ( ( worldSize / 2 ) - 1 ) - zzz; - if( zzz1 < 0 ) zzz1 = 0; - - // Get min distance to any edge - int emin = xxx0; - if (xxx1 < emin ) emin = xxx1; - if (zzz0 < emin ) emin = zzz0; - if (zzz1 < emin ) emin = zzz1; - - float comp = 0.0f; - - // Calculate how much we want the world to fall away, if we're in the defined region to do so - if( emin < falloffStart ) - { - int falloff = falloffStart - emin; - comp = ((float)falloff / (float)falloffStart ) * falloffMax; - } - // 4J - end of extra code - /////////////////////////////////////////////////////////////////// // 4J - slightly rearranged this code (as of java 1.0.1 merge) to better fit with // changes we've made edge-of-world things - original sets blocks[offs += step] directly // here rather than setting a tileId int tileId = 0; // 4J - this comparison used to just be with 0.0f but is now varied by block above - if ((val += vala) > comp) + if ((val += vala) > comp) { - tileId = (byte) Tile::rock_Id; - } + tileId = (byte) Tile::stone_Id; + } else if (yc * CHUNK_HEIGHT + y < waterHeight) { - tileId = (byte) Tile::calmWater_Id; - } + tileId = (byte) Tile::calmWater_Id; + } // 4J - more extra code to make sure that the column at the edge of the world is just water & rock, to match the infinite sea that // continues on after the edge of the world. @@ -213,24 +328,24 @@ void RandomLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) if( emin == 0 ) { // This matches code in MultiPlayerChunkCache that makes the geometry which continues at the edge of the world - if( yc * CHUNK_HEIGHT + y <= ( level->getSeaLevel() - 10 ) ) tileId = Tile::rock_Id; + if( yc * CHUNK_HEIGHT + y <= ( level->getSeaLevel() - 10 ) ) tileId = Tile::stone_Id; else if( yc * CHUNK_HEIGHT + y < level->getSeaLevel() ) tileId = Tile::calmWater_Id; } blocks[offs += step] = tileId; - } - _s0 += _s0a; - _s1 += _s1a; - } - - s0 += s0a; - s1 += s1a; - s2 += s2a; - s3 += s3a; - } - } - } - } + } + _s0 += _s0a; + _s1 += _s1a; + } + + s0 += s0a; + s1 += s1a; + s2 += s2a; + s3 += s3a; + } + } + } + } LARGE_INTEGER endTime; QueryPerformanceCounter(&endTime); LARGE_INTEGER timeInFunc; @@ -248,26 +363,26 @@ void RandomLevelSource::prepareHeights(int xOffs, int zOffs, byteArray blocks) void RandomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes) { - int waterHeight = level->seaLevel; + int waterHeight = level->seaLevel; - double s = 1 / 32.0; + double s = 1 / 32.0; doubleArray depthBuffer(16*16); // 4J - used to be declared with class level scope but moved here for thread safety - depthBuffer = perlinNoise3->getRegion(depthBuffer, xOffs * 16, zOffs * 16, 0, 16, 16, 1, s * 2, s * 2, s * 2); + depthBuffer = perlinNoise3->getRegion(depthBuffer, xOffs * 16, zOffs * 16, 0, 16, 16, 1, s * 2, s * 2, s * 2); - for (int x = 0; x < 16; x++) + for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) + for (int z = 0; z < 16; z++) { - Biome *b = biomes[z + x * 16]; + Biome *b = biomes[z + x * 16]; float temp = b->getTemperature(); - int runDepth = (int) (depthBuffer[x + z * 16] / 3 + 3 + random->nextDouble() * 0.25); + int runDepth = (int) (depthBuffer[x + z * 16] / 3 + 3 + random->nextDouble() * 0.25); - int run = -1; + int run = -1; - byte top = b->topMaterial; - byte material = b->material; + byte top = b->topMaterial; + byte material = b->material; LevelGenerationOptions *lgo = app.getLevelGenerationOptions(); if(lgo != NULL) @@ -275,70 +390,69 @@ void RandomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks, Bi lgo->getBiomeOverride(b->id,material,top); } - for (int y = Level::genDepthMinusOne; y >= 0; y--) + for (int y = Level::genDepthMinusOne; y >= 0; y--) { - int offs = (z * 16 + x) * Level::genDepth + y; + int offs = (z * 16 + x) * Level::genDepth + y; if (y <= 1 + random->nextInt(2)) // 4J - changed to make the bedrock not have bits you can get stuck in -// if (y <= 0 + random->nextInt(5)) + // if (y <= 0 + random->nextInt(5)) { - blocks[offs] = (byte) Tile::unbreakable_Id; - } + blocks[offs] = (byte) Tile::unbreakable_Id; + } else { - int old = blocks[offs]; + int old = blocks[offs]; - if (old == 0) + if (old == 0) { - run = -1; - } - else if (old == Tile::rock_Id) + run = -1; + } + else if (old == Tile::stone_Id) { - if (run == -1) + if (run == -1) { - if (runDepth <= 0) + if (runDepth <= 0) { - top = 0; - material = (byte) Tile::rock_Id; - } + top = 0; + material = (byte) Tile::stone_Id; + } else if (y >= waterHeight - 4 && y <= waterHeight + 1) { - top = b->topMaterial; + top = b->topMaterial; material = b->material; if(lgo != NULL) { lgo->getBiomeOverride(b->id,material,top); } - } + } - if (y < waterHeight && top == 0) + if (y < waterHeight && top == 0) { - if (temp < 0.15f) top = (byte) Tile::ice_Id; - else top = (byte) Tile::calmWater_Id; - } - - run = runDepth; - if (y >= waterHeight - 1) blocks[offs] = top; - else blocks[offs] = material; - } + if (temp < 0.15f) top = (byte) Tile::ice_Id; + else top = (byte) Tile::calmWater_Id; + } + + run = runDepth; + if (y >= waterHeight - 1) blocks[offs] = top; + else blocks[offs] = material; + } else if (run > 0) { - run--; - blocks[offs] = material; + run--; + blocks[offs] = material; - // place a few sandstone blocks beneath sand - // runs - if (run == 0 && material == Tile::sand_Id) + // place a few sandstone blocks beneath sand runs + if (run == 0 && material == Tile::sand_Id) { - run = random->nextInt(4); - material = (byte) Tile::sandStone_Id; - } - } - } - } - } - } - } + run = random->nextInt(4); + material = (byte) Tile::sandStone_Id; + } + } + } + } + } + } + } delete [] depthBuffer.data; @@ -351,28 +465,28 @@ LevelChunk *RandomLevelSource::create(int x, int z) LevelChunk *RandomLevelSource::getChunk(int xOffs, int zOffs) { - random->setSeed(xOffs * 341873128712l + zOffs * 132897987541l); + random->setSeed(xOffs * 341873128712l + zOffs * 132897987541l); // 4J - now allocating this with a physical alloc & bypassing general memory management so that it will get cleanly freed int blocksSize = Level::genDepth * 16 * 16; byte *tileData = (byte *)XPhysicalAlloc(blocksSize, MAXULONG_PTR, 4096, PAGE_READWRITE); XMemSet128(tileData,0,blocksSize); byteArray blocks = byteArray(tileData,blocksSize); -// byteArray blocks = byteArray(16 * level->depth * 16); + // byteArray blocks = byteArray(16 * level->depth * 16); - // LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); // 4J - moved to below + // LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); // 4J - moved to below prepareHeights(xOffs, zOffs, blocks); // 4J - Some changes made here to how biomes, temperatures and downfalls are passed around for thread safety BiomeArray biomes; - level->getBiomeSource()->getBiomeBlock(biomes, xOffs * 16, zOffs * 16, 16, 16, true); + level->getBiomeSource()->getBiomeBlock(biomes, xOffs * 16, zOffs * 16, 16, 16, true); - buildSurfaces(xOffs, zOffs, blocks, biomes); + buildSurfaces(xOffs, zOffs, blocks, biomes); delete [] biomes.data; - caveFeature->apply(this, level, xOffs, zOffs, blocks); + caveFeature->apply(this, level, xOffs, zOffs, blocks); // 4J Stu Design Change - 1.8 gen goes stronghold, mineshaft, village, canyon // this changed in 1.2 to canyon, mineshaft, village, stronghold // This change makes sense as it stops canyons running through other structures @@ -384,19 +498,19 @@ LevelChunk *RandomLevelSource::getChunk(int xOffs, int zOffs) strongholdFeature->apply(this, level, xOffs, zOffs, blocks); scatteredFeature->apply(this, level, xOffs, zOffs, blocks); } -// canyonFeature.apply(this, level, xOffs, zOffs, blocks); - // townFeature.apply(this, level, xOffs, zOffs, blocks); - // addCaves(xOffs, zOffs, blocks); - // addTowns(xOffs, zOffs, blocks); + // canyonFeature.apply(this, level, xOffs, zOffs, blocks); + // townFeature.apply(this, level, xOffs, zOffs, blocks); + // addCaves(xOffs, zOffs, blocks); + // addTowns(xOffs, zOffs, blocks); -// levelChunk->recalcHeightmap(); // 4J - removed & moved into its own method + // levelChunk->recalcHeightmap(); // 4J - removed & moved into its own method // 4J - this now creates compressed block data from the blocks array passed in, so moved it until after the blocks are actually finalised. We also // now need to free the passed in blocks as the LevelChunk doesn't use the passed in allocation anymore. LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); XPhysicalFree(tileData); - return levelChunk; + return levelChunk; } // 4J - removed & moved into its own method from getChunk, so we can call recalcHeightmap after the chunk is added into the cache. Without @@ -411,10 +525,10 @@ void RandomLevelSource::lightChunk(LevelChunk *lc) doubleArray RandomLevelSource::getHeights(doubleArray buffer, int x, int y, int z, int xSize, int ySize, int zSize, BiomeArray& biomes) { - if (buffer.data == NULL) + if (buffer.data == NULL) { - buffer = doubleArray(xSize * ySize * zSize); - } + buffer = doubleArray(xSize * ySize * zSize); + } if (pows.data == NULL) { pows = floatArray(5 * 5); @@ -428,16 +542,16 @@ doubleArray RandomLevelSource::getHeights(doubleArray buffer, int x, int y, int } } - double s = 1 * 684.412; - double hs = 1 * 684.412; + double s = 1 * 684.412; + double hs = 1 * 684.412; doubleArray pnr, ar, br, sr, dr, fi, fis; // 4J - used to be declared with class level scope but moved here for thread safety - if (FLOATING_ISLANDS) + if (FLOATING_ISLANDS) { - fis = floatingIslandScale->getRegion(fis, x, y, z, xSize, 1, zSize, 1.0, 0, 1.0); - fi = floatingIslandNoise->getRegion(fi, x, y, z, xSize, 1, zSize, 500.0, 0, 500.0); - } + fis = floatingIslandScale->getRegion(fis, x, y, z, xSize, 1, zSize, 1.0, 0, 1.0); + fi = floatingIslandNoise->getRegion(fi, x, y, z, xSize, 1, zSize, 500.0, 0, 500.0); + } #if defined __PS3__ && !defined DISABLE_SPU_CODE C4JSpursJobQueue::Port port("C4JSpursJob_PerlinNoise"); @@ -459,23 +573,23 @@ doubleArray RandomLevelSource::getHeights(doubleArray buffer, int x, int y, int port.submitJob(&perlinJob4); port.submitJob(&perlinJob5); port.waitForCompletion(); - #else - sr = scaleNoise->getRegion(sr, x, z, xSize, zSize, 1.121, 1.121, 0.5); - dr = depthNoise->getRegion(dr, x, z, xSize, zSize, 200.0, 200.0, 0.5); - pnr = perlinNoise1->getRegion(pnr, x, y, z, xSize, ySize, zSize, s / 80.0, hs / 160.0, s / 80.0); - ar = lperlinNoise1->getRegion(ar, x, y, z, xSize, ySize, zSize, s, hs, s); - br = lperlinNoise2->getRegion(br, x, y, z, xSize, ySize, zSize, s, hs, s); +#else + sr = scaleNoise->getRegion(sr, x, z, xSize, zSize, 1.121, 1.121, 0.5); + dr = depthNoise->getRegion(dr, x, z, xSize, zSize, 200.0, 200.0, 0.5); + pnr = perlinNoise1->getRegion(pnr, x, y, z, xSize, ySize, zSize, s / 80.0, hs / 160.0, s / 80.0); + ar = lperlinNoise1->getRegion(ar, x, y, z, xSize, ySize, zSize, s, hs, s); + br = lperlinNoise2->getRegion(br, x, y, z, xSize, ySize, zSize, s, hs, s); #endif x = z = 0; - int p = 0; - int pp = 0; + int p = 0; + int pp = 0; - for (int xx = 0; xx < xSize; xx++) + for (int xx = 0; xx < xSize; xx++) { - for (int zz = 0; zz < zSize; zz++) + for (int zz = 0; zz < zSize; zz++) { float sss = 0; float ddd = 0; @@ -504,27 +618,27 @@ doubleArray RandomLevelSource::getHeights(doubleArray buffer, int x, int y, int sss = sss * 0.9f + 0.1f; ddd = (ddd * 4 - 1) / 8.0f; - - double rdepth = (dr[pp] / 8000.0); - if (rdepth < 0) rdepth = -rdepth * 0.3; - rdepth = rdepth * 3.0 - 2.0; - if (rdepth < 0) + double rdepth = (dr[pp] / 8000.0); + if (rdepth < 0) rdepth = -rdepth * 0.3; + rdepth = rdepth * 3.0 - 2.0; + + if (rdepth < 0) { rdepth = rdepth / 2; - if (rdepth < -1) rdepth = -1; - rdepth = rdepth / 1.4; - rdepth /= 2; - } + if (rdepth < -1) rdepth = -1; + rdepth = rdepth / 1.4; + rdepth /= 2; + } else { - if (rdepth > 1) rdepth = 1; - rdepth = rdepth / 8; - } + if (rdepth > 1) rdepth = 1; + rdepth = rdepth / 8; + } - pp++; + pp++; - for (int yy = 0; yy < ySize; yy++) + for (int yy = 0; yy < ySize; yy++) { double depth = ddd; double scale = sss; @@ -534,32 +648,32 @@ doubleArray RandomLevelSource::getHeights(doubleArray buffer, int x, int y, int double yCenter = ySize / 2.0 + depth * 4; - double val = 0; + double val = 0; double yOffs = (yy - (yCenter)) * 12 * 128 / Level::genDepth / scale; - if (yOffs < 0) yOffs *= 4; + if (yOffs < 0) yOffs *= 4; - double bb = ar[p] / 512; - double cc = br[p] / 512; + double bb = ar[p] / 512; + double cc = br[p] / 512; - double v = (pnr[p] / 10 + 1) / 2; - if (v < 0) val = bb; - else if (v > 1) val = cc; - else val = bb + (cc - bb) * v; - val -= yOffs; + double v = (pnr[p] / 10 + 1) / 2; + if (v < 0) val = bb; + else if (v > 1) val = cc; + else val = bb + (cc - bb) * v; + val -= yOffs; - if (yy > ySize - 4) + if (yy > ySize - 4) { - double slide = (yy - (ySize - 4)) / (4 - 1.0f); - val = val * (1 - slide) + -10 * slide; - } + double slide = (yy - (ySize - 4)) / (4 - 1.0f); + val = val * (1 - slide) + -10 * slide; + } - buffer[p] = val; - p++; - } - } - } + buffer[p] = val; + p++; + } + } + } delete [] pnr.data; delete [] ar.data; @@ -569,7 +683,7 @@ doubleArray RandomLevelSource::getHeights(doubleArray buffer, int x, int y, int delete [] fi.data; delete [] fis.data; - return buffer; + return buffer; } @@ -580,76 +694,76 @@ bool RandomLevelSource::hasChunk(int x, int y) void RandomLevelSource::calcWaterDepths(ChunkSource *parent, int xt, int zt) { - int xo = xt * 16; - int zo = zt * 16; - for (int x = 0; x < 16; x++) + int xo = xt * 16; + int zo = zt * 16; + for (int x = 0; x < 16; x++) { - int y = level->getSeaLevel(); - for (int z = 0; z < 16; z++) + int y = level->getSeaLevel(); + for (int z = 0; z < 16; z++) { - int xp = xo + x + 7; - int zp = zo + z + 7; - int h = level->getHeightmap(xp, zp); - if (h <= 0) + int xp = xo + x + 7; + int zp = zo + z + 7; + int h = level->getHeightmap(xp, zp); + if (h <= 0) { - if (level->getHeightmap(xp - 1, zp) > 0 || level->getHeightmap(xp + 1, zp) > 0 || level->getHeightmap(xp, zp - 1) > 0 || level->getHeightmap(xp, zp + 1) > 0) + if (level->getHeightmap(xp - 1, zp) > 0 || level->getHeightmap(xp + 1, zp) > 0 || level->getHeightmap(xp, zp - 1) > 0 || level->getHeightmap(xp, zp + 1) > 0) { - bool hadWater = false; - if (hadWater || (level->getTile(xp - 1, y, zp) == Tile::calmWater_Id && level->getData(xp - 1, y, zp) < 7)) hadWater = true; - if (hadWater || (level->getTile(xp + 1, y, zp) == Tile::calmWater_Id && level->getData(xp + 1, y, zp) < 7)) hadWater = true; - if (hadWater || (level->getTile(xp, y, zp - 1) == Tile::calmWater_Id && level->getData(xp, y, zp - 1) < 7)) hadWater = true; - if (hadWater || (level->getTile(xp, y, zp + 1) == Tile::calmWater_Id && level->getData(xp, y, zp + 1) < 7)) hadWater = true; - if (hadWater) + bool hadWater = false; + if (hadWater || (level->getTile(xp - 1, y, zp) == Tile::calmWater_Id && level->getData(xp - 1, y, zp) < 7)) hadWater = true; + if (hadWater || (level->getTile(xp + 1, y, zp) == Tile::calmWater_Id && level->getData(xp + 1, y, zp) < 7)) hadWater = true; + if (hadWater || (level->getTile(xp, y, zp - 1) == Tile::calmWater_Id && level->getData(xp, y, zp - 1) < 7)) hadWater = true; + if (hadWater || (level->getTile(xp, y, zp + 1) == Tile::calmWater_Id && level->getData(xp, y, zp + 1) < 7)) hadWater = true; + if (hadWater) { - for (int x2 = -5; x2 <= 5; x2++) + for (int x2 = -5; x2 <= 5; x2++) { - for (int z2 = -5; z2 <= 5; z2++) + for (int z2 = -5; z2 <= 5; z2++) { - int d = (x2 > 0 ? x2 : -x2) + (z2 > 0 ? z2 : -z2); + int d = (x2 > 0 ? x2 : -x2) + (z2 > 0 ? z2 : -z2); - if (d <= 5) + if (d <= 5) { - d = 6 - d; - if (level->getTile(xp + x2, y, zp + z2) == Tile::calmWater_Id) + d = 6 - d; + if (level->getTile(xp + x2, y, zp + z2) == Tile::calmWater_Id) { - int od = level->getData(xp + x2, y, zp + z2); - if (od < 7 && od < d) + int od = level->getData(xp + x2, y, zp + z2); + if (od < 7 && od < d) { - level->setData(xp + x2, y, zp + z2, d); - } - } - } - } - } - if (hadWater) + level->setData(xp + x2, y, zp + z2, d, Tile::UPDATE_ALL); + } + } + } + } + } + if (hadWater) { - level->setTileAndDataNoUpdate(xp, y, zp, Tile::calmWater_Id, 7); - for (int y2 = 0; y2 < y; y2++) + level->setTileAndData(xp, y, zp, Tile::calmWater_Id, 7, Tile::UPDATE_CLIENTS); + for (int y2 = 0; y2 < y; y2++) { - level->setTileAndDataNoUpdate(xp, y2, zp, Tile::calmWater_Id, 8); - } - } - } - } - } - } - } + level->setTileAndData(xp, y2, zp, Tile::calmWater_Id, 8, Tile::UPDATE_CLIENTS); + } + } + } + } + } + } + } } // 4J - changed this to used pprandom rather than random, so that we can run it concurrently with getChunk void RandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) { - HeavyTile::instaFall = true; - int xo = xt * 16; - int zo = zt * 16; + HeavyTile::instaFall = true; + int xo = xt * 16; + int zo = zt * 16; - Biome *biome = level->getBiome(xo + 16, zo + 16); + Biome *biome = level->getBiome(xo + 16, zo + 16); - if (RandomLevelSource::FLOATING_ISLANDS) + if (FLOATING_ISLANDS) { - calcWaterDepths(parent, xt, zt); - } + calcWaterDepths(parent, xt, zt); + } pprandom->setSeed(level->getSeed()); __int64 xScale = pprandom->nextLong() / 2 * 2 + 1; @@ -669,15 +783,17 @@ void RandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Lakes"); - if (!hasVillage && pprandom->nextInt(4) == 0) + if (biome != Biome::desert && biome != Biome::desertHills) { - int x = xo + pprandom->nextInt(16) + 8; - int y = pprandom->nextInt(Level::genDepth); - int z = zo + pprandom->nextInt(16) + 8; + if (!hasVillage && pprandom->nextInt(4) == 0) + { + int x = xo + pprandom->nextInt(16) + 8; + int y = pprandom->nextInt(Level::genDepth); + int z = zo + pprandom->nextInt(16) + 8; - LakeFeature *calmWater = new LakeFeature(Tile::calmWater_Id); - calmWater->place(level, pprandom, x, y, z); - delete calmWater; + LakeFeature calmWater(Tile::calmWater_Id); + calmWater.place(level, pprandom, x, y, z); + } } PIXEndNamedEvent(); @@ -689,55 +805,58 @@ void RandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) int z = zo + pprandom->nextInt(16) + 8; if (y < level->seaLevel || pprandom->nextInt(10) == 0) { - LakeFeature *calmLava = new LakeFeature(Tile::calmLava_Id); - calmLava->place(level, pprandom, x, y, z); - delete calmLava; + LakeFeature calmLava(Tile::calmLava_Id); + calmLava.place(level, pprandom, x, y, z); } } PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Monster rooms"); - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 8; i++) + { int x = xo + pprandom->nextInt(16) + 8; int y = pprandom->nextInt(Level::genDepth); int z = zo + pprandom->nextInt(16) + 8; - MonsterRoomFeature *mrf = new MonsterRoomFeature(); - if (mrf->place(level, pprandom, x, y, z)) - { - } - delete mrf; + MonsterRoomFeature mrf; + mrf.place(level, pprandom, x, y, z); } PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Biome decorate"); biome->decorate(level, pprandom, xo, zo); PIXEndNamedEvent(); - + + PIXBeginNamedEvent(0,"Process Schematics"); app.processSchematics(parent->getChunk(xt,zt)); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Post process mobs"); MobSpawner::postProcessSpawnMobs(level, biome, xo + 8, zo + 8, 16, 16, pprandom); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Update ice and snow"); // 4J - brought forward from 1.2.3 to get snow back in taiga biomes - xo += 8; - zo += 8; - for (int x = 0; x < 16; x++) + xo += 8; + zo += 8; + for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) + for (int z = 0; z < 16; z++) { - int y = level->getTopRainBlock(xo + x, zo + z); + int y = level->getTopRainBlock(xo + x, zo + z); - if (level->shouldFreezeIgnoreNeighbors(x + xo, y - 1, z + zo)) + if (level->shouldFreezeIgnoreNeighbors(x + xo, y - 1, z + zo)) { - level->setTileNoUpdate(x + xo, y - 1, z + zo, Tile::ice_Id); // 4J - changed from setTile, otherwise we end up creating a *lot* of dynamic water tiles as these ice tiles are set - } - if (level->shouldSnow(x + xo, y, z + zo)) + level->setTileAndData(x + xo, y - 1, z + zo, Tile::ice_Id, 0, Tile::UPDATE_CLIENTS); + } + if (level->shouldSnow(x + xo, y, z + zo)) { - level->setTile(x + xo, y, z + zo, Tile::topSnow_Id); - } - } - } + level->setTileAndData(x + xo, y, z + zo, Tile::topSnow_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } + PIXEndNamedEvent(); - HeavyTile::instaFall = false; + HeavyTile::instaFall = false; } bool RandomLevelSource::save(bool force, ProgressListener *progressListener) @@ -762,19 +881,34 @@ wstring RandomLevelSource::gatherStats() vector *RandomLevelSource::getMobsAt(MobCategory *mobCategory, int x, int y, int z) { - Biome *biome = level->getBiome(x, z); - if (biome == NULL) + Biome *biome = level->getBiome(x, z); + if (biome == NULL) { - return NULL; - } - return biome->getMobs(mobCategory); + return NULL; + } + if (mobCategory == MobCategory::monster && scatteredFeature->isSwamphut(x, y, z)) + { + return scatteredFeature->getSwamphutEnemies(); + } + return biome->getMobs(mobCategory); } TilePos *RandomLevelSource::findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z) { - if (LargeFeature::STRONGHOLD == featureName && strongholdFeature != NULL) + if (LargeFeature::STRONGHOLD == featureName && strongholdFeature != NULL) { - return strongholdFeature->getNearestGeneratedFeature(level, x, y, z); - } - return NULL; + return strongholdFeature->getNearestGeneratedFeature(level, x, y, z); + } + return NULL; } + +void RandomLevelSource::recreateLogicStructuresForChunk(int chunkX, int chunkZ) +{ + if (generateStructures) + { + mineShaftFeature->apply(this, level, chunkX, chunkZ, NULL); + villageFeature->apply(this, level, chunkX, chunkZ, NULL); + strongholdFeature->apply(this, level, chunkX, chunkZ, NULL); + scatteredFeature->apply(this, level, chunkX, chunkZ, NULL); + } +} \ No newline at end of file diff --git a/Minecraft.World/RandomLevelSource.h b/Minecraft.World/RandomLevelSource.h index d71028b1..740a9db2 100644 --- a/Minecraft.World/RandomLevelSource.h +++ b/Minecraft.World/RandomLevelSource.h @@ -14,31 +14,31 @@ class RandomScatteredLargeFeature; class RandomLevelSource : public ChunkSource { public: - static const double SNOW_CUTOFF; - static const double SNOW_SCALE; - static const bool FLOATING_ISLANDS = false; - static const int CHUNK_HEIGHT = 8; - static const int CHUNK_WIDTH = 4; + static const double SNOW_CUTOFF; + static const double SNOW_SCALE; + static const bool FLOATING_ISLANDS = false; + static const int CHUNK_HEIGHT = 8; + static const int CHUNK_WIDTH = 4; private: - Random *random; + Random *random; Random *pprandom; // 4J - added - PerlinNoise *lperlinNoise1; - PerlinNoise *lperlinNoise2; - PerlinNoise *perlinNoise1; - PerlinNoise *perlinNoise3; + PerlinNoise *lperlinNoise1; + PerlinNoise *lperlinNoise2; + PerlinNoise *perlinNoise1; + PerlinNoise *perlinNoise3; public: - PerlinNoise *scaleNoise; - PerlinNoise *depthNoise; + PerlinNoise *scaleNoise; + PerlinNoise *depthNoise; private: - PerlinNoise *floatingIslandScale; - PerlinNoise *floatingIslandNoise; + PerlinNoise *floatingIslandScale; + PerlinNoise *floatingIslandNoise; public: - PerlinNoise *forestNoise; + PerlinNoise *forestNoise; private: Level *level; @@ -51,10 +51,15 @@ public: ~RandomLevelSource(); public: +#ifdef _LARGE_WORLDS + int getMinDistanceToEdge(int xxx, int zzz, int worldSize, float falloffStart); + +#endif + float getHeightFalloff(int xxx, int zzz, int* pEMin); void prepareHeights(int xOffs, int zOffs, byteArray blocks); public: - void buildSurfaces(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes); + void buildSurfaces(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes); private: LargeFeature *caveFeature; @@ -64,10 +69,10 @@ private: RandomScatteredLargeFeature *scatteredFeature; LargeFeature *canyonFeature; private: - virtual LevelChunk *create(int x, int z); + virtual LevelChunk *create(int x, int z); public: - virtual LevelChunk *getChunk(int xOffs, int zOffs); + virtual LevelChunk *getChunk(int xOffs, int zOffs); virtual void lightChunk(LevelChunk *lc); // 4J added private: @@ -80,13 +85,14 @@ private: void calcWaterDepths(ChunkSource *parent, int xt, int zt); public: - virtual void postProcess(ChunkSource *parent, int xt, int zt); - virtual bool save(bool force, ProgressListener *progressListener); - virtual bool tick(); - virtual bool shouldSave(); - virtual wstring gatherStats(); + virtual void postProcess(ChunkSource *parent, int xt, int zt); + virtual bool save(bool force, ProgressListener *progressListener); + virtual bool tick(); + virtual bool shouldSave(); + virtual wstring gatherStats(); public: virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z); - virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ); }; diff --git a/Minecraft.World/RandomScatteredLargeFeature.cpp b/Minecraft.World/RandomScatteredLargeFeature.cpp index d460dc14..2a2290e3 100644 --- a/Minecraft.World/RandomScatteredLargeFeature.cpp +++ b/Minecraft.World/RandomScatteredLargeFeature.cpp @@ -1,9 +1,11 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "ScatteredFeaturePieces.h" #include "RandomScatteredLargeFeature.h" +const wstring RandomScatteredLargeFeature::OPTION_SPACING = L"distance"; vector RandomScatteredLargeFeature::allowedBiomes; void RandomScatteredLargeFeature::staticCtor() @@ -11,29 +13,55 @@ void RandomScatteredLargeFeature::staticCtor() allowedBiomes.push_back( Biome::desert ); allowedBiomes.push_back( Biome::desertHills ); allowedBiomes.push_back( Biome::jungle ); + allowedBiomes.push_back( Biome::jungleHills ); + allowedBiomes.push_back( Biome::swampland ); +} + +void RandomScatteredLargeFeature::_init() +{ + spacing = 32; + minSeparation = 8; + + swamphutEnemies.push_back(new Biome::MobSpawnerData(eTYPE_WITCH, 1, 1, 1)); } RandomScatteredLargeFeature::RandomScatteredLargeFeature() { + _init(); } -bool RandomScatteredLargeFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) +RandomScatteredLargeFeature::RandomScatteredLargeFeature(unordered_map options) { - int featureSpacing = 32; - int minFeatureSeparation = 8; + _init(); + for(AUTO_VAR(it, options.begin()); it != options.end(); ++it) + { + if (it->first.compare(OPTION_SPACING) == 0) + { + spacing = Mth::getInt(it->second, spacing, minSeparation + 1); + } + } +} + +wstring RandomScatteredLargeFeature::getFeatureName() +{ + return L"Temple"; +} + +bool RandomScatteredLargeFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) +{ int xx = x; int zz = z; - if (x < 0) x -= featureSpacing - 1; - if (z < 0) z -= featureSpacing - 1; + if (x < 0) x -= spacing - 1; + if (z < 0) z -= spacing - 1; - int xCenterFeatureChunk = x / featureSpacing; - int zCenterFeatureChunk = z / featureSpacing; + int xCenterFeatureChunk = x / spacing; + int zCenterFeatureChunk = z / spacing; Random *r = level->getRandomFor(xCenterFeatureChunk, zCenterFeatureChunk, 14357617); - xCenterFeatureChunk *= featureSpacing; - zCenterFeatureChunk *= featureSpacing; - xCenterFeatureChunk += r->nextInt(featureSpacing - minFeatureSeparation); - zCenterFeatureChunk += r->nextInt(featureSpacing - minFeatureSeparation); + xCenterFeatureChunk *= spacing; + zCenterFeatureChunk *= spacing; + xCenterFeatureChunk += r->nextInt(spacing - minSeparation); + zCenterFeatureChunk += r->nextInt(spacing - minSeparation); x = xx; z = zz; @@ -46,11 +74,14 @@ bool RandomScatteredLargeFeature::isFeatureChunk(int x, int z, bool bIsSuperflat if (forcePlacement || (x == xCenterFeatureChunk && z == zCenterFeatureChunk)) { - bool biomeOk = level->getBiomeSource()->containsOnly(x * 16 + 8, z * 16 + 8, 0, allowedBiomes); - if (biomeOk) + Biome *biome = level->getBiomeSource()->getBiome(x * 16 + 8, z * 16 + 8); + for (AUTO_VAR(it,allowedBiomes.begin()); it != allowedBiomes.end(); ++it) { - // System.out.println("feature at " + (x * 16) + " " + (z * 16)); - return true; + Biome *a = *it; + if (biome == a) + { + return true; + } } } @@ -60,25 +91,50 @@ bool RandomScatteredLargeFeature::isFeatureChunk(int x, int z, bool bIsSuperflat StructureStart *RandomScatteredLargeFeature::createStructureStart(int x, int z) { - // System.out.println("feature at " + (x * 16) + " " + (z * 16)); return new ScatteredFeatureStart(level, random, x, z); } +RandomScatteredLargeFeature::ScatteredFeatureStart::ScatteredFeatureStart() +{ + // for reflection +} -RandomScatteredLargeFeature::ScatteredFeatureStart::ScatteredFeatureStart(Level *level, Random *random, int chunkX, int chunkZ) +RandomScatteredLargeFeature::ScatteredFeatureStart::ScatteredFeatureStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart(chunkX, chunkZ) { - if (level->getBiome(chunkX * 16 + 8, chunkZ * 16 + 8) == Biome::jungle) + Biome *biome = level->getBiome(chunkX * 16 + 8, chunkZ * 16 + 8); + if (biome == Biome::jungle || biome == Biome::jungleHills) { ScatteredFeaturePieces::JunglePyramidPiece *startRoom = new ScatteredFeaturePieces::JunglePyramidPiece(random, chunkX * 16, chunkZ * 16); pieces.push_back(startRoom); - // System.out.println("jungle feature at " + (chunkX * 16) + " " + (chunkZ * 16)); + } + else if (biome == Biome::swampland) + { + ScatteredFeaturePieces::SwamplandHut *startRoom = new ScatteredFeaturePieces::SwamplandHut(random, chunkX * 16, chunkZ * 16); + pieces.push_back(startRoom); } else { ScatteredFeaturePieces::DesertPyramidPiece *startRoom = new ScatteredFeaturePieces::DesertPyramidPiece(random, chunkX * 16, chunkZ * 16); pieces.push_back(startRoom); - // System.out.println("desert feature at " + (chunkX * 16) + " " + (chunkZ * 16)); } calculateBoundingBox(); +} + +bool RandomScatteredLargeFeature::isSwamphut(int cellX, int cellY, int cellZ) +{ + StructureStart *structureAt = getStructureAt(cellX, cellY, cellZ); + if (structureAt == NULL || !( dynamic_cast( structureAt ) ) || structureAt->pieces.empty()) + { + return false; + } + StructurePiece *first = NULL; + AUTO_VAR(it, structureAt->pieces.begin()); + if(it != structureAt->pieces.end() ) first = *it; + return dynamic_cast(first) != NULL; +} + +vector *RandomScatteredLargeFeature::getSwamphutEnemies() +{ + return &swamphutEnemies; } \ No newline at end of file diff --git a/Minecraft.World/RandomScatteredLargeFeature.h b/Minecraft.World/RandomScatteredLargeFeature.h index b7d9fc06..b5d46ce8 100644 --- a/Minecraft.World/RandomScatteredLargeFeature.h +++ b/Minecraft.World/RandomScatteredLargeFeature.h @@ -6,17 +6,41 @@ class RandomScatteredLargeFeature : public StructureFeature { public: + static const wstring OPTION_SPACING; + static void staticCtor(); static vector allowedBiomes; + +private: + vector swamphutEnemies; + int spacing; + int minSeparation; + + void _init(); + +public: RandomScatteredLargeFeature(); + RandomScatteredLargeFeature(unordered_map options); + + wstring getFeatureName(); protected: virtual bool isFeatureChunk(int x, int z, bool bIsSuperflat=false); StructureStart *createStructureStart(int x, int z); +public: class ScatteredFeatureStart : public StructureStart { public: + static StructureStart *Create() { return new ScatteredFeatureStart(); } + virtual EStructureStart GetType() { return eStructureStart_ScatteredFeatureStart; } + + public: + ScatteredFeatureStart(); ScatteredFeatureStart(Level *level, Random *random, int chunkX, int chunkZ); }; + +public: + bool isSwamphut(int cellX, int cellY, int cellZ); + vector *getSwamphutEnemies(); }; \ No newline at end of file diff --git a/Minecraft.World/RandomStrollGoal.cpp b/Minecraft.World/RandomStrollGoal.cpp index 21f3adb1..15957ab3 100644 --- a/Minecraft.World/RandomStrollGoal.cpp +++ b/Minecraft.World/RandomStrollGoal.cpp @@ -7,10 +7,10 @@ #include "SharedConstants.h" #include "RandomStrollGoal.h" -RandomStrollGoal::RandomStrollGoal(PathfinderMob *mob, float speed) +RandomStrollGoal::RandomStrollGoal(PathfinderMob *mob, double speedModifier) { this->mob = mob; - this->speed = speed; + this->speedModifier = speedModifier; setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); } @@ -56,5 +56,5 @@ bool RandomStrollGoal::canContinueToUse() void RandomStrollGoal::start() { - mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speed); + mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speedModifier); } \ No newline at end of file diff --git a/Minecraft.World/RandomStrollGoal.h b/Minecraft.World/RandomStrollGoal.h index e46a9c95..0cde8334 100644 --- a/Minecraft.World/RandomStrollGoal.h +++ b/Minecraft.World/RandomStrollGoal.h @@ -9,10 +9,10 @@ class RandomStrollGoal : public Goal private: PathfinderMob *mob; double wantedX, wantedY, wantedZ; - float speed; + double speedModifier; public: - RandomStrollGoal(PathfinderMob *mob, float speed); + RandomStrollGoal(PathfinderMob *mob, double speedModifier); virtual bool canUse(); virtual bool canContinueToUse(); diff --git a/Minecraft.World/RangedAttackGoal.cpp b/Minecraft.World/RangedAttackGoal.cpp new file mode 100644 index 00000000..2923e011 --- /dev/null +++ b/Minecraft.World/RangedAttackGoal.cpp @@ -0,0 +1,105 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.ai.sensing.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.phys.h" +#include "RangedAttackGoal.h" + +void RangedAttackGoal::_init(RangedAttackMob *rangedMob, Mob *mob, double speedModifier, int attackIntervalMin, int attackIntervalMax, float attackRadius) +{ + //if (!(mob instanceof LivingEntity)) + //{ + //throw new IllegalArgumentException("ArrowAttackGoal requires Mob implements RangedAttackMob"); + //} + rangedAttackMob = rangedMob; + this->mob = mob; + this->speedModifier = speedModifier; + this->attackIntervalMin = attackIntervalMin; + this->attackIntervalMax = attackIntervalMax; + this->attackRadius = attackRadius; + attackRadiusSqr = attackRadius * attackRadius; + setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); + + target = weak_ptr(); + attackTime = -1; + seeTime = 0; +} + +RangedAttackGoal::RangedAttackGoal(RangedAttackMob *rangedMob, Mob *mob, double speedModifier, int attackInterval, float attackRadius) +{ + _init(rangedMob, mob, speedModifier, attackInterval, attackInterval, attackRadius); +} + +RangedAttackGoal::RangedAttackGoal(RangedAttackMob *rangedMob, Mob *mob, double speedModifier, int attackIntervalMin, int attackIntervalMax, float attackRadius) +{ + _init(rangedMob, mob, speedModifier, attackIntervalMin, attackIntervalMax, attackRadius); +} + +bool RangedAttackGoal::canUse() +{ + shared_ptr bestTarget = mob->getTarget(); + if (bestTarget == NULL) return false; + target = weak_ptr(bestTarget); + return true; +} + +bool RangedAttackGoal::canContinueToUse() +{ + return canUse() || !mob->getNavigation()->isDone(); +} + +void RangedAttackGoal::stop() +{ + target = weak_ptr(); + seeTime = 0; + attackTime = -1; +} + +void RangedAttackGoal::tick() +{ + // 4J: It's possible the target has gone since canUse selected it, don't do tick if target is null + if (target.lock() == NULL) return; + + double targetDistSqr = mob->distanceToSqr(target.lock()->x, target.lock()->bb->y0, target.lock()->z); + bool canSee = mob->getSensing()->canSee(target.lock()); + + if (canSee) + { + seeTime++; + } + else + { + seeTime = 0; + } + + if (targetDistSqr > attackRadiusSqr || seeTime < 20) + { + mob->getNavigation()->moveTo(target.lock(), speedModifier); + } + else + { + mob->getNavigation()->stop(); + } + + mob->getLookControl()->setLookAt(target.lock(), 30, 30); + + if (--attackTime == 0) + { + if (targetDistSqr > attackRadiusSqr || !canSee) return; + + float dist = Mth::sqrt(targetDistSqr) / attackRadius; + float power = dist; + if (power < 0.1f) power = 0.1f; + if (power > 1) power = 1; + + rangedAttackMob->performRangedAttack(target.lock(), power); + attackTime = Mth::floor(dist * (attackIntervalMax - attackIntervalMin) + attackIntervalMin); + } + else if (attackTime < 0) + { + float dist = Mth::sqrt(targetDistSqr) / attackRadius; + attackTime = Mth::floor(dist * (attackIntervalMax - attackIntervalMin) + attackIntervalMin); + } +} \ No newline at end of file diff --git a/Minecraft.World/RangedAttackGoal.h b/Minecraft.World/RangedAttackGoal.h new file mode 100644 index 00000000..7667707b --- /dev/null +++ b/Minecraft.World/RangedAttackGoal.h @@ -0,0 +1,32 @@ +#pragma once + +#include "Goal.h" + +class RangedAttackMob; + +class RangedAttackGoal : public Goal +{ +private: + Mob *mob; // Owner + RangedAttackMob *rangedAttackMob; // owner + weak_ptr target; + int attackTime; + double speedModifier; + int seeTime; + int attackIntervalMin; + int attackIntervalMax; + float attackRadius; + float attackRadiusSqr; + + void _init(RangedAttackMob *rangedMob, Mob *mob, double speedModifier, int attackIntervalMin, int attackIntervalMax, float attackRadius); + +public: + // 4J Added extra Mob param to avoid weird type conversion problems + RangedAttackGoal(RangedAttackMob *rangedMob, Mob *mob, double speedModifier, int attackInterval, float attackRadius); + RangedAttackGoal(RangedAttackMob *rangedMob, Mob *mob, double speedModifier, int attackIntervalMin, int attackIntervalMax, float attackRadius); + + bool canUse(); + bool canContinueToUse(); + void stop(); + void tick(); +}; \ No newline at end of file diff --git a/Minecraft.World/RangedAttackMob.h b/Minecraft.World/RangedAttackMob.h new file mode 100644 index 00000000..8a9f67ef --- /dev/null +++ b/Minecraft.World/RangedAttackMob.h @@ -0,0 +1,7 @@ +#pragma once + +class RangedAttackMob +{ +public: + virtual void performRangedAttack(shared_ptr target, float power) = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/RangedAttribute.cpp b/Minecraft.World/RangedAttribute.cpp new file mode 100644 index 00000000..d61d77ce --- /dev/null +++ b/Minecraft.World/RangedAttribute.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" + +#include "RangedAttribute.h" + +RangedAttribute::RangedAttribute(eATTRIBUTE_ID id, double defaultValue, double minValue, double maxValue) : BaseAttribute(id, defaultValue) +{ + this->minValue = minValue; + this->maxValue = maxValue; + + //if (minValue > maxValue) throw new IllegalArgumentException("Minimum value cannot be bigger than maximum value!"); + //if (defaultValue < minValue) throw new IllegalArgumentException("Default value cannot be lower than minimum value!"); + //if (defaultValue > maxValue) throw new IllegalArgumentException("Default value cannot be bigger than maximum value!"); +} + +double RangedAttribute::getMinValue() +{ + return minValue; +} + +double RangedAttribute::getMaxValue() +{ + return maxValue; +} + +double RangedAttribute::sanitizeValue(double value) +{ + if (value < minValue) value = minValue; + if (value > maxValue) value = maxValue; + + return value; +} \ No newline at end of file diff --git a/Minecraft.World/RangedAttribute.h b/Minecraft.World/RangedAttribute.h new file mode 100644 index 00000000..f2c59324 --- /dev/null +++ b/Minecraft.World/RangedAttribute.h @@ -0,0 +1,21 @@ +#pragma once + +#include "BaseAttribute.h" + +class RangedAttribute : public BaseAttribute +{ +private: + double minValue; + double maxValue; + +public: + RangedAttribute(eATTRIBUTE_ID id, double defaultValue, double minValue, double maxValue); + + double getMinValue(); + double getMaxValue(); + double sanitizeValue(double value); + + // 4J: Removed legacy name + //RangedAttribute *importLegacyName(const wstring &name); + //wstring getImportLegacyName(); +}; \ No newline at end of file diff --git a/Minecraft.World/Recipes.cpp b/Minecraft.World/Recipes.cpp index 93be1dfb..dbb1dbde 100644 --- a/Minecraft.World/Recipes.cpp +++ b/Minecraft.World/Recipes.cpp @@ -1,19 +1,3 @@ -/*package net.minecraft.world.Item::crafting; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.minecraft.world.inventory.CraftingContainer; -import net.minecraft.world.Item::CoalItem; -import net.minecraft.world.Item::Item; -import net.minecraft.world.Item::ItemInstance; -import net.minecraft.world.level.Tile::StoneSlabTile; -import net.minecraft.world.level.Tile::Tile;*/ - #include "stdafx.h" #include "Container.h" #include "AbstractContainerMenu.h" @@ -32,6 +16,7 @@ OreRecipies *Recipes::pOreRecipies=NULL; StructureRecipies *Recipes::pStructureRecipies=NULL; ToolRecipies *Recipes::pToolRecipies=NULL; WeaponRecipies *Recipes::pWeaponRecipies=NULL; +FireworksRecipe *Recipes::pFireworksRecipes=NULL; void Recipes::staticCtor() { @@ -60,6 +45,11 @@ Recipes::Recipes() // 4J Stu - These just don't work with our crafting menu //recipies->push_back(new ArmorDyeRecipe()); + //recipies->add(new MapCloningRecipe()); + //recipies->add(new MapExtendingRecipe()); + //recipies->add(new FireworksRecipe()); + pFireworksRecipes = new FireworksRecipe(); + addShapedRecipy(new ItemInstance(Tile::wood, 4, 0), // L"sczg", @@ -109,7 +99,7 @@ Recipes::Recipes() L"ssctctg", L"###", // L"XXX", // - L'#', Tile::cloth, L'X', Tile::wood, + L'#', Tile::wool, L'X', Tile::wood, L'S'); addShapedRecipy(new ItemInstance(Tile::enchantTable, 1), // @@ -177,7 +167,7 @@ Recipes::Recipes() L"###", // L"###", // - L'#', Tile::stoneBrick, + L'#', Tile::cobblestone, L'S'); addShapedRecipy(new ItemInstance(Tile::cobbleWall, 6, WallTile::TYPE_MOSSY), // @@ -185,7 +175,7 @@ Recipes::Recipes() L"###", // L"###", // - L'#', Tile::mossStone, + L'#', Tile::mossyCobblestone, L'S'); addShapedRecipy(new ItemInstance(Item::door_wood, 1), // @@ -228,7 +218,7 @@ Recipes::Recipes() L"## ", // L"###", // - L'#', Tile::stoneBrick, + L'#', Tile::cobblestone, L'S'); addShapedRecipy(new ItemInstance(Tile::stairs_bricks, 4), // @@ -246,7 +236,7 @@ Recipes::Recipes() L"## ", // L"###", // - L'#', Tile::stoneBrickSmooth, + L'#', Tile::cobblestone, L'S'); addShapedRecipy(new ItemInstance(Tile::stairs_netherBricks, 4), // @@ -317,6 +307,13 @@ Recipes::Recipes() L'#', Item::snowBall, L'S'); + addShapedRecipy(new ItemInstance(Tile::topSnow, 6), // + L"sctg", + L"###", // + + L'#', Tile::snow, + L'S'); + addShapedRecipy(new ItemInstance(Tile::clay, 1), // L"sscig", L"##", // @@ -333,7 +330,7 @@ Recipes::Recipes() L'#', Item::brick, L'S'); - addShapedRecipy(new ItemInstance(Tile::cloth, 1), // + addShapedRecipy(new ItemInstance(Tile::wool, 1), // L"sscig", L"##", // L"##", // @@ -347,7 +344,7 @@ Recipes::Recipes() L"#X#", // L"X#X", // - L'X', Item::sulphur,// + L'X', Item::gunpowder,// L'#', Tile::sand, L'T'); @@ -362,13 +359,13 @@ Recipes::Recipes() L"sctg", L"###", // - L'#', Tile::rock, + L'#', Tile::stone, L'S'); addShapedRecipy(new ItemInstance(Tile::stoneSlabHalf, 6, StoneSlabTile::COBBLESTONE_SLAB), // L"sctg", L"###", // - L'#', Tile::stoneBrick, + L'#', Tile::cobblestone, L'S'); addShapedRecipy(new ItemInstance(Tile::stoneSlabHalf, 6, StoneSlabTile::BRICK_SLAB), // @@ -382,7 +379,7 @@ Recipes::Recipes() L"sctg", L"###", // - L'#', Tile::stoneBrickSmooth, + L'#', Tile::stoneBrick, L'S'); addShapedRecipy(new ItemInstance(Tile::stoneSlabHalf, 6, StoneSlabTile::NETHERBRICK_SLAB), // @@ -441,7 +438,7 @@ Recipes::Recipes() L"BEB", // L"CCC", // - L'A', Item::milk,// + L'A', Item::bucket_milk,// L'B', Item::sugar,// L'C', Item::wheat, L'E', Item::egg, L'F'); @@ -474,6 +471,17 @@ Recipes::Recipes() L'#', Item::stick, L'V'); + addShapedRecipy(new ItemInstance(Tile::activatorRail, 6), // + L"ssscictcig", + L"XSX", // + L"X#X", // + L"XSX", // + + L'X', Item::ironIngot,// + L'#', Tile::redstoneTorch_on,// + L'S', Item::stick, + L'V'); + addShapedRecipy(new ItemInstance(Tile::detectorRail, 6), // L"ssscicictg", L"X X", // @@ -509,6 +517,22 @@ Recipes::Recipes() L'A', Tile::furnace, L'B', Item::minecart, L'V'); + addShapedRecipy(new ItemInstance(Item::minecart_tnt, 1), // + L"ssctcig", + L"A", // + L"B", // + + L'A', Tile::tnt, L'B', Item::minecart, + L'V'); + + addShapedRecipy(new ItemInstance(Item::minecart_hopper, 1), // + L"ssctcig", + L"A", // + L"B", // + + L'A', Tile::hopper, L'B', Item::minecart, + L'V'); + addShapedRecipy(new ItemInstance(Item::boat, 1), // L"ssctg", L"# #", // @@ -616,14 +640,14 @@ Recipes::Recipes() L'T'); addShapedRecipy(new ItemInstance(Tile::torch, 4), // - L"sscicig", + L"ssczcig", L"X", // L"#", // - L'X', Item::coal,// + L'X', new ItemInstance(Item::coal, 1, CoalItem::STONE_COAL),// L'#', Item::stick, L'T'); - addShapedRecipy(new ItemInstance(Tile::lightGem, 1), // + addShapedRecipy(new ItemInstance(Tile::glowstone, 1), // L"sscig", L"##", // L"##", // @@ -644,7 +668,7 @@ Recipes::Recipes() L"X", // L"#", // - L'#', Tile::stoneBrick, L'X', Item::stick, + L'#', Tile::cobblestone, L'X', Item::stick, L'M'); addShapedRecipy(new ItemInstance(Tile::tripWireSource, 2), // @@ -656,7 +680,7 @@ Recipes::Recipes() L'#', Tile::wood, L'S', Item::stick, L'I', Item::ironIngot, L'M'); - addShapedRecipy(new ItemInstance(Tile::notGate_on, 1), // + addShapedRecipy(new ItemInstance(Tile::redstoneTorch_on, 1), // L"sscicig", L"X", // L"#", // @@ -664,14 +688,40 @@ Recipes::Recipes() L'#', Item::stick, L'X', Item::redStone, L'M'); - addShapedRecipy(new ItemInstance(Item::diode, 1), // + addShapedRecipy(new ItemInstance(Item::repeater, 1), // L"ssctcictg", L"#X#", // L"III", // - L'#', Tile::notGate_on, L'X', Item::redStone, L'I', Tile::rock, + L'#', Tile::redstoneTorch_on, L'X', Item::redStone, L'I', Tile::stone, L'M'); + addShapedRecipy(new ItemInstance(Item::comparator, 1), // + L"sssctcictg", + L" # ", // + L"#X#", // + L"III", // + + L'#', Tile::redstoneTorch_on, L'X', Item::netherQuartz, L'I', Tile::stone, + L'M'); + + addShapedRecipy(new ItemInstance(Tile::daylightDetector), + L"sssctcictg", + L"GGG", + L"QQQ", + L"WWW", + + L'G', Tile::glass, L'Q', Item::netherQuartz, L'W', Tile::woodSlabHalf, + L'M'); + + addShapedRecipy(new ItemInstance(Tile::hopper), + L"ssscictg", + L"I I", // + L"ICI", // + L" I ", // + + L'I', Item::ironIngot, L'C', Tile::chest, + L'M'); addShapedRecipy(new ItemInstance(Item::clock, 1), // L"ssscicig", @@ -688,12 +738,21 @@ Recipes::Recipes() addShapelessRecipy(new ItemInstance(Item::fireball, 3), // L"iiig", - Item::sulphur, Item::blazePowder,Item::coal, + Item::gunpowder, Item::blazePowder,Item::coal, L'T'); addShapelessRecipy(new ItemInstance(Item::fireball, 3), // L"iizg", - Item::sulphur, Item::blazePowder,new ItemInstance(Item::coal, 1, CoalItem::CHAR_COAL), + Item::gunpowder, Item::blazePowder,new ItemInstance(Item::coal, 1, CoalItem::CHAR_COAL), + L'T'); + + addShapedRecipy(new ItemInstance(Item::lead, 2), // + L"ssscicig", + L"~~ ", // + L"~O ", // + L" ~", // + + L'~', Item::string, L'O', Item::slimeBall, L'T'); @@ -706,7 +765,6 @@ Recipes::Recipes() L'#', Item::ironIngot, L'X', Item::redStone, L'T'); - // 4J-PB Added a MapItem init addShapedRecipy(new ItemInstance(Item::map, 1), // L"ssscicig", L"###", // @@ -719,14 +777,14 @@ Recipes::Recipes() addShapedRecipy(new ItemInstance(Tile::button, 1), // L"sctg", L"#", // - //L"#", // - L'#', Tile::rock, + + L'#', Tile::stone, L'M'); addShapedRecipy(new ItemInstance(Tile::button_wood, 1), // L"sctg", L"#", // - //L"#", // + L'#', Tile::wood, L'M'); @@ -739,16 +797,38 @@ Recipes::Recipes() addShapedRecipy(new ItemInstance(Tile::pressurePlate_stone, 1), // L"sctg", L"##", // - L'#', Tile::rock, + L'#', Tile::stone, L'M'); + addShapedRecipy(new ItemInstance(Tile::weightedPlate_heavy, 1), // + L"scig", + L"##", // + + L'#', Item::ironIngot, + L'M'); + + addShapedRecipy(new ItemInstance(Tile::weightedPlate_light, 1), // + L"scig", + L"##", // + + L'#', Item::goldIngot, + L'M'); addShapedRecipy(new ItemInstance(Tile::dispenser, 1), // L"sssctcicig", L"###", // L"#X#", // L"#R#", // - L'#', Tile::stoneBrick, L'X', Item::bow, L'R', Item::redStone, + L'#', Tile::cobblestone, L'X', Item::bow, L'R', Item::redStone, + L'M'); + + addShapedRecipy(new ItemInstance(Tile::dropper, 1), // + L"sssctcig", + L"###", // + L"# #", // + L"#R#", // + + L'#', Tile::cobblestone, L'R', Item::redStone, L'M'); addShapedRecipy(new ItemInstance(Item::cauldron, 1), // @@ -765,7 +845,7 @@ Recipes::Recipes() L" B ", // L"###", // - L'#', Tile::stoneBrick, L'B', Item::blazeRod, + L'#', Tile::cobblestone, L'B', Item::blazeRod, L'S'); @@ -778,7 +858,7 @@ Recipes::Recipes() L'T'); - addShapedRecipy(new ItemInstance(Tile::recordPlayer, 1), // + addShapedRecipy(new ItemInstance(Tile::jukebox, 1), // L"sssctcig", L"###", // L"#X#", // @@ -787,8 +867,6 @@ Recipes::Recipes() L'#', Tile::wood, L'X', Item::diamond, 'D'); - - addShapedRecipy(new ItemInstance(Item::paper, 3), // L"scig", L"###", // @@ -807,7 +885,7 @@ Recipes::Recipes() //addShapelessRecipy(new ItemInstance(Item.writingBook, 1), // // Item.book, new ItemInstance(Item.dye_powder, 1, DyePowderItem.BLACK), Item.feather); - addShapedRecipy(new ItemInstance(Tile::musicBlock, 1), // + addShapedRecipy(new ItemInstance(Tile::noteblock, 1), // L"sssctcig", L"###", // L"#X#", // @@ -831,7 +909,7 @@ Recipes::Recipes() L"#X#", // L"###", // - L'#', Item::stick, L'X', Tile::cloth, + L'#', Item::stick, L'X', Tile::wool, L'D'); @@ -878,7 +956,7 @@ Recipes::Recipes() L"#X#", // L"#R#", // - L'#', Tile::stoneBrick, L'X', Item::ironIngot, L'R', Item::redStone, L'T', Tile::wood, + L'#', Tile::cobblestone, L'X', Item::ironIngot, L'R', Item::redStone, L'T', Tile::wood, L'M'); addShapedRecipy(new ItemInstance((Tile *)Tile::pistonStickyBase, 1), // @@ -890,6 +968,30 @@ Recipes::Recipes() L'M'); + // 4J Stu - Added some dummy firework recipes to allow us to navigate forward to the fireworks scene + addShapedRecipy(new ItemInstance(Item::fireworks, 1), // + L"sscicig", + L" P ", // + L" G ", // + + L'P', Item::paper, L'G', Item::gunpowder, + L'D'); + + addShapedRecipy(new ItemInstance(Item::fireworksCharge,1), // + L"sscicig", + L" D ", // + L" G ", // + + L'D', Item::dye_powder, L'G', Item::gunpowder, + L'D'); + + addShapedRecipy(new ItemInstance(Item::fireworksCharge,1), // + L"sscicig", + L" D ", // + L" C ", // + + L'D', Item::dye_powder, L'C', Item::fireworksCharge, + L'D'); // Sort so the largest recipes get checked first! @@ -1005,7 +1107,7 @@ ShapedRecipy *Recipes::addShapedRecipy(ItemInstance *result, ...) break; case L'i': pItem=va_arg(vl,Item *); - pItemInstance= new ItemInstance(pItem); + pItemInstance= new ItemInstance(pItem,1,ANY_AUX_VALUE); mappings->insert(myMap::value_type(wchFrom,pItemInstance)); break; case L't': @@ -1146,7 +1248,7 @@ void Recipes::addShapelessRecipy(ItemInstance *result,... ) recipies->push_back(new ShapelessRecipy(result, ingredients, group)); } -shared_ptr Recipes::getItemFor(shared_ptr craftSlots, Level *level) +shared_ptr Recipes::getItemFor(shared_ptr craftSlots, Level *level, Recipy *recipesClass /*= NULL*/) { int count = 0; shared_ptr first = nullptr; @@ -1173,11 +1275,18 @@ shared_ptr Recipes::getItemFor(shared_ptr craft return shared_ptr( new ItemInstance(first->id, 1, resultDamage) ); } - AUTO_VAR(itEnd, recipies->end()); - for (AUTO_VAR(it, recipies->begin()); it != itEnd; it++) + if(recipesClass != NULL) + { + if (recipesClass->matches(craftSlots, level)) return recipesClass->assemble(craftSlots); + } + else { - Recipy *r = *it; //recipies->at(i); - if (r->matches(craftSlots, level)) return r->assemble(craftSlots); + AUTO_VAR(itEnd, recipies->end()); + for (AUTO_VAR(it, recipies->begin()); it != itEnd; it++) + { + Recipy *r = *it; //recipies->at(i); + if (r->matches(craftSlots, level)) return r->assemble(craftSlots); + } } return nullptr; } diff --git a/Minecraft.World/Recipes.h b/Minecraft.World/Recipes.h index c5d091e1..aacdac30 100644 --- a/Minecraft.World/Recipes.h +++ b/Minecraft.World/Recipes.h @@ -31,6 +31,7 @@ class StructureRecipies; class ToolRecipies; class WeaponRecipies; class ShapedRecipy; +class FireworksRecipe; typedef unordered_map myMap; @@ -89,7 +90,7 @@ public: ShapedRecipy *addShapedRecipy(ItemInstance *, ... ); void addShapelessRecipy(ItemInstance *result,... ); - shared_ptr getItemFor(shared_ptr craftSlots, Level *level); + shared_ptr getItemFor(shared_ptr craftSlots, Level *level, Recipy *recipesClass = NULL); // 4J Added recipesClass param vector *getRecipies(); // 4J-PB - Added all below for new Xbox 'crafting' @@ -100,7 +101,7 @@ private: void buildRecipeIngredientsArray(); Recipy::INGREDIENTS_REQUIRED *m_pRecipeIngredientsRequired; - +public: static ToolRecipies *pToolRecipies; static WeaponRecipies *pWeaponRecipies; static StructureRecipies *pStructureRecipies; @@ -108,4 +109,5 @@ private: static FoodRecipies *pFoodRecipies; static ClothDyeRecipes *pClothDyeRecipes; static ArmorRecipes *pArmorRecipes; + static FireworksRecipe *pFireworksRecipes; }; diff --git a/Minecraft.World/RecordingItem.cpp b/Minecraft.World/RecordingItem.cpp index 24be1190..3b501899 100644 --- a/Minecraft.World/RecordingItem.cpp +++ b/Minecraft.World/RecordingItem.cpp @@ -2,14 +2,18 @@ #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" #include "net.minecraft.world.h" #include "ItemInstance.h" #include "RecordingItem.h" #include "GenericStats.h" +unordered_map RecordingItem::BY_NAME; + RecordingItem::RecordingItem(int id, const wstring& recording) : Item(id), recording( recording ) { this->maxStackSize = 1; + BY_NAME[recording] = this; } Icon *RecordingItem::getIcon(int auxValue) @@ -20,13 +24,13 @@ Icon *RecordingItem::getIcon(int auxValue) bool RecordingItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed - if (level->getTile(x, y, z) == Tile::recordPlayer_Id && level->getData(x, y, z) == 0) + if (level->getTile(x, y, z) == Tile::jukebox_Id && level->getData(x, y, z) == 0) { if(!bTestUseOnOnly) { if (level->isClientSide) return true; - ((RecordPlayerTile *) Tile::recordPlayer)->setRecord(level, x, y, z, id); + ((JukeboxTile *) Tile::jukebox)->setRecord(level, x, y, z, itemInstance); level->levelEvent(nullptr, LevelEvent::SOUND_PLAY_RECORDING, x, y, z, id); itemInstance->count--; @@ -40,17 +44,14 @@ bool RecordingItem::useOn(shared_ptr itemInstance, shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void RecordingItem::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced) { - eMinecraftColour rarityColour = getRarity(shared_ptr())->color; - int colour = app.GetHTMLColour(rarityColour); - wchar_t formatted[256]; - - swprintf(formatted, 256, L"%ls",colour,L"C418 - ", recording.c_str()); + eMinecraftColour color = getRarity(shared_ptr())->color; - lines->push_back(formatted); + wchar_t text[256]; + swprintf(text, 256, L"%ls %ls", L"C418 -", recording.c_str()); - unformattedStrings.push_back(recording); + lines->push_back(HtmlString(text, color)); } const Rarity *RecordingItem::getRarity(shared_ptr itemInstance) @@ -62,3 +63,16 @@ void RecordingItem::registerIcons(IconRegister *iconRegister) { icon = iconRegister->registerIcon(L"record_" + recording); } + +RecordingItem *RecordingItem::getByName(const wstring &name) +{ + AUTO_VAR(it,BY_NAME.find(name)); + if(it != BY_NAME.end()) + { + return it->second; + } + else + { + return NULL; + } +} \ No newline at end of file diff --git a/Minecraft.World/RecordingItem.h b/Minecraft.World/RecordingItem.h index 9b184c6a..3a30eee5 100644 --- a/Minecraft.World/RecordingItem.h +++ b/Minecraft.World/RecordingItem.h @@ -5,19 +5,21 @@ using namespace std; class RecordingItem : public Item { +private: + static unordered_map BY_NAME; + public: const std::wstring recording; public: // 4J Stu - Was protected in Java, but the can't access it where we need RecordingItem(int id, const wstring& recording); - //@Override Icon *getIcon(int auxValue); virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); - virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced); virtual const Rarity *getRarity(shared_ptr itemInstance); - //@Override void registerIcons(IconRegister *iconRegister); + static RecordingItem *getByName(const wstring &name); }; \ No newline at end of file diff --git a/Minecraft.World/RedStoneDustTile.cpp b/Minecraft.World/RedStoneDustTile.cpp index 699cad95..0107b667 100644 --- a/Minecraft.World/RedStoneDustTile.cpp +++ b/Minecraft.World/RedStoneDustTile.cpp @@ -3,7 +3,10 @@ #include "RedStoneDustTile.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.h" +#include "net.minecraft.h" #include "Direction.h" #include "DiodeTile.h" @@ -11,10 +14,10 @@ #include "IntBuffer.h" #include "..\Minecraft.Client\Tesselator.h" -const wstring RedStoneDustTile::TEXTURE_CROSS = L"redstoneDust_cross"; -const wstring RedStoneDustTile::TEXTURE_LINE = L"redstoneDust_line"; -const wstring RedStoneDustTile::TEXTURE_CROSS_OVERLAY = L"redstoneDust_cross_overlay"; -const wstring RedStoneDustTile::TEXTURE_LINE_OVERLAY = L"redstoneDust_line_overlay"; +const wstring RedStoneDustTile::TEXTURE_CROSS = L"_cross"; +const wstring RedStoneDustTile::TEXTURE_LINE = L"_line"; +const wstring RedStoneDustTile::TEXTURE_CROSS_OVERLAY = L"_cross_overlay"; +const wstring RedStoneDustTile::TEXTURE_LINE_OVERLAY = L"_line_overlay"; RedStoneDustTile::RedStoneDustTile(int id) : Tile(id, Material::decoration,isSolidRender()) { @@ -71,13 +74,13 @@ int RedStoneDustTile::getColor(LevelSource *level, int x, int y, int z, int data bool RedStoneDustTile::mayPlace(Level *level, int x, int y, int z) { - return level->isTopSolidBlocking(x, y - 1, z) || level->getTile(x, y - 1, z) == Tile::lightGem_Id; + return level->isTopSolidBlocking(x, y - 1, z) || level->getTile(x, y - 1, z) == Tile::glowstone_Id; } void RedStoneDustTile::updatePowerStrength(Level *level, int x, int y, int z) { updatePowerStrength(level, x, y, z, x, y, z); - + vector updates = vector(toUpdate.begin(), toUpdate.end()); toUpdate.clear(); @@ -94,16 +97,19 @@ void RedStoneDustTile::updatePowerStrength(Level *level, int x, int y, int z, in int old = level->getData(x, y, z); int target = 0; - this->shouldSignal = false; - bool neighborSignal = level->hasNeighborSignal(x, y, z); - this->shouldSignal = true; + target = checkTarget(level, xFrom, yFrom, zFrom, target); + + shouldSignal = false; + int neighborSignal = level->getBestNeighborSignal(x, y, z); + shouldSignal = true; - if (neighborSignal) + if (neighborSignal > Redstone::SIGNAL_NONE && neighborSignal > target - 1) { - target = 15; + target = neighborSignal; } - else + { + int newTarget = 0; for (int i = 0; i < 4; i++) { int xt = x; @@ -113,57 +119,32 @@ void RedStoneDustTile::updatePowerStrength(Level *level, int x, int y, int z, in if (i == 2) zt--; if (i == 3) zt++; - if (xt != xFrom || y != yFrom || zt != zFrom) target = checkTarget(level, xt, y, zt, target); + if (xt != xFrom || zt != zFrom) newTarget = checkTarget(level, xt, y, zt, newTarget); if (level->isSolidBlockingTile(xt, y, zt) && !level->isSolidBlockingTile(x, y + 1, z)) { - if (xt != xFrom || y + 1 != yFrom || zt != zFrom) target = checkTarget(level, xt, y + 1, zt, target); + if ((xt != xFrom || zt != zFrom) && y >= yFrom) + newTarget = checkTarget(level, xt, y + 1, zt, newTarget); } else if (!level->isSolidBlockingTile(xt, y, zt)) { - if (xt != xFrom || y - 1 != yFrom || zt != zFrom) target = checkTarget(level, xt, y - 1, zt, target); + if ((xt != xFrom || zt != zFrom) && y <= yFrom) + newTarget = checkTarget(level, xt, y - 1, zt, newTarget); } } - if (target > 0) target--; + if (newTarget > target) target = newTarget - 1; + else if (target > 0) target--; else target = 0; + + if (neighborSignal > target - 1) + { + target = neighborSignal; + } } if (old != target) { - level->noNeighborUpdate = true; - level->setData(x, y, z, target); - level->setTilesDirty(x, y, z, x, y, z); - level->noNeighborUpdate = false; - - for (int i = 0; i < 4; i++) - { - int xt = x; - int zt = z; - int yt = y - 1; - if (i == 0) xt--; - if (i == 1) xt++; - if (i == 2) zt--; - if (i == 3) zt++; + level->setData(x, y, z, target, Tile::UPDATE_CLIENTS); - if (level->isSolidBlockingTile(xt, y, zt)) yt += 2; - - int current = 0; - current = checkTarget(level, xt, y, zt, -1); - target = level->getData(x, y, z); - if (target > 0) target--; - if (current >= 0 && current != target) - { - updatePowerStrength(level, xt, y, zt, x, y, z); - } - current = checkTarget(level, xt, yt, zt, -1); - target = level->getData(x, y, z); - if (target > 0) target--; - if (current >= 0 && current != target) - { - updatePowerStrength(level, xt, yt, zt, x, y, z); - } - } - - if (old < target || target == 0) { toUpdate.insert(TilePos(x, y, z)); toUpdate.insert(TilePos(x - 1, y, z)); @@ -185,7 +166,7 @@ void RedStoneDustTile::checkCornerChangeAt(Level *level, int x, int y, int z) level->updateNeighborsAt(x + 1, y, z, id); level->updateNeighborsAt(x, y, z - 1, id); level->updateNeighborsAt(x, y, z + 1, id); - + level->updateNeighborsAt(x, y - 1, z, id); level->updateNeighborsAt(x, y + 1, z, id); } @@ -254,7 +235,6 @@ int RedStoneDustTile::checkTarget(Level *level, int x, int y, int z, int target) void RedStoneDustTile::neighborChanged(Level *level, int x, int y, int z, int type) { if (level->isClientSide) return; - int face = level->getData(x, y, z); bool ok = mayPlace(level, x, y, z); @@ -264,8 +244,8 @@ void RedStoneDustTile::neighborChanged(Level *level, int x, int y, int z, int ty } else { - spawnResources(level, x, y, z, face, 0); - level->setTile(x, y, z, 0); + spawnResources(level, x, y, z, 0, 0); + level->removeTile(x, y, z); } Tile::neighborChanged(level, x, y, z, type); @@ -276,44 +256,48 @@ int RedStoneDustTile::getResource(int data, Random *random, int playerBonusLevel return Item::redStone->id; } -bool RedStoneDustTile::getDirectSignal(Level *level, int x, int y, int z, int dir) +int RedStoneDustTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) { - if (!shouldSignal) return false; + if (!shouldSignal) return Redstone::SIGNAL_NONE; return getSignal(level, x, y, z, dir); } -bool RedStoneDustTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +int RedStoneDustTile::getSignal(LevelSource *level, int x, int y, int z, int dir) { - if (!shouldSignal) return false; - if (level->getData(x, y, z) == 0) return false; + if (!shouldSignal) return Redstone::SIGNAL_NONE; + int data = level->getData(x, y, z); + if (data == Facing::DOWN) + { + return Redstone::SIGNAL_NONE; + } - if (dir == 1) return true; + if (dir == Facing::UP) return data; - bool w = RedStoneDustTile::shouldReceivePowerFrom(level, x - 1, y, z, Direction::WEST) - || (!level->isSolidBlockingTile(x - 1, y, z) && RedStoneDustTile::shouldReceivePowerFrom(level, x - 1, y - 1, z, Direction::UNDEFINED)); - bool e = RedStoneDustTile::shouldReceivePowerFrom(level, x + 1, y, z, Direction::EAST) - || (!level->isSolidBlockingTile(x + 1, y, z) && RedStoneDustTile::shouldReceivePowerFrom(level, x + 1, y - 1, z, Direction::UNDEFINED)); - bool n = RedStoneDustTile::shouldReceivePowerFrom(level, x, y, z - 1, Direction::NORTH) - || (!level->isSolidBlockingTile(x, y, z - 1) && RedStoneDustTile::shouldReceivePowerFrom(level, x, y - 1, z - 1, Direction::UNDEFINED)); - bool s = RedStoneDustTile::shouldReceivePowerFrom(level, x, y, z + 1, Direction::SOUTH) - || (!level->isSolidBlockingTile(x, y, z + 1) && RedStoneDustTile::shouldReceivePowerFrom(level, x, y - 1, z + 1, Direction::UNDEFINED)); + bool w = shouldReceivePowerFrom(level, x - 1, y, z, Direction::WEST) + || (!level->isSolidBlockingTile(x - 1, y, z) && shouldReceivePowerFrom(level, x - 1, y - 1, z, Direction::UNDEFINED)); + bool e = shouldReceivePowerFrom(level, x + 1, y, z, Direction::EAST) + || (!level->isSolidBlockingTile(x + 1, y, z) && shouldReceivePowerFrom(level, x + 1, y - 1, z, Direction::UNDEFINED)); + bool n = shouldReceivePowerFrom(level, x, y, z - 1, Direction::NORTH) + || (!level->isSolidBlockingTile(x, y, z - 1) && shouldReceivePowerFrom(level, x, y - 1, z - 1, Direction::UNDEFINED)); + bool s = shouldReceivePowerFrom(level, x, y, z + 1, Direction::SOUTH) + || (!level->isSolidBlockingTile(x, y, z + 1) && shouldReceivePowerFrom(level, x, y - 1, z + 1, Direction::UNDEFINED)); if (!level->isSolidBlockingTile(x, y + 1, z)) { - if (level->isSolidBlockingTile(x - 1, y, z) && RedStoneDustTile::shouldReceivePowerFrom(level, x - 1, y + 1, z, Direction::UNDEFINED)) w = true; - if (level->isSolidBlockingTile(x + 1, y, z) && RedStoneDustTile::shouldReceivePowerFrom(level, x + 1, y + 1, z, Direction::UNDEFINED)) e = true; - if (level->isSolidBlockingTile(x, y, z - 1) && RedStoneDustTile::shouldReceivePowerFrom(level, x, y + 1, z - 1, Direction::UNDEFINED)) n = true; - if (level->isSolidBlockingTile(x, y, z + 1) && RedStoneDustTile::shouldReceivePowerFrom(level, x, y + 1, z + 1, Direction::UNDEFINED)) s = true; + if (level->isSolidBlockingTile(x - 1, y, z) && shouldReceivePowerFrom(level, x - 1, y + 1, z, Direction::UNDEFINED)) w = true; + if (level->isSolidBlockingTile(x + 1, y, z) && shouldReceivePowerFrom(level, x + 1, y + 1, z, Direction::UNDEFINED)) e = true; + if (level->isSolidBlockingTile(x, y, z - 1) && shouldReceivePowerFrom(level, x, y + 1, z - 1, Direction::UNDEFINED)) n = true; + if (level->isSolidBlockingTile(x, y, z + 1) && shouldReceivePowerFrom(level, x, y + 1, z + 1, Direction::UNDEFINED)) s = true; } - if (!n && !e && !w && !s && (dir >= 2 && dir <= 5)) return true; + if (!n && !e && !w && !s && (dir >= 2 && dir <= 5)) return data; - if (dir == 2 && n && (!w && !e)) return true; - if (dir == 3 && s && (!w && !e)) return true; - if (dir == 4 && w && (!n && !s)) return true; - if (dir == 5 && e && (!n && !s)) return true; + if (dir == 2 && n && (!w && !e)) return data; + if (dir == 3 && s && (!w && !e)) return data; + if (dir == 4 && w && (!n && !s)) return data; + if (dir == 5 && e && (!n && !s)) return data; - return false; + return Redstone::SIGNAL_NONE; } @@ -374,11 +358,11 @@ bool RedStoneDustTile::shouldConnectTo(LevelSource *level, int x, int y, int z, int t = level->getTile(x, y, z); if (t == Tile::redStoneDust_Id) return true; if (t == 0) return false; - if (t == Tile::diode_off_Id || t == Tile::diode_on_Id) + if (Tile::diode_off->isSameDiode(t)) { - int data = level->getData(x, y, z); - return direction == (data & DiodeTile::DIRECTION_MASK) || direction == Direction::DIRECTION_OPPOSITE[data & DiodeTile::DIRECTION_MASK]; - } + int data = level->getData(x, y, z); + return direction == (data & DiodeTile::DIRECTION_MASK) || direction == Direction::DIRECTION_OPPOSITE[data & DiodeTile::DIRECTION_MASK]; + } else if (Tile::tiles[t]->isSignalSource() && direction != Direction::UNDEFINED) return true; return false; @@ -386,18 +370,18 @@ bool RedStoneDustTile::shouldConnectTo(LevelSource *level, int x, int y, int z, bool RedStoneDustTile::shouldReceivePowerFrom(LevelSource *level, int x, int y, int z, int direction) { - if (shouldConnectTo(level, x, y, z, direction)) + if (shouldConnectTo(level, x, y, z, direction)) { - return true; - } + return true; + } - int t = level->getTile(x, y, z); - if (t == Tile::diode_on_Id) + int t = level->getTile(x, y, z); + if (t == Tile::diode_on_Id) { - int data = level->getData(x, y, z); - return direction == (data & DiodeTile::DIRECTION_MASK); - } - return false; + int data = level->getData(x, y, z); + return direction == (data & DiodeTile::DIRECTION_MASK); + } + return false; } int RedStoneDustTile::cloneTileId(Level *level, int x, int y, int z) @@ -407,10 +391,10 @@ int RedStoneDustTile::cloneTileId(Level *level, int x, int y, int z) void RedStoneDustTile::registerIcons(IconRegister *iconRegister) { - iconCross = iconRegister->registerIcon(TEXTURE_CROSS); - iconLine = iconRegister->registerIcon(TEXTURE_LINE); - iconCrossOver = iconRegister->registerIcon(TEXTURE_CROSS_OVERLAY); - iconLineOver = iconRegister->registerIcon(TEXTURE_LINE_OVERLAY); + iconCross = iconRegister->registerIcon(getIconName() + TEXTURE_CROSS); + iconLine = iconRegister->registerIcon(getIconName() + TEXTURE_LINE); + iconCrossOver = iconRegister->registerIcon(getIconName() + TEXTURE_CROSS_OVERLAY); + iconLineOver = iconRegister->registerIcon(getIconName() + TEXTURE_LINE_OVERLAY); icon = iconCross; } diff --git a/Minecraft.World/RedStoneDustTile.h b/Minecraft.World/RedStoneDustTile.h index edb18e6d..2a647658 100644 --- a/Minecraft.World/RedStoneDustTile.h +++ b/Minecraft.World/RedStoneDustTile.h @@ -17,7 +17,7 @@ public: static const wstring TEXTURE_LINE_OVERLAY; private: bool shouldSignal; - unordered_set toUpdate; + unordered_set toUpdate; Icon *iconCross; Icon *iconLine; Icon *iconCrossOver; @@ -25,34 +25,34 @@ private: public: RedStoneDustTile(int id); - virtual void updateDefaultShape(); // 4J Added override - virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual int getRenderShape(); + virtual void updateDefaultShape(); // 4J Added override + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual int getRenderShape(); virtual int getColor() const; // 4J Added - virtual int getColor(LevelSource *level, int x, int y, int z); + virtual int getColor(LevelSource *level, int x, int y, int z); virtual int getColor(LevelSource *level, int x, int y, int z, int data); // 4J added - virtual bool mayPlace(Level *level, int x, int y, int z); + virtual bool mayPlace(Level *level, int x, int y, int z); private: void updatePowerStrength(Level *level, int x, int y, int z); - void updatePowerStrength(Level *level, int x, int y, int z, int xFrom, int yFrom, int zFrom); - void checkCornerChangeAt(Level *level, int x, int y, int z); + void updatePowerStrength(Level *level, int x, int y, int z, int xFrom, int yFrom, int zFrom); + void checkCornerChangeAt(Level *level, int x, int y, int z); public: virtual void onPlace(Level *level, int x, int y, int z); - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); private: int checkTarget(Level *level, int x, int y, int z, int target); public: virtual void neighborChanged(Level *level, int x, int y, int z, int type); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir) ; - virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); - virtual bool isSignalSource(); - virtual void animateTick(Level *level, int x, int y, int z, Random *random); + virtual bool isSignalSource(); + virtual void animateTick(Level *level, int x, int y, int z, Random *random); - static bool shouldConnectTo(LevelSource *level, int x, int y, int z, int direction); + static bool shouldConnectTo(LevelSource *level, int x, int y, int z, int direction); static bool shouldReceivePowerFrom(LevelSource *level, int x, int y, int z, int direction); virtual int cloneTileId(Level *level, int x, int y, int z); diff --git a/Minecraft.World/RedStoneItem.cpp b/Minecraft.World/RedStoneItem.cpp index 64201caa..3d8ee453 100644 --- a/Minecraft.World/RedStoneItem.cpp +++ b/Minecraft.World/RedStoneItem.cpp @@ -23,7 +23,7 @@ bool RedStoneItem::useOn(shared_ptr itemInstance, shared_ptrisEmptyTile(x, y, z)) return false; } - if (!player->mayBuild(x, y, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, itemInstance)) return false; if (Tile::redStoneDust->mayPlace(level, x, y, z)) { if(!bTestUseOnOnly) @@ -32,7 +32,7 @@ bool RedStoneItem::useOn(shared_ptr itemInstance, shared_ptrawardStat(GenericStats::blocksPlaced(Tile::redStoneDust_Id), GenericStats::param_blocksPlaced(Tile::redStoneDust_Id,itemInstance->getAuxValue(),1)); itemInstance->count--; - level->setTile(x, y, z, Tile::redStoneDust_Id); + level->setTileAndUpdate(x, y, z, Tile::redStoneDust_Id); } } diff --git a/Minecraft.World/RedStoneOreTile.cpp b/Minecraft.World/RedStoneOreTile.cpp index 9317ffdd..b7551932 100644 --- a/Minecraft.World/RedStoneOreTile.cpp +++ b/Minecraft.World/RedStoneOreTile.cpp @@ -12,7 +12,7 @@ RedStoneOreTile::RedStoneOreTile(int id, bool lit) : Tile(id, Material::stone) this->lit = lit; } -int RedStoneOreTile::getTickDelay() +int RedStoneOreTile::getTickDelay(Level *level) { return 30; } @@ -32,7 +32,7 @@ void RedStoneOreTile::stepOn(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param @@ -48,7 +48,7 @@ void RedStoneOreTile::interact(Level *level, int x, int y, int z) if (level->isClientSide) return; // 4J added if (id == Tile::redStoneOre_Id) { - level->setTile(x, y, z, Tile::redStoneOre_lit_Id); + level->setTileAndUpdate(x, y, z, Tile::redStoneOre_lit_Id); } } @@ -56,7 +56,7 @@ void RedStoneOreTile::tick(Level *level, int x, int y, int z, Random* random) { if (id == Tile::redStoneOre_lit_Id) { - level->setTile(x, y, z, Tile::redStoneOre_Id); + level->setTileAndUpdate(x, y, z, Tile::redStoneOre_Id); } } @@ -119,7 +119,7 @@ void RedStoneOreTile::poofParticles(Level *level, int x, int y, int z) bool RedStoneOreTile::shouldTileTick(Level *level, int x,int y,int z) { - return id == Tile::redStoneOre_lit_Id; + return id == Tile::redStoneOre_lit_Id; } shared_ptr RedStoneOreTile::getSilkTouchItemInstance(int data) diff --git a/Minecraft.World/RedStoneOreTile.h b/Minecraft.World/RedStoneOreTile.h index bc1d48d7..2ff80ed5 100644 --- a/Minecraft.World/RedStoneOreTile.h +++ b/Minecraft.World/RedStoneOreTile.h @@ -10,21 +10,21 @@ private: bool lit; public: RedStoneOreTile(int id, bool lit); - virtual int getTickDelay(); - virtual void attack(Level *level, int x, int y, int z, shared_ptr player); - virtual void stepOn(Level *level, int x, int y, int z, shared_ptr entity); + virtual int getTickDelay(Level *level); + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual void stepOn(Level *level, int x, int y, int z, shared_ptr entity); virtual bool TestUse(); - virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param private: virtual void interact(Level *level, int x, int y, int z); public: virtual void tick(Level *level, int x, int y, int z, Random* random); - virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int getResource(int data, Random *random, int playerBonusLevel); virtual int getResourceCountForLootBonus(int bonusLevel, Random *random); - virtual int getResourceCount(Random *random); + virtual int getResourceCount(Random *random); virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); - virtual void animateTick(Level *level, int x, int y, int z, Random *random); - + virtual void animateTick(Level *level, int x, int y, int z, Random *random); + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); private: diff --git a/Minecraft.World/RedlightTile.cpp b/Minecraft.World/RedlightTile.cpp index 2a529c84..bf4cc01f 100644 --- a/Minecraft.World/RedlightTile.cpp +++ b/Minecraft.World/RedlightTile.cpp @@ -36,7 +36,7 @@ void RedlightTile::onPlace(Level *level, int x, int y, int z) } else if (!isLit && level->hasNeighborSignal(x, y, z)) { - level->setTile(x, y, z, Tile::redstoneLight_lit_Id); + level->setTileAndData(x, y, z, Tile::redstoneLight_lit_Id, 0, UPDATE_CLIENTS); } } } @@ -51,7 +51,7 @@ void RedlightTile::neighborChanged(Level *level, int x, int y, int z, int type) } else if (!isLit && level->hasNeighborSignal(x, y, z)) { - level->setTile(x, y, z, Tile::redstoneLight_lit_Id); + level->setTileAndData(x, y, z, Tile::redstoneLight_lit_Id, 0, UPDATE_CLIENTS); } } } @@ -62,7 +62,7 @@ void RedlightTile::tick(Level *level, int x, int y, int z, Random *random) { if (isLit && !level->hasNeighborSignal(x, y, z)) { - level->setTile(x, y, z, Tile::redstoneLight_Id); + level->setTileAndData(x, y, z, Tile::redstoneLight_Id, 0, UPDATE_CLIENTS); } } } diff --git a/Minecraft.World/Redstone.cpp b/Minecraft.World/Redstone.cpp new file mode 100644 index 00000000..62e0d8f2 --- /dev/null +++ b/Minecraft.World/Redstone.cpp @@ -0,0 +1,8 @@ +#include "stdafx.h" + +#include "Redstone.h" + +// 4J-JEV: Because whiny Ps4 compiler. +const int Redstone::SIGNAL_NONE; +const int Redstone::SIGNAL_MIN; +const int Redstone::SIGNAL_MAX; \ No newline at end of file diff --git a/Minecraft.World/Redstone.h b/Minecraft.World/Redstone.h new file mode 100644 index 00000000..0b25e8b7 --- /dev/null +++ b/Minecraft.World/Redstone.h @@ -0,0 +1,9 @@ +#pragma once + +class Redstone +{ +public: + static const int SIGNAL_NONE = 0; + static const int SIGNAL_MIN = 0; + static const int SIGNAL_MAX = 15; +}; \ No newline at end of file diff --git a/Minecraft.World/ReedTile.cpp b/Minecraft.World/ReedTile.cpp index 69596e83..c01eb764 100644 --- a/Minecraft.World/ReedTile.cpp +++ b/Minecraft.World/ReedTile.cpp @@ -33,12 +33,12 @@ void ReedTile::tick(Level *level, int x, int y, int z, Random* random) int age = level->getData(x, y, z); if (age == 15) { - level->setTile(x, y + 1, z, id); - level->setData(x, y, z, 0); + level->setTileAndUpdate(x, y + 1, z, id); + level->setData(x, y, z, 0, Tile::UPDATE_NONE); } else { - level->setData(x, y, z, age + 1); + level->setData(x, y, z, age + 1, Tile::UPDATE_NONE); } } } @@ -66,8 +66,8 @@ const void ReedTile::checkAlive(Level *level, int x, int y, int z) { if (!canSurvive(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); } } @@ -113,5 +113,5 @@ int ReedTile::cloneTileId(Level *level, int x, int y, int z) bool ReedTile::shouldTileTick(Level *level, int x,int y,int z) { - return level->isEmptyTile(x, y + 1, z); + return level->isEmptyTile(x, y + 1, z); } diff --git a/Minecraft.World/ReedsFeature.cpp b/Minecraft.World/ReedsFeature.cpp index 6d4f3e97..2792b21b 100644 --- a/Minecraft.World/ReedsFeature.cpp +++ b/Minecraft.World/ReedsFeature.cpp @@ -5,11 +5,11 @@ bool ReedsFeature::place(Level *level, Random *random, int x, int y, int z) { - for (int i = 0; i < 20; i++) + for (int i = 0; i < 20; i++) { - int x2 = x + random->nextInt(4) - random->nextInt(4); - int y2 = y; - int z2 = z + random->nextInt(4) - random->nextInt(4); + int x2 = x + random->nextInt(4) - random->nextInt(4); + int y2 = y; + int z2 = z + random->nextInt(4) - random->nextInt(4); // 4J Stu Added to stop reed features generating areas previously place by game rule generation if(app.getLevelGenerationOptions() != NULL) @@ -22,25 +22,25 @@ bool ReedsFeature::place(Level *level, Random *random, int x, int y, int z) continue; } } - if (level->isEmptyTile(x2, y2, z2)) + if (level->isEmptyTile(x2, y2, z2)) { - if (level->getMaterial(x2-1, y2-1, z2) == Material::water || - level->getMaterial(x2+1, y2-1, z2) == Material::water || - level->getMaterial(x2, y2-1, z2-1) == Material::water || - level->getMaterial(x2, y2-1, z2+1) == Material::water) + if (level->getMaterial(x2-1, y2-1, z2) == Material::water || + level->getMaterial(x2+1, y2-1, z2) == Material::water || + level->getMaterial(x2, y2-1, z2-1) == Material::water || + level->getMaterial(x2, y2-1, z2+1) == Material::water) { - int h = 2 + random->nextInt(random->nextInt(3) + 1); - for (int yy = 0; yy < h; yy++) + int h = 2 + random->nextInt(random->nextInt(3) + 1); + for (int yy = 0; yy < h; yy++) { - if ( Tile::reeds->canSurvive(level, x2, y2 + yy, z2) ) + if ( Tile::reeds->canSurvive(level, x2, y2 + yy, z2) ) { - level->setTileNoUpdate(x2, y2 + yy, z2, Tile::reeds_Id); - } - } - } - } - } + level->setTileAndData(x2, y2 + yy, z2, Tile::reeds_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } + } + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/Region.cpp b/Minecraft.World/Region.cpp index 4c3a454d..e3e91bf0 100644 --- a/Minecraft.World/Region.cpp +++ b/Minecraft.World/Region.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.level.chunk.h" #include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.redstone.h" #include "Material.h" #include "Level.h" @@ -27,14 +28,14 @@ Region::~Region() } } -Region::Region(Level *level, int x1, int y1, int z1, int x2, int y2, int z2) +Region::Region(Level *level, int x1, int y1, int z1, int x2, int y2, int z2, int r) { this->level = level; - xc1 = x1 >> 4; - zc1 = z1 >> 4; - int xc2 = x2 >> 4; - int zc2 = z2 >> 4; + xc1 = (x1 - r) >> 4; + zc1 = (z1 - r) >> 4; + int xc2 = (x2 + r) >> 4; + int zc2 = (z2 + r) >> 4; chunks = new LevelChunk2DArray(xc2 - xc1 + 1, zc2 - zc1 + 1); @@ -48,7 +49,17 @@ Region::Region(Level *level, int x1, int y1, int z1, int x2, int y2, int z2) { LevelChunkArray *lca = (*chunks)[xc - xc1]; lca->data[zc - zc1] = chunk; - //(*chunks)[xc - xc1].data[zc - zc1] = level->getChunk(xc, zc); + } + } + } + for (int xc = (x1 >> 4); xc <= (x2 >> 4); xc++) + { + for (int zc = (z1 >> 4); zc <= (z2 >> 4); zc++) + { + LevelChunkArray *lca = (*chunks)[xc - xc1]; + LevelChunk *chunk = lca->data[zc - zc1]; + if (chunk != NULL) + { if (!chunk->isYSpaceEmpty(y1, y2)) { allEmpty = false; @@ -147,10 +158,10 @@ shared_ptr Region::getTileEntity(int x, int y, int z) int Region::getLightColor(int x, int y, int z, int emitt, int tileId/*=-1*/) { - int s = getBrightnessPropagate(LightLayer::Sky, x, y, z, tileId); - int b = getBrightnessPropagate(LightLayer::Block, x, y, z, tileId); - if (b < emitt) b = emitt; - return s << 20 | b << 4; + int s = getBrightnessPropagate(LightLayer::Sky, x, y, z, tileId); + int b = getBrightnessPropagate(LightLayer::Block, x, y, z, tileId); + if (b < emitt) b = emitt; + return s << 20 | b << 4; } float Region::getBrightness(int x, int y, int z, int emitt) @@ -289,14 +300,8 @@ bool Region::isSolidBlockingTile(int x, int y, int z) bool Region::isTopSolidBlocking(int x, int y, int z) { - // Temporary workaround until tahgs per-face solidity is finished Tile *tile = Tile::tiles[getTile(x, y, z)]; - if (tile == NULL) return false; - - if (tile->material->isSolidBlocking() && tile->isCubeShaped()) return true; - if (dynamic_cast(tile)) return (getData(x, y, z) & StairTile::UPSIDEDOWN_BIT) == StairTile::UPSIDEDOWN_BIT; - if (dynamic_cast(tile)) return (getData(x, y, z) & HalfSlabTile::TOP_SLOT_BIT) == HalfSlabTile::TOP_SLOT_BIT; - return false; + return level->isTopSolidBlocking(tile, getData(x, y, z)); } bool Region::isEmptyTile(int x, int y, int z) @@ -309,15 +314,19 @@ bool Region::isEmptyTile(int x, int y, int z) // 4J - brought forward from 1.8.2 int Region::getBrightnessPropagate(LightLayer::variety layer, int x, int y, int z, int tileId) { - if (y < 0) y = 0; + if (y < 0) y = 0; if (y >= Level::maxBuildHeight) y = Level::maxBuildHeight - 1; - if (y < 0 || y >= Level::maxBuildHeight || x < -Level::MAX_LEVEL_SIZE || z < -Level::MAX_LEVEL_SIZE || x >= Level::MAX_LEVEL_SIZE || z > Level::MAX_LEVEL_SIZE) + if (y < 0 || y >= Level::maxBuildHeight || x < -Level::MAX_LEVEL_SIZE || z < -Level::MAX_LEVEL_SIZE || x >= Level::MAX_LEVEL_SIZE || z > Level::MAX_LEVEL_SIZE) { // 4J Stu - The java LightLayer was an enum class type with a member "surrounding" which is what we // were returning here. Surrounding has the same value as the enum value in our C++ code, so just cast // it to an int return (int)layer; - } + } + if (layer == LightLayer::Sky && level->dimension->hasCeiling) + { + return 0; + } int id = tileId > -1 ? tileId : getTile(x, y, z); if (Tile::propagate[id]) @@ -334,31 +343,38 @@ int Region::getBrightnessPropagate(LightLayer::variety layer, int x, int y, int return br; } - int xc = (x >> 4) - xc1; - int zc = (z >> 4) - zc1; + int xc = (x >> 4) - xc1; + int zc = (z >> 4) - zc1; - return (*chunks)[xc]->data[zc]->getBrightness(layer, x & 15, y, z & 15); + return (*chunks)[xc]->data[zc]->getBrightness(layer, x & 15, y, z & 15); } // 4J - brought forward from 1.8.2 int Region::getBrightness(LightLayer::variety layer, int x, int y, int z) { - if (y < 0) y = 0; - if (y >= Level::maxBuildHeight) y = Level::maxBuildHeight - 1; - if (y < 0 || y >= Level::maxBuildHeight || x < -Level::MAX_LEVEL_SIZE || z < -Level::MAX_LEVEL_SIZE || x >= Level::MAX_LEVEL_SIZE || z > Level::MAX_LEVEL_SIZE) + if (y < 0) y = 0; + if (y >= Level::maxBuildHeight) y = Level::maxBuildHeight - 1; + if (y < 0 || y >= Level::maxBuildHeight || x < -Level::MAX_LEVEL_SIZE || z < -Level::MAX_LEVEL_SIZE || x >= Level::MAX_LEVEL_SIZE || z > Level::MAX_LEVEL_SIZE) { // 4J Stu - The java LightLayer was an enum class type with a member "surrounding" which is what we // were returning here. Surrounding has the same value as the enum value in our C++ code, so just cast // it to an int return (int)layer; - } - int xc = (x >> 4) - xc1; - int zc = (z >> 4) - zc1; + } + int xc = (x >> 4) - xc1; + int zc = (z >> 4) - zc1; - return (*chunks)[xc]->data[zc]->getBrightness(layer, x & 15, y, z & 15); + return (*chunks)[xc]->data[zc]->getBrightness(layer, x & 15, y, z & 15); } int Region::getMaxBuildHeight() { return Level::maxBuildHeight; +} + +int Region::getDirectSignal(int x, int y, int z, int dir) +{ + int t = getTile(x, y, z); + if (t == 0) return Redstone::SIGNAL_NONE; + return Tile::tiles[t]->getDirectSignal(this, x, y, z, dir); } \ No newline at end of file diff --git a/Minecraft.World/Region.h b/Minecraft.World/Region.h index 0d200a35..7d6cdc11 100644 --- a/Minecraft.World/Region.h +++ b/Minecraft.World/Region.h @@ -19,7 +19,7 @@ private: unsigned char *CachedTiles; public: - Region(Level *level, int x1, int y1, int z1, int x2, int y2, int z2); + Region(Level *level, int x1, int y1, int z1, int x2, int y2, int z2, int r); virtual ~Region(); bool isAllEmpty(); int getTile(int x, int y, int z); @@ -43,6 +43,7 @@ public: int getBrightness(LightLayer::variety layer, int x, int y, int z); int getMaxBuildHeight(); + int getDirectSignal(int x, int y, int z, int dir); LevelChunk* getLevelChunk(int x, int y, int z); diff --git a/Minecraft.World/RegionFileCache.cpp b/Minecraft.World/RegionFileCache.cpp index c21a6250..23c87118 100644 --- a/Minecraft.World/RegionFileCache.cpp +++ b/Minecraft.World/RegionFileCache.cpp @@ -120,3 +120,9 @@ DataOutputStream *RegionFileCache::_getChunkDataOutputStream(ConsoleSaveFile *sa return r->getChunkDataOutputStream(chunkX & 31, chunkZ & 31); } } + + +RegionFileCache::~RegionFileCache() +{ + _clear(); +} diff --git a/Minecraft.World/RegionFileCache.h b/Minecraft.World/RegionFileCache.h index 03e576cc..cef71d90 100644 --- a/Minecraft.World/RegionFileCache.h +++ b/Minecraft.World/RegionFileCache.h @@ -16,6 +16,7 @@ private: public: // Made public and non-static so we can have a cache for input and output files RegionFileCache() {} + ~RegionFileCache(); RegionFile *_getRegionFile(ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ); // 4J - TODO was synchronized void _clear(); // 4J - TODO was synchronized diff --git a/Minecraft.World/RepairContainer.cpp b/Minecraft.World/RepairContainer.cpp index 7b2a51bc..2ada97a6 100644 --- a/Minecraft.World/RepairContainer.cpp +++ b/Minecraft.World/RepairContainer.cpp @@ -1,8 +1,8 @@ #include "stdafx.h" -#include "RepairMenu.h" +#include "AnvilMenu.h" #include "RepairContainer.h" -RepairContainer::RepairContainer(RepairMenu *menu, int name, int size) : SimpleContainer(name, size) +RepairContainer::RepairContainer(AnvilMenu *menu, int name, bool customName, int size) : SimpleContainer(name, L"", customName, size) { m_menu = menu; } @@ -11,4 +11,9 @@ void RepairContainer::setChanged() { SimpleContainer::setChanged(); m_menu->slotsChanged(shared_from_this()); +} + +bool RepairContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; } \ No newline at end of file diff --git a/Minecraft.World/RepairContainer.h b/Minecraft.World/RepairContainer.h index 758132c0..a4311c52 100644 --- a/Minecraft.World/RepairContainer.h +++ b/Minecraft.World/RepairContainer.h @@ -2,14 +2,15 @@ #include "SimpleContainer.h" -class RepairMenu; +class AnvilMenu; class RepairContainer : public SimpleContainer, public enable_shared_from_this { private: - RepairMenu *m_menu; + AnvilMenu *m_menu; public: - RepairContainer(RepairMenu *menu, int name, int size); + RepairContainer(AnvilMenu *menu, int name, bool customName, int size); void setChanged(); + bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/RepairResultSlot.cpp b/Minecraft.World/RepairResultSlot.cpp index 041a64a7..51e95b42 100644 --- a/Minecraft.World/RepairResultSlot.cpp +++ b/Minecraft.World/RepairResultSlot.cpp @@ -5,7 +5,7 @@ #include "net.minecraft.world.entity.player.h" #include "RepairResultSlot.h" -RepairResultSlot::RepairResultSlot(RepairMenu *menu, int xt, int yt, int zt, shared_ptr container, int slot, int x, int y) : Slot(container, slot, x, y) +RepairResultSlot::RepairResultSlot(AnvilMenu *menu, int xt, int yt, int zt, shared_ptr container, int slot, int x, int y) : Slot(container, slot, x, y) { m_menu = menu; this->xt = xt; @@ -25,24 +25,24 @@ bool RepairResultSlot::mayPickup(shared_ptr player) void RepairResultSlot::onTake(shared_ptr player, shared_ptr carried) { - if (!player->abilities.instabuild) player->withdrawExperienceLevels(m_menu->cost); - m_menu->repairSlots->setItem(RepairMenu::INPUT_SLOT, nullptr); + if (!player->abilities.instabuild) player->giveExperienceLevels(-m_menu->cost); + m_menu->repairSlots->setItem(AnvilMenu::INPUT_SLOT, nullptr); if (m_menu->repairItemCountCost > 0) { - shared_ptr addition = m_menu->repairSlots->getItem(RepairMenu::ADDITIONAL_SLOT); + shared_ptr addition = m_menu->repairSlots->getItem(AnvilMenu::ADDITIONAL_SLOT); if (addition != NULL && addition->count > m_menu->repairItemCountCost) { addition->count -= m_menu->repairItemCountCost; - m_menu->repairSlots->setItem(RepairMenu::ADDITIONAL_SLOT, addition); + m_menu->repairSlots->setItem(AnvilMenu::ADDITIONAL_SLOT, addition); } else { - m_menu->repairSlots->setItem(RepairMenu::ADDITIONAL_SLOT, nullptr); + m_menu->repairSlots->setItem(AnvilMenu::ADDITIONAL_SLOT, nullptr); } } else { - m_menu->repairSlots->setItem(RepairMenu::ADDITIONAL_SLOT, nullptr); + m_menu->repairSlots->setItem(AnvilMenu::ADDITIONAL_SLOT, nullptr); } m_menu->cost = 0; @@ -54,12 +54,12 @@ void RepairResultSlot::onTake(shared_ptr player, shared_ptr 2) { - m_menu->level->setTile(xt, yt, zt, 0); + m_menu->level->removeTile(xt, yt, zt); m_menu->level->levelEvent(LevelEvent::SOUND_ANVIL_BROKEN, xt, yt, zt, 0); } else { - m_menu->level->setData(xt, yt, zt, dir | (dmg << 2)); + m_menu->level->setData(xt, yt, zt, dir | (dmg << 2), Tile::UPDATE_CLIENTS); m_menu->level->levelEvent(LevelEvent::SOUND_ANVIL_USED, xt, yt, zt, 0); } } diff --git a/Minecraft.World/RepairResultSlot.h b/Minecraft.World/RepairResultSlot.h index 1895ca30..b7583569 100644 --- a/Minecraft.World/RepairResultSlot.h +++ b/Minecraft.World/RepairResultSlot.h @@ -2,16 +2,16 @@ #include "Slot.h" -class RepairMenu; +class AnvilMenu; class RepairResultSlot : public Slot { private: - RepairMenu *m_menu; + AnvilMenu *m_menu; int xt, yt, zt; public: - RepairResultSlot(RepairMenu *menu, int xt, int yt, int zt, shared_ptr container, int slot, int x, int y); + RepairResultSlot(AnvilMenu *menu, int xt, int yt, int zt, shared_ptr container, int slot, int x, int y); bool mayPlace(shared_ptr item); bool mayPickup(shared_ptr player); diff --git a/Minecraft.World/RepeaterTile.cpp b/Minecraft.World/RepeaterTile.cpp new file mode 100644 index 00000000..23a9e12f --- /dev/null +++ b/Minecraft.World/RepeaterTile.cpp @@ -0,0 +1,132 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "RepeaterTile.h" + +const double RepeaterTile::DELAY_RENDER_OFFSETS[4] = {-1.0f / 16.0f, 1.0f / 16.0f, 3.0f / 16.0f, 5.0f / 16.0f}; +const int RepeaterTile::DELAYS[4]= {1, 2, 3, 4}; + +RepeaterTile::RepeaterTile(int id, bool on) : DiodeTile(id, on) +{ +} + +bool RepeaterTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +{ + if (soundOnly) return false; + + int data = level->getData(x, y, z); + int delay = (data & DELAY_MASK) >> DELAY_SHIFT; + delay = ((delay + 1) << DELAY_SHIFT) & DELAY_MASK; + + level->setData(x, y, z, delay | (data & DIRECTION_MASK), Tile::UPDATE_ALL); + return true; +} + +int RepeaterTile::getTurnOnDelay(int data) +{ + return DELAYS[(data & DELAY_MASK) >> DELAY_SHIFT] * 2; +} + +DiodeTile *RepeaterTile::getOnTile() +{ + return Tile::diode_on; +} + +DiodeTile *RepeaterTile::getOffTile() +{ + return Tile::diode_off; +} + +int RepeaterTile::getResource(int data, Random *random, int playerBonusLevel) +{ + return Item::repeater_Id; +} + +int RepeaterTile::cloneTileId(Level *level, int x, int y, int z) +{ + return Item::repeater_Id; +} + +int RepeaterTile::getRenderShape() +{ + return SHAPE_REPEATER; +} + +bool RepeaterTile::isLocked(LevelSource *level, int x, int y, int z, int data) +{ + return getAlternateSignal(level, x, y, z, data) > Redstone::SIGNAL_NONE; +} + +bool RepeaterTile::isAlternateInput(int tile) +{ + return isDiode(tile); +} + +void RepeaterTile::animateTick(Level *level, int xt, int yt, int zt, Random *random) +{ + if (!on) return; + int data = level->getData(xt, yt, zt); + int dir = getDirection(data); + + double x = xt + 0.5f + (random->nextFloat() - 0.5f) * 0.2; + double y = yt + 0.4f + (random->nextFloat() - 0.5f) * 0.2; + double z = zt + 0.5f + (random->nextFloat() - 0.5f) * 0.2; + + double xo = 0; + double zo = 0; + + if (random->nextInt(2) == 0) + { + // spawn on receiver + switch (dir) + { + case Direction::SOUTH: + zo = -5.0f / 16.0f; + break; + case Direction::NORTH: + zo = 5.0f / 16.0f; + break; + case Direction::EAST: + xo = -5.0f / 16.0f; + break; + case Direction::WEST: + xo = 5.0f / 16.0f; + break; + } + } + else + { + // spawn on transmitter + int delay = (data & DELAY_MASK) >> DELAY_SHIFT; + switch (dir) + { + case Direction::SOUTH: + zo = DELAY_RENDER_OFFSETS[delay]; + break; + case Direction::NORTH: + zo = -DELAY_RENDER_OFFSETS[delay]; + break; + case Direction::EAST: + xo = DELAY_RENDER_OFFSETS[delay]; + break; + case Direction::WEST: + xo = -DELAY_RENDER_OFFSETS[delay]; + break; + } + } + + level->addParticle(eParticleType_reddust, x + xo, y, z + zo, 0, 0, 0); +} + +void RepeaterTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + DiodeTile::onRemove(level, x, y, z, id, data); + updateNeighborsInFront(level, x, y, z); +} + +bool RepeaterTile::TestUse() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.World/RepeaterTile.h b/Minecraft.World/RepeaterTile.h new file mode 100644 index 00000000..048e4de0 --- /dev/null +++ b/Minecraft.World/RepeaterTile.h @@ -0,0 +1,40 @@ +#pragma once + +#include "DiodeTile.h" + +class RepeaterTile : public DiodeTile +{ +public: + static const int DELAY_MASK = DIRECTION_INV_MASK; + static const int DELAY_SHIFT = 2; + + static const double DELAY_RENDER_OFFSETS[4]; + +private: + static const int DELAYS[4]; + +public: + RepeaterTile(int id, bool on); + + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + +protected: + virtual int getTurnOnDelay(int data); + virtual DiodeTile *getOnTile(); + virtual DiodeTile *getOffTile(); + +public: + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int cloneTileId(Level *level, int x, int y, int z); + virtual int getRenderShape(); + virtual bool isLocked(LevelSource *level, int x, int y, int z, int data); + +protected: + virtual bool isAlternateInput(int tile); + +public: + void animateTick(Level *level, int xt, int yt, int zt, Random *random); + void onRemove(Level *level, int x, int y, int z, int id, int data); + + virtual bool TestUse(); +}; \ No newline at end of file diff --git a/Minecraft.World/ResultContainer.cpp b/Minecraft.World/ResultContainer.cpp index c28b3cf3..f2f273c2 100644 --- a/Minecraft.World/ResultContainer.cpp +++ b/Minecraft.World/ResultContainer.cpp @@ -4,7 +4,6 @@ ResultContainer::ResultContainer() : Container() { - items = new ItemInstanceArray(1); } unsigned int ResultContainer::getContainerSize() @@ -14,20 +13,30 @@ unsigned int ResultContainer::getContainerSize() shared_ptr ResultContainer::getItem(unsigned int slot) { - return (*items)[0]; + return items[0]; } -int ResultContainer::getName() +wstring ResultContainer::getName() { - return 0; + return L""; +} + +wstring ResultContainer::getCustomName() +{ + return L""; +} + +bool ResultContainer::hasCustomName() +{ + return false; } shared_ptr ResultContainer::removeItem(unsigned int slot, int count) { - if ((*items)[0] != NULL) + if (items[0] != NULL) { - shared_ptr item = (*items)[0]; - (*items)[0] = nullptr; + shared_ptr item = items[0]; + items[0] = nullptr; return item; } return nullptr; @@ -35,10 +44,10 @@ shared_ptr ResultContainer::removeItem(unsigned int slot, int coun shared_ptr ResultContainer::removeItemNoUpdate(int slot) { - if ((*items)[0] != NULL) + if (items[0] != NULL) { - shared_ptr item = (*items)[0]; - (*items)[0] = nullptr; + shared_ptr item = items[0]; + items[0] = nullptr; return item; } return nullptr; @@ -46,7 +55,7 @@ shared_ptr ResultContainer::removeItemNoUpdate(int slot) void ResultContainer::setItem(unsigned int slot, shared_ptr item) { - (*items)[0] = item; + items[0] = item; } int ResultContainer::getMaxStackSize() @@ -59,6 +68,11 @@ void ResultContainer::setChanged() } bool ResultContainer::stillValid(shared_ptr player) +{ + return true; +} + +bool ResultContainer::canPlaceItem(int slot, shared_ptr item) { return true; } \ No newline at end of file diff --git a/Minecraft.World/ResultContainer.h b/Minecraft.World/ResultContainer.h index 62df65d8..f99cf806 100644 --- a/Minecraft.World/ResultContainer.h +++ b/Minecraft.World/ResultContainer.h @@ -5,7 +5,7 @@ class ResultContainer : public Container { private: - ItemInstanceArray *items; + shared_ptr items[1]; public: // 4J Stu Added a ctor to init items @@ -13,14 +13,16 @@ public: virtual unsigned int getContainerSize(); virtual shared_ptr getItem(unsigned int slot); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); virtual shared_ptr removeItem(unsigned int slot, int count); virtual shared_ptr removeItemNoUpdate(int slot); virtual void setItem(unsigned int slot, shared_ptr item); virtual int getMaxStackSize(); virtual void setChanged(); virtual bool stillValid(shared_ptr player); - - void startOpen() { } // TODO Auto-generated method stub - void stopOpen() { } // TODO Auto-generated method stub + virtual void startOpen() { } // TODO Auto-generated method stub + virtual void stopOpen() { } // TODO Auto-generated method stub + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/ResultSlot.cpp b/Minecraft.World/ResultSlot.cpp index b79329af..08ffe714 100644 --- a/Minecraft.World/ResultSlot.cpp +++ b/Minecraft.World/ResultSlot.cpp @@ -66,21 +66,17 @@ void ResultSlot::onTake(shared_ptr player, shared_ptr carr if (item->getItem()->hasCraftingRemainingItem()) { - - // (TheApathetic) shared_ptr craftResult = shared_ptr(new ItemInstance(item->getItem()->getCraftingRemainingItem())); /* - * Try to place this in the player's inventory (See we.java - * for new method) + * Try to place this in the player's inventory (See we.java for new method) */ - if (item->getItem()->shouldMoveCraftingResultToInventory(item) && this->player->inventory->add(craftResult)) + if (item->getItem()->shouldMoveCraftingResultToInventory(item) && player->inventory->add(craftResult)) { continue; } - // If this slot is now empty, place it there (current - // behavior) + // If this slot is now empty, place it there (current behavior) if (craftSlots->getItem(i) == NULL) { craftSlots->setItem(i, craftResult); @@ -88,7 +84,7 @@ void ResultSlot::onTake(shared_ptr player, shared_ptr carr else { // Finally, if nothing else, just drop the item - this->player->drop(craftResult); + player->drop(craftResult); } } diff --git a/Minecraft.World/RotatedPillarTile.cpp b/Minecraft.World/RotatedPillarTile.cpp new file mode 100644 index 00000000..a4b7d931 --- /dev/null +++ b/Minecraft.World/RotatedPillarTile.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "RotatedPillarTile.h" + +RotatedPillarTile::RotatedPillarTile(int id, Material *material) : Tile(id, material) +{ +} + +int RotatedPillarTile::getRenderShape() +{ + return Tile::SHAPE_TREE; +} + +int RotatedPillarTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) +{ + int type = itemValue & MASK_TYPE; + int facing = 0; + + switch (face) + { + case Facing::NORTH: + case Facing::SOUTH: + facing = FACING_Z; + break; + case Facing::EAST: + case Facing::WEST: + facing = FACING_X; + break; + case Facing::UP: + case Facing::DOWN: + facing = FACING_Y; + break; + } + + return type | facing; +} + +Icon *RotatedPillarTile::getTexture(int face, int data) +{ + int dir = data & MASK_FACING; + int type = data & MASK_TYPE; + + if (dir == FACING_Y && (face == Facing::UP || face == Facing::DOWN)) + { + return getTopTexture(type); + } + else if (dir == FACING_X && (face == Facing::EAST || face == Facing::WEST)) + { + return getTopTexture(type); + } + else if (dir == FACING_Z && (face == Facing::NORTH || face == Facing::SOUTH)) + { + return getTopTexture(type); + } + + return getTypeTexture(type); +} + +Icon *RotatedPillarTile::getTopTexture(int type) +{ + return iconTop; +} + +int RotatedPillarTile::getSpawnResourcesAuxValue(int data) +{ + return data & MASK_TYPE; +} + +int RotatedPillarTile::getType(int data) +{ + return data & MASK_TYPE; +} + +shared_ptr RotatedPillarTile::getSilkTouchItemInstance(int data) +{ + return shared_ptr( new ItemInstance(id, 1, getType(data)) ); +} \ No newline at end of file diff --git a/Minecraft.World/RotatedPillarTile.h b/Minecraft.World/RotatedPillarTile.h new file mode 100644 index 00000000..76e52997 --- /dev/null +++ b/Minecraft.World/RotatedPillarTile.h @@ -0,0 +1,35 @@ +#pragma once + +#include "Tile.h" + +class RotatedPillarTile : public Tile +{ +public: + static const int MASK_TYPE = 0x3; + static const int MASK_FACING = 0xC; + static const int FACING_Y = 0 << 2; + static const int FACING_X = 1 << 2; + static const int FACING_Z = 2 << 2; + +protected: + Icon *iconTop; + + RotatedPillarTile(int id, Material *material); + +public: + virtual int getRenderShape(); + virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); + virtual Icon *getTexture(int face, int data); + +protected: + virtual Icon *getTypeTexture(int type) = 0; + + virtual Icon *getTopTexture(int type); + +public: + virtual int getSpawnResourcesAuxValue(int data); + virtual int getType(int data); + +protected: + virtual shared_ptr getSilkTouchItemInstance(int data); +}; \ No newline at end of file diff --git a/Minecraft.World/RunAroundLikeCrazyGoal.cpp b/Minecraft.World/RunAroundLikeCrazyGoal.cpp new file mode 100644 index 00000000..118b09f9 --- /dev/null +++ b/Minecraft.World/RunAroundLikeCrazyGoal.cpp @@ -0,0 +1,62 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "RandomPos.h" +#include "RunAroundLikeCrazyGoal.h" + +RunAroundLikeCrazyGoal::RunAroundLikeCrazyGoal(EntityHorse *mob, double speedModifier) +{ + horse = mob; + this->speedModifier = speedModifier; + setRequiredControlFlags(Control::MoveControlFlag); +} + +bool RunAroundLikeCrazyGoal::canUse() +{ + if (horse->isTamed() || horse->rider.lock() == NULL) return false; + Vec3 *pos = RandomPos::getPos(dynamic_pointer_cast(horse->shared_from_this()), 5, 4); + if (pos == NULL) return false; + posX = pos->x; + posY = pos->y; + posZ = pos->z; + return true; +} + +void RunAroundLikeCrazyGoal::start() +{ + horse->getNavigation()->moveTo(posX, posY, posZ, speedModifier); +} + +bool RunAroundLikeCrazyGoal::canContinueToUse() +{ + return !horse->getNavigation()->isDone() && horse->rider.lock() != NULL; +} + +void RunAroundLikeCrazyGoal::tick() +{ + if (horse->getRandom()->nextInt(50) == 0) + { + + if ( horse->rider.lock()->instanceof(eTYPE_PLAYER) ) + { + int temper = horse->getTemper(); + int maxTemper = horse->getMaxTemper(); + if (maxTemper > 0 && horse->getRandom()->nextInt(maxTemper) < temper) + { + horse->tameWithName(dynamic_pointer_cast(horse->rider.lock())); + horse->level->broadcastEntityEvent(horse->shared_from_this(), EntityEvent::TAMING_SUCCEEDED); + return; + } + horse->modifyTemper(5); + } + + horse->rider.lock()->ride(nullptr); + horse->rider = weak_ptr(); + horse->makeMad(); + horse->level->broadcastEntityEvent(horse->shared_from_this(), EntityEvent::TAMING_FAILED); + } +} \ No newline at end of file diff --git a/Minecraft.World/RunAroundLikeCrazyGoal.h b/Minecraft.World/RunAroundLikeCrazyGoal.h new file mode 100644 index 00000000..f895186a --- /dev/null +++ b/Minecraft.World/RunAroundLikeCrazyGoal.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Goal.h" + +class EntityHorse; + +class RunAroundLikeCrazyGoal : public Goal +{ +private: + EntityHorse *horse; // Owner + double speedModifier; + double posX, posY, posZ; + +public: + RunAroundLikeCrazyGoal(EntityHorse *mob, double speedModifier); + + bool canUse(); + void start(); + bool canContinueToUse(); + void tick(); +}; \ No newline at end of file diff --git a/Minecraft.World/SaddleItem.cpp b/Minecraft.World/SaddleItem.cpp index 0effeb53..f982b751 100644 --- a/Minecraft.World/SaddleItem.cpp +++ b/Minecraft.World/SaddleItem.cpp @@ -6,26 +6,26 @@ SaddleItem::SaddleItem(int id) : Item(id) { - maxStackSize = 1; + maxStackSize = 1; } -bool SaddleItem::interactEnemy(shared_ptr itemInstance, shared_ptr mob) +bool SaddleItem::interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob) { - if ( dynamic_pointer_cast(mob) ) + if ( (mob != NULL) && mob->instanceof(eTYPE_PIG) ) { - shared_ptr pig = dynamic_pointer_cast(mob); - if (!pig->hasSaddle() && !pig->isBaby()) + shared_ptr pig = dynamic_pointer_cast(mob); + if (!pig->hasSaddle() && !pig->isBaby()) { - pig->setSaddle(true); - itemInstance->count--; - } + pig->setSaddle(true); + itemInstance->count--; + } return true; - } + } return false; } -bool SaddleItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) +bool SaddleItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { - interactEnemy(itemInstance, mob); - return true; + interactEnemy(itemInstance, nullptr, mob); + return true; } \ No newline at end of file diff --git a/Minecraft.World/SaddleItem.h b/Minecraft.World/SaddleItem.h index 129922db..424eecd5 100644 --- a/Minecraft.World/SaddleItem.h +++ b/Minecraft.World/SaddleItem.h @@ -8,6 +8,6 @@ class SaddleItem : public Item public: SaddleItem(int id); - virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr mob); - virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); + virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); }; \ No newline at end of file diff --git a/Minecraft.World/SandFeature.cpp b/Minecraft.World/SandFeature.cpp index b678e290..122264ff 100644 --- a/Minecraft.World/SandFeature.cpp +++ b/Minecraft.World/SandFeature.cpp @@ -5,21 +5,21 @@ SandFeature::SandFeature(int radius, int tile) { - this->tile = tile; - this->radius = radius; + this->tile = tile; + this->radius = radius; } bool SandFeature::place(Level *level, Random *random, int x, int y, int z) { - if (level->getMaterial(x, y, z) != Material::water) return false; + if (level->getMaterial(x, y, z) != Material::water) return false; // 4J - optimisation. Without this, we can end up creating a huge number of HeavyTiles to be ticked // a few frames away. I think instatick ought to be fine here - we're only turning rock into gravel, // so should instantly know if we've made a rock with nothing underneath and that should fall. level->setInstaTick(true); - int r = random->nextInt(radius-2)+2; - int yr = 2; + int r = random->nextInt(radius-2)+2; + int yr = 2; // 4J Stu Added to stop tree features generating areas previously place by game rule generation if(app.getLevelGenerationOptions() != NULL) @@ -34,25 +34,25 @@ bool SandFeature::place(Level *level, Random *random, int x, int y, int z) } } - for (int xx = x - r; xx <= x + r; xx++) + for (int xx = x - r; xx <= x + r; xx++) { - for (int zz = z - r; zz <= z + r; zz++) + for (int zz = z - r; zz <= z + r; zz++) { - int xd = xx - x; - int zd = zz - z; - if (xd * xd + zd * zd > r * r) continue; - for (int yy = y - yr; yy <= y + yr; yy++) + int xd = xx - x; + int zd = zz - z; + if (xd * xd + zd * zd > r * r) continue; + for (int yy = y - yr; yy <= y + yr; yy++) { - int t = level->getTile(xx, yy, zz); - if (t == Tile::dirt_Id || t == Tile::grass_Id) + int t = level->getTile(xx, yy, zz); + if (t == Tile::dirt_Id || t == Tile::grass_Id) { - level->setTileNoUpdate(xx, yy, zz, tile); - } - } - } - } + level->setTileAndData(xx, yy, zz, tile, 0, Tile::UPDATE_CLIENTS); + } + } + } + } level->setInstaTick(false); - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/Sapling.cpp b/Minecraft.World/Sapling.cpp index 42bd53ee..85fcea98 100644 --- a/Minecraft.World/Sapling.cpp +++ b/Minecraft.World/Sapling.cpp @@ -6,11 +6,11 @@ #include "Sapling.h" -const unsigned int Sapling::SAPLING_NAMES[SAPLING_NAMES_SIZE] = { IDS_TILE_SAPLING_OAK, - IDS_TILE_SAPLING_SPRUCE, - IDS_TILE_SAPLING_BIRCH, - IDS_TILE_SAPLING_JUNGLE - }; +int Sapling::SAPLING_NAMES[SAPLING_NAMES_SIZE] = { IDS_TILE_SAPLING_OAK, + IDS_TILE_SAPLING_SPRUCE, + IDS_TILE_SAPLING_BIRCH, + IDS_TILE_SAPLING_JUNGLE +}; const wstring Sapling::TEXTURE_NAMES[] = {L"sapling", L"sapling_spruce", L"sapling_birch", L"sapling_jungle"}; @@ -37,15 +37,7 @@ void Sapling::tick(Level *level, int x, int y, int z, Random *random) { if (random->nextInt(7) == 0) { - int data = level->getData(x, y, z); - if ((data & AGE_BIT) == 0) - { - level->setData(x, y, z, data | AGE_BIT); - } - else - { - growTree(level, x, y, z, random); - } + advanceTree(level, x, y, z, random); } } } @@ -56,6 +48,19 @@ Icon *Sapling::getTexture(int face, int data) return icons[data]; } +void Sapling::advanceTree(Level *level, int x, int y, int z, Random *random) +{ + int data = level->getData(x, y, z); + if ((data & AGE_BIT) == 0) + { + level->setData(x, y, z, data | AGE_BIT, Tile::UPDATE_NONE); + } + else + { + growTree(level, x, y, z, random); + } +} + void Sapling::growTree(Level *level, int x, int y, int z, Random *random) { int data = level->getData(x, y, z) & TYPE_MASK; @@ -80,14 +85,12 @@ void Sapling::growTree(Level *level, int x, int y, int z, Random *random) { for (oz = 0; oz >= -1; oz--) { - if (isSapling(level, x + ox, y, z + oz, TYPE_JUNGLE) && - isSapling(level, x + ox + 1, y, z + oz, TYPE_JUNGLE) && - isSapling(level, x + ox, y, z + oz + 1, TYPE_JUNGLE) && - isSapling(level, x + ox + 1, y, z + oz + 1, TYPE_JUNGLE)) + if (isSapling(level, x + ox, y, z + oz, TYPE_JUNGLE) && isSapling(level, x + ox + 1, y, z + oz, TYPE_JUNGLE) && isSapling(level, x + ox, y, z + oz + 1, TYPE_JUNGLE) + && isSapling(level, x + ox + 1, y, z + oz + 1, TYPE_JUNGLE)) { - f = new MegaTreeFeature(true, 10 + random->nextInt(20), TreeTile::JUNGLE_TRUNK, LeafTile::JUNGLE_LEAF); - multiblock = true; - break; + f = new MegaTreeFeature(true, 10 + random->nextInt(20), TreeTile::JUNGLE_TRUNK, LeafTile::JUNGLE_LEAF); + multiblock = true; + break; } } if (f != NULL) @@ -112,27 +115,27 @@ void Sapling::growTree(Level *level, int x, int y, int z, Random *random) } if (multiblock) { - level->setTileNoUpdate(x + ox, y, z + oz, 0); - level->setTileNoUpdate(x + ox + 1, y, z + oz, 0); - level->setTileNoUpdate(x + ox, y, z + oz + 1, 0); - level->setTileNoUpdate(x + ox + 1, y, z + oz + 1, 0); + level->setTileAndData(x + ox, y, z + oz, 0, 0, Tile::UPDATE_NONE); + level->setTileAndData(x + ox + 1, y, z + oz, 0, 0, Tile::UPDATE_NONE); + level->setTileAndData(x + ox, y, z + oz + 1, 0, 0, Tile::UPDATE_NONE); + level->setTileAndData(x + ox + 1, y, z + oz + 1, 0, 0, Tile::UPDATE_NONE); } else { - level->setTileNoUpdate(x, y, z, 0); + level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_NONE); } if (!f->place(level, random, x + ox, y, z + oz)) { if (multiblock) { - level->setTileAndDataNoUpdate(x + ox, y, z + oz, this->id, data); - level->setTileAndDataNoUpdate(x + ox + 1, y, z + oz, this->id, data); - level->setTileAndDataNoUpdate(x + ox, y, z + oz + 1, this->id, data); - level->setTileAndDataNoUpdate(x + ox + 1, y, z + oz + 1, this->id, data); + level->setTileAndData(x + ox, y, z + oz, id, data, Tile::UPDATE_NONE); + level->setTileAndData(x + ox + 1, y, z + oz, id, data, Tile::UPDATE_NONE); + level->setTileAndData(x + ox, y, z + oz + 1, id, data, Tile::UPDATE_NONE); + level->setTileAndData(x + ox + 1, y, z + oz + 1, id, data, Tile::UPDATE_NONE); } else { - level->setTileAndDataNoUpdate(x, y, z, this->id, data); + level->setTileAndData(x, y, z, id, data, Tile::UPDATE_NONE); } } if( f != NULL ) diff --git a/Minecraft.World/Sapling.h b/Minecraft.World/Sapling.h index f44888af..57135f33 100644 --- a/Minecraft.World/Sapling.h +++ b/Minecraft.World/Sapling.h @@ -18,7 +18,7 @@ public: static const int SAPLING_NAMES_SIZE = 4; - static const unsigned int SAPLING_NAMES[SAPLING_NAMES_SIZE]; + static int SAPLING_NAMES[SAPLING_NAMES_SIZE]; private: static const wstring TEXTURE_NAMES[]; @@ -32,11 +32,11 @@ protected: Sapling(int id); public: - virtual void updateDefaultShape(); // 4J Added override - void tick(Level *level, int x, int y, int z, Random *random); - - Icon *getTexture(int face, int data); + virtual void updateDefaultShape(); // 4J Added override + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual Icon *getTexture(int face, int data); + virtual void advanceTree(Level *level, int x, int y, int z, Random *random); void growTree(Level *level, int x, int y, int z, Random *random); virtual unsigned int getDescriptionId(int iData = -1); diff --git a/Minecraft.World/SavedDataStorage.cpp b/Minecraft.World/SavedDataStorage.cpp index cacfa688..3dbd6400 100644 --- a/Minecraft.World/SavedDataStorage.cpp +++ b/Minecraft.World/SavedDataStorage.cpp @@ -43,6 +43,10 @@ shared_ptr SavedDataStorage::get(const type_info& clazz, const wstrin { data = dynamic_pointer_cast( shared_ptr(new Villages(id) ) ); } + else if( clazz == typeid(StructureFeatureSavedData) ) + { + data = dynamic_pointer_cast( shared_ptr( new StructureFeatureSavedData(id) ) ); + } else { // Handling of new SavedData class required diff --git a/Minecraft.World/ScatteredFeaturePieces.cpp b/Minecraft.World/ScatteredFeaturePieces.cpp index 07c2e7e6..317d6d9e 100644 --- a/Minecraft.World/ScatteredFeaturePieces.cpp +++ b/Minecraft.World/ScatteredFeaturePieces.cpp @@ -1,12 +1,30 @@ #include "stdafx.h" #include "net.minecraft.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "WeighedTreasure.h" #include "ScatteredFeaturePieces.h" +void ScatteredFeaturePieces::loadStatic() +{ + StructureFeatureIO::setPieceId(eStructurePiece_DesertPyramidPiece, DesertPyramidPiece::Create, L"TeDP"); + StructureFeatureIO::setPieceId(eStructurePiece_JunglePyramidPiece, DesertPyramidPiece::Create, L"TeJP"); + StructureFeatureIO::setPieceId(eStructurePiece_SwamplandHut, DesertPyramidPiece::Create, L"TeSH"); +} + +ScatteredFeaturePieces::ScatteredFeaturePiece::ScatteredFeaturePiece() +{ + width = 0; + height = 0; + depth = 0; + heightPosition = 0; + // for reflection +} + ScatteredFeaturePieces::ScatteredFeaturePiece::ScatteredFeaturePiece(Random *random, int west, int floor, int north, int width, int height, int depth) : StructurePiece(0) { heightPosition = -1; @@ -16,6 +34,16 @@ ScatteredFeaturePieces::ScatteredFeaturePiece::ScatteredFeaturePiece(Random *ran orientation = random->nextInt(4); + LevelGenerationOptions *levelGenOptions = app.getLevelGenerationOptions(); + if( levelGenOptions != NULL ) + { + int tempOrientation = 0; + if(levelGenOptions->isFeatureChunk(west>>4,north>>4,StructureFeature::eFeature_Temples, &tempOrientation) ) + { + orientation = tempOrientation; + } + } + switch (orientation) { case Direction::NORTH: @@ -28,6 +56,22 @@ ScatteredFeaturePieces::ScatteredFeaturePiece::ScatteredFeaturePiece(Random *ran } } +void ScatteredFeaturePieces::ScatteredFeaturePiece::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putInt(L"Width", width); + tag->putInt(L"Height", height); + tag->putInt(L"Depth", depth); + tag->putInt(L"HPos", heightPosition); +} + +void ScatteredFeaturePieces::ScatteredFeaturePiece::readAdditonalSaveData(CompoundTag *tag) +{ + width = tag->getInt(L"Width"); + height = tag->getInt(L"Height"); + depth = tag->getInt(L"Depth"); + heightPosition = tag->getInt(L"HPos"); +} + bool ScatteredFeaturePieces::ScatteredFeaturePiece::updateAverageGroundHeight(Level *level, BoundingBox *chunkBB, int offset) { if (heightPosition >= 0) @@ -66,8 +110,23 @@ WeighedTreasure *ScatteredFeaturePieces::DesertPyramidPiece::treasureItems[Scatt new WeighedTreasure(Item::emerald_Id, 0, 1, 3, 2), new WeighedTreasure(Item::bone_Id, 0, 4, 6, 20), new WeighedTreasure(Item::rotten_flesh_Id, 0, 3, 7, 16), + // very rare for pyramids ... + new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 3), + new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 1), + // ... }; +ScatteredFeaturePieces::DesertPyramidPiece::DesertPyramidPiece() +{ + hasPlacedChest[0] = false; + hasPlacedChest[1] = false; + hasPlacedChest[2] = false; + hasPlacedChest[3] = false; + // for reflection +} + ScatteredFeaturePieces::DesertPyramidPiece::DesertPyramidPiece(Random *random, int west, int north) : ScatteredFeaturePiece(random, west, 64, north, 21, 15, 21) { hasPlacedChest[0] = false; @@ -76,6 +135,24 @@ ScatteredFeaturePieces::DesertPyramidPiece::DesertPyramidPiece(Random *random, i hasPlacedChest[3] = false; } +void ScatteredFeaturePieces::DesertPyramidPiece::addAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::addAdditonalSaveData(tag); + tag->putBoolean(L"hasPlacedChest0", hasPlacedChest[0]); + tag->putBoolean(L"hasPlacedChest1", hasPlacedChest[1]); + tag->putBoolean(L"hasPlacedChest2", hasPlacedChest[2]); + tag->putBoolean(L"hasPlacedChest3", hasPlacedChest[3]); +} + +void ScatteredFeaturePieces::DesertPyramidPiece::readAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::readAdditonalSaveData(tag); + hasPlacedChest[0] = tag->getBoolean(L"hasPlacedChest0"); + hasPlacedChest[1] = tag->getBoolean(L"hasPlacedChest1"); + hasPlacedChest[2] = tag->getBoolean(L"hasPlacedChest2"); + hasPlacedChest[3] = tag->getBoolean(L"hasPlacedChest3"); +} + bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { // pyramid @@ -181,41 +258,41 @@ bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Rando placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, width - 5, 1, z, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, width - 5, 2, z, chunkBB); } - placeBlock(level, Tile::cloth_Id, baseDecoColor, 10, 0, 7, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 10, 0, 8, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 9, 0, 9, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 11, 0, 9, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 8, 0, 10, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 12, 0, 10, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 7, 0, 10, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 13, 0, 10, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 9, 0, 11, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 11, 0, 11, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 10, 0, 12, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 10, 0, 13, chunkBB); - placeBlock(level, Tile::cloth_Id, blue, 10, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 10, 0, 7, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 10, 0, 8, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 9, 0, 9, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 11, 0, 9, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 8, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 12, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 7, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 13, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 9, 0, 11, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 11, 0, 11, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 10, 0, 12, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 10, 0, 13, chunkBB); + placeBlock(level, Tile::wool_Id, blue, 10, 0, 10, chunkBB); // outdoor decoration for (int x = 0; x <= width - 1; x += width - 1) { placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 2, 1, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 2, 2, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 2, 2, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 2, 3, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 3, 1, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 3, 2, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 3, 2, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 3, 3, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 4, 1, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 4, 1, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, x, 4, 2, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 4, 3, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 4, 3, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 5, 1, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 5, 2, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 5, 2, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 5, 3, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 6, 1, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 6, 1, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, x, 6, 2, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 6, 3, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 7, 1, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 7, 2, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 7, 3, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 6, 3, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 7, 1, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 7, 2, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 7, 3, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 8, 1, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 8, 2, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 8, 3, chunkBB); @@ -223,23 +300,23 @@ bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Rando for (int x = 2; x <= width - 3; x += width - 3 - 2) { placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x - 1, 2, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 2, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 2, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x + 1, 2, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x - 1, 3, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 3, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 3, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x + 1, 3, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x - 1, 4, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x - 1, 4, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, x, 4, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x + 1, 4, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x + 1, 4, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x - 1, 5, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 5, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 5, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x + 1, 5, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x - 1, 6, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x - 1, 6, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, x, 6, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x + 1, 6, 00, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x - 1, 7, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 7, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x + 1, 7, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x + 1, 6, 00, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x - 1, 7, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 7, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x + 1, 7, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x - 1, 8, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 8, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x + 1, 8, 0, chunkBB); @@ -247,9 +324,9 @@ bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Rando generateBox(level, chunkBB, 8, 4, 0, 12, 6, 0, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, false); placeBlock(level, 0, 0, 8, 6, 0, chunkBB); placeBlock(level, 0, 0, 12, 6, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 9, 5, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 9, 5, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, 10, 5, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 11, 5, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 11, 5, 0, chunkBB); // tombs generateBox(level, chunkBB, 8, -14, 8, 12, -11, 12, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, false); @@ -289,7 +366,7 @@ bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Rando return true; } - + WeighedTreasure *ScatteredFeaturePieces::JunglePyramidPiece::treasureItems[ScatteredFeaturePieces::JunglePyramidPiece::TREASURE_ITEMS_COUNT] = { new WeighedTreasure(Item::diamond_Id, 0, 1, 3, 3), @@ -298,6 +375,12 @@ WeighedTreasure *ScatteredFeaturePieces::JunglePyramidPiece::treasureItems[Scatt new WeighedTreasure(Item::emerald_Id, 0, 1, 3, 2), new WeighedTreasure(Item::bone_Id, 0, 4, 6, 20), new WeighedTreasure(Item::rotten_flesh_Id, 0, 3, 7, 16), + // very rare for pyramids ... + new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 3), + new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 1), + // ... }; @@ -307,6 +390,11 @@ WeighedTreasure *ScatteredFeaturePieces::JunglePyramidPiece::dispenserItems[Scat // new WeighedTreasure(Item.fireball.id, 0, 1, 1, 10), }; +ScatteredFeaturePieces::JunglePyramidPiece::JunglePyramidPiece() +{ + // for reflection +} + ScatteredFeaturePieces::JunglePyramidPiece::JunglePyramidPiece(Random *random, int west, int north) : ScatteredFeaturePiece(random, west, 64, north, 12, 10, 15) { placedMainChest = false; @@ -315,6 +403,24 @@ ScatteredFeaturePieces::JunglePyramidPiece::JunglePyramidPiece(Random *random, i placedTrap2 = false; } +void ScatteredFeaturePieces::JunglePyramidPiece::addAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::addAdditonalSaveData(tag); + tag->putBoolean(L"placedMainChest", placedMainChest); + tag->putBoolean(L"placedHiddenChest", placedHiddenChest); + tag->putBoolean(L"placedTrap1", placedTrap1); + tag->putBoolean(L"placedTrap2", placedTrap2); +} + +void ScatteredFeaturePieces::JunglePyramidPiece::readAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::readAdditonalSaveData(tag); + placedMainChest = tag->getBoolean(L"placedMainChest"); + placedHiddenChest = tag->getBoolean(L"placedHiddenChest"); + placedTrap1 = tag->getBoolean(L"placedTrap1"); + placedTrap2 = tag->getBoolean(L"placedTrap2"); +} + bool ScatteredFeaturePieces::JunglePyramidPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { if (!updateAverageGroundHeight(level, chunkBB, 0)) @@ -457,7 +563,7 @@ bool ScatteredFeaturePieces::JunglePyramidPiece::postProcess(Level *level, Rando placeBlock(level, Tile::redStoneDust_Id, 0, 5, -3, 2, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 5, -3, 1, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 4, -3, 1, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 3, -3, 1, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 3, -3, 1, chunkBB); if (!placedTrap1) { placedTrap1 = createDispenser(level, chunkBB, random, 3, -2, 1, Facing::NORTH, WeighedTreasureArray(dispenserItems,DISPENSER_ITEMS_COUNT), 2); @@ -473,7 +579,7 @@ bool ScatteredFeaturePieces::JunglePyramidPiece::postProcess(Level *level, Rando placeBlock(level, Tile::redStoneDust_Id, 0, 8, -3, 6, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 9, -3, 6, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 9, -3, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 9, -3, 4, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 9, -3, 4, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 9, -2, 4, chunkBB); if (!placedTrap2) { @@ -485,28 +591,28 @@ bool ScatteredFeaturePieces::JunglePyramidPiece::postProcess(Level *level, Rando { placedMainChest = createChest(level, chunkBB, random, 8, -3, 3, WeighedTreasure::addToTreasure(WeighedTreasureArray(treasureItems,TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random)), 2 + random->nextInt(5)); } - placeBlock(level, Tile::mossStone_Id, 0, 9, -3, 2, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 8, -3, 1, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 4, -3, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 5, -2, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 5, -1, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 6, -3, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 7, -2, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 7, -1, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 8, -3, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 9, -3, 2, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 8, -3, 1, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 4, -3, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 5, -2, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 5, -1, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 6, -3, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 7, -2, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 7, -1, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 8, -3, 5, chunkBB); generateBox(level, chunkBB, 9, -1, 1, 9, -1, 5, false, random, &stoneSelector); // hidden room generateAirBox(level, chunkBB, 8, -3, 8, 10, -1, 10); - placeBlock(level, Tile::stoneBrickSmooth_Id, SmoothStoneBrickTile::TYPE_DETAIL, 8, -2, 11, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, SmoothStoneBrickTile::TYPE_DETAIL, 9, -2, 11, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, SmoothStoneBrickTile::TYPE_DETAIL, 10, -2, 11, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, SmoothStoneBrickTile::TYPE_DETAIL, 8, -2, 11, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, SmoothStoneBrickTile::TYPE_DETAIL, 9, -2, 11, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, SmoothStoneBrickTile::TYPE_DETAIL, 10, -2, 11, chunkBB); placeBlock(level, Tile::lever_Id, LeverTile::getLeverFacing(getOrientationData(Tile::lever_Id, Facing::NORTH)), 8, -2, 12, chunkBB); placeBlock(level, Tile::lever_Id, LeverTile::getLeverFacing(getOrientationData(Tile::lever_Id, Facing::NORTH)), 9, -2, 12, chunkBB); placeBlock(level, Tile::lever_Id, LeverTile::getLeverFacing(getOrientationData(Tile::lever_Id, Facing::NORTH)), 10, -2, 12, chunkBB); generateBox(level, chunkBB, 8, -3, 8, 8, -3, 10, false, random, &stoneSelector); generateBox(level, chunkBB, 10, -3, 8, 10, -3, 10, false, random, &stoneSelector); - placeBlock(level, Tile::mossStone_Id, 0, 10, -2, 9, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 10, -2, 9, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 8, -2, 9, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 8, -2, 10, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 10, -1, 9, chunkBB); @@ -526,12 +632,117 @@ void ScatteredFeaturePieces::JunglePyramidPiece::MossStoneSelector::next(Random { if (random->nextFloat() < .4f) { - nextId = Tile::stoneBrick_Id; + nextId = Tile::cobblestone_Id; } else { - nextId = Tile::mossStone_Id; + nextId = Tile::mossyCobblestone_Id; } } -ScatteredFeaturePieces::JunglePyramidPiece::MossStoneSelector ScatteredFeaturePieces::JunglePyramidPiece::stoneSelector; \ No newline at end of file +ScatteredFeaturePieces::JunglePyramidPiece::MossStoneSelector ScatteredFeaturePieces::JunglePyramidPiece::stoneSelector; + +ScatteredFeaturePieces::SwamplandHut::SwamplandHut() +{ + spawnedWitch = false; + // for reflection +} + +ScatteredFeaturePieces::SwamplandHut::SwamplandHut(Random *random, int west, int north) : ScatteredFeaturePiece(random, west, 64, north, 7, 5, 9) +{ + spawnedWitch = false; +} + +void ScatteredFeaturePieces::SwamplandHut::addAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Witch", spawnedWitch); +} + +void ScatteredFeaturePieces::SwamplandHut::readAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::readAdditonalSaveData(tag); + spawnedWitch = tag->getBoolean(L"Witch"); +} + +bool ScatteredFeaturePieces::SwamplandHut::postProcess(Level *level, Random *random, BoundingBox *chunkBB) +{ + if (!updateAverageGroundHeight(level, chunkBB, 0)) + { + return false; + } + + // floor and ceiling + generateBox(level, chunkBB, 1, 1, 1, 5, 1, 7, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 1, 4, 2, 5, 4, 7, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 2, 1, 0, 4, 1, 0, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + + // walls + generateBox(level, chunkBB, 2, 2, 2, 3, 3, 2, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 1, 2, 3, 1, 3, 6, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 5, 2, 3, 5, 3, 6, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 2, 2, 7, 4, 3, 7, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + + // pillars + generateBox(level, chunkBB, 1, 0, 2, 1, 3, 2, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); + generateBox(level, chunkBB, 5, 0, 2, 5, 3, 2, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); + generateBox(level, chunkBB, 1, 0, 7, 1, 3, 7, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); + generateBox(level, chunkBB, 5, 0, 7, 5, 3, 7, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); + + // windows + placeBlock(level, Tile::fence_Id, 0, 2, 3, 2, chunkBB); + placeBlock(level, Tile::fence_Id, 0, 3, 3, 7, chunkBB); + placeBlock(level, 0, 0, 1, 3, 4, chunkBB); + placeBlock(level, 0, 0, 5, 3, 4, chunkBB); + placeBlock(level, 0, 0, 5, 3, 5, chunkBB); + placeBlock(level, Tile::flowerPot_Id, FlowerPotTile::TYPE_MUSHROOM_RED, 1, 3, 5, chunkBB); + + // decoration + placeBlock(level, Tile::workBench_Id, 0, 3, 2, 6, chunkBB); + placeBlock(level, Tile::cauldron_Id, 0, 4, 2, 6, chunkBB); + + // front railings + placeBlock(level, Tile::fence_Id, 0, 1, 2, 1, chunkBB); + placeBlock(level, Tile::fence_Id, 0, 5, 2, 1, chunkBB); + // placeBlock(level, Tile.torch.id, 0, 1, 3, 1, chunkBB); + // placeBlock(level, Tile.torch.id, 0, 5, 3, 1, chunkBB); + + // ceiling edges + int south = getOrientationData(Tile::stairs_wood_Id, StairTile::DIR_NORTH); + int east = getOrientationData(Tile::stairs_wood_Id, StairTile::DIR_WEST); + int west = getOrientationData(Tile::stairs_wood_Id, StairTile::DIR_EAST); + int north = getOrientationData(Tile::stairs_wood_Id, StairTile::DIR_SOUTH); + + generateBox(level, chunkBB, 0, 4, 1, 6, 4, 1, Tile::stairs_sprucewood_Id, south, Tile::stairs_sprucewood_Id, south, false); + generateBox(level, chunkBB, 0, 4, 2, 0, 4, 7, Tile::stairs_sprucewood_Id, west, Tile::stairs_sprucewood_Id, west, false); + generateBox(level, chunkBB, 6, 4, 2, 6, 4, 7, Tile::stairs_sprucewood_Id, east, Tile::stairs_sprucewood_Id, east, false); + generateBox(level, chunkBB, 0, 4, 8, 6, 4, 8, Tile::stairs_sprucewood_Id, north, Tile::stairs_sprucewood_Id, north, false); + + // fill pillars down to solid ground + for (int z = 2; z <= 7; z += 5) + { + for (int x = 1; x <= 5; x += 4) + { + fillColumnDown(level, Tile::treeTrunk_Id, 0, x, -1, z, chunkBB); + } + } + + if (!spawnedWitch) + { + int wx = getWorldX(2, 5); + int wy = getWorldY(2); + int wz = getWorldZ(2, 5); + + if (chunkBB->isInside(wx, wy, wz)) + { + spawnedWitch = true; + + shared_ptr witch = shared_ptr( new Witch(level) ); + witch->moveTo(wx + .5, wy, wz + .5, 0, 0); + witch->finalizeMobSpawn(NULL); + level->addEntity(witch); + } + } + + return true; +} \ No newline at end of file diff --git a/Minecraft.World/ScatteredFeaturePieces.h b/Minecraft.World/ScatteredFeaturePieces.h index 08ab92ba..5fb334df 100644 --- a/Minecraft.World/ScatteredFeaturePieces.h +++ b/Minecraft.World/ScatteredFeaturePieces.h @@ -4,6 +4,9 @@ class ScatteredFeaturePieces { +public: + static void loadStatic(); + private: class ScatteredFeaturePiece : public StructurePiece { @@ -14,8 +17,11 @@ private: int heightPosition; + ScatteredFeaturePiece(); ScatteredFeaturePiece(Random *random, int west, int floor, int north, int width, int height, int depth); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); bool updateAverageGroundHeight(Level *level, BoundingBox *chunkBB, int offset); }; @@ -23,14 +29,23 @@ public: class DesertPyramidPiece : public ScatteredFeaturePiece { public: - static const int TREASURE_ITEMS_COUNT = 6; + static StructurePiece *Create() { return new DesertPyramidPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_DesertPyramidPiece; } + + public: + static const int TREASURE_ITEMS_COUNT = 10; private: bool hasPlacedChest[4]; static WeighedTreasure *treasureItems[TREASURE_ITEMS_COUNT]; public: + DesertPyramidPiece(); DesertPyramidPiece(Random *random, int west, int north); + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); }; @@ -38,7 +53,11 @@ public: class JunglePyramidPiece : public ScatteredFeaturePiece { public: - static const int TREASURE_ITEMS_COUNT = 6; + static StructurePiece *Create() { return new JunglePyramidPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_JunglePyramidPiece; } + + public: + static const int TREASURE_ITEMS_COUNT = 10; static const int DISPENSER_ITEMS_COUNT = 1; private: bool placedMainChest; @@ -50,8 +69,14 @@ public: static WeighedTreasure *dispenserItems[DISPENSER_ITEMS_COUNT]; public: + JunglePyramidPiece(); JunglePyramidPiece(Random *random, int west, int north); + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); private: @@ -64,4 +89,25 @@ public: static MossStoneSelector stoneSelector; }; + + class SwamplandHut : public ScatteredFeaturePiece + { + public: + static StructurePiece *Create() { return new SwamplandHut(); } + virtual EStructurePiece GetType() { return eStructurePiece_SwamplandHut; } + + private: + bool spawnedWitch; + + public: + SwamplandHut(); + SwamplandHut(Random *random, int west, int north); + + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; }; \ No newline at end of file diff --git a/Minecraft.World/Score.cpp b/Minecraft.World/Score.cpp new file mode 100644 index 00000000..039939b1 --- /dev/null +++ b/Minecraft.World/Score.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "net.minecraft.world.scores.criteria.h" +#include "Score.h" + +Score::Score(Scoreboard *scoreboard, Objective *objective, const wstring &owner) +{ + this->scoreboard = scoreboard; + this->objective = objective; + this->owner = owner; + count = 0; +} + +void Score::add(int count) +{ + //if (objective.getCriteria().isReadOnly()) throw new IllegalStateException("Cannot modify read-only score"); + setScore(getScore() + count); +} + +void Score::remove(int count) +{ + //if (objective.getCriteria().isReadOnly()) throw new IllegalStateException("Cannot modify read-only score"); + setScore(getScore() - count); +} + +void Score::increment() +{ + //if (objective.getCriteria().isReadOnly()) throw new IllegalStateException("Cannot modify read-only score"); + add(1); +} + +void Score::decrement() +{ + //if (objective.getCriteria().isReadOnly()) throw new IllegalStateException("Cannot modify read-only score"); + remove(1); +} + +int Score::getScore() +{ + return count; +} + +void Score::setScore(int score) +{ + int old = count; + count = score; + if (old != score) getScoreboard()->onScoreChanged(this); +} + +Objective *Score::getObjective() +{ + return objective; +} + +wstring Score::getOwner() +{ + return owner; +} + +Scoreboard *Score::getScoreboard() +{ + return scoreboard; +} + +void Score::updateFor(vector > *players) +{ + setScore(objective->getCriteria()->getScoreModifier(players)); +} \ No newline at end of file diff --git a/Minecraft.World/Score.h b/Minecraft.World/Score.h new file mode 100644 index 00000000..2a32f138 --- /dev/null +++ b/Minecraft.World/Score.h @@ -0,0 +1,44 @@ +#pragma once + +class Scoreboard; +class Objective; + +class Score +{ +public: + // 4J Not converted +#if 0 + static final Comparator SCORE_COMPARATOR = new Comparator() { + @Override + public int compare(Score o1, Score o2) { + if (o1.getScore() > o2.getScore()) { + return 1; + } else if (o1.getScore() < o2.getScore()) { + return -1; + } else { + return 0; + } + } + }; +#endif + +private: + Scoreboard *scoreboard; + Objective *objective; + wstring owner; + int count; + +public: + Score(Scoreboard *scoreboard, Objective *objective, const wstring &owner); + + void add(int count); + void remove(int count); + void increment(); + void decrement(); + int getScore(); + void setScore(int score); + Objective *getObjective(); + wstring getOwner(); + Scoreboard *getScoreboard(); + void updateFor(vector > *players); +}; \ No newline at end of file diff --git a/Minecraft.World/ScoreHolder.h b/Minecraft.World/ScoreHolder.h new file mode 100644 index 00000000..72a43de3 --- /dev/null +++ b/Minecraft.World/ScoreHolder.h @@ -0,0 +1,9 @@ +#pragma once + +class Scoreboard; + +class ScoreHolder +{ +public: + virtual Scoreboard *getScoreboard() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/Scoreboard.cpp b/Minecraft.World/Scoreboard.cpp new file mode 100644 index 00000000..5c6f2ebd --- /dev/null +++ b/Minecraft.World/Scoreboard.cpp @@ -0,0 +1,328 @@ +#include "stdafx.h" + +#include "Scoreboard.h" + +Objective *Scoreboard::getObjective(const wstring &name) +{ + return NULL; + //return objectivesByName.find(name)->second; +} + +Objective *Scoreboard::addObjective(const wstring &name, ObjectiveCriteria *criteria) +{ + return NULL; +// Objective *objective = getObjective(name); +// if (objective != NULL) +// { +//#indef _CONTENT_PACKAGE +// __debugbreak(); +//#endif +// //throw new IllegalArgumentException("An objective with the name '" + name + "' already exists!"); +// } +// +// objective = new Objective(this, name, criteria); +// +// vector *criteriaList = objectivesByCriteria.find(criteria)->second; +// +// if (criteriaList == NULL) +// { +// criteriaList = new vector(); +// objectivesByCriteria[criteria] = criteriaList; +// } +// +// criteriaList->push_back(objective); +// objectivesByName[name] = objective; +// onObjectiveAdded(objective); +// +// return objective; +} + +vector *Scoreboard::findObjectiveFor(ObjectiveCriteria *criteria) +{ + return NULL; + //vector *objectives = objectivesByCriteria.find(criteria)->second; + + //return objectives == NULL ? new vector() : new vector(objectives); +} + +Score *Scoreboard::getPlayerScore(const wstring &name, Objective *objective) +{ + return NULL; + //unordered_map *scores = playerScores.find(name)->it; + + //if (scores == NULL) + //{ + // scores = new unordered_map(); + // playerScores.put(name, scores); + //} + + //Score *score = scores->get(objective); + + //if (score == NULL) + //{ + // score = new Score(this, objective, name); + // scores->put(objective, score); + //} + + //return score; +} + +vector *Scoreboard::getPlayerScores(Objective *objective) +{ + return NULL; + //vector *result = new vector(); + + //for (Map scores : playerScores.values()) + //{ + // Score score = scores.get(objective); + // if (score != null) result.add(score); + //} + + //Collections.sort(result, Score.SCORE_COMPARATOR); + + //return result; +} + +vector *Scoreboard::getObjectives() +{ + return NULL; + //return objectivesByName.values(); +} + +vector *Scoreboard::getTrackedPlayers() +{ + return NULL; + //return playerScores.keySet(); +} + +void Scoreboard::resetPlayerScore(const wstring &player) +{ + //unordered_map *removed = playerScores.remove(player); + + //if (removed != NULL) + //{ + // onPlayerRemoved(player); + //} +} + +vector *Scoreboard::getScores() +{ + return NULL; + //Collection> values = playerScores.values(); + //List result = new ArrayList(); + + //for (Map map : values) + //{ + // result.addAll(map.values()); + //} + + //return result; +} + +vector *Scoreboard::getScores(Objective *objective) +{ + return NULL; + //Collection> values = playerScores.values(); + //List result = new ArrayList(); + + //for (Map map : values) { + // Score score = map.get(objective); + // if (score != null) result.add(score); + //} + + //return result; +} + +unordered_map *Scoreboard::getPlayerScores(const wstring &player) +{ + return NULL; + //Map result = playerScores.get(player); + //if (result == null) result = new HashMap(); + //return result; +} + +void Scoreboard::removeObjective(Objective *objective) +{ + //objectivesByName.remove(objective.getName()); + + //for (int i = 0; i < DISPLAY_SLOTS; i++) { + // if (getDisplayObjective(i) == objective) setDisplayObjective(i, null); + //} + + //List objectives = objectivesByCriteria.get(objective.getCriteria()); + //if (objectives != null) objectives.remove(objective); + + //for (Map objectiveScoreMap : playerScores.values()) { + // objectiveScoreMap.remove(objective); + //} + + //onObjectiveRemoved(objective); +} + +void Scoreboard::setDisplayObjective(int slot, Objective *objective) +{ + //displayObjectives[slot] = objective; +} + +Objective *Scoreboard::getDisplayObjective(int slot) +{ + return NULL; + //return displayObjectives[slot]; +} + +PlayerTeam *Scoreboard::getPlayerTeam(const wstring &name) +{ + return NULL; + //return teamsByName.get(name); +} + +PlayerTeam *Scoreboard::addPlayerTeam(const wstring &name) +{ + return NULL; + //PlayerTeam team = getPlayerTeam(name); + //if (team != null) throw new IllegalArgumentException("An objective with the name '" + name + "' already exists!"); + + //team = new PlayerTeam(this, name); + //teamsByName.put(name, team); + //onTeamAdded(team); + + //return team; +} + +void Scoreboard::removePlayerTeam(PlayerTeam *team) +{ + //teamsByName.remove(team.getName()); + + //// [TODO]: Loop through scores, remove. + + //for (String player : team.getPlayers()) { + // teamsByPlayer.remove(player); + //} + + //onTeamRemoved(team); +} + +void Scoreboard::addPlayerToTeam(const wstring &player, PlayerTeam *team) +{ + //if (getPlayersTeam(player) != null) { + // removePlayerFromTeam(player); + //} + + //teamsByPlayer.put(player, team); + //team.getPlayers().add(player); +} + +bool Scoreboard::removePlayerFromTeam(const wstring &player) +{ + return false; + //PlayerTeam team = getPlayersTeam(player); + + //if (team != null) { + // removePlayerFromTeam(player, team); + // return true; + //} else { + // return false; + //} +} + +void Scoreboard::removePlayerFromTeam(const wstring &player, PlayerTeam *team) +{ + //if (getPlayersTeam(player) != team) { + // throw new IllegalStateException("Player is either on another team or not on any team. Cannot remove from team '" + team.getName() + "'."); + //} + + //teamsByPlayer.remove(player); + //team.getPlayers().remove(player); +} + +vector *Scoreboard::getTeamNames() +{ + return NULL; + //return teamsByName.keySet(); +} + +vector *Scoreboard::getPlayerTeams() +{ + return NULL; + //return teamsByName.values(); +} + +shared_ptr Scoreboard::getPlayer(const wstring &name) +{ + return nullptr; + //return MinecraftServer.getInstance().getPlayers().getPlayer(name); +} + +PlayerTeam *Scoreboard::getPlayersTeam(const wstring &name) +{ + return NULL; + //return teamsByPlayer.get(name); +} + +void Scoreboard::onObjectiveAdded(Objective *objective) +{ +} + +void Scoreboard::onObjectiveChanged(Objective *objective) +{ +} + +void Scoreboard::onObjectiveRemoved(Objective *objective) +{ +} + +void Scoreboard::onScoreChanged(Score *score) +{ +} + +void Scoreboard::onPlayerRemoved(const wstring &player) +{ +} + +void Scoreboard::onTeamAdded(PlayerTeam *team) +{ +} + +void Scoreboard::onTeamChanged(PlayerTeam *team) +{ +} + +void Scoreboard::onTeamRemoved(PlayerTeam *team) +{ +} + +wstring Scoreboard::getDisplaySlotName(int slot) +{ + switch (slot) + { + case DISPLAY_SLOT_LIST: + return L"list"; + case DISPLAY_SLOT_SIDEBAR: + return L"sidebar"; + case DISPLAY_SLOT_BELOW_NAME: + return L"belowName"; + default: + return L""; + } +} + +int Scoreboard::getDisplaySlotByName(const wstring &name) +{ + return -1; + //if (name.equalsIgnoreCase("list")) + //{ + // return DISPLAY_SLOT_LIST; + //} + //else if (name.equalsIgnoreCase("sidebar")) + //{ + // return DISPLAY_SLOT_SIDEBAR; + //} + //else if (name.equalsIgnoreCase("belowName")) + //{ + // return DISPLAY_SLOT_BELOW_NAME; + //} + //else + //{ + // return -1; + //} +} \ No newline at end of file diff --git a/Minecraft.World/Scoreboard.h b/Minecraft.World/Scoreboard.h new file mode 100644 index 00000000..13168f0b --- /dev/null +++ b/Minecraft.World/Scoreboard.h @@ -0,0 +1,59 @@ +#pragma once + +class Objective; +class ObjectiveCriteria; +class PlayerTeam; +class Score; + +class Scoreboard +{ +public: + static const int DISPLAY_SLOT_LIST = 0; + static const int DISPLAY_SLOT_SIDEBAR = 1; + static const int DISPLAY_SLOT_BELOW_NAME = 2; + static const int DISPLAY_SLOTS = 3; + +private: + unordered_map objectivesByName; + unordered_map *> objectivesByCriteria; + unordered_map > playerScores; + Objective *displayObjectives[DISPLAY_SLOTS]; + unordered_map teamsByName; + unordered_map teamsByPlayer; + +public: + Objective *getObjective(const wstring &name); + Objective *addObjective(const wstring &name, ObjectiveCriteria *criteria); + vector *findObjectiveFor(ObjectiveCriteria *criteria); + Score *getPlayerScore(const wstring &name, Objective *objective); + vector *getPlayerScores(Objective *objective); + vector *getObjectives(); + vector *getTrackedPlayers(); + void resetPlayerScore(const wstring &player); + vector *getScores(); + vector *getScores(Objective *objective); + unordered_map *getPlayerScores(const wstring &player); + void removeObjective(Objective *objective); + void setDisplayObjective(int slot, Objective *objective); + Objective *getDisplayObjective(int slot); + PlayerTeam *getPlayerTeam(const wstring &name); + PlayerTeam *addPlayerTeam(const wstring &name); + void removePlayerTeam(PlayerTeam *team); + void addPlayerToTeam(const wstring &player, PlayerTeam *team); + bool removePlayerFromTeam(const wstring &player); + void removePlayerFromTeam(const wstring &player, PlayerTeam *team); + vector *getTeamNames(); + vector *getPlayerTeams(); + shared_ptr getPlayer(const wstring &name); + PlayerTeam *getPlayersTeam(const wstring &name); + void onObjectiveAdded(Objective *objective); + void onObjectiveChanged(Objective *objective); + void onObjectiveRemoved(Objective *objective); + void onScoreChanged(Score *score); + void onPlayerRemoved(const wstring &player); + void onTeamAdded(PlayerTeam *team); + void onTeamChanged(PlayerTeam *team); + void onTeamRemoved(PlayerTeam *team); + static wstring getDisplaySlotName(int slot); + static int getDisplaySlotByName(const wstring &name); +}; \ No newline at end of file diff --git a/Minecraft.World/ScoreboardSaveData.h b/Minecraft.World/ScoreboardSaveData.h new file mode 100644 index 00000000..4a59b45e --- /dev/null +++ b/Minecraft.World/ScoreboardSaveData.h @@ -0,0 +1,189 @@ +#pragma once + +// 4J Not converted +#if 0 +class ScoreboardSaveData extends SavedData { + public static final String FILE_ID = "scoreboard"; + + private Scoreboard scoreboard; + private CompoundTag delayLoad; + + public ScoreboardSaveData() { + this(FILE_ID); + } + + public ScoreboardSaveData(String id) { + super(id); + } + + public void setScoreboard(Scoreboard scoreboard) { + this.scoreboard = scoreboard; + + if (delayLoad != null) { + load(delayLoad); + } + } + + @Override + public void load(CompoundTag tag) { + if (scoreboard == null) { + delayLoad = tag; + return; + } + + loadObjectives((ListTag) tag.getList("Objectives")); + loadPlayerScores((ListTag) tag.getList("PlayerScores")); + + if (tag.contains("DisplaySlots")) { + loadDisplaySlots(tag.getCompound("DisplaySlots")); + } + + if (tag.contains("Teams")) { + loadTeams((ListTag) tag.getList("Teams")); + } + } + + protected void loadTeams(ListTag list) { + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.get(i); + + PlayerTeam team = scoreboard.addPlayerTeam(tag.getString("Name")); + team.setDisplayName(tag.getString("DisplayName")); + team.setPrefix(tag.getString("Prefix")); + team.setSuffix(tag.getString("Suffix")); + if (tag.contains("AllowFriendlyFire")) team.setAllowFriendlyFire(tag.getBoolean("AllowFriendlyFire")); + if (tag.contains("SeeFriendlyInvisibles")) team.setSeeFriendlyInvisibles(tag.getBoolean("SeeFriendlyInvisibles")); + + loadTeamPlayers(team, (ListTag) tag.getList("Players")); + } + } + + protected void loadTeamPlayers(PlayerTeam team, ListTag list) { + for (int i = 0; i < list.size(); i++) { + scoreboard.addPlayerToTeam(list.get(i).data, team); + } + } + + protected void loadDisplaySlots(CompoundTag tag) { + for (int i = 0; i < Scoreboard.DISPLAY_SLOTS; i++) { + if (tag.contains("slot_" + i)) { + String name = tag.getString("slot_" + i); + Objective objective = scoreboard.getObjective(name); + scoreboard.setDisplayObjective(i, objective); + } + } + } + + protected void loadObjectives(ListTag list) { + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.get(i); + + ObjectiveCriteria criteria = ObjectiveCriteria.CRITERIA_BY_NAME.get(tag.getString("CriteriaName")); + Objective objective = scoreboard.addObjective(tag.getString("Name"), criteria); + objective.setDisplayName(tag.getString("DisplayName")); + } + } + + protected void loadPlayerScores(ListTag list) { + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.get(i); + + Objective objective = scoreboard.getObjective(tag.getString("Objective")); + Score score = scoreboard.getPlayerScore(tag.getString("Name"), objective); + score.setScore(tag.getInt("Score")); + } + } + + @Override + public void save(CompoundTag tag) { + if (scoreboard == null) { + MinecraftServer.getInstance().getLogger().warning("Tried to save scoreboard without having a scoreboard..."); + return; + } + + tag.put("Objectives", saveObjectives()); + tag.put("PlayerScores", savePlayerScores()); + tag.put("Teams", saveTeams()); + + saveDisplaySlots(tag); + } + + protected ListTag saveTeams() { + ListTag list = new ListTag(); + Collection teams = scoreboard.getPlayerTeams(); + + for (PlayerTeam team : teams) { + CompoundTag tag = new CompoundTag(); + + tag.putString("Name", team.getName()); + tag.putString("DisplayName", team.getDisplayName()); + tag.putString("Prefix", team.getPrefix()); + tag.putString("Suffix", team.getSuffix()); + tag.putBoolean("AllowFriendlyFire", team.isAllowFriendlyFire()); + tag.putBoolean("SeeFriendlyInvisibles", team.canSeeFriendlyInvisibles()); + + ListTag playerList = new ListTag(); + + for (String player : team.getPlayers()) { + playerList.add(new StringTag("", player)); + } + + tag.put("Players", playerList); + + list.add(tag); + } + + return list; + } + + protected void saveDisplaySlots(CompoundTag tag) { + CompoundTag slots = new CompoundTag(); + boolean hasDisplaySlot = false; + + for (int i = 0; i < Scoreboard.DISPLAY_SLOTS; i++) { + Objective objective = scoreboard.getDisplayObjective(i); + + if (objective != null) { + slots.putString("slot_" + i, objective.getName()); + hasDisplaySlot = true; + } + } + + if (hasDisplaySlot) tag.putCompound("DisplaySlots", slots); + } + + protected ListTag saveObjectives() { + ListTag list = new ListTag(); + Collection objectives = scoreboard.getObjectives(); + + for (Objective objective : objectives) { + CompoundTag tag = new CompoundTag(); + + tag.putString("Name", objective.getName()); + tag.putString("CriteriaName", objective.getCriteria().getName()); + tag.putString("DisplayName", objective.getDisplayName()); + + list.add(tag); + } + + return list; + } + + protected ListTag savePlayerScores() { + ListTag list = new ListTag(); + Collection scores = scoreboard.getScores(); + + for (Score score : scores) { + CompoundTag tag = new CompoundTag(); + + tag.putString("Name", score.getOwner()); + tag.putString("Objective", score.getObjective().getName()); + tag.putInt("Score", score.getScore()); + + list.add(tag); + } + + return list; + } +}; +#endif \ No newline at end of file diff --git a/Minecraft.World/SeedFoodItem.cpp b/Minecraft.World/SeedFoodItem.cpp index 4ba9a14a..8f5bfa92 100644 --- a/Minecraft.World/SeedFoodItem.cpp +++ b/Minecraft.World/SeedFoodItem.cpp @@ -15,14 +15,14 @@ bool SeedFoodItem::useOn(shared_ptr instance, shared_ptr p { if (face != Facing::UP) return false; - if (!player->mayBuild(x, y, z) || !player->mayBuild(x, y + 1, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance) || !player->mayUseItemAt(x, y + 1, z, face, instance)) return false; int targetType = level->getTile(x, y, z); if (targetType == targetLand && level->isEmptyTile(x, y + 1, z)) { if(!bTestUseOnOnly) { - level->setTile(x, y + 1, z, resultId); + level->setTileAndUpdate(x, y + 1, z, resultId); instance->count--; } return true; diff --git a/Minecraft.World/SeedItem.cpp b/Minecraft.World/SeedItem.cpp index 7a5ac1b8..87211d8b 100644 --- a/Minecraft.World/SeedItem.cpp +++ b/Minecraft.World/SeedItem.cpp @@ -10,27 +10,27 @@ using namespace std; SeedItem::SeedItem(int id, int resultId, int targetLand) : Item(id) { - this->resultId = resultId; + this->resultId = resultId; this->targetLand = targetLand; } bool SeedItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed - if (face != 1) return false; + if (face != 1) return false; - if (!player->mayBuild(x, y, z) || !player->mayBuild(x, y + 1, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance) || !player->mayUseItemAt(x, y + 1, z, face, instance)) return false; - int targetType = level->getTile(x, y, z); + int targetType = level->getTile(x, y, z); - if (targetType == targetLand && level->isEmptyTile(x, y + 1, z)) + if (targetType == targetLand && level->isEmptyTile(x, y + 1, z)) { if(!bTestUseOnOnly) { - level->setTile(x, y + 1, z, resultId); + level->setTileAndUpdate(x, y + 1, z, resultId); instance->count--; } - return true; - } - return false; + return true; + } + return false; } \ No newline at end of file diff --git a/Minecraft.World/ServersideAttributeMap.cpp b/Minecraft.World/ServersideAttributeMap.cpp new file mode 100644 index 00000000..ec75aa22 --- /dev/null +++ b/Minecraft.World/ServersideAttributeMap.cpp @@ -0,0 +1,83 @@ +#include "stdafx.h" + +#include "Attribute.h" +#include "RangedAttribute.h" +#include "AttributeInstance.h" +#include "ModifiableAttributeInstance.h" +#include "ServersideAttributeMap.h" + +AttributeInstance *ServersideAttributeMap::getInstance(Attribute *attribute) +{ + return BaseAttributeMap::getInstance(attribute); +} + +AttributeInstance *ServersideAttributeMap::getInstance(eATTRIBUTE_ID id) +{ + AttributeInstance *result = BaseAttributeMap::getInstance(id); + + // 4J: Removed legacy name + // If we didn't find it, search by legacy name + /*if (result == NULL) + { + AUTO_VAR(it, attributesByLegacy.find(name)); + if(it != attributesByLegacy.end()) + { + result = it->second; + } + }*/ + + return result; +} + +AttributeInstance *ServersideAttributeMap::registerAttribute(Attribute *attribute) +{ + AUTO_VAR(it,attributesById.find(attribute->getId())); + if (it != attributesById.end()) + { + return it->second; + } + + AttributeInstance *instance = new ModifiableAttributeInstance(this, attribute); + attributesById.insert(std::pair(attribute->getId(), instance)); + + // 4J: Removed legacy name + // If this is a ranged attribute also add to legacy name map + /*RangedAttribute *rangedAttribute = dynamic_cast(attribute); + if (rangedAttribute != NULL && rangedAttribute->getImportLegacyName() != L"") + { + attributesByLegacy.insert(std::pair(rangedAttribute->getImportLegacyName(), instance)); + }*/ + + return instance; +} + +void ServersideAttributeMap::onAttributeModified(ModifiableAttributeInstance *attributeInstance) +{ + if (attributeInstance->getAttribute()->isClientSyncable()) + { + dirtyAttributes.insert(attributeInstance); + } +} + +unordered_set *ServersideAttributeMap::getDirtyAttributes() +{ + return &dirtyAttributes; +} + +unordered_set *ServersideAttributeMap::getSyncableAttributes() +{ + unordered_set *result = new unordered_set(); + vector atts; + getAttributes(atts); + for (int i = 0; i < atts.size(); i++) + { + AttributeInstance *instance = atts.at(i); + + if (instance->getAttribute()->isClientSyncable()) + { + result->insert(instance); + } + } + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/ServersideAttributeMap.h b/Minecraft.World/ServersideAttributeMap.h new file mode 100644 index 00000000..b404eb9e --- /dev/null +++ b/Minecraft.World/ServersideAttributeMap.h @@ -0,0 +1,24 @@ +#pragma once + +#include "BaseAttributeMap.h" + +class ServersideAttributeMap : public BaseAttributeMap +{ +private: + unordered_set dirtyAttributes; + +protected: + // 4J: Remove legacy name + //unordered_map attributesByLegacy; + +public: + + // 4J-JEV: Changed from ModifiableAttributeInstance to AttributeInstance as they are not 'covariant' on PS4. + virtual AttributeInstance *getInstance(Attribute *attribute); + virtual AttributeInstance *getInstance(eATTRIBUTE_ID id); + + virtual AttributeInstance *registerAttribute(Attribute *attribute); + virtual void onAttributeModified(ModifiableAttributeInstance *attributeInstance); + virtual unordered_set *getDirtyAttributes(); + virtual unordered_set *getSyncableAttributes(); +}; \ No newline at end of file diff --git a/Minecraft.World/SetDisplayObjectivePacket.cpp b/Minecraft.World/SetDisplayObjectivePacket.cpp new file mode 100644 index 00000000..f1cffa4b --- /dev/null +++ b/Minecraft.World/SetDisplayObjectivePacket.cpp @@ -0,0 +1,46 @@ +#include "stdafx.h" +#include "PacketListener.h" +#include "net.minecraft.world.scores.h" +#include "SetDisplayObjectivePacket.h" + +SetDisplayObjectivePacket::SetDisplayObjectivePacket() +{ + slot = 0; + objectiveName = L""; +} + +SetDisplayObjectivePacket::SetDisplayObjectivePacket(int slot, Objective *objective) +{ + this->slot = slot; + + if (objective == NULL) + { + objectiveName = L""; + } + else + { + objectiveName = objective->getName(); + } +} + +void SetDisplayObjectivePacket::read(DataInputStream *dis) +{ + slot = dis->readByte(); + objectiveName = readUtf(dis, Objective::MAX_NAME_LENGTH); +} + +void SetDisplayObjectivePacket::write(DataOutputStream *dos) +{ + dos->writeByte(slot); + writeUtf(objectiveName, dos); +} + +void SetDisplayObjectivePacket::handle(PacketListener *listener) +{ + listener->handleSetDisplayObjective(shared_from_this()); +} + +int SetDisplayObjectivePacket::getEstimatedSize() +{ + return 1 + 2 + objectiveName.length(); +} \ No newline at end of file diff --git a/Minecraft.World/SetDisplayObjectivePacket.h b/Minecraft.World/SetDisplayObjectivePacket.h new file mode 100644 index 00000000..f32f6386 --- /dev/null +++ b/Minecraft.World/SetDisplayObjectivePacket.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Packet.h" + +class Objective; + +class SetDisplayObjectivePacket : public Packet, public enable_shared_from_this +{ +public: + int slot; + wstring objectiveName; + + SetDisplayObjectivePacket(); + SetDisplayObjectivePacket(int slot, Objective *objective); + + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new SetDisplayObjectivePacket()); } + virtual int getId() { return 208; } +}; \ No newline at end of file diff --git a/Minecraft.World/SetEntityDataPacket.cpp b/Minecraft.World/SetEntityDataPacket.cpp index 1538c152..9947c163 100644 --- a/Minecraft.World/SetEntityDataPacket.cpp +++ b/Minecraft.World/SetEntityDataPacket.cpp @@ -53,11 +53,6 @@ int SetEntityDataPacket::getEstimatedSize() return 5; } -bool SetEntityDataPacket::isAync() -{ - return true; -} - vector > *SetEntityDataPacket::getUnpackedData() { return packedItems; diff --git a/Minecraft.World/SetEntityDataPacket.h b/Minecraft.World/SetEntityDataPacket.h index 1b31aa4c..a3bb0860 100644 --- a/Minecraft.World/SetEntityDataPacket.h +++ b/Minecraft.World/SetEntityDataPacket.h @@ -21,7 +21,6 @@ public: virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); - virtual bool isAync(); vector > *getUnpackedData(); diff --git a/Minecraft.World/SetEntityLinkPacket.cpp b/Minecraft.World/SetEntityLinkPacket.cpp new file mode 100644 index 00000000..cae35e48 --- /dev/null +++ b/Minecraft.World/SetEntityLinkPacket.cpp @@ -0,0 +1,57 @@ +#include "stdafx.h" +#include +#include "InputOutputStream.h" +#include "PacketListener.h" +#include "net.minecraft.world.entity.h" +#include "SetEntityLinkPacket.h" + + + +SetEntityLinkPacket::SetEntityLinkPacket() +{ + sourceId = -1; + destId = -1; + type = -1; +} + +SetEntityLinkPacket::SetEntityLinkPacket(int linkType, shared_ptr sourceEntity, shared_ptr destEntity) +{ + type = linkType; + this->sourceId = sourceEntity->entityId; + this->destId = destEntity != NULL ? destEntity->entityId : -1; +} + +int SetEntityLinkPacket::getEstimatedSize() +{ + return 8; +} + +void SetEntityLinkPacket::read(DataInputStream *dis) //throws IOException +{ + sourceId = dis->readInt(); + destId = dis->readInt(); + type = dis->readUnsignedByte(); +} + +void SetEntityLinkPacket::write(DataOutputStream *dos) //throws IOException +{ + dos->writeInt(sourceId); + dos->writeInt(destId); + dos->writeByte(type); +} + +void SetEntityLinkPacket::handle(PacketListener *listener) +{ + listener->handleEntityLinkPacket(shared_from_this()); +} + +bool SetEntityLinkPacket::canBeInvalidated() +{ + return true; +} + +bool SetEntityLinkPacket::isInvalidatedBy(shared_ptr packet) +{ + shared_ptr target = dynamic_pointer_cast(packet); + return target->sourceId == sourceId; +} diff --git a/Minecraft.World/SetEntityLinkPacket.h b/Minecraft.World/SetEntityLinkPacket.h new file mode 100644 index 00000000..aa92206d --- /dev/null +++ b/Minecraft.World/SetEntityLinkPacket.h @@ -0,0 +1,29 @@ +#pragma once +using namespace std; + +#include "Packet.h" + +class SetEntityLinkPacket : public Packet, public enable_shared_from_this +{ +public: + static const int RIDING = 0; + static const int LEASH = 1; + + int type; + int sourceId, destId; + + SetEntityLinkPacket(); + SetEntityLinkPacket(int linkType, shared_ptr sourceEntity, shared_ptr destEntity); + + virtual int getEstimatedSize(); + virtual void read(DataInputStream *dis); + virtual void write(DataOutputStream *dos); + virtual void handle(PacketListener *listener); + virtual bool canBeInvalidated(); + virtual bool isInvalidatedBy(shared_ptr packet); + +public: + static shared_ptr create() { return shared_ptr(new SetEntityLinkPacket()); } + virtual int getId() { return 39; } + +}; \ No newline at end of file diff --git a/Minecraft.World/SetExperiencePacket.cpp b/Minecraft.World/SetExperiencePacket.cpp index ffe90a67..c5d84b21 100644 --- a/Minecraft.World/SetExperiencePacket.cpp +++ b/Minecraft.World/SetExperiencePacket.cpp @@ -49,11 +49,6 @@ bool SetExperiencePacket::canBeInvalidated() } bool SetExperiencePacket::isInvalidatedBy(shared_ptr packet) -{ - return true; -} - -bool SetExperiencePacket::isAync() { return true; } \ No newline at end of file diff --git a/Minecraft.World/SetExperiencePacket.h b/Minecraft.World/SetExperiencePacket.h index 499b7efd..01c0ed46 100644 --- a/Minecraft.World/SetExperiencePacket.h +++ b/Minecraft.World/SetExperiencePacket.h @@ -18,7 +18,6 @@ public: virtual int getEstimatedSize(); virtual bool canBeInvalidated(); virtual bool isInvalidatedBy(shared_ptr packet); - virtual bool isAync(); public: static shared_ptr create() { return shared_ptr(new SetExperiencePacket()); } diff --git a/Minecraft.World/SetHealthPacket.cpp b/Minecraft.World/SetHealthPacket.cpp index 55d7ccc3..639cacd8 100644 --- a/Minecraft.World/SetHealthPacket.cpp +++ b/Minecraft.World/SetHealthPacket.cpp @@ -8,14 +8,14 @@ SetHealthPacket::SetHealthPacket() { - this->health = 0; + this->health = 0.0f; this->food = 0; this->saturation = 0; this->damageSource = eTelemetryChallenges_Unknown; } -SetHealthPacket::SetHealthPacket(int health, int food, float saturation, ETelemetryChallenges damageSource) +SetHealthPacket::SetHealthPacket(float health, int food, float saturation, ETelemetryChallenges damageSource) { this->health = health; this->food = food; @@ -27,7 +27,7 @@ SetHealthPacket::SetHealthPacket(int health, int food, float saturation, ETeleme void SetHealthPacket::read(DataInputStream *dis) //throws IOException { - health = dis->readShort(); + health = dis->readFloat(); food = dis->readShort(); saturation = dis->readFloat(); // exhaustion = dis.readFloat(); @@ -37,7 +37,7 @@ void SetHealthPacket::read(DataInputStream *dis) //throws IOException void SetHealthPacket::write(DataOutputStream *dos) //throws IOException { - dos->writeShort(health); + dos->writeFloat(health); dos->writeShort(food); dos->writeFloat(saturation); // dos.writeFloat(exhaustion); @@ -52,7 +52,7 @@ void SetHealthPacket::handle(PacketListener *listener) int SetHealthPacket::getEstimatedSize() { - return 9; + return 11; } bool SetHealthPacket::canBeInvalidated() diff --git a/Minecraft.World/SetHealthPacket.h b/Minecraft.World/SetHealthPacket.h index de8f4cb9..4704f220 100644 --- a/Minecraft.World/SetHealthPacket.h +++ b/Minecraft.World/SetHealthPacket.h @@ -6,15 +6,14 @@ using namespace std; class SetHealthPacket : public Packet, public enable_shared_from_this { public: - int health; + float health; int food; float saturation; - // public float exhaustion; // 4J - Original comment ETelemetryChallenges damageSource; // 4J Added SetHealthPacket(); - SetHealthPacket(int health, int food, float saturation, ETelemetryChallenges damageSource); + SetHealthPacket(float health, int food, float saturation, ETelemetryChallenges damageSource); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/SetObjectivePacket.cpp b/Minecraft.World/SetObjectivePacket.cpp new file mode 100644 index 00000000..7e656967 --- /dev/null +++ b/Minecraft.World/SetObjectivePacket.cpp @@ -0,0 +1,42 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "PacketListener.h" +#include "SetObjectivePacket.h" + +SetObjectivePacket::SetObjectivePacket() +{ + objectiveName = L""; + displayName = L""; + method = 0; +} + +SetObjectivePacket::SetObjectivePacket(Objective *objective, int method) +{ + objectiveName = objective->getName(); + displayName = objective->getDisplayName(); + this->method = method; +} + +void SetObjectivePacket::read(DataInputStream *dis) +{ + objectiveName = readUtf(dis, Objective::MAX_NAME_LENGTH); + displayName = readUtf(dis, Objective::MAX_DISPLAY_NAME_LENGTH); + method = dis->readByte(); +} + +void SetObjectivePacket::write(DataOutputStream *dos) +{ + writeUtf(objectiveName, dos); + writeUtf(displayName, dos); + dos->writeByte(method); +} + +void SetObjectivePacket::handle(PacketListener *listener) +{ + listener->handleAddObjective(shared_from_this()); +} + +int SetObjectivePacket::getEstimatedSize() +{ + return 2 + objectiveName.length() + 2 + displayName.length() + 1; +} \ No newline at end of file diff --git a/Minecraft.World/SetObjectivePacket.h b/Minecraft.World/SetObjectivePacket.h new file mode 100644 index 00000000..5b5dfc6f --- /dev/null +++ b/Minecraft.World/SetObjectivePacket.h @@ -0,0 +1,28 @@ +#pragma once + +#include "Packet.h" + +class Objective; + +class SetObjectivePacket : public Packet, public enable_shared_from_this +{ +public: + static const int METHOD_ADD = 0; + static const int METHOD_REMOVE = 1; + static const int METHOD_CHANGE = 2; + + wstring objectiveName; + wstring displayName; + int method; + + SetObjectivePacket(); + SetObjectivePacket(Objective *objective, int method); + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new SetObjectivePacket()); } + virtual int getId() { return 206; } +}; \ No newline at end of file diff --git a/Minecraft.World/SetPlayerTeamPacket.cpp b/Minecraft.World/SetPlayerTeamPacket.cpp new file mode 100644 index 00000000..8c605784 --- /dev/null +++ b/Minecraft.World/SetPlayerTeamPacket.cpp @@ -0,0 +1,114 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "net.minecraft.world.entity.player.h" +#include "PacketListener.h" +#include "SetPlayerTeamPacket.h" + +SetPlayerTeamPacket::SetPlayerTeamPacket() +{ + name = L""; + displayName = L""; + prefix = L""; + suffix = L""; + method = 0; + options = 0; +} + +SetPlayerTeamPacket::SetPlayerTeamPacket(PlayerTeam *team, int method) +{ + name = team->getName(); + this->method = method; + + if (method == METHOD_ADD || method == METHOD_CHANGE) + { + displayName = team->getDisplayName(); + prefix = team->getPrefix(); + suffix = team->getSuffix(); + options = team->packOptions(); + } + if (method == METHOD_ADD) + { + unordered_set *playerNames = team->getPlayers(); + players.insert(players.end(), playerNames->begin(), playerNames->end()); + } +} + +SetPlayerTeamPacket::SetPlayerTeamPacket(PlayerTeam *team, vector *playerNames, int method) +{ + if (method != METHOD_JOIN && method != METHOD_LEAVE) + { + app.DebugPrintf("Method must be join or leave for player constructor"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + } + if (playerNames == NULL || playerNames->empty()) + { + app.DebugPrintf("Players cannot be null/empty"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + } + + this->method = method; + name = team->getName(); + this->players.insert(players.end(), playerNames->begin(), playerNames->end()); +} + +void SetPlayerTeamPacket::read(DataInputStream *dis) +{ + name = readUtf(dis, Objective::MAX_NAME_LENGTH); + method = dis->readByte(); + + if (method == METHOD_ADD || method == METHOD_CHANGE) + { + displayName = readUtf(dis, PlayerTeam::MAX_DISPLAY_NAME_LENGTH); + prefix = readUtf(dis, PlayerTeam::MAX_PREFIX_LENGTH); + suffix = readUtf(dis, PlayerTeam::MAX_SUFFIX_LENGTH); + options = dis->readByte(); + } + + if (method == METHOD_ADD || method == METHOD_JOIN || method == METHOD_LEAVE) + { + int count = dis->readShort(); + + for (int i = 0; i < count; i++) + { + players.push_back(readUtf(dis, Player::MAX_NAME_LENGTH)); + } + } +} + +void SetPlayerTeamPacket::write(DataOutputStream *dos) +{ + writeUtf(name, dos); + dos->writeByte(method); + + if (method == METHOD_ADD || method == METHOD_CHANGE) + { + writeUtf(displayName, dos); + writeUtf(prefix, dos); + writeUtf(suffix, dos); + dos->writeByte(options); + } + + if (method == METHOD_ADD || method == METHOD_JOIN || method == METHOD_LEAVE) + { + dos->writeShort(players.size()); + + for (AUTO_VAR(it,players.begin()); it != players.end(); ++it) + { + writeUtf(*it, dos); + } + } +} + +void SetPlayerTeamPacket::handle(PacketListener *listener) +{ + listener->handleSetPlayerTeamPacket(shared_from_this()); +} + +int SetPlayerTeamPacket::getEstimatedSize() +{ + return 1 + 2 + name.length(); +} \ No newline at end of file diff --git a/Minecraft.World/SetPlayerTeamPacket.h b/Minecraft.World/SetPlayerTeamPacket.h new file mode 100644 index 00000000..f6df9da2 --- /dev/null +++ b/Minecraft.World/SetPlayerTeamPacket.h @@ -0,0 +1,35 @@ +#pragma once + +#include "Packet.h" + +class PlayerTeam; + +class SetPlayerTeamPacket : public Packet , public enable_shared_from_this +{ +public: + static const int METHOD_ADD = 0; + static const int METHOD_REMOVE = 1; + static const int METHOD_CHANGE = 2; + static const int METHOD_JOIN = 3; + static const int METHOD_LEAVE = 4; + + wstring name; + wstring displayName; + wstring prefix; + wstring suffix; + vector players; + int method; + int options; + + SetPlayerTeamPacket(); + SetPlayerTeamPacket(PlayerTeam *team, int method); + SetPlayerTeamPacket(PlayerTeam *team, vector *players, int method); + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new SetPlayerTeamPacket()); } + virtual int getId() { return 209; } +}; \ No newline at end of file diff --git a/Minecraft.World/SetPlayerTimeoutCommand.h b/Minecraft.World/SetPlayerTimeoutCommand.h new file mode 100644 index 00000000..4bc83e66 --- /dev/null +++ b/Minecraft.World/SetPlayerTimeoutCommand.h @@ -0,0 +1,36 @@ +/* +package net.minecraft.commands.common; + +import net.minecraft.commands.BaseCommand; +import net.minecraft.commands.CommandSender; +import net.minecraft.commands.exceptions.UsageException; +import net.minecraft.server.MinecraftServer; + +public class SetPlayerTimeoutCommand extends BaseCommand { + public String getName() { + return "setidletimeout"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_ADMINS; + } + + @Override + public String getUsage(CommandSender source) { + return "commands.setidletimeout.usage"; + } + + public void execute(CommandSender source, String[] args) { + if (args.length == 1) { + int timeout = convertArgToInt(source, args[0], 0); + MinecraftServer.getInstance().setPlayerIdleTimeout(timeout); + logAdminAction(source, "commands.setidletimeout.success", timeout); + return; + } + + throw new UsageException("commands.setidletimeout.usage"); + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/SetScorePacket.cpp b/Minecraft.World/SetScorePacket.cpp new file mode 100644 index 00000000..75887eb5 --- /dev/null +++ b/Minecraft.World/SetScorePacket.cpp @@ -0,0 +1,63 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.scores.h" +#include "PacketListener.h" +#include "SetScorePacket.h" + +SetScorePacket::SetScorePacket() +{ + owner = L""; + objectiveName = L""; + score = 0; + method = 0; +} + +SetScorePacket::SetScorePacket(Score *score, int method) +{ + owner = score->getOwner(); + objectiveName = score->getObjective()->getName(); + this->score = score->getScore(); + this->method = method; +} + +SetScorePacket::SetScorePacket(const wstring &owner) +{ + this->owner = owner; + objectiveName = L""; + score = 0; + method = METHOD_REMOVE; +} + +void SetScorePacket::read(DataInputStream *dis) +{ + owner = readUtf(dis, Player::MAX_NAME_LENGTH); + method = dis->readByte(); + + if (method != METHOD_REMOVE) + { + objectiveName = readUtf(dis, Objective::MAX_NAME_LENGTH); + score = dis->readInt(); + } +} + +void SetScorePacket::write(DataOutputStream *dos) +{ + writeUtf(owner, dos); + dos->writeByte(method); + + if (method != METHOD_REMOVE) + { + writeUtf(objectiveName, dos); + dos->writeInt(score); + } +} + +void SetScorePacket::handle(PacketListener *listener) +{ + listener->handleSetScore(shared_from_this()); +} + +int SetScorePacket::getEstimatedSize() +{ + return 2 + (owner.empty() ? 0 : owner.length()) + 2 + (objectiveName.empty() ? 0 : objectiveName.length()) + 4 + 1; +} \ No newline at end of file diff --git a/Minecraft.World/SetScorePacket.h b/Minecraft.World/SetScorePacket.h new file mode 100644 index 00000000..5f800be6 --- /dev/null +++ b/Minecraft.World/SetScorePacket.h @@ -0,0 +1,30 @@ +#pragma once + +#include "Packet.h" + +class Score; + +class SetScorePacket : public Packet , public enable_shared_from_this +{ +public: + static const int METHOD_CHANGE = 0; + static const int METHOD_REMOVE = 1; + + wstring owner; + wstring objectiveName; + int score; + int method; + + SetScorePacket(); + SetScorePacket(Score *score, int method); + SetScorePacket(const wstring &owner); + + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new SetScorePacket()); } + virtual int getId() { return 207; } +}; \ No newline at end of file diff --git a/Minecraft.World/SetTimePacket.cpp b/Minecraft.World/SetTimePacket.cpp index 2f707970..5936255c 100644 --- a/Minecraft.World/SetTimePacket.cpp +++ b/Minecraft.World/SetTimePacket.cpp @@ -4,26 +4,38 @@ #include "PacketListener.h" #include "SetTimePacket.h" - - SetTimePacket::SetTimePacket() { - time = 0; + gameTime = 0; + dayTime = 0; } -SetTimePacket::SetTimePacket(__int64 time) +SetTimePacket::SetTimePacket(__int64 gameTime, __int64 dayTime, bool tickDayTime) { - this->time = time; + this->gameTime = gameTime; + this->dayTime = dayTime; + + // 4J: We send daylight cycle rule with host options so don't need this + /*if (!tickDayTime) + { + this->dayTime = -this->dayTime; + if (this->dayTime == 0) + { + this->dayTime = -1; + } + }*/ } void SetTimePacket::read(DataInputStream *dis) //throws IOException { - time = dis->readLong(); + gameTime = dis->readLong(); + dayTime = dis->readLong(); } void SetTimePacket::write(DataOutputStream *dos) //throws IOException { - dos->writeLong(time); + dos->writeLong(gameTime); + dos->writeLong(dayTime); } void SetTimePacket::handle(PacketListener *listener) @@ -33,7 +45,7 @@ void SetTimePacket::handle(PacketListener *listener) int SetTimePacket::getEstimatedSize() { - return 8; + return 16; } bool SetTimePacket::canBeInvalidated() diff --git a/Minecraft.World/SetTimePacket.h b/Minecraft.World/SetTimePacket.h index 5b658a0b..7ded9ce1 100644 --- a/Minecraft.World/SetTimePacket.h +++ b/Minecraft.World/SetTimePacket.h @@ -6,10 +6,11 @@ using namespace std; class SetTimePacket : public Packet, public enable_shared_from_this { public: - __int64 time; + __int64 gameTime; + __int64 dayTime; SetTimePacket(); - SetTimePacket(__int64 time); + SetTimePacket(__int64 gameTime, __int64 dayTime, bool tickDayTime); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/SharedConstants.cpp b/Minecraft.World/SharedConstants.cpp index 497822bc..00ff3a05 100644 --- a/Minecraft.World/SharedConstants.cpp +++ b/Minecraft.World/SharedConstants.cpp @@ -3,7 +3,7 @@ #include "InputOutputStream.h" #include "SharedConstants.h" -const wstring SharedConstants::VERSION_STRING = L"1.2.3"; +const wstring SharedConstants::VERSION_STRING = L"1.6.4"; const bool SharedConstants::TEXTURE_LIGHTING = true; wstring SharedConstants::readAcceptableChars() diff --git a/Minecraft.World/SharedConstants.h b/Minecraft.World/SharedConstants.h index bd6dae89..a8924e47 100644 --- a/Minecraft.World/SharedConstants.h +++ b/Minecraft.World/SharedConstants.h @@ -7,7 +7,8 @@ class SharedConstants public: static void staticCtor(); static const wstring VERSION_STRING; - static const int NETWORK_PROTOCOL_VERSION = 39; + static const int NETWORK_PROTOCOL_VERSION = 78; + static const bool INGAME_DEBUG_OUTPUT = false; // NOT texture resolution. How many sub-blocks each block face is made up of. // 4J Added for texture packs diff --git a/Minecraft.World/SharedMonsterAttributes.cpp b/Minecraft.World/SharedMonsterAttributes.cpp new file mode 100644 index 00000000..f434f1e7 --- /dev/null +++ b/Minecraft.World/SharedMonsterAttributes.cpp @@ -0,0 +1,108 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "BasicTypeContainers.h" +#include "SharedMonsterAttributes.h" + +Attribute *SharedMonsterAttributes::MAX_HEALTH = (new RangedAttribute(eAttributeId_GENERIC_MAXHEALTH, 20, 0, Double::MAX_VALUE))->setSyncable(true); +Attribute *SharedMonsterAttributes::FOLLOW_RANGE = (new RangedAttribute(eAttributeId_GENERIC_FOLLOWRANGE, 32, 0, 2048)); +Attribute *SharedMonsterAttributes::KNOCKBACK_RESISTANCE = (new RangedAttribute(eAttributeId_GENERIC_KNOCKBACKRESISTANCE, 0, 0, 1)); +Attribute *SharedMonsterAttributes::MOVEMENT_SPEED = (new RangedAttribute(eAttributeId_GENERIC_MOVEMENTSPEED, 0.7f, 0, Double::MAX_VALUE))->setSyncable(true); +Attribute *SharedMonsterAttributes::ATTACK_DAMAGE = new RangedAttribute(eAttributeId_GENERIC_ATTACKDAMAGE, 2, 0, Double::MAX_VALUE); + +ListTag *SharedMonsterAttributes::saveAttributes(BaseAttributeMap *attributes) +{ + ListTag *list = new ListTag(); + + vector atts; + attributes->getAttributes(atts); + for (AUTO_VAR(it, atts.begin()); it != atts.end(); ++it) + { + AttributeInstance *attribute = *it; + list->add(saveAttribute(attribute)); + } + + return list; +} + +CompoundTag *SharedMonsterAttributes::saveAttribute(AttributeInstance *instance) +{ + CompoundTag *tag = new CompoundTag(); + Attribute *attribute = instance->getAttribute(); + + tag->putInt(L"ID", attribute->getId()); + tag->putDouble(L"Base", instance->getBaseValue()); + + unordered_set modifiers; + instance->getModifiers(modifiers); + + if (!modifiers.empty()) + { + ListTag *list = new ListTag(); + + for (AUTO_VAR(it,modifiers.begin()); it != modifiers.end(); ++it) + { + AttributeModifier* modifier = *it; + if (modifier->isSerializable()) + { + list->add(saveAttributeModifier(modifier)); + } + } + + tag->put(L"Modifiers", list); + } + + return tag; +} + +CompoundTag *SharedMonsterAttributes::saveAttributeModifier(AttributeModifier *modifier) +{ + CompoundTag *tag = new CompoundTag(); + + tag->putDouble(L"Amount", modifier->getAmount()); + tag->putInt(L"Operation", modifier->getOperation()); + tag->putInt(L"UUID", modifier->getId()); + + return tag; +} + +void SharedMonsterAttributes::loadAttributes(BaseAttributeMap *attributes, ListTag *list) +{ + for (int i = 0; i < list->size(); i++) + { + CompoundTag *tag = list->get(i); + AttributeInstance *instance = attributes->getInstance(static_cast(tag->getInt(L"ID"))); + + if (instance != NULL) + { + loadAttribute(instance, tag); + } + else + { + app.DebugPrintf("Ignoring unknown attribute '%d'", tag->getInt(L"ID") ); + } + } +} + +void SharedMonsterAttributes::loadAttribute(AttributeInstance *instance, CompoundTag *tag) +{ + instance->setBaseValue(tag->getDouble(L"Base")); + + if (tag->contains(L"Modifiers")) + { + ListTag *list = (ListTag *) tag->getList(L"Modifiers"); + + for (int i = 0; i < list->size(); i++) + { + AttributeModifier *modifier = loadAttributeModifier(list->get(i)); + AttributeModifier *old = instance->getModifier(modifier->getId()); + if (old != NULL) instance->removeModifier(old); + instance->addModifier(modifier); + } + } +} + +AttributeModifier *SharedMonsterAttributes::loadAttributeModifier(CompoundTag *tag) +{ + eMODIFIER_ID id = (eMODIFIER_ID)tag->getInt(L"UUID"); + return new AttributeModifier(id, tag->getDouble(L"Amount"), tag->getInt(L"Operation")); +} \ No newline at end of file diff --git a/Minecraft.World/SharedMonsterAttributes.h b/Minecraft.World/SharedMonsterAttributes.h new file mode 100644 index 00000000..7195462e --- /dev/null +++ b/Minecraft.World/SharedMonsterAttributes.h @@ -0,0 +1,26 @@ +#pragma once + +class SharedMonsterAttributes +{ +public: + static Attribute *MAX_HEALTH; + static Attribute *FOLLOW_RANGE; + static Attribute *KNOCKBACK_RESISTANCE; + static Attribute *MOVEMENT_SPEED; + static Attribute *ATTACK_DAMAGE; + + static ListTag *saveAttributes(BaseAttributeMap *attributes); + +private: + static CompoundTag *saveAttribute(AttributeInstance *instance); + static CompoundTag *saveAttributeModifier(AttributeModifier *modifier); + +public: + static void loadAttributes(BaseAttributeMap *attributes, ListTag *list); + +private: + static void loadAttribute(AttributeInstance *instance, CompoundTag *tag); + +public: + static AttributeModifier *loadAttributeModifier(CompoundTag *tag); +}; \ No newline at end of file diff --git a/Minecraft.World/ShearsItem.cpp b/Minecraft.World/ShearsItem.cpp index 7f4d8d51..dd0c2ac7 100644 --- a/Minecraft.World/ShearsItem.cpp +++ b/Minecraft.World/ShearsItem.cpp @@ -9,14 +9,14 @@ ShearsItem::ShearsItem(int itemId) : Item(itemId) setMaxDamage(238); } -bool ShearsItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) +bool ShearsItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { - if (tile == Tile::leaves_Id || tile == Tile::web_Id || tile == Tile::tallgrass_Id || tile == Tile::vine_Id || tile == Tile::tripWire_Id) + if (tile == Tile::leaves_Id || tile == Tile::web_Id || tile == Tile::tallgrass_Id || tile == Tile::vine_Id || tile == Tile::tripWire_Id) { - itemInstance->hurt(1, owner); + itemInstance->hurtAndBreak(1, owner); return true; - } - return Item::mineBlock(itemInstance, level, tile, x, y, z, owner); + } + return Item::mineBlock(itemInstance, level, tile, x, y, z, owner); } bool ShearsItem::canDestroySpecial(Tile *tile) @@ -26,13 +26,13 @@ bool ShearsItem::canDestroySpecial(Tile *tile) float ShearsItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { - if (tile->id == Tile::web_Id || tile->id == Tile::leaves_Id) + if (tile->id == Tile::web_Id || tile->id == Tile::leaves_Id) { - return 15; - } - if (tile->id == Tile::cloth_Id) + return 15; + } + if (tile->id == Tile::wool_Id) { - return 5; - } - return Item::getDestroySpeed(itemInstance, tile); + return 5; + } + return Item::getDestroySpeed(itemInstance, tile); } \ No newline at end of file diff --git a/Minecraft.World/ShearsItem.h b/Minecraft.World/ShearsItem.h index 06078645..3bf0c46f 100644 --- a/Minecraft.World/ShearsItem.h +++ b/Minecraft.World/ShearsItem.h @@ -7,7 +7,7 @@ class ShearsItem : public Item { public: ShearsItem(int itemId); - virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); virtual bool canDestroySpecial(Tile *tile); virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); }; \ No newline at end of file diff --git a/Minecraft.World/Sheep.cpp b/Minecraft.World/Sheep.cpp index 30eeefcd..32379c2a 100644 --- a/Minecraft.World/Sheep.cpp +++ b/Minecraft.World/Sheep.cpp @@ -1,5 +1,3 @@ -using namespace std; - #include "stdafx.h" #include "com.mojang.nbt.h" #include "net.minecraft.world.level.tile.h" @@ -8,6 +6,7 @@ using namespace std; #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.crafting.h" #include "net.minecraft.world.inventory.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.h" @@ -15,12 +14,13 @@ using namespace std; #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.entity.global.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "Sheep.h" #include "..\Minecraft.Client\Textures.h" #include "MobCategory.h" #include "GenericStats.h" -const float Sheep::COLOR[][3] = +const float Sheep::COLOR[Sheep::COLOR_LENGTH][3] = { { 1.0f, 1.0f, 1.0f }, // white { 0.85f, 0.5f, 0.2f }, // orange @@ -45,26 +45,23 @@ Sheep::Sheep(Level *level) : Animal( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SHEEP; // 4J - was L"/mob/sheep.png"; - this->setSize(0.9f, 1.3f); + setSize(0.9f, 1.3f); eatAnimationTick = 0; eatTileGoal = new EatTileGoal(this); - float walkSpeed = 0.23f; getNavigation()->setAvoidWater(true); goalSelector.addGoal(0, new FloatGoal(this)); - goalSelector.addGoal(1, new PanicGoal(this, 0.38f)); - goalSelector.addGoal(2, new BreedGoal(this, walkSpeed)); - goalSelector.addGoal(3, new TemptGoal(this, 0.25f, Item::wheat_Id, false)); - goalSelector.addGoal(4, new FollowParentGoal(this, 0.25f)); + goalSelector.addGoal(1, new PanicGoal(this, 1.25)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + goalSelector.addGoal(3, new TemptGoal(this, 1.1, Item::wheat_Id, false)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.1)); goalSelector.addGoal(5, eatTileGoal, false); - goalSelector.addGoal(6, new RandomStrollGoal(this, walkSpeed)); + goalSelector.addGoal(6, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(7, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(8, new RandomLookAroundGoal(this)); @@ -90,9 +87,12 @@ void Sheep::aiStep() Animal::aiStep(); } -int Sheep::getMaxHealth() +void Sheep::registerAttributes() { - return 8; + Animal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(8); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.23f); } void Sheep::defineSynchedData() @@ -108,13 +108,13 @@ void Sheep::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) if(!isSheared()) { // killing a non-sheared sheep will drop a single block of cloth - spawnAtLocation(shared_ptr( new ItemInstance(Tile::cloth_Id, 1, getColor()) ), 0.0f); + spawnAtLocation(shared_ptr( new ItemInstance(Tile::wool_Id, 1, getColor()) ), 0.0f); } } int Sheep::getDeathLoot() { - return Tile::cloth_Id; + return Tile::wool_Id; } void Sheep::handleEntityEvent(byte id) @@ -160,35 +160,36 @@ float Sheep::getHeadEatAngleScale(float a) return ((xRot / (180.0f / PI))); } -bool Sheep::interact(shared_ptr player) +bool Sheep::mobInteract(shared_ptr player) { - shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); // 4J-JEV: Fix for #88212, // Untrusted players shouldn't be able to sheer sheep. if (!player->isAllowedToInteract( shared_from_this() )) return false; //Animal::interact(player); - if (item != NULL && item->id == Item::shears->id && !isSheared() && !isBaby()) + if (item != NULL && item->id == Item::shears->id && !isSheared() && !isBaby()) { - if (!level->isClientSide) + if (!level->isClientSide) { - setSheared(true); - int count = 1 + random->nextInt(3); - for (int i = 0; i < count; i++) + setSheared(true); + int count = 1 + random->nextInt(3); + for (int i = 0; i < count; i++) { - shared_ptr ie = spawnAtLocation(shared_ptr( new ItemInstance(Tile::cloth_Id, 1, getColor()) ), 1.0f); - ie->yd += random->nextFloat() * 0.05f; - ie->xd += (random->nextFloat() - random->nextFloat()) * 0.1f; - ie->zd += (random->nextFloat() - random->nextFloat()) * 0.1f; - } + shared_ptr ie = spawnAtLocation(shared_ptr( new ItemInstance(Tile::wool_Id, 1, getColor()) ), 1.0f); + ie->yd += random->nextFloat() * 0.05f; + ie->xd += (random->nextFloat() - random->nextFloat()) * 0.1f; + ie->zd += (random->nextFloat() - random->nextFloat()) * 0.1f; + } player->awardStat( GenericStats::shearedEntity(eTYPE_SHEEP), GenericStats::param_shearedEntity(eTYPE_SHEEP) ); - } - item->hurt(1, player); - } + } + item->hurtAndBreak(1, player); + playSound(eSoundType_MOB_SHEEP_SHEAR, 1, 1); + } - return Animal::interact(player); + return Animal::mobInteract(player); } void Sheep::addAdditonalSaveData(CompoundTag *tag) @@ -220,6 +221,11 @@ int Sheep::getDeathSound() return eSoundType_MOB_SHEEP_AMBIENT; } +void Sheep::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_SHEEP_STEP, 0.15f, 1); +} + int Sheep::getColor() { return (entityData->getByte(DATA_WOOL_ID) & 0x0f); @@ -295,18 +301,16 @@ void Sheep::ate() if (isBaby()) { // remove a minute from aging - int age = getAge() + SharedConstants::TICKS_PER_SECOND * 60; - if (age > 0) - { - age = 0; - } - setAge(age); + ageUp(60); } } -void Sheep::finalizeMobSpawn() +MobGroupData *Sheep::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param { - setColor(Sheep::getSheepColor(level->random)); + groupData = Animal::finalizeMobSpawn(groupData); + + setColor(getSheepColor(level->random)); + return groupData; } int Sheep::getOffspringColor(shared_ptr animal, shared_ptr partner) diff --git a/Minecraft.World/Sheep.h b/Minecraft.World/Sheep.h index 666e1d57..16ecfb4c 100644 --- a/Minecraft.World/Sheep.h +++ b/Minecraft.World/Sheep.h @@ -31,7 +31,8 @@ private: EatTileGoal *eatTileGoal; public: - static const float COLOR[][3]; + static const int COLOR_LENGTH = 16; + static const float COLOR[COLOR_LENGTH][3]; public: Sheep(Level *level); @@ -42,9 +43,9 @@ protected: public: void aiStep(); - virtual int getMaxHealth(); protected: + virtual void registerAttributes(); virtual void defineSynchedData(); public: @@ -58,7 +59,7 @@ public: float getHeadEatPositionScale(float a); float getHeadEatAngleScale(float a); - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); @@ -66,6 +67,7 @@ protected: virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); + virtual void playStepSound(int xt, int yt, int zt, int t); public: int getColor(); @@ -78,7 +80,7 @@ public: virtual void ate(); - void finalizeMobSpawn(); + MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param private: int getOffspringColor(shared_ptr animal, shared_ptr partner); diff --git a/Minecraft.World/ShortTag.h b/Minecraft.World/ShortTag.h index bfd7511b..989e1fb1 100644 --- a/Minecraft.World/ShortTag.h +++ b/Minecraft.World/ShortTag.h @@ -9,7 +9,7 @@ public: ShortTag(const wstring &name, int data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeShort(data); } - void load(DataInput *dis) { data = dis->readShort(); } + void load(DataInput *dis, int tagDepth) { data = dis->readShort(); } byte getId() { return TAG_Short; } wstring toString() diff --git a/Minecraft.World/ShovelItem.cpp b/Minecraft.World/ShovelItem.cpp index 79981bd1..8064cbe3 100644 --- a/Minecraft.World/ShovelItem.cpp +++ b/Minecraft.World/ShovelItem.cpp @@ -16,8 +16,7 @@ void ShovelItem::staticCtor() diggables->data[5] = Tile::snow; diggables->data[6] = Tile::clay; diggables->data[7] = Tile::farmland; - // 4J - brought forward from 1.2.3 - diggables->data[8] = Tile::hellSand; + diggables->data[8] = Tile::soulsand; diggables->data[9] = Tile::mycel; } diff --git a/Minecraft.World/ShowSeedCommand.h b/Minecraft.World/ShowSeedCommand.h new file mode 100644 index 00000000..fa7b3078 --- /dev/null +++ b/Minecraft.World/ShowSeedCommand.h @@ -0,0 +1,38 @@ +/* +package net.minecraft.commands.common; + +import net.minecraft.commands.*; +import net.minecraft.network.chat.ChatMessageComponent; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; + +public class ShowSeedCommand extends BaseCommand { + @Override + public boolean canExecute(CommandSender source) { + return MinecraftServer.getInstance().isSingleplayer() || super.canExecute(source); + } + + @Override + public String getName() { + return "seed"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + @Override + public String getUsage(CommandSender source) { + return "commands.seed.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + Level level = source instanceof Player ? ((Player) source).level : MinecraftServer.getInstance().getLevel(0); + source.sendMessage(ChatMessageComponent.forTranslation("commands.seed.success", level.getSeed())); + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/SignItem.cpp b/Minecraft.World/SignItem.cpp index 02ccf83d..c9cb627e 100644 --- a/Minecraft.World/SignItem.cpp +++ b/Minecraft.World/SignItem.cpp @@ -26,20 +26,25 @@ bool SignItem::useOn(shared_ptr instance, shared_ptr playe if (face == 4) x--; if (face == 5) x++; - if (!player->mayBuild(x, y, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; if (!Tile::sign->mayPlace(level, x, y, z)) return false; + if (level->isClientSide) + { + return true; + } + if(!bTestUseOnOnly) { if (face == 1) { int rot = Mth::floor(((player->yRot + 180) * 16) / 360 + 0.5) & 15; - level->setTileAndData(x, y, z, Tile::sign_Id, rot); + level->setTileAndData(x, y, z, Tile::sign_Id, rot, Tile::UPDATE_ALL); } else { - level->setTileAndData(x, y, z, Tile::wallSign_Id, face); + level->setTileAndData(x, y, z, Tile::wallSign_Id, face, Tile::UPDATE_ALL); } instance->count--; diff --git a/Minecraft.World/SignTile.cpp b/Minecraft.World/SignTile.cpp index 52dc1260..52d62a60 100644 --- a/Minecraft.World/SignTile.cpp +++ b/Minecraft.World/SignTile.cpp @@ -5,7 +5,7 @@ #include "SignTileEntity.h" #include "SignTile.h" -SignTile::SignTile(int id, eINSTANCEOF clas, bool onGround) : EntityTile(id, Material::wood, isSolidRender()) +SignTile::SignTile(int id, eINSTANCEOF clas, bool onGround) : BaseEntityTile(id, Material::wood, isSolidRender()) { this->onGround = onGround; this->clas = clas; @@ -32,7 +32,7 @@ AABB *SignTile::getAABB(Level *level, int x, int y, int z) AABB *SignTile::getTileAABB(Level *level, int x, int y, int z) { updateShape(level, x, y, z); - return EntityTile::getTileAABB(level, x, y, z); + return BaseEntityTile::getTileAABB(level, x, y, z); } void SignTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param @@ -112,10 +112,10 @@ void SignTile::neighborChanged(Level *level, int x, int y, int z, int type) if (remove) { spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } - EntityTile::neighborChanged(level, x, y, z, type); + BaseEntityTile::neighborChanged(level, x, y, z, type); } int SignTile::cloneTileId(Level *level, int x, int y, int z) diff --git a/Minecraft.World/SignTile.h b/Minecraft.World/SignTile.h index 92163973..4d9dce62 100644 --- a/Minecraft.World/SignTile.h +++ b/Minecraft.World/SignTile.h @@ -1,12 +1,12 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" #include "TileEntity.h" #include "stdafx.h" #include "Material.h" -class SignTile : public EntityTile +class SignTile : public BaseEntityTile { friend class Tile; private: diff --git a/Minecraft.World/SignTileEntity.cpp b/Minecraft.World/SignTileEntity.cpp index 09b8e022..74adc8cc 100644 --- a/Minecraft.World/SignTileEntity.cpp +++ b/Minecraft.World/SignTileEntity.cpp @@ -30,6 +30,8 @@ SignTileEntity::SignTileEntity() : TileEntity() m_iSelectedLine = -1; _isEditable = true; + + playerWhoMayEdit = nullptr; } SignTileEntity::~SignTileEntity() @@ -102,6 +104,20 @@ bool SignTileEntity::isEditable() void SignTileEntity::setEditable(bool isEditable) { this->_isEditable = isEditable; + if (!isEditable) + { + playerWhoMayEdit = nullptr; + } +} + +void SignTileEntity::setAllowedPlayerEditor(shared_ptr player) +{ + playerWhoMayEdit = player; +} + +shared_ptr SignTileEntity::getPlayerWhoMayEdit() +{ + return playerWhoMayEdit; } void SignTileEntity::setChanged() diff --git a/Minecraft.World/SignTileEntity.h b/Minecraft.World/SignTileEntity.h index b963f12f..9b06aaab 100644 --- a/Minecraft.World/SignTileEntity.h +++ b/Minecraft.World/SignTileEntity.h @@ -28,6 +28,7 @@ public: public: private: + shared_ptr playerWhoMayEdit; bool _isEditable; bool m_bVerified; bool m_bCensored; @@ -41,6 +42,8 @@ public: virtual shared_ptr getUpdatePacket(); bool isEditable(); void setEditable(bool isEditable); + void setAllowedPlayerEditor(shared_ptr player); + shared_ptr getPlayerWhoMayEdit(); virtual void setChanged(); static int StringVerifyCallback(LPVOID lpParam,STRING_VERIFY_RESPONSE *pResults); diff --git a/Minecraft.World/Silverfish.cpp b/Minecraft.World/Silverfish.cpp index 117dc41b..5cd4c77e 100644 --- a/Minecraft.World/Silverfish.cpp +++ b/Minecraft.World/Silverfish.cpp @@ -3,6 +3,8 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.h" #include "..\Minecraft.Client\Textures.h" #include "Silverfish.h" @@ -15,21 +17,19 @@ Silverfish::Silverfish(Level *level) : Monster( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SILVERFISH;// 4J was "/mob/silverfish.png"; - this->setSize(0.3f, 0.7f); - runSpeed = 0.6f; - - // 4J - Brought forward damage from 1.2.3 - attackDamage = 1; + setSize(0.3f, 0.7f); } -int Silverfish::getMaxHealth() +void Silverfish::registerAttributes() { - return 8; + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(8); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.6f); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(1); } bool Silverfish::makeStepSound() @@ -69,8 +69,9 @@ int Silverfish::getDeathSound() } -bool Silverfish::hurt(DamageSource *source, int dmg) +bool Silverfish::hurt(DamageSource *source, float dmg) { + if (isInvulnerable()) return false; if (lookForFriends <= 0 && (dynamic_cast(source) != NULL || source == DamageSource::magic)) { // look for friends @@ -86,16 +87,14 @@ void Silverfish::checkHurtTarget(shared_ptr target, float d) if (attackTime <= 0 && d < 1.2f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) { attackTime = 20; - DamageSource *damageSource = DamageSource::mobAttack( dynamic_pointer_cast( shared_from_this() ) ); - target->hurt(damageSource, attackDamage); - delete damageSource; + doHurtTarget(target); } } void Silverfish::playStepSound(int xt, int yt, int zt, int t) { - level->playSound(shared_from_this(), eSoundType_MOB_SILVERFISH_STEP, 1, 1); + playSound(eSoundType_MOB_SILVERFISH_STEP, 0.15f, 1); } int Silverfish::getDeathLoot() @@ -140,9 +139,26 @@ void Silverfish::serverAiStep() int tile = level->getTile(baseX + xOff, baseY + yOff, baseZ + zOff); if (tile == Tile::monsterStoneEgg_Id) { - level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, baseX + xOff, baseY + yOff, baseZ + zOff, - Tile::monsterStoneEgg_Id + (level->getData(baseX + xOff, baseY + yOff, baseZ + zOff) << Tile::TILE_NUM_SHIFT)); - level->setTile(baseX + xOff, baseY + yOff, baseZ + zOff, 0); + if (!level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) + { + int data = level->getData(baseX + xOff, baseY + yOff, baseZ + zOff); + + Tile *restoreTile = Tile::stone; + if (data == StoneMonsterTile::HOST_COBBLE) + { + restoreTile = Tile::cobblestone; + } + if (data == StoneMonsterTile::HOST_STONEBRICK) + { + restoreTile = Tile::stoneBrick; + } + + level->setTileAndData(baseX + xOff, baseY + yOff, baseZ + zOff, restoreTile->id, 0, Tile::UPDATE_ALL); + } + else + { + level->destroyTile(baseX + xOff, baseY + yOff, baseZ + zOff, false); + } Tile::monsterStoneEgg->destroy(level, baseX + xOff, baseY + yOff, baseZ + zOff, 0); if (random->nextBoolean()) @@ -167,7 +183,7 @@ void Silverfish::serverAiStep() int tile = level->getTile(tileX + Facing::STEP_X[facing], tileY + Facing::STEP_Y[facing], tileZ + Facing::STEP_Z[facing]); if (StoneMonsterTile::isCompatibleHostBlock(tile)) { - level->setTileAndData(tileX + Facing::STEP_X[facing], tileY + Facing::STEP_Y[facing], tileZ + Facing::STEP_Z[facing], Tile::monsterStoneEgg_Id, StoneMonsterTile::getDataForHostBlock(tile)); + level->setTileAndData(tileX + Facing::STEP_X[facing], tileY + Facing::STEP_Y[facing], tileZ + Facing::STEP_Z[facing], Tile::monsterStoneEgg_Id, StoneMonsterTile::getDataForHostBlock(tile), Tile::UPDATE_ALL); spawnAnim(); remove(); } @@ -186,7 +202,7 @@ void Silverfish::serverAiStep() float Silverfish::getWalkTargetValue(int x, int y, int z) { // silverfish LOVES stone =) - if (level->getTile(x, y - 1, z) == Tile::rock_Id) return 10; + if (level->getTile(x, y - 1, z) == Tile::stone_Id) return 10; return Monster::getWalkTargetValue(x, y, z); } diff --git a/Minecraft.World/Silverfish.h b/Minecraft.World/Silverfish.h index 0fd0cc06..e954fff1 100644 --- a/Minecraft.World/Silverfish.h +++ b/Minecraft.World/Silverfish.h @@ -13,9 +13,8 @@ private: public: Silverfish(Level *level); - virtual int getMaxHealth(); - protected: + virtual void registerAttributes(); virtual bool makeStepSound(); virtual shared_ptr findAttackTarget(); @@ -24,7 +23,7 @@ protected: virtual int getDeathSound(); public: - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); protected: virtual void checkHurtTarget(shared_ptr target, float d); diff --git a/Minecraft.World/SimpleContainer.cpp b/Minecraft.World/SimpleContainer.cpp index e29bc790..147bab0a 100644 --- a/Minecraft.World/SimpleContainer.cpp +++ b/Minecraft.World/SimpleContainer.cpp @@ -5,9 +5,11 @@ #include "SimpleContainer.h" -SimpleContainer::SimpleContainer(int name, int size) +SimpleContainer::SimpleContainer(int name, wstring stringName, bool customName, int size) { this->name = name; + this->stringName = stringName; + this->customName = customName; this->size = size; items = new ItemInstanceArray( size ); @@ -46,14 +48,14 @@ shared_ptr SimpleContainer::removeItem(unsigned int slot, int coun { shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; - this->setChanged(); + setChanged(); return item; } else { shared_ptr i = (*items)[slot]->remove(count); if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; - this->setChanged(); + setChanged(); return i; } } @@ -75,7 +77,7 @@ void SimpleContainer::setItem(unsigned int slot, shared_ptr item) { (*items)[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); - this->setChanged(); + setChanged(); } unsigned int SimpleContainer::getContainerSize() @@ -83,9 +85,25 @@ unsigned int SimpleContainer::getContainerSize() return size; } -int SimpleContainer::getName() +wstring SimpleContainer::getName() { - return name; + return stringName.empty() ? app.GetString(name) : stringName; +} + +wstring SimpleContainer::getCustomName() +{ + return hasCustomName() ? stringName : L""; +} + +bool SimpleContainer::hasCustomName() +{ + return customName; +} + +void SimpleContainer::setCustomName(const wstring &name) +{ + customName = true; + this->stringName = name; } int SimpleContainer::getMaxStackSize() @@ -95,16 +113,18 @@ int SimpleContainer::getMaxStackSize() void SimpleContainer::setChanged() { - // 4J - removing this as we don't seem to have any implementation of a listener containerChanged function, and shared_from_this is proving tricky to add to containers -#if 0 if (listeners != NULL) for (unsigned int i = 0; i < listeners->size(); i++) { - listeners->at(i)->containerChanged(shared_from_this()); + listeners->at(i)->containerChanged();//shared_from_this()); } -#endif } bool SimpleContainer::stillValid(shared_ptr player) +{ + return true; +} + +bool SimpleContainer::canPlaceItem(int slot, shared_ptr item) { return true; } \ No newline at end of file diff --git a/Minecraft.World/SimpleContainer.h b/Minecraft.World/SimpleContainer.h index 98c193d3..b0baed70 100644 --- a/Minecraft.World/SimpleContainer.h +++ b/Minecraft.World/SimpleContainer.h @@ -8,35 +8,30 @@ class SimpleContainer : public Container { private: int name; + wstring stringName; int size; ItemInstanceArray *items; vector *listeners; + bool customName; public: - SimpleContainer(int name, int size); - - void addListener(net_minecraft_world::ContainerListener *listener); - - void removeListener(net_minecraft_world::ContainerListener *listener); - - shared_ptr getItem(unsigned int slot); - - shared_ptr removeItem(unsigned int slot, int count); - shared_ptr removeItemNoUpdate(int slot); - - void setItem(unsigned int slot, shared_ptr item); - - unsigned int getContainerSize(); - - int getName(); - - int getMaxStackSize(); - - void setChanged(); - - bool stillValid(shared_ptr player); - - void startOpen() { } // TODO Auto-generated method stub - void stopOpen() { } // TODO Auto-generated method stub - + SimpleContainer(int name, wstring stringName, bool customName, int size); + + virtual void addListener(net_minecraft_world::ContainerListener *listener); + virtual void removeListener(net_minecraft_world::ContainerListener *listener); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual unsigned int getContainerSize(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); + virtual int getMaxStackSize(); + virtual void setChanged(); + virtual bool stillValid(shared_ptr player); + virtual void startOpen() { } // TODO Auto-generated method stub + virtual void stopOpen() { } // TODO Auto-generated method stub + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/SimpleFoiledItem.cpp b/Minecraft.World/SimpleFoiledItem.cpp new file mode 100644 index 00000000..65894731 --- /dev/null +++ b/Minecraft.World/SimpleFoiledItem.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" + +#include "SimpleFoiledItem.h" + +SimpleFoiledItem::SimpleFoiledItem(int id) : Item(id) +{ +} + +bool SimpleFoiledItem::isFoil(shared_ptr itemInstance) +{ + return true; +} diff --git a/Minecraft.World/SimpleFoiledItem.h b/Minecraft.World/SimpleFoiledItem.h new file mode 100644 index 00000000..41bd884d --- /dev/null +++ b/Minecraft.World/SimpleFoiledItem.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Item.h" + +class SimpleFoiledItem : public Item +{ +public: + SimpleFoiledItem(int id); + + bool isFoil(shared_ptr itemInstance); +}; \ No newline at end of file diff --git a/Minecraft.World/SitGoal.cpp b/Minecraft.World/SitGoal.cpp index 90180201..b79b2df7 100644 --- a/Minecraft.World/SitGoal.cpp +++ b/Minecraft.World/SitGoal.cpp @@ -20,7 +20,7 @@ bool SitGoal::canUse() if (mob->isInWater()) return false; if (!mob->onGround) return false; - shared_ptr owner = mob->getOwner(); + shared_ptr owner = dynamic_pointer_cast( mob->getOwner() ); if (owner == NULL) return true; // owner not on level if (mob->distanceToSqr(owner) < FollowOwnerGoal::TeleportDistance * FollowOwnerGoal::TeleportDistance && owner->getLastHurtByMob() != NULL) return false; diff --git a/Minecraft.World/Skeleton.cpp b/Minecraft.World/Skeleton.cpp index b6dbab1f..9afb95c6 100644 --- a/Minecraft.World/Skeleton.cpp +++ b/Minecraft.World/Skeleton.cpp @@ -1,14 +1,20 @@ #include "stdafx.h" #include "net.minecraft.world.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.dimension.h" +#include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.stats.h" #include "net.minecraft.world.damagesource.h" #include "SharedConstants.h" @@ -16,63 +22,86 @@ #include "..\Minecraft.Client\Textures.h" #include "SoundTypes.h" - - Skeleton::Skeleton(Level *level) : Monster( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SKELETON; // 4J was L"/mob/skeleton.png"; - - runSpeed = 0.25f; + bowGoal = new RangedAttackGoal(this, this, 1.0, SharedConstants::TICKS_PER_SECOND * 1, SharedConstants::TICKS_PER_SECOND * 3, 15); + meleeGoal = new MeleeAttackGoal(this, eTYPE_PLAYER, 1.2, false); goalSelector.addGoal(1, new FloatGoal(this)); goalSelector.addGoal(2, new RestrictSunGoal(this)); - goalSelector.addGoal(3, new FleeSunGoal(this, runSpeed)); - goalSelector.addGoal(4, new ArrowAttackGoal(this, runSpeed, ArrowAttackGoal::ArrowType, SharedConstants::TICKS_PER_SECOND * 3)); - goalSelector.addGoal(5, new RandomStrollGoal(this, runSpeed)); + goalSelector.addGoal(3, new FleeSunGoal(this, 1.0)); + goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(6, new LookAtPlayerGoal(this, typeid(Player), 8)); goalSelector.addGoal(6, new RandomLookAroundGoal(this)); targetSelector.addGoal(1, new HurtByTargetGoal(this, false)); - targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, typeid(Player), 16, 0, true)); + targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, typeid(Player), 0, true)); + + if (level != NULL && !level->isClientSide) reassessWeaponGoal(); } -bool Skeleton::useNewAi() +Skeleton::~Skeleton() { - return true; + delete bowGoal; + delete meleeGoal; +} + +void Skeleton::registerAttributes() +{ + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); +} + +void Skeleton::defineSynchedData() +{ + Monster::defineSynchedData(); + + entityData->define(DATA_TYPE_ID, (byte) TYPE_DEFAULT); } -int Skeleton::getMaxHealth() +bool Skeleton::useNewAi() { - return 20; + return true; } int Skeleton::getAmbientSound() { - return eSoundType_MOB_SKELETON_AMBIENT; + return eSoundType_MOB_SKELETON_AMBIENT; } int Skeleton::getHurtSound() { - return eSoundType_MOB_SKELETON_HURT; + return eSoundType_MOB_SKELETON_HURT; } int Skeleton::getDeathSound() { - return eSoundType_MOB_SKELETON_HURT; + return eSoundType_MOB_SKELETON_DEATH; } -shared_ptr Skeleton::bow; +void Skeleton::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_SKELETON_STEP, 0.15f, 1); +} -shared_ptr Skeleton::getCarriedItem() +bool Skeleton::doHurtTarget(shared_ptr target) { - return bow; + if (Monster::doHurtTarget(target)) + { + if ( (getSkeletonType() == TYPE_WITHER) && target->instanceof(eTYPE_LIVINGENTITY) ) + { + dynamic_pointer_cast(target)->addEffect(new MobEffectInstance(MobEffect::wither->id, SharedConstants::TICKS_PER_SECOND * 10)); + } + return true; + } + return false; } MobType Skeleton::getMobType() @@ -82,28 +111,65 @@ MobType Skeleton::getMobType() void Skeleton::aiStep() { - // isClientSide check brought forward from 1.8 (I assume it's related to the lighting changes) - if (level->isDay() && !level->isClientSide) + if (level->isDay() && !level->isClientSide) { - float br = getBrightness(1); - if (br > 0.5f) + float br = getBrightness(1); + if (br > 0.5f && random->nextFloat() * 30 < (br - 0.4f) * 2 && level->canSeeSky(Mth::floor(x), (int)floor( y + 0.5 ), Mth::floor(z))) { - if (level->canSeeSky( Mth::floor(x), Mth::floor(y), Mth::floor(z)) && random->nextFloat() * 30 < (br - 0.4f) * 2) + bool burn = true; + + shared_ptr helmet = getCarried(SLOT_HELM); + if (helmet != NULL) { - setOnFire(8); - } - } - } + if (helmet->isDamageableItem()) + { + helmet->setAuxValue(helmet->getDamageValue() + random->nextInt(2)); + if (helmet->getDamageValue() >= helmet->getMaxDamage()) + { + breakItem(helmet); + setEquippedSlot(SLOT_HELM, nullptr); + } + } + + burn = false; + } + + if (burn) + { + setOnFire(8); + } + } + } + if (level->isClientSide) + { + if (getSkeletonType() == TYPE_WITHER) + { + setSize(0.6f * 1.2f, 1.8f * 1.3f); + } + } + + Monster::aiStep(); +} + +void Skeleton::rideTick() +{ + Monster::rideTick(); + + if ( riding != NULL && riding->instanceof(eTYPE_PATHFINDER_MOB) ) + { + yBodyRot = dynamic_pointer_cast(riding)->yBodyRot; + } - Monster::aiStep(); } void Skeleton::die(DamageSource *source) { Monster::die(source); - shared_ptr player = dynamic_pointer_cast( source->getEntity() ); - if ( dynamic_pointer_cast( source->getDirectEntity() ) != NULL && player != NULL) + + if ( source->getDirectEntity() != NULL && source->getDirectEntity()->instanceof(eTYPE_ARROW) && source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_PLAYER) ) { + shared_ptr player = dynamic_pointer_cast( source->getEntity() ); + double xd = player->x - x; double zd = player->z - z; if (xd * xd + zd * zd >= 50 * 50) @@ -115,40 +181,179 @@ void Skeleton::die(DamageSource *source) int Skeleton::getDeathLoot() { - return Item::arrow->id; + return Item::arrow->id; } void Skeleton::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) { - // drop some arrows - int count = random->nextInt(3 + playerBonusLevel); - for (int i = 0; i < count; i++) + if (getSkeletonType() == TYPE_WITHER) { - spawnAtLocation(Item::arrow->id, 1); - } - // and some bones - count = random->nextInt(3 + playerBonusLevel); - for (int i = 0; i < count; i++) + // drop some arrows + int count = random->nextInt(3 + playerBonusLevel) - 1; + for (int i = 0; i < count; i++) + { + spawnAtLocation(Item::coal_Id, 1); + } + } + else { - spawnAtLocation(Item::bone->id, 1); - } + // drop some arrows + int count = random->nextInt(3 + playerBonusLevel); + for (int i = 0; i < count; i++) + { + spawnAtLocation(Item::arrow_Id, 1); + } + } + + // and some bones + int count = random->nextInt(3 + playerBonusLevel); + for (int i = 0; i < count; i++) + { + spawnAtLocation(Item::bone->id, 1); + } } void Skeleton::dropRareDeathLoot(int rareLootLevel) { - if (rareLootLevel > 0) + if (getSkeletonType() == TYPE_WITHER) + { + spawnAtLocation( shared_ptr( new ItemInstance(Item::skull_Id, 1, SkullTileEntity::TYPE_WITHER) ), 0); + } +} + +void Skeleton::populateDefaultEquipmentSlots() +{ + Monster::populateDefaultEquipmentSlots(); + + setEquippedSlot(SLOT_WEAPON, shared_ptr( new ItemInstance(Item::bow))); +} + +MobGroupData *Skeleton::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param +{ + groupData = Monster::finalizeMobSpawn(groupData); + + if ( dynamic_cast(level->dimension) != NULL && getRandom()->nextInt(5) > 0) + { + goalSelector.addGoal(4, meleeGoal, false); + + setSkeletonType(TYPE_WITHER); + setEquippedSlot(SLOT_WEAPON, shared_ptr( new ItemInstance(Item::sword_stone))); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(4); + } + else + { + goalSelector.addGoal(4, bowGoal, false); + + populateDefaultEquipmentSlots(); + populateDefaultEquipmentEnchantments(); + } + + setCanPickUpLoot(random->nextFloat() < MAX_PICKUP_LOOT_CHANCE * level->getDifficulty(x, y, z)); + + if (getCarried(SLOT_HELM) == NULL) + { + if (Calendar::GetMonth() + 1 == 10 && Calendar::GetDayOfMonth() == 31 && random->nextFloat() < 0.25f) + { + // Halloween! OooOOo! 25% of all skeletons/zombies can wear pumpkins on their heads. + setEquippedSlot(SLOT_HELM, shared_ptr( new ItemInstance(random->nextFloat() < 0.1f ? Tile::litPumpkin : Tile::pumpkin))); + dropChances[SLOT_HELM] = 0; + } + } + return groupData; +} + +void Skeleton::reassessWeaponGoal() +{ + goalSelector.removeGoal(meleeGoal); + goalSelector.removeGoal(bowGoal); + + shared_ptr carried = getCarriedItem(); + + if (carried != NULL && carried->id == Item::bow_Id) { - shared_ptr bow = shared_ptr( new ItemInstance(Item::bow) ); - EnchantmentHelper::enchantItem(random, bow, 5); - spawnAtLocation(bow, 0); + goalSelector.addGoal(4, bowGoal, false); } else { - spawnAtLocation(Item::bow_Id, 1); + goalSelector.addGoal(4, meleeGoal, false); } } -void Skeleton::staticCtor() +void Skeleton::performRangedAttack(shared_ptr target, float power) { - Skeleton::bow = shared_ptr( new ItemInstance(Item::bow, 1) ); + shared_ptr arrow = shared_ptr( new Arrow(level, dynamic_pointer_cast(shared_from_this()), target, 1.60f, 14 - (level->difficulty * 4)) ); + int damageBonus = EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowBonus->id, getCarriedItem()); + int knockbackBonus = EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowKnockback->id, getCarriedItem()); + + arrow->setBaseDamage(power * 2.0f + (random->nextGaussian() * 0.25f + (level->difficulty * 0.11f))); + + if (damageBonus > 0) + { + arrow->setBaseDamage(arrow->getBaseDamage() + (double) damageBonus * .5 + .5); + } + if (knockbackBonus > 0) + { + arrow->setKnockback(knockbackBonus); + } + if (EnchantmentHelper::getEnchantmentLevel(Enchantment::arrowFire->id, getCarriedItem()) > 0 || getSkeletonType() == TYPE_WITHER) + { + arrow->setOnFire(100); + } + + playSound(eSoundType_RANDOM_BOW, 1.0f, 1 / (getRandom()->nextFloat() * 0.4f + 0.8f)); + level->addEntity(arrow); } + +int Skeleton::getSkeletonType() +{ + return (int) entityData->getByte(DATA_TYPE_ID); +} + +void Skeleton::setSkeletonType(int type) +{ + entityData->set(DATA_TYPE_ID, (byte) type); + + fireImmune = type == TYPE_WITHER; + if (type == TYPE_WITHER) + { + setSize(0.6f * 1.2f, 1.8f * 1.3f); + } + else + { + setSize(0.6f, 1.8f); + } +} + +void Skeleton::readAdditionalSaveData(CompoundTag *tag) +{ + Monster::readAdditionalSaveData(tag); + + if (tag->contains(L"SkeletonType")) + { + int value = tag->getByte(L"SkeletonType"); + setSkeletonType(value); + } + + reassessWeaponGoal(); +} + +void Skeleton::addAdditonalSaveData(CompoundTag *entityTag) +{ + Monster::addAdditonalSaveData(entityTag); + entityTag->putByte(L"SkeletonType", (byte) getSkeletonType()); +} + +void Skeleton::setEquippedSlot(int slot, shared_ptr item) +{ + Monster::setEquippedSlot(slot, item); + + if (!level->isClientSide && slot == SLOT_WEAPON) + { + reassessWeaponGoal(); + } +} + +double Skeleton::getRidingHeight() +{ + return Monster::getRidingHeight() - .5; +} \ No newline at end of file diff --git a/Minecraft.World/Skeleton.h b/Minecraft.World/Skeleton.h index b85d9afe..e2f6594c 100644 --- a/Minecraft.World/Skeleton.h +++ b/Minecraft.World/Skeleton.h @@ -2,38 +2,68 @@ using namespace std; #include "Monster.h" +#include "RangedAttackMob.h" -class Skeleton : public Monster +class RangedAttackGoal; +class MeleeAttackGoal; + +class Skeleton : public Monster, public RangedAttackMob { public: eINSTANCEOF GetType() { return eTYPE_SKELETON; } static Entity *create(Level *level) { return new Skeleton(level); } +private: + static const int DATA_TYPE_ID = 13; + +public: + static const int TYPE_DEFAULT = 0; + static const int TYPE_WITHER = 1; + +private: + RangedAttackGoal *bowGoal; + MeleeAttackGoal *meleeGoal; + +public: Skeleton(Level *level); + virtual ~Skeleton(); +protected: + virtual void registerAttributes(); + virtual void defineSynchedData(); + +public: virtual bool useNewAi(); - virtual int getMaxHealth(); protected: virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); + virtual void playStepSound(int xt, int yt, int zt, int t); + +public: + virtual bool doHurtTarget(shared_ptr target); public: - virtual shared_ptr getCarriedItem(); virtual MobType getMobType(); virtual void aiStep(); + virtual void rideTick(); virtual void die(DamageSource *source); protected: virtual int getDeathLoot(); - virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); + virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); virtual void dropRareDeathLoot(int rareLootLevel); - -private: - static shared_ptr bow; + virtual void populateDefaultEquipmentSlots(); public: - - static void staticCtor(); + virtual MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param + virtual void reassessWeaponGoal(); + virtual void performRangedAttack(shared_ptr target, float power); + virtual int getSkeletonType(); + virtual void setSkeletonType(int type); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *entityTag); + virtual void setEquippedSlot(int slot, shared_ptr item); + virtual double getRidingHeight(); }; diff --git a/Minecraft.World/SkullItem.cpp b/Minecraft.World/SkullItem.cpp index 643021dc..8fabc3cd 100644 --- a/Minecraft.World/SkullItem.cpp +++ b/Minecraft.World/SkullItem.cpp @@ -9,7 +9,7 @@ const unsigned int SkullItem::NAMES[SKULL_COUNT] = {IDS_ITEM_SKULL_SKELETON, IDS_ITEM_SKULL_WITHER, IDS_ITEM_SKULL_ZOMBIE, IDS_ITEM_SKULL_CHARACTER, IDS_ITEM_SKULL_CREEPER}; -wstring SkullItem::ICON_NAMES[SKULL_COUNT] = {L"skull_skeleton", L"skull_wither", L"skull_zombie", L"skull_char", L"skull_creeper"}; +wstring SkullItem::ICON_NAMES[SKULL_COUNT] = {L"skeleton", L"wither", L"zombie", L"char", L"creeper"}; SkullItem::SkullItem(int id) : Item(id) { @@ -31,13 +31,13 @@ bool SkullItem::useOn(shared_ptr instance, shared_ptr play if (face == 5) x++; //if (!player->mayUseItemAt(x, y, z, face, instance)) return false; - if (!player->mayBuild(x, y, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; if (!Tile::skull->mayPlace(level, x, y, z)) return false; if(!bTestUseOnOnly) { - level->setTileAndData(x, y, z, Tile::skull_Id, face) ;//, Tile.UPDATE_CLIENTS); + level->setTileAndData(x, y, z, Tile::skull_Id, face, Tile::UPDATE_CLIENTS); int rot = 0; if (face == Facing::UP) @@ -82,7 +82,7 @@ bool SkullItem::mayPlace(Level *level, int x, int y, int z, int face, shared_ptr if (face == 5) x++; } - return level->mayPlace(Tile::skull_Id, x, y, z, false, face, nullptr) ;//, item); + return level->mayPlace(Tile::skull_Id, x, y, z, false, face, nullptr, item); } Icon *SkullItem::getIcon(int itemAuxValue) @@ -136,6 +136,6 @@ void SkullItem::registerIcons(IconRegister *iconRegister) { for (int i = 0; i < SKULL_COUNT; i++) { - icons[i] = iconRegister->registerIcon(ICON_NAMES[i]); + icons[i] = iconRegister->registerIcon(getIconName() + L"_" + ICON_NAMES[i]); } } \ No newline at end of file diff --git a/Minecraft.World/SkullTile.cpp b/Minecraft.World/SkullTile.cpp index 73aef0e1..92ce7807 100644 --- a/Minecraft.World/SkullTile.cpp +++ b/Minecraft.World/SkullTile.cpp @@ -1,11 +1,14 @@ #include "stdafx.h" -#include "net.minecraft.world.level.h" +#include "net.minecraft.world.h" +#include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.entity.h" +#include "WitherBoss.h" #include "net.minecraft.h" #include "SkullTile.h" -SkullTile::SkullTile(int id) : EntityTile(id, Material::decoration, isSolidRender() ) +SkullTile::SkullTile(int id) : BaseEntityTile(id, Material::decoration, isSolidRender() ) { setShape(4.0f / 16.0f, 0, 4.0f / 16.0f, 12.0f / 16.0f, .5f, 12.0f / 16.0f); } @@ -53,13 +56,13 @@ void SkullTile::updateShape(LevelSource *level, int x, int y, int z, int forceDa AABB *SkullTile::getAABB(Level *level, int x, int y, int z) { updateShape(level, x, y, z); - return EntityTile::getAABB(level, x, y, z); + return BaseEntityTile::getAABB(level, x, y, z); } -void SkullTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void SkullTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) { int dir = Mth::floor(by->yRot * 4 / (360) + 2.5) & 3; - level->setData(x, y, z, dir); + level->setData(x, y, z, dir, Tile::UPDATE_CLIENTS); } shared_ptr SkullTile::newTileEntity(Level *level) @@ -80,9 +83,7 @@ int SkullTile::cloneTileData(Level *level, int x, int y, int z) { return skull->getSkullType(); } - return 0; - // 4J Stu - Not added yet - //return EntityTile::cloneTileData(level, x, y, z); + return BaseEntityTile::cloneTileData(level, x, y, z); } int SkullTile::getSpawnResourcesAuxValue(int data) @@ -98,22 +99,18 @@ void SkullTile::spawnResources(Level *level, int x, int y, int z, int data, floa void SkullTile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player) { - // 4J Stu - Not implemented -#if 0 if (player->abilities.instabuild) { // prevent resource drop data |= NO_DROP_BIT; - level.setData(x, y, z, data); + level->setData(x, y, z, data, Tile::UPDATE_NONE); } - EntityTile::playerWillDestroy(level, x, y, z, data, player); -#endif + BaseEntityTile::playerWillDestroy(level, x, y, z, data, player); } -void SkullTile::onRemove(Level *level, int x, int y, int z)//, int id, int data) +void SkullTile::onRemove(Level *level, int x, int y, int z, int id, int data) { if (level->isClientSide) return; - int data = level->getData(x, y, z); if ((data & NO_DROP_BIT) == 0) { shared_ptr item = shared_ptr(new ItemInstance(Item::skull_Id, 1, cloneTileData(level, x, y, z))); @@ -127,7 +124,7 @@ void SkullTile::onRemove(Level *level, int x, int y, int z)//, int id, int data) popResource(level, x, y, z, item); } - EntityTile::onRemove(level, x, y, z, id, data); + BaseEntityTile::onRemove(level, x, y, z, id, data); } int SkullTile::getResource(int data, Random *random, int playerBonusLevel) @@ -137,105 +134,136 @@ int SkullTile::getResource(int data, Random *random, int playerBonusLevel) void SkullTile::checkMobSpawn(Level *level, int x, int y, int z, shared_ptr placedSkull) { - // 4J Stu - Don't have Withers yet, so don't need this -#if 0 - if (placedSkull.getSkullType() == SkullTileEntity.TYPE_WITHER && y >= 2 && level.difficulty > Difficulty.PEACEFUL) { - - // check wither boss spawn - - final int ss = Tile.hellSand.id; + if (placedSkull->getSkullType() == SkullTileEntity::TYPE_WITHER && y >= 2 && level->difficulty > Difficulty::PEACEFUL && !level->isClientSide) + { + // Check wither boss spawn + int ss = Tile::soulsand_Id; - // north-south alignment - for (int zo = -2; zo <= 0; zo++) { + // North-south alignment + for (int zo = -2; zo <= 0; zo++) + { if ( // - level.getTile(x, y - 1, z + zo) == ss && // - level.getTile(x, y - 1, z + zo + 1) == ss && // - level.getTile(x, y - 2, z + zo + 1) == ss && // - level.getTile(x, y - 1, z + zo + 2) == ss && // - isSkullAt(level, x, y, z + zo, SkullTileEntity.TYPE_WITHER) && // - isSkullAt(level, x, y, z + zo + 1, SkullTileEntity.TYPE_WITHER) && // - isSkullAt(level, x, y, z + zo + 2, SkullTileEntity.TYPE_WITHER)) { - - level.setDataNoUpdate(x, y, z + zo, NO_DROP_BIT); - level.setDataNoUpdate(x, y, z + zo + 1, NO_DROP_BIT); - level.setDataNoUpdate(x, y, z + zo + 2, NO_DROP_BIT); - level.setTileNoUpdate(x, y, z + zo, 0); - level.setTileNoUpdate(x, y, z + zo + 1, 0); - level.setTileNoUpdate(x, y, z + zo + 2, 0); - level.setTileNoUpdate(x, y - 1, z + zo, 0); - level.setTileNoUpdate(x, y - 1, z + zo + 1, 0); - level.setTileNoUpdate(x, y - 1, z + zo + 2, 0); - level.setTileNoUpdate(x, y - 2, z + zo + 1, 0); - - if (!level.isClientSide) { - WitherBoss witherBoss = new WitherBoss(level); - witherBoss.moveTo(x + 0.5, y - 1.45, z + zo + 1.5, 90, 0); - witherBoss.yBodyRot = 90; - witherBoss.makeInvulnerable(); - level.addEntity(witherBoss); - } - - for (int i = 0; i < 120; i++) { - level.addParticle("snowballpoof", x + level.random.nextDouble(), y - 2 + level.random.nextDouble() * 3.9, z + zo + 1 + level.random.nextDouble(), 0, 0, 0); - } - - level.tileUpdated(x, y, z + zo, 0); - level.tileUpdated(x, y, z + zo + 1, 0); - level.tileUpdated(x, y, z + zo + 2, 0); - level.tileUpdated(x, y - 1, z + zo, 0); - level.tileUpdated(x, y - 1, z + zo + 1, 0); - level.tileUpdated(x, y - 1, z + zo + 2, 0); - level.tileUpdated(x, y - 2, z + zo + 1, 0); - - return; + level->getTile(x, y - 1, z + zo) == ss && // + level->getTile(x, y - 1, z + zo + 1) == ss && // + level->getTile(x, y - 2, z + zo + 1) == ss && // + level->getTile(x, y - 1, z + zo + 2) == ss && // + isSkullAt(level, x, y, z + zo, SkullTileEntity::TYPE_WITHER) && // + isSkullAt(level, x, y, z + zo + 1, SkullTileEntity::TYPE_WITHER) && // + isSkullAt(level, x, y, z + zo + 2, SkullTileEntity::TYPE_WITHER)) + { + level->setData(x, y, z + zo, NO_DROP_BIT, Tile::UPDATE_CLIENTS); + level->setData(x, y, z + zo + 1, NO_DROP_BIT, Tile::UPDATE_CLIENTS); + level->setData(x, y, z + zo + 2, NO_DROP_BIT, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y, z + zo, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y, z + zo + 1, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y, z + zo + 2, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z + zo, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z + zo + 1, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z + zo + 2, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 2, z + zo + 1, 0, 0, Tile::UPDATE_CLIENTS); + + // 4J: Check that we can spawn a Wither + if (level->canCreateMore(eTYPE_WITHERBOSS, Level::eSpawnType_Egg)) + { + // 4J: Removed !isClientSide check because there's one earlier on + shared_ptr witherBoss = shared_ptr( new WitherBoss(level) ); + witherBoss->moveTo(x + 0.5, y - 1.45, z + zo + 1.5, 90, 0); + witherBoss->yBodyRot = 90; + witherBoss->makeInvulnerable(); + level->addEntity(witherBoss); + } + else + { + // 4J: Can't spawn, drop resource instead + Tile::tiles[Tile::soulsand_Id]->spawnResources(level, x, y - 1, z + zo, 0, 0); + Tile::tiles[Tile::soulsand_Id]->spawnResources(level, x, y - 1, z + zo + 1, 0, 0); + Tile::tiles[Tile::soulsand_Id]->spawnResources(level, x, y - 2, z + zo + 1, 0, 0); + Tile::tiles[Tile::soulsand_Id]->spawnResources(level, x, y - 1, z + zo + 2, 0, 0); + + shared_ptr itemInstance = shared_ptr(new ItemInstance(Item::skull_Id, 3, SkullTileEntity::TYPE_WITHER)); + shared_ptr itemEntity = shared_ptr(new ItemEntity(level, x, y, z + zo + 1, itemInstance) ); + level->addEntity(itemEntity); + } + + for (int i = 0; i < 120; i++) + { + level->addParticle(eParticleType_snowballpoof, x + level->random->nextDouble(), y - 2 + level->random->nextDouble() * 3.9, z + zo + 1 + level->random->nextDouble(), 0, 0, 0); + } + + level->tileUpdated(x, y, z + zo, 0); + level->tileUpdated(x, y, z + zo + 1, 0); + level->tileUpdated(x, y, z + zo + 2, 0); + level->tileUpdated(x, y - 1, z + zo, 0); + level->tileUpdated(x, y - 1, z + zo + 1, 0); + level->tileUpdated(x, y - 1, z + zo + 2, 0); + level->tileUpdated(x, y - 2, z + zo + 1, 0); + + return; } } - // west-east alignment - for (int xo = -2; xo <= 0; xo++) { + // West-east alignment + for (int xo = -2; xo <= 0; xo++) + { if ( // - level.getTile(x + xo, y - 1, z) == ss && // - level.getTile(x + xo + 1, y - 1, z) == ss && // - level.getTile(x + xo + 1, y - 2, z) == ss && // - level.getTile(x + xo + 2, y - 1, z) == ss && // - isSkullAt(level, x + xo, y, z, SkullTileEntity.TYPE_WITHER) && // - isSkullAt(level, x + xo + 1, y, z, SkullTileEntity.TYPE_WITHER) && // - isSkullAt(level, x + xo + 2, y, z, SkullTileEntity.TYPE_WITHER)) { - - level.setDataNoUpdate(x + xo, y, z, NO_DROP_BIT); - level.setDataNoUpdate(x + xo + 1, y, z, NO_DROP_BIT); - level.setDataNoUpdate(x + xo + 2, y, z, NO_DROP_BIT); - level.setTileNoUpdate(x + xo, y, z, 0); - level.setTileNoUpdate(x + xo + 1, y, z, 0); - level.setTileNoUpdate(x + xo + 2, y, z, 0); - level.setTileNoUpdate(x + xo, y - 1, z, 0); - level.setTileNoUpdate(x + xo + 1, y - 1, z, 0); - level.setTileNoUpdate(x + xo + 2, y - 1, z, 0); - level.setTileNoUpdate(x + xo + 1, y - 2, z, 0); - - if (!level.isClientSide) { - WitherBoss witherBoss = new WitherBoss(level); - witherBoss.moveTo(x + xo + 1.5, y - 1.45, z + .5, 0, 0); - witherBoss.makeInvulnerable(); - level.addEntity(witherBoss); - } - - for (int i = 0; i < 120; i++) { - level.addParticle("snowballpoof", x + xo + 1 + level.random.nextDouble(), y - 2 + level.random.nextDouble() * 3.9, z + level.random.nextDouble(), 0, 0, 0); - } - - level.tileUpdated(x + xo, y, z, 0); - level.tileUpdated(x + xo + 1, y, z, 0); - level.tileUpdated(x + xo + 2, y, z, 0); - level.tileUpdated(x + xo, y - 1, z, 0); - level.tileUpdated(x + xo + 1, y - 1, z, 0); - level.tileUpdated(x + xo + 2, y - 1, z, 0); - level.tileUpdated(x + xo + 1, y - 2, z, 0); - - return; + level->getTile(x + xo, y - 1, z) == ss && // + level->getTile(x + xo + 1, y - 1, z) == ss && // + level->getTile(x + xo + 1, y - 2, z) == ss && // + level->getTile(x + xo + 2, y - 1, z) == ss && // + isSkullAt(level, x + xo, y, z, SkullTileEntity::TYPE_WITHER) && // + isSkullAt(level, x + xo + 1, y, z, SkullTileEntity::TYPE_WITHER) && // + isSkullAt(level, x + xo + 2, y, z, SkullTileEntity::TYPE_WITHER)) + { + + level->setData(x + xo, y, z, NO_DROP_BIT, Tile::UPDATE_CLIENTS); + level->setData(x + xo + 1, y, z, NO_DROP_BIT, Tile::UPDATE_CLIENTS); + level->setData(x + xo + 2, y, z, NO_DROP_BIT, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + xo, y, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + xo + 1, y, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + xo + 2, y, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + xo, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + xo + 1, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + xo + 2, y - 1, z, 0, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + xo + 1, y - 2, z, 0, 0, Tile::UPDATE_CLIENTS); + + // 4J: Check that we can spawn a Wither + if (level->canCreateMore(eTYPE_WITHERBOSS, Level::eSpawnType_Egg)) + { + // 4J: Removed !isClientSide check because there's one earlier on + shared_ptr witherBoss = shared_ptr( new WitherBoss(level) ); + witherBoss->moveTo(x + xo + 1.5, y - 1.45, z + .5, 0, 0); + witherBoss->makeInvulnerable(); + level->addEntity(witherBoss); + } + else + { + // 4J: Can't spawn, drop resource instead + Tile::tiles[Tile::soulsand_Id]->spawnResources(level, x + xo, y - 1, z, 0, 0); + Tile::tiles[Tile::soulsand_Id]->spawnResources(level, x + xo + 1, y - 1, z, 0, 0); + Tile::tiles[Tile::soulsand_Id]->spawnResources(level, x + xo + 1, y - 2, z, 0, 0); + Tile::tiles[Tile::soulsand_Id]->spawnResources(level, x + xo + 2, y - 1, z, 0, 0); + + shared_ptr itemInstance = shared_ptr(new ItemInstance(Item::skull_Id, 3, SkullTileEntity::TYPE_WITHER)); + shared_ptr itemEntity = shared_ptr(new ItemEntity(level, x + xo + 1, y, z, itemInstance) ); + level->addEntity(itemEntity); + } + + for (int i = 0; i < 120; i++) + { + level->addParticle(eParticleType_snowballpoof, x + xo + 1 + level->random->nextDouble(), y - 2 + level->random->nextDouble() * 3.9, z + level->random->nextDouble(), 0, 0, 0); + } + + level->tileUpdated(x + xo, y, z, 0); + level->tileUpdated(x + xo + 1, y, z, 0); + level->tileUpdated(x + xo + 2, y, z, 0); + level->tileUpdated(x + xo, y - 1, z, 0); + level->tileUpdated(x + xo + 1, y - 1, z, 0); + level->tileUpdated(x + xo + 2, y - 1, z, 0); + level->tileUpdated(x + xo + 1, y - 2, z, 0); + + return; } } } -#endif } bool SkullTile::isSkullAt(Level *level, int x, int y, int z, int skullType) @@ -260,11 +288,10 @@ void SkullTile::registerIcons(IconRegister *iconRegister) Icon *SkullTile::getTexture(int face, int data) { - return Tile::hellSand->getTexture(face); + return Tile::soulsand->getTexture(face); } wstring SkullTile::getTileItemIconName() { - return L""; - //return SkullItem::ICON_NAMES[0]; + return getIconName() + L"_" + SkullItem::ICON_NAMES[0]; } \ No newline at end of file diff --git a/Minecraft.World/SkullTile.h b/Minecraft.World/SkullTile.h index 1d514acd..8370a807 100644 --- a/Minecraft.World/SkullTile.h +++ b/Minecraft.World/SkullTile.h @@ -1,10 +1,10 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" class SkullTileEntity; -class SkullTile : public EntityTile +class SkullTile : public BaseEntityTile { friend class Tile; public: @@ -16,21 +16,21 @@ public: SkullTile(int id); public: - using EntityTile::onRemove; + using BaseEntityTile::onRemove; int getRenderShape(); bool isSolidRender(bool isServerLevel = false); bool isCubeShaped(); void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); AABB *getAABB(Level *level, int x, int y, int z); - void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); shared_ptr newTileEntity(Level *level); int cloneTileId(Level *level, int x, int y, int z); int cloneTileData(Level *level, int x, int y, int z); int getSpawnResourcesAuxValue(int data); void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player); - void onRemove(Level *level, int x, int y, int z); //, int id, int data); + void onRemove(Level *level, int x, int y, int z, int id, int data); int getResource(int data, Random *random, int playerBonusLevel); void checkMobSpawn(Level *level, int x, int y, int z, shared_ptr placedSkull); diff --git a/Minecraft.World/Slime.cpp b/Minecraft.World/Slime.cpp index 7941fbe0..eb80d09c 100644 --- a/Minecraft.World/Slime.cpp +++ b/Minecraft.World/Slime.cpp @@ -6,8 +6,10 @@ #include "net.minecraft.world.level.chunk.h" #include "net.minecraft.world.entity.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.damagesource.h" #include "com.mojang.nbt.h" #include "Slime.h" @@ -30,15 +32,13 @@ Slime::Slime(Level *level) : Mob( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); _init(); - this->textureIdx = TN_MOB_SLIME; // 4J was L"/mob/slime.png"; int size = 1 << (random->nextInt(3)); - this->heightOffset = 0; + heightOffset = 0; jumpDelay = random->nextInt(20) + 10; setSize(size); } @@ -53,18 +53,13 @@ void Slime::defineSynchedData() void Slime::setSize(int size) { entityData->set(ID_SIZE, (byte) size); - Mob::setSize(0.6f * size, 0.6f * size); - this->setPos(x, y, z); + setSize(0.6f * size, 0.6f * size); + setPos(x, y, z); + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(size * size); setHealth(getMaxHealth()); xpReward = size; } -int Slime::getMaxHealth() -{ - int size = getSize(); - return size * size; -} - int Slime::getSize() { return entityData->getByte(ID_SIZE); @@ -89,7 +84,7 @@ ePARTICLE_TYPE Slime::getParticleName() int Slime::getSquishSound() { - return eSoundType_MOB_SLIME; + return getSize() > 1 ? eSoundType_MOB_SLIME_BIG : eSoundType_MOB_SLIME; } void Slime::tick() @@ -102,7 +97,7 @@ void Slime::tick() squish = squish + (targetSquish - squish) * .5f; oSquish = squish; - bool wasOnGround = this->onGround; + bool wasOnGround = onGround; Mob::tick(); if (onGround && !wasOnGround) { @@ -118,7 +113,7 @@ void Slime::tick() if (doPlayLandSound()) { - level->playSound(shared_from_this(), getSquishSound(), getSoundVolume(), ((random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f) / 0.8f); + playSound(getSquishSound(), getSoundVolume(), ((random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f) / 0.8f); } targetSquish = -0.5f; } @@ -128,6 +123,12 @@ void Slime::tick() targetSquish = 1; } decreaseSquish(); + + if (level->isClientSide) + { + int size = getSize(); + setSize(0.6f * size, 0.6f * size); + } } void Slime::serverAiStep() @@ -148,7 +149,7 @@ void Slime::serverAiStep() jumping = true; if (doPlayJumpSound()) { - level->playSound(shared_from_this(), getSquishSound(), getSoundVolume(), ((random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f) * 0.8f); + playSound(getSquishSound(), getSoundVolume(), ((random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f) * 0.8f); } // 4J Removed TU7 to bring forward change to fix lava slime render in MP @@ -211,12 +212,12 @@ void Slime::playerTouch(shared_ptr player) if (isDealsDamage()) { int size = getSize(); - if (canSee(player) && this->distanceToSqr(player) < (0.6 * size) * (0.6 * size)) + if (canSee(player) && distanceToSqr(player) < (0.6 * size) * (0.6 * size)) { DamageSource *damageSource = DamageSource::mobAttack( dynamic_pointer_cast( shared_from_this() ) ); if (player->hurt(damageSource, getAttackDamage())) { - level->playSound(shared_from_this(), eSoundType_MOB_SLIME_ATTACK, 1, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + playSound(eSoundType_MOB_SLIME_ATTACK, 1, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); } delete damageSource; } @@ -235,12 +236,12 @@ int Slime::getAttackDamage() int Slime::getHurtSound() { - return eSoundType_MOB_SLIME; + return getSize() > 1 ? eSoundType_MOB_SLIME_BIG : eSoundType_MOB_SLIME; } int Slime::getDeathSound() { - return eSoundType_MOB_SLIME; + return getSize() > 1 ? eSoundType_MOB_SLIME_BIG : eSoundType_MOB_SLIME; } int Slime::getDeathLoot() @@ -257,11 +258,24 @@ bool Slime::canSpawn() return false; } Random *lcr = lc->getRandom(987234911l); // 4J - separated out so we can delete - if ((getSize() == 1 || level->difficulty > Difficulty::PEACEFUL) && random->nextInt(10) == 0 && lcr->nextInt(10) == 0 && y < 40) + if ((getSize() == 1 || level->difficulty > Difficulty::PEACEFUL)) { - delete lcr; - return Mob::canSpawn(); + // spawn slime in swamplands at night + Biome *biome = level->getBiome(Mth::floor(x), Mth::floor(z)); + + if (biome == Biome::swampland && y > 50 && y < 70 && random->nextFloat() < 0.5f) + { + if (random->nextFloat() < level->getMoonBrightness() && level->getRawBrightness(Mth::floor(x), Mth::floor(y), Mth::floor(z)) <= random->nextInt(8)) + { + return Mob::canSpawn(); + } + } + if (random->nextInt(10) == 0 && lcr->nextInt(10) == 0 && y < 40) + { + return Mob::canSpawn(); + } } + delete lcr; return false; } @@ -278,7 +292,7 @@ int Slime::getMaxHeadXRot() bool Slime::doPlayJumpSound() { - return getSize() > 1; + return getSize() > 0; } bool Slime::doPlayLandSound() diff --git a/Minecraft.World/Slime.h b/Minecraft.World/Slime.h index 6fa56056..95a1aef1 100644 --- a/Minecraft.World/Slime.h +++ b/Minecraft.World/Slime.h @@ -31,10 +31,9 @@ protected: virtual void defineSynchedData(); public: - using Entity::setSize; + using Mob::setSize; virtual void setSize(int size); - virtual int getMaxHealth(); virtual int getSize(); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); diff --git a/Minecraft.World/Slot.cpp b/Minecraft.World/Slot.cpp index 30fd9125..c7d1a029 100644 --- a/Minecraft.World/Slot.cpp +++ b/Minecraft.World/Slot.cpp @@ -116,6 +116,11 @@ bool Slot::mayPickup(shared_ptr player) return true; } +bool Slot::isActive() +{ + return true; +} + bool Slot::mayCombine(shared_ptr second) { shared_ptr first = getItem(); diff --git a/Minecraft.World/Slot.h b/Minecraft.World/Slot.h index 6289ec0e..12399783 100644 --- a/Minecraft.World/Slot.h +++ b/Minecraft.World/Slot.h @@ -36,6 +36,7 @@ public: virtual shared_ptr remove(int c); virtual bool isAt(shared_ptr c, int s); virtual bool mayPickup(shared_ptr player); + virtual bool isActive(); virtual bool mayCombine(shared_ptr item); // 4J Added virtual shared_ptr combine(shared_ptr item); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/SmallFireball.cpp b/Minecraft.World/SmallFireball.cpp index a1fa5cb1..30f7a0b2 100644 --- a/Minecraft.World/SmallFireball.cpp +++ b/Minecraft.World/SmallFireball.cpp @@ -11,7 +11,7 @@ SmallFireball::SmallFireball(Level *level) : Fireball(level) setSize(5 / 16.0f, 5 / 16.0f); } -SmallFireball::SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) +SmallFireball::SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) { setSize(5 / 16.0f, 5 / 16.0f); } @@ -62,7 +62,7 @@ void SmallFireball::onHit(HitResult *res) }; if (level->isEmptyTile(tileX, tileY, tileZ)) { - level->setTile(tileX, tileY, tileZ, Tile::fire_Id); + level->setTileAndUpdate(tileX, tileY, tileZ, Tile::fire_Id); } } remove(); @@ -74,7 +74,7 @@ bool SmallFireball::isPickable() return false; } -bool SmallFireball::hurt(DamageSource *source, int damage) +bool SmallFireball::hurt(DamageSource *source, float damage) { return false; } \ No newline at end of file diff --git a/Minecraft.World/SmallFireball.h b/Minecraft.World/SmallFireball.h index 38ad8efd..bb2e67ae 100644 --- a/Minecraft.World/SmallFireball.h +++ b/Minecraft.World/SmallFireball.h @@ -12,7 +12,7 @@ public: public: SmallFireball(Level *level); - SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za); + SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za); SmallFireball(Level *level, double x, double y, double z, double xa, double ya, double za); protected: @@ -20,5 +20,5 @@ protected: public: virtual bool isPickable(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); }; \ No newline at end of file diff --git a/Minecraft.World/SmoothStoneBrickTile.cpp b/Minecraft.World/SmoothStoneBrickTile.cpp index 372901ec..22fb6df5 100644 --- a/Minecraft.World/SmoothStoneBrickTile.cpp +++ b/Minecraft.World/SmoothStoneBrickTile.cpp @@ -2,7 +2,7 @@ #include "SmoothStoneBrickTile.h" #include "net.minecraft.world.h" -const wstring SmoothStoneBrickTile::TEXTURE_NAMES[] = {L"stonebricksmooth", L"stonebricksmooth_mossy", L"stonebricksmooth_cracked", L"stonebricksmooth_carved"}; +const wstring SmoothStoneBrickTile::TEXTURE_NAMES[] = {L"", L"mossy", L"cracked", L"carved"}; const unsigned int SmoothStoneBrickTile::SMOOTH_STONE_BRICK_NAMES[SMOOTH_STONE_BRICK_NAMES_LENGTH] = { IDS_TILE_STONE_BRICK_SMOOTH, IDS_TILE_STONE_BRICK_SMOOTH_MOSSY, @@ -38,6 +38,8 @@ void SmoothStoneBrickTile::registerIcons(IconRegister *iconRegister) for (int i = 0; i < SMOOTH_STONE_BRICK_NAMES_LENGTH; i++) { - icons[i] = iconRegister->registerIcon(TEXTURE_NAMES[i]); + wstring name = getIconName(); + if (!TEXTURE_NAMES[i].empty() ) name += L"_" + TEXTURE_NAMES[i]; + icons[i] = iconRegister->registerIcon(name); } } \ No newline at end of file diff --git a/Minecraft.World/SnowItem.cpp b/Minecraft.World/SnowItem.cpp new file mode 100644 index 00000000..73cb57ad --- /dev/null +++ b/Minecraft.World/SnowItem.cpp @@ -0,0 +1,45 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.h" +#include "SnowItem.h" + +SnowItem::SnowItem(int id, Tile *parentTile) : AuxDataTileItem(id, parentTile) +{ +} + +bool SnowItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +{ + if (instance->count == 0) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; + + int currentTile = level->getTile(x, y, z); + + // Are we adding extra snow to an existing tile? + if (currentTile == Tile::topSnow_Id) + { + Tile *snowTile = Tile::tiles[getTileId()]; + int currentData = level->getData(x, y, z); + int currentHeight = currentData & TopSnowTile::HEIGHT_MASK; + + if (currentHeight <= TopSnowTile::MAX_HEIGHT && level->isUnobstructed(snowTile->getAABB(level, x, y, z))) + { + if (!bTestUseOnOnly) + { + // Increase snow tile height + if (level->setData(x, y, z, (currentHeight + 1) | (currentData & ~TopSnowTile::HEIGHT_MASK), Tile::UPDATE_CLIENTS)) + { + level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, snowTile->soundType->getPlaceSound(), (snowTile->soundType->getVolume() + 1) / 2, snowTile->soundType->getPitch() * 0.8f); + instance->count--; + return true; + } + } + else + { + return true; + } + } + } + + return AuxDataTileItem::useOn(instance, player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnOnly); +} \ No newline at end of file diff --git a/Minecraft.World/SnowItem.h b/Minecraft.World/SnowItem.h new file mode 100644 index 00000000..47b0049a --- /dev/null +++ b/Minecraft.World/SnowItem.h @@ -0,0 +1,11 @@ +#pragma once + +#include "AuxDataTileItem.h" + +class SnowItem : public AuxDataTileItem +{ +public: + SnowItem(int id, Tile *parentTile); + + bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); +}; \ No newline at end of file diff --git a/Minecraft.World/SnowMan.cpp b/Minecraft.World/SnowMan.cpp index 958b8126..6c78b56f 100644 --- a/Minecraft.World/SnowMan.cpp +++ b/Minecraft.World/SnowMan.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" #include "net.minecraft.world.entity.ai.navigation.h" @@ -22,20 +23,18 @@ SnowMan::SnowMan(Level *level) : Golem(level) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SNOWMAN;// 4J was "/mob/snowman.png"; this->setSize(0.4f, 1.8f); getNavigation()->setAvoidWater(true); - goalSelector.addGoal(1, new ArrowAttackGoal(this, 0.25f, ArrowAttackGoal::SnowballType, SharedConstants::TICKS_PER_SECOND * 1)); - goalSelector.addGoal(2, new RandomStrollGoal(this, 0.2f)); + goalSelector.addGoal(1, new RangedAttackGoal(this, this, 1.25, SharedConstants::TICKS_PER_SECOND * 1, 10)); + goalSelector.addGoal(2, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(3, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, typeid(Monster), 16, 0, true)); + targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, typeid(Mob), 0, true, false, Enemy::ENEMY_SELECTOR)); } bool SnowMan::useNewAi() @@ -43,16 +42,19 @@ bool SnowMan::useNewAi() return true; } -int SnowMan::getMaxHealth() +void SnowMan::registerAttributes() { - return 4; + Golem::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(4); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.2f); } void SnowMan::aiStep() { Golem::aiStep(); - if (this->isInWaterOrRain()) hurt(DamageSource::drown, 1); + if (isInWaterOrRain()) hurt(DamageSource::drown, 1); { int xx = Mth::floor(x); @@ -74,7 +76,7 @@ void SnowMan::aiStep() { if (Tile::topSnow->mayPlace(level, xx, yy, zz)) { - level->setTile(xx, yy, zz, Tile::topSnow_Id); + level->setTileAndUpdate(xx, yy, zz, Tile::topSnow_Id); } } } @@ -94,4 +96,17 @@ void SnowMan::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) for (int i = 0; i < count; i++) { spawnAtLocation(Item::snowBall_Id, 1); } +} + +void SnowMan::performRangedAttack(shared_ptr target, float power) +{ + shared_ptr snowball = shared_ptr(new Snowball(level, dynamic_pointer_cast(shared_from_this()))); + double xd = target->x - x; + double yd = (target->y + target->getHeadHeight() - 1.1f) - snowball->y; + double zd = target->z - z; + float yo = Mth::sqrt(xd * xd + zd * zd) * 0.2f; + snowball->shoot(xd, yd + yo, zd, 1.60f, 12); + + playSound(eSoundType_RANDOM_BOW, 1.0f, 1 / (getRandom()->nextFloat() * 0.4f + 0.8f)); + level->addEntity(snowball); } \ No newline at end of file diff --git a/Minecraft.World/SnowMan.h b/Minecraft.World/SnowMan.h index cf6f094a..52dbb52f 100644 --- a/Minecraft.World/SnowMan.h +++ b/Minecraft.World/SnowMan.h @@ -1,8 +1,9 @@ #pragma once #include "Golem.h" +#include "RangedAttackMob.h" -class SnowMan : public Golem +class SnowMan : public Golem, public RangedAttackMob { public: eINSTANCEOF GetType() { return eTYPE_SNOWMAN; } @@ -12,10 +13,16 @@ public: SnowMan(Level *level); virtual bool useNewAi(); - virtual int getMaxHealth(); +protected: + virtual void registerAttributes(); + +public: virtual void aiStep(); protected: virtual int getDeathLoot(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); + +public: + virtual void performRangedAttack(shared_ptr target, float power); }; \ No newline at end of file diff --git a/Minecraft.World/SnowTile.cpp b/Minecraft.World/SnowTile.cpp index dde16379..e73f5ceb 100644 --- a/Minecraft.World/SnowTile.cpp +++ b/Minecraft.World/SnowTile.cpp @@ -25,11 +25,11 @@ void SnowTile::tick(Level *level, int x, int y, int z, Random *random) if (level->getBrightness(LightLayer::Block, x, y, z) > 11) { this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } } bool SnowTile::shouldTileTick(Level *level, int x,int y,int z) { - return level->getBrightness(LightLayer::Block, x, y, z) > 11; + return level->getBrightness(LightLayer::Block, x, y, z) > 11; } \ No newline at end of file diff --git a/Minecraft.World/Snowball.cpp b/Minecraft.World/Snowball.cpp index cdcefb1b..6588ac96 100644 --- a/Minecraft.World/Snowball.cpp +++ b/Minecraft.World/Snowball.cpp @@ -19,7 +19,7 @@ Snowball::Snowball(Level *level) : Throwable(level) _init(); } -Snowball::Snowball(Level *level, shared_ptr mob) : Throwable(level,mob) +Snowball::Snowball(Level *level, shared_ptr mob) : Throwable(level,mob) { _init(); } @@ -34,12 +34,12 @@ void Snowball::onHit(HitResult *res) if (res->entity != NULL) { int damage = 0; - if (dynamic_pointer_cast(res->entity) != NULL) + if ( res->entity->instanceof(eTYPE_BLAZE) ) { damage = 3; } - DamageSource *damageSource = DamageSource::thrown(shared_from_this(), owner); + DamageSource *damageSource = DamageSource::thrown(shared_from_this(), getOwner()); res->entity->hurt(damageSource, damage); delete damageSource; } diff --git a/Minecraft.World/Snowball.h b/Minecraft.World/Snowball.h index 82971726..d78dfade 100644 --- a/Minecraft.World/Snowball.h +++ b/Minecraft.World/Snowball.h @@ -16,7 +16,7 @@ private: public: Snowball(Level *level); - Snowball(Level *level, shared_ptr mob); + Snowball(Level *level, shared_ptr mob); Snowball(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/SnowballItem.cpp b/Minecraft.World/SnowballItem.cpp index 41dd2b7c..0149e68d 100644 --- a/Minecraft.World/SnowballItem.cpp +++ b/Minecraft.World/SnowballItem.cpp @@ -8,7 +8,7 @@ SnowballItem::SnowballItem(int id) : Item(id) { - this->maxStackSize = 16; + this->maxStackSize = 16; } shared_ptr SnowballItem::use(shared_ptr instance, Level *level, shared_ptr player) @@ -17,7 +17,7 @@ shared_ptr SnowballItem::use(shared_ptr instance, Le { instance->count--; } - level->playSound((shared_ptr ) player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) level->addEntity( shared_ptr( new Snowball(level, player) ) ); - return instance; + level->playEntitySound((shared_ptr ) player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + if (!level->isClientSide) level->addEntity( shared_ptr( new Snowball(level, player) ) ); + return instance; } \ No newline at end of file diff --git a/Minecraft.World/Socket.cpp b/Minecraft.World/Socket.cpp index 4b703403..bd0c2032 100644 --- a/Minecraft.World/Socket.cpp +++ b/Minecraft.World/Socket.cpp @@ -500,6 +500,14 @@ void Socket::SocketOutputStreamNetwork::writeWithFlags(byteArray b, unsigned int return; } +#ifdef _XBOX + bool lowPriority = ( ( flags & QNET_SENDDATA_LOW_PRIORITY ) == QNET_SENDDATA_LOW_PRIORITY ); + bool requireAck = lowPriority; +#else + bool lowPriority = false; + bool requireAck = ( ( flags & NON_QNET_SENDDATA_ACK_REQUIRED ) == NON_QNET_SENDDATA_ACK_REQUIRED ); +#endif + if( m_queueIdx == SOCKET_SERVER_END ) { //printf( "Sent %u bytes of data from \"%ls\" to \"%ls\"\n", @@ -507,7 +515,7 @@ void Socket::SocketOutputStreamNetwork::writeWithFlags(byteArray b, unsigned int //hostPlayer->GetGamertag(), //m_socket->networkPlayer->GetGamertag()); - hostPlayer->SendData(socketPlayer, buffer.pbyData, buffer.dwDataSize, QNET_SENDDATA_RELIABLE | QNET_SENDDATA_SEQUENTIAL | flags); + hostPlayer->SendData(socketPlayer, buffer.pbyData, buffer.dwDataSize, lowPriority, requireAck); // DWORD queueSize = hostPlayer->GetSendQueueSize( NULL, QNET_GETSENDQUEUESIZE_BYTES ); // if( queueSize > 24000 ) @@ -523,7 +531,7 @@ void Socket::SocketOutputStreamNetwork::writeWithFlags(byteArray b, unsigned int //m_socket->networkPlayer->GetGamertag(), //hostPlayer->GetGamertag()); - socketPlayer->SendData(hostPlayer, buffer.pbyData, buffer.dwDataSize, QNET_SENDDATA_RELIABLE | QNET_SENDDATA_SEQUENTIAL | flags); + socketPlayer->SendData(hostPlayer, buffer.pbyData, buffer.dwDataSize, lowPriority, requireAck); } } } diff --git a/Minecraft.World/SoulSandTile.cpp b/Minecraft.World/SoulSandTile.cpp new file mode 100644 index 00000000..4ebcf5f6 --- /dev/null +++ b/Minecraft.World/SoulSandTile.cpp @@ -0,0 +1,21 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.phys.h" +#include "SoulSandTile.h" + + +SoulSandTile::SoulSandTile(int id) : Tile(id, Material::sand) +{ +} + +AABB *SoulSandTile::getAABB(Level *level, int x, int y, int z) +{ + float r = 2 / 16.0f; + return AABB::newTemp(x, y, z, x + 1, y + 1 - r, z + 1); +} + +void SoulSandTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) +{ + entity->xd*=0.4; + entity->zd*=0.4; +} \ No newline at end of file diff --git a/Minecraft.World/SoulSandTile.h b/Minecraft.World/SoulSandTile.h new file mode 100644 index 00000000..b461de84 --- /dev/null +++ b/Minecraft.World/SoulSandTile.h @@ -0,0 +1,11 @@ +#pragma once +#include "Tile.h" +#include "Definitions.h" + +class SoulSandTile : public Tile +{ +public: + SoulSandTile(int id); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.World/SoundTypes.h b/Minecraft.World/SoundTypes.h index acbe9167..81e81d79 100644 --- a/Minecraft.World/SoundTypes.h +++ b/Minecraft.World/SoundTypes.h @@ -57,7 +57,7 @@ enum eSOUND_TYPE eSoundType_MOB_CAT_PURR, eSoundType_MOB_CAT_PURREOW, eSoundType_MOB_CAT_MEOW, - eSoundType_MOB_CAT_HITT, + eSoundType_MOB_CAT_HIT, // eSoundType_MOB_IRONGOLEM_THROW, // eSoundType_MOB_IRONGOLEM_HIT, // eSoundType_MOB_IRONGOLEM_DEATH, @@ -147,6 +147,72 @@ enum eSOUND_TYPE eSoundType_DIG_STONE, eSoundType_DIG_WOOD, + // 1.6.4 + eSoundType_FIREWORKS_LAUNCH, + eSoundType_FIREWORKS_BLAST, + eSoundType_FIREWORKS_BLAST_FAR, + eSoundType_FIREWORKS_LARGE_BLAST, + eSoundType_FIREWORKS_LARGE_BLAST_FAR, + eSoundType_FIREWORKS_TWINKLE, + eSoundType_FIREWORKS_TWINKLE_FAR, + + eSoundType_MOB_BAT_IDLE, + eSoundType_MOB_BAT_HURT, + eSoundType_MOB_BAT_DEATH, + eSoundType_MOB_BAT_TAKEOFF, + + + eSoundType_MOB_WITHER_SPAWN, + eSoundType_MOB_WITHER_IDLE, //"mob.wither.idle"; + eSoundType_MOB_WITHER_HURT, //"mob.wither.hurt"; + eSoundType_MOB_WITHER_DEATH,//"mob.wither.death"; + eSoundType_MOB_WITHER_SHOOT,//"mob.wither.shoot"; + + eSoundType_MOB_COW_STEP, + eSoundType_MOB_CHICKEN_STEP, + eSoundType_MOB_PIG_STEP, + eSoundType_MOB_ENDERMAN_STARE, + eSoundType_MOB_ENDERMAN_SCREAM, + eSoundType_MOB_SHEEP_SHEAR, + eSoundType_MOB_SHEEP_STEP, + eSoundType_MOB_SKELETON_DEATH, + eSoundType_MOB_SKELETON_STEP, + eSoundType_MOB_SPIDER_STEP, + eSoundType_MOB_WOLF_STEP, + eSoundType_MOB_ZOMBIE_STEP, + eSoundType_LIQUID_SWIM, + eSoundType_MOB_HORSE_LAND, + eSoundType_MOB_HORSE_ARMOR, + eSoundType_MOB_HORSE_LEATHER, + eSoundType_MOB_HORSE_ZOMBIE_DEATH, + eSoundType_MOB_HORSE_SKELETON_DEATH, + eSoundType_MOB_HORSE_DONKEY_DEATH, + eSoundType_MOB_HORSE_DEATH, + eSoundType_MOB_HORSE_ZOMBIE_HIT, + eSoundType_MOB_HORSE_SKELETON_HIT, + eSoundType_MOB_HORSE_DONKEY_HIT, + eSoundType_MOB_HORSE_HIT, + eSoundType_MOB_HORSE_ZOMBIE_IDLE, + eSoundType_MOB_HORSE_SKELETON_IDLE, + eSoundType_MOB_HORSE_DONKEY_IDLE, + eSoundType_MOB_HORSE_IDLE, + eSoundType_MOB_HORSE_DONKEY_ANGRY, + eSoundType_MOB_HORSE_ANGRY, + eSoundType_MOB_HORSE_GALLOP, + eSoundType_MOB_HORSE_BREATHE, + eSoundType_MOB_HORSE_WOOD, + eSoundType_MOB_HORSE_SOFT, + eSoundType_MOB_HORSE_JUMP, + eSoundType_MOB_WITCH_IDLE, + eSoundType_MOB_WITCH_HURT, + eSoundType_MOB_WITCH_DEATH, + eSoundType_MOB_SLIME_BIG, + eSoundType_MOB_SLIME_SMALL, + eSoundType_EATING, + eSoundType_RANDOM_LEVELUP, + + eSoundType_FIRE_NEWIGNITE, + eSoundType_MAX }; diff --git a/Minecraft.World/Source.h b/Minecraft.World/Source.h new file mode 100644 index 00000000..aab5b83d --- /dev/null +++ b/Minecraft.World/Source.h @@ -0,0 +1,5 @@ +#pragma once + +class Source +{ +}; \ No newline at end of file diff --git a/Minecraft.World/SpawnEggItem.cpp b/Minecraft.World/SpawnEggItem.cpp new file mode 100644 index 00000000..ab082bfb --- /dev/null +++ b/Minecraft.World/SpawnEggItem.cpp @@ -0,0 +1,378 @@ +#include "stdafx.h" +#include "..\Minecraft.Client\Minecraft.h" +#include "net.minecraft.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.npc.h" +#include "net.minecraft.world.h" +#include "HitResult.h" +#include "SpawnEggItem.h" +#include "Difficulty.h" + + +SpawnEggItem::SpawnEggItem(int id) : Item(id) +{ + setMaxStackSize(16); // 4J-PB brought forward. It is 64 on PC, but we'll never be able to place that many + setStackedByData(true); + overlay = NULL; +} + +wstring SpawnEggItem::getHoverName(shared_ptr itemInstance) +{ + wstring elementName = getDescription(); + + int nameId = EntityIO::getNameId(itemInstance->getAuxValue()); + if (nameId >= 0) + { + elementName = replaceAll(elementName,L"{*CREATURE*}",app.GetString(nameId)); + //elementName += " " + I18n.get("entity." + encodeId + ".name"); + } + else + { + elementName = replaceAll(elementName,L"{*CREATURE*}",L""); + } + + return elementName; +} + +int SpawnEggItem::getColor(shared_ptr item, int spriteLayer) +{ + AUTO_VAR(it, EntityIO::idsSpawnableInCreative.find(item->getAuxValue())); + if (it != EntityIO::idsSpawnableInCreative.end()) + { + EntityIO::SpawnableMobInfo *spawnableMobInfo = it->second; + if (spriteLayer == 0) { + return Minecraft::GetInstance()->getColourTable()->getColor( spawnableMobInfo->eggColor1 ); + } + return Minecraft::GetInstance()->getColourTable()->getColor( spawnableMobInfo->eggColor2 ); + } + return 0xffffff; +} + +bool SpawnEggItem::hasMultipleSpriteLayers() +{ + return true; +} + +Icon *SpawnEggItem::getLayerIcon(int auxValue, int spriteLayer) +{ + if (spriteLayer > 0) + { + return overlay; + } + return Item::getLayerIcon(auxValue, spriteLayer); +} + +// 4J-PB - added for dispenser +shared_ptr SpawnEggItem::canSpawn(int iAuxVal, Level *level, int *piResult) +{ + shared_ptr newEntity = EntityIO::newById(iAuxVal, level); + if (newEntity != NULL) + { + bool canSpawn = false; + + switch(newEntity->GetType()) + { + case eTYPE_CHICKEN: + if(level->canCreateMore( eTYPE_CHICKEN, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyChickens; + } + break; + case eTYPE_WOLF: + if(level->canCreateMore( eTYPE_WOLF, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyWolves; + } + break; + case eTYPE_VILLAGER: + if(level->canCreateMore( eTYPE_VILLAGER, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyVillagers; + } + break; + case eTYPE_MUSHROOMCOW: + if(level->canCreateMore(eTYPE_MUSHROOMCOW, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyMooshrooms; + } + break; + case eTYPE_SQUID: + if(level->canCreateMore( eTYPE_SQUID, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManySquid; + } + break; + case eTYPE_BAT: + if(level->canCreateMore( eTYPE_BAT, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyBats; + } + break; + default: + if ( eTYPE_FLAGSET(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK, newEntity->GetType()) ) + { + if( level->canCreateMore( newEntity->GetType(), Level::eSpawnType_Egg ) ) + { + canSpawn = true; + } + else + { + // different message for each animal + + *piResult=eSpawnResult_FailTooManyPigsCowsSheepCats; + } + } + // 4J: Use eTYPE_ENEMY instead of monster (slimes and ghasts aren't monsters) + else if(newEntity->instanceof(eTYPE_ENEMY)) + { + // 4J-PB - check if the player is trying to spawn an enemy in peaceful mode + if(level->difficulty==Difficulty::PEACEFUL) + { + *piResult=eSpawnResult_FailCantSpawnInPeaceful; + } + else if(level->canCreateMore( newEntity->GetType(), Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyMonsters; + } + } +#ifndef _CONTENT_PACKAGE + else if(app.DebugArtToolsOn()) + { + canSpawn = true; + } +#endif + break; + } + + if(canSpawn) + { + return newEntity; + } + } + + return nullptr; +} + +bool SpawnEggItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +{ + if (level->isClientSide) + { + return true; + } + + int tile = level->getTile(x, y, z); + +#ifndef _CONTENT_PACKAGE + if(app.DebugArtToolsOn() && tile == Tile::mobSpawner_Id) + { + // 4J Stu - Force adding this as a tile update + level->removeTile(x,y,z); + level->setTileAndData(x,y,z,Tile::mobSpawner_Id, 0, Tile::UPDATE_ALL); + shared_ptr mste = dynamic_pointer_cast( level->getTileEntity(x,y,z) ); + if(mste != NULL) + { + mste->setEntityId( EntityIO::getEncodeId(itemInstance->getAuxValue()) ); + return true; + } + } +#endif + + x += Facing::STEP_X[face]; + y += Facing::STEP_Y[face]; + z += Facing::STEP_Z[face]; + + double yOff = 0; + if (face == Facing::UP && (Tile::tiles[tile] != NULL && Tile::tiles[tile]->getRenderShape() == Tile::SHAPE_FENCE)) + { + // special case + yOff = .5; + } + + int iResult=0; + shared_ptr result = spawnMobAt(level, itemInstance->getAuxValue(), x + .5, y + yOff, z + .5, &iResult); + + if(bTestUseOnOnly) + { + return result != NULL; + } + + if (result != NULL) + { + // 4J-JEV: SetCustomName is a method for Mob not LivingEntity; so change instanceof to check for Mobs. + if ( result->instanceof(eTYPE_MOB) && itemInstance->hasCustomHoverName() ) + { + dynamic_pointer_cast(result)->setCustomName(itemInstance->getHoverName()); + } + if ( !player->abilities.instabuild ) + { + itemInstance->count--; + } + } + else + { + DisplaySpawnError(player, iResult); + } + + return true; +} + +shared_ptr SpawnEggItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) +{ + if (level->isClientSide) return itemInstance; + + HitResult *hr = getPlayerPOVHitResult(level, player, true); + if (hr == NULL) + { + delete hr; + return itemInstance; + } + + if (hr->type == HitResult::TILE) + { + int xt = hr->x; + int yt = hr->y; + int zt = hr->z; + + if (!level->mayInteract(player, xt, yt, zt,0)) + { + delete hr; + return itemInstance; + } + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return itemInstance; + + if (level->getMaterial(xt, yt, zt) == Material::water) + { + int iResult=0; + shared_ptr result = spawnMobAt(level, itemInstance->getAuxValue(), xt, yt, zt, &iResult); + if (result != NULL) + { + // 4J-JEV: SetCustomName is a method for Mob not LivingEntity; so change instanceof to check for Mobs. + if ( result->instanceof(eTYPE_MOB) && itemInstance->hasCustomHoverName() ) + { + dynamic_pointer_cast(result)->setCustomName(itemInstance->getHoverName()); + } + if (!player->abilities.instabuild) + { + itemInstance->count--; + } + } + else + { + SpawnEggItem::DisplaySpawnError(player, iResult); + } + } + } + return itemInstance; +} + +shared_ptr SpawnEggItem::spawnMobAt(Level *level, int auxVal, double x, double y, double z, int *piResult) +{ + int mobId = auxVal; + int extraData = 0; + + //4J Stu - Enable spawning specific entity sub-types + mobId = auxVal & 0xFFF; + extraData = auxVal >> 12; + + if (EntityIO::idsSpawnableInCreative.find(mobId) == EntityIO::idsSpawnableInCreative.end()) + { + return nullptr; + } + + shared_ptr newEntity = nullptr; + + for (int i = 0; i < SPAWN_COUNT; i++) + { + newEntity = canSpawn(mobId, level, piResult); + + // 4J-JEV: DynCasting to Mob not LivingEntity; so change instanceof to check for Mobs. + if ( newEntity != NULL && newEntity->instanceof(eTYPE_MOB) ) + { + shared_ptr mob = dynamic_pointer_cast(newEntity); + newEntity->moveTo(x, y, z, Mth::wrapDegrees(level->random->nextFloat() * 360), 0); + newEntity->setDespawnProtected(); // 4J added, default to being protected against despawning (has to be done after initial position is set) + mob->yHeadRot = mob->yRot; + mob->yBodyRot = mob->yRot; + + mob->finalizeMobSpawn(NULL, extraData); + level->addEntity(newEntity); + mob->playAmbientSound(); + } + } + + return newEntity; +} + +void SpawnEggItem::registerIcons(IconRegister *iconRegister) +{ + Item::registerIcons(iconRegister); + overlay = iconRegister->registerIcon(getIconName() + L"_overlay"); +} + +void SpawnEggItem::DisplaySpawnError(shared_ptr player, int result) +{ + // some negative sound effect? + //level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); + switch(result) + { + case eSpawnResult_FailTooManyPigsCowsSheepCats: + player->displayClientMessage(IDS_MAX_PIGS_SHEEP_COWS_CATS_SPAWNED ); + break; + case eSpawnResult_FailTooManyChickens: + player->displayClientMessage(IDS_MAX_CHICKENS_SPAWNED ); + break; + case eSpawnResult_FailTooManySquid: + player->displayClientMessage(IDS_MAX_SQUID_SPAWNED ); + break; + case eSpawnResult_FailTooManyBats: + player->displayClientMessage(IDS_MAX_BATS_SPAWNED); + break; + case eSpawnResult_FailTooManyWolves: + player->displayClientMessage(IDS_MAX_WOLVES_SPAWNED ); + break; + case eSpawnResult_FailTooManyMooshrooms: + player->displayClientMessage(IDS_MAX_MOOSHROOMS_SPAWNED ); + break; + case eSpawnResult_FailTooManyMonsters: + player->displayClientMessage(IDS_MAX_ENEMIES_SPAWNED ); + break; + case eSpawnResult_FailTooManyVillagers: + player->displayClientMessage(IDS_MAX_VILLAGERS_SPAWNED ); + break; + case eSpawnResult_FailCantSpawnInPeaceful: + player->displayClientMessage(IDS_CANT_SPAWN_IN_PEACEFUL ); + break; + + } +} \ No newline at end of file diff --git a/Minecraft.World/SpawnEggItem.h b/Minecraft.World/SpawnEggItem.h new file mode 100644 index 00000000..dec0e351 --- /dev/null +++ b/Minecraft.World/SpawnEggItem.h @@ -0,0 +1,48 @@ +#pragma once + +#include "Item.h" + +class SpawnEggItem : public Item +{ +private: + static const int SPAWN_COUNT = 1; + + Icon *overlay; + +public: + + enum _eSpawnResult + { + eSpawnResult_OK=0, + eSpawnResult_FailTooManyPigsCowsSheepCats, + eSpawnResult_FailTooManyChickens, + eSpawnResult_FailTooManySquid, + eSpawnResult_FailTooManyBats, + eSpawnResult_FailTooManyWolves, + eSpawnResult_FailTooManyMooshrooms, + eSpawnResult_FailTooManyAnimals, + eSpawnResult_FailTooManyMonsters, + eSpawnResult_FailTooManyVillagers, + eSpawnResult_FailCantSpawnInPeaceful, + }; + + SpawnEggItem(int id); + + virtual wstring getHoverName(shared_ptr itemInstance); + virtual int getColor(shared_ptr item, int spriteLayer); + virtual bool hasMultipleSpriteLayers(); + virtual Icon *getLayerIcon(int auxValue, int spriteLayer); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); + + static shared_ptr spawnMobAt(Level *level, int mobId, double x, double y, double z, int *piResult); // 4J Added piResult param + + // 4J-PB added for dispenser + static shared_ptr canSpawn(int iAuxVal, Level *level, int *piResult); + + // 4J: Added for neatness + static void DisplaySpawnError(shared_ptr player, int result); + + //@Override + void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/Spider.cpp b/Minecraft.World/Spider.cpp index ba58ce54..49997db3 100644 --- a/Minecraft.World/Spider.cpp +++ b/Minecraft.World/Spider.cpp @@ -2,11 +2,14 @@ #include "net.minecraft.world.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.effect.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.monster.h" #include "com.mojang.nbt.h" +#include "BasicTypeContainers.h" #include "Spider.h" #include "..\Minecraft.Client\Textures.h" #include "SoundTypes.h" @@ -18,13 +21,10 @@ Spider::Spider(Level *level) : Monster( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SPIDER; // 4J was L"/mob/spider.png"; this->setSize(1.4f, 0.9f); - runSpeed = 0.8f; } void Spider::defineSynchedData() @@ -46,19 +46,12 @@ void Spider::tick() } } -int Spider::getMaxHealth() -{ - return 16; -} - -double Spider::getRideHeight() +void Spider::registerAttributes() { - return bbHeight * 0.75 - 0.5f; -} + Monster::registerAttributes(); -bool Spider::makeStepSound() -{ - return false; + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(16); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.8f); } shared_ptr Spider::findAttackTarget() @@ -96,12 +89,17 @@ int Spider::getDeathSound() return eSoundType_MOB_SPIDER_DEATH; } +void Spider::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_SPIDER_STEP, 0.15f, 1); +} + void Spider::checkHurtTarget(shared_ptr target, float d) { float br = getBrightness(1); if (br > 0.5f && random->nextInt(100) == 0) { - this->attackTarget = nullptr; + attackTarget = nullptr; return; } @@ -139,25 +137,20 @@ void Spider::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) } /** - * The the spiders act as if they're always on a ladder, which enables them - * to climb walls. - */ +* The the spiders act as if they're always on a ladder, which enables them +* to climb walls. +*/ bool Spider::onLadder() { return isClimbing(); } - + void Spider::makeStuckInWeb() { // do nothing - spiders don't get stuck in web } -float Spider::getModelScale() -{ - return 1.0f; -} - MobType Spider::getMobType() { return ARTHROPOD; @@ -189,4 +182,71 @@ void Spider::setClimbing(bool value) flags &= ~0x1; } entityData->set(DATA_FLAGS_ID, flags); +} + +MobGroupData *Spider::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param +{ + groupData = Monster::finalizeMobSpawn(groupData); + +#ifndef _CONTENT_PACKAGE + // 4J-JEV: Added for spider-jockey spawn-egg. + if ( (level->random->nextInt(100) == 0) || (extraData != 0) ) +#else + if (level->random->nextInt(100) == 0) +#endif + { + shared_ptr skeleton = shared_ptr( new Skeleton(level) ); + skeleton->moveTo(x, y, z, yRot, 0); + skeleton->finalizeMobSpawn(NULL); + level->addEntity(skeleton); + skeleton->ride(shared_from_this()); + } + + if (groupData == NULL) + { + groupData = new SpiderEffectsGroupData(); + + if (level->difficulty > Difficulty::NORMAL && level->random->nextFloat() < SPIDER_SPECIAL_EFFECT_CHANCE * level->getDifficulty(x, y, z)) + { + ((SpiderEffectsGroupData *) groupData)->setRandomEffect(level->random); + } + } + if ( dynamic_cast( groupData ) != NULL) + { + int effect = ((SpiderEffectsGroupData *) groupData)->effectId; + if (effect > 0 && MobEffect::effects[effect] != NULL) + { + addEffect(new MobEffectInstance(effect, Integer::MAX_VALUE)); + } + } + + return groupData; +} + +const float Spider::SPIDER_SPECIAL_EFFECT_CHANCE = .1f; + +Spider::SpiderEffectsGroupData::SpiderEffectsGroupData() +{ + effectId = 0; +} + +void Spider::SpiderEffectsGroupData::setRandomEffect(Random *random) +{ + int selection = random->nextInt(5); + if (selection <= 1) + { + effectId = MobEffect::movementSpeed->id; + } + else if (selection <= 2) + { + effectId = MobEffect::damageBoost->id; + } + else if (selection <= 3) + { + effectId = MobEffect::regeneration->id; + } + else if (selection <= 4) + { + effectId = MobEffect::invisibility->id; + } } \ No newline at end of file diff --git a/Minecraft.World/Spider.h b/Minecraft.World/Spider.h index f0257d6c..941ac45a 100644 --- a/Minecraft.World/Spider.h +++ b/Minecraft.World/Spider.h @@ -2,6 +2,7 @@ using namespace std; #include "Monster.h" +#include "MobGroupData.h" class Spider : public Monster { @@ -13,33 +14,45 @@ private: static const int DATA_FLAGS_ID = 16; public: - Spider(Level *level); + Spider(Level *level); protected: virtual void defineSynchedData(); public: virtual void tick(); - virtual int getMaxHealth(); - virtual double getRideHeight(); protected: - virtual bool makeStepSound(); + virtual void registerAttributes(); virtual shared_ptr findAttackTarget(); virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); - virtual void checkHurtTarget(shared_ptr target, float d); + virtual void playStepSound(int xt, int yt, int zt, int t); + virtual void checkHurtTarget(shared_ptr target, float d); virtual int getDeathLoot(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: virtual bool onLadder(); - + virtual void makeStuckInWeb(); - virtual float getModelScale(); virtual MobType getMobType(); virtual bool canBeAffected(MobEffectInstance *newEffect); virtual bool isClimbing(); virtual void setClimbing(bool value); + virtual MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param + +private: + static const float SPIDER_SPECIAL_EFFECT_CHANCE; + +public: + class SpiderEffectsGroupData : public MobGroupData + { + public: + int effectId; + + SpiderEffectsGroupData(); + void setRandomEffect(Random *random); + }; }; diff --git a/Minecraft.World/SpikeFeature.cpp b/Minecraft.World/SpikeFeature.cpp index e8886d00..629b3c83 100644 --- a/Minecraft.World/SpikeFeature.cpp +++ b/Minecraft.World/SpikeFeature.cpp @@ -12,67 +12,67 @@ SpikeFeature::SpikeFeature(int tile) bool SpikeFeature::place(Level *level, Random *random, int x, int y, int z) { - if (!(level->isEmptyTile(x, y, z) && level->getTile(x, y - 1, z) == tile)) + if (!(level->isEmptyTile(x, y, z) && level->getTile(x, y - 1, z) == tile)) { - return false; - } - int hh = random->nextInt(32) + 6; - int r = random->nextInt(4) + 1; + return false; + } + int hh = random->nextInt(32) + 6; + int r = random->nextInt(4) + 1; - for (int xx = x - r; xx <= x + r; xx++) - for (int zz = z - r; zz <= z + r; zz++) + for (int xx = x - r; xx <= x + r; xx++) + for (int zz = z - r; zz <= z + r; zz++) { - int xd = xx - x; - int zd = zz - z; - if (xd * xd + zd * zd <= r * r + 1) + int xd = xx - x; + int zd = zz - z; + if (xd * xd + zd * zd <= r * r + 1) { - if (level->getTile(xx, y - 1, zz) != tile) + if (level->getTile(xx, y - 1, zz) != tile) { return false; } - } - } + } + } - for (int yy = y; yy < y + hh; yy++) - { - if (yy < Level::genDepth) + for (int yy = y; yy < y + hh; yy++) { - for (int xx = x - r; xx <= x + r; xx++) - for (int zz = z - r; zz <= z + r; zz++) - { - int xd = xx - x; - int zd = zz - z; - if (xd * xd + zd * zd <= r * r + 1) + if (yy < Level::genDepth) + { + for (int xx = x - r; xx <= x + r; xx++) + for (int zz = z - r; zz <= z + r; zz++) { - level->setTile(xx, yy, zz, Tile::obsidian_Id); - } - } - } else break; - } - - shared_ptr enderCrystal = shared_ptr(new EnderCrystal(level)); - enderCrystal->moveTo(x + 0.5f, y + hh, z + 0.5f, random->nextFloat() * 360, 0); - level->addEntity(enderCrystal); - level->setTile(x, y + hh, z, Tile::unbreakable_Id); - - return true; + int xd = xx - x; + int zd = zz - z; + if (xd * xd + zd * zd <= r * r + 1) + { + level->setTileAndData(xx, yy, zz, Tile::obsidian_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } else break; + } + + shared_ptr enderCrystal = shared_ptr(new EnderCrystal(level)); + enderCrystal->moveTo(x + 0.5f, y + hh, z + 0.5f, random->nextFloat() * 360, 0); + level->addEntity(enderCrystal); + level->setTileAndData(x, y + hh, z, Tile::unbreakable_Id, 0, Tile::UPDATE_CLIENTS); + + return true; } bool SpikeFeature::placeWithIndex(Level *level, Random *random, int x, int y, int z,int iIndex, int iRadius) { app.DebugPrintf("Spike - %d,%d,%d - index %d\n",x,y,z,iIndex); - int hh = 12 + (iIndex*3); + int hh = 12 + (iIndex*3); // fill any tiles below the spike - for (int xx = x - iRadius; xx <= x + iRadius; xx++) + for (int xx = x - iRadius; xx <= x + iRadius; xx++) { - for (int zz = z - iRadius; zz <= z + iRadius; zz++) + for (int zz = z - iRadius; zz <= z + iRadius; zz++) { - int xd = xx - x; - int zd = zz - z; - if (xd * xd + zd * zd <= iRadius * iRadius + 1) + int xd = xx - x; + int zd = zz - z; + if (xd * xd + zd * zd <= iRadius * iRadius + 1) { int iTileBelow=1; @@ -81,43 +81,43 @@ bool SpikeFeature::placeWithIndex(Level *level, Random *random, int x, int y, in if(level->isEmptyTile(xx, y - iTileBelow, zz)) { // empty tile - level->setTileNoUpdate(xx, y - iTileBelow, zz, Tile::obsidian_Id); + level->setTileAndData(xx, y - iTileBelow, zz, Tile::obsidian_Id, 0, Tile::UPDATE_CLIENTS); } else { - level->setTile(xx, y - iTileBelow, zz, Tile::obsidian_Id); + level->setTileAndData(xx, y - iTileBelow, zz, Tile::obsidian_Id, 0, Tile::UPDATE_CLIENTS); } iTileBelow++; } - } - } + } + } } - for (int yy = y; yy < y + hh; yy++) + for (int yy = y; yy < y + hh; yy++) { - if (yy < Level::genDepth) + if (yy < Level::genDepth) { - for (int xx = x - iRadius; xx <= x + iRadius; xx++) + for (int xx = x - iRadius; xx <= x + iRadius; xx++) { - for (int zz = z - iRadius; zz <= z + iRadius; zz++) + for (int zz = z - iRadius; zz <= z + iRadius; zz++) { - int xd = xx - x; - int zd = zz - z; + int xd = xx - x; + int zd = zz - z; int iVal = xd * xd + zd * zd; - if ( iVal <= iRadius * iRadius + 1) + if ( iVal <= iRadius * iRadius + 1) { - //level->setTile(xx, yy, zz, Tile::obsidian_Id); + //level->setTile(xx, yy, zz, Tile::obsidian_Id); placeBlock(level, xx, yy, zz, Tile::obsidian_Id, 0); - } - } + } + } } - } + } else { app.DebugPrintf("Breaking out of spike feature\n"); break; } - } + } // cap the last spikes with a fence to stop lucky arrows hitting the crystal @@ -155,7 +155,7 @@ bool SpikeFeature::placeWithIndex(Level *level, Random *random, int x, int y, in // and cap off the top int yy = y + hh + 3; - + if (yy < Level::genDepth) { for (int xx = x - 2; xx <= x + 2; xx++) @@ -168,12 +168,12 @@ bool SpikeFeature::placeWithIndex(Level *level, Random *random, int x, int y, in } } - shared_ptr enderCrystal = shared_ptr(new EnderCrystal(level)); - enderCrystal->moveTo(x + 0.5f, y + hh, z + 0.5f, random->nextFloat() * 360, 0); - level->addEntity(enderCrystal); + shared_ptr enderCrystal = shared_ptr(new EnderCrystal(level)); + enderCrystal->moveTo(x + 0.5f, y + hh, z + 0.5f, random->nextFloat() * 360, 0); + level->addEntity(enderCrystal); placeBlock(level, x, y + hh, z, Tile::unbreakable_Id, 0); - //level->setTile(x, y + hh, z, Tile::unbreakable_Id); + //level->setTile(x, y + hh, z, Tile::unbreakable_Id); - return true; + return true; } diff --git a/Minecraft.World/SpreadPlayersCommand.h b/Minecraft.World/SpreadPlayersCommand.h new file mode 100644 index 00000000..b8b451d6 --- /dev/null +++ b/Minecraft.World/SpreadPlayersCommand.h @@ -0,0 +1,328 @@ +/* +package net.minecraft.commands.common; + +import java.util.*; + +import net.minecraft.commands.*; +import net.minecraft.commands.exceptions.*; +import net.minecraft.network.chat.ChatMessageComponent; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.tile.Tile; +import net.minecraft.world.scores.Team; + +import com.google.common.collect.*; + +public class SpreadPlayersCommand extends BaseCommand { + private static final int MAX_ITERATION_COUNT = 10000; + + @Override + public String getName() { + return "spreadplayers"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + @Override + public String getUsage(CommandSender source) { + return "commands.spreadplayers.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + if (args.length < 6) throw new UsageException("commands.spreadplayers.usage"); + int index = 0; + double x = convertArgToCoordinate(source, Double.NaN, args[index++]); + double z = convertArgToCoordinate(source, Double.NaN, args[index++]); + double minDist = convertArgToDouble(source, args[index++], 0); + double maxDist = convertArgToDouble(source, args[index++], minDist + 1); + boolean respectTeams = convertArgToBoolean(source, args[index++]); + + List players = Lists.newArrayList(); + + while (index < args.length) { + String arg = args[index++]; + + if (PlayerSelector.isPattern(arg)) { + ServerPlayer[] result = PlayerSelector.getPlayers(source, arg); + + if (result != null && result.length != 0) { + Collections.addAll(players, result); + } else { + throw new PlayerNotFoundException(); + } + } else { + Player player = MinecraftServer.getInstance().getPlayers().getPlayer(arg); + + if (player != null) { + players.add(player); + } else { + throw new PlayerNotFoundException(); + } + } + } + + if (players.isEmpty()) { + throw new PlayerNotFoundException(); + } + + source.sendMessage(ChatMessageComponent.forTranslation("commands.spreadplayers.spreading." + (respectTeams ? "teams" : "players"), joinPlayerNames(players), x, z, minDist, maxDist)); + + spreadPlayers(source, players, new Position(x, z), minDist, maxDist, players.get(0).level, respectTeams); + } + + private void spreadPlayers(CommandSender source, List players, Position center, double spreadDist, double maxDistFromCenter, Level level, boolean respectTeams) { + Random random = new Random(); + double minX = center.x - maxDistFromCenter; + double minZ = center.z - maxDistFromCenter; + double maxX = center.x + maxDistFromCenter; + double maxZ = center.z + maxDistFromCenter; + + Position[] positions = createInitialPositions(random, respectTeams ? getNumberOfTeams(players) : players.size(), minX, minZ, maxX, maxZ); + int iterations = spreadPositions(center, spreadDist, level, random, minX, minZ, maxX, maxZ, positions, respectTeams); + double avgDistance = setPlayerPositions(players, level, positions, respectTeams); + + logAdminAction(source, "commands.spreadplayers.success." + (respectTeams ? "teams" : "players"), positions.length, center.x, center.z); + if (positions.length > 1) source.sendMessage(ChatMessageComponent.forTranslation("commands.spreadplayers.info." + (respectTeams ? "teams" : "players"), String.format("%.2f", avgDistance), + iterations)); + } + + private int getNumberOfTeams(List players) { + Set teams = Sets.newHashSet(); + + for (LivingEntity player : players) { + if (player instanceof Player) { + teams.add(((Player) player).getTeam()); + } else { + teams.add(null); + } + } + + return teams.size(); + } + + private int spreadPositions(Position center, double spreadDist, Level level, Random random, double minX, double minZ, double maxX, double maxZ, Position[] positions, boolean respectTeams) { + boolean hasCollisions = true; + int iteration; + double minDistance = Float.MAX_VALUE; + + for (iteration = 0; iteration < MAX_ITERATION_COUNT && hasCollisions; iteration++) { + hasCollisions = false; + minDistance = Float.MAX_VALUE; + + for (int i = 0; i < positions.length; i++) { + Position position = positions[i]; + int neighbourCount = 0; + Position averageNeighbourPos = new Position(); + + for (int j = 0; j < positions.length; j++) { + if (i == j) continue; + Position neighbour = positions[j]; + + double dist = position.dist(neighbour); + minDistance = Math.min(dist, minDistance); + if (dist < spreadDist) { + neighbourCount++; + averageNeighbourPos.x += neighbour.x - position.x; + averageNeighbourPos.z += neighbour.z - position.z; + } + } + + if (neighbourCount > 0) { + averageNeighbourPos.x /= neighbourCount; + averageNeighbourPos.z /= neighbourCount; + double length = averageNeighbourPos.getLength(); + + if (length > 0) { + averageNeighbourPos.normalize(); + + position.moveAway(averageNeighbourPos); + } else { + position.randomize(random, minX, minZ, maxX, maxZ); + } + + hasCollisions = true; + } + + if (position.clamp(minX, minZ, maxX, maxZ)) { + hasCollisions = true; + } + } + + if (!hasCollisions) { + for (Position position : positions) { + if (!position.isSafe(level)) { + position.randomize(random, minX, minZ, maxX, maxZ); + hasCollisions = true; + } + } + } + } + + if (iteration >= MAX_ITERATION_COUNT) { + throw new CommandException("commands.spreadplayers.failure." + (respectTeams ? "teams" : "players"), positions.length, center.x, center.z, String.format("%.2f", minDistance)); + } + + return iteration; + } + + private double setPlayerPositions(List players, Level level, Position[] positions, boolean respectTeams) { + double avgDistance = 0; + int positionIndex = 0; + Map teamPositions = Maps.newHashMap(); + + for (int i = 0; i < players.size(); i++) { + LivingEntity player = players.get(i); + Position position; + + if (respectTeams) { + Team team = player instanceof Player ? ((Player) player).getTeam() : null; + + if (!teamPositions.containsKey(team)) { + teamPositions.put(team, positions[positionIndex++]); + } + + position = teamPositions.get(team); + } else { + position = positions[positionIndex++]; + } + + player.teleportTo(Mth.floor(position.x) + 0.5f, position.getSpawnY(level), Mth.floor(position.z) + 0.5); + + double closest = Double.MAX_VALUE; + for (int j = 0; j < positions.length; j++) { + if (position == positions[j]) continue; + + double dist = position.dist(positions[j]); + closest = Math.min(dist, closest); + } + avgDistance += closest; + } + + avgDistance /= players.size(); + return avgDistance; + } + + private Position[] createInitialPositions(Random random, int count, double minX, double minZ, double maxX, double maxZ) { + Position[] result = new Position[count]; + + for (int i = 0; i < result.length; i++) { + Position position = new Position(); + + position.randomize(random, minX, minZ, maxX, maxZ); + + result[i] = position; + } + + return result; + } + + private static class Position { + double x; + double z; + + Position() { + } + + Position(double x, double z) { + this.x = x; + this.z = z; + } + + void set(double x, double z) { + this.x = x; + this.z = z; + } + + double dist(Position target) { + double dx = x - target.x; + double dz = z - target.z; + + return Math.sqrt(dx * dx + dz * dz); + } + + void normalize() { + double dist = (double) getLength(); + x /= dist; + z /= dist; + } + + float getLength() { + return Mth.sqrt(x * x + z * z); + } + + public void moveAway(Position pos) { + x -= pos.x; + z -= pos.z; + } + + public boolean clamp(double minX, double minZ, double maxX, double maxZ) { + boolean changed = false; + + if (x < minX) { + x = minX; + changed = true; + } else if (x > maxX) { + x = maxX; + changed = true; + } + + if (z < minZ) { + z = minZ; + changed = true; + } else if (z > maxZ) { + z = maxZ; + changed = true; + } + + return changed; + } + + public int getSpawnY(Level level) { + int xt = Mth.floor(x); + int zt = Mth.floor(z); + + for (int y = Level.maxBuildHeight; y > 0; y--) { + int tile = level.getTile(xt, y, zt); + + if (tile != 0) { + return y + 1; + } + } + + return Level.maxBuildHeight + 1; + } + + public boolean isSafe(Level level) { + int xt = Mth.floor(x); + int zt = Mth.floor(z); + + for (int y = Level.maxBuildHeight; y > 0; y--) { + int tile = level.getTile(xt, y, zt); + + if (tile != 0) { + Material material = Tile.tiles[tile].material; + + return !material.isLiquid() && material != Material.fire; + } + } + + return false; + } + + public void randomize(Random random, double minX, double minZ, double maxX, double maxZ) { + x = Mth.nextDouble(random, minX, maxX); + z = Mth.nextDouble(random, minZ, maxZ); + } + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/SpringFeature.cpp b/Minecraft.World/SpringFeature.cpp index f26f0084..c6fa5e9f 100644 --- a/Minecraft.World/SpringFeature.cpp +++ b/Minecraft.World/SpringFeature.cpp @@ -22,30 +22,30 @@ bool SpringFeature::place(Level *level, Random *random, int x, int y, int z) } } - if (level->getTile(x, y + 1, z) != Tile::rock_Id) return false; - if (level->getTile(x, y - 1, z) != Tile::rock_Id) return false; + if (level->getTile(x, y + 1, z) != Tile::stone_Id) return false; + if (level->getTile(x, y - 1, z) != Tile::stone_Id) return false; - if (level->getTile(x, y, z) != 0 && level->getTile(x, y, z) != Tile::rock_Id) return false; + if (level->getTile(x, y, z) != 0 && level->getTile(x, y, z) != Tile::stone_Id) return false; - int rockCount = 0; - if (level->getTile(x - 1, y, z) == Tile::rock_Id) rockCount++; - if (level->getTile(x + 1, y, z) == Tile::rock_Id) rockCount++; - if (level->getTile(x, y, z - 1) == Tile::rock_Id) rockCount++; - if (level->getTile(x, y, z + 1) == Tile::rock_Id) rockCount++; + int rockCount = 0; + if (level->getTile(x - 1, y, z) == Tile::stone_Id) rockCount++; + if (level->getTile(x + 1, y, z) == Tile::stone_Id) rockCount++; + if (level->getTile(x, y, z - 1) == Tile::stone_Id) rockCount++; + if (level->getTile(x, y, z + 1) == Tile::stone_Id) rockCount++; - int holeCount = 0; - if (level->isEmptyTile(x - 1, y, z)) holeCount++; - if (level->isEmptyTile(x + 1, y, z)) holeCount++; - if (level->isEmptyTile(x, y, z - 1)) holeCount++; - if (level->isEmptyTile(x, y, z + 1)) holeCount++; + int holeCount = 0; + if (level->isEmptyTile(x - 1, y, z)) holeCount++; + if (level->isEmptyTile(x + 1, y, z)) holeCount++; + if (level->isEmptyTile(x, y, z - 1)) holeCount++; + if (level->isEmptyTile(x, y, z + 1)) holeCount++; - if (rockCount == 3 && holeCount == 1) + if (rockCount == 3 && holeCount == 1) { - level->setTile(x, y, z, tile); - level->setInstaTick(true); - Tile::tiles[tile]->tick(level, x, y, z, random); - level->setInstaTick(false); - } + level->setTileAndData(x, y, z, tile, 0, Tile::UPDATE_CLIENTS); + level->setInstaTick(true); + Tile::tiles[tile]->tick(level, x, y, z, random); + level->setInstaTick(false); + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/Squid.cpp b/Minecraft.World/Squid.cpp index 3e36777c..7aae3615 100644 --- a/Minecraft.World/Squid.cpp +++ b/Minecraft.World/Squid.cpp @@ -1,17 +1,16 @@ -using namespace std; - #include "stdafx.h" #include "com.mojang.nbt.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "SharedConstants.h" #include "Squid.h" #include "..\Minecraft.Client\Textures.h" - - void Squid::_init() { xBodyRot = xBodyRotO = 0.0f; @@ -32,19 +31,19 @@ Squid::Squid(Level *level) : WaterAnimal( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); _init(); - this->textureIdx = TN_MOB_SQUID; // 4J - was L"/mob/squid.png"; this->setSize(0.95f, 0.95f); tentacleSpeed = 1 / (random->nextFloat() + 1) * 0.2f; } -int Squid::getMaxHealth() +void Squid::registerAttributes() { - return 10; + WaterAnimal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(10); } int Squid::getAmbientSound() @@ -72,6 +71,11 @@ int Squid::getDeathLoot() return 0; } +bool Squid::makeStepSound() +{ + return false; +} + void Squid::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) { int count = random->nextInt(3 + playerBonusLevel) + 1; @@ -136,10 +140,10 @@ void Squid::aiStep() double horizontalMovement = sqrt(xd * xd + zd * zd); - yBodyRot += ((-(float) atan2(this->xd, this->zd) * 180 / PI) - yBodyRot) * 0.1f; + yBodyRot += ((-(float) atan2(xd, zd) * 180 / PI) - yBodyRot) * 0.1f; yRot = yBodyRot; zBodyRot = zBodyRot + (float) PI * rotateSpeed * 1.5f; - xBodyRot += ((-(float) atan2(horizontalMovement, this->yd) * 180 / PI) - xBodyRot) * 0.1f; + xBodyRot += ((-(float) atan2(horizontalMovement, yd) * 180 / PI) - xBodyRot) * 0.1f; } else { diff --git a/Minecraft.World/Squid.h b/Minecraft.World/Squid.h index d5dc584c..c645d9f8 100644 --- a/Minecraft.World/Squid.h +++ b/Minecraft.World/Squid.h @@ -29,14 +29,15 @@ private: public: Squid(Level *level); - virtual int getMaxHealth(); protected: + virtual void registerAttributes(); virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); virtual float getSoundVolume(); virtual int getDeathLoot(); + virtual bool makeStepSound(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: diff --git a/Minecraft.World/StainedGlassBlock.cpp b/Minecraft.World/StainedGlassBlock.cpp new file mode 100644 index 00000000..3fae3d46 --- /dev/null +++ b/Minecraft.World/StainedGlassBlock.cpp @@ -0,0 +1,54 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.h" +#include "StainedGlassBlock.h" + +Icon *StainedGlassBlock::ICONS[StainedGlassBlock::ICONS_LENGTH]; + +StainedGlassBlock::StainedGlassBlock(int id, Material *material) : HalfTransparentTile(id, L"glass", material, false) +{ +} + +Icon *StainedGlassBlock::getTexture(int face, int data) +{ + return ICONS[data % ICONS_LENGTH]; +} + +int StainedGlassBlock::getSpawnResourcesAuxValue(int data) +{ + return data; +} + +int StainedGlassBlock::getItemAuxValueForBlockData(int data) +{ + return (~data & 0xf); +} + + +int StainedGlassBlock::getRenderLayer() +{ + return 1; +} + +void StainedGlassBlock::registerIcons(IconRegister *iconRegister) +{ + for (int i = 0; i < ICONS_LENGTH; i++) + { + ICONS[i] = iconRegister->registerIcon(getIconName() + L"_" + DyePowderItem::COLOR_TEXTURES[getItemAuxValueForBlockData(i)]); + } +} + +int StainedGlassBlock::getResourceCount(Random *random) +{ + return 0; +} + +bool StainedGlassBlock::isSilkTouchable() +{ + return true; +} + +bool StainedGlassBlock::isCubeShaped() +{ + return false; +} diff --git a/Minecraft.World/StainedGlassBlock.h b/Minecraft.World/StainedGlassBlock.h new file mode 100644 index 00000000..4b90d1dc --- /dev/null +++ b/Minecraft.World/StainedGlassBlock.h @@ -0,0 +1,27 @@ +#pragma once + +#include "HalfTransparentTile.h" + +class StainedGlassBlock : public HalfTransparentTile +{ + friend class ChunkRebuildData; +private: + static const int ICONS_LENGTH = 16; + static Icon *ICONS[ICONS_LENGTH]; + +public: + StainedGlassBlock(int id, Material *material); + + Icon *getTexture(int face, int data); + int getSpawnResourcesAuxValue(int data); + static int getItemAuxValueForBlockData(int data); + int getRenderLayer(); + void registerIcons(IconRegister *iconRegister); + int getResourceCount(Random *random); + +protected: + bool isSilkTouchable(); + +public: + bool isCubeShaped(); +}; \ No newline at end of file diff --git a/Minecraft.World/StainedGlassPaneBlock.cpp b/Minecraft.World/StainedGlassPaneBlock.cpp new file mode 100644 index 00000000..086d8ae5 --- /dev/null +++ b/Minecraft.World/StainedGlassPaneBlock.cpp @@ -0,0 +1,52 @@ +#include "stdafx.h" +#include "net.minecraft.world.h" +#include "net.minecraft.world.item.h" +#include "StainedGlassPaneBlock.h" + +Icon *StainedGlassPaneBlock::ICONS[StainedGlassPaneBlock::ICONS_COUNT]; +Icon *StainedGlassPaneBlock::EDGE_ICONS[StainedGlassPaneBlock::ICONS_COUNT]; + +StainedGlassPaneBlock::StainedGlassPaneBlock(int id) : ThinFenceTile(id, L"glass", L"glass_pane_top", Material::glass, false) +{ +} + +Icon *StainedGlassPaneBlock::getIconTexture(int face, int data) +{ + return ICONS[data % ICONS_COUNT]; +} + +Icon *StainedGlassPaneBlock::getEdgeTexture(int data) +{ + return EDGE_ICONS[~data & 0xF]; +} + +Icon *StainedGlassPaneBlock::getTexture(int face, int data) +{ + return getIconTexture(face, ~data & 0xf); +} + +int StainedGlassPaneBlock::getSpawnResourcesAuxValue(int data) +{ + return data; +} + +int StainedGlassPaneBlock::getItemAuxValueForBlockData(int data) +{ + return (data & 0xf); +} + + +int StainedGlassPaneBlock::getRenderLayer() +{ + return 1; +} + +void StainedGlassPaneBlock::registerIcons(IconRegister *iconRegister) +{ + ThinFenceTile::registerIcons(iconRegister); + for (int i = 0; i < ICONS_COUNT; i++) + { + ICONS[i] = iconRegister->registerIcon(getIconName() + L"_" + DyePowderItem::COLOR_TEXTURES[getItemAuxValueForBlockData(i)]); + EDGE_ICONS[i] = iconRegister->registerIcon(getIconName() + L"_pane_top_" + DyePowderItem::COLOR_TEXTURES[getItemAuxValueForBlockData(i)]); + } +} \ No newline at end of file diff --git a/Minecraft.World/StainedGlassPaneBlock.h b/Minecraft.World/StainedGlassPaneBlock.h new file mode 100644 index 00000000..fa943f55 --- /dev/null +++ b/Minecraft.World/StainedGlassPaneBlock.h @@ -0,0 +1,23 @@ +#pragma once + +#include "ThinFenceTile.h" + +class StainedGlassPaneBlock : public ThinFenceTile +{ + friend class ChunkRebuildData; +private: + static const int ICONS_COUNT = 16; + static Icon *ICONS[ICONS_COUNT]; + static Icon *EDGE_ICONS[ICONS_COUNT]; + +public: + StainedGlassPaneBlock(int id); + + Icon *getIconTexture(int face, int data); + Icon *getEdgeTexture(int data); + Icon *getTexture(int face, int data); + int getSpawnResourcesAuxValue(int data); + static int getItemAuxValueForBlockData(int data); + int getRenderLayer(); + void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/StairTile.cpp b/Minecraft.World/StairTile.cpp index 7a80e9ff..de2cc865 100644 --- a/Minecraft.World/StairTile.cpp +++ b/Minecraft.World/StairTile.cpp @@ -6,9 +6,9 @@ #include "StairTile.h" int StairTile::DEAD_SPACES[8][2] = { - {2, 6}, {3, 7}, {2, 3}, {6, 7}, - {0, 4}, {1, 5}, {0, 1}, {4, 5} - }; + {2, 6}, {3, 7}, {2, 3}, {6, 7}, + {0, 4}, {1, 5}, {0, 1}, {4, 5} +}; StairTile::StairTile(int id, Tile *base,int basedata) : Tile(id, base->material, isSolidRender()) { @@ -325,45 +325,6 @@ void StairTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList } } - //int data = level->getData(x, y, z); - //int dir = data & 0x3; - //float lowerPieceY0 = 0; - //float lowerPieceY1 = 0.5f; - //float upperPieceY0 = 0.5f; - //float upperPieceY1 = 1; - - //if ((data & UPSIDEDOWN_BIT) != 0) - //{ - // lowerPieceY0 = .5f; - // lowerPieceY1 = 1; - // upperPieceY0 = 0; - // upperPieceY1 = .5f; - //} - - //setShape(0, lowerPieceY0, 0, 1, lowerPieceY1, 1); - //Tile::addAABBs(level, x, y, z, box, boxes); - - //if (dir == 0) - //{ - // setShape(0.5f, upperPieceY0, 0, 1, upperPieceY1, 1); - // Tile::addAABBs(level, x, y, z, box, boxes); - //} - //else if (dir == 1) - //{ - // setShape(0, upperPieceY0, 0, .5f, upperPieceY1, 1); - // Tile::addAABBs(level, x, y, z, box, boxes); - //} - //else if (dir == 2) - //{ - // setShape(0, upperPieceY0, 0.5f, 1, upperPieceY1, 1); - // Tile::addAABBs(level, x, y, z, box, boxes); - //} - //else if (dir == 3) - //{ - // setShape(0, upperPieceY0, 0, 1, upperPieceY1, .5f); - // Tile::addAABBs(level, x, y, z, box, boxes); - //} - setShape(0, 0, 0, 1, 1, 1); } @@ -416,9 +377,9 @@ Icon *StairTile::getTexture(int face, int data) return base->getTexture(face, basedata); } -int StairTile::getTickDelay() +int StairTile::getTickDelay(Level *level) { - return base->getTickDelay(); + return base->getTickDelay(level); } AABB *StairTile::getTileAABB(Level *level, int x, int y, int z) @@ -485,20 +446,20 @@ bool StairTile::use(Level *level, int x, int y, int z, shared_ptr player return base->use(level, x, y, z, player, 0, 0, 0, 0); } -void StairTile::wasExploded(Level *level, int x, int y, int z) +void StairTile::wasExploded(Level *level, int x, int y, int z, Explosion *explosion) { - base->wasExploded(level, x, y, z); + base->wasExploded(level, x, y, z, explosion); } -void StairTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void StairTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { int dir = ( Mth::floor(by->yRot * 4 / (360) + 0.5) ) & 3; int usd = level->getData(x, y, z) & UPSIDEDOWN_BIT; - if (dir == 0) level->setData(x, y, z, DIR_SOUTH | usd); - if (dir == 1) level->setData(x, y, z, DIR_WEST | usd); - if (dir == 2) level->setData(x, y, z, DIR_NORTH | usd); - if (dir == 3) level->setData(x, y, z, DIR_EAST | usd); + if (dir == 0) level->setData(x, y, z, DIR_SOUTH | usd, Tile::UPDATE_CLIENTS); + if (dir == 1) level->setData(x, y, z, DIR_WEST | usd, Tile::UPDATE_CLIENTS); + if (dir == 2) level->setData(x, y, z, DIR_NORTH | usd, Tile::UPDATE_CLIENTS); + if (dir == 3) level->setData(x, y, z, DIR_EAST | usd, Tile::UPDATE_CLIENTS); } int StairTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) diff --git a/Minecraft.World/StairTile.h b/Minecraft.World/StairTile.h index d4797f04..ff5d57ff 100644 --- a/Minecraft.World/StairTile.h +++ b/Minecraft.World/StairTile.h @@ -34,11 +34,8 @@ protected: public: void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param bool isSolidRender(bool isServerLevel = false); - bool isCubeShaped(); - int getRenderShape(); - void setBaseShape(LevelSource *level, int x, int y, int z); static bool isStairs(int id); @@ -48,59 +45,35 @@ private: public: bool setStepShape(LevelSource *level, int x, int y, int z); bool setInnerPieceShape(LevelSource *level, int x, int y, int z); - void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); /** DELEGATES: **/ public: - void addLights(Level *level, int x, int y, int z); - - void animateTick(Level *level, int x, int y, int z, Random *random); - - void attack(Level *level, int x, int y, int z, shared_ptr player); - - void destroy(Level *level, int x, int y, int z, int data); - - int getLightColor(LevelSource *level, int x, int y, int z, int tileId = -1); - float getBrightness(LevelSource *level, int x, int y, int z); - - float getExplosionResistance(shared_ptr source); - - int getRenderLayer(); - - Icon *getTexture(int face, int data); - - int getTickDelay(); - - AABB *getTileAABB(Level *level, int x, int y, int z); - - void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); - - bool mayPick(); - - bool mayPick(int data, bool liquid); - - bool mayPlace(Level *level, int x, int y, int z); - - void onPlace(Level *level, int x, int y, int z); - - void onRemove(Level *level, int x, int y, int z, int id, int data); - - void prepareRender(Level *level, int x, int y, int z); - - void stepOn(Level *level, int x, int y, int z, shared_ptr entity); - - void tick(Level *level, int x, int y, int z, Random *random); - - bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - - void wasExploded(Level *level, int x, int y, int z); - - void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); - int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); - - HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); - + virtual void addLights(Level *level, int x, int y, int z); + virtual void animateTick(Level *level, int x, int y, int z, Random *random); + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual void destroy(Level *level, int x, int y, int z, int data); + virtual int getLightColor(LevelSource *level, int x, int y, int z, int tileId = -1); + virtual float getBrightness(LevelSource *level, int x, int y, int z); + virtual float getExplosionResistance(shared_ptr source); + virtual int getRenderLayer(); + virtual Icon *getTexture(int face, int data); + virtual int getTickDelay(Level *level); + virtual AABB *getTileAABB(Level *level, int x, int y, int z); + virtual void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); + virtual bool mayPick(); + virtual bool mayPick(int data, bool liquid); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual void prepareRender(Level *level, int x, int y, int z); + virtual void stepOn(Level *level, int x, int y, int z, shared_ptr entity); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void wasExploded(Level *level, int x, int y, int z, Explosion *explosion); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); + virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); virtual void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/Stats.cpp b/Minecraft.World/Stats.cpp index ce9ed8a7..89da587b 100644 --- a/Minecraft.World/Stats.cpp +++ b/Minecraft.World/Stats.cpp @@ -125,9 +125,9 @@ void Stats::buildBlockStats() blocksMined[Tile::farmland->id] = newStat; newStat->postConstruct(); - newStat = new ItemStat(BLOCKS_MINED_OFFSET + 1, L"mineBlock.stone", Tile::stoneBrick->id); + newStat = new ItemStat(BLOCKS_MINED_OFFSET + 1, L"mineBlock.stone", Tile::cobblestone->id); blocksMinedStats->push_back(newStat); - blocksMined[Tile::stoneBrick->id] = newStat; + blocksMined[Tile::cobblestone->id] = newStat; newStat->postConstruct(); newStat = new ItemStat(BLOCKS_MINED_OFFSET + 2, L"mineBlock.sand", Tile::sand->id); @@ -135,9 +135,9 @@ void Stats::buildBlockStats() blocksMined[Tile::sand->id] = newStat; newStat->postConstruct(); - newStat = new ItemStat(BLOCKS_MINED_OFFSET + 3, L"mineBlock.cobblestone", Tile::rock->id); + newStat = new ItemStat(BLOCKS_MINED_OFFSET + 3, L"mineBlock.cobblestone", Tile::stone->id); blocksMinedStats->push_back(newStat); - blocksMined[Tile::rock->id] = newStat; + blocksMined[Tile::stone->id] = newStat; newStat->postConstruct(); newStat = new ItemStat(BLOCKS_MINED_OFFSET + 4, L"mineBlock.gravel", Tile::gravel->id); @@ -186,19 +186,19 @@ void Stats::buildBlockStats() blocksMined[Tile::lapisOre->id] = newStat; newStat->postConstruct(); - newStat = new ItemStat(BLOCKS_MINED_OFFSET + 13, L"mineBlock.netherrack", Tile::hellRock->id); + newStat = new ItemStat(BLOCKS_MINED_OFFSET + 13, L"mineBlock.netherrack", Tile::netherRack->id); blocksMinedStats->push_back(newStat); - blocksMined[Tile::hellRock->id] = newStat; + blocksMined[Tile::netherRack->id] = newStat; newStat->postConstruct(); - newStat = new ItemStat(BLOCKS_MINED_OFFSET + 14, L"mineBlock.soulSand", Tile::hellSand->id); + newStat = new ItemStat(BLOCKS_MINED_OFFSET + 14, L"mineBlock.soulSand", Tile::soulsand->id); blocksMinedStats->push_back(newStat); - blocksMined[Tile::hellSand->id] = newStat; + blocksMined[Tile::soulsand->id] = newStat; newStat->postConstruct(); - newStat = new ItemStat(BLOCKS_MINED_OFFSET + 15, L"mineBlock.glowstone", Tile::lightGem->id); + newStat = new ItemStat(BLOCKS_MINED_OFFSET + 15, L"mineBlock.glowstone", Tile::glowstone->id); blocksMinedStats->push_back(newStat); - blocksMined[Tile::lightGem->id] = newStat; + blocksMined[Tile::glowstone->id] = newStat; newStat->postConstruct(); newStat = new ItemStat(BLOCKS_MINED_OFFSET + 16, L"mineBlock.wood", Tile::treeTrunk->id); @@ -249,14 +249,14 @@ void Stats::buildCraftableStats() // 4J Stu - The following stats were added as it was too easy to cheat the leaderboards by dropping and picking up these items // They are now changed to mining the block which involves a tiny bit more effort - newStat = new ItemStat(BLOCKS_MINED_OFFSET + 18, L"mineBlock.wheat", Tile::crops_Id); + newStat = new ItemStat(BLOCKS_MINED_OFFSET + 18, L"mineBlock.wheat", Tile::wheat_Id); blocksMinedStats->push_back(newStat); - blocksMined[Tile::crops_Id] = newStat; + blocksMined[Tile::wheat_Id] = newStat; newStat->postConstruct(); - newStat = new ItemStat(BLOCKS_MINED_OFFSET + 19, L"mineBlock.mushroom1", Tile::mushroom1_Id); + newStat = new ItemStat(BLOCKS_MINED_OFFSET + 19, L"mineBlock.mushroom1", Tile::mushroom_brown_Id); blocksMinedStats->push_back(newStat); - blocksMined[Tile::mushroom1_Id] = newStat; + blocksMined[Tile::mushroom_brown_Id] = newStat; newStat->postConstruct(); newStat = new ItemStat(BLOCKS_MINED_OFFSET + 17, L"mineBlock.sugar", Tile::reeds_Id); @@ -407,9 +407,9 @@ void Stats::buildCraftableStats() itemsCrafted[Item::hoe_gold->id] = newStat; newStat->postConstruct(); - newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 23, L"craftItem.glowstone", Tile::lightGem_Id); + newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 23, L"craftItem.glowstone", Tile::glowstone_Id); itemsCraftedStats->push_back(newStat); - itemsCrafted[Tile::lightGem_Id] = newStat; + itemsCrafted[Tile::glowstone_Id] = newStat; newStat->postConstruct(); newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 24, L"craftItem.tnt", Tile::tnt_Id); diff --git a/Minecraft.World/StemTile.cpp b/Minecraft.World/StemTile.cpp index 15c412eb..bf9b058d 100644 --- a/Minecraft.World/StemTile.cpp +++ b/Minecraft.World/StemTile.cpp @@ -11,11 +11,11 @@ const wstring StemTile::TEXTURE_ANGLED = L"stem_bent"; StemTile::StemTile(int id, Tile *fruit) : Bush(id) { - this->fruit = fruit; + this->fruit = fruit; - setTicking(true); - float ss = 0.125f; - this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, 0.25f, 0.5f + ss); + setTicking(true); + float ss = 0.125f; + this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, 0.25f, 0.5f + ss); iconAngled = NULL; } @@ -27,91 +27,93 @@ bool StemTile::mayPlaceOn(int tile) void StemTile::tick(Level *level, int x, int y, int z, Random *random) { - Tile::tick(level, x, y, z, random); - if (level->getRawBrightness(x, y + 1, z) >= Level::MAX_BRIGHTNESS - 6) + Tile::tick(level, x, y, z, random); + if (level->getRawBrightness(x, y + 1, z) >= Level::MAX_BRIGHTNESS - 6) { - float growthSpeed = getGrowthSpeed(level, x, y, z); + float growthSpeed = getGrowthSpeed(level, x, y, z); // 4J Stu - Brought forward change from 1.2.3 to make fruit more likely to grow - if (random->nextInt((int) (25 / growthSpeed) + 1) == 0) + if (random->nextInt((int) (25 / growthSpeed) + 1) == 0) { - int age = level->getData(x, y, z); - if (age < 7) + int age = level->getData(x, y, z); + if (age < 7) { - age++; - level->setData(x, y, z, age); - } + age++; + level->setData(x, y, z, age, Tile::UPDATE_CLIENTS); + } else { - if (level->getTile(x - 1, y, z) == fruit->id) return; - if (level->getTile(x + 1, y, z) == fruit->id) return; - if (level->getTile(x, y, z - 1) == fruit->id) return; - if (level->getTile(x, y, z + 1) == fruit->id) return; - - int dir = random->nextInt(4); - int xx = x; - int zz = z; - if (dir == 0) xx--; - if (dir == 1) xx++; - if (dir == 2) zz--; - if (dir == 3) zz++; + if (level->getTile(x - 1, y, z) == fruit->id) return; + if (level->getTile(x + 1, y, z) == fruit->id) return; + if (level->getTile(x, y, z - 1) == fruit->id) return; + if (level->getTile(x, y, z + 1) == fruit->id) return; + + int dir = random->nextInt(4); + int xx = x; + int zz = z; + if (dir == 0) xx--; + if (dir == 1) xx++; + if (dir == 2) zz--; + if (dir == 3) zz++; // 4J Stu - Brought forward change from 1.2.3 to not require farmland to grow fruits int below = level->getTile(xx, y - 1, zz); if (level->getTile(xx, y, zz) == 0 && (below == Tile::farmland_Id || below == Tile::dirt_Id || below == Tile::grass_Id)) { - level->setTile(xx, y, zz, fruit->id); - } + level->setTileAndUpdate(xx, y, zz, fruit->id); + } - } - } - } + } + } + } } -void StemTile::growCropsToMax(Level *level, int x, int y, int z) +void StemTile::growCrops(Level *level, int x, int y, int z) { - level->setData(x, y, z, 7); + int stage = level->getData(x, y, z) + Mth::nextInt(level->random, 2, 5); + if (stage > 7) stage = 7; + level->setData(x, y, z, stage, Tile::UPDATE_CLIENTS); } float StemTile::getGrowthSpeed(Level *level, int x, int y, int z) { - float speed = 1; + float speed = 1; - int n = level->getTile(x, y, z - 1); - int s = level->getTile(x, y, z + 1); - int w = level->getTile(x - 1, y, z); - int e = level->getTile(x + 1, y, z); + int n = level->getTile(x, y, z - 1); + int s = level->getTile(x, y, z + 1); + int w = level->getTile(x - 1, y, z); + int e = level->getTile(x + 1, y, z); - int d0 = level->getTile(x - 1, y, z - 1); - int d1 = level->getTile(x + 1, y, z - 1); - int d2 = level->getTile(x + 1, y, z + 1); - int d3 = level->getTile(x - 1, y, z + 1); + int d0 = level->getTile(x - 1, y, z - 1); + int d1 = level->getTile(x + 1, y, z - 1); + int d2 = level->getTile(x + 1, y, z + 1); + int d3 = level->getTile(x - 1, y, z + 1); - bool horizontal = w == this->id || e == this->id; - bool vertical = n == this->id || s == this->id; - bool diagonal = d0 == this->id || d1 == this->id || d2 == this->id || d3 == this->id; + bool horizontal = w == id || e == id; + bool vertical = n == id || s == id; + bool diagonal = d0 == id || d1 == id || d2 == id || d3 == id; - for (int xx = x - 1; xx <= x + 1; xx++) - for (int zz = z - 1; zz <= z + 1; zz++) + for (int xx = x - 1; xx <= x + 1; xx++) + for (int zz = z - 1; zz <= z + 1; zz++) { - int t = level->getTile(xx, y - 1, zz); + int t = level->getTile(xx, y - 1, zz); - float tileSpeed = 0; - if (t == Tile::farmland_Id) + float tileSpeed = 0; + if (t == Tile::farmland_Id) { - tileSpeed = 1; - if (level->getData(xx, y - 1, zz) > 0) tileSpeed = 3; - } + tileSpeed = 1; + if (level->getData(xx, y - 1, zz) > 0) tileSpeed = 3; + } - if (xx != x || zz != z) tileSpeed /= 4; + if (xx != x || zz != z) tileSpeed /= 4; - speed += tileSpeed; - } + speed += tileSpeed; + } - if (diagonal || (horizontal && vertical)) speed /= 2; + if (diagonal || (horizontal && vertical)) speed /= 2; - return speed; + return speed; } int StemTile::getColor(int data) @@ -141,16 +143,16 @@ int StemTile::getColor(LevelSource *level, int x, int y, int z) void StemTile::updateDefaultShape() { - float ss = 0.125f; - this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, 0.25f, 0.5f + ss); + float ss = 0.125f; + setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, 0.25f, 0.5f + ss); } void StemTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); - tls->yy1 = (level->getData(x, y, z) * 2 + 2) / 16.0f; - float ss = 0.125f; - this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, (float) tls->yy1, 0.5f + ss); + tls->yy1 = (level->getData(x, y, z) * 2 + 2) / 16.0f; + float ss = 0.125f; + setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, (float) tls->yy1, 0.5f + ss); } int StemTile::getRenderShape() @@ -159,7 +161,7 @@ int StemTile::getRenderShape() } int StemTile::getConnectDir(LevelSource *level, int x, int y, int z) - { +{ int d = level->getData(x, y, z); if (d < 7) return -1; if (level->getTile(x - 1, y, z) == fruit->id) return 0; @@ -170,37 +172,30 @@ int StemTile::getConnectDir(LevelSource *level, int x, int y, int z) } /** - * Using this method instead of destroy() to determine if seeds should be - * dropped - */ +* Using this method instead of destroy() to determine if seeds should be +* dropped +*/ void StemTile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus) { - Tile::spawnResources(level, x, y, z, data, odds, playerBonus); + Tile::spawnResources(level, x, y, z, data, odds, playerBonus); - if (level->isClientSide) + if (level->isClientSide) { - return; - } + return; + } - Item *seed = NULL; - if (fruit == Tile::pumpkin) seed = Item::seeds_pumpkin; - if (fruit == Tile::melon) seed = Item::seeds_melon; - for (int i = 0; i < 3; i++) + Item *seed = NULL; + if (fruit == Tile::pumpkin) seed = Item::seeds_pumpkin; + if (fruit == Tile::melon) seed = Item::seeds_melon; + for (int i = 0; i < 3; i++) { - if (level->random->nextInt(5 * 3) > data) continue; - float s = 0.7f; - float xo = level->random->nextFloat() * s + (1 - s) * 0.5f; - float yo = level->random->nextFloat() * s + (1 - s) * 0.5f; - float zo = level->random->nextFloat() * s + (1 - s) * 0.5f; - shared_ptr item = shared_ptr(new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr(new ItemInstance(seed)))); - item->throwTime = 10; - level->addEntity(item); - } + popResource(level, x, y, z, shared_ptr(new ItemInstance(seed))); + } } int StemTile::getResource(int data, Random *random, int playerBonusLevel) { - return -1; + return -1; } int StemTile::getResourceCount(Random *random) diff --git a/Minecraft.World/StemTile.h b/Minecraft.World/StemTile.h index ac4fc40c..4685e0a5 100644 --- a/Minecraft.World/StemTile.h +++ b/Minecraft.World/StemTile.h @@ -16,10 +16,11 @@ private: public: StemTile(int id, Tile *fruit); - virtual bool mayPlaceOn(int tile); + virtual bool mayPlaceOn(int tile); public: virtual void tick(Level *level, int x, int y, int z, Random *random); - void growCropsToMax(Level *level, int x, int y, int z); + virtual void growCrops(Level *level, int x, int y, int z); + private: float getGrowthSpeed(Level *level, int x, int y, int z); @@ -27,21 +28,21 @@ public: using Tile::getColor; int getColor(int data); - virtual int getColor(LevelSource *level, int x, int y, int z); - virtual void updateDefaultShape(); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - virtual int getRenderShape(); + virtual int getColor(LevelSource *level, int x, int y, int z); + virtual void updateDefaultShape(); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual int getRenderShape(); - int getConnectDir(LevelSource *level, int x, int y, int z); + int getConnectDir(LevelSource *level, int x, int y, int z); - /** - * Using this method instead of destroy() to determine if seeds should be - * dropped - */ - virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); + /** + * Using this method instead of destroy() to determine if seeds should be + * dropped + */ + virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual int getResourceCount(Random *random); + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int getResourceCount(Random *random); virtual int cloneTileId(Level *level, int x, int y, int z); void registerIcons(IconRegister *iconRegister); Icon *getAngledTexture(); diff --git a/Minecraft.World/StoneButtonTile.cpp b/Minecraft.World/StoneButtonTile.cpp new file mode 100644 index 00000000..bc49409f --- /dev/null +++ b/Minecraft.World/StoneButtonTile.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "StoneButtonTile.h" + +StoneButtonTile::StoneButtonTile(int id) : ButtonTile(id, false) +{ +} + +Icon *StoneButtonTile::getTexture(int face, int data) +{ + return Tile::stone->getTexture(Facing::UP); +} \ No newline at end of file diff --git a/Minecraft.World/StoneButtonTile.h b/Minecraft.World/StoneButtonTile.h new file mode 100644 index 00000000..a6d5f31b --- /dev/null +++ b/Minecraft.World/StoneButtonTile.h @@ -0,0 +1,11 @@ +#pragma once + +#include "ButtonTile.h" + +class StoneButtonTile : public ButtonTile +{ +public: + StoneButtonTile(int id); + + virtual Icon *getTexture(int face, int data); +}; \ No newline at end of file diff --git a/Minecraft.World/StoneMonsterTile.cpp b/Minecraft.World/StoneMonsterTile.cpp index d3d6a846..ec31992f 100644 --- a/Minecraft.World/StoneMonsterTile.cpp +++ b/Minecraft.World/StoneMonsterTile.cpp @@ -1,29 +1,36 @@ #include "stdafx.h" #include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" #include "StoneMonsterTile.h" const unsigned int StoneMonsterTile::STONE_MONSTER_NAMES[STONE_MONSTER_NAMES_LENGTH] = { IDS_TILE_STONE_SILVERFISH, - IDS_TILE_STONE_SILVERFISH_COBBLESTONE, - IDS_TILE_STONE_SILVERFISH_STONE_BRICK, - }; + IDS_TILE_STONE_SILVERFISH_COBBLESTONE, + IDS_TILE_STONE_SILVERFISH_STONE_BRICK, +}; StoneMonsterTile::StoneMonsterTile(int id) : Tile(id, Material::clay) { - setDestroyTime(0); + setDestroyTime(0); } Icon *StoneMonsterTile::getTexture(int face, int data) { - if (data == HOST_COBBLE) +#ifndef _CONTENT_PACKAGE + if(app.DebugArtToolsOn()) { - return Tile::stoneBrick->getTexture(face); - } - if (data == HOST_STONEBRICK) + return Tile::fire->getTexture(face, 0); + } +#endif + if (data == HOST_COBBLE) + { + return Tile::cobblestone->getTexture(face); + } + if (data == HOST_STONEBRICK) { - return Tile::stoneBrickSmooth->getTexture(face); - } - return Tile::rock->getTexture(face); + return Tile::stoneBrick->getTexture(face); + } + return Tile::stone->getTexture(face); } void StoneMonsterTile::registerIcons(IconRegister *iconRegister) @@ -33,7 +40,7 @@ void StoneMonsterTile::registerIcons(IconRegister *iconRegister) void StoneMonsterTile::destroy(Level *level, int x, int y, int z, int data) { - if (!level->isClientSide) + if (!level->isClientSide) { // 4J - limit total amount of monsters. The normal map spawning limits these to 50, and mobspawning tiles limit to 60, so give ourselves a bit of headroom here to also be able to make silverfish if(level->countInstanceOf( eTYPE_MONSTER, false) < 70 ) @@ -48,8 +55,8 @@ void StoneMonsterTile::destroy(Level *level, int x, int y, int z, int data) silverfish->spawnAnim(); } } - } - Tile::destroy(level, x, y, z, data); + } + Tile::destroy(level, x, y, z, data); } int StoneMonsterTile::getResourceCount(Random *random) @@ -59,20 +66,20 @@ int StoneMonsterTile::getResourceCount(Random *random) bool StoneMonsterTile::isCompatibleHostBlock(int block) { - return block == Tile::rock_Id || block == Tile::stoneBrick_Id || block == Tile::stoneBrickSmooth_Id; + return block == Tile::stone_Id || block == Tile::cobblestone_Id || block == Tile::stoneBrick_Id; } int StoneMonsterTile::getDataForHostBlock(int block) { - if (block == Tile::stoneBrick_Id) + if (block == Tile::cobblestone_Id) { - return HOST_COBBLE; - } - if (block == Tile::stoneBrickSmooth_Id) + return HOST_COBBLE; + } + if (block == Tile::stoneBrick_Id) { - return HOST_STONEBRICK; - } - return HOST_ROCK; + return HOST_STONEBRICK; + } + return HOST_ROCK; } Tile *StoneMonsterTile::getHostBlockForData(int data) @@ -80,26 +87,26 @@ Tile *StoneMonsterTile::getHostBlockForData(int data) switch (data) { case HOST_COBBLE: - return Tile::stoneBrick; + return Tile::cobblestone; case HOST_STONEBRICK: - return Tile::stoneBrickSmooth; + return Tile::stoneBrick; default: - return Tile::rock; + return Tile::stone; } } shared_ptr StoneMonsterTile::getSilkTouchItemInstance(int data) { - Tile *tile = Tile::rock; - if (data == HOST_COBBLE) + Tile *tile = Tile::stone; + if (data == HOST_COBBLE) { - tile = Tile::stoneBrick; - } - if (data == HOST_STONEBRICK) + tile = Tile::cobblestone; + } + if (data == HOST_STONEBRICK) { - tile = Tile::stoneBrickSmooth; - } - return shared_ptr(new ItemInstance(tile)); + tile = Tile::stoneBrick; + } + return shared_ptr(new ItemInstance(tile)); } int StoneMonsterTile::cloneTileData(Level *level, int x, int y, int z) diff --git a/Minecraft.World/StoneSlabTile.cpp b/Minecraft.World/StoneSlabTile.cpp index 5c8d8b07..e4de58da 100644 --- a/Minecraft.World/StoneSlabTile.cpp +++ b/Minecraft.World/StoneSlabTile.cpp @@ -38,11 +38,11 @@ Icon *StoneSlabTile::getTexture(int face, int data) case WOOD_SLAB: return Tile::wood->getTexture(face); case COBBLESTONE_SLAB: - return Tile::stoneBrick->getTexture(face); + return Tile::cobblestone->getTexture(face); case BRICK_SLAB: return Tile::redBrick->getTexture(face); case SMOOTHBRICK_SLAB: - return Tile::stoneBrickSmooth->getTexture(face, SmoothStoneBrickTile::TYPE_DEFAULT); + return Tile::stoneBrick->getTexture(face, SmoothStoneBrickTile::TYPE_DEFAULT); case NETHERBRICK_SLAB: return Tile::netherBrick->getTexture(Facing::UP); case QUARTZ_SLAB: diff --git a/Minecraft.World/StoneSlabTileItem.cpp b/Minecraft.World/StoneSlabTileItem.cpp index ea636f65..013ad03e 100644 --- a/Minecraft.World/StoneSlabTileItem.cpp +++ b/Minecraft.World/StoneSlabTileItem.cpp @@ -12,7 +12,7 @@ StoneSlabTileItem::StoneSlabTileItem(int id, HalfSlabTile *halfTile, HalfSlabTil this->halfTile = halfTile; this->fullTile = fullTile; - this->isFull = full; + isFull = full; setMaxDamage(0); setStackedByData(true); } @@ -40,7 +40,7 @@ bool StoneSlabTileItem::useOn(shared_ptr instance, shared_ptrcount == 0) return false; - if (!player->mayBuild(x, y, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; int currentTile = level->getTile(x, y, z); int currentData = level->getData(x, y, z); @@ -54,11 +54,9 @@ bool StoneSlabTileItem::useOn(shared_ptr instance, shared_ptrisUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType)) + if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType, Tile::UPDATE_ALL)) { -// level.playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile.soundType.getPlaceSound(), (fullTile.soundType.getVolume() + 1) / 2, fullTile.soundType.getPitch() * 0.8f); -// instance.count--; - level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile->soundType->getStepSound(), (fullTile->soundType->getVolume() + 1) / 2, fullTile->soundType->getPitch() * 0.8f); + level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile->soundType->getPlaceSound(), (fullTile->soundType->getVolume() + 1) / 2, fullTile->soundType->getPitch() * 0.8f); instance->count--; } return true; @@ -127,10 +125,9 @@ bool StoneSlabTileItem::tryConvertTargetTile(shared_ptr instance, { return true; } - if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType)) + if (level->isUnobstructed(fullTile->getAABB(level, x, y, z)) && level->setTileAndData(x, y, z, fullTile->id, slabType, Tile::UPDATE_ALL)) { - //level.playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile.soundType.getPlaceSound(), (fullTile.soundType.getVolume() + 1) / 2, fullTile.soundType.getPitch() * 0.8f); - level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile->soundType->getStepSound(), (fullTile->soundType->getVolume() + 1) / 2, fullTile->soundType->getPitch() * 0.8f); + level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, fullTile->soundType->getPlaceSound(), (fullTile->soundType->getVolume() + 1) / 2, fullTile->soundType->getPitch() * 0.8f); instance->count--; } return true; diff --git a/Minecraft.World/StoneTile.cpp b/Minecraft.World/StoneTile.cpp index 330cc087..01330894 100644 --- a/Minecraft.World/StoneTile.cpp +++ b/Minecraft.World/StoneTile.cpp @@ -7,5 +7,5 @@ StoneTile::StoneTile(int id) : Tile(id, Material::stone) int StoneTile::getResource(int data, Random *random, int playerBonusLevel) { - return Tile::stoneBrick_Id; + return Tile::cobblestone_Id; } \ No newline at end of file diff --git a/Minecraft.World/StringHelpers.cpp b/Minecraft.World/StringHelpers.cpp index f305c185..6985c88f 100644 --- a/Minecraft.World/StringHelpers.cpp +++ b/Minecraft.World/StringHelpers.cpp @@ -68,6 +68,20 @@ const char *wstringtofilename(const wstring& name) return buf; } +const char *wstringtochararray(const wstring& name) +{ + static char buf[256]; + assert(name.length()<256); + for(unsigned int i = 0; i < name.length(); i++ ) + { + wchar_t c = name[i]; + assert(c<128); // Will we have to do any conversion of non-ASCII characters in filenames? + buf[i] = (char)c; + } + buf[name.length()] = 0; + return buf; +} + wstring filenametowstring(const char *name) { return convStringToWstring(name); diff --git a/Minecraft.World/StringHelpers.h b/Minecraft.World/StringHelpers.h index 609fdf5a..1b364118 100644 --- a/Minecraft.World/StringHelpers.h +++ b/Minecraft.World/StringHelpers.h @@ -13,23 +13,30 @@ template std::wstring _toString(T t) oss << std::dec << t; return oss.str(); } +template std::wstring _toHexString(T t) +{ + std::wostringstream oss; + oss << std::hex << t; + return oss.str(); +} template T _fromString(const std::wstring& s) { - std::wistringstream stream (s); - T t; - stream >> t; - return t; + std::wistringstream stream (s); + T t; + stream >> t; + return t; } template T _fromHEXString(const std::wstring& s) { - std::wistringstream stream (s); - T t; - stream >> std::hex >> t; - return t; + std::wistringstream stream (s); + T t; + stream >> std::hex >> t; + return t; } wstring convStringToWstring(const string& converting); const char *wstringtofilename(const wstring& name); +const char *wstringtochararray(const wstring& name); wstring filenametowstring(const char *name); std::vector &stringSplit(const std::wstring &s, wchar_t delim, std::vector &elems); diff --git a/Minecraft.World/StringTag.h b/Minecraft.World/StringTag.h index badd53e6..8eb0eb7f 100644 --- a/Minecraft.World/StringTag.h +++ b/Minecraft.World/StringTag.h @@ -13,7 +13,7 @@ public: dos->writeUTF(data); } - void load(DataInput *dis) + void load(DataInput *dis, int tagDepth) { data = dis->readUTF(); } diff --git a/Minecraft.World/StrongholdFeature.cpp b/Minecraft.World/StrongholdFeature.cpp index 5372f4f9..3aed0195 100644 --- a/Minecraft.World/StrongholdFeature.cpp +++ b/Minecraft.World/StrongholdFeature.cpp @@ -4,9 +4,14 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.dimension.h" +#include "Mth.h" #include "FileHeader.h" #include "JavaMath.h" +const wstring StrongholdFeature::OPTION_DISTANCE = L"distance"; +const wstring StrongholdFeature::OPTION_COUNT = L"count"; +const wstring StrongholdFeature::OPTION_SPREAD = L"spread"; + vector StrongholdFeature::allowedBiomes; void StrongholdFeature::staticCtor() @@ -26,33 +31,69 @@ void StrongholdFeature::staticCtor() allowedBiomes.push_back(Biome::jungleHills); }; - -StrongholdFeature::StrongholdFeature() : StructureFeature() +void StrongholdFeature::_init() { + distance = 32; + spread = 3; + // 4J added initialisers - for (int i = 0; i < strongholdPos_length; i++) + for (int i = 0; i < strongholdPos_length; i++) { strongholdPos[i] = NULL; } isSpotSelected = false; } +StrongholdFeature::StrongholdFeature() : StructureFeature() +{ + _init(); +} + +StrongholdFeature::StrongholdFeature(unordered_map options) +{ + _init(); + + for (AUTO_VAR(it, options.begin()); it != options.end(); ++it) + { + if (it->first.compare(OPTION_DISTANCE) == 0) + { + distance = Mth::getDouble(it->second, distance, 1); + } + else if (it->first.compare(OPTION_COUNT) == 0) + { + // 4J-JEV: Removed, we only have the one stronghold. + //strongholdPos = new ChunkPos[ Mth::getInt(it->second, strongholdPos_length, 1) ]; + assert(false); + } + else if (it->first.compare(OPTION_SPREAD) == 0) + { + spread = Mth::getInt(it->second, spread, 1); + } + } +} + StrongholdFeature::~StrongholdFeature() { - for (int i = 0; i < strongholdPos_length; i++) + for (int i = 0; i < strongholdPos_length; i++) { delete strongholdPos[i]; } } +wstring StrongholdFeature::getFeatureName() +{ + return LargeFeature::STRONGHOLD; +} + bool StrongholdFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) { - if (!isSpotSelected) + if (!isSpotSelected) { Random random; - random.setSeed(level->getSeed()); + random.setSeed(level->getSeed()); double angle = random.nextDouble() * PI * 2.0; + int circle = 1; // 4J Stu - Changed so that we keep trying more until we have found somewhere in the world to place a stronghold bool hasFoundValidPos = false; @@ -71,7 +112,7 @@ bool StrongholdFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) else { // Original Java - dist = (1.25 + random.nextDouble()) * 32.0; + dist = (1.25 * circle + random.nextDouble()) * (distance * circle); } #else // 4J Stu - Design change: Original spawns at *32 chunks rather than *10 chunks from (0,0) but that is outside our world @@ -118,10 +159,6 @@ bool StrongholdFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) // 4J Added hasFoundValidPos = true; delete position; - } - else - { - app.DebugPrintf("Placed stronghold in INVALID biome at (%d, %d)\n", selectedX, selectedZ); } delete strongholdPos[i]; @@ -135,7 +172,7 @@ bool StrongholdFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) // 4J Stu - Randomise the angles for retries as well #ifdef _LARGE_WORLDS - angle = random.nextDouble() * PI * 2.0; + angle = random.nextDouble() * PI * 2.0 * circle / (double) spread; #endif } while(!hasFoundValidPos && findAttempts < MAX_STRONGHOLD_ATTEMPTS); @@ -148,8 +185,8 @@ bool StrongholdFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) } isSpotSelected = true; - } - + } + for (int i = 0; i < strongholdPos_length; i++) { bool forcePlacement = false; @@ -160,65 +197,70 @@ bool StrongholdFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) } ChunkPos *pos = strongholdPos[i]; - if (forcePlacement || (pos && x == pos->x && z == pos->z) ) + if (forcePlacement || (pos && x == pos->x && z == pos->z) ) { - return true; - } + return true; + } } - return false; + return false; } vector *StrongholdFeature::getGuesstimatedFeaturePositions() { - vector *positions = new vector(); + vector *positions = new vector(); for( int i = 0; i < strongholdPos_length; i++ ) { ChunkPos *chunkPos = strongholdPos[i]; - if (chunkPos != NULL) + if (chunkPos != NULL) { positions->push_back(chunkPos->getMiddleBlockPosition(64)); - } - } - return positions; + } + } + return positions; } StructureStart *StrongholdFeature::createStructureStart(int x, int z) { - StrongholdStart *start = new StrongholdStart(level, random, x, z); + StrongholdStart *start = new StrongholdStart(level, random, x, z); // 4J - front() was get(0) while (start->getPieces()->empty() || ((StrongholdPieces::StartPiece *) start->getPieces()->front())->portalRoomPiece == NULL) { delete start; - // regenerate stronghold without changing seed - start = new StrongholdStart(level, random, x, z); - } + // regenerate stronghold without changing seed + start = new StrongholdStart(level, random, x, z); + } - return start; + return start; - // System.out.println("Creating stronghold at (" + x + ", " + z + ")"); - // return new StrongholdStart(level, random, x, z); + // System.out.println("Creating stronghold at (" + x + ", " + z + ")"); + // return new StrongholdStart(level, random, x, z); } -StrongholdFeature::StrongholdStart::StrongholdStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart() +StrongholdFeature::StrongholdStart::StrongholdStart() { - StrongholdPieces::resetPieces(); + // for reflection +} + +StrongholdFeature::StrongholdStart::StrongholdStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart(chunkX, chunkZ) +{ + StrongholdPieces::resetPieces(); - StrongholdPieces::StartPiece *startRoom = new StrongholdPieces::StartPiece(0, random, (chunkX << 4) + 2, (chunkZ << 4) + 2, level); - pieces.push_back(startRoom); - startRoom->addChildren(startRoom, &pieces, random); + StrongholdPieces::StartPiece *startRoom = new StrongholdPieces::StartPiece(0, random, (chunkX << 4) + 2, (chunkZ << 4) + 2, level); + pieces.push_back(startRoom); + startRoom->addChildren(startRoom, &pieces, random); - vector *pendingChildren = &startRoom->pendingChildren; - while (!pendingChildren->empty()) + vector *pendingChildren = &startRoom->pendingChildren; + while (!pendingChildren->empty()) { - int pos = random->nextInt((int)pendingChildren->size()); + int pos = random->nextInt((int)pendingChildren->size()); AUTO_VAR(it, pendingChildren->begin() + pos); StructurePiece *structurePiece = *it; pendingChildren->erase(it); - structurePiece->addChildren(startRoom, &pieces, random); - } + structurePiece->addChildren(startRoom, &pieces, random); + } - calculateBoundingBox(); - moveBelowSeaLevel(level, random, 10); + calculateBoundingBox(); + moveBelowSeaLevel(level, random, 10); } \ No newline at end of file diff --git a/Minecraft.World/StrongholdFeature.h b/Minecraft.World/StrongholdFeature.h index c96e9933..57dc5e2d 100644 --- a/Minecraft.World/StrongholdFeature.h +++ b/Minecraft.World/StrongholdFeature.h @@ -18,28 +18,45 @@ class Biome; class StrongholdFeature : public StructureFeature { +public: + static const wstring OPTION_DISTANCE; + static const wstring OPTION_COUNT; + static const wstring OPTION_SPREAD; + public: static void staticCtor(); private: static vector allowedBiomes; - bool isSpotSelected; + bool isSpotSelected; static const int strongholdPos_length = 1;// Java game has 3, but xbox game only has 1 because of the world size; // 4J added - ChunkPos *strongholdPos[strongholdPos_length]; + ChunkPos *strongholdPos[strongholdPos_length]; + double distance; + int spread; + + void _init(); public: StrongholdFeature(); + StrongholdFeature(unordered_map options); ~StrongholdFeature(); + wstring getFeatureName(); + protected: virtual bool isFeatureChunk(int x, int z, bool bIsSuperflat=false); vector *getGuesstimatedFeaturePositions(); - virtual StructureStart *createStructureStart(int x, int z); + virtual StructureStart *createStructureStart(int x, int z); -private: +public: class StrongholdStart : public StructureStart { public: + static StructureStart *Create() { return new StrongholdStart(); } + virtual EStructureStart GetType() { return eStructureStart_StrongholdStart; } + + public: + StrongholdStart(); StrongholdStart(Level *level, Random *random, int chunkX, int chunkZ); - }; + }; }; diff --git a/Minecraft.World/StrongholdPieces.cpp b/Minecraft.World/StrongholdPieces.cpp index 0168b2ba..d736fb0e 100644 --- a/Minecraft.World/StrongholdPieces.cpp +++ b/Minecraft.World/StrongholdPieces.cpp @@ -5,6 +5,7 @@ #include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.level.storage.h" #include "net.minecraft.world.level.levelgen.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "net.minecraft.world.item.h" #include "WeighedTreasure.h" #include "FileHeader.h" @@ -15,6 +16,23 @@ list StrongholdPieces::currentPieces; StrongholdPieces::EPieceClass StrongholdPieces::imposedPiece; const bool StrongholdPieces::CHECK_AIR = true; +void StrongholdPieces::loadStatic() +{ + StructureFeatureIO::setPieceId(eStructurePiece_ChestCorridor, ChestCorridor::Create, L"SHCC"); + StructureFeatureIO::setPieceId(eStructurePiece_FillerCorridor, FillerCorridor::Create, L"SHFC"); + StructureFeatureIO::setPieceId(eStructurePiece_FiveCrossing, FiveCrossing::Create, L"SH5C"); + StructureFeatureIO::setPieceId(eStructurePiece_LeftTurn, LeftTurn::Create, L"SHLT"); + StructureFeatureIO::setPieceId(eStructurePiece_Library, Library::Create, L"SHLi"); + StructureFeatureIO::setPieceId(eStructurePiece_PortalRoom, PortalRoom::Create, L"SHPR"); + StructureFeatureIO::setPieceId(eStructurePiece_PrisonHall, PrisonHall::Create, L"SHPH"); + StructureFeatureIO::setPieceId(eStructurePiece_RightTurn, RightTurn::Create, L"SHRT"); + StructureFeatureIO::setPieceId(eStructurePiece_StrongholdRoomCrossing, RoomCrossing::Create, L"SHRC"); + StructureFeatureIO::setPieceId(eStructurePiece_StairsDown, StairsDown::Create, L"SHSD"); + StructureFeatureIO::setPieceId(eStructurePiece_StrongholdStartPiece, StartPiece::Create, L"SHStart"); + StructureFeatureIO::setPieceId(eStructurePiece_Straight, Straight::Create, L"SHS"); + StructureFeatureIO::setPieceId(eStructurePiece_StraightStairsDown, StraightStairsDown::Create, L"SHSSD"); +} + StrongholdPieces::PieceWeight::PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount) : weight(weight) { this->placeCount = 0; // 4J added initialiser @@ -40,16 +58,16 @@ void StrongholdPieces::resetPieces() } currentPieces.clear(); - currentPieces.push_back( new PieceWeight(EPieceClass_Straight, 40, 0) ); - currentPieces.push_back( new PieceWeight(EPieceClass_PrisonHall, 5, 5) ); - currentPieces.push_back( new PieceWeight(EPieceClass_LeftTurn, 20, 0) ); - currentPieces.push_back( new PieceWeight(EPieceClass_RightTurn, 20, 0) ); - currentPieces.push_back( new PieceWeight(EPieceClass_RoomCrossing, 10, 6) ); - currentPieces.push_back( new PieceWeight(EPieceClass_StraightStairsDown, 5, 5) ); - currentPieces.push_back( new PieceWeight(EPieceClass_StairsDown, 5, 5) ); - currentPieces.push_back( new PieceWeight(EPieceClass_FiveCrossing, 5, 4) ); + currentPieces.push_back( new PieceWeight(EPieceClass_Straight, 40, 0) ); + currentPieces.push_back( new PieceWeight(EPieceClass_PrisonHall, 5, 5) ); + currentPieces.push_back( new PieceWeight(EPieceClass_LeftTurn, 20, 0) ); + currentPieces.push_back( new PieceWeight(EPieceClass_RightTurn, 20, 0) ); + currentPieces.push_back( new PieceWeight(EPieceClass_RoomCrossing, 10, 6) ); + currentPieces.push_back( new PieceWeight(EPieceClass_StraightStairsDown, 5, 5) ); + currentPieces.push_back( new PieceWeight(EPieceClass_StairsDown, 5, 5) ); + currentPieces.push_back( new PieceWeight(EPieceClass_FiveCrossing, 5, 4) ); currentPieces.push_back( new PieceWeight(EPieceClass_ChestCorridor, 5, 4) ); - currentPieces.push_back( new PieceWeight_Library(EPieceClass_Library, 10, 2) ); + currentPieces.push_back( new PieceWeight_Library(EPieceClass_Library, 10, 2) ); currentPieces.push_back( new PieceWeight_PortalRoom(EPieceClass_PortalRoom, 20, 1) ); imposedPiece = EPieceClass_NULL; @@ -57,142 +75,142 @@ void StrongholdPieces::resetPieces() bool StrongholdPieces::updatePieceWeight() { - bool hasAnyPieces = false; - totalWeight = 0; + bool hasAnyPieces = false; + totalWeight = 0; for( AUTO_VAR(it, currentPieces.begin()); it != currentPieces.end(); it++ ) { PieceWeight *piece = *it; - if (piece->maxPlaceCount > 0 && piece->placeCount < piece->maxPlaceCount) + if (piece->maxPlaceCount > 0 && piece->placeCount < piece->maxPlaceCount) { - hasAnyPieces = true; - } - totalWeight += piece->weight; - } - return hasAnyPieces; + hasAnyPieces = true; + } + totalWeight += piece->weight; + } + return hasAnyPieces; } StrongholdPieces::StrongholdPiece *StrongholdPieces::findAndCreatePieceFactory(EPieceClass pieceClass, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth) { - StrongholdPiece *strongholdPiece = NULL; + StrongholdPiece *strongholdPiece = NULL; - if (pieceClass == EPieceClass_Straight) + if (pieceClass == EPieceClass_Straight) { - strongholdPiece = Straight::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = Straight::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_PrisonHall) { - strongholdPiece = PrisonHall::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = PrisonHall::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_LeftTurn) { - strongholdPiece = LeftTurn::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = LeftTurn::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_RightTurn) { - strongholdPiece = RightTurn::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = RightTurn::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_RoomCrossing) { - strongholdPiece = RoomCrossing::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = RoomCrossing::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_StraightStairsDown) { - strongholdPiece = StraightStairsDown::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = StraightStairsDown::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_StairsDown) { - strongholdPiece = StairsDown::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = StairsDown::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_FiveCrossing) { - strongholdPiece = FiveCrossing::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = FiveCrossing::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_ChestCorridor) { - strongholdPiece = ChestCorridor::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = ChestCorridor::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } else if (pieceClass == EPieceClass_Library) { - strongholdPiece = Library::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } - else if (pieceClass == EPieceClass_PortalRoom) + strongholdPiece = Library::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } + else if (pieceClass == EPieceClass_PortalRoom) { - strongholdPiece = PortalRoom::createPiece(pieces, random, footX, footY, footZ, direction, depth); - } + strongholdPiece = PortalRoom::createPiece(pieces, random, footX, footY, footZ, direction, depth); + } - return strongholdPiece; + return strongholdPiece; } StrongholdPieces::StrongholdPiece *StrongholdPieces::generatePieceFromSmallDoor(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth) { - if (!updatePieceWeight()) + if (!updatePieceWeight()) { - return NULL; - } + return NULL; + } if (imposedPiece != EPieceClass_NULL) { - StrongholdPiece *strongholdPiece = findAndCreatePieceFactory(imposedPiece, pieces, random, footX, footY, footZ, direction, depth); - imposedPiece = EPieceClass_NULL; + StrongholdPiece *strongholdPiece = findAndCreatePieceFactory(imposedPiece, pieces, random, footX, footY, footZ, direction, depth); + imposedPiece = EPieceClass_NULL; - if (strongholdPiece != NULL) + if (strongholdPiece != NULL) { - return strongholdPiece; - } - } + return strongholdPiece; + } + } - int numAttempts = 0; - while (numAttempts < 5) + int numAttempts = 0; + while (numAttempts < 5) { - numAttempts++; + numAttempts++; - int weightSelection = random->nextInt(totalWeight); + int weightSelection = random->nextInt(totalWeight); for( AUTO_VAR(it, currentPieces.begin()); it != currentPieces.end(); it++ ) { PieceWeight *piece = *it; - weightSelection -= piece->weight; - if (weightSelection < 0) + weightSelection -= piece->weight; + if (weightSelection < 0) { - if (!piece->doPlace(depth) || piece == startPiece->previousPiece) + if (!piece->doPlace(depth) || piece == startPiece->previousPiece) { - break; - } + break; + } - StrongholdPiece *strongholdPiece = findAndCreatePieceFactory(piece->pieceClass, pieces, random, footX, footY, footZ, direction, depth); - if (strongholdPiece != NULL) + StrongholdPiece *strongholdPiece = findAndCreatePieceFactory(piece->pieceClass, pieces, random, footX, footY, footZ, direction, depth); + if (strongholdPiece != NULL) { - piece->placeCount++; - startPiece->previousPiece = piece; + piece->placeCount++; + startPiece->previousPiece = piece; - if (!piece->isValid()) + if (!piece->isValid()) { - currentPieces.remove(piece); - } - return strongholdPiece; - } - } - } - } - { - BoundingBox *box = FillerCorridor::findPieceBox(pieces, random, footX, footY, footZ, direction); - if (box != NULL && box->y0 > 1) + currentPieces.remove(piece); + } + return strongholdPiece; + } + } + } + } + { + BoundingBox *box = FillerCorridor::findPieceBox(pieces, random, footX, footY, footZ, direction); + if (box != NULL && box->y0 > 1) { - return new FillerCorridor(depth, random, box, direction); - } + return new FillerCorridor(depth, random, box, direction); + } if(box != NULL) delete box; - } + } - return NULL; + return NULL; } StructurePiece *StrongholdPieces::generateAndAddPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth) { - if (depth > MAX_DEPTH) + if (depth > MAX_DEPTH) { - return NULL; - } - if (abs(footX - startPiece->getBoundingBox()->x0) > 3 * 16 || abs(footZ - startPiece->getBoundingBox()->z0) > 3 * 16) + return NULL; + } + if (abs(footX - startPiece->getBoundingBox()->x0) > 3 * 16 || abs(footZ - startPiece->getBoundingBox()->z0) > 3 * 16) { // Force attempt at spawning a portal room if(startPiece->m_level->getOriginalSaveVersion() >= SAVE_FILE_VERSION_MOVED_STRONGHOLD && !startPiece->m_level->getLevelData()->getHasStrongholdEndPortal()) @@ -223,142 +241,159 @@ StructurePiece *StrongholdPieces::generateAndAddPiece(StartPiece *startPiece, li } } } - return NULL; - } + return NULL; + } - StructurePiece *newPiece = generatePieceFromSmallDoor(startPiece, pieces, random, footX, footY, footZ, direction, depth + 1); - if (newPiece != NULL) + StructurePiece *newPiece = generatePieceFromSmallDoor(startPiece, pieces, random, footX, footY, footZ, direction, depth + 1); + if (newPiece != NULL) { pieces->push_back(newPiece); - startPiece->pendingChildren.push_back(newPiece); -// newPiece.addChildren(startPiece, pieces, random, depth + 1); - } - return newPiece; + startPiece->pendingChildren.push_back(newPiece); + // newPiece.addChildren(startPiece, pieces, random, depth + 1); + } + return newPiece; +} + +StrongholdPieces::StrongholdPiece::StrongholdPiece() +{ + entryDoor = OPENING; + // for reflection } StrongholdPieces::StrongholdPiece::StrongholdPiece(int genDepth) : StructurePiece(genDepth) { + entryDoor = OPENING; +} + +void StrongholdPieces::StrongholdPiece::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putString(L"EntryDoor", _toString(entryDoor)); +} + +void StrongholdPieces::StrongholdPiece::readAdditonalSaveData(CompoundTag *tag) +{ + entryDoor = (SmallDoorType)_fromString(tag->getString(L"EntryDoor")); } void StrongholdPieces::StrongholdPiece::generateSmallDoor(Level *level, Random *random, BoundingBox *chunkBB, StrongholdPieces::StrongholdPiece::SmallDoorType doorType, int footX, int footY, int footZ) { - switch (doorType) - { - default: - case OPENING: - generateBox(level, chunkBB, footX, footY, footZ, footX + SMALL_DOOR_WIDTH - 1, footY + SMALL_DOOR_HEIGHT - 1, footZ, 0, 0, false); - break; - case WOOD_DOOR: - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX, footY, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX, footY + 1, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX + 1, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX + 2, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX + 2, footY + 1, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX + 2, footY, footZ, chunkBB); - placeBlock(level, Tile::door_wood_Id, 0, footX + 1, footY, footZ, chunkBB); - placeBlock(level, Tile::door_wood_Id, DoorTile::UPPER_BIT, footX + 1, footY + 1, footZ, chunkBB); - break; - case GRATES: - placeBlock(level, 0, 0, footX + 1, footY, footZ, chunkBB); - placeBlock(level, 0, 0, footX + 1, footY + 1, footZ, chunkBB); - placeBlock(level, Tile::ironFence_Id, 0, footX, footY, footZ, chunkBB); - placeBlock(level, Tile::ironFence_Id, 0, footX, footY + 1, footZ, chunkBB); - placeBlock(level, Tile::ironFence_Id, 0, footX, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::ironFence_Id, 0, footX + 1, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::ironFence_Id, 0, footX + 2, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::ironFence_Id, 0, footX + 2, footY + 1, footZ, chunkBB); - placeBlock(level, Tile::ironFence_Id, 0, footX + 2, footY, footZ, chunkBB); - break; - case IRON_DOOR: - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX, footY, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX, footY + 1, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX + 1, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX + 2, footY + 2, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX + 2, footY + 1, footZ, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, footX + 2, footY, footZ, chunkBB); - placeBlock(level, Tile::door_iron_Id, 0, footX + 1, footY, footZ, chunkBB); - placeBlock(level, Tile::door_iron_Id, DoorTile::UPPER_BIT, footX + 1, footY + 1, footZ, chunkBB); - placeBlock(level, Tile::button_stone_Id, getOrientationData(Tile::button_stone_Id, 4), footX + 2, footY + 1, footZ + 1, chunkBB); - placeBlock(level, Tile::button_stone_Id, getOrientationData(Tile::button_stone_Id, 3), footX + 2, footY + 1, footZ - 1, chunkBB); - break; - } + switch (doorType) + { + default: + case OPENING: + generateBox(level, chunkBB, footX, footY, footZ, footX + SMALL_DOOR_WIDTH - 1, footY + SMALL_DOOR_HEIGHT - 1, footZ, 0, 0, false); + break; + case WOOD_DOOR: + placeBlock(level, Tile::stoneBrick_Id, 0, footX, footY, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX, footY + 1, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX + 1, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX + 2, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX + 2, footY + 1, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX + 2, footY, footZ, chunkBB); + placeBlock(level, Tile::door_wood_Id, 0, footX + 1, footY, footZ, chunkBB); + placeBlock(level, Tile::door_wood_Id, DoorTile::UPPER_BIT, footX + 1, footY + 1, footZ, chunkBB); + break; + case GRATES: + placeBlock(level, 0, 0, footX + 1, footY, footZ, chunkBB); + placeBlock(level, 0, 0, footX + 1, footY + 1, footZ, chunkBB); + placeBlock(level, Tile::ironFence_Id, 0, footX, footY, footZ, chunkBB); + placeBlock(level, Tile::ironFence_Id, 0, footX, footY + 1, footZ, chunkBB); + placeBlock(level, Tile::ironFence_Id, 0, footX, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::ironFence_Id, 0, footX + 1, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::ironFence_Id, 0, footX + 2, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::ironFence_Id, 0, footX + 2, footY + 1, footZ, chunkBB); + placeBlock(level, Tile::ironFence_Id, 0, footX + 2, footY, footZ, chunkBB); + break; + case IRON_DOOR: + placeBlock(level, Tile::stoneBrick_Id, 0, footX, footY, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX, footY + 1, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX + 1, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX + 2, footY + 2, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX + 2, footY + 1, footZ, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, footX + 2, footY, footZ, chunkBB); + placeBlock(level, Tile::door_iron_Id, 0, footX + 1, footY, footZ, chunkBB); + placeBlock(level, Tile::door_iron_Id, DoorTile::UPPER_BIT, footX + 1, footY + 1, footZ, chunkBB); + placeBlock(level, Tile::button_stone_Id, getOrientationData(Tile::button_stone_Id, 4), footX + 2, footY + 1, footZ + 1, chunkBB); + placeBlock(level, Tile::button_stone_Id, getOrientationData(Tile::button_stone_Id, 3), footX + 2, footY + 1, footZ - 1, chunkBB); + break; + } } StrongholdPieces::StrongholdPiece::SmallDoorType StrongholdPieces::StrongholdPiece::randomSmallDoor(Random *random) { - int selection = random->nextInt(5); - switch (selection) - { - default: - case 0: - case 1: - return OPENING; - case 2: - return WOOD_DOOR; - case 3: - return GRATES; - case 4: - return IRON_DOOR; - } + int selection = random->nextInt(5); + switch (selection) + { + default: + case 0: + case 1: + return OPENING; + case 2: + return WOOD_DOOR; + case 3: + return GRATES; + case 4: + return IRON_DOOR; + } } StructurePiece *StrongholdPieces::StrongholdPiece::generateSmallDoorChildForward(StartPiece *startPiece, list *pieces, Random *random, int xOff, int yOff) { - switch (orientation) + switch (orientation) { - case Direction::NORTH: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + xOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, orientation, getGenDepth()); - case Direction::SOUTH: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + xOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, orientation, getGenDepth()); - case Direction::WEST: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + xOff, orientation, getGenDepth()); - case Direction::EAST: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + xOff, orientation, getGenDepth()); - } - return NULL; + case Direction::NORTH: + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + xOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, orientation, getGenDepth()); + case Direction::SOUTH: + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + xOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, orientation, getGenDepth()); + case Direction::WEST: + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + xOff, orientation, getGenDepth()); + case Direction::EAST: + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + xOff, orientation, getGenDepth()); + } + return NULL; } StructurePiece *StrongholdPieces::StrongholdPiece::generateSmallDoorChildLeft(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff) { - switch (orientation) + switch (orientation) { case Direction::NORTH: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::WEST, getGenDepth()); + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::WEST, getGenDepth()); case Direction::SOUTH: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::WEST, getGenDepth()); + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 - 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::WEST, getGenDepth()); case Direction::WEST: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, Direction::NORTH, getGenDepth()); + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, Direction::NORTH, getGenDepth()); case Direction::EAST: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, Direction::NORTH, getGenDepth()); - } - return NULL; + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z0 - 1, Direction::NORTH, getGenDepth()); + } + return NULL; } StructurePiece *StrongholdPieces::StrongholdPiece::generateSmallDoorChildRight(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff) { - switch (orientation) + switch (orientation) { case Direction::NORTH: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::EAST, getGenDepth()); + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::EAST, getGenDepth()); case Direction::SOUTH: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::EAST, getGenDepth()); + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x1 + 1, boundingBox->y0 + yOff, boundingBox->z0 + zOff, Direction::EAST, getGenDepth()); case Direction::WEST: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth()); + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth()); case Direction::EAST: - return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth()); - } - return NULL; + return generateAndAddPiece(startPiece, pieces, random, boundingBox->x0 + zOff, boundingBox->y0 + yOff, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth()); + } + return NULL; } - + bool StrongholdPieces::StrongholdPiece::isOkBox(BoundingBox *box, StartPiece *startRoom) { //return box != NULL && box->y0 > LOWEST_Y_POSITION; - + bool bIsOk = false; - + if(box != NULL) { if( box->y0 > LOWEST_Y_POSITION ) bIsOk = true; @@ -379,107 +414,142 @@ bool StrongholdPieces::StrongholdPiece::isOkBox(BoundingBox *box, StartPiece *st return bIsOk; } +StrongholdPieces::FillerCorridor::FillerCorridor() : steps(0) +{ + // for reflection +} + StrongholdPieces::FillerCorridor::FillerCorridor(int genDepth, Random *random, BoundingBox *corridorBox, int direction) : StrongholdPiece(genDepth), steps((direction == Direction::NORTH || direction == Direction::SOUTH) ? corridorBox->getZSpan() : corridorBox->getXSpan()) { - orientation = direction; - boundingBox = corridorBox; + orientation = direction; + boundingBox = corridorBox; +} + +void StrongholdPieces::FillerCorridor::addAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::addAdditonalSaveData(tag); + tag->putInt(L"Steps", steps); +} + +void StrongholdPieces::FillerCorridor::readAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::readAdditonalSaveData(tag); + steps = tag->getInt(L"Steps"); } BoundingBox *StrongholdPieces::FillerCorridor::findPieceBox(list *pieces, Random *random, int footX, int footY, int footZ, int direction) { - const int maxLength = 3; + const int maxLength = 3; + + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, 5, 5, maxLength + 1, direction); - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, 5, 5, maxLength + 1, direction); + StructurePiece *collisionPiece = StructurePiece::findCollisionPiece(pieces, box); - StructurePiece *collisionPiece = StructurePiece::findCollisionPiece(pieces, box); - - if (collisionPiece == NULL) + if (collisionPiece == NULL) { delete box; - // the filler must collide with something in order to be - // generated - return NULL; - } + // the filler must collide with something in order to be + // generated + return NULL; + } - if (collisionPiece->getBoundingBox()->y0 == box->y0) + if (collisionPiece->getBoundingBox()->y0 == box->y0) { delete box; - // attempt to make a smaller piece until it fits - for (int depth = maxLength; depth >= 1; depth--) + // attempt to make a smaller piece until it fits + for (int depth = maxLength; depth >= 1; depth--) { - box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, 5, 5, depth - 1, direction); - if (!collisionPiece->getBoundingBox()->intersects(box)) + box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, 5, 5, depth - 1, direction); + if (!collisionPiece->getBoundingBox()->intersects(box)) { delete box; - // the corridor has shrunk enough to fit, but make it - // one step too big to build an entrance into the other - // block - return BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, 5, 5, depth, direction); - } + // the corridor has shrunk enough to fit, but make it + // one step too big to build an entrance into the other block + return BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, 5, 5, depth, direction); + } delete box; - } - } + } + } - return NULL; + return NULL; } bool StrongholdPieces::FillerCorridor::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } + return false; + } - // filler corridor - for (int i = 0; i < steps; i++) - { - // row 0 - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 0, 0, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 1, 0, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 2, 0, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3, 0, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 4, 0, i, chunkBB); - // row 1-3 - for (int y = 1; y <= 3; y++) + // filler corridor + for (int i = 0; i < steps; i++) + { + // row 0 + placeBlock(level, Tile::stoneBrick_Id, 0, 0, 0, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 1, 0, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 2, 0, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3, 0, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 4, 0, i, chunkBB); + // row 1-3 + for (int y = 1; y <= 3; y++) { - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 0, y, i, chunkBB); - placeBlock(level, 0, 0, 1, y, i, chunkBB); - placeBlock(level, 0, 0, 2, y, i, chunkBB); - placeBlock(level, 0, 0, 3, y, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 4, y, i, chunkBB); - } - // row 4 - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 0, 4, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 1, 4, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 2, 4, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3, 4, i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 4, 4, i, chunkBB); - } + placeBlock(level, Tile::stoneBrick_Id, 0, 0, y, i, chunkBB); + placeBlock(level, 0, 0, 1, y, i, chunkBB); + placeBlock(level, 0, 0, 2, y, i, chunkBB); + placeBlock(level, 0, 0, 3, y, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 4, y, i, chunkBB); + } + // row 4 + placeBlock(level, Tile::stoneBrick_Id, 0, 0, 4, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 1, 4, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 2, 4, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3, 4, i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 4, 4, i, chunkBB); + } + + return true; +} - return true; +StrongholdPieces::StairsDown::StairsDown() +{ + // for reflection } -StrongholdPieces::StairsDown::StairsDown(int genDepth, Random *random, int west, int north) : StrongholdPiece(genDepth), isSource(true), entryDoor(OPENING) +StrongholdPieces::StairsDown::StairsDown(int genDepth, Random *random, int west, int north) : StrongholdPiece(genDepth), isSource(true) { - orientation = random->nextInt(4); + orientation = random->nextInt(4); + entryDoor = OPENING; - switch (orientation) + switch (orientation) { - case Direction::NORTH: - case Direction::SOUTH: - boundingBox = new BoundingBox(west, 64, north, west + width - 1, 64 + height - 1, north + depth - 1); - break; - default: - boundingBox = new BoundingBox(west, 64, north, west + depth - 1, 64 + height - 1, north + width - 1); - break; - } + case Direction::NORTH: + case Direction::SOUTH: + boundingBox = new BoundingBox(west, 64, north, west + width - 1, 64 + height - 1, north + depth - 1); + break; + default: + boundingBox = new BoundingBox(west, 64, north, west + depth - 1, 64 + height - 1, north + width - 1); + break; + } } -StrongholdPieces::StairsDown::StairsDown(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), isSource(false), entryDoor(randomSmallDoor(random)) +StrongholdPieces::StairsDown::StairsDown(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), isSource(false) { - orientation = direction; - boundingBox = stairsBox; + entryDoor = randomSmallDoor(random); + orientation = direction; + boundingBox = stairsBox; +} + +void StrongholdPieces::StairsDown::addAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Source", isSource); +} + +void StrongholdPieces::StairsDown::readAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::readAdditonalSaveData(tag); + isSource = tag->getBoolean(L"Source"); } void StrongholdPieces::StairsDown::addChildren(StructurePiece *startPiece, list *pieces, Random *random) @@ -493,18 +563,18 @@ void StrongholdPieces::StairsDown::addChildren(StructurePiece *startPiece, list< StrongholdPieces::StairsDown *StrongholdPieces::StairsDown::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 4 - height, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 4 - height, 0, width, height, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new StairsDown(genDepth, random, box, direction); + return new StairsDown(genDepth, random, box, direction); } bool StrongholdPieces::StairsDown::postProcess(Level *level, Random *random, BoundingBox *chunkBB) @@ -522,27 +592,32 @@ bool StrongholdPieces::StairsDown::postProcess(Level *level, Random *random, Bou generateSmallDoor(level, random, chunkBB, OPENING, 1, 1, depth - 1); // stair steps - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 2, 6, 1, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 1, 5, 1, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 2, 6, 1, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 1, 5, 1, chunkBB); placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::STONE_SLAB, 1, 6, 1, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 1, 5, 2, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 1, 4, 3, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 1, 5, 2, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 1, 4, 3, chunkBB); placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::STONE_SLAB, 1, 5, 3, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 2, 4, 3, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3, 3, 3, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 2, 4, 3, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3, 3, 3, chunkBB); placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::STONE_SLAB, 3, 4, 3, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3, 3, 2, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3, 2, 1, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3, 3, 2, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3, 2, 1, chunkBB); placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::STONE_SLAB, 3, 3, 1, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 2, 2, 1, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 1, 1, 1, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 2, 2, 1, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 1, 1, 1, chunkBB); placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::STONE_SLAB, 1, 2, 1, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 1, 1, 2, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 1, 1, 2, chunkBB); placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::STONE_SLAB, 1, 1, 3, chunkBB); return true; } +StrongholdPieces::StartPiece::StartPiece() +{ + // for reflection +} + StrongholdPieces::StartPiece::StartPiece(int genDepth, Random *random, int west, int north, Level *level) : StairsDown(0, random, west, north) { // 4J added initialisers @@ -562,93 +637,136 @@ TilePos *StrongholdPieces::StartPiece::getLocatorPosition() return StairsDown::getLocatorPosition(); } +StrongholdPieces::Straight::Straight() +{ + // for reflection +} + StrongholdPieces::Straight::Straight(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), - entryDoor(randomSmallDoor(random)), - leftChild(random->nextInt(2) == 0), - rightChild(random->nextInt(2) == 0) + leftChild(random->nextInt(2) == 0), + rightChild(random->nextInt(2) == 0) +{ + entryDoor = randomSmallDoor(random); + orientation = direction; + boundingBox = stairsBox; +} + +void StrongholdPieces::Straight::addAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Left", leftChild); + tag->putBoolean(L"Right", rightChild); +} + +void StrongholdPieces::Straight::readAdditonalSaveData(CompoundTag *tag) { - orientation = direction; - boundingBox = stairsBox; + StrongholdPiece::readAdditonalSaveData(tag); + leftChild = tag->getBoolean(L"Left"); + rightChild = tag->getBoolean(L"Right"); } void StrongholdPieces::Straight::addChildren(StructurePiece *startPiece, list *pieces, Random *random) { - generateSmallDoorChildForward((StartPiece *) startPiece, pieces, random, 1, 1); - if (leftChild) generateSmallDoorChildLeft((StartPiece *) startPiece, pieces, random, 1, 2); - if (rightChild) generateSmallDoorChildRight((StartPiece *) startPiece, pieces, random, 1, 2); + generateSmallDoorChildForward((StartPiece *) startPiece, pieces, random, 1, 1); + if (leftChild) generateSmallDoorChildLeft((StartPiece *) startPiece, pieces, random, 1, 2); + if (rightChild) generateSmallDoorChildRight((StartPiece *) startPiece, pieces, random, 1, 2); } StrongholdPieces::Straight *StrongholdPieces::Straight::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new Straight(genDepth, random, box, direction); + return new Straight(genDepth, random, box, direction); } bool StrongholdPieces::Straight::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } + return false; + } - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); - // exit door - generateSmallDoor(level, random, chunkBB, OPENING, 1, 1, depth - 1); + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); + // exit door + generateSmallDoor(level, random, chunkBB, OPENING, 1, 1, depth - 1); - maybeGenerateBlock(level, chunkBB, random, .1f, 1, 2, 1, Tile::torch_Id, 0); - maybeGenerateBlock(level, chunkBB, random, .1f, 3, 2, 1, Tile::torch_Id, 0); - maybeGenerateBlock(level, chunkBB, random, .1f, 1, 2, 5, Tile::torch_Id, 0); - maybeGenerateBlock(level, chunkBB, random, .1f, 3, 2, 5, Tile::torch_Id, 0); + maybeGenerateBlock(level, chunkBB, random, .1f, 1, 2, 1, Tile::torch_Id, 0); + maybeGenerateBlock(level, chunkBB, random, .1f, 3, 2, 1, Tile::torch_Id, 0); + maybeGenerateBlock(level, chunkBB, random, .1f, 1, 2, 5, Tile::torch_Id, 0); + maybeGenerateBlock(level, chunkBB, random, .1f, 3, 2, 5, Tile::torch_Id, 0); - if (leftChild) + if (leftChild) { - generateBox(level, chunkBB, 0, 1, 2, 0, 3, 4, 0, 0, false); - } - if (rightChild) + generateBox(level, chunkBB, 0, 1, 2, 0, 3, 4, 0, 0, false); + } + if (rightChild) { - generateBox(level, chunkBB, 4, 1, 2, 4, 3, 4, 0, 0, false); - } + generateBox(level, chunkBB, 4, 1, 2, 4, 3, 4, 0, 0, false); + } - return true; + return true; } WeighedTreasure *StrongholdPieces::ChestCorridor::treasureItems[TREASURE_ITEMS_COUNT] = { - new WeighedTreasure(Item::enderPearl_Id, 0, 1, 1, 10), - new WeighedTreasure(Item::diamond_Id, 0, 1, 3, 3), - new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 10), - new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 5), - new WeighedTreasure(Item::redStone_Id, 0, 4, 9, 5), - new WeighedTreasure(Item::bread_Id, 0, 1, 3, 15), - new WeighedTreasure(Item::apple_Id, 0, 1, 3, 15), - new WeighedTreasure(Item::pickAxe_iron_Id, 0, 1, 1, 5), - new WeighedTreasure(Item::sword_iron_Id, 0, 1, 1, 5), - new WeighedTreasure(Item::chestplate_iron_Id, 0, 1, 1, 5), - new WeighedTreasure(Item::helmet_iron_Id, 0, 1, 1, 5), - new WeighedTreasure(Item::leggings_iron_Id, 0, 1, 1, 5), - new WeighedTreasure(Item::boots_iron_Id, 0, 1, 1, 5), - new WeighedTreasure(Item::apple_gold_Id, 0, 1, 1, 1) + new WeighedTreasure(Item::enderPearl_Id, 0, 1, 1, 10), + new WeighedTreasure(Item::diamond_Id, 0, 1, 3, 3), + new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 10), + new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 5), + new WeighedTreasure(Item::redStone_Id, 0, 4, 9, 5), + new WeighedTreasure(Item::bread_Id, 0, 1, 3, 15), + new WeighedTreasure(Item::apple_Id, 0, 1, 3, 15), + new WeighedTreasure(Item::pickAxe_iron_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::sword_iron_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::chestplate_iron_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::helmet_iron_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::leggings_iron_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::boots_iron_Id, 0, 1, 1, 5), + new WeighedTreasure(Item::apple_gold_Id, 0, 1, 1, 1), + // very rare for strongholds ... + new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 1), + // ... }; -StrongholdPieces::ChestCorridor::ChestCorridor(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)) +StrongholdPieces::ChestCorridor::ChestCorridor() { + // for reflection +} + +StrongholdPieces::ChestCorridor::ChestCorridor(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth) +{ + entryDoor = randomSmallDoor(random); orientation = direction; boundingBox = stairsBox; } +void StrongholdPieces::ChestCorridor::addAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Chest", hasPlacedChest); +} + +void StrongholdPieces::ChestCorridor::readAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::readAdditonalSaveData(tag); + hasPlacedChest = tag->getBoolean(L"Chest"); +} + void StrongholdPieces::ChestCorridor::addChildren(StructurePiece *startPiece, list *pieces, Random *random) { generateSmallDoorChildForward((StartPiece *) startPiece, pieces, random, 1, 1); @@ -656,63 +774,69 @@ void StrongholdPieces::ChestCorridor::addChildren(StructurePiece *startPiece, li StrongholdPieces::ChestCorridor *StrongholdPieces::ChestCorridor::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new ChestCorridor(genDepth, random, box, direction); + return new ChestCorridor(genDepth, random, box, direction); } bool StrongholdPieces::ChestCorridor::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } + return false; + } - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); - // exit door - generateSmallDoor(level, random, chunkBB, OPENING, 1, 1, depth - 1); + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); + // exit door + generateSmallDoor(level, random, chunkBB, OPENING, 1, 1, depth - 1); - // chest placement - generateBox(level, chunkBB, 3, 1, 2, 3, 1, 4, Tile::stoneBrickSmooth_Id, Tile::stoneBrickSmooth_Id, false); - placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 3, 1, 1, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 3, 1, 5, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 3, 2, 2, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 3, 2, 4, chunkBB); - for (int z = 2; z <= 4; z++) + // chest placement + generateBox(level, chunkBB, 3, 1, 2, 3, 1, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 3, 1, 1, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 3, 1, 5, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 3, 2, 2, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 3, 2, 4, chunkBB); + for (int z = 2; z <= 4; z++) { - placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 2, 1, z, chunkBB); - } + placeBlock(level, Tile::stoneSlabHalf_Id, StoneSlabTile::SMOOTHBRICK_SLAB, 2, 1, z, chunkBB); + } - if (!hasPlacedChest) + if (!hasPlacedChest) { - int y = getWorldY(2); - int x = getWorldX(3, 3), z = getWorldZ(3, 3); - if (chunkBB->isInside(x, y, z)) + int y = getWorldY(2); + int x = getWorldX(3, 3), z = getWorldZ(3, 3); + if (chunkBB->isInside(x, y, z)) { - hasPlacedChest = true; - createChest(level, chunkBB, random, 3, 2, 3, WeighedTreasure::addToTreasure(WeighedTreasureArray(treasureItems,TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random)), 2 + random->nextInt(2)); - } - } + hasPlacedChest = true; + createChest(level, chunkBB, random, 3, 2, 3, WeighedTreasure::addToTreasure(WeighedTreasureArray(treasureItems,TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random)), 2 + random->nextInt(2)); + } + } return true; } -StrongholdPieces::StraightStairsDown::StraightStairsDown(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)) +StrongholdPieces::StraightStairsDown::StraightStairsDown() +{ + // for reflection +} + +StrongholdPieces::StraightStairsDown::StraightStairsDown(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth) { - orientation = direction; - boundingBox = stairsBox; + entryDoor = randomSmallDoor(random); + orientation = direction; + boundingBox = stairsBox; } void StrongholdPieces::StraightStairsDown::addChildren(StructurePiece *startPiece, list *pieces, Random *random) @@ -722,56 +846,62 @@ void StrongholdPieces::StraightStairsDown::addChildren(StructurePiece *startPiec StrongholdPieces::StraightStairsDown *StrongholdPieces::StraightStairsDown::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 4 - height, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 4 - height, 0, width, height, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new StraightStairsDown(genDepth, random, box, direction); + return new StraightStairsDown(genDepth, random, box, direction); } bool StrongholdPieces::StraightStairsDown::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } + return false; + } - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); - // exit door - generateSmallDoor(level, random, chunkBB, OPENING, 1, 1, depth - 1); + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); + // exit door + generateSmallDoor(level, random, chunkBB, OPENING, 1, 1, depth - 1); - // stairs - int orientationData = getOrientationData(Tile::stairs_stone_Id, 2); - for (int i = 0; i < 6; i++) + // stairs + int orientationData = getOrientationData(Tile::stairs_stone_Id, 2); + for (int i = 0; i < 6; i++) { - placeBlock(level, Tile::stairs_stone_Id, orientationData, 1, height - 5 - i, 1 + i, chunkBB); - placeBlock(level, Tile::stairs_stone_Id, orientationData, 2, height - 5 - i, 1 + i, chunkBB); - placeBlock(level, Tile::stairs_stone_Id, orientationData, 3, height - 5 - i, 1 + i, chunkBB); - if (i < 5) + placeBlock(level, Tile::stairs_stone_Id, orientationData, 1, height - 5 - i, 1 + i, chunkBB); + placeBlock(level, Tile::stairs_stone_Id, orientationData, 2, height - 5 - i, 1 + i, chunkBB); + placeBlock(level, Tile::stairs_stone_Id, orientationData, 3, height - 5 - i, 1 + i, chunkBB); + if (i < 5) { - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 1, height - 6 - i, 1 + i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 2, height - 6 - i, 1 + i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3, height - 6 - i, 1 + i, chunkBB); - } - } + placeBlock(level, Tile::stoneBrick_Id, 0, 1, height - 6 - i, 1 + i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 2, height - 6 - i, 1 + i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3, height - 6 - i, 1 + i, chunkBB); + } + } - return true; + return true; } -StrongholdPieces::LeftTurn::LeftTurn(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)) +StrongholdPieces::LeftTurn::LeftTurn() { - orientation = direction; - boundingBox = stairsBox; + // for reflection +} + +StrongholdPieces::LeftTurn::LeftTurn(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth) +{ + entryDoor = randomSmallDoor(random); + orientation = direction; + boundingBox = stairsBox; } void StrongholdPieces::LeftTurn::addChildren(StructurePiece *startPiece, list *pieces, Random *random) @@ -788,42 +918,47 @@ void StrongholdPieces::LeftTurn::addChildren(StructurePiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new LeftTurn(genDepth, random, box, direction); + return new LeftTurn(genDepth, random, box, direction); } bool StrongholdPieces::LeftTurn::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } + return false; + } - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); - // exit opening - if (orientation == Direction::NORTH || orientation == Direction::EAST) + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); + // exit opening + if (orientation == Direction::NORTH || orientation == Direction::EAST) { - generateBox(level, chunkBB, 0, 1, 1, 0, 3, 3, 0, 0, false); - } + generateBox(level, chunkBB, 0, 1, 1, 0, 3, 3, 0, 0, false); + } else { - generateBox(level, chunkBB, 4, 1, 1, 4, 3, 3, 0, 0, false); - } + generateBox(level, chunkBB, 4, 1, 1, 4, 3, 3, 0, 0, false); + } + + return true; +} - return true; +StrongholdPieces::RightTurn::RightTurn() +{ + // for reflection } StrongholdPieces::RightTurn::RightTurn(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : LeftTurn(genDepth, random, stairsBox, direction) @@ -832,160 +967,177 @@ StrongholdPieces::RightTurn::RightTurn(int genDepth, Random *random, BoundingBox void StrongholdPieces::RightTurn::addChildren(StructurePiece *startPiece, list *pieces, Random *random) { - if (orientation == Direction::NORTH || orientation == Direction::EAST) + if (orientation == Direction::NORTH || orientation == Direction::EAST) { - generateSmallDoorChildRight((StartPiece *) startPiece, pieces, random, 1, 1); - } + generateSmallDoorChildRight((StartPiece *) startPiece, pieces, random, 1, 1); + } else { - generateSmallDoorChildLeft((StartPiece *) startPiece, pieces, random, 1, 1); - } + generateSmallDoorChildLeft((StartPiece *) startPiece, pieces, random, 1, 1); + } } bool StrongholdPieces::RightTurn::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } + return false; + } - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); - // exit opening - if (orientation == Direction::NORTH || orientation == Direction::EAST) + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 1, height - SMALL_DOOR_HEIGHT - 1, 0); + // exit opening + if (orientation == Direction::NORTH || orientation == Direction::EAST) { - generateBox(level, chunkBB, 4, 1, 1, 4, 3, 3, 0, 0, false); - } + generateBox(level, chunkBB, 4, 1, 1, 4, 3, 3, 0, 0, false); + } else { - generateBox(level, chunkBB, 0, 1, 1, 0, 3, 3, 0, 0, false); - } + generateBox(level, chunkBB, 0, 1, 1, 0, 3, 3, 0, 0, false); + } + + return true; +} + +StrongholdPieces::RoomCrossing::RoomCrossing() +{ + // for reflection +} - return true; +StrongholdPieces::RoomCrossing::RoomCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), type(random->nextInt(5)) +{ + entryDoor = randomSmallDoor(random); + orientation = direction; + boundingBox = stairsBox; } +void StrongholdPieces::RoomCrossing::addAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::addAdditonalSaveData(tag); + tag->putInt(L"Type", type); +} -StrongholdPieces::RoomCrossing::RoomCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)), type(random->nextInt(5)) +void StrongholdPieces::RoomCrossing::readAdditonalSaveData(CompoundTag *tag) { - orientation = direction; - boundingBox = stairsBox; + StrongholdPiece::readAdditonalSaveData(tag); + type = tag->getInt(L"Type"); } void StrongholdPieces::RoomCrossing::addChildren(StructurePiece *startPiece, list *pieces, Random *random) { - generateSmallDoorChildForward((StartPiece*) startPiece, pieces, random, 4, 1); - generateSmallDoorChildLeft((StartPiece*) startPiece, pieces, random, 1, 4); - generateSmallDoorChildRight((StartPiece*) startPiece, pieces, random, 1, 4); + generateSmallDoorChildForward((StartPiece*) startPiece, pieces, random, 4, 1); + generateSmallDoorChildLeft((StartPiece*) startPiece, pieces, random, 1, 4); + generateSmallDoorChildRight((StartPiece*) startPiece, pieces, random, 1, 4); } StrongholdPieces::RoomCrossing *StrongholdPieces::RoomCrossing::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, height, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new RoomCrossing(genDepth, random, box, direction); + return new RoomCrossing(genDepth, random, box, direction); } WeighedTreasure *StrongholdPieces::RoomCrossing::smallTreasureItems[SMALL_TREASURE_ITEMS_COUNT] = { - new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 10), - new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 5), - new WeighedTreasure(Item::redStone_Id, 0, 4, 9, 5), - new WeighedTreasure(Item::coal_Id, CoalItem::STONE_COAL, 3, 8, 10), - new WeighedTreasure(Item::bread_Id, 0, 1, 3, 15), - new WeighedTreasure(Item::apple_Id, 0, 1, 3, 15), - new WeighedTreasure(Item::pickAxe_iron_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 10), + new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 5), + new WeighedTreasure(Item::redStone_Id, 0, 4, 9, 5), + new WeighedTreasure(Item::coal_Id, CoalItem::STONE_COAL, 3, 8, 10), + new WeighedTreasure(Item::bread_Id, 0, 1, 3, 15), + new WeighedTreasure(Item::apple_Id, 0, 1, 3, 15), + new WeighedTreasure(Item::pickAxe_iron_Id, 0, 1, 1, 1), }; bool StrongholdPieces::RoomCrossing::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) - { - return false; - } - - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 4, 1, 0); - // exit openings - generateBox(level, chunkBB, 4, 1, depth - 1, 6, 3, depth - 1, 0, 0, false); - generateBox(level, chunkBB, 0, 1, 4, 0, 3, 6, 0, 0, false); - generateBox(level, chunkBB, width - 1, 1, 4, width - 1, 3, 6, 0, 0, false); - - switch (type) - { - default: - break; - case 0: - // middle torch pillar - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 5, 1, 5, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 5, 2, 5, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 5, 3, 5, chunkBB); - placeBlock(level, Tile::torch_Id, 0, 4, 3, 5, chunkBB); - placeBlock(level, Tile::torch_Id, 0, 6, 3, 5, chunkBB); - placeBlock(level, Tile::torch_Id, 0, 5, 3, 4, chunkBB); - placeBlock(level, Tile::torch_Id, 0, 5, 3, 6, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, 0, 4, 1, 4, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, 0, 4, 1, 5, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, 0, 4, 1, 6, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, 0, 6, 1, 4, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, 0, 6, 1, 5, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, 0, 6, 1, 6, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, 0, 5, 1, 4, chunkBB); - placeBlock(level, Tile::stoneSlabHalf_Id, 0, 5, 1, 6, chunkBB); - break; - case 1: + if (edgesLiquid(level, chunkBB)) + { + return false; + } + + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 4, 1, 0); + // exit openings + generateBox(level, chunkBB, 4, 1, depth - 1, 6, 3, depth - 1, 0, 0, false); + generateBox(level, chunkBB, 0, 1, 4, 0, 3, 6, 0, 0, false); + generateBox(level, chunkBB, width - 1, 1, 4, width - 1, 3, 6, 0, 0, false); + + switch (type) + { + default: + break; + case 0: + // middle torch pillar + placeBlock(level, Tile::stoneBrick_Id, 0, 5, 1, 5, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 5, 2, 5, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 5, 3, 5, chunkBB); + placeBlock(level, Tile::torch_Id, 0, 4, 3, 5, chunkBB); + placeBlock(level, Tile::torch_Id, 0, 6, 3, 5, chunkBB); + placeBlock(level, Tile::torch_Id, 0, 5, 3, 4, chunkBB); + placeBlock(level, Tile::torch_Id, 0, 5, 3, 6, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, 0, 4, 1, 4, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, 0, 4, 1, 5, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, 0, 4, 1, 6, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, 0, 6, 1, 4, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, 0, 6, 1, 5, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, 0, 6, 1, 6, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, 0, 5, 1, 4, chunkBB); + placeBlock(level, Tile::stoneSlabHalf_Id, 0, 5, 1, 6, chunkBB); + break; + case 1: + { + for (int i = 0; i < 5; i++) { - for (int i = 0; i < 5; i++) - { - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3, 1, 3 + i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 7, 1, 3 + i, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3 + i, 1, 3, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 3 + i, 1, 7, chunkBB); - } - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 5, 1, 5, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 5, 2, 5, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, 0, 5, 3, 5, chunkBB); - placeBlock(level, Tile::water_Id, 0, 5, 4, 5, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3, 1, 3 + i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 7, 1, 3 + i, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3 + i, 1, 3, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 3 + i, 1, 7, chunkBB); } - break; - case 2: - { + placeBlock(level, Tile::stoneBrick_Id, 0, 5, 1, 5, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 5, 2, 5, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, 0, 5, 3, 5, chunkBB); + placeBlock(level, Tile::water_Id, 0, 5, 4, 5, chunkBB); + } + break; + case 2: + { for (int z = 1; z <= 9; z++) { - placeBlock(level, Tile::stoneBrick_Id, 0, 1, 3, z, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 9, 3, z, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 1, 3, z, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 9, 3, z, chunkBB); } for (int x = 1; x <= 9; x++) { - placeBlock(level, Tile::stoneBrick_Id, 0, x, 3, 1, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, x, 3, 9, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, x, 3, 1, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, x, 3, 9, chunkBB); } - placeBlock(level, Tile::stoneBrick_Id, 0, 5, 1, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 5, 1, 6, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 5, 3, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 5, 3, 6, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 1, 5, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 6, 1, 5, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 3, 5, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 6, 3, 5, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 5, 1, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 5, 1, 6, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 5, 3, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 5, 3, 6, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 1, 5, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 6, 1, 5, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 3, 5, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 6, 3, 5, chunkBB); for (int y = 1; y <= 3; y++) { - placeBlock(level, Tile::stoneBrick_Id, 0, 4, y, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 6, y, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, y, 6, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 6, y, 6, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, y, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 6, y, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, y, 6, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 6, y, 6, chunkBB); } placeBlock(level, Tile::torch_Id, 0, 5, 3, 5, chunkBB); for (int z = 2; z <= 8; z++) @@ -1007,18 +1159,24 @@ bool StrongholdPieces::RoomCrossing::postProcess(Level *level, Random *random, B createChest(level, chunkBB, random, 3, 4, 8, WeighedTreasure::addToTreasure(WeighedTreasureArray(smallTreasureItems,SMALL_TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random)), 1 + random->nextInt(4)); // System.out.println("Created chest at " + getWorldX(3, 8) + - // "," + getWorldY(4) + "," + getWorldZ(3, 8)); + // "," + getWorldY(4) + "," + getWorldZ(3, 8)); } - break; - } - return true; + break; + } + return true; +} + +StrongholdPieces::PrisonHall::PrisonHall() +{ + // for reflection } -StrongholdPieces::PrisonHall::PrisonHall(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)) +StrongholdPieces::PrisonHall::PrisonHall(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth) { - orientation = direction; - boundingBox = stairsBox; + entryDoor = randomSmallDoor(random); + orientation = direction; + boundingBox = stairsBox; } void StrongholdPieces::PrisonHall::addChildren(StructurePiece *startPiece, list *pieces, Random *random) @@ -1028,346 +1186,406 @@ void StrongholdPieces::PrisonHall::addChildren(StructurePiece *startPiece, list< StrongholdPieces::PrisonHall *StrongholdPieces::PrisonHall::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, -1, 0, width, height, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new PrisonHall(genDepth, random, box, direction); + return new PrisonHall(genDepth, random, box, direction); } bool StrongholdPieces::PrisonHall::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } + return false; + } - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 1, 1, 0); - // exit openings - generateBox(level, chunkBB, 1, 1, depth - 1, 3, 3, depth - 1, 0, 0, false); + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 1, 1, 0); + // exit openings + generateBox(level, chunkBB, 1, 1, depth - 1, 3, 3, depth - 1, 0, 0, false); + + // door pillars + generateBox(level, chunkBB, 4, 1, 1, 4, 3, 1, false, random, (BlockSelector *)smoothStoneSelector); + generateBox(level, chunkBB, 4, 1, 3, 4, 3, 3, false, random, (BlockSelector *)smoothStoneSelector); + generateBox(level, chunkBB, 4, 1, 7, 4, 3, 7, false, random, (BlockSelector *)smoothStoneSelector); + generateBox(level, chunkBB, 4, 1, 9, 4, 3, 9, false, random, (BlockSelector *)smoothStoneSelector); + + // grates + generateBox(level, chunkBB, 4, 1, 4, 4, 3, 6, Tile::ironFence_Id, Tile::ironFence_Id, false); + generateBox(level, chunkBB, 5, 1, 5, 7, 3, 5, Tile::ironFence_Id, Tile::ironFence_Id, false); + + // doors + placeBlock(level, Tile::ironFence_Id, 0, 4, 3, 2, chunkBB); + placeBlock(level, Tile::ironFence_Id, 0, 4, 3, 8, chunkBB); + placeBlock(level, Tile::door_iron_Id, getOrientationData(Tile::door_iron_Id, 3), 4, 1, 2, chunkBB); + placeBlock(level, Tile::door_iron_Id, getOrientationData(Tile::door_iron_Id, 3) + DoorTile::UPPER_BIT, 4, 2, 2, chunkBB); + placeBlock(level, Tile::door_iron_Id, getOrientationData(Tile::door_iron_Id, 3), 4, 1, 8, chunkBB); + placeBlock(level, Tile::door_iron_Id, getOrientationData(Tile::door_iron_Id, 3) + DoorTile::UPPER_BIT, 4, 2, 8, chunkBB); - // door pillars - generateBox(level, chunkBB, 4, 1, 1, 4, 3, 1, false, random, (BlockSelector *)smoothStoneSelector); - generateBox(level, chunkBB, 4, 1, 3, 4, 3, 3, false, random, (BlockSelector *)smoothStoneSelector); - generateBox(level, chunkBB, 4, 1, 7, 4, 3, 7, false, random, (BlockSelector *)smoothStoneSelector); - generateBox(level, chunkBB, 4, 1, 9, 4, 3, 9, false, random, (BlockSelector *)smoothStoneSelector); + return true; - // grates - generateBox(level, chunkBB, 4, 1, 4, 4, 3, 6, Tile::ironFence_Id, Tile::ironFence_Id, false); - generateBox(level, chunkBB, 5, 1, 5, 7, 3, 5, Tile::ironFence_Id, Tile::ironFence_Id, false); +} - // doors - placeBlock(level, Tile::ironFence_Id, 0, 4, 3, 2, chunkBB); - placeBlock(level, Tile::ironFence_Id, 0, 4, 3, 8, chunkBB); - placeBlock(level, Tile::door_iron_Id, getOrientationData(Tile::door_iron_Id, 3), 4, 1, 2, chunkBB); - placeBlock(level, Tile::door_iron_Id, getOrientationData(Tile::door_iron_Id, 3) + DoorTile::UPPER_BIT, 4, 2, 2, chunkBB); - placeBlock(level, Tile::door_iron_Id, getOrientationData(Tile::door_iron_Id, 3), 4, 1, 8, chunkBB); - placeBlock(level, Tile::door_iron_Id, getOrientationData(Tile::door_iron_Id, 3) + DoorTile::UPPER_BIT, 4, 2, 8, chunkBB); +StrongholdPieces::Library::Library() +{ + isTall = false; + // for reflection +} - return true; +StrongholdPieces::Library::Library(int genDepth, Random *random, BoundingBox *roomBox, int direction) : StrongholdPiece(genDepth), + isTall(roomBox->getYSpan() > height) +{ + entryDoor = randomSmallDoor(random); + orientation = direction; + boundingBox = roomBox; +} +void StrongholdPieces::Library::addAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Tall", isTall); } -StrongholdPieces::Library::Library(int genDepth, Random *random, BoundingBox *roomBox, int direction) : StrongholdPiece(genDepth), - entryDoor(randomSmallDoor(random)), - isTall(roomBox->getYSpan() > height) +void StrongholdPieces::Library::readAdditonalSaveData(CompoundTag *tag) { - orientation = direction; - boundingBox = roomBox; + StrongholdPiece::readAdditonalSaveData(tag); + isTall = tag->getBoolean(L"Tall"); } StrongholdPieces::Library *StrongholdPieces::Library::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - // attempt to make a tall library first - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, tallHeight, depth, direction); + // attempt to make a tall library first + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, tallHeight, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - // make a short library - box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, height, depth, direction); + // make a short library + box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, height, depth, direction); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } - } + return NULL; + } + } - return new Library(genDepth, random, box, direction); + return new Library(genDepth, random, box, direction); } WeighedTreasure *StrongholdPieces::Library::libraryTreasureItems[LIBRARY_TREASURE_ITEMS_COUNT] = { - new WeighedTreasure(Item::book_Id, 0, 1, 3, 20), - new WeighedTreasure(Item::paper_Id, 0, 2, 7, 20), - new WeighedTreasure(Item::map_Id, 0, 1, 1, 1), - new WeighedTreasure(Item::compass_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::book_Id, 0, 1, 3, 20), + new WeighedTreasure(Item::paper_Id, 0, 2, 7, 20), + new WeighedTreasure(Item::map_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::compass_Id, 0, 1, 1, 1), }; bool StrongholdPieces::Library::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } + return false; + } - int currentHeight = tallHeight; - if (!isTall) + int currentHeight = tallHeight; + if (!isTall) { - currentHeight = height; - } + currentHeight = height; + } - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, currentHeight - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 4, 1, 0); + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, currentHeight - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 4, 1, 0); - // place sparse cob webs - generateMaybeBox(level, chunkBB, random, .07f, 2, 1, 1, width - 1 - 2, height - 2, depth - 2, Tile::web_Id, Tile::web_Id, false); + // place sparse cob webs + generateMaybeBox(level, chunkBB, random, .07f, 2, 1, 1, width - 1 - 2, height - 2, depth - 2, Tile::web_Id, Tile::web_Id, false); - const int bookLeft = 1; - const int bookRight = width - 2; + const int bookLeft = 1; + const int bookRight = width - 2; - // place library walls - for (int d = 1; d <= depth - 2; d++) { - if (((d - 1) % 4) == 0) { - generateBox(level, chunkBB, bookLeft, 1, d, bookLeft, 4, d, Tile::wood_Id, Tile::wood_Id, false); - generateBox(level, chunkBB, bookRight, 1, d, bookRight, 4, d, Tile::wood_Id, Tile::wood_Id, false); + // place library walls + for (int d = 1; d <= depth - 2; d++) { + if (((d - 1) % 4) == 0) { + generateBox(level, chunkBB, bookLeft, 1, d, bookLeft, 4, d, Tile::wood_Id, Tile::wood_Id, false); + generateBox(level, chunkBB, bookRight, 1, d, bookRight, 4, d, Tile::wood_Id, Tile::wood_Id, false); - placeBlock(level, Tile::torch_Id, 0, 2, 3, d, chunkBB); - placeBlock(level, Tile::torch_Id, 0, width - 3, 3, d, chunkBB); + placeBlock(level, Tile::torch_Id, 0, 2, 3, d, chunkBB); + placeBlock(level, Tile::torch_Id, 0, width - 3, 3, d, chunkBB); - if (isTall) + if (isTall) { - generateBox(level, chunkBB, bookLeft, 6, d, bookLeft, 9, d, Tile::wood_Id, Tile::wood_Id, false); - generateBox(level, chunkBB, bookRight, 6, d, bookRight, 9, d, Tile::wood_Id, Tile::wood_Id, false); - } - } + generateBox(level, chunkBB, bookLeft, 6, d, bookLeft, 9, d, Tile::wood_Id, Tile::wood_Id, false); + generateBox(level, chunkBB, bookRight, 6, d, bookRight, 9, d, Tile::wood_Id, Tile::wood_Id, false); + } + } else { - generateBox(level, chunkBB, bookLeft, 1, d, bookLeft, 4, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); - generateBox(level, chunkBB, bookRight, 1, d, bookRight, 4, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); + generateBox(level, chunkBB, bookLeft, 1, d, bookLeft, 4, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); + generateBox(level, chunkBB, bookRight, 1, d, bookRight, 4, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); - if (isTall) + if (isTall) { - generateBox(level, chunkBB, bookLeft, 6, d, bookLeft, 9, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); - generateBox(level, chunkBB, bookRight, 6, d, bookRight, 9, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); - } - } - } - - // place book shelves - for (int d = 3; d < depth - 3; d += 2) - { - generateBox(level, chunkBB, 3, 1, d, 4, 3, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); - generateBox(level, chunkBB, 6, 1, d, 7, 3, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); - generateBox(level, chunkBB, 9, 1, d, 10, 3, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); - } - - if (isTall) - { - // create balcony - generateBox(level, chunkBB, 1, 5, 1, 3, 5, depth - 2, Tile::wood_Id, Tile::wood_Id, false); - generateBox(level, chunkBB, width - 4, 5, 1, width - 2, 5, depth - 2, Tile::wood_Id, Tile::wood_Id, false); - generateBox(level, chunkBB, 4, 5, 1, width - 5, 5, 2, Tile::wood_Id, Tile::wood_Id, false); - generateBox(level, chunkBB, 4, 5, depth - 3, width - 5, 5, depth - 2, Tile::wood_Id, Tile::wood_Id, false); - - placeBlock(level, Tile::wood_Id, 0, width - 5, 5, depth - 4, chunkBB); - placeBlock(level, Tile::wood_Id, 0, width - 6, 5, depth - 4, chunkBB); - placeBlock(level, Tile::wood_Id, 0, width - 5, 5, depth - 5, chunkBB); - - // balcony fences - generateBox(level, chunkBB, 3, 6, 2, 3, 6, depth - 3, Tile::fence_Id, Tile::fence_Id, false); - generateBox(level, chunkBB, width - 4, 6, 2, width - 4, 6, depth - 5, Tile::fence_Id, Tile::fence_Id, false); - generateBox(level, chunkBB, 4, 6, 2, width - 5, 6, 2, Tile::fence_Id, Tile::fence_Id, false); - generateBox(level, chunkBB, 4, 6, depth - 3, 8, 6, depth - 3, Tile::fence_Id, Tile::fence_Id, false); - placeBlock(level, Tile::fence_Id, 0, width - 5, 6, depth - 4, chunkBB); - placeBlock(level, Tile::fence_Id, 0, width - 6, 6, depth - 4, chunkBB); - placeBlock(level, Tile::fence_Id, 0, width - 5, 6, depth - 5, chunkBB); - - // ladder - int orientationData = getOrientationData(Tile::ladder_Id, 3); - placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 1, depth - 2, chunkBB); - placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 2, depth - 2, chunkBB); - placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 3, depth - 2, chunkBB); - placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 4, depth - 2, chunkBB); - placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 5, depth - 2, chunkBB); - placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 6, depth - 2, chunkBB); - placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 7, depth - 2, chunkBB); - - // chandelier - int x = width / 2; - int z = depth / 2; - placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 2, z, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 2, z, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 3, z, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 3, z, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 4, z, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 4, z, chunkBB); - - placeBlock(level, Tile::fence_Id, 0, x - 2, tallHeight - 4, z, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x + 1, tallHeight - 4, z, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 4, z - 1, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 4, z + 1, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 4, z - 1, chunkBB); - placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 4, z + 1, chunkBB); - - placeBlock(level, Tile::torch_Id, 0, x - 2, tallHeight - 3, z, chunkBB); - placeBlock(level, Tile::torch_Id, 0, x + 1, tallHeight - 3, z, chunkBB); - placeBlock(level, Tile::torch_Id, 0, x - 1, tallHeight - 3, z - 1, chunkBB); - placeBlock(level, Tile::torch_Id, 0, x - 1, tallHeight - 3, z + 1, chunkBB); - placeBlock(level, Tile::torch_Id, 0, x, tallHeight - 3, z - 1, chunkBB); - placeBlock(level, Tile::torch_Id, 0, x, tallHeight - 3, z + 1, chunkBB); - } - - // place chests - createChest(level, chunkBB, random, 3, 3, 5, WeighedTreasure::addToTreasure(WeighedTreasureArray(libraryTreasureItems,LIBRARY_TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random, 1, 5, 2)), 1 + random->nextInt(4)); - if (isTall) - { - placeBlock(level, 0, 0, width - 2, tallHeight - 2, 1, chunkBB); - createChest(level, chunkBB, random, width - 2, tallHeight - 3, 1, WeighedTreasure::addToTreasure(WeighedTreasureArray(libraryTreasureItems,LIBRARY_TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random, 1, 5, 2)), 1 + random->nextInt(4)); - } - - return true; - -} - -StrongholdPieces::FiveCrossing::FiveCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth), entryDoor(randomSmallDoor(random)) -{ - orientation = direction; - boundingBox = stairsBox; - - leftLow = random->nextBoolean(); - leftHigh = random->nextBoolean(); - rightLow = random->nextBoolean(); - rightHigh = random->nextInt(3) > 0; + generateBox(level, chunkBB, bookLeft, 6, d, bookLeft, 9, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); + generateBox(level, chunkBB, bookRight, 6, d, bookRight, 9, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); + } + } + } + + // place book shelves + for (int d = 3; d < depth - 3; d += 2) + { + generateBox(level, chunkBB, 3, 1, d, 4, 3, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); + generateBox(level, chunkBB, 6, 1, d, 7, 3, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); + generateBox(level, chunkBB, 9, 1, d, 10, 3, d, Tile::bookshelf_Id, Tile::bookshelf_Id, false); + } + + if (isTall) + { + // create balcony + generateBox(level, chunkBB, 1, 5, 1, 3, 5, depth - 2, Tile::wood_Id, Tile::wood_Id, false); + generateBox(level, chunkBB, width - 4, 5, 1, width - 2, 5, depth - 2, Tile::wood_Id, Tile::wood_Id, false); + generateBox(level, chunkBB, 4, 5, 1, width - 5, 5, 2, Tile::wood_Id, Tile::wood_Id, false); + generateBox(level, chunkBB, 4, 5, depth - 3, width - 5, 5, depth - 2, Tile::wood_Id, Tile::wood_Id, false); + + placeBlock(level, Tile::wood_Id, 0, width - 5, 5, depth - 4, chunkBB); + placeBlock(level, Tile::wood_Id, 0, width - 6, 5, depth - 4, chunkBB); + placeBlock(level, Tile::wood_Id, 0, width - 5, 5, depth - 5, chunkBB); + + // balcony fences + generateBox(level, chunkBB, 3, 6, 2, 3, 6, depth - 3, Tile::fence_Id, Tile::fence_Id, false); + generateBox(level, chunkBB, width - 4, 6, 2, width - 4, 6, depth - 5, Tile::fence_Id, Tile::fence_Id, false); + generateBox(level, chunkBB, 4, 6, 2, width - 5, 6, 2, Tile::fence_Id, Tile::fence_Id, false); + generateBox(level, chunkBB, 4, 6, depth - 3, 8, 6, depth - 3, Tile::fence_Id, Tile::fence_Id, false); + placeBlock(level, Tile::fence_Id, 0, width - 5, 6, depth - 4, chunkBB); + placeBlock(level, Tile::fence_Id, 0, width - 6, 6, depth - 4, chunkBB); + placeBlock(level, Tile::fence_Id, 0, width - 5, 6, depth - 5, chunkBB); + + // ladder + int orientationData = getOrientationData(Tile::ladder_Id, 3); + placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 1, depth - 2, chunkBB); + placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 2, depth - 2, chunkBB); + placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 3, depth - 2, chunkBB); + placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 4, depth - 2, chunkBB); + placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 5, depth - 2, chunkBB); + placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 6, depth - 2, chunkBB); + placeBlock(level, Tile::ladder_Id, orientationData, width - 4, 7, depth - 2, chunkBB); + + // chandelier + int x = width / 2; + int z = depth / 2; + placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 2, z, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 2, z, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 3, z, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 3, z, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 4, z, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 4, z, chunkBB); + + placeBlock(level, Tile::fence_Id, 0, x - 2, tallHeight - 4, z, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x + 1, tallHeight - 4, z, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 4, z - 1, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x - 1, tallHeight - 4, z + 1, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 4, z - 1, chunkBB); + placeBlock(level, Tile::fence_Id, 0, x, tallHeight - 4, z + 1, chunkBB); + + placeBlock(level, Tile::torch_Id, 0, x - 2, tallHeight - 3, z, chunkBB); + placeBlock(level, Tile::torch_Id, 0, x + 1, tallHeight - 3, z, chunkBB); + placeBlock(level, Tile::torch_Id, 0, x - 1, tallHeight - 3, z - 1, chunkBB); + placeBlock(level, Tile::torch_Id, 0, x - 1, tallHeight - 3, z + 1, chunkBB); + placeBlock(level, Tile::torch_Id, 0, x, tallHeight - 3, z - 1, chunkBB); + placeBlock(level, Tile::torch_Id, 0, x, tallHeight - 3, z + 1, chunkBB); + } + + // place chests + createChest(level, chunkBB, random, 3, 3, 5, WeighedTreasure::addToTreasure(WeighedTreasureArray(libraryTreasureItems,LIBRARY_TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random, 1, 5, 2)), 1 + random->nextInt(4)); + if (isTall) + { + placeBlock(level, 0, 0, width - 2, tallHeight - 2, 1, chunkBB); + createChest(level, chunkBB, random, width - 2, tallHeight - 3, 1, WeighedTreasure::addToTreasure(WeighedTreasureArray(libraryTreasureItems,LIBRARY_TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random, 1, 5, 2)), 1 + random->nextInt(4)); + } + + return true; + +} + +StrongholdPieces::FiveCrossing::FiveCrossing() +{ + leftLow = leftHigh = rightLow = rightHigh = false; + // for reflection +} + +StrongholdPieces::FiveCrossing::FiveCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StrongholdPiece(genDepth) +{ + entryDoor = randomSmallDoor(random); + orientation = direction; + boundingBox = stairsBox; + + leftLow = random->nextBoolean(); + leftHigh = random->nextBoolean(); + rightLow = random->nextBoolean(); + rightHigh = random->nextInt(3) > 0; +} + +void StrongholdPieces::FiveCrossing::addAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::addAdditonalSaveData(tag); + tag->putBoolean(L"leftLow", leftLow); + tag->putBoolean(L"leftHigh", leftHigh); + tag->putBoolean(L"rightLow", rightLow); + tag->putBoolean(L"rightHigh", rightHigh); +} + +void StrongholdPieces::FiveCrossing::readAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::readAdditonalSaveData(tag); + leftLow = tag->getBoolean(L"leftLow"); + leftHigh = tag->getBoolean(L"leftHigh"); + rightLow = tag->getBoolean(L"rightLow"); + rightHigh = tag->getBoolean(L"rightHigh"); } void StrongholdPieces::FiveCrossing::addChildren(StructurePiece *startPiece, list *pieces, Random *random) { - int zOffA = 3; - int zOffB = 5; - // compensate for weird negative-facing behaviour - if (orientation == Direction::WEST || orientation == Direction::NORTH) + int zOffA = 3; + int zOffB = 5; + // compensate for weird negative-facing behaviour + if (orientation == Direction::WEST || orientation == Direction::NORTH) { - zOffA = depth - 3 - zOffA; - zOffB = depth - 3 - zOffB; - } - + zOffA = depth - 3 - zOffA; + zOffB = depth - 3 - zOffB; + } + generateSmallDoorChildForward((StartPiece *) startPiece, pieces, random, 5, 1); - if (leftLow) generateSmallDoorChildLeft((StartPiece *) startPiece, pieces, random, zOffA, 1); - if (leftHigh) generateSmallDoorChildLeft((StartPiece *) startPiece, pieces, random, zOffB, 7); - if (rightLow) generateSmallDoorChildRight((StartPiece *) startPiece, pieces, random, zOffA, 1); - if (rightHigh) generateSmallDoorChildRight((StartPiece *) startPiece, pieces, random, zOffB, 7); + if (leftLow) generateSmallDoorChildLeft((StartPiece *) startPiece, pieces, random, zOffA, 1); + if (leftHigh) generateSmallDoorChildLeft((StartPiece *) startPiece, pieces, random, zOffB, 7); + if (rightLow) generateSmallDoorChildRight((StartPiece *) startPiece, pieces, random, zOffA, 1); + if (rightHigh) generateSmallDoorChildRight((StartPiece *) startPiece, pieces, random, zOffB, 7); } StrongholdPieces::FiveCrossing *StrongholdPieces::FiveCrossing::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -3, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -3, 0, width, height, depth, direction); StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new FiveCrossing(genDepth, random, box, direction); + return new FiveCrossing(genDepth, random, box, direction); } bool StrongholdPieces::FiveCrossing::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { - if (edgesLiquid(level, chunkBB)) + if (edgesLiquid(level, chunkBB)) { - return false; - } - - // bounding walls - generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); - // entry door - generateSmallDoor(level, random, chunkBB, entryDoor, 4, 3, 0); - - // exit openings - if (leftLow) generateBox(level, chunkBB, 0, 3, 1, 0, 5, 3, 0, 0, false); - if (rightLow) generateBox(level, chunkBB, 9, 3, 1, 9, 5, 3, 0, 0, false); - if (leftHigh) generateBox(level, chunkBB, 0, 5, 7, 0, 7, 9, 0, 0, false); - if (rightHigh) generateBox(level, chunkBB, 9, 5, 7, 9, 7, 9, 0, 0, false); - generateBox(level, chunkBB, 5, 1, 10, 7, 3, 10, 0, 0, false); - - // main floor - generateBox(level, chunkBB, 1, 2, 1, 8, 2, 6, false, random, (BlockSelector *)smoothStoneSelector); - // side walls - generateBox(level, chunkBB, 4, 1, 5, 4, 4, 9, false, random, (BlockSelector *)smoothStoneSelector); - generateBox(level, chunkBB, 8, 1, 5, 8, 4, 9, false, random, (BlockSelector *)smoothStoneSelector); - // upper floor - generateBox(level, chunkBB, 1, 4, 7, 3, 4, 9, false, random, (BlockSelector *)smoothStoneSelector); - - // left stairs - generateBox(level, chunkBB, 1, 3, 5, 3, 3, 6, false, random, (BlockSelector *)smoothStoneSelector); - generateBox(level, chunkBB, 1, 3, 4, 3, 3, 4, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); - generateBox(level, chunkBB, 1, 4, 6, 3, 4, 6, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); + return false; + } - // lower stairs - generateBox(level, chunkBB, 5, 1, 7, 7, 1, 8, false, random, (BlockSelector *)smoothStoneSelector); - generateBox(level, chunkBB, 5, 1, 9, 7, 1, 9, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); - generateBox(level, chunkBB, 5, 2, 7, 7, 2, 7, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); + // bounding walls + generateBox(level, chunkBB, 0, 0, 0, width - 1, height - 1, depth - 1, CHECK_AIR, random, (BlockSelector *)smoothStoneSelector); + // entry door + generateSmallDoor(level, random, chunkBB, entryDoor, 4, 3, 0); + + // exit openings + if (leftLow) generateBox(level, chunkBB, 0, 3, 1, 0, 5, 3, 0, 0, false); + if (rightLow) generateBox(level, chunkBB, 9, 3, 1, 9, 5, 3, 0, 0, false); + if (leftHigh) generateBox(level, chunkBB, 0, 5, 7, 0, 7, 9, 0, 0, false); + if (rightHigh) generateBox(level, chunkBB, 9, 5, 7, 9, 7, 9, 0, 0, false); + generateBox(level, chunkBB, 5, 1, 10, 7, 3, 10, 0, 0, false); + + // main floor + generateBox(level, chunkBB, 1, 2, 1, 8, 2, 6, false, random, (BlockSelector *)smoothStoneSelector); + // side walls + generateBox(level, chunkBB, 4, 1, 5, 4, 4, 9, false, random, (BlockSelector *)smoothStoneSelector); + generateBox(level, chunkBB, 8, 1, 5, 8, 4, 9, false, random, (BlockSelector *)smoothStoneSelector); + // upper floor + generateBox(level, chunkBB, 1, 4, 7, 3, 4, 9, false, random, (BlockSelector *)smoothStoneSelector); + + // left stairs + generateBox(level, chunkBB, 1, 3, 5, 3, 3, 6, false, random, (BlockSelector *)smoothStoneSelector); + generateBox(level, chunkBB, 1, 3, 4, 3, 3, 4, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); + generateBox(level, chunkBB, 1, 4, 6, 3, 4, 6, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); + + // lower stairs + generateBox(level, chunkBB, 5, 1, 7, 7, 1, 8, false, random, (BlockSelector *)smoothStoneSelector); + generateBox(level, chunkBB, 5, 1, 9, 7, 1, 9, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); + generateBox(level, chunkBB, 5, 2, 7, 7, 2, 7, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); + + // bridge + generateBox(level, chunkBB, 4, 5, 7, 4, 5, 9, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); + generateBox(level, chunkBB, 8, 5, 7, 8, 5, 9, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); + generateBox(level, chunkBB, 5, 5, 7, 7, 5, 9, Tile::stoneSlab_Id, Tile::stoneSlab_Id, false); + placeBlock(level, Tile::torch_Id, 0, 6, 5, 6, chunkBB); - // bridge - generateBox(level, chunkBB, 4, 5, 7, 4, 5, 9, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); - generateBox(level, chunkBB, 8, 5, 7, 8, 5, 9, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); - generateBox(level, chunkBB, 5, 5, 7, 7, 5, 9, Tile::stoneSlab_Id, Tile::stoneSlab_Id, false); - placeBlock(level, Tile::torch_Id, 0, 6, 5, 6, chunkBB); + return true; - return true; +} +StrongholdPieces::PortalRoom::PortalRoom() +{ + // for reflection } StrongholdPieces::PortalRoom::PortalRoom(int genDepth, Random *random, BoundingBox *box, int direction) : StrongholdPiece(genDepth) { hasPlacedMobSpawner = false; - orientation = direction; - boundingBox = box; + orientation = direction; + boundingBox = box; +} + +void StrongholdPieces::PortalRoom::addAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Mob", hasPlacedMobSpawner); +} + +void StrongholdPieces::PortalRoom::readAdditonalSaveData(CompoundTag *tag) +{ + StrongholdPiece::readAdditonalSaveData(tag); + hasPlacedMobSpawner = tag->getBoolean(L"Mob"); } void StrongholdPieces::PortalRoom::addChildren(StructurePiece *startPiece, list *pieces, Random *random) { - if (startPiece != NULL) + if (startPiece != NULL) { - ((StartPiece *) startPiece)->portalRoomPiece = this; - } + ((StartPiece *) startPiece)->portalRoomPiece = this; + } } StrongholdPieces::PortalRoom *StrongholdPieces::PortalRoom::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { - BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, height, depth, direction); + BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -4, -1, 0, width, height, depth, direction); // 4J Added so that we can check that Portals stay within the bounds of the world (which they ALWAYS should anyway) StartPiece *startPiece = NULL; if(pieces != NULL) startPiece = ((StrongholdPieces::StartPiece *) pieces->front()); - if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) + if (!isOkBox(box, startPiece) || StructurePiece::findCollisionPiece(pieces, box) != NULL) { delete box; - return NULL; - } + return NULL; + } - return new PortalRoom(genDepth, random, box, direction); + return new PortalRoom(genDepth, random, box, direction); } bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, BoundingBox *chunkBB) @@ -1406,15 +1624,15 @@ bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, Bou } // stair - int orientationData = getOrientationData(Tile::stairs_stoneBrickSmooth_Id, 3); + int orientationData = getOrientationData(Tile::stairs_stoneBrick_Id, 3); generateBox(level, chunkBB, 4, 1, 5, 6, 1, 7, false, random, (BlockSelector *)smoothStoneSelector); generateBox(level, chunkBB, 4, 2, 6, 6, 2, 7, false, random, (BlockSelector *)smoothStoneSelector); generateBox(level, chunkBB, 4, 3, 7, 6, 3, 7, false, random, (BlockSelector *)smoothStoneSelector); for (int x = 4; x <= 6; x++) { - placeBlock(level, Tile::stairs_stoneBrickSmooth_Id, orientationData, x, 1, 4, chunkBB); - placeBlock(level, Tile::stairs_stoneBrickSmooth_Id, orientationData, x, 2, 5, chunkBB); - placeBlock(level, Tile::stairs_stoneBrickSmooth_Id, orientationData, x, 3, 6, chunkBB); + placeBlock(level, Tile::stairs_stoneBrick_Id, orientationData, x, 1, 4, chunkBB); + placeBlock(level, Tile::stairs_stoneBrick_Id, orientationData, x, 2, 5, chunkBB); + placeBlock(level, Tile::stairs_stoneBrick_Id, orientationData, x, 3, 6, chunkBB); } int north = Direction::NORTH; @@ -1425,25 +1643,25 @@ bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, Bou switch (orientation) { case Direction::SOUTH: - north = Direction::SOUTH; - south = Direction::NORTH; - break; + north = Direction::SOUTH; + south = Direction::NORTH; + break; case Direction::EAST: - north = Direction::EAST; - south = Direction::WEST; - east = Direction::SOUTH; - west = Direction::NORTH; - break; + north = Direction::EAST; + south = Direction::WEST; + east = Direction::SOUTH; + west = Direction::NORTH; + break; case Direction::WEST: - north = Direction::WEST; - south = Direction::EAST; - east = Direction::SOUTH; - west = Direction::NORTH; - break; + north = Direction::WEST; + south = Direction::EAST; + east = Direction::SOUTH; + west = Direction::NORTH; + break; } // 4J-PB - Removed for Christmas update since we don't have The End - + // 4J-PB - not going to remove it, so that maps generated will have it in, but it can't be activated placeBlock(level, Tile::endPortalFrameTile_Id, north + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 4, 3, 8, chunkBB); placeBlock(level, Tile::endPortalFrameTile_Id, north + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 5, 3, 8, chunkBB); @@ -1457,7 +1675,7 @@ bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, Bou placeBlock(level, Tile::endPortalFrameTile_Id, west + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 7, 3, 9, chunkBB); placeBlock(level, Tile::endPortalFrameTile_Id, west + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 7, 3, 10, chunkBB); placeBlock(level, Tile::endPortalFrameTile_Id, west + ((random->nextFloat() > 0.9f) ? TheEndPortalFrameTile::EYE_BIT : 0), 7, 3, 11, chunkBB); - + if (!hasPlacedMobSpawner) { @@ -1472,9 +1690,9 @@ bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, Bou level->getLevelData()->setHasStrongholdEndPortal(); hasPlacedMobSpawner = true; - level->setTile(x, y, z, Tile::mobSpawner_Id); + level->setTileAndData(x, y, z, Tile::mobSpawner_Id, 0, Tile::UPDATE_CLIENTS); shared_ptr entity = dynamic_pointer_cast(level->getTileEntity(x, y, z)); - if (entity != NULL) entity->setEntityId(L"Silverfish"); + if (entity != NULL) entity->getSpawner()->setEntityId(L"Silverfish"); } } @@ -1484,34 +1702,34 @@ bool StrongholdPieces::PortalRoom::postProcess(Level *level, Random *random, Bou void StrongholdPieces::SmoothStoneSelector::next(Random *random, int worldX, int worldY, int worldZ, bool isEdge) { - if (isEdge) + if (isEdge) { - nextId = Tile::stoneBrickSmooth_Id; + nextId = Tile::stoneBrick_Id; - float selection = random->nextFloat(); - if (selection < 0.2f) + float selection = random->nextFloat(); + if (selection < 0.2f) { - nextData = SmoothStoneBrickTile::TYPE_CRACKED; - } + nextData = SmoothStoneBrickTile::TYPE_CRACKED; + } else if (selection < 0.5f) { - nextData = SmoothStoneBrickTile::TYPE_MOSSY; - } + nextData = SmoothStoneBrickTile::TYPE_MOSSY; + } else if (selection < 0.55f) { - nextId = Tile::monsterStoneEgg_Id; - nextData = StoneMonsterTile::HOST_STONEBRICK; - } + nextId = Tile::monsterStoneEgg_Id; + nextData = StoneMonsterTile::HOST_STONEBRICK; + } else { - nextData = 0; - } - } + nextData = 0; + } + } else { - nextId = 0; - nextData = 0; - } + nextId = 0; + nextData = 0; + } } const StrongholdPieces::SmoothStoneSelector *StrongholdPieces::smoothStoneSelector = new SmoothStoneSelector(); diff --git a/Minecraft.World/StrongholdPieces.h b/Minecraft.World/StrongholdPieces.h index c9751bae..2b15f3c2 100644 --- a/Minecraft.World/StrongholdPieces.h +++ b/Minecraft.World/StrongholdPieces.h @@ -6,11 +6,11 @@ class StrongholdPieces private: static const int SMALL_DOOR_WIDTH = 3; - static const int SMALL_DOOR_HEIGHT = 3; + static const int SMALL_DOOR_HEIGHT = 3; - static const int MAX_DEPTH = 50; - // the dungeon starts at 64 and traverses downwards to this point - static const int LOWEST_Y_POSITION = 10; + static const int MAX_DEPTH = 50; + // the dungeon starts at 64 and traverses downwards to this point + static const int LOWEST_Y_POSITION = 10; static const bool CHECK_AIR; // 4J - added to replace use of Class within this class @@ -30,6 +30,11 @@ private: EPieceClass_PortalRoom }; +public: + static void loadStatic(); + + +private: class PieceWeight { public: @@ -37,11 +42,11 @@ private: const int weight; int placeCount; int maxPlaceCount; - + PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount); virtual bool doPlace(int depth); bool isValid(); - }; + }; // 4J - added, java uses a local specialisation of these classes when instancing to achieve the same thing class PieceWeight_Library : public PieceWeight @@ -58,9 +63,9 @@ private: virtual bool doPlace(int depth) { return PieceWeight::doPlace(depth) && depth > 5; } }; - static list currentPieces; + static list currentPieces; static EPieceClass imposedPiece; - static int totalWeight; + static int totalWeight; public: static void resetPieces(); @@ -73,202 +78,268 @@ private: static StructurePiece *generateAndAddPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); - /** - * - * - */ + /** + * + * + */ private: class StrongholdPiece : public StructurePiece { + protected: + enum SmallDoorType + { + OPENING, WOOD_DOOR, GRATES, IRON_DOOR, + }; + + SmallDoorType entryDoor; + + public: + StrongholdPiece(); protected: StrongholdPiece(int genDepth); - enum SmallDoorType - { - OPENING, WOOD_DOOR, GRATES, IRON_DOOR, - }; + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); void generateSmallDoor(Level *level, Random *random, BoundingBox *chunkBB, SmallDoorType doorType, int footX, int footY, int footZ); SmallDoorType randomSmallDoor(Random *random); StructurePiece *generateSmallDoorChildForward(StartPiece *startPiece, list *pieces, Random *random, int xOff, int yOff); StructurePiece *generateSmallDoorChildLeft(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff); StructurePiece *generateSmallDoorChildRight(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff); - + static bool isOkBox(BoundingBox *box, StartPiece *startRoom); // 4J added startRoom param - }; + }; - /** - * Corridor pieces that connects unconnected ends. - * - */ + /** + * Corridor pieces that connects unconnected ends. + * + */ public: class FillerCorridor : public StrongholdPiece { + public: + static StructurePiece *Create() { return new FillerCorridor(); } + virtual EStructurePiece GetType() { return eStructurePiece_FillerCorridor; } + private: - const int steps; + int steps; public: + FillerCorridor(); FillerCorridor(int genDepth, Random *random, BoundingBox *corridorBox, int direction); - static BoundingBox *findPieceBox(list *pieces, Random *random, int footX, int footY, int footZ, int direction); + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + static BoundingBox *findPieceBox(list *pieces, Random *random, int footX, int footY, int footZ, int direction); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; - /** - * - * - */ + /** + * + * + */ public: class StairsDown : public StrongholdPiece { + public: + static StructurePiece *Create() { return new StairsDown(); } + virtual EStructurePiece GetType() { return eStructurePiece_StairsDown; } + private: static const int width = 5; static const int height = 11; static const int depth = 5; - - const bool isSource; - const SmallDoorType entryDoor; + + bool isSource; public: + StairsDown(); StairsDown(int genDepth, Random *random, int west, int north); StairsDown(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static StairsDown *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static StairsDown *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; public: class PortalRoom; class StartPiece : public StairsDown { + public: + virtual EStructurePiece GetType() { return eStructurePiece_StrongholdStartPiece; } + public: bool isLibraryAdded; - PieceWeight *previousPiece; + PieceWeight *previousPiece; PortalRoom *portalRoomPiece; Level *m_level; // 4J added - // this queue is used so that the addChildren calls are - // called in a random order - vector pendingChildren; + // this queue is used so that the addChildren calls are + // called in a random order + vector pendingChildren; - StartPiece(int genDepth, Random *random, int west, int north, Level *level); // 4J Added level param + StartPiece(); + StartPiece(int genDepth, Random *random, int west, int north, Level *level); // 4J Added level param virtual TilePos *getLocatorPosition(); - }; + }; - /** - * - * - */ + /** + * + * + */ public: class Straight : public StrongholdPiece { + public: + static StructurePiece *Create() { return new Straight(); } + virtual EStructurePiece GetType() { return eStructurePiece_Straight; } + private: static const int width = 5; static const int height = 5; static const int depth = 7; - const SmallDoorType entryDoor; - const bool leftChild; - const bool rightChild; + bool leftChild; + bool rightChild; public: + Straight(); Straight(int genDepth, Random *random, BoundingBox *stairsBox, int direction); + + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); static Straight *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; - /** - * - * - */ + /** + * + * + */ - class ChestCorridor : public StrongholdPiece + class ChestCorridor : public StrongholdPiece { + public: + static StructurePiece *Create() { return new ChestCorridor(); } + virtual EStructurePiece GetType() { return eStructurePiece_ChestCorridor; } + private: static const int width = 5; - static const int height = 5; - static const int depth = 7; - static const int TREASURE_ITEMS_COUNT = 14; + static const int height = 5; + static const int depth = 7; + static const int TREASURE_ITEMS_COUNT = 18; static WeighedTreasure *treasureItems[TREASURE_ITEMS_COUNT]; - const SmallDoorType entryDoor; - boolean hasPlacedChest; + bool hasPlacedChest; public: + ChestCorridor(); ChestCorridor(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static ChestCorridor *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - - /** - * - * - */ + + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static ChestCorridor *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ public: class StraightStairsDown : public StrongholdPiece { + public: + static StructurePiece *Create() { return new StraightStairsDown(); } + virtual EStructurePiece GetType() { return eStructurePiece_StraightStairsDown; } + private: static const int width = 5; static const int height = 11; static const int depth = 8; - const SmallDoorType entryDoor; - public: + StraightStairsDown(); StraightStairsDown(int genDepth, Random *random, BoundingBox *stairsBox, int direction); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); static StraightStairsDown *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; - /** - * - * - */ + /** + * + * + */ public: class LeftTurn : public StrongholdPiece { + public: + static StructurePiece *Create() { return new LeftTurn(); } + virtual EStructurePiece GetType() { return eStructurePiece_LeftTurn; } + protected: static const int width = 5; static const int height = 5; static const int depth = 5; - const SmallDoorType entryDoor; - public: + LeftTurn(); LeftTurn(int genDepth, Random *random, BoundingBox *stairsBox, int direction); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); static LeftTurn *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; - /** - * - * - */ + /** + * + * + */ public: class RightTurn : public LeftTurn { public: + static StructurePiece *Create() { return new RightTurn(); } + virtual EStructurePiece GetType() { return eStructurePiece_RightTurn; } + + public: + RightTurn(); RightTurn(int genDepth, Random *random, BoundingBox *stairsBox, int direction); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); }; - /** - * - * - */ + /** + * + * + */ public: class RoomCrossing : public StrongholdPiece { + public: + static StructurePiece *Create() { return new RoomCrossing(); } + virtual EStructurePiece GetType() { return eStructurePiece_StrongholdRoomCrossing; } + private: static const int SMALL_TREASURE_ITEMS_COUNT = 7; // 4J added static WeighedTreasure *smallTreasureItems[SMALL_TREASURE_ITEMS_COUNT]; @@ -279,43 +350,57 @@ public: static const int depth = 11; protected: - const SmallDoorType entryDoor; - const int type; + int type; + public: + RoomCrossing(); RoomCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static RoomCrossing *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - - /** - * - * - */ + + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static RoomCrossing *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; + + /** + * + * + */ public: class PrisonHall : public StrongholdPiece { + public: + static StructurePiece *Create() { return new PrisonHall(); } + virtual EStructurePiece GetType() { return eStructurePiece_PrisonHall; } + protected: static const int width = 9; static const int height = 5; static const int depth = 11; - const SmallDoorType entryDoor; - public: + PrisonHall(); PrisonHall(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); static PrisonHall *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; - /** - * - * - */ + /** + * + * + */ public: class Library : public StrongholdPiece { + public: + static StructurePiece *Create() { return new Library(); } + virtual EStructurePiece GetType() { return eStructurePiece_Library; } + private: static const int LIBRARY_TREASURE_ITEMS_COUNT = 4; // 4J added static WeighedTreasure *libraryTreasureItems[LIBRARY_TREASURE_ITEMS_COUNT]; @@ -326,62 +411,88 @@ public: static const int tallHeight = 11; static const int depth = 15; - const SmallDoorType entryDoor; private: - const bool isTall; + bool isTall; public: + Library(); Library(int genDepth, Random *random, BoundingBox *roomBox, int direction); - static Library *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + static Library *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + + }; - /** - * - * - */ + /** + * + * + */ public: class FiveCrossing : public StrongholdPiece { + public: + static StructurePiece *Create() { return new FiveCrossing(); } + virtual EStructurePiece GetType() { return eStructurePiece_FiveCrossing; } + protected: static const int width = 10; - static const int height = 9; - static const int depth = 11; - - const SmallDoorType entryDoor; + static const int height = 9; + static const int depth = 11; private: bool leftLow, leftHigh, rightLow, rightHigh; public: + FiveCrossing(); FiveCrossing(int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - static FiveCrossing *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; - /** - * - * - */ + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + static FiveCrossing *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; - class PortalRoom : public StrongholdPiece + /** + * + * + */ + + class PortalRoom : public StrongholdPiece { + public: + static StructurePiece *Create() { return new PortalRoom(); } + virtual EStructurePiece GetType() { return eStructurePiece_PortalRoom; } + protected: static const int width = 11; - static const int height = 8; - static const int depth = 16; + static const int height = 8; + static const int depth = 16; private: bool hasPlacedMobSpawner; public: + PortalRoom(); PortalRoom(int genDepth, Random *random, BoundingBox *stairsBox, int direction); + + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: void addChildren(StructurePiece *startPiece, list *pieces, Random *random); static PortalRoom *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; private: @@ -389,7 +500,7 @@ private: { public: virtual void next(Random *random, int worldX, int worldY, int worldZ, bool isEdge); - }; + }; - static const SmoothStoneSelector *smoothStoneSelector; + static const SmoothStoneSelector *smoothStoneSelector; }; diff --git a/Minecraft.World/StructureFeature.cpp b/Minecraft.World/StructureFeature.cpp index 5e8489f0..41ee5c81 100644 --- a/Minecraft.World/StructureFeature.cpp +++ b/Minecraft.World/StructureFeature.cpp @@ -7,6 +7,13 @@ #include "net.minecraft.world.level.h" #include "LevelData.h" +StructureFeature::StructureFeature() +{ +#ifdef ENABLE_STRUCTURE_SAVING + savedData = nullptr; +#endif +} + StructureFeature::~StructureFeature() { for( AUTO_VAR(it, cachedStructures.begin()); it != cachedStructures.end(); it++ ) @@ -17,82 +24,95 @@ StructureFeature::~StructureFeature() void StructureFeature::addFeature(Level *level, int x, int z, int xOffs, int zOffs, byteArray blocks) { - // this method is called for each chunk within 8 chunk's distance from - // the chunk being generated, but not all chunks are the sources of - // structures + // this method is called for each chunk within 8 chunk's distance from + // the chunk being generated, but not all chunks are the sources of + // structures + + restoreSavedData(level); if (cachedStructures.find(ChunkPos::hashCode(x, z)) != cachedStructures.end()) { - return; - } + return; + } - // clear random key - random->nextInt(); + // clear random key + random->nextInt(); // 4J-PB - want to know if it's a superflat land, so we don't generate so many villages - we've changed the distance required between villages on the xbox - if (isFeatureChunk(x, z,level->getLevelData()->getGenerator() == LevelType::lvl_flat)) + if (isFeatureChunk(x, z,level->getLevelData()->getGenerator() == LevelType::lvl_flat)) { - StructureStart *start = createStructureStart(x, z); - cachedStructures[ChunkPos::hashCode(x, z)] = start; - } + StructureStart *start = createStructureStart(x, z); + cachedStructures[ChunkPos::hashCode(x, z)] = start; + saveFeature(x, z, start); + } } bool StructureFeature::postProcess(Level *level, Random *random, int chunkX, int chunkZ) { + restoreSavedData(level); + // 4J Stu - The x and z used to be offset by (+8) here, but that means we can miss out half structures on the edge of the world // Normal feature generation offsets generation by half a chunk to ensure that it can generate the entire feature in chunks already created // Structure features don't need this, as the PlaceBlock function only places blocks inside the BoundingBox specified, and parts // of a struture piece can be added in more than one post-process call - int cx = (chunkX << 4); // + 8; - int cz = (chunkZ << 4); // + 8; + int cx = (chunkX << 4); // + 8; + int cz = (chunkZ << 4); // + 8; - bool intersection = false; + bool intersection = false; for( AUTO_VAR(it, cachedStructures.begin()); it != cachedStructures.end(); it++ ) { StructureStart *structureStart = it->second; - if (structureStart->isValid()) + if (structureStart->isValid()) { - if (structureStart->getBoundingBox()->intersects(cx, cz, cx + 15, cz + 15)) + if (structureStart->getBoundingBox()->intersects(cx, cz, cx + 15, cz + 15)) { BoundingBox *bb = new BoundingBox(cx, cz, cx + 15, cz + 15); - structureStart->postProcess(level, random, bb); + structureStart->postProcess(level, random, bb); delete bb; - intersection = true; - } - } - } + intersection = true; - return intersection; + // because some feature pieces are modified in the postProcess step, we need to save them again + saveFeature(structureStart->getChunkX(), structureStart->getChunkZ(), structureStart); + } + } + } + + return intersection; } bool StructureFeature::isIntersection(int cellX, int cellZ) { + restoreSavedData(level); + for( AUTO_VAR(it, cachedStructures.begin()); it != cachedStructures.end(); it++ ) { StructureStart *structureStart = it->second; - if (structureStart->isValid()) + if (structureStart->isValid()) { - if (structureStart->getBoundingBox()->intersects(cellX, cellZ, cellX, cellZ)) + if (structureStart->getBoundingBox()->intersects(cellX, cellZ, cellX, cellZ)) { AUTO_VAR(it2, structureStart->getPieces()->begin()); while( it2 != structureStart->getPieces()->end() ) { - StructurePiece *next = *it2++; - if (next->getBoundingBox()->intersects(cellX, cellZ, cellX, cellZ)) + StructurePiece *next = *it2++; + if (next->getBoundingBox()->intersects(cellX, cellZ, cellX, cellZ)) { - return true; - } - } - } - } - } - return false; + return true; + } + } + } + } + } + return false; } -/////////////////////////////////////////// -// 4J-PB - Below functions added from 1.2.3 -/////////////////////////////////////////// bool StructureFeature::isInsideFeature(int cellX, int cellY, int cellZ) +{ + restoreSavedData(level); + return getStructureAt(cellX, cellY, cellZ) != NULL; +} + +StructureStart *StructureFeature::getStructureAt(int cellX, int cellY, int cellZ) { //for (StructureStart structureStart : cachedStructures.values()) for(AUTO_VAR(it, cachedStructures.begin()); it != cachedStructures.end(); ++it) @@ -118,22 +138,38 @@ bool StructureFeature::isInsideFeature(int cellX, int cellY, int cellZ) StructurePiece* piece = *it2; if ( piece->getBoundingBox()->isInside(cellX, cellY, cellZ) ) { - return true; + return pStructureStart; } } } } } + return NULL; +} + +bool StructureFeature::isInsideBoundingFeature(int cellX, int cellY, int cellZ) +{ + restoreSavedData(level); + + for(AUTO_VAR(it, cachedStructures.begin()); it != cachedStructures.end(); ++it) + { + StructureStart *structureStart = it->second; + if (structureStart->isValid()) + { + return (structureStart->getBoundingBox()->intersects(cellX, cellZ, cellX, cellZ)); + } + } return false; } TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, int cellY, int cellZ) { - // this is a hack that will "force" the feature to generate positions // even if the player hasn't generated new chunks yet this->level = level; + restoreSavedData(level); + random->setSeed(level->getSeed()); __int64 xScale = random->nextLong(); __int64 zScale = random->nextLong(); @@ -160,7 +196,7 @@ TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, i int dx = locatorPosition->x - cellX; int dy = locatorPosition->y - cellY; int dz = locatorPosition->z - cellZ; - double dist = dx + dx * dy * dy + dz * dz; + double dist = dx * dx + dy * dy + dz * dz; if (dist < minDistance) { @@ -178,14 +214,14 @@ TilePos *StructureFeature::getNearestGeneratedFeature(Level *level, int cellX, i vector *guesstimatedFeaturePositions = getGuesstimatedFeaturePositions(); if (guesstimatedFeaturePositions != NULL) { - TilePos *pSelectedPos = new TilePos(0,0,0); + TilePos *pSelectedPos = new TilePos(0,0,0); for(AUTO_VAR(it, guesstimatedFeaturePositions->begin()); it != guesstimatedFeaturePositions->end(); ++it) { int dx = (*it).x - cellX; int dy = (*it).y - cellY; int dz = (*it).z - cellZ; - double dist = dx + dx * dy * dy + dz * dz; + double dist = dx * dx + dy * dy + dz * dz; if (dist < minDistance) { @@ -206,3 +242,52 @@ vector *StructureFeature::getGuesstimatedFeaturePositions() { return NULL; } + +void StructureFeature::restoreSavedData(Level *level) +{ +#ifdef ENABLE_STRUCTURE_SAVING + if (savedData == NULL) + { + savedData = dynamic_pointer_cast( level->getSavedData(typeid(StructureFeatureSavedData), getFeatureName()) ); + + if (savedData == NULL) + { + savedData = shared_ptr( new StructureFeatureSavedData(getFeatureName()) ); + level->setSavedData(getFeatureName(), savedData); + } + else + { + CompoundTag *fullTag = savedData->getFullTag(); + + vector *allTags = fullTag->getAllTags(); + for (AUTO_VAR(it,allTags->begin()); it != allTags->end(); ++it) + { + Tag *featureTag = *it; + if (featureTag->getId() == Tag::TAG_Compound) + { + CompoundTag *ct = (CompoundTag *) featureTag; + + if (ct->contains(L"ChunkX") && ct->contains(L"ChunkZ")) + { + int cx = ct->getInt(L"ChunkX"); + int cz = ct->getInt(L"ChunkZ"); + + StructureStart *start = StructureFeatureIO::loadStaticStart(ct, level); + // System.out.println("Loaded " + start.getClass().getSimpleName() + " from file"); + cachedStructures[ChunkPos::hashCode(cx, cz)] = start; + } + } + } + delete allTags; + } + } +#endif +} + +void StructureFeature::saveFeature(int chunkX, int chunkZ, StructureStart *feature) +{ +#ifdef ENABLE_STRUCTURE_SAVING + savedData->putFeatureTag(feature->createTag(chunkX, chunkZ), chunkX, chunkZ); + savedData->setDirty(); +#endif +} diff --git a/Minecraft.World/StructureFeature.h b/Minecraft.World/StructureFeature.h index 642e6aad..ace5593d 100644 --- a/Minecraft.World/StructureFeature.h +++ b/Minecraft.World/StructureFeature.h @@ -1,7 +1,11 @@ #pragma once #include "LargeFeature.h" +#include "StructureFeatureSavedData.h" + class StructureStart; +//#define ENABLE_STRUCTURE_SAVING + class StructureFeature : public LargeFeature { public: @@ -15,44 +19,64 @@ public: eFeature_Village, }; +#ifdef ENABLE_STRUCTURE_SAVING +private: + shared_ptr savedData; +#endif + + protected: unordered_map<__int64, StructureStart *> cachedStructures; public: + StructureFeature(); ~StructureFeature(); + virtual wstring getFeatureName() = 0; + virtual void addFeature(Level *level, int x, int z, int xOffs, int zOffs, byteArray blocks); - bool postProcess(Level *level, Random *random, int chunkX, int chunkZ); - bool isIntersection(int cellX, int cellZ); + bool postProcess(Level *level, Random *random, int chunkX, int chunkZ); + bool isIntersection(int cellX, int cellZ); bool isInsideFeature(int cellX, int cellY, int cellZ); + +protected: + StructureStart *getStructureAt(int cellX, int cellY, int cellZ); + +public: + bool isInsideBoundingFeature(int cellX, int cellY, int cellZ); TilePos *getNearestGeneratedFeature(Level *level, int cellX, int cellY, int cellZ); + protected: vector *getGuesstimatedFeaturePositions(); - /** - * Returns true if the given chunk coordinates should hold a structure - * source. - * - * @param x - * chunk x - * @param z - * chunk z - * @return - */ +private: + virtual void restoreSavedData(Level *level); + virtual void saveFeature(int chunkX, int chunkZ, StructureStart *feature); + + /** + * Returns true if the given chunk coordinates should hold a structure + * source. + * + * @param x + * chunk x + * @param z + * chunk z + * @return + */ protected: virtual bool isFeatureChunk(int x, int z, bool bIsSuperflat=false) = 0; - /** - * Creates a new instance of a structure source at the given chunk - * coordinates. - * - * @param x - * chunk x - * @param z - * chunk z - * @return - */ - virtual StructureStart *createStructureStart(int x, int z) = 0; + /** + * Creates a new instance of a structure source at the given chunk + * coordinates. + * + * @param x + * chunk x + * @param z + * chunk z + * @return + */ + virtual StructureStart *createStructureStart(int x, int z) = 0; }; diff --git a/Minecraft.World/StructureFeatureIO.cpp b/Minecraft.World/StructureFeatureIO.cpp new file mode 100644 index 00000000..d910cf3d --- /dev/null +++ b/Minecraft.World/StructureFeatureIO.cpp @@ -0,0 +1,104 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "StructureFeatureIO.h" + +unordered_map StructureFeatureIO::startIdClassMap; +unordered_map StructureFeatureIO::startClassIdMap; + +unordered_map StructureFeatureIO::pieceIdClassMap; +unordered_map StructureFeatureIO::pieceClassIdMap; + +void StructureFeatureIO::setStartId(EStructureStart clas, structureStartCreateFn createFn, const wstring &id) +{ + startIdClassMap[id] = createFn; + startClassIdMap[clas] = id; +} + +void StructureFeatureIO::setPieceId(EStructurePiece clas, structurePieceCreateFn createFn, const wstring &id) +{ + pieceIdClassMap[id] = createFn; + pieceClassIdMap[clas] = id; +} + +void StructureFeatureIO::staticCtor() +{ + setStartId(eStructureStart_MineShaftStart, MineShaftStart::Create, L"Mineshaft"); + setStartId(eStructureStart_VillageStart, VillageFeature::VillageStart::Create, L"Village"); + setStartId(eStructureStart_NetherBridgeStart, NetherBridgeFeature::NetherBridgeStart::Create, L"Fortress"); + setStartId(eStructureStart_StrongholdStart, StrongholdFeature::StrongholdStart::Create, L"Stronghold"); + setStartId(eStructureStart_ScatteredFeatureStart, RandomScatteredLargeFeature::ScatteredFeatureStart::Create, L"Temple"); + + MineShaftPieces::loadStatic(); + VillagePieces::loadStatic(); + NetherBridgePieces::loadStatic(); + StrongholdPieces::loadStatic(); + ScatteredFeaturePieces::loadStatic(); +} + +wstring StructureFeatureIO::getEncodeId(StructureStart *start) +{ + AUTO_VAR(it, startClassIdMap.find( start->GetType() ) ); + if(it != startClassIdMap.end()) + { + return it->second; + } + else + { + return L""; + } +} + +wstring StructureFeatureIO::getEncodeId(StructurePiece *piece) +{ + AUTO_VAR(it, pieceClassIdMap.find( piece->GetType() ) ); + if(it != pieceClassIdMap.end()) + { + return it->second; + } + else + { + return L""; + } +} + +StructureStart *StructureFeatureIO::loadStaticStart(CompoundTag *tag, Level *level) +{ + StructureStart *start = NULL; + + AUTO_VAR(it, startIdClassMap.find( tag->getString(L"id") ) ); + if(it != startIdClassMap.end()) + { + start = (it->second)(); + } + + if (start != NULL) + { + start->load(level, tag); + } + else + { + app.DebugPrintf( "Skipping Structure with id %ls", tag->getString(L"id").c_str() ); + } + return start; +} + +StructurePiece *StructureFeatureIO::loadStaticPiece(CompoundTag *tag, Level *level) +{ + StructurePiece *piece = NULL; + + AUTO_VAR(it, pieceIdClassMap.find( tag->getString(L"id") ) ); + if(it != pieceIdClassMap.end()) + { + piece = (it->second)(); + } + + if (piece != NULL) + { + piece->load(level, tag); + } + else + { + app.DebugPrintf( "Skipping Piece with id %ls", tag->getString(L"id").c_str() ); + } + return piece; +} \ No newline at end of file diff --git a/Minecraft.World/StructureFeatureIO.h b/Minecraft.World/StructureFeatureIO.h new file mode 100644 index 00000000..90fc115d --- /dev/null +++ b/Minecraft.World/StructureFeatureIO.h @@ -0,0 +1,93 @@ +#pragma once + +class StructurePiece; +class StructureStart; + +typedef StructurePiece *(*structurePieceCreateFn)(); +typedef StructureStart *(*structureStartCreateFn)(); + +enum EStructureStart +{ + eStructureStart_MineShaftStart, + eStructureStart_VillageStart, + eStructureStart_NetherBridgeStart, + eStructureStart_StrongholdStart, + eStructureStart_ScatteredFeatureStart, +}; + +enum EStructurePiece +{ + eStructurePiece_MineShaftRoom, + eStructurePiece_MineShaftCorridor, + eStructurePiece_MineShaftCrossing, + eStructurePiece_MineShaftStairs, + + eStructurePiece_BridgeStraight, + eStructurePiece_BridgeEndFiller, + eStructurePiece_BridgeCrossing, + eStructurePiece_RoomCrossing, + eStructurePiece_StairsRoom, + eStructurePiece_MonsterThrone, + eStructurePiece_CastleEntrance, + eStructurePiece_CastleStalkRoom, + eStructurePiece_CastleSmallCorridorPiece, + eStructurePiece_CastleSmallCorridorCrossingPiece, + eStructurePiece_CastleSmallCorridorRightTurnPiece, + eStructurePiece_CastleSmallCorridorLeftTurnPiece, + eStructurePiece_CastleCorridorStairsPiece, + eStructurePiece_CastleCorridorTBalconyPiece, + eStructurePiece_NetherBridgeStartPiece, + + eStructurePiece_DesertPyramidPiece, + eStructurePiece_JunglePyramidPiece, + eStructurePiece_SwamplandHut, + + eStructurePiece_FillerCorridor, + eStructurePiece_StairsDown, + eStructurePiece_Straight, + eStructurePiece_ChestCorridor, + eStructurePiece_StraightStairsDown, + eStructurePiece_LeftTurn, + eStructurePiece_RightTurn, + eStructurePiece_StrongholdRoomCrossing, + eStructurePiece_PrisonHall, + eStructurePiece_Library, + eStructurePiece_FiveCrossing, + eStructurePiece_PortalRoom, + eStructurePiece_StrongholdStartPiece, + + eStructurePiece_Well, + eStructurePiece_StraightRoad, + eStructurePiece_SimpleHouse, + eStructurePiece_SmallTemple, + eStructurePiece_BookHouse, + eStructurePiece_SmallHut, + eStructurePiece_PigHouse, + eStructurePiece_TwoRoomHouse, + eStructurePiece_Smithy, + eStructurePiece_Farmland, + eStructurePiece_DoubleFarmland, + eStructurePiece_LightPost, + eStructurePiece_VillageStartPiece, +}; + +class StructureFeatureIO +{ +private: + static unordered_map startIdClassMap; + static unordered_map startClassIdMap; + + static unordered_map pieceIdClassMap; + static unordered_map pieceClassIdMap; + +public: + static void setStartId(EStructureStart clas, structureStartCreateFn createFn, const wstring &id); + static void setPieceId(EStructurePiece clas, structurePieceCreateFn createFn, const wstring &id); + +public: + static void staticCtor(); + static wstring getEncodeId(StructureStart *start); + static wstring getEncodeId(StructurePiece *piece); + static StructureStart *loadStaticStart(CompoundTag *tag, Level *level); + static StructurePiece *loadStaticPiece(CompoundTag *tag, Level *level); +}; \ No newline at end of file diff --git a/Minecraft.World/StructureFeatureSavedData.cpp b/Minecraft.World/StructureFeatureSavedData.cpp new file mode 100644 index 00000000..6c2aa412 --- /dev/null +++ b/Minecraft.World/StructureFeatureSavedData.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" + +#include "StructureFeatureSavedData.h" + +wstring StructureFeatureSavedData::TAG_FEATURES = L"Features"; + +StructureFeatureSavedData::StructureFeatureSavedData(const wstring &idName) : SavedData(idName) +{ + this->pieceTags = new CompoundTag(TAG_FEATURES); +} + +StructureFeatureSavedData::~StructureFeatureSavedData() +{ + delete pieceTags; +} + +void StructureFeatureSavedData::load(CompoundTag *tag) +{ + this->pieceTags = tag->getCompound(TAG_FEATURES); +} + +void StructureFeatureSavedData::save(CompoundTag *tag) +{ + tag->put(TAG_FEATURES, pieceTags->copy() ); +} + +CompoundTag *StructureFeatureSavedData::getFeatureTag(int chunkX, int chunkZ) +{ + return pieceTags->getCompound(createFeatureTagId(chunkX, chunkZ)); +} + +void StructureFeatureSavedData::putFeatureTag(CompoundTag *tag, int chunkX, int chunkZ) +{ + wstring name = createFeatureTagId(chunkX, chunkZ); + tag->setName(name); + pieceTags->put(name, tag); +} + +wstring StructureFeatureSavedData::createFeatureTagId(int chunkX, int chunkZ) +{ + return L"[" + _toString(chunkX) + L"," + _toString(chunkZ) + L"]"; +} + +CompoundTag *StructureFeatureSavedData::getFullTag() +{ + return pieceTags; +} \ No newline at end of file diff --git a/Minecraft.World/StructureFeatureSavedData.h b/Minecraft.World/StructureFeatureSavedData.h new file mode 100644 index 00000000..599befd3 --- /dev/null +++ b/Minecraft.World/StructureFeatureSavedData.h @@ -0,0 +1,21 @@ +#pragma once + +#include "SavedData.h" + +class StructureFeatureSavedData : public SavedData +{ +private: + static wstring TAG_FEATURES; + CompoundTag *pieceTags; + +public: + StructureFeatureSavedData(const wstring &idName); + ~StructureFeatureSavedData(); + + void load(CompoundTag *tag); + void save(CompoundTag *tag); + CompoundTag *getFeatureTag(int chunkX, int chunkZ); + void putFeatureTag(CompoundTag *tag, int chunkX, int chunkZ); + wstring createFeatureTagId(int chunkX, int chunkZ); + CompoundTag *getFullTag(); +}; \ No newline at end of file diff --git a/Minecraft.World/StructurePiece.cpp b/Minecraft.World/StructurePiece.cpp index 1d41a608..cd483a6e 100644 --- a/Minecraft.World/StructurePiece.cpp +++ b/Minecraft.World/StructurePiece.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.material.h" @@ -41,6 +42,14 @@ * chunks, leading to infinite loops and other errors. */ +StructurePiece::StructurePiece() +{ + boundingBox = NULL; + orientation = 0; + genDepth = 0; + // for reflection +} + StructurePiece::StructurePiece( int genDepth ) { boundingBox = NULL; @@ -53,6 +62,33 @@ StructurePiece::~StructurePiece() if(boundingBox != NULL) delete boundingBox; } +CompoundTag *StructurePiece::createTag() +{ + CompoundTag *tag = new CompoundTag(); + + tag->putString(L"id", StructureFeatureIO::getEncodeId(this)); + tag->put(L"BB", boundingBox->createTag(L"BB")); + tag->putInt(L"O", orientation); + tag->putInt(L"GD", genDepth); + + addAdditonalSaveData(tag); + + return tag; +} + +void StructurePiece::load(Level *level, CompoundTag *tag) +{ + + if (tag->contains(L"BB")) + { + boundingBox = new BoundingBox(tag->getIntArray(L"BB")); + } + orientation = tag->getInt(L"O"); + genDepth = tag->getInt(L"GD"); + + readAdditonalSaveData(tag); +} + void StructurePiece::addChildren( StructurePiece* startPiece, list< StructurePiece* > *pieces, Random* random ) { } @@ -205,13 +241,13 @@ int StructurePiece::getOrientationData( int tile, int data ) { if ( orientation == Direction::WEST || orientation == Direction::EAST ) { - if ( data == RailTile::DIR_FLAT_X ) + if ( data == BaseRailTile::DIR_FLAT_X ) { - return RailTile::DIR_FLAT_Z; + return BaseRailTile::DIR_FLAT_Z; } else { - return RailTile::DIR_FLAT_X; + return BaseRailTile::DIR_FLAT_X; } } } @@ -245,7 +281,7 @@ int StructurePiece::getOrientationData( int tile, int data ) return ( data + 3 ) & 3; } } - else if ( tile == Tile::stairs_stone_Id || tile == Tile::stairs_wood_Id || tile == Tile::stairs_netherBricks_Id || tile == Tile::stairs_stoneBrickSmooth_Id || tile == Tile::stairs_sandstone_Id) + else if ( tile == Tile::stairs_stone_Id || tile == Tile::stairs_wood_Id || tile == Tile::stairs_netherBricks_Id || tile == Tile::stairs_stoneBrick_Id || tile == Tile::stairs_sandstone_Id) { if ( orientation == Direction::SOUTH ) { @@ -515,7 +551,7 @@ void StructurePiece::placeBlock( Level* level, int block, int data, int x, int y // 4J Stu - We shouldn't be removing bedrock when generating things (eg in SuperFlat) if(worldY == 0) return; - level->setTileAndDataNoUpdate( worldX, worldY, worldZ, block, data ); + level->setTileAndData( worldX, worldY, worldZ, block, data, Tile::UPDATE_CLIENTS); } @@ -745,13 +781,12 @@ void StructurePiece::generateAirColumnUp( Level* level, int x, int startY, int z while ( !level->isEmptyTile( worldX, worldY, worldZ ) && worldY < Level::maxBuildHeight - 1 ) { - level->setTileAndDataNoUpdate( worldX, worldY, worldZ, 0, 0 ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_CLIENTS); worldY++; } } -void StructurePiece::fillColumnDown( Level* level, int tile, int tileData, int x, int startY, int z, - BoundingBox* chunkBB ) +void StructurePiece::fillColumnDown( Level* level, int tile, int tileData, int x, int startY, int z, BoundingBox* chunkBB ) { int worldX = getWorldX( x, z ); int worldY = getWorldY( startY ); @@ -764,7 +799,7 @@ void StructurePiece::fillColumnDown( Level* level, int tile, int tileData, int x while ( ( level->isEmptyTile( worldX, worldY, worldZ ) || level->getMaterial( worldX, worldY, worldZ )->isLiquid() ) && worldY > 1 ) { - level->setTileAndDataNoUpdate( worldX, worldY, worldZ, tile, tileData ); + level->setTileAndData( worldX, worldY, worldZ, tile, tileData, Tile::UPDATE_CLIENTS ); worldY--; } } @@ -780,7 +815,7 @@ bool StructurePiece::createChest( Level* level, BoundingBox* chunkBB, Random* ra { if ( level->getTile( worldX, worldY, worldZ ) != Tile::chest->id ) { - level->setTile( worldX, worldY, worldZ, Tile::chest->id ); + level->setTileAndData( worldX, worldY, worldZ, Tile::chest->id, 0, Tile::UPDATE_CLIENTS ); shared_ptr chest = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); if ( chest != NULL ) WeighedTreasure::addChestItems( random, treasure, chest, numRolls ); return true; @@ -799,7 +834,7 @@ bool StructurePiece::createDispenser(Level *level, BoundingBox *chunkBB, Random { if (level->getTile(worldX, worldY, worldZ) != Tile::dispenser_Id) { - level->setTileAndData(worldX, worldY, worldZ, Tile::dispenser_Id, getOrientationData(Tile::dispenser_Id, facing)); + level->setTileAndData(worldX, worldY, worldZ, Tile::dispenser_Id, getOrientationData(Tile::dispenser_Id, facing), Tile::UPDATE_CLIENTS); shared_ptr dispenser = dynamic_pointer_cast(level->getTileEntity(worldX, worldY, worldZ)); if (dispenser != NULL) WeighedTreasure::addDispenserItems(random, items, dispenser, numRolls); return true; diff --git a/Minecraft.World/StructurePiece.h b/Minecraft.World/StructurePiece.h index f1ead433..2d5767f9 100644 --- a/Minecraft.World/StructurePiece.h +++ b/Minecraft.World/StructurePiece.h @@ -1,6 +1,7 @@ #pragma once #include "WeighedRandom.h" #include "BoundingBox.h" +#include "StructureFeatureIO.h" class Level; class Random; @@ -10,49 +11,52 @@ class ChestTileEntity; class TilePos; /** - * - * A structure piece is a construction or room, located somewhere in the world - * with a given orientatino (out of Direction.java). Structure pieces have a - * bounding box that says where the piece is located and its bounds, and the - * orientation is used to translate local coordinates into world coordinates. - *

- * The default orientation is Direction.UNDEFINED, in which case no translation - * will occur. If the orientation is Direction.NORTH, coordinate (0, 0, 0) will - * be at (boundingBox.x0, boundingBox.y0, boundingBox.z1). In other words, (1, - * 1, 1) will be translated to (boundingBox.x0 + 1, boundingBox.y0 + 1, - * boundingBox.z1 - 1). - *

- * When using Direction.SOUTH, the x coordinate will be the same, and the z - * coordinate will be flipped. In other words, the bounding box is NOT rotated! - * It is only flipped along the z axis. Also note that the bounding box is in - * world coordinates, so the local drawing must never reach outside of this. - *

- * When using east and west coordinates, the local z coordinate will be swapped - * with the local x coordinate. For example, (0, 0, 0) is (boundingBox.z1, - * boundingBox.y0, boundingBox.z0), and (1, 1, 1) becomes (boundingBox.x1 - 1, - * boundingBox.y0 + 1, boundingBox.z0 + 1) when using Direction.WEST. - *

- * When-ever a structure piece is placing blocks, it is VERY IMPORTANT to always - * make sure that all getTile and setTile calls are within the chunk's bounding - * box. Failing to check this will cause the level generator to create new - * chunks, leading to infinite loops and other errors. - */ +* +* A structure piece is a construction or room, located somewhere in the world +* with a given orientatino (out of Direction.java). Structure pieces have a +* bounding box that says where the piece is located and its bounds, and the +* orientation is used to translate local coordinates into world coordinates. +*

+* The default orientation is Direction.UNDEFINED, in which case no translation +* will occur. If the orientation is Direction.NORTH, coordinate (0, 0, 0) will +* be at (boundingBox.x0, boundingBox.y0, boundingBox.z1). In other words, (1, +* 1, 1) will be translated to (boundingBox.x0 + 1, boundingBox.y0 + 1, +* boundingBox.z1 - 1). +*

+* When using Direction.SOUTH, the x coordinate will be the same, and the z +* coordinate will be flipped. In other words, the bounding box is NOT rotated! +* It is only flipped along the z axis. Also note that the bounding box is in +* world coordinates, so the local drawing must never reach outside of this. +*

+* When using east and west coordinates, the local z coordinate will be swapped +* with the local x coordinate. For example, (0, 0, 0) is (boundingBox.z1, +* boundingBox.y0, boundingBox.z0), and (1, 1, 1) becomes (boundingBox.x1 - 1, +* boundingBox.y0 + 1, boundingBox.z0 + 1) when using Direction.WEST. +*

+* When-ever a structure piece is placing blocks, it is VERY IMPORTANT to always +* make sure that all getTile and setTile calls are within the chunk's bounding +* box. Failing to check this will cause the level generator to create new +* chunks, leading to infinite loops and other errors. +*/ class StructurePiece { public: - class BlockSelector + virtual EStructurePiece GetType() = 0; + +public: + class BlockSelector { protected: int nextId; - int nextData; + int nextData; public: virtual void next(Random *random, int worldX, int worldY, int worldZ, bool isEdge) {} virtual int getNextId() { return nextId; } virtual int getNextData() { return nextData; } - }; + }; public: // 4J is protected in java, but accessed from VillagePieces, not sure how BoundingBox *boundingBox; @@ -60,20 +64,37 @@ protected: int orientation; int genDepth; - StructurePiece(int genDepth); +public: + StructurePiece(); + +protected: + StructurePiece(int genDepth); + public: virtual ~StructurePiece(); + virtual CompoundTag *createTag(); + +protected: + virtual void addAdditonalSaveData(CompoundTag *tag) = 0; + +public: + virtual void load(Level *level, CompoundTag *tag); + +protected: + virtual void readAdditonalSaveData(CompoundTag *tag) = 0; + +public: virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB) = 0; - virtual BoundingBox *getBoundingBox(); + virtual BoundingBox *getBoundingBox(); - int getGenDepth(); + int getGenDepth(); public: bool isInChunk(ChunkPos *pos); - static StructurePiece *findCollisionPiece(list *pieces, BoundingBox *box); + static StructurePiece *findCollisionPiece(list *pieces, BoundingBox *box); virtual TilePos *getLocatorPosition(); protected: bool edgesLiquid(Level *level, BoundingBox *chunkBB); @@ -85,31 +106,31 @@ public: int getOrientationData(int tile, int data); virtual void placeBlock(Level *level, int block, int data, int x, int y, int z, BoundingBox *chunkBB); - /** - * The purpose of this method is to wrap the getTile call on Level, in order - * to prevent the level from generating chunks that shouldn't be loaded yet. - * Returns 0 if the call is out of bounds. - * - * @param level - * @param x - * @param y - * @param z - * @param chunkPosition - * @return - */ - virtual int getBlock(Level *level, int x, int y, int z, BoundingBox *chunkBB); + /** + * The purpose of this method is to wrap the getTile call on Level, in order + * to prevent the level from generating chunks that shouldn't be loaded yet. + * Returns 0 if the call is out of bounds. + * + * @param level + * @param x + * @param y + * @param z + * @param chunkPosition + * @return + */ + virtual int getBlock(Level *level, int x, int y, int z, BoundingBox *chunkBB); virtual void generateAirBox(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1); - virtual void generateBox(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, int edgeTile, int fillTile, bool skipAir); + virtual void generateBox(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, int edgeTile, int fillTile, bool skipAir); virtual void generateBox(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, int edgeTile, int edgeData, int fillTile, int fillData, bool skipAir); - virtual void generateBox(Level *level, BoundingBox *chunkBB, BoundingBox *boxBB, int edgeTile, int fillTile, bool skipAir); - virtual void generateBox(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, bool skipAir, Random *random, BlockSelector *selector); - virtual void generateBox(Level *level, BoundingBox *chunkBB, BoundingBox *boxBB, bool skipAir, Random *random, BlockSelector *selector); - virtual void generateMaybeBox(Level *level, BoundingBox *chunkBB, Random *random, float probability, int x0, int y0, int z0, int x1, int y1, int z1, int edgeTile, int fillTile, bool skipAir); - virtual void maybeGenerateBlock(Level *level, BoundingBox *chunkBB, Random *random, float probability, int x, int y, int z, int tile, int data); - virtual void generateUpperHalfSphere(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, int fillTile, bool skipAir); - virtual void generateAirColumnUp(Level *level, int x, int startY, int z, BoundingBox *chunkBB); - virtual void fillColumnDown(Level *level, int tile, int tileData, int x, int startY, int z, BoundingBox *chunkBB); - virtual bool createChest(Level *level, BoundingBox *chunkBB, Random *random, int x, int y, int z, WeighedTreasureArray treasure, int numRolls); + virtual void generateBox(Level *level, BoundingBox *chunkBB, BoundingBox *boxBB, int edgeTile, int fillTile, bool skipAir); + virtual void generateBox(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, bool skipAir, Random *random, BlockSelector *selector); + virtual void generateBox(Level *level, BoundingBox *chunkBB, BoundingBox *boxBB, bool skipAir, Random *random, BlockSelector *selector); + virtual void generateMaybeBox(Level *level, BoundingBox *chunkBB, Random *random, float probability, int x0, int y0, int z0, int x1, int y1, int z1, int edgeTile, int fillTile, bool skipAir); + virtual void maybeGenerateBlock(Level *level, BoundingBox *chunkBB, Random *random, float probability, int x, int y, int z, int tile, int data); + virtual void generateUpperHalfSphere(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, int fillTile, bool skipAir); + virtual void generateAirColumnUp(Level *level, int x, int startY, int z, BoundingBox *chunkBB); + virtual void fillColumnDown(Level *level, int tile, int tileData, int x, int startY, int z, BoundingBox *chunkBB); + virtual bool createChest(Level *level, BoundingBox *chunkBB, Random *random, int x, int y, int z, WeighedTreasureArray treasure, int numRolls); virtual bool createDispenser(Level *level, BoundingBox *chunkBB, Random *random, int x, int y, int z, int facing, WeighedTreasureArray items, int numRolls); protected: diff --git a/Minecraft.World/StructureRecipies.cpp b/Minecraft.World/StructureRecipies.cpp index f8ac558c..c3e62863 100644 --- a/Minecraft.World/StructureRecipies.cpp +++ b/Minecraft.World/StructureRecipies.cpp @@ -63,7 +63,7 @@ void StructureRecipies::addRecipes(Recipes *r) L"# #", // L"###", // - L'#', Tile::stoneBrick, + L'#', Tile::cobblestone, L'S'); r->addShapedRecipy(new ItemInstance((Tile*)Tile::chest), // @@ -75,6 +75,13 @@ void StructureRecipies::addRecipes(Recipes *r) L'#', Tile::wood, L'S'); + r->addShapedRecipy(new ItemInstance(Tile::chest_trap), // + L"sctctg", + L"#-", // + + L'#', Tile::chest, L'-', Tile::tripWireSource, + L'S'); + r->addShapedRecipy(new ItemInstance(Tile::enderChest), // L"sssctcig", L"###", // @@ -84,12 +91,12 @@ void StructureRecipies::addRecipes(Recipes *r) L'#', Tile::obsidian, L'E', Item::eyeOfEnder, L'S'); - r->addShapedRecipy(new ItemInstance(Tile::stoneBrickSmooth, 4), // + r->addShapedRecipy(new ItemInstance(Tile::stoneBrick, 4), // L"ssctg", L"##", // L"##", // - L'#', Tile::rock, + L'#', Tile::stone, L'S'); // 4J Stu - Move this into "Recipes" to change the order things are displayed on the crafting menu @@ -122,7 +129,15 @@ void StructureRecipies::addRecipes(Recipes *r) L" R ", // L"RGR", // L" R ", // - L'R', Item::redStone, 'G', Tile::lightGem, + L'R', Item::redStone, 'G', Tile::glowstone, L'M'); + r->addShapedRecipy(new ItemInstance(Tile::beacon, 1), // + L"sssctcictg", + L"GGG", // + L"GSG", // + L"OOO", // + + L'G', Tile::glass, L'S', Item::netherStar, L'O', Tile::obsidian, + L'M'); } \ No newline at end of file diff --git a/Minecraft.World/StructureStart.cpp b/Minecraft.World/StructureStart.cpp index 22a4312c..9e5ba0a8 100644 --- a/Minecraft.World/StructureStart.cpp +++ b/Minecraft.World/StructureStart.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "StructureStart.h" #include "StructurePiece.h" #include "BoundingBox.h" @@ -7,9 +8,17 @@ StructureStart::StructureStart() { + chunkX = chunkZ = 0; boundingBox = NULL; // 4J added initialiser } +StructureStart::StructureStart(int x, int z) +{ + this->chunkX = x; + this->chunkZ = z; + boundingBox = NULL; +} + StructureStart::~StructureStart() { for(AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) @@ -37,8 +46,8 @@ void StructureStart::postProcess(Level *level, Random *random, BoundingBox *chun { if( (*it)->getBoundingBox()->intersects(chunkBB) && !(*it)->postProcess(level, random, chunkBB)) { - // this piece can't be placed, so remove it to avoid future - // attempts + // this piece can't be placed, so remove it to avoid future + // attempts it = pieces.erase(it); } else @@ -50,7 +59,7 @@ void StructureStart::postProcess(Level *level, Random *random, BoundingBox *chun void StructureStart::calculateBoundingBox() { - boundingBox = BoundingBox::getUnknownBox(); + boundingBox = BoundingBox::getUnknownBox(); for( AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) { @@ -59,53 +68,113 @@ void StructureStart::calculateBoundingBox() } } +CompoundTag *StructureStart::createTag(int chunkX, int chunkZ) +{ + CompoundTag *tag = new CompoundTag(); + + tag->putString(L"id", StructureFeatureIO::getEncodeId(this)); + tag->putInt(L"ChunkX", chunkX); + tag->putInt(L"ChunkZ", chunkZ); + tag->put(L"BB", boundingBox->createTag(L"BB")); + + ListTag *childrenTags = new ListTag(L"Children"); + for(AUTO_VAR(it, pieces.begin()); it != pieces.end(); ++it) + { + StructurePiece *piece = *it; + childrenTags->add(piece->createTag()); + } + tag->put(L"Children", childrenTags); + + addAdditonalSaveData(tag); + + return tag; +} + +void StructureStart::addAdditonalSaveData(CompoundTag *tag) +{ + +} + +void StructureStart::load(Level *level, CompoundTag *tag) +{ + chunkX = tag->getInt(L"ChunkX"); + chunkZ = tag->getInt(L"ChunkZ"); + if (tag->contains(L"BB")) + { + boundingBox = new BoundingBox(tag->getIntArray(L"BB")); + } + + ListTag *children = (ListTag *) tag->getList(L"Children"); + for (int i = 0; i < children->size(); i++) + { + pieces.push_back(StructureFeatureIO::loadStaticPiece(children->get(i), level)); + } + + readAdditonalSaveData(tag); +} + +void StructureStart::readAdditonalSaveData(CompoundTag *tag) +{ + +} + void StructureStart::moveBelowSeaLevel(Level *level, Random *random, int offset) { const int MAX_Y = level->seaLevel - offset; - // set lowest possible position (at bedrock) - int y1Pos = boundingBox->getYSpan() + 1; - // move up randomly within the available span - if (y1Pos < MAX_Y) + // set lowest possible position (at bedrock) + int y1Pos = boundingBox->getYSpan() + 1; + // move up randomly within the available span + if (y1Pos < MAX_Y) { - y1Pos += random->nextInt(MAX_Y - y1Pos); - } + y1Pos += random->nextInt(MAX_Y - y1Pos); + } - // move all bounding boxes - int dy = y1Pos - boundingBox->y1; - boundingBox->move(0, dy, 0); + // move all bounding boxes + int dy = y1Pos - boundingBox->y1; + boundingBox->move(0, dy, 0); for( AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) { StructurePiece *piece = *it; - piece->getBoundingBox()->move(0, dy, 0); - } + piece->getBoundingBox()->move(0, dy, 0); + } } void StructureStart::moveInsideHeights(Level *level, Random *random, int lowestAllowed, int highestAllowed) { - int heightSpan = highestAllowed - lowestAllowed + 1 - boundingBox->getYSpan(); - int y0Pos = 1; + int heightSpan = highestAllowed - lowestAllowed + 1 - boundingBox->getYSpan(); + int y0Pos = 1; - if (heightSpan > 1) + if (heightSpan > 1) { - y0Pos = lowestAllowed + random->nextInt(heightSpan); - } + y0Pos = lowestAllowed + random->nextInt(heightSpan); + } else { - y0Pos = lowestAllowed; - } + y0Pos = lowestAllowed; + } - // move all bounding boxes - int dy = y0Pos - boundingBox->y0; - boundingBox->move(0, dy, 0); + // move all bounding boxes + int dy = y0Pos - boundingBox->y0; + boundingBox->move(0, dy, 0); for( AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) { StructurePiece *piece = *it; - piece->getBoundingBox()->move(0, dy, 0); - } + piece->getBoundingBox()->move(0, dy, 0); + } } bool StructureStart::isValid() { return true; +} + +int StructureStart::getChunkX() +{ + return chunkX; +} + +int StructureStart::getChunkZ() +{ + return chunkZ; } \ No newline at end of file diff --git a/Minecraft.World/StructureStart.h b/Minecraft.World/StructureStart.h index e035f564..72035367 100644 --- a/Minecraft.World/StructureStart.h +++ b/Minecraft.World/StructureStart.h @@ -2,24 +2,42 @@ class StructurePiece; class BoundingBox; +#include "StructureFeatureIO.h" + class StructureStart { +public: + list pieces; protected: - list pieces; - BoundingBox *boundingBox; + BoundingBox *boundingBox; + +private: + int chunkX, chunkZ; - StructureStart(); public: + StructureStart(); + StructureStart(int x, int z); ~StructureStart(); BoundingBox *getBoundingBox(); - list *getPieces(); - void postProcess(Level *level, Random *random, BoundingBox *chunkBB); + list *getPieces(); + void postProcess(Level *level, Random *random, BoundingBox *chunkBB); protected: void calculateBoundingBox(); - void moveBelowSeaLevel(Level *level, Random *random, int offset); + +public: + virtual CompoundTag *createTag(int chunkX, int chunkZ); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void load(Level *level, CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + +protected: + void moveBelowSeaLevel(Level *level, Random *random, int offset); void moveInsideHeights(Level *level, Random *random, int lowestAllowed, int highestAllowed); public: bool isValid(); + int getChunkX(); + int getChunkZ(); + virtual EStructureStart GetType() = 0; }; diff --git a/Minecraft.World/SwampBiome.cpp b/Minecraft.World/SwampBiome.cpp index 0dec2f48..33403d90 100644 --- a/Minecraft.World/SwampBiome.cpp +++ b/Minecraft.World/SwampBiome.cpp @@ -14,6 +14,8 @@ SwampBiome::SwampBiome(int id) : Biome(id) decorator->waterlilyCount = 4; // waterColor = 0xe0ffae; + + enemies.push_back(new MobSpawnerData(eTYPE_SLIME, 1, 1, 1)); } diff --git a/Minecraft.World/SwellGoal.cpp b/Minecraft.World/SwellGoal.cpp index 9065ba16..040d09c2 100644 --- a/Minecraft.World/SwellGoal.cpp +++ b/Minecraft.World/SwellGoal.cpp @@ -7,7 +7,7 @@ SwellGoal::SwellGoal(Creeper *creeper) { - target = weak_ptr(); + target = weak_ptr(); this->creeper = creeper; setRequiredControlFlags(Control::MoveControlFlag); @@ -15,19 +15,19 @@ SwellGoal::SwellGoal(Creeper *creeper) bool SwellGoal::canUse() { - shared_ptr target = creeper->getTarget(); + shared_ptr target = creeper->getTarget(); return creeper->getSwellDir() > 0 || (target != NULL && (creeper->distanceToSqr(target) < 3 * 3)); } void SwellGoal::start() { creeper->getNavigation()->stop(); - target = weak_ptr(creeper->getTarget()); + target = weak_ptr(creeper->getTarget()); } void SwellGoal::stop() { - target = weak_ptr(); + target = weak_ptr(); } void SwellGoal::tick() diff --git a/Minecraft.World/SwellGoal.h b/Minecraft.World/SwellGoal.h index ba6b5379..7e2f68f3 100644 --- a/Minecraft.World/SwellGoal.h +++ b/Minecraft.World/SwellGoal.h @@ -8,7 +8,7 @@ class SwellGoal : public Goal { private: Creeper *creeper; - weak_ptr target; + weak_ptr target; public: SwellGoal(Creeper *creeper); diff --git a/Minecraft.World/SynchedEntityData.cpp b/Minecraft.World/SynchedEntityData.cpp index 9f1aa1f7..e6bb9ec7 100644 --- a/Minecraft.World/SynchedEntityData.cpp +++ b/Minecraft.World/SynchedEntityData.cpp @@ -47,6 +47,17 @@ void SynchedEntityData::define(int id, short value) m_isEmpty = false; } +void SynchedEntityData::define(int id, float value) +{ + MemSect(17); + checkId(id); + int type = TYPE_FLOAT; + shared_ptr dataItem = shared_ptr( new DataItem(type, id, value) ); + itemsById[id] = dataItem; + MemSect(0); + m_isEmpty = false; +} + void SynchedEntityData::define(int id, const wstring& value) { MemSect(17); @@ -100,8 +111,7 @@ int SynchedEntityData::getInteger(int id) float SynchedEntityData::getFloat(int id) { - assert(false); // 4J - not currently implemented - return 0; + return itemsById[id]->getValue_float(); } wstring SynchedEntityData::getString(int id) @@ -160,6 +170,19 @@ void SynchedEntityData::set(int id, short value) } } +void SynchedEntityData::set(int id, float value) +{ + shared_ptr dataItem = itemsById[id]; + + // update the value if it has changed + if (value != dataItem->getValue_float()) + { + dataItem->setValue(value); + dataItem->setDirty(true); + m_isDirty = true; + } +} + void SynchedEntityData::set(int id, const wstring& value) { shared_ptr dataItem = itemsById[id]; @@ -188,7 +211,7 @@ void SynchedEntityData::set(int id, shared_ptr value) void SynchedEntityData::markDirty(int id) { - (*itemsById.find(id)).second->dirty = true; + itemsById[id]->dirty = true; m_isDirty = true; } @@ -221,11 +244,10 @@ vector > *SynchedEntityData::packDirty() if (m_isDirty) { - AUTO_VAR(itEnd, itemsById.end()); - for ( AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ ) + for( int i = 0; i <= MAX_ID_VALUE; i++ ) { - shared_ptr dataItem = (*it).second; - if (dataItem->isDirty()) + shared_ptr dataItem = itemsById[i]; + if ((dataItem != NULL) && dataItem->isDirty()) { dataItem->setDirty(false); @@ -244,11 +266,13 @@ vector > *SynchedEntityData::packDirty() void SynchedEntityData::packAll(DataOutputStream *output) // throws IOException { - AUTO_VAR(itEnd, itemsById.end()); - for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ ) + for( int i = 0; i <= MAX_ID_VALUE; i++ ) { - shared_ptr dataItem = (*it).second; - writeDataItem(output, dataItem); + shared_ptr dataItem = itemsById[i]; + if(dataItem != NULL) + { + writeDataItem(output, dataItem); + } } // add an eof @@ -259,15 +283,17 @@ vector > *SynchedEntityData::getAll() { vector > *result = NULL; - AUTO_VAR(itEnd, itemsById.end()); - for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ ) + for( int i = 0; i <= MAX_ID_VALUE; i++ ) { - if (result == NULL) + shared_ptr dataItem = itemsById[i]; + if(dataItem != NULL) { - result = new vector >(); + if (result == NULL) + { + result = new vector >(); + } + result->push_back(dataItem); } - shared_ptr dataItem = (*it).second; - result->push_back(dataItem); } return result; @@ -292,6 +318,9 @@ void SynchedEntityData::writeDataItem(DataOutputStream *output, shared_ptrwriteShort( dataItem->getValue_short()); break; + case TYPE_FLOAT: + output->writeFloat( dataItem->getValue_float()); + break; case TYPE_STRING: Packet::writeUtf(dataItem->getValue_wstring(), output); break; @@ -348,6 +377,13 @@ vector > *SynchedEntityData::unpack(Data item = shared_ptr( new DataItem(itemType, itemId, dataRead) ); } break; + case TYPE_FLOAT: + { + float dataRead = input->readFloat(); + item = shared_ptr( new DataItem(itemType, itemId, dataRead) ); + + } + break; case TYPE_STRING: item = shared_ptr( new DataItem(itemType, itemId, Packet::readUtf(input, MAX_STRING_DATA_LENGTH)) ); break; @@ -382,25 +418,29 @@ void SynchedEntityData::assignValues(vector > *items) for (AUTO_VAR(it, items->begin()); it != itEnd; it++) { shared_ptr item = *it; - AUTO_VAR(itemFromId, itemsById.find(item->getId())); - if (itemFromId != itemsById.end() ) + + shared_ptr itemFromId = itemsById[item->getId()]; + if( itemFromId != NULL ) { switch(item->getType()) { case TYPE_BYTE: - itemFromId->second->setValue(item->getValue_byte()); + itemFromId->setValue(item->getValue_byte()); break; case TYPE_SHORT: - itemFromId->second->setValue(item->getValue_short()); + itemFromId->setValue(item->getValue_short()); break; case TYPE_INT: - itemFromId->second->setValue(item->getValue_int()); + itemFromId->setValue(item->getValue_int()); + break; + case TYPE_FLOAT: + itemFromId->setValue(item->getValue_float()); break; case TYPE_STRING: - itemFromId->second->setValue(item->getValue_wstring()); + itemFromId->setValue(item->getValue_wstring()); break; case TYPE_ITEMINSTANCE: - itemFromId->second->setValue(item->getValue_itemInstance()); + itemFromId->setValue(item->getValue_itemInstance()); break; default: assert(false); // 4J - not implemented @@ -408,6 +448,9 @@ void SynchedEntityData::assignValues(vector > *items) } } } + + // client-side dirty + m_isDirty = true; } bool SynchedEntityData::isEmpty() @@ -415,38 +458,47 @@ bool SynchedEntityData::isEmpty() return m_isEmpty; } +void SynchedEntityData::clearDirty() +{ + m_isDirty = false; +} + int SynchedEntityData::getSizeInBytes() { int size = 1; - - AUTO_VAR(itEnd, itemsById.end()); - for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ ) - { - shared_ptr dataItem = (*it).second; - size += 1; - - // write value - switch (dataItem->getType()) + for( int i = 0; i <= MAX_ID_VALUE; i++ ) + { + shared_ptr dataItem = itemsById[i]; + if(dataItem != NULL) { - case TYPE_BYTE: size += 1; - break; - case TYPE_SHORT: - size += 2; - break; - case TYPE_INT: - size += 4; - break; - case TYPE_STRING: - size += (int)dataItem->getValue_wstring().length() + 2; // Estimate, assuming all ascii chars - break; - case TYPE_ITEMINSTANCE: - // short + byte + short - size += 2 + 1 + 2; // Estimate, assuming all ascii chars - break; - default: - break; + + // write value + switch (dataItem->getType()) + { + case TYPE_BYTE: + size += 1; + break; + case TYPE_SHORT: + size += 2; + break; + case TYPE_INT: + size += 4; + break; + case TYPE_FLOAT: + size += 4; + break; + case TYPE_STRING: + size += (int)dataItem->getValue_wstring().length() + 2; // Estimate, assuming all ascii chars + break; + case TYPE_ITEMINSTANCE: + // short + byte + short + size += 2 + 1 + 2; // Estimate, assuming all ascii chars + break; + default: + break; + } } } return size; @@ -475,6 +527,12 @@ SynchedEntityData::DataItem::DataItem(int type, int id, short value) : type( typ this->dirty = true; } +SynchedEntityData::DataItem::DataItem(int type, int id, float value) : type( type ), id( id ) +{ + this->value_float = value; + this->dirty = true; +} + SynchedEntityData::DataItem::DataItem(int type, int id, const wstring& value) : type( type ), id( id ) { this->value_wstring = value; @@ -507,6 +565,11 @@ void SynchedEntityData::DataItem::setValue(short value) this->value_short = value; } +void SynchedEntityData::DataItem::setValue(float value) +{ + this->value_float = value; +} + void SynchedEntityData::DataItem::setValue(const wstring& value) { this->value_wstring = value; @@ -527,6 +590,11 @@ short SynchedEntityData::DataItem::getValue_short() return value_short; } +float SynchedEntityData::DataItem::getValue_float() +{ + return value_float; +} + byte SynchedEntityData::DataItem::getValue_byte() { return value_byte; diff --git a/Minecraft.World/SynchedEntityData.h b/Minecraft.World/SynchedEntityData.h index e79a10b8..69d0f248 100644 --- a/Minecraft.World/SynchedEntityData.h +++ b/Minecraft.World/SynchedEntityData.h @@ -15,9 +15,12 @@ public: const int id; // 4J - there used to be one "value" type here of general type Object, just storing the different (used) varieties // here separately for us - byte value_byte; - int value_int; - short value_short; + union { + byte value_byte; + int value_int; + short value_short; + float value_float; + }; wstring value_wstring; shared_ptr value_itemInstance; bool dirty; @@ -29,16 +32,19 @@ public: DataItem(int type, int id, const wstring& value); DataItem(int type, int id, shared_ptr itemInstance); DataItem(int type, int id, short value); + DataItem(int type, int id, float value); int getId(); void setValue(byte value); void setValue(int value); void setValue(short value); + void setValue(float value); void setValue(const wstring& value); void setValue(shared_ptr value); byte getValue_byte(); int getValue_int(); short getValue_short(); + float getValue_float(); wstring getValue_wstring(); shared_ptr getValue_itemInstance(); int getType(); @@ -50,7 +56,6 @@ public: static const int MAX_STRING_DATA_LENGTH = 64; static const int EOF_MARKER = 0x7f; -private: static const int TYPE_BYTE = 0; static const int TYPE_SHORT = 1; static const int TYPE_INT = 2; @@ -71,7 +76,7 @@ private: // the id value must fit in the remaining bits static const int MAX_ID_VALUE = ~TYPE_MASK & 0xff; - unordered_map > itemsById; + shared_ptr itemsById[MAX_ID_VALUE+1]; bool m_isDirty; public: @@ -83,6 +88,7 @@ public: void define(int id, const wstring& value); void define(int id, int value); void define(int id, short value); + void define(int id, float value); void defineNULL(int id, void *pVal); void checkId(int id); // 4J - added to contain common code from overloaded define functions above @@ -97,6 +103,7 @@ public: void set(int id, byte value); void set(int id, int value); void set(int id, short value); + void set(int id, float value); void set(int id, const wstring& value); void set(int id, shared_ptr); void markDirty(int id); @@ -121,6 +128,7 @@ public: public: void assignValues(vector > *items); bool isEmpty(); + void clearDirty(); // 4J Added int getSizeInBytes(); diff --git a/Minecraft.World/Tag.cpp b/Minecraft.World/Tag.cpp index 40da99fe..adc75360 100644 --- a/Minecraft.World/Tag.cpp +++ b/Minecraft.World/Tag.cpp @@ -78,6 +78,11 @@ Tag *Tag::setName(const wstring& name) } Tag *Tag::readNamedTag(DataInput *dis) +{ + return readNamedTag(dis,0); +} + +Tag *Tag::readNamedTag(DataInput *dis, int tagDepth) { byte type = dis->readByte(); if (type == 0) return new EndTag(); @@ -99,7 +104,7 @@ Tag *Tag::readNamedTag(DataInput *dis) // byte[] bytes = new byte[length]; // dis.readFully(bytes); - tag->load(dis); + tag->load(dis, tagDepth); return tag; } diff --git a/Minecraft.World/Tag.h b/Minecraft.World/Tag.h index c3221aea..dcd06722 100644 --- a/Minecraft.World/Tag.h +++ b/Minecraft.World/Tag.h @@ -19,7 +19,7 @@ public: static const byte TAG_List = 9; static const byte TAG_Compound = 10; static const byte TAG_Int_Array = 11; - + static const int MAX_DEPTH = 512; private: wstring name; @@ -28,7 +28,7 @@ protected: public: virtual void write(DataOutput *dos) = 0; - virtual void load(DataInput *dis) = 0; + virtual void load(DataInput *dis, int tagDepth) = 0; virtual wstring toString() = 0; virtual byte getId() = 0; void print(ostream out); @@ -36,6 +36,7 @@ public: wstring getName(); Tag *setName(const wstring& name); static Tag *readNamedTag(DataInput *dis); + static Tag *readNamedTag(DataInput *dis, int tagDepth); static void writeNamedTag(Tag *tag, DataOutput *dos); static Tag *newTag(byte type, const wstring &name); static wchar_t *getTagName(byte type); diff --git a/Minecraft.World/TakeFlowerGoal.cpp b/Minecraft.World/TakeFlowerGoal.cpp index 34c584c6..feb87093 100644 --- a/Minecraft.World/TakeFlowerGoal.cpp +++ b/Minecraft.World/TakeFlowerGoal.cpp @@ -67,7 +67,7 @@ void TakeFlowerGoal::tick() villager->getLookControl()->setLookAt(golem.lock(), 30, 30); if (golem.lock()->getOfferFlowerTick() == pickupTick) { - villager->getNavigation()->moveTo(golem.lock(), 0.15f); + villager->getNavigation()->moveTo(golem.lock(), 0.5f); takeFlower = true; } diff --git a/Minecraft.World/TallGrass.cpp b/Minecraft.World/TallGrass.cpp index e2e7cb19..1a89d3ed 100644 --- a/Minecraft.World/TallGrass.cpp +++ b/Minecraft.World/TallGrass.cpp @@ -8,7 +8,7 @@ #include "TallGrass.h" const unsigned int TallGrass::TALL_GRASS_TILE_NAMES[TALL_GRASS_TILE_NAMES_LENGTH] = { IDS_TILE_SHRUB, - IDS_TILE_GRASS, + IDS_TILE_TALL_GRASS, IDS_TILE_FERN, }; diff --git a/Minecraft.World/TallGrassFeature.cpp b/Minecraft.World/TallGrassFeature.cpp index d13ada49..f509ce68 100644 --- a/Minecraft.World/TallGrassFeature.cpp +++ b/Minecraft.World/TallGrassFeature.cpp @@ -11,23 +11,23 @@ TallGrassFeature::TallGrassFeature(int tile, int type) bool TallGrassFeature::place(Level *level, Random *random, int x, int y, int z) { - int t = 0; - while (((t = level->getTile(x, y, z)) == 0 || t == Tile::leaves_Id) && y > 0) - y--; + int t = 0; + while (((t = level->getTile(x, y, z)) == 0 || t == Tile::leaves_Id) && y > 0) + y--; - for (int i = 0; i < 128; i++) + for (int i = 0; i < 128; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y + random->nextInt(4) - random->nextInt(4); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (level->isEmptyTile(x2, y2, z2)) + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y + random->nextInt(4) - random->nextInt(4); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (level->isEmptyTile(x2, y2, z2)) { - if (Tile::tiles[tile]->canSurvive(level, x2, y2, z2)) + if (Tile::tiles[tile]->canSurvive(level, x2, y2, z2)) { - level->setTileAndDataNoUpdate(x2, y2, z2, tile, type); - } - } - } + level->setTileAndData(x2, y2, z2, tile, type, Tile::UPDATE_CLIENTS); + } + } + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/TamableAnimal.cpp b/Minecraft.World/TamableAnimal.cpp index b065d7bd..2a3ea037 100644 --- a/Minecraft.World/TamableAnimal.cpp +++ b/Minecraft.World/TamableAnimal.cpp @@ -68,6 +68,7 @@ void TamableAnimal::readAdditionalSaveData(CompoundTag *tag) setTame(true); } sitGoal->wantToSit(tag->getBoolean(L"Sitting")); + setSitting(tag->getBoolean(L"Sitting")); } void TamableAnimal::spawnTamingParticles(bool success) @@ -148,7 +149,7 @@ void TamableAnimal::setOwnerUUID(const wstring &name) entityData->set(DATA_OWNERUUID_ID, name); } -shared_ptr TamableAnimal::getOwner() +shared_ptr TamableAnimal::getOwner() { return level->getPlayerByUUID(getOwnerUUID()); } @@ -156,4 +157,39 @@ shared_ptr TamableAnimal::getOwner() SitGoal *TamableAnimal::getSitGoal() { return sitGoal; +} + +bool TamableAnimal::wantsToAttack(shared_ptr target, shared_ptr owner) +{ + return true; +} + +Team *TamableAnimal::getTeam() +{ + if (isTame()) + { + shared_ptr owner = dynamic_pointer_cast(getOwner()); + if (owner != NULL) + { + return owner->getTeam(); + } + } + return Animal::getTeam(); +} + +bool TamableAnimal::isAlliedTo(shared_ptr other) +{ + if (isTame()) + { + shared_ptr owner = dynamic_pointer_cast(getOwner()); + if (other == owner) + { + return true; + } + if (owner != NULL) + { + return owner->isAlliedTo(other); + } + } + return Animal::isAlliedTo(other); } \ No newline at end of file diff --git a/Minecraft.World/TamableAnimal.h b/Minecraft.World/TamableAnimal.h index 71502788..7d17a43c 100644 --- a/Minecraft.World/TamableAnimal.h +++ b/Minecraft.World/TamableAnimal.h @@ -1,10 +1,11 @@ #pragma once #include "Animal.h" +#include "OwnableEntity.h" class SitGoal; -class TamableAnimal : public Animal +class TamableAnimal : public Animal, public OwnableEntity { protected: static const int DATA_FLAGS_ID = 16; @@ -33,6 +34,9 @@ public: virtual void setSitting(bool value); virtual wstring getOwnerUUID(); virtual void setOwnerUUID(const wstring &name); - virtual shared_ptr getOwner(); + virtual shared_ptr getOwner(); virtual SitGoal *getSitGoal(); + bool wantsToAttack(shared_ptr target, shared_ptr owner); + Team *getTeam(); + bool isAlliedTo(shared_ptr other); }; \ No newline at end of file diff --git a/Minecraft.World/TargetGoal.cpp b/Minecraft.World/TargetGoal.cpp index c3ac4f59..982acb5e 100644 --- a/Minecraft.World/TargetGoal.cpp +++ b/Minecraft.World/TargetGoal.cpp @@ -1,40 +1,43 @@ #include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.ai.sensing.h" -#include "net.minecraft.world.entity.h" #include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.level.pathfinder.h" #include "net.minecraft.world.phys.h" #include "TargetGoal.h" -void TargetGoal::_init(Mob *mob, float within, bool mustSee, bool mustReach) +void TargetGoal::_init(PathfinderMob *mob, bool mustSee, bool mustReach) { reachCache = EmptyReachCache; reachCacheTime = 0; unseenTicks = 0; this->mob = mob; - this->within = within; this->mustSee = mustSee; this->mustReach = mustReach; } -TargetGoal::TargetGoal(Mob *mob, float within, bool mustSee) +TargetGoal::TargetGoal(PathfinderMob *mob, bool mustSee) { - _init(mob, within, mustSee, false); + _init(mob, mustSee, false); } -TargetGoal::TargetGoal(Mob *mob, float within, bool mustSee, bool mustReach) +TargetGoal::TargetGoal(PathfinderMob *mob, bool mustSee, bool mustReach) { - _init(mob,within,mustSee,mustReach); + _init(mob,mustSee,mustReach); } bool TargetGoal::canContinueToUse() { - shared_ptr target = mob->getTarget(); + shared_ptr target = mob->getTarget(); if (target == NULL) return false; if (!target->isAlive()) return false; + + double within = getFollowDistance(); if (mob->distanceToSqr(target) > within * within) return false; if (mustSee) { @@ -50,6 +53,12 @@ bool TargetGoal::canContinueToUse() return true; } +double TargetGoal::getFollowDistance() +{ + AttributeInstance *followRange = mob->getAttribute(SharedMonsterAttributes::FOLLOW_RANGE); + return followRange == NULL ? 16 : followRange->getValue(); +} + void TargetGoal::start() { reachCache = EmptyReachCache; @@ -62,21 +71,30 @@ void TargetGoal::stop() mob->setTarget(nullptr); } -bool TargetGoal::canAttack(shared_ptr target, bool allowInvulnerable) +bool TargetGoal::canAttack(shared_ptr target, bool allowInvulnerable) { if (target == NULL) return false; if (target == mob->shared_from_this()) return false; if (!target->isAlive()) return false; if (!mob->canAttackType(target->GetType())) return false; - shared_ptr tamableAnimal = dynamic_pointer_cast(mob->shared_from_this()); - if (tamableAnimal != NULL && tamableAnimal->isTame()) + OwnableEntity *ownableMob = dynamic_cast(mob); + if (ownableMob != NULL && !ownableMob->getOwnerUUID().empty()) { - shared_ptr tamableTarget = dynamic_pointer_cast(target); - if (tamableTarget != NULL && tamableTarget->isTame()) return false; - if (target == tamableAnimal->getOwner()) return false; + shared_ptr ownableTarget = dynamic_pointer_cast(target); + if (ownableTarget != NULL && ownableMob->getOwnerUUID().compare(ownableTarget->getOwnerUUID()) == 0) + { + // We're attacking something owned by the same person... + return false; + } + + if (target == ownableMob->getOwner()) + { + // We're attacking our owner + return false; + } } - else if (dynamic_pointer_cast(target) != NULL) + else if (target->instanceof(eTYPE_PLAYER)) { if (!allowInvulnerable && (dynamic_pointer_cast(target))->abilities.invulnerable) return false; } @@ -95,7 +113,7 @@ bool TargetGoal::canAttack(shared_ptr target, bool allowInvulnerable) return true; } -bool TargetGoal::canReach(shared_ptr target) +bool TargetGoal::canReach(shared_ptr target) { reachCacheTime = 10 + mob->getRandom()->nextInt(5); Path *path = mob->getNavigation()->createPath(target); diff --git a/Minecraft.World/TargetGoal.h b/Minecraft.World/TargetGoal.h index 3bb9da09..4256985b 100644 --- a/Minecraft.World/TargetGoal.h +++ b/Minecraft.World/TargetGoal.h @@ -2,6 +2,8 @@ #include "Goal.h" +class PathfinderMob; + class TargetGoal : public Goal { @@ -15,8 +17,7 @@ private: static const int UnseenMemoryTicks = 60; protected: - Mob *mob; // Owner of this goal - float within; + PathfinderMob *mob; // Owner of this goal bool mustSee; private: @@ -25,20 +26,25 @@ private: int reachCacheTime; int unseenTicks; - void _init(Mob *mob, float within, bool mustSee, bool mustReach); + void _init(PathfinderMob *mob, bool mustSee, bool mustReach); public: - TargetGoal(Mob *mob, float within, bool mustSee); - TargetGoal(Mob *mob, float within, bool mustSee, bool mustReach); + TargetGoal(PathfinderMob *mob, bool mustSee); + TargetGoal(PathfinderMob *mob, bool mustSee, bool mustReach); virtual ~TargetGoal() {} virtual bool canContinueToUse(); + +protected: + virtual double getFollowDistance(); + +public: virtual void start(); virtual void stop(); protected: - virtual bool canAttack(shared_ptr target, bool allowInvulnerable); + virtual bool canAttack(shared_ptr target, bool allowInvulnerable); private: - bool canReach(shared_ptr target); + bool canReach(shared_ptr target); }; \ No newline at end of file diff --git a/Minecraft.World/Team.cpp b/Minecraft.World/Team.cpp new file mode 100644 index 00000000..f3f6e04e --- /dev/null +++ b/Minecraft.World/Team.cpp @@ -0,0 +1,16 @@ +#include "stdafx.h" + +#include "Team.h" + +bool Team::isAlliedTo(Team *other) +{ + if (other == NULL) + { + return false; + } + if (this == other) + { + return true; + } + return false; +} diff --git a/Minecraft.World/Team.h b/Minecraft.World/Team.h new file mode 100644 index 00000000..8374b56e --- /dev/null +++ b/Minecraft.World/Team.h @@ -0,0 +1,13 @@ +#pragma once + +class Team +{ +public: + virtual bool isAlliedTo(Team *other); + + virtual wstring getName() = 0; + virtual wstring getFormattedName(const wstring &teamMemberName) = 0; + virtual bool canSeeFriendlyInvisibles() = 0; + virtual bool isAllowFriendlyFire() = 0; + +}; \ No newline at end of file diff --git a/Minecraft.World/TeleportEntityPacket.cpp b/Minecraft.World/TeleportEntityPacket.cpp index f0ed1e95..d31f5bc2 100644 --- a/Minecraft.World/TeleportEntityPacket.cpp +++ b/Minecraft.World/TeleportEntityPacket.cpp @@ -49,8 +49,8 @@ void TeleportEntityPacket::read(DataInputStream *dis) //throws IOException y = dis->readShort(); z = dis->readShort(); #endif - yRot = (byte) dis->read(); - xRot = (byte) dis->read(); + yRot = dis->readByte(); + xRot = dis->readByte(); } void TeleportEntityPacket::write(DataOutputStream *dos) //throws IOException diff --git a/Minecraft.World/TemptGoal.cpp b/Minecraft.World/TemptGoal.cpp index cf0ee3d2..aebab8fa 100644 --- a/Minecraft.World/TemptGoal.cpp +++ b/Minecraft.World/TemptGoal.cpp @@ -6,7 +6,7 @@ #include "net.minecraft.world.level.h" #include "TemptGoal.h" -TemptGoal::TemptGoal(PathfinderMob *mob, float speed, int itemId, bool canScare) +TemptGoal::TemptGoal(PathfinderMob *mob, double speedModifier, int itemId, bool canScare) { px = py = pz = pRotX = pRotY = 0.0; player = weak_ptr(); @@ -15,7 +15,7 @@ TemptGoal::TemptGoal(PathfinderMob *mob, float speed, int itemId, bool canScare) oldAvoidWater = false; this->mob = mob; - this->speed = speed; + this->speedModifier = speedModifier; this->itemId = itemId; this->canScare = canScare; setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); @@ -82,7 +82,7 @@ void TemptGoal::tick() { mob->getLookControl()->setLookAt(player.lock(), 30, mob->getMaxHeadXRot()); if (mob->distanceToSqr(player.lock()) < 2.5 * 2.5) mob->getNavigation()->stop(); - else mob->getNavigation()->moveTo(player.lock(), speed); + else mob->getNavigation()->moveTo(player.lock(), speedModifier); } bool TemptGoal::isRunning() diff --git a/Minecraft.World/TemptGoal.h b/Minecraft.World/TemptGoal.h index 78fbe1d8..898264e1 100644 --- a/Minecraft.World/TemptGoal.h +++ b/Minecraft.World/TemptGoal.h @@ -6,7 +6,7 @@ class TemptGoal : public Goal { private: PathfinderMob *mob; - float speed; + double speedModifier; double px, py, pz, pRotX, pRotY; weak_ptr player; int calmDown ; @@ -16,7 +16,7 @@ private: bool oldAvoidWater; public: - TemptGoal(PathfinderMob *mob, float speed, int itemId, bool canScare); + TemptGoal(PathfinderMob *mob, double speedModifier, int itemId, bool canScare); bool canUse(); bool canContinueToUse(); diff --git a/Minecraft.World/TheEndBiome.cpp b/Minecraft.World/TheEndBiome.cpp index 9b95d76a..9e2359ed 100644 --- a/Minecraft.World/TheEndBiome.cpp +++ b/Minecraft.World/TheEndBiome.cpp @@ -6,17 +6,18 @@ TheEndBiome::TheEndBiome(int id) : Biome(id) { - enemies.clear(); - friendlies.clear(); + enemies.clear(); + friendlies.clear(); friendlies_chicken.clear(); // 4J added friendlies_wolf.clear(); // 4J added - waterFriendlies.clear(); + waterFriendlies.clear(); + ambientFriendlies.clear(); - enemies.push_back(new MobSpawnerData(eTYPE_ENDERMAN, 10, 4, 4)); - topMaterial = (byte) Tile::dirt_Id; - this->material = (byte) Tile::dirt_Id; + enemies.push_back(new MobSpawnerData(eTYPE_ENDERMAN, 10, 4, 4)); + topMaterial = (byte) Tile::dirt_Id; + material = (byte) Tile::dirt_Id; - decorator = new TheEndBiomeDecorator(this); + decorator = new TheEndBiomeDecorator(this); } // 4J Stu - Don't need override diff --git a/Minecraft.World/TheEndBiomeDecorator.cpp b/Minecraft.World/TheEndBiomeDecorator.cpp index 31823c80..0ab1f766 100644 --- a/Minecraft.World/TheEndBiomeDecorator.cpp +++ b/Minecraft.World/TheEndBiomeDecorator.cpp @@ -33,8 +33,8 @@ TheEndBiomeDecorator::SPIKE TheEndBiomeDecorator::SpikeValA[8]= TheEndBiomeDecorator::TheEndBiomeDecorator(Biome *biome) : BiomeDecorator(biome) { - spikeFeature = new SpikeFeature(Tile::whiteStone_Id); - endPodiumFeature = new EndPodiumFeature(Tile::whiteStone_Id); + spikeFeature = new SpikeFeature(Tile::endStone_Id); + endPodiumFeature = new EndPodiumFeature(Tile::endStone_Id); } void TheEndBiomeDecorator::decorate() @@ -56,16 +56,17 @@ void TheEndBiomeDecorator::decorate() spikeFeature->placeWithIndex(level, random, SpikeValA[i].x, level->GetHighestY(), SpikeValA[i].z,i,SpikeValA[i].radius); } } - if (xo == 0 && zo == 0) + if (xo == 0 && zo == 0) { shared_ptr enderDragon = shared_ptr(new EnderDragon(level)); - enderDragon->moveTo(0, 128, 0, random->nextFloat() * 360, 0); - level->addEntity(enderDragon); + enderDragon->AddParts(); // 4J added + enderDragon->moveTo(0, 128, 0, random->nextFloat() * 360, 0); + level->addEntity(enderDragon); } // end podium radius is 4, position is 0,0, so chunk needs to be the -16,-16 one since this guarantees that all chunks required for the podium are loaded if (xo == -16 && zo == -16) { - endPodiumFeature->place(level, random, 0, Level::genDepth / 2, 0); - } + endPodiumFeature->place(level, random, 0, level->seaLevel, 0); + } } \ No newline at end of file diff --git a/Minecraft.World/TheEndLevelRandomLevelSource.cpp b/Minecraft.World/TheEndLevelRandomLevelSource.cpp index 46f3dbab..67d85a92 100644 --- a/Minecraft.World/TheEndLevelRandomLevelSource.cpp +++ b/Minecraft.World/TheEndLevelRandomLevelSource.cpp @@ -13,16 +13,16 @@ TheEndLevelRandomLevelSource::TheEndLevelRandomLevelSource(Level *level, __int64 { m_XZSize = END_LEVEL_MIN_WIDTH; - this->level = level; + this->level = level; - random = new Random(seed); + random = new Random(seed); pprandom = new Random(seed); // 4J added - lperlinNoise1 = new PerlinNoise(random, 16); - lperlinNoise2 = new PerlinNoise(random, 16); - perlinNoise1 = new PerlinNoise(random, 8); + lperlinNoise1 = new PerlinNoise(random, 16); + lperlinNoise2 = new PerlinNoise(random, 16); + perlinNoise1 = new PerlinNoise(random, 8); - scaleNoise = new PerlinNoise(random, 10); - depthNoise = new PerlinNoise(random, 16); + scaleNoise = new PerlinNoise(random, 10); + depthNoise = new PerlinNoise(random, 16); } TheEndLevelRandomLevelSource::~TheEndLevelRandomLevelSource() @@ -40,121 +40,121 @@ void TheEndLevelRandomLevelSource::prepareHeights(int xOffs, int zOffs, byteArra { doubleArray buffer; // 4J - used to be declared with class level scope but tidying up for thread safety reasons - int xChunks = 16 / CHUNK_WIDTH; + int xChunks = 16 / CHUNK_WIDTH; - int xSize = xChunks + 1; - int ySize = Level::genDepth / CHUNK_HEIGHT + 1; - int zSize = xChunks + 1; - buffer = getHeights(buffer, xOffs * xChunks, 0, zOffs * xChunks, xSize, ySize, zSize); + int xSize = xChunks + 1; + int ySize = Level::genDepth / CHUNK_HEIGHT + 1; + int zSize = xChunks + 1; + buffer = getHeights(buffer, xOffs * xChunks, 0, zOffs * xChunks, xSize, ySize, zSize); - for (int xc = 0; xc < xChunks; xc++) + for (int xc = 0; xc < xChunks; xc++) { - for (int zc = 0; zc < xChunks; zc++) + for (int zc = 0; zc < xChunks; zc++) { - for (int yc = 0; yc < Level::genDepth / CHUNK_HEIGHT; yc++) + for (int yc = 0; yc < Level::genDepth / CHUNK_HEIGHT; yc++) { - double yStep = 1 / (double) CHUNK_HEIGHT; - double s0 = buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 0)]; - double s1 = buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 0)]; - double s2 = buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 0)]; - double s3 = buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 0)]; - - double s0a = (buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 1)] - s0) * yStep; - double s1a = (buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 1)] - s1) * yStep; - double s2a = (buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 1)] - s2) * yStep; - double s3a = (buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 1)] - s3) * yStep; - - for (int y = 0; y < CHUNK_HEIGHT; y++) + double yStep = 1 / (double) CHUNK_HEIGHT; + double s0 = buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 0)]; + double s1 = buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 0)]; + double s2 = buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 0)]; + double s3 = buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 0)]; + + double s0a = (buffer[((xc + 0) * zSize + (zc + 0)) * ySize + (yc + 1)] - s0) * yStep; + double s1a = (buffer[((xc + 0) * zSize + (zc + 1)) * ySize + (yc + 1)] - s1) * yStep; + double s2a = (buffer[((xc + 1) * zSize + (zc + 0)) * ySize + (yc + 1)] - s2) * yStep; + double s3a = (buffer[((xc + 1) * zSize + (zc + 1)) * ySize + (yc + 1)] - s3) * yStep; + + for (int y = 0; y < CHUNK_HEIGHT; y++) { - double xStep = 1 / (double) CHUNK_WIDTH; + double xStep = 1 / (double) CHUNK_WIDTH; - double _s0 = s0; - double _s1 = s1; - double _s0a = (s2 - s0) * xStep; - double _s1a = (s3 - s1) * xStep; + double _s0 = s0; + double _s1 = s1; + double _s0a = (s2 - s0) * xStep; + double _s1a = (s3 - s1) * xStep; - for (int x = 0; x < CHUNK_WIDTH; x++) + for (int x = 0; x < CHUNK_WIDTH; x++) { - int offs = (x + xc * CHUNK_WIDTH) << Level::genDepthBitsPlusFour | (0 + zc * CHUNK_WIDTH) << Level::genDepthBits | (yc * CHUNK_HEIGHT + y); - int step = 1 << Level::genDepthBits; - double zStep = 1 / (double) CHUNK_WIDTH; + int offs = (x + xc * CHUNK_WIDTH) << Level::genDepthBitsPlusFour | (0 + zc * CHUNK_WIDTH) << Level::genDepthBits | (yc * CHUNK_HEIGHT + y); + int step = 1 << Level::genDepthBits; + double zStep = 1 / (double) CHUNK_WIDTH; - double val = _s0; - double vala = (_s1 - _s0) * zStep; - for (int z = 0; z < CHUNK_WIDTH; z++) + double val = _s0; + double vala = (_s1 - _s0) * zStep; + for (int z = 0; z < CHUNK_WIDTH; z++) { - int tileId = 0; - if (val > 0) + int tileId = 0; + if (val > 0) { - tileId = Tile::whiteStone_Id; - } else { - } - - blocks[offs] = (byte) tileId; - offs += step; - val += vala; - } - _s0 += _s0a; - _s1 += _s1a; - } - - s0 += s0a; - s1 += s1a; - s2 += s2a; - s3 += s3a; - } - } - } - } + tileId = Tile::endStone_Id; + } else { + } + + blocks[offs] = (byte) tileId; + offs += step; + val += vala; + } + _s0 += _s0a; + _s1 += _s1a; + } + + s0 += s0a; + s1 += s1a; + s2 += s2a; + s3 += s3a; + } + } + } + } delete [] buffer.data; } void TheEndLevelRandomLevelSource::buildSurfaces(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes) { - for (int x = 0; x < 16; x++) + for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) + for (int z = 0; z < 16; z++) { - int runDepth = 1; - int run = -1; + int runDepth = 1; + int run = -1; - byte top = (byte) Tile::whiteStone_Id; - byte material = (byte) Tile::whiteStone_Id; + byte top = (byte) Tile::endStone_Id; + byte material = (byte) Tile::endStone_Id; - for (int y = Level::genDepthMinusOne; y >= 0; y--) + for (int y = Level::genDepthMinusOne; y >= 0; y--) { - int offs = (z * 16 + x) * Level::genDepth + y; + int offs = (z * 16 + x) * Level::genDepth + y; - int old = blocks[offs]; + int old = blocks[offs]; - if (old == 0) + if (old == 0) { - run = -1; - } - else if (old == Tile::rock_Id) + run = -1; + } + else if (old == Tile::stone_Id) { - if (run == -1) + if (run == -1) { - if (runDepth <= 0) + if (runDepth <= 0) { - top = 0; - material = (byte) Tile::whiteStone_Id; - } - - run = runDepth; - if (y >= 0) blocks[offs] = top; - else blocks[offs] = material; - } + top = 0; + material = (byte) Tile::endStone_Id; + } + + run = runDepth; + if (y >= 0) blocks[offs] = top; + else blocks[offs] = material; + } else if (run > 0) { - run--; - blocks[offs] = material; - } - } - } - } - } + run--; + blocks[offs] = material; + } + } + } + } + } } LevelChunk *TheEndLevelRandomLevelSource::create(int x, int z) @@ -164,7 +164,7 @@ LevelChunk *TheEndLevelRandomLevelSource::create(int x, int z) LevelChunk *TheEndLevelRandomLevelSource::getChunk(int xOffs, int zOffs) { - random->setSeed(xOffs * 341873128712l + zOffs * 132897987541l); + random->setSeed(xOffs * 341873128712l + zOffs * 132897987541l); BiomeArray biomes; // 4J - now allocating this with a physical alloc & bypassing general memory management so that it will get cleanly freed @@ -172,119 +172,119 @@ LevelChunk *TheEndLevelRandomLevelSource::getChunk(int xOffs, int zOffs) byte *tileData = (byte *)XPhysicalAlloc(blocksSize, MAXULONG_PTR, 4096, PAGE_READWRITE); XMemSet128(tileData,0,blocksSize); byteArray blocks = byteArray(tileData,blocksSize); -// byteArray blocks = byteArray(16 * level->depth * 16); + // byteArray blocks = byteArray(16 * level->depth * 16); -// LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); // 4J moved below - level->getBiomeSource()->getBiomeBlock(biomes, xOffs * 16, zOffs * 16, 16, 16, true); + // LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); // 4J moved below + level->getBiomeSource()->getBiomeBlock(biomes, xOffs * 16, zOffs * 16, 16, 16, true); - prepareHeights(xOffs, zOffs, blocks, biomes); - buildSurfaces(xOffs, zOffs, blocks, biomes); + prepareHeights(xOffs, zOffs, blocks, biomes); + buildSurfaces(xOffs, zOffs, blocks, biomes); // 4J - this now creates compressed block data from the blocks array passed in, so moved it until after the blocks are actually finalised. We also // now need to free the passed in blocks as the LevelChunk doesn't use the passed in allocation anymore. LevelChunk *levelChunk = new LevelChunk(level, blocks, xOffs, zOffs); XPhysicalFree(tileData); - levelChunk->recalcHeightmap(); + levelChunk->recalcHeightmap(); //delete blocks.data; // Don't delete the blocks as the array data is actually owned by the chunk now delete biomes.data; - return levelChunk; + return levelChunk; } doubleArray TheEndLevelRandomLevelSource::getHeights(doubleArray buffer, int x, int y, int z, int xSize, int ySize, int zSize) { - if (buffer.data == NULL) + if (buffer.data == NULL) { - buffer = doubleArray(xSize * ySize * zSize); - } + buffer = doubleArray(xSize * ySize * zSize); + } - double s = 1 * 684.412; - double hs = 1 * 684.412; + double s = 1 * 684.412; + double hs = 1 * 684.412; doubleArray pnr, ar, br, sr, dr, fi, fis; // 4J - used to be declared with class level scope but moved here for thread safety - sr = scaleNoise->getRegion(sr, x, z, xSize, zSize, 1.121, 1.121, 0.5); - dr = depthNoise->getRegion(dr, x, z, xSize, zSize, 200.0, 200.0, 0.5); + sr = scaleNoise->getRegion(sr, x, z, xSize, zSize, 1.121, 1.121, 0.5); + dr = depthNoise->getRegion(dr, x, z, xSize, zSize, 200.0, 200.0, 0.5); - s *= 2; + s *= 2; - pnr = perlinNoise1->getRegion(pnr, x, y, z, xSize, ySize, zSize, s / 80.0, hs / 160.0, s / 80.0); - ar = lperlinNoise1->getRegion(ar, x, y, z, xSize, ySize, zSize, s, hs, s); - br = lperlinNoise2->getRegion(br, x, y, z, xSize, ySize, zSize, s, hs, s); + pnr = perlinNoise1->getRegion(pnr, x, y, z, xSize, ySize, zSize, s / 80.0, hs / 160.0, s / 80.0); + ar = lperlinNoise1->getRegion(ar, x, y, z, xSize, ySize, zSize, s, hs, s); + br = lperlinNoise2->getRegion(br, x, y, z, xSize, ySize, zSize, s, hs, s); - int p = 0; - int pp = 0; + int p = 0; + int pp = 0; - for (int xx = 0; xx < xSize; xx++) + for (int xx = 0; xx < xSize; xx++) { - for (int zz = 0; zz < zSize; zz++) + for (int zz = 0; zz < zSize; zz++) { - double scale = ((sr[pp] + 256.0) / 512); - if (scale > 1) scale = 1; + double scale = ((sr[pp] + 256.0) / 512); + if (scale > 1) scale = 1; - double depth = (dr[pp] / 8000.0); - if (depth < 0) depth = -depth * 0.3; - depth = depth * 3.0 - 2.0; + double depth = (dr[pp] / 8000.0); + if (depth < 0) depth = -depth * 0.3; + depth = depth * 3.0 - 2.0; - float xd = ((xx + x) - 0) / 1.0f; - float zd = ((zz + z) - 0) / 1.0f; - float doffs = 100 - sqrt(xd * xd + zd * zd) * 8; - if (doffs > 80) doffs = 80; - if (doffs < -100) doffs = -100; - if (depth > 1) depth = 1; - depth = depth / 8; - depth = 0; + float xd = ((xx + x) - 0) / 1.0f; + float zd = ((zz + z) - 0) / 1.0f; + float doffs = 100 - sqrt(xd * xd + zd * zd) * 8; + if (doffs > 80) doffs = 80; + if (doffs < -100) doffs = -100; + if (depth > 1) depth = 1; + depth = depth / 8; + depth = 0; - if (scale < 0) scale = 0; - scale = (scale) + 0.5; - depth = depth * ySize / 16; + if (scale < 0) scale = 0; + scale = (scale) + 0.5; + depth = depth * ySize / 16; - pp++; + pp++; - double yCenter = ySize / 2.0; + double yCenter = ySize / 2.0; - for (int yy = 0; yy < ySize; yy++) + for (int yy = 0; yy < ySize; yy++) { - double val = 0; - double yOffs = (yy - (yCenter)) * 8 / scale; + double val = 0; + double yOffs = (yy - (yCenter)) * 8 / scale; - if (yOffs < 0) yOffs *= -1; + if (yOffs < 0) yOffs *= -1; - double bb = ar[p] / 512; - double cc = br[p] / 512; + double bb = ar[p] / 512; + double cc = br[p] / 512; - double v = (pnr[p] / 10 + 1) / 2; - if (v < 0) val = bb; - else if (v > 1) val = cc; - else val = bb + (cc - bb) * v; - val -= 8; - val += doffs; + double v = (pnr[p] / 10 + 1) / 2; + if (v < 0) val = bb; + else if (v > 1) val = cc; + else val = bb + (cc - bb) * v; + val -= 8; + val += doffs; - int r = 2; - if (yy > ySize / 2 - r) + int r = 2; + if (yy > ySize / 2 - r) { - double slide = (yy - (ySize / 2 - r)) / (64.0f); - if (slide < 0) slide = 0; - if (slide > 1) slide = 1; - val = val * (1 - slide) + -3000 * slide; - } - r = 8; - if (yy < r) + double slide = (yy - (ySize / 2 - r)) / (64.0f); + if (slide < 0) slide = 0; + if (slide > 1) slide = 1; + val = val * (1 - slide) + -3000 * slide; + } + r = 8; + if (yy < r) { - double slide = (r - yy) / (r - 1.0f); - val = val * (1 - slide) + -30 * slide; - } + double slide = (r - yy) / (r - 1.0f); + val = val * (1 - slide) + -30 * slide; + } - buffer[p] = val; - p++; - } - } - } + buffer[p] = val; + p++; + } + } + } delete [] pnr.data; delete [] ar.data; @@ -294,7 +294,7 @@ doubleArray TheEndLevelRandomLevelSource::getHeights(doubleArray buffer, int x, delete [] fi.data; delete [] fis.data; - return buffer; + return buffer; } @@ -305,68 +305,68 @@ bool TheEndLevelRandomLevelSource::hasChunk(int x, int y) void TheEndLevelRandomLevelSource::calcWaterDepths(ChunkSource *parent, int xt, int zt) { - int xo = xt * 16; - int zo = zt * 16; - for (int x = 0; x < 16; x++) + int xo = xt * 16; + int zo = zt * 16; + for (int x = 0; x < 16; x++) { - int y = level->getSeaLevel(); - for (int z = 0; z < 16; z++) + int y = level->getSeaLevel(); + for (int z = 0; z < 16; z++) { - int xp = xo + x + 7; - int zp = zo + z + 7; - int h = level->getHeightmap(xp, zp); - if (h <= 0) + int xp = xo + x + 7; + int zp = zo + z + 7; + int h = level->getHeightmap(xp, zp); + if (h <= 0) { - if (level->getHeightmap(xp - 1, zp) > 0 || level->getHeightmap(xp + 1, zp) > 0 || level->getHeightmap(xp, zp - 1) > 0 || level->getHeightmap(xp, zp + 1) > 0) + if (level->getHeightmap(xp - 1, zp) > 0 || level->getHeightmap(xp + 1, zp) > 0 || level->getHeightmap(xp, zp - 1) > 0 || level->getHeightmap(xp, zp + 1) > 0) { - bool hadWater = false; - if (hadWater || (level->getTile(xp - 1, y, zp) == Tile::calmWater_Id && level->getData(xp - 1, y, zp) < 7)) hadWater = true; - if (hadWater || (level->getTile(xp + 1, y, zp) == Tile::calmWater_Id && level->getData(xp + 1, y, zp) < 7)) hadWater = true; - if (hadWater || (level->getTile(xp, y, zp - 1) == Tile::calmWater_Id && level->getData(xp, y, zp - 1) < 7)) hadWater = true; - if (hadWater || (level->getTile(xp, y, zp + 1) == Tile::calmWater_Id && level->getData(xp, y, zp + 1) < 7)) hadWater = true; - if (hadWater) + bool hadWater = false; + if (hadWater || (level->getTile(xp - 1, y, zp) == Tile::calmWater_Id && level->getData(xp - 1, y, zp) < 7)) hadWater = true; + if (hadWater || (level->getTile(xp + 1, y, zp) == Tile::calmWater_Id && level->getData(xp + 1, y, zp) < 7)) hadWater = true; + if (hadWater || (level->getTile(xp, y, zp - 1) == Tile::calmWater_Id && level->getData(xp, y, zp - 1) < 7)) hadWater = true; + if (hadWater || (level->getTile(xp, y, zp + 1) == Tile::calmWater_Id && level->getData(xp, y, zp + 1) < 7)) hadWater = true; + if (hadWater) { - for (int x2 = -5; x2 <= 5; x2++) + for (int x2 = -5; x2 <= 5; x2++) { - for (int z2 = -5; z2 <= 5; z2++) + for (int z2 = -5; z2 <= 5; z2++) { - int d = (x2 > 0 ? x2 : -x2) + (z2 > 0 ? z2 : -z2); + int d = (x2 > 0 ? x2 : -x2) + (z2 > 0 ? z2 : -z2); - if (d <= 5) + if (d <= 5) { - d = 6 - d; - if (level->getTile(xp + x2, y, zp + z2) == Tile::calmWater_Id) + d = 6 - d; + if (level->getTile(xp + x2, y, zp + z2) == Tile::calmWater_Id) { - int od = level->getData(xp + x2, y, zp + z2); - if (od < 7 && od < d) + int od = level->getData(xp + x2, y, zp + z2); + if (od < 7 && od < d) { - level->setData(xp + x2, y, zp + z2, d); - } - } - } - } - } - if (hadWater) + level->setData(xp + x2, y, zp + z2, d, Tile::UPDATE_CLIENTS); + } + } + } + } + } + if (hadWater) { - level->setTileAndDataNoUpdate(xp, y, zp, Tile::calmWater_Id, 7); - for (int y2 = 0; y2 < y; y2++) + level->setTileAndData(xp, y, zp, Tile::calmWater_Id, 7, Tile::UPDATE_CLIENTS); + for (int y2 = 0; y2 < y; y2++) { - level->setTileAndDataNoUpdate(xp, y2, zp, Tile::calmWater_Id, 8); - } - } - } - } - } - } - } + level->setTileAndData(xp, y2, zp, Tile::calmWater_Id, 8, Tile::UPDATE_CLIENTS); + } + } + } + } + } + } + } } void TheEndLevelRandomLevelSource::postProcess(ChunkSource *parent, int xt, int zt) { - HeavyTile::instaFall = true; - int xo = xt * 16; - int zo = zt * 16; + HeavyTile::instaFall = true; + int xo = xt * 16; + int zo = zt * 16; // 4J - added. The original java didn't do any setting of the random seed here, and passes the level random to the biome decorator. // We'll be running our postProcess in parallel with getChunk etc. so we need to use a separate random - have used the same initialisation code as @@ -376,11 +376,11 @@ void TheEndLevelRandomLevelSource::postProcess(ChunkSource *parent, int xt, int __int64 zScale = pprandom->nextLong() / 2 * 2 + 1; pprandom->setSeed(((xt * xScale) + (zt * zScale)) ^ level->getSeed()); - Biome *biome = level->getBiome(xo + 16, zo + 16); - biome->decorate(level, pprandom, xo, zo); // 4J - passing pprandom rather than level->random here to make this consistent with our parallel world generation + Biome *biome = level->getBiome(xo + 16, zo + 16); + biome->decorate(level, pprandom, xo, zo); // 4J - passing pprandom rather than level->random here to make this consistent with our parallel world generation + + HeavyTile::instaFall = false; - HeavyTile::instaFall = false; - app.processSchematics(parent->getChunk(xt,zt)); } @@ -406,16 +406,19 @@ wstring TheEndLevelRandomLevelSource::gatherStats() vector *TheEndLevelRandomLevelSource::getMobsAt(MobCategory *mobCategory, int x, int y, int z) { - Biome *biome = level->getBiome(x, z); - if (biome == NULL) + Biome *biome = level->getBiome(x, z); + if (biome == NULL) { - return NULL; - } - return biome->getMobs(mobCategory); + return NULL; + } + return biome->getMobs(mobCategory); } TilePos *TheEndLevelRandomLevelSource::findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z) { return NULL; } - + +void TheEndLevelRandomLevelSource::recreateLogicStructuresForChunk(int chunkX, int chunkZ) +{ +} \ No newline at end of file diff --git a/Minecraft.World/TheEndLevelRandomLevelSource.h b/Minecraft.World/TheEndLevelRandomLevelSource.h index 2dc7f131..4a2a4f2a 100644 --- a/Minecraft.World/TheEndLevelRandomLevelSource.h +++ b/Minecraft.World/TheEndLevelRandomLevelSource.h @@ -6,24 +6,24 @@ class PerlinNoise; class TheEndLevelRandomLevelSource : public ChunkSource { public: - static const double SNOW_CUTOFF; - static const double SNOW_SCALE; - static const bool FLOATING_ISLANDS; + static const double SNOW_CUTOFF; + static const double SNOW_SCALE; + static const bool FLOATING_ISLANDS; - static const int CHUNK_HEIGHT = 4; - static const int CHUNK_WIDTH = 8; + static const int CHUNK_HEIGHT = 4; + static const int CHUNK_WIDTH = 8; private: Random *random; Random *pprandom; private: PerlinNoise *lperlinNoise1; - PerlinNoise *lperlinNoise2; - PerlinNoise *perlinNoise1; + PerlinNoise *lperlinNoise2; + PerlinNoise *perlinNoise1; public: PerlinNoise *scaleNoise; - PerlinNoise *depthNoise; - PerlinNoise *forestNoise; + PerlinNoise *depthNoise; + PerlinNoise *forestNoise; private: @@ -33,12 +33,12 @@ public: TheEndLevelRandomLevelSource(Level *level, __int64 seed); ~TheEndLevelRandomLevelSource(); - void prepareHeights(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes); - void buildSurfaces(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes); + void prepareHeights(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes); + void buildSurfaces(int xOffs, int zOffs, byteArray blocks, BiomeArray biomes); public: virtual LevelChunk *create(int x, int z); - virtual LevelChunk *getChunk(int xOffs, int zOffs); + virtual LevelChunk *getChunk(int xOffs, int zOffs); private: doubleArray getHeights(doubleArray buffer, int x, int y, int z, int xSize, int ySize, int zSize); @@ -49,12 +49,13 @@ private: void calcWaterDepths(ChunkSource *parent, int xt, int zt); public: virtual void postProcess(ChunkSource *parent, int xt, int zt); - virtual bool save(bool force, ProgressListener *progressListener); - virtual bool tick(); - virtual bool shouldSave(); - virtual wstring gatherStats(); + virtual bool save(bool force, ProgressListener *progressListener); + virtual bool tick(); + virtual bool shouldSave(); + virtual wstring gatherStats(); public: virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z); - virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z); + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ); }; diff --git a/Minecraft.World/TheEndPortal.cpp b/Minecraft.World/TheEndPortal.cpp index 19d95b1f..f2cb5dad 100644 --- a/Minecraft.World/TheEndPortal.cpp +++ b/Minecraft.World/TheEndPortal.cpp @@ -21,9 +21,9 @@ void TheEndPortal::allowAnywhere(bool set) TlsSetValue(tlsIdx,(LPVOID)(set?1:0)); } -TheEndPortal::TheEndPortal(int id, Material *material) : EntityTile(id, material, isSolidRender()) +TheEndPortal::TheEndPortal(int id, Material *material) : BaseEntityTile(id, material, isSolidRender()) { - this->setLightEmission(1.0f); + this->setLightEmission(1.0f); } shared_ptr TheEndPortal::newTileEntity(Level *level) @@ -33,14 +33,14 @@ shared_ptr TheEndPortal::newTileEntity(Level *level) void TheEndPortal::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - float r = 1 / 16.0f; - this->setShape(0, 0, 0, 1, r, 1); + float r = 1 / 16.0f; + setShape(0, 0, 0, 1, r, 1); } bool TheEndPortal::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { - if (face != 0) return false; - return EntityTile::shouldRenderFace(level, x, y, z, face); + if (face != 0) return false; + return BaseEntityTile::shouldRenderFace(level, x, y, z, face); } void TheEndPortal::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) @@ -64,11 +64,13 @@ int TheEndPortal::getResourceCount(Random *random) void TheEndPortal::entityInside(Level *level, int x, int y, int z, shared_ptr entity) { - if (entity->riding == NULL && entity->rider.lock() == NULL) + if (entity->GetType() == eTYPE_EXPERIENCEORB ) return; // 4J added + + if (entity->riding == NULL && entity->rider.lock() == NULL) { - if (dynamic_pointer_cast(entity) != NULL) + if (!level->isClientSide) { - if (!level->isClientSide) + if ( entity->instanceof(eTYPE_PLAYER) ) { // 4J Stu - Update the level data position so that the stronghold portal can be shown on the maps int x,z; @@ -79,39 +81,38 @@ void TheEndPortal::entityInside(Level *level, int x, int y, int z, shared_ptrgetLevelData()->setZStrongholdEndPortal(z); level->getLevelData()->setHasStrongholdEndPortal(); } - - (dynamic_pointer_cast(entity))->changeDimension(1); - } - } - } + } + entity->changeDimension(1); + } + } } void TheEndPortal::animateTick(Level *level, int xt, int yt, int zt, Random *random) { - double x = xt + random->nextFloat(); - double y = yt + 0.8f; - double z = zt + random->nextFloat(); - double xa = 0; - double ya = 0; - double za = 0; + double x = xt + random->nextFloat(); + double y = yt + 0.8f; + double z = zt + random->nextFloat(); + double xa = 0; + double ya = 0; + double za = 0; - level->addParticle(eParticleType_endportal, x, y, z, xa, ya, za); + level->addParticle(eParticleType_endportal, x, y, z, xa, ya, za); } int TheEndPortal::getRenderShape() { - return SHAPE_INVISIBLE; + return SHAPE_INVISIBLE; } void TheEndPortal::onPlace(Level *level, int x, int y, int z) { - if (allowAnywhere()) return; + if (allowAnywhere()) return; - if (level->dimension->id != 0) + if (level->dimension->id != 0) { - level->setTile(x, y, z, 0); - return; - } + level->removeTile(x, y, z); + return; + } } int TheEndPortal::cloneTileId(Level *level, int x, int y, int z) diff --git a/Minecraft.World/TheEndPortal.h b/Minecraft.World/TheEndPortal.h index 31cddb2d..a1bb5498 100644 --- a/Minecraft.World/TheEndPortal.h +++ b/Minecraft.World/TheEndPortal.h @@ -1,27 +1,27 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" -class TheEndPortal : public EntityTile +class TheEndPortal : public BaseEntityTile { public: static DWORD tlsIdx; // 4J - was just a static but implemented with TLS for our version - static bool allowAnywhere(); + static bool allowAnywhere(); static void allowAnywhere(bool set); TheEndPortal(int id, Material *material); - virtual shared_ptr newTileEntity(Level *level); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param - virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual int getResourceCount(Random *random); - virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); - virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); - virtual int getRenderShape(); - virtual void onPlace(Level *level, int x, int y, int z); + virtual shared_ptr newTileEntity(Level *level); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual int getResourceCount(Random *random); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); + virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); + virtual int getRenderShape(); + virtual void onPlace(Level *level, int x, int y, int z); virtual int cloneTileId(Level *level, int x, int y, int z); void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/TheEndPortalFrameTile.cpp b/Minecraft.World/TheEndPortalFrameTile.cpp index cab8319f..f7b10a05 100644 --- a/Minecraft.World/TheEndPortalFrameTile.cpp +++ b/Minecraft.World/TheEndPortalFrameTile.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "TheEndPortalFrameTile.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.world.h" #include "Facing.h" @@ -14,15 +15,15 @@ TheEndPortalFrameTile::TheEndPortalFrameTile(int id) : Tile(id, Material::glass, Icon *TheEndPortalFrameTile::getTexture(int face, int data) { - if (face == Facing::UP) + if (face == Facing::UP) { - return iconTop; - } - if (face == Facing::DOWN) + return iconTop; + } + if (face == Facing::DOWN) { - return Tile::whiteStone->getTexture(face); - } - return icon; + return Tile::endStone->getTexture(face); + } + return icon; } void TheEndPortalFrameTile::registerIcons(IconRegister *iconRegister) @@ -54,16 +55,16 @@ void TheEndPortalFrameTile::updateDefaultShape() void TheEndPortalFrameTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { - setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); - Tile::addAABBs(level, x, y, z, box, boxes, source); + setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); + Tile::addAABBs(level, x, y, z, box, boxes, source); - int data = level->getData(x, y, z); - if (hasEye(data)) + int data = level->getData(x, y, z); + if (hasEye(data)) { - setShape(5.0f / 16.0f, 13.0f / 16.0f, 5.0f / 16.0f, 11.0f / 16.0f, 1, 11.0f / 16.0f); - Tile::addAABBs(level, x, y, z, box, boxes, source); - } - updateDefaultShape(); + setShape(5.0f / 16.0f, 13.0f / 16.0f, 5.0f / 16.0f, 11.0f / 16.0f, 1, 11.0f / 16.0f); + Tile::addAABBs(level, x, y, z, box, boxes, source); + } + updateDefaultShape(); } bool TheEndPortalFrameTile::hasEye(int data) @@ -76,8 +77,27 @@ int TheEndPortalFrameTile::getResource(int data, Random *random, int playerBonus return 0; } -void TheEndPortalFrameTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void TheEndPortalFrameTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { - int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 2) % 4; - level->setData(x, y, z, dir); + int dir = (((Mth::floor(by->yRot * 4 / (360) + 0.5)) & 3) + 2) % 4; + level->setData(x, y, z, dir, Tile::UPDATE_CLIENTS); } + +bool TheEndPortalFrameTile::hasAnalogOutputSignal() +{ + return true; +} + +int TheEndPortalFrameTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + int data = level->getData(x, y, z); + + if (hasEye(data)) + { + return Redstone::SIGNAL_MAX; + } + else + { + return Redstone::SIGNAL_NONE; + } +} \ No newline at end of file diff --git a/Minecraft.World/TheEndPortalFrameTile.h b/Minecraft.World/TheEndPortalFrameTile.h index b48d3c09..d3119d00 100644 --- a/Minecraft.World/TheEndPortalFrameTile.h +++ b/Minecraft.World/TheEndPortalFrameTile.h @@ -12,15 +12,17 @@ private: Icon *iconEye; public: - TheEndPortalFrameTile(int id); - virtual Icon *getTexture(int face, int data); + TheEndPortalFrameTile(int id); + virtual Icon *getTexture(int face, int data); void registerIcons(IconRegister *iconRegister); Icon *getEye(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual int getRenderShape(); - virtual void updateDefaultShape(); - virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); - static bool hasEye(int data); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + virtual bool isSolidRender(bool isServerLevel = false); + virtual int getRenderShape(); + virtual void updateDefaultShape(); + virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); + static bool hasEye(int data); + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); }; \ No newline at end of file diff --git a/Minecraft.World/ThinFenceTile.cpp b/Minecraft.World/ThinFenceTile.cpp index bd1f1687..3f471ce4 100644 --- a/Minecraft.World/ThinFenceTile.cpp +++ b/Minecraft.World/ThinFenceTile.cpp @@ -32,7 +32,7 @@ bool ThinFenceTile::isCubeShaped() int ThinFenceTile::getRenderShape() { - return Tile::SHAPE_IRON_FENCE; + return material == Material::glass ? Tile::SHAPE_THIN_PANE : Tile::SHAPE_IRON_FENCE; } bool ThinFenceTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) @@ -134,7 +134,7 @@ Icon *ThinFenceTile::getEdgeTexture() bool ThinFenceTile::attachsTo(int tile) { - return Tile::solid[tile] || tile == id || tile == Tile::glass_Id; + return Tile::solid[tile] || tile == id || tile == Tile::glass_Id || tile == Tile::stained_glass_Id || tile == Tile::stained_glass_pane_Id; } bool ThinFenceTile::isSilkTouchable() diff --git a/Minecraft.World/ThinFenceTile.h b/Minecraft.World/ThinFenceTile.h index ca3c501f..eb310dd0 100644 --- a/Minecraft.World/ThinFenceTile.h +++ b/Minecraft.World/ThinFenceTile.h @@ -28,5 +28,5 @@ protected: shared_ptr getSilkTouchItemInstance(int data); public: - void registerIcons(IconRegister *iconRegister); + virtual void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/ThornsEnchantment.cpp b/Minecraft.World/ThornsEnchantment.cpp index e2d9f1fa..53668642 100644 --- a/Minecraft.World/ThornsEnchantment.cpp +++ b/Minecraft.World/ThornsEnchantment.cpp @@ -52,7 +52,7 @@ int ThornsEnchantment::getDamage(int level, Random *random) } } -void ThornsEnchantment::doThornsAfterAttack(shared_ptr source, shared_ptr target, Random *random) +void ThornsEnchantment::doThornsAfterAttack(shared_ptr source, shared_ptr target, Random *random) { int level = EnchantmentHelper::getArmorThorns(target); shared_ptr item = EnchantmentHelper::getRandomItemWith(Enchantment::thorns, target); @@ -64,14 +64,14 @@ void ThornsEnchantment::doThornsAfterAttack(shared_ptr source, shared_pt if (item != NULL) { - item->hurt(3, target); + item->hurtAndBreak(3, target); } } else { if (item != NULL) { - item->hurt(1, target); + item->hurtAndBreak(1, target); } } } \ No newline at end of file diff --git a/Minecraft.World/ThornsEnchantment.h b/Minecraft.World/ThornsEnchantment.h index 42f4326b..9383288a 100644 --- a/Minecraft.World/ThornsEnchantment.h +++ b/Minecraft.World/ThornsEnchantment.h @@ -16,5 +16,5 @@ public: virtual bool canEnchant(shared_ptr item); static bool shouldHit(int level, Random *random); static int getDamage(int level, Random *random); - static void doThornsAfterAttack(shared_ptr source, shared_ptr target, Random *random); + static void doThornsAfterAttack(shared_ptr source, shared_ptr target, Random *random); }; \ No newline at end of file diff --git a/Minecraft.World/Throwable.cpp b/Minecraft.World/Throwable.cpp index 2f9567a1..7d30b898 100644 --- a/Minecraft.World/Throwable.cpp +++ b/Minecraft.World/Throwable.cpp @@ -2,6 +2,7 @@ #include "net.minecraft.world.phys.h" #include "net.minecraft.world.entity.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" #include "com.mojang.nbt.h" #include "Throwable.h" @@ -18,6 +19,7 @@ void Throwable::_throwableInit() owner = nullptr; life = 0; flightTime = 0; + ownerName = L""; } Throwable::Throwable(Level *level) : Entity(level) @@ -37,21 +39,21 @@ bool Throwable::shouldRenderAtSqrDistance(double distance) return distance < size * size; } -Throwable::Throwable(Level *level, shared_ptr mob) : Entity(level) +Throwable::Throwable(Level *level, shared_ptr mob) : Entity(level) { _throwableInit(); - this->owner = mob; + owner = mob; setSize(4 / 16.0f, 4 / 16.0f); - this->moveTo(mob->x, mob->y + mob->getHeadHeight(), mob->z, mob->yRot, mob->xRot); + moveTo(mob->x, mob->y + mob->getHeadHeight(), mob->z, mob->yRot, mob->xRot); x -= cos(yRot / 180 * PI) * 0.16f; y -= 0.1f; z -= sin(yRot / 180 * PI) * 0.16f; - this->setPos(x, y, z); - this->heightOffset = 0; + setPos(x, y, z); + heightOffset = 0; float speed = 0.4f; @@ -69,8 +71,8 @@ Throwable::Throwable(Level *level, double x, double y, double z) : Entity(level) setSize(4 / 16.0f, 4 / 16.0f); - this->setPos(x, y, z); - this->heightOffset = 0; + setPos(x, y, z); + heightOffset = 0; } @@ -106,8 +108,8 @@ void Throwable::shoot(double xd, double yd, double zd, float pow, float uncertai float sd = (float) sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2(yd, (double)sd) * 180 / PI); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, (double)sd) * 180 / PI); life = 0; } @@ -119,8 +121,8 @@ void Throwable::lerpMotion(double xd, double yd, double zd) if (xRotO == 0 && yRotO == 0) { float sd = (float) sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2(yd, (double)sd) * 180 / PI); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, (double)sd) * 180 / PI); } } @@ -172,8 +174,9 @@ void Throwable::tick() if (!level->isClientSide) { shared_ptr hitEntity = nullptr; - vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); + vector > *objects = level->getEntities(shared_from_this(), bb->expand(xd, yd, zd)->grow(1, 1, 1)); double nearest = 0; + shared_ptr owner = getOwner(); for (int i = 0; i < objects->size(); i++) { shared_ptr e = objects->at(i); @@ -203,7 +206,14 @@ void Throwable::tick() if (res != NULL) { - onHit(res); + if ( (res->type == HitResult::TILE) && (level->getTile(res->x, res->y, res->z) == Tile::portalTile_Id) ) + { + handleInsidePortal(); + } + else + { + onHit(res); + } delete res; } x += xd; @@ -263,6 +273,13 @@ void Throwable::addAdditonalSaveData(CompoundTag *tag) tag->putByte(L"inTile", (byte) lastTile); tag->putByte(L"shake", (byte) shakeTime); tag->putByte(L"inGround", (byte) (inGround ? 1 : 0)); + + if (ownerName.empty() && (owner != NULL) && owner->instanceof(eTYPE_PLAYER) ) + { + ownerName = owner->getAName(); + } + + tag->putString(L"ownerName", ownerName.empty() ? L"" : ownerName); } void Throwable::readAdditionalSaveData(CompoundTag *tag) @@ -273,9 +290,20 @@ void Throwable::readAdditionalSaveData(CompoundTag *tag) lastTile = tag->getByte(L"inTile") & 0xff; shakeTime = tag->getByte(L"shake") & 0xff; inGround = tag->getByte(L"inGround") == 1; + ownerName = tag->getString(L"ownerName"); + if (ownerName.empty() ) ownerName = L""; } float Throwable::getShadowHeightOffs() { return 0; +} + +shared_ptr Throwable::getOwner() +{ + if (owner == NULL && !ownerName.empty() ) + { + owner = level->getPlayerByName(ownerName); + } + return owner; } \ No newline at end of file diff --git a/Minecraft.World/Throwable.h b/Minecraft.World/Throwable.h index 4d7daea0..217f2f1e 100644 --- a/Minecraft.World/Throwable.h +++ b/Minecraft.World/Throwable.h @@ -1,11 +1,12 @@ #pragma once #include "Entity.h" +#include "Projectile.h" class Mob; class HitResult; -class Throwable : public Entity +class Throwable : public Entity, public Projectile { private: int xTile; @@ -19,10 +20,10 @@ protected: public: int shakeTime; -protected: - shared_ptr owner; + shared_ptr owner; private: + wstring ownerName; int life; int flightTime; @@ -37,7 +38,7 @@ protected: public: virtual bool shouldRenderAtSqrDistance(double distance); - Throwable(Level *level, shared_ptr mob); + Throwable(Level *level, shared_ptr mob); Throwable(Level *level, double x, double y, double z); protected: @@ -57,4 +58,5 @@ public: virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); virtual float getShadowHeightOffs(); + virtual shared_ptr getOwner(); }; \ No newline at end of file diff --git a/Minecraft.World/ThrownEgg.cpp b/Minecraft.World/ThrownEgg.cpp index 45e5ca8c..1378e094 100644 --- a/Minecraft.World/ThrownEgg.cpp +++ b/Minecraft.World/ThrownEgg.cpp @@ -21,7 +21,7 @@ ThrownEgg::ThrownEgg(Level *level) : Throwable(level) _init(); } -ThrownEgg::ThrownEgg(Level *level, shared_ptr mob) : Throwable(level,mob) +ThrownEgg::ThrownEgg(Level *level, shared_ptr mob) : Throwable(level,mob) { _init(); } diff --git a/Minecraft.World/ThrownEgg.h b/Minecraft.World/ThrownEgg.h index 864755b7..324dc237 100644 --- a/Minecraft.World/ThrownEgg.h +++ b/Minecraft.World/ThrownEgg.h @@ -15,7 +15,7 @@ private: public: ThrownEgg(Level *level); - ThrownEgg(Level *level, shared_ptr mob); + ThrownEgg(Level *level, shared_ptr mob); ThrownEgg(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/ThrownEnderpearl.cpp b/Minecraft.World/ThrownEnderpearl.cpp index 1cddfb1f..1035bffd 100644 --- a/Minecraft.World/ThrownEnderpearl.cpp +++ b/Minecraft.World/ThrownEnderpearl.cpp @@ -16,7 +16,7 @@ ThrownEnderpearl::ThrownEnderpearl(Level *level) : Throwable(level) this->defineSynchedData(); } -ThrownEnderpearl::ThrownEnderpearl(Level *level, shared_ptr mob) : Throwable(level,mob) +ThrownEnderpearl::ThrownEnderpearl(Level *level, shared_ptr mob) : Throwable(level,mob) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called @@ -34,7 +34,7 @@ void ThrownEnderpearl::onHit(HitResult *res) { if (res->entity != NULL) { - DamageSource *damageSource = DamageSource::thrown(shared_from_this(), owner); + DamageSource *damageSource = DamageSource::thrown(shared_from_this(), getOwner() ); res->entity->hurt(damageSource, 0); delete damageSource; } @@ -47,14 +47,23 @@ void ThrownEnderpearl::onHit(HitResult *res) { // Fix for #67486 - TCR #001: BAS Game Stability: Customer Encountered: TU8: Code: Gameplay: The title crashes on Host's console when Client Player leaves the game before the Ender Pearl thrown by him touches the ground. // If the owner has been removed, then ignore - shared_ptr serverPlayer = dynamic_pointer_cast(owner); - if (serverPlayer != NULL && !serverPlayer->removed) + + // 4J-JEV: Cheap type check first. + if ( (getOwner() != NULL) && getOwner()->instanceof(eTYPE_SERVERPLAYER) ) { - if(!serverPlayer->connection->done && serverPlayer->level == this->level) + shared_ptr serverPlayer = dynamic_pointer_cast(getOwner() ); + if (!serverPlayer->removed) { - owner->teleportTo(x, y, z); - owner->fallDistance = 0; - owner->hurt(DamageSource::fall, 5); + if(!serverPlayer->connection->done && serverPlayer->level == this->level) + { + if (getOwner()->isRiding()) + { + getOwner()->ride(nullptr); + } + getOwner()->teleportTo(x, y, z); + getOwner()->fallDistance = 0; + getOwner()->hurt(DamageSource::fall, 5); + } } } remove(); diff --git a/Minecraft.World/ThrownEnderpearl.h b/Minecraft.World/ThrownEnderpearl.h index 6f16ebfc..2ce6ec1f 100644 --- a/Minecraft.World/ThrownEnderpearl.h +++ b/Minecraft.World/ThrownEnderpearl.h @@ -11,7 +11,7 @@ public: static Entity *create(Level *level) { return new ThrownEnderpearl(level); } ThrownEnderpearl(Level *level); - ThrownEnderpearl(Level *level, shared_ptr mob); + ThrownEnderpearl(Level *level, shared_ptr mob); ThrownEnderpearl(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/ThrownExpBottle.cpp b/Minecraft.World/ThrownExpBottle.cpp index 75d3d9a1..b8dbef96 100644 --- a/Minecraft.World/ThrownExpBottle.cpp +++ b/Minecraft.World/ThrownExpBottle.cpp @@ -11,7 +11,7 @@ ThrownExpBottle::ThrownExpBottle(Level *level) : Throwable(level) { } -ThrownExpBottle::ThrownExpBottle(Level *level, shared_ptr mob) : Throwable(level,mob) +ThrownExpBottle::ThrownExpBottle(Level *level, shared_ptr mob) : Throwable(level,mob) { } diff --git a/Minecraft.World/ThrownExpBottle.h b/Minecraft.World/ThrownExpBottle.h index 8430794b..4531e3e7 100644 --- a/Minecraft.World/ThrownExpBottle.h +++ b/Minecraft.World/ThrownExpBottle.h @@ -11,7 +11,7 @@ public: static Entity *create(Level *level) { return new ThrownExpBottle(level); } public: ThrownExpBottle(Level *level); - ThrownExpBottle(Level *level, shared_ptr mob); + ThrownExpBottle(Level *level, shared_ptr mob); ThrownExpBottle(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/ThrownPotion.cpp b/Minecraft.World/ThrownPotion.cpp index 7375d661..f99a0ecb 100644 --- a/Minecraft.World/ThrownPotion.cpp +++ b/Minecraft.World/ThrownPotion.cpp @@ -19,7 +19,7 @@ void ThrownPotion::_init() // the derived version of the function is called this->defineSynchedData(); - potionValue = 0; + potionItem = nullptr; } ThrownPotion::ThrownPotion(Level *level) : Throwable(level) @@ -27,17 +27,32 @@ ThrownPotion::ThrownPotion(Level *level) : Throwable(level) _init(); } -ThrownPotion::ThrownPotion(Level *level, shared_ptr mob, int potionValue) : Throwable(level,mob) +ThrownPotion::ThrownPotion(Level *level, shared_ptr mob, int potionValue) : Throwable(level,mob) { _init(); - this->potionValue = potionValue; + potionItem = shared_ptr( new ItemInstance(Item::potion, 1, potionValue)); +} + +ThrownPotion::ThrownPotion(Level *level, shared_ptr mob, shared_ptr potion) : Throwable(level, mob) +{ + _init(); + + potionItem = potion; } ThrownPotion::ThrownPotion(Level *level, double x, double y, double z, int potionValue) : Throwable(level,x,y,z) { _init(); - this->potionValue = potionValue; + + potionItem = shared_ptr( new ItemInstance(Item::potion, 1, potionValue)); +} + +ThrownPotion::ThrownPotion(Level *level, double x, double y, double z, shared_ptr potion) : Throwable(level, x, y, z) +{ + _init(); + + potionItem = potion; } float ThrownPotion::getGravity() @@ -57,24 +72,26 @@ float ThrownPotion::getThrowUpAngleOffset() void ThrownPotion::setPotionValue(int potionValue) { - this->potionValue = potionValue; + if (potionItem == NULL) potionItem = shared_ptr( new ItemInstance(Item::potion, 1, 0) ); + potionItem->setAuxValue(potionValue); } int ThrownPotion::getPotionValue() { - return potionValue; + if (potionItem == NULL) potionItem = shared_ptr( new ItemInstance(Item::potion, 1, 0) ); + return potionItem->getAuxValue(); } void ThrownPotion::onHit(HitResult *res) { if (!level->isClientSide) { - vector *mobEffects = Item::potion->getMobEffects(potionValue); + vector *mobEffects = Item::potion->getMobEffects(potionItem); if (mobEffects != NULL && !mobEffects->empty()) { AABB *aoe = bb->grow(SPLASH_RANGE, SPLASH_RANGE / 2, SPLASH_RANGE); - vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(Mob), aoe); + vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(LivingEntity), aoe); if (entitiesOfClass != NULL && !entitiesOfClass->empty()) { @@ -82,7 +99,7 @@ void ThrownPotion::onHit(HitResult *res) for(AUTO_VAR(it, entitiesOfClass->begin()); it != entitiesOfClass->end(); ++it) { //shared_ptr e = *it; - shared_ptr e = dynamic_pointer_cast( *it ); + shared_ptr e = dynamic_pointer_cast( *it ); double dist = distanceToSqr(e); if (dist < SPLASH_RANGE_SQ) { @@ -99,7 +116,7 @@ void ThrownPotion::onHit(HitResult *res) int id = effect->getId(); if (MobEffect::effects[id]->isInstantenous()) { - MobEffect::effects[id]->applyInstantenousEffect(this->owner, e, effect->getAmplifier(), scale); + MobEffect::effects[id]->applyInstantenousEffect(getOwner(), e, effect->getAmplifier(), scale); } else { @@ -115,7 +132,7 @@ void ThrownPotion::onHit(HitResult *res) } delete entitiesOfClass; } - level->levelEvent(LevelEvent::PARTICLES_POTION_SPLASH, (int) Math::round(x), (int) Math::round(y), (int) Math::round(z), potionValue); + level->levelEvent(LevelEvent::PARTICLES_POTION_SPLASH, (int) Math::round(x), (int) Math::round(y), (int) Math::round(z), getPotionValue() ); remove(); } @@ -125,12 +142,21 @@ void ThrownPotion::readAdditionalSaveData(CompoundTag *tag) { Throwable::readAdditionalSaveData(tag); - potionValue = tag->getInt(L"potionValue"); + if (tag->contains(L"Potion")) + { + potionItem = ItemInstance::fromTag(tag->getCompound(L"Potion")); + } + else + { + setPotionValue(tag->getInt(L"potionValue")); + } + + if (potionItem == NULL) remove(); } void ThrownPotion::addAdditonalSaveData(CompoundTag *tag) { Throwable::addAdditonalSaveData(tag); - tag->putInt(L"potionValue", potionValue); + if (potionItem != NULL) tag->putCompound(L"Potion", potionItem->save(new CompoundTag())); } \ No newline at end of file diff --git a/Minecraft.World/ThrownPotion.h b/Minecraft.World/ThrownPotion.h index cf27491c..ec6a14da 100644 --- a/Minecraft.World/ThrownPotion.h +++ b/Minecraft.World/ThrownPotion.h @@ -16,14 +16,16 @@ public: private: static const double SPLASH_RANGE_SQ; - int potionValue; + shared_ptr potionItem; void _init(); public: ThrownPotion(Level *level); - ThrownPotion(Level *level, shared_ptr mob, int potionValue); + ThrownPotion(Level *level, shared_ptr mob, int potionValue); + ThrownPotion(Level *level, shared_ptr mob, shared_ptr potion); ThrownPotion(Level *level, double x, double y, double z, int potionValue); + ThrownPotion(Level *level, double x, double y, double z, shared_ptr potion); protected: virtual float getGravity(); diff --git a/Minecraft.World/TickNextTickData.cpp b/Minecraft.World/TickNextTickData.cpp index 96771be1..277be1f8 100644 --- a/Minecraft.World/TickNextTickData.cpp +++ b/Minecraft.World/TickNextTickData.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" - +#include "net.minecraft.world.level.tile.h" #include "TickNextTickData.h" int64_t TickNextTickData::C = 0; @@ -13,41 +13,53 @@ TickNextTickData::TickNextTickData(int x, int y, int z, int tileId) this->y = y; this->z = z; this->tileId = tileId; + priorityTilt = 0; } -bool TickNextTickData::equals(const void *o) const +bool TickNextTickData::equals(const TickNextTickData *o) const { // TODO 4J Is this safe to cast it before we do a dynamic_cast? Will the dynamic_cast still fail? // We cannot dynamic_cast a void* - if ( dynamic_cast( (TickNextTickData *) o ) != NULL) + if ( o != NULL) { TickNextTickData *t = (TickNextTickData *) o; - return x == t->x && y == t->y && z == t->z && tileId == t->tileId; + return x == t->x && y == t->y && z == t->z && Tile::isMatching(tileId, t->tileId); } return false; } int TickNextTickData::hashCode() const { - return (((x * 1024 * 1024) + (z * 1024) + y) * 256) + tileId; + return (((x * 1024 * 1024) + (z * 1024) + y) * 256); } TickNextTickData *TickNextTickData::delay(int64_t l) { - this->m_delay = l; + m_delay = l; return this; } +void TickNextTickData::setPriorityTilt(int priorityTilt) +{ + this->priorityTilt = priorityTilt; +} + int TickNextTickData::compareTo(const TickNextTickData *tnd) const { if (m_delay < tnd->m_delay) return -1; if (m_delay > tnd->m_delay) return 1; + if (priorityTilt != tnd->priorityTilt) return priorityTilt - tnd->priorityTilt; if (c < tnd->c) return -1; if (c > tnd->c) return 1; return 0; } +bool TickNextTickData::operator==(const TickNextTickData &k) +{ + return equals( &k ); +} + //A class that takes two arguments of the same type as the container elements and returns a bool. //The expression comp(a,b), where comp is an object of this comparison class and a and b are elements of the container, //shall return true if a is to be placed at an earlier position than b in a strict weak ordering operation. @@ -65,5 +77,5 @@ int TickNextTickData::hash_fnct(const TickNextTickData &k) bool TickNextTickData::eq_test(const TickNextTickData &x, const TickNextTickData &y) { - return ( x.x == y.x ) && ( x.y == y.y ) && ( x.z == y.z ) && ( x.tileId == y.tileId ); + return x.equals(&y); } \ No newline at end of file diff --git a/Minecraft.World/TickNextTickData.h b/Minecraft.World/TickNextTickData.h index c83f6993..04d9ed5e 100644 --- a/Minecraft.World/TickNextTickData.h +++ b/Minecraft.World/TickNextTickData.h @@ -12,7 +12,8 @@ private: public: int x, y, z, tileId; - int64_t m_delay; + __int64 m_delay; + int priorityTilt; private: int64_t c; @@ -20,14 +21,16 @@ private: public: TickNextTickData(int x, int y, int z, int tileId); - bool equals(const void *o) const; + bool equals(const TickNextTickData *o) const; int hashCode() const; - TickNextTickData *delay(int64_t l); + TickNextTickData *delay(__int64 l); + void setPriorityTilt(int priorityTilt); int compareTo(const TickNextTickData *tnd) const; static bool compare_fnct(const TickNextTickData &x, const TickNextTickData &y); static int hash_fnct(const TickNextTickData &k); static bool eq_test(const TickNextTickData &x, const TickNextTickData &y); + bool operator==(const TickNextTickData &k); }; struct TickNextTickDataKeyHash diff --git a/Minecraft.World/Tile.cpp b/Minecraft.World/Tile.cpp index e0ef8dd9..df4e407e 100644 --- a/Minecraft.World/Tile.cpp +++ b/Minecraft.World/Tile.cpp @@ -10,6 +10,7 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.food.h" #include "net.minecraft.world.h" @@ -43,10 +44,10 @@ bool Tile::propagate[TILE_NUM_COUNT]; Tile **Tile::tiles = NULL; -Tile *Tile::rock = NULL; +Tile *Tile::stone = NULL; GrassTile *Tile::grass = NULL; Tile *Tile::dirt = NULL; -Tile *Tile::stoneBrick = NULL; +Tile *Tile::cobblestone = NULL; Tile *Tile::wood = NULL; Tile *Tile::sapling = NULL; Tile *Tile::unbreakable = NULL; @@ -67,7 +68,7 @@ Tile *Tile::lapisOre = NULL; Tile *Tile::lapisBlock = NULL; Tile *Tile::dispenser = NULL; Tile *Tile::sandStone = NULL; -Tile *Tile::musicBlock = NULL; +Tile *Tile::noteblock = NULL; Tile *Tile::bed = NULL; Tile *Tile::goldenRail = NULL; Tile *Tile::detectorRail = NULL; @@ -77,12 +78,12 @@ TallGrass *Tile::tallgrass = NULL; DeadBushTile *Tile::deadBush = NULL; PistonBaseTile *Tile::pistonBase = NULL; PistonExtensionTile *Tile::pistonExtension = NULL; -Tile *Tile::cloth = NULL; +Tile *Tile::wool = NULL; PistonMovingPiece *Tile::pistonMovingPiece = NULL; Bush *Tile::flower = NULL; Bush *Tile::rose = NULL; -Bush *Tile::mushroom1 = NULL; -Bush *Tile::mushroom2 = NULL; +Bush *Tile::mushroom_brown = NULL; +Bush *Tile::mushroom_red = NULL; Tile *Tile::goldBlock = NULL; Tile *Tile::ironBlock = NULL; HalfSlabTile *Tile::stoneSlab = NULL; @@ -90,7 +91,7 @@ HalfSlabTile *Tile::stoneSlabHalf = NULL; Tile *Tile::redBrick = NULL; Tile *Tile::tnt = NULL; Tile *Tile::bookshelf = NULL; -Tile *Tile::mossStone = NULL; +Tile *Tile::mossyCobblestone = NULL; Tile *Tile::obsidian = NULL; Tile *Tile::torch = NULL; FireTile *Tile::fire = NULL; @@ -101,7 +102,7 @@ RedStoneDustTile *Tile::redStoneDust = NULL; Tile *Tile::diamondOre = NULL; Tile *Tile::diamondBlock = NULL; Tile *Tile::workBench = NULL; -Tile *Tile::crops = NULL; +Tile *Tile::wheat = NULL; Tile *Tile::farmland = NULL; Tile *Tile::furnace = NULL; Tile *Tile::furnace_lit = NULL; @@ -117,8 +118,8 @@ Tile *Tile::door_iron = NULL; Tile *Tile::pressurePlate_wood = NULL; Tile *Tile::redStoneOre = NULL; Tile *Tile::redStoneOre_lit = NULL; -Tile *Tile::notGate_off = NULL; -Tile *Tile::notGate_on = NULL; +Tile *Tile::redstoneTorch_off = NULL; +Tile *Tile::redstoneTorch_on = NULL; Tile *Tile::button = NULL; Tile *Tile::topSnow = NULL; Tile *Tile::ice = NULL; @@ -126,24 +127,24 @@ Tile *Tile::snow = NULL; Tile *Tile::cactus = NULL; Tile *Tile::clay = NULL; Tile *Tile::reeds = NULL; -Tile *Tile::recordPlayer = NULL; +Tile *Tile::jukebox = NULL; Tile *Tile::fence = NULL; Tile *Tile::pumpkin = NULL; -Tile *Tile::hellRock = NULL; -Tile *Tile::hellSand = NULL; -Tile *Tile::lightGem = NULL; +Tile *Tile::netherRack = NULL; +Tile *Tile::soulsand = NULL; +Tile *Tile::glowstone = NULL; PortalTile *Tile::portalTile = NULL; Tile *Tile::litPumpkin = NULL; Tile *Tile::cake = NULL; RepeaterTile *Tile::diode_off = NULL; RepeaterTile *Tile::diode_on = NULL; -Tile *Tile::aprilFoolsJoke = NULL; +Tile *Tile::stained_glass = NULL; Tile *Tile::trapdoor = NULL; Tile *Tile::monsterStoneEgg = NULL; -Tile *Tile::stoneBrickSmooth = NULL; -Tile *Tile::hugeMushroom1 = NULL; -Tile *Tile::hugeMushroom2 = NULL; +Tile *Tile::stoneBrick = NULL; +Tile *Tile::hugeMushroom_brown = NULL; +Tile *Tile::hugeMushroom_red = NULL; Tile *Tile::ironFence = NULL; Tile *Tile::thinGlass = NULL; Tile *Tile::melon = NULL; @@ -165,7 +166,7 @@ Tile *Tile::brewingStand = NULL; CauldronTile *Tile::cauldron = NULL; Tile *Tile::endPortalTile = NULL; Tile *Tile::endPortalFrameTile = NULL; -Tile *Tile::whiteStone = NULL; +Tile *Tile::endStone = NULL; Tile *Tile::dragonEgg = NULL; Tile *Tile::redstoneLight = NULL; Tile *Tile::redstoneLight_lit = NULL; @@ -175,7 +176,8 @@ Tile *Tile::stairs_sandstone = NULL; Tile *Tile::woodStairsDark = NULL; Tile *Tile::woodStairsBirch = NULL; Tile *Tile::woodStairsJungle = NULL; - +Tile *Tile::commandBlock = NULL; +BeaconTile *Tile::beacon = NULL; Tile *Tile::button_wood = NULL; HalfSlabTile *Tile::woodSlab = NULL; HalfSlabTile *Tile::woodSlabHalf = NULL; @@ -185,7 +187,7 @@ Tile *Tile::enderChest = NULL; TripWireSourceTile *Tile::tripWireSource = NULL; Tile *Tile::tripWire = NULL; Tile *Tile::emeraldBlock = NULL; - + Tile *Tile::cocoa = NULL; Tile *Tile::skull = NULL; @@ -195,11 +197,28 @@ Tile *Tile::flowerPot = NULL; Tile *Tile::carrots = NULL; Tile *Tile::potatoes = NULL; Tile *Tile::anvil = NULL; +Tile *Tile::chest_trap = NULL; +Tile *Tile::weightedPlate_light = NULL; +Tile *Tile::weightedPlate_heavy = NULL; +ComparatorTile *Tile::comparator_off = NULL; +ComparatorTile *Tile::comparator_on = NULL; + +DaylightDetectorTile *Tile::daylightDetector = NULL; +Tile *Tile::redstoneBlock = NULL; + Tile *Tile::netherQuartz = NULL; +HopperTile *Tile::hopper = NULL; Tile *Tile::quartzBlock = NULL; Tile *Tile::stairs_quartz = NULL; +Tile *Tile::activatorRail = NULL; +Tile *Tile::dropper = NULL; +Tile *Tile::clayHardened_colored = NULL; +Tile *Tile::stained_glass_pane = NULL; +Tile *Tile::hayBlock = NULL; Tile *Tile::woolCarpet = NULL; +Tile *Tile::clayHardened = NULL; +Tile *Tile::coalBlock = NULL; DWORD Tile::tlsIdxShape = TlsAlloc(); @@ -239,216 +258,219 @@ void Tile::staticCtor() Tile::tiles = new Tile *[TILE_NUM_COUNT]; memset( tiles, 0, sizeof( Tile *)*TILE_NUM_COUNT ); - Tile::rail = (new RailTile(66, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_iron)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"rail")->setDescriptionId(IDS_TILE_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_RAIL)->disableMipmap(); - Tile::goldenRail = (new RailTile(27, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_gold)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"goldenRail")->setDescriptionId(IDS_TILE_GOLDEN_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_POWEREDRAIL)->disableMipmap(); - Tile::detectorRail = (new DetectorRailTile(28)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_detector)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"detectorRail")->setDescriptionId(IDS_TILE_DETECTOR_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_DETECTORRAIL)->disableMipmap(); - - Tile::goldBlock = (new MetalTile(41)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_gold)->setDestroyTime(3.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"blockGold")->setDescriptionId(IDS_TILE_BLOCK_GOLD)->setUseDescriptionId(IDS_DESC_BLOCK_GOLD); - Tile::ironBlock = (new MetalTile(42)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_iron)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"blockIron")->setDescriptionId(IDS_TILE_BLOCK_IRON)->setUseDescriptionId(IDS_DESC_BLOCK_IRON); - Tile::lapisBlock = (new Tile(22, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_lapis)->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"blockLapis")->setDescriptionId(IDS_TILE_BLOCK_LAPIS)->setUseDescriptionId(IDS_DESC_BLOCK_LAPIS); - Tile::musicBlock = (new MusicTile(25)) ->setDestroyTime(0.8f)->setTextureName(L"musicBlock")->setDescriptionId(IDS_TILE_MUSIC_BLOCK)->sendTileData()->setUseDescriptionId(IDS_DESC_NOTEBLOCK); - Tile::diamondBlock = (new MetalTile(57)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_diamond)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"blockDiamond")->setDescriptionId(IDS_TILE_BLOCK_DIAMOND)->setUseDescriptionId(IDS_DESC_BLOCK_DIAMOND); - - Tile::goldOre = (new OreTile(14)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"oreGold")->setDescriptionId(IDS_TILE_ORE_GOLD)->setUseDescriptionId(IDS_DESC_ORE_GOLD); - Tile::ironOre = (new OreTile(15)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"oreIron")->setDescriptionId(IDS_TILE_ORE_IRON)->setUseDescriptionId(IDS_DESC_ORE_IRON); - Tile::coalOre = (new OreTile(16)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"oreCoal")->setDescriptionId(IDS_TILE_ORE_COAL)->setUseDescriptionId(IDS_DESC_ORE_COAL); - Tile::lapisOre = (new OreTile(21)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"oreLapis")->setDescriptionId(IDS_TILE_ORE_LAPIS)->setUseDescriptionId(IDS_DESC_ORE_LAPIS); - Tile::diamondOre = (new OreTile(56)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"oreDiamond")->setDescriptionId(IDS_TILE_ORE_DIAMOND)->setUseDescriptionId(IDS_DESC_ORE_DIAMOND); - - - Tile::rock = (new StoneTile(1)) ->setDestroyTime(1.5f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"stone")->setDescriptionId(IDS_TILE_STONE)->setUseDescriptionId(IDS_DESC_STONE); - Tile::grass = (GrassTile *) (new GrassTile(2)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"grass")->setDescriptionId(IDS_TILE_GRASS)->setUseDescriptionId(IDS_DESC_GRASS); - Tile::dirt = (new DirtTile(3)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_GRAVEL)->setTextureName(L"dirt")->setDescriptionId(IDS_TILE_DIRT)->setUseDescriptionId(IDS_DESC_DIRT); - Tile::sapling = (new Sapling(6)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->sendTileData()->setUseDescriptionId(IDS_DESC_SAPLING)->disableMipmap(); - Tile::unbreakable = (new Tile(7, Material::stone)) ->setIndestructible()->setExplodeable(6000000)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"bedrock")->setDescriptionId(IDS_TILE_BEDROCK)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_BEDROCK); - Tile::water = (LiquidTile *)(new LiquidTileDynamic(8, Material::water)) ->setDestroyTime(100.0f)->setLightBlock(3)->setTextureName(L"water")->setDescriptionId(IDS_TILE_WATER)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_WATER); - Tile::calmWater = (new LiquidTileStatic(9, Material::water))->setDestroyTime(100.0f)->setLightBlock(3)->setTextureName(L"water")->setDescriptionId(IDS_TILE_WATER)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_WATER); - Tile::lava = (LiquidTile *)(new LiquidTileDynamic(10, Material::lava)) ->setDestroyTime(00.0f)->setLightEmission(1.0f)->setLightBlock(255)->setTextureName(L"lava")->setDescriptionId(IDS_TILE_LAVA)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_LAVA); - Tile::calmLava = (new LiquidTileStatic(11, Material::lava)) ->setDestroyTime(100.0f)->setLightEmission(1.0f)->setLightBlock(255)->setTextureName(L"lava")->setDescriptionId(IDS_TILE_LAVA)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_LAVA); - Tile::sand = (new HeavyTile(12)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_SAND)->setTextureName(L"sand")->setDescriptionId(IDS_TILE_SAND)->setUseDescriptionId(IDS_DESC_SAND); - Tile::gravel = (new GravelTile(13)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setTextureName(L"gravel")->setDescriptionId(IDS_TILE_GRAVEL)->setUseDescriptionId(IDS_DESC_GRAVEL); - Tile::treeTrunk = (new TreeTile(17))->setDestroyTime(2.0f) ->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"log")->setDescriptionId(IDS_TILE_LOG)->sendTileData()->setUseDescriptionId(IDS_DESC_LOG); + Tile::stone = (new StoneTile(1)) ->setDestroyTime(1.5f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"stone")->setDescriptionId(IDS_TILE_STONE)->setUseDescriptionId(IDS_DESC_STONE); + Tile::grass = (GrassTile *) (new GrassTile(2)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"grass")->setDescriptionId(IDS_TILE_GRASS)->setUseDescriptionId(IDS_DESC_GRASS); + Tile::dirt = (new DirtTile(3)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"dirt")->setDescriptionId(IDS_TILE_DIRT)->setUseDescriptionId(IDS_DESC_DIRT); + Tile::cobblestone = (new Tile(4, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"cobblestone")->setDescriptionId(IDS_TILE_STONE_BRICK)->setUseDescriptionId(IDS_DESC_STONE_BRICK); + Tile::wood = (new WoodTile(5)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structwoodstuff, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"planks")->setDescriptionId(IDS_TILE_OAKWOOD_PLANKS)->sendTileData()->setUseDescriptionId(IDS_DESC_WOODENPLANKS); + Tile::sapling = (new Sapling(6)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->sendTileData()->setUseDescriptionId(IDS_DESC_SAPLING)->disableMipmap(); + Tile::unbreakable = (new Tile(7, Material::stone)) ->setIndestructible()->setExplodeable(6000000)->setSoundType(Tile::SOUND_STONE)->setIconName(L"bedrock")->setDescriptionId(IDS_TILE_BEDROCK)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_BEDROCK); + Tile::water = (LiquidTile *)(new LiquidTileDynamic(8, Material::water)) ->setDestroyTime(100.0f)->setLightBlock(3)->setIconName(L"water_flow")->setDescriptionId(IDS_TILE_WATER)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_WATER); + Tile::calmWater = (new LiquidTileStatic(9, Material::water)) ->setDestroyTime(100.0f)->setLightBlock(3)->setIconName(L"water_still")->setDescriptionId(IDS_TILE_WATER)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_WATER); + Tile::lava = (LiquidTile *)(new LiquidTileDynamic(10, Material::lava)) ->setDestroyTime(00.0f)->setLightEmission(1.0f)->setLightBlock(255)->setIconName(L"lava_flow")->setDescriptionId(IDS_TILE_LAVA)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_LAVA); + + Tile::calmLava = (new LiquidTileStatic(11, Material::lava)) ->setDestroyTime(100.0f)->setLightEmission(1.0f)->setLightBlock(255)->setIconName(L"lava_still")->setDescriptionId(IDS_TILE_LAVA)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_LAVA); + Tile::sand = (new HeavyTile(12)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_SAND)->setIconName(L"sand")->setDescriptionId(IDS_TILE_SAND)->setUseDescriptionId(IDS_DESC_SAND); + Tile::gravel = (new GravelTile(13)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"gravel")->setDescriptionId(IDS_TILE_GRAVEL)->setUseDescriptionId(IDS_DESC_GRAVEL); + Tile::goldOre = (new OreTile(14)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"gold_ore")->setDescriptionId(IDS_TILE_ORE_GOLD)->setUseDescriptionId(IDS_DESC_ORE_GOLD); + Tile::ironOre = (new OreTile(15)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"iron_ore")->setDescriptionId(IDS_TILE_ORE_IRON)->setUseDescriptionId(IDS_DESC_ORE_IRON); + Tile::coalOre = (new OreTile(16)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"coal_ore")->setDescriptionId(IDS_TILE_ORE_COAL)->setUseDescriptionId(IDS_DESC_ORE_COAL); + Tile::treeTrunk = (new TreeTile(17))->setDestroyTime(2.0f) ->setSoundType(Tile::SOUND_WOOD)->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->sendTileData()->setUseDescriptionId(IDS_DESC_LOG); // 4J - for leaves, have specified that only the data bits that encode the type of leaf are important to be sent - Tile::leaves = (LeafTile *)(new LeafTile(18)) ->setDestroyTime(0.2f)->setLightBlock(1)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->sendTileData(LeafTile::LEAF_TYPE_MASK)->setUseDescriptionId(IDS_DESC_LEAVES); - Tile::sponge = (new Sponge(19)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"sponge")->setDescriptionId(IDS_TILE_SPONGE)->setUseDescriptionId(IDS_DESC_SPONGE); - Tile::glass = (new GlassTile(20, Material::glass, false)) ->setDestroyTime(0.3f)->setSoundType(Tile::SOUND_GLASS)->setTextureName(L"glass")->setDescriptionId(IDS_TILE_GLASS)->setUseDescriptionId(IDS_DESC_GLASS); - Tile::dispenser = (new DispenserTile(23)) ->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"dispenser")->setDescriptionId(IDS_TILE_DISPENSER)->sendTileData()->setUseDescriptionId(IDS_DESC_DISPENSER); - - //Tile::wood = (new Tile(5, 4, Material::wood)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structwoodstuff, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_WOOD)->setDescriptionId(IDS_TILE_WOOD)->sendTileData()->setUseDescriptionId(IDS_DESC_WOODENPLANKS); - Tile::wood = (new WoodTile(5)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structwoodstuff, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"wood")->setDescriptionId(IDS_TILE_OAKWOOD_PLANKS)->sendTileData()->setUseDescriptionId(IDS_DESC_WOODENPLANKS); - Tile::sandStone = (new SandStoneTile(24)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_sand)->setSoundType(Tile::SOUND_STONE)->setDestroyTime(0.8f)->sendTileData()->setTextureName(L"sandStone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE)->sendTileData(); - Tile::stoneBrick = (new Tile(4, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"stonebrick")->setDescriptionId(IDS_TILE_STONE_BRICK)->setUseDescriptionId(IDS_DESC_STONE_BRICK); - Tile::redBrick = (new Tile(45, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_brick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"brick")->setDescriptionId(IDS_TILE_BRICK)->setUseDescriptionId(IDS_DESC_BRICK); - Tile::clay = (new ClayTile(82)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_clay)->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setTextureName(L"clay")->setDescriptionId(IDS_TILE_CLAY)->setUseDescriptionId(IDS_DESC_CLAY_TILE); - Tile::snow = (new SnowTile(80)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_snow)->setDestroyTime(0.2f)->setSoundType(Tile::SOUND_CLOTH)->setTextureName(L"snow")->setDescriptionId(IDS_TILE_SNOW)->setUseDescriptionId(IDS_DESC_SNOW); - - Tile::torch = (new TorchTile(50)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_wood)->setDestroyTime(0.0f)->setLightEmission(15 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"torch")->setDescriptionId(IDS_TILE_TORCH)->sendTileData()->setUseDescriptionId(IDS_DESC_TORCH)->disableMipmap(); - Tile::litPumpkin = (new PumpkinTile(91, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_pumpkin)->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setLightEmission(1.0f)->setTextureName(L"litpumpkin")->setDescriptionId(IDS_TILE_LIT_PUMPKIN)->sendTileData()->setUseDescriptionId(IDS_DESC_JACKOLANTERN); - Tile::lightGem = (new LightGemTile(89, Material::glass)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_glowstone)->setDestroyTime(0.3f)->setSoundType(Tile::SOUND_GLASS)->setLightEmission(1.0f)->setTextureName(L"lightgem")->setDescriptionId(IDS_TILE_LIGHT_GEM)->setUseDescriptionId(IDS_DESC_GLOWSTONE); - - Tile::trapdoor = (new TrapDoorTile(96, Material::wood)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_door, Item::eMaterial_trap)->setDestroyTime(3.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"trapdoor")->setDescriptionId(IDS_TILE_TRAPDOOR)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_TRAPDOOR); - - Tile::bed = (new BedTile(26)) ->setDestroyTime(0.2f)->setTextureName(L"bed")->setDescriptionId(IDS_TILE_BED)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_BED); - Tile::pistonStickyBase = (PistonBaseTile *)(new PistonBaseTile(29, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_piston, Item::eMaterial_stickypiston)->setTextureName(L"pistonStickyBase")->setDescriptionId(IDS_TILE_PISTON_STICK_BASE)->setUseDescriptionId(IDS_DESC_STICKY_PISTON)->sendTileData(); - Tile::web = (new WebTile(30)) ->setLightBlock(1)->setDestroyTime(4.0f)->setTextureName(L"web")->setDescriptionId(IDS_TILE_WEB)->setUseDescriptionId(IDS_DESC_WEB); - Tile::tallgrass = (TallGrass *)(new TallGrass(31)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"tallgrass")->setDescriptionId(IDS_TILE_TALL_GRASS)->setUseDescriptionId(IDS_DESC_TALL_GRASS)->disableMipmap(); - Tile::deadBush = (DeadBushTile *)(new DeadBushTile(32)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"deadbush")->setDescriptionId(IDS_TILE_DEAD_BUSH)->setUseDescriptionId(IDS_DESC_DEAD_BUSH)->disableMipmap(); - Tile::pistonBase = (PistonBaseTile *)(new PistonBaseTile(33,false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_piston, Item::eMaterial_piston)->setTextureName(L"pistonBase")->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(IDS_DESC_PISTON)->sendTileData(); - Tile::pistonExtension = (PistonExtensionTile *)(new PistonExtensionTile(34)) ->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(-1)->sendTileData(); - - Tile::cloth = (new ClothTile()) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_cloth, Item::eMaterial_cloth)->setDestroyTime(0.8f)->setSoundType(Tile::SOUND_CLOTH)->setTextureName(L"cloth")->setDescriptionId(IDS_TILE_CLOTH)->sendTileData()->setUseDescriptionId(IDS_DESC_WOOL); + Tile::leaves = (LeafTile *)(new LeafTile(18)) ->setDestroyTime(0.2f)->setLightBlock(1)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->sendTileData(LeafTile::LEAF_TYPE_MASK)->setUseDescriptionId(IDS_DESC_LEAVES); + Tile::sponge = (new Sponge(19)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"sponge")->setDescriptionId(IDS_TILE_SPONGE)->setUseDescriptionId(IDS_DESC_SPONGE); + Tile::glass = (new GlassTile(20, Material::glass, false)) ->setDestroyTime(0.3f)->setSoundType(Tile::SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_GLASS)->setUseDescriptionId(IDS_DESC_GLASS); + + Tile::lapisOre = (new OreTile(21)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"lapis_ore")->setDescriptionId(IDS_TILE_ORE_LAPIS)->setUseDescriptionId(IDS_DESC_ORE_LAPIS); + Tile::lapisBlock = (new Tile(22, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_lapis)->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"lapis_block")->setDescriptionId(IDS_TILE_BLOCK_LAPIS)->setUseDescriptionId(IDS_DESC_BLOCK_LAPIS); + Tile::dispenser = (new DispenserTile(23)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_redstoneContainer, Item::eMaterial_undefined)->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setIconName(L"dispenser")->setDescriptionId(IDS_TILE_DISPENSER)->sendTileData()->setUseDescriptionId(IDS_DESC_DISPENSER); + Tile::sandStone = (new SandStoneTile(24)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_sand)->setSoundType(Tile::SOUND_STONE)->setDestroyTime(0.8f)->sendTileData()->setIconName(L"sandstone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE)->sendTileData(); + Tile::noteblock = (new NoteBlockTile(25)) ->setDestroyTime(0.8f)->setIconName(L"noteblock")->setDescriptionId(IDS_TILE_MUSIC_BLOCK)->sendTileData()->setUseDescriptionId(IDS_DESC_NOTEBLOCK); + Tile::bed = (new BedTile(26)) ->setDestroyTime(0.2f)->setIconName(L"bed")->setDescriptionId(IDS_TILE_BED)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_BED); + Tile::goldenRail = (new PoweredRailTile(27)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_gold)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"rail_golden")->setDescriptionId(IDS_TILE_GOLDEN_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_POWEREDRAIL)->disableMipmap(); + Tile::detectorRail = (new DetectorRailTile(28)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_detector)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"rail_detector")->setDescriptionId(IDS_TILE_DETECTOR_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_DETECTORRAIL)->disableMipmap(); + Tile::pistonStickyBase = (PistonBaseTile *)(new PistonBaseTile(29, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_piston, Item::eMaterial_stickypiston)->setIconName(L"pistonStickyBase")->setDescriptionId(IDS_TILE_PISTON_STICK_BASE)->setUseDescriptionId(IDS_DESC_STICKY_PISTON)->sendTileData(); + Tile::web = (new WebTile(30)) ->setLightBlock(1)->setDestroyTime(4.0f)->setIconName(L"web")->setDescriptionId(IDS_TILE_WEB)->setUseDescriptionId(IDS_DESC_WEB); + + Tile::tallgrass = (TallGrass *)(new TallGrass(31)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"tallgrass")->setDescriptionId(IDS_TILE_TALL_GRASS)->setUseDescriptionId(IDS_DESC_TALL_GRASS)->disableMipmap(); + Tile::deadBush = (DeadBushTile *)(new DeadBushTile(32)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"deadbush")->setDescriptionId(IDS_TILE_DEAD_BUSH)->setUseDescriptionId(IDS_DESC_DEAD_BUSH)->disableMipmap(); + Tile::pistonBase = (PistonBaseTile *)(new PistonBaseTile(33,false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_piston, Item::eMaterial_piston)->setIconName(L"pistonBase")->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(IDS_DESC_PISTON)->sendTileData(); + Tile::pistonExtension = (PistonExtensionTile *)(new PistonExtensionTile(34))->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(-1)->sendTileData(); + Tile::wool = (new ColoredTile(35, Material::cloth)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_cloth, Item::eMaterial_cloth)->setDestroyTime(0.8f)->setSoundType(Tile::SOUND_CLOTH)->setIconName(L"wool_colored")->setDescriptionId(IDS_TILE_CLOTH)->sendTileData()->setUseDescriptionId(IDS_DESC_WOOL); Tile::pistonMovingPiece = (PistonMovingPiece *)(new PistonMovingPiece(36)) ->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(-1); + Tile::flower = (Bush *) (new Bush(37)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"flower_dandelion")->setDescriptionId(IDS_TILE_FLOWER)->setUseDescriptionId(IDS_DESC_FLOWER)->disableMipmap(); + Tile::rose = (Bush *) (new Bush(38)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"flower_rose")->setDescriptionId(IDS_TILE_ROSE)->setUseDescriptionId(IDS_DESC_FLOWER)->disableMipmap(); + Tile::mushroom_brown = (Bush *) (new Mushroom(39)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setLightEmission(2 / 16.0f)->setIconName(L"mushroom_brown")->setDescriptionId(IDS_TILE_MUSHROOM)->setUseDescriptionId(IDS_DESC_MUSHROOM)->disableMipmap(); + Tile::mushroom_red = (Bush *) (new Mushroom(40)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"mushroom_red")->setDescriptionId(IDS_TILE_MUSHROOM)->setUseDescriptionId(IDS_DESC_MUSHROOM)->disableMipmap(); + + Tile::goldBlock = (new MetalTile(41)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_gold)->setDestroyTime(3.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setIconName(L"gold_block")->setDescriptionId(IDS_TILE_BLOCK_GOLD)->setUseDescriptionId(IDS_DESC_BLOCK_GOLD); + Tile::ironBlock = (new MetalTile(42)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_iron)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setIconName(L"iron_block")->setDescriptionId(IDS_TILE_BLOCK_IRON)->setUseDescriptionId(IDS_DESC_BLOCK_IRON); + Tile::stoneSlab = (HalfSlabTile *) (new StoneSlabTile(Tile::stoneSlab_Id, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_slab, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_SLAB); + Tile::stoneSlabHalf = (HalfSlabTile *) (new StoneSlabTile(Tile::stoneSlabHalf_Id, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_halfslab, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_HALFSLAB); + Tile::redBrick = (new Tile(45, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_brick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"brick")->setDescriptionId(IDS_TILE_BRICK)->setUseDescriptionId(IDS_DESC_BRICK); + Tile::tnt = (new TntTile(46)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"tnt")->setDescriptionId(IDS_TILE_TNT)->setUseDescriptionId(IDS_DESC_TNT); + Tile::bookshelf = (new BookshelfTile(47)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_paper, Item::eMaterial_bookshelf)->setDestroyTime(1.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"bookshelf")->setDescriptionId(IDS_TILE_BOOKSHELF)->setUseDescriptionId(IDS_DESC_BOOKSHELF); + Tile::mossyCobblestone = (new Tile(48, Material::stone)) ->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"cobblestone_mossy")->setDescriptionId(IDS_TILE_STONE_MOSS)->setUseDescriptionId(IDS_DESC_MOSS_STONE); + Tile::obsidian = (new ObsidianTile(49)) ->setDestroyTime(50.0f)->setExplodeable(2000)->setSoundType(Tile::SOUND_STONE)->setIconName(L"obsidian")->setDescriptionId(IDS_TILE_OBSIDIAN)->setUseDescriptionId(IDS_DESC_OBSIDIAN); + Tile::torch = (new TorchTile(50)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_wood)->setDestroyTime(0.0f)->setLightEmission(15 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"torch_on")->setDescriptionId(IDS_TILE_TORCH)->setUseDescriptionId(IDS_DESC_TORCH)->disableMipmap(); + + Tile::fire = (FireTile *) ((new FireTile(51)) ->setDestroyTime(0.0f)->setLightEmission(1.0f)->setSoundType(Tile::SOUND_WOOD))->setIconName(L"fire")->setDescriptionId(IDS_TILE_FIRE)->setNotCollectStatistics()->setUseDescriptionId(-1); + Tile::mobSpawner = (new MobSpawnerTile(52)) ->setDestroyTime(5.0f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"mob_spawner")->setDescriptionId(IDS_TILE_MOB_SPAWNER)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_MOB_SPAWNER); + Tile::stairs_wood = (new StairTile(53, Tile::wood,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_wood) ->setIconName(L"stairsWood")->setDescriptionId(IDS_TILE_STAIRS_WOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::chest = (ChestTile *)(new ChestTile(54, ChestTile::TYPE_BASIC)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_chest, Item::eMaterial_wood)->setDestroyTime(2.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"chest")->setDescriptionId(IDS_TILE_CHEST)->sendTileData()->setUseDescriptionId(IDS_DESC_CHEST); + Tile::redStoneDust = (RedStoneDustTile *)(new RedStoneDustTile(55)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_NORMAL)->setIconName(L"redstone_dust")->setDescriptionId(IDS_TILE_REDSTONE_DUST)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONE_DUST); + Tile::diamondOre = (new OreTile(56)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"diamond_ore")->setDescriptionId(IDS_TILE_ORE_DIAMOND)->setUseDescriptionId(IDS_DESC_ORE_DIAMOND); + Tile::diamondBlock = (new MetalTile(57)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_diamond)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_METAL)->setIconName(L"diamond_block")->setDescriptionId(IDS_TILE_BLOCK_DIAMOND)->setUseDescriptionId(IDS_DESC_BLOCK_DIAMOND); + Tile::workBench = (new WorkbenchTile(58)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_wood)->setDestroyTime(2.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"crafting_table")->setDescriptionId(IDS_TILE_WORKBENCH)->setUseDescriptionId(IDS_DESC_CRAFTINGTABLE); + Tile::wheat = (new CropTile(59)) ->setIconName(L"wheat")->setDescriptionId(IDS_TILE_CROPS)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_CROPS)->disableMipmap(); + Tile::farmland = (new FarmTile(60)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"farmland")->setDescriptionId(IDS_TILE_FARMLAND)->setUseDescriptionId(IDS_DESC_FARMLAND)->sendTileData(); + + Tile::furnace = (new FurnaceTile(61, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_stone)->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setIconName(L"furnace")->setDescriptionId(IDS_TILE_FURNACE)->sendTileData()->setUseDescriptionId(IDS_DESC_FURNACE); + Tile::furnace_lit = (new FurnaceTile(62, true)) ->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setLightEmission(14 / 16.0f)->setIconName(L"furnace")->setDescriptionId(IDS_TILE_FURNACE)->sendTileData()->setUseDescriptionId(IDS_DESC_FURNACE); + Tile::sign = (new SignTile(63, eTYPE_SIGNTILEENTITY, true)) ->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"sign")->setDescriptionId(IDS_TILE_SIGN)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_SIGN); + Tile::door_wood = (new DoorTile(64, Material::wood)) ->setDestroyTime(3.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"door_wood")->setDescriptionId(IDS_TILE_DOOR_WOOD)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_DOOR_WOOD); + Tile::ladder = (new LadderTile(65)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_LADDER)->setIconName(L"ladder")->setDescriptionId(IDS_TILE_LADDER)->sendTileData()->setUseDescriptionId(IDS_DESC_LADDER)->disableMipmap(); + Tile::rail = (new RailTile(66)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_iron)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"rail_normal")->setDescriptionId(IDS_TILE_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_RAIL)->disableMipmap(); + Tile::stairs_stone =(new StairTile(67, Tile::cobblestone,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_stone) ->setIconName(L"stairsStone")->setDescriptionId(IDS_TILE_STAIRS_STONE) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::wallSign = (new SignTile(68, eTYPE_SIGNTILEENTITY, false)) ->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"sign")->setDescriptionId(IDS_TILE_SIGN)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_SIGN); + Tile::lever = (new LeverTile(69)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_lever, Item::eMaterial_wood)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"lever")->setDescriptionId(IDS_TILE_LEVER)->sendTileData()->setUseDescriptionId(IDS_DESC_LEVER); + Tile::pressurePlate_stone = (Tile *)(new PressurePlateTile(70, L"stone", Material::stone, PressurePlateTile::mobs)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_stone)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_STONE)->setDescriptionId(IDS_TILE_PRESSURE_PLATE)->sendTileData()->setUseDescriptionId(IDS_DESC_PRESSUREPLATE); + + Tile::door_iron = (new DoorTile(71, Material::metal)) ->setDestroyTime(5.0f)->setSoundType(Tile::SOUND_METAL)->setIconName(L"door_iron")->setDescriptionId(IDS_TILE_DOOR_IRON)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_DOOR_IRON); + Tile::pressurePlate_wood = (new PressurePlateTile(72, L"planks_oak", Material::wood, PressurePlateTile::everything)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_wood)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setDescriptionId(IDS_TILE_PRESSURE_PLATE)->sendTileData()->setUseDescriptionId(IDS_DESC_PRESSUREPLATE); + Tile::redStoneOre = (new RedStoneOreTile(73,false)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"redstone_ore")->setDescriptionId(IDS_TILE_ORE_REDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_ORE_REDSTONE); + Tile::redStoneOre_lit = (new RedStoneOreTile(74, true)) ->setLightEmission(10 / 16.0f)->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setIconName(L"redstone_ore")->setDescriptionId(IDS_TILE_ORE_REDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_ORE_REDSTONE); + Tile::redstoneTorch_off = (new NotGateTile(75, false)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"redstone_torch_off")->setDescriptionId(IDS_TILE_NOT_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONETORCH)->disableMipmap(); + Tile::redstoneTorch_on = (new NotGateTile(76, true)) ->setDestroyTime(0.0f)->setLightEmission(8 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"redstone_torch_on")->setDescriptionId(IDS_TILE_NOT_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONETORCH)->disableMipmap(); + Tile::button = (new StoneButtonTile(77)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_button, Item::eMaterial_stone)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_STONE)->setIconName(L"button")->setDescriptionId(IDS_TILE_BUTTON)->sendTileData()->setUseDescriptionId(IDS_DESC_BUTTON); + Tile::topSnow = (new TopSnowTile(78)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_snow)->setDestroyTime(0.1f)->setSoundType(Tile::SOUND_SNOW)->setIconName(L"snow")->setDescriptionId(IDS_TILE_SNOW)->setUseDescriptionId(IDS_DESC_TOP_SNOW)->sendTileData()->setLightBlock(0); + Tile::ice = (new IceTile(79)) ->setDestroyTime(0.5f)->setLightBlock(3)->setSoundType(Tile::SOUND_GLASS)->setIconName(L"ice")->setDescriptionId(IDS_TILE_ICE)->setUseDescriptionId(IDS_DESC_ICE); + Tile::snow = (new SnowTile(80)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_snow)->setDestroyTime(0.2f)->setSoundType(Tile::SOUND_CLOTH)->setIconName(L"snow")->setDescriptionId(IDS_TILE_SNOW)->setUseDescriptionId(IDS_DESC_SNOW); + + Tile::cactus = (new CactusTile(81)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_CLOTH)->setIconName(L"cactus")->setDescriptionId(IDS_TILE_CACTUS)->setUseDescriptionId(IDS_DESC_CACTUS)->disableMipmap(); + Tile::clay = (new ClayTile(82)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_clay)->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setIconName(L"clay")->setDescriptionId(IDS_TILE_CLAY)->setUseDescriptionId(IDS_DESC_CLAY_TILE); + Tile::reeds = (new ReedTile(83)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setIconName(L"reeds")->setDescriptionId(IDS_TILE_REEDS)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_REEDS)->disableMipmap(); + Tile::jukebox = (new JukeboxTile(84)) ->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setIconName(L"jukebox")->setDescriptionId(IDS_TILE_JUKEBOX)->sendTileData()->setUseDescriptionId(IDS_DESC_JUKEBOX); + Tile::fence = (new FenceTile(85, L"planks_oak", Material::wood)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_WOOD)->setDescriptionId(IDS_TILE_FENCE)->setUseDescriptionId(IDS_DESC_FENCE); + Tile::pumpkin = (new PumpkinTile(86, false)) ->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"pumpkin")->setDescriptionId(IDS_TILE_PUMPKIN)->sendTileData()->setUseDescriptionId(IDS_DESC_PUMPKIN); + Tile::netherRack = (new NetherrackTile(87)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_STONE)->setIconName(L"netherrack")->setDescriptionId(IDS_TILE_HELL_ROCK)->setUseDescriptionId(IDS_DESC_HELL_ROCK); + Tile::soulsand = (new SoulSandTile(88)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_SAND)->setIconName(L"soul_sand")->setDescriptionId(IDS_TILE_HELL_SAND)->setUseDescriptionId(IDS_DESC_HELL_SAND); + Tile::glowstone = (new Glowstonetile(89, Material::glass)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_glowstone)->setDestroyTime(0.3f)->setSoundType(Tile::SOUND_GLASS)->setLightEmission(1.0f)->setIconName(L"glowstone")->setDescriptionId(IDS_TILE_LIGHT_GEM)->setUseDescriptionId(IDS_DESC_GLOWSTONE); + Tile::portalTile = (PortalTile *) ((new PortalTile(90)) ->setDestroyTime(-1)->setSoundType(Tile::SOUND_GLASS)->setLightEmission(0.75f))->setIconName(L"portal")->setDescriptionId(IDS_TILE_PORTAL)->setUseDescriptionId(IDS_DESC_PORTAL); + + Tile::litPumpkin = (new PumpkinTile(91, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_torch, Item::eMaterial_pumpkin)->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setLightEmission(1.0f)->setIconName(L"pumpkin")->setDescriptionId(IDS_TILE_LIT_PUMPKIN)->sendTileData()->setUseDescriptionId(IDS_DESC_JACKOLANTERN); + Tile::cake = (new CakeTile(92)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_CLOTH)->setIconName(L"cake")->setDescriptionId(IDS_TILE_CAKE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_CAKE); + Tile::diode_off = (RepeaterTile *)(new RepeaterTile(93, false)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"repeater_off")->setDescriptionId(IDS_ITEM_DIODE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER)->disableMipmap(); + Tile::diode_on = (RepeaterTile *)(new RepeaterTile(94, true)) ->setDestroyTime(0.0f)->setLightEmission(10 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"repeater_on")->setDescriptionId(IDS_ITEM_DIODE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER)->disableMipmap(); + Tile::stained_glass = (new StainedGlassBlock(95, Material::glass))->setBaseItemTypeAndMaterial(Item::eBaseItemType_glass, Item::eMaterial_glass)->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_STAINED_GLASS)->setUseDescriptionId(IDS_DESC_STAINED_GLASS); + Tile::trapdoor = (new TrapDoorTile(96, Material::wood)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_door, Item::eMaterial_trap)->setDestroyTime(3.0f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"trapdoor")->setDescriptionId(IDS_TILE_TRAPDOOR)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_TRAPDOOR); + Tile::monsterStoneEgg = (new StoneMonsterTile(97)) ->setDestroyTime(0.75f)->setIconName(L"monsterStoneEgg")->setDescriptionId(IDS_TILE_STONE_SILVERFISH)->setUseDescriptionId(IDS_DESC_STONE_SILVERFISH); + Tile::stoneBrick = (new SmoothStoneBrickTile(98)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_stoneSmooth)->setDestroyTime(1.5f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setIconName(L"stonebrick")->setDescriptionId(IDS_TILE_STONE_BRICK_SMOOTH)->setUseDescriptionId(IDS_DESC_STONE_BRICK_SMOOTH); + Tile::hugeMushroom_brown = (new HugeMushroomTile(99, Material::wood, HugeMushroomTile::MUSHROOM_TYPE_BROWN)) ->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setIconName(L"mushroom_block")->setDescriptionId(IDS_TILE_HUGE_MUSHROOM_1)->setUseDescriptionId(IDS_DESC_MUSHROOM)->sendTileData(); + Tile::hugeMushroom_red = (new HugeMushroomTile(100, Material::wood, HugeMushroomTile::MUSHROOM_TYPE_RED)) ->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setIconName(L"mushroom_block")->setDescriptionId(IDS_TILE_HUGE_MUSHROOM_2)->setUseDescriptionId(IDS_DESC_MUSHROOM)->sendTileData(); + + + Tile::ironFence = (new ThinFenceTile(101, L"iron_bars", L"iron_bars", Material::metal, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_iron)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_METAL)->setDescriptionId(IDS_TILE_IRON_FENCE)->setUseDescriptionId(IDS_DESC_IRON_FENCE); + Tile::thinGlass = (new ThinFenceTile(102, L"glass", L"glass_pane_top", Material::glass, false)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setDescriptionId(IDS_TILE_THIN_GLASS)->setUseDescriptionId(IDS_DESC_THIN_GLASS); + Tile::melon = (new MelonTile(103)) ->setDestroyTime(1.0f)->setSoundType(SOUND_WOOD)->setIconName(L"melon")->setDescriptionId(IDS_TILE_MELON)->setUseDescriptionId(IDS_DESC_MELON_BLOCK); + Tile::pumpkinStem = (new StemTile(104, Tile::pumpkin)) ->setDestroyTime(0.0f)->setSoundType(SOUND_WOOD)->setIconName(L"pumpkin_stem")->setDescriptionId(IDS_TILE_PUMPKIN_STEM)->sendTileData(); + Tile::melonStem = (new StemTile(105, Tile::melon)) ->setDestroyTime(0.0f)->setSoundType(SOUND_WOOD)->setIconName(L"melon_stem")->setDescriptionId(IDS_TILE_MELON_STEM)->sendTileData(); + Tile::vine = (new VineTile(106))->setDestroyTime(0.2f) ->setSoundType(SOUND_GRASS)->setIconName(L"vine")->setDescriptionId(IDS_TILE_VINE)->setUseDescriptionId(IDS_DESC_VINE)->sendTileData(); + Tile::fenceGate = (new FenceGateTile(107)) ->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"fenceGate")->setDescriptionId(IDS_TILE_FENCE_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_FENCE_GATE); + Tile::stairs_bricks = (new StairTile(108, Tile::redBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_brick) ->setIconName(L"stairsBrick")->setDescriptionId(IDS_TILE_STAIRS_BRICKS) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::stairs_stoneBrickSmooth = (new StairTile(109, Tile::stoneBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_stoneSmooth)->setIconName(L"stairsStoneBrickSmooth")->setDescriptionId(IDS_TILE_STAIRS_STONE_BRICKS_SMOOTH) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::mycel = (MycelTile *)(new MycelTile(110)) ->setDestroyTime(0.6f)->setSoundType(SOUND_GRASS)->setIconName(L"mycelium")->setDescriptionId(IDS_TILE_MYCEL)->setUseDescriptionId(IDS_DESC_MYCEL); + + Tile::waterLily = (new WaterlilyTile(111)) ->setDestroyTime(0.0f)->setSoundType(SOUND_GRASS)->setIconName(L"waterlily")->setDescriptionId(IDS_TILE_WATERLILY)->setUseDescriptionId(IDS_DESC_WATERLILY); + Tile::netherBrick = (new Tile(112, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_netherbrick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setIconName(L"nether_brick")->setDescriptionId(IDS_TILE_NETHERBRICK)->setUseDescriptionId(IDS_DESC_NETHERBRICK); + Tile::netherFence = (new FenceTile(113, L"nether_brick", Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_netherbrick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setDescriptionId(IDS_TILE_NETHERFENCE)->setUseDescriptionId(IDS_DESC_NETHERFENCE); + Tile::stairs_netherBricks = (new StairTile(114, Tile::netherBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_netherbrick)->setIconName(L"stairsNetherBrick")->setDescriptionId(IDS_TILE_STAIRS_NETHERBRICK) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::netherStalk = (new NetherWartTile(115)) ->setIconName(L"nether_wart")->setDescriptionId(IDS_TILE_NETHERSTALK)->sendTileData()->setUseDescriptionId(IDS_DESC_NETHERSTALK); + Tile::enchantTable = (new EnchantmentTableTile(116)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_magic)->setDestroyTime(5.0f)->setExplodeable(2000)->setIconName(L"enchanting_table")->setDescriptionId(IDS_TILE_ENCHANTMENTTABLE)->setUseDescriptionId(IDS_DESC_ENCHANTMENTTABLE); + Tile::brewingStand = (new BrewingStandTile(117)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_blaze)->setDestroyTime(0.5f)->setLightEmission(2 / 16.0f)->setIconName(L"brewing_stand")->setDescriptionId(IDS_TILE_BREWINGSTAND)->sendTileData()->setUseDescriptionId(IDS_DESC_BREWING_STAND); + Tile::cauldron = (CauldronTile *)(new CauldronTile(118)) ->setDestroyTime(2.0f)->setIconName(L"cauldron")->setDescriptionId(IDS_TILE_CAULDRON)->sendTileData()->setUseDescriptionId(IDS_DESC_CAULDRON); + Tile::endPortalTile = (new TheEndPortal(119, Material::portal)) ->setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME)->setExplodeable(6000000)->setDescriptionId(IDS_TILE_END_PORTAL)->setUseDescriptionId(IDS_DESC_END_PORTAL); + Tile::endPortalFrameTile = (new TheEndPortalFrameTile(120)) ->setSoundType(SOUND_GLASS)->setLightEmission(2 / 16.0f)->setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME)->setIconName(L"endframe")->setDescriptionId(IDS_TILE_ENDPORTALFRAME)->sendTileData()->setExplodeable(6000000)->setUseDescriptionId(IDS_DESC_ENDPORTALFRAME); + + Tile::endStone = (new Tile(121, Material::stone)) ->setDestroyTime(3.0f)->setExplodeable(15)->setSoundType(SOUND_STONE)->setIconName(L"end_stone")->setDescriptionId(IDS_TILE_WHITESTONE)->setUseDescriptionId(IDS_DESC_WHITESTONE); + Tile::dragonEgg = (new EggTile(122)) ->setDestroyTime(3.0f)->setExplodeable(15)->setSoundType(SOUND_STONE)->setLightEmission(2.0f / 16.0f)->setIconName(L"dragon_egg")->setDescriptionId(IDS_TILE_DRAGONEGG)->setUseDescriptionId(IDS_DESC_DRAGONEGG); + Tile::redstoneLight = (new RedlightTile(123, false)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"redstone_lamp_off")->setDescriptionId(IDS_TILE_REDSTONE_LIGHT)->setUseDescriptionId(IDS_DESC_REDSTONE_LIGHT); + Tile::redstoneLight_lit = (new RedlightTile(124, true)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"redstone_lamp_on")->setDescriptionId(IDS_TILE_REDSTONE_LIGHT)->setUseDescriptionId(IDS_DESC_REDSTONE_LIGHT); + Tile::woodSlab = (HalfSlabTile *) (new WoodSlabTile(Tile::woodSlab_Id, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_slab, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); + Tile::woodSlabHalf = (HalfSlabTile *) (new WoodSlabTile(Tile::woodSlabHalf_Id, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_halfslab, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); + Tile::cocoa = (new CocoaTile(127)) ->setDestroyTime(0.2f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setIconName(L"cocoa")->sendTileData()->setDescriptionId(IDS_TILE_COCOA)->setUseDescriptionId(IDS_DESC_COCOA); + Tile::stairs_sandstone = (new StairTile(128, Tile::sandStone,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sand) ->setIconName(L"stairsSandstone")->setDescriptionId(IDS_TILE_STAIRS_SANDSTONE) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::emeraldOre = (new OreTile(129)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(SOUND_STONE)->setIconName(L"emerald_ore")->setDescriptionId(IDS_TILE_EMERALDORE)->setUseDescriptionId(IDS_DESC_EMERALDORE); + Tile::enderChest = (new EnderChestTile(130)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_chest, Item::eMaterial_ender)->setDestroyTime(22.5f)->setExplodeable(1000)->setSoundType(SOUND_STONE)->setIconName(L"enderChest")->sendTileData()->setLightEmission(.5f)->setDescriptionId(IDS_TILE_ENDERCHEST)->setUseDescriptionId(IDS_DESC_ENDERCHEST); + + + Tile::tripWireSource = (TripWireSourceTile *)( new TripWireSourceTile(131) ) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_lever, Item::eMaterial_undefined)->setIconName(L"trip_wire_source")->sendTileData()->setDescriptionId(IDS_TILE_TRIPWIRE_SOURCE)->setUseDescriptionId(IDS_DESC_TRIPWIRE_SOURCE); + Tile::tripWire = (new TripWireTile(132)) ->setIconName(L"trip_wire")->sendTileData()->setDescriptionId(IDS_TILE_TRIPWIRE)->setUseDescriptionId(IDS_DESC_TRIPWIRE); + Tile::emeraldBlock = (new MetalTile(133)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_emerald)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_METAL)->setIconName(L"emerald_block")->setDescriptionId(IDS_TILE_EMERALDBLOCK)->setUseDescriptionId(IDS_DESC_EMERALDBLOCK); + Tile::woodStairsDark = (new StairTile(134, Tile::wood, TreeTile::DARK_TRUNK)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sprucewood)->setIconName(L"stairsWoodSpruce")->setDescriptionId(IDS_TILE_STAIRS_SPRUCEWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::woodStairsBirch = (new StairTile(135, Tile::wood, TreeTile::BIRCH_TRUNK)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_birchwood)->setIconName(L"stairsWoodBirch")->setDescriptionId(IDS_TILE_STAIRS_BIRCHWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::woodStairsJungle =(new StairTile(136, Tile::wood, TreeTile::JUNGLE_TRUNK))->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_junglewood)->setIconName(L"stairsWoodJungle")->setDescriptionId(IDS_TILE_STAIRS_JUNGLEWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::commandBlock = (new CommandBlock(137)) ->setIndestructible()->setExplodeable(6000000)->setIconName(L"command_block")->setDescriptionId(IDS_TILE_COMMAND_BLOCK)->setUseDescriptionId(IDS_DESC_COMMAND_BLOCK); + Tile::beacon = (BeaconTile *) (new BeaconTile(138)) ->setLightEmission(1.0f)->setIconName(L"beacon")->setDescriptionId(IDS_TILE_BEACON)->setUseDescriptionId(IDS_DESC_BEACON); + Tile::cobbleWall = (new WallTile(139, Tile::stoneBrick)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_stone)->setIconName(L"cobbleWall")->setDescriptionId(IDS_TILE_COBBLESTONE_WALL)->setUseDescriptionId(IDS_DESC_COBBLESTONE_WALL); + Tile::flowerPot = (new FlowerPotTile(140)) ->setDestroyTime(0.0f)->setSoundType(SOUND_NORMAL)->setIconName(L"flower_pot")->setDescriptionId(IDS_TILE_FLOWERPOT)->setUseDescriptionId(IDS_DESC_FLOWERPOT); + + Tile::carrots = (new CarrotTile(141)) ->setIconName(L"carrots")->setDescriptionId(IDS_TILE_CARROTS)->setUseDescriptionId(IDS_DESC_CARROTS)->disableMipmap(); + Tile::potatoes = (new PotatoTile(142)) ->setIconName(L"potatoes")->setDescriptionId(IDS_TILE_POTATOES)->setUseDescriptionId(IDS_DESC_POTATO)->disableMipmap(); + Tile::button_wood = (new WoodButtonTile(143)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_button, Item::eMaterial_wood)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setIconName(L"button")->setDescriptionId(IDS_TILE_BUTTON)->sendTileData()->setUseDescriptionId(IDS_DESC_BUTTON); + Tile::skull = (new SkullTile(144)) ->setDestroyTime(1.0f)->setSoundType(SOUND_STONE)->setIconName(L"skull")->setDescriptionId(IDS_TILE_SKULL)->setUseDescriptionId(IDS_DESC_SKULL); + Tile::anvil = (new AnvilTile(145)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_iron)->setDestroyTime(5.0f)->setSoundType(SOUND_ANVIL)->setExplodeable(2000)->setIconName(L"anvil")->sendTileData()->setDescriptionId(IDS_TILE_ANVIL)->setUseDescriptionId(IDS_DESC_ANVIL); + Tile::chest_trap = (new ChestTile(146, ChestTile::TYPE_TRAP)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_chest, Item::eMaterial_trap)->setDestroyTime(2.5f)->setSoundType(SOUND_WOOD)->setDescriptionId(IDS_TILE_CHEST_TRAP)->setUseDescriptionId(IDS_DESC_CHEST_TRAP); + Tile::weightedPlate_light = (new WeightedPressurePlateTile(147, L"gold_block", Material::metal, Redstone::SIGNAL_MAX)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_gold)->setDestroyTime(0.5f)->setSoundType(SOUND_WOOD)->setDescriptionId(IDS_TILE_WEIGHTED_PLATE_LIGHT)->setUseDescriptionId(IDS_DESC_WEIGHTED_PLATE_LIGHT); + Tile::weightedPlate_heavy = (new WeightedPressurePlateTile(148, L"iron_block", Material::metal, Redstone::SIGNAL_MAX * 10))->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_iron)->setDestroyTime(0.5f)->setSoundType(SOUND_WOOD)->setDescriptionId(IDS_TILE_WEIGHTED_PLATE_HEAVY)->setUseDescriptionId(IDS_DESC_WEIGHTED_PLATE_HEAVY); + Tile::comparator_off = (ComparatorTile *) (new ComparatorTile(149, false)) ->setDestroyTime(0.0f)->setSoundType(SOUND_WOOD)->setIconName(L"comparator_off")->setDescriptionId(IDS_TILE_COMPARATOR)->setUseDescriptionId(IDS_DESC_COMPARATOR); + Tile::comparator_on = (ComparatorTile *) (new ComparatorTile(150, true)) ->setDestroyTime(0.0f)->setLightEmission(10 / 16.0f)->setSoundType(SOUND_WOOD)->setIconName(L"comparator_on")->setDescriptionId(IDS_TILE_COMPARATOR)->setUseDescriptionId(IDS_DESC_COMPARATOR); + + Tile::daylightDetector = (DaylightDetectorTile *) (new DaylightDetectorTile(151))->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setIconName(L"daylight_detector")->setDescriptionId(IDS_TILE_DAYLIGHT_DETECTOR)->setUseDescriptionId(IDS_DESC_DAYLIGHT_DETECTOR); + Tile::redstoneBlock = (new PoweredMetalTile(152)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_redstone)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_METAL)->setIconName(L"redstone_block")->setDescriptionId(IDS_TILE_REDSTONE_BLOCK)->setUseDescriptionId(IDS_DESC_REDSTONE_BLOCK); + Tile::netherQuartz = (new OreTile(153)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(SOUND_STONE)->setIconName(L"quartz_ore")->setDescriptionId(IDS_TILE_NETHER_QUARTZ)->setUseDescriptionId(IDS_DESC_NETHER_QUARTZ_ORE); + Tile::hopper = (HopperTile *)(new HopperTile(154)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_redstoneContainer, Item::eMaterial_undefined)->setDestroyTime(3.0f)->setExplodeable(8)->setSoundType(SOUND_WOOD)->setIconName(L"hopper")->setDescriptionId(IDS_TILE_HOPPER)->setUseDescriptionId(IDS_DESC_HOPPER); + Tile::quartzBlock = (new QuartzBlockTile(155)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_quartz)->setSoundType(SOUND_STONE)->setDestroyTime(0.8f)->setIconName(L"quartz_block")->setDescriptionId(IDS_TILE_QUARTZ_BLOCK)->setUseDescriptionId(IDS_DESC_QUARTZ_BLOCK); + Tile::stairs_quartz = (new StairTile(156, Tile::quartzBlock, QuartzBlockTile::TYPE_DEFAULT)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_quartz)->setIconName(L"stairsQuartz")->setDescriptionId(IDS_TILE_STAIRS_QUARTZ)->setUseDescriptionId(IDS_DESC_STAIRS); + Tile::activatorRail = (new PoweredRailTile(157)) ->setDestroyTime(0.7f)->setSoundType(SOUND_METAL)->setIconName(L"rail_activator")->setDescriptionId(IDS_TILE_ACTIVATOR_RAIL)->setUseDescriptionId(IDS_DESC_ACTIVATOR_RAIL); + Tile::dropper = (new DropperTile(158)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_redstoneContainer, Item::eMaterial_undefined)->setDestroyTime(3.5f)->setSoundType(SOUND_STONE)->setIconName(L"dropper")->setDescriptionId(IDS_TILE_DROPPER)->setUseDescriptionId(IDS_DESC_DROPPER); + Tile::clayHardened_colored = (new ColoredTile(159, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_clay, Item::eMaterial_clay)->setDestroyTime(1.25f)->setExplodeable(7)->setSoundType(SOUND_STONE)->setIconName(L"hardened_clay_stained")->setDescriptionId(IDS_TILE_STAINED_CLAY)->setUseDescriptionId(IDS_DESC_STAINED_CLAY); + Tile::stained_glass_pane = (new StainedGlassPaneBlock(160)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_glass, Item::eMaterial_glass)->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setIconName(L"glass")->setDescriptionId(IDS_TILE_STAINED_GLASS_PANE)->setUseDescriptionId(IDS_DESC_STAINED_GLASS_PANE); + + Tile::hayBlock = (new HayBlockTile(170)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_wheat)->setDestroyTime(0.5f)->setSoundType(SOUND_GRASS)->setIconName(L"hay_block")->setDescriptionId(IDS_TILE_HAY)->setUseDescriptionId(IDS_DESC_HAY); + Tile::woolCarpet = (new WoolCarpetTile(171)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_carpet, Item::eMaterial_cloth)->setDestroyTime(0.1f)->setSoundType(SOUND_CLOTH)->setIconName(L"woolCarpet")->setLightBlock(0)->setDescriptionId(IDS_TILE_CARPET)->setUseDescriptionId(IDS_DESC_CARPET); + Tile::clayHardened = (new Tile(172, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_clay, Item::eMaterial_clay)->setDestroyTime(1.25f)->setExplodeable(7)->setSoundType(SOUND_STONE)->setIconName(L"hardened_clay")->setDescriptionId(IDS_TILE_HARDENED_CLAY)->setUseDescriptionId(IDS_DESC_HARDENED_CLAY); + Tile::coalBlock = (new Tile(173, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_coal)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setIconName(L"coal_block")->setDescriptionId(IDS_TILE_COAL)->setUseDescriptionId(IDS_DESC_COAL_BLOCK); - Tile::pressurePlate_stone = (Tile *)(new PressurePlateTile(70, L"stone", Material::stone, PressurePlateTile::mobs)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_stone)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"pressurePlate")->setDescriptionId(IDS_TILE_PRESSURE_PLATE)->sendTileData()->setUseDescriptionId(IDS_DESC_PRESSUREPLATE); - Tile::pressurePlate_wood = (new PressurePlateTile(72, L"wood", Material::wood, PressurePlateTile::everything)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_pressureplate, Item::eMaterial_wood)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"pressurePlate")->setDescriptionId(IDS_TILE_PRESSURE_PLATE)->sendTileData()->setUseDescriptionId(IDS_DESC_PRESSUREPLATE); - - Tile::flower = (Bush *) (new Bush(37)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"flower")->setDescriptionId(IDS_TILE_FLOWER)->setUseDescriptionId(IDS_DESC_FLOWER)->disableMipmap(); - Tile::rose = (Bush *) (new Bush(38)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"rose")->setDescriptionId(IDS_TILE_ROSE)->setUseDescriptionId(IDS_DESC_FLOWER)->disableMipmap(); - Tile::mushroom1 = (Bush *) (new Mushroom(39, L"mushroom_brown")) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setLightEmission(2 / 16.0f)->setTextureName(L"mushroom")->setDescriptionId(IDS_TILE_MUSHROOM)->setUseDescriptionId(IDS_DESC_MUSHROOM)->disableMipmap(); - Tile::mushroom2 = (Bush *) (new Mushroom(40, L"mushroom_red")) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"mushroom")->setDescriptionId(IDS_TILE_MUSHROOM)->setUseDescriptionId(IDS_DESC_MUSHROOM)->disableMipmap(); - -// Tile::stoneSlab = (new StoneSlabTile(43, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_slab, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_SLAB); -// Tile::stoneSlabHalf = (new StoneSlabTile(44, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_halfslab, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_HALFSLAB); - - - Tile::tnt = (new TntTile(46)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"tnt")->setDescriptionId(IDS_TILE_TNT)->setUseDescriptionId(IDS_DESC_TNT); - Tile::bookshelf = (new BookshelfTile(47)) ->setDestroyTime(1.5f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"bookshelf")->setDescriptionId(IDS_TILE_BOOKSHELF)->setUseDescriptionId(IDS_DESC_BOOKSHELF); - Tile::mossStone = (new Tile(48, Material::stone)) ->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"stoneMoss")->setDescriptionId(IDS_TILE_STONE_MOSS)->setUseDescriptionId(IDS_DESC_MOSS_STONE); - // 4J - change of destroy time from 10.0f -> 50.0f for obsidian brought forward from 1.2.3 - Tile::obsidian = (new ObsidianTile(49)) ->setDestroyTime(50.0f)->setExplodeable(2000)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"obsidian")->setDescriptionId(IDS_TILE_OBSIDIAN)->setUseDescriptionId(IDS_DESC_OBSIDIAN); - - - Tile::fire = (FireTile *) ((new FireTile(51)) ->setDestroyTime(0.0f)->setLightEmission(1.0f)->setSoundType(Tile::SOUND_WOOD))->setTextureName(L"fire")->setDescriptionId(IDS_TILE_FIRE)->setNotCollectStatistics()->setUseDescriptionId(-1); - Tile::mobSpawner = (new MobSpawnerTile(52)) ->setDestroyTime(5.0f)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"mobSpawner")->setDescriptionId(IDS_TILE_MOB_SPAWNER)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_MOB_SPAWNER); - - Tile::chest = (ChestTile *)(new ChestTile(54)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_chest, Item::eMaterial_ender)->setDestroyTime(2.5f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"chest")->setDescriptionId(IDS_TILE_CHEST)->sendTileData()->setUseDescriptionId(IDS_DESC_CHEST); - Tile::redStoneDust = (RedStoneDustTile *)(new RedStoneDustTile(55)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_NORMAL)->setTextureName(L"redstoneDust")->setDescriptionId(IDS_TILE_REDSTONE_DUST)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONE_DUST); - Tile::workBench = (new WorkbenchTile(58)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_wood)->setDestroyTime(2.5f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"workbench")->setDescriptionId(IDS_TILE_WORKBENCH)->setUseDescriptionId(IDS_DESC_CRAFTINGTABLE); - Tile::crops = (new CropTile(59)) ->setTextureName(L"crops")->setDescriptionId(IDS_TILE_CROPS)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_CROPS)->disableMipmap(); - Tile::farmland = (new FarmTile(60)) ->setDestroyTime(0.6f)->setSoundType(Tile::SOUND_GRAVEL)->setTextureName(L"farmland")->setDescriptionId(IDS_TILE_FARMLAND)->setUseDescriptionId(IDS_DESC_FARMLAND)->sendTileData(); - Tile::furnace = (new FurnaceTile(61, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_stone)->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"furnace")->setDescriptionId(IDS_TILE_FURNACE)->sendTileData()->setUseDescriptionId(IDS_DESC_FURNACE); - Tile::furnace_lit = (new FurnaceTile(62, true)) ->setDestroyTime(3.5f)->setSoundType(Tile::SOUND_STONE)->setLightEmission(14 / 16.0f)->setTextureName(L"furnace")->setDescriptionId(IDS_TILE_FURNACE)->sendTileData()->setUseDescriptionId(IDS_DESC_FURNACE); - Tile::sign = (new SignTile(63, eTYPE_SIGNTILEENTITY, true))->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"sign")->setDescriptionId(IDS_TILE_SIGN)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_SIGN); - Tile::door_wood = (new DoorTile(64, Material::wood)) ->setDestroyTime(3.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"doorWood")->setDescriptionId(IDS_TILE_DOOR_WOOD)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_DOOR_WOOD); - Tile::ladder = (new LadderTile(65)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"ladder")->setDescriptionId(IDS_TILE_LADDER)->sendTileData()->setUseDescriptionId(IDS_DESC_LADDER)->disableMipmap(); - Tile::wallSign = (new SignTile(68, eTYPE_SIGNTILEENTITY, false))->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"sign")->setDescriptionId(IDS_TILE_SIGN)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_SIGN); - Tile::lever = (new LeverTile(69)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"lever")->setDescriptionId(IDS_TILE_LEVER)->sendTileData()->setUseDescriptionId(IDS_DESC_LEVER); - Tile::door_iron = (new DoorTile(71, Material::metal)) ->setDestroyTime(5.0f)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"doorIron")->setDescriptionId(IDS_TILE_DOOR_IRON)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_DOOR_IRON); - Tile::redStoneOre = (new RedStoneOreTile(73,false)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"oreRedstone")->setDescriptionId(IDS_TILE_ORE_REDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_ORE_REDSTONE); - Tile::redStoneOre_lit = (new RedStoneOreTile(74, true)) ->setLightEmission(10 / 16.0f)->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"oreRedstone")->setDescriptionId(IDS_TILE_ORE_REDSTONE)->sendTileData()->setUseDescriptionId(IDS_DESC_ORE_REDSTONE); - Tile::notGate_off = (new NotGateTile(75, false)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"notGate")->setDescriptionId(IDS_TILE_NOT_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONETORCH)->disableMipmap(); - Tile::notGate_on = (new NotGateTile(76, true)) ->setDestroyTime(0.0f)->setLightEmission(8 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"notGate")->setDescriptionId(IDS_TILE_NOT_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONETORCH)->disableMipmap(); - Tile::button = (new ButtonTile(77,false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_button, Item::eMaterial_stone)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"button")->setDescriptionId(IDS_TILE_BUTTON)->sendTileData()->setUseDescriptionId(IDS_DESC_BUTTON); - Tile::topSnow = (new TopSnowTile(78)) ->setDestroyTime(0.1f)->setSoundType(Tile::SOUND_CLOTH)->setTextureName(L"snow")->setDescriptionId(IDS_TILE_SNOW)->setUseDescriptionId(IDS_DESC_TOP_SNOW)->sendTileData()->setLightBlock(0); - Tile::ice = (new IceTile(79)) ->setDestroyTime(0.5f)->setLightBlock(3)->setSoundType(Tile::SOUND_GLASS)->setTextureName(L"ice")->setDescriptionId(IDS_TILE_ICE)->setUseDescriptionId(IDS_DESC_ICE); - Tile::cactus = (new CactusTile(81)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_CLOTH)->setTextureName(L"cactus")->setDescriptionId(IDS_TILE_CACTUS)->setUseDescriptionId(IDS_DESC_CACTUS)->disableMipmap(); - Tile::reeds = (new ReedTile(83)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_GRASS)->setTextureName(L"reeds")->setDescriptionId(IDS_TILE_REEDS)->setNotCollectStatistics()->setUseDescriptionId(IDS_DESC_REEDS)->disableMipmap(); - Tile::recordPlayer = (new RecordPlayerTile(84)) ->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"jukebox")->setDescriptionId(IDS_TILE_JUKEBOX)->sendTileData()->setUseDescriptionId(IDS_DESC_JUKEBOX); - Tile::fence = (new FenceTile(85, L"wood", Material::wood)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"fence")->setDescriptionId(IDS_TILE_FENCE)->setUseDescriptionId(IDS_DESC_FENCE); - - Tile::pumpkin = (new PumpkinTile(86, false)) ->setDestroyTime(1.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"pumpkin")->setDescriptionId(IDS_TILE_PUMPKIN)->sendTileData()->setUseDescriptionId(IDS_DESC_PUMPKIN); - - Tile::hellRock = (new HellStoneTile(87)) ->setDestroyTime(0.4f)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"hellrock")->setDescriptionId(IDS_TILE_HELL_ROCK)->setUseDescriptionId(IDS_DESC_HELL_ROCK); - Tile::hellSand = (new HellSandTile(88)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_SAND)->setTextureName(L"hellsand")->setDescriptionId(IDS_TILE_HELL_SAND)->setUseDescriptionId(IDS_DESC_HELL_SAND); - Tile::portalTile = (PortalTile *) ((new PortalTile(90)) ->setDestroyTime(-1)->setSoundType(Tile::SOUND_GLASS)->setLightEmission(0.75f))->setTextureName(L"portal")->setDescriptionId(IDS_TILE_PORTAL)->setUseDescriptionId(IDS_DESC_PORTAL); - Tile::cake = (new CakeTile(92)) ->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_CLOTH)->setTextureName(L"cake")->setDescriptionId(IDS_TILE_CAKE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_CAKE); - - // TODO Copy the translations from IDS_ITEM_DIODE to IDS_TILE_DIODE - Tile::diode_off = (RepeaterTile *)(new DiodeTile(93, false)) ->setDestroyTime(0.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"diode")->setDescriptionId(IDS_ITEM_DIODE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER)->disableMipmap(); - Tile::diode_on = (RepeaterTile *)(new DiodeTile(94, true)) ->setDestroyTime(0.0f)->setLightEmission(10 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"diode")->setDescriptionId(IDS_ITEM_DIODE)->setNotCollectStatistics()->sendTileData()->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER)->disableMipmap(); - Tile::aprilFoolsJoke = (new LockedChestTile(95)) ->setDestroyTime(0.0f)->setLightEmission(16 / 16.0f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"lockedchest")->setDescriptionId(IDS_TILE_LOCKED_CHEST)->setTicking(true)->sendTileData()->setUseDescriptionId(-1); - - Tile::monsterStoneEgg = (new StoneMonsterTile(97)) ->setDestroyTime(0.75f)->setTextureName(L"monsterStoneEgg")->setDescriptionId(IDS_TILE_STONE_SILVERFISH)->setUseDescriptionId(IDS_DESC_STONE_SILVERFISH); - Tile::stoneBrickSmooth = (new SmoothStoneBrickTile(98)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_stoneSmooth)->setDestroyTime(1.5f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setTextureName(L"stonebricksmooth")->setDescriptionId(IDS_TILE_STONE_BRICK_SMOOTH)->setUseDescriptionId(IDS_DESC_STONE_BRICK_SMOOTH); - Tile::hugeMushroom1 = (new HugeMushroomTile(99, Material::wood, 0)) ->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setTextureName(L"mushroom")->setDescriptionId(IDS_TILE_HUGE_MUSHROOM_1)->setUseDescriptionId(IDS_DESC_MUSHROOM)->sendTileData(); - Tile::hugeMushroom2 = (new HugeMushroomTile(100, Material::wood, 1)) ->setDestroyTime(0.2f)->setSoundType(SOUND_WOOD)->setTextureName(L"mushroom")->setDescriptionId(IDS_TILE_HUGE_MUSHROOM_2)->setUseDescriptionId(IDS_DESC_MUSHROOM)->sendTileData(); - Tile::ironFence = (new ThinFenceTile(101, L"fenceIron", L"fenceIron", Material::metal, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_iron)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_METAL)->setTextureName(L"fenceIron")->setDescriptionId(IDS_TILE_IRON_FENCE)->setUseDescriptionId(IDS_DESC_IRON_FENCE); - Tile::thinGlass = (new ThinFenceTile(102, L"glass", L"thinglass_top", Material::glass, false)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setTextureName(L"thinGlass")->setDescriptionId(IDS_TILE_THIN_GLASS)->setUseDescriptionId(IDS_DESC_THIN_GLASS); - Tile::melon = (new MelonTile(103)) ->setDestroyTime(1.0f)->setSoundType(SOUND_WOOD)->setTextureName(L"melon")->setDescriptionId(IDS_TILE_MELON)->setUseDescriptionId(IDS_DESC_MELON_BLOCK); - Tile::pumpkinStem = (new StemTile(104, Tile::pumpkin)) ->setDestroyTime(0.0f)->setSoundType(SOUND_WOOD)->setTextureName(L"pumpkinStem")->setDescriptionId(IDS_TILE_PUMPKIN_STEM)->sendTileData(); - Tile::melonStem = (new StemTile(105, Tile::melon)) ->setDestroyTime(0.0f)->setSoundType(SOUND_WOOD)->setTextureName(L"pumpkinStem")->setDescriptionId(IDS_TILE_MELON_STEM)->sendTileData(); - Tile::vine = (new VineTile(106))->setDestroyTime(0.2f) ->setSoundType(SOUND_GRASS)->setTextureName(L"vine")->setDescriptionId(IDS_TILE_VINE)->setUseDescriptionId(IDS_DESC_VINE)->sendTileData(); - Tile::fenceGate = (new FenceGateTile(107)) ->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setTextureName(L"fenceGate")->setDescriptionId(IDS_TILE_FENCE_GATE)->sendTileData()->setUseDescriptionId(IDS_DESC_FENCE_GATE); - - - Tile::stairs_wood = (new StairTile(53, Tile::wood,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_wood) ->setTextureName(L"stairsWood")->setDescriptionId(IDS_TILE_STAIRS_WOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - Tile::stairs_stone = (new StairTile(67, Tile::stoneBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_stone) ->setTextureName(L"stairsStone")->setDescriptionId(IDS_TILE_STAIRS_STONE) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - Tile::stairs_bricks = (new StairTile(108, Tile::redBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_brick) ->setTextureName(L"stairsBrick")->setDescriptionId(IDS_TILE_STAIRS_BRICKS) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - Tile::stairs_stoneBrickSmooth = (new StairTile(109, Tile::stoneBrickSmooth,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_stoneSmooth)->setTextureName(L"stairsStoneBrickSmooth")->setDescriptionId(IDS_TILE_STAIRS_STONE_BRICKS_SMOOTH) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - - Tile::mycel = (MycelTile *)(new MycelTile(110)) ->setDestroyTime(0.6f)->setSoundType(SOUND_GRASS)->setTextureName(L"mycel")->setDescriptionId(IDS_TILE_MYCEL)->setUseDescriptionId(IDS_DESC_MYCEL); - Tile::waterLily = (new WaterlilyTile(111)) ->setDestroyTime(0.0f)->setSoundType(SOUND_GRASS)->setTextureName(L"waterlily")->setDescriptionId(IDS_TILE_WATERLILY)->setUseDescriptionId(IDS_DESC_WATERLILY); - Tile::netherBrick = (new Tile(112, Material::stone)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_netherbrick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setTextureName(L"netherBrick")->setDescriptionId(IDS_TILE_NETHERBRICK)->setUseDescriptionId(IDS_DESC_NETHERBRICK); - Tile::netherFence = (new FenceTile(113, L"netherBrick", Material::stone))->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_netherbrick)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(SOUND_STONE)->setTextureName(L"netherFence")->setDescriptionId(IDS_TILE_NETHERFENCE)->setUseDescriptionId(IDS_DESC_NETHERFENCE); - Tile::stairs_netherBricks = (new StairTile(114, Tile::netherBrick,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_netherbrick)->setTextureName(L"stairsNetherBrick")->setDescriptionId(IDS_TILE_STAIRS_NETHERBRICK) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - Tile::netherStalk = (new NetherStalkTile(115)) ->setTextureName(L"netherStalk")->setDescriptionId(IDS_TILE_NETHERSTALK)->sendTileData()->setUseDescriptionId(IDS_DESC_NETHERSTALK); - Tile::enchantTable = (new EnchantmentTableTile(116)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_magic)->setDestroyTime(5.0f)->setExplodeable(2000)->setTextureName(L"enchantmentTable")->setDescriptionId(IDS_TILE_ENCHANTMENTTABLE)->setUseDescriptionId(IDS_DESC_ENCHANTMENTTABLE); - Tile::brewingStand = (new BrewingStandTile(117)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_blaze)->setDestroyTime(0.5f)->setLightEmission(2 / 16.0f)->setTextureName(L"brewingStand")->setDescriptionId(IDS_TILE_BREWINGSTAND)->sendTileData()->setUseDescriptionId(IDS_DESC_BREWING_STAND); - Tile::cauldron = (CauldronTile *)(new CauldronTile(118)) ->setDestroyTime(2.0f)->setTextureName(L"cauldron")->setDescriptionId(IDS_TILE_CAULDRON)->sendTileData()->setUseDescriptionId(IDS_DESC_CAULDRON); - Tile::endPortalTile = (new TheEndPortal(119, Material::portal)) ->setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME)->setExplodeable(6000000)->setDescriptionId(IDS_TILE_END_PORTAL)->setUseDescriptionId(IDS_DESC_END_PORTAL); - Tile::endPortalFrameTile = (new TheEndPortalFrameTile(120)) ->setSoundType(SOUND_GLASS)->setLightEmission(2 / 16.0f)->setDestroyTime(INDESTRUCTIBLE_DESTROY_TIME)->setTextureName(L"endPortalFrame")->setDescriptionId(IDS_TILE_ENDPORTALFRAME)->sendTileData()->setExplodeable(6000000)->setUseDescriptionId(IDS_DESC_ENDPORTALFRAME); - Tile::whiteStone = (new Tile(121, Material::stone)) ->setDestroyTime(3.0f)->setExplodeable(15)->setSoundType(SOUND_STONE)->setTextureName(L"whiteStone")->setDescriptionId(IDS_TILE_WHITESTONE)->setUseDescriptionId(IDS_DESC_WHITESTONE); - Tile::dragonEgg = (new EggTile(122)) ->setDestroyTime(3.0f)->setExplodeable(15)->setSoundType(SOUND_STONE)->setLightEmission(2.0f / 16.0f)->setTextureName(L"dragonEgg")->setDescriptionId(IDS_TILE_DRAGONEGG)->setUseDescriptionId(IDS_DESC_DRAGONEGG); - Tile::redstoneLight = (new RedlightTile(123, false)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setTextureName(L"redstoneLight")->setDescriptionId(IDS_TILE_REDSTONE_LIGHT)->setUseDescriptionId(IDS_DESC_REDSTONE_LIGHT); - Tile::redstoneLight_lit = (new RedlightTile(124, true)) ->setDestroyTime(0.3f)->setSoundType(SOUND_GLASS)->setTextureName(L"redstoneLight")->setDescriptionId(IDS_TILE_REDSTONE_LIGHT)->setUseDescriptionId(IDS_DESC_REDSTONE_LIGHT); - - // TU9 - Tile::stairs_sandstone = (new StairTile(128, Tile::sandStone,0)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sand) ->setTextureName(L"stairsSandstone")->setDescriptionId(IDS_TILE_STAIRS_SANDSTONE) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - Tile::woodStairsDark = (new StairTile(134, Tile::wood, TreeTile::DARK_TRUNK)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_sprucewood)->setTextureName(L"stairsWoodSpruce")->setDescriptionId(IDS_TILE_STAIRS_SPRUCEWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - Tile::woodStairsBirch = (new StairTile(135, Tile::wood, TreeTile::BIRCH_TRUNK)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_birchwood)->setTextureName(L"stairsWoodBirch")->setDescriptionId(IDS_TILE_STAIRS_BIRCHWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - Tile::woodStairsJungle = (new StairTile(136, Tile::wood, TreeTile::JUNGLE_TRUNK))->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_junglewood)->setTextureName(L"stairsWoodJungle")->setDescriptionId(IDS_TILE_STAIRS_JUNGLEWOOD) ->sendTileData()->setUseDescriptionId(IDS_DESC_STAIRS); - Tile::button_wood = (new ButtonTile(143, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_button, Item::eMaterial_wood)->setDestroyTime(0.5f)->setSoundType(Tile::SOUND_WOOD)->setTextureName(L"button")->setDescriptionId(IDS_TILE_BUTTON)->sendTileData()->setUseDescriptionId(IDS_DESC_BUTTON); - - Tile::woodSlab = (HalfSlabTile *) (new WoodSlabTile(Tile::woodSlab_Id, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_slab, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setTextureName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); - Tile::woodSlabHalf = (HalfSlabTile *) (new WoodSlabTile(Tile::woodSlabHalf_Id, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_halfslab, Item::eMaterial_wood)->setDestroyTime(2.0f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setTextureName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); - Tile::stoneSlab = (HalfSlabTile *) (new StoneSlabTile(Tile::stoneSlab_Id, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_slab, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_SLAB); - Tile::stoneSlabHalf = (HalfSlabTile *) (new StoneSlabTile(Tile::stoneSlabHalf_Id, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_halfslab, Item::eMaterial_stone)->setDestroyTime(2.0f)->setExplodeable(10)->setSoundType(Tile::SOUND_STONE)->setTextureName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_HALFSLAB); - - Tile::emeraldOre = (new OreTile(129)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(SOUND_STONE)->setTextureName(L"oreEmerald")->setDescriptionId(IDS_TILE_EMERALDORE)->setUseDescriptionId(IDS_DESC_EMERALDORE); - Tile::enderChest = (new EnderChestTile(130)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_chest, Item::eMaterial_ender)->setDestroyTime(22.5f)->setExplodeable(1000)->setSoundType(SOUND_STONE)->setTextureName(L"enderChest")->sendTileData()->setLightEmission(.5f)->setDescriptionId(IDS_TILE_ENDERCHEST)->setUseDescriptionId(IDS_DESC_ENDERCHEST); - Tile::tripWireSource = (TripWireSourceTile *)( new TripWireSourceTile(131) ) ->setTextureName(L"tripWireSource")->sendTileData()->setDescriptionId(IDS_TILE_TRIPWIRE_SOURCE)->setUseDescriptionId(IDS_DESC_TRIPWIRE_SOURCE); - Tile::tripWire = (new TripWireTile(132)) ->setTextureName(L"tripWire")->sendTileData()->setDescriptionId(IDS_TILE_TRIPWIRE)->setUseDescriptionId(IDS_DESC_TRIPWIRE); - Tile::emeraldBlock = (new MetalTile(133)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_block, Item::eMaterial_emerald)->setDestroyTime(5.0f)->setExplodeable(10)->setSoundType(SOUND_METAL)->setTextureName(L"blockEmerald")->setDescriptionId(IDS_TILE_EMERALDBLOCK)->setUseDescriptionId(IDS_DESC_EMERALDBLOCK); - - - Tile::cocoa = (new CocoaTile(127)) ->setDestroyTime(0.2f)->setExplodeable(5)->setSoundType(SOUND_WOOD)->setTextureName(L"cocoa")->sendTileData()->setDescriptionId(IDS_TILE_COCOA)->setUseDescriptionId(IDS_DESC_COCOA); - Tile::skull = (new SkullTile(144)) ->setDestroyTime(1.0f)->setSoundType(SOUND_STONE)->setTextureName(L"skull")->setDescriptionId(IDS_TILE_SKULL)->setUseDescriptionId(IDS_DESC_SKULL); - - Tile::cobbleWall = (new WallTile(139, Tile::stoneBrick)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fence, Item::eMaterial_stone)->setTextureName(L"cobbleWall")->setDescriptionId(IDS_TILE_COBBLESTONE_WALL)->setUseDescriptionId(IDS_DESC_COBBLESTONE_WALL); - Tile::flowerPot = (new FlowerPotTile(140)) ->setDestroyTime(0.0f)->setSoundType(SOUND_NORMAL)->setTextureName(L"flowerPot")->setDescriptionId(IDS_TILE_FLOWERPOT)->setUseDescriptionId(IDS_DESC_FLOWERPOT); - Tile::carrots = (new CarrotTile(141)) ->setTextureName(L"carrots")->setDescriptionId(IDS_TILE_CARROTS)->setUseDescriptionId(IDS_DESC_CARROTS)->disableMipmap(); - Tile::potatoes = (new PotatoTile(142)) ->setTextureName(L"potatoes")->setDescriptionId(IDS_TILE_POTATOES)->setUseDescriptionId(IDS_DESC_POTATO)->disableMipmap(); - Tile::anvil = (new AnvilTile(145)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_device, Item::eMaterial_iron)->setDestroyTime(5.0f)->setSoundType(SOUND_ANVIL)->setExplodeable(2000)->setTextureName(L"anvil")->sendTileData()->setDescriptionId(IDS_TILE_ANVIL)->setUseDescriptionId(IDS_DESC_ANVIL); - Tile::netherQuartz = (new OreTile(153)) ->setDestroyTime(3.0f)->setExplodeable(5)->setSoundType(SOUND_STONE)->setTextureName(L"netherquartz")->setDescriptionId(IDS_TILE_NETHER_QUARTZ)->setUseDescriptionId(IDS_DESC_NETHER_QUARTZ_ORE); - Tile::quartzBlock = (new QuartzBlockTile(155)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_structblock, Item::eMaterial_quartz)->setSoundType(SOUND_STONE)->setDestroyTime(0.8f)->setTextureName(L"quartzBlock")->setDescriptionId(IDS_TILE_QUARTZ_BLOCK)->setUseDescriptionId(IDS_DESC_QUARTZ_BLOCK); - Tile::stairs_quartz = (new StairTile(156, Tile::quartzBlock, QuartzBlockTile::TYPE_DEFAULT)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_stairs, Item::eMaterial_quartz)->setTextureName(L"stairsQuartz")->setDescriptionId(IDS_TILE_STAIRS_QUARTZ)->setUseDescriptionId(IDS_DESC_STAIRS); - - Tile::woolCarpet = (new WoolCarpetTile(171)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_carpet, Item::eMaterial_cloth)->setDestroyTime(0.1f)->setSoundType(SOUND_CLOTH)->setTextureName(L"woolCarpet")->setLightBlock(0)->setDescriptionId(IDS_TILE_CARPET)->setUseDescriptionId(IDS_DESC_CARPET); // Special cases for certain items since they can have different icons - Item::items[Tile::cloth_Id] = ( new ClothTileItem(Tile::cloth_Id- 256) )->setTextureName(L"cloth")->setDescriptionId(IDS_TILE_CLOTH)->setUseDescriptionId(IDS_DESC_WOOL); - Item::items[Tile::woolCarpet_Id] = ( new ClothTileItem(Tile::woolCarpet_Id - 256))->setTextureName(L"woolCarpet")->setDescriptionId(IDS_TILE_CARPET)->setUseDescriptionId(IDS_DESC_CARPET); - Item::items[Tile::treeTrunk_Id] = ( new TreeTileItem(Tile::treeTrunk_Id - 256, treeTrunk) )->setTextureName(L"log")->setDescriptionId(IDS_TILE_LOG)->setUseDescriptionId(IDS_DESC_LOG); - Item::items[Tile::wood_Id] = ( new MultiTextureTileItem(Tile::wood_Id - 256, Tile::wood, (int *)WoodTile::WOOD_NAMES, 4))->setTextureName(L"wood")->setDescriptionId(IDS_TILE_OAKWOOD_PLANKS)->setUseDescriptionId(IDS_DESC_LOG); // <- TODO - Item::items[Tile::monsterStoneEgg_Id] = ( new StoneMonsterTileItem(Tile::monsterStoneEgg_Id - 256))->setTextureName(L"monsterStoneEgg")->setDescriptionId(IDS_TILE_STONE_SILVERFISH)->setUseDescriptionId(IDS_DESC_STONE_SILVERFISH); // 4J - Brought forward from post-1.2 to fix stacking problem - Item::items[Tile::stoneBrickSmooth_Id] = ( new SmoothStoneBrickTileItem(Tile::stoneBrickSmooth_Id - 256, stoneBrickSmooth))->setTextureName(L"stonebricksmooth")->setDescriptionId(IDS_TILE_STONE_BRICK_SMOOTH); - Item::items[Tile::sandStone_Id] = ( new MultiTextureTileItem(sandStone_Id - 256, sandStone, SandStoneTile::SANDSTONE_NAMES, SandStoneTile::SANDSTONE_BLOCK_NAMES) )->setTextureName(L"sandStone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE); - Item::items[Tile::quartzBlock_Id] = ( new MultiTextureTileItem(quartzBlock_Id - 256, quartzBlock, QuartzBlockTile::BLOCK_NAMES, QuartzBlockTile::QUARTZ_BLOCK_NAMES) )->setTextureName(L"quartzBlock")->setDescriptionId(IDS_TILE_QUARTZ_BLOCK)->setUseDescriptionId(IDS_DESC_QUARTZ_BLOCK); - Item::items[Tile::stoneSlabHalf_Id] = ( new StoneSlabTileItem(Tile::stoneSlabHalf_Id - 256, Tile::stoneSlabHalf, Tile::stoneSlab, false) )->setTextureName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_HALFSLAB); - Item::items[Tile::stoneSlab_Id] = ( new StoneSlabTileItem(Tile::stoneSlab_Id - 256, Tile::stoneSlabHalf, Tile::stoneSlab, true))->setTextureName(L"stoneSlab")->setDescriptionId(IDS_DESC_STONESLAB)->setUseDescriptionId(IDS_DESC_SLAB); - Item::items[Tile::woodSlabHalf_Id] = ( new StoneSlabTileItem(Tile::woodSlabHalf_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, false))->setTextureName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); - Item::items[Tile::woodSlab_Id] = ( new StoneSlabTileItem(Tile::woodSlab_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, true))->setTextureName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); - Item::items[Tile::sapling_Id] = ( new SaplingTileItem(Tile::sapling_Id - 256) )->setTextureName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->setUseDescriptionId(IDS_DESC_SAPLING); - Item::items[Tile::leaves_Id] = ( new LeafTileItem(Tile::leaves_Id - 256) )->setTextureName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->setUseDescriptionId(IDS_DESC_LEAVES); - Item::items[Tile::vine_Id] = ( new ColoredTileItem(Tile::vine_Id - 256, false))->setDescriptionId(IDS_TILE_VINE)->setUseDescriptionId(IDS_DESC_VINE); - int idsData[3] = {IDS_TILE_SHRUB, IDS_TILE_GRASS, IDS_TILE_FERN}; + Item::items[wool_Id] = ( new WoolTileItem(Tile::wool_Id- 256) )->setIconName(L"cloth")->setDescriptionId(IDS_TILE_CLOTH)->setUseDescriptionId(IDS_DESC_WOOL); + Item::items[clayHardened_colored_Id]= ( new WoolTileItem(Tile::clayHardened_colored_Id - 256))->setIconName(L"clayHardenedStained")->setDescriptionId(IDS_TILE_STAINED_CLAY)->setUseDescriptionId(IDS_DESC_STAINED_CLAY); + Item::items[stained_glass_Id] = ( new WoolTileItem(Tile::stained_glass_Id - 256))->setIconName(L"stainedGlass")->setDescriptionId(IDS_TILE_STAINED_GLASS)->setUseDescriptionId(IDS_DESC_STAINED_GLASS); + Item::items[stained_glass_pane_Id] = ( new WoolTileItem(Tile::stained_glass_pane_Id - 256))->setIconName(L"stainedGlassPane")->setDescriptionId(IDS_TILE_STAINED_GLASS_PANE)->setUseDescriptionId(IDS_DESC_STAINED_GLASS_PANE); + Item::items[woolCarpet_Id] = ( new WoolTileItem(Tile::woolCarpet_Id - 256))->setIconName(L"woolCarpet")->setDescriptionId(IDS_TILE_CARPET)->setUseDescriptionId(IDS_DESC_CARPET); + Item::items[treeTrunk_Id] = ( new MultiTextureTileItem(Tile::treeTrunk_Id - 256, treeTrunk, (int *)TreeTile::TREE_NAMES, 4) )->setIconName(L"log")->setDescriptionId(IDS_TILE_LOG)->setUseDescriptionId(IDS_DESC_LOG); + Item::items[wood_Id] = ( new MultiTextureTileItem(Tile::wood_Id - 256, Tile::wood, (int *)WoodTile::WOOD_NAMES, 4, IDS_TILE_PLANKS))->setIconName(L"wood")->setDescriptionId(IDS_TILE_OAKWOOD_PLANKS)->setUseDescriptionId(IDS_DESC_LOG); // <- TODO + Item::items[monsterStoneEgg_Id] = ( new MultiTextureTileItem(Tile::monsterStoneEgg_Id - 256, monsterStoneEgg, (int *)StoneMonsterTile::STONE_MONSTER_NAMES, 3))->setIconName(L"monsterStoneEgg")->setDescriptionId(IDS_TILE_STONE_SILVERFISH)->setUseDescriptionId(IDS_DESC_STONE_SILVERFISH); // 4J - Brought forward from post-1.2 to fix stacking problem + Item::items[stoneBrick_Id] = ( new MultiTextureTileItem(Tile::stoneBrick_Id - 256, stoneBrick,(int *)SmoothStoneBrickTile::SMOOTH_STONE_BRICK_NAMES, 4))->setIconName(L"stonebricksmooth")->setDescriptionId(IDS_TILE_STONE_BRICK_SMOOTH); + Item::items[sandStone_Id] = ( new MultiTextureTileItem(sandStone_Id - 256, sandStone, SandStoneTile::SANDSTONE_NAMES, SandStoneTile::SANDSTONE_BLOCK_NAMES) )->setIconName(L"sandStone")->setDescriptionId(IDS_TILE_SANDSTONE)->setUseDescriptionId(IDS_DESC_SANDSTONE); + Item::items[quartzBlock_Id] = ( new MultiTextureTileItem(quartzBlock_Id - 256, quartzBlock, QuartzBlockTile::BLOCK_NAMES, QuartzBlockTile::QUARTZ_BLOCK_NAMES) )->setIconName(L"quartzBlock")->setDescriptionId(IDS_TILE_QUARTZ_BLOCK)->setUseDescriptionId(IDS_DESC_QUARTZ_BLOCK); + Item::items[stoneSlabHalf_Id] = ( new StoneSlabTileItem(Tile::stoneSlabHalf_Id - 256, Tile::stoneSlabHalf, Tile::stoneSlab, false) )->setIconName(L"stoneSlab")->setDescriptionId(IDS_TILE_STONESLAB)->setUseDescriptionId(IDS_DESC_HALFSLAB); + Item::items[stoneSlab_Id] = ( new StoneSlabTileItem(Tile::stoneSlab_Id - 256, Tile::stoneSlabHalf, Tile::stoneSlab, true))->setIconName(L"stoneSlab")->setDescriptionId(IDS_DESC_STONESLAB)->setUseDescriptionId(IDS_DESC_SLAB); + Item::items[woodSlabHalf_Id] = ( new StoneSlabTileItem(Tile::woodSlabHalf_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, false))->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); + Item::items[woodSlab_Id] = ( new StoneSlabTileItem(Tile::woodSlab_Id - 256, Tile::woodSlabHalf, Tile::woodSlab, true))->setIconName(L"woodSlab")->setDescriptionId(IDS_DESC_WOODSLAB)->setUseDescriptionId(IDS_DESC_WOODSLAB); + Item::items[sapling_Id] = ( new MultiTextureTileItem(Tile::sapling_Id - 256, Tile::sapling, Sapling::SAPLING_NAMES, 4) )->setIconName(L"sapling")->setDescriptionId(IDS_TILE_SAPLING)->setUseDescriptionId(IDS_DESC_SAPLING); + Item::items[leaves_Id] = ( new LeafTileItem(Tile::leaves_Id - 256) )->setIconName(L"leaves")->setDescriptionId(IDS_TILE_LEAVES)->setUseDescriptionId(IDS_DESC_LEAVES); + Item::items[vine_Id] = ( new ColoredTileItem(Tile::vine_Id - 256, false))->setDescriptionId(IDS_TILE_VINE)->setUseDescriptionId(IDS_DESC_VINE); + int idsData[3] = {IDS_TILE_SHRUB, IDS_TILE_TALL_GRASS, IDS_TILE_FERN}; intArray ids = intArray(idsData, 3); - Item::items[Tile::tallgrass_Id] = ((ColoredTileItem *)(new ColoredTileItem(Tile::tallgrass_Id - 256, true))->setDescriptionId(IDS_TILE_TALL_GRASS))->setDescriptionPostfixes(ids); - Item::items[Tile::waterLily_Id] = ( new WaterLilyTileItem(Tile::waterLily_Id - 256)); - Item::items[Tile::pistonBase_Id] = ( new PistonTileItem(Tile::pistonBase_Id - 256) )->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(IDS_DESC_PISTON); - Item::items[Tile::pistonStickyBase_Id] = ( new PistonTileItem(Tile::pistonStickyBase_Id - 256) )->setDescriptionId(IDS_TILE_PISTON_STICK_BASE)->setUseDescriptionId(IDS_DESC_STICKY_PISTON); - Item::items[Tile::cobbleWall_Id] = ( new MultiTextureTileItem(cobbleWall_Id - 256, cobbleWall, (int *)WallTile::COBBLE_NAMES, 2) )->setDescriptionId(IDS_TILE_COBBLESTONE_WALL)->setUseDescriptionId(IDS_DESC_COBBLESTONE_WALL); - Item::items[Tile::anvil_Id] = ( new AnvilTileItem(anvil) )->setDescriptionId(IDS_TILE_ANVIL)->setUseDescriptionId(IDS_DESC_ANVIL); + Item::items[tallgrass_Id] = ( (ColoredTileItem *)(new ColoredTileItem(Tile::tallgrass_Id - 256, true))->setDescriptionId(IDS_TILE_TALL_GRASS))->setDescriptionPostfixes(ids); + Item::items[topSnow_Id] = ( new SnowItem(topSnow_Id - 256, topSnow) ); + Item::items[waterLily_Id] = ( new WaterLilyTileItem(Tile::waterLily_Id - 256)); + Item::items[pistonBase_Id] = ( new PistonTileItem(Tile::pistonBase_Id - 256) )->setDescriptionId(IDS_TILE_PISTON_BASE)->setUseDescriptionId(IDS_DESC_PISTON); + Item::items[pistonStickyBase_Id] = ( new PistonTileItem(Tile::pistonStickyBase_Id - 256) )->setDescriptionId(IDS_TILE_PISTON_STICK_BASE)->setUseDescriptionId(IDS_DESC_STICKY_PISTON); + Item::items[cobbleWall_Id] = ( new MultiTextureTileItem(cobbleWall_Id - 256, cobbleWall, (int *)WallTile::COBBLE_NAMES, 2) )->setDescriptionId(IDS_TILE_COBBLESTONE_WALL)->setUseDescriptionId(IDS_DESC_COBBLESTONE_WALL); + Item::items[anvil_Id] = ( new AnvilTileItem(anvil) )->setDescriptionId(IDS_TILE_ANVIL)->setUseDescriptionId(IDS_DESC_ANVIL); for (int i = 0; i < 256; i++) @@ -461,13 +483,13 @@ void Tile::staticCtor() Tile::tiles[i]->init(); } - bool propagate = false; - if (i > 0 && Tile::tiles[i]->getRenderShape() == Tile::SHAPE_STAIRS) propagate = true; - if (i > 0 && dynamic_cast(Tile::tiles[i]) != NULL) + bool propagate = false; + if (i > 0 && Tile::tiles[i]->getRenderShape() == Tile::SHAPE_STAIRS) propagate = true; + if (i > 0 && dynamic_cast(Tile::tiles[i]) != NULL) { - propagate = true; - } - if (i == Tile::farmland_Id) propagate = true; + propagate = true; + } + if (i == Tile::farmland_Id) propagate = true; if (Tile::transculent[i]) { propagate = true; @@ -476,7 +498,7 @@ void Tile::staticCtor() { propagate = true; } - Tile::propagate[i] = propagate; + Tile::propagate[i] = propagate; } } Tile::transculent[0] = true; @@ -519,7 +541,7 @@ void Tile::_init(int id, Material *material, bool isSolidRender) lightBlock[id] = isSolidRender ? 255 : 0; transculent[id] = !material->blocksLight(); mipmapEnable[id] = true; // 4J added - m_textureName = L""; + iconName = L""; } Tile::Tile(int id, Material *material, bool isSolidRender) @@ -541,7 +563,6 @@ void Tile::init() } - // 4J-PB - adding so we can class different items together for the new crafting menu // so pickaxe_stone would get tagged with pickaxe and stone Tile *Tile::setBaseItemTypeAndMaterial(int iType,int iMaterial) @@ -590,7 +611,7 @@ bool Tile::isSolidBlockingTile(int t) { Tile *tile = Tile::tiles[t]; if (tile == NULL) return false; - return tile->material->isSolidBlocking() && tile->isCubeShaped(); + return tile->material->isSolidBlocking() && tile->isCubeShaped() && !tile->isSignalSource(); } bool Tile::isCubeShaped() @@ -658,7 +679,7 @@ void Tile::setShape(float x0, float y0, float z0, float x1, float y1, float z1) tls->yy1 = y1; tls->zz1 = z1; tls->tileId = this->id; - + //this->xx0 = x0; //this->yy0 = y0; //this->zz0 = z0; @@ -670,7 +691,7 @@ void Tile::setShape(float x0, float y0, float z0, float x1, float y1, float z1) float Tile::getBrightness(LevelSource *level, int x, int y, int z) { // Lighting fix brought forward from ~1.5 here - used to use the lightEmission level for this tile rather than getting the for the passed in x/y/z coords - return level->getBrightness(x, y, z, Tile::lightEmission[level->getTile(x,y,z)]); + return level->getBrightness(x, y, z, lightEmission[level->getTile(x,y,z)]); } // 4J - brought forward from 1.8.2 @@ -679,11 +700,11 @@ int Tile::getLightColor(LevelSource *level, int x, int y, int z, int tileId/*=-1 // Lighting fix brought forward from ~1.5 here - used to use the lightEmission level for this tile rather than getting the for the passed in x/y/z coords if( tileId == -1 ) { - return level->getLightColor(x, y, z, Tile::lightEmission[level->getTile(x,y,z)], -1); + return level->getLightColor(x, y, z, lightEmission[level->getTile(x,y,z)], -1); } else { - return level->getLightColor(x, y, z, Tile::lightEmission[tileId], tileId); + return level->getLightColor(x, y, z, lightEmission[tileId], tileId); } } @@ -847,7 +868,7 @@ void Tile::addLights(Level *level, int x, int y, int z) { } -int Tile::getTickDelay() +int Tile::getTickDelay(Level *level) { return 10; } @@ -874,8 +895,11 @@ float Tile::getDestroyProgress(shared_ptr player, Level *level, int x, i { float destroySpeed = getDestroySpeed(level, x, y, z); if (destroySpeed < 0) return 0; - if (!player->canDestroy(this)) return 1 / destroySpeed / 100.0f; - return (player->getDestroySpeed(this) / destroySpeed) / 30; + if (!player->canDestroy(this)) + { + return player->getDestroySpeed(this, false) / destroySpeed / 100.0f; + } + return (player->getDestroySpeed(this, true) / destroySpeed) / 30; } void Tile::spawnResources(Level *level, int x, int y, int z, int data, int playerBonusLevel) @@ -899,7 +923,7 @@ void Tile::spawnResources(Level *level, int x, int y, int z, int data, float odd void Tile::popResource(Level *level, int x, int y, int z, shared_ptr itemInstance) { - if( level->isClientSide ) return; + if( level->isClientSide || !level->getGameRules()->getBoolean(GameRules::RULE_DOTILEDROPS) ) return; float s = 0.7f; double xo = level->random->nextFloat() * s + (1 - s) * 0.5; @@ -977,7 +1001,7 @@ HitResult *Tile::clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b) bool Tile::containsX(Vec3 *v) { if( v == NULL) return false; - + ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); // 4J Stu - Added this so that the TLS shape is correct for this tile if(tls->tileId != this->id) updateDefaultShape(); @@ -1004,10 +1028,15 @@ bool Tile::containsZ(Vec3 *v) return v->x >= tls->xx0 && v->x <= tls->xx1 && v->y >= tls->yy0 && v->y <= tls->yy1; } -void Tile::wasExploded(Level *level, int x, int y, int z) +void Tile::wasExploded(Level *level, int x, int y, int z, Explosion *explosion) { } +bool Tile::mayPlace(Level *level, int x, int y, int z, int face, shared_ptr item) +{ + return mayPlace(level, x, y, z, face); +} + int Tile::getRenderLayer() { return 0; @@ -1136,14 +1165,9 @@ int Tile::getColor(LevelSource *level, int x, int y, int z, int data) return 0xffffff; } -bool Tile::getSignal(LevelSource *level, int x, int y, int z) -{ - return false; -} - -bool Tile::getSignal(LevelSource *level, int x, int y, int z, int dir) +int Tile::getSignal(LevelSource *level, int x, int y, int z, int dir) { - return false; + return Redstone::SIGNAL_NONE; } bool Tile::isSignalSource() @@ -1155,9 +1179,9 @@ void Tile::entityInside(Level *level, int x, int y, int z, shared_ptr en { } -bool Tile::getDirectSignal(Level *level, int x, int y, int z, int dir) +int Tile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) { - return false; + return Redstone::SIGNAL_NONE; } void Tile::updateDefaultShape() @@ -1168,29 +1192,29 @@ void Tile::updateDefaultShape() void Tile::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { // 4J Stu - Special case - only record a crop destroy if is fully grown - if( id==Tile::crops_Id ) + if( id==Tile::wheat_Id ) { - if( Tile::crops->getResource(data, NULL, 0) > 0 ) + if( Tile::wheat->getResource(data, NULL, 0) > 0 ) player->awardStat( - GenericStats::blocksMined(id), - GenericStats::param_blocksMined(id,data,1) - ); + GenericStats::blocksMined(id), + GenericStats::param_blocksMined(id,data,1) + ); } else if (id == Tile::potatoes_Id) { if (Tile::potatoes->getResource(data, NULL, 0) > 0) player->awardStat( - GenericStats::blocksMined(id), - GenericStats::param_blocksMined(id,data,1) - ); + GenericStats::blocksMined(id), + GenericStats::param_blocksMined(id,data,1) + ); } else if (id == Tile::carrots_Id) { if (Tile::potatoes->getResource(data, NULL, 0) > 0) player->awardStat( - GenericStats::blocksMined(id), - GenericStats::param_blocksMined(id,data,1) - ); + GenericStats::blocksMined(id), + GenericStats::param_blocksMined(id,data,1) + ); } else { @@ -1206,19 +1230,19 @@ void Tile::playerDestroy(Level *level, shared_ptr player, int x, int y, player->awardStat(GenericStats::mineWood(), GenericStats::param_noArgs()); - if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player->inventory)) + if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player)) { - shared_ptr item = getSilkTouchItemInstance(data); - if (item != NULL) + shared_ptr item = getSilkTouchItemInstance(data); + if (item != NULL) { - popResource(level, x, y, z, item); - } - } + popResource(level, x, y, z, item); + } + } else { - int playerBonusLevel = EnchantmentHelper::getDiggingLootBonus(player->inventory); - spawnResources(level, x, y, z, data, playerBonusLevel); - } + int playerBonusLevel = EnchantmentHelper::getDiggingLootBonus(player); + spawnResources(level, x, y, z, data, playerBonusLevel); + } } bool Tile::isSilkTouchable() @@ -1228,12 +1252,12 @@ bool Tile::isSilkTouchable() shared_ptr Tile::getSilkTouchItemInstance(int data) { - int popData = 0; - if (id >= 0 && id < Item::items.length && Item::items[id]->isStackedByData()) + int popData = 0; + if (id >= 0 && id < Item::items.length && Item::items[id]->isStackedByData()) { - popData = data; - } - return shared_ptr(new ItemInstance(id, 1, popData)); + popData = data; + } + return shared_ptr(new ItemInstance(id, 1, popData)); } int Tile::getResourceCountForLootBonus(int bonusLevel, Random *random) @@ -1246,7 +1270,7 @@ bool Tile::canSurvive(Level *level, int x, int y, int z) return true; } -void Tile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void Tile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { } @@ -1281,8 +1305,9 @@ unsigned int Tile::getUseDescriptionId() return useDescriptionId; } -void Tile::triggerEvent(Level *level, int x, int y, int z, int b0, int b1) +bool Tile::triggerEvent(Level *level, int x, int y, int z, int b0, int b1) { + return false; } bool Tile::isCollectStatistics() @@ -1333,26 +1358,74 @@ void Tile::handleRain(Level *level, int x, int y, int z) { } - void Tile::levelTimeChanged(Level *level, __int64 delta, __int64 newTime) +void Tile::levelTimeChanged(Level *level, __int64 delta, __int64 newTime) { } -void Tile::registerIcons(IconRegister *iconRegister) +bool Tile::useOwnCloneData() +{ + return false; +} + +bool Tile::canInstantlyTick() { - icon = iconRegister->registerIcon(m_textureName); + return true; } -wstring Tile::getTileItemIconName() +bool Tile::dropFromExplosion(Explosion *explosion) { - return L""; + return true; +} + +bool Tile::isMatching(int id) +{ + return this->id == id; +} + +bool Tile::isMatching(int tileIdA, int tileIdB) +{ + if (tileIdA == tileIdB) + { + return true; + } + if (tileIdA == 0 || tileIdB == 0 || tiles[tileIdA] == NULL || tiles[tileIdB] == NULL) + { + return false; + } + return tiles[tileIdA]->isMatching(tileIdB); +} + +bool Tile::hasAnalogOutputSignal() +{ + return false; +} + +int Tile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + return Redstone::SIGNAL_NONE; } -Tile *Tile::setTextureName(const wstring &name) +Tile *Tile::setIconName(const wstring &iconName) { - m_textureName = name; + this->iconName = iconName; return this; } +wstring Tile::getIconName() +{ + return iconName.empty() ? L"MISSING_ICON_TILE_" + _toString(id) + L"_" + _toString(descriptionId) : iconName; +} + +void Tile::registerIcons(IconRegister *iconRegister) +{ + icon = iconRegister->registerIcon(getIconName()); +} + +wstring Tile::getTileItemIconName() +{ + return L""; +} + Tile::SoundType::SoundType(eMATERIALSOUND_TYPE eMaterialSound, float volume, float pitch, int iBreakSound, int iPlaceSound) { this->eMaterialSound = eMaterialSound; @@ -1478,14 +1551,14 @@ int Tile::SoundType::getPlaceSound() const /* - 4J: These are necessary on the PS3. - (and 4 and Vita). +4J: These are necessary on the PS3. +(and 4 and Vita). */ #if (defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) -const int Tile::rock_Id; +const int Tile::stone_Id; const int Tile::grass_Id; const int Tile::dirt_Id; -const int Tile::stoneBrick_Id; +// 4 const int Tile::wood_Id; const int Tile::sapling_Id; const int Tile::unbreakable_Id; @@ -1506,7 +1579,7 @@ const int Tile::lapisOre_Id; const int Tile::lapisBlock_Id; const int Tile::dispenser_Id; const int Tile::sandStone_Id; -const int Tile::musicBlock_Id; +// 25 const int Tile::bed_Id; const int Tile::goldenRail_Id; const int Tile::detectorRail_Id; @@ -1516,12 +1589,12 @@ const int Tile::tallgrass_Id; const int Tile::deadBush_Id; const int Tile::pistonBase_Id; const int Tile::pistonExtensionPiece_Id; -const int Tile::cloth_Id; +const int Tile::wool_Id; const int Tile::pistonMovingPiece_Id; const int Tile::flower_Id; const int Tile::rose_Id; -const int Tile::mushroom1_Id; -const int Tile::mushroom2_Id; +const int Tile::mushroom_brown_Id; +const int Tile::mushroom_red_Id; const int Tile::goldBlock_Id; const int Tile::ironBlock_Id; const int Tile::stoneSlab_Id; @@ -1529,7 +1602,7 @@ const int Tile::stoneSlabHalf_Id; const int Tile::redBrick_Id; const int Tile::tnt_Id; const int Tile::bookshelf_Id; -const int Tile::mossStone_Id; +const int Tile::mossyCobblestone_Id; const int Tile::obsidian_Id; const int Tile::torch_Id; const int Tile::fire_Id; @@ -1540,7 +1613,7 @@ const int Tile::redStoneDust_Id; const int Tile::diamondOre_Id; const int Tile::diamondBlock_Id; const int Tile::workBench_Id; -const int Tile::crops_Id; +const int Tile::wheat_Id; const int Tile::farmland_Id; const int Tile::furnace_Id; const int Tile::furnace_lit_Id; @@ -1556,8 +1629,8 @@ const int Tile::door_iron_Id; const int Tile::pressurePlate_wood_Id; const int Tile::redStoneOre_Id; const int Tile::redStoneOre_lit_Id; -const int Tile::notGate_off_Id; -const int Tile::notGate_on_Id; +const int Tile::redstoneTorch_off_Id; +const int Tile::redstoneTorch_on_Id; const int Tile::button_stone_Id; const int Tile::topSnow_Id; const int Tile::ice_Id; @@ -1565,23 +1638,23 @@ const int Tile::snow_Id; const int Tile::cactus_Id; const int Tile::clay_Id; const int Tile::reeds_Id; -const int Tile::recordPlayer_Id; +const int Tile::jukebox_Id; const int Tile::fence_Id; const int Tile::pumpkin_Id; -const int Tile::hellRock_Id; -const int Tile::hellSand_Id; -const int Tile::lightGem_Id; +const int Tile::netherRack_Id; +const int Tile::soulsand_Id; +const int Tile::glowstone_Id; const int Tile::portalTile_Id; const int Tile::litPumpkin_Id; const int Tile::cake_Id; const int Tile::diode_off_Id; const int Tile::diode_on_Id; -const int Tile::aprilFoolsJoke_Id; +const int Tile::stained_glass_Id; const int Tile::trapdoor_Id; const int Tile::monsterStoneEgg_Id; -const int Tile::stoneBrickSmooth_Id; -const int Tile::hugeMushroom1_Id; -const int Tile::hugeMushroom2_Id; +const int Tile::stoneBrick_Id; +const int Tile::hugeMushroom_brown_Id; +const int Tile::hugeMushroom_red_Id; const int Tile::ironFence_Id; const int Tile::thinGlass_Id; const int Tile::melon_Id; @@ -1590,7 +1663,7 @@ const int Tile::melonStem_Id; const int Tile::vine_Id; const int Tile::fenceGate_Id; const int Tile::stairs_bricks_Id; -const int Tile::stairs_stoneBrickSmooth_Id; +const int Tile::stairs_stoneBrick_Id; const int Tile::mycel_Id; const int Tile::waterLily_Id; const int Tile::netherBrick_Id; @@ -1602,7 +1675,7 @@ const int Tile::brewingStand_Id; const int Tile::cauldron_Id; const int Tile::endPortalTile_Id; const int Tile::endPortalFrameTile_Id; -const int Tile::whiteStone_Id; +const int Tile::endStone_Id; const int Tile::dragonEgg_Id; const int Tile::redstoneLight_Id; const int Tile::redstoneLight_lit_Id; diff --git a/Minecraft.World/Tile.h b/Minecraft.World/Tile.h index fa2f5786..142b32e6 100644 --- a/Minecraft.World/Tile.h +++ b/Minecraft.World/Tile.h @@ -25,10 +25,13 @@ class RedStoneDustTile; class RepeaterTile; class CauldronTile; class TripWireSourceTile; +class BeaconTile; +class ComparatorTile; +class DaylightDetectorTile; class Random; class HitResult; class Level; - +class HopperTile; class Player; class LevelSource; class Mob; @@ -63,9 +66,22 @@ public: static void ReleaseThreadStorage(); public: - static const int TILE_NUM_COUNT = 4096; - static const int TILE_NUM_MASK = 0xfff; // 4096 - 1 - static const int TILE_NUM_SHIFT = 12; // 4096 is 12 bits + static const int TILE_NUM_COUNT = 4096; + static const int TILE_NUM_MASK = 0xfff; // 4096 - 1 + static const int TILE_NUM_SHIFT = 12; // 4096 is 12 bits + + // tile update flags + // neighbors: notify neighbors the block changed + static const int UPDATE_NEIGHBORS = (1 << 0); + // clients: send tile update over network connections + static const int UPDATE_CLIENTS = (1 << 1); + // invisible: this update is invisible, so don't rebuild graphics + static const int UPDATE_INVISIBLE = (1 << 2); + // clients: send tile update over network connections + static const int UPDATE_INVISIBLE_NO_LIGHT = (1 << 3) | UPDATE_INVISIBLE; + + static const int UPDATE_NONE = UPDATE_INVISIBLE; + static const int UPDATE_ALL = UPDATE_NEIGHBORS | UPDATE_CLIENTS; private: // 4J Stu - Was const but had to change it so that we can initialise it in TileStaticInit @@ -73,21 +89,23 @@ private: protected: static const float INDESTRUCTIBLE_DESTROY_TIME; + wstring iconName; + public: class SoundType { public: -// wstring name; -// wstring breakSound; -// wstring stepSound; + // wstring name; + // wstring breakSound; + // wstring stepSound; eMATERIALSOUND_TYPE eMaterialSound; int iBreakSound,iStepSound,iPlaceSound; - float volume; - float pitch; + float volume; + float pitch; + + SoundType(eMATERIALSOUND_TYPE eMaterialSound, float volume, float pitch, int iBreakSound = -1, int iPlaceSound = -1); - SoundType(eMATERIALSOUND_TYPE eMaterialSound, float volume, float pitch, int iBreakSound = -1, int iPlaceSound = -1); - float getVolume() const; float getPitch() const; //wstring getBreakSound() const { return breakSound; } @@ -95,38 +113,38 @@ public: int getBreakSound() const; int getStepSound() const; int getPlaceSound() const; - }; - - static SoundType *SOUND_NORMAL; - static SoundType *SOUND_WOOD; - static SoundType *SOUND_GRAVEL; - static SoundType *SOUND_GRASS; - static SoundType *SOUND_STONE; - static SoundType *SOUND_METAL; - static SoundType *SOUND_GLASS; - static SoundType *SOUND_CLOTH; - static SoundType *SOUND_SAND; + }; + + static SoundType *SOUND_NORMAL; + static SoundType *SOUND_WOOD; + static SoundType *SOUND_GRAVEL; + static SoundType *SOUND_GRASS; + static SoundType *SOUND_STONE; + static SoundType *SOUND_METAL; + static SoundType *SOUND_GLASS; + static SoundType *SOUND_CLOTH; + static SoundType *SOUND_SAND; static SoundType *SOUND_SNOW; static SoundType *SOUND_LADDER; static SoundType *SOUND_ANVIL; - static const int SHAPE_INVISIBLE = -1; - static const int SHAPE_BLOCK = 0; - static const int SHAPE_CROSS_TEXTURE = 1; - static const int SHAPE_TORCH = 2; - static const int SHAPE_FIRE = 3; - static const int SHAPE_WATER = 4; - static const int SHAPE_RED_DUST = 5; - static const int SHAPE_ROWS = 6; - static const int SHAPE_DOOR = 7; - static const int SHAPE_LADDER = 8; - static const int SHAPE_RAIL = 9; - static const int SHAPE_STAIRS = 10; - static const int SHAPE_FENCE = 11; - static const int SHAPE_LEVER = 12; - static const int SHAPE_CACTUS = 13; - static const int SHAPE_BED = 14; - static const int SHAPE_DIODE = 15; + static const int SHAPE_INVISIBLE = -1; + static const int SHAPE_BLOCK = 0; + static const int SHAPE_CROSS_TEXTURE = 1; + static const int SHAPE_TORCH = 2; + static const int SHAPE_FIRE = 3; + static const int SHAPE_WATER = 4; + static const int SHAPE_RED_DUST = 5; + static const int SHAPE_ROWS = 6; + static const int SHAPE_DOOR = 7; + static const int SHAPE_LADDER = 8; + static const int SHAPE_RAIL = 9; + static const int SHAPE_STAIRS = 10; + static const int SHAPE_FENCE = 11; + static const int SHAPE_LEVER = 12; + static const int SHAPE_CACTUS = 13; + static const int SHAPE_BED = 14; + static const int SHAPE_REPEATER = 15; static const int SHAPE_PISTON_BASE = 16; static const int SHAPE_PISTON_EXTENSION = 17; static const int SHAPE_IRON_FENCE = 18; @@ -147,120 +165,135 @@ public: static const int SHAPE_FLOWER_POT = 33; static const int SHAPE_BEACON = 34; static const int SHAPE_ANVIL = 35; + static const int SHAPE_DIODE = 36; + static const int SHAPE_COMPARATOR = 37; + static const int SHAPE_HOPPER = 38; static const int SHAPE_QUARTZ = 39; + static const int SHAPE_THIN_PANE = 40; - static Tile **tiles; + static const int SHAPE_COUNT = 41; + + static Tile **tiles; static bool mipmapEnable[TILE_NUM_COUNT]; - static bool solid[TILE_NUM_COUNT]; - static int lightBlock[TILE_NUM_COUNT]; - static bool transculent[TILE_NUM_COUNT]; - static int lightEmission[TILE_NUM_COUNT]; - static unsigned char _sendTileData[TILE_NUM_COUNT]; // 4J - was bool, changed to bitfield so we can indicate which bits are important to be sent + static bool solid[TILE_NUM_COUNT]; + static int lightBlock[TILE_NUM_COUNT]; + static bool transculent[TILE_NUM_COUNT]; + static int lightEmission[TILE_NUM_COUNT]; + static unsigned char _sendTileData[TILE_NUM_COUNT]; // 4J - was bool, changed to bitfield so we can indicate which bits are important to be sent static bool propagate[TILE_NUM_COUNT]; // 4J - this array of simple constants made so the compiler can optimise references to Ids that were previous of the form Tile::->id, and are now simply Tile::whatever_Id - static const int rock_Id = 1; - static const int grass_Id = 2; - static const int dirt_Id = 3; - static const int stoneBrick_Id = 4; - static const int wood_Id = 5; - static const int sapling_Id = 6; - static const int unbreakable_Id = 7; - static const int water_Id = 8; - static const int calmWater_Id = 9; - static const int lava_Id = 10; - static const int calmLava_Id = 11; - static const int sand_Id = 12; - static const int gravel_Id = 13; - static const int goldOre_Id = 14; - static const int ironOre_Id = 15; - static const int coalOre_Id = 16; - static const int treeTrunk_Id = 17; - static const int leaves_Id = 18; - static const int sponge_Id = 19; - static const int glass_Id = 20; - static const int lapisOre_Id = 21; - static const int lapisBlock_Id = 22; - static const int dispenser_Id = 23; - static const int sandStone_Id = 24; - static const int musicBlock_Id = 25; - static const int bed_Id = 26; - static const int goldenRail_Id = 27; - static const int detectorRail_Id = 28; + static const int stone_Id = 1; + static const int grass_Id = 2; + static const int dirt_Id = 3; + static const int cobblestone_Id = 4; + static const int wood_Id = 5; + static const int sapling_Id = 6; + static const int unbreakable_Id = 7; + static const int water_Id = 8; + static const int calmWater_Id = 9; + static const int lava_Id = 10; + + static const int calmLava_Id = 11; + static const int sand_Id = 12; + static const int gravel_Id = 13; + static const int goldOre_Id = 14; + static const int ironOre_Id = 15; + static const int coalOre_Id = 16; + static const int treeTrunk_Id = 17; + static const int leaves_Id = 18; + static const int sponge_Id = 19; + static const int glass_Id = 20; + + static const int lapisOre_Id = 21; + static const int lapisBlock_Id = 22; + static const int dispenser_Id = 23; + static const int sandStone_Id = 24; + static const int noteblock_Id = 25; + static const int bed_Id = 26; + static const int goldenRail_Id = 27; + static const int detectorRail_Id = 28; static const int pistonStickyBase_Id = 29; static const int web_Id = 30; - static const int tallgrass_Id = 31; - static const int deadBush_Id = 32; + + static const int tallgrass_Id = 31; + static const int deadBush_Id = 32; static const int pistonBase_Id = 33; static const int pistonExtensionPiece_Id = 34; - static const int cloth_Id = 35; + static const int wool_Id = 35; static const int pistonMovingPiece_Id = 36; - static const int flower_Id = 37; - static const int rose_Id = 38; - static const int mushroom1_Id = 39; - static const int mushroom2_Id = 40; - static const int goldBlock_Id = 41; - static const int ironBlock_Id = 42; - static const int stoneSlab_Id = 43; - static const int stoneSlabHalf_Id = 44; - static const int redBrick_Id = 45; - static const int tnt_Id = 46; - static const int bookshelf_Id = 47; - static const int mossStone_Id = 48; - static const int obsidian_Id = 49; - static const int torch_Id = 50; - static const int fire_Id = 51; - static const int mobSpawner_Id = 52; - static const int stairs_wood_Id = 53; - static const int chest_Id = 54; - static const int redStoneDust_Id = 55; - static const int diamondOre_Id = 56; - static const int diamondBlock_Id = 57; - static const int workBench_Id = 58; - static const int crops_Id = 59; - static const int farmland_Id = 60; - static const int furnace_Id = 61; - static const int furnace_lit_Id = 62; - static const int sign_Id = 63; - static const int door_wood_Id = 64; - static const int ladder_Id = 65; - static const int rail_Id = 66; - static const int stairs_stone_Id = 67; - static const int wallSign_Id = 68; - static const int lever_Id = 69; - static const int pressurePlate_stone_Id = 70; - static const int door_iron_Id = 71; - static const int pressurePlate_wood_Id = 72; - static const int redStoneOre_Id = 73; - static const int redStoneOre_lit_Id = 74; - static const int notGate_off_Id = 75; - static const int notGate_on_Id = 76; - static const int button_stone_Id = 77; - static const int topSnow_Id = 78; - static const int ice_Id = 79; - static const int snow_Id = 80; - static const int cactus_Id = 81; - static const int clay_Id = 82; - static const int reeds_Id = 83; - static const int recordPlayer_Id = 84; - static const int fence_Id = 85; - static const int pumpkin_Id = 86; - static const int hellRock_Id = 87; - static const int hellSand_Id = 88; - static const int lightGem_Id = 89; - static const int portalTile_Id = 90; - static const int litPumpkin_Id = 91; - static const int cake_Id = 92; - static const int diode_off_Id = 93; - static const int diode_on_Id = 94; - static const int aprilFoolsJoke_Id = 95; - static const int trapdoor_Id = 96; - + static const int flower_Id = 37; + static const int rose_Id = 38; + static const int mushroom_brown_Id = 39; + static const int mushroom_red_Id = 40; + + static const int goldBlock_Id = 41; + static const int ironBlock_Id = 42; + static const int stoneSlab_Id = 43; + static const int stoneSlabHalf_Id = 44; + static const int redBrick_Id = 45; + static const int tnt_Id = 46; + static const int bookshelf_Id = 47; + static const int mossyCobblestone_Id = 48; + static const int obsidian_Id = 49; + static const int torch_Id = 50; + + static const int fire_Id = 51; + static const int mobSpawner_Id = 52; + static const int stairs_wood_Id = 53; + static const int chest_Id = 54; + static const int redStoneDust_Id = 55; + static const int diamondOre_Id = 56; + static const int diamondBlock_Id = 57; + static const int workBench_Id = 58; + static const int wheat_Id = 59; + static const int farmland_Id = 60; + + static const int furnace_Id = 61; + static const int furnace_lit_Id = 62; + static const int sign_Id = 63; + static const int door_wood_Id = 64; + static const int ladder_Id = 65; + static const int rail_Id = 66; + static const int stairs_stone_Id = 67; + static const int wallSign_Id = 68; + static const int lever_Id = 69; + static const int pressurePlate_stone_Id = 70; + + static const int door_iron_Id = 71; + static const int pressurePlate_wood_Id = 72; + static const int redStoneOre_Id = 73; + static const int redStoneOre_lit_Id = 74; + static const int redstoneTorch_off_Id = 75; + static const int redstoneTorch_on_Id = 76; + static const int button_stone_Id = 77; + static const int topSnow_Id = 78; + static const int ice_Id = 79; + static const int snow_Id = 80; + + static const int cactus_Id = 81; + static const int clay_Id = 82; + static const int reeds_Id = 83; + static const int jukebox_Id = 84; + static const int fence_Id = 85; + static const int pumpkin_Id = 86; + static const int netherRack_Id = 87; + static const int soulsand_Id = 88; + static const int glowstone_Id = 89; + static const int portalTile_Id = 90; + + static const int litPumpkin_Id = 91; + static const int cake_Id = 92; + static const int diode_off_Id = 93; + static const int diode_on_Id = 94; + static const int stained_glass_Id = 95; + static const int trapdoor_Id = 96; static const int monsterStoneEgg_Id = 97; - static const int stoneBrickSmooth_Id = 98; - static const int hugeMushroom1_Id = 99; - static const int hugeMushroom2_Id = 100; + static const int stoneBrick_Id = 98; + static const int hugeMushroom_brown_Id = 99; + static const int hugeMushroom_red_Id = 100; + static const int ironFence_Id = 101; static const int thinGlass_Id = 102; static const int melon_Id = 103; @@ -269,9 +302,9 @@ public: static const int vine_Id = 106; static const int fenceGate_Id = 107; static const int stairs_bricks_Id = 108; - static const int stairs_stoneBrickSmooth_Id = 109; - + static const int stairs_stoneBrick_Id = 109; static const int mycel_Id = 110; + static const int waterLily_Id = 111; static const int netherBrick_Id = 112; static const int netherFence_Id = 113; @@ -282,140 +315,158 @@ public: static const int cauldron_Id = 118; static const int endPortalTile_Id = 119; static const int endPortalFrameTile_Id = 120; - static const int whiteStone_Id = 121; + + static const int endStone_Id = 121; static const int dragonEgg_Id = 122; static const int redstoneLight_Id = 123; static const int redstoneLight_lit_Id = 124; - - static const int woodSlab_Id = 125; static const int woodSlabHalf_Id = 126; static const int cocoa_Id = 127; static const int stairs_sandstone_Id = 128; - static const int stairs_sprucewood_Id = 134; - static const int stairs_birchwood_Id = 135; - static const int stairs_junglewood_Id = 136; static const int emeraldOre_Id = 129; static const int enderChest_Id = 130; + static const int tripWireSource_Id = 131; static const int tripWire_Id = 132; static const int emeraldBlock_Id = 133; - + static const int stairs_sprucewood_Id = 134; + static const int stairs_birchwood_Id = 135; + static const int stairs_junglewood_Id = 136; + static const int commandBlock_Id = 137; + static const int beacon_Id = 138; static const int cobbleWall_Id = 139; static const int flowerPot_Id = 140; + static const int carrots_Id = 141; static const int potatoes_Id = 142; - static const int anvil_Id = 145; static const int button_wood_Id = 143; static const int skull_Id = 144; + static const int anvil_Id = 145; + static const int chest_trap_Id = 146; + static const int weightedPlate_light_Id = 147; + static const int weightedPlate_heavy_Id = 148; + static const int comparator_off_Id = 149; + static const int comparator_on_Id = 150; + + static const int daylightDetector_Id = 151; + static const int redstoneBlock_Id = 152; static const int netherQuartz_Id = 153; + static const int hopper_Id = 154; static const int quartzBlock_Id = 155; static const int stairs_quartz_Id = 156; + static const int activatorRail_Id = 157; + static const int dropper_Id = 158; + static const int clayHardened_colored_Id = 159; + static const int stained_glass_pane_Id = 160; + static const int hayBlock_Id = 170; static const int woolCarpet_Id = 171; - - - static Tile *rock; - static GrassTile *grass; - static Tile *dirt; - static Tile *stoneBrick; - static Tile *wood; - static Tile *sapling; - static Tile *unbreakable; - static LiquidTile *water; - static Tile *calmWater; - static LiquidTile *lava; - static Tile *calmLava; - static Tile *sand; - static Tile *gravel; - static Tile *goldOre; - static Tile *ironOre; - static Tile *coalOre; - static Tile *treeTrunk; - static LeafTile *leaves; - static Tile *sponge; - static Tile *glass; - static Tile *lapisOre; - static Tile *lapisBlock; - static Tile *dispenser; - static Tile *sandStone; - static Tile *musicBlock; - static Tile *bed; - static Tile *goldenRail; - static Tile *detectorRail; + static const int clayHardened_Id = 172; + static const int coalBlock_Id = 173; + + + static Tile *stone; + static GrassTile *grass; + static Tile *dirt; + static Tile *cobblestone; + static Tile *wood; + static Tile *sapling; + static Tile *unbreakable; + static LiquidTile *water; + static Tile *calmWater; + static LiquidTile *lava; + static Tile *calmLava; + static Tile *sand; + static Tile *gravel; + static Tile *goldOre; + static Tile *ironOre; + static Tile *coalOre; + static Tile *treeTrunk; + static LeafTile *leaves; + static Tile *sponge; + static Tile *glass; + static Tile *lapisOre; + static Tile *lapisBlock; + static Tile *dispenser; + static Tile *sandStone; + static Tile *noteblock; + static Tile *bed; + static Tile *goldenRail; + static Tile *detectorRail; static PistonBaseTile *pistonStickyBase; - static Tile *web; - static TallGrass *tallgrass; - static DeadBushTile *deadBush; - static PistonBaseTile *pistonBase; - static PistonExtensionTile *pistonExtension; - static Tile *cloth; - static PistonMovingPiece *pistonMovingPiece; - static Bush *flower; - static Bush *rose; - static Bush *mushroom1; - static Bush *mushroom2; - static Tile *goldBlock; - static Tile *ironBlock; -// static Tile *stoneSlab; -// static Tile *stoneSlabHalf; - static Tile *redBrick; - static Tile *tnt; - static Tile *bookshelf; - static Tile *mossStone; - static Tile *obsidian; - static Tile *torch; - static FireTile *fire; - static Tile *mobSpawner; - static Tile *stairs_wood; - static ChestTile *chest; - static RedStoneDustTile *redStoneDust; - static Tile *diamondOre; - static Tile *diamondBlock; - static Tile *workBench; - static Tile *crops; - static Tile *farmland; - static Tile *furnace; - static Tile *furnace_lit; - static Tile *sign; - static Tile *door_wood; - static Tile *ladder; - static Tile *rail; - static Tile *stairs_stone; - static Tile *wallSign; - static Tile *lever; - static Tile *pressurePlate_stone; - static Tile *door_iron; - static Tile *pressurePlate_wood; - static Tile *redStoneOre; - static Tile *redStoneOre_lit; - static Tile *notGate_off; - static Tile *notGate_on; - static Tile *button; - static Tile *topSnow; - static Tile *ice; - static Tile *snow; - static Tile *cactus; - static Tile *clay; - static Tile *reeds; - static Tile *recordPlayer; - static Tile *fence; - static Tile *pumpkin; - static Tile *hellRock; - static Tile *hellSand; - static Tile *lightGem; - static PortalTile *portalTile; - static Tile *litPumpkin; - static Tile *cake; - static RepeaterTile *diode_off; - static RepeaterTile *diode_on; - static Tile *aprilFoolsJoke; - static Tile *trapdoor; + static Tile *web; + static TallGrass *tallgrass; + static DeadBushTile *deadBush; + static PistonBaseTile *pistonBase; + static PistonExtensionTile *pistonExtension; + static Tile *wool; + static PistonMovingPiece *pistonMovingPiece; + static Bush *flower; + static Bush *rose; + static Bush *mushroom_brown; + static Bush *mushroom_red; + static Tile *goldBlock; + static Tile *ironBlock; + // static Tile *stoneSlab; + // static Tile *stoneSlabHalf; + static Tile *redBrick; + static Tile *tnt; + static Tile *bookshelf; + static Tile *mossyCobblestone; + static Tile *obsidian; + static Tile *torch; + static FireTile *fire; + static Tile *mobSpawner; + static Tile *stairs_wood; + static ChestTile *chest; + static RedStoneDustTile *redStoneDust; + static Tile *diamondOre; + static Tile *diamondBlock; + static Tile *workBench; + static Tile *wheat; + static Tile *farmland; + static Tile *furnace; + static Tile *furnace_lit; + static Tile *sign; + static Tile *door_wood; + static Tile *ladder; + static Tile *rail; + static Tile *stairs_stone; + static Tile *wallSign; + static Tile *lever; + static Tile *pressurePlate_stone; + static Tile *door_iron; + static Tile *pressurePlate_wood; + static Tile *redStoneOre; + static Tile *redStoneOre_lit; + static Tile *redstoneTorch_off; + static Tile *redstoneTorch_on; + static Tile *button; + static Tile *topSnow; + static Tile *ice; + static Tile *snow; + static Tile *cactus; + static Tile *clay; + static Tile *reeds; + static Tile *jukebox; + static Tile *fence; + static Tile *pumpkin; + static Tile *netherRack; + static Tile *soulsand; + static Tile *glowstone; + static PortalTile *portalTile; + static Tile *litPumpkin; + static Tile *cake; + static RepeaterTile *diode_off; + static RepeaterTile *diode_on; + static Tile *stained_glass; + static Tile *trapdoor; static Tile *monsterStoneEgg; - static Tile *stoneBrickSmooth; - static Tile *hugeMushroom1; - static Tile *hugeMushroom2; + static Tile *stoneBrick; + static Tile *hugeMushroom_brown; + static Tile *hugeMushroom_red; static Tile *ironFence; static Tile *thinGlass; static Tile *melon; @@ -426,19 +477,19 @@ public: static Tile *stairs_bricks; static Tile *stairs_stoneBrickSmooth; - static MycelTile *mycel; - static Tile *waterLily; - static Tile *netherBrick; - static Tile *netherFence; - static Tile *stairs_netherBricks; - static Tile *netherStalk; - static Tile *enchantTable; - static Tile *brewingStand; - static CauldronTile *cauldron; - static Tile *endPortalTile; - static Tile *endPortalFrameTile; - static Tile *whiteStone; - static Tile *dragonEgg; + static MycelTile *mycel; + static Tile *waterLily; + static Tile *netherBrick; + static Tile *netherFence; + static Tile *stairs_netherBricks; + static Tile *netherStalk; + static Tile *enchantTable; + static Tile *brewingStand; + static CauldronTile *cauldron; + static Tile *endPortalTile; + static Tile *endPortalFrameTile; + static Tile *endStone; + static Tile *dragonEgg; static Tile *redstoneLight; static Tile *redstoneLight_lit; @@ -446,6 +497,8 @@ public: static Tile *woodStairsDark; static Tile *woodStairsBirch; static Tile *woodStairsJungle; + static Tile *commandBlock; + static BeaconTile *beacon; static Tile *button_wood; static HalfSlabTile *woodSlab; static HalfSlabTile *woodSlabHalf; @@ -456,7 +509,7 @@ public: static TripWireSourceTile *tripWireSource; static Tile *tripWire; static Tile *emeraldBlock; - + static Tile *cocoa; static Tile *skull; @@ -464,63 +517,78 @@ public: static Tile *flowerPot; static Tile *carrots; static Tile *potatoes; - static Tile *anvil; + static Tile *anvil; + static Tile *chest_trap; + static Tile *weightedPlate_light; + static Tile *weightedPlate_heavy; + static ComparatorTile *comparator_off; + static ComparatorTile *comparator_on; + + static DaylightDetectorTile *daylightDetector; + static Tile *redstoneBlock; + static Tile *netherQuartz; + static HopperTile *hopper; static Tile *quartzBlock; static Tile *stairs_quartz; + static Tile *activatorRail; + static Tile *dropper; + static Tile *clayHardened_colored; + static Tile *stained_glass_pane; + static Tile *hayBlock; static Tile *woolCarpet; + static Tile *clayHardened; + static Tile *coalBlock; static void staticCtor(); - int id; + int id; protected: - float destroySpeed; - float explosionResistance; - bool isInventoryItem; - bool collectStatistics; + float destroySpeed; + float explosionResistance; + bool isInventoryItem; + bool collectStatistics; bool _isTicking; bool _isEntityTile; int m_iMaterial; int m_iBaseItemType; // 4J Stu - Removed this in favour of a TLS version - //double xx0, yy0, zz0, xx1, yy1, zz1; + //double xx0, yy0, zz0, xx1, yy1, zz1; public: - const SoundType *soundType; + const SoundType *soundType; - float gravity; - Material *material; - float friction; + float gravity; + Material *material; + float friction; private: - unsigned int descriptionId; - unsigned int useDescriptionId; // 4J Added - - wstring m_textureName; + unsigned int descriptionId; + unsigned int useDescriptionId; // 4J Added protected: Icon *icon; protected: void _init(int id, Material *material, bool isSolidRender); - Tile(int id, Material *material, bool isSolidRender = true); + Tile(int id, Material *material, bool isSolidRender = true); virtual ~Tile() {} protected: - virtual Tile *sendTileData(unsigned char importantMask=15); // 4J - added importantMask to indicate which bits in the data are important + virtual Tile *sendTileData(unsigned char importantMask=15); // 4J - added importantMask to indicate which bits in the data are important protected: - virtual void init(); - virtual Tile *setSoundType(const SoundType *soundType); - virtual Tile *setLightBlock(int i); - virtual Tile *setLightEmission(float f); - virtual Tile *setExplodeable(float explosionResistance); + virtual void init(); + virtual Tile *setSoundType(const SoundType *soundType); + virtual Tile *setLightBlock(int i); + virtual Tile *setLightEmission(float f); + virtual Tile *setExplodeable(float explosionResistance); Tile *setBaseItemTypeAndMaterial(int iType,int iMaterial); public: static bool isSolidBlockingTile(int t); - virtual bool isCubeShaped(); + virtual bool isCubeShaped(); virtual bool isPathfindable(LevelSource *level, int x, int y, int z); - virtual int getRenderShape(); + virtual int getRenderShape(); // 4J-PB added int getBaseItemType(); int getMaterial(); @@ -530,103 +598,103 @@ protected: public: virtual float getDestroySpeed(Level *level, int x, int y, int z); protected: - virtual Tile *setTicking(bool tick); + virtual Tile *setTicking(bool tick); virtual Tile *disableMipmap(); public: virtual bool isTicking(); virtual bool isEntityTile(); virtual void setShape(float x0, float y0, float z0, float x1, float y1, float z1); - virtual float getBrightness(LevelSource *level, int x, int y, int z); + virtual float getBrightness(LevelSource *level, int x, int y, int z); virtual int getLightColor(LevelSource *level, int x, int y, int z, int tileId=-1); // 4J - brought forward from 1.8.2 - static bool isFaceVisible(Level *level, int x, int y, int z, int f); - virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); - virtual bool isSolidFace(LevelSource *level, int x, int y, int z, int face); - virtual Icon *getTexture(LevelSource *level, int x, int y, int z, int face); - virtual Icon *getTexture(int face, int data); - virtual Icon *getTexture(int face); - virtual AABB *getTileAABB(Level *level, int x, int y, int z); + static bool isFaceVisible(Level *level, int x, int y, int z, int f); + virtual bool shouldRenderFace(LevelSource *level, int x, int y, int z, int face); + virtual bool isSolidFace(LevelSource *level, int x, int y, int z, int face); + virtual Icon *getTexture(LevelSource *level, int x, int y, int z, int face); + virtual Icon *getTexture(int face, int data); + virtual Icon *getTexture(int face); + virtual AABB *getTileAABB(Level *level, int x, int y, int z); virtual void addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source); - virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual bool isSolidRender(bool isServerLevel = false); // 4J - Added isServerLevel param - virtual bool mayPick(int data, bool liquid); - virtual bool mayPick(); - virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual void animateTick(Level *level, int x, int y, int z, Random *random); - virtual void destroy(Level *level, int x, int y, int z, int data); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); - virtual void addLights(Level *level, int x, int y, int z); - virtual int getTickDelay(); - virtual void onPlace(Level *level, int x, int y, int z); - virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual int getResourceCount(Random *random); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual float getDestroyProgress(shared_ptr player, Level *level, int x, int y, int z); - virtual void spawnResources(Level *level, int x, int y, int z, int data, int playerBonusLevel); - virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual bool isSolidRender(bool isServerLevel = false); // 4J - Added isServerLevel param + virtual bool mayPick(int data, bool liquid); + virtual bool mayPick(); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void animateTick(Level *level, int x, int y, int z, Random *random); + virtual void destroy(Level *level, int x, int y, int z, int data); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void addLights(Level *level, int x, int y, int z); + virtual int getTickDelay(Level *level); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual int getResourceCount(Random *random); + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual float getDestroyProgress(shared_ptr player, Level *level, int x, int y, int z); + virtual void spawnResources(Level *level, int x, int y, int z, int data, int playerBonusLevel); + virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonusLevel); protected: virtual void popResource(Level *level, int x, int y, int z, shared_ptr itemInstance); virtual void popExperience(Level *level, int x, int y, int z, int amount); public: virtual int getSpawnResourcesAuxValue(int data); - virtual float getExplosionResistance(shared_ptr source); - virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); + virtual float getExplosionResistance(shared_ptr source); + virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); private: - virtual bool containsX(Vec3 *v); - virtual bool containsY(Vec3 *v); - virtual bool containsZ(Vec3 *v); + virtual bool containsX(Vec3 *v); + virtual bool containsY(Vec3 *v); + virtual bool containsZ(Vec3 *v); public: - virtual void wasExploded(Level *level, int x, int y, int z); - virtual int getRenderLayer(); - virtual bool mayPlace(Level *level, int x, int y, int z, int face); - virtual bool mayPlace(Level *level, int x, int y, int z); + virtual void wasExploded(Level *level, int x, int y, int z, Explosion *explosion); + virtual int getRenderLayer(); + virtual bool mayPlace(Level *level, int x, int y, int z, int face, shared_ptr item); + virtual bool mayPlace(Level *level, int x, int y, int z, int face); + virtual bool mayPlace(Level *level, int x, int y, int z); virtual bool TestUse(); virtual bool TestUse(Level *level, int x, int y, int z, shared_ptr player); virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - virtual void stepOn(Level *level, int x, int y, int z, shared_ptr entity); + virtual void stepOn(Level *level, int x, int y, int z, shared_ptr entity); virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); - virtual void prepareRender(Level *level, int x, int y, int z); - virtual void attack(Level *level, int x, int y, int z, shared_ptr player); - virtual void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); - virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual void prepareRender(Level *level, int x, int y, int z); + virtual void attack(Level *level, int x, int y, int z, shared_ptr player); + virtual void handleEntityInside(Level *level, int x, int y, int z, shared_ptr e, Vec3 *current); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param virtual double getShapeX0(); virtual double getShapeX1(); virtual double getShapeY0(); virtual double getShapeY1(); virtual double getShapeZ0(); virtual double getShapeZ1(); - virtual int getColor() const; + virtual int getColor() const; virtual int getColor(int auxData); - virtual int getColor(LevelSource *level, int x, int y, int z); + virtual int getColor(LevelSource *level, int x, int y, int z); virtual int getColor(LevelSource *level, int x, int y, int z, int data); // 4J added - virtual bool getSignal(LevelSource *level, int x, int y, int z); - virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); - virtual bool isSignalSource(); - virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); - virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); - virtual void updateDefaultShape(); - virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); - virtual bool canSurvive(Level *level, int x, int y, int z); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual bool isSignalSource(); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); + virtual void updateDefaultShape(); + virtual void playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data); + virtual bool canSurvive(Level *level, int x, int y, int z); protected: virtual bool isSilkTouchable(); virtual shared_ptr getSilkTouchItemInstance(int data); public: virtual int getResourceCountForLootBonus(int bonusLevel, Random *random); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); virtual void finalizePlacement(Level *level, int x, int y, int z, int data); - virtual Tile *setDescriptionId(unsigned int id); - virtual wstring getName(); - virtual unsigned int getDescriptionId(int iData = -1); - virtual Tile *setUseDescriptionId(unsigned int id); // 4J Added - virtual unsigned int getUseDescriptionId(); // 4J Added - virtual void triggerEvent(Level *level, int x, int y, int z, int b0, int b1); - virtual bool isCollectStatistics(); + virtual Tile *setDescriptionId(unsigned int id); + virtual wstring getName(); + virtual unsigned int getDescriptionId(int iData = -1); + virtual Tile *setUseDescriptionId(unsigned int id); // 4J Added + virtual unsigned int getUseDescriptionId(); // 4J Added + virtual bool triggerEvent(Level *level, int x, int y, int z, int b0, int b1); + virtual bool isCollectStatistics(); // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing // Default to true (it's also checking a bool array) and just override when we need to be able to say no virtual bool shouldTileTick(Level *level, int x,int y,int z) { return true; } protected: - virtual Tile *setNotCollectStatistics(); + virtual Tile *setNotCollectStatistics(); public: virtual int getPistonPushReaction(); virtual float getShadeBrightness(LevelSource *level, int x, int y, int z); // 4J - brought forward from 1.8.2 @@ -637,10 +705,22 @@ public: virtual void onRemoving(Level *level, int x, int y, int z, int data); virtual void handleRain(Level *level, int x, int y, int z); virtual void levelTimeChanged(Level *level, __int64 delta, __int64 newTime); + virtual bool useOwnCloneData(); + virtual bool canInstantlyTick(); + virtual bool dropFromExplosion(Explosion *explosion); + virtual bool isMatching(int id); + static bool isMatching(int tileIdA, int tileIdB); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); + +protected: + virtual Tile *setIconName(const wstring &iconName); + virtual wstring getIconName(); + +public: virtual void registerIcons(IconRegister *iconRegister); virtual wstring getTileItemIconName(); - // 4J Using per-item textures now - Tile *setTextureName(const wstring &name); + // AP - added this function so we can generate the faceFlags for a block in a single fast function int getFaceFlags(LevelSource *level, int x, int y, int z); }; diff --git a/Minecraft.World/TileDestructionPacket.cpp b/Minecraft.World/TileDestructionPacket.cpp index e009e0e0..bf05e6e2 100644 --- a/Minecraft.World/TileDestructionPacket.cpp +++ b/Minecraft.World/TileDestructionPacket.cpp @@ -26,7 +26,7 @@ void TileDestructionPacket::read(DataInputStream *dis) x = dis->readInt(); y = dis->readInt(); z = dis->readInt(); - state = dis->read(); + state = dis->readUnsignedByte(); } void TileDestructionPacket::write(DataOutputStream *dos) diff --git a/Minecraft.World/TileEditorOpenPacket.cpp b/Minecraft.World/TileEditorOpenPacket.cpp new file mode 100644 index 00000000..7be8270b --- /dev/null +++ b/Minecraft.World/TileEditorOpenPacket.cpp @@ -0,0 +1,44 @@ +#include "stdafx.h" + +#include "PacketListener.h" +#include "TileEditorOpenPacket.h" + +TileEditorOpenPacket::TileEditorOpenPacket() +{ + editorType = 0; + x = y = z = 0; +} + +TileEditorOpenPacket::TileEditorOpenPacket(int editorType, int x, int y, int z) +{ + this->editorType = editorType; + this->x = x; + this->y = y; + this->z = z; +} + +void TileEditorOpenPacket::handle(PacketListener *listener) +{ + listener->handleTileEditorOpen(shared_from_this()); +} + +void TileEditorOpenPacket::read(DataInputStream *dis) +{ + this->editorType = dis->readByte(); + this->x = dis->readInt(); + this->y = dis->readInt(); + this->z = dis->readInt(); +} + +void TileEditorOpenPacket::write(DataOutputStream *dos) +{ + dos->writeByte(editorType); + dos->writeInt(x); + dos->writeInt(y); + dos->writeInt(z); +} + +int TileEditorOpenPacket::getEstimatedSize() +{ + return 1 + 3 * 4; +} \ No newline at end of file diff --git a/Minecraft.World/TileEditorOpenPacket.h b/Minecraft.World/TileEditorOpenPacket.h new file mode 100644 index 00000000..20a731bb --- /dev/null +++ b/Minecraft.World/TileEditorOpenPacket.h @@ -0,0 +1,25 @@ +#pragma once + +#include "Packet.h" + +class TileEditorOpenPacket : public Packet, public enable_shared_from_this +{ +public: + static const int SIGN = 0; + static const int COMMAND_BLOCK = 1; + + int editorType; + int x, y, z; + + TileEditorOpenPacket(); + TileEditorOpenPacket(int editorType, int x, int y, int z); + + virtual void handle(PacketListener *listener); + virtual void read(DataInputStream *dis); + virtual void write(DataOutputStream *dos); + virtual int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new TileEditorOpenPacket()); } + virtual int getId() { return 133; } +}; \ No newline at end of file diff --git a/Minecraft.World/TileEntity.cpp b/Minecraft.World/TileEntity.cpp index 0790601d..ded0c665 100644 --- a/Minecraft.World/TileEntity.cpp +++ b/Minecraft.World/TileEntity.cpp @@ -16,8 +16,9 @@ void TileEntity::staticCtor() TileEntity::setId(FurnaceTileEntity::create, eTYPE_FURNACETILEENTITY, L"Furnace"); TileEntity::setId(ChestTileEntity::create, eTYPE_CHESTTILEENTITY, L"Chest"); TileEntity::setId(EnderChestTileEntity::create, eTYPE_ENDERCHESTTILEENTITY, L"EnderChest"); - TileEntity::setId(RecordPlayerTile::Entity::create, eTYPE_RECORDPLAYERTILE, L"RecordPlayer"); + TileEntity::setId(JukeboxTile::Entity::create, eTYPE_RECORDPLAYERTILE, L"RecordPlayer"); TileEntity::setId(DispenserTileEntity::create, eTYPE_DISPENSERTILEENTITY, L"Trap"); + TileEntity::setId(DropperTileEntity::create, eTYPE_DROPPERTILEENTITY, L"Dropper"); TileEntity::setId(SignTileEntity::create, eTYPE_SIGNTILEENTITY, L"Sign"); TileEntity::setId(MobSpawnerTileEntity::create, eTYPE_MOBSPAWNERTILEENTITY, L"MobSpawner"); TileEntity::setId(MusicTileEntity::create, eTYPE_MUSICTILEENTITY, L"Music"); @@ -25,7 +26,12 @@ void TileEntity::staticCtor() TileEntity::setId(BrewingStandTileEntity::create, eTYPE_BREWINGSTANDTILEENTITY, L"Cauldron"); TileEntity::setId(EnchantmentTableEntity::create, eTYPE_ENCHANTMENTTABLEENTITY, L"EnchantTable"); TileEntity::setId(TheEndPortalTileEntity::create, eTYPE_THEENDPORTALTILEENTITY, L"Airportal"); + TileEntity::setId(CommandBlockEntity::create, eTYPE_COMMANDBLOCKTILEENTITY, L"Control"); + TileEntity::setId(BeaconTileEntity::create, eTYPE_BEACONTILEENTITY, L"Beacon"); TileEntity::setId(SkullTileEntity::create,eTYPE_SKULLTILEENTITY, L"Skull"); + TileEntity::setId(DaylightDetectorTileEntity::create, eTYPE_DAYLIGHTDETECTORTILEENTITY, L"DLDetector"); + TileEntity::setId(HopperTileEntity::create, eTYPE_HOPPERTILEENTITY, L"Hopper"); + TileEntity::setId(ComparatorTileEntity::create, eTYPE_COMPARATORTILEENTITY, L"Comparator"); } void TileEntity::setId(tileEntityCreateFn createFn, eINSTANCEOF clas, wstring id) @@ -123,10 +129,10 @@ int TileEntity::getData() return data; } -void TileEntity::setData(int data) +void TileEntity::setData(int data, int updateFlags) { this->data = data; - level->setData(x, y, z, data); + level->setData(x, y, z, data, updateFlags); } void TileEntity::setChanged() @@ -135,6 +141,7 @@ void TileEntity::setChanged() { data = level->getData(x, y, z); level->tileEntityChanged(x, y, z, shared_from_this()); + if (getTile() != NULL) level->updateNeighbourForOutputSignal(x, y, z, getTile()->id); } } @@ -146,6 +153,11 @@ double TileEntity::distanceToSqr(double xPlayer, double yPlayer, double zPlayer) return xd * xd + yd * yd + zd * zd; } +double TileEntity::getViewDistance() +{ + return 64 * 64; +} + Tile *TileEntity::getTile() { if( tile == NULL ) tile = Tile::tiles[level->getTile(x, y, z)]; @@ -171,14 +183,16 @@ void TileEntity::clearRemoved() { remove = false; } -void TileEntity::triggerEvent(int b0, int b1) + +bool TileEntity::triggerEvent(int b0, int b1) { + return false; } void TileEntity::clearCache() { - tile = NULL; - data = -1; + tile = NULL; + data = -1; } void TileEntity::setRenderRemoveStage( unsigned char stage ) diff --git a/Minecraft.World/TileEntity.h b/Minecraft.World/TileEntity.h index aa3ced4f..8addb3ed 100644 --- a/Minecraft.World/TileEntity.h +++ b/Minecraft.World/TileEntity.h @@ -48,23 +48,24 @@ public: void upgradeRenderRemoveStage(); // 4J added bool shouldRemoveForRender(); // 4J added - Level *getLevel(); - void setLevel(Level *level); - bool hasLevel(); + virtual Level *getLevel(); + virtual void setLevel(Level *level); + virtual bool hasLevel(); virtual void load(CompoundTag *tag); virtual void save(CompoundTag *tag); virtual void tick(); static shared_ptr loadStatic(CompoundTag *tag); - int getData(); - void setData(int data); - void setChanged(); - double distanceToSqr(double xPlayer, double yPlayer, double zPlayer); - Tile *getTile(); + virtual int getData(); + virtual void setData(int data, int updateFlags); + virtual void setChanged(); + virtual double distanceToSqr(double xPlayer, double yPlayer, double zPlayer); + virtual double getViewDistance(); + virtual Tile *getTile(); virtual shared_ptr getUpdatePacket(); virtual bool isRemoved(); virtual void setRemoved(); virtual void clearRemoved(); - virtual void triggerEvent(int b0, int b1); + virtual bool triggerEvent(int b0, int b1); virtual void clearCache(); // 4J Added diff --git a/Minecraft.World/TileEventPacket.cpp b/Minecraft.World/TileEventPacket.cpp index 51e6857c..1bdeaef7 100644 --- a/Minecraft.World/TileEventPacket.cpp +++ b/Minecraft.World/TileEventPacket.cpp @@ -30,8 +30,8 @@ void TileEventPacket::read(DataInputStream *dis) //throws IOException x = dis->readInt(); y = dis->readShort(); z = dis->readInt(); - b0 = dis->read(); - b1 = dis->read(); + b0 = dis->readUnsignedByte(); + b1 = dis->readUnsignedByte(); tile = dis->readShort() & Tile::TILE_NUM_MASK; } diff --git a/Minecraft.World/TileItem.cpp b/Minecraft.World/TileItem.cpp index 8f624bff..ce313dd6 100644 --- a/Minecraft.World/TileItem.cpp +++ b/Minecraft.World/TileItem.cpp @@ -19,13 +19,13 @@ using namespace std; TileItem::TileItem(int id) : Item(id) { - this->tileId = id + 256; - itemIcon = NULL; + this->tileId = id + 256; + itemIcon = NULL; } int TileItem::getTileId() { - return tileId; + return tileId; } int TileItem::getIconType() @@ -50,40 +50,40 @@ bool TileItem::useOn(shared_ptr instance, shared_ptr playe { // 4J-PB - Adding a test only version to allow tooltips to be displayed int currentTile = level->getTile(x, y, z); - if (currentTile == Tile::topSnow_Id) + if (currentTile == Tile::topSnow_Id && (level->getData(x, y, z) & TopSnowTile::HEIGHT_MASK) < 1) { - face = Facing::UP; + face = Facing::UP; } else if (currentTile == Tile::vine_Id || currentTile == Tile::tallgrass_Id || currentTile == Tile::deadBush_Id) { } else { - if (face == 0) y--; - if (face == 1) y++; - if (face == 2) z--; - if (face == 3) z++; - if (face == 4) x--; - if (face == 5) x++; - } + if (face == 0) y--; + if (face == 1) y++; + if (face == 2) z--; + if (face == 3) z++; + if (face == 4) x--; + if (face == 5) x++; + } - if (instance->count == 0) return false; - if (!player->mayBuild(x, y, z)) return false; + if (instance->count == 0) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; if (y == Level::maxBuildHeight - 1 && Tile::tiles[tileId]->material->isSolid()) return false; int undertile = level->getTile(x,y-1,z); // For 'BodyGuard' achievement. - if (level->mayPlace(tileId, x, y, z, false, face, player)) + if (level->mayPlace(tileId, x, y, z, false, face, player, instance)) { if(!bTestUseOnOnly) { Tile *tile = Tile::tiles[tileId]; // 4J - Adding this from 1.6 - int itemValue = getLevelDataForAuxValue(instance->getAuxValue()); - int dataValue = Tile::tiles[tileId]->getPlacedOnFaceDataValue(level, x, y, z, face, clickX, clickY, clickZ, itemValue); - if (level->setTileAndData(x, y, z, tileId, dataValue)) + int itemValue = getLevelDataForAuxValue(instance->getAuxValue()); + int dataValue = Tile::tiles[tileId]->getPlacedOnFaceDataValue(level, x, y, z, face, clickX, clickY, clickZ, itemValue); + if (level->setTileAndData(x, y, z, tileId, dataValue, Tile::UPDATE_ALL)) { // 4J-JEV: Snow/Iron Golems do not have owners apparently. int newTileId = level->getTile(x,y,z); @@ -108,40 +108,40 @@ bool TileItem::useOn(shared_ptr instance, shared_ptr playe // 4J - Original comment // ok this may look stupid, but neighbor updates can cause the - // placed block to become something else before these methods - // are called + // placed block to become something else before these methods + // are called if (level->getTile(x, y, z) == tileId) { - Tile::tiles[tileId]->setPlacedBy(level, x, y, z, player); - Tile::tiles[tileId]->finalizePlacement(level, x, y, z, dataValue); + Tile::tiles[tileId]->setPlacedBy(level, x, y, z, player, instance); + Tile::tiles[tileId]->finalizePlacement(level, x, y, z, dataValue); } - + // 4J-PB - Java 1.4 change - getStepSound replaced with getPlaceSound //level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, tile->soundType->getStepSound(), (tile->soundType->getVolume() + 1) / 2, tile->soundType->getPitch() * 0.8f); #ifdef _DEBUG int iPlaceSound=tile->soundType->getPlaceSound(); int iStepSound=tile->soundType->getStepSound(); -// char szPlaceSoundName[256]; -// char szStepSoundName[256]; -// Minecraft *pMinecraft = Minecraft::GetInstance(); -// -// if(iPlaceSound==-1) -// { -// strcpy(szPlaceSoundName,"NULL"); -// } -// else -// { -// pMinecraft->soundEngine->GetSoundName(szPlaceSoundName,iPlaceSound); -// } -// if(iStepSound==-1) -// { -// strcpy(szStepSoundName,"NULL"); -// } -// else -// { -// pMinecraft->soundEngine->GetSoundName(szStepSoundName,iStepSound); -// } + // char szPlaceSoundName[256]; + // char szStepSoundName[256]; + // Minecraft *pMinecraft = Minecraft::GetInstance(); + // + // if(iPlaceSound==-1) + // { + // strcpy(szPlaceSoundName,"NULL"); + // } + // else + // { + // pMinecraft->soundEngine->GetSoundName(szPlaceSoundName,iPlaceSound); + // } + // if(iStepSound==-1) + // { + // strcpy(szStepSoundName,"NULL"); + // } + // else + // { + // pMinecraft->soundEngine->GetSoundName(szStepSoundName,iStepSound); + // } //app.DebugPrintf("Place Sound - %s, Step Sound - %s\n",szPlaceSoundName,szStepSoundName); app.DebugPrintf("Place Sound - %d, Step Sound - %d\n",iPlaceSound,iStepSound); @@ -156,9 +156,9 @@ bool TileItem::useOn(shared_ptr instance, shared_ptr playe } } } - return true; - } - return false; + return true; + } + return false; } @@ -179,7 +179,7 @@ bool TileItem::mayPlace(Level *level, int x, int y, int z, int face, shared_ptr< if (face == 5) x++; } - return level->mayPlace(getTileId(), x, y, z, false, face, nullptr); + return level->mayPlace(getTileId(), x, y, z, false, face, nullptr, item); } // 4J Added to colourise some tile types in the hint popups @@ -190,25 +190,25 @@ int TileItem::getColor(int itemAuxValue, int spriteLayer) unsigned int TileItem::getDescriptionId(shared_ptr instance) { - return Tile::tiles[tileId]->getDescriptionId(); + return Tile::tiles[tileId]->getDescriptionId(); } unsigned int TileItem::getDescriptionId(int iData /*= -1*/) { - return Tile::tiles[tileId]->getDescriptionId(iData); + return Tile::tiles[tileId]->getDescriptionId(iData); } unsigned int TileItem::getUseDescriptionId(shared_ptr instance) { - return Tile::tiles[tileId]->getUseDescriptionId(); + return Tile::tiles[tileId]->getUseDescriptionId(); } unsigned int TileItem::getUseDescriptionId() { - return Tile::tiles[tileId]->getUseDescriptionId(); + return Tile::tiles[tileId]->getUseDescriptionId(); } void TileItem::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/TilePlanterItem.cpp b/Minecraft.World/TilePlanterItem.cpp index 883da76e..3a8f0dea 100644 --- a/Minecraft.World/TilePlanterItem.cpp +++ b/Minecraft.World/TilePlanterItem.cpp @@ -12,40 +12,40 @@ TilePlanterItem::TilePlanterItem(int id, Tile *tile) : Item(id) { - this->tileId = tile->id; + this->tileId = tile->id; } bool TilePlanterItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed int currentTile = level->getTile(x, y, z); - if (currentTile == Tile::topSnow_Id) + if (currentTile == Tile::topSnow_Id && (level->getData(x, y, z) & TopSnowTile::HEIGHT_MASK) < 1) { - face = Facing::UP; - } + face = Facing::UP; + } else if (currentTile == Tile::vine_Id || currentTile == Tile::tallgrass_Id || currentTile == Tile::deadBush_Id) { } else { - if (face == 0) y--; - if (face == 1) y++; - if (face == 2) z--; - if (face == 3) z++; - if (face == 4) x--; - if (face == 5) x++; - } + if (face == 0) y--; + if (face == 1) y++; + if (face == 2) z--; + if (face == 3) z++; + if (face == 4) x--; + if (face == 5) x++; + } - if (!player->mayBuild(x, y, z)) return false; - if (instance->count == 0) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; + if (instance->count == 0) return false; - if (level->mayPlace(tileId, x, y, z, false, face, nullptr)) + if (level->mayPlace(tileId, x, y, z, false, face, nullptr, instance)) { if(!bTestUseOnOnly) { Tile *tile = Tile::tiles[tileId]; int dataValue = tile->getPlacedOnFaceDataValue(level, x, y, z, face, clickX, clickY, clickZ, 0); - if (level->setTileAndData(x, y, z, tileId, dataValue)) + if (level->setTileAndData(x, y, z, tileId, dataValue, Tile::UPDATE_ALL)) { // 4J-JEV: Hook for durango 'BlockPlaced' event. player->awardStat(GenericStats::blocksPlaced(tileId),GenericStats::param_blocksPlaced(tileId,instance->getAuxValue(),1)); @@ -56,14 +56,14 @@ bool TilePlanterItem::useOn(shared_ptr instance, shared_ptrgetTile(x, y, z) == tileId) { - Tile::tiles[tileId]->setPlacedBy(level, x, y, z, player); + Tile::tiles[tileId]->setPlacedBy(level, x, y, z, player, instance); Tile::tiles[tileId]->finalizePlacement(level, x, y, z, dataValue); } - level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, tile->soundType->getStepSound(), (tile->soundType->getVolume() + 1) / 2, tile->soundType->getPitch() * 0.8f); + level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, tile->soundType->getPlaceSound(), (tile->soundType->getVolume() + 1) / 2, tile->soundType->getPitch() * 0.8f); // 4J-PB - If we have the debug option on, don't reduce the number of this item - #ifndef _FINAL_BUILD +#ifndef _FINAL_BUILD if(!(app.DebugSettingsOn() && app.GetGameSettingsDebugMask()&(1L<count--; } @@ -76,5 +76,5 @@ bool TilePlanterItem::useOn(shared_ptr instance, shared_ptrreadInt(); - y = dis->read(); + y = dis->readUnsignedByte(); z = dis->readInt(); block = (int)dis->readShort() & 0xffff; diff --git a/Minecraft.World/TimeCommand.cpp b/Minecraft.World/TimeCommand.cpp index e667a420..4ac23c94 100644 --- a/Minecraft.World/TimeCommand.cpp +++ b/Minecraft.World/TimeCommand.cpp @@ -10,6 +10,11 @@ EGameCommand TimeCommand::getId() return eGameCommand_Time; } +int TimeCommand::getPermissionLevel() +{ + return LEVEL_GAMEMASTERS; +} + void TimeCommand::execute(shared_ptr source, byteArray commandData) { ByteArrayInputStream bais(commandData); @@ -56,7 +61,7 @@ void TimeCommand::doSetTime(shared_ptr source, int value) { for (int i = 0; i < MinecraftServer::getInstance()->levels.length; i++) { - MinecraftServer::getInstance()->levels[i]->setTimeAndAdjustTileTicks(value); + MinecraftServer::getInstance()->levels[i]->setDayTime(value); } } @@ -65,7 +70,7 @@ void TimeCommand::doAddTime(shared_ptr source, int value) for (int i = 0; i < MinecraftServer::getInstance()->levels.length; i++) { ServerLevel *level = MinecraftServer::getInstance()->levels[i]; - level->setTimeAndAdjustTileTicks(level->getTime() + value); + level->setDayTime(level->getDayTime() + value); } } diff --git a/Minecraft.World/TimeCommand.h b/Minecraft.World/TimeCommand.h index f87fb27c..20d4ef54 100644 --- a/Minecraft.World/TimeCommand.h +++ b/Minecraft.World/TimeCommand.h @@ -6,6 +6,7 @@ class TimeCommand : public Command { public: virtual EGameCommand getId(); + virtual int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData); protected: diff --git a/Minecraft.World/TntTile.cpp b/Minecraft.World/TntTile.cpp index b422959c..430755fc 100644 --- a/Minecraft.World/TntTile.cpp +++ b/Minecraft.World/TntTile.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.h" #include "net.minecraft.h" @@ -25,22 +26,19 @@ Icon *TntTile::getTexture(int face, int data) void TntTile::onPlace(Level *level, int x, int y, int z) { Tile::onPlace(level, x, y, z); - if (level->hasNeighborSignal(x, y, z) && app.GetGameHostOption(eGameHostOption_TNT)) + if (level->hasNeighborSignal(x, y, z) && app.GetGameHostOption(eGameHostOption_TNT)) { - destroy(level, x, y, z, EXPLODE_BIT); - level->setTile(x, y, z, 0); - } + destroy(level, x, y, z, EXPLODE_BIT); + level->removeTile(x, y, z); + } } void TntTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (type > 0 && Tile::tiles[type]->isSignalSource()) + if (level->hasNeighborSignal(x, y, z) && app.GetGameHostOption(eGameHostOption_TNT)) { - if (level->hasNeighborSignal(x, y, z) && app.GetGameHostOption(eGameHostOption_TNT)) - { - destroy(level, x, y, z, EXPLODE_BIT); - level->setTile(x, y, z, 0); - } + destroy(level, x, y, z, EXPLODE_BIT); + level->removeTile(x, y, z); } } @@ -49,7 +47,7 @@ int TntTile::getResourceCount(Random *random) return 1; } -void TntTile::wasExploded(Level *level, int x, int y, int z) +void TntTile::wasExploded(Level *level, int x, int y, int z, Explosion *explosion) { // 4J - added - don't every create on the client, I think this must be the cause of a bug reported in the java // version where white tnts are created in the network game @@ -59,13 +57,18 @@ void TntTile::wasExploded(Level *level, int x, int y, int z) // 4J-JEV: Fix for #90934 - Customer Encountered: TU11: Content: Gameplay: TNT blocks are triggered by explosions even though "TNT explodes" option is unchecked. if( level->newPrimedTntAllowed() && app.GetGameHostOption(eGameHostOption_TNT) ) { - shared_ptr primed = shared_ptr( new PrimedTnt(level, x + 0.5f, y + 0.5f, z + 0.5f) ); + shared_ptr primed = shared_ptr( new PrimedTnt(level, x + 0.5f, y + 0.5f, z + 0.5f, explosion->getSourceMob()) ); primed->life = level->random->nextInt(primed->life / 4) + primed->life / 8; level->addEntity(primed); } } void TntTile::destroy(Level *level, int x, int y, int z, int data) +{ + destroy(level, x, y, z, data, nullptr); +} + +void TntTile::destroy(Level *level, int x, int y, int z, int data, shared_ptr source) { if (level->isClientSide) return; @@ -74,9 +77,9 @@ void TntTile::destroy(Level *level, int x, int y, int z, int data) // 4J - added condition to have finite limit of these if( level->newPrimedTntAllowed() && app.GetGameHostOption(eGameHostOption_TNT) ) { - shared_ptr tnt = shared_ptr( new PrimedTnt(level, x + 0.5f, y + 0.5f, z + 0.5f) ); + shared_ptr tnt = shared_ptr( new PrimedTnt(level, x + 0.5f, y + 0.5f, z + 0.5f, source) ); level->addEntity(tnt); - level->playSound(tnt, eSoundType_RANDOM_FUSE, 1, 1.0f); + level->playEntitySound(tnt, eSoundType_RANDOM_FUSE, 1, 1.0f); } } } @@ -86,8 +89,9 @@ bool TntTile::use(Level *level, int x, int y, int z, shared_ptr player, if (soundOnly) return false; if (player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::flintAndSteel_Id) { - destroy(level, x, y, z, EXPLODE_BIT); - level->setTile(x, y, z, 0); + destroy(level, x, y, z, EXPLODE_BIT, player); + level->removeTile(x, y, z); + player->getSelectedItem()->hurtAndBreak(1, player); return true; } return Tile::use(level, x, y, z, player, clickedFace, clickX, clickY, clickZ); @@ -97,24 +101,23 @@ void TntTile::entityInside(Level *level, int x, int y, int z, shared_ptr { if (entity->GetType() == eTYPE_ARROW && !level->isClientSide) { - // 4J Stu - Don't need to cast this - //shared_ptr arrow = dynamic_pointer_cast(entity); if (entity->isOnFire()) { - destroy(level, x, y, z, EXPLODE_BIT); - level->setTile(x, y, z, 0); + shared_ptr arrow = dynamic_pointer_cast(entity); + destroy(level, x, y, z, EXPLODE_BIT, arrow->owner->instanceof(eTYPE_LIVINGENTITY) ? dynamic_pointer_cast(arrow->owner) : nullptr); + level->removeTile(x, y, z); } } } -shared_ptr TntTile::getSilkTouchItemInstance(int data) -{ - return nullptr; -} - void TntTile::registerIcons(IconRegister *iconRegister) { icon = iconRegister->registerIcon(L"tnt_side"); iconTop = iconRegister->registerIcon(L"tnt_top"); iconBottom = iconRegister->registerIcon(L"tnt_bottom"); +} + +bool TntTile::dropFromExplosion(Explosion *explosion) +{ + return false; } \ No newline at end of file diff --git a/Minecraft.World/TntTile.h b/Minecraft.World/TntTile.h index 27b788c6..ac73e64b 100644 --- a/Minecraft.World/TntTile.h +++ b/Minecraft.World/TntTile.h @@ -12,20 +12,15 @@ public: static const int EXPLODE_BIT = 1; TntTile(int id); - Icon *getTexture(int face, int data); + virtual Icon *getTexture(int face, int data); virtual void onPlace(Level *level, int x, int y, int z); - - void neighborChanged(Level *level, int x, int y, int z, int type); - - int getResourceCount(Random *random); - - void wasExploded(Level *level, int x, int y, int z); - - void destroy(Level *level, int x, int y, int z, int data); - - bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - - void entityInside(Level *level, int x, int y, int z, shared_ptr entity); - virtual shared_ptr getSilkTouchItemInstance(int data); - void registerIcons(IconRegister *iconRegister); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual int getResourceCount(Random *random); + virtual void wasExploded(Level *level, int x, int y, int z, Explosion *explosion); + virtual void destroy(Level *level, int x, int y, int z, int data); + virtual void destroy(Level *level, int x, int y, int z, int data, shared_ptr source); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); + virtual bool dropFromExplosion(Explosion *explosion); + virtual void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/ToggleDownfallCommand.cpp b/Minecraft.World/ToggleDownfallCommand.cpp index 1ae2f3a9..1d0a4d9e 100644 --- a/Minecraft.World/ToggleDownfallCommand.cpp +++ b/Minecraft.World/ToggleDownfallCommand.cpp @@ -12,6 +12,11 @@ EGameCommand ToggleDownfallCommand::getId() return eGameCommand_ToggleDownfall; } +int ToggleDownfallCommand::getPermissionLevel() +{ + return LEVEL_GAMEMASTERS; +} + void ToggleDownfallCommand::execute(shared_ptr source, byteArray commandData) { doToggleDownfall(); diff --git a/Minecraft.World/ToggleDownfallCommand.h b/Minecraft.World/ToggleDownfallCommand.h index 2954962b..2623e8d4 100644 --- a/Minecraft.World/ToggleDownfallCommand.h +++ b/Minecraft.World/ToggleDownfallCommand.h @@ -7,6 +7,7 @@ class ToggleDownfallCommand : public Command { public: virtual EGameCommand getId(); + virtual int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData); protected: diff --git a/Minecraft.World/ToolRecipies.cpp b/Minecraft.World/ToolRecipies.cpp index 8524924b..8ee4bbab 100644 --- a/Minecraft.World/ToolRecipies.cpp +++ b/Minecraft.World/ToolRecipies.cpp @@ -1,7 +1,3 @@ -//package net.minecraft.world.item.crafting; - -//import net.minecraft.world.item.*; -//import net.minecraft.world.level.tile.Tile; #include "stdafx.h" #include "net.minecraft.world.item.h" #include "Tile.h" @@ -29,23 +25,12 @@ wstring ToolRecipies::shapes[][4] = L" #"},// }; -/* - Object[][] map = { - {Tile.wood, Tile.stoneBrick, Item.ironIngot, Item.diamond, Item.goldIngot}, - {Item.pickAxe_wood, Item.pickAxe_stone, Item.pickAxe_iron, Item.pickAxe_diamond, Item.pickAxe_gold}, - {Item.shovel_wood, Item.shovel_stone, Item.shovel_iron, Item.shovel_diamond, Item.shovel_gold}, - {Item.hatchet_wood, Item.hatchet_stone, Item.hatchet_iron, Item.hatchet_diamond, Item.hatchet_gold}, - {Item.hoe_wood, Item.hoe_stone, Item.hoe_iron, Item.hoe_diamond, Item.hoe_gold}, - }; - */ -//#define ADD_OBJECT(a,b) a.push_back(new Object(b)) - void ToolRecipies::_init() { map = new vector [MAX_TOOL_RECIPES]; ADD_OBJECT(map[0],Tile::wood); - ADD_OBJECT(map[0],Tile::stoneBrick); + ADD_OBJECT(map[0],Tile::cobblestone); ADD_OBJECT(map[0],Item::ironIngot); ADD_OBJECT(map[0],Item::diamond); ADD_OBJECT(map[0],Item::goldIngot); diff --git a/Minecraft.World/TopSnowTile.cpp b/Minecraft.World/TopSnowTile.cpp index 9bcf5527..033b4eb2 100644 --- a/Minecraft.World/TopSnowTile.cpp +++ b/Minecraft.World/TopSnowTile.cpp @@ -9,14 +9,13 @@ #include "TopSnowTile.h" const int TopSnowTile::MAX_HEIGHT = 6; - const int TopSnowTile::HEIGHT_MASK = 7; // max 8 steps - TopSnowTile::TopSnowTile(int id) : Tile(id, Material::topSnow,isSolidRender()) { setShape(0, 0, 0, 1, 2 / 16.0f, 1); setTicking(true); + updateShape(0); } void TopSnowTile::registerIcons(IconRegister *iconRegister) @@ -27,12 +26,9 @@ void TopSnowTile::registerIcons(IconRegister *iconRegister) AABB *TopSnowTile::getAABB(Level *level, int x, int y, int z) { int height = level->getData(x, y, z) & HEIGHT_MASK; - if (height >= (MAX_HEIGHT / 2)) - { - ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); - return AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + .5f, z + tls->zz1); - } - return NULL; + float offset = 2.0f / SharedConstants::WORLD_RESOLUTION; + ThreadStorage *tls = (ThreadStorage *)TlsGetValue(Tile::tlsIdxShape); + return AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + (height * offset), z + tls->zz1); } float TopSnowTile::getHeight(Level *level, int x, int y, int z) @@ -41,19 +37,16 @@ float TopSnowTile::getHeight(Level *level, int x, int y, int z) return 2 * (1 + height) / 16.0f; } - bool TopSnowTile::blocksLight() { return false; } - bool TopSnowTile::isSolidRender(bool isServerLevel) { return false; } - bool TopSnowTile::isCubeShaped() { return false; @@ -79,67 +72,57 @@ void TopSnowTile::updateShape(int data) bool TopSnowTile::mayPlace(Level *level, int x, int y, int z) { int t = level->getTile(x, y - 1, z); + if (t == 0) return false; + if (t == id && (level->getData(x, y - 1, z) & HEIGHT_MASK) == MAX_HEIGHT + 1) return true; // 4J Stu - Assume when placing that this is the server level and we don't care how it's going to be rendered // Fix for #9407 - Gameplay: Destroying a block of snow on top of trees, removes any adjacent snow. - if (t == 0 || (t != Tile::leaves_Id && !Tile::tiles[t]->isSolidRender(true))) return false; + if (t != Tile::leaves_Id && !Tile::tiles[t]->isSolidRender(true)) return false; return level->getMaterial(x, y - 1, z)->blocksMotion(); } - void TopSnowTile::neighborChanged(Level *level, int x, int y, int z, int type) { checkCanSurvive(level, x, y, z); } - bool TopSnowTile::checkCanSurvive(Level *level, int x, int y, int z) { if (!mayPlace(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); return false; } return true; } - void TopSnowTile::playerDestroy(Level *level, shared_ptr player, int x, int y, int z, int data) { int type = Item::snowBall->id; - float s = 0.7f; - double xo = level->random->nextFloat() * s + (1 - s) * 0.5; - double yo = level->random->nextFloat() * s + (1 - s) * 0.5; - double zo = level->random->nextFloat() * s + (1 - s) * 0.5; - shared_ptr item = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(type, 1, 0) ) ) ); - item->throwTime = 10; - level->addEntity(item); - level->setTile(x, y, z, 0); + int height = data & HEIGHT_MASK; + popResource(level, x, y, z, shared_ptr( new ItemInstance(type, height + 1, 0))); + level->removeTile(x, y, z); } - int TopSnowTile::getResource(int data, Random *random, int playerBonusLevel) { return Item::snowBall->id; } - int TopSnowTile::getResourceCount(Random *random) { return 0; } - void TopSnowTile::tick(Level *level, int x, int y, int z, Random *random) { if (level->getBrightness(LightLayer::Block, x, y, z) > 11) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); } } - bool TopSnowTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int face) { if (face == 1) return true; @@ -155,20 +138,20 @@ bool TopSnowTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int // offsetting by the face direction) switch(face) { - case 2: - zz += 1; - break; - case 3: - zz -= 1; - break; - case 4: - xx += 1; - break; - case 5: - xx -= 1; - break; - default: - break; + case 2: + zz += 1; + break; + case 3: + zz -= 1; + break; + case 4: + xx += 1; + break; + case 5: + xx -= 1; + break; + default: + break; } int h1 = level->getData(xx,yy,zz) & HEIGHT_MASK; if( h0 >= h1 ) return false; @@ -178,5 +161,5 @@ bool TopSnowTile::shouldRenderFace(LevelSource *level, int x, int y, int z, int bool TopSnowTile::shouldTileTick(Level *level, int x,int y,int z) { - return level->getBrightness(LightLayer::Block, x, y, z) > 11; + return level->getBrightness(LightLayer::Block, x, y, z) > 11; } diff --git a/Minecraft.World/TorchTile.cpp b/Minecraft.World/TorchTile.cpp index ea1d2ab7..cc377574 100644 --- a/Minecraft.World/TorchTile.cpp +++ b/Minecraft.World/TorchTile.cpp @@ -133,29 +133,34 @@ void TorchTile::onPlace(Level *level, int x, int y, int z) { if (level->isSolidBlockingTileInLoadedChunk(x - 1, y, z, true)) { - level->setData(x, y, z, 1); + level->setData(x, y, z, 1, Tile::UPDATE_CLIENTS); } else if (level->isSolidBlockingTileInLoadedChunk(x + 1, y, z, true)) { - level->setData(x, y, z, 2); + level->setData(x, y, z, 2, Tile::UPDATE_CLIENTS); } else if (level->isSolidBlockingTileInLoadedChunk(x, y, z - 1, true)) { - level->setData(x, y, z, 3); + level->setData(x, y, z, 3, Tile::UPDATE_CLIENTS); } else if (level->isSolidBlockingTileInLoadedChunk(x, y, z + 1, true)) { - level->setData(x, y, z, 4); + level->setData(x, y, z, 4, Tile::UPDATE_CLIENTS); } else if (isConnection(level, x, y - 1, z)) { - level->setData(x, y, z, 5); + level->setData(x, y, z, 5, Tile::UPDATE_CLIENTS); } } checkCanSurvive(level, x, y, z); } void TorchTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + checkDoPop(level, x, y, z, type); +} + +bool TorchTile::checkDoPop(Level *level, int x, int y, int z, int type) { if (checkCanSurvive(level, x, y, z)) { @@ -170,10 +175,16 @@ void TorchTile::neighborChanged(Level *level, int x, int y, int z, int type) if (replace) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + return true; } } + else + { + return true; + } + return false; } bool TorchTile::checkCanSurvive(Level *level, int x, int y, int z) @@ -183,7 +194,7 @@ bool TorchTile::checkCanSurvive(Level *level, int x, int y, int z) if (level->getTile(x, y, z) == id) { this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } return false; } diff --git a/Minecraft.World/TorchTile.h b/Minecraft.World/TorchTile.h index 7e27f2ee..55043c4c 100644 --- a/Minecraft.World/TorchTile.h +++ b/Minecraft.World/TorchTile.h @@ -12,25 +12,28 @@ protected: TorchTile(int id); public: virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual AABB *getTileAABB(Level *level, int x, int y, int z); + virtual AABB *getTileAABB(Level *level, int x, int y, int z); virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param using Tile::setShape; virtual void setShape(int data); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual int getRenderShape(); - bool isConnection(Level *level, int x, int y, int z); - virtual bool mayPlace(Level *level, int x, int y, int z); - virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); - virtual void tick(Level *level, int x, int y, int z, Random *random); - virtual void onPlace(Level *level, int x, int y, int z); - virtual void neighborChanged(Level *level, int x, int y, int z, int type); -private: + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual int getRenderShape(); + virtual bool isConnection(Level *level, int x, int y, int z); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + +protected: + virtual bool checkDoPop(Level *level, int x, int y, int z, int type); virtual bool checkCanSurvive(Level *level, int x, int y, int z); + public: virtual HitResult *clip(Level *level, int x, int y, int z, Vec3 *a, Vec3 *b); - virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); - + virtual void animateTick(Level *level, int xt, int yt, int zt, Random *random); + // 4J Added so we can check before we try to add a tile to the tick list if it's actually going to do seomthing virtual bool shouldTileTick(Level *level, int x,int y,int z); }; diff --git a/Minecraft.World/TrapDoorTile.cpp b/Minecraft.World/TrapDoorTile.cpp index fc9d6580..9b668e3f 100644 --- a/Minecraft.World/TrapDoorTile.cpp +++ b/Minecraft.World/TrapDoorTile.cpp @@ -72,7 +72,14 @@ void TrapDoorTile::setShape(int data) { float r = 3 / 16.0f; - Tile::setShape(0, 0, 0, 1, r, 1); + if ((data & TOP_MASK) != 0) + { + setShape(0, 1 - r, 0, 1, 1, 1); + } + else + { + setShape(0, 0, 0, 1, r, 1); + } if (isOpen(data)) { if ((data & 3) == 0) setShape(0, 0, 1 - r, 1, 1, 1); @@ -85,7 +92,7 @@ void TrapDoorTile::setShape(int data) void TrapDoorTile::attack(Level *level, int x, int y, int z, shared_ptr player) { - use(level, x, y, z, player, 0, 0, 0, 0); + //use(level, x, y, z, player, 0, 0, 0, 0); } // 4J-PB - Adding a TestUse for tooltip display @@ -106,7 +113,7 @@ bool TrapDoorTile::use(Level *level, int x, int y, int z, shared_ptr pla } int dir = level->getData(x, y, z); - level->setData(x, y, z, dir ^ 4); + level->setData(x, y, z, dir ^ 4, Tile::UPDATE_CLIENTS); level->levelEvent(player, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0); return true; @@ -120,7 +127,7 @@ void TrapDoorTile::setOpen(Level *level, int x, int y, int z, bool shouldOpen) bool wasOpen = (dir & 4) > 0; if (wasOpen == shouldOpen) return; - level->setData(x, y, z, dir ^ 4); + level->setData(x, y, z, dir ^ 4, Tile::UPDATE_CLIENTS); level->levelEvent(nullptr, LevelEvent::SOUND_OPEN_DOOR, x, y, z, 0); } @@ -140,7 +147,7 @@ void TrapDoorTile::neighborChanged(Level *level, int x, int y, int z, int type) if (!attachesTo(level->getTile(xt, y, zt))) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); spawnResources(level, x, y, z, data, 0); } @@ -205,5 +212,5 @@ bool TrapDoorTile::attachesTo(int id) } Tile *tile = Tile::tiles[id]; - return tile != NULL && (tile->material->isSolidBlocking() && tile->isCubeShaped()) || tile == Tile::lightGem || (dynamic_cast(tile) != NULL) || (dynamic_cast(tile) != NULL); + return tile != NULL && (tile->material->isSolidBlocking() && tile->isCubeShaped()) || tile == Tile::glowstone || (dynamic_cast(tile) != NULL) || (dynamic_cast(tile) != NULL); } \ No newline at end of file diff --git a/Minecraft.World/TrapMenu.cpp b/Minecraft.World/TrapMenu.cpp index 5e59c6fe..65757839 100644 --- a/Minecraft.World/TrapMenu.cpp +++ b/Minecraft.World/TrapMenu.cpp @@ -39,7 +39,7 @@ bool TrapMenu::stillValid(shared_ptr player) shared_ptr TrapMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL && slot->hasItem()) { shared_ptr stack = slot->getItem(); diff --git a/Minecraft.World/TreeFeature.cpp b/Minecraft.World/TreeFeature.cpp index 0ef4e320..f27258af 100644 --- a/Minecraft.World/TreeFeature.cpp +++ b/Minecraft.World/TreeFeature.cpp @@ -76,7 +76,8 @@ bool TreeFeature::place(Level *level, Random *random, int x, int y, int z) { int zo = zz - (z); if (abs(xo) == offs && abs(zo) == offs && (random->nextInt(2) == 0 || yo == 0)) continue; - if (!Tile::solid[level->getTile(xx, yy, zz)]) placeBlock(level, xx, yy, zz, Tile::leaves_Id, leafType); + int t = level->getTile(xx, yy, zz); + if (t == 0 || t == Tile::leaves_Id) placeBlock(level, xx, yy, zz, Tile::leaves_Id, leafType); } } } diff --git a/Minecraft.World/TreeTile.cpp b/Minecraft.World/TreeTile.cpp index 29871625..642d8fbb 100644 --- a/Minecraft.World/TreeTile.cpp +++ b/Minecraft.World/TreeTile.cpp @@ -7,23 +7,18 @@ #include "TreeTile.h" -const unsigned int TreeTile::TREE_NAMES[TREE_NAMES_LENGTH] = { IDS_TILE_LOG_OAK, +const unsigned int TreeTile::TREE_NAMES[ TreeTile::TREE_NAMES_LENGTH] = { IDS_TILE_LOG_OAK, IDS_TILE_LOG_SPRUCE, IDS_TILE_LOG_BIRCH, IDS_TILE_LOG_JUNGLE }; -const wstring TreeTile::TREE_TEXTURES[] = {L"tree_side", L"tree_spruce", L"tree_birch", L"tree_jungle"}; +const wstring TreeTile::TREE_STRING_NAMES[ TreeTile::TREE_NAMES_LENGTH] = {L"oak", L"spruce", L"birch", L"jungle"}; -TreeTile::TreeTile(int id) : Tile(id, Material::wood) -{ - icons = NULL; - iconTop = NULL; -} +const wstring TreeTile::TREE_TEXTURES[] = {L"tree_side", L"tree_spruce", L"tree_birch", L"tree_jungle"}; -int TreeTile::getRenderShape() +TreeTile::TreeTile(int id) : RotatedPillarTile(id, Material::wood) { - return Tile::SHAPE_TREE; } int TreeTile::getResourceCount(Random *random) @@ -53,58 +48,13 @@ void TreeTile::onRemove(Level *level, int x, int y, int z, int id, int data) int currentData = level->getData(x + xo, y + yo, z + zo); if ((currentData & LeafTile::UPDATE_LEAF_BIT) == 0) { - level->setDataNoUpdate(x + xo, y + yo, z + zo, currentData | LeafTile::UPDATE_LEAF_BIT); + level->setData(x + xo, y + yo, z + zo, currentData | LeafTile::UPDATE_LEAF_BIT, Tile::UPDATE_NONE); } } } } } -void TreeTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) -{ - int type = level->getData(x, y, z) & MASK_TYPE; - int dir = PistonBaseTile::getNewFacing(level, x, y, z, dynamic_pointer_cast(by)); - int facing = 0; - - switch (dir) - { - case Facing::NORTH: - case Facing::SOUTH: - facing = FACING_Z; - break; - case Facing::EAST: - case Facing::WEST: - facing = FACING_X; - break; - case Facing::UP: - case Facing::DOWN: - facing = FACING_Y; - break; - } - - level->setData(x, y, z, type | facing); -} - -Icon *TreeTile::getTexture(int face, int data) -{ - int dir = data & MASK_FACING; - int type = data & MASK_TYPE; - - if (dir == FACING_Y && (face == Facing::UP || face == Facing::DOWN)) - { - return iconTop; - } - else if (dir == FACING_X && (face == Facing::EAST || face == Facing::WEST)) - { - return iconTop; - } - else if (dir == FACING_Z && (face == Facing::NORTH || face == Facing::SOUTH)) - { - return iconTop; - } - - return icons[type]; -} unsigned int TreeTile::getDescriptionId(int iData /*= -1*/) { @@ -113,9 +63,14 @@ unsigned int TreeTile::getDescriptionId(int iData /*= -1*/) return TreeTile::TREE_NAMES[type]; } -int TreeTile::getSpawnResourcesAuxValue(int data) +Icon *TreeTile::getTypeTexture(int type) { - return data & MASK_TYPE; + return icons_side[type]; +} + +Icon *TreeTile::getTopTexture(int type) +{ + return icons_top[type]; } int TreeTile::getWoodType(int data) @@ -131,11 +86,9 @@ shared_ptr TreeTile::getSilkTouchItemInstance(int data) void TreeTile::registerIcons(IconRegister *iconRegister) { - iconTop = iconRegister->registerIcon(L"tree_top"); - icons = new Icon*[TREE_NAMES_LENGTH]; - for (int i = 0; i < TREE_NAMES_LENGTH; i++) { - icons[i] = iconRegister->registerIcon(TREE_TEXTURES[i]); + icons_side[i] = iconRegister->registerIcon(getIconName() + L"_" + TREE_STRING_NAMES[i]); + icons_top[i] = iconRegister->registerIcon(getIconName() + L"_" + TREE_STRING_NAMES[i] + L"_top"); } } \ No newline at end of file diff --git a/Minecraft.World/TreeTile.h b/Minecraft.World/TreeTile.h index b7e0d56d..8738c8cf 100644 --- a/Minecraft.World/TreeTile.h +++ b/Minecraft.World/TreeTile.h @@ -1,11 +1,11 @@ #pragma once -#include "Tile.h" +#include "RotatedPillarTile.h" class ChunkRebuildData; class Player; -class TreeTile : public Tile +class TreeTile : public RotatedPillarTile { friend class Tile; friend class ChunkRebuildData; @@ -25,26 +25,26 @@ public: static const unsigned int TREE_NAMES[TREE_NAMES_LENGTH]; + static const wstring TREE_STRING_NAMES[TREE_NAMES_LENGTH]; + static const wstring TREE_TEXTURES[]; private: - Icon **icons; - Icon *iconTop; + Icon *icons_side[TREE_NAMES_LENGTH]; + Icon *icons_top[TREE_NAMES_LENGTH]; protected: TreeTile(int id); public: - virtual int getRenderShape(); virtual int getResourceCount(Random *random); virtual int getResource(int data, Random *random, int playerBonusLevel); virtual void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); - virtual Icon *getTexture(int face, int data); virtual unsigned int getDescriptionId(int iData = -1); protected: - int getSpawnResourcesAuxValue(int data); + virtual Icon *getTypeTexture(int type); + virtual Icon *getTopTexture(int type); public: static int getWoodType(int data); diff --git a/Minecraft.World/TripWireSourceTile.cpp b/Minecraft.World/TripWireSourceTile.cpp index 33f857fa..c9271334 100644 --- a/Minecraft.World/TripWireSourceTile.cpp +++ b/Minecraft.World/TripWireSourceTile.cpp @@ -2,6 +2,7 @@ #include "net.minecraft.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.redstone.h" #include "TripWireSourceTile.h" TripWireSourceTile::TripWireSourceTile(int id) : Tile(id, Material::decoration, isSolidRender()) @@ -102,8 +103,8 @@ void TripWireSourceTile::neighborChanged(Level *level, int x, int y, int z, int if (replace) { - this->spawnResources(level, x, y, z, data, 0); - level->setTile(x, y, z, 0); + spawnResources(level, x, y, z, data, 0); + level->removeTile(x, y, z); } } } @@ -111,8 +112,6 @@ void TripWireSourceTile::neighborChanged(Level *level, int x, int y, int z, int void TripWireSourceTile::calculateState(Level *level, int x, int y, int z, int id, int data, bool canUpdate, /*4J-Jev, these parameters only used with 'updateSource' -->*/ int wireSource, int wireSourceData) { - - int dir = data & MASK_DIR; bool wasAttached = (data & MASK_ATTACHED) == MASK_ATTACHED; bool wasPowered = (data & MASK_POWERED) == MASK_POWERED; @@ -176,7 +175,7 @@ void TripWireSourceTile::calculateState(Level *level, int x, int y, int z, int i int xx = x + stepX * receiverPos; int zz = z + stepZ * receiverPos; int opposite = Direction::DIRECTION_OPPOSITE[dir]; - level->setData(xx, y, zz, opposite | state); + level->setData(xx, y, zz, opposite | state, Tile::UPDATE_ALL); notifyNeighbors(level, xx, y, zz, opposite); playSound(level, xx, y, zz, attached, powered, wasAttached, wasPowered); @@ -186,7 +185,7 @@ void TripWireSourceTile::calculateState(Level *level, int x, int y, int z, int i if (id > 0) // ie. it isn't being removed. { - level->setData(x, y, z, data); + level->setData(x, y, z, data, Tile::UPDATE_ALL); if (canUpdate) notifyNeighbors(level, x, y, z, dir); } @@ -209,7 +208,7 @@ void TripWireSourceTile::calculateState(Level *level, int x, int y, int z, int i } - level->setData(xx, y, zz, wireData); + level->setData(xx, y, zz, wireData, Tile::UPDATE_ALL); } } } @@ -241,23 +240,23 @@ void TripWireSourceTile::playSound(Level *level, int x, int y, int z, bool attac void TripWireSourceTile::notifyNeighbors(Level *level, int x, int y, int z, int dir) { - level->updateNeighborsAt(x, y, z, this->id); + level->updateNeighborsAt(x, y, z, id); if (dir == Direction::EAST) { - level->updateNeighborsAt(x - 1, y, z, this->id); + level->updateNeighborsAt(x - 1, y, z, id); } else if (dir == Direction::WEST) { - level->updateNeighborsAt(x + 1, y, z, this->id); + level->updateNeighborsAt(x + 1, y, z, id); } else if (dir == Direction::SOUTH) { - level->updateNeighborsAt(x, y, z - 1, this->id); + level->updateNeighborsAt(x, y, z - 1, id); } else if (dir == Direction::NORTH) { - level->updateNeighborsAt(x, y, z + 1, this->id); + level->updateNeighborsAt(x, y, z + 1, id); } } @@ -266,7 +265,7 @@ bool TripWireSourceTile::checkCanSurvive(Level *level, int x, int y, int z) if (!mayPlace(level, x, y, z)) { this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return false; } @@ -333,24 +332,24 @@ void TripWireSourceTile::onRemove(Level *level, int x, int y, int z, int id, int Tile::onRemove(level, x, y, z, id, data); } -bool TripWireSourceTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +int TripWireSourceTile::getSignal(LevelSource *level, int x, int y, int z, int dir) { - return (level->getData(x, y, z) & MASK_POWERED) == MASK_POWERED; + return (level->getData(x, y, z) & MASK_POWERED) == MASK_POWERED ? Redstone::SIGNAL_MAX : Redstone::SIGNAL_NONE; } -bool TripWireSourceTile::getDirectSignal(Level *level, int x, int y, int z, int dir) +int TripWireSourceTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) { int data = level->getData(x, y, z); - if ((data & MASK_POWERED) != MASK_POWERED) return false; + if ((data & MASK_POWERED) != MASK_POWERED) return Redstone::SIGNAL_NONE; int myDir = data & MASK_DIR; - if (myDir == Direction::NORTH && dir == Facing::NORTH) return true; - if (myDir == Direction::SOUTH && dir == Facing::SOUTH) return true; - if (myDir == Direction::WEST && dir == Facing::WEST) return true; - if (myDir == Direction::EAST && dir == Facing::EAST) return true; + if (myDir == Direction::NORTH && dir == Facing::NORTH) return Redstone::SIGNAL_MAX; + if (myDir == Direction::SOUTH && dir == Facing::SOUTH) return Redstone::SIGNAL_MAX; + if (myDir == Direction::WEST && dir == Facing::WEST) return Redstone::SIGNAL_MAX; + if (myDir == Direction::EAST && dir == Facing::EAST) return Redstone::SIGNAL_MAX; - return false; + return Redstone::SIGNAL_NONE; } bool TripWireSourceTile::isSignalSource() diff --git a/Minecraft.World/TripWireSourceTile.h b/Minecraft.World/TripWireSourceTile.h index c86e781d..83adb9ab 100644 --- a/Minecraft.World/TripWireSourceTile.h +++ b/Minecraft.World/TripWireSourceTile.h @@ -37,7 +37,7 @@ private: public: void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); void onRemove(Level *level, int x, int y, int z, int id, int data); - virtual bool getSignal(LevelSource *level, int x, int y, int z, int dir); - virtual bool getDirectSignal(Level *level, int x, int y, int z, int dir); + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); bool isSignalSource(); }; diff --git a/Minecraft.World/TripWireTile.cpp b/Minecraft.World/TripWireTile.cpp index 40ad93f8..2fd7da6c 100644 --- a/Minecraft.World/TripWireTile.cpp +++ b/Minecraft.World/TripWireTile.cpp @@ -66,7 +66,7 @@ void TripWireTile::neighborChanged(Level *level, int x, int y, int z, int type) if (wasSuspended != isSuspended) { spawnResources(level, x, y, z, data, 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } } @@ -93,7 +93,7 @@ void TripWireTile::updateShape(LevelSource *level, int x, int y, int z, int forc void TripWireTile::onPlace(Level *level, int x, int y, int z) { int data = level->isTopSolidBlocking(x, y - 1, z) ? 0 : MASK_SUSPENDED; - level->setData(x, y, z, data); + level->setData(x, y, z, data, Tile::UPDATE_ALL); updateSource(level, x, y, z, data); } @@ -108,7 +108,7 @@ void TripWireTile::playerWillDestroy(Level *level, int x, int y, int z, int data if (player->getSelectedItem() != NULL && player->getSelectedItem()->id == Item::shears_Id) { - level->setData(x, y, z, data | MASK_DISARMED); + level->setData(x, y, z, data | MASK_DISARMED, Tile::UPDATE_NONE); } } @@ -169,7 +169,15 @@ void TripWireTile::checkPressed(Level *level, int x, int y, int z) vector > *entities = level->getEntities(nullptr, AABB::newTemp(x + tls->xx0, y + tls->yy0, z + tls->zz0, x + tls->xx1, y + tls->yy1, z + tls->zz1)); if (!entities->empty()) { - shouldBePressed = true; + for (AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) + { + shared_ptr e = *it; + if (!e->isIgnoringTileTriggers()) + { + shouldBePressed = true; + break; + } + } } if (shouldBePressed && !wasPressed) @@ -184,7 +192,7 @@ void TripWireTile::checkPressed(Level *level, int x, int y, int z) if (shouldBePressed != wasPressed) { - level->setData(x, y, z, data); + level->setData(x, y, z, data, Tile::UPDATE_ALL); updateSource(level, x, y, z, data); } diff --git a/Minecraft.World/UpdateAttributesPacket.cpp b/Minecraft.World/UpdateAttributesPacket.cpp new file mode 100644 index 00000000..45c20575 --- /dev/null +++ b/Minecraft.World/UpdateAttributesPacket.cpp @@ -0,0 +1,141 @@ +#include "stdafx.h" + +#include "net.minecraft.world.entity.ai.attributes.h" +#include "PacketListener.h" +#include "UpdateAttributesPacket.h" + +UpdateAttributesPacket::UpdateAttributesPacket() +{ + entityId = 0; +} + +UpdateAttributesPacket::UpdateAttributesPacket(int entityId, unordered_set *values) +{ + this->entityId = entityId; + + for (AUTO_VAR(it,values->begin()); it != values->end(); ++it) + { + AttributeInstance *value = *it; + unordered_set mods; + value->getModifiers(mods); + attributes.insert(new AttributeSnapshot(value->getAttribute()->getId(), value->getBaseValue(), &mods)); + } +} + +UpdateAttributesPacket::~UpdateAttributesPacket() +{ + // Delete modifiers - these are always copies, either on construction or on read + for(AUTO_VAR(it,attributes.begin()); it != attributes.end(); ++it) + { + delete (*it); + } +} + +void UpdateAttributesPacket::read(DataInputStream *dis) +{ + entityId = dis->readInt(); + + int attributeCount = dis->readInt(); + for (int i = 0; i < attributeCount; i++) + { + eATTRIBUTE_ID id = static_cast(dis->readShort()); + double base = dis->readDouble(); + unordered_set modifiers = unordered_set(); + int modifierCount = dis->readShort(); + + for (int j = 0; j < modifierCount; j++) + { + eMODIFIER_ID id = static_cast(dis->readInt()); + double amount = dis->readDouble(); + byte operation = dis->readByte(); + modifiers.insert(new AttributeModifier(id, /*L"Unknown synced attribute modifier",*/ amount, operation)); + } + + attributes.insert(new AttributeSnapshot(id, base, &modifiers)); + + // modifiers is copied in AttributeSnapshot ctor so delete contents + for(AUTO_VAR(it, modifiers.begin()); it != modifiers.end(); ++it) + { + delete *it; + } + } +} + +void UpdateAttributesPacket::write(DataOutputStream *dos) +{ + dos->writeInt(entityId); + dos->writeInt(attributes.size()); + + for(AUTO_VAR(it, attributes.begin()); it != attributes.end(); ++it) + { + AttributeSnapshot *attribute = (*it); + + unordered_set *modifiers = attribute->getModifiers(); + + dos->writeShort(attribute->getId()); + dos->writeDouble(attribute->getBase()); + dos->writeShort(modifiers->size()); + + for (AUTO_VAR(it2, modifiers->begin()); it2 != modifiers->end(); ++it2) + { + AttributeModifier *modifier = (*it2); + dos->writeInt(modifier->getId()); + dos->writeDouble(modifier->getAmount()); + dos->writeByte(modifier->getOperation()); + } + } +} + +void UpdateAttributesPacket::handle(PacketListener *listener) +{ + listener->handleUpdateAttributes(shared_from_this()); +} + +int UpdateAttributesPacket::getEstimatedSize() +{ + return 4 + 4 + attributes.size() * (8 + 8 + 8); +} + +int UpdateAttributesPacket::getEntityId() +{ + return entityId; +} + +unordered_set UpdateAttributesPacket::getValues() +{ + return attributes; +} + +UpdateAttributesPacket::AttributeSnapshot::AttributeSnapshot(eATTRIBUTE_ID id, double base, unordered_set *modifiers) +{ + this->id = id; + this->base = base; + + for(AUTO_VAR(it,modifiers->begin()); it != modifiers->end(); ++it) + { + this->modifiers.insert( new AttributeModifier((*it)->getId(), (*it)->getAmount(), (*it)->getOperation())); + } +} + +UpdateAttributesPacket::AttributeSnapshot::~AttributeSnapshot() +{ + for(AUTO_VAR(it, modifiers.begin()); it != modifiers.end(); ++it) + { + delete (*it); + } +} + +eATTRIBUTE_ID UpdateAttributesPacket::AttributeSnapshot::getId() +{ + return id; +} + +double UpdateAttributesPacket::AttributeSnapshot::getBase() +{ + return base; +} + +unordered_set *UpdateAttributesPacket::AttributeSnapshot::getModifiers() +{ + return &modifiers; +} \ No newline at end of file diff --git a/Minecraft.World/UpdateAttributesPacket.h b/Minecraft.World/UpdateAttributesPacket.h new file mode 100644 index 00000000..77ba08be --- /dev/null +++ b/Minecraft.World/UpdateAttributesPacket.h @@ -0,0 +1,46 @@ +#pragma once + +#include "Packet.h" + +class AttributeModifier; +class AttributeInstance; + +class UpdateAttributesPacket : public Packet, public enable_shared_from_this +{ +public: + class AttributeSnapshot + { + private: + eATTRIBUTE_ID id; + double base; + unordered_set modifiers; + + public: + AttributeSnapshot(eATTRIBUTE_ID id, double base, unordered_set *modifiers); + ~AttributeSnapshot(); + + eATTRIBUTE_ID getId(); + double getBase(); + unordered_set *getModifiers(); + }; + +private: + int entityId; + unordered_set attributes; + +public: + UpdateAttributesPacket(); + UpdateAttributesPacket(int entityId, unordered_set *values); + ~UpdateAttributesPacket(); + + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + int getEntityId(); + unordered_set getValues(); + +public: + static shared_ptr create() { return shared_ptr(new UpdateAttributesPacket()); } + virtual int getId() { return 44; } +}; \ No newline at end of file diff --git a/Minecraft.World/UpdateMobEffectPacket.cpp b/Minecraft.World/UpdateMobEffectPacket.cpp index dec8d79f..e2f6233e 100644 --- a/Minecraft.World/UpdateMobEffectPacket.cpp +++ b/Minecraft.World/UpdateMobEffectPacket.cpp @@ -2,24 +2,34 @@ #include "net.minecraft.world.effect.h" #include "InputOutputStream.h" #include "PacketListener.h" +#include "BasicTree.h" +#include "BasicTypeContainers.h" #include "UpdateMobEffectPacket.h" UpdateMobEffectPacket::UpdateMobEffectPacket() { - this->entityId = 0; - this->effectId = 0; - this->effectAmplifier = 0; - this->effectDurationTicks = 0; + entityId = 0; + effectId = 0; + effectAmplifier = 0; + effectDurationTicks = 0; } UpdateMobEffectPacket::UpdateMobEffectPacket(int entityId, MobEffectInstance *effect) { this->entityId = entityId; - this->effectId = (BYTE) (effect->getId() & 0xff); - this->effectAmplifier = (char) (effect->getAmplifier() & 0xff); - this->effectDurationTicks = (short) effect->getDuration(); + effectId = (BYTE) (effect->getId() & 0xff); + effectAmplifier = (char) (effect->getAmplifier() & 0xff); + + if (effect->getDuration() > Short::MAX_VALUE) + { + effectDurationTicks = Short::MAX_VALUE; + } + else + { + effectDurationTicks = (short) effect->getDuration(); + } } void UpdateMobEffectPacket::read(DataInputStream *dis) @@ -38,6 +48,11 @@ void UpdateMobEffectPacket::write(DataOutputStream *dos) dos->writeShort(effectDurationTicks); } +bool UpdateMobEffectPacket::isSuperLongDuration() +{ + return effectDurationTicks == Short::MAX_VALUE; +} + void UpdateMobEffectPacket::handle(PacketListener *listener) { listener->handleUpdateMobEffect(shared_from_this()); diff --git a/Minecraft.World/UpdateMobEffectPacket.h b/Minecraft.World/UpdateMobEffectPacket.h index d17d1be4..39eb98e9 100644 --- a/Minecraft.World/UpdateMobEffectPacket.h +++ b/Minecraft.World/UpdateMobEffectPacket.h @@ -17,6 +17,7 @@ public: virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); + virtual bool isSuperLongDuration(); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); virtual bool canBeInvalidated(); diff --git a/Minecraft.World/UseItemPacket.cpp b/Minecraft.World/UseItemPacket.cpp index d9699130..55e44342 100644 --- a/Minecraft.World/UseItemPacket.cpp +++ b/Minecraft.World/UseItemPacket.cpp @@ -39,13 +39,13 @@ UseItemPacket::UseItemPacket(int x, int y, int z, int face, shared_ptrreadInt(); - y = dis->read(); + y = dis->readUnsignedByte(); z = dis->readInt(); face = dis->read(); item = readItem(dis); - clickX = dis->read() / CLICK_ACCURACY; - clickY = dis->read() / CLICK_ACCURACY; - clickZ = dis->read() / CLICK_ACCURACY; + clickX = dis->readUnsignedByte() / CLICK_ACCURACY; + clickY = dis->readUnsignedByte() / CLICK_ACCURACY; + clickZ = dis->readUnsignedByte() / CLICK_ACCURACY; } void UseItemPacket::write(DataOutputStream *dos) //throws IOException @@ -58,7 +58,7 @@ void UseItemPacket::write(DataOutputStream *dos) //throws IOException writeItem(item, dos); dos->write((int) (clickX * CLICK_ACCURACY)); dos->write((int) (clickY * CLICK_ACCURACY)); - dos->write((int)(clickZ * CLICK_ACCURACY)); + dos->write((int) (clickZ * CLICK_ACCURACY)); } void UseItemPacket::handle(PacketListener *listener) diff --git a/Minecraft.World/Vec3.cpp b/Minecraft.World/Vec3.cpp index b1f79043..1fc26fd5 100644 --- a/Minecraft.World/Vec3.cpp +++ b/Minecraft.World/Vec3.cpp @@ -59,35 +59,35 @@ Vec3 *Vec3::newTemp(double x, double y, double z) Vec3 *thisVec = &tls->pool[tls->poolPointer]; thisVec->set(x, y, z); tls->poolPointer = ( tls->poolPointer + 1 ) % ThreadStorage::POOL_SIZE; - return thisVec; + return thisVec; } Vec3::Vec3(double x, double y, double z) { - if (x == -0.0) x = 0.0; - if (y == -0.0) y = 0.0; - if (z == -0.0) z = 0.0; - this->x = x; - this->y = y; - this->z = z; + if (x == -0.0) x = 0.0; + if (y == -0.0) y = 0.0; + if (z == -0.0) z = 0.0; + this->x = x; + this->y = y; + this->z = z; } Vec3 *Vec3::set(double x, double y, double z) { - this->x = x; - this->y = y; - this->z = z; - return this; + this->x = x; + this->y = y; + this->z = z; + return this; } Vec3 *Vec3::interpolateTo(Vec3 *t, double p) { - double xt = x + (t->x - x) * p; - double yt = y + (t->y - y) * p; - double zt = z + (t->z - z) * p; + double xt = x + (t->x - x) * p; + double yt = y + (t->y - y) * p; + double zt = z + (t->z - z) * p; - return Vec3::newTemp(xt, yt, zt); + return Vec3::newTemp(xt, yt, zt); } Vec3 *Vec3::vectorTo(Vec3 *p) @@ -97,9 +97,9 @@ Vec3 *Vec3::vectorTo(Vec3 *p) Vec3 *Vec3::normalize() { - double dist = (double) (sqrt(x * x + y * y + z * z)); - if (dist < 0.0001) return Vec3::newTemp(0, 0, 0); - return Vec3::newTemp(x / dist, y / dist, z / dist); + double dist = (double) (sqrt(x * x + y * y + z * z)); + if (dist < 0.0001) return Vec3::newTemp(0, 0, 0); + return Vec3::newTemp(x / dist, y / dist, z / dist); } double Vec3::dot(Vec3 *p) @@ -119,26 +119,26 @@ Vec3 *Vec3::add(double x, double y, double z) double Vec3::distanceTo(Vec3 *p) { - double xd = p->x - x; - double yd = p->y - y; - double zd = p->z - z; - return (double) sqrt(xd * xd + yd * yd + zd * zd); + double xd = p->x - x; + double yd = p->y - y; + double zd = p->z - z; + return (double) sqrt(xd * xd + yd * yd + zd * zd); } double Vec3::distanceToSqr(Vec3 *p) { - double xd = p->x - x; - double yd = p->y - y; - double zd = p->z - z; - return xd * xd + yd * yd + zd * zd; + double xd = p->x - x; + double yd = p->y - y; + double zd = p->z - z; + return xd * xd + yd * yd + zd * zd; } double Vec3::distanceToSqr(double x2, double y2, double z2) { - double xd = x2 - x; - double yd = y2 - y; - double zd = z2 - z; - return xd * xd + yd * yd + zd * zd; + double xd = x2 - x; + double yd = y2 - y; + double zd = z2 - z; + return xd * xd + yd * yd + zd * zd; } Vec3 *Vec3::scale(double l) @@ -153,41 +153,41 @@ double Vec3::length() Vec3 *Vec3::clipX(Vec3 *b, double xt) { - double xd = b->x - x; - double yd = b->y - y; - double zd = b->z - z; + double xd = b->x - x; + double yd = b->y - y; + double zd = b->z - z; - if (xd * xd < 0.0000001f) return NULL; + if (xd * xd < 0.0000001f) return NULL; - double d = (xt - x) / xd; - if (d < 0 || d > 1) return NULL; - return Vec3::newTemp(x + xd * d, y + yd * d, z + zd * d); + double d = (xt - x) / xd; + if (d < 0 || d > 1) return NULL; + return Vec3::newTemp(x + xd * d, y + yd * d, z + zd * d); } Vec3 *Vec3::clipY(Vec3 *b, double yt) { - double xd = b->x - x; - double yd = b->y - y; - double zd = b->z - z; + double xd = b->x - x; + double yd = b->y - y; + double zd = b->z - z; - if (yd * yd < 0.0000001f) return NULL; + if (yd * yd < 0.0000001f) return NULL; - double d = (yt - y) / yd; - if (d < 0 || d > 1) return NULL; - return Vec3::newTemp(x + xd * d, y + yd * d, z + zd * d); + double d = (yt - y) / yd; + if (d < 0 || d > 1) return NULL; + return Vec3::newTemp(x + xd * d, y + yd * d, z + zd * d); } Vec3 *Vec3::clipZ(Vec3 *b, double zt) { - double xd = b->x - x; - double yd = b->y - y; - double zd = b->z - z; + double xd = b->x - x; + double yd = b->y - y; + double zd = b->z - z; - if (zd * zd < 0.0000001f) return NULL; + if (zd * zd < 0.0000001f) return NULL; - double d = (zt - z) / zd; - if (d < 0 || d > 1) return NULL; - return Vec3::newTemp(x + xd * d, y + yd * d, z + zd * d); + double d = (zt - z) / zd; + if (d < 0 || d > 1) return NULL; + return Vec3::newTemp(x + xd * d, y + yd * d, z + zd * d); } wstring Vec3::toString() @@ -204,44 +204,44 @@ Vec3 *Vec3::lerp(Vec3 *v, double a) void Vec3::xRot(float degs) { - double _cos = cos(degs); // 4J - cos/sin were floats but seems pointless wasting precision here - double _sin = sin(degs); + double _cos = cos(degs); // 4J - cos/sin were floats but seems pointless wasting precision here + double _sin = sin(degs); - double xx = x; - double yy = y * _cos + z * _sin; - double zz = z * _cos - y * _sin; + double xx = x; + double yy = y * _cos + z * _sin; + double zz = z * _cos - y * _sin; - this->x = xx; - this->y = yy; - this->z = zz; + x = xx; + y = yy; + z = zz; } void Vec3::yRot(float degs) { double _cos = cos(degs); // 4J - cos/sin were floats but seems pointless wasting precision here - double _sin = sin(degs); + double _sin = sin(degs); - double xx = x * _cos + z * _sin; - double yy = y; - double zz = z * _cos - x * _sin; + double xx = x * _cos + z * _sin; + double yy = y; + double zz = z * _cos - x * _sin; - this->x = xx; - this->y = yy; - this->z = zz; + x = xx; + y = yy; + z = zz; } void Vec3::zRot(float degs) { double _cos = cos(degs); // 4J - cos/sin were floats but seems pointless wasting precision here - double _sin = sin(degs); + double _sin = sin(degs); - double xx = x * _cos + y * _sin; - double yy = y * _cos - x * _sin; - double zz = z; + double xx = x * _cos + y * _sin; + double yy = y * _cos - x * _sin; + double zz = z; - this->x = xx; - this->y = yy; - this->z = zz; + x = xx; + y = yy; + z = zz; } // Returns 0 if this point is within the box @@ -262,4 +262,31 @@ double Vec3::distanceTo(AABB *box) else if( z > box->z1) zd = z - box->z1; return sqrt(xd * xd + yd * yd + zd * zd); -} \ No newline at end of file +} + + + +Vec3* Vec3::closestPointOnLine(Vec3* p1, Vec3* p2) +{ + Vec3* diff = newTemp(x-p1->x, y-p1->y, z-p1->z); + Vec3* dir = newTemp(p2->x-p1->x, p2->y-p1->y, p2->z-p1->z); + float dot1 = diff->dot(dir); + if (dot1 <= 0.0f) + return p1; + + float dot2 = dir->dot(dir); + + if (dot2 <= dot1) + return p2; + + float t=dot1/dot2; + return newTemp(p1->x + t * dir->x, p1->y + t * dir->y, p1->z + t * dir->z); +} + + +double Vec3::distanceFromLine(Vec3* p1, Vec3* p2) +{ + Vec3* closestPoint = closestPointOnLine(p1, p2); + Vec3* diff = newTemp(x-closestPoint->x, y-closestPoint->y, z-closestPoint->z); + return diff->length(); +} diff --git a/Minecraft.World/Vec3.h b/Minecraft.World/Vec3.h index 00a74103..0ef6cae0 100644 --- a/Minecraft.World/Vec3.h +++ b/Minecraft.World/Vec3.h @@ -56,4 +56,8 @@ public: // 4J Added double distanceTo(AABB *box); + + Vec3* closestPointOnLine(Vec3* p1, Vec3* p2); + double distanceFromLine(Vec3* p1, Vec3* p2); + }; \ No newline at end of file diff --git a/Minecraft.World/Village.cpp b/Minecraft.World/Village.cpp index aef38066..507bc717 100644 --- a/Minecraft.World/Village.cpp +++ b/Minecraft.World/Village.cpp @@ -8,7 +8,7 @@ #include "BasicTypeContainers.h" #include "Village.h" -Village::Aggressor::Aggressor(shared_ptr mob, int timeStamp) +Village::Aggressor::Aggressor(shared_ptr mob, int timeStamp) { this->mob = mob; this->timeStamp = timeStamp; @@ -248,7 +248,7 @@ bool Village::canRemove() return doorInfos.empty(); } -void Village::addAggressor(shared_ptr mob) +void Village::addAggressor(shared_ptr mob) { //for (Aggressor a : aggressors) for(AUTO_VAR(it, aggressors.begin()); it != aggressors.end(); ++it) @@ -263,7 +263,7 @@ void Village::addAggressor(shared_ptr mob) aggressors.push_back(new Aggressor(mob, _tick)); } -shared_ptr Village::getClosestAggressor(shared_ptr from) +shared_ptr Village::getClosestAggressor(shared_ptr from) { double closestSqr = Double::MAX_VALUE; Aggressor *closest = NULL; @@ -279,7 +279,7 @@ shared_ptr Village::getClosestAggressor(shared_ptr from) return closest != NULL ? closest->mob : nullptr; } -shared_ptr Village::getClosestBadStandingPlayer(shared_ptr from) // 4J Stu - Should be LivingEntity when we add that +shared_ptr Village::getClosestBadStandingPlayer(shared_ptr from) { double closestSqr = Double::MAX_VALUE; shared_ptr closest = nullptr; diff --git a/Minecraft.World/Village.h b/Minecraft.World/Village.h index 07858ef9..e1ee2d4b 100644 --- a/Minecraft.World/Village.h +++ b/Minecraft.World/Village.h @@ -19,10 +19,10 @@ private: class Aggressor { public: - shared_ptr mob; + shared_ptr mob; int timeStamp; - Aggressor(shared_ptr mob, int timeStamp); + Aggressor(shared_ptr mob, int timeStamp); }; vector aggressors; @@ -57,9 +57,9 @@ public: shared_ptr getDoorInfo(int x, int y, int z); void addDoorInfo(shared_ptr di); bool canRemove(); - void addAggressor(shared_ptr mob); - shared_ptr getClosestAggressor(shared_ptr from); - shared_ptr getClosestBadStandingPlayer(shared_ptr from); // 4J Stu - Should be LivingEntity when we add that + void addAggressor(shared_ptr mob); + shared_ptr getClosestAggressor(shared_ptr from); + shared_ptr getClosestBadStandingPlayer(shared_ptr from); private: void updateAggressors(); diff --git a/Minecraft.World/VillageFeature.cpp b/Minecraft.World/VillageFeature.cpp index be724be6..82974c7b 100644 --- a/Minecraft.World/VillageFeature.cpp +++ b/Minecraft.World/VillageFeature.cpp @@ -5,6 +5,9 @@ #include "net.minecraft.world.level.biome.h" #include "net.minecraft.world.level.dimension.h" +const wstring VillageFeature::OPTION_SIZE_MODIFIER = L"size"; +const wstring VillageFeature::OPTION_SPACING = L"distance"; + vector VillageFeature::allowedBiomes; void VillageFeature::staticCtor() @@ -13,67 +16,88 @@ void VillageFeature::staticCtor() allowedBiomes.push_back( Biome::desert ); } - -VillageFeature::VillageFeature(int villageSizeModifier, int iXZSize) : StructureFeature(), villageSizeModifier(villageSizeModifier) +void VillageFeature::_init(int iXZSize) { + villageSizeModifier = 0; + townSpacing = 32; + minTownSeparation = 8; + m_iXZSize=iXZSize; } -bool VillageFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) +VillageFeature::VillageFeature(int iXZSize) { - int townSpacing; + _init(iXZSize); +} -#ifdef _LARGE_WORLDS - if(level->dimension->getXZSize() > 128) - { - townSpacing = 32; - } - else -#endif - if(bIsSuperflat) - { - townSpacing= 32; - } - else - { - townSpacing= 16;// 4J change 32; - } +VillageFeature::VillageFeature(unordered_map options, int iXZSize) +{ + _init(iXZSize); - int minTownSeparation = 8; - - int xx = x; - int zz = z; - if (x < 0) x -= townSpacing - 1; - if (z < 0) z -= townSpacing - 1; - - int xCenterTownChunk = x / townSpacing; - int zCenterTownChunk = z / townSpacing; - Random *r = level->getRandomFor(xCenterTownChunk, zCenterTownChunk, 10387312); - xCenterTownChunk *= townSpacing; - zCenterTownChunk *= townSpacing; - xCenterTownChunk += r->nextInt(townSpacing - minTownSeparation); - zCenterTownChunk += r->nextInt(townSpacing - minTownSeparation); - x = xx; - z = zz; - - bool forcePlacement = false; - LevelGenerationOptions *levelGenOptions = app.getLevelGenerationOptions(); - if( levelGenOptions != NULL ) + for (AUTO_VAR(it,options.begin()); it != options.end(); ++it) { - forcePlacement = levelGenOptions->isFeatureChunk(x,z,eFeature_Village); + if (it->first.compare(OPTION_SIZE_MODIFIER) == 0) + { + villageSizeModifier = Mth::getInt(it->second, villageSizeModifier, 0); + } + else if (it->first.compare(OPTION_SPACING) == 0) + { + townSpacing = Mth::getInt(it->second, townSpacing, minTownSeparation + 1); + } } +} - if (forcePlacement || (x == xCenterTownChunk && z == zCenterTownChunk) ) - { - bool biomeOk = level->getBiomeSource()->containsOnly(x * 16 + 8, z * 16 + 8, 0, allowedBiomes); - if (biomeOk) +wstring VillageFeature::getFeatureName() +{ + return L"Village"; +} + +bool VillageFeature::isFeatureChunk(int x, int z,bool bIsSuperflat) +{ + int townSpacing = this->townSpacing; + + if(!bIsSuperflat +#ifdef _LARGE_WORLDS + && level->dimension->getXZSize() < 128 +#endif + ) + { + townSpacing= 16;// 4J change 32; + } + + int xx = x; + int zz = z; + if (x < 0) x -= townSpacing - 1; + if (z < 0) z -= townSpacing - 1; + + int xCenterTownChunk = x / townSpacing; + int zCenterTownChunk = z / townSpacing; + Random *r = level->getRandomFor(xCenterTownChunk, zCenterTownChunk, 10387312); + xCenterTownChunk *= townSpacing; + zCenterTownChunk *= townSpacing; + xCenterTownChunk += r->nextInt(townSpacing - minTownSeparation); + zCenterTownChunk += r->nextInt(townSpacing - minTownSeparation); + x = xx; + z = zz; + + bool forcePlacement = false; + LevelGenerationOptions *levelGenOptions = app.getLevelGenerationOptions(); + if( levelGenOptions != NULL ) { - //app.DebugPrintf("Biome ok for Village at %d, %d\n",(x * 16 + 8),(z * 16 + 8)); - return true; - } - } + forcePlacement = levelGenOptions->isFeatureChunk(x,z,eFeature_Village); + } - return false; + if (forcePlacement || (x == xCenterTownChunk && z == zCenterTownChunk) ) + { + bool biomeOk = level->getBiomeSource()->containsOnly(x * 16 + 8, z * 16 + 8, 0, allowedBiomes); + if (biomeOk) + { + //app.DebugPrintf("Biome ok for Village at %d, %d\n",(x * 16 + 8),(z * 16 + 8)); + return true; + } + } + + return false; } StructureStart *VillageFeature::createStructureStart(int x, int z) @@ -84,51 +108,58 @@ StructureStart *VillageFeature::createStructureStart(int x, int z) return new VillageStart(level, random, x, z, villageSizeModifier, m_iXZSize); } +VillageFeature::VillageStart::VillageStart() +{ + valid = false; // 4J added initialiser + m_iXZSize = 0; + // for reflection +} + VillageFeature::VillageStart::VillageStart(Level *level, Random *random, int chunkX, int chunkZ, int villageSizeModifier, int iXZSize) { valid = false; // 4J added initialiser m_iXZSize=iXZSize; - list *pieceSet = VillagePieces::createPieceSet(random, villageSizeModifier); + list *pieceSet = VillagePieces::createPieceSet(random, villageSizeModifier); - VillagePieces::StartPiece *startRoom = new VillagePieces::StartPiece(level->getBiomeSource(), 0, random, (chunkX << 4) + 2, (chunkZ << 4) + 2, pieceSet, villageSizeModifier, level); + VillagePieces::StartPiece *startRoom = new VillagePieces::StartPiece(level->getBiomeSource(), 0, random, (chunkX << 4) + 2, (chunkZ << 4) + 2, pieceSet, villageSizeModifier, level); pieces.push_back(startRoom); - startRoom->addChildren(startRoom, &pieces, random); + startRoom->addChildren(startRoom, &pieces, random); - vector *pendingRoads = &startRoom->pendingRoads; - vector *pendingHouses = &startRoom->pendingHouses; - while (!pendingRoads->empty() || !pendingHouses->empty()) + vector *pendingRoads = &startRoom->pendingRoads; + vector *pendingHouses = &startRoom->pendingHouses; + while (!pendingRoads->empty() || !pendingHouses->empty()) { - // prioritize roads - if (pendingRoads->empty()) + // prioritize roads + if (pendingRoads->empty()) { - int pos = random->nextInt((int)pendingHouses->size()); + int pos = random->nextInt((int)pendingHouses->size()); AUTO_VAR(it, pendingHouses->begin() + pos); - StructurePiece *structurePiece = *it; + StructurePiece *structurePiece = *it; pendingHouses->erase(it); - structurePiece->addChildren(startRoom, &pieces, random); - } + structurePiece->addChildren(startRoom, &pieces, random); + } else { - int pos = random->nextInt((int)pendingRoads->size()); + int pos = random->nextInt((int)pendingRoads->size()); AUTO_VAR(it, pendingRoads->begin() + pos); - StructurePiece *structurePiece = *it; + StructurePiece *structurePiece = *it; pendingRoads->erase(it); - structurePiece->addChildren(startRoom, &pieces, random); - } - } + structurePiece->addChildren(startRoom, &pieces, random); + } + } - calculateBoundingBox(); + calculateBoundingBox(); - int count = 0; + int count = 0; for( AUTO_VAR(it, pieces.begin()); it != pieces.end(); it++ ) { StructurePiece *piece = *it; - if (dynamic_cast(piece) == NULL) + if (dynamic_cast(piece) == NULL) { - count++; - } + count++; + } } valid = count > 2; } @@ -142,3 +173,16 @@ bool VillageFeature::VillageStart::isValid() } return valid; } + +void VillageFeature::VillageStart::addAdditonalSaveData(CompoundTag *tag) +{ + StructureStart::addAdditonalSaveData(tag); + + tag->putBoolean(L"Valid", valid); +} + +void VillageFeature::VillageStart::readAdditonalSaveData(CompoundTag *tag) +{ + StructureStart::readAdditonalSaveData(tag); + valid = tag->getBoolean(L"Valid"); +} \ No newline at end of file diff --git a/Minecraft.World/VillageFeature.h b/Minecraft.World/VillageFeature.h index e998918a..1ff7ac75 100644 --- a/Minecraft.World/VillageFeature.h +++ b/Minecraft.World/VillageFeature.h @@ -5,27 +5,45 @@ class Biome; class VillageFeature : public StructureFeature { +public: + static const wstring OPTION_SIZE_MODIFIER; + static const wstring OPTION_SPACING; + private: - const int villageSizeModifier; + int villageSizeModifier; + int townSpacing; + int minTownSeparation; + + void _init(int iXZSize); public: static void staticCtor(); static vector allowedBiomes; - VillageFeature(int villageSizeModifier, int iXZSize); + VillageFeature(int iXZSize); + VillageFeature(unordered_map options, int iXZSize); + wstring getFeatureName(); protected: virtual bool isFeatureChunk(int x, int z, bool bIsSuperflat=false); - virtual StructureStart *createStructureStart(int x, int z); + virtual StructureStart *createStructureStart(int x, int z); -private: + +public: class VillageStart : public StructureStart { +public: + static StructureStart *Create() { return new VillageStart(); } + virtual EStructureStart GetType() { return eStructureStart_VillageStart; } + private: bool valid; int m_iXZSize; public: + VillageStart(); VillageStart(Level *level, Random *random, int chunkX, int chunkZ, int villageSizeModifier,int iXZSize); - bool isValid(); - }; + bool isValid(); + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); + }; int m_iXZSize; }; diff --git a/Minecraft.World/VillagePieces.cpp b/Minecraft.World/VillagePieces.cpp index 27b21aa5..0a08d4fb 100644 --- a/Minecraft.World/VillagePieces.cpp +++ b/Minecraft.World/VillagePieces.cpp @@ -4,6 +4,7 @@ #include "net.minecraft.world.level.storage.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.levelgen.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.entity.npc.h" @@ -16,6 +17,23 @@ WeighedTreasureArray VillagePieces::Smithy::treasureItems; +void VillagePieces::loadStatic() +{ + StructureFeatureIO::setPieceId(eStructurePiece_BookHouse, BookHouse::Create, L"ViBH"); + StructureFeatureIO::setPieceId(eStructurePiece_DoubleFarmland, DoubleFarmland::Create, L"ViDF"); + StructureFeatureIO::setPieceId(eStructurePiece_Farmland, Farmland::Create, L"ViF"); + StructureFeatureIO::setPieceId(eStructurePiece_LightPost, LightPost::Create, L"ViL"); + StructureFeatureIO::setPieceId(eStructurePiece_PigHouse, PigHouse::Create, L"ViPH"); + StructureFeatureIO::setPieceId(eStructurePiece_SimpleHouse, SimpleHouse::Create, L"ViSH"); + StructureFeatureIO::setPieceId(eStructurePiece_SmallHut, SmallHut::Create, L"ViSmH"); + StructureFeatureIO::setPieceId(eStructurePiece_SmallTemple, SmallTemple::Create, L"ViST"); + StructureFeatureIO::setPieceId(eStructurePiece_Smithy, Smithy::Create, L"ViS"); + StructureFeatureIO::setPieceId(eStructurePiece_VillageStartPiece, StartPiece::Create, L"ViStart"); + StructureFeatureIO::setPieceId(eStructurePiece_StraightRoad, StraightRoad::Create, L"ViSR"); + StructureFeatureIO::setPieceId(eStructurePiece_TwoRoomHouse, TwoRoomHouse::Create, L"ViTRH"); + StructureFeatureIO::setPieceId(eStructurePiece_Well, Well::Create, L"ViW"); +} + VillagePieces::PieceWeight::PieceWeight(VillagePieces::EPieceClass pieceClass, int weight, int maxPlaceCount) : weight(weight) { this->placeCount = 0; // 4J added initialiser @@ -248,10 +266,39 @@ StructurePiece *VillagePieces::generateAndAddRoadPiece(StartPiece *startPiece, l return NULL; } +VillagePieces::VillagePiece::VillagePiece() +{ + heightPosition = -1; + spawnedVillagerCount = 0; + isDesertVillage = false; + startPiece = NULL; + // for reflection +} + VillagePieces::VillagePiece::VillagePiece(StartPiece *startPiece, int genDepth) : StructurePiece(genDepth) { + heightPosition = -1; + isDesertVillage = false; spawnedVillagerCount = 0; this->startPiece = startPiece; + if (startPiece != NULL) + { + this->isDesertVillage = startPiece->isDesertVillage; + } +} + +void VillagePieces::VillagePiece::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putInt(L"HPos", heightPosition); + tag->putInt(L"VCount", spawnedVillagerCount); + tag->putBoolean(L"Desert", isDesertVillage); +} + +void VillagePieces::VillagePiece::readAdditonalSaveData(CompoundTag *tag) +{ + heightPosition = tag->getInt(L"HPos"); + spawnedVillagerCount = tag->getInt(L"VCount"); + isDesertVillage = tag->getBoolean(L"Desert"); } StructurePiece *VillagePieces::VillagePiece::generateHouseNorthernLeft(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff) @@ -366,13 +413,13 @@ int VillagePieces::VillagePiece::getVillagerProfession(int villagerNumber) int VillagePieces::VillagePiece::biomeBlock(int tile, int data) { - if (startPiece->isDesertVillage) + if (isDesertVillage) { if (tile == Tile::treeTrunk_Id) { return Tile::sandStone_Id; } - else if (tile == Tile::stoneBrick_Id) + else if (tile == Tile::cobblestone_Id) { return Tile::sandStone_Id; } @@ -398,13 +445,13 @@ int VillagePieces::VillagePiece::biomeBlock(int tile, int data) int VillagePieces::VillagePiece::biomeData(int tile, int data) { - if (startPiece->isDesertVillage) + if (isDesertVillage) { if (tile == Tile::treeTrunk_Id) { return 0; } - else if (tile == Tile::stoneBrick_Id) + else if (tile == Tile::cobblestone_Id) { return SandStoneTile::TYPE_DEFAULT; } @@ -439,9 +486,13 @@ void VillagePieces::VillagePiece::fillColumnDown(Level *level, int block, int da StructurePiece::fillColumnDown(level, bblock, bdata, x, startY, z, chunkBB); } -VillagePieces::Well::Well(StartPiece *startPiece, int genDepth, Random *random, int west, int north) : VillagePiece(startPiece, genDepth), isSource(true) +VillagePieces::Well::Well() +{ + // for reflection +} + +VillagePieces::Well::Well(StartPiece *startPiece, int genDepth, Random *random, int west, int north) : VillagePiece(startPiece, genDepth) { - heightPosition = -1; // 4J added initialiser orientation = random->nextInt(4); switch (orientation) @@ -456,10 +507,8 @@ VillagePieces::Well::Well(StartPiece *startPiece, int genDepth, Random *random, } } -VillagePieces::Well::Well(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth), isSource(false) +VillagePieces::Well::Well(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth) { - heightPosition = -1; // 4J added initialiser - orientation = direction; boundingBox = stairsBox; } @@ -472,19 +521,6 @@ void VillagePieces::Well::addChildren(StructurePiece *startPiece, listx0 + 1, boundingBox->y1 - 4, boundingBox->z1 + 1, Direction::SOUTH, getGenDepth()); } -//VillagePieces::Well *VillagePieces::Well::createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) -//{ -// BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, -1, 4 - height, 0, width, height, depth, direction); -// -// if (!isOkBox(box) || StructurePiece::findCollisionPiece(pieces, box) != NULL) -// { -// delete box; -// return NULL; -// } -// -// return new Well(genDepth, random, box, direction); -//} - bool VillagePieces::Well::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { if (heightPosition < 0) @@ -497,7 +533,7 @@ bool VillagePieces::Well::postProcess(Level *level, Random *random, BoundingBox boundingBox->move(0, heightPosition - boundingBox->y1 + 3, 0); } - generateBox(level, chunkBB, 1, 0, 1, 4, height - 3, 4, Tile::stoneBrick_Id, Tile::water_Id, false); + generateBox(level, chunkBB, 1, 0, 1, 4, height - 3, 4, Tile::cobblestone_Id, Tile::water_Id, false); placeBlock(level, 0, 0, 2, height - 3, 2, chunkBB); placeBlock(level, 0, 0, 3, height - 3, 2, chunkBB); placeBlock(level, 0, 0, 2, height - 3, 3, chunkBB); @@ -511,7 +547,7 @@ bool VillagePieces::Well::postProcess(Level *level, Random *random, BoundingBox placeBlock(level, Tile::fence_Id, 0, 1, height - 1, 4, chunkBB); placeBlock(level, Tile::fence_Id, 0, 4, height - 2, 4, chunkBB); placeBlock(level, Tile::fence_Id, 0, 4, height - 1, 4, chunkBB); - generateBox(level, chunkBB, 1, height, 1, 4, height, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 1, height, 1, 4, height, 4, Tile::cobblestone_Id, Tile::cobblestone_Id, false); for (int z = 0; z <= 5; z++) { @@ -531,6 +567,11 @@ bool VillagePieces::Well::postProcess(Level *level, Random *random, BoundingBox } +VillagePieces::StartPiece::StartPiece() +{ + // for reflection +} + VillagePieces::StartPiece::StartPiece(BiomeSource *biomeSource, int genDepth, Random *random, int west, int north, list *pieceSet, int villageSize, Level *level) : Well(NULL, 0, random, west, north) { isLibraryAdded = false; // 4J - added initialiser @@ -541,8 +582,7 @@ VillagePieces::StartPiece::StartPiece(BiomeSource *biomeSource, int genDepth, Ra m_level = level; Biome *biome = biomeSource->getBiome(west, north); - this->isDesertVillage = biome == Biome::desert || biome == Biome::desertHills; - this->startPiece = this; + isDesertVillage = biome == Biome::desert || biome == Biome::desertHills; } VillagePieces::StartPiece::~StartPiece() @@ -559,6 +599,11 @@ BiomeSource *VillagePieces::StartPiece::getBiomeSource() return biomeSource; } +VillagePieces::StraightRoad::StraightRoad() +{ + // for reflection +} + VillagePieces::StraightRoad::StraightRoad(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillageRoadPiece(startPiece, genDepth) { orientation = direction; @@ -566,6 +611,18 @@ VillagePieces::StraightRoad::StraightRoad(StartPiece *startPiece, int genDepth, length = Math::_max(stairsBox->getXSpan(), stairsBox->getZSpan()); } +void VillagePieces::StraightRoad::addAdditonalSaveData(CompoundTag *tag) +{ + VillageRoadPiece::addAdditonalSaveData(tag); + tag->putInt(L"Length", length); +} + +void VillagePieces::StraightRoad::readAdditonalSaveData(CompoundTag *tag) +{ + VillageRoadPiece::readAdditonalSaveData(tag); + length = tag->getInt(L"Length"); +} + void VillagePieces::StraightRoad::addChildren(StructurePiece *startPiece, list *pieces, Random *random) { bool hasHouses = false; @@ -663,7 +720,7 @@ bool VillagePieces::StraightRoad::postProcess(Level *level, Random *random, Boun if (chunkBB->isInside(x, 64, z)) { int y = level->getTopSolidBlock(x, z) - 1; - level->setTileNoUpdate(x, y, z,tile); + level->setTileAndData(x, y, z,tile, 0, Tile::UPDATE_CLIENTS); } } } @@ -671,17 +728,30 @@ bool VillagePieces::StraightRoad::postProcess(Level *level, Random *random, Boun return true; } -/* -int heightPosition; -const bool hasTerrace;*/ +VillagePieces::SimpleHouse::SimpleHouse() +{ + hasTerrace = false; + // for reflection +} VillagePieces::SimpleHouse::SimpleHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth), hasTerrace(random->nextBoolean()) { - heightPosition = -1; // 4J added initialiser orientation = direction; boundingBox = stairsBox; } +void VillagePieces::SimpleHouse::addAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Terrace", hasTerrace); +} + +void VillagePieces::SimpleHouse::readAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::readAdditonalSaveData(tag); + hasTerrace = tag->getBoolean(L"Terrace"); +} + VillagePieces::SimpleHouse *VillagePieces::SimpleHouse::createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, 0, 0, 0, width, height, depth, direction); @@ -708,24 +778,24 @@ bool VillagePieces::SimpleHouse::postProcess(Level *level, Random *random, Bound } // floor - generateBox(level, chunkBB, 0, 0, 0, 4, 0, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 0, 0, 4, 0, 4, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // roof generateBox(level, chunkBB, 0, 4, 0, 4, 4, 4, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); generateBox(level, chunkBB, 1, 4, 1, 3, 4, 3, Tile::wood_Id, Tile::wood_Id, false); // window walls - placeBlock(level, Tile::stoneBrick_Id, 0, 0, 1, 0, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 0, 2, 0, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 0, 3, 0, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 1, 0, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 2, 0, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 3, 0, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 0, 1, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 0, 2, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 0, 3, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 1, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 2, 4, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 3, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 0, 1, 0, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 0, 2, 0, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 0, 3, 0, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 1, 0, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 2, 0, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 3, 0, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 0, 1, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 0, 2, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 0, 3, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 1, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 2, 4, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 3, 4, chunkBB); generateBox(level, chunkBB, 0, 1, 1, 0, 3, 3, Tile::wood_Id, Tile::wood_Id, false); generateBox(level, chunkBB, 4, 1, 1, 4, 3, 3, Tile::wood_Id, Tile::wood_Id, false); generateBox(level, chunkBB, 1, 1, 4, 3, 3, 4, Tile::wood_Id, Tile::wood_Id, false); @@ -787,7 +857,7 @@ bool VillagePieces::SimpleHouse::postProcess(Level *level, Random *random, Bound for (int x = 0; x < width; x++) { generateAirColumnUp(level, x, height, z, chunkBB); - fillColumnDown(level, Tile::stoneBrick_Id, 0, x, -1, z, chunkBB); + fillColumnDown(level, Tile::cobblestone_Id, 0, x, -1, z, chunkBB); } } @@ -797,6 +867,11 @@ bool VillagePieces::SimpleHouse::postProcess(Level *level, Random *random, Bound } +VillagePieces::SmallTemple::SmallTemple() +{ + // for reflection +} + VillagePieces::SmallTemple::SmallTemple(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth) { heightPosition = -1; // 4J added initialiser @@ -834,40 +909,40 @@ bool VillagePieces::SmallTemple::postProcess(Level *level, Random *random, Bound generateBox(level, chunkBB, 1, 5, 1, 3, 9, 3, 0, 0, false); // floor - generateBox(level, chunkBB, 1, 0, 0, 3, 0, 8, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 1, 0, 0, 3, 0, 8, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // front wall - generateBox(level, chunkBB, 1, 1, 0, 3, 10, 0, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 1, 1, 0, 3, 10, 0, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // left tall wall - generateBox(level, chunkBB, 0, 1, 1, 0, 10, 3, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 1, 1, 0, 10, 3, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // right tall wall - generateBox(level, chunkBB, 4, 1, 1, 4, 10, 3, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 4, 1, 1, 4, 10, 3, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // left low wall - generateBox(level, chunkBB, 0, 0, 4, 0, 4, 7, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 0, 4, 0, 4, 7, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // right low wall - generateBox(level, chunkBB, 4, 0, 4, 4, 4, 7, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 4, 0, 4, 4, 4, 7, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // far low wall - generateBox(level, chunkBB, 1, 1, 8, 3, 4, 8, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 1, 1, 8, 3, 4, 8, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // far upper wall - generateBox(level, chunkBB, 1, 5, 4, 3, 10, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 1, 5, 4, 3, 10, 4, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // low roof - generateBox(level, chunkBB, 1, 5, 5, 3, 5, 7, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 1, 5, 5, 3, 5, 7, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // high roof - generateBox(level, chunkBB, 0, 9, 0, 4, 9, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 9, 0, 4, 9, 4, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // middle floor / roof - generateBox(level, chunkBB, 0, 4, 0, 4, 4, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - placeBlock(level, Tile::stoneBrick_Id, 0, 0, 11, 2, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 4, 11, 2, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 2, 11, 0, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 2, 11, 4, chunkBB); + generateBox(level, chunkBB, 0, 4, 0, 4, 4, 4, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + placeBlock(level, Tile::cobblestone_Id, 0, 0, 11, 2, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 4, 11, 2, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 2, 11, 0, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 2, 11, 4, chunkBB); // altar pieces - placeBlock(level, Tile::stoneBrick_Id, 0, 1, 1, 6, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 1, 1, 7, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 2, 1, 7, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 3, 1, 6, chunkBB); - placeBlock(level, Tile::stoneBrick_Id, 0, 3, 1, 7, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 1, 1, 6, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 1, 1, 7, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 2, 1, 7, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 3, 1, 6, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 3, 1, 7, chunkBB); placeBlock(level, Tile::stairs_stone_Id, getOrientationData(Tile::stairs_stone_Id, 3), 1, 1, 5, chunkBB); placeBlock(level, Tile::stairs_stone_Id, getOrientationData(Tile::stairs_stone_Id, 3), 2, 1, 6, chunkBB); placeBlock(level, Tile::stairs_stone_Id, getOrientationData(Tile::stairs_stone_Id, 3), 3, 1, 5, chunkBB); @@ -919,7 +994,7 @@ bool VillagePieces::SmallTemple::postProcess(Level *level, Random *random, Bound for (int x = 0; x < width; x++) { generateAirColumnUp(level, x, height, z, chunkBB); - fillColumnDown(level, Tile::stoneBrick_Id, 0, x, -1, z, chunkBB); + fillColumnDown(level, Tile::cobblestone_Id, 0, x, -1, z, chunkBB); } } @@ -934,6 +1009,10 @@ int VillagePieces::SmallTemple::getVillagerProfession(int villagerNumber) return Villager::PROFESSION_PRIEST; } +VillagePieces::BookHouse::BookHouse() +{ + // for reflection +} VillagePieces::BookHouse::BookHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth) { @@ -971,11 +1050,11 @@ bool VillagePieces::BookHouse::postProcess(Level *level, Random *random, Boundin generateBox(level, chunkBB, 1, 1, 1, 7, 5, 4, 0, 0, false); // floor - generateBox(level, chunkBB, 0, 0, 0, 8, 0, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 0, 0, 8, 0, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // roof - generateBox(level, chunkBB, 0, 5, 0, 8, 5, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 0, 6, 1, 8, 6, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 0, 7, 2, 8, 7, 3, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 5, 0, 8, 5, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 0, 6, 1, 8, 6, 4, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 0, 7, 2, 8, 7, 3, Tile::cobblestone_Id, Tile::cobblestone_Id, false); int southStairs = getOrientationData(Tile::stairs_wood_Id, 3); int northStairs = getOrientationData(Tile::stairs_wood_Id, 2); for (int d = -1; d <= 2; d++) { @@ -986,14 +1065,14 @@ bool VillagePieces::BookHouse::postProcess(Level *level, Random *random, Boundin } // rock supports - generateBox(level, chunkBB, 0, 1, 0, 0, 1, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 1, 1, 5, 8, 1, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 8, 1, 0, 8, 1, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 2, 1, 0, 7, 1, 0, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 0, 2, 0, 0, 4, 0, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 0, 2, 5, 0, 4, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 8, 2, 5, 8, 4, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 8, 2, 0, 8, 4, 0, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 1, 0, 0, 1, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 1, 1, 5, 8, 1, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 8, 1, 0, 8, 1, 4, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 2, 1, 0, 7, 1, 0, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 0, 2, 0, 0, 4, 0, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 0, 2, 5, 0, 4, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 8, 2, 5, 8, 4, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 8, 2, 0, 8, 4, 0, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // wooden walls generateBox(level, chunkBB, 0, 2, 1, 0, 4, 4, Tile::wood_Id, Tile::wood_Id, false); @@ -1056,7 +1135,7 @@ bool VillagePieces::BookHouse::postProcess(Level *level, Random *random, Boundin for (int x = 0; x < width; x++) { generateAirColumnUp(level, x, height, z, chunkBB); - fillColumnDown(level, Tile::stoneBrick_Id, 0, x, -1, z, chunkBB); + fillColumnDown(level, Tile::cobblestone_Id, 0, x, -1, z, chunkBB); } } @@ -1071,6 +1150,11 @@ int VillagePieces::BookHouse::getVillagerProfession(int villagerNumber) return Villager::PROFESSION_LIBRARIAN; } +VillagePieces::SmallHut::SmallHut() +{ + // for reflection +} + VillagePieces::SmallHut::SmallHut(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth), lowCeiling(random->nextBoolean()), tablePlacement(random->nextInt(3)) { heightPosition = -1; // 4J added initialiser @@ -1079,6 +1163,20 @@ VillagePieces::SmallHut::SmallHut(StartPiece *startPiece, int genDepth, Random * boundingBox = stairsBox; } +void VillagePieces::SmallHut::addAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::addAdditonalSaveData(tag); + tag->putInt(L"T", tablePlacement); + tag->putBoolean(L"C", lowCeiling); +} + +void VillagePieces::SmallHut::readAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::readAdditonalSaveData(tag); + tablePlacement = tag->getInt(L"T"); + lowCeiling = tag->getBoolean(L"C"); +} + VillagePieces::SmallHut *VillagePieces::SmallHut::createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, 0, 0, 0, width, height, depth, direction); @@ -1108,7 +1206,7 @@ bool VillagePieces::SmallHut::postProcess(Level *level, Random *random, Bounding generateBox(level, chunkBB, 1, 1, 1, 3, 5, 4, 0, 0, false); // floor - generateBox(level, chunkBB, 0, 0, 0, 3, 0, 4, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 0, 0, 3, 0, 4, Tile::cobblestone_Id, Tile::cobblestone_Id, false); generateBox(level, chunkBB, 1, 0, 1, 2, 0, 3, Tile::dirt_Id, Tile::dirt_Id, false); // roof if (lowCeiling) { @@ -1163,7 +1261,7 @@ bool VillagePieces::SmallHut::postProcess(Level *level, Random *random, Bounding for (int x = 0; x < width; x++) { generateAirColumnUp(level, x, height, z, chunkBB); - fillColumnDown(level, Tile::stoneBrick_Id, 0, x, -1, z, chunkBB); + fillColumnDown(level, Tile::cobblestone_Id, 0, x, -1, z, chunkBB); } } @@ -1173,9 +1271,13 @@ bool VillagePieces::SmallHut::postProcess(Level *level, Random *random, Bounding } +VillagePieces::PigHouse::PigHouse() +{ + // for reflection +} + VillagePieces::PigHouse::PigHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth) { - heightPosition = -1; // 4J added initialiser orientation = direction; boundingBox = stairsBox; } @@ -1212,7 +1314,7 @@ bool VillagePieces::PigHouse::postProcess(Level *level, Random *random, Bounding // pig floor generateBox(level, chunkBB, 2, 0, 6, 8, 0, 10, Tile::dirt_Id, Tile::dirt_Id, false); - placeBlock(level, Tile::stoneBrick_Id, 0, 6, 0, 6, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 6, 0, 6, chunkBB); // pig fence generateBox(level, chunkBB, 2, 1, 6, 2, 1, 10, Tile::fence_Id, Tile::fence_Id, false); generateBox(level, chunkBB, 8, 1, 6, 8, 1, 10, Tile::fence_Id, Tile::fence_Id, false); @@ -1220,10 +1322,10 @@ bool VillagePieces::PigHouse::postProcess(Level *level, Random *random, Bounding // floor generateBox(level, chunkBB, 1, 0, 1, 7, 0, 4, Tile::wood_Id, Tile::wood_Id, false); - generateBox(level, chunkBB, 0, 0, 0, 0, 3, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 8, 0, 0, 8, 3, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 1, 0, 0, 7, 1, 0, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 1, 0, 5, 7, 1, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 0, 0, 0, 3, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 8, 0, 0, 8, 3, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 1, 0, 0, 7, 1, 0, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 1, 0, 5, 7, 1, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // roof generateBox(level, chunkBB, 1, 2, 0, 7, 3, 0, Tile::wood_Id, Tile::wood_Id, false); @@ -1294,7 +1396,7 @@ bool VillagePieces::PigHouse::postProcess(Level *level, Random *random, Bounding for (int x = 0; x < width; x++) { generateAirColumnUp(level, x, height, z, chunkBB); - fillColumnDown(level, Tile::stoneBrick_Id, 0, x, -1, z, chunkBB); + fillColumnDown(level, Tile::cobblestone_Id, 0, x, -1, z, chunkBB); } } @@ -1313,6 +1415,11 @@ int VillagePieces::PigHouse::getVillagerProfession(int villagerNumber) return Villager::PROFESSION_FARMER; } +VillagePieces::TwoRoomHouse::TwoRoomHouse() +{ + // for reflection +} + VillagePieces::TwoRoomHouse::TwoRoomHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth) { heightPosition = -1; // 4J added initialiser @@ -1353,12 +1460,12 @@ bool VillagePieces::TwoRoomHouse::postProcess(Level *level, Random *random, Boun // floor generateBox(level, chunkBB, 2, 0, 5, 8, 0, 10, Tile::wood_Id, Tile::wood_Id, false); generateBox(level, chunkBB, 1, 0, 1, 7, 0, 4, Tile::wood_Id, Tile::wood_Id, false); - generateBox(level, chunkBB, 0, 0, 0, 0, 3, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 8, 0, 0, 8, 3, 10, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 1, 0, 0, 7, 2, 0, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 1, 0, 5, 2, 1, 5, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 2, 0, 6, 2, 3, 10, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); - generateBox(level, chunkBB, 3, 0, 10, 7, 3, 10, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 0, 0, 0, 3, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 8, 0, 0, 8, 3, 10, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 1, 0, 0, 7, 2, 0, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 1, 0, 5, 2, 1, 5, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 2, 0, 6, 2, 3, 10, Tile::cobblestone_Id, Tile::cobblestone_Id, false); + generateBox(level, chunkBB, 3, 0, 10, 7, 3, 10, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // room 1 roof generateBox(level, chunkBB, 1, 2, 0, 7, 3, 0, Tile::wood_Id, Tile::wood_Id, false); @@ -1456,7 +1563,7 @@ bool VillagePieces::TwoRoomHouse::postProcess(Level *level, Random *random, Boun for (int x = 0; x < width; x++) { generateAirColumnUp(level, x, height, z, chunkBB); - fillColumnDown(level, Tile::stoneBrick_Id, 0, x, -1, z, chunkBB); + fillColumnDown(level, Tile::cobblestone_Id, 0, x, -1, z, chunkBB); } } for (int z = 5; z < depth - 1; z++) @@ -1464,7 +1571,7 @@ bool VillagePieces::TwoRoomHouse::postProcess(Level *level, Random *random, Boun for (int x = 2; x < width; x++) { generateAirColumnUp(level, x, height, z, chunkBB); - fillColumnDown(level, Tile::stoneBrick_Id, 0, x, -1, z, chunkBB); + fillColumnDown(level, Tile::cobblestone_Id, 0, x, -1, z, chunkBB); } } @@ -1476,7 +1583,7 @@ bool VillagePieces::TwoRoomHouse::postProcess(Level *level, Random *random, Boun void VillagePieces::Smithy::staticCtor() { - treasureItems = WeighedTreasureArray(13); + treasureItems = WeighedTreasureArray(17); treasureItems[0] = new WeighedTreasure(Item::diamond_Id, 0, 1, 3, 3); treasureItems[1] = new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 10); treasureItems[2] = new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 5); @@ -1490,11 +1597,21 @@ void VillagePieces::Smithy::staticCtor() treasureItems[10] = new WeighedTreasure(Item::boots_iron_Id, 0, 1, 1, 5); treasureItems[11] = new WeighedTreasure(Tile::obsidian_Id, 0, 3, 7, 5); treasureItems[12] = new WeighedTreasure(Tile::sapling_Id, 0, 3, 7, 5); + // very rare for villages ... + treasureItems[13] = new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 3); + treasureItems[14] = new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 1); + treasureItems[15] = new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 1); + treasureItems[16] = new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 1); + // ... +} + +VillagePieces::Smithy::Smithy() +{ + // for reflection } VillagePieces::Smithy::Smithy(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth) { - heightPosition = -1; // 4J added initialiser hasPlacedChest = false; orientation = direction; @@ -1514,6 +1631,18 @@ VillagePieces::Smithy *VillagePieces::Smithy::createPiece(StartPiece *startPiece return new Smithy(startPiece, genDepth, random, box, direction); } +void VillagePieces::Smithy::addAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Chest", hasPlacedChest); +} + +void VillagePieces::Smithy::readAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::readAdditonalSaveData(tag); + hasPlacedChest = tag->getBoolean(L"Chest"); +} + bool VillagePieces::Smithy::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { if (heightPosition < 0) @@ -1530,10 +1659,10 @@ bool VillagePieces::Smithy::postProcess(Level *level, Random *random, BoundingBo generateBox(level, chunkBB, 0, 1, 0, 9, 4, 6, 0, 0, false); // floor - generateBox(level, chunkBB, 0, 0, 0, 9, 0, 6, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 0, 0, 9, 0, 6, Tile::cobblestone_Id, Tile::cobblestone_Id, false); // roof - generateBox(level, chunkBB, 0, 4, 0, 9, 4, 6, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 0, 4, 0, 9, 4, 6, Tile::cobblestone_Id, Tile::cobblestone_Id, false); generateBox(level, chunkBB, 0, 5, 0, 9, 5, 6, Tile::stoneSlabHalf_Id, Tile::stoneSlabHalf_Id, false); generateBox(level, chunkBB, 1, 5, 1, 8, 5, 5, 0, 0, false); @@ -1553,13 +1682,13 @@ bool VillagePieces::Smithy::postProcess(Level *level, Random *random, BoundingBo generateBox(level, chunkBB, 9, 1, 0, 9, 3, 0, Tile::fence_Id, Tile::fence_Id, false); // furnace - generateBox(level, chunkBB, 6, 1, 4, 9, 4, 6, Tile::stoneBrick_Id, Tile::stoneBrick_Id, false); + generateBox(level, chunkBB, 6, 1, 4, 9, 4, 6, Tile::cobblestone_Id, Tile::cobblestone_Id, false); placeBlock(level, Tile::lava_Id, 0, 7, 1, 5, chunkBB); placeBlock(level, Tile::lava_Id, 0, 8, 1, 5, chunkBB); placeBlock(level, Tile::ironFence_Id, 0, 9, 2, 5, chunkBB); placeBlock(level, Tile::ironFence_Id, 0, 9, 2, 4, chunkBB); generateBox(level, chunkBB, 7, 2, 4, 8, 2, 5, 0, 0, false); - placeBlock(level, Tile::stoneBrick_Id, 0, 6, 1, 3, chunkBB); + placeBlock(level, Tile::cobblestone_Id, 0, 6, 1, 3, chunkBB); placeBlock(level, Tile::furnace_Id, 0, 6, 2, 3, chunkBB); placeBlock(level, Tile::furnace_Id, 0, 6, 3, 3, chunkBB); placeBlock(level, Tile::stoneSlab_Id, 0, 8, 1, 1, chunkBB); @@ -1602,7 +1731,7 @@ bool VillagePieces::Smithy::postProcess(Level *level, Random *random, BoundingBo for (int x = 0; x < width; x++) { generateAirColumnUp(level, x, height, z, chunkBB); - fillColumnDown(level, Tile::stoneBrick_Id, 0, x, -1, z, chunkBB); + fillColumnDown(level, Tile::cobblestone_Id, 0, x, -1, z, chunkBB); } } @@ -1617,9 +1746,15 @@ int VillagePieces::Smithy::getVillagerProfession(int villagerNumber) return Villager::PROFESSION_SMITH; } +VillagePieces::Farmland::Farmland() +{ + cropsA = 0; + cropsB = 0; + // for reflection +} + VillagePieces::Farmland::Farmland(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth) { - heightPosition = -1; // 4J added initialiser orientation = direction; boundingBox = stairsBox; @@ -1632,7 +1767,7 @@ int VillagePieces::Farmland::selectCrops(Random *random) switch (random->nextInt(5)) { default: - return Tile::crops_Id; + return Tile::wheat_Id; case 0: return Tile::carrots_Id; case 1: @@ -1640,6 +1775,20 @@ int VillagePieces::Farmland::selectCrops(Random *random) } } +void VillagePieces::Farmland::addAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::addAdditonalSaveData(tag); + tag->putInt(L"CA", cropsA); + tag->putInt(L"CB", cropsB); +} + +void VillagePieces::Farmland::readAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::readAdditonalSaveData(tag); + cropsA = tag->getInt(L"CA"); + cropsB = tag->getInt(L"CB"); +} + VillagePieces::Farmland *VillagePieces::Farmland::createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) { BoundingBox *box = BoundingBox::orientBox(footX, footY, footZ, 0, 0, 0, width, height, depth, direction); @@ -1700,6 +1849,15 @@ bool VillagePieces::Farmland::postProcess(Level *level, Random *random, Bounding } +VillagePieces::DoubleFarmland::DoubleFarmland() +{ + cropsA = 0; + cropsB = 0; + cropsC = 0; + cropsD = 0; + // for reflection +} + VillagePieces::DoubleFarmland::DoubleFarmland(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction) : VillagePiece(startPiece, genDepth) { heightPosition = -1; // 4J added initialiser @@ -1712,12 +1870,30 @@ VillagePieces::DoubleFarmland::DoubleFarmland(StartPiece *startPiece, int genDep cropsD = selectCrops(random); } +void VillagePieces::DoubleFarmland::addAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::addAdditonalSaveData(tag); + tag->putInt(L"CA", cropsA); + tag->putInt(L"CB", cropsB); + tag->putInt(L"CC", cropsC); + tag->putInt(L"CD", cropsD); +} + +void VillagePieces::DoubleFarmland::readAdditonalSaveData(CompoundTag *tag) +{ + VillagePiece::readAdditonalSaveData(tag); + cropsA = tag->getInt(L"CA"); + cropsB = tag->getInt(L"CB"); + cropsC = tag->getInt(L"CC"); + cropsD = tag->getInt(L"CD"); +} + int VillagePieces::DoubleFarmland::selectCrops(Random *random) { switch (random->nextInt(5)) { default: - return Tile::crops_Id; + return Tile::wheat_Id; case 0: return Tile::carrots_Id; case 1: @@ -1794,6 +1970,11 @@ bool VillagePieces::DoubleFarmland::postProcess(Level *level, Random *random, Bo } +VillagePieces::LightPost::LightPost() +{ + // for reflection +} + VillagePieces::LightPost::LightPost(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *box, int direction) : VillagePiece(startPiece, genDepth) { heightPosition = -1; // 4J - added initialiser @@ -1835,7 +2016,7 @@ bool VillagePieces::LightPost::postProcess(Level *level, Random *random, Boundin placeBlock(level, Tile::fence_Id, 0, 1, 2, 0, chunkBB); // head - placeBlock(level, Tile::cloth_Id, DyePowderItem::WHITE, 1, 3, 0, chunkBB); + placeBlock(level, Tile::wool_Id, DyePowderItem::WHITE, 1, 3, 0, chunkBB); // torches placeBlock(level, Tile::torch_Id, 0, 0, 3, 0, chunkBB); diff --git a/Minecraft.World/VillagePieces.h b/Minecraft.World/VillagePieces.h index a80dfcf7..7570d65b 100644 --- a/Minecraft.World/VillagePieces.h +++ b/Minecraft.World/VillagePieces.h @@ -8,9 +8,9 @@ class VillagePieces private: static const int MAX_DEPTH = 50; - static const int BASE_ROAD_DEPTH = 3; - // the dungeon starts at 64 and traverses downwards to this point - static const int LOWEST_Y_POSITION = 10; + static const int BASE_ROAD_DEPTH = 3; + // the dungeon starts at 64 and traverses downwards to this point + static const int LOWEST_Y_POSITION = 10; public: static const int SIZE_SMALL = 0; @@ -31,19 +31,22 @@ public: EPieceClass_TwoRoomHouse }; - class PieceWeight { + static void loadStatic(); + + class PieceWeight + { public: EPieceClass pieceClass; // 4J - EPieceClass was Class - const int weight; - int placeCount; - int maxPlaceCount; + const int weight; + int placeCount; + int maxPlaceCount; - PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount); // 4J - EPieceClass was Class - bool doPlace(int depth); - bool isValid(); - }; + PieceWeight(EPieceClass pieceClass, int weight, int maxPlaceCount); // 4J - EPieceClass was Class + bool doPlace(int depth); + bool isValid(); + }; - static list *createPieceSet(Random *random, int villageSize); // 4J - was ArrayList + static list *createPieceSet(Random *random, int villageSize); // 4J - was ArrayList class StartPiece; private: @@ -55,19 +58,25 @@ private: static StructurePiece *generateAndAddRoadPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); - /** - * - * - */ + /** + * + * + */ private: class VillagePiece : public StructurePiece { + protected: + int heightPosition; private: int spawnedVillagerCount; + bool isDesertVillage; protected: StartPiece *startPiece; + VillagePiece(); VillagePiece(StartPiece *startPiece, int genDepth); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); StructurePiece *generateHouseNorthernLeft(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff); StructurePiece *generateHouseNorthernRight(StartPiece *startPiece, list *pieces, Random *random, int yOff, int zOff); int getAverageGroundHeight(Level *level, BoundingBox *chunkBB); @@ -79,108 +88,136 @@ private: virtual void placeBlock(Level *level, int block, int data, int x, int y, int z, BoundingBox *chunkBB); virtual void generateBox(Level *level, BoundingBox *chunkBB, int x0, int y0, int z0, int x1, int y1, int z1, int edgeTile, int fillTile, bool skipAir); virtual void fillColumnDown(Level *level, int block, int data, int x, int startY, int z, BoundingBox *chunkBB); - }; + }; - /** - * - * - */ + /** + * + * + */ public: class Well : public VillagePiece { + public: + static StructurePiece *Create() { return new Well(); } + virtual EStructurePiece GetType() { return eStructurePiece_Well; } + private: static const int width = 6; static const int height = 15; static const int depth = 6; - - const bool isSource; - int heightPosition; public: + Well(); Well(StartPiece *startPiece, int genDepth, Random *random, int west, int north); - - Well(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); - virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); - //static Well *createPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + Well(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; public: class StartPiece : public Well { public: + virtual EStructurePiece GetType() { return eStructurePiece_VillageStartPiece; } + + public: + // these fields are only used in generation step and aren't serialized :{ BiomeSource *biomeSource; bool isDesertVillage; int villageSize; bool isLibraryAdded; PieceWeight *previousPiece; - list *pieceSet; // 4J - was ArrayList + list *pieceSet; Level *m_level; - // these queues are used so that the addChildren calls are - // called in a random order - vector pendingHouses; // 4J - was ArrayList - vector pendingRoads; // 4J - was ArrayList - + // these queues are used so that the addChildren calls are called in a random order + vector pendingHouses; + vector pendingRoads; + + StartPiece(); StartPiece(BiomeSource *biomeSource, int genDepth, Random *random, int west, int north, list *pieceSet, int villageSize, Level *level); // 4J Added level param virtual ~StartPiece(); - + BiomeSource *getBiomeSource(); - }; + }; public: class VillageRoadPiece : public VillagePiece { - protected : + protected: + VillageRoadPiece() {} VillageRoadPiece(StartPiece *startPiece, int genDepth) : VillagePiece(startPiece, genDepth) {} - }; + }; - /** - * - * - */ + /** + * + * + */ public: class StraightRoad : public VillageRoadPiece { + public: + static StructurePiece *Create() { return new StraightRoad(); } + virtual EStructurePiece GetType() { return eStructurePiece_StraightRoad; } private: static const int width = 3; int length; public: + StraightRoad(); StraightRoad(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); + + public: virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); static BoundingBox *findPieceBox(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; - /** - * - * - */ + /** + * + * + */ public: class SimpleHouse : public VillagePiece { + public: + static StructurePiece *Create() { return new SimpleHouse(); } + virtual EStructurePiece GetType() { return eStructurePiece_SimpleHouse; } + private: static const int width = 5; static const int height = 6; static const int depth = 5; private: - int heightPosition; - const bool hasTerrace; + bool hasTerrace; public: + SimpleHouse(); SimpleHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); + public: static SimpleHouse *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); }; public: class SmallTemple : public VillagePiece { + public: + static StructurePiece *Create() { return new SmallTemple(); } + virtual EStructurePiece GetType() { return eStructurePiece_SmallTemple; } + private: static const int width = 5; static const int height = 12; @@ -189,6 +226,7 @@ public: int heightPosition; public: + SmallTemple(); SmallTemple(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); static SmallTemple *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); @@ -199,6 +237,10 @@ public: public: class BookHouse : public VillagePiece { + public: + static StructurePiece *Create() { return new BookHouse(); } + virtual EStructurePiece GetType() { return eStructurePiece_BookHouse; } + private: static const int width = 9; static const int height = 9; @@ -207,6 +249,7 @@ public: int heightPosition; public: + BookHouse(); BookHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); static BookHouse *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); @@ -214,37 +257,50 @@ public: virtual int getVillagerProfession(int villagerNumber); }; +public: + class SmallHut : public VillagePiece + { public: - class SmallHut : public VillagePiece - { + static StructurePiece *Create() { return new SmallHut(); } + virtual EStructurePiece GetType() { return eStructurePiece_SmallHut; } + + + private: + static const int width = 4; + static const int height = 6; + static const int depth = 5; - private: - static const int width = 4; - static const int height = 6; - static const int depth = 5; + bool lowCeiling; + int tablePlacement; - int heightPosition; - const bool lowCeiling; - const int tablePlacement; + public: + SmallHut(); + SmallHut(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); - public: - SmallHut(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); - static SmallHut *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + static SmallHut *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; public: class PigHouse : public VillagePiece { + public: + static StructurePiece *Create() { return new PigHouse(); } + virtual EStructurePiece GetType() { return eStructurePiece_PigHouse; } + private: static const int width = 9; static const int height = 7; static const int depth = 11; - int heightPosition; - public: + PigHouse(); PigHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); static PigHouse *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); @@ -254,6 +310,10 @@ public: public: class TwoRoomHouse : public VillagePiece { + public: + static StructurePiece *Create() { return new TwoRoomHouse(); } + virtual EStructurePiece GetType() { return eStructurePiece_TwoRoomHouse; } + private: static const int width = 9; static const int height = 7; @@ -262,21 +322,25 @@ public: int heightPosition; public: + TwoRoomHouse(); TwoRoomHouse(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); static TwoRoomHouse *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); }; public: - class Smithy : public VillagePiece + class Smithy : public VillagePiece { + public: + static StructurePiece *Create() { return new Smithy(); } + virtual EStructurePiece GetType() { return eStructurePiece_Smithy; } + private: static const int width = 10; static const int height = 6; static const int depth = 7; - int heightPosition; bool hasPlacedChest; static WeighedTreasureArray treasureItems; @@ -284,22 +348,31 @@ public: public: static void staticCtor(); + Smithy(); Smithy(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); - static Smithy *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + static Smithy *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); + + public: + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); virtual int getVillagerProfession(int villagerNumber); - }; + }; public: class Farmland : public VillagePiece { + public: + static StructurePiece *Create() { return new Farmland(); } + virtual EStructurePiece GetType() { return eStructurePiece_Farmland; } + private: static const int width = 7; static const int height = 4; static const int depth = 9; - - int heightPosition; int cropsA; int cropsB; @@ -307,19 +380,30 @@ public: int selectCrops(Random *random); public: + Farmland(); Farmland(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); - static Farmland *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + static Farmland *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; public: class DoubleFarmland : public VillagePiece { + public: + static StructurePiece *Create() { return new DoubleFarmland(); } + virtual EStructurePiece GetType() { return eStructurePiece_DoubleFarmland; } + private: static const int width = 13; static const int height = 4; static const int depth = 9; - + int heightPosition; int cropsA; @@ -330,24 +414,36 @@ public: int selectCrops(Random *random); public: + DoubleFarmland(); DoubleFarmland(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *stairsBox, int direction); - static DoubleFarmland *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); + + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + static DoubleFarmland *createPiece(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + }; public: class LightPost : public VillagePiece { + public: + static StructurePiece *Create() { return new LightPost(); } + virtual EStructurePiece GetType() { return eStructurePiece_LightPost; } + private: static const int width = 3; - static const int height = 4; - static const int depth = 2; + static const int height = 4; + static const int depth = 2; - int heightPosition; + int heightPosition; public: + LightPost(); LightPost(StartPiece *startPiece, int genDepth, Random *random, BoundingBox *box, int direction); - static BoundingBox *findPieceBox(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction); - virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); - }; + static BoundingBox *findPieceBox(StartPiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; }; diff --git a/Minecraft.World/VillageSiege.cpp b/Minecraft.World/VillageSiege.cpp index 55b2a3e8..0f967595 100644 --- a/Minecraft.World/VillageSiege.cpp +++ b/Minecraft.World/VillageSiege.cpp @@ -135,7 +135,7 @@ bool VillageSiege::trySpawn() //try { mob = shared_ptr( new Zombie(level) ); - mob->finalizeMobSpawn(); + mob->finalizeMobSpawn(NULL); mob->setVillager(false); } //catch (Exception e) { diff --git a/Minecraft.World/Villager.cpp b/Minecraft.World/Villager.cpp index 328c0c70..1fe32a12 100644 --- a/Minecraft.World/Villager.cpp +++ b/Minecraft.World/Villager.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.ai.village.h" @@ -24,15 +25,12 @@ void Villager::_init(int profession) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); setProfession(profession); setSize(.6f, 1.8f); - runSpeed = 0.5f; - villageUpdateInterval = 0; inLove = false; chasing = false; @@ -43,27 +41,27 @@ void Villager::_init(int profession) updateMerchantTimer = 0; addRecipeOnUpdate = false; riches = 0; - lastPlayerTradeName = L""; - rewardPlayersOnFirstVillage = false; + lastPlayerTradeName = L""; + rewardPlayersOnFirstVillage = false; baseRecipeChanceMod = 0.0f; getNavigation()->setCanOpenDoors(true); getNavigation()->setAvoidWater(true); goalSelector.addGoal(0, new FloatGoal(this)); - goalSelector.addGoal(1, new AvoidPlayerGoal(this, typeid(Zombie), 8, 0.3f, 0.35f)); + goalSelector.addGoal(1, new AvoidPlayerGoal(this, typeid(Zombie), 8, 0.6, 0.6)); goalSelector.addGoal(1, new TradeWithPlayerGoal(this)); goalSelector.addGoal(1, new LookAtTradingPlayerGoal(this)); goalSelector.addGoal(2, new MoveIndoorsGoal(this)); goalSelector.addGoal(3, new RestrictOpenDoorGoal(this)); goalSelector.addGoal(4, new OpenDoorGoal(this, true)); - goalSelector.addGoal(5, new MoveTowardsRestrictionGoal(this, 0.3f)); + goalSelector.addGoal(5, new MoveTowardsRestrictionGoal(this, 0.6)); goalSelector.addGoal(6, new MakeLoveGoal(this)); goalSelector.addGoal(7, new TakeFlowerGoal(this)); - goalSelector.addGoal(8, new PlayGoal(this, 0.32f)); + goalSelector.addGoal(8, new PlayGoal(this, 0.32)); goalSelector.addGoal(9, new InteractGoal(this, typeid(Player), 3, 1.f)); goalSelector.addGoal(9, new InteractGoal(this, typeid(Villager), 5, 0.02f)); - goalSelector.addGoal(9, new RandomStrollGoal(this, 0.3f)); + goalSelector.addGoal(9, new RandomStrollGoal(this, 0.6)); goalSelector.addGoal(10, new LookAtPlayerGoal(this, typeid(Mob), 8)); } @@ -82,6 +80,13 @@ Villager::~Villager() delete offers; } +void Villager::registerAttributes() +{ + AgableMob::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.5f); +} + bool Villager::useNewAi() { return true; @@ -145,11 +150,11 @@ void Villager::serverAiMobStep() AgableMob::serverAiMobStep(); } -bool Villager::interact(shared_ptr player) +bool Villager::mobInteract(shared_ptr player) { // [EB]: Truly dislike this code but I don't see another easy way shared_ptr item = player->inventory->getSelected(); - bool holdingSpawnEgg = item != NULL && item->id == Item::monsterPlacer_Id; + bool holdingSpawnEgg = item != NULL && item->id == Item::spawnEgg_Id; if (!holdingSpawnEgg && isAlive() && !isTrading() && !isBaby()) { @@ -157,11 +162,13 @@ bool Villager::interact(shared_ptr player) { // note: stop() logic is controlled by trading ai goal setTradingPlayer(player); - player->openTrading(dynamic_pointer_cast(shared_from_this())); + + // 4J-JEV: Villagers in PC game don't display professions. + player->openTrading(dynamic_pointer_cast(shared_from_this()), getDisplayName() ); } return true; } - return AgableMob::interact(player); + return AgableMob::mobInteract(player); } void Villager::defineSynchedData() @@ -170,11 +177,6 @@ void Villager::defineSynchedData() entityData->define(DATA_PROFESSION_ID, 0); } -int Villager::getMaxHealth() -{ - return 20; -} - void Villager::addAdditonalSaveData(CompoundTag *tag) { AgableMob::addAdditonalSaveData(tag); @@ -199,34 +201,6 @@ void Villager::readAdditionalSaveData(CompoundTag *tag) } } -int Villager::getTexture() -{ - // 4J Made switch - switch(getProfession()) - { - case PROFESSION_FARMER: - return TN_MOB_VILLAGER_FARMER; // 4J was "/mob/villager/farmer.png"; - break; - case PROFESSION_LIBRARIAN: - return TN_MOB_VILLAGER_LIBRARIAN; // 4J was "/mob/villager/librarian.png"; - break; - case PROFESSION_PRIEST: - return TN_MOB_VILLAGER_PRIEST; // 4J was "/mob/villager/priest.png"; - break; - case PROFESSION_SMITH: - return TN_MOB_VILLAGER_SMITH; // 4J was "/mob/villager/smith.png"; - break; - case PROFESSION_BUTCHER: - return TN_MOB_VILLAGER_BUTCHER; // 4J was "/mob/villager/butcher.png"; - break; - //default: - // return TN_MOB_VILLAGER_VILLAGER; // 4J was "/mob/villager/villager.png"; - // break; - } - - return AgableMob::getTexture(); -} - bool Villager::removeWhenFarAway() { return false; @@ -281,7 +255,7 @@ bool Villager::isChasing() return chasing; } -void Villager::setLastHurtByMob(shared_ptr mob) +void Villager::setLastHurtByMob(shared_ptr mob) { AgableMob::setLastHurtByMob(mob); shared_ptr _village = village.lock(); @@ -289,15 +263,14 @@ void Villager::setLastHurtByMob(shared_ptr mob) { _village->addAggressor(mob); - shared_ptr player = dynamic_pointer_cast(mob); - if (player) + if ( mob->instanceof(eTYPE_PLAYER) ) { int amount = -1; if (isBaby()) { amount = -3; } - _village->modifyStanding(player->getName(), amount); + _village->modifyStanding( dynamic_pointer_cast(mob)->getName(), amount ); if (isAlive()) { level->broadcastEntityEvent(shared_from_this(), EntityEvent::VILLAGER_ANGRY); @@ -314,12 +287,11 @@ void Villager::die(DamageSource *source) shared_ptr sourceEntity = source->getEntity(); if (sourceEntity != NULL) { - if ((sourceEntity->GetType() & eTYPE_PLAYER) == eTYPE_PLAYER) + if ( sourceEntity->instanceof(eTYPE_PLAYER) ) { - shared_ptr player = dynamic_pointer_cast(sourceEntity); - _village->modifyStanding(player->getName(), -2); + _village->modifyStanding( dynamic_pointer_cast(sourceEntity)->getName(), -2 ); } - else if ((sourceEntity->GetType() & eTYPE_ENEMY) == eTYPE_ENEMY) + else if ( sourceEntity->instanceof(eTYPE_ENEMY) ) { _village->resetNoBreedTimer(); } @@ -423,7 +395,7 @@ void Villager::addOffers(int addCount) { case PROFESSION_FARMER: addItemForTradeIn(newOffers, Item::wheat_Id, random, getRecipeChance(.9f)); - addItemForTradeIn(newOffers, Tile::cloth_Id, random, getRecipeChance(.5f)); + addItemForTradeIn(newOffers, Tile::wool_Id, random, getRecipeChance(.5f)); addItemForTradeIn(newOffers, Item::chicken_raw_Id, random, getRecipeChance(.5f)); addItemForTradeIn(newOffers, Item::fish_cooked_Id, random, getRecipeChance(.4f)); addItemForPurchase(newOffers, Item::bread_Id, random, getRecipeChance(.9f)); @@ -434,9 +406,9 @@ void Villager::addOffers(int addCount) addItemForPurchase(newOffers, Item::flintAndSteel_Id, random, getRecipeChance(.3f)); addItemForPurchase(newOffers, Item::chicken_cooked_Id, random, getRecipeChance(.3f)); addItemForPurchase(newOffers, Item::arrow_Id, random, getRecipeChance(.5f)); - if (random->nextFloat() < .5f) + if (random->nextFloat() < getRecipeChance(.5f)) { - newOffers->push_back(new MerchantRecipe(shared_ptr( new ItemInstance(Tile::gravel, 10) ), shared_ptr( new ItemInstance(Item::emerald) ), shared_ptr( new ItemInstance(Item::flint_Id, 2 + random->nextInt(2), 0)))); + newOffers->push_back(new MerchantRecipe(shared_ptr( new ItemInstance(Tile::gravel, 10) ), shared_ptr( new ItemInstance(Item::emerald) ), shared_ptr( new ItemInstance(Item::flint_Id, 4 + random->nextInt(2), 0)))); } break; case PROFESSION_BUTCHER: @@ -444,10 +416,10 @@ void Villager::addOffers(int addCount) addItemForTradeIn(newOffers, Item::porkChop_raw_Id, random, getRecipeChance(.5f)); addItemForTradeIn(newOffers, Item::beef_raw_Id, random, getRecipeChance(.5f)); addItemForPurchase(newOffers, Item::saddle_Id, random, getRecipeChance(.1f)); - addItemForPurchase(newOffers, Item::chestplate_cloth_Id, random, getRecipeChance(.3f)); - addItemForPurchase(newOffers, Item::boots_cloth_Id, random, getRecipeChance(.3f)); - addItemForPurchase(newOffers, Item::helmet_cloth_Id, random, getRecipeChance(.3f)); - addItemForPurchase(newOffers, Item::leggings_cloth_Id, random, getRecipeChance(.3f)); + addItemForPurchase(newOffers, Item::chestplate_leather_Id, random, getRecipeChance(.3f)); + addItemForPurchase(newOffers, Item::boots_leather_Id, random, getRecipeChance(.3f)); + addItemForPurchase(newOffers, Item::helmet_leather_Id, random, getRecipeChance(.3f)); + addItemForPurchase(newOffers, Item::leggings_leather_Id, random, getRecipeChance(.3f)); addItemForPurchase(newOffers, Item::porkChop_cooked_Id, random, getRecipeChance(.3f)); addItemForPurchase(newOffers, Item::beef_cooked_Id, random, getRecipeChance(.3f)); break; @@ -503,7 +475,7 @@ void Villager::addOffers(int addCount) addItemForPurchase(newOffers, Item::eyeOfEnder_Id, random, getRecipeChance(.3f)); addItemForPurchase(newOffers, Item::expBottle_Id, random, getRecipeChance(.2f)); addItemForPurchase(newOffers, Item::redStone_Id, random, getRecipeChance(.4f)); - addItemForPurchase(newOffers, Tile::lightGem_Id, random, getRecipeChance(.3f)); + addItemForPurchase(newOffers, Tile::glowstone_Id, random, getRecipeChance(.3f)); { int enchantItems[] = { Item::sword_iron_Id, Item::sword_diamond_Id, Item::chestplate_iron_Id, Item::chestplate_diamond_Id, Item::hatchet_iron_Id, Item::hatchet_diamond_Id, Item::pickAxe_iron_Id, @@ -570,7 +542,7 @@ void Villager::staticCtor() MIN_MAX_VALUES[Item::seeds_melon_Id] = pair(30, 38); MIN_MAX_VALUES[Item::seeds_pumpkin_Id] = pair(30, 38); MIN_MAX_VALUES[Item::wheat_Id] = pair(18, 22); - MIN_MAX_VALUES[Tile::cloth_Id] = pair(14, 22); + MIN_MAX_VALUES[Tile::wool_Id] = pair(14, 22); MIN_MAX_VALUES[Item::rotten_flesh_Id] = pair(36, 64); MIN_MAX_PRICES[Item::flintAndSteel_Id] = pair(3, 4); @@ -603,16 +575,16 @@ void Villager::staticCtor() MIN_MAX_PRICES[Item::cookie_Id] = pair(-10, -7); MIN_MAX_PRICES[Tile::glass_Id] = pair(-5, -3); MIN_MAX_PRICES[Tile::bookshelf_Id] = pair(3, 4); - MIN_MAX_PRICES[Item::chestplate_cloth_Id] = pair(4, 5); - MIN_MAX_PRICES[Item::boots_cloth_Id] = pair(2, 4); - MIN_MAX_PRICES[Item::helmet_cloth_Id] = pair(2, 4); - MIN_MAX_PRICES[Item::leggings_cloth_Id] = pair(2, 4); + MIN_MAX_PRICES[Item::chestplate_leather_Id] = pair(4, 5); + MIN_MAX_PRICES[Item::boots_leather_Id] = pair(2, 4); + MIN_MAX_PRICES[Item::helmet_leather_Id] = pair(2, 4); + MIN_MAX_PRICES[Item::leggings_leather_Id] = pair(2, 4); MIN_MAX_PRICES[Item::saddle_Id] = pair(6, 8); MIN_MAX_PRICES[Item::expBottle_Id] = pair(-4, -1); MIN_MAX_PRICES[Item::redStone_Id] = pair(-4, -1); MIN_MAX_PRICES[Item::compass_Id] = pair(10, 12); MIN_MAX_PRICES[Item::clock_Id] = pair(10, 12); - MIN_MAX_PRICES[Tile::lightGem_Id] = pair(-3, -1); + MIN_MAX_PRICES[Tile::glowstone_Id] = pair(-3, -1); MIN_MAX_PRICES[Item::porkChop_cooked_Id] = pair(-7, -5); MIN_MAX_PRICES[Item::beef_cooked_Id] = pair(-7, -5); MIN_MAX_PRICES[Item::chicken_cooked_Id] = pair(-8, -6); @@ -732,9 +704,13 @@ void Villager::addParticlesAroundSelf(ePARTICLE_TYPE particle) } } -void Villager::finalizeMobSpawn() +MobGroupData *Villager::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param { - setProfession(level->random->nextInt(Villager::PROFESSION_MAX)); + groupData = AgableMob::finalizeMobSpawn(groupData); + + setProfession(level->random->nextInt(PROFESSION_MAX)); + + return groupData; } void Villager::setRewardPlayersInVillage() @@ -748,7 +724,7 @@ shared_ptr Villager::getBreedOffspring(shared_ptr target) if(level->canCreateMore(GetType(), Level::eSpawnType_Breed) ) { shared_ptr villager = shared_ptr(new Villager(level)); - villager->finalizeMobSpawn(); + villager->finalizeMobSpawn(NULL); return villager; } else @@ -757,8 +733,15 @@ shared_ptr Villager::getBreedOffspring(shared_ptr target) } } -int Villager::getDisplayName() +bool Villager::canBeLeashed() +{ + return false; +} + +wstring Villager::getDisplayName() { + if (hasCustomName()) return getCustomName(); + int name = IDS_VILLAGER; switch(getProfession()) { @@ -778,5 +761,5 @@ int Villager::getDisplayName() name = IDS_VILLAGER_BUTCHER; break; }; - return name; + return app.GetString(name); } diff --git a/Minecraft.World/Villager.h b/Minecraft.World/Villager.h index b6ad7d1c..d8aeb15a 100644 --- a/Minecraft.World/Villager.h +++ b/Minecraft.World/Villager.h @@ -39,9 +39,9 @@ private: int updateMerchantTimer; bool addRecipeOnUpdate; int riches; - wstring lastPlayerTradeName; + wstring lastPlayerTradeName; - bool rewardPlayersOnFirstVillage; + bool rewardPlayersOnFirstVillage; private: @@ -52,24 +52,25 @@ public: Villager(Level *level, int profession); ~Villager(); +protected: + virtual void registerAttributes(); + +public: virtual bool useNewAi(); protected: virtual void serverAiMobStep(); public: - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); protected: virtual void defineSynchedData(); public: - virtual int getMaxHealth(); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); - virtual int getTexture(); - protected: virtual bool removeWhenFarAway(); virtual int getAmbientSound(); @@ -83,7 +84,7 @@ public: void setInLove(bool inLove); void setChasing(bool chasing); bool isChasing(); - void setLastHurtByMob(shared_ptr mob); + void setLastHurtByMob(shared_ptr mob); void die(DamageSource *source); void handleEntityEvent(byte id); @@ -141,9 +142,9 @@ private: static int getPurchaseCost(int itemId, Random *random); public: - void finalizeMobSpawn(); - void setRewardPlayersInVillage(); - shared_ptr getBreedOffspring(shared_ptr target); - - virtual int getDisplayName(); + virtual MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param + virtual void setRewardPlayersInVillage(); + virtual shared_ptr getBreedOffspring(shared_ptr target); + virtual bool canBeLeashed(); + virtual wstring getDisplayName(); }; \ No newline at end of file diff --git a/Minecraft.World/VillagerGolem.cpp b/Minecraft.World/VillagerGolem.cpp index a0f05472..dba80ffa 100644 --- a/Minecraft.World/VillagerGolem.cpp +++ b/Minecraft.World/VillagerGolem.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.control.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" @@ -23,34 +24,30 @@ VillagerGolem::VillagerGolem(Level *level) : Golem(level) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); villageUpdateInterval = 0; village = weak_ptr(); attackAnimationTick = 0; offerFlowerTick = 0; - this->textureIdx = TN_MOB_VILLAGER_GOLEM; // "/mob/villager_golem.png"; - this->setSize(1.4f, 2.9f); + setSize(1.4f, 2.9f); getNavigation()->setAvoidWater(true); - // 4J-JEV: These speed values are as they appear before 1.6.4 (1.5), - // as the movement speed system changes then. (Mob attributes added) - goalSelector.addGoal(1, new MeleeAttackGoal(this, 0.25f, true)); - goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.22f, 32)); - goalSelector.addGoal(3, new MoveThroughVillageGoal(this, 0.16f, true)); - goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, 0.16f)); + goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true)); + goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9, 32)); + goalSelector.addGoal(3, new MoveThroughVillageGoal(this, 0.6, true)); + goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, 1.0)); goalSelector.addGoal(5, new OfferFlowerGoal(this)); - goalSelector.addGoal(6, new RandomStrollGoal(this, 0.16f)); + goalSelector.addGoal(6, new RandomStrollGoal(this, 0.6)); goalSelector.addGoal(7, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(8, new RandomLookAroundGoal(this)); targetSelector.addGoal(1, new DefendVillageTargetGoal(this)); targetSelector.addGoal(2, new HurtByTargetGoal(this, false)); - targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, typeid(Monster), 16, 0, false, true)); + targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, typeid(Mob), 0, false, true, Enemy::ENEMY_SELECTOR)); } void VillagerGolem::defineSynchedData() @@ -82,9 +79,12 @@ void VillagerGolem::serverAiMobStep() Golem::serverAiMobStep(); } -int VillagerGolem::getMaxHealth() +void VillagerGolem::registerAttributes() { - return 100; + Golem::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(100); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); } int VillagerGolem::decreaseAirSupply(int currentSupply) @@ -93,6 +93,18 @@ int VillagerGolem::decreaseAirSupply(int currentSupply) return currentSupply; } +void VillagerGolem::doPush(shared_ptr e) +{ + if ( e->instanceof(eTYPE_ENEMY) ) + { + if (getRandom()->nextInt(20) == 0) + { + setTarget(dynamic_pointer_cast(e)); + } + } + Golem::doPush(e); +} + void VillagerGolem::aiStep() { Golem::aiStep(); @@ -103,7 +115,7 @@ void VillagerGolem::aiStep() if (xd * xd + zd * zd > MoveControl::MIN_SPEED_SQR && random->nextInt(5) == 0) { int xt = Mth::floor(x); - int yt = Mth::floor(y - 0.2f - this->heightOffset); + int yt = Mth::floor(y - 0.2f - heightOffset); int zt = Mth::floor(z); int t = level->getTile(xt, yt, zt); int d = level->getData(xt, yt, zt); @@ -139,7 +151,7 @@ bool VillagerGolem::doHurtTarget(shared_ptr target) level->broadcastEntityEvent(shared_from_this(), EntityEvent::START_ATTACKING); bool hurt = target->hurt(DamageSource::mobAttack(dynamic_pointer_cast(shared_from_this())), 7 + random->nextInt(15)); if (hurt) target->yd += 0.4f; - level->playSound(shared_from_this(), eSoundType_MOB_IRONGOLEM_THROW, 1, 1); + playSound(eSoundType_MOB_IRONGOLEM_THROW, 1, 1); return hurt; } @@ -148,7 +160,7 @@ void VillagerGolem::handleEntityEvent(byte id) if (id == EntityEvent::START_ATTACKING) { attackAnimationTick = 10; - level->playSound(shared_from_this(), eSoundType_MOB_IRONGOLEM_THROW, 1, 1); + playSound(eSoundType_MOB_IRONGOLEM_THROW, 1, 1); } else if (id == EntityEvent::OFFER_FLOWER) { @@ -190,7 +202,7 @@ int VillagerGolem::getDeathSound() void VillagerGolem::playStepSound(int xt, int yt, int zt, int t) { - level->playSound(shared_from_this(), eSoundType_MOB_IRONGOLEM_WALK, 1, 1); + playSound(eSoundType_MOB_IRONGOLEM_WALK, 1, 1); } void VillagerGolem::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) @@ -237,4 +249,20 @@ void VillagerGolem::die(DamageSource *source) village.lock()->modifyStanding(lastHurtByPlayer->getName(), -5); } Golem::die(source); +} + +bool VillagerGolem::hurt(DamageSource *source, float dmg) +{ + // 4J: Protect owned golem from untrusted players + if (isPlayerCreated()) + { + shared_ptr entity = source->getDirectEntity(); + if (entity != NULL && entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(entity); + if (!player->isAllowedToAttackPlayers()) return false; + } + } + + return Golem::hurt(source, dmg); } \ No newline at end of file diff --git a/Minecraft.World/VillagerGolem.h b/Minecraft.World/VillagerGolem.h index dfcd3ac0..55b6cae2 100644 --- a/Minecraft.World/VillagerGolem.h +++ b/Minecraft.World/VillagerGolem.h @@ -31,12 +31,9 @@ public: protected: virtual void serverAiMobStep(); - -public: - virtual int getMaxHealth(); - -protected: + virtual void registerAttributes(); virtual int decreaseAirSupply(int currentSupply); + virtual void doPush(shared_ptr e); public: virtual void aiStep(); @@ -61,4 +58,5 @@ public: virtual bool isPlayerCreated(); virtual void setPlayerCreated(bool value); virtual void die(DamageSource *source); + virtual bool hurt(DamageSource *source, float dmg); }; \ No newline at end of file diff --git a/Minecraft.World/Villages.cpp b/Minecraft.World/Villages.cpp index 995befe8..ddb0e7dc 100644 --- a/Minecraft.World/Villages.cpp +++ b/Minecraft.World/Villages.cpp @@ -64,14 +64,12 @@ void Villages::tick() void Villages::removeVillages() { - //for (Iterator it = villages.iterator(); it.hasNext();) for(AUTO_VAR(it, villages.begin()); it != villages.end(); ) { - shared_ptr village = *it; //it.next(); + shared_ptr village = *it; if (village->canRemove()) { it = villages.erase(it); - //it.remove(); setDirty(); } else @@ -90,7 +88,6 @@ shared_ptr Villages::getClosestVillage(int x, int y, int z, int maxDist { shared_ptr closest = nullptr; float closestDistSqr = Float::MAX_VALUE; - //for (Village village : villages) for(AUTO_VAR(it, villages.begin()); it != villages.end(); ++it) { shared_ptr village = *it; @@ -118,13 +115,11 @@ void Villages::processNextQuery() void Villages::cluster() { // note doesn't merge or split existing villages - //for (int i = 0; i < unclustered.size(); ++i) for(AUTO_VAR(it, unclustered.begin()); it != unclustered.end(); ++it) { - shared_ptr di = *it; //unclustered.get(i); + shared_ptr di = *it; bool found = false; - //for (Village village : villages) for(AUTO_VAR(itV, villages.begin()); itV != villages.end(); ++itV) { shared_ptr village = *itV; diff --git a/Minecraft.World/VineTile.cpp b/Minecraft.World/VineTile.cpp index 1170caf2..25600cbd 100644 --- a/Minecraft.World/VineTile.cpp +++ b/Minecraft.World/VineTile.cpp @@ -10,7 +10,7 @@ VineTile::VineTile(int id) : Tile(id, Material::replaceable_plant, isSolidRender() ) { - setTicking(true); + setTicking(true); } void VineTile::updateDefaultShape() @@ -35,68 +35,68 @@ bool VineTile::isCubeShaped() void VineTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param { - const float thickness = 1.0f / 16.0f; + const float thickness = 1.0f / 16.0f; - int facings = level->getData(x, y, z); + int facings = level->getData(x, y, z); - float minX = 1; - float minY = 1; - float minZ = 1; - float maxX = 0; - float maxY = 0; - float maxZ = 0; - bool hasWall = facings > 0; + float minX = 1; + float minY = 1; + float minZ = 1; + float maxX = 0; + float maxY = 0; + float maxZ = 0; + bool hasWall = facings > 0; - if ((facings & VINE_WEST) != 0) + if ((facings & VINE_WEST) != 0) { - maxX = Math::_max(maxX, thickness); - minX = 0; - minY = 0; - maxY = 1; - minZ = 0; - maxZ = 1; - hasWall = true; - } - if ((facings & VINE_EAST) != 0) + maxX = Math::_max(maxX, thickness); + minX = 0; + minY = 0; + maxY = 1; + minZ = 0; + maxZ = 1; + hasWall = true; + } + if ((facings & VINE_EAST) != 0) { - minX = Math::_min(minX, 1 - thickness); - maxX = 1; - minY = 0; - maxY = 1; - minZ = 0; - maxZ = 1; - hasWall = true; - } - if ((facings & VINE_NORTH) != 0) + minX = Math::_min(minX, 1 - thickness); + maxX = 1; + minY = 0; + maxY = 1; + minZ = 0; + maxZ = 1; + hasWall = true; + } + if ((facings & VINE_NORTH) != 0) { - maxZ = Math::_max(maxZ, thickness); - minZ = 0; - minX = 0; - maxX = 1; - minY = 0; - maxY = 1; - hasWall = true; - } - if ((facings & VINE_SOUTH) != 0) + maxZ = Math::_max(maxZ, thickness); + minZ = 0; + minX = 0; + maxX = 1; + minY = 0; + maxY = 1; + hasWall = true; + } + if ((facings & VINE_SOUTH) != 0) { - minZ = Math::_min(minZ, 1 - thickness); - maxZ = 1; - minX = 0; - maxX = 1; - minY = 0; - maxY = 1; - hasWall = true; - } - if (!hasWall && isAcceptableNeighbor(level->getTile(x, y + 1, z))) + minZ = Math::_min(minZ, 1 - thickness); + maxZ = 1; + minX = 0; + maxX = 1; + minY = 0; + maxY = 1; + hasWall = true; + } + if (!hasWall && isAcceptableNeighbor(level->getTile(x, y + 1, z))) { - minY = Math::_min(minY, 1 - thickness); - maxY = 1; - minX = 0; - maxX = 1; - minZ = 0; - maxZ = 1; - } - setShape(minX, minY, minZ, maxX, maxY, maxZ); + minY = Math::_min(minY, 1 - thickness); + maxY = 1; + minX = 0; + maxX = 1; + minZ = 0; + maxZ = 1; + } + setShape(minX, minY, minZ, maxX, maxY, maxZ); } @@ -107,69 +107,69 @@ AABB *VineTile::getAABB(Level *level, int x, int y, int z) bool VineTile::mayPlace(Level *level, int x, int y, int z, int face) { - switch (face) + switch (face) { - default: - return false; - case Facing::UP: - return isAcceptableNeighbor(level->getTile(x, y + 1, z)); - case Facing::NORTH: - return isAcceptableNeighbor(level->getTile(x, y, z + 1)); - case Facing::SOUTH: - return isAcceptableNeighbor(level->getTile(x, y, z - 1)); - case Facing::EAST: - return isAcceptableNeighbor(level->getTile(x - 1, y, z)); - case Facing::WEST: - return isAcceptableNeighbor(level->getTile(x + 1, y, z)); - } + default: + return false; + case Facing::UP: + return isAcceptableNeighbor(level->getTile(x, y + 1, z)); + case Facing::NORTH: + return isAcceptableNeighbor(level->getTile(x, y, z + 1)); + case Facing::SOUTH: + return isAcceptableNeighbor(level->getTile(x, y, z - 1)); + case Facing::EAST: + return isAcceptableNeighbor(level->getTile(x - 1, y, z)); + case Facing::WEST: + return isAcceptableNeighbor(level->getTile(x + 1, y, z)); + } } bool VineTile::isAcceptableNeighbor(int id) { - if (id == 0) return false; - Tile *tile = Tile::tiles[id]; - if (tile->isCubeShaped() && tile->material->blocksMotion()) return true; - return false; + if (id == 0) return false; + Tile *tile = Tile::tiles[id]; + if (tile->isCubeShaped() && tile->material->blocksMotion()) return true; + return false; } bool VineTile::updateSurvival(Level *level, int x, int y, int z) { - int facings = level->getData(x, y, z); - int newFacings = facings; + int facings = level->getData(x, y, z); + int newFacings = facings; - if (newFacings > 0) + if (newFacings > 0) { - for (int d = 0; d <= 3; d++) + for (int d = 0; d <= 3; d++) { - int facing = 1 << d; - if ((facings & facing) != 0) + int facing = 1 << d; + if ((facings & facing) != 0) { - if (!isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[d], y, z + Direction::STEP_Z[d]))) + if (!isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[d], y, z + Direction::STEP_Z[d]))) { - // no attachment in this direction, - // verify that there is vines hanging above - if (level->getTile(x, y + 1, z) != id || (level->getData(x, y + 1, z) & facing) == 0) + // no attachment in this direction, + // verify that there is vines hanging above + if (level->getTile(x, y + 1, z) != id || (level->getData(x, y + 1, z) & facing) == 0) { - newFacings &= ~facing; - } - } - } - } - } - - if (newFacings == 0) + newFacings &= ~facing; + } + } + } + } + } + + if (newFacings == 0) { - // the block will die unless it has a roof - if (!isAcceptableNeighbor(level->getTile(x, y + 1, z))) + // the block will die unless it has a roof + if (!isAcceptableNeighbor(level->getTile(x, y + 1, z))) { - return false; - } - } - if (newFacings != facings) + return false; + } + } + if (newFacings != facings) { - level->setData(x, y, z, newFacings); - } - return true; + level->setData(x, y, z, newFacings, Tile::UPDATE_CLIENTS); + } + return true; } @@ -195,18 +195,18 @@ int VineTile::getColor(LevelSource *level, int x, int y, int z) void VineTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (!level->isClientSide && !updateSurvival(level, x, y, z)) + if (!level->isClientSide && !updateSurvival(level, x, y, z)) { - spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - } + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + } } void VineTile::tick(Level *level, int x, int y, int z, Random *random) { - if (!level->isClientSide) + if (!level->isClientSide) { - if (level->random->nextInt(4) == 0) + if (level->random->nextInt(4) == 0) { // 4J - Brought side spread check forward from 1.2.3 int r = 4; @@ -226,110 +226,111 @@ void VineTile::tick(Level *level, int x, int y, int z, Random *random) testLoop: if(noSideSpread) break; } - int currentFacings = level->getData(x, y, z); - int testFacing = level->random->nextInt(6); - int testDirection = Direction::FACING_DIRECTION[testFacing]; + int currentFacings = level->getData(x, y, z); + int testFacing = level->random->nextInt(6); + int testDirection = Direction::FACING_DIRECTION[testFacing]; if (testFacing == Facing::UP && y < (Level::maxBuildHeight - 1) && level->isEmptyTile(x, y + 1, z)) { // 4J - Brought side spread check forward from 1.2.3 if (noSideSpread) return; - // grow upwards, but only if there is something to cling to - int spawnFacings = level->random->nextInt(16) & currentFacings; - if (spawnFacings > 0) + // grow upwards, but only if there is something to cling to + int spawnFacings = level->random->nextInt(16) & currentFacings; + if (spawnFacings > 0) { - for (int d = 0; d <= 3; d++) + for (int d = 0; d <= 3; d++) { - if (!isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[d], y + 1, z + Direction::STEP_Z[d]))) + if (!isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[d], y + 1, z + Direction::STEP_Z[d]))) { - spawnFacings &= ~(1 << d); - } - } - if (spawnFacings > 0) + spawnFacings &= ~(1 << d); + } + } + if (spawnFacings > 0) { - level->setTileAndData(x, y + 1, z, id, spawnFacings); - } - } - } + level->setTileAndData(x, y + 1, z, id, spawnFacings, Tile::UPDATE_CLIENTS); + } + } + } else if (testFacing >= Facing::NORTH && testFacing <= Facing::EAST && (currentFacings & (1 << testDirection)) == 0) { // 4J - Brought side spread check forward from 1.2.3 if (noSideSpread) return; - int edgeTile = level->getTile(x + Direction::STEP_X[testDirection], y, z + Direction::STEP_Z[testDirection]); + int edgeTile = level->getTile(x + Direction::STEP_X[testDirection], y, z + Direction::STEP_Z[testDirection]); - if (edgeTile == 0 || Tile::tiles[edgeTile] == NULL) + if (edgeTile == 0 || Tile::tiles[edgeTile] == NULL) { - // if the edge tile is air, we could possibly cling - // to something - int left = (testDirection + 1) & 3; - int right = (testDirection + 3) & 3; - - // attempt to grow straight onto solid tiles - if ((currentFacings & (1 << left)) != 0 - && isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[testDirection] + Direction::STEP_X[left], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[left]))) + // if the edge tile is air, we could possibly cling + // to something + int left = (testDirection + 1) & 3; + int right = (testDirection + 3) & 3; + + // attempt to grow straight onto solid tiles + if ((currentFacings & (1 << left)) != 0 + && isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[testDirection] + Direction::STEP_X[left], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[left]))) { - level->setTileAndData(x + Direction::STEP_X[testDirection], y, z + Direction::STEP_Z[testDirection], id, 1 << left); - } + level->setTileAndData(x + Direction::STEP_X[testDirection], y, z + Direction::STEP_Z[testDirection], id, 1 << left, Tile::UPDATE_CLIENTS); + } else if ((currentFacings & (1 << right)) != 0 - && isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[testDirection] + Direction::STEP_X[right], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[right]))) + && isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[testDirection] + Direction::STEP_X[right], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[right]))) { - level->setTileAndData(x + Direction::STEP_X[testDirection], y, z + Direction::STEP_Z[testDirection], id, 1 << right); - } - // attempt to grow around corners, but only if the - // base tile is solid - else if ((currentFacings & (1 << left)) != 0 - && level->isEmptyTile(x + Direction::STEP_X[testDirection] + Direction::STEP_X[left], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[left]) - && isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[left], y, z + Direction::STEP_Z[left]))) + level->setTileAndData(x + Direction::STEP_X[testDirection], y, z + Direction::STEP_Z[testDirection], id, 1 << right, Tile::UPDATE_CLIENTS); + } + // attempt to grow around corners, but only if the + // base tile is solid + else if ((currentFacings & (1 << left)) != 0 + && level->isEmptyTile(x + Direction::STEP_X[testDirection] + Direction::STEP_X[left], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[left]) + && isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[left], y, z + Direction::STEP_Z[left]))) { - level->setTileAndData(x + Direction::STEP_X[testDirection] + Direction::STEP_X[left], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[left], id, - 1 << ((testDirection + 2) & 3)); - } + level->setTileAndData(x + Direction::STEP_X[testDirection] + Direction::STEP_X[left], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[left], id, + 1 << ((testDirection + 2) & 3), Tile::UPDATE_CLIENTS); + } else if ((currentFacings & (1 << right)) != 0 - && level->isEmptyTile(x + Direction::STEP_X[testDirection] + Direction::STEP_X[right], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[right]) - && isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[right], y, z + Direction::STEP_Z[right]))) + && level->isEmptyTile(x + Direction::STEP_X[testDirection] + Direction::STEP_X[right], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[right]) + && isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[right], y, z + Direction::STEP_Z[right]))) { - level->setTileAndData(x + Direction::STEP_X[testDirection] + Direction::STEP_X[right], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[right], id, - 1 << ((testDirection + 2) & 3)); - } - // attempt to grow onto the ceiling - else if (isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[testDirection], y + 1, z + Direction::STEP_Z[testDirection]))) + level->setTileAndData(x + Direction::STEP_X[testDirection] + Direction::STEP_X[right], y, z + Direction::STEP_Z[testDirection] + Direction::STEP_Z[right], id, + 1 << ((testDirection + 2) & 3), Tile::UPDATE_CLIENTS); + } + // attempt to grow onto the ceiling + else if (isAcceptableNeighbor(level->getTile(x + Direction::STEP_X[testDirection], y + 1, z + Direction::STEP_Z[testDirection]))) { - level->setTileAndData(x + Direction::STEP_X[testDirection], y, z + Direction::STEP_Z[testDirection], id, 0); - } + level->setTileAndData(x + Direction::STEP_X[testDirection], y, z + Direction::STEP_Z[testDirection], id, 0, Tile::UPDATE_CLIENTS); + } - } + } else if (Tile::tiles[edgeTile]->material->isSolidBlocking() && Tile::tiles[edgeTile]->isCubeShaped()) { - // we have a wall that we can cling to - level->setData(x, y, z, currentFacings | (1 << testDirection)); - } - } - // growing downwards happens more often than the other - // directions - else if (y > 1) + // we have a wall that we can cling to + level->setData(x, y, z, currentFacings | (1 << testDirection), Tile::UPDATE_CLIENTS); + } + } + // growing downwards happens more often than the other + // directions + else if (y > 1) { - int belowTile = level->getTile(x, y - 1, z); - // grow downwards into air - if (belowTile == 0) + int belowTile = level->getTile(x, y - 1, z); + // grow downwards into air + if (belowTile == 0) { - int spawnFacings = level->random->nextInt(16) & currentFacings; - if (spawnFacings > 0) + int spawnFacings = level->random->nextInt(16) & currentFacings; + if (spawnFacings > 0) { - level->setTileAndData(x, y - 1, z, id, spawnFacings); - } - } + level->setTileAndData(x, y - 1, z, id, spawnFacings, Tile::UPDATE_CLIENTS); + } + } else if (belowTile == id) { - int spawnFacings = level->random->nextInt(16) & currentFacings; - int belowData = level->getData(x, y - 1, z); - if (belowData != (belowData | spawnFacings)) { - level->setData(x, y - 1, z, belowData | spawnFacings); - } - } - } - } + int spawnFacings = level->random->nextInt(16) & currentFacings; + int belowData = level->getData(x, y - 1, z); + if (belowData != (belowData | spawnFacings)) + { + level->setData(x, y - 1, z, belowData | spawnFacings, Tile::UPDATE_CLIENTS); + } + } + } + } } } @@ -377,11 +378,11 @@ void VineTile::playerDestroy(Level *level, shared_ptrplayer, int x, int GenericStats::param_blocksMined(id,data,1) ); - // drop leaf block instead of sapling - popResource(level, x, y, z, shared_ptr(new ItemInstance(Tile::vine, 1, 0))); - } + // drop leaf block instead of sapling + popResource(level, x, y, z, shared_ptr(new ItemInstance(Tile::vine, 1, 0))); + } else { - Tile::playerDestroy(level, player, x, y, z, data); - } + Tile::playerDestroy(level, player, x, y, z, data); + } } diff --git a/Minecraft.World/VinesFeature.cpp b/Minecraft.World/VinesFeature.cpp index 314b978e..1f2dacf4 100644 --- a/Minecraft.World/VinesFeature.cpp +++ b/Minecraft.World/VinesFeature.cpp @@ -22,7 +22,7 @@ bool VinesFeature::place(Level *level, Random *random, int x, int y, int z) { if (Tile::vine->mayPlace(level, x, y, z, face)) { - level->setTileAndDataNoUpdate(x, y, z, Tile::vine_Id, 1 << Direction::FACING_DIRECTION[Facing::OPPOSITE_FACING[face]]); + level->setTileAndData(x, y, z, Tile::vine_Id, 1 << Direction::FACING_DIRECTION[Facing::OPPOSITE_FACING[face]], Tile::UPDATE_CLIENTS); break; } } diff --git a/Minecraft.World/WallTile.cpp b/Minecraft.World/WallTile.cpp index 6275eef7..a95360ce 100644 --- a/Minecraft.World/WallTile.cpp +++ b/Minecraft.World/WallTile.cpp @@ -26,9 +26,9 @@ Icon *WallTile::getTexture(int face, int data) { if (data == TYPE_MOSSY) { - return Tile::mossStone->getTexture(face); + return Tile::mossyCobblestone->getTexture(face); } - return Tile::stoneBrick->getTexture(face); + return Tile::cobblestone->getTexture(face); } int WallTile::getRenderShape() diff --git a/Minecraft.World/WaterAnimal.cpp b/Minecraft.World/WaterAnimal.cpp index 0a7313d1..fe94b628 100644 --- a/Minecraft.World/WaterAnimal.cpp +++ b/Minecraft.World/WaterAnimal.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.damagesource.h" #include "WaterAnimal.h" @@ -39,4 +40,25 @@ bool WaterAnimal::removeWhenFarAway() int WaterAnimal::getExperienceReward(shared_ptr killedBy) { return 1 + level->random->nextInt(3); +} + +void WaterAnimal::baseTick() +{ + int airSupply = getAirSupply(); + + PathfinderMob::baseTick(); // this modified the airsupply + + if (isAlive() && !isInWater()) + { + setAirSupply(--airSupply); + if (getAirSupply() == -20) + { + setAirSupply(0); + hurt(DamageSource::drown, 2); + } + } + else + { + setAirSupply(TOTAL_AIR_SUPPLY); + } } \ No newline at end of file diff --git a/Minecraft.World/WaterAnimal.h b/Minecraft.World/WaterAnimal.h index 23b984f5..1da551c5 100644 --- a/Minecraft.World/WaterAnimal.h +++ b/Minecraft.World/WaterAnimal.h @@ -15,4 +15,7 @@ public: protected: virtual bool removeWhenFarAway(); virtual int getExperienceReward(shared_ptr killedBy); + +public: + virtual void baseTick(); }; diff --git a/Minecraft.World/WaterLevelChunk.cpp b/Minecraft.World/WaterLevelChunk.cpp index b6dbd05d..7727898b 100644 --- a/Minecraft.World/WaterLevelChunk.cpp +++ b/Minecraft.World/WaterLevelChunk.cpp @@ -94,6 +94,11 @@ void WaterLevelChunk::unload(bool unloadTileEntities) // 4J - added parameter { } +bool WaterLevelChunk::containsPlayer() +{ + return false; +} + void WaterLevelChunk::markUnsaved() { } diff --git a/Minecraft.World/WaterLevelChunk.h b/Minecraft.World/WaterLevelChunk.h index 18dc8a05..d2753cfa 100644 --- a/Minecraft.World/WaterLevelChunk.h +++ b/Minecraft.World/WaterLevelChunk.h @@ -31,6 +31,7 @@ public: void removeTileEntity(int x, int y, int z); void load(); void unload(bool unloadTileEntities) ; // 4J - added parameter + bool containsPlayer(); // 4J added void markUnsaved(); void getEntities(shared_ptr except, AABB bb, vector > &es); void getEntitiesOfClass(const type_info& ec, AABB bb, vector > &es); diff --git a/Minecraft.World/WaterLilyTile.cpp b/Minecraft.World/WaterLilyTile.cpp index 91203922..15e43b9d 100644 --- a/Minecraft.World/WaterLilyTile.cpp +++ b/Minecraft.World/WaterLilyTile.cpp @@ -7,25 +7,25 @@ WaterlilyTile::WaterlilyTile(int id) : Bush(id) { - this->updateDefaultShape(); + this->updateDefaultShape(); } // 4J Added override void WaterlilyTile::updateDefaultShape() { - float ss = 0.5f; - float hh = 0.25f / 16.0f; - this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, hh, 0.5f + ss); + float ss = 0.5f; + float hh = 0.25f / 16.0f; + setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, hh, 0.5f + ss); } int WaterlilyTile::getRenderShape() { - return Tile::SHAPE_LILYPAD; + return Tile::SHAPE_LILYPAD; } void WaterlilyTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { - if (source == NULL || !(dynamic_pointer_cast(source))) + if (source == NULL || !source->instanceof(eTYPE_BOAT)) { Bush::addAABBs(level, x, y, z, box, boxes, source); } @@ -67,7 +67,7 @@ bool WaterlilyTile::mayPlaceOn(int tile) bool WaterlilyTile::canSurvive(Level *level, int x, int y, int z) { if (y < 0 || y >= Level::maxBuildHeight) return false; - return level->getMaterial(x, y - 1, z) == Material::water && level->getData(x, y - 1, z) == 0; + return level->getMaterial(x, y - 1, z) == Material::water && level->getData(x, y - 1, z) == 0; } bool WaterlilyTile::growTree(Level *level, int x, int y, int z, Random *random) diff --git a/Minecraft.World/WaterLilyTileItem.cpp b/Minecraft.World/WaterLilyTileItem.cpp index 13814e5c..fe523c05 100644 --- a/Minecraft.World/WaterLilyTileItem.cpp +++ b/Minecraft.World/WaterLilyTileItem.cpp @@ -10,7 +10,7 @@ WaterLilyTileItem::WaterLilyTileItem(int id) : ColoredTileItem(id, false) { } -bool WaterLilyTileItem::TestUse(Level *level, shared_ptr player) +bool WaterLilyTileItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { HitResult *hr = getPlayerPOVHitResult(level, player, true); if (hr == NULL) return false; @@ -20,13 +20,18 @@ bool WaterLilyTileItem::TestUse(Level *level, shared_ptr player) int xt = hr->x; int yt = hr->y; int zt = hr->z; - delete hr; if (!level->mayInteract(player, xt, yt, zt, 0)) { + delete hr; return false; } - if (!player->mayBuild(xt, yt, zt)) return false; - + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) + { + delete hr; + return false; + } + + delete hr; if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0 && level->isEmptyTile(xt, yt + 1, zt)) { return true; @@ -49,16 +54,21 @@ shared_ptr WaterLilyTileItem::use(shared_ptr itemIns int xt = hr->x; int yt = hr->y; int zt = hr->z; - delete hr; if (!level->mayInteract(player, xt, yt, zt, 0)) { + delete hr; return itemInstance; } - if (!player->mayBuild(xt, yt, zt)) return itemInstance; - + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) + { + delete hr; + return itemInstance; + } + + delete hr; if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0 && level->isEmptyTile(xt, yt + 1, zt)) { - level->setTile(xt, yt + 1, zt, Tile::waterLily->id); + level->setTileAndUpdate(xt, yt + 1, zt, Tile::waterLily->id); if (!player->abilities.instabuild) { itemInstance->count--; diff --git a/Minecraft.World/WaterLilyTileItem.h b/Minecraft.World/WaterLilyTileItem.h index c0c5db99..c107578f 100644 --- a/Minecraft.World/WaterLilyTileItem.h +++ b/Minecraft.World/WaterLilyTileItem.h @@ -9,6 +9,6 @@ public: WaterLilyTileItem(int id); virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); virtual int getColor(int data, int spriteLayer); }; diff --git a/Minecraft.World/WaterlilyFeature.cpp b/Minecraft.World/WaterlilyFeature.cpp index c47a667c..eccfcaf6 100644 --- a/Minecraft.World/WaterlilyFeature.cpp +++ b/Minecraft.World/WaterlilyFeature.cpp @@ -5,19 +5,19 @@ bool WaterlilyFeature::place(Level *level, Random *random, int x, int y, int z) { - for (int i = 0; i < 10; i++) + for (int i = 0; i < 10; i++) { - int x2 = x + random->nextInt(8) - random->nextInt(8); - int y2 = y + random->nextInt(4) - random->nextInt(4); - int z2 = z + random->nextInt(8) - random->nextInt(8); - if (level->isEmptyTile(x2, y2, z2)) + int x2 = x + random->nextInt(8) - random->nextInt(8); + int y2 = y + random->nextInt(4) - random->nextInt(4); + int z2 = z + random->nextInt(8) - random->nextInt(8); + if (level->isEmptyTile(x2, y2, z2)) { - if (Tile::waterLily->mayPlace(level, x2, y2, z2)) + if (Tile::waterLily->mayPlace(level, x2, y2, z2)) { - level->setTileNoUpdate(x2, y2, z2, Tile::waterLily_Id); - } - } - } + level->setTileAndData(x2, y2, z2, Tile::waterLily_Id, 0, Tile::UPDATE_CLIENTS); + } + } + } - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/WeaponItem.cpp b/Minecraft.World/WeaponItem.cpp index 82b16bde..67b887af 100644 --- a/Minecraft.World/WeaponItem.cpp +++ b/Minecraft.World/WeaponItem.cpp @@ -1,49 +1,58 @@ #include "stdafx.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.level.tile.h" #include "WeaponItem.h" WeaponItem::WeaponItem(int id, const Tier *tier) : Item(id), tier( tier ) { - maxStackSize = 1; - setMaxDamage(tier->getUses()); + maxStackSize = 1; + setMaxDamage(tier->getUses()); - damage = 4 + tier->getAttackDamageBonus(); + damage = 4 + tier->getAttackDamageBonus(); } -float WeaponItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) +float WeaponItem::getTierDamage() { - if (tile->id == Tile::web_Id) - { - // swords can quickly cut web - return 15; - } - return 1.5f; + return tier->getAttackDamageBonus(); } -bool WeaponItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) +float WeaponItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { - itemInstance->hurt(1, attacker); - return true; + if (tile->id == Tile::web_Id) + { + // swords can quickly cut web + return 15; + } + // this change modifies which tiles the swords can destroy in creative + // mode (>1 == yes) + Material *material = tile->material; + if (material == Material::plant || material == Material::replaceable_plant || material == Material::coral || material == Material::leaves || material == Material::vegetable) + { + return 1.5f; + } + return 1.0f; } -bool WeaponItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) +bool WeaponItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { - // Don't damage weapons if the tile can be destroyed in one hit. - if (Tile::tiles[tile]->getDestroySpeed(level, x, y, z) != 0.0) itemInstance->hurt(2, owner); + itemInstance->hurtAndBreak(1, attacker); return true; } -int WeaponItem::getAttackDamage(shared_ptr entity) +bool WeaponItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { - return damage; + // Don't damage weapons if the tile can be destroyed in one hit. + if (Tile::tiles[tile]->getDestroySpeed(level, x, y, z) != 0.0) itemInstance->hurtAndBreak(2, owner); + return true; } bool WeaponItem::isHandEquipped() { - return true; + return true; } UseAnim WeaponItem::getUseAnimation(shared_ptr itemInstance) @@ -64,7 +73,7 @@ shared_ptr WeaponItem::use(shared_ptr instance, Leve bool WeaponItem::canDestroySpecial(Tile *tile) { - return tile->id == Tile::web_Id; + return tile->id == Tile::web_Id; } int WeaponItem::getEnchantmentValue() @@ -84,4 +93,13 @@ bool WeaponItem::isValidRepairItem(shared_ptr source, shared_ptrinsert(attrAttrModMap::value_type( SharedMonsterAttributes::ATTACK_DAMAGE->getId(), new AttributeModifier(eModifierId_ITEM_BASEDAMAGE, damage, AttributeModifier::OPERATION_ADDITION) ) ); + + return result; } \ No newline at end of file diff --git a/Minecraft.World/WeaponItem.h b/Minecraft.World/WeaponItem.h index 2150f6e9..54cb2f2d 100644 --- a/Minecraft.World/WeaponItem.h +++ b/Minecraft.World/WeaponItem.h @@ -6,16 +6,15 @@ using namespace std; class WeaponItem : public Item { private: - int damage; + float damage; const Tier *tier; public: WeaponItem(int id, const Tier *tier); - + virtual float getTierDamage(); virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); - virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); - virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); - virtual int getAttackDamage(shared_ptr entity); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); virtual bool isHandEquipped(); virtual UseAnim getUseAnimation(shared_ptr itemInstance); virtual int getUseDuration(shared_ptr itemInstance); @@ -25,4 +24,5 @@ public: const Tier *getTier(); bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); + attrAttrModMap *getDefaultAttributeModifiers(); }; \ No newline at end of file diff --git a/Minecraft.World/WeaponRecipies.cpp b/Minecraft.World/WeaponRecipies.cpp index e90ebea6..1dbe6bda 100644 --- a/Minecraft.World/WeaponRecipies.cpp +++ b/Minecraft.World/WeaponRecipies.cpp @@ -13,20 +13,13 @@ wstring WeaponRecipies::shapes[][4] = L"X",// L"#",L""},// }; - -/* - private Object[][] map = { - {Tile.wood, Tile.stoneBrick, Item.ironIngot, Item.diamond, Item.goldIngot}, - {Item.sword_wood, Item.sword_stone, Item.sword_iron, Item.sword_diamond, Item.sword_gold}, - }; -*/ void WeaponRecipies::_init() { map = new vector [MAX_WEAPON_RECIPES]; ADD_OBJECT(map[0],Tile::wood); - ADD_OBJECT(map[0],Tile::stoneBrick); + ADD_OBJECT(map[0],Tile::cobblestone); ADD_OBJECT(map[0],Item::ironIngot); ADD_OBJECT(map[0],Item::diamond); ADD_OBJECT(map[0],Item::goldIngot); diff --git a/Minecraft.World/WeatherCommand.h b/Minecraft.World/WeatherCommand.h new file mode 100644 index 00000000..795b7bdf --- /dev/null +++ b/Minecraft.World/WeatherCommand.h @@ -0,0 +1,73 @@ +/* +package net.minecraft.commands.common; + +import java.util.*; + +import net.minecraft.SharedConstants; +import net.minecraft.commands.*; +import net.minecraft.commands.exceptions.UsageException; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.LevelData; + +public class WeatherCommand extends BaseCommand { + @Override + public String getName() { + return "weather"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + @Override + public String getUsage(CommandSender source) { + return "commands.weather.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + if (args.length < 1 || args.length > 2) { + throw new UsageException("commands.weather.usage"); + } + + int duration = (300 + new Random().nextInt(600)) * SharedConstants.TICKS_PER_SECOND; + if (args.length >= 2) { + duration = convertArgToInt(source, args[1], 1, 1000000) * SharedConstants.TICKS_PER_SECOND; + } + + Level level = MinecraftServer.getInstance().levels[0]; + LevelData levelData = level.getLevelData(); + levelData.setRainTime(duration); + levelData.setThunderTime(duration); + + if ("clear".equalsIgnoreCase(args[0])) { + levelData.setRaining(false); + levelData.setThundering(false); + logAdminAction(source, "commands.weather.clear"); + } else if ("rain".equalsIgnoreCase(args[0])) { + levelData.setRaining(true); + levelData.setThundering(false); + logAdminAction(source, "commands.weather.rain"); + } else if ("thunder".equalsIgnoreCase(args[0])) { + levelData.setRaining(true); + levelData.setThundering(true); + logAdminAction(source, "commands.weather.thunder"); + } else { + throw new UsageException("commands.weather.usage"); + } + } + + @Override + public List matchArguments(CommandSender source, String[] args) { + if (args.length == 1) { + return matchArguments(args, "clear", "rain", "thunder"); + } + + return null; + } + +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/WeighedTreasure.cpp b/Minecraft.World/WeighedTreasure.cpp index d7044644..ec4280e4 100644 --- a/Minecraft.World/WeighedTreasure.cpp +++ b/Minecraft.World/WeighedTreasure.cpp @@ -18,7 +18,7 @@ WeighedTreasure::WeighedTreasure(shared_ptr item, int minCount, in this->maxCount = maxCount; } -void WeighedTreasure::addChestItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls) +void WeighedTreasure::addChestItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls) { for (int r = 0; r < numRolls; r++) { diff --git a/Minecraft.World/WeighedTreasure.h b/Minecraft.World/WeighedTreasure.h index a37bc6ae..c97def3d 100644 --- a/Minecraft.World/WeighedTreasure.h +++ b/Minecraft.World/WeighedTreasure.h @@ -13,7 +13,7 @@ public: WeighedTreasure(int itemId, int auxValue, int minCount, int maxCount, int weight); WeighedTreasure(shared_ptr item, int minCount, int maxCount, int weight); - static void addChestItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls); + static void addChestItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls); static void addDispenserItems(Random *random, WeighedTreasureArray items, shared_ptr dest, int numRolls); static WeighedTreasureArray addToTreasure(WeighedTreasureArray items, WeighedTreasure *extra); }; \ No newline at end of file diff --git a/Minecraft.World/WeightedPressurePlateTile.cpp b/Minecraft.World/WeightedPressurePlateTile.cpp new file mode 100644 index 00000000..352747ce --- /dev/null +++ b/Minecraft.World/WeightedPressurePlateTile.cpp @@ -0,0 +1,46 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.item.h" +#include "Entity.h" +#include "WeightedPressurePlateTile.h" + +WeightedPressurePlateTile::WeightedPressurePlateTile(int id, const wstring &tex, Material *material, int maxWeight) : BasePressurePlateTile(id, tex, material) +{ + this->maxWeight = maxWeight; + + // 4J Stu - Move this from base class to use virtual function + updateShape(getDataForSignal(Redstone::SIGNAL_MAX)); +} + +int WeightedPressurePlateTile::getSignalStrength(Level *level, int x, int y, int z) +{ + int weightOfEntities = level->getEntitiesOfClass(typeid(Entity), getSensitiveAABB(x, y, z))->size(); + int count = min(weightOfEntities, maxWeight); + + if (count <= 0) + { + return 0; + } + else + { + float pct = min(maxWeight, count) / (float) maxWeight; + return Mth::ceil(pct * Redstone::SIGNAL_MAX); + } +} + +int WeightedPressurePlateTile::getSignalForData(int data) +{ + return data; +} + +int WeightedPressurePlateTile::getDataForSignal(int signal) +{ + return signal; +} + +int WeightedPressurePlateTile::getTickDelay(Level *level) +{ + return SharedConstants::TICKS_PER_SECOND / 2; +} \ No newline at end of file diff --git a/Minecraft.World/WeightedPressurePlateTile.h b/Minecraft.World/WeightedPressurePlateTile.h new file mode 100644 index 00000000..797d7e22 --- /dev/null +++ b/Minecraft.World/WeightedPressurePlateTile.h @@ -0,0 +1,18 @@ +#pragma once + +#include "BasePressurePlateTile.h" + +class WeightedPressurePlateTile : public BasePressurePlateTile +{ +private: + int maxWeight; + +public: + WeightedPressurePlateTile(int id, const wstring &tex, Material *material, int maxWeight); + +protected: + virtual int getSignalStrength(Level *level, int x, int y, int z); + virtual int getSignalForData(int data); + virtual int getDataForSignal(int signal); + virtual int getTickDelay(Level *level); +}; \ No newline at end of file diff --git a/Minecraft.World/Witch.cpp b/Minecraft.World/Witch.cpp new file mode 100644 index 00000000..c73e9198 --- /dev/null +++ b/Minecraft.World/Witch.cpp @@ -0,0 +1,224 @@ +#include "stdafx.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.ai.goal.target.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.entity.projectile.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.item.alchemy.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.phys.h" +#include "Witch.h" + +AttributeModifier *Witch::SPEED_MODIFIER_DRINKING = (new AttributeModifier(eModifierId_MOB_WITCH_DRINKSPEED, -0.25f, AttributeModifier::OPERATION_ADDITION))->setSerialize(false); + +const int Witch::DEATH_LOOT[Witch::DEATH_LOOT_COUNT] = { + Item::yellowDust_Id, Item::sugar_Id, Item::redStone_Id, Item::spiderEye_Id, Item::glassBottle_Id, Item::gunpowder_Id, Item::stick_Id, Item::stick_Id, +}; + +Witch::Witch(Level *level) : Monster(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); + + usingTime = 0; + + goalSelector.addGoal(1, new FloatGoal(this)); + goalSelector.addGoal(2, new RangedAttackGoal(this, this, 1.0, SharedConstants::TICKS_PER_SECOND * 3, 10)); + goalSelector.addGoal(2, new RandomStrollGoal(this, 1.0)); + goalSelector.addGoal(3, new LookAtPlayerGoal(this, typeid(Player), 8)); + goalSelector.addGoal(3, new RandomLookAroundGoal(this)); + + targetSelector.addGoal(1, new HurtByTargetGoal(this, false)); + targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, typeid(Player), 0, true)); +} + +void Witch::defineSynchedData() +{ + Monster::defineSynchedData(); + + getEntityData()->define(DATA_USING_ITEM, (byte) 0); +} + +int Witch::getAmbientSound() +{ + return eSoundType_MOB_WITCH_IDLE; //"mob.witch.idle"; +} + +int Witch::getHurtSound() +{ + return eSoundType_MOB_WITCH_HURT; //"mob.witch.hurt"; +} + +int Witch::getDeathSound() +{ + return eSoundType_MOB_WITCH_DEATH; //"mob.witch.death"; +} + +void Witch::setUsingItem(bool isUsing) +{ + getEntityData()->set(DATA_USING_ITEM, isUsing ? (byte) 1 : (byte) 0); +} + +bool Witch::isUsingItem() +{ + return getEntityData()->getByte(DATA_USING_ITEM) == 1; +} + +void Witch::registerAttributes() +{ + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(26); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); +} + +bool Witch::useNewAi() +{ + return true; +} + +void Witch::aiStep() +{ + if (!level->isClientSide) + { + if (isUsingItem()) + { + if (usingTime-- <= 0) + { + setUsingItem(false); + shared_ptr item = getCarriedItem(); + setEquippedSlot(SLOT_WEAPON, nullptr); + + if (item != NULL && item->id == Item::potion_Id) + { + vector *effects = Item::potion->getMobEffects(item); + if (effects != NULL) + { + for(AUTO_VAR(it, effects->begin()); it != effects->end(); ++it) + { + addEffect(new MobEffectInstance(*it)); + } + } + delete effects; + } + + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->removeModifier(SPEED_MODIFIER_DRINKING); + } + } + else + { + int potion = -1; + + if (random->nextFloat() < 0.15f && isOnFire() && !hasEffect(MobEffect::fireResistance)) + { + potion = PotionBrewing::POTION_ID_FIRE_RESISTANCE; + } + else if (random->nextFloat() < 0.05f && getHealth() < getMaxHealth()) + { + potion = PotionBrewing::POTION_ID_HEAL; + } + else if (random->nextFloat() < 0.25f && getTarget() != NULL && !hasEffect(MobEffect::movementSpeed) && getTarget()->distanceToSqr(shared_from_this()) > 11 * 11) + { + potion = PotionBrewing::POTION_ID_SWIFTNESS; + } + else if (random->nextFloat() < 0.25f && getTarget() != NULL && !hasEffect(MobEffect::movementSpeed) && getTarget()->distanceToSqr(shared_from_this()) > 11 * 11) + { + potion = PotionBrewing::POTION_ID_SWIFTNESS; + } + + if (potion > -1) + { + setEquippedSlot(SLOT_WEAPON, shared_ptr( new ItemInstance(Item::potion, 1, potion)) ); + usingTime = getCarriedItem()->getUseDuration(); + setUsingItem(true); + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + speed->removeModifier(SPEED_MODIFIER_DRINKING); + speed->addModifier(new AttributeModifier(*SPEED_MODIFIER_DRINKING)); + } + } + + if (random->nextFloat() < 0.00075f) + { + level->broadcastEntityEvent(shared_from_this(), EntityEvent::WITCH_HAT_MAGIC); + } + } + + Monster::aiStep(); +} + +void Witch::handleEntityEvent(byte id) +{ + if (id == EntityEvent::WITCH_HAT_MAGIC) + { + for (int i = 0; i < random->nextInt(35) + 10; i++) + { + level->addParticle(eParticleType_witchMagic, x + random->nextGaussian() * .13f, bb->y1 + 0.5f + random->nextGaussian() * .13f, z + random->nextGaussian() * .13f, 0, 0, 0); + } + } + else + { + Monster::handleEntityEvent(id); + } +} + +float Witch::getDamageAfterMagicAbsorb(DamageSource *damageSource, float damage) +{ + damage = Monster::getDamageAfterMagicAbsorb(damageSource, damage); + + if (damageSource->getEntity() == shared_from_this()) damage = 0; + if (damageSource->isMagic()) damage *= 0.15; + + return damage; +} + +void Witch::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) +{ + int passes = random->nextInt(3) + 1; + for (int pass = 0; pass < passes; pass++) + { + int count = random->nextInt(3); + int type = DEATH_LOOT[random->nextInt(DEATH_LOOT_COUNT)]; + if (playerBonusLevel > 0) count += random->nextInt(playerBonusLevel + 1); + + for (int i = 0; i < count; i++) + { + spawnAtLocation(type, 1); + } + } +} + +void Witch::performRangedAttack(shared_ptr target, float power) +{ + if (isUsingItem()) return; + + shared_ptr potion = shared_ptr( new ThrownPotion(level, dynamic_pointer_cast(shared_from_this()), PotionBrewing::POTION_ID_SPLASH_DAMAGE) ); + potion->xRot -= -20; + double xd = (target->x + target->xd) - x; + double yd = (target->y + target->getHeadHeight() - 1.1f) - y; + double zd = (target->z + target->zd) - z; + float dist = Mth::sqrt(xd * xd + zd * zd); + + if (dist >= 8 && !target->hasEffect(MobEffect::movementSlowdown)) + { + potion->setPotionValue(PotionBrewing::POTION_ID_SPLASH_SLOWNESS); + } + else if (target->getHealth() >= 8 && !target->hasEffect(MobEffect::poison)) + { + potion->setPotionValue(PotionBrewing::POTION_ID_SPLASH_POISON); + } + else if (dist <= 3 && !target->hasEffect(MobEffect::weakness) && random->nextFloat() < 0.25f) + { + potion->setPotionValue(PotionBrewing::POTION_ID_SPLASH_WEAKNESS); + } + + potion->shoot(xd, yd + dist * 0.2f, zd, 0.75f, 8); + + level->addEntity(potion); +} \ No newline at end of file diff --git a/Minecraft.World/Witch.h b/Minecraft.World/Witch.h new file mode 100644 index 00000000..256f358f --- /dev/null +++ b/Minecraft.World/Witch.h @@ -0,0 +1,48 @@ +#pragma once + +#include "Monster.h" +#include "RangedAttackMob.h" + +class Witch : public Monster, public RangedAttackMob +{ +public: + eINSTANCEOF GetType() { return eTYPE_WITCH; } + static Entity *create(Level *level) { return new Witch(level); } + +private: + static AttributeModifier *SPEED_MODIFIER_DRINKING; + + static const int DATA_USING_ITEM = 21; + static const int DEATH_LOOT_COUNT = 8; + static const int DEATH_LOOT[DEATH_LOOT_COUNT]; + + int usingTime; + +public: + Witch(Level *level); + +protected: + virtual void defineSynchedData(); + virtual int getAmbientSound(); + virtual int getHurtSound(); + virtual int getDeathSound(); + +public: + virtual void setUsingItem(bool isUsing); + virtual bool isUsingItem(); + +protected: + virtual void registerAttributes(); + +public: + virtual bool useNewAi(); + virtual void aiStep(); + virtual void handleEntityEvent(byte id); + +protected: + virtual float getDamageAfterMagicAbsorb(DamageSource *damageSource, float damage); + virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); + +public: + virtual void performRangedAttack(shared_ptr target, float power); +}; \ No newline at end of file diff --git a/Minecraft.World/WitherBoss.cpp b/Minecraft.World/WitherBoss.cpp new file mode 100644 index 00000000..676f07d9 --- /dev/null +++ b/Minecraft.World/WitherBoss.cpp @@ -0,0 +1,584 @@ +#include "stdafx.h" +#include "net.minecraft.world.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.ai.goal.target.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.entity.projectile.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "Mth.h" + +#include "SoundTypes.h" + +#include "WitherBoss.h" + +bool LivingEntitySelector::matches(shared_ptr entity) const +{ + if ( entity->instanceof(eTYPE_LIVINGENTITY) ) + { + return dynamic_pointer_cast(entity)->getMobType() != UNDEAD; + } + else + { + return false; + } +} + +EntitySelector *WitherBoss::livingEntitySelector = new LivingEntitySelector(); + +WitherBoss::WitherBoss(Level *level) : Monster(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); + + for(unsigned int i = 0; i < 2; ++i) + { + xRotHeads[i] = 0.0f; + yRotHeads[i] = 0.0f; + xRotOHeads[i] = 0.0f; + yRotOHeads[i] = 0.0f; + nextHeadUpdate[i] = 0; + idleHeadUpdates[i] = 0; + } + destroyBlocksTick = 0; + + setSize(.9f, 4); + + // noPhysics = true; + fireImmune = true; + + // noCulling = true; + + getNavigation()->setCanFloat(true); + + goalSelector.addGoal(0, new FloatGoal(this)); + goalSelector.addGoal(2, new RangedAttackGoal(this, this, 1.0, SharedConstants::TICKS_PER_SECOND * 2, 20)); + + goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0)); + goalSelector.addGoal(6, new LookAtPlayerGoal(this, typeid(Player), 8)); + goalSelector.addGoal(7, new RandomLookAroundGoal(this)); + + targetSelector.addGoal(1, new HurtByTargetGoal(this, false)); + targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, typeid(Mob), 0, false, false, livingEntitySelector)); + + xpReward = Enemy::XP_REWARD_BOSS; +} + +void WitherBoss::defineSynchedData() +{ + Monster::defineSynchedData(); + + entityData->define(DATA_TARGET_A, (int)0); + entityData->define(DATA_TARGET_B, (int)0); + entityData->define(DATA_TARGET_C, (int)0); + entityData->define(DATA_ID_INV, (int)0); +} + +void WitherBoss::addAdditonalSaveData(CompoundTag *entityTag) +{ + Monster::addAdditonalSaveData(entityTag); + + entityTag->putInt(L"Invul", getInvulnerableTicks()); +} + +void WitherBoss::readAdditionalSaveData(CompoundTag *tag) +{ + Monster::readAdditionalSaveData(tag); + + setInvulnerableTicks(tag->getInt(L"Invul")); +} + +float WitherBoss::getShadowHeightOffs() +{ + return bbHeight / 8; +} + +int WitherBoss::getAmbientSound() +{ + return eSoundType_MOB_WITHER_IDLE; //"mob.wither.idle"; +} + +int WitherBoss::getHurtSound() +{ + return eSoundType_MOB_WITHER_HURT; //"mob.wither.hurt"; +} + +int WitherBoss::getDeathSound() +{ + return eSoundType_MOB_WITHER_DEATH; //"mob.wither.death"; +} + +void WitherBoss::aiStep() +{ + yd *= 0.6f; + + if (!level->isClientSide && getAlternativeTarget(0) > 0) + { + shared_ptr e = level->getEntity(getAlternativeTarget(0)); + if (e != NULL) + { + if ((y < e->y) || (!isPowered() && y < (e->y + 5))) + { + if (yd < 0) + { + yd = 0; + } + yd += (.5f - yd) * .6f; + } + + double xdist = e->x - x; + double zdist = e->z - z; + double distSqr = xdist * xdist + zdist * zdist; + if (distSqr > 9) + { + double sd = Mth::sqrt(distSqr); + xd += ((xdist / sd) * .5f - xd) * .6f; + zd += ((zdist / sd) * .5f - zd) * .6f; + } + } + } + if ((xd * xd + zd * zd) > .05f) + { + yRot = (float) atan2(zd, xd) * Mth::RADDEG - 90; + } + Monster::aiStep(); + + + for (int i = 0; i < 2; i++) + { + yRotOHeads[i] = yRotHeads[i]; + xRotOHeads[i] = xRotHeads[i]; + } + + for (int i = 0; i < 2; i++) + { + int entityId = getAlternativeTarget(i + 1); + shared_ptr e = nullptr; + if (entityId > 0) + { + e = level->getEntity(entityId); + } + if (e != NULL) + { + double hx = getHeadX(i + 1); + double hy = getHeadY(i + 1); + double hz = getHeadZ(i + 1); + + double xd = e->x - hx; + double yd = e->y + e->getHeadHeight() - hy; + double zd = e->z - hz; + double sd = Mth::sqrt(xd * xd + zd * zd); + + float yRotD = (float) (atan2(zd, xd) * 180 / PI) - 90; + float xRotD = (float) -(atan2(yd, sd) * 180 / PI); + xRotHeads[i] = rotlerp(xRotHeads[i], xRotD, 40); + yRotHeads[i] = rotlerp(yRotHeads[i], yRotD, 10); + + + } + else + { + yRotHeads[i] = rotlerp(yRotHeads[i], yBodyRot, 10); + } + } + bool _isPowered = isPowered(); + for (int i = 0; i < 3; i++) + { + double hx = getHeadX(i); + double hy = getHeadY(i); + double hz = getHeadZ(i); + + level->addParticle(eParticleType_smoke, hx + random->nextGaussian() * .3f, hy + random->nextGaussian() * .3f, hz + random->nextGaussian() * .3f, 0, 0, 0); + if (_isPowered && level->random->nextInt(4) == 0) + { + level->addParticle(eParticleType_mobSpell, hx + random->nextGaussian() * .3f, hy + random->nextGaussian() * .3f, hz + random->nextGaussian() * .3f, .7f, .7f, .5f); + } + } + if (getInvulnerableTicks() > 0) + { + for (int i = 0; i < 3; i++) + { + level->addParticle(eParticleType_mobSpell, x + random->nextGaussian() * 1.0f, y + random->nextFloat() * 3.3f, z + random->nextGaussian() * 1.0f, .7f, .7f, .9f); + } + } +} + +void WitherBoss::newServerAiStep() +{ + if (getInvulnerableTicks() > 0) + { + int newCount = getInvulnerableTicks() - 1; + + if (newCount <= 0) + { + level->explode(shared_from_this(), x, y + getHeadHeight(), z, 7, false, level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)); + level->globalLevelEvent(LevelEvent::SOUND_WITHER_BOSS_SPAWN, (int) x, (int) y, (int) z, 0); + } + + setInvulnerableTicks(newCount); + if (tickCount % 10 == 0) + { + heal(10); + } + + return; + } + + Monster::newServerAiStep(); + + for (int i = 1; i < 3; i++) + { + if (tickCount >= nextHeadUpdate[i - 1]) + { + nextHeadUpdate[i - 1] = tickCount + SharedConstants::TICKS_PER_SECOND / 2 + random->nextInt(SharedConstants::TICKS_PER_SECOND / 2); + + if (level->difficulty >= Difficulty::NORMAL && idleHeadUpdates[i - 1]++ > 15) + { + float hrange = 10; + float vrange = 5; + double xt = Mth::nextDouble(random, x - hrange, x + hrange); + double yt = Mth::nextDouble(random, y - vrange, y + vrange); + double zt = Mth::nextDouble(random, z - hrange, z + hrange); + performRangedAttack(i + 1, xt, yt, zt, true); + idleHeadUpdates[i - 1] = 0; + } + + int headTarget = getAlternativeTarget(i); + if (headTarget > 0) + { + shared_ptr current = level->getEntity(headTarget); + + // 4J: Added check for instance of living entity, had a problem with IDs being recycled to other entities + if (current == NULL || !current->instanceof(eTYPE_LIVINGENTITY) || !current->isAlive() || distanceToSqr(current) > 30 * 30 || !canSee(current)) + { + setAlternativeTarget(i, 0); + } + else + { + performRangedAttack(i + 1, dynamic_pointer_cast(current) ); + nextHeadUpdate[i - 1] = tickCount + SharedConstants::TICKS_PER_SECOND * 2 + random->nextInt(SharedConstants::TICKS_PER_SECOND); + idleHeadUpdates[i - 1] = 0; + } + } + else + { + vector > *entities = level->getEntitiesOfClass(typeid(LivingEntity), bb->grow(20, 8, 20), livingEntitySelector); + // randomly try to find a target 10 times + for (int attempt = 0; attempt < 10 && !entities->empty(); attempt++) + { + int randomIndex = random->nextInt(entities->size()); + shared_ptr selected = dynamic_pointer_cast( entities->at(randomIndex) ); + + if (selected != shared_from_this() && selected->isAlive() && canSee(selected)) + { + if ( selected->instanceof(eTYPE_PLAYER) ) + { + if (!dynamic_pointer_cast(selected)->abilities.invulnerable) + { + assert(selected->instanceof(eTYPE_LIVINGENTITY)); + setAlternativeTarget(i, selected->entityId); + } + break; + } + else + { + assert(selected->instanceof(eTYPE_LIVINGENTITY)); + setAlternativeTarget(i, selected->entityId); + break; + } + } + // don't pick this again + entities->erase(entities->begin() + randomIndex); + } + delete entities; + } + } + } + if (getTarget() != NULL) + { + assert(getTarget()->instanceof(eTYPE_LIVINGENTITY)); + setAlternativeTarget(0, getTarget()->entityId); + } + else + { + setAlternativeTarget(0, 0); + } + + if (destroyBlocksTick > 0) + { + destroyBlocksTick--; + + if (destroyBlocksTick == 0 && level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) + { + // destroy all blocks that are within 1 range, counting from + // feet and 3 blocks up + + int feet = Mth::floor(y); + int ox = Mth::floor(x); + int oz = Mth::floor(z); + bool destroyed = false; + + for (int xStep = -1; xStep <= 1; xStep++) + { + for (int zStep = -1; zStep <= 1; zStep++) + { + for (int yStep = 0; yStep <= 3; yStep++) + { + int tx = ox + xStep; + int ty = feet + yStep; + int tz = oz + zStep; + int tile = level->getTile(tx, ty, tz); + if (tile > 0 && tile != Tile::unbreakable_Id && tile != Tile::endPortalTile_Id && tile != Tile::endPortalFrameTile_Id) + { + destroyed = level->destroyTile(tx, ty, tz, true) || destroyed; + } + } + } + } + if (destroyed) + { + level->levelEvent(nullptr, LevelEvent::SOUND_ZOMBIE_DOOR_CRASH, (int) x, (int) y, (int) z, 0); + } + } + } + + if ((tickCount % (SharedConstants::TICKS_PER_SECOND)) == 0) + { + heal(1); + } +} + +void WitherBoss::makeInvulnerable() +{ + setInvulnerableTicks(SharedConstants::TICKS_PER_SECOND * 11); + setHealth(getMaxHealth() / 3); +} + +void WitherBoss::makeStuckInWeb() +{ +} + +int WitherBoss::getArmorValue() +{ + return 4; +} + +double WitherBoss::getHeadX(int index) +{ + if (index <= 0) + { + return x; + } + float headAngle = (yBodyRot + 180 * (index - 1)) / 180.0f * PI; + float cos = Mth::cos(headAngle); + return x + cos * 1.3; +} + +double WitherBoss::getHeadY(int index) +{ + if (index <= 0) + { + return y + 3; + } + else + { + return y + 2.2; + } +} + +double WitherBoss::getHeadZ(int index) +{ + if (index <= 0) + { + return z; + } + float headAngle = (yBodyRot + 180 * (index - 1)) / 180.0f * PI; + float sin = Mth::sin(headAngle); + return z + sin * 1.3; +} + +float WitherBoss::rotlerp(float a, float b, float max) +{ + float diff = Mth::wrapDegrees(b - a); + if (diff > max) + { + diff = max; + } + if (diff < -max) + { + diff = -max; + } + return a + diff; +} + +void WitherBoss::performRangedAttack(int head, shared_ptr target) +{ + performRangedAttack(head, target->x, target->y + target->getHeadHeight() * .5, target->z, head == 0 && random->nextFloat() < 0.001f); +} + +void WitherBoss::performRangedAttack(int head, double tx, double ty, double tz, bool dangerous) +{ + level->levelEvent(nullptr, LevelEvent::SOUND_WITHER_BOSS_SHOOT, (int) x, (int) y, (int) z, 0); + + double hx = getHeadX(head); + double hy = getHeadY(head); + double hz = getHeadZ(head); + + double xd = tx - hx; + double yd = ty - hy; + double zd = tz - hz; + + shared_ptr ie = shared_ptr( new WitherSkull(level, dynamic_pointer_cast(shared_from_this()), xd, yd, zd) ); + if (dangerous) ie->setDangerous(true); + ie->y = hy; + ie->x = hx; + ie->z = hz; + level->addEntity(ie); +} + +void WitherBoss::performRangedAttack(shared_ptr target, float power) +{ + performRangedAttack(0, target); +} + +bool WitherBoss::hurt(DamageSource *source, float dmg) +{ + if (isInvulnerable()) return false; + if (source == DamageSource::drown) return false; + if (getInvulnerableTicks() > 0) + { + return false; + } + + if (isPowered()) + { + shared_ptr directEntity = source->getDirectEntity(); + if (directEntity != NULL && directEntity->GetType() == eTYPE_ARROW) + { + return false; + } + } + + shared_ptr sourceEntity = source->getEntity(); + if (sourceEntity != NULL) + { + if ( sourceEntity->instanceof(eTYPE_PLAYER) ) + { + } + else if ( sourceEntity->instanceof(eTYPE_LIVINGENTITY) && dynamic_pointer_cast(sourceEntity)->getMobType() == getMobType()) + { + // can't be harmed by other undead + return false; + } + } + if (destroyBlocksTick <= 0) + { + destroyBlocksTick = SharedConstants::TICKS_PER_SECOND; + } + + for (int i = 0; i < IDLE_HEAD_UPDATES_SIZE; i++) + { + idleHeadUpdates[i] += 3; + } + + return Monster::hurt(source, dmg); +} + +void WitherBoss::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) +{ + spawnAtLocation(Item::netherStar_Id, 1); +} + +void WitherBoss::checkDespawn() +{ + noActionTime = 0; +} + +int WitherBoss::getLightColor(float a) +{ + return SharedConstants::FULLBRIGHT_LIGHTVALUE; +} + +bool WitherBoss::isPickable() +{ + return !removed; +} + +void WitherBoss::causeFallDamage(float distance) +{ +} + +void WitherBoss::addEffect(MobEffectInstance *newEffect) +{ + // do nothing +} + +bool WitherBoss::useNewAi() +{ + return true; +} + +void WitherBoss::registerAttributes() +{ + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(300); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.6f); + + // 4J Stu - Don't make it so far! + //getAttribute(SharedMonsterAttributes::FOLLOW_RANGE)->setBaseValue(40); +} + +float WitherBoss::getHeadYRot(int i) +{ + return yRotHeads[i]; +} + +float WitherBoss::getHeadXRot(int i) +{ + return xRotHeads[i]; +} + +int WitherBoss::getInvulnerableTicks() +{ + return entityData->getInteger(DATA_ID_INV); +} + +void WitherBoss::setInvulnerableTicks(int invulnerableTicks) +{ + entityData->set(DATA_ID_INV, invulnerableTicks); +} + +int WitherBoss::getAlternativeTarget(int headIndex) +{ + return entityData->getInteger(DATA_TARGET_A + headIndex); +} + +void WitherBoss::setAlternativeTarget(int headIndex, int entityId) +{ + entityData->set(DATA_TARGET_A + headIndex, entityId); +} + +bool WitherBoss::isPowered() +{ + return getHealth() <= getMaxHealth() / 2; +} + +MobType WitherBoss::getMobType() +{ + return UNDEAD; +} + +void WitherBoss::ride(shared_ptr e) +{ + riding = nullptr; +} \ No newline at end of file diff --git a/Minecraft.World/WitherBoss.h b/Minecraft.World/WitherBoss.h new file mode 100644 index 00000000..47e2dff1 --- /dev/null +++ b/Minecraft.World/WitherBoss.h @@ -0,0 +1,109 @@ +#pragma once + +#include "Monster.h" +#include "RangedAttackMob.h" +#include "BossMob.h" + +class LivingEntitySelector : public EntitySelector +{ +public: + virtual bool matches(shared_ptr entity) const; +}; + +class WitherBoss : public Monster, public RangedAttackMob, public BossMob +{ +public: + eINSTANCEOF GetType() { return eTYPE_WITHERBOSS; }; + static Entity *create(Level *level) { return new WitherBoss(level); } + +private: + static const int DATA_TARGET_A = 17; + static const int DATA_TARGET_B = 18; + static const int DATA_TARGET_C = 19; + static const int DATA_ID_INV = 20; + +private: + static const int IDLE_HEAD_UPDATES_SIZE = 2; + float xRotHeads[2]; + float yRotHeads[2]; + float xRotOHeads[2]; + float yRotOHeads[2]; + int nextHeadUpdate[2]; + int idleHeadUpdates[IDLE_HEAD_UPDATES_SIZE]; + int destroyBlocksTick; + + static EntitySelector *livingEntitySelector; + +public: + WitherBoss(Level *level); + +protected: + virtual void defineSynchedData(); + +public: + virtual void addAdditonalSaveData(CompoundTag *entityTag); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual float getShadowHeightOffs(); + +protected: + virtual int getAmbientSound(); + virtual int getHurtSound(); + virtual int getDeathSound(); + +public: + virtual void aiStep(); + +protected: + virtual void newServerAiStep(); + +public: + virtual void makeInvulnerable(); + virtual void makeStuckInWeb(); + virtual int getArmorValue(); + +private: + virtual double getHeadX(int index); + virtual double getHeadY(int index); + virtual double getHeadZ(int index); + virtual float rotlerp(float a, float b, float max); + virtual void performRangedAttack(int head, shared_ptr target); + virtual void performRangedAttack(int head, double tx, double ty, double tz, bool dangerous); + +public: + virtual void performRangedAttack(shared_ptr target, float power); + virtual bool hurt(DamageSource *source, float dmg); + +protected: + virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); + virtual void checkDespawn(); + +public: + virtual int getLightColor(float a); + virtual bool isPickable(); + +protected: + virtual void causeFallDamage(float distance); + +public: + virtual void addEffect(MobEffectInstance *newEffect); + +protected: + virtual bool useNewAi(); + virtual void registerAttributes(); + +public: + virtual float getHeadYRot(int i); + virtual float getHeadXRot(int i); + virtual int getInvulnerableTicks(); + virtual void setInvulnerableTicks(int invulnerableTicks); + virtual int getAlternativeTarget(int headIndex); + virtual void setAlternativeTarget(int headIndex, int entityId); + virtual bool isPowered(); + virtual MobType getMobType(); + virtual void ride(shared_ptr e); + + // 4J Stu - These are required for the BossMob interface + virtual float getMaxHealth() { return Monster::getMaxHealth(); }; + virtual float getHealth() { return Monster::getHealth(); }; + virtual wstring getAName() { return app.GetString(IDS_WITHER); }; +}; \ No newline at end of file diff --git a/Minecraft.World/WitherSkull.cpp b/Minecraft.World/WitherSkull.cpp new file mode 100644 index 00000000..d67660c4 --- /dev/null +++ b/Minecraft.World/WitherSkull.cpp @@ -0,0 +1,130 @@ +#include "stdafx.h" +#include "net.minecraft.world.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "WitherSkull.h" + +WitherSkull::WitherSkull(Level *level) : Fireball(level) +{ + defineSynchedData(); + + setSize(5 / 16.0f, 5 / 16.0f); +} + +WitherSkull::WitherSkull(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) +{ + defineSynchedData(); + + setSize(5 / 16.0f, 5 / 16.0f); +} + +float WitherSkull::getInertia() +{ + return isDangerous() ? 0.73f : Fireball::getInertia(); +} + +WitherSkull::WitherSkull(Level *level, double x, double y, double z, double xa, double ya, double za) : Fireball(level, x, y, z, xa, ya, za) +{ + defineSynchedData(); + + setSize(5 / 16.0f, 5 / 16.0f); +} + +bool WitherSkull::isOnFire() +{ + return false; +} + +float WitherSkull::getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile) +{ + float result = Fireball::getTileExplosionResistance(explosion, level, x, y, z, tile); + + if (isDangerous() && tile != Tile::unbreakable && tile != Tile::endPortalTile && tile != Tile::endPortalFrameTile) + { + result = min(0.8f, result); + } + + return result; +} + +void WitherSkull::onHit(HitResult *res) +{ + if (!level->isClientSide) + { + if (res->entity != NULL) + { + if (owner != NULL) + { + DamageSource *damageSource = DamageSource::mobAttack(owner); + if (res->entity->hurt(damageSource, 8)) + { + if (!res->entity->isAlive()) + { + owner->heal(5); + } + } + delete damageSource; + } + else + { + res->entity->hurt(DamageSource::magic, 5); + } + if ( res->entity->instanceof(eTYPE_LIVINGENTITY) ) + { + int witherSeconds = 0; + if (level->difficulty <= Difficulty::EASY) + { + // Nothing + } + else if (level->difficulty == Difficulty::NORMAL) + { + witherSeconds = 10; + } + else if (level->difficulty == Difficulty::HARD) + { + witherSeconds = 40; + } + if (witherSeconds > 0) + { + dynamic_pointer_cast( res->entity )->addEffect(new MobEffectInstance(MobEffect::wither->id, SharedConstants::TICKS_PER_SECOND * witherSeconds, 1)); + } + } + } + level->explode(shared_from_this(), x, y, z, 1, false, level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)); + remove(); + } +} + +bool WitherSkull::isPickable() +{ + return false; +} + +bool WitherSkull::hurt(DamageSource *source, float damage) +{ + return false; +} + +void WitherSkull::defineSynchedData() +{ + entityData->define(DATA_DANGEROUS, (byte) 0); +} + +bool WitherSkull::isDangerous() +{ + return entityData->getByte(DATA_DANGEROUS) == 1; +} + +void WitherSkull::setDangerous(bool value) +{ + entityData->set(DATA_DANGEROUS, value ? (byte) 1 : (byte) 0); +} + +bool WitherSkull::shouldBurn() +{ + return false; +} \ No newline at end of file diff --git a/Minecraft.World/WitherSkull.h b/Minecraft.World/WitherSkull.h new file mode 100644 index 00000000..ac393c69 --- /dev/null +++ b/Minecraft.World/WitherSkull.h @@ -0,0 +1,43 @@ +#pragma once + +#include "Fireball.h" + +class WitherSkull : public Fireball +{ +public: + eINSTANCEOF GetType() { return eTYPE_WITHER_SKULL; } + static Entity *create(Level *level) { return new WitherSkull(level); } + +private: + static const int DATA_DANGEROUS = 10; + +public: + WitherSkull(Level *level); + WitherSkull(Level *level, shared_ptr mob, double xa, double ya, double za); + +protected: + virtual float getInertia(); + +public: + WitherSkull(Level *level, double x, double y, double z, double xa, double ya, double za); + + virtual bool isOnFire(); + virtual float getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile); + +protected: + virtual void onHit(HitResult *res); + +public: + virtual bool isPickable(); + virtual bool hurt(DamageSource *source, float damage); + +protected: + virtual void defineSynchedData(); + +public: + virtual bool isDangerous(); + virtual void setDangerous(bool value); + +protected: + virtual bool shouldBurn(); // 4J Added. +}; \ No newline at end of file diff --git a/Minecraft.World/Wolf.cpp b/Minecraft.World/Wolf.cpp index 8ffc45c6..1988382e 100644 --- a/Minecraft.World/Wolf.cpp +++ b/Minecraft.World/Wolf.cpp @@ -5,9 +5,12 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" #include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.level.pathfinder.h" @@ -25,26 +28,23 @@ Wolf::Wolf(Level *level) : TamableAnimal( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); interestedAngle = interestedAngleO = 0.0f; m_isWet = isShaking = false; shakeAnim = shakeAnimO = 0.0f; - this->textureIdx = TN_MOB_WOLF; // 4J - was L"/mob/wolf.png"; this->setSize(0.60f, 0.8f); - runSpeed = 0.3f; getNavigation()->setAvoidWater(true); goalSelector.addGoal(1, new FloatGoal(this)); goalSelector.addGoal(2, sitGoal, false); - goalSelector.addGoal(3, new LeapAtTargetGoal(this, 0.4f)); - goalSelector.addGoal(4, new MeleeAttackGoal(this, runSpeed, true)); - goalSelector.addGoal(5, new FollowOwnerGoal(this, runSpeed, 10, 2)); - goalSelector.addGoal(6, new BreedGoal(this, runSpeed)); - goalSelector.addGoal(7, new RandomStrollGoal(this, runSpeed)); + goalSelector.addGoal(3, new LeapAtTargetGoal(this, 0.4)); + goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0, true)); + goalSelector.addGoal(5, new FollowOwnerGoal(this, 1.0, 10, 2)); + goalSelector.addGoal(6, new BreedGoal(this, 1.0)); + goalSelector.addGoal(7, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(8, new BegGoal(this, 8)); goalSelector.addGoal(9, new LookAtPlayerGoal(this, typeid(Player), 8)); goalSelector.addGoal(9, new RandomLookAroundGoal(this)); @@ -52,7 +52,25 @@ Wolf::Wolf(Level *level) : TamableAnimal( level ) targetSelector.addGoal(1, new OwnerHurtByTargetGoal(this)); targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); targetSelector.addGoal(3, new HurtByTargetGoal(this, true)); - targetSelector.addGoal(4, new NonTameRandomTargetGoal(this, typeid(Sheep), 16, 200, false)); + targetSelector.addGoal(4, new NonTameRandomTargetGoal(this, typeid(Sheep), 200, false)); + + setTame(false); // Initialize health +} + +void Wolf::registerAttributes() +{ + TamableAnimal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.3f); + + if (isTame()) + { + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(TAME_HEALTH); + } + else + { + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(START_HEALTH); + } } bool Wolf::useNewAi() @@ -60,10 +78,10 @@ bool Wolf::useNewAi() return true; } -void Wolf::setTarget(shared_ptr target) +void Wolf::setTarget(shared_ptr target) { TamableAnimal::setTarget(target); - if ( dynamic_pointer_cast(target) == NULL ) + if ( target == NULL ) { setAngry(false); } @@ -78,39 +96,17 @@ void Wolf::serverAiMobStep() entityData->set(DATA_HEALTH_ID, getHealth()); } -int Wolf::getMaxHealth() -{ - if (isTame()) - { - return TAME_HEALTH; - } - return START_HEALTH; -} - void Wolf::defineSynchedData() { TamableAnimal::defineSynchedData(); entityData->define(DATA_HEALTH_ID, getHealth()); entityData->define(DATA_INTERESTED_ID, (byte)0); - entityData->define(DATA_COLLAR_COLOR, (byte) ClothTile::getTileDataForItemAuxValue(DyePowderItem::RED)); + entityData->define(DATA_COLLAR_COLOR, (byte) ColoredTile::getTileDataForItemAuxValue(DyePowderItem::RED)); } -bool Wolf::makeStepSound() +void Wolf::playStepSound(int xt, int yt, int zt, int t) { - return false; -} - -int Wolf::getTexture() -{ - if (isTame()) - { - return TN_MOB_WOLF_TAME; // 4J was L"/mob/wolf_tame.png"; - } - if (isAngry()) - { - return TN_MOB_WOLF_ANGRY; // 4J was L"/mob/wolf_angry.png"; - } - return TamableAnimal::getTexture(); + playSound(eSoundType_MOB_WOLF_STEP, 0.15f, 1); } void Wolf::addAdditonalSaveData(CompoundTag *tag) @@ -129,11 +125,6 @@ void Wolf::readAdditionalSaveData(CompoundTag *tag) if (tag->contains(L"CollarColor")) setCollarColor(tag->getByte(L"CollarColor")); } -bool Wolf::removeWhenFarAway() -{ - return !isTame(); -} - int Wolf::getAmbientSound() { if (isAngry()) @@ -142,7 +133,7 @@ int Wolf::getAmbientSound() } if (random->nextInt(3) == 0) { - if (isTame() && entityData->getInteger(DATA_HEALTH_ID) < 10) + if (isTame() && entityData->getFloat(DATA_HEALTH_ID) < 10) { return eSoundType_MOB_WOLF_WHINE; } @@ -217,7 +208,7 @@ void Wolf::tick() if (shakeAnim == 0) { - level->playSound(shared_from_this(), eSoundType_MOB_WOLF_SHAKE, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + playSound(eSoundType_MOB_WOLF_SHAKE, getSoundVolume(), (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); } shakeAnimO = shakeAnim; @@ -289,14 +280,25 @@ int Wolf::getMaxHeadXRot() return TamableAnimal::getMaxHeadXRot(); } -bool Wolf::hurt(DamageSource *source, int dmg) +bool Wolf::hurt(DamageSource *source, float dmg) { + // 4J: Protect owned wolves from untrusted players + if (isTame()) + { + shared_ptr entity = source->getDirectEntity(); + if (entity != NULL && entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr attacker = dynamic_pointer_cast(entity); + attacker->canHarmPlayer(getOwnerUUID()); + } + } + if (isInvulnerable()) return false; shared_ptr sourceEntity = source->getEntity(); sitGoal->wantToSit(false); - if (sourceEntity != NULL && !(dynamic_pointer_cast(sourceEntity) != NULL || dynamic_pointer_cast(sourceEntity) != NULL)) + if (sourceEntity != NULL && !(sourceEntity->instanceof(eTYPE_PLAYER) || sourceEntity->instanceof(eTYPE_ARROW))) { - // take half damage from non-players and arrows + // Take half damage from non-players and arrows dmg = (dmg + 1) / 2; } return TamableAnimal::hurt(source, dmg); @@ -308,6 +310,20 @@ bool Wolf::doHurtTarget(shared_ptr target) return target->hurt(DamageSource::mobAttack(dynamic_pointer_cast(shared_from_this())), damage); } +void Wolf::setTame(bool value) +{ + TamableAnimal::setTame(value); + + if (value) + { + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(TAME_HEALTH); + } + else + { + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(START_HEALTH); + } +} + void Wolf::tame(const wstring &wsOwnerUUID, bool bDisplayTamingParticles, bool bSetSitting) { setTame(true); @@ -322,7 +338,7 @@ void Wolf::tame(const wstring &wsOwnerUUID, bool bDisplayTamingParticles, bool b spawnTamingParticles(bDisplayTamingParticles); } -bool Wolf::interact(shared_ptr player) +bool Wolf::mobInteract(shared_ptr player) { shared_ptr item = player->inventory->getSelected(); @@ -334,28 +350,24 @@ bool Wolf::interact(shared_ptr player) { FoodItem *food = dynamic_cast( Item::items[item->id] ); - if (food->isMeat()) + if (food->isMeat() && entityData->getFloat(DATA_HEALTH_ID) < MAX_HEALTH) { - if(entityData->getInteger(DATA_HEALTH_ID) < MAX_HEALTH) + heal(food->getNutrition()); + // 4J-PB - don't lose the bone in creative mode + if (player->abilities.instabuild==false) { - heal(food->getNutrition()); - // 4J-PB - don't lose the bone in creative mode - if (player->abilities.instabuild==false) + item->count--; + if (item->count <= 0) { - item->count--; - if (item->count <= 0) - { - player->inventory->setItem(player->inventory->selected, nullptr); - } + player->inventory->setItem(player->inventory->selected, nullptr); } - return true; } - else return TamableAnimal::interact(player); + return true; } } else if (item->id == Item::dye_powder_Id) { - int color = ClothTile::getTileDataForItemAuxValue(item->getAuxValue()); + int color = ColoredTile::getTileDataForItemAuxValue(item->getAuxValue()); if (color != getCollarColor()) { setCollarColor(color); @@ -376,6 +388,8 @@ bool Wolf::interact(shared_ptr player) sitGoal->wantToSit(!isSitting()); jumping = false; setPath(NULL); + setAttackTarget(nullptr); + setTarget(nullptr); } } } @@ -403,7 +417,7 @@ bool Wolf::interact(shared_ptr player) // 4J Changed to this tame(player->getUUID(),true,true); - level->broadcastEntityEvent(shared_from_this(), EntityEvent::TAMING_SUCCEEDED); + level->broadcastEntityEvent(shared_from_this(), EntityEvent::TAMING_SUCCEEDED); } else { @@ -421,7 +435,7 @@ bool Wolf::interact(shared_ptr player) return false; } } - return TamableAnimal::interact(player); + return TamableAnimal::mobInteract(player); } void Wolf::handleEntityEvent(byte id) @@ -446,7 +460,7 @@ float Wolf::getTailAngle() } else if (isTame()) { - return (0.55f - (MAX_HEALTH - entityData->getInteger(DATA_HEALTH_ID)) * 0.02f) * PI; + return (0.55f - (MAX_HEALTH - entityData->getFloat(DATA_HEALTH_ID)) * 0.02f) * PI; } return 0.20f * PI; } @@ -520,8 +534,6 @@ shared_ptr Wolf::getBreedOffspring(shared_ptr target) void Wolf::setIsInterested(bool value) { - //byte current = entityData->getByte(DATA_INTERESTED_ID); - if (value) { entityData->set(DATA_INTERESTED_ID, (byte) 1); @@ -536,7 +548,10 @@ bool Wolf::canMate(shared_ptr animal) { if (animal == shared_from_this()) return false; if (!isTame()) return false; + + if (!animal->instanceof(eTYPE_WOLF)) return false; shared_ptr partner = dynamic_pointer_cast(animal); + if (partner == NULL) return false; if (!partner->isTame()) return false; if (partner->isSitting()) return false; @@ -548,3 +563,37 @@ bool Wolf::isInterested() { return entityData->getByte(DATA_INTERESTED_ID) == 1; } + +bool Wolf::removeWhenFarAway() +{ + return !isTame() && tickCount > SharedConstants::TICKS_PER_SECOND * 60 * 2; +} + +bool Wolf::wantsToAttack(shared_ptr target, shared_ptr owner) +{ + // filter un-attackable mobs + if (target->GetType() == eTYPE_CREEPER || target->GetType() == eTYPE_GHAST) + { + return false; + } + // never target wolves that has this player as owner + if (target->GetType() == eTYPE_WOLF) + { + shared_ptr wolfTarget = dynamic_pointer_cast(target); + if (wolfTarget->isTame() && wolfTarget->getOwner() == owner) + { + return false; + } + } + if ( target->instanceof(eTYPE_PLAYER) && owner->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(owner)->canHarmPlayer(dynamic_pointer_cast(target) )) + { + // pvp is off + return false; + } + // don't attack tame horses + if ((target->GetType() == eTYPE_HORSE) && dynamic_pointer_cast(target)->isTamed()) + { + return false; + } + return true; +} \ No newline at end of file diff --git a/Minecraft.World/Wolf.h b/Minecraft.World/Wolf.h index 52f2a23b..edfd3814 100644 --- a/Minecraft.World/Wolf.h +++ b/Minecraft.World/Wolf.h @@ -15,6 +15,7 @@ private: static const int DATA_HEALTH_ID = 18; static const int DATA_INTERESTED_ID = 19; static const int DATA_COLLAR_COLOR = 20; + static const int START_HEALTH = 8; static const int MAX_HEALTH = 20; static const int TAME_HEALTH = 20; @@ -25,26 +26,24 @@ private: public: Wolf(Level *level); - virtual bool useNewAi(); - virtual void setTarget(shared_ptr target); protected: - virtual void serverAiMobStep(); + virtual void registerAttributes(); public: - virtual int getMaxHealth(); + virtual bool useNewAi(); + virtual void setTarget(shared_ptr target); protected: + virtual void serverAiMobStep(); virtual void defineSynchedData(); - virtual bool makeStepSound(); + virtual void playStepSound(int xt, int yt, int zt, int t); public: - virtual int getTexture(); // 4J - changed from wstring to ing virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); protected: - virtual bool removeWhenFarAway(); virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); @@ -60,9 +59,10 @@ public: float getHeadRollAngle(float a); float getHeadHeight(); int getMaxHeadXRot(); - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); virtual bool doHurtTarget(shared_ptr target); - virtual bool interact(shared_ptr player); + virtual void setTame(bool value); + virtual bool mobInteract(shared_ptr player); virtual void handleEntityEvent(byte id); float getTailAngle(); virtual bool isFood(shared_ptr item); @@ -83,4 +83,10 @@ public: virtual void setIsInterested(bool isInterested); virtual bool canMate(shared_ptr animal); bool isInterested(); + +protected: + virtual bool removeWhenFarAway(); + +public: + virtual bool wantsToAttack(shared_ptr target, shared_ptr owner); }; diff --git a/Minecraft.World/WoodButtonTile.cpp b/Minecraft.World/WoodButtonTile.cpp new file mode 100644 index 00000000..514d21de --- /dev/null +++ b/Minecraft.World/WoodButtonTile.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "WoodButtonTile.h" + +WoodButtonTile::WoodButtonTile(int id) : ButtonTile(id, true) +{ +} + +Icon *WoodButtonTile::getTexture(int face, int data) +{ + return Tile::wood->getTexture(Facing::UP); +} \ No newline at end of file diff --git a/Minecraft.World/WoodButtonTile.h b/Minecraft.World/WoodButtonTile.h new file mode 100644 index 00000000..9b1a3b61 --- /dev/null +++ b/Minecraft.World/WoodButtonTile.h @@ -0,0 +1,11 @@ +#pragma once + +#include "ButtonTile.h" + +class WoodButtonTile : public ButtonTile +{ +public: + WoodButtonTile(int id); + + Icon *getTexture(int face, int data); +}; \ No newline at end of file diff --git a/Minecraft.World/WoodTile.cpp b/Minecraft.World/WoodTile.cpp index 43101d58..c735c581 100644 --- a/Minecraft.World/WoodTile.cpp +++ b/Minecraft.World/WoodTile.cpp @@ -13,7 +13,7 @@ const unsigned int WoodTile::WOOD_NAMES[WOOD_NAMES_LENGTH] = { IDS_TILE_OAKWOOD_ IDS_TILE_JUNGLE_PLANKS, }; -const wstring WoodTile::TEXTURE_NAMES[] = {L"wood", L"wood_spruce", L"wood_birch", L"wood_jungle"}; +const wstring WoodTile::TEXTURE_NAMES[] = {L"oak", L"spruce", L"birch", L"jungle"}; // public static final String[] WOOD_NAMES = { // "oak", "spruce", "birch", "jungle" @@ -51,6 +51,6 @@ void WoodTile::registerIcons(IconRegister *iconRegister) for (int i = 0; i < WOOD_NAMES_LENGTH; i++) { - icons[i] = iconRegister->registerIcon(TEXTURE_NAMES[i]); + icons[i] = iconRegister->registerIcon(getIconName() + L"_" + TEXTURE_NAMES[i]); } } \ No newline at end of file diff --git a/Minecraft.World/WoolCarpetTile.cpp b/Minecraft.World/WoolCarpetTile.cpp index 16a3d0aa..b509a312 100644 --- a/Minecraft.World/WoolCarpetTile.cpp +++ b/Minecraft.World/WoolCarpetTile.cpp @@ -13,7 +13,7 @@ WoolCarpetTile::WoolCarpetTile(int id) : Tile(id, Material::clothDecoration, isS Icon *WoolCarpetTile::getTexture(int face, int data) { - return Tile::cloth->getTexture(face, data); + return Tile::wool->getTexture(face, data); } AABB *WoolCarpetTile::getAABB(Level *level, int x, int y, int z) @@ -73,7 +73,7 @@ bool WoolCarpetTile::checkCanSurvive(Level *level, int x, int y, int z) if (!canSurvive(level, x, y, z)) { spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return false; } return true; diff --git a/Minecraft.World/WoolTileItem.cpp b/Minecraft.World/WoolTileItem.cpp new file mode 100644 index 00000000..0f079571 --- /dev/null +++ b/Minecraft.World/WoolTileItem.cpp @@ -0,0 +1,149 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.tile.h" +#include "ItemInstance.h" +#include "DyePowderItem.h" +#include "WoolTileItem.h" + +const unsigned int WoolTileItem::COLOR_DESCS[] = +{ + IDS_TILE_CLOTH_BLACK, + IDS_TILE_CLOTH_RED, + IDS_TILE_CLOTH_GREEN, + IDS_TILE_CLOTH_BROWN, + IDS_TILE_CLOTH_BLUE, + IDS_TILE_CLOTH_PURPLE, + IDS_TILE_CLOTH_CYAN, + IDS_TILE_CLOTH_SILVER, + IDS_TILE_CLOTH_GRAY, + IDS_TILE_CLOTH_PINK, + IDS_TILE_CLOTH_LIME, + IDS_TILE_CLOTH_YELLOW, + IDS_TILE_CLOTH_LIGHT_BLUE, + IDS_TILE_CLOTH_MAGENTA, + IDS_TILE_CLOTH_ORANGE, + IDS_TILE_CLOTH_WHITE +}; + +const unsigned int WoolTileItem::CARPET_COLOR_DESCS[] = +{ + IDS_TILE_CARPET_BLACK, + IDS_TILE_CARPET_RED, + IDS_TILE_CARPET_GREEN, + IDS_TILE_CARPET_BROWN, + IDS_TILE_CARPET_BLUE, + IDS_TILE_CARPET_PURPLE, + IDS_TILE_CARPET_CYAN, + IDS_TILE_CARPET_SILVER, + IDS_TILE_CARPET_GRAY, + IDS_TILE_CARPET_PINK, + IDS_TILE_CARPET_LIME, + IDS_TILE_CARPET_YELLOW, + IDS_TILE_CARPET_LIGHT_BLUE, + IDS_TILE_CARPET_MAGENTA, + IDS_TILE_CARPET_ORANGE, + IDS_TILE_CARPET_WHITE +}; + +const unsigned int WoolTileItem::CLAY_COLOR_DESCS[] = +{ + IDS_TILE_STAINED_CLAY_BLACK, + IDS_TILE_STAINED_CLAY_RED, + IDS_TILE_STAINED_CLAY_GREEN, + IDS_TILE_STAINED_CLAY_BROWN, + IDS_TILE_STAINED_CLAY_BLUE, + IDS_TILE_STAINED_CLAY_PURPLE, + IDS_TILE_STAINED_CLAY_CYAN, + IDS_TILE_STAINED_CLAY_SILVER, + IDS_TILE_STAINED_CLAY_GRAY, + IDS_TILE_STAINED_CLAY_PINK, + IDS_TILE_STAINED_CLAY_LIME, + IDS_TILE_STAINED_CLAY_YELLOW, + IDS_TILE_STAINED_CLAY_LIGHT_BLUE, + IDS_TILE_STAINED_CLAY_MAGENTA, + IDS_TILE_STAINED_CLAY_ORANGE, + IDS_TILE_STAINED_CLAY_WHITE +}; + +const unsigned int WoolTileItem::GLASS_COLOR_DESCS[] = +{ + IDS_TILE_STAINED_GLASS_BLACK, + IDS_TILE_STAINED_GLASS_RED, + IDS_TILE_STAINED_GLASS_GREEN, + IDS_TILE_STAINED_GLASS_BROWN, + IDS_TILE_STAINED_GLASS_BLUE, + IDS_TILE_STAINED_GLASS_PURPLE, + IDS_TILE_STAINED_GLASS_CYAN, + IDS_TILE_STAINED_GLASS_SILVER, + IDS_TILE_STAINED_GLASS_GRAY, + IDS_TILE_STAINED_GLASS_PINK, + IDS_TILE_STAINED_GLASS_LIME, + IDS_TILE_STAINED_GLASS_YELLOW, + IDS_TILE_STAINED_GLASS_LIGHT_BLUE, + IDS_TILE_STAINED_GLASS_MAGENTA, + IDS_TILE_STAINED_GLASS_ORANGE, + IDS_TILE_STAINED_GLASS_WHITE +}; + +const unsigned int WoolTileItem::GLASS_PANE_COLOR_DESCS[] = +{ + IDS_TILE_STAINED_GLASS_PANE_BLACK, + IDS_TILE_STAINED_GLASS_PANE_RED, + IDS_TILE_STAINED_GLASS_PANE_GREEN, + IDS_TILE_STAINED_GLASS_PANE_BROWN, + IDS_TILE_STAINED_GLASS_PANE_BLUE, + IDS_TILE_STAINED_GLASS_PANE_PURPLE, + IDS_TILE_STAINED_GLASS_PANE_CYAN, + IDS_TILE_STAINED_GLASS_PANE_SILVER, + IDS_TILE_STAINED_GLASS_PANE_GRAY, + IDS_TILE_STAINED_GLASS_PANE_PINK, + IDS_TILE_STAINED_GLASS_PANE_LIME, + IDS_TILE_STAINED_GLASS_PANE_YELLOW, + IDS_TILE_STAINED_GLASS_PANE_LIGHT_BLUE, + IDS_TILE_STAINED_GLASS_PANE_MAGENTA, + IDS_TILE_STAINED_GLASS_PANE_ORANGE, + IDS_TILE_STAINED_GLASS_PANE_WHITE +}; + +WoolTileItem::WoolTileItem(int id) : TileItem(id) +{ + setMaxDamage(0); + setStackedByData(true); +} + +Icon *WoolTileItem::getIcon(int itemAuxValue) +{ +#ifndef _CONTENT_PACKAGE + if(Tile::tiles[id]) + { + return Tile::tiles[id]->getTexture(2, ColoredTile::getTileDataForItemAuxValue(itemAuxValue)); + } + else +#endif + { + return Tile::wool->getTexture(2, ColoredTile::getTileDataForItemAuxValue(itemAuxValue)); + } +} + +int WoolTileItem::getLevelDataForAuxValue(int auxValue) +{ + return auxValue; +} + +unsigned int WoolTileItem::getDescriptionId(shared_ptr instance) +{ + int tileId = getTileId(); + switch(getTileId()) + { + case Tile::stained_glass_Id: + return GLASS_COLOR_DESCS[ColoredTile::getTileDataForItemAuxValue(instance->getAuxValue())]; + case Tile::stained_glass_pane_Id: + return GLASS_PANE_COLOR_DESCS[ColoredTile::getTileDataForItemAuxValue(instance->getAuxValue())]; + case Tile::clayHardened_colored_Id: + return CLAY_COLOR_DESCS[ColoredTile::getTileDataForItemAuxValue(instance->getAuxValue())]; + case Tile::woolCarpet_Id: + return CARPET_COLOR_DESCS[ColoredTile::getTileDataForItemAuxValue(instance->getAuxValue())]; + case Tile::wool_Id: + default: + return COLOR_DESCS[ColoredTile::getTileDataForItemAuxValue(instance->getAuxValue())]; + }; +} diff --git a/Minecraft.World/WoolTileItem.h b/Minecraft.World/WoolTileItem.h new file mode 100644 index 00000000..49af2142 --- /dev/null +++ b/Minecraft.World/WoolTileItem.h @@ -0,0 +1,20 @@ +#pragma once +using namespace std; + +#include "TileItem.h" + +class WoolTileItem : public TileItem +{ +public: + static const unsigned int COLOR_DESCS[]; + static const unsigned int CARPET_COLOR_DESCS[]; + static const unsigned int CLAY_COLOR_DESCS[]; + static const unsigned int GLASS_COLOR_DESCS[]; + static const unsigned int GLASS_PANE_COLOR_DESCS[]; + + WoolTileItem(int id); + + virtual Icon *getIcon(int itemAuxValue); + virtual int getLevelDataForAuxValue(int auxValue); + virtual unsigned int getDescriptionId(shared_ptr instance); +}; \ No newline at end of file diff --git a/Minecraft.World/WorkbenchTile.cpp b/Minecraft.World/WorkbenchTile.cpp index 7af19755..82193b69 100644 --- a/Minecraft.World/WorkbenchTile.cpp +++ b/Minecraft.World/WorkbenchTile.cpp @@ -40,5 +40,6 @@ bool WorkbenchTile::use(Level *level, int x, int y, int z, shared_ptr pl return true; } player->startCrafting(x, y, z); + //player->openFireworks(x, y, z); return true; } \ No newline at end of file diff --git a/Minecraft.World/WorldlyContainer.h b/Minecraft.World/WorldlyContainer.h new file mode 100644 index 00000000..6141dc1b --- /dev/null +++ b/Minecraft.World/WorldlyContainer.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Container.h" + +class WorldlyContainer : public Container +{ +public: + virtual intArray getSlotsForFace(int face) = 0; + virtual bool canPlaceItemThroughFace(int slot, shared_ptr item, int face) = 0; + virtual bool canTakeItemThroughFace(int slot, shared_ptr item, int face) = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/WrittenBookItem.h b/Minecraft.World/WrittenBookItem.h new file mode 100644 index 00000000..74648558 --- /dev/null +++ b/Minecraft.World/WrittenBookItem.h @@ -0,0 +1,82 @@ +#pragma once + +/* +class WrittenBookItem extends Item { + + public static final int TITLE_LENGTH = 16; + public static final int PAGE_LENGTH = 256; + public static final int MAX_PAGES = 50; + public static final String TAG_TITLE = "title"; + public static final String TAG_AUTHOR = "author"; + public static final String TAG_PAGES = "pages"; + + public WrittenBookItem(int id) { + super(id); + setMaxStackSize(1); + } + + public static boolean makeSureTagIsValid(CompoundTag bookTag) { + + if (!WritingBookItem.makeSureTagIsValid(bookTag)) { + return false; + } + + if (!bookTag.contains(TAG_TITLE)) { + return false; + } + String title = bookTag.getString(TAG_TITLE); + if (title == null || title.length() > TITLE_LENGTH) { + return false; + } + + if (!bookTag.contains(TAG_AUTHOR)) { + return false; + } + + return true; + } + + @Override + public String getHoverName(ItemInstance itemInstance) { + if (itemInstance.hasTag()) { + CompoundTag itemTag = itemInstance.getTag(); + + StringTag titleTag = (StringTag) itemTag.get(TAG_TITLE); + if (titleTag != null) { + return titleTag.toString(); + } + } + return super.getHoverName(itemInstance); + } + + @Override + public void appendHoverText(ItemInstance itemInstance, Player player, List lines, boolean advanced) { + + if (itemInstance.hasTag()) { + CompoundTag itemTag = itemInstance.getTag(); + + StringTag authorTag = (StringTag) itemTag.get(TAG_AUTHOR); + if (authorTag != null) { + lines.add(ChatFormatting.GRAY + String.format(I18n.get("book.byAuthor", authorTag.data))); + } + } + } + + @Override + public ItemInstance use(ItemInstance itemInstance, Level level, Player player) { + player.openItemInstanceGui(itemInstance); + return itemInstance; + } + + @Override + public boolean shouldOverrideMultiplayerNBT() { + return true; + } + + @Override + public boolean isFoil(ItemInstance itemInstance) { + return true; + } + +}; +*/ \ No newline at end of file diff --git a/Minecraft.World/Zombie.cpp b/Minecraft.World/Zombie.cpp index b167635f..df9d5c6b 100644 --- a/Minecraft.World/Zombie.cpp +++ b/Minecraft.World/Zombie.cpp @@ -3,81 +3,81 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.damagesource.h" #include "net.minecraft.world.effect.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" #include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.npc.h" #include "net.minecraft.world.entity.player.h" #include "Zombie.h" #include "GenericStats.h" #include "..\Minecraft.Client\Textures.h" #include "net.minecraft.world.entity.h" +#include "JavaMath.h" #include "SoundTypes.h" + Attribute *Zombie::SPAWN_REINFORCEMENTS_CHANCE = (new RangedAttribute(eAttributeId_ZOMBIE_SPAWNREINFORCEMENTS, 0, 0, 1)); + AttributeModifier *Zombie::SPEED_MODIFIER_BABY = new AttributeModifier(eModifierId_MOB_ZOMBIE_BABYSPEED, 0.5f, AttributeModifier::OPERATION_MULTIPLY_BASE); + +const float Zombie::ZOMBIE_LEADER_CHANCE = 0.05f; + + Zombie::Zombie(Level *level) : Monster( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_ZOMBIE; // 4J was L"/mob/zombie.png"; - runSpeed = 0.23f; - attackDamage = 4; + registerAttributes(); + setHealth(getMaxHealth()); villagerConversionTime = 0; - - registeredBBWidth = -1; - registeredBBHeight = 0; - - setSize(bbWidth, bbHeight); getNavigation()->setCanOpenDoors(true); goalSelector.addGoal(0, new FloatGoal(this)); goalSelector.addGoal(1, new BreakDoorGoal(this)); - goalSelector.addGoal(2, new MeleeAttackGoal(this, eTYPE_PLAYER, runSpeed, false)); - goalSelector.addGoal(3, new MeleeAttackGoal(this, eTYPE_VILLAGER, runSpeed, true)); - goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, runSpeed)); - goalSelector.addGoal(5, new MoveThroughVillageGoal(this, runSpeed, false)); - goalSelector.addGoal(6, new RandomStrollGoal(this, runSpeed)); + goalSelector.addGoal(2, new MeleeAttackGoal(this, eTYPE_PLAYER, 1.0, false)); + goalSelector.addGoal(3, new MeleeAttackGoal(this, eTYPE_VILLAGER, 1.0, true)); + goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, 1.0)); + goalSelector.addGoal(5, new MoveThroughVillageGoal(this, 1.0, false)); + goalSelector.addGoal(6, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(7, new LookAtPlayerGoal(this, typeid(Player), 8)); goalSelector.addGoal(7, new RandomLookAroundGoal(this)); - targetSelector.addGoal(1, new HurtByTargetGoal(this, false)); - targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, typeid(Player), 16, 0, true)); - targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, typeid(Villager), 16, 0, false)); + targetSelector.addGoal(1, new HurtByTargetGoal(this, true)); + targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, typeid(Player), 0, true)); + targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, typeid(Villager), 0, false)); } -void Zombie::defineSynchedData() +void Zombie::registerAttributes() { - Monster::defineSynchedData(); + Monster::registerAttributes(); - getEntityData()->define(DATA_BABY_ID, (byte) 0); - getEntityData()->define(DATA_VILLAGER_ID, (byte) 0); - getEntityData()->define(DATA_CONVERTING_ID, (byte) 0); -} + // 4J Stu - Don't make it so far! + //getAttribute(SharedMonsterAttributes::FOLLOW_RANGE)->setBaseValue(40); -float Zombie::getWalkingSpeedModifier() -{ - return Monster::getWalkingSpeedModifier() * (isBaby() ? 1.5f : 1.0f); -} + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.23f); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(3); -int Zombie::getTexture() -{ - return isVillager() ? TN_MOB_ZOMBIE_VILLAGER : TN_MOB_ZOMBIE; + getAttributes()->registerAttribute(SPAWN_REINFORCEMENTS_CHANCE)->setBaseValue(random->nextDouble() * 0.10f); } -int Zombie::getMaxHealth() +void Zombie::defineSynchedData() { - return 20; + Monster::defineSynchedData(); + + getEntityData()->define(DATA_BABY_ID, (byte) 0); + getEntityData()->define(DATA_VILLAGER_ID, (byte) 0); + getEntityData()->define(DATA_CONVERTING_ID, (byte) 0); } int Zombie::getArmorValue() { - return 2; + int value = Monster::getArmorValue() + 2; + if (value > 20) value = 20; + return value; } bool Zombie::useNewAi() @@ -92,8 +92,17 @@ bool Zombie::isBaby() void Zombie::setBaby(bool baby) { - getEntityData()->set(DATA_BABY_ID, (byte) 1); - updateSize(isBaby()); + getEntityData()->set(DATA_BABY_ID, (byte) (baby ? 1 : 0)); + + if (level != NULL && !level->isClientSide) + { + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + speed->removeModifier(SPEED_MODIFIER_BABY); + if (baby) + { + speed->addModifier(new AttributeModifier(*SPEED_MODIFIER_BABY)); + } + } } bool Zombie::isVillager() @@ -108,21 +117,83 @@ void Zombie::setVillager(bool villager) void Zombie::aiStep() { - if(level->isClientSide) - { - updateSize(isBaby()); - } - else if (level->isDay() && !level->isClientSide && !isBaby()) + if (level->isDay() && !level->isClientSide && !isBaby()) { float br = getBrightness(1); - if (br > 0.5f && random->nextFloat() * 30 < (br - 0.4f) * 2 && level->canSeeSky( Mth::floor(x), Mth::floor(y), Mth::floor(z))) + if (br > 0.5f && random->nextFloat() * 30 < (br - 0.4f) * 2 && level->canSeeSky(Mth::floor(x), (int)floor( y + 0.5 ), Mth::floor(z))) { - setOnFire(8); + bool burn = true; + + shared_ptr helmet = getCarried(SLOT_HELM); + if (helmet != NULL) + { + if (helmet->isDamageableItem()) + { + helmet->setAuxValue(helmet->getDamageValue() + random->nextInt(2)); + if (helmet->getDamageValue() >= helmet->getMaxDamage()) + { + breakItem(helmet); + setEquippedSlot(SLOT_HELM, nullptr); + } + } + + burn = false; + } + + if (burn) + { + setOnFire(8); + } } } Monster::aiStep(); } +bool Zombie::hurt(DamageSource *source, float dmg) +{ + if (Monster::hurt(source, dmg)) + { + shared_ptr target = getTarget(); + if ( (target == NULL) && getAttackTarget() != NULL && getAttackTarget()->instanceof(eTYPE_LIVINGENTITY) ) target = dynamic_pointer_cast( getAttackTarget() ); + if ( (target == NULL) && source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_LIVINGENTITY) ) target = dynamic_pointer_cast( source->getEntity() ); + + if ( (target != NULL) && level->difficulty >= Difficulty::HARD && random->nextFloat() < getAttribute(SPAWN_REINFORCEMENTS_CHANCE)->getValue()) + { + int x = Mth::floor(this->x); + int y = Mth::floor(this->y); + int z = Mth::floor(this->z); + shared_ptr reinforcement = shared_ptr( new Zombie(level) ); + + for (int i = 0; i < REINFORCEMENT_ATTEMPTS; i++) + { + int xt = x + Mth::nextInt(random, REINFORCEMENT_RANGE_MIN, REINFORCEMENT_RANGE_MAX) * Mth::nextInt(random, -1, 1); + int yt = y + Mth::nextInt(random, REINFORCEMENT_RANGE_MIN, REINFORCEMENT_RANGE_MAX) * Mth::nextInt(random, -1, 1); + int zt = z + Mth::nextInt(random, REINFORCEMENT_RANGE_MIN, REINFORCEMENT_RANGE_MAX) * Mth::nextInt(random, -1, 1); + + if (level->isTopSolidBlocking(xt, yt - 1, zt) && level->getRawBrightness(xt, yt, zt) < 10) + { + reinforcement->setPos(xt, yt, zt); + + if (level->isUnobstructed(reinforcement->bb) && level->getCubes(reinforcement, reinforcement->bb)->empty() && !level->containsAnyLiquid(reinforcement->bb)) + { + level->addEntity(reinforcement); + reinforcement->setTarget(target); + reinforcement->finalizeMobSpawn(NULL); + + getAttribute(SPAWN_REINFORCEMENTS_CHANCE)->addModifier(new AttributeModifier(-0.05f, AttributeModifier::OPERATION_ADDITION)); + reinforcement->getAttribute(SPAWN_REINFORCEMENTS_CHANCE)->addModifier(new AttributeModifier(-0.05f, AttributeModifier::OPERATION_ADDITION)); + break; + } + } + } + } + + return true; + } + + return false; +} + void Zombie::tick() { if (!level->isClientSide && isConverting()) @@ -140,6 +211,21 @@ void Zombie::tick() Monster::tick(); } +bool Zombie::doHurtTarget(shared_ptr target) +{ + bool result = Monster::doHurtTarget(target); + + if (result) + { + if (getCarriedItem() == NULL && isOnFire() && random->nextFloat() < level->difficulty * 0.3f) + { + target->setOnFire(2 * level->difficulty); + } + } + + return result; +} + int Zombie::getAmbientSound() { return eSoundType_MOB_ZOMBIE_AMBIENT; @@ -160,6 +246,11 @@ int Zombie::getDeathLoot() return Item::rotten_flesh_Id; } +void Zombie::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_ZOMBIE_STEP, 0.15f, 1); +} + MobType Zombie::getMobType() { return UNDEAD; @@ -169,18 +260,6 @@ void Zombie::dropRareDeathLoot(int rareLootLevel) { switch (random->nextInt(3)) { -/* case 0: - spawnAtLocation(Item::sword_iron_Id, 1); - break; - case 1: - spawnAtLocation(Item::helmet_iron_Id, 1); - break; - case 2: - spawnAtLocation(Item::ironIngot_Id, 1); - break; - case 3: - spawnAtLocation(Item::shovel_iron_Id, 1); - break;*/ case 0: spawnAtLocation(Item::ironIngot_Id, 1); break; @@ -193,6 +272,24 @@ void Zombie::dropRareDeathLoot(int rareLootLevel) } } +void Zombie::populateDefaultEquipmentSlots() +{ + Monster::populateDefaultEquipmentSlots(); + + if (random->nextFloat() < (level->difficulty == Difficulty::HARD ? 0.05f : 0.01f)) + { + int rand = random->nextInt(3); + if (rand == 0) + { + setEquippedSlot(SLOT_WEAPON, shared_ptr( new ItemInstance(Item::sword_iron)) ); + } + else + { + setEquippedSlot(SLOT_WEAPON, shared_ptr( new ItemInstance(Item::shovel_iron)) ); + } + } +} + void Zombie::addAdditonalSaveData(CompoundTag *tag) { Monster::addAdditonalSaveData(tag); @@ -211,19 +308,18 @@ void Zombie::readAdditionalSaveData(CompoundTag *tag) if (tag->contains(L"ConversionTime") && tag->getInt(L"ConversionTime") > -1) startConverting(tag->getInt(L"ConversionTime")); } -void Zombie::killed(shared_ptr mob) +void Zombie::killed(shared_ptr mob) { Monster::killed(mob); - if (level->difficulty >= Difficulty::NORMAL && ((mob->GetType() & eTYPE_VILLAGER) == eTYPE_VILLAGER)) + if ( level->difficulty >= Difficulty::NORMAL && (mob->GetType() == eTYPE_VILLAGER) ) // 4J-JEV: Villager isn't a non-terminal class, no need to instanceof. { - if( !level->canCreateMore( GetType(), Level::eSpawnType_Egg) ) return; if (level->difficulty == Difficulty::NORMAL && random->nextBoolean()) return; shared_ptr zombie = shared_ptr(new Zombie(level)); zombie->copyPosition(mob); level->removeEntity(mob); - zombie->finalizeMobSpawn(); + zombie->finalizeMobSpawn(NULL); zombie->setVillager(true); if (mob->isBaby()) zombie->setBaby(true); level->addEntity(zombie); @@ -232,38 +328,64 @@ void Zombie::killed(shared_ptr mob) } } -void Zombie::finalizeMobSpawn() +MobGroupData *Zombie::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param { - // 4J Stu - TODO TU15 -#if 0 - canPickUpLoot = random->nextFloat() < CAN_PICK_UP_LOOT_CHANCES[level->difficulty]; -#endif + groupData = Monster::finalizeMobSpawn(groupData); + float difficulty = level->getDifficulty(x, y, z); + + setCanPickUpLoot(random->nextFloat() < MAX_PICKUP_LOOT_CHANCE * difficulty); + + if (groupData == NULL) + { + groupData = new ZombieGroupData(level->random->nextFloat() < 0.05f, level->random->nextFloat() < 0.05f); + } - if (level->random->nextFloat() < 0.05f) + if ( dynamic_cast( groupData ) != NULL) { - setVillager(true); + ZombieGroupData *zombieData = (ZombieGroupData *) groupData; + + if (zombieData->isVillager) + { + setVillager(true); + } + + if (zombieData->isBaby) + { + setBaby(true); + } } - // 4J Stu - TODO TU15 -#if 0 populateDefaultEquipmentSlots(); populateDefaultEquipmentEnchantments(); - if (getCarried(SLOT_HELM) == null) + if (getCarried(SLOT_HELM) == NULL) { - Calendar cal = level.getCalendar(); - - if (cal.get(Calendar.MONTH) + 1 == 10 && cal.get(Calendar.DAY_OF_MONTH) == 31 && random.nextFloat() < 0.25f) { + // [EB]: We have this code in quite some places, shouldn't we set + // something like this globally? + if (Calendar::GetMonth() + 1 == 10 && Calendar::GetDayOfMonth() == 31 && random->nextFloat() < 0.25f) + { // Halloween! OooOOo! 25% of all skeletons/zombies can wear // pumpkins on their heads. - setEquippedSlot(SLOT_HELM, new ItemInstance(random.nextFloat() < 0.1f ? Tile.litPumpkin : Tile.pumpkin)); + setEquippedSlot(SLOT_HELM, shared_ptr( new ItemInstance(random->nextFloat() < 0.1f ? Tile::litPumpkin : Tile::pumpkin) )); dropChances[SLOT_HELM] = 0; } } -#endif + + getAttribute(SharedMonsterAttributes::KNOCKBACK_RESISTANCE)->addModifier(new AttributeModifier(random->nextDouble() * 0.05f, AttributeModifier::OPERATION_ADDITION)); + + // 4J Stu - Take this out, it's not good and nobody will notice. Also not great for performance. + //getAttribute(SharedMonsterAttributes::FOLLOW_RANGE)->addModifier(new AttributeModifier(random->nextDouble() * 1.50f, AttributeModifier::OPERATION_MULTIPLY_TOTAL)); + + if (random->nextFloat() < difficulty * ZOMBIE_LEADER_CHANCE) + { + getAttribute(SPAWN_REINFORCEMENTS_CHANCE)->addModifier(new AttributeModifier(random->nextDouble() * 0.25f + 0.50f, AttributeModifier::OPERATION_ADDITION)); + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->addModifier(new AttributeModifier(random->nextDouble() * 3.0f + 1.0f, AttributeModifier::OPERATION_MULTIPLY_TOTAL)); + } + + return groupData; } -bool Zombie::interact(shared_ptr player) +bool Zombie::mobInteract(shared_ptr player) { shared_ptr item = player->getSelectedItem(); @@ -304,7 +426,7 @@ void Zombie::handleEntityEvent(byte id) { if (id == EntityEvent::ZOMBIE_CONVERTING) { - level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_MOB_ZOMBIE_REMEDY, 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f);//, false); + level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_MOB_ZOMBIE_REMEDY, 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f, false); } else { @@ -312,6 +434,11 @@ void Zombie::handleEntityEvent(byte id) } } +bool Zombie::removeWhenFarAway() +{ + return !isConverting(); +} + bool Zombie::isConverting() { return getEntityData()->getByte(DATA_CONVERTING_ID) == (byte) 1; @@ -321,7 +448,7 @@ void Zombie::finishConversion() { shared_ptr villager = shared_ptr(new Villager(level)); villager->copyPosition(shared_from_this()); - villager->finalizeMobSpawn(); + villager->finalizeMobSpawn(NULL); villager->setRewardPlayersInVillage(); if (isBaby()) villager->setAge(-20 * 60 * 20); level->removeEntity(shared_from_this()); @@ -359,25 +486,8 @@ int Zombie::getConversionProgress() return amount; } -void Zombie::updateSize(bool isBaby) +Zombie::ZombieGroupData::ZombieGroupData(bool baby, bool villager) { - internalSetSize(isBaby ? .5f : 1.0f); -} - -void Zombie::setSize(float w, float h) -{ - bool inited = registeredBBWidth > 0; - - registeredBBWidth = w; - registeredBBHeight = h; - - if (!inited) - { - internalSetSize(1.0f); - } -} - -void Zombie::internalSetSize(float scale) -{ - PathfinderMob::setSize(registeredBBWidth * scale, registeredBBHeight * scale); -} + isBaby = baby; + isVillager = villager; +} \ No newline at end of file diff --git a/Minecraft.World/Zombie.h b/Minecraft.World/Zombie.h index 237db15b..d79df182 100644 --- a/Minecraft.World/Zombie.h +++ b/Minecraft.World/Zombie.h @@ -3,6 +3,7 @@ using namespace std; #include "Monster.h" #include "SharedConstants.h" +#include "MobGroupData.h" class Zombie : public Monster { @@ -10,14 +11,25 @@ private: static const int VILLAGER_CONVERSION_WAIT_MIN = SharedConstants::TICKS_PER_SECOND * 60 * 3; static const int VILLAGER_CONVERSION_WAIT_MAX = SharedConstants::TICKS_PER_SECOND * 60 * 5; +protected: + static Attribute *SPAWN_REINFORCEMENTS_CHANCE; + +private: + static AttributeModifier *SPEED_MODIFIER_BABY; + + static const int DATA_BABY_ID = 12; static const int DATA_VILLAGER_ID = 13; static const int DATA_CONVERTING_ID = 14; - int villagerConversionTime; +public: + static const float ZOMBIE_LEADER_CHANCE; + static const int REINFORCEMENT_ATTEMPTS = 50; + static const int REINFORCEMENT_RANGE_MAX = 40; + static const int REINFORCEMENT_RANGE_MIN = 7; - float registeredBBWidth; - float registeredBBHeight; +private: + int villagerConversionTime; public: static const int MAX_SPECIAL_BLOCKS_COUNT = 14; @@ -28,61 +40,71 @@ public: static Entity *create(Level *level) { return new Zombie(level); } Zombie(Level *level); - virtual float getWalkingSpeedModifier(); protected: + virtual void registerAttributes(); virtual void defineSynchedData(); public: - virtual int getTexture(); - virtual int getMaxHealth(); - int getArmorValue(); + virtual int getArmorValue(); protected: virtual bool useNewAi(); public: - bool isBaby(); - void setBaby(bool baby); - bool isVillager(); - void setVillager(bool villager); - virtual void aiStep(); - virtual void tick(); - + virtual bool isBaby(); + virtual void setBaby(bool baby); + virtual bool isVillager(); + virtual void setVillager(bool villager); + virtual void aiStep(); + virtual bool hurt(DamageSource *source, float dmg); + virtual void tick(); + virtual bool doHurtTarget(shared_ptr target); + protected: virtual int getAmbientSound(); - virtual int getHurtSound(); - virtual int getDeathSound(); - virtual int getDeathLoot(); + virtual int getHurtSound(); + virtual int getDeathSound(); + virtual int getDeathLoot(); + virtual void playStepSound(int xt, int yt, int zt, int t); public: - MobType getMobType(); + virtual MobType getMobType(); protected: virtual void dropRareDeathLoot(int rareLootLevel); + virtual void populateDefaultEquipmentSlots(); public: virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); - void killed(shared_ptr mob); - virtual void finalizeMobSpawn(); - bool interact(shared_ptr player); + virtual void killed(shared_ptr mob); + virtual MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param + virtual bool mobInteract(shared_ptr player); protected: - void startConverting(int time); + virtual void startConverting(int time); public: - void handleEntityEvent(byte id); - bool isConverting(); + virtual void handleEntityEvent(byte id); protected: - void finishConversion(); - int getConversionProgress(); + virtual bool removeWhenFarAway(); public: - virtual void updateSize(bool isBaby); + virtual bool isConverting(); protected: - virtual void setSize(float w, float h); - void internalSetSize(float scale); + virtual void finishConversion(); + virtual int getConversionProgress(); + +private: + class ZombieGroupData : public MobGroupData + { + public: + bool isBaby; + bool isVillager; + + ZombieGroupData(bool baby, bool villager); + }; }; diff --git a/Minecraft.World/net.minecraft.commands.common.h b/Minecraft.World/net.minecraft.commands.common.h index aa2e2f6f..83b0dca5 100644 --- a/Minecraft.World/net.minecraft.commands.common.h +++ b/Minecraft.World/net.minecraft.commands.common.h @@ -1,6 +1,7 @@ #pragma once #include "DefaultGameModeCommand.h" +#include "EffectCommand.h" #include "EnchantItemCommand.h" #include "ExperienceCommand.h" #include "GameModeCommand.h" diff --git a/Minecraft.World/net.minecraft.core.h b/Minecraft.World/net.minecraft.core.h new file mode 100644 index 00000000..d6778989 --- /dev/null +++ b/Minecraft.World/net.minecraft.core.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Behavior.h" +#include "BlockSource.h" +#include "BlockSourceImpl.h" +#include "BehaviorRegistry.h" +#include "DispenseItemBehavior.h" +#include "DefaultDispenseItemBehavior.h" +#include "AbstractProjectileDispenseBehavior.h" +#include "ItemDispenseBehaviors.h" +#include "FacingEnum.h" +#include "LocatableSource.h" +#include "Location.h" +#include "Position.h" +#include "PositionImpl.h" +#include "Source.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.network.packet.h b/Minecraft.World/net.minecraft.network.packet.h index b7bfee5d..c1d52d14 100644 --- a/Minecraft.World/net.minecraft.network.packet.h +++ b/Minecraft.World/net.minecraft.network.packet.h @@ -45,7 +45,7 @@ #include "SetEntityMotionPacket.h" #include "SetEquippedItemPacket.h" #include "SetHealthPacket.h" -#include "SetRidingPacket.h" +#include "SetEntityLinkPacket.h" #include "SetSpawnPositionPacket.h" #include "SetTimePacket.h" #include "SignUpdatePacket.h" @@ -84,6 +84,15 @@ #include "ServerAuthDataPacket.h" #include "TileDestructionPacket.h" +// 1.6.4 +#include "LevelParticlesPacket.h" +#include "SetDisplayObjectivePacket.h" +#include "SetObjectivePacket.h" +#include "SetPlayerTeamPacket.h" +#include "SetScorePacket.h" +#include "TileEditorOpenPacket.h" +#include "UpdateAttributesPacket.h" + // 4J Added #include "CraftItemPacket.h" #include "TradeItemPacket.h" diff --git a/Minecraft.World/net.minecraft.world.ContainerListener.h b/Minecraft.World/net.minecraft.world.ContainerListener.h index 1ac036a5..8323c530 100644 --- a/Minecraft.World/net.minecraft.world.ContainerListener.h +++ b/Minecraft.World/net.minecraft.world.ContainerListener.h @@ -11,8 +11,8 @@ namespace net_minecraft_world { class ContainerListener { - friend class SimpleContainer; + friend class ::SimpleContainer; private: - virtual void containerChanged(shared_ptr simpleContainer) = 0; + virtual void containerChanged() = 0; }; } \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.damagesource.h b/Minecraft.World/net.minecraft.world.damagesource.h index 03f354ec..df0ccd8f 100644 --- a/Minecraft.World/net.minecraft.world.damagesource.h +++ b/Minecraft.World/net.minecraft.world.damagesource.h @@ -1,5 +1,7 @@ #pragma once +#include "CombatEntry.h" +#include "CombatTracker.h" #include "DamageSource.h" #include "EntityDamageSource.h" #include "IndirectEntityDamageSource.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.effect.h b/Minecraft.World/net.minecraft.world.effect.h index f5bd448f..5dad4fe9 100644 --- a/Minecraft.World/net.minecraft.world.effect.h +++ b/Minecraft.World/net.minecraft.world.effect.h @@ -1,5 +1,8 @@ #pragma once +#include "AbsoptionMobEffect.h" +#include "AttackDamageMobEffect.h" +#include "HealthBoostMobEffect.h" #include "MobEffect.h" #include "InstantenousMobEffect.h" #include "MobEffectInstance.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.entity.ai.attributes.h b/Minecraft.World/net.minecraft.world.entity.ai.attributes.h new file mode 100644 index 00000000..783f48b5 --- /dev/null +++ b/Minecraft.World/net.minecraft.world.entity.ai.attributes.h @@ -0,0 +1,10 @@ +#pragma once + +#include "Attribute.h" +#include "AttributeInstance.h" +#include "AttributeModifier.h" +#include "BaseAttribute.h" +#include "BaseAttributeMap.h" +#include "ModifiableAttributeInstance.h" +#include "RangedAttribute.h" +#include "ServersideAttributeMap.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.entity.ai.goal.h b/Minecraft.World/net.minecraft.world.entity.ai.goal.h index 5944daf2..73273e13 100644 --- a/Minecraft.World/net.minecraft.world.entity.ai.goal.h +++ b/Minecraft.World/net.minecraft.world.entity.ai.goal.h @@ -1,7 +1,6 @@ #pragma once #include "Goal.h" -#include "ArrowAttackGoal.h" #include "AvoidPlayerGoal.h" #include "BegGoal.h" #include "BreakDoorGoal.h" @@ -27,13 +26,15 @@ #include "OcelotSitOnTileGoal.h" #include "OfferFlowerGoal.h" #include "OpenDoorGoal.h" -#include "OzelotAttackGoal.h" +#include "OcelotAttackGoal.h" #include "PanicGoal.h" #include "PlayGoal.h" #include "RandomLookAroundGoal.h" #include "RandomStrollGoal.h" +#include "RangedAttackGoal.h" #include "RestrictOpenDoorGoal.h" #include "RestrictSunGoal.h" +#include "RunAroundLikeCrazyGoal.h" #include "SitGoal.h" #include "SwellGoal.h" #include "TakeFlowerGoal.h" diff --git a/Minecraft.World/net.minecraft.world.entity.ambient.h b/Minecraft.World/net.minecraft.world.entity.ambient.h new file mode 100644 index 00000000..924d413a --- /dev/null +++ b/Minecraft.World/net.minecraft.world.entity.ambient.h @@ -0,0 +1,4 @@ +#pragma once + +#include "AmbientCreature.h" +#include "Bat.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.entity.animal.h b/Minecraft.World/net.minecraft.world.entity.animal.h index efeb2c96..2bcb81f1 100644 --- a/Minecraft.World/net.minecraft.world.entity.animal.h +++ b/Minecraft.World/net.minecraft.world.entity.animal.h @@ -15,6 +15,8 @@ #include "SnowMan.h" // 1.2.3 -#include "TamableAnimal.h" -#include "Ozelot.h" -#include "VillagerGolem.h" \ No newline at end of file +#include "Ocelot.h" +#include "VillagerGolem.h" + +// 1.6.4 +#include "EntityHorse.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.entity.boss.h b/Minecraft.World/net.minecraft.world.entity.boss.h index 15aa271a..76409201 100644 --- a/Minecraft.World/net.minecraft.world.entity.boss.h +++ b/Minecraft.World/net.minecraft.world.entity.boss.h @@ -1,4 +1,5 @@ #pragma once #include "BossMob.h" -#include "BossMobPart.h" \ No newline at end of file +#include "MultiEntityMob.h" +#include "MultiEntityMobPart.h" diff --git a/Minecraft.World/net.minecraft.world.entity.h b/Minecraft.World/net.minecraft.world.entity.h index 9aa62632..2ba64218 100644 --- a/Minecraft.World/net.minecraft.world.entity.h +++ b/Minecraft.World/net.minecraft.world.entity.h @@ -23,4 +23,12 @@ #include "ItemFrame.h" // 1.2.3 -#include "AgableMob.h" \ No newline at end of file +#include "AgableMob.h" +#include "TamableAnimal.h" + +// 1.6.4 +#include "LeashFenceKnotEntity.h" +#include "MobGroupData.h" +#include "OwnableEntity.h" +#include "EntitySelector.h" +#include "LivingEntity.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.entity.item.h b/Minecraft.World/net.minecraft.world.entity.item.h index e35176bc..575f18b5 100644 --- a/Minecraft.World/net.minecraft.world.entity.item.h +++ b/Minecraft.World/net.minecraft.world.entity.item.h @@ -4,4 +4,11 @@ #include "FallingTile.h" #include "ItemEntity.h" #include "Minecart.h" +#include "MinecartChest.h" +#include "MinecartContainer.h" +#include "MinecartHopper.h" +#include "MinecartFurnace.h" +#include "MinecartRideable.h" +#include "MinecartSpawner.h" +#include "MinecartTNT.h" #include "PrimedTnt.h" diff --git a/Minecraft.World/net.minecraft.world.entity.monster.h b/Minecraft.World/net.minecraft.world.entity.monster.h index 1d6b8495..edeaf925 100644 --- a/Minecraft.World/net.minecraft.world.entity.monster.h +++ b/Minecraft.World/net.minecraft.world.entity.monster.h @@ -18,4 +18,9 @@ // 1.0.1 #include "Blaze.h" -#include "LavaSlime.h" \ No newline at end of file +#include "LavaSlime.h" + +// 1.6.4 +#include "RangedAttackMob.h" +#include "SharedMonsterAttributes.h" +#include "Witch.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.entity.projectile.h b/Minecraft.World/net.minecraft.world.entity.projectile.h index 3e56b04e..f871230a 100644 --- a/Minecraft.World/net.minecraft.world.entity.projectile.h +++ b/Minecraft.World/net.minecraft.world.entity.projectile.h @@ -15,4 +15,10 @@ #include "ThrownExpBottle.h" // Brought forward from 1.2 // Added TU 9 -#include "DragonFireball.h" \ No newline at end of file +#include "DragonFireball.h" + +// 1.6.4 +#include "FireworksRocketEntity.h" +#include "LargeFireball.h" +#include "Projectile.h" +#include "WitherSkull.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.h b/Minecraft.World/net.minecraft.world.h index 4e600b33..8b4f3e34 100644 --- a/Minecraft.World/net.minecraft.world.h +++ b/Minecraft.World/net.minecraft.world.h @@ -10,4 +10,6 @@ // TU10 #include "Icon.h" #include "IconRegister.h" -#include "FlippedIcon.h" \ No newline at end of file +#include "FlippedIcon.h" + +#include "WorldlyContainer.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.inventory.h b/Minecraft.World/net.minecraft.world.inventory.h index a2608dbd..82a8a52d 100644 --- a/Minecraft.World/net.minecraft.world.inventory.h +++ b/Minecraft.World/net.minecraft.world.inventory.h @@ -1,13 +1,18 @@ #pragma once #include "AbstractContainerMenu.h" +#include "AnimalChest.h" #include "ArmorSlot.h" +#include "BeaconMenu.h" #include "net.minecraft.world.inventory.ContainerListener.h" #include "ContainerMenu.h" #include "CraftingContainer.h" #include "CraftingMenu.h" +#include "FireworksMenu.h" #include "FurnaceMenu.h" #include "FurnaceResultSlot.h" +#include "HopperMenu.h" +#include "HorseInventoryMenu.h" #include "InventoryMenu.h" #include "MenuBackup.h" #include "ResultContainer.h" @@ -22,6 +27,6 @@ #include "MerchantMenu.h" #include "MerchantResultSlot.h" #include "PlayerEnderChestContainer.h" -#include "RepairMenu.h" +#include "AnvilMenu.h" #include "RepairContainer.h" #include "RepairResultSlot.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.item.crafting.h b/Minecraft.World/net.minecraft.world.item.crafting.h index ab6a32eb..f547c15e 100644 --- a/Minecraft.World/net.minecraft.world.item.crafting.h +++ b/Minecraft.World/net.minecraft.world.item.crafting.h @@ -6,6 +6,7 @@ #include "ArmorRecipes.h" #include "ClothDyeRecipes.h" #include "FoodRecipies.h" +#include "FireworksRecipe.h" #include "FurnaceRecipes.h" #include "OreRecipies.h" #include "ShapedRecipy.h" diff --git a/Minecraft.World/net.minecraft.world.item.h b/Minecraft.World/net.minecraft.world.item.h index 0300b954..07728069 100644 --- a/Minecraft.World/net.minecraft.world.item.h +++ b/Minecraft.World/net.minecraft.world.item.h @@ -6,7 +6,7 @@ #include "BowItem.h" #include "BowlFoodItem.h" #include "BucketItem.h" -#include "ClothTileItem.h" +#include "WoolTileItem.h" #include "CoalItem.h" #include "ComplexItem.h" #include "DiggerItem.h" @@ -38,14 +38,12 @@ #include "StoneSlabTileItem.h" #include "TileItem.h" #include "TilePlanterItem.h" -#include "TreeTileItem.h" #include "WeaponItem.h" // 1.8.2 #include "AuxDataTileItem.h" #include "ColoredTileItem.h" #include "UseAnim.h" -#include "StoneMonsterTileItem.h" // 1.0.1 #include "BottleItem.h" @@ -57,12 +55,11 @@ #include "Rarity.h" #include "WaterLilyTileItem.h" #include "ExperienceItem.h" // 4J Stu brought forward -#include "SmoothStoneBrickTileItem.h" // 4J Stu brought forward // TU9 #include "FireChargeItem.h" #include "ItemFrame.h" -#include "MonsterPlacerItem.h" +#include "SpawnEggItem.h" #include "MultiTextureTileItem.h" // TU12 @@ -75,6 +72,16 @@ #include "EnchantedBookItem.h" #include "SeedFoodItem.h" +// 1.6.4 +#include "FireworksChargeItem.h" +#include "FireworksItem.h" +#include "LeashItem.h" +#include "NameTagItem.h" +#include "SimpleFoiledItem.h" +#include "SnowItem.h" +#include "EmptyMapItem.h" + // 4J Added #include "ClockItem.h" -#include "CompassItem.h" \ No newline at end of file +#include "CompassItem.h" +#include "HtmlString.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.level.h b/Minecraft.World/net.minecraft.world.level.h index 01d14fcb..e69d423b 100644 --- a/Minecraft.World/net.minecraft.world.level.h +++ b/Minecraft.World/net.minecraft.world.level.h @@ -1,9 +1,12 @@ #pragma once +#include "BaseMobSpawner.h" +#include "BlockDestructionProgress.h" #include "ChunkPos.h" #include "Coord.h" #include "Explosion.h" #include "FoliageColor.h" +#include "GameRules.h" #include "GrassColor.h" #include "LevelConflictException.h" #include "LevelListener.h" @@ -13,13 +16,11 @@ #include "PortalForcer.h" #include "Region.h" #include "TickNextTickData.h" +#include "TileEventData.h" #include "TilePos.h" #include "WaterColor.h" #include "Level.h" #include "LevelType.h" #include "LevelSettings.h" -// TU 10 -#include "BlockDestructionProgress.h" - -#include "TileEventData.h" \ No newline at end of file +#include "Calendar.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.level.levelgen.flat.h b/Minecraft.World/net.minecraft.world.level.levelgen.flat.h new file mode 100644 index 00000000..92b8023c --- /dev/null +++ b/Minecraft.World/net.minecraft.world.level.levelgen.flat.h @@ -0,0 +1,4 @@ +#pragma once + +#include "FlatGeneratorInfo.h" +#include "FlatLayerInfo.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.level.levelgen.structure.h b/Minecraft.World/net.minecraft.world.level.levelgen.structure.h index 2bd9cfa2..e7dae5ea 100644 --- a/Minecraft.World/net.minecraft.world.level.levelgen.structure.h +++ b/Minecraft.World/net.minecraft.world.level.levelgen.structure.h @@ -5,9 +5,13 @@ #include "MineShaftFeature.h" #include "MineShaftPieces.h" #include "MineShaftStart.h" +#include "NetherBridgeFeature.h" +#include "NetherBridgePieces.h" #include "StrongholdFeature.h" #include "StrongholdPieces.h" #include "StructureFeature.h" +#include "StructureFeatureIO.h" +#include "StructureFeatureSavedData.h" #include "StructurePiece.h" #include "StructureStart.h" #include "VillageFeature.h" diff --git a/Minecraft.World/net.minecraft.world.level.redstone.h b/Minecraft.World/net.minecraft.world.level.redstone.h new file mode 100644 index 00000000..8e30ebfc --- /dev/null +++ b/Minecraft.World/net.minecraft.world.level.redstone.h @@ -0,0 +1,3 @@ +#pragma once + +#include "Redstone.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.level.tile.entity.h b/Minecraft.World/net.minecraft.world.level.tile.entity.h index 0b6cb04a..c3209df9 100644 --- a/Minecraft.World/net.minecraft.world.level.tile.entity.h +++ b/Minecraft.World/net.minecraft.world.level.tile.entity.h @@ -1,10 +1,17 @@ #pragma once +#include "BeaconTileEntity.h" #include "BrewingStandTileEntity.h" #include "ChestTileEntity.h" +#include "CommandBlockEntity.h" +#include "ComparatorTileEntity.h" +#include "DaylightDetectorTileEntity.h" #include "DispenserTileEntity.h" +#include "DropperTileEntity.h" #include "EnchantmentTableEntity.h" #include "FurnaceTileEntity.h" +#include "Hopper.h" +#include "HopperTileEntity.h" #include "MobSpawnerTileEntity.h" #include "MusicTileEntity.h" #include "SignTileEntity.h" diff --git a/Minecraft.World/net.minecraft.world.level.tile.h b/Minecraft.World/net.minecraft.world.level.tile.h index f039b000..36c7ac5c 100644 --- a/Minecraft.World/net.minecraft.world.level.tile.h +++ b/Minecraft.World/net.minecraft.world.level.tile.h @@ -3,6 +3,10 @@ #include "Tile.h" #include "AirTile.h" #include "AnvilTile.h" +#include "BaseEntityTile.h" +#include "BasePressurePlateTile.h" +#include "BaseRailTile.h" +#include "BeaconTile.h" #include "BedTile.h" #include "BookshelfTile.h" #include "BrewingStandTile.h" @@ -14,10 +18,13 @@ #include "CauldronTile.h" #include "ChestTile.h" #include "ClayTile.h" -#include "ClothTile.h" #include "CocoaTile.h" +#include "ColoredTile.h" +#include "CommandBlock.h" +#include "ComparatorTile.h" #include "CoralTile.h" #include "CropTile.h" +#include "DaylightDetectorTile.h" #include "DeadBushTile.h" #include "DetectorRailTile.h" #include "DiodeTile.h" @@ -25,6 +32,7 @@ #include "DirtTile.h" #include "DispenserTile.h" #include "DoorTile.h" +#include "DropperTile.h" #include "EggTile.h" #include "EnchantmentTableTile.h" #include "EnderChestTile.h" @@ -36,19 +44,21 @@ #include "FlowerPotTile.h" #include "FurnaceTile.h" #include "GlassTile.h" +#include "Glowstonetile.h" #include "GrassTile.h" #include "GravelTile.h" +#include "HalfSlabTile.h" #include "HalfTransparentTile.h" +#include "HayBlockTile.h" #include "HeavyTile.h" -#include "HellSandTile.h" -#include "HellStoneTile.h" +#include "HopperTile.h" #include "HugeMushroomTile.h" #include "IceTile.h" +#include "JukeboxTile.h" #include "LadderTile.h" #include "LeafTile.h" #include "LevelEvent.h" #include "LeverTile.h" -#include "LightGemTile.h" #include "LiquidTile.h" #include "LiquidTileDynamic.h" #include "LiquidTileStatic.h" @@ -57,9 +67,10 @@ #include "MetalTile.h" #include "MobSpawnerTile.h" #include "Mushroom.h" -#include "MusicTile.h" +#include "NoteBlockTile.h" #include "MycelTile.h" -#include "NetherStalkTile.h" +#include "NetherrackTile.h" +#include "NetherWartTile.h" #include "NotGateTile.h" #include "ObsidianTile.h" #include "OreTile.h" @@ -67,25 +78,31 @@ #include "PistonExtensionTile.h" #include "PortalTile.h" #include "PotatoTile.h" +#include "PoweredMetalTile.h" +#include "PoweredRailTile.h" #include "PressurePlateTile.h" #include "PumpkinTile.h" #include "QuartzBlockTile.h" #include "RailTile.h" -#include "RecordPlayerTile.h" #include "RedlightTile.h" #include "RedStoneDustTile.h" #include "RedStoneOreTile.h" #include "ReedTile.h" +#include "RepeaterTile.h" +#include "RotatedPillarTile.h" #include "SandStoneTile.h" #include "Sapling.h" #include "SignTile.h" #include "SkullTile.h" #include "SmoothStoneBrickTile.h" #include "SnowTile.h" +#include "SoulSandTile.h" #include "Sponge.h" -#include "SpringTile.h" +#include "StainedGlassBlock.h" +#include "StainedGlassPaneBlock.h" #include "StairTile.h" #include "StemTile.h" +#include "StoneButtonTile.h" #include "StoneMonsterTile.h" #include "StoneSlabTile.h" #include "StoneTile.h" @@ -105,6 +122,8 @@ #include "WallTile.h" #include "WaterLilyTile.h" #include "WebTile.h" +#include "WeightedPressurePlateTile.h" +#include "WoodButtonTile.h" #include "WorkbenchTile.h" #include "WoodTile.h" #include "HalfSlabTile.h" diff --git a/Minecraft.World/net.minecraft.world.scores.criteria.h b/Minecraft.World/net.minecraft.world.scores.criteria.h new file mode 100644 index 00000000..fd8c8640 --- /dev/null +++ b/Minecraft.World/net.minecraft.world.scores.criteria.h @@ -0,0 +1,5 @@ +#pragma once + +#include "DummyCriteria.h" +#include "HealthCriteria.h" +#include "ObjectiveCriteria.h" \ No newline at end of file diff --git a/Minecraft.World/net.minecraft.world.scores.h b/Minecraft.World/net.minecraft.world.scores.h new file mode 100644 index 00000000..0dccff46 --- /dev/null +++ b/Minecraft.World/net.minecraft.world.scores.h @@ -0,0 +1,9 @@ +#pragma once + +#include "Objective.h" +#include "PlayerTeam.h" +#include "Score.h" +#include "Scoreboard.h" +#include "ScoreboardSaveData.h" +#include "ScoreHolder.h" +#include "Team.h" \ No newline at end of file diff --git a/Minecraft.World/stdafx.h b/Minecraft.World/stdafx.h index 614f997b..48e52544 100644 --- a/Minecraft.World/stdafx.h +++ b/Minecraft.World/stdafx.h @@ -183,8 +183,8 @@ void MemSect(int sect); #include "..\Minecraft.Client\Common\Network\GameNetworkManager.h" // #ifdef _XBOX -#include "..\Minecraft.Client\Common\UI\UIEnums.h" #include "..\Minecraft.Client\Common\App_defines.h" +#include "..\Minecraft.Client\Common\UI\UIEnums.h" #include "..\Minecraft.Client\Common\App_enums.h" #include "..\Minecraft.Client\Common\Tutorial\TutorialEnum.h" #include "..\Minecraft.Client\Common\App_structs.h" diff --git a/Minecraft.World/system.cpp b/Minecraft.World/system.cpp index cce04bdc..b6dd56d9 100644 --- a/Minecraft.World/system.cpp +++ b/Minecraft.World/system.cpp @@ -124,10 +124,9 @@ __int64 System::currentTimeMillis() __int64 System::currentRealTimeMillis() { #ifdef __PSVITA__ - SceDateTime Time; - sceRtcGetCurrentClockLocalTime(&Time); - __int64 systTime = (((((((Time.day * 24) + Time.hour) * 60) + Time.minute) * 60) + Time.second) * 1000) + (Time.microsecond / 1000); - return systTime; + SceFiosDate fileTime = sceFiosDateGetCurrent(); + + return fileTime/1000000; #else return currentTimeMillis(); #endif diff --git a/Minecraft.World/x64headers/extraX64.h b/Minecraft.World/x64headers/extraX64.h index d06b2420..2205ae05 100644 --- a/Minecraft.World/x64headers/extraX64.h +++ b/Minecraft.World/x64headers/extraX64.h @@ -50,9 +50,9 @@ typedef SQRNetworkManager::PresenceSyncInfo INVITE_INFO; #include #include #include -#include "..\..\Minecraft.Client\PSVita\PSVita_PlayerUID.h" #include "..\..\Minecraft.Client\PSVita\Network\SQRNetworkManager_Vita.h" #include "..\..\Minecraft.Client\PSVita\Network\SQRNetworkManager_AdHoc_Vita.h" +#include "..\..\Minecraft.Client\PSVita\4JLibs\inc\4J_Profile.h" typedef SQRNetworkManager_Vita::SessionID SessionID; typedef SQRNetworkManager_Vita::PresenceSyncInfo INVITE_INFO; @@ -70,7 +70,7 @@ class INVITE_INFO; #endif // __PS3__ -#ifndef _DURANGO +#if !(defined _DURANGO || defined __PSVITA__) typedef PlayerUID *PPlayerUID; #endif typedef struct _XUIOBJ* HXUIOBJ; @@ -332,6 +332,7 @@ void XSetThreadProcessor(HANDLE a, int b); const int QNET_SENDDATA_LOW_PRIORITY = 0; const int QNET_SENDDATA_SECONDARY = 0; + #if defined(__PS3__) || defined(__ORBIS__) || defined(_DURANGO) || defined(__PSVITA__) #define INVALID_XUID PlayerUID() #else @@ -560,7 +561,7 @@ const int XC_LANGUAGE_DUTCH =0x10; const int XC_LANGUAGE_SCHINESE =0x11; // for Sony -const int XC_LANGUAGE_LATINAMERICANSPANISH =0xF0; +// const int XC_LANGUAGE_LATINAMERICANSPANISH =0xF0; // 4J-JEV: Now differentiated via XC_LOCALE_LATIN_AMERICA const int XC_LANGUAGE_FINISH =0xF1; const int XC_LANGUAGE_GREEK =0xF2; const int XC_LANGUAGE_DANISH =0xF3; diff --git a/README.md b/README.md index f32b11fc..abbbb2d5 100644 --- a/README.md +++ b/README.md @@ -59,3 +59,7 @@ cmake --build build --config Debug --target MinecraftClient - Builds for other platforms have not been tested and are most likely non-functional - There are some render bugs in the Release mode build + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=smartcmd/MinecraftConsoles&type=date&legend=top-left)](https://www.star-history.com/?spm=a2c6h.12873639.article-detail.7.7b9d7fabjNxTRk#smartcmd/MinecraftConsoles&type=date&legend=top-left) diff --git a/cmake/ClientSources.cmake b/cmake/ClientSources.cmake index dae96fd4..f56b7ef0 100644 --- a/cmake/ClientSources.cmake +++ b/cmake/ClientSources.cmake @@ -1,21 +1,25 @@ set(MINECRAFT_CLIENT_SOURCES "AbstractTexturePack.cpp" - "crt_compat.cpp" "AchievementPopup.cpp" "AchievementScreen.cpp" "AllowAllCuller.cpp" "ArchiveFile.cpp" "ArrowRenderer.cpp" + "BatModel.cpp" + "BatRenderer.cpp" + "BeaconRenderer.cpp" "BlazeModel.cpp" "BlazeRenderer.cpp" "BoatModel.cpp" "BoatRenderer.cpp" "BookModel.cpp" + "BossMobGuiInfo.cpp" "BreakingItemParticle.cpp" "BubbleParticle.cpp" "BufferedImage.cpp" "Button.cpp" "Camera.cpp" + "CaveSpiderRenderer.cpp" "ChatScreen.cpp" "ChestModel.cpp" "ChestRenderer.cpp" @@ -29,6 +33,8 @@ set(MINECRAFT_CLIENT_SOURCES "Common/Audio/SoundEngine.cpp" "Common/Audio/SoundNames.cpp" "Common/Colours/ColourTable.cpp" + "Common/ConsoleGameMode.cpp" + "Common/Console_Utils.cpp" "Common/Consoles_App.cpp" "Common/DLC/DLCAudioFile.cpp" "Common/DLC/DLCCapeFile.cpp" @@ -49,6 +55,8 @@ set(MINECRAFT_CLIENT_SOURCES "Common/GameRules/CollectItemRuleDefinition.cpp" "Common/GameRules/CompleteAllRuleDefinition.cpp" "Common/GameRules/CompoundGameRuleDefinition.cpp" + "Common/GameRules/ConsoleGenerateStructure.cpp" + "Common/GameRules/ConsoleSchematicFile.cpp" "Common/GameRules/GameRule.cpp" "Common/GameRules/GameRuleDefinition.cpp" "Common/GameRules/GameRuleManager.cpp" @@ -60,12 +68,11 @@ set(MINECRAFT_CLIENT_SOURCES "Common/GameRules/StartFeature.cpp" "Common/GameRules/UpdatePlayerRuleDefinition.cpp" "Common/GameRules/UseTileRuleDefinition.cpp" - "Common/GameRules/ConsoleGenerateStructure.cpp" - "Common/GameRules/ConsoleSchematicFile.cpp" "Common/GameRules/XboxStructureActionGenerateBox.cpp" "Common/GameRules/XboxStructureActionPlaceBlock.cpp" "Common/GameRules/XboxStructureActionPlaceContainer.cpp" "Common/GameRules/XboxStructureActionPlaceSpawner.cpp" + "Common/Leaderboards/LeaderboardInterface.cpp" "Common/Leaderboards/LeaderboardManager.cpp" "Common/Network/GameNetworkManager.cpp" "Common/Network/PlatformNetworkManagerStub.cpp" @@ -84,6 +91,7 @@ set(MINECRAFT_CLIENT_SOURCES "Common/Tutorial/FullTutorial.cpp" "Common/Tutorial/FullTutorialActiveTask.cpp" "Common/Tutorial/FullTutorialMode.cpp" + "Common/Tutorial/HorseChoiceTask.cpp" "Common/Tutorial/InfoTask.cpp" "Common/Tutorial/InputConstraint.cpp" "Common/Tutorial/LookAtEntityHint.cpp" @@ -91,6 +99,7 @@ set(MINECRAFT_CLIENT_SOURCES "Common/Tutorial/PickupTask.cpp" "Common/Tutorial/ProcedureCompoundTask.cpp" "Common/Tutorial/ProgressFlagTask.cpp" + "Common/Tutorial/RideEntityTask.cpp" "Common/Tutorial/StatTask.cpp" "Common/Tutorial/TakeItemHint.cpp" "Common/Tutorial/Tutorial.cpp" @@ -101,100 +110,112 @@ set(MINECRAFT_CLIENT_SOURCES "Common/Tutorial/UseItemTask.cpp" "Common/Tutorial/UseTileTask.cpp" "Common/Tutorial/XuiCraftingTask.cpp" - "Common/ConsoleGameMode.cpp" - "Common/Console_Utils.cpp" "Common/UI/IUIScene_AbstractContainerMenu.cpp" "Common/UI/IUIScene_AnvilMenu.cpp" + "Common/UI/IUIScene_BeaconMenu.cpp" "Common/UI/IUIScene_BrewingMenu.cpp" + "Common/UI/IUIScene_CommandBlockMenu.cpp" "Common/UI/IUIScene_ContainerMenu.cpp" "Common/UI/IUIScene_CraftingMenu.cpp" "Common/UI/IUIScene_CreativeMenu.cpp" "Common/UI/IUIScene_DispenserMenu.cpp" "Common/UI/IUIScene_EnchantingMenu.cpp" + "Common/UI/IUIScene_FireworksMenu.cpp" "Common/UI/IUIScene_FurnaceMenu.cpp" + "Common/UI/IUIScene_HUD.cpp" + "Common/UI/IUIScene_HopperMenu.cpp" + "Common/UI/IUIScene_HorseInventoryMenu.cpp" "Common/UI/IUIScene_InventoryMenu.cpp" "Common/UI/IUIScene_PauseMenu.cpp" "Common/UI/IUIScene_StartGame.cpp" "Common/UI/IUIScene_TradingMenu.cpp" + "Common/UI/UIBitmapFont.cpp" + "Common/UI/UIComponent_Chat.cpp" + "Common/UI/UIComponent_DebugUIConsole.cpp" "Common/UI/UIComponent_DebugUIMarketingGuide.cpp" - "Common/UI/UIScene_Keyboard.cpp" + "Common/UI/UIComponent_Logo.cpp" "Common/UI/UIComponent_MenuBackground.cpp" + "Common/UI/UIComponent_Panorama.cpp" "Common/UI/UIComponent_PressStartToPlay.cpp" + "Common/UI/UIComponent_Tooltips.cpp" + "Common/UI/UIComponent_TutorialPopup.cpp" + "Common/UI/UIControl.cpp" "Common/UI/UIControl_Base.cpp" + "Common/UI/UIControl_BeaconEffectButton.cpp" "Common/UI/UIControl_BitmapIcon.cpp" + "Common/UI/UIControl_Button.cpp" + "Common/UI/UIControl_ButtonList.cpp" + "Common/UI/UIControl_CheckBox.cpp" + "Common/UI/UIControl_Cursor.cpp" "Common/UI/UIControl_DLCList.cpp" "Common/UI/UIControl_DynamicLabel.cpp" "Common/UI/UIControl_EnchantmentBook.cpp" "Common/UI/UIControl_EnchantmentButton.cpp" "Common/UI/UIControl_HTMLLabel.cpp" + "Common/UI/UIControl_Label.cpp" "Common/UI/UIControl_LeaderboardList.cpp" + "Common/UI/UIControl_MinecraftHorse.cpp" "Common/UI/UIControl_MinecraftPlayer.cpp" "Common/UI/UIControl_PlayerList.cpp" - "Common/UI/UIControl_SaveList.cpp" - "Common/UI/UIControl_SpaceIndicatorBar.cpp" - "Common/UI/UIControl_TexturePackList.cpp" - "Common/UI/UIFontData.cpp" - "Common/UI/UIScene_AnvilMenu.cpp" - "Common/UI/UIScene_ControlsMenu.cpp" - "Common/UI/UIScene_Credits.cpp" - "Common/UI/UIScene_DebugCreateSchematic.cpp" - "Common/UI/UIScene_DebugSetCamera.cpp" - "Common/UI/UIScene_DLCMainMenu.cpp" - "Common/UI/UIScene_DLCOffersMenu.cpp" - "Common/UI/UIScene_EndPoem.cpp" - "Common/UI/UIScene_EULA.cpp" - "Common/UI/UIScene_HowToPlay.cpp" - "Common/UI/UIScene_InGameHostOptionsMenu.cpp" - "Common/UI/UIScene_InGameInfoMenu.cpp" - "Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" - "Common/UI/UIScene_LeaderboardsMenu.cpp" - "Common/UI/UIScene_MessageBox.cpp" - "Common/UI/UIBitmapFont.cpp" - "Common/UI/UIComponent_Chat.cpp" - "Common/UI/UIComponent_DebugUIConsole.cpp" - "Common/UI/UIComponent_Logo.cpp" - "Common/UI/UIComponent_Panorama.cpp" - "Common/UI/UIComponent_Tooltips.cpp" - "Common/UI/UIComponent_TutorialPopup.cpp" - "Common/UI/UIControl.cpp" - "Common/UI/UIController.cpp" - "Common/UI/UIControl_Button.cpp" - "Common/UI/UIControl_CheckBox.cpp" - "Common/UI/UIControl_Cursor.cpp" - "Common/UI/UIControl_Label.cpp" "Common/UI/UIControl_PlayerSkinPreview.cpp" "Common/UI/UIControl_Progress.cpp" - "Common/UI/UIControl_ButtonList.cpp" + "Common/UI/UIControl_SaveList.cpp" "Common/UI/UIControl_Slider.cpp" "Common/UI/UIControl_SlotList.cpp" + "Common/UI/UIControl_SpaceIndicatorBar.cpp" "Common/UI/UIControl_TextInput.cpp" + "Common/UI/UIControl_TexturePackList.cpp" + "Common/UI/UIController.cpp" + "Common/UI/UIFontData.cpp" "Common/UI/UIGroup.cpp" "Common/UI/UILayer.cpp" "Common/UI/UIScene.cpp" "Common/UI/UIScene_AbstractContainerMenu.cpp" + "Common/UI/UIScene_AnvilMenu.cpp" + "Common/UI/UIScene_BeaconMenu.cpp" "Common/UI/UIScene_BrewingStandMenu.cpp" "Common/UI/UIScene_ConnectingProgress.cpp" "Common/UI/UIScene_ContainerMenu.cpp" + "Common/UI/UIScene_ControlsMenu.cpp" "Common/UI/UIScene_CraftingMenu.cpp" "Common/UI/UIScene_CreateWorldMenu.cpp" "Common/UI/UIScene_CreativeMenu.cpp" + "Common/UI/UIScene_Credits.cpp" + "Common/UI/UIScene_DLCMainMenu.cpp" + "Common/UI/UIScene_DLCOffersMenu.cpp" "Common/UI/UIScene_DeathMenu.cpp" + "Common/UI/UIScene_DebugCreateSchematic.cpp" "Common/UI/UIScene_DebugOptions.cpp" "Common/UI/UIScene_DebugOverlay.cpp" + "Common/UI/UIScene_DebugSetCamera.cpp" "Common/UI/UIScene_DispenserMenu.cpp" + "Common/UI/UIScene_EULA.cpp" "Common/UI/UIScene_EnchantingMenu.cpp" + "Common/UI/UIScene_EndPoem.cpp" + "Common/UI/UIScene_FireworksMenu.cpp" "Common/UI/UIScene_FullscreenProgress.cpp" "Common/UI/UIScene_FurnaceMenu.cpp" + "Common/UI/UIScene_HUD.cpp" "Common/UI/UIScene_HelpAndOptionsMenu.cpp" + "Common/UI/UIScene_HopperMenu.cpp" + "Common/UI/UIScene_HorseInventoryMenu.cpp" + "Common/UI/UIScene_HowToPlay.cpp" "Common/UI/UIScene_HowToPlayMenu.cpp" - "Common/UI/UIScene_HUD.cpp" + "Common/UI/UIScene_InGameHostOptionsMenu.cpp" + "Common/UI/UIScene_InGameInfoMenu.cpp" + "Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" "Common/UI/UIScene_Intro.cpp" + "Common/UI/UIScene_InventoryMenu.cpp" "Common/UI/UIScene_JoinMenu.cpp" + "Common/UI/UIScene_Keyboard.cpp" + "Common/UI/UIScene_LanguageSelector.cpp" "Common/UI/UIScene_LaunchMoreOptionsMenu.cpp" + "Common/UI/UIScene_LeaderboardsMenu.cpp" "Common/UI/UIScene_LoadMenu.cpp" "Common/UI/UIScene_LoadOrJoinMenu.cpp" "Common/UI/UIScene_MainMenu.cpp" - "Common/UI/UIScene_InventoryMenu.cpp" + "Common/UI/UIScene_MessageBox.cpp" + "Common/UI/UIScene_NewUpdateMessage.cpp" "Common/UI/UIScene_PauseMenu.cpp" "Common/UI/UIScene_QuadrantSignin.cpp" "Common/UI/UIScene_ReinstallMenu.cpp" @@ -211,6 +232,7 @@ set(MINECRAFT_CLIENT_SOURCES "Common/UI/UIScene_Timer.cpp" "Common/UI/UIScene_TradingMenu.cpp" "Common/UI/UIScene_TrialExitUpsell.cpp" + "Common/UI/UIString.cpp" "Common/UI/UITTFFont.cpp" "Common/zlib/adler32.c" "Common/zlib/compress.c" @@ -239,15 +261,15 @@ set(MINECRAFT_CLIENT_SOURCES "CritParticle.cpp" "CritParticle2.cpp" "Cube.cpp" + "DLCTexturePack.cpp" "DeathScreen.cpp" "DefaultRenderer.cpp" "DefaultTexturePack.cpp" - "DemoLevel.cpp" "DemoUser.cpp" "DerivedServerLevel.cpp" "DirtyChunkSorter.cpp" + "DispenserBootstrap.cpp" "DistanceChunkSorter.cpp" - "DLCTexturePack.cpp" "DragonBreathParticle.cpp" "DragonModel.cpp" "DripParticle.cpp" @@ -258,9 +280,9 @@ set(MINECRAFT_CLIENT_SOURCES "EnderCrystalModel.cpp" "EnderCrystalRenderer.cpp" "EnderDragonRenderer.cpp" + "EnderParticle.cpp" "EndermanModel.cpp" "EndermanRenderer.cpp" - "EnderParticle.cpp" "EntityRenderDispatcher.cpp" "EntityRenderer.cpp" "EntityTileRenderer.cpp" @@ -272,6 +294,7 @@ set(MINECRAFT_CLIENT_SOURCES "FallingTileRenderer.cpp" "FileTexturePack.cpp" "FireballRenderer.cpp" + "FireworksParticles.cpp" "FishingHookRenderer.cpp" "FlameParticle.cpp" "FolderTexturePack.cpp" @@ -284,13 +307,13 @@ set(MINECRAFT_CLIENT_SOURCES "GhastModel.cpp" "GhastRenderer.cpp" "GiantMobRenderer.cpp" - "glWrapper.cpp" "Gui.cpp" "GuiComponent.cpp" "GuiMessage.cpp" "GuiParticle.cpp" "GuiParticles.cpp" "HeartParticle.cpp" + "HorseRenderer.cpp" "HttpTexture.cpp" "HugeExplosionParticle.cpp" "HugeExplosionSeedParticle.cpp" @@ -298,6 +321,7 @@ set(MINECRAFT_CLIENT_SOURCES "HumanoidModel.cpp" "InBedChatScreen.cpp" "Input.cpp" + "iob_shim.asm" "ItemFrameRenderer.cpp" "ItemInHandRenderer.cpp" "ItemRenderer.cpp" @@ -308,13 +332,18 @@ set(MINECRAFT_CLIENT_SOURCES "LavaParticle.cpp" "LavaSlimeModel.cpp" "LavaSlimeRenderer.cpp" + "LeashKnotModel.cpp" + "LeashKnotRenderer.cpp" "LevelRenderer.cpp" "Lighting.cpp" "LightningBoltRenderer.cpp" - "MemoryTracker.cpp" + "LivingEntityRenderer.cpp" + "LocalPlayer.cpp" "MemTexture.cpp" + "MemoryTracker.cpp" "MinecartModel.cpp" "MinecartRenderer.cpp" + "MinecartSpawnerRenderer.cpp" "Minecraft.cpp" "MinecraftServer.cpp" "Minimap.cpp" @@ -323,6 +352,7 @@ set(MINECRAFT_CLIENT_SOURCES "MobSkinTextureProcessor.cpp" "MobSpawnerRenderer.cpp" "Model.cpp" + "ModelHorse.cpp" "ModelPart.cpp" "MultiPlayerChunkCache.cpp" "MultiPlayerGameMode.cpp" @@ -330,12 +360,14 @@ set(MINECRAFT_CLIENT_SOURCES "MultiPlayerLocalPlayer.cpp" "MushroomCowRenderer.cpp" "NameEntryScreen.cpp" + "NetherPortalParticle.cpp" "NoteParticle.cpp" + "OcelotModel.cpp" + "OcelotRenderer.cpp" "OffsettedRenderList.cpp" "Options.cpp" "OptionsScreen.cpp" - "OzelotModel.cpp" - "OzelotRenderer.cpp" + "PS3/PS3Extras/ShutdownManager.cpp" "PaintingRenderer.cpp" "Particle.cpp" "ParticleEngine.cpp" @@ -343,22 +375,19 @@ set(MINECRAFT_CLIENT_SOURCES "PendingConnection.cpp" "PigModel.cpp" "PigRenderer.cpp" - "LocalPlayer.cpp" "PistonPieceRenderer.cpp" "PlayerChunkMap.cpp" "PlayerCloudParticle.cpp" "PlayerConnection.cpp" "PlayerList.cpp" - "PreStitchedTextureMap.cpp" - "ProgressRenderer.cpp" - "PS3/PS3Extras/ShutdownManager.cpp" - "Rect2i.cpp" - "RemotePlayer.cpp" "PlayerRenderer.cpp" "Polygon.cpp" - "NetherPortalParticle.cpp" + "PreStitchedTextureMap.cpp" + "ProgressRenderer.cpp" "QuadrupedModel.cpp" + "Rect2i.cpp" "RedDustParticle.cpp" + "RemotePlayer.cpp" "RenameWorldScreen.cpp" "Screen.cpp" "ScreenSizeCalculator.cpp" @@ -367,10 +396,11 @@ set(MINECRAFT_CLIENT_SOURCES "ServerChunkCache.cpp" "ServerCommandDispatcher.cpp" "ServerConnection.cpp" - "ServerPlayerGameMode.cpp" "ServerLevel.cpp" "ServerLevelListener.cpp" "ServerPlayer.cpp" + "ServerPlayerGameMode.cpp" + "ServerScoreboard.cpp" "Settings.cpp" "SheepFurModel.cpp" "SheepModel.cpp" @@ -382,6 +412,8 @@ set(MINECRAFT_CLIENT_SOURCES "SimpleIcon.cpp" "SkeletonHeadModel.cpp" "SkeletonModel.cpp" + "SkeletonRenderer.cpp" + "SkiModel.cpp" "SkullTileRenderer.cpp" "SlideButton.cpp" "SlimeModel.cpp" @@ -400,12 +432,10 @@ set(MINECRAFT_CLIENT_SOURCES "StatsCounter.cpp" "StatsScreen.cpp" "StatsSyncher.cpp" - "stdafx.cpp" + "StitchSlot.cpp" "StitchedTexture.cpp" "Stitcher.cpp" - "StitchSlot.cpp" "StringTable.cpp" - "stubs.cpp" "SuspendedParticle.cpp" "SuspendedTownParticle.cpp" "TakeAnimationParticle.cpp" @@ -414,6 +444,7 @@ set(MINECRAFT_CLIENT_SOURCES "Tesselator.cpp" "TexOffs.cpp" "Texture.cpp" + "TextureAtlas.cpp" "TextureHolder.cpp" "TextureManager.cpp" "TextureMap.cpp" @@ -426,6 +457,7 @@ set(MINECRAFT_CLIENT_SOURCES "TileRenderer.cpp" "Timer.cpp" "TitleScreen.cpp" + "TntMinecartRenderer.cpp" "TntRenderer.cpp" "TrackedEntity.cpp" "User.cpp" @@ -439,15 +471,24 @@ set(MINECRAFT_CLIENT_SOURCES "VillagerZombieModel.cpp" "WaterDropParticle.cpp" "Windows64/Iggy/gdraw/gdraw_d3d11.cpp" + "Windows64/KeyboardMouseInput.cpp" "Windows64/Leaderboards/WindowsLeaderboardManager.cpp" "Windows64/Windows64_App.cpp" "Windows64/Windows64_Minecraft.cpp" - "Windows64/KeyboardMouseInput.cpp" "Windows64/Windows64_UIController.cpp" + "WitchModel.cpp" + "WitchRenderer.cpp" + "WitherBossModel.cpp" + "WitherBossRenderer.cpp" + "WitherSkullRenderer.cpp" "WolfModel.cpp" "WolfRenderer.cpp" "WstringLookup.cpp" "Xbox/Network/NetworkPlayerXbox.cpp" "ZombieModel.cpp" "ZombieRenderer.cpp" + "compat_shims.cpp" + "glWrapper.cpp" + "stdafx.cpp" + "stubs.cpp" ) diff --git a/cmake/WorldSources.cmake b/cmake/WorldSources.cmake index 3fca57b6..cd6c1b81 100644 --- a/cmake/WorldSources.cmake +++ b/cmake/WorldSources.cmake @@ -1,7 +1,9 @@ set(MINECRAFT_WORLD_SOURCES "AABB.cpp" "Abilities.cpp" + "AbsoptionMobEffect.cpp" "AbstractContainerMenu.cpp" + "AbstractProjectileDispenseBehavior.cpp" "Achievement.cpp" "Achievements.cpp" "AddEntityPacket.cpp" @@ -15,8 +17,11 @@ set(MINECRAFT_WORLD_SOURCES "AddSnowLayer.cpp" "AgableMob.cpp" "AirTile.cpp" + "AmbientCreature.cpp" "Animal.cpp" + "AnimalChest.cpp" "AnimatePacket.cpp" + "AnvilMenu.cpp" "AnvilTile.cpp" "AnvilTileItem.cpp" "ArmorDyeRecipe.cpp" @@ -24,20 +29,33 @@ set(MINECRAFT_WORLD_SOURCES "ArmorRecipes.cpp" "ArmorSlot.cpp" "Arrow.cpp" - "ArrowAttackGoal.cpp" "ArrowDamageEnchantment.cpp" "ArrowFireEnchantment.cpp" "ArrowInfiniteEnchantment.cpp" "ArrowKnockbackEnchantment.cpp" + "AttackDamageMobEffect.cpp" + "Attribute.cpp" + "AttributeModifier.cpp" "AuxDataTileItem.cpp" "AvoidPlayerGoal.cpp" "AwardStatPacket.cpp" + "BaseAttribute.cpp" + "BaseAttributeMap.cpp" + "BaseEntityTile.cpp" + "BaseMobSpawner.cpp" + "BasePressurePlateTile.cpp" + "BaseRailTile.cpp" "BasicTree.cpp" "BasicTypeContainers.cpp" + "Bat.cpp" "BeachBiome.cpp" + "BeaconMenu.cpp" + "BeaconTile.cpp" + "BeaconTileEntity.cpp" "BedItem.cpp" "BedTile.cpp" "BegGoal.cpp" + "BehaviorRegistry.cpp" "BinaryHeap.cpp" "Biome.cpp" "BiomeCache.cpp" @@ -51,14 +69,13 @@ set(MINECRAFT_WORLD_SOURCES "BlockGenMethods.cpp" "BlockRegionUpdatePacket.cpp" "BlockReplacements.cpp" + "BlockSourceImpl.cpp" "Boat.cpp" "BoatItem.cpp" "BodyControl.cpp" "BonusChestFeature.cpp" "BookItem.cpp" "BookshelfTile.cpp" - "BossMob.cpp" - "BossMobPart.cpp" "BottleItem.cpp" "BoundingBox.cpp" "BowItem.cpp" @@ -77,9 +94,11 @@ set(MINECRAFT_WORLD_SOURCES "ByteArrayInputStream.cpp" "ByteArrayOutputStream.cpp" "ByteBuffer.cpp" + "C4JThread.cpp" "CactusFeature.cpp" "CactusTile.cpp" "CakeTile.cpp" + "Calendar.cpp" "CanyonFeature.cpp" "CarrotOnAStickItem.cpp" "CarrotTile.cpp" @@ -102,29 +121,35 @@ set(MINECRAFT_WORLD_SOURCES "ClientSideMerchant.cpp" "ClockItem.cpp" "ClothDyeRecipes.cpp" - "ClothTile.cpp" - "ClothTileItem.cpp" "CoalItem.cpp" "CocoaTile.cpp" "Color.cpp" + "ColoredTile.cpp" "ColoredTileItem.cpp" + "CombatEntry.cpp" + "CombatTracker.cpp" "Command.cpp" + "CommandBlock.cpp" + "CommandBlockEntity.cpp" "CommandDispatcher.cpp" "CommonStats.cpp" + "ComparatorTile.cpp" + "ComparatorTileEntity.cpp" "CompassItem.cpp" "ComplexItem.cpp" "ComplexItemDataPacket.cpp" "CompoundContainer.cpp" "CompressedTileStorage.cpp" - "compression.cpp" "Connection.cpp" "ConsoleSaveFileConverter.cpp" + "ConsoleSaveFileInputStream.cpp" "ConsoleSaveFileOriginal.cpp" - "Container.cpp" + "ConsoleSaveFileOutputStream.cpp" "ContainerAckPacket.cpp" "ContainerButtonClickPacket.cpp" "ContainerClickPacket.cpp" "ContainerClosePacket.cpp" + "ContainerMenu.cpp" "ContainerOpenPacket.cpp" "ContainerSetContentPacket.cpp" "ContainerSetDataPacket.cpp" @@ -132,21 +157,9 @@ set(MINECRAFT_WORLD_SOURCES "ControlledByPlayerGoal.cpp" "CoralTile.cpp" "Cow.cpp" + "CraftItemPacket.cpp" "CraftingContainer.cpp" "CraftingMenu.cpp" - "DefaultGameModeCommand.cpp" - "EnchantItemCommand.cpp" - "ExperienceCommand.cpp" - "GameCommandPacket.cpp" - "GameModeCommand.cpp" - "GenericStats.cpp" - "GiveItemCommand.cpp" - "KillCommand.cpp" - "PerformanceTimer.cpp" - "TimeCommand.cpp" - "ToggleDownfallCommand.cpp" - "TradeItemPacket.cpp" - "CraftItemPacket.cpp" "Creature.cpp" "Creeper.cpp" "CropTile.cpp" @@ -157,9 +170,13 @@ set(MINECRAFT_WORLD_SOURCES "DataInputStream.cpp" "DataLayer.cpp" "DataOutputStream.cpp" + "DaylightDetectorTile.cpp" + "DaylightDetectorTileEntity.cpp" "DeadBushFeature.cpp" "DeadBushTile.cpp" "DebugOptionsPacket.cpp" + "DefaultDispenseItemBehavior.cpp" + "DefaultGameModeCommand.cpp" "DefendVillageTargetGoal.cpp" "DelayedRelease.cpp" "DerivedLevelData.cpp" @@ -177,13 +194,30 @@ set(MINECRAFT_WORLD_SOURCES "DirectoryLevelStorageSource.cpp" "DirtTile.cpp" "DisconnectPacket.cpp" + "DispenseItemBehavior.cpp" "DispenserTile.cpp" "DispenserTileEntity.cpp" + "Distort.cpp" "DoorInfo.cpp" "DoorInteractGoal.cpp" + "DoorItem.cpp" + "DoorTile.cpp" + "DownfallLayer.cpp" + "DownfallMixerLayer.cpp" "DragonFireball.cpp" + "DropperTile.cpp" + "DropperTileEntity.cpp" + "DummyCriteria.cpp" + "DungeonFeature.cpp" + "DyePowderItem.cpp" "EatTileGoal.cpp" + "EffectCommand.cpp" + "EggItem.cpp" "EggTile.cpp" + "Emboss.cpp" + "EmptyLevelChunk.cpp" + "EmptyMapItem.cpp" + "EnchantItemCommand.cpp" "EnchantedBookItem.cpp" "Enchantment.cpp" "EnchantmentCategory.cpp" @@ -193,206 +227,69 @@ set(MINECRAFT_WORLD_SOURCES "EnchantmentMenu.cpp" "EnchantmentTableEntity.cpp" "EnchantmentTableTile.cpp" + "EndPodiumFeature.cpp" "EnderChestTile.cpp" "EnderChestTileEntity.cpp" - "EnderEyeItem.cpp" - "EnderpearlItem.cpp" - "EndPodiumFeature.cpp" - "ExperienceItem.cpp" - "ExtremeHillsBiome.cpp" - "Feature.cpp" "EnderCrystal.cpp" "EnderDragon.cpp" - "EyeOfEnderSignal.cpp" - "FireAspectEnchantment.cpp" - "FireChargeItem.cpp" - "FleeSunGoal.cpp" - "FlippedIcon.cpp" - "FloatGoal.cpp" - "FlowerPotTile.cpp" - "FollowOwnerGoal.cpp" - "FollowParentGoal.cpp" - "Goal.cpp" - "GoalSelector.cpp" - "GoldenAppleItem.cpp" - "Golem.cpp" - "GroundBushFeature.cpp" - "GrowMushroomIslandLayer.cpp" - "HalfSlabTile.cpp" - "HangingEntity.cpp" - "HangingEntityItem.cpp" - "HellFlatLevelSource.cpp" - "HurtByTargetGoal.cpp" - "IceBiome.cpp" - "InteractGoal.cpp" - "ItemFrame.cpp" - "JumpControl.cpp" - "JungleBiome.cpp" - "KickPlayerPacket.cpp" - "KnockbackEnchantment.cpp" - "LavaSlime.cpp" - "LeapAtTargetGoal.cpp" - "LevelSoundPacket.cpp" - "LookAtPlayerGoal.cpp" - "LookAtTradingPlayerGoal.cpp" - "LookControl.cpp" - "LootBonusEnchantment.cpp" - "MakeLoveGoal.cpp" - "MegaTreeFeature.cpp" - "MeleeAttackGoal.cpp" - "MerchantContainer.cpp" - "MerchantMenu.cpp" - "MerchantRecipe.cpp" - "MerchantRecipeList.cpp" - "MerchantResultSlot.cpp" - "MilkBucketItem.cpp" - "MonsterPlacerItem.cpp" - "MoveControl.cpp" - "MoveIndoorsGoal.cpp" - "MoveThroughVillageGoal.cpp" - "MoveTowardsRestrictionGoal.cpp" - "MoveTowardsTargetGoal.cpp" - "MultiTextureTileItem.cpp" - "MushroomCow.cpp" - "MushroomIslandBiome.cpp" - "MycelTile.cpp" - "NearestAttackableTargetGoal.cpp" - "NetherBridgeFeature.cpp" - "NetherBridgePieces.cpp" - "NetherStalkTile.cpp" - "NonTameRandomTargetGoal.cpp" - "Npc.cpp" - "OcelotSitOnTileGoal.cpp" - "OfferFlowerGoal.cpp" - "OpenDoorGoal.cpp" - "OwnerHurtByTargetGoal.cpp" - "OwnerHurtTargetGoal.cpp" - "OxygenEnchantment.cpp" - "Ozelot.cpp" - "OzelotAttackGoal.cpp" - "PanicGoal.cpp" - "PathNavigation.cpp" - "PlayerAbilitiesPacket.cpp" - "PlayerEnderChestContainer.cpp" - "PlayGoal.cpp" - "PotatoTile.cpp" - "PotionBrewing.cpp" - "PotionItem.cpp" - "ProtectionEnchantment.cpp" - "QuartzBlockTile.cpp" - "RandomLookAroundGoal.cpp" - "RandomPos.cpp" - "RandomScatteredLargeFeature.cpp" - "RandomStrollGoal.cpp" - "Rarity.cpp" - "RedlightTile.cpp" - "RegionHillsLayer.cpp" - "RepairContainer.cpp" - "RepairMenu.cpp" - "RepairResultSlot.cpp" - "RestrictOpenDoorGoal.cpp" - "RestrictSunGoal.cpp" - "RotateHeadPacket.cpp" - "ScatteredFeaturePieces.cpp" - "SeedFoodItem.cpp" - "Sensing.cpp" - "SitGoal.cpp" - "SkullItem.cpp" - "SkullTile.cpp" - "SkullTileEntity.cpp" - "SparseDataStorage.cpp" - "SwampRiversLayer.cpp" - "SwellGoal.cpp" - "TakeFlowerGoal.cpp" - "TamableAnimal.cpp" - "TargetGoal.cpp" - "TemptGoal.cpp" - "ThornsEnchantment.cpp" - "TileDestructionPacket.cpp" - "TileEventData.cpp" - "TradeWithPlayerGoal.cpp" - "TripWireSourceTile.cpp" - "TripWireTile.cpp" - "Village.cpp" - "VillagerGolem.cpp" - "Villages.cpp" - "VillageSiege.cpp" - "VinesFeature.cpp" - "WallTile.cpp" - "WeighedTreasure.cpp" - "WoodSlabTile.cpp" - "C4JThread.cpp" - "WoodTile.cpp" - "WoolCarpetTile.cpp" - "XZPacket.cpp" - "ShoreLayer.cpp" - "SmoothStoneBrickTileItem.cpp" - "SparseLightStorage.cpp" - "SpikeFeature.cpp" - "NetherSphere.cpp" - "SmallFireball.cpp" - "SnowMan.cpp" - "StoneMonsterTileItem.cpp" - "TextureAndGeometryChangePacket.cpp" - "TextureAndGeometryPacket.cpp" - "TheEndBiome.cpp" - "TheEndBiomeDecorator.cpp" - "TheEndDimension.cpp" - "TheEndLevelRandomLevelSource.cpp" - "TheEndPortal.cpp" - "TheEndPortalFrameTile.cpp" - "TheEndPortalTileEntity.cpp" - "Throwable.cpp" - "ThrownEnderpearl.cpp" - "ThrownExpBottle.cpp" - "ThrownPotion.cpp" - "TileEntityDataPacket.cpp" - "UntouchingEnchantment.cpp" - "UpdateGameRuleProgressPacket.cpp" - "Distort.cpp" - "DoorItem.cpp" - "DoorTile.cpp" - "DownfallLayer.cpp" - "DownfallMixerLayer.cpp" - "DungeonFeature.cpp" - "DyePowderItem.cpp" - "EggItem.cpp" - "Emboss.cpp" - "EmptyLevelChunk.cpp" + "EnderEyeItem.cpp" "EnderMan.cpp" + "EnderpearlItem.cpp" "Enemy.cpp" "Entity.cpp" "EntityActionAtPositionPacket.cpp" "EntityDamageSource.cpp" "EntityEventPacket.cpp" + "EntityHorse.cpp" "EntityIO.cpp" "EntityPos.cpp" - "EntityTile.cpp" + "EntitySelector.cpp" + "ExperienceCommand.cpp" + "ExperienceItem.cpp" "ExperienceOrb.cpp" "ExplodePacket.cpp" "Explosion.cpp" + "ExtremeHillsBiome.cpp" + "EyeOfEnderSignal.cpp" "Facing.cpp" + "FacingEnum.cpp" "FallingTile.cpp" "FarmTile.cpp" "FastNoise.cpp" + "Feature.cpp" "FenceGateTile.cpp" "FenceTile.cpp" "File.cpp" "FileHeader.cpp" "FileInputStream.cpp" "FileOutputStream.cpp" - "Fireball.cpp" + "FireAspectEnchantment.cpp" + "FireChargeItem.cpp" "FireTile.cpp" + "Fireball.cpp" + "FireworksChargeItem.cpp" + "FireworksItem.cpp" + "FireworksMenu.cpp" + "FireworksRecipe.cpp" + "FireworksRocketEntity.cpp" "FishingHook.cpp" "FishingRodItem.cpp" "FixedBiomeSource.cpp" + "FlatGeneratorInfo.cpp" "FlatLayer.cpp" + "FlatLayerInfo.cpp" "FlatLevelSource.cpp" + "FleeSunGoal.cpp" "FlintAndSteelItem.cpp" + "FlippedIcon.cpp" "FloatBuffer.cpp" + "FloatGoal.cpp" "FlowerFeature.cpp" + "FlowerPotTile.cpp" "FlyingMob.cpp" "FoliageColor.cpp" + "FollowOwnerGoal.cpp" + "FollowParentGoal.cpp" "FoodConstants.cpp" "FoodData.cpp" "FoodItem.cpp" @@ -404,96 +301,156 @@ set(MINECRAFT_WORLD_SOURCES "FurnaceTile.cpp" "FurnaceTileEntity.cpp" "FuzzyZoomLayer.cpp" + "GameCommandPacket.cpp" "GameEventPacket.cpp" + "GameModeCommand.cpp" + "GameRules.cpp" "GeneralStat.cpp" + "GenericStats.cpp" "GetInfoPacket.cpp" "Ghast.cpp" "Giant.cpp" + "GiveItemCommand.cpp" "GlassTile.cpp" "GlobalEntity.cpp" + "GlowstoneTile.cpp" + "Goal.cpp" + "GoalSelector.cpp" + "GoldenAppleItem.cpp" + "Golem.cpp" "GrassColor.cpp" "GrassTile.cpp" "GravelTile.cpp" + "GroundBushFeature.cpp" + "GrowMushroomIslandLayer.cpp" + "HalfSlabTile.cpp" "HalfTransparentTile.cpp" + "HangingEntity.cpp" + "HangingEntityItem.cpp" "Hasher.cpp" "HatchetItem.cpp" + "HayBlockTile.cpp" + "HealthBoostMobEffect.cpp" + "HealthCriteria.cpp" + "HeavyTile.cpp" "HellBiome.cpp" "HellDimension.cpp" "HellFireFeature.cpp" + "HellFlatLevelSource.cpp" "HellPortalFeature.cpp" "HellRandomLevelSource.cpp" - "HellSandTile.cpp" "HellSpringFeature.cpp" - "HellStoneTile.cpp" "HitResult.cpp" "HoeItem.cpp" + "HopperMenu.cpp" + "HopperTile.cpp" + "HopperTileEntity.cpp" + "HorseInventoryMenu.cpp" "HouseFeature.cpp" + "HtmlString.cpp" "HugeMushroomFeature.cpp" "HugeMushroomTile.cpp" + "HurtByTargetGoal.cpp" "I18n.cpp" + "IceBiome.cpp" "IceTile.cpp" "ImprovedNoise.cpp" - "ContainerMenu.cpp" "IndirectEntityDamageSource.cpp" "InputStream.cpp" "InputStreamReader.cpp" "InstantenousMobEffect.cpp" "IntBuffer.cpp" "IntCache.cpp" + "InteractGoal.cpp" "InteractPacket.cpp" "Inventory.cpp" "InventoryMenu.cpp" "IslandLayer.cpp" "Item.cpp" + "ItemDispenseBehaviors.cpp" "ItemEntity.cpp" + "ItemFrame.cpp" "ItemInstance.cpp" "ItemStat.cpp" + "JavaMath.cpp" + "JukeboxTile.cpp" + "JumpControl.cpp" + "JungleBiome.cpp" "KeepAlivePacket.cpp" + "KickPlayerPacket.cpp" + "KillCommand.cpp" + "KnockbackEnchantment.cpp" "LadderTile.cpp" "LakeFeature.cpp" "Language.cpp" "LargeCaveFeature.cpp" "LargeFeature.cpp" + "LargeFireball.cpp" "LargeHellCaveFeature.cpp" + "LavaSlime.cpp" "Layer.cpp" "LeafTile.cpp" "LeafTileItem.cpp" - "LevelConflictException.cpp" - "LevelData.cpp" + "LeapAtTargetGoal.cpp" + "LeashFenceKnotEntity.cpp" + "LeashItem.cpp" "Level.cpp" "LevelChunk.cpp" + "LevelConflictException.cpp" + "LevelData.cpp" "LevelEventPacket.cpp" + "LevelParticlesPacket.cpp" "LevelSettings.cpp" + "LevelSoundPacket.cpp" "LevelStorage.cpp" "LevelStorageProfilerDecorator.cpp" "LevelSummary.cpp" "LevelType.cpp" "LeverTile.cpp" "LightGemFeature.cpp" - "LightGemTile.cpp" "LightningBolt.cpp" "LiquidTile.cpp" "LiquidTileDynamic.cpp" "LiquidTileStatic.cpp" + "LivingEntity.cpp" "LockedChestTile.cpp" "LoginPacket.cpp" + "LookAtPlayerGoal.cpp" + "LookAtTradingPlayerGoal.cpp" + "LookControl.cpp" + "LootBonusEnchantment.cpp" + "MakeLoveGoal.cpp" "MapItem.cpp" "MapItemSavedData.cpp" "Material.cpp" "MaterialColor.cpp" - "JavaMath.cpp" "McRegionChunkStorage.cpp" - "McRegionLevelStorageSource.cpp" "McRegionLevelStorage.cpp" + "McRegionLevelStorageSource.cpp" + "MegaTreeFeature.cpp" + "MeleeAttackGoal.cpp" "MelonTile.cpp" "MenuBackup.cpp" + "MerchantContainer.cpp" + "MerchantMenu.cpp" + "MerchantRecipe.cpp" + "MerchantRecipeList.cpp" + "MerchantResultSlot.cpp" "MetalTile.cpp" - "Minecart.cpp" - "MinecartItem.cpp" - "Minecraft.World.cpp" + "MilkBucketItem.cpp" "MineShaftFeature.cpp" "MineShaftPieces.cpp" "MineShaftStart.cpp" + "Minecart.cpp" + "MinecartChest.cpp" + "MinecartContainer.cpp" + "MinecartFurnace.cpp" + "MinecartHopper.cpp" + "MinecartItem.cpp" + "MinecartRideable.cpp" + "MinecartSpawner.cpp" + "MinecartTNT.cpp" + "Minecraft.World.cpp" "Mob.cpp" "MobCategory.cpp" "MobEffect.cpp" @@ -502,29 +459,62 @@ set(MINECRAFT_WORLD_SOURCES "MobSpawnerTile.cpp" "MobSpawnerTileEntity.cpp" "MockedLevelStorage.cpp" + "ModifiableAttributeInstance.cpp" "Monster.cpp" "MonsterRoomFeature.cpp" + "MoveControl.cpp" "MoveEntityPacket.cpp" "MoveEntityPacketSmall.cpp" + "MoveIndoorsGoal.cpp" "MovePlayerPacket.cpp" + "MoveThroughVillageGoal.cpp" + "MoveTowardsRestrictionGoal.cpp" + "MoveTowardsTargetGoal.cpp" "Mth.cpp" + "MultiEntityMobPart.cpp" + "MultiTextureTileItem.cpp" "Mushroom.cpp" - "MusicTile.cpp" + "MushroomCow.cpp" + "MushroomIslandBiome.cpp" "MusicTileEntity.cpp" + "MycelTile.cpp" + "NameTagItem.cpp" "NbtIo.cpp" + "NearestAttackableTargetGoal.cpp" + "NetherBridgeFeature.cpp" + "NetherBridgePieces.cpp" + "NetherSphere.cpp" + "NetherWartTile.cpp" + "NetherrackTile.cpp" "Node.cpp" + "NonTameRandomTargetGoal.cpp" "NotGateTile.cpp" + "NoteBlockTile.cpp" + "Npc.cpp" + "Objective.cpp" + "ObjectiveCriteria.cpp" "ObsidianTile.cpp" + "Ocelot.cpp" + "OcelotAttackGoal.cpp" + "OcelotSitOnTileGoal.cpp" + "OfferFlowerGoal.cpp" "OldChunkStorage.cpp" + "OpenDoorGoal.cpp" "OreFeature.cpp" "OreRecipies.cpp" "OreTile.cpp" + "OwnerHurtByTargetGoal.cpp" + "OwnerHurtTargetGoal.cpp" + "OxygenEnchantment.cpp" "Packet.cpp" "PacketListener.cpp" "Painting.cpp" + "PanicGoal.cpp" "Path.cpp" "PathFinder.cpp" + "PathNavigation.cpp" "PathfinderMob.cpp" + "PerformanceTimer.cpp" "PerlinNoise.cpp" "PerlinSimplexNoise.cpp" "PickaxeItem.cpp" @@ -537,70 +527,108 @@ set(MINECRAFT_WORLD_SOURCES "PistonPieceEntity.cpp" "PistonTileItem.cpp" "PlainsBiome.cpp" + "PlayGoal.cpp" "Player.cpp" + "PlayerAbilitiesPacket.cpp" "PlayerActionPacket.cpp" "PlayerCommandPacket.cpp" + "PlayerEnderChestContainer.cpp" "PlayerInfoPacket.cpp" "PlayerInputPacket.cpp" + "PlayerTeam.cpp" "PortalForcer.cpp" "PortalTile.cpp" "Pos.cpp" + "PotatoTile.cpp" + "PotionBrewing.cpp" + "PotionItem.cpp" + "PoweredMetalTile.cpp" + "PoweredRailTile.cpp" "PreLoginPacket.cpp" "PressurePlateTile.cpp" "PrimedTnt.cpp" + "ProtectionEnchantment.cpp" "PumpkinFeature.cpp" "PumpkinTile.cpp" + "QuartzBlockTile.cpp" "RailTile.cpp" "RainforestBiome.cpp" "Random.cpp" "RandomLevelSource.cpp" - "ReadOnlyChunkCache.cpp" + "RandomLookAroundGoal.cpp" + "RandomPos.cpp" + "RandomScatteredLargeFeature.cpp" + "RandomStrollGoal.cpp" + "RangedAttackGoal.cpp" + "RangedAttribute.cpp" + "Rarity.cpp" "Recipes.cpp" "RecordingItem.cpp" - "RecordPlayerTile.cpp" "RedStoneDustTile.cpp" "RedStoneItem.cpp" "RedStoneOreTile.cpp" - "ReedsFeature.cpp" + "RedlightTile.cpp" + "Redstone.cpp" "ReedTile.cpp" + "ReedsFeature.cpp" "Region.cpp" "RegionFile.cpp" "RegionFileCache.cpp" + "RegionHillsLayer.cpp" "RemoveEntitiesPacket.cpp" "RemoveMobEffectPacket.cpp" + "RepairContainer.cpp" + "RepairResultSlot.cpp" + "RepeaterTile.cpp" "RespawnPacket.cpp" + "RestrictOpenDoorGoal.cpp" + "RestrictSunGoal.cpp" "ResultContainer.cpp" "ResultSlot.cpp" "RiverInitLayer.cpp" "RiverLayer.cpp" "RiverMixerLayer.cpp" "Rotate.cpp" + "RotateHeadPacket.cpp" + "RotatedPillarTile.cpp" + "RunAroundLikeCrazyGoal.cpp" "SaddleItem.cpp" "SandFeature.cpp" "SandStoneTile.cpp" - "HeavyTile.cpp" "Sapling.cpp" "SaplingTileItem.cpp" "SavedData.cpp" "SavedDataStorage.cpp" "Scale.cpp" + "ScatteredFeaturePieces.cpp" + "Score.cpp" + "Scoreboard.cpp" + "SeedFoodItem.cpp" "SeedItem.cpp" + "Sensing.cpp" "ServerSettingsChangedPacket.cpp" + "ServersideAttributeMap.cpp" "SetCarriedItemPacket.cpp" "SetCreativeModeSlotPacket.cpp" + "SetDisplayObjectivePacket.cpp" "SetEntityDataPacket.cpp" + "SetEntityLinkPacket.cpp" "SetEntityMotionPacket.cpp" "SetEquippedItemPacket.cpp" "SetExperiencePacket.cpp" "SetHealthPacket.cpp" - "SetRidingPacket.cpp" + "SetObjectivePacket.cpp" + "SetPlayerTeamPacket.cpp" + "SetScorePacket.cpp" "SetSpawnPositionPacket.cpp" "SetTimePacket.cpp" "ShapedRecipy.cpp" "ShapelessRecipy.cpp" "SharedConstants.cpp" + "SharedMonsterAttributes.cpp" "ShearsItem.cpp" "Sheep.cpp" + "ShoreLayer.cpp" "ShovelItem.cpp" "SignItem.cpp" "SignTile.cpp" @@ -608,29 +636,43 @@ set(MINECRAFT_WORLD_SOURCES "SignUpdatePacket.cpp" "Silverfish.cpp" "SimpleContainer.cpp" + "SimpleFoiledItem.cpp" "SimplexNoise.cpp" + "SitGoal.cpp" "Skeleton.cpp" + "SkullItem.cpp" + "SkullTile.cpp" + "SkullTileEntity.cpp" "Slime.cpp" "Slot.cpp" + "SmallFireball.cpp" "SmoothFloat.cpp" "SmoothLayer.cpp" "SmoothStoneBrickTile.cpp" "SmoothZoomLayer.cpp" + "SnowItem.cpp" + "SnowMan.cpp" + "SnowTile.cpp" "Snowball.cpp" "SnowballItem.cpp" - "SnowTile.cpp" "Socket.cpp" + "SoulSandTile.cpp" + "SparseDataStorage.cpp" + "SparseLightStorage.cpp" + "SpawnEggItem.cpp" "Spider.cpp" + "SpikeFeature.cpp" "Sponge.cpp" "SpringFeature.cpp" - "SpringTile.cpp" "SpruceFeature.cpp" "Squid.cpp" + "StainedGlassBlock.cpp" + "StainedGlassPaneBlock.cpp" + "StairTile.cpp" "Stat.cpp" "Stats.cpp" - "StairTile.cpp" - "stdafx.cpp" "StemTile.cpp" + "StoneButtonTile.cpp" "StoneMonsterTile.cpp" "StoneSlabTile.cpp" "StoneSlabTileItem.cpp" @@ -639,69 +681,121 @@ set(MINECRAFT_WORLD_SOURCES "StrongholdFeature.cpp" "StrongholdPieces.cpp" "StructureFeature.cpp" + "StructureFeatureIO.cpp" + "StructureFeatureSavedData.cpp" "StructurePiece.cpp" "StructureRecipies.cpp" "StructureStart.cpp" "SwampBiome.cpp" + "SwampRiversLayer.cpp" "SwampTreeFeature.cpp" + "SwellGoal.cpp" "SynchedEntityData.cpp" "Synth.cpp" - "system.cpp" "Tag.cpp" "TaigaBiome.cpp" + "TakeFlowerGoal.cpp" "TakeItemEntityPacket.cpp" "TallGrass.cpp" "TallGrassFeature.cpp" + "TamableAnimal.cpp" + "TargetGoal.cpp" + "Team.cpp" "TeleportEntityPacket.cpp" "TemperatureLayer.cpp" "TemperatureMixerLayer.cpp" + "TemptGoal.cpp" + "TextureAndGeometryChangePacket.cpp" + "TextureAndGeometryPacket.cpp" "TextureChangePacket.cpp" "TexturePacket.cpp" + "TheEndBiome.cpp" + "TheEndBiomeDecorator.cpp" + "TheEndDimension.cpp" + "TheEndLevelRandomLevelSource.cpp" + "TheEndPortal.cpp" + "TheEndPortalFrameTile.cpp" + "TheEndPortalTileEntity.cpp" "ThinFenceTile.cpp" + "ThornsEnchantment.cpp" "ThreadName.cpp" + "Throwable.cpp" "ThrownEgg.cpp" + "ThrownEnderpearl.cpp" + "ThrownExpBottle.cpp" + "ThrownPotion.cpp" "TickNextTickData.cpp" "Tile.cpp" + "TileDestructionPacket.cpp" + "TileEditorOpenPacket.cpp" + "TileEntity.cpp" + "TileEntityDataPacket.cpp" + "TileEventData.cpp" "TileEventPacket.cpp" "TileItem.cpp" - "TileEntity.cpp" "TilePlanterItem.cpp" "TilePos.cpp" "TileUpdatePacket.cpp" + "TimeCommand.cpp" "TntTile.cpp" + "ToggleDownfallCommand.cpp" "ToolRecipies.cpp" "TopSnowTile.cpp" "TorchTile.cpp" + "TradeItemPacket.cpp" + "TradeWithPlayerGoal.cpp" "TransparentTile.cpp" "TrapDoorTile.cpp" "TrapMenu.cpp" "TreeFeature.cpp" - "TreeTileItem.cpp" + "TreeTile.cpp" + "TripWireSourceTile.cpp" + "TripWireTile.cpp" + "UntouchingEnchantment.cpp" + "UpdateAttributesPacket.cpp" + "UpdateGameRuleProgressPacket.cpp" "UpdateMobEffectPacket.cpp" "UpdateProgressPacket.cpp" "UseItemPacket.cpp" "Vec3.cpp" + "Village.cpp" "VillageFeature.cpp" "VillagePieces.cpp" + "VillageSiege.cpp" "Villager.cpp" + "VillagerGolem.cpp" + "Villages.cpp" "VineTile.cpp" + "VinesFeature.cpp" "VoronoiZoom.cpp" + "WallTile.cpp" + "WaterAnimal.cpp" "WaterColor.cpp" "WaterLevelChunk.cpp" - "WaterlilyFeature.cpp" "WaterLilyTile.cpp" "WaterLilyTileItem.cpp" "WaterWorkerEnchantment.cpp" + "WaterlilyFeature.cpp" "WeaponItem.cpp" "WeaponRecipies.cpp" + "WebTile.cpp" "WeighedRandom.cpp" + "WeighedTreasure.cpp" + "WeightedPressurePlateTile.cpp" + "Witch.cpp" + "WitherBoss.cpp" + "WitherSkull.cpp" "Wolf.cpp" - "TreeTile.cpp" - "WebTile.cpp" + "WoodButtonTile.cpp" + "WoodSlabTile.cpp" + "WoodTile.cpp" + "WoolCarpetTile.cpp" + "WoolTileItem.cpp" "WorkbenchTile.cpp" - "ConsoleSaveFileInputStream.cpp" - "ConsoleSaveFileOutputStream.cpp" + "XZPacket.cpp" "Zombie.cpp" - "WaterAnimal.cpp" "ZoomLayer.cpp" + "compression.cpp" + "stdafx.cpp" + "system.cpp" ) -- cgit v1.2.3